Coverage for pygeodesy/azimuthal.py : 96%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
# -*- coding: utf-8 -*-
L{GnomonicKarney}, L{LambertEqualArea}, L{Orthographic}, L{Stereographic} and L{AzimuthalError} and functions L{equidistant} and L{gnomonic}.
L{EquidistantKarney} and L{GnomonicKarney} require I{Charles Karney}'s Python U{geographiclib<https://PyPI.org/project/geographiclib/>} package to be installed.
Other azimuthal classes implement only (**) U{Snyder's FORMULAS FOR THE SPHERE <https://pubs.er.USGS.gov/djvu/PP/PP_1395.pdf>} and use those for any datum, spherical and ellipsoidal. The radius used for the latter is the ellipsoid's I{mean radius of curvature} at the latitude of the projection center point. For further justification, see the first paragraph under U{Snyder's FORMULAS FOR THE ELLIPSOID, page 197<https://pubs.er.USGS.gov/djvu/PP/PP_1395.pdf>}.
Page numbers in C{Snyder} references apply to U{John P. Snyder, "Map Projections -- A Working Manual", 1987<https://pubs.er.USGS.gov/djvu/PP/PP_1395.pdf>}.
See also U{here<https://WikiPedia.org/wiki/Azimuthal_equidistant_projection>}, especially the U{Comparison of the Azimuthal equidistant projection and some azimuthal projections centred on 90° N at the same scale, ordered by projection altitude in Earth radii<https://WikiPedia.org/wiki/Azimuthal_equidistant_projection #/media/File:Comparison_azimuthal_projections.svg>}.
@newfield example: Example, Examples '''
_xinstanceof, _xkwds _COMMA_SPACE_, _datum_, _lat_, _lon_, _name_, \ _no_convergence_fmt_, _scale_, _SPACE_, \ _x_, _y_, _0_0, _0_5, _1_0, _2_0, _360_0
'''(INTERNAL) Base class for azimuthal projections.
@see: I{Karney}'s C++ class U{AzimuthalEquidistant<https://GeographicLib.SourceForge.io/ html/classGeographicLib_1_1AzimuthalEquidistant.html>} or L{EquidistantKarney} or U{Gnomonic<https://GeographicLib.SourceForge.io/html/classGeographicLib_1_1Gnomonic.html>} or L{GnomonicKarney}. '''
'''New azimuthal projection.
@arg lat0: Latitude of the center point (C{degrees90}). @arg lon0: Longitude of the center point (C{degrees180}). @kwarg datum: Optional datum or ellipsoid (L{Datum}, L{Ellipsoid}, L{Ellipsoid2} or L{a_f2Tuple}) or I{scalar} earth radius (C{meter}). @kwarg name: Optional name for the projection (C{str}).
@raise AzimuthalError: Invalid B{C{lat0}}, B{C{lon0}} or spherical B{C{datum}}.
@raise TypeError: Invalid B{C{datum}}. '''
'''Get the datum (L{Datum}). '''
'''Get the geodesic's equatorial (major) radius, semi-axis (C{meter}). '''
'''Get the iteration number (C{int} or C{None} if not available/applicable). '''
'''Get the geodesic's flattening (C{float}). '''
'''(INTERNAL) Azimuthal (spherical) forward C{lat, lon} to C{x, y}. '''
else: # 0 or 180
'''Get the center latitude (C{degrees90}). '''
'''Get the center lat- and longitude (L{LatLon2Tuple}C{(lat, lon)}) in (C{degrees90}, C{degrees180}). '''
'''Set the center lat- and longitude (C{LatLon}, L{LatLon2Tuple} or L{LatLon4Tuple}).
@raise AzimuthalError: Invalid B{C{lat0}} or B{C{lon0}} or ellipsoidal mismatch of B{C{latlon0}} and this projection. ''' _datum_datum(self.datum, latlon0.datum, Error=AzimuthalError)
'''Get the center longitude (C{degrees180}). '''
'''Get this projection's mean radius of curvature (C{meter}). '''
'''Set or reset the center point of this azimuthal projection.
@arg lat0: Center point latitude (C{degrees90}). @arg lon0: Center point longitude (C{degrees180}).
@raise AzimuthalError: Invalid B{C{lat0}} or B{C{lon0}}. ''' Lon_(lon0=lon0, Error=AzimuthalError))
'''(INTERNAL) Azimuthal (spherical) reverse C{x, y} to C{lat, lon}. '''
else: lon = atan2(x, (y if s0 < 0 else -y)) else:
Azimuthal7Tuple(x, y, lat, lon, z, k, self.datum)
'''(INTERNAL) Check B{C{LatLon}} and return an instance. '''
'''Return a string representation of this projection.
@kwarg prec: Optional number of decimals, unstripped (C{int}).
@return: This projection as C{"<classname>(lat0, lon0, ...)"} (C{str}). '''
'''Return a string representation of this projection.
@kwarg prec: Optional number of decimal, unstripped (C{int}). @kwarg sep: Optional separator to join (C{str}).
@return: This projection as C{"lat0 lon0"} (C{str}). '''
'''An azimuthal L{Equidistant}, L{EquidistantKarney}, L{Gnomonic}, L{LambertEqualArea}, L{Orthographic}, L{Stereographic} or {Azimuthal7Tuple} issue. '''
'''7-Tuple C{(x, y, lat, lon, azimuth, scale, datum)}, in C{meter}, C{meter}, C{degrees90}, C{degrees180}, C{degrees360}, C{float} and C{Datum} where C{(x, y)} is the projected, C{(lat, lon)} the geodetic location, C{azimuth} the azimuth direction clockwise from true North and C{scale} is the projection scale, either (C{1 / reciprocal} or C{1} or C{-1} in the L{Equidistant} case). '''
'''Azimuthal equidistant projection for the sphere**, see U{Snyder, pp 195-197 <https://pubs.er.USGS.gov/djvu/PP/PP_1395.pdf>} and U{MathWorld-Wolfram <https://MathWorld.Wolfram.com/AzimuthalEquidistantProjection.html>}.
@note: Results from this L{Equidistant} and the L{EquidistantKarney} projection C{may differ} up to 10% or more. For an example, see method C{testDiscrepancies} in module C{testAzimuthal.py}. ''' if _FOR_DOCS: __init__ = _AzimuthalBase.__init__
'''Convert a geodetic location to azimuthal equidistant east- and northing.
@arg lat: Latitude of the location (C{degrees90}). @arg lon: Longitude of the location (C{degrees180}). @kwarg name: Optional name for the location (C{str}).
@return: An L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)} with C{x} and C{y} in C{meter} and C{lat} and C{lon} in C{degrees}. The C{scale} of the projection is C{1} in I{radial} direction, C{azimuth} clockwise from true North and is C{1 / reciprocal} in the direction perpendicular to this.
@raise AzimuthalError: Invalid B{C{lat}} or B{C{lon}}.
@note: The C{scale} will be C{-1} if B{C{(lat, lon)}} is antipodal to the projection center C{(lat0, lon0)}. ''' else:
'''Convert an azimuthal equidistant location to geodetic lat- and longitude.
@arg x: Easting of the location (C{meter}). @arg y: Northing of the location (C{meter}). @kwarg name: Optional name for the location (C{str}). @kwarg LatLon: Class to use (C{LatLon}) or C{None}. @kwarg LatLon_kwds: Optional, additional B{C{LatLon}} keyword arguments, ignored if C{B{LatLon}=None}.
@return: The geodetic (C{LatLon}) or if B{C{LatLon}} is C{None} an L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}.
@note: The C{lat} will be in the range C{[-90..90] degrees} and C{lon} in the range C{[-180..180] degrees}. The C{scale} of the projection is C{1} in I{radial} direction, C{azimuth} clockwise from true North and is C{1 / reciprocal} in the direction perpendicular to this. '''
'''If I{Karney}'s U{geographiclib<https://PyPI.org/project/geographiclib>} package is installed, return an L{EquidistantKarney} otherwise an L{Equidistant} instance.
@arg lat0: Latitude of center point (C{degrees90}). @arg lon0: Longitude of center point (C{degrees180}). @kwarg datum: Optional datum or ellipsoid (L{Datum}, L{Ellipsoid}, L{Ellipsoid2} or L{a_f2Tuple}) or I{scalar} earth radius (C{meter}). @kwarg name: Optional name for the projection (C{str}).
@return: An L{EquidistantKarney} or L{Equidistant} instance.
@raise AzimuthalError: Invalid B{C{lat0}}, B{C{lon0}} or sperical B{C{datum}}.
@raise TypeError: Invalid B{C{datum}}. '''
'''(INTERNAL) Base class for azimuthal projections using U{Karney Geodesic <https://GeographicLib.SourceForge.io/html/python/code.html>}. '''
'''Get this projection's I{wrapped} U{Karney Geodesic <https://GeographicLib.SourceForge.io/html/python/code.html>}, provided package U{geographiclib <https://PyPI.org/project/geographiclib>} is installed. '''
'''(INTERNAL) Return an C{Azimuthal7Tuple}. '''
'''Azimuthal equidistant projection, a Python version of I{Karney}'s C++ class U{AzimuthalEquidistant <https://GeographicLib.SourceForge.io/html/classGeographicLib_1_1AzimuthalEquidistant.html>}, requiring package U{geographiclib<https://PyPI.org/project/geographiclib>} to be installed.
An azimuthal equidistant projection is centered at an arbitrary position on the ellipsoid. For a point in projected space C{(x, y)}, the geodesic distance from the center position is C{hypot(x, y)} and the C{azimuth} of the geodesic from the center point is C{atan2(x, y)}, clockwise from true North.
The C{.forward} and C{.reverse} methods also return the C{azimuth} of the geodesic at C{(x, y)} and the C{scale} in the azimuthal direction which, together with the basic properties of the projection, serve to specify completely the local affine transformation between geographic and projected coordinates. ''' '''New azimuthal L{EquidistantKarney} projection.
@arg lat0: Latitude of center point (C{degrees90}). @arg lon0: Longitude of center point (C{degrees180}). @kwarg datum: Optional datum or ellipsoid (L{Datum}, L{Ellipsoid}, L{Ellipsoid2} or L{a_f2Tuple}) or I{scalar} earth radius (C{meter}). @kwarg name: Optional name for the projection (C{str}).
@raise ImportError: Package U{geographiclib<https://PyPI.org/ project/geographiclib>} missing.
@raise AzimuthalError: Invalid B{C{lat0}}, B{C{lon0}} or B{C{datum}}. '''
# g.STANDARD = g.AZIMUTH | g.DISTANCE | g.LATITUDE | g.LONGITUDE
'''Convert an (ellipsoidal) geodetic location to azimuthal equidistant east- and northing.
@arg lat: Latitude of the location (C{degrees90}). @arg lon: Longitude of the location (C{degrees180}). @kwarg name: Optional name for the location (C{str}).
@return: An L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)} with C{x} and C{y} in C{meter} and C{lat} and C{lon} in C{degrees}. The C{scale} of the projection is C{1} in I{radial} direction, C{azimuth} clockwise from true North and is C{1 / reciprocal} in the direction perpendicular to this.
@see: Method L{EquidistantKarney.reverse}. A call to C{.forward} followed by a call to C{.reverse} will return the original C{lat, lon} to within roundoff.
@raise AzimuthalError: Invalid B{C{lat}} or B{C{lon}}. '''
'''Convert an azimuthal equidistant location to (ellipsoidal) geodetic lat- and longitude.
@arg x: Easting of the location (C{meter}). @arg y: Northing of the location (C{meter}). @kwarg name: Optional name for the location (C{str}). @kwarg LatLon: Class to use (C{LatLon}) or C{None}. @kwarg LatLon_kwds: Optional, additional B{C{LatLon}} keyword arguments, ignored if C{B{LatLon}=None}.
@return: The geodetic (C{LatLon}) or if B{C{LatLon}} is C{None} an L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}.
@note: The C{lat} will be in the range C{[-90..90] degrees} and C{lon} in the range C{[-180..180] degrees}. The scale of the projection is C{1} in I{radial} direction, C{azimuth} clockwise from true North and is C{1 / reciprocal} in the direction perpendicular to this. '''
self._toLatLon(r.lat2, r.lon2, LatLon, LatLon_kwds)
'''(INTERNAL) Compute the reciprocal, azimuthal scale. '''
'''Azimuthal gnomonic projection for the sphere**, see U{Snyder, pp 164-168 <https://pubs.er.USGS.gov/djvu/PP/PP_1395.pdf>} and U{MathWorld-Wolfram <https://MathWorld.Wolfram.com/GnomonicProjection.html>}. ''' if _FOR_DOCS: __init__ = _AzimuthalBase.__init__
'''Convert a geodetic location to azimuthal equidistant east- and northing.
@arg lat: Latitude of the location (C{degrees90}). @arg lon: Longitude of the location (C{degrees180}). @kwarg name: Optional name for the location (C{str}).
@return: An L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)} with C{x} and C{y} in C{meter} and C{lat} and C{lon} in C{degrees} and C{azimuth} clockwise from true North. The C{scale} of the projection is C{1} in I{radial} direction and is C{1 / reciprocal} in the direction perpendicular to this.
@raise AzimuthalError: Invalid B{C{lat}} or B{C{lon}}. ''' else: k = _1_0
'''Convert an azimuthal equidistant location to geodetic lat- and longitude.
@arg x: Easting of the location (C{meter}). @arg y: Northing of the location (C{meter}). @kwarg name: Optional name for the location (C{str}). @kwarg LatLon: Class to use (C{LatLon}) or C{None}. @kwarg LatLon_kwds: Optional, additional B{C{LatLon}} keyword arguments, ignored if C{B{LatLon}=None}.
@return: The geodetic (C{LatLon}) or if B{C{LatLon}} is C{None} an L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}.
@note: The C{lat} will be in the range C{[-90..90] degrees} and C{lon} in the range C{[-180..180] degrees}. The C{scale} of the projection is C{1} in I{radial} direction, C{azimuth} clockwise from true North and C{1 / reciprocal} in the direction perpendicular to this. '''
'''If I{Karney}'s U{geographiclib<https://PyPI.org/project/geographiclib>} package is installed, return an L{GnomonicKarney} otherwise an L{Gnomonic} instance.
@arg lat0: Latitude of center point (C{degrees90}). @arg lon0: Longitude of center point (C{degrees180}). @kwarg datum: Optional datum or ellipsoid (L{Datum}, L{Ellipsoid}, L{Ellipsoid2} or L{a_f2Tuple}) or I{scalar} earth radius (C{meter}). @kwarg name: Optional name for the projection (C{str}).
@return: An L{GnomonicKarney} or L{Gnomonic} instance.
@raise AzimuthalError: Invalid B{C{lat0}}, B{C{lon0}} or sperical B{C{datum}}.
@raise TypeError: Invalid B{C{datum}}. '''
'''Azimuthal gnomonic projection, a Python version of I{Karney}'s C++ class U{Gnomonic <https://GeographicLib.SourceForge.io/html/classGeographicLib_1_1Gnomonic.html>}, requiring package U{geographiclib<https://PyPI.org/project/geographiclib>} to be installed.
@see: I{Karney}'s U{Detailed Description<https://GeographicLib.SourceForge.io/html/ classGeographicLib_1_1Gnomonic.html>}, especially the B{Warning}. ''' '''New azimuthal L{GnomonicKarney} projection.
@arg lat0: Latitude of center point (C{degrees90}). @arg lon0: Longitude of center point (C{degrees180}). @kwarg datum: Optional datum or ellipsoid (L{Datum}, L{Ellipsoid}, L{Ellipsoid2} or L{a_f2Tuple}) or I{scalar} earth radius (C{meter}). @kwarg name: Optional name for the projection (C{str}).
@raise ImportError: Package U{geographiclib<https://PyPI.org/ project/geographiclib>} missing.
@raise AzimuthalError: Invalid B{C{lat0}} or B{C{lon0}}. '''
'''Convert an (ellipsoidal) geodetic location to azimuthal gnomonic east- and northing.
@arg lat: Latitude of the location (C{degrees90}). @arg lon: Longitude of the location (C{degrees180}). @kwarg name: Optional name for the location (C{str}). @kwarg raiser: Do or don't throw an error (C{bool}) if the location lies over the horizon.
@return: An L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)} with C{x} and C{y} in C{meter} and C{lat} and C{lon} in C{degrees} and C{azimuth} clockwise from true North. The C{scale} of the projection is C{1 / reciprocal**2} in I{radial} direction and C{1 / reciprocal} in the direction perpendicular to this. Both C{x} and C{y} will be C{NAN} if the geodetic location lies over the horizon and B{C{raiser}} is C{False}.
@raise AzimuthalError: Invalid B{C{lat}}, B{C{lon}} or the geodetic location lies over the horizon and B{C{raiser}} is C{True}. '''
if raiser: raise AzimuthalError(lat=lat, lon=lon, txt=_over_horizon_) x = y = NAN else:
'''Convert an azimuthal gnomonic location to (ellipsoidal) geodetic lat- and longitude.
@arg x: Easting of the location (C{meter}). @arg y: Northing of the location (C{meter}). @kwarg name: Optional name for the location (C{str}). @kwarg LatLon: Class to use (C{LatLon}) or C{None}. @kwarg LatLon_kwds: Optional, additional B{C{LatLon}} keyword arguments, ignored if C{B{LatLon}=None}.
@return: The geodetic (C{LatLon}) or if B{C{LatLon}} is C{None} an L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}.
@raise AzimuthalError: No convergence.
@note: The C{lat} will be in the range C{[-90..90] degrees} and C{lon} in the range C{[-180..180] degrees}. The C{azimuth} is clockwise from true North. The scale is C{1 / reciprocal**2} in C{radial} direction and C{1 / reciprocal} in the direction perpendicular to this. '''
def _d(r, q): return (r.M12 - q * r.m12) * r.m12 # negated q = 1 / q else: # little == True
else: raise AzimuthalError(x=x, y=y, txt=_no_convergence_fmt_ % (e,))
self._toLatLon(r.lat2, r.lon2, LatLon, LatLon_kwds)
'''Lambert-equal-area projection for the sphere**, see U{Snyder, pp 185-187 <https://pubs.er.USGS.gov/djvu/PP/PP_1395.pdf>} and U{MathWorld-Wolfram <https://MathWorld.Wolfram.com/LambertAzimuthalEqual-AreaProjection.html>}. ''' if _FOR_DOCS: __init__ = _AzimuthalBase.__init__
'''Convert a geodetic location to azimuthal Lambert-equal-area east- and northing.
@arg lat: Latitude of the location (C{degrees90}). @arg lon: Longitude of the location (C{degrees180}). @kwarg name: Optional name for the location (C{str}).
@return: An L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)} with C{x} and C{y} in C{meter} and C{lat} and C{lon} in C{degrees}. The C{scale} of the projection is C{1} in I{radial} direction, C{azimuth} clockwise from true North and is C{1 / reciprocal} in the direction perpendicular to this.
@raise AzimuthalError: Invalid B{C{lat}} or B{C{lon}}. ''' else: k = _1_0
'''Convert an azimuthal Lambert-equal-area location to geodetic lat- and longitude.
@arg x: Easting of the location (C{meter}). @arg y: Northing of the location (C{meter}). @kwarg name: Optional name for the location (C{str}). @kwarg LatLon: Class to use (C{LatLon}) or C{None}. @kwarg LatLon_kwds: Optional, additional B{C{LatLon}} keyword arguments, ignored if C{B{LatLon}=None}.
@return: The geodetic (C{LatLon}) or if B{C{LatLon}} is C{None} an L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}.
@note: The C{lat} will be in the range C{[-90..90] degrees} and C{lon} in the range C{[-180..180] degrees}. The C{scale} of the projection is C{1} in I{radial} direction, C{azimuth} clockwise from true North and is C{1 / reciprocal} in the direction perpendicular to this. '''
'''Orthographic projection for the sphere**, see U{Snyder, pp 148-153 <https://pubs.er.USGS.gov/djvu/PP/PP_1395.pdf>} and U{MathWorld-Wolfram <https://MathWorld.Wolfram.com/OrthographicProjection.html>}. ''' if _FOR_DOCS: __init__ = _AzimuthalBase.__init__
'''Convert a geodetic location to azimuthal orthographic east- and northing.
@arg lat: Latitude of the location (C{degrees90}). @arg lon: Longitude of the location (C{degrees180}). @kwarg name: Optional name for the location (C{str}).
@return: An L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)} with C{x} and C{y} in C{meter} and C{lat} and C{lon} in C{degrees}. The C{scale} of the projection is C{1} in I{radial} direction, C{azimuth} clockwise from true North and is C{1 / reciprocal} in the direction perpendicular to this.
@raise AzimuthalError: Invalid B{C{lat}} or B{C{lon}}. '''
'''Convert an azimuthal orthographic location to geodetic lat- and longitude.
@arg x: Easting of the location (C{meter}). @arg y: Northing of the location (C{meter}). @kwarg name: Optional name for the location (C{str}). @kwarg LatLon: Class to use (C{LatLon}) or C{None}. @kwarg LatLon_kwds: Optional, additional B{C{LatLon}} keyword arguments, ignored if C{B{LatLon}=None}.
@return: The geodetic (C{LatLon}) or if B{C{LatLon}} is C{None} an L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}.
@note: The C{lat} will be in the range C{[-90..90] degrees} and C{lon} in the range C{[-180..180] degrees}. The C{scale} of the projection is C{1} in I{radial} direction, C{azimuth} clockwise from true North and is C{1 / reciprocal} in the direction perpendicular to this. '''
'''Stereographic projection for the sphere**, see U{Snyder, pp 157-160 <https://pubs.er.USGS.gov/djvu/PP/PP_1395.pdf>} and U{MathWorld-Wolfram <https://MathWorld.Wolfram.com/StereographicProjection.html>}. '''
if _FOR_DOCS: __init__ = _AzimuthalBase.__init__
'''Convert a geodetic location to azimuthal stereographic east- and northing.
@arg lat: Latitude of the location (C{degrees90}). @arg lon: Longitude of the location (C{degrees180}). @kwarg name: Optional name for the location (C{str}).
@return: An L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)} with C{x} and C{y} in C{meter} and C{lat} and C{lon} in C{degrees}. The C{scale} of the projection is C{1} in I{radial} direction, C{azimuth} clockwise from true North and is C{1 / reciprocal} in the direction perpendicular to this.
@raise AzimuthalError: Invalid B{C{lat}} or B{C{lon}}. ''' else: k = _1_0
'''Get the central scale factor (C{scalar}). '''
'''Set the central scale factor (C{scalar}). '''
'''Convert an azimuthal stereographic location to geodetic lat- and longitude.
@arg x: Easting of the location (C{meter}). @arg y: Northing of the location (C{meter}). @kwarg name: Optional name for the location (C{str}). @kwarg LatLon: Class to use (C{LatLon}) or C{None}. @kwarg LatLon_kwds: Optional, additional B{C{LatLon}} keyword arguments, ignored if C{B{LatLon}=None}.
@return: The geodetic (C{LatLon}) or if B{C{LatLon}} is C{None} an L{Azimuthal7Tuple}C{(x, y, lat, lon, azimuth, scale, datum)}.
@note: The C{lat} will be in the range C{[-90..90] degrees} and C{lon} in the range C{[-180..180] degrees}. The C{scale} of the projection is C{1} in I{radial} direction, C{azimuth} clockwise from true North and is C{1 / reciprocal} in the direction perpendicular to this. '''
# **) MIT License # # Copyright (C) 2016-2020 -- mrJean1 at Gmail -- All Rights Reserved. # # 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. |