cf-python-1.3.2/0000755000175000017500000000000012770523316013632 5ustar daviddavid00000000000000cf-python-1.3.2/PKG-INFO0000644000175000017500000000471212770523316014733 0ustar daviddavid00000000000000Metadata-Version: 1.1 Name: cf-python Version: 1.3.2 Summary: Python interface to the CF data model Home-page: http://cfpython.bitbucket.org/ Author: David Hassell Author-email: d.c.hassell at reading.ac.uk License: UNKNOWN Download-URL: https://bitbucket.org/cfpython/cf-python/downloads Description: Home page ========= * `cf-python `_ Documentation ============= * `Online documentation for the latest stable release `_ Dependencies ============ * The package runs on Linux and Mac OS operating systems. * Requires a python version from 2.6 up to, but not including, 3.0. * See the `README.md `_ file for further dependencies Visualisation ============= * The `cfplot package `_ at version 1.9.10 or newer provides metadata-aware visualisation for cf-python fields. This is not a dependency for cf-python. Command line utilities ====================== * The `cfdump` tool generates text representations on standard output of the CF fields contained in the input files. * The `cfa` tool creates and writes to disk the CF fields contained in the input files. * During installation these scripts will be copied automatically to a location given by the ``PATH`` environment variable. Code license ============ * `MIT License `_ Keywords: cf,netcdf,data,science,oceanography,meteorology,climate Platform: Linux Platform: MacOS Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Science/Research Classifier: License :: OSI Approved :: MIT License Classifier: Topic :: Scientific/Engineering :: Mathematics Classifier: Topic :: Scientific/Engineering :: Physics Classifier: Topic :: Scientific/Engineering :: Atmospheric Science Classifier: Topic :: Utilities Classifier: Operating System :: POSIX :: Linux Classifier: Operating System :: MacOS Requires: netCDF4 (>=1.1.1) Requires: numpy (>=1.7) Requires: matplotlib (>=1.4.2) Requires: psutil (>=0.6.0) cf-python-1.3.2/cf/0000755000175000017500000000000012770523315014221 5ustar daviddavid00000000000000cf-python-1.3.2/cf/cfdatetime.py0000644000175000017500000004475312762500411016706 0ustar daviddavid00000000000000import netCDF4 # Work: Running Sphinx v1.2b1 from datetime import datetime from numpy import array as numpy_array from numpy import ndarray as numpy_ndarray from numpy import ndim as numpy_ndim from numpy import vectorize as numpy_vectorize from .functions import inspect as cf_inspect from .units import Units if netCDF4.__version__ <= '1.1.1': _netCDF4_netcdftime_parse_date = netCDF4.netcdftime._parse_date _netCDF4_netcdftime_strftime = netCDF4.netcdftime._strftime else: _netCDF4_netcdftime_parse_date = netCDF4.netcdftime.netcdftime._parse_date _netCDF4_netcdftime_strftime = netCDF4.netcdftime._datetime._strftime # Define some useful units _calendar_years = Units('calendar_years') _calendar_months = Units('calendar_months') # ==================================================================== # # Datetime object (overrides netCDF4.netcdftime.datetime) # # ==================================================================== class Datetime(object): # ---------------------------------------------------------------- # Adapted from Jeff Whitaker's netCDF4.netcdftime.datetime # ---------------------------------------------------------------- ''' A date-time object which supports CF calendars. Any date and time valid in any CF calendar is allowed. In many situations, it may be used interchangeably with a built-in `datetime.datetime` object. For example: >>> import datetime >>> d = cf.Datetime(2004, 2, 30) >>> d > datetime.datetime(2004, 2, 1) True **Attributes** ============== ====================================================== Attribute Description ============== ====================================================== `!year` The year of the date `!month` The month of the year of the date `!day` The day of the month of the date `!hour` The hour of the day of the date `!minute` The minute of the hour of the date `!second` The second of the minute of the date `!microsecond` The microsecond of the second of the date ============== ====================================================== .. seealso:: `cf.dt`, `cf.TimeDuration` ''' def __init__(self, year, month=1, day=1, hour=0, minute=0, second=0, microsecond=0, dayofwk=-1, dayofyr=1): '''**Initialization** :Parameters: year: `int` The year. month, day, hour, minute, second, microsecond: `int`, optional The month of the year, the day of the month and time of the day. *month* and *day* default to 1 and *hour*; *minute*, *second* and *microsecond* default to 0. :Examples: >>> cf.Datetime(2003) >>> d = cf.Datetime(2003, 2, 30) >>> d = cf.Datetime(2003, 2, 30, 0) >>> d = cf.Datetime(2003, 2, 30, 0, 0) >>> d = cf.Datetime(2003, 2, 30, 0, 0, 0) >>> d = cf.Datetime(2003, 4, 5, 12, 30, 15) >>> d = cf.Datetime(year=2003, month=4, day=5, hour=12, minute=30, second=15) >>> d.year, d.month, d.day, d.hour, d.minute, d.second (2003, 4, 5, 12, 30, 15) >>> d.timetuple() (2003, 4, 5, 12, 30, 15, -1, 1) ''' # ------------------------------------------------------------ # NOTE: dayofyr is set to 1 by default, otherwise # time.strftime will complain. # ------------------------------------------------------------ self.year = year self.month = month self.day = day self.hour = hour self.minute = minute self.second = second self.microsecond = microsecond self.dayofwk = dayofwk self.dayofyr = dayofyr self.format = '%Y-%m-%d %H:%M:%S' #--- End: def def __deepcopy__(self, memo): ''' Used if copy.deepcopy is called ''' return self.copy() #--- End: def def __repr__(self): ''' x__repr__() <==> repr(x) ''' return '' % (self.__class__.__name__, self) #--- End: def def __str__(self): ''' x__str__() <==> str(x) ''' return self.strftime() #--- End: def def __eq__(self, other): ''' x__eq__(y) <==> x==y ''' try: return self._timetuple6() == other.timetuple()[:6] except AttributeError: return NotImplemented #--- End: def def __ne__(self, other): ''' x__ne__(y) <==> x!=y ''' try: return self._timetuple6() != other.timetuple()[:6] except AttributeError: return NotImplemented #--- End: def def __ge__(self, other): ''' x__ge__(y) <==> x>=y ''' try: return self._timetuple6() >= other.timetuple()[:6] except AttributeError: return NotImplemented #--- End: def def __gt__(self, other): ''' x__gt__(y) <==> x>y ''' try: return self._timetuple6() > other.timetuple()[:6] except AttributeError: return NotImplemented #--- End: def def __le__(self, other): ''' x__le__(y) <==> x<=y ''' try: return self._timetuple6() <= other.timetuple()[:6] except AttributeError: return NotImplemented #--- End: def def __lt__(self, other): ''' x__lt__(y) <==> x>> d = cf.Datetime(2005, 6, 7, 23, 45, 57) >>> d._timetuple6() (2005, 6, 7, 23, 45, 57) ''' return (self.year, self.month, self.day, self.hour, self.minute, self.second) #--- End: def def copy(self): ''' Return a deep copy. ``d.copy()`` is equivalent to ``copy.deepcopy(d)``. :Returns: out: The deep copy. :Examples: >>> e = d.copy() ''' return type(self)(*self.timetuple()[:-1]) #--- End: def def inspect(self): ''' Inspect the attributes. .. seealso:: `cf.inspect` :Returns: None ''' print cf_inspect(self) #--- End: def def strftime(self, format=None): if format is None: format = self.format return _netCDF4_netcdftime_strftime(self, format) #--- End: def def timetuple(self): ''' Return a tuple of the date-time attributes. ``d.timetuple()`` is equivalent to ``(d.year, d.month, d.day, d.hour, d.minute, d.second, d.dayofwk, d.dayofyr, -1)``. :Returns: out: `tuple` The date-time attributes. :Examples: >>> d = cf.Datetime(2005, 6, 7, 23, 45, 57, 999888) >>> d.timetuple() (2005, 6, 7, 23, 45, 57, -1, 1, -1) ''' return (self.year, self.month, self.day, self.hour, self.minute, self.second, self.dayofwk, self.dayofyr, -1) #--- End: def @classmethod def utcnow(cls): ''' Return the current Gregorian calendar UTC date and time. :Returns: out: cf.Datetime The current UTC date and time. :Examples: >>> cf.Datetime.utcnow() >>> d = cf.Datetime(2005, 6, 7) >>> d.utcnow() >>> d ''' return cls(*datetime.utcnow().timetuple()[:-1]) #--- End: def #--- End: class netCDF4.netcdftime.datetime = Datetime def dt(*args, **kwargs): '''Return a date-time variable for a given date and time. The date and time may be specified with an ISO 8601-like date-time string (in which non-Gregorian calendar dates are allowed) or by providing a value for the year and, optionally, the month, day, hour, minute, second and microsecond. .. seealso:: `cf.Datetime` :Parameters: args, kwargs: If the first positional argument is a string, then it must be an ISO 8601-like date-time string from which a `cf.Datetime` object is initialized. Otherwise, the positional and keyword arguments are used to explicitly initialize a `cf.Datetime` object, so see `cf.Datetime` for details. :Returns: out: `cf.Datetime` The new date-time object. :Examples: >>> d = cf.dt(2003, 2, 30) >>> d = cf.dt(2003, 2, 30, 0, 0, 0) >>> d = cf.dt('2003-2-30') >>> d = cf.dt('2003-2-30 0:0:0') >>> d = cf.dt(2003, 4, 5, 12, 30, 15) >>> d = cf.dt(year=2003, month=4, day=5, hour=12, minute=30, second=15) >>> d = cf.dt('2003-04-05 12:30:15') >>> d.year, d.month, d.day, d.hour, d.minute, d.second (2003, 4, 5, 12, 30, 15) ''' if kwargs: return Datetime(*args, **kwargs) elif not args: raise ValueError("34 woah!") else: arg0 = args[0] if isinstance(arg0, basestring): return st2Datetime(arg0) elif isinstance(arg0, datetime): return Datetime(*arg0.timetuple()[:6]) else: return Datetime(*args) #--- End: def def st2dt(array, units_in=None, dummy0=None, dummy1=None): ''' The returned array is always independent. :Parameters: array: numpy array-like units_in: `cf.Units`, optional dummy0: optional Ignored. dummy1: optional Ignored. :Returns: out: `numpy.ndarray` An array of `cf.Datetime` or `datetime.datetime` objects with the same shape as *array*. :Examples: ''' if getattr(units_in, '_calendar', None) in ('gregorian' 'standard', 'none'): return array_st2datetime(array) else: return array_st2Datetime(array) #--- End: def def st2datetime(date_string): ''' Parse an ISO 8601 date-time string into a datetime.datetime object. :Parameters: date_string: `str` :Returns: out: `datetime.datetime` ''' if date_string.count('-') != 2: raise ValueError("A string must contain a year, a month and a day") year,month,day,hour,minute,second,utc_offset = _netCDF4_netcdftime_parse_date(date_string) if utc_offset: raise ValueError("Can't specify a time offset from UTC") return datetime(year, month, day, hour, minute, second) #--- End: def array_st2datetime = numpy_vectorize(st2datetime, otypes=[object]) def st2Datetime(date_string): ''' Parse an ISO 8601 date-time string into a `cf.Datetime` object. :Parameters: date_string: `str` :Returns: out: `cf.Datetime` ''' if date_string.count('-') != 2: raise ValueError("A string must contain a year, a month and a day") year,month,day,hour,minute,second,utc_offset = _netCDF4_netcdftime_parse_date(date_string) if utc_offset: raise ValueError("Can't specify a time offset from UTC") return Datetime(year, month, day, hour, minute, second) #--- End: def array_st2Datetime = numpy_vectorize(st2Datetime, otypes=[object]) def rt2dt(array, units_in, dummy0=None, dummy1=None): ''' The returned array is always independent. :Parameters: array: numpy array-like units_in: `cf.Units` dummy0: Ignored. dummy1: Ignored. :Returns: out: `numpy.ndarray` An array of `cf.Datetime` or `datetime.datetime` objects with the same shape as *array*. ''' ndim = numpy_ndim(array) array = units_in._utime.num2date(array) if not ndim: array = numpy_array(array, dtype=object) return array #--- End: def def dt2rt(array, dummy0, units_out, dummy1=None): ''' The returned array is always independent. :Parameters: array: numpy array-like of date-time objects dummy0: Ignored. units_out: `cf.Units` dummy1: Ignored. :Returns: out: `numpy.ndarray` An array of numbers with the same shape as *array*. ''' ndim = numpy_ndim(array) if not ndim and isinstance(array, numpy_ndarray): # This necessary because date2num gets upset if you pass # it a scalar numpy array array = array.item() array = units_out._utime.date2num(array) if not ndim: array = numpy_array(array) return array #--- End: def def st2rt(array, units_in, units_out, dummy1=None): ''' The returned array is always independent. :Parameters: array: numpy array-like of ISO 8601 date-time strings units_in: `cf.Units` or `None` units_out: `cf.Units` dummy1: Ignored. :Returns: out: `numpy.ndarray` An array of floats with the same shape as *array*. ''' array = st2dt(array, units_in) ndim = numpy_ndim(array) if not ndim and isinstance(array, numpy_ndarray): # This necessary because date2num gets upset if you pass # it a scalar numpy array array = array.item() array = units_out._utime.date2num(array) if not ndim: array = numpy_array(array) return array #--- End: def def _JulianDayFromDate(date, calendar='standard'): ''' Create a Julian Day from a 'datetime-like' object. Returns the fractional Julian Day (resolution 1 second). if calendar='standard' or 'gregorian' (default), Julian day follows Julian Calendar on and before 1582-10-5, Gregorian calendar after 1582-10-15. if calendar='proleptic_gregorian', Julian Day follows gregorian calendar. if calendar='julian', Julian Day follows julian calendar. Algorithm: Meeus, Jean (1998) Astronomical Algorithms (2nd Edition). Willmann-Bell, Virginia. p. 63 This is taken from netCDF4.netcdftime.JulianDayFromDate, with an error check added. ''' # based on redate.py by David Finlayson. year=date.year; month=date.month; day=date.day hour=date.hour; minute=date.minute; second=date.second try: datetime(year, month, day, hour, minute, second) except ValueError: raise ValueError("Bad %s calendar date: %s" % (calendar, date)) # Convert time to fractions of a day day = day + hour/24.0 + minute/1440.0 + second/86400.0 # Start Meeus algorithm (variables are in his notation) if (month < 3): month = month + 12 year = year - 1 A = int(year/100) # MC # jd = int(365.25 * (year + 4716)) + int(30.6001 * (month + 1)) + \ # day - 1524.5 jd = 365.*year + int(0.25 * year + 2000.) + int(30.6001 * (month + 1)) + \ day + 1718994.5 # optionally adjust the jd for the switch from # the Julian to Gregorian Calendar # here assumed to have occurred the day after 1582 October 4 if calendar in ['standard','gregorian']: if jd >= 2299170.5: # 1582 October 15 (Gregorian Calendar) B = 2 - A + int(A/4) elif jd < 2299160.5: # 1582 October 5 (Julian Calendar) B = 0 else: raise ValueError('impossible date (falls in gap between end of Julian calendar and beginning of Gregorian calendar') elif calendar == 'proleptic_gregorian': B = 2 - A + int(A/4) elif calendar == 'julian': B = 0 else: raise ValueError('unknown calendar, must be one of julian,standard,gregorian,proleptic_gregorian, got %s' % calendar) # adjust for Julian calendar if necessary jd = jd + B return jd #--- End: def netCDF4.netcdftime.JulianDayFromDate = _JulianDayFromDate def _NoLeapDayFromDate(date): ''' Creates a Julian Day for a calendar with no leap years from a date-time instance. Returns the fractional Julian Day (resolution 1 second). ''' year=date.year; month=date.month; day=date.day hour=date.hour; minute=date.minute; second=date.second if month == 2 and day > 28: raise ValueError("Bad 365_day calendar date: %s" % date) if year != 0: try: datetime(year, month, day, hour, minute, second) except ValueError: raise ValueError("Bad 365_day calendar date: %s" % date) # Convert time to fractions of a day day = day + hour/24.0 + minute/1440.0 + second/86400.0 # Start Meeus algorithm (variables are in his notation) if (month < 3): month = month + 12 year = year - 1 jd = int(365. * (year + 4716)) + int(30.6001 * (month + 1)) + \ day - 1524.5 return jd #--- End: def if netCDF4.__version__ <= '1.1.1': netCDF4.netcdftime._NoLeapDayFromDate = _NoLeapDayFromDate else: netCDF4.netcdftime.netcdftime._NoLeapDayFromDate = _NoLeapDayFromDate def interval(value, units_in, units_out=None, dummy1=None): ''' ''' reftime = units_in.reftime.timetuple() if units == _calendar_years: months = value * 12 int_months = int(months) if int_months != months: raise ValueError( "Can't create a time interval of a non-integer number of calendar months: %s" % months) elif units == _calendar_months: months = value int_months = int(months) if int_months != months: raise ValueError( "Can't create a time interval of a non-integer number of calendar months: %s" % months) else: int_months = None if int_months is not None: if value > 0: y, month1 = divmod(reftime[1] + int_months, 12) if not month1: y -= 1 month1 = 12 year1 = reftime[0] + y dt = Datetime(year1, month1, reftime[2:6]) else: y, month0 = divmod(reftime[1] - int_months, 12) if not month0: y -= 1 month0 = 12 year0 = reftime[0] + y dt = Datetime(year0, month0, reftime[2:6]) cf-python-1.3.2/cf/etc/0000755000175000017500000000000012770523315014774 5ustar daviddavid00000000000000cf-python-1.3.2/cf/etc/coordinate_reference/0000755000175000017500000000000012770523315021141 5ustar daviddavid00000000000000cf-python-1.3.2/cf/etc/coordinate_reference/name_type_coordinates.txt0000600000175000017500000000421612310330616026236 0ustar daviddavid00000000000000# Col 0: Georeference name Col 1: Type Cols 2+: Set of coordinate identites to which it applies albers_conical_equal_area grid_mapping projection_x_coordinate projection_y_coordinate latitude longitude azimuthal_equidistant grid_mapping projection_x_coordinate projection_y_coordinate latitude longitude geostationary grid_mapping projection_x_coordinate projection_y_coordinate latitude longitude lambert_azimuthal_equal_area grid_mapping projection_x_coordinate projection_y_coordinate latitude longitude lambert_conformal_conic grid_mapping projection_x_coordinate projection_y_coordinate latitude longitude lambert_cylindrical_equal_area grid_mapping projection_x_coordinate projection_y_coordinate latitude longitude latitude_longitude grid_mapping latitude longitude mercator grid_mapping projection_x_coordinate projection_y_coordinate latitude longitude orthographic grid_mapping projection_x_coordinate projection_y_coordinate latitude longitude polar_stereographic grid_mapping projection_x_coordinate projection_y_coordinate latitude longitude rotated_latitude_longitude grid_mapping grid_latitude grid_longitude latitude longitude sinusoidal grid_mapping projection_x_coordinate projection_y_coordinate latitude longitude stereographic grid_mapping projection_x_coordinate projection_y_coordinate latitude longitude transverse_mercator grid_mapping projection_x_coordinate projection_y_coordinate latitude longitude vertical_perspective grid_mapping projection_x_coordinate projection_y_coordinate latitude longitude atmosphere_ln_pressure_coordinate formula_terms atmosphere_ln_pressure_coordinate atmosphere_sigma_coordinate formula_terms atmosphere_sigma_coordinate atmosphere_hybrid_sigma_pressure_coordinate formula_terms atmosphere_hybrid_sigma_pressure_coordinate atmosphere_hybrid_height_coordinate formula_terms atmosphere_hybrid_height_coordinate atmosphere_sleve_coordinate formula_terms atmosphere_sleve_coordinate ocean_sigma_coordinate formula_terms ocean_sigma_coordinate ocean_s_coordinate formula_terms ocean_s_coordinate ocean_sigma_z_coordinate formula_terms ocean_sigma_z_coordinate ocean_double_sigma_coordinate formula_terms ocean_double_sigma_coordinate cf-python-1.3.2/cf/etc/coordinate_reference/canonical_units.txt0000644000175000017500000000111312745346616025060 0ustar daviddavid00000000000000# Col 0: Parameter name # Col 1: Canonical units earth_radius m grid_north_pole_latitude degrees_north grid_north_pole_longitude degrees_east inverse_flattening 1 latitude_of_projection_origin degrees_north longitude_of_central_meridian degrees_east longitude_of_prime_meridian degrees_east longitude_of_projection_origin degrees_east north_pole_grid_longitude degrees perspective_point_height m scale_factor_at_central_meridian 1 scale_factor_at_projection_origin 1 semi_major_axis m semi_minor_axis m standard_parallel degrees_north straight_vertical_longitude_from_pole degrees_north cf-python-1.3.2/cf/etc/coordinate_reference/term_canonical_units.txt0000600000175000017500000000123412310331224026054 0ustar daviddavid00000000000000# # # Col 0: Parameter name # Col 1: Canonical units earth_radius m false_easting projection_x_coordinate false_northing projection_y_coordinate grid_north_pole_latitude degrees_north grid_north_pole_longitude degrees_east inverse_flattening 1 latitude_of_projection_origin degrees_north longitude_of_central_meridian degrees_east longitude_of_prime_meridian degrees_east longitude_of_projection_origin degrees_east north_pole_grid_longitude degrees perspective_point_height m scale_factor_at_central_meridian 1 scale_factor_at_projection_origin 1 semi_major_axis m semi_minor_axis m standard_parallel degrees_north straight_vertical_longitude_from_pole degrees_north cf-python-1.3.2/cf/etc/coordinate_reference/term_default_values.txt0000600000175000017500000000072312310331155025713 0ustar daviddavid00000000000000# Default values for georeferencing parameters. The parameters # correspond to the parameters of CF grid_mapping variables and # formula_terms attributes. The default values are to be interpreted # as numbers. # # Col 0: Parameter name # Col 1: Default value a 0 b 0 b1 0 b2 0 depth 0 depth_c 0 eta 0 href 0 k_c 0 lev 0 longitude_of_prime_meridian 0 north_pole_grid_longitude 0 nsigma 0 orog 0 p0 0 ps 0 ptop 0 s 0 sigma 0 z1 0 z2 0 zlev 0 zsurf1 0 zsurf2 0 ztop 0 cf-python-1.3.2/cf/etc/coordinate_reference/default_values.txt0000600000175000017500000000061212603546021024666 0ustar daviddavid00000000000000# Coordinate conversion terms and their default values. # Column 1 : Coordinate conversion term # Columns 2+: Default values # See appendices D and F in the CF conventions for details. a 0 b 0 b1 0 b2 0 depth 0 depth_c 0 eta 0 href 0 k_c 0 lev 0 longitude_of_prime_meridian 0 north_pole_grid_longitude 0 nsigma 0 orog 0 p0 0 ps 0 ptop 0 s 0 sigma 0 z1 0 z2 0 zlev 0 zsurf1 0 zsurf2 0 ztop 0 cf-python-1.3.2/cf/etc/coordinate_reference/scalar_terms.txt0000600000175000017500000000012512352323545024346 0ustar daviddavid00000000000000# # # # # # Col 0: Parameter name a b depth_c href k_c nsigma p0 ptop ztop z1 z2 cf-python-1.3.2/cf/etc/coordinate_reference/type.txt0000600000175000017500000000165312603546021022652 0ustar daviddavid00000000000000# Col 0: Coordinate reference name. Col 1: CF type albers_conical_equal_area grid_mapping azimuthal_equidistant grid_mapping geostationary grid_mapping lambert_azimuthal_equal_area grid_mapping lambert_conformal_conic grid_mapping lambert_cylindrical_equal_area grid_mapping latitude_longitude grid_mapping mercator grid_mapping orthographic grid_mapping polar_stereographic grid_mapping rotated_latitude_longitude grid_mapping sinusoidal grid_mapping stereographic grid_mapping transverse_mercator grid_mapping vertical_perspective grid_mapping atmosphere_ln_pressure_coordinate formula_terms atmosphere_sigma_coordinate formula_terms atmosphere_hybrid_sigma_pressure_coordinate formula_terms atmosphere_hybrid_height_coordinate formula_terms atmosphere_sleve_coordinate formula_terms ocean_sigma_coordinate formula_terms ocean_s_coordinate formula_terms ocean_sigma_z_coordinate formula_terms ocean_double_sigma_coordinate formula_terms cf-python-1.3.2/cf/etc/coordinate_reference/non_constant_terms.txt0000600000175000017500000000135512603546021025605 0ustar daviddavid00000000000000# Coordinate reference types and their non-constant coordinate # conversion terms. # Column 1 : Coordinate reference construct name # Columns 2+: Coordinate conversion terms which have non-constant # values, i.e. the values are either Coordinate objects or # non-scalar Field objects. # See appendices D and F in the CF conventions for details. atmosphere_ln_pressure_coordinate lev atmosphere_sigma_coordinate ps sigma atmosphere_hybrid_sigma_pressure_coordinate a b ps atmosphere_hybrid_height_coordinate a b orog atmosphere_sleve_coordinate a b1 b2 zsurf1 zsurf2 ocean_sigma_coordinate depth eta sigma ocean_s_coordinate depth eta s ocean_sigma_z_coordinate depth eta sigma zlev ocean_double_sigma_coordinate depth sigma cf-python-1.3.2/cf/etc/coordinate_reference/coordinates.txt0000600000175000017500000000350012603546021024174 0ustar daviddavid00000000000000# Col 0: Georeference name Col 1+: Set of coordinate identites to which it applies albers_conical_equal_area projection_x_coordinate projection_y_coordinate latitude longitude azimuthal_equidistant projection_x_coordinate projection_y_coordinate latitude longitude geostationary projection_x_coordinate projection_y_coordinate latitude longitude lambert_azimuthal_equal_area projection_x_coordinate projection_y_coordinate latitude longitude lambert_conformal_conic projection_x_coordinate projection_y_coordinate latitude longitude lambert_cylindrical_equal_area projection_x_coordinate projection_y_coordinate latitude longitude latitude_longitude latitude longitude mercator projection_x_coordinate projection_y_coordinate latitude longitude orthographic projection_x_coordinate projection_y_coordinate latitude longitude polar_stereographic projection_x_coordinate projection_y_coordinate latitude longitude rotated_latitude_longitude grid_latitude grid_longitude latitude longitude sinusoidal projection_x_coordinate projection_y_coordinate latitude longitude stereographic projection_x_coordinate projection_y_coordinate latitude longitude transverse_mercator projection_x_coordinate projection_y_coordinate latitude longitude vertical_perspective projection_x_coordinate projection_y_coordinate latitude longitude atmosphere_ln_pressure_coordinate atmosphere_ln_pressure_coordinate atmosphere_sigma_coordinate atmosphere_sigma_coordinate atmosphere_hybrid_sigma_pressure_coordinate atmosphere_hybrid_sigma_pressure_coordinate atmosphere_hybrid_height_coordinate atmosphere_hybrid_height_coordinate atmosphere_sleve_coordinate atmosphere_sleve_coordinate ocean_sigma_coordinate ocean_sigma_coordinate ocean_s_coordinate ocean_s_coordinate ocean_sigma_z_coordinate ocean_sigma_z_coordinate ocean_double_sigma_coordinate ocean_double_sigma_coordinate cf-python-1.3.2/cf/etc/coordinate_reference/xxx.txt0000600000175000017500000000144612642506446022532 0ustar daviddavid00000000000000# Col 0: Georeference name Col 1+: Set of coordinate identites to which it applies albers_conical_equal_area azimuthal_equidistant geostationary lambert_azimuthal_equal_area lambert_conformal_conic lambert_cylindrical_equal_area latitude_longitude mercator orthographic polar_stereographic rotated_latitude_longitude sinusoidal stereographic transverse_mercator vertical_perspective atmosphere_ln_pressure_coordinate p0 atmosphere_sigma_coordinate ptop ps atmosphere_hybrid_sigma_pressure_coordinate p0 ps a b ap atmosphere_hybrid_height_coordinate a b orog atmosphere_sleve_coordinate a b1 b2 ztop zsurf zsurf2 ocean_sigma_coordinate ocean_sigma_coordinate ocean_s_coordinate ocean_s_coordinate ocean_sigma_z_coordinate ocean_sigma_z_coordinate ocean_double_sigma_coordinate ocean_double_sigma_coordinate cf-python-1.3.2/cf/etc/STASH_to_CF.txt0000644000175000017500000143574512747600703017515 0ustar daviddavid000000000000001!1!PSTAR AFTER TIMESTEP !Pa!!407!surface_air_pressure!! 1!2!U COMPNT OF WIND AFTER TIMESTEP !m s-1!!!eastward_wind!!true_latitude_longitude 1!2!U COMPNT OF WIND AFTER TIMESTEP !m s-1!!!x_wind!!rotated_latitude_longitude 1!3!V COMPNT OF WIND AFTER TIMESTEP !m s-1!!!northward_wind!!true_latitude_longitude 1!3!V COMPNT OF WIND AFTER TIMESTEP !m s-1!!!y_wind!!rotated_latitude_longitude 1!4!THETA AFTER TIMESTEP !K!!!air_potential_temperature!! 1!5!THETAL IN THE EXTERNAL DUMP !K!!407!!! 1!5!OROGRAPHIC GRADIENT X COMPONENT !!606!!!! 1!6!OROGRAPHIC GRADIENT Y COMPONENT !!606!!!! 1!7!UNFILTERED OROGRAPHY !!708!!!! 1!8!SOIL BULK DENSITY KG/M3 !!705!!!! 1!9!SOIL MOISTURE CONTENT IN A LAYER !kg m-2!!!moisture_content_of_soil_layer!! 1!10!SPECIFIC HUMIDITY AFTER TIMESTEP !1!!!specific_humidity!! 1!11!QT IN THE EXTERNAL DUMP !!!407!!! 1!12!QCF IN THE EXTERNAL DUMP !!404!404.1!!! 1!12!QCF IN THE EXTERNAL DUMP !1!405!407!mass_fraction_of_cloud_ice_in_air!! 1!12!QCF AFTER TIMESTEP !1!500!!mass_fraction_of_cloud_ice_in_air!! 1!13!CONV CLOUD AMOUNT AFTER TIMESTEP !1!!!convective_cloud_area_fraction!! 1!14!CONV CLOUD BASE LEVEL NO. AFTER TS !!!!!! 1!15!CONV CLOUD TOP LEVEL NO. AFTER TS !!!!!! 1!16!CONV CLOUD LIQUID WATER PATH !!!!!! 1!17!SILHOUETTE OROGRAPHIC ROUGHNESS !!!!!! 1!18!HALF OF (PEAK TO TROUGH HT OF OROG)!!!!!! 1!19!STANDARD OROGRAPHIC ROUGHNESS !!!400.2!!! 1!20!DEEP SOIL TEMP AFTER TIMESTEP !K!!!soil_temperature!! 1!21!SOIL MOISTURE CONTENT AFTER TS KG/M2!kg m-2!!407!soil_moisture_content!! 1!21!CCRad : Lowest conv. cld base layer !!606!!!! 1!22!CANOPY WATER AFTER TIMESTEP KG/M2!!!!!! 1!23!SNOW AMOUNT AFTER TIMESTEP KG/M2!kg m-2!!503!snowfall_amount!! 1!23!SNOW AMOUNT OVER LAND AFT TSTP KG/M2!kg m-2!505!!snowfall_amount!! 1!24!SURFACE TEMPERATURE AFTER TIMESTEP !K!!!surface_temperature!! 1!25!BOUNDARY LAYER DEPTH AFTER TIMESTEP !m!!!atmosphere_boundary_layer_thickness!! 1!26!ROUGHNESS LENGTH AFTER TIMESTEP !m!!!surface_roughness_length!! 1!27!SNOW EDGE AFTER TIMESTEP **!!!!!! 1!28!SURFACE ZONAL CURRENT AFTER TIMESTEP!m s-1!!!surface_eastward_sea_water_velocity!! 1!29!SURFACE MERID CURRENT AFTER TIMESTEP!m s-1!!!surface_northward_sea_water_velocity!! 1!30!LAND MASK (LOGICAL: LAND=TRUE) !1!!407!land_binary_mask!! 1!30!LAND MASK (No halo) (LAND=TRUE) !1!500!!land_binary_mask!! 1!31!SEA ICE FRACTION AFTER TIMESTEP !1!!502!sea_ice_area_fraction!! 1!31!FRAC OF SEA ICE IN SEA AFTER TSTEP !1!503!!sea_ice_area_fraction!! 1!32!SEA ICE DEPTH (MEAN OVER ICE) M!m!!!sea_ice_thickness!! 1!33!OROGRAPHY (/STRAT LOWER BC) !m!!!surface_altitude!! 1!34!STANDARD DEVIATION OF OROGRAPHY !!!!!! 1!35!OROGRAPHIC GRADIENT XX COMPONENT !!!!!! 1!36!OROGRAPHIC GRADIENT XY COMPONENT !!!!!! 1!37!OROGRAPHIC GRADIENT YY COMPONENT !!!!!! 1!38!ICE EDGE AFTER TIMESTEP **!!!401!!! 1!38!ICE EDGE IN THE ANCILLARY FILE ONLY!!402!!!! 1!39!SST ANOMALY !!!!!! 1!40!VOL SMC AT WILTING AFTER TIMESTEP !1!!!volume_fraction_of_condensed_water_in_soil_at_wilting_point!! 1!41!VOL SMC AT CRIT PT AFTER TIMESTEP !1!!!volume_fraction_of_condensed_water_in_soil_at_critical_point!! 1!42!VOL SMC AT FIELD CAP AFTER TIMESTEP !1!!407!volume_fraction_of_condensed_water_in_soil_at_field_capacity!! 1!43!VOL SMC AT SATURATION AFTER TIMESTEP!1!!!soil_porosity!! 1!44!SAT SOIL CONDUCTIVITY AFTER TIMESTEP!m s-1!!!soil_hydraulic_conductivity_at_saturation!! 1!45!EAGLESON'S EXPONENT AFTER TIMESTEP !!!501!!! 1!46!THERMAL CAPACITY AFTER TIMESTEP !J kg-1 K-1!!!soil_thermal_capacity!! 1!47!THERMAL CONDUCTIVITY AFTER TIMESTEP !W m-1 K-1!!!soil_thermal_conductivity!! 1!48!SATURATED SOIL WATER SUCTION **!!!804!!! 1!48!SATURATED SOIL WATER SUCTION !!805!!!! 1!49!SEA-ICE TEMPERATURE AFTER TIMESTEP !K!!!sea_ice_temperature!! 1!50!VEGETATION FRACTION AFTER TIMESTEP !1!!!vegetation_area_fraction!! 1!51!ROOT DEPTH AFTER TIMESTEP !m!!!root_depth!! 1!52!SNOW-FREE SURFACE ALBEDO AFTER TS !1!!!surface_albedo_assuming_no_snow!! 1!53!DEEP SNOW SURFACE ALBEDO AFTER TS !1!!!surface_albedo_assuming_deep_snow!! 1!54!SURFACE RESISTANCE TO EVAP AFTER TS !!!!!! 1!55!SURFACE CAPACITY AFTER TIMESTEP !!!!!! 1!56!INFILTRATION FACTOR AFTER TIMESTEP !!!!!! 1!57!TOTAL AEROSOL EMISSIONS (FOR VIS) !!!!!! 1!58!SULPHUR DIOXIDE EMISSIONS !!!!!! 1!59!DIMETHYL SULPHIDE EMISSIONS !kg m-2 s-1!!505!!! 1!59!DIMETHYL SULPHIDE EMISSIONS (ANCIL) !kg m-2 s-1!601!!!! 1!60!OZONE **!1!!!mass_fraction_of_ozone_in_air!! 1!61!ATM TRACER 1 (CONVEN O3 )AFTER TS!!!505!!! 1!62!ATM TRACER 2 (CONVEN H2O )AFTER TS!!!505!!! 1!63!ATM TRACER 3 (CONVEN CO )AFTER TS!!!505!!! 1!64!ATM TRACER 4 (CONVEN CH4 )AFTER TS!!!505!!! 1!65!ATM TRACER 5 (CONVEN N2O )AFTER TS!!!505!!! 1!66!ATM TRACER 6 (CONVEN NO )AFTER TS!!!505!!! 1!67!ATM TRACER 7 (CONVEN NO2 )AFTER TS!!!505!!! 1!68!ATM TRACER 8 (CONVEN HNO3 )AFTER TS!!!505!!! 1!69!ATM TRACER 9 (CONVEN N2O5 )AFTER TS!!!505!!! 1!70!ATM TRACER 10 (CONVN CLONO2)AFTER TS!!!505!!! 1!70!TURBULENT KINETIC ENERGY !!706!!!! 1!71!ATM TRACER 11 (CONVEN CLO )AFTER TS!!!505!!! 1!71!SELF COVARIANCE OF THETAL' !!706!!!! 1!72!ATM TRACER 12 (CONVEN HCL )AFTER TS!!!505!!! 1!72!SELF COVARIANCE OF QW' !!706!!!! 1!73!ATM TRACER 13 (CONVN CF2CL2)AFTER TS!!!505!!! 1!73!CORRELATION OF THETAL' AND QW' !!706!!!! 1!74!ATM TRACER 14 (CONVEN CFCL3)AFTER TS!!!505!!! 1!74!HEIGHT OF MIXED LAYER FOR SHCU BUOY !!706!!!! 1!75!ATM TRACER 15 (CONVEN HF )AFTER TS!!!505!!! 1!75!CLOUD NUMBER AFTER TIMESTEP !!1001!!!! 1!76!ATM TRACER 16 (CONVEN -----)AFTER TS!!!505!!! 1!76!RAIN NUMBER AFTER TIMESTEP !!1001!!!! 1!77!ATM TRACER 17 (CONVEN -----)AFTER TS!!!505!!! 1!77!RAIN THIRD MOMENT AFTER TIMESTEP !!1001!!!! 1!78!ATM TRACER 18 (CONVEN -----)AFTER TS!!!505!!! 1!78!ICE NUMBER AFTER TIMESTEP !!1001!!!! 1!79!ATM TRACER 19 (CONVEN SO2 )AFTER TS!!!400.2!!! 1!79!ATM TRACER 19 (CONVEN ---- )AFTER TS!!401!505!!! 1!79!SNOW NUMBER AFTER TIMESTEP !!1001!!!! 1!80!ATM TRACER 20 (CONVEN DMS )AFTER TS!!!400.2!!! 1!80!ATM TRACER 20 (CONVEN ---- )AFTER TS!!401!505!!! 1!80!SNOW THIRD MOMENT AFTER TIMESTEP !!1001!!!! 1!81!ATM TRACER 21 (CONVEN H2S )AFTER TS!!!505!!! 1!81!GRAUPEL NUMBER AFTER TIMESTEP !!1001!!!! 1!82!ATM TRACER 22 (CONV WATER-SOL)AFT TS!!!505!!! 1!82!GRAUPEL THIRD MOMENT AFTER TIMESTEP !!1001!!!! 1!83!ATM TRACER 23 (CONV "DUST" )AFTER TS!!!505!!! 1!83!ACTSOLLIQ AEROSOL AFTER TIMESTEP !!1001!!!! 1!84!ATM TRACER 24 (CONV OCEANIC)AFTER TS!!!505!!! 1!84!ACTSOLRAIN AEROSOL AFTER TIMESTEP !!1001!!!! 1!85!ATM TRACER 25 (CONVEN SOOT )AFTER TS!!!505!!! 1!85!ACTINSOLICE AEROSOL AFTER TIMESTEP !!1001!!!! 1!86!ATM TRACER 26 (CONV VOLC ASH) AFT TS!!!505!!! 1!86!ACTSOLICE AEROSOL AFTER TIMESTEP !!1001!!!! 1!87!ATM TRACER 27 (CONVEN H2SO4)AFTER TS!!!505!!! 1!87!ACTINSOLLIQUID AERO AFTER TIMESTEP !!1001!!!! 1!88!ATM TRACER 28 (NH4)2SO4 AFTER TS!!!505!!! 1!88!ACTSOLNUMBER AERO AFTER TIMESTEP !!1001!!!! 1!89!ATM TRACER 29 (CONV MINERAL)AFTER TS!!!505!!! 1!89!ACTINSOLNUMBER AER0 AFTER TIMESTEP !!1001!!!! 1!90!TOTAL AEROSOL (FOR VISIBILITY) !!!!!! 1!91!LIGHTNING POTENTIAL !!806!!!! 1!93!RUNOFF COASTAL OUTFLOW POINT !!!!!! 1!95!SNOW AMOUNT OVR SEAICE AFT TS KG/M2!!505!!!! 1!96!HORIZ BOUNDARY TENDS: UNAVAILABLE !!!500!!! 1!96!OCEAN NR. SURFACE CHLOROPHYLL(KGM-3)!!806!!!! 1!97!HORIZ BOUNDARY VALUES: UNAVAILABLE !!!500!!! 1!98!LOWER BOUNDARY TENDENCIES (OROG) !!!!!! 1!99!METHANE FROM STOCHEM (MMR) !!501!505!!! 1!99!CH4 MEAN MASS MIXING RATIO (STOCHEM)!1!601!707!!! 1!99!BDY LYR W-VARIANCE FOR MIXED PHASE !!1000!!!! 1!100!METHANE FROM STOCHEM (MMR) !!501!505!!! 1!100!O3 MEAN MASS MIXING RATIO (STOCHEM) !1!601!707!!! 1!101!SO2 MASS MIXING RATIO AFTER TSTEP !1!401!!mass_fraction_of_sulfur_dioxide_in_air!! 1!102!DIMETHYL SULPHIDE MIX RAT AFTER TS !1!401!!mass_fraction_of_dimethyl_sulfide_in_air!! 1!103!SO4 AITKEN MODE AEROSOL AFTER TSTEP !1!401!!!! 1!104!SO4 ACCUM. MODE AEROSOL AFTER TSTEP !1!401!!!! 1!105!SO4 DISSOLVED AEROSOL AFTER TSTEP !1!401!!!! 1!106!H2O2 MASS MIXING RATIO AFTER TSTEP !1!401!!!! 1!107!NH3 MASS MIXING RATIO AFTER TSTEP !1!405!!!! 1!108!FRESH SOOT MASS MIX RAT AFTER TSTEP !1!405!!!! 1!109!AGED SOOT MASS MIX RAT AFTER TSTEP !1!405!!!! 1!110!CLOUD SOOT MASS MIX RAT AFTER TSTEP !1!405!!!! 1!111!FRESH BIOMASS SMOKE AFTER TSTEP !!505!!!! 1!112!AGED BIOMASS SMOKE AFTER TSTEP !!505!!!! 1!113!CLOUD BIOMASS SMOKE AFTER TSTEP !!505!!!! 1!114!FRESH OCFF MASS MIX RAT AFTER TSTEP !1!606.2!!!! 1!115!AGED OCFF MASS MIX RAT AFTER TSTEP !1!606.2!!!! 1!116!CLOUD OCFF MASS MIX RAT AFTER TSTEP !1!606.2!!!! 1!117!ACC NITR MASS MIX RAT AFTER TSTEP !1!606.4!606.4!!! 1!117!ACC NITR MASS MIX RAT AFTER TSTEP !1!704!!!! 1!118!DISS NITR MASS MIX RAT AFTER TSTEP !1!606.4!606.4!!! 1!118!DISS NITR MASS MIX RAT AFTER TSTEP !1!704!!!! 1!121!3D NATURAL SO2 EMISSIONS KG/M2/S !kg m-2 s-1!401!!!! 1!122!3D OH CONCENTRATIONS IN MCULES/CC !!401!!!! 1!123!3D HO2 CONCENTRATIONS IN MCULES/CC !!401!!!! 1!124!3D H2O2 MIX RATIO LIMIT FIELD !1!401!!!! 1!125!3D OZONE MIX RAT FOR SULPHUR CYCLE !1!401!!!! 1!126!HIGH LEVEL SO2 EMISSIONS KG/M2/S !1!401!!!! 1!127!AMMONIA GAS EMISSIONS KG/M2/S !!405!!!! 1!128!FRESH SOOT SURF EMISS KG/M2/S !!405!!!! 1!129!FRESH SOOT HI LEV EMISS KG/M2/S !!405!!!! 1!130!FRESH BIOMASS SURF EMISS KG/M2/S !!505!!!! 1!131!FRESH BIOMASS HI LEV EMISS KG/M2/S !!505!!!! 1!132!DMS CONCENTRATION IN SEAWATER !!601!!!! 1!133!DMS OCEAN FLUX KG[S]/M**2/S!!606!!!! 1!134!FRESH OCFF SURF EMISS KG/M2/S !kg m-2 s-1!606.2!606.4!!! 1!134!FRESH OCFF SURF EMISS KG/M2/S !kg m-2 s-1!701!!!! 1!135!FRESH OCFF HI LEV EMISS KG/M2/S !!606.2!!!! 1!136!CONV PROG 1 !!1002!!!! 1!137!CONV PROG 2 !!1002!!!! 1!138!CONV PROG 3 !!1002!!!! 1!139!CONV PROG PRECIP !!1002!!!! 1!150!W COMP OF WIND C-P TH LEVS:VAR DUMMY!!401!407!!! 1!150!W COMPNT OF WIND AFTER TIMESTEP !m s-1!500!!upward_air_velocity!! 1!151!PRESSURE C-P RHO LEVS:VAR DUMMY!!401!407!!! 1!151!RIVER SEQUENCE !!505!!!! 1!152!DENSITY*R*R C-P RHO LEVS:VAR DUMMY!!401!407!!! 1!152!RIVER DIRECTION !!505!!!! 1!153!U COMP OF WIND C-P RHO LEVS:VAR DUM !!401!407!!! 1!153!RIVER WATER STORAGE M2!m2!505!!!! 1!154!V COMP OF WIND C-P RHO LEVS:VAR DUM !!401!407!!! 1!155!ACCUMULATED SURFACE RUNOFF KG/M2!kg m-2!505!!!! 1!156!ACCUMULATED SUB-SURFACE RUNOFF KG/M2!kg m-2!505!!!! 1!157!GRIDBOX AREAS M2!m2!505!!!! 1!160!HADCM2 SULPHATE LOADING PATTERNS !!403!407!!! 1!160!AREA DRAINING (INTEGER) PIXELS!!601!!!! 1!161!SLOPE %!%!601!!!! 1!162!INITIAL FLOW VALUES M3/S!m3 s-1!601!!!! 1!163!X-COORDINATE OF OUTFLOW PIXEL !!601!!!! 1!164!Y-COORDINATE OF OUTFLOW PIXEL !!601!!!! 1!165!LAND-TYPE (RIVER/LAND/SEA) !!601!!!! 1!166!SURFACE STORAGE MM!!601!!!! 1!167!SUB-SURFACE STORAGE MM!!601!!!! 1!168!ACC. SURFACE INFLOW TO A PIXEL MM!!601!!!! 1!169!ACC. SUB-SURFACE INFLOW TO PIXEL MM!!601!!!! 1!171!NET DN SW RAD FLUX:OPEN SEA: CPL !!701!!!! 1!172!NET DWN SFC SW FLUX BLW 690NM: CPL !!701!!!! 1!173!NET DOWN SURFACE LW RAD FLUX: CPL !!701!!!! 1!174!NET DN LW RAD FLUX:OPEN SEA: CPL !!701!!!! 1!176!X-COMP SURF & BL WIND STR: CPL N/M2 !Pa!701!!!! 1!177!Y-COMP SURF & BL WIND STRL CPL N/M2 !Pa!701!!!! 1!178!WIND MIX EN'GY FL TO SEA: CPL W/M2 !W m-2!701!!!! 1!179!SFC SH FLX FROM OPEN SEA: CPL W/M2 !W m-2!701!!!! 1!180!SUBLIM. SURFACE (GBM): CPL KG/M2/TS!!701!1001!!! 1!180!SUBLIM. SURFACE (GBM): CPL KG/M2/S!!1002!!!! 1!181!EVAP FROM OPEN SEA: CPL KG/M2/S !!701!!!! 1!182!SEAICE SUBLIM CAT(GBM): CPL KG/M2/S!!1002!!!! 1!184!Heat flx through sea ice (W/m2): CPL!W m-2!701!!!! 1!185!Heat flx in sea ice surface mlt: CPL!W m-2!701!!!! 1!186!LARGE SCALE RAIN RATE: CPL KG/M2/S!!701!!!! 1!187!LARGE SCALE SNOW RATE: CPL KG/M2/S!!701!!!! 1!188!CONVECTIVE RAIN RATE: CPL KG/M2/S!!701!!!! 1!189!CONVECTIVE SNOW RATE: CPL KG/M2/S!!701!!!! 1!190!ICEBERG CALVING FIELD: CPL KG/M2/S!!806!!!! 1!191!10 METRE WIND SPEED ON C GRID: CPL !!805!!!! 1!192!River Runoff: CPL !!701!!!! 1!193!PRESSURE AT MEAN SEA LEVEL: CPL Pa !!1000!!!! 1!194!SEA SURFACE FREEZING TEMPERATURE: K !!1002!!!! 1!201!PSTAR PERTURBATION- DUMMY !!!!!! 1!202!U COMPNT PERTURBATION- DUMMY !!!!!! 1!203!V COMPNT PERTURBATION- DUMMY !!!!!! 1!204!THETA PERTURBATION- DUMMY !!!!!! 1!205!FRACTIONAL LAND COVER !1!!!land_area_fraction!! 1!206!VAN GENUCHTEN "B" PARAMETER !!401!403!!! 1!207!CLAPP-HORNBERGER "B" COEFFICIENT !!401!!!! 1!208!LEAF AREA INDEX OF VEG FRACTION !1!401!!leaf_area_index!! 1!209!CANOPY HEIGHT OF VEGETATED FRACTION !m!401!!canopy_height!! 1!211!CCA with anvil after timestep !!404!407!!! 1!211!CCA WITH ANVIL AFTER TIMESTEP !!500!!!! 1!212!CCRad : CCW passed to radiation !!606!!!! 1!213!CANOPY CONDUCTANCE AFTER TIMESTEP !!401!!!! 1!214!UNFROZEN SOIL MOISTURE FRAC AFTER TS!1!401!!mass_fraction_of_unfrozen_water_in_soil_moisture!! 1!215!FROZEN SOIL MOISTURE FRAC AFTER TS !1!401!!mass_fraction_of_frozen_water_in_soil_moisture!! 1!216!FRACTIONS OF SURFACE TYPES !!404!!!! 1!217!LEAF AREA INDEX OF PLANT FUNC TYPES !1!404!!leaf_area_index!! 1!218!CANOPY HEIGHT OF PLANT FUNC TYPES M !m!404!!canopy_height!! 1!219!DISTURBED FRACTION OF VEGETATION !!404!!!! 1!220!SNOW-FREE ALBEDO OF SOIL !1!404!!soil_albedo!! 1!221!SNOW SOOT CONTENT !!404!502!!! 1!221!SNOW SOOT CONTENT !!705!!!! 1!222!NET ENERGY CHANGE THIS PERIOD J/M**2!!404!!!! 1!223!SOIL CARBON CONTENT KG C / M2 !kg m-2!404!!soil_carbon_content!! 1!224!ACCUMULATED NPP ON PLANT FUNC TYPES !!404!501!!! 1!224!ACCUMULATED NPP ON PFTS !!502!!!! 1!225!ACCUMULATED LEAF TURNOVER RATE PFTS !!404!!!! 1!226!ACCUMULATED PHENOL LEAF TRNVR PFTS !!404!!!! 1!227!ACCUMULATED WOOD RESPIRATION PFTS !!404!!!! 1!228!ACCUMULATED SOIL RESPIRATION !!404!!!! 1!229!CANOPY WATER ON NON-ICE TILES KG/M2!!404!501!!! 1!229!CANOPY WATER ON TILES KG/M2 !!502!!!! 1!230!CANOPY CAPACITY NON-ICE TILES KG/M2!!404!501!!! 1!230!CANOPY CAPACITY ON TILES KG/M2 !!502!!!! 1!231!SNOW GRAIN SIZE MICRONS!1e-6 m!404!501!snow_grain_size!! 1!231!SNOW GRAIN SIZE ON TILES MICRONS!1e-6 m!502!!snow_grain_size!! 1!232!SNOW TEMPERATURE K!K!404!501!temperature_in_surface_snow!! 1!233!SURFACE TEMPERATURE ON TILES K!!404!404.1!!! 1!233!SURFACE TEMP ON SNOW-ADJSTD TILES K!!405!501!!! 1!233!SURFACE TEMPERATURE ON TILES K!!502!!!! 1!234!ROUGHNESS LENGTH ON TILES M!!404!!!! 1!235!NET MOISTURE FLUX IN PERIOD KG/M**2 !!501!!!! 1!236!TILE MODIFIED INFILTRATION RATE !!502!!!! 1!237!DOWNWARD SW RADIATION ON TILES W/M2!W m-2!502!!!! 1!238!SURFACE DOWNWARD LW RADIATION W/M2!W m-2!502!!!! 1!239!TOA - SURF UPWARD LW RADIATION W/M2!W m-2!502!!!! 1!240!SNOW AMOUNT ON TILES KG/M2!kg m-2!502!!!! 1!241!CANOPY SNOW CAPACITY KG/M2!kg m-2!505!!!! 1!242!SNOW BENEATH CANOPY KG/M2!kg m-2!505!!!! 1!243!OBS/CLIM SNOW-FREE SURF SW ALBEDO !!804!!!! 1!244!OBS/CLIM SNOW-FREE SURF VIS ALBEDO !!804!!!! 1!245!OBS/CLIM SNOW-FREE SURF NIR ALBEDO !!804!!!! 1!246!THERMAL ROUGHNESS LENGTH ON TILES M!m!806!!!! 1!250!CO2 OCEAN FLUX KG/M**2/S!kg m-2 s-1!405!!!! 1!251!CO2 SURFACE EMISSIONS KG/M**2/S!kg m-2 s-1!405!!!! 1!252!CO2 3D TRACER MASS MIXING RATIO!1!405!!mass_fraction_of_carbon_dioxide_in_air!! 1!253!DENSITY*R*R AFTER TIMESTEP !!500!!!! 1!254!QCL AFTER TIMESTEP !1!500!!mass_fraction_of_cloud_liquid_water_in_air!! 1!255!EXNER PRESSURE (RHO) AFTER TIMESTEP !1!500!!dimensionless_exner_function!! 1!256!ADVECTED U CMPT OF WIND AFTER TS !!500!!!! 1!257!ADVECTED V CMPT OF WIND AFTER TS !!500!!!! 1!258!ADVECTED W CMPT OF WIND AFTER TS !!500!!!! 1!259!NUMBER OF TURBULENT MIXING LEVELS !!500!!!! 1!260!LEVEL OF BASE OF DEEP STRATOCUMULUS !!500!!!! 1!261!LEVEL OF TOP OF DEEP STRATOCUMULUS !!500!!!! 1!262!BOUNDARY LAYER CONVECTION FLAG !!500!!!! 1!263!SD TURBULENT FLUC LAYER1 TEMP !!500!!!! 1!264!SD TURBULENT FLUC LAYER1 HUMIDITY !!500!!!! 1!265!AREA CLOUD FRACTION !!500!501!!! 1!265!AREA CLOUD FRACTION IN EACH LAYER !!502!!!! 1!266!BULK CLOUD FRACTION !!500!500!!! 1!266!BULK CLOUD FRACTION IN EACH LAYER !!501!!!! 1!267!LIQUID CLOUD FRACTION !!500!500!!! 1!267!LIQUID CLOUD FRACTION IN EACH LAYER !!501!!!! 1!268!FROZEN CLOUD FRACTION !!500!500!!! 1!268!FROZEN CLOUD FRACTION IN EACH LAYER !!501!!!! 1!269!SURFACE ZONAL CURRENT AFTER TS PGRID!m s-1!500!!surface_eastward_sea_water_velocity!! 1!270!SURFACE MERID CURRENT AFTER TS PGRID!m s-1!500!!surface_northward_sea_water_velocity!! 1!271!CANOPY RESISTANCE TO EVAP ON TILES !!500!501!!! 1!271!CLOUD ICE (CRYSTALS) AFTER TIMESTEP !!505!!!! 1!272!ROOT DEPTH ON TILES !!500!501!!! 1!272!RAIN AFTER TIMESTEP !!505!!!! 1!273!U HORIZONTAL BOUNDARY TENDENCY !!500!501!!! 1!273!GRAUPEL AFTER TIMESTEP !!505!!!! 1!274!V HORIZONTAL BOUNDARY TENDENCY !!500!500!!! 1!274!U HORIZONTAL BOUNDARY VALUE !!501!501!!! 1!274!MEAN TOPOGRAPHIC INDEX !!505!!!! 1!275!W HORIZONTAL BOUNDARY TENDENCY !!500!500!!! 1!275!V HORIZONTAL BOUNDARY TENDENCY !!501!501!!! 1!275!STANDARD DEVN IN TOPOGRAPHIC INDEX !!505!!!! 1!276!DENSITY HORIZONTAL BOUNDARY TENDENCY!!500!500!!! 1!276!V HORIZONTAL BOUNDARY VALUE !!501!501!!! 1!276!EXP DECAY IN SOIL SAT HYD CONDUCTY !!505!!!! 1!277!POTENTIAL TEMP HORIZ BOUND TENDENCY !!500!500!!! 1!277!W HORIZONTAL BOUNDARY TENDENCY !!501!501!!! 1!277!INTEGRATED GAMMA DISTRIBUTION !!505!!!! 1!278!SPECIFIC HUMIDTY HORIZ BOUND TENDNCY!!500!500!!! 1!278!W HORIZONTAL BOUNDARY VALUE !!501!501!!! 1!278!MEAN WATER TABLE DEPTH M !!505!!!! 1!279!QCL HORIZONTAL BOUNDARY TENDENCY !!500!500!!! 1!279!DENSITY HORIZONTAL BOUNDARY TENDENCY!!501!501!!! 1!279!SURFACE SATURATION FRACTION !!505!!!! 1!280!QCF HORIZONTAL BOUNDARY TENDENCY !!500!500!!! 1!280!DENSITY HORIZONTAL BOUNDARY VALUE !!501!501!!! 1!280!SURFACE WETLAND FRACTION !!505!!!! 1!281!EXNER PRESSURE HORIZ BOUND TENDENCY !!500!500!!! 1!281!POTENTIAL TEMP HORIZ BOUND TENDENCY !!501!501!!! 1!281!SATURATION FRAC IN DEEP LAYER !!606!!!! 1!282!U_ADV HORIZONTAL BOUNDARY TENDENCY !!500!500!!! 1!282!POTENTIAL TEMP HORIZ BOUNDARY VALUE !!501!501!!! 1!282!A_FSAT HYDROLOGY FITTING PARAMETER !!606!!!! 1!283!V_ADV HORIZONTAL BOUNDARY TENDENCY !!500!500!!! 1!283!SPECIFIC HUMIDTY HORIZ BOUND TENDNCY!!501!501!!! 1!283!C_FSAT HYDROLOGY FITTING PARAMETER !!606!!!! 1!284!W_ADV HORIZONTAL BOUNDARY TENDENCY !!500!500!!! 1!284!SPECIFIC HUMIDTY HORIZ BOUND VALUE !!501!501!!! 1!284!A_FWET HYDROLOGY FITTING PARAMETER !!606!!!! 1!285!U HORIZONTAL BOUNDARY VALUE !!500!500!!! 1!285!QCL HORIZONTAL BOUNDARY TENDENCY !!501!501!!! 1!285!C_FWET HYDROLOGY FITTING PARAMETER !!606!!!! 1!286!V HORIZONTAL BOUNDARY VALUE !!500!500!!! 1!286!QCL HORIZONTAL BOUNDARY VALUE !!501!501!!! 1!286!OLD DISTD FRACTION OF VEGETATION !!606.2!606.4!!! 1!287!W HORIZONTAL BOUNDARY VALUE !!500!500!!! 1!287!QCF HORIZONTAL BOUNDARY TENDENCY !!501!501!!! 1!287!FAST TURNOVER WOOD PRODUCT KGC/M2!!606.2!606.4!!! 1!288!DENSITY HORIZONTAL BOUNDARY VALUE !!500!500!!! 1!288!QCF HORIZONTAL BOUNDARY VALUE !!501!501!!! 1!288!MEDIUM TURNOVER WOOD PRODUCT KGC/M2!!606.2!606.4!!! 1!289!POTENTIAL TEMP HORIZ BOUNDARY VALUE !!500!500!!! 1!289!EXNER PRESSURE HORIZ BOUND TENDENCY !!501!501!!! 1!289!SLOW TURNOVER WOOD PRODUCT KGC/M2!!606.2!606.4!!! 1!290!SPECIFIC HUMIDTY HORIZ BOUND VALUE !!500!500!!! 1!290!EXNER PRESSURE HORIZ BOUND VALUE !!501!501!!! 1!290!DAILY ACCUMULATED LAKE FLUX KG/M2 !!606.2!606.4!!! 1!290!DAILY ACCUMULATED LAKE FLUX KG/M2 !!705!!!! 1!291!QCL HORIZONTAL BOUNDARY VALUE !!500!500!!! 1!291!U_ADV HORIZONTAL BOUNDARY TENDENCY !!501!501!!! 1!291!LAKE DEPTH (M) !!802!!!! 1!292!QCF HORIZONTAL BOUNDARY VALUE !!500!500!!! 1!292!U_ADV HORIZONTAL BOUNDARY VALUE !!501!501!!! 1!292!LAKE FETCH (M) !!802!!!! 1!293!EXNER PRESSURE HORIZ BOUND VALUE !!500!500!!! 1!293!V_ADV HORIZONTAL BOUNDARY TENDENCY !!501!501!!! 1!293!LAKE MEAN TEMPERATURE (K) !!802!!!! 1!294!U_ADV HORIZONTAL BOUNDARY VALUE !!500!500!!! 1!294!V_ADV HORIZONTAL BOUNDARY VALUE !!501!501!!! 1!294!LAKE MIXED-LAYER TEMPERATURE (K) !!802!!!! 1!295!V_ADV HORIZONTAL BOUNDARY VALUE !!500!500!!! 1!295!W_ADV HORIZONTAL BOUNDARY TENDENCY !!501!501!!! 1!295!LAKE ICE SURFACE TEMPERATURE (K) !!802!!!! 1!296!W_ADV HORIZONTAL BOUNDARY VALUE !!500!501!!! 1!296!LAKE MIXED-LAYER DEPTH (M) !!802!!!! 1!297!ATMOS TRACER HORIZ BOUNDARY TENDENCY!!500!501!!! 1!297!LAKE ICE THICKNESS (M) !!802!!!! 1!298!ATMOS TRACER HORIZ BOUNDARY VALUE !!500!501!!! 1!298!LAKE T PROFILE SHAPE FACTOR !!802!!!! 1!299!LAKE GRD HT FLX / DTEMP (W m-2 K-1)!!804!!!! 1!301!NOx surf emissions !!606.2!606.4!!! 1!302!CH4 surf emissions !!606.2!606.4!!! 1!303!CO surf emissions !!606.2!606.4!!! 1!304!HCHO surf emissions !!606.2!606.4!!! 1!305!C2H6 surf emissions !!606.2!606.4!!! 1!306!C3H8 surf emissions !!606.2!606.4!!! 1!307!ME2CO surf emissions !!606.2!606.4!!! 1!308!MECHO surf emissions !!606.2!606.4!!! 1!321!Climatological biogenic aerosol mmr !1!606.2!606.2!!! 1!340!NOX AIRCRAFT EMS IN KG/S/GRIDCELL !!606.2!606.4!!! 1!341!TROPOPAUSE-BASED OZONE !!503!!!! 1!342!DEEP CONVECTIVE FLAG !!704!!!! 1!343!PAST CONVECTIVE PRECIP KG/M2/S!kg m-2 s-1!704!!!! 1!344!PAST CONVECTIVE DEPTH M!m!704!!!! 1!345!CCA FROM DEEP CONVECTION !!806!!!! 1!346!CCA FROM MID-LEVEL CONVECTION !!806!!!! 1!347!CCA FROM SHALLOW CONVECTION !!806!!!! 1!351!CLIM BIOGENIC AEROSOL MMR !1!606!!!! 1!352!CLIM BIOMASS-BURNING (FRESH) MMR !1!701!!!! 1!353!CLIM BIOMASS-BURNING (AGED) MMR !1!701!!!! 1!354!CLIM BIOMASS-BURNING (IN-CLOUD) MMR !1!701!!!! 1!355!CLIM BLACK CARBON (FRESH) MMR !1!701!!!! 1!356!CLIM BLACK CARBON (AGED) MMR !1!701!!!! 1!357!CLIM SEA SALT (FILM MODE) NPM3 !!701!!!! 1!358!CLIM SEA SALT (JET MODE) NPM3 !!701!!!! 1!359!CLIM SULPHATE (ACCUMULATION MODE)MMR!1!701!!!! 1!360!CLIM SULPHATE (AITKEN MODE) MMR !1!701!!!! 1!361!CLIM SULPHATE (DISSOLVED) MMR !1!701!!!! 1!362!CLIM DUST SIZE DIVISION 1 MMR !1!701!!!! 1!363!CLIM DUST SIZE DIVISION 2 MMR !1!701!!!! 1!364!CLIM DUST SIZE DIVISION 3 MMR !1!701!!!! 1!365!CLIM DUST SIZE DIVISION 4 MMR !1!701!!!! 1!366!CLIM DUST SIZE DIVISION 5 MMR !1!701!!!! 1!367!CLIM DUST SIZE DIVISION 6 MMR !1!701!!!! 1!368!CLIM ORG C FOSSIL FUEL (FRESH) MMR !1!701!!!! 1!369!CLIM ORG C FOSSIL FUEL (AGED) MMR !1!701!!!! 1!370!CLIM ORG C FOSSIL FUEL (IN-CLOUD)MMR!1!701!!!! 1!371!CLIM DELTA AEROSOL MMR !1!701!!!! 1!376!SNOW DEPTH ON GROUND ON TILES (M) !m!706!!!! 1!377!SNOWPACK BULK DENSITY (KG M-3) !kg m-3!706!!!! 1!378!SNOW ON THE CANOPY (KG M-2) !kg m-2!706!!!! 1!379!SURFACE HEAT FLUX UNDER SNOW (W M-2)!!706!!!! 1!380!NUMBER OF SNOW LAYERS ON TILES !!706!!!! 1!381!SNOW LAYER THICKNESSES ON TILES (M) !m!706!!!! 1!382!SNOW LYR ICE MASS ON TILES(KG M-2) !kg m-2!706!!!! 1!383!SNOW LYR LIQUD MASS ON TILES(KG M-2)!kg m-2!706!!!! 1!384!SNOW LAYER TEMPERATURE ON TILES (K) !K!706!!!! 1!385!SNOW LAYER DENSITY ON TILES (KG M-3)!kg m-3!706!!!! 1!386!SNOW LYR GRAIN SIZE ON TILES(MICRON)!micron!706!!!! 1!387!ETADOT AFTER TIMESTEP !!805!!!! 1!388!THETAVD AFTER TIMESTEP !!805!!!! 1!389!DRY RHO AFTER TIMESTEP !!805!!!! 1!390!PSIW SURFACE AFTER TIMESTEP !!805!!!! 1!391!MOISTURE MIXING RATIO mv AFTER TS !!805!806!!! 1!391!VAPOUR MIXING RATIO (mv) AFTER TS !!900!!!! 1!392!MOISTURE MIXING RATIO mcl AFTER TS !!805!806!!! 1!392!CLD LIQ MIXING RATIO (mcl) AFTER TS !!900!!!! 1!393!MOISTURE MIXING RATIO mcf AFTER TS !!805!806!!! 1!393!CLD ICE MIXING RATIO (mcf) AFTER TS !!900!!!! 1!394!MOISTURE MIXING RATIO mr AFTER TS !!805!806!!! 1!394!RAIN MIXING RATIO (mr) AFTER TS !!900!!!! 1!395!MOISTURE MIXING RATIO mgr AFTER TS !!805!806!!! 1!395!GRAUPEL MIXING RATIO (mg) AFTER TS !!900!!!! 1!396!MOISTURE MIXING RATIO mcf2 AFTER TS !!805!806!!! 1!396!ICE CRY MIXING RAT. (mcf2) AFTER TS !!900!!!! 1!397!PSIW LID AFTER TIMESTEP !!805!!!! 1!398!EXNER SURF AFTER TIMESTEP !!805!!!! 1!401!P_EXNER IN D1 FOR ADDRESSING ONLY !!403!407!!! 1!402!QCL IN D1 FOR ADDRESSING ONLY !!403!407!!! 1!403!QCF IN D1 FOR ADDRESSING ONLY !!403!407!!! 1!404!RHCRIT IN D1 FOR ADDRESSING ONLY !!405!502!!! 1!405!SOIL MOISTURE CONTENT IN D1 FOR ADD !!405!407!!! 1!406!EXNER PRESSURE AT THETA LEVELS !1!500!!dimensionless_exner_function!! 1!407!PRESSURE AT RHO LEVELS AFTER TS !Pa!500!!air_pressure!! 1!408!PRESSURE AT THETA LEVELS AFTER TS !Pa!500!!air_pressure!! 1!409!SURFACE PRESSURE AFTER TIMESTEP !Pa!500!!surface_air_pressure!! 1!410!SW RADIATION INCREMENTS AFTER TS !!500!!!! 1!411!LW RADIATION INCREMENTS AFTER TS !!500!!!! 1!412!FRACTION OF SURFACE TYPE AFTER TS !!500!!!! 1!413!Sea ice concentration by categories !!505!!!! 1!414!Sea ice thickness GBM by categories !!505!!!! 1!415!Sea ice surf temp by categories (K) !!505!!!! 1!416!Sea ice snow depth by categories !!505!!!! 1!418!Dust parent soil clay fraction (anc)!!505!!!! 1!419!Dust parent soil silt fraction (anc)!!505!!!! 1!420!Dust parent soil sand fraction (anc)!!505!!!! 1!421!Dust soil mass fraction div 1 (anc) !!505!!!! 1!422!Dust soil mass fraction div 2 (anc) !!505!!!! 1!423!Dust soil mass fraction div 3 (anc) !!505!!!! 1!424!Dust soil mass fraction div 4 (anc) !!505!!!! 1!425!Dust soil mass fraction div 5 (anc) !!505!!!! 1!426!Dust soil mass fraction div 6 (anc) !!505!!!! 1!428!Sea ice meltpond fraction by cats !!1002!!!! 1!429!Sea ice meltpond depth by cats (m) !!1002!!!! 1!431!Dust division 1 mass mixing ratio !1!505!!!! 1!432!Dust division 2 mass mixing ratio !1!505!!!! 1!433!Dust division 3 mass mixing ratio !1!505!!!! 1!434!Dust division 4 mass mixing ratio !1!505!!!! 1!435!Dust division 5 mass mixing ratio !1!505!!!! 1!436!Dust division 6 mass mixing ratio !1!505!!!! 1!440!Seaice surf layer cond (cat)(W/m2/K)!W m-2 K-1!1002!!!! 1!441!Seaice surface temperature (cat) (K)!K!1002!!!! 1!460!PAR increments after timestep !!606!606!!! 1!460!DIRECT COMPONENT OF PAR !!606.2!606.4!!! 1!460!PAR increments after timestep !!701!!!! 1!466!DPM SOIL CARBON POOL KG C / M2 !kg m-2!606!!!! 1!467!RPM SOIL CARBON POOL KG C / M2 !kg m-2!606!!!! 1!468!BIO SOIL CARBON POOL KG C / M2 !kg m-2!606!!!! 1!469!HUM SOIL CARBON POOL KG C / M2 !kg m-2!606!!!! 1!470!ACCUMULATED DPM SOIL RESP !!606!!!! 1!471!ACCUMULATED RPM SOIL RESP !!606!!!! 1!472!ACCUMULATED BIO SOIL RESP !!606!!!! 1!473!ACCUMULATED HUM SOIL RESP !!606!!!! 1!480!PROGNOSTIC OZONE TRACER !!701!!!! 1!481!CARIOLLE PROD-LOSS (P-L) !!701!!!! 1!482!CARIOLLE O3 P-L WRT O3 MIX RATIO !!701!!!! 1!483!CARIOLLE O3 VOL MIXING RATIO !!701!!!! 1!484!CARIOLLE O3 P-L WRT TEMP !!701!!!! 1!485!CARIOLLE O3 CLIM TEMP !!701!!!! 1!486!CARIOLLE O3 P-L WRT O3 ABOVE PL !!701!!!! 1!487!CARIOLLE O3 COLUMN ABOVE PL !!701!!!! 1!490!DECOUPLED SCREEN TEMP ON TILES K!K!705!!!! 1!491!DECOUPLED SCREEN TEMP ON SEA/ICE K!K!705!!!! 1!492!TIME SINCE TRANSITION S!S!705!!!! 1!493!CONVECTIVE DOWNDRAUGHT AT CLD BASE !!705!!!! 1!494!URBAN BUILDING HEIGHT !!706!!!! 1!495!URBAN HEIGHT TO WIDTH RATIO !!706!!!! 1!496!URBAN WIDTH RATIO !!706!!!! 1!497!URBAN DISPLACEMENT HEIGHT !!706!!!! 1!498!URBAN ZTM !!706!!!! 1!499!URBAN WALL ALBEDO !!706!!!! 1!500!URBAN ROAD ALBEDO !!706!!!! 1!501!URBAN WALL EMISSIVITY !!706!!!! 1!502!URBAN ROAD EMISSIVITY !!706!!!! 1!505!Land fraction in grid box !1!503!!land_area_fraction!! 1!506!LAND SURFACE TEMP AFTER TIMESTEP !K!503!!surface_temperature!where_land! 1!507!OPEN SEA SURFACE TEMP AFTER TIMESTEP!K!503!!surface_temperature!where_open_sea! 1!508!SEA-ICE SURFACE TEMP AFTER TIMESTEP !K!503!!surface_temperature!where_sea_ice! 1!509!SEA ICE ALBEDO AFTER TS !1!503!!sea_ice_albedo!! 1!510!MEAN LAND ALBEDO AFTER TS !1!503!!!! 1!511!INLANDBASINFLOW ATM GRID KG/M2/S !kg m-2 s-1!606!!!! 1!1004!TEMPERATURE AFTER SW RAD INCREMENTS !K!!!air_temperature!! 1!1101!HORIZON ANGLE 1 (N) !!708!!!! 1!1102!HORIZON ANGLE 2 (NE) !!708!!!! 1!1103!HORIZON ANGLE 3 (E) !!708!!!! 1!1104!HORIZON ANGLE 4 (SE) !!708!!!! 1!1105!HORIZON ANGLE 5 (S) !!708!!!! 1!1106!HORIZON ANGLE 6 (SW) !!708!!!! 1!1107!HORIZON ANGLE 7 (W) !!708!!!! 1!1108!HORIZON ANGLE 8 (NW) !!708!!!! 1!1109!HORIZON ANGLE 9 (NNE) !!708!!!! 1!1110!HORIZON ANGLE 10 (ENE) !!708!!!! 1!1111!HORIZON ANGLE 11 (ESE) !!708!!!! 1!1112!HORIZON ANGLE 12 (SSE) !!708!!!! 1!1113!HORIZON ANGLE 13 (SSW) !!708!!!! 1!1114!HORIZON ANGLE 14 (WSW) !!708!!!! 1!1115!HORIZON ANGLE 15 (WNW) !!708!!!! 1!1116!HORIZON ANGLE 16 (NNW) !!708!!!! 1!1161!TEMPERATURE INCR: swrad - pc2 !!505!1000!!! 1!1161!TEMPERATURE INCR: swrad MINUS LH PC2!!1001!!!! 1!1181!TEMPERATURE INCR: swrad scheme!!501!!!! 1!1182!SPECIFIC HUMIDITY INCR: swrad scheme!!505!!!! 1!1183!QCL INCR: swrad scheme!!505!!!! 1!1192!BULK CLOUD VOL INCR: swrad scheme!!505!!!! 1!1193!LIQUID CLOUD VOL INCR: swrad scheme!!505!!!! 1!1194!QCL INCR: swrad positive !!706!!!! 1!1195!QCL INCR: swrad negative !!706!!!! 1!1198!LIQ CLOUD VOL INCR: swrad positive !!706!!!! 1!1199!LIQ CLOUD VOL INCR: swrad negative !!706!!!! 1!1201!NET DOWN SURFACE SW FLUX: SW TS ONLY!W m-2!!!surface_net_downward_shortwave_flux!! 1!1202!NET DOWN SW FLUX: SOLID SURF: ALL TS!!!407!!! 1!1202!NET DOWN SURFACE SW FLUX : CORRECTED!!704!!!! 1!1203!NET DOWN SW RAD FLUX: OPEN SEA !W m-2!!407!surface_net_downward_shortwave_flux!where_open_sea! 1!1203!NET DOWN SW RAD FLUX: OPEN SEA !!501!502!!! 1!1203!NET DN SW RAD FLUX:OPEN SEA:SEA MEAN!W m-2!503!!surface_net_downward_shortwave_flux!where_open_sea! 1!1204!NET DOWN SW RAD FLUX:OPEN SEA:BAND 1!!!400.2!!! 1!1204!NET DOWN SURFACE SW FLUX BELOW 690NM!!401!407!!! 1!1204!NET DOWN SURFACE SW FLUX BELOW 690NM!!501!!!! 1!1205!SNOW-FREE SURFACE ALBEDO (ANCILLARY)!!!407!!! 1!1205!OUTGOING SW RAD FLUX (TOA):CORRECTED!W m-2!704!!toa_outgoing_shortwave_flux!! 1!1206!DEEP SNOW SURFACE ALBEDO (ANCILLARY)!!!407!!! 1!1207!INCOMING SW RAD FLUX (TOA): ALL TSS !W m-2!!!toa_incoming_shortwave_flux!! 1!1208!OUTGOING SW RAD FLUX (TOA) !W m-2!!407!toa_outgoing_shortwave_flux!! 1!1208!OUTGOING SW RAD FLUX (TOA) !!501!!!! 1!1209!CLEAR-SKY (II) UPWARD SW FLUX (TOA) !W m-2!!!toa_outgoing_shortwave_flux_assuming_clear_sky!! 1!1210!CLEAR-SKY (II) DOWN SURFACE SW FLUX !W m-2!!!surface_downwelling_shortwave_flux_in_air_assuming_clear_sky!! 1!1211!CLEAR-SKY (II) UP SURFACE SW FLUX !W m-2!!!surface_upwelling_shortwave_flux_in_air_assuming_clear_sky!! 1!1212!LAYER CLOUD WEIGHTS IN SWRAD !!!407!!! 1!1212!DIRECT UV FLUX !!606!1000!!! 1!1212!DIRECT UV FLUX ON LEVELS !!1001!!!! 1!1213!CONVECTIVE CLOUD WEIGHTS IN SWRAD !!!407!!! 1!1213!UPWARDS UV FLUX !!606!1000!!! 1!1213!UPWARDS UV FLUX ON LEVELS !!1001!!!! 1!1214!LAYER CLOUD DIRECT ALBEDO * AMOUNT !!!407!!! 1!1214!NET UV FLUX !!606!1000!!! 1!1214!DOWNWARDS UV FLUX ON LEVELS !!1001!!!! 1!1215!LAYER CLOUD DIFFUSE ALBEDO * AMOUNT !!!407!!! 1!1215!DIRECT SURFACE SW FLUX : CORRECTED !!704!!!! 1!1216!CONV CLOUD DIRECT ALBEDO * AMOUNT !!!407!!! 1!1216!DIFFUSE SURFACE SW FLUX : CORRECTED !!704!!!! 1!1217!CONV CLOUD DIFFUSE ALBEDO * AMOUNT !!!407!!! 1!1217!SW UPWARD FLUX ON RHO LEVELS !!606.3!606.4!!! 1!1217!UPWARD SW FLUX ON LEVELS !!804!!!! 1!1218!LAYER CLOUD REDUCED TO 3 LAYERS - SW!!!407!!! 1!1218!SW DOWNWARD FLUX ON RHO LEVELS !!606.3!606.4!!! 1!1218!DOWNWARD SW FLUX ON LEVELS !!804!!!! 1!1219!TOTAL CLOUD AMOUNT IN SW RADIATION !!!407!!! 1!1219!CLEAR SW UPWARD FLUX ON RHO LEVELS !!606.3!606.4!!! 1!1219!CLEAR-SKY UPWARD SW FLUX ON LEVELS !!804!!!! 1!1220!CONV CLD LIQ RE * CONV CLD AMOUNT !!!407!!! 1!1220!CLEAR SW DOWNWARD FLUX ON RHO LEVELS!!606.3!606.4!!! 1!1220!CLEAR-SKY DOWNWARD SW FLUX ON LEVELS!!804!!!! 1!1221!LAYER CLD LIQ RE * LAYER CLD AMOUNT !!!407!!! 1!1221!LAYER CLD LIQ RE * LAYER CLD WEIGHT !!502!!!! 1!1222!CONV CLD AMT IN SWRAD (MICROPHYSICS)!!!407!!! 1!1223!LYR CLD AMT IN SWRAD (MICROPHYSICS) !!!407!!! 1!1223!LAYER CLOUD WEIGHT FOR MICROPHYSICS !!502!!!! 1!1224!LAYER CLD CONDENSED WATER PATH * AMT!!!407!!! 1!1224!LAYER CLD LIQUID WATER PATH * WEIGHT!!502!!!! 1!1225!CONV CLD LIQ RE * CONV CLD WEIGHT !!!407!!! 1!1225!CONV CLOUD LIQ RE * CONV CLD WEIGHT !!502!!!! 1!1226!CONV CLD WGT IN SWRAD (MPHY ALL LYR)!!!407!!! 1!1226!CONV CLOUD WEIGHT FOR MICROPHYSICS !!502!!!! 1!1230!DIRECT SW FLUX (ON RHO LEVELS) !!606!606.4!!! 1!1230!DIRECT FLUX !!701!1000!!! 1!1230!DIRECT SW FLUX ON LEVELS !!1001!!!! 1!1231!DIFFUSE SW FLUX (ON RHO LEVELS) !!606!606.4!!! 1!1231!DIFFUSE FLUX !!701!1000!!! 1!1231!DIFFUSE SW FLUX ON LEVELS !!1001!!!! 1!1232!SW HEATING RATES: ALL TIMESTEPS !K s-1!!407!tendency_of_air_temperature_due_to_shortwave_heating!! 1!1232!SW HEATING RATES: ALL TIMESTEPS !!502!!!! 1!1233!CLEAR-SKY SW HEATING RATES !K s-1!!407!tendency_of_air_temperature_due_to_shortwave_heating_assuming_clear_sky!! 1!1233!CLEAR-SKY SW HEATING RATES !!502!!!! 1!1234!HADCM2 SULPHATE LOADING (KG/M2) !kg m-2!403!407!!! 1!1235!TOTAL DOWNWARD SURFACE SW FLUX !W m-2!!!surface_downwelling_shortwave_flux_in_air!! 1!1236!HADCM2 SULPHATE FORCING (W/M2) !W m-2!403!407!!! 1!1237!NET DOWNWARD SW FLUX AT THE TROP. !W m-2!404!407!tropopause_net_downward_shortwave_flux!! 1!1237!NET DOWNWARD SW FLUX AT THE TROP. !!502!!!! 1!1238!UPWARD SW FLUX AT THE TROP. !W m-2!404!407!tropopause_upwelling_shortwave_flux!! 1!1238!UPWARD SW FLUX AT THE TROP. !!502!!!! 1!1241!DROPLET NUMBER CONC * CLOUD AMOUNT !!404!407!!! 1!1241!DROPLET NUMBER CONC * LYR CLOUD WGT !!502!!!! 1!1242!LAYER CLOUD LWC * CLOUD AMOUNT !!404!407!!! 1!1242!LAYER CLOUD LWC * LAYER CLOUD WEIGHT!!502!!!! 1!1243!SO4 CCN MASS CONC * COND SAMP WEIGHT!!404!407!!! 1!1243!SO4 CCN KG/M3 * COND SAMPLING WEIGHT!!502!!!! 1!1244!CONDITIONAL SAMPLING WEIGHT !!404!407!!! 1!1244!CONDITIONAL SAMPLING WEIGHT !!502!!!! 1!1245!2-D EFFECTIVE RADIUS * 2-D RE WEIGHT!!404!407!!! 1!1245!2-D RE DISTRIBUTION * 2-D RE WEIGHT !!502!!!! 1!1246!WEIGHT FOR 2-D EFFECTIVE RADIUS !!404!407!!! 1!1246!WEIGHT FOR 2-D RE DISTRIBUTION !!502!!!! 1!1247!FILM-MODE SEA-SALT AEROSOL NUMBER !!502!!!! 1!1248!JET-MODE SEA-SALT AEROSOL NUMBER !!502!!!! 1!1254!2-D RE * WEIGHT - WARM CLOUDS ONLY !!505!!!! 1!1255!WEIGHT FOR WARM CLOUD 2-D RE !!505!!!! 1!1257!NET DOWN SW FLUX: LAND !!503!!!! 1!1258!NET DN SW FLX:SEAICE:SEA MEAN !!503!!!! 1!1259!NET DN SW SOLID SFC FLUX BELOW 690NM!!503!!!! 1!1260!NET DN SW O SEA FLX BLW 690NM:SEA MN!!503!!!! 1!1262!WEIGHTED SW CLOUD EXTINCTION !!505!!!! 1!1263!WEIGHTS FOR CLOUD SW EXTINCTION !!505!!!! 1!1264!WEIGHTED SW LAYER CLOUD EXTINCTION !!505!!!! 1!1265!WEIGHTS FOR LAYER CLD SW EXTINCTION !!505!!!! 1!1266!WEIGHTED SW CONV. CLOUD EXTINCTION !!505!!!! 1!1267!WEIGHTS FOR CONV.CLD SW EXTINCTION !!505!!!! 1!1268!DIRECT SURFACE ALBEDO ON SW BANDS !!804!!!! 1!1269!DIFFUSE SURFACE ALBEDO ON SW BANDS !!804!!!! 1!1270!VIS ALBEDO SCALING TO OBS ON TILES !!804!!!! 1!1271!NIR ALBEDO SCALING TO OBS ON TILES !!804!!!! 1!1280!COLUMN-INTEGRATED Nd * SAMP. WEIGHT !!505!!!! 1!1281!SAMP. WEIGHT FOR COL. INT. Nd !!505!!!! 1!1288!DOWNWARD SURFACE UV FLUX !!804!!!! 1!1289!CLEAR-SKY DOWNWARD SURFACE UV FLUX !!804!!!! 1!1290!TOTAL DOWNWARD PAR FLUX AT SURFACE !!606!!!! 1!1291!DIRECT COMPONENT OF SURF PAR FLUX !!606!!!! 1!1292!MEAN SOLAR BEARING OVER RAD TS !!606!!!! 1!1293!SLOPE ASPECT !!606!!!! 1!1294!SLOPE ANGLE !!606!!!! 1!1295!OROG CORR FACTOR TO DIRECT SURF SW !!606!!!! 1!1296!EXTRA SW SURF FLUX AFTER OROG CORR !!606!!!! 1!1408!OUTGOING SW RAD FORCING (TOA) !!606!!!! 1!1409!CLEAR-SKY (II) UPWARD SW FORC.(TOA) !!606!!!! 1!1410!CLEAR-SKY (II) DOWN SURF. SW FORC. !W m-2!606!!surface_downwelling_shortwave_flux_in_air_assuming_clear_sky!! 1!1411!CLEAR-SKY (II) UP SURF. SW FORC. !!606!!!! 1!1417!SW UPWARD FORCING ON RHO LEVELS !!606.3!606.4!!! 1!1418!SW DOWNWARD FORCING ON RHO LEVELS !!606.3!606.4!!! 1!1419!CLEAR SW UPWARD FORCNG ON RHO LEVELS!!606.3!606.4!!! 1!1420!CLEAR SW DOWNWARD FORC ON RHO LEVELS!!606.3!606.4!!! 1!1433!CLEAR-SKY SW HEATING RATES (FORC.) !!606!!!! 1!1435!TOTAL DOWNWARD SURF. SW FORCING !W m-2!606!!surface_downwelling_shortwave_flux_in_air!! 1!1437!NET DOWNWARD SW FORC. AT THE TROP. !!606!!!! 1!1438!UPWARD SW FORC. AT THE TROP. !!606!!!! 1!2004!TEMPERATURE AFTER LW RAD INCREMENTS !K!!!air_temperature!! 1!2101!SKYVIEW FACTOR !!708!!!! 1!2161!TEMPERATURE INCR: lwrad - pc2 !!505!1000!!! 1!2161!TEMPERATURE INCR: lwrad MINUS LH PC2!!1001!!!! 1!2181!TEMPERATURE INCR: lwrad scheme!!501!!!! 1!2182!SPECIFIC HUMIDITY INCR: lwrad scheme!!505!!!! 1!2183!QCL INCR: lwrad scheme!!505!!!! 1!2192!BULK CLOUD VOL INCR: lwrad scheme!!505!!!! 1!2193!LIQUID CLOUD VOL INCR: lwrad scheme!!505!!!! 1!2194!QCL INCR: lwrad positive !!706!!!! 1!2195!QCL INCR: lwrad negative !!706!!!! 1!2198!LIQ CLOUD VOL INCR: lwrad positive !!706!!!! 1!2199!LIQ CLOUD VOL INCR: lwrad negative !!706!!!! 1!2201!NET DOWN SURFACE LW RAD FLUX !W m-2!!!surface_net_downward_longwave_flux!! 1!2202!NET DOWN LW RAD FLUX: SOLID SURFACE !!!407!!! 1!2203!NET DOWN LW RAD FLUX: OPEN SEA !W m-2!!407!surface_net_downward_longwave_flux!where_open_sea! 1!2203!NET DOWN LW RAD FLUX: OPEN SEA !!501!502!!! 1!2203!NET DN LW RAD FLUX:OPEN SEA:SEA MEAN!W m-2!503!!surface_net_downward_longwave_flux!where_open_sea! 1!2204!TOTAL CLOUD AMOUNT IN LW RADIATION !1!!!cloud_area_fraction!! 1!2205!OUTGOING LW RAD FLUX (TOA) !W m-2!!!toa_outgoing_longwave_flux!! 1!2206!CLEAR-SKY (II) UPWARD LW FLUX (TOA) !W m-2!!!toa_outgoing_longwave_flux_assuming_clear_sky!! 1!2207!DOWNWARD LW RAD FLUX: SURFACE !W m-2!!407!surface_downwelling_longwave_flux_in_air!! 1!2207!DOWNWARD LW RAD FLUX: SURFACE !!501!!!! 1!2208!CLEAR-SKY (II) DOWN SURFACE LW FLUX !W m-2!!407!surface_downwelling_longwave_flux_in_air_assuming_clear_sky!! 1!2208!CLEAR-SKY (II) DOWN SURFACE LW FLUX !!501!!!! 1!2217!LW UPWARD FLUX ON RHO LEVELS !!606.3!606.4!!! 1!2217!UPWARD LW FLUX ON LEVELS !!804!!!! 1!2218!LW DOWNWARD FLUX ON RHO LEVELS !!606.3!606.4!!! 1!2218!DOWNWARD LW FLUX ON LEVELS !!804!!!! 1!2219!CLEAR LW UPWARD FLUX ON RHO LEVELS !!606.3!606.4!!! 1!2219!CLEAR-SKY UPWARD LW FLUX ON LEVELS !!804!!!! 1!2220!CLEAR LW DOWNWARD FLUX ON RHO LEVELS!!606.3!606.4!!! 1!2220!CLEAR-SKY DOWNWARD LW FLUX ON LEVELS!!804!!!! 1!2232!LW HEATING RATES !K s-1!!!tendency_of_air_temperature_due_to_longwave_heating!! 1!2233!CLEAR-SKY LW HEATING RATES !K s-1!!407!tendency_of_air_temperature_due_to_longwave_heating_assuming_clear_sky!! 1!2233!CLEAR-SKY LW HEATING RATES !!502!!!! 1!2237!NET DOWNWARD LW FLUX AT THE TROP. !W m-2!404!407!tropopause_net_downward_longwave_flux!! 1!2237!NET DOWNWARD LW FLUX AT THE TROP. !!502!!!! 1!2238!TOTAL DOWNWARD LW FLUX AT THE TROP. !W m-2!404!407!tropopause_downwelling_longwave_flux!! 1!2238!TOTAL DOWNWARD LW FLUX AT THE TROP. !!502!!!! 1!2251!AITKEN MODE (SOLUBLE) STRATO AOD !!806!!!! 1!2252!ACCUM MODE (SOLUBLE) STRATO AOD !!806!!!! 1!2253!COARSE MODE (SOLUBLE) STRATO AOD !!806!!!! 1!2254!AITKEN MODE (INSOL) STRATO AOD !!806!!!! 1!2255!ACCUM MODE (INSOL) STRATO AOD !!806!!!! 1!2256!COARSE MODE (INSOL) STRATO AOD !!806!!!! 1!2260!OZONE MASS MIXING RATIO AFTER LW !1!502!!mass_fraction_of_ozone_in_air!! 1!2261!TOTAL CLOUD AMOUNT ON LEVELS !1!505!!cloud_area_fraction_in_atmosphere_layer!! 1!2262!WEIGHTED CLOUD ABSORPTIVITY !!505!!!! 1!2263!WEIGHTS FOR CLOUD ABSORPTIVITY !!505!!!! 1!2264!WEIGHTED LAYER CLOUD ABSORPTIVITY !!505!!!! 1!2265!WEIGHTS FOR LAYER CLD ABSORPTIVITY !!505!!!! 1!2266!WEIGHTED CONV.CLOUD ABSORPTIVITY !!505!!!! 1!2267!WEIGHTS FOR CONV.CLOUD ABSORPTIVITY !!505!!!! 1!2269!ISCCP CLOUD WEIGHTS !!505!!!! 1!2270!ISCCP CLOUD 0.3 <= tau !!505!!!! 1!2271!ISCCP CLOUD tau < 0.3 !!505!!!! 1!2272!ISCCP CLOUD 0.3 <= tau < 1.3 !!505!!!! 1!2273!ISCCP CLOUD 1.3 <= tau < 3.6 !!505!!!! 1!2274!ISCCP CLOUD 3.6 <= tau < 9.4 !!505!!!! 1!2275!ISCCP CLOUD 9.4 <= tau < 23.0 !!505!!!! 1!2276!ISCCP CLOUD 23.0 <= tau < 60.0 !!505!!!! 1!2277!ISCCP CLOUD 60.0 <= tau !!505!!!! 1!2280!Ozone Tropopause Index !!505!!!! 1!2281!Ozone Tropopause Height !!505!!!! 1!2282!Thermal Tropopause Index !!505!!!! 1!2283!Thermal Tropopause Height !!505!!!! 1!2284!SULPHATE OPTICAL DEPTH !!606!708!!! 1!2284!SULPHATE OPTICAL DEPTH IN RADIATION !!802!!!! 1!2285!MINERAL DUST OPTICAL DEPTH !!606!708!!! 1!2285!MINERAL DUST OPTICAL DEPTH IN RADN. !!802!!!! 1!2286!SEA SALT OPTICAL DEPTH !!606!708!!! 1!2286!SEA SALT OPTICAL DEPTH IN RADIATION !!802!!!! 1!2287!SOOT OPTICAL DEPTH !!606!708!!! 1!2287!SOOT OPTICAL DEPTH IN RADIATION !!802!!!! 1!2288!BIOMASS OPTICAL DEPTH !!606!708!!! 1!2288!BIOMASS OPTICAL DEPTH IN RADIATION !!802!!!! 1!2289!BIOGENIC OPTICAL DEPTH !!606!708!!! 1!2289!BIOGENIC OPTICAL DEPTH IN RADIATION !!802!!!! 1!2290!WEIGHTED ISCCP CLOUD ALBEDO !!606!!!! 1!2291!WEIGHTED ISCCP CLOUD OPTICAL DEPTH !!601!!!! 1!2292!WEIGHTED ISCCP CLOUD TOP PRESSURE !!601!!!! 1!2293!WEIGHTED ISCCP TOTAL CLOUD AREA !!601!!!! 1!2295!FOSSIL FUEL ORG CARBON OPTIC DEPTH !!606.2!708!!! 1!2295!FOSSIL FUEL ORG C OPTIC DEPTH IN RAD!!802!!!! 1!2296!DELTA AEROSOL OPTICAL DEPTH !!701!708!!! 1!2296!DELTA AEROSOL OPTICAL DEPTH IN RADN.!!802!!!! 1!2297!AMMONIUM NITRATE OPTICAL DEPTH !!606.4!606.4!!! 1!2297!AMMONIUM NITRATE OPTICAL DEPTH !!704!708!!! 1!2297!AMMONIUM NITRATE OPTICAL DEPTH RADN.!!802!!!! 1!2298!TOTAL OPTICAL DEPTH IN RADIATION !!802!!!! 1!2299!ANGSTROM FROM TOTAL AOD IN RADIATION!!802!!!! 1!2300!AITKEN MODE (SOLUBLE) OPTICAL DEPTH !!708!!!! 1!2301!ACCUM MODE (SOLUBLE) OPTICAL DEPTH !!708!!!! 1!2302!COARSE MODE (SOLUBLE) OPTICAL DEPTH !!708!!!! 1!2303!AITKEN MODE (INSOL) OPTICAL DEPTH !!708!!!! 1!2304!ACCUM MODE (INSOL) OPTICAL DEPTH !!708!!!! 1!2305!COARSE MODE (INSOL) OPTICAL DEPTH !!708!!!! 1!2308!GRIDBOX LSC Qcl IN RADIATION KG/KG!1!606!!!! 1!2309!GRIDBOX LSC Qcf IN RADIATION KG/KG!1!606!!!! 1!2310!GRIDBOX CNV Qcl IN RADIATION KG/KG!1!606!!!! 1!2311!GRIDBOX CNV Qcf IN RADIATION KG/KG!1!606!!!! 1!2312!GRIDBOX LIQ LSC CF IN RADIATION !!606!!!! 1!2313!GRIDBOX ICE LSC CF IN RADIATION !!606!!!! 1!2314!GRIDBOX LIQ CCA IN RADIATION !!606!!!! 1!2315!GRIDBOX ICE CCA IN RADIATION !!606!!!! 1!2320!COSP: MASK FOR 2.343,2.349,2.374 !!802!!!! 1!2321!COSP: MASK FOR 2.344 !!802!!!! 1!2322!COSP: MASK FOR 2.345 !!802!!!! 1!2323!COSP: MASK FOR 2.346 !!802!!!! 1!2324!COSP: MASK FOR 2.347 !!802!!!! 1!2325!COSP: MASK FOR 2.371 !!802!!!! 1!2330!COSP: ISCCP/MISR/MODIS CLOUD WEIGHTS!!802!!!! 1!2331!COSP: ISCCP WEIGHTED CLOUD ALBEDO !!802!!!! 1!2332!COSP: ISCCP WEIGHTED CLOUD TAU !!802!!!! 1!2333!COSP: ISCCP WEIGHTED CLOUD TOP PRES.!!802!!!! 1!2334!COSP: ISCCP TOTAL CLOUD AREA !!802!!!! 1!2335!COSP: ISCCP ALL-SKY 10.5 MICRON Tb !!802!!!! 1!2336!COSP: ISCCP CLEAR-SKY 10.5 MICRON Tb!!802!!!! 1!2337!COSP: ISCCP CTP-TAU HISTOGRAM !!802!!!! 1!2340!COSP: CALIPSO MOLECULAR BACKSCATTER !!802!!!! 1!2341!COSP: CALIPSO TOTAL BACKSCATTER !!802!!!! 1!2342!COSP: CALIPSO CFAD SCATTERING RATIO !!802!!!! 1!2343!COSP: CALIPSO CLOUD AREA ON LEVELS !!802!!!! 1!2344!COSP: CALIPSO LOW-LEVEL CLOUD !!802!!!! 1!2345!COSP: CALIPSO MID-LEVEL CLOUD !!802!!!! 1!2346!COSP: CALIPSO HIGH-LEVEL CLOUD !!802!!!! 1!2347!COSP: CALIPSO TOTAL CLOUD FRACTION !!802!!!! 1!2348!COSP: PARASOL TOA REFLECTANCE !!802!!!! 1!2349!COSP: CALIPSO-ONLY 3D CLOUD AREA !!802!!!! 1!2350!COSP: CLOUDSAT CFAD REFLECTIVITY !!802!!!! 1!2351!COSP: CLOUDSAT REFLECTIVITY !!802!!!! 1!2352!COSP: SUBCOLUMN CLOUD ARRAY !!802!!!! 1!2353!COSP: GBX-MEAN CSAT Ze MDL LEVELS !!802!!!! 1!2354!COSP: GBX-MEAN CSAT Ze 40 LEVELS !!802!!!! 1!2355!COSP: GBX-MEAN CALIPSO ATB MDL LVLS !!802!!!! 1!2356!COSP: GBX-MEAN CALIPSO ATB 40 LVLS !!802!!!! 1!2360!COSP: MISR CTH-TAU HISTOGRAM !!802!!!! 1!2370!COSP: CALIPSO CFAD SR 40 CSAT LEVELS!!802!!!! 1!2371!COSP: CALIPSO CLOUD AREA 40 CSAT LVS!!802!!!! 1!2372!COSP: CLOUDSAT CFAD Ze 40 CSAT LVLS !!802!!!! 1!2373!COSP: HYDROMETEOR EFFECTIVE RADIUS !!802!!!! 1!2374!COSP: CALIPSO-ONLY 3D CLOUD 40 LVLS !!802!!!! 1!2375!COSP: LARGE-SCALE CLOUD OPT. DEPTH !!802!!!! 1!2376!COSP: LARGE-SCALE CLOUD EMISSIVITY !!802!!!! 1!2377!COSP: CONVECTIVE CLOUD OPT. DEPTH !!802!!!! 1!2378!COSP: CONVECTIVE CLOUD EMISSIVITY !!802!!!! 1!2380!COSP: Reff L-S CLOUD LIQUID WATER !!802!!!! 1!2381!COSP: Reff L-S CLOUD ICE !!802!!!! 1!2382!COSP: Reff L-S CLOUD RAINFALL !!802!!!! 1!2383!COSP: Reff L-S CLOUD SNOWFALL !!802!!!! 1!2384!COSP: Reff CONV CLOUD LIQUID WATER !!802!!!! 1!2385!COSP: Reff CONV CLOUD ICE !!802!!!! 1!2386!COSP: Reff CONV CLOUD RAINFALL !!802!!!! 1!2387!COSP: Reff CONV CLOUD SNOWFALL !!802!!!! 1!2388!COSP: Reff L-S CLOUD GRAUPEL !!802!!!! 1!2389!COSP: 3D CONVECTIVE RAINFALL RATE !!802!!!! 1!2390!COSP: 3D CONVECTIVE SNOWFALL RATE !!802!!!! 1!2406!CLEAR-SKY (II) UPWARD LW FORC.(TOA) !!606!!!! 1!2407!DOWNWARD LW RAD FORCING: SURFACE !!606!!!! 1!2408!CLEAR-SKY (II) DOWN SURF. LW FORC. !!606!!!! 1!2417!LW UPWARD FORCING ON RHO LEVELS !!606.3!606.4!!! 1!2418!LW DOWNWARD FORCING ON RHO LEVELS !!606.3!606.4!!! 1!2419!CLEAR LW UPWARD FORCNG ON RHO LEVELS!!606.3!606.4!!! 1!2420!CLEAR LW DOWNWARD FORC ON RHO LEVELS!!606.3!606.4!!! 1!2421!SULPHATE OPTICAL DEPTH FROM PROGN. !!802!!!! 1!2422!DUST OPTICAL DEPTH FROM PROGNOSTIC !!802!!!! 1!2423!SEA SALT OPTICAL DEPTH, DIAGNOSED !!802!!!! 1!2424!SOOT OPTICAL DEPTH FROM PROGNOSTIC !!802!!!! 1!2425!BIOMASS OPTICAL DEPTH FROM PROGN. !!802!!!! 1!2426!OCFF OPTICAL DEPTH FROM PROGNOSTIC !!802!!!! 1!2427!AMM. NITRATE OPT. DEPTH FROM PROGN. !!802!!!! 1!2433!CLEAR-SKY LW HEATING RATES (FORC.) !!606!!!! 1!2437!NET DOWNWARD LW FORC. AT THE TROP. !!606!!!! 1!2438!TOTAL DOWNWARD LW FORC. AT THE TROP.!!606!!!! 1!3002!U COMPNT OF WIND AFTER B.LAYER !m s-1!!!eastward_wind!!true_latitude_longitude 1!3002!U COMPNT OF WIND AFTER B.LAYER !m s-1!!!x_wind!!rotated_latitude_longitude 1!3003!V COMPNT OF WIND AFTER B.LAYER !m s-1!!!northward_wind!!true_latitude_longitude 1!3003!V COMPNT OF WIND AFTER B.LAYER !m s-1!!!y_wind!!rotated_latitude_longitude 1!3004!TEMPERATURE AFTER B.LAYER !m s-1!!!air_temperature!! 1!3010!SPECIFIC HUMIDITY AFTER B.LAYER !1!!!specific_humidity!! 1!3024!SURFACE TEMPERATURE AFTER B.LAYER !K!!407!surface_temperature!! 1!3024!SURFACE TEMPERATURE AFTER B.LAYER !!503!!!! 1!3025!BOUNDARY LAYER DEPTH AFTER B.LAYER !m!!!atmosphere_boundary_layer_thickness!! 1!3026!ROUGHNESS LEN. AFTER B.L. (SEE DOC) !m!!!!! 1!3027!EFFECTIVE ROUGHNESS LEN FOR SCALARS !!701!!!! 1!3028!ROUGH LEN FOR MOMENTUM WITHOUT OROG !!701!!!! 1!3049!SEA-ICE TEMPERATURE AFTER B. LAYER !K!!407!sea_ice_temperature!! 1!3049!SEA-ICE TEMPERATURE AFTER B. LAYER !!503!!!! 1!3050!MOISTURE EXCHANGE COEFFS !!601!!!! 1!3051!COMBINED RESISTANCE TO EVAP !!601!802!!! 1!3051!COMBINED RESIST. TO EVAP ON TILES !!804!!!! 1!3052!COEFFICIENTS RATIO FOR 1.5M TEMP !!601!802!!! 1!3052!COEFFS RATIO FOR 1.5M T ON TILES !!804!!!! 1!3053!QSAT GRAD W.R. TEMP SURFACE LEVEL 1 !!601!802!!! 1!3053!QSAT GRAD W.R. T SURF L1 ON TILES !!804!!!! 1!3054!AERODYNAMIC RESISTANCE (S/M) !!601!!!! 1!3055!CUMULATIVE FRACTION TRANSPIRATION !!601!!!! 1!3056!LAND MEAN COMBINED RESIST. TO EVAP !!804!!!! 1!3057!LAND MEAN COEFFS RATIO FOR 1.5M T !!804!!!! 1!3058!LAND MEAN QSAT GRAD W.R. T SURF L1 !!804!!!! 1!3060!RHOKH_MIX !!606!!!! 1!3061!RHO_ARESIST (RHOSTAR*CD_STD*VSHR) !!606!!!! 1!3062!ARESIST [ 1/(CD_STD*VSHR) ] !!606!!!! 1!3063!RESIST_B (1/CH-1/CD_STD)/VSHR !!606!!!! 1!3064!DTRDZ_CHARNEY_GRID !!606!!!! 1!3065!GRID-LEVEL OF SML INVERSION (kent) !!606!!!! 1!3066!Rho * entrainment rate (we_lim) !!606!!!! 1!3067!Fraction of the timestep (t_frac) !!606!!!! 1!3068!zrzi !!606!!!! 1!3069!GRID-LEVEL OF DSC INVERSION (kent) !!606!!!! 1!3070!Rho * entrainment rate dsc !!606!!!! 1!3071!Fraction of the timestep dsc !!606!!!! 1!3072!zrzi dsc !!606!!!! 1!3073!ZHSC Top of decoupled layer !!606!!!! 1!3074!Surface layer resist for dust div1 !!606!707!!! 1!3074!Dust div1 surf. layer resist (s/m) !!708!!!! 1!3075!Surface layer resist for dust div2 !!606!707!!! 1!3075!Dust div2 surf. layer resist (s/m) !!708!!!! 1!3076!Surface layer resist for dust div3 !!606!707!!! 1!3076!Dust div3 surf. layer resist (s/m) !!708!!!! 1!3077!Surface layer resist for dust div4 !!606!707!!! 1!3077!Dust div4 surf. layer resist (s/m) !!708!!!! 1!3078!Surface layer resist for dust div5 !!606!707!!! 1!3078!Dust div5 surf. layer resist (s/m) !!708!!!! 1!3079!Surface layer resist for dust div6 !!606!707!!! 1!3079!Dust div6 surf. layer resist (s/m) !!708!!!! 1!3100!FLUX OF TRACER 1 IN BL !!!407!!! 1!3100!FLUX OF TRACER 1 IN BL !!502!!!! 1!3101!FLUX OF TRACER 2 IN BL !!!407!!! 1!3101!FLUX OF TRACER 2 IN BL !!502!!!! 1!3102!FLUX OF TRACER 3 IN BL !!!407!!! 1!3102!FLUX OF TRACER 3 IN BL !!502!!!! 1!3103!FLUX OF TRACER 4 IN BL !!!407!!! 1!3103!FLUX OF TRACER 4 IN BL !!502!!!! 1!3104!FLUX OF TRACER 5 IN BL !!!407!!! 1!3104!FLUX OF TRACER 5 IN BL !!502!!!! 1!3105!FLUX OF TRACER 6 IN BL !!!407!!! 1!3105!FLUX OF TRACER 6 IN BL !!502!!!! 1!3106!FLUX OF TRACER 7 IN BL !!!407!!! 1!3106!FLUX OF TRACER 7 IN BL !!502!!!! 1!3107!FLUX OF TRACER 8 IN BL !!!407!!! 1!3107!FLUX OF TRACER 8 IN BL !!502!!!! 1!3108!FLUX OF TRACER 9 IN BL !!!407!!! 1!3108!FLUX OF TRACER 9 IN BL !!502!!!! 1!3109!FLUX OF TRACER 10 IN BL !!!407!!! 1!3109!FLUX OF TRACER 10 IN BL !!502!!!! 1!3110!FLUX OF TRACER 11 IN BL !!!407!!! 1!3110!FLUX OF TRACER 11 IN BL !!502!!!! 1!3111!FLUX OF TRACER 12 IN BL !!!407!!! 1!3111!FLUX OF TRACER 12 IN BL !!502!!!! 1!3112!FLUX OF TRACER 13 IN BL !!!407!!! 1!3112!FLUX OF TRACER 13 IN BL !!502!!!! 1!3113!FLUX OF TRACER 14 IN BL !!!407!!! 1!3113!FLUX OF TRACER 14 IN BL !!502!!!! 1!3114!FLUX OF TRACER 15 IN BL !!!407!!! 1!3114!FLUX OF TRACER 15 IN BL !!502!!!! 1!3115!FLUX OF TRACER 16 IN BL !!!407!!! 1!3115!FLUX OF TRACER 16 IN BL !!502!!!! 1!3116!FLUX OF TRACER 17 IN BL !!!407!!! 1!3116!FLUX OF TRACER 17 IN BL !!502!!!! 1!3117!FLUX OF TRACER 18 IN BL !!!407!!! 1!3117!FLUX OF TRACER 18 IN BL !!502!!!! 1!3118!FLUX OF TRACER 19 IN BL !!!407!!! 1!3118!FLUX OF TRACER 19 IN BL !!502!!!! 1!3119!FLUX OF TRACER 20 IN BL !!!407!!! 1!3119!FLUX OF TRACER 20 IN BL !!502!!!! 1!3120!FLUX OF TRACER 21 IN BL !!!407!!! 1!3120!FLUX OF TRACER 21 IN BL !!502!!!! 1!3121!FLUX OF TRACER 22 IN BL !!!407!!! 1!3121!FLUX OF TRACER 22 IN BL !!502!!!! 1!3122!FLUX OF TRACER 23 IN BL !!!407!!! 1!3122!FLUX OF TRACER 23 IN BL !!502!!!! 1!3123!FLUX OF TRACER 24 IN BL !!!407!!! 1!3123!FLUX OF TRACER 24 IN BL !!502!!!! 1!3124!FLUX OF TRACER 25 IN BL !!!407!!! 1!3124!FLUX OF TRACER 25 IN BL !!502!!!! 1!3125!FLUX OF TRACER 26 IN BL !!!407!!! 1!3125!FLUX OF TRACER 26 IN BL !!502!!!! 1!3126!FLUX OF TRACER 27 IN BL !!!407!!! 1!3126!FLUX OF TRACER 27 IN BL !!502!!!! 1!3127!FLUX OF TRACER 28 IN BL !!!407!!! 1!3127!FLUX OF TRACER 28 IN BL !!502!!!! 1!3128!FLUX OF TRACER 29 IN BL !!!407!!! 1!3128!FLUX OF TRACER 29 IN BL !!502!!!! 1!3129!FLUX OF TOTAL AEROSOL IN BL !!!407!!! 1!3129!FLUX OF TOTAL AEROSOL IN BL !!502!!!! 1!3130!COUNTER GRADIENT TERM OF TAUX !!706!!!! 1!3131!COUNTER GRADIENT TERM OF TAUY !!706!!!! 1!3132!COUNTER GRADIENT TERM OF FTL !!706!!!! 1!3133!COUNTER GRADIENT TERM OF FQW !!706!!!! 1!3134!MIXING LENGTH !!706!!!! 1!3135!PRODUCTION RATE OF TKE BY SHEAR !!706!!!! 1!3136!PRODUCTION RATE OF TKE BY BUOYANCY !!706!!!! 1!3137!DISSIPATION RATE OF TKE !!706!!!! 1!3138!NON-DIM DIFFUSION COEFS FOR UV (SM) !!706!!!! 1!3139!NON-DIM DIFFUSION COEFS FOR TQ (SH) !!706!!!! 1!3140!NON-GRADIENT BUOYANCY FLUX !!706!!!! 1!3141!CLOUD FRACTION IN THE TKE SCHEMES !!706!!!! 1!3142!CONDENSED WATER IN THE TKE SCHEMES !!706!!!! 1!3143!STD. DEV. OF GAUSSIAN !!706!!!! 1!3170!QCL INCR: bdy layer positive !!706!!!! 1!3171!QCL INCR: bdy layer negative !!706!!!! 1!3172!QCF INCR: bdy layer positive !!706!!!! 1!3173!QCF INCR: bdy layer negative !!706!!!! 1!3176!LIQ CLOUD VOL INCR: bdy layer positi!!706!!!! 1!3177!LIQ CLOUD VOL INCR: bdy layer negati!!706!!!! 1!3178!ICE CLOUD VOL INCR: bdy layer positi!!706!!!! 1!3179!ICE CLOUD VOL INCR: bdy layer negati!!706!!!! 1!3181!TEMPERATURE INCR: bdy layer !!501!!!! 1!3182!SPECIFIC HUMIDITY INCR: bdy layer !!501!!!! 1!3183!QCL INCR: bdy layer !!505!!!! 1!3184!QCF INCR: bdy layer !!503!!!! 1!3185!U WIND INCR: bdy layer !!501!!!! 1!3186!V WIND INCR: bdy layer !!501!!!! 1!3188!LIQUID WATER TEMP INCR: FRIC DISSIP !!706!!!! 1!3189!LIQUID WATER TEMP INCR: bdy layer !!503!!!! 1!3190!TOTAL (LIQ) WATER INCR: bdy layer !!503!!!! 1!3192!BULK CLOUD VOL INCR: bdy layer !!505!!!! 1!3193!LIQUID CLOUD VOL INCR: bdy layer !!505!!!! 1!3194!FROZEN CLOUD VOL INCR: bdy layer !!505!!!! 1!3201!HEAT FLUX THROUGH SEA ICE (GBM) W/M2!W m-2!!407!downward_heat_flux_in_sea_ice!! 1!3201!HEAT FLUX THROUGH SEA ICE (GBM) W/M2!W m-2!501!502!!! 1!3201!HT FLUX THROUGH SEAICE:SEA MEAN W/M2!W m-2!503!!downward_heat_flux_in_sea_ice!! 1!3202!HT FLUX FROM SURF TO DEEP SOIL LEV 1!W m-2!!407!downward_heat_flux_in_soil!! 1!3202!HT FLUX FROM SURF TO DEEP SOIL LEV 1!!503!!!! 1!3203!CD !!!407!!! 1!3204!CH !!!407!!! 1!3205!SURFACE LAYER WIND SHEAR !!!407!!! 1!3206!RHOSTAR * CD * SURF_LAYER_WIND_SHEAR!!!407!!! 1!3207!RHOSTAR * CH * SURF_LAYER_WIND_SHEAR!!!407!!! 1!3208!LOWEST LAYER BULK RICHARDSON NO. RIB!!!!!! 1!3209!CD (OPEN SEA VALUE AT SEA ICE PTS) !!!400.2!!! 1!3209!10 METRE WIND U-COMP !m s-1!501!!eastward_wind!height=10m!true_latitude_longitude 1!3209!10 METRE WIND U-COMP !m s-1!501!!x_wind!height=10m!rotated_latitude_longitude 1!3210!CH (OPEN SEA VALUE AT SEA ICE PT) !!!400.2!!! 1!3210!10 METRE WIND V-COMP !m s-1!501!!northward_wind!height=10m!true_latitude_longitude 1!3210!10 METRE WIND V-COMP !m s-1!501!!y_wind!height=10m!rotated_latitude_longitude 1!3211!CD (M.ICE ZONE VALUE AT SEA ICE PT) !!!400.2!!! 1!3212!CH (M.ICE ZONE VALUE AT SEA ICE PT) !!!400.2!!! 1!3213!CD (COMPLETE SEAICE VALUE@SEAICE PT)!!!400.2!!! 1!3214!CH (COMPLETE SEAICE VALUE@SEAICE PT)!!!400.2!!! 1!3215!RIB SURFACE LAYER (LEADS) !!!400.2!!! 1!3216!RIB SURFACE LAYER (SEA ICE) !!!400.2!!! 1!3216!BOUNDARY LAYER HEAT FLUXES W/M2!W m-2!501!!!! 1!3217!SURFACE & B.LAYER HEAT FLUXES W/M2!W m-2!!500!!! 1!3217!SURFACE HEAT FLUX W/M2!W m-2!501!802!!! 1!3217!SURFACE SENSIBLE HEAT FLUX W/M2!W m-2!804!!!! 1!3219!X-COMP OF SURF & BL WIND STRESS N/M2!Pa!!407!surface_downward_eastward_stress!!true_latitude_longitude 1!3219!X-COMP OF SURF & BL WIND STRESS N/M2!Pa!501!!!! 1!3220!Y-COMP OF SURF & BL WIND STRESS N/M2!Pa!!407!surface_downward_northward_stress!!true_latitude_longitude 1!3220!Y-COMP OF SURF & BL WIND STRESS N/M2!Pa!501!!!! 1!3221!MAG OF SURF & BL WIND STRESS B GRID !!505!!!! 1!3222!B.LAYER TOTAL MOISTURE FLUXS KG/M2/S!kg m-2 s-1!501!!!! 1!3223!SURF & BL TOTL MOISTURE FLUX KG/M2/S!kg m-2 s-1!!500!upward_water_vapor_flux_in_air!! 1!3223!SURFACE TOTAL MOISTURE FLUX KG/M2/S!kg m-2 s-1!501!!surface_upward_water_flux!! 1!3224!WIND MIXING EN'GY FLUX INTO SEA W/M2!W m-2!!502!wind_mixing_energy_flux_into_sea_water!! 1!3224!WIND MIX EN'GY FL TO SEA:SEA MN W/M2!W m-2!503!!wind_mixing_energy_flux_into_sea_water!! 1!3225!10 METRE WIND U-COMP !m s-1!!500!eastward_wind!height=10m!true_latitude_longitude 1!3225!10 METRE WIND U-COMP !m s-1!!500!x_wind!height=10m!rotated_latitude_longitude 1!3225!10 METRE WIND U-COMP B GRID !m s-1!501!!eastward_wind!height=10m!true_latitude_longitude 1!3225!10 METRE WIND U-COMP B GRID !m s-1!501!!x_wind!height=10m!rotated_latitude_longitude 1!3226!10 METRE WIND V-COMP !m s-1!!500!northward_wind!height=10m!true_latitude_longitude 1!3226!10 METRE WIND V-COMP !m s-1!!500!y_wind!height=10m!rotated_latitude_longitude 1!3226!10 METRE WIND V-COMP B GRID !m s-1!501!!northward_wind!height=10m!true_latitude_longitude 1!3226!10 METRE WIND V-COMP B GRID !m s-1!501!!y_wind!height=10m!rotated_latitude_longitude 1!3227!SURFACE SH FLUX FROM LEADS(GBM) W/M2!W m-2!!400.2!!! 1!3227!10 METRE WIND SPEED ON B GRID !m s-1!505!!wind_speed!height=10m! 1!3228!SURFACE SH FLUX FROM SEA (GBM) W/M2!W m-2!!407!surface_upward_sensible_heat_flux!where_open_sea! 1!3228!SURFACE SH FLUX FROM SEA (GBM) W/M2!W m-2!501!502!!! 1!3228!SFC SH FLX FROM OPEN SEA:SEA MN W/M2!W m-2!503!!surface_upward_sensible_heat_flux!where_open_sea! 1!3229!EVAP FROM SOIL SURF -AMOUNT KG/M2/TS!!!407!!! 1!3229!EVAP FROM SOIL SURF -AMOUNT KG/M2/TS!!502!!!! 1!3230!EVAP FROM CANOPY - AMOUNT KG/M2/TS!!!407!!! 1!3230!10 METRE WIND SPEED ON C GRID !m s-1!606!!wind_speed!height=10m! 1!3231!SUBLIM. FROM SURFACE (GBM) KG/M2/TS!!!407!!! 1!3231!SUBLIM. FROM SURFACE (GBM) KG/M2/TS!!501!!!! 1!3232!EVAPORATION FROM SEA (GBM) KG/M2/S!kg m-2 s-1!!407!!! 1!3232!EVAPORATION FROM SEA (GBM) KG/M2/S!!501!502!!! 1!3232!EVAP FROM OPEN SEA: SEA MEAN KG/M2/S!kg m-2 s-1!503!!!! 1!3234!SURFACE LATENT HEAT FLUX W/M2!W m-2!!407!surface_upward_latent_heat_flux!! 1!3234!SURFACE LATENT HEAT FLUX W/M2!W m-2!501!!!! 1!3235!SEAICE TOP MELTING LH FLUX(GBM) W/M2!W m-2!!407!!! 1!3235!SEAICE TOP MELTING LH FLUX(GBM) W/M2!W m-2!501!502!!! 1!3235!SEAICE TOP MELT LH FLX:SEA MEAN W/M2!W m-2!503!!!! 1!3236!TEMPERATURE AT 1.5M !K!!!air_temperature!height=1.5m! 1!3237!SPECIFIC HUMIDITY AT 1.5M !!!407!!! 1!3237!SPECIFIC HUMIDITY AT 1.5M !!502!!!! 1!3238!DEEP SOIL TEMPERATURE AFTER B.LAYER !K!!!soil_temperature!! 1!3239!CLOUD LIQUID WATER AFTER B.LAYER !!!!!! 1!3240!CLOUD ICE CONTENT AFTER B.LAYER !!!!!! 1!3241!TOTAL SURF MOIST FLUX PER TIMESTEP !!!407!!! 1!3241!TOTAL SURF MOIST FLUX PER TIMESTEP !!502!!!! 1!3242!CLOUD FRACTION AT 1.5M !!!407!!height=1.5m! 1!3243!CLOUD LIQUID WATER AT 1.5M !!!407!!height=1.5m! 1!3244!CLOUD ICE CONTENT AT 1.5M !!!407!!height=1.5m! 1!3245!RELATIVE HUMIDITY AT 1.5M !%!!!relative_humidity!height=1.5m! 1!3246!OROGRAPHIC ROUGHNESS !!!400.2!!! 1!3247!VISIBILITY AT 1.5M M!!!!!height=1.5m! 1!3248!FOG FRACTION AT 1.5 M !!!407!!! 1!3248!FOG FRACTION AT 1.5 M !!502!!!! 1!3249!10 METRE WIND SPEED M/S!m s-1!!407!wind_speed!height=10m! 1!3250!DEWPOINT AT 1.5M (K) !!!407!!! 1!3250!DEWPOINT AT 1.5M (K) !!502!!!! 1!3251!SILHOUETTE OROGRAPHIC ROUGHNESS !!!407!!! 1!3251!SILHOUETTE OROGRAPHIC ROUGHNESS !!606!!!! 1!3252!HALF OF (PEAK TO TROUGH HT OF OROG)!!!407!!! 1!3252!HALF OF (PEAK TO TROUGH HT OF OROG)!!606!!!! 1!3253!PROBABILITY OF VIS LESS THAN 5 KM !!!407!!! 1!3253!PROBABILITY OF VIS LESS THAN 5 KM !!502!!!! 1!3254!TL AT 1.5M !K!!407!!height=1.5m! 1!3254!TL AT 1.5M !!503!!!! 1!3255!QT AT 1.5M !1!!407!!height=1.5m! 1!3255!QT AT 1.5M !!503!!!! 1!3256!RHO_CD_MODV1 !!!407!!! 1!3256!Heat flux through sea ice (W/m2) !W m-2!505!!!! 1!3257!RHO_KM !!!407!!! 1!3257!Heat flux in sea ice surface melt !!505!!!! 1!3258!SURFACE SNOWMELT HEAT FLUX W/M2!W m-2!!407!surface_snow_melt_heat_flux!! 1!3258!SURFACE SNOWMELT HEAT FLUX W/M2!W m-2!503!!!! 1!3259!CANOPY CONDUCTANCE M/S !!401!407!!! 1!3259!CANOPY CONDUCTANCE M/S !!503!!!! 1!3260!TRANSPIRATION KG/M2/TS !kg m-2!401!407!transpiration_amount!user_delta_t! 1!3261!GROSS PRIMARY PRODUCTIVITY KG C/M2/S!kg m-2 s-1!401!407!gross_primary_productivity_of_carbon!! 1!3261!GROSS PRIMARY PRODUCTIVITY KG C/M2/S!!503!!!! 1!3262!NET PRIMARY PRODUCTIVITY KG C/M2/S !kg m-2 s-1!401!407!net_primary_productivity_of_carbon!! 1!3262!NET PRIMARY PRODUCTIVITY KG C/M2/S !!503!!!! 1!3263!PLANT RESPIRATION KG/M2/S !kg m-2 s-1!401!407!plant_respiration_carbon_flux!! 1!3263!PLANT RESPIRATION KG/M2/S !!503!!!! 1!3264!LEAF AREA INDEX OF VEG FRACTION !1!401!407!leaf_area_index!! 1!3265!CANOPY HEIGHT OF VEGETATED FRACTION !m!401!407!canopy_height!! 1!3270!SO2 SURFACE DRY DEP FLUX KG/M2/S !kg m-2 s-1!401!407!tendency_of_atmosphere_mass_content_of_sulfur_dioxide_due_to_dry_deposition!! 1!3270!SO2 SURFACE DRY DEP FLUX KG/M2/S !!503!!!! 1!3271!SO4 AIT SURF DRY DEP FLUX KG/M2/S !kg m-2 s-1!401!407!!! 1!3271!SO4 AIT SURF DRY DEP FLUX KG/M2/S !!503!!!! 1!3272!SO4 ACC SURF DRY DEP FLUX KG/M2/S !kg m-2 s-1!401!407!!! 1!3272!SO4 ACC SURF DRY DEP FLUX KG/M2/S !!503!!!! 1!3273!SO4 DIS SURF DRY DEP FLUX KG/M2/S !kg m-2 s-1!401!407!!! 1!3273!SO4 DIS SURF DRY DEP FLUX KG/M2/S !!503!!!! 1!3274!RESIST B FOR SO2 AFTER TS S/M !!401!407!!! 1!3274!ACCUM NITRATE DRY DEP FLX KG[N]/M2/S!!606.4!606.4!!! 1!3274!ACCUM NITRATE DRY DEP FLX KG[N]/M2/S!!704!!!! 1!3275!RESIST B FOR SO4 AIT AFTER TS S/M !!401!407!!! 1!3275!DISS NITRATE DRY DEP FLUX KG[N]/M2/S!!606.4!606.4!!! 1!3275!DISS NITRATE DRY DEP FLUX KG[N]/M2/S!!704!!!! 1!3276!RESIST B FOR SO4 ACC AFTER TS S/M !!401!407!!! 1!3277!RESIST B FOR SO4 DIS AFTER TS S/M !!401!407!!! 1!3278!RESIST S FOR SO2 AFTER TS S/M !!401!407!!! 1!3279!RESIST S FOR SO4 AIT AFTER TS S/M !!401!407!!! 1!3280!RESIST S FOR SO4 ACC AFTER TS S/M !!401!407!!! 1!3281!RESIST S FOR SO4 DIS AFTER TS S/M !!401!407!!! 1!3281!VISIBILITY AT 1.5M M!!503!601!!height=1.5m! 1!3281!VIS AT 1.5M (incl precip) M!!606!!!height=1.5m! 1!3282!DRY DEP VEL FOR SO2 AFTER TS M/S !!401!407!!! 1!3282!PROBABILITY OF VIS LESS THAN 1 KM !!503!601!!! 1!3282!PROB OF VIS < 1 KM (incl precip) !!606!!!! 1!3283!DRY DEP VEL FOR SO4 AIT AFTER TS M/S!!401!407!!! 1!3283!PROBABILITY OF VIS LESS THAN 5 KM !!503!601!!! 1!3283!PROB OF VIS < 5 KM (incl precip) !!606!!!! 1!3284!DRY DEP VEL FOR SO4 ACC AFTER TS M/S!!401!407!!! 1!3284!VISIBILITY AT 1.5M IN LS PPTN M!!503!!!height=1.5m! 1!3285!DRY DEP VEL FOR SO4 DIS AFTER TS M/S!!401!407!!! 1!3285!VISIBILITY AT 1.5M IN CONV PPTN M!!503!!!height=1.5m! 1!3286!AERODYNAMIC RESISTANCE AFTER TS !!401!407!!! 1!3287!CANOPY EVAPORATION ON NON-ICE TILES !kg m-2 s-1!404!407!!! 1!3287!CANOPY EVAPORATION ON TILES !kg m-2 s-1!503!!!! 1!3288!TRANSPIRATION+SOIL EVP NON-ICE TILES!kg m-2 s-1!404!407!!! 1!3288!TRANSPIRATION+SOIL EVP ON TILES !kg m-2 s-1!503!!!! 1!3289!GROSS PRIMARY PRODUCTIVITY ON PFTS !kg m-2 s-1!404!407!!! 1!3289!GROSS PRIMARY PRODUCTIVITY ON PFTS !!503!!!! 1!3290!SURFACE SENSIBLE HEAT FLUX ON TILES !kg m-2 s-1!404!407!!! 1!3290!SURFACE SENSIBLE HEAT FLUX ON TILES !!503!!!! 1!3291!NET PRIMARY PRODUCTIVITY ON PFTS !kg m-2 s-1!404!407!!! 1!3291!NET PRIMARY PRODUCTIVITY ON PFTS !!503!!!! 1!3292!PLANT RESPIRATION ON PFTS KG C/M2/S!!404!407!!! 1!3292!PLANT RESPIRATION ON PFTS KG C/M2/S!!503!!!! 1!3293!SOIL RESPIRATION KG C/M2/S!kg m-2 s-1!404!407!soil_respiration_carbon_flux!! 1!3293!SOIL RESPIRATION KG C/M2/S!!503!!!! 1!3294!BULK RICHARDSON NUMBER ON TILES !!404!407!!! 1!3294!BULK RICHARDSON NUMBER ON TILES !!503!!!! 1!3295!FRACTIONAL SNOW COVER !1!404!407!surface_snow_area_fraction!where_land! 1!3296!EVAP FROM SOIL SURF : RATE KG/M2/S!kg m-2 s-1!405!407!water_evaporation_flux_from_soil!! 1!3296!EVAP FROM SOIL SURF : RATE KG/M2/S!!503!!!! 1!3297!EVAP FROM CANOPY : RATE KG/M2/S!kg m-2 s-1!405!407!water_evaporation_flux_from_canopy!! 1!3297!EVAP FROM CANOPY : RATE KG/M2/S!!503!!!! 1!3298!SUBLIM. SURFACE (GBM) : RATE KG/M2/S!kg m-2 s-1!405!407!water_sublimation_flux!! 1!3298!SUBLIM. SURFACE (GBM) : RATE KG/M2/S!!503!!!! 1!3299!TRANSPIRATION RATE KG/M2/S!kg m-2 s-1!405!407!!! 1!3300!NH3 SURFACE DRY DEP FLUX KG/M2/S !kg m-2 s-1!405!407!tendency_of_atmosphere_mass_content_of_ammonia_due_to_dry_deposition!! 1!3300!NH3 SURFACE DRY DEP FLUX KG/M2/S !!503!!!! 1!3301!FRESH SOOT DRY DEPN FLUX KG/M2/S !!405!407!!! 1!3301!FRESH SOOT DRY DEPN FLUX KG/M2/S !!505!!!! 1!3302!AGED SOOT DRY DEPN FLUX KG/M2/S !!405!407!!! 1!3302!AGED SOOT DRY DEPN FLUX KG/M2/S !!505!!!! 1!3303!SOOT IN CLOUD (OCCULT) DEPN KG/M2/S !!405!407!!! 1!3303!SOOT IN CLOUD DEPN FLUX KG/M2/S !!505!!!! 1!3304!TURBULENT MIXING HT AFTER B.LAYER m !!405!500!!! 1!3304!TURBULENT MIXING HT AFTER B.LAYER m !!502!!!! 1!3305!STABLE BL INDICATOR !!405!!!! 1!3306!STRATOCUM. OVER STABLE BL INDICATOR !!405!!!! 1!3307!WELL_MIXED BL INDICATOR !!405!!!! 1!3308!DECOUPLED SC. NOT OVER CU. INDICATOR!!405!!!! 1!3309!DECOUPLED SC. OVER CU. INDICATOR !!405!!!! 1!3310!CUMULUS-CAPPED BL INDICATOR !!405!!!! 1!3311!POTENTIAL EVAPORATION AMNT KG/M2/TS !!405!407!!! 1!3312!POTENTIAL EVAPORATION RATE KG/M2/S !kg m-2 s-1!405!407!!! 1!3313!SOIL MOISTURE AVAILABILITY FACTOR !kg m-2!405!407!soil_moisture_content_at_field_capacity!! 1!3313!SOIL MOIS AVAIL FACTOR ON PFTS !kg m-2!503!!soil_moisture_content_at_field_capacity!! 1!3314!SURFACE NET RADIATION !W m-2!405!407!!! 1!3314!SURFACE NET RADIATION ON TILES !W m-2!503!!!! 1!3315!SNOW-ADJUSTED TILE FRACTIONS !!405!407!!! 1!3316!SURFACE TEMP ON SNOW-ADJSTD TILES K!K!405!407!!! 1!3316!SURFACE TEMP ON TILES K!K!503!!!! 1!3317!TILE FRACTIONS (B.LAYER) !!405!407!!! 1!3317!SURFACE TILE FRACTIONS !!606!!!! 1!3318!LEAF AREA INDEX ON PFTS (B.LAYER) !!405!407!!! 1!3318!LEAF AREA INDICES ON PFTS !!606!!!! 1!3319!CANOPY HEIGHT ON PFTS (B.LAYER) M !!405!407!!! 1!3319!CANOPY HEIGHT ON PFTS !!606!!!! 1!3320!SOIL CARBON CONTENT (B.LAYER) KGC/M2!!405!407!!! 1!3320!SOIL CARBON CONTENT (B.LAYER) KGC/M2!!606!!!! 1!3321!CANOPY WATER ON NON-ICE TILES KG/M2!kg m-2!405!407!!! 1!3321!CANOPY WATER ON TILES KG/M2!kg m-2!503!!!! 1!3322!CANOPY CAPACITY NON-ICE TILES KG/M2!kg m-2!405!407!!! 1!3322!CANOPY CAPACITY ON TILES KG/M2!kg m-2!503!!!! 1!3323!SNOW TEMPERATURE K!K!405!407!!! 1!3324!ROUGHNESS LENGTH ON TILES M!m!405!407!!! 1!3324!ROUGHNESS LENGTH ON TILES M!!503!!!! 1!3325!LEAF TURNOVER RATE ON PFTS !!405!407!!! 1!3325!LEAF TURNOVER RATE ON PFTS !!503!!!! 1!3326!CO2 LAND SURFACE FLUX KG/M**2/S!!405!407!!! 1!3326!CO2 LAND SURFACE FLUX KG/M**2/S !!503!!!! 1!3327!CO2 TOTAL FLUX TO ATMOS KG/M**2/S!!405!407!!! 1!3327!CO2 TOTAL FLUX TO ATMOS KG/M**2/S !!503!!!! 1!3328!1.5M TEMPERATURE OVER TILES !!503!!!! 1!3329!1.5M SPECIFIC HUMIDITY OVER TILES !!503!!!! 1!3330!SURFACE LATENT HEAT FLUX ON TILES !!503!!!! 1!3331!SUBLIMATION HEAT FLUX ON TILES !!503!505!!! 1!3331!SUBLIMATION MOISTURE FLUX ON TILES !!601!!!! 1!3332!TOA OUTGOING LW RAD AFTER B.LAYER !W m-2!503!!toa_outgoing_longwave_flux!! 1!3333!GRID-BOX AVERAGE SURF NET RAD !!503!!!! 1!3334!LAND MEAN POTENTIAL EVAPORATION !kg m-2 s-1!606!!water_potential_evaporation_flux!! 1!3335!POTENTIAL EVAPORATION ON TILES !!606!!!! 1!3337!LAND HT FLUX FROM SURF TO DEEP LEV 1!W m-2!503!!downward_heat_flux_in_soil!! 1!3338!NET SURF SEA-ICE HT FLUX (SEA MEAN)!!503!!!! 1!3339!LOWEST LAYER BULK RIB: SEA MEAN !!503!!!! 1!3340!SHEAR-DRIVEN B.LAYER INDICATOR !!505!!!! 1!3341!LAND MEAN TEMPERATURE AT 1.5M !!606!!!height=1.5m! 1!3342!LAND MEAN SPECIFIC HUMIDITY AT 1.5M!!606!!!height=1.5m! 1!3343!MEAN SEA SFC SH FLUX KG/M2/S !!503!!!! 1!3347!MOISTURE FLUX FROM MEAN SEA KG/M2/S!kg m-2 s-1!503!!!! 1!3353!SUBLIM. SEAICE:SEA MEAN RATE KG/M2/S!kg m-2 s-1!503!!!! 1!3355!BL THERMAL SPEED (M/S) !!806!!!! 1!3356!HEIGHT OF SURFACE MIXED LAYR TOP (M)!!802!!!! 1!3357!HEIGHT OF DEC STRATOCU LAYER TOP (M)!!802!!!! 1!3358!BL DEPTH DIAGNOSED FROM RICRIT (M) !!802!!!! 1!3359!HEIGHT OF DIAGNOSTIC PARCEL TOP (M)!!802!!!! 1!3360!HEIGHT OF DECOUPLED LAYER BASE !!701!!!! 1!3361!HEIGHT OF STRATOCUMULUS CLOUD BASE !!701!!!! 1!3362!ENTRAINMENT RATE FOR SURFACE ML !!701!!!! 1!3363!ENTRAINMENT RATE FOR BOUNDARY LAYER !!701!!!! 1!3364!INVERSION THICKNESS (M) !!901!!!! 1!3365!10 METRE NEUTRAL WIND U-COMP B GRID !!1000!!!! 1!3366!10 METRE NEUTRAL WIND V-COMP B GRID !!1000!!!! 1!3367!10 METRE NEUTRAL WIND SPEED B GRID !!1000!!!! 1!3368!10 METRE NEUTRAL WIND U-COMP !!1000!!!! 1!3369!10 METRE NEUTRAL WIND V-COMP !!1000!!!! 1!3370!X-COMP OF SURF PSEUDOSTRESS M2.S-2 !!1000!!!! 1!3371!Y-COMP OF SURF PSEUDOSTRESS M2.S-2 !!1000!!!! 1!3381!SFC NET RADN. OVER SEA-ICE:SEA MEAN !!503!!!! 1!3389!SURFACE LAYER WIND SHEAR OVER LAND !!503!!!! 1!3390!MEAN SEA SURFACE LAYER WIND SHEAR !!503!!!! 1!3391!X-COMP OF LAND SURF WIND STRESS N/M2!Pa!503!!surface_downward_eastward_stress!where_land!true_latitude_longitude 1!3392!X-COMP OF MEAN SEA SURF STRESS N/M2 !Pa!503!!surface_downward_eastward_stress!where_sea!true_latitude_longitude 1!3393!Y-COMP OF LAND SURF WIND STRESS N/M2!Pa!503!!surface_downward_northward_stress!where_land!true_latitude_longitude 1!3394!Y-COMP OF MEAN SEA SURF STRESS N/M2 !Pa!503!!surface_downward_northward_stress!where_sea!true_latitude_longitude 1!3395!FRACTION OF LAND !!503!!!! 1!3396!FRESH BIOMASS DRY DEPN FLUX KG/M2/S !kg m-2 s-1!505!!!! 1!3397!AGED BIOMASS DRY DEPN FLUX KG/M2/S !kg m-2 s-1!505!!!! 1!3398!BIOMASS IN CLOUD DEPN FLUX KG/M2/S !kg m-2 s-1!505!!!! 1!3400!Tile area frac. for dust emissions !!802!!!! 1!3401!Dust emissions div 1 (kg/m2/s) !kg m-2 s-1!505!!!! 1!3402!Dust emissions div 2 (kg/m2/s) !kg m-2 s-1!505!!!! 1!3403!Dust emissions div 3 (kg/m2/s) !kg m-2 s-1!505!!!! 1!3404!Dust emissions div 4 (kg/m2/s) !kg m-2 s-1!505!!!! 1!3405!Dust emissions div 5 (kg/m2/s) !kg m-2 s-1!505!!!! 1!3406!Dust emissions div 6 (kg/m2/s) !kg m-2 s-1!505!!!! 1!3407!FRESH OCFF DRY DEPN FLUX KG/M2/S !kg m-2 s-1!701!!!! 1!3408!AGED OCFF DRY DEPN FLUX KG/M2/S !kg m-2 s-1!701!!!! 1!3409!OCFF IN CLOUD DEPN FLUX KG/M2/S !kg m-2 s-1!701!!!! 1!3411!Dust threshold U* on tiles div 1 !!505!!!! 1!3412!Dust threshold U* on tiles div 2 !!505!!!! 1!3413!Dust threshold U* on tiles div 3 !!505!!!! 1!3414!Dust threshold U* on tiles div 4 !!505!!!! 1!3415!Dust threshold U* on tiles div 5 !!505!!!! 1!3416!Dust threshold U* on tiles div 6 !!505!!!! 1!3417!Dust threshold U* on tiles div 7 !!706!!!! 1!3418!Dust threshold U* on tiles div 8 !!706!!!! 1!3419!Dust threshold U* on tiles div 9 !!706!!!! 1!3421!Dust dry threshold U* on tiles div 1!!505!!!! 1!3422!Dust dry threshold U* on tiles div 2!!505!!!! 1!3423!Dust dry threshold U* on tiles div 3!!505!!!! 1!3424!Dust dry threshold U* on tiles div 4!!505!!!! 1!3425!Dust dry threshold U* on tiles div 5!!505!!!! 1!3426!Dust dry threshold U* on tiles div 6!!505!!!! 1!3427!Dust dry threshold U* on tiles div 7!!706!!!! 1!3428!Dust dry threshold U* on tiles div 8!!706!!!! 1!3429!Dust dry threshold U* on tiles div 9!!706!!!! 1!3430!Dust Friction velocity (U*) on tiles!!505!!!! 1!3441!Dust dry dep flux from lev 1 div 1 !!505!!!! 1!3442!Dust dry dep flux from lev 1 div 2 !!505!!!! 1!3443!Dust dry dep flux from lev 1 div 3 !!505!!!! 1!3444!Dust dry dep flux from lev 1 div 4 !!505!!!! 1!3445!Dust dry dep flux from lev 1 div 5 !!505!!!! 1!3446!Dust dry dep flux from lev 1 div 6 !!505!!!! 1!3451!Dust dry dep flux from lev 2 div 1 !!505!!!! 1!3452!Dust dry dep flux from lev 2 div 2 !!505!!!! 1!3453!Dust dry dep flux from lev 2 div 3 !!505!!!! 1!3454!Dust dry dep flux from lev 2 div 4 !!505!!!! 1!3455!Dust dry dep flux from lev 2 div 5 !!505!!!! 1!3456!Dust dry dep flux from lev 2 div 6 !!505!!!! 1!3460!X-COMP SURFACE BL STRESS !Pa!606!!surface_downward_eastward_stress!!true_latitude_longitude 1!3461!Y-COMP SURFACE BL STRESS !Pa!606!!surface_downward_northward_stress!!true_latitude_longitude 1!3462!STOMATAL CONDUCTANCE ON PFTS (M/S) !!606!!!! 1!3463!WIND GUST !!606!!!! 1!3464!OBUKHOV LENGTH !!606!!!! 1!3465!FRICTION VELOCITY !!606!!!! 1!3466!CONVECTIVE BL VELOCITY SCALE !!606!!!! 1!3467!SURFACE BUOYANCY FLUX !!606!!!! 1!3468!GRADIENT RICHARDSON NUMBER !!606!!!! 1!3469!VERTICAL BUOYANCY GRADIENT !!606!!!! 1!3470!MODULUS OF WIND SHEAR !!606!!!! 1!3471!BL MOMENTUM DIFFUSION !!606!!!! 1!3472!BL HEAT DIFFUSION !!606!!!! 1!3473!TURBULENT KINETIC ENERGY !!606!!!! 1!3474!X-COMP OF DIST OROGRAPHIC STRESS !!606!!!! 1!3475!Y-COMP OF DIST OROGRAPHIC STRESS !!606!!!! 1!3476!COMBINED BOUNDARY LAYER TYPE !!606!!!! 1!3477!DPM SOIL CARBON POOL(B.LAYER) KGC/M2!!606!!!! 1!3478!RPM SOIL CARBON POOL(B.LAYER) KGC/M2!!606!!!! 1!3479!BIO SOIL CARBON POOL(B.LAYER) KGC/M2!!606!!!! 1!3480!HUM SOIL CARBON POOL(B.LAYER) KGC/M2!!606!!!! 1!3481!DPM SOIL RESPIRATION KG C/M2/S!!606!!!! 1!3482!RPM SOIL RESPIRATION KG C/M2/S!!606!!!! 1!3483!BIO SOIL RESPIRATION KG C/M2/S!!606!!!! 1!3484!HUM SOIL RESPIRATION KG C/M2/S!!606!!!! 1!3485!SOIL RESP TEMPERATURE RATE MODIFIER !!606.2!606.4!!! 1!3486!SOIL RESP MOISTURE RATE MODIFIER !!606.2!606.4!!! 1!3487!THETA STAR FROM SURFACE FLUX (K) !!1001!!!! 1!3490!isoprene interact surf emissions !!606.4!606.4!!! 1!3490!ISOPRENE SURF EMIS PER PFTS !!1000!!!! 1!3491!terpene interact surf emissions !!606.4!606.4!!! 1!3491!TERPENE SURF EMIS PER PFTS !!1000!!!! 1!3492!methanol interact surf emissions !!606.4!606.4!!! 1!3492!METHANOL SURF EMIS PER PFTS !!1000!!!! 1!3493!acetone interact surf emissions !!606.4!606.4!!! 1!3493!ACETONE SURF EMIS PER PFTS !!1000!!!! 1!3494!tot bvoc sfc ems per spc !!606.4!606.4!!! 1!3495!ISOPRENE SURF EMIS !!1000!!!! 1!3496!TERPENE SURF EMIS !!1000!!!! 1!3497!METHANOL SURF EMIS !!1000!!!! 1!3498!ACETONE SURF EMIS !!1000!!!! 1!3501!MIXING LENGTH - MOMENTUM (M) !!802!802!!! 1!3501!MIXING LENGTH FOR MOMENTUM (M) !!804!!!! 1!3502!MIXING LENGTH - HEAT/MOISTURE (M) !!802!802!!! 1!3502!MIXING LENGTH FOR SCALARS (M) !!804!!!! 1!3503!RHOKM DIFF COEFF - LOCAL SCHEME !!802!!!! 1!3504!RHOKH DIFF COEFF - LOCAL SCHEME !!802!!!! 1!3505!RHOKM DIFF COEFF - SURF-DRIVEN TURB !!802!!!! 1!3506!RHOKH DIFF COEFF - SURF-DRIVEN TURB !!802!!!! 1!3507!RHOKM DIFF COEFF - CLD-TOP-DRIVEN !!802!!!! 1!3508!RHOKH DIFF COEFF - CLD-TOP-DRIVEN !!802!!!! 1!3509!BLENDING WEIGHT FOR 1D BL SCHEME !!806!901!!! 1!3509!Seaice sublimation (cats) (kg/m2/s)!kg m-2 s-1!1002!!!! 1!3510!STABILITY FUNCTION FOR MOMENTUM !!806!901!!! 1!3510!Net surf seaice ht flux (cats)(W/m2)!W m-2!1002!!!! 1!3511!STABILITY FUNCTION FOR SCALARS !!806!!!! 1!3512!STABILITY FUNCTION FOR MOMENTUM !!1000!!!! 1!3513!BLENDING WEIGHT FOR 1D BL SCHEME !!1000!!!! 1!4004!TEMPERATURE AFTER LARGE SCALE PRECIP!K!!!air_temperature!! 1!4010!SPECIFIC HUMIDITY AFTER LS PRECIP !1!!!specific_humidity!! 1!4100!ICE AGGREGATE FRACTION !!804!!!! 1!4101!MICROPHYSICS GRID BOX FLAG !!804!!!! 1!4102!MEAN FALLSPEED CRYSTALS !!806!!!! 1!4103!MEAN FALLSPEED AGGREGATES !!806!!!! 1!4104!FALLSPEED BRANCH FLAG !!806!!!! 1!4105!FALLSPEED USED !!806!!!! 1!4110!SURFACE RADAR REFLECTIVITY (dBZ) !!901!!!! 1!4111!MAX REFLECTIVITY IN COLUMN (dBZ) !!901!!!! 1!4112!RADAR REFLECTIVITY AT 1KM AGL (dBZ) !!901!!!! 1!4113!GRAUPEL RADAR REFLECTIVITY (dBZ) !!901!!!! 1!4114!ICE AGG RADAR REFLECTIVITY (dBZ) !!901!!!! 1!4115!ICE CRY RADAR REFLECTIVITY (dBZ) !!901!!!! 1!4116!RAIN RADAR REFLECTIVITY (dBZ) !!901!!!! 1!4117!LIQ. CLOUD RADAR REFLECTIVITY (dBZ) !!901!!!! 1!4118!TOTAL RADAR REFLECTIVITY 3D (dBZ) !!901!!!! 1!4130!QCL INCR: pc2 checks positive !!706!!!! 1!4131!QCL INCR: pc2 checks negative !!706!!!! 1!4132!QCF INCR: pc2 checks positive !!706!!!! 1!4133!QCF INCR: pc2 checks negative !!706!!!! 1!4136!LIQ CLOUD VOL INCR: pc2 checks posit!!706!!!! 1!4137!LIQ CLOUD VOL INCR: pc2 checks negat!!706!!!! 1!4138!ICE CLOUD VOL INCR: pc2 checks posit!!706!!!! 1!4139!ICE CLOUD VOL INCR: pc2 checks negat!!706!!!! 1!4141!TEMPERATURE INCR: pc2 checks !!706!!!! 1!4142!SPECIFIC HUMIDITY INCR: pc2 checks !!706!!!! 1!4143!QCL INCR: pc2 checks !!706!!!! 1!4144!QCF INCR: pc2 checks !!706!!!! 1!4152!BULK CLOUD VOL INCR: pc2 checks !!706!!!! 1!4153!LIQ CLOUD VOL INCR: pc2 checks !!706!!!! 1!4154!ICE CLOUD VOL INCR: pc2 checks !!706!!!! 1!4170!QCL INCR: ls rain positive !!706!!!! 1!4171!QCL INCR: ls rain negative !!706!!!! 1!4172!QCF INCR: ls rain positive !!706!!!! 1!4173!QCF INCR: ls rain negative !!706!!!! 1!4176!LIQ CLOUD VOL INCR: ls rain positive!!706!!!! 1!4177!LIQ CLOUD VOL INCR: ls rain negative!!706!!!! 1!4178!ICE CLOUD VOL INCR: ls rain positive!!706!!!! 1!4179!ICE CLOUD VOL INCR: ls rain negative!!706!!!! 1!4181!TEMPERATURE INCR: ls rain !!501!!!! 1!4182!SPECIFIC HUMIDITY INCR: ls rain !!501!!!! 1!4183!QCL INCR: ls rain !!501!!!! 1!4184!QCF INCR: ls rain !!501!!!! 1!4189!RAIN INCR: ls rain kg/kg/timestep !!705!!!! 1!4190!GRAUPEL INCR: ls rain kg/kg/timestep!!705!!!! 1!4191!QCF2 INCR: ls rain kg/kg/timestep !!705!!!! 1!4192!BULK CLOUD VOL INCR: ls rain !!505!!!! 1!4193!LIQUID CLOUD VOL INCR: ls rain !!505!!!! 1!4194!FROZEN CLOUD VOL INCR: ls rain !!505!!!! 1!4201!LARGE SCALE RAIN AMOUNT KG/M2/TS!kg m-2!!!stratiform_rainfall_amount!user_delta_t! 1!4202!LARGE SCALE SNOW AMOUNT KG/M2/TS!kg m-2!!!stratiform_snowfall_amount!user_delta_t! 1!4203!LARGE SCALE RAINFALL RATE KG/M2/S!kg m-2 s-1!!!stratiform_rainfall_flux!! 1!4204!LARGE SCALE SNOWFALL RATE KG/M2/S!kg m-2 s-1!!!stratiform_snowfall_flux!! 1!4205!CLOUD LIQUID WATER AFTER LS PRECIP !!!!!! 1!4206!CLOUD ICE CONTENT AFTER LS PRECIP !!!!!! 1!4207!RELATIVE HUMIDITY AFTER LS PRECIP !%!!407!relative_humidity!! 1!4207!RELATIVE HUMIDITY AFTER LS PRECIP !!503!!!! 1!4208!VISIBILITY AFTER LS PREC IN LEVEL M!!!407!!! 1!4210!CLOUD DROP NUMBER CONC. /m3 !!802!!!! 1!4211!SO2 SCAVENGED BY LS PPN KG/M2/TS !!401!407!!! 1!4211!POT. CLOUD DROP NUMBER CONC. /m3 !!802!!!! 1!4212!SO4 AIT SCAVNGD BY LS PPN KG/M2/TS !!401!407!!! 1!4213!SO4 ACC SCAVNGD BY LS PPN KG/M2/TS !!401!407!!! 1!4213!DISS NITR RNOUT BY LS PPN KG[N]/M2/S!!606.4!606.4!!! 1!4213!DISS NITR RNOUT BY LS PPN KG[N]/M2/S!!704!!!! 1!4214!SO4 DIS SCAVNGD BY LS PPN KG/M2/TS !!401!407!!! 1!4214!DIS NITR WSHOUT BY LS PPN KG[N]/M2/S!!606.4!606.4!!! 1!4214!ACC NITR WSHOUT BY LS PPN KG[N]/M2/S!!704!!!! 1!4215!NH3 SCAVENGED BY LS PPN KG/M2/S !kg m-2 s-1!405!407!!! 1!4215!NH3 SCAVENGED BY LS PPN KG/M2/S !kg m-2 s-1!505!!!! 1!4216!SO2 SCAVENGED BY LS PPN KG/M2/S !kg m-2 s-1!405!407!!! 1!4216!SO2 SCAVENGED BY LS PPN KG/M2/S !kg m-2 s-1!503!!!! 1!4217!SO4 AIT SCAVNGD BY LS PPN KG/M2/S !kg m-2 s-1!405!407!!! 1!4218!SO4 ACC SCAVNGD BY LS PPN KG/M2/S !kg m-2 s-1!405!407!!! 1!4219!SO4 DIS SCAVNGD BY LS PPN KG/M2/S !kg m-2 s-1!405!407!!! 1!4219!SO4 DIS SCAVNGD BY LS PPN KG/M2/S !kg m-2 s-1!503!!!! 1!4220!SOOT LS RAINOUT KG/M2/S !kg m-2 s-1!405!407!!! 1!4220!SOOT RAINOUT BY LS PPN KG/M2/S !kg m-2 s-1!505!!!! 1!4221!SOOT LS WASHOUT KG/M2/S !kg m-2 s-1!405!407!!! 1!4221!SOOT WASHOUT BY LS PPN KG/M2/S !kg m-2 s-1!505!!!! 1!4222!RAINFALL RATE OUT OF MODEL LEVELS !!405!407!!! 1!4222!RAINFALL RATE OUT OF MODEL LEVELS !!502!!!! 1!4223!SNOWFALL RATE OUT OF MODEL LEVELS !!405!407!!! 1!4223!SNOWFALL RATE OUT OF MODEL LEVELS !!502!!!! 1!4224!SUPERCOOLED LIQUID WATER CONTENT !!405!407!!! 1!4224!SUPERCOOLED LIQUID WATER CONTENT !!502!!!! 1!4225!SUPERCOOLED RAIN OUT OF MODEL LEVELS!!405!407!!! 1!4225!SUPERCOOLED RAIN OUT OF MODEL LEVELS!!502!!!! 1!4227!RAIN FRACTION OUT OF MODEL LEVELS !!502!!!! 1!4228!OCFF RAINOUT BY LS PPN KG/M2/S !kg m-2 s-1!701!!!! 1!4229!OCFF WASHOUT BY LS PPN KG/M2/S !kg m-2 s-1!701!!!! 1!4231!Dust wet dep flux ls precip div 1 !!505!!!! 1!4232!Dust wet dep flux ls precip div 2 !!505!!!! 1!4233!Dust wet dep flux ls precip div 3 !!505!!!! 1!4234!Dust wet dep flux ls precip div 4 !!505!!!! 1!4235!Dust wet dep flux ls precip div 5 !!505!!!! 1!4236!Dust wet dep flux ls precip div 6 !!505!!!! 1!4237!BIOMASS RAINOUT BY LS PPN KG/M2/S !kg m-2 s-1!505!!!! 1!4238!BIOMASS WASHOUT BY LS PPN KG/M2/S !kg m-2 s-1!505!!!! 1!4240!HOMOGENEOUS NUCLEATION RATE kg/kg/s !s-1!606!!!! 1!4241!HETEROGENOUS NUCLEATION RATE kg/kg/s!s-1!606!!!! 1!4242!HET NUCL RATE (QCL->QCF) kg/kg/s !s-1!606!900!!! 1!4243!DEPOSITION RATE CRY kg/kg/s !s-1!606!!!! 1!4244!DEP. RATE CRY (QCL->QCF) kg/kg/s !s-1!606!900!!! 1!4245!DEPOSITION RATE AGG kg/kg/s !s-1!606!!!! 1!4246!DEP. RATE AGG (QCL->QCF) kg/kg/s !s-1!606!900!!! 1!4247!RIMING RATE CRY kg/kg/s !s-1!606!!!! 1!4248!RIMING RATE AGG kg/kg/s !s-1!606!!!! 1!4249!CRY RAIN-CAPTURE RATE kg/kg/s !s-1!606!!!! 1!4250!AGG RAIN-CAPTURE RATE kg/kg/s !s-1!606!!!! 1!4251!EVAP OF MELTING CRY kg/kg/s !s-1!606!!!! 1!4252!EVAP OF MELTING SNOW AGG kg/kg/s !s-1!606!!!! 1!4253!MELTING RATE CRY kg/kg/s !s-1!606!!!! 1!4254!MELTING RATE AGG kg/kg/s !s-1!606!!!! 1!4255!SNOW AUTOCONV RATE kg/kg/s !s-1!606!!!! 1!4256!SNOW CAPTURE OF CRYSTALS kg/kg/s !s-1!606!!!! 1!4257!RAIN AUTOCONV RATE kg/kg/s !s-1!606!!!! 1!4258!RAIN ACCRETION RATE kg/kg/s !s-1!606!!!! 1!4259!EVAPORATION OF RAIN RATE kg/kg/s !s-1!606!!!! 1!4260!GRAUPEL AUTOCONV RATE kg/kg/s !s-1!606!!!! 1!4261!GRAUPEL ACCRETION RATE kg/kg/s !s-1!606!!!! 1!4262!GRAUPEL SNOW-CAPTURE RATE kg/kg/s !s-1!606!!!! 1!4263!GRAUPEL MELTING RATE kg/kg/s !s-1!606!!!! 1!4264!GRAUPEL EVAPORATION RATE kg/kg/s !s-1!606!!!! 1!4265!ICE CRYSTAL SEDIMENT RATE kg/kg/s !s-1!606!!!! 1!4266!SNOW AGG. SEDIMENT RATE kg/kg/s !s-1!606!!!! 1!4267!RAIN SEDIMENT RATE kg/kg/s !s-1!606!!!! 1!4268!GRAUPEL SEDIMENT RATE kg/kg/s !s-1!606!!!! 1!4269!DROPLET SETTLE RATE kg/kg/s !s-1!606!!!! 1!4270!DROPLET SETTLE EVAP RATE kg/kg/s !s-1!606!!!! 1!4271!HOMOG FREEZING NUC RAIN. kg/ks/s !s-1!802!!!! 1!4281!TEMPERATURE INCR: pc2 erosion !!802!!!! 1!4282!SPECIFIC HUMIDITY INCR: pc2 erosion !!802!!!! 1!4283!QCL INCR: pc2 erosion !!802!!!! 1!4292!BULK CLOUD VOL INCR: pc2 erosion !!802!!!! 1!4293!LIQ CLOUD VOL INCR: pc2 erosion !!802!!!! 1!4294!QCL DIAG: TURB. MIXED PHASE (KG/KG) !1!1000!!!! 1!4295!CFL DIAGNOSED: TURB. MIXED PHASE !!1000!!!! 1!4296!TURB. DECORRELATION TIMESCALE (S) !s!1000!!!! 1!4297!INV. PHASE-RELAXATION TIMESCALE !!1000!!!! 1!4298!DIAGNOSED TURBULENT DISSIPATION RATE!!1000!!!! 1!4299!INVERSE MIXING TIMESCALE (S-1) !s-1!1000!!!! 1!4300!MEAN OF SUBGRID SUPERSAT. PDF !!1000!!!! 1!4301!VARIANCE OF SUBGRID SUPERSAT. PDF !!1000!!!! 1!4303!QCL INCR MIXED PHASE USING PC2 !!1000!!!! 1!4313!CFL INCR MIXED PHASE USING PC2 !!1000!!!! 1!5004!THETA AFTER CONVECTION INCREMENT !K!!407!air_potential_temperature!! 1!5010!SPECIFIC HUMIDITY AFTER CONVECTION !1!!!specific_humidity!! 1!5013!CONV CLOUD AMOUNT AFTER CONVECTION !1!!407!convective_cloud_area_fraction!! 1!5140!QCL INCR: conv inhom positive !!706!!!! 1!5141!QCL INCR: conv inhom negative !!706!!!! 1!5142!QCF INCR: conv inhom positive !!706!!!! 1!5143!QCF INCR: conv inhom negative !!706!!!! 1!5146!LIQ CLOUD VOL INCR: conv inhom posit!!706!!!! 1!5147!LIQ CLOUD VOL INCR: conv inhom negat!!706!!!! 1!5148!ICE CLOUD VOL INCR: conv inhom posit!!706!!!! 1!5149!ICE CLOUD VOL INCR: conv inhom negat!!706!!!! 1!5150!QCL INCR: pc2 turbulence !!706!!!! 1!5151!QCL INCR: pc2 turbulence positive !!706!!!! 1!5152!QCL INCR: pc2 turbulence negative !!706!!!! 1!5156!LIQ CLOUD VOL INCR: pc2 turbulence !!706!!!! 1!5157!LIQ CLOUD VOL INCR: pc2 turb positiv!!706!!!! 1!5158!LIQ CLOUD VOL INCR: pc2 turb negativ!!706!!!! 1!5161!TEMPERATURE INCR: convection !!804!!!! 1!5162!SPECIFIC HUMIDITY INCR: convection !!804!!!! 1!5163!QCL INCR: conv inhom !!505!!!! 1!5164!QCF INCR: conv inhom !!505!!!! 1!5172!BULK CLOUD VOL INCR: conv inhom !!505!!!! 1!5173!LIQUID CLOUD VOL INCR: conv inhom !!505!!!! 1!5174!FROZEN CLOUD VOL INCR: conv inhom !!505!!!! 1!5175!du/dt from downdraughts(ms-2 P grid)!!1001!!!! 1!5176!dv/dt from downdraughts(ms-2 P grid)!!1001!!!! 1!5181!TEMPERATURE INCR: convection !!501!802!!! 1!5181!TEMPERATURE INC:convect +(PC2 inhom)!!804!!!! 1!5182!SPECIFIC HUMIDITY INCR: convection !!501!802!!! 1!5182!Q INCR: convection +(PC2 inhom) !!804!!!! 1!5183!QCL INCR: convection !!505!802!!! 1!5183!QCL INCR: convection +(PC2 inhom) !!804!!!! 1!5184!QCF INCR: convection !!505!802!!! 1!5184!QCF INCR: convection +(PC2 inhom) !!804!!!! 1!5185!U WIND INCR: convection !m s-2!501!!tendency_of_eastward_wind_due_to_convection!user_delta_t! 1!5186!V WIND INCR: convection !m s-2!501!!tendency_of_northward_wind_due_to_convection!user_delta_t! 1!5187!TEMP INCR: convection (no shallowc) !!606!!!! 1!5188!SPEC HUM INCR:convect. (no shallowc)!!606!!!! 1!5192!BULK CLOUD VOL INCR: convection !!505!!!! 1!5193!LIQUID CLOUD VOL INCR: convection !!505!!!! 1!5194!FROZEN CLOUD VOL INCR: convection !!505!!!! 1!5196!(Convective vert. vel.)^2 [(m/s)^2]!m2 s-2!806!!!! 1!5197!Convective vertical velocity [m/s]!m s-1!806!!!! 1!5198!d(Temp)/dt from downdraughts K/s !K s-1!901!!!! 1!5199!d(q)/dt from downdraughts kg/kg/s !s-1!901!!!! 1!5201!CONVECTIVE RAIN AMOUNT KG/M2/TS!kg m-2!!!convective_rainfall_amount!user_delta_t! 1!5202!CONVECTIVE SNOW AMOUNT KG/M2/TS!kg m-2!!!convective_snowfall_amount!user_delta_t! 1!5203!THETA INCREMENT FROM CONVECTION !K!!407!!! 1!5204!SPECIFIC HUMID INCRMNT FROM CONVECTN!s-1!!407!tendency_of_specific_humidity_due_to_convection!user_delta_t! 1!5205!CONVECTIVE RAINFALL RATE KG/M2/S!kg m-2 s-1!!407!convective_rainfall_flux!! 1!5205!CONVECTIVE RAINFALL RATE KG/M2/S!kg m-2 s-1!501!!convective_rainfall_flux!! 1!5206!CONVECTIVE SNOWFALL RATE KG/M2/S!kg m-2 s-1!!407!convective_snowfall_flux!! 1!5206!CONVECTIVE SNOWFALL RATE KG/M2/S!kg m-2 s-1!501!!convective_snowfall_flux!! 1!5207!PRESSURE AT CONVECTIVE CLOUD BASE !Pa!!407!air_pressure_at_convective_cloud_base!! 1!5207!PRESSURE AT CONVECTIVE CLOUD BASE !!503!!!! 1!5208!PRESSURE AT CONVECTIVE CLOUD TOP !Pa!!407!air_pressure_at_convective_cloud_top!! 1!5208!PRESSURE AT CONVECTIVE CLOUD TOP !!503!!!! 1!5209!TEMPERATURE AFTER CONVECTION !K!!!air_temperature!! 1!5210!ICAO HT OF CONVECTIVE CLOUD BASE !!!407!!! 1!5210!ICAO HT OF CONVECTIVE CLOUD BASE !!503!!!! 1!5211!ICAO HT OF CONVECTIVE CLOUD TOP !!!407!!! 1!5211!ICAO HT OF CONVECTIVE CLOUD TOP !!503!!!! 1!5212!CONV. CLOUD AMOUNT ON EACH MODEL LEV!1!!407!convective_cloud_area_fraction_in_atmosphere_layer!! 1!5212!CONV. CLOUD AMOUNT ON EACH MODEL LEV!!502!!!! 1!5213!CONV CLOUD CONDENSED WATER KG/KG!1!!407!mass_fraction_of_convective_cloud_liquid_water_in_air!! 1!5213!CONV CLOUD CONDENSED WATER KG/KG!1!502!!!! 1!5214!TOTAL RAINFALL RATE: LS+CONV KG/M2/S!kg m-2 s-1!!!rainfall_flux!! 1!5215!TOTAL SNOWFALL RATE: LS+CONV KG/M2/S!kg m-2 s-1!!!snowfall_flux!! 1!5216!TOTAL PRECIPITATION RATE KG/M2/S!kg m-2 s-1!!407!precipitation_flux!! 1!5216!TOTAL PRECIPITATION RATE KG/M2/S!kg m-2 s-1!502!!precipitation_flux!! 1!5217!DILUTE CONVECTIVELY AVAIL POT E J/KG!!!407!!! 1!5217!DILUTE CONVECTIVELY AVAIL POT E J/KG!!606!!!! 1!5218!LOWEST CONV CLOUD BASE LEVEL NO. !!!407!!! 1!5218!LOWEST CONV CLOUD BASE LEVEL NO. !!503!!!! 1!5219!LOWEST CONV CLOUD TOP LEVEL NO. !!!407!!! 1!5219!LOWEST CONV CLOUD TOP LEVEL NO. !!503!!!! 1!5220!LOWEST CONV CLOUD AMOUNT AFTER CONV !!!407!!! 1!5220!LOWEST CONV CLOUD AMOUNT AFTER CONV !!503!!!! 1!5221!LOWEST CONV CLOUD LIQUID WATER PATH !!!407!!! 1!5222!PRESSURE AT LOWEST CONV CLOUD BASE !Pa!!407!air_pressure_at_convective_cloud_base!! 1!5222!PRESSURE AT LOWEST CONV CLOUD BASE !!503!!!! 1!5223!PRESSURE AT LOWEST CONV CLOUD TOP !Pa!!407!air_pressure_at_convective_cloud_top!! 1!5223!PRESSURE AT LOWEST CONV CLOUD TOP !!503!!!! 1!5224!ICAO HT OF LOWEST CONV CLOUD BASE !!!407!!! 1!5224!ICAO HT OF LOWEST CONV CLOUD BASE !!503!!!! 1!5225!ICAO HT OF LOWEST CONV CLOUD TOP !!!407!!! 1!5225!ICAO HT OF LOWEST CONV CLOUD TOP !!503!!!! 1!5226!TOTAL PRECIPITATION AMOUNT KG/M2/TS!!!!!! 1!5227!SO2 SCAVENGED BY CONV PPN KG/M2/TS !!401!407!!! 1!5227!NOMINAL 3D CONVECTIVE RAINFALL RATE !!606!!!! 1!5228!SO4 AIT SCAVNGD BY CONV PPN KG/M2/TS!!401!407!!! 1!5228!NOMINAL 3D CONVECTIVE SNOWFALL RATE !!606!!!! 1!5229!SO4 ACC SCAVNGD BY CONV PPN KG/M2/TS!!401!407!!! 1!5229!Fractional updraught area !!1001!!!! 1!5230!SO4 DIS SCAVNGD BY CONV PPN KG/M2/TS!!401!407!!! 1!5230!Fractional downdraught area !!1001!!!! 1!5231!CONV. CLOUD BASE PRESSURE * CCA !!402!407!!! 1!5231!CAPE TIMESCALE (DEEP) S!!704!!!! 1!5232!CONV. CLOUD TOP PRESSURE * CCA !!402!407!!! 1!5232!INDICATOR REDUCED CAPE TIMESCALE !!704!!!! 1!5233!GRIDBOX MEAN CONVECTIVE CLOUD WATER !1!402!407!mass_fraction_of_convective_cloud_liquid_water_in_air!! 1!5233!UNDILUTE CAPE J/KG!!701!!!! 1!5234!GRIDBOX MEAN CONV. CLOUD WATER PATH !!402!407!!! 1!5234!UNDILUTE PARCEL CIN J/KG!!701!!!! 1!5235!U compnt of wind after convection !m s-1!404!!eastward_wind!!true_latitude_longitude 1!5235!U compnt of wind after convection !m s-1!404!!x_wind!!rotated_latitude_longitude 1!5236!V compnt of wind after convection !m s-1!404!!northward_wind!!true_latitude_longitude 1!5236!V compnt of wind after convection !m s-1!404!!y_wind!!rotated_latitude_longitude 1!5237!NH3 SCAVENGED BY CONV PPN KG/M2/S !kg m-2 s-1!405!407!!! 1!5237!NH3 SCAVENGED BY CONV PPN KG/M2/SEC !kg m-2 s-1!505!!!! 1!5238!SO2 SCAVENGED BY CONV PPN KG/M2/SEC !kg m-2 s-1!405!407!!! 1!5238!SO2 SCAVENGED BY CONV PPN KG/M2/SEC !kg m-2 s-1!503!!!! 1!5239!SO4 AIT SCAVNGD BY CONV PPN KG/M2/S !kg m-2 s-1!405!407!!! 1!5239!SO4 AIT SCAVNGD BY CONV PPN KG/M2/S !kg m-2 s-1!503!!!! 1!5240!SO4 ACC SCAVNGD BY CONV PPN KG/M2/S !kg m-2 s-1!405!407!!! 1!5240!SO4 ACC SCAVNGD BY CONV PPN KG/M2/S !kg m-2 s-1!503!!!! 1!5241!SO4 DIS SCAVNGD BY CONV PPN KG/M2/S !kg m-2 s-1!405!407!!! 1!5241!SO4 DIS SCAVNGD BY CONV PPN KG/M2/S !kg m-2 s-1!503!!!! 1!5242!CONVECTIVELY SCAVENGED SOOT KG/M2/S !kg m-2 s-1!405!407!!! 1!5242!SOOT SCAVNGD BY CONV PPN KG/M2/S !kg m-2 s-1!505!!!! 1!5243!BIOMASS SCAVNGD BY CONV PPN KG/M2/S !kg m-2 s-1!505!!!! 1!5244!OCFF SCAVNGD BY CONV PPN KG/M2/S !kg m-2 s-1!701!!!! 1!5246!UD MFLUX(rho lev) Component A (Pa/s)!Pa s-1!606!!!! 1!5247!ACC NIT SCVGD BY CONV PPN KG/M2/S !kg m-2 s-1!606.4!606.4!!! 1!5247!ACC NIT SCVGD BY CONV PPN KG/M2/S !kg m-2 s-1!704!!!! 1!5248!DISS NIT SCVGD BY CONV PPN KG/M2/S !kg m-2 s-1!606.4!606.4!!! 1!5248!DISS NIT SCVGD BY CONV PPN KG/M2/S !kg m-2 s-1!704!!!! 1!5249!UD MASS FLUX rho levels (Pa/s) !Pa s-1!606!!!! 1!5250!UPDRAUGHT MASS FLUX (PA/S) !Pa s-1!404.1!407!!! 1!5250!UPDRAUGHT MASS FLUX (Pa/s) !Pa s-1!503!!!! 1!5251!DOWNDRAUGHT MASS FLUX (PA/S) !Pa s-1!405!407!!! 1!5251!DOWNDRAUGHT MASS FLUX (PA/S) !Pa s-1!505!!!! 1!5252!UPDRAUGHT ENTRAINMENT RATE (S-1) !s-1!405!407!!! 1!5252!UPDRAUGHT ENTRAINMENT RATE (S-1) !s-1!505!!!! 1!5253!UPDRAUGHT DETRAINMENT RATE (S-1) !s-1!405!407!!! 1!5253!UPDRAUGHT DETRAINMENT RATE (S-1) !s-1!505!!!! 1!5254!DOWNDRAUGHT ENTRAINMENT RATE (S-1) !s-1!405!407!!! 1!5254!DOWNDRAUGHT ENTRAINMENT RATE (S-1) !s-1!505!!!! 1!5255!DOWNDRAUGHT DETRAINMENT RATE (S-1) !s-1!405!407!!! 1!5255!DOWNDRAUGHT DETRAINMENT RATE (S-1) !s-1!505!!!! 1!5256!U INCREMENT MS-2 ( P GRID) !!405!407!!! 1!5256!U INCREMENT MS-2 ( P GRID) !!505!!!! 1!5257!V INCREMENT MS-2 ( P GRID) !!405!407!!! 1!5257!V INCREMENT MS-2 ( P GRID) !!505!!!! 1!5258!DEEP UW STRESS KG M-1 S-2 P GRID !!505!!!! 1!5259!DEEP VW STRESS KG M-1 S-2 P GRID !!505!!!! 1!5260!SHALL UW STRESS KG M-1 S-2 P GRID !!505!!!! 1!5261!SHALL VW STRESS KG M-1 S-2 P GRID !!505!!!! 1!5262!2D CONVECTIVE CLOUD AMOUNT !!503!!!! 1!5263!MID UW STRESS KG M-1 S-2 P GRID !!704!!!! 1!5264!MID VW STRESS KG M-1 S-2 P GRID !!704!!!! 1!5267!DEEP CONVECTION CFL LIMITED !!802!!!! 1!5268!MID-LEVEL CONVECTION CFL LIMITED !!802!!!! 1!5269!DEEP CONVECTION INDICATOR !!706!!!! 1!5270!SHALLOW CONVECTION INDICATOR !!505!!!! 1!5271!CUMULUS OVER OROGRAPHY INDICATOR !!505!!!! 1!5272!MID LEVEL CONVECTION INDICATOR !!606!!!! 1!5273!TOP LEVEL SURFACE MIXING LAYER !!606!!!! 1!5274!TOP LEVEL INITIAL PARCEL ASCENT !!606!!!! 1!5275!MODEL FREEZING LEVEL !!606!!!! 1!5276!TERMINATION LEVEL for DEEP CONVECT !!606!!!! 1!5277!DEEP CONV PRECIP RATE KG/M2/S!!606!!!! 1!5278!SHALLOW CONV PRECIP RATE KG/M2/S!!606!!!! 1!5279!MID LEVEL CONV PRECIP RATE KG/M2/S!!606!!!! 1!5280!CONGESTUS CONV PRECIP RATE KG/M2/S!!606!!!! 1!5281!Dust wet dep flux conv precip div 1 !!505!!!! 1!5282!Dust wet dep flux conv precip div 2 !!505!!!! 1!5283!Dust wet dep flux conv precip div 3 !!505!!!! 1!5284!Dust wet dep flux conv precip div 4 !!505!!!! 1!5285!Dust wet dep flux conv precip div 5 !!505!!!! 1!5286!Dust wet dep flux conv precip div 6 !!505!!!! 1!5290!WQT FLUX KG/KG M/S UV LEVEL P GRID !!606!!!! 1!5291!WQL FLUX KG/KG M/S UV LEVEL P GRID !!606!!!! 1!5292!WTHETAL FLUX K M/S UV LEV P GRID!!606!!!! 1!5293!WTHETAV FLUX K M/S UV LEV P GRID!!606!!!! 1!5300!SUBCLOUD LAYER CONV VEL SCALE M/S !!606!!!! 1!5301!CUMULUS LAYER CONV VEL SCALE M/S !!606!!!! 1!5302!CLOUD BASE MASS FLUX 1 M/S !!606!!!! 1!5303!CLOUD BASE MASS FLUX 2 M/S !!606!!!! 1!5304!WQT FLUX AT CLOUD BASE KG/KG M/S !!606!!!! 1!5305!WTHETAL FLUX AT CLOUD BASE KG/KGM/S !!606!!!! 1!5306!WQT FLUX AT INVERSION KG/KG M/S !!606!!!! 1!5307!WTHETAL FLUX AT INVERSION KG/KG M/S !!606!!!! 1!5308!HEIGHT OF TOP OF SHALLOW CONV M !m!606!!!! 1!5309!HEIGHT OF BASE OF SHALLOW CONV M !m!606!!!! 1!5310!CONGESTUS CONVECTION INDICATOR !!606!!!! 1!5311!CONGESTUS CONVECTION INDICATOR 2 !!606!!!! 1!5312!TERMINATION LEVEL FOR CONGESTUS !!606!!!! 1!5313!HEIGHT OF TOP OF CONGESTUS M !m!606!!!! 1!5314!HEIGHT OF BASE OF CONGESTUS M !m!606!!!! 1!5319!FREQ DEEP CONVECTION TERM HERE !!802!!!! 1!5320!MASS FLUX DEEP CONVECTION !!606!!!! 1!5321!MASS FLUX CONGESTUS CONVECTION !!606!!!! 1!5322!MASS FLUX SHALLOW CONVECTION !!606!!!! 1!5323!MASS FLUX MID-LEVEL CONVECTION !!606!!!! 1!5324!DT FROM DEEP CONVECTION K/S !K s-1!606!!!! 1!5325!DT FROM CONGESTUS CONVECTION K/S !K s-1!606!!!! 1!5326!DT FROM SHALLOW CONVECTION K/S !K s-1!606!!!! 1!5327!DT FROM MID-LEVEL CONVECTION K/S !K s-1!606!!!! 1!5328!DQ FROM DEEP CONVECTION KG/KG/S !s-1!606!!!! 1!5329!DQ FROM CONGESTUS CONVECTION KG/KG/S!s-1!606!!!! 1!5330!DQ FROM SHALLOW CONVECTION KG/KG/S!s-1!606!!!! 1!5331!DQ FROM MID-LEVEL CONVECTION KG/KG/S!s-1!606!!!! 1!5332!DU FROM DEEP CONV M/S2 ( P GRID) !m s-2!606!!!! 1!5333!DU FROM CONGESTUS CONV M/S2 (P GRID)!m s-2!606!!!! 1!5334!DU FROM SHALLOW CONV M/S2 ( P GRID)!m s-2!606!!!! 1!5335!DU FROM MID-LEVEL CONV M/S2 (P GRID)!m s-2!606!!!! 1!5336!DV FROM DEEP CONV M/S2 ( P GRID) !m s-2!606!!!! 1!5337!DV FROM CONGESTUS CONV MS-2 (P GRID)!m s-2!606!!!! 1!5338!DV FROM SHALLOW CONV MS-2 (P GRID)!m s-2!606!!!! 1!5339!DV FROM MID-LEVEL CONV MS-2 (P GRID)!m s-2!606!!!! 1!5400!CONV_TYPE INDICATOR !!802!!!! 1!5401!CONV_TYPE INDICATOR 1 !!802!!!! 1!5402!CONV_TYPE INDICATOR 2 !!802!!!! 1!5403!CONV_TYPE INDICATOR 3 !!802!!!! 1!5404!CONV_TYPE INDICATOR 4 !!802!!!! 1!5405!CONV_TYPE 1 PRECIP RATE KG/M2/S !kg m-2 s-1!802!!!! 1!5406!CONV_TYPE 2 PRECIP RATE KG/M2/S !kg m-2 s-1!802!!!! 1!5407!CONV_TYPE 3 PRECIP RATE KG/M2/S !kg m-2 s-1!802!!!! 1!5408!CONV_TYPE 4 PRECIP RATE KG/M2/S !kg m-2 s-1!802!!!! 1!5409!DT FROM CONV_TYPE 1 K/S !K s-1!802!!!! 1!5410!DT FROM CONV_TYPE 2 K/S !K s-1!802!!!! 1!5411!DT FROM CONV_TYPE 3 K/S !K s-1!802!!!! 1!5412!DT FROM CONV_TYPE 4 K/S !K s-1!802!!!! 1!5413!DQ FROM CONV_TYPE 1 KG/KG/S !s-1!802!!!! 1!5414!DQ FROM CONV_TYPE 2 KG/KG/S !s-1!802!!!! 1!5415!DQ FROM CONV_TYPE 3 KG/KG/S !s-1!802!!!! 1!5416!DQ FROM CONV_TYPE 4 KG/KG/S !s-1!802!!!! 1!5417!MASS FLUX CONV_TYPE 1 !!802!!!! 1!5418!MASS FLUX CONV_TYPE 2 !!802!!!! 1!5419!MASS FLUX CONV_TYPE 3 !!802!!!! 1!5420!MASS FLUX CONV_TYPE 4 !!802!!!! 1!5421!HIGHEST LEVEL OF CONV_TYPE 1 !!802!!!! 1!5422!HIGHEST LEVEL OF CONV_TYPE 2 !!802!!!! 1!5423!HIGHEST LEVEL OF CONV_TYPE 3 !!802!!!! 1!5424!HIGHEST LEVEL OF CONV_TYPE 4 !!802!!!! 1!5425!WTHETA_L CONV_TYPE 1 !!802!!!! 1!5426!WTHETA_L CONV_TYPE 2 !!802!!!! 1!5427!WTHETA_L CONV_TYPE 3 !!802!!!! 1!5428!WTHETA_L CONV_TYPE 4 !!802!!!! 1!5429!WQT CONV_TYPE 1 !!802!!!! 1!5430!WQT CONV_TYPE 2 !!802!!!! 1!5431!WQT CONV_TYPE 3 !!802!!!! 1!5432!WQT CONV_TYPE 4 !!802!!!! 1!6002!U COMPNT OF WIND AFTER G.WAVE DRAG !m s-1!!!eastward_wind!!true_latitude_longitude 1!6002!U COMPNT OF WIND AFTER G.WAVE DRAG !m s-1!!!x_wind!!rotated_latitude_longitude 1!6003!V COMPNT OF WIND AFTER G.WAVE DRAG !m s-1!!!northward_wind!!true_latitude_longitude 1!6003!V COMPNT OF WIND AFTER G.WAVE DRAG !m s-1!!!y_wind!!rotated_latitude_longitude 1!6101!EASTWARD FLUX - SPECTRAL PSEUDOMOM. !!505!!!! 1!6102!SOUTHWARD FLUX - SPECTRAL PSEUDOMOM.!!505!!!! 1!6103!WESTWARD FLUX - SPECTRAL PSEUDOMOM. !!505!!!! 1!6104!NORTHWARD FLUX - SPECTRAL PSEUDOMOM.!!505!!!! 1!6105!EASTWARD FORCE FROM SPECTRAL GW !!505!!!! 1!6106!NORTHWARD FORCE FROM SPECTRAL GW !!505!!!! 1!6111!E. FLUX SPECTRAL PSEUDOMOM. P LEVS !!606.4!!!! 1!6113!W. FLUX SPECTRAL PSEUDOMOM. P LEVS !!606.4!!!! 1!6115!EAST. FORCE FROM SPECTRAL GW P LEVS !!606.4!!!! 1!6181!GW HEATING TEMPERATURE INC !!805!!!! 1!6185!U WIND INCR: gwd scheme!m s-2!501!!tendency_of_eastward_wind_due_to_gravity_wave_drag!user_delta_t!true_latitude_longitude 1!6186!V WIND INCR: gwd scheme!m s-2!501!!tendency_of_northward_wind_due_to_gravity_wave_drag!user_delta_t!true_latitude_longitude 1!6201!U COMPONENT OF GRAVITY WAVE STRESS !Pa!!501!atmosphere_eastward_stress_due_to_gravity_wave_drag!!true_latitude_longitude 1!6201!X COMPONENT OF GRAVITY WAVE STRESS !Pa!502!!atmosphere_eastward_stress_due_to_gravity_wave_drag!!true_latitude_longitude 1!6202!V COMPONENT OF GRAVITY WAVE STRESS !Pa!!501!atmosphere_northward_stress_due_to_gravity_wave_drag!!true_latitude_longitude 1!6202!Y COMPONENT OF GRAVITY WAVE STRESS !Pa!502!!atmosphere_northward_stress_due_to_gravity_wave_drag!!true_latitude_longitude 1!6203!STANDARD DEVIATION OF OROGRAPHY !!!407!!! 1!6203!STANDARD DEVIATION OF OROGRAPHY !!503!!!! 1!6204!OROGRAPHIC GRADIENT XX COMPONENT !!!407!!! 1!6204!OROGRAPHIC GRADIENT XX COMPONENT !!606!!!! 1!6205!OROGRAPHIC GRADIENT XY COMPONENT !!!407!!! 1!6205!OROGRAPHIC GRADIENT XY COMPONENT !!606!!!! 1!6206!OROGRAPHIC GRADIENT YY COMPONENT !!!407!!! 1!6206!OROGRAPHIC GRADIENT YY COMPONENT !!606!!!! 1!6207!U-ACCEL FROM SATURATED STRESS !!!!!! 1!6208!V-ACCEL FROM SATURATED STRESS !!!!!! 1!6209!U-ACCEL FROM HYDRAULIC JUMP !!!503!!! 1!6210!V-ACCEL FROM HYDRAULIC JUMP !!!503!!! 1!6211!U-ACCEL FROM TRAPPED LEE WAVES !!!503!!! 1!6212!V-ACCEL FROM TRAPPED LEE WAVES !!!503!!! 1!6213!VERTICAL TRANSMISSION COEFFICIENT !!!407!!! 1!6214!U in the GWD surface layer !!502!!!! 1!6215!V in the GWD surface layer !!502!!!! 1!6216!N in the GWD surface layer !!502!!!! 1!6217!GWD Froude number !!502!!!! 1!6218!GWD Blocked Layer Depth !!502!!!! 1!6219!Percent of hydro GWD that is linear !%!502!503!!! 1!6220!Percent of time with Hydr. Jumps !%!502!503!!! 1!6221!Percent of time with Lee Waves !%!502!503!!! 1!6222!Percent of time with blocked flow !%!502!!!! 1!6223!X COMPONENT OF GW SATURATION STRESS !!502!!!! 1!6224!Y COMPONENT OF GW SATURATION STRESS !!502!!!! 1!6225!X COMPONENT OF GW JUMP STRESS !!502!503!!! 1!6226!Y COMPONENT OF GW JUMP STRESS !!502!503!!! 1!6227!X COMPONENT OF WAKE STRESS !!502!502!!! 1!6227!X COMPONENT OF BLOCKED FLOW STRESS !!503!!!! 1!6228!Y COMPONENT OF WAKE STRESS !!502!502!!! 1!6228!Y COMPONENT OF BLOCKED FLOW STRESS !!503!!!! 1!6229!X COMPONENT OF GW LEE STRESS !!502!503!!! 1!6230!Y COMPONENT OF GW LEE STRESS !!502!503!!! 1!6231!U-ACCEL FROM BLOCKED FLOW !!502!!!! 1!6232!V-ACCEL FROM BLOCKED FLOW !!502!!!! 1!6233!% of time num limiter invoked !%!505!!!! 1!6234!% redn. of block stress by limiter !%!505!!!! 1!6235!X-COMPONENT OF SURFACE SSO STRESS !!606!!!! 1!6236!Y-COMPONENT OF SURFACE SSO STRESS !!606!!!! 1!6237!Froude No. scaling of surface stress!!606!!!! 1!6241!X COMPT OF GRAV. WAVE STRESS P LEVS !!606.4!!!! 1!6247!U-ACCEL FROM SATURATED STRESS P LEVS!!606.4!!!! 1!6248!OROGRAPHIC SUB-GRID SLOPE !!708!!!! 1!6249!OROGRAPHIC SUB-GRID ANISOTROPY !!708!!!! 1!6250!OROGRAPHIC SUB-GRID ORIENTATION !!708!!!! 1!7002!U COMPNT OF WIND AFTER VERT DIF'SION!m s-1!!407!eastward_wind!!true_latitude_longitude 1!7002!U COMPNT OF WIND AFTER VERT DIF'SION!m s-1!!407!x_wind!!rotated_latitude_longitude 1!7003!V COMPNT OF WIND AFTER VERT DIF'SION!m s-1!!407!northward_wind!!true_latitude_longitude 1!7003!V COMPNT OF WIND AFTER VERT DIF'SION!m s-1!!407!y_wind!!rotated_latitude_longitude 1!7201!VERT FLUX OF U MOMENTUM FROM V.DIFFN!!!407!!! 1!7202!VERT FLUX OF V MOMENTUM FROM V.DIFFN!!!407!!! 1!8023!SNOW MASS AFTER HYDROLOGY KG/M2!kg m-2!!!surface_snow_amount!! 1!8024!SURFACE TEMPERATURE,AFTER HYDROLOGY !K!!407!surface_temperature!! 1!8201!LAND SNOW MELT AMOUNT KG/M2/TS!kg m-2!!407!surface_snow_melt_amount!where_land user_delta_t! 1!8201!LAND SNOW MELT AMOUNT KG/M2/TS!!502!!!! 1!8202!LAND SNOW MELT HEAT FLUX W/M2!W m-2!!407!surface_snow_melt_heat_flux!where_land! 1!8202!LAND SNOW MELT HEAT FLUX W/M2!W m-2!503!!!! 1!8203!CANOPY THROUGHFALL AMOUNT KG/M2/TS!!!407!!! 1!8204!SURFACE RUNOFF AMOUNT KG/M2/TS!kg m-2!!407!surface_runoff_amount!user_delta_t! 1!8204!SURFACE RUNOFF AMOUNT KG/M2/TS!!501!502!!! 1!8204!SFC RUNOFF AMOUNT:LAND MEAN KG/M2/TS!kg m-2!503!!surface_runoff_amount!user_delta_t! 1!8205!SUB-SURFACE RUNOFF AMOUNT KG/M2/TS!kg m-2!!407!subsurface_runoff_amount!user_delta_t! 1!8205!SUB-SURFACE RUNOFF AMOUNT KG/M2/TS!!501!502!!! 1!8205!SUB-SFC RUNOFF AMT:LAND MN KG/M2/TS!kg m-2!503!!subsurface_runoff_amount!user_delta_t! 1!8206!SOIL HYDROLOGY PARAMETER "BS" !!!407!!! 1!8207!VEG MODIFIED INFILTRATION RATE !!!407!!! 1!8208!SOIL MOISTURE CONTENT !kg m-2!!!!! 1!8209!CANOPY WATER CONTENT !kg m-2!!407!canopy_water_amount!! 1!8209!CANOPY WATER CONTENT !!502!!!! 1!8210!VOL SMC AT WILTING !kg m-2!!407!volume_fraction_of_condensed_water_in_soil_at_wilting_point!! 1!8211!VOL SMC AT CRIT PT !kg m-2!!407!volume_fraction_of_condensed_water_in_soil_at_critical_point!! 1!8212!VOL SMC AT FLD CAP !kg m-2!!407!volume_fraction_of_condensed_water_in_soil_at_field_capacity!! 1!8213!VOL SMC AT SATURATION !!!407!!! 1!8214!SATURATED SOIL CONDUCTIVITY !m s-1!!407!soil_hydraulic_conductivity_at_saturation!! 1!8215!EAGLESON'S EXPONENT !!!407!!! 1!8216!THERMAL CAPACITY !J kg-1 K-1!!407!soil_thermal_capacity!! 1!8217!THERMAL CONDUCTIVITY !W m-1 K-1!!407!soil_thermal_conductivity!! 1!8218!VEGETATION FRACTION !1!!407!vegetation_area_fraction!! 1!8219!ROOT DEPTH !m!!407!root_depth!! 1!8220!SURFACE RESISTANCE TO EVAPORATION !!!407!!! 1!8221!SURFACE CAPACITY !!!407!!! 1!8222!INFILTRATION FACTOR !!!407!!! 1!8223!SOIL MOISTURE CONTENT IN A LAYER !kg m-2!!!moisture_content_of_soil_layer!! 1!8224!SATURATED SOIL WATER SUCTION !Pa!!407!soil_suction_at_saturation!! 1!8225!DEEP SOIL TEMP. AFTER HYDROLOGY DEGK!K!!!soil_temperature!! 1!8226!DEEP SNOWMELT HEAT FLUX W/M2!W m-2!!407!!! 1!8227!VAN GENUCHTEN "B" PARAMETER !!401!403!!! 1!8228!CLAPP-HORNBERGER "B" COEFFICIENT !!401!407!!! 1!8229!UNFROZEN SOIL MOISTURE FRACTION !1!401!407!mass_fraction_of_unfrozen_water_in_soil_moisture!! 1!8229!UNFROZEN SOIL MOISTURE FRACTION !1!503!!!! 1!8230!FROZEN SOIL MOISTURE FRACTION !1!401!407!mass_fraction_of_frozen_water_in_soil_moisture!! 1!8230!FROZEN SOIL MOISTURE FRACTION !1!503!!!! 1!8231!LAND SNOW MELT RATE KG/M2/S!kg m-2 s-1!405!407!surface_snow_melt_flux!where_land! 1!8231!LAND SNOW MELT RATE KG/M2/S!kg m-2 s-1!503!!!! 1!8233!CANOPY THROUGHFALL RATE KG/M2/S!kg m-2 s-1!405!407!!! 1!8233!CANOPY THROUGHFALL RATE KG/M2/S!kg m-2 s-1!503!!!! 1!8234!SURFACE RUNOFF RATE KG/M2/S!kg m-2 s-1!405!!surface_runoff_flux!! 1!8235!SUB-SURFACE RUNOFF RATE KG/M2/S!kg m-2 s-1!405!!subsurface_runoff_flux!! 1!8236!SNOW AMOUNT ON TILES KG/M2!kg m-2!503!!!! 1!8237!SNOW MELT RATE ON TILES KG/M2/S!kg m-2 s-1!503!!!! 1!8238!SNOW GRAIN SIZE ON TILES MICRONS!micron!503!!!! 1!8239!BASE FLOW AMOUNT KG/M2/S !kg m-2 s-1!505!!!! 1!8240!DUNNE RUNOFF KG/M2/S !kg m-2 s-1!505!!!! 1!8241!BASE FLOW FROM ZW LAYER KG/M2/S !kg m-2 s-1!505!!!! 1!8242!CH4 FLUX FROM WETLAND KG C /M2/S !kg m-2 s-1!505!!!! 1!8243!MEAN TOPOGRAPHIC INDEX !!606!!!! 1!8244!STANDARD DEVN IN TOPOGRAPHIC INDEX !!606!!!! 1!8245!INLANDBASINFLOW ATM GRID KG/M2/S !kg m-2 s-1!606!!!! 1!8246!INTEGRATED GAMMA DISTRIBUTION !!606!!!! 1!8247!SURFACE SATURATION FRACTION !!606!!!! 1!8248!SURFACE WETLAND FRACTION !!606!!!! 1!8249!MEAN WATER TABLE DEPTH M !m!606!!!! 1!8250!SATURATION FRAC IN DEEP LAYER !!606!!!! 1!8251!EXP DECAY IN SOIL SAT HYD CONDUCTY !!606!!!! 1!8252!DRAINAGE OUT OF SOIL MODEL KG/M2/S !kg m-2 s-1!606!!!! 1!8254!ACCUM SURFACE RUNOFF RATE KG/M2/S!kg m-2 s-1!606.2!606.4!!! 1!8255!ACCUM SUB-SURFACE RUNOFF RATEKG/M2/S!kg m-2 s-1!606.2!606.4!!! 1!8258!ACCUM SURFACE RUNOFF RATE KG/M2/S!kg m-2 s-1!705!!!! 1!8259!ACCUM SUB-SURFACE RUNOFF RATEKG/M2/S!kg m-2 s-1!705!!!! 1!9004!TEMPERATURE AFTER DYNAMIC CLOUD !K!!501!air_temperature!! 1!9004!TEMPERATURE AFTER MAIN DYN CLOUD !K!502!!air_temperature!! 1!9010!SPEC. HUMIDITY AFTER DYNAMIC CLOUD !1!!501!specific_humidity!! 1!9010!SPEC. HUMIDITY AFTER MAIN DYN CLOUD !1!502!!specific_humidity!! 1!9181!TEMPERATURE INC: bdy layer + ls cld !!502!!!! 1!9182!SPEC HUMIDITY INC: bdy layr + ls cld!!502!!!! 1!9183!QCL INC: bdy layer + ls cld !!502!!!! 1!9201!LAYER CLOUD AMOUNT IN EACH LAYER !1!!501!stratiform_cloud_area_fraction_in_atmosphere_layer!! 1!9201!BULK CLOUD AMOUNT AFTER MAIN CLOUD !1!502!!stratiform_cloud_area_fraction_in_atmosphere_layer!! 1!9202!VERY LOW CLOUD AMOUNT !1!!407!!! 1!9202!VERY LOW CLOUD AMOUNT !1!701!!!! 1!9203!LOW CLOUD AMOUNT !1!!407!!! 1!9203!LOW CLOUD AMOUNT !1!502!!!! 1!9204!MEDIUM CLOUD AMOUNT !1!!407!!! 1!9204!MEDIUM CLOUD AMOUNT !1!502!!!! 1!9205!HIGH CLOUD AMOUNT !1!!407!!! 1!9205!HIGH CLOUD AMOUNT !1!502!!!! 1!9206!CLOUD LIQUID WATER AFTER DYN CLOUD !1!!501!mass_fraction_of_cloud_liquid_water_in_air!! 1!9206!CLOUD LIQUID WATER AFTER MAIN CLOUD !1!502!!mass_fraction_of_cloud_liquid_water_in_air!! 1!9207!CLOUD ICE CONTENT AFTER DYNAM CLOUD !1!!!mass_fraction_of_cloud_ice_in_air!! 1!9208!CLOUD BASE FOR COVER.GT.0.1 OCTA KFT!!!407!!! 1!9208!CLOUD BASE FOR COVER.GT.0.1 OCTA KFT!!503!802!!! 1!9208!CLOUD BASE ASL COVER.GT.0.1 OCTA KFT!!804!!!! 1!9209!CLOUD BASE FOR COVER.GT.1.5 OCTA KFT!!!407!!! 1!9209!CLOUD BASE FOR COVER.GT.1.5 OCTA KFT!!503!802!!! 1!9209!CLOUD BASE ASL COVER.GT.1.5 OCTA KFT!!804!!!! 1!9210!CLOUD BASE FOR COVER.GT.2.5 OCTA KFT!!!407!!! 1!9210!CLOUD BASE FOR COVER.GT.2.5 OCTA KFT!!503!802!!! 1!9210!CLOUD BASE ASL COVER.GT.2.5 OCTA KFT!!804!!!! 1!9211!CLOUD BASE FOR COVER.GT.3.5 OCTA KFT!!!407!!! 1!9211!CLOUD BASE FOR COVER.GT.3.5 OCTA KFT!!503!802!!! 1!9211!CLOUD BASE ASL COVER.GT.3.5 OCTA KFT!!804!!!! 1!9212!CLOUD BASE FOR COVER.GT.4.5 OCTA KFT!!!407!!! 1!9212!CLOUD BASE FOR COVER.GT.4.5 OCTA KFT!!503!802!!! 1!9212!CLOUD BASE ASL COVER.GT.4.5 OCTA KFT!!804!!!! 1!9213!CLOUD BASE FOR COVER.GT.5.5 OCTA KFT!!!407!!! 1!9213!CLOUD BASE FOR COVER.GT.5.5 OCTA KFT!!503!802!!! 1!9213!CLOUD BASE ASL COVER.GT.5.5 OCTA KFT!!804!!!! 1!9214!CLOUD BASE FOR COVER.GT.6.5 OCTA KFT!!!407!!! 1!9214!CLOUD BASE FOR COVER.GT.6.5 OCTA KFT!!503!802!!! 1!9214!CLOUD BASE ASL COVER.GT.6.5 OCTA KFT!!804!!!! 1!9215!CLOUD BASE FOR COVER.GT.7.9 OCTA KFT!!!407!!! 1!9215!CLOUD BASE FOR COVER.GT.7.9 OCTA KFT!!503!802!!! 1!9215!CLOUD BASE ASL COVER.GT.7.9 OCTA KFT!!804!!!! 1!9216!TOTAL CLOUD AMOUNT - RANDOM OVERLAP !1!!!!! 1!9217!TOTAL CLOUD AMOUNT MAX/RANDOM OVERLP!1!!407!!! 1!9217!TOTAL CLOUD AMOUNT MAX/RANDOM OVERLP!1!501!!!! 1!9218!CLOUD FRACTION BELOW 1000 FT ASL !1!!407!!! 1!9218!CLOUD FRACTION BELOW 1000 FT ASL !1!503!!!! 1!9219!LOW CLOUD BASE (FT ASL) !!!407!!! 1!9219!LOW CLOUD BASE (FT ASL) !!503!!!! 1!9220!LOW CLOUD TOP (FT ASL) !!!407!!! 1!9220!LOW CLOUD TOP (FT ASL) !!503!!!! 1!9221!WET BULB FREEZING LEV HEIGHT (M) !m!!407!!! 1!9221!WET BULB FREEZING LEV HEIGHT (M) !m!503!!!! 1!9222!WET BULB TEMPERATURE (K) !K!!407!wet_bulb_temperature!! 1!9222!WET BULB TEMPERATURE (K) !K!503!!!! 1!9223!TOTAL CLOUD TOP HEIGHT (KFT) !kft!!407!!! 1!9223!TOTAL CLOUD TOP HEIGHT (KFT) !kft!503!!!! 1!9224!LAYER LIQUID CLOUD AMOUNT IN LAYERS !1!404!407!!! 1!9225!LAYER FROZEN CLOUD AMOUNT IN LAYERS !1!404!407!!! 1!9226!LAYER CLOUD FREQUENCY IN EACH LAYER !!404!407!!! 1!9226!LAYER CLOUD FREQUENCY IN EACH LAYER !!502!!!! 1!9227!LAYER CLOUD AREA IN LAYER !1!405!407!!! 1!9228!CRITICAL RELATIVE HUMIDITY !!405!407!!! 1!9228!CRITICAL RELATIVE HUMIDITY IN LAYERS!!502!!!! 1!9229!RELATIVE HUMIDITY AFTER MAIN CLOUD !!502!!!! 1!9230!VISIBILITY ON MODEL LEVELS M!m!503!!!! 1!9231!COMBINED CLOUD AMOUNT IN EACH LAYER !!505!!!! 1!9232!CEILOMETER CLD AMT - RANDOM OVERLAP !!806!!!! 1!9233!CEILOMETER CLD AMT MAX/RANDOM OVERLP!!806!!!! 1!9234!CEILOMETER CLOUD AMT IN EACH LAYER !!806!!!! 1!9310!Icing Index II(RH) !!804!!!! 1!9311!Icing Index Flag II(RH)>0.1 !!804!!!! 1!9312!Icing Index Flag II(RH)>0.2 !!804!!!! 1!9313!Icing Index Flag II(RH)>0.3 !!804!!!! 1!9314!Icing Index Flag II(RH)>0.4 !!804!!!! 1!9315!Icing Index Flag II(RH)>0.5 !!804!!!! 1!9316!Icing Index Flag II(RH)>0.6 !!804!!!! 1!9317!Icing Index Flag II(RH)>0.7 !!804!!!! 1!9318!Icing Index Flag II(RH)>0.8 !!804!!!! 1!9319!Icing Index Flag II(RH)>0.9 !!804!!!! 1!9320!Icing Index II(RHCldPres) !!804!!!! 1!9321!Icing Index Flag II(RHCldPres)>0.1 !!804!!!! 1!9322!Icing Index Flag II(RHCldPres)>0.2 !!804!!!! 1!9323!Icing Index Flag II(RHCldPres)>0.3 !!804!!!! 1!9324!Icing Index Flag II(RHCldPres)>0.4 !!804!!!! 1!9325!Icing Index Flag II(RHCldPres)>0.5 !!804!!!! 1!9326!Icing Index Flag II(RHCldPres)>0.6 !!804!!!! 1!9327!Icing Index Flag II(RHCldPres)>0.7 !!804!!!! 1!9328!Icing Index Flag II(RHCldPres)>0.8 !!804!!!! 1!9329!Icing Index Flag II(RHCldPres)>0.9 !!804!!!! 1!9330!Icing Index II(CF) !!804!!!! 1!9331!Icing Index Flag II(CF)>0.1 !!804!!!! 1!9332!Icing Index II(CF)>0.2 !!804!!!! 1!9333!Icing Index Flag II(CF)>0.3 !!804!!!! 1!9334!Icing Index Flag II(CF)>0.4 !!804!!!! 1!9335!Icing Index Flag II(CF)>0.5 !!804!!!! 1!9336!Icing Index Flag II(CF)>0.6 !!804!!!! 1!9337!Icing Index Flag II(CF)>0.7 !!804!!!! 1!9338!Icing Index Flag II(CF)>0.8 !!804!!!! 1!9339!Icing Index Flag II(CF)>0.9 !!804!!!! 1!9340!Icing Index II(LCF) !!804!!!! 1!9341!Icing Index Flag II(LCF)>0.1 !!804!!!! 1!9342!Icing Index Flag II(LCF)>0.2 !!804!!!! 1!9343!Icing Index Flag II(LCF)>0.3 !!804!!!! 1!9344!Icing Index Flag II(LCF)>0.4 !!804!!!! 1!9345!Icing Index Flag II(LCF)>0.5 !!804!!!! 1!9346!Icing Index Flag II(LCF)>0.6 !!804!!!! 1!9347!Icing Index Flag II(LCF)>0.7 !!804!!!! 1!9348!Icing Index Flag II(LCF)>0.8 !!804!!!! 1!9349!Icing Index Flag II(LCF)>0.9 !!804!!!! 1!9350!Icing Index II(LWC) !!804!!!! 1!9351!Icing Index Flag II(LWC)>0.1 !!804!!!! 1!9352!Icing Index Flag II(LWC)>0.2 !!804!!!! 1!9353!Icing Index Flag II(LWC)>0.3 !!804!!!! 1!9354!Icing Index Flag II(LWC)>0.4 !!804!!!! 1!9355!Icing Index Flag II(LWC)>0.5 !!804!!!! 1!9356!Icing Index Flag II(LWC)>0.6 !!804!!!! 1!9357!Icing Index Flag II(LWC)>0.7 !!804!!!! 1!9358!Icing Index Flag II(LWC)>0.8 !!804!!!! 1!9359!Icing Index Flag II(LWC)>0.9 !!804!!!! 1!9360!Icing Index II(icLWC) !!804!!!! 1!9361!Icing Index Flag II(icLWC)>0.1 !!804!!!! 1!9362!Icing Index Flag II(icLWC)>0.2 !!804!!!! 1!9363!Icing Index Flag II(icLWC)>0.3 !!804!!!! 1!9364!Icing Index Flag II(icLWC)>0.4 !!804!!!! 1!9365!Icing Index Flag II(icLWC)>0.5 !!804!!!! 1!9366!Icing Index Flag II(icLWC)>0.6 !!804!!!! 1!9367!Icing Index Flag II(icLWC)>0.7 !!804!!!! 1!9368!Icing Index Flag II(icLWC)>0.8 !!804!!!! 1!9369!Icing Index Flag II(icLWC)>0.9 !!804!!!! 1!9370!Icing Index II(FROST-LN) !!804!!!! 1!9371!Icing Index Flag II(FROST-LN)>0.1 !!804!!!! 1!9372!Icing Index Flag II(FROST-LN)>0.2 !!804!!!! 1!9373!Icing Index Flag II(FROST-LN)>0.3 !!804!!!! 1!9374!Icing Index Flag II(FROST-LN)>0.4 !!804!!!! 1!9375!Icing Index Flag II(FROST-LN)>0.5 !!804!!!! 1!9376!Icing Index Flag II(FROST-LN)>0.6 !!804!!!! 1!9377!Icing Index Flag II(FROST-LN)>0.7 !!804!!!! 1!9378!Icing Index Flag II(FROST-LN)>0.8 !!804!!!! 1!9379!Icing Index Flag II(FROST-LN)>0.9 !!804!!!! 1!9380!Icing Index II(FROST-Gamma) !!804!!!! 1!9381!Icing Index Flag II(FROSTGamma)>0.1 !!804!!!! 1!9382!Icing Index Flag II(FROSTGamma)>0.2 !!804!!!! 1!9383!Icing Index Flag II(FROSTGamma)>0.3 !!804!!!! 1!9384!Icing Index Flag II(FROSTGamma)>0.4 !!804!!!! 1!9385!Icing Index Flag II(FROSTGamma)>0.5 !!804!!!! 1!9386!Icing Index Flag II(FROSTGamma)>0.6 !!804!!!! 1!9387!Icing Index Flag II(FROSTGamma)>0.7 !!804!!!! 1!9388!Icing Index Flag II(FROSTGamma)>0.8 !!804!!!! 1!9389!Icing Index Flag II(FROSTGamma)>0.9 !!804!!!! 1!9391!Icing Index 2d MaxRan II(RH) !!804!!!! 1!9392!Icing Index 2d MaxRan II(RHCldPres) !!804!!!! 1!9393!Icing Index 2d MaxRan II(CF) !!804!!!! 1!9394!Icing Index 2d MaxRan II(LCF) !!804!!!! 1!9395!Icing Index 2d MaxRan II(LWC) !!804!!!! 1!9396!Icing Index 2d MaxRan II(icLWC) !!804!!!! 1!9397!Icing Index 2d MaxRan II(FROST-LN) !!804!!!! 1!9398!Icing Index 2d MaxRan II(FROST-Gamma!!804!!!! 1!10001!PSTAR AFTER ADJUSTMENT !Pa!!407!surface_air_pressure!! 1!10002!U COMPNT OF WIND AFTER ADJUSTMENT !m s-1!!407!eastward_wind!!true_latitude_longitude 1!10002!U COMPNT OF WIND AFTER ADJUSTMENT !m s-1!!407!x_wind!!rotated_latitude_longitude 1!10003!V COMPNT OF WIND AFTER ADJUSTMENT !m s-1!!407!northward_wind!!true_latitude_longitude 1!10003!V COMPNT OF WIND AFTER ADJUSTMENT !m s-1!!407!y_wind!!rotated_latitude_longitude 1!10004!THETA AFTER ADJUSTMENT !K!!407!!! 1!10010!SPEC HUMID TOT WATER CONTENT:ADJUST !!!407!!! 1!10185!dU SOLVER INC ON MODEL LEVELS !!505!!!! 1!10186!dV SOLVER INC ON MODEL LEVELS !!505!!!! 1!10187!dW SOLVER INC ON MODEL LEVELS !!505!!!! 1!10201!MEAN U OVER ADJ*LAYER THICK=MASS FLX!!!407!!! 1!10202!MEAN V OVER ADJ*LAYER THICK=MASS FLX!!!407!!! 1!10203!PSEUDO-RADIUS AT MODEL LEVELS !!!407!!! 1!10204!ETADOT FROM THE ADJUSTMENT STEP !!!407!!! 1!10205!RATE OF CHANGE OF PSTAR !Pa s-1!!407!tendency_of_surface_air_pressure!! 1!10206!GEOPOTENTIAL !m2 s-2!!407!geopotential!! 1!10207!MEAN U OVER ADJ * LAYER THICK * TEMP!!!407!!! 1!10208!MEAN V OVER ADJ * LAYER THICK * TEMP!!!407!!! 1!10209!MEAN U OVER ADJ * LAYER THICK *HUMID!!!407!!! 1!10210!MEAN V OVER ADJ * LAYER THICK *HUMID!!!407!!! 1!10211!MEAN U ADJ *LAYER THICK* LIQ WATER T!!!407!!! 1!10212!MEAN V ADJ *LAYER THICK* LIQ WATER T!!!407!!! 1!10213!MEAN U ADJ *LAYER THICK* TOTAL WATER!!!407!!! 1!10214!MEAN V ADJ *LAYER THICK* TOTAL WATER!!!407!!! 1!10215!MEAN U ADJ * LAYER THICK * U !!!407!!! 1!10216!MEAN V ADJ * LAYER THICK * U !!!407!!! 1!10217!MEAN U ADJ * LAYER THICK * V !!!407!!! 1!10218!MEAN V ADJ * LAYER THICK * V !!!407!!! 1!10219!MEAN U * LAYER THICK * GEOPOTENTIAL !!!407!!! 1!10220!MEAN V * LAYER THICK * GEOPOTENTIAL !!!407!!! 1!10221!MN U *LYR THICK* MOIST STATIC ENERGY!!!407!!! 1!10222!MN V *LYR THICK* MOIST STATIC ENERGY!!!407!!! 1!10223!ANGULAR MOMENTUM M1 KG M2/S X10-24!!!407!!! 1!10224!ANGULAR MOMENTUM M2 KG M2/S X10-24!!!407!!! 1!10225!ANGULAR MOMENTUM M3 KG M2/S X10-24!!!407!!! 1!10226!ANGULAR MOMENTUM W1 KG M2/S X10-24!!!407!!! 1!10227!ANGULAR MOMENTUM W2 KG M2/S X10-24!!!407!!! 1!10228!ANGULAR MOMENTUM W3 KG M2/S X10-24!!!407!!! 1!10229!CLOUD LIQUID WATER BEFORE DYNAMICS !!!407!!! 1!10230!CLOUD ICE CONTENT BEFORE DYNAMICS !!!407!!! 1!12002!U AFTER PRIMARY FIELD ADVECTION !m s-1!!407!eastward_wind!!true_latitude_longitude 1!12002!U AFTER PRIMARY FIELD ADVECTION !m s-1!!407!x_wind!!rotated_latitude_longitude 1!12002!U (MODEL LEVELS) AFTER ADVECTION !m s-1!501!!eastward_wind!!true_latitude_longitude 1!12002!U (MODEL LEVELS) AFTER ADVECTION !m s-1!501!!x_wind!!rotated_latitude_longitude 1!12003!V AFTER PRIMARY FIELD ADVECTION !m s-1!!407!northward_wind!!true_latitude_longitude 1!12003!V AFTER PRIMARY FIELD ADVECTION !m s-1!!407!y_wind!!rotated_latitude_longitude 1!12003!V (MODEL LEVELS) AFTER ADVECTION !m s-1!501!!northward_wind!!true_latitude_longitude 1!12003!V (MODEL LEVELS) AFTER ADVECTION !m s-1!501!!y_wind!!rotated_latitude_longitude 1!12004!THETAL AFTER PRIMARY FIELD ADVECTION!K!!407!!! 1!12004!TEMPERATURE AFTER ADVECTION !K!501!!air_temperature!! 1!12010!QT AFTER PRIMARY FIELD ADVECTION !1!!407!!! 1!12010!SPECIFIC HUMIDITY AFTER ADVECTION !1!501!!specific_humidity!! 1!12012!QCF AFTER ADVECTION !1!501!!mass_fraction_of_cloud_ice_in_air!! 1!12170!QCL INCR: advect positive !1!706!!!! 1!12171!QCL INCR: advect negative !1!706!!!! 1!12172!QCF INCR: advect positive !1!706!!!! 1!12173!QCF INCR: advect negative !1!706!!!! 1!12176!LIQ CLOUD VOL INCR: advect positive !!706!!!! 1!12177!LIQ CLOUD VOL INCR: advect negative !!706!!!! 1!12178!FROZEN CLOUD VOL INCR:advect positiv!!706!!!! 1!12179!FROZEN CLOUD VOL INCR:advect negativ!!706!!!! 1!12181!TEMPERATURE INCR: advect K/Timestep !K s-1!502!!tendency_of_air_temperature_due_to_advection!user_delta_t! 1!12182!Q INCR: advect kg/kg/timestep !s-1!502!!tendency_of_specific_humidity_due_to_advection!user_delta_t! 1!12183!QCL INCR: advect kg/kg/timestep !s-1!502!!tendency_of_mass_fraction_of_cloud_liquid_water_in_air_due_to_advection!user_delta_t! 1!12184!QCL INCR: advect kg/kg/timestep !s-1!502!503!tendency_of_mass_fraction_of_cloud_liquid_water_in_air_due_to_advection!user_delta_t! 1!12184!QCF INCR: advect kg/kg/timestep !s-1!505!!tendency_of_mass_fraction_of_cloud_ice_in_air_due_to_advection!user_delta_t! 1!12185!U WIND INCR: advection !m s-1!501!!tendency_of_eastward_wind_due_to_advection!user_delta_t!true_latitude_longitude 1!12186!V WIND INCR: advection !m s-1!501!!tendency_of_northward_wind_due_to_advection!user_delta_t!true_latitude_longitude 1!12187!W INCR: advect m/s/timestep !m s-1!502!!tendency_of_upward_air_velocity_due_to_advection!user_delta_t! 1!12189!RAIN INCR: advect kg/kg/timestep !!705!!!! 1!12190!GRAUPEL INCR: advect kg/kg/timestep!!705!!!! 1!12191!QCF2 INCR: advect kg/kg/timestep !!705!!!! 1!12192!BULK CLOUD VOL INCR: advect !!505!!!! 1!12193!LIQUID CLOUD VOL INCR: advect !!505!!!! 1!12194!FROZEN CLOUD VOL INCR: advect !!505!!!! 1!12201!OMEGA ON MODEL LEVELS !Pa s-1!!407!lagrangian_tendency_of_air_pressure!! 1!12202!OMEGA ON PRESSURE LEVELS !Pa s-1!!407!lagrangian_tendency_of_air_pressure!! 1!12203!dz to w departure point m !m!502!!!! 1!12204!lambda w departure point radians !radian!502!!!! 1!12205!phi w departure point radians !radian!502!!!! 1!12254!QCL AFTER ADVECTION !1!501!!!! 1!13002!U AFTER FILTERING AND DIFFUSION !m s-1!!407!eastward_wind!!true_latitude_longitude 1!13002!U AFTER FILTERING AND DIFFUSION !m s-1!!407!x_wind!!rotated_latitude_longitude 1!13003!V AFTER FILTERING AND DIFFUSION !m s-1!!407!northward_wind!!true_latitude_longitude 1!13003!V AFTER FILTERING AND DIFFUSION !m s-1!!407!y_wind!!rotated_latitude_longitude 1!13004!THETAL AFTER FILTERING AND DIFFUSION!K!!407!!! 1!13010!QT AFTER FILTERING AND DIFFUSION !1!!407!!! 1!13181!dT DIFFUSION INC ON MODEL LEVELS !K s-1!505!!tendency_of_air_temperature_due_to_diffusion!user_delta_t! 1!13182!dQ DIFFUSION INC ON MODEL LEVELS !s-1!505!!tendency_of_specific_humidity_due_to_diffusion!user_delta_t! 1!13185!dU DIFFUSION INC ON MODEL LEVELS !m s-1!505!!tendency_of_eastward_wind_due_to_diffusion!user_delta_t!true_latitude_longitude 1!13186!dV DIFFUSION INC ON MODEL LEVELS !m s-1!505!!tendency_of_northward_wind_due_to_diffusion!user_delta_t!true_latitude_longitude 1!13190!SMAG: VISC_M !!606!!!! 1!13191!SMAG: VISC_H !!606!!!! 1!13192!SMAG: S (SHEAR TERM) !!606!!!! 1!13193!MIXING LENGTH RNEUTML !!606!!!! 1!13194!RI DEPENDENT FN (FM_3D) !!606!805!!! 1!13195!RI DEPENDENT FN (FH_3D) !!606!805!!! 1!13196!DIFF COEFF FROM BL SCHEME (RHO_KM) !!606!805!!! 1!13197!DIFF COEFF FROM BL SCHEME (RHO_KH) !!606!805!!! 1!13201!QT SOURCE/SINK IN QT_POS KG/M2/S!kg m-2 s-1!!407!!! 1!13201!Indicator of local q diffusion !!505!!!! 1!13381!dT FILTER INC ON MODEL LEVELS !!701!!!! 1!13385!dU FILTER INC ON MODEL LEVELS !!701!!!! 1!13386!dV FILTER INC ON MODEL LEVELS !!701!!!! 1!13387!dW FILTER INC ON MODEL LEVELS !!701!!!! 1!13388!dEXNER FILTER INC ON MODEL LEVELS !!701!!!! 1!13481!dT FILTER INC INC ON MODEL LEVELS !!701!!!! 1!13485!dU FILTER INC INC ON MODEL LEVELS !!701!!!! 1!13486!dV FILTER INC INC ON MODEL LEVELS !!701!!!! 1!13487!dW FILTER INC INC ON MODEL LEVELS !!701!!!! 1!14181!TEMPERATURE INCR: En cor K/Timestep !!502!!!! 1!14201!ATMOS ENERGY CORR'N IN COLUMN W/M2!W m-2!!!!! 1!15002!U WIND ON MODEL LEVELS B GRID !m s-1!501!!eastward_wind!!true_latitude_longitude 1!15002!U WIND ON MODEL LEVELS B GRID !m s-1!501!!x_wind!!rotated_latitude_longitude 1!15003!V WIND ON MODEL LEVELS B GRID !m s-1!501!!northward_wind!!true_latitude_longitude 1!15003!V WIND ON MODEL LEVELS B GRID !m s-1!501!!y_wind!!rotated_latitude_longitude 1!15101!H OF THETA MODEL LEVS FROM SEA LEVEL!!505!!!! 1!15102!H OF RHO MODEL LEVS FROM SEA LEVEL !!505!!!! 1!15108!PRESSURE ON GEOMETRIC HEIGHT LEVELS !Pa!505!!air_pressure!! 1!15119!THETA ON GEOMETRIC HEIGHT LEVELS !K!505!!air_potential_temperature!! 1!15127!RHO ON GEOMETRIC HEIGHT LEVELS !kg m-3!505!!air_density!! 1!15142!W ON GEOMETRIC HEIGHT LEVELS !m s-1!505!!upward_air_velocity!! 1!15143!U ON GEOMETRIC HEIGHT LEVELS !m s-1!505!!eastward_wind!! 1!15144!V ON GEOMETRIC HEIGHT LEVELS !m s-1!505!!northward_wind!! 1!15181!dT INC FROM QT_BAL_CLD !!705!!!! 1!15182!DQ INC FROM QT_BAL_CLD !!705!!!! 1!15183!DQCL INC FROM QT_BAL_CLD !!705!!!! 1!15201!U COMPNT OF WIND ON PRESSURE LEVELS !m s-1!!500!eastward_wind!! 1!15201!U WIND ON PRESSURE LEVELS B GRID !m s-1!501!!eastward_wind!! 1!15202!V COMPNT OF WIND ON PRESSURE LEVELS !m s-1!!500!northward_wind!! 1!15202!V WIND ON PRESSURE LEVELS B GRID !m s-1!501!!northward_wind!! 1!15203!MAX CAT PROBABILITY. NEED MAX WIND !!!407!!! 1!15204!MAX CAT PROB LEVEL. NEED MAX WIND !!!407!!! 1!15205!CAT PROB @ P LEVELS. NEED MAX WIND !!!407!!! 1!15206!HEIGHT OF MAX WIND LEVEL- NOT AVALBL!!!407!!! 1!15207!ICAO HT OF MAX WIND LEV-NEED MAX UV&!!!407!!! 1!15208!PRESSURE OF MAX WIND LEV-NEED MAX U,!!!407!!! 1!15209!U COMPONENT OF MAX WIND-NEED MAX V&P!!!407!!! 1!15210!V COMPONENT OF MAX WIND-NEED MAX U&P!!!407!!! 1!15211!CAT PROB AVE 300 250 200MB NEED MAX !!!407!!! 1!15212!50 METRE WIND U-COMPONENT !m s-1!!500!eastward_wind!height=50m!true_latitude_longitude 1!15212!50 METRE WIND U-COMPONENT !m s-1!!500!x_wind!height=50m!rotated_latitude_longitude 1!15212!50 METRE WIND U-COMPONENT B GRID !m s-1!501!!eastward_wind!height=50m!true_latitude_longitude 1!15212!50 METRE WIND U-COMPONENT B GRID !m s-1!501!!x_wind!height=50m!rotated_latitude_longitude 1!15213!50 METRE WIND V-COMPONENT !m s-1!!500!northward_wind!height=50m!true_latitude_longitude 1!15213!50 METRE WIND V-COMPONENT !m s-1!!500!y_wind!height=50m!rotated_latitude_longitude 1!15213!50 METRE WIND V-COMPONENT B GRID !m s-1!501!!northward_wind!height=50m!true_latitude_longitude 1!15213!50 METRE WIND V-COMPONENT B GRID !m s-1!501!!y_wind!height=50m!rotated_latitude_longitude 1!15214!ERTEL POTENTIAL VORTICITY(THETA LEV)!K m2 kg-1 s-1!!407!ertel_potential_vorticity!! 1!15214!ERTEL POTENTIAL VORTICITY(THETA LEV)!K m2 kg-1 s-1!502!601!!! 1!15214!ERTEL POTENTIAL VORTICITY THETA SURF!K m2 kg-1 s-1!606!!ertel_potential_vorticity!! 1!15215!UV ON PRESSURE LEVS. USE MACRO!m2 s-2!!407!product_of_eastward_wind_and_northward_wind!! 1!15215!THETA ON PV=2 SURFACE !K!505!505!air_potential_temperature!! 1!15215!THETA ON PV=+/-2 SURFACE !K!601!!air_potential_temperature!! 1!15216!T ON PRESSURE LEVS U GRID. USE MACRO!K!!407!air_temperature!! 1!15216!THETA AT PV POINTS !K!505!!air_potential_temperature!! 1!15217!UT ON PRESS LEVS U GRID. USE MACRO!K m s-1!!407!product_of_eastward_wind_and_air_temperature!! 1!15217!PV ON MODEL LEVELS(CALC PV) !Pa-1 s-1!505!!potential_vorticity_of_atmosphere_layer!! 1!15218!VT ON PRESS LEVS U GRID. USE MACRO!K m s-1!!407!product_of_northward_wind_and_air_temperature!! 1!15218!THETA ON PV=-2 SURFACE !K!505!505!air_potential_temperature!! 1!15218!PV on model theta levels !Pa-1 s-1!606!!potential_vorticity_of_atmosphere_layer!! 1!15219!T**2 ON PRESS LEVS U GRID. USE MACRO!K2!!407!square_of_air_temperature!! 1!15220!U**2 ON PRESS LEVS U GRID. USE MACRO!m2 s-2!!407!square_of_eastward_wind!! 1!15221!V**2 ON PRESS LEVS U GRID. USE MACRO!m2 s-2!!407!square_of_northward_wind!! 1!15222!OMEGA ON PRESS LEVS U GRID.USE MACRO!Pa s-1!!407!lagrangian_tendency_of_air_pressure!! 1!15223!OMEGA*T ON P LEVS U GRID. USE MACRO!K Pa s-1!!407!product_of_omega_and_air_temperature!! 1!15224!OMEGA*U ON P LEVS U GRID. USE MACRO!Pa m s-2!!407!product_of_eastward_wind_and_omega!! 1!15225!OMEGA*V ON P LEVS U GRID. USE MACRO!Pa m s-2!!407!product_of_northward_wind_and_omega!! 1!15226!SPECIF HUM;P LEVS;U GRID. USE MACRO!1!!407!specific_humidity!! 1!15227!Q*U ON PRESS LEVS U GRID. USE MACRO!m s-1!!407!product_of_eastward_wind_and_specific_humidity!! 1!15228!Q*V ON PRESS LEVS U GRID. USE MACRO!m s-1!!407!product_of_northward_wind_and_specific_humidity!! 1!15229!POTENTIAL VORTICITY ON PRESSURE LEVS!Pa-1 s-1!!407!potential_vorticity_of_atmosphere_layer!! 1!15229!POTENTIAL VORTICITY ON PRESSURE LEVS!Pa-1 s-1!503!!!! 1!15230!THETA ON POT VORT LEVS-SEE CON.B.5.F!K!!407!air_potential_temperature!! 1!15231!TEST FIELD ON UV GRID-SINGLE LEVEL !!!407!!! 1!15231!TEST FIELD ON V-GRID-SINGLE LEVEL !!500!!!! 1!15232!TEST FIELD ON TH GRID-SINGLE LEVEL !!!407!!! 1!15232!TEST FIELD ON P GRID-SINGLE LEVEL !!500!!!! 1!15233!TEST FIELD ON TH GRID-PRESS LEVELS !!!407!!! 1!15233!TEST FIELD ON P GRID-PRESS LEVELS !!500!!!! 1!15234!TEST FIELD ON TH GRID-MODEL LEVELS !!!407!!! 1!15234!TEST FIELD ON P GRID-MODEL LEVELS !!500!!!! 1!15235!q*w on press levs, u grid !Pa s-1!404!407!product_of_omega_and_specific_humidity!! 1!15236!Fract of time pres lev above surface!!404!407!!! 1!15237!Total KE per unit area x10e-6 J/m2 !1e-6 J m-2!404!407!atmosphere_kinetic_energy_content!! 1!15238!Geopotential height, u grid !m!404!407!geopotential_height!! 1!15239!U*Geopotential height, u grid x1.e6 !m2 s-1!404!407!product_of_eastward_wind_and_geopotential_height!! 1!15240!v*Geopotential height, u grid x1.e6 !m2 s-1!404!407!product_of_northward_wind_and_geopotential_height!! 1!15241!mountain torque per unit area N/m !N m-1!404!407!!! 1!15242!W COMPNT (OF WIND) ON PRESSURE LEVS !m s-1!500!!upward_air_velocity!! 1!15243!U WIND ON PRESSURE LEVELS !m s-1!501!!eastward_wind!!true_latitude_longitude 1!15243!U WIND ON PRESSURE LEVELS !m s-1!501!!x_wind!!rotated_latitude_longitude 1!15244!V WIND ON PRESSURE LEVELS !m s-1!501!!northward_wind!!true_latitude_longitude 1!15244!V WIND ON PRESSURE LEVELS !m s-1!501!!y_wind!!rotated_latitude_longitude 1!15245!50 METRE WIND U-COMPONENT !m s-1!501!!eastward_wind!height=50m!true_latitude_longitude 1!15245!50 METRE WIND U-COMPONENT !m s-1!501!!x_wind!height=50m!rotated_latitude_longitude 1!15246!50 METRE WIND V-COMPONENT !m s-1!501!!northward_wind!height=50m!true_latitude_longitude 1!15246!50 METRE WIND V-COMPONENT !m s-1!501!!y_wind!height=50m!rotated_latitude_longitude 1!15260!Rho*w on rho levels !!505!!!! 1!15261!Rho*u*w on rho levels !!505!!!! 1!15262!Rho*v*w on rho levels !!505!!!! 1!15263!Rho*w with w > 0m/s on rho levels !!505!!!! 1!15264!Rho*w with w < 0m/s on rho levels !!505!!!! 1!15265!Rho*w with w > 1m/s on rho levels !!505!!!! 1!15266!Rho*w with w < -1m/s on rho levels !!505!!!! 1!15270!SQU OF NORM OF FOURIER TRANS OF W !!505!!!! 1!15271!True unscaled density !!606!!!! 1!16004!TEMPERATURE ON MODEL LEVELS !K!501!503!air_temperature!! 1!16004!TEMPERATURE ON THETA LEVELS !K!505!!air_temperature!! 1!16140!QCL INCR: pc2 init positive !!706!!!! 1!16141!QCL INCR: pc2 init negative !!706!!!! 1!16142!QCF INCR: pc2 init positive !!706!!!! 1!16143!QCF INCR: pc2 init negative !!706!!!! 1!16146!LIQ CLOUD VOL INCR: pc2 init positiv!!706!!!! 1!16147!LIQ CLOUD VOL INCR: pc2 init negativ!!706!!!! 1!16148!ICE CLOUD VOL INCR: pc2 init positiv!!706!!!! 1!16149!ICE CLOUD VOL INCR: pc2 init negativ!!706!!!! 1!16150!QCL INCR: pc2 pressure change positi!!706!!!! 1!16151!QCL INCR: pc2 pressure change negati!!706!!!! 1!16156!LIQ CLOUD VOL INCR: pc2 press positi!!706!!!! 1!16157!LIQ CLOUD VOL INCR: pc2 press negati!!706!!!! 1!16161!TEMPERATURE INCR: pc2 initialisation!!706!!!! 1!16162!SPECIFIC HUMIDITY INCR: pc2 initiali!!706!!!! 1!16163!QCL INCR: pc2 initialisation !!706!!!! 1!16164!QCF INCR: pc2 initialisation !!706!!!! 1!16172!BULK CLOUD VOL INCR: pc2 initialisat!!706!!!! 1!16173!LIQ CLOUD VOL INCR: pc2 init !!706!!!! 1!16174!ICE CLOUD VOL INCR: pc2 initialise !!706!!!! 1!16181!TEMPERATURE INCR: pc2 pres change !!706!!!! 1!16182!SPECIFIC HUMIDITY INCR: pc2 pressure!!706!!!! 1!16183!QCL INCR: pc2 pressure change !!706!!!! 1!16184!QCF INCR: from pc2 pressure change !!706!!!! 1!16192!BULK CLOUD VOL INCR: pc2 pres change!!706!!!! 1!16193!LIQ CLOUD VOL INCR: pc2 pressure cha!!706!!!! 1!16194!FROZEN CLOUD VOL INCR: pc2 pressure !!706!!!! 1!16201!GEOPOTENTIAL HEIGHT:LAYER BOUNDARIES!m!!407!geopotential_height!! 1!16201!GEOPOTENTIAL HEIGHT ON THETA LEVELS !m!503!!geopotential_height!! 1!16202!GEOPOTENTIAL HEIGHT: PRESSURE LEVELS!m!!601!geopotential_height!! 1!16202!GEOPOTENTIAL HEIGHT ON P LEV/P GRID !m!606!!geopotential_height!! 1!16203!TEMPERATURE ON PRESSURE LEVELS !K!!601!air_temperature!! 1!16203!TEMPERATURE ON P LEV/P GRID !K!606!!air_temperature!! 1!16204!RELATIVE HUMIDITY ON PRESSURE LEVELS!%!!503!relative_humidity!! 1!16204!RELATIVE HUMIDITY WRT ICE ON P LVS !!505!601!!! 1!16204!RH WRT ICE ON P LEV/P GRID !!606!!!! 1!16205!WET BULB POTENTIAL TEMPERATURE !K!!407!!! 1!16205!WET BULB POTENTIAL TEMPERATURE K!K!502!!!! 1!16206!SURFACE SNOW PROBABILITY !!!407!!! 1!16206!CLOUD WATER CONTENT (qc) !!802!!!! 1!16207!ICAO HT OF -20 DEG ISO- NEED P,HT !!!407!!! 1!16207!TOTAL SPECIFIC HUMIDITY (qT) !!802!!!! 1!16208!PRESSURE OF -20 DEG ISO- NEED HT !!!407!!! 1!16209!ICAO HT OF FREEZING LEV- NEED P,HT !!!407!!! 1!16210!HEIGHT OF FREEZING LEV- NEED PRESS !m!!407!freezing_level_altitude!! 1!16211!PRESSURE OF FREEZING LEV- NEED HT !Pa!!407!air_pressure_at_freezing_level!! 1!16212!HT OF CONTRAIL LOWER LIM- NEED UPPER!!!407!!! 1!16213!HT OF CONTRAIL UPPER LIM- NEED LOWER!!!407!!! 1!16214!PRESSURE AT TROP LEV- NEED HT,TEMP !Pa!!407!tropopause_air_pressure!! 1!16215!TEMP AT TROP LEVEL- NEED HT,PRESS !K!!407!tropopause_air_temperature!! 1!16216!HEIGHT OF TROP- NEED TEMP, PRESS !m!!407!tropopause_altitude!! 1!16217!ICAO HT OF TROP- NEED HT,TEMP,PRESS !!!407!!! 1!16218!HEIGHT OF -20 DEG ISO- NEED PRESSURE!!!407!!! 1!16219!THERMAL ADVECTION ON PRESSURE LEVELS!!!407!!! 1!16220!RADIO DUCT HEIGHT- NEED INTENSITY !!!407!!! 1!16221!RADIO DUCT INTENSITY- NEED HEIGHT !!!407!!! 1!16222!PRESSURE AT MEAN SEA LEVEL !Pa!!!air_pressure_at_sea_level!! 1!16223!THERMAL ADVECT AVE OVER 850 700 500 !!!407!!! 1!16224!HEIGHT**2 ON PRESS LEVS. USE MACRO!m2!!407!square_of_geopotential_height!! 1!16225!GEOPOTENTIAL HT OF MODEL LEVEL M!m!!407!geopotential_height!! 1!16226!ATM TRACER 1 (O3 ) ON PRESS LEVS!!401!407!!! 1!16227!ATM TRACER 2 (H2O ) ON PRESS LEVS!!401!407!!! 1!16228!ATM TRACER 3 (CO ) ON PRESS LEVS!!401!407!!! 1!16229!ATM TRACER 4 (CH4 ) ON PRESS LEVS!!401!407!!! 1!16230!ATM TRACER 5 (N2O ) ON PRESS LEVS!!401!407!!! 1!16231!ATM TRACER 6 (NO ) ON PRESS LEVS!!401!407!!! 1!16232!ATM TRACER 7 (NO2 ) ON PRESS LEVS!!401!407!!! 1!16233!ATM TRACER 8 (HNO3 ) ON PRESS LEVS!!401!407!!! 1!16234!ATM TRACER 9 (N2O5 ) ON PRESS LEVS!!401!407!!! 1!16235!ATM TRACER 10 (CLONO2) ON PRESS LEVS!!401!407!!! 1!16236!ATM TRACER 11 (CLO ) ON PRESS LEVS!!401!407!!! 1!16237!ATM TRACER 12 (HCL ) ON PRESS LEVS!!401!407!!! 1!16238!ATM TRACER 13 (CF2CL2) ON PRESS LEVS!!401!407!!! 1!16239!ATM TRACER 14 (CFCL3 ) ON PRESS LEVS!!401!407!!! 1!16240!ATM TRACER 15 (HF ) ON PRESS LEVS!!401!407!!! 1!16241!ATM TRACER 16 (------) ON PRESS LEVS!!401!407!!! 1!16242!ATM TRACER 17 (------) ON PRESS LEVS!!401!407!!! 1!16243!ATM TRACER 18 (------) ON PRESS LEVS!!401!407!!! 1!16244!ATM TRACER 19 (------) ON PRESS LEVS!!401!407!!! 1!16245!ATM TRACER 20 (------) ON PRESS LEVS!!401!407!!! 1!16246!ATM TRACER 21 (H2S ) ON PRESS LEVS!!401!407!!! 1!16247!ATM TRACER 22 (WATER-SOL) PRESS LEVS!!401!407!!! 1!16248!ATM TRACER 23 ("DUST") ON PRESS LEVS!!401!407!!! 1!16249!ATM TRACER 24 (OCEANIC)ON PRESS LEVS!!401!407!!! 1!16250!ATM TRACER 25 (SOOT ) ON PRESS LEVS!!401!407!!! 1!16251!ATM TRACER 26 (VOLC ASH) PRESS LEVS!!401!407!!! 1!16252!ATM TRACER 27 (H2SO4 ) ON PRESS LEVS!!401!407!!! 1!16253!ATM TRACER 28 ((NH4)2SO4) PRESS LEVS!!401!407!!! 1!16254!ATM TRACER 29 (MINERAL)ON PRESS LEVS!!401!407!!! 1!16255!GEOPOTENTIAL HEIGHT ON RHO LEVELS !m!503!!geopotential_height!! 1!16256!RELATIVE HUMIDITY WRT WATER ON P LVS!!505!601!!! 1!16256!RH WRT WATER ON P LEV/P GRID !!606!!!! 1!17201!SO4 AIT SURF SETTLEMENT FLUX KG/M2/S!!405!407!!! 1!17202!SO4 ACC SURF SETTLEMENT FLUX KG/M2/S!!405!407!!! 1!17203!MSA MASS MIXING RATIO AFTER TSTEP !1!405!407!!! 1!17203!MSA MASS MIXING RATIO FLUX KG/KG/S !s-1!503!!!! 1!17204!NH3 DEPLETION KG/KG AFTER TSTEP !!405!407!!! 1!17204!NH3 DEPLETION KG/KG AFTER TSTEP !!505!!!! 1!17205!DIMETHYL SULPHIDE EMISSIONS !!601!!!! 1!17206!DMS DRY OXIDATION MMR FLUX KG/KG/S !s-1!606!!!! 1!17207!DMS DRY OXIDATION TO SO2 KG/KG/S !s-1!606!!!! 1!17208!DMS DRY OXIDATION TO SO4 ACC KG/KG/S!s-1!606!!!! 1!17209!DMS DRY OXIDATION TO SO4 AIT KG/KG/S!s-1!606!!!! 1!17210!SO2 DRY OXID BY OH MMR FLX KG/KG/S !s-1!606!!!! 1!17211!SO2 WET OXID BY H2O2 FLX KG/KG/S !s-1!606!!!! 1!17212!SO2 WET OXID BY O3 FLX KG/KG/S !s-1!606!!!! 1!17213!SO4 DIS TO ACC BY EVAP FLX KG/KG/S !s-1!606!!!! 1!17214!SO4 ACC TO DIS BY NUCL FLX KG/KG/S !s-1!606!!!! 1!17215!SO4 AIT TO DIS BY DIFF FLX KG/KG/S !s-1!606!!!! 1!17216!SO4 AIT TO ACC BY COAG FLX KG/KG/S !s-1!606!!!! 1!17217!SO2 DRY OXID TO SO4 ACC FLX KG/KG/S !s-1!606!!!! 1!17218!SO2 DRY OXID TO SO4 AIT FLX KG/KG/S !s-1!606!!!! 1!17219!SO4 AIT-ACC BY MODE MERGING kg/kg/s !s-1!606!!!! 1!17220!PM10 CONCENTRATION !!703!707!!! 1!17220!PM10 CONCENTRATION !!708!!!! 1!17221!PM2.5 CONCENTRATION !!703!707!!! 1!17221!PM2.5 CONCENTRATION !!708!!!! 1!17222!SULPHATE CONTRIB TO PM10 CONC !!703!707!!! 1!17222!SULPHATE CONTRIB TO PM10 CONC !!708!!!! 1!17223!SULPHATE CONTRIB TO PM2.5 CONC !!703!707!!! 1!17223!SULPHATE CONTRIB TO PM2.5 CONC !!708!!!! 1!17224!BLACK CARBON CONTRIB TO PM10 CONC !!703!707!!! 1!17224!BLACK CARBON CONTRIB TO PM10 CONC !!708!!!! 1!17225!BLACK CARBON CONTRIB TO PM2.5 CONC !!703!707!!! 1!17225!BLACK CARBON CONTRIB TO PM2.5 CONC !!708!!!! 1!17226!BIOM BURNING CONTRIB TO PM10 CONC !!703!707!!! 1!17226!BIOM BURNING CONTRIB TO PM10 CONC !!708!!!! 1!17227!BIOM BURNING CONTRIB TO PM2.5 CONC !!703!707!!! 1!17227!BIOM BURNING CONTRIB TO PM2.5 CONC !!708!!!! 1!17228!OCFF CONTRIB TO PM10 CONC !!703!707!!! 1!17228!OCFF CONTRIB TO PM10 CONC !!708!!!! 1!17229!OCFF CONTRIB TO PM2.5 CONC !!703!707!!! 1!17229!OCFF CONTRIB TO PM2.5 CONC !!708!!!! 1!17230!SOA CONTRIB TO PM10 CONC !!703!707!!! 1!17230!SOA CONTRIB TO PM10 CONC !!708!!!! 1!17231!SOA CONTRIB TO PM2.5 CONC !!703!707!!! 1!17231!SOA CONTRIB TO PM2.5 CONC !!708!!!! 1!17232!SEA SALT CONTRIB TO PM10 CONC !!703!707!!! 1!17232!SEA SALT CONTRIB TO PM10 CONC !!708!!!! 1!17233!SEA SALT CONTRIB TO PM2.5 CONC !!703!707!!! 1!17233!SEA SALT CONTRIB TO PM2.5 CONC !!708!!!! 1!17234!DUST CONTRIB TO PM10 CONC !!703!707!!! 1!17234!DUST CONTRIB TO PM10 CONC !!708!!!! 1!17235!DUST CONTRIB TO PM2.5 CONC !!703!707!!! 1!17235!DUST CONTRIB TO PM2.5 CONC !!708!!!! 1!17236!NITRATE CONTRIB TO PM10 CONC !!705!707!!! 1!17236!NITRATE CONTRIB TO PM10 CONC !!708!!!! 1!17237!NITRATE CONTRIB TO PM2.5 CONC !!705!707!!! 1!17237!NITRATE CONTRIB TO PM2.5 CONC !!708!!!! 1!17240!NH3 OXID BY HNO3 MMR FLX KG[N]/KG/S !s-1!606.4!606.4!!! 1!17240!NH3 OXID BY HNO3 MMR FLX KG[N]/KG/S !s-1!704!!!! 1!17241!NIT ACC TO DIS BY NUC FLX KG[N]/KG/S!s-1!606.4!606.4!!! 1!17241!NIT ACC TO DIS BY NUC FLX KG[N]/KG/S!s-1!704!!!! 1!17242!NIT DIS-ACC BY EVAP FLX KG[N]/KG/S !s-1!606.4!606.4!!! 1!17242!NIT DIS-ACC BY EVAP FLX KG[N]/KG/S !s-1!704!!!! 1!17257!TOTAL DUST CONC (microg/m3) !microg m-3!708!!!! 1!18001!P* AFTER ASSIMILATION INCREMENTS !!!407!!! 1!18001!ASSIMILATION INCREM. TO TOTAL WATER !!601!708!!! 1!18002!U AFTER ASSIMILATION INCREMENTS !!!407!!! 1!18003!V AFTER ASSIMILATION INCREMENTS !!!407!!! 1!18004!THETA AFTER ASSIMILATION INCREMENTS !K!!407!!! 1!18010!Q AFTER ASSIMILATION INCREMENTS !!!407!!! 1!18201!P* ASSIMILATION WEIGHTS !!!407!!! 1!18202!THETA ASSIMILATION WEIGHTS !!!407!!! 1!18203!WIND ASSIMILATION WEIGHTS !!!407!!! 1!18204!RH ASSIMILATION WEIGHTS !!!407!!! 1!18205!PRECIPITATION RATE ASSIM WEIGHTS !!!407!!! 1!18209!VISIBILITY ASSIMILATION WEIGHTS !!!407!!! 1!18211!P* ASSIMILATION INCREMENT !!!407!!! 1!18212!THETA ASSIMILATION INCREMENT !!!407!!! 1!18213!U ASSIMILATION INCREMENT !!!407!!! 1!18214!RH ASSIMILATION INCREMENT !!!407!!! 1!18215!PRECIPITATION RATE ASSIM INCREMENTS !!!407!!! 1!18219!VISIBILITY ASSIMILATION INCREMENTS !!!407!!! 1!18223!V ASSIMILATION INCREMENT !!!407!!! 1!18231!HYDROSTATIC THETA ASSM INCR(FROM P*)!!!407!!! 1!18241!GEOSTROPHIC U ASSM INCR (FROM P*) !!!407!!! 1!18242!GEOSTROPHIC U ASSM INCR (FROM THETA)!!!407!!! 1!18251!GEOSTROPHIC V ASSM INCR (FROM P*) !!!407!!! 1!18252!GEOSTROPHIC V ASSM INCR (FROM THETA)!!!407!!! 1!18261!P* INCREMENTS FROM WIND BALANCE !!!407!!! 1!18262!THETA INCREMENTS FROM WIND BALANCE !K!!407!!! 1!18271!THETA INCR FROM LS LATENT HEATING !K!!407!!! 1!18272!THETA INCR FROM PRECIP DATA (LHN) !K!!407!!! 1!19001!VEGETATION CARBON ON PFTS KG C/M2!kg m-2!404!407!!! 1!19001!VEGETATION CARBON ON PFTS KG C/M2!kg m-2!503!!!! 1!19002!GRIDBOX MEAN VEG CARBON KG C/M2!kg m-2!404!407!vegetation_carbon_content!! 1!19002!GRIDBOX MEAN VEG CARBON KG C/M2!kg m-2!503!!!! 1!19003!PHENOLOGICAL LEAF TURNOVER RATE !!404!404.1!!! 1!19003!PHENOLOGICAL LEAF TURNOVER RATE PFTS!!405!407!!! 1!19003!PHENOLOGICAL LEAF TURNOVER RATE PFTS!!503!!!! 1!19004!LITTER CARBON ON PFTS KG C/M2/YEAR !kg m-2 year-1!404!407!!! 1!19004!LITTER CARBON ON PFTS KG C/M2/YEAR !kg m-2 year-1!503!!!! 1!19005!GRIDBOX MEAN LITTER CARBN KGC/M2/YR !kg m-2 year-1!404!407!!! 1!19005!GRIDBOX MEAN LITTER CARBN KGC/M2/YR !kg m-2 year-1!503!!!! 1!19006!MEAN LEAF TRNVR RATE PFTS FOR PHENOL!!405!407!!! 1!19006!MEAN LEAF TRNVR RATE PFTS FOR PHENOL!!503!!!! 1!19007!LEAF AREA INDEX PFTS AFTER PHENOLOGY!!405!407!!! 1!19007!LEAF AREA INDEX PFTS AFTER PHENOLOGY!!503!!!! 1!19008!MN LEAF TRNVR RATE PFTS FOR TRIFFID !!405!407!!! 1!19008!MN LEAF TRNVR RATE PFTS FOR TRIFFID !!503!!!! 1!19009!MEAN NPP ON PFTS FOR TRIFFID !!405!407!!! 1!19009!MEAN NPP ON PFTS FOR TRIFFID !!503!!!! 1!19010!MEAN WOOD RESP ON PFTS FOR TRIFFID !!405!407!!! 1!19010!MEAN WOOD RESP ON PFTS FOR TRIFFID !!503!!!! 1!19011!MEAN SOIL RESPIRATION FOR TRIFFID !!405!407!!! 1!19011!MEAN SOIL RESPIRATION FOR TRIFFID !!503!!!! 1!19012!DISTURBED FRACTION OF VEGETATION !!405!407!!! 1!19012!DISTURBED FRACTION OF VEGETATION !!503!!!! 1!19013!SURFACE TYPE FRACTIONS AFTER TRIFFID!!405!407!!! 1!19013!SURFACE TYPE FRACTIONS AFTER TRIFFID!!503!!!! 1!19014!LEAF AREA INDEX PFTS AFTER TRIFFID !!405!407!!! 1!19014!LEAF AREA INDEX PFTS AFTER TRIFFID !!503!!!! 1!19015!CANOPY HEIGHT ON PFTS AFTER TRIFFID !!405!407!!! 1!19015!CANOPY HEIGHT ON PFTS AFTER TRIFFID !!503!!!! 1!19016!SOIL CARBON CONTENT AFTER TRIFFID !kg m-2!405!407!soil_carbon_content!! 1!19016!SOIL CARBON CONTENT AFTER TRIFFID !kg m-2!503!!soil_carbon_content!! 1!19017!DPM SOIL RESP FOR TRIFFID KG C/M2/S!kg m-2 s-1!606!!!! 1!19018!RPM SOIL RESP FOR TRIFFID KG C/M2/S!kg m-2 s-1!606!!!! 1!19019!BIO SOIL RESP FOR TRIFFID KG C/M2/S!kg m-2 s-1!606!!!! 1!19020!HUM SOIL RESP FOR TRIFFID KG C/M2/S!kg m-2 s-1!606!!!! 1!19021!DPM SOIL-C AFTER TRIFFID KGC/M2!kg m-2!606!!!! 1!19022!RPM SOIL-C AFTER TRIFFID KGC/M2!kg m-2!606!!!! 1!19023!BIO SOIL-C AFTER TRIFFID KGC/M2!kg m-2!606!!!! 1!19024!HUM SOIL-C AFTER TRIFFID KGC/M2!kg m-2!606!!!! 1!19025!LEAF CARBON ON PFTS KGC/M2!kg m-2!606.2!606.4!!! 1!19026!GRIDBOX MEAN LEAF CARBON KGC/M2!kg m-2!606.2!606.4!!! 1!19027!WOOD CARBON ON PFTS KGC/M2!kg m-2!606.2!606.4!!! 1!19028!GRIDBOX MEAN WOOD CARBON KGC/M2!kg m-2!606.2!606.4!!! 1!19029!ROOT CARBON ON PFTS KGC/M2!kg m-2!606.2!606.4!!! 1!19030!GRIDBOX MEAN ROOT CARBON KGC/M2!kg m-2!606.2!606.4!!! 1!19031!PREVIOUS DIST FRAC OF VEGETATION !!606.2!606.4!!! 1!19032!FAST TURNOVER WOOD PRODUCT KGC/M2!kg m-2!606.2!606.4!!! 1!19033!MEDIUM TURNOVER WOOD PRODUCT KGC/M2!kg m-2!606.2!606.4!!! 1!19034!SLOW TURNOVER WOOD PRODUCT KGC/M2!kg m-2!606.2!606.4!!! 1!19035!LIT C FROM LU CHANGE (PFT) KGC/M2/YR!kg m-2 year-1!606.2!606.4!!! 1!19036!LU C FLUX TO FAST POOL KGC/M2/YR!kg m-2 year-1!606.2!606.4!!! 1!19037!LU C FLUX TO MEDIUM POOL KGC/M2/YR!kg m-2 year-1!606.2!606.4!!! 1!19038!LU C FLUX TO SLOW POOL KGC/M2/YR!kg m-2 year-1!606.2!606.4!!! 1!19039!FAST POOL DECOMP C FLUX KGC/M2/YR!kg m-2 year-1!606.2!606.4!!! 1!19040!MEDIUM POOL DECOMP C FLUX KGC/M2/YR!kg m-2 year-1!606.2!606.4!!! 1!19041!SLOW POOL DECOMP C FLUX KGC/M2/YR!kg m-2 year-1!606.2!606.4!!! 1!19042!LANDUSE CO2 FLUX TO ATM KGC/M2/YR!kg m-2 year-1!606.2!606.4!!! 1!20001!RIVER WATER STORAGE M2!m2!505!505!!! 1!20001!THICKNESS : 1000-500 MB !!601!!!! 1!20002!GRIDBOX OUTFLOW KG/S!kg s-1!505!505!!! 1!20002!THICKNESS : 1000-850 MB !!601!!!! 1!20003!GRIDBOX INFLOW KG/S!kg s-1!505!505!!! 1!20003!WIND SPEEDS : 10 METRES !m s-1!601!1001!!! 1!20003!WIND SPEEDS : 10 METRES B GRID !m s-1!1002!!!! 1!20004!RIVER OUTFLOW KG/M2/S !kg m-2 s-1!505!505!!! 1!20004!WIND SPEEDS : PRESSURE LEVEL !m s-1!601!!wind_speed!! 1!20005!DIVERGENCE !s-1!601!!divergence_of_wind!! 1!20006!VORTICITY !s-1!601!701!atmosphere_relative_vorticity!! 1!20006!RELATIVE VORTICITY !s-1!702!!atmosphere_relative_vorticity!! 1!20007!MOUNTAIN WAVE TURBULENCE PREDICTOR !!601!!!! 1!20012!CONVECTIVE CLOUD DEPTHS !!601!!!! 1!20013!TOTAL PRECIP ACCUMULATION : 6 HOURS !!601!!!! 1!20014!PRECIPITATION SYMBOL !!601!!!! 1!20015!PRESENT WEATHER CODE !!601!!!! 1!20016!CAT PREDICTOR !!601!!!! 1!20017!MAX CAT !!601!!!! 1!20018!MAX CAT PRESSURE !!601!!!! 1!20020!MAX WIND U-COMPONENT !!601!!!! 1!20021!MAX WIND V-COMPONENT !!601!!!! 1!20022!MAX WIND PRESSURE !!601!!!! 1!20023!MAX WIND ICAO HEIGHT !!601!!!! 1!20024!TROPOPAUSE PRESSURE !Pa!601!!tropopause_air_pressure!! 1!20025!TROPOPAUSE TEMPERATURE !K!601!!tropopause_air_temperature!! 1!20026!TROPOPAUSE HEIGHT !m!601!!tropopause_altitude!! 1!20027!TROPOPAUSE ICAO HEIGHT !!601!!!! 1!20028!SNOW PROBABILITY !!601!!!! 1!20029!CONTRAIL - LOWER LIMIT !!601!!!! 1!20030!CONTRAIL - UPPER LIMIT !!601!!!! 1!20031!THERMAL ADVECTION !!601!!!! 1!20032!MEAN THERMAL ADVECTION !!601!!!! 1!20033!FREEZING LEVEL GEOPOTENTIAL HEIGHT !!601!!!! 1!20034!FREEZING LEVEL PRESSURE !Pa!601!!air_pressure_at_freezing_level!! 1!20035!FREEZING LEVEL ICAO HEIGHT !!601!!!! 1!20036!-20C ISOTHERM GEOPOTENTIAL HEIGHT !!601!!!! 1!20037!-20C ISOTHERM PRESSURE !!601!!!! 1!20038!-20C ISOTHERM ICAO HEIGHT !!601!!!! 1!20039!CONV CLOUD BASE ICAO HEIGHT !!601!!!! 1!20040!CONV CLOUD TOP ICAO HEIGHT !!601!!!! 1!20041!MAXIMUM WIND BASE - ICAO HEIGHT !!601!!!! 1!20042!MAXIMUM WIND TOP - ICAO HEIGHT !!601!!!! 1!20043!WAFC MEAN ICING POTENTIAL !!606!!!! 1!20044!WAFC MAX ICING POTENTIAL !!606!!!! 1!20045!WAFC MEAN IN-CLOUD TURB POTENTIAL !!606!!!! 1!20046!WAFC MAX IN-CLOUD TURB POTENTIAL !!606!!!! 1!20047!WAFC MEAN CAT POTENTIAL !!606!!!! 1!20048!WAFC MAX CAT POTENTIAL !!606!!!! 1!20049!WAFC CB HORIZONTAL EXTENT !!606!!!! 1!20050!WAFC PRESSURE AT CB BASE !!606!!!! 1!20051!WAFC PRESSURE AT CB TOP !!606!!!! 1!20052!WAFC PRESSURE AT EMBD CB BASE !!606!!!! 1!20053!WAFC PRESSURE AT EMBD CB TOP !!606!!!! 1!20054!WAFC ICAO HEIGHT AT CB BASE !!606!!!! 1!20055!WAFC ICAO HEIGHT AT CB TOP !!606!!!! 1!20056!WAFC ICAO HGHT EMBD CB BASE !!606!!!! 1!20057!WAFC ICAO HGHT EMBD CB TOP !!606!!!! 1!20058!SURFACE DUST CONCENTRATION !!701!707!!! 1!20058!SURFACE DUST CONCENTRATION (g/m3) !g m-3!708!!!! 1!20059!2000-5000FT DUST CONCENTRATION !g m-3!701!707!!! 1!20059!2000-5000FT DUST CONCENTRATION(g/m3)!g m-3!708!!!! 1!20060!ZENITH TOTAL DELAY !!702!!!! 1!20061!-70C ISOTHERM GEOPOTENTIAL HEIGHT !!702!!!! 1!20062!-70C ISOTHERM PRESSURE !!702!!!! 1!20063!-70C ISOTHERM ICAO HEIGHT !!702!!!! 1!20064!TROPOPAUSE PRESSURE : GRIB2 !Pa!705!!tropopause_air_pressure!! 1!20065!TROPOPAUSE TEMPERATURE : GRIB2 !K!705!!tropopause_air_temperature!! 1!20066!TROPOPAUSE HEIGHT : GRIB2 !m!705!!tropopause_altitude!! 1!20067!TROPOPAUSE ICAO HEIGHT : GRIB2 !!705!!!! 1!20068!THINNED LARGE SCALE RAINFALL RATE KG/M2/S!kg m-2 s-1!708!708!!! 1!20068!THINNED LS RAINFALL RATE KG/M2/S !!802!!!! 1!20069!THINNED TOTAL PRECIPITATION RATE KG/M2/S!kg m-2 s-1!708!708!!! 1!20069!THINNED TOTAL PRECIP RATE KG/M2/S !kg m-2 s-1!802!!!! 1!20070!VIS AT 1.5M (incl ppn and dust) M!m!802!!!! 1!20071!VIS IN DUST ONLY AT 1.5M M!m!802!!!! 1!20072!CONVECTIVE PRECIP RATE: kg/m2/s !kg m-2 s-1!1002!!!! 1!20073!EXTENDED CONV PRECIP RATE: kg/m2/s !kg m-2 s-1!1002!!!! 1!20074!COLSON-PANOFSKY TURB INDEX m2/s2 !m2 s-2!1002!!!! 1!20075!ELLRODS TI1 TURBULENCE INDEX s-2 !s-2!1002!!!! 1!20076!INVERSE RICHARDSON NUMBER (-) !!1002!!!! 1!21001!CM1: PSTAR AFTER TIMESTEP !!!407!!! 1!21002!CM1: U COMPNT OF WIND AFTER TIMESTEP!!!407!!! 1!21003!CM1: V COMPNT OF WIND AFTER TIMESTEP!!!407!!! 1!21004!CM1: THETA AFTER TIMESTEP !K!!407!!! 1!21010!CM1: SPECIFIC HUMIDITY AFTER TSTEP !!!407!!! 1!21013!CM1: CONV CLOUD AMOUNT AFTER TSTEP !!!407!!! 1!21014!CM1: CONV CLOUD BASE LEV NO AFTER TS!!!407!!! 1!21015!CM1: CONV CLOUD TOP LEV NO AFTER TS !!!407!!! 1!21016!CM1: CONV CLOUD LIQUID WATER PATH !!!407!!! 1!21023!CM1: SNOW AMOUNT AFTER TSTEP KG/M2!kg m-2!!407!!! 1!21024!CM1: SURFACE TEMPERATURE AFTER TS !!!407!!! 1!21025!CM1: BOUNDARY LAYER DEPTH AFTER TS !!!407!!! 1!21026!CM1: ROUGHNESS LENGTH AFTER TIMESTEP!!!407!!! 1!21028!CM1: SURFACE ZONAL CURRENT AFTER TS !!!407!!! 1!21029!CM1: SURFACE MERID CURRENT AFTER TS !!!407!!! 1!21031!CM1: SEA ICE FRACTION AFTER TIMESTEP!!!407!!! 1!21032!CM1: SEA ICE DEPTH (MEAN OVER ICE) M!m!!407!!! 1!21061!CM1: ATM TRACER 1 (CONVEN O3 )!!!407!!! 1!21062!CM1: ATM TRACER 2 (CONVEN H2O )!!!407!!! 1!21063!CM1: ATM TRACER 3 (CONVEN CO )!!!407!!! 1!21064!CM1: ATM TRACER 4 (CONVEN CH4 )!!!407!!! 1!21065!CM1: ATM TRACER 5 (CONVEN N2O )!!!407!!! 1!21066!CM1: ATM TRACER 6 (CONVEN NO )!!!407!!! 1!21067!CM1: ATM TRACER 7 (CONVEN NO2 )!!!407!!! 1!21068!CM1: ATM TRACER 8 (CONVEN HNO3 )!!!407!!! 1!21069!CM1: ATM TRACER 9 (CONVEN N2O5 )!!!407!!! 1!21070!CM1: ATM TRACER 10 (CONVEN CLONO2)!!!407!!! 1!21071!CM1: ATM TRACER 11 (CONVEN CLO )!!!407!!! 1!21072!CM1: ATM TRACER 12 (CONVEN HCL )!!!407!!! 1!21073!CM1: ATM TRACER 13 (CONVEN CF2CL2)!!!407!!! 1!21074!CM1: ATM TRACER 14 (CONVEN CFCL3 )!!!407!!! 1!21075!CM1: ATM TRACER 15 (CONVEN HF )!!!407!!! 1!21076!CM1: ATM TRACER 16 (CONVEN ----- )!!!407!!! 1!21077!CM1: ATM TRACER 17 (CONVEN ----- )!!!407!!! 1!21078!CM1: ATM TRACER 18 (CONVEN ----- )!!!407!!! 1!21079!CM1: ATM TRACER 19 (CONVEN S02 )!!!407!!! 1!21080!CM1: ATM TRACER 20 (CONVEN DMS )!!!407!!! 1!21081!CM1: ATM TRACER 21 (CONVEN H2S )!!!407!!! 1!21082!CM1: ATM TRACER 22 (CONV WATER-SOL )!!!407!!! 1!21083!CM1: ATM TRACER 23 (CONV DUST-LIKE )!!!407!!! 1!21084!CM1: ATM TRACER 24 (CONV OCEANIC )!!!407!!! 1!21085!CM1: ATM TRACER 25 (CONV SOOT )!!!407!!! 1!21086!CM1: ATM TRACER 26 (CONV VOLC ASH )!!!407!!! 1!21087!CM1: ATM TRACER 27 (CONV H2SO4 - )!!!407!!! 1!21088!CM1: ATM TRACER 28 (CONV (NH4)2SO4 )!!!407!!! 1!21089!CM1: ATM TRACER 29 (CONV MINERAL )!!!407!!! 1!21100!FLASH RATE S-1 !s-1!806!!!! 1!21101!STORM LOCATION FLAG !!806!!!! 1!21102!GRAUPEL WATER PATH IN ELEC KG M-2 !kg m-2!806!!!! 1!21103!TOTAL ICE WATER PATH IN ELEC KG M-2 !kg m-2!806!!!! 1!21104!NUMBER OF LIGHTNING FLASHES !!806!!!! 1!21105!FLASH RATE: GRAUP. FLX (MCCAUL) S-1 !s-1!806!!!! 1!21106!FLASH RATE: TOTAL ICE (MCCAUL) S-1 !s-1!806!!!! 1!21201!CM1: U COMP OF WIND ON PRESSURE LEV.!!!407!!! 1!21202!CM1: V COMP OF WIND ON PRESSURE LEV.!!!407!!! 1!21203!CM1: VERT VEL.(OMEGA): PRESSURE LEV.!!!407!!! 1!21205!CM1: CAT PROBABILITY !!!407!!! 1!21206!CM1: HEIGHT OF THE MAX WIND LEVEL !!!407!!! 1!21207!CM1: PRESSURE OF THE MAX WIND LEVEL !!!407!!! 1!21208!CM1: U COMPONENT OF THE MAX WIND !!!407!!! 1!21209!CM1: V COMPONENT OF THE MAX WIND !!!407!!! 1!21210!CM1: GEOPOTENTIAL HT. MODEL HALF LEV!!!407!!! 1!21211!CM1: GEOPOTENTIAL HT. PRESSURE LEV. !!!407!!! 1!21212!CM1: TEMPERATURE ON PRESSURE LEVELS !!!407!!! 1!21213!CM1: RELATIVE HUMIDITY ON PRESS LEVS!!!407!!! 1!21214!CM1: WET BULB POTENTIAL TEMPERATURE !!!407!!! 1!21215!CM1: SURFACE SNOW PROBABILITY !!!407!!! 1!21216!CM1: HEIGHT OF THE FREEZING LEVEL !!!407!!! 1!21217!CM1: PRESSURE OF THE FREEZING LEVEL !!!407!!! 1!21218!CM1: PRESSURE AT THE TROPOPAUSE LEV.!!!407!!! 1!21219!CM1: TEMPERATURE AT THE TROP. LEVEL !!!407!!! 1!21220!CM1: HEIGHT OF THE TROPOPAUSE !!!407!!! 1!21221!CM1: HIGH CLOUD AMOUNT !!!407!!! 1!21222!CM1: MEDIUM CLOUD AMOUNT !!!407!!! 1!21223!CM1: LOW CLOUD AMOUNT !!!407!!! 1!21224!CM1: PRESSURE AT MEAN SEA LEVEL !!!407!!! 1!22001!CM2: PSTAR AFTER TIMESTEP !!!407!!! 1!22002!CM2: U COMPNT OF WIND AFTER TIMESTEP!!!407!!! 1!22003!CM2: V COMPNT OF WIND AFTER TIMESTEP!!!407!!! 1!22004!CM2: THETA AFTER TIMESTEP !K!!407!!! 1!22010!CM2: SPECIFIC HUMIDITY AFTER TSTEP !!!407!!! 1!22013!CM2: CONV CLOUD AMOUNT AFTER TSTEP !!!407!!! 1!22014!CM2: CONV CLOUD BASE LEV NO AFTER TS!!!407!!! 1!22015!CM2: CONV CLOUD TOP LEV NO AFTER TS !!!407!!! 1!22016!CM2: CONV CLOUD LIQUID WATER PATH !!!407!!! 1!22023!CM2: SNOW AMOUNT AFTER TSTEP KG/M2!!!407!!! 1!22024!CM2: SURFACE TEMPERATURE AFTER TS !!!407!!! 1!22025!CM2: BOUNDARY LAYER DEPTH AFTER TS !!!407!!! 1!22026!CM2: ROUGHNESS LENGTH AFTER TIMESTEP!!!407!!! 1!22028!CM2: SURFACE ZONAL CURRENT AFTER TS !!!407!!! 1!22029!CM2: SURFACE MERID CURRENT AFTER TS !!!407!!! 1!22031!CM2: SEA ICE FRACTION AFTER TIMESTEP!!!407!!! 1!22032!CM2: SEA ICE DEPTH (MEAN OVER ICE) M!m!!407!!! 1!22061!CM2: ATM TRACER 1 (CONVEN O3 )!!!407!!! 1!22062!CM2: ATM TRACER 2 (CONVEN H2O )!!!407!!! 1!22063!CM2: ATM TRACER 3 (CONVEN CO )!!!407!!! 1!22064!CM2: ATM TRACER 4 (CONVEN CH4 )!!!407!!! 1!22065!CM2: ATM TRACER 5 (CONVEN N2O )!!!407!!! 1!22066!CM2: ATM TRACER 6 (CONVEN NO )!!!407!!! 1!22067!CM2: ATM TRACER 7 (CONVEN NO2 )!!!407!!! 1!22068!CM2: ATM TRACER 8 (CONVEN HNO3 )!!!407!!! 1!22069!CM2: ATM TRACER 9 (CONVEN N2O5 )!!!407!!! 1!22070!CM2: ATM TRACER 10 (CONVEN CLONO2)!!!407!!! 1!22071!CM2: ATM TRACER 11 (CONVEN CLO )!!!407!!! 1!22072!CM2: ATM TRACER 12 (CONVEN HCL )!!!407!!! 1!22073!CM2: ATM TRACER 13 (CONVEN CF2CL2)!!!407!!! 1!22074!CM2: ATM TRACER 14 (CONVEN CFCL3 )!!!407!!! 1!22075!CM2: ATM TRACER 15 (CONVEN HF )!!!407!!! 1!22076!CM2: ATM TRACER 16 (CONVEN ----- )!!!407!!! 1!22077!CM2: ATM TRACER 17 (CONVEN ----- )!!!407!!! 1!22078!CM2: ATM TRACER 18 (CONVEN ----- )!!!407!!! 1!22079!CM2: ATM TRACER 19 (CONVEN SO2 )!!!400.2!!! 1!22079!CM2: ATM TRACER 19 (CONVEN ---- )!!401!407!!! 1!22080!CM2: ATM TRACER 20 (CONVEN DMS )!!!400.2!!! 1!22080!CM2: ATM TRACER 20 (CONVEN ----- )!!401!407!!! 1!22081!CM2: ATM TRACER 21 (CONVEN H2S )!!!407!!! 1!22082!CM2: ATM TRACER 22 (CONV WATER-SOL )!!!407!!! 1!22083!CM2: ATM TRACER 23 (CONV DUST-LIKE )!!!407!!! 1!22084!CM2: ATM TRACER 24 (CONV OCEANIC )!!!407!!! 1!22085!CM2: ATM TRACER 25 (CONV SOOT )!!!407!!! 1!22086!CM2: ATM TRACER 26 (CONV VOLC ASH )!!!407!!! 1!22087!CM2: ATM TRACER 27 (CONV H2SO4 )!!!407!!! 1!22088!CM2: ATM TRACER 28 (CONV (NH4)2SO4 )!!!407!!! 1!22089!CM2: ATM TRACER 29 (MINERAL )!!!407!!! 1!22201!CM2: U COMP OF WIND ON PRESSURE LEV.!!!407!!! 1!22202!CM2: V COMP OF WIND ON PRESSURE LEV.!!!407!!! 1!22203!CM2: VERT VEL.(OMEGA): PRESSURE LEV.!!!407!!! 1!22205!CM2: CAT PROBABILITY !!!407!!! 1!22206!CM2: HEIGHT OF THE MAX WIND LEVEL !!!407!!! 1!22207!CM2: PRESSURE OF THE MAX WIND LEVEL !!!407!!! 1!22208!CM2: U COMPONENT OF THE MAX WIND !!!407!!! 1!22209!CM2: V COMPONENT OF THE MAX WIND !!!407!!! 1!22210!CM2: GEOPOTENTIAL HT. MODEL HALF LEV!!!407!!! 1!22211!CM2: GEOPOTENTIAL HT. PRESSURE LEV. !!!407!!! 1!22212!CM2: TEMPERATURE ON PRESSURE LEVELS !!!407!!! 1!22213!CM2: RELATIVE HUMIDITY ON PRESS LEVS!!!407!!! 1!22214!CM2: WET BULB POTENTIAL TEMPERATURE !!!407!!! 1!22215!CM2: SURFACE SNOW PROBABILITY !!!407!!! 1!22216!CM2: HEIGHT OF THE FREEZING LEVEL !!!407!!! 1!22217!CM2: PRESSURE OF THE FREEZING LEVEL !!!407!!! 1!22218!CM2: PRESSURE AT THE TROPOPAUSE LEV.!!!407!!! 1!22219!CM2: TEMPERATURE AT THE TROP. LEVEL !!!407!!! 1!22220!CM2: HEIGHT OF THE TROPOPAUSE !!!407!!! 1!22221!CM2: HIGH CLOUD AMOUNT !!!407!!! 1!22222!CM2: MEDIUM CLOUD AMOUNT !!!407!!! 1!22223!CM2: LOW CLOUD AMOUNT !!!407!!! 1!22224!CM2: PRESSURE AT MEAN SEA LEVEL !!!407!!! 1!23001!CM3: PSTAR AFTER TIMESTEP !!!407!!! 1!23002!CM3: U COMPNT OF WIND AFTER TIMESTEP!!!407!!! 1!23003!CM3: V COMPNT OF WIND AFTER TIMESTEP!!!407!!! 1!23004!CM3: THETA AFTER TIMESTEP !K!!407!!! 1!23010!CM3: SPECIFIC HUMIDITY AFTER TSTEP !!!407!!! 1!23013!CM3: CONV CLOUD AMOUNT AFTER TSTEP !!!407!!! 1!23014!CM3: CONV CLOUD BASE LEV NO AFTER TS!!!407!!! 1!23015!CM3: CONV CLOUD TOP LEV NO AFTER TS !!!407!!! 1!23016!CM3: CONV CLOUD LIQUID WATER PATH !!!407!!! 1!23023!CM3: SNOW AMOUNT AFTER TSTEP KG/M2!kg m-2!!407!!! 1!23024!CM3: SURFACE TEMPERATURE AFTER TS !!!407!!! 1!23025!CM3: BOUNDARY LAYER DEPTH AFTER TS !!!407!!! 1!23026!CM3: ROUGHNESS LENGTH AFTER TIMESTEP!!!407!!! 1!23028!CM3: SURFACE ZONAL CURRENT AFTER TS !!!407!!! 1!23029!CM3: SURFACE MERID CURRENT AFTER TS !!!407!!! 1!23031!CM3: SEA ICE FRACTION AFTER TIMESTEP!!!407!!! 1!23032!CM3: SEA ICE DEPTH (MEAN OVER ICE) M!m!!407!!! 1!23061!CM3: ATM TRACER 1 (CONVEN O3 )!!!407!!! 1!23062!CM3: ATM TRACER 2 (CONVEN H2O )!!!407!!! 1!23063!CM3: ATM TRACER 3 (CONVEN CO )!!!407!!! 1!23064!CM3: ATM TRACER 4 (CONVEN CH4 )!!!407!!! 1!23065!CM3: ATM TRACER 5 (CONVEN N2O )!!!407!!! 1!23066!CM3: ATM TRACER 6 (CONVEN NO )!!!407!!! 1!23067!CM3: ATM TRACER 7 (CONVEN NO2 )!!!407!!! 1!23068!CM3: ATM TRACER 8 (CONVEN HNO3 )!!!407!!! 1!23069!CM3: ATM TRACER 9 (CONVEN N2O5 )!!!407!!! 1!23070!CM3: ATM TRACER 10 (CONVEN CLONO2)!!!407!!! 1!23071!CM3: ATM TRACER 11 (CONVEN CLO )!!!407!!! 1!23072!CM3: ATM TRACER 12 (CONVEN HCL )!!!407!!! 1!23073!CM3: ATM TRACER 13 (CONVEN CF2CL2)!!!407!!! 1!23074!CM3: ATM TRACER 14 (CONVEN CFCL3 )!!!407!!! 1!23075!CM3: ATM TRACER 15 (CONVEN HF )!!!407!!! 1!23076!CM3: ATM TRACER 16 (CONVEN ----- )!!!407!!! 1!23077!CM3: ATM TRACER 17 (CONVEN ----- )!!!407!!! 1!23078!CM3: ATM TRACER 18 (CONVEN ----- )!!!407!!! 1!23079!CM3: ATM TRACER 19 (CONVEN SO2 )!!!400.2!!! 1!23079!CM3: ATM TRACER 19 (CONVEN ---- )!!401!407!!! 1!23080!CM3: ATM TRACER 20 (CONVEN DMS )!!!400.2!!! 1!23080!CM3: ATM TRACER 20 (CONVEN ---- )!!401!407!!! 1!23081!CM3: ATM TRACER 21 (CONVEN H2S )!!!407!!! 1!23082!CM3: ATM TRACER 22 (CONV WATER-SOL )!!!407!!! 1!23083!CM3: ATM TRACER 23 (CONV DUST-LIKE )!!!407!!! 1!23084!CM3: ATM TRACER 24 (CONV OCEANIC )!!!407!!! 1!23085!CM3: ATM TRACER 25 (CONV SOOT )!!!407!!! 1!23086!CM3: ATM TRACER 26 (CONV VOLC ASH )!!!407!!! 1!23087!CM3: ATM TRACER 27 (CONV H2SO4 )!!!407!!! 1!23088!CM3: ATM TRACER 28 (CONV (NH4)2SO4 )!!!407!!! 1!23089!CM3: ATM TRACER 29 (CONV MINERAL )!!!407!!! 1!23201!CM3: U COMP OF WIND ON PRESSURE LEV.!!!407!!! 1!23202!CM3: V COMP OF WIND ON PRESSURE LEV.!!!407!!! 1!23203!CM3: VERT VEL.(OMEGA): PRESSURE LEV.!!!407!!! 1!23205!CM3: CAT PROBABILITY !!!407!!! 1!23206!CM3: HEIGHT OF THE MAX WIND LEVEL !!!407!!! 1!23207!CM3: PRESSURE OF THE MAX WIND LEVEL !!!407!!! 1!23208!CM3: U COMPONENT OF THE MAX WIND !!!407!!! 1!23209!CM3: V COMPONENT OF THE MAX WIND !!!407!!! 1!23210!CM3: GEOPOTENTIAL HT. MODEL HALF LEV!!!407!!! 1!23211!CM3: GEOPOTENTIAL HT. PRESSURE LEV. !!!407!!! 1!23212!CM3: TEMPERATURE ON PRESSURE LEVELS !!!407!!! 1!23213!CM3: RELATIVE HUMIDITY ON PRESS LEVS!!!407!!! 1!23214!CM3: WET BULB POTENTIAL TEMPERATURE !!!407!!! 1!23215!CM3: SURFACE SNOW PROBABILITY !!!407!!! 1!23216!CM3: HEIGHT OF THE FREEZING LEVEL !!!407!!! 1!23217!CM3: PRESSURE OF THE FREEZING LEVEL !!!407!!! 1!23218!CM3: PRESSURE AT THE TROPOPAUSE LEV.!!!407!!! 1!23219!CM3: TEMPERATURE AT THE TROP. LEVEL !!!407!!! 1!23220!CM3: HEIGHT OF THE TROPOPAUSE !!!407!!! 1!23221!CM3: HIGH CLOUD AMOUNT !!!407!!! 1!23222!CM3: MEDIUM CLOUD AMOUNT !!!407!!! 1!23223!CM3: LOW CLOUD AMOUNT !!!407!!! 1!23224!CM3: PRESSURE AT MEAN SEA LEVEL !!!407!!! 1!24001!CM4: PSTAR AFTER TIMESTEP !!!407!!! 1!24002!CM4: U COMPNT OF WIND AFTER TIMESTEP!!!407!!! 1!24003!CM4: V COMPNT OF WIND AFTER TIMESTEP!!!407!!! 1!24004!CM4: THETA AFTER TIMESTEP !K!!407!!! 1!24010!CM4: SPECIFIC HUMIDITY AFTER TSTEP !!!407!!! 1!24013!CM4: CONV CLOUD AMOUNT AFTER TSTEP !!!407!!! 1!24014!CM4: CONV CLOUD BASE LEV NO AFTER TS!!!407!!! 1!24015!CM4: CONV CLOUD TOP LEV NO AFTER TS !!!407!!! 1!24016!CM4: CONV CLOUD LIQUID WATER PATH !!!407!!! 1!24023!CM4: SNOW AMOUNT AFTER TSTEP KG/M2!kg m-2!!407!!! 1!24024!CM4: SURFACE TEMPERATURE AFTER TS !!!407!!! 1!24025!CM4: BOUNDARY LAYER DEPTH AFTER TS !!!407!!! 1!24026!CM4: ROUGHNESS LENGTH AFTER TIMESTEP!!!407!!! 1!24028!CM4: SURFACE ZONAL CURRENT AFTER TS !!!407!!! 1!24029!CM4: SURFACE MERID CURRENT AFTER TS !!!407!!! 1!24031!CM4: SEA ICE FRACTION AFTER TIMESTEP!!!407!!! 1!24032!CM4: SEA ICE DEPTH (MEAN OVER ICE) M!m!!407!!! 1!24061!CM4: ATM TRACER 1 (CONVEN O3 )!!!407!!! 1!24062!CM4: ATM TRACER 2 (CONVEN H2O )!!!407!!! 1!24063!CM4: ATM TRACER 3 (CONVEN CO )!!!407!!! 1!24064!CM4: ATM TRACER 4 (CONVEN CH4 )!!!407!!! 1!24065!CM4: ATM TRACER 5 (CONVEN N2O )!!!407!!! 1!24066!CM4: ATM TRACER 6 (CONVEN NO )!!!407!!! 1!24067!CM4: ATM TRACER 7 (CONVEN NO2 )!!!407!!! 1!24068!CM4: ATM TRACER 8 (CONVEN HNO3 )!!!407!!! 1!24069!CM4: ATM TRACER 9 (CONVEN N2O5 )!!!407!!! 1!24070!CM4: ATM TRACER 10 (CONVEN CLONO2)!!!407!!! 1!24071!CM4: ATM TRACER 11 (CONVEN CLO )!!!407!!! 1!24072!CM4: ATM TRACER 12 (CONVEN HCL )!!!407!!! 1!24073!CM4: ATM TRACER 13 (CONVEN CF2CL2)!!!407!!! 1!24074!CM4: ATM TRACER 14 (CONVEN CFCL3 )!!!407!!! 1!24075!CM4: ATM TRACER 15 (CONVEN HF )!!!407!!! 1!24076!CM4: ATM TRACER 16 (CONVEN ----- )!!!407!!! 1!24077!CM4: ATM TRACER 17 (CONVEN ----- )!!!407!!! 1!24078!CM4: ATM TRACER 18 (CONVEN ----- )!!!407!!! 1!24079!CM4: ATM TRACER 19 (CONVEN SO2 )!!!400.2!!! 1!24079!CM4: ATM TRACER 19 (CONVEN ---- )!!401!407!!! 1!24080!CM4: ATM TRACER 20 (CONVEN DMS )!!!400.2!!! 1!24080!CM4: ATM TRACER 20 (CONVEN ---- )!!401!407!!! 1!24081!CM4: ATM TRACER 21 (CONVEN H2S )!!!407!!! 1!24082!CM4: ATM TRACER 22 (CONV WATER-SOL )!!!407!!! 1!24083!CM4: ATM TRACER 23 (CONV DUST-LIKE )!!!407!!! 1!24084!CM4: ATM TRACER 24 (CONV OCEANIC )!!!407!!! 1!24085!CM4: ATM TRACER 25 (CONV SOOT )!!!407!!! 1!24086!CM4: ATM TRACER 26 (CONV VOLC ASH )!!!407!!! 1!24087!CM4: ATM TRACER 27 (CONV H2SO4 )!!!407!!! 1!24088!CM4: ATM TRACER 28 (CONV (NH4)2SO4 )!!!407!!! 1!24089!CM4: ATM TRACER 29 (MINERAL )!!!407!!! 1!24201!CM4: U COMP OF WIND ON PRESSURE LEV.!!!407!!! 1!24202!CM4: V COMP OF WIND ON PRESSURE LEV.!!!407!!! 1!24203!CM4: VERT VEL.(OMEGA): PRESSURE LEV.!!!407!!! 1!24205!CM4: CAT PROBABILITY !!!407!!! 1!24206!CM4: HEIGHT OF THE MAX WIND LEVEL !!!407!!! 1!24207!CM4: PRESSURE OF THE MAX WIND LEVEL !!!407!!! 1!24208!CM4: U COMPONENT OF THE MAX WIND !!!407!!! 1!24209!CM4: V COMPONENT OF THE MAX WIND !!!407!!! 1!24210!CM4: GEOPOTENTIAL HT. MODEL HALF LEV!!!407!!! 1!24211!CM4: GEOPOTENTIAL HT. PRESSURE LEV. !!!407!!! 1!24212!CM4: TEMPERATURE ON PRESSURE LEVELS !!!407!!! 1!24213!CM4: RELATIVE HUMIDITY ON PRESS LEVS!!!407!!! 1!24214!CM4: WET BULB POTENTIAL TEMPERATURE !!!407!!! 1!24215!CM4: SURFACE SNOW PROBABILITY !!!407!!! 1!24216!CM4: HEIGHT OF THE FREEZING LEVEL !!!407!!! 1!24217!CM4: PRESSURE OF THE FREEZING LEVEL !!!407!!! 1!24218!CM4: PRESSURE AT THE TROPOPAUSE LEV.!!!407!!! 1!24219!CM4: TEMPERATURE AT THE TROP. LEVEL !!!407!!! 1!24220!CM4: HEIGHT OF THE TROPOPAUSE !!!407!!! 1!24221!CM4: HIGH CLOUD AMOUNT !!!407!!! 1!24222!CM4: MEDIUM CLOUD AMOUNT !!!407!!! 1!24223!CM4: LOW CLOUD AMOUNT !!!407!!! 1!24224!CM4: PRESSURE AT MEAN SEA LEVEL !!!407!!! 1!26001!RIVER WATER STORAGE M2!m2!601!606.2!!! 1!26001!RIVER WATER STORAGE KG!kg!606.3!606.4!!! 1!26001!RIVER WATER STORAGE M2!m2!701!704!!! 1!26001!RIVER WATER STORAGE KG!kg!705!!!! 1!26002!GRIDBOX OUTFLOW KG/S!!601!!!! 1!26003!GRIDBOX INFLOW KG/S!!601!!!! 1!26004!RIVER OUTFLOW KG/M2/S !!601!!!! 1!26006!INLANDBASINFLOW TRIP GRID KG/S !!606!!!! 1!30001!U COMPNT OF WIND RHO GRID X1.E-16 !!501!501!!! 1!30001!U COMPNT OF WIND RHO GRID !m s-1!502!!eastward_wind!!true_latitude_longitude 1!30001!U COMPNT OF WIND RHO GRID !m s-1!502!!x_wind!!rotated_latitude_longitude 1!30002!V COMPNT OF WIND RHO GRID X1.E-16 !!501!501!!! 1!30002!V COMPNT OF WIND RHO GRID !m s-1!502!!northward_wind!!true_latitude_longitude 1!30002!V COMPNT OF WIND RHO GRID !m s-1!502!!y_wind!!rotated_latitude_longitude 1!30003!W COMPNT OF WIND RHO GRID X1.E-16 !!501!501!!! 1!30003!W COMPNT OF WIND RHO GRID !m s-1!502!!upward_air_velocity!! 1!30004!TEMPERATURE RHO GRID X1.E-16 !!501!501!!! 1!30004!TEMPERATURE RHO GRID !K!502!!air_temperature!! 1!30005!SPECIFIC HUMIDITY RHO GRID X1.E-16 !!501!501!!! 1!30005!SPECIFIC HUMIDITY RHO GRID !1!502!!specific_humidity!! 1!30006!RELATIVE HUMIDITY RHO GRID X1.E-16 !!501!503!!! 1!30006!height model levels RHO GRID M !!505!!!! 1!30007!GEOPENTIAL HEIGHT RHO GRID X1.E-16 !!501!503!!! 1!30007!KE model levels RHO GRID m2/s2 !!505!!!! 1!30008!OMEGA RHO GRID X1.E-16 !!501!503!!! 1!30008!OMEGA ON THETA LEVELS (C GRID) !!802!!!! 1!30011!UU RHO GRID X1.E-16 !!501!503!!! 1!30011!U*U*rho_dry*dr X1.E-5 kg/s2 !!505!!!! 1!30012!UV RHO GRID X1.E-16 !!501!503!!! 1!30012!U*V*rho_dry*dr X1.E-5 kg/s2 !!505!!!! 1!30013!UW RHO GRID X1.E-16 !!501!503!!! 1!30013!U*W*rho_dry*dr X1.E-5 kg/s2 !!505!!!! 1!30014!UT RHO GRID X1.E-16 !!501!503!!! 1!30014!U*T*rho_dry*dr X1.E-5 kgK/ms !!505!!!! 1!30015!UQ RHO GRID X1.E-16 !!501!503!!! 1!30015!U*Q*rho_dry*dr X1.E-5 kg/ms !!505!!!! 1!30016!U*Z*rho_dry*dr X1.E-5 kg/s !!505!!!! 1!30017!UZ RHO GRID X1.E-16 !!501!503!!! 1!30017!U*KE*rho_dry*dr X1.E-5 kgm/s3!!505!!!! 1!30018!UOM RHO GRID X1.E-16 !!501!503!!! 1!30022!VV RHO GRID X1.E-16 !!501!503!!! 1!30022!V*V*rho_dry*dr X1.E-5 kg/s2 !!505!!!! 1!30023!VW RHO GRID X1.E-16 !!501!503!!! 1!30023!V*W*rho_dry*dr X1.E-5 kg/s2 !!505!!!! 1!30024!VT RHO GRID X1.E-16 !!501!503!!! 1!30024!V*T*rho_dry*dr X1.E-5 kgK/ms !!505!!!! 1!30025!VQ RHO GRID X1.E-16 !!501!503!!! 1!30025!V*Q *rho_dry*dr X1.E-5 kg/ms !!505!!!! 1!30026!V*Z*rho_dry*dr X1.E-5 kg/s !!505!!!! 1!30027!VZ RHO GRID X1.E-16 !!501!503!!! 1!30027!V*KE*rho_dry*dr X1.E-5 kgm/s3!!505!!!! 1!30028!VOM RHO GRID X1.E-16 !!501!503!!! 1!30033!WW RHO GRID X1.E-16 !!501!503!!! 1!30033!W*W*rho_dry*dr X1.E-5 kg/s2 !!505!!!! 1!30034!WT RHO GRID X1.E-16 !!501!503!!! 1!30034!W*T*rho_dry*dr X1.E-5 kgK/ms !!505!!!! 1!30035!WQ RHO GRID X1.E-16 !!501!503!!! 1!30035!W*Q *rho_dry*dr X1.E-5 kg/ms !!505!!!! 1!30036!W*Z*rho_dry*dr X1.E-5 kg/s !!505!!!! 1!30037!WZ RHO GRID X1.E-16 !!501!503!!! 1!30037!W*KE*rho_dry*dr X1.E-5 kgm/s3!!505!!!! 1!30038!WOM RHO GRID X1.E-16 !!501!503!!! 1!30044!TT RHO GRID X1.E-16 !!501!503!!! 1!30044!T*T*rho_dry*dr X1.E-5 kgK2/m2 !!505!!!! 1!30045!TQ RHO GRID X1.E-16 !!501!503!!! 1!30045!T*Q*rho_dry*dr X1.E-5 kgK/m2 !!505!!!! 1!30046!TZ*rho_dry*dr X1.E-5 kgK/m !!505!!!! 1!30047!TZ RHO GRID X1.E-16 !!501!503!!! 1!30047!T*KE*rho_dry*dr X1.E-5 kgK/s2!!505!!!! 1!30048!TOM RHO GRID X1.E-16 !!501!503!!! 1!30055!QQ RHO GRID X1.E-16 !!501!503!!! 1!30055!QQ*rho_dry*dr X1.E-5 kg/m2 !!505!!!! 1!30056!Q*Z*rho_dry*dr X1.E-5 kg !!505!!!! 1!30057!QZ RHO GRID X1.E-16 !!501!503!!! 1!30057!Q*KE*rho_dry*dr X1.E-5 kg/s2 !!505!!!! 1!30058!QOM RHO GRID X1.E-16 !!501!503!!! 1!30066!Z*Z*rho_dry*dr X1.E-5 kg !!505!!!! 1!30067!Z*KE*rho_dry*dr X1.E-5 kg/ms2!!505!!!! 1!30077!ZZ RHO GRID X1.E-16 !!501!503!!! 1!30077!KE*KE*rho_dry*dr X1.E-5 kg/m4s4!!505!!!! 1!30078!ZOM RHO GRID X1.E-16 !!501!!!! 1!30088!OMOM RHO GRID X1.E-16 !!501!503!!! 1!30101!U MASS WEIGHTED RHO GRID X1.E-16 !!502!503!!! 1!30101!U MASS WEIGHTED RHO GRID kgm/s !!505!!!! 1!30102!V MASS WEIGHTED RHO GRID X1.E-16 !!502!503!!! 1!30102!V MASS WEIGHTED RHO GRID kg/ms !!505!!!! 1!30103!W MASS WEIGHTED RHO GRID X1.E-16 !!502!503!!! 1!30103!W MASS WEIGHTED RHO GRID kg/ms !!505!!!! 1!30104!T MASS WEIGHTED RHO GRID X1.E-16 !!502!503!!! 1!30104!T MASS WEIGHTED RHO GRID kgK/m2 !!505!!!! 1!30105!Q MASS WEIGHTED RHO GRID X1.E-16 !!502!503!!! 1!30105!Q MASS WEIGHTED RHO GRID kg/m2 !!505!!!! 1!30106!height mass weighted kg/m !!505!!!! 1!30107!KE mass weighted RHO GRID kg/s2 !!505!!!! 1!30111!T AT EOT ON MODEL LEVELS !K!502!!air_temperature!! 1!30112!WBIG Set to 1 if w GT 1.0m/s !!505!!!! 1!30113!RH on model levels at end timestep !%!505!!relative_humidity!! 1!30114!WBIG Set to 1 if w GT 0.1m/s !!505!!!! 1!30115!DRY MASS WEIGHTING MODEL LEV KG/M2!!505!!!! 1!30171!dT**2 TOTAL INC ON MODEL LEVELS !!505!!!! 1!30172!dQ**2 TOTAL INC ON MODEL LEVELS !!505!!!! 1!30173!dQcl**2 TOTAL INC ON MODEL LEVELS !!505!!!! 1!30174!dQcf**2 TOTAL INC ON MODEL LEVELS !!505!!!! 1!30175!dU**2 TOTAL INC ON MODEL LEVELS !!505!!!! 1!30176!dV**2 TOTAL INC ON MODEL LEVELS !!505!!!! 1!30177!dW**2 TOTAL INC ON MODEL LEVELS !!505!!!! 1!30178!dRHO**2 TOTAL INC ON MODEL LEVELS !!505!!!! 1!30181!T TOTAL INCREMENT ON MODEL LEVELS !K s-1!502!!tendency_of_air_temperature!user_delta_t! 1!30182!Q TOTAL INCREMENT ON MODEL LEVELS !s-1!502!!tendency_of_specific_humidity!user_delta_t! 1!30183!QCL TOTAL INCREMENT ON MODEL LEVELS !s-1!502!!tendency_of_mass_fraction_of_cloud_liquid_water_in_air!user_delta_t! 1!30184!QCF TOTAL INCREMENT ON MODEL LEVELS !s-1!502!!tendency_of_mass_fraction_of_cloud_ice_in_air!user_delta_t! 1!30185!U TOTAL INCREMENT ON MODEL LEVELS !m s-1!502!!tendency_of_eastward_wind!user_delta_t! 1!30186!V TOTAL INCREMENT ON MODEL LEVELS !m s-1!502!!tendency_of_northward_wind!user_delta_t! 1!30187!W TOTAL INCREMENT ON MODEL LEVELS !m s-1!502!!tendency_of_upward_air_velocity!user_delta_t! 1!30188!RHO TOTAL INCREMENT ON MODEL LEVELS !kg m-3 s-1!502!!tendency_of_air_density!user_delta_t! 1!30189!RAIN TOTAL INCREMENT ON MODEL LEVELS!!705!!!! 1!30190!GRAUPEL TOTAL INC ON MODEL LEVELS !!705!!!! 1!30191!QCF2 TOTAL INCREMENT ON MODEL LEVELS!!705!!!! 1!30201!U COMPNT OF WIND ON P LEV/UV GRID !m s-1!501!!eastward_wind!! 1!30202!V COMPNT OF WIND ON P LEV/UV GRID !m s-1!501!!northward_wind!! 1!30203!W COMPNT OF WIND ON P LEV/UV GRID !m s-1!501!!upward_air_velocity!! 1!30204!TEMPERATURE ON P LEV/UV GRID !K!501!!air_temperature!! 1!30205!SPECIFIC HUMIDITY ON P LEV/UV GRID !1!501!!specific_humidity!! 1!30206!RELATIVE HUMIDITY ON P LEV/UV GRID !%!501!601!relative_humidity!! 1!30206!RH WRT WATER ON P LEV/UV GRID !!606!606.2!!! 1!30206!RELATIVE HUMIDITY ON P LEV/UV GRID !!606.3!606.4!!! 1!30206!RH WRT WATER ON P LEV/UV GRID !!701!708!!! 1!30206!RELATIVE HUMIDITY ON P LEV/UV GRID !!802!!!! 1!30207!GEOPENTIAL HEIGHT ON P LEV/UV GRID !m!501!601!geopotential_height!! 1!30207!GEOPOTENTIAL HEIGHT ON P LEV/UV GRID!m!606!!geopotential_height!! 1!30208!OMEGA ON P LEV/UV GRID !Pa s-1!501!!lagrangian_tendency_of_air_pressure!! 1!30211!UU ON P LEV/UV GRID !m2 s-2!501!!square_of_eastward_wind!! 1!30212!UV ON P LEV/UV GRID !m2 s-2!501!!product_of_eastward_wind_and_northward_wind!! 1!30213!UW ON P LEV/UV GRID !m2 s-2!501!!product_of_eastward_wind_and_upward_air_velocity!! 1!30214!UT ON P LEV/UV GRID !K m s-1!501!!product_of_eastward_wind_and_air_temperature!! 1!30215!UQ ON P LEV/UV GRID !m s-1!501!!product_of_eastward_wind_and_specific_humidity!! 1!30217!UZ ON P LEV/UV GRID !m2 s-1!501!!product_of_eastward_wind_and_geopotential_height!! 1!30218!UOM ON P LEV/UV GRID !Pa m s-1!501!!product_of_eastward_wind_and_omega!! 1!30222!VV ON P LEV/UV GRID !m2 s-2!501!!square_of_northward_wind!! 1!30223!VW ON P LEV/UV GRID !m2 s-2!501!!product_of_northward_wind_and_upward_air_velocity!! 1!30224!VT ON P LEV/UV GRID !K m s-1!501!!product_of_northward_wind_and_air_temperature!! 1!30225!VQ ON P LEV/UV GRID !m s-1!501!!product_of_northward_wind_and_specific_humidity!! 1!30227!VZ ON P LEV/UV GRID !m2 s-1!501!!product_of_northward_wind_and_geopotential_height!! 1!30228!VOM ON P LEV/UV GRID !Pa m s-1!501!!product_of_northward_wind_and_omega!! 1!30233!WW ON P LEV/UV GRID !m2 s-2!501!!square_of_upward_air_velocity!! 1!30234!WT ON P LEV/UV GRID !K m s-1!501!!product_of_upward_air_velocity_and_air_temperature!! 1!30235!WQ ON P LEV/UV GRID !m s-1!501!!product_of_upward_air_velocity_and_specific_humidity!! 1!30237!WZ ON P LEV/UV GRID !!501!!!! 1!30238!WOM ON P LEV/UV GRID !!501!!!! 1!30244!TT ON P LEV/UV GRID !K2!501!!square_of_air_temperature!! 1!30245!TQ ON P LEV/UV GRID !K!501!!product_of_air_temperature_and_specific_humidity!! 1!30247!TZ ON P LEV/UV GRID !!501!!!! 1!30248!TOM ON P LEV/UV GRID !K Pa s-1!501!!product_of_air_temperature_and_omega!! 1!30255!QQ ON P LEV/UV GRID !!501!!!! 1!30257!QZ ON P LEV/UV GRID !!501!!!! 1!30258!QOM ON P LEV/UV GRID !Pa s-1!501!!product_of_specific_humidity_and_omega!! 1!30277!ZZ ON P LEV/UV GRID !m2!501!!square_of_geopotential_height!! 1!30278!ZOM ON P LEV/UV GRID !Pa m s-1!501!!product_of_geopotential_height_and_omega!! 1!30288!OMOM ON P LEV/UV GRID !Pa2 s-2!501!!square_of_lagrangian_tendency_of_air_pressure!! 1!30301!HEAVYSIDE FN ON P LEV/UV GRID !!501!!!! 1!30302!VIRUAL TEMPERATURE ON P LEV/UV GRID !K!501!601!virtual_temperature!! 1!30302!VIRTUAL TEMPERATURE ON P LEV/UV GRID!K!606!!virtual_temperature!! 1!30303!VIRUAL TEMP*OMEGA ON P LEV/UV GRID !!501!601!!! 1!30303!VIRTUAL TEMP*OMEGA ON P LEV/UV GRID!!606!!!! 1!30310!RESIDUAL MN MERID. CIRC. VSTARBAR !m s-1!606.4!606.4!northward_transformed_eulerian_mean_air_velocity!! 1!30310!RESIDUAL MN MERID. CIRC. VSTARBAR !!704!!!! 1!30311!RESIDUAL MN MERID. CIRC. WSTARBAR !m s-1!606.4!606.4!northward_transformed_eulerian_mean_air_velocity!! 1!30311!RESIDUAL MN MERID. CIRC. WSTARBAR !!704!!!! 1!30312!ELIASSEN-PALM FLUX (MERID. COMPNT) !m3 s-2!606.4!606.4!northward_eliassen_palm_flux_in_air!! 1!30312!ELIASSEN-PALM FLUX (MERID. COMPNT) !!704!!!! 1!30313!ELIASSEN-PALM FLUX (VERT. COMPNT) !m3 s-2!606.4!606.4!upward_eliassen_palm_flux_in_air!! 1!30313!ELIASSEN-PALM FLUX (VERT. COMPNT) !!704!!!! 1!30314!DIVERGENCE OF ELIASSEN-PALM FLUX !m s-2!606.4!606.4!tendency_of_eastward_wind_due_to_eliassen_palm_flux_divergence!! 1!30314!DIVERGENCE OF ELIASSEN-PALM FLUX !!704!!!! 1!30315!MERIDIONAL HEAT FLUX !!606.4!606.4!!! 1!30315!MERIDIONAL HEAT FLUX !!704!!!! 1!30316!MERIDIONAL MOMENTUM FLUX !!606.4!606.4!!! 1!30316!MERIDIONAL MOMENTUM FLUX !!704!!!! 1!30401!TOTAL KE PER UNIT AREA RHO GRID !J m-2!501!!atmosphere_kinetic_energy_content!! 1!30402!TOTAL KE PER UA WITH W RHO GRID !!501!!!! 1!30403!TOTAL COLUMN DRY MASS RHO GRID !!501!!!! 1!30404!TOTAL COLUMN WET MASS RHO GRID !!501!!!! 1!30405!TOTAL COLUMN QCL RHO GRID !kg m-2!501!!atmosphere_cloud_liquid_water_content!! 1!30406!TOTAL COLUMN QCF RHO GRID !kg m-2!501!!atmosphere_cloud_ice_content!! 1!30407!TOTAL MOISTURE FLUX U RHO GRID !!501!!!! 1!30408!TOTAL MOISTURE FLUX V RHO GRID !!501!!!! 1!30409!TOTAL MOISTURE FLUX W RHO GRID !!501!!!! 1!30410!MOUNTAIN TORQUE PER UNIT AREA N/M !!501!!!! 1!30411!ANGULAR MOMENTUM M1 KG M2/S X10-24!!501!!!! 1!30412!ANGULAR MOMENTUM M2 KG M2/S X10-24!!501!!!! 1!30413!ANGULAR MOMENTUM M3 KG M2/S X10-24!!501!!!! 1!30414!ANGULAR MOMENTUM W1 KG M2/S X10-24!!501!!!! 1!30415!ANGULAR MOMENTUM W2 KG M2/S X10-24!!501!!!! 1!30416!ANGULAR MOMENTUM W3 KG M2/S X10-24!!501!!!! 1!30417!PSTAR P GRID !Pa!502!!surface_air_pressure!! 1!30418!PSTAR UV GRID !Pa!502!!surface_air_pressure!! 1!30419!ENERGY CORR P GRID IN COLUMN W/M2 !W m-2!502!!!! 1!30420!column integral cvT per unit area !!505!!!! 1!30421!column integral gr per unit area !!505!!!! 1!30422!dry mass col int u*gz per unit area !!505!!!! 1!30423!dry mass col int v*gz per unit area !!505!!!! 1!30424!dry mass col int w*gz per unit area !!505!!!! 1!30425!dry mass col int u*T per unit area !!505!!!! 1!30426!dry mass col int v*T per unit area !!505!!!! 1!30427!dry mass col int w*T per unit area !!505!!!! 1!30428!dry mass col int u*q per unit area !!505!!!! 1!30429!dry mass col int v*q per unit area !!505!!!! 1!30430!dry mass col int w*q per unit area !!505!!!! 1!30431!dry mass col int u*v per unit area !!505!!!! 1!30432!dry mass col int u*w per unit area !!505!!!! 1!30433!dry mass col int v*w per unit area !!505!!!! 1!30434!dry mass col int u*KE per unit area !!505!!!! 1!30435!dry mass col int v*KE per unit area !!505!!!! 1!30436!dry mass col int w*KE per unit area !!505!!!! 1!30437!dry mass col int u per unit area !!505!!!! 1!30438!dry mass col int v per unit area !!505!!!! 1!30439!dry mass col int w per unit area !!505!!!! 1!30440!mountain x-surf. pressure drag N/m-2!N m-2!505!!!! 1!30441!mountain y-surf. pressure drag N/m-2!N m-2!505!!!! 1!30442!COLUMN SATURATION FRACTION !!705!!!! 1!30451!Pressure at Tropopause Level !Pa!503!!tropopause_air_pressure!! 1!30452!Temperature at Tropopause Level !K!503!!tropopause_air_temperature!! 1!30453!Height at Tropopause Level !m!503!!tropopause_altitude!! 1!30454!ICAO HT OF TROP- NEED HT,TEMP,PRESS !!503!!!! 1!30455!VORTICITY 850 !!1002!!!! 1!30456!FILTERED VORTICITY 850 !!1002!!!! 1!30457!VORTICITY TC !!1002!!!! 1!30458!FILTERED VORTICITY TC !!1002!!!! 1!30459!MEAN VORTICITY of req. levels !!1002!!!! 1!30460!FIL MEAN VORT of req. levels !!1002!!!! 1!31001!OROGRAPHY HORIZONTAL BOUNDARY VALUE !!502!!!! 1!31002!U HORIZONTAL BOUNDARY VALUE !!502!!!! 1!31003!V HORIZONTAL BOUNDARY VALUE !!502!!!! 1!31004!W HORIZONTAL BOUNDARY VALUE !!502!!!! 1!31005!DENSITY HORIZONTAL BOUNDARY VALUE !!502!!!! 1!31006!POTENTIAL TEMP HORIZ BOUND VALUE !!502!!!! 1!31007!SPECIFIC HUMIDTY HORIZ BOUND VALUE !!502!!!! 1!31008!QCL HORIZONTAL BOUNDARY VALUE !!502!!!! 1!31009!QCF HORIZONTAL BOUNDARY VALUE !!502!!!! 1!31010!EXNER PRESSURE HORIZ BOUND VALUE !!502!!!! 1!31011!U_ADV HORIZONTAL BOUNDARY VALUE !!502!!!! 1!31012!V_ADV HORIZONTAL BOUNDARY VALUE !!502!!!! 1!31013!W_ADV HORIZONTAL BOUNDARY VALUE !!502!!!! 1!31014!CLD ICE (CRY) HORIZ. BOUNDARY VALUE !!505!!!! 1!31015!RAIN HORIZONTAL BOUNDARY VALUE !!505!!!! 1!31016!GRAUPEL HORIZONTAL BOUNDARY VALUE !!505!!!! 1!31017!TOTAL CLOUD FRACTION BOUNDARY VALUE !!601!!!! 1!31018!LIQUID CLOUD FRACTION BOUNDARY VALUE!!601!!!! 1!31019!FROZEN CLOUD FRACTION BOUNDARY VALUE!!601!!!! 1!31020!TOTAL AEROSOL (MURK) BOUNDARY VALUE !!606!!!! 1!31023!DUST DIV 1 BOUNDARY VALUE !!704!!!! 1!31024!DUST DIV 2 BOUNDARY VALUE !!704!!!! 1!31025!DUST DIV 3 BOUNDARY VALUE !!704!!!! 1!31026!DUST DIV 4 BOUNDARY VALUE !!704!!!! 1!31027!DUST DIV 5 BOUNDARY VALUE !!704!!!! 1!31028!DUST DIV 6 BOUNDARY VALUE !!704!!!! 1!31029!SO2 BOUNDARY VALUE !!704!!!! 1!31030!DMS BOUNDARY VALUE !!704!!!! 1!31031!SO4_AITKEN BOUNDARY VALUE !!704!!!! 1!31032!SO4_ACCU BOUNDARY VALUE !!704!!!! 1!31033!SO4_DISS BOUNDARY VALUE !!704!!!! 1!31035!NH3 BOUNDARY VALUE !!704!!!! 1!31036!SOOT_NEW BOUNDARY VALUE !!704!!!! 1!31037!SOOT_AGD BOUNDARY VALUE !!704!!!! 1!31038!SOOT_CLD BOUNDARY VALUE !!704!!!! 1!31039!BMASS_NEW BOUNDARY VALUE !!704!!!! 1!31040!BMASS_AGD BOUNDARY VALUE !!704!!!! 1!31041!BMASS_CLD BOUNDARY VALUE !!704!!!! 1!31042!OCFF_NEW BOUNDARY VALUE !!704!!!! 1!31043!OCFF_AGD BOUNDARY VALUE !!704!!!! 1!31044!OCFF_CLD BOUNDARY VALUE !!704!!!! 1!31045!NITR_ACC BOUNDARY VALUE !!705!!!! 1!31046!NITR_DISS BOUNDARY VALUE !!705!!!! 1!31257!U HORIZONTAL BOUNDARY TENDENCY !!502!!!! 1!31258!V HORIZONTAL BOUNDARY TENDENCY !!502!!!! 1!31259!W HORIZONTAL BOUNDARY TENDENCY !!502!!!! 1!31260!DENSITY HORIZONTAL BOUNDARY TENDENCY!!502!!!! 1!31261!POTENTIAL TEMP HORIZ BOUND TENDENCY !!502!!!! 1!31262!SPECIFIC HUMIDTY HORIZ BOUND TEND !!502!!!! 1!31263!QCL HORIZONTAL BOUNDARY TENDENCY !!502!!!! 1!31264!QCF HORIZONTAL BOUNDARY TENDENCY !!502!!!! 1!31265!EXNER PRESSURE HORIZ BOUND TENDENCY !!502!!!! 1!31266!U_ADV HORIZONTAL BOUNDARY TENDENCY !!502!!!! 1!31267!V_ADV HORIZONTAL BOUNDARY TENDENCY !!502!!!! 1!31268!W_ADV HORIZONTAL BOUNDARY TENDENCY !!502!!!! 1!31269!CLD ICE (CRY) HORIZ. BOUNDARY TEND. !!505!!!! 1!31270!RAIN HORIZONTAL BOUNDARY TENDENCY !!505!!!! 1!31271!GRAUPEL HORIZONTAL BOUNDARY TEND. !!505!!!! 1!31272!TOTAL CLOUD FRACTN BOUNDARY TENDENCY!!601!!!! 1!31273!LIQUID CLOUD FRACN BOUNDARY TENDENCY!!601!!!! 1!31274!FROZEN CLOUD FRACN BOUNDARY TENDENCY!!601!!!! 1!31275!TOTAL AEROSOL (MURK) BOUNDARY TEND. !!606!!!! 1!31276!DUST DIV 1 BOUNDARY TEND. !!704!!!! 1!31277!DUST DIV 2 BOUNDARY TEND. !!704!!!! 1!31278!DUST DIV 3 BOUNDARY TEND. !!704!!!! 1!31279!DUST DIV 4 BOUNDARY TEND. !!704!!!! 1!31280!DUST DIV 5 BOUNDARY TEND. !!704!!!! 1!31281!DUST DIV 6 BOUNDARY TEND. !!704!!!! 1!31282!SO2 BOUNDARY TEND. !!704!!!! 1!31283!DMS BOUNDARY TEND. !!704!!!! 1!31284!SO4_AITKEN BOUNDARY TEND. !!704!!!! 1!31285!SO4_ACCU BOUNDARY TEND. !!704!!!! 1!31286!SO4_DISS BOUNDARY TEND. !!704!!!! 1!31288!NH3 BOUNDARY TEND. !!704!!!! 1!31289!SOOT_NEW BOUNDARY TEND. !!704!!!! 1!31290!SOOT_AGD BOUNDARY TEND. !!704!!!! 1!31291!SOOT_CLD BOUNDARY TEND. !!704!!!! 1!31292!BMASS_NEW BOUNDARY TEND. !!704!!!! 1!31293!BMASS_AGD BOUNDARY TEND. !!704!!!! 1!31294!BMASS_CLD BOUNDARY TEND. !!704!!!! 1!31295!OCFF_NEW BOUNDARY TEND. !!704!!!! 1!31296!OCFF_AGD BOUNDARY TEND. !!704!!!! 1!31297!OCFF_CLD BOUNDARY TEND. !!704!!!! 1!31298!NITR_ACC BOUNDARY TEND. !!705!!!! 1!31299!NITR_DISS BOUNDARY TEND. !!705!!!! 1!32001!OROGRAPHY HORIZONTAL BV OUT !!502!!!! 1!32002!U HORIZONTAL BV OUT !!502!!!! 1!32003!V HORIZONTAL BV OUT !!502!!!! 1!32004!W HORIZONTAL BV OUT !!502!!!! 1!32005!DENSITY HORIZONTAL BV OUT !!502!!!! 1!32006!POTENTIAL TEMP HORIZ BV OUT !!502!!!! 1!32007!SPECIFIC HUMIDTY HORIZ BV OUT !!502!!!! 1!32008!QCL HORIZONTAL BV OUT !!502!!!! 1!32009!QCF HORIZONTAL BV OUT !!502!!!! 1!32010!EXNER PRESSURE HORIZ BV OUT !!502!!!! 1!32011!U_ADV HORIZONTAL BV OUT !!502!!!! 1!32012!V_ADV HORIZONTAL BV OUT !!502!!!! 1!32013!W_ADV HORIZONTAL BV OUT !!502!!!! 1!32014!CLOUD ICE (CRY) HORIZONTAL BV OUT !!505!!!! 1!32015!RAIN HORIZONTAL BV OUT !!505!!!! 1!32016!GRAUPEL HORIZONTAL BV OUT !!505!!!! 1!32017!TOTAL CLOUD FRACTION BV OUT !!601!!!! 1!32018!LIQUID CLOUD FRACTION BV OUT !!601!!!! 1!32019!FROZEN CLOUD FRACTION BV OUT !!601!!!! 1!32020!TOTAL AEROSOL (MURK) BV OUT !!606!!!! 1!32021!ATM FREE TRACER BOUND VAL. OUT !!701!!!! 1!32022!UKCA TRACER BOUND VAL. OUT !!701!!!! 1!32023!DUST DIV 1 BV OUT !!704!!!! 1!32024!DUST DIV 2 BV OUT !!704!!!! 1!32025!DUST DIV 3 BV OUT !!704!!!! 1!32026!DUST DIV 4 BV OUT !!704!!!! 1!32027!DUST DIV 5 BV OUT !!704!!!! 1!32028!DUST DIV 6 BV OUT !!704!!!! 1!32029!SO2 BV OUT !!704!!!! 1!32030!DMS BV OUT !!704!!!! 1!32031!SO4_AITKEN BV OUT !!704!!!! 1!32032!SO4_ACCU BV OUT !!704!!!! 1!32033!SO4_DISS BV OUT !!704!!!! 1!32035!NH3 BV OUT !!704!!!! 1!32036!SOOT_NEW BV OUT !!704!!!! 1!32037!SOOT_AGD BV OUT !!704!!!! 1!32038!SOOT_CLD BV OUT !!704!!!! 1!32039!BMASS_NEW BV OUT !!704!!!! 1!32040!BMASS_AGD BV OUT !!704!!!! 1!32041!BMASS_CLD BV OUT !!704!!!! 1!32042!OCFF_NEW BV OUT !!704!!!! 1!32043!OCFF_AGD BV OUT !!704!!!! 1!32044!OCFF_CLD BV OUT !!704!!!! 1!32045!NITR_ACC BV OUT !!705!!!! 1!32046!NITR_DISS BV OUT !!705!!!! 1!33001!ATM TRACER 1 AFTER TS!!601!606!!! 1!33001!O3 MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!mass_fraction_of_ozone_in_air!! 1!33001!ATM TRACER 1 AFTER TS!!701!!!! 1!33002!ATM TRACER 2 AFTER TS!!601!606!!! 1!33002!NO MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!!! 1!33002!ATM TRACER 2 AFTER TS!!701!!!! 1!33003!ATM TRACER 3 AFTER TS!!601!606!!! 1!33003!NO3 MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!!! 1!33003!ATM TRACER 3 AFTER TS!!701!!!! 1!33004!ATM TRACER 4 AFTER TS!!601!606!!! 1!33004!NO2 MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!mass_fraction_of_nitrogen_dioxide_in_air!! 1!33004!ATM TRACER 4 AFTER TS!!701!!!! 1!33005!ATM TRACER 5 AFTER TS!!601!606!!! 1!33005!N2O5 MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!mass_fraction_of_dinitrogen_pentoxide_in_air!! 1!33005!ATM TRACER 5 AFTER TS!!701!!!! 1!33006!ATM TRACER 6 AFTER TS!!601!606!!! 1!33006!HO2NO2 MASS MIXING RATIO AFTER TSTEP!1!606.2!606.4!mass_fraction_of_peroxynitric_acid_in_air!! 1!33006!ATM TRACER 6 AFTER TS!!701!!!! 1!33007!ATM TRACER 7 AFTER TS!!601!606!!! 1!33007!HONO2 MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!mass_fraction_of_nitric_acid_in_air!! 1!33007!ATM TRACER 7 AFTER TS!!701!!!! 1!33008!ATM TRACER 8 AFTER TS!!601!606!!! 1!33008!H2O2 MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!!! 1!33008!ATM TRACER 8 AFTER TS!!701!!!! 1!33009!ATM TRACER 9 AFTER TS!!601!606!!! 1!33009!CH4 MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!mass_fraction_of_methane_in_air!! 1!33009!ATM TRACER 9 AFTER TS!!701!!!! 1!33010!ATM TRACER 10 AFTER TS!!601!606!!! 1!33010!CO MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!!! 1!33010!ATM TRACER 10 AFTER TS!!701!!!! 1!33011!ATM TRACER 11 AFTER TS!!601!606!!! 1!33011!HCHO MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!!! 1!33011!ATM TRACER 11 AFTER TS!!701!!!! 1!33012!ATM TRACER 12 AFTER TS!!601!606!!! 1!33012!MEOOH MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!!! 1!33012!ATM TRACER 12 AFTER TS!!701!!!! 1!33013!ATM TRACER 13 AFTER TS!!601!606!!! 1!33013!HONO MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!!! 1!33013!ATM TRACER 13 AFTER TS!!701!!!! 1!33014!ATM TRACER 14 AFTER TS!!601!606!!! 1!33014!C2H6 MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!!! 1!33014!ATM TRACER 14 AFTER TS!!701!!!! 1!33015!ATM TRACER 15 AFTER TS!!601!606!!! 1!33015!ETOOH MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!!! 1!33015!ATM TRACER 15 AFTER TS!!701!!!! 1!33016!ATM TRACER 16 AFTER TS!!601!606!!! 1!33016!MECHO MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!!! 1!33016!ATM TRACER 16 AFTER TS!!701!!!! 1!33017!ATM TRACER 17 AFTER TS!!601!606!!! 1!33017!PAN MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!!! 1!33017!ATM TRACER 17 AFTER TS!!701!!!! 1!33018!ATM TRACER 18 AFTER TS!!601!606!!! 1!33018!C3H8 MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!!! 1!33018!ATM TRACER 18 AFTER TS!!701!!!! 1!33019!ATM TRACER 19 AFTER TS!!601!606!!! 1!33019!N-PROOH MASS MIXING RATIO AFTER TS !1!606.2!606.4!!! 1!33019!ATM TRACER 19 AFTER TS!!701!!!! 1!33020!ATM TRACER 20 AFTER TS!!601!606!!! 1!33020!I-PROOH MASS MIXING RATIO AFTER TS !1!606.2!606.4!!! 1!33020!ATM TRACER 20 AFTER TS!!701!!!! 1!33021!ATM TRACER 21 AFTER TS!!601!606!!! 1!33021!ETCHO MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!!! 1!33021!ATM TRACER 21 AFTER TS!!701!!!! 1!33022!ATM TRACER 22 AFTER TS!!601!606!!! 1!33022!ME2CO MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!!! 1!33022!ATM TRACER 22 AFTER TS!!701!!!! 1!33023!ATM TRACER 23 AFTER TS!!601!606!!! 1!33023!MECOCH2OOH MASS MIXING RATIO AFTER T!1!606.2!606.4!!! 1!33023!ATM TRACER 23 AFTER TS!!701!!!! 1!33024!ATM TRACER 24 AFTER TS!!601!606!!! 1!33024!PPAN MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!!! 1!33024!ATM TRACER 24 AFTER TS!!701!!!! 1!33025!ATM TRACER 25 AFTER TS!!601!606!!! 1!33025!MEONO2 MASS MIXING RATIO AFTER TSTEP!1!606.2!606.4!!! 1!33025!ATM TRACER 25 AFTER TS!!701!!!! 1!33026!ATM TRACER 26 AFTER TS!!601!606!!! 1!33026!O3S MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!!! 1!33026!ATM TRACER 26 AFTER TS!!701!!!! 1!33027!ATM TRACER 27 AFTER TS!!601!!!! 1!33028!ATM TRACER 28 AFTER TS!!601!!!! 1!33029!ATM TRACER 29 AFTER TS!!601!!!! 1!33030!ATM TRACER 30 AFTER TS!!601!!!! 1!33031!ATM TRACER 31 AFTER TS!!601!!!! 1!33032!ATM TRACER 32 AFTER TS!!601!!!! 1!33033!ATM TRACER 33 AFTER TS!!601!!!! 1!33034!ATM TRACER 34 AFTER TS!!601!!!! 1!33035!ATM TRACER 35 AFTER TS!!601!!!! 1!33036!ATM TRACER 36 AFTER TS!!601!!!! 1!33037!ATM TRACER 37 AFTER TS!!601!!!! 1!33038!ATM TRACER 38 AFTER TS!!601!!!! 1!33039!ATM TRACER 39 AFTER TS!!601!!!! 1!33040!ATM TRACER 40 AFTER TS!!601!!!! 1!33041!ATM TRACER 41 AFTER TS!1!601!!mole_fraction_of_atomic_chlorine_in_air!! 1!33042!ATM TRACER 42 AFTER TS!1!601!!mole_fraction_of_chlorine_monoxide_in_air!! 1!33043!ATM TRACER 43 AFTER TS!1!601!!mole_fraction_of_dichlorine_peroxide_in_air!! 1!33044!ATM TRACER 44 AFTER TS!1!601!!mole_fraction_of_chlorine_dioxide_in_air!! 1!33045!ATM TRACER 45 AFTER TS!!601!!!! 1!33046!ATM TRACER 46 AFTER TS!!601!!!! 1!33047!ATM TRACER 47 AFTER TS!1!601!!mole_fraction_of_bromine_chloride_in_air!! 1!33048!ATM TRACER 48 AFTER TS!1!601!!mole_fraction_of_bromine_nitrate_in_air!! 1!33049!ATM TRACER 49 AFTER TS!1!601!!mole_fraction_of_nitrous_oxide_in_air!! 1!33050!ATM TRACER 50 AFTER TS!!601!!!! 1!33051!ATM TRACER 51 AFTER TS!1!601!!mole_fraction_of_hypochlorous_acid_in_air!! 1!33052!ATM TRACER 52 AFTER TS!!601!!!! 1!33053!ATM TRACER 53 AFTER TS!!601!!!! 1!33054!ATM TRACER 54 AFTER TS!1!601!!mole_fraction_of_chlorine_nitrate_in_air!! 1!33055!ATM TRACER 55 AFTER TS!1!601!!mole_fraction_of_cfc11_in_air!! 1!33056!ATM TRACER 56 AFTER TS!1!601!!mole_fraction_of_cfc12_in_air!! 1!33057!ATM TRACER 57 AFTER TS!1!601!!!! 1!33058!ATM TRACER 58 AFTER TS!1!601!!mole_fraction_of_atomic_nitrogen_in_air!! 1!33059!ATM TRACER 59 AFTER TS!!601!!!! 1!33060!ATM TRACER 60 AFTER TS!!601!!!! 1!33061!ATM TRACER 61 AFTER TS!!601!!!! 1!33062!ATM TRACER 62 AFTER TS!!601!!!! 1!33063!ATM TRACER 63 AFTER TS!!601!!!! 1!33064!ATM TRACER 64 AFTER TS!!601!!!! 1!33065!ATM TRACER 65 AFTER TS!!601!!!! 1!33066!ATM TRACER 66 AFTER TS!!601!!!! 1!33067!ATM TRACER 67 AFTER TS!!601!!!! 1!33068!ATM TRACER 68 AFTER TS!!601!!!! 1!33069!ATM TRACER 69 AFTER TS!!601!!!! 1!33070!ATM TRACER 70 AFTER TS!!601!!!! 1!33071!ATM TRACER 71 AFTER TS!!601!!!! 1!33072!ATM TRACER 72 AFTER TS!!601!!!! 1!33073!ATM TRACER 73 AFTER TS!!601!!!! 1!33074!ATM TRACER 74 AFTER TS!!601!!!! 1!33075!ATM TRACER 75 AFTER TS!!601!!!! 1!33076!ATM TRACER 76 AFTER TS!!601!!!! 1!33077!ATM TRACER 77 AFTER TS!!601!!!! 1!33078!ATM TRACER 78 AFTER TS!!601!!!! 1!33079!ATM TRACER 79 AFTER TS!!601!!!! 1!33080!ATM TRACER 80 AFTER TS!!601!!!! 1!33081!ATM TRACER 81 AFTER TS!!601!!!! 1!33082!ATM TRACER 82 AFTER TS!!601!!!! 1!33083!ATM TRACER 83 AFTER TS!!601!!!! 1!33084!ATM TRACER 84 AFTER TS!!601!!!! 1!33085!ATM TRACER 85 AFTER TS!!601!!!! 1!33086!ATM TRACER 86 AFTER TS!!601!!!! 1!33087!ATM TRACER 87 AFTER TS!!601!!!! 1!33088!ATM TRACER 88 AFTER TS!!601!!!! 1!33089!ATM TRACER 89 AFTER TS!!601!!!! 1!33090!ATM TRACER 90 AFTER TS!!601!!!! 1!33091!ATM TRACER 91 AFTER TS!!601!!!! 1!33092!ATM TRACER 92 AFTER TS!!601!!!! 1!33093!ATM TRACER 93 AFTER TS!!601!!!! 1!33094!ATM TRACER 94 AFTER TS!!601!!!! 1!33095!ATM TRACER 95 AFTER TS!!601!!!! 1!33096!ATM TRACER 96 AFTER TS!!601!!!! 1!33097!ATM TRACER 97 AFTER TS!!601!!!! 1!33098!ATM TRACER 98 AFTER TS!!601!!!! 1!33099!ATM TRACER 99 AFTER TS!!601!!!! 1!33100!ATM TRACER100 AFTER TS!!601!!!! 1!33101!ATM TRACER101 AFTER TS!!601!!!! 1!33102!ATM TRACER102 AFTER TS!!601!!!! 1!33103!ATM TRACER103 AFTER TS!!601!!!! 1!33104!ATM TRACER104 AFTER TS!!601!!!! 1!33105!ATM TRACER105 AFTER TS!!601!!!! 1!33106!ATM TRACER106 AFTER TS!!601!!!! 1!33107!ATM TRACER107 AFTER TS!!601!!!! 1!33108!ATM TRACER108 AFTER TS!!601!!!! 1!33109!ATM TRACER109 AFTER TS!!601!!!! 1!33110!ATM TRACER110 AFTER TS!!601!!!! 1!33111!ATM TRACER111 AFTER TS!!601!!!! 1!33112!ATM TRACER112 AFTER TS!!601!!!! 1!33113!ATM TRACER113 AFTER TS!!601!!!! 1!33114!ATM TRACER114 AFTER TS!!601!!!! 1!33115!ATM TRACER115 AFTER TS!!601!!!! 1!33116!ATM TRACER116 AFTER TS!!601!!!! 1!33117!ATM TRACER117 AFTER TS!!601!!!! 1!33118!ATM TRACER118 AFTER TS!!601!!!! 1!33119!ATM TRACER119 AFTER TS!!601!!!! 1!33120!ATM TRACER120 AFTER TS!!601!!!! 1!33121!ATM TRACER121 AFTER TS!!601!!!! 1!33122!ATM TRACER122 AFTER TS!!601!!!! 1!33123!ATM TRACER123 AFTER TS!!601!!!! 1!33124!ATM TRACER124 AFTER TS!!601!!!! 1!33125!ATM TRACER125 AFTER TS!!601!!!! 1!33126!ATM TRACER126 AFTER TS!!601!!!! 1!33127!ATM TRACER127 AFTER TS!!601!!!! 1!33128!ATM TRACER128 AFTER TS!!601!!!! 1!33129!ATM TRACER129 AFTER TS!!601!!!! 1!33130!ATM TRACER130 AFTER TS!!601!!!! 1!33131!ATM TRACER131 AFTER TS!!601!!!! 1!33132!ATM TRACER132 AFTER TS!!601!!!! 1!33133!ATM TRACER133 AFTER TS!!601!!!! 1!33134!ATM TRACER134 AFTER TS!!601!!!! 1!33135!ATM TRACER135 AFTER TS!!601!!!! 1!33136!ATM TRACER136 AFTER TS!!601!!!! 1!33137!ATM TRACER137 AFTER TS!!601!!!! 1!33138!ATM TRACER138 AFTER TS!!601!!!! 1!33139!ATM TRACER139 AFTER TS!!601!!!! 1!33140!ATM TRACER140 AFTER TS!!601!!!! 1!33141!ATM TRACER141 AFTER TS!!601!!!! 1!33142!ATM TRACER142 AFTER TS!!601!!!! 1!33143!ATM TRACER143 AFTER TS!!601!!!! 1!33144!ATM TRACER144 AFTER TS!!601!!!! 1!33145!ATM TRACER145 AFTER TS!!601!!!! 1!33146!ATM TRACER146 AFTER TS!!601!!!! 1!33147!ATM TRACER147 AFTER TS!!601!!!! 1!33148!ATM TRACER148 AFTER TS!!601!!!! 1!33149!ATM TRACER149 AFTER TS!!601!!!! 1!33150!ATM TRACER150 AFTER TS!1!601!!age_of_stratospheric_air!! 1!33151!O3P MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!!! 1!33152!O1D MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!!! 1!33153!OH MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!!! 1!33154!HO2 MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!!! 1!33155!MeOO MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!!! 1!33156!EtOO MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!!! 1!33157!MeCO3 MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!!! 1!33158!n-PrOO MASS MIXING RATIO AFTER TSTEP!1!606.2!606.4!!! 1!33159!i-PrOO MASS MIXING RATIO AFTER TSTEP!1!606.2!606.4!!! 1!33160!EtCO3 MASS MIXING RATIO AFTER TSTEP !1!606.2!606.4!!! 1!33161!MeCOCH2OO MASS MIXING RATIO AFTER TS!1!606.2!606.4!!! 1!33162!O3PS MASS MIXING RATIO AFTER TS !1!606.2!606.4!!! 1!33163!O1DS MASS MIXING RATIO AFTER TS !1!606.2!606.4!!! 1!33164!OHS MASS MIXING RATIO AFTER TS !1!606.2!606.4!!! 1!33165!HO2S MASS MIXING RATIO AFTER TS !1!606.2!606.4!!! 1!33166!TROPOSPHERIC CH4 BURDEN (moles) !!606.2!606.4!!! 1!33167!TROPOSPHERIC O3 BURDEN (moles) !!606.2!606.4!!! 1!33168!TROPOSPHERIC OH BURDEN (moles) !!606.2!606.4!!! 1!33169!STRATOSPHERIC CH4 BURDEN (moles) !!606.2!606.4!!! 1!33170!PRESSURE OF PV-THETA TROPOPAUSE (Pa)!Pa!606.2!606.4!!! 1!33171!Strat CH4-OH rxn flux (moles/s) !!606.2!606.4!!! 1!33172!Added Strat CH4 loss (moles/s) !!606.2!606.4!!! 1!33173!Multi-purpose Diagnostic 23 !!606.2!606.4!!! 1!33301!Flux through HO2 + NO Rxn !!606.2!606.4!!! 1!33302!Flux through HO2 + NO3 Rxn !!606.2!606.4!!! 1!33303!Flux through HO2 + O3 Rxn !!606.2!606.4!!! 1!33304!Flux through HO2 + HO2 Bimol Rxn !!606.2!606.4!!! 1!33305!Flux through HO2+MeOO->MeOOH Rxn !!606.2!606.4!!! 1!33306!Flux through HO2+MeOO=HCHO Rxn !!606.2!606.4!!! 1!33307!Flux through HO2 + EtOO Rxn !!606.2!606.4!!! 1!33308!Flux through HO2 + MeCO3 = NULL Rxn !!606.2!606.4!!! 1!33309!Flux through HO2 + MeCO3 = O3 Rxn !!606.2!606.4!!! 1!33310!Flux through HO2+MeCO3=OH+MeOO Rxn !!606.2!606.4!!! 1!33311!Flux through HO2 + n-PrOO Rxn !!606.2!606.4!!! 1!33312!Flux through HO2 + i-PrOO Rxn !!606.2!606.4!!! 1!33313!Flux through HO2 + EtCO3 = O2 Rxn !!606.2!606.4!!! 1!33314!Flux through HO2 + EtCO3 = O3 Rxn !!606.2!606.4!!! 1!33315!Flux through HO2 + MeCOCH2OO Rxn !!606.2!606.4!!! 1!33316!Flux through MeOO+NO=HO2+HCHO+NO2 !!606.2!606.4!!! 1!33317!Flux through MeOO + NO = MeONO2 Rxn !!606.2!606.4!!! 1!33318!Flux through MeOO + NO3 Rxn !!606.2!606.4!!! 1!33319!Flux through MeOO + MeOO = HCHO Rxn !!606.2!606.4!!! 1!33320!Flux through MeOO+MeOO=HO2+HCHO Rxn !!606.2!606.4!!! 1!33321!Flux thru MeOO+MeCO3=HO2+HCHO Rxn !!606.2!606.4!!! 1!33322!Flux through MeOO+MeCO3 = HCHO Rxn !!606.2!606.4!!! 1!33323!Flux through EtOO + NO Rxn !!606.2!606.4!!! 1!33324!Flux through EtOO + NO3 Rxn !!606.2!606.4!!! 1!33325!Flux through EtOO + MeCO3 Rxn !!606.2!606.4!!! 1!33326!Flux through MeCO3 + NO Rxn !!606.2!606.4!!! 1!33327!Flux through MeCO3 + NO3 Rxn !!606.2!606.4!!! 1!33328!Flux through n-PrOO + NO Rxn !!606.2!606.4!!! 1!33329!Flux through n-PrOO + NO3 Rxn !!606.2!606.4!!! 1!33330!Flux through i-PrOO + NO Rxn !!606.2!606.4!!! 1!33331!Flux through i-PrOO + NO3 Rxn !!606.2!606.4!!! 1!33332!Flux through EtCO3 + NO Rxn !!606.2!606.4!!! 1!33333!Flux through EtCO3 + NO3 Rxn !!606.2!606.4!!! 1!33334!Flux through MeCOCH2OO + NO Rxn !!606.2!606.4!!! 1!33335!Flux through MeCOCH2OO + NO3 Rxn !!606.2!606.4!!! 1!33336!Flux through NO + NO3 Rxn !!606.2!606.4!!! 1!33337!Flux through NO + O3 Rxn !!606.2!606.4!!! 1!33338!Flux through NO2 + O3 Rxn !!606.2!606.4!!! 1!33339!Flux through NO3 + HCHO Rxn !!606.2!606.4!!! 1!33340!Flux through NO3 + MeCHO Rxn !!606.2!606.4!!! 1!33341!Flux through NO3 + EtCHO Rxn !!606.2!606.4!!! 1!33342!Flux through NO3 + Me2CO Rxn !!606.2!606.4!!! 1!33343!Flux through N2O5 + H2O Rxn !!606.2!606.4!!! 1!33344!Flux through O(3P) + O3 Rxn !!606.2!606.4!!! 1!33345!Flux through O(1D)+CH4=OH+MeOO Rxn !!606.2!606.4!!! 1!33346!Flux through O(1D)+CH4=HCHO+H2 Rxn !!606.2!606.4!!! 1!33347!Flux through O(1D)+CH4=HCHO+HO2 Rxn !!606.2!606.4!!! 1!33348!Flux through O(1D) + H2O Rxn !!606.2!606.4!!! 1!33349!Flux through O(1D) + N2 Rxn !!606.2!606.4!!! 1!33350!Flux through O(1D) + O2 Rxn !!606.2!606.4!!! 1!33351!Flux through OH + CH4 Rxn !!606.2!606.4!!! 1!33352!Flux through OH + C2H6 Rxn !!606.2!606.4!!! 1!33353!Flux through OH + C3H8 = n-PrOO Rxn !!606.2!606.4!!! 1!33354!Flux through OH + C3H8 = i-PrOO Rxn !!606.2!606.4!!! 1!33355!Flux through OH + CO Rxn !!606.2!606.4!!! 1!33356!Flux through OH + EtCHO Rxn !!606.2!606.4!!! 1!33357!Flux thru OH+EtOOH=H2O+MeCHO+OH Rxn !!606.2!606.4!!! 1!33358!Flux through OH+EtOOH=H2O+EtOO Rxn !!606.2!606.4!!! 1!33359!Flux through OH + H2 Rxn !!606.2!606.4!!! 1!33360!Flux through OH + H2O2 Rxn !!606.2!606.4!!! 1!33361!Flux through OH + HCHO Rxn !!606.2!606.4!!! 1!33362!Flux through OH + HO2 Rxn !!606.2!606.4!!! 1!33363!Flux through OH + HO2NO2 Rxn !!606.2!606.4!!! 1!33364!Flux through OH + HONO2 Rxn !!606.2!606.4!!! 1!33365!Flux through OH + HONO Rxn !!606.2!606.4!!! 1!33366!Flux thru OH+MeOOH=H2O+HCHO+OH Rxn !!606.2!606.4!!! 1!33367!Flux through OH+MeOOH=H2O+MeOO Rxn !!606.2!606.4!!! 1!33368!Flux through OH + MeONO2 Rxn !!606.2!606.4!!! 1!33369!Flux through OH + Me2CO (1) Rxn !!606.2!606.4!!! 1!33370!Flux through OH + Me2CO (2) Rxn !!606.2!606.4!!! 1!33371!Flux for OH+MeCOCH2OOH=MeCOCH2OO Rn !!606.2!606.4!!! 1!33372!Flux for OH + MeCOCH2OOH=MGLY Rxn !!606.2!606.4!!! 1!33373!Flux through OH + MeCHO Rxn !!606.2!606.4!!! 1!33374!Flux through OH + NO3 Rxn !!606.2!606.4!!! 1!33375!Flux through OH + O3 Rxn !!606.2!606.4!!! 1!33376!Flux through OH + OH Rxn !!606.2!606.4!!! 1!33377!Flux through OH + PAN Rxn !!606.2!606.4!!! 1!33378!Flux through OH + PPAN Rxn !!606.2!606.4!!! 1!33379!Flux thru OH+n-PrOOH = n-PrOO Rxn !!606.2!606.4!!! 1!33380!Flux through OH+n-PrOOH = EtCHO Rxn !!606.2!606.4!!! 1!33381!Flux through OH+i-PrOOH= i-PrOO Rxn !!606.2!606.4!!! 1!33382!Flux through OH+i-PrOOH = Me2CO Rxn !!606.2!606.4!!! 1!33383!Flux through O3P + NO2 Rxn !!606.2!606.4!!! 1!33384!Flux through HO2S + O3S Rxn !!606.2!606.4!!! 1!33385!Flux through OHS + O3S Rxn !!606.2!606.4!!! 1!33386!Flux through O(1D)S + H2O Rxn !!606.2!606.4!!! 1!33387!Flux through O(1D)S + N2 Rxn !!606.2!606.4!!! 1!33388!Flux through O(1D)S + O2 Rxn !!606.2!606.4!!! 1!33389!Flux through HO2 + HO2 + M Rxn !!606.2!606.4!!! 1!33390!Flux through HO2 + NO2 + M Rxn !!606.2!606.4!!! 1!33391!Flux through HO2NO2 + M Rxn !!606.2!606.4!!! 1!33392!Flux through MeCO3 + NO2 + M Rxn !!606.2!606.4!!! 1!33393!Flux through PAN + M Rxn !!606.2!606.4!!! 1!33394!Flux through N2O5 + M Rxn !!606.2!606.4!!! 1!33395!Flux through NO2 + NO3 + M Rxn !!606.2!606.4!!! 1!33396!Flux through O(3P) + O2 + M Rxn !!606.2!606.4!!! 1!33397!Flux through OH + NO + M Rxn !!606.2!606.4!!! 1!33398!Flux through OH + NO2 + M Rxn !!606.2!606.4!!! 1!33399!Flux through OH + OH + M Rxn !!606.2!606.4!!! 1!33400!Flux through EtCO3 + NO2 + M Rxn !!606.2!606.4!!! 1!33401!Flux through PPAN + M Rxn !!606.2!606.4!!! 1!33402!Flux through O(3P)S + O2 + M Rxn !!606.2!606.4!!! 1!33403!Flux through EtOOH Photol Rxn !!606.2!606.4!!! 1!33404!Flux through H2O2 Photol Rxn !!606.2!606.4!!! 1!33405!Flux through HCHO=HO2+CO Photol Rxn !!606.2!606.4!!! 1!33406!Flux through HCHO=H2+CO Photol Rxn !!606.2!606.4!!! 1!33407!Flux through HO2NO2 Photol Rxn !!606.2!606.4!!! 1!33408!Flux through HONO2 Photol Rxn !!606.2!606.4!!! 1!33409!Flux through MeCHO=MeOO Photol Rxn !!606.2!606.4!!! 1!33410!Flux through MeCHO=CH4 Photol Rxn !!606.2!606.4!!! 1!33411!Flux through MeOOH Photol Rxn !!606.2!606.4!!! 1!33412!Flux through N2O5 Photol Rxn !!606.2!606.4!!! 1!33413!Flux through NO2 Photol Rxn !!606.2!606.4!!! 1!33414!Flux through NO3=NO+O2 Photol Rxn !!606.2!606.4!!! 1!33415!Flux thru NO3=NO2+O(3P) Photol Rxn !!606.2!606.4!!! 1!33416!Flux through O2 = O(3P) Photol Rxn !!606.2!606.4!!! 1!33417!Flux through O3 = O(1D) Photol Rxn !!606.2!606.4!!! 1!33418!Flux through O3 = O(3P) Photol Rxn !!606.2!606.4!!! 1!33419!Flux thru PAN=MeCO3+NO2 Photol Rxn !!606.2!606.4!!! 1!33420!Flux through HONO Photol Rxn !!606.2!606.4!!! 1!33421!Flux through EtCHO Photol Rxn !!606.2!606.4!!! 1!33422!Flux through Me2CO Photol Rxn !!606.2!606.4!!! 1!33423!Flux through n-PrOOH Photol Rxn !!606.2!606.4!!! 1!33424!Flux through i-PrOOH Photol Rxn !!606.2!606.4!!! 1!33425!Flux through MeCOCH2OOH Photol Rxn !!606.2!606.4!!! 1!33426!Flux through PPAN Photol Rxn !!606.2!606.4!!! 1!33427!Flux through MeONO2 Photol Rxn !!606.2!606.4!!! 1!33428!Flux through O3S=O(1D)S Photol Rxn !!606.2!606.4!!! 1!33429!Flux through O3S=O(3P)S Photol Rxn !!606.2!606.4!!! 1!33430!Flux of O3 by Dry Deposition !!606.2!606.4!!! 1!33431!Flux of NO by Dry Deposition !!606.2!606.4!!! 1!33432!Flux of NO3 by Dry Deposition !!606.2!606.4!!! 1!33433!Flux of NO2 by Dry Deposition !!606.2!606.4!!! 1!33434!Flux of N2O5 by Dry Deposition !!606.2!606.4!!! 1!33435!Flux of HO2NO2 by Dry Deposition !!606.2!606.4!!! 1!33436!Flux of HONO2 by Dry Deposition !!606.2!606.4!!! 1!33437!Flux of H2O2 by Dry Deposition !!606.2!606.4!!! 1!33438!Flux of CH4 by Dry Deposition !!606.2!606.4!!! 1!33439!Flux of CO by Dry Deposition !!606.2!606.4!!! 1!33440!Flux of HCHO by Dry Deposition !!606.2!606.4!!! 1!33441!Flux of MeOOH by Dry Deposition !!606.2!606.4!!! 1!33442!Flux of HONO by Dry Deposition !!606.2!606.4!!! 1!33443!Flux of EtOOH by Dry Deposition !!606.2!606.4!!! 1!33444!Flux of MeCHO by Dry Deposition !!606.2!606.4!!! 1!33445!Flux of PAN by Dry Deposition !!606.2!606.4!!! 1!33446!Flux of n-PrOOH by Dry Deposition !!606.2!606.4!!! 1!33447!Flux of i-PrOOH by Dry Deposition !!606.2!606.4!!! 1!33448!Flux of EtCHO by Dry Deposition !!606.2!606.4!!! 1!33449!Flux of MeCOCH2OOH by Dry Deposition!!606.2!606.4!!! 1!33450!Flux of PPAN by Dry Deposition !!606.2!606.4!!! 1!33451!Flux of O3S by Dry Deposition !!606.2!606.4!!! 1!33452!Flux of NO3 by Wet Deposition !!606.2!606.4!!! 1!33453!Flux of N2O5 by Wet Deposition !!606.2!606.4!!! 1!33454!Flux of HO2NO2 by Wet Deposition !!606.2!606.4!!! 1!33455!Flux of HONO2 by Wet Deposition !!606.2!606.4!!! 1!33456!Flux of HO2 by Wet Deposition !!606.2!606.4!!! 1!33457!Flux of H2O2 by Wet Deposition !!606.2!606.4!!! 1!33458!Flux of HCHO by Wet Deposition !!606.2!606.4!!! 1!33459!Flux of MeOO by Wet Deposition !!606.2!606.4!!! 1!33460!Flux of MeOOH by Wet Deposition !!606.2!606.4!!! 1!33461!Flux of HONO by Wet Deposition !!606.2!606.4!!! 1!33462!Flux of EtOOH by Wet Deposition !!606.2!606.4!!! 1!33463!Flux of n-PrOOH by Wet Deposition !!606.2!606.4!!! 1!33464!Flux of i-PrOOH by Wet Deposition !!606.2!606.4!!! 1!33465!Flux of MeCOCH2OOH by Wet Deposition!!606.2!606.4!!! 1!33466!Flux of HO2S by Wet Deposition !!606.2!606.4!!! 1!33467!Flux through Rxn 167 !!606.2!606.4!!! 1!33468!Flux through Rxn 168 !!606.2!606.4!!! 1!33469!Flux through Rxn 169 !!606.2!606.4!!! 1!33470!Flux through Rxn 170 !!606.2!606.4!!! 1!33481!Strat Flux of O3 Tracer !!606.2!606.4!!! 1!33482!Strat Flux of NO Tracer !!606.2!606.4!!! 1!33483!Strat Flux of NO3 Tracer !!606.2!606.4!!! 1!33484!Strat Flux of NO2 Tracer !!606.2!606.4!!! 1!33485!Strat Flux of N2O5 Tracer !!606.2!606.4!!! 1!33486!Strat Flux of HO2NO2 Tracer !!606.2!606.4!!! 1!33487!Strat Flux of HONO2 Tracer !!606.2!606.4!!! 1!33488!Strat Flux of H2O2 Tracer !!606.2!606.4!!! 1!33489!Strat Flux of CH4 Tracer !!606.2!606.4!!! 1!33490!Strat Flux of CO Tracer !!606.2!606.4!!! 1!33491!Strat Flux of HCHO Tracer !!606.2!606.4!!! 1!33492!Strat Flux of MeOOH Tracer !!606.2!606.4!!! 1!33493!Strat Flux of HONO Tracer !!606.2!606.4!!! 1!33494!Strat Flux of C2H6 Tracer !!606.2!606.4!!! 1!33495!Strat Flux of EtOOH Tracer !!606.2!606.4!!! 1!33496!Strat Flux of MeCHO Tracer !!606.2!606.4!!! 1!33497!Strat Flux of PAN Tracer !!606.2!606.4!!! 1!33498!Strat Flux of C3H8 Tracer !!606.2!606.4!!! 1!33499!Strat Flux of n-PrOOH Tracer !!606.2!606.4!!! 1!33500!Strat Flux of i-PrOOH Tracer !!606.2!606.4!!! 1!33501!Strat Flux of EtCHO Tracer !!606.2!606.4!!! 1!33502!Strat Flux of Me2CO Tracer !!606.2!606.4!!! 1!33503!Strat Flux of MECOCH2OOH Tracer !!606.2!606.4!!! 1!33504!Strat Flux of PPAN Tracer !!606.2!606.4!!! 1!33505!Strat Flux of MeONO2 Tracer !!606.2!606.4!!! 1!33506!Strat Flux of O3S Tracer !!606.2!606.4!!! 1!34001!OX MASS MIXING RATIO !1!606!606.4!!! 1!34001!O3 MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34001!O3 MASS MIXING RATIO !1!704!708!!! 1!34001!O3 MASS MIXING RATIO AFTER TIMESTEP !1!802!!!! 1!34002!NOX MASS MIXING RATIO !1!606!606.4!!! 1!34002!NO MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34002!NO MASS MIXING RATIO !1!704!708!!! 1!34002!NO MASS MIXING RATIO AFTER TIMESTEP !1!802!!!! 1!34003!NO2 MASS MIXING RATIO !1!606!606.4!!! 1!34003!NO3 MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34003!NO3 MASS MIXING RATIO !1!704!708!!! 1!34003!NO3 MASS MIXING RATIO AFTER TIMESTEP!1!802!!!! 1!34004!NO3 MASS MIXING RATIO !1!606!606.4!!! 1!34004!NO2 MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34004!NO2 MASS MIXING RATIO !1!704!708!!! 1!34004!NO2 MASS MIXING RATIO AFTER TIMESTEP!1!802!!!! 1!34005!N2O5 MASS MIXING RATIO !1!606!606.4!!! 1!34005!N2O5 MASS MIXING RATIO !1!704!708!!! 1!34005!N2O5 MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34006!HO2NO2 MASS MIXING RATIO !1!606!606.4!!! 1!34006!HO2NO2 MASS MIXING RATIO !1!704!708!!! 1!34006!HO2NO2 MASS MIXING RATIO AFTER TSTEP!1!802!!!! 1!34007!HONO2 MASS MIXING RATIO !1!606!606.4!!! 1!34007!HONO2 MASS MIXING RATIO !1!704!708!!! 1!34007!HONO2 MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34008!H2O2 MASS MIXING RATIO !1!606!606.4!!! 1!34008!H2O2 MASS MIXING RATIO !1!704!708!!! 1!34008!H2O2 MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34009!CH4 MASS MIXING RATIO !1!606!606.4!!! 1!34009!CH4 MASS MIXING RATIO !1!704!708!!! 1!34009!CH4 MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34010!CO MASS MIXING RATIO !1!606!606.4!!! 1!34010!CO MASS MIXING RATIO !1!704!708!!! 1!34010!CO MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34011!HCHO MASS MIXING RATIO !1!606!606.4!!! 1!34011!HCHO MASS MIXING RATIO !1!704!708!!! 1!34011!HCHO MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34012!MEOOH MASS MIXING RATIO !1!606!606.4!!! 1!34012!MeOOH MASS MIXING RATIO !1!704!708!!! 1!34012!MeOOH MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34013!HONO MASS MIXING RATIO !1!606!606.4!!! 1!34013!HONO MASS MIXING RATIO !1!704!708!!! 1!34013!HONO MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34014!C2H6 MASS MIXING RATIO !1!606!606.4!!! 1!34014!C2H6 MASS MIXING RATIO !1!704!708!!! 1!34014!C2H6 MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34015!ETOOH MASS MIXING RATIO !1!606!606.4!!! 1!34015!ETOOH MASS MIXING RATIO !1!704!708!!! 1!34015!EtOOH MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34016!MECHO MASS MIXING RATIO !1!606!606.4!!! 1!34016!MeCHO MASS MIXING RATIO !1!704!708!!! 1!34016!MeCHO MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34017!PAN MASS MIXING RATIO !1!606!606.4!!! 1!34017!PAN MASS MIXING RATIO !1!704!708!!! 1!34017!PAN MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34018!C3H8 MASS MIXING RATIO !1!606!606.4!!! 1!34018!C3H8 MASS MIXING RATIO !1!704!708!!! 1!34018!C3H8 MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34019!N-PROOH MASS MIXING RATIO !1!606!606.4!!! 1!34019!n-PrOOH MASS MIXING RATIO !1!704!708!!! 1!34019!n-PrOOH MASS MIXING RATIO AFTER TS !1!802!!!! 1!34020!I-PROOH MASS MIXING RATIO !1!606!606.4!!! 1!34020!i-PrOOH MASS MIXING RATIO !1!704!708!!! 1!34020!i-PrOOH MASS MIXING RATIO AFTER TS !1!802!!!! 1!34021!ETCHO MASS MIXING RATIO !1!606!606.4!!! 1!34021!EtCHO MASS MIXING RATIO !1!704!708!!! 1!34021!EtCHO MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34022!ME2CO MASS MIXING RATIO !1!606!606.4!!! 1!34022!Me2CO MASS MIXING RATIO !1!704!708!!! 1!34022!Me2CO MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34023!MECOCH2OOH MASS MIXING RATIO !1!606!606.4!!! 1!34023!MeCOCH2OOH MASS MIXING RATIO !1!704!708!!! 1!34023!MeCOCH2OOH MASS MIXING RATIO AFT TS !1!802!!!! 1!34024!PPAN MASS MIXING RATIO !1!606!606.4!!! 1!34024!PPAN MASS MIXING RATIO !1!704!708!!! 1!34024!PPAN MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34025!MEONO2 MASS MIXING RATIO !1!606!606.4!!! 1!34025!MeONO2 MASS MIXING RATIO !1!704!708!!! 1!34025!MeONO2 MASS MIXING RATIO AFTER TSTEP!1!802!!!! 1!34026!O3S MASS MIXING RATIO !1!606!606.4!!! 1!34026!O3S MASS MIXING RATIO !1!704!708!!! 1!34026!O3S MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34027!C5H8 MASS MIXING RATIO !1!606!606.4!!! 1!34027!C5H8 MASS MIXING RATIO !1!704!708!!! 1!34027!C5H8 MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34028!ISOOH MASS MIXING RATIO !1!606!606.4!!! 1!34028!ISOOH MASS MIXING RATIO !1!704!708!!! 1!34028!ISOOH MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34029!ISON MASS MIXING RATIO !1!606!606.4!!! 1!34029!ISON MASS MIXING RATIO !1!704!708!!! 1!34029!ISON MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34030!MACR MASS MIXING RATIO !1!606!606.4!!! 1!34030!MACR MASS MIXING RATIO !1!704!708!!! 1!34030!MACR MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34031!MACROOH MASS MIX RATIO !1!606!606.4!!! 1!34031!MACROOH MASS MIXING RATIO !1!704!708!!! 1!34031!MACROOH MASS MIXING RATIO AFTER TS !1!802!!!! 1!34032!MPAN MASS MIXING RATIO !1!606!606.4!!! 1!34032!MPAN MASS MIXING RATIO !1!704!708!!! 1!34032!MPAN MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34033!HACET MASS MIXING RATIO !1!606!606.4!!! 1!34033!HACET MASS MIXING RATIO !1!704!708!!! 1!34033!HACET MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34034!MGLY MASS MIXING RATIO !1!606!606.4!!! 1!34034!MGLY MASS MIXING RATIO !1!704!708!!! 1!34034!MGLY MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34035!NALD MASS MIXING RATIO !1!606!606.4!!! 1!34035!NALD MASS MIXING RATIO !1!704!708!!! 1!34035!NALD MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34036!HCOOH MASS MIXING RATIO !1!606!606.4!!! 1!34036!HCOOH MASS MIXING RATIO !1!704!708!!! 1!34036!HCOOH MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34037!MeCO3H MASS MIX RATIO !1!606!606.4!!! 1!34037!MeCO3H MASS MIXING RATIO !1!704!708!!! 1!34037!MeCO3H MASS MIXING RATIO AFTER TSTEP!1!802!!!! 1!34038!MeCO2H MASS MIX RATIO !1!606!606.4!!! 1!34038!MeCO2H MASS MIXING RATIO !1!704!708!!! 1!34038!MeCO2H MASS MIXING RATIO AFTER TSTEP!1!802!!!! 1!34039!TOTAL Cl MASS MIXING RATIO !1!704!708!!! 1!34039!H2O MASS MIXING RATIO AFTER TIMESTEP!1!802!802!!! 1!34039!MVK MASS MIXING RATIO AFTER TS !1!900!!!! 1!34040!TOTAL Br MASS MIXING RATIO !1!704!708!!! 1!34040!ISO2 MASS MIXING RATIO AFTER TSTEP !1!802!806!!! 1!34040!MVKOOH MASS MIXING RATIO AFTER T !1!900!!!! 1!34041!CLOX MASS MIXING RATIO !1!606!606.4!!! 1!34041!Cl MASS MIXING RATIO AFTER TIMESTEP !1!701!703!!! 1!34041!Cl MASS MIXING RATIO !1!704!708!!! 1!34041!Cl MASS MIXING RATIO AFTER TIMESTEP !1!802!!!! 1!34042!CLO MASS MIXING RATIO !1!606!606.4!!! 1!34042!CLO MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34042!ClO MASS MIXING RATIO !1!704!708!!! 1!34042!ClO MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34043!CL2O2 MASS MIXING RATIO !1!606!606.4!!! 1!34043!Cl2O2 MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34043!Cl2O2 MASS MIXING RATIO !1!704!708!!! 1!34043!Cl2O2 MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34044!OCLO MASS MIXING RATIO !1!606!606.4!!! 1!34044!OCLO MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34044!OClO MASS MIXING RATIO !1!704!708!!! 1!34044!OClO MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34045!BROX MASS MIXING RATIO !1!606!606.4!!! 1!34045!Br MASS MIXING RATIO AFTER TIMESTEP !1!701!703!!! 1!34045!Br MASS MIXING RATIO !1!704!708!!! 1!34045!Br MASS MIXING RATIO AFTER TIMESTEP !1!802!!!! 1!34046!BRO MASS MIXING RATIO !1!606!606.4!!! 1!34046!BRO MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34046!BrO MASS MIXING RATIO !1!704!708!!! 1!34046!BrO MASS MIXING RATIO AFTER TIMESTEP!1!802!802!!! 1!34047!BRCL MASS MIXING RATIO !1!606!606.4!!! 1!34047!BRCL MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34047!BrCl MASS MIXING RATIO !1!704!708!!! 1!34047!BrCl MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34048!BRONO2 MASS MIXING RATIO !1!606!606.4!!! 1!34048!BRONO2 MASS MIXING RATIO AFTER TSTEP!1!701!703!!! 1!34048!BrONO2 MASS MIXING RATIO !1!704!708!!! 1!34048!BrONO2 MASS MIXING RATIO AFTER TSTEP!1!802!!!! 1!34049!N2O MASS MIXING RATIO !1!606!606.4!!! 1!34049!N2O MASS MIXING RATIO !1!704!708!!! 1!34049!N2O MASS MIXING RATIO AFTER TIMESTEP!1!802!!!! 1!34050!HCL MASS MIXING RATIO !1!606!606.4!!! 1!34050!HCl MASS MIXING RATIO !1!704!708!!! 1!34050!HCl MASS MIXING RATIO AFTER TIMESTEP!1!802!802!!! 1!34051!HOCL MASS MIXING RATIO !1!606!606.4!!! 1!34051!HOCl MASS MIXING RATIO !1!704!708!!! 1!34051!HOCl MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34052!HBr MASS MIXING RATIO !1!606!606.4!!! 1!34052!HBr MASS MIXING RATIO !1!704!708!!! 1!34052!HBr MASS MIXING RATIO AFTER TIMESTEP!1!802!!!! 1!34053!HOBR MASS MIXING RATIO !1!606!606.4!!! 1!34053!HOBr MASS MIXING RATIO !1!704!708!!! 1!34053!HOBr MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34054!CLONO2 MASS MIXING RATIO !1!606!606.4!!! 1!34054!ClONO2 MASS MIXING RATIO !1!704!708!!! 1!34054!ClONO2 MASS MIXING RATIO AFTER TSTEP!1!802!!!! 1!34055!CFCL3 MASS MIXING RATIO !1!606!606.4!!! 1!34055!CFCl3 MASS MIXING RATIO !1!704!708!!! 1!34055!CFCl3 MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34056!CF2CL2 MASS MIXING RATIO !1!606!606.4!!! 1!34056!CF2Cl2 MASS MIXING RATIO !1!704!708!!! 1!34056!CF2Cl2 MASS MIXING RATIO AFTER TSTEP!1!802!!!! 1!34057!MEBR MASS MIXING RATIO !1!606!606.4!!! 1!34057!MeBr MASS MIXING RATIO !1!704!708!!! 1!34057!MeBr MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34058!N MASS MIXING RATIO !1!606!606.4!!! 1!34058!N MASS MIXING RATIO !1!704!708!!! 1!34058!N MASS MIXING RATIO AFTER TIMESTEP !1!802!!!! 1!34059!O3P MASS MIXING RATIO !1!606!606.4!!! 1!34059!O3P MASS MIXING RATIO !1!704!708!!! 1!34059!O3P MASS MIXING RATIO AFTER TIMESTEP!1!802!!!! 1!34060!TOTAL HYDROGEN MMR !1!606!606.4!!! 1!34060!TOTAL H MASS MIXING RATIO !1!704!708!!! 1!34060!MACRO2 MASS MIXING RATIO AFTER TSTEP!1!802!806!!! 1!34060!ORGNIT MASS MIXING RATIO AFTER TS !1!900!!!! 1!34061!MeCl MASS MIXING RATIO !1!606!606.4!!! 1!34061!MeCl MASS MIXING RATIO !1!704!708!!! 1!34061!MeCl MASS MIXING RATIO AFTER TSTEP !1!802!802!!! 1!34062!CF2ClBr MASS MIXING RATIO !1!606!606.4!!! 1!34062!CF2ClBr MASS MIXING RATIO !1!704!708!!! 1!34062!CF2ClBr MASS MIXING RATIO AFTER TS !1!802!802!!! 1!34063!CCl4 MASS MIXING RATIO !1!606!606.4!!! 1!34063!CCl4 MASS MIXING RATIO !1!704!708!!! 1!34063!CCl4 MASS MIXING RATIO AFTER TSTEP !1!802!802!!! 1!34064!CF2ClCFCl2 MASS MIXING RATIO !1!606!606.4!!! 1!34064!CF2ClCFCl2 MASS MIXING RATIO !1!704!708!!! 1!34064!CF2ClCFCl2 MAS MIXING RATIO AFTER TS!1!802!802!!! 1!34065!CHF2Cl MASS MIXING RATIO !1!606!606.4!!! 1!34065!CHF2Cl MASS MIXING RATIO !1!704!708!!! 1!34065!CHF2Cl MASS MIXING RATIO AFTER TSTEP!1!802!802!!! 1!34066!MeCCl3 MASS MIXING RATIO !1!606!606.4!!! 1!34066!MeCCl3 MASS MIXING RATIO !1!704!708!!! 1!34066!MeCCl3 MASS MIXING RATIO AFTER TSTEP!1!802!802!!! 1!34067!CF3Br MASS MIXING RATIO !1!606!606.4!!! 1!34067!CF3Br MASS MIXING RATIO !1!704!708!!! 1!34067!CF3Br MASS MIXING RATIO AFTER TSTEP !1!802!802!!! 1!34068!STRATOSPHERIC WATER VAPOUR !1!606!606.4!!! 1!34068!H2OS MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34068!H2OS MASS MIXING RATIO !1!704!708!!! 1!34068!H2OS MASS MIXING RATIO AFTER TSTEP !1!802!802!!! 1!34069!O(3P)S MASS MIXING RATIO !1!704!708!!! 1!34069!CH2Br2 MASS MIXING RATIO AFTER TSTEP!1!802!802!!! 1!34069!CH3OH MASS MIXING RATIO AFTER TS !1!900!!!! 1!34070!H2 MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34070!H2 MASS MIXING RATIO !1!704!708!!! 1!34070!H2 MASS MIXING RATIO AFTER TIMESTEP !1!802!!!! 1!34071!SO2 MASS MIXING RATIO !1!606!606.4!!! 1!34071!DMS MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34071!DMS MASS MIXING RATIO !1!704!708!!! 1!34071!DMS MASS MIXING RATIO AFTER TIMESTEP!1!802!!!! 1!34072!H2SO4 MASS MIXING RATIO !1!606!606.4!!! 1!34072!SO2 MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34072!SO2 MASS MIXING RATIO !1!704!708!!! 1!34072!SO2 MASS MIXING RATIO AFTER TIMESTEP!1!802!!!! 1!34073!DMS MASS MIXING RATIO !1!606!606.4!!! 1!34073!H2SO4 MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34073!H2SO4 MASS MIXING RATIO !1!704!708!!! 1!34073!H2SO4 MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34074!DMSO MASS MIXING RATIO !1!606!606.4!!! 1!34074!MSA MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34074!MSA MASS MIXING RATIO !1!704!708!!! 1!34074!MSA MASS MIXING RATIO AFTER TIMESTEP!1!802!!!! 1!34075!MSA MASS MIXING RATIO !1!606!606.4!!! 1!34075!DMSO MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34075!DMSO MASS MIXING RATIO !1!704!708!!! 1!34075!DMSO MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34076!H2S MASS MIXING RATIO !1!606!606.4!!! 1!34076!NH3 MASS MIXING RATIO !1!704!708!!! 1!34076!NH3 MASS MIXING RATIO AFTER TIMESTEP!1!802!!!! 1!34077!CS2 MASS MIXING RATIO !1!606!606.4!!! 1!34077!CS2 MASS MIXING RATIO !1!704!708!!! 1!34077!CS2 MASS MIXING RATIO AFTER TIMESTEP!1!802!!!! 1!34078!COS MASS MIXING RATIO !1!606!606.4!!! 1!34078!COS MASS MIXING RATIO !1!704!708!!! 1!34078!COS MASS MIXING RATIO AFTER TIMESTEP!1!802!!!! 1!34079!NH3 MASS MIXING RATIO !1!606!606.4!!! 1!34079!H2S MASS MIXING RATIO !1!704!708!!! 1!34079!H2S MASS MIXING RATIO AFTER TIMESTEP!1!802!!!! 1!34080!H MASS MIXING RATIO AFTER TIMESTEP !1!701!703!!! 1!34080!H MASS MIXING RATIO !1!704!708!!! 1!34080!H MASS MIXING RATIO AFTER TIMESTEP !1!802!!!! 1!34081!OH MASS MIXING RATIO AFTER TIMESTEP !1!701!703!!! 1!34081!OH MASS MIXING RATIO !1!704!708!!! 1!34081!OH MASS MIXING RATIO AFTER TIMESTEP !1!802!!!! 1!34082!HO2 MASS MIXING RATIO AFTER TIMESTEP!1!701!703!!! 1!34082!HO2 MASS MIXING RATIO !1!704!708!!! 1!34082!HO2 MASS MIXING RATIO AFTER TIMESTEP!1!802!!!! 1!34083!MeOO MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34083!MeOO MASS MIXING RATIO !1!704!708!!! 1!34083!MeOO MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34084!ETOO MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34084!ETOO MASS MIXING RATIO !1!704!708!!! 1!34084!EtOO MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34085!MECO3 MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34085!MeCO3 MASS MIXING RATIO !1!704!708!!! 1!34085!MeCO3 MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34086!n-PROO MASS MIXING RATIO AFTER TSTEP!1!701!703!!! 1!34086!n-PrOO MASS MIXING RATIO !1!704!708!!! 1!34086!n-PrOO MASS MIXING RATIO AFTER TSTEP!1!802!!!! 1!34087!i-PROO MASS MIXING RATIO AFTER TSTEP!1!701!703!!! 1!34087!i-PrOO MASS MIXING RATIO !1!704!708!!! 1!34087!i-PrOO MASS MIXING RATIO AFTER TSTEP!1!802!!!! 1!34088!EtCO3 MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34088!EtCO3 MASS MIXING RATIO !1!704!708!!! 1!34088!EtCO3 MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34089!MeCOCH2OO MASS MIXING RATIO AFTER TS!1!701!703!!! 1!34089!MeCOCH2OO MASS MIXING RATIO !1!704!708!!! 1!34089!MeCOCH2OO MASS MIXING RATIO AFTER TS!1!802!!!! 1!34090!CH3Br MASS MIXING RATIO !1!704!708!!! 1!34090!MeOH MASS MIXING RATIO AFTER TSTEP !1!802!!!! 1!34091!MONOTERPENE MASS M.R. AFTER TSTEP !1!701!703!!! 1!34091!MONOTERPENE MASS MIXING RATIO !1!704!708!!! 1!34091!MONOTERPENE MASS MIXING RATIO AFT TS!1!802!!!! 1!34092!SEC_ORG MASS M. RATIO AFTER TSTEP !1!701!703!!! 1!34092!SEC_ORG MASS MIXING RATIO !1!704!708!!! 1!34092!SEC_ORG MASS MIXING RATIO AFTER TS !1!802!!!! 1!34093!SESQUITERPENE MASS MR AFTER TSTEP !1!701!703!!! 1!34093!SESQUITERPENE MASS MIXING RATIO !1!704!802!!! 1!34093!C3H6 MASS MIXING RATIO AFTER TSTEP !1!804!!!! 1!34094!UKCA TRACER 94 !!704!708!!! 1!34094!SO3 MASS MIXING RATIO AFTER TIMESTEP!1!802!!!! 1!34095!UKCA TRACER 95 !!704!708!!! 1!34095!AROM MASS MIXING RATIO AFTER TSTEP !1!802!802!!! 1!34095!C4H9OOH MASS MIXING RATIO AFT TSTEP !1!804!!!! 1!34096!UKCA TRACER 96 !!704!708!!! 1!34096!O(3P)S MASS MIXING RATIO AFTER TSTEP!1!802!802!!! 1!34096!MEK MASS MIXING RATIO AFTER TSTEP !1!804!!!! 1!34097!UKCA TRACER 97 !!704!708!!! 1!34097!O(1D)S MASS MIXING RATIO AFTER TSTEP!1!802!802!!! 1!34097!TOLUENE MASS MIXING RATIO AFT TSTEP !1!804!!!! 1!34098!UKCA TRACER 98 !!704!708!!! 1!34098!LUMPED N (as NO2) MMR AFTER TIMESTEP!1!802!!!! 1!34099!UKCA TRACER 99 !!704!708!!! 1!34099!LUMPED Br (as BrO) MMR AFTER TSTEP !1!802!!!! 1!34100!UKCA TRACER 100 !!704!708!!! 1!34100!LUMPED Cl (as HCl) MMR AFTER TSTEP !1!802!!!! 1!34101!NUCLEATION MODE (SOLUBLE) NUMBER !!606!!!! 1!34102!AITKEN MODE (SOLUBLE) NUMBER !!606!606.4!!! 1!34102!NUCLEATION MODE (SOLUBLE) H2SO4 MMR !1!701!!!! 1!34103!ACCUMULATION MODE (SOLUBLE) NUMBER !!606!606.4!!! 1!34103!AITKEN MODE (SOLUBLE) NUMBER !!701!!!! 1!34104!COARSE MODE (SOLUBLE) NUMBER !!606!606.4!!! 1!34104!AITKEN MODE (SOLUBLE) H2SO4 MMR !1!701!!!! 1!34105!AITKEN MODE (INSOLUBLE) NUMBER !!606!606.4!!! 1!34105!AITKEN MODE (SOLUBLE) BC MMR !1!701!!!! 1!34106!ACCUMULATION MODE (INSOLUBLE) NUMBER!!606!606.4!!! 1!34106!AITKEN MODE (SOLUBLE) OC MMR !1!701!!!! 1!34107!COARSE MODE (INSOLUBLE) NUMBER !!606!606.4!!! 1!34107!ACCUMULATION MODE (SOLUBLE) NUMBER !!701!!!! 1!34108!NUCLEATION MODE (SOLUBLE) SO4 MMR !1!606!606.4!!! 1!34108!ACCUMULATION MODE (SOL) H2SO4 MMR !1!701!!!! 1!34109!AITKEN MODE (SOLUBLE) SO4 MMR !1!606!606.4!!! 1!34109!ACCUMULATION MODE (SOL) BC MMR !1!701!!!! 1!34110!AITKEN MODE (SOLUBLE) BLACK CARBON !!606!606.4!!! 1!34110!ACCUMULATION MODE (SOL) OC MMR !1!701!!!! 1!34111!AITKEN MODE (SOLUBLE) ORGANIC CARBON!!606!606.4!!! 1!34111!ACCUMULATION MODE (SOL) SEA SALT MMR!1!701!!!! 1!34112!ACCUMULATION MODE (SOLUBLE) SO4 MMR !1!606!606.4!!! 1!34112!ACCUMULATION MODE (SOL) DUST MMR !1!701!!!! 1!34113!ACCUMULATION MODE (SOL) BLACK CARBON!!606!606.4!!! 1!34113!COARSE MODE (SOLUBLE) NUMBER !!701!!!! 1!34114!ACCUMULATN MODE (SOL) ORGANIC CARBON!!606!606.4!!! 1!34114!COARSE MODE (SOLUBLE) H2SO4 MMR !1!701!!!! 1!34115!ACCUMULATION MODE (SOL) SEA SALT MMR!1!606!606.4!!! 1!34115!COARSE MODE (SOLUBLE) BC MMR !1!701!!!! 1!34116!ACCUMULATION MODE (SOLUBLE) DUST MMR!1!606!606.4!!! 1!34116!COARSE MODE (SOLUBLE) OC MMR !1!701!!!! 1!34117!COARSE MODE (SOLUBLE) SO4 MMR !1!606!606.4!!! 1!34117!COARSE MODE (SOLUBLE) SEA SALT MMR !1!701!!!! 1!34118!COARSE MODE (SOLUBLE) BLACK CARBON !!606!606.4!!! 1!34118!COARSE MODE (SOLUBLE) DUST MMR !1!701!!!! 1!34119!COARSE MODE (SOLUBLE) ORGANIC CARBON!!606!606.4!!! 1!34119!AITKEN MODE (INSOLUBLE) NUMBER !!701!!!! 1!34120!COARSE MODE (SOLUBLE) SEA SALT MMR !1!606!606.4!!! 1!34120!AITKEN MODE (INSOLUBLE) BC MMR !1!701!!!! 1!34121!COARSE MODE (SOLUBLE) DUST MMR !1!606!606.4!!! 1!34121!AITKEN MODE (INSOLUBLE) OC MMR !1!701!!!! 1!34122!AITKEN MODE (INSOLUBLE) BLACK CARBON!!606!606.4!!! 1!34122!ACCUMULATION MODE (INSOLUBLE) NUMBER!!701!!!! 1!34123!AITKEN MODE (INSOL) ORGANIC CARBON !!606!606.4!!! 1!34123!ACCUMULATION MODE (INSOLUBLE) DUST !!701!!!! 1!34124!ACCUMULATION MODE (INSOL) DUST MMR !1!606!606.4!!! 1!34124!COARSE MODE (INSOLUBLE) NUMBER !!701!!!! 1!34125!COARSE MODE (INSOLUBLE) DUST MMR !1!606!!!! 1!34126!NH4+ MASS MIXING RATIO !1!606!606.4!!! 1!34126!NUCLEATION MODE (SOLUBLE) OC MMR !1!701!!!! 1!34127!NO3- MASS MIXING RATIO !1!606!606.4!!! 1!34127!NUCLEATION MODE (SOLUBLE) OC2 MMR !1!701!708!!! 1!34127!AITKEN MODE (SOLUBLE) SEA SALT MMR !1!802!!!! 1!34128!AITKEN MODE (SOLUBLE) OC2 MMR !1!701!708!!! 1!34128!NUCLEATION MODE (SOLUBLE) OC2 MMR !1!802!!!! 1!34129!ACCUMULATION MODE (SOLUBLE) OC2 MMR !1!701!708!!! 1!34129!AITKEN MODE (SOLUBLE) OC2 MMR !1!802!!!! 1!34130!COARSE MODE (SOLUBLE) OC2 MMR !1!701!708!!! 1!34130!ACCUMULATION MODE (SOLUBLE) OC2 MMR !!802!!!! 1!34131!DUST DIVISION 1 MASS MIXING RATIO !1!606!606.4!!! 1!34131!AITKEN MODE (SOLUBLE) SEA SALT MMR !1!701!708!!! 1!34131!COARSE MODE (SOLUBLE) OC2 MMR !1!802!!!! 1!34132!DUST DIVISION 2 MASS MIXING RATIO !1!606!606.4!!! 1!34132!NUCLEATION MODE (SOLUBLE) NH4 MMR !1!701!!!! 1!34133!DUST DIVISION 3 MASS MIXING RATIO !1!606!606.4!!! 1!34133!AITKEN MODE (SOLUBLE) NH4 MMR !1!701!!!! 1!34134!DUST DIVISION 4 MASS MIXING RATIO !1!606!606.4!!! 1!34134!ACCUMULATION MODE (SOLUBLE) NH4 MMR !1!701!!!! 1!34135!DUST DIVISION 5 MASS MIXING RATIO !1!606!606.4!!! 1!34135!COARSE MODE (SOLUBLE) NH4 MMR !1!701!!!! 1!34136!DUST DIVISION 6 MASS MIXING RATIO !1!606!606.4!!! 1!34136!NUCLEATION MODE (SOLUBLE) NO3 MMR !1!701!!!! 1!34137!AITKEN MODE (SOLUBLE) NO3 MMR !1!701!!!! 1!34138!ACCUMULATION MODE (SOLUBLE) NO3 MMR !1!701!!!! 1!34139!COARSE MODE (SOLUBLE) NO3 MMR !1!701!!!! 1!34140!RADON-222 MASS MIXING RATIO !1!606!606.4!!! 1!34140!Rn-222 MASS MIXING RATIO AFTER TS !1!701!703!!! 1!34140!UKCA TRACER 140 !!704!802!!! 1!34141!LEAD-210 MASS MIXING RATIO !1!606!606.4!!! 1!34141!Pb-210 MASS MIXING RATIO AFTER TS !1!701!703!!! 1!34141!UKCA TRACER 141 !!704!802!!! 1!34142!LEAD-210 (INERT) MASS MIXING RATIO !1!606!606.4!!! 1!34142!UKCA TRACER 142 !!704!802!!! 1!34143!UKCA TRACER 143 !!704!802!!! 1!34144!UKCA TRACER 144 !!704!802!!! 1!34145!UKCA TRACER 145 !!704!802!!! 1!34146!UKCA TRACER 146 !!704!802!!! 1!34147!Rn-222 MASS MIXING RATIO !1!704!708!!! 1!34147!UKCA TRACER 147 !!802!802!!! 1!34148!Pb-210 MASS MIXING RATIO !1!704!708!!! 1!34148!UKCA TRACER 148 !!802!802!!! 1!34149!UKCA TRACER 149 !!704!708!!! 1!34149!PASSIVE O3 MASS MIXING RATIO !1!802!!!! 1!34150!AGE OF AIR IN SECONDS !s!704!708!!! 1!34150!AGE OF AIR IN SECONDS !s!802!!!! 1!34151!NOX SURFACE EMISSION (AS NO2) !!606!606.4!!! 1!34151!OH MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34151!O3P MASS MIXING RATIO !1!705!708!!! 1!34151!O(1D) MASS MIXING RATIO !1!802!900!!! 1!34151!UKCA NON-TRANSPORTED SPECIES 151 !!901!!!! 1!34152!CH4 SURFACE EMISSION !!606!606.4!!! 1!34152!HO2 MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34152!O1D MASS MIXING RATIO !1!705!708!!! 1!34152!O(3P) MASS MIXING RATIO !1!802!900!!! 1!34152!UKCA NON-TRANSPORTED SPECIES 152 !!901!!!! 1!34153!CO SURFACE EMISSION !!606!606.4!!! 1!34153!O3P MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34153!OH MASS MIXING RATIO !1!705!708!!! 1!34153!NO2 MASS MIXING RATIO AFTER TSTEP !1!802!900!!! 1!34153!UKCA NON-TRANSPORTED SPECIES 153 !!901!!!! 1!34154!HCHO SURFACE EMISSION !!606!606.4!!! 1!34154!O1D MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34154!HO2 MASS MIXING RATIO !1!705!708!!! 1!34154!BrO MASS MIXING RATIO AFTER TSTEP !1!802!900!!! 1!34154!UKCA NON-TRANSPORTED SPECIES 154 !!901!!!! 1!34155!C2H6 SURFACE EMISSION !!606!606.4!!! 1!34155!MeOO MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34155!MeOO MASS MIXING RATIO !1!705!708!!! 1!34155!HCl MASS MIXING RATIO AFTER TSTEP !1!802!900!!! 1!34155!UKCA NON-TRANSPORTED SPECIES 155 !!901!!!! 1!34156!C3H8 SURFACE EMISSION !!606!606.4!!! 1!34156!EtOO MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34156!EtOO MASS MIXING RATIO !1!705!708!!! 1!34156!Cly MASS MIXING RATIO AFTER TSTEP !1!802!900!!! 1!34156!UKCA NON-TRANSPORTED SPECIES 156 !!901!!!! 1!34157!CH3COCH3 SURFACE EMISSION !!606!606.4!!! 1!34157!MeCO3 MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34157!MeCO3 MASS MIXING RATIO !1!705!708!!! 1!34157!AEROSOL SURFACE AREA !!802!900!!! 1!34157!UKCA NON-TRANSPORTED SPECIES 157 !!901!!!! 1!34158!CH3CHO SURFACE EMISSION !!606!606.4!!! 1!34158!n-PrOO MASS MIXING RATIO AFTER TSTEP!1!701!703!!! 1!34158!n-PrOO MASS MIXING RATIO !1!705!708!!! 1!34158!NAT PSC MASS MIXING RATIO AFTER TS !1!802!900!!! 1!34158!UKCA NON-TRANSPORTED SPECIES 158 !!901!!!! 1!34159!C5H8 (Isoprene) SURFACE EMISSION !!606!606.4!!! 1!34159!i-PrOO MASS MIXING RATIO AFTER TSTEP!1!701!703!!! 1!34159!i-PrOO MASS MIXING RATIO !1!705!708!!! 1!34159!OZONE COLUMN !!802!900!!! 1!34159!UKCA NON-TRANSPORTED SPECIES 159 !!901!!!! 1!34160!H2 SURFACE EMISSION !!606!606.4!!! 1!34160!EtCO3 MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34160!EtCO3 MASS MIXING RATIO !1!705!708!!! 1!34160!Heterogenous Rate for N2O5 !!802!900!!! 1!34160!UKCA NON-TRANSPORTED SPECIES 160 !!901!!!! 1!34161!NOX AIRCRAFT EMISSION AS NO2 !!606!606.4!!! 1!34161!MeCOCH2OO MASS MIXING RATIO AFTER TS!1!701!703!!! 1!34161!MeCOCH2OO MASS MIXING RATIO !1!705!708!!! 1!34161!Heterogenous Rates for HO2+HO2 !!802!900!!! 1!34161!UKCA NON-TRANSPORTED SPECIES 161 !!901!!!! 1!34162!N2O SURFACE EMISSION !!606!606.4!!! 1!34162!ISO2 MASS MIXING RATIO AFTER TSTEP !1!701!703!!! 1!34162!ISO2 MASS MIXING RATIO !1!705!708!!! 1!34162!TOTAL CLOUD DROPLET NO. CONC. (m^-3)!m-3!802!900!!! 1!34162!UKCA NON-TRANSPORTED SPECIES 162 !!901!!!! 1!34163!CFCL3 (CFC-11) SURFACE EMISSION !!606!606.4!!! 1!34163!MACRO2 MASS MIXING RATIO AFTER TSTEP!1!701!703!!! 1!34163!MACRO2 MASS MIXING RATIO !1!705!708!!! 1!34163! (m) !!802!802!!! 1!34163!CLOUD DROPLET NO CONC^(-1/3) (m) !!804!900!!! 1!34163!UKCA NON-TRANSPORTED SPECIES 163 !!901!!!! 1!34164!CF2CL2 (CFC-12) SURFACE EMISSION !!606!606.4!!! 1!34164!SUPER-COARSE DUST NUMBER AFTER TSTEP!!701!703!!! 1!34164!SUPER-COARSE DUST NUMBER !!705!708!!! 1!34164!UKCA NON-TRANSPORTED SPECIES 164 !!802!!!! 1!34165!CFC-113 SURFACE EMISSION !!606!606.4!!! 1!34165!SUPER-COARSE DUST M.M.R. AFTER TSTEP!1!701!703!!! 1!34165!SUPER-COARSE DUST M.M.R. !1!705!708!!! 1!34165!UKCA NON-TRANSPORTED SPECIES 165 !!802!!!! 1!34166!CH3BR SURFACE EMISSION !!606!606.4!!! 1!34166!UKCA NON-TRANSPORTED SPECIES 166 !!705!!!! 1!34167!CH3CL SURFACE EMISSION !!606!606.4!!! 1!34167!UKCA NON-TRANSPORTED SPECIES 167 !!705!!!! 1!34168!CF2CLBR (H-1211) SURFACE EMISSION !!606!606.4!!! 1!34168!UKCA NON-TRANSPORTED SPECIES 168 !!705!!!! 1!34169!CCL4 SURFACE EMISSION !!606!606.4!!! 1!34169!UKCA NON-TRANSPORTED SPECIES 169 !!705!!!! 1!34170!CHF2CL (HCFC-22) SURFACE EMISSION !!606!606.4!!! 1!34170!UKCA NON-TRANSPORTED SPECIES 170 !!705!!!! 1!34171!CH3CCL3 SURFACE EMISSION !!606!606.4!!! 1!34171!UKCA NON-TRANSPORTED SPECIES 171 !!705!!!! 1!34172!CF3BR (H-1301) SURFACE EMISSION !!606!606.4!!! 1!34172!UKCA NON-TRANSPORTED SPECIES 172 !!705!!!! 1!34173!SO2 SURFACE EMISSION !!606!606.4!!! 1!34173!UKCA NON-TRANSPORTED SPECIES 173 !!705!708!!! 1!34173!UKCA NON-TRANSPORTED SPECIES 173 !!901!1000!!! 1!34174!DMS SURFACE EMISSION !!606!606.4!!! 1!34174!UKCA NON-TRANSPORTED SPECIES 174 !!705!708!!! 1!34175!H2S SURFACE EMISSION !!606!606.4!!! 1!34175!UKCA NON-TRANSPORTED SPECIES 175 !!705!708!!! 1!34176!CS2 SURFACE EMISSION !!606!606.4!!! 1!34176!UKCA NON-TRANSPORTED SPECIES 176 !!705!708!!! 1!34177!COS SURFACE EMISSION !!606!606.4!!! 1!34177!UKCA NON-TRANSPORTED SPECIES 177 !!705!708!!! 1!34178!NH3 SURFACE EMISSION !!606!606.4!!! 1!34178!UKCA NON-TRANSPORTED SPECIES 178 !!705!708!!! 1!34179!RADON-222 SURFACE EMISSION !!606!606.4!!! 1!34179!UKCA NON-TRANSPORTED SPECIES 179 !!705!708!!! 1!34180!NOX SURFACE EMISSION (AS NO2) !!701!703!!! 1!34181!CH4 SURFACE EMISSION !!701!703!!! 1!34182!CO SURFACE EMISSION !!701!703!!! 1!34183!HCHO SURFACE EMISSION !!701!703!!! 1!34184!C2H6 SURFACE EMISSION !!701!703!!! 1!34185!C3H8 SURFACE EMISSION !!701!703!!! 1!34186!CH3COCH3 SURFACE EMISSION !!701!703!!! 1!34187!CH3CHO SURFACE EMISSION !!701!703!!! 1!34188!C5H8 (Isoprene) SURFACE EMISSION !!701!703!!! 1!34189!H2 SURFACE EMISSION !!701!703!!! 1!34190!NOX AIRCRAFT EMISSION AS NO2 !!701!703!!! 1!34191!N2O SURFACE EMISSION !!701!703!!! 1!34192!CFCL3 (CFC-11) SURFACE EMISSION !!701!703!!! 1!34193!CF2CL2 (CFC-12) SURFACE EMISSION !!701!703!!! 1!34194!CFC-113 SURFACE EMISSION !!701!703!!! 1!34195!CH3BR SURFACE EMISSION !!701!703!!! 1!34196!CH3CL SURFACE EMISSION !!701!703!!! 1!34197!CF2CLBR (H-1211) SURFACE EMISSION !!701!703!!! 1!34198!CCL4 SURFACE EMISSION !!701!703!!! 1!34199!CHF2CL (HCFC-22) SURFACE EMISSION !!701!703!!! 1!34200!CH3CCL3 SURFACE EMISSION !!701!703!!! 1!34201!CF3BR (H-1301) SURFACE EMISSION !!701!703!!! 1!34202!SO2 SURFACE EMISSION !!701!703!!! 1!34203!DMS SURFACE EMISSION !!701!703!!! 1!34204!H2S SURFACE EMISSION !!701!703!!! 1!34205!CS2 SURFACE EMISSION !!701!703!!! 1!34206!COS SURFACE EMISSION !!701!703!!! 1!34207!NH3 SURFACE EMISSION !!701!703!!! 1!34208!RADON-222 SURFACE EMISSION !!701!703!!! 1!34209!SO2 HIGH LEVEL EMISSION !!701!703!!! 1!34210!SO2 VOLCANIC EMISSION !!701!703!!! 1!34211!SO2 BIOMASS EMISSION !!701!703!!! 1!34212!C4H10 SURFACE EMISSION !!701!703!!! 1!34213!C2H4 SURFACE EMISSION !!701!703!!! 1!34214!C3H6 SURFACE EMISSION !!701!703!!! 1!34215!TOLUENE SURFACE EMISSION !!701!703!!! 1!34216!O-XYLENE SURFACE EMISSION !!701!703!!! 1!34217!CH3OH SURFACE EMISSION !!701!703!!! 1!34218!MONOTERPENE SURFACE EMISSION !!701!703!!! 1!34219!BLACK CARBON EMISSION FOSSIL FUEL !!701!703!!! 1!34220!ORGANIC CARBON EMISSION FOSSIL FUEL !!701!703!!! 1!34221!BLACK CARBON EMISSION BIOFUEL !!701!703!!! 1!34222!ORGANIC CARBON EMISSION BIOFUEL !!701!703!!! 1!34223!BLACK CARBON EMISSION BIOMASS !!701!703!!! 1!34224!ORGANIC CARBON EMISSION BIOMASS !!701!703!!! 1!34225!PRESCRIBED DUST NUMBER EMISS !!701!703!!! 1!34226!PRESCRIBED DUST EMISS MEAN RADIUS !!701!703!!! 1!34227!PRESCRIBED SEA-SALT NUMBER EMISS !!701!703!!! 1!34228!PRESCRIBED SEA-SALT EMIS MEAN RADIUS!!701!703!!! 1!34231!TROPOSPHERIC CH4 BURDEN (moles) !mol!701!708!!! 1!34232!TROPOSPHERIC O3 BURDEN (moles) !mol!701!708!!! 1!34233!PRESSURE OF 380K THETA SURFACE (Pa) !Pa!701!708!!! 1!34234!PRESSURE OF 2.0 pvu SURFACE (Pa) !Pa!701!708!!! 1!34235!PRESSURE OF PV-THETA TROPOPAUSE (Pa)!Pa!701!708!!! 1!34236!Flux through HO2 + NO Rxn !!701!708!!! 1!34237!Flux through HO2 + NO3 Rxn !!701!708!!! 1!34238!Flux through HO2 + O3 Rxn !!701!708!!! 1!34239!Flux through HO2 + HO2 Bimol Rxn !!701!708!!! 1!34240!Flux through HO2+MeOO->MeOOH Rxn !!701!708!!! 1!34241!Flux through HO2+MeOO=HCHO Rxn !!701!708!!! 1!34242!Flux through HO2 + EtOO Rxn !!701!708!!! 1!34243!Flux through HO2 + MeCO3 = NULL Rxn !!701!708!!! 1!34244!Flux through HO2 + MeCO3 = O3 Rxn !!701!708!!! 1!34245!Flux through HO2+MeCO3=OH+MeOO Rxn !!701!708!!! 1!34246!Flux through HO2 + n-PrOO Rxn !!701!708!!! 1!34247!Flux through HO2 + i-PrOO Rxn !!701!708!!! 1!34248!Flux through HO2 + EtCO3 = O2 Rxn !!701!708!!! 1!34249!Flux through HO2 + EtCO3 = O3 Rxn !!701!708!!! 1!34250!Flux through HO2 + MeCOCH2OO Rxn !!701!708!!! 1!34251!Flux through MeOO+NO=HO2+HCHO+NO2 !!701!708!!! 1!34252!Flux through MeOO + NO = MeONO2 Rxn !!701!708!!! 1!34253!Flux through MeOO + NO3 Rxn !!701!708!!! 1!34254!Flux through MeOO + MeOO = HCHO Rxn !!701!708!!! 1!34255!Flux through MeOO+MeOO=HO2+HCHO Rxn !!701!708!!! 1!34256!Flux thru MeOO+MeCO3=HO2+HCHO Rxn !!701!708!!! 1!34257!Flux through MeOO+MeCO3 = HCHO Rxn !!701!708!!! 1!34258!Flux through EtOO + NO Rxn !!701!708!!! 1!34259!Flux through EtOO + NO3 Rxn !!701!708!!! 1!34260!Flux through EtOO + MeCO3 Rxn !!701!708!!! 1!34261!Flux through MeCO3 + NO Rxn !!701!708!!! 1!34262!Flux through MeCO3 + NO3 Rxn !!701!708!!! 1!34263!Flux through n-PrOO + NO Rxn !!701!708!!! 1!34264!Flux through n-PrOO + NO3 Rxn !!701!708!!! 1!34265!Flux through i-PrOO + NO Rxn !!701!708!!! 1!34266!Flux through i-PrOO + NO3 Rxn !!701!708!!! 1!34267!Flux through EtCO3 + NO Rxn !!701!708!!! 1!34268!Flux through EtCO3 + NO3 Rxn !!701!708!!! 1!34269!Flux through MeCOCH2OO + NO Rxn !!701!708!!! 1!34270!Flux through MeCOCH2OO + NO3 Rxn !!701!708!!! 1!34271!Flux through NO + NO3 Rxn !!701!708!!! 1!34272!Flux through NO + O3 Rxn !!701!708!!! 1!34273!Flux through NO2 + O3 Rxn !!701!708!!! 1!34274!Flux through NO3 + HCHO Rxn !!701!708!!! 1!34275!Flux through NO3 + MeCHO Rxn !!701!708!!! 1!34276!Flux through NO3 + EtCHO Rxn !!701!708!!! 1!34277!Flux through NO3 + Me2CO Rxn !!701!708!!! 1!34278!Flux through N2O5 + H2O Rxn !!701!708!!! 1!34279!Flux through O(3P) + O3 Rxn !!701!708!!! 1!34280!Flux through O(1D)+CH4=OH+MeOO Rxn !!701!708!!! 1!34281!Flux through O(1D)+CH4=HCHO+H2 Rxn !!701!708!!! 1!34282!Flux through O(1D)+CH4=HCHO+HO2 Rxn !!701!708!!! 1!34283!Flux through O(1D) + H2O Rxn !!701!708!!! 1!34284!Flux through O(1D) + N2 Rxn !!701!708!!! 1!34285!Flux through O(1D) + O2 Rxn !!701!708!!! 1!34286!Flux through OH + CH4 Rxn !!701!708!!! 1!34287!Flux through OH + C2H6 Rxn !!701!708!!! 1!34288!Flux through OH + C3H8 = n-PrOO Rxn !!701!708!!! 1!34289!Flux through OH + C3H8 = i-PrOO Rxn !!701!708!!! 1!34290!Flux through OH + CO Rxn !!701!708!!! 1!34291!Flux through OH + EtCHO Rxn !!701!708!!! 1!34292!Flux thru OH+EtOOH=H2O+MeCHO+OH Rxn !!701!708!!! 1!34293!Flux through OH+EtOOH=H2O+EtOO Rxn !!701!708!!! 1!34294!Flux through OH + H2 Rxn !!701!708!!! 1!34295!Flux through OH + H2O2 Rxn !!701!708!!! 1!34296!Flux through OH + HCHO Rxn !!701!708!!! 1!34297!Flux through OH + HO2 Rxn !!701!708!!! 1!34298!Flux through OH + HO2NO2 Rxn !!701!708!!! 1!34299!Flux through OH + HONO2 Rxn !!701!708!!! 1!34300!Flux through OH + HONO Rxn !!701!708!!! 1!34301!Flux thru OH+MeOOH=H2O+HCHO+OH Rxn !!701!708!!! 1!34301!Ox PROD: HO2+NO !!802!804!!! 1!34302!Flux through OH+MeOOH=H2O+MeOO Rxn !!701!708!!! 1!34302!Ox PROD: MeOO+NO !!802!804!!! 1!34303!Flux through OH + MeONO2 Rxn !!701!708!!! 1!34303!Ox PROD: NO+RO2 !!802!804!!! 1!34304!Flux through OH + Me2CO (1) Rxn !!701!708!!! 1!34304!Ox PROD: OH+INORGANIC ACID !!802!804!!! 1!34305!Flux through OH + Me2CO (2) Rxn !!701!708!!! 1!34305!Ox PROD: OH+ORGANIC NITRATE !!802!804!!! 1!34306!Flux for OH+MeCOCH2OOH=MeCOCH2OO Rn !!701!708!!! 1!34306!Ox PROD: ORGANIC NITRATE PHOTOLYSIS !!802!804!!! 1!34307!Flux for OH + MeCOCH2OOH=MGLY Rxn !!701!708!!! 1!34307!Ox PROD: OH + PAN-TYPE REACTIONS !!802!804!!! 1!34308!Flux through OH + MeCHO Rxn !!701!708!!! 1!34309!Flux through OH + NO3 Rxn !!701!708!!! 1!34310!Flux through OH + O3 Rxn !!701!708!!! 1!34311!Flux through OH + OH Rxn !!701!708!!! 1!34311!Ox LOSS: O(1D)+H2O !!802!804!!! 1!34312!Flux through OH + PAN Rxn !!701!708!!! 1!34312!Ox LOSS: MINOR LOSS REACTIONS !!802!804!!! 1!34313!Flux through OH + PPAN Rxn !!701!708!!! 1!34313!Ox LOSS: HO2+O3 !!802!804!!! 1!34314!Flux thru OH+n-PrOOH = n-PrOO Rxn !!701!708!!! 1!34314!Ox LOSS: OH+O3 !!802!804!!! 1!34315!Flux through OH+n-PrOOH = EtCHO Rxn !!701!708!!! 1!34315!Ox LOSS: O3+ALKENE !!802!804!!! 1!34316!Flux through OH+i-PrOOH= i-PrOO Rxn !!701!708!!! 1!34316!Ox LOSS: N2O5+H2O !!802!804!!! 1!34317!Flux through OH+i-PrOOH = Me2CO Rxn !!701!708!!! 1!34317!Ox LOSS: NO3 CHEMICAL LOSS !!802!804!!! 1!34318!Flux through O3P + NO2 Rxn !!701!708!!! 1!34319!Flux through HO2S + O3S Rxn !!701!708!!! 1!34320!Flux through OHS + O3S Rxn !!701!708!!! 1!34321!Flux through O(1D)S + H2O Rxn !!701!708!!! 1!34321!Ox BUDGET: O3 DRY DEPOSITION (3D) !!802!804!!! 1!34322!Flux through O(1D)S + N2 Rxn !!701!708!!! 1!34322!Ox BUDGET: NOy DRY DEPOSITION (3D) !!802!804!!! 1!34323!Flux through O(1D)S + O2 Rxn !!701!708!!! 1!34324!Flux through HO2 + HO2 + M Rxn !!701!708!!! 1!34325!Flux through HO2 + NO2 + M Rxn !!701!708!!! 1!34326!Flux through HO2NO2 + M Rxn !!701!708!!! 1!34327!Flux through MeCO3 + NO2 + M Rxn !!701!708!!! 1!34328!Flux through PAN + M Rxn !!701!708!!! 1!34329!Flux through N2O5 + M Rxn !!701!708!!! 1!34330!Flux through NO2 + NO3 + M Rxn !!701!708!!! 1!34331!Flux through O(3P) + O2 + M Rxn !!701!708!!! 1!34331!Ox BUDGET: NOy WET DEPOSITION (3D) !!802!804!!! 1!34332!Flux through OH + NO + M Rxn !!701!708!!! 1!34333!Flux through OH + NO2 + M Rxn !!701!708!!! 1!34334!Flux through OH + OH + M Rxn !!701!708!!! 1!34335!Flux through EtCO3 + NO2 + M Rxn !!701!708!!! 1!34336!Flux through PPAN + M Rxn !!701!708!!! 1!34337!Flux through O(3P)S + O2 + M Rxn !!701!708!!! 1!34338!C5H8 + OH Rxn Flux !!701!708!!! 1!34341!RXN FLUX: OH+CH4 (CH4 LIFETIME) TROP!!802!804!!! 1!34342!RXN FLUX: NO3+C5H8->ISON !!802!804!!! 1!34343!RXN FLUX: NO+ISO2->ISON !!802!804!!! 1!34344!RXN FLUX: H2O2 PRODUCTION !!802!804!!! 1!34345!RXN FLUX: ROOH PRODUCTION !!802!804!!! 1!34346!RXN FLUX: HONO2 PRODUCTION (HNO3) !!802!804!!! 1!34351!STE: O3 !!802!804!!! 1!34352!TENDENCY: O3 (TROP ONLY) !!802!804!!! 1!34353!TROPOSPHERIC O3 !!802!804!!! 1!34354!TENDENCY: O3 (WHOLE ATMOS) !!802!804!!! 1!34361!AIR MASS DIAGNOSTIC (TROP ONLY) !!802!804!!! 1!34362!TROPOSPHERIC MASK !!802!804!!! 1!34363!AIR MASS DIAGNOSTIC (WHOLE ATMOS) !!802!804!!! 1!34371!CO BUDGET: CO LOSS VIA OH+CO !!802!804!!! 1!34372!CO BUDGET: CO PROD VIA HCHO+OH/NO3 !!802!804!!! 1!34373!CO BUDGET: CO PROD VIA MGLY+OH/NO3 !!802!804!!! 1!34374!CO BUDGET: CO MISC PROD&O3+MACR/ISOP!!802!804!!! 1!34375!CO BUDGET: CO PROD VIA HCHO PHOT RAD!!802!804!!! 1!34376!CO BUDGET: CO PROD VIA HCHO PHOT MOL!!802!804!!! 1!34377!CO BUDGET: CO PROD VIA MGLY PHOTOL !!802!804!!! 1!34378!SO2 + OH => H2SO4 Rxn Flux !!701!708!!! 1!34378!CO BUDGET: CO PROD VIA MISC PHOTOL !!802!804!!! 1!34379!HSO3 + H2O2 => SO4 (Aq) Rxn Flux !!701!708!!! 1!34379!CO BUDGET: CO DRY DEPOSITION (3D) !!802!804!!! 1!34380!SO3 + O3 => SO4 (Aq) Rxn Flux !!701!708!!! 1!34381!DMS + OH => SO2 Rxn Flux !!701!708!!! 1!34381!LIGHTNING NOx EMISSIONS 3D !!802!804!!! 1!34382!DMS + OH => H2SO4 Rxn Flux !!701!708!!! 1!34382!LIGHTNING DIAGNOSTIC: TOT FLASHES 2D!!802!804!!! 1!34383!DMS + OH => MSA Rxn Flux !!701!708!!! 1!34383!LIGHTNING DIAG: CLD TO GRND FLSH 2D !!802!804!!! 1!34384!DMS + NO3 => SO2 Rxn Flux !!701!708!!! 1!34384!LIGHTNING DIAG: CLD TO CLD FLSH 2D !!802!804!!! 1!34385!DMS + NO3 => H2SO4 Rxn Flux !!701!708!!! 1!34385!LIGHTNING DIAG: TOTAL N PRODUCED 2D !!802!804!!! 1!34386!DMS + NO3 => MSA Rxn Flux !!701!708!!! 1!34386!LIGHTNING N IN kg(N)/km^2/s !!802!804!!! 1!34391!STRATOSPHERIC OH PRODUCTION !!802!804!!! 1!34392!STRATOSPHERIC OH LOSS !!802!804!!! 1!34401!STRAT O3 PROD: O2+PHOTON->O(3P)+O(3P!!802!804!!! 1!34402!STRAT O3 PROD: O2+PHOTON->O(3P)+O(1D!!802!804!!! 1!34403!Flux through EtOOH Photol Rxn !!701!708!!! 1!34403!STRAT O3 PROD: HO2 + NO !!802!804!!! 1!34404!Flux through H2O2 Photol Rxn !!701!708!!! 1!34404!STRAT O3 PROD: MeOO + NO !!802!804!!! 1!34405!Flux through HCHO=HO2+CO Photol Rxn !!701!708!!! 1!34406!Flux through HCHO=H2+CO Photol Rxn !!701!708!!! 1!34407!Flux through HO2NO2 Photol Rxn !!701!708!!! 1!34408!Flux through HONO2 Photol Rxn !!701!708!!! 1!34409!Flux through MeCHO=MeOO Photol Rxn !!701!708!!! 1!34410!Flux through MeCHO=CH4 Photol Rxn !!701!708!!! 1!34411!Flux through MeOOH Photol Rxn !!701!708!!! 1!34411!STRAT O3 LOSS: Cl2O2 + PHOTON !!802!804!!! 1!34412!Flux through N2O5 Photol Rxn !!701!708!!! 1!34412!STRAT O3 LOSS: BrO + ClO !!802!804!!! 1!34413!Flux through NO2 Photol Rxn !!701!708!!! 1!34413!STRAT O3 LOSS: HO2 + O3 !!802!804!!! 1!34414!Flux through NO3=NO+O2 Photol Rxn !!701!708!!! 1!34414!STRAT O3 LOSS: ClO + HO2 !!802!804!!! 1!34415!Flux thru NO3=NO2+O(3P) Photol Rxn !!701!708!!! 1!34415!STRAT O3 LOSS: BrO + HO2 !!802!804!!! 1!34416!Flux through O2 = O(3P) Photol Rxn !!701!708!!! 1!34416!STRAT O3 LOSS: O(3P) + ClO !!802!804!!! 1!34417!Flux through O3 = O(1D) Photol Rxn !!701!708!!! 1!34417!STRAT O3 LOSS: O(3P) + NO2 !!802!804!!! 1!34418!Flux through O3 = O(3P) Photol Rxn !!701!708!!! 1!34418!STRAT O3 LOSS: O(3P) + HO2 !!802!804!!! 1!34419!Flux thru PAN=MeCO3+NO2 Photol Rxn !!701!708!!! 1!34419!STRAT O3 LOSS: O3 + H !!802!804!!! 1!34420!Flux through HONO Photol Rxn !!701!708!!! 1!34420!STRAT O3 LOSS: O(3P) + O3 !!802!804!!! 1!34421!Flux through EtCHO Photol Rxn !!701!708!!! 1!34421!STRAT O3 LOSS: NO3 + PHOTON !!802!804!!! 1!34422!Flux through Me2CO Photol Rxn !!701!708!!! 1!34422!STRAT O3 LOSS: O(1D) + H2O !!802!804!!! 1!34423!Flux through n-PrOOH Photol Rxn !!701!708!!! 1!34423!STRAT O3 LOSS: HO2 + NO3 !!802!804!!! 1!34424!Flux through i-PrOOH Photol Rxn !!701!708!!! 1!34424!STRAT O3 LOSS: OH + NO3 !!802!804!!! 1!34425!Flux through MeCOCH2OOH Photol Rxn !!701!708!!! 1!34425!STRAT O3 LOSS: NO3 + HCHO !!802!804!!! 1!34426!Flux through PPAN Photol Rxn !!701!708!!! 1!34427!Flux through MeONO2 Photol Rxn !!701!708!!! 1!34428!Flux through O3S=O(1D)S Photol Rxn !!701!708!!! 1!34429!Flux through O3S=O(3P)S Photol Rxn !!701!708!!! 1!34431!STRAT MISC: O3 DRY DEPOSITION (3D) !!802!804!!! 1!34432!STRAT MISC: NOy DRY DEPOSITION (3D) !!802!804!!! 1!34433!STRAT MISC: NOy WET DEPOSITION (3D) !!802!804!!! 1!34438!Flux of O3 by Dry Deposition !!701!708!!! 1!34439!Flux of NO by Dry Deposition !!701!708!!! 1!34440!Flux of NO3 by Dry Deposition !!701!708!!! 1!34440!DMS + OH => SO2 + MeOO + HCHO !!802!804!!! 1!34441!Flux of NO2 by Dry Deposition !!701!708!!! 1!34441!DMS + OH => 0.6SO2 + 0.4DMSO + MeOO !!802!804!!! 1!34442!Flux of N2O5 by Dry Deposition !!701!708!!! 1!34442!DMS + NO3 => SO2 + HONO2 + MeOO !!802!804!!! 1!34443!Flux of HO2NO2 by Dry Deposition !!701!708!!! 1!34443!DMSO + OH => 0.6SO2 + 0.4MSA !!802!804!!! 1!34444!Flux of HONO2 by Dry Deposition !!701!708!!! 1!34444!CS2 + OH => SO2 + COS !!802!804!!! 1!34445!Flux of H2O2 by Dry Deposition !!701!708!!! 1!34445!H2S + OH => SO2 !!802!804!!! 1!34446!Flux of CH4 by Dry Deposition !!701!708!!! 1!34446!COS + OH => SO2 !!802!804!!! 1!34447!Flux of CO by Dry Deposition !!701!708!!! 1!34447!Monoterp + OH => Sec_org !!802!804!!! 1!34448!Flux of HCHO by Dry Deposition !!701!708!!! 1!34448!Monoterp + O3 => Sec_org !!802!804!!! 1!34449!Flux of MeOOH by Dry Deposition !!701!708!!! 1!34449!Monoterp + NO3 => Sec_org !!802!804!!! 1!34450!Flux of HONO by Dry Deposition !!701!708!!! 1!34450!SO2 + OH => HO2 + H2SO4 !!802!804!!! 1!34451!Flux of EtOOH by Dry Deposition !!701!708!!! 1!34451!SO2 + H2O2 => NULL0 !!802!804!!! 1!34452!Flux of MeCHO by Dry Deposition !!701!708!!! 1!34452!SO2 + O3 => NULL1 !!802!804!!! 1!34453!Flux of PAN by Dry Deposition !!701!708!!! 1!34453!SO2 + O3 => NULL2 !!802!804!!! 1!34454!Flux of n-PrOOH by Dry Deposition !!701!708!!! 1!34454!SO2 DRY DEPOSITION (3D) !!802!804!!! 1!34455!Flux of i-PrOOH by Dry Deposition !!701!708!!! 1!34455!SO2 WET DEPOSITION (3D) !!802!804!!! 1!34456!Flux of EtCHO by Dry Deposition !!701!708!!! 1!34457!Flux of MeCOCH2OOH by Dry Deposition!!701!708!!! 1!34458!Flux of PPAN by Dry Deposition !!701!708!!! 1!34459!Flux of O3S by Dry Deposition !!701!708!!! 1!34460!Flux of SO2 by Dry Deposition !!701!708!!! 1!34461!H2SO4 Dry Deposition Flux !!701!708!!! 1!34462!NH3 Dry Deposition Flux !!701!708!!! 1!34483!Flux of NO3 by Wet Deposition !!701!708!!! 1!34484!Flux of N2O5 by Wet Deposition !!701!708!!! 1!34485!Flux of HO2NO2 by Wet Deposition !!701!708!!! 1!34486!Flux of HONO2 by Wet Deposition !!701!708!!! 1!34487!Flux of HO2 by Wet Deposition !!701!708!!! 1!34488!Flux of H2O2 by Wet Deposition !!701!708!!! 1!34489!Flux of HCHO by Wet Deposition !!701!708!!! 1!34490!Flux of MeOO by Wet Deposition !!701!708!!! 1!34491!Flux of MeOOH by Wet Deposition !!701!708!!! 1!34492!Flux of HONO by Wet Deposition !!701!708!!! 1!34493!Flux of EtOOH by Wet Deposition !!701!708!!! 1!34494!Flux of n-PrOOH by Wet Deposition !!701!708!!! 1!34495!Flux of i-PrOOH by Wet Deposition !!701!708!!! 1!34496!Flux of MeCOCH2OOH by Wet Deposition!!701!708!!! 1!34497!Flux of HO2S by Wet Deposition !!701!708!!! 1!34498!Flux of SO2 by Wet Deposition !!701!708!!! 1!34499!H2SO4 Wet Deposition Flux !!701!708!!! 1!34500!NH3 Wet Deposition Flux !!701!708!!! 1!35001!U COMPNT OF WIND AFTER SKEB2 !!704!!!! 1!35002!V COMPNT OF WIND AFTER SKEB2 !!704!!!! 1!35003!U COMPNT OF WIND INCR SKEB2 !!704!!!! 1!35004!V COMPNT OF WIND INCR SKEB2 !!704!!!! 1!35005!ROT U COMPNT OF WIND INCR SKEB2 !!704!!!! 1!35006!ROT V COMPNT OF WIND INCR SKEB2 !!704!!!! 1!35007!DIV U COMPNT OF WIND INCR SKEB2 !!704!!!! 1!35008!DIV V COMPNT OF WIND INCR SKEB2 !!704!!!! 1!35009!SKEB2 DISSIPATION FROM SMAG !!704!!!! 1!35010!SKEB2 DISSIPATION FROM CONVECTION !!704!!!! 1!35011!SKEB2 DISS FROM CONVECTION (W-MFLX) !!704!706!!! 1!35011!SKEB2 DISS FROM SKEB1-TYPE PATTERN !!707!!!! 1!35012!SKEB2 SMOOTHED MODULATING FIELD !!704!!!! 1!35013!SKEB2 STREAMFUNCTION FORC FIELD !!704!!!! 1!35014!SKEB2 INITIAL RANDOM PATTERN !!704!!!! 1!35015!MASS VERT INT OF STRM FORC FIELD !!704!!!! 1!35016!VERT INTEG NUMERICAL DISSP (W/M^2) !W m-2!704!!!! 1!35017!VERT INTEG CONVECTVE DISSP (W/M^2) !W m-2!704!!!! 1!35018!VERT INTEG MFLX-W CNV DISS (W/M^2) !W m-2!704!706!!! 1!35018!VERT INTEG SKEB1-TYPE DISS (W/M^2) !W m-2!707!!!! 1!35019!MASS VERT INT OF MODULATED STRMFUNC !!704!!!! 1!35020!V INT KE WIND INCR PRE SKEB2 (J/M^2)!J m-2!704!!!! 1!35021!V INT KE WIND INCR SKEB2 (J/M^2) !J m-2!704!!!! 1!35022!V INT KE WIND INCR POST SKEB2(J/M^2)!J m-2!704!!!! 1!35023!SPT FORCING PATTERN !!901!!!! 1!35024!THETA TENDENCY SPT INCREMENT !!901!!!! 1!35025!Q TENDENCY SPT INCREMENT !!901!!!! 1!35026!U TENDENCY SPT INCREMENT !!901!!!! 1!35027!V TENDENCY SPT INCREMENT !!901!!!! 1!35028!CFL criteria breached !!901!!!! 1!36001!ATM TRACER 1 LATERAL BOUNDARY VAL.!!704!!!! 1!36002!ATM TRACER 2 LATERAL BOUNDARY VAL.!!704!!!! 1!36003!ATM TRACER 3 LATERAL BOUNDARY VAL.!!704!!!! 1!36004!ATM TRACER 4 LATERAL BOUNDARY VAL.!!704!!!! 1!36005!ATM TRACER 5 LATERAL BOUNDARY VAL.!!704!!!! 1!36006!ATM TRACER 6 LATERAL BOUNDARY VAL.!!704!!!! 1!36007!ATM TRACER 7 LATERAL BOUNDARY VAL.!!704!!!! 1!36008!ATM TRACER 8 LATERAL BOUNDARY VAL.!!704!!!! 1!36009!ATM TRACER 9 LATERAL BOUNDARY VAL.!!704!!!! 1!36010!ATM TRACER 10 LATERAL BOUNDARY VAL.!!704!!!! 1!36011!ATM TRACER 11 LATERAL BOUNDARY VAL.!!704!!!! 1!36012!ATM TRACER 12 LATERAL BOUNDARY VAL.!!704!!!! 1!36013!ATM TRACER 13 LATERAL BOUNDARY VAL.!!704!!!! 1!36014!ATM TRACER 14 LATERAL BOUNDARY VAL.!!704!!!! 1!36015!ATM TRACER 15 LATERAL BOUNDARY VAL.!!704!!!! 1!36016!ATM TRACER 16 LATERAL BOUNDARY VAL.!!704!!!! 1!36017!ATM TRACER 17 LATERAL BOUNDARY VAL.!!704!!!! 1!36018!ATM TRACER 18 LATERAL BOUNDARY VAL.!!704!!!! 1!36019!ATM TRACER 19 LATERAL BOUNDARY VAL.!!704!!!! 1!36020!ATM TRACER 20 LATERAL BOUNDARY VAL.!!704!!!! 1!36021!ATM TRACER 21 LATERAL BOUNDARY VAL.!!704!!!! 1!36022!ATM TRACER 22 LATERAL BOUNDARY VAL.!!704!!!! 1!36023!ATM TRACER 23 LATERAL BOUNDARY VAL.!!704!!!! 1!36024!ATM TRACER 24 LATERAL BOUNDARY VAL.!!704!!!! 1!36025!ATM TRACER 25 LATERAL BOUNDARY VAL.!!704!!!! 1!36026!ATM TRACER 26 LATERAL BOUNDARY VAL.!!704!!!! 1!36027!ATM TRACER 27 LATERAL BOUNDARY VAL.!!704!!!! 1!36028!ATM TRACER 28 LATERAL BOUNDARY VAL.!!704!!!! 1!36029!ATM TRACER 29 LATERAL BOUNDARY VAL.!!704!!!! 1!36030!ATM TRACER 30 LATERAL BOUNDARY VAL.!!704!!!! 1!36031!ATM TRACER 31 LATERAL BOUNDARY VAL.!!704!!!! 1!36032!ATM TRACER 32 LATERAL BOUNDARY VAL.!!704!!!! 1!36033!ATM TRACER 33 LATERAL BOUNDARY VAL.!!704!!!! 1!36034!ATM TRACER 34 LATERAL BOUNDARY VAL.!!704!!!! 1!36035!ATM TRACER 35 LATERAL BOUNDARY VAL.!!704!!!! 1!36036!ATM TRACER 36 LATERAL BOUNDARY VAL.!!704!!!! 1!36037!ATM TRACER 37 LATERAL BOUNDARY VAL.!!704!!!! 1!36038!ATM TRACER 38 LATERAL BOUNDARY VAL.!!704!!!! 1!36039!ATM TRACER 39 LATERAL BOUNDARY VAL.!!704!!!! 1!36040!ATM TRACER 40 LATERAL BOUNDARY VAL.!!704!!!! 1!36041!ATM TRACER 41 LATERAL BOUNDARY VAL.!!704!!!! 1!36042!ATM TRACER 42 LATERAL BOUNDARY VAL.!!704!!!! 1!36043!ATM TRACER 43 LATERAL BOUNDARY VAL.!!704!!!! 1!36044!ATM TRACER 44 LATERAL BOUNDARY VAL.!!704!!!! 1!36045!ATM TRACER 45 LATERAL BOUNDARY VAL.!!704!!!! 1!36046!ATM TRACER 46 LATERAL BOUNDARY VAL.!!704!!!! 1!36047!ATM TRACER 47 LATERAL BOUNDARY VAL.!!704!!!! 1!36048!ATM TRACER 48 LATERAL BOUNDARY VAL.!!704!!!! 1!36049!ATM TRACER 49 LATERAL BOUNDARY VAL.!!704!!!! 1!36050!ATM TRACER 50 LATERAL BOUNDARY VAL.!!704!!!! 1!36051!ATM TRACER 51 LATERAL BOUNDARY VAL.!!704!!!! 1!36052!ATM TRACER 52 LATERAL BOUNDARY VAL.!!704!!!! 1!36053!ATM TRACER 53 LATERAL BOUNDARY VAL.!!704!!!! 1!36054!ATM TRACER 54 LATERAL BOUNDARY VAL.!!704!!!! 1!36055!ATM TRACER 55 LATERAL BOUNDARY VAL.!!704!!!! 1!36056!ATM TRACER 56 LATERAL BOUNDARY VAL.!!704!!!! 1!36057!ATM TRACER 57 LATERAL BOUNDARY VAL.!!704!!!! 1!36058!ATM TRACER 58 LATERAL BOUNDARY VAL.!!704!!!! 1!36059!ATM TRACER 59 LATERAL BOUNDARY VAL.!!704!!!! 1!36060!ATM TRACER 60 LATERAL BOUNDARY VAL.!!704!!!! 1!36061!ATM TRACER 61 LATERAL BOUNDARY VAL.!!704!!!! 1!36062!ATM TRACER 62 LATERAL BOUNDARY VAL.!!704!!!! 1!36063!ATM TRACER 63 LATERAL BOUNDARY VAL.!!704!!!! 1!36064!ATM TRACER 64 LATERAL BOUNDARY VAL.!!704!!!! 1!36065!ATM TRACER 65 LATERAL BOUNDARY VAL.!!704!!!! 1!36066!ATM TRACER 66 LATERAL BOUNDARY VAL.!!704!!!! 1!36067!ATM TRACER 67 LATERAL BOUNDARY VAL.!!704!!!! 1!36068!ATM TRACER 68 LATERAL BOUNDARY VAL.!!704!!!! 1!36069!ATM TRACER 69 LATERAL BOUNDARY VAL.!!704!!!! 1!36070!ATM TRACER 70 LATERAL BOUNDARY VAL.!!704!!!! 1!36071!ATM TRACER 71 LATERAL BOUNDARY VAL.!!704!!!! 1!36072!ATM TRACER 72 LATERAL BOUNDARY VAL.!!704!!!! 1!36073!ATM TRACER 73 LATERAL BOUNDARY VAL.!!704!!!! 1!36074!ATM TRACER 74 LATERAL BOUNDARY VAL.!!704!!!! 1!36075!ATM TRACER 75 LATERAL BOUNDARY VAL.!!704!!!! 1!36076!ATM TRACER 76 LATERAL BOUNDARY VAL.!!704!!!! 1!36077!ATM TRACER 77 LATERAL BOUNDARY VAL.!!704!!!! 1!36078!ATM TRACER 78 LATERAL BOUNDARY VAL.!!704!!!! 1!36079!ATM TRACER 79 LATERAL BOUNDARY VAL.!!704!!!! 1!36080!ATM TRACER 80 LATERAL BOUNDARY VAL.!!704!!!! 1!36081!ATM TRACER 81 LATERAL BOUNDARY VAL.!!704!!!! 1!36082!ATM TRACER 82 LATERAL BOUNDARY VAL.!!704!!!! 1!36083!ATM TRACER 83 LATERAL BOUNDARY VAL.!!704!!!! 1!36084!ATM TRACER 84 LATERAL BOUNDARY VAL.!!704!!!! 1!36085!ATM TRACER 85 LATERAL BOUNDARY VAL.!!704!!!! 1!36086!ATM TRACER 86 LATERAL BOUNDARY VAL.!!704!!!! 1!36087!ATM TRACER 87 LATERAL BOUNDARY VAL.!!704!!!! 1!36088!ATM TRACER 88 LATERAL BOUNDARY VAL.!!704!!!! 1!36089!ATM TRACER 89 LATERAL BOUNDARY VAL.!!704!!!! 1!36090!ATM TRACER 90 LATERAL BOUNDARY VAL.!!704!!!! 1!36091!ATM TRACER 91 LATERAL BOUNDARY VAL.!!704!!!! 1!36092!ATM TRACER 92 LATERAL BOUNDARY VAL.!!704!!!! 1!36093!ATM TRACER 93 LATERAL BOUNDARY VAL.!!704!!!! 1!36094!ATM TRACER 94 LATERAL BOUNDARY VAL.!!704!!!! 1!36095!ATM TRACER 95 LATERAL BOUNDARY VAL.!!704!!!! 1!36096!ATM TRACER 96 LATERAL BOUNDARY VAL.!!704!!!! 1!36097!ATM TRACER 97 LATERAL BOUNDARY VAL.!!704!!!! 1!36098!ATM TRACER 98 LATERAL BOUNDARY VAL.!!704!!!! 1!36099!ATM TRACER 99 LATERAL BOUNDARY VAL.!!704!!!! 1!36100!ATM TRACER 100 LATERAL BOUNDARY VAL.!!704!!!! 1!36101!ATM TRACER 101 LATERAL BOUNDARY VAL.!!704!!!! 1!36102!ATM TRACER 102 LATERAL BOUNDARY VAL.!!704!!!! 1!36103!ATM TRACER 103 LATERAL BOUNDARY VAL.!!704!!!! 1!36104!ATM TRACER 104 LATERAL BOUNDARY VAL.!!704!!!! 1!36105!ATM TRACER 105 LATERAL BOUNDARY VAL.!!704!!!! 1!36106!ATM TRACER 106 LATERAL BOUNDARY VAL.!!704!!!! 1!36107!ATM TRACER 107 LATERAL BOUNDARY VAL.!!704!!!! 1!36108!ATM TRACER 108 LATERAL BOUNDARY VAL.!!704!!!! 1!36109!ATM TRACER 109 LATERAL BOUNDARY VAL.!!704!!!! 1!36110!ATM TRACER 110 LATERAL BOUNDARY VAL.!!704!!!! 1!36111!ATM TRACER 111 LATERAL BOUNDARY VAL.!!704!!!! 1!36112!ATM TRACER 112 LATERAL BOUNDARY VAL.!!704!!!! 1!36113!ATM TRACER 113 LATERAL BOUNDARY VAL.!!704!!!! 1!36114!ATM TRACER 114 LATERAL BOUNDARY VAL.!!704!!!! 1!36115!ATM TRACER 115 LATERAL BOUNDARY VAL.!!704!!!! 1!36116!ATM TRACER 116 LATERAL BOUNDARY VAL.!!704!!!! 1!36117!ATM TRACER 117 LATERAL BOUNDARY VAL.!!704!!!! 1!36118!ATM TRACER 118 LATERAL BOUNDARY VAL.!!704!!!! 1!36119!ATM TRACER 119 LATERAL BOUNDARY VAL.!!704!!!! 1!36120!ATM TRACER 120 LATERAL BOUNDARY VAL.!!704!!!! 1!36121!ATM TRACER 121 LATERAL BOUNDARY VAL.!!704!!!! 1!36122!ATM TRACER 122 LATERAL BOUNDARY VAL.!!704!!!! 1!36123!ATM TRACER 123 LATERAL BOUNDARY VAL.!!704!!!! 1!36124!ATM TRACER 124 LATERAL BOUNDARY VAL.!!704!!!! 1!36125!ATM TRACER 125 LATERAL BOUNDARY VAL.!!704!!!! 1!36126!ATM TRACER 126 LATERAL BOUNDARY VAL.!!704!!!! 1!36127!ATM TRACER 127 LATERAL BOUNDARY VAL.!!704!!!! 1!36128!ATM TRACER 128 LATERAL BOUNDARY VAL.!!704!!!! 1!36129!ATM TRACER 129 LATERAL BOUNDARY VAL.!!704!!!! 1!36130!ATM TRACER 130 LATERAL BOUNDARY VAL.!!704!!!! 1!36131!ATM TRACER 131 LATERAL BOUNDARY VAL.!!704!!!! 1!36132!ATM TRACER 132 LATERAL BOUNDARY VAL.!!704!!!! 1!36133!ATM TRACER 133 LATERAL BOUNDARY VAL.!!704!!!! 1!36134!ATM TRACER 134 LATERAL BOUNDARY VAL.!!704!!!! 1!36135!ATM TRACER 135 LATERAL BOUNDARY VAL.!!704!!!! 1!36136!ATM TRACER 136 LATERAL BOUNDARY VAL.!!704!!!! 1!36137!ATM TRACER 137 LATERAL BOUNDARY VAL.!!704!!!! 1!36138!ATM TRACER 138 LATERAL BOUNDARY VAL.!!704!!!! 1!36139!ATM TRACER 139 LATERAL BOUNDARY VAL.!!704!!!! 1!36140!ATM TRACER 140 LATERAL BOUNDARY VAL.!!704!!!! 1!36141!ATM TRACER 141 LATERAL BOUNDARY VAL.!!704!!!! 1!36142!ATM TRACER 142 LATERAL BOUNDARY VAL.!!704!!!! 1!36143!ATM TRACER 143 LATERAL BOUNDARY VAL.!!704!!!! 1!36144!ATM TRACER 144 LATERAL BOUNDARY VAL.!!704!!!! 1!36145!ATM TRACER 145 LATERAL BOUNDARY !!704!!!! 1!36146!ATM TRACER 146 LATERAL BOUNDARY VAL.!!704!!!! 1!36147!ATM TRACER 147 LATERAL BOUNDARY VAL.!!704!!!! 1!36148!ATM TRACER 148 LATERAL BOUNDARY VAL.!!704!!!! 1!36149!ATM TRACER 149 LATERAL BOUNDARY VAL.!!704!!!! 1!36150!ATM TRACER 150 LATERAL BOUNDARY VAL.!!704!!!! 1!36257!ATM TRACER 1 BOUNDARY TENDENCY !!704!!!! 1!36258!ATM TRACER 2 BOUNDARY TENDENCY !!704!!!! 1!36259!ATM TRACER 3 BOUNDARY TENDENCY !!704!!!! 1!36260!ATM TRACER 4 BOUNDARY TENDENCY !!704!!!! 1!36261!ATM TRACER 5 BOUNDARY TENDENCY !!704!!!! 1!36262!ATM TRACER 6 BOUNDARY TENDENCY !!704!!!! 1!36263!ATM TRACER 7 BOUNDARY TENDENCY !!704!!!! 1!36264!ATM TRACER 8 BOUNDARY TENDENCY !!704!!!! 1!36265!ATM TRACER 9 BOUNDARY TENDENCY !!704!!!! 1!36266!ATM TRACER 10 BOUNDARY TENDENCY !!704!!!! 1!36267!ATM TRACER 11 BOUNDARY TENDENCY !!704!!!! 1!36268!ATM TRACER 12 BOUNDARY TENDENCY !!704!!!! 1!36269!ATM TRACER 13 BOUNDARY TENDENCY !!704!!!! 1!36270!ATM TRACER 14 BOUNDARY TENDENCY !!704!!!! 1!36271!ATM TRACER 15 BOUNDARY TENDENCY !!704!!!! 1!36272!ATM TRACER 16 BOUNDARY TENDENCY !!704!!!! 1!36273!ATM TRACER 17 BOUNDARY TENDENCY !!704!!!! 1!36274!ATM TRACER 18 BOUNDARY TENDENCY !!704!!!! 1!36275!ATM TRACER 19 BOUNDARY TENDENCY !!704!!!! 1!36276!ATM TRACER 20 BOUNDARY TENDENCY !!704!!!! 1!36277!ATM TRACER 21 BOUNDARY TENDENCY !!704!!!! 1!36278!ATM TRACER 22 BOUNDARY TENDENCY !!704!!!! 1!36279!ATM TRACER 23 BOUNDARY TENDENCY !!704!!!! 1!36280!ATM TRACER 24 BOUNDARY TENDENCY !!704!!!! 1!36281!ATM TRACER 25 BOUNDARY TENDENCY !!704!!!! 1!36282!ATM TRACER 26 BOUNDARY TENDENCY !!704!!!! 1!36283!ATM TRACER 27 BOUNDARY TENDENCY !!704!!!! 1!36284!ATM TRACER 28 BOUNDARY TENDENCY !!704!!!! 1!36285!ATM TRACER 29 BOUNDARY TENDENCY !!704!!!! 1!36286!ATM TRACER 30 BOUNDARY TENDENCY !!704!!!! 1!36287!ATM TRACER 31 BOUNDARY TENDENCY !!704!!!! 1!36288!ATM TRACER 32 BOUNDARY TENDENCY !!704!!!! 1!36289!ATM TRACER 33 BOUNDARY TENDENCY !!704!!!! 1!36290!ATM TRACER 34 BOUNDARY TENDENCY !!704!!!! 1!36291!ATM TRACER 35 BOUNDARY TENDENCY !!704!!!! 1!36292!ATM TRACER 36 BOUNDARY TENDENCY !!704!!!! 1!36293!ATM TRACER 37 BOUNDARY TENDENCY !!704!!!! 1!36294!ATM TRACER 38 BOUNDARY TENDENCY !!704!!!! 1!36295!ATM TRACER 39 BOUNDARY TENDENCY !!704!!!! 1!36296!ATM TRACER 40 BOUNDARY TENDENCY !!704!!!! 1!36297!ATM TRACER 41 BOUNDARY TENDENCY !!704!!!! 1!36298!ATM TRACER 42 BOUNDARY TENDENCY !!704!!!! 1!36299!ATM TRACER 43 BOUNDARY TENDENCY !!704!!!! 1!36300!ATM TRACER 44 BOUNDARY TENDENCY !!704!!!! 1!36301!ATM TRACER 45 BOUNDARY TENDENCY !!704!!!! 1!36302!ATM TRACER 46 BOUNDARY TENDENCY !!704!!!! 1!36303!ATM TRACER 47 BOUNDARY TENDENCY !!704!!!! 1!36304!ATM TRACER 48 BOUNDARY TENDENCY !!704!!!! 1!36305!ATM TRACER 49 BOUNDARY TENDENCY !!704!!!! 1!36306!ATM TRACER 50 BOUNDARY TENDENCY !!704!!!! 1!36307!ATM TRACER 51 BOUNDARY TENDENCY !!704!!!! 1!36308!ATM TRACER 52 BOUNDARY TENDENCY !!704!!!! 1!36309!ATM TRACER 53 BOUNDARY TENDENCY !!704!!!! 1!36310!ATM TRACER 54 BOUNDARY TENDENCY !!704!!!! 1!36311!ATM TRACER 55 BOUNDARY TENDENCY !!704!!!! 1!36312!ATM TRACER 56 BOUNDARY TENDENCY !!704!!!! 1!36313!ATM TRACER 57 BOUNDARY TENDENCY !!704!!!! 1!36314!ATM TRACER 58 BOUNDARY TENDENCY !!704!!!! 1!36315!ATM TRACER 59 BOUNDARY TENDENCY !!704!!!! 1!36316!ATM TRACER 60 BOUNDARY TENDENCY !!704!!!! 1!36317!ATM TRACER 61 BOUNDARY TENDENCY !!704!!!! 1!36318!ATM TRACER 62 BOUNDARY TENDENCY !!704!!!! 1!36319!ATM TRACER 63 BOUNDARY TENDENCY !!704!!!! 1!36320!ATM TRACER 64 BOUNDARY TENDENCY !!704!!!! 1!36321!ATM TRACER 65 BOUNDARY TENDENCY !!704!!!! 1!36322!ATM TRACER 66 BOUNDARY TENDENCY !!704!!!! 1!36323!ATM TRACER 67 BOUNDARY TENDENCY !!704!!!! 1!36324!ATM TRACER 68 BOUNDARY TENDENCY !!704!!!! 1!36325!ATM TRACER 69 BOUNDARY TENDENCY !!704!!!! 1!36326!ATM TRACER 70 BOUNDARY TENDENCY !!704!!!! 1!36327!ATM TRACER 71 BOUNDARY TENDENCY !!704!!!! 1!36328!ATM TRACER 72 BOUNDARY TENDENCY !!704!!!! 1!36329!ATM TRACER 73 BOUNDARY TENDENCY !!704!!!! 1!36330!ATM TRACER 74 BOUNDARY TENDENCY !!704!!!! 1!36331!ATM TRACER 75 BOUNDARY TENDENCY !!704!!!! 1!36332!ATM TRACER 76 BOUNDARY TENDENCY !!704!!!! 1!36333!ATM TRACER 77 BOUNDARY TENDENCY !!704!!!! 1!36334!ATM TRACER 78 BOUNDARY TENDENCY !!704!!!! 1!36335!ATM TRACER 79 BOUNDARY TENDENCY !!704!!!! 1!36336!ATM TRACER 80 BOUNDARY TENDENCY !!704!!!! 1!36337!ATM TRACER 81 BOUNDARY TENDENCY !!704!!!! 1!36338!ATM TRACER 82 BOUNDARY TENDENCY !!704!!!! 1!36339!ATM TRACER 83 BOUNDARY TENDENCY !!704!!!! 1!36340!ATM TRACER 84 BOUNDARY TENDENCY !!704!!!! 1!36341!ATM TRACER 85 BOUNDARY TENDENCY !!704!!!! 1!36342!ATM TRACER 86 BOUNDARY TENDENCY !!704!!!! 1!36343!ATM TRACER 87 BOUNDARY TENDENCY !!704!!!! 1!36344!ATM TRACER 88 BOUNDARY TENDENCY !!704!!!! 1!36345!ATM TRACER 89 BOUNDARY TENDENCY !!704!!!! 1!36346!ATM TRACER 90 BOUNDARY TENDENCY !!704!!!! 1!36347!ATM TRACER 91 BOUNDARY TENDENCY !!704!!!! 1!36348!ATM TRACER 92 BOUNDARY TENDENCY !!704!!!! 1!36349!ATM TRACER 93 BOUNDARY TENDENCY !!704!!!! 1!36350!ATM TRACER 94 BOUNDARY TENDENCY !!704!!!! 1!36351!ATM TRACER 95 BOUNDARY TENDENCY !!704!!!! 1!36352!ATM TRACER 96 BOUNDARY TENDENCY !!704!!!! 1!36353!ATM TRACER 97 BOUNDARY TENDENCY !!704!!!! 1!36354!ATM TRACER 98 BOUNDARY TENDENCY !!704!!!! 1!36355!ATM TRACER 99 BOUNDARY TENDENCY !!704!!!! 1!36356!ATM TRACER 100 BOUNDARY TENDENCY !!704!!!! 1!36357!ATM TRACER 101 BOUNDARY TENDENCY !!704!!!! 1!36358!ATM TRACER 102 BOUNDARY TENDENCY !!704!!!! 1!36359!ATM TRACER 103 BOUNDARY TENDENCY !!704!!!! 1!36360!ATM TRACER 104 BOUNDARY TENDENCY !!704!!!! 1!36361!ATM TRACER 105 BOUNDARY TENDENCY !!704!!!! 1!36362!ATM TRACER 106 BOUNDARY TENDENCY !!704!!!! 1!36363!ATM TRACER 107 BOUNDARY TENDENCY !!704!!!! 1!36364!ATM TRACER 108 BOUNDARY TENDENCY !!704!!!! 1!36365!ATM TRACER 109 BOUNDARY TENDENCY !!704!!!! 1!36366!ATM TRACER 110 BOUNDARY TENDENCY !!704!!!! 1!36367!ATM TRACER 111 BOUNDARY TENDENCY !!704!!!! 1!36368!ATM TRACER 112 BOUNDARY TENDENCY !!704!!!! 1!36369!ATM TRACER 113 BOUNDARY TENDENCY !!704!!!! 1!36370!ATM TRACER 114 BOUNDARY TENDENCY !!704!!!! 1!36371!ATM TRACER 115 BOUNDARY TENDENCY !!704!!!! 1!36372!ATM TRACER 116 BOUNDARY TENDENCY !!704!!!! 1!36373!ATM TRACER 117 BOUNDARY TENDENCY !!704!!!! 1!36374!ATM TRACER 118 BOUNDARY TENDENCY !!704!!!! 1!36375!ATM TRACER 119 BOUNDARY TENDENCY !!704!!!! 1!36376!ATM TRACER 120 BOUNDARY TENDENCY !!704!!!! 1!36377!ATM TRACER 121 BOUNDARY TENDENCY !!704!!!! 1!36378!ATM TRACER 122 BOUNDARY TENDENCY !!704!!!! 1!36379!ATM TRACER 123 BOUNDARY TENDENCY !!704!!!! 1!36380!ATM TRACER 124 BOUNDARY TENDENCY !!704!!!! 1!36381!ATM TRACER 125 BOUNDARY TENDENCY !!704!!!! 1!36382!ATM TRACER 126 BOUNDARY TENDENCY !!704!!!! 1!36383!ATM TRACER 127 BOUNDARY TENDENCY !!704!!!! 1!36384!ATM TRACER 128 BOUNDARY TENDENCY !!704!!!! 1!36385!ATM TRACER 129 BOUNDARY TENDENCY !!704!!!! 1!36386!ATM TRACER 130 BOUNDARY TENDENCY !!704!!!! 1!36387!ATM TRACER 131 BOUNDARY TENDENCY !!704!!!! 1!36388!ATM TRACER 132 BOUNDARY TENDENCY !!704!!!! 1!36389!ATM TRACER 133 BOUNDARY TENDENCY !!704!!!! 1!36390!ATM TRACER 134 BOUNDARY TENDENCY !!704!!!! 1!36391!ATM TRACER 135 BOUNDARY TENDENCY !!704!!!! 1!36392!ATM TRACER 136 BOUNDARY TENDENCY !!704!!!! 1!36393!ATM TRACER 137 BOUNDARY TENDENCY !!704!!!! 1!36394!ATM TRACER 138 BOUNDARY TENDENCY !!704!!!! 1!36395!ATM TRACER 139 BOUNDARY TENDENCY !!704!!!! 1!36396!ATM TRACER 140 BOUNDARY TENDENCY !!704!!!! 1!36397!ATM TRACER 141 BOUNDARY TENDENCY !!704!!!! 1!36398!ATM TRACER 142 BOUNDARY TENDENCY !!704!!!! 1!36399!ATM TRACER 143 BOUNDARY TENDENCY !!704!!!! 1!36400!ATM TRACER 144 BOUNDARY TENDENCY !!704!!!! 1!36401!ATM TRACER 145 BOUNDARY TENDENCY !!704!!!! 1!36402!ATM TRACER 146 BOUNDARY TENDENCY !!704!!!! 1!36403!ATM TRACER 147 BOUNDARY TENDENCY !!704!!!! 1!36404!ATM TRACER 148 BOUNDARY TENDENCY !!704!!!! 1!36405!ATM TRACER 149 BOUNDARY TENDENCY !!704!!!! 1!36406!ATM TRACER 150 BOUNDARY TENDENCY !!704!!!! 1!37001!UKCA TRACER 1 LATERAL BOUNDARY VAL.!!704!!!! 1!37002!UKCA TRACER 2 LATERAL BOUNDARY VAL.!!704!!!! 1!37003!UKCA TRACER 3 LATERAL BOUNDARY VAL.!!704!!!! 1!37004!UKCA TRACER 4 LATERAL BOUNDARY VAL.!!704!!!! 1!37005!UKCA TRACER 5 LATERAL BOUNDARY VAL.!!704!!!! 1!37006!UKCA TRACER 6 LATERAL BOUNDARY VAL.!!704!!!! 1!37007!UKCA TRACER 7 LATERAL BOUNDARY VAL.!!704!!!! 1!37008!UKCA TRACER 8 LATERAL BOUNDARY VAL.!!704!!!! 1!37009!UKCA TRACER 9 LATERAL BOUNDARY VAL.!!704!!!! 1!37010!UKCA TRACER 10 LATERAL BOUNDARY VAL.!!704!!!! 1!37011!UKCA TRACER 11 LATERAL BOUNDARY VAL.!!704!!!! 1!37012!UKCA TRACER 12 LATERAL BOUNDARY VAL.!!704!!!! 1!37013!UKCA TRACER 13 LATERAL BOUNDARY VAL.!!704!!!! 1!37014!UKCA TRACER 14 LATERAL BOUNDARY VAL.!!704!!!! 1!37015!UKCA TRACER 15 LATERAL BOUNDARY VAL.!!704!!!! 1!37016!UKCA TRACER 16 LATERAL BOUNDARY VAL.!!704!!!! 1!37017!UKCA TRACER 17 LATERAL BOUNDARY VAL.!!704!!!! 1!37018!UKCA TRACER 18 LATERAL BOUNDARY VAL.!!704!!!! 1!37019!UKCA TRACER 19 LATERAL BOUNDARY VAL.!!704!!!! 1!37020!UKCA TRACER 20 LATERAL BOUNDARY VAL.!!704!!!! 1!37021!UKCA TRACER 21 LATERAL BOUNDARY VAL.!!704!!!! 1!37022!UKCA TRACER 22 LATERAL BOUNDARY VAL.!!704!!!! 1!37023!UKCA TRACER 23 LATERAL BOUNDARY VAL.!!704!!!! 1!37024!UKCA TRACER 24 LATERAL BOUNDARY VAL.!!704!!!! 1!37025!UKCA TRACER 25 LATERAL BOUNDARY VAL.!!704!!!! 1!37026!UKCA TRACER 26 LATERAL BOUNDARY VAL.!!704!!!! 1!37027!UKCA TRACER 27 LATERAL BOUNDARY VAL.!!704!!!! 1!37028!UKCA TRACER 28 LATERAL BOUNDARY VAL.!!704!!!! 1!37029!UKCA TRACER 29 LATERAL BOUNDARY VAL.!!704!!!! 1!37030!UKCA TRACER 30 LATERAL BOUNDARY VAL.!!704!!!! 1!37031!UKCA TRACER 31 LATERAL BOUNDARY VAL.!!704!!!! 1!37032!UKCA TRACER 32 LATERAL BOUNDARY VAL.!!704!!!! 1!37033!UKCA TRACER 33 LATERAL BOUNDARY VAL.!!704!!!! 1!37034!UKCA TRACER 34 LATERAL BOUNDARY VAL.!!704!!!! 1!37035!UKCA TRACER 35 LATERAL BOUNDARY VAL.!!704!!!! 1!37036!UKCA TRACER 36 LATERAL BOUNDARY VAL.!!704!!!! 1!37037!UKCA TRACER 37 LATERAL BOUNDARY VAL.!!704!!!! 1!37038!UKCA TRACER 38 LATERAL BOUNDARY VAL.!!704!!!! 1!37039!UKCA TRACER 39 LATERAL BOUNDARY VAL.!!704!!!! 1!37040!UKCA TRACER 40 LATERAL BOUNDARY VAL.!!704!!!! 1!37041!UKCA TRACER 41 LATERAL BOUNDARY VAL.!!704!!!! 1!37042!UKCA TRACER 42 LATERAL BOUNDARY VAL.!!704!!!! 1!37043!UKCA TRACER 43 LATERAL BOUNDARY VAL.!!704!!!! 1!37044!UKCA TRACER 44 LATERAL BOUNDARY VAL.!!704!!!! 1!37045!UKCA TRACER 45 LATERAL BOUNDARY VAL.!!704!!!! 1!37046!UKCA TRACER 46 LATERAL BOUNDARY VAL.!!704!!!! 1!37047!UKCA TRACER 47 LATERAL BOUNDARY VAL.!!704!!!! 1!37048!UKCA TRACER 48 LATERAL BOUNDARY VAL.!!704!!!! 1!37049!UKCA TRACER 49 LATERAL BOUNDARY VAL.!!704!!!! 1!37050!UKCA TRACER 50 LATERAL BOUNDARY VAL.!!704!!!! 1!37051!UKCA TRACER 51 LATERAL BOUNDARY VAL.!!704!!!! 1!37052!UKCA TRACER 52 LATERAL BOUNDARY VAL.!!704!!!! 1!37053!UKCA TRACER 53 LATERAL BOUNDARY VAL.!!704!!!! 1!37054!UKCA TRACER 54 LATERAL BOUNDARY VAL.!!704!!!! 1!37055!UKCA TRACER 55 LATERAL BOUNDARY VAL.!!704!!!! 1!37056!UKCA TRACER 56 LATERAL BOUNDARY VAL.!!704!!!! 1!37057!UKCA TRACER 57 LATERAL BOUNDARY VAL.!!704!!!! 1!37058!UKCA TRACER 58 LATERAL BOUNDARY VAL.!!704!!!! 1!37059!UKCA TRACER 59 LATERAL BOUNDARY VAL.!!704!!!! 1!37060!UKCA TRACER 60 LATERAL BOUNDARY VAL.!!704!!!! 1!37061!UKCA TRACER 61 LATERAL BOUNDARY VAL.!!704!!!! 1!37062!UKCA TRACER 62 LATERAL BOUNDARY VAL.!!704!!!! 1!37063!UKCA TRACER 63 LATERAL BOUNDARY VAL.!!704!!!! 1!37064!UKCA TRACER 64 LATERAL BOUNDARY VAL.!!704!!!! 1!37065!UKCA TRACER 65 LATERAL BOUNDARY VAL.!!704!!!! 1!37066!UKCA TRACER 66 LATERAL BOUNDARY VAL.!!704!!!! 1!37067!UKCA TRACER 67 LATERAL BOUNDARY VAL.!!704!!!! 1!37068!UKCA TRACER 68 LATERAL BOUNDARY VAL.!!704!!!! 1!37069!UKCA TRACER 69 LATERAL BOUNDARY VAL.!!704!!!! 1!37070!UKCA TRACER 70 LATERAL BOUNDARY VAL.!!704!!!! 1!37071!UKCA TRACER 71 LATERAL BOUNDARY VAL.!!704!!!! 1!37072!UKCA TRACER 72 LATERAL BOUNDARY VAL.!!704!!!! 1!37073!UKCA TRACER 73 LATERAL BOUNDARY VAL.!!704!!!! 1!37074!UKCA TRACER 74 LATERAL BOUNDARY VAL.!!704!!!! 1!37075!UKCA TRACER 75 LATERAL BOUNDARY VAL.!!704!!!! 1!37076!UKCA TRACER 76 LATERAL BOUNDARY VAL.!!704!!!! 1!37077!UKCA TRACER 77 LATERAL BOUNDARY VAL.!!704!!!! 1!37078!UKCA TRACER 78 LATERAL BOUNDARY VAL.!!704!!!! 1!37079!UKCA TRACER 79 LATERAL BOUNDARY VAL.!!704!!!! 1!37080!UKCA TRACER 80 LATERAL BOUNDARY VAL.!!704!!!! 1!37081!UKCA TRACER 81 LATERAL BOUNDARY VAL.!!704!!!! 1!37082!UKCA TRACER 82 LATERAL BOUNDARY VAL.!!704!!!! 1!37083!UKCA TRACER 83 LATERAL BOUNDARY VAL.!!704!!!! 1!37084!UKCA TRACER 84 LATERAL BOUNDARY VAL.!!704!!!! 1!37085!UKCA TRACER 85 LATERAL BOUNDARY VAL.!!704!!!! 1!37086!UKCA TRACER 86 LATERAL BOUNDARY VAL.!!704!!!! 1!37087!UKCA TRACER 87 LATERAL BOUNDARY VAL.!!704!!!! 1!37088!UKCA TRACER 88 LATERAL BOUNDARY VAL.!!704!!!! 1!37089!UKCA TRACER 89 LATERAL BOUNDARY VAL.!!704!!!! 1!37090!UKCA TRACER 90 LATERAL BOUNDARY VAL.!!704!!!! 1!37091!UKCA TRACER 91 LATERAL BOUNDARY VAL.!!704!!!! 1!37092!UKCA TRACER 92 LATERAL BOUNDARY VAL.!!704!!!! 1!37093!UKCA TRACER 93 LATERAL BOUNDARY VAL.!!704!!!! 1!37094!UKCA TRACER 94 LATERAL BOUNDARY VAL.!!704!!!! 1!37095!UKCA TRACER 95 LATERAL BOUNDARY VAL.!!704!!!! 1!37096!UKCA TRACER 96 LATERAL BOUNDARY VAL.!!704!!!! 1!37097!UKCA TRACER 97 LATERAL BOUNDARY VAL.!!704!!!! 1!37098!UKCA TRACER 98 LATERAL BOUNDARY VAL.!!704!!!! 1!37099!UKCA TRACER 99 LATERAL BOUNDARY VAL.!!704!!!! 1!37100!UKCA TRACER 100 LATERAL BOUNDARY VAL!!704!!!! 1!37101!UKCA TRACER 101 LATERAL BOUNDARY VAL!!704!!!! 1!37102!UKCA TRACER 102 LATERAL BOUNDARY VAL!!704!!!! 1!37103!UKCA TRACER 103 LATERAL BOUNDARY VAL!!704!!!! 1!37104!UKCA TRACER 104 LATERAL BOUNDARY VAL!!704!!!! 1!37105!UKCA TRACER 105 LATERAL BOUNDARY VAL!!704!!!! 1!37106!UKCA TRACER 106 LATERAL BOUNDARY VAL!!704!!!! 1!37107!UKCA TRACER 107 LATERAL BOUNDARY VAL!!704!!!! 1!37108!UKCA TRACER 108 LATERAL BOUNDARY VAL!!704!!!! 1!37109!UKCA TRACER 109 LATERAL BOUNDARY VAL!!704!!!! 1!37110!UKCA TRACER 110 LATERAL BOUNDARY VAL!!704!!!! 1!37111!UKCA TRACER 111 LATERAL BOUNDARY VAL!!704!!!! 1!37112!UKCA TRACER 112 LATERAL BOUNDARY VAL!!704!!!! 1!37113!UKCA TRACER 113 LATERAL BOUNDARY VAL!!704!!!! 1!37114!UKCA TRACER 114 LATERAL BOUNDARY VAL!!704!!!! 1!37115!UKCA TRACER 115 LATERAL BOUNDARY VAL!!704!!!! 1!37116!UKCA TRACER 116 LATERAL BOUNDARY VAL!!704!!!! 1!37117!UKCA TRACER 117 LATERAL BOUNDARY VAL!!704!!!! 1!37118!UKCA TRACER 118 LATERAL BOUNDARY VAL!!704!!!! 1!37119!UKCA TRACER 119 LATERAL BOUNDARY VAL!!704!!!! 1!37120!UKCA TRACER 120 LATERAL BOUNDARY VAL!!704!!!! 1!37121!UKCA TRACER 121 LATERAL BOUNDARY VAL!!704!!!! 1!37122!UKCA TRACER 122 LATERAL BOUNDARY VAL!!704!!!! 1!37123!UKCA TRACER 123 LATERAL BOUNDARY VAL!!704!!!! 1!37124!UKCA TRACER 124 LATERAL BOUNDARY VAL!!704!!!! 1!37125!UKCA TRACER 125 LATERAL BOUNDARY VAL!!704!!!! 1!37126!UKCA TRACER 126 LATERAL BOUNDARY VAL!!704!!!! 1!37127!UKCA TRACER 127 LATERAL BOUNDARY VAL!!704!!!! 1!37128!UKCA TRACER 128 LATERAL BOUNDARY VAL!!704!!!! 1!37129!UKCA TRACER 129 LATERAL BOUNDARY VAL!!704!!!! 1!37130!UKCA TRACER 130 LATERAL BOUNDARY VAL!!704!!!! 1!37131!UKCA TRACER 131 LATERAL BOUNDARY VAL!!704!!!! 1!37132!UKCA TRACER 132 LATERAL BOUNDARY VAL!!704!!!! 1!37133!UKCA TRACER 133 LATERAL BOUNDARY VAL!!704!!!! 1!37134!UKCA TRACER 134 LATERAL BOUNDARY VAL!!704!!!! 1!37135!UKCA TRACER 135 LATERAL BOUNDARY VAL!!704!!!! 1!37136!UKCA TRACER 136 LATERAL BOUNDARY VAL!!704!!!! 1!37137!UKCA TRACER 137 LATERAL BOUNDARY VAL!!704!!!! 1!37138!UKCA TRACER 138 LATERAL BOUNDARY VAL!!704!!!! 1!37139!UKCA TRACER 139 LATERAL BOUNDARY VAL!!704!!!! 1!37140!UKCA TRACER 140 LATERAL BOUNDARY VAL!!704!!!! 1!37141!UKCA TRACER 141 LATERAL BOUNDARY VAL!!704!!!! 1!37142!UKCA TRACER 142 LATERAL BOUNDARY VAL!!704!!!! 1!37143!UKCA TRACER 143 LATERAL BOUNDARY VAL!!704!!!! 1!37144!UKCA TRACER 144 LATERAL BOUNDARY VAL!!704!!!! 1!37145!UKCA TRACER 145 LATERAL BOUNDARY VAL!!704!!!! 1!37146!UKCA TRACER 146 LATERAL BOUNDARY VAL!!704!!!! 1!37147!UKCA TRACER 147 LATERAL BOUNDARY VAL!!704!!!! 1!37148!UKCA TRACER 148 LATERAL BOUNDARY VAL!!704!!!! 1!37149!UKCA TRACER 149 LATERAL BOUNDARY VAL!!704!!!! 1!37150!UKCA TRACER 150 LATERAL BOUNDARY VAL!!704!!!! 1!37257!UKCA TRACER 1 BOUNDARY TENDENCY !!704!!!! 1!37258!UKCA TRACER 2 BOUNDARY TENDENCY !!704!!!! 1!37259!UKCA TRACER 3 BOUNDARY TENDENCY !!704!!!! 1!37260!UKCA TRACER 4 BOUNDARY TENDENCY !!704!!!! 1!37261!UKCA TRACER 5 BOUNDARY TENDENCY !!704!!!! 1!37262!UKCA TRACER 6 BOUNDARY TENDENCY !!704!!!! 1!37263!UKCA TRACER 7 BOUNDARY TENDENCY !!704!!!! 1!37264!UKCA TRACER 8 BOUNDARY TENDENCY !!704!!!! 1!37265!UKCA TRACER 9 BOUNDARY TENDENCY !!704!!!! 1!37266!UKCA TRACER 10 BOUNDARY TENDENCY !!704!!!! 1!37267!UKCA TRACER 11 BOUNDARY TENDENCY !!704!!!! 1!37268!UKCA TRACER 12 BOUNDARY TENDENCY !!704!!!! 1!37269!UKCA TRACER 13 BOUNDARY TENDENCY !!704!!!! 1!37270!UKCA TRACER 14 BOUNDARY TENDENCY !!704!!!! 1!37271!UKCA TRACER 15 BOUNDARY TENDENCY !!704!!!! 1!37272!UKCA TRACER 16 BOUNDARY TENDENCY !!704!!!! 1!37273!UKCA TRACER 17 BOUNDARY TENDENCY !!704!!!! 1!37274!UKCA TRACER 18 BOUNDARY TENDENCY !!704!!!! 1!37275!UKCA TRACER 19 BOUNDARY TENDENCY !!704!!!! 1!37276!UKCA TRACER 20 BOUNDARY TENDENCY !!704!!!! 1!37277!UKCA TRACER 21 BOUNDARY TENDENCY !!704!!!! 1!37278!UKCA TRACER 22 BOUNDARY TENDENCY !!704!!!! 1!37279!UKCA TRACER 23 BOUNDARY TENDENCY !!704!!!! 1!37280!UKCA TRACER 24 BOUNDARY TENDENCY !!704!!!! 1!37281!UKCA TRACER 25 BOUNDARY TENDENCY !!704!!!! 1!37282!UKCA TRACER 26 BOUNDARY TENDENCY !!704!!!! 1!37283!UKCA TRACER 27 BOUNDARY TENDENCY !!704!!!! 1!37284!UKCA TRACER 28 BOUNDARY TENDENCY !!704!!!! 1!37285!UKCA TRACER 29 BOUNDARY TENDENCY !!704!!!! 1!37286!UKCA TRACER 30 BOUNDARY TENDENCY !!704!!!! 1!37287!UKCA TRACER 31 BOUNDARY TENDENCY !!704!!!! 1!37288!UKCA TRACER 32 BOUNDARY TENDENCY !!704!!!! 1!37289!UKCA TRACER 33 BOUNDARY TENDENCY !!704!!!! 1!37290!UKCA TRACER 34 BOUNDARY TENDENCY !!704!!!! 1!37291!UKCA TRACER 35 BOUNDARY TENDENCY !!704!!!! 1!37292!UKCA TRACER 36 BOUNDARY TENDENCY !!704!!!! 1!37293!UKCA TRACER 37 BOUNDARY TENDENCY !!704!!!! 1!37294!UKCA TRACER 38 BOUNDARY TENDENCY !!704!!!! 1!37295!UKCA TRACER 39 BOUNDARY TENDENCY !!704!!!! 1!37296!UKCA TRACER 40 BOUNDARY TENDENCY !!704!!!! 1!37297!UKCA TRACER 41 BOUNDARY TENDENCY !!704!!!! 1!37298!UKCA TRACER 42 BOUNDARY TENDENCY !!704!!!! 1!37299!UKCA TRACER 43 BOUNDARY TENDENCY !!704!!!! 1!37300!UKCA TRACER 44 BOUNDARY TENDENCY !!704!!!! 1!37301!UKCA TRACER 45 BOUNDARY TENDENCY !!704!!!! 1!37302!UKCA TRACER 46 BOUNDARY TENDENCY !!704!!!! 1!37303!UKCA TRACER 47 BOUNDARY TENDENCY !!704!!!! 1!37304!UKCA TRACER 48 BOUNDARY TENDENCY !!704!!!! 1!37305!UKCA TRACER 49 BOUNDARY TENDENCY !!704!!!! 1!37306!UKCA TRACER 50 BOUNDARY TENDENCY !!704!!!! 1!37307!UKCA TRACER 51 BOUNDARY TENDENCY !!704!!!! 1!37308!UKCA TRACER 52 BOUNDARY TENDENCY !!704!!!! 1!37309!UKCA TRACER 53 BOUNDARY TENDENCY !!704!!!! 1!37310!UKCA TRACER 54 BOUNDARY TENDENCY !!704!!!! 1!37311!UKCA TRACER 55 BOUNDARY TENDENCY !!704!!!! 1!37312!UKCA TRACER 56 BOUNDARY TENDENCY !!704!!!! 1!37313!UKCA TRACER 57 BOUNDARY TENDENCY !!704!!!! 1!37314!UKCA TRACER 58 BOUNDARY TENDENCY !!704!!!! 1!37315!UKCA TRACER 59 BOUNDARY TENDENCY !!704!!!! 1!37316!UKCA TRACER 60 BOUNDARY TENDENCY !!704!!!! 1!37317!UKCA TRACER 61 BOUNDARY TENDENCY !!704!!!! 1!37318!UKCA TRACER 62 BOUNDARY TENDENCY !!704!!!! 1!37319!UKCA TRACER 63 BOUNDARY TENDENCY !!704!!!! 1!37320!UKCA TRACER 64 BOUNDARY TENDENCY !!704!!!! 1!37321!UKCA TRACER 65 BOUNDARY TENDENCY !!704!!!! 1!37322!UKCA TRACER 66 BOUNDARY TENDENCY !!704!!!! 1!37323!UKCA TRACER 67 BOUNDARY TENDENCY !!704!!!! 1!37324!UKCA TRACER 68 BOUNDARY TENDENCY !!704!!!! 1!37325!UKCA TRACER 69 BOUNDARY TENDENCY !!704!!!! 1!37326!UKCA TRACER 70 BOUNDARY TENDENCY !!704!!!! 1!37327!UKCA TRACER 71 BOUNDARY TENDENCY !!704!!!! 1!37328!UKCA TRACER 72 BOUNDARY TENDENCY !!704!!!! 1!37329!UKCA TRACER 73 BOUNDARY TENDENCY !!704!!!! 1!37330!UKCA TRACER 74 BOUNDARY TENDENCY !!704!!!! 1!37331!UKCA TRACER 75 BOUNDARY TENDENCY !!704!!!! 1!37332!UKCA TRACER 76 BOUNDARY TENDENCY !!704!!!! 1!37333!UKCA TRACER 77 BOUNDARY TENDENCY !!704!!!! 1!37334!UKCA TRACER 78 BOUNDARY TENDENCY !!704!!!! 1!37335!UKCA TRACER 79 BOUNDARY TENDENCY !!704!!!! 1!37336!UKCA TRACER 80 BOUNDARY TENDENCY !!704!!!! 1!37337!UKCA TRACER 81 BOUNDARY TENDENCY !!704!!!! 1!37338!UKCA TRACER 82 BOUNDARY TENDENCY !!704!!!! 1!37339!UKCA TRACER 83 BOUNDARY TENDENCY !!704!!!! 1!37340!UKCA TRACER 84 BOUNDARY TENDENCY !!704!!!! 1!37341!UKCA TRACER 85 BOUNDARY TENDENCY !!704!!!! 1!37342!UKCA TRACER 86 BOUNDARY TENDENCY !!704!!!! 1!37343!UKCA TRACER 87 BOUNDARY TENDENCY !!704!!!! 1!37344!UKCA TRACER 88 BOUNDARY TENDENCY !!704!!!! 1!37345!UKCA TRACER 89 BOUNDARY TENDENCY !!704!!!! 1!37346!UKCA TRACER 90 BOUNDARY TENDENCY !!704!!!! 1!37347!UKCA TRACER 91 BOUNDARY TENDENCY !!704!!!! 1!37348!UKCA TRACER 92 BOUNDARY TENDENCY !!704!!!! 1!37349!UKCA TRACER 93 BOUNDARY TENDENCY !!704!!!! 1!37350!UKCA TRACER 94 BOUNDARY TENDENCY !!704!!!! 1!37351!UKCA TRACER 95 BOUNDARY TENDENCY !!704!!!! 1!37352!UKCA TRACER 96 BOUNDARY TENDENCY !!704!!!! 1!37353!UKCA TRACER 97 BOUNDARY TENDENCY !!704!!!! 1!37354!UKCA TRACER 98 BOUNDARY TENDENCY !!704!!!! 1!37355!UKCA TRACER 99 BOUNDARY TENDENCY !!704!!!! 1!37356!UKCA TRACER 100 BOUNDARY TENDENCY !!704!!!! 1!37357!UKCA TRACER 101 BOUNDARY TENDENCY !!704!!!! 1!37358!UKCA TRACER 102 BOUNDARY TENDENCY !!704!!!! 1!37359!UKCA TRACER 103 BOUNDARY TENDENCY !!704!!!! 1!37360!UKCA TRACER 104 BOUNDARY TENDENCY !!704!!!! 1!37361!UKCA TRACER 105 BOUNDARY TENDENCY !!704!!!! 1!37362!UKCA TRACER 106 BOUNDARY TENDENCY !!704!!!! 1!37363!UKCA TRACER 107 BOUNDARY TENDENCY !!704!!!! 1!37364!UKCA TRACER 108 BOUNDARY TENDENCY !!704!!!! 1!37365!UKCA TRACER 109 BOUNDARY TENDENCY !!704!!!! 1!37366!UKCA TRACER 110 BOUNDARY TENDENCY !!704!!!! 1!37367!UKCA TRACER 111 BOUNDARY TENDENCY !!704!!!! 1!37368!UKCA TRACER 112 BOUNDARY TENDENCY !!704!!!! 1!37369!UKCA TRACER 113 BOUNDARY TENDENCY !!704!!!! 1!37370!UKCA TRACER 114 BOUNDARY TENDENCY !!704!!!! 1!37371!UKCA TRACER 115 BOUNDARY TENDENCY !!704!!!! 1!37372!UKCA TRACER 116 BOUNDARY TENDENCY !!704!!!! 1!37373!UKCA TRACER 117 BOUNDARY TENDENCY !!704!!!! 1!37374!UKCA TRACER 118 BOUNDARY TENDENCY !!704!!!! 1!37375!UKCA TRACER 119 BOUNDARY TENDENCY !!704!!!! 1!37376!UKCA TRACER 120 BOUNDARY TENDENCY !!704!!!! 1!37377!UKCA TRACER 121 BOUNDARY TENDENCY !!704!!!! 1!37378!UKCA TRACER 122 BOUNDARY TENDENCY !!704!!!! 1!37379!UKCA TRACER 123 BOUNDARY TENDENCY !!704!!!! 1!37380!UKCA TRACER 124 BOUNDARY TENDENCY !!704!!!! 1!37381!UKCA TRACER 125 BOUNDARY TENDENCY !!704!!!! 1!37382!UKCA TRACER 126 BOUNDARY TENDENCY !!704!!!! 1!37383!UKCA TRACER 127 BOUNDARY TENDENCY !!704!!!! 1!37384!UKCA TRACER 128 BOUNDARY TENDENCY !!704!!!! 1!37385!UKCA TRACER 129 BOUNDARY TENDENCY !!704!!!! 1!37386!UKCA TRACER 130 BOUNDARY TENDENCY !!704!!!! 1!37387!UKCA TRACER 131 BOUNDARY TENDENCY !!704!!!! 1!37388!UKCA TRACER 132 BOUNDARY TENDENCY !!704!!!! 1!37389!UKCA TRACER 133 BOUNDARY TENDENCY !!704!!!! 1!37390!UKCA TRACER 134 BOUNDARY TENDENCY !!704!!!! 1!37391!UKCA TRACER 135 BOUNDARY TENDENCY !!704!!!! 1!37392!UKCA TRACER 136 BOUNDARY TENDENCY !!704!!!! 1!37393!UKCA TRACER 137 BOUNDARY TENDENCY !!704!!!! 1!37394!UKCA TRACER 138 BOUNDARY TENDENCY !!704!!!! 1!37395!UKCA TRACER 139 BOUNDARY TENDENCY !!704!!!! 1!37396!UKCA TRACER 140 BOUNDARY TENDENCY !!704!!!! 1!37397!UKCA TRACER 141 BOUNDARY TENDENCY !!704!!!! 1!37398!UKCA TRACER 142 BOUNDARY TENDENCY !!704!!!! 1!37399!UKCA TRACER 143 BOUNDARY TENDENCY !!704!!!! 1!37400!UKCA TRACER 144 BOUNDARY TENDENCY !!704!!!! 1!37401!UKCA TRACER 145 BOUNDARY TENDENCY !!704!!!! 1!37402!UKCA TRACER 146 BOUNDARY TENDENCY !!704!!!! 1!37403!UKCA TRACER 147 BOUNDARY TENDENCY !!704!!!! 1!37404!UKCA TRACER 148 BOUNDARY TENDENCY !!704!!!! 1!37405!UKCA TRACER 149 BOUNDARY TENDENCY !!704!!!! 1!37406!UKCA TRACER 150 BOUNDARY TENDENCY !!704!!!! 1!38001!Strat Flux of O3 Tracer !!701!708!!! 1!38002!Strat Flux of NO Tracer !!701!708!!! 1!38003!Strat Flux of NO3 Tracer !!701!708!!! 1!38004!Strat Flux of NO2 Tracer !!701!708!!! 1!38005!Strat Flux of N2O5 Tracer !!701!708!!! 1!38006!Strat Flux of HO2NO2 Tracer !!701!708!!! 1!38007!Strat Flux of HONO2 Tracer !!701!708!!! 1!38008!Strat Flux of H2O2 Tracer !!701!708!!! 1!38009!Strat Flux of CH4 Tracer !!701!708!!! 1!38010!Strat Flux of CO Tracer !!701!708!!! 1!38011!Strat Flux of HCHO Tracer !!701!708!!! 1!38012!Strat Flux of MeOOH Tracer !!701!708!!! 1!38013!Strat Flux of HONO Tracer !!701!708!!! 1!38014!Strat Flux of C2H6 Tracer !!701!708!!! 1!38015!Strat Flux of EtOOH Tracer !!701!708!!! 1!38016!Strat Flux of MeCHO Tracer !!701!708!!! 1!38017!Strat Flux of PAN Tracer !!701!708!!! 1!38018!Strat Flux of C3H8 Tracer !!701!708!!! 1!38019!Strat Flux of n-PrOOH Tracer !!701!708!!! 1!38020!Strat Flux of i-PrOOH Tracer !!701!708!!! 1!38021!Strat Flux of EtCHO Tracer !!701!708!!! 1!38022!Strat Flux of Me2CO Tracer !!701!708!!! 1!38023!Strat Flux of MECOCH2OOH Tracer !!701!708!!! 1!38024!Strat Flux of PPAN Tracer !!701!708!!! 1!38025!Strat Flux of MeONO2 Tracer !!701!708!!! 1!38026!Strat Flux of O3S Tracer !!701!708!!! 1!38027!Strat Flux of C5H8 Tracer !!701!708!!! 1!38028!Strat Flux of ISOOH Tracer !!701!708!!! 1!38029!Strat Flux of ISON Tracer !!701!708!!! 1!38030!Strat Flux of MACR Tracer !!701!708!!! 1!38031!Strat Flux of MACROOH Tracer !!701!708!!! 1!38032!Strat Flux of MPAN Tracer !!701!708!!! 1!38033!Strat Flux of HACET Tracer !!701!708!!! 1!38034!Strat Flux of MGLY Tracer !!701!708!!! 1!38035!Strat Flux of NALD Tracer !!701!708!!! 1!38036!Strat Flux of HCOOH Tracer !!701!708!!! 1!38037!Strat Flux of MECO3H Tracer !!701!708!!! 1!38038!Strat Flux of MECO2H Tracer !!701!708!!! 1!38039!Strat Flux of UKCA Total Cl Tracer !!704!708!!! 1!38040!Strat Flux of Total Br Tracer !!704!708!!! 1!38041!Strat Flux of Cl Tracer !!701!708!!! 1!38042!Strat Flux of ClO Tracer !!701!708!!! 1!38043!Strat Flux of Cl2O2 Tracer !!701!708!!! 1!38044!Strat Flux of OClO Tracer !!701!708!!! 1!38045!Strat Flux of Br Tracer !!701!708!!! 1!38046!Strat Flux of BrO Tracer !!701!708!!! 1!38047!Strat Flux of BrCl Tracer !!701!708!!! 1!38048!Strat Flux of BrONO2 Tracer !!701!708!!! 1!38049!Strat Flux of N2O Tracer !!701!708!!! 1!38050!Strat Flux of HCl Tracer !!701!708!!! 1!38051!Strat Flux of HOCl Tracer !!701!708!!! 1!38052!Strat Flux of HBr Tracer !!701!708!!! 1!38053!Strat Flux of HOBr Tracer !!701!708!!! 1!38054!Strat Flux of ClONO2 Tracer !!701!708!!! 1!38055!Strat Flux of CFCl3 Tracer !!701!708!!! 1!38056!Strat Flux of CF2Cl2 Tracer !!701!708!!! 1!38057!Strat Flux of MEBr Tracer !!701!708!!! 1!38058!Strat Flux of N Tracer !!701!708!!! 1!38059!Strat Flux of O3P Tracer !!701!708!!! 1!38060!Strat Flux of TOTAL H Tracer !!701!708!!! 1!38061!Strat Flux of MECl Tracer !!701!708!!! 1!38062!Strat Flux of CF2ClBr Tracer !!701!708!!! 1!38063!Strat Flux of CCl4 Tracer !!701!708!!! 1!38064!Strat Flux of CF2ClCFCl2 Tracer !!701!708!!! 1!38065!Strat Flux of CHF2Cl Tracer !!701!708!!! 1!38066!Strat Flux of MECCl3 Tracer !!701!708!!! 1!38067!Strat Flux of CF3Br Tracer !!701!708!!! 1!38068!Strat Flux of H2O (S) Tracer !!701!708!!! 1!38069!Strat Flux of O(3P) (S) Tracer !!704!708!!! 1!38070!Strat Flux of H2 Tracer !!701!708!!! 1!38071!Strat Flux of DMS Tracer !!701!708!!! 1!38072!Strat Flux of SO2 Tracer !!701!708!!! 1!38073!Strat Flux of H2SO4 Tracer !!701!708!!! 1!38074!Strat Flux of MSA Tracer !!701!708!!! 1!38075!Strat Flux of DMSO Tracer !!701!708!!! 1!38076!Strat Flux of H2S Tracer !!701!703!!! 1!38076!Strat Flux of NH3 Tracer !!704!708!!! 1!38077!Strat Flux of CS2 Tracer !!701!708!!! 1!38078!Strat Flux of COS Tracer !!701!708!!! 1!38079!Strat Flux of NH3 Tracer !!701!703!!! 1!38079!Strat Flux of H2S Tracer !!704!708!!! 1!38080!Strat Flux of H Tracer !!701!708!!! 1!38081!Strat Flux of OH Tracer !!704!708!!! 1!38082!Strat Flux of HO2 Tracer !!704!708!!! 1!38083!Strat Flux of MeOO Tracer !!704!708!!! 1!38084!Strat Flux of EtOO Tracer !!704!708!!! 1!38085!Strat Flux of MeCO3 Tracer !!704!708!!! 1!38086!Strat Flux of n-PrOO Tracer !!704!708!!! 1!38087!Strat Flux of i-PrOO Tracer !!704!708!!! 1!38088!Strat Flux of EtCO3 Tracer !!704!708!!! 1!38089!Strat Flux of MeCOCH2OO Tracer !!704!708!!! 1!38090!Strat Flux of CH3Br Tracer !!704!708!!! 1!38091!Strat Flux of MONOTERPENE Tracer !!701!703!!! 1!38091!Strat Flux of Monoterpene Tracer !!704!708!!! 1!38092!Strat Flux of Sec Organic Tracer !!701!708!!! 1!38093!Strat Flux of Sesquiterpene Tracer !!701!708!!! 1!38094!Strat Flux of UKCA Tracer 94 !!704!708!!! 1!38095!Strat Flux of UKCA Tracer 95 !!704!708!!! 1!38096!Strat Flux of UKCA Tracer 96 !!704!708!!! 1!38097!Strat Flux of UKCA Tracer 97 !!704!708!!! 1!38098!Strat Flux of UKCA Tracer 98 !!704!708!!! 1!38099!Strat Flux of UKCA Tracer 99 !!704!708!!! 1!38100!Strat Flux of UKCA Tracer 100 !!704!708!!! 1!38101!Strat Flux of NUC-Sol Number Tracer !!701!708!!! 1!38102!Strat Flux of NUC-Sol H2SO4 Tracer !!701!708!!! 1!38103!Strat Flux of AIT-Sol Number Tracer !!701!708!!! 1!38104!Strat Flux of AIT-Sol H2SO4 Tracer !!701!708!!! 1!38105!Strat Flux of AIT-Sol BC Tracer !!701!708!!! 1!38106!Strat Flux of AIT-Sol OC Tracer !!701!708!!! 1!38107!Strat Flux of ACC-Sol Number Tracer !!701!708!!! 1!38108!Strat Flux of ACC-Sol H2SO4 Tracer !!701!708!!! 1!38109!Strat Flux of ACC-Sol BC Tracer !!701!708!!! 1!38110!Strat Flux of ACC-Sol OC Tracer !!701!708!!! 1!38111!Strat Flux of ACC-Sol NaCl Tracer !!701!708!!! 1!38112!Strat Flux of ACC-Sol Dust Tracer !!701!708!!! 1!38113!Strat Flux of COR-Sol Number Tracer !!701!708!!! 1!38114!Strat Flux of COR-Sol H2SO4 Tracer !!701!708!!! 1!38115!Strat Flux of COR-Sol BC Tracer !!701!708!!! 1!38116!Strat Flux of COR-Sol OC Tracer !!701!708!!! 1!38117!Strat Flux of COR-Sol NaCl Tracer !!701!708!!! 1!38118!Strat Flux of COR-Sol Dust Tracer !!701!708!!! 1!38119!Strat Flux of AIT-Insol Number Tracr!!701!708!!! 1!38120!Strat Flux of AIT-Insol BC Tracer !!701!708!!! 1!38121!Strat Flux of AIT-Insol OC Tracer !!701!708!!! 1!38122!Strat Flux of ACC-Insol Number Tracr!!701!708!!! 1!38123!Strat Flux of ACC-Insol Dust Tracer !!701!708!!! 1!38124!Strat Flux of COR-Insol Number Tracr!!701!708!!! 1!38125!Strat Flux of COR-Insol Dust Tracer !!701!708!!! 1!38126!Strat Flux of NUC-Sol OC Tracer !!701!708!!! 1!38127!Strat Flux of NUC-Sol OC2 Tracer !!701!708!!! 1!38128!Strat Flux of AIT-Sol OC2 Tracer !!701!708!!! 1!38129!Strat Flux of ACC-Sol OC2 Tracer !!701!708!!! 1!38130!Strat Flux of COR-Sol OC2 Tracer !!701!708!!! 1!38131!Strat Flux of AIT-Sol NaCl Tracer !!701!708!!! 1!38132!Strat Flux of NUC-Sol NH4 Tracer !!701!708!!! 1!38133!Strat Flux of AIT-Sol NH4 Tracer !!701!708!!! 1!38134!Strat Flux of ACC-Sol NH4 Tracer !!701!708!!! 1!38135!Strat Flux of COR-Sol NH4 Tracer !!701!708!!! 1!38136!Strat Flux of NUC-Sol NO3 Tracer !!701!708!!! 1!38137!Strat Flux of AIT-Sol NO3 Tracer !!701!708!!! 1!38138!Strat Flux of ACC-Sol NO3 Tracer !!701!708!!! 1!38139!Strat Flux of COR-Sol NO3 Tracer !!701!708!!! 1!38140!Strat Flux of Rn-222 Tracer !!701!703!!! 1!38140!Strat Flux of UKCA Tracer 140 !!704!708!!! 1!38141!Strat Flux of Pb-210 Tracer !!701!703!!! 1!38141!Strat Flux of UKCA Tracer 141 !!704!708!!! 1!38142!Strat Flux of UKCA Tracer 142 !!704!708!!! 1!38143!Strat Flux of UKCA Tracer 143 !!704!708!!! 1!38144!Strat Flux of UKCA Tracer 144 !!704!708!!! 1!38145!Strat Flux of UKCA Tracer 145 !!704!708!!! 1!38146!Strat Flux of UKCA Tracer 146 !!704!708!!! 1!38147!Strat Flux of Rn-222 Tracer !!704!708!!! 1!38148!Strat Flux of Pb-210 Tracer !!704!708!!! 1!38149!Strat Flux of Tracer 149 !!704!708!!! 1!38150!Strat Flux of Age of Air Tracer !!704!708!!! 1!38201!PRIMARY SO4 TO AITKEN (SOL) !!701!!!! 1!38202!PRIMARY SO4 TO ACCUMULATION (SOL) !!701!!!! 1!38203!PRIMARY SO4 TO COARSE (SOL) !!701!!!! 1!38204!PRIMARY SEA-SALT TO ACCUMULTN (SOL) !!701!!!! 1!38205!PRIMARY SEA-SALT TO COARSE (SOL) !!701!!!! 1!38206!PRIMARY BLACK CARBON TO AITKEN (SOL)!!701!!!! 1!38207!PRIMARY BLACK CARBON TO AITKEN (INS)!!701!!!! 1!38208!PRIMARY ORG. CARBON TO AITKEN (SOL)!!701!!!! 1!38209!PRIMARY ORG. CARBON TO AITKEN (INS)!!701!!!! 1!38210!PRIMARY DUST TO ACCUMULATION (SOL) !!701!!!! 1!38211!PRIMARY DUST TO ACCUMULATION (INS) !!701!!!! 1!38212!PRIMARY DUST TO COARSE (SOLUBLE) !!701!!!! 1!38213!PRIMARY DUST TO COARSE (SOLUBLE) !!701!1000!!! 1!38213!PRIMARY DUST TO COARSE (INSOLUBLE) !!1001!!!! 1!38214!DRY DEPOSITION SO4 NUCLEATION (SOL) !!701!!!! 1!38215!DRY DEPOSITION SO4 AITKEN (SOL) !!701!!!! 1!38216!DRY DEPOSITION SO4 ACCUMULTN (SOL) !!701!!!! 1!38217!DRY DEPOSITION SO4 COARSE (SOL) !!701!!!! 1!38218!DRY DEPOSITION SEA-SALT ACC (SOL) !!701!!!! 1!38219!DRY DEPOSITION SEA-SALT COARSE (SOL)!!701!!!! 1!38220!DRY DEPOSITION BLK CARB AITKEN (SOL)!!701!!!! 1!38221!DRY DEPOSITION BLK CARB ACCUM. (SOL)!!701!!!! 1!38222!DRY DEPOSITION BLK CARB COARSE (SOL)!!701!!!! 1!38223!DRY DEPOSITION BLK CARB AITKEN (INS)!!701!!!! 1!38224!DRY DEPOSITION ORG CARB NUCLN. (SOL)!!701!!!! 1!38225!DRY DEPOSITION ORG CARB AITKEN (SOL)!!701!!!! 1!38226!DRY DEPOSITION ORG CARB ACCUM. (SOL)!!701!!!! 1!38227!DRY DEPOSITION ORG CARB COARSE (SOL)!!701!!!! 1!38228!DRY DEPOSITION ORG CARB AITKEN (INS)!!701!!!! 1!38229!DRY DEPOSITION 2ND ORGC NUCLN. (SOL)!!701!!!! 1!38230!DRY DEPOSITION 2ND ORGC AITKEN (SOL)!!701!!!! 1!38231!DRY DEPOSITION 2ND ORGC ACCUM. (SOL)!!701!!!! 1!38232!DRY DEPOSITION 2ND ORGC COARSE (SOL)!!701!!!! 1!38233!DRY DEPOSITION DUST ACCUMULATN (SOL)!!701!!!! 1!38234!DRY DEPOSITION DUST COARSE (SOL) !!701!!!! 1!38235!DRY DEPOSITION DUST ACCUMULATN (INS)!!701!!!! 1!38236!DRY DEPOSITION DUST COARSE (INS) !!701!!!! 1!38237!NUC SCAVENGING SO4 NUCLEATION (SOL) !!701!!!! 1!38238!NUC SCAVENGING SO4 AITKEN (SOL) !!701!!!! 1!38239!NUC SCAVENGING SO4 ACCUMULTN (SOL) !!701!!!! 1!38240!NUC SCAVENGING SO4 COARSE (SOL) !!701!!!! 1!38241!NUC SCAVENGING SEA-SALT ACCUM. (SOL)!!701!!!! 1!38242!NUC SCAVENGING SEA-SALT COARSE (SOL)!!701!!!! 1!38243!NUC SCAVENGING BLK CARB AITKEN (SOL)!!701!!!! 1!38244!NUC SCAVENGING BLK CARB ACCUM. (SOL)!!701!!!! 1!38245!NUC SCAVENGING BLK CARB COARSE (SOL)!!701!!!! 1!38246!NUC SCAVENGING BLK CARB AITKEN (INS)!!701!!!! 1!38247!NUC SCAVENGING ORG CARB NUCLN. (SOL)!!701!!!! 1!38248!NUC SCAVENGING ORG CARB AITKEN (SOL)!!701!!!! 1!38249!NUC SCAVENGING ORG CARB ACCUM. (SOL)!!701!!!! 1!38250!NUC SCAVENGING ORG CARB COARSE (SOL)!!701!!!! 1!38251!NUC SCAVENGING ORG CARB AITKEN (INS)!!701!!!! 1!38252!NUC SCAVENGING 2ND ORGC NUCLN. (SOL)!!701!!!! 1!38253!NUC SCAVENGING 2ND ORGC AITKEN (SOL)!!701!!!! 1!38254!NUC SCAVENGING 2ND ORGC ACCUM. (SOL)!!701!!!! 1!38255!NUC SCAVENGING 2ND ORGC COARSE (SOL)!!701!!!! 1!38256!NUC SCAVENGING 2ND ORGC AITKEN (INS)!!701!!!! 1!38257!NUC SCAVENGING DUST ACCUMULTN. (SOL)!!701!!!! 1!38258!NUC SCAVENGING DUST COARSE (SOL) !!701!!!! 1!38259!NUC SCAVENGING DUST ACCUMULTN. (INS)!!701!!!! 1!38260!NUC SCAVENGING DUST COARSE (INS) !!701!!!! 1!38261!IMP SCAVENGING SO4 NUCLN. (SOL) !!701!!!! 1!38262!IMP SCAVENGING SO4 AITKEN (SOL) !!701!!!! 1!38263!IMP SCAVENGING SO4 ACCUMULTN (SOL) !!701!!!! 1!38264!IMP SCAVENGING SO4 COARSE (SOL) !!701!!!! 1!38265!IMP SCAVENGING SEA-SALT ACCUM. (SOL)!!701!!!! 1!38266!IMP SCAVENGING SEA-SALT COARSE (SOL)!!701!!!! 1!38267!IMP SCAVENGING BLK CARB AITKEN (SOL)!!701!!!! 1!38268!IMP SCAVENGING BLK CARB ACCUM. (SOL)!!701!!!! 1!38269!IMP SCAVENGING BLK CARB COARSE (SOL)!!701!!!! 1!38270!IMP SCAVENGING BLK CARB AITKEN (INS)!!701!!!! 1!38271!IMP SCAVENGING ORG CARB NUCLN. (SOL)!!701!!!! 1!38272!IMP SCAVENGING ORG CARB AITKEN (SOL)!!701!!!! 1!38273!IMP SCAVENGING ORG CARB ACCUM. (SOL)!!701!!!! 1!38274!IMP SCAVENGING ORG CARB COARSE (SOL)!!701!!!! 1!38275!IMP SCAVENGING ORG CARB AITKEN (INS)!!701!!!! 1!38276!IMP SCAVENGING 2ND ORGC NUCLN. (SOL)!!701!!!! 1!38277!IMP SCAVENGING 2ND ORGC AITKEN (SOL)!!701!!!! 1!38278!IMP SCAVENGING 2ND ORGC ACCUM. (SOL)!!701!!!! 1!38279!IMP SCAVENGING 2ND ORGC COARSE (SOL)!!701!!!! 1!38280!IMP SCAVENGING DUST ACCUMULTN. (SOL)!!701!!!! 1!38281!IMP SCAVENGING DUST COARSE (SOL) !!701!!!! 1!38282!IMP SCAVENGING DUST ACCUMULTN. (INS)!!701!!!! 1!38283!IMP SCAVENGING DUST COARSE (INS) !!701!!!! 1!38284!INCLOUD SO4 (H2O2) TO AITKEN (SOL) !!701!!!! 1!38285!INCLOUD SO4 (H2O2) TO ACCUMLTN (SOL)!!701!!!! 1!38286!INCLOUD SO4 (H2O2) TO COARSE (SOL) !!701!!!! 1!38287!INCLOUD SO4 (O3) TO AITKEN (SOL) !!701!!!! 1!38288!INCLOUD SO4 (O3) TO ACCUMULTN (SOL) !!701!!!! 1!38289!INCLOUD SO4 (O3) TO COARSE (SOL) !!701!!!! 1!38290!CLOUDPROC SU AITSOL --> ACCSOL !!701!!!! 1!38291!CLOUDPROC BC AITSOL --> ACCSOL !!701!!!! 1!38292!CLOUDPROC OC AITSOL --> ACCSOL !!701!!!! 1!38293!CLOUDPROC SO AITSOL --> ACCSOL !!701!!!! 1!38294!CONDENSATION SO4 TO NUCLEATION (SOL)!!701!!!! 1!38295!CONDENSATION SO4 TO AITKEN (SOL) !!701!!!! 1!38296!CONDENSATION SO4 TO ACCUMULTN (SOL) !!701!!!! 1!38297!CONDENSATION SO4 TO COARSE (SOL) !!701!!!! 1!38298!CONDENSATION SO4 TO AITKEN (INSOL) !!701!!!! 1!38299!CONDENSATION SO4 TO ACCUM. (INSOL) !!701!!!! 1!38300!CONDENSATION SO4 TO COARSE (INSOL) !!701!!!! 1!38301!CONDENSATION OC1 TO NUCLEATION (SOL) !!701!708!!! 1!38301!CONDENSATION OC1 TO NUCLEATION (SOL)!!802!!!! 1!38302!CONDENSATION OC1 TO AITKEN (SOL) !!701!708!!! 1!38302!CONDENSATION OC1 TO AITKEN (SOL) !!802!!!! 1!38303!CONDENSATION OC1 TO ACCUMULTN (SOL) !!701!708!!! 1!38303!CONDENSATION OC1 TO ACCUMULTN (SOL) !!802!!!! 1!38304!CONDENSATION OC1 TO COARSE (SOL) !!701!708!!! 1!38304!CONDENSATION OC1 TO COARSE (SOL) !!802!!!! 1!38305!CONDENSATION OC1 TO AITKEN (INSOL) !!701!708!!! 1!38305!CONDENSATION OC1 TO AITKEN (INSOL) !!802!!!! 1!38306!CONDENSATION OC1 TO ACCUM. (INSOL) !!701!708!!! 1!38306!CONDENSATION OC1 TO ACCUM. (INSOL) !!802!!!! 1!38307!CONDENSATION OC1 TO COARSE (INSOL) !!701!708!!! 1!38307!CONDENSATION OC1 TO COARSE (INSOL) !!802!!!! 1!38308!CONDENSATION OC2 TO NUCLEATION (SOL) !!701!708!!! 1!38308!CONDENSATION OC2 TO NUCLEATION (SOL)!!802!!!! 1!38309!CONDENSATION OC2 TO AITKEN (SOL) !!701!708!!! 1!38309!CONDENSATION OC2 TO AITKEN (SOL) !!802!!!! 1!38310!CONDENSATION OC2 TO ACCUMULTN (SOL) !!701!708!!! 1!38310!CONDENSATION OC2 TO ACCUMULTN (SOL) !!802!!!! 1!38311!CONDENSATION OC2 TO COARSE (SOL) !!701!708!!! 1!38311!CONDENSATION OC2 TO COARSE (SOL) !!802!!!! 1!38312!CONDENSATION OC2 TO AITKEN (INSOL) !!701!708!!! 1!38312!CONDENSATION OC2 TO AITKEN (INSOL) !!802!!!! 1!38313!CONDENSATION OC2 TO ACCUM. (INSOL) !!701!708!!! 1!38313!CONDENSATION OC2 TO ACCUM. (INSOL) !!802!!!! 1!38314!CONDENSATION OC2 TO COARSE (INSOL) !!701!708!!! 1!38314!CONDENSATION OC2 TO COARSE (INSOL) !!802!!!! 1!38315!HETOX ON DUST {SO2 --> SO4} (ACC-SOL)!!701!708!!! 1!38315!HETOX ON DUST {SO2 -> SO4} (ACC-SOL)!!802!!!! 1!38316!HETOX ON DUST {SO2 --> SO4} (COR-SOL)!!701!708!!! 1!38316!HETOX ON DUST {SO2 -> SO4} (COR-SOL)!!802!!!! 1!38317!HETOX ON DUST {SO2 --> SO4} (ACC-INS)!!701!708!!! 1!38317!HETOX ON DUST {SO2 -> SO4} (ACC-INS)!!802!!!! 1!38318!HETOX ON DUST {SO2 --> SO4} (COR-INS)!!701!708!!! 1!38318!HETOX ON DUST {SO2 -> SO4} (COR-INS)!!802!!!! 1!38319!NUCLEATION OF SO4 (TO NUC-SOL) !!701!!!! 1!38320!COAG SO4 NUCLTN-SOL TO AITKEN-SOL !!701!!!! 1!38321!COAG SO4 NUCLTN-SOL TO ACCUMULN-SOL !!701!!!! 1!38322!COAG SO4 NUCLTN-SOL TO COARSE-SOL !!701!!!! 1!38323!COAG SO4 NUCLTN-SOL TO AITKEN-INSOL !!701!!!! 1!38324!COAG SO4 NUCLTN-SOL TO ACCUM.-INSOL !!701!!!! 1!38325!COAG SO4 NUCLTN-SOL TO COARSE-INSOL !!701!!!! 1!38326!COAG OC1 NUCLTN-SOL TO AITKEN-SOL !!701!!!! 1!38327!COAG OC1 NUCLTN-SOL TO ACCUMULN-SOL !!701!!!! 1!38328!COAG OC1 NUCLTN-SOL TO COARSE-SOL !!701!!!! 1!38329!COAG OC1 NUCLTN-SOL TO AITKEN-INSOL !!701!!!! 1!38330!COAG OC1 NUCLTN-SOL TO ACCUM.-INSOL !!701!!!! 1!38331!COAG OC1 NUCLTN-SOL TO COARSE-INSOL !!701!!!! 1!38332!COAG OC2 NUCLTN-SOL TO AITKEN-SOL !!701!!!! 1!38333!COAG OC2 NUCLTN-SOL TO ACCUMULN-SOL !!701!!!! 1!38334!COAG OC2 NUCLTN-SOL TO COARSE-SOL !!701!!!! 1!38335!COAG OC2 NUCLTN-SOL TO AITKEN-INSOL !!701!!!! 1!38336!COAG OC2 NUCLTN-SOL TO ACCUM.-INSOL !!701!!!! 1!38337!COAG OC2 NUCLTN-SOL TO COARSE-INSOL !!701!!!! 1!38338!COAG SO4 AITKEN-SOL TO ACCUMULN-SOL !!701!!!! 1!38339!COAG SO4 AITKEN-SOL TO COARSE-SOL !!701!!!! 1!38340!COAG SO4 AITKEN-SOL TO ACCUMULN-INS !!701!708!!! 1!38341!COAG SO4 AITKEN-SOL TO COARSE-INS !!701!708!!! 1!38342!COAG BC AITKEN-SOL TO ACCUMULN-SOL !!701!!!! 1!38343!COAG BC AITKEN-SOL TO COARSE-SOL !!701!!!! 1!38344!COAG BC AITKEN-SOL TO ACCUMULN-INS !!701!708!!! 1!38345!COAG BC AITKEN-SOL TO COARSE-INS !!701!708!!! 1!38346!COAG OC1 AITKEN-SOL TO ACCUMULN-SOL !!701!!!! 1!38347!COAG OC1 AITKEN-SOL TO COARSE-SOL !!701!!!! 1!38348!COAG OC1 AITKEN-SOL TO ACCUMULN-INS !!701!708!!! 1!38349!COAG OC1 AITKEN-SOL TO COARSE-INS !!701!708!!! 1!38350!COAG OC2 AITKEN-SOL TO ACCUMULN-SOL !!701!!!! 1!38351!COAG OC2 AITKEN-SOL TO COARSE-SOL !!701!!!! 1!38352!COAG OC2 AITKEN-SOL TO ACCUMULN-INS !!701!708!!! 1!38353!COAG OC2 AITKEN-SOL TO COARSE-INS !!701!708!!! 1!38354!COAG SO4 ACCUMULN-SOL TO COARSE-SOL !!701!!!! 1!38355!COAG SO4 ACCUMULN-SOL TO COARSE-INS !!701!708!!! 1!38356!COAG BC ACCUMULN-SOL TO COARSE-SOL !!701!!!! 1!38357!COAG BC ACCUMULN-SOL TO COARSE-INS !!701!708!!! 1!38358!COAG OC1 ACCUMULN-SOL TO COARSE-SOL !!701!!!! 1!38359!COAG OC1 ACCUMULN-SOL TO COARSE-INS !!701!708!!! 1!38360!COAG SEA-SALT ACC-SOL TO COARSE-SOL !!701!!!! 1!38361!COAG SEA-SALT ACC-SOL TO COARSE-INS !!701!708!!! 1!38362!COAG OC2 ACCUMULN-SOL TO COARSE-SOL !!701!!!! 1!38363!COAG OC2 ACCUMULN-SOL TO COARSE-INS !!701!708!!! 1!38364!COAG DU ACCUMULN-SOL TO COARSE-SOL !!701!!!! 1!38365!COAG DU ACCUMULN-SOL TO COARSE-INS !!701!708!!! 1!38366!COAG BC AITKEN-INS TO ACCUMULN-SOL !!701!!!! 1!38367!COAG OC1 AITKEN-INS TO ACCUMULN-SOL !!701!!!! 1!38368!COAG BC AITKEN-INS TO COARSE-SOL !!701!!!! 1!38369!COAG OC2 AITKEN-INS TO COARSE-SOL !!701!708!!! 1!38369!COAG OC1 AITKEN-INS TO COARSE-SOL !!802!!!! 1!38370!COAG DU ACCUM.-INS TO COARSE-SOL !!701!!!! 1!38371!AGEING SO4 AITKEN-INS TO AITKEN-SOL !!701!!!! 1!38372!AGEING BC AITKEN-INS TO AITKEN-SOL !!701!!!! 1!38373!AGEING OC1 AITKEN-INS TO AITKEN-SOL !!701!!!! 1!38374!AGEING OC2 AITKEN-INS TO AITKEN-SOL !!701!!!! 1!38375!MERGE SO4 NUCLTN-SOL TO AITKEN-SOL !!701!!!! 1!38376!MERGE OC1 NUCLTN-SOL TO AITKEN-SOL !!701!!!! 1!38377!MERGE OC2 NUCLTN-SOL TO AITKEN-SOL !!701!!!! 1!38378!MERGE SO4 AITKEN-SOL TO ACCUMULN-SOL!!701!!!! 1!38379!MERGE BC AITKEN-SOL TO ACCUMULN-SOL!!701!!!! 1!38380!MERGE OC1 AITKEN-SOL TO ACCUMULN-SOL!!701!!!! 1!38381!MERGE OC2 AITKEN-SOL TO ACCUMULN-SOL!!701!!!! 1!38382!MERGE SO4 ACCUMULN-SOL TO COARSE-SOL!!701!!!! 1!38383!MERGE SEA_SALT ACC-SOL TO COARSE-SOL!!701!!!! 1!38384!MERGE BC ACCUMULN-SOL TO COARSE-SOL!!701!!!! 1!38385!MERGE OC1 ACCUMULN-SOL TO COARSE-SOL!!701!!!! 1!38386!MERGE DU ACCUMULN-SOL TO COARSE-SOL!!701!!!! 1!38387!MERGE OC2 ACCUMULN-SOL TO COARSE-SOL!!701!!!! 1!38401!DRY PARTICLE DIAMETER NUCLEATION-SOL!!701!!!! 1!38402!DRY PARTICLE DIAMETER AITKEN-SOL !!701!!!! 1!38403!DRY PARTICLE DIAMETER ACCUMULATN-SOL!!701!!!! 1!38404!DRY PARTICLE DIAMETER COARSE-SOL !!701!!!! 1!38405!DRY PARTICLE DIAMETER AITKEN-INS !!701!!!! 1!38406!DRY PARTICLE DIAMETER ACCUMULATN-INS!!701!!!! 1!38407!DRY PARTICLE DIAMETER COARSE-INS !!701!!!! 1!38408!WET PARTICLE DIAMETER NUCLEATION-SOL!!701!!!! 1!38409!WET PARTICLE DIAMETER AITKEN-SOL !!701!!!! 1!38410!WET PARTICLE DIAMETER ACCUMULATN-SOL!!701!!!! 1!38411!WET PARTICLE DIAMETER COARSE-SOL !!701!!!! 1!38412!WATER CONTENT FOR NUCLEATION-SOLUBLE!!701!!!! 1!38413!WATER CONTENT FOR AITKEN -SOLUBLE!!701!!!! 1!38414!WATER CONTENT FOR ACCUMULTN.-SOLUBLE!!701!!!! 1!38415!WATER CONTENT FOR COARSE -SOLUBLE!!701!!!! 1!38416!SURFACE AREA CONC NUCLN.-SOL (WET) !!701!!!! 1!38417!SURFACE AREA CONC AITKEN-SOL (WET) !!701!!!! 1!38418!SURFACE AREA CONC ACCUM.-SOL (WET) !!701!!!! 1!38419!SURFACE AREA CONC COARSE-SOL (WET) !!701!!!! 1!38420!SURFACE AREA CONC AITKEN-INS !!701!!!! 1!38421!SURFACE AREA CONC ACCUM.-INS !!701!!!! 1!38422!SURFACE AREA CONC COARSE-INS !!701!!!! 1!38423!VOLUME CONCENTRN. NUCLN.-SOL (WET) !!701!!!! 1!38424!VOLUME CONCENTRN. AITKEN-SOL (WET) !!701!!!! 1!38425!VOLUME CONCENTRN. ACCUM.-SOL (WET) !!701!!!! 1!38426!VOLUME CONCENTRN. COARSE-SOL (WET) !!701!!!! 1!38427!VOLUME CONCENTRN. AITKEN-INS !!701!!!! 1!38428!VOLUME CONCENTRN. ACCUM.-INS !!701!!!! 1!38429!VOLUME CONCENTRN. COARSE-INS !!701!!!! 1!38430!PTCL MASS DENSITY NUCLN.-SOL (WET) !!701!!!! 1!38431!PTCL MASS DENSITY AITKEN-SOL (WET) !!701!!!! 1!38432!PTCL MASS DENSITY ACCUM.-SOL (WET) !!701!!!! 1!38433!PTCL MASS DENSITY COARSE-SOL (WET) !!701!!!! 1!38434!PTCL MASS DENSITY AITKEN-INS !!701!!!! 1!38435!PTCL MASS DENSITY ACCUM.-INS !!701!!!! 1!38436!PTCL MASS DENSITY COARSE-INS !!701!!!! 1!38437!CN NUMBER CONCENTRATION !!701!!!! 1!38438!CCN NO. CONCENTRN. (ACC+COR) !!701!!!! 1!38439!CCN NO. CONCENTRN. (ACC+COR+AIT>25r)!!701!!!! 1!38440!CCN NO. CONCENTRN. (ACC+COR+AIT>35r)!!701!!!! 1!38441!CDN NUMBER CONCENTRATION !!701!708!!! 1!38441!CD NUMBER CONCENTRATION !!802!!!! 1!38442!SO4 PARTIAL VOLUME CONC (NUC-SOL) !!701!!!! 1!38443!OC1 PARTIAL VOLUME CONC (NUC-SOL) !!701!!!! 1!38444!OC2 PARTIAL VOLUME CONC (NUC-SOL) !!701!!!! 1!38445!H2O PARTIAL VOLUME CONC (NUC-SOL) !!701!!!! 1!38446!SO4 PARTIAL VOLUME CONC (AIT-SOL) !!701!!!! 1!38447!BC PARTIAL VOLUME CONC (AIT-SOL) !!701!!!! 1!38448!OC1 PARTIAL VOLUME CONC (AIT-SOL) !!701!!!! 1!38449!OC2 PARTIAL VOLUME CONC (AIT-SOL) !!701!!!! 1!38450!H2O PARTIAL VOLUME CONC (AIT-SOL) !!701!!!! 1!38451!SO4 PARTIAL VOLUME CONC (ACC-SOL) !!701!!!! 1!38452!SSALT PARTIAL VOLUME CONC (ACC-SOL) !!701!708!!! 1!38452!BC PARTIAL VOLUME CONC (ACC-SOL) !!802!!!! 1!38453!BC PARTIAL VOLUME CONC (ACC-SOL) !!701!708!!! 1!38453!OC1 PARTIAL VOLUME CONC (ACC-SOL) !!802!!!! 1!38454!OC1 PARTIAL VOLUME CONC (ACC-SOL) !!701!708!!! 1!38454!SS PARTIAL VOLUME CONC (ACC-SOL) !!802!!!! 1!38455!DU PARTIAL VOLUME CONC (ACC-SOL) !!701!!!! 1!38456!OC2 PARTIAL VOLUME CONC (ACC-SOL) !!701!!!! 1!38457!H2O PARTIAL VOLUME CONC (ACC-SOL) !!701!!!! 1!38458!SO4 PARTIAL VOLUME CONC (COR-SOL) !!701!!!! 1!38459!SSALT PARTIAL VOLUME CONC (COR-SOL) !!701!708!!! 1!38459!BC PARTIAL VOLUME CONC (COR-SOL) !!802!!!! 1!38460!BC PARTIAL VOLUME CONC (COR-SOL) !!701!708!!! 1!38460!OC1 PARTIAL VOLUME CONC (COR-SOL) !!802!!!! 1!38461!OC1 PARTIAL VOLUME CONC (COR-SOL) !!701!708!!! 1!38461!SSALT PARTIAL VOLUME CONC (COR-SOL) !!802!!!! 1!38462!DU PARTIAL VOLUME CONC (COR-SOL) !!701!!!! 1!38463!OC2 PARTIAL VOLUME CONC (COR-SOL) !!701!!!! 1!38464!H2O PARTIAL VOLUME CONC (COR-SOL) !!701!!!! 1!38465!BC PARTIAL VOLUME CONC (AIT-INS) !!701!!!! 1!38466!OC1 PARTIAL VOLUME CONC (AIT-INS) !!701!!!! 1!38467!DU PARTIAL VOLUME CONC (ACC-INS) !!701!!!! 1!38468!DU PARTIAL VOLUME CONC (COR-INS) !!701!!!! 1!38469!ACTIVE CLOUD DROP NO CONC (NUC-SOL) !!802!!!! 1!38470!ACTIVE CLOUD DROP NO CONC (AIT-SOL) !!802!!!! 1!38471!ACTIVE CLOUD DROP NO CONC (ACC-SOL) !!802!!!! 1!38472!ACTIVE CLOUD DROP NO CONC (COR-SOL) !!802!!!! 1!38473!Maximum Supersaturation (percent) !%!802!!!! 1!38474!Cloud base for aerosol activation !!802!!!! 1!38475!Sigmaw Updraught Velocity !!802!!!! 1!38476!CLOUD LIQUID FRACTION !!802!!!! 1!38477!TOTAL CDNC * CLOUD LIQ FRACTION !!802!!!! 1!38478!CLOUD FLAG !!802!!!! 1!38479!TOTAL CDNC * CLOUD FLAG (m^-3) !m-3!802!!!! 1!38480!Max SuperSaturation*CLD FLAG (perc) !%!802!!!! 1!38481!Charac updraft * CLD FLAG (m s^-1) !m s-1!802!!!! 1!38482!Sigmaw * CLOUD FLAG (m s^-1) !m s-1!802!!!! 1!38483!BL TKE * CLOUD FLAG (m^2 s^-2) !m2 s-2!802!!!! 1!38484!CCN at fixed Supersaturation (m^-3) !m-3!802!!!! 1!39001!ANALYSIS TEMPERATURE ON MODEL LEVELS!!707!!!! 1!39002!MODEL TEMPERATURE AFTER NUDGING !!707!!!! 1!39003!TEMPERATURE INCREMENT DUE TO NUDG !!707!!!! 1!39004!TEMPERATURE INCREMENT DUE TO OTHER !!707!!!! 1!39005!TEMPERATURE RELAXATION PARAMETER !!707!!!! 1!39006!ANALYSIS U WIND ON MODEL LEVELS !!707!!!! 1!39007!U COMPNT OF WIND AFTER NUDGING !!707!!!! 1!39008!U WIND INCREMENT DUE TO NUDGING !!707!!!! 1!39009!U WIND INCREMENT DUE TO OTHER !!707!!!! 1!39010!U WIND RELAXATION PARAMETER !!707!!!! 1!39011!ANALYSIS V WIND ON MODEL LEVELS !!707!!!! 1!39012!V COMPNT OF WIND AFTER NUDGING !!707!!!! 1!39013!V WIND INCREMENT DUE TO NUDGING !!707!!!! 1!39014!V WIND INCREMENT DUE TO OTHER !!707!!!! 1!39015!V WIND RELAXATION PARAMETER !!707!!!! 1!44001!Karbou surface emissivity 23.8 GHz !!707!!!! 1!44002!Karbou surf emiss (stdev) 23.8 GHz !!707!!!! 1!44003!Karbou surface emissivity 31.4 GHz !!707!!!! 1!44004!Karbou surf emiss (stdev) 31.4 GHz !!707!!!! 1!44005!Karbou surface emissivity 50.0 GHz !!707!!!! 1!44006!Karbou surf emiss (stdev) 50.0 GHz !!707!!!! 1!44007!Karbou surface emissivity 89.0 GHz !!707!!!! 1!44008!Karbou surf emiss (stdev) 89.0 GHz !!707!!!! 1!44009!Karbou surface emissivity 150.0 GHz !!707!!!! 1!44010!Karbou surf emiss (stdev) 150.0 GHz !!707!!!! 1!44011!DISTANCE OFF-SHORE !!705!!!! 1!44012!MW Surface Emissivity !!802!!!! 1!44013!MW Surface Emissivity (stdev) !!802!!!! 1!50001!Ox PROD: HO2+NO !!805!!!! 1!50002!Ox PROD: MeOO+NO !!805!!!! 1!50003!Ox PROD: NO+RO2 !!805!!!! 1!50004!Ox PROD: OH+INORGANIC ACID !!805!!!! 1!50005!Ox PROD: OH+ORGANIC NITRATE !!805!!!! 1!50006!Ox PROD: ORGANIC NITRATE PHOTOLYSIS !!805!!!! 1!50007!Ox PROD: OH + PAN-TYPE REACTIONS !!805!!!! 1!50011!Ox LOSS: O(1D)+H2O !!805!!!! 1!50012!Ox LOSS: MINOR LOSS REACTIONS !!805!!!! 1!50013!Ox LOSS: HO2+O3 !!805!!!! 1!50014!Ox LOSS: OH+O3 !!805!!!! 1!50015!Ox LOSS: O3+ALKENE !!805!!!! 1!50016!Ox LOSS: N2O5+H2O !!805!!!! 1!50017!Ox LOSS: NO3 CHEMICAL LOSS !!805!!!! 1!50021!Ox BUDGET: O3 DRY DEPOSITION (3D) !!805!!!! 1!50022!Ox BUDGET: NOy DRY DEPOSITION (3D) !!805!!!! 1!50031!Ox BUDGET: NOy WET DEPOSITION (3D) !!805!!!! 1!50041!RXN FLUX: OH+CH4 (CH4 LIFETIME) TROP!!805!!!! 1!50042!RXN FLUX: NO3+C5H8->ISON !!805!!!! 1!50043!RXN FLUX: NO+ISO2->ISON !!805!!!! 1!50044!RXN FLUX: H2O2 PRODUCTION !!805!!!! 1!50045!RXN FLUX: ROOH PRODUCTION !!805!!!! 1!50046!RXN FLUX: HONO2 PRODUCTION (HNO3) !!805!!!! 1!50051!STE: O3 !!805!!!! 1!50052!TENDENCY: O3 (TROP ONLY) !!805!!!! 1!50053!TROPOSPHERIC O3 !!805!!!! 1!50054!TENDENCY: O3 (WHOLE ATMOS) !!805!!!! 1!50061!AIR MASS DIAGNOSTIC (TROP ONLY) !!805!!!! 1!50062!TROPOSPHERIC MASK !!805!!!! 1!50063!AIR MASS DIAGNOSTIC (WHOLE ATMOS) !!805!!!! 1!50071!CO BUDGET: CO LOSS VIA OH+CO !!805!!!! 1!50072!CO BUDGET: CO PROD VIA HCHO+OH/NO3 !!805!!!! 1!50073!CO BUDGET: CO PROD VIA MGLY+OH/NO3 !!805!!!! 1!50074!CO BUDGET: CO MISC PROD&O3+MACR/ISOP!!805!!!! 1!50075!CO BUDGET: CO PROD VIA HCHO PHOT RAD!!805!!!! 1!50076!CO BUDGET: CO PROD VIA HCHO PHOT MOL!!805!!!! 1!50077!CO BUDGET: CO PROD VIA MGLY PHOTOL !!805!!!! 1!50078!CO BUDGET: CO PROD VIA MISC PHOTOL !!805!!!! 1!50079!CO BUDGET: CO DRY DEPOSITION (3D) !!805!!!! 1!50081!LIGHTNING NOx EMISSIONS 3D !!805!!!! 1!50082!LIGHTNING DIAGNOSTIC: TOT FLASHES 2D!!805!!!! 1!50083!LIGHTNING DIAG: CLD TO GRND FLSH 2D !!805!!!! 1!50084!LIGHTNING DIAG: CLD TO CLD FLSH 2D !!805!!!! 1!50085!LIGHTNING DIAG: TOTAL N PRODUCED 2D !!805!!!! 1!50086!LIGHTNING N IN kg(N)/km^2/s !kg km-2 s-1!805!806!!! 1!50091!STRATOSPHERIC OH PRODUCTION !!805!!!! 1!50092!STRATOSPHERIC OH LOSS !!805!!!! 1!50101!STRAT O3 PROD: O2+PHOTON->O(3P)+O(3P!!805!!!! 1!50102!STRAT O3 PROD: O2+PHOTON->O(3P)+O(1D!!805!!!! 1!50103!STRAT O3 PROD: HO2 + NO !!805!!!! 1!50104!STRAT O3 PROD: MeOO + NO !!805!!!! 1!50111!STRAT O3 LOSS: Cl2O2 + PHOTON !!805!!!! 1!50112!STRAT O3 LOSS: BrO + ClO !!805!!!! 1!50113!STRAT O3 LOSS: HO2 + O3 !!805!!!! 1!50114!STRAT O3 LOSS: ClO + HO2 !!805!!!! 1!50115!STRAT O3 LOSS: BrO + HO2 !!805!!!! 1!50116!STRAT O3 LOSS: O(3P) + ClO !!805!!!! 1!50117!STRAT O3 LOSS: O(3P) + NO2 !!805!!!! 1!50118!STRAT O3 LOSS: O(3P) + HO2 !!805!!!! 1!50119!STRAT O3 LOSS: O3 + H !!805!!!! 1!50120!STRAT O3 LOSS: O(3P) + O3 !!805!!!! 1!50121!STRAT O3 LOSS: NO3 + PHOTON !!805!!!! 1!50122!STRAT O3 LOSS: O(1D) + H2O !!805!!!! 1!50123!STRAT O3 LOSS: HO2 + NO3 !!805!!!! 1!50124!STRAT O3 LOSS: OH + NO3 !!805!!!! 1!50125!STRAT O3 LOSS: NO3 + HCHO !!805!!!! 1!50131!STRAT MISC: O3 DRY DEPOSITION (3D) !!805!!!! 1!50132!STRAT MISC: NOy DRY DEPOSITION (3D) !!805!!!! 1!50133!STRAT MISC: NOy WET DEPOSITION (3D) !!805!!!! 1!50140!DMS + OH => SO2 + MeOO + HCHO !!805!!!! 1!50141!DMS + OH => 0.6SO2 + 0.4DMSO + MeOO !!805!!!! 1!50142!DMS + NO3 => SO2 + HONO2 + MeOO !!805!!!! 1!50143!DMSO + OH => 0.6SO2 + 0.4MSA !!805!!!! 1!50144!CS2 + OH => SO2 + COS !!805!!!! 1!50145!H2S + OH => SO2 !!805!!!! 1!50146!COS + OH => SO2 !!805!!!! 1!50147!Monoterp + OH => Sec_org !!805!!!! 1!50148!Monoterp + O3 => Sec_org !!805!!!! 1!50149!Monoterp + NO3 => Sec_org !!805!!!! 1!50150!SO2 + OH => HO2 + H2SO4 !!805!!!! 1!50151!SO2 + H2O2 => NULL0 !!805!!!! 1!50152!SO2 + O3 => NULL1 !!805!!!! 1!50153!SO2 + O3 => NULL2 !!805!!!! 1!50154!SO2 DRY DEPOSITION (3D) !!805!!!! 1!50155!SO2 WET DEPOSITION (3D) !!805!!!! 1!50156!NO surf emissions (kg m-2 s-1) !kg m-2 s-1!806!!!! 1!50157!CH4 surf emissions (kg m-2 s-1) !kg m-2 s-1!806!!!! 1!50158!CO surf emissions (kg m-2 s-1) !kg m-2 s-1!806!!!! 1!50159!HCHO surf emissions (kg m-2 s-1) !kg m-2 s-1!806!!!! 1!50160!C2H6 surf emissions (kg m-2 s-1) !kg m-2 s-1!806!!!! 1!50161!C3H8 surf emissions (kg m-2 s-1) !kg m-2 s-1!806!!!! 1!50162!Me2CO surf emissions (kg m-2 s-1) !kg m-2 s-1!806!!!! 1!50163!MeCHO surf emissions (kg m-2 s-1) !kg m-2 s-1!806!!!! 1!50164!C5H8 surf emissions (kg m-2 s-1) !kg m-2 s-1!806!!!! 1!50165!C4H10 surf emissions (kg m-2 s-1) !kg m-2 s-1!806!!!! 1!50166!C2H4 surf emissions (kg m-2 s-1) !kg m-2 s-1!806!!!! 1!50167!C3H6 surf emissions (kg m-2 s-1) !kg m-2 s-1!806!!!! 1!50168!TOLUENE surf emissions (kg m-2 s-1) !kg m-2 s-1!806!!!! 1!50169!oXYLENE surf emissions (kg m-2 s-1) !kg m-2 s-1!806!!!! 1!50170!CH3OH surf emissions (kg m-2 s-1) !kg m-2 s-1!806!!!! 1!50171!H2 surf emissions (kg m-2 s-1) !kg m-2 s-1!806!!!! 1!50172!NO emiss from aircraft (kg m-2 s-1) !kg m-2 s-1!806!!!! 1!50173!NO2 DRY DEPOSITION (3D) !!901!!!! 1!50174!HNO3 DRY DEPOSITION (3D) !!901!!!! 1!50175!H2O2 DRY DEPOSITION (3D) !!901!!!! 1!50176!CH4 DRY DEPOSITION (3D) !!901!!!! 1!50177!MeOOH DRY DEPOSITION (3D) !!901!!!! 1!50178!EtOOH DRY DEPOSITION (3D) !!901!!!! 1!50179!PAN DRY DEPOSITION (3D) !!901!!!! 1!50180!i-PrOOH DRY DEPOSITION (3D) !!901!!!! 1!50181!O3S DRY DEPOSITION (3D) !!901!!!! 1!50182!ISOOH DRY DEPOSITION (3D) !!901!!!! 1!50183!MVKOOH DRY DEPOSITION (3D) !!901!!!! 1!50184!ORGNIT DRY DEPOSITION (3D) !!901!!!! 1!50185!H2 DRY DEPOSITION (3D) !!901!!!! 1!50186!s-BuOOH DRY DEPOSITION (3D) !!901!!!! 1!50187!NO3 WET DEPOSITION (3D) !!901!!!! 1!50188!N2O5 WET DEPOSITION (3D) !!901!!!! 1!50189!HO2NO2 WET DEPOSITION (3D) !!901!!!! 1!50190!HONO2 WET DEPOSITION (3D) !!901!!!! 1!50191!H2O2 WET DEPOSITION (3D) !!901!!!! 1!50192!HCHO WET DEPOSITION (3D) !!901!!!! 1!50193!HO2 WET DEPOSITION (3D) !!901!!!! 1!50194!MeOO WET DEPOSITION (3D) !!901!!!! 1!50195!MeOOH WET DEPOSITION (3D) !!901!!!! 1!50196!EtOOH WET DEPOSITION (3D) !!901!!!! 1!50197!i-PrOOH WET DEPOSITION (3D) !!901!!!! 1!50198!ISOOH WET DEPOSITION (3D) !!901!!!! 1!50199!ISON WET DEPOSITION (3D) !!901!!!! 1!50200!MGLY WET DEPOSITION (3D) !!901!!!! 1!50201!MVKOOH WET DEPOSITION (3D) !!901!!!! 1!50202!ORGNIT WET DEPOSITION (3D) !!901!!!! 1!50203!CH3OH WET DEPOSITION (3D) !!901!!!! 1!50204!s-BuOOH WET DEPOSITION (3D) !!901!!!! 1!50205!GLY WET DEPOSITION (3D) !!901!!!! 1!50206!O3 as Offline oxidant (MMR) !1!901!!!! 1!50207!OH as Offline oxidant (MMR) !1!901!!!! 1!50208!NO3 as Offline oxidant (MMR) !1!901!!!! 1!50209!HO2 as Offline oxidant (MMR) !1!901!!!! 1!50210!H2O2 as Offline oxidant (MMR) !1!901!!!! 1!50211!Monoterp surf emissions (kg m-2 s-1)!kg m-2 s-1!1001!!!! 1!50212!NVOC surf emissions (kg m-2 s-1) !kg m-2 s-1!1001!!!! 1!50213!NH3 surf emissions (kg m-2 s-1) !kg m-2 s-1!1001!!!! 1!50214!DMS surf emissions (kg m-2 s-1) !kg m-2 s-1!1001!!!! 1!50215!SO2 surf emissions (kg m-2 s-1) !kg m-2 s-1!1001!!!! 1!50216!SO2 high lev emissions (kg m-2 s-1) !kg m-2 s-1!1001!!!! 1!50217!SO2 natural emissions (kg m-2 s-1) !kg m-2 s-1!1001!!!! 1!51001!O3 MASS MIXING RATIO ON PRESS LEVS !1!1001!!!! 1!51002!NO MASS MIXING RATIO ON PRESS LEVS !1!1001!!!! 1!51003!NO3 MASS MIXING RATIO ON PRESS LEVS !1!1001!!!! 1!51004!NO2 MASS MIXING RATIO ON PRESS LEVS !1!1001!!!! 1!51005!N2O5 MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51006!HO2NO2 MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51007!HONO2 MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51008!H2O2 MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51009!CH4 MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51010!CO MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51011!HCHO MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51012!MeOOH MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51013!HONO MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51014!C2H6 MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51015!EtOOH MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51016!MeCHO MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51017!PAN MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51018!C3H8 MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51019!n-PrOOH MASS MIX RATIO ON PRESS LEV !1!1001!!!! 1!51020!i-PrOOH MASS MIX RATIO ON PRESS LEV !1!1001!!!! 1!51021!EtCHO MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51022!Me2CO MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51023!MeCOCH2OOH MASS MIX RATIO ON P LEVS !1!1001!!!! 1!51024!PPAN MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51025!MeONO2 MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51026!O3S MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51027!C5H8 MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51028!ISOOH MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51029!ISON MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51030!MACR MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51031!MACROOH MASS MIX RATIO ON PRESS LEV !1!1001!!!! 1!51032!MPAN MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51033!HACET MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51034!MGLY MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51035!NALD MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51036!HCOOH MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51037!MeCO3H MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51038!MeCO2H MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51039!MVK MASS MIXING RATIO ON PRESS LEVS !1!1001!!!! 1!51040!MVKOOH MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51041!Cl MASS MIXING RATIO ON PRESS LEVS !1!1001!!!! 1!51042!ClO MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51043!Cl2O2 MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51044!OClO MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51045!Br MASS MIXING RATIO ON PRESS LEVS !1!1001!!!! 1!51047!BrCl MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51048!BrONO2 MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51049!N2O MASS MIXING RATIO ON PRESS LEVS !1!1001!!!! 1!51051!HOCl MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51052!HBr MASS MIXING RATIO ON PRESS LEVS !1!1001!!!! 1!51053!HOBr MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51054!ClONO2 MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51055!CFCl3 MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51056!CF2Cl2 MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51057!MeBr MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51058!N MASS MIXING RATIO ON PRESS LEVS !1!1001!!!! 1!51059!O3P MASS MIXING RATIO ON PRESS LEVS !1!1001!!!! 1!51060!ORGNIT MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51069!CH3OH MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51070!H2 MASS MIXING RATIO ON PRESS LEVS !1!1001!!!! 1!51071!DMS MASS MIXING RATIO ON PRESS LEVS !1!1001!!!! 1!51072!SO2 MASS MIXING RATIO ON PRESS LEVS !1!1001!!!! 1!51073!H2SO4 MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51074!MSA MASS MIXING RATIO ON PRESS LEVS !1!1001!!!! 1!51075!DMSO MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51076!NH3 MASS MIXING RATIO ON PRESS LEVS !1!1001!!!! 1!51077!CS2 MASS MIXING RATIO ON PRESS LEVS !1!1001!!!! 1!51078!COS MASS MIXING RATIO ON PRESS LEVS !1!1001!!!! 1!51079!H2S MASS MIXING RATIO ON PRESS LEVS !1!1001!!!! 1!51080!H MASS MIXING RATIO ON PRESS LEVS !1!1001!!!! 1!51081!OH MASS MIXING RATIO ON PRESS LEVS !1!1001!!!! 1!51082!HO2 MASS MIXING RATIO ON PRESS LEVS !1!1001!!!! 1!51083!MeOO MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51084!EtOO MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51085!MeCO3 MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51086!n-PrOO MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51087!i-PrOO MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51088!EtCO3 MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51089!MeCOCH2OO MASS MIX RATIO ON PR LEVS !1!1001!!!! 1!51090!MeOH MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51091!MONOTERPENE MMR ON PRESSURE LEVELS !1!1001!!!! 1!51092!SEC_ORG MASS MIX RATIO ON PRESS LEVS!1!1001!!!! 1!51093!C3H6 MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51094!SO3 MASS MIXING RATIO ON PRESS LEVS !1!1001!!!! 1!51095!C4H9OOH MASS MIXING RATIO ON P LEVS !1!1001!!!! 1!51096!MEK MASS MIX RATIO ON PRESS LEVS !1!1001!!!! 1!51097!TOLUENE MASS MIXING RATIO ON P LEVS !1!1001!!!! 1!51098!LUMPED N (as NO2) MMR ON PRESS LEVS !1!1001!!!! 1!51099!LUMPED Br (as BrO) MMR ON P LEVELS !1!1001!!!! 1!51100!LUMPED Cl (as HCl) MMR ON P LEVELS !1!1001!!!! 1!51101!NUCL MODE (SOL) NUMBER ON PRESS LEV !!1001!!!! 1!51102!NUCL MODE (SOL) H2SO4 ON PRESS LEVS !!1001!!!! 1!51103!AITK MODE (SOL) NUMBER ON PRESS LEV !!1001!!!! 1!51104!AITK MODE (SOL) H2SO4 ON PRESS LEV !!1001!!!! 1!51105!AITK MODE (SOL) BC ON PRESS LEVELS !!1001!!!! 1!51106!AITK MODE (SOL) OC ON PRESS LEVELS !!1001!!!! 1!51107!ACCUM MODE (SOL) NBR ON PRESS LEVELS!!1001!!!! 1!51108!ACCUM MODE (SOL) H2SO4 ON PRESS LEVS!!1001!!!! 1!51109!ACCUM MODE (SOL) BC ON PRESS LEVELS !!1001!!!! 1!51110!ACCUM MODE (SOL) OC ON PRESS LEVELS !!1001!!!! 1!51111!ACCUM MODE (SOL) SEASALT ON PR LEVS !!1001!!!! 1!51112!ACCUM MODE (SOL) DUST ON PRESS LEVS !!1001!!!! 1!51113!COARSE MODE (SOL) NBR ON PRESS LEVS !!1001!!!! 1!51114!COARSE MODE (SOL) H2SO4 ON PRS LEVS !!1001!!!! 1!51115!COARSE MODE (SOL) BC ON PRESS LEVS !!1001!!!! 1!51116!COARSE MODE (SOL) OC ON PRESS LEVS !!1001!!!! 1!51117!COARSE MODE (SOL) SEASALT ON PR LEV !!1001!!!! 1!51118!COARSE MODE (SOL) DUST ON PRES LEVS !!1001!!!! 1!51119!AITK MODE (INS) NBR ON PRESS LEVELS !!1001!!!! 1!51120!AITK MODE (INS) BC ON PRESS LEVELS !!1001!!!! 1!51121!AITK MODE (INS) OC ON PRESS LEVELS !!1001!!!! 1!51122!ACCUM MODE (INS) NBR ON PRESS LEVS !!1001!!!! 1!51123!ACCUM MODE (INS) DUST ON PRESS LEVS !!1001!!!! 1!51124!COARSE MODE (INS) NBR ON PRESS LEVS !!1001!!!! 1!51125!COARSE MODE (INS) DUST ON PRESS LEV !!1001!!!! 1!51126!NUCL MODE (SOL) OC ON PRESS LEVELS !!1001!!!! 1!51127!AITK MODE (SOL) SEASALT ON PRS LEVS !!1001!!!! 1!51128!NUCL MODE (SOL) OC2 ON PRESS LEVELS !!1001!!!! 1!51129!AITK MODE (SOL) OC2 ON PRESS LEVELS !!1001!!!! 1!51130!ACCUM MODE (SOL) OC2 ON PRESS LEVS !!1001!!!! 1!51131!COARSE MODE (SOL) OC2 ON PRESS LEVS !!1001!!!! 1!51132!NUCL MODE (SOL) NH4 ON PRESS LEVELS !!1001!!!! 1!51133!AITK MODE (SOL) NH4 ON PRESS LEVELS !!1001!!!! 1!51134!ACCUM MODE (SOL) NH4 ON PRESS LEVS !!1001!!!! 1!51135!COARSE MODE (SOL) NH4 ON PRESS LEVS !!1001!!!! 1!51136!NUCL MODE (SOL) NO3 ON PRESS LEVELS !!1001!!!! 1!51137!AITK MODE (SOL) NO3 ON PRESS LEVELS !!1001!!!! 1!51138!ACCUM MODE (SOL) NO3 ON PRESS LEVS !!1001!!!! 1!51139!COARSE MODE (SOL) NO3 ON PRESS LEVS !!1001!!!! 1!51149!PASSIVE O3 MMR ON PRESSURE LEVELS !1!1001!!!! 1!51150!AGE OF AIR (SEC) ON PRESS LEVELS !!1001!!!! 1!51151!UKCA NON-TRANS SPEC 151 ON PR LEVEL !!1001!!!! 1!51152!UKCA NON-TRANS SPEC 152 ON PR LEVEL !!1001!!!! 1!51153!UKCA NON-TRANS SPEC 153 ON PR LEVEL !!1001!!!! 1!51154!UKCA NON-TRANS SPEC 154 ON PR LEVEL !!1001!!!! 1!51155!UKCA NON-TRANS SPEC 155 ON PR LEVEL !!1001!!!! 1!51156!UKCA NON-TRANS SPEC 156 ON PR LEVEL !!1001!!!! 1!51157!UKCA NON-TRANS SPEC 157 ON PR LEVEL !!1001!!!! 1!51158!UKCA NON-TRANS SPEC 158 ON PR LEVEL !!1001!!!! 1!51159!UKCA NON-TRANS SPEC 159 IN PR LEVEL !!1001!!!! 1!51160!UKCA NON-TRANS SPEC 160 ON PR LEVEL !!1001!!!! 1!51161!UKCA NON-TRANS SPEC 161 ON PR LEVEL !!1001!!!! 1!51162!UKCA NON-TRANS SPEC 162 ON PR LEVEL !!1001!!!! 1!51163!UKCA NON-TRANS SPEC 163 ON PR LEVEL !!1001!!!! 1!51164!UKCA NON-TRANS SPEC 164 ON PR LEVEL !!1001!!!! 1!51165!UKCA NON-TRANS SPEC 165 ON PR LEVEL !!1001!!!! 1!51166!UKCA NON-TRANS SPEC 166 ON PR LEVEL !!1001!!!! 1!51167!UKCA NON-TRANS SPEC 167 ON PR LEVEL !!1001!!!! 1!51168!UKCA NON-TRANS SPEC 168 ON PR LEVEL !!1001!!!! 1!51169!UKCA NON-TRANS SPEC 169 ON PR LEVEL !!1001!!!! 1!51170!UKCA NON-TRANS SPEC 170 ON PR LEVEL !!1001!!!! 1!51171!UKCA NON-TRANS SPEC 171 ON PR LEVEL !!1001!!!! 1!51172!UKCA NON-TRANS SPEC 172 ON PR LEVEL !!1001!!!! 1!51999!HEAVYSIDE FUNC FOR P LEVEL DIAGS !!1001!!!! 1!52001!Ox PRD:HO2+NO ON PRESSURE LEVELS !!1001!!!! 1!52002!Ox PRD:MeOO+NO ON PRESSURE LEVELS !!1001!!!! 1!52003!Ox PRD:NO+RO2 ON PRESSURE LEVELS !!1001!!!! 1!52004!Ox PRD:OH+INORG ACID ON PRESS LEVS !!1001!!!! 1!52005!Ox PRD:OH+ORG NITR ON PRESS LEVELS !!1001!!!! 1!52006!Ox PRD:ORG NITR PHOT ON PRESS LEVS !!1001!!!! 1!52007!Ox PRD:OH+PAN REACN ON PRESS LEVELS !!1001!!!! 1!52011!Ox LOSS:O(1D)+H2O ON PRESS LEVELS !!1001!!!! 1!52012!Ox LOSS:MINOR REACN ON PRESS LEVELS !!1001!!!! 1!52013!Ox LOSS:HO2+O3 ON PRESSURE LEVELS !!1001!!!! 1!52014!Ox LOSS:OH+O3 ON PRESSURE LEVELS !!1001!!!! 1!52015!Ox LOSS:O3+ALK ON PRESSURE LEVELS !!1001!!!! 1!52016!Ox LOSS:N2O5+H2O ON PRESSURE LEVELS !!1001!!!! 1!52017!Ox LOSS:NO3 CHEM LOSS ON PRESS LEVS !!1001!!!! 1!52021!Ox BDGT:O3 DRY DEP(3D) ON PRESS LEVS!!1001!!!! 1!52022!Ox BDGT:NOy DRY DEP(3D) ON PRESS LEV!!1001!!!! 1!52031!Ox BDGT:NOy WET DEP(3D) ON PRESS LEV!!1001!!!! 1!52041!FLUX:OH+CH4 (CH4 LIFETIME) ON PR LEV!!1001!!!! 1!52042!FLUX:NO3+C5H8->ISON ON PRESS LEVELS !!1001!!!! 1!52043!FLUX:NO+ISO2->ISON ON PRESS LEVELS !!1001!!!! 1!52044!FLUX:H2O2 PROD ON PRESSURE LEVELS !!1001!!!! 1!52045!FLUX:ROOH PROD ON PRESSURE LEVELS !!1001!!!! 1!52046!FLUX:HONO2 PROD (HNO3) ON PRES LEVS !!1001!!!! 1!52051!STE: O3 ON PRESSURE LEVELS !!1001!!!! 1!52052!TEND:O3 (TROP ONLY) ON PRESS LEVELS !!1001!!!! 1!52053!TROPOSPHERIC O3 ON PRESSURE LEVELS !!1001!!!! 1!52054!TEND:O3 (WHOLE ATMOS) ON PRESS LEVS !!1001!!!! 1!52061!AIR MASS DIAG(TROP) ON PRESSURE LEVS!!1001!!!! 1!52062!TROPOSPHERIC MASK ON PRESSURE LEVS !!1001!!!! 1!52063!AIR MASS DIAG(WHOLE ATM) ON PRS LEV !!1001!!!! 1!52071!CO BDG:LOSS OH+CO ON PRESSURE LEVELS!!1001!!!! 1!52072!CO BDG:PROD HCHO+OH/NO3 ON PRS LEVS !!1001!!!! 1!52073!CO BDG:PROD MGLY+OH/NO3 ON PRS LEVS !!1001!!!! 1!52074!CO BDG: MISC PROD ON PRESSURE LEVS !!1001!!!! 1!52075!CO BDG:PROD HCHO PHOT RAD ON PR LEVS!!1001!!!! 1!52076!CO BDG:PROD HCHO PHOT MOL ON PR LEVS!!1001!!!! 1!52077!CO BDG:PROD MGLY PHOT ON PRESS LEVS !!1001!!!! 1!52078!CO BDG:PROD MISC PHOT ON PRESS LEVS !!1001!!!! 1!52079!CO BDG:CO DRY DEP(3D) ON PRESS LEVEL!!1001!!!! 1!52081!LIT NOx EMISS 3D ON PRESSURE LEVELS !!1001!!!! 1!52091!STRAT OH PROD ON PRESSURE LEVELS !!1001!!!! 1!52092!STRAT OH LOSS ON PRESSURE LEVELS !!1001!!!! 1!52101!STRO3 PRD:O2+PHOT O(3P) ON PRESS LEV!!1001!!!! 1!52102!STRO3 PRD:O2+PHOT O(1D) ON PRESS LEV!!1001!!!! 1!52103!STRO3 PRD: HO2+NO ON PRESSURE LEVELS!!1001!!!! 1!52104!STRO3 PRD: MeOO+NO ON PRESS LEVELS !!1001!!!! 1!52111!STRO3 LOSS:Cl2O2+PHOT ON PRESS LEVS !!1001!!!! 1!52112!STRO3 LOSS:BrO+ClO ON PRESS LEVELS !!1001!!!! 1!52113!STRO3 LOSS:HO2+O3 ON PRESS LEVELS !!1001!!!! 1!52114!STRO3 LOSS:ClO+HO2 ON PRESS LEVELS !!1001!!!! 1!52115!STRO3 LOSS:BrO+HO2 ON PRESS LEVELS !!1001!!!! 1!52116!STRO3 LOSS:O3P+ClO ON PRESS LEVELS !!1001!!!! 1!52117!STRO3 LOSS:O3P+NO2 ON PRESS LEVELS !!1001!!!! 1!52118!STRO3 LOSS:O3P+HO2 ON PRESS LEVELS !!1001!!!! 1!52119!STRO3 LOSS:O3+H ON PRESSURE LEVELS !!1001!!!! 1!52120!STRO3 LOSS:O3P+O3 ON PRESSURE LEVELS!!1001!!!! 1!52121!STRO3 LOSS:NO3+PHOT ON PRESS LEVELS !!1001!!!! 1!52122!STRO3 LOSS:O1D+H2O ON PRESS LEVELS !!1001!!!! 1!52123!STRO3 LOSS: HO2+NO3 ON PRESS LEVELS !!1001!!!! 1!52124!STRO3 LOSS: OH+NO3 ON PRESS LEVELS !!1001!!!! 1!52125!STRO3 LOSS: NO3+HCHO ON PRESS LEVELS!!1001!!!! 1!52131!STRAT MISC:O3 DRY DP(3D) ON PRS LEV !!1001!!!! 1!52132!STRAT MISC:NOy DRY DP(3D) ON PRS LEV!!1001!!!! 1!52133!STRAT MISC:NOy WET DP(3D) ON PRS LEV!!1001!!!! 1!52140!DMS+OH=>SO2+MeOO+HCHO ON PRESS LEVS !!1001!!!! 1!52141!DMS+OH=>SO2+DMSO+MeOO ON PRESS LEVS !!1001!!!! 1!52142!DMS+NO3=>SO2+HONO2+MeOO ON PRESS LEV!!1001!!!! 1!52143!DMSO+OH=>SO2+MSA ON PRESSURE LEVELS !!1001!!!! 1!52144!CS2+OH=>SO2+COS ON PRESSURE LEVELS !!1001!!!! 1!52145!H2S + OH => SO2 ON PRESSURE LEVELS !!1001!!!! 1!52146!COS + OH => SO2 ON PRESSURE LEVELS !!1001!!!! 1!52147!Monoterp+OH=>Sec_org ON PRESS LEVS !!1001!!!! 1!52148!Monoterp+O3=>Sec_org ON PRESS LEVS !!1001!!!! 1!52149!Monoterp+NO3=>Sec_org ON PRESS LEVS !!1001!!!! 1!52150!SO2+OH=>HO2+H2SO4 ON PRESS LEVELS !!1001!!!! 1!52151!SO2 + H2O2 => NULL0 ON PRESS LEVELS !!1001!!!! 1!52152!SO2 + O3 => NULL1 ON PRESS LEVELS !!1001!!!! 1!52153!SO2 + O3 => NULL2 ON PRESSURE LEVEL !!1001!!!! 1!52154!SO2 DRY DEP (3D) ON PRESSURE LEVELS !!1001!!!! 1!52155!SO2 WET DEP (3D) ON PRESSURE LEVELS !!1001!!!! 1!52172!NO aircrft ems(kg m-2 s-1) ON PR LEV!kg m-2 s-1!1001!!!! 1!52173!NO2 DRY DEP (3D) ON PRESSURE LEVELS !!1001!!!! 1!52174!HNO3 DRY DEP (3D) ON PRESSURE LEVEL !!1001!!!! 1!52175!H2O2 DRY DEP(3D) ON PRESSURE LEVELS !!1001!!!! 1!52176!CH4 DRY DEP(3D) ON PRESSURE LEVELS !!1001!!!! 1!52177!MeOOH DRY DEP(3D) ON PRESSURE LEVELS!!1001!!!! 1!52178!EtOOH DRY DEP(3D) ON PRESSURE LEVELS!!1001!!!! 1!52179!PAN DRY DEP(3D) ON PRESSURE LEVELS !!1001!!!! 1!52180!i-PrOOH DRY DEP(3D) ON PRESSURE LEVS!!1001!!!! 1!52181!O3S DRY DEP(3D) ON PRESSURE LEVELS !!1001!!!! 1!52182!ISOOH DRY DEP(3D) ON PRESSURE LEVELS!!1001!!!! 1!52183!MVKOOH DRY DEP(3D) ON PRESSURE LEVS !!1001!!!! 1!52184!ORGNIT DRY DEP(3D) ON PRESSURE LEVS !!1001!!!! 1!52185!H2 DRY DEP(3D) ON PRESSURE LEVELS !!1001!!!! 1!52186!s-BuOOH DRY DEP(3D) ON PRESSURE LEVS!!1001!!!! 1!52187!NO3 WET DEP(3D) ON PRESSURE LEVELS !!1001!!!! 1!52188!N2O5 WET DEP(3D) ON PRESSURE LEVELS !!1001!!!! 1!52189!HO2NO2 WET DEP(3D) ON PRESSURE LEVS !!1001!!!! 1!52190!HONO2 WET DEP(3D) ON PRESSURE LEVELS!!1001!!!! 1!52191!H2O2 WET DEP(3D) ON PRESSURE LEVELS !!1001!!!! 1!52192!HCHO WET DEP(3D) ON PRESSURE LEVELS !!1001!!!! 1!52193!HO2 WET DEP(3D) ON PRESSURE LEVELS !!1001!!!! 1!52194!MeOO WET DEP(3D) ON PRESSURE LEVELS !!1001!!!! 1!52195!MeOOH WET DEP(3D) ON PRESSURE LEVELS!!1001!!!! 1!52196!EtOOH WET DEP(3D) ON PRESSURE LEVELS!!1001!!!! 1!52197!i-PrOOH WET DEP(3D) ON PRESSURE LEVS!!1001!!!! 1!52198!ISOOH WET DEP(3D) ON PRESSURE LEVELS!!1001!!!! 1!52199!ISON WET DEP(3D) ON PRESSURE LEVELS !!1001!!!! 1!52200!MGLY WET DEP(3D) ON PRESSURE LEVELS !!1001!!!! 1!52201!MVKOOH WET DEP(3D) ON PRESSURE LEVS !!1001!!!! 1!52202!ORGNIT WET DEP(3D) ON PRESSURE LEVS !!1001!!!! 1!52203!CH3OH WET DEP(3D) ON PRESSURE LEVS !!1001!!!! 1!52204!s-BuOOH WET DEP(3D) ON PRESSURE LEVS!!1001!!!! 1!52205!GLY WET DEP(3D) ON PRESSURE LEVELS !!1001!!!! 1!52206!O3 Offline oxid (MMR) ON PRESS LEVS !1!1001!!!! 1!52207!OH Offline oxid (MMR) ON PRESS LEVS !1!1001!!!! 1!52208!NO3 Offline oxid (MMR) ON PRESS LEVS!1!1001!!!! 1!52209!HO2 Offline oxid (MMR) ON PRESS LEVS!1!1001!!!! 1!52210!H2O2 Offl oxid (MMR) ON PRESS LEVS !1!1001!!!! 1!53181!Temperature Inc: Idealised (K/step)!!1002!!!! 1!53182!water vapour Inc: Ideal (kg/kg/step)!!1002!!!! 1!53185!U wind Inc: Idealised (m/s/step)!!1002!!!! 1!53186!V wind Inc: Idealised (m/s/step)!!1002!!!! 1!53190!Pot. temp. Inc: Idealised (K/step)!!1002!!!! 1!53201!Column vapour added: Ideal (kg/m2/s)!kg m-2 s-1!1002!!!! 1!53202!Potential temperature ref. prof (K)!K!1002!!!! 1!53203!Water vapour reference profile kg/kg!1!1002!!!! 1!53204!U wind reference profile (m/s) !m s-1!1002!!!! 1!53205!V wind reference profile (m/s) !m s-1!1002!!!! 1!53206!Col energy change due to dT (J/m2)!J m-2!1002!!!! 2!101!POTENTIAL TEMPERATURE (OCEAN) DEG.C!K @ 273.15!!900!sea_water_potential_temperature!! 2!102!SALINITY (OCEAN) (PSU-35)/1000!!!900!!! 2!103!OCN EXTRACER 1: CONVEN TCO2 !!!503!!! 2!103!OCN TRACER 1: TCO2 !!505!606!!! 2!103!TCO2 !!606.2!606.4!!! 2!103!OCN TRACER 1: TCO2 !!701!900!!! 2!104!OCN EXTRACER 2: CONVEN ALAKLINITY !!!503!!! 2!104!OCN TRACER 2: ALKALINITY !!505!606!!! 2!104!ALKALINITY !!606.2!606.4!!! 2!104!OCN TRACER 2: ALKALINITY !!701!900!!! 2!105!OCN EXTRACER 3: CONVEN NUTRIENT !!!503!!! 2!105!OCN TRACER 3: NUTRIENT !!505!606!!! 2!105!NUTRIENT !!606.2!606.4!!! 2!105!OCN TRACER 3: NUTRIENT !!701!900!!! 2!106!OCN EXTRACER 4: CONVEN PHYTOPLNKTN !!!503!!! 2!106!OCN TRACER 4: PHYTOPLANKTON !!505!606!!! 2!106!PHYTOPLANKTON !!606.2!606.4!!! 2!106!OCN TRACER 4: PHYTOPLANKTON !!701!900!!! 2!107!OCN EXTRACER 5: CONVEN ZOOPLNKTN !!!503!!! 2!107!OCN TRACER 5: ZOOPLANKTON !!505!606!!! 2!107!ZOOPLANKTON !!606.2!606.4!!! 2!107!OCN TRACER 5: ZOOPLANKTON !!701!900!!! 2!108!OCN EXTRACER 6: CONVEN DETRITUS !!!503!!! 2!108!OCN TRACER 6: DETRITAL NITROGEN !!505!606!!! 2!108!DETRITAL NITROGEN !!606.2!606.4!!! 2!108!OCN TRACER 6: DETRITAL NITROGEN !!701!900!!! 2!109!OCN EXTRACER 7: CONVEN TRITIUM !!!503!!! 2!109!OCN TRACER 7: DET. C;AMMON.;EXTRA C!!505!601!!! 2!109!OT7: DETRITAL CARBON !!606!606!!! 2!109!DETRITAL CARBON !!606.2!606.4!!! 2!109!OT7: DETRITAL CARBON !!701!900!!! 2!110!OCN EXTRACER 8: CONVEN 3H+3HE !!!503!!! 2!110!OCN TRACER 8: DON; EXTRA C !!505!601!!! 2!110!OT8: TOTAL DISSOLVED IRON !!606!606!!! 2!110!DISSOLVED IRON !!606.2!606.4!!! 2!110!OT8: TOTAL DISSOLVED IRON !!701!900!!! 2!111!OCN EXTRACER 9: CONVEN CFC11 !!!503!!! 2!111!OCN TRACER 9: DOC !!505!601!!! 2!111!OT9: DIATOMS; CFC11; HE3 !!606!606!!! 2!111!DIATOMS !!606.2!606.4!!! 2!111!OT9: DIATOMS; CFC11; HE3 !!701!900!!! 2!112!OCN EXTRACER 10: CONVEN CFC12 !!!503!!! 2!112!OCN TRACER 10: AMMONIUM; EXTRA C !!505!601!!! 2!112!OT10: DIATOM SILICATE; CFC12; HE4 !!606!606!!! 2!112!DIATOM SILICATE !!606.2!606.4!!! 2!112!OT10: DIATOM SILICATE; CFC12; HE4 !!701!900!!! 2!113!OCN EXTRACER 11: CONVEN CFC13 !!!503!!! 2!113!OCN TRACER 11: AMMONIUM !!505!601!!! 2!113!OT11: DETRITAL SILICATE; BOMB-C14 !!606!606!!! 2!113!DETRITAL SILICATE !!606.2!606.4!!! 2!113!OT11: DETRITAL SILICATE; BOMB-C14 !!701!900!!! 2!114!OCN EXTRACER 12: CONVEN CARBON14 !!!601!!! 2!114!OT12: DISSOLVED SILICATE; CARBON-14 !!606!606!!! 2!114!DISSOLVED SILICATE !!606.2!606.4!!! 2!114!OT12: DISSOLVED SILICATE; CARBON-14 !!701!900!!! 2!115!OCN EXTRACER 13: CONVEN -------- !!!601!!! 2!115!OT13: OXYGEN; EXTRA-C !!606!900!!! 2!116!OCN EXTRACER 14: CONVEN -------- !!!503!!! 2!116!OCN TRACER 14: CARBON 14 !!505!601!!! 2!116!OT14: AMMONIUM; HE3; EXTRA-C !!606!900!!! 2!117!OCN EXTRACER 15: CONVEN ------- !!!601!!! 2!117!OT15: DON; BOMB-C14; HE4 !!606!900!!! 2!118!OCN EXTRACER 16: CONVEN ------- !!!503!!! 2!118!OCN TRACER 16: HELIUM 3 !!505!601!!! 2!118!OT16: DOC; CARBON-14; AMMONIUM !!606!900!!! 2!119!OCN EXTRACER 17: CONVEN ------- !!!503!!! 2!119!OCN TRACER 17: HELIUM 4 !!505!601!!! 2!119!OT17: PHYTO-CHLOROPHYLL; CFC11 !!606!900!!! 2!120!OCN EXTRACER 18: CONVEN ------- !!!503!!! 2!120!OCN TRACER 18: OXYGEN !!505!601!!! 2!120!OT18: DIATOM-CHLORO; CFC12; EXTRA-C !!606!900!!! 2!121!BAROCLINIC U_VELOCITY (OCEAN) CM/S!cm s-1!!900!baroclinic_eastward_sea_water_velocity!! 2!122!BAROCLINIC V_VELOCITY (OCEAN) CM/S!cm s-1!!900!baroclinic_northward_sea_water_velocity!! 2!128!TOT. FW FLUX TO OCN (T-1) KG/M3.CM/S!!606!900!!! 2!129!UNSMOOTHED SURF.PRESS.TEND. G/CM/S2 !g cm-1 s-2!606!900!!! 2!130!STREAMFUNCTION (OCEAN) CM3/S!cm3 s-1!!900!!! 2!131!STREAMFUNCTION (T-1) (OCEAN) CM3/S!cm3 s-1!!900!!! 2!132!STREAMFN TENDENCY (OCEAN) CM3/S/TS!!!900!!! 2!133!STREAMFN TENDENCY(T-1)(OCN) CM3/S/TS!!!900!!! 2!134!SURFACE ELEVATION (OCEAN) CM!cm!!502!sea_surface_height_above_geoid!! 2!134!SURFACE PRESSURE (CGS) G/CM/S2!g cm-1 s-2!503!900!!! 2!135!BAROTROPIC U_VELOCITY (OCEAN) CM/S!cm s-1!!900!!! 2!136!BAROTROPIC V_VELOCITY (OCEAN) CM/S!cm s-1!!900!!! 2!137!MIXED LAYER DEPTH (OCEAN) M!m!!900!!! 2!139!ISX X OCEAN/ICE STRESS (ICE) N/M2!Pa!!900!!! 2!140!ISY Y OCEAN/ICE STRESS (ICE) N/M2!Pa!!900!!! 2!141!SNOW DEPTH (OCEAN) M!m!!503!surface_snow_thickness!where_sea_ice! 2!141!HSNOW: AGGREGATE LOCAL SNOW DEPTH M!m!505!900!!! 2!142!GBM CARYHEAT MISC HEAT FLX(ICE) W/M2!W m-2!!900!!! 2!143!GBM HEAT FLUX:OCEAN TO ICE(OCN) W/M2!W m-2!!900!!! 2!144!RATE OF SALINITY CHANGE (ICE) PSU/S!!!900!!! 2!145!ICY : TRUE IF BOX CONTAINS ICE !!!900!!! 2!146!AICE : ICE CONCENTRATION !1!!503!sea_ice_area_fraction!! 2!146!AICE: AGGREGATE ICE CONCENTRATION !1!505!900!!! 2!147!HICE: MEAN ICE DEPTH OVER GRIDBOX M!m!!503!sea_ice_thickness!! 2!147!HICE: AGGREGATE GBM ICE DEPTH M!m!505!900!!! 2!148!ICE U_VELOCITY M/S!m s-1!!900!!! 2!149!ICE V_VELOCITY M/S!m s-1!!900!!! 2!150!TAUX: X_WINDSTRESS N/M2 A!Pa!!900!!! 2!151!TAUY: Y_WINDSTRESS N/M2 A!Pa!!900!!! 2!152!WME: WIND MIXING ENERGY FLUX W/M2 A!W m-2!!900!!! 2!153!SURFACE PRESSURE N/M2 A!Pa!!403!!! 2!154!OCEAN NUDGING POT. TEMP.INCREMENTS !!505!900!!! 2!155!OCEAN NUDGING SALINE INCREMENTS !!505!900!!! 2!160!10M WINDSPEED (M/S) !m s-1!606!900!!! 2!161!SOL: PEN.SOLAR*LF INTO OCEAN W/M2 A!W m-2!!900!!! 2!162!HTN:NONPEN.HT.FLX*LF INTO OCN W/M2 A!W m-2!!900!!! 2!165!PLE:PRECIP-EVAP INTO OCEAN KG/M2/S A!kg m-2 s-1!!900!!! 2!166!RIVER OUTFLOW INTO OCEAN KG/M2/S A!kg m-2 s-1!!900!!! 2!167!WATER TYPE A!!!900!!! 2!170!SOLAR RADIATION OVER ICE W/M2 A!W m-2!!900!!! 2!171!SNOWFALL INTO OCN/ONTO ICE KG/M2/S A!kg m-2 s-1!!900!!! 2!172!SUBLIMATION FROM SEAICE KG/M2/S A!kg m-2 s-1!!900!!! 2!175!LAT B'DARY CONDITIONS (BOUNDARY) !!!900!!! 2!176!LAT B'DARY TENDENCIES (BOUNDARY) !!!900!!! 2!177!DUST DEPOSITION TO OCEAN: SIZE DIV 1!!606!900!!! 2!178!DUST DEPOSITION TO OCEAN: SIZE DIV 2!!606!900!!! 2!179!DUST DEPOSITION TO OCEAN: SIZE DIV 3!!606!900!!! 2!180!REF. SEA SURF. TEMPERATURE DEG.C A!K @ 273.15!!900!!! 2!181!REF.SEA SURF.SALINITY(PSU-35)/1000 A!!!900!!! 2!182!CLIM. AIR TEMPERATURE DEG.C A!K @ 273.15!!900!!! 2!183!CLIMATOLOGICAL ICE DEPTH M A!m!!900!!! 2!185!OCEAN HEAT FLUX CORRECTION W/M2 A!W m-2!!900!!! 2!186!P-E FLUX CORRECTION KG/M2/S A!kg m-2 s-1!!900!!! 2!187!DUST DEPOSITION TO OCEAN: SIZE DIV 4!!606!900!!! 2!188!DUST DEPOSITION TO OCEAN: SIZE DIV 5!!606!900!!! 2!189!DUST DEPOSITION TO OCEAN: SIZE DIV 6!!606!900!!! 2!190!GBM SEAICE TOPMELT HEAT FLUX W/M2 A!W m-2!!503!surface_snow_and_ice_melt_heat_flux!where_sea_ice! 2!190!TOPMELT: GBM SEAICE HEAT FLUX W/M2 A!W m-2!505!900!!! 2!191!GBM SEAICE BOTMELT HEAT FLUX W/M2 A!W m-2!!503!downward_heat_flux_in_sea_ice!! 2!191!BOTMELT: GBM SEAICE HEAT FLUX W/M2 A!W m-2!505!900!!! 2!192!CONJUGATE GRADIENT RESIDUAL (TS) !!401!502!!! 2!192!CARYSALT/SALINITY (1/S) !s-1!503!503!!! 2!192!I2O FRESHWATER FLUX KG/M3.M/S!!505!900!!! 2!193!CONJUGATE GRADIENT RESIDUAL (TS-1) !!401!502!!! 2!193!CARYSALT/SALINITY (T-1) (1/S) !s-1!503!503!!! 2!193!I2O FRESHWATER FLUX (T-1) KG/M3.M/S!!505!900!!! 2!194!THICKNESS DIFF COEFF (OCEAN) CM2/S !cm2 s-1!403!900!!! 2!195!SURFACE ELEVATION(DTBT-1)(OCEAN) CM!cm!404!502!!! 2!195!SURFACE PRESSURE(T-1)(CGS) G/CM/S2!g cm-1 s-2!503!900!!! 2!196!B'TROPIC U_FLUX (DTBT-1)(OCEAN)CM2/S!cm2 s-1!404!900!!! 2!197!B'TROPIC V_FLUX (DTBT-1)(OCEAN)CM2/S!cm2 s-1!404!900!!! 2!198!B'TROPIC U_FLUX (DTBC-1)(OCEAN)CM2/S!cm2 s-1!404!502!!! 2!198!B'TROPIC U_VEL (T-1)(OCEAN) CM/S!cm s-1!503!900!!! 2!199!B'TROPIC V_FLUX (DTBC-1)(OCEAN)CM2/S!cm2 s-1!404!502!!! 2!199!B'TROPIC V_VEL (T-1)(OCEAN) CM/S!cm s-1!503!900!!! 2!200!CO2 ATMOS LEVEL 1 CONC ppmv!!405!606!!! 2!200!CO2 ATMOS LEVEL 1 CONC ppmv !!606.2!606.4!!! 2!200!CO2 ATMOS LEVEL 1 CONC ppmv!!701!900!!! 2!201!LEVITUS NITRATE (mmol/m3) !mmol m-3!505!900!!! 2!202!CARBON TO CHL RATIO (gC/gChl) !1!505!601!!! 2!202!CARBON:CHL RATIO (PHYTOPL) (gC/gChl)!1!606!900!!! 2!203!CARBON:CHL RATIO (DIATOMS) (gC/gChl)!1!606!900!!! 2!204!HELIUM SOURCE LAYER NUMBER !!505!900!!! 2!205!HE3 SOURCE FLUX (*1e12) Mol/m3/y !!505!900!!! 2!206!HE4 SOURCE FLUX (*1e6) Mol/m3/y !!505!900!!! 2!207!CO2 flux (air-to-sea) (mole-C/m2/yr)!mol m-2 yr-1!606.3!606.4!!! 2!208!DMS flux (sea-to-air) (Mol-DMS/m2/y)!mol m-2 yr-1!606.3!606.4!!! 2!210!SIG11NE ICE INTERNAL STRESS CPT M/S!m s-1!505!900!!! 2!211!SIG11SE ICE INTERNAL STRESS CPT M/S!m s-1!505!900!!! 2!212!SIG11SW ICE INTERNAL STRESS CPT M/S!m s-1!505!900!!! 2!213!SIG11NW ICE INTERNAL STRESS CPT M/S!m s-1!505!900!!! 2!214!SIG12NE ICE INTERNAL STRESS CPT M/S!m s-1!505!900!!! 2!215!SIG12SE ICE INTERNAL STRESS CPT M/S!m s-1!505!900!!! 2!216!SIG12SW ICE INTERNAL STRESS CPT M/S!m s-1!505!900!!! 2!217!SIG12NW ICE INTERNAL STRESS CPT M/S!m s-1!505!900!!! 2!218!SIG22NE ICE INTERNAL STRESS CPT M/S!m s-1!505!900!!! 2!219!SIG22SE ICE INTERNAL STRESS CPT M/S!m s-1!505!900!!! 2!220!SIG22SW ICE INTERNAL STRESS CPT M/S!m s-1!505!900!!! 2!221!SIG22NW ICE INTERNAL STRESS CPT M/S!m s-1!505!900!!! 2!222!HSNOWN: CATEGORY LOCAL SNOW DEPTHS M!m!505!900!!! 2!223!AICEN: CATEGORY ICE CONCENTRATIONS !!505!900!!! 2!224!HICEN: CATEGORY GBM ICE DEPTHS M!m!505!900!!! 2!225!TOPMELTN: CATEGORY GBM TOPMELT W/M2!W m-2!505!900!!! 2!226!BOTMELTN: CATEGORY GBM BOTMELT W/M2!W m-2!505!900!!! 2!231!DISSOLVED NITRATE mmol m-3 !mmol m-3!606!900!!! 2!232!DISSOLVED PHOSPHATE mmol m-3 !mmol m-3!606!900!!! 2!233!DIATOM BIOMASS mg-C m-3 !!606!900!!! 2!234!FLAGELLATE BIOMASS mg-C m-3 !!606!900!!! 2!235!PICOPLANKTON BIOMASS mg-C m-3 !!606!900!!! 2!236!DINOFLAGELLATE BIOMASS mg-C m-3 !!606!900!!! 2!237!DISSOLVED OXYGEN mmol m-3 !mmol m-3!606!900!!! 2!238!ZOOPLANKTON BIOMASS mg-C m-3 !!606!900!!! 2!239!UNDERWATER VISIBILITY m !m!606!900!!! 2!240!DAILY AVERAGED VISIBILITY m !m!606!900!!! 2!285!RIGID-LID PRESSURE/PA !Pa!505!900!!! 2!291!THERMAL BIAS / DEG C !K @ 273.15!601!900!!! 2!292!SALINITY BIAS /(psu-35)/1000 !!601!900!!! 2!293!LCL SOL: PEN.SOLAR TO OCEAN W/M2 !W m-2!601!900!!! 2!294!LCL HTN: NONPEN.HEAT INTO OCEAN W/M2!W m-2!601!900!!! 2!295!LCL SUBLIM. FROM SEAICE KG/M2/S!kg m-2 s-1!601!900!!! 2!296!LCL TOPMELT: SEAICE HEAT FLUX W/M2!W m-2!601!900!!! 2!297!LCL BOTMELT: SEAICE HEAT FLUX W/M2!W m-2!601!900!!! 2!298!LCL PLE:PREC-EVAP INTO OCN KG/M2/S!kg m-2 s-1!601!900!!! 2!299!LCL WME: WINDMIXING ENERGY FLUX W/M2!W m-2!601!900!!! 2!331!WINDSPEED FROM ANCILLARY FILE !!606.2!606.4!!! 2!332!ICE CONCENTRATION FOR MASKING C FLUX!!606.2!606.4!!! 2!333!DUST FIELD !!606.2!606.4!!! 2!30201!VERT.VEL. ON OCEAN HALF LEVELS CM/S!cm s-1!!900!!! 2!30202!MIXED LAYER DEPTH M!m!!900!!! 2!30203!ANOMALOUS HEAT FLUX W/M2!W m-2!!900!!! 2!30204!ANOMALOUS SALINITY FLUX KG/M2/S!kg m-2 s-1!!900!!! 2!30205!ANOMALOUS SEA ICE HEAT FLUX W/M2!W m-2!!900!!! 2!30206!GBM HTN INTO OCEAN BUDGET W/M**2!W m-2!!900!!! 2!30207!SNOWRATE WHERE NO ICE KG M**-2 S**-1!kg m-2 s-1!!900!!! 2!30208!CARYHEAT AFTER ROW CALCULATION W/M2!W m-2!!900!!! 2!30210!DTHETA/DT IN TOTAL (OCN) K/S!K s-1!!402!!! 2!30210!DTHETA/DT IN TOTAL K/Gs!!403!900!!! 2!30211!MEAD DIAGNOSTICS: TEMPERATURE W !!!900!!! 2!30212!MEAD DIAGNOSTICS: SALINITY KG/S !!!900!!! 2!30213!MEAD DIAGNOSTICS: EXTRA TRACER 1 !!!900!!! 2!30214!MEAD DIAGNOSTICS: EXTRA TRACER 2 !!!900!!! 2!30215!MEAD DIAGNOSTICS: EXTRA TRACER 3 !!!900!!! 2!30216!MEAD DIAGNOSTICS: EXTRA TRACER 4 !!!900!!! 2!30217!MEAD DIAGNOSTICS: EXTRA TRACER 5 !!!900!!! 2!30218!MEAD DIAGNOSTICS: EXTRA TRACER 6 !!!900!!! 2!30219!MEAD DIAGNOSTICS: EXTRA TRACER 7 !!!900!!! 2!30220!MEAD DIAGNOSTICS: EXTRA TRACER 8 !!!900!!! 2!30221!MEAD DIAGNOSTICS: EXTRA TRACER 9 !!!900!!! 2!30222!MEAD DIAGNOSTICS: EXTRA TRACER 10 !!!900!!! 2!30223!MEAD DIAGNOSTICS: EXTRA TRACER 11 !!!900!!! 2!30224!MEAD DIAGNOSTICS: EXTRA TRACER 12 !!!900!!! 2!30225!MEAD DIAGNOSTICS: EXTRA TRACER 13 !!!900!!! 2!30226!MEAD DIAGNOSTICS: EXTRA TRACER 14 !!!900!!! 2!30227!MEAD DIAGNOSTICS: EXTRA TRACER 15 !!!900!!! 2!30228!MEAD DIAGNOSTICS: EXTRA TRACER 16 !!!900!!! 2!30229!MEAD DIAGNOSTICS: EXTRA TRACER 17 !!!900!!! 2!30230!MEAD DIAGNOSTICS: EXTRA TRACER 18 !!!900!!! 2!30231!DTHETA/DT FROM X-ADVECTION (OCN) K/S!K s-1!!402!!! 2!30231!DTHETA/DT FROM X-ADVECTION K/Gs!!403!900!!! 2!30232!DTHETA/DT FROM Y-ADVECTION (OCN) K/S!K s-1!!402!!! 2!30232!DTHETA/DT FROM Y-ADVECTION K/Gs!!403!900!!! 2!30233!DTHETA/DT FROM Z-ADVECTION (OCN) K/S!K s-1!!402!!! 2!30233!DTHETA/DT FROM Z-ADVECTION K/Gs!!403!900!!! 2!30234!DTHETA/DT FROM X-DIFFUSION (OCN) K/S!K s-1!!402!!! 2!30234!DTHETA/DT FROM X-DIFFUSION K/Gs!!403!900!!! 2!30235!DTHETA/DT FROM Y-DIFFUSION (OCN) K/S!K s-1!!402!!! 2!30235!DTHETA/DT FROM Y-DIFFUSION K/Gs!!403!900!!! 2!30236!DTHETA/DT FROM Z-DIFFUSION (OCN) K/S!K s-1!!402!!! 2!30236!DTHETA/DT FROM Z-DIFFUSION K/Gs!!403!900!!! 2!30237!DTHETA/DT FROM SFC. FLUXES (OCN) K/S!K s-1!!402!!! 2!30237!DTHETA/DT FROM SFC. FLUXES K/Gs!!403!900!!! 2!30238!DTHETA/DT FROM PEN. SOLAR (OCN) K/S!K s-1!!402!!! 2!30238!DTHETA/DT FROM PEN. SOLAR K/Gs!!403!900!!! 2!30239!DTHETA/DT FROM ICE PHYSICS (OCN) K/S!K s-1!!402!!! 2!30239!DTHETA/DT FROM ICE PHYSICS K/Gs!!403!900!!! 2!30240!DTHETA/DT FROM ML PHYSICS (OCN) K/S!K s-1!!402!!! 2!30240!DTHETA/DT FROM ML PHYSICS K/Gs!!403!900!!! 2!30241!DTHETA/DT FROM CONVECTION (OCN) K/S!K s-1!!402!!! 2!30241!DTHETA/DT FROM CONVECTION K/Gs!!403!900!!! 2!30242!DTHETA/DT FROM Z-ADV+Z-DIFF(OCN) K/S!K s-1!!402!!! 2!30242!DTHETA/DT FROM Z-ADV+Z-DIFF K/Gs!!403!403!!! 2!30242!DTHETA/DT FROM ADVECTION K/Gs!!404!900!!! 2!30243!DTHETA/DT FROM FOURIER FILT(OCN) K/S!K s-1!!402!!! 2!30243!DTHETA/DT FROM FOURIER FILT K/Gs!!403!900!!! 2!30244!DTHETA/DT FROM ROBERT FILT (OCN) K/S!K s-1!!402!!! 2!30244!DTHETA/DT FROM ROBERT FILT K/Gs!!403!900!!! 2!30245!DTHETA/DT FROM MED. OUTFLOW(OCN) K/S!K s-1!!402!!! 2!30245!DTHETA/DT FROM MED. OUTFLOW K/Gs!!403!900!!! 2!30246!BAROCLINIC X-ACCN (ZUN) CM/S**2!cm s-2!!900!!! 2!30247!BAROCLINIC Y-ACCN (ZVN) CM/S**2!cm s-2!!900!!! 2!30248!PCO2 (OCEAN) !!!900!!! 2!30249!CO2 FLUX (AIR-TO-SEA) (MOLE-C/M2/YR)!!!900!!! 2!30250!CO2 INVASION RATE (MOLE-C/M2/YR) !!!503!!! 2!30250!CO2 INVASION ; CO2 FLUX FOR 2ND C !!505!900!!! 2!30251!CO2 EVASION RATE (MOLE-C/M2/YR) !!!503!!! 2!30251!CO2 EVASION ; PCO2 FOR 2ND CARBON !!505!900!!! 2!30252!PRIMARY PRODUCTION (GC/M2/DAY) !!!601!!! 2!30252!VIRTUAL FLUX: CO2 !!606!900!!! 2!30253!ZOOPLTN PRODUCTION (GC/M2/DAY) !!!601!!! 2!30253!OCEAN SURFACE PH !1!606!900!!! 2!30254!PHYTO SPECIFIC GROWTH RATE (1/DAY) !day-1!!601!!! 2!30254!OCEAN SURFACE PCO2 (2ND CO2) !!606!900!!! 2!30255!PHYTO SPECIFIC GRAZING RATE (1/DAY) !day-1!!601!!! 2!30255!AIR-SEA FLUX: 2ND CO2 !!606!900!!! 2!30256!PHYTO SPECIFIC MORTALITY (1/DAY) !day-1!!601!!! 2!30256!VIRTUAL FLUX: 2ND CO2 !!606!900!!! 2!30257!NITRATE GAIN-EXCRETION (MMOL-N/M2/D)!!!601!!! 2!30257!OCEAN SURFACE PH (2ND CO2) !!606!900!!! 2!30258!NITRATE LOSS - GROWTH (MMOL-N/M2/D) !!!601!!! 2!30258!VIRTUAL FLUX: ALKALINITY !!606!900!!! 2!30259!NITRATE GAIN-PHY MORT (MMOL-N/M2/D) !!!601!!! 2!30259!AIR-SEA FLUX: CARBON-14 !!606!900!!! 2!30260!NITRATE GAIN-ZOO MORT (MMOL-N/M2/D) !!!601!!! 2!30260!VIRTUAL FLUX: CARBON-14 !!606!900!!! 2!30261!NITRATE GAIN-PHY RESP (MMOL-N/M2/D) !!!601!!! 2!30261!AIR-SEA FLUX: BOMB C-14 !!606!900!!! 2!30262!NITRATE GAIN-REMIN (MMOL-N/M2/D) !!!601!!! 2!30262!VIRTUAL FLUX: BOMB C-14 !!606!900!!! 2!30263!NUTRIENT LIMITATION !!!601!!! 2!30263!AIR-SEA FLUX: CFC-11 !!606!900!!! 2!30264!LIGHT LIMITATION !!!601!!! 2!30264!VIRTUAL FLUX: CFC-11 !!606!900!!! 2!30265!TEMPERATURE LIMITATION !!!601!!! 2!30265!AIR-SEA FLUX: CFC-12 !!606!900!!! 2!30266!DETRITUS FLUX (MMOL-N/M2/D)!!!601!!! 2!30266!VIRTUAL FLUX: CFC-12 !!606!900!!! 2!30267!VERTICAL NITRATE FLUX (MMOL-N/M2/D)!!!601!!! 2!30267!AIR-SEA FLUX: HELIUM-3 !!606!900!!! 2!30268!HORIZ NITRATE ADVECT RATE(MMOL/M3/D)!!!601!!! 2!30268!VIRTUAL FLUX: HELIUM-3 !!606!900!!! 2!30269!VERT NITRATE ADVECTN RATE(MMOL/M3/D)!!!601!!! 2!30269!AIR-SEA FLUX: HELIUM-4 !!606!900!!! 2!30270!HORIZ NITRATE DIFFUSION (MMOL/M3/D)!!!601!!! 2!30270!VIRTUAL FLUX: HELIUM-4 !!606!900!!! 2!30271!VERT NITRATE DIFFUSION (MMOL/M3/D)!!!601!!! 2!30271!AIR-SEA FLUX: OXYGEN !!606!900!!! 2!30272!NITRATE MIXING DUE TO MLM(MMOL/M3/D)!!!601!!! 2!30272!VIRTUAL FLUX: OXYGEN !!606!900!!! 2!30273!NITRATE CONVECTION (MMOL/M3/D)!!!601!!! 2!30273!AIR-SEA FLUX: DMS !!606!900!!! 2!30274!NITRATE CHANGE - BIOLOGY (MMOL/M3/D)!!!601!!! 2!30275!NITRATE CHANGE-RESETTING (MMOL/M3/D)!!!601!!! 2!30276!HORIZ PHYTO ADVECT RATE(MMOL-N/M3/D)!!!601!!! 2!30277!HORIZ ZOO ADVECT RATE(MMOL-N/M3/D)!!!601!!! 2!30278!HORIZ DETRI ADVECT RATE(MMOL-N/M3/D)!!!601!!! 2!30279!ANOM. HEAT "SINK" AT OCN FLOOR W/M2!W m-2!!900!!! 2!30280!WATER_FLUX*SALINITY/DENSITY M S**-1!!!402!!! 2!30280!WATER_FLUX*SALINITY/DENSITY m Gs**-1!!403!900!!! 2!30281!GM EDDY U VELOCITY (OCEAN) !!401!900!!! 2!30282!GM EDDY V VELOCITY (N FACE) (OCEAN) !!401!900!!! 2!30283!GM EDDY W VEL (TOP FACE) (OCEAN) !!401!900!!! 2!30284!DTHETA/DT FROM G&MCW SCHEME K/S !K s-1!401!402!!! 2!30284!DTHETA/DT FROM G&MCW SCHEME K/Gs!!403!900!!! 2!30285!RIGID-LID PRESSURE/PA !!401!601!!! 2!30286!KM VERTICAL MOMENTUM DIFFUSION COEFF!!403!404.1!!! 2!30286!OLD- DO NOT USE: KM !!405!900!!! 2!30287!KT VERTICAL TRACER DIFFUSION COEFF !!403!404.1!!! 2!30287!OLD- DO NOT USE: KT !!405!900!!! 2!30288!RIM RICHARDSON NO MOMENTUM !!403!404.1!!! 2!30288!OLD- DO NOT USE: RIM !!405!900!!! 2!30289!RIT RICHARDSON NO TRACER !!403!404.1!!! 2!30289!OLD- DO NOT USE: RIT !!405!900!!! 2!30290!HM MAX DEPTH LARGE SCHEME MOMENTUM !!403!900!!! 2!30291!HT MAX DEPTH LARGE SCHEME TRACER !!403!900!!! 2!30292!VIRTUAL AIR-SEA FLUX OF CO2 !!404!404.1!!! 2!30292!OLD- DO NOT USE: VIRT A-S FLUX CO2 !!405!503!!! 2!30292!VIRTUAL AIR-SEA FLUX OF CO2 !!505!601!!! 2!30293!VIRTUAL AIR-SEA FLUX OF ALKALINITY !!404!404.1!!! 2!30293!OLD- DO NOT USE: VIRT A-S FLUX ALK !!405!503!!! 2!30293!VIRTUAL AIR-SEA FLUX OF ALKALINITY !!505!505!!! 2!30294!RICHARDSON NO CALC FROM MLD ROUTINE !!405!505!!! 2!30296!KM VERT MOM DIFF COEFF !!405!505!!! 2!30296!KM VERT MOM DIFF COEFF !!606.2!606.4!!! 2!30297!KT VERT TRACER DIFF COEFF !!405!505!!! 2!30297!KT VERT TRACER DIFF COEFF !!606.2!606.4!!! 2!30298!RIM RICHARDSON NUMBER MOMENTUM !!405!505!!! 2!30298!RIM RICHARDSON NUMBER MOMENTUM !!606.2!606.4!!! 2!30299!RIT RICHARDSON NUMBER TRACER !!405!505!!! 2!30299!RIT RICHARDSON NUMBER TRACER !!606.2!606.4!!! 2!30301!TEMPERATURE (OCEAN) DEG.C !K @ 273.15!404!900!!! 2!30302!LM MONIN OBUKHOV LENGTH MOMENTUM !!405!900!!! 2!30303!LT MONIN OBUKHOV LENGTH TRACER !!405!900!!! 2!30306!DS/DT FROM X-ADVECTION (OCN) S**-1!s-1!401!402!!! 2!30306!DS/DT FROM X-ADVECTION (OCN) Gs**-1!!403!900!!! 2!30307!DS/DT FROM Y-ADVECTION (OCN) S**-1!s-1!401!402!!! 2!30307!DS/DT FROM Y-ADVECTION (OCN) Gs**-1!!403!900!!! 2!30308!DS/DT FROM Z-ADVECTION (OCN) S**-1!s-1!401!402!!! 2!30308!DS/DT FROM Z-ADVECTION (OCN) Gs**-1!!403!900!!! 2!30309!DS/DT FROM X-DIFFUSION (OCN) S**-1!s-1!401!402!!! 2!30309!DS/DT FROM X-DIFFUSION (OCN) Gs**-1!!403!900!!! 2!30310!DS/DT FROM Y-DIFFUSION (OCN) S**-1!s-1!401!402!!! 2!30310!DS/DT FROM Y-DIFFUSION (OCN) Gs**-1!!403!900!!! 2!30311!DS/DT FROM Z-DIFFUSION (OCN) S**-1!s-1!401!402!!! 2!30311!DS/DT FROM Z-DIFFUSION (OCN) Gs**-1!!403!900!!! 2!30312!DS/DT FROM SFC. FLUXES (OCN) S**-1!s-1!401!402!!! 2!30312!DS/DT FROM SFC. FLUXES (OCN) Gs**-1!!403!900!!! 2!30313!DS/DT FROM ICE PHYSICS (OCN) S**-1!s-1!401!402!!! 2!30313!DS/DT FROM ICE PHYSICS (OCN) Gs**-1!!403!900!!! 2!30314!DS/DT FROM ML PHYSICS (OCN) S**-1!s-1!401!402!!! 2!30314!DS/DT FROM ML PHYSICS (OCN) Gs**-1!!403!900!!! 2!30315!DS/DT FROM CONVECTION (OCN) S**-1!s-1!401!402!!! 2!30315!DS/DT FROM CONVECTION (OCN) Gs**-1!!403!900!!! 2!30316!DS/DT FROM Z-ADV+Z-DIFF (OCN) S**-1!s-1!401!402!!! 2!30316!DS/DT FROM Z-ADV+Z-DIFF (OCN) Gs**-1!!403!403!!! 2!30316!DS/DT FROM ADVECTION Gs**-1!!404!900!!! 2!30317!DS/DT FROM FOURIER FILT (OCN) S**-1!s-1!401!402!!! 2!30317!DS/DT FROM FOURIER FILT (OCN) Gs**-1!!403!900!!! 2!30318!DS/DT FROM ROBERT FILT (OCN) S**-1!s-1!401!402!!! 2!30318!DS/DT FROM ROBERT FILT (OCN) Gs**-1!!403!900!!! 2!30319!DS/DT FROM MED. OUTFLOW (OCN) S**-1!s-1!401!402!!! 2!30319!DS/DT FROM MED. OUTFLOW (OCN) Gs**-1!!403!900!!! 2!30320!TOTAL OCEAN U-VELOCITY CM S**-1!cm s-1!401!900!!! 2!30321!TOTAL OCEAN V-VELOCITY CM S**-1!cm s-1!401!900!!! 2!30322!DS/DT FROM G&MCW SCHEME Gs**-1!!404!900!!! 2!30323!Turbulent Kinetic Energy M2/S2 !m2 s-2!503!900!!! 2!30324!MIXED LAYER DEPTH M!m!606!900!!! 2!30325!ISOTHERMAL LAYER DEPTH M!m!606!900!!! 2!30330!D(SURF PRESSURE)/DT/GRAVITY CM/S !cm s-1!601!900!!! 2!30331!SURF SAL*D(SURF PRES)/DT/G PSU*CM/S !!601!900!!! 2!30400!PRIMARY PRODUCTION (GC/M2/DAY) !!505!900!!! 2!30401!CARBON EXPORT BY CARBONATE PUMP !!505!900!!! 2!30402!REGENERATED PRODUCTION (GC/M2/DAY) !!505!900!!! 2!30403!D: PHYTO PRIMARY PRODUCTN (GC/M2/D) !!606!900!!! 2!30404!D: DIATOM PRIMARY PRODCTN (GC/M2/D) !!606!900!!! 2!30405!D: IRON DEPOSITION (U-MOL-FE/M2/S) !u mol fe m-2 s-1!606!900!!! 2!30406!SURFACE DMS CONCENTRATION (MOL/M3) !mol m-3!606!900!!! 2!30410!NUTRIENT LIMITATION FACTOR !!505!601!!! 2!30410!S,O: 1ST N-LIM; D: DTM CHL, C:CHL !!606!900!!! 2!30411!NUTRIENT LIMITATION : SEMI-IMPLICIT !!505!601!!! 2!30411!S,O: 2ND N_LIM; D: DTM SPCFC GROWTH !!606!900!!! 2!30412!TEMPERATURE LIMITATION FACTOR !!505!601!!! 2!30412!S,O: T-LIM, MX GRW RT; D: DTM GROWTH!!606!900!!! 2!30413!PHYTOPLANKTON MAXIMUM GROWTH RATE !!505!505!!! 2!30413!CHLOROPHYLL-A CONCENTRATION MMOL/M^3!mmol m-3!601!601!!! 2!30413!PHYT CHL CONC, C:CHL RATIO !!606!900!!! 2!30414!PHYTOPLANKTON GROWTH RATE !!505!601!!! 2!30414!PHYT SPECFC GROWTH RATE(MMOL-N/M3/D)!!606!900!!! 2!30415!PHYTOPLANKTON GROWTH (MMOL-N/M3/D) !!505!601!!! 2!30415!PHYT GROWTH RATE (MMOL-N/M3/D) !!606!900!!! 2!30416!PHYTOPLANKTON RESP. (MMOL-N/M3/D) !!505!900!!! 2!30417!PHYTOPLANKTON MORTALITY(MMOL-N/M3/D)!!505!900!!! 2!30418!ZOOPLANKTON MORTALITY (MMOL-N/M3/D) !!505!900!!! 2!30419!GRAZING ON DETRITUS-N (MMOL-N/M3/D) !!505!900!!! 2!30420!GRAZING ON DETRITUS-C (MMOL-C/M3/D) !!505!900!!! 2!30421!GRAZING CONT. TO N (MMOL-N/M3/D) !!505!601!!! 2!30421!GRAZING FLOW TO DSLVD N(MMOL-N/M3/D)!!606!900!!! 2!30422!GRAZING CONT. TO P (MMOL-N/M3/D) !!505!601!!! 2!30422!GRAZING ON PHYTOPL (MMOL-N/M3/D) !!606!900!!! 2!30423!GRAZING CONT. TO Z (MMOL-N/M3/D) !!505!601!!! 2!30423!GRAZING FLOW TO ZOOPL (MMOL-N/M3/D)!!606!900!!! 2!30424!GRAZING CONT. TO DN (MMOL-N/M3/D) !!505!601!!! 2!30424!GRAZING FLOW TO DETR-N (MMOL-N/M3/D)!!606!900!!! 2!30425!GRAZING CONT. TO DC (MMOL-C/M3/D) !!505!601!!! 2!30425!S:BKP 2 C; O,D:GRAZING FLW TO DETR-C!!606!900!!! 2!30426!GRAZING CONT. TO DON (MMOL-N/M3/D) !!505!601!!! 2!30426!S:BKP 2 N; O:GRZ 2 DON; D:GRZ ON DTM!!606!900!!! 2!30427!GRAZING CONT. TO DOC (MMOL-C/M3/D) !!505!601!!! 2!30427!S:BKP 2 DN; O:GRZ 2 DOC; D:GRZ DTMSI!!606!900!!! 2!30428!GRAZING CONT. TO DIC (MMOL-C/M3/D) !!505!601!!! 2!30428!GRAZING FLOW TO TCO2 (MMOL-C/M3/D) !!606!900!!! 2!30429!BREAKDOWN OF DETRITAL N(MMOL-N/M3/D)!!505!900!!! 2!30430!BREAKDOWN OF DETRITAL C(MMOL-C/M3/D)!!505!900!!! 2!30431!BREAKDOWN OF DON (MMOL-N/M3/D) !!505!601!!! 2!30431!O:BRKDWN OF DON; D:BRKDWN OF DETR-SI!!606!900!!! 2!30432!BREAKDOWN OF DOC (MMOL-C/M3/D) !!505!601!!! 2!30432!O:BRKDWN OF DOC; D:BIOGNC SILICA PRD!!606!900!!! 2!30433!FLUX BY CARBONATE PUMP (MMOL-C/M3/D)!!505!601!!! 2!30433!CARBONATE FRMTN+DISSLTN(MMOL-C/M3/D)!!606!900!!! 2!30434!SOURCE OF N BY DETRITAL REFLUX !!505!601!!! 2!30434!S,O:REFLUX DETR-N; D:ORG ST CHG TCO2!!606!900!!! 2!30435!SOURCE OF C BY DETRITAL REFLUX !!505!601!!! 2!30435!S,O:REFLUX DETR-C; D:RT CHG SILICATE!!606!900!!! 2!30436!CHANGE IN N - BIOLOGY (MMOL-N/M3/D) !!505!601!!! 2!30436!RATE CHNG DISSOLVED-N (MMOL-N/M3/D) !!606!900!!! 2!30437!CHANGE IN P - BIOLOGY (MMOL-N/M3/D) !!505!601!!! 2!30437!S,O:RT CHG PHYTO; D:DIATOM RESPIRTN !!606!900!!! 2!30438!CHANGE IN Z - BIOLOGY (MMOL-N/M3/D) !!505!601!!! 2!30438!S,O:RT CHG DETR-N; D:DIATOM MORTALTY!!606!900!!! 2!30439!CHANGE IN DN - BIOLOGY (MMOL-N/M3/D)!!505!601!!! 2!30439!S,O:RT CHG DETR-C; D:DIATM-SI MORTLY!!606!900!!! 2!30440!CHANGE IN DC - BIOLOGY (MMOL-C/M3/D)!!505!601!!! 2!30440!ZOOPLANKTON EXCRETION (MMOL-N/M3/D) !!606!900!!! 2!30441!CHANGE IN DON - BIOLOGY(MMOL-N/M3/D)!!505!601!!! 2!30441!SINKING FLUX OF DETR-N (MMOL-N/M2/D)!!606!900!!! 2!30442!CHANGE IN DOC - BIOLOGY(MMOL-C/M3/D)!!505!601!!! 2!30442!SINKING FLUX OF DETR-C (MMOL-C/M2/D)!!606!900!!! 2!30443!CHANGE IN DIC - BIOLOGY(MMOL-C/M3/D)!!505!601!!! 2!30443!S,O:ORG RT CHG TCO2; D:SNKFLX DET-SI!!606!900!!! 2!30444!CHANGE IN ALK - BIOLOGY !!505!601!!! 2!30444!S:ORG RC ALK; O:RC DON; D:SNKFLX DTM!!606!900!!! 2!30445!CHANGE IN DN BY BIOLOGY(MMOL-N/M3/D)!!505!601!!! 2!30445!O:RT CHG DOC; D:SNK FLX DTM_SI !!606!900!!! 2!30446!CHANGE IN DC BY BIOLOGY(MMOL-C/M3/D)!!505!601!!! 2!30446!S,O:TTL N INPUT; D:UNBOUND IRON CONC!!606!900!!! 2!30447!AMMONIUM UPTAKE BY P(MMOL-N/M3/D) !!505!601!!! 2!30447!AMMONIUM UPTAK BY P,DTM(MMOL-N/M3/D)!!606!900!!! 2!30448!DECAY OF AMMONIUM TO N (MMOL-N/M3/D)!!505!900!!! 2!30449!CHANGE IN AMMON. BY BIOL (MMOL/M3/D)!!505!601!!! 2!30449!F-RATIO (NEW:TOTAL PRIMARY PRODN) !!606!900!!! 2!30450!TRC. CHANGE BY CONVECT (MMOL/M3/D) !!505!900!!! 2!30451!TRC. CHANGE BY MIXED LYR (MMOL/M3/D)!!505!900!!! 2!30452!TRC. CHANGE BY BIOLOGY (MMOL/M3/D) !!505!900!!! 2!30453!TRC. CHANGE BY FILTERING (MMOL/M3/D)!!505!900!!! 2!30454!TRC. CHANGE BY MED. OUT. (MMOL/M3/D)!!505!900!!! 2!30455!TRC. CHANGE BY RELAXATION(MMOL/M3/D)!!505!900!!! 2!30456!TRC. CHANGE BY TIME FILT.(MMOL/M3/D)!!505!900!!! 2!30457!TRC. CHANGE BY ADVECTION (MMOL/M3/D)!!505!900!!! 2!30458!TRC. CHG. BY X ADV THOUGH W FACE !!505!900!!! 2!30459!TRC. CHG. BY Y ADV THOUGH S FACE !!505!900!!! 2!30460!TRC. CHG. BY Z ADV THOU BOTTOM FACE !!505!900!!! 2!30461!TRC. CHANGE BY HORIZ DIFF(MMOL/M3/D)!!505!900!!! 2!30462!TRC. CHANGE BY VERT DIFF(MMOL/M3/D) !!505!900!!! 2!30463!TRC. CHANGE BY VERT ISO DIFFUSION !!505!900!!! 2!30464!TRC. CHG. BY X ISO THROUGH W FACE !!505!900!!! 2!30465!TRC. CHG. BY Y ISO THROUGH S FACE !!505!900!!! 2!30466!TRC. CHANGE BY GM ADV. (MMOL/M3/D) !!505!900!!! 2!30467!TRC. CHG. BY X GM THOUGH W FACE !!505!900!!! 2!30468!TRC. CHG. BY Y GM THOUGH S FACE !!505!900!!! 2!30469!TRC. CHG. BY Z GM THOU BOTTOM FACE !!505!900!!! 2!30470!TRACER CHANGE BY BIOMIX (MMOL/M3/D) !!505!900!!! 2!30471!TRACER CHANGE IN TRACER (MMOL/M3/D) !!505!900!!! 2!31201!HR: RECIP.OF DEPTH AT UV POINTS 1/CM!cm-1!!900!!! 2!31202!CHANGE IN VORTICITY ACROSS TSTEP:ZTD!!!900!!! 2!31211!ZMN VORTY FORCING: ADVECTION S*-2!s-2!401!900!!! 2!31212!ZMN VORTY FORCING: HOR DIFFN S*-2!s-2!401!900!!! 2!31213!ZMN VORTY FORCING: VRT DIFFN S*-2!s-2!401!900!!! 2!31214!ZMN VORTY FORCING: CORIOLIS S*-2!s-2!401!900!!! 2!31215!ZMN VORTY FORCING: PRESSURE S*-2!s-2!401!900!!! 2!31216!INT VORTY FORCING: ADVECTION CM S*-2!cm s-2!401!900!!! 2!31217!INT VORTY FORCING: HOR DIFFN CM S*-2!cm s-2!401!900!!! 2!31218!INT VORTY FORCING: VRT DIFFN CM S*-2!cm s-2!401!900!!! 2!31219!INT VORTY FORCING: CORIOLIS CM S*-2!cm s-2!401!900!!! 2!31220!INT VORTY FORCING: BOTTOM P CM S*-2!cm s-2!404!900!!! 2!31285!RIGID-LID PRESSURE/PA !Pa!502!601!!! 2!31290!INT VORTY FORCING: BOTTOM P CM S*-2!cm s-2!401!403!!! 2!32201!AICE INC. DUE TO DYNAMICS FRACT/TS !s-1!!503!tendency_of_sea_ice_area_fraction_due_to_dynamics!user_delta_t! 2!32201!AICE INC. DUE TO ADVECTION FRACT/TS!!505!900!!! 2!32202!HICE INC. DUE TO DYNAMICS M/TS !m s-1!!503!tendency_of_sea_ice_thickness_due_to_dynamics!user_delta_t! 2!32202!HICE INC. DUE TO ADV (& DIFF) M/TS!!505!900!!! 2!32203!HSNOW INC. DUE TO DYNAMICS M/TS !!!402!!! 2!32203!GBM SNOWDEPTH DYNAMIC INC M/TS!!403!503!!! 2!32203!GBM SNOWDEPTH INC ADVECTION M/TS!!505!900!!! 2!32204!HICE INC. DUE TO DIFFUSION M/TS !!!900!!! 2!32205!INTERNAL ICE PRESSURE (N.M-2) !Pa!!404.1!!! 2!32206!ICE STRENGTH (N.M-2) !Pa!!404.1!!! 2!32207!UICE INC. DUE TO CAV FLUID (M.S-1) !m s-1!!404.1!!! 2!32208!VICE INC. DUE TO CAV FLUID (M.S-1) !m s-1!!404.1!!! 2!32209!U COMP TOTAL SURFACE CURRENT(M.S-1) !m s-1!!404.1!!! 2!32209!U COMPONENT OF ICE VELOCITY (M.S-1) !m s-1!405!900!!! 2!32210!V COMP TOTAL SURFACE CURRENT(M.S-1) !m s-1!!404.1!!! 2!32210!V COMPONENT OF ICE VELOCITY (M.S-1) !m s-1!405!900!!! 2!32211!AICE INC. (THERMODYNAMIC) FRACT/TS !!!900!!! 2!32212!HICE INC. (THERMODYNAMIC) M/TS !!!900!!! 2!32213!HSNOW INC. (THERMODYNAMIC) M/TS !!!402!!! 2!32213!GBM SNOWDEPTH THERMODYNAMIC INC M/TS!!403!900!!! 2!32214!GBM HTN INTO ICE BUDGET W/M**2!W m-2!!900!!! 2!32215!SNOWRATE WHERE ICY KG M**-2 S**-1!kg m-2 s-1!!900!!! 2!32216!OCN TOP-LEVEL TEMPERATURE K!K!!900!!! 2!32217!GBM HTN INTO OCN WHERE ICY W/M**2!W m-2!!900!!! 2!32218!GBM SNOWDEPTH ON SEA-ICE M!m!403!900!!! 2!32219!U CPT OF OCEAN STRESS ON ICE Pa!Pa!405!900!!! 2!32220!V CPT OF OCEAN STRESS ON ICE Pa!Pa!405!900!!! 2!32221!U CPT OF CORIOLIS STRESS ON ICE Pa!Pa!405!900!!! 2!32222!V CPT OF CORIOLIS STRESS ON ICE Pa!Pa!405!900!!! 2!32223!d/dt AICE DYNAMICS s-1!s-1!405!503!!! 2!32223!d/dt AICE ADVECTION s-1!s-1!505!900!!! 2!32224!d/dt HICE DYNAMICS m s-1!m s-1!405!503!!! 2!32224!d/dt HICE ADVECTION(&DIFFUSION) ms-1!m s-1!505!900!!! 2!32225!d/dt GBM SNOWDEPTH DYNAMICS m s-1!m s-1!405!503!!! 2!32225!d/dt GBM SNOWDEPTH ADVECTION m s-1!m s-1!505!900!!! 2!32226!d/dt HICE DIFFUSION m s-1!m s-1!405!900!!! 2!32227!d/dt AICE THERMODYN s-1!s-1!405!900!!! 2!32228!d/dt HICE THERMODYN m s-1!m s-1!405!900!!! 2!32229!d/dt GBM SNOWDEPTH THERMODYN m s-1!m s-1!405!900!!! 2!32230!U CPT OF INTERNAL ICE STRESS Pa!Pa!405!900!!! 2!32231!V CPT OF INTERNAL ICE STRESS Pa!Pa!405!900!!! 2!32232!d/dt AICE RIDGING s-1!s-1!505!900!!! 2!32233!d/dt HICE RIDGING m s-1!m s-1!505!900!!! 2!32234!d/dt GBM SNOWDEPTH RIDGING m s-1!m s-1!505!900!!! 2!32235!GBM CATEGORY SNOWDEPTHS ON SEA-ICE m!m!505!900!!! 2!32236!d/dt CATEGORY AICEN ADVECTION s-1!s-1!505!900!!! 2!32237!d/dt CATEGORY HICEN ADVECTION m s-1!m s-1!505!900!!! 2!32238!d/dt GBM CAT SNOWDEPTH ADVECT ms-1!m s-1!505!900!!! 2!32239!d/dt CATEGORY AICEN RIDGING s-1!s-1!505!900!!! 2!32240!d/dt CATEGORY HICEN RIDGING m s-1!m s-1!505!900!!! 2!32241!d/dt GBM CAT SNOWDEPTH RIDGING m s-1!m s-1!505!900!!! 2!32242!d/dt CATEGORY AICEN THERMODYN s-1!s-1!505!900!!! 2!32243!d/dt CATEGORY HICEN THERMODYN m s-1!m s-1!505!900!!! 2!32244!d/dt GBM CAT SNOWDEPTH THERMDYN ms-1!m s-1!505!900!!! 2!32245!DIVU (FROM EVP,USED IN RIDGING) s-1 !s-1!601!900!!! 2!32246!DELTA (FROM EVP,USED IN RIDGING)s-1 !s-1!601!900!!! 2!32247!d/dt HICE DUE TO WHITE ICE m s-1 !m s-1!601!900!!! 2!32248!d/dt GBM HSNOW WHITE ICE m s-1 !m s-1!601!900!!! 2!32249!d/dt CATEGORY HICEN WHITE ICE m s-1!m s-1!601!900!!! 2!32250!d/dt GBM CAT HSNOWN WHITE ICE m s-1!m s-1!601!900!!! 2!32300!Mass of ice and snow (kg/m2)(tmass) !!505!900!!! 2!32301!Ice Pressure (prss) !!505!900!!! 2!32302!Ice EVP dsig11dx !!505!900!!! 2!32303!Ice EVP dsig12dy !!505!900!!! 2!32304!Ice EVP dsig21dx !!505!900!!! 2!32305!Ice EVP dsig22dy !!505!900!!! 2!32306!Sea Surface Tilt xcpt !!505!900!!! 2!32307!Sea Surface Tilt ycpt !!505!900!!! 2!32308!Sea Surface Tilt Stress xcpt !!505!900!!! 2!32309!Sea Surface Tilt Stress ycpt !!505!900!!! 2!35101!POTENTIAL TEMPERATURE (OCEAN) DEG.C!K @ 273.15!!900!!! 2!35102!SALINITY (OCEAN) (PSU-35)/1000!!!900!!! 2!35121!BAROCLINIC U_VELOCITY (OCEAN) CM/S!cm s-1!!900!!! 2!35122!BAROCLINIC V_VELOCITY (OCEAN) CM/S!cm s-1!!900!!! 2!35130!STREAMFUNCTION (OCEAN) CM3/S!cm3 s-1!!900!!! 2!35134!SURFACE ELEVATION (OCEAN) CM!cm !!900!!! 2!35135!BAROTROPIC U_VELOCITY (OCEAN) CM/S!cm s-1!!900!!! 2!35136!BAROTROPIC V_VELOCITY (OCEAN) CM/S!cm s-1!!900!!! 2!35137!MIXED LAYER DEPTH (OCEAN) M!m!!900!!! 2!35201!OCEAN ASSIM SRFC. HEIGHT WEIGHTS !!!900!!! 2!35202!OCEAN ASSIM MIXED LAYER DEPTH WTS !!!900!!! 2!35203!OCEAN ASSIM SRFC. TEMP. WEIGHTS !!!900!!! 2!35204!OCEAN ASSIM POT. TEMP. WEIGHTS !!!900!!! 2!35205!OCEAN ASSIM SALINE WEIGHTS !!!900!!! 2!35206!OCEAN ASSIM VELOCITY WEIGHTS !!!900!!! 2!35211!OCEAN ASSIM SRFC. HEIGHT INCREMENTS !!401!900!!! 2!35213!OCEAN ASSIM SRFC. TEMP. INCREMENTS !!!900!!! 2!35214!OCEAN ASSIM POT. TEMP. INCREMENTS !!!900!!! 2!35215!OCEAN ASSIM SALINE INCREMENTS !!401!900!!! 2!35221!OCN ASSM MERID VEL. INCS AFTER SHGHT!!401!900!!! 2!35224!OCN ASSM MERID VEL. INCS AFTER THRML!!!900!!! 2!35225!OCN ASSM MERID VEL. INCS AFTER SALIN!!401!900!!! 2!35231!OCN ASSM ZONAL VEL. INCS AFTER SHGHT!!401!900!!! 2!35234!OCN ASSM ZONAL VEL. INCS AFTER THRML!!!900!!! 2!35235!OCN ASSM ZONAL VEL. INCS AFTER SALIN!!401!900!!! 2!35241!OCN ASSM PRESS. INCS AFTER SHGHT ANA!!401!900!!! 2!35244!OCN ASSM PRESS. INCS AFTER THRML ANA!!!900!!! 2!35245!OCN ASSM PRESS. INCS AFTER SALIN ANA!!401!900!!! 2!35251!OCN ASSM PTM INCR AFTER SRF HGT ANAL!!401!900!!! 2!35254!OCN ASSM SAL INCR AFTER SRF HGT ANAL!!401!900!!! 2!35255!OCN ASSM VRT DISP AFTER SRF HGT ANAL!!404!900!!! 2!35281!OCEAN ASSIM ICE CONC. INCREMENTS !!502!900!!! 2!35282!OCEAN ASSIM ICE DEPTH INCREMENTS !!502!900!!! 2!35283!OCEAN ASSIM SNOW DEPTH INCREMENTS !!502!900!!! 2!35284!OCEAN ASSIM (ICE) HEAT INCREMENTS !!502!900!!! 2!35285!OCEAN ASSIM (ICE) SALT INCREMENTS !!502!900!!! 2!35301!OCEAN ASSIM TEMPERATURE ANALYSIS !!505!900!!! 2!35302!OCEAN ASSIM SALINITY ANALYSIS !!505!900!!! 2!35310!OCEAN ASSIM SATSST SST BIAS !!505!900!!! 2!35323!ICE CONCENTRATION ANALYSIS !!502!900!!! 2!41101!CM1: POTENTIAL TEMP. (OCEAN) DEG.C!K @ 273.15!!900!!! 2!41102!CM1: SALINITY (OCEAN) (PSU-35)/1000 !!!900!!! 2!41103!CM1: OCN EXTRACER 1: CON TCO2 !!!900!!! 2!41104!CM1: OCN EXTRACER 2: CON ALKALINITY!!!900!!! 2!41105!CM1: OCN EXTRACER 3: CON NUTRIENT !!!900!!! 2!41106!CM1: OCN EXTRACER 4: CON PHYTOPLNKT!!!900!!! 2!41107!CM1: OCN EXTRACER 5: CON ZOOPLNKTN !!!900!!! 2!41108!CM1: OCN EXTRACER 6: CON DETRITUS !!!900!!! 2!41109!CM1: OCN EXTRACER 7: CON TRITIUM !!!900!!! 2!41110!CM1: OCN EXTRACER 8: CON 3H+3HE !!!900!!! 2!41111!CM1: OCN EXTRACER 9: CON CFC11 !!!900!!! 2!41112!CM1: OCN EXTRACER 10: CON CFC12 !!!900!!! 2!41113!CM1: OCN EXTRACER 11: CON CFC13 !!!900!!! 2!41114!CM1: OCN EXTRACER 12: CON CARBON14 !!!900!!! 2!41115!CM1: OCN EXTRACER 13: CON ------- !!!900!!! 2!41116!CM1: OCN EXTRACER 14: CON ------- !!!900!!! 2!41117!CM1: OCN EXTRACER 15: CON ------- !!!900!!! 2!41118!CM1: OCN EXTRACER 16: CON ------- !!!900!!! 2!41119!CM1: OCN EXTRACER 17: CON ------- !!!900!!! 2!41120!CM1: OCN EXTRACER 18: CON ------- !!!900!!! 2!41121!CM1: BAROCLINIC U_VEL (OCEAN) CM/S !cm s-1!!900!!! 2!41122!CM1: BAROCLINIC V_VEL (OCEAN) CM/S !cm s-1!!900!!! 2!41130!CM1: STREAMFUNCTION (OCEAN) CM3/S !cm3 s-1!!900!!! 2!41131!CM1: STREAMFTN (T-1) (OCEAN) CM3/S !cm3 s-1!!900!!! 2!41132!CM1: STREAMFTN TENDENCY(OC) CM3/S/TS!!!900!!! 2!41133!CM1: STREAMFTN TENDENCY(T-1)(OCEAN) !!!900!!! 2!41134!CM1: SURFACE ELEVATION (OCEAN) CM!cm!!900!!! 2!41135!CM1: BAROTROPIC U_VEL (OCEAN) CM/S !cm s-1!!900!!! 2!41136!CM1: BAROTROPIC V_VEL (OCEAN) CM/S !cm s-1!!900!!! 2!41137!CM1: MIXED LAYER DEPTH (OCEAN) M!m!!900!!! 2!41139!CM1: ISX OCEAN/ICE STRESS(ICE) N/M2!Pa!!900!!! 2!41140!CM1: ISY OCEAN/ICE STRESS(ICE) N/M2!Pa!!900!!! 2!41141!CM1: SNOW DEPTH (OCEAN) M!m!!900!!! 2!41142!CM1: GBM CARYHEAT MISC HEAT FLX(ICE)!!!900!!! 2!41143!CM1: GBM HEAT FLUX:OCEAN TO ICE(OCN)!!!900!!! 2!41144!CM1: RATE OF SAL CHANGE (ICE) PSU/S!!!900!!! 2!41145!CM1: ICY : TRUE IF SOME ICE !!!900!!! 2!41146!CM1: AICE : ICE CONCENTRATION !!!900!!! 2!41147!CM1: HICE : MEAN ICE DEPTH M!m!!900!!! 2!41148!CM1: ICE U_VELOCITY M/S!m s-1!!900!!! 2!41149!CM1: ICE V_VELOCITY M/S!m s-1!!900!!! 2!41150!CM1: TAUX: X_WINDSTRESS N/M2 A!Pa!!900!!! 2!41151!CM1: TAUY: Y_WINDSTRESS N/M2 A!Pa!!900!!! 2!41152!CM1: WME: WIND MIXING EN FLUX W/M2 A!W m-2!!900!!! 2!41153!CM1: SURFACE PRESSURE N/M2 A!Pa!!403!!! 2!41161!CM1: SOL:PEN.SOLAR*LF INTO OC W/M2 A!W m-2!!900!!! 2!41162!CM1: HTN:NONPEN.HT.FLX*LF INTO OCN A!!!900!!! 2!41165!CM1: PLE:PRECIP-EVAP INTO OCEAN A!!!900!!! 2!41166!CM1: RIVER OUTFLOW INTO OCEAN A!!!900!!! 2!41167!CM1: WATER TYPE A!!!900!!! 2!41170!CM1: SOLAR RADIATION OVER ICE W/M2 A!W m-2!!900!!! 2!41171!CM1: SNOWFALL INTO OCEAN/ONTO ICE A!!!900!!! 2!41172!CM1: SUBLIMATION FROM SEAICE A!!!900!!! 2!41180!CM1: REF. SEA SURFACE TEMP. DEG.C A!K @ 273.15!!900!!! 2!41181!CM1: REF. SEA SURFACE SALINITY A!!!900!!! 2!41182!CM1: CLIM. AIR TEMPERATURE DEG.C A!K @ 273.15!!900!!! 2!41183!CM1: CLIMATOLOGICAL ICE DEPTH M A!m!!900!!! 2!41185!CM1: OCEAN HEAT FLUX CORRN. W/M2 A!W m-2!!900!!! 2!41186!CM1: P-E FLUX CORRECTION KG/M2/S A!kg m-2 s-1!!900!!! 2!41187!CM1: S-ICE HT FLUX CORRN: DIABLED !!!900!!! 2!41190!CM1: GBM SEAICE TOPMELT HEAT FLUX A!!!900!!! 2!41191!CM1: GBM SEAICE BOTMELT HEAT FLUX A!!!900!!! 2!42101!CM2: POTENTIAL TEMP. (OCEAN) DEG.C!K @ 273.15!!900!!! 2!42102!CM2: SALINITY (OCEAN) (PSU-35)/1000 !!!900!!! 2!42103!CM2: OCN EXTRACER 1: CON TCO2 !!!900!!! 2!42104!CM2: OCN EXTRACER 2: CON ALKALINITY!!!900!!! 2!42105!CM2: OCN EXTRACER 3: CON NUTRIENT !!!900!!! 2!42106!CM2: OCN EXTRACER 4: CON PHYTOPLNKT!!!900!!! 2!42107!CM2: OCN EXTRACER 5: CON ZOOPLNKTN !!!900!!! 2!42108!CM2: OCN EXTRACER 6: CON DETRIUS !!!900!!! 2!42109!CM2: OCN EXTRACER 7: CON TRITIUM !!!900!!! 2!42110!CM2: OCN EXTRACER 8: CON 3H+3HE !!!900!!! 2!42111!CM2: OCN EXTRACER 9: CON CFC11 !!!900!!! 2!42112!CM2: OCN EXTRACER 10: CON CFC12 !!!900!!! 2!42113!CM2: OCN EXTRACER 11: CON CFC13 !!!900!!! 2!42114!CM2: OCN EXTRACER 12: CON CARBON14 !!!900!!! 2!42115!CM2: OCN EXTRACER 13: CON ------- !!!900!!! 2!42116!CM2: OCN EXTRACER 14: CON ------- !!!900!!! 2!42117!CM2: OCN EXTRACER 15: CON ------- !!!900!!! 2!42118!CM2: OCN EXTRACER 16: CON ------- !!!900!!! 2!42119!CM2: OCN EXTRACER 17: CON ------- !!!900!!! 2!42120!CM2: OCN EXTRACER 18: CON ------- !!!900!!! 2!42121!CM2: BAROCLINIC U_VEL (OCEAN) CM/S !cm s-1!!900!!! 2!42122!CM2: BAROCLINIC V_VEL (OCEAN) CM/S !cm s-1!!900!!! 2!42130!CM2: STREAMFUNCTION (OCEAN) CM3/S !cm3 s-1!!900!!! 2!42131!CM2: STREAMFTN (T-1) (OCEAN) CM3/S !cm3 s-1!!900!!! 2!42132!CM2: STREAMFTN TENDENCY(OC) CM3/S/TS!!!900!!! 2!42133!CM2: STREAMFTN TENDENCY(T-1)(OCEAN) !!!900!!! 2!42134!CM2: SURFACE ELEVATION (OCEAN) CM!cm!!900!!! 2!42135!CM2: BAROTROPIC U_VEL (OCEAN) CM/S !cm s-1!!900!!! 2!42136!CM2: BAROTROPIC V_VEL (OCEAN) CM/S !cm s-2!!900!!! 2!42137!CM2: MIXED LAYER DEPTH (OCEAN) M!m!!900!!! 2!42139!CM2: ISX OCEAN/ICE STRESS(ICE) N/M2!Pa!!900!!! 2!42140!CM2: ISY OCEAN/ICE STRESS(ICE) N/M2!Pa!!900!!! 2!42141!CM2: SNOW DEPTH (OCEAN) M!m!!900!!! 2!42142!CM2: GBM CARYHEAT MISC HEAT FLX(ICE)!!!900!!! 2!42143!CM2: GBM HEAT FLUX:OCEAN TO ICE(OCN)!!!900!!! 2!42144!CM2: RATE OF SAL CHANGE (ICE) PSU/S!!!900!!! 2!42145!CM2: ICY : TRUE IF SOME ICE !!!900!!! 2!42146!CM2: AICE : ICE CONCENTRATION !!!900!!! 2!42147!CM2: HICE : MEAN ICE DEPTH M!m!!900!!! 2!42148!CM2: ICE U_VELOCITY M/S!m s-1!!900!!! 2!42149!CM2: ICE V_VELOCITY M/S!m s-1!!900!!! 2!42150!CM2: TAUX: X_WINDSTRESS N/M2 A!Pa!!900!!! 2!42151!CM2: TAUY: Y_WINDSTRESS N/M2 A!Pa!!900!!! 2!42152!CM2: WME: WIND MIXING EN FLUX W/M2 A!W m-2!!900!!! 2!42153!CM2: SURFACE PRESSURE N/M2 A!Pa!!403!!! 2!42161!CM2: SOL:PEN.SOLAR*LF INTO OC W/M2 A!W m-2!!900!!! 2!42162!CM2: HTN:NONPEN.HT.FLX*LF INTO OCN A!!!900!!! 2!42165!CM2: PLE:PRECIP-EVAP INTO OCEAN A!!!900!!! 2!42166!CM2: RIVER OUTFLOW INTO OCEAN A!!!900!!! 2!42167!CM2: WATER TYPE A!!!900!!! 2!42170!CM2: SOLAR RADIATION OVER ICE W/M2 A!W m-2!!900!!! 2!42171!CM2: SNOWFALL INTO OCEAN/ONTO ICE A!!!900!!! 2!42172!CM2: SUBLIMATION FROM SEAICE A!!!900!!! 2!42180!CM2: REF. SEA SURFACE TEMP. DEG.C A!K @ 273.15!!900!!! 2!42181!CM2: REF. SEA SURFACE SALINITY A!!!900!!! 2!42182!CM2: CLIM. AIR TEMPERATURE DEG.C A!K @ 273.15!!900!!! 2!42183!CM2: CLIMATOLOGICAL ICE DEPTH M A!m!!900!!! 2!42185!CM2: OCEAN HEAT FLUX CORRN. W/M2 A!W m-2!!900!!! 2!42186!CM2: P-E FLUX CORRECTION KG/M2/S A!kg m-2 s-1!!900!!! 2!42187!CM2: S-ICE HT FLUX CORRN. DIABLED !!!900!!! 2!42190!CM2: GBM SEAICE TOPMELT HEAT FLUX A!!!900!!! 2!42191!CM2: GBM SEAICE BOTMELT HEAT FLUX A!!!900!!! 2!43101!CM3: POTENTIAL TEMP. (OCEAN) DEG.C!K @ 273.15!!900!!! 2!43102!CM3: SALINITY (OCEAN) (PSU-35)/1000 !!!900!!! 2!43103!CM3: OCN EXTRACER 1: CON TCO2 !!!900!!! 2!43104!CM3: OCN EXTRACER 2: CON ALKALINITY!!!900!!! 2!43105!CM3: OCN EXTRACER 3: CON NUTRIENT !!!900!!! 2!43106!CM3: OCN EXTRACER 4: CON PHYTOPLNKT!!!900!!! 2!43107!CM3: OCN EXTRACER 5: CON ZOOPLNKTN !!!900!!! 2!43108!CM3: OCN EXTRACER 6: CON DETRITUS !!!900!!! 2!43109!CM3: OCN EXTRACER 7: CON TRITIUM !!!900!!! 2!43110!CM3: OCN EXTRACER 8: CON 3H+3HE !!!900!!! 2!43111!CM3: OCN EXTRACER 9: CON CFC11 !!!900!!! 2!43112!CM3: OCN EXTRACER 10: CON CFC12 !!!900!!! 2!43113!CM3: OCN EXTRACER 11: CON CFC13 !!!900!!! 2!43114!CM3: OCN EXTRACER 12: CON CARBON14 !!!900!!! 2!43115!CM3: OCN EXTRACER 13: CON ------- !!!900!!! 2!43116!CM3: OCN EXTRACER 14: CON ------- !!!900!!! 2!43117!CM3: OCN EXTRACER 15: CON ------- !!!900!!! 2!43118!CM3: OCN EXTRACER 16: CON ------- !!!900!!! 2!43119!CM3: OCN EXTRACER 17: CON ------- !!!900!!! 2!43120!CM3: OCN EXTRACER 18: CON ------- !!!900!!! 2!43121!CM3: BAROCLINIC U_VEL (OCEAN) CM/S !cm s-1!!900!!! 2!43122!CM3: BAROCLINIC V_VEL (OCEAN) CM/S !cm s-1!!900!!! 2!43130!CM3: STREAMFUNCTION (OCEAN) CM3/S !cm3 s-1!!900!!! 2!43131!CM3: STREAMFTN (T-1) (OCEAN) CM3/S !cm3 s-1!!900!!! 2!43132!CM3: STREAMFTN TENDENCY(OC) CM3/S/TS!!!900!!! 2!43133!CM3: STREAMFTN TENDENCY(T-1)(OCEAN) !!!900!!! 2!43134!CM3: SURFACE ELEVATION (OCEAN) CM!cm!!900!!! 2!43135!CM3: BAROTROPIC U_VEL (OCEAN) CM/S !cm s-1!!900!!! 2!43136!CM3: BAROTROPIC V_VEL (OCEAN) CM/S !cm s-1!!900!!! 2!43137!CM3: MIXED LAYER DEPTH (OCEAN) M!m!!900!!! 2!43139!CM3: ISX OCEAN/ICE STRESS(ICE) N/M2!Pa!!900!!! 2!43140!CM3: ISY OCEAN/ICE STRESS(ICE) N/M2!Pa!!900!!! 2!43141!CM3: SNOW DEPTH (OCEAN) M!m!!900!!! 2!43142!CM3: GBM CARYHEAT MISC HEAT FLX(ICE)!!!900!!! 2!43143!CM3: GBM HEAT FLUX:OCEAN TO ICE(OCN)!!!900!!! 2!43144!CM3: RATE OF SAL CHANGE (ICE) PSU/S!!!900!!! 2!43145!CM3: ICY : TRUE IF SOME ICE !!!900!!! 2!43146!CM3: AICE : ICE CONCENTRATION !!!900!!! 2!43147!CM3: HICE : MEAN ICE DEPTH M!m!!900!!! 2!43148!CM3: ICE U_VELOCITY M/S!m s-1!!900!!! 2!43149!CM3: ICE V_VELOCITY M/S!m s-1!!900!!! 2!43150!CM3: TAUX: X_WINDSTRESS N/M2 A!Pa!!900!!! 2!43151!CM3: TAUY: Y_WINDSTRESS N/M2 A!Pa!!900!!! 2!43152!CM3: WME: WIND MIXING EN FLUX W/M2 A!W m-2!!900!!! 2!43153!CM3: SURFACE PRESSURE N/M2 A!Pa!!403!!! 2!43161!CM3: SOL:PEN.SOLAR*LF INTO OC W/M2 A!W m-2!!900!!! 2!43162!CM3: HTN:NONPEN.HT.FLX*LF INTO OCN A!!!900!!! 2!43165!CM3: PLE:PRECIP-EVAP INTO OCEAN A!!!900!!! 2!43166!CM3: RIVER OUTFLOW INTO OCEAN A!!!900!!! 2!43167!CM3: WATER TYPE A!!!900!!! 2!43170!CM3: SOLAR RADIATION OVER ICE W/M2 A!W m-2!!900!!! 2!43171!CM3: SNOWFALL INTO OCEAN/ONTO ICE A!!!900!!! 2!43172!CM3: SUBLIMATION FROM SEAICE A!!!900!!! 2!43180!CM3: REF. SEA SURFACE TEMP. DEG.C A!K @ 273.15!!900!!! 2!43181!CM3: REF. SEA SURFACE SALINITY A!!!900!!! 2!43182!CM3: CLIM. AIR TEMPERATURE DEG.C A!K @ 273.15!!900!!! 2!43183!CM3: CLIMATOLOGICAL ICE DEPTH M A!m!!900!!! 2!43185!CM3: OCEAN HEAT FLUX CORRN. W/M2 A!W m-2!!900!!! 2!43186!CM3: P-E FLUX CORRECTION KG/M2/S A!kg m-2 s-1!!900!!! 2!43187!CM3: S-ICE HT FLUX CORRN. DISABLED !!!900!!! 2!43190!CM3: GBM SEAICE TOPMELT HEAT FLUX A!!!900!!! 2!43191!CM3: GBM SEAICE BOTMELT HEAT FLUX A!!!900!!! 2!44101!CM4: POTENTIAL TEMP. (OCEAN) DEG.C!K @ 273.15!!900!!! 2!44102!CM4: SALINITY (OCEAN) (PSU-35)/1000 !!!900!!! 2!44103!CM4: OCN EXTRACER 1: CON TCO2 !!!900!!! 2!44104!CM4: OCN EXTRACER 2: CON ALKALINITY!!!900!!! 2!44105!CM4: OCN EXTRACER 3: CON NUTRIENT !!!900!!! 2!44106!CM4: OCN EXTRACER 4: CON PHYTOPLNKT!!!900!!! 2!44107!CM4: OCN EXTRACER 5: CON ZOOPLNKTN !!!900!!! 2!44108!CM4: OCN EXTRACER 6: CON DETRITUS !!!900!!! 2!44109!CM4: OCN EXTRACER 7: CON TRITIUM !!!900!!! 2!44110!CM4: OCN EXTRACER 8: CON CFC11 !!!900!!! 2!44111!CM4: OCN EXTRACER 9: CON CFC12 !!!900!!! 2!44112!CM4: OCN EXTRACER 10: CON CFC13 !!!900!!! 2!44113!CM4: OCN EXTRACER 11: CON CARBON14 !!!900!!! 2!44114!CM4: OCN EXTRACER 12: CON ------- !!!900!!! 2!44115!CM4: OCN EXTRACER 13: CON ------- !!!900!!! 2!44116!CM4: OCN EXTRACER 14: CON ------- !!!900!!! 2!44117!CM4: OCN EXTRACER 15: CON ------- !!!900!!! 2!44118!CM4: OCN EXTRACER 16: CON ------- !!!900!!! 2!44119!CM4: OCN EXTRACER 17: CON ------- !!!900!!! 2!44120!CM4: OCN EXTRACER 18: CON ------- !!!900!!! 2!44121!CM4: BAROCLINIC U_VEL (OCEAN) CM/S !cm s-1!!900!!! 2!44122!CM4: BAROCLINIC V_VEL (OCEAN) CM/S !cm s-1!!900!!! 2!44130!CM4: STREAMFUNCTION (OCEAN) CM3/S !cm3 s-1!!900!!! 2!44131!CM4: STREAMFTN (T-1) (OCEAN) CM3/S !cm3 s-1!!900!!! 2!44132!CM4: STREAMFTN TENDENCY(OC) CM3/S/TS!!!900!!! 2!44133!CM4: STREAMFTN TENDENCY(T-1)(OCEAN) !!!900!!! 2!44134!CM4: SURFACE ELEVATION (OCEAN) CM!cm!!900!!! 2!44135!CM4: BAROTROPIC U_VEL (OCEAN) CM/S !cm s-1!!900!!! 2!44136!CM4: BAROTROPIC V_VEL (OCEAN) CM/S !cm s-1!!900!!! 2!44137!CM4: MIXED LAYER DEPTH (OCEAN) M!m!!900!!! 2!44139!CM4: ISX OCEAN/ICE STRESS(ICE) N/M2!Pa!!900!!! 2!44140!CM4: ISY OCEAN/ICE STRESS(ICE) N/M2!Pa!!900!!! 2!44141!CM4: SNOW DEPTH (OCEAN) M!m!!900!!! 2!44142!CM4: GBM CARYHEAT MISC HEAT FLX(ICE)!!!900!!! 2!44143!CM4: GBM HEAT FLUX:OCEAN TO ICE(OCN)!!!900!!! 2!44144!CM4: RATE OF SAL CHANGE (ICE) PSU/S!!!900!!! 2!44145!CM4: ICY : TRUE IF SOME ICE !!!900!!! 2!44146!CM4: AICE : ICE CONCENTRATION !!!900!!! 2!44147!CM4: HICE : MEAN ICE DEPTH M!m!!900!!! 2!44148!CM4: ICE U_VELOCITY M/S!m s-1!!900!!! 2!44149!CM4: ICE V_VELOCITY M/S!m s-1!!900!!! 2!44150!CM4: TAUX: X_WINDSTRESS N/M2 A!Pa!!900!!! 2!44151!CM4: TAUY: Y_WINDSTRESS N/M2 A!Pa!!900!!! 2!44152!CM4: WME: WIND MIXING EN FLUX W/M2 A!W m-2!!900!!! 2!44153!CM4: SURFACE PRESSURE N/M2 A!Pa!!403!!! 2!44161!CM4: SOL:PEN.SOLAR*LF INTO OC W/M2 A!W m-2!!900!!! 2!44162!CM4: HTN:NONPEN.HT.FLX*LF INTO OCN A!!!900!!! 2!44165!CM4: PLE:PRECIP-EVAP INTO OCEAN A!!!900!!! 2!44166!CM4: RIVER OUTFLOW INTO OCEAN A!!!900!!! 2!44167!CM4: WATER TYPE A!!!900!!! 2!44170!CM4: SOLAR RADIATION OVER ICE W/M2 A!W m-2!!900!!! 2!44171!CM4: SNOWFALL INTO OCEAN/ONTO ICE A!!!900!!! 2!44172!CM4: SUBLIMATION FROM SEAICE A!!!900!!! 2!44180!CM4: REF. SEA SURFACE TEMP. DEG.C A!K @ 273.15!!900!!! 2!44181!CM4: REF. SEA SURFACE SALINITY A!!!900!!! 2!44182!CM4: CLIM. AIR TEMPERATURE DEG.C A!K @ 273.15!!900!!! 2!44183!CM4: CLIMATOLOGICAL ICE DEPTH M A!m!!900!!! 2!44185!CM4: OCEAN HEAT FLUX CORRN. W/M2 A!W m-2!!900!!! 2!44186!CM4: P-E FLUX CORRECTION KG/M2/S A!kg m-2 s-1!!900!!! 2!44187!CM4: S-ICE HT FLUX CORRN. DISABLED !!!900!!! 2!44190!CM4: GBM SEAICE TOPMELT HEAT FLUX A!!!900!!! 2!44191!CM4: GBM SEAICE BOTMELT HEAT FLUX A!!!900!!! 3!142!GBM CARYHEAT MISC HEAT FLX(ICE) W/M!!503!707!!! 3!143!GBM HEAT FLUX:OCEAN TO ICE (OCN)!!503!707!!! 3!177!HEAT CONVERGENCE (SLAB MODEL) W/M2 A!W m-2!!707!heat_flux_correction!! 3!178!REF. SEA SURF TEMP (SLAB MODEL) K A!K!!707!!! 3!179!CLIM. SEAICE DEPTH (SLAB MODEL) M A!m!!707!!! 3!210!SLAB TEMPERATURE AFTER TSTEP SLAB C!K @ 273.15!!707!!! 3!211!UICE ICE VELOCITY SLAB M/S!m s-1!!501!!! 3!212!VICE ICE VELOCITY SLAB M/S!m s-1!!501!!! 3!280!SIG11NE ICE INTERNAL STRESS CPT M/S!m s-1!503!707!!! 3!281!SIG11SE ICE INTERNAL STRESS CPT M/S!m s-1!503!707!!! 3!282!SIG11SW ICE INTERNAL STRESS CPT M/S!m s-1!503!707!!! 3!283!SIG11NW ICE INTERNAL STRESS CPT M/S!m s-1!503!707!!! 3!284!SIG12NE ICE INTERNAL STRESS CPT M/S!m s-1!503!707!!! 3!285!SIG12SE ICE INTERNAL STRESS CPT M/S!m s-1!503!707!!! 3!286!SIG12SW ICE INTERNAL STRESS CPT M/S!m s-1!503!707!!! 3!287!SIG12NW ICE INTERNAL STRESS CPT M/S!m s-1!503!707!!! 3!288!SIG22NE ICE INTERNAL STRESS CPT M/S!m s-1!503!707!!! 3!289!SIG22SE ICE INTERNAL STRESS CPT M/S!m s-1!503!707!!! 3!290!SIG22SW ICE INTERNAL STRESS CPT M/S!m s-1!503!707!!! 3!291!SIG22NW ICE INTERNAL STRESS CPT M/S!m s-1!503!707!!! 3!292!U COMPONENT OF ICE VELOCITY (M/S) !m s-1!503!707!!! 3!293!V COMPONENT OF ICE VELOCITY (M/S) !m s-1!503!707!!! 3!21177!CM1: HEAT CONVERGENCE ( SLAB) W/M2 A!W m-2!!501!!! 3!21178!CM1: REF. SEA SURF TEMP ( SLAB) K A!K!!501!!! 3!21179!CM1: CLIM. SEAICE DEPTH ( SLAB) M A!m!!501!!! 3!21225!CM1: SLAB TEMP AFTER TSTEP SLAB C!K @ 273.15!!501!!! 3!21226!CM1: UICE ICE VELOCITY SLAB M/S!m s-1!!501!!! 3!21227!CM1: VICE ICE VELOCITY SLAB M/S!m s-1!!501!!! 3!22177!CM2: HEAT CONVERGENCE (SLAB ) W/M2 A!W m-2!!501!!! 3!22178!CM2: REF. SEA SURF TEMP (SLAB ) K A!K!!501!!! 3!22179!CM2: CLIM. SEAICE DEPTH (SLAB ) M A!m!!501!!! 3!22225!CM2: SLAB TEMP AFTER TSTEP SLAB C!K @ 273.15!!501!!! 3!22226!CM2: UICE ICE VELOCITY SLAB M/S!m s-1!!501!!! 3!22227!CM2: VICE ICE VELOCITY SLAB M/S!m s-1!!501!!! 3!23177!CM3: HEAT CONVERGENCE (SLAB ) W/M2 A!W m-2!!501!!! 3!23178!CM3: REF. SEA SURF TEMP (SLAB ) K A!K!!501!!! 3!23179!CM3: CLIM. SEAICE DEPTH (SLAB ) M A!m!!501!!! 3!23225!CM3: SLAB TEMP AFTER TSTEP SLAB C!K @ 273.15!!501!!! 3!23226!CM3: UICE ICE VELOCITY SLAB M/S!m s-1!!501!!! 3!23227!CM3: VICE ICE VELOCITY SLAB M/S!m s-1!!501!!! 3!24177!CM4: HEAT CONVERGENCE (SLAB ) W/M2 A!W m-2!!501!!! 3!24178!CM4: REF. SEA SURF TEMP (SLAB ) K A!K!!501!!! 3!24179!CM4: CLIM. SEAICE DEPTH (SLAB ) M A!m!!501!!! 3!24225!CM4: SLAB TEMPERATURE SLAB C!K @ 273.15!!501!!! 3!24226!CM4: UICE ICE VELOCITY SLAB M/S!m s-1!!501!!! 3!24227!CM4: VICE ICE VELOCITY SLAB M/S!m s-1!!501!!! 3!40023!SNOW AMOUNT AFTER SLAB KG/M2!kg m-2!!707!!! 3!40024!SURFACE TEMPERATURE AFTER SLAB K!K!!707!!! 3!40031!SEA ICE FRACTION AFTER SLAB !1!!707!!! 3!40032!SEAICE DEPTH(MN OVR ICE)AFTER SLAB M!m!!707!!! 3!40177!HEAT CONVERGENCE AFTER SLAB W/M2 A!W m-2!!707!!! 3!40178!REF. SEA SURF TEMP AFTER SLAB K A!K!!707!!! 3!40179!CLIM. SEAICE DEPTH AFTER SLAB M A!m!!707!!! 3!40201!ANOMALOUS HEAT CONVRGENCE(SLAB) W/M2!W m-2!!707!!! 3!40202!REDISTRIBUTED HEAT CONVERGENCE SLAB !!!707!!! 3!40203!SEAICE DEPTH(GRD BOX MN)AFTER SLAB M!m!!707!!! 3!40204!ICE FRACTION INC. (DYNAMICS) SLAB !!!707!!! 3!40205!ICE DEPTH INC. (DYNAMICS) SLAB !!!707!!! 3!40206!ICE DEPTH INC. (DIFFUSION) SLAB !!!707!!! 3!40207!SNOW DEPTH INC.*AICE (DYNAMICS) SLAB!!!707!!! 3!40208!ICE FRACTION INC. (THERMO) SLAB !!!707!!! 3!40209!ICE DEPTH INC. (THERMO) SLAB !!!707!!! 3!40210!SNOW DEPTH INC.*AICE (THERMO) SLAB !!!707!!! 3!40211!OCEAN TO ICE HEAT FLUX (W.M-2) SLAB !W m-2!!707!!! 3!40212!INTERNAL ICE PRESSURE (N.M-2) SLAB !Pa!!501!!! 3!40213!ICE STRENGTH (N.M-2) SLAB !Pa!!501!!! 3!40214!NET SLAB FLUX THRO LDS (W.M-2) SLAB !W m-2!!707!!! 3!40215!NET ICE FLUX THRO LDS (W.M-2) SLAB !W m-2!!707!!! 3!40216!W X SLABTEMP AT SURFACE AFTER SLAB !!!501!!! 3!40217!W X SLABTEMP AT BASE AFTER SLAB !!!501!!! 3!40218!SLAB HEATING RATE (ADV) K/S SLAB !K s-1!!501!!! 3!40219!SLAB HEATING RATE (DIFF) K/S SLAB !K s-1!!501!!! 3!40220!SLAB CARYHEAT (W M-2) SLAB !W s-2!!707!!! 3!40221!SLAB HEATING RATE (ICE) K/S SLAB !K s-1!!503!!! 3!40222!SNOWFALL INTO SLAB (KG/M2/S) SLAB !kg m-2 s-1!!707!!! 3!40223!SNOWFALL INTO LEADS (KG/M2/S) SLAB !kg m-2 s-1!!707!!! 3!40224!ICE DEPTH INC (ADV) (M/TS) SLAB !!!707!!! 3!40225!SNOW DEPTH INC*AICE (ADV M/TS) SLAB !!!707!!! 3!40226!GRID BOX AREAS (M2) SLAB !m2!!503!!! 3!40230!Mass of ice and snow (kg/m2)(tmass)!!503!707!!! 3!40231!Ice Pressure (prss) !!503!707!!! 3!40232!Ice EVP dsig11dx !!503!707!!! 3!40233!Ice EVP dsig12dy !!503!707!!! 3!40234!Ice EVP dsig21dx !!503!707!!! 3!40235!Ice EVP dsig22dy !!503!707!!! 3!40240!SNOW AMOUNT AFTER SLAB BY CAT. KG/M2!kg m-2!505!707!!! 3!40241!SEA ICE FRACTION AFTER SLAB BY CAT !!505!707!!! 3!40242!SEAICE DEPTH(MN OVR ICE) BY CAT. M!m!505!707!!! 3!40243!SEAICE DEPTH(GRD BOX MN) BY CAT. M!m!505!707!!! 3!40244!d/dt ICE FRACTION by cat. (THERMO) !!505!707!!! 3!40245!d/dt ICE DEPTH by cat. (THERMO) !!505!707!!! 3!40246!d/dt SNOW DEPTH by cat. (THERMO) !!505!707!!! 3!40247!d/dt ICE FRACTION by cat. (DYN) !!505!707!!! 3!40248!d/dt ICE DEPTH by cat. (DYN) !!505!707!!! 3!40249!d/dt SNOW DEPTH by cat. (DYN) !!505!707!!! 3!40250!d/dt ICE FRACTION aggreg. (THERMO) !!505!707!!! 3!40251!d/dt ICE DEPTH aggreg. (THERMO) !!505!707!!! 3!40252!d/dt SNOW DEPTH aggreg. (THERMO) !!505!707!!! 3!40253!d/dt ICE FRACTION aggreg. (DYN) !!505!707!!! 3!40254!d/dt ICE DEPTH aggreg. (DYN) !!505!707!!! 3!40255!d/dt SNOW DEPTH aggreg. (DYN) !!505!707!!! 4!1!WAVE ENERGY SPECTRUM (FIELDS) !!401!707!!! 4!2!LAND/SEA MASK (LOGICAL: LAND=TRUE) !!401!707!!! 4!3!WATER DEPTH !!401!707!!! 4!4!10 METRE WIND U COMPONENT !!401!707!!height=10m! 4!5!10 METRE WIND V COMPONENT !!401!707!!height=10m! 4!6!WAVE DEPENDENT USTAR U COMPONENT !!401!707!!! 4!7!WAVE DEPENDENT USTAR V COMPONENT !!401!707!!! 4!8!SEA ICE FRACTION AFTER TIMESTEP !!401!707!!! 4!9!WAVE INDUCED SURFACE STRESS X COMPT !!401!707!!! 4!10!WAVE INDUCED SURFACE STRESS Y COMPT !!401!707!!! 4!1001!ENERGY INCREMENTS AFTER PROPAGATION !!401!707!!! 4!2001!WAVE DEPENDENT ROUGHNESS LENGTH !!401!707!!! 4!2002!WAVE DEPENDENT USTAR X COMPONENT !!401!707!!! 4!2003!WAVE DEPENDENT USTAR Y COMPONENT !!401!707!!! 4!2004!WAVE INDUCED SURFACE STRESS X COMPT !!401!707!!! 4!2005!WAVE INDUCED SURFACE STRESS Y COMPT !!401!707!!! 4!2006!WAVE INDUCED SURF STRESS HF CONTRIBN!!401!707!!! 4!2007!ENERGY INCRTS AFTER INPUT SRCE TERM !!401!707!!! 4!3001!ENERGY INCRTS AFTER NONLIN TRANSFER !!401!707!!! 4!4001!ENERGY INCRTS AFTER DISSIPATION !!401!707!!! 4!5001!ENERGY INCRTS AFTER BOTTOM FRICTION !!401!707!!! 4!6001!TOTAL WAVE HEIGHT !!401!707!!! 4!6002!TOTAL WAVE UPCROSSING PERIOD !!401!707!!! 4!6003!TOTAL WAVE PRINCIPAL DIRECTION !!401!707!!! 4!6004!TOTAL WAVE PEAK PERIOD !!401!707!!! 4!6005!WINDSEA HEIGHT !!401!707!!! 4!6006!WINDSEA UPCROSSING PERIOD !!401!707!!! 4!6007!WINDSEA PRINCIPAL DIRECTION !!401!707!!! 4!6008!SWELL HEIGHT !!401!707!!! 4!6009!SWELL UPCROSSING PERIOD !!401!707!!! 4!6010!SWELL PRINCIPAL DIRECTION !!401!707!!! 4!6011!SWELL PEAK PERIOD !!401!707!!! 4!6012!WAVETRAIN WAVE-HEIGHT !!401!707!!! 4!6013!WAVETRAIN CROSSING PERIOD !!401!707!!! 4!6014!WAVETRAIN MEAN DIRECTION !!401!707!!! 4!6015!MEAN ENERGY AT A GIVEN FREQUENCY !!401!707!!! 4!6016!MEAN DIRECTION AT A GIVEN FREQUENCY !!401!707!!! 4!6017!10 METRE WIND SPEED !!401!503!!height=10m! 4!6017!WIND SPEED !!505!707!!! 4!6018!10 METRE WIND DIRECTION !!401!503!!height=10m! 4!6018!WIND DIRECTION !!505!707!!! 4!6019!INTEGER LS MASK !!505!707!!! 4!6020!DEPTHS !!505!707!!! 4!6021!WAVE INDUCED STRESS !!505!707!!! 4!6022!CURRENT SPEED !!505!707!!! 4!6023!CURRENT DIRECTION !!505!707!!! 4!6024!SURGE HEIGHT !!505!707!!! 4!6025!TOTAL WAVE MEAN DIRECTION !!505!707!!! 4!6026!TOTAL WAVE MEAN PERIOD !!505!707!!! 4!6027!WINDSEA MEAN DIRECTION !!505!707!!! 4!6028!WINDSEA MEAN PERIOD !!505!707!!! 4!6029!WINDSEA PEAK PERIOD !!505!707!!! 4!6030!SWELL MEAN DIRECTION !!505!707!!! 4!6031!SWELL MEAN PERIOD !!505!707!!! 4!6032!ENERGY IN EACH FREQUENCY (1D SPECT) !!505!707!!! 4!6033!PRINCIPAL DIRECTION OF 1D SPECTRUM !!505!707!!! 4!6034!MEAN DIRECTION OF 1D SPECTRUM !!505!707!!! 4!6035!2D ENERGY SPECTRUM !!505!707!!! 4!7001!ENERGY INCRTS AFTER ASSIMILATION !!401!707!!! 4!7002!ASSIMILATION INCRTS FOR WAVE HEIGHT !!401!707!!! 4!7003!ASSIMILATION INCRTS FOR WINDSPEED !!401!707!!! cf-python-1.3.2/cf/aggregate.py0000644000175000017500000033237612752572326016545 0ustar daviddavid00000000000000from numpy import argsort as numpy_argsort from numpy import dtype as numpy_dtype from numpy import sort as numpy_sort from operator import attrgetter, itemgetter from itertools import izip #from .ancillaryvariables import AncillaryVariables #from .comparison import gt from .coordinate import AuxiliaryCoordinate from .coordinatereference import CoordinateReference from .field import Field, FieldList #from .fieldlist import FieldList from .query import gt from .units import Units from .functions import (flat, RTOL, ATOL, equals, hash_array, allclose) from .functions import inspect as cf_inspect from .data.data import Data from .data.filearray import FileArray _dtype_float = numpy_dtype(float) ## -------------------------------------------------------------------- ## Global properties, as defined in Appendix A of the CF conventions. ## -------------------------------------------------------------------- #_global_properties = set(('comment', # 'Conventions', # 'history', # 'institution', # 'references', # 'source', # 'title', # )) # -------------------------------------------------------------------- # Data variable properties, as defined in Appendix A of the CF # conventions, without those which are not simple. And less # 'long_name'. # -------------------------------------------------------------------- _signature_properties = set(('add_offset', 'calendar', 'cell_methods', '_FillValue', 'flag_masks', 'flag_meanings', 'flag_values', 'missing_value', 'scale_factor', 'standard_error_multiplier', 'standard_name', 'units', 'valid_max', 'valid_min', 'valid_range', )) #_standard_properties = _data_properties.union(_global_properties) _no_units = Units() class _HFLCache(object): ''' A cache for coordinate and cell measure hashes, first and last values and first and last cell bounds ''' def __init__(self): self.hash = {} self.fl = {} self.flb = {} #--- End: def def inspect(self): ''' Inspect the object for debugging. .. seealso:: `cf.inspect` :Returns: None :Examples: >>> f.inspect() ''' print cf_inspect(self) #--- End: def #--- End: class class _Meta(object): ''' A summary of a field. This object contains everything you need to know in order to aggregate the field. ''' # _canonical_units = {} # _canonical_cell_methods = [] def __init__(self, f, rtol=None, atol=None, info=0, relaxed_units=False, allow_no_identity=False, respect_valid=False, equal_all=False, exist_all=False, equal=None, exist=None, ignore=None, dimension=(), relaxed_identities=False, ncvar_identities=False): ''' **initialization** :Parameters: f : cf.Field info : int, optional See the `aggregate` function for details. relaxed_units : bool, optional See the `aggregate` function for details. allow_no_identity : bool, optional See the `aggregate` function for details. rtol : float, optional See the `aggregate` function for details. atol : float, optional See the `aggregate` function for details. dimension : (sequence of) str, optional See the `aggregate` function for details. :Examples: ''' self._nonzero = False self.info = info self.sort_indices = {} self.sort_keys = {} self.cell_values = False self.message = '' strict_identities = not (relaxed_identities or ncvar_identities) self.strict_identities = strict_identities self.ncvar_identities = ncvar_identities # Initialize the flag which indicates whether or not this # field has already been aggregated self.aggregated_field = False # ------------------------------------------------------------ # Field # ------------------------------------------------------------ self.field = f self._hasData = f._hasData self.identity = f.name(identity=strict_identities, ncvar=ncvar_identities) # ------------------------------------------------------------ # # ------------------------------------------------------------ signature_override = getattr(f, 'aggregate', None) if signature_override is not None: self.signature = signature_override self._nonzero = True return if self.identity is None: if not allow_no_identity and self._hasData: if info: self.message = \ "no identity; consider setting relaxed_identities" return elif not self._hasData: if info: self.message = \ "no data array" return #--- End: if domain = f.domain items = domain.items # ------------------------------------------------------------ # Promote selected properties to 1-d, size 1 auxiliary # coordinates # ------------------------------------------------------------ for property in dimension: value = f.getprop(property, None) if value is None: continue aux_coord = AuxiliaryCoordinate(properties={'long_name': property}, attributes={'id': property}, data=Data([value], units=''), copy=False) axis = domain.insert_axis(1) # axis = domain.new_axis_identifier() # print aux_coord, aux_coord.ndim, axis domain.insert_aux(aux_coord, axes=[axis], copy=False) f.delprop(property) ### dch COPY issue? #--- End: for self.units = self.canonical_units(f, self.identity, relaxed_units=relaxed_units) self.cell_methods = self.canonical_cell_methods(rtol=rtol, atol=atol) # ------------------------------------------------------------ # Formula_terms # ------------------------------------------------------------ coordrefs = items(role='r') if not coordrefs: self.coordrefs = () self.coordref_signatures = () else: self.coordrefs = coordrefs.values() self.coordref_signatures = sorted([cr.structural_signature() for cr in self.coordrefs]) for s in self.coordref_signatures: if s[0] is None: if info: self.messsage = \ "%r field can't be aggregated due to it having an unidentifiable coordinate reference" % \ f.name('') return #--- End: if #--- End: if # ------------------------------------------------------------ # Ancillary variables # ------------------------------------------------------------ if not self.set_ancillary_variables(): return # ------------------------------------------------------------ # Coordinate and cell measure arrays # ------------------------------------------------------------ self.hash_values = {} self.first_values = {} self.last_values = {} self.first_bounds = {} self.last_bounds = {} # Map axis canonical identities to their domain identifiers # # For example: {'time': 'dim2'} self.id_to_axis = {} # Map domain axis identifiers to their canonical identities # # For example: {'dim2': 'time'} self.axis_to_id = {} # Dictionaries mapping domain auxiliary coordinate identifiers # to their auxiliary coordiante objects aux_1d = items(role='a', ndim=1) # A set containing the identity of each domain coordinate # # For example: set(['time', 'height', 'latitude', # 'longitude']) self.all_coord_identities = set() self.axis = {} for axis in domain._axes_sizes: # List some information about each 1-d coordinate which # spans this axis. The order of elements is arbitrary, as # ultimately it will get sorted by each element's 'name' # key values. # # For example: [{'name': 'time', 'key': 'dim0', 'units': # }, {'name': 'forecast_ref_time', 'key': # 'aux0', 'units': }] info_dim = [] dim_coord = domain.item(axis) if dim_coord is not None: # ---------------------------------------------------- # 1-d dimension coordinate # ---------------------------------------------------- identity = self.coord_has_identity_and_data(dim_coord) if identity is None: return # Find the canonical units for this dimension # coordinate units = self.canonical_units(dim_coord, identity, relaxed_units=relaxed_units) info_dim.append( {'identity' : identity, 'key' : axis, 'units' : units, 'hasbounds': dim_coord._hasbounds, 'coordrefs': self.find_coordrefs(axis, dim_coord)}) #--- End: if # Find the 1-d auxiliary coordinates which span this axis aux_coords = {} for aux in aux_1d.keys(): if axis in domain.item_axes(aux): #dimensions[aux]: aux_coords[aux] = aux_1d.pop(aux) #--- End: for info_aux = [] for aux, aux_coord in aux_coords.iteritems(): # ---------------------------------------------------- # 1-d auxiliary coordinate # ---------------------------------------------------- identity = self.coord_has_identity_and_data(aux_coord) if identity is None: return # Find the canonical units for this 1-d auxiliary # coordinate units = self.canonical_units(aux_coord, identity, relaxed_units=relaxed_units) info_aux.append( {'identity' : identity, 'key' : aux, 'units' : units, 'hasbounds': aux_coord._hasbounds, 'coordrefs': self.find_coordrefs(aux, aux_coord)}) #--- End: for # Sort the 1-d auxiliary coordinate information info_aux.sort(key=itemgetter('identity')) # Prepend the dimension coordinate information to the # auxiliary coordinate information info_1d_coord = info_dim + info_aux if not info_1d_coord: if info: self.message ="\ axis has no one dimensional or scalar coordinates" #"% field can't be aggregated due to an axis having no 1-d coordinates" % #f.name('')) return #--- End: if # Find the canonical identity for this axis identity = info_1d_coord[0]['identity'] self.axis[identity] = \ {'ids' : tuple([i['identity'] for i in info_1d_coord]), 'keys' : tuple([i['key'] for i in info_1d_coord]), 'units' : tuple([i['units'] for i in info_1d_coord]), 'hasbounds': tuple([i['hasbounds'] for i in info_1d_coord]), 'coordrefs': tuple([i['coordrefs'] for i in info_1d_coord])} if info_dim: self.axis[identity]['dim_coord_index'] = 0 else: self.axis[identity]['dim_coord_index'] = None self.id_to_axis[identity] = axis self.axis_to_id[axis] = identity #--- End: for # Create a sorted list of the axes' canonical identities # # For example: ['latitude', 'longitude', 'time'] self.axis_ids = sorted(self.axis) # ------------------------------------------------------------ # N-d auxiliary coordinates # ------------------------------------------------------------ self.nd_aux = {} for aux, nd_aux_coord in items(role='a', ndim=gt(1)).iteritems(): # Find this N-d auxiliary coordinate's identity identity = self.coord_has_identity_and_data(nd_aux_coord) if identity is None: return # Find the canonical units units = self.canonical_units(nd_aux_coord, identity, relaxed_units=relaxed_units) # Find axes' canonical identities axes = [self.axis_to_id[axis] for axis in domain.item_axes(aux)] axes = tuple(sorted(axes)) self.nd_aux[identity] = { 'key' : aux, 'units' : units, 'axes' : axes, 'hasbounds': nd_aux_coord._hasbounds, 'coordrefs': self.find_coordrefs(aux, nd_aux_coord)} #--- End: for # ------------------------------------------------------------ # Cell measures # ------------------------------------------------------------ self.msr = {} info_msr = {} for key, msr in items(role='m').iteritems(): if not self.cell_measure_has_data_and_units(msr): return # Find the canonical units for this cell measure units = self.canonical_units(msr, msr.name(identity=strict_identities, ncvar=ncvar_identities), relaxed_units=relaxed_units) # Find axes' canonical identities axes = [self.axis_to_id[axis] for axis in domain.item_axes(key)] axes = tuple(sorted(axes)) if units in info_msr: # Check for ambiguous cell measures, i.e. those which # have the same units and span the same axes. for value in info_msr[units]: if axes == value['axes']: if info: self.message = \ "duplicate %r cell measures" % msr.name('') return else: info_msr[units] = [] #--- End: if info_msr[units].append({'key' : key, 'axes': axes}) #--- End: for # For each cell measure's canonical units, sort the # information by axis identities. for units, value in info_msr.iteritems(): value.sort(key=itemgetter('axes')) self.msr[units] = {'keys': tuple([v['key'] for v in value]), 'axes': tuple([v['axes'] for v in value])} #--- End: for # ------------------------------------------------------------ # Properties and attributes # ------------------------------------------------------------ if not (equal or exist or equal_all or exist_all): self.properties = () else: properties = f.properties for p in ignore: properties.pop(p, None) if equal: eq = dict([(p, properties[p]) for p in equal if p in properties]) else: eq = {} if exist: ex = [p for p in exist if p in properties] else: ex = [] eq_all = {} ex_all = [] if equal_all or exist_all: if equal_all: if not equal and not exist: eq_all = properties elif equal and exist: eq_all = dict([(p, properties[p]) for p in properties if p not in ex and p not in eq]) elif equal: eq_all = dict([(p, properties[p]) for p in properties if p not in eq]) elif exist: eq_all = dict([(p, properties[p]) for p in properties if p not in ex]) elif exist_all: if not equal and not exist: ex_all = list(properties) elif equal and exist: ex_all = [p for p in properties if p not in ex and p not in eq] elif equal: ex_all = [p for p in properties if p not in eq] elif exist: ex_all = [p for p in properties if p not in ex] #--- End: if self.properties = tuple(sorted(ex_all + ex + eq_all.items() + eq.items())) #--- End: if # Attributes self.attributes = set(('file',)) # ---------------------------------------------------------------- # Still here? Then create the structural signature. # ---------------------------------------------------------------- self.respect_valid = respect_valid self.structural_signature() # Initialize the flag which indicates whether or not this # field has already been aggregated self.aggregated_field = False self.sort_indices = {} self.sort_keys = {} # Finally, set the object to True self._nonzero = True #--- End: def def __nonzero__(self): ''' x.__nonzero__() <==> bool(x) ''' return self._nonzero #--- End: if def __repr__(self): ''' x.__repr__() <==> repr(x) ''' return '' % (self.__class__.__name__, getattr(self, 'field', None)) #--- End: def def __str__(self): ''' x.__str__() <==> str(x) ''' strings = [] for attr in sorted(self.__dict__): strings.append('%s.%s = %r' % (self.__class__.__name__, attr, getattr(self, attr))) return '\n'.join(strings) #--- End: def def coordinate_values(self): ''' ''' string = ['First cell: '+str(self.first_values)] string.append('Last cell: '+str(self.last_values)) string.append('First bounds: ' +str(self.first_bounds)) string.append('Last bounds: ' +str(self.last_bounds)) return '\n'.join(string) #--- End: def def copy(self): ''' ''' new = _Meta.__new__(_Meta) new.__dict__ = self.__dict__.copy() new.field = new.field.copy() return new def canonical_units(self, variable, identity, relaxed_units=False): ''' Updates the `_canonical_units` attribute. :Parameters: variable : cf.Variable identity : str relaxed_units : bool See the `cf.aggregate` for details. :Returns: out : cf.Units or None :Examples: ''' var_units = variable.Units _canonical_units = self._canonical_units if identity in _canonical_units: if var_units: for u in _canonical_units[identity]: if var_units.equivalent(u): return u #--- End: for # Still here? _canonical_units[identity].append(var_units) elif relaxed_units or variable.dtype.kind == 'S': var_units = _no_units else: if var_units: _canonical_units[identity] = [var_units] elif relaxed_units or variable.dtype.kind == 'S': var_units = _no_units #--- End: if # Still here? return var_units #--- End: def def canonical_cell_methods(self, rtol=None, atol=None): ''' Updates the `_canonical_cell_methods` attribute. :Parameters: atol : float rtol : float :Returns: out : cf.CellMethods or None :Examples: ''' cell_methods = getattr(self.field, 'cell_methods', None) if cell_methods is None: return None _canonical_cell_methods = self._canonical_cell_methods for cm in _canonical_cell_methods: if cell_methods.equivalent(cm, rtol=rtol, atol=atol): return cm #--- End: for # Still here? _canonical_cell_methods.append(cell_methods) return cell_methods #--- End: def def cell_measure_has_data_and_units(self, msr): ''' :Parameters: msr : cf.CellMeasure :Returns: out : bool :Examples: ''' if not msr.Units: if self.info: self.message = \ "%r cell measure has no units" % msr.name('') return if not msr._hasData: if self.info: self.message = \ "%r cell measure has no data" % msr.name('') return return True #--- End: def def coord_has_identity_and_data(self, coord): ''' :Parameters: coord : cf.Coordinate :Returns: out : str or None The coordinate object's identity, or None if there is no identity and/or no data. :Examples: ''' identity = coord.name(identity=self.strict_identities, ncvar=self.ncvar_identities) if identity is None: # Coordinate has no identity, but it may have a recognised # axis. for ctype in ('T', 'X', 'Y', 'Z'): if getattr(coord, ctype): identity = ctype break #--- End: if if identity is not None: all_coord_identities = self.all_coord_identities if identity in all_coord_identities: if self.info: self.message = \ "multiple %r coordinates" % identity return None #--- End: if if coord._hasData or (coord._hasbounds and coord.bounds._hasData): all_coord_identities.add(identity) return identity #--- End: if if self.info: self.message = \ "%r coordinate has no identity or no data" % coord.name('') return None #--- End: def def set_ancillary_variables(self): ''' :Returns: out : dict or None :Examples: ''' f_ancillary_variables = getattr(self.field, 'ancillary_variables', None) if f_ancillary_variables is None: self.ancillary_variables = {} return True ancillary_variables = {} for av in f_ancillary_variables: identity = av.name(identity=self.strict_identities, ncvar=self.ncvar_identities) if identity in ancillary_variables: if self.info: self.message = \ "multiple %r ancillary variables" % av.name('') return None #--- End: if ancillary_variables[identity] = av #--- End: for self.ancillary_variables = ancillary_variables return True #--- End: def def print_info(self, info, signature=True): ''' :Parameters: m : _Meta info : int ''' if info >= 2: if signature: print 'STRUCTURAL SIGNATURE:\n', self.string_structural_signature() if self.cell_values: print 'CANONICAL COORDINATES:\n', self.coordinate_values() if info >= 3: print 'COMPLETE AGGREGATION METADATA:\n', self #--- End: def def string_structural_signature(self): ''' ''' keys = ('Identity', 'Units', 'Cell methods', 'Data', 'Properties', 'standard error multiplier', 'valid_min', 'valid_max', 'valid_range', 'Flags', 'Ancillary variables', 'Coordinate reference systems', '1-d coordinates', 'Dimension coordinates', 'N-d coordinates', 'Cell measures', ) string = [] # d = {} for key, value in zip(keys[:], self.signature[:]): if not (value == () or value is None): string.append('%s: %r' % (key, value)) # return '{'+'\n'.join(string)+'}' return '\n'.join(string) #--- End: def def structural_signature(self): ''' :Returns: out : tuple :Examples: ''' f = self.field # Initialize the structual signature with: # # * the identity # * the canonical units # * the canonical cell methods # * whether or not there is a data array signature = [self.identity, self.units, self.cell_methods, self._hasData] signature_append = signature.append # Properties signature_append(self.properties) # standard_error_multiplier signature_append(f.getprop('standard_error_multiplier', None)) # valid_min, valid_max, valid_range if self.respect_valid: signature.extend((f.getprop('valid_min' , None), f.getprop('valid_max' , None), f.getprop('valid_range', None))) else: signature.extend((None, None, None)) # Flags signature_append(getattr(f, 'Flags', None)) # Add ancillary variables if self.ancillary_variables: signature_append(tuple(sorted(self.ancillary_variables))) else: signature_append(None) # Coordinate references signature_append(tuple(self.coordref_signatures)) # 1-d coordinates for each axis. Note that self.axis_ids has # already been sorted. axis = self.axis x = [(axis[identity]['ids'], axis[identity]['units'], axis[identity]['hasbounds'], axis[identity]['coordrefs']) for identity in self.axis_ids] signature_append(tuple(x)) # Whether or not each axis has a dimension coordinate x = [False if axis[identity]['dim_coord_index'] is None else True for identity in self.axis_ids] signature_append(tuple(x)) # N-d auxiliary coordinates nd_aux = self.nd_aux x = [(identity, nd_aux[identity]['units'], nd_aux[identity]['axes'], nd_aux[identity]['hasbounds'], nd_aux[identity]['coordrefs']) for identity in sorted(nd_aux)] signature_append(tuple(x)) # Cell measures msr = self.msr x = [(units, msr[units]['axes']) for units in sorted(msr)] signature_append(tuple(x)) self.signature = tuple(signature) #--- End: def def find_coordrefs(self, key, coord): ''' :Parameters: key : str The domain identifier of the coordinate object coord : cf.Coordinate :Returns: out : tuple or None :Examples: >>> dim_coord >>> m.find_coordrefs('dim0', dim_coord) >>> aux_coord >>> m.find_coordrefs('aux1', aux_coord) ''' coordrefs = self.coordrefs if not coordrefs: return None # Select the coordinate references which contain a pointer to # this coordinate names = [ref.name for ref in coordrefs if key in ref.coords] if not names: return None return tuple(sorted(names)) #--- End: def #--- End: class def aggregate(fields, info=0, relaxed_units=False, no_overlap=False, contiguous=False, relaxed_identities=False, ncvar_identities=False, respect_valid=False, equal_all=False, exist_all=False, equal=None, exist=None, ignore=None, exclude=False, dimension=(), concatenate=True, copy=True, axes=None, donotchecknonaggregatingaxes=False, allow_no_identity=False, shared_nc_domain=False ): ''' Aggregate fields into as few fields as possible. The aggregation of fields may be thought of as the combination fields into each other to create a new field that occupies a larger domain. Using the CF aggregation rules, input fields are separated into aggregatable groups and each group (which may contain just one field) is then aggregated to a single field. These aggregated fields are returned in a field list. **Identities** In order for aggregation to be possible, fields and their components need to be unambiguously identifiable. By default, these identities are taken from `!standard_name` CF properties or else `!id` attributes. If both of these identifiers are absent then `!long_name` CF properties or else `!ncvar` attributes may be used if the *relaxed_identities* parameter is True. :Parameters: fields : (sequence of) cf.Field or cf.FieldList The field or fields to aggregated. info : int, optional Print information about the aggregation process. If *info* is 0 then no information is displayed. If *info* is 1 or more then display information on which fields are unaggregatable, and why. If *info* is 2 or more then display the structural signatures of the fields and, when there is more than one field with the same structural signature, their canonical first and last coordinate values. If *info* is 3 or more then display the fields' complete aggregation metadata. By default *info* is 0 and no information is displayed. no_overlap : bool, optional If True then require that aggregated fields have adjacent dimension coordinate object cells which do not overlap (but they may share common boundary values). Ignored if the dimension coordinates objects do not have bounds. See the *contiguous* parameter. contiguous : bool, optional If True then require that aggregated fields have adjacent dimension coordinate object cells which partially overlap or share common boundary values. Ignored if the dimension coordinate objects do not have bounds. See the *no_overlap* parameter. relaxed_units : bool, optional If True then assume that fields or domain items (such as coordinate objects) with the same identity (as returned by their `!identity` methods) but missing units all have equivalent but unspecified units, so that aggregation may occur. By default such fields are not aggregatable. allow_no_identity : bool, optional If True then treat fields with data arrays but with no identities (see the above notes) as having equal but unspecified identities, so that aggregation may occur. By default such fields are not aggregatable. relaxed_identities : bool, optional If True then allow fields and their components to be identified by their `!long_name` CF properties or else `!ncvar` attributes if their `!standard_name` CF properties or `!id` attributes are missing. ncvar_identities : bool, optional If True then Force fields and their components (such as coordinates) to be identified by their netCDF file variable names. shared_nc_domain : bool, optional If True then match axes between a field and its contained ancillary variable and coordinate reference fields via their netCDF dimension names and not via their domains. equal_all : bool, optional If True then require that aggregated fields have the same set of non-standard CF properties (including `~cf.Field.long_name`), with the same values. See the *concatenate* parameter. equal_ignore : (sequence of) str, optional Specify CF properties to omit from any properties specified by or implied by the *equal_all* and *equal* parameters. equal : (sequence of) str, optional Specify CF properties for which it is required that aggregated fields all contain the properties, with the same values. See the *concatenate* parameter. exist_all : bool, optional If True then require that aggregated fields have the same set of non-standard CF properties (including, in this case, long_name), but not requiring the values to be the same. See the *concatenate* parameter. exist_ignore : (sequence of) str, optional Specify CF properties to omit from the properties specified by or implied by the *exist_all* and *exist* parameters. exist : (sequence of) str, optional Specify CF properties for which it is required that aggregated fields all contain the properties, but not requiring the values to be the same. See the *concatenate* parameter. respect_valid : bool, optional If True then the CF properties `~cf.Field.valid_min`, `~cf.Field.valid_max` and `~cf.Field.valid_range` are taken into account during aggregation. By default these CF properties are ignored and are not set in the output fields. dimension : (sequence of) str, optional Create new axes for each input field which has one or more of the given properties. For each CF property name specified, if an input field has the property then, prior to aggregation, a new axis is created with an auxiliary coordinate whose datum is the property's value and the property itself is deleted from that field. concatenate : bool, optional If False then a CF property is omitted from an aggregated field if the property has unequal values across constituent fields or is missing from at least one constituent field. By default a CF property in an aggregated field is the concatenated collection of the distinct values from the constituent fields, delimited with the string ``' :AGGREGATED: '``. copy : bool, optional If False then do not copy fields prior to aggregation. Setting this option to False may change input fields in place, and the output fields may not be independent of the inputs. However, if it is known that the input fields are never to accessed again (such as in this case: ``f = cf.aggregate(f)``) then setting *copy* to False can reduce the time taken for aggregation. axes : (sequence of) str, optional Select axes to aggregate over. Aggregation will only occur over as large a subset as possible of these axes. Each axis is identified by the exact identity of a one dimensional coordinate object, as returned by its `!identity` method. Aggregations over more than one axis will occur in the order given. By default, aggregation will be over as many axes as possible. donotchecknonaggregatingaxes : bool, optional If True, and *axes* is set, then checks for consistent data array values will only be made for one dimensional coordinate objects which span the any of the given aggregating axes. This can reduce the time taken for aggregation, but if any those checks would have failed then this clearly allows the possibility of an incorrect result. Therefore, this option should only be used in cases for which it is known that the non-aggregating axes are in fact already entirely consistent. :Returns: out : cf.FieldList The aggregated fields. :Examples: The following six fields comprise eastward wind at two different times and for three different atmospheric heights for each time: >>> f [, , , , , ] >>> g = cf.aggregate(f) >>> g [] >>> g[0].source 'Model A' >>> g = cf.aggregate(f, dimension=('source',)) [] >>> g[0].source AttributeError: 'Field' object has no attribute 'source' ''' # Initialise the cache for coordinate and cell measure hashes, # first and last values and first and last cell bounds hfl_cache = _HFLCache() output_fields = FieldList() output_fields_append = output_fields.append if exclude: exclude = ' NOT' else: exclude = '' atol = ATOL() rtol = RTOL() if axes is not None and isinstance(axes, basestring): axes = (axes,) # Parse parameters strict_identities = not (relaxed_identities or ncvar_identities) if exist_all and equal_all: raise AttributeError("asdasdas jnf0____") if equal or exist or ignore: properties = {'equal' : equal, 'exist' : exist, 'ignore': ignore} for key, value in properties.iteritems(): if not value: continue if isinstance(equal, basestring): # If it is a string then convert to a single element # sequence properties[key] = (value,) else: try: value[0] except TypeError: raise TypeError("Bad type of %r parameter: %r" % (key, type(value))) #--- End: for equal = properties['equal'] exist = properties['exist'] ignore = properties['ignore'] if equal and exist: if set(equal).intersection(exist): raise AttributeError("888888888888888 asdasdas jnf0____") if ignore: ignore = _signature_properties.union(ignore) else: ignore = _signature_properties #--- End: if unaggregatable = False status = 0 # ================================================================ # Group together fields with the same structural signature # ================================================================ signatures = {} for f in flat(fields): # ------------------------------------------------------------ # Create the metadata summary, including the structural # signature # ------------------------------------------------------------ meta = _Meta(f, info=info, rtol=rtol, atol=atol, relaxed_units=relaxed_units, allow_no_identity=allow_no_identity, equal_all=equal_all, exist_all=exist_all, equal=equal, exist=exist, ignore=ignore, dimension=dimension, relaxed_identities=relaxed_identities, ncvar_identities=ncvar_identities, respect_valid=respect_valid) if not meta: unaggregatable = True status = 1 if info: print( "Unaggregatable %r field has%s been output: %s" % (f.name(''), exclude, meta.message)) if not exclude: # This field does not have a structural signature, so # it can't be aggregated. Put it straight into the # output list and move on to the next input field. if not copy: output_fields_append(f) else: output_fields_append(f.copy()) #--- End: if continue #--- End: if # ------------------------------------------------------------ # This field has a structural signature, so append it to the # list of fields with the same structural signature. # ------------------------------------------------------------ signatures.setdefault(meta.signature, []).append(meta) #--- End: for # ================================================================ # Within each group of fields with the same structural signature, # aggregate as many fields as possible. Sort the signatures so # that independent aggregations of the same set of input fields # return fields in the same order. # ================================================================ for signature in sorted(signatures): meta = signatures[signature] if info >= 2: # Print useful information meta[0].print_info(info) print '' #--- End: if if len(meta) == 1: # -------------------------------------------------------- # There's only one field with this signature, so we can # add it straight to the output list and move on to the # next signature. # -------------------------------------------------------- if not copy: output_fields_append(meta[0].field) else: output_fields_append(meta[0].field.copy()) # if info >= 2: # meta[0].print_info(info) # if info: # print( #"%r field can't be aggregated due to a unique structural signature" % #meta[0].field.name('')) continue #--- End: if # ------------------------------------------------------------ # Still here? Then there are 2 or more fields with this # signature which may be aggregatable. These fields need to be # passed through until no more aggregations are possible. With # each pass, the number of fields in the group will reduce by # one for each aggregation that occurs. Each pass represents # an aggregation in another axis. # ------------------------------------------------------------ # ------------------------------------------------------------ # For each axis's 1-d coordinates, create the canonical hash # value and the first and last cell values. # ------------------------------------------------------------ if axes is None: # Aggregation will be over as many axes as possible aggregating_axes = meta[0].axis_ids _create_hash_and_first_values(meta, None, False, hfl_cache) #def _create_hash_and_first_values(meta, axes, donotchecknonaggregatingaxes, # hfl_cache): else: # Specific aggregation axes have been selected aggregating_axes = [] axis_items = meta[0].axis.items() for axis in axes: coord = meta[0].field.coord(axis, exact=True) if coord is None: continue coord_identity = coord.name(identity=strict_identities, ncvar=ncvar_identities) for identity, value in axis_items: if (identity not in aggregating_axes and coord_identity in value['ids']): aggregating_axes.append(identity) break #--- End: for _create_hash_and_first_values(meta, aggregating_axes, donotchecknonaggregatingaxes, hfl_cache) #--- End: if if info >= 2: # Print useful information for m in meta: m.print_info(info, signature=False) print '' #--- End: if # Take a shallow copy in case we abandon and want to output # the original, unaggregated fields. meta0 = meta[:] unaggregatable = False for axis in aggregating_axes: number_of_fields = len(meta) if number_of_fields == 1: break # -------------------------------------------------------- # Separate the fields with the same structural signature # into groups such that either within each group the # fields' domains differ only long the axis or each group # contains only one field. # # Note that the 'a_identity' attribute is set in the # _group_fields function. # -------------------------------------------------------- grouped_meta = _group_fields(meta, axis) if not grouped_meta: if info: print( "Unaggregatable %r fields have%s been output: %s" % (meta[0].field.name(''), exclude, meta[0].message)) unaggregatable = True break #--- End: if if len(grouped_meta) == number_of_fields: if info >= 3: print( "%r fields can't be aggregated along their %r axis" % (meta[0].field.name(''), axis)) continue # -------------------------------------------------------- # Within each group, aggregate as many fields as possible. # -------------------------------------------------------- for m in grouped_meta: if len(m) == 1: continue # ---------------------------------------------------- # Still here? The sort the fields in place by the # canonical first values of their 1-d coordinates for # the aggregating axis. # ---------------------------------------------------- _sorted_by_first_values(m, axis) # ---------------------------------------------------- # Check that the aggregating axis's 1-d coordinates # don't overlap, and don't aggregate anything in this # group if any do. # ---------------------------------------------------- if not _ok_coordinate_arrays(m, axis, no_overlap, contiguous, info): if info: print( "Unaggregatable %r fields have%s been output: %s" % (m[0].field.name(''), exclude, m[0].message)) unaggregatable = True break #--- End: if # ---------------------------------------------------- # Still here? Then pass through the fields # ---------------------------------------------------- m0 = m[0].copy() for m1 in m[1:]: m0 = _aggregate_2_fields(m0, m1, rtol=rtol, atol=atol, respect_valid=respect_valid, contiguous=contiguous, no_overlap=no_overlap, relaxed_units=relaxed_units, info=info, concatenate=concatenate, copy=(copy or not exclude), relaxed_identities=relaxed_identities, ncvar_identities=ncvar_identities, shared_nc_domain=shared_nc_domain) if not m0: # Couldn't aggregate these two fields, so # abandon all aggregations on the fields with # this structural signature, including those # already done. if info: print( "Unaggregatable %r fields have%s been output: %s" % (m1.field.name(''), exclude, m1.message)) unaggregatable = True break #--- End: while m[:] = [m0] #--- End: for if unaggregatable: break # -------------------------------------------------------- # Still here? Then the aggregation along this axis was # completely successful for each sub-group, so reassemble # the aggregated fields as a single list ready for # aggregation along the next axis. # -------------------------------------------------------- meta = [m for gm in grouped_meta for m in gm] #--- End: for # Add fields to the output list if unaggregatable: # info > 0: # print '' status = 1 if not exclude: if copy: output_fields.extend((m.field.copy() for m in meta0)) else: output_fields.extend((m.field for m in meta0)) else: output_fields.extend((m.field for m in meta)) #--- End: for aggregate.status = status if status and info > 0: print '' if len(output_fields) == 1: return output_fields[0] else: return output_fields #--- End: def # -------------------------------------------------------------------- # Initialise the status # -------------------------------------------------------------------- aggregate.status = 0 def _create_hash_and_first_values(meta, axes, donotchecknonaggregatingaxes, hfl_cache): ''' Updates each field's _Meta object. :Parameters: meta : list of _Meta axes : None or list donotchecknonaggregatingaxes : bool :Returns: None ''' for m in meta: domain = m.field.domain domain_dimensions = domain._axes m_sort_keys = m.sort_keys m_sort_indices = m.sort_indices m_hash_values = m.hash_values m_first_values = m.first_values m_last_values = m.last_values m_id_to_axis = m.id_to_axis # -------------------------------------------------------- # Create a hash value for each metadata array # -------------------------------------------------------- # -------------------------------------------------------- # 1-d coordinates # -------------------------------------------------------- for identity in m.axis_ids: # print 'identity=', identity #dch if (axes is not None and donotchecknonaggregatingaxes and identity not in axes): x = [None] * len(m.axis[identity]['keys']) m_hash_values[identity] = x m_first_values[identity] = x[:] m_last_values[identity] = x[:] continue # Still here? m_axis_identity = m.axis[identity] axis = m_id_to_axis[identity] dim_coord = domain.get(axis, None) # Find the sort indices for this axis ... if dim_coord is not None: # ... which has a dimension coordinate m_sort_keys[axis] = axis if not domain.direction(axis): # Axis is decreasing sort_indices = slice(None, None, -1) null_sort = False else: # Axis is increasing sort_indices = slice(None) null_sort = True else: # ... which doesn't have a dimension coordinate but # does have one or more 1-d auxiliary coordinates aux = m_axis_identity['keys'][0] sort_indices = numpy_argsort(domain.get(aux).unsafe_array) m_sort_keys[axis] = aux null_sort = False #-- End: if m_sort_indices[axis] = sort_indices hash_values = [] first_values = [] last_values = [] for key, canonical_units in izip(m_axis_identity['keys'], m_axis_identity['units']): coord = domain.get(key) # print repr(coord) #dch # Get the hash of the data array and its first and # last values h, f, l = _get_hfl(coord, canonical_units, sort_indices, null_sort, True, False, hfl_cache) # print h, f, l #dch first_values.append(f) last_values.append(l) if coord._hasbounds: if coord.isdimension: # Get the hash of the dimension coordinate # bounds data array and its first and last # cell values hb, fb, lb = _get_hfl(coord.bounds, canonical_units, sort_indices, null_sort, False, True, hfl_cache) m.first_bounds[identity] = fb m.last_bounds[identity] = lb else: # Get the hash of the auxiliary coordinate # bounds data array hb = _get_hfl(coord.bounds, canonical_units, sort_indices, null_sort, False, False, hfl_cache) #--- End: if h = (h, hb) #--- End: if hash_values.append(h) ## else: ## coord_units = coord.Units ## ## # Change the coordinate data type if required ## if coord.dtype.char not in ('d', 'S'): ## coord = coord.copy(_only_Data=True) ## coord.dtype = _dtype_float ## ## # Change the coordinate's units to the canonical ones ## coord.Units = canonical_units ## ## # Get the coordinate's data array ## if null_sort: ## array = coord.Data.unsafe_array ## else: ## array = coord.Data.array[sort_indices] ## ## hash_value = hash_array(array) ## ## first_values.append(array.item(0)) #[0]) ## last_values.append(array.item(-1)) #[-1]) ## ## if coord._hasbounds: ## if null_sort: ## array = coord.bounds.Data.unsafe_array ## else: ## array = coord.bounds.Data.array[sort_indices, ...] ## ## hash_value = (hash_value, hash_array(array)) ## ## if key[:3] == 'dim': # can do better than this! DCH ## # Record the bounds of the first and last ## # (sorted) cells of a dimension coordinate ## # (don't need to do this for an auxiliary ## # coordinate). ## array0 = array[0, ...].copy() ## array0.sort() ## m.first_bounds[identity] = array0 ## ## array0 = array[-1, ...].copy() ## array0.sort() ## m.last_bounds[identity] = array0 ## #--- End: if ## ## hash_values.append(hash_value) ## ## # Reinstate the coordinate's original units ## coord.Units = coord_units #--- End: for m_hash_values[identity] = hash_values m_first_values[identity] = first_values m_last_values[identity] = last_values #--- End: for # ------------------------------------------------------------ # N-d auxiliary coordinates # ------------------------------------------------------------ if donotchecknonaggregatingaxes: for aux in m.nd_aux.itervalues(): aux['hash_value'] = None else: for aux in m.nd_aux.itervalues(): key = aux['key'] canonical_units = aux['units'] coord = domain.get(key) axes = [m_id_to_axis[identity] for identity in aux['axes']] domain_axes = domain_dimensions[key] if axes != domain_axes: coord = coord.copy(_only_Data=True) iaxes = [domain_axes.index(axis) for axis in axes] coord.transpose(iaxes, i=True) #--- End: if sort_indices = tuple([m_sort_indices[axis] for axis in axes]) # Get the hash of the data array h = _get_hfl(coord, canonical_units, sort_indices, False, False, False, hfl_cache) if coord._hasbounds: # Get the hash of the bounds data array hb = _get_hfl(coord.bounds, canonical_units, sort_indices, False, False, False, hfl_cache) h = (h, hb) #--- End: if aux['hash_value'] = h ## else: ## coord_units = coord.Units ## ## # Change the coordinate data type if required ## if coord.dtype.char not in ('d', 'S'): ## coord = coord.copy(_only_Data=True) ## coord.dtype = _dtype_float ## copied = True ## else: ## copied = False ## ## # Change the coordinate's units to the canonical ones ## coord.Units = aux['units'] #canonical_units ## ## # Get the coordinate's data array ## array = coord.Data.array[sort_indices] ## ## hash_value = hash_array(array) ## ## if coord._hasbounds: ## sort_indices.append(Ellipsis) ## array = coord.bounds.Data.array[sort_indices] ## hash_value = (hash_value, hash_array(array)) ## ## aux['hash_value'] = hash_value ## ## # Reinstate the coordinate's original units ## coord.Units = coord_units #--- End: for #--- End: if # ------------------------------------------------------------ # Cell measures # ------------------------------------------------------------ if donotchecknonaggregatingaxes: for msr in m.msr.itervalues(): msr['hash_values'] = [None] * len(msr['keys']) else: for canonical_units, msr in m.msr.iteritems(): hash_values = [] for key, axes in izip(msr['keys'], msr['axes']): coord = domain.get(key) axes = [m_id_to_axis[identity] for identity in axes] domain_axes = domain_dimensions[key] if axes != domain_axes: coord = coord.copy(_only_Data=True) iaxes = [domain_axes.index(axis) for axis in axes] coord.transpose(iaxes, i=True) #--- End: if sort_indices = [m_sort_indices[axis] for axis in axes] ## if qwerty: # Get the hash of the data array h = _get_hfl(coord, canonical_units, tuple(sort_indices), False, False, False, hfl_cache) hash_values.append(h) ## else: ## coord_units = coord.Units ## ## # Change the coordinate data type if required ## if coord.dtype.char not in ('d', 'S'): ## coord = coord.copy(_only_Data=True) ## coord.dtype = _dtype_float ## copied = True ## else: ## copied = False ## ## # Change the coordinate's units to the canonical ones ## coord.Units = canonical_units ## ## array = coord.Data.array[tuple(sort_indices)] ## ## hash_values.append(hash_array(array)) ## ## # Reinstate the coordinate's original units ## coord.Units = coord_units #--- End: for msr['hash_values'] = hash_values #--- End: for #--- End: if # m.calculate_hash_values = set() m.cell_values = True #--- End: for #--- End: def def _get_hfl(v, canonical_units, sort_indices, null_sort, first_and_last_values, first_and_last_bounds, hfl_cache): ''' Return the hash value, and optionally first and last values (or cell bounds) ''' create_hash = True create_fl = first_and_last_values create_flb = first_and_last_bounds key = None d = v.Data if d._pmsize == 1: partition = d.partitions.matrix.item() if not partition.part: key = getattr(partition.subarray, 'file_pointer', None) if key is not None: hash_value = hfl_cache.hash.get(key, None) create_hash = hash_value is None if first_and_last_values: first, last = hfl_cache.fl.get(key, (None, None)) create_fl = first is None if first_and_last_bounds: first, last = hfl_cache.flb.get(key, (None, None)) create_flb = first is None #--- End: if if create_hash or create_fl or create_flb: # Change the data type if required if d.dtype.char not in ('d', 'S'): d = d.copy() d.dtype = _dtype_float # Change the units to the canonical ones units = d.Units d.Units = canonical_units # Get the data array if null_sort: array = d.unsafe_array else: array = d.array[sort_indices] # Reinstate the original units d.Units = units if create_hash: # if v.standard_name=='latitude': # print repr(array) # print array.dtype hash_value = hash_array(array) hfl_cache.hash[key] = hash_value if create_fl: first = array.item(0) last = array.item(-1) hfl_cache.fl[key] = (first, last) if create_flb: # Record the bounds of the first and last (sorted) cells first = numpy_sort(array[0, ...]) last = numpy_sort(array[-1, ...]) hfl_cache.flb[key] = (first, last) #--- End: if if first_and_last_values or first_and_last_bounds: return hash_value, first, last else: return hash_value #--- End: def def _group_fields(meta, axis): ''' :Parameters: meta : list of _Meta axis : str The name of the axis to group for aggregation. :Returns: out : list of cf.FieldList ''' axes = meta[0].axis_ids if axes: if axis in axes: # Move axis to the end of the axes list axes = axes[:] axes.remove(axis) axes.append(axis) #--- End: if sort_by_axis_ids = itemgetter(*axes) def _hash_values(m): return sort_by_axis_ids(m.hash_values) meta.sort(key=_hash_values) #--- End: if # Create a new group of potentially aggregatable fields (which # contains the first field in the sorted list) m0 = meta[0] groups_of_fields = [[m0]] hash0 = m0.hash_values for m0, m1 in izip(meta[:-1], meta[1:]): #------------------------------------------------------------- # Count the number of axes which are different between the two # fields # ------------------------------------------------------------- count = 0 hash1 = m1.hash_values for identity, value in hash0.iteritems(): if value != hash1[identity]: count += 1 a_identity = identity #--- End: for hash0 = hash1 if count == 1: # -------------------------------------------------------- # Exactly one axis has different 1-d coordinate values # -------------------------------------------------------- if a_identity != axis: # But it's not the axis that we're trying currently to # aggregate over groups_of_fields.append([m1]) continue # Still here? Then it is the axis that we're trying # currently to aggregate over. ok = True # Check the N-d auxiliary coordinates for identity, aux0 in m0.nd_aux.iteritems(): if (a_identity not in aux0['axes'] and aux0['hash_value'] != m1.nd_aux[identity]['hash_value']): # This matching pair of N-d auxiliary coordinates # does not span the aggregating axis and they have # different data array values ok = False break #--- End: for if not ok: groups_of_fields.append([m1]) continue # Still here? Then check the cell measures msr0 = m0.msr for units in msr0: for axes, hash_value0, hash_value1 in izip( msr0[units]['axes'], msr0[units]['hash_values'], m1.msr[units]['hash_values']): if a_identity not in axes and hash_value0 != hash_value1: # There is a matching pair of cell measures # with these units which does not span the # aggregating axis and they have different # data array values ok = False break #--- End: for if not ok: groups_of_fields.append([m1]) continue # Still here? Then set the identity of the aggregating # axis m0.a_identity = a_identity m1.a_identity = a_identity # Append field1 to this group of potentially aggregatable # fields groups_of_fields[-1].append(m1) elif not count: # -------------------------------------------------------- # Zero axes have different 1-d coordinate values, so don't # aggregate anything in this entire group. # -------------------------------------------------------- meta[0].message = \ "indistinguishable coordinates or other domain information" return () else: # -------------------------------------------------------- # Two or more axes have different 1-d coordinate values, # so create a new sub-group of potentially aggregatable # fields which contains field1. # -------------------------------------------------------- groups_of_fields.append([m1]) #--- End: if #--- End: for return groups_of_fields #--- End: def def _sorted_by_first_values(meta, axis): ''' Sort fields inplace :Parameters: meta : list of _Meta axis : str :Returns: None ''' sort_by_axis_ids = itemgetter(axis) def _first_values(m): return sort_by_axis_ids(m.first_values) #--- End: def meta.sort(key=_first_values) #--- End: def def _ok_coordinate_arrays(meta, axis, no_overlap, contiguous, info): ''' Return True if the aggregating axis's 1-d coordinates are all aggregatable. It is assumed that the input metadata objects have already been sorted by the canonical first values of their 1-d coordinates. :Parameters: meta : list of _Meta axis : str Find the canonical identity of the aggregating axis. no_overlap : bool See the `aggregate` function for details. contiguous : bool See the `aggregate` function for details. NOT : str :Returns: out : bool :Examples: >>> if not _ok_coordinate_arrays(meta, True, False) ... print "Don't aggregate" ''' m = meta[0] dim_coord_index = m.axis[axis]['dim_coord_index'] if dim_coord_index is not None: # ------------------------------------------------------------ # The aggregating axis has a dimension coordinate # ------------------------------------------------------------ # Check for overlapping dimension coordinate cell centres dim_coord_index0 = dim_coord_index for m0, m1 in izip(meta[:-1], meta[1:]): dim_coord_index1 = m1.axis[axis]['dim_coord_index'] if (m0.last_values[axis][dim_coord_index0] >= m1.first_values[axis][dim_coord_index1]): # Found overlap if info: meta[0].message = \ "%r dimension coordinate values overlap (%s >= %s)" % \ (m.axis[axis]['ids'][dim_coord_index], m0.last_values[axis][dim_coord_index0], m1.first_values[axis][dim_coord_index1]) # # #"%r fields can't be aggregated due to their %r dimension coordinate values over#lapping (%s >= %s)" % #(m.field.name(''), # m.axis[axis]['ids'][dim_coord_index], # m0.last_values[axis][dim_coord_index0], # m1.first_values[axis][dim_coord_index1])) return dim_coord_index0 = dim_coord_index1 #--- End: for if axis in m.first_bounds: # -------------------------------------------------------- # The dimension coordinates have bounds # -------------------------------------------------------- if no_overlap: for m0, m1 in izip(meta[:-1], meta[1:]): if (m1.first_bounds[axis][0] < m0.last_bounds[axis][1]): # Do not aggregate anything in this group # because overlapping has been disallowed and # the first cell from field1 overlaps with the # last cell from field0. if info: meta[0].message = \ "%r dimension coordinate bounds values overlap (%s < %s)" % \ (m.axis[axis]['ids'][dim_coord_index], m1.first_bounds[axis][0], m0.last_bounds[axis][1]) # print( #"%r fields can't be aggregated due to their %r dimension coordinate bounds valu#es overlapping (%s < %s)" % #(m.field.name(''), # m.axis[axis]['ids'][dim_coord_index], # m1.first_bounds[axis][0], # m0.last_bounds[axis][1] # )) return #--- End: for else: for m0, m1 in izip(meta[:-1], meta[1:]): m0_last_bounds = m0.last_bounds[axis] m1_first_bounds = m1.first_bounds[axis] if (m1_first_bounds[0] <= m0_last_bounds[0] or m1_first_bounds[1] <= m0_last_bounds[1]): # Do not aggregate anything in this group # because, even though overlapping has been # allowed, the first cell from field1 overlaps # in an unreasonable way with the last cell # from field0. if info: meta[0].message = \ "%r dimension coordinate bounds values overlap by too much (%s <= %s)" % \ (m.axis[axis]['ids'][dim_coord_index], m1_first_bounds[0], m0_last_bounds[0], m1_first_bounds[1], m0_last_bounds[1]) # print( #"%r fields can't be aggregated due to their %r dimension coordinate bounds valu#es overlapping by too much (%s <= %s)" % #(m.field.name(''), # m.axis[axis]['ids'][dim_coord_index], # m1_first_bounds[0], m0_last_bounds[0], # m1_first_bounds[1], m0_last_bounds[1] # )) return #--- End: for #--- End: if if contiguous: for m0, m1 in izip(meta[:-1], meta[1:]): if (m0.last_bounds[axis][1] < m1.first_bounds[axis][0]): # Do not aggregate anything in this group # because contiguous coordinates have been # specified and the first cell from field1 is # not contiguous with the last cell from # field0. if info: meta[0].message = \ "%r dimension coordinate cells are not contiguous (%s < %s)" % \ (m.axis[axis]['ids'][dim_coord_index], m0.last_bounds[axis][1], m1.first_bounds[axis][0]) # print( #"%r fields can't be aggregated due to their %r dimension coordinate cells not b#eing contiguous (%s < %s)" % #(m.field.name(''), # m.axis[axis]['ids'][dim_coord_index], # m0.last_bounds[axis][1], # m1.first_bounds[axis][0] # )) return #--- End: for #--- End: if #--- End: if else: # ------------------------------------------------------------ # The aggregating axis does not have a dimension coordinate, # but it does have at least one 1-d auxiliary coordinate. # ------------------------------------------------------------ # Check for duplicate auxiliary coordinate values for i, identity in enumerate(meta[0].axis[axis]['ids']): set_of_1d_aux_coord_values = set() number_of_1d_aux_coord_values = 0 for m in meta: aux = m.axis[axis]['keys'][i] array = m.field.domain.get(aux).array set_of_1d_aux_coord_values.update(array) number_of_1d_aux_coord_values += array.size if len(set_of_1d_aux_coord_values) != number_of_1d_aux_coord_values: if info: meta[0].message = \ "no %r dimension coordinates and %r auxiliary coordinates have duplicate values" % \ (identity, identity) # print( #"%r fields can't be aggregated due to their %r axes having no dimension coordin#ates and their %r auxiliary coordinates have duplicate values" % #(m.field.name(''), # identity, # identity)) return #--- End: for #--- End: for #--- End: if # ---------------------------------------------------------------- # Still here? Then the aggregating axis does not overlap between # any of the fields. # ---------------------------------------------------------------- return True #--- End: def def _aggregate_2_fields(m0, m1, rtol=None, atol=None, info=0, respect_valid=False, relaxed_units=False, no_overlap=False, contiguous=False, concatenate=True, copy=True, relaxed_identities=False, ncvar_identities=False, shared_nc_domain=False): ''' :Parameters: m0 : _Meta m1 : _Meta contiguous : bool, optional See the `aggregate` function for details. rtol : float, optional See the `aggregate` function for details. atol : float, optional See the `aggregate` function for details. info : int, optional See the `aggregate` function for details. no_overlap : bool, optional See the `aggregate` function for details. relaxed_units : bool, optional See the `aggregate` function for details. relaxed_identities : bool, optional See the `aggregate` function for details. ncvar_identities : bool, optional See the `aggregate` function for details. :Returns: out : _Meta or bool ''' # if copy and not m0.aggregated_field: # m0.field = m0.field.copy() a_identity = m0.a_identity # ---------------------------------------------------------------- # Aggregate coordinate references # ---------------------------------------------------------------- if m0.coordref_signatures: t = _aggregate_coordrefs(m0, m1, axis=a_identity, rtol=rtol, atol=atol, respect_valid=respect_valid, relaxed_units=relaxed_units, no_overlap=no_overlap, info=info, contiguous=contiguous, relaxed_identities=relaxed_identities, ncvar_identities=ncvar_identities, shared_nc_domain=shared_nc_domain) if not t: return else: t = None # ---------------------------------------------------------------- # Aggregate ancillary variables # ---------------------------------------------------------------- if m0.ancillary_variables: av = _aggregate_ancillary_variables(m0, m1, axis=a_identity, rtol=rtol, atol=atol, respect_valid=respect_valid, relaxed_units=relaxed_units, no_overlap=no_overlap, info=info, contiguous=contiguous, relaxed_identities=relaxed_identities, ncvar_identities=ncvar_identities, shared_nc_domain=shared_nc_domain) if not av: return else: av = None # Still here? field0 = m0.field field1 = m1.field if copy: field1 = field1.copy() domain0 = field0.domain domain1 = field1.domain if t: # ------------------------------------------------------------ # Update coordinate references # ------------------------------------------------------------ for key, ref in t.iteritems(): domain0.insert_ref(ref, key=key, copy=False, replace=True) #--- End: if if av: # ------------------------------------------------------------ # Update ancillary variables # ------------------------------------------------------------ field0.ancillary_variables = av # ---------------------------------------------------------------- # Map the axes of field1 to those of field0 # ---------------------------------------------------------------- dim1_name_map = {} for identity in m0.axis_ids: dim1_name_map[m1.id_to_axis[identity]] = m0.id_to_axis[identity] dim0_name_map = {} for axis1, axis0 in dim1_name_map.iteritems(): dim0_name_map[axis0] = axis1 # ---------------------------------------------------------------- # In each field, find the identifier of the aggregating axis. # ---------------------------------------------------------------- adim0 = m0.id_to_axis[a_identity] adim1 = m1.id_to_axis[a_identity] # ---------------------------------------------------------------- # Make sure that, along the aggregating axis, field1 runs in the # same direction as field0 # ---------------------------------------------------------------- direction0 = domain0.direction(adim0) if domain1.direction(adim1) != direction0: field1.flip(adim1, i=True) # ---------------------------------------------------------------- # Find matching pairs of coordinates and cell measures which span # the aggregating axis # ---------------------------------------------------------------- # 1-d coordinates spanning_variables = [(key0, key1, domain0.get(key0), domain1.get(key1)) for key0, key1 in izip(m0.axis[a_identity]['keys'], m1.axis[a_identity]['keys'])] hash_values0 = m0.hash_values[a_identity] hash_values1 = m1.hash_values[a_identity] for i, (hash0, hash1) in enumerate(izip(hash_values0, hash_values1)): try: hash_values0[i].append(hash_values1[i]) except AttributeError: hash_values0[i] = [hash_values0[i], hash_values1[i]] #--- End: for # N-d auxiliary coordinates for identity in m0.nd_aux: aux0 = m0.nd_aux[identity] aux1 = m1.nd_aux[identity] if a_identity in aux0['axes']: key0 = aux0['key'] key1 = aux1['key'] spanning_variables.append((key0, key1, domain0.get(key0), domain1.get(key1))) hash_value0 = aux0['hash_value'] hash_value1 = aux1['hash_value'] try: hash_value0.append(hash_value1) except AttributeError: aux0['hash_value'] = [hash_value0, hash_value1] #--- End: for # Cell measures for units in m0.msr: hash_values0 = m0.msr[units]['hash_values'] hash_values1 = m1.msr[units]['hash_values'] for i, (axes, key0, key1) in enumerate(izip(m0.msr[units]['axes'], m0.msr[units]['keys'], m1.msr[units]['keys'])): if a_identity in axes: spanning_variables.append((key0, key1, domain0.get(key0), domain1.get(key1))) try: hash_values0[i].append(hash_values1[i]) except AttributeError: hash_values0[i] = [hash_values0[i], hash_values1[i]] #--- End: for # ---------------------------------------------------------------- # For each matching pair of coordinates and cell measures which # span the aggregating axis, insert the one from field1 into the # one from field0 # ---------------------------------------------------------------- domain_axes = domain0._axes for key0, key1, item0, item1 in spanning_variables: item_axes0 = domain0.item_axes(key0) item_axes1 = domain1.item_axes(key1) # Ensure that the axis orders are the same in both items iaxes = [item_axes1.index(dim0_name_map[axis0]) for axis0 in item_axes0] item1.transpose(iaxes, i=True) # Find the position of the concatenating axis axis = item_axes0.index(adim0) if direction0: # The fields are increasing along the aggregating axis item0.Data = Data.concatenate((item0.Data, item1.Data), axis, _preserve=False) if item0._hasbounds: item0.bounds.Data = Data.concatenate((item0.bounds.Data, item1.bounds.Data), axis, _preserve=False) else: # The fields are decreasing along the aggregating axis item0.Data = Data.concatenate((item1.Data, item0.Data), axis, _preserve=False) if item0._hasbounds: item0.bounds.Data = Data.concatenate((item1.bounds.Data, item0.bounds.Data), axis, _preserve=False) #--- End: for # ---------------------------------------------------------------- # Insert the data array from field1 into the data array of field0 # ---------------------------------------------------------------- if m0._hasData: data_axes0 = domain0.data_axes() data_axes1 = domain1.data_axes() # Ensure that both data arrays span the same axes, including # the aggregating axis. for axis1 in data_axes1: axis0 = dim1_name_map[axis1] if axis0 not in data_axes0: field0.expand_dims(0, axis0, i=True) data_axes0.append(axis0) for axis0 in data_axes0: axis1 = dim0_name_map[axis0] if axis1 not in data_axes1: field1.expand_dims(0, axis1, i=True) # Find the position of the concatenating axis if adim0 not in data_axes0: # Insert the aggregating axis at position 0 because is not # already spanned by either data arrays field0.expand_dims(0, adim0, i=True) field1.expand_dims(0, adim1, i=True) axis = 0 else: axis = data_axes0.index(adim0) # Ensure that the axis orders are the same in both fields transpose_axes1 = [dim0_name_map[axis0] for axis0 in data_axes0] if transpose_axes1 != data_axes1: field1.transpose(transpose_axes1, i=True) if direction0: # The fields are increasing along the aggregating axis field0.Data = Data.concatenate((field0.Data, field1.Data), axis, _preserve=False) else: # The fields are decreasing along the aggregating axis field0.Data = Data.concatenate((field1.Data, field0.Data), axis, _preserve=False) #--- End: if # Update the size of the aggregating axis in field0 domain0._axes_sizes[adim0] += domain1._axes_sizes[adim1] # Make sure that field0 has a standard_name, if possible. if getattr(field0, 'id', None) is not None: standard_name = field1.getprop('standard_name', None) if standard_name is not None: field0.standard_name = standard_name del field0.id #--- End: if #----------------------------------------------------------------- # Update the properties in field0 #----------------------------------------------------------------- for prop in set(field0._simple_properties()) | set(field1._simple_properties()): value0 = field0.getprop(prop, None) value1 = field1.getprop(prop, None) if prop in ('valid_min', 'valid_max', 'valid_range'): if not m0.respect_valid: try: field0.delprop(prop) except AttributeError: pass #--- End: if continue #--- End: if if prop == '_FillValue' or prop == 'missing_value': continue # Still here? if equals(value0, value1): continue if concatenate: if value1 is not None: if value0 is not None: field0.setprop(prop, '%s :AGGREGATED: %s' % (value0, value1)) else: field0.setprop(prop, ' :AGGREGATED: %s' % value1) else: if value0 is not None: field0.delprop(prop) #--- End: for #----------------------------------------------------------------- # Update the attributes in field0 #----------------------------------------------------------------- for attr in m0.attributes | m1.attributes: value0 = getattr(field0, attr, None) value1 = getattr(field1, attr, None) if equals(value0, value1): continue if concatenate: if value1 is not None: if value0 is not None: setattr(field0, attr, '%s :AGGREGATED: %s' % (value0, value1)) else: setattr(field0, attr, ' :AGGREGATED: %s' % value1) else: m0.attributes.discard(attr) if value0 is not None: delattr(field0, attr) #--- End: for # Note that the field in this _Meta object has already been # aggregated m0.aggregated_field = True # ---------------------------------------------------------------- # Return the _Meta object containing the aggregated field # ---------------------------------------------------------------- return m0 #--- End: def def _aggregate_coordrefs(m0, m1, axis=None, rtol=None, atol=None, respect_valid=False, relaxed_units=False, no_overlap=False, info=0, contiguous=False, relaxed_identities=False, ncvar_identities=False, shared_nc_domain=False): ''' Aggregate fields in coordinate references. :Parameters: m0 : _Meta m1 : _Meta no_overlap : bool, optional See the `aggregate` function for details. contiguous : bool, optional See the `aggregate` function for details. rtol : float, optional See the `aggregate` function for details. atol : float, optional See the `aggregate` function for details. info : int, optional See the `aggregate` function for details. relaxed_units : bool, optional See the `aggregate` function for details. :Returns: out : dict ''' # axis = m0.a_identity field0 = m0.field field1 = m1.field out = {} for signature in m0.coordref_signatures: name = signature[0] key, coordref0 = field0.refs(name, exact=True).popitem() coordref1 = field1.ref(name, exact=True) # Initialize the new coordinate reference new_coordref = CoordinateReference(name=name) for term in set(coordref0).union(coordref1): value0 = coordref0.get(term, None) value1 = coordref1.get(term, None) if value1 is None and value0 is None: # ---------------------------------------------------- # Both terms are undefined # ---------------------------------------------------- continue if value1 is None: t, u, m, value = coordref0, coordref1, m0, value0 elif value0 is None: t, u, m, value = coordref1, coordref0, m1, value1 else: t = None if t is not None: # ---------------------------------------------------- # Exactly one term is undefined # ---------------------------------------------------- if term in t.coord_terms: # Term is a coordinate value = m.field.item(t[term], exact=True) if value is None: continue #--- End: if default = t.default_value(term) if default is None: if info: m1.message = \ "%r %s %r parameter has no default value" % (name, t.type, term) return if isinstance(value, Field): x = _Meta(value, info=info, relaxed_units=relaxed_units, allow_no_identity=True, relaxed_identities=relaxed_identities, ncvar_identities=ncvar_identities, respect_valid=respect_valid) if not x: if info: m1.message = \ "%r %s %r parameter is a field with no structural signature" % \ (name, t.type, term) return #--- End: if if not allclose(value, default, rtol=rtol, atol=atol): if info: m1.message = \ "%r %s %r parameters have non-equivalent values" % (name, t.type, term) return # Update the new coordinate reference if term in t.coord_terms: new_coordref.setcoord(term, t[term]) else: new_coordref[term] = value continue else: t = coordref0 #--- End: if coord0 = term in coordref0.coord_terms coord1 = term in coordref1.coord_terms if coord0 and coord1: # ---------------------------------------------------- # Both terms are coordinates # ---------------------------------------------------- coord0 = field0.item(value0, exact=True) coord1 = field1.item(value1, exact=True) coord0_name = coord0.name(identity=m0.strict_identities, ncvar=m0.ncvar_identities) coord1_name = coord1.name(identity=m1.strict_identities, ncvar=m1.ncvar_identities) if (coord0 is None or coord1 is None or coord0_name != coord1_name): if info: m1.message = \ "%r %s %r parameters are unaggregatable coordinates" % \ (name, t.type, term) return # Update the new coordinate reference new_coordref.setcoord(term, value0) continue if coord0 or coord1: # ---------------------------------------------------- # Exactly one term is a coordinate # ---------------------------------------------------- if info: m1.message = \ "%r %s %r parameters are not all coordinates" % (name, t.type, term) return is_field0 = isinstance(value0, Field) is_field1 = isinstance(value1, Field) if not is_field0 and not is_field1: # ---------------------------------------------------- # Neither term is a field # ---------------------------------------------------- if not allclose(value0, value1, rtol=rtol, atol=atol): # The values are not equivalent if info: m1.message = \ "%r %s %r parameters have non-equivalent values" % (name, t.type, term) return # Update the new coordinate reference new_coordref[term] = value0 continue if is_field0 != is_field1: # ---------------------------------------------------- # Exactly one term is a field # ---------------------------------------------------- if info: m1.message = \ "%r %s %r parameters are not all fields" % (name, t.type, term) return # -------------------------------------------------------- # Both terms are fields # -------------------------------------------------------- if shared_nc_domain: role = '%r %s %r' % (name, t.type, term) value0, message0 = _share_nc_domain(value0, field0, role) if message0: if info: m0.message = message0 return #--- End: if value1, message1 = _share_nc_domain(value1, field1, role) if message1: if info: m1.message = message1 return #--- End: if #--- End: if x0 = _Meta(value0, info=info, relaxed_units=relaxed_units, allow_no_identity=True, relaxed_identities=relaxed_identities, ncvar_identities=ncvar_identities, respect_valid=respect_valid) x1 = _Meta(value1, info=info, relaxed_units=relaxed_units, allow_no_identity=True, relaxed_identities=relaxed_identities, ncvar_identities=ncvar_identities, respect_valid=respect_valid) if not (x0 and x1): # At least one field doesn't have a structual # signature if info: m1.message = \ "%r %s %r parameter is a field with no structural signature" % \ (name, t.type, term) return #--- End: if if axis not in x0.axis and axis not in x1.axis: # Neither field spans the aggregating axis ... if value0.equivalent_data(value1, rtol=rtol, atol=atol): # ... and the fields have equivalent data # arrays. Therefore we don't need to do any # aggregation. # Update the new coordinate reference new_coordref[term] = value0 continue else: # ... and the fields do not have equivalent data if info: m1.message = \ "%r %s %r parameters are fields with non-equivalent values" % \ (name, t.type, term) return #--- End: if if not (axis in x0.axis and axis in x1.axis): # Only one of the fields spans the aggregating axis if info: m1.message = \ "%r %s %r parameters are unaggregatable fields" % (name, t.type, term) # print( #"%r fields can't be aggregated due to their %r %s %r parameters being fields wh#ich are not aggregatable" % #(field0.name(''), name, t.type, term)) return #--- End: if # Both fields span the aggregating axis, so try to # aggregate them. new_value = aggregate((value0, value1), info=info, no_overlap=no_overlap, contiguous=contiguous, respect_valid=respect_valid, relaxed_units=relaxed_units, allow_no_identity=True, axes=axis, relaxed_identities=relaxed_identities, ncvar_identities=ncvar_identities) if len(new_value) == 2: # Couldn't aggregate them (because we got two fields # back instead of one) if info: m1.message = \ "%r %s %r parameters are unaggregatable fields" % (name, t.type, term) # print( #"%r fields can't be aggregated due to their %r %s %r parameters being fields wh#ich are not aggregatable" % #(field0.name(''), name, t.type, term)) return #--- End: if # Successfully aggregated the coordinate reference fields coordref0[term] = new_value[0] # DCH: Why????????? # Update the new coordinate reference new_coordref[term] = new_value[0] #---End: for out[key] = new_coordref #---End: for return out #--- End: def def _aggregate_ancillary_variables(m0, m1, axis=None, rtol=None, atol=None, respect_valid=False, relaxed_units=False, no_overlap=False, info=0, contiguous=False, relaxed_identities=False, ncvar_identities=False, shared_nc_domain=False): ''' Aggregate the ancillary variable fields. :Parameters: m0 : _Meta m1 : _Meta no_overlap : bool, optional See the `aggregate` function for details. contiguous : bool, optional See the `aggregate` function for details. rtol : float, optional See the `aggregate` function for details. atol : float, optional See the `aggregate` function for details. info : int, optional See the `aggregate` function for details. relaxed_units : bool, optional See the `aggregate` function for details. relaxed_identities : bool, optional See the `aggregate` function for details. ncvar_identities : bool, optional See the `aggregate` function for details. :Returns: out : cf.FieldList or bool ''' field0 = m0.field field1 = m1.field ancillary_variables = m0.ancillary_variables # new_ancillary_variables = AncillaryVariables() new_ancillary_variables = FieldList() for identity, ancil0 in ancillary_variables.iteritems(): ancil1 = m1.ancillary_variables[identity] if shared_nc_domain: ancil0, message0 = _share_nc_domain(ancil0, field0, 'ancillary variable') if message0: if info: m0.message = message0 return #--- End: if ancil1, message1 = _share_nc_domain(ancil1, field1, 'ancillary variable') if message1: if info: m1.message = message1 return #--- End: if #--- End: if x0 = _Meta(ancil0, info=info, relaxed_units=relaxed_units, allow_no_identity=False, relaxed_identities=relaxed_identities, ncvar_identities=ncvar_identities, respect_valid=respect_valid) x1 = _Meta(ancil1, info=info, relaxed_units=relaxed_units, allow_no_identity=False, relaxed_identities=relaxed_identities, ncvar_identities=ncvar_identities, respect_valid=respect_valid) if not (x0 and x1): # At least one field doesn't have a structual signature if info: m1.message = \ "%r ancillary variable is a field with no structural signature" % \ ancil0.name('') return #--- End: if if axis not in x0.axis and axis not in x1.axis: # Neither field spans the aggregating axis ... if ancil0.equivalent_data(ancil1, rtol=rtol, atol=atol, traceback=False): # ... and the fields are equivalent new_ancillary_variables.append(ancil0) continue else: # ... and the fields are not equivalent if info: m1.message = \ "2 %r ancillary variable fields have non-equivalent values" % ancil0.name('') return #--- End: if # Still here? if not (axis in x0.axis and axis in x1.axis): if info: m1.message = \ "3 %r ancillary variable fields are unaggregatable" % ancil0.name('') return #--- End: if # Both fields span the aggregating axis if (ancil0.axis_size(axis, exact=True) == 1 and ancil1.axis_size(axis, exact=True) == 1 and field0.axis_size(axis, exact=True) > 1 or field1.axis_size(axis, exact=True) > 1): # The aggregating axis has size 1 in both ancillary fields # and size > 1 in at least one parent field if ancil0.equivalent(ancil1, rtol=rtol, atol=atol): ancillary_variables[identity] = ancil0 ### WHY?? new_ancillary_variables.append(ancil0) continue #--- End: if # Still here? Then try to aggregate the ancillary fields. new_value = aggregate((ancil0, ancil1), info=info, no_overlap=no_overlap, contiguous=contiguous, respect_valid=respect_valid, relaxed_units=relaxed_units, allow_no_identity=True, axes=axis, relaxed_identities=relaxed_identities, ncvar_identities=ncvar_identities) if len(new_value) == 2: # We got two fields back instead of one, therefore they # couldn't be aggregated. if info: m1.message = \ "4 %r ancillary variable fields are unaggregatable" % ancil0.name('') return #--- End: if # Update the m0.ancillary_variable dictionary, because it # needs to contain the aggregated field. ancillary_variables[identity] = new_value[0] new_ancillary_variables.append(new_value[0]) #---End: for return new_ancillary_variables #--- End: def def _share_nc_domain(child, field, role): ''' perhaps this should be `cf.Field.share_nc_domain`, as it may be useful in general. ''' child_axis_to_ncdim = getattr(child.domain, 'nc_dimensions', {}) if len(set(child_axis_to_ncdim.values())) != len(child_axis_to_ncdim): message = \ "%s %s field can't share domain with its parent field (ambiguous netCDF dimension names)" % \ (role, child.name('')) return None, message #--- End: if field_axis_to_ncdim = getattr(field.domain, 'nc_dimensions', {}) n_axes = len(field_axis_to_ncdim) field_ncdim_to_axis = dict([(v, k) for k, v in field_axis_to_ncdim.iteritems()]) if len(field_ncdim_to_axis) != n_axes: message = \ "%s %s field can't share domain with its parent field (ambiguous netCDF dimension names)" % \ (role, child.name('')) return None, message #--- End: if # Remove all items from the childlary field new_child = child.copy() new_child.remove_items() for c_axis in child.data_axes(): # Find the parent field axis (f_axis) which correposnds to the # child field axis (c_axis) c_ncdim = child_axis_to_ncdim.get(c_axis, None) f_axis = field_ncdim_to_axis.get(c_ncdim, None) if f_axis is None: message = \ "%s %s field can't share domain with its parent field (axis has no netCDF dimension name)" % \ (role, child.name('')) return None, message #--- End: if # Copy 1-d dimension and auxiliary coordinates from the parent # field to the child field for coord in field.coords(axes=f_axis, ndim=1).itervalues(): if coord.isdimension: new_child.insert_dim(coord, axis=c_axis) else: new_child.insert_aux(coord, axes=(c_axis,)) #--- End: for #--- End: for return new_child, None #--- End: def cf-python-1.3.2/cf/netcdf/0000755000175000017500000000000012770523315015464 5ustar daviddavid00000000000000cf-python-1.3.2/cf/netcdf/__init__.py0000600000175000017500000000000012603546021017545 0ustar daviddavid00000000000000cf-python-1.3.2/cf/netcdf/read.py0000644000175000017500000012437712764320014016761 0ustar daviddavid00000000000000import re from netCDF4 import Dataset as netCDF4_Dataset from operator import mul from json import loads as json_loads from ast import literal_eval as ast_literal_eval from struct import unpack as struct_unpack from struct import error as struct_error from numpy import dtype as numpy_dtype from numpy import result_type as numpy_result_type from ..coordinate import DimensionCoordinate, AuxiliaryCoordinate from ..coordinatebounds import CoordinateBounds from ..cellmeasure import CellMeasure from ..coordinatereference import CoordinateReference from ..field import Field, FieldList from ..cellmethods import CellMethods from ..units import Units from ..functions import abspath, dirname, pathjoin from ..data.data import Data from .functions import _open_netcdf_file from .filearray import NetCDFFileArray def read(filename, fmt=None, promote=(), verbose=False): ''' Read fields from an input netCDF file on disk or from an OPeNDAP server location. The file may be big or little endian. NetCDF dimension names are stored in the `nc_dimensions` attribute of a field's domain and netCDF variable names are stored in the `ncvar` attributes of the field and its domain components (coordinates, coordinate bounds, cell measures and coordinate referencess). :Parameters: filename : str or file A string giving the file name or OPenDAP URL, or an open file object, from which to read fields. Note that if a file object is given it will be closed and reopened. fmt : str, optional Only read the file if it is the given format. Valid formats are ``'NETCDF'`` for a CF-netCDF file and ``'CFA'`` for CFA-netCDF file. By default a file of any of these formats is read. promote : sequence of str, optional verbose : bool, optional If True then print information to stdout. :Returns: out : FieldList The fields in the file. :Examples: >>> f = cf.netcdf.read('file.nc') >>> type(f) >>> f [, , , ] >>> cf.netcdf.read('file.nc')[0:2] [, ] >>> cf.netcdf.read('file.nc', units='K') [, ] >>> cf.netcdf.read('file.nc')[0] ''' if isinstance(filename, file): name = filename.name filename.close() filename = name #--- End: if # ---------------------------------------------------------------- # Parse promote # ---------------------------------------------------------------- try: iter(promote) except TypeError: raise ValueError( "Can't read: Bad parameter value: promote=%r" % promote) if 'all' in promote: promote = set(('reference', 'ancillary', 'dimension', 'auxiliary', 'measure')) else: if 'field' in promote: promote = set(promote).union(('reference', 'ancillary')) if 'coordinate' in promote: promote = set(promote).union(('dimension', 'auxiliary')) top_level = set() filename = abspath(filename) # Read the netCDF file nc = _open_netcdf_file(filename, 'r') # Set of all of the netCDF variable names in the file. # # For example: # >>> variables # set(['lon','lat','tas']) variables = set(map(str, nc.variables)) # ---------------------------------------------------------------- # Put the file's global attributes into the global # 'global_attributes' dictionary # ---------------------------------------------------------------- global_attributes = {} for attr in map(str, nc.ncattrs()): try: value = nc.getncattr(attr) if isinstance(value, basestring): try: global_attributes[attr] = str(value) except UnicodeEncodeError: global_attributes[attr] = value.encode(errors='ignore') else: global_attributes[attr] = value except UnicodeDecodeError: pass #--- End: for # Find out if this is a CFA file cfa = 'CFA' in global_attributes.get('Conventions', []) if (fmt and (not cfa and fmt == 'CFA') or (cfa and fmt == 'NETCDF')): # Return an empty field list return FieldList() # ---------------------------------------------------------------- # Create a dictionary keyed by nc variable names where each key's # value is a dictionary of that variable's nc # attributes. E.g. attributes['tas']['units']='K' # ---------------------------------------------------------------- attributes = {} for ncvar in variables: attributes[ncvar] = {} for attr in map(str, nc.variables[ncvar].ncattrs()): try: attributes[ncvar][attr] = nc.variables[ncvar].getncattr(attr) if isinstance(attributes[ncvar][attr], basestring): try: attributes[ncvar][attr] = str(attributes[ncvar][attr]) except UnicodeEncodeError: attributes[ncvar][attr] = attributes[ncvar][attr].encode(errors='ignore') except UnicodeDecodeError: pass #--- End: for # Check for bad units try: Units(attributes[ncvar].get('units', None), attributes[ncvar].get('calendar', None)) except (ValueError, TypeError): # Units in file have been set to unknown units so 1) give # a warning, 2) set the 'nonCF_units' property to the bad # units and 3) remove the offending units. attributes[ncvar]['nonCF_Units'] = \ attributes[ncvar].pop('units', '') attributes[ncvar]['nonCF_Units'] += \ ' '+attributes[ncvar].pop('calendar', '') if verbose: print( "WARNING: Moving unsupported units to 'nonCF_Units': %s" % attributes[ncvar]['nonCF_Units']) #--- End: for # ---------------------------------------------------------------- # Remove everything bar data variables from the list of # variables. I.e. remove dimension and auxiliary coordinates, # their bounds and grid_mapping variables # ---------------------------------------------------------------- nc_dimensions = map(str, nc.dimensions) for ncvar in variables.copy(): # Remove dimension coordinates and their bounds if ncvar in nc_dimensions: if ncvar in variables: if 'dimension' in promote: # Add the dimension coordinate to the set of # top-level fields, so that it doesn't get demoted # if the auxiliary coordinate is also in a # coordinate reference. top_level.add(ncvar) else: # Do not promote an auxiliary coordinate to also # appear as a top-level field variables.discard(ncvar) # variables.discard(ncvar) for attr in ('bounds', 'climatology'): if attr not in attributes[ncvar]: continue # Check the dimensionality of the coordinate's # bounds. If it is not right, then it can't be a # bounds variable and so promote to an independent # data variable bounds = attributes[ncvar][attr] if bounds in nc.variables: if nc.variables[bounds].ndim == nc.variables[ncvar].ndim+1: variables.discard(bounds) else: del attributes[ncvar][attr] break else: del attributes[ncvar][attr] if verbose: print( "WARNING: Missing bounds variable '%(bounds)s' in %(filename)s" % locals()) #--- End: for #--- End: if continue #--- End: if # Still here? Then remove auxiliary coordinates (unless they # have been promoted) and their bounds. if 'coordinates' in attributes[ncvar]: # Allow for (incorrect) comma separated lists for aux in re.split('\s+|\s*,\s*', attributes[ncvar]['coordinates']): if aux in variables: if 'auxiliary' in promote: # Add the auxiliary coordinate to the set of # top-level fields, so that it doesn't get # demoted if the auxiliary coordinate is also # in a coordinate reference. top_level.add(aux) else: # Do not promote an auxiliary coordinate to # also appear as a top-level field variables.discard(aux) for attr in ('bounds', 'climatology'): if attr not in attributes[aux]: continue # Check the dimensionality of the coordinate's # bounds. If it is not right, then it can't be # a bounds variable and so promote to an # independent data variable. bounds = attributes[aux][attr] if bounds in nc.variables: if nc.variables[bounds].ndim == nc.variables[aux].ndim+1: variables.discard(bounds) else: del attributes[aux][attr] break else: del attributes[aux][attr] if verbose: print( "WARNING: Missing bounds variable '%(bounds)s' in %(filename)s" % locals()) #--- End: for #--- End: if #--- End: for #--- End: if # Remove grid mapping variables if 'grid_mapping' in attributes[ncvar]: variables.discard(attributes[ncvar]['grid_mapping']) # Remove cell measure variables (unless they have been promoted). if 'measure' not in promote and 'cell_measures' in attributes[ncvar]: cell_measures = re.split('\s*(\w+):\s*', attributes[ncvar]['cell_measures']) for ncvar in cell_measures[2::2]: variables.discard(ncvar) #--- End: if #--- End: for # ---------------------------------------------------------------- # Everything left in the variables set is now a proper data # variable, so make a list of fields, each of which contains one # data variable and the relevant shared metadata. # ---------------------------------------------------------------- # Dictionary mapping netCDF variable names of domain components to # their cf Variables. # # For example: # >>> seen_in_file # {'lat': } seen_in_file = {} # Set # # For example: # >>> # coordref_field_pointers = set() ancillary_variables = set() fields_in_file = FieldList() for data_ncvar in variables: # Don't turn private CFA variables into fields if _is_cfa_private_variable(nc.variables[data_ncvar], cfa): continue f = _create_Field(filename, nc, data_ncvar, attributes, seen_in_file, ancillary_variables, coordref_field_pointers, global_attributes, cfa=cfa, verbose=verbose) fields_in_file.append(f) #--- End: for # ---------------------------------------------------------------- # Find which fields are being pointed to from coordinate # references # ---------------------------------------------------------------- if 'reference' in promote: # Promote coordinate conversion fields to also appear at the # top level top_level.update(coordref_field_pointers) ncvar_to_field = {} if coordref_field_pointers: i = 0 while i < len(fields_in_file): f = fields_in_file[i] ncvar = f.ncvar if ncvar in coordref_field_pointers: # Map the pointer to the field so that later we'll be # able to replace the pointer with the field if ncvar not in ncvar_to_field: ncvar_to_field[ncvar] = f.copy() if ncvar not in top_level: del fields_in_file[i] i -= 1 #--- End: if i += 1 #--- End: if # ---------------------------------------------------------------- # Inside coordinate references, replace pointers to fields with # the actual fields themselves. # ---------------------------------------------------------------- if ncvar_to_field: for f in fields_in_file: for key, ref in f.refs().items(): for term, value in ref.iteritems(): if isinstance(value, dict): # Define this coordinate conversion field try: g = ncvar_to_field[value['ncvar']].copy() # If this coordinate conversion field has a # coordinate reference which contains itself # then remove that coordinate reference. for key2, ref2 in g.refs().iteritems(): for value2 in ref2.itervalues(): if isinstance(value2, dict) and value2['ncvar'] == g.ncvar: g.remove_item(key2) #--- End: for ref[term] = g except KeyError: # Something went wrong. Most likely an # inappropriate coordinate reference # belonging to a promotes dimension or # auxiliary corodinate. Just get rid of # the coordinate reference. f.remove_item(key) break #--- End: if # ---------------------------------------------------------------- # For each field that has ancillary variables, replace its list of # netCDF variable names with a FieldList object. # ---------------------------------------------------------------- if 'ancillary' in promote: # Promote ancillary fields to also appear at the top level top_level.update(ancillary_variables) if ancillary_variables: ncvar_to_field = {} i = 0 while ancillary_variables: try: f = fields_in_file[i] except IndexError: # No more fields break ncvar = f.ncvar if ncvar in ancillary_variables: # This field is being used as an ancillary variable in # another field ancillary_variables.discard(ncvar) ncvar_to_field[ncvar] = f if ncvar not in top_level: del fields_in_file[i] i -= 1 #--- End: if i += 1 #--- End: while for f in fields_in_file: if not hasattr(f, 'ancillary_variables'): continue av = [ncvar_to_field[ncvar].copy() for ncvar in f.ancillary_variables] # f.ancillary_variables = AncillaryVariables(av) f.ancillary_variables = FieldList(av) #--- End: for #--- End: if return fields_in_file #--- End: def def _create_Field(filename, nc, data_ncvar, attributes, seen_in_file, ancillary_variables, coordref_field_pointers, global_attributes, cfa=False, verbose=False): ''' Create a field for a given netCDF variable. :Parameters: filename : str The name of the netCDF file. nc : netCDF4.Dataset The entire netCDF file in a `netCDF4.Dataset` instance. data_ncvar : str The name of the netCDF variable to be turned into a field. attributes : dict Dictionary of the data variable's netCDF attributes. seen_in_file : dict ancillary_variables : set global_attributes : dict cfa : bool If True then netCDF file is a CFA file. By default it is assumed that the file is not a CFA file. :Returns: out : Field The new field. ''' properties = attributes[data_ncvar] # Add global attributes to the data variable's properties, unless # the data variables already has a property with the same name. for attr, value in global_attributes.iteritems(): if attr not in properties: properties[attr] = value # Take cell_methods out of the data variable's properties since it # will need special processing once the domain has been defined if 'cell_methods' in properties: cell_methods = properties.pop('cell_methods') try: cell_methods = CellMethods(cell_methods) except: # Something went wrong whilst trying to parse the cell # methods string properties['nonCF_cell_methods'] = cell_methods if verbose: print( "WARNING: Moving unsupported cell methods to 'nonCF_cell_methods': %r" % cell_methods) cell_methods = None else: cell_methods = None # Take add_offset and scale_factor out of the data variable's # properties since they will be dealt with by the variable's Data # object. Makes sure we note that they were there so we can adjust # the field's dtype accordingly values = [properties.pop(k, None) for k in ('add_offset', 'scale_factor')] unpacked_dtype = values != [None, None] if unpacked_dtype: try: values.remove(None) except ValueError: pass unpacked_dtype = numpy_result_type(*values) #--- End: if # Change numpy arrays to tuples for selected attributes for attr in ('valid_range',): # if attr in attributes[data_ncvar]: # attributes[data_ncvar][attr] = tuple(attributes[data_ncvar][attr]) if attr in properties: properties[attr] = tuple(properties[attr]) # ---------------------------------------------------------------- # Initialize the field with the data variable and its attributes # ---------------------------------------------------------------- f_Units = Units(properties.pop('units', None), properties.pop('calendar', None)) f = Field(properties=properties, copy=False) f.ncvar = data_ncvar f.file = filename f.Units = f_Units f._global_attributes = tuple(global_attributes) # Map netCDF dimension dimension names to domain dimension names. # # For example: # >>> ncdim_to_dim # {'lat': 'dim0', 'time': 'dim1'} ncdim_to_dim = {} ncvar_to_key = {} f.domain._axes['data'] = [] f.domain.nc_dimensions = {} # ---------------------------------------------------------------- # Add axes and non-scalar dimension coordinates to the field # ---------------------------------------------------------------- field_ncdimensions = _ncdimensions(nc.variables[data_ncvar], cfa) for ncdim in field_ncdimensions: if ncdim in nc.variables: # There is a dimension coordinate for this dimension, so # create the coordinate and the dimension. if ncdim in seen_in_file: coord = seen_in_file[ncdim].copy() else: coord = _create_Coordinate(nc, ncdim, attributes, f, cfa=cfa, dimension=True, verbose=verbose) seen_in_file[ncdim] = coord #--- End: if dim = f.domain.insert_dim(coord, copy=False) # Set unlimited status of axis if nc.dimensions[ncdim].isunlimited(): f.unlimited({dim: True}) ncvar_to_key[ncdim] = dim else: # There is no dimension coordinate for this dimension, so # just create a dimension with the correct size. dim = f.domain.insert_axis(size=len(nc.dimensions[ncdim])) # Set unlimited status of axis if nc.dimensions[ncdim].isunlimited(): f.unlimited({dim: True}) #--- End: if # Update data dimension name and set dimension size f.domain.nc_dimensions[dim] = ncdim f.domain._axes['data'].append(dim) ncdim_to_dim[ncdim] = dim #--- End: for f.Data = _set_Data(nc, nc.variables[data_ncvar], f, f, unpacked_dtype=unpacked_dtype, cfa=cfa) # ---------------------------------------------------------------- # Add scalar dimension coordinates and auxiliary coordinates to # the field # ---------------------------------------------------------------- coordinates = f.getprop('coordinates', None) if coordinates is not None: # Split the list (allowing for incorrect comma separated # lists). for ncvar in re.split('\s+|\s*,\s*', coordinates): # Skip dimension coordinates which are in the list if ncvar in field_ncdimensions: continue # Skip auxiliary coordinates which are in the list but not # in the file if ncvar not in nc.variables: continue # Set dimensions aux_ncdimensions = _ncdimensions(nc.variables[ncvar], cfa) dimensions = [ncdim_to_dim[ncdim] for ncdim in aux_ncdimensions if ncdim in ncdim_to_dim] if ncvar in seen_in_file: coord = seen_in_file[ncvar].copy() else: coord = _create_Coordinate(nc, ncvar, attributes, f, cfa=cfa, dimension=False, verbose=verbose) seen_in_file[ncvar] = coord #--- End: if # -------------------------------------------------------- # Turn a .. # -------------------------------------------------------- is_dimension_coordinate = False if not dimensions: if nc.variables[ncvar].dtype.kind is 'S': # String valued scalar coordinate. Is this CF # complaint? Don't worry about it - it'll get # turned into a 1-d, size 1 auxiliary coordinate # construct, anyway dim = f.insert_axis(1) # dim = f.domain.new_axis_identifier() dimensions = [dim] else: # Numeric valued scalar coordinate is_dimension_coordinate = True #--- End: if if is_dimension_coordinate: # Insert dimension coordinate coord = coord.asdimension(copy=False) dim = f.domain.insert_dim(coord, copy=False) f.domain.nc_dimensions[dim]= ncvar ncvar_to_key[ncvar] = dim seen_in_file[ncvar] = coord else: # Insert auxiliary coordinate aux = f.domain.insert_aux(coord, axes=dimensions, copy=False) ncvar_to_key[ncvar] = aux #--- End: for f.delprop('coordinates') #--- End: if # ---------------------------------------------------------------- # Add formula_terms coordinate references # ---------------------------------------------------------------- for key, coord in f.coords().iteritems(): formula_terms = attributes[coord.ncvar].get('formula_terms', None) if formula_terms is None: # This coordinate doesn't have a formula_terms attribute continue _create_formula_terms_ref(f, key, coord, formula_terms, attributes, ncvar_to_key, coordref_field_pointers, seen_in_file) #--- End: for # ---------------------------------------------------------------- # Add grid mapping coordinate references # ---------------------------------------------------------------- grid_mapping = f.getprop('grid_mapping', None) if grid_mapping is not None: _create_grid_mapping_ref(f, grid_mapping, attributes, ncvar_to_key) # ---------------------------------------------------------------- # Add cell measures to the field # ---------------------------------------------------------------- cell_measures = f.getprop('cell_measures', None) if cell_measures is not None: # Parse the cell measures attribute cell_measures = re.split('\s*(\w+):\s*', cell_measures) for measure, ncvar in zip(cell_measures[1::2], cell_measures[2::2]): if ncvar not in attributes: continue # Set cell measures' dimensions cm_ncdimensions = _ncdimensions(nc.variables[ncvar], cfa) dimensions = [ncdim_to_dim[ncdim] for ncdim in cm_ncdimensions] if ncvar in seen_in_file: # Copy the cell measure as it already exists cell = seen_in_file[ncvar].copy() else: cell = _create_CellMeasure(nc, ncvar, attributes, f, cfa=cfa) cell.measure = measure seen_in_file[ncvar] = cell #--- End: if clm = f.domain.insert_measure(cell, axes=dimensions, copy=False) ncvar_to_key[ncvar] = clm #--- End: for f.delprop('cell_measures') #--- End: if # ----------------------------- # Add cell methods to the field # ----------------------------- if cell_methods is not None: f.cell_methods = cell_methods.netcdf_translation(f) # ---------------------------------------------------------------- # Parse an ancillary_variables string to a list of netCDF variable # names, which will get converted to an FieldList object # later. Add these netCDF variable names to the set of all # ancillary data variables in the file. # ---------------------------------------------------------------- if hasattr(f, 'ancillary_variables'): ##dch hasprop? f.ancillary_variables = f.ancillary_variables.split() ancillary_variables.update(f.ancillary_variables) #--- End: if f.autocyclic() # Return the finished field return f #--- End: def def _create_Coordinate(nc, ncvar, attributes, f, cfa=False, dimension=True, verbose=False): ''' Create a coordinate variable, including any bounds. :Parameters: nc : netCDF4.Dataset The entire netCDF file in a `netCDF4.Dataset` object. ncvar : str The netCDF name of the coordinate variable. attributes : dict Dictionary of the coordinate variable's netCDF attributes. f : cf.Field cfa : bool, optional If True then netCDF file is a CFA file. By default it is assumed that the file is not a CFA file. dimension : bool, optional If True then the a dimension coordinate is created, otherwise an auxiliary coordinate is created. :Returns: out : cf.DimensionCoordinate or cf.AuxiliaryCoordinate The new coordinate. ''' properties = attributes[ncvar].copy() c_Units = Units(properties.pop('units', None), properties.pop('calendar', None)) properties.pop('formula_terms', None) ncbounds = properties.pop('bounds', None) if ncbounds is None: ncbounds = properties.pop('climatology', None) climatology = True else: climatology = False if dimension: c = DimensionCoordinate(properties=properties, copy=False) else: c = AuxiliaryCoordinate(properties=properties, copy=False) c.ncvar = ncvar c.Units = c_Units if climatology: c.climatology = climatology data = _set_Data(nc, nc.variables[ncvar], f, c, cfa=cfa) # ------------------------------------------------------------ # Add any bounds # ------------------------------------------------------------ if ncbounds is None: bounds = None else: properties = attributes[ncbounds].copy() properties.pop('formula_terms', None) b_Units = Units(properties.pop('units', None), properties.pop('calendar', None)) bounds = CoordinateBounds(properties=properties, copy=False) bounds.ncvar = ncbounds bounds.Units = b_Units bounds.insert_data( _set_Data(nc, nc.variables[ncbounds], f, bounds, cfa=cfa), copy=False) if not b_Units: bounds.override_units(c_Units, i=True) if b_Units and not b_Units.equivalent(c_Units): bounds.override_units(c_Units, i=True) if verbose: print( "WARNING: Overriding %r of '%s' bounds ('%s') with %r" % (b_Units, ncvar, ncbounds, c_Units)) # Make sure that the bounds dimensions are in the same order # as its parent's dimensions c_ncdims = nc.variables[ncvar].dimensions b_ncdims = nc.variables[ncbounds].dimensions if c_ncdims != b_ncdims[:-1]: iaxes = [c_ncdims.index(ncdim) for ncdim in b_ncdims[:-1]] iaxes.append(-1) bounds.transpose(iaxes, i=True) #--- End: if #--- End: if c.insert_data(data, bounds=bounds, copy=False) # --------------------------------------------------------- # Return the coordinate # --------------------------------------------------------- return c #--- End: def def _create_CellMeasure(nc, ncvar, attributes, f, cfa=False): #, key=None): ''' Create a cell measure variable. :Parameters: nc : netCDF4.Dataset The entire netCDF file in a `netCDF4.Dataset` instance. ncvar : str The netCDF name of the cell measure variable. attributes : dict Dictionary of the cell measure variable's netCDF attributes. f : Field cfa : bool, optional If True then netCDF file is a CFA file. By default it is assumed that the file is not a CFA file. :Returns: out : CellMeasure The new cell measure. ''' clm = CellMeasure(properties=attributes[ncvar]) clm.ncvar = ncvar data = _set_Data(nc, nc.variables[ncvar], f, clm, cfa=cfa) clm.insert_data(data, copy=False) return clm #--- End: def def _ncdimensions(ncvariable, cfa=False): ''' Return a list of the netCDF dimension names for a netCDF variable. :Parameters: ncvariable : netCDF4.Variable cfa : bool, optional If True then netCDF file is a CFA file. By default it is assumed that the file is not a CFA file. :Returns: out : list The list of netCDF dimension names. :Examples: >>> ncdims = _ncdimensions(ncvariable) >>> ncdims = _ncdimensions(ncvariable, cfa=True) ''' ncattrs = ncvariable.ncattrs() if (cfa and 'cf_role' in ncattrs and ncvariable.getncattr('cf_role') == 'cfa_variable'): # NetCDF variable is a CFA variable if 'cfa_dimensions' in ncattrs: ncdimensions = ncvariable.getncattr('cfa_dimensions').split() else: ncdimensions = [] else: # NetCDF variable is not a CFA variable ncdimensions = list(ncvariable.dimensions) cfa = False # Remove a string-length dimension, if there is one. dch alert if (not cfa and ncvariable.dtype.kind == 'S' and ncvariable.ndim >= 2 and ncvariable.shape[-1] > 1): ncdimensions.pop() return map(str, ncdimensions) #--- End: def def _create_grid_mapping_ref(f, grid_mapping, attributes, ncvar_to_key): ''' :Parameters: f : cf.Field grid_mapping : str attributes : dict ncvar_to_key : dict :Returns: None ''' if ':' not in grid_mapping: grid_mapping = '%s:' % grid_mapping coords = [] for x in re.sub('\s*:\s*', ': ', grid_mapping).split()[::-1]: if not x.endswith(':'): try: coords.append(ncvar_to_key[x]) except KeyError: continue else: if not coords: coords = None grid_mapping = x[:-1] if grid_mapping not in attributes: coords = [] continue kwargs = attributes[grid_mapping].copy() name = kwargs.pop('grid_mapping_name', None) coordref = CoordinateReference(name, crtype='grid_mapping', coords=coords, **kwargs) coordref.ncvar = grid_mapping f.domain.insert_ref(coordref, copy=False) coords = [] #--- End: for f.delprop('grid_mapping') #--- End: def def _create_formula_terms_ref(f, key, coord, formula_terms, attributes, ncvar_to_key, coordref_field_pointers, seen_in_file): ''' :Parameters: f : cf.Field key : str coord : cf.Coordinate formula_terms : str The formula_terms attribute value from the netCDF file. attributes : dict ncvar_to_key : dict coordref_field_pointers : set :Returns: out : cf.CoordinateReference ''' standard_name = coord.getprop('standard_name', None) # Add the equation terms and references to their values to to # new auxiliary coordinate's coordinate reference. kwargs = {} coord_terms = [] ft = re.split('\s+|\s*:\s+', formula_terms) ncvars = ft[1::2] for term, ncvar in zip(ft[0::2], ncvars): if ncvar in ncvar_to_key: # CASE 1: The term's value is a coordinate of the field, # so we point to it from the coordinate reference. value = ncvar_to_key[ncvar] coord_terms.append(term) ## # Make sure that coordinate has an identity # c = seen_in_file[ncvar] # if standard_name is not None and not hasattr(c, 'standard_name'): # c.id = standard_name + '_formula_term_' + term elif ncvar not in attributes: # CASE 2: The term's value does not exist as a netCDF # variable in this file value = None else: # CASE 3: The term's value is not a coordinate of the # field so it goes into the coordinate reference # as an independent field value = {'ncvar': ncvar} coordref_field_pointers.add(ncvar) #--- End: if kwargs[term] = value #--- End: for coordref = CoordinateReference(standard_name, crtype='formula_terms', coords=(key,), coord_terms=coord_terms, **kwargs) f.domain.insert_ref(coordref, copy=False) return coordref #--- End: def def _set_Data(nc, ncvar, f, variable, unpacked_dtype=False, cfa=False): ''' Set the Data attribute of a variable. :Parameters: nc : netCDf4.Dataset ncvar : netCDF4.Variable f : Field variable : cf.Variable unpacked_dtype : False or numpy.dtype, optional cfa : bool, optional If True then netCDF file is a CFA file. By default it is assumed that the file is not a CFA file. :Returns: None :Examples: ''' iscfa_variable = variable.getprop('cf_role', None) == 'cfa_variable' if cfa and iscfa_variable: try: cfa_data = json_loads(variable.getprop('cfa_array')) except ValueError as error: raise ValueError( "Error during JSON-decoding of netCDF attribute 'cfa_array': %s" % error) cfa_data['file'] = f.file cfa_data['Units'] = variable.Units cfa_data['fill_value'] = variable.fill_value() cfa_data['_pmshape'] = cfa_data.pop('pmshape', ()) cfa_data['_pmaxes'] = cfa_data.pop('pmdimensions', ()) base = cfa_data.get('base', None) if base is not None: cfa_data['base'] = abspath(pathjoin(dirname(f.file), base)) ncdimensions = variable.getprop('cfa_dimensions', '').split() dtype = ncvar.dtype if dtype.kind == 'S' and ncdimensions: strlen = len(nc.dimensions[ncdimensions[-1]]) if strlen > 1: ncdimensions.pop() dtype = numpy_dtype('S%d' % strlen) #--- End: if cfa_data['dtype'] = dtype cfa_data['_axes'] = ncdimensions cfa_data['shape'] = [len(nc.dimensions[ncdim]) for ncdim in ncdimensions] for attrs in cfa_data['Partitions']: # FORMAT sformat = attrs.get('subarray', {}).pop('format', 'netCDF') if sformat is not None: attrs['format'] = sformat # DTYPE dtype = attrs.get('subarray', {}).pop('dtype', None) if dtype not in (None, 'char'): attrs['subarray']['dtype'] = numpy_dtype(dtype) # UNITS and CALENDAR units = attrs.pop('punits', None) calendar = attrs.pop('pcalendar', None) if units is not None or calendar is not None: attrs['Units'] = Units(units, calendar) # AXES pdimensions = attrs.pop('pdimensions', None) if pdimensions is not None: attrs['axes'] = pdimensions # REVERSE reverse = attrs.pop('reverse', None) if reverse is not None: attrs['reverse'] = reverse # LOCATION: Change to python indexing (i.e. range does not # include the final index) for r in attrs['location']: r[1] += 1 # PART: Change to python indexing (i.e. slice range does # not include the final index) part = attrs.get('part', None) if part: p = [] for x in ast_literal_eval(part): if isinstance(x, list): if x[2] > 0: p.append(slice(x[0], x[1]+1, x[2])) elif x[1] == 0: p.append(slice(x[0], None, x[2])) else: p.append(slice(x[0], x[1]-1, x[2])) else: p.append(list(x)) #--- End: for attrs['part'] = p #--- End: for variable.delprop('cf_role') variable.delprop('cfa_array') if variable.hasprop('cfa_dimensions'): variable.delprop('cfa_dimensions') data = Data(loadd=cfa_data) else: dtype = ncvar.dtype if unpacked_dtype is not False: dtype = numpy_result_type(dtype, unpacked_dtype) ndim = ncvar.ndim shape = ncvar.shape size = ncvar.size if size < 2: size = int(size) if dtype.kind == 'S' and ndim >= 1: #shape[-1] > 1: # Has a trailing string-length dimension strlen = shape[-1] shape = shape[:-1] size /= strlen ndim -= 1 dtype = numpy_dtype('S%d' % strlen) #--- End: if filearray = NetCDFFileArray(file=f.file, ncvar=ncvar._name, dtype=dtype, ndim=ndim, shape=shape, size=size) data = Data(filearray, units=variable.Units, fill_value=variable.fill_value()) #--- End: if return data #--- End: def def _is_cfa_private_variable(ncvar, cfa): ''' Return True if a netCDF variable is a CFA private variable. :Parameters: ncvar : netCDF4.Variable cfa : bool If True then netCDF file is a CFA file. By default it is assumed that the file is not a CFA file. :Returns: out : bool True if *cfa* is True and *ncvar* is a CFA private variable. Otherwise False. :Examples: >>> if _is_cfa_private_variable(x, True): ... print 'This is private CFA' >>> False == _is_cfa_private_variable(x, False) True ''' return (cfa and 'cf_role' in ncvar.ncattrs() and ncvar.getncattr('cf_role') == 'cfa_private') #--- End: def def is_netcdf_file(filename): '''Return True if the file is a netCDF file. Note that the file type is determined by inspecting the file's contents and any file suffix is not not considered. :Parameters: filename : str :Returns: out : bool :Examples: >>> is_netcdf_file('myfile.nc') True >>> is_netcdf_file('myfile.pp') False >>> is_netcdf_file('myfile.pdf') False >>> is_netcdf_file('myfile.txt') False ''' # Read the magic number try: fh = open(filename, 'rb') magic_number = struct_unpack('=L', fh.read(4))[0] except: magic_number = None try: fh.close() except: pass if magic_number in (21382211, 1128547841, 1178880137, 38159427): return True else: return False #--- End: def cf-python-1.3.2/cf/netcdf/write.py0000644000175000017500000022342012764322302017167 0ustar daviddavid00000000000000import netCDF4 import random import json import os from os import remove from os.path import isfile from os.path import expandvars as os_path_expandvars from os.path import expanduser as os_path_expanduser from string import hexdigits from numpy import array as numpy_array from numpy import bool_ as numpy_bool_ from numpy import dtype as numpy_dtype from numpy import ndindex as numpy_ndindex from numpy import integer as numpy_integer from numpy import intersect1d as numpy_intersect1d from numpy import floating as numpy_floating from numpy import size as numpy_size from numpy.ma import empty as numpy_ma_empty from numpy.ma import isMA as numpy_ma_isMA from numpy.ma import masked as numpy_ma_masked from .. import __Conventions__ from ..cfdatetime import dt2rt from ..coordinate import Coordinate from ..coordinatebounds import CoordinateBounds from ..field import Field, FieldList from ..functions import equals, flat, relpath, abspath from ..data.data import Data from .filearray import NetCDFFileArray from .functions import _close_netcdf_file, _open_netcdf_file class NetCDFError(Exception): '''A runtime netCDF error''' pass def write(fields, filename, fmt='NETCDF3_CLASSIC', overwrite=True, verbose=False, cfa_options=None, mode='w', least_significant_digit=None, endian='native', compress=0, fletcher32=False, no_shuffle=False, datatype=None, single=False, double=False, reference_datetime=None, variable_attributes=None, HDF_chunks=None, unlimited=None): '''Write fields to a CF-netCDF or CFA-netCDF file. NetCDF dimension and variable names will be taken from variables' `~Variable.ncvar` attributes and the domain attribute `~Domain.nc_dimensions` if present, otherwise they are inferred from standard names or set to defaults. NetCDF names may be automatically given a numerical suffix to avoid duplication. Output netCDF file global properties are those which occur in the set of CF global properties and non-standard data variable properties and which have equal values across all input fields. Logically identical field components are only written to the file once, apart from when they need to fulfil both dimension coordinate and auxiliary coordinate roles for different data variables. :Parameters: fields : (arbitrarily nested sequence of) cf.Field or cf.FieldList The field or fields to write to the file. filename : str The output CF-netCDF file. Various type of expansion are applied to the file names: ==================== ====================================== Expansion Description ==================== ====================================== Tilde An initial component of ``~`` or ``~user`` is replaced by that *user*'s home directory. Environment variable Substrings of the form ``$name`` or ``${name}`` are replaced by the value of environment variable *name*. ==================== ====================================== Where more than one type of expansion is used in the same string, they are applied in the order given in the above table. Example: If the environment variable *MYSELF* has been set to the "david", then ``'~$MYSELF/out.nc'`` is equivalent to ``'~david/out.nc'``. fmt : str, optional The format of the output file. One of: ===================== ================================================ fmt Description ===================== ================================================ ``'NETCDF3_CLASSIC'`` Output to a CF-netCDF3 classic format file ``'NETCDF3_64BIT'`` Output to a CF-netCDF3 64-bit offset format file ``'NETCDF4_CLASSIC'`` Output to a CF-netCDF4 classic format file ``'NETCDF4'`` Output to a CF-netCDF4 format file ``'CFA3'`` Output to a CFA-netCDF3 classic format file ``'CFA4'`` Output to a CFA-netCDF4 format file ===================== ================================================ By default the *fmt* is ``'NETCDF3_CLASSIC'``. Note that the netCDF3 formats may be slower than any of the other options. overwrite: bool, optional If False then raise an exception if the output file pre-exists. By default a pre-existing output file is over written. verbose : bool, optional If True then print one-line summaries of each field written. cfa_options : dict, optional A dictionary giving parameters for configuring the output CFA-netCDF file: ========== =============================================== Key Value ========== =============================================== ``'base'`` * If ``None`` (the default) then file names within CFA-netCDF files are stored with absolute paths. * If set to an empty string then file names within CFA-netCDF files are given relative to the directory or URL base containing the output CFA-netCDF file. * If set to a string then file names within CFA-netCDF files are given relative to the directory or URL base described by the value. For example: ``'../archive'``. ========== =============================================== By default no parameters are specified. mode : str, optional Specify the mode of write access for the output file. One of: ======= ================================================== mode Description ======= ================================================== ``'w'`` Create the file. If it already exists and *overwrite* is True then the file is deleted prior to being recreated. ======= ================================================== By default the file is opened with write access mode ``'w'``. datatype : dict, optional Specify data type conversions to be applied prior to writing data to disk. Arrays with data types which are not specified remain unchanged. By default, array data types are preserved. **Example:** To convert 64 bit floats and integers to their 32 bit counterparts: ``datatype={numpy.dtype(float): numpy.dtype('float32'), numpy.dtype(int): numpy.dtype('int32')}``. single : bool, optional Write 64-bit floats as 32-bit floats and 64-bit integers as 32-bit integers. By default, input data types are preserved. Note that ``single=True`` is equivalent to ``datatype={numpy.dtype('float64'): numpy.dtype('float32'), numpy.dtype('int64'): numpy.dtype('int32')}``. double : bool, optional Write 32-bit floats as 64-bit floats and 32-bit integers as 64-bit integers. By default, input data types are preserved. Note that ``double=True`` is equivalent to ``datatype={numpy.dtype('float32'): numpy.dtype('float64'), numpy.dtype('int32'): numpy.dtype('int64')}``. :Returns: None :Raises: IOError : If *overwrite* is False and the output file pre-exists. ValueError : If a field does not have information required to write certain aspects of a CF-netCDF file. :Examples: >>> f [, , , ] >>> write(f, 'file') >>> type(f) >>> type(g) >>> cf.write([f, g], 'file.nc', verbose=True) [, , , ] ''' compress = int(compress) zlib = bool(compress) if fmt not in ('NETCDF3_CLASSIC', 'NETCDF3_64BIT', 'CFA3', 'NETCDF4', 'NETCDF4_CLASSIC', 'CFA4'): raise ValueError("Unknown output file format: {0}".format(fmt)) if compress and fmt in ('NETCDF3_CLASSIC', 'NETCDF3_64BIT', 'CFA3'): raise ValueError("Can't compress {0} format file".format(fmt)) if least_significant_digit and fmt in ('CFA3', 'CFA4'): raise ValueError("Can't truncate data variables in {0} format file".format(fmt)) # ---------------------------------------------------------------- # Set up non-global attributes # ---------------------------------------------------------------- if variable_attributes: if isinstance(variable_attributes, basestring): variable_attributes = set((variable_attributes,)) else: variable_attributes = set(variable_attributes) else: variable_attributes = set() # ---------------------------------------------------------------- # Set up data type conversions # ---------------------------------------------------------------- dtype_conversions = {numpy_dtype(bool) : numpy_dtype('int32'), numpy_dtype(object): numpy_dtype(float)} if datatype: if single: raise ValueError("Can't set datatype and single") if double: raise ValueError("Can't set datatype and double") dtype_conversions.update(datatype) else: if single and double: raise ValueError("Can't set single and double") if single: dtype_conversions[numpy_dtype(float)] = numpy_dtype('float32') dtype_conversions[numpy_dtype(int)] = numpy_dtype('int32') if double: dtype_conversions[numpy_dtype('float32')] = numpy_dtype(float) dtype_conversions[numpy_dtype('int32')] = numpy_dtype(int) datatype = dtype_conversions if not unlimited: unlimited = () # ---------------------------------------------------------------- # Initialize dictionary of useful global variables # ---------------------------------------------------------------- g = {'netcdf' : None, # - netCDF4.Dataset instance #----------------------------- 'nc' : {}, # - Map netCDF variable names # to netCDF4.Variable # instances 'ncdim_to_size' : {}, # - Map netCDF dimension names # to netCDF dimension sizes 'ncpdim_to_size' : {}, # - Dictionary of PARTITION # dimension sizes keyed by # netCDF dimension names. 'seen' : {}, # - Dictionary of netCDF # variable names and netCDF # dimensions keyed by items # of the field (such as a # coordinate or a coordinate # reference). # ----------------------------- 'ncvar_names' : set(()), # - Set of all netCDF # dimension and netCDF # variable names. 'global_properties' : set(()), # - Set of global or # non-standard CF properties # which have identical # values across all input # fields. #----------------------------- 'variable_attributes': variable_attributes, #----------------------------- 'dimN' : 1, # - Counter 'auxN' : 1, # - Counter 'scalarN' : 1, # - Counter 'cmN' : 1, # - Counter 'dataN' : 1, # - Counter 'gmN' : 1, # - Counter 'bndN' : 1, # - Counter 'bnddimN' : 1, # - Counter 'strlenN' : 1, # - Counter 'partition_arrayN' : 1, # - Counter 'partitionN' : 1, # - Counter # ----------------------------------------------------------- # CFA parameters # ----------------------------------------------------------- 'cfa' : False, # - flag to use the CFA # convention, or not. 'cfa_options': {}, # - 'CFA_ncdims' : set(()), # - set of all private CFA # netCDF dimension names. 'CFAdimN' : 1, # - Counter # ----------------------------------------------------------- # Compression/endian # ----------------------------------------------------------- 'compression' : {'zlib' : zlib, 'complevel' : compress, 'fletcher32' : fletcher32, 'shuffle' : not no_shuffle}, 'endian' : endian, 'least_significant_digit': least_significant_digit, # ----------------------------------------------------------- # CF properties which need not be set on bounds if they're # set on the parent coordinate # ----------------------------------------------------------- 'omit_bounds_properties': ('units', 'standard_name', 'axis', 'positive', 'calendar', 'month_lengths', 'leap_year', 'leap_month'), 'least_significant_digit': least_significant_digit, # ------------------------------------------------------------ # Specify data type conversions to be applied prior to writing # ------------------------------------------------------------ 'datatype': datatype, # ------------------------------------------------------------ # Specify unit conversions to be applied prior to writing # ------------------------------------------------------------ 'reference_datetime': reference_datetime, # ------------------------------------------------------------ # # ------------------------------------------------------------ 'unlimited': unlimited, } if fmt == 'CFA3': g['cfa'] = True fmt = 'NETCDF3_CLASSIC' if cfa_options: g['cfa_options'] = cfa_options elif fmt == 'CFA4': g['cfa'] = True fmt = 'NETCDF4' if cfa_options: g['cfa_options'] = cfa_options g['fmt'] = fmt # --------------------------------------------------------------- # Flatten the sequence of intput fields # --------------------------------------------------------------- fields = FieldList(flat(fields)) # --------------------------------------------------------------- # Still here? Open the output netCDF file. # --------------------------------------------------------------- # if mode != 'w': # raise ValueError("Can only set mode='w' at the moment") filename = os_path_expanduser(os_path_expandvars(filename)) if mode == 'w' and isfile(filename): if not overwrite: raise IOError( "Can't write to an existing file unless overwrite=True: {0}".format( abspath(filename))) if not os.access(filename, os.W_OK): raise IOError( "Can't overwrite an existing file without permission: {0}".format( abspath(filename))) _close_netcdf_file(filename) remove(filename) #--- End: if g['netcdf'] = _open_netcdf_file(filename, mode, fmt) #netCDF4.Dataset(filename, mode, format=fmt) # --------------------------------------------------------------- # Set the fill mode for a Dataset open for writing to off. This # will prevent the data from being pre-filled with fill values, # which may result in some performance improvements. # --------------------------------------------------------------- g['netcdf'].set_fill_off() # --------------------------------------------------------------- # Write global properties to the file first. This is important as # doing it later could slow things down enormously. This function # also creates the g['global_properties'] set, which is used in # the _write_a_field function. # --------------------------------------------------------------- _create_global_properties(fields, g=g) # --------------------------------------------------------------- # --------------------------------------------------------------- for f in fields: # Set HDF chunking org_chunks = f.HDF_chunks(HDF_chunks) default_chunks = f.HDF_chunks() chunks = org_chunks.copy() shape = f.shape for i, size in org_chunks.iteritems(): if size is None: size = default_chunks[i] dim_size = shape[i] if size is None or size > dim_size: size = dim_size chunks[i] = size #--- End: for f.HDF_chunks(chunks) # Write the field _write_a_field(f, g=g) # Reset HDF chunking f.HDF_chunks(org_chunks) if verbose: for e in f: print repr(e) #-- End: for # --------------------------------------------------------------- # Write all of the buffered data to disk # --------------------------------------------------------------- g['netcdf'].close() #--- End: def def _check_name(base, counter, g=None, dimsize=None, cfa=False): ''' :Parameters: base : str counter : int g : dict dimsize : int, optional cfa : bool, optional :Returns: ncvar : str NetCDF dimension name or netCDF variable name. counter : int ''' ncvar_names = g['ncvar_names'] if dimsize is not None: if not cfa: if base in ncvar_names and dimsize == g['ncdim_to_size'][base]: # Return the name of an existing netCDF dimension with # this size return base, counter elif base in g['CFA_ncdims']: # Return the name of an existing private CFA-netCDF # dimension with this size return base, counter #--- End: if if base in ncvar_names: ncvar = '%(base)s_%(counter)d' % locals() while ncvar in ncvar_names: counter += 1 ncvar = '%(base)s_%(counter)d' % locals() else: ncvar = base ncvar_names.add(ncvar) return ncvar, counter #--- End: def def _write_attributes(netcdf_var, netcdf_attrs): ''' :Parameters: netcdf_var : netCDF4.Variable netcdf_attrs : dict :Returns: None :Examples: ''' if hasattr(netcdf_var, 'setncatts'): # Use the faster setncatts netcdf_var.setncatts(netcdf_attrs) else: # Otherwise use the slower setncattr for attr, value in netcdf_attrs.iteritems(): netcdf_var.setncattr(attr, value) #--- End: def def _character_array(array): ''' Convert a numpy string array to a numpy character array wih an extra trailing dimension. :Parameters: array : numpy array :Returns: out : numpy array :Examples: >>> print a, a.shape, a.dtype.itemsize ['fu' 'bar'] (2,) 3 >>> b = _character_array(a) >>> print b, b.shape, b.dtype.itemsize [['f' 'u' ' '] ['b' 'a' 'r']] (2, 3) 1 >>> print a, a.shape, a.dtype.itemsize [-- 'bar'] (2,) 3 >>> b = _character_array(a) >>> print b, b.shape, b.dtype.itemsize [[-- -- --] ['b' 'a' 'r']] (2, 3) 1 ''' strlen = array.dtype.itemsize shape = array.shape new = numpy_ma_empty(shape + (strlen,), dtype='S1') for index in numpy_ndindex(shape): value = array[index] if value is numpy_ma_masked: new[index] = numpy_ma_masked else: new[index] = tuple(value.ljust(strlen, ' ')) #--- End: for return new #--- End: def def _datatype(variable, g=None): ''' Return the netCDF4.createVariable datatype corresponding to the datatype of the array of the input variable For example, if variable.dtype is 'float32', then 'f4' will be returned. Numpy string data types will return 'S1' regardless of the numpy string length. This means that the required conversion of multi-character datatype numpy arrays into single-character datatype numpy arrays (with an extra trailing dimension) is expected to be done elsewhere (currently in the _create_netcdf_variable function). If the input variable has no `!dtype` attribute (or it is None) then 'S1' is returned. :Parameters: variable : Any object with a `!dtype` attribute whose value is a `numpy.dtype` object or None. g : dict :Returns: out : str The netCDF4.createVariable datatype corresponding to the datatype of the array of the input variable. ''' if (not hasattr(variable, 'dtype') or variable.dtype.char == 'S' or variable.dtype is None): return 'S1' dtype = variable.dtype convert_dtype = g['datatype'] new_dtype = convert_dtype.get(dtype, None) if new_dtype is not None: dtype = new_dtype return '{0}{1}'.format(dtype.kind, dtype.itemsize) #--- End: def def _string_length_dimension(size, g=None): ''' Create, if necessary, a netCDF dimension for string variables. :Parameters: size : int g : dict :Returns: out : str The netCDF dimension name. ''' # ---------------------------------------------------------------- # Create a new dimension for the maximum string length # ---------------------------------------------------------------- ncdim, g['strlenN'] = _check_name('strlen%d' % size, g['strlenN'], dimsize=size, g=g) if ncdim not in g['ncdim_to_size']: # This string length dimension needs creating g['ncdim_to_size'][ncdim] = size g['netcdf'].createDimension(ncdim, size) return ncdim #--- End: def def _random_hex_string(size=10): ''' Return a random hexadecimal string with the given number of characters. :Parameters: size : int, optional The number of characters in the generated string. :Returns: out : str The hexadecimal string. :Examples: >>> _random_hex_string() 'C3eECbBBcf' >>> _random_hex_string(6) '7a4acc' ''' return ''.join(random.choice(hexdigits) for i in xrange(size)) #--- End: def def _cfa_dimension(size, g=None): ''' Write a private CFA dimension to the netCDF file, unless one for the given size already exists. In either case returns the netCDF dimension name. .. note:: This function updates ``g['CFA_ncdims']``, ``g['ncvar_names']``, ``g['netcdf']``. :Parameters: size : int The size of the private CFA dimension. g : dict :Returns: out : str The netCDF dimension name. :Examples: >>> _cfa_dimension(10, g=g) 'cfa10' ''' ncdim, g['CFAdimN'] = _check_name('cfa%d' % size, g['CFAdimN'], g=g, dimsize=size, cfa=True) if ncdim not in g['CFA_ncdims']: g['CFA_ncdims'].add(ncdim) g['netcdf'].createDimension(ncdim, size) return ncdim #--- End: def def _write_cfa_variable(ncvar, ncdimensions, netcdf_attrs, data, g=None): ''' Write a CFA variable to the netCDF file. Any CFA private variables required will be autmatically created and written to the file. :Parameters: ncvar : str The netCDF name for the variable. ncdimensions : sequence of str netcdf_attrs : dict data : cf.Data g : dict :Returns: None :Examples: ''' fill_value = data.fill_value # False, None speed? g['nc'][ncvar] = g['netcdf'].createVariable(ncvar, _datatype(data, g=g), (), fill_value=fill_value, least_significant_digit=None, endian=g['endian'], **g['compression']) netcdf_attrs['cf_role'] = 'cfa_variable' netcdf_attrs['cfa_dimensions'] = ' '.join(ncdimensions) # Create a dictionary representation of the data object data = data.copy() axis_map = {} for axis0, axis1 in zip(data._axes, ncdimensions): axis_map[axis0] = axis1 data._change_axis_names(axis_map) data._move_flip_to_partitions() cfa_array = data.dumpd() # Modify the dictionary so that it is suitable for JSON # serialization del cfa_array['_axes'] del cfa_array['shape'] del cfa_array['Units'] del cfa_array['dtype'] cfa_array.pop('_cyclic', None) cfa_array.pop('_fill', None) cfa_array.pop('fill_value', None) pmshape = cfa_array.pop('_pmshape', None) if pmshape: cfa_array['pmshape'] = pmshape pmaxes = cfa_array.pop('_pmaxes', None) if pmaxes: cfa_array['pmdimensions'] = pmaxes pda_args = data.pda_args(revert_to_file=True) base = g['cfa_options'].get('base', None) if base is not None: cfa_array['base'] = base convert_dtype = g['datatype'] for attrs in cfa_array['Partitions']: fmt = attrs.get('format', None) if fmt is None: # -------------------------------------------------------- # This partition has an internal sub-array. This could be # a numpy array or a temporary FileArray object. # -------------------------------------------------------- index = attrs.get('index', ()) if len(index) == 1: index = index[0] else: index = tuple(index) partition = data.partitions.matrix.item(index) array = partition.dataarray(**pda_args) # Convert data type new_dtype = convert_dtype.get(array.dtype, None) if new_dtype is not None: array = array.astype(new_dtype) shape = array.shape ncdim_strlen = [] if array.dtype.kind == 'S': # This is an array of strings strlen = array.dtype.itemsize if strlen > 1: # Convert to an array of characters array = _character_array(array) # Get the netCDF dimension for the string length ncdim_strlen = [_string_length_dimension(strlen, g=None)] #--- End: if # Create a name for the netCDF variable to contain the array p_ncvar = 'cfa_'+_random_hex_string() while p_ncvar in g['ncvar_names']: p_ncvar = 'cfa_'+_random_hex_string() #--- End: while g['ncvar_names'].add(p_ncvar) # Get the private CFA netCDF dimensions for the array. cfa_dimensions = [_cfa_dimension(n, g=g) for n in array.shape] # Create the private CFA variable and write the array to it v = g['netcdf'].createVariable(p_ncvar, _datatype(array, g=g), cfa_dimensions + ncdim_strlen, fill_value=fill_value, least_significant_digit=None, endian=g['endian'], **g['compression']) _write_attributes(v, {'cf_role': 'cfa_private'}) v[...] = array # Update the attrs dictionary. # # Note that we don't need to set 'part', 'dtype', 'units', # 'calendar', 'dimensions' and 'reverse' since the # partition's in-memory data array always matches up with # the master data array. attrs['subarray'] = {'shape' : shape, 'ncvar' : p_ncvar} else: # -------------------------------------------------------- # This partition has an external sub-array # -------------------------------------------------------- # PUNITS, PCALENDAR: Change from Units object to netCDF # string(s) units = attrs.pop('Units', None) if units is not None: attrs['punits'] = units.units if hasattr(units, 'calendar'): attrs['pcalendar'] = units.calendar # PDIMENSIONS: p_axes = attrs.pop('axes', None) if p_axes is not None: attrs['pdimensions'] = p_axes # REVERSE p_flip = attrs.pop('flip', None) if p_flip: attrs['reverse'] = p_flip # DTYPE: Change from numpy.dtype object to netCDF string dtype = attrs['subarray'].pop('dtype', None) if dtype is not None: if dtype.kind != 'S': attrs['subarray']['dtype'] = _convert_to_netCDF_datatype(dtype) # FORMAT: sfmt = attrs.pop('format', None) if sfmt is not None: attrs['subarray']['format'] = sfmt #--- End: if # LOCATION: Change from python to CFA indexing (i.e. range # includes the final index) attrs['location'] = [(x[0], x[1]-1) for x in attrs['location']] # PART: Change from python to to CFA indexing (i.e. slice # range includes the final index) part = attrs.get('part', None) if part: p = [] for x, size in zip(part, attrs['subarray']['shape']): if isinstance(x, slice): x = x.indices(size) if x[2] > 0: p.append([x[0], x[1]-1, x[2]]) elif x[1] == -1: p.append([x[0], 0, x[2]]) else: p.append([x[0], x[1]+1, x[2]]) else: p.append(tuple(x)) #--- End: for attrs['part'] = str(p) #--- End: if if 'base' in cfa_array and 'file' in attrs['subarray']: # Make the file name relative to base attrs['subarray']['file'] = relpath(attrs['subarray']['file'], cfa_array['base']) #--- End: for # Add the description (as a JSON string) of the partition array to # the netcdf attributes. netcdf_attrs['cfa_array'] = json.dumps(cfa_array, default=_convert_to_builtin_type) # Write the netCDF attributes to the file _write_attributes(g['nc'][ncvar], netcdf_attrs) #--- End: def def _convert_to_netCDF_datatype(dtype): ''' Convert a numpy.dtype object to a netCDF data type string. :Parameters: dtype : numpy.dtype :Returns: out : str :Examples: >>> _convert_to_netCDF_datatype(numpy.dtype('float32')) 'float' >>> _convert_to_netCDF_datatype(numpy.dtype('float64')) 'double' >>> _convert_to_netCDF_datatype(numpy.dtype('int8')) 'byte' ''' if dtype.char is 'f': return 'float' if dtype.char is 'd': return 'double' if dtype.kind is 'i': # long int?? return 'int' if dtype.char is 'S': return 'char' if dtype.char is 'b': return 'byte' if dtype.char is 'h': return 'short' raise TypeError("Ho hum de hum") #--- End: def def _convert_to_builtin_type(x): ''' Convert a non-JSON-encodable object to a JSON-encodable built-in type. Possible conversions are: ============== ============= ====================================== Input object Output object numpy data types covered ============== ============= ====================================== numpy.bool_ bool bool numpy.integer int int, int8, int16, int32, int64, uint8, uint16, uint32, uint64 numpy.floating float float, float16, float32, float64 ============== ============= ====================================== :Parameters: x : :Returns: out : :Raises: TypeError : If *x* can't be converted to a JSON serializableis type. :Examples: >>> type(_convert_to_netCDF_datatype(numpy.bool_(True))) bool >>> type(_convert_to_netCDF_datatype(numpy.array([1.0])[0])) double >>> type(_convert_to_netCDF_datatype(numpy.array([2])[0])) int ''' if isinstance(x, numpy_bool_): return bool(x) if isinstance(x, numpy_integer): return int(x) if isinstance(x, numpy_floating): return float(x) raise TypeError( "{0!r} object is not JSON serializable: {1!r}".format(type(x), x)) #--- End: def def _grid_ncdimensions(f, key, axis_to_ncdim, g=None): ''' Return a tuple of the netCDF dimension names for the axes of a coordinate or cell measures objects. :Parameters: f : cf.Field key : str axis_to_ncdim : dict Mapping of field axis identifiers to netCDF dimension names. g : dict :Returns: out : tuple A tuple of the netCDF dimension names. ''' domain = f.domain if domain.get(key).ndim == 0: return () else: # return tuple(g['axis_to_ncdim'][axis] # for axis in domain._axes[key]) return tuple([axis_to_ncdim[axis] for axis in f.item_axes(key)]) #--- End: def def _variable_ncvar(variable, default, counter, g=None): ''' :Returns: variable : cf.Variable default : str counter : int g : dict ''' ncvar = getattr(variable, 'ncvar', variable.identity(default=default)) return _check_name(ncvar, counter, g=g) #--- End: def def _write_dimension(ncdim, f, axis, axis_to_ncdim, unlimited=False, g=None): '''Write a dimension to the netCDF file. .. note:: This function updates ``axis_to_ncdim``, ``g['ncdim_to_size']``. :Parameters: ncdim: `str` The netCDF dimension name. f: `cf.Field` axis: `str` The field's axis identifier. axis_to_ncdim: `dict` Mapping of field axis identifiers to netCDF dimension names. unlimited: `bool`, optional If true then create an unlimited dimension. By default dimensions are not unlimited. g: `dict` :Returns: `None` ''' size = f.axis_size(axis) g['ncdim_to_size'][ncdim] = size axis_to_ncdim[axis] = ncdim if unlimited: # Create an unlimited dimension try: g['netcdf'].createDimension(ncdim, None) except RuntimeError as error: message = "Can't create unlimited dimension in {} file ({}).".format( g['netcdf'].file_format, error) error = str(error) if error == 'NetCDF: NC_UNLIMITED size already in use': raise NetCDFError( message+" Only one unlimited dimension allowed. Consider using a netCDF4 format.") raise NetCDFError(message) else: try: g['netcdf'].createDimension(ncdim, size) except RuntimeError as error: raise NetCDFError( "Can't create dimension of size {} in {} file ({})".format( size, g['netcdf'].file_format, error)) #--- End: def def _change_reference_datetime(coord, g=None): ''' :Parameters: coord : cf.Coordinate g : dict :Returns: out : cf.Coordinate ''' if not coord.Units.isreftime: return coord reference_datetime = g['reference_datetime'] if not reference_datetime: return coord coord2 = coord.copy() try: coord2.reference_datetime = reference_datetime except ValueError: raise ValueError( "Can't override coordinate reference date-time {0!r} with {1!r}".format( coord.reference_datetime, reference_datetime)) else: return coord2 #--- End: def def _write_dimension_coordinate(f, axis, coord, key_to_ncvar, axis_to_ncdim, g=None): ''' Write a dimension coordinate and bounds to the netCDF file. This also writes a new netCDF dimension to the file and, if required, a new netCDF bounds dimension. .. note:: This function updates ``axis_to_ndim``, ``g['dimN']``, ``g['seen']``. :Parameters: f : cf.Field axis : str coord : cf.DimensionCoordinate key_to_ncvar : dict Mapping of field item identifiers to netCDF dimension names. axis_to_ncdim : dict Mapping of field axis identifiers to netCDF dimension names. g : dict :Returns: out : str The netCDF name of the dimension coordinate. ''' seen = g['seen'] coord = _change_reference_datetime(coord, g) create = False if not _seen(coord, g=g): create = True elif seen[id(coord)]['ncdims'] != (): if seen[id(coord)]['ncvar'] != seen[id(coord)]['ncdims'][0]: # Already seen this coordinate but it was an auxiliary # coordinate, so it needs to be created as a dimension # coordinate. create = True #--- End: if if create: ncdim, g['dimN'] = _variable_ncvar(coord, 'dim', g['dimN'], g=g) # Create a new dimension, if it is not a scalar coordinate if coord.ndim > 0: unlimited = _unlimited(f, axis, g=g) _write_dimension(ncdim, f, axis, axis_to_ncdim, unlimited=unlimited, g=g) ncdimensions = _grid_ncdimensions(f, axis, axis_to_ncdim, g=g) # If this dimension coordinate has bounds then create the # bounds netCDF variable and add the bounds or climatology # attribute to the dictionary of extra attributes extra = _write_coordinate_bounds(coord, ncdimensions, ncdim, g=g) # Create a new dimension coordinate variable _create_netcdf_variable(ncdim, ncdimensions, coord, extra=extra, g=g) else: ncdim = seen[id(coord)]['ncvar'] key_to_ncvar[axis] = ncdim # try: ### ????? why not always do this dch?? axis_to_ncdim[axis] = ncdim # except KeyError: # pass return ncdim #--- End: def def _seen(variable, ncdims=None, g=None): ''' Return True if a variable is logically equal any variable in the g['seen'] dictionary. If this is the case then the variable has already been written to the output netCDF file and so we don't need to do it again. If 'ncdims' is set then a extra condition for equality is applied, namely that of 'ncdims' being equal to the netCDF dimensions (names and order) to that of a variable in the g['seen'] dictionary. When True is returned, the input variable is added to the g['seen'] dictionary. .. note:: This function updates ``g['seen']``. :Parameters: variable : ncdims : tuple, optional g : dict :Returns: out : bool True if the variable has already been written to the file, False otherwise. ''' seen = g['seen'] for key, value in seen.iteritems(): if ncdims is not None and ncdims != value['ncdims']: # The netCDF dimensions (names and order) of the input # variable are different to those of this variable in # the 'seen' dictionary continue # Still here? if variable.equals(value['variable']): seen[id(variable)] = {'variable': variable, 'ncvar' : value['ncvar'], 'ncdims' : value['ncdims']} return True #--- End: for return #--- End: def def _write_coordinate_bounds(coord, coord_ncdimensions, coord_ncvar, g=None): ''' Create a coordinate's bounds netCDF variable, creating a new bounds netCDF dimension if required. Return the bounds variable's netCDF variable name. .. note:: This function updates ``g['bnddimN']``, ``g['bndN']``, ``g['netcdf']``. :Parameters: coord : cf.Coordinate coord_ncdimensions : tuple The ordered netCDF dimension names of the coordinate's dimensions (which do not include the bounds dimension). coord_ncvar : str The netCDF variable name of the coordinate. g : dict :Returns: out : dict :Examples: >>> extra = _write_coordinate_bounds(c, ('dim2',), g=g) ''' if not (coord._hasbounds and coord.bounds._hasData): return {} extra = {} # Still here? Then this coordinate has a bounds attribute # which contains data. bounds = coord.bounds size = bounds.shape[-1] ncdim, g['bnddimN'] = _check_name('bounds%(size)d' % locals(), g['bnddimN'], dimsize=size, g=g) # Check if this bounds variable has not been previously # created. ncdimensions = coord_ncdimensions +(ncdim,) if _seen(bounds, ncdimensions, g=g): # This bounds variable has been previously created, so no # need to do so again. ncvar = g['seen'][id(bounds)]['ncvar'] else: # This bounds variable has not been previously created, so # create it now. ncdim_to_size = g['ncdim_to_size'] if ncdim not in ncdim_to_size: ncdim_to_size[ncdim] = size g['netcdf'].createDimension(ncdim, size) #ncdim_to_size[ncdim]) ncvar = getattr(bounds, 'ncvar', '%s_bounds' % coord_ncvar) ncvar, g['bndN'] = _check_name(ncvar, g['bndN'], g=g) # Note that, in a field, bounds always have equal units to # their parent coordinate # Select properties to omit omit = [] for prop in g['omit_bounds_properties']: if coord.hasprop(prop): omit.append(prop) # Create the bounds netCDF variable _create_netcdf_variable(ncvar, ncdimensions, bounds, omit=omit, g=g) #--- End: if if getattr(coord, 'climatology', None): extra['climatology'] = ncvar else: extra['bounds'] = ncvar return extra #--- End: def def _write_scalar_coordinate(f, axis, coord, coordinates, key_to_ncvar, axis_to_ncscalar, g=None): ''' Write a scalar coordinate and bounds to the netCDF file. It is assumed that the input coordinate is has size 1, but this is not checked. If an equal scalar coordinate has already been written to the file then the input coordinate is not written. .. note:: This function updates ``key_to_ncvar``, ``axis_to_ncscalar``, ``g['scalarN']``. :Parameters: f : cf.Field axis : str The field's axis identifier for the scalar coordinate. key_to_ncvar : dict Mapping of field item identifiers to netCDF dimension names. axis_to_ncscalar : dict Mapping of field axis identifiers to netCDF scalar coordinate variable names. coordinates : list g : dict :Returns: coordinates : list The updated list of netCDF auxiliary coordinate names. ''' coord = _change_reference_datetime(coord, g) coord = coord.squeeze() if not _seen(coord, (), g=g): ncvar, g['scalarN'] = _variable_ncvar(coord, 'scalar', g['scalarN'], g=g) # If this scalar coordinate has bounds then create the # bounds netCDF variable and add the bounds or climatology # attribute to the dictionary of extra attributes extra = _write_coordinate_bounds(coord, (), ncvar, g=g) # Create a new auxiliary coordinate variable _create_netcdf_variable(ncvar, (), coord, extra=extra, g=g) else: # This scalar coordinate has already been written to the # file ncvar = g['seen'][id(coord)]['ncvar'] axis_to_ncscalar[axis] = ncvar key_to_ncvar[axis] = ncvar coordinates.append(ncvar) return coordinates #--- End: def def _write_auxiliary_coordinate(f, key, coord, coordinates, key_to_ncvar, axis_to_ncdim, g=None): ''' Write an auxiliary coordinate and its bounds to the netCDF file. If an equal auxiliary coordinate has already been written to the file then the input coordinate is not written. .. note:: This function updates ``g['auxN']``. :Parameters: f : cf.Field key : str coord : cf.Coordinate coordinates : list key_to_ncvar : dict Mapping of field item identifiers to netCDF dimension names. axis_to_ncdim : dict Mapping of field axis identifiers to netCDF dimension names. g : dict :Returns: coordinates : list The list of netCDF auxiliary coordinate names updated in place. :Examples: >>> coordinates = _write_auxiliary_coordinate(f, 'aux2', coordinates, g=g) ''' coord = _change_reference_datetime(coord, g) ncdimensions = _grid_ncdimensions(f, key, axis_to_ncdim, g=g) if _seen(coord, ncdimensions, g=g): ncvar = g['seen'][id(coord)]['ncvar'] else: ncvar, g['auxN'] = _variable_ncvar(coord, 'aux', g['auxN'], g=g) # If this auxiliary coordinate has bounds then create the # bounds netCDF variable and add the bounds or climatology # attribute to the dictionary of extra attributes extra = _write_coordinate_bounds(coord, ncdimensions, ncvar, g=g) # Create a new auxiliary coordinate variable _create_netcdf_variable(ncvar, ncdimensions, coord, extra=extra, g=g) #--- End: if key_to_ncvar[key] = ncvar coordinates.append(ncvar) return coordinates #--- End: def def _write_cell_measure(f, key, cm, cell_measures, key_to_ncvar, axis_to_ncdim, g=None): ''' Write an auxiliary coordinate and bounds to the netCDF file. If an equal cell measure has already been written to the file then the input coordinate is not written. .. note:: This function updates ``g['cmN']``. :Parameters: f : cf.Field The field containing the cell measure. key : str The domain identifier of the cell measure (e.g. 'cmo'). cell_measures : list key_to_ncvar : dict Mapping of field item identifiers to netCDF dimension names. axis_to_ncdim : dict Mapping of field axis identifiers to netCDF dimension names. g : dict :Returns: cell_measures : list The updated list of netCDF cell_measures 'measure: name' pairings. :Examples: ''' ncdimensions = _grid_ncdimensions(f, key, axis_to_ncdim, g=g) if _seen(cm, ncdimensions, g=g): ncvar = g['seen'][id(cm)]['ncvar'] else: ncvar, g['cmN'] = _variable_ncvar(cm, 'cm', g['cmN'], g=g) if not hasattr(cm, 'measure'): raise ValueError( "Can't create a cell measure variable without a 'measure' attribute") _create_netcdf_variable(ncvar, ncdimensions, cm, g=g) #--- End: if key_to_ncvar[key] = ncvar # Update the cell_measures list cell_measures.append('%s: %s' % (cm.measure, ncvar)) return cell_measures #--- End: def def _write_grid_mapping(f, coordref, grid_mapping, multiple_grid_mappings, key_to_ncvar, g=None): ''' Write a grid mapping georeference to the netCDF file. .. note:: This function updates ``grid_mapping``, ``g['seen']``. :Parameters: f : cf.Field coordref : cf.CoordinateReference The grid mapping coordinate reference to write to the file. grid_mapping : list The list of netCDF grid_mapping names. This is updated in place with the netCDF variable name of the input coordinate reference object. multiple_grid_mappings : bool key_to_ncvar : dict Mapping of field item identifiers to netCDF variable names. g : dict :Returns: None :Examples: ''' if _seen(coordref, g=g): # Use existing grid_mapping ncvar = g['seen'][id(coordref)]['ncvar'] else: # Create a new grid mapping ncvar = getattr(coordref, 'ncvar', coordref.name) ncvar, g['gmN'] = _check_name(ncvar, g['gmN'], g=g) g['nc'][ncvar] = g['netcdf'].createVariable(ncvar, 'S1', (), endian=g['endian'], **g['compression']) t = f.domain.canonical_ref(coordref) # Add properties from key/value pairs if hasattr(g['nc'][ncvar], 'setncatts'): # Use the faster setncatts for term, value in coordref.iteritems(): if value is None: del t[term] elif numpy_size(value) == 1: t[term] = numpy_array(value, copy=False).item() else: t[term] = numpy_array(value, copy=False).tolist() #--- End: for if t.name is not None and 'grid_mapping_name' not in t: t['grid_mapping_name'] = t.name g['nc'][ncvar].setncatts(t) else: # Otherwise use the slower setncattr for term, value in t.iteritems(): if value is None: continue if numpy_size(value) == 1: value = numpy_array(value, copy=False).item() else: value = numpy_array(value, copy=False).tolist() g['nc'][ncvar].setncattr(term, value) #--- End: for if t.name is not None: g['nc'][ncvar].setncattr('grid_mapping_name', t.name) #--- End: if # Update the 'seen' dictionary. Note that grid mappings have # no netCDF dimensions. g['seen'][id(coordref)] = {'variable': coordref, 'ncvar' : ncvar, 'ncdims' : ()} #--- End: if # Update the grid_mapping list in place if multiple_grid_mappings: grid_mapping.append(ncvar+':') coords = sorted([key_to_ncvar[key] for key in coordref.coords]) grid_mapping.extend(coords) else: grid_mapping.append(ncvar) #--- End: def def _create_netcdf_variable(ncvar, dimensions, cfvar, omit=(), extra={}, data_variable=False, g=None): ''' Create a netCDF variable from *cfvar* with name *ncvar* and dimensions *ncdimensions*. The new netCDF variable's properties are given by cfvar.properties(), less any given by the *omit* argument. If a new string-length netCDF dimension is required then it will also be created. The ``seen`` dictionary is updated for *cfvar*. .. note:: This function updates ``g['strlenN']``, ``g['ncdim_to_size']``, ``g['netcdf']``, ``g['nc']``, ``g['seen']``. :Parameters: ncvar : str The netCDF name of the variable. dimensions : tuple The netCDF dimension names of the variable cfvar : cf.Variable The coordinate, cell measure or field object to write to the file. omit : sequence of str, optional extra : dict, optional g : dict :Returns: None ''' # Set the netCDF4.createVariable datatype datatype = _datatype(cfvar, g=g) ncdimensions = dimensions if not cfvar._hasData: data = None else: data = cfvar.Data pda_args = data.pda_args() if datatype == 'S1': # -------------------------------------------------------- # Convert a string data type numpy array into a character # data type ('S1') numpy array with an extra trailing # dimension. # -------------------------------------------------------- strlen = data.dtype.itemsize if strlen > 1: ncdim = _string_length_dimension(strlen, g=g) ncdimensions = dimensions + (ncdim,) data = data.copy() new_axis = data._new_axis_identifier() for partition in data.partitions.flat: array = partition.dataarray(**pda_args) # Convert the partition's string array into a # character array. Note that it is very important # to not change the mutable attributes of the # partition object in-place. if partition.part: partition.part = partition.part + [slice(None)] partition.axes = partition.axes + [new_axis] partition.shape = partition.shape + [strlen] partition.location = partition.location + [(0, strlen)] partition.subarray = _character_array(array) partition.close() #--- End: for data._axes = data._axes + [new_axis] data._shape += (strlen,) data._ndim += 1 data.dtype = datatype pda_args['axes'] = data._axes pda_args['keep_in_memory'] = True #--- End: if # Find the fill value (note that this is set in the call to # netCDF4.createVariable, rather than with setncattr). fill_value = cfvar.fill_value() # Add simple properties (and units and calendar) to the netCDF # variable netcdf_attrs = cfvar.properties for attr in ('units', 'calendar'): value = getattr(cfvar, attr, None) if value is not None: netcdf_attrs[attr] = value #--- End: for netcdf_attrs.update(extra) netcdf_attrs.pop('_FillValue', None) for attr in omit: netcdf_attrs.pop(attr, None) is1d_coord = (isinstance(cfvar, Coordinate) and cfvar.ndim <= 1 or isinstance(cfvar, CoordinateBounds) and cfvar.ndim <= 2) if not g['cfa'] or data.in_memory or is1d_coord: #--------------------------------------------------------- # Write a normal netCDF variable #--------------------------------------------------------- # ------------------------------------------------------------ # Create a new netCDF variable and set the _FillValue # ------------------------------------------------------------ if data_variable: lsd = g['least_significant_digit'] else: lsd = None # Set HDF chunk sizes chunksizes = [size for i, size in sorted(cfvar.HDF_chunks().items())] if chunksizes == [None] * cfvar.ndim: chunksizes = None try: g['nc'][ncvar] = g['netcdf'].createVariable( ncvar, datatype, ncdimensions, fill_value=fill_value, least_significant_digit=lsd, endian=g['endian'], chunksizes=chunksizes, **g['compression'] ) # except (TypeError, RuntimeError): except RuntimeError as error: error = str(error) if error == 'NetCDF: Not a valid data type or _FillValue type mismatch': raise ValueError( "Can't write {0} data from {1!r} to a {2} file. Consider using a netCDF4 format or use the 'single' or 'datatype' parameters or change the datatype before writing.".format( cfvar.dtype.name, cfvar, g['netcdf'].file_format)) message = "Can't create variable in {} file from {} ({})".format(g['netcdf'].file_format, cfvar, error) if error == 'NetCDF: NC_UNLIMITED in the wrong index': raise NetCDFError( message+". Unlimited dimension must be the first (leftmost) dimension of the variable. Consider using a netCDF4 format.") raise NetCDFError(message) #--- End: try _write_attributes(g['nc'][ncvar], netcdf_attrs) #------------------------------------------------------------- # Add data to the netCDF variable # # Note that we don't need to worry about scale_factor and # add_offset, since if a partition's data array is *not* a # numpy array, then it will have its own scale_factor and # add_offset parameters which will be applied when the array # is realised, and the python netCDF4 package will deal with # the case when scale_factor or add_offset are set as # properties on the variable. # ------------------------------------------------------------- if data is not None: # Find the missing data values, if any. if not fill_value: missing_data = None else: _FillValue = getattr(cfvar, '_FillValue', None) missing_value = getattr(cfvar, 'missing_value', None) missing_data = [value for value in (_FillValue, missing_value) if value is not None] pda_args['revert_to_file'] = True # if data._isdt: # # Convert date-time objects to numeric reference times # pda_args['func'] = dt2rt # # Turn off data type checking and partition updating # pda_args['dtype'] = None # pda_args['update'] = False # #--- End: if convert_dtype = g['datatype'] for partition in data.partitions.flat: array = partition.dataarray(**pda_args) # Convert data type new_dtype = convert_dtype.get(array.dtype, None) if new_dtype is not None: array = array.astype(new_dtype) # Check that the array doesn't contain any elements # which are equal to any of the missing data values if missing_data: if partition.masked: temp_array = array.compressed() else: temp_array = array if numpy_intersect1d(missing_data, temp_array): raise ValueError( "ERROR: Can't write field when array has _FillValue or missing_value at unmasked point: {0!r}".format( cfvar)) # Copy the array into the netCDF variable g['nc'][ncvar][partition.indices] = array partition.close() #--- End: for #--- End: if # Update the 'seen' dictionary g['seen'][id(cfvar)] = {'variable': cfvar, 'ncvar' : ncvar, 'ncdims' : dimensions} return elif data is not None: #--------------------------------------------------------- # Write a CFA variable #--------------------------------------------------------- _write_cfa_variable(ncvar, ncdimensions, netcdf_attrs, data, g=g) return #--- End: def def _write_a_field(f, add_to_seen=False, allow_data_expand_dims=True, remove_crap_axes=False, g=None): ''' :Parameters: f : cf.Field add_to_seen : bool, optional allow_data_expand_dims : bool, optional g : dict :Returns: None ''' seen = g['seen'] if add_to_seen: id_f = id(f) org_f = f f = f.copy() data_axes = f.data_axes() domain = f.domain dimensions = domain._axes # Mapping of field axis identifiers to netCDF dimension names axis_to_ncdim = {} # Mapping of field axis identifiers to netCDF scalar coordinate # variable names axis_to_ncscalar = {} # Mapping of field item identifiers to netCDF variable names key_to_ncvar = {} # Initialize the list of the field's auxiliary coordinates coordinates = [] # For each of the field's axes ... for axis in sorted(f.axes()): dim_coord = f.dim(axis) if dim_coord is not None: # -------------------------------------------------------- # A dimension coordinate exists for this axis # -------------------------------------------------------- if axis in data_axes: # The data array spans this axis, so write the # dimension coordinate to the file as a netCDF 1-d # coordinate variable. ncdim = _write_dimension_coordinate(f, axis, dim_coord, key_to_ncvar, axis_to_ncdim, g=g) else: # The data array does not span this axis (and # therefore it must have size 1). if f.items(role=('a', 'm'), axes=axis): # There ARE auxiliary coordinates/cell measures # which span this axis, so write the dimension # coordinate to the file as a netCDF 1-d # coordinate variable. ncdim = _write_dimension_coordinate(f, axis, dim_coord, key_to_ncvar, axis_to_ncdim, g=g) # Expand the field's data array to include this # axis f.expand_dims(0, axes=axis, i=True) else: # There are NO auxiliary coordinates/cell measures # which span this axis, so write the dimension # coordinate to the file as a netCDF scalar # coordinate variable. coordinates = _write_scalar_coordinate(f, axis, dim_coord, coordinates, key_to_ncvar, axis_to_ncscalar, g=g) else: # -------------------------------------------------------- # There is no dimension coordinate for this axis # -------------------------------------------------------- if axis not in data_axes and f.items(role=('a', 'm'), axes=axis): # The data array doesn't span the axis but an # auxiliary coordinate or cell measure does, so expand # the data array to include it. f.expand_dims(0, axes=axis, i=True) data_axes.append(axis) # If the data array (now) spans this axis then create a # netCDF dimension for it if axis in data_axes: try: ncdim = domain.nc_dimensions[axis] except (AttributeError, KeyError): ncdim = 'dim' ncdim, g['dimN'] = _check_name(ncdim, g['dimN'], g=g) unlimited = _unlimited(f, axis, g=g) _write_dimension(ncdim, f, axis, axis_to_ncdim, unlimited=unlimited, g=g) #--- End: for # ---------------------------------------------------------------- # Create auxiliary coordinate variables, except those which might # be completely specified elsewhere by a transformation. # ---------------------------------------------------------------- # Initialize the list of 'coordinates' attribute variable values # (each of the form 'name') for key, aux_coord in sorted(f.auxs().items()): coordinates = _write_auxiliary_coordinate(f, key, aux_coord, coordinates, key_to_ncvar, axis_to_ncdim, g=g) # ---------------------------------------------------------------- # Create cell measures variables # ---------------------------------------------------------------- # Initialize the list of 'cell_measures' attribute values (each of # the form 'measure: name') cell_measures = [] for key, clm in sorted(f.measures().items()): cell_measures = _write_cell_measure(f, key, clm, cell_measures, key_to_ncvar, axis_to_ncdim, g=g) # ---------------------------------------------------------------- # Create grid mapping and formula terms variables # ---------------------------------------------------------------- # Find out if there is more than one grid_mapping multiple_grid_mappings = len([ref for ref in f.refs().values() if ref.type == 'grid_mapping']) > 1 # Initialize the list of 'grid_mapping' attribute netCDF variable # names grid_mapping = [] multiple_grid_mappings = False for coordref in f.refs().values(): coordref_type = coordref.type if coordref_type == 'grid_mapping': # -------------------------------------------------------- # This coordinate reference is a grid mapping # -------------------------------------------------------- _write_grid_mapping(f, coordref, grid_mapping, multiple_grid_mappings, key_to_ncvar, g=g) elif coordref_type == 'formula_terms': # -------------------------------------------------------- # This coordinate reference is a formula_terms # -------------------------------------------------------- formula_terms = [] owning_coord = f.coord(coordref.name, exact=True) if owning_coord is None: # This formula_terms coordinate reference doesn't # match up with an existing coordinate formula_terms = None # Still here? Then create the formula_terms attribute # string for term, value in coordref.iteritems(): if term in coordref.coord_terms: # The value is a pointer to a coordinate value = f.coord(value, exact=True) if value is None: # Do not create broken formula_terms formula_terms = None elif value is None: # Do not create broken formula_terms formula_terms = None else: # Make sure that value is a field if not isinstance(value, Field): data = getattr(value, 'data', None) if data is None: data = Data(value) value = Field(data=data) #--- End: if if not _seen(value, g=g): # The field hasn't yet been written to the # file value.ncvar = getattr(value, 'ncvar', term) _write_a_field(value, add_to_seen=True, g=g) #--- End: if # Record the netCDF variable name of the value # formula_terms string if formula_terms is not None: ncvar = seen[id(value)]['ncvar'] formula_terms.append('%(term)s: %(ncvar)s' % locals()) #--- End: for # Add the formula_terms attribute to the output # variable if formula_terms: ncvar = seen[id(owning_coord)]['ncvar'] g['nc'][ncvar].setncattr('formula_terms', ' '.join(formula_terms)) else: raise ValueError("Ooops: unknown coordinate reference type: %s" % coordref_type) #--- End: for # ---------------------------------------------------------------- # Create ancillary variables # ---------------------------------------------------------------- # Initialize the list of 'ancillary_variables' attribute # values ancillary_variables = [] if hasattr(f, 'ancillary_variables'): for av in f.ancillary_variables: _write_a_field(av, add_to_seen=True, allow_data_expand_dims=False, remove_crap_axes=1, g=g) ancillary_variables.append(seen[id(av)]['ncvar']) # ---------------------------------------------------------------- # Create the data variable # ---------------------------------------------------------------- ncvar = getattr(f, 'ncvar', f.identity(default='data')) ncvar, g['dataN'] = _check_name(ncvar, g['dataN'], g=g) # axis_to_ncdim = g['axis_to_ncdim'] # axis_to_ncscalar = g['axis_to_ncscalar'] ncdimensions = tuple([axis_to_ncdim[axis] for axis in f.data_axes()]) # for dim in domain._axes['data']) extra = {} # Cell measures if cell_measures: extra['cell_measures'] = ' '.join(cell_measures) # Auxiliary/scalar coordinates if coordinates: extra['coordinates'] = ' '.join(coordinates) # Grid mapping if grid_mapping: extra['grid_mapping'] = ' '.join(grid_mapping) # Ancillary variables if ancillary_variables: extra['ancillary_variables'] = ' '.join(ancillary_variables) # Flag values if hasattr(f, 'flag_values'): extra['flag_values'] = f.flag_values # Flag masks if hasattr(f, 'flag_masks'): extra['flag_masks'] = f.flag_masks # Flag meanings if hasattr(f, 'flag_meanings'): extra['flag_meanings'] = ' '.join(f.flag_meanings) # Cell methods cell_methods = getattr(f, 'cell_methods', None) if cell_methods is not None: cell_methods = cell_methods.set_axes(f, override=False) cell_methods = cell_methods.netcdf_names( axis_to_ncdim, axis_to_ncscalar) extra['cell_methods'] = str(cell_methods) # Create a new data variable _create_netcdf_variable(ncvar, ncdimensions, f, omit=g['global_properties'], extra=extra, data_variable=True, g=g) # Update the 'seen' dictionary, if required if add_to_seen: g['seen'][id_f] = {'variable': org_f, 'ncvar' : ncvar, 'ncdims' : ncdimensions} #--- End: def def _unlimited(f, axis, g=None): ''' ''' unlimited = f.unlimited().get(axis) if unlimited is None: unlimited = False for u in g['unlimited']: if f.axis(u) == axis: unlimited = True break return unlimited #--- End: def def _create_global_properties(fields, g=None): ''' Find the netCDF global properties from all of the input fields and write them to the netCDF4.Dataset. .. note:: This function updates ``g['global_properties']``. :Parameters: fields : cf.FieldList g : dict :Returns: None ''' # Data variable properties, as defined in Appendix A, without # those which are not simple. data_properties = set(('add_offset', 'cell_methods', '_FillValue', 'flag_masks', 'flag_meanings', 'flag_values', 'long_name', 'missing_value', 'scale_factor', 'standard_error_multiplier', 'standard_name', 'units', 'valid_max', 'valid_min', 'valid_range', )) # Global properties, as defined in Appendix A global_properties = set(('comment', 'Conventions', 'history', 'institution', 'references', 'source', 'title', )) # Put all non-standard CF properties (i.e. those not in the # data_properties set) into the global_properties set, but # omitting those which have been requested to be on variables. for f in fields: for attr in set(f._simple_properties()) - global_properties - g['variable_attributes']: if attr not in data_properties: global_properties.add(attr) #--- End: for # Remove properties from the new global_properties set which # have different values in different fields f0 = fields[0] for prop in tuple(global_properties): if not f0.hasprop(prop): global_properties.remove(prop) continue prop0 = f0.getprop(prop) if len(fields) > 1: for f in fields[1:]: if (not f.hasprop(prop) or not equals(f.getprop(prop), prop0, traceback=False)): global_properties.remove(prop) break #--- End: for # Write the global properties to the file Conventions = __Conventions__ if g['cfa']: Conventions += ' CFA' g['netcdf'].setncattr('Conventions', Conventions) for attr in global_properties - set(('Conventions',)): g['netcdf'].setncattr(attr, f0.getprop(attr)) g['global_properties'] = global_properties #--- End: def cf-python-1.3.2/cf/netcdf/filearray.py0000600000175000017500000001024012603546021017773 0ustar daviddavid00000000000000from numpy import array as numpy_array from numpy import reshape as numpy_reshape from numpy.ma import masked as numpy_ma_masked from numpy.ma import resize as numpy_ma_resize from numpy.ma import where as numpy_ma_where from operator import mul from .functions import _open_netcdf_file, _close_netcdf_file from ..data.filearray import FileArray # ==================================================================== # # NetCDFFileArray object # # ==================================================================== class NetCDFFileArray(FileArray): ''' A sub-array stored in a netCDF file. **Initialization** :Parameters: file : str The netCDF file name in normalized, absolute form. dtype : numpy.dtype The numpy data type of the data array. ndim : int Number of dimensions in the data array. shape : tuple The data array's dimension sizes. size : int Number of elements in the data array. ncvar : str, optional The netCDF variable name containing the data array. Must be set if *varid* is not set. varid : int, optional The netCDF ID of the variable containing the data array. Must be set if *ncvar* is not set. Ignored if *ncvar* is set. :Examples: >>> import netCDF4 >>> import os >>> nc = netCDF4.Dataset('file.nc', 'r') >>> v = nc.variable['tas'] >>> a = NetCDFFileArray(file=os.path.abspath('file.nc'), ncvar='tas', dtype=v.dtype, ndim=v.ndim, shape=v.shape, size=v.size) ''' def __getitem__(self, indices): ''' x.__getitem__(indices) <==> x[indices] Returns a numpy array. ''' nc = self.open() ncvar = getattr(self, 'ncvar', None) if ncvar is not None: # Get the variable by name array = nc.variables[ncvar][indices] else: # Get the variable by netCDF ID varid = self.varid for value in nc.variables.itervalues(): if value._varid == varid: array = value[indices] break #--- End: if if not self.ndim: # Hmm netCDF4 has a thing for making scalar size 1 , 1d array = array.squeeze() # ------------------------------------------------------------ # If approriate, collapse (by concatenation) the outermost # (fastest varying) dimension of string valued array into # memory. E.g. [['a','b','c']] becomes ['abc'] # ------------------------------------------------------------ if array.dtype.kind == 'S' and array.ndim > self.ndim: strlen = array.shape[-1] new_shape = array.shape[0:-1] new_size = long(reduce(mul, new_shape, 1)) array = numpy_ma_resize(array, (new_size, strlen)) array = array.filled(fill_value='') array = numpy_array([''.join(x).rstrip() for x in array], dtype='S%d' % strlen) array = array.reshape(new_shape) array = numpy_ma_where(array=='', numpy_ma_masked, array) #--- End: if return array #--- End: def def __str__(self): ''' x.__str__() <==> str(x) ''' name = getattr(self, 'ncvar', None) if name is None: name = self.varid return "%s%s in %s" % (name, self.shape, self.file) #--- End: def def close(self): ''' Close the file containing the data array. If the file is not open then no action is taken. :Returns: None :Examples: >>> f.close() ''' _close_netcdf_file(self.file) #--- End: def @property def file_pointer(self): ''' ''' offset = getattr(self, 'ncvar', None) if offset is None: offset = self.varid return (self.file, offset) #--- End: def def open(self): ''' Return a `netCDF4.Dataset` object for the file containing the data array. :Returns: out : netCDF4.Dataset :Examples: >>> f.open() ''' return _open_netcdf_file(self.file, 'r') #--- End: def #--- End: class cf-python-1.3.2/cf/netcdf/functions.py0000644000175000017500000000365712752572326020067 0ustar daviddavid00000000000000from os.path import isfile from netCDF4 import Dataset as netCDF4_Dataset from ..constants import _file_to_fh from ..functions import open_files_threshold_exceeded, close_one_file #if 'netCDF' not in _file_to_fh: # _file_to_fh['netCDF'] = {} _file_to_Dataset = _file_to_fh.setdefault('netCDF', {}) def _open_netcdf_file(filename, mode, fmt='NETCDF4'): ''' Open a netCDF file and read it into a netCDF4.Dataset object. If the file is already open then the existing netCDF4.Dataset object will be returned. :Parameters: filename : str The netCDF file to be opened. :Returns: out : netCDF4.Dataset A netCDF4.Dataset instance for the netCDF file. :Examples: >>> nc1 = _open_netcdf_file('file.nc') >>> nc1 >>> nc2 = _open_netcdf_file('file.nc') >>> nc2 is nc1 True ''' if filename in _file_to_Dataset and mode == 'r': # File is already open return _file_to_Dataset[filename] elif open_files_threshold_exceeded(): # Close a random data file to make way for this one close_one_file() if mode in ('a', 'r+'): if not isfile(filename): nc = netCDF4_Dataset(filename, 'w', format=fmt) nc.close() elif filename in _file_to_Dataset: _close_netcdf_file(filename) try: nc = netCDF4_Dataset(filename, mode, format=fmt) except RuntimeError as runtime_error: raise RuntimeError("{0}: {1}".format(runtime_error, filename)) if mode == 'r': # Update the _file_to_Dataset dictionary _file_to_Dataset[filename] = nc return nc #--- End: def def _close_netcdf_file(filename): ''' Close a netCDF file does nothing if the file is already closed. :Parameters: filename : str The netCDF file to be closed. :Returns: None :Examples: ''' nc = _file_to_Dataset.pop(filename, None) if nc is not None: nc.close() #--- End: def cf-python-1.3.2/cf/__init__.py0000644000175000017500000000770212770452341016340 0ustar daviddavid00000000000000''' `CF `_ is a `netCDF `_ convention which is in wide and growing use for the storage of model-generated and observational data relating to the atmosphere, ocean and Earth system. This package is an implementation of the `CF data model `_, and as such it is an API allows for the full scope of data and metadata interactions described by the CF conventions. With this package you can: * Read `CF-netCDF `_ files, `CFA-netCDF `_ files and UK Met Office fields files and PP files. * Create CF fields. * Write fields to CF-netCDF and CFA-netCDF files on disk. * Aggregate collections of fields into as few multidimensional fields as possible using the `CF aggregation rules `_. * Create, delete and modify a field's data and metadata. * Select and subspace fields according to their metadata. * Perform broadcastable, metadata-aware arithmetic, comparison and trigonometric operation with fields. * Collapse fields by statistical operations. * Sensibly deal with date-time data. * Allow for cyclic axes. * Visualize fields the `cfplot package `_. All of the above use :ref:`LAMA` functionality, which allows multiple fields larger than the available memory to exist and be manipulated. See the `cf-python home page `_ for downloads, installation and source code. ''' __Conventions__ = 'CF-1.5' __author__ = 'David Hassell' __date__ = '2016-09-21' __version__ = '1.3.2' from distutils.version import StrictVersion import imp import platform # Check the version of python if not (StrictVersion('2.6.0') <= StrictVersion(platform.python_version()) < StrictVersion('3.0.0')): raise ValueError( "Bad python version: cf requires 2.6 <= python < 3.0. Got %s" % platform.python_version()) ## Check the version of numpy #import numpy #if StrictVersion(numpy.__version__) < StrictVersion('1.7'): # raise ImportError( # "Bad numpy version: cf %s requires numpy >= 1.7. Got %s" % # (__version__, numpy.__version__)) # ## Check the version of netCDF4 #import netCDF4 #if StrictVersion(netCDF4.__version__) < StrictVersion('0.9.7'): # raise ImportError( # "Bad netCDF4 version: cf %s requires netCDF4 >= 0.9.7. Got %s" % # (__version__, netCDF4.__version__)) try: imp.find_module('ESMF') except ImportError: _found_ESMF = False else: _found_ESMF = True from .variable import Variable from .coordinate import Coordinate, DimensionCoordinate, AuxiliaryCoordinate from .coordinatebounds import CoordinateBounds from .coordinatereference import CoordinateReference from .cellmeasure import CellMeasure from .domain import Domain from .field import Field, FieldList from .read import read from .write import write from .utils import Dict #List, Dict from .units import Units from .cfdatetime import Datetime, dt from .timeduration import TimeDuration, Y, M, D, h, m, s, fix_reftime_units from .data.data import Data from .aggregate import aggregate from .query import (Query, lt, le, gt, ge, eq, ne, contain, wi, wo, set, year, month, day, hour, minute, second, dtlt, dtle, dtgt, dtge, dteq, dtne, cellsize, cellge, cellgt, cellle, celllt, cellwi, cellwo, djf, mam, jja, son, seasons) from .flags import Flags from .cellmethods import CellMethods from .constants import * from .functions import * cf-python-1.3.2/cf/timeduration.py0000644000175000017500000013574212763233136017314 0ustar daviddavid00000000000000import operator from datetime import datetime from functools import partial as functools_partital from numpy import array as numpy_array from numpy import size as numpy_size from numpy import vectorize as numpy_vectorize from cfdatetime import Datetime from .functions import equals from .functions import inspect as cf_inspect from .units import Units from .data.data import Data # Define some useful units _calendar_years = Units('calendar_years') _calendar_months = Units('calendar_months') _days = Units('days') _hours = Units('hours') _minutes = Units('minutes') _seconds = Units('seconds') # ==================================================================== # # TimeDuration object # # ==================================================================== class TimeDuration(object): '''A duration of time. The duration of time is a number of either calendar years, calender months, days, hours, minutes or seconds. **Creating time intervals** A time interval of exactly the time duration, starting or ending at a particular date-time, may be produced with the `interval` method: >>> t = cf.TimeDuration(6, 'calendar_months') >>> t >>> t.interval(1999, 12) (, ) >>> t = cf.TimeDuration(5, 'days', hour=6) >>> t >>> t.interval(2004, 3, 2, end=True) (datetime.datetime(2004, 2, 26, 6, 0), ) >>> t.interval(2004, 3, 2, end=True, calendar='noleap') (, ) >>> t.interval(2004, 3, 2, end=True, calendar='360_day') (, ) >>> t.interval(2004, 3, 2, end=True, calendar='360_day', iso='start and duration') '2004-02-27 06:00:00/P5D' **Arithmetic and comparison operators** Arithmetic and comparison operations are defined for `cf.TimeDuration` objects, `cf.Data` objects, `numpy` arrays and numbers: >>> cf.TimeDuration(2, 'calendar_years') > cf.TimeDuration(1, 'calendar_years') True >>> cf.TimeDuration(2, 'calendar_years') < cf.TimeDuration(25, 'calendar_months') True >>> cf.TimeDuration(2, 'hours') <= cf.TimeDuration(1, 'days') True >>> cf.TimeDuration(2, 'hours') == cf.TimeDuration(1/12.0, 'days') True >>> cf.TimeDuration(2, 'days') == cf.TimeDuration(48, 'hours') True >>> cf.TimeDuration(2, 'days') == cf.Data(2) True >>> cf.TimeDuration(2, 'days') == cf.Data([2.], 'days') True >>> cf.TimeDuration(2, 'days') > cf.Data([[60]], 'seconds') True >>> cf.TimeDuration(2, 'hours') <= 2 True >>> cf.TimeDuration(2, 'days') != 30.5 True >>> cf.TimeDuration(2, 'calendar_years') > numpy.array(1.5) True >>> cf.TimeDuration(2, 'calendar_months') < numpy.array([[12]]) True >>> cf.TimeDuration(30, 'days') + 2 >>> cf.TimeDuration(64, 'calendar_years') - 2.5 >>> cf.TimeDuration(64, 'calendar_years') + cf.TimeDuration(23, 'calendar_months') >>> cf.TimeDuration(36, 'hours') / numpy.array(8) >>> cf.TimeDuration(36, 'hours') / numpy.array(8.0) >>> cf.TimeDuration(36, 'hours') // numpy.array(8.0) >>> cf.TimeDuration(36, 'calendar_months') * cf.Data([[2.25]]) >>> cf.TimeDuration(36, 'calendar_months') // cf.Data([0.825], '10') >>> cf.TimeDuration(36, 'calendar_months') % 10 >>> cf.TimeDuration(36, 'calendar_months') % cf.Data(1, 'calendar_year') >>> cf.TimeDuration(36, 'calendar_months') % cf.Data(2, 'calendar_year') The in place operators (``+=``, ``//=``, etc.) are supported in a similar manner. **Attributes** =========== ========================================================= Attribute Description =========== ========================================================= `!duration` The length of the time duration in a `cf.Data` object with units. `!year` The default year for time interval creation. `!month` The default month for time interval creation. `!day` The default day for time interval creation. `!hour` The default hour for time interval creation. `!minute` The default minute for time interval creation. `!second` The default second for time interval creation. =========== ========================================================= **Constructors** For convenience, the following functions may also be used to create time duration objects: ======== ============================================================ Function Description ======== ============================================================ `cf.Y` Create a time duration of calendar years. `cf.M` Create a time duration of calendar months. `cf.D` Create a time duration of days. `cf.h` Create a time duration of hours. `cf.m` Create a time duration of minutes. `cf.s` Create a time duration of seconds. ======== ============================================================ .. seealso:: `cf.Data`, `cf.Datetime` .. versionadded:: 1.0 ''' def __init__(self, duration, units=None, year=None, month=1, day=1, hour=0, minute=0, second=0): '''**Initialization** :Parameters: duration: data-like The length of the time duration. units: `str`, optional The units of the time duration. Only required if *duration* is not a `cf.Data` object which contains the units. Must be a units string equivalent to calendar years, calendar months, days, hours, minutes or seconds. year, month, day, hour, minute, second: `int` or `None`, optional The default date-time elements for defining when a time interval based on this time duration (created with the `interval` method) begins or ends. See `cf.TimeDuration.interval` for details. :Examples: >>> t = cf.TimeDuration(cf.Data(3 , 'calendar_years')) >>> t = cf.TimeDuration(cf.Data(12 , 'hours')) >>> t = cf.TimeDuration(18 , 'calendar_months') >>> t = cf.TimeDuration(30 , 'days') >>> t = cf.TimeDuration(1 , 'day', hour=6) ''' if units is not None: units = Units(units) self.duration = Data(abs(duration), units) else: self.duration = abs(Data.asdata(duration)) units = self.duration.Units if not (units.iscalendartime or units.istime): raise ValueError( "Can't create %s of %s" % (self.__class__.__name__, self.duration)) self.year = year self.month = month self.day = day self.hour = hour self.minute = minute self.second = second #--- End: def def __array__(self, *dtype): ''' ''' return self.duration.__array__(*dtype) #--- End: def def __data__(self): ''' Returns a new reference to self.duration. ''' return self.duration #--- End: def def __deepcopy__(self, memo): ''' Used if copy.deepcopy is called ''' return self.copy() #--- End: def def __nonzero__(self): ''' Truth value testing and the built-in operation `bool` x.__nonzero__() <==> x != 0 ''' return bool(self.duration) #--- End: if def __float__(self): ''' x.__float__() <==> float(x) ''' return float(self.duration) #--- End: def def __int__(self): ''' x.__int__() <==> int(x) ''' return int(self.duration) #--- End: def def __repr__(self): ''' x.__repr__() <==> repr(x) ''' return '' % (self.__class__.__name__, str(self)) #--- End: def def __str__(self): ''' x.__str__() <==> str(x) ''' year = self.year month = self.month day = self.day hour = self.hour minute = self.minute second = self.second year = 'Y' if year is None else '%d' % year month = 'MM' if month is None else '%02d' % month day = 'DD' if day is None else '%02d' % day hour = 'hh' if hour is None else '%02d' % hour minute = 'mm' if minute is None else '%02d' % minute second = 'ss' if second is None else '%02d' % second return ('%s (from %s-%s-%s %s:%s:%s)' % (self.duration, year, month, day, hour, minute, second)) #--- End: def def __ge__(self, other): ''' The rich comparison operator ``>=`` x__ge__(y) <==> x>=y ''' return bool(self.duration >= other) #--- End: def def __gt__(self, other): ''' The rich comparison operator ``>`` x__gt__(y) <==> x>y ''' return bool(self.duration > other) #--- End: def def __le__(self, other): ''' The rich comparison operator ``<=`` x__le__(y) <==> x<=y ''' return bool(self.duration <= other) #--- End: def def __lt__(self, other): ''' The rich comparison operator ``<`` x__lt__(y) <==> x x==y ''' return bool(self.duration == other) #--- End: def def __ne__(self, other): ''' The rich comparison operator ``!=`` x__ne__(y) <==> x!=y ''' return bool(self.duration != other) #--- End: def def __add__(self, other): ''' The binary arithmetic operation ``+`` x.__add__(y) <==> x + y ''' return self._binary_arithmetic(other, '__add__') #--- End: def def __sub__(self, other): ''' The binary arithmetic operation ``-`` x.__sub__(y) <==> x - y ''' return self._binary_arithmetic(other, '__sub__') #--- End: def def __mul__(self, other): ''' The binary arithmetic operation ``*`` x.__mul__(y) <==> x * y ''' return self._binary_arithmetic(other, '__mul__') #--- End: def def __div__(self, other): ''' The binary arithmetic operation ``/`` x.__div__(y) <==> x / y ''' return self._binary_arithmetic(other, '__div__') #--- End: def def __floordiv__(self, other): ''' The binary arithmetic operation ``//`` x.__floordiv__(y) <==> x // y ''' return self._binary_arithmetic(other, '__floordiv__') #--- End: def def __truediv__(self, other): ''' The binary arithmetic operation ``/`` (true division) x.__truediv__(y) <==> x / y ''' return self._binary_arithmetic(other, '__truediv__') #--- End: def def __pow__(self, other, modulo=None): ''' The binary arithmetic operations ``**`` and ``pow`` x.__pow__(y) <==> x**y ''' if modulo is not None: raise NotImplementedError("3-argument power not supported for '%s'" % self.__class__.__name__) return self._binary_arithmetic(other, '__pow__') #--- End: def def __rpow__(self, other, modulo=None): ''' The binary arithmetic operations ``**`` and ``pow`` with reflected operands x.__rpow__(y) <==> y**x ''' if modulo is not None: raise NotImplementedError("3-argument power not supported for '%s'" % self.__class__.__name__) return self._binary_arithmetic(other, '__rpow__') #--- End: def def __iadd__(self, other): ''' The augmented arithmetic assignment ``+=`` x.__iadd__(y) <==> x += y ''' return self._binary_arithmetic(other, '__iadd__', True) #--- End: def def __idiv__(self, other): ''' The augmented arithmetic assignment ``/=`` x.__idiv__(y) <==> x /= y ''' return self._binary_arithmetic(other, '__idiv__', True) #--- End: def def __itruediv__(self, other): ''' The augmented arithmetic assignment ``/=`` (true division) x.__truediv__(y) <==> x/y ''' return self._binary_arithmetic(other, '__itruediv__', True) #--- End: def def __ifloordiv__(self, other): ''' The augmented arithmetic assignment ``//=`` x.__ifloordiv__(y) <==> x//=y ''' return self._binary_arithmetic(other, '__ifloordiv__', True) #--- End: if def __imul__(self, other): ''' The augmented arithmetic assignment ``*=`` x.__imul__(y) <==> x *= y ''' return self._binary_arithmetic(other, '__imul__', True) #--- End: def def __isub__(self, other): ''' The augmented arithmetic assignment ``-=`` x.__isub__(y) <==> x -= y ''' return self._binary_arithmetic(other, '__isub__', True) #--- End: def def __imod__(self, other): ''' The augmented arithmetic assignment ``%=`` x.__imod__(y) <==> x %= y ''' return NotImplemented #--- End: def def __ipow__(self, other, modulo=None): ''' The augmented arithmetic assignment ``**=`` x.__ipow__(y) <==> x**=yyyy ''' return self._binary_arithmetic(other, '__ipow__', True) #--- End: def def __iadd__(self, other): ''' The augmented arithmetic assignment ``+=`` x.__iadd__(y) <==> x += y ''' return self._binary_arithmetic(other, '__iadd__', True) #--- End: def def __idiv__(self, other): ''' The augmented arithmetic assignment ``/=`` x.__idiv__(y) <==> x /= y ''' return self._binary_arithmetic(other, '__idiv__', True) #--- End: def def __itruediv__(self, other): ''' The augmented arithmetic assignment ``/=`` (true division) x.__truediv__(y) <==> x/y ''' return self._binary_arithmetic(other, '__itruediv__', True) #--- End: def def __ifloordiv__(self, other): ''' The augmented arithmetic assignment ``//=`` x.__ifloordiv__(y) <==> x//=y ''' return self._binary_arithmetic(other, '__ifloordiv__', True) #--- End: if def __imul__(self, other): ''' The augmented arithmetic assignment ``*=`` x.__imul__(y) <==> x *= y ''' return self._binary_arithmetic(other, '__imul__', True) #--- End: def def __radd__(self, other): ''' The binary arithmetic operation ``+`` with reflected operands x.__radd__(y) <==> y+x ''' return self._binary_arithmetic(other, '__add__') #--- End: def def __rmul__(self, other): ''' The binary arithmetic operation ``*`` with reflected operands x.__rmul__(y) <==> y*x ''' return self._binary_arithmetic(other, '__rmul__') #--- End: def def __rsub__(self, other): ''' The binary arithmetic operation ``-`` with reflected operands x.__rsub__(y) <==> y-x ''' return self._binary_arithmetic(other, '__rsub__') #--- End: def def __mod__(self, other): ''' The binary arithmetic operation ``%`` x.__mod__(y) <==> x % y ''' return self.duration % other #--- End: def def __rmod__(self, other): ''' The binary arithmetic operation ``%`` with reflected operands x.__rmod__(y) <==> y % x ''' return other % self.duration #--- End: def # ---------------------------------------------------------------- # Attribute # ---------------------------------------------------------------- def _binary_arithmetic(self, other, method, inplace=False): ''' ''' if inplace: new = self else: new = self.copy() duration = getattr(new.duration, method)(other) duration.squeeze(i=True) if duration.size != 1: raise ValueError("Can't create %s with more than one value: %s" % (self.__class__.__name__, duration)) if duration < 0: raise ValueError("Can't create %s with a negative duration" % self.__class__.__name__) units = duration.Units if not (units.iscalendartime or units.istime): raise ValueError("Can't create %s of %r" % (self.__class__.__name__, units)) duration.Units = self.Units new.duration = duration return new #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def iso(self): '''Return the time duration as an ISO 8601 time duration string. .. versionadded:: 1.0 :Examples: >>> cf.TimeDuration(45, 'days').iso 'P45D' >>> cf.TimeDuration(5, 'seconds').iso 'PT5S' >>> cf.TimeDuration(10, 'calendar_years').iso 'P10Y' >>> cf.TimeDuration(18, 'calendar_months').iso 'P18M' ''' duration = self.duration units = duration.Units if units == _calendar_months: return 'P%dM' % duration.datum() if units == _calendar_years: return 'P%dY' % duration.datum() if units == _days: return 'P%sD' % duration.datum() if units == _hours: return 'PT%sH' % duration.datum() if units == _minutes: return 'PT%sM' % duration.datum() if units == _seconds: return 'PT%sS' % duration.datum() raise ValueError("jkbn p7hg un") #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def isint(self): '''True if the time duration is a whole number. .. versionadded:: 1.0 :Examples: >>> cf.TimeDuration(2, 'hours').isint True >>> cf.TimeDuration(2.0, 'hours').isint True >>> cf.TimeDuration(2.5, 'hours').isint False ''' duration = self.duration if duration.dtype.kind == 'i': return True duration = duration.datum() return int(duration) == float(duration) #--- End: def # ---------------------------------------------------------------- # Attribute # ---------------------------------------------------------------- @property def Units(self): '''The units of the time duration. .. versionadded:: 1.0 :Examples: >>> cf.TimeDuration(3, 'days').Units >>> t = cf.TimeDuration(cf.Data(12, 'calendar_months')) >>> t.Units >>> t.Units = cf.Units('calendar_years') >>> t.Units >>> t ''' return self.duration.Units #--- End: def @Units.setter def Units(self, value): duration = getattr(self, 'duration', None) if duration is None: raise AttributeError("Can't set units when there is no duration attribute") self.duration.Units = value #--- End: def def copy(self): ''' Return a deep copy. ``t.copy()`` is equivalent to ``copy.deepcopy(t)``. .. versionadded:: 1.0 :Returns: out : The deep copy. :Examples: >>> u = t.copy() ''' new = TimeDuration.__new__(TimeDuration) new.year = self.year new.month = self.month new.day = self.day new.hour = self.hour new.minute = self.minute new.second = self.second new.duration = self.duration.copy() return new #--- End: def def equals(self, other, rtol=None, atol=None, traceback=False): ''' True if two time durations are equal. .. seealso:: `equivalent` .. versionadded:: 1.0 :Parameters: other: The object to compare for equality. atol: `float`, optional The absolute tolerance for all numerical comparisons, By default the value returned by the `ATOL` function is used. rtol: `float`, optional The relative tolerance for all numerical comparisons, By default the value returned by the `RTOL` function is used. traceback: `bool`, optional If True then print a traceback highlighting where the two instances differ. :Returns: out: `bool` Whether or not the two instances are equal. :Examples: >>> t = cf.TimeDuration(36, 'calendar_months') >>> u = cf.TimeDuration(3, 'calendar_years') >>> t == u True >>> t.equals(u, traceback=True) TimeDuration: Different durations: , False ''' # Check each instance's id if self is other: return True # Check that each instance is the same type if self.__class__ != other.__class__: if traceback: print("%s: Different type: %s" % (self.__class__.__name__, other.__class__.__name__)) return False #--- End: if self__dict__ = self.__dict__.copy() other__dict__ = other.__dict__.copy() d0 = self__dict__.pop('duration', None) d1 = other__dict__.pop('duration', None) if not equals(d0, d1): if traceback: print("%s: Different durations: %r, %r" % (self.__class__.__name__, d0, d1)) return False #--- End: if if self__dict__ != other__dict__: if traceback: print("%s: Different The default date-time elements: %r != %r" % (self.__class__.__name__, self__dict__, other__dict__)) return False #--- End: if return True #--- End: def def equivalent(self, other, rtol=None, atol=None, traceback=False): ''' True if two time durations are logically equivalent. .. seealso:: `equals` .. versionadded:: 1.0 :Parameters: other: The object to compare for equivalence. atol: `float`, optional The absolute tolerance for all numerical comparisons, By default the value returned by the `ATOL` function is used. rtol: `float`, optional The relative tolerance for all numerical comparisons, By default the value returned by the `RTOL` function is used. traceback: `bool`, optional If True then print a traceback highlighting where the two instances differ. :Returns: out: `bool` Whether or not the two instances logically equivalent. :Examples: >>> t = cf.TimeDuration(36, 'calendar_months') >>> u = cf.TimeDuration(3, 'calendar_years') >>> t == u True >>> t.equivalent(u) True >>> t.equals(u, traceback=True) TimeDuration: Different durations: , False ''' # Check each instance's id if self is other: return True # Check that each instance is the same type if self.__class__ != other.__class__: if traceback: print("%s: Different type: %s" % (self.__class__.__name__, other.__class__.__name__)) return False #--- End: if self__dict__ = self.__dict__.copy() other__dict__ = other.__dict__.copy() d0 = self__dict__.pop('duration', None) d1 = other__dict__.pop('duration', None) if d0 != d0: if traceback: print("%s: Non-equivalent durations: %r, %r" % (self.__class__.__name__, d0, d1)) return False #--- End: if if self__dict__ != other__dict__: if traceback: print("%s: Non-equivalent default date-time elements: %r != %r" % (self.__class__.__name__, self__dict__, other__dict__)) return False #--- End: if return True #--- End: def def inspect(self): ''' Inspect the attributes. .. seealso:: `cf.inspect` .. versionadded:: 1.0 :Returns: None :Examples: >>> t=cf.TimeDuration(9, 'days') >>> t.inspect() ------------------------------------------------- day: 1 duration: hour: 0 minute: 0 month: 1 second: 0 year: None ''' print cf_inspect(self) #--- End: def def interval(self, year=None, month=None, day=None, hour=None, minute=None, second=None, end=False, calendar=None, iso=None): '''Return a time interval of exactly the time duration. The start (or end, if the *end* parameter is True) date-time of the time interval is determined by the `!year`, `!month`, `!day`, `!hour`, `!minute` and `!second` attributes. .. seealso:: `bounds` .. versionadded:: 1.0 :Examples 1: >>> cf.TimeDuration(1, 'calendar_years').interval(1999) (, ) :Parameters: year, month, day, hour, minute, second: `int`, optional The date-time of the start (or end) of the time interval. If any parameter is unset then its value defaults to the attribute of the same name. The time interval calculation requires that all of the parameters have numerical values, so if an unset parameter has a corresponding attribute whose value is `None` then an exception will be raised. *Example:* ``t.interval(year=1999, day=16)`` is equivalent to ``t.interval(1999, t.month, 16, t.hour, t.minute, t.second)``. end: `bool`, optional If True then the date-time given by the *year*, *month*, *day*, *hour*, *minute* and *second* parameters defines the end of the time interval. By default it defines the start of the time interval. calendar: `str`, optional Define a CF calendar for the time interval. By default the Gregorian calendar is assumed. Ignored for time durations of calendar years or calendar months. iso: `str`, optional Return the time interval as an ISO 8601 time interval string rather than the default of a tuple of date-time objects. Valid values are (with example outputs for the time interval "3 years from 2007-03-01 13:00:00"): ======================== ============================================= iso Example output ======================== ============================================= ``'start and end'`` ``'2007-03-01 13:00:00/2010-03-01 13:00:00'`` ``'start and duration'`` ``'2007-03-01 13:00:00/P3Y'`` ``'duration and end'`` ``'P3Y/2010-03-01 13:00:00'`` ======================== ============================================= :Returns: out: 2-tuple of `cf.Datetime` or `datetime.datetime`; or `str` The date-times at each end of the time interval. The first date-time is always earlier than or equal to the second date-time. If *iso* has been set then an ISO 8601 time interval string is returned instead of a tuple. :Examples 2: >>> cf.TimeDuration(1, 'calendar_months').interval(1999, 12) (, ) >>> cf.TimeDuration(2, 'calendar_years').interval(2000, 2, end=True) (, ) >>> cf.TimeDuration(30, 'days').interval(1983, 12, 1, 6) (, ) >>> cf.TimeDuration(30, 'days').interval(1983, 12, 1, 6, end=True) (, ) >>> cf.TimeDuration(0, 'days').interval(1984, 2, 3) (, ) >>> cf.TimeDuration(5, 'days', hour=6).interval(2004, 3, 2, end=True) (, ) >>> cf.TimeDuration(5, 'days', hour=6).interval(2004, 3, 2, end=True, calendar='noleap') (, ) >>> cf.TimeDuration(5, 'days', hour=6).interval(2004, 3, 2, end=True, calendar='360_day') (, ) >>> cf.TimeDuration(19897.546, 'hours').interval(1984, 2, 3, 0) (, ) >>> cf.TimeDuration(19897.546, 'hours').interval(1984, 2, 3, 0, end=True) (, ) Create `cf.Query` objects for a time interval - one including both bounds and one which excludes the upper bound: >>> t = cf.TimeDuration(2, 'calendar_years') >>> interval = t.interval(1999, 12) >>> c = cf.wi(*interval) >>> c , ])> >>> d = cf.ge(interval[0]) & cf.lt(interval[1]) >>> d ) & (lt )]> >>> c == cf.dt('2001-1-1') True >>> d == cf.dt('2001-1-1') False Create a `cf.Query` object which may be used to test where a time coordinate object's bounds lie inside a time interval: >>> t = cf.TimeDuration(1, 'calendar_months') >>> c = cf.cellwi(*t.interval(2000, 1, end=True)) >>> c ) & upper_bounds(le )]> Create ISO 8601 time interval strings: >>> t = cf.TimeDuration(6, 'calendar_years') >>> t.interval(1999, 12, end=True, iso='start and end') '1993-12-01 00:00:00/1999-12-01 00:00:00' >>> t.interval(1999, 12, end=True, iso='start and duration') '1993-12-01 00:00:00/P6Y' >>> t.interval(1999, 12, end=True, iso='duration and end') 'P6Y/1999-12-01 00:00:00' ''' def _dHMS(duration, year, month, day, hour, minute, second, calendar): dt = Datetime(year, month, day, hour, minute, second) units = Units('%s since %s' % (duration.Units, dt), calendar) dt1 = Data(0.0, units) if not end: dt1 += duration else: dt1 -= duration dt1 = dt1.dtarray.item((0,)*dt1.ndim) #asdatetime().datum() if not end: return dt, dt1 else: return dt1, dt #--- End: def if year is None: year = self.year if year is None: raise ValueError( "year must have a value when creating a time interval") if month is None: month = self.month if month is None: raise ValueError( "month must have a value when creating a time interval") if day is None: day = self.day if day is None: raise ValueError( "day must have a value when creating a time interval") if hour is None: hour = self.hour if hour is None: raise ValueError( "hour must have a value when creating a time interval") if minute is None: minute = self.minute if minute is None: raise ValueError( "minute must have a value when creating a time interval") if second is None: second = self.second if second is None: raise ValueError( "second must have a value when creating a time interval") duration = self.duration units = duration.Units if units == _calendar_years: months = duration.datum() * 12 int_months = int(months) if int_months != months: raise ValueError( "Can't create a time interval of a non-integer number of calendar months: %s" % months) elif units == _calendar_months: months = duration.datum() int_months = int(months) if int_months != months: raise ValueError( "Can't create a time interval of a non-integer number of calendar months: %s" % months) else: int_months = None if int_months is not None: if not end: y, month1 = divmod(month + int_months, 12) if not month1: y -= 1 month1 = 12 year1 = year + y dt0 = Datetime(year , month , day, hour, minute, second) dt1 = Datetime(year1, month1, day, hour, minute, second) else: y, month0 = divmod(month - int_months, 12) if not month0: y -= 1 month0 = 12 year0 = year + y dt0 = Datetime(year0, month0, day, hour, minute, second) dt1 = Datetime(year , month , day, hour, minute, second) elif units == _days: dt0, dt1 = _dHMS(duration, year, month, day, hour, minute, second, calendar) elif units == _hours: dt0, dt1 = _dHMS(duration, year, month, day, hour, minute, second, calendar) elif units == _minutes: dt0, dt1 = _dHMS(duration, year, month, day, hour, minute, second, calendar) elif units == _seconds: dt0, dt1 = _dHMS(duration, year, month, day, hour, minute, second, calendar) if not iso: return dt0, dt1 if iso == 'start and end': return '%s/%s' % (dt0, dt1) if iso == 'start and duration': return '%s/%s' % (dt0, self.iso) if iso == 'duration and end': return '%s/%s' % (self.iso, dt1) #--- End: def def bounds(self, year=None, month=1, day=1, hour=0, minute=0, second=0, calendar=None, direction=True): '''.. seealso:: `interval` .. versionadded:: 1.2.3 :Examples 1: >>> :Parameters: direction: bool, optional If False then the bounds are decreasing. By default the bounds are increasing. Note that ``t.bounds(*args, **kwargs, direction=False)`` is equivalent to ``t.bounds(*args, **kwargs)[::-1]``. :Returns: out: `cf.Datetime`, `cf.Datetime` :Examples 2: ''' units = self.Units if units == _calendar_years: dt0, dt1 = self.interval(year, self.month, self.day, self.hour, self.minute, self.second, calendar=calendar) elif units == _calendar_months: dt0, dt1 = self.interval(year, month, self.day, self.hour, self.minute, self.second, calendar=calendar) elif units == _days: dt0, dt1 = self.interval(year, month, day, self.hour, self.minute, self.second, calendar=calendar) elif units == _hours: dt0, dt1 = self.interval(year, month, day, hour, self.minute, self.second, calendar=calendar) elif units == _minutes: dt0, dt1 = self.interval(year, month, day, hour, minute, self.second, calendar=calendar) elif units == _seconds: dt0, dt1 = self.interval(year, month, day, hour, minute, second, calendar=calendar) if dt0 > Datetime(year, month, day, hour, minute, second): dt0, dt1 = self.interval(*dt0.timetuple()[:6], calendar=calendar, end=True) if direction: return dt0, dt1 else: return dt1, dt0 #--- End: def def is_day_factor(self): '''Return True if an integer multiple of the time duration is equal to one day. .. versionadded:: 1.0 :Examples 1: >>> cf.TimeDuration(0.5, 'days').is_day_factor() True :Returns: out: `bool` :Examples 2: >>> cf.TimeDuration(1, 'days').is_day_factor() True >>> cf.TimeDuration(0.25, 'days').is_day_factor() True >>> cf.TimeDuration(0.3, 'days').is_day_factor() False >>> cf.TimeDuration(2, 'days').is_day_factor() False >>> cf.TimeDuration(24, 'hours').is_day_factor() True >>> cf.TimeDuration(6, 'hours').is_day_factor() True >>> cf.TimeDuration(7, 'hours').is_day_factor() False >>> cf.TimeDuration(27, 'hours').is_day_factor() >>> cf.TimeDuration(1440, 'minutes').is_day_factor() True >>> cf.TimeDuration(15, 'minutes').is_day_factor() True >>> cf.TimeDuration(17, 'minutes').is_day_factor() False >>> cf.TimeDuration(2007, 'minutes').is_day_factor() False >>> cf.TimeDuration(86400, 'seconds').is_day_factor() True >>> cf.TimeDuration(45, 'seconds').is_day_factor() True >>> cf.TimeDuration(47, 'seconds').is_day_factor() False >>> cf.TimeDuration(86401, 'seconds').is_day_factor() False >>> cf.TimeDuration(1, 'calendar_months').is_day_factor() False >>> cf.TimeDuration(1, 'calendar_years').is_day_factor() False ''' try: return not Data(1, 'day') % self.duration except ValueError: return False #--- End: class def Y(duration=1, year=None, month=1, day=1, hour=0, minute=0, second=0): '''Return a time duration of calendar years in a `cf.TimeDuration` object. ``cf.Y()`` is equivalent to ``cf.TimeDuration(1, 'calendar_year')``. .. seealso:: `cf.M`, `cf.D`, `cf.h`, `cf.m`, `cf.s` .. versionadded:: 1.0 :Parameters: duration: `int`, optional The number of calendar years in the time duration. Must be a non-negative integer. year, month, day, hour, minute, second: `int`, optional The default date-time elements for defining the start and end of a time interval based on this time duration. See `cf.TimeDuration` and `cf.TimeDuration.interval` for details. *Example:* ``cf.Y(month=12)`` is equivalent to ``cf.TimeDuration(1, 'calendar_years', month=12)``. :Returns: out: `cf.TimeDuration` The new `cf.TimeDuration` object. :Examples: >>> cf.Y() >>> cf.Y(10, month=12) >>> cf.Y(15, month=4, day=2, hour=12, minute=30, second=2) >>> cf.Y(0) ''' return TimeDuration(duration, 'calendar_years', year=year, month=month, day=day, hour=hour, minute=minute, second=second) #--- End: def def M(duration=1, year=None, month=1, day=1, hour=0, minute=0, second=0): '''Return a time duration of calendar months in a `cf.TimeDuration` object. ``cf.M()`` is equivalent to ``cf.TimeDuration(1, 'calendar_month')``. .. seealso:: `cf.Y`, `cf.D`, `cf.h`, `cf.m`, `cf.s` .. versionadded:: 1.0 :Parameters: duration: `int`, optional The number of calendar months in the time duration. Must be a non-negative integer. year, month, day, hour, minute, second: `int`, optional The default date-time elements for defining the start and end of a time interval based on this time duration. See `cf.TimeDuration` and `cf.TimeDuration.interval` for details. *Example:* ``cf.M(day=16)`` is equivalent to ``cf.TimeDuration(1, 'calendar_months', day=16)``. :Returns: out: `cf.TimeDuration` The new `cf.TimeDuration` object. :Examples: >>> cf.M() >>> cf.M(3, day=16) >>> cf.M(24, day=2, hour=12, minute=30, second=2) >>> cf.M(0) ''' return TimeDuration(duration, 'calendar_months', year=year, month=month, day=day, hour=hour, minute=minute, second=second) #--- End: def def D(duration=1, year=None, month=1, day=1, hour=0, minute=0, second=0): '''Return a time duration of days in a `cf.TimeDuration` object. ``cf.D()`` is equivalent to ``cf.TimeDuration(1, 'day')``. .. seealso:: `cf.Y`, `cf.M`, `cf.h`, `cf.m`, `cf.s` .. versionadded:: 1.0 :Parameters: duration: number, optional The number of days in the time duration. Must be non-negative. year, month, day, hour, minute, second: `int`, optional The default date-time elements for defining the start and end of a time interval based on this time duration. See `cf.TimeDuration` and `cf.TimeDuration.interval` for details. *Example:* ``cf.D(hour=12)`` is equivalent to ``cf.TimeDuration(1, 'day', hour=12)``. :Returns: out: `cf.TimeDuration` The new `cf.TimeDuration` object. :Examples: >>> cf.D() >>> cf.D(5, hour=12) >>> cf.D(48.5, minute=30) >>> cf.D(0.25, hour=6, minute=30, second=20) >>> cf.D(0) ''' return TimeDuration(duration, 'days', year=year, month=month, day=day, hour=hour, minute=minute, second=second) #--- End: def def h(duration=1, year=None, month=1, day=1, hour=0, minute=0, second=0): '''Return a time duration of hours in a `cf.TimeDuration` object. ``cf.h()`` is equivalent to ``cf.TimeDuration(1, 'hour')``. .. seealso:: `cf.Y`, `cf.M`, `cf.D`, `cf.m`, `cf.s` .. versionadded:: 1.0 :Parameters: duration: number, optional The number of hours in the time duration. Must be non-negative. year, month, day, hour, minute, second: `int`, optional The default date-time elements for defining the start and end of a time interval based on this time duration. See `cf.TimeDuration` and `cf.TimeDuration.interval` for details. *Example:* ``cf.h(minute=30)`` is equivalent to ``cf.TimeDuration(1, 'hour', minute=30)``. :Returns: out: `cf.TimeDuration` The new `cf.TimeDuration` object. :Examples: >>> cf.h() >>> cf.h(3, minute=15) >>> cf.h(0.5) >>> cf.h(6.5, minute=15, second=45) >>> cf.h(0) ''' return TimeDuration(duration, 'hours', year=year, month=month, day=day, hour=hour, minute=minute, second=second) #--- End: def def m(duration=1, year=None, month=1, day=1, hour=0, minute=0, second=0): '''Return a time duration of minutes in a `cf.TimeDuration` object. ``cf.m()`` is equivalent to ``cf.TimeDuration(1, 'minute')``. .. seealso:: `cf.Y`, `cf.M`, `cf.D`, `cf.h`, `cf.s` .. versionadded:: 1.0 :Parameters: duration: number, optional The number of hours in the time duration. Must be non-negative. year, month, day, hour, minute, second: `int`, optional The default date-time elements for defining when a time interval based on this time duration begins or ends. See `cf.TimeDuration` and `cf.TimeDuration.interval` for details. *Example:* ``cf.m(second=30)`` is equivalent to ``cf.TimeDuration(1, 'minute', second=30)``. :Returns: out: `cf.TimeDuration` The new `cf.TimeDuration` object. :Examples: >>> cf.m() >>> cf.m(30, second=15) >>> cf.m(0.5) >>> cf.m(2.5, second=45) >>> cf.m(0) ''' return TimeDuration(duration, 'minutes', year=year, month=month, day=day, hour=hour, minute=minute, second=second) #--- End: def def s(duration=1, year=None, month=1, day=1, hour=0, minute=0, second=0): '''Return a time duration of seconds in a `cf.TimeDuration` object. ``cf.s()`` is equivalent to ``cf.TimeDuration(1, 'second')``. .. seealso:: `cf.Y`, `cf.M`, `cf.D`, `cf.h`, `cf.m` .. versionadded:: 1.0 :Parameters: duration: number, optional The number of hours in the time duration. Must be non-negative. year, month, day, hour, minute, second: `int`, optional The default date-time elements for defining the start and end of a time interval based on this time duration. See `cf.TimeDuration` and `cf.TimeDuration.interval` for details. *Example:* ``cf.s(hour=6)`` is equivalent to ``cf.TimeDuration(1, 'seconds', hour=6)``. :Returns: out: `cf.TimeDuration` The new `cf.TimeDuration` object. :Examples: >>> cf.s() >>> cf.s().interval(1999, 12, 1) (, datetime.datetime(1999, 12, 1, 0, 0, 1)) >>> cf.s(30) >>> cf.s(0.5) >>> cf.s(12.25) >>> cf.s(2.5, year=1999, hour=12) >>> cf.s(0) ''' return TimeDuration(duration, 'seconds', year=year, month=month, day=day, hour=hour, minute=minute, second=second) #--- End: def def _convert_reftime_units(value, units): duration_units = units._utime.units if not duration_units.startswith('calendar_'): duration_units = 'calendar_'+duration_units t = TimeDuration(value, units=duration_units) reftime = units.reftime.timetuple()[:6] if value > 0: return t.interval(*reftime, calendar=units._calendar, end=False)[1] else: return t.interval(*reftime, calendar=units._calendar, end=True)[0] #--- End: def def fix_reftime_units(data, units=None): ''' The returned array is always independent. :Parameters: data: `cf.Data` units: `cf.Units` :Returns: out: `cf.Data` ''' f = functools_partital(_convert_reftime_units, units=data.Units) if units is None: units = data.Units units = Units('days since '+units.units.split(' since ')[1], calendar=units._calendar) elif not units.isreftime: raise ValueError("'units' parameter must be reference time units") return Data(numpy_vectorize(f, otypes=[object])(data), units=units) #--- End: def cf-python-1.3.2/cf/utils.py0000600000175000017500000007661012603546021015727 0ustar daviddavid00000000000000import collections from copy import deepcopy from operator import truediv as truediv from operator import itruediv as itruediv from .functions import RTOL, ATOL, equals # ==================================================================== # # List object # # ==================================================================== class List(collections.MutableSequence): ''' A list-like object with attributes. ''' def __init__(self, elements=None): ''' **Initialization** :Parameters: sequence : iterable, optional Define a new list with these elements. ''' if not elements: self._list = [] elif isinstance(elements, List): self._list = elements._list else: self._list = list(elements) #--- End: def def __contains__(self, item): ''' Implement membership test operators. x.__contains__(y) <==> y in x Compares objects with the `cf.equals` function rather than their `!__eq__` methods. ''' for x in self._list: if equals(item, x): return True #--- End: for return False #--- End: def def __deepcopy__(self, memo): ''' Used if copy.deepcopy is called on the variable. ''' return self.copy() #--- End: def def __delitem__(self, index): ''' x.__delitem__(index) <==> del x[index] ''' del self._list[index] #--- End: def def __getitem__(self, index): ''' x.__getitem__(index) <==> x[index] ''' if isinstance(index, (int, long)): # index is an integer so return the element return self._list[index] else: # index is a slice, so return a List of the elements return type(self)(self._list[index]) #--- End: def def __len__(self): ''' x.__len__() <==> len(x) ''' return len(self._list) #--- End: def def __repr__(self): ''' x.__repr__() <==> repr(x) ''' return repr(self._list) #--- End: def # def __setattr__(self, attr, value): # ''' # #x.__setattr__(attr, value) <==> x.attr=value # #''' # if hasattr(self, attr): # super(List, self).__setattr__(attr, value) # else: # raise AttributeError("'%s' object has no attribute '%s'" % # (self.__class__.__name__, attr)) # #--- End: def def __setitem__(self, index, value): ''' x.__setitem__(index, value) <==> x[index]=value ''' if not isinstance(value, List): self._list[index] = value else: self._list[index] = value._list #--- End: def def __str__(self): ''' x.__str__() <==> str(x) ''' return str(self._list) #--- End: def def __eq__(self, y): ''' x.__eq__(y) <==> x==y ''' return type(self)([f == y for f in self._list]) #--- End: def def __ne__(self, y): ''' x.__ne__(y) <==> x!=y ''' return type(self)([f != y for f in self._list]) #--- End: def def __ge__(self, y): ''' x.__ge__(y) <==> x>=y ''' return type(self)([f >= y for f in self._list]) #--- End: def def __gt__(self, y): ''' x.__gt__(y) <==> x y for f in self._list]) #--- End: def def __le__(self, y): ''' x.__le__(y) <==> x<=y ''' return type(self)([f <= y for f in self._list]) #--- End: def def __lt__(self, y): ''' x.__lt__(y) <==> x x+y ''' return type(self)([f + y for f in self._list]) #--- End: def def __sub__(self, y): ''' The binary arithmetic operation ``-`` x.__sub__(y) <==> x-y ''' return type(self)([f - y for f in self._list]) #--- End: def def __mul__(self, y): ''' The binary arithmetic operation ``*`` x.__mul__(y) <==> x*y ''' return type(self)([f * y for f in self._list]) #--- End: def def __div__(self, y): ''' The binary arithmetic operation ``/`` x.__div__(y) <==> x/y ''' return type(self)([f / y for f in self._list]) #--- End: def def __floordiv__(self, y): ''' The binary arithmetic operation ``//`` x.__floordiv__(y) <==> x//y ''' return type(self)([f // y for f in self._list]) #--- End: def def __truediv__(self, y): ''' The binary arithmetic operation ``/`` (true division) x.__truediv__(y) <==> x/y ''' # return type(self)([f.__truediv__(y) for f in self._list]) return type(self)([truediv(f, y) for f in self._list]) #--- End: def def __radd__(self, y): ''' x.__radd__(y) <==> y+x ''' return type(self)([y + f for f in self._list]) #--- End: def def __rsub__(self, y): ''' x.__rsub__(y) <==> y-x ''' return type(self)([y - f for f in self._list]) #--- End: def def __rmul__(self, y): ''' x.__rmul__(y) <==> y*x ''' return type(self)([y*f for f in self._list]) #--- End: def def __rdiv__(self, y): ''' x.__rdiv__(y) <==> y/x ''' return type(self)([y/f for f in self._list]) #--- End: def def __rfloordiv__(self, y): ''' x.__rfloordiv__(y) <==> y//x ''' return type(self)([y//f for f in self._list]) #--- End: def def __rtruediv__(self, y): ''' The binary arithmetic operation ``/`` (true division) with reflected operands x.__rtruediv__(y) <==> y/x ''' return type(self)([f.__rtruediv__(y) for f in self._list]) # return type(self)([rtruediv(f, y) for f in self._list]) #--- End: def def __iadd__(self, y): ''' x.__iadd__(y) <==> x+=y ''' for f in self._list: f += y return self #--- End def def __isub__(self, y): ''' x.__isub__(y) <==> x-=y ''' for f in self._list: f -= y return self #--- End def def __imul__(self, y): ''' x.__imul__(y) <==> x*=y ''' for f in self._list: f *= y return self #--- End def def __idiv__(self, y): ''' x.__idiv__(y) <==> x/=y ''' for f in self._list: f /= y return self #--- End def def __ifloordiv__(self, y): ''' x.__ifloordiv__(y) <==> x//=y ''' for f in self._list: f //= y return self #--- End def def __itruediv__(self, y): ''' The augmented arithmetic assignment ``/=`` (true division) x.__itruediv__(y) <==> x/=y ''' for f in self._list: # f.__itruediv__(y) itruediv(f, y) return self #--- End def def __pow__(self, y, modulo=None): ''' The binary arithmetic operations ``**`` and ``pow`` x.__pow__(y) <==> x**y ''' if modulo is not None: raise NotImplementedError( "3-argument power not supported for '%s'" % self.__class__.__name__) return type(self)([f ** y for f in self._list]) #--- End: def def __ipow__(self, y, modulo=None): ''' The augmented arithmetic assignment ``**=`` x.__ipow__(y) <==> x**=y ''' if modulo is not None: raise NotImplementedError( "3-argument power not supported for '%s'" % self.__class__.__name__) for f in self._list: f **= y return self #--- End: def def __rpow__(self, y, modulo=None): ''' The binary arithmetic operations ``**`` and ``pow`` with reflected operands x.__rpow__(y) <==> y**x ''' if modulo is not None: raise NotImplementedError( "3-argument power not supported for '%s'" % self.__class__.__name__) return type(self)([y ** f for f in self._list]) #--- End: def def __and__(self, y): ''' The binary bitwise operation ``&`` x.__and__(y) <==> x&y ''' return type(self)([f & y for f in self._list]) #--- End: def def __iand__(self, y): ''' The augmented bitwise assignment ``&=`` x.__iand__(y) <==> x&=y ''' for f in self._list: f &= y return self #--- End: def def __rand__(self, y): ''' The binary bitwise operation ``&`` with reflected operands x.__rand__(y) <==> y&x ''' return type(self)([y & f for f in self._list]) #--- End: def def __or__(self, y): ''' The binary bitwise operation ``|`` x.__or__(y) <==> x|y ''' return type(self)([f | y for f in self._list]) #--- End: def def __ior__(self, y): ''' The augmented bitwise assignment ``|=`` x.__ior__(y) <==> x|=y ''' for f in self._list: f |= y return self #--- End: def def __ror__(self, y): ''' The binary bitwise operation ``|`` with reflected operands x.__ror__(y) <==> y|x ''' return type(self)([y | f for f in self._list]) #--- End: def def __xor__(self, y): ''' The binary bitwise operation ``^`` x.__xor__(y) <==> x^y ''' return type(self)([f ^ y for f in self._list]) #--- End: def def __ixor__(self, y): ''' The augmented bitwise assignment ``^=`` x.__ixor__(y) <==> x^=y ''' for f in self._list: f ^= y return self #--- End: def def __rxor__(self, y): ''' The binary bitwise operation ``^`` with reflected operands x.__rxor__(y) <==> y^x ''' return type(self)([y ^ f for f in self._list]) #--- End: def def __ixor__(self, y): ''' The augmented bitwise assignment ``^=`` x.__ixor__(y) <==> x^=y ''' for f in self._list: f ^= y return self #--- End: def def __rxor__(self, y): ''' The binary bitwise operation ``^`` with reflected operands x.__rxor__(y) <==> y^x ''' return type(self)([y ^ f for f in self._list]) #--- End: def def __lshift__(self, y): ''' The binary bitwise operation ``<<`` x.__lshift__(y) <==> x< x<<=y ''' for f in self._list: f <<= y return self #--- End: def def __rlshift__(self, y): ''' The binary bitwise operation ``<<`` with reflected operands x.__rlshift__(y) <==> y<>`` x.__rshift__(y) <==> x>>y ''' return type(self)([f >> y for f in self._list]) #--- End: def def __irshift__(self, y): ''' The augmented bitwise assignment ``>>=`` x.__irshift__(y) <==> x>>=y ''' for f in self._list: f >>= y return self #--- End: def def __rrshift__(self, y): ''' The binary bitwise operation ``>>`` with reflected operands x.__rrshift__(y) <==> y>>x ''' return type(self)([y >> f for f in self._list]) #--- End: def def __mod__(self, y): ''' The binary arithmetic operation ``%`` x.__mod__(y) <==> x % y ''' return type(self)([f % y for f in self._list]) #--- End: def def __imod__(self, y): ''' The binary arithmetic operation ``%=`` x.__imod__(y) <==> x %= y ''' for f in self._list: f %= y return self #--- End def def __rmod__(self, other): ''' The binary arithmetic operation ``%`` with reflected operands x.__rmod__(y) <==> y % x ''' return type(self)([y % f for f in self._list]) #--- End: def def __abs__(self): ''' The unary arithmetic operation ``abs`` x.__abs__() <==> abs(x) ''' return type(self)([abs(f) for f in self._list]) #--- End: def def __neg__(self): ''' The unary arithmetic operation ``-`` x.__neg__() <==> -x ''' return type(self)([-f for f in self._list]) #--- End: def def __invert__(self): ''' The unary bitwise operation ``~`` x.__invert__() <==> ~x ''' return type(self)([~f for f in self._list]) #--- End: def def __pos__(self): ''' The unary arithmetic operation ``+`` x.__pos__() <==> +x ''' return type(self)([+f for f in self._list]) #--- End: def # def __add__(self, other): # ''' # #x.__add__(y) <==> x+y # #''' # new = type(self)() # new._list = self._list[:] # new.extend(other) # return new # #--- End: def # # def __iadd__(self, other): # ''' #x.__iadd__(y) <==> x+=y # #''' # self.extend(other) # return self # #--- End: def # # def __mul__(self, other): # ''' #x.__mul__(n) <==> x*n # #''' # return type(self)(self._list * other) # #--- End: def # # def __imul__(self, other): # ''' #x.__imul__(n) <==> x*=n # #''' # self._list = self._list * other # return self # #--- End: def # # def __rmul__(self, other): # ''' #x.__rmul__(n) <==> x*n # #''' # return self.__mul__(other) # #--- End: def def count(self, value): ''' Return the number of occurrences of a value Elements are compared with the `cf.equals` function. ``fl.count(value)`` is equivalent to ``len([None for f in fl if cf.equals(value, f)])``. :Parameters: value : The value to search for in the list. :Returns: out : int The number of occurrences of the value. ''' return len([None for x in self._list if equals(value, x)]) #--- End def def copy(self): ''' Return a deep copy. ``fl.copy()`` is equivalent to ``copy.deepcopy(fl)``. :Returns: out : The deep copy. :Examples: >>> gl = fl.copy() ''' return type(self)(deepcopy(self._list)) #--- End: def def delattr(self, attr): ''' Delete a named attribute on each element of the list. ``fl.delattr(attr)`` is equivalent to ``for f in fl: del f.attr``. :Parameters: attr : str The attribute's name. :Returns: None .. seealso:: `getattr`, `hasattr`, `setattr` :Examples: >>> fl.getattr('foo') ['bar1', 'bar2'] >>> fl.delattr('foo') >>> fl.getattr('foo', None) [None, None] ''' for f in self._list: delattr(f, attr) #--- End: def def equals(self, other, rtol=None, atol=None, ignore_fill_value=False, traceback=False): ''' True if two instances are equal, False otherwise. Two instances are equal if their attributes are equal and their elements are equal pair-wise. :Parameters: other : The object to compare for equality. atol : float, optional The absolute tolerance for all numerical comparisons, By default the value returned by the `ATOL` function is used. rtol : float, optional The relative tolerance for all numerical comparisons, By default the value returned by the `RTOL` function is used. ignore_fill_value : bool, optional traceback : bool, optional If True then print a traceback highlighting where the two instances differ. :Returns: out : bool Whether or not the two instances are equal. ''' if self is other: return True # Check that each instance is the same type if self.__class__ != other.__class__: if traceback: print("%s: Different types: %s, %s" % (self.__class__.__name__, self.__class__.__name__, other.__class__.__name__)) return False #--- End: if # Check that the lists have the same number of elements if len(self) != len(other): if traceback: print("%s: Different attributes: %s, %s" % (self.__class__.__name__, attrs.symmetric_difference(other.__dict__))) return False #--- End: if # Check the attributes attrs = set(self.__dict__) if attrs != set(other.__dict__): if traceback: print("%s: Different attributes: %s, %s" % (self.__class__.__name__, attrs.symmetric_difference(other.__dict__))) return False #--- End: if if rtol is None: rtol = RTOL() if atol is None: atol = ATOL() for attr, value in attrs - set(('_list',)): x = getattr(self, attr) y = getattr(other, attr) if not equals(x, y, rtol=rtol, atol=atol, ignore_fill_value=ignore_fill_value, traceback=traceback): if traceback: print("%s: Different '%s': %s, %s" % (self.__class__.__name__, attr, x, y)) return False #--- End: for # Check the element values for x, y in zip(self._list, other._list): if not equals(x, y, rtol=rtol, atol=atol, ignore_fill_value=ignore_fill_value, traceback=traceback): if traceback: print("%s: Different elements: %r, %r" % (self.__class__.__name__, x, y)) return False #--- End: for return True #--- End: def def getattr(self, attr, *default): ''' Get a named attribute from each element of the list. ``fl.getattr(attr, *default)`` is equivalent to ``cf.List(for f in fl: getattr(f, attr, *default))``. :Parameters: attr : str The attribute's name. default : *optional* When a default argument is given, it is returned when the attribute doesn't exist; without it, an exception is raised in that case. :Returns: out : cf.List Each element's attribute value. .. seealso:: `delattr`, `hasattr`, `setattr` :Examples: >>> fl.getattr('foo') ['bar1', 'bar2'] >>> del fl[1].foo >>> fl.getattr('foo', None) ['bar1', None] ''' return List([getattr(f, attr, *default) for f in self._list]) #--- End: def def hasattr(self, attr): ''' Return whether an attribute exists for each element of the list. ``fl.hasattr(attr)`` is equivalent to ``cf.List(for f in fl: hasattr(f, attr))``. :Parameters: attr : str The attribute's name. :Returns: out : cf.List Whether each element has the attribute. :Examples: .. seealso:: `delattr`, `getattr`, `setattr` >>> fl.getattr('foo') ['bar1', 'bar2'] >>> del fl[1].foo >>> fl.getattr('foo', None) ['bar1', None] ''' return List([getattr(f, attr, *default) for f in self._list]) #--- End: def def index(self, value, start=0, stop=None): ''' Return the first index of a value. Elements are compared with the `cf.equals` function. :Parameters: value : The value to search for in the list. start : int, optional Start looking from this index. By default, look from the beginning of the list. stop : int, optional Stop looking before this index. By default, look up to the end of the list. :Returns: out : int The first index of the value. ''' if start < 0: start = len(self) + start if stop is None: stop = len(self) elif stop < 0: stop = len(self) + stop for i, x in enumerate(self[start:stop]): if equals(value, x): return i + start #--- End: for raise ValueError("%s doesn't contain %r" % (self.__class__.__name__, value)) #--- End: def def insert(self, index, value): # Insert an object before index. self._list.insert(index, value) #--- End: def def iter(self, name, *args, **kwargs): ''' Return an iterator over the results of a method applied to each element. ``fl.iter(name, *args, **kwargs)`` is an equivalent to ``iter(f.name(*args, **kwargs) for f in fl)``. :Parameters: name : str The name of the method to apply to each element. args, kwargs : *optional* The arguments to be used in the call to the named method. :Returns: out : generator An iterator over the results of the named method applied to each element. .. seealso:: `method` ''' return (getattr(f, method)(*args, **kwargs) for f in self._list) #--- End: def def method(self, callable_method, *args, **kwargs): ''' Return an list of the results of a method applied to each element. ``fl.method(name, *args, **kwargs)`` is equivalent to ``cf.List(f.name(*args, **kwargs) for f in fl)``. :Parameters: name : str The name of the method to apply to each element. args, kwargs : *optional* The arguments to be used in the call to the named method. :Returns: out : cf.List The results of the named method applied to each element. .. seealso:: `iter` :Examples: >>> x = cf,List(['a, 'b', 'c']) >>> x.method('upper) ['A, 'B', 'C'] >>> x.method('find', 'a') [0, -1, -1] >>> x ['a, 'b', 'c'] >>> x = cf.List([[3, 2, 1], [6, 5, 4]]) >>> x.method('sort') [None, None, None] >>> x [[1, 2, 3], [4, 5, 6]] ''' return type(self)([getattr(x, callable_method)(*args, **kwargs) for x in self._list]) #--- End: def def setattr(self, attr, value): ''' Set a named attribute on each element of the list. ``fl.setattr(attr, value)`` is equivalent to ``for f in fl: f.attr = value``. :Parameters: attr : str The attribute's name. value : The value to set each attribute. :Returns: None .. seealso:: `delattr`, `getattr`, `hasattr` :Examples: >>> fl.setattr('foo', -99) >>> fl.getattr('foo') [-99, -99] >>> fl.setattr('foo', [1, 2]) >>> fl.getattr('foo') [[1, 2], [1, 2]] ''' for f in self._list: setattr(f, attr, value) #--- End: def def sort(self, cmp=None, key=None, reverse=False): self._list.sort(cmp=cmp, key=key, reverse=reverse) #--- End: class # ==================================================================== # # Dict object # # ==================================================================== class Dict(collections.MutableMapping): ''' A dictionary-like object with attributes. ''' def __init__(self, *args, **kwargs): ''' **Initialization** :Parameters: args, kwargs : *optional* Keys and values are initialized exactly as for a built-in dict. ''' self._dict = dict(*args, **kwargs) #--- End: def def __deepcopy__(self, memo): ''' Used if copy.deepcopy is called on the variable. ''' return self.copy() #--- End: def def __repr__(self): ''' x.__repr__() <==> repr(x) ''' return repr(self._dict) #--- End: def def __str__(self): ''' x.__str__() <==> str(x) ''' return str(self._dict) #--- End: def def __getitem__(self, key): ''' x.__getitem__(key) <==> x[key] ''' return self._dict[key] #--- End: def def __setitem__(self, key, value): ''' x.__setitem__(key, value) <==> x[key]=value ''' self._dict[key] = value #--- End: def def __delitem__(self, key): ''' x.__delitem__(key) <==> del x[key] ''' del self._dict[key] #--- End: def def __iter__(self): ''' x.__iter__() <==> iter(x) ''' return iter(self._dict) #--- End: def def __len__(self): ''' x.__len__() <==> len(x) ''' return len(self._dict) #--- End: def # def __contains__(self, item): # ''' #Test for set membership using numerically tolerant equality. #''' # for s in self: # if equals(item, s): # return True # # return False # #--- End: def def __eq__(self, y): ''' x.__eq__(y) <==> x==y <==> x.equals(y) ''' return self.equals(y) #--- End: def def __ne__(self, y): ''' x.__ne__(y) <==> x!=y <==> not x.equals(y) ''' return not self.__eq__(y) #--- End: def def copy(self): ''' Return a deep copy. ``d.copy()`` is equivalent to ``copy.deepcopy(d)``. :Returns: out : The deep copy. :Examples: >>> e = d.copy() ''' new = type(self)() for attr, value in self.__dict__.iteritems(): setattr(new, attr, deepcopy(value)) return new #--- End: def def equals(self, other, rtol=None, atol=None, ignore_fill_value=False, traceback=False): ''' True if two instances are logically equal, False otherwise. :Parameters: other : The object to compare for equality. atol : float, optional The absolute tolerance for all numerical comparisons, By default the value returned by the `ATOL` function is used. rtol : float, optional The relative tolerance for all numerical comparisons, By default the value returned by the `RTOL` function is used. ignore_fill_value : bool, optional If True then data arrays with different fill values are considered equal. By default they are considered unequal. traceback : bool, optional If True then print a traceback highlighting where the two instances differ. :Returns: out : bool Whether or not the two instances are equal. :Examples: ''' if self is other: return True # Check that each instance is the same type if self.__class__ != other.__class__: if traceback: print("%s: Different types: %s, %s" % (self.__class__.__name__, self.__class__.__name__, other.__class__.__name__)) return False #--- End: if # # Check the attributes # attrs = set(self.__dict__) # if attrs != set(other.__dict__): # if traceback: # print("%s: Different attributes: %s" % # (self.__class__.__name__, # attrs.symmetric_difference(other.__dict__))) # return False # #--- End: if if rtol is None: rtol = RTOL() if atol is None: atol = ATOL() # for attr in attrs.difference(('_dict',)): # x = getattr(self, attr) # y = getattr(other, attr) # if not equals(x, y, rtol=rtol, atol=atol, ignore_fill_value=ignore_fill_value, traceback=traceback): # if traceback: # print("%s: Different '%s' attributes: %s, %s" % # (self.__class__.__name__, attr, x, y)) # return False # #--- End: for # Check that the keys are equal if set(self) != set(other): if traceback: print("%s: Different keys: %s" % (self.__class__.__name__, set(self).symmetric_difference(other))) return False #--- End: if # Check that the key values are equal for key, value in self.iteritems(): if not equals(value, other[key], rtol=rtol, atol=atol, ignore_fill_value=ignore_fill_value, traceback=traceback): if traceback: print("%s: Different '%s' values: %r, %r" % (self.__class__.__name__, key, value, other[key])) return False #--- End: for # Still here? return True #--- End: def def has_key(self, key): ''' ''' return self._dict.has_key(key) #--- End: def #--- End: class # ==================================================================== # # Set object # # ==================================================================== class Set(collections.MutableSet): ''' A dictionary-like object with attributes. ''' def __init__(self, arg=None): ''' ''' if arg: self._set = set(arg) else: self._set = set() #--- End: def def __deepcopy__(self, memo): ''' Used if copy.deepcopy is called on the variable. ''' return self.copy() #--- End: def def __repr__(self): ''' x.__repr__() <==> repr(x) ''' return '%s(%s)' % (self.__class__.__name__, list(self._set)) #--- End: def def __str__(self): ''' x.__str__() <==> str(x) ''' return repr(self) #--- End: def def __iter__(self): ''' x.__iter__() <==> iter(x) ''' return iter(self._set) #--- End: def def __len__(self): ''' x.__len__() <==> len(x) ''' return len(self._set) #--- End: def def __contains__(self, item): ''' ''' for x in self._set: if equals(item, x): return True return False #--- End: def def __eq__(self, y): ''' x.__eq__(y) <==> x==y <==> x.equals(y) ''' return self.equals(y) #--- Ens=Set(d: def def __ne__(self, y): ''' x.__ne__(y) <==> x!=y <==> not x.equals(y) ''' return not self.equals(y) #--- End: def def add(self, item): ''' Add an element to a set. This has no effect if the element is already present. ''' self._set.add(item) #--- End: def def clear(self): ''' Remove all elements from this set. ''' self._set.clear() #--- End: def def copy(self): ''' Return a deep copy. ``s.copy()`` is equivalent to ``copy.deepcopy(s)``. :Returns: out : The deep copy. :Examples: >>> t = s.copy() ''' return type(self)(self._set) #--- End: def def discard(self, item): ''' Remove an element from a set if it is a member. If the element is not a member, do nothing. ''' if self is other: return True # Check that each instance is the same type if self.__class__ != other.__class__: if traceback: print("%s: Different types: %s, %s" % (self.__class__.__name__, self.__class__.__name__, other.__class__.__name__)) return False #--- End: if # self._set.discard(item) #--- End: def def equals(self, other, ignore_fill_value=False, traceback=False): ''' True if two instances are logically equal, False otherwise. :Parameters: ignore_fill_value : bool, optional Ignored. traceback : bool, optional Ignored. :Returns: out : bool Whether or not the two instances are equal. :Examples: ''' if self is other: return True # Check that each instance is the same type if self.__class__ != other.__class__: if traceback: print("%s: Different types: %s, %s" % (self.__class__.__name__, self.__class__.__name__, other.__class__.__name__)) return False #--- End: if return self._set == other._set #--- End: def def update(self, x): ''' Update a set with the union of itself and others. ''' self._set.update(x) #--- End: def #--- End: class cf-python-1.3.2/cf/coordinatereference.py0000644000175000017500000011052512756631462020614 0ustar daviddavid00000000000000import os from csv import reader as csv_reader from re import match as re_match from . import __file__ from .utils import Dict from .functions import RTOL, ATOL, equals, allclose from .functions import inspect as cf_inspect from .query import Query from .units import Units from .data.data import Data # -------------------------------------------------------------------- # Map coordinate conversion names to their CF-netCDF types # -------------------------------------------------------------------- _type = {} _file = os.path.join(os.path.dirname(__file__), 'etc/coordinate_reference/type.txt') for x in csv_reader(open(_file, 'r'), delimiter=' ', skipinitialspace=True): if not x or x[0] == '#': continue _type[x[0]] = x[1] # -------------------------------------------------------------------- # Map coordinate conversion names to their # -------------------------------------------------------------------- _coordinates = {} _file = os.path.join(os.path.dirname(__file__), 'etc/coordinate_reference/coordinates.txt') for x in csv_reader(open(_file, 'r'), delimiter=' ', skipinitialspace=True): if not x or x[0] == '#': continue _coordinates[x[0]] = set(x[1:]) # -------------------------------------------------------------------- # Map coordinate conversion terms to their terms default values # -------------------------------------------------------------------- _default_values = {} _file = os.path.join(os.path.dirname(__file__), 'etc/coordinate_reference/default_values.txt') for x in csv_reader(open(_file, 'r'), delimiter=' ', skipinitialspace=True): if not x or x[0] == '#': continue _default_values[x[0]] = float(x[1]) # -------------------------------------------------------------------- # Map coordinate conversion terms to their canonical units # -------------------------------------------------------------------- _canonical_units = {} _file = os.path.join(os.path.dirname(__file__), 'etc/coordinate_reference/canonical_units.txt') for x in csv_reader(open(_file, 'r'), delimiter=' ', skipinitialspace=True): if not x or x[0] == '#': continue try: _canonical_units[x[0]] = Units(x[1]) except: pass # -------------------------------------------------------------------- # Map coordinate reference names to their terms which may take # non-constant values (i.e. pointers to coordinate objects or # non-scalar field objects). # -------------------------------------------------------------------- _non_constant_terms = {} _file = os.path.join(os.path.dirname(__file__), 'etc/coordinate_reference/non_constant_terms.txt') for x in csv_reader(open(_file, 'r'), delimiter=' ', skipinitialspace=True): if not x or x[0] == '#' or len(x) == 1: continue _non_constant_terms[x[0]] = set(x[1:]) # ==================================================================== # # CoordinateReference object # # ==================================================================== _units = {} class CoordinateReference(Dict): '''A CF coordinate reference construct. A coordinate reference construct relates the field's coordinate values to locations in a planetary reference frame. The coordinate reference object is associated with a coordinate system and contains links to the dimension or auxiliary coordinate constructs to which it applies; and any additional terms, such as parameter values and field objects which define a datum and coordinate conversion, i.e. a formula for converting coordinate values taken from the dimension or auxiliary coordinate objects to a different coordinate system. **Accessing terms** The coordinate reference object behaves like a dictionary when it comes to accessing its terms and their values: For example: >>> c = cf.CoordinateReference('azimuthal_equidistant', ... longitude_of_projection_origin=80.5, ... latitude_of_projection_origin=5, ... false_easting=cf.Data(-200, 'km'), ... false_northing=cf.Data(-100, 'km')) >>> c.keys() ['false_easting', 'latitude_of_projection_origin', 'false_northing', 'longitude_of_projection_origin'] >>> c.items() [('false_easting', ), ('latitude_of_projection_origin', 5), ('false_northing', ), ('longitude_of_projection_origin', 80.5)] >>> c['latitude_of_projection_origin'] 5 >>> c['latitude_of_projection_origin'] = -75.25 >>> c['latitude_of_projection_origin'] -75.25 **Attributes** ============== ====================================================== Attribute Description ============== ====================================================== `!name` The identity of the coordinate reference. `!type` The CF type of the coordinate reference. `!coords` The identities of the dimension and auxiliary coordinate objects of the which apply to this coordinate reference. `!coord_terms` The terms of the coordinate conversion which refer to dimension or auxiliary coordinate objects. ============== ====================================================== ''' def __init__(self, name=None, crtype=None, coords=None, coord_terms=None, **kwargs): '''**Initialization** :Parameters: name: str, optional A name which describes the nature of the coordinate conversion. This is usually a CF grid_mapping name or the standard name of a CF dimensionless vertical coordinate, but is not restricted to these. Example: To create a polar stereographic coordinate reference: ``name='polar_stereographic'``. To create coordinate reference for an ocean sigma over z coordinate: ``name='ocean_sigma_z_coordinate'``. To create new type of coordinate reference: ``name='my_new_type'``. crtype: str, optional The CF type of the coordinate reference. This is either ``'grid_mapping'`` or ``'formula_terms'``. By default the type is inferred from the *name*, if possible. For example: >>> c = cf.CoordinateReference('transverse_mercator') >>> c.type 'grid_mapping' >>> c = cf.CoordinateReference('my_new_type', crtype='formula_terms') >>> c.type 'formula_terms' >>> c = cf.CoordinateReference('my_new_type') >>> print c.type None >>> c = cf.CoordinateReference('my_new_type', crtype='grid_mapping') >>> print c.type 'grid_mapping' coords: sequence of str, optional Identify the dimension and auxiliary coordinate objects which apply to this coordinate reference. By default the standard names of those expected by the CF conventions are used. For example: >>> c = cf.CoordinateReference('transverse_mercator') >>> c.coords {'latitude', 'longitude', 'projection_x_coordinate', 'projection_y_coordinate'} >>> c = cf.CoordinateReference('transverse_mercator', coords=['ncvar:lat']) >>> c.coords {'ncvar:lat'} coord_terms: sequence of str, optional The terms of the coordinate conversion which refer to dimension or auxiliary coordinate objects. For example: >>> c = cf.CoordinateReference('lambert_conformal_conic') >>> c.coord_terms set() >>> c = cf.CoordinateReference('atmosphere_hybrid_height_coordinate', ... coord_terms=['a', 'b']) >>> c.coord_terms {'a', 'b'} kwargs: *optional* The terms of the coordinate conversion and their values. A term's values may be one of the following: * A number or size one numeric array. * A string containing a coordinate object's identity. * A Field. * `None`, indicating that the term exists but is unset. For example: >>> c = cf.CoordinateReference('orthographic', ... grid_north_pole_latitude=70, ... grid_north_pole_longitude=cf.Data(120, 'degreesE')) >>> c['grid_north_pole_longitude'] >>> orog_field >>> c = cf.CoordinateReference('atmosphere_hybrid_height_coordinate', ... a='long_name:ak', ... b='long_name:bk', ... orog=orog_field) ''' super(CoordinateReference, self).__init__(**kwargs) t = _type.get(name, None) if t is not None: if crtype is not None and crtype != t: raise ValueError("345|") crtype = t #--- End: if # standard_coords = {} # for coord in _coordinates.get(name, ()): # standard_coords[coord] = coord if coords is None: coords = set(_coordinates.get(name, ())) # coords = set(standard_coords) else: coords = set(coords) if coord_terms: coords.update([kwargs[term] for term in coord_terms if term in kwargs]) coord_terms = set(coord_terms) else: coord_terms = set() self.type = crtype self.name = name self.coords = coords self.coord_terms = coord_terms # self._standard_coords = standard_coords #--- End: def def __delitem__(self, item): ''' x.__delitem__(key) <==> del x[key] ''' super(CoordinateReference, self).__delitem__(item) self.coord_terms.discard(item) #--- End: def def __eq__(self, other): ''' The rich comparison operator ``==`` x.__eq__(y) <==> x==y ''' return self.equals(other) #--- End: def def __ne__(self, other): ''' The rich comparison operator ``!=`` x.__ne__(y) <==> x!=y ''' return not self.equals(other) #--- End: def def __hash__(self): ''' x.__hash__() <==> hash(x) ''' if self.type == 'formula_terms': raise ValueError("Can't hash a formula_terms %s" % self.__class__.__name__) h = sorted(self.items()) h.append(self.identity()) return hash(tuple(h)) #--- End: def def __repr__(self): ''' The built-in function `repr` x.__repr__() <==> repr(x) ''' try: return '' % (self.__class__.__name__, self.identity('')) except AttributeError: return '' % self.__class__.__name__ #--- End: def # def __setitem__(self, item, value): # ''' # #x.__setitem__(key, value) <==> x[key]=value# # #''' # if item == 'crs_wkt': # # Bodge for crs_wkt # super(CoordinateReference, self).__setitem__(item, value) # return # # if item in self: # old = self.pop(item) # self.coord_terms.discard(item) # if isinstance(old, basestring) and old not in self.values(): # self.coords.discard(old) # #-- End: if # # super(CoordinateReference, self).__setitem__(item, value) # # # Add string values to the coordinates sets # if isinstance(value, basestring): # self.coords.add(value) # self.coord_terms.add(item) # #--- End: def def __str__(self): ''' The built-in function `str` x.__str__() <==> str(x) ''' return 'Coord reference : %r' % self #--- End: def def _parse_match(self, match): ''' Called by def match ''' if not match: return () if isinstance(match, (basestring, dict, Query)): match = (match,) matches = [] for m in match: if isinstance(m, dict): # Dictionary matches.append(m) else: matches.append({None: m}) #--- End: for return matches #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def hasbounds(self): ''' False :Examples: >>> c.hasbounds False ''' return False #--- End: def @classmethod def canonical_units(cls, term): '''Return the canonical units for a standard CF coordinate conversion term. :Parameters: term: str The name of the term. :Returns: out: cf.Units or None The canonical units, or `None` if there are not any. :Examples: >>> cf.CoordinateReference.canonical_units('perspective_point_height') >>> cf.CoordinateReference.canonical_units('ptop') None ''' return _canonical_units.get(term, None) #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def T(self): ''' False. Provides compatibility with the `cf.Coordinate` API. .. seealso:: `cf.Coordinate.T`, `X`, `~cf.CoordinateReference.Y`, `Z` :Examples: >>> c.T False ''' return False #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def X(self): ''' Returns False. Provides compatibility with the `cf.Coordinate` API. .. seealso:: `cf.Coordinate.X`, `T`, `~cf.CoordinateReference.Y`, `Z` :Examples: >>> c.X False ''' return False #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def Y(self): ''' Returns False. Provides compatibility with the `cf.Coordinate` API. .. seealso:: `cf.Coordinate.Y`, `T`, `X`, `Z` :Examples: >>> c.Y False ''' return False #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def Z(self): ''' Returns False. Provides compatibility with the `cf.Coordinate` API. .. seealso:: `cf.Coordinate.Z`, `T`, `X`, `~cf.CoordinateReference.Y` :Examples: >>> c.Z False ''' return False #--- End: def def close(self): ''' Close all files referenced by coordinate conversion term values. :Returns: None :Examples: >>> c.close() ''' for value in self.itervalues(): if hasattr(value, 'close'): value.close() #--- End: def def copy(self, domain=None): ''' Return a deep copy. ``c.copy()`` is equivalent to ``copy.deepcopy(c)``. :Examples 1: >>> d = c.copy() :Parameters: domain: cf.Domain, optional :Returns: out: The deep copy. :Examples 2: >>> domain >>> d = c.copy(domain=domain) ''' X = type(self) new = X.__new__(X) coord_terms = self.coord_terms.copy() new.coord_terms = coord_terms new.coords = self.coords.copy() # new._standard_coords = self._standard_coords.copy() new.name = self.name new.type = self.type _dict = {} for term, value in self._dict.iteritems(): if (term in coord_terms or value is None or not hasattr(value, 'copy')): _dict[term] = value else: _dict[term] = value.copy() #--- End: for new._dict = _dict if domain is not None: # -------------------------------------------------------- # Replace coordinate identifiers with coordinate names # derived from a domain object # -------------------------------------------------------- coord_map = {} for name in new.coords: coord = domain.item(name, role=('d', 'a',), exact=True) if coord is not None: coord_map[name] = coord.name(default=None, identity=True) #--- End: for new.change_coord_identities(coord_map, i=True) #--- End: if return new #---End: def @classmethod def default_value(cls, term): ''' Return the default value for an unset standard CF coordinate conversion term. The default values are stored in the file cf/etc/coordinate_reference/default_values.txt. :Parameters: term: str The name of the term. :Returns: out: The default value, or `None` if there is not one. :Examples: >>> cf.CoordinateReference.default_value('ptop') 0.0 >>> print cf.CoordinateReference.default_value('north_pole_grid_latitude') None ''' return _default_values.get(term, None) #--- End: def def dump(self, complete=False, display=True, _level=0, domain=None): ''' Return a string containing a full description of the coordinate reference. :Parameters: complete: bool, optional display: bool, optional If False then return the description as a string. By default the description is printed, i.e. ``c.dump()`` is equivalent to ``print c.dump(display=False)``. domain: cf.Domain, optional :Returns: out: str A string containing the description. :Examples: ''' indent0 = ' ' * _level indent1 = ' ' * (_level+1) try: string = ['%sCoordinate reference: %s' % (indent0, self.identity(''))] except AttributeError: string = ['%sCoordinate reference: ' % indent0] if domain: coord_keys = domain.items(role='da') for key, value in sorted(self.iteritems()): if value in coord_keys: string.append("%s%s = %r" % (indent1, key, domain.get(value))) else: # value is a field if complete and hasattr(value, 'domain'): string.append( "%s%s = \n%s" % (indent1, key, value.dump( complete=False, display=False, _level=_level+2, _title='Coordinate reference field', _q='-'))) else: string.append("%s%s = %r" % (indent1, key, value)) else: for key, value in sorted(self.iteritems()): if complete and hasattr(value, 'domain'): # value is a field string.append("%s%s = \n%s" % (indent1, key, value.dump(complete=False, display=False, _level=_level+2, _title='Coordinate reference field', _q='-'))) else: string.append("%s%s = %r" % (indent1, key, value)) #--- End: if string = '\n'.join(string) if display: print string else: return string #--- End: def def equals(self, other, rtol=None, atol=None, ignore_fill_value=False, traceback=False): ''' True if two instances are equal, False otherwise. :Parameters: other: The object to compare for equality. atol: float, optional The absolute tolerance for all numerical comparisons, By default the value returned by the `ATOL` function is used. rtol: float, optional The relative tolerance for all numerical comparisons, By default the value returned by the `RTOL` function is used. ignore_fill_value: bool, optional If True then data arrays with different fill values are considered equal. By default they are considered unequal. traceback: bool, optional If True then print a traceback highlighting where the two instances differ. :Returns: out: bool Whether or not the two instances are equal. :Examples: ''' if self is other: return True # Check that each instance is the same type if self.__class__ != other.__class__: if traceback: print("%s: Different types: %s, %s" % (self.__class__.__name__, self.__class__.__name__, other.__class__.__name__)) return False #--- End: if # ------------------------------------------------------------ # Check the name # ------------------------------------------------------------ if self.name != other.name: if traceback: print( "%s: Different names (%s != %s)" % (self.__class__.__name__, self.name, other.name)) return False #--- End: if if rtol is None: rtol = RTOL() if atol is None: atol = ATOL() # ------------------------------------------------------------ # Check that the same terms are present # ------------------------------------------------------------ if set(self) != set(other): if traceback: print( "%s: Different collections of terms (%s != %s)" % (self.__class__.__name__, set(self), set(other))) return False #--- End: if # Check that the coordinate terms match coord_terms0 = self.coord_terms coord_terms1 = other.coord_terms if coord_terms0 != coord_terms1: if traceback: print( "%s: Different coordinate-valued terms (%s != %s)" % (self.__class__.__name__, coord_terms0, coord_terms1)) return False #--- End: if # ------------------------------------------------------------ # Check that the term values are equal. # # If the values for a particular term are both undefined or # are both pointers to coordinates then they are considered # equal. # ------------------------------------------------------------ coords0 = self.coords coords1 = other.coords if len(coords0) != len(coords1): if traceback: print( "%s: Different sized collections of coordinates (%d != %d)" % (self.__class__.__name__, len(coords0), len(coords1))) return False #--- End: if for term, value0 in self.iteritems(): if term in coord_terms0 and term in coord_terms1: # Term values are coordinates in both coordinate # references continue value1 = other[term] if value0 is None and value1 is None: # Term values are None in both coordinate # references continue if equals(value0, value1, rtol=rtol, atol=atol, ignore_fill_value=ignore_fill_value, traceback=traceback): # Term values are the same in both coordinate # references continue # Still here? Then the two coordinate references are not # equal. if traceback: print( "%s: Unequal '%s' terms (%r != %r)" % (self.__class__.__name__, term, value0, value1)) return False #--- End: for # ------------------------------------------------------------ # Still here? Then the two coordinate references are as equal # as can be ascertained in the absence of domains. # ------------------------------------------------------------ return True #--- End: def def equivalent(self, other, atol=None, rtol=None, traceback=False): '''True if two coordinate references are logically equal, False otherwise. :Parameters: other: cf.CoordinateReference The object to compare for equality. atol: float, optional The absolute tolerance for all numerical comparisons, By default the value returned by the `cf.ATOL` function is used. rtol: float, optional The relative tolerance for all numerical comparisons, By default the value returned by the `cf.RTOL` function is used. traceback: bool, optional If True then print a traceback highlighting where the two instances differ. :Returns: out: bool Whether or not the two objects are equivalent. :Examples: >>> ''' if self is other: return True # Check that each instance is the same type if self.__class__ != other.__class__: if traceback: print("%s: Different types (%r != %r)" % (self.__class__.__name__, self.__class__.__name__, other.__class__.__name__)) return False #--- End: if # ------------------------------------------------------------ # Check the name # ------------------------------------------------------------ if self.name != other.name: if traceback: print("%s: Different names (%r != %r)" % (self.__class__.__name__, self.name, other.name)) return False #--- End: if if rtol is None: rtol = RTOL() if atol is None: atol = ATOL() # Check that the term values are equal. # # If the values for a particular key are both undefined or # pointers to coordinates, then they are considered equal. coords0 = self.coords coords1 = other.coords for term in set(self).union(other): if term in self.coord_terms and term in other.coord_terms: # ---------------------------------------------------- # Both terms are coordinates # ---------------------------------------------------- continue value0 = self.get(term, None) value1 = other.get(term, None) if value1 is None and value0 is None: # ---------------------------------------------------- # Both terms are undefined # ---------------------------------------------------- continue if value1 is None: t, value = self, value0 elif value0 is None: t, value = other, value1 else: t = None if t is not None: # ---------------------------------------------------- # Exactly one term is undefined # ---------------------------------------------------- if term in t.coord_terms: # Term is a coordinate continue default = t.default_value(term) if default is None: if traceback: print("%s: Unequivalent %r term" % (self.__class__.__name__, term)) return if not allclose(value, default, rtol=rtol, atol=atol): if traceback: print("%s: Unequivalent %r term" % (self.__class__.__name__, term)) return #--- End: if # ---------------------------------------------------- # Both terms are defined and are not coordinates # ---------------------------------------------------- if not allclose(value0, value1, rtol=rtol, atol=atol): if traceback: print("%s: Unequivalent %r term (%r != %r)" % (self.__class__.__name__, term, value0, value1)) return False #--- End: for # Still here? return True #--- End: def def identity(self, default=None): '''Return the identity of the coordinate reference. The identity is the standard_name of a formula_terms-type coordinate reference or the grid_mapping_name of grid_mapping-type coordinate reference. :Parameters: default: optional If the coordinate reference has no identity then return *default*. By default, *default* is None. :Returns: out: The identity. :Examples: >>> c.identity() 'rotated_latitude_longitude' >>> c.identity() 'atmosphere_hybrid_height_coordinate' ''' return getattr(self, 'name', default) #--- End: def def inspect(self): ''' Inspect the attributes. .. seealso:: `cf.inspect` :Returns: None ''' print cf_inspect(self) #--- End: def def match(self, match=None, exact=False, match_all=True, inverse=False): '''Test whether or not the coordinate reference satisfies the given conditions. :Returns: out: bool True if the coordinate reference satisfies the given criteria, False otherwise. :Examples: ''' conditions_have_been_set = False something_has_matched = False matches = self._parse_match(match) if not match: return True if isinstance(match, (basestring, dict, Query)): match = (match,) if matches: conditions_have_been_set = True found_match = True for match in matches: found_match = True for prop, value in match.iteritems(): if prop is None: if isinstance(value, basestring): if value in ('T', 'X', 'Y', 'Z'): # Axis type x = getattr(self, value) value = True elif '%' in value: # Python attribute (string-valued) value = value.split('%') x = getattr(self, value[0], None) value = '%'.join(value[1:]) else: # Identity (string-valued) x = self.identity(None) else: # Identity (not string-valued, e.g. cf.Query) x = self.identity(None) else: # CF term name x = self.get(prop, None) if x is None: found_match = False elif isinstance(x, basestring) and isinstance(value, basestring): if exact: found_match = (value == x) else: found_match = re_match(value, x) else: found_match = (value == x) try: found_match == True except ValueError: found_match = False #--- End: if if found_match: break #--- End: for if found_match: something_has_matched = True break #--- End: for if match_all and not found_match: return bool(inverse) if conditions_have_been_set: if something_has_matched: return not bool(inverse) else: return bool(inverse) else: return not bool(inverse) #--- End: def def change_coord_identities(self, coord_map, i=False): '''Change the idientifier of all coordinates. If a coordinate identifier is not in the provided mapping then it is set to `None` and thus effectively removed from the coordinate reference. :Parameters: coord_map: dict For example: ``{'dim2': 'dim3', 'aux2': 'latitude', 'aux4': None}`` i: bool, optional :Returns: None :Examples: >>> r = cf.CoordinateReference('atmosphere_hybrid_height_coordinate', ... coord_terms=['a', 'b'], ... a='ncvar:ak', ... b='ncvar:bk') >>> r.coords {'atmosphere_hybrid_height_coordinate', 'ncvar:ak', 'ncvar:bk'} >>> r.change_coord_identitiers({'atmosphere_hybrid_height_coordinate', 'dim1', ... 'ncvar:ak': 'aux0'}) >>> r.coords {'dim1', 'aux0'} ''' if i: r = self else: r = self.copy() # if keep_unmapped: if not coord_map: return r # coord_map = coord_map.copy() # for name in r.coords: # if name not in coord_map: # coord_map[name] = name # #--- End: for for term in self.coord_terms: coord = r[term] r[term] = coord_map.get(coord, coord) # coords = set([coord_map.get(coord, None) for coord in r.coords]) coords = set([coord_map.get(coord, coord) for coord in r.coords]) coords.discard(None) r.coords = coords # _standard_coords = [(coord_map.get(name, name), sn) # for name, sn in r._standard_coords.iteritems()] # r._standard_coords = dict(_standard_coords) return r #---End: def # def reset_coords(self, *identifiers, i=False): # coord_map = {} # for identifier in identifiers: # coord_map[identifier] = self._reset_coords.get(identifier, None) # # return self.change_coord_identities(coord_map, i=i) # #--- End: def # def reset_coord(self, identifier, i=False): # ''' ## ''' # new_name = self._standard_coords.get(identifier, None) # coord_map = {identifier: new_name} # return self.change_coord_identities(coord_map, i=i) # #--- End: def def remove_all_coords(self): '''Remove all links to coordinate objects. All terms linked to coordinate objects are set to `None`. :Returns: None :Examples: >>> c.remove_all_coords() ''' self.coords.clear() for term in self.coord_terms: self[term] = None #---End: def def setcoord(self, term, value): ''' ''' super(CoordinateReference, self).__setitem__(term, value) self.coord_terms.add(term) self.coords.add(value) #--- End: def def set(self, term, value): ''' ''' super(CoordinateReference, self).__setitem__(term, value) #--- End: def def structural_signature(self, rtol=None, atol=None): ''' ''' name = self.name s = [name] append = s.append coord_terms = self.coord_terms non_constant_terms = _non_constant_terms.get(name, ()) for term, value in sorted(self.iteritems()): if term in non_constant_terms: continue if term in coord_terms: continue if isinstance(value, basestring): append((term, value)) continue value = Data.asdata(value) cu = _canonical_units.get(term, None) if cu is not None: if value.Units.equivalent(cu): value.Units = cu elif value.Units: cu = value.Units else: cu = value.Units if str(cu) in _units: cu = _units[str(cu)] else: ok = 0 for units in _units.itervalues(): if cu.equals(units): _units[str(cu)] = units cu = units ok = 1 break if not ok: _units[str(cu)] = cu default = self.default_value(term) if (default is not None and allclose(value, default, rtol=rtol, atol=atol)): continue append((term, value, cu)) #--- End: for return tuple(s) #---End: def #--- End: class cf-python-1.3.2/cf/cellmeasure.py0000644000175000017500000001221512764224131017072 0ustar daviddavid00000000000000from .variable import Variable # ==================================================================== # # CellMeasure object # # ==================================================================== class CellMeasure(Variable): ''' A CF cell measure construct containing information that is needed about the size, shape or location of the field's cells. It is a variable which contains a data array and metadata comprising properties to describe the physical nature of the data. **Attributes** ========== ======= ================================================= Attribute Type Description ========== ======= ================================================= `!measure` ``str`` The spatial measure being represented. Either ``'area'`` or ``'volume'`` are allowed by the CF conventions. ========== ======= ================================================= ''' @property def ismeasure(self): ''' Always True. .. seealso:: `isauxiliary`, `isdimension` :Examples: >>> c.ismeasure True ''' return True #--- End: def def dump(self, display=True, domain=None, key=None, _level=0): ''' Return a string containing a full description of the cell measure. :Parameters: display: `bool`, optional If False then return the description as a string. By default the description is printed, i.e. ``c.dump()`` is equivalent to ``print c.dump(display=False)``. :Returns: out: `None` or `str` A string containing the description. :Examples: ''' indent1 = ' ' * _level indent2 = ' ' * (_level+1) if hasattr(self, 'measure'): string = ['%sCell measure: %s' % (indent1, self.measure)] elif hasattr(self.Units, 'units'): string = ['%sCell measure: %s' % (indent1, self.units)] else: string = ['%sCell measure: %s' % (indent1, self.name(default=''))] if self._hasData: if domain: x = ['%s(%d)' % (domain.axis_name(axis), domain.axis_size(axis)) for axis in domain.item_axes(key)] string.append('%sData(%s) = %s' % (indent2, ', '.join(x), str(self.Data))) else: x = [str(s) for s in self.shape] string.append('%sData(%s) = %s' % (indent2, ', '.join(x), str(self.Data))) #--- End: if if self._simple_properties(): string.append(self._dump_simple_properties(_level=_level+1)) string = '\n'.join(string) if display: print string else: return string #--- End: def def identity(self, default=None): ''' Return the cell measure's identity. The identity is first found of: * The `!measure` attribute. * The `standard_name` CF property. * The `!id` attribute. * The value of the *default* parameter. :Parameters: default: optional If none of `measure`, `standard_name` and `!id` exist then return *default*. By default, *default* is None. :Returns: out: The identity. :Examples: ''' return super(CellMeasure, self).identity(default) #--- End: def def name(self, default=None, identity=False, ncvar=False): '''Return a name for the cell measure. By default the name is the first found of the following: 1. The `!measure` attribute. 2. The `standard_name` CF property. 3. The `!id` attribute. 4. The `long_name` CF property, preceeded by the string ``'long_name:'``. 5. The `!ncvar` attribute, preceeded by the string ``'ncvar:'``. 6. The value of the *default* parameter. Note that ``c.name(identity=True)`` is equivalent to ``c.identity()``. .. seealso:: `identity` :Parameters: default: optional If no name can be found then return the value of the *default* parameter. By default the default is None. identity: `bool`, optional If True then 3. and 4. are not considered as possible names. ncvar: `bool`, optional If True then 1., 2., 3. and 4. are not considered as possible names. :Returns: out: `str` A name for the cell measure. :Examples: >>> f.standard_name = 'air_temperature' >>> f.long_name = 'temperature of the air' >>> f.ncvar = 'tas' >>> f.name() 'air_temperature' >>> del f.standard_name >>> f.name() 'long_name:temperature of the air' >>> del f.long_name >>> f.name() 'ncvar:tas' >>> del f.ncvar >>> f.name() None >>> f.name('no_name') 'no_name' >>> f.standard_name = 'air_temperature' >>> f.name('no_name') 'air_temperature' ''' if ncvar: if identity: raise ValueError( "Can't find name: ncvar and identity parameters can't both be True") n = getattr(self, 'ncvar', None) if n is not None: return 'ncvar%%%s' % n return default #--- End: if n = getattr(self, 'measure', None) if n is not None: return n return super(CellMeasure, self).name(default, identity=identity, ncvar=False) #--- End: def #--- End: class cf-python-1.3.2/cf/ancillaryvariables.py0000600000175000017500000000314512526354100020426 0ustar daviddavid00000000000000from .fieldlist import FieldList # ==================================================================== # # AncillaryVariables object # # ==================================================================== class AncillaryVariables(FieldList): ''' A sequence of ancillary variable fields stored in a list-like object. ''' def equals(self, other, rtol=None, atol=None, ignore_fill_value=False, traceback=False): ''' True if two instances are equal, False otherwise. Two instances are equal if their attributes are equal and their elements are equal set-wise (i.e. the order of the lists is irrelevant). :Parameters: other : The object to compare for equality. atol : float, optional The absolute tolerance for all numerical comparisons, By default the value returned by the `ATOL` function is used. rtol : float, optional The relative tolerance for all numerical comparisons, By default the value returned by the `RTOL` function is used. ignore_fill_value : bool, optional If True then data arrays with different fill values are considered equal. By default they are considered unequal. traceback : bool, optional If True then print a traceback highlighting where the two instances differ. :Returns: out : bool Whether or not the two instances are equal. :Examples: ''' return self.set_equals(other, rtol=rtol, atol=atol, ignore_fill_value=ignore_fill_value, traceback=traceback) #--- End: def #--- End: class cf-python-1.3.2/cf/read.py0000644000175000017500000004517312756632563015532 0ustar daviddavid00000000000000from glob import glob from os import walk as os_walk from os.path import isdir, isfile from os.path import join as os_path_join from os.path import expandvars as os_path_expandvars from os.path import expanduser as os_path_expanduser from .field import Field, FieldList from .functions import flat from .aggregate import aggregate as cf_aggregate from .netcdf.read import read as netcdf_read from .netcdf.read import is_netcdf_file from .um.read import read as um_read from .um.read import is_um_file def read(files, verbose=False, ignore_read_error=False, aggregate=True, umversion=4.5, nfields=None, squeeze=False, unsqueeze=False, fmt=None, select=None, select_options={}, top_level=None, height_at_top_of_model=None, recursive=False, follow_symlinks=False): '''Read fields from files into `cf.Field` objects. A file may be on disk or on a OPeNDAP server. Any amount of any combination of CF-netCDF and CFA-netCDF files (or URLs if DAP access is enabled), Met Office (UK) PP files and Met Office (UK) fields files format files may be read. **netCDF files** * The netCDF variable names of the field and its components are stored in their `!ncvar` attributes. * Fields referenced within coordinate reference or ancillary variables objects are not included in the returned list of fields. **PP files** * If any PP files are read then the *aggregate* option ``'relaxed_units'`` is set to True for all input files. * STASH code to standard conversion uses the table in ``cf/etc/STASH_to_CF.txt``. **Files on OPeNDAP servers** * All files on OPeNDAP servers are assumed to be netCDF files. .. seealso:: `cf.write` :Parameters: files: (arbitrarily nested sequence of) `str` A string or arbitrarily nested sequence of strings giving the file names or OPenDAP URLs from which to read fields. Various type of expansion are applied to the file names: ==================== ====================================== Expansion Description ==================== ====================================== Tilde An initial component of ``~`` or ``~user`` is replaced by that *user*'s home directory. Environment variable Substrings of the form ``$name`` or ``${name}`` are replaced by the value of environment variable *name*. Pathname A string containing UNIX file name metacharacters as understood by the :py:obj:`glob` module is replaced by the list of matching file names. This type of expansion is ignored for OPenDAP URLs. ==================== ====================================== Where more than one type of expansion is used in the same string, they are applied in the order given in the above table. Example: If the environment variable *MYSELF* has been set to the "david", then ``'~$MYSELF/*.nc'`` is equivalent to ``'~david/*.nc'``, which will read all netCDF files in the user david's home directory. verbose: `bool`, optional If True then print information to stdout. umversion: `int` or `float`, optional Met Office (UK) PP files and Met Office (UK) fields files only, the Unified Model (UM) version to be used when decoding the PP header. Valid versions are, for example, ``402`` or ``4.2`` (v4.2), ``606.3`` (v6.6.3) and ``1001`` or ``10.1`` (v10.1). The default version is ``4.5`` (v4.5). The version is ignored if it can be inferred from the PP headers, which will generally be the case for files created at v5.3 and later. Note that the PP header can not encode tertiary version elements (such as the ``3`` in ``606.3``), so it may be necessary to provide a UM version in such cases. Ignored for any other type of input files. ignore_read_error: `bool`, optional If True then ignore any file which raises an IOError whilst being read, as would be the case for an empty file, unknown file format, etc. By default the IOError is raised. fmt: `str`, optional Only read files of the given format, ignoring all other files. Valid formats are ``'NETCDF'`` for CF-netCDF files, ``'CFA'`` for CFA-netCDF files and ``'PP'`` for PP files and 'FF' for UM fields files. By default files of any of these formats are read. default files of any of these formats are read. aggregate: `bool` or `dict`, optional If True (the default) or a (possibly empty) dictionary then aggregate the fields read in from all input files into as few fields as possible using the CF aggregation rules. If *aggregate* is a dictionary then it is passed as keyword arguments to the `cf.aggregate` function. If False then the fields are not aggregated. squeeze: `bool`, optional If True then remove size 1 axes from each field's data array. unsqueeze: `bool`, optional If True then insert size 1 axes from each field's domain into its data array. select, select_options: optional Only return fields which satisfy the given conditions on their property values. Only fields which, prior to any aggregation, satisfy ``f.match(select, **select_options) == True`` are returned. See `cf.Field.match` for details. top_level: (sequence of) `str`, optional Promote field components to independent top-level fields. The *top_level* parameter may be or, or a sequence, of: =============== =========================================== *top_level* Extra top-level fields =============== =========================================== ``'reference'`` Fields in coordinate reference objects ``'ancillary'`` Ancillary data fields ``'field'`` Fields in coordinate references and ancillary data fields ``'auxiliary'`` Auxiliary coordinate objects ``'measure'`` Cell measure objects ``'all'`` All of the above =============== =========================================== *Example:* To promote fields in coordinate reference objects: ``top_level='reference'`` or ``top_level=['reference']``. *Example:* To promote ancillary data fields and cell measure objects: ``top_level=['ancillary', 'measure']``. .. versionadded:: 1.0.4 recursive: `bool`, optional If True then allow directories to be specified by the *files* parameter and recursively search the directories for files to read. .. versionadded:: 1.1.9 follow_symlinks: `bool`, optional If True, and *recursive* is True, then also search for files in directories which resolve to symbolic links. By default directories which resolve to symbolic links are ignored. Ignored of *recursive* is False. Files which are symbolic links are always followed. Note that setting ``recursive=True, follow_symlinks=True`` can lead to infinite recursion if a symbolic link points to a parent directory of itself. .. versionadded:: 1.1.9 :Returns: out: `cf.FieldList` or `cf.Field` A list of fields, or if there is only one field, the individual field. :Examples: >>> f = cf.read('file*.nc') >>> f [, , , ] >>> cf.read('file*.nc')[0:2] [, ] >>> cf.read('file*.nc')[-1] >>> cf.read('file*.nc', select='units:K) [, ] >>> cf.read('file*.nc', select='ncvar%ta') >>> cf.read('file*.nc', select={'standard_name': '.*pmsl*', 'units':['K', 'Pa']}) >>> cf.read('file*.nc', select={'units':['K', 'Pa']}) [, , ] ''' if squeeze and unsqueeze: raise ValueError("squeeze and unsqueeze can not both be True") if follow_symlinks and not recursive: raise ValueError( "Can't set follow_symlinks={0} when recursive={1}".format( follow_symlinks, recursive)) # Initialize the output list of fields field_list = FieldList() if isinstance(aggregate, dict): aggregate_options = aggregate.copy() aggregate = True else: aggregate_options = {} aggregate_options['copy'] = False # Parse umversion if umversion is not None: umversion = float(str(umversion).replace('.', '0', 1)) # ---------------------------------------------------------------- # Parse top_level # ---------------------------------------------------------------- promote = top_level if promote is None: promote = () elif isinstance(promote, basestring): promote = (promote,) # if 'all' in promote: # promote = set(('field', 'coordinate', 'measure')) # Count the number of fields (in all files) and the number of # files field_counter = -1 file_counter = 0 for file_glob in flat(files): # Expand variables file_glob = os_path_expanduser(os_path_expandvars(file_glob)) if file_glob.startswith('http://'): # Do not glob a URL files2 = (file_glob,) else: # Glob files on disk files2 = glob(file_glob) if not files2 and not ignore_read_error: open(file_glob, 'rb') if recursive: files3 = [] for x in files2: if isdir(x): # Recursively walk through directories for path, subdirs, filenames in os_walk(x, followlinks=follow_symlinks): files3.extend(os_path_join(path, f) for f in filenames) else: files3.append(x) files2 = files3 else: for x in files2: if isdir(x) and not ignore_read_error: raise IOError( "Can't read directory {0} recursively unless recursive=True".format(x)) #--- End: if for filename in files2: if verbose: print 'File: %s' % filename # -------------------------------------------------------- # Read the file into fields # -------------------------------------------------------- fields = _read_a_file(filename, ignore_read_error=ignore_read_error, verbose=verbose, aggregate=aggregate, aggregate_options=aggregate_options, umversion=umversion, selected_fmt=fmt, promote=promote, height_at_top_of_model=height_at_top_of_model) # -------------------------------------------------------- # Select matching fields # -------------------------------------------------------- if select or select_options: fields = fields.select(select, **select_options) # -------------------------------------------------------- # Add this file's fields to those already read from other # files # -------------------------------------------------------- field_list.extend(fields) field_counter = len(field_list) file_counter += 1 #--- End: for #--- End: for # Error check if not ignore_read_error: if not file_counter: raise RuntimeError('No files found') if not field_list: raise RuntimeError('No fields found from '+str(file_counter)+' files') #--- End: if # Print some informative messages if verbose: print("Read {0} field{1} from {2} file{3}".format( field_counter, _plural(field_counter), file_counter , _plural(file_counter))) #--- End: if # ---------------------------------------------------------------- # Aggregate the output fields # ---------------------------------------------------------------- if aggregate and len(field_list) > 1: if verbose: org_len = len(field_list) field_list = cf_aggregate(field_list, **aggregate_options) if verbose: n = len(field_list) print('{0} input field{1} aggregated into {2} field{3}'.format( org_len, _plural(org_len), n, _plural(n))) #--- End: if # ---------------------------------------------------------------- # Add standard names to UM fields # ---------------------------------------------------------------- for f in field_list: standard_name = getattr(f, '_standard_name', None) if standard_name is not None: f.standard_name = standard_name del f._standard_name #--- End: for # ---------------------------------------------------------------- # Squeeze size one dimensions from the data arrays. Do one of: # # 1) Squeeze the fields, i.e. remove all size one dimensions from # all field data arrays # # 2) Unsqueeze the fields, i.e. Include all size 1 domain # dimensions in the data array. # # 3) Nothing # ---------------------------------------------------------------- if squeeze: field_list.squeeze(i=True) elif unsqueeze: field_list.unsqueeze(i=True) if nfields is not None and len(field_list) != nfields: raise ValueError( "Error whilst reading file{0}: {1} field{2} requested but {3} found".format( _plural(file_counter), nfields, _plural(nfields), len(field_list))) if len(field_list) == 1: # Return a field instead of a field list field_list = field_list[0] return field_list #--- End: def def _plural(n): return 's' if n !=1 else '' def _read_a_file(filename, aggregate=True, aggregate_options={}, ignore_read_error=False, verbose=False, umversion=None, selected_fmt=None, promote=(), height_at_top_of_model=None): ''' Read the contents of a single file into a field list. :Parameters: filename : str The file name. aggregate_options : dict, optional The keys and values of this dictionary may be passed as keyword parameters to an external call of the aggregate function. ignore_read_error : bool, optional If True then return an empty field list if reading the file produces an IOError, as would be the case for an empty file, unknown file format, etc. By default the IOError is raised. verbose : bool, optional If True then print information to stdout. :Returns: out : FieldList The fields in the file. :Raises: IOError : If *ignore_read_error* is False and * The file can not be opened. * The file can not be opened. ''' # Find this file's type try: ftype = file_type(filename) except Exception as error: if ignore_read_error: if verbose: print('WARNING: %s' % error) return FieldList() raise error #--- End: try # ---------------------------------------------------------------- # Still here? Read the file into fields. # ---------------------------------------------------------------- if ftype == 'netCDF' and (selected_fmt in (None, 'NETCDF', 'CFA')): fields = netcdf_read(filename, fmt=selected_fmt, promote=promote, verbose=verbose) elif ftype == 'UM' and (selected_fmt in (None, 'PP', 'FF')): fields = um_read(filename, um_version=umversion, verbose=verbose, set_standard_name=False, height_at_top_of_model=height_at_top_of_model) # PP fields are aggregated intrafile prior to interfile # aggregation if aggregate: # For PP fields, the default is strict_units=False if 'strict_units' not in aggregate_options: aggregate_options['relaxed_units'] = True #--- End: if # Add more file formats here ... else: fields = FieldList() # ---------------------------------------------------------------- # Return the fields # ---------------------------------------------------------------- return fields #--- End: def def file_type(filename): ''' :Parameters: filename: `str` The file name. :Returns: out: `str` The format type of the file. :Raises: IOError: If the file has an unsupported format. :Examples: >>> ftype = file_type(filename) ''' # ---------------------------------------------------------------- # Assume that URLs are in netCDF format # ---------------------------------------------------------------- if filename.startswith('http://'): return 'netCDF' # ---------------------------------------------------------------- # netCDF # ---------------------------------------------------------------- if is_netcdf_file(filename): return 'netCDF' # ---------------------------------------------------------------- # PP or FF # ---------------------------------------------------------------- if is_um_file(filename): return 'UM' # ---------------------------------------------------------------- # Developers: Add more file formats here ... # ---------------------------------------------------------------- # Still here? raise IOError("File %s has unsupported format" % filename) #--- End: def cf-python-1.3.2/cf/units.py0000644000175000017500000020311512770451066015742 0ustar daviddavid00000000000000import ctypes import netCDF4 import os import sys from numpy import array as numpy_array from numpy import dtype as numpy_dtype from numpy import empty as numpy_empty from numpy import generic as numpy_generic from numpy import ndarray as numpy_ndarray from numpy import ones as numpy_ones from numpy import reshape as numpy_reshape from numpy import where as numpy_where from numpy import zeros as numpy_zeros from .functions import inspect as cf_inspect # -------------------------------------------------------------------- # Aliases for ctypes # -------------------------------------------------------------------- _sizeof_buffer = 257 _string_buffer = ctypes.create_string_buffer(_sizeof_buffer) _c_char_p = ctypes.c_char_p _c_int = ctypes.c_int _c_uint = ctypes.c_uint _c_float = ctypes.c_float _c_double = ctypes.c_double _c_size_t = ctypes.c_size_t _c_void_p = ctypes.c_void_p _pointer = ctypes.pointer _POINTER = ctypes.POINTER _ctypes_POINTER = {4: _POINTER(_c_float), 8: _POINTER(_c_double)} # -------------------------------------------------------------------- # Load the Udunits-2 library and read the database # -------------------------------------------------------------------- if sys.platform == 'darwin': # This has been tested on Mac OSX 10.5.8 and 10.6.8 _udunits = ctypes.CDLL('libudunits2.0.dylib') else: # Linux _udunits = ctypes.CDLL('libudunits2.so.0') #--- End: if # Suppress "overrides prefixed-unit" messages. This also suppresses # all other error messages - so watch out! # # Messages may be turned back on by calling the module function # udunits_error_messages. # ut_error_message_handler ut_set_error_message_handler( # ut_error_message_handler handler); _ut_set_error_message_handler = _udunits.ut_set_error_message_handler _ut_set_error_message_handler.argtypes = (_c_void_p, ) _ut_set_error_message_handler.restype = _c_void_p _ut_set_error_message_handler(_udunits.ut_ignore) # Read the data base # ut_system* ut_read_xml(const char* path); _ut_read_xml = _udunits.ut_read_xml _ut_read_xml.argtypes = (_c_char_p, ) _ut_read_xml.restype = _c_void_p #print 'units: before _udunits.ut_read_xml(',_unit_database,')' _ut_system = _ut_read_xml(None) #print 'units: after _udunits.ut_read_xml(',_unit_database,')' # Reinstate the reporting of error messages #_ut_set_error_message_handler(_udunits.ut_write_to_stderr) # -------------------------------------------------------------------- # Aliases for the UDUNITS-2 C API. See # http://www.unidata.ucar.edu/software/udunits/udunits-2.2.18/doc/udunits/udunits2lib.html # for documentation. # -------------------------------------------------------------------- # int ut_format(const ut_unit* const unit, char* buf, size_t size, unsigned opts); _ut_format = _udunits.ut_format _ut_format.argtypes = (_c_void_p, _c_char_p, _c_size_t, _c_uint) _ut_format.restype = _c_int # char* ut_trim(char* const string, const ut_encoding encoding); _ut_trim = _udunits.ut_trim _ut_trim.argtypes = (_c_char_p, _c_int) # ut_encoding assumed to be int! _ut_trim.restype = _c_char_p # ut_unit* ut_parse(const ut_system* const system, # const char* const string, const ut_encoding encoding); _ut_parse = _udunits.ut_parse _ut_parse.argtypes = (_c_void_p, _c_char_p, _c_int) # ut_encoding assumed to be int! _ut_parse.restype = _c_void_p # int ut_compare(const ut_unit* const unit1, const ut_unit* const # unit2); _ut_compare = _udunits.ut_compare _ut_compare.argtypes = (_c_void_p, _c_void_p) _ut_compare.restype = _c_int # int ut_are_convertible(const ut_unit* const unit1, const ut_unit* # const unit2); _ut_are_convertible = _udunits.ut_are_convertible _ut_are_convertible.argtypes = (_c_void_p, _c_void_p) _ut_are_convertible.restype = _c_int # cv_converter* ut_get_converter(ut_unit* const from, ut_unit* const # to); _ut_get_converter = _udunits.ut_get_converter _ut_get_converter.argtypes = (_c_void_p, _c_void_p) _ut_get_converter.restype = _c_void_p # ut_unit* ut_divide(const ut_unit* const numer, const ut_unit* const # denom); _ut_divide = _udunits.ut_divide _ut_divide.argtypes = (_c_void_p, _c_void_p) _ut_divide.restype = _c_void_p # ut_unit* ut_offset(const ut_unit* const unit, const double offset); _ut_offset = _udunits.ut_offset _ut_offset.argtypes = (_c_void_p, _c_double) _ut_offset.restype = _c_void_p # ut_unit* ut_raise(const ut_unit* const unit, const int power); _ut_raise = _udunits.ut_raise _ut_raise.argtypes = (_c_void_p, _c_int) _ut_raise.restype = _c_void_p # ut_unit* ut_scale(const double factor, const ut_unit* const unit); _ut_scale = _udunits.ut_scale _ut_scale.argtypes = (_c_double, _c_void_p) _ut_scale.restype = _c_void_p # ut_unit* ut_multiply(const ut_unit* const unit1, const ut_unit* # const unit2); _ut_multiply = _udunits.ut_multiply _ut_multiply.argtypes = (_c_void_p, _c_void_p) _ut_multiply.restype = _c_void_p # ut_unit* ut_log(const double base, const ut_unit* const reference); _ut_log = _udunits.ut_log _ut_log.argtypes = (_c_double, _c_void_p) _ut_log.restype = _c_void_p # ut_unit* ut_root(const ut_unit* const unit, const int root); _ut_root = _udunits.ut_root _ut_root.argtypes = (_c_void_p, _c_int) _ut_root.restype = _c_void_p # void ut_free_system(ut_system* system); _ut_free = _udunits.ut_free _ut_free.argypes = (_c_void_p, ) _ut_free.restype = None # float* cv_convert_floats(const cv_converter* converter, const float* # const in, const size_t count, float* out); _cv_convert_floats = _udunits.cv_convert_floats _cv_convert_floats.argtypes = (_c_void_p, _c_void_p, _c_size_t, _c_void_p) _cv_convert_floats.restype = _c_void_p # double* cv_convert_doubles(const cv_converter* converter, const # double* const in, const size_t count, # double* out); _cv_convert_doubles = _udunits.cv_convert_doubles _cv_convert_doubles.argtypes = (_c_void_p, _c_void_p, _c_size_t, _c_void_p) _cv_convert_doubles.restype = _c_void_p # double cv_convert_double(const cv_converter* converter, const double # value); _cv_convert_double = _udunits.cv_convert_double _cv_convert_double.argtypes = (_c_void_p, _c_double) _cv_convert_double.restype = _c_double # void cv_free(cv_converter* const conv); _cv_free = _udunits.cv_free _cv_free.argtypes = (_c_void_p, ) _cv_free.restype = None _UT_ASCII = 0 _UT_NAMES = 4 _UT_DEFINITION = 8 _cv_convert_array = {4: _cv_convert_floats, 8: _cv_convert_doubles} # Some function definitions necessary for the following # changes to the unit system. _ut_get_unit_by_name = _udunits.ut_get_unit_by_name _ut_get_unit_by_name.argtypes = (_c_void_p, _c_char_p) _ut_get_unit_by_name.restype = _c_void_p _ut_get_status = _udunits.ut_get_status _ut_get_status.restype = _c_int _ut_unmap_symbol_to_unit = _udunits.ut_unmap_symbol_to_unit _ut_unmap_symbol_to_unit.argtypes = (_c_void_p, _c_char_p, _c_int) _ut_unmap_symbol_to_unit.restype = _c_int _ut_map_symbol_to_unit = _udunits.ut_map_symbol_to_unit _ut_map_symbol_to_unit.argtypes = (_c_char_p, _c_int, _c_void_p) _ut_map_symbol_to_unit.restype = _c_int _ut_map_unit_to_symbol = _udunits.ut_map_unit_to_symbol _ut_map_unit_to_symbol.argtypes = (_c_void_p, _c_char_p, _c_int) _ut_map_unit_to_symbol.restype = _c_int _ut_map_name_to_unit = _udunits.ut_map_name_to_unit _ut_map_name_to_unit.argtypes = (_c_char_p, _c_int, _c_void_p) _ut_map_name_to_unit.restype = _c_int _ut_map_unit_to_name = _udunits.ut_map_unit_to_name _ut_map_unit_to_name.argtypes = (_c_void_p, _c_char_p, _c_int) _ut_map_unit_to_name.restype = _c_int _ut_new_base_unit = _udunits.ut_new_base_unit _ut_new_base_unit.argtypes = (_c_void_p, ) _ut_new_base_unit.restype = _c_void_p # Change Sv mapping. Both sievert and sverdrup are just aliases, # so no unit to symbol mapping needs to be changed. # We don't need to remove rem, since it was constructed with # the correct sievert mapping in place; because that mapping # was only an alias, the unit now doesn't depend on the mapping # persisting. assert(0 == _ut_unmap_symbol_to_unit(_ut_system, _c_char_p('Sv'), _UT_ASCII)) assert(0 == _ut_map_symbol_to_unit(_c_char_p('Sv'), _UT_ASCII, _ut_get_unit_by_name(_ut_system, _c_char_p('sverdrup')))) # Add new base unit calendar_year calendar_year_unit = _ut_new_base_unit(_ut_system) assert(0 == _ut_map_symbol_to_unit(_c_char_p('cY'), _UT_ASCII, calendar_year_unit)) assert(0 == _ut_map_unit_to_symbol(calendar_year_unit, _c_char_p('cY'), _UT_ASCII)) assert(0 == _ut_map_name_to_unit(_c_char_p('calendar_year'), _UT_ASCII, calendar_year_unit)) assert(0 == _ut_map_unit_to_name(calendar_year_unit, _c_char_p('calendar_year'), _UT_ASCII)) assert(0 == _ut_map_name_to_unit(_c_char_p('calendar_years'), _UT_ASCII, calendar_year_unit)) # Add various aliases useful for CF. def add_unit_alias(definition, symbol, singular, plural): unit = _ut_parse(_ut_system, _c_char_p(definition), _UT_ASCII) if symbol is not None: assert(0 == _ut_map_symbol_to_unit(_c_char_p(symbol), _UT_ASCII, unit)) if singular is not None: assert(0 == _ut_map_name_to_unit(_c_char_p(singular), _UT_ASCII, unit)) if plural is not None: assert(0 == _ut_map_name_to_unit(_c_char_p(plural), _UT_ASCII, unit)) add_unit_alias("1.e-3", "psu", "practical_salinity_unit", "practical_salinity_units") add_unit_alias("calendar_year/12", "cM", "calendar_month", "calendar_months") add_unit_alias("1", None, "level", "levels") add_unit_alias("1", None, "layer", "layers") add_unit_alias("1", None, "sigma_level", "sigma_levels") add_unit_alias("1", "dB", "decibel", "debicels") add_unit_alias("10 dB", None, "bel", "bels") #_udunits.ut_get_unit_by_name(_udunits.ut_new_base_unit(_ut_system), # _ut_system, 'calendar_year') # -------------------------------------------------------------------- # Create a calendar year unit # -------------------------------------------------------------------- #_udunits.ut_map_name_to_unit('calendar_year', _UT_ASCII, # _udunits.ut_new_base_unit(_ut_system)) # -------------------------------------------------------------------- # Aliases for netCDF4.netcdftime classes # -------------------------------------------------------------------- _netCDF4_netcdftime_utime = netCDF4.netcdftime.utime _datetime = netCDF4.netcdftime.datetime DateFromJulianDay = netCDF4.netcdftime.DateFromJulianDay if netCDF4.__version__ <= '1.1.1': _DateFromNoLeapDay = netCDF4.netcdftime._DateFromNoLeapDay _DateFromAllLeap = netCDF4.netcdftime._DateFromAllLeap _DateFrom360Day = netCDF4.netcdftime._DateFrom360Day else: _DateFromNoLeapDay = netCDF4.netcdftime.netcdftime._DateFromNoLeapDay _DateFromAllLeap = netCDF4.netcdftime.netcdftime._DateFromAllLeap _DateFrom360Day = netCDF4.netcdftime.netcdftime._DateFrom360Day # -------------------------------------------------------------------- # Aliases for netCDF4.netcdftime functions # -------------------------------------------------------------------- try: _num2date = netCDF4.num2date _date2num = netCDF4.date2num except: _num2date = netCDF4.netcdftime.num2date _date2num = netCDF4.netcdftime.date2num _cached_ut_unit = {} _cached_utime = {} # -------------------------------------------------------------------- # Save some useful units # -------------------------------------------------------------------- # A time ut_unit (equivalent to 'day', 'second', etc.) _day_ut_unit = _ut_parse(_ut_system, _c_char_p('day'), _UT_ASCII) _cached_ut_unit['days'] = _day_ut_unit # A pressure ut_unit (equivalent to 'Pa', 'hPa', etc.) _pressure_ut_unit = _ut_parse(_ut_system, _c_char_p('pascal'), _UT_ASCII) _cached_ut_unit['pascal'] = _pressure_ut_unit # A calendar time ut_unit (equivalent to 'cY', 'cM') _calendartime_ut_unit = _ut_parse(_ut_system, _c_char_p('calendar_year'), _UT_ASCII) _cached_ut_unit['calendar_year'] = _calendartime_ut_unit # A dimensionless unit one (equivalent to '', '1', '2', etc.) #_dimensionless_unit_one = _udunits.ut_get_dimensionless_unit_one(_ut_system) #_cached_ut_unit[''] = _dimensionless_unit_one #_cached_ut_unit['1'] = _dimensionless_unit_one _dimensionless_unit_one = _ut_parse(_ut_system, _c_char_p('1'), _UT_ASCII) _cached_ut_unit[''] = _dimensionless_unit_one _cached_ut_unit['1'] = _dimensionless_unit_one # -------------------------------------------------------------------- # Set the default calendar type according to the CF conventions # -------------------------------------------------------------------- _default_calendar = 'gregorian' _canonical_calendar = {'gregorian' : 'gregorian' , 'standard' : 'gregorian' , 'none' : 'gregorian' , 'proleptic_gregorian': 'proleptic_gregorian', '360_day' : '360_day' , 'noleap' : '365_day' , '365_day' : '365_day' , 'all_leap' : '366_day' , '366_day' : '366_day' , 'julian' : 'julian' , } ## -------------------------------------------------------------------- ## Set month lengths in days for non-leap years (_days_in_month[0,1:]) ## and leap years (_days_in_month[1,1:]) ## -------------------------------------------------------------------- #_days_in_month = numpy_array( # [[-99, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], # [-99, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]]) # -------------------------------------------------------------------- # Function to control Udunits error messages # -------------------------------------------------------------------- def udunits_error_messages(flag): ''' Control the printing of error messages from Udunits, which are turned off by default. :Parameters: flag : bool Set to True to print Udunits error messages and False to not print Udunits error messages. :Returns: None :Examples: >>> udunits_error_messages(True) >>> udunits_error_messages(False) ''' if flag: _ut_set_error_message_handler(_udunits.ut_write_to_stderr) else: _ut_set_error_message_handler(_udunits.ut_ignore) #--- End: def #def _month_length(year, month, calendar, _days_in_month=_days_in_month): # ''' # #Find month lengths in days for each year/month pairing in the input #numpy arrays 'year' and 'month', both of which must have the same #shape. 'calendar' must be one of the standard CF calendar types. # #:Parameters: # # #''' # shape = month.shape # if calendar in ('standard', 'gregorian'): # leap = numpy_where(year % 4 == 0, 1, 0) # leap = numpy_where((year > 1582) & # (year % 100 == 0) & (year % 400 != 0), # 0, leap) # elif calendar == '360_day': # days_in_month = numpy_empty(shape) # days_in_month.fill(30) # return days_in_month # # elif calendar in ('all_leap', '366_day'): # leap = numpy_zeros(shape) # # elif calendar in ('no_leap', '365_day'): # leap = numpy_ones(shape) # # elif calendar == 'proleptic_gregorian': # leap = numpy_where(year % 4 == 0, 1, 0) # leap = numpy_where((year % 100 == 0) & (year % 400 != 0), # 0, leap) # # days_in_month = numpy_array([_days_in_month[l, m] # for l, m in zip(leap.flat, month.flat)]) # days_in_month.resize(shape) # # return days_in_month ##--- End: def # #def _proper_date(year, month, day, calendar, fix=False, # _days_in_month=_days_in_month): # ''' # #Given equally shaped numpy arrays of 'year', 'month', 'day' adjust #them *in place* to be proper dates. 'calendar' must be one of the #standard CF calendar types. # #Excessive number of months are converted to years but excessive days #are not converted to months nor years. If a day is illegal in the #proper date then a ValueError is raised, unless 'fix' is True, in #which case the day is lowered to the nearest legal date: # # 2000/26/1 -> 2002/3/1 # # 2001/2/31 -> ValueError if 'fix' is False # 2001/2/31 -> 2001/2/28 if 'fix' is True # 2001/2/99 -> 2001/2/28 if 'fix' is True # #:Parameters: # #''' ## y, month = divmod(month, 12) ## year += y # # year += month // 12 # month[...] = month % 12 # # mask = (month == 0) # year[...] = numpy_where(mask, year-1, year) # month[...] = numpy_where(mask, 12, month) # del mask # # days_in_month = _month_length(year, month, calendar, # _days_in_month=_days_in_month) # # if fix: # day[...] = numpy_where(day > days_in_month, days_in_month, day) # elif (day > days_in_month).any(): # raise ValueError("Illegal date(s) in %s calendar" % calendar) # # return year, month, day ##--- End: def # ==================================================================== # # Units object # # ==================================================================== class Units(object): ''' Store, combine and compare physical units and convert numeric values to different units. Units are as defined in UNIDATA's Udunits-2 package, with a few exceptions for greater consistency with the CF conventions namely support for CF calendars and new units definitions. **Modifications to the standard Udunits database** Whilst a standard Udunits-2 database may be used, greater consistency with CF is achieved by using a modified database. The following units are either new to, modified from, or removed from the standard Udunits-2 database (version 2.1.24): ======================= ====== ============ ============== Unit name Symbol Definition Status ======================= ====== ============ ============== practical_salinity_unit psu 1e-3 New unit level 1 New unit sigma_level 1 New unit layer 1 New unit decibel dB 1 New unit bel 10 dB New unit sverdrup Sv 1e6 m3 s-1 Added symbol sievert J kg-1 Removed symbol ======================= ====== ============ ============== Plural forms of the new units' names are allowed, such as ``practical_salinity_units``. The modified database is in the *udunits* subdirectory of the *etc* directory found in the same location as this module. **Accessing units** Units may be set, retrieved and deleted via the `units` attribute. Its value is a string that can be recognized by UNIDATA's Udunits-2 package, with the few exceptions given in the CF conventions. >>> u = Units('m s-1') >>> u >>> u.units = 'days since 2004-3-1' >>> u **Equality and equivalence of units** There are methods for assessing whether two units are equivalent or equal. Two units are equivalent if numeric values in one unit are convertible to numeric values in the other unit (such as ``kilometres`` and ``metres``). Two units are equal if they are equivalent and their conversion is a scale factor of 1 and an offset of 0 (such as ``kilometres`` and ``1000 metres``). Note that equivalence and equality are based on internally stored binary representations of the units, rather than their string representations. >>> u = Units('m/s') >>> v = Units('m s-1') >>> w = Units('km.s-1') >>> x = Units('0.001 kilometer.second-1') >>> y = Units('gram') >>> u.equivalent(v), u.equals(v), u == v (True, True, True) >>> u.equivalent(w), u.equals(w) (True, False) >>> u.equivalent(x), u.equals(x) (True, True) >>> u.equivalent(y), u.equals(y) (False, False) **Time and reference time units** Time units may be given as durations of time (*time units*) or as an amount of time since a reference time (*reference time units*): >>> v = Units() >>> v.units = 's' >>> v.units = 'day' >>> v.units = 'days since 1970-01-01' >>> v.units = 'seconds since 1992-10-8 15:15:42.5 -6:00' .. note:: It is recommended that the units ``year`` and ``month`` be used with caution, as explained in the following excerpt from the CF conventions: "The Udunits package defines a year to be exactly 365.242198781 days (the interval between 2 successive passages of the sun through vernal equinox). It is not a calendar year. Udunits includes the following definitions for years: a common_year is 365 days, a leap_year is 366 days, a Julian_year is 365.25 days, and a Gregorian_year is 365.2425 days. For similar reasons the unit ``month``, which is defined to be exactly year/12, should also be used with caution." **Calendar** The date given in reference time units is associated with one of the calendars recognized by the CF conventions and may be set with the `calendar` attribute. However, as in the CF conventions, if the calendar is not set then, for the purposes of calculation and comparison, it defaults to the mixed Gregorian/Julian calendar as defined by Udunits: >>> u = Units('days since 2000-1-1') >>> u.calendar AttributeError: Can't get 'Units' attribute 'calendar' >>> v = Units('days since 2000-1-1') >>> v.calendar = 'gregorian' >>> v.equals(u) True **Arithmetic with units** The following operators, operations and assignments are overloaded: Comparison operators: ``==, !=`` Binary arithmetic operations: ``+, -, *, /, pow(), **`` Unary arithmetic operations: ``-, +`` Augmented arithmetic assignments: ``+=, -=, *=, /=, **=`` The comparison operations return a boolean and all other operations return a new units object or modify the units object in place. >>> u = Units('m') >>> v = u * 1000 >>> v >>> u == v False >>> u != v True >>> u **= 2 >>> u It is also possible to create the logarithm of a unit corresponding to the given logarithmic base: >>> u = Units('seconds') >>> u.log(10) **Modifying data for equivalent units** Any numpy array or python numeric type may be modified for equivalent units using the `conform` static method. >>> Units.conform(2, Units('km'), Units('m')) 2000.0 >>> import numpy >>> a = numpy.arange(5.0) >>> Units.conform(a, Units('minute'), Units('second')) array([ 0., 60., 120., 180., 240.]) >>> a array([ 0., 1., 2., 3., 4.]) If the *inplace* keyword is True, then a numpy array is modified in place, without any copying overheads: >>> Units.conform(a, Units('days since 2000-12-1'), Units('days since 2001-1-1'), inplace=True) array([-31., -30., -29., -28., -27.]) >>> a array([-31., -30., -29., -28., -27.]) ''' def __init__(self, units=None, calendar=None, names=None, definition=None, _ut_unit=None): ''' **Initialization** :Parameters: units : str or cf.Units, optional Set the new units from this string. calendar : str, optional Set the calendar for reference time units. format : bool, optional Format the string representation of the units in a standardized manner. See the `format` method. names : bool, optional Format the string representation of the units using names instead of symbols. See the `format` method. definition : bool, optional Format the string representation of the units using basic units. See the `format` method. _ut_unit : int, optional Set the new units from this Udunits binary unit representation. This should be an integer returned by a call to `ut_parse` function of Udunits. Ignored if `units` is set. ''' if isinstance(units, self.__class__): self.__dict__ = units.__dict__ return if units is not None: units = units.strip() if ' since ' in units: # -------------------------------------------------------- # Set a reference time unit # -------------------------------------------------------- # Set the calendar if calendar is None: _calendar = _default_calendar else: _calendar = _canonical_calendar[calendar.lower()] units_split = units.split(' since ') unit = units_split[0].strip() ut_unit = _cached_ut_unit.get(unit, None) if ut_unit is None: ut_unit = _ut_parse(_ut_system, _c_char_p(unit), _UT_ASCII) if not ut_unit or not _ut_are_convertible(ut_unit, _day_ut_unit): raise ValueError( "Can't set unsupported unit in reference time: '%s'" % value) _cached_ut_unit[unit] = ut_unit #--- End: if utime = _cached_utime.get((_calendar, units), None) if not utime: # Create a new Utime object unit_string = '%s since %s' % (unit, units_split[1].strip()) utime = _cached_utime.get((_calendar, unit_string), None) if utime is None: try: utime = Utime(_calendar, unit_string) except ValueError: # Assume that the value error came from # Utime complaining about the units. In # this case, change the units to something # acceptable to Utime and afterwards # overwrite the Utime.units and # Utime.unit_string attributes with the # correct values. If this assumption was # incorrect, then we'll just end up with # another error, this time untrapped # (possibly due to a wrong calendar). utime = Utime(_calendar, 'days since %s' % units_split[1].strip()) utime.unit_string = unit_string utime.units = unit #--- End: try _cached_utime[(_calendar, unit_string)] = utime #--- End: if _cached_utime[(calendar, units)] = utime #--- End: if self._isreftime = True self._calendar = calendar self._utime = utime else: # ---------------------------------------------------- # Set a unit other than a reference time unit # ---------------------------------------------------- ut_unit = _cached_ut_unit.get(units, None) if ut_unit is None: ut_unit = _ut_parse(_ut_system, _c_char_p(units), _UT_ASCII) if not ut_unit: raise ValueError( "Can't set unsupported unit: %r" % units) _cached_ut_unit[units] = ut_unit #--- End: if self._isreftime = False self._calendar = None self._utime = None #--- End: if self._ut_unit = ut_unit self._units = units if names is not None or definition is not None: self._units = self.formatted(names, definition) return elif calendar: #--------------------------------------------------------- # Calendar is set, but units are not. #--------------------------------------------------------- self._units = None self._ut_unit = None self._isreftime = True self._calendar = calendar self._utime = Utime(_canonical_calendar[calendar.lower()]) return #--- End: if if _ut_unit is not None: #--------------------------------------------------------- # _ut_unit is set #--------------------------------------------------------- self._ut_unit = _ut_unit units = self.formatted(names, definition) _cached_ut_unit[units] = _ut_unit self._units = units self._isreftime = False self._calendar = None self._utime = None return #--- End: if #------------------------------------------------------------- # Nothing has been set #------------------------------------------------------------- self._units = None self._ut_unit = None self._isreftime = False self._calendar = None self._utime = None #--- End: def # def __getstate__(self): # ''' # #Called when pickling. # #:Parameters: # # None # #:Returns: # # out : dict # A dictionary of the instance's attributes # #:Examples: # #>>> u = cf.Units('days since 3-4-5', calendar='gregorian') #>>> u.__getstate__() #{'calendar': 'gregorian', # 'units': 'days since 3-4-5'} # #''' # return dict([(attr, getattr(self, attr)) # for attr in ('calendar', 'units') if hasattr(self, attr)]) # #--- End: def # # def __setstate__(self, odict): # ''' # #Called when unpickling. # #:Parameters: # # odict : dict # The output from the instance's `__getstate__` method. # #:Returns: # # None # #''' # for attr, value in odict.iteritems(): # setattr(self, attr, value) # #--- End: def # def __hash__(self): # ''' #x.__hash__() <==> hash(x) # #''' ## if not self: ## return hash(self.__class__) # # if not self._isreftime: # return hash(('Units', self._ut_unit)) # ## return hash((self._ut_unit, self._rtime._jd0, self._rtime.calendar, ## self._rtime.tzoffset)) # return hash(('Units', # self._ut_unit, self._rtime_jd0, self._rtime_calendar, # self._rtime_tzoffset)) # #--- End: def def __repr__(self): ''' x.__repr__() <==> repr(x) ''' return '' % (self.__class__.__name__, str(self)) #--- End: def def __str__(self): ''' x.__str__() <==> str(x) ''' string = [] if self._units is not None: string.append(self._units) if self._calendar is not None: string.append('calendar=%s' % self._calendar) return ' '.join(string) #--- End: def def __deepcopy__(self, memo): ''' Used if copy.deepcopy is called on the variable. ''' return self #--- End: def def __nonzero__(self): ''' Truth value testing and the built-in operation ``bool`` x.__nonzero__() <==> x!=0 ''' return self._ut_unit is not None #--- End: def def __eq__(self, other): ''' The rich comparison operator ``==`` x.__eq__(y) <==> x==y ''' return self.equals(other) #--- End: def def __ne__(self, other): ''' The rich comparison operator ``!=`` x.__ne__(y) <==> x!=y ''' return not self.equals(other) #--- End: def def __sub__(self, other): ''' The binary arithmetic operation ``-`` x.__sub__(y) <==> x-y ''' if (self._isreftime or (isinstance(other, self.__class__) and other._isreftime)): raise ValueError("Can't do %r - %r" % (self, other)) try: _ut_unit = _ut_offset(self._ut_unit, _c_double(other)) return type(self)(_ut_unit=_ut_unit) except: raise ValueError("Can't do %r - %r" % (self, other)) #--- End: def def __add__(self, other): ''' The binary arithmetic operation ``+`` x.__add__(y) <==> x+y ''' if (self._isreftime or (isinstance(other, self.__class__) and other._isreftime)): raise ValueError("Can't do %r + %r" % (self, other)) try: _ut_unit = _ut_offset(self._ut_unit, _c_double(-other)) return type(self)(_ut_unit=_ut_unit) except: raise ValueError("Can't do %r + %r" % (self, other)) #--- End: def def __mul__(self, other): ''' The binary arithmetic operation ``*`` x.__mul__(y) <==> x*y ''' if isinstance(other, self.__class__): if self._isreftime or other._isreftime: raise ValueError("Can't do %r * %r" % (self, other)) try: ut_unit=_ut_multiply(self._ut_unit, other._ut_unit) except: raise ValueError("Can't do %r * %r" % (self, other)) #--- End: try else: if self._isreftime: raise ValueError("Can't do %r * %r" % (self, other)) try: ut_unit=_ut_scale(_c_double(other), self._ut_unit) except: raise ValueError("Can't do %r * %r" % (self, other)) #--- End: if return type(self)(_ut_unit=ut_unit) #--- End: def def __div__(self, other): ''' x.__div__(y) <==> x/y ''' if isinstance(other, self.__class__): if self._isreftime or other._isreftime: raise ValueError("Can't do %r / %r" % (self, other)) try: ut_unit=_ut_divide(self._ut_unit, other._ut_unit) except: raise ValueError("Can't do %r / %r" % (self, other)) #--- End: try else: if self._isreftime: raise ValueError("Can't do %r / %r" % (self, other)) try: ut_unit=_ut_scale(_c_double(1.0/other), self._ut_unit) except: raise ValueError("Can't do %r / %r" % (self, other)) #--- End: if return type(self)(_ut_unit=ut_unit) #--- End: def def __pow__(self, other, modulo=None): ''' The binary arithmetic operations ``**`` and ``pow`` x.__pow__(y) <==> x**y ''' # ------------------------------------------------------------ # y must be either an integer or the reciprocal of a positive # integer. # ------------------------------------------------------------ if modulo is not None: raise NotImplementedError( "3-argument power not supported for %r" % self.__class__.__name__) if self and not self._isreftime: ut_unit = self._ut_unit try: return type(self)(_ut_unit=_ut_raise(ut_unit, _c_int(other))) except: pass if 0 < other <= 1: # If other is a float and (1/other) is a positive # integer then take the (1/other)-th root. E.g. if # other is 0.125 then we take the 8-th root. try: recip_other = 1/other root = int(recip_other) if recip_other == root: ut_unit = _ut_root(ut_unit, _c_int(root)) if ut_unit is not None: return type(self)(_ut_unit=ut_unit) except: pass else: # If other is a float equal to its integer tehn raise # to the integer part. E.g. if other is 3.0 then we # raise to the power of 3; if other is -2.0 then we # raise to the power of -2 try: root = int(other) if other == root: ut_unit = _ut_raise(ut_unit, _c_int(root)) if ut_unit is not None: return type(self)(_ut_unit=ut_unit) except: pass #--- End: if #--- End: if raise ValueError("Can't do %r ** %r" % (self, other)) #--- End: def def __isub__(self, other): ''' x.__isub__(y) <==> x-=y ''' return self - other #--- End def def __iadd__(self, other): ''' x.__iadd__(y) <==> x+=y ''' return self + other #--- End def def __imul__(self, other): ''' The augmented arithmetic assignment ``*=`` x.__imul__(y) <==> x*=y ''' return self * other #--- End def def __idiv__(self, other): ''' The augmented arithmetic assignment ``/=`` x.__idiv__(y) <==> x/=y ''' return self / other #--- End def def __ipow__(self, other): ''' The augmented arithmetic assignment ``**=`` x.__ipow__(y) <==> x**=y ''' return self ** other #--- End def def __rsub__(self, other): ''' The binary arithmetic operation ``-`` with reflected operands x.__rsub__(y) <==> y-x ''' try: return -self + other except: raise ValueError("Can't do %r - %r" % (other, self)) #--- End def def __radd__(self, other): ''' The binary arithmetic operation ``+`` with reflected operands x.__radd__(y) <==> y+x ''' return self + other #--- End def def __rmul__(self, other): ''' The binary arithmetic operation ``*`` with reflected operands x.__rmul__(y) <==> y*x ''' return self * other #--- End def def __rdiv__(self, other): ''' x.__rdiv__(y) <==> y/x ''' try: return (self ** -1) * other except: raise ValueError("Can't do %r / %r" % (other, self)) #--- End def def __floordiv__(self, other): ''' x.__floordiv__(y) <==> x//y <==> x/y ''' return self / other #--- End def def __ifloordiv__(self, other): ''' x.__ifloordiv__(y) <==> x//=y <==> x/=y ''' return self / other #--- End def def __rfloordiv__(self, other): ''' x.__rfloordiv__(y) <==> y//x <==> y/x ''' try: return (self ** -1) * other except: raise ValueError("Can't do %r // %r" % (other, self)) #--- End def def __truediv__(self, other): ''' x.__truediv__(y) <==> x/y ''' return self / other #--- End def def __itruediv__(self, other): ''' x.__itruediv__(y) <==> x/=y ''' return self / other #--- End def def __rtruediv__(self, other): ''' x.__rtruediv__(y) <==> y/x ''' try: return (self ** -1) * other except: raise ValueError("Can't do %r / %r" % (other, self)) #--- End def def __mod__(self, other): ''' ''' raise ValueError("Can't do %r %% %r" % (self, other)) #--- End def def __neg__(self): ''' The unary arithmetic operation ``-`` x.__neg__() <==> -x ''' return self * -1 #--- End def def __pos__(self): ''' The unary arithmetic operation ``+`` x.__pos__() <==> +x ''' return self #--- End def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def isreftime(self): ''' True if the units are reference time units, False otherwise. Note that time units (such as ``'days'``) are not reference time units. .. seealso:: `isdimensionless`, `islongitude`, `islatitude`, `ispressure`, `istime` :Examples: >>> print Units('days since 2000-12-1 03:00').isreftime True >>> print Units('hours since 2100-1-1', calendar='noleap').isreftime True >>> print Units(calendar='360_day').isreftime True >>> print Units('days').isreftime False >>> print Units('kg').isreftime False >>> print Units().isreftime False ''' return self._isreftime #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def iscalendartime(self): ''' True if the units are reference time units, False otherwise. Note that time units (such as ``'days'``) are not reference time units. .. seealso:: `isdimensionless`, `islongitude`, `islatitude`, `ispressure`, `istime` :Examples: >>> print Units('days since 2000-12-1 03:00').isreftime True >>> print Units('hours since 2100-1-1', calendar='noleap').isreftime True >>> print Units(calendar='360_day').isreftime True >>> print Units('days').isreftime False >>> print Units('kg').isreftime False >>> print Units().isreftime False ''' return bool(_ut_are_convertible(self._ut_unit, _calendartime_ut_unit)) #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def isdimensionless(self): ''' True if the units are dimensionless, false otherwise. .. seealso:: `islongitude`, `islatitude`, `ispressure`, `isreftime`, `istime` :Examples: >>> cf.Units('').isdimensionless True >>> cf.Units('1').isdimensionless True >>> cf.Units('100').isdimensionless True >>> cf.Units('m/m').isdimensionless True >>> cf.Units('m km-1').isdimensionless True >>> cf.Units().isdimensionless False >>> cf.Units('m').isdimensionless False >>> cf.Units('m/s').isdimensionless False >>> cf.Units('days since 2000-1-1', calendar='noleap').isdimensionless False ''' return bool(_ut_are_convertible(self._ut_unit, _dimensionless_unit_one)) #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def ispressure(self): ''' True if the units are pressure units, false otherwise. .. seealso:: `isdimensionless`, `islongitude`, `islatitude`, `isreftime`, `istime` :Examples: >>> Units('bar').ispressure True >>> Units('hPa').ispressure True >>> print Units('meter^-1-kilogram-second^-2').ispressure True >>> Units('hours since 2100-1-1', calendar='noleap').ispressure False ''' ut_unit = self._ut_unit if ut_unit is None: return False return bool(_ut_are_convertible(ut_unit, _pressure_ut_unit)) #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def islatitude(self): ''' True if and only if the units are latitude units. This is the case if and only if the `units` attribute is one of ``'degrees_north'``, ``'degree_north'``, ``'degree_N'``, ``'degrees_N'``, ``'degreeN'``, and ``'degreesN'``. Note that units of ``'degrees'`` are not latitude units. .. seealso:: `isdimensionless`, `islongitude`, `ispressure`, `isreftime`, `istime` :Examples: >>> Units('degrees_north').islatitude True >>> Units('degrees').islatitude False >>> Units('degrees_east').islatitude False >>> Units('kg').islatitude False >>> Units().islatitude False ''' return self._units in ('degrees_north', 'degree_north', 'degree_N', 'degrees_N', 'degreeN', 'degreesN') #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def islongitude(self): ''' True if and only if the units are longitude units. This is the case if and only if the `units` attribute is one of ``'degrees_east'``, ``'degree_east'``, ``'degree_E'``, ``'degrees_E'``, ``'degreeE'``, and ``'degreesE'``. Note that units of ``'degrees'`` are not longitude units. .. seealso:: `isdimensionless`, `islatitude`, `ispressure`, `isreftime`, `istime` :Examples: >>> Units('degrees_east').islongitude True >>> Units('degrees').islongitude False >>> Units('degrees_north').islongitude False >>> Units('kg').islongitude False >>> Units().islongitude False ''' return self._units in ('degrees_east', 'degree_east', 'degree_E', 'degrees_E', 'degreeE', 'degreesE') #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def istime(self): '''True if the units are time units, False otherwise. Note that reference time units (such as ``'days since 2000-12-1'``) are not time units, nor are calendar years and calendar months. .. seealso:: `iscalendartime`, `isdimensionless`, `islongitude`, `islatitude`, `ispressure`, `isreftime` :Examples: >>> Units('days').istime True >>> Units('seconds').istime True >>> Units('kg').istime False >>> Units().istime False >>> Units('hours since 2100-1-1', calendar='noleap').istime False >>> Units(calendar='360_day').istime False >>> Units('calendar_years').istime False >>> Units('calendar_months').istime False ''' if self._isreftime: return False ut_unit = self._ut_unit if ut_unit is None: return False return bool(_ut_are_convertible(ut_unit, _day_ut_unit)) #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def reftime(self): ''' The reference date-time of reference time units. .. seealso:: `calendar`, `isreftime`, `units` :Examples: >>> repr(Units('days since 1900-1-1').reftime) >>> str(Units('days since 1900-1-1 03:00').reftime) '1900-01-01 03:00:00' ''' utime = self._utime if utime: origin = utime.origin if origin: return origin #--- End: if raise AttributeError( "{0!r} has no attribute 'reftime'".format(self.__class__.__name__)) #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def calendar(self): ''' The calendar for reference time units. May be any string allowed by the calendar CF property. If it is unset then the default CF calendar is assumed when required. .. seealso:: `units` :Examples: >>> Units(calendar='365_day').calendar '365_day' >>> Units('days since 2001-1-1', calendar='noleap').calendar 'noleap' >>> Units('days since 2001-1-1').calendar AttributeError: Units has no attribute 'calendar' ''' value = self._calendar if value is not None: return value raise AttributeError("%s has no attribute 'calendar'" % self.__class__.__name__) #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def units(self): ''' The units. May be any string allowed by the units CF property. .. seealso:: `calendar` :Examples: >>> Units('kg').units 'kg' >>> Units('seconds').units 'seconds' >>> Units('days since 2000-1-1', calendar='366_day').units 'days since 2000-1-1' ''' value = self._units if value is not None: return value raise AttributeError("'%s' object has no attribute 'units'" % self.__class__.__name__) #--- End: def def equivalent(self, other): ''' Returns True if numeric values in one unit are convertible to numeric values in the other unit. .. seealso:: `~cf.Units.equals` :Parameters: other : Units The other units. :Returns: out : bool True if the units are equivalent, False otherwise. :Examples: >>> u = Units('m') >>> v = Units('km') >>> w = Units('s') >>> u.equivalent(v) True >>> u.equivalent(w) False >>> u = Units('days since 2000-1-1') >>> v = Units('days since 2000-1-1', calendar='366_day') >>> w = Units('seconds since 1978-3-12', calendar='gregorian) >>> u.equivalent(v) False >>> u.equivalent(w) True ''' isreftime1 = self._isreftime isreftime2 = other._isreftime if isreftime1 and isreftime2: # Both units are reference-time units units0 = self._units units1 = other._units if units0 and units1 or (not units0 and not units1): return self._utime.calendar == other._utime.calendar else: return False #--- End: if # Still here? if not self and not other: # Both units are null and therefore equivalent return True if not isreftime1 and not isreftime2: # Both units are not reference-time units return bool(_ut_are_convertible(self._ut_unit, other._ut_unit)) # Still here? Then units are not equivalent. return False #--- End: def def formatted(self, names=None, definition=None): ''' Formats the string stored in the `units` attribute in a standardized manner. The `units` attribute is modified in place and its new value is returned. :Parameters: names : bool, optional Use unit names instead of symbols. definition : bool, optional The formatted string is given in terms of basic-units instead of stopping any expansion at the highest level possible. :Returns: out : str The formatted string. :Examples: >>> u = Units('W') >>> u.units 'W' >>> u.units = u.format(names=True) >>> u.units 'watt' >>> u.units = u.format(definition=True) >>> u.units 'm2.kg.s-3' >>> u.units = u.format(names=True, definition=True) 'meter^2-kilogram-second^-3' >>> u.units = u.format() >>> u.units 'W' >>> u.units='dram' >>> u.format(names=True) '1.848345703125e-06 meter^3' Formatting is also available during object initialization: >>> u = Units('m/s', format=True) >>> u.units 'm.s-1' >>> u = Units('dram', names=True) >>> u.units '1.848345703125e-06 m3' >>> u = Units('W', names=True, definition=True) >>> u.units 'meter^2-kilogram-second^-3' ''' ut_unit = self._ut_unit if ut_unit is None: raise ValueError("Can't format unit %r" % self) opts = _UT_ASCII if names: opts |= _UT_NAMES if definition: opts |= _UT_DEFINITION if _ut_format(ut_unit, _string_buffer, _sizeof_buffer, opts) != -1: return _string_buffer.value raise ValueError("Can't format unit %r" % self) #--- End: def @staticmethod def conform(x, from_units, to_units, inplace=False): ''' Conform values in one unit to equivalent values in another, compatible unit. Returns the conformed values. The values may either be a numpy array or a python numeric type. The returned value is of the same type, except that input integers are converted to floats (see the *inplace* keyword). :Parameters: x : numpy.ndarray or python numeric from_units : Units The original units of `x` to_units : Units The units to which `x` should be conformed to. inplace : bool, optional If True and `x` is a numpy array then change it in place, creating no temporary copies, with one exception: If `x` is of integer type and the conversion is not null, then it will not be changed inplace and the returned conformed array will be of float type. :Returns: out : numpy.ndarray or python numeric The modified numeric values. :Examples: >>> Units.conform(2, Units('km'), Units('m')) 2000.0 >>> import numpy >>> a = numpy.arange(5.0) >>> Units.conform(a, Units('minute'), Units('second')) array([ 0., 60., 120., 180., 240.]) >>> a array([ 0., 1., 2., 3., 4.]) >>> Units.conform(a, Units('days since 2000-12-1'), Units('days since 2001-1-1'), inplace=True) array([-31., -30., -29., -28., -27.]) >>> a array([-31., -30., -29., -28., -27.]) .. warning:: Do not change the calendar of reference time units in the current version. Whilst this is possible, it will almost certainly result in an incorrect interpretation of the data or an error. Allowing the calendar to be changed is under development and will be available soon. ''' if from_units.equals(to_units): if inplace: return x else: return x.copy() #--- End: if if not from_units.equivalent(to_units): raise ValueError("Units are not convertible: %r, %r" % (from_units, to_units)) ut_unit1 = from_units._ut_unit ut_unit2 = to_units._ut_unit if ut_unit1 is None or ut_unit2 is None: raise ValueError("Units are not convertible: %r, %r" % (from_units, to_units)) convert = _ut_compare(ut_unit1, ut_unit2) if from_units._isreftime and to_units._isreftime: # -------------------------------------------------------- # Both units are time-reference units, so calculate the # non-zero offset in units of days. # -------------------------------------------------------- offset = to_units._utime._jd0 - from_units._utime._jd0 else: offset = 0 # ---------------------------------------------------------------- # If the two units are identical then no need to alter the # value, so return it unchanged. # ---------------------------------------------------------------- # if not convert and not offset: # return x if convert: cv_converter = _ut_get_converter(ut_unit1, ut_unit2) if not cv_converter: _cv_free(cv_converter) raise ValueError("Units are not convertible: %r, %r" % (from_units, to_units)) #-- End: if # ---------------------------------------------------------------- # Find out if x is an numpy array or a python number # ---------------------------------------------------------------- if isinstance(x, numpy_generic): # Convert a generic numpy scalar to a 0-d array x = numpy_array(x) if not isinstance(x, numpy_ndarray): x_is_numpy = False else: x_is_numpy = True if not x.flags.contiguous: x = numpy_array(x, order='C') #ARRRGGHH dch # ---------------------------------------------------------------- # Convert an integer numpy array to a float numpy array # ---------------------------------------------------------------- if inplace: if x.dtype.kind is 'i': if x.dtype.char is 'i': y = x.view(dtype='float32') y[...] = x x.dtype = numpy_dtype('float32') elif x.dtype.char is 'l': y = x.view(dtype=float) y[...] = x x.dtype = numpy_dtype(float) else: # At numpy vn1.7 astype has many more keywords ... if x.dtype.kind is 'i': if x.dtype.char is 'i': x = x.astype('float32') elif x.dtype.char is 'l': x = x.astype(float) else: x = x.copy() #--- End: if # ------------------------------------------------------------ # Convert the array to the new units # ------------------------------------------------------------ if convert: if x_is_numpy: # Create a pointer to the array cast to the appropriate # ctypes object itemsize = x.dtype.itemsize pointer = x.ctypes.data_as(_ctypes_POINTER[itemsize]) # print 'U1 ', type(x) # Convert the array in place _cv_convert_array[itemsize](cv_converter, pointer, _c_size_t(x.size), pointer) else: # Create a pointer to the number cast to a ctypes double # object. y = _c_double(x) pointer = ctypes.pointer(y) # Convert the pointer _cv_convert_doubles(cv_converter, pointer, _c_size_t(1), pointer) # Reset the number x = y.value #--- End: if _cv_free(cv_converter) #--- End: if # print 'U', type(x) # ------------------------------------------------------------ # Apply an offset for reference-time units # ------------------------------------------------------------ if offset: # Convert the offset from 'days' to the correct units and # subtract it from x if _ut_compare(_day_ut_unit, ut_unit2): cv_converter = _ut_get_converter(_day_ut_unit, ut_unit2) scale = numpy_array(1.0) pointer = scale.ctypes.data_as(ctypes.POINTER(ctypes.c_double)) _cv_convert_doubles(cv_converter, pointer, _c_size_t(scale.size), pointer) _cv_free(cv_converter) offset *= scale.item() #--- End: if x -= offset #--- End: if # print 'U', type(x) return x #--- End: def def copy(self): ''' Return a deep copy. Equivalent to ``copy.deepcopy(u)``. :Returns: out : The deep copy. :Examples: >>> v = u.copy() ''' return self #--- End: def def dump(self, display=True, prefix=None, omit=()): ''' Return a string containing a description of the units. :Parameters: display : bool, optional If False then return the description as a string. By default the description is printed, i.e. ``u.dump()`` is equivalent to ``print u.dump(display=False)``. :Returns: out : None or str A string containing the description. :Examples: ''' if prefix is None: prefix = self.__class__.__name__ string = [] for attr in self.__dict__: try: string.append("%s.%s = '%s'" % (prefix, attr, getattr(self, attr))) except AttributeError: pass #--- End: for string = '\n'.join(string) if display: print string else: return string #--- End: def def equals(self, other, rtol=None, atol=None): ''' Return True if and only if numeric values in one unit are convertible to numeric values in the other unit and their conversion is a scale factor of 1. .. seealso:: `~cf.Units.equivalent` :Parameters: other : Units The other units. :Returns: out : bool True if the units are equal, False otherwise. :Examples: >>> u = Units('km') >>> v = Units('1000m') >>> w = Units('100000m') >>> u.equals(v) True >>> u.equals(w) False >>> u = Units('m s-1') >>> m = Units('m') >>> s = Units('s') >>> u.equals(m) False >>> u.equals(m/s) True >>> (m/s).equals(u) True Undefined units are considered equal: >>> u = Units() >>> v = Units() >>> u.equals(v) True ''' try: if _ut_compare(self._ut_unit, other._ut_unit): return False except AttributeError: return False isreftime1 = self._isreftime isreftime2 = other._isreftime if not isreftime1 and not isreftime2: # Neither units is reference-time so they're equal return True if isreftime1 and isreftime2: # Both units are reference-time utime0 = self._utime utime1 = other._utime if utime0.calendar != utime1.calendar: return False return utime0.origin_equals(utime1) #--- End: if # One unit is a reference-time and the other is not so they're # not equal return False #--- End: def def inspect(self): ''' Inspect the object for debugging. .. seealso:: `cf.inspect` :Returns: None ''' print cf_inspect(self) #--- End: def def log(self, base): ''' Return the logarithmic unit corresponding to the given logarithmic base. :Parameters: base : int or float The logarithmic base. :Returns: out : Units The logarithmic unit corresponding to the given logarithmic base. :Examples: >>> u = Units('W', names=True) >>> u >>> u.log(10) >>> u.log(2) >>> import math >>> u.log(math.e) >>> u.log(3.5) ''' try: _ut_unit = _ut_log(_c_double(base), self._ut_unit) except TypeError: pass else: if _ut_unit: return type(self)(_ut_unit=_ut_unit) #--- End: try raise ValueError( "Can't take the logarithm to the base %r of %r" % (base, self)) #--- End def #--- End: class # ==================================================================== # # Utime object # # ==================================================================== class Utime(netCDF4.netcdftime.utime): ''' Performs conversions of netCDF time coordinate data to/from datetime objects. This object is (currently) functionally equivalent to a `netCDF4.netcdftime.utime` object. **Attributes** ============== ====================================================== Attribute Description ============== ====================================================== `!_jd0` `!calendar` The calendar used in the time calculation. `!origin` A date/time object for the reference time. `!tzoffset` Time zone offset in minutes. `!unit_string` `!units` ============== ====================================================== ''' def __init__(self, calendar, unit_string=None): ''' **Initialization** :Parameters: calendar : str The calendar used in the time calculations. Must be one of: ``'gregorian'``, ``'360_day'``, ``'365_day'``, ``'366_day'``, ``'julian'``, ``'proleptic_gregorian'``, although this is not checked. unit_string : str, optional A string of the form "time-units since " defining the reference-time units. ''' if unit_string: _netCDF4_netcdftime_utime.__init__(self, unit_string, calendar) else: self.calendar = calendar self._jd0 = None self.origin = None self.tzoffset = None self.unit_string = None self.units = None #--- End: def def __repr__(self): ''' x.__repr__() <==> repr(x) ''' unit_string = self.unit_string if unit_string: x = [unit_string] else: x = [] x.append(self.calendar) return "" % ' '.join(x) #--- End: def def inspect(self): ''' Inspect the object for debugging. .. seealso:: `cf.inspect` :Returns: None ''' print cf_inspect(self) #--- End: def def num2date(self, time_value): '''Return a datetime-like object given a time value. The units of the time value are described by the `!unit_string` and `!calendar` attributes. See `netCDF4.netcdftime.utime.num2date` for details. In addition to `netCDF4.netcdftime.utime.num2date`, this method handles units of months and years as defined by Udunits, ie. 1 year = 365.242198781 days, 1 month = 365.242198781/12 days. ''' units = self.units unit_string = self.unit_string if units in ('month', 'months'): # Convert months to days unit_string = unit_string.replace(units, 'days', 1) time_value = numpy_array(time_value)*365.242198781/12 elif units in ('year', 'years', 'yr'): # Convert years to days unit_string = unit_string.replace(units, 'days', 1) time_value = numpy_array(time_value)*365.242198781 elif units == 'calendar_month': # Convert months to days unit_string = unit_string.replace(units, 'days', 1) time_value = numpy_array(time_value)*365.242198781/12 elif units == 'calendar_year': # Convert months to days unit_string = unit_string.replace(units, 'days', 1) time_value = numpy_array(time_value)*365.242198781/12 u = _netCDF4_netcdftime_utime(unit_string, self.calendar) return u.num2date(time_value) #--- End: def def origin_equals(self, other): ''' ''' if self is other: return True else: return (self._jd0 == other._jd0 and self.calendar == other.calendar and self.tzoffset == other.tzoffset) #--- End: def #--- End: class cf-python-1.3.2/cf/data/0000755000175000017500000000000012770523315015132 5ustar daviddavid00000000000000cf-python-1.3.2/cf/data/collapse_functions.py0000644000175000017500000005460712757622406021420 0ustar daviddavid00000000000000from numpy import allclose as numpy_allclose from numpy import amax as numpy_amax from numpy import amin as numpy_amin from numpy import any as numpy_any from numpy import array as numpy_array from numpy import asanyarray as numpy_asanyarray from numpy import average as numpy_average from numpy import bool_ as numpy_bool_ from numpy import copy as numpy_copy from numpy import empty as numpy_empty from numpy import expand_dims as numpy_expand_dims from numpy import integer as numpy_integer #from numpy import isclose as numpy_isclose from numpy import maximum as numpy_maximum from numpy import minimum as numpy_minimum from numpy import ndim as numpy_ndim from numpy import sum as numpy_sum from numpy import where as numpy_where from numpy import zeros as numpy_zeros import numpy from numpy.ma import array as numpy_ma_array from numpy.ma import average as numpy_ma_average from numpy.ma import expand_dims as numpy_ma_expand_dims from numpy.ma import isMA as numpy_ma_isMA from numpy.ma import masked as numpy_ma_masked from numpy.ma import masked_less as numpy_ma_masked_less from numpy.ma import masked_where as numpy_ma_masked_where from numpy.ma import nomask as numpy_ma_nomask from numpy.ma import where as numpy_ma_where from functools import partial from itertools import izip from operator import mul as mul from ..functions import broadcast_array def psum(x, y): ''' Add two arrays element-wise. If either or both of the arrays are masked then the output array is masked only where both input arrays are masked. :Parameters: x : numpy array-like *Might be updated in place*. y : numpy array-like Will not be updated in place. :Returns: out : numpy array :Examples: >>> c = psum(a, b) ''' if numpy_ma_isMA(x): if numpy_ma_isMA(y): # x and y are both masked x_mask = x.mask x = x.filled(0) x += y.filled(0) x = numpy_ma_array(x, mask=x_mask & y.mask, copy=False) else: # Only x is masked x = x.filled(0) x += y elif numpy_ma_isMA(y): # Only y is masked x += y.filled(0) else: # x and y are both unmasked x += y return x #--- End: def def pmax(x, y): ''' :Parameters: x : array-like May be updated in place and should not be used again. y : array-like Will not be updated in place. :Returns: out : numpy array ''' if numpy_ma_isMA(x): if numpy_ma_isMA(y): # x and y are both masked z = numpy_maximum(x, y) z = numpy_ma_where(x.mask & -y.mask, y, z) x = numpy_ma_where(y.mask & -x.mask, x, z) if x.mask is numpy_ma_nomask: #not numpy_any(x.mask): x = numpy_array(x) else: # Only x is masked z = numpy_maximum(x, y) x = numpy_ma_where(x.mask, y, z) if x.mask is numpy_ma_nomask: #not numpy_any(x.mask): x = numpy_array(x) elif numpy_ma_isMA(y): # Only y is masked z = numpy_maximum(x, y) x = numpy_ma_where(y.mask, x, z) if x.mask is numpy_ma_nomask: #not numpy_any(x.mask): x = numpy_array(x) else: # x and y are both unmasked if not numpy_ndim(x): # Make sure that we have a numpy array (as opposed to, # e.g. a numpy.float64) x = numpy_asanyarray(x) numpy_maximum(x, y, out=x) return x #--- End: def def pmin(x, y): ''' :Parameters: x : numpy array May be updated in place and should not be used again. y : numpy array Will not be updated in place. :Returns: out : numpy array ''' if numpy_ma_isMA(x): if numpy_ma_isMA(y): # x and y are both masked z = numpy_minimum(x, y) z = numpy_ma_where(x.mask & -y.mask, y, z) x = numpy_ma_where(y.mask & -x.mask, x, z) if x.mask is numpy_ma_nomask: x = numpy_array(x) else: # Only x is masked z = numpy_minimum(x, y) x = numpy_ma_where(x.mask, y, z) if x.mask is numpy_ma_nomask: x = numpy_array(x) elif numpy_ma_isMA(y): # Only y is masked z = numpy_minimum(x, y) x = numpy_ma_where(y.mask, x, z) if x.mask is numpy_ma_nomask: x = numpy_array(x) else: # x and y are both unmasked if not numpy_ndim(x): # Make sure that we have a numpy array (as opposed to, # e.g. a numpy.float64) x = numpy_asanyarray(x) numpy_minimum(x, y, out=x) return x #--- End: def def mask_where_too_few_values(Nmin, N, x): '''Mask elements of N and x where N is strictly less than Nmin. :Parameters: Nmin: `int` N: `numpy.ndarray` x: `numpy.ndarray` :Returns: out: (`numpy.ndarray`, `numpy.ndarray`) A tuple containing *N* and *x*, both masked where *N* is strictly less than *Nmin*. ''' if N.min() < Nmin: mask = N < Nmin N = numpy_ma_array(N, mask=mask, copy=False, shrink=False) x = numpy_ma_array(x, mask=mask, copy=False, shrink=True) return N, x #--- End: def #--------------------------------------------------------------------- # Maximum #--------------------------------------------------------------------- def max_f(a, axis=None, masked=False): ''' Return the maximum of an array, or the maxima of an array along an axis. :Parameters: a : numpy array_like Input array axis : int, optional Axis along which to operate. By default, flattened input is used. masked : bool :Returns: out : 2-tuple of numpy arrays The sample sizes and the maxima. ''' N = sample_size_f(a, axis=axis, masked=masked) amax = numpy_amax(a, axis=axis) if not numpy_ndim(amax): # Make sure that we have a numpy array (as opposed to, e.g. a # numpy.float64) amax = numpy_asanyarray(amax) return N, amax #--- End: def def max_fpartial(out, out1=None): N, amax = out if out1 is not None: N1, amax1 = out1 N = psum(N, N1) amax = pmax(amax, amax1) #--- End: if return N, amax #--- End: def def max_ffinalise(out, sub_samples=None): ''' sub_samples : *optional* Ignored. ''' return mask_where_too_few_values(1, *out) #--- End: def #--------------------------------------------------------------------- # Minimum #--------------------------------------------------------------------- def min_f(a, axis=None, masked=False): ''' Return the minimum of an array, or the minima of an array along an axis. :Parameters: a : numpy array_like Input array axis : int, optional Axis along which to operate. By default, flattened input is used. masked : bool :Returns: out : 2-tuple of numpy arrays The sample sizes and the minima. ''' N = sample_size_f(a, axis=axis, masked=masked) amin = numpy_amin(a, axis=axis) if not numpy_ndim(amin): # Make sure that we have a numpy array (as opposed to, e.g. a # numpy.float64) amin = numpy_asanyarray(amin) return N, amin #--- End: def def min_fpartial(out, out1=None): ''' ''' N, amin = out if out1 is not None: N1, amin1 = out1 N = psum(N, N1) amin = pmin(amin, amin1) #--- End: if return N, amin #--- End: def def min_ffinalise(out, sub_samples=None): ''' sub_samples : *optional* Ignored. ''' return mask_where_too_few_values(1, *out) #--- End: def #--------------------------------------------------------------------- # Mean #--------------------------------------------------------------------- def mean_f(a, axis=None, weights=None, masked=False): ''' The weighted average along the specified axes. :Parameters: a : array-like Input array. Not all missing data axis : int, optional Axis along which to operate. By default, flattened input is used. weights : array-like, optional masked : bool, optional kwargs : ignored :Returns: out : tuple 3-tuple. ''' if masked: average = numpy_ma_average else: average = numpy_average avg, sw = average(a, axis=axis, weights=weights, returned=True) if not numpy_ndim(avg): avg = numpy_asanyarray(avg) sw = numpy_asanyarray(sw) if weights is None: N = sw.copy() else: N = sample_size_f(a, axis=axis, masked=masked) return N, avg, sw #--- End: def def mean_fpartial(out, out1=None): ''' :Returns: out: `numpy.ndarray`, `numpy.ndarray`, `numpy.ndarray` ''' N, avg, sw = out if out1 is None: avg *= sw else: N1, avg1, sw1 = out1 avg1 *= sw1 N = psum(N, N1) avg = psum(avg, avg1) sw = psum(sw, sw1) #--- End: if return N, avg, sw #--- End: def def mean_ffinalise(out, sub_samples=None): ''' sub_samples: optional Ignored. :Returns: out: `numpy.ndarray`, `numpy.ndarray` ''' N, avg, sw = out if sub_samples: avg /= sw return mask_where_too_few_values(1, N, avg) #--- End: def #--------------------------------------------------------------------- # Mid range: Average of maximum and minimum #--------------------------------------------------------------------- def mid_range_f(a, axis=None, masked=False): ''' Return the minimum and maximum of an array or the minima and maxima along an axis. ``mid_range_f(a, axis=axis)`` is equivalent to ``(numpy.amin(a, axis=axis), numpy.amax(a, axis=axis))`` :Parameters: a : numpy array_like Input array axis : int, optional Axis along which to operate. By default, flattened input is used. kwargs : ignored :Returns: out : tuple The minimum and maximum inside a 2-tuple. ''' N = sample_size_f(a, axis=axis, masked=masked) amin = numpy_amin(a, axis=axis) amax = numpy_amax(a, axis=axis) if not numpy_ndim(amin): # Make sure that we have a numpy array (as opposed to, e.g. a # numpy.float64) amin = numpy_asanyarray(amin) amax = numpy_asanyarray(amax) return N, amin, amax #--- End: def def mid_range_fpartial(out, out1=None): ''' ''' N, amin, amax = out if out1 is not None: N1, amin1, amax1 = out1 N = psum(N, N1) amin = pmin(amin, amin1) amax = pmax(amax, amax1) #--- End: if return N, amin, amax #--- End: def def mid_range_ffinalise(out, sub_samples=None): ''' :Parameters: out : ordered sequence amin : numpy.ndarray amax : numpy.ndarray sub_samples : *optional* Ignored. ''' N, amin, amax = out # Cast bool, unsigned int, and int to float64 if issubclass(amax.dtype.type, (numpy_integer, numpy_bool_)): amax = amax.astype(float) amax += amin amax *= 0.5 return mask_where_too_few_values(1, N, amax) #--- End: def #--------------------------------------------------------------------- # Range: Absolute difference between maximum and minimum #--------------------------------------------------------------------- range_f = mid_range_f range_fpartial = mid_range_fpartial def range_ffinalise(out, sub_samples=None): ''' Absolute difference between maximum and minimum :Parameters: out : ordered sequence sub_samples : *optional* Ignored. ''' N, amin, amax = out amax -= amin return mask_where_too_few_values(1, N, amax) #--- End: def #--------------------------------------------------------------------- # Sample size #--------------------------------------------------------------------- def sample_size_f(a, axis=None, masked=False): ''' axis : int, optional non-negative ''' if masked: N = numpy_sum(-a.mask, axis=axis, dtype=float) if not numpy_ndim(N): N = numpy_asanyarray(N) else: if axis is None: N = numpy_array(a.size, dtype=float) else: shape = a.shape N = numpy_empty(shape[:axis]+shape[axis+1:], dtype=float) N[...] = shape[axis] #--- End: if return N #--- End: def def sample_size_fpartial(N, out1=None): ''' :Parameters: N : numpy array :Returns: out : numpy array ''' if out1 is not None: N1 = out1 N = psum(N, N1) return N #--- End: def def sample_size_ffinalise(N, sub_samples=None): ''' :Parameters: N : numpy array sub_samples : *optional* Ignored. :Returns: out : tuple A 2-tuple containing *N* twice. ''' return N, N #--- End: def #--------------------------------------------------------------------- # Sum #--------------------------------------------------------------------- def sum_f(a, axis=None, masked=False): ''' Return the sum of an array or the sum along an axis. ``sum_f(a, axis=axis)`` is equivalent to ``(numpy.sum(a, axis=axis),)`` :Parameters: array : numpy array-like Input array axis : int, optional Axis along which to operate. By default, flattened input is used. kwargs : ignored :Returns: out : tuple 2-tuple ''' N = sample_size_f(a, axis=axis, masked=masked) asum = a.sum(axis=axis) if not numpy_ndim(asum): asum = numpy_asanyarray(asum) return N, asum #--- End: def def sum_fpartial(out, out1=None): ''' ''' N, asum = out if out1 is not None: N1, asum1 = out1 N = psum(N, N1) asum = psum(asum, asum1) #--- End: if return N, asum #--- End: def def sum_ffinalise(out, sub_samples=None): ''' sub_samples : *optional* Ignored. ''' return mask_where_too_few_values(1, *out) #--- End: def #--------------------------------------------------------------------- # Sum of weights #--------------------------------------------------------------------- def sw_f(a, axis=None, masked=False, weights=None): ''' ''' N = sample_size_f(a, axis=axis, masked=masked) if weights is not None: if weights.ndim < a.ndim: weights = broadcast_array(weights, a.shape) if masked: weights = numpy_ma_array(weights, mask=a.mask, copy=False) sw = weights.sum(axis=axis) if not numpy_ndim(sw): sw = numpy_asanyarray(sw) else: sw = N.copy() return N, sw #--- End: def sw_fpartial = sum_fpartial sw_ffinalise = sum_ffinalise #--------------------------------------------------------------------- # Sum of squares of weights #--------------------------------------------------------------------- def sw2_f(a, axis=None, masked=False, weights=None): ''' ''' N = sample_size_f(a, axis=axis, masked=masked) if weights is not None: if weights.ndim < a.ndim: weights = broadcast_array(weights, a.shape) if masked: weights = numpy_ma_array(weights, mask=a.mask, copy=False) sw2 = (weights*weights).sum(axis=axis) if not numpy_ndim(sw2): sw2 = numpy_asanyarray(sw2) else: sw2 = N.copy() return N, sw2 #--- End: def sw2_fpartial = sum_fpartial sw2_ffinalise = sum_ffinalise #--------------------------------------------------------------------- # Variance #--------------------------------------------------------------------- def var_f(a, axis=None, weights=None, masked=False, ddof=1, f=None): ''' :Return: out: 8-`tuple` of `numpy.ndarray` ''' # ---------------------------------------------------------------- # Find the minimum and maximum values of the weights if required # ---------------------------------------------------------------- if not f and weights is not None and ddof: if weights.ndim <= 1: # Weights are 1-d wmin = weights.min() wmax = weights.max() else: # Weights have the same shape as a wmin = weights.min(axis=axis) wmax = weights.max(axis=axis) else: wmin = None wmax = None # ---------------------------------------------------------------- # Methods: # # http://en.wikipedia.org/wiki/Standard_deviation#Population-based_statistics # http://en.wikipedia.org/wiki/Weighted_mean#Weighted_sample_variance # ---------------------------------------------------------------- N, avg, sw = mean_f(a, weights=weights, axis=axis, masked=masked) if axis is not None and avg.size > 1: # We collapsed over a single axis and the array has 2 or more # axes, so add an extra size 1 axis to the mean so that # broadcasting works when we calculate the variance. reshape_avg = True if masked: expand_dims = numpy_ma_expand_dims else: expand_dims = numpy_expand_dims avg = expand_dims(avg, axis) else: reshape_avg = False var = a - avg var *= var if masked: average = numpy_ma_average else: average = numpy_average var = average(var, axis=axis, weights=weights) if reshape_avg: shape = avg.shape avg = avg.reshape(shape[:axis] + shape[axis+1:]) if not numpy_ndim(var): var = numpy_asanyarray(var) return N, var, avg, sw, ddof, f, wmin, wmax #--- End: def def var_fpartial(out, out1=None): ''' ''' N, var, avg, sw, ddof, f, wmin, wmax = out if out1 is None: # ------------------------------------------------------------ # var = sw(var+avg**2) # avg = sw*avg # ------------------------------------------------------------ var += avg*avg var *= sw avg *= sw else: # ------------------------------------------------------------ # var = var + sw1(var1+avg1**2) # avg = avg + sw1*avg1 # sw = sw + sw1 # ------------------------------------------------------------ N1, var1, avg1, sw1, ddof, f, wmin1, wmax1 = out1 N = psum(N, N1) var1 += avg1*avg1 var1 *= sw1 avg1 *= sw1 var = psum(var, var1) avg = psum(avg, avg1) sw = psum(sw , sw1) if wmin is not None: wmin = pmin(wmin, wmin1) wmax = pmax(wmax, wmax1) #--- End: def return N, var, avg, sw, ddof, f, wmin, wmax #--- End: def def var_ffinalise(out, sub_samples=None): ''' ''' N, var, avg, sw, ddof, f, wmin, wmax = out N, var = mask_where_too_few_values(max(2, ddof+1), N, var) if sub_samples: # ---------------------------------------------------------------- # The global biased variance = {[SUM(psw(pv+pm**2)]/sw} - m**2 # # where psw = partial sum of weights # pv = partial biased variance # pm = partial mean # sw = global sum of weights # m = global mean # # Currently: var = SUM(psw(pv+pm**2) # avg = sw*m # # http://en.wikipedia.org/wiki/Standard_deviation#Population-based_statistics # ---------------------------------------------------------------- avg /= sw avg *= avg var /= sw var -= avg #--- End: if # ---------------------------------------------------------------- # var is now the global variance with sw degrees of freedom # ---------------------------------------------------------------- if ddof: if f: sw *= f elif wmin is not None: # --------------------------------------------------------- # The global variance is weighted and needs to be # calculated with greater than 0 delta degrees of # freedom. The sum of weights (sw) needs to be adjusted: # # sw = f*sw (approximately!) # # where f = smallest positive number whose products with # the smallest and largest weights and the sum of # weights are all integers # --------------------------------------------------------- wmin = wmin.astype(float) wmax = wmax.astype(float) sw = sw.astype(float) wmax /= wmin sw /= wmin if (not numpy_allclose(wmax, wmax.astype(int), rtol=1e-05, atol=1e-08) or not numpy_allclose(sw , sw.astype(int) , rtol=1e-05, atol=1e-08)): m = numpy_zeros(wmax.shape, dtype=int) n = 2 while True: nwmax = n*wmax nsw = n*sw ccc = (m == 0) ccc &= numpy.isclose(nwmax, nwmax.astype(int), rtol=1e-05, atol=1e-08) ccc &= numpy.isclose(nsw , nsw.astype(int) , rtol=1e-05, atol=1e-08) m = numpy_where(ccc, n, m) if m.min(): # Every element of m has been set (to an integer # greater than 1), so we are done. break # Some elements of m have not been set, so try the # next multiplier. n += 1 #--- End: while sw *= m #--- End: if #--- End: if # ------------------------------------------------------------ # Adjust the variance for fewer than sw degrees of freedom: # # var = var*sw/(sw-ddof) # ------------------------------------------------------------ var *= sw sw -= ddof var /= sw #--- End: if return N, var #--- End: def #--------------------------------------------------------------------- # Standard deviation #--------------------------------------------------------------------- sd_f = var_f sd_fpartial = var_fpartial def sd_ffinalise(out, sub_samples=None): ''' :Parameters: out : tuple A 2-tuple sub_samples : *optional* Ignored. ''' N, sd = var_ffinalise(out, sub_samples) sd **= 0.5 return N, sd #--- End: def cf-python-1.3.2/cf/data/__init__.py0000600000175000017500000000000012603546021017213 0ustar daviddavid00000000000000cf-python-1.3.2/cf/data/array.py0000600000175000017500000003161712625553637016633 0ustar daviddavid00000000000000from numpy import empty as numpy_empty from numpy import frombuffer as numpy_frombuffer from numpy import full as numpy_full from numpy import load as numpy_load from numpy import ndarray as numpy_ndarray from numpy import save as numpy_save from numpy.ma import array as numpy_ma_array from numpy.ma import is_masked as numpy_ma_is_masked from tempfile import mkstemp from os import close from multiprocessing import Array as multiprocessing_Array from ..functions import parse_indices, get_subspace from ..functions import inspect as cf_inspect from ..constants import CONSTANTS # ==================================================================== # # FileArray object # # ==================================================================== class FileArray(object): ''' A sub-array stored in a file. ''' flags = {'C_CONTIGUOUS': True, 'OWNDATA' : True} def __init__(self, **kwargs): ''' **Initialization** :Parameters: file : str The netCDF file name in normalized, absolute form. dtype : numpy.dtype The numpy data type of the data array. ndim : int Number of dimensions in the data array. shape : tuple The data array's dimension sizes. size : int Number of elements in the data array. ''' self.__dict__ = kwargs #--- End: def def __array__(self, *dtype): ''' Returns a numpy array copy the data array. :Returns: out : numpy.ndarray The numpy array copy the data array. :Examples: >>> numpy.all(a[...] == numpy.array(a)) True ''' if not dtype: return self[...] else: return self[...].astype(dtype[0]) #, copy=False) OUght to work! #--- End: def def __deepcopy__(self, memo): ''' Used if copy.deepcopy is called on the variable. ''' return self.copy() #--- End: def def __getitem__(self, indices): raise NotImplementedError( "Class {0} must override the __getitem__ method".format( self.__class__.__name)) def __repr__(self): ''' x.__repr__() <==> repr(x) ''' return "" % (self.__class__.__name__, str(self)) #--- End: def def __str__(self): ''' x.__str__() <==> str(x) ''' return "%s in %s" % (self.shape, self.file) #--- End: def @property def array(self): ''' ''' return self[...] #--- End: def @property def base(self): ''' ''' return #--- End: def def copy(self): ''' Return a deep copy. ``f.copy() is equivalent to ``copy.deepcopy(f)``. :Returns: out : A deep copy. :Examples: >>> g = f.copy() ''' C = self.__class__ new = C.__new__(C) new.__dict__ = self.__dict__.copy() return new #--- End: def def inspect(self): ''' Inspect the object for debugging. .. seealso:: `cf.inspect` :Returns: None ''' print cf_inspect(self) #--- End: def def close(self): pass #--- End: def def open(self): pass #--- End: def #--- End: class # ==================================================================== # # _TempFileArray object # # ==================================================================== class _TempFileArray(FileArray): ''' A indexable N-dimensional array supporting masked values. The array is stored on disk in a temporary file until it is accessed. The directory containing the temporary file may be found and set with the `cf.TEMPDIR` function. ''' def __init__(self, array): ''' **Initialization** :Parameters: array : numpy array The array to be stored on disk in a temporary file. :Examples: >>> f = _TempFileArray(numpy.array([1, 2, 3, 4, 5])) >>> f = _TempFileArray(numpy.ma.array([1, 2, 3, 4, 5])) ''' # ------------------------------------------------------------ # Use mkstemp because we want to be responsible for deleting # the temporary file when done with it. # ------------------------------------------------------------ fd, _partition_file = mkstemp(prefix='cf_array_', suffix='.npy', dir=CONSTANTS['TEMPDIR']) close(fd) # The name of the temporary file storing the array self._partition_file = _partition_file # Numpy data type of the array self.dtype = array.dtype # Tuple of the array's dimension sizes self.shape = array.shape # Number of elements in the array self.size = array.size # Number of dimensions in the array self.ndim = array.ndim numpy_save(_partition_file, self.saveable(array)) #--- End: def def __del__(self): ''' Called when the reference count reaches zero. ''' if getrefcount is not None: if getrefcount(self) > 2: return else: # getrefcount has itself been deleted or is in the process # of being torn down return # Remove the file from disk. _remove_temporary_files(self._partition_file) #--- End: def def __getitem__(self, indices): ''' x.__getitem__(indices) <==> x[indices] Returns a numpy array. ''' array = numpy_load(self._partition_file) indices = parse_indices(array.shape, indices) array = get_subspace(array, indices) if self._masked_as_record: # Convert a record array to a masked array array = numpy_ma_array(array['_data'], mask=array['_mask'], copy=False) array.shrink_mask() #--- End: if # Return the numpy array return array #--- End: def def __str__(self): ''' x.__str__() <==> str(x) ''' return '%s in %s' % (self.shape, self._partition_file) #--- End: def def close(self): ''' Close all referenced open files. :Returns: None :Examples: >>> f.close() ''' # No open files are referenced pass #--- End: def def saveable(self, array): ''' ''' if numpy_ma_isMaskedArray(array): self._masked_as_record = True return array.toflex() mask = getattr(array, mask, None) if mask is not None: # Mimic numpy.ma.MaskedArray.toflex self._masked_as_record = True record = numpy_ndarray(array.shape, dtype=[('_data', array.dtype), ('_mask', mask.dtype)]) record['_data'] = array record['_mask'] = mask array = record else: self._masked_as_record = False #--- End: if return array #--- End: def #--- End: class class FilledArray(FileArray): ''' **Initialization** :Parameters: dtype : numpy.dtype The numpy data type of the data array. ndim : int Number of dimensions in the data array. shape : tuple The data array's dimension sizes. size : int Number of elements in the data array. fill_value : scalar, optional ''' def __getitem__(self, indices): ''' x.__getitem__(indices) <==> x[indices] Returns a numpy array. ''' array_shape = [] for index in parse_indices(self.shape, indices): if isinstance(index, slice): step = index.step if step == 1: array_shape.append(index.stop - index.start) elif step == -1: stop = index.stop if stop is None: array_shape.append(index.start + 1) else: array_shape.append(index.start - index.stop) else: stop = index.stop if stop is None: stop = -1 a, b = divmod(stop - index.start, step) if b: a += 1 array_shape.append(a) else: array_shape.append(len(index)) #-- End: for if self.fill_value is not None: return numpy_full(array_shape, fill_value=self.fill_value, dtype=self.dtype) else: return numpy_empty(array_shape, dtype=self.dtype) #--- End: def def __repr__(self): ''' x.__repr__() <==> repr(x) ''' return "".format( self.__class__.__name__, self.shape, self.dtype, self.fill_value) #--- End: def def __str__(self): ''' x.__str__() <==> str(x) ''' return repr(self) #--- End: def def reshape(self, newshape): ''' ''' new = self.copy() new.shape = newshape new.ndim = len(newshape) return new #--- End: def def resize(self, newshape): ''' ''' self.shape = newshape self.ndim = len(newshape) #--- End: def #--- End: class class ArrayInterface(object): ''' ''' def __init__(self, array): ''' :Parameters: array : numpy.ndarary ''' self.__array_interface__ = array.__array_interface__ if numpy_ma_isMA(array): self.mask = type(self)(array.mask) else: self.mask = None self.dtype = array.dtype self.shape = array.shape self.size = array.size self.ndim = array.ndim self.flags = {'C_CONTIGUOUS': array.flags['C_CONTIGUOUS']} #--- End: def def __deepcopy__(self, memo): ''' Used if copy.deepcopy is called on the variable. ''' return self.copy() #--- End: def def __getitem__(self, indices): ''' ''' array = self.array indices = parse_indices(array.shape, indices) return get_subspace(array, indices) #--- End: def def __repr__(self): ''' ''' out = '>> g = f.copy() ''' return type(self)(self.array.copy()) #--- End: def def inspect(self): ''' Inspect the object for debugging. .. seealso:: `cf.inspect` :Returns: None ''' print cf_inspect(self) #--- End: def def view(self): return self.array.view() #--- End: def #--- End: class class SharedMemoryArray(ArrayInterface): ''' ''' def __init__(self, array): ''' :Parameters: array : numpy.ndarary ''' # ------------------------------------------------------------ # Copy the array to a numpy array which accesses shared memory # ------------------------------------------------------------ shape = array.shape if numpy_ma_isMA(array): mask = array.mask array = array.data else: mask = None dtype = array.dtype mp_Array = multiprocessing_Array(_typecode[dtype.char], array.size) a = numpy_frombuffer(mp_Array.get_obj(), dtype=dtype) a.resize(shape) a[...] = array if mask is not None: mask = array.mask dtype = mask.dtype mp_Array = multiprocessing_Array(_typecode[dtype.char], mask.size) m = numpy_frombuffer(mp_Array.get_obj(), dtype=dtype) m.resize(shape) m[...] = mask a = numpy_ma_array(a, copy=False) a.mask = m #--- End: if #------------------------------------------------------------- # Store the array interface of the numpy array #------------------------------------------------------------- super(SharedMemoryArray, self).__init__(a) #--- End: def #--- End: class cf-python-1.3.2/cf/data/partition.py0000644000175000017500000011047512761345270017527 0ustar daviddavid00000000000000import atexit from numpy import array as numpy_array from numpy import bool_ as numpy_bool_ from numpy import dtype as numpy_dtype from numpy import expand_dims as numpy_expand_dims from numpy import ndarray as numpy_ndarray from numpy import number as numpy_number from numpy import transpose as numpy_transpose from numpy import vectorize as numpy_vectorize from numpy.ma import expand_dims as numpy_ma_expand_dims from numpy.ma import is_masked as numpy_ma_is_masked from numpy.ma import isMA as numpy_ma_isMA from numpy.ma import masked_all as numpy_ma_masked_all from numpy.ma import nomask as numpy_ma_nomask from copy import deepcopy from sys import getrefcount from os import remove from operator import mul from itertools import izip from itertools import product as itertools_product from ..units import Units from ..functions import get_subspace from ..functions import inspect as cf_inspect from .filearray import FileArray, TempFileArray _Units_conform = Units.conform _dtype_object = numpy_dtype(object) # -------------------------------------------------------------------- # Set of partitions' temporary files # # For example: # >>> _temporary_files # set(['/tmp/cf_array_B8SSw2.npy', # '/tmp/cf_array_iRekAW.npy']) # -------------------------------------------------------------------- _temporary_files = set() def _remove_temporary_files(filename=None): '''Remove temporary partition files from disk. The removed files' names are deleted from the _temporary_files set. It is intended to delete individual files as part of the garbage collection process and to delete all files when python exits. This is quite brutal and may break partitions if used unwisely. It is not recommended to be used as a general tidy-up function. :Parameters: filename : str, optional The name of file to remove. The file name must be in the _temporary_files set. By default all files given in the _temporary_files set are removed. :Returns: None :Examples: >>> _temporary_files set(['/tmp/cf_array_B8SSw2.npy', '/tmp/cf_array_G756ks.npy', '/tmp/cf_array_iRekAW.npy']) >>> _remove_temporary_files('/tmp/cf_array_G756ks.npy') >>> _temporary_files set(['/tmp/cf_array_B8SSw2.npy', '/tmp/cf_array_iRekAW.npy']) >>> _remove_temporary_files() >>> _temporary_files set() ''' if filename is not None: if filename in _temporary_files: # Remove the given temporary file try: remove(filename) except OSError: pass _temporary_files.remove(filename) #--- End: if return #--- End: if # Still here? Then remove all temporary files for filename in _temporary_files: try: remove(filename) except OSError: pass #--- End: for _temporary_files.clear() #--- End: def # -------------------------------------------------------------------- # Instruction to remove all of the temporary files from all partition # arrays at exit. # -------------------------------------------------------------------- atexit.register(_remove_temporary_files) # -------------------------------------------------------------------- # Create a deep copy function for numpy arrays which contain object # types # -------------------------------------------------------------------- _copy = numpy_vectorize(deepcopy, otypes=[object]) # ==================================================================== # # Partition objectg # # ==================================================================== class Partition(object): ''' A partition of a master data array. The partition spans all or part of exactly one sub-array of the master data array ''' def __init__(self, subarray=None, flip=None, location=None, shape=None, Units=None, part=None, axes=None): ''' **Initialization** :Parameters: subarray : numpy array-like, optional The sub-array for the partition. Must be a numpy array or any array storing object with a similar interface. DO NOT UPDATE INPLACE. location : list, optional The location of the partition's data array in the master array. DO NOT UPDATE INPLACE. axes : list, optional The identities of the axes of the partition's sub-array. If the partition's sub-array a scalar array then it is an empty list. DO NOT UPDATE INPLACE. part : list, optional The part of the partition's sub-array which comprises its data array. If the partition's data array is to the whole sub-array then *part* may be an empty list. DO NOT UPDATE INPLACE. shape : list, optional The shape of the partition's data array as a subspace of the master array. If the master array is a scalar array then *shape* is an empty list. By default the shape is inferred from *location*. DO NOT UPDATE INPLACE. Units : Units, optional The units of the partition's sub-array. DO NOT UPDATE INPLACE. :Examples: >>> p = Partition(subarray = numpy.arange(20).reshape(2,5,1), ... location = [(0, 6), (1, 3), (4, 5)], ... axes = ['dim1', 'dim0', 'dim2'], ... part = [], ... Units = cf.Units('K')) >>> p = Partition(subarray = numpy.arange(20).reshape(2,5,1), ... location = [(0, 6), (1, 3), (4, 5)], ... axes = ['dim1', 'dim0', 'dim2'], ... shape = [5, 2, 1], ... part = [slice(None, None, -1), [0,1,3,4], slice(None)], ... Units = cf.Units('K')) >>> p = Partition(subarray = numpy.array(4), ... location = [(4, 5)], ... axes = ['dim1'], ... part = [], ... Units = cf.Units('K')) ''' self.axes = axes # DO NOT UPDATE INPLACE self.flip = flip # DO NOT UPDATE INPLACE self.part = part # DO NOT UPDATE INPLACE self.location = location # DO NOT UPDATE INPLACE self.shape = shape # DO NOT UPDATE INPLACE self.Units = Units # DO NOT UPDATE INPLACE self.subarray = subarray # DO NOT UPDATE INPLACE if shape is None and location is not None: self.shape = [i[1]-i[0] for i in location] self._original = None self._write_to_disk = None #--- End: def def __deepcopy__(self, memo): ''' Used if copy.deepcopy is called on the variable. ''' return self.copy() #--- End: def def __del__(self): ''' Called when the partition's reference count reaches zero. If the partition contains a temporary file which is not referenced by any other partition then the temporary file is removed from disk. If the partition contains a non-temporary file which is not referenced by any other partition then the file is closed. ''' subarray = getattr(self, 'subarray', None) if getrefcount is not None: if subarray is None or getrefcount(subarray) > 2: return else: # getrefcount has itself been deleted or is in the process # of being torn down return _partition_file = getattr(subarray, '_partition_file', None) if _partition_file is not None: # This partition contains a temporary file which is not # referenced by any other partition, so remove the file # from disk. _remove_temporary_files(_partition_file) elif (numpy_ndarray is not None and not isinstance(subarray, numpy_ndarray)): # This partition contains a non-temporary file which is # not referenced by any other partition, so close the # file. subarray.close() #--- End: def # def __getstate__(self): # ''' # #Called when pickling. # #:Parameters: # # None # #:Returns: # # out : dict # A dictionary of the instance's attributes # #:Examples: # #''' # return dict([(attr, getattr(self, attr)) # for attr in self.__slots__ if hasattr(self, attr)]) # #--- End: def # # def __setstate__(self, odict): # ''' # #Called when unpickling. # #:Parameters: # # odict : dict # The output from the instance's `__getstate__` method. # #:Returns: # # None # #''' # for attr, value in odict.iteritems(): # setattr(self, attr, value) # #--- End: def def __str__(self): ''' x.__str__() <==> str(x) ''' return '%s: %s' % (self.__class__.__name__, self.__dict__) #--- End: def # ---------------------------------------------------------------- # Attribute: read only # ---------------------------------------------------------------- @property def indices(self): ''' The indices of the master array which correspond to this partition's data array. :Returns: out : tuple A tuple of slice objects or, if the master data array is a scalar array, an empty tuple. :Examples: >>> p.location [(0, 5), (2, 9)] >>> p.indices (slice(0, 5), slice(2, 9)) >>> p.location [()] >>> p.indices () ''' return tuple([slice(*r) for r in self.location]) #--- End: def # ---------------------------------------------------------------- # Attribute: read only # ---------------------------------------------------------------- @property def in_memory(self): ''' True if and only if the partition's sub-array is in memory as opposed to on disk. :Examples: >>> p.in_memory False ''' return isinstance(self.subarray, numpy_ndarray) #--- End: if # ---------------------------------------------------------------- # Attribute: read only # ---------------------------------------------------------------- @property def in_temporary_file(self): '''True if and only if the partition's sub-array is on disk in a temporary file. .. seealso:: `array`, `in_memory`, `in_shared_memory`, `on_disk`, `to_disk` :Examples: >>> p.in_temporary_file False ''' return isinstance(self.subarray, TempFileArray) #--- End: def # ---------------------------------------------------------------- # Attribute: read only # ---------------------------------------------------------------- @property def on_disk(self): ''' True if and only if the partition's sub-array is on disk as opposed to in memory. :Examples: >>> p.on_disk True >>> p.to_disk() >>> p.on_disk False ''' return not hasattr(self.subarray, '__array_interface__') # return not isinstance(self.subarray, numpy_ndarray) # return not self.in_memory #--- End: if # ---------------------------------------------------------------- # Attribute: read only # ---------------------------------------------------------------- @property def in_file(self): ''' True if and only if the partition's sub-array is on disk as opposed to in memory. :Examples: >>> p.on_disk True >>> p.to_disk() >>> p.on_disk False ''' return self.on_disk and not self.in_temporary_file #--- End: if # ---------------------------------------------------------------- # Attribute: read only # ---------------------------------------------------------------- @property def isscalar(self): ''' True if and only if the partition's data array is a scalar array. :Examples: >>> p.axes [] >>> p.isscalar True >>> p.axes ['dim2'] >>> p.isscalar False ''' return not self.axes #--- End: def # ---------------------------------------------------------------- # Attribute: read only # ---------------------------------------------------------------- @property def size(self): ''' Number of elements in the partition's data array. :Examples: >>> p.shape (73, 48) >>> p.size 3504 ''' shape = self.shape if not shape: return 0 return long(reduce(mul, shape, 1)) #--- End: def # ---------------------------------------------------------------- # Attribute: read only # ---------------------------------------------------------------- @property def subarray_in_external_file(self): ''' True if and only if the partition's sub-array is in an external file. :Examples: >>> p.subarray_in_external_file False ''' return not (self.in_memory or isinstance(self.subarray, FileArray)) #--- End: def def change_axis_names(self, axis_map): ''' Change the axis names. The axis names are arbitrary, so mapping them to another arbitrary collection does not change the data array values, units, nor axis order. :Parameters: axis_map : dict :Returns: None :Examples: >>> p.axes ['dim0', 'dim1'] >>> p._change_axis_names({'dim0': 'dim2', 'dim1': 'dim0'}) >>> p.axes ['dim2', 'dim0'] >>> p.axes ['dim0', 'dim1'] >>> p._change_axis_names({'dim0': 'dim1'}) >>> p.axes ['dim1', 'dim2'] ''' axes = self.axes # Partition axes self.axes = [axis_map[axis] for axis in axes] # Flipped axes flip = self.flip if flip: self.flip = [axis_map[axis] for axis in flip] #--- End: if #--- End: def def close(self, keep_in_memory=True): ''' Close the partition after it has been conformed. The partition should usually be closed after its `dataarray` method has been called to prevent memory leaks. Closing the partition does one of the following, depending on the values of the partition's `!_original` attribute and on the *keep_in_memory* argument: * Nothing. * Stores the partition's data array in a temporary file. * Reverts the entire partition to a previous state. :Parameters: keep_in_memory : bool, optional If False and the partition is not to be reverted to a previous state then force its data array to be stored in a temporary file. :Returns: None :Examples: >>> p.dataarray(...) >>> p.close() ''' if self._original: # The whole partition is to replaced with its # pre-conformed state self.is_partition(self._original) elif not keep_in_memory or self._write_to_disk: # The partition's data array is to be saved to a temporary # file self.to_disk() self._write_to_disk = None if hasattr(self, 'masked'): del self.masked #--- End: def def copy(self): ''' Return a deep copy. ``p.copy()`` is equivalent to ``copy.deepcopy(p)``. :Returns: out : A deep copy. :Examples: >>> q = p.copy() ''' new = Partition.__new__(Partition) new.__dict__ = self.__dict__.copy() return new #--- End: def def dataarray(self, axes=None, flip=None, units=None, revert_to_file=False, hardmask=True, dtype=None, readonly=False, copy_regardless=False, func=None, update=True, keep_in_memory=True): ''' Returns the partition's data array. After a partition has been conformed, the partition must be closed (with the `close` method) before another partition is conformed, otherwise a memory leak could occur. For example: >>> for partition in partition_array.flat: ... ... # Conform the partition ... partition.dataarray(**pda_args) ... ... # [ Some code to operate on the conformed partition ] ... ... # Close the partition ... partition.close() ... ... # Now move on to conform the next partition ... >>> :Parameters: axes : list flip : list units : Units keep_in_memory : bool, optional If True then the sub-array will be kept in memory as a numpy array when the `close` method is called. If False then sub-array will be replaced by a file pointer when the `close` method is called. This will either be a pointer to an existing file (see *revert_to_file*) or a new file will be created. revert_to_file : bool, optional If True and the sub-array was on disk and *keep_in_memory* is False then the file pointer will be reinstated when partition the is closed with th `close` method. dtype : numpy.dtype, optional Convert the partition's data array to this data type. By default no conversion occurs. hardmask : bool, optional If False then force the partition's data array's mask to be soft. By default the mask is forced to be hard. :Returns: out : numpy array The partition's data array as a numpy array. :Raises: ValueError : A ValueError is raised if the data type conversion specified with the *dtype* parameter is not possible (as would be the case when attempting to convert a string to a float, for example). ''' unique = getrefcount(self.subarray) <= 2 p_axes = self.axes p_flip = self.flip p_part = self.part p_units = self.Units p_shape = self.shape subarray = self.subarray len_p_axes = len(p_axes) if self.on_disk: # -------------------------------------------------------- # The sub-array is in a file on disk # -------------------------------------------------------- if keep_in_memory: # Upon closure, keep the data array in memory _partition_file = getattr(subarray, '_partition_file', None) elif revert_to_file: # Upon closure, revert the partition back to its # original state. self._original = self.copy() _partition_file = None else: # Upon closure, write the data array to a new file # on disk. self._write_to_disk = True _partition_file = None if not p_part: indices = Ellipsis else: indices = tuple(p_part) #--- End: if # Read from a file into a numpy array p_data = subarray[indices] if _partition_file and unique: # This partition contains a temporary file which is # not referenced by any other partition, so we can # remove the file from disk. _remove_temporary_files(_partition_file) #--- End: if update = True unique = True copy = False else: # -------------------------------------------------------- # The sub-array is a numpy array in memory # -------------------------------------------------------- if not keep_in_memory: # Upon closure, write the data array to a new file on # disk. self._write_to_disk = True if copy_regardless: copy = True else: copy = not unique p_data = subarray if p_part: p_data = get_subspace(p_data, p_part) elif not unique: p_data = subarray.view() #--- End: if if not p_data.ndim and isinstance(p_data, (numpy_number, numpy_bool_)): # p_data is a numby number (like numpy.int64) which does # not support assignment, so convert to a numpy array. p_data = numpy_array(p_data) masked = numpy_ma_isMA(p_data) if masked: # -------------------------------------------------------- # The array is a masked array # -------------------------------------------------------- if p_data.mask is numpy_ma_nomask or not numpy_ma_is_masked(p_data): # There are no missing data points so recast as a # normal numpy array p_data = p_data.data masked = False else: # Set the hardness of the mask if hardmask: p_data.harden_mask() else: p_data.soften_mask() #--- End: if self.masked = masked # ------------------------------------------------------------ # Make sure that the data array has the correct units. This # process will deep copy the data array if required (e.g. if # another partition is referencing this numpy array), even if # the units are already correct. # ------------------------------------------------------------ if func is None: if not p_units.equals(units) and bool(p_units) is bool(units): func = _Units_conform if (not unique or not update or not p_data.flags['C_CONTIGUOUS'] or p_data.dtype.kind == 'i'): inplace = False else: inplace = True else: inplace = update and unique #--- End: if if func is not None: p_data = func(p_data, p_units, units, inplace) p_units = units copy = False #--- End: if if p_data.size > 1: if flip or p_flip: # ---------------------------------------------------- # Flip axes # ---------------------------------------------------- flip_axes = set(p_flip).symmetric_difference(flip) if flip_axes: indices = [(slice(None, None, -1) if axis in flip_axes else slice(None)) for axis in p_axes] p_data = p_data[tuple(indices)] #--- End: if if p_axes != axes: # ---------------------------------------------------- # Reorder axes # ---------------------------------------------------- iaxes = [p_axes.index(axis) for axis in axes if axis in p_axes] if len_p_axes > len(iaxes): for i in xrange(len_p_axes): if i not in iaxes: iaxes.append(i) #--- End: if p_data = numpy_transpose(p_data, iaxes) #--- End: if # ------------------------------------------------------------ # Remove excessive/insert missing size 1 axes # ------------------------------------------------------------ if len_p_axes != len(p_shape): p_data = p_data.reshape(p_shape) # ------------------------------------------------------------ # Convert the array's data type # ------------------------------------------------------------ if dtype is not None and dtype != p_data.dtype: try: p_data = p_data.astype(dtype) # Copy ought to work! except ValueError: raise ValueError("Can't recast data array from %s to %s" % (p_data.dtype.name, dtype.name)) else: copy = False #--- End: if # ------------------------------------------------------------ # Copy the array # ------------------------------------------------------------ if copy: if p_data.dtype.char != 'O': if not masked or p_data.ndim > 0: p_data = p_data.copy() else: # This is because numpy.ma.copy doesn't work for # scalar arrays (<=1.8) p_data = numpy_ma_masked_all((), p_data.dtype) else: # whilst netCDF4.netcdftime.datetime is mucking bout, don't copy!!!! #p_data = _copy(p_data) pass #--- End: if # ------------------------------------------------------------ # Update the partition # ------------------------------------------------------------ if update: self.subarray = p_data self.Units = p_units self.part = [] self.axes = axes self.flip = flip #--- End: if # ------------------------------------------------------------ # Return the numpy array # ------------------------------------------------------------ return p_data #--- End: def @property def isdt(self): ''' True if the subarray contains date-time objects. :Examples: >>> p.Units.isreftime True >>> p.subarray.dtype == numpy.dtype(object) True >>> p.isdt True ''' # return False if self.Units.isreftime and self.subarray.dtype == _dtype_object: return True else: return False #--- End: def def file_close(self): ''' Close all file containing the sub-array, if there is one. :Returns: None :Examples: >>> p.file_close() ''' if self.on_disk: self.subarray.close() #--- End: def # def flat(self): # ''' # #Return an iterator that yields the partition itself. # #This is provided as a convienience to make it easier to iterate #through a partition matrix. # #:Returns: # # out : generator # An iterator that yields the partition itself. # #:Examples: # #>>> type(p.flat()) # #>>> for q in p.flat(): #... print q is p #True # #''' # yield self # #--- End: def # # def ndindex(self): # ''' # #Return an iterator over the N-dimensional indices of the partition's #data array. # #At each iteration a tuple of indices is returned, the last dimension #is iterated over first. # #:Returns: # # out : generator # An iterator over indices of the partition's data array. # #:Examples: # #>>> p.shape #[2, 1, 3] #>>> for index in p.ndindex(): #... print index #... #(0, 0, 0) #(0, 0, 1) #(0, 0, 2) #(1, 0, 0) #(1, 0, 1) #(1, 0, 2) # #>>> p.shape #[] #>>> for index in p.ndindex(): #... print index #... #() # #''' # return itertools_product(*[xrange(0, r) for r in self.shape]) # #--- End: def def inspect(self): ''' Inspect the object for debugging. .. seealso:: `cf.inspect` :Returns: None :Examples: >>> f.inspect() ''' print cf_inspect(self) #--- End: def def master_ndindex(self): #itermaster_indices(self): ''' Return an iterator over indices of the master array which are spanned by the data array. :Returns: out : generator An iterator over indices of the master array which are spanned by the data array. :Examples: >>> p.location [(3, 5), (0, 1), (0, 3)] >>> for index in p.master_ndindex(): ... print index ... (3, 0, 0) (3, 0, 1) (3, 0, 2) (4, 0, 0) (4, 0, 1) (4, 0, 2) ''' return itertools_product(*[xrange(*r) for r in self.location]) #--- End: def def new_part(self, indices, master_axis_to_position, master_flip): ''' Update the `!part` attribute in-place for new indices of the master array. :Parameters: indices : list master_axis_to_position : dict master_flip : list :Returns: None :Examples: >>> p.new_part(indices, dim2position, master_flip) ''' shape = self.shape if indices == [slice(0, stop, 1) for stop in shape]: return # ------------------------------------------------------------ # If a dimension runs in the wrong direction then change its # index to account for this. # # For example, if a dimension with the wrong direction has # size 10 and its index is slice(3,8,2) then after the # direction is set correctly, the index needs to changed to # slice(6,0,-2): # # >>> a = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] # >>> a[slice(3, 8, 2)] # [6, 4, 2] # >>> a.reverse() # >>> print a # >>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # >>> a[slice(6, 0, -2)] # [6, 4, 2] # ------------------------------------------------------------ if self.subarray.size > 1: indices = indices[:] p_flip = self.flip for axis, i in master_axis_to_position.iteritems(): if ((axis not in p_flip and axis not in master_flip) or (axis in p_flip and axis in master_flip)): # This axis runs in the correct direction continue # Still here? Then this axis runs in the wrong # direction. # Reset the direction p_flip = p_flip[:] if axis in self.flip: p_flip.remove(axis) else: p_flip.append(axis) # Modify the index to account for the changed # direction size = shape[i] if isinstance(indices[i], slice): start, stop, step = indices[i].indices(size) # Note that step is assumed to be always +ve here div, mod = divmod(stop-start-1, step) start = size - 1 - start stop = start - div*step - 1 if stop < 0: stop = None indices[i] = slice(start, stop, -step) else: size -= 1 indices[i] = [size-j for j in indices[i]] #--- End: for self.flip = p_flip #--- End: if slice_None = slice(None) # Reorder the new indices indices = [(indices[master_axis_to_position[axis]] if axis in master_axis_to_position else slice_None) for axis in self.axes] part = self.part if not part: self.part = indices return # Still here? update an existing part p_part = [] for part_index, index, size in izip(part, indices, self.subarray.shape): if index == slice_None: p_part.append(part_index) continue if isinstance(part_index, slice): if isinstance(index, slice): start , stop , step = part_index.indices(size) size1, mod = divmod(stop-start-1, step) start1, stop1, step1 = index.indices(size1+1) size2, mod = divmod(stop1-start1, step1) if mod != 0: size2 += 1 start += start1 * step step *= step1 stop = start + (size2-1)*step if step > 0: stop += 1 else: stop -= 1 if stop < 0: stop = None p_part.append(slice(start, stop, step)) continue else: new_part = range(*part_index.indices(size)) new_part = [new_part[i] for i in index] else: if isinstance(index, slice): new_part = part_index[index] else: new_part = [part_index[i] for i in index] #--- End: if # Still here? Then the new element of p_part is a list of # integers, so let's see if we can convert it to a slice # before appending it. new_part0 = new_part[0] if len(new_part) == 1: # Convert a single element list to a slice object new_part = slice(new_part0, new_part0+1, 1) else: step = new_part[1] - new_part0 if step: if step > 0: start, stop = new_part0, new_part[-1]+1 else: start, stop = new_part0, new_part[-1]-1 if new_part == range(start, stop, step): if stop < 0: stop = None new_part = slice(start, stop, step) #--- End: if p_part.append(new_part) #--- End: for self.part = p_part #--- End: def def overlaps(self, indices): ''' Return True if the sub-array overlaps a subspace of the master array. :Parameters: indices : sequence Indices describing a subset of the master array. Each index is either a slice object or a list. If the sequence is empty then it is assumed that the master array is a scalar array. :Returns: p_indices, shape : list, list or None, None If the partition overlaps the *indices* then return a list of indices which will subset the partition's data to where it overlaps the master indices and the subsetted partition's shape as a list. Otherwise return `None, None`. :Examples: >>> indices = (slice(None), slice(5, 1, -2), [1, 3, 4, 8]) >>> p.overlaps(indices) (slice(), ddfsfsd), [3, 5, 4] ''' p_indices = [] shape = [] if not indices: return p_indices, shape for index, (r0, r1), size in izip(indices, self.location, self.shape): if isinstance(index, slice): stop = size if index.stop < r1: stop -= (r1 - index.stop) start = index.start - r0 if start < 0: start %= index.step # start is now +ve if start >= stop: # This partition does not span the slice return None, None # Still here? step = index.step index = slice(start, stop, step) index_size, rem = divmod(stop-start, step) if rem: index_size += 1 else: # Still here? index = [i - r0 for i in index if r0 <= i < r1] index_size = len(index) if index_size == 0: return None, None elif index_size == 1: index = slice(index[0], index[0]+1) else: index0 = index[0] step = index[1] - index0 if step > 0: start, stop = index0, index[-1]+1 elif step < 0: start, stop = index0, index[-1]-1 if index == range(start, stop, step): # Replace the list with a slice object if stop < 0: stop = None index = slice(start, stop, step) #--- End: if #--- End: if p_indices.append(index) shape.append(index_size) #--- End: for # Still here? Then this partition does span the slice and the # elements of this partition specified by p_indices are in the # slice. return p_indices, shape #--- End: def def to_disk(self): ''' Store the partition's sub-array in a temporary file on disk in place. Assumes that the partition's sub-array is currently in memory, but this is not checked. :Returns: None :Examples: >>> p.to_disk() ''' self.subarray = TempFileArray(self.subarray) _temporary_files.add(self.subarray._partition_file) #--- End: if def is_partition(self, other): ''' Completely update the partition with another partition's attributes in place. The updated partitionasdasdasdasdasds is always dependent of the other partition. :Parameters: other : Partition :Returns: None :Examples: >>> p.is_partition(q) ''' self.__dict__ = other.__dict__ #--- End: def def update_inplace_from(self, other): ''' Completely update the partition with another partition's attributes in place. :Parameters: other : Partition :Returns: None :Examples: >>> p.update_inplace_from(q) ''' self.__dict__ = other.__dict__.copy() #--- End: def #--- End: class cf-python-1.3.2/cf/data/data.py0000644000175000017500000104706412764213712016431 0ustar daviddavid00000000000000from numpy import argsort as numpy_argsort from numpy import array as numpy_array from numpy import ceil as numpy_ceil from numpy import cos as numpy_cos from numpy import count_nonzero as numpy_count_nonzero from numpy import dtype as numpy_dtype from numpy import e as numpy_e from numpy import empty as numpy_empty from numpy import exp as numpy_exp from numpy import floor as numpy_floor from numpy import ndarray as numpy_ndarray from numpy import ndim as numpy_ndim from numpy import log as numpy_log from numpy import log10 as numpy_log10 from numpy import log2 as numpy_log2 from numpy import ones as numpy_ones from numpy import reshape as numpy_reshape from numpy import result_type as numpy_result_type from numpy import rint as numpy_rint from numpy import round as numpy_round from numpy import seterr as numpy_seterr from numpy import shape as numpy_shape from numpy import sin as numpy_sin from numpy import size as numpy_size from numpy import tan as numpy_tan from numpy import tile as numpy_tile from numpy import trunc as numpy_trunc from numpy import unique as numpy_unique from numpy import unravel_index as numpy_unravel_index from numpy import where as numpy_where from numpy import vectorize as numpy_vectorize from numpy import zeros as numpy_zeros from numpy.ma import array as numpy_ma_array from numpy.ma import count as numpy_ma_count from numpy.ma import empty as numpy_ma_empty from numpy.ma import is_masked as numpy_ma_is_masked from numpy.ma import isMA as numpy_ma_isMA from numpy.ma import masked as numpy_ma_masked from numpy.ma import masked_all as numpy_ma_masked_all from numpy.ma import masked_invalid as numpy_ma_masked_invalid from numpy.ma import masked_where as numpy_ma_masked_where from numpy.ma import MaskedArray as numpy_ma_MaskedArray from numpy.ma import nomask as numpy_ma_nomask from numpy.ma import ones as numpy_ma_ones from numpy.ma import where as numpy_ma_where from numpy.ma import zeros as numpy_ma_zeros import operator from functools import partial from operator import mul as operator_mul from math import ceil as math_ceil from sys import byteorder, getrefcount from itertools import izip from itertools import product as itertools_product from ..netcdf.filearray import NetCDFFileArray from ..um.filearray import UMFileArray from ..cfdatetime import st2dt, dt2rt, rt2dt, st2rt from ..units import Units from ..constants import masked as cf_masked from ..functions import (CHUNKSIZE, FM_THRESHOLD, RTOL, ATOL, FREE_MEMORY, SET_FREE_MEMORY, parse_indices, _numpy_allclose, abspath, pathjoin, hash_array, get_subspace, set_subspace, broadcast_array) from ..functions import inspect as cf_inspect from ..functions import _section from .filearray import FileArray, CreateArray from .partition import Partition from .partitionmatrix import PartitionMatrix from .collapse_functions import * # -------------------------------------------------------------------- # _seterr = How floating-point errors in the results of arithmetic # operations are handled. These defaults are those of # numpy 1.10.1. # -------------------------------------------------------------------- _seterr = {'divide' : 'warn', 'invalid': 'warn', 'over' : 'warn', 'under' : 'ignore', } # -------------------------------------------------------------------- # _seterr_raise_to_ignore = As _seterr but with any values of 'raise' # changed to 'ignore'. # -------------------------------------------------------------------- _seterr_raise_to_ignore = _seterr.copy() for key, value in _seterr.iteritems(): if value == 'raise': _seterr_raise_to_ignore[key] = 'ignore' # -------------------------------------------------------------------- # _mask_fpe[0] = Whether or not to automatically set # FloatingPointError exceptions to masked values in # arimthmetic. # -------------------------------------------------------------------- _mask_fpe = [False] _xxx = numpy_empty((), dtype=object) _empty_set = set() _units_None = Units() _units_1 = Units('1') _units_radians = Units('radians') _dtype_object = numpy_dtype(object) _dtype_float = numpy_dtype(float) _cached_axes = {0: []} def _initialise_axes(ndim): ''' :Parameters: ndim : int :Returns: out: list :Examples: >>> _initialise_axes(0) [] >>> _initialise_axes(1) ['dim1'] >>> _initialise_axes(3) ['dim1', 'dim2', 'dim3'] >>> _initialise_axes(3) is _initialise_axes(3) True ''' axes = _cached_axes.get(ndim, None) if axes is None: axes = ['dim%d' % i for i in xrange(ndim)] _cached_axes[ndim] = axes #--- End: if return axes #--- End: def # ==================================================================== # # Data object # # ==================================================================== class Data(object): ''' An N-dimensional data array with units and masked values. * Contains an N-dimensional, indexable and broadcastable array with many similarities to a `numpy` array. * Contains the units of the array elements. * Supports masked arrays, regardless of whether or not it was initialised with a masked array. * Stores and operates on data arrays which are larger then the available memory. **Indexing** A data array is indexable in a similar way to numpy array: >>> d.shape (12, 19, 73, 96) >>> d[...].shape (12, 19, 73, 96) >>> d[slice(0, 9), 10:0:-2, :, :].shape (9, 5, 73, 96) There are three extensions to the numpy indexing functionality: * Size 1 dimensions are never removed bi indexing. An integer index i takes the i-th element but does not reduce the rank of the output array by one: >>> d.shape (12, 19, 73, 96) >>> d[0, ...].shape (1, 19, 73, 96) >>> d[:, 3, slice(10, 0, -2), 95].shape (12, 1, 5, 1) Size 1 dimensions may be removed with the `squeeze` method. * The indices for each axis work independently. When more than one dimension's slice is a 1-d boolean sequence or 1-d sequence of integers, then these indices work independently along each dimension (similar to the way vector subscripts work in Fortran), rather than by their elements: >>> d.shape (12, 19, 73, 96) >>> d[0, :, [0, 1], [0, 13, 27]].shape (1, 19, 2, 3) * Boolean indices may be any object which exposes the numpy array interface. >>> d.shape (12, 19, 73, 96) >>> d[..., d[0, 0, 0]>d[0, 0, 0].min()] **Cyclic axes** **Miscellaneous** A `Data` object is picklable. A `Data` object is hashable, but note that, since it is mutable, its hash value is only valid whilst the data array is not changed in place. ''' def __init__(self, data=None, units=None, fill_value=None, hardmask=True, chunk=True, loadd=None, dt=False): ''' **Initialization** :Parameters: data : array-like, optional The data for the array. units : str or Units, optional The units of the data. By default the array elements are dimensionless. fill_value : optional The fill value of the data. By default, or if None, the numpy fill value appropriate to the array's data type will be used. hardmask : bool, optional If False then the mask is soft. By default the mask is hard. chunk : bool, optional If False then the data array will be stored in a single partition. By default the data array will be partitioned if it is larger than the chunk size, as returned by the `cf.CHUNKSIZE` function. dt : bool, optional If True then strings (such as ``'1990-12-1 12:00'``) given by the *data* argument are interpreted as date-times. By default they are not interpreted as date-times. loadd : dict, optional Initialise the data array from a dictionary serialization of a `cf.Data` object. All other arguments are ignored. :Examples: >>> d = cf.Data(5) >>> d = cf.Data([1,2,3], units='K') >>> import numpy >>> d = cf.Data(numpy.arange(10).reshape(2,5), units=cf.Units('m/s'), fill_value=-999) >>> d = cf.Data(tuple('fly')) ''' empty_list = [] # The _flip attribute is an unordered subset of the data # array's axis names. It is a subset of the axes given by the # _axes attribute. It is used to determine whether or not to # reverse an axis in each partition's sub-array during the # creation of the partition's data array. DO NOT CHANGE IN # PLACE. self._flip = empty_list # The _all_axes attribute must be None or a tuple self._all_axes = None self._hardmask = hardmask # self._isdt = False # The _HDF_chunks attribute is.... Is either None or a # dictionary. DO NOT CHANGE IN PLACE. self._HDF_chunks = None if loadd is not None: self.loadd(loadd) return # The _cyclic attribute contains the axes of the data array # which are cyclic (and therefore allow cyclic slicing). It is # a subset of the axes given by the _axes attribute. DO NOT # CHANGE IN PLACE. self._cyclic = _empty_set units = Units(units) self._Units = units self._fill_value = fill_value if data is None: self._dtype = None return if not isinstance(data, FileArray): check_free_memory = True if isinstance(data, self.__class__): self.loadd(data.dumpd()) return if not isinstance(data, numpy_ndarray): data = numpy_array(data) if (data.dtype.kind == 'O' and not dt and hasattr(data.item((0,)*data.ndim), 'timetuple')): # We've been given one or more date-time objects dt = True else: check_free_memory = False #--- End: if dtype = data.dtype if dt or units.isreftime: kind = dtype.kind if kind == 'S': # Convert date-time strings to reference time floats if not units: units = Units('days since 1970-1-1', units._calendar) self._Units = units data = st2rt(data, units, units) dtype = data.dtype elif kind == 'O': # Convert date-time objects to reference time floats if not units: units = Units('days since 1970-1-1', units._calendar) self._Units = units data = dt2rt(data, None, units) dtype = data.dtype if not units.isreftime: raise ValueError( "Can't initialise a reference time array with units %r" % units) # self._isdt = dtype.kind in 'SO' # # if self._isdt: # if not units: # units = Units('days since 1970-1-1', units._calendar) # self._Units = units # elif not units: # raise ValueError( # "Can't initialise a numeric reference-time array with %r" % # units) # # if not units.isreftime: # raise ValueError( # "Can't initialise a date-time array with %r" % units) # # if dtype.kind == 'S': # # Convert date-time strings to date-time objects # data = st2dt(data, units) # dtype = data.dtype # ## dtype = _dtype_float #--- End: if shape = data.shape ndim = data.ndim axes = _initialise_axes(ndim) matrix = _xxx.copy() matrix[()] = Partition(location = [(0, n) for n in shape], shape = list(shape), axes = axes, flip = empty_list, Units = units, subarray = data, part = empty_list) self.partitions = PartitionMatrix(matrix, empty_list) self._dtype = dtype self._ndim = ndim self._shape = shape self._size = data.size # The _axes attribute is the ordered list of the data array's # axis names. Each axis name is an arbitrary, unique # string. DO NOT CHANGE IN PLACE. self._axes = axes if chunk: self.chunk() if check_free_memory and FREE_MEMORY() < FM_THRESHOLD(): self.to_disk() #--- End: def def __array__(self, *dtype): ''' Returns a numpy array copy the data array. If the data array is stored as date-time objects then a numpy array of numeric reference times will be returned. :Returns: out: numpy.ndarray The numpy array copy the data array. :Examples: >>> (d.array == numpy.array(d)).all() True ''' if not dtype: return self.array else: return self.array.astype(dtype[0]) #, copy=False) OUght to work! #--- End: def def __contains__(self, value): ''' Membership test operator ``in`` x.__contains__(y) <==> y in x Returns True if the value is contained anywhere in the data array. The value may be a `cf.Data` object. :Examples: >>> d = cf.Data([[0.0, 1, 2], [3, 4, 5]], 'm') >>> 4 in d True >>> cf.Data(3) in d True >>> cf.Data([2.5], units='2 m') in d True >>> [[2]] in d True >>> numpy.array([[[2]]]) in d True >>> cf.Data(2, 'seconds') in d False ''' if isinstance(value, self.__class__): self_units = self.Units value_units = value.Units if value_units.equivalent(self_units): if not value_units.equals(self_units): value = value.copy() value.Units = self_units elif value_units: return False value = value.unsafe_array #--- End: if pda_args = self.pda_args(revert_to_file=True) #, readonly=True) for partition in self.partitions.matrix.flat: array = partition.dataarray(**pda_args) partition.close() if value in array: return True #--- End: for return False #--- End: def @property def subspace(self): ''' Return a new object which will get or set a subspace of the array. ``e=d.subspace[indices]`` is equivalent to ``e=d[indices]``. ``d.subspace[indices]=x`` is equivalent to ``d[indices]=x``. ''' return SubspaceData(self) #--- End: def def __data__(self): ''' Returns a new reference to self. ''' return self #--- End: def def __deepcopy__(self, memo): ''' Used if copy.deepcopy is called. ''' return self.copy() #--- End: def # def __getstate__(self): # ''' # #Called when pickling. # #:Parameters: # # None # #:Returns: # # out: dict # A dictionary of the instance's attributes # #:Examples: # #''' # return dict([(attr, getattr(self, attr)) # for attr in self.__slots__ if hasattr(self, attr)]) # #--- End: def # def __setstate__(self, odict): # ''' # #Called when unpickling. # #:Parameters: # # odict : dict # The output from the instance's `__getstate__` method. # #:Returns: # # None # #''' # for attr, value in odict.iteritems(): # setattr(self, attr, value) # #--- End: def def __hash__(self): ''' The built-in function `hash` Generating the hash temporarily realizes the entire array in memory, which may not be possible for large arrays. The hash value is dependent on the data type and shape of the data array. If the array is a masked array then the hash value is independent of the fill value and of data array values underlying any masked elements. The hash value may be different if regenerated after the data array has been changed in place. The hash value is not guaranteed to be portable across versions of Python, numpy and cf. :Returns: out: int The hash value. :Examples: >>> print d.array [[0 1 2 3]] >>> d.hash() -8125230271916303273 >>> d[1, 0] = numpy.ma.masked >>> print d.array [[0 -- 2 3]] >>> hash(d) 791917586613573563 >>> d.hardmask = False >>> d[0, 1] = 999 >>> d[0, 1] = numpy.ma.masked >>> d.hash() 791917586613573563 >>> d.squeeze() >>> print d.array [0 -- 2 3] >>> hash(d) -7007538450787927902 >>> d.dtype = float >>> print d.array [0.0 -- 2.0 3.0] >>> hash(d) -4816859207969696442 ''' return hash_array(self.unsafe_array) #--- End: def def __float__(self): if self.size != 1: raise TypeError( "only length-1 arrays can be converted to Python scalars") return float(self.datum()) #--- End: def def __round__(self, *n): if self.size != 1: raise TypeError( "only length-1 arrays can be converted to Python scalars") return round(self.datum(), *n) #--- End: def def __int__(self): if self.size != 1: raise TypeError( "only length-1 arrays can be converted to Python scalars") return int(self.datum()) #--- End: def def __iter__(self): ''' Efficient iteration. x.__iter__() <==> iter(x) :Examples: >>> d = cf.Data([1, 2, 3], 'metres') >>> for e in d: ... print repr(e) ... 1 2 3 >>> d = cf.Data([[1, 2], [4, 5]], 'metres') >>> for e in d: ... print repr(e) ... >>> d = cf.Data(34, 'metres') >>> for e in d: ... print repr(e) .. TypeError: iteration over a 0-d Data ''' ndim = self._ndim if not ndim: raise TypeError("Iteration over 0-d %s" % self.__class__.__name__) elif ndim == 1: if self.fits_in_memory(self.dtype.itemsize): i = iter(self.unsafe_array) while 1: yield i.next() else: for n in xrange(self._size): yield self[n].unsafe_array[0] else: # ndim > 1 for n in xrange(self._shape[0]): yield self[n, ...].squeeze(0, i=True) #--- End: def def __len__(self): ''' The built-in function `len` x.__len__() <==> len(x) :Examples: >>> len(cf.Data([1, 2, 3])) 3 >>> len(cf.Data([[1, 2, 3]])) 1 >>> len(cf.Data([[1, 2, 3], [4, 5, 6]]) 2 >>> len(cf.Data(1)) TypeError: len() of scalar Data ''' shape = self._shape if shape: return shape[0] raise TypeError("len() of scalar %s" % self.__class__.__name__) #--- End: def def __nonzero__(self): ''' Truth value testing and the built-in operation `bool` x.__nonzero__() <==> x != 0 :Examples: >>> bool(cf.Data(1)) True >>> bool(cf.Data([[False]])) False >>> bool(cf.Data([1, 2])) ValueError: The truth value of Data with more than one element is ambiguous. Use d.any() or d.all() ''' if self._size == 1: return bool(self.unsafe_array) raise ValueError( "The truth value of Data with more than one element is ambiguous. Use d.any() or d.all()") #--- End: def def __repr__(self): ''' The built-in function `repr` x.__repr__() <==> repr(x) ''' return '' % (self.__class__.__name__, str(self)) #--- End: def def __str__(self): ''' The built-in function `str` x.__str__() <==> str(x) ''' self_units = self.Units isreftime = self_units.isreftime if not self_units or self_units.equals(_units_1): units = None elif not isreftime: units = self_units.units else: units = getattr(self_units, 'calendar', '') size = self._size ndim = self._ndim open_brackets = '[' * ndim close_brackets = ']' * ndim first = self.datum(0) if size == 1: if isreftime: # and not self._isdt: # Convert reference time to date-time first = rt2dt(first, self_units).item() out = '%s%s%s' % (open_brackets, first, close_brackets) else: last = self.datum(-1) if isreftime: # and not self._isdt: # Convert reference times to date-times first, last = rt2dt((first, last), self_units) if size >= 3: out = '%s%s, ..., %s%s' % (open_brackets, first, last, close_brackets) else: out = '%s%s, %s%s' % (open_brackets, first, last, close_brackets) #--- End: if if units: out += ' %s' % units return out #--- End: def def __getitem__(self, indices): ''' Implement indexing x.__getitem__(indices) <==> x[indices] ''' size = self._size if size == 1 or indices is Ellipsis: return self.copy() d = self axes = d._axes flip = d._flip shape = d._shape cyclic_axes = d._cyclic indices, roll, flip_axes = _parse_indices(d, indices) if roll: for axis, shift in roll.iteritems(): if axes[axis] not in cyclic_axes: raise IndexError( "Can't take a cyclic slice of a non-cyclic axis (axis %d)" % axis) d = d.roll(axis, shift) #--- End: if new_shape = tuple(map(_size_of_index, indices, shape)) new_size = long(reduce(operator_mul, new_shape, 1)) new = Data.__new__(Data) new._shape = new_shape new._size = new_size new._ndim = d._ndim new._fill_value = d._fill_value new._hardmask = d._hardmask # new._isdt = d._isdt new._all_axes = d._all_axes new._cyclic = cyclic_axes new._axes = axes new._flip = flip new._dtype = d.dtype new._HDF_chunks = d._HDF_chunks new.Units = d.Units partitions = d.partitions new_partitions = PartitionMatrix(_overlapping_partitions(partitions, indices, axes, flip), partitions.axes) if new_size != size: new_partitions.set_location_map(axes) new.partitions = new_partitions # Flip axes if flip_axes: new.flip(flip_axes, i=True) # Remove size 1 axes from the partition matrix new_partitions.squeeze(i=True) if cyclic_axes: # Mark cyclic axes which have reduced size as non-cyclic x = [axis for axis, n0, n1 in izip(axes, shape, new_shape) if axis in cyclic_axes and n1 != n0] if x: new._cyclic = cyclic_axes.difference(x) #--- End: if return new #--- End: def def __setitem__(self, indices, value): ''' Implement indexed assignment x.__setitem__(indices, y) <==> x[indices]=y Assignment to data array elements defined by indices. Elements of a data array may be changed by assigning values to a subspace. See `__getitem__` for details on how to define subspace of the data array. **Missing data** The treatment of missing data elements during assignment to a subspace depends on the value of the `hardmask` attribute. If it is True then masked elements will notbe unmasked, otherwise masked elements may be set to any value. In either case, unmasked elements may be set, (including missing data). Unmasked elements may be set to missing data by assignment to the `cf.masked` constant or by assignment to a value which contains masked elements. .. seealso:: `cf.masked`, `hardmask`, `where` :Examples: ''' def _mirror_slice(index, size): ''' Return a slice object which creates the reverse of the input slice. The step of the input slice must have a step of `. :Parameters: index : slice A slice object with a step of 1. size : int :Returns: out: slice :Examples: >>> s = slice(2, 6) >>> t = _mirror_slice(s, 8) >>> s, t slice(2, 6), slice(5, 1, -1) >>> range(8)[s] [2, 3, 4, 5] >>> range(8)[t] [5, 4, 3, 2] >>> range(7, -1, -1)[s] [5, 4, 3, 2] >>> range(7, -1, -1)[t] [2, 3, 4, 5] ''' start, stop, step = index.indices(size) size -= 1 start = size - start stop = size - stop if stop < 0: stop = None return slice(start, stop, -1) #--- End: def pda_args = self.pda_args() # ------------------------------------------------------------ # parse the indices # ------------------------------------------------------------ indices, roll, flip_axes = _parse_indices(self, indices) if roll: for iaxis, shift in roll.iteritems(): self.roll(iaxis, shift, i=True) scalar_value = False if value is cf_masked: scalar_value = True else: copied = False if not isinstance(value, Data): # Convert to the value to a Data object value = type(self)(value, self.Units) else: if value.Units.equivalent(self.Units): if not value.Units.equals(self.Units): value = value.copy() value.Units = self.Units copied = True elif not value.Units: value = value.override_units(self.Units) copied = True else: raise ValueError("Some bad units %r, %r" % (self.Units, value.Units)) #--- End: if # value2dt = self._isdt and not value._isdt if value._size == 1: scalar_value = True # if value2dt: # if not copied: # value = value.copy() # value.asdatetime() value = value.datum(0) #--- End: if if scalar_value: # -------------------------------------------------------- # The value is logically scalar # -------------------------------------------------------- for partition in self.partitions.matrix.flat: p_indices, shape = partition.overlaps(indices) if p_indices is None: # This partition does not overlap the indices continue array = partition.dataarray(**pda_args) if value is cf_masked and not partition.masked: # The assignment is masking elements, so turn a # non-masked sub-array into a masked one. array = array.view(numpy_ma_MaskedArray) partition.subarray = array set_subspace(array, p_indices, value) partition.close() #--- End: for if roll: for iaxis, shift in roll.iteritems(): self.roll(iaxis, -shift, i=True) return #--- End: if # ------------------------------------------------------------ # Still here? Then the value is not logically scalar. # ------------------------------------------------------------ data0_shape = self._shape value_shape = value._shape shape0 = map(_size_of_index, indices, data0_shape) self_ndim = self._ndim value_ndim = value._ndim align_offset = self_ndim - value_ndim if align_offset >= 0: # self has more dimensions than other shape0 = shape0[align_offset:] shape1 = value_shape ellipsis = None flip_axes = [i-align_offset for i in flip_axes if i >= align_offset] else: # value has more dimensions than self v_align_offset = -align_offset if value_shape[:v_align_offset] != [1] * v_align_offset: # Can only allow value to have more dimensions then # self if the extra dimensions all have size 1. raise ValueError("Can't broadcast shape %r across shape %r" % (value_shape, data0_shape)) shape1 = value_shape[v_align_offset:] ellipsis = Ellipsis align_offset = 0 #--- End: if # Find out which of the dimensions of value are to be # broadcast, and those which are not. Note that, as in numpy, # it is not allowed for a dimension in value to be larger than # a size 1 dimension in self base_value_indices = [] non_broadcast_dimensions = [] for i, (a, b) in enumerate(izip(shape0, shape1)): if b == 1: base_value_indices.append(slice(None)) elif a == b and b != 1: base_value_indices.append(None) non_broadcast_dimensions.append(i) else: raise ValueError("Can't broadcast shape %r across shape %r" % (shape1, shape0)) #--- End: for previous_location = ((-1,),) * self_ndim start = [0] * value_ndim # save = pda_args['save'] keep_in_memory = pda_args['keep_in_memory'] value.to_memory() for partition in self.partitions.matrix.flat: p_indices, shape = partition.overlaps(indices) if p_indices is None: # This partition does not overlap the indices continue # -------------------------------------------------------- # Find which elements of value apply to this partition # -------------------------------------------------------- value_indices = base_value_indices[:] for i in non_broadcast_dimensions: j = i + align_offset location = partition.location[j][0] reference_location = previous_location[j][0] if location > reference_location: stop = start[i] + shape[j] value_indices[i] = slice(start[i], stop) start[i] = stop elif location == reference_location: value_indices[i] = previous_slice[i] elif location < reference_location: stop = shape[j] value_indices[i] = slice(0, stop) start[i] = stop #--- End: for previous_location = partition.location previous_slice = value_indices[:] for i in flip_axes: value_indices[i] = _mirror_slice(value_indices[i], shape1[i]) if ellipsis: value_indices.insert(0, ellipsis) # -------------------------------------------------------- # # -------------------------------------------------------- # if value2dt: # v = value[tuple(value_indices)].dtarray # else: v = value[tuple(value_indices)].varray if keep_in_memory: #not save: v = v.copy() # Update the partition's data array = partition.dataarray(**pda_args) if not partition.masked and numpy_ma_isMA(v): # The sub-array is not masked and the assignment is # masking elements, so turn the non-masked sub-array # into a masked one. array = array.view(numpy_ma_MaskedArray) partition.subarray = array #--- End: if set_subspace(array, p_indices, v) partition.close() #--- End: For if roll: # Unroll for iaxis, shift in roll.iteritems(): self.roll(iaxis, -shift, i=True) #--- End: def def dumpd(self): ''' Return a dictionary serialization of the data array. .. seealso:: `loadd` :Returns: out: dict The serialization. :Examples: >>> d = cf.Data([[1, 2, 3]], 'm') >>> d.dumpd() {'Partitions': [{'location': [(0, 1), (0, 3)], 'subarray': array([[1, 2, 3]])}], 'Units': , '_axes': ['dim0', 'dim1'], '_pmshape': (), 'dtype': dtype('int64'), 'shape': (1, 3)} >>> d.flip(1) >>> d.transpose() >>> d.Units *= 1000 >>> d.dumpd() {'Partitions': [{'Units': , 'axes': ['dim0', 'dim1'], 'location': [(0, 3), (0, 1)], 'subarray': array([[1, 2, 3]])}], 'Units': , '_axes': ['dim1', 'dim0'], '_flip': ['dim1'], '_pmshape': (), 'dtype': dtype('int64'), 'shape': (3, 1)} >>> d.dumpd() {'Partitions': [{'Units': , 'location': [(0, 1), (0, 3)], 'subarray': array([[1, 2, 3]])}], 'Units': , '_axes': ['dim0', 'dim1'], '_flip': ['dim1'], '_pmshape': (), 'dtype': dtype('int64'), 'shape': (1, 3)} >>> e = cf.Data(loadd=d.dumpd()) >>> e.equals(d) True ''' axes = self._axes units = self.Units dtype = self.dtype cfa_data = { 'dtype' : dtype, 'Units' : units, 'shape' : self._shape, '_axes' : axes[:], '_pmshape': self._pmshape, } pmaxes = self._pmaxes if pmaxes: cfa_data['_pmaxes'] = pmaxes[:] flip = self._flip if flip: cfa_data['_flip'] = flip[:] fill_value = self._fill_value if fill_value is not None: cfa_data['fill_value'] = fill_value cyclic = self._cyclic if cyclic: cfa_data['_cyclic'] = cyclic.copy() HDF_chunks = self._HDF_chunks if HDF_chunks: cfa_data['_HDF_chunks'] = HDF_chunks.copy() partitions = [] for index, partition in self.partitions.ndenumerate(): attrs = {} p_subarray = partition.subarray p_dtype = p_subarray.dtype # Location in partition matrix if index: attrs['index'] = index # Sub-array location attrs['location'] = partition.location[:] # Sub-array part p_part = partition.part if p_part: attrs['part'] = p_part[:] # Sub-array axes p_axes = partition.axes if p_axes != axes: attrs['axes'] = p_axes[:] # Sub-array units p_Units = partition.Units if p_Units != units: attrs['Units'] = p_Units # Sub-array flipped axes p_flip = partition.flip if p_flip: attrs['flip'] = p_flip[:] # -------------------------------------------------------- # File format specific stuff # -------------------------------------------------------- if isinstance(p_subarray, NetCDFFileArray): # ---------------------------------------------------- # NetCDF File Array # ---------------------------------------------------- attrs['format'] = 'netCDF' subarray = {} for attr in ('file', 'shape'): subarray[attr] = getattr(p_subarray, attr) for attr in ('ncvar', 'varid'): value = getattr(p_subarray, attr, None) if value is not None: subarray[attr] = value #--- End: for if p_dtype != dtype: subarray['dtype'] = p_dtype attrs['subarray'] = subarray elif isinstance(p_subarray, UMFileArray): # ---------------------------------------------------- # UM File Array # ---------------------------------------------------- attrs['format'] = 'UM' subarray = {} for attr in ('file', 'shape', 'header_offset', 'data_offset', 'disk_length'): subarray[attr] = getattr(p_subarray, attr) #--- End: for if p_dtype != dtype: subarray['dtype'] = p_dtype attrs['subarray'] = subarray else: attrs['subarray'] = p_subarray #--- End: if partitions.append(attrs) #--- End: for cfa_data['Partitions'] = partitions return cfa_data #--- End:s def def loadd(self, d): ''' Reset the data array in place from a dictionary serialization. .. seealso:: `dumpd` :Parameters: d : dict A dictionary serialization of a `cf.Data` object, as returned by its `dumpd` method. :Returns: None :Examples: >>> d = cf.Data([[1, 2, 3]], 'm') >>> e = cf.Data([6, 7, 8, 9], 's') >>> e.loadd(d.dumpd()) >>> e.equals(d) True >>> e is d False >>> e = cf.Data(loadd=d.dumpd()) >>> e.equals(d) True ''' axes = list(d.get('_axes', ())) shape = tuple(d.get('shape', ())) units = d.get('Units', None) if units is None: units = Units() dtype = d['dtype'] self._dtype = dtype self.Units = units self._axes = axes self._flip = list(d.get('_flip', ())) self._fill_value = d.get('fill_value', None) self._shape = shape self._ndim = len(shape) self._size = long(reduce(operator_mul, shape, 1)) cyclic = d.get('_cyclic', None) if cyclic: self._cyclic = cyclic.copy() else: self._cyclic = _empty_set HDF_chunks = d.get('_HDF_chunks', None) if HDF_chunks: self._HDF_chunks = HDF_chunks.copy() else: self._HDF_chunks = None filename = d.get('file', None) if filename is not None: filename = abspath(filename) base = d.get('base', None) if base is not None: base = abspath(base) # ------------------------------------------------------------ # Initialise an empty partition array # ------------------------------------------------------------ partition_matrix = PartitionMatrix( numpy_empty(d.get('_pmshape', ()), dtype=object), list(d.get('_pmaxes', ())) ) pmndim = partition_matrix.ndim # ------------------------------------------------------------ # Fill the partition array with partitions # ------------------------------------------------------------ for attrs in d['Partitions']: # Find the position of this partition in the partition # matrix if 'index' in attrs: index = attrs['index'] if len(index) == 1: index = index[0] else: index = tuple(index) else: index = (0,) * pmndim location = attrs.get('location', None) if location is not None: location = location[:] else: # Default location location = [[0, i] for i in shape] partition = Partition( location = location, axes = attrs.get('axes', axes)[:], flip = attrs.get('flip', [])[:], Units = attrs.get('Units', units), part = attrs.get('part', [])[:], ) fmt = attrs.get('format', None) if fmt is None: # ---------------------------------------------------- # Subarray is effectively a numpy array in memory # ---------------------------------------------------- partition.subarray = attrs['subarray'] else: # ---------------------------------------------------- # Subarray is in a file on disk # ---------------------------------------------------- partition.subarray = attrs['subarray'] if fmt not in ('netCDF', 'UM'): raise TypeError( "Don't know how to load sub-array from file format %r" % fmt) # Set the 'subarray' attribute kwargs = attrs['subarray'].copy() kwargs['shape'] = tuple(kwargs['shape']) kwargs['ndim'] = len(kwargs['shape']) kwargs['size'] = long(reduce(operator_mul, kwargs['shape'], 1)) kwargs.setdefault('dtype', dtype) if 'file' in kwargs: f = kwargs['file'] if f == '': kwargs['file'] = filename else: if base is not None: f = pathjoin(base, f) kwargs['file'] = abspath(f) else: kwargs['file'] = filename if fmt == 'netCDF': partition.subarray = NetCDFFileArray(**kwargs) elif fmt == 'UM': partition.subarray = UMFileArray(**kwargs) #--- End: if # Put the partition into the partition array partition_matrix[index] = partition #--- End: for # Save the partition array self.partitions = partition_matrix self.chunk() #--- End: def def ceil(self, i=False): ''' Return the ceiling of the data array. .. versionadded:: 1.0 .. seealso:: `floor`, `rint`, `trunc` :Parameters: i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data :Examples: >>> print d.array [-1.9 -1.5 -1.1 -1. 0. 1. 1.1 1.5 1.9] >>> print d.ceil().array [-1. -1. -1. -1. 0. 1. 2. 2. 2.] ''' return self.func(numpy_ceil, out=True, i=i) #---End: def def chunk(self, chunksize=None): ''' Partition the data array :Parameters: chunksize : int, optional The :Returns: None :Examples: >>> d.chunk() >>> d.chunk(100000) ''' if not chunksize: # Set the default chunk size chunksize = CHUNKSIZE() # Define the factor which, when multiplied by the size of a # partition, determines how many chunks are in the partition. factor = (self.dtype.itemsize + 1.0)/chunksize if self._size*factor <= 1: # Don't do any partitioning if the data array is already # smaller than the chunk size. Note: # self._size*factor=(no. bytes in array)/(no. bytes in a # chunk) return # Initialise the dictionary relating each axisq to new # partition boundaries for that axis axes = self._axes d = {} # ------------------------------------------------------------ # Find any new partition boundaries for each axis # ------------------------------------------------------------ for partition in self.partitions.matrix.flat: # n_chunks = number of equal sized bits the partition # needs to be split up into so that each bit's # size is less than ther chunk size. n_chunks = int(partition.size*factor + 0.5) if n_chunks <= 1: continue for axis_size, location, axis in izip(partition.shape, partition.location, axes): if axis_size == 1 or n_chunks <= 1: continue if axis_size <= n_chunks: d[axis] = range(location[0]+1, location[1]) n_chunks = int(math_ceil(n_chunks/float(axis_size))) else: step = int(axis_size/n_chunks) d[axis] = range(location[0]+step, location[1], step) break #--- End: if #--- End: for #--- End: for # ------------------------------------------------------------ # Create any new partition boundaries for each axis # ------------------------------------------------------------ for axis in axes[::-1]: #, extra_bounds in d.iteritems(): extra_bounds = d.get(axis, None) if not extra_bounds: continue if axis not in self.partitions.axes: # Create a new partition axis self.partitions.expand_dims(axis, i=True) # Create the new partitions self.add_partitions(sorted(extra_bounds), axis) #--- End: for #--- End: def def _asdatetime(self, i=False): ''' Change the internal representation of data array elements from numeric reference times to datatime-like objects. If the calendar has not been set then the default CF calendar will be used and the units' and the `calendar` attribute will be updated accordingly. If the internal representations are already datatime-like objects then no change occurs. .. versionadded:: 1.3 .. seealso:: `_asreftime` :Parameters: i: `bool`, optional If True then update the data array in place. By default a new data array is created. :Returns: out: `cf.Data` :Examples: >>> d._asdatetime() ''' if i: d = self else: d = self.copy() units = self.Units if d._isdatetime(): return d if not units.isreftime: raise ValueError( "Can't convert {0!r} data to date-time objects".format(units)) pda_args = d.pda_args(func=rt2dt, dtype=None) for partition in d.partitions.matrix.flat: array = partition.dataarray(**pda_args) p_units = partition.Units partition.Units = Units(p_units.units, p_units._utime.calendar) partition.close() #--- End: for d.Units = Units(units.units, units._utime.calendar) d._dtype = array.dtype return d #--- End: def def _isdatetime(self): return self.dtype.kind == 'O' and self.Units.isreftime def _asreftime(self, i=False): ''' Change the internal representation of data array elements from datatime-like objects to numeric reference times. If the calendar has not been set then the default CF calendar will be used and the units' and the `calendar` attribute will be updated accordingly. If the internal representations are already numeric reference times then no change occurs. .. versionadded:: 1.3 .. seealso:: `_asdatetime` :Parameters: i: `bool`, optional If True then update the data array in place. By default a new data array is created. :Returns: out: `cf.Data` :Examples: >>> d._asreftime() ''' if i: d = self else: d = self.copy() units = d.Units if not d._isdatetime(): if units.isreftime: return d else: raise ValueError( "Can't convert %r data to numeric reference times" % units) #--- End: if pda_args = d.pda_args(func=dt2rt, dtype=None) for partition in d.partitions.matrix.flat: array = partition.dataarray(**pda_args) p_units = partition.Units partition.Units = Units(p_units.units, p_units._utime.calendar) partition.close() #--- End: for d.Units = Units(units.units, units._utime.calendar) d._dtype = array.dtype return d #--- End: def def _combined_units(self, data1, method, inplace): ''' :Parameters: data1 : cf.Data method : str The inplace : bool :Returns: out: `cf.Data`, `cf.Data`, `cf.Units` :Examples: >>> d._combined_units(e, '__sub__') >>> d._combined_units(e, '__imul__') >>> d._combined_units(e, '__irdiv__') >>> d._combined_units(e, '__lt__') >>> d._combined_units(e, '__rlshift__') >>> d._combined_units(e, '__iand__') ''' method_type = method[-5:-2] data0 = self units0 = data0.Units units1 = data1.Units if not units0 and not units1: return data0, data1, units0 if (units0.isreftime and units1.isreftime and not units0.equivalent(units1)): if units0._calendar and not units1._calendar: data1 = data1._asdatetime() data1.override_units(units0, i=True) data1._asreftime(i=True) units1 = units0 elif units1._calendar and not units0._calendar: if not inplace: inplace = True data0 = data0.copy() data0._asdatetime(i=True) data0.override_units(units1, i=True) data0._asreftime(i=True) units0 = units1 #--- End: if if method_type in ('_eq', '_ne', '_lt', '_le', '_gt', '_ge'): #--------------------------------------------------------- # Operator is one of ==, !=, >=, >, <=, < #--------------------------------------------------------- if units0.equivalent(units1): # Units are equivalent if not units0.equals(units1): data1 = data1.copy() data1.Units = units0 return data0, data1, _units_None elif not units1 or not units0: # At least one of the units is undefined return data0, data1, _units_None else: raise ValueError( "Can't compare {0!r} to {1!r}".format(units0, units1)) #--- End: if # still here? if method_type in ('and', '_or', 'ior', 'ror', 'xor', 'ift'): #--------------------------------------------------------- # Operation is one of &, |, ^, >>, << #--------------------------------------------------------- if units0.equivalent(units1): # Units are equivalent if not units0.equals(units1): data1 = data1.copy() data1.Units = units0 return data0, data1, units0 elif not units1: # units1 is undefined return data0, data1, units0 elif not units0: # units0 is undefined return data0, data1, units1 else: # Both units are defined and not equivalent raise ValueError("Can't operate with %s on data with %r to %r" % (method, units0, units1)) #--- End: if # Still here? if units0.isreftime: #--------------------------------------------------------- # units0 is reference time #--------------------------------------------------------- if method_type == 'sub': if units1.isreftime: if units0.equivalent(units1): # Equivalent reference_times: the output units # are time if not units0.equals(units1): data1 = data1.copy() data1.Units = units0 return data0, data1, Units(_ut_unit=units0._ut_unit) else: # Non-equivalent reference_times: raise an # exception getattr(units0, method)(units1) elif units1.istime: # reference_time minus time: the output units are # reference_time time0 = Units(_ut_unit=units0._ut_unit) if not units1.equals(time0): data1 = data1.copy() data1.Units = time0 return data0, data1, units0 elif not units1: # reference_time minus no_units: the output units # are reference_time return data0, data1, units0 else: # reference_time minus something not yet accounted # for: raise an exception getattr(units0, method)(units1) elif method_type == 'add': if units1.istime: # reference_time plus time: the output units are # reference_time time0 = Units(_ut_unit=units0._ut_unit) if not units1.equals(time0): data1 = data1.copy() data1.Units = time0 return data0, data1, units0 elif not units1: # reference_time plus no_units: the output units # are reference_time return data0, data1, units0 else: # reference_time plus something not yet accounted # for: raise an exception getattr(units0, method)(units1) else: # Raise an exception getattr(units0, method)(units1) elif units1.isreftime: #--------------------------------------------------------- # units1 is reference time #--------------------------------------------------------- if method_type == 'add': if units0.istime: # Time plus reference_time: the output units are # reference_time time1 = Units(_ut_unit=units1._ut_unit) if not units0.equals(time1): if not inplace: data0 = data0.copy() data0.Units = time1 return data0, data1, units1 elif not units0: # No_units plus reference_time: the output units # are reference_time return data0, data1, units1 else: # Raise an exception getattr(units0, method)(units1) #--- End: if # Still here? if method_type in ('mul', 'div'): #--------------------------------------------------------- # Method is one of *, /, // #--------------------------------------------------------- if not units1: # units1 is undefined return data0, data1, getattr(units0, method)(_units_1) elif not units0: # units0 is undefined return data0, data1, getattr(_units_1, method)(units1) # elif units0.equivalent(units1) and not units0.equals(units1): # # Both units are defined and equivalent but not equal # data1 = data1.copy() # data1.Units = units0 # return data0, data1, getattr(units0, method)(units0)# !!!!!!! units0*units0 YOWSER else: # Both units are defined (note: if the units are # noncombinable then this will raise an exception) return data0, data1, getattr(units0, method)(units1) #--- End: if # Still here? if method_type in ('sub', 'add', 'mod'): #--------------------------------------------------------- # Operator is one of +, - #--------------------------------------------------------- if units0.equivalent(units1): # Units are equivalent if not units0.equals(units1): data1 = data1.copy() data1.Units = units0 return data0, data1, units0 elif not units1: # units1 is undefined return data0, data1, units0 elif not units0: # units0 is undefined return data0, data1, units1 else: # Both units are defined and not equivalent (note: if # the units are noncombinable then this will raise an # exception) return data0, data1, getattr(units0, method)(units1) #--- End: if # Still here? if method_type == 'pow': if method == '__rpow__': #----------------------------------------------------- # Operator is __rpow__ #----------------------------------------------------- if not units1: # units1 is undefined if not units0: # units0 is undefined return data0, data1, _units_None elif units0.isdimensionless: # units0 is dimensionless if not units0.equals(_units_1): if not inplace: data0 = data0.copy() data0.Units = _units_1 return data0, data1, _units_None elif units1.isdimensionless: # units1 is dimensionless if not units1.equals(_units_1): data1 = data1.copy() data1.Units = _units_1 if not units0: # units0 is undefined return data0, data1, _units_1 elif units0.isdimensionless: # units0 is dimensionless if not units0.equals(_units_1): if not inplace: data0 = data0.copy() data0.Units = _units_1 return data0, data1, _units_1 else: # units1 is defined and is not dimensionless if data0._size > 1: raise ValueError("kkkkkkkkkjjjjjjjjjjjjjjjj") if not units0: return data0, data1, units1 ** data0.datum(0) elif units0.isdimensionless: # units0 is dimensionless if not units0.equals(_units_1): if not inplace: data0 = data0.copy() data0.Units = _units_1 return data0, data1, units1 ** data0.datum(0) # --- End: if # This will deliberately raise an exception units1 ** units0 else: #----------------------------------------------------- # Operator is __pow__ #----------------------------------------------------- if not units0: # units0 is undefined if not units1: # units0 is undefined return data0, data1, _units_None elif units1.isdimensionless: # units0 is dimensionless if not units1.equals(_units_1): data1 = data1.copy() data1.Units = _units_1 return data0, data1, _units_None elif units0.isdimensionless: # units0 is dimensionless if not units0.equals(_units_1): if not inplace: data0 = data0.copy() data0.Units = _units_1 if not units1: # units1 is undefined return data0, data1, _units_1 elif units1.isdimensionless: # units1 is dimensionless if not units1.equals(_units_1): data1 = data1.copy() data1.Units = _units_1 return data0, data1, _units_1 else: # units0 is defined and is not dimensionless if data1._size > 1: raise ValueError("kkkkkkkkkjjjjjjjjjjjjjjjj 8888888888888888") if not units1: return data0, data1, units0 ** data1.datum(0) elif units1.isdimensionless: # units1 is dimensionless if not units1.equals(_units_1): data1 = data1.copy() data1.Units = _units_1 return data0, data1, units0 ** data1.datum(0) #--- End: if # This will deliberately raise an exception units0 ** units1 #--- End: if #--- End: if # Still here? raise ValueError("Can't operate with %s on data with %r to %r" % (method, units0, units1)) #--- End: def def _binary_operation(self, other, method): '''Implement binary arithmetic and comparison operations with the numpy broadcasting rules. It is called by the binary arithmetic and comparison methods, such as `__sub__`, `__imul__`, `__rdiv__`, `__lt__`, etc. .. seealso:: `_unary_operation` :Parameters: other: The object on the right hand side of the operator. method: `str` The binary arithmetic or comparison method name (such as ``'__imul__'`` or ``'__ge__'``). :Returns: new: `cf.Data` A new data object, or if the operation was in place, the same data object. :Examples: >>> d = cf.Data([0, 1, 2, 3]) >>> e = cf.Data([1, 1, 3, 4]) >>> f = d._binary_operation(e, '__add__') >>> print f.array [1 2 5 7] >>> e = d._binary_operation(e, '__lt__') >>> print e.array [ True False True True] >>> d._binary_operation(2, '__imul__') >>> print d.array [0 2 4 6] ''' inplace = (method[2] == 'i') method_type = method[-5:-2] # ------------------------------------------------------------ # Ensure that other is an independent Data object # ------------------------------------------------------------ if getattr(other, '_NotImplemented_RHS_Data_op', False): # Make sure that return NotImplemented elif not isinstance(other, self.__class__): other = type(self).asdata(other) # if other._isdt and self.Units.isreftime: # # Make sure that an array of date-time objects has the # # right calendar. # other.override_units(self.Units, i=True) #--- End: if data0 = self.copy() data0, other, new_Units = data0._combined_units(other, method, True) # ------------------------------------------------------------ # Bring other into memory, if appropriate. # ------------------------------------------------------------ other.to_memory() # ------------------------------------------------------------ # Find which dimensions need to be broadcast in one or other # of the arrays. # # Method: # # For each common dimension, the 'broadcast_indices' list # will have a value of None if there is no broadcasting # required (i.e. the two arrays have the same size along # that dimension) or a value of slice(None) if broadcasting # is required (i.e. the two arrays have the different sizes # along that dimension and one of the sizes is 1). # # Example: # # If c.shape is (7,1,6,1,5) and d.shape is (6,4,1) then # broadcast_indices will be # [None,slice(None),slice(None)]. # # The indices to d which correspond to a partition of c, # are the relevant subset of partition.indices updated # with the non None elements of the broadcast_indices # list. # # In this example, if a partition of c were to have a # partition.indices value of (slice(0,3), slice(0,1), # slice(2,4), slice(0,1), slice(0,5)), then the relevant # subset of these is partition.indices[2:] and the # corresponding indices to d are (slice(2,4), slice(None), # slice(None)) # # ------------------------------------------------------------ data0_shape = data0._shape data1_shape = other._shape if data0_shape == data1_shape: # self and other have the same shapes broadcasting = False align_offset = 0 ellipsis = None new_shape = data0_shape new_ndim = data0._ndim new_axes = data0._axes new_size = data0._size else: # self and other have different shapes broadcasting = True data0_ndim = data0._ndim data1_ndim = other._ndim align_offset = data0_ndim - data1_ndim if align_offset >= 0: # self has at least as many axes as other shape0 = data0_shape[align_offset:] shape1 = data1_shape new_shape = data0_shape[:align_offset] new_ndim = data0_ndim new_axes = data0._axes else: # other has more axes than self align_offset = -align_offset shape0 = data0_shape shape1 = data1_shape[align_offset:] new_shape = data1_shape[:align_offset] new_ndim = data1_ndim if not data0_ndim: new_axes = other._axes else: new_axes = [] existing_axes = self._all_axis_names() for n in new_shape: axis = data0._new_axis_identifier(existing_axes) existing_axes.append(axis) new_axes.append(axis) #--- End: for new_axes += data0._axes #--- End: for align_offset = 0 #--- End: if broadcast_indices = [] for a, b in izip(shape0, shape1): if a == b: new_shape += (a,) broadcast_indices.append(None) continue # Still here? if a > 1 and b == 1: new_shape += (a,) elif b > 1 and a == 1: new_shape += (b,) else: raise ValueError( "Can't broadcast shape %s against shape %s" % (data1_shape, data0_shape)) broadcast_indices.append(slice(None)) #--- End: for new_size = long(reduce(operator_mul, new_shape, 1)) dummy_location = [None] * new_ndim #---End: if new_flip = [] # if broadcasting: # max_size = 0 # for partition in data0.partitions.matrix.flat: # indices0 = partition.indices # indices1 = tuple([ # (index if not broadcast_index else broadcast_index) # for index, broadcast_index in izip( # indices0[align_offset:], broadcast_indices) # ]) # indices1 = (Ellipsis,) + indices # # shape0 = partition.shape # shape1 = [index.stop - index.start # for index in parse_indices(other, indices1)] # # broadcast_size = 1 # for n0, n1 in izip_longest(shape0[::-1], shape1[::-1], fillvalue=1): # if n0 > 1: # broadcast_size *= n0 # else: # broadcast_size *= n1 # #--- End: for # # if broadcast_size > max_size: # max_size = broadcast_size # #--- End: for # # chunksize = CHUNKSIZE() # ffff = max_size*(new_dtype.itemsize + 1) # if ffff > chunksize: # data0.chunk(chunksize*(chunksize/ffff)) # #--- End: if # ------------------------------------------------------------ # Create a Data object which just contains the metadata for # the result. If we're doing a binary arithmetic operation # then result will get filled with data and returned. If we're # an augmented arithmetic assignment then we'll update self # with this new metadata. # ------------------------------------------------------------ #if new_shape != data0_shape: # set_location_map = True # new_size = self._size # dummy_location = [None] * new_ndim #else: # set_location_map = False # new_size = long(reduce(mul, new_shape, 1)) # if not set_location_map: # new_size = long(reduce(mul, new_shape, 1)) # else: # new_size = self._size result = data0.copy() result._shape = new_shape result._ndim = new_ndim result._size = new_size result._axes = new_axes # result._flip = new_flip # Is the result an array of date-time objects? # new_isdt = data0._isdt and new_Units.isreftime # ------------------------------------------------------------ # Set the data type of the result # ------------------------------------------------------------ if method_type in ('_eq', '_ne', '_lt', '_le', '_gt', '_ge'): new_dtype = numpy_dtype(bool) # elif not new_isdt: else: if 'true' in method: new_dtype = numpy_dtype(float) elif not inplace: new_dtype = numpy_result_type(data0.dtype, other.dtype) else: new_dtype = data0.dtype # else: # new_dtype = _dtype_object # ------------------------------------------------------------ # Set flags to control whether or not the data of result and # self should be kept in memory # ------------------------------------------------------------ keep_result_in_memory = result.fits_in_memory(new_dtype.itemsize) keep_self_in_memory = data0.fits_in_memory(data0.dtype.itemsize) if not inplace: # When doing a binary arithmetic operation we need to # decide whether or not to keep self's data in memory revert_to_file = True # save_self = not data0.fits_in_memory(data0.dtype.itemsize) # keep_self_in_memory = data0.fits_in_memory(data0.dtype.itemsize) else: # When doing an augmented arithmetic assignment we don't # need to keep self's original data in memory revert_to_file = False # save_self = False # keep_self_in_memory = True # dimensions = self._axes # direction = self.direction # units = self.Units pda_args = data0.pda_args(keep_in_memory=keep_self_in_memory, revert_to_file=revert_to_file) # if data0._isdt: # # If self is a datatime array then make sure that it gets # # converted to a reference time array prior to the # # operation # pda_args['func'] = dt2rt # pda_args['update'] = False original_numpy_seterr = numpy_seterr(**_seterr) # Think about dtype, here. for partition_r, partition_s in izip(result.partitions.matrix.flat, data0.partitions.matrix.flat): indices = partition_s.indices array0 = partition_s.dataarray(**pda_args) if broadcasting: indices = tuple([ (index if not broadcast_index else broadcast_index) for index, broadcast_index in izip( indices[align_offset:], broadcast_indices) ]) indices = (Ellipsis,) + indices #--- End: if # if other._isdt: # # If other is a datatime array then make sure that it # # gets converted to a reference time array prior to # # the operation # array1 = other[indices].rtarray # else: array1 = other[indices].array #unsafe_array # UNRESOLVED ISSUE: array1 could be much larger than the chunk size. if not inplace: partition = partition_r partition.update_inplace_from(partition_s) else: partition = partition_s # -------------------------------------------------------- # Do the binary operation on this partition's data # -------------------------------------------------------- try: array0 = getattr(array0, method)(array1) except FloatingPointError as error: # Floating point point errors have been trapped if _mask_fpe[0]: # Redo the calculation ignoring the errors and # then set invalid numbers to missing data numpy_seterr(**_seterr_raise_to_ignore) array0 = getattr(array0, method)(array1) array0 = numpy_ma_masked_invalid(array0, copy=False) numpy_seterr(**_seterr) else: # Raise the floating point error exception raise FloatingPointError(error) except TypeError as error: if inplace: raise TypeError( "Incompatible result data type ({0!r}) for in-place {1!r} arithmetic".format( numpy_result_type(array0.dtype, array1.dtype).name, array0.dtype.name)) else: raise TypeError(error) #--- End: try # if new_isdt: # # Convert result array to a date-time object array # array0 = rt2dt(array0, data0.Units) if array0 is NotImplemented: array0 = numpy_zeros(partition.shape, dtype=bool) if not inplace: p_datatype = array0.dtype if new_dtype != p_datatype: new_dtype = numpy_result_type(p_datatype, new_dtype) partition.subarray = array0 partition.Units = new_Units partition.axes = new_axes partition.flip = new_flip partition.part = [] if broadcasting: partition.location = dummy_location partition.shape = list(array0.shape) partition._original = False partition._write_to_disk = False partition.close(keep_in_memory=keep_result_in_memory) if not inplace: partition_s.close() #--- End: for # Reset numpy.seterr numpy_seterr(**original_numpy_seterr) if not inplace: # result._isdt = False #new_isdt result._Units = new_Units result.dtype = new_dtype result._flip = new_flip if broadcasting: result.partitions.set_location_map(result._axes) return result else: # Update the metadata for the new master array in place # data0._isdt = False #new_isdt data0._shape = new_shape data0._ndim = new_ndim data0._size = new_size data0._axes = new_axes data0._flip = new_flip data0._Units = new_Units data0.dtype = new_dtype if broadcasting: data0.partitions.set_location_map(new_axes) self.__dict__ = data0.__dict__ return self #--- End: def def _query_set(self, values, exact=True): ''' ''' if not exact: raise ValueError("Can't, as yet, regex on non string") i = iter(values) v = i.next() out = (self == v) for v in i: out |= (self == v) return out # new = self.copy() # # pda_args = new.pda_args(revert_to_file=True) # # for partition in new.partitions.matrix.flat: # array = partition.dataarray(**pda_args) # # i = iter(values) # value = i.next() # out = (array == value) # for value in i: # out |= (array == value) # # partition.subarray = out # partition.close() # #--- End: for # # new.dtype = bool # # return new #--- End: def def _query_contain(self, value): ''' ''' return self == value #--- End: def def _query_wi(self, value0, value1): ''' ''' return (self >= value0) & (self <= value1) # new = self.copy() # # pda_args = new.pda_args(revert_to_file=True) # # for partition in new.partitions.matrix.flat: # array = partition.dataarray(**pda_args) # print array, new.Units, type(value0), value1 # partition.subarray = (array >= value0) & (array <= value1) # partition.close() # #--- End: for # # new.dtype = bool # # return new #--- End: def def _query_wo(self, value0, value1): ''' ''' return (self < value0) | (self > value1) # new = self.copy() # # pda_args = new.pda_args(revert_to_file=True) # # for partition in new.partitions.matrix.flat: # array = partition.dataarray(**pda_args) # partition.subarray = (array < value0) | (array > value1) # partition.close() # #--- End: for # # new.dtype = bool # # return new #--- End: def @classmethod def concatenate(cls, data, axis=0, _preserve=True): ''' Join a sequence of data arrays together. :Parameters: data: sequence of cf.Data The data arrays to be concatenated. Concatenation is carried out in the order given. Each data array must have equivalent units and the same shape, except in the concatenation axis. Note that scalar arrays are treated as if they were one dimensionsal. axis: int, optional The axis along which the arrays will be joined. The default is 0. Note that scalar arrays are treated as if they were one dimensionsal. _preserve: bool, optional If False then the time taken to do the concatenation is reduced at the expense of changing the input data arrays given by the *data* parameter in place and **these in place changes will render the input data arrays unusable**. Therefore, only set to False if it is 100% certain that the input data arrays will not be accessed again. By default the input data arrays are preserved. :Returns: out: cf.Data The concatenated data array. :Examples: >>> d = cf.Data([[1, 2], [3, 4]], 'km') >>> e = cf.Data([[5.0, 6.0]], 'metre') >>> f = cf.Data.concatenate((d, e)) >>> print f.array [[ 1. 2. ] [ 3. 4. ] [ 0.005 0.006]] >>> f.equals(cf.Data.concatenate((d, e), axis=-2)) True >>> e = cf.Data([[5.0], [6.0]], 'metre') >>> f = cf.Data.concatenate((d, e), axis=1) >>> print f.array [[ 1. 2. 0.005] [ 3. 4. 0.006]] >>> d = cf.Data(1, 'km') >>> e = cf.Data(50.0, 'metre') >>> f = cf.Data.concatenate((d, e)) >>> print f.array [ 1. 0.05] >>> e = cf.Data([50.0, 75.0], 'metre') >>> f = cf.Data.concatenate((d, e)) >>> print f.array [ 1. 0.05 0.075] ''' data = tuple(data) if len(data) < 2: raise ValueError( "Can't concatenate: Must provide two or data arrays") data0 = data[0] data = data[1:] if _preserve: data0 = data0.copy() else: # If data0 appears more than once in the input data arrays # then we need to copy it for d in data: if d is data0: data0 = data0.copy() break #--- End: if # Turn a scalar array into a 1-d array ndim = data0._ndim if not ndim: data0.expand_dims(i=True) ndim = 1 # ------------------------------------------------------------ # Check that the axis, shapes and units of all of the input # data arrays are consistent # ------------------------------------------------------------ # if data0._isdt: # data0.asreftime(i=True) if axis < 0: axis += ndim if not 0 <= axis < ndim: raise ValueError( "Can't concatenate: Invalid axis (expected %d <= axis < %d)" % (-ndim, ndim)) shape0 = data0._shape units0 = data0.Units axis_p1 = axis + 1 for data1 in data: shape1 = data1._shape if (shape0[axis_p1:] != shape1[axis_p1:] or shape0[:axis] != shape1[:axis]): raise ValueError( "Can't concatenate: All the input array axes except for the concatenation axis must have the same size") if not units0.equivalent(data1.Units): raise ValueError( "Can't concatenate: All the input arrays must have equivalent units") # if data1._isdt: # data1.asreftime(i=True) #--- End: for for i, data1 in enumerate(data): if _preserve: data1 = data1.copy() else: # If data1 appears more than once in the input data # arrays then we need to copy it for d in data[i+1:]: if d is data1: data1 = data1.copy() break #--- End: if # Turn a scalar array into a 1-d array if not data1._ndim: data1.expand_dims(i=True) shape1 = data1._shape # ------------------------------------------------------------ # 1. Make sure that the internal names of the axes match # ------------------------------------------------------------ axis_map = {} if data1._pmsize < data0._pmsize: for axis1, axis0 in izip(data1._axes, data0._axes): axis_map[axis1] = axis0 data1._change_axis_names(axis_map) else: for axis1, axis0 in izip(data1._axes, data0._axes): axis_map[axis0] = axis1 data0._change_axis_names(axis_map) #--- End: if # ------------------------------------------------------------ # Find the internal name of the concatenation axis # ------------------------------------------------------------ Paxis = data0._axes[axis] # ------------------------------------------------------------ # 2. Make sure that the aggregating axis is an axis of the # partition matrix of both arrays and that the partition # matrix axes are the same in both arrays (although, for # now, they may have different orders) # # Note: # # a) This may involve adding new partition matrix axes to # either or both of data0 and data1. # # b) If the aggregating axis needs to be added it is inserted # as the outer (slowest varying) axis to reduce the # likelihood of having to (expensively) transpose the # partition matrix. # ------------------------------------------------------------ for f, g in izip((data0, data1), (data1, data0)): g_pmaxes = g.partitions.axes if Paxis in g_pmaxes: g_pmaxes = g_pmaxes[:] g_pmaxes.remove(Paxis) f_partitions = f.partitions f_pmaxes = f_partitions.axes for pmaxis in g_pmaxes[::-1] + [Paxis]: if pmaxis not in f_pmaxes: f_partitions.expand_dims(pmaxis, i=True) # if Paxis not in f_partitions.axes: # f_partitions.expand_dims(Paxis, i=True) #--- End: for # ------------------------------------------------------------ # 3. Make sure that aggregating axis is the outermost (slowest # varying) axis of the partition matrix of data0 # ------------------------------------------------------------ ipmaxis = data0.partitions.axes.index(Paxis) if ipmaxis: data0.partitions.swapaxes(ipmaxis, 0, i=True) # ------------------------------------------------------------ # 4. Make sure that the partition matrix axes of data1 are in # the same order as those in data0 # ------------------------------------------------------------ pmaxes1 = data1.partitions.axes ipmaxes = [pmaxes1.index(pmaxis) for pmaxis in data0.partitions.axes] data1.partitions.transpose(ipmaxes, i=True) # -------------------------------------------------------- # 5. Create new partition boundaries in the partition # matrices of data0 and data1 so that their partition # arrays may be considered as different slices of a # common, larger hyperrectangular partition array. # # Note: # # * There is no need to add any boundaries across the # concatenation axis. # -------------------------------------------------------- boundaries0 = data0.partition_boundaries() boundaries1 = data1.partition_boundaries() for dim in data0.partitions.axes[1:]: # Still here? Then see if there are any partition matrix # boundaries to be created for this partition dimension bounds0 = boundaries0[dim] bounds1 = boundaries1[dim] symmetric_diff = set(bounds0).symmetric_difference(bounds1) if not symmetric_diff: # The partition boundaries for this partition # dimension are already the same in data0 and data1 continue # Still here? Then there are some partition boundaries to # be created for this partition dimension in data0 and/or # data1. for f, g, bf, bg in ((data0, data1, bounds0, bounds1), (data1, data0, bounds1, bounds0)): extra_bounds = [i for i in bg if i in symmetric_diff] f.add_partitions(extra_bounds, dim) #--- End: for #--- End: for # ------------------------------------------------------------ # 6. Concatenate data0 and data1 partition matrices # ------------------------------------------------------------ if data0._flip != data1._flip: data0._move_flip_to_partitions() data1._move_flip_to_partitions() matrix0 = data0.partitions.matrix matrix1 = data1.partitions.matrix new_pmshape = list(matrix0.shape) new_pmshape[0] += matrix1.shape[0] # Initialise an empty partition matrix with the new shape new_matrix = numpy_empty(new_pmshape, dtype=object) # Insert the data0 partition matrix new_matrix[:matrix0.shape[0]] = matrix0 # Insert the data1 partition matrix new_matrix[matrix0.shape[0]:] = matrix1 data0.partitions.matrix = new_matrix # Update the location map of the partition matrix of data0 data0.partitions.set_location_map((Paxis,), (axis,)) # ------------------------------------------------------------ # 7. Update the size, shape and dtype of data0 # ------------------------------------------------------------ data0._size += long(data1._size) shape0 = list(shape0) shape0[axis] += shape1[axis] data0._shape = tuple(shape0) dtype0 = data0.dtype dtype1 = data1.dtype if dtype0 != dtype1: data0.dtype = numpy_result_type(dtype0, dtype1) #--- End: for # ------------------------------------------------------------ # Done # ------------------------------------------------------------ return data0 #--- End: def def concatenate2(self, data, axis=0, i=False, _preserve=True): ''' Join a sequence of data arrays together. :Parameters: data : sequence of cf.Data The data arrays to be concatenated. Concatenation is carried out in the order given. Each data array must have equivalent units and the same shape, except in the concatenation axis. Note that scalar arrays are treated as if they were one dimensionsal. axis : int, optional The axis along which the arrays will be joined. The default is 0. Note that scalar arrays are treated as if they were one dimensionsal. i : bool, optional If True then update the data array in place. By default a new data array is created. _preserve : bool, optional If False then the time taken to do the concatenation is reduced at the expense of changing the input data arrays given by the *data* parameter in place and **these in place changes will render the input data arrays unusable**. Therefore, only set to False if it is 100% certain that the input data arrays will not be accessed again. By default the input data arrays are preserved. :Returns: out: cf.Data The concatenated data array. :Examples: >>> d = cf.Data([[1, 2], [3, 4]], 'km') >>> e = cf.Data([[5.0, 6.0]], 'metre') >>> f = cf.Data.concatenate((d, e)) >>> print f.array [[ 1. 2. ] [ 3. 4. ] [ 0.005 0.006]] >>> f.equals(cf.Data.concatenate((d, e), axis=-2)) True >>> e = cf.Data([[5.0], [6.0]], 'metre') >>> f = cf.Data.concatenate((d, e), axis=1) >>> print f.array [[ 1. 2. 0.005] [ 3. 4. 0.006]] >>> d = cf.Data(1, 'km') >>> e = cf.Data(50.0, 'metre') >>> f = cf.Data.concatenate((d, e)) >>> print f.array [ 1. 0.05] >>> e = cf.Data([50.0, 75.0], 'metre') >>> f = cf.Data.concatenate((d, e)) >>> print f.array [ 1. 0.05 0.075] ''' data = tuple(data) if len(data) < 1: raise ValueError( "Can't concatenate: Must provide two or data arrays") data0 = self if _preserve: data0 = data0.copy() else: # If data0 appears more than once in the input data arrays # then we need to copy it for d in data: if d is data0: data0 = data0.copy() break #--- End: if # Turn a scalar array into a 1-d array ndim = data0._ndim if not ndim: data0.expand_dims(i=True) ndim = 1 # ------------------------------------------------------------ # Check that the axis, shapes and units of all of the input # data arrays are consistent # ------------------------------------------------------------ if axis < 0: axis += ndim if not 0 <= axis < ndim: raise ValueError( "Can't concatenate: Invalid axis (expected %d <= axis < %d)" % (-ndim, ndim)) shape0 = data0._shape units0 = data0.Units axis_p1 = axis + 1 for data1 in data: shape1 = data1._shape if (shape0[axis_p1:] != shape1[axis_p1:] or shape0[:axis] != shape1[:axis]): raise ValueError( "Can't concatenate: All the input array axes except for the concatenation axis must have the same size") if not units0.equivalent(data1.Units): raise ValueError( "Can't concatenate: All the input arrays must have equivalent units") #--- End: for for i, data1 in enumerate(data): if _preserve: data1 = data1.copy() else: # If data1 appears more than once in the input data # arrays then we need to copy it for d in data[i+1:]: if d is data1: data1 = data1.copy() break #--- End: if # Turn a scalar array into a 1-d array if not data1._ndim: data1.expand_dims(i=True) shape1 = data1._shape # ------------------------------------------------------------ # 1. Make sure that the internal names of the axes match # ------------------------------------------------------------ axis_map = {} if data1._pmsize < data0._pmsize: for axis1, axis0 in izip(data1._axes, data0._axes): axis_map[axis1] = axis0 data1._change_axis_names(axis_map) else: for axis1, axis0 in izip(data1._axes, data0._axes): axis_map[axis0] = axis1 data0._change_axis_names(axis_map) #--- End: if # ------------------------------------------------------------ # Find the internal name of the concatenation axis # ------------------------------------------------------------ Paxis = data0._axes[axis] # ------------------------------------------------------------ # 2. Make sure that the aggregating axis is an axis of the # partition matrix of both arrays and that the partition # matrix axes are the same in both arrays (although, for # now, they may have different orders) # # Note: # # a) This may involve adding new partition matrix axes to # either or both of data0 and data1. # # b) If the aggregating axis needs to be added it is inserted # as the outer (slowest varying) axis to reduce the # likelihood of having to (expensively) transpose the # partition matrix. # ------------------------------------------------------------ for f, g in izip((data0, data1), (data1, data0)): g_pmaxes = g.partitions.axes if Paxis in g_pmaxes: g_pmaxes = g_pmaxes[:] g_pmaxes.remove(Paxis) f_partitions = f.partitions f_pmaxes = f_partitions.axes for pmaxis in g_pmaxes[::-1] + [Paxis]: if pmaxis not in f_pmaxes: f_partitions.expand_dims(pmaxis, i=True) # if Paxis not in f_partitions.axes: # f_partitions.expand_dims(Paxis, i=True) #--- End: for # ------------------------------------------------------------ # 3. Make sure that aggregating axis is the outermost (slowest # varying) axis of the partition matrix of data0 # ------------------------------------------------------------ ipmaxis = data0.partitions.axes.index(Paxis) if ipmaxis: data0.partitions.swapaxes(ipmaxis, 0, i=True) # ------------------------------------------------------------ # 4. Make sure that the partition matrix axes of data1 are in # the same order as those in data0 # ------------------------------------------------------------ pmaxes1 = data1.partitions.axes ipmaxes = [pmaxes1.index(pmaxis) for pmaxis in data0.partitions.axes] data1.partitions.transpose(ipmaxes, i=True) # ------------------------------------------------------------ # 5. Create new partition boundaries in the partition # matrices of data0 and data1 so that their partition # arrays may be considered as different slices of a common, # larger hyperrectangular partition array. # # Note: # # * There is no need to add any boundaries across the # concatenation axis. # ------------------------------------------------------------ boundaries0 = data0.partition_boundaries() boundaries1 = data1.partition_boundaries() for dim in data0.partitions.axes[1:]: # Still here? Then see if there are any partition matrix # boundaries to be created for this partition dimension bounds0 = boundaries0[dim] bounds1 = boundaries1[dim] symmetric_diff = set(bounds0).symmetric_difference(bounds1) if not symmetric_diff: # The partition boundaries for this partition # dimension are already the same in data0 and data1 continue # Still here? Then there are some partition boundaries to # be created for this partition dimension in data0 and/or # data1. for f, g, bf, bg in ((data0, data1, bounds0, bounds1), (data1, data0, bounds1, bounds0)): extra_bounds = [i for i in bg if i in symmetric_diff] f.add_partitions(extra_bounds, dim) #--- End: for #--- End: for # ------------------------------------------------------------ # 6. Concatenate data0 and data1 partition matrices # ------------------------------------------------------------ if data0._flip != data1._flip: data0._move_flip_to_partitions() data1._move_flip_to_partitions() matrix0 = data0.partitions.matrix matrix1 = data1.partitions.matrix new_pmshape = list(matrix0.shape) new_pmshape[0] += matrix1.shape[0] # Initialise an empty partition matrix with the new shape new_matrix = numpy_empty(new_pmshape, dtype=object) # Insert the data0 partition matrix new_matrix[:matrix0.shape[0]] = matrix0 # Insert the data1 partition matrix new_matrix[matrix0.shape[0]:] = matrix1 data0.partitions.matrix = new_matrix # Update the location map of the partition matrix of data0 data0.partitions.set_location_map((Paxis,), (axis,)) # ------------------------------------------------------------ # 7. Update the size, shape and dtype of data0 # ------------------------------------------------------------ data0._size += long(data1._size) shape0 = list(shape0) shape0[axis] += shape1[axis] data0._shape = tuple(shape0) dtype0 = data0.dtype dtype1 = data1.dtype if dtype0 != dtype1: data0.dtype = numpy_result_type(dtype0, dtype1) #--- End: for # ------------------------------------------------------------ # Done # ------------------------------------------------------------ return data0 #--- End: def def _move_flip_to_partitions(self): ''' This does not change the master array. ''' flip = self._flip if not flip: return for partition in self.partitions.matrix.flat: p_axes = partition.axes p_flip = partition.flip[:] for axis in flip: if axis in p_flip: p_flip.remove(axis) elif axis in p_axes: p_flip.append(axis) #--- End: for partition.flip = p_flip #--- End: for self._flip = [] #--- End: def def _parse_axes(self, axes, method): ''' :Parameters: axes : (sequence of) int The axes of the data array. May be one of, or a sequence of any combination of zero or more of: * The integer position of a dimension in the data array (negative indices allowed). method : str :Returns: out: list :Examples: ''' ndim = self._ndim if isinstance(axes, (int, long)): axes = (axes,) axes2 = [] for axis in axes: if 0 <= axis < ndim: axes2.append(axis) elif -ndim <= axis < 0: axes2.append(axis + ndim) else: raise ValueError( "Can't %s: Invalid axis: %r" % (method, axis)) #--- End: for # Check for duplicate axes n = len(axes2) if n > 1 and n > len(set(axes2)): raise ValueError("Can't %s: Duplicate axis (%s)" % (method, axes2)) return axes2 #--- End: def def _unary_operation(self, operation): ''' Implement unary arithmetic operations. It is called by the unary arithmetic methods, such as __abs__(). .. seealso:: `_binary_operation` :Parameters: operation : str The unary arithmetic method name (such as "__invert__"). :Returns: new : Data A new Data array. :Examples: >>> d = cf.Data([[1, 2, -3, -4, -5]]) >>> e = d._unary_operation('__abs__') >>> print e.array [[1 2 3 4 5]] >>> e = d.__abs__() >>> print e.array [[1 2 3 4 5]] >>> e = abs(d) >>> print e.array [[1 2 3 4 5]] ''' self.to_memory() new = self.copy() pda_args = new.pda_args() for partition in new.partitions.matrix.flat: array = partition.dataarray(**pda_args) partition.subarray = getattr(operator, operation)(array) partition.close() #--- End: for return new #--- End: def def __add__(self, other): ''' The binary arithmetic operation ``+`` x.__add__(y) <==> x+y ''' return self._binary_operation(other, '__add__') #--- End: def def __iadd__(self, other): ''' The augmented arithmetic assignment ``+=`` x.__iadd__(y) <==> x+=y ''' return self._binary_operation(other, '__iadd__') #--- End: def def __radd__(self, other): ''' The binary arithmetic operation ``+`` with reflected operands x.__radd__(y) <==> y+x ''' return self._binary_operation(other, '__radd__') #--- End: def def __sub__(self, other): ''' The binary arithmetic operation ``-`` x.__sub__(y) <==> x-y ''' return self._binary_operation(other, '__sub__') #--- End: def def __isub__(self, other): ''' The augmented arithmetic assignment ``-=`` x.__isub__(y) <==> x-=y ''' return self._binary_operation(other, '__isub__') #--- End: def def __rsub__(self, other): ''' The binary arithmetic operation ``-`` with reflected operands x.__rsub__(y) <==> y-x ''' return self._binary_operation(other, '__rsub__') #--- End: def def __mul__(self, other): ''' The binary arithmetic operation ``*`` x.__mul__(y) <==> x*y ''' return self._binary_operation(other, '__mul__') #--- End: def def __imul__(self, other): ''' The augmented arithmetic assignment ``*=`` x.__imul__(y) <==> x*=y ''' return self._binary_operation(other, '__imul__') #--- End: def def __rmul__(self, other): ''' The binary arithmetic operation ``*`` with reflected operands x.__rmul__(y) <==> y*x ''' return self._binary_operation(other, '__rmul__') #--- End: def def __div__(self, other): ''' The binary arithmetic operation ``/`` x.__div__(y) <==> x/y ''' return self._binary_operation(other, '__div__') #--- End: def def __idiv__(self, other): ''' The augmented arithmetic assignment ``/=`` x.__idiv__(y) <==> x/=y ''' return self._binary_operation(other, '__idiv__') #--- End: def def __rdiv__(self, other): ''' The binary arithmetic operation ``/`` with reflected operands x.__rdiv__(y) <==> y/x ''' return self._binary_operation(other, '__rdiv__') #--- End: def def __floordiv__(self, other): ''' The binary arithmetic operation ``//`` x.__floordiv__(y) <==> x//y ''' return self._binary_operation(other, '__floordiv__') #--- End: def def __ifloordiv__(self, other): ''' The augmented arithmetic assignment ``//=`` x.__ifloordiv__(y) <==> x//=y ''' return self._binary_operation(other, '__ifloordiv__') #--- End: def def __rfloordiv__(self, other): ''' The binary arithmetic operation ``//`` with reflected operands x.__rfloordiv__(y) <==> y//x ''' return self._binary_operation(other, '__rfloordiv__') #--- End: def def __truediv__(self, other): ''' The binary arithmetic operation ``/`` (true division) x.__truediv__(y) <==> x/y ''' return self._binary_operation(other, '__truediv__') #--- End: def def __itruediv__(self, other): ''' The augmented arithmetic assignment ``/=`` (true division) x.__itruediv__(y) <==> x/=y ''' return self._binary_operation(other, '__itruediv__') #--- End: def def __rtruediv__(self, other): ''' The binary arithmetic operation ``/`` (true division) with reflected operands x.__rtruediv__(y) <==> y/x ''' return self._binary_operation(other, '__rtruediv__') #--- End: def def __pow__(self, other, modulo=None): ''' The binary arithmetic operations ``**`` and ``pow`` x.__pow__(y) <==> x**y ''' if modulo is not None: raise NotImplementedError("3-argument power not supported for '%s'" % self.__class__.__name__) return self._binary_operation(other, '__pow__') #--- End: def def __ipow__(self, other, modulo=None): ''' The augmented arithmetic assignment ``**=`` x.__ipow__(y) <==> x**=y ''' if modulo is not None: raise NotImplementedError("3-argument power not supported for '%s'" % self.__class__.__name__) return self._binary_operation(other, '__ipow__') #--- End: def def __rpow__(self, other, modulo=None): ''' The binary arithmetic operations ``**`` and ``pow`` with reflected operands x.__rpow__(y) <==> y**x ''' if modulo is not None: raise NotImplementedError("3-argument power not supported for %r" % self.__class__.__name__) return self._binary_operation(other, '__rpow__') #--- End: def def __mod__(self, other): ''' The binary arithmetic operation ``%`` x.__mod__(y) <==> x % y ''' return self._binary_operation(other, '__mod__') #--- End: def def __imod__(self, other): ''' The binary arithmetic operation ``%=`` x.__imod__(y) <==> x %= y ''' return self._binary_operation(other, '__imod__') #--- End: def def __rmod__(self, other): ''' The binary arithmetic operation ``%`` with reflected operands x.__rmod__(y) <==> y % x ''' return self._binary_operation(other, '__rmod__') #--- End: def def __eq__(self, other): ''' The rich comparison operator ``==`` x.__eq__(y) <==> x==y ''' return self._binary_operation(other, '__eq__') #--- End: def def __ne__(self, other): ''' The rich comparison operator ``!=`` x.__ne__(y) <==> x!=y ''' return self._binary_operation(other, '__ne__') #--- End: def def __ge__(self, other): ''' The rich comparison operator ``>=`` x.__ge__(y) <==> x>=y ''' return self._binary_operation(other, '__ge__') #--- End: def def __gt__(self, other): ''' The rich comparison operator ``>`` x.__gt__(y) <==> x>y ''' return self._binary_operation(other, '__gt__') #--- End: def def __le__(self, other): ''' The rich comparison operator ``<=`` x.__le__(y) <==> x<=y ''' return self._binary_operation(other, '__le__') #--- End: def def __lt__(self, other): ''' The rich comparison operator ``<`` x.__lt__(y) <==> x x&y ''' return self._binary_operation(other, '__and__') #--- End: def def __iand__(self, other): ''' The augmented bitwise assignment ``&=`` x.__iand__(y) <==> x&=y ''' return self._binary_operation(other, '__iand__') #--- End: def def __rand__(self, other): ''' The binary bitwise operation ``&`` with reflected operands x.__rand__(y) <==> y&x ''' return self._binary_operation(other, '__rand__') #--- End: def def __or__(self, other): ''' The binary bitwise operation ``|`` x.__or__(y) <==> x|y ''' return self._binary_operation(other, '__or__') #--- End: def def __ior__(self, other): ''' The augmented bitwise assignment ``|=`` x.__ior__(y) <==> x|=y ''' return self._binary_operation(other, '__ior__') #--- End: def def __ror__(self, other): ''' The binary bitwise operation ``|`` with reflected operands x.__ror__(y) <==> y|x ''' return self._binary_operation(other, '__ror__') #--- End: def def __xor__(self, other): ''' The binary bitwise operation ``^`` x.__xor__(y) <==> x^y ''' return self._binary_operation(other, '__xor__') #--- End: def def __ixor__(self, other): ''' The augmented bitwise assignment ``^=`` x.__ixor__(y) <==> x^=y ''' return self._binary_operation(other, '__ixor__') #--- End: def def __rxor__(self, other): ''' The binary bitwise operation ``^`` with reflected operands x.__rxor__(y) <==> y^x ''' return self._binary_operation(other, '__rxor__') #--- End: def def __lshift__(self, y): ''' The binary bitwise operation ``<<`` x.__lshift__(y) <==> x< x<<=y ''' return self._binary_operation(y, '__ilshift__') #--- End: def def __rlshift__(self, y): ''' The binary bitwise operation ``<<`` with reflected operands x.__rlshift__(y) <==> y<>`` x.__lshift__(y) <==> x>>y ''' return self._binary_operation(y, '__rshift__') #--- End: def def __irshift__(self, y): ''' The augmented bitwise assignment ``>>=`` x.__irshift__(y) <==> x>>=y ''' return self._binary_operation(y, '__irshift__') #--- End: def def __rrshift__(self, y): ''' The binary bitwise operation ``>>`` with reflected operands x.__rrshift__(y) <==> y>>x ''' return self._binary_operation(y, '__rrshift__') #--- End: def def __abs__(self): ''' The unary arithmetic operation ``abs`` x.__abs__() <==> abs(x) ''' return self._unary_operation('__abs__') #--- End: def def __neg__(self): ''' The unary arithmetic operation ``-`` x.__neg__() <==> -x ''' return self._unary_operation('__neg__') #--- End: def def __invert__(self): ''' The unary bitwise operation ``~`` x.__invert__() <==> ~x ''' return self._unary_operation('__invert__') #--- End: def def __pos__(self): ''' The unary arithmetic operation ``+`` x.__pos__() <==> +x ''' return self._unary_operation('__pos__') #--- End: def def _all_axis_names(self): ''' Return a set of all the dimension names in use by the data array. Note that the output set includes dimensions of individual partitions which are not dimensions of the master data array. :Returns: out: list of str The axis names. :Examples: >>> d._axes ['dim1', 'dim0'] >>> d.partitions.info('_dimensions') [['dim0', 'dim0'], ['dim1', 'dim0', 'dim2']] >>> d._all_axis_names() set(['dim2', dim0', 'dim1']) ''' all_axes = self._all_axes if not all_axes: return self._axes[:] else: return list(all_axes) #--- End: def def _change_axis_names(self, axis_map): ''' Change the axis names. The axis names are arbitrary, so mapping them to another arbitrary collection does not change the data array values, units, nor axis order. :Examples: ''' # Find any axis names which are not mapped. If there are any, # then update axis_map. all_axes = self._all_axes if all_axes: d = set(all_axes).difference(axis_map) if d: axis_map = axis_map.copy() existing_axes = all_axes[:] for axis in d: if axis in axis_map.itervalues(): axis_map[axis] = self._new_axis_identifier(existing_axes) existing_axes.append(axis) else: axis_map[axis] = axis #--- End: for #--- End: if if all([axis0==axis1 for axis0, axis1 in axis_map.iteritems()]): # Return without doing anything if the mapping is null return # Axes self._axes = [axis_map[axis] for axis in self._axes] # All axes if all_axes: self._all_axes = tuple([axis_map[axis] for axis in all_axes]) # Flipped axes flip = self._flip if flip: self._flip = [axis_map[axis] for axis in flip] # HDF chunks chunks = self._HDF_chunks if chunks: self._HDF_chunks = dict([(axis_map[axis], size) for axis, size in chunks.iteritems()]) # Partitions in the partition matrix self.partitions.change_axis_names(axis_map) #--- End: def def _collapse(self, func, fpartial, ffinalise, axes=None, squeeze=False, weights=None, mtol=1, units=None, i=False, **kwargs): ''' Collapse the data array in place. :Parameters: func : function fpartial : function ffinalize : function axes : (sequence of) int, optional The axes to be collapsed. By default flattened input is used. Each axis is identified by its integer position. No axes are collapsed if *axes* is an empty sequence. squeeze : bool, optional If False then the axes which are collapsed are left in the result as axes with size 1. In this case the result will broadcast correctly against the original array. By default collapsed axes are removed. weights : *optional* kwargs : *optional* i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data ''' if i: d = self else: d = self.copy() ndim = d._ndim self_axes = d._axes self_shape = d._shape original_self_axes = self_axes[:] if axes is None: # Collapse all axes axes = range(ndim) n_collapse_axes = ndim n_non_collapse_axes = 0 Nmax = d._size elif not axes and axes != 0: # Collapse no axes return d else: # Collapse some (maybe all) axes axes = d._parse_axes(axes, '_collapse') n_collapse_axes = len(axes) n_non_collapse_axes = ndim - n_collapse_axes Nmax = 1 for i in axes: Nmax *= self_shape[i] #--- End: if #------------------------------------------------------------- # Parse the weights. # # * Change the keys from dimension names to the integer # positions of the dimensions. # # * Make sure all non-null weights are Data objects. # ------------------------------------------------------------ if weights is not None: if not isinstance(weights, dict): # If the shape of the weights is not the same as the # shape of the data array then the weights are assumed # to span the collapse axes in the order in which they # are given if numpy_shape(weights) == self_shape: weights = {tuple(self_axes): weights} else: weights = {tuple([self_axes[i] for i in axes]): weights} else: weights = weights.copy() weights_axes = set() for key, value in weights.items(): del weights[key] key = d._parse_axes(key, 'asdasds12983487') if weights_axes.intersection(key): raise ValueError("Duplicate weights axis") weights_axes.update(key) weights[tuple([self_axes[i] for i in key])] = value #--- End: for if not weights_axes.intersection(axes): # Ignore all of the weights if none of them span # any collapse axes weights = {} #--- End: if for key, weight in weights.items(): if weight is None or numpy_size(weight) == 1: # Ignore undefined weights and size 1 weights del weights[key] continue weight_ndim = numpy_ndim(weight) if weight_ndim != len(key): raise ValueError( "Can't collapse: Incorrect number of weights axes (%d != %d)" % (weight.ndim, len(key))) if weight_ndim > ndim: raise ValueError( "Can't collapse: Incorrect number of weights axes (%d > %d)" % (weight.ndim, ndim)) for n, axis in izip(numpy_shape(weight), key): if n != self_shape[self_axes.index(axis)]: raise ValueError( "Can't collapse: Incorrect weights shape %r" % numpy_shape(weight)) #--- End :for # Convert weight to a data object, if necessary. weight = type(self).asdata(weight) if weight.dtype.char == 'S': # Ignore string-valued weights del weights[key] continue weights[key] = weight #--- End: for #--- End: if if axes != range(n_non_collapse_axes, ndim): transpose_iaxes = [i for i in range(ndim) if i not in axes] + axes d.transpose(transpose_iaxes, i=True) #--- End: if if weights: # Optimize when weights span only non-partitioned axes # (do this before permuting the order of the weight # axes to be consistent with the order of the data # axes) weights = d._collapse_optimize_weights(weights) # Permute the order of the weight axes to be # consistent with the order of the data axes self_axes = d._axes for key, w in weights.items(): key1 = tuple([axis for axis in self_axes if axis in key]) if key1 != key: w = w.transpose([key.index(axis) for axis in key1]) del weights[key] ikey = tuple([self_axes.index(axis) for axis in key1]) weights[ikey] = w #--- End: for # Add the weights to kwargs kwargs['weights'] = weights #--- End: if #------------------------------------------------------------- # Initialise the output data array #------------------------------------------------------------- new = d[(Ellipsis,) + (0,)*n_collapse_axes] # new._auxiliary_mask = None # pending ..... for partition in new.partitions.matrix.flat: del partition.subarray d.to_memory() # save = not new.fits_in_memory(new.dtype.itemsize) keep_in_memory = new.fits_in_memory(new.dtype.itemsize) datatype = d.dtype if units is None: new_units = new.Units else: new_units = units p_axes = new._axes[:n_non_collapse_axes] p_units = new_units c_slice = (slice(None),) * n_collapse_axes for partition in new.partitions.matrix.flat: partition.axes = p_axes partition.flip = [] partition.part = [] partition.Units = p_units if squeeze: partition.location = partition.location[:n_non_collapse_axes] partition.shape = partition.shape[:n_non_collapse_axes] indices = partition.indices[:n_non_collapse_axes] + c_slice partition.subarray = d._collapse_subspace( func, fpartial, ffinalise, indices, n_non_collapse_axes, n_collapse_axes, Nmax, mtol, **kwargs) p_datatype = partition.subarray.dtype if datatype != p_datatype: datatype = numpy_result_type(p_datatype, datatype) partition.close(keep_in_memory=keep_in_memory) #--- End: for new._all_axes = None new._flip = [] new.dtype = datatype new._Units = new_units if squeeze: new._axes = p_axes new._ndim = ndim - n_collapse_axes new._shape = new._shape[:new._ndim] else: new_axes = new._axes if new_axes != original_self_axes: iaxes = [new_axes.index(axis) for axis in original_self_axes] new.transpose(iaxes, i=True) # ------------------------------------------------------------ # Update d in place # ------------------------------------------------------------ d.__dict__ = new.__dict__ # ------------------------------------------------------------ # Return # ------------------------------------------------------------ return d #--- End: def def _collapse_subspace(self, func, fpartial, ffinalise, indices, n_non_collapse_axes, n_collapse_axes, Nmax, mtol, weights=None, **kwargs): ''' Collapse a subspace of a data array. If set, *weights* and *kwargs* are passed to the function call. If there is a *weights* keyword argument then this should either evaluate to False or be a dictionary of weights for at least one of the data dimensions. :Parameters: func : function fpartial : function ffinalise : function indices: tuple The indices of the master array which would create the subspace. n_non_collapse_axes : int The number of data array axes which are not being collapsed. It is assumed that they are in the slowest moving positions. n_collapse_axes : int The number of data array axes which are being collapsed. It is assumed that they are in the fastest moving positions. weights : dict, optional kwargs : *optional* :Returns: out: list :Examples: ''' ndim = self._ndim master_shape = self.shape data = self[indices] # if data._pmndim and data.fits_in_memory(data.dtype.itemsize): # data.varray # True iff at least two, but not all, axes are to be # collapsed. reshape = 1 < n_collapse_axes < ndim out = None if n_collapse_axes == ndim: # All axes are to be collapsed kwargs.pop('axis', None) else: # At least one axis, but not all axes, are to be # collapsed. It is assumed that the collapse axes are in # the last (fastest varying) positions (-1, -2, ...). We # set kwargs['axis']=-1 (actually we use the +ve integer # equivalent of -1) if there is more then one collapse # axis because, in this case (i.e. reshape is True), we # will reshape everything. kwargs['axis'] = ndim - n_collapse_axes masked = False sub_samples = 0 pda_args = data.pda_args(revert_to_file=True) #, readonly=True) for i, partition in enumerate(data.partitions.matrix.flat): array = partition.dataarray(**pda_args) p_masked = partition.masked if p_masked: masked = True if array.mask.all(): # The array is all missing data partition.close() continue # Still here? Then there are some non-missing sub-array # elements. if weights is not None: w = self._collapse_create_weights(array, partition.indices, indices, master_shape, weights, n_non_collapse_axes, n_collapse_axes) wmin = w.min() if wmin < 0: raise ValueError("Can't collapse with negative weights") if wmin == 0: # Mask the array where the weights are zero array = numpy_ma_masked_where(w==0, array, copy=True) if array.mask.all(): # The array is all missing data partition.close() continue #--- End: if kwargs['weights'] = w #--- End: if partition.close() if reshape: # At least two, but not all, axes are to be collapsed # => we need to reshape the array and the weights. shape = array.shape ndim = array.ndim new_shape = shape[:n_non_collapse_axes] new_shape += (reduce(operator_mul, shape[n_non_collapse_axes:]),) array = numpy_reshape(array.copy(), new_shape) if weights is not None: w = kwargs['weights'] if w.ndim < ndim: # The weights span only collapse axes (as # opposed to spanning all axes) new_shape = (w.size,) kwargs['weights'] = numpy_reshape(w, new_shape) #--- End: if p_out = func(array, masked=p_masked, **kwargs) if out is None: if data.partitions.size == i + 1: # There is exactly one partition so we are done out = p_out break out = fpartial(p_out) else: out = fpartial(out, p_out) sub_samples += 1 #--- End: for if out is not None: # Finalise N, out = ffinalise(out, sub_samples) out = self._collapse_mask(out, masked, N, Nmax, mtol) else: # no data - return all masked out = numpy_ma_masked_all(data.shape[:n_non_collapse_axes], data.dtype) return out #--- End: def @staticmethod def _collapse_mask(array, masked, N, Nmax, mtol): ''' :Parameters: array : numpy array masked : bool N : numpy array-like Nmax : int mtol : numpy array-like :Returns: out: numpy array ''' if masked and mtol < 1: x = N < (1-mtol)*Nmax if x.any(): # array = numpy_ma_where(x, numpy_ma_masked, array) array = numpy_ma_masked_where(x, array, copy=False) #--- End: if return array #--- End: def @staticmethod def _collapse_create_weights(array, indices, master_indices, master_shape, master_weights, n_non_collapse_axes, n_collapse_axes): ''' :Parameters: array : numpy array indices : tuple master_indices : tuple master_shape : tuple master_weights : dict n_non_collapse_axes : int The number of array axes which are not being collapsed. It is assumed that they are in the slowest moving positions. n_collapse_axes : int The number of array axes which are being collapsed. It is assumed that they are in the fastest moving positions. :Returns: out: numpy array or None :Examples: ''' array_shape = array.shape array_ndim = array.ndim weights_indices = [] for master_index, index, size in izip(master_indices, indices, master_shape): start , stop , step = master_index.indices(size) size1, mod = divmod(stop-start-1, step) start1, stop1, step1 = index.indices(size1+1) size2, mod = divmod(stop1-start1, step1) if mod != 0: size2 += 1 start += start1 * step step *= step1 stop = start + (size2-1)*step + 1 weights_indices.append(slice(start, stop, step)) #--- End: for base_shape = (1,) * array_ndim masked = False zero_weights = False weights = [] for key, weight in master_weights.iteritems(): shape = list(base_shape) index = [] for i in key: shape[i] = array_shape[i] index.append(weights_indices[i]) #--- End: for weight = weight[tuple(index)].unsafe_array zero_weights = zero_weights or (weight.min() <= 0) masked = masked or numpy_ma_isMA(weight) if weight.ndim != array_ndim: # Make sure that the weight has the same number of # dimensions as the array weight = weight.reshape(shape) weights.append(weight) #--- End: for weights_out = weights[0] if len(weights) > 1: # There are two or more weights, so create their product # (can't do this in-place because of broadcasting woe) for w in weights[1:]: weights_out = weights_out * w weights_out_shape = weights_out.shape if (not masked and weights_out_shape[:n_non_collapse_axes] == base_shape[:n_non_collapse_axes]): # The input weights are not masked and only span collapse axes weights_out = weights_out.reshape(weights_out_shape[n_non_collapse_axes:]) if weights_out_shape[n_non_collapse_axes:] != array_shape[n_non_collapse_axes:]: # The input weights span some, but not all, of the # collapse axes, so broadcast the weights over all # collapse axes weights_out = broadcast_array(weights_out, array_shape[n_non_collapse_axes:]) else: if weights_out_shape != array_shape: # Either a) The input weights span at least one # non-collapse axis, so broadcast the weights over all # axes or b) The weights contain masked values weights_out = broadcast_array(weights_out, array_shape) if masked and numpy_ma_isMA(array): if not (array.mask | weights_out.mask == array.mask).all(): raise ValueError("weights mask is duff") return weights_out #--- End: def def _collapse_optimize_weights(self, weights): ''' Optimise when weights span only non-partitioned axes. weights : dict ''' non_partitioned_axes = set(self._axes).difference(self._pmaxes) x = [] new_key = () for key in weights: if non_partitioned_axes.issuperset(key): x.append(key) new_key += key #--- End: for if len(x) > 1: reshaped_weights = [] for key in x: w = weights.pop(key) w = w.array shape = [(w.shape[key.index(axis)] if axis in key else 1) for axis in new_key] w = w.reshape(shape) reshaped_weights.append(w) #--- End: for # Create their product new_weight = reshaped_weights[0] for w in reshaped_weights[1:]: new_weight = new_weight * w weights[new_key] = type(self)(new_weight) #--- End: if return weights #--- End: def def _new_axis_identifier(self, existing_axes=None): ''' Return an axis name not being used by the data array. The returned axis name will also not be referenced by partitions of the partition matrix. :Parameters: existing_axes : sequence of str, optional :Returns: out: str The new axis name. :Examples: >>> d._all_axis_names() ['dim1', 'dim0'] >>> d._new_axis_identifier() 'dim2' >>> d._all_axis_names() ['dim1', 'dim0', 'dim3'] >>> d._new_axis_identifier() 'dim4' >>> d._all_axis_names() ['dim5', 'dim6', 'dim7'] >>> d._new_axis_identifier() 'dim3' ''' if existing_axes is None: existing_axes = self._all_axis_names() n = len(existing_axes) axis = 'dim%d' % n while axis in existing_axes: n += 1 axis = 'dim%d' % n #--- End: while return axis #--- End: def # ---------------------------------------------------------------- # Attribute # ---------------------------------------------------------------- @property def Units(self): ''' The `cf.Units` object containing the units of the data array. Deleting this attribute is equivalent to setting it to an undefined units object, so this attribute is guaranteed to always exist. :Examples: >>> d.Units = cf.Units('m') >>> d.Units >>> del d.Units >>> d.Units ''' return self._Units #--- End: def @Units.setter def Units(self, value): units = getattr(self, '_Units', _units_None) # print value, 'll', units, 'll' if units and not self._Units.equivalent(value): raise ValueError("Can't set units to non-equivalent units") dtype = self.dtype if dtype is not None: if dtype.kind == 'i': char = dtype.char if char == 'i': old_units = getattr(self, '_Units', None) if old_units is not None and not old_units.equals(value): self.dtype = 'float32' elif char == 'l': old_units = getattr(self, '_Units', None) if old_units is not None and not old_units.equals(value): self.dtype = float #-- End: if self._Units = value #--- End: def @Units.deleter def Units(self): self._Units = _units_None # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def data(self): ''' The data array object as an object identity. :Examples: >>> d.data is d True ''' return self #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def Data(self): ''' The data array object as an object identity. :Examples: >>> d.Data is d True ''' return self #--- End: def # ---------------------------------------------------------------- # Attribute # ---------------------------------------------------------------- @property def dtype(self): ''' The `numpy` data type of the data array. By default this is the data type with the smallest size and smallest scalar kind to which all sub-arrays of the master data array may be safely cast without loss of information. For example, if the sub-arrays have data types 'int64' and 'float32' then the master data array's data type will be 'float64'; or if the sub-arrays have data types 'int64' and 'int32' then the master data array's data type will be 'int64'. Setting the data type to a `numpy.dtype` object, or any object convertible to a `numpy.dtype` object, will cause the master data array elements to be recast to the specified type at the time that they are next accessed, and not before. This does not immediately change the master data array elements, so, for example, reinstating the original data type prior to data access results in no loss of information. Deleting the data type forces the default behaviour. Note that if the data type of any sub-arrays has changed after `dtype` has been set (which could occur if the data array is accessed) then the reinstated default data type may be different to the data type prior to `dtype` being set. :Examples: >>> d = cf.Data([0.5, 1.5, 2.5]) >>> d.dtype dtype(float64') >>> type(d.dtype) >>> d = cf.Data([0.5, 1.5, 2.5]) >>> import numpy >>> d.dtype = numpy.dtype(int) >>> print d.array [0 1 2] >>> d.dtype = bool >>> print d.array [False True True] >>> d.dtype = 'float64' >>> print d.array [ 0. 1. 1.] >>> d = cf.Data([0.5, 1.5, 2.5]) >>> d.dtype = int >>> d.dtype = bool >>> d.dtype = float >>> print d.array [ 0.5 1.5 2.5] ''' datatype = self._dtype if datatype is None: flat = self.partitions.matrix.flat datatype = flat.next().subarray.dtype for partition in flat: datatype = numpy_result_type(datatype, partition.subarray) self._dtype = datatype #--- End: if return datatype #--- End: def @dtype.setter def dtype(self, value): self._dtype = numpy_dtype(value) #--- End: def @dtype.deleter def dtype(self): self._dtype = None #--- End: def # ---------------------------------------------------------------- # Attribute # ---------------------------------------------------------------- @property def fill_value(self): ''' The data array missing data value. If set to None then the default numpy fill value appropriate to the data array's data type will be used. Deleting this attribute is equivalent to setting it to None, so this attribute is guaranteed to always exist. :Examples: >>> d.fill_value = 9999.0 >>> d.fill_value 9999.0 >>> del d.fill_value >>> d.fill_value None ''' return self._fill_value #--- End: def @fill_value.setter def fill_value(self, value): self._fill_value = value @fill_value.deleter def fill_value(self) : self._fill_value = None # ---------------------------------------------------------------- # Attribute # ---------------------------------------------------------------- @property def hardmask(self): ''' Whether the mask is hard (True) or soft (False). When the mask is hard, masked entries of the data array can not be unmasked by assignment, but unmasked entries may still be masked. When the mask is soft, masked entries of the data array may be unmasked by assignment and unmasked entries may be masked. By default, the mask is hard. :Examples: >>> d.hardmask = False >>> d.hardmask False ''' return self._hardmask @hardmask.setter def hardmask(self, value): self._hardmask = value @hardmask.deleter def hardmask(self): raise AttributeError("Won't delete %s attribute 'hardmask'" % self.__class__.__name__) #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def ismasked(self): ''' True if the data array has any masked values. :Examples: >>> d = cf.Data([[1, 2, 3], [4, 5, 6]]) >>> print d.ismasked False >>> d[0, ...] = cf.masked >>> d.ismasked True ''' pda_args = self.pda_args(revert_to_file=True) #, readonly=True) for partition in self.partitions.matrix.flat: array = partition.dataarray(**pda_args) if partition.masked: partition.close() return True partition.close() #--- End: for return False #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def ispartitioned(self): ''' True if the data array is partitioned. :Examples: >>> d._pmsize 1 >>> d.ispartitioned False >>> d._pmsize 2 >>> d.ispartitioned False ''' return self._pmsize > 1 #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def isscalar(self): ''' True if the data array is a 0-d scalar array. :Examples: >>> d.ndim 0 >>> d.isscalar True >>> d.ndim >= 1 True >>> d.isscalar False ''' return not self._ndim #--- End: def # @property # def max(self): # ''' # #The maximum of the array. # #``d.max`` is equivalent to ``d.max()``. # #.. seealso `max`, `min` # #:Examples: # #>>> d = cf.Data([[4, 5, 6], [1, 2, 3]], 'metre') #>>> d.max # #>> d.max.datum() #6 # #''' # return self.max(keepdims=False) # pda_args = self.pda_args(revert_to_file=True, # readonly=True) # # flat = self.partitions.matrix.flat # # partition = flat.next() # array = partition.dataarray(**pda_args) # m = numpy_amax(array) # partition.close() # # for partition in flat: # array = partition.dataarray(**pda_args) # m = max(m, numpy_amax(array)) # partition.close() # #--- End: for # # if m is numpy_ma_masked: # m = numpy_ma_array(0, mask=True, dtype=array.dtype) # # return type(self)(m, self.Units) #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def nbytes(self): ''' Total number of bytes consumed by the elements of the array. Does not include bytes consumed by the array mask :Examples: >>> d = cf.Data([[1, 1.5, 2]]) >>> d.dtype dtype('float64') >>> d.size, d.dtype.itemsize (3, 8) >>> d.nbytes 24 >>> d[0] = cf.masked >>> print d.array [[-- 1.5 2.0]] >>> d.nbytes 24 ''' return self._size * self.dtype.itemsize #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def ndim(self): ''' Number of dimensions in the data array. :Examples: >>> d.shape (73, 96) >>> d.ndim 2 >>> d.shape () >>> d.ndim 0 ''' return self._ndim #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def _pmaxes(self): ''' ''' return self.partitions.axes #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def _pmndim(self): ''' Number of dimensions in the partition matrix. :Examples: >>> d._pmshape (4, 7) >>> d._pmndim 2 >>> d._pmshape () >>> d._pmndim 0 ''' return self.partitions.ndim #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def _pmsize(self): ''' Number of partitions in the partition matrix. :Examples: >>> d._pmshape (4, 7) >>> d._pmsize 28 >>> d._pmndim 0 >>> d._pmsize 1 ''' return self.partitions.size #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def _pmshape(self): ''' Tuple of the partition matrix's dimension sizes. :Examples: >>> d._pmshape (4, 7) >>> d._pmndim 0 >>> d._pmshape () ''' return self.partitions.shape #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def shape(self): ''' Tuple of the data array's dimension sizes. :Examples: >>> d.shape (73, 96) >>> d.ndim 0 >>> d.shape () ''' return self._shape #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def size(self): ''' Number of elements in the data array. :Examples: >>> d.shape (73, 96) >>> d.size 7008 >>> d.shape (1, 1, 1) >>> d.size 1 >>> d.ndim 0 >>> d.shape () >>> d.size 1 ''' return self._size #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def array(self): ''' A numpy array copy the data array. If the data array is stored as date-time objects then a numpy array of numeric reference times will be returned. A numpy array of date-time objects may be returned by the `dtarray` attribute. .. seealso:: `dtarray`, `dtvarray`, `varray` :Examples: >>> a = d.array >>> isinstance(a, numpy.ndarray) True ''' pda_args = self.pda_args(revert_to_file=True) #, update=False) out_data_type = self.dtype units = self.Units # isdt = [] _dtarray = getattr(self, '_dtarray', False) if _dtarray: del self._dtarray # if not self._isdt: out_data_type = _dtype_object # pda_args['func'] = rt2dt # # Turn off data type checking and partition updating # pda_args['dtype'] = None # pda_args['update'] = False elif self._isdatetime(): #isdt: out_data_type = numpy_dtype(float) pda_args['func'] = dt2rt # Turn off data type checking and partition updating pda_args['dtype'] = None pda_args['update'] = False #--- End: if partitions = self.partitions # Still here? array_out = numpy_empty(self._shape, dtype=out_data_type) masked = False if not self.ndim: # -------------------------------------------------------- # array_out is a scalar array so index it with Ellipsis # (as opposed to the empty tuple which would be returned # from partition.indices). This prevents bad behaviour # when p_array is a numpy array of objects (e.g. data-time # objects). # -------------------------------------------------------- partition = partitions.matrix[()] p_array = partition.dataarray(**pda_args) # copy okect? # isdt.append(partition.isdt) if _dtarray: if not partition.isdt: # Convert the partition subarray to an array # of date-time objects p_array = rt2dt(p_array, units) elif partition.isdt: # Convert the partition subarray to an array of # reference time floats p_array = dt2rt(p_array, None, units) if not masked and partition.masked: array_out = array_out.view(numpy_ma_MaskedArray) array_out.set_fill_value(self._fill_value) masked = True array_out[...] = p_array partition.close() else: # -------------------------------------------------------- # array_out is not a scalar array, so it can safely be # indexed with partition.indices in all cases. # -------------------------------------------------------- for partition in partitions.matrix.flat: p_array = partition.dataarray(**pda_args) # isdt.append(partition.isdt) if _dtarray: if not partition.isdt: # Convert the partition subarray to an array # of date-time objects p_array = rt2dt(p_array, units) elif partition.isdt: # Convert the partition subarray to an array of # reference time floats p_array = dt2rt(p_array, None, units) # copy okect? if not masked and partition.masked: array_out = array_out.view(numpy_ma_MaskedArray) array_out.set_fill_value(self._fill_value) masked = True array_out[partition.indices] = p_array partition.close() #--- End: for if masked and self._hardmask: # Harden the mask of the output array array_out.harden_mask() # if isdt and all(isdt): # self.dtype = _dtype_object # self._isdt = True return array_out #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def dtarray(self): ''' An independent numpy array of date-time objects. Only applicable to data arrays with reference time units. If the calendar has not been set then the CF default calendar will be used and the units will be updated accordingly. The data type of the data array is unchanged. .. seealso:: `array`, `asdatetime`, `asreftime`, `dtvarray`, `varray` :Examples: ''' if not self.Units.isreftime: raise ValueError("Can't create date-time array from units %r" % self.Units) self._dtarray = True return self.array #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def dtvarray(self): ''' A numpy array view the data array converted to date-time objects. Only applicable for reference time units. If the calendar has not been set then the CF default calendar will be used and the units will be updated accordingly. .. seealso:: `array`, `asdatetime`, `asreftime`, `dtarray`, `varray` ''' raise NotImplementedError( "cf.Data.dtvarray is dead.") # if not self.Units.isreftime: # raise ValueError("Can't create date-time array with units %r" % # self.Units) # # self._dtarray = True # return self.varray #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def unsafe_array(self): ''' A numpy array of the data array. It is unsafe because it might (or might not) be view to the master data array - you just don't know. So changing the returned array in place might have dire consequences. It is useful because if you are 100% certain that you're not going to change the returned array in place then this method may be much faster than the `array` method. Why not just use the `varray` method? Well, you might not want to destroy the partition matrix. The data type of the array is as returned by the `dtype` attribute. :Examples: >>> a = d.unsafe_array >>> isinstance(a, numpy.ndarray) True ''' # partitions = self.partitions # # if partitions.size == 1: # # If there is only one partition we can speed things up # pda_args = self.pda_args(revert_to_file=True) # partition = partitions.matrix.item() # array_out = partition.dataarray(readonly=True, **pda_args) # partition.close() # return array_out # #--- End: if # # # Still here? return self.array #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def varray(self): ''' A numpy array view the data array. Note that making changes to elements of the returned view changes the underlying data. If the data array is stored as date-time objects then a numpy array view of numeric reference times will be returned. In this case, a numpy array view of date-time objects may be created with the `dtvarray` attribute. .. seealso:: `array`, `dtarray`, `dtvarray` :Examples: >>> a = d.varray >>> type(a) >>> a array([0, 1, 2, 3, 4]) >>> a[0] = 999 >>> d.varray array([999, 1, 2, 3, 4]) ''' pda_args = self.pda_args(keep_in_memory=True) data_type = self.dtype if getattr(self, '_dtarray', False): # isdt = True del self._dtarray # if not self._isdt: # data_type = _dtype_object # pda_args['func'] = rt2dt # # Turn off data type checking and partition updating # pda_args['dtype'] = None elif self._isdatetime(): #self._isdt: # isdt = False data_type = numpy_dtype(float) pda_args['func'] = dt2rt # Turn off data type checking and partition updating pda_args['dtype'] = None # else: # isdt = False if self.partitions.size == 1: # If there is only one partition, then we can return a # view of the partition's data array without having to # create an empty array and then filling it up partition # by partition. partition = self.partitions.matrix.item() array = partition.dataarray(**pda_args) # Note that there is no need to close the partition here. self._dtype = data_type # self._isdt = False #isdt # Flip to []? return array #--- End: if # Still here? # pda_args['dtype'] = None ## WHY????? for speed!!! shape = self._shape array = numpy_empty(shape, dtype=data_type) masked = False for partition in self.partitions.matrix.flat: data = partition.dataarray(readonly=True, **pda_args) if not masked and partition.masked: array = array.view(numpy_ma_MaskedArray) array.set_fill_value(self._fill_value) masked = True array[partition.indices] = data # Note that there is no need to close the partition here #--- End: for if masked: if self._hardmask: # Harden the mask of the output array array.harden_mask() #--- End: if matrix = _xxx.copy() #numpy_empty((), dtype=object) matrix[()] = Partition(subarray = array, location = [(0, n) for n in shape], axes = self._axes, flip = [], shape = list(shape), Units = self.Units, part = [] ) self.partitions = PartitionMatrix(matrix, []) self._dtype = data_type # self._isdt = False #isdt self._flip = [] return array #--- End: def @property def mask(self): ''' The boolean missing data mask of the data array. The boolean mask has True where the data array has missing data and False otherwise. :Examples: >>> d.shape (12, 73, 96) >>> m = d.mask >>> m >>> m.dtype dtype('bool') >>> m.shape (12, 73, 96]) ''' self.to_memory() mask = self.copy() mask_units = _units_None pda_args = mask.pda_args( keep_in_memory=self.fits_in_memory(numpy_dtype(bool).itemsize)) for partition in mask.partitions.matrix.flat: array = partition.dataarray(**pda_args) if partition.masked: # data is a masked array partition.subarray = array.mask.copy() else: # data is not a masked array partition.subarray = numpy_zeros(array.shape, dtype=bool) partition.Units = mask_units partition.close() #--- End: for mask._Units = mask_units mask.dtype = bool mask._hardmask = False return mask #--- End: def @staticmethod def mask_fpe(*arg): ''' Masking of floating-point errors in the results of arithmetic operations. If masking is allowed then only floating-point errors which would otherwise be raised as `FloatingPointError` exceptions are masked. Whether `FloatingPointError` exceptions may be raised is determined by `cf.Data.seterr`. If called without an argument then the current behaviour is returned. Note that if the raising of `FloatingPointError` exceptions has suppressed then invalid values in the results of arithmetic operations may be subsequently converted to masked values with the `mask_invalid` method. .. seealso:: `cf.Data.seterr`, `mask_invalid` :Parameters: arg : bool, optional The new behaviour. True means that `FloatingPointError` exceptions are suppressed and replaced with masked values. False means that `FloatingPointError` exceptions are raised. The default is not to change the current behaviour. :Returns: out: bool The behaviour prior to the change, or the current behaviour if no new value was specified. :Examples: >>> d = cf.Data([0., 1]) >>> e = cf.Data([1., 2]) >>> old = cf.Data.mask_fpe(False) >>> old = cf.Data.seterr('raise') >>> e/d FloatingPointError: divide by zero encountered in divide >>> e**123456 FloatingPointError: overflow encountered in power >>> old = cf.Data.mask_fpe(True) >>> old = cf.Data.seterr('raise') >>> e/d >>> e**123456 >>> old = cf.Data.mask_fpe(True) >>> old = cf.Data.seterr('ignore') >>> e/d >>> e**123456 ''' old = _mask_fpe[0] if arg: _mask_fpe[0] = bool(arg[0]) return old #--- End: def @staticmethod def seterr(all=None, divide=None, over=None, under=None, invalid=None): ''' Set how floating-point errors in the results of arithmetic operations are handled. The options for handling floating-point errors are: ============ ======================================================== Treatment Action ============ ======================================================== ``'ignore'`` Take no action. Allows invalid values to occur in the result data array. ``'warn'`` Print a `RuntimeWarning` (via the Python `warnings` module). Allows invalid values to occur in the result data array. ``'raise'`` Raise a `FloatingPointError` exception. ============ ======================================================== The different types of floating-point errors are: ================= ================================= ================= Error Description Default treatment ================= ================================= ================= Division by zero Infinite result obtained from ``'warn'`` finite numbers. Overflow Result too large to be expressed. ``'warn'`` Invalid operation Result is not an expressible ``'warn'`` number, typically indicates that a NaN was produced. Underflow Result so close to zero that some ``'ignore'`` precision was lost. ================= ================================= ================= Note that operations on integer scalar types (such as int16) are handled like floating point, and are affected by these settings. If called without any arguments then the current behaviour is returned. .. seealso:: `cf.Data.mask_fpe`, `mask_invalid` :Parameters: all : str, optional Set the treatment for all types of floating-point errors at once. The default is not to change the current behaviour. divide : str, optional Set the treatment for division by zero. The default is not to change the current behaviour. over : str, optional Set the treatment for floating-point overflow. The default is not to change the current behaviour. under : str, optional Set the treatment for floating-point underflow. The default is not to change the current behaviour. invalid : str, optional Set the treatment for invalid floating-point operation. The default is not to change the current behaviour. :Returns: out: dict The behaviour prior to the change, or the current behaviour if no new values are specified. :Examples: Set treatment for all types of floating-point errors to ``'raise'`` and then reset to the previous behaviours: >>> cf.Data.seterr() {'divide': 'warn', 'invalid': 'warn', 'over': 'warn', 'under': 'ignore'} >>> old = cf.Data.seterr('raise') >>> cf.Data.seterr(**old) {'divide': 'raise', 'invalid': 'raise', 'over': 'raise', 'under': 'raise'} >>> cf.Data.seterr() {'divide': 'warn', 'invalid': 'warn', 'over': 'warn', 'under': 'ignore'} Set the treatment of division by zero to ``'ignore'`` and overflow to ``'warn'`` without changing the treatment of underflow and invalid operation: >>> cf.Data.seterr(divide='ignore', over='warn') {'divide': 'warn', 'invalid': 'warn', 'over': 'warn', 'under': 'ignore'} >>> cf.Data.seterr() {'divide': 'ignore', 'invalid': 'warn', 'over': 'ignore', 'under': 'ignore'} Some examples with data arrays: >>> d = cf.Data([0., 1]) >>> e = cf.Data([1., 2]) >>> old = cf.Data.seterr('ignore') >>> e/d >>> e**12345 >>> cf.Data.seterr(divide='warn') {'divide': 'ignore', 'invalid': 'ignore', 'over': 'ignore', 'under': 'ignore'} >>> e/d RuntimeWarning: divide by zero encountered in divide >>> e**12345 >>> old = cf.Data.mask_fpe(False) >>> cf.Data.seterr(over='raise') {'divide': 'warn', 'invalid': 'ignore', 'over': 'ignore', 'under': 'ignore'} >>> e/d RuntimeWarning: divide by zero encountered in divide >>> e**12345 FloatingPointError: overflow encountered in power >>> cf.Data.mask_fpe(True) False >>> cf.Data.seterr(divide='ignore') {'divide': 'warn', 'invalid': 'ignore', 'over': 'raise', 'under': 'ignore'} >>> e/d >>> e**12345 ''' old = _seterr.copy() if all: _seterr.update({'divide' : all, 'invalid': all, 'under' : all, 'over' : all}) if all == 'raise': _seterr_raise_to_ignore.update({'divide' : 'ignore', 'invalid': 'ignore', 'under' : 'ignore', 'over' : 'ignore'}) else: if divide: _seterr['divide'] = divide if divide == 'raise': _seterr_raise_to_ignore['divide'] = 'ignore' if over: _seterr['over'] = over if over == 'raise': _seterr_raise_to_ignore['over'] = 'ignore' if under: _seterr['under'] = under if under == 'raise': _seterr_raise_to_ignore['under'] = 'ignore' if invalid: _seterr['invalid'] = invalid if invalid == 'raise': _seterr_raise_to_ignore['invalid'] = 'ignore' #--- End: if return old #--- End: def def add_partitions(self, extra_boundaries, pdim): ''' Add partition boundaries. :Parameters: extra_boundaries : list of int The boundaries of the new partitions. pdim : str The name of the axis to have the new partitions. :Returns: None :Examples: >>> d.add_partitions( ) ''' self.partitions.add_partitions(self._axes, self._flip, extra_boundaries, pdim) #--- End: def def all(self): ''' Test whether all data array elements evaluate to True. Performs a logical ``and`` over the data array and returns the result. Masked values are considered as True during computation. .. seealso:: `allclose`, `any`, `isclose` :Returns: out: bool Whether or not all data array elements evaluate to True. :Examples: >>> d = cf.Data([[1, 3, 2]]) >>> print d.array [[1 3 2]] >>> d.all() True >>> d[0, 2] = cf.masked >>> print d.array [[1 3 --]] >>> d.all() True >>> d[0, 0] = 0 >>> print d.array [[0 3 --]] >>> d.all() False >>> d[...] = cf.masked >>> print d.array [[-- -- --]] >>> d.all() True ''' pda_args = self.pda_args(revert_to_file=True) #, readonly=True) for partition in self.partitions.matrix.flat: array = partition.dataarray(**pda_args) a = array.all() if not a and a is not numpy_ma_masked: partition.close() return False partition.close() #--- End: for return True #--- End: def def allclose(self, y, rtol=None, atol=None): ''' Returns True if two broadcastable arrays have equal values, False otherwise. For numeric data arrays ``d.allclose(y, rtol, atol)`` is equivalent to ``(abs(d - y) <= atol + rtol*abs(y)).all()``, otherwise it is equivalent to ``(d == y).all()``. .. seealso:: `all`, `any`, `isclose` :Parameters: y : data_like atol : float, optional The absolute tolerance for all numerical comparisons, By default the value returned by the `ATOL` function is used. rtol : float, optional The relative tolerance for all numerical comparisons, By default the value returned by the `RTOL` function is used. :Returns: out: bool :Examples: >>> d = cf.Data([1000, 2500], 'metre') >>> e = cf.Data([1, 2.5], 'km') >>> d.allclose(e) True >>> d = cf.Data(['ab', 'cdef']) >>> d.allclose([[['ab', 'cdef']]]) True >>> d.allclose(e) True >>> d = cf.Data([[1000, 2500], [1000, 2500]], 'metre') >>> e = cf.Data([1, 2.5], 'km') >>> d.allclose(e) True >>> d = cf.Data([1, 1, 1], 's') >>> d.allclose(1) True ''' return self.isclose(y, rtol=rtol, atol=atol).all() #--- End: def def any(self): ''' Test whether any data array elements evaluate to True. Performs a logical or over the data array and returns the result. Masked values are considered as False during computation. .. seealso:: `all`, `allclose`, `isclose` :Examples: >>> d = cf.Data([[0 0 0]]) >>> d.any() False >>> d[0, 0] = cf.masked >>> print d.array [[-- 0 0]] >>> d.any() False >>> d[0, 1] = 3 >>> print d.array [[0 3 0]] >>> d.any() True >>> print d.array [[-- -- --]] >>> d.any() False ''' pda_args = self.pda_args(revert_to_file=True) #, readonly=True) for partition in self.partitions.matrix.flat: array = partition.dataarray(**pda_args) if array.any(): partition.close() return True partition.close() #--- End: for return False #--- End: def def max(self, axes=None, squeeze=False, mtol=1, i=False): ''' Collapse axes with their maximum. Missing data array elements are omitted from the calculation. :Parameters: axes : (sequence of) int, optional squeeze : bool, optional i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data The collapsed array. .. seealso:: `min`, `mean`, `mid_range`, `sum`, `sd`, `var` :Examples: ''' # if weights is not None: # raise ValueError("can't weight max: %s" % weights)# return self._collapse(max_f, max_fpartial, max_ffinalise, axes=axes, squeeze=squeeze, mtol=mtol, i=i) #--- End: def def min(self, axes=None, squeeze=False, mtol=1, i=False): ''' Collapse axes with their minimum. Missing data array elements are omitted from the calculation. :Parameters: axes : (sequence of) int, optional squeeze : bool, optional i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data The collapsed array. .. seealso:: `max`, `mean`, `mid_range`, `sum`, `sd`, `var` :Examples: ''' return self._collapse(min_f, min_fpartial, min_ffinalise, axes=axes, squeeze=squeeze, mtol=mtol, i=i) #--- End: def def mean(self, axes=None, squeeze=False, mtol=1, weights=None, i=False): r''' Collapse axes with their weighted mean. The weighted mean, :math:`\mu`, for array elements :math:`x_i` and corresponding weights elements :math:`w_i` is .. math:: \mu=\frac{\sum w_i x_i}{\sum w_i} Missing data array elements and their corresponding weights are omitted from the calculation. :Parameters: axes : (sequence of) int, optional The axes to be collapsed. By default flattened input is used. Each axis is identified by its integer position. No axes are collapsed if *axes* is an empty sequence. squeeze : bool, optional If True then collapsed axes are removed. By default the axes which are collapsed are left in the result as axes with size 1, meaning that the result is guaranteed to broadcast correctly against the original array. weights : data-like or dict, optional Weights associated with values of the array. By default all non-missing elements of the array are assumed to have a weight equal to one. If *weights* is a data-like object then it must have either the same shape as the array or, if that is not the case, the same shape as the axes being collapsed. If *weights* is a dictionary then each key is axes of the array (an int or tuple of ints) with a corresponding data-like value of weights for those axes. In this case, the implied weights array is the outer product of the dictionary's values. Example: If ``weights={1: w, (2, 0): x}`` then ``w`` must contain 1-dimensionsal weights for axis 1 and ``x`` must contain 2-dimensionsal weights for axes 2 and 0. This is equivalent, for example, to ``weights={(1, 2, 0), y}``, where ``y`` is the outer product of ``w`` and ``x``. If ``axes=[1, 2, 0]`` then ``weights={(1, 2, 0), y}`` is equivalent to ``weights=y``. If ``axes=None`` and the array is 3-dimensionsal then ``weights={(1, 2, 0), y}`` is equivalent to ``weights=y.transpose([2, 0, 1])``. mtol : number, optional For each element in the output data array, the fraction of contributing input array elements which is allowed to contain missing data. Where this fraction exceeds *mtol*, missing data is returned. The default is 1, meaning a missing datum in the output array only occurs when its contributing input array elements are all missing data. A value of 0 means that a missing datum in the output array occurs whenever any of its contributing input array elements are missing data. Any intermediate value is permitted. i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data The collapsed array. .. seealso:: `max`, `min`, `mid_range`, `range`, `sum`, `sd`, `var` :Examples: >>> d = cf.Data([[1, 2, 4], [1, 4, 9]], 'm') >>> print d.array [[1 2 4] [1 4 9]] >>> d.mean() >>> d.mean(squeeze=True) >>> d.mean(axes=[0, 1]) >>> d.mean(axes=[1, 0]) >>> print d.mean(axes=0).array [ 1. 3. 6.5] >>> print d.mean(axes=1).array [ 2.33333333 4.66666667] >>> d.mean(axes=1, squeeze=True) [[ 2.33333333] [ 4.66666667]] >>> y = cf.Data([1, 3]) >>> x = cf.Data([1, 2, 1]) >>> w = cf.expand_dims(y, 1) * x >>> print w.array [[1 2 1] [3 6 3]] >>> d.mean(weights=w) >>> d.mean(weights={(0, 1): w}) >>> d.mean(axes=[0, 1], weights={(0, 1): w}) >>> d.mean(axes=[1, 0], weights={(0, 1): w}) >>> d.mean(axes=(0, 1), weights={1: x, 0: y}) >>> d.mean(axes=1, weights=w) >>> d.mean(axes=1, weights=x) >>> d.mean(axes=1, weights={1: x}) >>> d.mean(axes=1, weights={(0, 1): w}) >>> d.mean(axes=1, weights={0: y, (1,): x}) >>> d.mean(axes=1) >>> d.mean(axes=1, weights={0: y}) >>> e = cf.Data(numpy.arange(24).reshape(3, 2, 4)) >>> print e.array [[[ 0 1 2 3] [ 4 5 6 7]] [[ 8 9 10 11] [12 13 14 15]] [[16 17 18 19] [20 21 22 23]]] >>> e.mean(axes=[0, 2]) >>> f = e.mean(axes=[0, 2], squeeze=True) >>> f >>> f.shape (1, 2, 1) >>> print e.mean(axes=[0, 1]).array [ 10. 11. 12. 13.] >>> print e.mean(axes=[0, 1], weights={(1, 0): w}).array [ 11. 12. 13. 14.] >>> e[0, 0] = cf.masked >>> e[-1, -1] = cf.masked >>> e[..., 2] = cf.masked >>> print e.array [[[-- -- -- --] [4 5 -- 7]] [[8 9 -- 11] [12 13 -- 15]] [[16 17 -- 19] [-- -- -- --]]] >>> e.mean() >>> print e.mean(axes=[0, 1]).array [10.0 11.0 -- 13.0] >>> print e.mean(axes=[0, 1], weights={(1, 0): w}).array [9.666666666666666 10.666666666666666 -- 12.666666666666666] ''' return self._collapse(mean_f, mean_fpartial, mean_ffinalise, axes=axes, squeeze=squeeze, weights=weights, mtol=mtol, i=i) #--- End: def def sample_size(self, axes=None, squeeze=False, mtol=1, i=False): r''' :Parameters: i : bool, optional If True then update the data array in place. By default a new data array is created. ''' return self._collapse(sample_size_f, sample_size_fpartial, sample_size_ffinalise, axes=axes, squeeze=squeeze, weights=None, mtol=mtol, units=Units('1'), i=i) #--- End: def @property def binary_mask(self): '''A binary (0 and 1) mask of the data array. The binary mask's data array comprises dimensionless 8-bit integers and has 0 where the data array has missing data and 1 otherwise. .. seealos:: `mask` :Returns: out: Data The binary mask. :Examples: >>> print d.mask.array [[ True False True False]] >>> b = d.binary_mask.array >>> print b [[0 1 0 1]] ''' self.to_memory() binary_mask = self.copy() pda_args = binary_mask.pda_args( keep_in_memory=self.fits_in_memory(numpy_dtype('int32').itemsize), dtype=None) _units_1 = _units_1 for partition in binary_mask.partitions.matrix.flat: array = partition.dataarray(**pda_args) if partition.masked: # data is masked partition.subarray = numpy_array(~array.mask, dtype='int32') else: # data is not masked partition.subarray = numpy_ones(array.shape, dtype='int32') partition.Units = _units_1 partition.close() #--- End: for binary_mask.Units = _units_1 return binary_mask #--- End: def def clip(self, a_min, a_max, units=None, i=False): ''' Clip (limit) the values in the data array in place. Given an interval, values outside the interval are clipped to the interval edges. For example, if an interval of [0, 1] is specified then values smaller than 0 become 0 and values larger than 1 become 1. Parameters : a_min : scalar a_max : scalar units : str or Units i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data :Examples: ''' if i: d = self else: d = self.copy() if units is not None: # Convert the limits to the same units as the data array units = Units(units) self_units = d.Units if self_units != units: a_min = Units.conform(a_min, units, self_units) a_max = Units.conform(a_max, units, self_units) #--- End: if pda_args = d.pda_args() for partition in d.partitions.matrix.flat: array = partition.dataarray(**pda_args) array.clip(a_min, a_max, out=array) partition.close() #--- End: if return d #--- End: def @classmethod def asdata(cls, d, copy=False): '''Convert the input to a `cf.Data` object. :Parameters: d : data-like Input data in any form that can be converted to an cf.Data object. This includes `cf.Data` and `cf.Field` objects, numpy arrays and any object which may be converted to a numpy array. :Returns: out: cf.Data cf.Data interpretation of *d*. No copy is performed on the input. :Examples: >>> d = cf.Data([1, 2]) >>> cf.Data.asdata(d) is d True >>> d.asdata(d) is d True >>> cf.Data.asdata([1, 2]) >>> cf.Data.asdata(numpy.array([1, 2])) ''' data = getattr(d, '__data__', None) if data is None: return cls(d) data = data() if copy: return data.copy() else: return data #--- End: def def close(self): ''' Close all files referenced by the data array. Note that a closed file will be automatically reopened if its contents are subsequently required. :Returns: None :Examples: >>> d.close() ''' for partition in self.partitions.matrix.flat: partition.file_close() #--- End: def def copy(self): ''' Return a deep copy. ``d.copy()`` is equivalent to ``copy.deepcopy(d)``. :Returns: out: The deep copy. :Examples: >>> e = d.copy() ''' new = Data.__new__(Data) ###dch change new.__dict__ = self.__dict__.copy() new.partitions = self.partitions.copy() return new #--- End: def def cos(self, i=False): ''' Take the trigonometric cosine of the data array in place. Units are accounted for in the calculation. If the units are not equivalent to radians (such as Kelvin) then they are treated as if they were radians. For example, the the cosine of 90 degrees_east is 0.0, as is the sine of 1.57079632 kg m-2. The Units are changed to '1' (nondimensionsal). :Parameters: i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data :Examples: >>> d.Units >>> print d.array [[-90 0 90 --]] >>> d.cos() >>> d.Units >>> print d.array [[0.0 1.0 0.0 --]] >>> d.Units >>> print d.array [[1 2 3 --]] >>> d.cos() >>> d.Units >>> print d.array [[0.540302305868 -0.416146836547 -0.9899924966 --]] ''' if i: d = self else: d = self.copy() if d.Units.equivalent(_units_radians): d.Units = _units_radians return d.func(numpy_cos, units=_units_1, i=True) #--- End: def def count(self): '''Count the non-masked elements of the array !!!!!! along the given axis. :Returns: out: int :Examples: ''' pda_args = self.pda_args(revert_to_file=True) # , keep_in_memory=False) n = 0 for partition in self.partitions.matrix.flat: array = partition.dataarray(**pda_args) n += numpy_ma_count(array) # not this # partition.output = numpy_ma_count(array) # but this! or return n? partition.close() #--- End: for #if not parallel: # for p in parations: # _worker(p) # if ?? : break #else: # # return n #--- End: def def count_masked(self): ''' ''' return self._size - self.count() #--- End: def def cyclic(self, axes=None, iscyclic=True): ''' :Parameters: :Returns: out: set :Examples: ''' cyclic_axes = self._cyclic data_axes = self._axes old = set([data_axes.index(axis) for axis in cyclic_axes]) if axes is None: return old axes = [data_axes[i] for i in self._parse_axes(axes, 'cyclic')] if iscyclic: self._cyclic = cyclic_axes.union(axes) else: self._cyclic = cyclic_axes.difference(axes) return old #--- End: def def asreftime(self, i=False): ''' Change the internal representation of data array elements from datatime-like objects to numeric reference times. If the calendar has not been set then the default CF calendar will be used and the units' and the `calendar` attribute will be updated accordingly. If the internal representations are already numeric reference times then no change occurs. .. seealso:: `asdatetime` :Parameters: i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data :Examples: >>> d.asreftime() ''' raise NotImplementedError("cf.Data.asreftime is dead. Consider {0}.array instead".format(self.__class__.__name__)) # if i: # d = self # else: # d = self.copy() # # units = d.Units # # if not d._isdt: # if units.isreftime: # return d # else: # raise ValueError( # "Can't convert %r data to numeric reference times" % # units) # #--- End: if # # pda_args = d.pda_args(func=dt2rt, dtype=None) # # for partition in d.partitions.matrix.flat: # array = partition.dataarray(**pda_args) # p_units = partition.Units # partition.Units = Units(p_units.units, p_units._utime.calendar) # partition.close() # #--- End: for # # d.Units = Units(units.units, units._utime.calendar) # # d._dtype = array.dtype # d._isdt = False # # return d # #--- End: def def asdatetime(self, i=False): ''' Change the internal representation of data array elements from numeric reference times to datatime-like objects. If the calendar has not been set then the default CF calendar will be used and the units' and the `calendar` attribute will be updated accordingly. If the internal representations are already datatime-like objects then no change occurs. .. seealso:: `asreftime` :Parameters: i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data :Examples: >>> f.asdatetime() ''' raise NotImplementedError("cf.Data.asdatetime is dead. Consider {0}.dtarray instead".format(self.__class__.__name__)) # if i: # d = self # else: # d = self.copy() # # units = self.Units # # if d._isdt: # return d # elif not units.isreftime: # raise ValueError( #"Can't convert {0!r} data to date-time objects".format(units)) # # pda_args = d.pda_args(func=rt2dt, dtype=None) # # for partition in d.partitions.matrix.flat: # array = partition.dataarray(**pda_args) # p_units = partition.Units # partition.Units = Units(p_units.units, p_units._utime.calendar) # partition.close() # #--- End: for # # d.Units = Units(units.units, units._utime.calendar) # # d._dtype = array.dtype # d._isdt = True # # return d # #--- End: def def _YMDhms(self, attr): ''' ''' def func(array, units_in, dummy0, dummy1): ''' The returned array is always independent. :Parameters: array : numpy array units_in : cf.Units dummy0 : Ignored. dummy1 : Ignored. :Returns: out: numpy array ''' # if not self._isdt: if not self._isdatetime(): array = rt2dt(array, units_in) return _array_getattr(array, attr) #--- End: def if not self.Units.isreftime: raise ValueError( "Can't get %ss from data with %r" % (attr, self.Units)) new = self.copy() new._Units = _units_None pda_args = new.pda_args(func=func, dtype=None) for partition in new.partitions.matrix.flat: array = partition.dataarray(**pda_args) new_dtype = array.dtype partition.close() #--- End: for new._dtype = new_dtype # new._isdt = False return new #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def year(self): ''' The year of each data array element. Only applicable for reference time units. .. seealso:: `~cf.Data.month`, `~cf.Data.day`, `~cf.Data.hour`, `~cf.Data.minute`, `~cf.Data.second` :Examples: >>> d = cf.Data([[1.93, 5.17]], 'days since 2000-12-29') >>> d >>> d.year ''' return self._YMDhms('year') #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def month(self): ''' The month of each data array element. Only applicable for reference time units. .. seealso:: `~cf.Data.year`, `~cf.Data.day`, `~cf.Data.hour`, `~cf.Data.minute`, `~cf.Data.second` :Examples: >>> d = cf.Data([[1.93, 5.17]], 'days since 2000-12-29') >>> d >>> d.month ''' return self._YMDhms('month') #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def day(self): ''' The day of each data array element. Only applicable for reference time units. .. seealso:: `~cf.Data.year`, `~cf.Data.month`, `~cf.Data.hour`, `~cf.Data.minute`, `~cf.Data.second` :Examples: >>> d = cf.Data([[1.93, 5.17]], 'days since 2000-12-29') >>> d >>> d.day ''' return self._YMDhms('day') #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def hour(self): ''' The hour of each data array element. Only applicable for reference time units. .. seealso:: `~cf.Data.year`, `~cf.Data.month`, `~cf.Data.day`, `~cf.Data.minute`, `~cf.Data.second` :Examples: >>> d = cf.Data([[1.93, 5.17]], 'days since 2000-12-29') >>> d >>> d.hour ''' return self._YMDhms('hour') #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def minute(self): ''' The minute of each data array element. Only applicable for reference time units. .. seealso:: `~cf.Data.year`, `~cf.Data.month`, `~cf.Data.day`, `~cf.Data.hour`, `~cf.Data.second` :Examples: >>> d = cf.Data([[1.93, 5.17]], 'days since 2000-12-29') >>> d >>> d.minute ''' return self._YMDhms('minute') #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def second(self): ''' The second of each data array element. Only applicable for reference time units. .. seealso:: `~cf.Data.year`, `~cf.Data.month`, `~cf.Data.day`, `~cf.Data.hour`, `~cf.Data.minute` >>> d = cf.Data([[1.93, 5.17]], 'days since 2000-12-29') >>> d >>> d.second ''' return self._YMDhms('second') #--- End: def def unique(self): ''' The unique elements of the array. Returns a new object with the sorted unique elements in a one dimensional array. :Examples: >>> d = cf.Data([[4, 2, 1], [1, 2, 3]], 'metre') >>> d.unique() >>> d[1, -1] = cf.masked >>> d.unique() ''' pda_args = self.pda_args(revert_to_file=True) #, readonly=True) u = [] for partition in self.partitions.matrix.flat: array = partition.dataarray(**pda_args) array = numpy_unique(array) if partition.masked: # Note that compressing a masked array may result in # an array with zero size array = array.compressed() size = array.size if size > 1: u.extend(array) elif size == 1: u.append(array.item()) partition.close() #--- End: for u = numpy_unique(numpy_array(u, dtype=self.dtype)) return type(self)(u, units=self.Units) #, dt=self._isdt) #--- End: def def dump(self, display=True, prefix=None): ''' Return a string containing a full description of the instance. :Parameters: display : bool, optional If False then return the description as a string. By default the description is printed, i.e. ``d.dump()`` is equivalent to ``print d.dump(display=False)``. prefix : str, optional Set the common prefix of component names. By default the instance's class name is used. :Returns: out: None or str A string containing the description. :Examples: ''' if prefix is None: prefix = self.__class__.__name__ string = ['%s.shape = %s' % (prefix, self._shape)] if self._size == 1: string.append('%s.first_datum = %s' % (prefix, self.datum(0))) else: string.append('%s.first_datum = %s' % (prefix, self.datum(0))) string.append('%s.last_datum = %s' % (prefix, self.datum(-1))) #-- End: if for attr in ('fill_Value', 'Units'): string.append('%s.%s = %r' % (prefix, attr, getattr(self, attr))) #--- End: for string = '\n'.join(string) if display: print string else: return string #--- End: def # def equivalent(self, other, rtol=None, atol=None, traceback=False, # copy=True): # ''' # #True if and only if two data arrays are logically equivalent. # #Equivalence is defined as both data arrays being the same after #accounting for different but equivalent units.* units # #:Parameters: # # other : Data # # atol : float, optional # The absolute tolerance for all numerical comparisons, By # default the value returned by the `ATOL` function is used. # # rtol : float, optional # The relative tolerance for all numerical comparisons, By # default the value returned by the `RTOL` function is used. # #:Returns: # # out: bool # Whether or not the two variables are equivalent. # #''' # if self._shape != other._shape: # # add traceback # return # # if not self.Units.equivalent(other.Units): # # add traceback # return # ## if axis_map: ## axes = [axis_map[axis] for axis in self._axes] ## if axes == other._axes: ## axis_map = None ## ## if not axis_map and self._shape != other._shape: ## # add traceback ## return ## # self_Units = self.Units ## self_fill_value = self._fill_value ## if self_Units == other.Units and self_fill_value == other._fill_value: ## copy = False # # if self_Units != other.Units: # if copy: # other = other.copy() # copy = False # other.Units = self_Units # # ## if copy: ## other = other.copy() ## ## if axis_map: ## other.transpose(axes) ## ## other.Units = self_Units ## other._fill_value = self_fill_value # # return self.equals(other, rtol=rtol, atol=atol, ignore_fill_value=True, # traceback=False) # #--- End: def def ndindex(self): ''' Return an iterator over the N-dimensional indices of the data array. At each iteration a tuple of indices is returned, the last dimension is iterated over first. :Returns: out: itertools.product An iterator over tuples of indices of the data array. :Examples: >>> d.shape (2, 1, 3) >>> for i in d.ndindex(): ... print i ... (0, 0, 0) (0, 0, 1) (0, 0, 2) (1, 0, 0) (1, 0, 1) (1, 0, 2) > d.shape () >>> for i in d.ndindex(): ... print i ... () ''' return itertools_product(*[xrange(0, r) for r in self._shape]) #--- End: def def equals(self, other, rtol=None, atol=None, ignore_fill_value=False, traceback=False): ''' True if two data arrays are logically equal, False otherwise. :Parameters: other : The object to compare for equality. atol : float, optional The absolute tolerance for all numerical comparisons, By default the value returned by the `ATOL` function is used. rtol : float, optional The relative tolerance for all numerical comparisons, By default the value returned by the `RTOL` function is used. ignore_fill_value : bool, optional If True then data arrays with different fill values are considered equal. By default they are considered unequal. traceback : bool, optional If True then print a traceback highlighting where the two instances differ. :Returns: out: bool Whether or not the two instances are equal. :Examples: >>> d.equals(d) True >>> d.equals(d + 1) False ''' # Check each instance's id if self is other: return True # Check that each instance is the same type if self.__class__ != other.__class__: if traceback: print("%s: Different type: %s" % (self.__class__.__name__, other.__class__.__name__)) return False # Check that each instance has the same shape if self._shape != other._shape: if traceback: print("%s: Different shape: %s, %s" % (self.__class__.__name__, self._shape, other._shape)) return False #--- End: if # Check that each instance has the same units self_Units = self.Units other_Units = other.Units if self_Units != other_Units: if traceback: print("%s: Different Units (%r, %r)" % (self.__class__.__name__, self.Units, other.Units)) return False #--- End: if # Check that each instance has the same fill value if not ignore_fill_value and self._fill_value != other._fill_value: if traceback: print("%s: Different fill values (%s, %s)" % (self.__class__.__name__, self._fill_value, other._fill_value)) return False #--- End: if # ------------------------------------------------------------ # Check that each instance has equal array values # ------------------------------------------------------------ # Set default tolerances if rtol is None: rtol = RTOL() if atol is None: atol = ATOL() pda_args = self.pda_args(revert_to_file=True) #, readonly=True) other.to_memory() # if self_Units.isreftime: # self.asreftime(i=True) # # if other_Units.isreftime: # other.asreftime(i=True) for partition in self.partitions.matrix.flat: array0 = partition.dataarray(**pda_args) array1 = other[partition.indices].varray partition.close() if not _numpy_allclose(array0, array1, rtol=rtol, atol=atol): if traceback: print("%s: Different data array values" % self.__class__.__name__) return False #--- End: for # ------------------------------------------------------------ # Still here? Then the two instances are equal. # ------------------------------------------------------------ return True #--- End: def def exp(self, i=False): ''' Take the exponential of the data array. :Parameters: i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data :Examples: ''' units = self.Units if units and not units.isdimensionless: raise ValueError( "Can't take exponential of dimensional quantities: {0!r}".format(units)) if i: d = self else: d = self.copy() if d.Units: d.Units = _units_1 return d.func(numpy_exp, i=True) #--- End: def def expand_dims(self, position=0, i=False): ''' Expand the shape of the data array in place. Insert a new size 1 axis, corresponding to a given position in the data array shape. .. seealso:: `flip`, `squeeze`, `swapaxes`, `transpose` :Parameters: position : int, optional Specify the position that the new axis will have in the data array axes. By default the new axis has position 0, the slowest varying position. i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data :Examples: ''' # Parse position ndim = self._ndim if -ndim-1 <= position < 0: position += ndim + 1 elif not 0 <= position <= ndim: raise ValueError( "Can't expand_dims: Invalid position (%d)" % position) #--- End: for if i: d = self else: d = self.copy() # Expand _axes axis = d._new_axis_identifier() data_axes = d._axes[:] data_axes.insert(position, axis) d._axes = data_axes # Increment ndim and expand shape d._ndim += 1 shape = list(d._shape) shape.insert(position, 1) d._shape = tuple(shape) # Expand the location and shape of each partition location = (0, 1) for partition in d.partitions.matrix.flat: partition.location = partition.location[:] partition.shape = partition.shape[:] partition.location.insert(position, location) partition.shape.insert(position, 1) #--- End: for if d._all_axes: d._all_axes += (axis,) return d #--- End: def def files(self): ''' Return the names of files containing parts of the data array. :Returns: out: set The file names in normalized, absolute form. :Examples: >>> f = cf.read('../file*') >>> f[0].files() {'/data/user/file1', '/data/user/file2', '/data/user/file3'} >>> a = f[0].array >>> f[0].files() set() ''' return set([p.subarray.file for p in self.partitions.matrix.flat if p.in_file]) #--- End: def def flat(self, ignore_masked=True): ''' Return a flat iterator over elements of the data array. :Parameters: ignore_masked : bool, optional If False then masked and unmasked elements will be returned. By default only unmasked elements are returned :Returns: out: generator An iterator over elements of the data array. :Examples: >>> print d.array [[1 -- 3]] >>> for x in d.flat(): ... print x ... 1 3 >>> for x in d.flat(False): ... print x ... 1 -- 3 ''' self.to_memory() mask = self.mask if ignore_masked: for index in self.ndindex(): if not mask[index]: yield self[index].unsafe_array.item() else: for index in self.ndindex(): if not mask[index]: yield self[index].unsafe_array.item() else: yield cf_masked #--- End: def def floor(self, i=False): ''' Return the floor of the data array. .. versionadded:: 1.0 .. seealso:: `ceil`, `rint`, `trunc` :Parameters: i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data :Examples: >>> print d.array [-1.9 -1.5 -1.1 -1. 0. 1. 1.1 1.5 1.9] >>> print d.floor().array [-2. -2. -2. -1. 0. 1. 1. 1. 1.] ''' return self.func(numpy_floor, out=True, i=i) #---End: def def outerproduct(self, e, i=False): ''' Compute the outer product with another data array. The axes of result will be the combined axes of the two input arrays: >>> d.outerproduct(e).ndim == d.ndim + e.ndim True >>> d.outerproduct(e).shape == d.shape + e.shape True :Parameters: e : data-like The data array with which to form the outer product. i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data :Examples: >>> d = cf.Data([1, 2, 3], 'metre') >>> o = d.outerproduct([4, 5, 6, 7]) >>> o >>> print o.array [[ 4 5 6 7] [ 8 10 12 14] [12 15 18 21]] >>> e = cf.Data([[4, 5, 6, 7], [6, 7, 8, 9]], 's-1') >>> o = d.outerproduct(e) >>> o >>> print d.shape, e.shape, o.shape (3,) (2, 4) (3, 2, 4) >>> print o.array [[[ 4 5 6 7] [ 6 7 8 9]] [[ 8 10 12 14] [12 14 16 18]] [[12 15 18 21] [18 21 24 27]]] ''' e_ndim = numpy_ndim(e) if e_ndim: d = self.copy() for j in range(e_ndim): d.expand_dims(-1, i=True) else: d = self d = d*e if i: # Update self in place self.__dict__ = d.__dict__ return d #--- End: def def change_calendar(self, calendar, i=False): '''Change the calendar of the data array elements. Changing the calendar could result in a change of reference time data array values. Not to be confused with using the `override_calendar` method or resetting `d.Units`. `override_calendar` is different because the new calendar need not be equivalent to the original ones and the data array elements will not be changed to reflect the new units. Resetting `d.Units` will ''' if not self.Units.isreftime: raise ValueError( "Can't change calendar of non-reference time units: {0!r}".format(self.Units)) if i: d = self else: d = self.copy() d._asdatetime(i=True) d.override_units(Units(self.Units.units, calendar), i=True) d._asreftime(i=True) #--- End: def def override_units(self, units, i=False): ''' Override the data array units. Not to be confused with setting the `Units` attribute to units which are equivalent to the original units. This is different because in this case the new units need not be equivalent to the original ones and the data array elements will not be changed to reflect the new units. :Parameters: units: `str` or `cf.Units` The new units for the data array. i: `bool`, optional If True then update the data array in place. By default a new data array is created. :Returns: out: `cf.Data` :Examples: >>> d = cf.Data(1012.0, 'hPa') >>> d.override_units('km') >>> d.Units >>> d.datum(0) 1012.0 >>> d.override_units(cf.Units('watts')) >>> d.Units >>> d.datum(0) 1012.0 ''' if i: d = self else: d = self.copy() units = Units(units) pda_args = d.pda_args() for partition in d.partitions.matrix.flat: p_units = partition.Units if not p_units or p_units == units: # No need to create the data array if the sub-array # units are the same as the master data array units or # the partition units are not set partition.Units = units continue #--- End: if partition.dataarray(**pda_args) partition.Units = units partition.close() #--- End: for d._Units = units return d #--- End: def def override_calendar(self, calendar, i=False): '''Override the calendar of the data array elements. Not to be confused with using the `change_calendar` method or setting the `d.Units.calendar`. `override_calendar` is different because the new calendar need not be equivalent to the original ones and the data array elements will not be changed to reflect the new units. :Parameters: calendar : str The new calendar. i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data :Examples: ''' if not self.Units.isreftime: raise ValueError( "Can't override the calender of non-reference-time units: {0!r}".format( self.Units)) if i: d = self else: d = self.copy() for partition in d.partitions.matrix.flat: partition.Units = Units(partition.Units._units, calendar) partition.close() #--- End: for d.Units = Units(d.Units._units, calendar) return d #--- End: def def to_disk(self): ''' Store the data array on disk in place. There is no change to partition's whose sub-arrays are already on disk. :Returns: None :Examples: >>> d.to_disk() ''' pda_args = self.pda_args(keep_in_memory=False) for partition in self.partitions.matrix.flat: if partition.in_memory: partition.dataarray(**pda_args) partition.close() #--- End: def def to_memory(self, regardless=False): ''' Store each partition's data in memory in place if the master array is smaller than the chunk size. There is no change to partitions with data that are already in memory. :Parameters: regardless : bool, optional If True then store all partitions' data in memory regardless of the size of the master array. By default only store all partitions' data in memory if the master array is smaller than the chunk size. :Returns: None :Examples: >>> d.to_memory() >>> d.to_memory(regardless=True) ''' if self.fits_in_memory(self.dtype.itemsize) or regardless: pda_args = self.pda_args(keep_in_memory=True) for partition in self.partitions.matrix.flat: if partition.on_disk: partition.dataarray(**pda_args) partition.close() #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def in_memory(self): ''' :Returns: :Examples: >>> d.in_memory ''' for partition in self.partitions.matrix.flat: if not partition.in_memory: return False #--- End: for return True #--- End: def def pda_args(self, keep_in_memory=None, **kwargs): ''' Return a dictionary of arguments for the `cf.Partition.dataarray` method. The values are inferred from the state of the Data object and any keyword arguments. :Parameters: :Returns: out: dict :Examples: ''' dtype = self.dtype pda_args = {'axes' : self._axes, 'flip' : self._flip, 'units' : self.Units, 'hardmask': self._hardmask, 'dtype' : dtype} if keep_in_memory is None: keep_in_memory = self.fits_in_memory(dtype.itemsize) pda_args['keep_in_memory'] = keep_in_memory if kwargs: pda_args.update(kwargs) return pda_args #--- End: def def partition_boundaries(self): ''' Return the partition boundaries for each partition matrix dimension. :Returns: out: dict :Examples: ''' return self.partitions.partition_boundaries(self._axes) #--- End: def def datum(self, *index): ''' Return an element of the data array as a standard Python scalar. The first and last elements are always returned with ``d.datum(0)`` and ``d.datum(-1)`` respectively, even if the data array is a scalar array or has two or more dimensions. The returned object is of the same type as is stored internally. .. seealso:: `array`, `dtarray` :Parameters: index : *optional* Specify which element to return. When no positional arguments are provided, the method only works for data arrays with one element (but any number of dimensions), and the single element is returned. If positional arguments are given then they must be one of the following: * An integer. This argument is interpreted as a flat index into the array, specifying which element to copy and return. Example: If the data aray shape is ``(2, 3, 6)`` then: * ``d.datum(0)`` is equivalent to ``d.datum(0, 0, 0)``. * ``d.datum(-1)`` is equivalent to ``d.datum(1, 2, 5)``. * ``d.datum(16)`` is equivalent to ``d.datum(0, 2, 4)``. If *index* is ``0`` or ``-1`` then the first or last data array element respecitively will be returned, even if the data array is a scalar array. .. * Two or more integers. These arguments are interpreted as a multidimensionsal index to the array. There must be the same number of integers as data array dimensions. .. * A tuple of integers. This argument is interpreted as a multidimensionsal index to the array. There must be the same number of integers as data array dimensions. Example: ``d.datum((0, 2, 4))`` is equivalent to ``d.datum(0, 2, 4)``; and ``d.datum(())`` is equivalent to ``d.datum()``. :Returns: out : A copy of the specified element of the array as a suitable Python scalar. :Examples: >>> d = cf.Data(2) >>> d.datum() 2 >>> 2 == d.datum(0) == d.datum(-1) == d.datum(()) True >>> d = cf.Data([[2]]) >>> 2 == d.datum() == d.datum(0) == d.datum(-1) True >>> 2 == d.datum(0, 0) == d.datum((-1, -1)) == d.datum(-1, 0) True >>> d = cf.Data([[4, 5, 6], [1, 2, 3]], 'metre') >>> d[0, 1] = cf.masked >>> print d [[4 -- 6] [1 2 3]] >>> d.datum(0) 4 >>> d.datum(-1) 3 >>> d.datum(1) masked >>> d.datum(4) 2 >>> d.datum(-2) 2 >>> d.datum(0, 0) 4 >>> d.datum(-2, -1) 6 >>> d.datum(1, 2) 3 >>> d.datum((0, 2)) 6 ''' if index: n_index = len(index) if n_index == 1: index = index[0] if index == 0: # This also works for scalar arrays index = (slice(0, 1),) * self._ndim elif index == -1: # This also works for scalar arrays index = (slice(-1, None),) * self._ndim elif isinstance(index, (int, long)): if index < 0: index += self._size index = numpy_unravel_index(index, self._shape) elif len(index) != self._ndim: raise ValueError( "Incorrect number of indices for %s array" % self.__class__.__name__) #--- End: if elif n_index != self._ndim: raise ValueError( "Incorrect number of indices for %s array" % self.__class__.__name__) # if self._isdt: # array = self[index].dtarray # else: array = self[index].array elif self._size == 1: # if self._isdt: # array = self.dtarray # else: array = self.array else: raise ValueError( "Can only convert a %s array of size 1 to a Python scalar" % self.__class__.__name__) if not numpy_ma_isMA(array): return array.item() mask = array.mask if mask is numpy_ma_nomask or not mask.item(): return array.item() return cf_masked #--- End: def def mask_invalid(self, i=False): '''Mask the array where invalid values occur (NaN or inf). Note that: * Invalid values in the results of arithmetic operations may only occur if the raising of `FloatingPointError` exceptions has been suppressed by `cf.Data.seterr`. * If the raising of `FloatingPointError` exceptions has been allowed then invalid values in the results of arithmetic operations it is possible for them to be automatically converted to masked values, depending on the setting of `cf.Data.mask_fpe`. In this case, such automatic conversion might be faster than calling `mask_invalid`. .. seealso:: `cf.Data.mask_fpe`, `cf.Data.seterr` :Parameters: i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data :Examples 2: >>> d = cf.Data([0., 1]) >>> e = cf.Data([1., 2]) >>> old = cf.Data.seterr('ignore') >>> f = e/d >>> f >>> f.mask_invalid() >>> f=e**12345 >>> f >>> f.mask_invalid() >>> old = cf.Data.seterr('raise') >>> old = cf.Data.mask_fpe(True) >>> e/d >>> e**12345 ''' if i: d = self else: d = self.copy() pda_args = d.pda_args() for partition in d.partitions.matrix.flat: array = partition.dataarray(**pda_args) array = numpy_ma_masked_invalid(array, copy=False) array.shrink_mask() if array.mask is numpy_ma_nomask: array = array.data partition.subarray = array partition.close() #--- End: for return d #--- End: def def mid_range(self, axes=None, squeeze=True, mtol=1, i=False): ''' Collapse axes with the unweighted average of their maximum and minimum values. Missing data array elements are omitted from the calculation. .. seealso:: `max`, `min`, `mean`, `range`, `sum`, `sd`, `var` :Parameters: axes : (sequence of) int, optional squeeze : bool, optional i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data The collapsed array. :Examples: ''' return self._collapse(mid_range_f, mid_range_fpartial, mid_range_ffinalise, axes=axes, squeeze=squeeze, mtol=mtol, i=i) #--- End: def def flip(self, axes=None, i=False): ''' Flip (reverse the direction of) axes of the data array in place. .. seealso:: `expand_dims`, `squeeze`, `swapaxes`, `transpose` :Parameters: axes : (sequence of) int Select the axes. By default all axes are flipped. Each axis is identified by its integer position. No axes are flipped if *axes* is an empty sequence. i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data :Examples: >>> d.flip() >>> d.flip(1) >>> d.flip([0, 1]) >>> d.flip([]) >>> e = d[::-1, :, ::-1] >>> d.flip((2, 0)).equals(e) True ''' if i: d = self else: d = self.copy() if axes is not None and not axes and axes != 0: # Null flip return d if axes is None: iaxes = range(d._ndim) else: iaxes = d._parse_axes(axes, 'flip') reverse = d._flip[:] data_axes = d._axes partitions = d.partitions pm_axes = partitions.axes flip_partition_matrix = False if pm_axes: indices = [slice(None)] * partitions.ndim for i in iaxes: axis = data_axes[i] if axis in reverse: reverse.remove(axis) else: reverse.append(axis) if axis in pm_axes: indices[pm_axes.index(axis)] = slice(None, None, -1) flip_partition_matrix = True #--- End: for d._flip = reverse if flip_partition_matrix: partitions = partitions[tuple(indices)] partitions.set_location_map(data_axes) d.partitions = partitions #--- End: if return d #--- End: def def HDF_chunks(self, *chunks): ''' ''' _HDF_chunks = self._HDF_chunks if _HDF_chunks is None: _HDF_chunks = {} else: _HDF_chunks = _HDF_chunks.copy() org_HDF_chunks = dict([(i, _HDF_chunks.get(axis)) for i, axis in enumerate(self._axes)]) if not chunks: return org_HDF_chunks chunks = chunks[0] if chunks is None: # Clear all chunking self._HDF_chunks = None return org_HDF_chunks axes = self._axes for axis, size in chunks.iteritems(): _HDF_chunks[axes[axis]] = size if _HDF_chunks.values() == [None] * self._ndim: _HDF_chunks = None self._HDF_chunks = _HDF_chunks return org_HDF_chunks #--- End: def def inspect(self): ''' Inspect the object for debugging. .. seealso:: `cf.inspect` :Returns: None ''' print cf_inspect(self) #--- End: def def isclose(self, y, rtol=None, atol=None): ''' Return a boolean data array showing where two broadcastable arrays have equal values within a tolerance. For numeric data arrays, ``d.isclose(y, rtol, atol)`` is equivalent to ``abs(d - y) <= ``atol + rtol*abs(y)``, otherwise it is equivalent to ``d == y``. :Parameters: y : data_like atol : float, optional The absolute tolerance for all numerical comparisons, By default the value returned by the `ATOL` function is used. rtol : float, optional The relative tolerance for all numerical comparisons, By default the value returned by the `RTOL` function is used. :Returns: out: bool :Examples: >>> d = cf.Data([1000, 2500], 'metre') >>> e = cf.Data([1, 2.5], 'km') >>> print d.isclose(e).array [ True True] >>> d = cf.Data(['ab', 'cdef']) >>> print d.isclose([[['ab', 'cdef']]]).array [[[ True True]]] >>> d = cf.Data([[1000, 2500], [1000, 2500]], 'metre') >>> e = cf.Data([1, 2.5], 'km') >>> print d.isclose(e).array [[ True True] [ True True]] >>> d = cf.Data([1, 1, 1], 's') >>> print d.isclose(1).array [ True True True] ''' if atol is None: atol = ATOL() if rtol is None: rtol = RTOL() try: return abs(self - y) <= atol + rtol*abs(y) except (TypeError, NotImplementedError, IndexError): return self == y #--- End: def def rint(self, i=False): ''' Round elements of the data array to the nearest integer. .. versionadded:: 1.0 .. seealso:: `ceil`, `floor`, `trunc` :Parameters: i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data :Examples: >>> print d.array [-1.9 -1.5 -1.1 -1. 0. 1. 1.1 1.5 1.9] >>> print d.rint().array [-2. -2. -1. -1. 0. 1. 1. 2. 2.] ''' return self.func(numpy_rint, out=True, i=i) #---End: def def round(self, decimals=0, i=False): '''Evenly round elements of the data array to the given number of decimals. .. versionadded:: 1.1.4 .. seealso:: `ceil`, `floor`, `rint`, `trunc` :Parameters: decimals : int, optional Number of decimal places to round to (default: 0). If decimals is negative, it specifies the number of positions to the left of the decimal point. i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data :Examples: >>> print d.array [-1.81, -1.41, -1.01, -0.91, 0.09, 1.09, 1.19, 1.59, 1.99]) >>> print d.round().array [-2., -1., -1., -1., 0., 1., 1., 2., 2.] >>> print d.round(1).array [-1.8, -1.4, -1. , -0.9, 0.1, 1.1, 1.2, 1.6, 2. ] >>> print d.round(-1).array [-0., -0., -0., -0., 0., 0., 0., 0., 0.] ''' return self.func(numpy_round, out=True, i=i, decimals=decimals) #---End: def def swapaxes(self, axis0, axis1, i=False): ''' Interchange two axes of an array. .. seealso:: `expand_dims`, `flip`, `squeeze`, `transpose` :Parameters: axis0, axis1 : ints Select the axes to swap. Each axis is identified by its original integer position. i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data :Examples: >>> d=cf.Data([[[1, 2, 3], [4, 5, 6]]]) >>> d.shape (1, 2, 3) >>> d.swapaxes(1, 0).shape >>> d.swapaxes(2, 1).shape >>> d.swapaxes(0, -1).shape >>> d.swapaxes(1, 1).shape ''' if i: d = self else: d = self.copy() axis0 = d._parse_axes((axis0,), 'swapaxes')[0] axis1 = d._parse_axes((axis1,), 'swapaxes')[0] if axis0 != axis1: iaxes = range(d._ndim) iaxes[axis1], iaxes[axis0] = axis0, axis1 d.transpose(iaxes, i=True) #--- End: if return d #--- End: def def save_to_disk(self, itemsize=None): raise NotImplementedError( "cf.Data.save_to_disk is dead. Use not cf.Data.fits_in_memory instead.") # ''' # #Return True if the master array is large enough to be saved to disk. # #:Parameters: # # itemsize : int, optional # The number of bytes per word of the master data array. By # default it taken from the array's data type. # #:Returns: # # out: bool # #:Examples: # #>>> print d.save_to_disk() #True # #>>> print d.save_to_disk(8) #False # #''' # if not itemsize: # try: # itemsize = self.dtype.itemsize # except AttributeError: # raise ValueError( # "save_to_disk: Must set itemsize if there is no dtype") # #--- End: if # # # ------------------------------------------------------------ # # Note that self._size*(itemsize+1) is the array size in bytes # # including space for a full boolean mask # # ------------------------------------------------------------ # return self._size*(itemsize+1) > FREE_MEMORY() - FM_THRESHOLD() # #--- End: def def fits_in_memory(self, itemsize): ''' Return True if the master array is small enough to be retained in memory. :Parameters: itemsize : int The number of bytes per word of the master data array. :Returns: out: bool :Examples: >>> print d.fits_in_memory(8) False ''' # ------------------------------------------------------------ # Note that self._size*(itemsize+1) is the array size in bytes # including space for a full boolean mask # ------------------------------------------------------------ return self._size*(itemsize+1) <= FREE_MEMORY() - FM_THRESHOLD() #--- End: def def where(self, condition, x=None, y=None, i=False): ''' Set data array elements depending on a condition. Elements are set differently depending on where the condition is True or False. Two assignment values are given. From one of them, the data array is set where the condition is True and where the condition is False, the data array is set from the other. Each assignment value may either contain a single datum, or is an array-like object which is broadcastable shape of the data array. **Missing data** The treatment of missing data elements depends on the value of the `hardmask` attribute. If it is True then masked elements will not unmasked, otherwise masked elements may be set to any value. In either case, unmasked elements may be set to any value (including missing data). Unmasked elements may be set to missing data by assignment to the `cf.masked` constant or by assignment to a value which contains masked elements. .. seealso:: `cf.masked`, `hardmask`, `__setitem__` :Parameters: condition : *optional* Define the condition which determines how to set the data array. The condition is any object which is broadcastable to the data array shape. The condition is True where the object broadcast to the data array shape is True. If *condition* is unset then it defaults to a condition of True everywhere. x, y : Specify the assignment value. Where the condition defined by the *arg* and *kwargs* arguments is True, set the data array from *x* and where the condition is False, set the data array from *y*. Arguments *x* and *y* are each one of: * ``None``. The appropriate elements of the data array are unchanged. .. * Any object which is broadcastable to the data array's shape. The appropriate elements of the data array are set to the corresponding values from the object broadcast to the data array shape. i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data :Examples: ''' def _slice_to_partition(data, indices): ''' Return a numpy array for the part of the `cf.Data` object which spans the given indices. :Parameters: data : cf.Data indices : tuple :Returns: out: numpy array ''' indices2 = [(slice(0, 1) if n == 1 else i) for n, i in zip(data.shape[::-1], indices[::-1])] return data[tuple(indices2)[::-1]].unsafe_array #--- End: def def _is_broadcastable(data0, data1, do_not_broadcast, is_scalar): ''' Check that the input *data1* is broadcastable to *data0* and return *data1*, as a python scalar if possible. This function updates following lists: do_not_broadcast, is_scalar :Parameters: data : cf.Data do_not_broadcast : list is_scalar : list :Returns: out: cf.Data or scalar ''' shape0 = data0._shape shape1 = data1._shape size1 = data1._size if shape1 == shape0: do_not_broadcast.append(True) is_scalar.append(False) elif size1 == 1: do_not_broadcast.append(False) is_scalar.append(True) # Replace data1 with its scalar value data1 = data1.datum(0) elif data1._ndim <= data0._ndim and size1 < data0._size: do_not_broadcast.append(False) is_scalar.append(False) for n, m in zip(shape1[::-1], shape0[::-1]): if n != m and n != 1: raise ValueError( "Can't assign by where: Can't broadcast data with shape %s to shape %s" % (shape1, shape0)) else: raise ValueError( "Can't assign by where: Can't broadcast data with shape %s to shape %s" % (shape1, shape0)) #--- End: if return data1 #--- End: def if i: d = self else: d = self.copy() if x is None and y is None: return d do_not_broadcast = [] is_scalar = [] # ------------------------------------------------------------ # Make sure that the condition is a cf.Data object # ------------------------------------------------------------ if not isinstance(condition, d.__class__): condition = type(d)(condition) # Check that the condition is broadcastable condition = _is_broadcastable(d, condition, do_not_broadcast, is_scalar) # ------------------------------------------------------------ # Parse x and y so that each is one of a) None, b) a scalar or # c) a data array with the same shape as the master array # ------------------------------------------------------------ xy = [] for value in (x, y): if value is None or value is cf_masked: do_not_broadcast.append(False) is_scalar.append(True) else: # Make sure that the value is a cf.Data object and has # compatible units if not isinstance(value, d.__class__): value = type(d)(value) else: if value.Units.equivalent(d.Units): if not value.Units.equals(d.Units): value = value.copy() value.Units = d.Units elif value.Units: raise ValueError( "Some bad units %r, %r" % (d.Units, value.Units)) #--- End: if # Check that the value is broadcastable value = _is_broadcastable(d, value, do_not_broadcast, is_scalar) #--- End: if xy.append(value) #--- End: for x, y = xy c_is_scalar, x_is_scalar, y_is_scalar = is_scalar #------------------------------------------------------------- # Try some shortcuts if the condition is a scalar #------------------------------------------------------------- if c_is_scalar : if condition: if x is not None: d[...] = x return d else: if y is not None: d[...] = y return d #--- End: if # Still here? broadcast = not any(do_not_broadcast) hardmask = d._hardmask pda_args = d.pda_args() #readonly=True) for partition in d.partitions.matrix.flat: array = partition.dataarray(**pda_args) # -------------------------------------------------------- # Find the master array indices for this partition # -------------------------------------------------------- shape = array.shape indices = partition.indices # -------------------------------------------------------- # Find the condition for this partition # -------------------------------------------------------- if c_is_scalar: c = condition else: c = _slice_to_partition(condition, indices) # -------------------------------------------------------- # Find value to use where condition is True for this # partition # -------------------------------------------------------- if x_is_scalar: if x is None: # Use d T = array T_masked = partition.masked else: T = x T_masked = x is cf_masked else: T = _slice_to_partition(x, indices) T_masked = numpy_ma_isMA(T) and numpy_ma_is_masked(T) #--- End: if # -------------------------------------------------------- # Find value to use where condition is False for this # partition # -------------------------------------------------------- if y_is_scalar: if y is None: # Use d F = array F_masked = partition.masked else: F = y F_masked = y is cf_masked else: F = _slice_to_partition(y, indices) F_masked = numpy_ma_isMA(F) and numpy_ma_is_masked(F) #--- End: if # -------------------------------------------------------- # Make sure that at least one of the arrays is the same # shape as the partition # -------------------------------------------------------- if broadcast: if x is cf_masked or y is cf_masked: c = _broadcast(c, shape) else: max_sizes = max((numpy_size(c), numpy_size(T), numpy_size(F))) if numpy_size(c) == max_sizes: c = _broadcast(c, shape) elif numpy_size(T) == max_sizes: T = _broadcast(T, shape) else: F = _broadcast(F, shape) #--- End: if # -------------------------------------------------------- # Create a numpy array which takes vales from T where c # is True and from F where c is False # -------------------------------------------------------- if T_masked or F_masked: # T and/or F have missing data new = numpy_ma_where(c, T, F) if partition.masked: if hardmask: # The original partition has missing data and # a hardmask, so apply the original # partition's mask to the new array. new.mask |= array.mask elif not numpy_ma_is_masked(new): # The original partition has missing data and # a softmask and the new array doesn't have # missing data, so turn the new array into an # unmasked array. new = new.data[...] elif not numpy_ma_is_masked(new): # The original partition doesn't have missing data # and neither does the new array new = new.data[...] else: # Neither T nor F have missing data new = numpy_where(c, T, F) if partition.masked and hardmask: # The original partition has missing data and a # hardmask, so apply the original partition's mask # to the new array. new = numpy_ma_masked_where(array.mask, new, copy=False) #--- End: if # -------------------------------------------------------- # Replace the partition's subarray with the new numpy # array # -------------------------------------------------------- partition.subarray = new partition.close() #--- End: for return d #--- End: def def sin(self, i=False): ''' Take the trigonometric sine of the data array in place. Units are accounted for in the calculation. If the units are not equivalent to radians (such as Kelvin) then they are treated as if they were radians. For example, the the cosine of 90 degrees_east is 1.0, as is the sine of 1.57079632 radians. The Units are changed to '1' (nondimensionsal). :Parameters: i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data :Examples: >>> d.Units >>> print d.array [[-90 0 90 --]] >>> d.sin() >>> d.Units >>> print d.array [[-1.0 0.0 1.0 --]] >>> d.Units >>> print d.array [[1 2 3 --]] >>> d.sin() >>> d.Units >>> print d.array [[0.841470984808 0.909297426826 0.14112000806 --]] ''' if i: d = self else: d = self.copy() if d.Units.equivalent(_units_radians): d.Units = _units_radians return d.func(numpy_sin, units=_units_1, i=True) #--- End: def def log(self, base=None, i=False): ''' :Parameters: base : i : bool, optional If True then update the data array in place. By default a new data array is created. ''' if i: d = self else: d = self.copy() if base is None: d.func(numpy_log, units=d.Units.log(numpy_e), i=True) elif base == 10: d.func(numpy_log10, units=d.Units.log(10), i=True) elif base == 2: d.func(numpy_log2, units=d.Units.log(2), i=True) else: d.func(numpy_log, units=d.Units.log(base), i=True) d /= numpy_log(base) return d #--- End: def def squeeze(self, axes=None, i=False): ''' Remove size 1 axes from the data array. By default all size 1 axes are removed, but particular axes may be selected with the keyword arguments. .. seealso:: `expand_dims`, `flip`, `swapaxes`, `transpose` :Parameters: axes : (sequence of) int or str, optional Select the axes. By default all size 1 axes are removed. The *axes* argument may be one, or a sequence, of: * An internal axis identifier. Selects this axis. .. * An integer. Selects the axis coresponding to the given position in the list of axes of the data array. No axes are removed if *axes* is an empty sequence. i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data The squeezed data array. :Examples: >>> v.shape (1,) >>> v.squeeze() >>> v.shape () >>> v.shape (1, 2, 1, 3, 1, 4, 1, 5, 1, 6, 1) >>> v.squeeze((0,)) >>> v.shape (2, 1, 3, 1, 4, 1, 5, 1, 6, 1) >>> v.squeeze(1) >>> v.shape (2, 3, 1, 4, 1, 5, 1, 6, 1) >>> v.squeeze([2, 4]) >>> v.shape (2, 3, 4, 5, 1, 6, 1) >>> v.squeeze([]) >>> v.shape (2, 3, 4, 5, 1, 6, 1) >>> v.squeeze() >>> v.shape (2, 3, 4, 5, 6) ''' if i: d = self else: d = self.copy() ndim = d._ndim if not ndim: if axes or axes == 0: raise ValueError( "Can't squeeze: Can't remove an axis from a scalar %s" % d.__class__.__name__) return d #--- End: if shape = list(d._shape) if axes is None: axes = [i for i, n in enumerate(shape) if n == 1] else: axes = d._parse_axes(axes, 'squeeze') # Check the squeeze axes for i in axes: if shape[i] > 1: raise ValueError( "Can't squeeze %s: Can't remove axis of size > 1" % d.__class__.__name__) #--- End: if if not axes: return d # Still here? Then the data array is not scalar and at least # one size 1 axis needs squeezing. data_axes = d._axes[:] flip = d._flip[:] if not d._all_axes: d._all_axes = tuple(data_axes) i_axis = [] for axis in [data_axes[i] for i in axes]: if axis in flip: flip.remove(axis) i = data_axes.index(axis) shape.pop(i) data_axes.pop(i) i_axis.append((i, axis)) #--- End: for for partition in d.partitions.matrix.flat: p_location = partition.location[:] p_shape = partition.shape[:] p_flip = partition.flip[:] for i, axis in i_axis: p_location.pop(i) p_shape.pop(i) if axis in p_flip: p_flip.remove(axis) #--- End: for partition.location = p_location partition.shape = p_shape partition.flip = p_flip # p_part = partition.part # if p_part: # for i, axis in i_axis: # p_part.pop(i) #--- End: for d._ndim = len(shape) d._shape = tuple(shape) d._axes = data_axes d._flip = flip # Remove size 1 partition dimensions d.partitions.squeeze(i=True) return d #--- End: def def tan(self, i=False): ''' Take the trigonometric tangent of the data array element-wise. Units are accounted for in the calculation. If the units are not equivalent to radians (such as Kelvin) then they are treated as if they were radians. For example, the the tangent of 45 degrees_east is 1.0, as is the tangent of 0.78539816 radians. The Units are changed to ``'1'`` (nondimensionsal). .. seealso:: `cos`, `sin` :Parmaeters: i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data :Examples: >>> d.Units >>> print d.array [[-45 0 45 --]] >>> d.tan() >>> d.Units >>> print d.array [[-1.0 0.0 1.0 --]] >>> d.Units >>> print d.array [[1 2 3 --]] >>> d.tan() >>> d.Units >>> print d.array [[1.55740772465 -2.18503986326 -0.142546543074 --]] ''' if i: d = self else: d = self.copy() if d.Units.equivalent(_units_radians): d.Units = _units_radians return d.func(numpy_tan, units=_units_1, i=True) #--- End: def def tolist(self): ''' Return the array as a (possibly nested) list. Return a copy of the array data as a (nested) Python list. Data items are converted to the nearest compatible Python type. :Returns: out: list The possibly nested list of array elements. :Examples: >>> d = cf.Data([1, 2]) >>> d.tolist() [1, 2] >>> d = cf.Data(([[1, 2], [3, 4]]) >>> list(d) [array([1, 2]), array([3, 4])] # DCH CHECK >>> d.tolist() [[1, 2], [3, 4]] >>> d.equals(cf.Data(d.tolist())) True ''' return self.array.tolist() #--- End: def def transpose(self, axes=None, i=False): ''' Permute the axes of the data array. .. seealso:: `expand_dims`, `flip`, `squeeze`, `swapaxes` :Parameters: axes : (sequence of) int The new axis order of the data array. By default the order is reversed. Each axis of the new order is identified by its original integer position. i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data :Examples: >>> d.shape (19, 73, 96) >>> d.transpose() >>> d.shape (96, 73, 19) >>> d.transpose([1, 0, 2]) >>> d.shape (73, 96, 19) >>> d.transpose((-1, 0, 1)) >>> d.shape (19, 73, 96) ''' if i: d = self else: d = self.copy() ndim = d._ndim # Parse the axes. By default, reverse the order of the axes. if axes is None: if ndim <= 1: return d iaxes = range(ndim-1, -1, -1) else: iaxes = d._parse_axes(axes, 'transpose') # Return unchanged if axes are in the same order as the data if iaxes == range(ndim): return d if len(iaxes) != ndim: raise ValueError( "Can't tranpose: Axes don't match array: %s" % (iaxes,)) #--- End: if # Permute the axes data_axes = d._axes d._axes = [data_axes[i] for i in iaxes] # Permute the shape shape = d._shape d._shape = tuple([shape[i] for i in iaxes]) # Permute the locations map for partition in d.partitions.matrix.flat: location = partition.location shape = partition.shape partition.location = [location[i] for i in iaxes] partition.shape = [shape[i] for i in iaxes] #--- End: for return d #--- End: def def trunc(self, i=False): ''' Return the truncated values of the data array. The truncated value of the number, ``x``, is the nearest integer which is closer to zero than ``x`` is. In short, the fractional part of the signed number ``x`` is discarded. .. versionadded:: 1.0 .. seealso:: `ceil`, `floor`, `rint` :Parameters: i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data :Examples: >>> print d.array [-1.9 -1.5 -1.1 -1. 0. 1. 1.1 1.5 1.9] >>> print d.trunc().array [-1. -1. -1. -1. 0. 1. 1. 1. 1.] ''' return self.func(numpy_trunc, out=True, i=i) #---End: def @classmethod def empty(cls, shape, dtype=None, units=None): ''' Create a new data array without initializing the elements. .. seealso:: `full`, `ones`, `zeros` :Examples 1: >>> d = cf.Data.empty((96, 73)) :Parameters: shape : int or tuple of ints The shape of th new array. dtype : numpy.dtype or any object convertible to numpy.dtype The data type of the new array. By default the data type is numpy.float64. units : str or Units The units for the new data array. :Returns: out: cf.Data :Examples 2: ''' return cls.full(shape, None, dtype=dtype, units=units) #--- End: def @classmethod def full(cls, shape, fill_value, dtype=None, units=None): ''' ''' array = CreateArray(shape=tuple(shape), size=long(reduce(operator_mul, shape, 1)), ndim=len(shape), dtype=numpy_dtype(dtype), fill_value=fill_value) return cls(array, units=units) #--- End: def @classmethod def ones(cls, shape, dtype=None, units=None): ''' ''' return cls.full(shape, 1, dtype=dtype, units=units) #--- End: def @classmethod def zeros(cls, shape, dtype=None, units=None): ''' ''' return cls.full(shape, 0, dtype=dtype, units=units) #--- End: def def func(self, f, units=None, out=False, i=False, **kwargs): ''' Apply an element-wise array operation to the data array in place. :Parameters: f : function The function to be applied. units : cf.Units, optional out: bool, optional i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: None :Examples: >>> print d.Units >>> print d.array [[ 0. 1.57079633] [ 3.14159265 4.71238898]] >>> import numpy >>> d.func(numpy.cos, i=True) >>> print d.array [[ 1.0 0.0] [-1.0 0.0]] ''' if i: d = self else: d = self.copy() pda_args = d.pda_args() datatype = d.dtype for partition in d.partitions.matrix.flat: array = partition.dataarray(**pda_args) if out: f(array, out=array, **kwargs) else: array = f(array, **kwargs) p_datatype = array.dtype if datatype != p_datatype: datatype = numpy_result_type(p_datatype, datatype) partition.subarray = array if units is not None: partition.Units = units partition.close() #--- End: for d.dtype = datatype if units is not None: d.Units = units return d #--- End: def def range(self, axes=None, squeeze=True, mtol=1, i=False): '''Collapse axes with the absolute difference between their maximum and minimum values. Missing data array elements are omitted from the calculation. .. seealso:: `max`, `min`, `mean`, `mid_range`, `sample_size`, `sd`, `sum`, `sum_of_weights`, `sum_of_weights2`, `var` :Parameters: i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data The collapsed array. :Examples: ''' return self._collapse(range_f, range_fpartial, range_ffinalise, axes=axes, squeeze=squeeze, weights=None, mtol=mtol, i=i) #--- End: def def roll(self, axis, shift, i=False): ''' A lot like `numpy.roll` :Parameters: i : bool, optional If True then update the data array in place. By default a new data array is created. ''' if not shift: # Null roll if i: return self else: return self.copy() iaxes = self._parse_axes(axis, 'roll') if len(iaxes) != 1: raise ValueError("987345 9087345 ^^ roll ^") axis = iaxes[0] n = self._shape[axis] shift %= n if not shift: # Null roll if i: return self else: return self.copy() shift = n - shift indices0 = [slice(None)] * self._ndim indices0[axis] = slice(None, shift) indices1 = indices0[:] indices1[axis] = slice(shift, None) indices0 = tuple(indices0) indices1 = tuple(indices1) d = type(self).concatenate((self[indices1], self[indices0]), axis=axis) if i: self.__dict__ = d.__dict__ return self else: return d #--- End: def def sum(self, axes=None, squeeze=False, mtol=1, i=False): '''Collapse axes with their sum. Missing data array elements are omitted from the calculation. .. seealso:: `max`, `min`, `mean`, `mid_range`, `range`, `sample_size`, `sd`, `sum_of_weights`, `sum_of_weights2`, `var` :Parameters: axes : (sequence of) int, optional squeeze : bool, optional i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data The collapsed array. :Examples: ''' return self._collapse(sum_f, sum_fpartial, sum_ffinalise, axes=axes, squeeze=squeeze, weights=None, mtol=mtol, i=i) #--- End: def def sum_of_weights(self, axes=None, squeeze=False, mtol=1, weights=None, i=False): ''' Missing data array elements are omitted from the calculation. .. seealso:: `max`, `mean`, `mid_range`, `min`, `range`, `sample_size`, `sd`, `sum`, `sum_of_weights2`, `var` :Parameters: axes : (sequence of) int, optional squeeze : bool, optional i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data The collapsed array. :Examples: ''' return self._collapse(sw_f, sw_fpartial, sw_ffinalise, axes=axes, squeeze=squeeze, weights=weights, mtol=mtol, i=i) #--- End: def def sum_of_weights2(self, axes=None, squeeze=False, mtol=1, weights=None, i=False): ''' Missing data array elements are omitted from the calculation. .. seealso:: `max`, `mean`, `mid_range`, `min`, `range`, `sample_size`, `sd`, `sum`, `sum_of_weights`, `var` :Parameters: axes : (sequence of) int, optional squeeze : bool, optional i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data The collapsed array. :Examples: ''' return self._collapse(sw2_f, sw2_fpartial, sw2_ffinalise, axes=axes, squeeze=squeeze, weights=weights, mtol=mtol, i=i) #--- End: def def sd(self, axes=None, squeeze=False, mtol=1, weights=None, ddof=1, a=None, i=False): r''' Collapse axes by calculating their standard deviation. The standard deviation may be adjusted for the number of degrees of freedom and may be calculated with weighted values. Missing data array elements and those with zero weight are omitted from the calculation. The unweighted standard deviation, :math:`s`, of :math:`N` values :math:`x_i` with mean :math:`m` and with :math:`N-ddof` degrees of freedom (:math:`ddof\ge0`) is .. math:: s=\sqrt{\frac{1}{N-ddof} \sum_{i=1}^{N} (x_i - m)^2} The weighted standard deviation, :math:`\tilde{s}_N`, of :math:`N` values :math:`x_i` with corresponding weights :math:`w_i`, weighted mean :math:`\tilde{m}` and with :math:`N` degrees of freedom is .. math:: \tilde{s}_N=\sqrt{\frac{1}{\sum_{i=1}^{N} w_i} \sum_{i=1}^{N} w_i(x_i - \tilde{m})^2} The weighted standard deviation, :math:`\tilde{s}`, of :math:`N` values :math:`x_i` with corresponding weights :math:`w_i` and with :math:`N-ddof` degrees of freedom (:math:`ddof>0`) is .. math:: \tilde{s} = \sqrt{\frac{f \sum_{i=1}^{N} w_i}{f \sum_{i=1}^{N} w_i - ddof}} \tilde{s}_N where :math:`f` is the smallest positive number whose product with each weight is an integer. :math:`f \sum_{i=1}^{N} w_i` is the size of a new sample created by each :math:`x_i` having :math:`fw_i` repeats. In practice, :math:`f` may not exist or may be difficult to calculate, so :math:`f` is either set to a predetermined value or an approximate value is calculated. The approximation is the smallest positive number whose products with the smallest and largest weights and the sum of the weights are all integers, where a positive number is considered to be an integer if its decimal part is sufficiently small (no greater than :math:`10^{-8}` plus :math:`10^{-5}` times its integer part). This approximation will never overestimate :math:`f`, so :math:`\tilde{s}` will never be underestimated when the approximation is used. If the weights are all integers which are collectively coprime then setting :math:`f=1` will guarantee that :math:`\tilde{s}` is exact. :Parameters: axes : (sequence of) int, optional The axes to be collapsed. By default flattened input is used. Each axis is identified by its integer position. No axes are collapsed if *axes* is an empty sequence. squeeze : bool, optional If True then collapsed axes are removed. By default the axes which are collapsed are left in the result as axes with size 1. When the collapsed axes are retained, the result is guaranteed to broadcast correctly against the original array. **Example:** Suppose that an array, ``d``, has shape (2, 3, 4) and ``e = d.sd(axis=1)``. Then ``e`` has shape (2, 1, 4) and, for example, ``d/e`` is allowed. If ``e = d.sd(axis=1, squeeze=True)`` then ``e`` will have shape (2, 4) and ``d/e`` is an illegal operation. weights : data-like or dict, optional Weights associated with values of the array. By default all non-missing elements of the array are assumed to have equal weights of 1. If *weights* is a data-like object then it must have either the same shape as the array or, if that is not the case, the same shape as the axes being collapsed. If *weights* is a dictionary then each key is axes of the array (an int or tuple of ints) with a corresponding data-like value of weights for those axes. In this case, the implied weights array is the outer product of the dictionary's values it may be used in conjunction wih any value of *axes*, because the axes to which the weights apply are given explicitly. **Example:** Suppose that the original array being collapsed has shape (2, 3, 4) and *weights* is set to a data-like object, ``w``. If ``axes=None`` then ``w`` must have shape (2, 3, 4). If ``axes=(0, 1, 2)`` then ``w`` must have shape (2, 3, 4). If ``axes=(2, 0, 1)`` then ``w`` must either have shape (2, 3, 4) or else (4, 2, 3). If ``axes=1`` then ``w`` must either have shape (2, 3, 4) or else (3,). If ``axes=(2, 0)`` then ``w`` must either have shape (2, 3, 4) or else (4, 2). Suppose *weights* is a dictionary. If ``weights={1: x}`` then ``x`` must have shape (3,). If ``weights={1: x, (2, 0): y}`` then ``x`` must have shape (3,) and ``y`` must have shape (4, 2). The last example is equivalent to ``weights={(1, 2, 0): x.outerproduct(y)}`` (see `outerproduct` for details). mtol : number, optional For each element in the output data array, the fraction of contributing input array elements which is allowed to contain missing data. Where this fraction exceeds *mtol*, missing data is returned. The default is 1, meaning a missing datum in the output array only occurs when its contributing input array elements are all missing data. A value of 0 means that a missing datum in the output array occurs whenever any of its contributing input array elements are missing data. Any intermediate value is permitted. ddof : number, *optional* The delta degrees of freedom. The number of degrees of freedom used in the calculation is (N-*ddof*) where N represents the number of elements. By default *ddof* is 1, meaning the standard deviation of the population is estimated according to the usual formula with (N-1) in the denominator to avoid the bias caused by the use of the sample mean (Bessel's correction). f : data-like, *optional* Specify the value of :math:`f` in the calculation of a weighted standard deviation when *ddof* is greater than 0. *f* must be broadcastable to the collapsed data array with the collapsed axes removed. By default an approximate value is calculated. See the notes above for details. i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data :Examples: Some, not wholly comprehensive, examples: >>> d = cf.Data([1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4]) >>> e = cf.Data([1, 2, 3, 4]) >>> d.sd(squeeze=False) >>> d.sd() >>> e.sd(weights=[2, 3, 5, 6]) >>> e.sd(weights=[2, 3, 5, 6], f=1) >>> d.sd(ddof=0) >>> e.sd(ddof=0, weights=[2, 3, 5, 6]) ''' if a is not None: if weights is None: a = None elif a <= 0: raise ValueError("SD asdasdsa4456 ##################76* 223") #--- End: if return self._collapse(sd_f, sd_fpartial, sd_ffinalise, axes=axes, squeeze=squeeze, weights=weights, mtol=mtol, ddof=ddof, f=a, i=i) #--- End: def def var(self, axes=None, squeeze=False, weights=None, mtol=1, ddof=1, a=None, i=False): r''' Collapse axes with their weighted variance. The units of the returned array are the square of the units of the array. .. seealso:: `max`, `min`, `mean`, `mid_range`, `range`, `sum`, `sd` :Parameters: axes : (sequence of) int, optional squeeze : bool, optional weights : i : bool, optional If True then update the data array in place. By default a new data array is created. :Returns: out: cf.Data The collapsed array. :Examples: ''' if a is not None: if weights is None: a = None elif a <= 0: raise ValueError("Parameter 'a' must be positive") #--- End: if units = self.Units if units: units = units ** 2 return self._collapse(var_f, var_fpartial, var_ffinalise, axes=axes, squeeze=squeeze, weights=weights, mtol=mtol, units=units, ddof=ddof, f=a, i=i) #--- End: def def section(self, axes, stop=None, chunks=False, min_step=1): """ Return a dictionary of Data objects, which are the m dimensional sections of this n dimensional Data object, where m <= n. The keys of the dictionary are the indicies of the sections in the original Data object. The m dimensions that are not sliced are marked with None as a placeholder making it possible to reconstruct the original data object. The corresponding values are the resulting sections of type cf.Data. :Parameters: axes : *optional* This is should be a tuple or a list of the m indices of the m axes that define the sections of the Data object. If axes is None (the default) all axes are selected. stop : int, optional Stop after this number of sections and return. If stop is None all sections are taken. chunks : bool, optional If True return sections that are of the maximum possible size that will fit in one chunk of memory instead of sectioning into slices of size 1 along the dimensions that are being sectioned. min_step : int, optional The minimum step size when making chunks. By default this is 1. Can be set higher to avoid size 1 dimensions, which are problematic for bilinear regridding. :Returns: out: dict The dictionary of m dimensional sections of the Data object. :Examples: Section a Data object into 2D slices: >>> d.section((0,1)) """ return _section(self, axes, data=True, stop=stop, chunks=chunks, min_step=min_step) #--- End: def #--- End: class # ==================================================================== # # SubspaceData object # # ==================================================================== class SubspaceData(object): __slots__ = ('data',) def __init__(self, data): ''' Set the contained data object. ''' self.data = data #--- End: def def __getitem__(self, indices): ''' Implement indexing x.__getitem__(indices) <==> x[indices] ''' return self.data[indices] #--- End: def def __setitem__(self, indices, value): ''' Implement indexed assignment x.__setitem__(indices, value) <==> x[indices]=value ''' self.data[indices] = value #--- End: def #--- End: class def _size_of_index(index, size=None): ''' Return the number of elements resulting in applying an index to a sequence. :Parameters: index : slice or list of ints The index being applied to the sequence. size : int, optional The number of elements in the sequence being indexed. Only required if *index* is a slice object. :Returns: out: int The length of the sequence resulting from applying the index. :Examples: >>> _size_of_index(slice(None, None, -2), 10) 5 >>> _size_of_index([1, 4, 9]) 3 ''' if isinstance(index, slice): # Index is a slice object start, stop, step = index.indices(size) div, mod = divmod(stop-start, step) if mod != 0: div += 1 return div else: # Index is a list of integers return len(index) #--- End: def def _parse_indices(data, indices): ''' :Parameters: data : indices : sequence of indices :Returns: parsed_indices, flip_axes : {list, list} :Examples: ''' parsed_indices, roll = parse_indices(data, indices, True) flip_axes = [] for i, index in enumerate(parsed_indices): if isinstance(index, slice): size = data.shape[i] if index.step < 0: # If the slice step is negative, then transform the # original slice to a new slice with a positive step # such that the result of the new slice is the reverse # of the result of the original slice. # # For example, if the original slice is slice(6,0,-2) # then the new slice will be slice(2,7,2): # # >>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # >>> a[slice(6, 0, -2)] # [6, 4, 2] # >>> a[slice(2, 7, 2)] # [2, 4, 6] # a[slice(6, 0, -2)] == list(reversed(a[slice(2, 7, 2)])) # True start, stop, step = index.indices(size) step *= -1 div, mod = divmod(start-stop-1, step) div_step = div*step start -= div_step stop = start + div_step + 1 index = slice(start, stop, step) flip_axes.append(i) #--- End: if # If step is greater than one, make sure that index.stop isn't # bigger than it needs to be. if index.step > 1: start, stop, step = index.indices(size) div, mod = divmod(stop-start-1, step) stop = start + div*step + 1 index = slice(start, stop, step) #--- End: if parsed_indices[i] = index else: # -------------------------------------------------------- # Check that an integer list is strictly monotonic and if # it's descending then flip it so that it's ascending # -------------------------------------------------------- step = index[1] - index[0] if step > 0: for j in xrange(len(index)-1): if index[j] >= index[j+1]: raise ValueError("Bad slice (not strictly monotonic): %s" % index) elif step < 0: for j in xrange(len(index)-1): if index[j] <= index[j+1]: raise ValueError("Bad slice (not strictly monotonic): %s" % index) # Reverse the list so that it's strictly monotonically # increasing and make a note that this dimension will # need flipping later index.reverse() flip_axes.append(i) else: # Step is 0 raise ValueError("Bad slice (not strictly monotonic): %s" % index) #--- End: if #--- End: for return parsed_indices, roll, flip_axes #--- End: def def _overlapping_partitions(partitions, indices, axes, master_flip): ''' Return the nested list of (modified) partitions which overlap the given indices to the master array. :Parameters: partitions : cf.PartitionMatrix indices : tuple axes : sequence of str master_flip : list :Returns: out: numpy array A numpy array of cf.Partition objects. :Examples: >>> type f.Data >>> d._axes ['dim1', 'dim2', 'dim0'] >>> axis_to_position = {'dim0': 2, 'dim1': 0, 'dim2' : 1} >>> indices = (slice(None), slice(5, 1, -2), [1,3,4,8]) >>> x = _overlapping_partitions(d.partitions, indices, axis_to_position, master_flip) ''' axis_to_position = {} for i, axis in enumerate(axes): axis_to_position[axis] = i if partitions.size == 1: partition = partitions.matrix.item() # Find out if this partition overlaps the original slice p_indices, shape = partition.overlaps(indices) if p_indices is None: # This partition is not in the slice out of bounds - raise # error? return # Still here? Create a new partition partition = partition.copy() partition.new_part(p_indices, axis_to_position, master_flip) partition.shape = shape new_partition_matrix = numpy_empty(partitions.shape, dtype=object) new_partition_matrix[...] = partition return new_partition_matrix #--- End: if # Still here? Then there are 2 or more partitions. partitions_list = [] partitions_list_append = partitions_list.append flat_pm_indices = [] flat_pm_indices_append = flat_pm_indices.append partitions_flat = partitions.matrix.flat i = partitions_flat.index for partition in partitions_flat: # Find out if this partition overlaps the original slice p_indices, shape = partition.overlaps(indices) if p_indices is None: # This partition is not in the slice i = partitions_flat.index continue # Still here? Then this partition overlaps the slice, so # create a new partition. partition = partition.copy() partition.new_part(p_indices, axis_to_position, master_flip) partition.shape = shape partitions_list_append(partition) flat_pm_indices_append(i) i = partitions_flat.index #--- End: for new_shape = [len(set(s)) for s in numpy_unravel_index(flat_pm_indices, partitions.shape)] new_partition_matrix = numpy_empty((len(flat_pm_indices),), dtype=object) new_partition_matrix[...] = partitions_list new_partition_matrix.resize(new_shape) return new_partition_matrix #--- End: def # -------------------------------------------------------------------- # # -------------------------------------------------------------------- def _getattr(x, attr): return getattr(x, attr) _array_getattr = numpy_vectorize(_getattr) def _broadcast(a, shape): ''' Broadcast an array to a given shape. It is assumed that ``len(array.shape) <= len(shape)`` and that the array is broadcastable to the shape by the normal numpy boradcasting rules, but neither of these things are checked. For example, ``d[...] = d._broadcast(e, d.shape)`` gives the same result as ``d[...] = e`` :Parameters: a : numpy array-like shape : tuple :Returns: out: `numpy.ndarray` ''' # Replace with numpy.broadcast_to v1.10 ??/ a_shape = numpy_shape(a) if a_shape == shape: return a tile = [(m if n == 1 else 1) for n, m in zip(a_shape[::-1], shape[::-1])] tile = shape[0:len(shape)-len(a_shape)] + tuple(tile[::-1]) return numpy_tile(a, tile) #--- End: def cf-python-1.3.2/cf/data/filearray.py0000644000175000017500000001771612752572326017504 0ustar daviddavid00000000000000from numpy import empty as numpy_empty from numpy import full as numpy_full from numpy import load as numpy_load from numpy import ndarray as numpy_ndarray from numpy import save as numpy_save from numpy.ma import array as numpy_ma_array from numpy.ma import is_masked as numpy_ma_is_masked from tempfile import mkstemp from os import close from ..functions import parse_indices, get_subspace from ..functions import inspect as cf_inspect from ..constants import CONSTANTS # ==================================================================== # # FileArray object # # ==================================================================== class FileArray(object): ''' A sub-array stored in a file. .. note:: Subclasses must define the following methods: `!__getitem__`, `!__str__`, `!close` and `!open`. ''' def __init__(self, **kwargs): ''' **Initialization** :Parameters: file : str The netCDF file name in normalized, absolute form. dtype : numpy.dtype The numpy data type of the data array. ndim : int Number of dimensions in the data array. shape : tuple The data array's dimension sizes. size : int Number of elements in the data array. ''' self.__dict__ = kwargs #--- End: def def __deepcopy__(self, memo): ''' Used if copy.deepcopy is called on the variable. ''' return self.copy() #--- End: def def __repr__(self): ''' x.__repr__() <==> repr(x) ''' return "" % (self.__class__.__name__, str(self)) #--- End: def def __str__(self): ''' x.__str__() <==> str(x) ''' return "%s in %s" % (self.shape, self.file) #--- End: def def copy(self): ''' Return a deep copy. ``f.copy() is equivalent to ``copy.deepcopy(f)``. :Returns: out : A deep copy. :Examples: >>> g = f.copy() ''' C = self.__class__ new = C.__new__(C) new.__dict__ = self.__dict__.copy() return new # return type(self)(**self.__dict__) #--- End: def def inspect(self): ''' Inspect the object for debugging. .. seealso:: `cf.inspect` :Returns: None ''' print cf_inspect(self) #--- End: def def fff(): pass def close(self): pass #--- End: def def open(self): pass #--- End: def #--- End: class # ==================================================================== # # TempFileArray object # # ==================================================================== class TempFileArray(FileArray): ''' A indexable N-dimensional array supporting masked values. The array is stored on disk in a temporary file until it is accessed. The directory containing the temporary file may be found and set with the `cf.TEMPDIR` function. ''' def __init__(self, array): ''' **Initialization** :Parameters: array : numpy array The array to be stored on disk in a temporary file. :Examples: >>> f = TempFileArray(numpy.array([1, 2, 3, 4, 5])) >>> f = TempFileArray(numpy.ma.array([1, 2, 3, 4, 5])) ''' # array = kwargs.pop('array') # # super(TempFileArray, self).__init__() # ------------------------------------------------------------ # Use mkstemp because we want to be responsible for deleting # the temporary file when done with it. # ------------------------------------------------------------ fd, _partition_file = mkstemp(prefix='cf_array_', suffix='.npy', dir=CONSTANTS['TEMPDIR']) close(fd) # The name of the temporary file storing the array self._partition_file = _partition_file # Numpy data type of the array self.dtype = array.dtype # Tuple of the array's dimension sizes self.shape = array.shape # Number of elements in the array self.size = array.size # Number of dimensions in the array self.ndim = array.ndim if numpy_ma_is_masked(array): # Array is a masked array. Save it as record array with # 'data' and 'mask' elements because this seems much # faster than using numpy.ma.dump. self._masked_as_record = True numpy_save(_partition_file, array.toflex()) else: self._masked_as_record = False if hasattr(array, 'mask'): # Array is a masked array with no masked elements numpy_save(_partition_file, array.view(numpy_ndarray)) else: # Array is not a masked array. numpy_save(_partition_file, array) #--- End: def def __getitem__(self, indices): ''' x.__getitem__(indices) <==> x[indices] Returns a numpy array. ''' array = numpy_load(self._partition_file) indices = parse_indices(array, indices) array = get_subspace(array, indices) if self._masked_as_record: # Convert a record array to a masked array array = numpy_ma_array(array['_data'], mask=array['_mask'], copy=False) array.shrink_mask() #--- End: if # Return the numpy array return array #--- End: def def __str__(self): ''' x.__str__() <==> str(x) ''' return '%s in %s' % (self.shape, self._partition_file) #--- End: def def close(self): ''' Close all referenced open files. :Returns: None :Examples: >>> f.close() ''' # No open files are referenced pass #--- End: def #--- End: class class CreateArray(FileArray): ''' **Initialization** :Parameters: dtype : numpy.dtype The numpy data type of the data array. ndim : int Number of dimensions in the data array. shape : tuple The data array's dimension sizes. size : int Number of elements in the data array. fill_value : scalar, optional ''' def __getitem__(self, indices): ''' x.__getitem__(indices) <==> x[indices] Returns a numpy array. ''' array_shape = [] for index in parse_indices(self, indices): if isinstance(index, slice): step = index.step if step == 1: array_shape.append(index.stop - index.start) elif step == -1: stop = index.stop if stop is None: array_shape.append(index.start + 1) else: array_shape.append(index.start - index.stop) else: stop = index.stop if stop is None: stop = -1 a, b = divmod(stop - index.start, step) if b: a += 1 array_shape.append(a) else: array_shape.append(len(index)) #-- End: for if self.fill_value is not None: return numpy_full(array_shape, fill_value=self.fill_value, dtype=self.dtype) else: return numpy_empty(array_shape, dtype=self.dtype) #--- End: def def __repr__(self): ''' x.__repr__() <==> repr(x) ''' return "".format( self.__class__.__name__, self.shape, self.dtype, self.fill_value) #--- End: def def __str__(self): ''' x.__str__() <==> str(x) ''' return repr(self) #--- End: def def reshape(self, newshape): ''' ''' new = self.copy() new.shape = newshape new.ndim = len(newshape) return new #--- End: def def resize(self, newshape): ''' ''' self.shape = newshape self.ndim = len(newshape) #--- End: def #--- End: class cf-python-1.3.2/cf/data/partitionmatrix.py0000644000175000017500000005062012752572326020753 0ustar daviddavid00000000000000import numpy from numpy import array as numpy_array from numpy import asscalar as numpy_asscalar from numpy import ndenumerate as numpy_ndenumerate from numpy import empty as numpy_empty from numpy import expand_dims as numpy_expand_dims from numpy import squeeze as numpy_squeeze from copy import deepcopy from itertools import izip from operator import mul from .partition import Partition # ==================================================================== # # PartitionMatrix object # # ==================================================================== _empty_matrix = numpy_empty((), dtype=object) class PartitionMatrix(object): ''' A hyperrectangular partition matrix of a master data array. Each of elements (called partitions) span all or part of exactly one sub-array of the master data array. Normal numpy basic and advanced indexing is supported, but size 1 dimensions are always removed from the output array, i.e. a partition rather than a partition matrix is returned if the output array has size 1. **Attributes** ========== =========================================================== Attribute Description ========== =========================================================== `!axes` `!matrix` `!ndim` The number of partition dimensions in the partition matrix. `!shape` List of the partition matrix's dimension sizes. `!size` The number of partitions in the partition matrix. ========== =========================================================== ''' def __init__(self, matrix, axes): ''' **Initialization** :Parameters: matrix : numpy.ndarray An array of Partition objects. axes : list The identities of the partition axes of the partition array. If the partition matrix is a scalar array then it is an empty list. DO NOT UPDATE INPLACE. :Examples: >>> pm = PartitionMatrix( ... numpy.array(Partition(location = [(0, 1), (2, 4)], ... shape = [1, 2], ... _dimensions = ['dim2', 'dim0'], ... Units = cf.Units('m'), ... part = [], ... data = numpy.array([[5, 6], [7, 8]])), ... dtype=object), ... axes=[]) ''' self.matrix = matrix self.axes = axes #--- End: def def __deepcopy__(self, memo): ''' Used if copy.deepcopy is called on the variable. ''' return self.copy() #--- End: def def __getitem__(self, indices): ''' x.__getitem__(indices) <==> x[indices] Normal numpy basic and advanced indexing is supported, but size 1 dimensions are always removed from the output array, i.e. a partition rather than a partition matrix is returned if the output array has size 1. Returns either a partition or a partition matrix. :Examples: >>> pm.shape (5, 3) >>> pm[0, 1] >>> pm[:, 1] >>> pm[:, 1].shape (5,) >>> pm[1:4, slice(2, 0, -1)].shape (3, 2) >>> pm.shape () >>> pm[()] >>> pm[...] ''' out = self.matrix[indices] if isinstance(out, Partition): return out if out.size == 1: return self.matrix.item() axes = [axis for axis, n in izip(self.axes, out.shape) if n != 1] return type(self)(numpy_squeeze(out), axes) #--- End: def def __repr__(self): ''' x.__repr__() <==> repr(x) ''' return '' % (self.__class__.__name__, self.shape) #--- End: def def __setitem__(self, indices, value): ''' x.__setitem__(indices, y) <==> x[indices]=y Indices must be an integer, a slice object or a tuple. If a slice object is given then the value being assigned must be an iterable. If a tuple of integers (or slices equivalent to an integer) is given then there must be one index per partition matrix dimension. :Examples: >>> pm.shape (3,) >>> pm[2] = p1 >>> pm[:] = [p1, p2, p3] >>> pm.shape (2, 3) >>> pm[0, 2] = p1 >>> pm.shape () >>> pm[()] = p1 >>> pm[...] = p1 ''' self.matrix[indices] = value #--- End: def def __str__(self): ''' x.__str__() <==> str(x) ''' return str(self.matrix) out = [] for partition in self.matrix.flat: out.append(str(partition)) return '\n'.join(out) #--- End: def def change_axis_names(self, axis_map): ''' Change the axis names. The axis names are arbitrary, so mapping them to another arbitrary collection does not change the data array values, units, nor axis order. :Parameters: axis_map : dict :Returns: None :Examples: ''' # Partition dimensions axes = self.axes self.axes = [axis_map[axis] for axis in axes] # Partitions. Note that a partition may have dimensions which # are not in self.axes and that these must also be in # axis_name_map. for partition in self.matrix.flat: partition.change_axis_names(axis_map) #--- End: def # ---------------------------------------------------------------- # Attribute: ndim (can't set or delete) # ---------------------------------------------------------------- @property def ndim(self): ''' The number of partition dimensions in the partition matrix. Not to be confused with the number of dimensions of the master data array. :Examples: >>> pm.shape (8, 4) >>> pm.ndim 2 >>> pm.shape () >>> pm.ndim 0 ''' return self.matrix.ndim #--- End: def # ---------------------------------------------------------------- # Attribute: shape (can't set or delete) # ---------------------------------------------------------------- @property def shape(self): ''' List of the partition matrix's dimension sizes. Not to be confused with the sizes of the master data array's dimensions. :Examples: >>> pm.ndim 2 >>> pm.size 32 >>> pm.shape (8, 4) >>> pm.ndim 0 >>> pm.shape () ''' return self.matrix.shape #--- End: def # ---------------------------------------------------------------- # Attribute: size (can't set or delete) # ---------------------------------------------------------------- @property def size(self): ''' The number of partitions in the partition matrix. Not to be confused with the number of elements in the master data array. :Examples: >>> pm.shape (8, 4) >>> pm.size 32 >>> pm.shape () >>> pm.size 1 ''' return self.matrix.size #--- End: def def add_partitions(self, adimensions, master_flip, extra_boundaries, axis): ''' Add partition boundaries. :Parameters: adimensions : list The ordered axis names of the master array. master_flip : list extra_boundaries : list of int The boundaries of the new partitions. axis : str The name of the axis to have the new partitions. ''' def _update_p(matrix, location, master_index, part, master_axis_to_position, master_flip): ''' :Parameters: matrix : numpy array of cf.Partition objects location : list master_index : int part : list master_axis_to_position : dict master_flip : list :Returns: out : numpy array of cf.Partition objects ''' for partition in matrix.flat: partition.location = partition.location[:] partition.shape = partition.shape[:] partition.location[master_index] = location partition.shape[master_index] = shape partition.new_part(part, master_axis_to_position, master_flip) #--- End: for return matrix #--- End: def # If no extra boundaries have been provided, just return # without doing anything if not extra_boundaries: return master_index = adimensions.index(axis) index = self.axes.index(axis) # Find the position of the extra-boundaries dimension in the # list of master array dimensions extra_boundaries = extra_boundaries[:] # Create the master_axis_to_position dictionary required by # Partition.new_part master_axis_to_position = {} for i, data_axis in enumerate(adimensions): master_axis_to_position[data_axis] = i matrix = self.matrix shape = matrix.shape # Initialize the new partition matrix new_shape = list(shape) new_shape[index] += len(extra_boundaries) new_matrix = numpy_empty(new_shape, dtype=object) part = [slice(None)] * len(adimensions) indices = [slice(None)] * matrix.ndim new_indices = indices[:] new_indices[index] = 0 # Find the first extra boundary x = extra_boundaries.pop(0) for i in xrange(shape[index]): indices[index] = i sub_matrix = matrix[indices] (r0, r1) = sub_matrix.flat.next().location[master_index] # Could do better, perhaps, by assigning in blocks if not r0 < x < r1: new_matrix[new_indices] = sub_matrix new_indices[index] += 1 continue # Find the new extent of the original partition(s) location = (r0, x) shape = x - r0 part[master_index] = slice(0, shape) # Create new partition(s) in place of the original ones(s) # and set the location, shape and part attributes new_matrix[new_indices] = _update_p(deepcopy(sub_matrix), location, master_index, part, master_axis_to_position, master_flip) new_indices[index] += 1 while x < r1: # Find the extent of the new partition(s) if not extra_boundaries: # There are no more new boundaries, so the new # partition(s) run to the end of the original # partition(s) in which they lie. location1 = r1 else: # There are more new boundaries, so this # new partition runs either to the next # new boundary or to the end of the # original partition, which comes first. location1 = min(extra_boundaries[0], r1) #--- End: if location = (x, location1) shape = location1 - x offset = x - r0 part[master_index] = slice(offset, offset + shape) # Create the new partition(s) and set the # location, shape and part attributes new_matrix[new_indices] = _update_p(deepcopy(sub_matrix), location, master_index, part, master_axis_to_position, master_flip) new_indices[index] += 1 if not extra_boundaries: # ------------------------------------------------ # There are no more extra boundaries, so we can # return now # ------------------------------------------------ new_indices[index] = slice(new_indices[index], None) indices[index] = slice(i+1, None) new_matrix[new_indices] = matrix[indices] self.matrix = new_matrix return #--- End: if # Move on to the next new boundary x = extra_boundaries.pop(0) #--- End: while #--- End: for self.matrix = new_matrix #--- End: def def copy(self): ''' Return a deep copy. ``pm.copy()`` is equivalent to ``copy.deepcopy(pm)``. :Returns: out : The deep copy. :Examples: >>> pm.copy() ''' # ------------------------------------------------------------ # NOTE: 15 May 2013. It is necesary to treat # self.matrix.ndim==0 as a special case since there is a # bug (feature?) in numpy <= v1.7 (at least): # http://numpy-discussion.10968.n7.nabble.com/bug-in-deepcopy-of-rank-zero-arrays-td33705.html # ------------------------------------------------------------ matrix = self.matrix if not matrix.ndim: new_matrix = _empty_matrix.copy() #numpy_empty((), dtype=object) new_matrix[()] = matrix.item().copy() return type(self)(new_matrix , []) else: new_matrix = numpy.empty(matrix.size, dtype=object) new_matrix[...] = [partition.copy() for partition in matrix.flat] new_matrix.resize(matrix.shape) return type(self)(new_matrix, self.axes) #--- End: def def expand_dims(self, axis, i=False): ''' Insert a new size 1 axis in place. The new axis is always inserted at position 0, i.e. it becomes the new slowest varying axis. .. seealso:: `flip`, `squeezes`, `swapaxes`, `transpose` :Parameters: axis : str The internal identity of the new axis. :Returns: out : cf.PartitionMatrix :Examples: >>> pm.shape (2, 3) >>> pm.expand_dims('dim2') >>> pm.shape (1, 2, 3) ''' if i: p = self else: p = self.copy() p.matrix = numpy_expand_dims(p.matrix, 0) p.axes = [axis] + p.axes return p #--- End: def @property def flat(self): ''' A flat iterator over the partitions in the partition matrix. :Examples: >>> pm.shape [2, 2] >>> for partition in pm.flat: ... print repr(partition.Units) ... >>> pm.flat >>> flat = pm.flat >>> flat.next() >>> flat.next() ''' return self.matrix.flat #--- End: def def ndenumerate(self): ''' Return an iterator yielding pairs of array indices and values. :Returns: out : numpy.ndenumerate An iterator over the array coordinates and values. :Examples: >>> pm.shape (2, 3) >>> for i, partition in pm.ndenumerate(): ... print i, repr(partition) ... (0, 0) (0, 1) (0, 2) (1, 0) (1, 1) (1, 2) ''' return numpy_ndenumerate(self.matrix) #--- End: def def partition_boundaries(self, data_axes): ''' Return the partition boundaries for each dimension. :Parameters: data_axes : sequence :Returns: out : dict :Examples: ''' boundaries = {} matrix = self.matrix indices = [0] * self.ndim for i, axis in enumerate(self.axes): indices[i] = slice(None) j = data_axes.index(axis) b = [partition.location[j][0] for partition in matrix[indices].flat] b.append(partition.location[j][1]) boundaries[axis] = b indices[i] = 0 #--- End: for return boundaries #--- End: def def swapaxes(self, axis0, axis1, i=False): ''' Swap the positions of two axes. Note that this does not change the master data array. .. seealso:: `expand_dims`, `flip`, `squeeze`, `transpose` :Parameters: axis0, axis1 : ints Select the axes to swap. Each axis is identified by its original integer position. :Returns: out : cf.PartitionMatrix :Examples: >>> pm.shape (2, 3, 4, 5) >>> pm.swapaxes(1, 2) >>> pm.shape (2, 4, 3, 5) >>> pm.swapaxes(1, -1) >>> pm.shape (2, 5, 3, 4) ''' if i: p = self else: p = self.copy() if axis0 != axis1: iaxes = range(p.matrix.ndim) iaxes[axis1], iaxes[axis0] = iaxes[axis0], iaxes[axis1] p.transpose(iaxes, i=True) return p #--- End: def def set_location_map(self, data_axes, ns=None): ''' Set the `!location` attribute of each partition of the partition matrix in place. :Parameters: data_axes : sequence The axes of the master data array. :Examples: >>> pm.set_location_map(['dim1', 'dim0']) >>> pm.set_location_map([]) ''' matrix = self.matrix shape = matrix.shape axes = self.axes slice_None = slice(None) indices = [slice_None] * matrix.ndim # Never update location in-place for partition in matrix.flat: partition.location = partition.location[:] if ns is None: ns = xrange(len(data_axes)) for axis, n in zip(data_axes, ns): if axis in axes: # ---------------------------------------------------- # This data array axis is also a partition matrix axis # ---------------------------------------------------- m = axes.index(axis) start = 0 for i in xrange(shape[m]): indices[m] = i flat = matrix[indices].flat partition = flat.next() stop = start + partition.shape[n] location = (start, stop) partition.location[n] = location for partition in flat: partition.location[n] = location #--- End: for start = stop #--- End: for indices[m] = slice_None else: # ---------------------------------------------------- # This data array axis is not a partition matrix axis # ---------------------------------------------------- flat = matrix.flat partition = flat.next() location = (0, partition.shape[n]) partition.location[n] = location for partition in flat: partition.location[n] = location #--- End: for #--- End: def def squeeze(self, i=False): ''' Remove all size 1 axes in place. Note that this does not change the master data array. .. seealso:: `expand_dims`, `flip`, `swapaxes`, `transpose` :Returns: out : cf.PartitionMatrix :Examples: >>> pm.shape (1, 2, 1, 2) >>> pm.squeeze() >>> pm.shape (2, 2) >>> pm.shape (1,) >>> pm.squeeze() >>> pm.shape () >>> pm.squeeze() >>> pm.shape () ''' if i: p = self else: p = self.copy() matrix = p.matrix shape = matrix.shape if 1 in shape: p.matrix = matrix.squeeze() axes = p.axes p.axes = [axis for axis, size in izip(axes, shape) if size > 1] return p #--- End: def def transpose(self, axes, i=False): ''' Permute the partition dimensions of the partition matrix in place. Note that this does not change the master data array. .. seealso:: `expand_dims`, `flip`, `squeeze`, `swapaxes` :Parameters: axes : sequence of ints Permute the axes according to the values given. :Returns: out : cf.PartitionMatrix :Examples: >>> pm.ndim 3 >>> pm.transpose((2, 0, 1)) ''' if i: p = self else: p = self.copy() matrix = p.matrix if list(axes) != range(matrix.ndim): p.matrix = matrix.transpose(axes) p_axes = p.axes p.axes = [p_axes[i] for i in axes] return p #--- End: def #--- End: class cf-python-1.3.2/cf/query.py0000644000175000017500000014730212757622406015755 0ustar daviddavid00000000000000from copy import deepcopy from re import match as re_match from itertools import izip from operator import __and__ as operator_and from operator import __or__ as operator_or from numpy import ndarray as numpy_ndarray from numpy import vectorize as numpy_vectorize from .cfdatetime import Datetime, dt from .functions import inspect as cf_inspect from .functions import equals as cf_equals from .functions import equivalent as cf_equivalent from .data.data import Data # ==================================================================== # # Query object # # ==================================================================== class Query(object): '''Store a query operation. The query operation is an operator with a right hand side operand. For example, an operator could be "strictly less than" and a right hand side operand could 3. Such a query (such as "is strictly less than 3?") may be evaluated for an arbitrary left hand side operand, *x* (such as "is *x* strictly less than 3?"). The result of the query is dependent on the object type of left hand side operand, *x*. For example, if *x* is an integer then evaluating "is *x* strictly less than 3?" will result in a boolean; but if *x* is a `numpy` array then "is *x* strictly less than 3?" will likely produce a numpy array of booleans. The query is evaluated with its `evaluate` method or equivalently with the ``==`` operator: >>> q = cf.Query('lt', 3) >>> q.evaluate(2) True >>> 2 == q True >>> q == 2 True >>> 4 == q False The inverse of the query may be evaluated with the ``!=`` operator: >>> q = cf.Query('wi', [3, 5]) >>> q.evaluate(4) True >>> 4 == q True >>> 4 != q False >>> q != 6 True The following operators are supported: ============= ========================================================= ============ operator Description Constructor ============= ========================================================= ============ ``'lt'`` Is *x* strictly less than a value? `cf.lt` ``'le'`` Is *x* less than or equal to a value? `cf.le` ``'gt'`` Is *x* strictly greater than a value? `cf.gt` ``'ge'`` Is *x* greater than or equal to a value? `cf.ge` ``'eq'`` Is *x* equal to a value? `cf.eq` ``'ne'`` Is *x* not equal to a value? `cf.ne` ``'wi'`` Is *x* within a given range of values (range bounds `cf.wi` included)? ``'wo'`` Is *x* without a given range of values (range bounds `cf.wo` excluded)? ``'set'`` Is *x* equal to any member of a collection? `cf.set` ``'contain'`` If cells are defined, is value contained in a cell of `cf.contain` *x*? otherwise is *x* equal to a value? ============= ========================================================= ============ For the ``'wi'``, ``'wo '`` and ``'set'`` operators, if the left hand side operand supports broadcasting over its elements (such as a `numpy` array or a `cf.Field` object) then each element is tested independently. For example: >>> q = cf.Query('wi', [3, 4]) >>> q == [2, 3, 4] False >>> print q == numpy.array([2, 3, 4]) [ False True True] As a convenience, for each operator there is an identically named constructor function which returns the appropriate `cf.Query` object. For example: >>> cf.lt(3) **Compound queries** Multiple queries may be logically combined with the bitwise ``&`` and ``|`` operators to form a new `cf.Query` object. For example: >>> q = cf.ge(3) >>> r = cf.lt(5) >>> s = q & r >>> s >>> >>> 4 == s True >>> t = q | r >>> t >>> 2 == t True Compound queries may be combined further: >>> u = s | cf.wi(1.5, 2.5) >>> u >>> 2 == u True >>> u & t If any of the component queries are for left hand side operand attributes, then these are retained in a compound query. For example: >>> q = cf.ge(3) >>> r = cf.lt(5, attr='bar') >>> s = q & r >>> s = e.addattr('foo') >>> s In this example, >>> x == s is equivalent to >>> (x.foo == cf.ge(3)) & (x.foo.bar == cf.lt(5)) **Attributes** =============== ====================================================== Attribute Description =============== ====================================================== `!attr` An attribute name such that this attribute of the left hand side operand is compared, rather than the operand itself. If there is more than one attribute name then each is interpreted as an attribute of the previous attribute. `!operator` The query operation (such as ``'lt'``, for example). Always `None` for compound queries. `exact` If False then string values are treated as a regular expressions as understood by the :py:obj:`re` module and are evaluated using the :py:obj:`re.match` method. Ignored for all operators except ``'eq'``, ``'ne'`` and ``'set'``. =============== ====================================================== ''' def __init__(self, operator, value, units=None, exact=True, attr=None): '''**Initialization** :Parameters: operator: `str` The query operator. value: The right hand side of the query operation. units: `str` or `cf.Units`, optional The units of *value*. By default, the same units, if any, as the left hand side of the query operation are assumed. exact: `bool`, optional If False then string values are treated as a regular expressions as understood by the :py:obj:`re` module and are evaluated using the :py:obj:`re.match` method. Ignored for all operators except ``'eq'``, ``'ne'`` and ``'set'``. attr: `str`, optional Specify an attribute (or an attribute of an attribute, etc.) of a left hand side operand which is compared, rather than the operand itself. *Example:* ``cf.Query('ge', 2, attr='ndim')`` will return True when evaluated for a numpy array with two or more dimensions. *Example:* ``q=cf.Query('ge', 2, attr='lower_bounds.month')`` will compare the `month` attribute of the `lower_bounds` attribute. I.e. ``q==x`` is equivalent to ``cf.Query('ge', 2)==x.lower_bounds.month``. :Examples: >>> cf.Query('le', 5.6) >>> cf.Query('gt', 5.6, 'metres') )> >>> cf.Query('gt', cf.Data(5.6, 'metres')) )> >>> cf.Query('wi', [2, 56]) >>> cf.Query('set', [2, 56], 'seconds') )> >>> cf.Query('set', cf.Data([2, 56], 'seconds')) )> >>> cf.Query('eq', 'air_temperature') >>> cf.Query('eq', 'temperature', exact=False) >>> cf.Query('gt', 1, attr='ndim') ''' if units is not None: value_units = getattr(value, 'Units', None) if value_units is None: value = Data(value, units) elif not value_units.equivalent(units): raise ValueError("sdfsdfsd99885109^^^^") #--- End: if self._operator = operator self._value = value self._exact = exact self._compound = False # self._attr = () if not attr else (attr,) if attr: self._attr = tuple(attr.split('.')) else: self._attr = () self._bitwise_operator = None self._NotImplemented_RHS_Data_op = True #--- End: def def __deepcopy__(self, memo): ''' Used if copy.deepcopy is called on the variable. ''' return self.copy() #--- End: def def __eq__(self, x): ''' x.__eq__(y) <==> x==y <==> x.evaluate(y) ''' return self._evaluate(x, ()) #--- End: def def __ne__(self, x): ''' x.__ne__(y) <==> x!=y <==> (x==y)==False ''' return self._evaluate(x, ()) == False #--- End: def def __ge__(self, x): raise TypeError("Unsupported operand type(s) for >=: '%s' and '%s'" % (self.__class__.__name__, x.__class__.__name__)) #--- End: def def __gt__(self, x): raise TypeError("Unsupported operand type(s) for >: '%s' and '%s'" % (self.__class__.__name__, x.__class__.__name__)) #--- End: def def __le__(self, x): raise TypeError("Unsupported operand type(s) for <=: '%s' and '%s'" % (self.__class__.__name__, x.__class__.__name__)) #--- End: def def __lt__(self, x): raise TypeError("Unsupported operand type(s) for <: '%s' and '%s'" % (self.__class__.__name__, x.__class__.__name__)) #--- End: def def __and__(self, other): ''' x.__and__(y) <==> x&y ''' Q = type(self) new = Q.__new__(Q) new._operator = None new._exact = True new._compound = (self, other) new._bitwise_operator = operator_and new._attr = () new._NotImplemented_RHS_Data_op = True return new #--- End: def def __iand__(self, other): ''' x.__iand__(y) <==> x&=y ''' return self & other #--- End: def def __or__(self, other): ''' x.__or__(y) <==> x|y ''' Q = type(self) new = Q.__new__(Q) new._operator = None new._exact = True new._compound = (self, other) new._bitwise_operator = operator_or new._attr = () new._NotImplemented_RHS_Data_op = True return new #--- End: def def __ior__(self, other): ''' x.__ior__(y) <==> x|=y ''' return self | other #--- End: def def __repr__(self): ''' x.__repr__() <==> repr(x) ''' return '' % (self.__class__.__name__, self) #--- End: def def __str__(self): ''' x.__str__() <==> str(x) ''' attr = '.'.join(self._attr) if not self._compound: if not self._exact: out = '%s(%s match(%r))' % (attr, self._operator, self._value) else: out = '%s(%s %r)' % (attr, self._operator, self._value) else: bitwise_operator = repr(self._bitwise_operator) if '__and__' in bitwise_operator: bitwise_operator = '&' elif '__or__' in bitwise_operator: bitwise_operator = '|' out = '%s[%s %s %s]' % (attr, self._compound[0], bitwise_operator, self._compound[1]) #--- End: if return out #--- End: def @property def attr(self): ''' :Examples: >>> q = cf.Query('ge', 4) >>> print q.attr None >>> q = cf.Query('le', 6, attr='year') >>> q.attr 'year' >>> q.addattr('foo') >>> q.attr 'year'asdasdas ''' return self._attr #--- End: def @property def operator(self): ''' :Examples: >>> q = cf.Query('ge', 4) >>> q.operator 'ge' >>> q |= cf.Query('le', 6) >>> print q.operator None ''' return self._operator #--- End: def @property def exact(self): ''' :Examples: >>> q = cf.Query('eq', 'foo') >>> q.exact True >>> q = cf.Query('eq', '.*foo', exact=False) >>> q.exact False >>> q |= cf.Query('eq', 'bar') >>> print q.exact False ''' return self._exact #--- End: def @property def value(self): ''' :Examples: >>> q = cf.Query('ge', 4) >>> q.value 4 >>> q |= cf.Query('le', 6) >>> q.value AttributeError: Compound query doesn't have attribute 'value' ''' if not self._compound: return self._value raise AttributeError("Compound query doesn't have attribute 'value'") #--- End: def def addattr(self, attr): '''Return a `cf.Query` object with a new left hand side operand attribute to be used during evaluation. If another attribute has previously been specified, then the new attribute is considered to be an attribute of the existing attribute. :Parameters: attr: str The attribute name. :Returns: out: cf.Query The new query object. :Examples: >>> q = cf.eq(2001) >>> q >>> q = q.addattr('year') >>> q >>> q = cf.lt(2) >>> q = q.addattr('A') >>> q = q.addattr('B') >>> q >>> q = q.addattr('C') >>> q ''' Q = type(self) new = Q.__new__(Q) new.__dict__ = self.__dict__.copy() new._attr += (attr,) new._NotImplemented_RHS_Data_op = True return new #--- End: def def copy(self): ''' Return a deep copy. ``q.copy()`` is equivalent to ``copy.deepcopy(q)``. :Returns: out : The deep copy. :Examples: >>> r = q.copy() ''' return self #--- End: def def dump(self, display=True): ''' Return a string containing a full description of the instance. :Parameters: display: bool, optional If False then return the description as a string. By default the description is printed, i.e. ``q.dump()`` is equivalent to ``print q.dump(display=False)``. :Returns: out: None or str A string containing the description. :Examples: ''' string = str(self) if display: print string else: return string #--- End: def def equals(self, other, traceback=False): ''' ''' if self._compound: if not other._compound: return False if self._bitwise_operator != other._bitwise_operator: return False if not self._compound[0].equals(other._compound[0]): if not self._compound[0].equals(other._compound[1]): return False if not self._compound[1].equals(other._compound[0]): return False elif not self._compound[1].equals(other._compound[1]): return False elif other._compound: return False for attr in ('_NotImplemented_RHS_Data_op', '_attr', '_value', '_operator', '_exact'): if not cf_equals(getattr(self, attr, None), getattr(other, attr, None), traceback=traceback): return False #--- End: for return True #--- End: def def equivalent(self, other, traceback=False): ''' ''' for attr, value in self.__dict__.iteritems(): if not cf_equivalent(value, getattr(other, attr), traceback=traceback): return False #--- End: for return True #--- End: def def evaluate(self, x): ''' Evaluate the query operation for a given left hand side operand. Note that for the query object ``q`` and any object, ``x``, ``x==q`` is equivalent to ``q.evaluate(x)`` and ``x!=q`` is equivalent to ``q.evaluate(x)==False``. :Parameters: x: The object for the left hand side operand of the query. :Returns: out: The result of the query. The nature of the result is dependent on the object type of *x*. :Examples: >>> q = cf.Query('lt', 5.5) >>> q.evaluate(6) False >>> q = cf.Query('wi', (1,2)) >>> array = numpy.arange(4) >>> array array([0, 1, 2, 3]) >>> q.evaluate(array) array([False, True, True, False], dtype=bool) ''' return self._evaluate(x, ()) #--- End: def def _evaluate(self, x, parent_attr): ''' Evaluate the query operation for a given object. .. seealso:: `evaluate` :Parameters: x: object See `evaluate`. parent_attr: tuple :Returns: out: See `evaluate`. :Examples: ''' compound = self._compound attr = parent_attr + self._attr if compound: c = compound[0]._evaluate(x, attr) d = compound[1]._evaluate(x, attr) return self._bitwise_operator(c, d) #--- End: if # Still here? # ------------------------------------------------------------ # # ------------------------------------------------------------ for a in attr: x = getattr(x, a) operator = self._operator value = self._value if operator == 'eq': if not self._exact: if not isinstance(x, basestring): raise ValueError("Can't re.match on non-string") return bool(re_match(value, x)) else: return x == value #--- End: if if operator == 'ne': if not self._exact: if not isinstance(x, basestring): raise ValueError("Can't re.match on non-string") return not re_match(value, x) else: return x != value #--- End: if if operator == 'lt': _lt = getattr(x, '_query_lt', None) if _lt is not None: return _lt(value) return x < value #--- End: if if operator == 'le': _le = getattr(x, '_query_le', None) if _le is not None: return _le(value) return x <= value #--- End: if if operator == 'gt': _gt = getattr(x, '_query_gt', None) if _gt is not None: return _gt(value) return x > value #--- End: if if operator == 'ge': _ge = getattr(x, '_query_ge', None) if _ge is not None: return _ge(value) return x >= value #--- End: if if operator == 'wi': _wi = getattr(x, '_query_wi', None) if _wi is not None: return _wi(value[0], value[1]) return (x >= value[0]) & (x <= value[1]) #--- End: if if operator == 'wo': _wo = getattr(x, '_query_wo', None) if _wo is not None: return _wo(value[0], value[1]) return (x < value[0]) | (x > value[1]) #--- End: if if operator == 'contain': _contain = getattr(x, '_query_contain', None) if _contain is not None: return _contain(value) else: return x == value #--- End: if if operator == 'set': _set = getattr(x, '_query_set', None) if _set is not None: return _set(value, self._exact) i = iter(value) v = i.next() if not self._exact: if not isinstance(x, basestring): raise ValueError("Can't, as yet, regex on non string") if re_match(v, x): return True for v in i: if re_match(v, x): return True return False else: out = (x == v) for v in i: out |= (x == v) return out #--- End: if #--- End: def def inspect(self): ''' Inspect the object for debugging. .. seealso:: `cf.inspect` :Returns: None ''' print cf_inspect(self) #--- End: def #--- End: class def lt(value, units=None, attr=None): '''Return a `cf.Query` object for a variable for being strictly less than a value. .. seealso:: `cf.contain`, `cf.eq`, `cf.ge`, `cf.gt`, `cf.ne`, `cf.le`, `cf.set`, `cf.wi`, `cf.wo` :Parameters: value: object The value which a variable is to be compared with. units: str or cf.Units, optional The units of *value*. By default, the same units as the variable being tested are assumed, if applicable. attr: str, optional Return a query object for a variable's *attr* attribute. :Returns: out: cf.Query The query object. :Examples: >>> q = cf.lt(5) >>> q >>> q.evaluate(4) True >>> q.evaluate(5) False ''' return Query('lt', value, units=units, attr=attr) #--- End: def def le(value, units=None, attr=None): '''Return a `cf.Query` object for a variable for being less than or equal to a value. .. seealso:: `cf.contain`, `cf.eq`, `cf.ge`, `cf.gt`, `cf.ne`, `cf.lt`, `cf.set`, `cf.wi`, `cf.wo` :Parameters: value: object The value which a variable is to be compared with. units: str or cf.Units, optional The units of *value*. By default, the same units as the variable being tested are assumed, if applicable. attr: str, optional Return a query object for a variable's *attr* attribute. :Returns: out: cf.Query The query object. :Examples: >>> q = cf.le(5) >>> q >>> q.evaluate(5) True >>> q.evaluate(6) False ''' return Query('le', value, units=units, attr=attr) #--- End: def def gt(value, units=None, attr=None): '''Return a `cf.Query` object for a variable for being strictly greater than a value. .. seealso:: `cf.contain`, `cf.eq`, `cf.ge`, `cf.ne`, `cf.le`, `cf.lt`, `cf.set`, `cf.wi`, `cf.wo` :Parameters: value: `object` The value which a variable is to be compared with. units: `str` or `cf.Units`, optional The units of *value*. By default, the same units as the variable being tested are assumed, if applicable. attr: `str`, optional Return a query object for a variable's *attr* attribute. :Returns: out: `cf.Query` The query object. :Examples: >>> q = cf.gt(5) >>> q >>> q.evaluate(6) True >>> q.evaluate(5) False ''' return Query('gt', value, units=units, attr=attr) #--- End: def def ge(value, units=None, attr=None): '''Return a `cf.Query` object for a variable for being greater than or equal to a value. .. seealso:: `cf.contain`, `cf.eq`, `cf.gt`, `cf.ne`, `cf.le`, `cf.lt`, `cf.set`, `cf.wi`, `cf.wo` :Parameters: value: The value which a variable is to be compared with. units: `str` or cf.Units, optional The units of *value*. By default, the same units as the variable being tested are assumed, if applicable. attr: `str`, optional Return a query object for a variable's *attr* attribute. :Returns: out: `cf.Query` The query object. :Examples: >>> q = cf.ge(5) >>> q >>> q.evaluate(5) True >>> q.evaluate(4) False >>> cf.ge(10, 'm') )> >>> cf.ge(100, cf.Units('kg')) )> >>> cf.ge(2, attr='month') ''' return Query('ge', value, units=units, attr=attr) #--- End: def def eq(value, units=None, exact=True, attr=None): '''Return a `cf.Query` object for a variable for being equal to a value. .. seealso:: `cf.contain`, `cf.ge`, `cf.gt`, `cf.ne`, `cf.le`, `cf.lt`, `cf.set`, `cf.wi`, `cf.wo` :Parameters: value The value which a variable is to be compared with. units: `str` or `cf.Units`, optional The units of *value*. By default, the same units as the variable being tested are assumed, if applicable. exact: `bool`, optional If False then string values are to be treated as regular expressions understood by the :py:obj:`re` module and are evaluated using the :py:obj:`re.match` method. attr: `str`, optional Return a query object for a variable's *attr* attribute. :Returns: out: `cf.Query` The query object. :Examples: >>> q = cf.eq(5) >>> q >>> q.evaluate(5) True >>> q == 4 False >>> q = cf.eq('air', exact=False) >>> q == 'air_temperature' True >>> q = cf.eq('.*temp', exact=False) >>> q == 'air_temperature' True ''' return Query('eq', value, units=units, exact=exact, attr=attr) #--- End: def def ne(value, units=None, exact=True, attr=None): '''Return a `cf.Query` object for a variable for being equal to a value. .. seealso:: `cf.contain`, `cf.eq`, `cf.ge`, `cf.gt`, `cf.le`, `cf.lt`, `cf.set`, `cf.wi`, `cf.wo` :Parameters: value: `object` The value which a variable is to be compared with. units: `str` or cf.Units, optional The units of *value*. By default, the same units as the variable being tested are assumed, if applicable. exact: `bool`, optional If False then string values are to be treated as regular expressions understood by the :py:obj:`re` module and are evaluated using the :py:obj:`re.match` method. attr: `str`, optional Return a query object for a variable's *attr* attribute. :Returns: out: `cf.Query` The query object. :Examples: >>> q = cf.ne(5) >>> q >>> q.evaluate(4) True >>> q.evaluate(5) False ''' return Query('ne', value, units=units, exact=exact, attr=attr) #--- End: def def wi(value0, value1, units=None, attr=None): '''Return a `cf.Query` object for a variable being within a range. ``x == cf.wi(a, b)`` is equivalent to ``x == cf.ge(a) & cf.le(b)``. ``x == cf.wi(a, b, attr='foo')`` is equivalent to ``x.foo == cf.wi(a, b)``. .. seealso:: `cf.contain`, `cf.eq`, `cf.ge`, `cf.gt`, `cf.ne`, `cf.le`, `cf.lt`, `cf.set`, `cf.wo` :Parameters: value0: scalar object The lower bound of the range which a variable is to be compared with. value1: scalar object The upper bound of the range which a variable is to be compared with. units: `str` or cf.Units, optional If applicable, the units of *value0* and *value1*. By default, the same units as the variable being tested are assumed. attr: `str`, optional Return a query object for a variable's *attr* attribute. :Returns: out: `cf.Query` The query object. :Examples: >>> q = cf.wi(5, 7) >>> q >>> q.evaluate(6) True >>> q.evaluate(4) False ''' return Query('wi', [value0, value1], units=units, attr=attr) #--- End: def def wo(value0, value1, units=None, attr=None): '''Return a `cf.Query` object for a variable for being without a range. ``x == cf.wo(a, b)`` is equivalent to ``x == cf.lt(a) | cf.gt(b)``. .. seealso:: `cf.contain`, `cf.eq`, `cf.ge`, `cf.gt`, `cf.ne`, `cf.le`, `cf.lt`, `cf.set`, `cf.wi` :Parameters: value0: object The lower bound of the range which a variable is to be compared with. value1: object The upper bound of the range which a variable is to be compared with. units: `str` or cf.Units, optional If applicable, the units of *value0* and *value1*. By default, the same units as the variable being tested are assumed. attr: `str`, optional Return a query object for a variable's *attr* attribute. :Returns: out: `cf.Query` The query object. :Examples: >>> q = cf.wo(5) >>> q >>> q.evaluate(4) True >>> q.evaluate(6) False ''' return Query('wo', [value0, value1], units=units, attr=attr) #--- End: def def set(values, units=None, exact=True, attr=None): '''Return a `cf.Query` object for a variable for being equal to any member of a collection. .. seealso:: `cf.contain`, `cf.eq`, `cf.ge`, `cf.gt`, `cf.ne`, `cf.le`, `cf.lt`, `cf.wi`, `cf.wo` :Parameters: values: sequence units: `str` or cf.Units, optional The units of each element of *values*. By default, the same units as the variable being tested are assumed, if applicable. exact: `bool`, optional If False then string values are to be treated as regular expressions understood by the :py:obj:`re` module and are evaluated using the :py:obj:`re.match` method. attr: `str`, optional Return a query object for a variable's *attr* attribute. :Returns: out: `cf.Query` The query object. :Examples: >>> c = cf.set([3, 5]) >>> c >>> c == 4 False >>> c == 5 True >>> print c == numpy.array([2, 3, 4, 5]) [False True False True] ''' return Query('set', values, units=units, exact=exact, attr=attr) #--- End: def def contain(value, units=None, attr=None): '''Return a `cf.Query` object for cells of a variable for containing a value. If cells are not defined then return a `cf.Query` object for a variable for being equal to a value, i.e. this case is equivalent to `cf.eq`. .. versionadded:: 1.0 .. seealso:: `cf.eq`, `cf.ge`, `cf.gt`, `cf.ne`, `cf.le`, `cf.lt`, `cf.set`, `cf.wi`, `cf.wo` :Parameters: value: The value which a variable is to be compared with. units: `str` or cf.Units, optional The units of each element of *values*. By default, the same units as the variable being tested are assumed, if applicable. attr: `str`, optional Return a query object for a variable's *attr* attribute. :Returns: out: `cf.Query` The query object. :Examples: >>> cf.contain(30, 'degrees_east') )> >>> cf.contain(cf.Data(10, 'km')) )> >>> c >>> print c.bounds.array [[ 0 90] [ 90 180] [180 270] [270 360]] >>> print (cf.contain(100) == c).array [False True False False] >>> print (cf.contain(9999) == c).array [False False False False] ''' return Query('contain', value, units=units, attr=attr) #--- End: def def year(value): '''Return a `cf.Query` object for date-time years. In this context, any object which has a `!year` attribute is considered to be a date-time variable. If *value* is a `cf.Query` object then ``cf.year(value)`` is equivalent to ``value.addattr('year')``. Otherwise ``cf.year(value)`` is equivalent to ``cf.eq(value, attr='year')``. .. seealso:: `cf.year`, `cf.month`, `cf.day`, `cf.hour`, `cf.minute`, `cf.second`, `cf.dteq`, `cf.dtge`, `cf.dtgt`, `cf.dtne`, `cf.dtle`, `cf.dtlt` :Parameters: value: Either the value that the year is to be compared with, or a `cf.Query` object for testing the year. :Returns: out: `cf.Query` The query object. :Examples: >>> d = cf.dt(2002, 6, 16) >>> d == cf.year(2002) True >>> d == cf.year(cf.le(2003)) True >>> d == cf.year(2001) False >>> d == cf.year(cf.wi(2003, 2006)) False ''' if isinstance(value, Query): return value.addattr('year') else: return Query('eq', value, attr='year') #--- End: def def month(value): '''Return a `cf.Query` object for date-time months. In this context, any object which has a `!month` attribute is considered to be a date-time variable. If *value* is a `cf.Query` object then ``cf.month(value)`` is equivalent to ``value.addattr('month')``. Otherwise ``cf.month(value)`` is equivalent to ``cf.eq(value, attr='month')``. .. seealso:: `cf.year`, `cf.day`, `cf.hour`, `cf.minute`, `cf.second`, `cf.dteq`, `cf.dtge`, `cf.dtgt`, `cf.dtne`, `cf.dtle`, `cf.dtlt` :Parameters: value: Either the value that the month is to be compared with, or a `cf.Query` object for testing the month. :Returns: out: `cf.Query` The query object. :Examples: >>> d = cf.dt(2002, 6, 16) >>> d == cf.month(6) True >>> d == cf.month(cf.le(7)) True >>> d == cf.month(7) False >>> d == cf.month(cf.wi(1, 6)) True ''' if isinstance(value, Query): return value.addattr('month') else: return Query('eq', value, attr='month') #--- End: def def day(value): '''Return a `cf.Query` object for date-time days. In this context, any object which has a `!day` attribute is considered to be a date-time variable. If *value* is a `cf.Query` object then ``cf.day(value)`` is equivalent to ``value.addattr('day')``. Otherwise ``cf.day(value)`` is equivalent to ``cf.eq(value, attr='day')``. .. seealso:: `cf.year`, `cf.month`, `cf.hour`, `cf.minute`, `cf.second`, `cf.dteq`, `cf.dtge`, `cf.dtgt`, `cf.dtne`, `cf.dtle`, `cf.dtlt` :Parameters: value: Either the value that the day is to be compared with, or a `cf.Query` object for testing the day. :Returns: out: `cf.Query` The query object. :Examples: >>> d = cf.dt(2002, 6, 16) >>> d == cf.day(16) True >>> d == cf.day(cf.le(19)) True >>> d == cf.day(7) False >>> d == cf.day(cf.wi(1, 21)) True ''' if isinstance(value, Query): return value.addattr('day') else: return Query('eq', value, attr='day') #--- End: def def hour(value): '''Return a `cf.Query` object for date-time hours. In this context, any object which has a `!hour` attribute is considered to be a date-time variable. If *value* is a `cf.Query` object then ``cf.hour(value)`` is equivalent to ``value.addattr('hour')``. Otherwise ``cf.hour(value)`` is equivalent to ``cf.eq(value, attr='hour')``. .. seealso:: `cf.year`, `cf.month`, `cf.day`, `cf.minute`, `cf.second`, `cf.dteq`, `cf.dtge`, `cf.dtgt`, `cf.dtne`, `cf.dtle`, `cf.dtlt` :Parameters: value: Either the value that the hour is to be compared with, or a `cf.Query` object for testing the hour. :Returns: out: `cf.Query` The query object. :Examples: >>> d = cf.dt(2002, 6, 16, 18) >>> d == cf.hour(18) True >>> d == cf.hour(cf.le(19)) True >>> d == cf.hour(7) False >>> d == cf.hour(cf.wi(6, 23)) True ''' if isinstance(value, Query): return value.addattr('hour') else: return Query('eq', value, attr='hour') #--- End: def def minute(value): ''' Return a `cf.Query` object for date-time minutes. In this context, any object which has a `!minute` attribute is considered to be a date-time variable. If *value* is a `cf.Query` object then ``cf.minute(value)`` is equivalent to ``value.addattr('minute')``. Otherwise ``cf.minute(value)`` is equivalent to ``cf.eq(value, attr='minute')``. .. seealso:: `cf.year`, `cf.month`, `cf.day`, `cf.hour`, `cf.second`, `cf.dteq`, `cf.dtge`, `cf.dtgt`, `cf.dtne`, `cf.dtle`, `cf.dtlt` :Parameters: value: Either the value that the minute is to be compared with, or a `cf.Query` object for testing the minute. :Returns: out: `cf.Query` The query object. :Examples: >>> d = cf.dt(2002, 6, 16, 18, 30, 0) >>> d == cf.minute(30) True >>> d == cf.minute(cf.le(45)) True >>> d == cf.minute(7) False >>> d == cf.minute(cf.wi(15, 45)) True ''' if isinstance(value, Query): return value.addattr('minute') else: return Query('eq', value, attr='minute') #--- End: def def second(value): ''' Return a `cf.Query` object for date-time seconds. In this context, any object which has a `!second` attribute is considered to be a date-time variable. If *value* is a `cf.Query` object then ``cf.second(value)`` is equivalent to ``value.addattr('second')``. Otherwise ``cf.second(value)`` is equivalent to ``cf.eq(value, attr='second')``. .. seealso:: `cf.year`, `cf.month`, `cf.day`, `cf.hour`, `cf.minute`, `cf.dteq`, `cf.dtge`, `cf.dtgt`, `cf.dtne`, `cf.dtle`, `cf.dtlt` :Parameters: value: Either the value that the second is to be compared with, or a `cf.Query` object for testing the second. :Returns: out: `cf.Query` The query object. :Examples: >>> d = cf.dt(2002, 6, 16, 18, 30, 0) >>> d == cf.second(0) True >>> d == cf.second(cf.le(30)) True >>> d == cf.second(30) False >>> d == cf.second(cf.wi(0, 30)) True ''' if isinstance(value, Query): return value.addattr('second') else: return Query('eq', value, attr='second') #--- End: def def cellsize(value, units=None): '''Return a `cf.Query` object for the cell size of a coordinate object. In this context, a coordinate is any object which has a `!cellsize` attribute. If *value* is a `cf.Query` object then ``cf.cellsize(value)`` is equivalent to ``value.addattr('cellsize')`` (see `cf.Query.addattr`). Otherwise ``cf.cellsize(value)`` is equivalent to ``cf.eq(value, attr='cellsize')``. .. seealso:: `cf.cellge`, `cf.cellgt`, `cf.celllt`, `cf.cellle`, `cf.cellwi`, `cf.cellwo`, `cf.eq` :Parameters: value: Either the value that the cell size is to be compared with, or a `cf.Query` object for testing the cell size. :Returns: out: `cf.Query` The query object. :Examples: >>> cf.cellsize(cf.lt(5, 'km')) )> >>> cf.cellsize(5) >>> cf.cellsize(cf.Data(5, 'km')) )> >>> cf.cellsize(cf.Data(5, 'km')) )> >>> cf.cellsize(5, units='km') )> ''' if isinstance(value, Query): return value.addattr('cellsize') else: return Query('eq', value, units=units, attr='cellsize') #--- End: def def dtge(*args, **kwargs): ''' Return a `cf.Query` object for a variable being not earlier than a date-time. ``cf.dtge(*args, **kwargs)`` is equivalent to ``cf.ge(cf.dt(*args, **kwargs))``. .. seealso:: `cf.year`, `cf.month`, `cf.day`, `cf.hour`, `cf.minute`, `cf.second`, `cf.dteq`, `cf.dtgt`, `cf.dtne`, `cf.dtle`, `cf.dtlt` :Parameters: args, kwargs : Positional and keyword arguments for defining a date-time. See `cf.dt` for details. :Returns: out: `cf.Query` The query object. :Examples: >>> d = cf.dt(2002, 6, 16) >>> d == cf.dtge(1990, 1, 1) True >>> d == cf.dtge(2002, 6, 16) True >>> d == cf.dtge('2100-1-1') False >>> d == cf.dtge('2001-1-1') & cf.dtle(2010, 12, 31) True The last example is equivalent to: >>> d == cf.wi(cf.dt(2001, 1, 1), cf.dt('2010-12-31')) True ''' return Query('ge', dt(*args, **kwargs)) #--- End: def def dtgt(*args, **kwargs): ''' Return a `cf.Query` object for a variable being later than a date-time. ``cf.dtgt(*args, **kwargs)`` is equivalent to ``cf.gt(cf.dt(*args, **kwargs))``. .. seealso:: `cf.year`, `cf.month`, `cf.day`, `cf.hour`, `cf.minute`, `cf.second`, `cf.dteq`, `cf.dtge`, `cf.dtne`, `cf.dtle`, `cf.dtlt` :Parameters: args, kwargs : Positional and keyword arguments for defining a date-time. See `cf.dt` for details. :Returns: out: `cf.Query` The query object. :Examples: >>> d = cf.dt(2002, 6, 16) >>> d == cf.dtgt(1990, 1, 1) True >>> d == cf.dtgt(2002, 6, 16) False >>> d == cf.dtgt('2100-1-1') False >>> d == cf.dtgt('2001-1-1') & cf.dtle(2010, 12, 31) True The last example is equivalent to: >>> d == cf.wi(cf.dt(2001, 1, 1), cf.dt('2010-12-31')) True ''' return Query('gt', dt(*args, **kwargs)) #--- End: def def dtle(*args, **kwargs): ''' Return a `cf.Query` object for a variable being not later than a date-time. ``cf.dtle(*args, **kwargs)`` is equivalent to ``cf.le(cf.dt(*args, **kwargs))``. .. seealso:: `cf.year`, `cf.month`, `cf.day`, `cf.hour`, `cf.minute`, `cf.second`, `cf.dteq`, `cf.dtge`, `cf.dtgt`, `cf.dtne`, `cf.dtlt` :Parameters: args, kwargs : Positional and keyword arguments for defining a date-time. See `cf.dt` for details. :Returns: out: `cf.Query` The query object. :Examples: >>> d = cf.dt(2002, 6, 16) >>> d == cf.dtle(1990, 1, 1) True >>> d == cf.dtle(2002, 6, 16) True >>> d == cf.dtle('2100-1-1') False >>> d == cf.dtle('2001-1-1') & cf.dtle(2010, 12, 31) True The last example is equivalent to: >>> d == cf.wi(cf.dt(2001, 1, 1), cf.dt('2010-12-31')) True ''' return Query('le', dt(*args, **kwargs)) #--- End: def def dtlt(*args, **kwargs): ''' Return a `cf.Query` object for a variable being earlier than a date-time. ``cf.dtlt(*args, **kwargs)`` is equivalent to ``cf.lt(cf.dt(*args, **kwargs))``. .. seealso:: `cf.year`, `cf.month`, `cf.day`, `cf.hour`, `cf.minute`, `cf.second`, `cf.dteq`, `cf.dtge`, `cf.dtgt`, `cf.dtne`, `cf.dtle` :Parameters: args, kwargs : Positional and keyword arguments for defining a date-time. See `cf.dt` for details. :Returns: out: `cf.Query` The query object. :Examples: >>> d = cf.dt(2002, 6, 16) >>> d == cf.dtlt(1990, 1, 1) True >>> d == cf.dtlt(2002, 6, 16) True >>> d == cf.dtlt('2100-1-1') False >>> d == cf.dtlt('2001-1-1') & cf.dtlt(2010, 12, 31) True The last example is equivalent to: >>> d == cf.wi(cf.dt(2001, 1, 1), cf.dt('2010-12-31')) True ''' return Query('lt', dt(*args, **kwargs)) #--- End: def def dteq(*args, **kwargs): ''' Return a `cf.Query` object for a variable being equal to a date-time. ``cf.dteq(*args, **kwargs)`` is equivalent to ``cf.eq(cf.dt(*args, **kwargs))``. .. seealso:: `cf.year`, `cf.month`, `cf.day`, `cf.hour`, `cf.minute`, `cf.second`, `cf.dtge`, `cf.dtgt`, `cf.dtne`, `cf.dtle`, `cf.dtlt` :Parameters: args, kwargs : Positional and keyword arguments for defining a date-time. See `cf.dt` for details. :Returns: out: `cf.Query` The query object. :Examples: >>> d = cf.dt(2002, 6, 16) >>> d == cf.dteq(1990, 1, 1) True >>> d == cf.dteq(2002, 6, 16) True >>> d == cf.dteq('2100-1-1') False >>> d == cf.dteq('2001-1-1') & cf.dteq(2010, 12, 31) True The last example is equivalent to: >>> d == cf.wi(cf.dt(2001, 1, 1), cf.dt('2010-12-31')) True ''' return Query('eq', dt(*args, **kwargs)) #--- End: def def dtne(*args, **kwargs): ''' Return a `cf.Query` object for a variable being not equal to a date-time. ``cf.dtne(*args, **kwargs)`` is equivalent to ``cf.ne(cf.dt(*args, **kwargs))``. .. seealso:: `cf.year`, `cf.month`, `cf.day`, `cf.hour`, `cf.minute`, `cf.second`, `cf.dteq`, `cf.dtge`, `cf.dtgt`, `cf.dtle`, `cf.dtlt` :Parameters: args, kwargs : Positional and keyword arguments for defining a date-time. See `cf.dt` for details. :Returns: out: `cf.Query` The query object. :Examples: >>> d = cf.dt(2002, 6, 16) >>> d == cf.dtne(1990, 1, 1) True >>> d == cf.dtne(2002, 6, 16) True >>> d == cf.dtne('2100-1-1') False >>> d == cf.dtne('2001-1-1') & cf.dtne(2010, 12, 31) True The last example is equivalent to: >>> d == cf.wi(cf.dt(2001, 1, 1), cf.dt('2010-12-31')) True ''' return Query('ne', dt(*args, **kwargs)) #--- End: def def cellwi(value0, value1, units=None): '''Return a `cf.Query` object for coordinate cell bounds being within a range. In this context, a coordinate is any object which has `!lower_bounds` and `!upper_bounds` attributes. ``cf.cellwi(value0, value1)`` is equivalent to ``cf.ge(value0, attr='lower_bounds') & cf.le(value1, attr='upper_bounds')``. .. versionadded:: 1.0 .. seealso:: `cf.cellge`, `cf.cellgt`, `cf.cellle`, `cf.celllt`, `cf.cellsize`, `cf.cellwo`, `cf.wi` :Parameters: :Returns: out: `cf.Query` The query object. :Examples: ''' return (Query('ge', value0, units=units, attr='lower_bounds') & Query('le', value1, units=units, attr='upper_bounds')) #--- End: def def cellwo(value0, value1, units=None): '''Return a `cf.Query` object for coordinate cell bounds being outside a range. In this context, a coordinate is any object which has `!lower_bounds` and `!upper_bounds` attributes. ``cf.cellwo(value0, value1)`` is equivalent to ``cf.lt(value0, attr='lower_bounds') & cf.gt(value1, attr='upper_bounds')``. .. versionadded:: 1.0 .. seealso:: `cf.cellge`, `cf.cellgt`, `cf.cellle`, `cf.celllt`, `cf.cellsize`, `cf.cellwi`, `cf.wo` :Parameters: :Returns: out: `cf.Query` The query object. :Examples: ''' return (Query('lt', value0, units=units, attr='lower_bounds') & Query('gt', value1, units=units, attr='upper_bounds')) #--- End: def def cellgt(value, units=None): '''Return a `cf.Query` object for coordinate cell bounds being strictly greater than a value. In this context, a coordinate is any object which has a `!lower_bounds` attribute. ``cf.cellgt(value)`` is equivalent to ``cf.gt(value, attr='lower_bounds')``. .. versionadded:: 1.0 .. seealso:: `cf.cellge`, `cf.cellle`, `cf.celllt`, `cf.cellsize`, `cf.cellwi`,`cf.cellwo`, `cf.gt` :Parameters: :Returns: out: `cf.Query` The query object. :Examples: ''' return Query('gt', value, units=units, attr='lower_bounds') #--- End: def def cellge(value, units=None): '''Return a `cf.Query` object for coordinate cell bounds being greater than or equal to a value. In this context, a coordinate is any object which has a `!lower_bounds` attribute. ``cf.cellge(value)`` is equivalent to ``cf.ge(value, attr='lower_bounds')``. .. versionadded:: 1.0 .. seealso:: `cf.cellgt`, `cf.cellle`, `cf.celllt`, `cf.cellsize`, `cf.cellwi`,`cf.cellwo`, `cf.gt` :Parameters: :Returns: out: `cf.Query` The query object. :Examples: ''' return Query('ge', value, units=units, attr='lower_bounds') #--- End: def def celllt(value, units=None): '''Return a `cf.Query` object for coordinate cell bounds being strictly less than a value. In this context, a coordinate is any object which has a `!upper_bounds` attribute. ``cf.celllt(value)`` is equivalent to ``cf.lt(value, attr='upper_bounds')``. .. versionadded:: 1.0 .. seealso:: `cf.cellge`, `cf.cellgt`, `cf.cellle`, `cf.cellsize`, `cf.cellwi`,`cf.cellwo`, `cf.le` :Parameters: :Returns: out: `cf.Query` The query object. :Examples: ''' return Query('lt', value, units=units, attr='upper_bounds') #--- End: def def cellle(value, units=None): '''Return a `cf.Query` object for coordinate cell bounds being less than or equal to a value. In this context, a coordinate is any object which has a `!upper_bounds` attribute. ``cf.cellle(value)`` is equivalent to ``cf.le(value, attr='upper_bounds')``. .. versionadded:: 1.0 .. seealso:: `cf.cellge`, `cf.cellgt`, `cf.celllt`, `cf.cellsize`, `cf.cellwi`,`cf.cellwo`, `cf.lt` :Parameters: :Returns: out: `cf.Query` The query object. :Examples: ''' return Query('le', value, units=units, attr='upper_bounds') #--- End: def def jja(): '''Return a `cf.Query` object for season June, July, August. ``cf.jja()`` is equivalent to ``cf.month(cf.wi(6, 8))``. .. versionadded:: 1.0 .. seealso:: `cf.djf`, `cf.mam`, `cf.son`, `cf.seasons`, `cf.month`, `cf.wi` :Returns: out: `cf.Query` The query object. :Examples: >>> f >>> f.subspace(time=cf.jja()) ''' return Query('wi', (6, 8), attr='month') #--- End: def def son(): '''Return a `cf.Query` object for season September, October, November. ``cf.son()`` is equivalent to ``cf.month(cf.wi(9, 11))``. .. versionadded:: 1.0 .. seealso:: `cf.djf`, `cf.mam`, `cf.jja`, `cf.seasons`, `cf.month`, `cf.wi` :Returns: out: `cf.Query` The query object. :Examples: >>> f >>> f.subspace(time=cf.son()) ''' return Query('wi', (9, 11), attr='month') #--- End: def def djf(): '''Return a `cf.Query` object for season December, January, February. ``cf.djf()`` is equivalent to ``cf.month(cf.ge(12) | cf.le(2))``. .. versionadded:: 1.0 .. seealso:: `cf.mam`, `cf.jja`, `cf.son`, `cf.seasons`, `cf.month`, `cf.ge`, `cf.le` :Returns: out: `cf.Query` The query object. :Examples: >>> f >>> f.subspace(time=cf.djf()) ''' q = Query('ge', 12) | Query('le', 2) return q.addattr('month') #--- End: def def mam(): '''Return a `cf.Query` object for the season March, April, May. ``cf.mam()`` is equivalent to ``cf.month(cf.wi(3, 5))``. .. versionadded:: 1.0 .. seealso:: `cf.djf`, `cf.jja`, `cf.son`, `cf.seasons`, `cf.month`, `cf.wi` :Returns: out: `cf.Query` The query object. :Examples: >>> f >>> f.subspace(time=cf.mam()) ''' return Query('wi', (3, 5), attr='month') #--- End: def def seasons(n=4, start=12): '''Return a list `cf.Query` objects for all seasons in a year. .. versionadded:: 1.0 .. seealso:: `cf.mam`, `cf.jja`, `cf.son`, `cf.djf` :Parameters: n: `int`, optional The number of seasons in the year. By default there are four seasons. start: `int`, optional The start month of the first season of the year. By default this is 12 (December). :Returns: out: `list` of `cf.Query` The query objects. :Examples: >>> cf.seasons() [, , , ] >>> cf.seasons(4, 1) [, , , ] >>> cf.seasons(3, 6) [, , ] >>> cf.seasons(3) [, , ] >>> cf.seasons(3, 6) [, , ] >>> cf.seasons(12) [, , , , , , , , , , , ] >>> cf.seasons(1, 4) [] ''' if 12 % n: raise ValueError( "Number of seasons must divide into 12. Got %s" % n) if not 1 <= start <= 12 or int(start) != start: raise ValueError( "Start month must be integer between 1 and 12. Got %s" % start) out = [] inc = int(12 / n) start = int(start) m0 = start for i in range(int(n)): m1 = ((m0 + inc) % 12) - 1 if not m1: m1 = 12 elif m1 == -1: m1 = 11 if m0 < m1: q = Query('wi', (m0, m1)) elif m0 > m1: q = Query('ge', m0) | Query('le', m1) else: q = Query('eq', m0) out.append(q.addattr('month')) m0 = m1 + 1 if m0 > 12: m0 = 1 #--- End: for return out #--- End: def # -------------------------------------------------------------------- # Vectorized # -------------------------------------------------------------------- def _match(regex, x): return bool(re_match(regex, x)) _array_match = numpy_vectorize(_match, otypes=[bool]) cf-python-1.3.2/cf/coordinatebounds.py0000600000175000017500000000754312701457477020147 0ustar daviddavid00000000000000from .variable import Variable # ==================================================================== # # CoordinateBounds object # # ==================================================================== class CoordinateBounds(Variable): ''' A CF coordinate's bounds object containing cell boundaries or intervals of climatological time. The parent coordinate's `!climatology` attribute indicates which type of bounds are present. ''' # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def lower_bounds(self): ''' The lower coordinate bounds in a `cf.Data` object. ``b.lower_bounds`` is equivalent to ``b.data.min(axes=-1)``. .. seealso:: `upper_bounds` :Examples: >>> print b.array [[ 5 3] [ 3 1] [ 1 -1]] >>> b.lower_bounds >>> print b.lower_bounds.array [ 3 1 -1] ''' if not self._hasData: raise ValueError("Can't get lower bounds when there are no bounds") return self.data.min(-1).squeeze(-1, i=True) #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def upper_bounds(self): ''' The upper coordinate bounds in a `cf.Data` object. ``b.upper_bounds`` is equivalent to ``b.data.max(axes=-1)``. .. seealso:: `lower_bounds` :Examples: >>> print b.array [[ 5 3] [ 3 1] [ 1 -1]] >>> b.upper_bounds >>> b.upper_bounds.array array([5, 3, 1]) ''' if not self._hasData: raise ValueError("Can't get upper bounds when there are no bounds") return self.data.max(-1).squeeze(-1, i=True) #--- End: def def contiguous(self, overlap=True, direction=None): ''' Return True if the bounds are contiguous. Bounds are contiguous if the cell boundaries match up, or overlap, with the boundaries of adjacent cells. In general, it is only possible for 1 or 0 dimensional coordinates with bounds to be contiguous, but size 1 coordinates with any number of dimensions are always contiguous. An exception occurs if the coordinate is multdimensional and has more than one element. ''' if not self._hasData: return False nbounds = self.shape[-1] if self.size == nbounds: return True if nbounds == 4 and self.ndim ==3: if overlap == True: raise ValueError("Cannot tell if 2D coordinate bounds are" + " contiguous if overlap is True.") bnd = self.array for j in xrange(self.shape[0] - 1): for i in xrange(self.shape[1] - 1): # check cells (j, i) and cells (j, i+1) are contiguous if bnd[j,i,1] != bnd[j,i+1,0] or \ bnd[j,i,2] != bnd[j,i+1,3]: return False # check cells (j, i) and (j+1, i) are contiguous if bnd[j,i,3] != bnd[j+1,i,0] or \ bnd[j,i,2] != bnd[j+1,i,1]: return False return True if nbounds > 2 or self.ndim > 2: raise ValueError( "Can't tell if a multidimensional coordinate bounds are contiguous") data = self.Data if not overlap: return data[1:, 0].equals(data[:-1, 1]) else: if direction is None: b = data[(0,)*(data.ndim-1)].array direction = b.item(0,) < b.item(1,) #--- End: if if direction: return (data[1:, 0] <= data[:-1, 1]).all() else: return (data[1:, 0] >= data[:-1, 1]).all() #--- End: def #--- End: class cf-python-1.3.2/cf/cellmethods.py0000644000175000017500000012167512745346616017123 0ustar daviddavid00000000000000import collections from copy import deepcopy from re import sub as re_sub from re import search as re_search from ast import literal_eval as ast_literal_eval from .functions import equals from .functions import inspect as cf_inspect from .data.data import Data from . import _found_ESMF _collapse_cell_methods = { 'max' : 'maximum', 'mean' : 'mean', 'mid_range' : 'mid_range', 'min' : 'minimum', 'range' : 'range', 'sd' : 'standard_deviation', 'sum' : 'sum', 'var' : 'variance', 'sample_size' : None, 'sum_of_weights' : None, 'sum_of_weights2': None, } # ==================================================================== # # _CellMethod object # # ==================================================================== class _CellMethod(object): '''**Attributes** ============ ======================================================== Attribute Description ============ ======================================================== `!names` `!intervals` `!method` `!over` `!where` `!within` `!comment` `!axes` ============ ======================================================== ''' def __init__(self): ''' ''' self.axes = () self.names = () self.intervals = () self.method = None self.comment = None self.where = None self.within = None self.over = None #--- End: def def __deepcopy__(self, memo): ''' Used if copy.deepcopy is called on the variable. ''' return self.copy() #--- End: def def __hash__(self): ''' x.__hash__() <==> hash(x) ''' return hash(str(self)) #--- End: if def __repr__(self): ''' x.__repr__() <==> repr(x) ''' return '' % str(self) #--- End: def def __str__(self): ''' x.__str__() <==> str(x) Return a CF-netCDF-like string of the cell method. Note that if the intention use this string in a CF-netCDF cell_methods attribute then the cell method's `!name` attribute may need to be modified, where appropriate, to reflect netCDF variable names. ''' string = [] x = [] for axis, name in zip(self.axes, self.names): if name is None: if axis is not None: name = axis else: name = '?' x.append('%s:' % name) #--- End: for string.extend(x) method = self.method if method is None: method = '' string.append(method) for portion in ('within', 'where', 'over'): p = getattr(self, portion, None) if p is not None: string.extend((portion, p)) #--- End: for intervals = self.intervals if intervals: x = ['('] y = ['interval: %s' % data for data in intervals] x.append(' '.join(y)) if self.comment is not None: x.append(' comment: %s' % self.comment) x.append(')') string.append(''.join(x)) elif self.comment is not None: string.append('(%s)' % self.comment) return ' '.join(string) #--- End: def def __eq__(self): ''' x.__eq__(y) <==> x==y ''' return self.equals(y) #--- End: def def __ne__(self, other): ''' x.__ne__(y) <==> x!=y ''' return not self.__eq__(other) #--- End: def def copy(self): ''' Return a deep copy. ``c.copy()`` is equivalent to ``copy.deepcopy(c)``. :Returns: out : The deep copy. :Examples: >>> d = c.copy() ''' new = _CellMethod.__new__(_CellMethod) new.axes = self.axes new.names = self.names new.method = self.method new.comment = self.comment new.where = self.where new.within = self.within new.over = self.over new.intervals = tuple([data.copy() for data in self.intervals]) return new #--- End: def def equals(self, other, rtol=None, atol=None, ignore_fill_value=False, traceback=False): ''' True if two cell methods are equal, False otherwise. The `!axes` attribute is ignored in the comparison. :Parameters: other : The object to compare for equality. atol : float, optional The absolute tolerance for all numerical comparisons, By default the value returned by the `ATOL` function is used. rtol : float, optional The relative tolerance for all numerical comparisons, By default the value returned by the `RTOL` function is used. ignore_fill_value : bool, optional If True then data arrays with different fill values are considered equal. By default they are considered unequal. traceback : bool, optional If True then print a traceback highlighting where the two instances differ. :Returns: out : bool Whether or not the two instances are equal. :Examples: ''' if self is other: return True # Check that each instance is the same type if self.__class__ != other.__class__: if traceback: print("%s: Different types: %s != %s" % (self.__class__.__name__, self.__class__.__name__, other.__class__.__name__)) return False #--- End: if names0 = self.names names1 = other.names # indices0 = sorted(range(len(names0)), key=names0.__getitem__) # indices1 = sorted(range(len(names1)), key=names1.__getitem__) # names0 = sorted(names0) # names1 = sorted(names1) if names0 != names1: if traceback: print("%s: Different names: %s != %s" % (CellMethods.__name__, names0, names1)) return False if None in names0 or None in names0: if traceback: print("%s: Missing names: %s, %s" % (CellMethods.__name__, names0, names1)) return False #--- End: if for attr in ('method', 'within', 'over', 'where', 'comment'): x = getattr(self, attr) y = getattr(other, attr) if x != y: if traceback: print("%s: Different %s: %r != %r" % (CellMethods.__name__, attr, x, y)) return False intervals0 = self.intervals intervals1 = other.intervals if intervals0: if not intervals1: if traceback: print("%s: Different intervals: %r != %r" % (CellMethods.__name__, intervals0, intervals1)) return False #--- End: if if len(intervals0) != len(intervals1): if traceback: print("%s: Different intervals: %r != %r" % (CellMethods.__name__, intervals0, intervals1)) return False #--- End: if for data0, data1 in zip(intervals0, intervals1): if not data0.equals(data1, rtol=rtol, atol=atol, ignore_fill_value=ignore_fill_value, traceback=traceback): if traceback: print("%s: Different intervals: %r != %r" % (CellMethods.__name__, data0, data1)) return False elif intervals1: if traceback: print("%s: Different intervals: %r != %r" % (CellMethods.__name__, intervals0, intervals1)) return False #--- End: if return True #--- End: def def equivalent(self, other, rtol=None, atol=None, traceback=False): ''' True if two cell methods are equivalent, False otherwise. The `axes` attribute is ignored in the comparison. :Parameters: other : The object to compare for equality. atol : float, optional The absolute tolerance for all numerical comparisons, By default the value returned by the `ATOL` function is used. rtol : float, optional The relative tolerance for all numerical comparisons, By default the value returned by the `RTOL` function is used. :Returns: out : bool Whether or not the two instances are equivalent. :Examples: ''' if self is other: return True # Check that each instance is the same type if self.__class__ != other.__class__: if traceback: print("%s: Different types: %s != %s" % (CellMethods.__name__, self.__class__.__name__, other.__class__.__name__)) return False #--- End: if names0 = self.names names1 = other.names indices0 = sorted(range(len(names0)), key=names0.__getitem__) indices1 = sorted(range(len(names1)), key=names1.__getitem__) names0 = sorted(names0) names1 = sorted(names1) if None in names0 or None in names1 or names0 != names1: if traceback: print("%s: Nonequivalent names: %r, %r" % (CellMethods.__name__, names0, names1)) return False #--- End: if for attr in ('method', 'within', 'over', 'where', 'comment'): x = getattr(self, attr) y = getattr(other, attr) if x != y: if traceback: print("%s: Nonequivalent %s: %r, %r" % (CellMethods.__name__, attr, x, y)) return False #--- End: if intervals0 = self.intervals intervals1 = other.intervals if intervals0: if not intervals1: if traceback: print("%s: Nonequivalent intervals: %r, %r" % (CellMethods.__name__, intervals0, intervals1)) return False #--- End: if if len(intervals0) == 1: intervals0 = intervals0 * len(names0) if len(intervals1) == 1: intervals1 = intervals1 * len(names1) if len(intervals0) != len(intervals1): if traceback: print("%s: Nonequivalent intervals: %r, %r" % (CellMethods.__name__, intervals0, intervals1)) return False #--- End: if # Sort the intervals intervals0 = [intervals0[i] for i in indices0] intervals1 = [intervals1[i] for i in indices1] for data0, data1 in zip(intervals0, intervals1): if not data0.allclose(data1, rtol=rtol, atol=atol): if traceback: print("%s: Nonequivalent intervals: %r, %r" % (CellMethods.__name__, data0, data1)) return False elif intervals1: if traceback: print("%s: Nonequivalent intervals: %r, %r" % (CellMethods.__name__, intervals0, intervals1)) return False #--- End: if return True #--- End: def def inspect(self): ''' Inspect the attributes. .. seealso:: `cf.inspect` :Returns: None ''' print cf_inspect(self) #--- End: def #--- End: def # ==================================================================== # # CellMethods object # # ==================================================================== class CellMethods(collections.MutableSequence): ''' A CF cell methods object to describe the characteristic of a field that is represented by cell values. ''' def __init__(self, cell_methods=None): ''' **Initialization** :Parameters: string : str, optional Initialize new instance from a CF-netCDF-like cell methods string. See the `parse` method for details. By default an empty cell methods is created. :Examples: >>> c = cf.CellMethods() >>> c = cf.CellMethods('time: max: height: mean') ''' if not cell_methods: self._list = [] elif isinstance(cell_methods, basestring): self._list = [] self._parse(cell_methods) else: self._list = list(cell_methods) #--- End: def def __delitem__(self, index): ''' x.__delitem__(index) <==> del x[index] ''' del self._list[index] #--- End: def def __deepcopy__(self, memo): ''' Used if copy.deepcopy is called on the variable. ''' return self.copy() #--- End: def def __getitem__(self, index): ''' x.__getitem__(index) <==> x[index] s ''' if isinstance(index, (int, long)): return type(self)((self._list[index],)) else: return type(self)(self._list[index]) #--- End: def def __hash__(self): ''' x.__hash__() <==> hash(x) ''' return hash(str(self)) #--- End: if def __len__(self): ''' x.__len__() <==> len(x) ''' return len(self._list) #--- End: def def __repr__(self): ''' x.__repr__() <==> repr(x) ''' return '' % (self.__class__.__name__, str(self)) #--- End: def def __setitem__(self, index, value): ''' x.__setitem__(index, value) <==> x[index]=value ''' if not isinstance(value, self.__class__): raise ValueError( "Can't assign %s to %s[%s]" % (value.__class__.__name__, self.__class__.__name__, index)) if isinstance(index, (int, long)): index = slice(index, index+1) self._list[index] = value._list #--- End: def def __str__(self): ''' x.__str__() <==> str(x) ''' return ' '.join([str(cm) for cm in self._list]) #--- End: def def __eq__(self, other): ''' x.__eq__(y) <==> x==y ''' return self.equals(other) #--- End: def def __ne__(self, other): ''' x.__ne__(y) <==> x!=y ''' return not self.__eq__(other) #--- End: def def __add__(self, other): ''' x.__add__(y) <==> x+y ''' new = self.copy() new.extend(other) return new #--- End: def def __mul__(self, other): ''' x.__mul__(n) <==> x*n ''' return type(self)(self._list * other) #--- End: def def __rmul__(self, other): ''' x.__rmul__(n) <==> n*x ''' return self * other #--- End: def def __iadd__(self, other): ''' x.__iadd__(y) <==> x+=y ''' self.extend(other) return self #--- End: def def __imul__(self, other): ''' x.__imul__(n) <==> x*=n ''' self._list = self._list * other return self #--- End: def def _parse(self, string=None): ''' Parse a CF cell_methods string into this `cf.CellMethods` instance in place. :Parameters: string : str, optional The CF cell_methods string to be parsed into the `cf.CellMethods` object. By default the cell methods will be empty. :Returns: None :Examples: >>> c = cf.CellMethods() >>> c = c._parse('time: minimum within years time: mean over years (ENSO years)') >>> print c Cell methods : time: minimum within years time: mean over years (ENSO years) ''' if not string: self._list[:] = [] return # Split the cell_methods string into a list of strings ready # for parsing into the result list. E.g. # 'lat: mean (interval: 1 hour)' # maps to # ['lat:', 'mean', '(', 'interval:', '1', 'hour', ')'] cell_methods = re_sub('\((?=[^\s])' , '( ', string) cell_methods = re_sub('(?<=[^\s])\)', ' )', cell_methods).split() while cell_methods: cm = _CellMethod() axes = [] names = [] while cell_methods: if not cell_methods[0].endswith(':'): break # Check that "name" ebds with colon? How? ('lat: mean (area-weighted) or lat: mean (interval: 1 degree_north comment: area-weighted)') names.append(cell_methods.pop(0)[:-1]) axes.append(None) #--- End: while cm.axes = tuple(axes) cm.names = tuple(names) if not cell_methods: self.append(cm) break # Method cm.method = cell_methods.pop(0) if not cell_methods: self.append(cm) break # Climatological statistics and statistics which apply to # portions of cells while cell_methods[0] in ('within', 'where', 'over'): attr = cell_methods.pop(0) setattr(cm, attr, cell_methods.pop(0)) if not cell_methods: break #--- End: while if not cell_methods: self.append(cm) break # interval and comment intervals = [] if cell_methods[0].endswith('('): cell_methods.pop(0) if not (re_search('^(interval|comment):$', cell_methods[0])): cell_methods.insert(0, 'comment:') while not re_search('^\)$', cell_methods[0]): term = cell_methods.pop(0)[:-1] if term == 'interval': interval = cell_methods.pop(0) if cell_methods[0] != ')': units = cell_methods.pop(0) else: units = None try: # parsed_interval = float(ast_literal_eval(interval)) parsed_interval = ast_literal_eval(interval) except: raise ValueError( "Unparseable cell methods interval: {0!r}".format( interval+' '+units if units is not None else interval)) try: intervals.append(Data(parsed_interval, units)) except: raise ValueError( "Unparseable cell methods interval: {0!r}".format( interval+' '+units if units is not None else interval)) continue #--- End: if if term == 'comment': comment = [] while cell_methods: if cell_methods[0].endswith(')'): break if cell_methods[0].endswith(':'): break comment.append(cell_methods.pop(0)) #--- End: while cm.comment = ' '.join(comment) #--- End: if #--- End: while if cell_methods[0].endswith(')'): cell_methods.pop(0) #--- End: if n_intervals = len(intervals) if n_intervals > 1 and n_intervals != len(names): raise ValueError("0798798 ") cm.intervals = tuple(intervals) self.append(cm) #--- End: while #--- End: def @property def axes(self): return tuple([cm.axes for cm in self._list]) @axes.setter def axes(self, value): if len(self._list) != 1: raise ValueError( "Must select a %s element to update. Consider c[i].axes=value" % self.__class__.__name__) if not isinstance(value, (tuple, list)): raise ValueError("%s axes attribute must be a tuple or list" % self.__class__.__name__) self._list[0].axes = tuple(value) #--- End: def @axes.deleter def axes(self): if len(self._list) != 1: raise ValueError( "Must select a %s element to update. Consider del c[i].axes" % self.__class__.__name__) self._list[0].axes = () #--- End: def @property def comment(self): ''' Each cell method's comment keyword. ''' return tuple([cm.comment for cm in self._list]) @comment.deleter def comment(self): if len(self._list) != 1: raise ValueError( "Must select a %s element to update. Consider del c[i].comment" % self.__class__.__name__) self._list[0].comment = None #--- End: def @property def method(self): ''' Each cell method's method keyword. These describe how the cell values of field have been determined or derived. :Examples: >>> c = cf.CellMethods('time: minimum area: mean') >>> c >>> c.method ['minimum', 'mean'] >>> c[1].method = 'variance' >>> c.method ['minimum', 'variance'] >>> c >>> d = c[1] >>> d >>> d.method ['variance'] >>> d.method = 'maximum' >>> d.method ['maximum'] >>> c ''' return tuple([cm.method for cm in self._list]) #--- End: def @method.setter def method(self, value): if len(self._list) != 1: raise ValueError( "Must select a %s element to update. Consider c[i].method=value" % self.__class__.__name__) self._list[0].method = value #--- End: def @method.deleter def method(self): if len(self._list) != 1: raise ValueError( "Must select a %s element to update. Consider del c[i].method" % self.__class__.__name__) self._list[0].method = None #--- End: def @property def names(self): ''' Each cell method's name keyword(s). :Examples: >>> c = cf.CellMethods('time: minimum area: mean') >>> c >>> c.names (('time',), ('area',)) >>> c[1].names = ['lat', 'lon'] >>> c.names (('time',), ('lat', 'lon')) >>> c >>> d = c[1] >>> d >>> d.names (('lat', 'lon'),) >>> d.names = ('area',) >>> d.names (('area',),) >>> c ''' return tuple([cm.names for cm in self._list]) @names.setter def names(self, value): if len(self._list) != 1: raise ValueError( "Must select a %s element to update. Consider c[i].names=value" % self.__class__.__name__) if not isinstance(value, (list, tuple)): raise ValueError("%s names attribute must be a tuple or list" % self.__class__.__name__) self._list[0].names = tuple(value) # Make sure that axes has the same number of elements as names len_value = len(value) if len_value != len(self.axes[0]): self.axes = (None,) * len_value #--- End: def @names.deleter def names(self): if len(self._list) != 1: raise ValueError( "Must select a %s element to update. Consider del c[i].names" % self.__class__.__name__) self._list[0].names = () #--- End: def @property def intervals(self): ''' Each cell method's interval keyword(s). :Examples: >>> c = cf.CellMethods('time: minimum (interval: 1 hr) lat: lon: mean (interval: 0.1 degree_N interval: 0.2 degree_E)') >>> c >>> c.intervals [[], [, ]] >>> c[0].intervals = ['3600 seconds'] >>> c.intervals >>> c[0].intervals [[]] >>> c[0].intervals = [cf.Data(60, 'minutes')] >>> c[0].intervals [[]] >>> c[0].intervals = [1] >>> c[0].intervals [[]] >>> del c[0].intervals >>> c.intervals >>> [[], [, ]] >>> c ''' return tuple([cm.intervals for cm in self._list]) @intervals.setter def intervals(self, value): if len(self._list) != 1: raise ValueError( "Must select a %s element to update. Consider c[i].intervals=value" % self.__class__.__name__) if not isinstance(value, (tuple, list)): raise ValueError( "%s intervals attribute must be a tuple or list, not a %s" % (self.__class__.__name__, value.__class__.__name__)) # Parse the intervals values = [] for interval in value: if isinstance(interval, basestring): i = interval.split() try: x = ast_literal_eval(i.pop(0)) except: raise ValueError( "Unparseable cell methods interval: %r" % interval) if interval: units = ' '.join(i) else: units = None try: d = Data(x, units) except: raise ValueError( "Unparseable cell methods interval: %r" % interval) else: try: d = Data.asdata(interval, copy=True) except: raise ValueError( "Unparseable cell methods interval: %r" % interval) #--- End: if if d.size != 1: raise ValueError( "Unparseable cell methods interval: %r" % interval) if d.ndim > 1: d.squeeze(i=True) values.append(d) #--- End: for self._list[0].intervals = tuple(values) #--- End: def @intervals.deleter def intervals(self): if len(self._list) != 1: raise ValueError( "Must select a %s element to update. Consider del c[i].intervals" % self.__class__.__name__) self._list[0].intervals = () #--- End: def @property def over(self): ''' Each cell method's over keyword. These describe how climatological statistics have been derived. .. seealso:: `within` :Examples: >>> c = cf.CellMethods('time: minimum area: mean') >>> c >>> c.over [None, None] >>> c[0].within = 'years' >>> c[1].over = 'years' >>> c.over >>> [None, 'years'] >>> c >>> d = c[1] >>> d >>> del d.over >>> d.over [None] >>> d >>> del c[0].within >>> c.within () >>> c ''' return tuple([cm.over for cm in self._list]) #--- End: def @over.setter def over(self, value): if len(self._list) != 1: raise ValueError( "Must select a %s element to update. Consider c[i].over=value" % self.__class__.__name__) self._list[0].over = value #--- End: def @over.deleter def over(self): if len(self._list) != 1: raise ValueError( "Must select a %s element to update. Consider del c[i].over" % self.__class__.__name__) self._list[0].over = None #--- End: def @property def where(self): ''' Each cell method's where keyword. ''' return tuple([cm.where for cm in self._list]) #--- End: def @where.setter def where(self, value): if len(self._list) != 1: raise ValueError("Must select a %s element to update. Consider c[i].where=value" % self.__class__.__name__) self._list[0].where = value #--- End: def @where.deleter def where(self): if len(self._list) != 1: raise ValueError( "Must select a %s element to update. Consider del c[i].where" % self.__class__.__name__) self._list[0].where = None #--- End: def @property def within(self): ''' Each cell method's within keyword. These describe how climatological statistics have been derived. .. seealso:: `over` :Examples: >>> c = cf.CellMethods('time: minimum area: mean') >>> c >>> c.within (None, None) >>> c[0].within = 'years' >>> c[1].over = 'years' >>> c.within >>> ('years', None) >>> c >>> d = c[0] >>> d >>> del d.within >>> d.within (None,) >>> d >>> del c[1].over >>> c ''' return tuple([cm.within for cm in self._list]) #--- End: def @within.setter def within(self, value): if len(self._list) != 1: raise ValueError( "Must select a %s element to update. Consider c[i].within=value" % self.__class__.__name__) self._list[0].within = value #--- End: def @within.deleter def within(self): if len(self._list) != 1: raise ValueError( "Must select a %s element to update. Consider del c[i].within" % self.__class__.__name__) self._list[0].within = None #--- End: def def copy(self): ''' Return a deep copy. ``c.copy()`` is equivalent to ``copy.deepcopy(c)``. :Returns: out : The deep copy. :Examples: >>> d = c.copy() ''' new = CellMethods.__new__(CellMethods) new._list = [cm.copy() for cm in self._list] return new #--- End: def def dump(self, display=True, prefix=None): ''' Return a string containing a full description of the instance. If a cell methods 'name' is followed by a '*' then that cell method is relevant to the data in a way which may not be precisely defined its corresponding dimension or dimensions. :Parameters: display : bool, optional If False then return the description as a string. By default the description is printed, i.e. ``c.dump()`` is equivalent to ``print c.dump(display=False)``. prefix : str, optional Set the common prefix of component names. By default the instance's class name is used. :Returns: out : None or str A string containing the description. :Examples: ''' if prefix is None: prefix = self.__class__.__name__ string = [] for i, cm in enumerate(self._list): string.append('%s[%d] -> %s' % (prefix, i, cm)) string = '\n'.join(string) if display: print string else: return string #--- End: def def equals(self, other, rtol=None, atol=None, ignore_fill_value=False, traceback=False): ''' True if two cell methods are equal, False otherwise. The `axes` attribute is ignored in the comparison. :Parameters: other : The object to compare for equality. atol : float, optional The absolute tolerance for all numerical comparisons, By default the value returned by the `ATOL` function is used. rtol : float, optional The relative tolerance for all numerical comparisons, By default the value returned by the `RTOL` function is used. ignore_fill_value : bool, optional If True then data arrays with different fill values are considered equal. By default they are considered unequal. traceback : bool, optional If True then print a traceback highlighting where the two instances differ. :Returns: out : bool Whether or not the two instances are equal. :Examples: ''' if self is other: return True # Check that each instance is the same type if self.__class__ != other.__class__: if traceback: print("%s: Different types: %s != %s" % (self.__class__.__name__, self.__class__.__name__, other.__class__.__name__)) return False #--- End: if if len(self._list) != len(other._list): if traceback: print("%s: Different numbers of methods: %d != %d" % (self.__class__.__name__, len(self._list), len(other._list))) return False #--- End: if for cm0, cm1 in zip(self._list, other._list): if not cm0.equals(cm1, rtol=rtol, atol=atol, ignore_fill_value=ignore_fill_value, traceback=traceback): return False #--- End: for return True #--- End: def def equivalent(self, other, rtol=None, atol=None, traceback=False): ''' True if two cell methods are equivalent, False otherwise. The `axes` attributes are ignored in the comparison. :Parameters: other : The object to compare for equality. atol : float, optional The absolute tolerance for all numerical comparisons, By default the value returned by the `ATOL` function is used. rtol : float, optional The relative tolerance for all numerical comparisons, By default the value returned by the `RTOL` function is used. :Returns: out : bool Whether or not the two instances are equivalent. :Examples: ''' if self is other: return True # Check that each instance is the same type if self.__class__ != other.__class__: if traceback: print("%s: Different types: %s != %s" % (self.__class__.__name__, self.__class__.__name__, other.__class__.__name__)) return False #--- End: if if len(self._list) != len(other._list): if traceback: print("%s: Different numbers of methods: %d != %d" % (self.__class__.__name__, len(self._list), len(other._list))) return False #--- End: if for cm0, cm1 in zip(self._list, other._list): if not cm0.equivalent(cm1, rtol=rtol, atol=atol, traceback=traceback): return False #--- End: for return True #--- End: def def has_cellmethod(self, other): ''' Return True if and only if this cell methods is a super set of another. :Parameters: other : cf.CellMethods The other cell methods for comparison. :Returns: out : bool Whether or not this cell methods is a super set of the other. :Examples: ''' if len(other) != 1: return False found_match = False cm1 = other._list[0] for cm in self._list: if cm.equivalent(cm1): found_match = True break #--- End: for return found_match #--- End: def def extend(self, value): self._list.extend(value._list) #--- End: def def insert(self, index, value): self._list.insert(index, value) #--- End: def def inspect(self): ''' Inspect the attributes. .. seealso:: `cf.inspect` :Returns: None ''' print cf_inspect(self) #--- End: def def netcdf_translation(self, f): ''' Translate netCDF variable names stored in the `!names` attribute into `axes` and `names` attributes. :Parameters: f : cf.Field The field which provides the translation. :Returns: out : cf.CellMethods A new cell methods instance with translated names. :Examples: >>> c = cf.CellMethods('t: mean lon: mean') >>> c.names = (('t',), ('lon',)) >>> c.axes = ((None,), (None,)) >>> d = c.netcdf_translation(f) >>> d.names = (('time',), ('longitude',)) >>> d.axes = (('dim0',), ('dim2',)) >>> d >> c = cf.CellMethods('t: mean lon: mean') >>> c.names = (('t',), ('lon',)) >>> c.axes = ((None,), (None,)) >>> d = c.netcdf_translation(f) >>> d.names = (('time',), ('longitude',)) >>> d.axes = (('dim0',), ('dim2',)) >>> d >> c = cf.CellMethods('t: mean lon: mean') >>> c.names = (('t',), ('lon',)) >>> c.axes = ((None,), (None,)) >>> d = c.netcdf_translation(f) >>> d.names = (('time',), ('longitude',)) >>> d.axes = (('dim0',), ('dim2',)) >>> d x==y <==> x.equals(y) ''' return self.equals(other) #--- End: def def __ne__(self, other): ''' x.__ne__(y) <==> x!=y <==> not x.equals(y) ''' return not self.equals(other) #--- End: def def __hash__(self): ''' Return the hash value of the flags. Note that the flags will be sorted in place. :Returns: out: `int` The hash value. :Examples: >>> hash(f) -956218661958673979 ''' self.sort() x = [tuple(getattr(self, attr, ())) for attr in ('_flag_meanings', '_flag_values', '_flag_masks')] return hash(tuple(x)) #--- End: def def __nonzero__(self): ''' x.__nonzero__() <==> x!=0 ''' for attr in ('_flag_meanings', '_flag_values', '_flag_masks'): if hasattr(self, attr): return True #--- End: for return False #-- End: def # ---------------------------------------------------------------- # Property attribute: flag_values # ---------------------------------------------------------------- @property def flag_values(self): ''' The flag_values CF attribute. Stored as a 1-d numpy array but may be set as any array-like object. :Examples: >>> f.flag_values = ['a', 'b', 'c'] >>> f.flag_values array(['a', 'b', 'c'], dtype='|S1') >>> f.flag_values = numpy.arange(4, dtype='int8') >>> f.flag_values array([1, 2, 3, 4], dtype=int8) >>> f.flag_values = 1 >>> f.flag_values array([1]) ''' try: return self._flag_values except AttributeError: raise AttributeError("'%s' has no attribute 'flag_values'" % self.__class__.__name__) #--- End: def @flag_values.setter def flag_values(self, value): if not isinstance(value, numpy_ndarray): value = numpy_atleast_1d(value) self._flag_values = value #--- End: def @flag_values.deleter def flag_values(self): try: del self._flag_values except AttributeError: raise AttributeError("Can't delete '%s' attribute 'flag_values'" % self.__class__.__name__) #--- End: def # ---------------------------------------------------------------- # Property attribute: flag_masks # ---------------------------------------------------------------- @property def flag_masks(self): ''' The flag_masks CF attribute. Stored as a 1-d numpy array but may be set as array-like object. :Examples: >>> f.flag_masks = numpy.array([1, 2, 4], dtype='int8') >>> f.flag_masks array([1, 2, 4], dtype=int8) >>> f.flag_masks = 1 >>> f.flag_masks array([1]) ''' try: return self._flag_masks except AttributeError: raise AttributeError("'%s' object has no attribute 'flag_masks'" % self.__class__.__name__) #--- End: def @flag_masks.setter def flag_masks(self, value): if not isinstance(value, numpy_ndarray): value = numpy_atleast_1d(value) self._flag_masks = value #--- End: def @flag_masks.deleter def flag_masks(self): try: del self._flag_masks except AttributeError: raise AttributeError("Can't delete '%s' attribute 'flag_masks'" % self.__class__.__name__) #--- End: def # ---------------------------------------------------------------- # Property attribute: flag_meanings # ---------------------------------------------------------------- @property def flag_meanings(self): ''' The flag_meanings CF attribute. Stored as a 1-d numpy string array but may be set as a space delimited string or any array-like object. :Examples: >>> f.flag_meanings = 'low medium high' >>> f.flag_meanings array(['low', 'medium', 'high'], dtype='|S6') >>> f.flag_meanings = ['left', 'right'] >>> f.flag_meanings array(['left', 'right'], dtype='|S5') >>> f.flag_meanings = 'ok' >>> f.flag_meanings array(['ok'], dtype='|S2') >>> f.flag_meanings = numpy.array(['a', 'b']) >>> f.flag_meanings array(['a', 'b'], dtype='|S1') ''' try: return self._flag_meanings except AttributeError: raise AttributeError("'%s' object has no attribute 'flag_meanings'" % self.__class__.__name__) #--- End: def @flag_meanings.setter def flag_meanings(self, value): if isinstance(value, basestring): value = numpy_atleast_1d(value.split()) elif not isinstance(value, numpy_ndarray): value = numpy_atleast_1d(value) self._flag_meanings = value #--- End: def @flag_meanings.deleter def flag_meanings(self): try: del self._flag_meanings except AttributeError: raise AttributeError("Can't delete '%s' attribute 'flag_meanings'" % self.__class__.__name__) #--- End: def def __repr__(self): ''' x.__repr__() <==> repr(x) ''' string = [] if hasattr(self, 'flag_values'): string.append('flag_values=%s' % str(self.flag_values)) if hasattr(self, 'flag_masks'): string.append('flag_masks=%s' % str(self.flag_masks)) if hasattr(self, 'flag_meanings'): string.append('flag_meanings=%s' % str(self.flag_meanings)) return '' % (self.__class__.__name__, ', '.join(string)) #--- End: def def copy(self): ''' Return a deep copy. Equivalent to ``copy.deepcopy(f)`` :Returns: out: `cf.Flags` The deep copy. :Examples: >>> f.copy() ''' return deepcopy(self) #--- End: def def dump(self, display=True, _level=0): ''' Return a string containing a full description of the instance. :Parameters: display: `bool`, optional If False then return the description as a string. By default the description is printed, i.e. ``f.dump()`` is equivalent to ``print f.dump(display=False)``. :Returns: out: `None` or `str` A string containing the description. :Examples: ''' indent0 = ' ' * _level indent1 = ' ' * (_level+1) string = ['%sFlags:' % indent0] for attr in ('_flag_values', '_flag_meanings', '_flag_masks'): value = getattr(self, attr, None) if value is not None: string.append('%s%s = %s' % (indent1, attr[1:], list(value))) #--- End: for string = '\n'.join(string) if display: print string else: return string #--- End: def def equals(self, other, rtol=None, atol=None, ignore_fill_value=False, traceback=False): ''' True if two groups of flags are logically equal, False otherwise. Note that both instances are sorted in place prior to the comparison. :Parameters: other: The object to compare for equality. atol: `float`, optional The absolute tolerance for all numerical comparisons, By default the value returned by the `ATOL` function is used. rtol: `float`, optional The relative tolerance for all numerical comparisons, By default the value returned by the `RTOL` function is used. ignore_fill_value: `bool`, optional If True then data arrays with different fill values are considered equal. By default they are considered unequal. traceback: `bool`, optional If True then print a traceback highlighting where the two instances differ. :Returns: out: `bool` Whether or not the two instances are equal. :Examples: >>> f >>> g >>> f.equals(g) True >>> f >>> g ''' # Check that each instance is the same type if self.__class__ != other.__class__: if traceback: print("%s: Different type: %s, %s" % (self.__class__.__name__, self.__class__.__name__, other.__class__.__name__)) return False #--- End: if self.sort() other.sort() # Set default tolerances if rtol is None: rtol = RTOL() if atol is None: atol = ATOL() for attr in ('_flag_meanings', '_flag_values', '_flag_masks'): if hasattr(self, attr): if not hasattr(other, attr): if traceback: print("%s: Different attributes: %s" % (self.__class__.__name__, attr[1:])) return False x = getattr(self, attr) y = getattr(other, attr) if (x.shape != y.shape or not equals(x, y, rtol=rtol, atol=atol, ignore_fill_value=ignore_fill_value, traceback=traceback)): if traceback: print("%s: Different '%s': %r, %r" % (self.__class__.__name__, attr[1:], x, y)) return False elif hasattr(other, attr): if traceback: print("%s: Different attributes: %s" % (self.__class__.__name__, attr[1:])) return False #--- End: for return True #--- End: def def inspect(self): ''' Inspect the object for debugging. .. seealso:: `cf.inspect` :Returns: `None` ''' print cf_inspect(self) #--- End: def def sort(self): ''' Sort the flags in place. By default sort by flag values. If flag values are not present then sort by flag meanings. If flag meanings are not present then sort by flag_masks. :Returns: `None` :Examples: >>> f >>> f.sort() >>> f ''' if not self: return # Sort all three attributes for attr in ('flag_values', '_flag_meanings', '_flag_masks'): if hasattr(self, attr): indices = numpy_argsort(getattr(self, attr)) break #--- End: for for attr in ('_flag_values', '_flag_meanings', '_flag_masks'): if hasattr(self, attr): array = getattr(self, attr).view() array[...] = array[indices] #--- End: for #--- End: def #--- End: class cf-python-1.3.2/cf/field.py0000644000175000017500000171603412765460072015676 0ustar daviddavid00000000000000from numpy import argmax as numpy_argmax from numpy import array as numpy_array from numpy import can_cast as numpy_can_cast from numpy import diff as numpy_diff from numpy import empty as numpy_empty from numpy import ndarray as numpy_ndarray from numpy import size as numpy_size from numpy import squeeze as numpy_squeeze from numpy import unique as numpy_unique from numpy import where as numpy_where from numpy import zeros as numpy_zeros from numpy import array_equal as numpy_array_equal from numpy import arange as numpy_arange from numpy import tile as numpy_tile from numpy.ma import MaskedArray as numpy_MaskedArray from numpy.ma import is_masked as numpy_is_masked from copy import deepcopy from itertools import izip from operator import mul as operator_mul from operator import itemgetter as operator_itemgetter from matplotlib.path import Path #from scipy.ndimage.filters import convolve1d from .cellmeasure import CellMeasure from .cellmethods import CellMethods from .constants import masked as cf_masked from .domain import Domain from .flags import Flags from .functions import parse_indices, CHUNKSIZE, equals, RTOL, ATOL from .functions import _section from .query import Query, ge, gt, le, lt, ne, eq, wi from .timeduration import TimeDuration from .units import Units from .variable import Variable, SubspaceVariable, RewriteDocstringMeta from .data.data import Data from .regrid import Regrid from .coordinate import DimensionCoordinate # -------------------------------------------------------------------- # Commonly used units # -------------------------------------------------------------------- _units_days = Units('days') _units_radians = Units('radians') _units_m = Units('m') _units_m2 = Units('m2') _1_day = Data(1, 'day') # -------------------------------------------------------------------- # Map each allowed input collapse method name to its corresponding # cf.Data method. Input collapse methods not in this sictionary are # assumed to have a corresponding cf.Data method with the same name. # -------------------------------------------------------------------- _collapse_methods = { 'mean' : 'mean', 'avg' : 'mean', 'average' : 'mean', 'max' : 'max', 'maximum' : 'max', 'min' : 'min', 'minimum' : 'min', 'mid_range' : 'mid_range', 'range' : 'range', 'standard_deviation': 'sd', 'sd' : 'sd', 'sum' : 'sum', 'variance' : 'var', 'var' : 'var', 'sample_size' : 'sample_size', 'sum_of_weights' : 'sum_of_weights', 'sum_of_weights2' : 'sum_of_weights2', } # -------------------------------------------------------------------- # Map each allowed input collapse method name to its corresponding # cf.Data method. Input collapse methods not in this sictionary are # assumed to have a corresponding cf.Data method with the same name. # -------------------------------------------------------------------- _collapse_cell_methods = { 'point' : 'point', 'mean' : 'mean', 'avg' : 'mean', 'average' : 'mean', 'max' : 'maximum', 'maximum' : 'maximum', 'min' : 'minimum', 'minimum' : 'minimum', 'mid_range' : 'mid_range', 'range' : 'range', 'standard_deviation': 'standard_deviationd', 'sd' : 'standard_deviation', 'sum' : 'sum', 'variance' : 'variance', 'var' : 'variance', 'sample_size' : None, 'sum_of_weights' : None, 'sum_of_weights2' : None, } # -------------------------------------------------------------------- # Map each cf.Data method to its corresponding minimum number of # elements. cf.Data methods not in this dictionary are assumed to have # a minimum number of elements equal to 1. # -------------------------------------------------------------------- _collapse_min_size = {'sd' : 2, 'var': 2, } # -------------------------------------------------------------------- # These cf.Data methods may be weighted # -------------------------------------------------------------------- _collapse_weighted_methods = set(('mean', 'avg', 'average', 'sd', 'standard_deviation', 'var', 'variance', 'sum_of_weights', 'sum_of_weights2', )) # -------------------------------------------------------------------- # These cf.Data methods may specify a number of degrees of freedom # -------------------------------------------------------------------- _collapse_ddof_methods = set(('sd', 'var', )) # ==================================================================== # # Field object # # ==================================================================== class Field(Variable): ''' A field construct according to the CF data model. A field is a container for a data array and metadata comprising properties to describe the physical nature of the data and a coordinate system (called a domain) which describes the positions of each element of the data array. The field's domain may contain dimensions and auxiliary coordinate and cell measure objects (which themselves contain data arrays and properties to describe them) and coordinate reference objects. All components of a field are optional. **Miscellaneous** Field objects are picklable. ''' _special_properties = Variable._special_properties.union( ('ancillary_variables', 'cell_methods', 'flag_values', 'flag_masks', 'flag_meanings') ) def __init__(self, properties={}, attributes={}, data=None, domain=None, flags=None, ancillary_variables=None, axes=None, auto_cyclic=True, copy=True): '''**Initialization** :Parameters: properties: dict, optional Provide the new field with CF properties from the dictionary's key/value pairs. data: cf.Data, optional Provide the new field with an N-dimensional data array in a `cf.Data` object. domain: cf.Domain, optional Provide the new field with a coordinate system in a `cf.Domain` object. By default an empty domain is created. attributes: dict, optional Provide the new field with attributes from the dictionary's key/value pairs. flags: cf.Flags, optional Provide the new field with self-describing flag values. ancillary_variables: `cf.FieldList`, optional Provide the new field with ancillary variable fields. axes: sequence of `str`, optional A list of domain axis identifiers (``'dimN'``), stating the axes, in order, of field's data array. By default these axis identifiers will be the sequence of consecutive axis identifiers ``'dim0'`` up to ``'dimM'``, where ``M`` is the number of axes of the data array, or an empty sequence if the data array is a scalar. If an axis of the data array already exists in the domain then the it must have the same size as the domain axis. If it does not exist in the domain then a new axis will be created. By default the axes will either be those defined for the data array by the domain or, if these do not exist, the domain axis identifiers whose sizes unambiguously match the data array. auto_cyclic: `bool`, optional If False then do not auto-detect cyclic axes. By default cyclic axes are auto-detected with the `autocyclic` method. copy: `bool`, optional If False then do not deep copy arguments prior to initialization. By default arguments are deep copied. ''' # Initialize the new field with attributes and CF properties super(Field, self).__init__(properties=properties, attributes=attributes, copy=copy) # self._unlimited = None # Domain if domain is not None: if not copy: self.domain = domain else: self.domain = domain.copy() else: # A field always has a domain self.domain = Domain() # Data array if data is not None: self.insert_data(data, axes=axes, copy=copy) # Flags if flags is not None: if not copy: self.Flags = flags else: self.Flags = flags.copy() #--- End: if # Ancillary variables if ancillary_variables is not None: if not copy: self.ancillary_variables = ancillary_variables else: self.ancillary_variables = ancillary_variables.copy() #--- End: if # Cyclic axes if auto_cyclic: self.autocyclic() #--- End: def def __getitem__(self, index): ''' Called to implement evaluation of f[index]. f.__getitem__(index) <==> f[index] The field is treated as if it were a single element field list containing itself, i.e. ``f[index]`` is equivalent to ``cf.FieldList(f)[index]``. :Examples 1: >>> g = f[0] >>> g = f[:1] >>> g = f[1:] :Returns: out: `cf.Field` or `cf.FieldList` If *index* is the integer 0 or -1 then the field itself is returned. If *index* is a slice then a field list is returned which is either empty or else contains a single element of the field itself. .. seealso:: `cf.FieldList.__getitem__`, `subspace` :Examples 2: >>> f[0] is f[-1] is f True >>> f[0:1].equals(cf.FieldList(f)) True >>> f[0:1][0] is f True >>> f[1:].equals(cf.FieldList()) True >>> f[1:] [] >>> f[-1::3][0] is f True ''' # if isinstance(index, slice): # n = len((None,)[index]) # if n == 1: # return FieldList(self) # elif not n: # return FieldList() # else: # raise IndexError("%s index out of range: %s" % # (self.__class__.__name__, index)) # #--- End: if # # return super(Field, self).__getitem__(index) return FieldList((self,))[index] #--- End: def def broadcastable(self, g): ''' ''' # ------------------------------------------------------------ # Analyse each domain # ------------------------------------------------------------ s = self.domain.analyse() v = g.domain.analyse() if s['warnings'] or v['warnings']: return False matching_size_gt1_ids = [] for x, coord0 in s['id_to_coord']: size0 = coord0.size if size0 == 1: continue if x in v['id_to_coord']: coord1 = v['id_to_coord']['x'] size1 = coord1.size if size1 == 1: continue if size0 != size1: return False matching_size_gt1_ids.append(x) #--- End: for for x, coord1 in v['id_to_coord']: if x in matching_size_gt1_ids: continue size1 = coord1.size if size1 == 1: continue if x in s['id_to_coord']: coord0 = s['id_to_coord']['x'] size0 = coord0.size if size0 == 1: continue if size0 != size1: return False matching_size_gt1_ids.append(x) #--- End: for # Check that at most one field has undefined axes if s['undefined_axes'] and v['undefined_axes']: raise ValueError( "Can't combine fields: Both fields have undefined axes: {0}, {1}".format( tuple(self.axis_name(a) for a in s['undefined_axes']), tuple(other.axis_name(a) for a in v['undefined_axes']))) # Find the axis names which are present in both fields matching_ids = set(s['id_to_axis']).intersection(v['id_to_axis']) # Check that any matching axes defined by an auxiliary # coordinate are done so in both fields. for identity in set(s['id_to_aux']).symmetric_difference(v['id_to_aux']): if identity in matching_ids: raise ValueError( "Can't combine fields: %r axis defined by auxiliary in only 1 field" % standard_name) ########~WRONG #--- End: for #------------------------------------------------------------- # #------------------------------------------------------------- for identity in matching_size_gt1_ids: coord0 = s['id_to_coord'][identity] coord1 = v['id_to_coord'][identity] # Check that the defining coordinate data arrays are # compatible if not coord0._equivalent_data(coord1): # Can't broadcast: The defining coordinates have # unequivalent data arrays and are both size > 1. return False # Still here? Then the defining coordinates have # equivalent data arrays # If the defining coordinates are attached to # coordinate references then check that those coordinate references are # equivalent key0 = s['id_to_key'][identity] key1 = v['id_to_key'][identity] equivalent_refs = True for ref0 in self.refs().itervalues(): if key0 not in ref0.coords: continue equivalent_refs = False for ref1 in g.refs().itervalues(): if key1 not in ref1.coords: continue # Each defining coordinate is referenced by a # coordinate reference ... if self.domain.equivalent_refs(ref0, ref1, g.domain): # ... and those coordinate references are equivalent equivalent_refs = True #--- End: if break #--- End: for break #--- End: for if not equivalent_refs: # Can't broadcast: Defining coordinates have # incompatible coordinate references are and are both size > # 1. return False #--- End: for # -------------------------------------------------------- # Still here? Then the two fields are broadcastable! # -------------------------------------------------------- return True #--- End: def def _binary_operation(self, other, method): ''' Implement binary arithmetic and comparison operations on the master data array with metadata-aware broadcasting. It is intended to be called by the binary arithmetic and comparison methods, such as `__sub__`, `__imul__`, `__rdiv__`, `__lt__`, etc. :Parameters: other: standard Python scalar object, cf.Field or cf.Query or cf.Data method: str The binary arithmetic or comparison method name (such as ``'__idiv__'`` or ``'__ge__'``). :Returns: out: `cf.Field` The new field, or the same field if the operation was an in place augmented arithmetic assignment. :Examples: >>> h = f._binary_operation(g, '__add__') >>> h = f._binary_operation(g, '__ge__') >>> f._binary_operation(g, '__isub__') >>> f._binary_operation(g, '__rdiv__') ''' debug = False if (isinstance(other, (float, int, long, bool, basestring)) or other is self): # ======================================================== # CASE 1a: No changes are to the field's domain are # required so can use the metadata-unaware # Variable._binary_operation method. # ======================================================== return super(Field, self)._binary_operation(other, method) #--- End: if if isinstance(other, Data) and other.size == 1: # ======================================================== # CASE 1b: No changes are to the field's domain are # required so can use the metadata-unaware # Variable._binary_operation method. # ======================================================== if other.ndim > 0: other = other.squeeze() return super(Field, self)._binary_operation(other, method) #--- End: if if isinstance(other, Query): # ======================================================== # CASE 2: Combine the field with a cf.Query object # ======================================================== return NotImplemented #--- End: if if isinstance(other, FieldList): # ======================================================== # CASE 3: Combine the field with a cf.FieldList object # ======================================================== return NotImplemented #--- End: if if not isinstance(other, self.__class__): raise ValueError( "Can't combine %r with %r" % (self.__class__.__name__, other.__class__.__name__)) #--- End: if # ============================================================ # Still here? Then combine the field with another field # ============================================================ # ------------------------------------------------------------ # Analyse each domain # ------------------------------------------------------------ s = self.domain.analyse() v = other.domain.analyse() if s['warnings'] or v['warnings']: raise ValueError("Can't combine fields: %s" % (s['warnings'] or v['warnings'])) # Check that at most one field has undefined axes if s['undefined_axes'] and v['undefined_axes']: raise ValueError( "Can't combine fields: Both fields have undefined axes: {0}, {1}".format( tuple(self.axis_name(a) for a in s['undefined_axes']), tuple(other.axis_name(a) for a in v['undefined_axes']))) # Find the axis names which are present in both fields matching_ids = set(s['id_to_axis']).intersection(v['id_to_axis']) if debug: print "s['id_to_axis'] =", s['id_to_axis'] print "v['id_to_axis'] =", v['id_to_axis'] print 'matching_ids =', matching_ids # Check that any matching axes defined by an auxiliary # coordinate are done so in both fields. for identity in set(s['id_to_aux']).symmetric_difference(v['id_to_aux']): if identity in matching_ids: raise ValueError( "Can't combine fields: %r axis defined by auxiliary in only 1 field" % standard_name) ########~WRONG #--- End: for # ------------------------------------------------------------ # For matching dimension coordinates check that they have # consistent coordinate references and that one of the following is # true: # # 1) They have equal size > 1 and their data arrays are # equivalent # # 2) They have unequal sizes and one of them has size 1 # # 3) They have equal size = 1. In this case, if the data # arrays are not equivalent then the axis will be omitted # from the result field's domain. #------------------------------------------------------------- # List of size 1 axes to be completely removed from the result # field. Such an axis's size 1 defining coordinates have # unequivalent data arrays. # # For example: # >>> remove_size1_axes # ['dim2'] remove_size1_axes = [] # List of matching axes with equivalent defining dimension # coordinate data arrays. # # Note that we don't need to include matching axes with # equivalent defining *auxiliary* coordinate data arrays. # # For example: # >>> # [('dim2', 'dim0')] matching_axes_with_equivalent_data = [] # For each field, list those of its matching axes which need # to be broadcast against the other field. I.e. those axes # which are size 1 but size > 1 in the other field. # # For example: # >>> s['broadcast_axes'] # ['dim1'] s['broadcast_axes'] = [] v['broadcast_axes'] = [] # Map axes in field1 to axes in field0 and vice versa # # For example: # >>> axis1_to_axis0 # {'dim1': 'dim0', 'dim2': 'dim1', 'dim0': 'dim2'} # >>> axis0_to_axis1 # {'dim0': 'dim1', 'dim1': 'dim2', 'dim2': 'dim0'} axis1_to_axis0 = {} axis0_to_axis1 = {} for identity in matching_ids: coord0 = s['id_to_coord'][identity] coord1 = v['id_to_coord'][identity] axis0 = s['id_to_axis'][identity] axis1 = v['id_to_axis'][identity] axis1_to_axis0[axis1] = axis0 axis0_to_axis1[axis0] = axis1 # Check the sizes of the defining coordinates size0 = coord0.size size1 = coord1.size if size0 != size1: # Defining coordinates have different sizes if size0 == 1: # Can broadcast s['broadcast_axes'].append(s['id_to_axis'][identity]) elif size1 == 1: # Can broadcast v['broadcast_axes'].append(v['id_to_axis'][identity]) else: # Can't broadcast raise ValueError( "Can't combine fields: Can't broadcast %r axes with sizes %d and %d" % (identity, size0, size1)) continue #--- End: if if debug: print "s['broadcast_axes'] =", s['broadcast_axes'] print "v['broadcast_axes'] =", v['broadcast_axes'] # Still here? Then these defining coordinates have the # same size. # Check that the defining coordinate data arrays are # compatible if coord0._equivalent_data(coord1): # The defining coordinates have equivalent data # arrays # If the defining coordinates are attached to # coordinate references then check that those coordinate references are # equivalent key0 = s['id_to_key'][identity] key1 = v['id_to_key'][identity] equivalent_refs = True for ref0 in self.refs().itervalues(): if key0 not in ref0.coords: continue equivalent_refs = False for ref1 in other.refs().itervalues(): if key1 not in ref1.coords: continue # Each defining coordinate is referenced by a # coordinate reference ... if self.domain.equivalent_refs(ref0, ref1, other.domain): # ... and those coordinate references are equivalent equivalent_refs = True #--- End: if break #--- End: for break #--- End: for if not equivalent_refs: # The defining coordinates have incompatible # coordinate references if coord0.size > 1: # They are both size > 1 raise ValueError( "Can't combine fields: Incompatible coordinate references for %r coordinates" % identity) else: # They are both size 1 so flag this axis to be # omitted from the result field remove_size1_axes.append(axis0) elif identity not in s['id_to_aux']: # The defining coordinates 1) are both dimension # coordinates, 2) have equivalent data arrays and # 3) have compatible coordinate references (if any). matching_axes_with_equivalent_data.append((axis0, axis1)) else: # The defining coordinates have unequivalent data # arrays if coord0.size > 1: # They are both size greater than 1 raise ValueError( "Can't combine fields: Incompatible %r coordinates: %r, %r" % (identity, coord0.data, coord1.data)) else: # They are both size 1 so flag this axis to be # omitted from the result field remove_size1_axes.append(axis0) #--- End: for # -------------------------------------------------------- # Still here? Then the two fields are combinable! # -------------------------------------------------------- # ------------------------------------------------------------ # 2.1 Create copies of the two fields, unless it is an in # place combination, in which case we don't want to copy # self) # ------------------------------------------------------------ field1 = other.copy() inplace = method[2] == 'i' if not inplace: field0 = self.copy() else: field0 = self # Aliases for the field's domain and data array domain0 = field0.domain domain1 = field1.domain # s['new_axes'] = [] # for axis1 in domain1._axes_sizes: # if axis1 in v['axis_to_id']: # identity = v['axis_to_id'][axis1] # if identity in matching_ids: # axis0 = s['id_to_axis'][identity] # axis1_to_axis0[axis1] = axis0 # axis0_to_axis1[axis0] = axis1 # #--- End: for # ------------------------------------------------------------ # Permute the axes of the data array of field0 so that: # # * All of the matching axes are the inner (fastest varying) # axes # # * All of the undefined axes are the outer (slowest varying) # axes # # * All of the defined but unmatched axes are in the middle # ------------------------------------------------------------ data_axes0 = domain0.data_axes() axes_unD = [] # Undefined axes axes_unM = [] # Defined but unmatched axes axes0_M = [] # Defined and matched axes for axis0 in data_axes0: if axis0 in axis0_to_axis1: # Matching axis axes0_M.append(axis0) elif axis0 in s['undefined_axes']: # Undefined axis axes_unD.append(axis0) else: # Defined but unmatched axis axes_unM.append(axis0) #--- End: for if debug: print 'axes_unD , axes_unM , axes0_M =', axes_unD , axes_unM , axes0_M field0.transpose(axes_unD + axes_unM + axes0_M, i=True) end_of_undefined0 = len(axes_unD) start_of_unmatched0 = end_of_undefined0 start_of_matched0 = start_of_unmatched0 + len(axes_unM) if debug: print 'end_of_undefined0 =', end_of_undefined0 print 'start_of_unmatched0 =', start_of_unmatched0 print 'start_of_matched0 =', start_of_matched0 # ------------------------------------------------------------ # Permute the axes of the data array of field1 so that: # # * All of the matching axes are the inner (fastest varying) # axes and in corresponding positions to data0 # # * All of the undefined axes are the outer (slowest varying) # axes # # * All of the defined but unmatched axes are in the middle # ------------------------------------------------------------ data_axes1 = domain1.data_axes() axes_unD = [] axes_unM = [] axes1_M = [axis0_to_axis1[axis0] for axis0 in axes0_M] for axis1 in data_axes1: if axis1 in axes1_M: pass elif axis1 in axis1_to_axis0: # Matching axis axes_unM.append(axis1) elif axis1 in v['undefined_axes']: # Undefined axis axes_unD.append(axis1) else: # Defined but unmatched axis axes_unM.append(axis1) #--- End: for if debug: print 'axes_unD , axes_unM , axes0_M =',axes_unD , axes_unM , axes0_M field1.transpose(axes_unD + axes_unM + axes1_M, i=True) start_of_unmatched1 = len(axes_unD) start_of_matched1 = start_of_unmatched1 + len(axes_unM) undefined_indices1 = slice(None, start_of_unmatched1) unmatched_indices1 = slice(start_of_unmatched1, start_of_matched1) if debug: print 'start_of_unmatched1 =', start_of_unmatched1 print 'start_of_matched1 =', start_of_matched1 print 'undefined_indices1 =', undefined_indices1 print 'unmatched_indices1 =', unmatched_indices1 # ------------------------------------------------------------ # Make sure that each pair of matching axes run in the same # direction # # Note that the axis0_to_axis1 dictionary currently only maps # matching axes # ------------------------------------------------------------ if debug: print '2: axis0_to_axis1 =',axis0_to_axis1 for axis0, axis1 in axis0_to_axis1.iteritems(): if domain1.direction(axis1) != domain0.direction(axis0): field1.flip(axis1, i=True) #--- End: for # ------------------------------------------------------------ # 2f. Insert size 1 axes into the data array of field0 to # correspond to defined but unmatched axes in field1 # # For example, if field0.Data is 1 3 T Y X # and field1.Data is 4 1 P Z Y X # then field0.Data becomes 1 3 1 1 T Y X # ------------------------------------------------------------ unmatched_axes1 = data_axes1[unmatched_indices1] if debug: print '2: unmatched_axes1=', unmatched_axes1 if unmatched_axes1: for axis1 in unmatched_axes1: field0.expand_dims(end_of_undefined0, i=True) if debug: print '2: axis1, field0.shape =', axis1, field0.shape axis0 = set(field0.data_axes()).difference(data_axes0).pop() axis1_to_axis0[axis1] = axis0 axis0_to_axis1[axis0] = axis1 s['new_axes'].append(axis0) start_of_unmatched0 += 1 start_of_matched0 += 1 data_axes0 = domain0.data_axes() #--- End: for #--- End: if # ------------------------------------------------------------ # Insert size 1 axes into the data array of field1 to # correspond to defined but unmatched axes in field0 # # For example, if field0.Data is 1 3 1 1 T Y X # and field1.Data is 4 1 P Z Y X # then field1.Data becomes 4 1 P Z 1 Y X # ------------------------------------------------------------ unmatched_axes0 = data_axes0[start_of_unmatched0:start_of_matched0] if debug: print '2: unmatched_axes0 =', unmatched_axes0 if unmatched_axes0: for axis0 in unmatched_axes0: field1.expand_dims(start_of_matched1, i=True) if debug: print '2: axis0, field1.shape =',axis0, field1.shape axis1 = set(field1.data_axes()).difference(data_axes1).pop() axis0_to_axis1[axis0] = axis1 axis1_to_axis0[axis1] = axis0 start_of_unmatched1 += 1 data_axes1 = field1.data_axes() #--- End: for #--- End: if # ------------------------------------------------------------ # Insert size 1 axes into the data array of field0 to # correspond to undefined axes (of any size) in field1 # # For example, if field0.Data is 1 3 1 1 T Y X # and field1.Data is 4 1 P Z 1 Y X # then field0.Data becomes 1 3 1 1 1 1 T Y X # ------------------------------------------------------------ axes1 = data_axes1[undefined_indices1] if axes1: for axis1 in axes1: field0.expand_dims(end_of_undefined0, i=True) axis0 = set(field0.data_axes()).difference(data_axes0).pop() axis0_to_axis1[axis0] = axis1 axis1_to_axis0[axis1] = axis0 s['new_axes'].append(axis0) data_axes0 = field0.data_axes() #--- End: for #--- End: if if debug: print '2: axis0_to_axis1 =', axis0_to_axis1 print '2: axis1_to_axis0 =', axis1_to_axis0 print "2: s['new_axes'] =", s['new_axes'] # ============================================================ # 3. Combine the data objects # # Note that, by now, field0.ndim >= field1.ndim. # ============================================================ #dch field0.Data = getattr(field0.Data, method)(field1.Data) if debug: print '3: repr(field0) =', repr(field0) print '3: repr(field1) =', repr(field1) field0 = super(Field, field0)._binary_operation(field1, method) # Must rest domain0, because we have reset field0. domain0 = field0.domain if debug: print '3: field0.shape =', field0.shape print '3: repr(field0) =', repr(field0) # ============================================================ # 4. Adjust the domain of field0 to accommodate its new data # ============================================================ insert_dim = {} insert_aux = {} remove_aux = [] # ------------------------------------------------------------ # 4a. Remove any size 1 axes which are matching axes but with # different coordinate data array values # ------------------------------------------------------------ field0.remove_axes(remove_size1_axes) # ------------------------------------------------------------ # 4b. If broadcasting has grown any size 1 axes in domain0 # then replace their size 1 coordinates with the # corresponding size > 1 coordinates from domain1. # ------------------------------------------------------------ refs1 = field1.refs() refs = [] for axis0 in s['broadcast_axes'] + s['new_axes']: axis1 = axis0_to_axis1[axis0] size = domain1._axes_sizes[axis1] domain0.insert_axis(size, key=axis0, replace=True) if debug: print '4: domain1._axes_sizes =',domain1._axes_sizes print '4: domain0._axes_sizes =',domain0._axes_sizes for tkey in refs1: if axis1 in domain1.ref_axes(tkey): refs.append(tkey) # Copy the domain1 dimension coordinate to # domain0, if it exists. if axis1 in domain1.d: insert_dim[axis1] = axis0 # Remove any domain0 1-d auxiliary coordinates for # this axis if axis0 in s['aux_coords']: for aux0 in s['aux_coords'][axis0]['1-d'].keys(): remove_aux.append(aux0) del s['aux_coords'][axis0]['1-d'][aux0] #--- End: if # Copy to domain0 any domain1 1-d auxiliary coordinates # for this axis if axis1 in v['aux_coords']: for aux1 in v['aux_coords'][axis1]['1-d']: insert_aux[aux1] = [axis0] #--- End: for # ------------------------------------------------------------ # Consolidate any 1-d auxiliary coordinates for matching axes # whose defining dimension coordinates have equivalent data # arrays. # # A domain0 1-d auxiliary coordinate is retained if there is a # corresponding domain1 1-d auxiliary with the same standard # name and equivalent data array. # ------------------------------------------------------------ for axis0, axis1 in matching_axes_with_equivalent_data: for aux0, coord0 in s['aux_coords'][axis0]['1-d'].iteritems(): if coord0.identity() is None: # Remove this domain0 1-d auxiliary coordinate # because it has no identity remove_aux.append(aux0) continue # Still here? aux0_has_equivalent_pair = False for aux1, coord1 in v['aux_coords'][axis1]['1-d'].items(): if coord1.identity() is None: continue if coord0._equivalent_data(coord1): del v['aux_coords'][axis1]['1-d'][aux1] aux0_has_equivalent_pair = True break #--- End: for if not aux0_has_equivalent_pair: # Remove this domain0 1-d auxiliary coordinate # because it has no equivalent in domain1 remove_aux.append(aux0) #--- End: for # ------------------------------------------------------------ # Consolidate N-d auxiliary coordinates for matching axes # which have the same size # ------------------------------------------------------------ # Remove any N-d auxiliary coordinates which span broadcasted # axes for broadcast_axes, aux_coords, domain in izip((s['broadcast_axes'], v['broadcast_axes']), (s['aux_coords'] , v['aux_coords']), (domain0 , domain1)): for axis in broadcast_axes: if axis not in aux_coords: continue for aux in aux_coords[axis]['N-d']: del aux_coords['N-d'][aux] if domain is domain0: remove_aux.append(aux) #--- End: for # Remove any N-d auxiliary coordinates which span a mixture of # matching and non-matching axes for aux_coords, domain, axis_to_id in izip((s['aux_coords'], v['aux_coords']), (domain0 , domain1 ), (s['axis_to_id'] , v['axis_to_id'] )): for aux in aux_coords['N-d'].keys(): # Count how many of this N-d auxiliary coordinate's # axes are matching axes # n_matching_dims = len([True for axis in domain.dimensions[aux] # if axis_to_id[axis] in matching_ids]) n_matching_dims = len([True for axis in domain._axes[aux] if axis_to_id[axis] in matching_ids]) # if 1 <= n_matching_dims < len(domain.dimensions[aux]): if 1 <= n_matching_dims < len(domain._axes[aux]): # At least one axis is a matching axis and at # least one axis isn't => so remove this domain0 # auxiliary coordinate del aux_coords['N-d'][aux] if domain is domain0: remove_aux.append(aux) #--- End: for #--- End: for # Forget about for aux0 in s['aux_coords']['N-d'].keys(): n_matching_axes = len(s['aux_coords']['N-d'][aux0]) if not n_matching_axes: del s['aux_coords']['N-d'][aux0] #--- End: for # Copy to domain0 any domain1 N-d auxiliary coordinates which # do not span any matching axes for aux1, coord1 in v['aux_coords']['N-d'].items(): n_matching_axes = len(v['aux_coords']['N-d'][aux1]) if not n_matching_axes: axes = [axis1_to_axis0[axis1] for axis1 in domain1._axes[aux1]] insert_auxs[aux1] = axes del v['aux_coords']['N-d'][aux1] #--- End: for # By now, aux_coords0['N-d'] contains only those N-d auxiliary # coordinates which span equal sized matching axes. # Remove from domain0 any N-d auxiliary coordinates which span # same-size matching axes and do not have an equivalent N-d # auxiliary coordinate in domain1 (i.e. one which spans the # same axes, has the same standard name and has equivalent # data) for aux0, coord0 in s['aux_coords']['N-d'].iteritems(): # Remove domain0 N-d auxiliary coordinate if it has no # standard name if coord0.identity() is None: remove_aux.append(aux0) continue # Still here? aux0_has_equivalent_pair = False for aux1, coord1 in v['aux_coords']['N-d'].items(): if coord1.identity() is None: continue copy = True axes1 = domain1.item_axes(aux1) transpose_axes = [axes1.index(axis0_to_axis1[axis0]) for axis0 in domain1.item_axes(aux0)] if transpose_axes != range(coord1.ndim): # coord1 = coord1.copy() coord1 = coord1.transpose(transpose_axes) copy = False # necessary? if coord0._equivalent_data(coord1, copy=copy): del v['aux_coords']['N-d'][aux1] aux0_has_equivalent_pair = True break #--- End: for # Remove domain0 N-d auxiliary coordinate if it has no # equivalent in domain1 if not aux0_has_equivalent_pair: remove_aux.append(aux0) #--- End: for key1_to_key0 = {} if debug: print 'insert_dim =', insert_dim print 'insert_aux =', insert_aux for axis1, axis in insert_dim.iteritems(): axis0 = domain0.insert_dim(domain1.d[axis1], key=axis) key1_to_key0[axis1] = axis0 if debug: print 'axis0, domain1.d[axis1] =', axis0, repr(domain1.d[axis1]) print 'domain0.items() =', domain0.items() print 'field0.items() =', field0.items() for aux1, axes in insert_aux.iteritems(): aux0 = domain0.insert_aux(domain1.a[aux1], axes=axes) key1_to_key0[aux1] = aux0 if debug: print 'axis0, domain1.a[axis1] =', axis0, repr(domain1.a[axis1]) domain0.remove_items(set(remove_aux)) # Coordinate References from domain1 -> domain0 for tkey in set(refs): new_ref = other.ref[tkey].copy() # for key1 in ref.coords: # new_ref.change_coord(key1, key1_to_key0.get(key1, None)) new_ref.change_coord_identities(key1_to_key0, i=True) domain0.insert_ref(new_ref, copy=False) #--- End: for return field0 #--- End: def def _conform_for_assignment(self, other): '''Conform *other* so that it is ready for metadata-unaware assignment broadcasting across *self*. *other* is not changed in place. :Parameters: other: `cf.Field` The field to conform. :Returns: out: `cf.Field` The conformed version of *other*. :Examples: >>> g = _conform_for_assignment(f) ''' # Analyse each domain domain0 = self.domain domain1 = other.domain s = domain0.analyse() v = domain1.analyse() if s['warnings'] or v['warnings']: raise ValueError("Can't setitem: %s" % (s['warnings'] or v['warnings'])) # Find the set of matching axes matching_ids = set(s['id_to_axis']).intersection(v['id_to_axis']) if not matching_ids: raise ValueError("Can't assign: No matching axes") # ------------------------------------------------------------ # Check that any matching axes defined by auxiliary # coordinates are done so in both fields. # ------------------------------------------------------------ for identity in matching_ids: if (identity in s['id_to_aux']) + (identity in v['id_to_aux']) == 1: raise ValueError( "Can't assign: %r axis defined by auxiliary in only 1 field" % identity) #--- End: for copied = False # ------------------------------------------------------------ # Check that 1) all undefined axes in other have size 1 and 2) # that all of other's unmatched but defined axes have size 1 # and squeeze any such axes out of its data array. # # For example, if self.Data is P T Z Y X A # and other.Data is 1 B C Y 1 X T # then other.Data becomes Y X T # ------------------------------------------------------------ squeeze_axes1 = [] for axis1 in v['undefined_axes']: if domain1._axes_sizes[axis1] != 1: raise ValueError( "Can't assign: Can't broadcast size %d undefined axis" % domain1._axes_sizes[axis1]) squeeze_axes1.append(axis1) #--- End: for for identity in set(v['id_to_axis']).difference(matching_ids): axis1 = v['id_to_axis'][identity] if domain1._axes_sizes[axis1] != 1: raise ValueError( "Can't assign: Can't broadcast size %d %r axis" % (domain1._axes_sizes[axis1], identity)) squeeze_axes1.append(axis1) #--- End: for if squeeze_axes1: if not copied: other = other.copy() copied = True other.squeeze(squeeze_axes1, i=True) #--- End: if # ------------------------------------------------------------ # Permute the axes of other.Data so that they are in the same # order as their matching counterparts in self.Data # # For example, if self.Data is P T Z Y X A # and other.Data is Y X T # then other.Data becomes T Y X # ------------------------------------------------------------ data_axes0 = domain0.data_axes() data_axes1 = domain1.data_axes() transpose_axes1 = [] for axis0 in data_axes0: identity = s['axis_to_id'][axis0] if identity in matching_ids: axis1 = v['id_to_axis'][identity] if axis1 in data_axes1: transpose_axes1.append(axis1) #--- End: for if transpose_axes1 != data_axes1: if not copied: other = other.copy() copied = True other.transpose(transpose_axes1, i=True) #--- End: if # ------------------------------------------------------------ # Insert size 1 axes into other.Data to match axes in # self.Data which other.Data doesn't have. # # For example, if self.Data is P T Z Y X A # and other.Data is T Y X # then other.Data becomes 1 T 1 Y X 1 # ------------------------------------------------------------ expand_positions1 = [] for i, axis0 in enumerate(data_axes0): identity = s['axis_to_id'][axis0] if identity in matching_ids: axis1 = v['id_to_axis'][identity] if axis1 not in data_axes1: expand_positions1.append(i) else: expand_positions1.append(i) #--- End: for if expand_positions1: if not copied: other = other.copy() copied = True for i in expand_positions1: other.expand_dims(i, i=True) #--- End: if # ---------------------------------------------------------------- # Make sure that each pair of matching axes has the same # direction # ---------------------------------------------------------------- flip_axes1 = [] for identity in matching_ids: axis1 = v['id_to_axis'][identity] axis0 = s['id_to_axis'][identity] if domain1.direction(axis1) != domain0.direction(axis0): flip_axes1.append(axis1) #--- End: for if flip_axes1: if not copied: other = other.copy() copied = True other = other.flip(flip_axes1, i=True) #--- End: if return other #--- End: def def __repr__(self): ''' Called by the :py:obj:`repr` built-in function. x.__repr__() <==> repr(x) ''' if self._hasData: domain = self.domain x = ['%s(%d)' % (domain.axis_name(axis), domain._axes_sizes[axis]) for axis in domain.data_axes()] axis_names = '(%s)' % ', '.join(x) else: axis_names = '' #--- End: if # Field units units = getattr(self, 'units', '') calendar = getattr(self, 'calendar', None) if calendar: units += '%s calendar' % calendar return '' % (self.name(''), axis_names, units) #--- End: def def __str__(self): ''' Called by the :py:obj:`str` built-in function. x.__str__() <==> str(x) ''' string = ["%s field summary" % self.name('')] string.append(''.ljust(len(string[0]), '-')) # Units units = getattr(self, 'units', '') calendar = getattr(self, 'calendar', None) if calendar: units += ' %s calendar' % calendar domain = self.domain # Data if self._hasData: x = ['%s(%d)' % (domain.axis_name(axis), domain._axes_sizes[axis]) for axis in domain.data_axes()] string.append('Data : %s(%s) %s' % (self.name(''), ', '.join(x), units)) elif units: string.append('Data : %s' % units) # Cell methods cell_methods = getattr(self, 'cell_methods', None) if cell_methods is not None: string.append('Cell methods : %s' % str(cell_methods)) # Domain if domain: string.append(str(domain)) # Ancillary variables ancillary_variables = getattr(self, 'ancillary_variables', None) if ancillary_variables is not None: y = ['Ancillary vars : '] y.append('\n : '.join( [repr(a) for a in ancillary_variables])) string.append(''.join(y)) string.append('') return '\n'.join(string) #--- End def # ---------------------------------------------------------------- # Attribute: Flags # ---------------------------------------------------------------- @property def Flags(self): ''' A `cf.Flags` object containing self-describing CF flag values. Stores the `flag_values`, `flag_meanings` and `flag_masks` CF properties in an internally consistent manner. :Examples: >>> f.Flags ''' return self._get_special_attr('Flags') @Flags.setter def Flags(self, value): self._set_special_attr('Flags', value) @Flags.deleter def Flags(self): self._del_special_attr('Flags') # ---------------------------------------------------------------- # Attribute: read only # ---------------------------------------------------------------- @property def rank(self): ''' The number of axes in the domain. There may be greater the number of data array dimensions. .. seealso:: `ndim` :Examples: >>> print f air_temperature field summary ----------------------------- Data : air_temperature(time(12), latitude(64), longitude(128)) K Cell methods : time: mean Axes : time(12) = [ 450-11-16 00:00:00, ..., 451-10-16 12:00:00] noleap : latitude(64) = [-87.8638000488, ..., 87.8638000488] degrees_north : longitude(128) = [0.0, ..., 357.1875] degrees_east : height(1) = [2.0] m >>> f.rank 4 >>> f.ndim 3 >>> f.unsqueeze(i=True) >>> f.ndim 4 ''' return self.domain.rank #--- End: def # ---------------------------------------------------------------- # CF property: flag_values # ---------------------------------------------------------------- @property def flag_values(self): ''' The flag_values CF property. Stored as a 1-d numpy array but may be set as any array-like object. :Examples: >>> f.flag_values = ['a', 'b', 'c'] >>> f.flag_values array(['a', 'b', 'c'], dtype='|S1') >>> f.flag_values = numpy.arange(4) >>> f.flag_values array([1, 2, 3, 4]) >>> del f.flag_values >>> f.setprop('flag_values', 1) >>> f.getprop('flag_values') array([1]) >>> f.delprop('flag_values') ''' try: return self.Flags.flag_values except AttributeError: raise AttributeError( "%s doesn't have CF property 'flag_values'" % self.__class__.__name__) #--- End: def @flag_values.setter def flag_values(self, value): try: flags = self.Flags except AttributeError: self.Flags = Flags(flag_values=value) else: flags.flag_values = value #--- End: def @flag_values.deleter def flag_values(self): try: del self.Flags.flag_values except AttributeError: raise AttributeError( "Can't delete non-existent %s CF property 'flag_values'" % self.__class__.__name__) else: if not self.Flags: del self.Flags #--- End: def # ---------------------------------------------------------------- # CF property: flag_masks # ---------------------------------------------------------------- @property def flag_masks(self): ''' The flag_masks CF property. Stored as a 1-d numpy array but may be set as array-like object. :Examples: >>> f.flag_masks = numpy.array([1, 2, 4], dtype='int8') >>> f.flag_masks array([1, 2, 4], dtype=int8) >>> f.flag_masks = (1, 2, 4, 8) >>> f.flag_masks array([1, 2, 4, 8], dtype=int8) >>> del f.flag_masks >>> f.setprop('flag_masks', 1) >>> f.getprop('flag_masks') array([1]) >>> f.delprop('flag_masks') ''' try: return self.Flags.flag_masks except AttributeError: raise AttributeError( "%s doesn't have CF property 'flag_masks'" % self.__class__.__name__) #--- End: def @flag_masks.setter def flag_masks(self, value): try: flags = self.Flags except AttributeError: self.Flags = Flags(flag_masks=value) else: flags.flag_masks = value #--- End: def @flag_masks.deleter def flag_masks(self): try: del self.Flags.flag_masks except AttributeError: raise AttributeError( "Can't delete non-existent %s CF property 'flag_masks'" % self.__class__.__name__) else: if not self.Flags: del self.Flags #--- End: def # ---------------------------------------------------------------- # CF property: flag_meanings # ---------------------------------------------------------------- @property def flag_meanings(self): ''' The flag_meanings CF property. Stored as a 1-d numpy string array but may be set as a space delimited string or any array-like object. :Examples: >>> f.flag_meanings = 'low medium high' >>> f.flag_meanings array(['low', 'medium', 'high'], dtype='|S6') >>> del flag_meanings >>> f.flag_meanings = ['left', 'right'] >>> f.flag_meanings array(['left', 'right'], dtype='|S5') >>> f.flag_meanings = 'ok' >>> f.flag_meanings array(['ok'], dtype='|S2') >>> f.setprop('flag_meanings', numpy.array(['a', 'b']) >>> f.getprop('flag_meanings') array(['a', 'b'], dtype='|S1') >>> f.delprop('flag_meanings') ''' try: return self.Flags.flag_meanings except AttributeError: raise AttributeError( "%s doesn't have CF property 'flag_meanings'" % self.__class__.__name__) #--- End: def @flag_meanings.setter def flag_meanings(self, value): try: flags = self.Flags except AttributeError: self.Flags = Flags(flag_meanings=value) else: flags.flag_meanings = value #--- End: def @flag_meanings.deleter def flag_meanings(self): try: del self.Flags.flag_meanings except AttributeError: raise AttributeError( "Can't delete non-existent %s CF property 'flag_meanings'" % self.__class__.__name__) else: if not self.Flags: del self.Flags #--- End: def # ---------------------------------------------------------------- # CF property: cell_methods # ---------------------------------------------------------------- @property def cell_methods(self): ''' The `cf.CellMethods` object containing the CF cell methods of the data array. :Examples: >>> f.cell_methods ''' return self._get_special_attr('cell_methods') #--- End: def @cell_methods.setter def cell_methods(self, value): self._set_special_attr('cell_methods', value) @cell_methods.deleter def cell_methods(self): self._del_special_attr('cell_methods') # ---------------------------------------------------------------- # CF property: Conventions # ---------------------------------------------------------------- @property def Conventions(self): ''' The Conventions CF property. :Examples: >>> f.Conventions = 'CF-1.5' >>> f.Conventions 'CF-1.5' >>> del f.Conventions >>> f.setprop('Conventions', 'CF-1.5') >>> f.getprop('Conventions') 'CF-1.5' >>> f.delprop('Conventions') ''' return self.getprop('Conventions') #--- End: def @Conventions.setter def Conventions(self, value): self.setprop('Conventions', value) @Conventions.deleter def Conventions(self): self.delprop('Conventions') # ---------------------------------------------------------------- # CF property: institution (a simple attribute) # ---------------------------------------------------------------- @property def institution(self): ''' The institution CF property. :Examples: >>> f.institution = 'University of Reading' >>> f.institution 'University of Reading' >>> del f.institution >>> f.setprop('institution', 'University of Reading') >>> f.getprop('institution') 'University of Reading' >>> f.delprop('institution') ''' return self.getprop('institution') #--- End: def @institution.setter def institution(self, value): self.setprop('institution', value) @institution.deleter def institution(self): self.delprop('institution') # ---------------------------------------------------------------- # CF property: references (a simple attribute) # ---------------------------------------------------------------- @property def references(self): ''' The references CF property. :Examples: >>> f.references = 'some references' >>> f.references 'some references' >>> del f.references >>> f.setprop('references', 'some references') >>> f.getprop('references') 'some references' >>> f.delprop('references') ''' return self.getprop('references') #--- End: def @references.setter def references(self, value): self.setprop('references', value) @references.deleter def references(self): self.delprop('references') # ---------------------------------------------------------------- # CF property: standard_error_multiplier # ---------------------------------------------------------------- @property def standard_error_multiplier(self): ''' The standard_error_multiplier CF property. :Examples: >>> f.standard_error_multiplier = 2.0 >>> f.standard_error_multiplier 2.0 >>> del f.standard_error_multiplier >>> f.setprop('standard_error_multiplier', 2.0) >>> f.getprop('standard_error_multiplier') 2.0 >>> f.delprop('standard_error_multiplier') ''' return self.getprop('standard_error_multiplier') #--- End: def @standard_error_multiplier.setter def standard_error_multiplier(self, value): self.setprop('standard_error_multiplier', value) @standard_error_multiplier.deleter def standard_error_multiplier(self): self.delprop('standard_error_multiplier') # ---------------------------------------------------------------- # CF property: source # ---------------------------------------------------------------- @property def source(self): ''' The source CF property. :Examples: >>> f.source = 'radiosonde' >>> f.source 'radiosonde' >>> del f.source >>> f.setprop('source', 'surface observation') >>> f.getprop('source') 'surface observation' >>> f.delprop('source') ''' return self.getprop('source') #--- End: def @source.setter def source(self, value): self.setprop('source', value) @source.deleter def source(self): self.delprop('source') # ---------------------------------------------------------------- # CF property: title # ---------------------------------------------------------------- @property def title(self): ''' The title CF property. :Examples: >>> f.title = 'model data' >>> f.title 'model data' >>> del f.title >>> f.setprop('title', 'model data') >>> f.getprop('title') 'model data' >>> f.delprop('title') ''' return self.getprop('title') #--- End: def @title.setter def title(self, value): self.setprop('title', value) @title.deleter def title(self): self.delprop('title') # ---------------------------------------------------------------- # Attribute: domain # ---------------------------------------------------------------- @property def domain(self): ''' The `cf.Domain` object containing the field's domain. :Examples: >>> print f air_temperature field summary ----------------------------- Data : air_temperature(time(12), latitude(64), longitude(128)) K Cell methods : time: mean (interval: 1.0 month) Axes : height(1) = [2.0] m : time(12) = [ 450-11-16 00:00:00, ..., 451-10-16 12:00:00] noleap : latitude(64) = [-87.8638000488, ..., 87.8638000488] degrees_north : longitude(128) = [0.0, ..., 357.1875] degrees_east >>> f.domain ''' return self._get_special_attr('domain') #--- End: def @domain.setter def domain(self, value): self._set_special_attr('domain', value) @domain.deleter def domain(self): self._del_special_attr('domain') # ---------------------------------------------------------------- # Attribute: subspace (read only) # ---------------------------------------------------------------- @property def subspace(self): '''Return a new object which will get or set a subspace of the field. The returned object is a `!SubspaceField` object which may be **indexed** to select a subspace by axis index values (``f.subspace[indices]``) or **called** to select a subspace by metadata values (``f.subspace(*exact, **metadata_values)``). **Subspacing by indexing** Subspacing by indices allows a subspaced field to be defined via index values for the axes of the field's data array. Indices to the returned `!SubspaceField` object have an extended Python slicing syntax, which is similar to :ref:`numpy array indexing `, but with three extensions: * Size 1 axes are never removed. An integer index i takes the i-th element but does not reduce the rank of the output array by one: * The indices for each axis work independently. When more than one axis's slice is a 1-d boolean sequence or 1-d sequence of integers, then these indices work independently along each axis (similar to the way vector subscripts work in Fortran), rather than by their elements: * Boolean indices may be any object which exposes the numpy array interface. **Subspacing by metadata values** A subspaced field may be defined via data array values of its domain items (dimension coordinate, auciliary coordinate and cell measured objects) by calling the `!SubspaceField` object. ``f.subspace(*exact, **metadata_values)`` is a shorthand for ``f.subspace[f.indices(*exact, **metadata_values)]``. See `cf.Field.indices` for details. **Assignment to subspaces** Elements of a field's data array may be changed by assigning values to a subspace of the field. Assignment is only possible to a subspace defined by indices of the returned `!SubspaceField` object. For example, ``f.subspace[indices] = 0`` is possible, but ``f.subspace(*exact, **metadata_values) = 0`` is *not* allowed. However, assigning to a subspace defined by metadata values may be done as follows: ``f.subspace[f.indices(*exact, **metadata_values)] = 0``. **Missing data** The treatment of missing data elements during assignment to a subspace depends on the value of field's `hardmask` attribute. If it is True then masked elements will not be unmasked, otherwise masked elements may be set to any value. In either case, unmasked elements may be set, (including missing data). Unmasked elements may be set to missing data by assignment to the `cf.masked` constant or by assignment to a value which contains masked elements. .. seealso:: `cf.masked`, `hardmask`, `indices`, `where` :Examples: >>> print f Data : air_temperature(time(12), latitude(73), longitude(96)) K Cell methods : time: mean Dimensions : time(12) = [15, ..., 345] days since 1860-1-1 : latitude(73) = [-90, ..., 90] degrees_north : longitude(96) = [0, ..., 356.25] degrees_east : height(1) = [2] m >>> f.shape (12, 73, 96) >>> f.subspace[...].shape (12, 73, 96) >>> f.subspace[slice(0, 12), :, 10:0:-2].shape (12, 73, 5) >>> lon = f.coord('X').array >>> f.subspace[..., lon<180] >>> f.shape (12, 73, 96) >>> f.subspace[0, ...].shape (1, 73, 96) >>> f.subspace[3, slice(10, 0, -2), 95].shape (1, 5, 1) >>> f.shape (12, 73, 96) >>> f.subspace[:, [0, 72], [5, 4, 3]].shape (12, 2, 3) >>> f.subspace().shape (12, 73, 96) >>> f.subspace(latitude=0).shape (12, 1, 96) >>> f.subspace(latitude=cf.wi(-30, 30)).shape (12, 25, 96) >>> f.subspace(long=cf.ge(270, 'degrees_east'), lat=cf.set([0, 2.5, 10])).shape (12, 3, 24) >>> f.subspace(latitude=cf.lt(0, 'degrees_north')) (12, 36, 96) >>> f.subspace(latitude=[cf.lt(0, 'degrees_north'), 90]) (12, 37, 96) >>> import math >>> f.subspace(longitude=cf.lt(math.pi, 'radian'), height=2) (12, 73, 48) >>> f.subspace(height=cf.gt(3)) IndexError: No indices found for 'height' values gt 3 >>> f.subspace(dim2=3.75).shape (12, 1, 96) >>> f.subspace[...] = 273.15 >>> f.subspace[f.indices(longitude=cf.wi(210, 270, 'degrees_east'), ... latitude=cf.wi(-5, 5, 'degrees_north'))] = cf.masked >>> index = f.indices(longitude=0) >>> f.subspace[index] = f.subspace[index] * 2 ''' return SubspaceField(self) #--- End: def def cell_area(self, radius=6371229.0, insert=False, force=False): '''{+Fef,}For each fiel .. versionadded:: 1.0 .. seealso:: `weights` :Examples 1: >>> a = f.cell_area() :Parameters: radius: data-like, optional The radius used for calculating spherical surface areas when both of the horizontal axes are part of a spherical polar coordinate system. By default *radius* has a value of 6371229 metres. If units are not specified then units of metres are assumed. {+data-like} *Example:* Five equivalent ways to set a radius of 6371200 metres: ``radius=6371200``, ``radius=numpy.array(6371200)``, ``radius=cf.Data(6371200)``, ``radius=cf.Data(6371200, 'm')``, ``radius=cf.Data(6371.2, 'km')``. insert: `bool`, optional If True then{+,fef,} the calculated cell areas are also inserted in place as an area cell measure object. An existing area cell measure object for the horizontal axes will not be overwritten. force: `bool`, optional If True the always calculate the cell areas. By default{+,fef,} if there is already an area cell measure object for the horizontal axes then it will provide the area values. :Returns: out: `cf.{+Variable}` :Examples: >>> a = f.cell_area() >>> a = f.cell_area(insert=True) >>> a = f.cell_area(force=True) >>> a = f.cell_area(radius=cf.Data(3389.5, 'km')) ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('cell_area', kwargs2) area_clm = self.measure('area', axes=('X', 'Y')) if not force and area_clm: w = self.weights('area') else: x = self.dim('X') y = self.dim('Y') if (x is None or y is None or not x.Units.equivalent(_units_radians) or not y.Units.equivalent(_units_radians)): raise ValueError("sd---------------------") # Got x and y coordinates in radians, so we can calc. # Parse the radius of the planet radius = Data.asdata(radius).squeeze() radius.dtype = float if radius.size != 1: raise ValueError("Multiple radii: radius=%r" % radius) if not radius.Units: radius.override_units(_units_m, i=True) elif not radius.Units.equivalent(_units_m): raise ValueError( "Invalid units for radius: %r" % radius.Units) w = self.weights('area') radius **= 2 w *= radius w.override_units(radius.Units, i=True) #--- End: if if insert: # ---------------------------------------------------- # Insert new cell measure # ---------------------------------------------------- if area_clm: raise ValueError( "Can't overwrite an existing area cell measure object") clm = CellMeasure(data=w.data, copy=True) clm.measure = 'area' map_axes = w.domain.map_axes(self.domain) data_axes = w.data_axes() axes = (map_axes[data_axes[0]], map_axes[data_axes[1]]) self.insert_measure(clm, axes=axes, copy=False) #--- End: if w.standard_name = 'area' w.long_name = 'area' return w #--- End: def def close(self): ''' {+Fef,}Close all files referenced by the field. Note that a closed file will be automatically reopened if its contents are subsequently required. :Examples 1: >>> f.close() :Returns: None ''' # List functionality if self._list: for f in self: f.close() return new = super(Field, self).close() self.domain.close() ancillary_variables = getattr(self, 'ancillary_variables', None) if ancillary_variables is not None: ancillary_variables.close() #--- End: def def iscyclic(self, axes=None, **kwargs): ''' Returns True if the given axis is cyclic. .. versionadded:: 1.0 .. seealso:: `axis`, `cyclic`, `period` :Examples 1: >>> b = f.iscyclic('X') :Parameters: {+axes, kwargs} :Returns: out: `bool` True if the selected axis is cyclic, otherwise False. :Examples 2: >>> f.cyclic() {} >>> f.iscyclic('X') False >>> f.cyclic('X', period=360) {} >>> f.iscyclic('X') True ''' axis = self.domain.axis(axes, **kwargs) if axis is None: raise ValueError("Can't identify unique %r axis" % axes) return axis in self.cyclic() #--- End: def @classmethod def concatenate(cls, fields, axis=0, _preserve=True): ''' Join a sequence of fields together. This is different to `cf.aggregate` because it does not account for all metadata. For example, it assumes that the axis order is the same in each field. .. versionadded:: 1.0 .. seealso:: `cf.aggregate`, `cf.Data.concatenate` :Parameters: axis: `int`, optional :Returns: out: `cf.Field` :Examples: ''' field0 = fields[0] # List functionality if field0._list: return field0.concatenate(fields, axis=axis, _preserve=_preserve) if len(fields) == 1: return fields0.copy() out = super(cls, field0).concatenate(fields, axis=axis, _preserve=_preserve) # Change the axis size dim = field0.data_axes()[axis] out.insert_axis(out.shape[axis], key=dim, replace=True) # ------------------------------------------------------------ # Concatenate dimension coordinates, auxiliary coordinates and # cell measures # ------------------------------------------------------------ for key, item in field0.items(role=('d', 'a', 'm')).iteritems(): axes = field0.item_axes(key) if dim not in axes: # This item does not span the concatenating axis in # the first field continue items = [item] for f in fields[1:]: i = f.item(key) if i is not None: items.append(i) else: # This field does not have this item items = None break #--- End: for if not items: # Not every field has this item, so remove it from the # output field. out.remove_item(key) continue # Still here? try: item = item.concatenate(items, axis=axes.index(dim), _preserve=_preserve) except ValueError: # Couldn't concatenate this item, so remove it from # the output field. out.remove_item(key) continue if item.isdimension: out.insert_dim(item, key=key, copy=False, replace=True) elif item.isauxiliary: out.insert_aux(item, key=key, axes=axes, copy=False, replace=True) elif item.ismeasure: out.insert_measure(item, key=key, axes=axes, copy=False, replace=True) #--- End: for # ------------------------------------------------------------ # Concatenate ancillary variables # ------------------------------------------------------------ ancillary_variables = getattr(out, 'ancillary_variables', None) if ancillary_variables: domain = out.domain n_avs = len(ancillary_variables) avs = [av] #BBBBBBBUUUUUUUGGGGGGGGGGGGG I'm sure. What is av? for f in fields[1:]: avs1 = getattr(f, 'ancillary_variables', None) if avs1 is not None and len(avs1) == n_avs: avs.append(avs1) else: avs = None break #--- End: for if not avs: del out.ancillary_variables else: out_avs = [] for i in range(n_avs): av0 = avs[0][i] try: iaxis = av0.data_axes().index(domain.map_axes(av0)[dim]) new_av = av0.concatenate([a[i] for a in avs], axis=iaxis, _preserve=_preserve) except (KeyError, ValueError): # Couldn't concatenate these ancillary # variable fields continue else: # Successfully concatenated these ancillary # variable fields, so put the result in the # output field. out_avs.append(new_av) #--- End: for if out_avs: out.ancillary_variables = FieldList(out_avs) else: del out.ancillary_variables #--- End: if #--- End: if # ------------------------------------------------------------ # Concatenate coordinate references # ------------------------------------------------------------ return out #--- End: def def cyclic(self, axes=None, iscyclic=True, period=None, **kwargs): '''Set the cyclicity of an axis. A unique axis is selected with the *axes* and *kwargs* parameters. .. versionadded:: 1.0 .. seealso:: `autocyclic`, `axis`, `iscyclic`, `period` `int` :Examples 1: Set the X axis to be periodic, with a period of 360: >>> s = f.cyclic('X', period=360) :Parameters: {+axes, kwargs} iscyclic: `bool`, optional If False then the axis is set to be non-cyclic. By default the selected axis is set to be cyclic. period: data-like object, optional The period for a dimension coordinate object which spans the selected axis. The absolute value of *period* is used. If *period* has units then they must be compatible with those of the dimension coordinates, otherwise it is assumed to have the same units as the dimension coordinates. {+data-like} :Returns: out: `set` The axes of the field which were cyclic prior to the new setting, or the current cyclic axes if no axis was specified. :Examples: >>> f.axes('X') {'dim3'} >>> f.cyclic() {} >>> f.cyclic('X', period=360) {} >>> f.cyclic() {'dim3'} >>> f.cyclic('X', False) {'dim3'} >>> f.cyclic() {} >>> f.cyclic('longitude', period=360, exact=True) {} >>> f.cyclic() {'dim3'} >>> f.cyclic('dim3', False) {'dim3'} >>> f.cyclic() {} ''' try: data = self.Data except AttributeError: return set() data_axes = self.data_axes() old = set([data_axes[i] for i in data.cyclic()]) if axes is None and not kwargs: return old axis = self.domain.axis(axes, **kwargs) if axis is None: raise ValueError("879534 k.j asdm,547`") try: data.cyclic(data_axes.index(axis), iscyclic) except ValueError: pass if iscyclic: dim = self.dim(axis) if dim is not None: if period is not None: dim.period(period) elif dim.period() is None: raise ValueError( "A cyclic dimension coordinate must have a period") #--- End: if return old #--- End: def def weights(self, weights='auto', scale=False, components=False, methods=False, **kwargs): '''{+Fef,}Return weights for the data array values. By default weights components are created for all axes of the field by one or more of the following methods, in order of preference, 1. Volume cell measures 2. Area cell measures 3. Area calculated from (grid) latitude and (grid) longitude dimension coordinates with bounds 4. Cell sizes of dimension coordinates with bounds 5. Equal weights and the outer product of these weights components is returned in a field which is broadcastable to the orginal field (see the *components* parameter). The methods used by the default behaviour may differ between fields, depending on which metadata they contain (see the *methods* parameter), so it is possible to force weights to be created with particular methods (see the *weights* parameter). .. versionadded:: 1.0 .. seealso:: `cell_area`, `collapse` :Examples 1: >>> g = f.weights() :Parameters: weights, kwargs: optional Specify the weights to be created. There are two distinct methods: **type 1** will always succeed in creating weights for all axes of the field, at the expense of not always being able to control exactly how the weights are created (see the *methods* parameter); **type 2** allows particular types of weights to be defined for particular axes and an exception will be raised if it is not possible to the create weights. * **Type 1**: *weights* may be one of: ========== ================================================== *weights* Description ========== ================================================== ``'auto'`` This the default. Weights are created for non-overlapping subsets of the axes by the methods enumerated in the above notes. Set the *methods* parameter to find out how the weights were actually created. `None` Equal weights for all axes. ========== ================================================== .. * **Type 2**: *weights* may be one, or a sequence, of: ============ ============================================== *weights* Description ============ ============================================== ``'area'`` Cell area weights from the field's area cell measure construct or, if one doesn't exist, from (grid) latitude and (grid) longitude dimension coordinates. Set the *methods* parameter to find out how the weights were actually created. ``'volume'`` Cell volume weights from the field's volume cell measure construct. items Weights from the cell sizes of the dimension coordinate objects that would be selected by this call of the field's `~cf.Field.dims` method: ``f.dims(items, **kwargs)``. See `cf.Field.dims` for details. `cf.Field` Take weights from the data array of another field, which must be broadcastable to this field. ============ ============================================== If *weights* is a sequence of any combination of the above then the returned field contains the outer product of the weights defined by each element of the sequence. The ordering of the sequence is irrelevant. *Example:* To create to 2-dimensional weights based on cell areas: ``f.weights('area')``. To create to 3-dimensional weights based on cell areas and linear height: ``f.weights(['area', 'Z'])``. scale: `bool`, optional If True then scale the returned weights so that they are less than or equal to 1. components: `bool`, optional If True then a dictionary of orthogonal weights components is returned instead of a field. Each key is a tuple of integers representing axes positions in the field's data array with corresponding values of weights in `cf.Data` objects. The axes of weights match the axes of the field's data array in the order given by their dictionary keys. methods: `bool`, optional If True, then return a dictionary describing methods used to create the weights. :Returns: out: `cf.Field` or `dict` The weights field or, if *components* is True, orthogonal weights in a dictionary. :Examples 2: >>> f [+1] [+N][] >>> f.weights() [+1] [+N][] >>> f.weights('auto', scale=True) [+1] [+N][] [+1]>>> f.weights('auto', components=True) [+1]{(0,): , [+1] (1,): , [+1] (2,): } [+1]>>> f.weights('auto', components=True, scale=True) [+1]{(0,): , [+1] (1,): , [+1] (2,): } [+1]>>> f.weights('auto', methods=True) [+1]{(0,): 'linear time', [+1] (1,): 'linear sine latitude', [+1] (2,): 'linear longitude'} ''' def _field_of_weights(data, domain=None, axes=None): '''Return a field of weights with long_name ``'weight'``. :Parameters: data: cf.Data The weights which comprise the data array of the weights field. domain: `cf.Domain`, optional The domain for the weights field. Not required if *data* is scalar. axes: list, optional :Returns: out: `cf.Field` ''' w = type(self)(domain=domain, data=data, axes=axes, copy=False) w.long_name = 'weight' w.comment = 'Weights for %r' % self return w #--- End: def def _measure_weights(self, measure, comp, weights_axes, auto=False): ''' Cell measure weights ''' m = self.domain.items(measure, role='m', exact=True) if not m: if measure == 'area': return False if auto: return raise ValueError( "Can't get weights: No %r cell measure" % measure) key, clm = m.popitem() if m: if auto: return False raise ValueError("Multiple area cell measures") clm_axes0 = self.domain.item_axes(key) clm_axes = [axis for axis, n in izip(clm_axes0, clm.shape) if n > 1] for axis in clm_axes: if axis in weights_axes: if auto: return False raise ValueError( "Multiple weights specifications for %r axis" % self.domain.axis_name(axis)) clm = clm.Data.copy() if clm_axes != clm_axes0: iaxes = [clm_axes0.index(axis) for axis in clm_axes] clm.squeeze(iaxes, i=True) if methods: comp[tuple(clm_axes)] = measure+' cell measure' else: comp[tuple(clm_axes)] = clm weights_axes.update(clm_axes) return True #--- End: def def _linear_weights(self, axis, comp, weights_axes, auto=False): # ------------------------------------------------------------ # 1-d linear weights from dimension coordinates # ------------------------------------------------------------ d = self.dims(axis) if not d: if auto: return raise ValueError("Can't find axis matching %r" % axis) axis, dim = d.popitem() if d: if auto: return raise ValueError("Multiple axes matching %r" % axis) if dim.size == 1: return if axis in weights_axes: if auto: return raise ValueError( "Multiple weights specifications for %r axis" % self.domain.axis_name(axis)) if not dim.hasbounds: if auto: return raise ValueError( "Can't find linear weights for %r axis: No bounds" % dim.name(default='')) if dim.hasbounds: if methods: comp[(axis,)] = 'linear '+dim.name(default='') else: comp[(axis,)] = dim.cellsize #--- End: if weights_axes.add(axis) #--- End: def def _area_weights_XY(self, comp, weights_axes, auto=False): # ---------------------------------------------------- # Calculate area weights from X and Y dimension # coordinates # ---------------------------------------------------- xdims = self.dims({None: 'X', 'units': 'radians'}) ydims = self.dims({None: 'Y', 'units': 'radians'}) if not (xdims and ydims): if auto: return raise ValueError( "Insufficient coordinate constructs for calculating area weights") xaxis, xcoord = xdims.popitem() yaxis, ycoord = ydims.popitem() if xdims or ydims: if auto: return raise ValueError( "Ambiguous coordinate constructs for calculating area weights") for axis in (xaxis, yaxis): if axis in weights_axes: if auto: return raise ValueError( "Multiple weights specifications for %r axis" % self.axis_name(axis)) if xcoord.size > 1: if not xcoord.hasbounds: if auto: return raise ValueError( "Can't find area weights: No bounds for %r axis" % xcoord.name(default='')) if methods: comp[(xaxis,)] = 'linear '+xcoord.name(default='') else: cells = xcoord.cellsize cells.Units = _units_radians comp[(xaxis,)] = cells weights_axes.add(xaxis) #--- End: if if ycoord.size > 1: if not ycoord.hasbounds: if auto: return raise ValueError( "Can't find area weights: No bounds for %r axis" % ycoord.name(default='')) ycoord = ycoord.clip(-90, 90, units=Units('degrees')) ycoord = ycoord.sin(i=True) if methods: comp[(yaxis,)] = 'linear sine '+ycoord.name(default='') else: comp[(yaxis,)] = ycoord.cellsize weights_axes.add(yaxis) #--- End: if #--- End: def def _field_weights(self, fields, comp, weights_axes): # ------------------------------------------------------------ # Field weights # ------------------------------------------------------------ s = self.domain.analyse() for f in fields: t = f.domain.analyse() if t['undefined_axes']: if t.axes(size=gt(1)).intersection(t['undefined_axes']): raise ValueError("345jn456jn") f = f.squeeze() axes_map = {} for axis1 in f.data_axes(): identity = t['axis_to_id'].get(axis1, None) if identity is None: raise ValueError( "Weights field has unmatched, size > 1 %r axis" % f.axis_name(axis1)) axis0 = s['id_to_axis'].get(identity, None) if axis0 is None: raise ValueError( "Weights field has unmatched, size > 1 %r axis" % identity) axes_map[axis1] = axis0 if f.axis_size(axis1) != self.axis_size(axis0): raise ValueError( "Weights field has incorrectly sized %r axis (%d != %d)" % (identity, f.axis_size(axis1), self.axis_size(axis0))) # Check that the defining coordinate data arrays are # compatible coord0 = s['axis_to_coord'][axis0] coord1 = t['axis_to_coord'][axis1] if not coord0._equivalent_data(coord1): raise ValueError( "Weights field has incompatible %r coordinates" % identity) # Still here? Then the defining coordinates have # equivalent data arrays # If the defining coordinates are attached to # coordinate references then check that those coordinate references are # equivalent key0 = s['id_to_key'][identity] key1 = t['id_to_key'][identity] equivalent_refs = True for ref0 in self.refs().itervalues(): if key0 not in ref0.coords: continue equivalent_refs = False for ref1 in g.refs().itervalues(): if key1 not in ref1.coords: continue # Each defining coordinate has a # coordinate reference ... if self.domain.equivalent_refs(ref0, ref1, f.domain): # ... and those coordinate references are equivalent equivalent_refs = True #--- End: if break #--- End: for break #--- End: for if not equivalent_refs: raise ValueError( "Input weights field has incompatible coordinate references") #--- End: for f_axes = tuple([axes_map[axis1] for axis1 in f.data_axes()]) for axis1 in f_axes: if axis1 in weights_axes: raise ValueError( "Multiple weights specified for %r axis" % self.axis_name(axes_map[axis1])) #--- End: if comp[f_axes] = f.Data weights_axes.update(f_axes) #--- End: def # List functionality if self._list: kwargs2 = self._parameters(locals()) if components: raise ValueError("oooo 2") if methods: raise ValueError("oooo 3") return self._list_method('weights', kwargs2) if weights is None: # -------------------------------------------------------- # All equal weights # -------------------------------------------------------- if components: # Return an empty components dictionary return {} # Return a field containing a single weight of 1 return _field_of_weights(Data(1.0, '1')) #--- End: if # Still here? if methods: components = True comp = {} data_axes = self.domain.data_axes() weights_axes = set() if isinstance(weights, basestring) and weights == 'auto': # -------------------------------------------------------- # Autodetect all weights # -------------------------------------------------------- # Volume weights _measure_weights(self, 'volume', comp, weights_axes, auto=True) # Area weights if not _measure_weights(self, 'area', comp, weights_axes, auto=True): _area_weights_XY(self, comp, weights_axes, auto=True) # 1-d linear weights from dimension coordinates for axis in self.dims(): #.keys(): _linear_weights(self, axis, comp, weights_axes, auto=True) elif isinstance(weights, dict): # -------------------------------------------------------- # Dictionary of components # -------------------------------------------------------- for key, value in weights.iteritems(): try: key = [data_axes[iaxis] for iaxis in key] except IndexError: raise ValueError("s ^^^^^^ csdcvd 3456 4") multiple_weights = weights_axes.intersection(key) if multiple_weights: raise ValueError( "Multiple weights specifications for %r axis" % self.domain.axis_name(multiple_weights.pop())) #--- End: if weights_axes.update(key) comp[tuple(key)] = value.copy() #--- End: for else: fields = [] axes = [] if isinstance(weights, basestring) and weights in ('area', 'volume'): cell_measures = (weights,) else: cell_measures = [] for w in tuple(weights): if isinstance(w, self.__class__): fields.append(w) elif w in ('area', 'volume'): cell_measures.append(w) else: axes.append(w) #--- End: if # Field weights _field_weights(self, fields, comp, weights_axes) # Volume weights if 'volume' in cell_measures: _measure_weights(self, 'volume', comp, weights_axes) # Area weights if 'area' in cell_measures: if not _measure_weights(self, 'area', comp, weights_axes): _area_weights_XY(self, comp, weights_axes) # 1-d linear weights from dimension coordinates for axis in axes: _linear_weights(self, axis, comp, weights_axes, auto=False) #--- End: if # ------------------------------------------------------------ # Scale the weights so that they are <= 1.0 # ------------------------------------------------------------ if scale and not methods: # What to do about -ve weights? dch for key, w in comp.items(): wmax = w.data.max() if wmax > 0: wmax.dtype = float if not numpy_can_cast(wmax.dtype, w.dtype): w = w / wmax else: w /= wmax comp[key] = w #--- End: if if components: # -------------------------------------------------------- # Return a dictionary of component weights, which may be # empty. # -------------------------------------------------------- components = {} for key, v in comp.iteritems(): key = [data_axes.index(axis) for axis in key] if not key: continue components[tuple(key)] = v #--- End: for return components #--- End: if if methods: return components if not comp: # -------------------------------------------------------- # No component weights have been defined so return an # equal weights field # -------------------------------------------------------- return _field_of_weights(Data(1.0, '1')) # ------------------------------------------------------------ # Return a weights field which is the outer product of the # component weights # ------------------------------------------------------------ pp = sorted(comp.items()) waxes, wdata = pp.pop(0) while pp: a, y = pp.pop(0) wdata.outerproduct(y, i=True) waxes += a #--- End: while wdomain = self.domain.copy() asd = wdomain.axes().difference(weights_axes) # wdomain.dimensions.pop('data', None) wdomain._axes.pop('data', None) wdomain.remove_items(wdomain.items(axes=asd).keys()) wdomain.remove_axes(asd) return _field_of_weights(wdata, wdomain, waxes) #--- End: def #(any object which may be used to # initialise a `cf.Data` instance) # rolling_window=None, window_weights=None, # # rolling_window: optional # Group the axis elements for a "rolling window" collapse. The # axis is grouped into **consecutive** runs of **overlapping** # elements. The first group starts at the first element of the # axis and each following group is offset by one element from # the previous group, so that an element may appear in multiple # groups. The collapse operation is applied to each group # independently and the collapsed axis in the returned field # will have a size equal to the number of groups. If weights # have been given by the *weights* parameter then they are # applied to each group, unless alternative weights have been # provided with the *window_weights* parameter. The # *rolling_window* parameter may be one of: # # * An `int` defining the number of elements in each # group. Each group will have exactly this number of # elements. Note that if the group size does does not divide # exactly into the axis size then some elements at the end # of the axis will not be included in any group. # # Example: To define groups of 5 elements: # ``rolling_window=5``. # # .. # # * A `cf.Data` defining the group size. Each group contains a # consecutive run of elements whose range of coordinate # bounds does not exceed the group size. Note that 1) if the # group size is sufficiently small then some groups may be # empty and some elements may not be inside any group may # not be inside any group; 2) different groups may contain # different numbers of elements. # # Example: To create 10 kilometre windows: # ``rolling_window=cf.Data(10, 'km')``. # # window_weights: ordered sequence of numbers, optional # Specify the weights for a rolling window collapse. Each # non-empty group uses these weights in its collapse, and all # non-empty groups must have the same number elements as the # window weights. If *window_weights* is not set then the groups # take their weights from the *weights* parameter, and in this # case the groups may have different sizes. # # Example: To define a 1-2-1 smoothing filter: # ``rolling_window=3, window_weights=[1, 2, 1]``. def collapse(self, method, axes=None, squeeze=False, mtol=1, weights='auto', ddof=1, a=None, i=False, group=None, regroup=False, within_days=None, within_years=None, over_days=None, over_years=None, coordinate='mid_range', group_by='coords', **kwargs): r''' {+Fef,}Collapse axes of the field. Collapsing an axis involves reducing its size with a given (typically statistical) method. By default all axes with size greater than 1 are collapsed completely with the given method. For example, to find the minumum of the data array: >>> g = f.collapse('min') By default the calculations of means, standard deviations and variances use a combination of volume, area and linear weights based on the field's metadata. For example to find the mean of the data array, weighted where possible: >>> g = f.collapse('mean') Specific weights may be forced with the weights parameter. For example to find the variance of the data array, weighting the X and Y axes by cell area, the T axis linearly and leaving all other axes unweighted: >>> g = f.collapse('variance', weights=['area', 'T']) A subset of the axes may be collapsed. For example, to find the mean over the time axis: >>> f [+1] [+N][] >>> g = f.collapse('T: mean') >>> g [+1] [+N][] For example, to find the maximum over the time and height axes: >>> g = f.collapse('T: Z: max') or, equivalently: >>> g = f.collapse('max', axes=['T', 'Z']) An ordered sequence of collapses over different (or the same) subsets of the axes may be specified. For example, to first find the mean over the time axis and subequently the standard deviation over the latitude and longitude axes: >>> g = f.collapse('T: mean area: sd') or, equivalently, in two steps: >>> g = f.collapse('mean', axes='T').collapse('sd', axes='area') Grouped collapses are possible, whereby groups of elements along an axis are defined and each group is collapsed independently. The collapsed groups are concatenated so that the collapsed axis in the output field has a size equal to the number of groups. For example, to find the variance along the longitude axis within each group of size 10 degrees: >>> g = f.collapse('longitude: variance', group=cf.Data(10, 'degrees')) Climatological statistics (a type of grouped collapse) as defined by the CF conventions may be specified. For example, to collapse a time axis into multiannual means of calendar monthly minima: >>> g = f.collapse('time: minimum within years T: mean over years', ... within_years=cf.M()) In all collapses, missing data array elements are accounted for in the calculation. The following collapse methods are available, over any subset of the axes: ========================= ===================================================== Method Notes ========================= ===================================================== Maximum The maximum of the values. Minimum The minimum of the values. Sum The sum of the values. Mid-range The average of the maximum and the minimum of the values. Range The absolute difference between the maximum and the minimum of the values. Mean The unweighted mean, :math:`m`, of :math:`N` values :math:`x_i` is .. math:: m=\frac{1}{N}\sum_{i=1}^{N} x_i The weighted mean, :math:`\tilde{m}`, of :math:`N` values :math:`x_i` with corresponding weights :math:`w_i` is .. math:: \tilde{m}=\frac{1}{\sum_{i=1}^{N} w_i} \sum_{i=1}^{N} w_i x_i Standard deviation The unweighted standard deviation, :math:`s`, of :math:`N` values :math:`x_i` with mean :math:`m` and with :math:`N-ddof` degrees of freedom (:math:`ddof\ge0`) is .. math:: s=\sqrt{\frac{1}{N-ddof} \sum_{i=1}^{N} (x_i - m)^2} The weighted standard deviation, :math:`\tilde{s}_N`, of :math:`N` values :math:`x_i` with corresponding weights :math:`w_i`, weighted mean :math:`\tilde{m}` and with :math:`N` degrees of freedom is .. math:: \tilde{s}_N=\sqrt{\frac{1} {\sum_{i=1}^{N} w_i} \sum_{i=1}^{N} w_i(x_i - \tilde{m})^2} The weighted standard deviation, :math:`\tilde{s}`, of :math:`N` values :math:`x_i` with corresponding weights :math:`w_i` and with :math:`N-ddof` degrees of freedom :math:`(ddof>0)` is .. math:: \tilde{s}=\sqrt{ \frac{a \sum_{i=1}^{N} w_i}{a \sum_{i=1}^{N} w_i - ddof}} \tilde{s}_N where :math:`a` is the smallest positive number whose product with each weight is an integer. :math:`a \sum_{i=1}^{N} w_i` is the size of a new sample created by each :math:`x_i` having :math:`aw_i` repeats. In practice, :math:`a` may not exist or may be difficult to calculate, so :math:`a` is either set to a predetermined value or an approximate value is calculated (see the *a* parameter for details). Variance The variance is the square of the standard deviation. Sample size The sample size, :math:`N`, as would be used for other statistical calculations. Sum of weights The sum of sample weights, :math:`\sum_{i=1}^{N} w_i`, as would be used for other statistical calculations. Sum of squares of weights The sum of squares of sample weights, :math:`\sum_{i=1}^{N} {w_i}^{2}`, as would be used for other statistical calculations. ========================= ===================================================== .. versionadded:: 1.0 .. seealso:: `cell_area`, `weights`, `max`, `mean`, `mid_range`, `min`, `range`, `sample_size`, `sd`, `sum`, `var` :Parameters: method: `str` Define the collapse method. All of the axes specified by the *axes* parameter are collapsed simultaneously by this method. The method is given by one of the following strings: ======================================== ========================= *method* Description ======================================== ========================= ``'max'`` or ``'maximum'`` Maximum ``'min'`` or ``'minimum'`` Minimum ``'sum'`` Sum ``'mid_range'`` Mid-range ``'range'`` Range ``'mean'`` or ``'average'`` or ``'avg'`` Mean ``'sd'`` or ``'standard_deviation'`` Standard deviation ``'var'`` or ``'variance'`` Variance ``'sample_size'`` Sample size ``'sum_of_weights'`` Sum of weights ``'sum_of_weights2'`` Sum of squares of weights ======================================== ========================= An alternative form is to provide a CF cell methods-like string. In this case an ordered sequence of collapses may be defined and both the collapse methods and their axes are provided. The axes are interpreted as for the *axes* parameter, which must not also be set. For example: >>> g = f.collapse('time: max (interval 1 hr) X: Y: mean dim3: sd') is equivalent to: >>> g = f.collapse('max', axes='time') >>> g = g.collapse('mean', axes=['X', 'Y']) >>> g = g.collapse('sd', axes='dim3') Climatological collapses are carried out if a *method* string contains any of the modifiers ``'within days'``, ``'within years'``, ``'over days'`` or ``'over years'``. For example, to collapse a time axis into multiannual means of calendar monthly minima: >>> g = f.collapse('time: minimum within years T: mean over years', ... within_years=cf.M()) which is equivalent to: >>> g = f.collapse('time: minimum within years', within_years=cf.M()) >>> g = g.collapse('mean over years', axes='T') axes, kwargs: optional The axes to be collapsed. The axes are those that would be selected by this call of the field's `axes` method: ``f.axes(axes, **kwargs)``. See `cf.Field.axes` for details. If an axis has size 1 then it is ignored. By default all axes with size greater than 1 are collapsed. If *axes* has the special value ``'area'`` then it is assumed that the X and Y axes are intended. *Example:* ``axes='area'`` is equivalent to ``axes=['X', 'Y']``. ``axes=['area', Z']`` is equivalent to ``axes=['X', 'Y', 'Z']``. weights: optional Specify the weights for the collapse. The weights are those that would be returned by this call of the field's `~cf.Field.weights` method: ``f.weights(weights, components=True)``. By default weights is ``'auto'``, meaning that weights for all axes are created from the field's metadata by one or more of the following methods, in order of preference, 1. Cell volume (from cell measures) 2. Cell area (from cell measures) 3. Cell area calculated from (grid) latitude and (grid) longitude dimension coordinates with bounds 4. Cell sizes of dimension coordinates with bounds 5. Equal weights See `cf.Field.weights` for details. *Example:* To specify weights based on cell areas use ``weights='area'``. To specify weights based on cell areas and linearly in the vertical you could set ``weights=('area', 'Z')``. squeeze: `bool`, optional If True then size 1 collapsed axes are removed from the output data array. By default the axes which are collapsed are retained in the result's data array. mtol: `number`, optional Set the fraction of input array elements which is allowed to contain missing data when contributing to an individual output array element. Where this fraction exceeds *mtol*, missing data is returned. The default is 1, meaning that a missing datum in the output array only occurs when its contributing input array elements are all missing data. A value of 0 means that a missing datum in the output array occurs whenever any of its contributing input array elements are missing data. Any intermediate value is permitted. *Example:* To ensure that an output array element is a missing datum if more than 25% of its input array elements are missing data: ``mtol=0.25``. ddof: number, optional The delta degrees of freedom in the calculation of a standard deviation or variance. The number of degrees of freedom used in the calculation is (N-*ddof*) where N represents the number of non-missing elements. By default *ddof* is 1, meaning the standard deviation and variance of the population is estimated according to the usual formula with (N-1) in the denominator to avoid the bias caused by the use of the sample mean (Bessel's correction). a: optional Specify the value of :math:`a` in the calculation of a weighted standard deviation or variance when the *ddof* parameter is greater than 0. See the notes above for details. A value is required each output array element, so *a* must be a single number or else a field which is broadcastable to the collapsed field. By default the calculation of each output array element uses an approximate value of *a* which is the smallest positive number whose products with the smallest and largest of the contributing weights, and their sum, are all integers. In this case, a positive number is considered to be an integer if its decimal part is sufficiently small (no greater than 10\ :sup:`-8` plus 10\ :sup:`-5` times its integer part). *Example:* To guarantee that :math:`\tilde{s}` is exact when the weights for each output array element are collectively coprime integers: ``a=1``. *Note:* * The default approximation will never overestimate :math:`a`, so :math:`\tilde{s}` will always greater than or equal to its true value when :math:`a` is not specified. coordinate: `str`, optional Set how the cell coordinate values for collapsed axes are defined. This has no effect on the cell bounds for the collapsed axes, which always represent the extrema of the input coordinates. Valid values are: =============== =========================================== *coordinate* Description =============== =========================================== ``'mid_range'`` An output coordinate is the average of the first and last input coordinate bounds (or the first and last coordinates if there are no bounds). This is the default. ``'min'`` An output coordinate is the minimum of the input coordinates. ``'max'`` An output coordinate is the maximum of the input coordinates. =============== =========================================== group: optional Independently collapse groups of axis elements. Upon output, the results of the collapses are concatenated so that the output axis has a size equal to the number of groups. The *group* parameter defines how the elements are partitioned into groups, and may be one of: * A `cf.Data` defining the group size in terms of ranges of coordinate values. The first group starts at the first coordinate bound of the first axis element (or its coordinate if there are no bounds) and spans the defined group size. Each susbsequent group immediately follows the preceeeding one. By default each group contains the consective run of elements whose coordinate values lie within the group limits (see the *group_by* parameter). *Example:* To define groups of 10 kilometres: ``group=cf.Data(10, 'km')``. *Note:* * By default each element will be in exactly one group (see the *group_by* parameter). * Groups may contain different numbers of elements. * If no units are specified then the units of the coordinates are assumed. .. * A `cf.TimeDuration` defining the group size in terms of calendar months and years or other time intervals. The first group starts at or before the first coordinate bound of the first axis element (or its coordinate if there are no bounds) and spans the defined group size. Each susbsequent group immediately follows the preceeeding one. By default each group contains the consective run of elements whose coordinate values lie within the group limits (see the *group_by* parameter). *Example:* To define groups of 5 days, starting and ending at midnight on each day: ``group=cf.D(5)`` (see `cf.D`). *Example:* To define groups of 1 calendar month, starting and ending at day 16 of each month: ``group=cf.M(day=16)`` (see `cf.M`). *Note:* * By default each element will be in exactly one group (see the *group_by* parameter). * Groups may contain different numbers of elements. * The start of the first group may be before the first first axis element, depending on the offset defined by the time duration. For example, if ``group=cf.Y(month=12)`` then the first group will start on the closest 1st December to the first axis element. .. * A (sequence of) `cf.Query`, each of which is a condition defining one or more groups. Each query selects elements whose coordinates satisfy its condition and from these elements multiple groups are created - one for each maximally consecutive run within these elements. *Example:* To define groups of the season MAM in each year: ``group=cf.mam()`` (see `cf.mam`). *Example:* To define groups of the seasons DJF and JJA in each year: ``group=[cf.jja(), cf.djf()]``. To define groups for seasons DJF, MAM, JJA and SON in each year: ``group=cf.seasons()`` (see `cf.djf`, `cf.jja` and `cf.season`). *Example:* To define groups for longitude elements less than or equal to 90 degrees and greater than 90 degrees: ``group=[cf.le(90, 'degrees'), cf.gt(90, 'degrees')]`` (see `cf.le` and `cf.gt`). *Note:* * If a coordinate does not satisfy any of the conditions then its element will not be in a group. * Groups may contain different numbers of elements. * If no units are specified then the units of the coordinates are assumed. * If an element is selected by two or more queries then the latest one in the sequence defines which group it will be in. .. * An `int` defining the number of elements in each group. The first group starts with the first axis element and spans the defined number of consecutive elements. Each susbsequent group immediately follows the preceeeding one. *Example:* To define groups of 5 elements: ``group=5``. *Note:* * Each group has the defined number of elements, apart from the last group which may contain fewer elements. .. * A `numpy.array` of integers defining groups. The array must have the same length as the axis to be collapsed and its sequence of values correspond to the axis elements. Each group contains the elements which correspond to a common non-negative integer value in the numpy array. Upon output, the collapsed axis is arranged in order of increasing group number. *Example:* For an axis of size 8, create two groups, the first containing the first and last elements and the second containing the 3rd, 4th and 5th elements, whilst ignoring the 2nd, 6th and 7th elements: ``group=numpy.array([0, -1, 4, 4, 4, -1, -2, 0])``. *Note:* * The groups do not have to be in runs of consective elements; they may be scattered throughout the axis. * An element which corresponds to a negative integer in the array will not be in a group. group_by: `str`, optional Specify how coordinates are assigned to the groups defined by the *group*, *within_days* or *within_years* parameter. Ignored unless one of these parameters is a `cf.Data` or `cf.TimeDuration` object. The *group_by* parameter may be one of: * ``'coords'``. This is the default. Each group contains the axis elements whose coordinate values lie within the group limits. Every element will be in a group. .. * ``'bounds'``. Each group contains the axis elements whose upper and lower coordinate bounds both lie within the group limits. Some elements may not be inside any group, either because the group limits do not coincide with coordinate bounds or because the group size is sufficiently small. regroup: `bool`, optional For grouped collapses, return a `numpy.array` of integers which identifies the groups defined by the *group* parameter. The array is interpreted as for a numpy array value of the *group* parameter, and thus may subsequently be used by *group* parameter in a separate collapse. For example: >>> groups = f.collapse('time: mean', group=10, regroup=True) >>> g = f.collapse('time: mean', group=groups) is equivalent to: >>> g = f.collapse('time: mean', group=10) within_days: optional Independently collapse groups of reference-time axis elements for CF "within days" climatological statistics. Each group contains elements whose coordinates span a time interval of up to one day. Upon output, the results of the collapses are concatenated so that the output axis has a size equal to the number of groups. *Note:* For CF compliance, a "within days" collapse should be followed by an "over days" collapse. The *within_days* parameter defines how the elements are partitioned into groups, and may be one of: * A `cf.TimeDuration` defining the group size in terms of a time interval of up to one day. The first group starts at or before the first coordinate bound of the first axis element (or its coordinate if there are no bounds) and spans the defined group size. Each susbsequent group immediately follows the preceeeding one. By default each group contains the consective run of elements whose coordinate values lie within the group limits (see the *group_by* parameter). *Example:* To define groups of 6 hours, starting at 00:00, 06:00, 12:00 and 18:00: ``within_days=cf.h(6)`` (see `cf.h`). *Example:* To define groups of 1 day, starting at 06:00: ``within_days=cf.D(1, hour=6)`` (see `cf.D`). *Note:* * Groups may contain different numbers of elements. * The start of the first group may be before the first first axis element, depending on the offset defined by the time duration. For example, if ``group=cf.D(hour=12)`` then the first group will start on the closest midday to the first axis element. .. * A (sequence of) `cf.Query`, each of which is a condition defining one or more groups. Each query selects elements whose coordinates satisfy its condition and from these elements multiple groups are created - one for each maximally consecutive run within these elements. *Example:* To define groups of 00:00 to 06:00 within each day, ignoring the rest of each day: ``within_days=cf.hour(cf.le(6))`` (see `cf.hour` and `cf.le`). *Example:* To define groups of 00:00 to 06:00 and 18:00 to 24:00 within each day, ignoring the rest of each day: ``within_days=[cf.hour(cf.le(6)), cf.hour(cf.gt(18))]`` (see `cf.gt`, `cf.hour` and `cf.le`). *Note:* * Groups may contain different numbers of elements. * If no units are specified then the units of the coordinates are assumed. * If a coordinate does not satisfy any of the conditions then its element will not be in a group. * If an element is selected by two or more queries then the latest one in the sequence defines which group it will be in. within_years: optional Independently collapse groups of reference-time axis elements for CF "within years" climatological statistics. Each group contains elements whose coordinates span a time interval of up to one calendar year. Upon output, the results of the collapses are concatenated so that the output axis has a size equal to the number of groups. *Note:* For CF compliance, a "within years" collapse should be followed by an "over years" collapse. The *within_years* parameter defines how the elements are partitioned into groups, and may be one of: * A `cf.TimeDuration` defining the group size in terms of a time interval of up to one calendar year. The first group starts at or before the first coordinate bound of the first axis element (or its coordinate if there are no bounds) and spans the defined group size. Each susbsequent group immediately follows the preceeeding one. By default each group contains the consective run of elements whose coordinate values lie within the group limits (see the *group_by* parameter). *Example:* To define groups of 90 days: ``within_years=cf.D(90)`` (see `cf.D`). *Example:* To define groups of 3 calendar months, starting on the 15th of a month: ``within_years=cf.M(3, day=15)`` (see `cf.M`). *Note:* * Groups may contain different numbers of elements. * The start of the first group may be before the first first axis element, depending on the offset defined by the time duration. For example, if ``group=cf.Y(month=12)`` then the first group will start on the closest 1st December to the first axis element. .. * A (sequence of) `cf.Query`, each of which is a condition defining one or more groups. Each query selects elements whose coordinates satisfy its condition and from these elements multiple groups are created - one for each maximally consecutive run within these elements. *Example:* To define groups for the season MAM within each year: ``within_years=cf.mam()`` (see `cf.mam`). *Example:* To define groups for February and for November to December within each year: ``within_years=[cf.month(2), cf.month(cf.ge(11))]`` (see `cf.month` and `cf.ge`). *Note:* * The first group may start outside of the range of coordinates (the start of the first group is controlled by parameters of the `cf.TimeDuration`). * If group boundaries do not coincide with coordinate bounds then some elements may not be inside any group. * If the group size is sufficiently small then some elements may not be inside any group. * Groups may contain different numbers of elements. over_days: optional Independently collapse groups of reference-time axis elements for CF "over days" climatological statistics. Each group contains elements whose coordinates are **matching**, in that their lower bounds have a common time of day but different dates of the year, and their upper bounds also have a common time of day but different dates of the year. Upon output, the results of the collapses are concatenated so that the output axis has a size equal to the number of groups. *Example:* An element with coordinate bounds {1999-12-31 06:00:00, 1999-12-31 18:00:00} **matches** an element with coordinate bounds {2000-01-01 06:00:00, 2000-01-01 18:00:00}. *Example:* An element with coordinate bounds {1999-12-31 00:00:00, 2000-01-01 00:00:00} **matches** an element with coordinate bounds {2000-01-01 00:00:00, 2000-01-02 00:00:00}. *Note:* * A *coordinate* parameter value of ``'min'`` is assumed, regardless of its given value. * A *group_by* parameter value of ``'bounds'`` is assumed, regardless of its given value. * An "over days" collapse must be preceded by a "within days" collapse, as described by the CF conventions. If the field already contains sub-daily data, but does not have the "within days" cell methods flag then it may be added, for example, as follows (this example assumes that the appropriate cell method is the most recently applied, which need not be the case; see `cf.CellMethods` for details): >>> f.cell_methods[-1].within = 'days' The *over_days* parameter defines how the elements are partitioned into groups, and may be one of: * `None`. This is the default. Each collection of **matching** elements forms a group. .. * A `cf.TimeDuration` defining the group size in terms of a time duration of at least one day. Multiple groups are created from each collection of **matching** elements - the first of which starts at or before the first coordinate bound of the first element and spans the defined group size. Each susbsequent group immediately follows the preceeeding one. By default each group contains the **matching** elements whose coordinate values lie within the group limits (see the *group_by* parameter). *Example:* To define groups spanning 90 days: ``over_days=cf.D(90)`` or ``over_days=cf.h(2160)``. (see `cf.D` and `cf.h`). *Example:* To define groups spanning 3 calendar months, starting and ending at 06:00 in the first day of each month: ``over_days=cf.M(3, hour=6)`` (see `cf.M`). *Note:* * Groups may contain different numbers of elements. * The start of the first group may be before the first first axis element, depending on the offset defined by the time duration. For example, if ``group=cf.M(day=15)`` then the first group will start on the closest 15th of a month to the first axis element. .. * A (sequence of) `cf.Query`, each of which is a condition defining one or more groups. Each query selects elements whose coordinates satisfy its condition and from these elements multiple groups are created - one for each subset of **matching** elements. *Example:* To define groups for January and for June to December, ignoring all other months: ``over_days=[cf.month(1), cf.month(cf.wi(6, 12))]`` (see `cf.month` and `cf.wi`). *Note:* * If a coordinate does not satisfy any of the conditions then its element will not be in a group. * Groups may contain different numbers of elements. * If an element is selected by two or more queries then the latest one in the sequence defines which group it will be in. over_years: optional Independently collapse groups of reference-time axis elements for CF "over years" climatological statistics. Each group contains elements whose coordinates are **matching**, in that their lower bounds have a common sub-annual date but different years, and their upper bounds also have a common sub-annual date but different years. Upon output, the results of the collapses are concatenated so that the output axis has a size equal to the number of groups. *Example:* An element with coordinate bounds {1999-06-01 06:00:00, 1999-09-01 06:00:00} **matches** an element with coordinate bounds {2000-06-01 06:00:00, 2000-09-01 06:00:00}. *Example:* An element with coordinate bounds {1999-12-01 00:00:00, 2000-12-01 00:00:00} **matches** an element with coordinate bounds {2000-12-01 00:00:00, 2001-12-01 00:00:00}. *Note:* * A *coordinate* parameter value of ``'min'`` is assumed, regardless of its given value. * A *group_by* parameter value of ``'bounds'`` is assumed, regardless of its given value. * An "over years" collapse must be preceded by a "within years" or an "over days" collapse, as described by the CF conventions. If the field already contains sub-annual data, but does not have the "within years" or "over days" cell methods flag then it may be added, for example, as follows (this example assumes that the appropriate cell method is the most recently applied, which need not be the case; see `cf.CellMethods` for details): >>> f.cell_methods[-1].over = 'days' The *over_years* parameter defines how the elements are partitioned into groups, and may be one of: * `None`. Each collection of **matching** elements forms a group. This is the default. .. * A `cf.TimeDuration` defining the group size in terms of a time interval of at least one calendar year. Multiple groups are created from each collection of **matching** elements - the first of which starts at or before the first coordinate bound of the first element and spans the defined group size. Each susbsequent group immediately follows the preceeeding one. By default each group contains the **matching** elements whose coordinate values lie within the group limits (see the *group_by* parameter). *Example:* To define groups spanning 10 calendar years: ``over_years=cf.Y(10)`` or ``over_years=cf.M(120)`` (see `cf.M` and `cf.Y`). *Example:* To define groups spanning 5 calendar years, starting and ending at 06:00 on 01 December of each year: ``over_years=cf.Y(5, month=12, hour=6)`` (see `cf.Y`). *Note:* * Groups may contain different numbers of elements. * The start of the first group may be before the first first axis element, depending on the offset defined by the time duration. For example, if ``group=cf.Y(month=12)`` then the first group will start on the closest 1st December to the first axis element. .. * A (sequence of) `cf.Query`, each of which is a condition defining one or more groups. Each query selects elements whose coordinates satisfy its condition and from these elements multiple groups are created - one for each subset of **matching** elements. *Example:* To define one group spanning 1981 to 1990 and another spanning 2001 to 2005: ``over_years=[cf.year(cf.wi(1981, 1990), cf.year(cf.wi(2001, 2005)]`` (see `cf.year` and `cf.wi`). *Note:* * If a coordinate does not satisfy any of the conditions then its element will not be in a group. * Groups may contain different numbers of elements. * If an element is selected by two or more queries then the latest one in the sequence defines which group it will be in. {+i} :Returns: [+1] out: `cf.Field` or `numpy.ndarray` [+N] out: `cf.{+variable}` or `list` {+Fef,}The collapsed field. If the *regroup* parameter is True then a numpy array is returned. :Examples: Calculate the unweighted mean over a the entire field: >>> g = f.collapse('mean') Five equivalent ways to calculate the unweighted mean over a CF latitude axis: >>> g = f.collapse('latitude: mean') >>> g = f.collapse('lat: avg') >>> g = f.collapse('Y: average') >>> g = f.collapse('mean', 'Y') >>> g = f.collapse('mean', ['latitude']) Three equivalent ways to calculate an area weighted mean over CF latitude and longitude axes: >>> g = f.collapse('area: mean', weights='area') >>> g = f.collapse('lat: lon: mean', weights='area') >>> g = f.collapse('mean', axes=['Y', 'X'], weights='area') Two equivalent ways to calculate a time weighted mean over CF latitude, longitude and time axes: >>> g = f.collapse('X: Y: T: mean', weights='T') >>> g = f.collapse('mean', axes=['T', 'Y', 'X'], weights='T') Find how many non-missing elements in each group of a grouped collapse: >>> f.collapse('latitude: sample_size', group=cf.Data(5 'degrees')) ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) if regroup: raise ValueError("oooo") return self._list_method('collapse', kwargs2) if i: f = self else: f = self.copy() # Whether or not to create null bounds for null # collapses. I.e. if the collapse axis has size 1 and no # bounds, whether or not to create upper and lower bounds to # the coordinate value. If this occurs it's because the null # collapse is part of a grouped collapse and so will be # concatenated to other collapses for the final result: bounds # will be made for the grouped collapse, so all elements need # bounds. _create_zero_size_cell_bounds = kwargs.get('_create_zero_size_cell_bounds', False) # ------------------------------------------------------------ # Parse the methods and axes # ------------------------------------------------------------ if ':' in method: # Convert a cell methods string (such as 'area: mean dim3: # dim2: max T: minimum height: variance') to a CellMethods # object if axes is not None: raise ValueError( "Can't collapse: Can't set axes when method is CF cell methods-like string") method = CellMethods(method) all_methods = method.method all_axes = method.names all_within = method.within all_over = method.over else: x = method.split(' within ') if method == x[0]: within = None x = method.split(' over ') if method == x[0]: over = None else: method, over = x else: method, within = x if isinstance(axes, basestring): axes = (axes,) all_methods = (method,) all_within = (within,) all_over = (over,) all_axes = (axes,) #--- End: if # Parse special axes values all_axes2 = [] for axes in all_axes: if axes is None: all_axes2.append(axes) continue axes2 = [] for axis in axes: if axis == 'area': axes2.extend(('X', 'Y')) # Not yet in CF #elif axis == 'volume': # axes2.extend(('X', 'Y', 'Z')) else: axes2.append(axis) #--- End: for all_axes2.append(axes2) #--- End: for all_axes = all_axes2 if group is not None and len(all_axes) > 1: raise ValueError( "Can't use group parameter for multiple collapses") # ------------------------------------------------------------ # # ------------------------------------------------------------ for method, axes, within, over in izip(all_methods, all_axes, all_within, all_over): domain = f.domain method2 = _collapse_methods.get(method, None) if method2 is None: raise ValueError("Can't collapse: Unknown method: %s" % method) method = method2 kwargs['ordered'] = True if method not in ('sample_size', 'sum_of_weights', 'sum_of_weights2'): kwargs['size'] = gt(1) collapse_axes = domain.axes(axes, **kwargs) if not collapse_axes: # Do nothing if there are no collapse axes if _create_zero_size_cell_bounds: # Create null bounds if requested for axis in domain.axes(axes): d = domain.item(axes, role='d') if d and not d.hasbounds: d.get_bounds(create=True, insert=True, cellsize=0) #--- End: if continue # if axes != (None,) and len(collapse_axes) != len(axes): # raise ValueError("Can't collapse: Ambiguous collapse axes") # Check that there are enough elements to collapse size = reduce(operator_mul, domain.axes_sizes(collapse_axes).values(), 1) min_size = _collapse_min_size.get(method, 1) if size < min_size: raise ValueError( "Can't calculate %s from fewer than %d elements" % (_collapse_cell_methods[method], min_size)) grouped_collapse = (within is not None or over is not None or group is not None) if grouped_collapse: if len(collapse_axes) > 1: raise ValueError( "Can't group collapse multiple axes simultaneously") # ------------------------------------------------------------ # Calculate weights # ------------------------------------------------------------ g_weights = weights if method in _collapse_weighted_methods: g_weights = f.weights(weights, scale=True, components=True) if not g_weights: g_weights = None #--- End: if f = f._grouped_collapse(method, collapse_axes[0], within=within, over=over, within_days=within_days, within_years=within_years, over_days=over_days, over_years=over_years, group=group, regroup=regroup, mtol=mtol, ddof=ddof, weights=g_weights, a=a, squeeze=squeeze, coordinate=coordinate, group_by=group_by) continue elif regroup: raise ValueError( "Can't return n array of groups for a non-grouped collapse") # method = _collapse_methods.get(method, None) # if method is None: # raise ValueError("uih luh hbblui") # # # Check that there are enough elements to collapse # size = reduce(operator_mul, domain.axes_sizes(collapse_axes).values()) # min_size = _collapse_min_size.get(method, 1) # if size < min_size: # raise ValueError( # "Can't calculate %s from fewer than %d elements" % # (_collapse_cell_methods[method], min_size)) data_axes = domain.data_axes() iaxes = [data_axes.index(axis) for axis in collapse_axes] # ------------------------------------------------------------ # Calculate weights # ------------------------------------------------------------ d_kwargs = {} if weights is not None: if method in _collapse_weighted_methods: d_weights = f.weights(weights, scale=True, components=True) if d_weights: d_kwargs['weights'] = d_weights elif not equals(weights, 'auto'): # doc this raise ValueError( "Can't collapse: Can't weight {0!r} collapse method".format(method)) #--- End: if if method in _collapse_ddof_methods: d_kwargs['ddof'] = ddof d_kwargs['a'] = a # -------------------------------------------------------- # Collapse the data array # -------------------------------------------------------- getattr(f.Data, method)(axes=iaxes, squeeze=squeeze, mtol=mtol, i=True, **d_kwargs) if squeeze: # ---------------------------------------------------- # Remove the collapsed axes from the field's list of # data array axes # ---------------------------------------------------- domain._axes['data'] = [axis for axis in data_axes if axis not in collapse_axes] # -------------------------------------------------------- # Update ancillary variables # -------------------------------------------------------- f._conform_ancillary_variables(collapse_axes) # ------------------------------------------------------------ # Update fields in coordinate references # ------------------------------------------------------------ f._conform_ref_fields(collapse_axes) #--------------------------------------------------------- # Update dimension coordinates, auxiliary coordinates and # cell measures # --------------------------------------------------------- for axis in collapse_axes: # Ignore axes which are already size 1 if domain.axis_size(axis) == 1: continue # REMOVE all cell measures which span this axis domain.remove_items(role=('m',), axes=axis) # REMOVE all 2+ dimensional auxiliary coordinates # which span this axis domain.remove_items(role=('a',), axes=axis, ndim=gt(1)) # REMOVE all 1 dimensional auxiliary coordinates which # span this axis and have different values in their # data array and bounds. # # KEEP, after changing their data arrays, all 1 # dimensional auxiliary coordinates which span this # axis and have the same values in their data array # and bounds. for key, aux in domain.items(role=('a',), axes=axis, ndim=1).iteritems(): d = aux.subspace[0] if ((aux.subspace[:-1] != aux.subspace[1:]).any() or aux.hasbounds and (aux.bounds != d.bounds).any()): domain.remove_item(key) else: # Change the data array for this auxiliary # coordinate aux.insert_data(d.data, copy=False) if d.hasbounds: aux.insert_bounds(d.bounds.data, copy=False) #--- End: for dim_coord = domain.item(axis, role=('d',)) if dim_coord is None: continue # Create a new dimension coordinate for this axis if dim_coord.hasbounds: bounds = [dim_coord.bounds.datum(0), dim_coord.bounds.datum(-1)] else: bounds = [dim_coord.datum(0), dim_coord.datum(-1)] units = dim_coord.Units if coordinate == 'mid_range': data = Data([(bounds[0] + bounds[1])*0.5], units) elif coordinate == 'min': data = dim_coord.data.min() elif coordinate == 'max': data = dim_coord.data.max() else: raise ValueError( "Can't collapse: Bad parameter value: coordinate={0!r}".format(coordinate)) bounds = Data([bounds], units) dim_coord.insert_data(data, bounds=bounds, copy=False) # Put the new dimension coordinate into the domain domain.insert_axis(1, key=axis, replace=True) domain.insert_dim(dim_coord, key=axis, copy=False, replace=True) #--- End: for # -------------------------------------------------------- # Update the cell methods # -------------------------------------------------------- cell_method = _collapse_cell_methods[method] if cell_method is not None: # This collapse method has an associated cell method if not hasattr(f, 'cell_methods'): f.cell_methods = CellMethods() collapse_axes = sorted(collapse_axes) name = [] for axis in collapse_axes: item = domain.item(axis) if item is not None: name.append(item.identity(default=axis)) else: name.append(axis) #--- End: for string = '%s: %s' % (': '.join(name), cell_method) cell_method = CellMethods(string) cell_method.axes = collapse_axes if not f.cell_methods or not f.cell_methods[-1].equivalent(cell_method): f.cell_methods += cell_method #--- End: if #--- End: for # ------------------------------------------------------------ # Return the collapsed field (or the classification array) # ------------------------------------------------------------ return f #--- End: def def _grouped_collapse(self, method, axis, within=None, over=None, within_days=None, within_years=None, over_days=None, over_years=None, group=None, mtol=None, ddof=None, a=None, regroup=None, coordinate=None, weights=None, squeeze=None, group_by=None): ''' :Parameters: method: str axis: str over: str within: str ''' def _ddddd(classification, n, lower, upper, increasing, coord, group_by_coords, extra_condition): ''' :Returns: out: 4-tuple of (numpy.ndarray, int, date-time, date-time) ''' if group_by_coords: q = ge(lower) & lt(upper) else: q = (ge(lower, attr='lower_bounds') & le(upper, attr='upper_bounds')) if extra_condition: q &= extra_condition # print q, coord index = q.evaluate(coord).array classification[index] = n if increasing: lower = upper else: upper = lower n += 1 return classification, n, lower, upper #--- End: def def _time_interval(classification, n, coord, interval, lower, upper, lower_limit, upper_limit, group_by, extra_condition=None): ''' :Returns: out: 2-tuple of numpy array, int ''' group_by_coords = group_by == 'coords' months = interval.Units == Units('calendar_months') years = interval.Units == Units('calendar_years') days = interval.Units == Units('days') hours = interval.Units == Units('hours') minutes = interval.Units == Units('minutes') seconds = interval.Units == Units('seconds') calendar = coord.Units._calendar if coord.increasing: # Increasing dimension coordinate if months or years: lower, upper = interval.interval(lower.year, calendar=calendar, end=True) elif days: lower, upper = interval.interval(lower.year, lower.month, calendar=calendar, end=True) elif hours: lower, upper = interval.interval(lower.year, lower.month, lower.day, calendar=calendar, end=True) elif minutes: lower, upper = interval.interval(lower.year, lower.month, lower.day, lower.hour, calendar=calendar, end=True) elif seconds: lower, upper = interval.interval(lower.year, lower.month, lower.day, lower.hour, lower.minute, calendar=calendar, end=True) while lower <= upper_limit: lower, upper = interval.interval(*lower.timetuple()[:6], calendar=calendar) classification, n, lower, upper = _ddddd( classification, n, lower, upper, True, coord, group_by_coords, extra_condition) else: # Decreasing dimension coordinate if months or years: lower, upper = interval.interval(upper.year, calendar=calendar) elif days: lower, upper = interval.interval(upper.year, upper.month, calendar=calendar) elif hours: lower, upper = interval.interval(upper.year, upper.month, upper.day, calendar=calendar) elif minutes: lower, upper = interval.interval(upper.year, upper.month, upper.day, upper.hour, calendar=calendar) elif seconds: lower, upper = interval.interval(upper.year, upper.month, upper.day, upper.hour, upper.minute, calendar=calendar) while upper >= lower_limit: lower, upper = interval.interval(*upper.timetuple()[:6], calendar=calendar, end=True) classification, n, lower, upper = _ddddd( classification, n, lower, upper, False, coord, group_by_coords, extra_condition) #--- End: if return classification, n #--- End: def def _data_interval(classification, n, coord, interval, lower, upper, lower_limit, upper_limit, group_by, extra_condition=None): ''' :Returns: out: 2-tuple of numpy array, int ''' group_by_coords = group_by == 'coords' if coord.increasing: # Increasing dimension coordinate lower= lower.squeeze() while lower <= upper_limit: upper = lower + interval classification, n, lower, upper = _ddddd( classification, n, lower, upper, True, coord, group_by_coords, extra_condition) else: # Decreasing dimension coordinate upper = upper.squeeze() while upper >= lower_limit: lower = upper - interval classification, n, lower, upper = _ddddd( classification, n, lower, upper, False, coord, group_by_coords, extra_condition) #--- End: if return classification, n #--- End: def def _selection(classification, n, coord, selection, parameter, extra_condition=None): ''':Parameters: classification: `numpy.ndarray` n: `int` coord: `cf.DimensionCoordinate` selection: sequence of `cf.Query` *Example:* ``selection=[cf.djf]`` parameter: str The name of the `cf.Field.collapse` parameter which defined *selection*. This is used in error messages. *Example:* ``parameter='within_years'`` extra_condition: `cf.Query`, optional :Returns: out: `numpy.ndarray`, `int` ''' # Create an iterator for stepping through each cf.Query in # the selection sequence try: iterator = iter(selection) except TypeError: raise ValueError( "Can't collapse: Bad value for {0} parameter: {1!r}".format( parameter, selection)) for c in iterator: if not isinstance(c, Query): raise ValueError( "Can't collapse: {0} parameter contains a non-{1} object: {2!r}".format( parameter, Query.__name__, c)) if extra_condition: c &= extra_condition index = c.evaluate(coord).array classification[index] = n n += 1 #--- End: for return classification, n #--- End: def def _discern_runs(classification): ''' :Returns: out: `numpy.ndarray` ''' x = numpy_where(numpy_diff(classification))[0] + 1 if not x.size: if classification[0] >= 0: classification[:] = 0 return classification if classification[0] >= 0: classification[0:x[0]] = 0 for n, (i, j) in enumerate(zip(x[:-1], x[1:])): if classification[i] >= 0: classification[i:j] = n+1 #-- End: for if classification[x[-1]] >= 0: classification[x[-1]:] = n+2 return classification #--- End: def def _tyu(coord, group_by, time_interval): ''':Parameters: coord: `cf.Coordinate` group_by: `str` As for the *group_by* parameter of the `collapse` method. time_interval: `bool` If True then :Returns: out: 4-`tuple` of date-time objects ''' if coord.hasbounds: bounds = coord.bounds lower_bounds = bounds.lower_bounds upper_bounds = bounds.upper_bounds lower = lower_bounds[0] upper = upper_bounds[0] lower_limit = lower_bounds[-1] upper_limit = upper_bounds[-1] elif group_by == 'coords': if coord.increasing: lower = coord.data[0] upper = coord.data[-1] else: lower = coord.data[-1] upper = coord.data[0] lower_limit = lower upper_limit = upper else: raise ValueError( "Can't collapse: {0!r} coordinate bounds are required with group_by={1!r}".format( coord.name(''), group_by)) if time_interval: units = coord.Units if units.isreftime: lower = lower.dtarray[0] upper = upper.dtarray[0] lower_limit = lower_limit.dtarray[0] upper_limit = upper_limit.dtarray[0] elif not units.istime: raise ValueError( "Can't group by %s when coordinates have units %r" % (TimeDuration.__name__, coord.Units)) #--- End: if return lower, upper, lower_limit, upper_limit #--- End: def def _group_weights(weights, iaxis, index): ''' Subspace weights components. :Parameters: weights: `dict` or `None` iaxis: `int` index: `list` :Returns: out: `dict` or `None` :Examples: >>> print weights None >>> print _group_weights(weights, 2, [2, 3, 40]) None >>> print _group_weights(weights, 1, slice(2, 56)) None >>> weights >>> _group_weights(weights, 2, [2, 3, 40]) >>> _group_weights(weights, 1, slice(2, 56)) ''' if not isinstance(weights, dict): return weights weights = weights.copy() for iaxes, value in weights.iteritems(): if iaxis in iaxes: indices = [slice(None)] * len(iaxes) indices[iaxes.index(iaxis)] = index weights[iaxes] = value.subspace[tuple(indices)] break #--- End: for return weights #--- End: def # START OF MAIN CODE axis_size = self.domain.axis_size(axis) # Size of uncollapsed axis iaxis = self.data_axes().index(axis) # Integer position of collapse axis fl = [] # If group, rolling window, classification, etc, do something # special for size one axes - either return unchanged # (possibly mofiying cell methods with , e.g, within_dyas', or # raising an exception for 'can't match', I suppose. classification = None if group is not None: if within is not None or over is not None: raise ValueError( "Can't set 'group' parameter for a climatological time collapse") if isinstance(group, numpy_ndarray): classification = numpy_squeeze(group.copy()) coord = self.dim(axis) if classification.dtype.kind != 'i': raise ValueError( "Can't collapse: Can't group by numpy array of type %s" % classification.dtype.name) elif classification.shape != (axis_size,): raise ValueError( "Can't collapse: group by numpy array of integers has incorrect shape: %s" % classification.shape) # Set group to None group = None #-- End: if if group is not None: if isinstance(group, Query): group = (group,) if isinstance(group, (int, long)): # ---------------------------------------------------- # E.g. group=3 # ---------------------------------------------------- coord = None classification = numpy_empty((axis_size,), int) start = 0 end = group n = 0 while start < axis_size: classification[start:end] = n start = end end += group n += 1 #--- End: while elif isinstance(group, TimeDuration): # ---------------------------------------------------- # E.g. group=cf.M() # ---------------------------------------------------- coord = self.dim(axis) if coord is None: raise ValueError("dddddd siduhfsuildfhsuil dhfdui ") # # Get the bounds # if not coord.hasbounds: # coord = coord.copy() # # bounds = coord.get_bounds(create=True, insert=True) classification = numpy_empty((axis_size,), int) classification.fill(-1) lower, upper, lower_limit, upper_limit = _tyu(coord, group_by, True) classification, n = _time_interval(classification, 0, coord=coord, interval=group, lower=lower, upper=upper, lower_limit=lower_limit, upper_limit=upper_limit, group_by=group_by) elif isinstance(group, Data): # ---------------------------------------------------- # Chunks of # ---------------------------------------------------- coord = self.dim(axis) if coord is None: raise ValueError("dddddd siduhfsuildfhsuil dhfdui ") if group.size != 1: raise ValueError( "Can't group by SIZE > 1") if group.Units and not group.Units.equivalent(coord.Units): raise ValueError( "Can't group by %r when coordinates have units %r" % (interval, coord.Units)) classification = numpy_empty((axis_size,), int) classification.fill(-1) group = group.squeeze() lower, upper, lower_limit, upper_limit = _tyu(coord, group_by, False) classification, n = _data_interval(classification, 0, coord=coord, interval=group, lower=lower, upper=upper, lower_limit=lower_limit, upper_limit=upper_limit, group_by=group_by) else: # ---------------------------------------------------- # E.g. group=[cf.month(4), cf.month(cf.wi(9, 11))] # ---------------------------------------------------- coord = self.dim(axis) if coord is None: coord = self.aux(axes_all=axis) if coord is None: raise ValueError("Need a defining 1-d coordinate") classification = numpy_empty((axis_size,), int) classification.fill(-1) classification, n = _selection(classification, n=0, coord=coord, selection=group, parameter='group') classification = _discern_runs(classification) #--- End: if #--- End: if if classification is None: if over == 'days': # ---------------------------------------------------- # Over days # ---------------------------------------------------- coord = self.dim(axis) if coord is None or not coord.Units.isreftime: raise ValueError( "Can't collapse: Reference-time dimension coordinates are required for an \"over days\" collapse") if not coord.hasbounds: raise ValueError( "Can't collapse: Reference-time dimension coordinate bounds are required for an \"over days\" collapse") cell_methods = getattr(self, 'cell_methods', None) if not cell_methods or 'days' not in cell_methods.within: raise ValueError( "Can't collapse: An \"over days\" collapse must come after a \"within days\" collapse") # Parse the over_days parameter if isinstance(over_days, Query): over_days = (over_days,) elif isinstance(over_days, TimeDuration): if over_days.Units.istime and over_days < Data(1, 'day'): raise ValueError( "Can't collapse: Bad parameter value: over_days=%r" % over_days) #--- End: if coordinate = 'min' classification = numpy_empty((axis_size,), int) classification.fill(-1) if isinstance(over_days, TimeDuration): lower, upper, lower_limit, upper_limit = _tyu(coord, group_by, True) bounds = coord.bounds lower_bounds = bounds.lower_bounds.dtarray upper_bounds = bounds.upper_bounds.dtarray HMS0 = None # * An "over days" collapse must be preceded by a "within # days" collapse, as described by the CF conventions. If the # field already contains sub-daily data, but does not have # the "within days" cell methods flag then it may be added, # for example, as follows (this example assumes that the # appropriate cell method is the most recently applied, # which need not be the case; see `cf.CellMethods` for # details): # # >>> f.cell_methods[-1].within = 'days' n = 0 for lower, upper in izip(lower_bounds, upper_bounds): HMS_l = (eq(lower.hour , attr='hour') & eq(lower.minute, attr='minute') & eq(lower.second, attr='second')).addattr('lower_bounds') HMS_u = (eq(upper.hour , attr='hour') & eq(upper.minute, attr='minute') & eq(upper.second, attr='second')).addattr('upper_bounds') HMS = HMS_l & HMS_u if not HMS0: HMS0 = HMS elif HMS.equals(HMS0): break if over_days is None: # -------------------------------------------- # over_days=None # -------------------------------------------- # Over all days index = HMS.evaluate(coord).array classification[index] = n n += 1 elif isinstance(over_days, TimeDuration): # -------------------------------------------- # E.g. over_days=cf.M() # -------------------------------------------- classification, n = _time_interval(classification, n, coord=coord, interval=over_days, lower=lower, upper=upper, lower_limit=lower_limit, upper_limit=upper_limit, group_by=group_by, extra_condition=HMS) else: # -------------------------------------------- # E.g. over_days=[cf.month(cf.wi(4, 9))] # -------------------------------------------- classification, n = _selection(classification, n, coord=coord, selection=over_days, parameter='over_days', extra_condition=HMS) elif over == 'years': # ---------------------------------------------------- # Over years # ---------------------------------------------------- coord = self.dim(axis) if coord is None or not coord.Units.isreftime: raise ValueError( "Can't collapse: Reference-time dimension coordinates are required for an \"over years\" collapse") if not coord.hasbounds: raise ValueError( "Can't collapse: Reference-time dimension coordinate bounds are required for an \"over years\" collapse") cell_methods = getattr(self, 'cell_methods', None) if (not cell_methods or ('years' not in cell_methods.within and 'days' not in cell_methods.over)): raise ValueError( "Can't collapse: An \"over years\" collapse must come after a \"within years\" or \"over days\" collapse") # Parse the over_years parameter if isinstance(over_years, Query): over_years = (over_years,) elif isinstance(over_years, TimeDuration): if over_years.Units.iscalendartime: over_years.Units = Units('calendar_years') if not over_years.isint or over_years < 1: raise ValueError( "Can't collapse: over_years is not a whole number of calendar years: %r" % over_years) else: raise ValueError( "Can't collapse: over_years is not a whole number of calendar years: %r" % over_years) #--- End: if coordinate = 'min' classification = numpy_empty((axis_size,), int) classification.fill(-1) if isinstance(over_years, TimeDuration): lower, upper, lower_limit, upper_limit = _tyu(coord, group_by, True) # if coord.increasing: # bounds_max = upper_bounds[-1] # else: # bounds_min = lower_bounds[-1] bounds = coord.bounds lower_bounds = bounds.lower_bounds.dtarray upper_bounds = bounds.upper_bounds.dtarray mdHMS0 = None n = 0 for lower, upper in izip(lower_bounds, upper_bounds): mdHMS_l = (eq(lower.month , attr='month') & eq(lower.day , attr='day') & eq(lower.hour , attr='hour') & eq(lower.minute, attr='minute') & eq(lower.second, attr='second')).addattr('lower_bounds') mdHMS_u = (eq(upper.month , attr='month') & eq(upper.day , attr='day') & eq(upper.hour , attr='hour') & eq(upper.minute, attr='minute') & eq(upper.second, attr='second')).addattr('upper_bounds') mdHMS = mdHMS_l & mdHMS_u if not mdHMS0: mdHMS0 = mdHMS elif mdHMS.equals(mdHMS0): break if over_years is None: # -------------------------------------------- # E.g. over_years=None # -------------------------------------------- # Over all years index = mdHMS.evaluate(coord).array classification[index] = n n += 1 elif isinstance(over_years, TimeDuration): # -------------------------------------------- # E.g. over_years=cf.Y(2) # -------------------------------------------- # lower_bounds = bounds.lower_bounds # upper_bounds = bounds.upper_bounds # # lower = lower_bounds[0].dtarray[0] # upper = upper_bounds[0].dtarray[0] # bounds_min = lower_bounds[-1].dtarray[0] # bounds_max = upper_bounds[-1].dtarray[0] classification, n = _time_interval(classification, n, coord=coord, interval=over_years, lower=lower, upper=upper, lower_limit=lower_limit, upper_limit=upper_limit, group_by=group_by, extra_condition=mdHMS) else: # -------------------------------------------- # E.g. over_years=cf.year(cf.lt(2000)) # -------------------------------------------- classification, n = _selection(classification, n, coord=coord, selection=over_years, parameter='over_years', extra_condition=mdHMS) #--- End: for elif within == 'days': # ---------------------------------------------------- # Within days # ---------------------------------------------------- coord = self.dim(axis) if coord is None or not coord.Units.isreftime: raise ValueError( "Can't collapse: Reference-time dimension coordinates are required for an \"over years\" collapse") # # Get the bounds # if not coord.hasbounds: # coord = coord.copy() # # bounds = coord.get_bounds(create=True, insert=True) classification = numpy_empty((axis_size,), int) classification.fill(-1) # Parse the within_days parameter if isinstance(within_days, Query): within_days = (within_days,) elif isinstance(within_days, TimeDuration): if within_days.Units.istime and Data(1, 'day') % within_days: raise ValueError( "Can't collapse: within_days is not a factor of 1 day: %r" % within_days) #--- End: if if isinstance(within_days, TimeDuration): # ------------------------------------------------ # E.g. within_days=cf.h(6) # ------------------------------------------------ lower, upper, lower_limit, upper_limit = _tyu(coord, group_by, True) classification, n = _time_interval(classification, 0, coord=coord, interval=within_days, lower=lower, upper=upper, lower_limit=lower_limit, upper_limit=upper_limit, group_by=group_by) else: # ------------------------------------------------ # E.g. within_days=cf.hour(cf.lt(12)) # ------------------------------------------------ classification, n = _selection(classification, 0, coord=coord, selection=within_days, parameter='within_days') classification = _discern_runs(classification) elif within == 'years': # ---------------------------------------------------- # Within years # ---------------------------------------------------- coord = self.dim(axis) if coord is None or not coord.Units.isreftime: raise ValueError( "Can't collapse: Reference-time dimension coordinates are required for an \"over years\" collapse") # # Get the bounds # if not coord.hasbounds: # coord = coord.copy() # # bounds = coord.get_bounds(create=True, insert=True) classification = numpy_empty((axis_size,), int) classification.fill(-1) # Parse within_years if isinstance(within_years, Query): # over_years = (within_years,) within_years = (within_years,) elif within_years is None: raise ValueError( "Can't collapse: Bad parameter value: within_years={0!r}".format(within_years)) if isinstance(within_years, TimeDuration): # ------------------------------------------------ # E.g. within_years=cf.M() # ------------------------------------------------ lower, upper, lower_limit, upper_limit = _tyu(coord, group_by, True) classification, n = _time_interval(classification, 0, coord=coord, interval=within_years, lower=lower, upper=upper, lower_limit=lower_limit, upper_limit=upper_limit, group_by=group_by) else: # ------------------------------------------------ # E.g. within_years=cf.season() # ------------------------------------------------ classification, n = _selection(classification, 0, coord=coord, selection=within_years, parameter='within_years') classification = _discern_runs(classification) elif over is not None: raise ValueError( "Can't collapse: Bad 'over' syntax: {0!r}".format(over)) elif within is not None: raise ValueError( "Can't collapse: Bad 'within' syntax: {0!r}".format(within)) #--- End: if #--- End: if if classification is not None: if regroup: return classification #--------------------------------------------------------- # Collapse each group #--------------------------------------------------------- unique = numpy_unique(classification) unique = unique[numpy_where(unique >= 0)[0]] unique.sort() for u in unique: index = numpy_where(classification==u)[0].tolist() pc = self.subspace(**{axis: index}) w = _group_weights(weights, iaxis, index) fl.append(pc.collapse(method, axis, weights=w, mtol=mtol, a=a, ddof=ddof, coordinate=coordinate, squeeze=False, i=True, _create_zero_size_cell_bounds=True)) #--- End: for elif regroup: raise ValueError("Can't return classification 2453456 ") if not fl: raise ValueError( "Can't do grouped collapse: No groups were identified") if len(fl) == 1: f = fl[0] else: # Hack to fix missing bounds! for g in fl: try: g.dim(axis).get_bounds(create=True, insert=True, copy=False) except: pass #--------------------------------------------------------- # Sort the list of collapsed fields #--------------------------------------------------------- if coord is not None and coord.isdimension: fl.sort(key=lambda g: g.dim(axis).datum(0), reverse=coord.decreasing) #--------------------------------------------------------- # Concatenate the partial collapses # -------------------------------------------------------- try: f = self.concatenate(fl, axis=iaxis, _preserve=False) except ValueError as error: raise ValueError("Can't collapse: %s" % error) #--- End: if # -------------------------------------------------------- # Update the cell methods # -------------------------------------------------------- if within or over: cell_methods = getattr(f, 'cell_methods', None) if cell_methods is None: # The input field has no cell methods so create one name = f.axis_name(axis) if within: c = CellMethods("{0}: {1} within {2}".format(name, method, within)) else: c = CellMethods("{0}: {1} over {2}".format(name, method, over)) c.axes = (axis,) f.cell_methods = c else: lastcm = cell_methods[-1] if (_collapse_cell_methods.get(lastcm.method[0], None) == _collapse_cell_methods.get(method, None) and lastcm.axes == ((axis,),) and lastcm.within == (None,) and lastcm.over == (None,) ): if within: lastcm.within = within else: lastcm.over = over #--- End: if if squeeze and f.axis_size(axis) == 1: # Remove a totally collapsed axis from the field's # data array f.squeeze(axis, i=True) # ------------------------------------------------------------ # Return the collapsed field # ------------------------------------------------------------ self.__dict__ = f.__dict__ return self #--- End: def def _conform_ancillary_variables(self, axes, keep_size_1=False): ''' Remove ancillary variable fields which span the given axes. .. versionadded:: 1.0 .. seealso:: `_conform_ref_fields` :Parameters: axes: sequence of str Sequence of domain axis identifiers. keep_size_1: bool, optional :Returns: out: `None` :Examples: >>> f._conform_ancillary_variables(['dim2', 'dim1']) >>> f._conform_ancillary_variables(['dim2']) >>> f._conform_ancillary_variables([]) ''' ancillary_variables = getattr(self, 'ancillary_variables', None) if not ancillary_variables: return self new_av = [] if keep_size_1: size = gt(1) else: size = None self_domain = self.domain for av in ancillary_variables: axis_map = av.domain.map_axes(self_domain) keep = True for av_axis in av.axes(size=size): if av_axis not in axis_map or axis_map[av_axis] in axes: # Don't keep this ancillary variable field because # either it has an axis which doesn't match any # axis in the parent field or it has an axis which # matches one of the given axes. keep = False break #--- End: for if keep: new_av.append(av) #--- End: for if new_av: self.ancillary_variables = FieldList(new_av) else: del self.ancillary_variables #--- End: def def _conform_ref_fields(self, axes, keep_size_1=False): ''' Remove fields in coordinate reference objects which span the given axes. .. seealso:: `_conform_ancillary_variables` :Parameters: axes: sequence of str Sequence of domain axis identifiers. keep_size_1: `bool`, optional :Returns: out: `None` :Examples: >>> f._conform_ref_fields(['dim2', 'dim1']) >>> f._conform_ref_fields(['dim2']) >>> f._conform_ref_fields([]) ''' if keep_size_1: size = gt(1) else: size = None self_domain = self.domain for ref in self.refs().itervalues(): for term, value in ref.iteritems(): if not isinstance(value, Field): # Keep the term because it's not a field continue axis_map = value.domain.map_axes(self_domain) for axis in value.axes(size=size): if axis not in axis_map or axis_map[axis] in axes: # Don't keep this coordinate reference field # because either it has an axis which doesn't # match any axis in the parent field or it has # an axis which matches one of the given axes. ref[term] = None break #--- End: for #--- End: for #--- End: def def data_axes(self): '''Return the domain axis identifiers for the data array dimensions. .. seealso:: `axes`, `axis`, `item_axes` :Examples 1: >>> d = f.data_axes() :Returns: [+1] out: `list` or `None` The ordered axes of the data array. If there is no data array then `None` is returned. :Examples 2: >>> f.ndim 3 >>> f.data_axes() ['dim2', 'dim0', 'dim1'] >>> del f.Data >>> print f.data_axes() None >>> f.ndim 0 >>> f.data_axes() [] ''' if not self._hasData: return None return self.domain.data_axes() #--- End: def def dump(self, complete=False, display=True, _level=0, _title='Field', _q='='): '''{+Fef,}Print or return a string containing a description of the field. By default, the description is given without abbreviation with the exception of data arrays (which are abbreviated to their first and last values) and fields contained in coordinate references and ancillary variables (which are given as one-line summaries). :Examples 1: >>> f.dump() :Parameters: complete: `bool`, optional Output a complete dump. Fields contained in coordinate references and ancillary variables are themselves described with their dumps. display: `bool`, optional If False then{+,fef,} return the description as a string. By default the description is printed. *Example:* [+1] ``f.dump()`` is equivalent to ``print [+1] f.dump(display=False)``. [+N] ``f.dump()`` is equivalent to ``for g in f: print [+N] g.dump(display=False)``. :Returns: [+1] out: `None` or `str` [+1] If *display* is False then the description is printed and [+1] `None` is returned. Otherwise the description is restured as a [+1] string. [+N] out: `None` or `list` [+N] If *display* is False then{+,fef,} the description is printed [+N] and `None` is returned. Otherwise a list of strings containing [+N] the description for each field is returned. ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) if display: for f in self: f.dump(**kwargs2) return else: return [f.dump(**kwargs2) for f in self] #--- End: if indent = ' ' indent0 = indent * _level indent1 = indent0 + indent domain = self.domain title = '%s%s: %s' % (indent0, _title, self.name('')) line = '%s%s' % (indent0, ''.ljust(len(title)-_level*4, _q)) # Title string = [line, title, line] # Axes if domain.axes(): string.extend((domain.dump_axes(display=False, _level=_level), '')) # Data if self._hasData: axis_name = domain.axis_name axis_size = domain.axis_size x = ['%s(%d)' % (axis_name(axis), axis_size(axis)) for axis in domain.data_axes()] string.append('%sData(%s) = %s' % (indent0, ', '.join(x), str(self.Data))) # Cell methods cell_methods = getattr(self, 'cell_methods', None) if cell_methods is not None: string.append('%scell_methods = %s' % (indent0, cell_methods)) # Simple properties if self._simple_properties(): string.extend( ('', self._dump_simple_properties(_level=_level, omit=('Conventions',)))) # Flags flags = getattr(self, 'Flags', None) if flags is not None: string.extend(('', flags.dump(display=False, _level=_level))) # Domain string.append(domain.dump_components(complete=complete, display=False, _level=_level)) # Ancillary variables ancillary_variables = getattr(self, 'ancillary_variables', None) if ancillary_variables is not None: string.extend(('', '%sAncillary variables:' % indent0)) if not complete: x = ['%s%r' % (indent1, f) for f in ancillary_variables] string.extend(x) else: for f in ancillary_variables: string.append(f.dump(display=False, complete=False, _level=_level+1, _title='Ancillary field', _q='-')) #--- End: if string.append('') string = '\n'.join(string) if display: print string else: return string #--- End: def def equals(self, other, rtol=None, atol=None, ignore_fill_value=False, traceback=False, ignore=('Conventions',), _set=False): # Note: map(None, f, g) only works at python 2.x '''True if two {+variable}s are equal, False otherwise. [+N]Two {+variable}s are equal if they have the same number of elements [+N]and the field elements are equal pairwise, i.e. ``f.equals(g)`` is [+N]equivalent to ``all(x.equals(y) for x, y in map(None, f, g))``. Two fields are equal if ... [+1]Note that a {+variable} may be equal to a single element field list, [+1]for example ``f.equals(f[0:1])`` and ``f[0:1].equals(f)`` are always [+1]True. [+N]Note that a single element {+variable} may be equal to field, for [+N]example ``f[0:1].equals(f[0])`` and ``f[0].equals(f[0:1])`` are always [+N]True. [+1].. seealso:: `cf.FieldList.equals`, `set_equals` [+N].. seealso:: `cf.Field.equals`, `set_equals` :Examples 1: >>> b = f.equals(g) :Parameters: other: `object` The object to compare for equality. {+atol} {+rtol} ignore_fill_value: `bool`, optional If True then data arrays with different fill values are considered equal. By default they are considered unequal. traceback: `bool`, optional If True then print a traceback highlighting where the two {+variable}s differ. ignore: `tuple`, optional The names of CF properties to omit from the comparison. By default, the CF Conventions property is omitted. :Returns: out: `bool` Whether or not the two {+variable}s are equal. :Examples 2: >>> f.Conventions 'CF-1.0' >>> g = f.copy() >>> g.Conventions = 'CF-1.5' >>> f.equals(g) True In the following example, two fields differ only by the long name of their time coordinates. The traceback shows that they differ in their domains, that they differ in their time coordinates and that the long name could not be matched. >>> g = f.copy() >>> g.coord('time').long_name += ' different' >>> f.equals(g, traceback=True) Domain: Different coordinate: Field: Different domain properties: , False ''' kwargs2 = self._parameters(locals()) return super(Field, self).equals(**kwargs2) #---End: def def equivalent(self, other, rtol=None, atol=None, traceback=False): ''' True if two {+variable}s are equivalent, False otherwise two fields are equivalent if: * They have the same identity, as defined by their `~cf.Field.identity` methods. * The same rank, as given by their `~cf.Field.rank` attributes. * Their data arrays are the same after accounting for different but equivalent: * Units * Number of size one dimensions (if *squeeze* is True), * Dimension directions (if *use_directions* is True) * Dimension orders (if *transpose* is set to a dictionary). * Both fields' domains must have the same rankdimensionality and where a dimension in one field has an identity inferred a 1-d coordinate, the other field has a matching dimension whose identity inferred is inferred from a 1-d coordinate with an equivalent data array. * The rank, as given by their `~cf.Field.rank [+1].. seealso:: `~cf.Field.equals`, `set_equals` [+N].. seealso:: `~cf.FieldList.equals`, `set_equals` :Examples 1: >>> b = f.equivalent(g) :Parameters: other: `object` The object to compare for equivalence. {+atol} {+rtol} traceback: `bool`, optional If True then print a traceback highlighting where the two {+variable}s differ. :Returns: out: `bool` Whether or not the two {+variable}s are equivalent. :Examples 2: >>> ''' if not self.equivalent_domain(other, rtol=rtol, atol=atol, traceback=traceback): if traceback: print("%s: Nonequivalent domains: %r, %r" % (self.__class__.__name__, self.domain, other.domain)) return False if not self.equivalent_data(other, rtol=rtol, atol=atol, traceback=False): if traceback: print("%s: Nonequivalent data arrays: %r, %r" % (self.__class__.__name__, getattr(self, 'data', None), getattr(other, 'data', None))) return False return True #--- End_def def equivalent_domain(self, other, rtol=None, atol=None, traceback=False): ''' Return True if two fields have equivalent data domains. :Parameters: other: `cf.Field` atol: `float`, optional The absolute tolerance for all numerical comparisons, By default the value returned by the `cf.ATOL` function is used. rtol: `float`, optional The relative tolerance for all numerical comparisons, By default the value returned by the `cf.RTOL` function is used. traceback: `bool`, optional If True then print a traceback highlighting where the two domains differ. :Returns: out: `bool` Whether or not the two fields' data arrays are equivalent. :Examples: >>> f.equivalent_domain(g) ''' return self.domain.equivalent(other.domain, rtol=rtol, atol=atol, traceback=traceback) #--- End_def def equivalent_data(self, other, rtol=None, atol=None, traceback=False): ''' Return True if two fields have equivalent data arrays. Equivalence is defined as both fields having the same data arrays after accounting for different but equivalent units, size one dimensions, different dimension directions and different dimension orders. :Parameters: other: `cf.Field` atol: `float`, optional The absolute tolerance for all numerical comparisons, By default the value returned by the `cf.ATOL` function is used. rtol: `float`, optional The relative tolerance for all numerical comparisons, By default the value returned by the `cf.RTOL` function is used. traceback: `bool`, optional If True then print a traceback highlighting where the two data arrays differ. :Returns: out: `bool` Whether or not the two fields' data arrays are equivalent. :Examples: >>> f.equivalent_data(g) ''' if self._hasData != other._hasData: if traceback: print("%s: Only one field has data: %s, %s" % (self.__class__.__name__, self._hasData, other._hasData)) return False if not self._hasData: # Neither field has a data array return True if self.size != other.size: if traceback: print("%s: Different data array sizes (%d, %d)" % (self.__class__.__name__, self.size, other.size)) return False s = self.domain.analyse() t = other.domain.analyse() data0 = self.data data1 = other.data if 1 in data0._shape: data0 = data0.squeeze() copy = True if 1 in data1._shape: data1 = data1.squeeze() copy = False data_axes0 = self.domain.data_axes() data_axes1 = other.domain.data_axes() transpose_axes = [] for axis0 in data_axes0: axis1 = t['id_to_axis'].get(s['axis_to_id'][axis0], None) if axis1 is not None: transpose_axes.append(data_axes1.index(axis1)) else: if traceback: print("%s: woooooooooooooooo" % self.__class__.__name__) return False #--- End: for if transpose_axes != range(other.ndim): if copy: data1 = data1.copy() copy = False data1.transpose(transpose_axes, i=True) #--- End: if if self.size > 1: self_directions = self.domain.directions() other_directions = other.domain.directions() flip_axes = [i for i, (axis1, axis0) in enumerate(izip(data_axes1, data_axes0)) if other_directions[axis1] != self_directions[axis0]] if flip_axes: if copy: data1 = data1.copy() copy = False data1.flip(flip_axes, i=True) #--- End: if return data0.equals(data1, rtol=rtol, atol=atol, ignore_fill_value=True) #--- End: def def expand_dims(self, position=0, axes=None, i=False, **kwargs): '''{+Fef,}Insert a size 1 axis into the data array. By default default a new size 1 axis is inserted which doesn't yet exist, but a unique existing size 1 axis which is not already spanned by the data array may be selected. .. seealso:: `axes`, `flip`, `squeeze`, `transpose`, `unsqueeze` :Examples 1: Insert a new size axis in position 0: >>> g = f.expand_dims() Insert the existing, size 1 time axis in position 2: >>> g = f.expand_dims(2, axes='T') :Parameters: position: `int`, optional Specify the position that the new axis will have in the data array. By default the new axis has position 0, the slowest varying position. {+axes, kwargs} {+i} :Returns: out: `cf.{+Variable}` {+Fef,}, the expanded field. :Examples 2: ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('expand_dims', kwargs2) domain = self.domain if axes is None and not kwargs: axis = domain.new_axis_identifier() else: axis = domain.axis(axes, **kwargs) if axis is None: raise ValueError("Can't identify a unique axis to insert") elif domain.axis_size(axis) != 1: raise ValueError("Can't insert an axis of size %d: %r" % (domain.axis_size(axis), axis)) elif axis in domain.data_axes(): raise ValueError( "Can't insert a duplicate axis: %r" % axis) #--- End: if # Expand the dims in the field's data array f = super(Field, self).expand_dims(position, i=i) domain = f.domain domain._axes['data'].insert(position, axis) domain._axes_sizes[axis] = 1 return f #--- End: def def indices(self, *args, **kwargs): '''Create data array indices based on domain metadata. If metadata values are specified for an axis then a full slice (``slice(None)``) is assumed for that axis. Values for size 1 axes which are not spanned by the field's data array may be specified, but only indices for axes which span the field's data array will be returned. The coordinate value conditions may be given in any order. .. seealso:: `where`, `subspace` :Parameters: args: optional =========== ================================================= *arg* Description =========== ================================================= ``'exact'`` -Keyword parameter names are not treated as abbreviations of item identities. By default, keyword parameter names are allowed to be abbreviations of item identities. =========== ================================================= kwargs: optional Keyword parameters identify items of the domain () and set conditions on their data arrays. Indices are created which, for each axis, select where the conditions are met. A keyword name is a string which selects a unique item of the domain. The string may be any string value allowed by *items* parameter of the field's `item` method, which is used to select a unique domain item. See `cf.Field.item` for details. *Example:* The keyword ``lat`` will select the item returned by ``f.item('lat', role='dam')``. See the *exact* parameter. In general, a keyword value specifies a test on the selected item's data array which identifies axis elements. The returned indices for this axis are the positions of these elements. *Example:* To create indices for the northern hemisphere, assuming that there is a coordinate with identity "latitude": ``f.indices(latitude=cf.ge(0))`` *Example:* To create indices for the northern hemisphere, identifying the latitude coordinate by its long name: ``f.indices(**{'long_name:latitude': cf.ge(0)})``. In this case it is necessary to use the ``**`` syntax because the ``:`` characeter is not allowed in keyword parameter names. If the value is a `slice` object then it is used as the axis indices, without testing the item's data array. *Example:* To create indices for every even numbered element along the "Z" axis: ``f.indices(Z=slice(0, None, 2))``. **Multidimensional items** Indices based on items which span two or more axes are possible if the result is a single element index for each of the axes spanned. In addition, two or more items must be provided, each one spanning the same axes (in any order). *Example:* To create indices for the unique location 45 degrees north, 30 degrees east when latitude and longitude are stored in 2-dimensional auxiliary coordiantes: ``f.indices(latitude=45, longitude=30)``. Note that this example would also work if latitude and longitude were stored in 1-dimensional dimensional or auxiliary coordinates, but in this case the location would not have to be unique. exact: `str`, optional :Returns: out: `tuple` :Examples: These examples use the following field, which includes a dimension coordinate object with no identity (``ncvar:model_level_number``) and which has a data array which doesn't span all of the domain axes: >>> print f eastward_wind field summary --------------------------- Data : eastward_wind(time(3), air_pressure(5), grid_latitude(110), grid_longitude(106)) m s-1 Cell methods : time: mean Axes : time(3) = [1979-05-01 12:00:00, ..., 1979-05-03 12:00:00] gregorian : air_pressure(5) = [850.0, ..., 50.0] hPa : grid_longitude(106) = [-20.54, ..., 25.66] degrees : grid_latitude(110) = [23.32, ..., -24.64] degrees Aux coords : latitude(grid_latitude(110), grid_longitude(106)) = [[67.12, ..., 22.89]] degrees_N : longitude(grid_latitude(110), grid_longitude(106)) = [[-45.98, ..., 35.29]] degrees_E Coord refs : >>> f.indices(lat=23.32, lon=-20.54) (slice(0, 3, 1), slice(0, 5, 1), slice(0, 1, 1), slice(0, 1, 1)) >>> f.indices(grid_lat=slice(50, 2, -2), grid_lon=[0, 1, 3, 90]) (slice(0, 3, 1), slice(0, 5, 1), slice(50, 2, -2), [0, 1, 3, 90]) >>> f.indices('exact', grid_latitude=slice(50, 2, -2), grid_longitude=[0, 1, 3, 90]) (slice(0, 3, 1), slice(0, 5, 1), slice(50, 2, -2), [0, 1, 3, 90]) >>> f.indices(grid_lon=cf.wi(0, 10, 'degrees'), air_pressure=850) (slice(0, 3, 1), slice(0, 1, 1), slice(0, 110, 1), slice(47, 70, 1)) >>> f.indices(grid_lon=cf.wi(0, 10), air_pressure=cf.eq(85000, 'Pa') (slice(0, 3, 1), slice(0, 1, 1), slice(0, 110, 1), slice(47, 70, 1)) >>> f.indices(grid_long=cf.gt(0, attr='lower_bounds')) (slice(0, 3, 1), slice(0, 5, 1), slice(0, 110, 1), slice(48, 106, 1)) ''' exact = 'exact' in args domain = self.domain data_axes = domain.data_axes() # Initialize indices indices = [slice(None)] * self.ndim wee = {} unique_axes = set() n_axes = 0 for identity, value in kwargs.iteritems(): items = domain.items(identity, role=('d', 'a'), exact=exact) if len(items) != 1: raise ValueError( "Can't find indices: Ambiguous axis or axes: %r" % identity) key, coord = items.popitem() axes = domain.item_axes(key) sorted_axes = tuple(sorted(axes)) if sorted_axes not in wee: n_axes += len(sorted_axes) wee.setdefault(sorted_axes, []).append((tuple(axes), coord, value)) unique_axes.update(sorted_axes) #--- End: for if len(unique_axes) < n_axes: raise ValueError("Ambiguous axis specification") for key, axes_coord_value in wee.iteritems(): axes, coords, point = zip(*axes_coord_value) n_coords = len(coords) n_axes = len(key) if n_coords != n_axes: raise IndexError( "Must specify %d %d-d coordinate objects to find %d-d indices (got %d)" % (n_axes, n_axes, n_axes, n_coords)) if n_coords == 1: #----------------------------------------------------- # 1-d coordinate #----------------------------------------------------- coord = coords[0] value = point[0] axis = axes[0][0] if isinstance(value, (slice, list)): # CASE 1: Subspace criterion is already a valid index # (i.e. it is a slice object or a list (of ints, but # this isn't checked for)). index = value elif (isinstance(value, Query) and value.operator in ('wi', 'wo') and coord.isdimension and self.iscyclic(key)): # CASE 2: Axis is cyclic and subspace criterion is # a 'within' or 'without' cf.Query instance if coord.increasing: anchor0 = value.value[0] anchor1 = value.value[1] else: anchor0 = value.value[1] anchor1 = value.value[0] a = self.anchor(axis, anchor0, dry_run=True)['roll'] b = self.flip(axis).anchor(axis, anchor1, dry_run=True)['roll'] size = coord.size if abs(anchor1 - anchor0) >= coord.period(): if value.operator == 'wo': start = 0 stop = 0 else: start = -a stop = -a elif a + b == size: b = self.anchor(axis, anchor1, dry_run=True)['roll'] if b == a: if value.operator == 'wo': start= -a stop = -a else: start = 0 stop = 0 else: if value.operator == 'wo': start= 0 stop = 0 else: start = -a stop = -a else: if value.operator == 'wo': start = b - size stop = -a + size else: start = -a stop = b - size index = slice(start, stop, 1) else: # CASE 3: All other cases item_match = (value == coord) if not item_match.any(): raise IndexError( "No %r axis indices found from: %r" % (identity, value)) index = item_match.array #--- End: if # Put the index in to the correct place in the list of # indices if axis in data_axes: indices[data_axes.index(axis)] = index else: #----------------------------------------------------- # N-d coordinate #----------------------------------------------------- # Make sure that each auxiliary coordinate has the # same axis order coords2 = [coords[0]] axes0 = axes[0] for a, coord in zip(axes[1:], coords[1:]): if a != axes0: coord = coord.transpose([axes0.index(axis) for axis in a]) coords2.append(coord) #--- End: for coords = coords2 item_matches = [v == c for v, c in zip(point, coords)] item_match = item_matches.pop() for m in item_matches: item_match &= m ind = numpy_where(item_match) bounds = [coord.bounds.array[ind] for coord in coords if coord.hasbounds] contain = False if bounds: point2 = [] for v, coord in zip(point, coords): if isinstance(v, Query): if v.operator == 'contain': contain = True v = v.value elif v.operator == 'eq': v = v.value else: contain = False break #--- End: if v = Data.asdata(v) if v.Units: v.Units = coord.Units point2.append(v.datum()) #--- End: for #--- End: if if contain: # The coordinates have bounds and a 'contain' # cf.Query object has been given. Check each # possibly matching cell for actully including the # point. if n_coords > 2: raise IndexError( "333Can't geasasdast index for cell from %d-d coordinate objects" % n_axes) if 0 < len(bounds) < n_coords: raise ValueError("bounds alskdaskds") n_cells = 0 for cell, vertices in enumerate(zip(*zip(*bounds))): n_cells += Path(zip(*vertices)).contains_point(point2) if n_cells > 1: # The point is apparently in more than one # cell break else: n_cells = len(ind[0]) cell = 0 #--- End: if if not n_cells: raise IndexError( "No index found for the point %r" % (point,)) elif n_cells > 1: raise IndexError("Multiple indices found for %r" % (point,)) # Put the indices in to the correct place in the list # of indices for axis, index in zip(axes0, numpy_array(ind)[:, cell]): if axis in data_axes: indices[data_axes.index(axis)] = index #--- End: for #--- End: if #--- End: for # # Loop round slice criteria # for identity, value in kwargs.iteritems(): # coords = domain.items(identity, role=('d', 'a'), # exact=exact) # # if len(coords) != 1: # raise ValueError( # "Can't find indices: Ambiguous axis identity: %r" % # identity) # # key, coord = coords.popitem() # # if coord.ndim == 1: # axis = domain.item_axes(key)[0] # # if axis in seen_axes: # raise ValueError( # "Can't find indices: Duplicate %r axis" % axis) # else: # seen_axes.append(axis) # # if isinstance(value, (slice, list)): # # ---------------------------------------------------- # # Case 1: Subspace criterion is already a valid index # # (i.e. it is a slice object or a list (of ints, but # # this isn't checked for)). # # ---------------------------------------------------- # index = value # # elif (isinstance(value, Query) and # value.operator in ('wi', 'wo') and # coord.isdimension and # self.iscyclic(key)): # # ---------------------------------------------------- # # Case 2: Axis is cyclic and subspace criterion is a # # 'within' or 'without' cf.Query instance # # ---------------------------------------------------- # if coord.increasing: # anchor0 = value.value[0] # anchor1 = value.value[1] # else: # anchor0 = value.value[1] # anchor1 = value.value[0] # # a = self.anchor(axis, anchor0, dry_run=True)['roll'] # b = self.flip(axis).anchor(axis, anchor1, dry_run=True)['roll'] # # size = coord.size # if abs(anchor1 - anchor0) >= coord.period(): # if value.operator == 'wo': # start = 0 # stop = 0 # else: # start = -a # stop = -a # elif a + b == size: # b = self.anchor(axis, anchor1, dry_run=True)['roll'] # if b == a: # if value.operator == 'wo': # start= -a # stop = -a # else: # start = 0 # stop = 0 # else: # if value.operator == 'wo': # start= 0 # stop = 0 # else: # start = -a # stop = -a # else: # if value.operator == 'wo': # start = b - size # stop = -a + size # else: # start = -a # stop = b - size # # index = slice(start, stop, 1) # else: # # ---------------------------------------------------- # # Case 3: All other cases # # ---------------------------------------------------- # item_match = (value == coord) # # if not item_match.any(): # raise IndexError( # "No %r axis indices found from: %r" % # (identity, value)) # # index = item_match.array # #--- End: if # # # Put the index in to the correct place in the list of # # indices # if axis in data_axes: # indices[data_axes.index(axis)] = index # # else: # axes = domain.item_axes(key)[0] # item_match = (value == coord) # if not item_match.any(): # raise IndexError( # "No %r axis indices found from: %r" % # (identity, value)) # #--- End: for # Return a tuple of the indices return tuple(parse_indices(self, tuple(indices), False)) #--- End: def def insert_data(self, data, axes=None, copy=True, replace=True): '''Insert a new data array into the field in place. Note that the data array's missing data value, if it has one, is not transferred to the field. :Parameters: data: `cf.Data` The new data array. axes: sequence of `str`, optional A list of axis identifiers (``'dimN'``), stating the axes, in order, of the data array. The ``N`` part of each identifier should be replaced by an integer greater then or equal to zero such that either a) each axis identifier is the same as one in the field's domain, or b) if the domain has no axes, arbitrary integers greater then or equal to zero may be used, the only restriction being that the resulting identifiers are unique. If an axis of the data array already exists in the domain then the it must have the same size as the domain axis. If it does not exist in the domain then a new axis will be created. By default the axes will either be those defined for the data array by the domain or, if these do not exist, the domain axis identifiers whose sizes unambiguously match the data array. copy: `bool`, optional If False then the new data array is not deep copied prior to insertion. By default the new data array is deep copied. replace: `bool`, optional If False then do not replace an existing data array. By default an data array is replaced with *data*. :Returns: `None` :Examples: >>> f.domain._axes_sizes {'dim0': 1, 'dim1': 3} >>> f.insert_data(cf.Data([[0, 1, 2]])) >>> f.domain._axes_sizes {'dim0': 1, 'dim1': 3} >>> f.insert_data(cf.Data([[0, 1, 2]]), axes=['dim0', 'dim1']) >>> f.domain._axes_sizes {} >>> f.insert_data(cf.Data([[0, 1], [2, 3, 4]])) >>> f.domain._axes_sizes {'dim0': 2, 'dim1': 3} >>> f.insert_data(cf.Data(4)) >>> f.insert_data(cf.Data(4), axes=[]) >>> f.domein._axes_sizes {'dim0': 3, 'dim1': 2} >>> data = cf.Data([[0, 1], [2, 3, 4]]) >>> f.insert_data(data, axes=['dim1', 'dim0'], copy=False) >>> f.insert_data(cf.Data([0, 1, 2])) >>> f.insert_data(cf.Data([3, 4, 5]), replace=False) ValueError: Can't initialize data: Data already exists >>> f.insert_data(cf.Data([3, 4, 5])) ''' if self._hasData and not replace: raise ValueError( "Can't set data: Data already exists and replace=%s" % replace) domain = self.domain if data.isscalar: # -------------------------------------------------------- # The data array is scalar # -------------------------------------------------------- if axes: raise ValueError( "Can't set data: Wrong number of axes for scalar data array: {0}".format(axes)) axes = [] elif axes is not None: # -------------------------------------------------------- # The axes have been set # -------------------------------------------------------- axes = self.axes(axes, ordered=True) if not axes: # The domain has no axes: Ignore the provided axes and # make some up for the data array axes = [] for size in data.shape: axes.append(self.insert_axis(size)) axes = axes[:] else: len_axes = len(axes) if len_axes != len(set(axes)): raise ValueError( "Can't set data: Ambiguous axes: {0}".format(axes)) if len_axes != data.ndim: raise ValueError( "Can't set data: Wrong number of axes for data array: {0!r}".format(axes)) for axis, size in izip(axes, data.shape): axis_size = self.axis_size(axis) if size != axis_size: raise ValueError( "Can't set data: Incompatible domain size for axis %r (%d)" % (axis, size)) #--- End: for elif domain.data_axes() is None: # -------------------------------------------------------- # The data is not scalar and axes have not been set and # the domain does not have data axes defined => infer the # axes. # -------------------------------------------------------- if not self.axes(): # The domain has no axes, so make some up for the data # array axes = [] for size in data.shape: axes.append(self.insert_axis(size)) axes = axes[:] else: # The domain already has some axes data_shape = data.shape if len(data_shape) != len(set(data_shape)): raise ValueError( "Can't set data: Ambiguous shape: %s. Consider setting the axes parameter." % (data_shape,)) axes = [] domain_sizes = domain._axes_sizes.values() for n in data_shape: if domain_sizes.count(n) == 1: axes.append(domain.axis(size=n)) else: raise ValueError( "Can't set data: Ambiguous shape: %s. Consider setting the axes parameter." % (data_shape,)) #--- End: for else: # -------------------------------------------------------- # The data is not scalar and axes have not been set, but # the domain has data axes defined. # -------------------------------------------------------- axes = domain.data_axes() if len(axes) != data.ndim: raise ValueError( "Can't set data: Wrong number of axes for data array: %r" % axes) for axis, size in izip(axes, data.shape): try: domain.insert_axis(size, axis, replace=False) except ValueError: raise ValueError( "Can't set data: Incompatible domain size for axis %r (%d)" % (axis, size)) #--- End: for #--- End: if domain._axes['data'] = axes if copy: data = data.copy() self.Data = data #--- End: def def domain_mask(self, *args, **kwargs): '''{+Fef,}The mask of the data array. .. versionadded:: 1.1 .. seealso:: `indices`, `mask`, `subspace` :Examples 1: Creat a which is True within 30 degrees of the equator: >>> m = f.domain_mask(latitude=cf.wi(-30, 30)) :Parameters: args, kwargs: optional :Returns: out: cf.{+Variable} {+Fef,}The domain mask. :Examples 2: ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('domain_mask', kwargs2) m = self.copy(_omit_Data=True, _omit_properties=True, _omit_attributes=True) m.Data = Data.zeros(self.shape, dtype=bool) m.Data[m.indices(*args, **kwargs)] = True m.long_name = 'mask' return m #--- End: def def match(self, select=None, items=None, rank=None, ndim=None, exact=False, match_and=True, inverse=False): '''{+Fef,}Test whether or not the field satisfies the given conditions. Different types of conditions may be set with the parameters: =========== ========================================================= Parameter What gets tested =========== ========================================================= *match* Field properties and attributes *items* Field domain items *rank* The number of field domain axes *ndim* The number of field data array axes =========== ========================================================= By default, when multiple criteria are given the field matches if it satisfies the conditions given by each one. .. seealso:: `items`, `select` **Quick start examples** There is great flexibility in the types of test which can be specified, and as a result the documentation is very detailed in places. These preliminary, simple examples show that the usage need not always be complicated and may help with understanding the keyword descriptions. 1. Test if a field contains air temperature data, as given determined by its `identity` method: >>> f.match('air_temperature') 2. Test if a field contains air temperature data, as given determined by its `identity` method, or has a long name which contains the string "temp": >>> f.match(['air_temperature', {'long_name': cf.eq('.*temp.*', regex=true)}]) 3. Test if a field has at least one longitude grid cell point on the Greenwich meridian: >>> f.match(items={'longitude': 0}) 4. Test if a field has latitude grid cells which all have a resolution of less than 1 degree: >>> f.match(items={'latitude': cf.cellsize(cf.lt(1, 'degree'))}) 5. Test if a field has exactly 4 domain axes: >>> f.match(rank=4) 6. Examples 1 to 4 may be combined to test if a field has exactly 4 domain axes, contains air temperature data, has at least one longitude grid cell point on the Greenwich meridian and all latitude grid cells have a resolution of less than 1 degree: >>> f.match('air_temperature', ... items={'longitude': 0, ... 'latitude': cf.cellsize(cf.lt(1, 'degree'))}, ... rank=4) 7. Test if a field contains Gregorian calendar monthly mean data array values: >>> f.match({'cell_methods': cf.CellMethods('time: mean')}, ... items={'time': cf.cellsize(cf.wi(28, 31, 'days'))}) Further examples are given within and after the description of the arguments. :Parameters: match: optional Set conditions on the field's CF property and attribute values. *match* may be one, or a sequence of: * `None` or an empty dictionary. Always matches the field. This is the default. .. * A string which identifies string-valued metadata of the field and a value to compare it against. The value may take one of the following forms: ============== ====================================== *match* Interpretation ============== ====================================== Contains ``:`` Selects on the CF property specified before the first ``:`` Contains ``%`` Selects on the attribute specified before the first ``%`` Anything else Selects on identity as returned by the `identity` method ============== ====================================== By default the part of the string to be compared with the item is treated as a regular expression understood by the :py:obj:`re` module and the field matches if its appropriate value matches the regular expression using the :py:obj:`re.match` method (i.e. if zero or more characters at the beginning of field's value match the regular expression pattern). See the *exact* parameter for details. *Example:* To match a field with `identity` beginning with "lat": ``match='lat'``. *Example:* To match a field with long name beginning with "air": ``match='long_name:air'``. *Example:* To match a field with netCDF variable name of exactly "tas": ``match='ncvar%tas$'``. *Example:* To match a field with `identity` which ends with the letter "z": ``match='.*z$'``. *Example:* To match a field with long name which starts with the string ".*a": ``match='long_name%\.\*a'``. .. * A `cf.Query` object to be compared with field's identity, as returned by its `identity` method. *Example:* To match a field with `identity` of exactly "air_temperature" you could set ``match=cf.eq('air_temperature')`` (see `cf.eq`). *Example:* To match a field with `identity` ending with "temperature" you could set ``match=cf.eq('.*temperature$', exact=False)`` (see `cf.eq`). .. * A dictionary which identifies properties of the field with corresponding tests on their values. The field matches if **all** of the tests in the dictionary are passed. In general, each dictionary key is a CF property name with a corresponding value to be compared against the field's CF property value. If the dictionary value is a string then by default it is treated as a regular expression understood by the :py:obj:`re` module and the field matches if its appropriate value matches the regular expression using the :py:obj:`re.match` method (i.e. if zero or more characters at the beginning of field's value match the regular expression pattern). See the *exact* parameter for details. *Example:* To match a field with standard name of exactly "air_temperature" and long name beginning with the letter "a": ``match={'standard_name': cf.eq('air_temperature'), 'long_name': 'a'}`` (see `cf.eq`). Some key/value pairs have a special interpretation: ================== ==================================== Special key Value ================== ==================================== ``'units'`` The value must be a string and by default is evaluated for equivalence, rather than equality, with the field's `units` property, for example a value of ``'Pa'`` will match units of Pascals or hectopascals, etc. See the *exact* parameter. ``'calendar'`` The value must be a string and by default is evaluated for equivalence, rather than equality, with the field's `calendar` property, for example a value of ``'noleap'`` will match a calendar of noleap or 365_day. See the *exact* parameter. ``'cell_methods'`` The value must be a `cf.CellMethods` object containing *N* cell methods and by default is evaluated for equivalence with the last *N* cell methods contained within the field's `cell_methods` property. See the *exact* parameter. `None` The value is interpreted as for a string value of the *match* parameter. For example, ``match={None: 'air'}`` is equivalent to ``match='air'`` and ``match={None: 'ncvar%pressure'}`` is equivalent to ``match='ncvar%pressure'``. ================== ==================================== *Example:* To match a field with standard name starting with "air", units of temperature and a netCDF variable name beginning with "tas" you could set ``match={'standard_name': 'air', 'units': 'K', None: 'ncvar%tas'}``. *Example:* To match a field whose last two cell methods are equivalent to "time: minimum area: mean": ``match={'cell_methods': cf.Cellmethods('time: minimum area: mean')``. This would match a field which has, for example, cell methods of "height: mean time: minimum area: mean". If *match* is a sequence of any combination of the above then the field matches if it matches **at least one** element of the sequence: *Example:* >>> f.match('air_temperature') True >>> f.match('air_pressure') False >>> f.match({'units': 'hPa', 'long_name': 'foo'}) False >>> f.match(['air_temperature', ... 'air_pressure', ... {'units': 'hPa', 'long_name': 'foo'}]) True If the sequence is empty then the field always matches. items: `dict`, optional A dictionary which identifies domain items of the field (dimension coordinate, auxiliary coordinate, cell measure or coordinate reference objects) with corresponding tests on their elements. The field matches if **all** of the specified items exist and their tests are passed. Each dictionary key specifies an item to test as the one that would be returned by this call of the field's `item` method: ``f.item(key, exact=exact)`` (see `cf.Field.item`). The corresponding value is, in general, any object for which the item may be compared with for equality (``==``). The test is passed if the result evaluates to True, or if the result is an array of values then the test is passed if at least one element evaluates to true. If the value is `None` then the test is always passed, i.e. this case tests for item existence. *Example:* To match a field which has a latitude coordinate value of exactly 30: ``items={'latitude': 30}``. *Example:* To match a field whose longitude axis spans the Greenwich meridien: ``items={'longitude': cf.contain(0)}`` (see `cf.contain`). *Example:* To match a field which has a time coordinate value of 2004-06-01: ``items={'time': cf.dt('2004-06-01')}`` (see `cf.dt`). *Example:* To match a field which has a height axis: ``items={'Z': None}``. *Example:* To match a field which has a time axis and depth coordinates greater then 1000 metres: ``items={'T': None, 'depth': cf.gt(1000, 'm')}`` (see `cf.gt`). *Example:* To match a field with time coordinates after than 1989 and cell sizes of between 28 and 31 days: ``items={'time': cf.dtge(1990) & cf.cellsize(cf.wi(28, 31, 'days'))}`` (see `cf.dtge`, `cf.cellsize` and `cf.wi`). rank: optional Specify a condition on the number of axes in the field's domain. The field matches if its number of domain axes equals *rank*. A range of values may be selected if *rank* is a `cf.Query` object. Not to be confused with the *ndim* parameter (the number of data array axes may be fewer than the number of domain axes). *Example:* ``rank=2`` matches a field with exactly two domain axes and ``rank=cf.wi(3, 4)`` matches a field with three or four domain axes (see `cf.wi`). ndim: optional Specify a condition on the number of axes in the field's data array. The field matches if its number of data array axes equals *ndim*. A range of values may be selected if *ndim* is a `cf.Query` object. Not to be confused with the *rank* parameter (the number of domain axes may be greater than the number of data array axes). *Example:* ``ndim=2`` matches a field with exactly two data array axes and ``ndim=cf.le(2)`` matches a field with fewer than three data array axes (see `cf.le`). exact: `bool`, optional The *exact* parameter applies to the interpretation of string values of the *match* parameter and of keys of the *items* parameter. By default *exact* is False, which means that: * A string value is treated as a regular expression understood by the :py:obj:`re` module. * Units and calendar values in a *match* dictionary are evaluated for equivalence rather then equality (e.g. "metre" is equivalent to "m" and to "km"). * A cell methods value containing *N* cell methods in a *match* dictionary is evaluated for equivalence with the last *N* cell methods contained within the field's `cell_methods` property. .. *Example:* To match a field with a standard name which begins with "air" and any units of pressure: ``f.match({'standard_name': 'air', 'units': 'hPa'})``. *Example:* ``f.match({'cell_methods': cf.CellMethods('time: mean (interval 1 hour)')})`` would match a field with cell methods of "area: mean time: mean (interval 60 minutes)". If *exact* is True then: * A string value is not treated as a regular expression. * Units and calendar values in a *match* dictionary are evaluated for exact equality rather than equivalence (e.g. "metre" is equal to "m", but not to "km"). * A cell methods value in a *match* dictionary is evaluated for exact equality to the field's cell methods. .. *Example:* To match a field with a standard name of exactly "air_pressure" and units of exactly hectopascals: ``f.match({'standard_name': 'air_pressure', 'units': 'hPa'}, exact=True)``. *Example:* To match a field with a cell methods of exactly "time: mean (interval 1 hour)": ``f.match({'cell_methods': cf.CellMethods('time: mean (interval 1 hour)')``. Note that `cf.Query` objects provide a mechanism for overriding the *exact* parameter for individual values. *Example:* ``f.match({'standard_name': cf.eq('air', exact=False), 'units': 'hPa'}, exact=True)`` will match a field with a standard name which begins "air" but has units of exactly hectopascals (see `cf.eq`). *Example:* ``f.match({'standard_name': cf.eq('air_pressure'), 'units': 'hPa'})`` will match a field with a standard name of exactly "air_pressure" but with units which equivalent to hectopascals (see `cf.eq`). match_and: `bool`, optional By default *match_and* is True and the field matches if it satisfies the conditions specified by each test parameter (*match*, *items*, *rank* and *ndim*). If *match_and* is False then the field will match if it satisfies at least one test parameter's condition. *Example:* To match a field with a standard name of "air_temperature" **and** 3 data array axes: ``f.match('air_temperature', ndim=3)``. To match a field with a standard name of "air_temperature" **or** 3 data array axes: ``f.match('air_temperature", ndim=3, match_and=False)``. inverse: `bool`, optional If True then return the field matches if it does **not** satisfy the given conditions. *Example:* >>> f.match('air', ndim=4, inverse=True) == not f.match('air', ndim=4) True :Returns: [+1] out: `bool` [+N] out: `list` of `bool` {+Fef,}True if the field satisfies the given criteria, False otherwise. :Examples: Field identity starts with "air": >>> f.match('air') Field identity ends contains the string "temperature": >>> f.match('.*temperature') Field identity is exactly "air_temperature": >>> f.match('^air_temperature$') >>> f.match('air_temperature', exact=True) Field has units of temperature: >>> f.match({'units': 'K'}): Field has units of exactly Kelvin: >>> f.match({'units': 'K'}, exact=True) Field identity which starts with "air" and has units of temperature: >>> f.match({None: 'air', 'units': 'K'}) Field identity starts with "air" and/or has units of temperature: >>> f.match(['air', {'units': 'K'}]) Field standard name starts with "air" and/or has units of exactly Kelvin: >>> f.match([{'standard_name': cf.eq('air', exact=False), {'units': 'K'}], ... exact=True) Field has height coordinate values greater than 63km: >>> f.match(items={'height': cf.gt(63, 'km')}) Field has a height coordinate object with some values greater than 63km and a north polar point on its horizontal grid: >>> f.match(items={'height': cf.gt(63, 'km'), ... 'latitude': cf.eq(90, 'degrees')}) Field has some longitude cell sizes of 3.75: >>> f.match(items={'longitude': cf.cellsize(3.75)}) Field latitude cell sizes within a tropical region are all no greater than 1 degree: >>> f.match(items={'latitude': (cf.wi(-30, 30, 'degrees') & ... cf.cellsize(cf.le(1, 'degrees')))}) Field contains monthly mean air pressure data and all vertical levels within the bottom 100 metres of the atmosphere have a thickness of 20 metres or less: >>> f.match({None: '^air_pressure$', 'cell_methods': cf.CellMethods('time: mean')}, ... items={'height': cf.le(100, 'm') & cf.cellsize(cf.le(20, 'm')), ... 'time': cf.cellsize(cf.wi(28, 31, 'days'))}) ''' conditions_have_been_set = False something_has_matched = False if rank is not None: conditions_have_been_set = True found_match = len(self.axes()) == rank if match_and and not found_match: return bool(inverse) something_has_matched = True #--- End: if if select: conditions_have_been_set = True # -------------------------------------------------------- # Try to match other properties and attributes # -------------------------------------------------------- found_match = super(Field, self).match( match=select, ndim=ndim, exact=exact, match_and=match_and, inverse=False, _Flags=True, _CellMethods=True) if match_and and not found_match: return bool(inverse) something_has_matched = found_match #--- End: if # ------------------------------------------------------------ # Try to match items # ------------------------------------------------------------ if items: conditions_have_been_set = True found_match = False for identity, condition in items.iteritems(): c = self.item(identity, exact=exact) if condition is None: field_matches = True elif c is None: field_matches = False else: field_matches = condition == c try: field_matches = field_matches.any() except AttributeError: pass #--- End: if if match_and: if field_matches: found_match = True else: found_match = False break elif field_matches: found_match = True break #--- End: for if match_and and not found_match: return bool(inverse) something_has_matched = found_match #--- End: if if conditions_have_been_set: if something_has_matched: return not bool(inverse) else: return bool(inverse) else: return not bool(inverse) #--- End: def #In [66]: w #Out[66]: array([ 0.125, 0.25 , 0.375, 0.25 ]) #In [67]: convolve1d(a, w, mode='mirror') #Out[67]: array([ 1.75, 2.25, 3.25, 4.25, 5.25, 6.25, 7. , 7.25]) # #In [68]: (w[::-1] * [5, 6, 7, 8]).sum() #Out[68]: 6.25 # #In [69]: (w[::-1] * [6, 7, 8, 7]).sum() #Out[69]: 7.0 # #In [70]: (w[::-1] * [7, 8, 7, 6]).sum() #Out[70]: 7.25 #In [60]: convolve1d(a, t, mode='mirror') #Out[60]: array([ 1.5, 2. , 3. , 4. , 5. , 6. , 7. , 7.5]) # #In [61]: (t[::-1] * [5, 6, 7]).sum() #Out[61]: 6.0 # #In [62]: (t[::-1] * [6, 7, 8]).sum() #Out[62]: 7.0 # #In [63]: (t[::-1] * [7, 8, 7]).sum() #Out[63]: 7.5 # #In [64]: t #Out[64]: array([ 0.25, 0.5 , 0.25]) # #In [65]: a #Out[65]: array([ 1., 2., 3., 4., 5., 6., 7., 8.]) #In [75]: convolve1d(a, w, mode='reflect') #Out[75]: array([ 1.5 , 2.25 , 3.25 , 4.25 , 5.25 , 6.25 , 7.125, 7.625]) # #In [76]: (w[::-1] * [5, 6, 7, 8]).sum() #Out[76]: 6.25 # #In [77]: (w[::-1] * [6, 7, 8, 8]).sum() #Out[77]: 7.125 # #In [78]: (w[::-1] * [7, 8, 8, 7]).sum() #Out[78]: 7.625 #In [81]: w #Out[81]: array([ 0.125, 0.25 , 0.375, 0.25 ]) # #In [82]: a #Out[82]: array([ 1., 2., 3., 4., 5., 6., 7., 8.]) #In [94]: u #Out[94]: array([ 0.11111111, 0.22222222, 0.33333333, 0.22222222, 0.11111111]) # #In [95]: convolve#convolve1d(a, w, mode='reflect')eflect') # #In [96]: convolve1d(a, u, mode='mirror') #Out[96]: #array([ 1.88888889, 2.22222222, 3. , 4. , 5. , # 6. , 6.77777778, 7.11111111]) # #In [97]: (u[::-1] * [4, 5, 6, 7, 8]).sum() #Out[97]: 6.0 # #In [98]: (u[::-1] * [5, 6, 7, 8, 7]).sum() #Out[98]: 6.7777777777777768 # #In [99]: (u[::-1] * [6, 7, 8, 7, 6]).sum() #Out[99]: 7.1111111111111107 # #In [100]: # # def smooth(self, n, weights='boxcar', axis=None, mode='reflect', constant=0.0, mtol=0.0, # beta=None, std=None, power=None, width=None, # attenuation=None, return_weights=False): ## http://docs.scipy.org/doc/scipy-0.14.0/reference/signal.html ##scipy.ndimage.filters.convolve1d ##ocs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.filters.convolve.html ##http://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.filters.convolve1d.html # # '''Smooth the field along one of its axes. # # By default the field is smoothed with an unweighted moving average. # # The smoothing is the discrete convolution of values along the axis # with a normalised weights function defined over an interval (window) # of the axis. # # # #:Parameters: # # window: `str`, optional # # ==================== ============================== =============================== # weights Description Reference # ==================== ============================== =============================== # ``barthann`` Modified Bartlett-Hann weights `scipy.signal.barthann` # ``bartlett`` Bartlett weights `scipy.signal.bartlett` # ``blackman`` Blackman weights `scipy.signal.blackman` # ``blackmanharris`` Minimum 4-term Blackman-Harris `scipy.signal.blackmanharris` # weights # ``bohman`` Bohman weights `scipy.signal.bohman` # ``boxcar`` Boxcar or rectangular weights `scipy.signal.boxcar` # ``chebwin`` Dolph-Chebyshev weights `scipy.signal.chebwin` # ``cosine`` Weights with a simple cosine `scipy.signal.cosine` # shape # ``flattop`` Flat top weights `scipy.signal.flattop` # ``gaussian`` Gaussian weights `scipy.signal.gaussian` # ``general_gaussian`` Weights with a generalized `scipy.signal.general_gaussian` # Gaussian shape # ``hamming`` Hamming weights `scipy.signal.hamming` # ``hann`` Hann weights `scipy.signal.hann` # ``kaiser`` Kaiser weights `scipy.signal.kaiser` # ``nuttall`` Minimum 4-term Blackman-Harris `scipy.signal.nuttall` # weights according to Nuttall # ``parzen`` Parzen weights `scipy.signal.parzen` # ``slepian`` Digital Slepian (DPSS) weights `scipy.signal.slepian` # ``triang`` Triangular weights `scipy.signal.triang` # ???/ User-defined weights # ==================== ============================== =============================== # # The default weights are ``'boxcar'``, which are create an # unweighted moving average # Some weights require extra parameters to be set for their calculation: # # ====================== ================ =============================== # *weights* Extra parameters Reference # ====================== ================ =============================== # ``'chebwin'`` *attenuation* `scipy.signal.chebwin` # ``'gaussian'`` *std* `scipy.signal.gaussian` # ``'general_gaussian'`` *power*, *std* `scipy.signal.general_gaussian` # ``'kaiser'`` *beta* `scipy.signal.kaiser` # ``'slepian'`` *width* `scipy.signal.slepian` # ====================== ================ =============================== # # attenuation: number, optional # Required for a Dolph-Chebyshev weights, otherwise # ignored. *attenuation* is in decibels. # # Example: ``n=51, weights='chebwin', attenuation=100`` # # beta: number, optional # Required for Kaiser weights, otherwise ignored. *beta* is a # shape parameter which determines the trade-off between # main-lobe width and side lobe level. # # Example: ``n=51, weights='Kaiser', beta=14`` # # power: number, optional # Required for a generalized Gaussian weights, otherwise # ignored. *power* is a shape parameter: 1 is identical to # Gaussian weights, 0.5 is the same shape as the Laplace # distribution. # # Example: ``n=52, weights='general_gaussian', power=1.5, std=7`` # # std: number, optional # Required for Gaussian and generalized Gaussian weights, # otherwise ignored. *std* is the standard deviation, sigma. # # Example: ``n=52, weights='gaussian', std=7`` # # width: float, optional # Required for digital Slepian (DPSS) weights, otherwise # ignored. *wodth* is the bandwidth. # # Example: ``n=51, weights='slepian', width=0.3`` # # rolling_window: optional # Group the axis elements for a "rolling window" collapse. The # axis is grouped into **consecutive** runs of **overlapping** # elements. The first group starts at the first element of the # axis and each following group is offset by one element from # the previous group, so that an element may appear in multiple # groups. The collapse operation is applied to each group # independently and the collapsed axis in the returned field # will have a size equal to the number of groups. If weights # have been given by the *weights* parameter then they are # applied to each group, unless alternative weights have been # provided with the *window_weights* parameter. The # *rolling_window* parameter may be one of: # # * An `int` defining the number of elements in each # group. Each group will have exactly this number of # elements. Note that if the group size does does not divide # exactly into the axis size then some elements at the end # of the axis will not be included in any group. # # Example: To define groups of 5 elements: # ``rolling_window=5``. # # .. # # * A `cf.Data` defining the group size. Each group contains a # consecutive run of elements whose range of coordinate # bounds does not exceed the group size. Note that 1) if the # group size is sufficiently small then some groups may be # empty and some elements may not be inside any group may # not be inside any group; 2) different groups may contain # different numbers of elements. # # Example: To create 10 kilometre windows: # ``rolling_window=cf.Data(10, 'km')``. # # window_weights: ordered sequence of numbers, optional # Specify the weights for a rolling window collapse. Each # non-empty group uses these weights in its collapse, and all # non-empty groups must have the same number elements as the # window weights. If *window_weights* is not set then the groups # take their weights from the *weights* parameter, and in this # case the groups may have different sizes. # # Example: To define a 1-2-1 filter: ``rolling_window=3, # window_weights=[1, 2, 1]``. # #''' # if weights == 'user': # weights = numpy_array(weights, float) # if weights.size != n: # raise ValueError("jb ") # if weights.ndim > 1: # raise ValueError("bad shape") # else: # weights = getattr(signal, window)(n, **window_args) # if return_weights: # return weights # http://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.filters.convolve1d.html # http://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.filters.convolve.html # smoothed_array = convolve1d(array, weights/weights.sum(), axis=iaxis, # mode=mode, cval=constant) # # f.Data = Data(smoothed_array, f.Units) #http://mail.scipy.org/pipermail/scipy-user/2008-November/018601.html #Sorry for the long overdue reply. # #Reflect means: # #1 | 2 | 3 | 2 | 1 # #While mirror means: # #1 | 2 | 3 | 3| 2 | 1 # #(or the other way around, can't remember). IT IS THE OTHER WAY ROUND!!!! # #http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.savgol_filter.html#scipy.signal.savgol_filter #The problem with the last approach is the interpolation between 3 and #3, which is currently broken, so I'd advise against using it. # # # # Coordinate bounds # dim = f.dim(axis) # # # n_by_2 = 0.5 * n # i = int(n_by_2) # j = axis_size - i # d1 = i # if not i < n_by_2: # # Window has even number of points # i -= 1 # # d0 = i # # new_bounds[:i, 0] = bounds[0, 0] # # new_bounds[i:j, 0] = bounds[i-d0:j-d0, 0] # new_bounds[i:j, 1] = bounds[i+d1:j+d1, 1] # # new_bounds[j:, 1] = bounds[-1, 1] # # if mode == 'mirror': # new_bounds[:i, 1] = bounds[i+d1, 1] # new_bounds[j:, 0] = bounds[j-d0, 0] # elif mode in ('nearest', 'reflect', 'constant'): # new_bounds[:i, 1] = bounds[d1:i+d1, 1] # new_bounds[j:, 0] = bounds[j-d0:axis_size-d0, 0] # # wrap? ## if dim: # if dim.hasbounds: # data = dim.array # bounds = dim.bounds.array # new_bounds = numpy_empty(bounds.shape, dtype=float) # # half_window = 0.5 * n * float(cell_sizes[0]) # # if dim.increasing: # a_min, a_max = bounds[[0, -1], [0, 1]] # else: # half_window = -half_window # a_min, a_max = bounds[[-1, 0], [0, 1]] # # new_bounds[0] = data - half_window # new_bounds[1] = data + half_window # numpy_clip(new_bounds, a_min, a_max, new_bounds) # # dim.insert_bounds(Data(new_bounds, dim.Units), copy=False) # #--- End: if # # f.remove_items(role='c', axes=axis) # # for b in f.auxs(axes=axis): # if b.hasbounds: # del b.bounds # #--- End: if # cell_methods = getattr(f, 'cell_methods', None) # if cell_methods is None: # cell_methods = CellMethods() # # f.cell_methods += CellMethods( # 'name: mean (+'+weights+' weights '+', '.join([str(x) for x in weights])+')') #x ## #--- E def HDF_chunks(self, *chunksizes): '''{+HDF_chunks} **Chunking the metadata** The coordinate, cell measure, and ancillary contructs are not automatically chunked, but they may be chunked manually. For example, a two dimensional latitude coordinate could chunked as follows (see `cf.AuxiliaryCoordinate.HDF_chunks` for details): >>> f.coord('latitude').HDF_chunks({0: 10, 1: 15}) In version 2.0, the metadata will be automatically chunked. **Chunking via cf.write** Chunking may also be defined via a parameter to the `cf.write` function, in which case any axis chunk sizes set on the field take precedence. .. versionadded:: 1.1.13 .. seealso:: `cf.write` :Examples 1: To define chunks which are the full size for each axis except for the time axis which is to have a chunk size of 12: >>> old_chunks = f.HDF_chunks({'T': 12}) :Parameters: chunksizes: `dict` or `None`, optional Specify the chunk sizes for axes of the field. Axes are given by dictionary keys, with a chunk size for those axes as the dictionary values. A dictionary key of ``axes`` defines the axes that would be returned by the field's `~cf.Field.axes` method, i.e. by ``f.axes(axes)``. See `cf.Field.axes` for details. In the special case of *chunksizes* being `None`, then chunking is set to the netCDF default. *Example:* To set the chunk size for time axes to 365: ``{'T': 365}``. *Example:* To set the chunk size for the first and third data array axes to 100: ``{0: 100, 2: 100}``, or equivalently ``{(0, 2): 100}``. *Example:* To set the chunk size for the longitude axis to 100 and for the air temperature axis to 5: ``{'X': 100, 'air_temperature': 5}``. *Example:* To set the chunk size for all axes to 10: ``{None: 10}``. This works because ``f.axes(None)`` returns all field axes. *Example:* To set the chunking to the netCDF default: ``None``. :Returns: out: `dict` The chunk sizes prior to the new setting, or the current current sizes if no new values are specified. :Examples 2: >>> f >>> f.HDF_chunks() {0: None, 1: None, 2: None} >>> f.HDF_chunks({'T': 365, 2: 1000}) {0: None, 1: None, 2: None} >>> f.HDF_chunks({'X': None}) {0: 365, 1: None, 2: 1000} >>> f.HDF_chunks(None) {0: 365, 1: None, 2: None} >>> f.HDF_chunks() {0: None, 1: None, 2: None} ''' if not chunksizes: return super(Field, self).HDF_chunks() if len(chunksizes) > 1: raise ValueError("asfdds ") chunks = chunksizes[0] if chunks is None: return super(Field, self).HDF_chunks(None) _HDF_chunks = {} # seen_axes = [] data_axes = self.data_axes() for axes, size in chunks.iteritems(): for axis in self.axes(axes): # if axis in seen_axes: # raise ValueError( #"Can't set multiple chunk sizes for axis {0}".format(data_axes.index(axis))) try: _HDF_chunks[data_axes.index(axis)] = size except ValueError: pass # seen_axes.append(axis) #--- End: for return super(Field, self).HDF_chunks(_HDF_chunks) #--- End: def def field(self, items=None, role=None, axes=None, axes_all=None, axes_subset=None, axes_superset=None, exact=False, inverse=False, match_and=True, ndim=None, bounds=False): '''{+Fef,}Create an independent field from a domain item. An item is either a dimension coordinate, an auxiliary coordinate or a cell measure object of the domain. {+item_selection} If a unique item can not be found then no field is created and `None` is returned. A field may also be created from coordinate bounds (see the *bounds* parameter). .. versionadded:: 1.1 .. seealso:: `cf.read`, `item` :Examples 1: :Parameters: {+items} {+role} {+axes} {+axes_all} {+axes_subset} {+axes_superset} {+ndim} {+match_and} {+exact} {+inverse} bounds: `bool`, optional If true then create a field from a coordinate object's bounds. :Returns: out: `cf.{+Variable}` {+Fef,}The field based on the selected domain item. :Examples 2: :: >>> print f eastward_wind field summary --------------------------- Data : eastward_wind(time(3), grid_latitude(110), grid_longitude(106)) m s-1 Cell methods : time: mean Axes : time(3) = [1979-05-01 12:00:00, ..., 1979-05-03 12:00:00] gregorian : grid_longitude(106) = [-20.54, ..., 25.66] degrees : grid_latitude(110) = [23.32, ..., -24.64] degrees Aux coords : latitude(grid_latitude(110), grid_longitude(106)) = [[67.12, ..., 22.89]] degrees_north : longitude(grid_latitude(110), grid_longitude(106)) = [[-45.98, ..., 35.29]] degrees_east Coord refs : >>> print f.field('X') grid_longitude field summary ---------------------------- Data : grid_longitude(grid_longitude(106)) degrees Axes : grid_longitude(106) = [-20.54, ..., 25.66] degrees Coord refs : >>> print f.field('X', bounds=True) grid_longitude field summary ---------------------------- Data : grid_longitude(grid_longitude(106), domain%dim1(2)) degrees Axes : domain%dim1(2) : grid_longitude(106) = [-20.54, ..., 25.66] degrees Coord refs : >>> print f.field('lat') latitude field summary ---------------------- Data : latitude(grid_latitude(110), grid_longitude(106)) degrees_north Axes : grid_longitude(106) = [-20.54, ..., 25.66] degrees : grid_latitude(110) = [23.32, ..., -24.64] degrees Aux coords : latitude(grid_latitude(110), grid_longitude(106)) = [[67.12, ..., 22.89]] degrees_north : longitude(grid_latitude(110), grid_longitude(106)) = [[-45.98, ..., 35.29]] degrees_east Coord refs : To multiply the field by the cosine of its latitudes: >>> latitude = f.field({'units': 'radian', None: 'Y'}) >>> latitude >>> g = f * latitude.cos() ''' kwargs2 = self._parameters(locals()) # List functionality if self._list: return self._list_method('field', kwargs2) del kwargs2['bounds'] items = self.items(**kwargs2) if not items: return key, item = items.popitem() if items: return domain = self.domain.copy() # Remove domain items which span any axis not spanned by the # item axes = self.axes(key, ordered=True) unused_axes = self.axes().difference(axes) for key in self.items(axes=unused_axes): domain.remove_item(key) # Remove coordinate references which do not span any of the # item's axes for key in self.refs(): if not self.domain.ref_axes(key).intersection(axes): domain.remove_item(key) # Remove the unused axes domain._axes.pop('data', None) domain.remove_axes(unused_axes) if bounds and item.hasbounds: item = item.bounds axes.append(domain.insert_axis(item.shape[-1])) # Create the field f = type(self)(properties=item.properties, domain=domain, axes=axes, data=getattr(item, 'Data', None), copy=True) # Set the field's ncvar attribute ncvar = getattr(item, 'ncvar', None) if ncvar is not None: f.ncvar = ncvar return f #--- End: def def flip(self, axes=None, i=False, **kwargs): ''' {+Fef,}Flip (reverse the direction of) axes of the field. .. seealso:: `axes`, `expand_dims`, `squeeze`, `transpose`, `unsqueeze` :Examples: >>> f.flip() >>> f.flip('time') >>> f.flip(1) >>> f.flip('dim2') >>> f.flip(['time', 1, 'dim2']) :Parameters: {+axes, kwargs} {+i} :Returns: out: `cf.{+Variable}` {+Fef,}The flipped field. ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('flip', kwargs2) domain = self.domain if axes is None and not kwargs: # Flip all the axes axes = domain.axes() iaxes = range(self.ndim) else: axes = domain.axes(axes, **kwargs) data_axes = domain.data_axes() iaxes = [data_axes.index(axis) for axis in axes.intersection(data_axes)] #--- End: if # Flip the requested axes in the field's data array f = super(Field, self).flip(iaxes, i=i) # Flip any coordinate and cell measures which span the flipped # axes domain = f.domain domain_axes = domain._axes for key, item in domain.items(role=('d', 'a', 'm')).iteritems(): item_axes = domain_axes[key] item_flip_axes = axes.intersection(item_axes) if item_flip_axes: iaxes = [item_axes.index(axis) for axis in item_flip_axes] item.flip(iaxes, i=True) #--- End: for return f #--- End: def def remove_data(self): ''' Remove and return the data array. :Returns: out: `cf.Data` or `None` The removed data array, or `None` if there isn't one. :Examples: >>> f._hasData True >>> f.data >>> f.remove_data() >>> f._hasData False >>> print f.remove_data() None ''' self.domain._axes.pop('data', None) return super(Field, self).remove_data() #--- End: def def select(self, select=None, items=None, rank=None, ndim=None, exact=False, match_and=True, inverse=False): '''{+Fef,}Return the field if it satisfies the given conditions. Different types of conditions may be set with the parameters: =========== ========================================================= Parameter What gets tested =========== ========================================================= *select* Field properties and attributes *items* Field domain items *rank* The number of field domain axes *ndim* The number of field data array axes =========== ========================================================= By default, when multiple criteria are given the field matches if it satisfies the conditions given by each one. [+1]If the field does not satisfy the conditions then an empty [+1]`cf.FieldList` object is returned. [+N]If no fields satisfy the conditions then an empty `cf.FieldList` [+N]object is returned. [+1]Note that ``f.select(**kwargs)`` is equivalent to ``f if [+1]f.match(**kwargs) else cf.FieldList()``. [+N]Note that ``f.select(**kwargs)`` is equivalent to ``FieldList(g for g [+N]in f if g.match(**kwargs))`` .. seealso:: `items`, `match` **Quick start examples** There is great flexibility in the types of test which can be specified, and as a result the documentation is very detailed in places. These preliminary, simple examples show that the usage need not always be complicated and may help with understanding the keyword descriptions. 1. Select fields which contain air temperature data, as given determined by the `identity` method: >>> f.select('air_temperature') 2. Select fields which contain air temperature data, as given determined by the `identity` method, or have a long name which contains the string "temp": >>> f.select(['air_temperature', {'long_name': cf.eq('.*temp.*', regex=true)}]) 3. Select fields which have at least one longitude grid cell point on the Greenwich meridian: >>> f.select(items={'longitude': 0}) 4. Select fields which have at least one latitude grid cell of less than 1 degree in size: >>> f.select(items={'latitude': cf.cellsize(cf.lt(1, 'degree'))}) 5. Select fields which have exactly 4 domain axes: >>> f.select(rank=4) 6. Examples 1 to 4 may be combined to select fields which have exactly 4 domain axes, contain air temperature data, has at least one longitude grid cell point on the Greenwich meridian and have at least one latitude grid cells with a size of less than 1 degree: >>> f.select('air_temperature', ... items={'longitude': 0, ... 'latitude': cf.cellsize(cf.lt(1, 'degree'))}, ... rank=4) 7. Select fields which contain at least one Gregorian calendar monthly mean data array value: >>> f.select({'cell_methods': cf.CellMethods('time: mean')}, ... items={'time': cf.cellsize(cf.wi(28, 31, 'days'))}) Further examples are given within and after the description of the arguments. :Parameters: select: optional Set conditions on the field's CF property and attribute values. *select* may be one, or a sequence of: * `None` or an empty dictionary. Always matches the field. This is the default. .. * A string which identifies string-valued metadata of the field and a value to compare it against. The value may take one of the following forms: ============== ====================================== *select* Interpretation ============== ====================================== Contains ``:`` Selects on the CF property specified before the first ``:`` Contains ``%`` Selects on the attribute specified before the first ``%`` Anything else Selects on identity as returned by the `identity` method ============== ====================================== By default the part of the string to be compared with the item is treated as a regular expression understood by the :py:obj:`re` module and the field matches if its appropriate value matches the regular expression using the :py:obj:`re.match` method (i.e. if zero or more characters at the beginning of field's value match the regular expression pattern). See the *exact* parameter for details. *Example:* To select a field with `identity` beginning with "lat": ``select='lat'``. *Example:* To select a field with long name beginning with "air": ``select='long_name:air'``. *Example:* To select a field with netCDF variable name of exactly "tas": ``select='ncvar%tas$'``. *Example:* To select a field with `identity` which ends with the letter "z": ``select='.*z$'``. *Example:* To select a field with long name which starts with the string ".*a": ``select='long_name%\.\*a'``. .. * A `cf.Query` object to be compared with field's identity, as returned by its `identity` method. *Example:* To select a field with `identity` of exactly "air_temperature" you could set ``select=cf.eq('air_temperature')`` (see `cf.eq`). *Example:* To select a field with `identity` ending with "temperature" you could set ``select=cf.eq('.*temperature$', exact=False)`` (see `cf.eq`). .. * A dictionary which identifies properties of the field with corresponding tests on their values. The field matches if **all** of the tests in the dictionary are passed. In general, each dictionary key is a CF property name with a corresponding value to be compared against the field's CF property value. If the dictionary value is a string then by default it is treated as a regular expression understood by the :py:obj:`re` module and the field matches if its appropriate value matches the regular expression using the :py:obj:`re.match` method (i.e. if zero or more characters at the beginning of field's value match the regular expression pattern). See the *exact* parameter for details. *Example:* To select a field with standard name of exactly "air_temperature" and long name beginning with the letter "a": ``select={'standard_name': cf.eq('air_temperature'), 'long_name': 'a'}`` (see `cf.eq`). Some key/value pairs have a special interpretation: ================== ==================================== Special key Value ================== ==================================== ``'units'`` The value must be a string and by default is evaluated for equivalence, rather than equality, with the field's `units` property, for example a value of ``'Pa'`` will match units of Pascals or hectopascals, etc. See the *exact* parameter. ``'calendar'`` The value must be a string and by default is evaluated for equivalence, rather than equality, with the field's `calendar` property, for example a value of ``'noleap'`` will match a calendar of noleap or 365_day. See the *exact* parameter. ``'cell_methods'`` The value must be a `cf.CellMethods` object containing *N* cell methods and by default is evaluated for equivalence with the last *N* cell methods contained within the field's `cell_methods` property. See the *exact* parameter. `None` The value is interpreted as for a string value of the *select* parameter. For example, ``select={None: 'air'}`` is equivalent to ``select='air'`` and ``select={None: 'ncvar%pressure'}`` is equivalent to ``select='ncvar%pressure'``. ================== ==================================== *Example:* To select a field with standard name starting with "air", units of temperature and a netCDF variable name beginning with "tas" you could set ``select={'standard_name': 'air', 'units': 'K', None: 'ncvar%tas'}``. *Example:* To select a field whose last two cell methods are equivalent to "time: minimum area: mean": ``select={'cell_methods': cf.Cellmethods('time: minimum area: mean')``. This would select a field which has, for example, cell methods of "height: mean time: minimum area: mean". If *select* is a sequence of any combination of the above then the field matches if it matches **at least one** element of the sequence: *Example:* >>> f.select('air_temperature') >>> f.select({'units': 'hPa'}) [] >>> f.select(['air_temperature', {'units': 'hPa']) If the sequence is empty then the field always matches. items: `dict`, optional A dictionary which identifies domain items of the field (dimension coordinate, auxiliary coordinate, cell measure or coordinate reference objects) with corresponding tests on their elements. The field matches if **all** of the specified items exist and their tests are passed. Each dictionary key specifies an item to test as the one that would be returned by this call of the field's `item` method: ``f.item(key, exact=exact)`` (see `cf.Field.item`). The corresponding value is, in general, any object for which the item may be compared with for equality (``==``). The test is passed if the result evaluates to True, or if the result is an array of values then the test is passed if at least one element evaluates to true. If the value is `None` then the test is always passed, i.e. this case tests for item existence. *Example:* To select a field which has a latitude coordinate value of exactly 30: ``items={'latitude': 30}``. *Example:* To select a field whose longitude axis spans the Greenwich meridian: ``items={'longitude': cf.contain(0)}`` (see `cf.contain`). *Example:* To select a field which has a time coordinate value of 2004-06-01: ``items={'time': cf.dt('2004-06-01')}`` (see `cf.dt`). *Example:* To select a field which has a height axis: ``items={'Z': None}``. *Example:* To select a field which has a time axis and depth coordinates greater then 1000 metres: ``items={'T': None, 'depth': cf.gt(1000, 'm')}`` (see `cf.gt`). *Example:* To select a field with time coordinates after than 1989 and cell sizes of between 28 and 31 days: ``items={'time': cf.dtge(1990) & cf.cellsize(cf.wi(28, 31, 'days'))}`` (see `cf.dtge`, `cf.cellsize` and `cf.wi`). rank: optional Specify a condition on the number of axes in the field's domain. The field matches if its number of domain axes equals *rank*. A range of values may be selected if *rank* is a `cf.Query` object. Not to be confused with the *ndim* parameter (the number of data array axes may be fewer than the number of domain axes). *Example:* ``rank=2`` selects a field with exactly two domain axes and ``rank=cf.wi(3, 4)`` selects a field with three or four domain axes (see `cf.wi`). ndim: optional Specify a condition on the number of axes in the field's data array. The field matches if its number of data array axes equals *ndim*. A range of values may be selected if *ndim* is a `cf.Query` object. Not to be confused with the *rank* parameter (the number of domain axes may be greater than the number of data array axes). *Example:* ``ndim=2`` selects a field with exactly two data array axes and ``ndim=cf.le(2)`` selects a field with fewer than three data array axes (see `cf.le`). exact: `bool`, optional The *exact* parameter applies to the interpretation of string values of the *select* parameter and of keys of the *items* parameter. By default *exact* is False, which means that: * A string value is treated as a regular expression understood by the :py:obj:`re` module. * Units and calendar values in a *select* dictionary are evaluated for equivalence rather then equality (e.g. "metre" is equivalent to "m" and to "km"). * A cell methods value containing *N* cell methods in a *select* dictionary is evaluated for equivalence with the last *N* cell methods contained within the field's `cell_methods` property. .. *Example:* To select a field with a standard name which begins with "air" and any units of pressure: ``f.select({'standard_name': 'air', 'units': 'hPa'})``. *Example:* ``f.select({'cell_methods': cf.CellMethods('time: mean (interval 1 hour)')})`` would select a field with cell methods of "area: mean time: mean (interval 60 minutes)". If *exact* is True then: * A string value is not treated as a regular expression. * Units and calendar values in a *select* dictionary are evaluated for exact equality rather than equivalence (e.g. "metre" is equal to "m", but not to "km"). * A cell methods value in a *select* dictionary is evaluated for exact equality to the field's cell methods. .. *Example:* To select a field with a standard name of exactly "air_pressure" and units of exactly hectopascals: ``f.select({'standard_name': 'air_pressure', 'units': 'hPa'}, exact=True)``. *Example:* To select a field with a cell methods of exactly "time: mean (interval 1 hour)": ``f.select({'cell_methods': cf.CellMethods('time: mean (interval 1 hour)')``. Note that `cf.Query` objects provide a mechanism for overriding the *exact* parameter for individual values. *Example:* ``f.select({'standard_name': cf.eq('air', exact=False), 'units': 'hPa'}, exact=True)`` will select a field with a standard name which begins "air" but has units of exactly hectopascals (see `cf.eq`). *Example:* ``f.select({'standard_name': cf.eq('air_pressure'), 'units': 'hPa'})`` will select a field with a standard name of exactly "air_pressure" but with units which equivalent to hectopascals (see `cf.eq`). match_and: `bool`, optional By default *match_and* is True and the field matches if it satisfies the conditions specified by each test parameter (*select*, *items*, *rank* and *ndim*). If *match_and* is False then the field will match if it satisfies at least one test parameter's condition. *Example:* To select a field with a standard name of "air_temperature" **and** 3 data array axes: ``f.select('air_temperature', ndim=3)``. To select a field with a standard name of "air_temperature" **or** 3 data array axes: ``f.select('air_temperature", ndim=3, match_and=False)``. inverse: `bool`, optional If True then return the field matches if it does **not** satisfy the given conditions. *Example:* >>> len(f.select('air', ndim=4, inverse=True)) == len(f) - len(f.select('air', ndim=4)) True :Returns: out: `cf.Field` or `cf.FieldList` [+1] If the field matches the given conditions then it is returned. [+1] Otherwise an empty field list is returned. [+N] If a single field matches the given conditions then it is [+N] returned, otherwise a {+variable} of the matching fields is [+N] returned. :Examples: Field identity starts with "air": >>> f.select('air') Field identity ends contains the string "temperature": >>> f.select('.*temperature') Field identity is exactly "air_temperature": >>> f.select('^air_temperature$') >>> f.select('air_temperature', exact=True) Field has units of temperature: >>> f.select({'units': 'K'}): Field has units of exactly Kelvin: >>> f.select({'units': 'K'}, exact=True) Field identity which starts with "air" and has units of temperature: >>> f.select({None: 'air', 'units': 'K'}) Field identity starts with "air" and/or has units of temperature: >>> f.select(['air', {'units': 'K'}]) Field standard name starts with "air" and/or has units of exactly Kelvin: >>> f.select([{'standard_name': cf.eq('air', exact=False), {'units': 'K'}], ... exact=True) Field has height coordinate values greater than 63km: >>> f.select(items={'height': cf.gt(63, 'km')}) Field has a height coordinate object with some values greater than 63km and a north polar point on its horizontal grid: >>> f.select(items={'height': cf.gt(63, 'km'), ... 'latitude': cf.eq(90, 'degrees')}) Field has some longitude cell sizes of 3.75: >>> f.select(items={'longitude': cf.cellsize(3.75)}) Field latitude cell sizes within a tropical region are all no greater than 1 degree: >>> f.select(items={'latitude': (cf.wi(-30, 30, 'degrees') & ... cf.cellsize(cf.le(1, 'degrees')))}) Field contains monthly mean air pressure data and all vertical levels within the bottom 100 metres of the atmosphere have a thickness of 20 metres or less: >>> f.select({None: '^air_pressure$', 'cell_methods': cf.CellMethods('time: mean')}, ... items={'height': cf.le(100, 'm') & cf.cellsize(cf.le(20, 'm')), ... 'time': cf.cellsize(cf.wi(28, 31, 'days'))}) ''' kwargs2 = self._parameters(locals()) # List functionality if self._list: fl = [f for f in self if f.match(**kwargs2)] if len(fl) == 1: return fl[0] else: return type(self)(fl) if self.match(**kwargs2): return self else: return FieldList() #--- End: def def set_equals(self, other, rtol=None, atol=None, ignore_fill_value=False, traceback=False, ignore=('Conventions',)): ''' ''' return self.equals(other, rtol=rtol, atol=atol, ignore_fill_value=ignore_fill_value, traceback=traceback, ignore=ignore, _set=True) #---End: def def anchor(self, axes, value, i=False, dry_run=False, **kwargs): ''' {+Fef,}Roll a cyclic axis so that the given value lies in the first coordinate cell. {+Fef,}A unique axis is selected with the *axes* and *kwargs* parameters. .. versionadded:: 1.0 [+1].. seealso:: `axis`, `cyclic`, `iscyclic`, `period`, `roll` [+N].. seealso:: `cf.Field.axis`, `cf.Field.cyclic`, `cf.Field.iscyclic`, [+N] `cf.Field.period`, `roll` :Examples 1: Anchor the cyclic X axis to a value of 180: >>> g = f.anchor('X', 180) :Parameters: {+axes, kwargs} value: data-like object Anchor the dimension coordinate values for the selected cyclic axis to the *value*. If *value* has units then they must be compatible with those of the dimension coordinates, otherwise it is assumed to have the same units as the dimension coordinates. The coordinate values are transformed so that *value* is "equal to or just before" the new first coordinate value. More specifically: * Increasing dimension coordinates with positive period, P, are transformed so that *value* lies in the half-open range (L-P, F], where F and L are the transformed first and last coordinate values, respectively. * Decreasing dimension coordinates with positive period, P, are transformed so that *value* lies in the half-open range (L+P, F], where F and L are the transformed first AND last coordinate values, respectively. .. *Example:* If the original dimension coordinates are ``0, 5, ..., 355`` (evenly spaced) and the period is ``360`` then ``value=0`` implies transformed coordinates of ``0, 5, ..., 355``; ``value=-12`` implies transformed coordinates of ``-10, -5, ..., 345``; ``value=380`` implies transformed coordinates of ``380, 385, ..., 715``. *Example:* If the original dimension coordinates are ``355, 350, ..., 0`` (evenly spaced) and the period is ``360`` then ``value=355`` implies transformed coordinates of ``355, 350, ..., 0``; ``value=0`` implies transformed coordinates of ``0, -5, ..., -355``; ``value=392`` implies transformed coordinates of ``390, 385, ..., 30``. {+data-like} {+i} dry_run: `bool`, optional Return a dictionary of parameters which describe the anchoring process. The field is not changed, even if *i* is True. :Returns: [+1] out: `cf.{+Variable}` or `dict` [+N] out: `cf.{+Variable}` :Examples 2: >>> f[+0].iscyclic('X') True >>> f[+0].dim('X').data >>> print f[+0].dim('X').array [ 0 45 90 135 180 225 270 315] >>> g = f.anchor('X', 230) >>> print g[+0].dim('X').array [270 315 0 45 90 135 180 225] >>> g = f.anchor('X', cf.Data(590, 'degreesE')) >>> print g[+0].dim('X').array [630 675 360 405 450 495 540 585] >>> g = f.anchor('X', cf.Data(-490, 'degreesE')) >>> print g[+0].dim('X').array [-450 -405 -720 -675 -630 -585 -540 -495] >>> f[+0].iscyclic('X') True >>> f[+0].dim('X').data >>> f.anchor('X', 10000)[+0].dim('X').data >>> d = f[+0].anchor('X', 10000, dry_run=True) >>> d {'axis': 'dim2', 'nperiod': , 'roll': 28} >>> (f.roll(d['axis'], d['roll'])[+0].dim(d['axis']) + d['nperiod']).data ''' # List functionality if self._list: kwarsg2 = self._parameters(locals()) if kwargs2['dry_run']: raise ValueError( "Can't do a dry run on a {}".format(self.__class__.__name__)) return self._list_method('anchor', kwargs2) axis = self.domain.axis(axes, **kwargs) if axis is None: raise ValueError( "Can't anchor: Bad axis specification") if i or dry_run: f = self else: f = self.copy() domain = f.domain dim = domain.item(axis) if dim is None: raise ValueError( "Can't shift non-cyclic {!r} axis".format(f.axis_name(axis))) period = dim.period() if period is None: raise ValueError( "Cyclic {!r} axis has no period".format(dim.name())) value = Data.asdata(value) if not value.Units: value = value.override_units(dim.Units) elif not value.Units.equivalent(dim.Units): raise ValueError( "Anchor value has incompatible units: {!r}".format(value.Units)) axis_size = domain.axis_size(axis) if axis_size <= 1: # Don't need to roll a size one axis if dry_run: return {'axis': axis, 'roll': 0, 'nperiod': 0} else: return f c = dim.data if dim.increasing: # Adjust value so it's in the range [c[0], c[0]+period) n = ((c[0] - value) / period).ceil(i=True) value1 = value + n * period shift = axis_size - numpy_argmax(c - value1 >= 0) if not dry_run: f.roll(axis, shift, i=True) dim = domain.item(axis) n = ((value - dim.data[0]) / period).ceil(i=True) else: # Adjust value so it's in the range (c[0]-period, c[0]] n = ((c[0] - value) / period).floor(i=True) value1 = value + n * period shift = axis_size - numpy_argmax(value1 - c >= 0) if not dry_run: f.roll(axis, shift, i=True) dim = domain.item(axis) n = ((value - dim.data[0]) / period).floor(i=True) #--- End: if if dry_run: return {'axis': axis, 'roll': shift, 'nperiod': n*period} if n: np = n * period dim += np if dim.hasbounds: bounds = dim.bounds bounds += np #--- End: if return f #--- End: def def autocyclic(self): ''' {+Fef,}Set axes to be cyclic if they meet conditions. An axis is set to be cyclic if and only if the following is true: * It has a unique, 1-d, longitude dimension coordinate object with bounds and the first and last bounds values differ by 360 degrees (or an equivalent amount in other units). .. versionadded:: 1.0 [+1].. seealso:: `cyclic`, `iscyclic`, `period` [+N].. seealso:: `cf.Field.cyclic`, `cf.Field.iscyclic`, `cf.Field.period` :Examples 1: >>> f.autocyclic() :Returns: `None` ''' # List functionality if self._list: for f in self: f.autocyclic() return dims = self.dims('X') if len(dims) != 1: return key, dim = dims.popitem() if not self.Units.islongitude: if dim.getprop('standard_name', None) not in ('longitude', 'grid_longitude'): self.cyclic(key, iscyclic=False) return if not dim.hasbounds: self.cyclic(key, iscyclic=False) return bounds = dim.bounds if not bounds._hasData: self.cyclic(key, iscyclic=False) return period = Data(360, 'degrees') if abs(bounds.datum(-1) - bounds.datum(0)) != period: self.cyclic(key, iscyclic=False) return self.cyclic(key, iscyclic=True, period=period) #--- End: def def sort(self, cmp=None, key=None, reverse=False): '''Sort the field, viewed as a single element field list, in place. Note that ``f.sort(cmp, key, reverse)`` is equivalent to ``f``, thus providing compatiblity with a single element field list. .. versionadded:: 1.0.4 .. seealso:: `reverse`, `cf.FieldList.sort`, :py:obj:`sorted` :Examples 1: >>> f.sort() :Parameters: cmp: `function`, optional Specifies a custom comparison function of two arguments (iterable elements) which should return a negative, zero or positive number depending on whether the first argument is considered smaller than, equal to, or larger than the second argument. The default value is `None`. *Example:* ``cmp=lambda x,y: cmp(x.lower(), y.lower())``. key: `function`, optional Specifies a function of one argument that is used to extract a comparison key from each list element. The default value is `None` (compare the elements directly). *Example:* ``key=str.lower``. reverse: `bool`, optional If set to True, then the list elements are sorted as if each comparison were reversed. :Returns: `None` :Examples 2: >>> id0 = id(f) >>> f.sort() >>> id0 == id(f) True >>> g = cf.FieldList(f) >>> id0 = id(g) >>> g.sort() >>> id0 == id(g) True ''' return #--- End: def def squeeze(self, axes=None, i=False, **kwargs): '''{+Fef,}Remove size 1 axes from the data array. By default all size 1 axes are removed, but particular size 1 axes may be selected for removal. {+Fef,}The axes are selected with the *axes* parameter. Squeezed axes are not removed from the coordinate and cell measure objects, nor are they removed from the domain. To completely remove axes, use the `remove_axes` method. .. seealso:: `expand_dims`, `flip`, `remove_axes`, `transpose`, `unsqueeze` :Examples 1: Remove all size axes from the data array: >>> g = f.squeeze() Remove the size 1 time axis: >>> g = f.squeeze('T') :Parameters: {+axes, kwargs} {+i} :Returns: out: `cf.{+Variable}` {+Fef,}The squeezed field. :Examples 2: ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('squeeze', kwargs2) domain = self.domain data_axes = domain.data_axes() if axes is None and not kwargs: axes_sizes = domain._axes_sizes axes = [axis for axis in data_axes if axes_sizes[axis] == 1] else: axes = domain.axes(axes, **kwargs).intersection(data_axes) iaxes = [data_axes.index(axis) for axis in axes] # Squeeze the field's data array f = super(Field, self).squeeze(iaxes, i=i) f.domain._axes['data'] = [axis for axis in data_axes if axis not in axes] return f #--- End: def def transpose(self, axes=None, i=False, **kwargs): '''{+Fef,}Permute the axes of the data array. By default the order of the axes is reversed, but any ordering may be specified by selecting the axes of the output in the required order. {+Fef,}The axes are selected with the *axes* parameter. .. seealso:: `expand_dims`, `flip`, `squeeze`, `transpose`, `unsqueeze` :Examples 1: Reverse the order of the axes: >>> g = f.transpose() Specify a particular axes order: >>> g = f.transpose(['T', 'X', 'Y']) .. seealso:: `axes`, `expand_dims`, `flip`, `squeeze`, `unsqueeze` :Parameters: {+axes, kwargs} {+i} :Returns: out: `cf.{+Variable}` {+Fef,}, the transposed field. :Examples 2: >>> f.items() {'dim0': , 'dim1': , 'dim2': , 'dim3': } >>> f.data_axes() ['dim0', 'dim1', 'dim2'] >>> f.transpose() >>> f.transpose(['Y', 'T', 'X']) >>> f.transpose(['latitude', 'time', 'longitude']) >>> f.transpose([1, 0, 2]) >>> f.transpose((1, 'time', 'dim2')) ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('transpose', kwargs2) domain = self.domain data_axes = domain.data_axes() if axes is None and not kwargs: axes2 = data_axes[::-1] iaxes = range(self.ndim-1, -1, -1) else: axes2 = domain.axes(axes, ordered=True, **kwargs) if set(axes2) != set(data_axes): raise ValueError("Can't transpose %r: Bad axis specification: %r" % (self.__class__.__name__, axes)) iaxes = [data_axes.index(axis) for axis in axes2] #---- End: if # Transpose the field's data array f = super(Field, self).transpose(iaxes, i=i) # Reorder the list of axes in the domain f.domain._axes['data'] = axes2 return f #--- End: def def field(self, items=None, role=None, axes=None, axes_all=None, axes_subset=None, axes_superset=None, exact=False, inverse=False, match_and=True, ndim=None, bounds=False): '''{+Fef,}Create an independent field from a domain item. An item is either a dimension coordinate, an auxiliary coordinate or a cell measure object of the domain. {+item_selection} If a unique item can not be found then no field is created and `None` is returned. A field may also be created from coordinate bounds (see the *bounds* parameter). .. versionadded:: 1.1 .. seealso:: `cf.read`, `item` :Examples 1: :Parameters: {+items} {+role} {+axes} {+axes_all} {+axes_subset} {+axes_superset} {+ndim} {+match_and} {+exact} {+inverse} bounds: `bool`, optional If true then create a field from a coordinate object's bounds. :Returns: out: `cf.{+Variable}` {+Fef,}The field based on the selected domain item. :Examples 2: :: >>> print f eastward_wind field summary --------------------------- Data : eastward_wind(time(3), grid_latitude(110), grid_longitude(106)) m s-1 Cell methods : time: mean Axes : time(3) = [1979-05-01 12:00:00, ..., 1979-05-03 12:00:00] gregorian : grid_longitude(106) = [-20.54, ..., 25.66] degrees : grid_latitude(110) = [23.32, ..., -24.64] degrees Aux coords : latitude(grid_latitude(110), grid_longitude(106)) = [[67.12, ..., 22.89]] degrees_north : longitude(grid_latitude(110), grid_longitude(106)) = [[-45.98, ..., 35.29]] degrees_east Coord refs : >>> print f.field('X') grid_longitude field summary ---------------------------- Data : grid_longitude(grid_longitude(106)) degrees Axes : grid_longitude(106) = [-20.54, ..., 25.66] degrees Coord refs : >>> print f.field('X', bounds=True) grid_longitude field summary ---------------------------- Data : grid_longitude(grid_longitude(106), domain%dim1(2)) degrees Axes : domain%dim1(2) : grid_longitude(106) = [-20.54, ..., 25.66] degrees Coord refs : >>> print f.field('lat') latitude field summary ---------------------- Data : latitude(grid_latitude(110), grid_longitude(106)) degrees_north Axes : grid_longitude(106) = [-20.54, ..., 25.66] degrees : grid_latitude(110) = [23.32, ..., -24.64] degrees Aux coords : latitude(grid_latitude(110), grid_longitude(106)) = [[67.12, ..., 22.89]] degrees_north : longitude(grid_latitude(110), grid_longitude(106)) = [[-45.98, ..., 35.29]] degrees_east Coord refs : To multiply the field by the cosine of its latitudes: >>> latitude = f.field({'units': 'radian', None: 'Y'}) >>> latitude >>> g = f * latitude.cos() ''' kwargs2 = self._parameters(locals()) # List functionality if self._list: return self._list_method('field', kwargs2) del kwargs2['bounds'] items = self.items(**kwargs2) if not items: return key, item = items.popitem() if items: return domain = self.domain.copy() # Remove domain items which span any axis not spanned by the # item axes = self.axes(key, ordered=True) unused_axes = self.axes().difference(axes) for key in self.items(axes=unused_axes): domain.remove_item(key) # Remove coordinate references which do not span any of the # item's axes for key in self.refs(): if not self.domain.ref_axes(key).intersection(axes): domain.remove_item(key) # Remove the unused axes domain._axes.pop('data', None) domain.remove_axes(unused_axes) if bounds and item.hasbounds: item = item.bounds axes.append(domain.insert_axis(item.shape[-1])) # Create the field f = type(self)(properties=item.properties, domain=domain, axes=axes, data=getattr(item, 'Data', None), copy=True) # Set the field's ncvar attribute ncvar = getattr(item, 'ncvar', None) if ncvar is not None: f.ncvar = ncvar return f #--- End: def def flip(self, axes=None, i=False, **kwargs): ''' {+Fef,}Flip (reverse the direction of) axes of the field. .. seealso:: `axes`, `expand_dims`, `squeeze`, `transpose`, `unsqueeze` :Examples: >>> f.flip() >>> f.flip('time') >>> f.flip(1) >>> f.flip('dim2') >>> f.flip(['time', 1, 'dim2']) :Parameters: {+axes, kwargs} {+i} :Returns: out: `cf.{+Variable}` {+Fef,}The flipped field. ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('flip', kwargs2) domain = self.domain if axes is None and not kwargs: # Flip all the axes axes = domain.axes() iaxes = range(self.ndim) else: axes = domain.axes(axes, **kwargs) data_axes = domain.data_axes() iaxes = [data_axes.index(axis) for axis in axes.intersection(data_axes)] #--- End: if # Flip the requested axes in the field's data array f = super(Field, self).flip(iaxes, i=i) # Flip any coordinate and cell measures which span the flipped # axes domain = f.domain domain_axes = domain._axes for key, item in domain.items(role=('d', 'a', 'm')).iteritems(): item_axes = domain_axes[key] item_flip_axes = axes.intersection(item_axes) if item_flip_axes: iaxes = [item_axes.index(axis) for axis in item_flip_axes] item.flip(iaxes, i=True) #--- End: for return f #--- End: def def remove_data(self): ''' Remove and return the data array. :Returns: out: `cf.Data` or `None` The removed data array, or `None` if there isn't one. :Examples: >>> f._hasData True >>> f.data >>> f.remove_data() >>> f._hasData False >>> print f.remove_data() None ''' self.domain._axes.pop('data', None) return super(Field, self).remove_data() #--- End: def def select(self, select=None, items=None, rank=None, ndim=None, exact=False, match_and=True, inverse=False): '''{+Fef,}Return the field if it satisfies the given conditions. Different types of conditions may be set with the parameters: =========== ========================================================= Parameter What gets tested =========== ========================================================= *select* Field properties and attributes *items* Field domain items *rank* The number of field domain axes *ndim* The number of field data array axes =========== ========================================================= By default, when multiple criteria are given the field matches if it satisfies the conditions given by each one. [+1]If the field does not satisfy the conditions then an empty [+1]`cf.FieldList` object is returned. [+N]If no fields satisfy the conditions then an empty `cf.FieldList` [+N]object is returned. [+1]Note that ``f.select(**kwargs)`` is equivalent to ``f if [+1]f.match(**kwargs) else cf.FieldList()``. [+N]Note that ``f.select(**kwargs)`` is equivalent to ``FieldList(g for g [+N]in f if g.match(**kwargs))`` .. seealso:: `items`, `match` **Quick start examples** There is great flexibility in the types of test which can be specified, and as a result the documentation is very detailed in places. These preliminary, simple examples show that the usage need not always be complicated and may help with understanding the keyword descriptions. 1. Select fields which contain air temperature data, as given determined by the `identity` method: >>> f.select('air_temperature') 2. Select fields which contain air temperature data, as given determined by the `identity` method, or have a long name which contains the string "temp": >>> f.select(['air_temperature', {'long_name': cf.eq('.*temp.*', regex=true)}]) 3. Select fields which have at least one longitude grid cell point on the Greenwich meridian: >>> f.select(items={'longitude': 0}) 4. Select fields which have at least one latitude grid cell of less than 1 degree in size: >>> f.select(items={'latitude': cf.cellsize(cf.lt(1, 'degree'))}) 5. Select fields which have exactly 4 domain axes: >>> f.select(rank=4) 6. Examples 1 to 4 may be combined to select fields which have exactly 4 domain axes, contain air temperature data, has at least one longitude grid cell point on the Greenwich meridian and have at least one latitude grid cells with a size of less than 1 degree: >>> f.select('air_temperature', ... items={'longitude': 0, ... 'latitude': cf.cellsize(cf.lt(1, 'degree'))}, ... rank=4) 7. Select fields which contain at least one Gregorian calendar monthly mean data array value: >>> f.select({'cell_methods': cf.CellMethods('time: mean')}, ... items={'time': cf.cellsize(cf.wi(28, 31, 'days'))}) Further examples are given within and after the description of the arguments. :Parameters: select: optional Set conditions on the field's CF property and attribute values. *select* may be one, or a sequence of: * `None` or an empty dictionary. Always matches the field. This is the default. .. * A string which identifies string-valued metadata of the field and a value to compare it against. The value may take one of the following forms: ============== ====================================== *select* Interpretation ============== ====================================== Contains ``:`` Selects on the CF property specified before the first ``:`` Contains ``%`` Selects on the attribute specified before the first ``%`` Anything else Selects on identity as returned by the `identity` method ============== ====================================== By default the part of the string to be compared with the item is treated as a regular expression understood by the :py:obj:`re` module and the field matches if its appropriate value matches the regular expression using the :py:obj:`re.match` method (i.e. if zero or more characters at the beginning of field's value match the regular expression pattern). See the *exact* parameter for details. *Example:* To select a field with `identity` beginning with "lat": ``select='lat'``. *Example:* To select a field with long name beginning with "air": ``select='long_name:air'``. *Example:* To select a field with netCDF variable name of exactly "tas": ``select='ncvar%tas$'``. *Example:* To select a field with `identity` which ends with the letter "z": ``select='.*z$'``. *Example:* To select a field with long name which starts with the string ".*a": ``select='long_name%\.\*a'``. .. * A `cf.Query` object to be compared with field's identity, as returned by its `identity` method. *Example:* To select a field with `identity` of exactly "air_temperature" you could set ``select=cf.eq('air_temperature')`` (see `cf.eq`). *Example:* To select a field with `identity` ending with "temperature" you could set ``select=cf.eq('.*temperature$', exact=False)`` (see `cf.eq`). .. * A dictionary which identifies properties of the field with corresponding tests on their values. The field matches if **all** of the tests in the dictionary are passed. In general, each dictionary key is a CF property name with a corresponding value to be compared against the field's CF property value. If the dictionary value is a string then by default it is treated as a regular expression understood by the :py:obj:`re` module and the field matches if its appropriate value matches the regular expression using the :py:obj:`re.match` method (i.e. if zero or more characters at the beginning of field's value match the regular expression pattern). See the *exact* parameter for details. *Example:* To select a field with standard name of exactly "air_temperature" and long name beginning with the letter "a": ``select={'standard_name': cf.eq('air_temperature'), 'long_name': 'a'}`` (see `cf.eq`). Some key/value pairs have a special interpretation: ================== ==================================== Special key Value ================== ==================================== ``'units'`` The value must be a string and by default is evaluated for equivalence, rather than equality, with the field's `units` property, for example a value of ``'Pa'`` will match units of Pascals or hectopascals, etc. See the *exact* parameter. ``'calendar'`` The value must be a string and by default is evaluated for equivalence, rather than equality, with the field's `calendar` property, for example a value of ``'noleap'`` will match a calendar of noleap or 365_day. See the *exact* parameter. ``'cell_methods'`` The value must be a `cf.CellMethods` object containing *N* cell methods and by default is evaluated for equivalence with the last *N* cell methods contained within the field's `cell_methods` property. See the *exact* parameter. `None` The value is interpreted as for a string value of the *select* parameter. For example, ``select={None: 'air'}`` is equivalent to ``select='air'`` and ``select={None: 'ncvar%pressure'}`` is equivalent to ``select='ncvar%pressure'``. ================== ==================================== *Example:* To select a field with standard name starting with "air", units of temperature and a netCDF variable name beginning with "tas" you could set ``select={'standard_name': 'air', 'units': 'K', None: 'ncvar%tas'}``. *Example:* To select a field whose last two cell methods are equivalent to "time: minimum area: mean": ``select={'cell_methods': cf.Cellmethods('time: minimum area: mean')``. This would select a field which has, for example, cell methods of "height: mean time: minimum area: mean". If *select* is a sequence of any combination of the above then the field matches if it matches **at least one** element of the sequence: *Example:* >>> f.select('air_temperature') >>> f.select({'units': 'hPa'}) [] >>> f.select(['air_temperature', {'units': 'hPa']) If the sequence is empty then the field always matches. items: `dict`, optional A dictionary which identifies domain items of the field (dimension coordinate, auxiliary coordinate, cell measure or coordinate reference objects) with corresponding tests on their elements. The field matches if **all** of the specified items exist and their tests are passed. Each dictionary key specifies an item to test as the one that would be returned by this call of the field's `item` method: ``f.item(key, exact=exact)`` (see `cf.Field.item`). The corresponding value is, in general, any object for which the item may be compared with for equality (``==``). The test is passed if the result evaluates to True, or if the result is an array of values then the test is passed if at least one element evaluates to true. If the value is `None` then the test is always passed, i.e. this case tests for item existence. *Example:* To select a field which has a latitude coordinate value of exactly 30: ``items={'latitude': 30}``. *Example:* To select a field whose longitude axis spans the Greenwich meridian: ``items={'longitude': cf.contain(0)}`` (see `cf.contain`). *Example:* To select a field which has a time coordinate value of 2004-06-01: ``items={'time': cf.dt('2004-06-01')}`` (see `cf.dt`). *Example:* To select a field which has a height axis: ``items={'Z': None}``. *Example:* To select a field which has a time axis and depth coordinates greater then 1000 metres: ``items={'T': None, 'depth': cf.gt(1000, 'm')}`` (see `cf.gt`). *Example:* To select a field with time coordinates after than 1989 and cell sizes of between 28 and 31 days: ``items={'time': cf.dtge(1990) & cf.cellsize(cf.wi(28, 31, 'days'))}`` (see `cf.dtge`, `cf.cellsize` and `cf.wi`). rank: optional Specify a condition on the number of axes in the field's domain. The field matches if its number of domain axes equals *rank*. A range of values may be selected if *rank* is a `cf.Query` object. Not to be confused with the *ndim* parameter (the number of data array axes may be fewer than the number of domain axes). *Example:* ``rank=2`` selects a field with exactly two domain axes and ``rank=cf.wi(3, 4)`` selects a field with three or four domain axes (see `cf.wi`). ndim: optional Specify a condition on the number of axes in the field's data array. The field matches if its number of data array axes equals *ndim*. A range of values may be selected if *ndim* is a `cf.Query` object. Not to be confused with the *rank* parameter (the number of domain axes may be greater than the number of data array axes). *Example:* ``ndim=2`` selects a field with exactly two data array axes and ``ndim=cf.le(2)`` selects a field with fewer than three data array axes (see `cf.le`). exact: `bool`, optional The *exact* parameter applies to the interpretation of string values of the *select* parameter and of keys of the *items* parameter. By default *exact* is False, which means that: * A string value is treated as a regular expression understood by the :py:obj:`re` module. * Units and calendar values in a *select* dictionary are evaluated for equivalence rather then equality (e.g. "metre" is equivalent to "m" and to "km"). * A cell methods value containing *N* cell methods in a *select* dictionary is evaluated for equivalence with the last *N* cell methods contained within the field's `cell_methods` property. .. *Example:* To select a field with a standard name which begins with "air" and any units of pressure: ``f.select({'standard_name': 'air', 'units': 'hPa'})``. *Example:* ``f.select({'cell_methods': cf.CellMethods('time: mean (interval 1 hour)')})`` would select a field with cell methods of "area: mean time: mean (interval 60 minutes)". If *exact* is True then: * A string value is not treated as a regular expression. * Units and calendar values in a *select* dictionary are evaluated for exact equality rather than equivalence (e.g. "metre" is equal to "m", but not to "km"). * A cell methods value in a *select* dictionary is evaluated for exact equality to the field's cell methods. .. *Example:* To select a field with a standard name of exactly "air_pressure" and units of exactly hectopascals: ``f.select({'standard_name': 'air_pressure', 'units': 'hPa'}, exact=True)``. *Example:* To select a field with a cell methods of exactly "time: mean (interval 1 hour)": ``f.select({'cell_methods': cf.CellMethods('time: mean (interval 1 hour)')``. Note that `cf.Query` objects provide a mechanism for overriding the *exact* parameter for individual values. *Example:* ``f.select({'standard_name': cf.eq('air', exact=False), 'units': 'hPa'}, exact=True)`` will select a field with a standard name which begins "air" but has units of exactly hectopascals (see `cf.eq`). *Example:* ``f.select({'standard_name': cf.eq('air_pressure'), 'units': 'hPa'})`` will select a field with a standard name of exactly "air_pressure" but with units which equivalent to hectopascals (see `cf.eq`). match_and: `bool`, optional By default *match_and* is True and the field matches if it satisfies the conditions specified by each test parameter (*select*, *items*, *rank* and *ndim*). If *match_and* is False then the field will match if it satisfies at least one test parameter's condition. *Example:* To select a field with a standard name of "air_temperature" **and** 3 data array axes: ``f.select('air_temperature', ndim=3)``. To select a field with a standard name of "air_temperature" **or** 3 data array axes: ``f.select('air_temperature", ndim=3, match_and=False)``. inverse: `bool`, optional If True then return the field matches if it does **not** satisfy the given conditions. *Example:* >>> len(f.select('air', ndim=4, inverse=True)) == len(f) - len(f.select('air', ndim=4)) True :Returns: out: `cf.Field` or `cf.FieldList` [+1] If the field matches the given conditions then it is returned. [+1] Otherwise an empty field list is returned. [+N] If a single field matches the given conditions then it is [+N] returned, otherwise a {+variable} of the matching fields is [+N] returned. :Examples: Field identity starts with "air": >>> f.select('air') Field identity ends contains the string "temperature": >>> f.select('.*temperature') Field identity is exactly "air_temperature": >>> f.select('^air_temperature$') >>> f.select('air_temperature', exact=True) Field has units of temperature: >>> f.select({'units': 'K'}): Field has units of exactly Kelvin: >>> f.select({'units': 'K'}, exact=True) Field identity which starts with "air" and has units of temperature: >>> f.select({None: 'air', 'units': 'K'}) Field identity starts with "air" and/or has units of temperature: >>> f.select(['air', {'units': 'K'}]) Field standard name starts with "air" and/or has units of exactly Kelvin: >>> f.select([{'standard_name': cf.eq('air', exact=False), {'units': 'K'}], ... exact=True) Field has height coordinate values greater than 63km: >>> f.select(items={'height': cf.gt(63, 'km')}) Field has a height coordinate object with some values greater than 63km and a north polar point on its horizontal grid: >>> f.select(items={'height': cf.gt(63, 'km'), ... 'latitude': cf.eq(90, 'degrees')}) Field has some longitude cell sizes of 3.75: >>> f.select(items={'longitude': cf.cellsize(3.75)}) Field latitude cell sizes within a tropical region are all no greater than 1 degree: >>> f.select(items={'latitude': (cf.wi(-30, 30, 'degrees') & ... cf.cellsize(cf.le(1, 'degrees')))}) Field contains monthly mean air pressure data and all vertical levels within the bottom 100 metres of the atmosphere have a thickness of 20 metres or less: >>> f.select({None: '^air_pressure$', 'cell_methods': cf.CellMethods('time: mean')}, ... items={'height': cf.le(100, 'm') & cf.cellsize(cf.le(20, 'm')), ... 'time': cf.cellsize(cf.wi(28, 31, 'days'))}) ''' kwargs2 = self._parameters(locals()) # List functionality if self._list: fl = [f for f in self if f.match(**kwargs2)] if len(fl) == 1: return fl[0] else: return type(self)(fl) if self.match(**kwargs2): return self else: return FieldList() #--- End: def def set_equals(self, other, rtol=None, atol=None, ignore_fill_value=False, traceback=False, ignore=('Conventions',)): ''' ''' return self.equals(other, rtol=rtol, atol=atol, ignore_fill_value=ignore_fill_value, traceback=traceback, ignore=ignore, _set=True) #---End: def def anchor(self, axes, value, i=False, dry_run=False, **kwargs): ''' {+Fef,}Roll a cyclic axis so that the given value lies in the first coordinate cell. {+Fef,}A unique axis is selected with the *axes* and *kwargs* parameters. .. versionadded:: 1.0 [+1].. seealso:: `axis`, `cyclic`, `iscyclic`, `period`, `roll` [+N].. seealso:: `cf.Field.axis`, `cf.Field.cyclic`, `cf.Field.iscyclic`, [+N] `cf.Field.period`, `roll` :Examples 1: Anchor the cyclic X axis to a value of 180: >>> g = f.anchor('X', 180) :Parameters: {+axes, kwargs} value: data-like object Anchor the dimension coordinate values for the selected cyclic axis to the *value*. If *value* has units then they must be compatible with those of the dimension coordinates, otherwise it is assumed to have the same units as the dimension coordinates. The coordinate values are transformed so that *value* is "equal to or just before" the new first coordinate value. More specifically: * Increasing dimension coordinates with positive period, P, are transformed so that *value* lies in the half-open range (L-P, F], where F and L are the transformed first and last coordinate values, respectively. * Decreasing dimension coordinates with positive period, P, are transformed so that *value* lies in the half-open range (L+P, F], where F and L are the transformed first AND last coordinate values, respectively. .. *Example:* If the original dimension coordinates are ``0, 5, ..., 355`` (evenly spaced) and the period is ``360`` then ``value=0`` implies transformed coordinates of ``0, 5, ..., 355``; ``value=-12`` implies transformed coordinates of ``-10, -5, ..., 345``; ``value=380`` implies transformed coordinates of ``380, 385, ..., 715``. *Example:* If the original dimension coordinates are ``355, 350, ..., 0`` (evenly spaced) and the period is ``360`` then ``value=355`` implies transformed coordinates of ``355, 350, ..., 0``; ``value=0`` implies transformed coordinates of ``0, -5, ..., -355``; ``value=392`` implies transformed coordinates of ``390, 385, ..., 30``. {+data-like} {+i} dry_run: `bool`, optional Return a dictionary of parameters which describe the anchoring process. The field is not changed, even if *i* is True. :Returns: [+1] out: `cf.{+Variable}` or `dict` [+N] out: `cf.{+Variable}` :Examples 2: >>> f[+0].iscyclic('X') True >>> f[+0].dim('X').data >>> print f[+0].dim('X').array [ 0 45 90 135 180 225 270 315] >>> g = f.anchor('X', 230) >>> print g[+0].dim('X').array [270 315 0 45 90 135 180 225] >>> g = f.anchor('X', cf.Data(590, 'degreesE')) >>> print g[+0].dim('X').array [630 675 360 405 450 495 540 585] >>> g = f.anchor('X', cf.Data(-490, 'degreesE')) >>> print g[+0].dim('X').array [-450 -405 -720 -675 -630 -585 -540 -495] >>> f[+0].iscyclic('X') True >>> f[+0].dim('X').data >>> f.anchor('X', 10000)[+0].dim('X').data >>> d = f[+0].anchor('X', 10000, dry_run=True) >>> d {'axis': 'dim2', 'nperiod': , 'roll': 28} >>> (f.roll(d['axis'], d['roll'])[+0].dim(d['axis']) + d['nperiod']).data ''' # List functionality if self._list: kwarsg2 = self._parameters(locals()) if kwargs2['dry_run']: raise ValueError( "Can't do a dry run on a {}".format(self.__class__.__name__)) return self._list_method('anchor', kwargs2) axis = self.domain.axis(axes, **kwargs) if axis is None: raise ValueError( "Can't anchor: Bad axis specification") if i or dry_run: f = self else: f = self.copy() domain = f.domain dim = domain.item(axis) if dim is None: raise ValueError( "Can't shift non-cyclic {!r} axis".format(f.axis_name(axis))) period = dim.period() if period is None: raise ValueError( "Cyclic {!r} axis has no period".format(dim.name())) value = Data.asdata(value) if not value.Units: value = value.override_units(dim.Units) elif not value.Units.equivalent(dim.Units): raise ValueError( "Anchor value has incompatible units: {!r}".format(value.Units)) axis_size = domain.axis_size(axis) if axis_size <= 1: # Don't need to roll a size one axis if dry_run: return {'axis': axis, 'roll': 0, 'nperiod': 0} else: return f c = dim.data if dim.increasing: # Adjust value so it's in the range [c[0], c[0]+period) n = ((c[0] - value) / period).ceil(i=True) value1 = value + n * period shift = axis_size - numpy_argmax(c - value1 >= 0) if not dry_run: f.roll(axis, shift, i=True) dim = domain.item(axis) n = ((value - dim.data[0]) / period).ceil(i=True) else: # Adjust value so it's in the range (c[0]-period, c[0]] n = ((c[0] - value) / period).floor(i=True) value1 = value + n * period shift = axis_size - numpy_argmax(value1 - c >= 0) if not dry_run: f.roll(axis, shift, i=True) dim = domain.item(axis) n = ((value - dim.data[0]) / period).floor(i=True) #--- End: if if dry_run: return {'axis': axis, 'roll': shift, 'nperiod': n*period} if n: np = n * period dim += np if dim.hasbounds: bounds = dim.bounds bounds += np #--- End: if return f #--- End: def def autocyclic(self): ''' {+Fef,}Set axes to be cyclic if they meet conditions. An axis is set to be cyclic if and only if the following is true: * It has a unique, 1-d, longitude dimension coordinate object with bounds and the first and last bounds values differ by 360 degrees (or an equivalent amount in other units). .. versionadded:: 1.0 [+1].. seealso:: `cyclic`, `iscyclic`, `period` [+N].. seealso:: `cf.Field.cyclic`, `cf.Field.iscyclic`, `cf.Field.period` :Examples 1: >>> f.autocyclic() :Returns: `None` ''' # List functionality if self._list: for f in self: f.autocyclic() return dims = self.dims('X') if len(dims) != 1: return key, dim = dims.popitem() if not self.Units.islongitude: if dim.getprop('standard_name', None) not in ('longitude', 'grid_longitude'): self.cyclic(key, iscyclic=False) return if not dim.hasbounds: self.cyclic(key, iscyclic=False) return bounds = dim.bounds if not bounds._hasData: self.cyclic(key, iscyclic=False) return period = Data(360, 'degrees') if abs(bounds.datum(-1) - bounds.datum(0)) != period: self.cyclic(key, iscyclic=False) return self.cyclic(key, iscyclic=True, period=period) #--- End: def def sort(self, cmp=None, key=None, reverse=False): '''Sort the field, viewed as a single element field list, in place. Note that ``f.sort(cmp, key, reverse)`` is equivalent to ``f``, thus providing compatiblity with a single element field list. .. versionadded:: 1.0.4 .. seealso:: `reverse`, `cf.FieldList.sort`, :py:obj:`sorted` :Examples 1: >>> f.sort() :Parameters: cmp: `function`, optional Specifies a custom comparison function of two arguments (iterable elements) which should return a negative, zero or positive number depending on whether the first argument is considered smaller than, equal to, or larger than the second argument. The default value is `None`. *Example:* ``cmp=lambda x,y: cmp(x.lower(), y.lower())``. key: `function`, optional Specifies a function of one argument that is used to extract a comparison key from each list element. The default value is `None` (compare the elements directly). *Example:* ``key=str.lower``. reverse: `bool`, optional If set to True, then the list elements are sorted as if each comparison were reversed. :Returns: `None` :Examples 2: >>> id0 = id(f) >>> f.sort() >>> id0 == id(f) True >>> g = cf.FieldList(f) >>> id0 = id(g) >>> g.sort() >>> id0 == id(g) True ''' return #--- End: def def squeeze(self, axes=None, i=False, **kwargs): '''{+Fef,}Remove size 1 axes from the data array. By default all size 1 axes are removed, but particular size 1 axes may be selected for removal. {+Fef,}The axes are selected with the *axes* parameter. Squeezed axes are not removed from the coordinate and cell measure objects, nor are they removed from the domain. To completely remove axes, use the `remove_axes` method. .. seealso:: `expand_dims`, `flip`, `remove_axes`, `transpose`, `unsqueeze` :Examples 1: Remove all size axes from the data array: >>> g = f.squeeze() Remove the size 1 time axis: >>> g = f.squeeze('T') :Parameters: {+axes, kwargs} {+i} :Returns: out: `cf.{+Variable}` {+Fef,}The squeezed field. :Examples 2: ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('squeeze', kwargs2) domain = self.domain data_axes = domain.data_axes() if axes is None and not kwargs: axes_sizes = domain._axes_sizes axes = [axis for axis in data_axes if axes_sizes[axis] == 1] else: axes = domain.axes(axes, **kwargs).intersection(data_axes) iaxes = [data_axes.index(axis) for axis in axes] # Squeeze the field's data array f = super(Field, self).squeeze(iaxes, i=i) f.domain._axes['data'] = [axis for axis in data_axes if axis not in axes] return f #--- End: def def transpose(self, axes=None, i=False, **kwargs): '''{+Fef,}Permute the axes of the data array. By default the order of the axes is reversed, but any ordering may be specified by selecting the axes of the output in the required order. {+Fef,}The axes are selected with the *axes* parameter. .. seealso:: `expand_dims`, `flip`, `squeeze`, `transpose`, `unsqueeze` :Examples 1: Reverse the order of the axes: >>> g = f.transpose() Specify a particular axes order: >>> g = f.transpose(['T', 'X', 'Y']) .. seealso:: `axes`, `expand_dims`, `flip`, `squeeze`, `unsqueeze` :Parameters: {+axes, kwargs} {+i} :Returns: out: `cf.{+Variable}` {+Fef,}, the transposed field. :Examples 2: >>> f.items() {'dim0': , 'dim1': , 'dim2': , 'dim3': } >>> f.data_axes() ['dim0', 'dim1', 'dim2'] >>> f.transpose() >>> f.transpose(['Y', 'T', 'X']) >>> f.transpose(['latitude', 'time', 'longitude']) >>> f.transpose([1, 0, 2]) >>> f.transpose((1, 'time', 'dim2')) ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('transpose', kwargs2) domain = self.domain data_axes = domain.data_axes() if axes is None and not kwargs: axes2 = data_axes[::-1] iaxes = range(self.ndim-1, -1, -1) else: axes2 = domain.axes(axes, ordered=True, **kwargs) if set(axes2) != set(data_axes): raise ValueError("Can't transpose %r: Bad axis specification: %r" % (self.__class__.__name__, axes)) iaxes = [data_axes.index(axis) for axis in axes2] #---- End: if # Transpose the field's data array f = super(Field, self).transpose(iaxes, i=i) # Reorder the list of axes in the domain f.domain._axes['data'] = axes2 return f #--- End: def def unlimited(self, *xxx): '''Todo ... .. versionadded:: 1.3.1 .. seealso:: `cf.write` :Examples 1: Set the time axis to be unlimited when written to a netCDF file: >>> f.unlimited({'T': True}) :Parameters: xxx: `dict` or `None`, optional Specify the chunk sizes for axes of the field. Axes are given by dictionary keys, with a chunk size for those axes as the dictionary values. A dictionary key of ``axes`` defines the axes that would be returned by the field's axes method, i.e. by ``f.axes(axes)``. See `cf.Field.axes` for details. In the special case of *xxx* being `None`, then chunking is set to the netCDF default. *Example:* To set time axes to be unlimited: ``{'T': True}``. Example: To set the chunk size for the first and third data array axes to 100: {0: 100, 2: 100}, or equivalently {(0, 2): 100}. Example: To set the chunk size for the longitude axis to 100 and for the air temperature axis to 5: {'X': 100, 'air_temperature': 5}. Example: To set the chunk size for all axes to 10: {None: 10}. This works because f.axes(None) returns all field axes. Example: To set the chunking to the netCDF default: None. :Returns: out: `dict` :Examples 2: ''' if len(xxx) > 1: raise ValueError("asfdds asdasdas4444444") org = {} for axis in self.axes(): org[axis] = None if self._unlimited: org.update(self._unlimited) if not xxx: return org xxx = xxx[0] if xxx is None: # Clear all settings self._unlimited = None return org _unlimited = {} for axes, value in xxx.iteritems(): for axis in self.axes(axes): _unlimited[axis] = value if not _unlimited: _unlimited = None self_unlimited = self._unlimited if self_unlimited is None: self._unlimited = _unlimited else: self._unlimited = self_unlimited.copy() self._unlimited.update(_unlimited) return org #--- End: def def unsqueeze(self, axes=None, i=False, **kwargs): '''{+Fef,}Insert size 1 axes into the data array. By default all size 1 domain axes which are not spanned by the field's data array are inserted, but existing size 1 axes may be selected for insertion. {+Fef,}The axes are selected with the *axes* parameter. The axes are inserted into the slowest varying data array positions. .. seealso:: `expand_dims`, `flip`, `squeeze`, `transpose` :Examples 1: Insert size all size 1 axes: >>> g = f.unsqueeze() Insert size 1 time axes: >>> g = f.unsqueeze('T', size=1) :Parameters: {+axes, kwargs} {+i} :Returns: out: `cf.{+Variable}` {+Fef,}The unsqueezed field. :Examples 2: >>> print f Data : air_temperature(time, latitude, longitude) Cell methods : time: mean Dimensions : time(1) = [15] days since 1860-1-1 : latitude(73) = [-90, ..., 90] degrees_north : longitude(96) = [0, ..., 356.25] degrees_east : height(1) = [2] m Auxiliary coords: >>> f.unsqueeze() >>> print f Data : air_temperature(height, time, latitude, longitude) Cell methods : time: mean Dimensions : time(1) = [15] days since 1860-1-1 : latitude(73) = [-90, ..., 90] degrees_north : longitude(96) = [0, ..., 356.25] degrees_east : height(1) = [2] m Auxiliary coords: ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('unsqueeze', kwargs2) domain = self.domain data_axes = domain.data_axes() axes = domain.axes(axes, size=1, **kwargs).difference(data_axes) if i: f = self else: f = self.copy() for axis in axes: f.expand_dims(0, axis, i=True) return f #--- End: def def aux(self, items=None, axes=None, axes_all=None, axes_subset=None, axes_superset=None, exact=False, inverse=False, match_and=True, ndim=None, key=False, copy=False): '''{+Fef,}Return an auxiliary coordinate object, or its domain identifier. In this documentation, an auxiliary coordinate object is referred to as an item. {+item_selection} {+item_criteria} If no unique item can be found then `None` is returned. To find multiple items, use the `{+name}s` method. Note that ``f.aux(inverse=False, **kwargs)`` is equivalent to ``f.item(role='a', inverse=False, **kwargs)``. .. seealso:: `auxs`, `measure`, `coord`, `ref`, `dim`, `item`, `remove_item` :Examples 1: A latitude item could potentially be selected with any of: >>> a = f.{+name}('Y') >>> a = f.{+name}('latitude') >>> a = f.{+name}('long_name:latitude') >>> a = f.{+name}('aux1') >>> a = f.{+name}(axes_all='Y') :Parameters: {+items} {+ndim} {+axes} {+axes_all} {+axes_subset} {+axes_superset} {+match_and} {+exact} {+inverse} {+key} {+copy} :Returns: [+1] out: `cf.AuxiliaryCoordinate` or `str` or `None` [+N] out: `list` {+Fef,}The unique auxiliary coordinate object or its domain identifier or, if there is not one, `None`. :Examples 2: ''' kwargs2 = self._parameters(locals()) return self.domain.item(role='a', _restrict_inverse=True, **kwargs2) #--- End: def def measure(self, items=None, axes=None, axes_all=None, axes_subset=None, axes_superset=None, exact=False, inverse=False, match_and=True, ndim=None, key=False, copy=False): '''{+Fef,}Return a cell measure object, or its domain identifier. In this documentation, a cell measure object is referred to as an item. {+item_selection} If no unique item can be found then `None` is returned. To find multiple items, use the `{+name}s` method. Note that ``f.measure(inverse=False, **kwargs)`` is equivalent to ``f.item(role='m', inverse=False, **kwargs)``. .. seealso:: `aux`, `measures`, `coord`, `ref`, `dims`, `item`, `remove_item` :Parameters: {+items} {+axes} {+axes_all} {+axes_subset} {+axes_superset} {+ndim} {+match_and} {+exact} {+inverse} {+key} {+copy} :Returns: out: `cf.CellMeasure` or `str` or `None` The unique cell measure object or its domain identifier or, if there is not one, `None`. :Examples 2: >>> f.measure('area') ''' kwargs2 = self._parameters(locals()) return self.domain.item(role='m', _restrict_inverse=True, **kwargs2) #--- End: def def coord(self, items=None, axes=None, axes_all=None, axes_subset=None, axes_superset=None, ndim=None, match_and=True, exact=False, inverse=False, key=False, copy=False): ''' {+Fef,}Return a dimension or auxiliary coordinate object, or its domain identifier. In this documentation, a dimension or auxiliary coordinate object is referred to as an item. {+item_selection} If no unique item can be found then `None` is returned. To find multiple items, use the `{+name}s` method. Note that ``f.coord(inverse=False, **kwargs)`` is equivalent to ``f.item(role='da', inverse=False, **kwargs)``. .. seealso:: `aux`, `coords`, `dim`, `item`, `measure`, `ref`, `remove_item`, :Examples 1: :Parameters: {+items} {+axes} {+axes_all} {+axes_subset} {+axes_superset} {+ndim} {+match_and} {+exact} {+inverse} {+key} {+copy} :Returns: out: `cf.DimensionCoordinate` or `cf.AuxiliaryCoordinate` or `str` or `None` The unique dimension or auxiliary coordinate object or its domain identifier or, if there is not one, `None`. :Examples 2: ''' kwargs2 = self._parameters(locals()) return self.domain.item(role=('d', 'a'), _restrict_inverse=True, **kwargs2) #--- End: def def dim(self, items=None, axes=None, axes_all=None, axes_subset=None, axes_superset=None, ndim=None, match_and=True, exact=False, inverse=False, key=False, copy=False): ''' Return a dimension coordinate object, or its domain identifier. In this documentation, a dimension coordinate object is referred to as an item. {+item_selection} If no unique item can be found then `None` is returned. To find multiple items, use the `{+name}s` method. Note that ``f.{+name}(inverse=False, **kwargs)`` is equivalent to ``f.item(role='d', inverse=False, **kwargs)``. .. seealso:: `aux`, `measure`, `coord`, `ref`, `dims`, `item`, `remove_item` :Examples 1: A latitude item could potentially be selected with any of: >>> d = f.{+name}('Y') >>> d = f.{+name}('latitude') >>> d = f.{+name}('long_name:latitude') >>> d = f.{+name}('dim1') >>> d = f.{+name}(axes_all='Y') :Parameters: {+items} {+ndim} {+axes} {+axes_all} {+axes_subset} {+axes_superset} {+match_and} {+exact} {+inverse} {+key} {+copy} :Returns: [+1] out: [+N] out: list {+Fef,}The unique dimension coordinate object or its domain identifier or, if there is not one, `None`. :Examples 2: ''' kwargs2 = self._parameters(locals()) return self.domain.item(role='d', _restrict_inverse=True, **kwargs2) #--- End: def # def transform(self, *args, **kwargs): # raise NotImplementedError("Deprecated. Use cf.Field.ref instead.") def ref(self,items=None, exact=False, inverse=False, match_and=True, key=False, copy=False): '''{+Fef,}Return a coordinate reference object, or its domain identifier. In this documentation, a coordinate reference object is referred to as an item. {+item_selection} If no unique item can be found then `None` is returned. To find multiple items, use the `{+name}s` method. Note that ``f.ref(inverse=False, **kwargs)`` is equivalent to ``f.item(role='r', inverse=False, **kwargs)``. .. seealso:: `aux`, `measure`, `coord`, `ref`, `dims`, `item`, `remove_item` :Examples 1: A latitude item could potentially be selected with any of: >>> c = f.ref('rotated_latitude_longitude') >>> c = f.ref('ref1') :Parameters: {+items} {+ndim} {+axes} {+axes_all} {+axes_subset} {+axes_superset} {+match_and} {+exact} {+inverse} {+key} {+copy} :Returns: [+1] out: [+N] out: list {+Fef,}The unique dimension coordinate object or its domain identifier or, if there is not one, `None`. :Examples 2: ''' kwargs2 = self._parameters(locals()) return self.domain.item(role='r', _restrict_inverse=True, **kwargs2) #--- End: def def auxs(self, items=None, axes=None, axes_all=None, axes_subset=None, axes_superset=None, ndim=None, match_and=True, exact=False, inverse=False, copy=False): '''Return auxiliary coordinate objects. In this documentation, an auxiliary coordinate object is referred to as an item. {+item_selection} {+item_criteria} Note that ``f.{+name}(inverse=False, **kwargs)`` is equivalent to ``f.items(role='a', inverse=False, **kwargs)``. .. seealso:: `aux`, `axes`, `measures` , `refs`, `coords`, `dims`, `items`, `remove_items` :Examples 1: To select all auxiliary coordinate objects: >>> d = f.auxs() :Parameters: {+items} *Example:* >>> x = f.items(['aux1', ... 'time', ... {'units': 'degreeN', 'long_name': 'foo'}]) >>> y = {} >>> for items in ['aux1', 'time', {'units': 'degreeN', 'long_name': 'foo'}]: ... y.update(f.items(items)) ... >>> set(x) == set(y) True {+axes} {+axes_all} {+axes_subset} {+axes_superset} {+ndim} {+match_and} {+exact} {+inverse} {+copy} :Returns: out: `dict` A dictionary whose keys are domain item identifiers with corresponding values of auxiliary coordinates of the domain. The dictionary will be empty if no items were selected. :Examples: ''' kwargs2 = self._parameters(locals()) return self.domain.items(role='a', _restrict_inverse=True, **kwargs2) #--- End: def def measures(self, items=None, axes=None, axes_all=None, axes_subset=None, axes_superset=None, ndim=None, match_and=True, exact=False, inverse=False, copy=False): '''Return cell measure objects. In this documentation, a cell measure object is referred to as an item. {+item_selection} {+item_criteria} Note that ``f.{+name}(inverse=False, **kwargs)`` is equivalent to ``f.items(role='m', inverse=False, **kwargs)``. .. seealso:: `auxs`, `coords`, `dims`, `items`, `measure`, `refs`, `remove_items` :Examples 1: To select all cell measure objects: >>> d = f.measures() :Parameters: {+items} {+axes} {+axes_all} {+axes_subset} {+axes_superset} {+ndim} {+match_and} {+exact} {+inverse} {+copy} :Returns: out: `dict` A dictionary whose keys are domain item identifiers with corresponding values of cell measure objects of the domain. The dictionary will be empty if no items were selected. :Examples 2: ''' kwargs2 = self._parameters(locals()) return self.domain.items(role='m', _restrict_inverse=True, **kwargs2) #--- End: def def coords(self, items=None, axes=None, axes_all=None, axes_subset=None, axes_superset=None, ndim=None, match_and=True, exact=False, inverse=False, copy=False): '''Return dimension and auxiliary coordinate objects of the domain. .. seealso:: `auxs`, `axes`, `measures`, `coord`, `refs`, `dims`, `items`, `remove_items` :Parameters: {+items} {+axes} {+axes_all} {+axes_subset} {+axes_superset} {+ndim} {+match_and} {+exact} {+inverse} {+copy} :Returns: out: `dict` A dictionary whose keys are domain item identifiers with corresponding values of coordinates of the domain. The dictionary may be empty. :Examples: ''' kwargs2 = self._parameters(locals()) return self.domain.items(role=('d', 'a'), _restrict_inverse=True, **kwargs2) #--- End: def def dims(self, items=None, axes=None, axes_all=None, axes_subset=None, axes_superset=None, ndim=None, match_and=True, exact=False, inverse=False, copy=False): '''Return dimension coordinate objects. In this documentation, a dimension coordinate object is referred to as an item. {+item_selection} {+item_criteria} Note that ``f.{+name}(inverse=False, **kwargs)`` is equivalent to ``f.items(role='d', inverse=False, **kwargs)``. .. seealso:: `auxs`, `axes`, `measures`, `refs`, `coords`, `dim`, `items`, `remove_items` :Examples 1: To select all dimension coordinate objects: >>> d = f.dims() :Parameters: {+items} {+axes} {+axes_all} {+axes_subset} {+axes_superset} {+ndim} {+match_and} {+exact} {+inverse} {+copy} :Returns: out: `dict` A dictionary whose keys are domain item identifiers with corresponding values of items of the domain. The dictionary may be empty. :Examples: ''' kwargs2 = self._parameters(locals()) return self.domain.items(role='d', _restrict_inverse=True, **kwargs2) #--- End: def # def transforms(self, items=None, key=False, **kwargs): # ''' #Deprecated. Use `cf.Field.refs` instead. #''' # raise NotImplementedError("Deprecated. Use cf.Field.refs instead.") # #--- End: def def refs(self, items=None, exact=False, inverse=False, match_and=True, copy=False): '''Return coordinate reference objects. In this documentation, a coordinate reference object is referred to as an item. {+item_selection} Note that ``f.{+name}(inverse=False, **kwargs)`` is equivalent to ``f.items(role='r', inverse=False, **kwargs)``. .. seealso:: `auxs`, `coords`, `dims`, `items`, `measures`, `ref`, `remove_items` :Examples 1: To select all coordinate reference objects: >>> d = f.refs() :Parameters: {+items} *Example:* >>> x = f.items(['ref1', 'latitude_longitude']) >>> y = {} >>> for items in ['ref1', 'latitude_longitude']: ... y.update(f.items(items)) ... >>> set(x) == set(y) True {+match_and} {+exact} {+inverse} {+copy} :Returns: out: `dict` A dictionary whose keys are domain item identifiers with corresponding values of coordinate references of the domain. The dictionary may be empty. :Examples: ''' kwargs2 = self._parameters(locals()) return self.domain.items(role='r', _restrict_inverse=True, **kwargs2) #--- End: def def item(self, items=None, role=None, axes=None, axes_all=None, axes_subset=None, axes_superset=None, exact=False, inverse=False, match_and=True, ndim=None, key=False, copy=False): '''Return an item, or its domain identifier, from the field. An item is either a dimension coordinate, an auxiliary coordinate, a cell measure or a coordinate reference object. {+item_selection} If no unique item can be found then `None` is returned. To find multiple items, use the `~cf.Field.{+name}s` method. .. seealso:: `aux`, `measure`, `coord`, `ref`, `dim`, `item_axes`, `items`, `remove_item` :Examples 1: >>> :Parameters: {+items} {+role} {+axes} {+axes_all} {+axes_subset} {+axes_superset} {+ndim} {+match_and} {+exact} {+inverse} {+key} {+copy} :Returns: out: The unique item or its domain identifier or, if there is no unique item, `None`. :Examples: ''' kwargs2 = self._parameters(locals()) return self.domain.item(**kwargs2) #--- End: def def axis_name(self, axes=None, **kwargs): '''Return the canonical name for an axis. {+axis_selection} .. seealso:: `axis`, `axis_size`, `item` :Parameters: {+axes, kwargs} :Returns: out: `str` The canonical name for the axis. :Examples: >>> f.axis_name('dim0') 'time' >>> f.axis_name('X') 'domain%dim1' >>> f.axis_name('long_name%latitude') 'ncdim%lat' ''' kwargs2 = self._parameters(locals()) return self.domain.axis_name(**kwargs2) #-- End: def def axis_size(self, axes=None, **kwargs): '''Return the size of a domain axis. {+axis_selection} .. seealso:: `axis`, `axis_name`, `axes_sizes`, `axis_identity` :Parameters: {+axes, kwargs} :Returns: out: `int` The size of the axis. :Examples: >>> f >>> f.axis_size('longitude') 106 >>> f.axis_size('Z') 5 ''' kwargs2 = self._parameters(locals()) return self.domain.axis_size(**kwargs2) #--- End: def def axes_sizes(self, axes=None, size=None, key=False, **kwargs): '''Return the sizes of domain axes. {+axis_selection} :Examples 1: >>> x = f.axes_sizes() :Parameters: {+axes, kwargs} *Example:* >>> x = f.axes(['dim2', 'time', {'units': 'degree_north'}]) >>> y = set() >>> for axes in ['dim2', 'time', {'units': 'degree_north'}]: ... y.update(f.axes(axes)) ... >>> x == y True {+size} key: `bool`, optional If True then identify each axis by its domain identifier rather than its name. :Returns: out: `dict` The sizes of the each selected domain axis. :Examples 2: >>> f >>> f.axes_sizes() {'air_pressure': 5, 'latitude': 110, 'longitude': 106, 'time': 3} >>> f.axes_sizes(size=3) {'time': 3} >>> f.axes_sizes(size=cf.lt(10), key=True) {'dim0': 3, 'dim1': 5} >>> f.axes_sizes('latitude') {'latitude': 110} ''' kwargs2 = self._parameters(locals()) return self.domain.axes_sizes(**kwargs2) #---End: def def axes(self, axes=None, size=None, ordered=False, **kwargs): '''Return domain axis identifiers from the field. The output is a set of domain axis identifiers, which may be empty. {+axis_selection} .. seealso:: `axis`, `data_axes`, `item_axes`, `items`, `remove_axes` :Parameters: {+axes, kwargs} *Example:* >>> x = f.axes(['dim2', 'time', {'units': 'degree_north'}]) >>> y = set() >>> for axes in ['dim2', 'time', {'units': 'degree_north'}]: ... y.update(f.axes(axes)) ... >>> x == y True {+size} ordered: `bool`, optional Return an ordered list of axes instead of an unordered set. The order of the list will reflect any ordering specified by the *axes* and *kwargs* parameters. *Example:* If the data array axes, as returned by the field's `data_axes` method, are ``['dim0', 'dim1', 'dim2']``, then ``f.axes([2, 0, 1, 2])`` will return ``set(['dim0', 'dim1', 'dim2'])``, but ``f.axes([2, 0, 1, 2], ordered=True)`` will return ``['dim2', 'dim0', 'dim1', 'dim2']``. :Returns: out: `set` or `list` A set of domain axis identifiers, or a list if *ordered* is True. The set or list may be empty. :Examples: All axes and their identities: >>> f.axes() set(['dim0', 'dim1', 'dim2', 'dim3']) >>> dict([(axis, f.domain.axis_name(axis)) for axis in f.axes()]) {'dim0': time(12) 'dim1': height(19) 'dim2': latitude(73) 'dim3': longitude(96)} Axes which are not spanned by the data array: >>> f.axes().difference(f.data_axes()) ''' kwargs2 = self._parameters(locals()) return self.domain.axes(**kwargs2) #--- End: def def axis(self, axes=None, size=None, **kwargs): '''Return a domain axis identifier from the field. {+axis_selection} .. seealso:: `axes`, `data_axes`, `item_axes`, `item`, `remove_axis` :Examples 1: >>> a = f.axis('time') :Parameters: {+axes, kwargs} {+size} :Returns: out: `str` or `None` The domain identifier of the unique axis or, if there isn't one, `None`. :Examples 2: >>> f >>> f.data_axes() ['dim0', 'dim1', 'dim2'] >>> f.axis('time') 'dim0' >>> f.axis('Y') 'dim1' >>> f.axis(size=64) 'dim1' >>> f.axis('X', size=128) 'dim2' >>> print f.axis('foo') None >>> print f.axis('T', size=64) None ''' kwargs2 = self._parameters(locals()) return self.domain.axis(**kwargs2) #--- End: def def insert_axis(self, size, key=None, replace=True): '''Insert an axis into the domain in place. .. seealso:: `insert_aux`, `insert_measure`, `insert_ref`, `insert_data`, `insert_dim` :Parameters: size: `int` The size of the new axis. key: `str`, optional The domain identifier for the new axis. By default a new, unique identifier is generated. replace: `bool`, optional If False then do not replace an existing axis with the same identifier but a different size. By default an existing axis with the same identifier is changed to have the new size. :Returns: out: The domain identifier of the new axis. :Examples: >>> f.insert_axis(1) >>> f.insert_axis(90, key='dim4') >>> f.insert_axis(23, key='dim0', replace=False) ''' kwargs2 = self._parameters(locals()) return self.domain.insert_axis(**kwargs2) #--- End: def def insert_aux(self, item, key=None, axes=None, copy=True, replace=True): '''Insert an auxiliary coordinate object into the domain in place. .. seealso:: `insert_axis`, `insert_measure`, `insert_data`, `insert_dim`, `insert_ref` :Parameters: item: `cf.AuxiliaryCoordinate` or `cf.Coordinate` or `cf.DimensionCoordinate` The new auxiliary coordinate object. If it is not already a auxiliary coordinate object then it will be converted to one. key: `str`, optional The domain identifier for the *item*. By default a new, unique identifier will be generated. axes: sequence of `str`, optional The ordered list of axes for the *item*. Each axis is given by its domain identifier. By default the axes are assumed to be ``'dim0'`` up to ``'dimM-1'``, where ``M-1`` is the number of axes spanned by the *item*. copy: `bool`, optional If False then the *item* is not copied before insertion. By default it is copied. replace: `bool`, optional If False then do not replace an existing auxiliary coordinate object of domain which has the same identifier. By default an existing auxiliary coordinate object with the same identifier is replaced with *item*. :Returns: out: `str` The domain identifier for the inserted *item*. :Examples: >>> ''' kwargs2 = self._parameters(locals()) return self.domain.insert_aux(**kwargs2) #--- End: def def insert_measure(self, item, key=None, axes=None, copy=True, replace=True): ''' Insert an cell measure object into the domain in place. .. seealso:: `insert_axis`, `insert_aux`, `insert_data`, `insert_dim`, `insert_ref` :Parameters: item: `cf.CellMeasure` The new cell measure object. key: `str`, optional The domain identifier for the *item*. By default a new, unique identifier will be generated. axes: sequence of `str`, optional The ordered list of axes for the *item*. Each axis is given by its domain identifier. By default the axes are assumed to be ``'dim0'`` up to ``'dimM-1'``, where ``M-1`` is the number of axes spanned by the *item*. copy: `bool`, optional If False then the *item* is not copied before insertion. By default it is copied. replace: `bool`, optional If False then do not replace an existing cell measure object of domain which has the same identifier. By default an existing cell measure object with the same identifier is replaced with *item*. :Returns: out: The domain identifier for the *item*. :Examples: >>> ''' kwargs2 = self._parameters(locals()) return self.domain.insert_measure(**kwargs2) #--- End: def def insert_dim(self, item, key=None, axis=None, copy=True, replace=True): '''Insert a dimension coordinate object into the domain in place. .. seealso:: `insert_aux`, `insert_axis`, `insert_measure`, `insert_data`, `insert_ref` :Parameters: item: `cf.DimensionCoordinate` or `cf.Coordinate` or `cf.AuxiliaryCoordinate` The new dimension coordinate object. If it is not already a dimension coordinate object then it will be converted to one. axis: `str`, optional The axis for the *item*. The axis is given by its domain identifier. By default the axis will be the same as the given by the *key* parameter. key: `str`, optional The domain identifier for the *item*. By default a new, unique identifier will be generated. copy: `bool`, optional If False then the *item* is not copied before insertion. By default it is copied. replace: `bool`, optional If False then do not replace an existing dimension coordinate object of domain which has the same identifier. By default an existing dimension coordinate object with the same identifier is replaced with *item*. :Returns: out: `str` The domain identifier for the inserted *item*. :Examples: >>> ''' kwargs2 = self._parameters(locals()) key = self.domain.insert_dim(**kwargs2) self.autocyclic() return key #--- End: def def insert_ref(self, item, key=None, copy=True, replace=True): '''Insert a coordinate reference object into the domain in place. .. seealso:: `insert_axis`, `insert_aux`, `insert_measure`, `insert_data`, `insert_dim` :Parameters: item: `cf.CoordinateReference` The new coordinate reference object. key: `str`, optional The domain identifier for the *item*. By default a new, unique identifier will be generated. copy: `bool`, optional If False then the *item* is not copied before insertion. By default it is copied. replace: `bool`, optional If False then do not replace an existing coordinate reference object of domain which has the same identifier. By default an existing coordinate reference object with the same identifier is replaced with *item*. :Returns: out: The domain identifier for the *item*. :Examples: >>> ''' kwargs2 = self._parameters(locals()) return self.domain.insert_ref(**kwargs2) #--- End: def def item_axes(self, items=None, role=None, axes=None, axes_all=None, axes_subset=None, axes_superset=None, exact=False, inverse=False, match_and=True, ndim=None): '''Return the axes of a domain item of the field. An item is a dimension coordinate, an auxiliary coordinate, a cell measure or a coordinate reference object. .. seealso:: `axes`, `data_axes`, `item`, `items_axes` :Parameters: {+items} {+role} {+axes} {+axes_all} {+axes_subset} {+axes_superset} {+ndim} {+match_and} {+exact} {+inverse} :Returns: out: `list` or `None` The ordered list of axes for the item or, if there is no unique item or the item is a coordinate reference then `None` is returned. :Examples: ''' kwargs2 = self._parameters(locals()) return self.domain.item_axes(**kwargs2) #--- End: def def items_axes(self, items=None, role=None, axes=None, axes_all=None, axes_subset=None, axes_superset=None, exact=False, inverse=False, match_and=True, ndim=None): '''Return the axes of domain items of the field. An item is a dimension coordinate, an auxiliary coordinate, a cell measure or a coordinate reference object. .. seealso:: `axes`, `data_axes`, `item_axes`, `items` :Parameters: {+items} {+role} {+axes} {+axes_all} {+axes_subset} {+axes_superset} {+ndim} {+match_and} {+exact} {+inverse} :Returns: out: `dict` A dictionary whose keys are domain item identifiers with corresponding values of the ordered list of axes for each selected. The dictionary may be empty. :Examples: >>> f.domain.items_axes() {'aux0': ['dim2', 'dim3'], 'aux1': ['dim2', 'dim3'], 'dim0': ['dim0'], 'dim1': ['dim1'], 'dim2': ['dim2'], 'dim3': ['dim3']} >>> f.domain.items_axes(role='d') {'dim0': ['dim0'], 'dim1': ['dim1'], 'dim2': ['dim2'], 'dim3': ['dim3']} ''' kwargs2 = self._parameters(locals()) return self.domain.items_axes(**kwargs2) #--- End: def def items(self, items=None, role=None, axes=None, axes_all=None, axes_subset=None, axes_superset=None, ndim=None, match_and=True, exact=False, inverse=False, copy=False): '''Return domain items from the field. An item is a dimension coordinate, an auxiliary coordinate, a cell measure or a coordinate reference object. The output is a dictionary whose key/value pairs are domain identifiers with corresponding values of items of the domain. {+item_selection} {+items_criteria} .. seealso:: `auxs`, `axes`, `measures`, `coords`, `dims`, `item`, `match` `remove_items`, `refs` :Examples 1: Select all items whose identities (as returned by their `!identity` methods) start "height": >>> f.items('height') Select all items which span only one axis: >>> f.items(ndim=1) Select all cell measure objects: >>> f.items(role='m') Select all items which span the "time" axis: >>> f.items(axes='time') Select all CF latitude coordinate objects: >>> f.items('Y') Select all multidimensional dimension and auxiliary coordinate objects which span at least the "time" and/or "height" axes and whose long names contain the string "qwerty": >>> f.items('long_name:.*qwerty', ... role='da', ... axes=['time', 'height'], ... ndim=cf.ge(2)) :Parameters: {+items} *Example:* >>> x = f.items(['aux1', ... 'time', ... {'units': 'degreeN', 'long_name': 'foo'}]) >>> y = {} >>> for items in ['aux1', 'time', {'units': 'degreeN', 'long_name': 'foo'}]: ... y.update(f.items(items)) ... >>> set(x) == set(y) True {+role} {+axes} {+axes_all} {+axes_subset} {+axes_superset} {+ndim} {+match_and} {+exact} {+inverse} *Example:* ``f.items(role='da', inverse=True)`` selects the same items as ``f.items(role='mr')``. {+copy} :Returns: out: `dict` A dictionary whose keys are domain item identifiers with corresponding values of items of the domain. The dictionary may be empty. :Examples: ''' kwargs2 = self._parameters(locals()) return self.domain.items(**kwargs2) #--- End: def def period(self, axes=None, **kwargs): '''Return the period of an axis. Note that a non-cyclic axis may have a defined period. .. versionadded:: 1.0 .. seealso:: `axis`, `cyclic`, `iscyclic`, `cf.DimensionCoordinate.period` :Parameters: {+axes, kwargs} :Returns: out: `cf.Data` or `None` The period of the cyclic axis's dimension coordinates, or `None` no period has been set. :Examples 2: >>> f.cyclic() {} >>> print f.period('X') None >>> f.dim('X').Units >>> f.cyclic('X', period=360) {} >>> print f.period('X') >>> f.cyclic('X', False) {'dim3'} >>> print f.period('X') >>> f.dim('X').period(None) >>> print f.period('X') None ''' axis = self.domain.axis(axes=axes, **kwargs) if axis is None: raise ValueError("Can't identify axis") dim = self.dim(axis) if dim is None: return return dim.period() #--- End: def def remove_item(self, items=None, role=None, axes=None, axes_all=None, axes_subset=None, axes_superset=None, ndim=None, match_and=True, exact=False, inverse=False, key=False, copy=False): '''Remove and return a domain item from the field. An item is either a dimension coordinate, an auxiliary coordinate, a cell measure or a coordinate reference object of the domain. The item may be selected with the keyword arguments. If no unique item can be found then no items are removed and `None` is returned. .. seealso:: `item`, `remove_axes`, `remove_axis`, `remove_items` :Parameters: {+items} {+role} {+axes} {+axes_all} {+axes_subset} {+axes_superset} {+ndim} {+match_and} {+exact} {+inverse} {+key} {+copy} :Returns: out: The unique item or its domain identifier or, if there is no unique item, `None`. :Examples: ''' kwargs2 = self._parameters(locals()) return self.domain.remove_item(**kwargs2) #--- End: def def remove_axes(self, axes=None, size=None, **kwargs): ''' Remove and return axes from the field. By default all axes of the domain are removed, but particular axes may be selected with the keyword arguments. The axis may be selected with the keyword arguments. If no unique axis can be found then no axis is removed and `None` is returned. If an axis has size greater than 1 then it is not possible to remove it if it is spanned by the field's data array or any multidimensional coordinate or cell measure object of the field. .. seealso:: `axes`, `remove_axis`, `remove_item`, `remove_items` :Parameters: {+axes, kwargs} {+size} :Returns: out: set The removed axes. The set may be empty. :Examples: ''' domain = self.domain axes = domain.axes(axes, size=size, **kwargs) if not axes: return set() size1_data_axes = [] axes_sizes = domain._axes_sizes for axis in axes.intersection(domain.data_axes()): if axes_sizes[axis] == 1: size1_data_axes.append(axis) else: raise ValueError( "Can't remove an axis with size > 1 which is spanned by the data array") #---End: for if size1_data_axes: self.squeeze(size1_data_axes, i=True) axes = domain.remove_axes(axes, i=True) # Remove axes from unlimited dictionary unlimited = self._unlimited if unlimited: for axis in axes: unlimited.pop(axis, None) if not unlimited: self._unlimited = None return axes #--- End: def def remove_axis(self, axes=None, size=None, **kwargs): ''' Remove and return a unique axis from the field. The axis may be selected with the keyword arguments. If no unique axis can be found then no axis is removed and `None` is returned. If the axis has size greater than 1 then it is not possible to remove it if it is spanned by the field's data array or any multidimensional coordinate or cell measure object of the field. .. seealso:: `axis`, `remove_axes`, `remove_item`, `remove_items` :Parameters: {+axes, kwargs} {+size} :Returns: out: str The domain identifier of the removed axis, or `None` if there isn't one. :Examples: ''' axis = self.domain.axis(axis, size=size, **kwargs) if axis is None: return return self.remove_axes(axis).pop() #--- End: def def remove_items(self, items=None, role=None, axes=None, axes_all=None, axes_subset=None, axes_superset=None, ndim=None, exact=False, inverse=False, match_and=True): ''' Remove and return domain items from the domain. An item is either a dimension coordinate, an auxiliary coordinate, a cell measure or a coordinate reference object of the domain. By default all items of the domain are removed, but particular items may be selected with the keyword arguments. .. seealso:: `items`, `remove_axes`, `remove_axis`, `remove_item` :Parameters: {+items} {+role} {+axes} {+axes_all} {+axes_subset} {+axes_superset} {+ndim} {+match_and} {+exact} {+inverse} :Returns: out: `dict` A dictionary whose keys are domain item identifiers with corresponding values of the removed items of the domain. The dictionary may be empty. :Examples: ''' kwargs2 = self._parameters(locals()) return self.domain.remove_items(**kwargs2) #--- End: def def reverse(self): '''L.reverse() -- reverse *IN PLACE* Note that ``f.reverse()`` is equivalent to ``f``, thus providing compatiblity with a single element field list. .. versionadded:: 1.0.4 .. seealso:: `cf.FieldList.reverse`, :py:obj:`reversed`, `sort` :Examples 1: >>> f.reverse() :Returns: `None` :Examples 2: >>> id0 = id(f) >>> f.reverse() >>> id0 == id(f) True >>> g = cf.FieldList(f) >>> id0 = id(g) >>> g.reverse() >>> id0 == id(g) True ''' return #--- End: def def roll(self, axes, shift, i=False, **kwargs): '''{+Fef,}Roll the field along a cyclic axis. {+Fef,}A unique axis is selected with the axes and kwargs parameters. .. versionadded:: 1.0 [+1].. seealso:: `anchor`, `axis`, `cyclic`, `iscyclic`, `period` [+N].. seealso:: `anchor`, `cf.Field.axis`, `cf.Field.cyclic`, [+N] `cf.Field.iscyclic`, `cf.Field.period` :Parameters: {+axes, kwargs} shift: `int` The number of places by which the selected cyclic axis is to be rolled. {+i} :Returns: out: `cf.{+Variable}` The rolled field. :Examples: ''' if self._list: kwargs2 = self._parameters(locals()) return self._list_method('roll', kwargs2) axis = self.domain.axis(axes, **kwargs) if axis is None: raise ValueError("Can't roll: Bad axis specification") if i: f = self else: f = self.copy() domain = f.domain if domain.axis_size(axis) <= 1: return f dim = domain.item(axis) if dim is not None and dim.period() is None: raise ValueError( "Can't roll %r axis with non-periodic dimension coordinates" % dim.name()) try: iaxis = domain.data_axes().index(axis) except ValueError: return f f = super(Field, f).roll(iaxis, shift, i=True) item_axes = domain.item_axes for key, item in domain.items(role=('d', 'a', 'm')).iteritems(): axes = item_axes(key) if axis in axes: item.roll(axes.index(axis), shift, i=True) #--- End: for return f #--- End: def def where(self, condition, x=None, y=None, i=False): '''{+Fef,}Set data array elements depending on a condition. Elements are set differently depending on where the condition is True or False. Two assignment values are given. From one of them, the field's data array is set where the condition is True and where the condition is False, the data array is set from the other. Each assignment value may either contain a single datum, or is an array-like object which is broadcastable shape of the field's data array. **Missing data** The treatment of missing data elements depends on the value of field's `hardmask` attribute. If it is True then masked elements will not unmasked, otherwise masked elements may be set to any value. In either case, unmasked elements may be set to any value (including missing data). Unmasked elements may be set to missing data by assignment to the `cf.masked` constant or by assignment to a value which contains masked elements. [+1].. seealso:: `cf.masked`, `hardmask`, `indices`, `mask`, `subspace` [+N].. seealso:: `cf.masked`, `cf.Field.hardmask`, `cf.Field.indices`, [+N] `mask`, ``subspace` :Examples 1: >>> :Parameters: condition: The condition which determines how to set the data array. The *condition* parameter may be one of: * Any object which is broadcastable to the field's shape using the metadata-aware `cf` broadcasting rules (i.e. a suitable `cf.Field` object or any object, ``a``, for which ``numpy.size(a)`` is 1). The condition is True where the object broadcast to the field's data array evaluates to True. *Example:* To set all data array values of 10 to -999: ``f.where(10, -999)``. *Example:* To set all data array values of 100 metres to -999 metres: ``f.where(cf.Data(100, 'm'), -999)``. *Example:* To set all data array values to -999 where another field, ``g`` (which is broadcastable to ``f``), evaluates to true: ``f.where(g, -999)``. .. * A `cf.Query` object which is evaluated against the field and the resulting field of booleans (which will always have the same shape as the original field) defines the condition. *Example:* ``f.where(cf.lt(0), -999)`` will set all data array values less than zero to -999. This will often be equivalent to ``f.where(f==cf.lt(0), -999)``, but the latter will fail if the field ``f`` has insufficient domain metadata whilst the former will always work. x, y: optional Specify the assignment values. Where the condition evaluates to True, set the field's data array from *x* and where the condition evaluates to False, set the field's data array from *y*. The *x* and *y* parameters are each one of: * `None`. The appropriate elements of the field's data array are unchanged. This the default. .. * Any object which is broadcastable to the field's data array using the metadata-aware `cf` broadcasting rules (i.e. a suitable `cf.Field` object or any object, ``a``, for which ``numpy.size(a)`` is 1). The appropriate elements of the field's data array are set to the corresponding values from the object broadcast to the field's data array shape. {+i} :Returns: out: `cf.{+Variable}` {+Fef,}The field with updated data array. :Examples 2: Set data array values to 15 everywhere: >>> f.where(True, 15) This example could also be done with subspace assignment: >>> f.subspace[...] = 15 Set all negative data array values to zero and leave all other elements unchanged: >>> g = f.where(f<0, 0) Multiply all positive data array elements by -1 and set other data array elements to 3.14: >>> g = f.where(f>0, -f, 3.14) Set all values less than 280 and greater than 290 to missing data: >>> g = f.where((f < 280) | (f > 290), cf.masked) This example could also be done with a `cf.Query` object: >>> g = f.where(cf.wo(280, 290), cf.masked) or equivalently: >>> g = f.where(f==cf.wo(280, 290), cf.masked) Set data array elements in the northern hemisphere to missing data in-place: [+1] [+1]>>> # Create a condition which is True only in the northern hemisphere [+1]>>> condition = f.domain_mask(latitude=cf.ge(0)) [+1]>>> # Set the data [+1]>>> f.where(condition, cf.masked, i=True) [+N] [+N]>>> for g, northern_hemisphere in zip(f, f.domain_mask(latitude=cf.ge(0))): [+N]... g.where(condition, cf.masked, i=True) This in-place example could also be done with subspace assignment by indices: [+1] [+1]>>> northern_hemisphere = f.indices(latitude=cf.ge(0)) [+1]>>> f.subspace[northern_hemisphere] = cf.masked [+N] [+N]>>> for g in f: [+N]... northern_hemisphere = g.indices(latitude=cf.ge(0)) [+N]... g.subspace[northern_hemisphere] = cf.masked Set a polar rows to their zonal-mean values: [+1] [+1]>>> # Create a condition which is True only on polar rows [+1]>>> condition = f.domain_mask(latitude=cf.set([-90, 90])) [+1]>>> #Set each data polar row element to the polar row zonal mean [+1]>>> # and mask all other points [+1]>>> g = f.where(condition, f.collapse('longitude: mean')) [+N] [+N]>>> # Initialize the new field list [+N]>>> g = cf.FieldList() [+N]>>> for x in f: [+N]... # Create a condition which is True only on the polar rows [+N]... condition = x.domain_mask(latitude=cf.set([-90, 90])) [+N]... # Set each data polar row element to the polar row zonal mean [+N]... # and mask all other points [+N]... g.append(x.where(condition, x.collapse('longitude: mean'))) ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('where', kwargs2) if i: f = self else: f = self.copy() if x is None and y is None: return f self_class = f.__class__ if isinstance(condition, self_class): if len(condition) != 1: raise ValueError( "Can't where: FieldList 'condition' must contain exactly 1 element") condition = f._conform_for_assignment(condition[0]) elif isinstance(condition, Query): condition = condition.evaluate(f).Data if x is not None and isinstance(x, self_class): if len(x) != 1: raise ValueError( "Can't where: FieldList 'x' must contain exactly 1 element") x = f._conform_for_assignment(x[0]) if y is not None and isinstance(y, self_class): if len(y) != 1: raise ValueError( "Can't where: FieldList 'y' must contain exactly 1 element") y = f._conform_for_assignment(y[0]) return super(Field, f).where(condition, x, y, i=True) #--- End: def def section(self, axes=None, stop=None, chunks=False, min_step=1, **kwargs): ''' {+Fef,}Return a FieldList of m dimensional sections of a Field of n dimensions, where m <= n. :Parameters: axes: optional A query for the m axes that define the sections of the Field as accepted by the Field object's axes method. The keyword arguments are also passed to this method. See cf.Field.axes for details. If an axis is returned that is not a data axis it is ignored, since it is assumed to be a dimension coordinate of size 1. stop: `int`, optional Stop after taking this number of sections and return. If stop is None all sections are taken. chunks: `bool`, optional If True return sections that are of the maximum possible size that will fit in one chunk of memory instead of sectioning into slices of size 1 along the dimensions that are being sectioned. min_step: `int`, optional The minimum step size when making chunks. By default this is 1. Can be set higher to avoid size 1 dimensions, which are problematic for bilinear regridding. :Returns: out: `cf.FieldList` The FieldList of m dimensional sections of the Field. :Examples: Section a field into 2D longitude/time slices, checking the units: >>> f.section({None: 'longitude', units: 'radians'}, ... {None: 'time', ... 'units': 'days since 2006-01-01 00:00:00'}) Section a field into 2D longitude/latitude slices, requiring exact names: >>> f.section(['latitude', 'longitude'], exact=True) Section a field into 2D longitude/latitude slices, showing the results: >>> f >>> f.section(('X', 'Y')) [, , , , , ] ''' return FieldList(_section(self, axes, data=False, stop=stop, chunks=chunks, min_step=min_step, **kwargs)) #--- End: def def regrids(self, dst, src_cyclic=None, dst_cyclic=None, method='auto', use_dst_mask=False, _compute_field_mass=None, i=False): ''' {+Fef,}Returns the field regridded onto a new latitude-longitude grid. Regridding, also called remapping or interpolation, is the process of changing the grid underneath field data values while preserving the qualities of the original data. By default the the regridding is a first-order conservative interpolation, but bilinear interpolation is available. The latter method is particular useful for cases when the latitude and longitude coordinate cell boundaries are not known nor inferrable. Nearest neighbour interpolation is also available. **Metadata** The field's domain must have well defined X and Y axes with latitude and longitude coordinate values, which may be stored as dimension coordinate objects or two dimensional auxiliary coordinate objects. The same is true for the destination grid, if it provided as part of another field. The cyclicity of the X axes of the source field and destination grid is taken into account. If an X axis is in fact cyclic but is registered as such by its parent field (see `cf.Field.iscyclic`), then the cyclicity may be set with the *src_cyclic* or *dst_cyclic* parameters. The output field's coordinate objects which span the X and/or Y axes are replaced with those from the destination grid. Any fields contained in coordinate reference objects will also be regridded, if possible. **Mask** The data array mask of the field is automatically taken into account, such that the regridded data array will be masked in regions where the input data array is masked. By default the mask of the destination grid is not taken into account. If the destination field data has more than two dimensions then the mask, if used, is taken from the two dimensionsal section of the data where the indices of all axes other than X and Y are zero. **Method** The interpolation is carried by out using the `ESMF` package - a Python interface to the Earth System Modeling Framework (ESMF) regridding utility. **Logging** Whether ESMF logging is enabled or not is determined by `cf.REGRID_LOGGING`. If it is logging takes place after every call. By default logging is disabled. .. versionadded:: 1.0.4 :Examples 1: Regrid field ``f`` conservatively onto a grid contained in field ``g``: >>> h = f.regrids(g) :Parameters: dst: `cf.Field` or `dict` The field containing the new grid. If dst is a field list the first field in the list is used. Alternatively a dictionary can be passed containing the keywords 'longitude' and 'latitude' with either two 1D dimension coordinates or two 2D auxiliary coordinates. In the 2D case both coordinates must have their axes in the same order and this must be specified by the keyword 'axes' as either ``('X', 'Y')`` or ``('Y', 'X')``. src_cyclic: `bool`, optional Force the use of a periodic X axis for the source field, without altering the original field. dst_cyclic: `bool`, optional Force the use of a periodic X axis for the destination grid, without altering the original field. method: `str`ing, optional By default the regridding method is set to 'auto'. In this case conservative regridding will be used unless one or both of the fields does not have contiguous bounds, in which case bilinear regridding will be used. If a 1D dimension coordinate does not have bounds then contiguous bounds will be created automatically. If this parameter is set to conservative then first-order conservative regridding is used. If it is set to 'bilinear' then multilinear interpolation is used. If it is set to 'nearest_stod' then nearest neighbor interpolation is used where each destination point is mapped to the closest source point. A given source point may map to multiple destination points, but no destination point will receive input from more than one source point. If it is set to 'nearest_dtos' then nearest neighbor interpolation is used where each source point is mapped to the closest destination point. A given destination point may receive input from multiple source points, but no source point will map to more than one destination point. use_dst_mask: `bool`, optional By default the mask of the data on the destination grid is not taken into account when performing regridding. If this option is set to true then it is. If the destination field has more than two dimensions then the first 2D slice in index space is used for the mask e.g. for an field varying with (X, Y, Z, T) the mask is taken from the slice (X, Y, 0, 0). {+i} _compute_field_mass: `dict`, optional If this is a dictionary then the field masses of the source and destination fields are computed and returned within the dictionary. The keys of the dictionary indicates the lat/long slice of the field and the corresponding value is a tuple containing the source field's mass and the destination field's mass. The calculation is only done if conservative regridding is being performed. This is for debugging purposes. :Returns: out: `cf.{+Variable}` The regridded {+variable}. :Examples 2: Regrid f to the grid of g using bilinear regridding and forcing the source field f to be treated as cyclic. >>> h = f.regrids(g, src_cyclic=True, method='bilinear') Regrid f to the grid of g using the mask of g. >>> h = f.regrids(g, use_dst_mask=True) Regrid f to 2D auxiliary coordinates lat and lon, which have their dimensions ordered 'Y' first then 'X'. >>> lat >>> lon >>> h = f.regrids({'longitude': lon, 'latitude': lat, 'axes': ('Y', 'X')}) ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('regrids', kwargs2) # Initialise ESMPy for regridding if found manager = Regrid.initialize() # If dst is a dictionary set flag if isinstance(dst, self.__class__): dst_dict = False # If dst is a field list use the first field dst = dst[0] else: dst_dict = True # Retrieve the source field's latitude and longitude coordinates x_s, y_s, x_axis_s, y_axis_s, x_key_s, y_key_s, x_size_s, y_size_s, \ src_2D_latlong = Regrid.get_latlong(self, 'source') # Retrieve the source field's z and t indices zt_indices = [] z_key = self.dim('Z', key=True) if z_key is not None: try: z_index = self.data_axes().index(z_key) except ValueError: self = self.unsqueeze(z_key, i=i) z_index = self.data_axes().index(z_key) zt_indices.append(z_index) t_key = self.dim('T', key=True) if t_key is not None: try: t_index = self.data_axes().index(t_key) except ValueError: self = self.unsqueeze(t_key, i=i) t_index = self.data_axes().index(t_key) zt_indices.append(t_index) # Retrieve the destination field's latitude and longitude coordinates if dst_dict: try: x_d = dst['longitude'] y_d = dst['latitude'] except KeyError: raise ValueError("Keywords 'longitude' and 'latitude' " + "must be specified for destination.") #--- End: if if x_d.ndim == 1: dst_2D_latlong = False x_size_d = x_d.size y_size_d = y_d.size elif x_d.ndim == 2: try: dst_axes = dst['axes'] except KeyError: raise ValueError("Keyword 'axes' must be specified " + "for 2D latitude/longitude coordinates.") dst_2D_latlong = True if dst_axes == ('X', 'Y'): x_size_d = x_d.shape[0] y_size_d = x_d.shape[1] elif dst_axes == ('Y', 'X'): x_size_d = x_d.shape[1] y_size_d = x_d.shape[0] else: raise ValueError("Keyword 'axes' must either be " + "('X', 'Y') or ('Y', 'X').") if x_d.shape != y_d.shape: raise ValueError('Longitude and latitude coordinates for ' + 'destination must have the same shape.') else: raise ValueError('Longitude and latitude coordinates for ' + 'destination must have 1 or 2 dimensions.') #--- End: if else: x_d, y_d, x_axis_d, y_axis_d, x_key_d, y_key_d, x_size_d, y_size_d, \ dst_2D_latlong = Regrid.get_latlong(dst, 'destination') #--- End: if # Set src_cyclic and/or dst_cyclic to true if it has been automatically # detected that the fields are cyclic. if self.iscyclic('X'): src_cyclic = True if not dst_dict and dst.iscyclic('X'): dst_cyclic = True # Preserve order of axes try: x_index_s= self.data_axes().index(x_axis_s) except ValueError: self = self.unsqueeze(x_axis_s, i=i) x_index_s = self.data_axes().index(x_axis_s) try: y_index_s = self.data_axes().index(y_axis_s) except ValueError: self = self.unsqueeze(y_axis_s, i=i) y_index_s = self.data_axes().index(y_axis_s) if not dst_dict: try: x_index_d = dst.data_axes().index(x_axis_d) except ValueError: dst = dst.unsqueeze(x_axis_d) x_index_d = dst.data_axes().index(x_axis_d) try: y_index_d = dst.data_axes().index(y_axis_d) except ValueError: dst = dst.unsqueeze(y_axis_d) y_index_d = dst.data_axes.index(y_axis_d) #--- End: if shape = [1]*self.ndim shape[x_index_s] = x_size_d shape[y_index_s] = y_size_d order_s = (0, 1) if x_index_s < y_index_s else (1, 0) if not dst_dict: order_d = (0, 1) if x_index_d < y_index_d else (1, 0) #--- End: if if src_2D_latlong: x_axes_s = self.item_axes(x_key_s) x_order_s = (x_axes_s.index(x_axis_s), x_axes_s.index(y_axis_s)) y_axes_s = self.item_axes(y_key_s) y_order_s = (y_axes_s.index(x_axis_s), y_axes_s.index(y_axis_s)) if dst_2D_latlong: if dst_dict: if dst_axes == ('X', 'Y'): x_order_d = (0, 1) y_order_d = (0, 1) elif dst_axes == ('Y', 'X'): x_order_d = (1, 0) y_order_d = (1, 0) else: raise ValueError("Keyword 'axes' must either be " + "('X', 'Y') or ('Y', 'X').") else: x_axes_d = dst.item_axes(x_key_d) x_order_d = (x_axes_d.index(x_axis_d), x_axes_d.index(y_axis_d)) y_axes_d = dst.item_axes(y_key_d) y_order_d = (y_axes_d.index(x_axis_d), y_axes_d.index(y_axis_d)) #--- End: if # Slice the source data into 2D latitude/longitude sections sections = self.Data.section((x_index_s, y_index_s)) # Check whether the coordinates all have appropriate bounds if method == 'auto': method = 'conservative' for coord in [x_s, y_s]: if src_2D_latlong: if not coord.hasbounds or not coord.contiguous(overlap=False): method = 'bilinear' break #--- End: if else: if coord.hasbounds and not coord.contiguous(overlap=False): method = 'bilinear' break #--- End: if #--- End: if #--- End: for for coord in [x_d, y_d]: if dst_2D_latlong: if not coord.hasbounds or not coord.contiguous(overlap=False): method = 'bilinear' break #--- End: if else: if coord.hasbounds and not coord.contiguous(overlap=False): method = 'bilinear' break #--- End: if #--- End: if #--- End: for elif method == 'conservative': for coord in [x_s, y_s]: if src_2D_latlong: if not coord.hasbounds or not coord.contiguous(overlap=False): raise ValueError('2D source latitude and longitude' + ' coordinates must have contiguous' + ' bounds for conservative regridding.') #--- End: if else: if coord.hasbounds and not coord.contiguous(overlap=False): raise ValueError('Existing bounds of 1D source' + ' latitude and longitude coordinates' + ' must be contiguous for conservative' + ' regridding.') #--- End: if #--- End: if #--- End: for for coord in [x_d, y_d]: if dst_2D_latlong: if not coord.hasbounds or not coord.contiguous(overlap=False): raise ValueError('2D destination latitude and longitude' + ' coordinates must have contiguous' + ' bounds for conservative regridding.') #--- End: if else: if coord.hasbounds and not coord.contiguous(overlap=False): raise ValueError('Existing bounds of 1D destination' + ' latitude and longitude coordinates' + ' must be contiguous for conservative' + ' regridding.') #--- End: if #--- End: if #--- End: for #--- End: if # Retrieve the destination field's grid and create the ESMPy grid use_bounds = method == 'conservative' dst_mask = None if not dst_dict and use_dst_mask and dst.Data.ismasked: dst_mask = dst.section(('X', 'Y'), stop=1, ndim=1)[0].squeeze().array.mask dst_mask = dst_mask.transpose(order_d) #--- End: if if dst_2D_latlong: dstgrid = Regrid.create_2Dgrid(x_d, y_d, x_order_d, y_order_d, dst_cyclic, dst_mask, use_bounds) else: dstgrid = Regrid.create_grid(x_d, y_d, dst_cyclic, dst_mask, use_bounds) #--- End: if dstfield = Regrid.create_field(dstgrid, 'dstfield') dstfracfield = Regrid.create_field(dstgrid, 'dstfracfield') def initialise_regridder(src_mask=None): ''' Initialise the source grid and the regridder. ''' # Create the source grid if src_2D_latlong: srcgrid = Regrid.create_2Dgrid(x_s, y_s, x_order_s, y_order_s, src_cyclic, src_mask, use_bounds) else: srcgrid = Regrid.create_grid(x_s, y_s, src_cyclic, src_mask, use_bounds) #--- End: if srcfield = Regrid.create_field(srcgrid, 'srcfield') srcfracfield = Regrid.create_field(srcgrid, 'srcfracfield') # Initialise the regridder regridSrc2Dst = Regrid(srcfield, dstfield, srcfracfield, dstfracfield, method=method) return srcgrid, srcfield, srcfracfield, regridSrc2Dst # Reorder keys by Z and then T to minimise how often the mask is # likely to change. if zt_indices: section_keys = sorted(sections.keys(), key=operator_itemgetter(*zt_indices)) else: section_keys = sections.keys() # Regrid each section old_mask = None unmasked_grid_created = False for k in section_keys: d = sections[k] # Retrieve the source field's grid, create the ESMPy grid and a # handle to regridding.dst_dict src_data = d.squeeze().transpose(order_s).array if numpy_is_masked(src_data): mask = src_data.mask if not numpy_array_equal(mask, old_mask): # Release old memory if old_mask is not None: regridSrc2Dst.destroy() srcfracfield.destroy() srcfield.destroy() srcgrid.destroy() #--- End: if # (Re)initialise the regridder srcgrid, srcfield, srcfracfield, regridSrc2Dst = \ initialise_regridder(mask) old_mask = mask #--- End: if else: if not unmasked_grid_created or old_mask is not None: # Initialise the regridder srcgrid, srcfield, srcfracfield, regridSrc2Dst = \ initialise_regridder() unmasked_grid_created = True old_mask = None #--- End: if #--- End: if # Fill the source and destination fields and regrid srcfield.data[...] = numpy_MaskedArray(src_data, copy=False).filled(self.fill_value(default='netCDF')) dstfield.data[...] = self.fill_value(default='netCDF') dstfield = regridSrc2Dst.run_regridding(srcfield, dstfield) # Check field mass if _compute_field_mass is not None and method == 'conservative': if not type(_compute_field_mass) == dict: raise ValueError('Expected compute_field_mass to be a dictoinary.') srcareafield = Regrid.create_field(srcgrid, 'srcareafield') srcmass = Regrid.compute_mass_grid(srcfield, srcareafield, dofrac=True, fracfield=srcfracfield, uninitval=self.fill_value(default='netCDF')) dstareafield = Regrid.create_field(dstgrid, 'dstareafield') dstmass = Regrid.compute_mass_grid(dstfield, dstareafield, uninitval=self.fill_value(default='netCDF')) _compute_field_mass[k] = (srcmass, dstmass) # Correct destination field data if doing conservative regridding # and add mask if method == 'conservative': frac = dstfracfield.data[...] frac[frac == 0.0] = 1.0 regridded_data = numpy_MaskedArray(dstfield.data[...].copy()/frac, mask=(dstfield.data == self.fill_value(default='netCDF'))) else: regridded_data = numpy_MaskedArray(dstfield.data[...].copy(), mask=(dstfield.data == self.fill_value(default='netCDF'))) # Insert regridded data, with axes in correct order sections[k] = Data(regridded_data.transpose(order_s).reshape(shape), units=self.Units) #--- End: for # Construct new data from regridded sdst_dictections new_data = Regrid.reconstruct_sectioned_data(sections) # Construct new field if i: f = self else: f = self.copy(_omit_Data=True) #--- End:if # Update ancillary variables and coordinate references of source f._conform_ancillary_variables([x_axis_s, y_axis_s], keep_size_1=False) for key, ref in f.refs().iteritems(): axes = f.domain.ref_axes(key) if x_axis_s in axes or y_axis_s in axes: f.remove_item(key) else: for term, value in ref.iteritems(): if not isinstance(value, type(self)): continue axes2 = value.axes(('X', 'Y')) if len(axes2) == 1: ref[term] = None elif len(axes2) == 2: # only want to do this if value spans both X and Y try: value2 = value.regrids(dst, src_cyclic=src_cyclic, dst_cyclic=dst_cyclic, method=method, use_dst_mask=use_dst_mask, i=i) except ValueError: ref[term] = None else: ref[term] = value2 #--- End: if #--- End: for #--- End: if #--- End: for # Remove X and Y coordinates of new field f.remove_items(axes=('X', 'Y')) # Give destination grid latitude and longitude standard names x_d.standard_name = 'longitude' y_d.standard_name = 'latitude' # Insert 'X' and 'Y' coordinates from dst into new field f.domain._axes_sizes[x_axis_s] = x_size_d f.domain._axes_sizes[y_axis_s] = y_size_d if dst_dict: if dst_2D_latlong: if x_order_d == (0, 1): x_axes_s = (x_axis_s, y_axis_s) else: x_axes_s = (y_axis_s, x_axis_s) if y_order_d == (0, 1): y_axes_s = (x_axis_s, y_axis_s) else: y_axes_s = (y_axis_s, x_axis_s) f.insert_aux(x_d, axes=x_axes_s) f.insert_aux(y_d, axes=y_axes_s) else: f.insert_dim(x_d, key=x_axis_s) f.insert_dim(y_d, key=y_axis_s) else: x_dim = dst.dim('X') f.insert_dim(x_dim, key=x_axis_s) y_dim = dst.dim('Y') f.insert_dim(y_dim, key=y_axis_s) for aux_key, aux in dst.auxs(axes_all=('X', 'Y')).iteritems(): aux_axes = dst.domain.item_axes(aux_key) if aux_axes == [x_axis_d, y_axis_d]: f.insert_aux(aux, axes=(x_axis_s, y_axis_s)) else: f.insert_aux(aux, axes=(y_axis_s, x_axis_s)) #--- End: for for aux in dst.auxs(axes_all='X').values(): f.insert_aux(aux, axes=x_axis_s) #--- End: for for aux in dst.auxs(axes_all='Y').values(): f.insert_aux(aux, axes=y_axis_s) #--- End: for #--- End: if # Copy across the destination fields coordinate references if necessary if not dst_dict: for key, ref in dst.refs().iteritems(): axes = dst.domain.ref_axes(key) if axes and axes.issubset([x_axis_d, y_axis_d]): f.insert_ref(ref.copy(domain=dst.domain)) #--- End: if #--- End: for #--- End: if # Insert regridded data into new field f.insert_data(new_data) # Set the cyclicity of the destination longitude x = f.dim('X') if x is not None and x.Units.equivalent(Units('degrees')): f.cyclic('X', iscyclic=dst_cyclic, period=Data(360, 'Degrees')) # Release old memory regridSrc2Dst.destroy() dstfracfield.destroy() srcfracfield.destroy() dstfield.destroy() srcfield.destroy() dstgrid.destroy() srcgrid.destroy() return f #--- End: def def regridc(self, dst, axes, method='auto', use_dst_mask=False, _compute_field_mass=None, i=False): ''' {+Fef,}Returns the field with the specified Cartesian axes regridded onto a new grid. Between 1 and 3 dimensions may be regridded. Regridding, also called remapping or interpolation, is the process of changing the grid underneath field data values while preserving the qualities of the original data. By default the the regridding is a first-order conservative interpolation, but bilinear and nearest neighbour interpolation is available. **Metadata** The field's domain must have axes matching those specified in src_axes. The same is true for the destination grid, if it provided as part of another field. Optionally the axes to use from the destination grid may be specified separately in dst_axes. The output field's coordinate objects which span the specified axes are replaced with those from the destination grid. Any fields contained in coordinate reference objects will also be regridded, if possible. **Mask** The data array mask of the field is automatically taken into account, such that the regridded data array will be masked in regions where the input data array is masked. By default the mask of the destination grid is not taken into account. If the destination field data has more dimensions than the number of axes specified then, if used, its mask is taken from the 1-3 dimensional section of the data where the indices of all axes other than X and Y are zero. **Method** The interpolation is carried by out using the `ESMF` package - a Python interface to the Earth System Modeling Framework (ESMF) regridding utility. **Logging** Whether ESMF logging is enabled or not is determined by `cf.REGRID_LOGGING`. If it is logging takes place after every call. By default logging is disabled. :Examples 1: Regrid the time axes of field ``f`` conservatively onto a grid contained in field ``g``: >>> h = f.regridc(g, axes='T') :Parameters: dst: `cf.Field` or `dict` The field containing the new grid or a dictionary with the axes specifiers as keys referencing dimension coordinates. If dst is a field list the first field in the list is used. axes: Select dimension coordinates from the source and destination fields for regridding. See cf.Field.axes for options for selecting specific axes. However, the number of axes returned by cf.Field.axes must be the same as the number of specifiers passed in. method: `str`, optional By default the regridding method is set to 'auto'. In this case conservative regridding will be used unless one or both of the fields does not have contiguous bounds, in which case bilinear regridding will be used. If a 1D dimension coordinate does not have bounds then contiguous bounds will be created automatically. If this parameter is set to conservative then first-order conservative regridding is used. If it is set to 'bilinear' then multilinear interpolation is used. If it is set to 'nearest_stod' then nearest neighbor interpolation is used where each destination point is mapped to the closest source point. A given source point may map to multiple destination points, but no destination point will receive input from more than one source point. If it is set to 'nearest_dtos' then nearest neighbor interpolation is used where each source point is mapped to the closest destination point. A given destination point may receive input from multiple source points, but no source point will map to more than one destination point. use_dst_mask: `bool`, optional By default the mask of the data on the destination grid is not taken into account when performing regridding. If this option is set to true then it is. {+i} _compute_field_mass: `dict`, optional If this is a dictionary then the field masses of the source and destination fields are computed and returned within the dictionary. The keys of the dictionary indicates the lat/long slice of the field and the corresponding value is a tuple containing the source field's mass and the destination field's mass. The calculation is only done if conservative regridding is being performed. This is for debugging purposes. :Returns: out: `cf.{+Variable}` The regridded {+variable}. :Examples 2: Regrid the T axis of field ``f`` conservatively onto the grid specified in the dimension coordinate ``t``: >>> h = f.regridc({'T': t}, axes=('T')) Regrid the T axis of field ``f`` using bilinear interpolation onto a grid contained in field ``g``: >>> h = f.regridc(g, axes=('T'), method='bilinear') Regrid the X and Y axes of field ``f`` conservatively onto a grid contained in field ``g``: >>> h = f.regridc(g, axes=('X','Y')) Regrid the X and T axes of field ``f`` conservatively onto a grid contained in field ``g`` using the destination mask: >>> h = f.regridc(g, axes=('X','Y'), use_dst_mask=True) ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('regrids', kwargs2) # Initialise ESMPy for regridding if found manager = Regrid.initialize() # If dst is a dictionary set flag if isinstance(dst, self.__class__): dst_dict = False # If dst is a field list use the first field dst = dst[0] else: dst_dict = True # Get the number of axes n_axes = len(axes) if n_axes < 1 or n_axes > 3: raise ValueError('Between 1 and 3 axes must be individually ' + 'specified.') # Retrieve the source axis keys and dimension coordinates axis_keys_s, coords_s = Regrid.get_cartesian_coords(self, 'source', axes) # Retrieve the destination axis keys and dimension coordinates if dst_dict: coords_d = [] for axis in axes: try: coords_d.append(dst[axis]) except KeyError: raise ValueError('Axis ' + str(axis) + ' not specified in dst.') #--- End: try #--- End: for else: axis_keys_d, coords_d = Regrid.get_cartesian_coords(dst, 'destination', axes) #--- End: if def get_axis_positions(f, axis_keys): """ Get the axis positions and their orders in rank of a field f. """ # Get the positions of the axes axis_positions = [] for k in axis_keys: axis_positions.append(f.data_axes().index(k)) # Get the rank order of the positions of the axes temp = numpy_array(axis_positions) temp = temp.argsort() order = numpy_empty(len(temp), int) order[temp] = numpy_arange(len(temp)) return axis_positions, order # Get the axis positions for the source field axis_positions_s, order_s = get_axis_positions(self, axis_keys_s) # Get the axis positions for the destination field if not dst_dict: axis_positions_d, order_d = get_axis_positions(dst, axis_keys_d) # Pad out a single dimension with an extra one axis_keys_ext = [] coords_ext = [] axis_positions_s_ext = axis_positions_s order_s_ext = order_s if n_axes == 1 and self.squeeze().ndim > 1: src_shape = numpy_array(self.shape) tmp = src_shape.copy() tmp[axis_positions_s] = -1 max_length = -1 max_ind = -1 for ind, length in enumerate(tmp): if length > max_length: max_length = length max_ind = ind if src_shape[axis_positions_s].prod()*max_length*8 < CHUNKSIZE(): axis_keys_ext, coords_ext = \ Regrid.get_cartesian_coords(self, 'source', [max_ind]) axis_positions_s_ext, order_s_ext = \ get_axis_positions(self, axis_keys_ext + axis_keys_s) # Check whether the coordinates all have appropriate bounds if method == 'auto': method = 'conservative' for coord in coords_s + coords_d + coords_ext: if coord.hasbounds and not coord.contiguous(overlap=False): method = 'bilinear' break #--- End: if #--- End: for elif method == 'conservative': for coord in coords_s + coords_d + coords_ext: if coord.hasbounds and not coord.contiguous(overlap=False): raise ValueError('All existing bounds of dimension' + ' coordinates must be contiguous for' + ' conservative regridding.') #--- End: if #--- End: for #--- End: if # Calculate shape of each section shape = [1]*self.ndim tmp = coords_ext + coords_d for ind, p in enumerate(axis_positions_s_ext): shape[p] = tmp[ind].size # Deal with case of 1D linear regridding linear = False if method == 'bilinear' and n_axes == 1 and coords_ext == []: linear = True coords_ext = [DimensionCoordinate(data=Data([-1e-6,1e-6]))] # Section the data into slices of up to three dimensions sections = self.Data.section(axis_positions_s_ext) # Retrieve the destination field's grid and create the ESMPy grid dst_mask = None if not dst_dict and use_dst_mask and dst.Data.ismasked: dst_mask = dst.section(axes, stop=1, ndim=1)[0].squeeze().array.mask dst_mask = dst_mask.transpose(order_d) tmp = [] for coord in coords_ext: tmp.append(coord.size) dst_mask = numpy_tile(dst_mask, tmp + [1]*dst_mask.ndim) #--- End: if if method == 'conservative': dstgrid = Regrid.create_cartesian_grid(coords_ext + coords_d, dst_mask, use_bounds=True) else: dstgrid = Regrid.create_cartesian_grid(coords_ext + coords_d, dst_mask, use_bounds=False) dstfield = Regrid.create_field(dstgrid, 'dstfield') dstfracfield = Regrid.create_field(dstgrid, 'dstfracfield') def initialise_regridder(src_mask=None): ''' Initialise the source grid and the regridder. ''' # Initialise the source grid if method == 'conservative': srcgrid = Regrid.create_cartesian_grid(coords_ext + coords_s, src_mask, use_bounds=True) else: srcgrid = Regrid.create_cartesian_grid(coords_ext + coords_s, src_mask, use_bounds=False) srcfield = Regrid.create_field(srcgrid, 'srcfield') srcfracfield = Regrid.create_field(srcgrid, 'srcfracfield') # Initialise the regridder regridSrc2Dst = Regrid(srcfield, dstfield, srcfracfield, dstfracfield, method=method) return srcgrid, srcfield, srcfracfield, regridSrc2Dst # Regrid each segment. old_mask = None unmasked_grid_created = False for k in sections.keys(): d = sections[k] subsections = d.Data.section(axis_positions_s, chunks=True, min_step=2) for k2 in subsections.keys(): d2 = subsections[k2] # Retrieve the source field's grid, create the ESMPy grid and a # handle to regridding. src_data = d2.squeeze().transpose(order_s_ext).array if linear: src_data = numpy_tile(src_data, (2,1)) if numpy_is_masked(src_data): mask = src_data.mask if not numpy_array_equal(mask, old_mask): # Release old memory if old_mask is not None: regridSrc2Dst.destroy() srcfracfield.destroy() srcfield.destroy() srcgrid.destroy() #--- End: if # (Re)initialise the regridder srcgrid, srcfield, srcfracfield, regridSrc2Dst = \ initialise_regridder(mask) old_mask = mask #--- End: if else: if not unmasked_grid_created or old_mask is not None: # Initialise the regridder srcgrid, srcfield, srcfracfield, regridSrc2Dst = \ initialise_regridder() unmasked_grid_created = True old_mask = None #--- End: if #--- End: if # Fill the source and destination fields and regrid srcfield.data[...] = numpy_MaskedArray(src_data, copy=False).filled(self.fill_value(default='netCDF')) dstfield.data[...] = self.fill_value(default='netCDF') dstfield = regridSrc2Dst.run_regridding(srcfield, dstfield) # Check field mass if _compute_field_mass is not None and method == 'conservative': if not type(_compute_field_mass) == dict: raise ValueError('Expected compute_field_mass to be a dictoinary.') srcareafield = Regrid.create_field(srcgrid, 'srcareafield') srcmass = Regrid.compute_mass_grid(srcfield, srcareafield, dofrac=True, fracfield=srcfracfield, uninitval=self.fill_value(default='netCDF')) dstareafield = Regrid.create_field(dstgrid, 'dstareafield') dstmass = Regrid.compute_mass_grid(dstfield, dstareafield, uninitval=self.fill_value(default='netCDF')) _compute_field_mass[k] = (srcmass, dstmass) # Correct destination field data if doing conservative regridding # and add mask if method == 'conservative': frac = dstfracfield.data[...] frac[frac == 0.0] = 1.0 regridded_data = numpy_MaskedArray(dstfield.data[...].copy()/frac, mask=(dstfield.data == self.fill_value(default='netCDF'))) else: regridded_data = numpy_MaskedArray(dstfield.data[...].copy(), mask=(dstfield.data == self.fill_value(default='netCDF'))) if linear: regridded_data = regridded_data[0] # Insert regridded data, with axes in correct order subsections[k2] = Data(regridded_data.squeeze().transpose(order_s_ext).reshape(shape), units=self.Units) #--- End: for sections[k] = Regrid.reconstruct_sectioned_data(subsections) #--- End: for # Construct new data from regridded sections new_data = Regrid.reconstruct_sectioned_data(sections) # Construct new field if i: f = self else: f = self.copy(_omit_Data=True) #--- End:if # Update ancillary variables and coordinate references of source f._conform_ancillary_variables(axis_keys_s, keep_size_1=False) for key, ref in f.refs().iteritems(): tmp = f.domain.ref_axes(key) if tmp.intersection(axis_keys_s): f.remove_item(key) else: for term, value in ref.iteritems(): if not isinstance(value, type(self)): continue tmp2 = value.axes(axes) if tmp2 and len(tmp2) < n_axes: ref[term] = None elif len(tmp2) == n_axes: # FOR NOW only want to do this if value spans all axes # IN FUTURE: any subset try: value2 = value.regridc(dst, axes=axes, method=method, use_dst_mask=use_dst_mask, i=i) except ValueError: ref[term] = None else: ref[term] = value2 #--- End: if #--- End: for #--- End: if #--- End: for # Remove src coordinates of new field f.remove_items(axes=axes) # Make axes map if not dst_dict: axis_map = {} for k_s, k_d in zip(axis_keys_s, axis_keys_d): axis_map[k_d] = k_s #--- End: for #--- End: if # Insert coordinates from dst into new field if dst_dict: for k_s, d in zip(axis_keys_s, coords_d): f.domain._axes_sizes[k_s] = d.size f.insert_dim(d, key=k_s) #--- End: for else: for k_d in axis_keys_d: d = dst.dim(k_d) k_s = axis_map[k_d] f.domain._axes_sizes[k_s] = d.size f.insert_dim(d, key=k_s) #--- End: for for aux_key, aux in dst.auxs(axes_superset=axes).iteritems(): tmp = [axis_map[k_d] for k_d in dst.domain.item_axes(aux_key)] f.insert_aux(aux, axes=tmp) #--- End: for #--- End: if # Copy across the destination fields coordinate references if necessary if not dst_dict: for key, ref in dst.refs().iteritems(): tmp = dst.domain.ref_axes(key) if tmp and tmp.issubset(axis_keys_d): f.insert_ref(ref.copy(domain=dst.domain)) #--- End: if #--- End: for #--- End: if # Insert regridded data into new field f.insert_data(new_data) # Release old memory regridSrc2Dst.destroy() dstfracfield.destroy() srcfracfield.destroy() dstfield.destroy() srcfield.destroy() dstgrid.destroy() srcgrid.destroy() return f #--- End: def #--- End: class # ==================================================================== # # SubspaceField object # # ==================================================================== class SubspaceField(SubspaceVariable): ''' An object which will get or set a subspace of a field. The returned object is a `!SubspaceField` object which may be indexed to select a subspace by axis index values (``f.subspace[indices]``) or called to select a subspace by coordinate object array values (``f.subspace(**coordinate_values)``). **Subspacing by indexing** Subspacing by indices allows a subspaced field to be defined via index values for the axes of the field's data array. Indices have an extended Python slicing syntax, which is similar to :ref:`numpy array indexing `, but with two important extensions: * Size 1 axes are never removed. An integer index i takes the i-th element but does not reduce the rank of the output array by one: * When advanced indexing is used on more than one axis, the advanced indices work independently. When more than one axis's slice is a 1-d boolean sequence or 1-d sequence of integers, then these indices work independently along each axis (similar to the way vector subscripts work in Fortran), rather than by their elements: **Subspacing by coordinate values** Subspacing by values of one dimensional coordinate objects allows a subspaced field to be defined via coordinate values of its domain. Coordinate objects and their values are provided as keyword arguments to a call to a `SubspaceField` object. Coordinate objects may be identified by their identities, as returned by their `!identity` methods. See `cf.Field.indices` for details, since ``f.subspace(**coordinate_values)`` is exactly equivalent to ``f.subspace[f.indices(**coordinate_values)]``. **Assignment to subspaces** Elements of a field's data array may be changed by assigning values to a subspace of the field. Assignment is only possible to a subspace defined by indices of the returned `!SubspaceField` object. For example, ``f.subspace[indices] = 0`` is possible, but ``f.subspace(**coordinate_values) = 0`` is *not* allowed. However, assigning to a subspace defined by coordinate values may be done as follows: ``f.subspace[f.indices(**coordinate_values)] = 0``. **Missing data** The treatment of missing data elements during assignment to a subspace depends on the value of field's `hardmask` attribute. If it is True then masked elements will not be unmasked, otherwise masked elements may be set to any value. In either case, unmasked elements may be set, (including missing data). Unmasked elements may be set to missing data by assignment to the `cf.masked` constant or by assignment to a value which contains masked elements. .. seealso:: `cf.masked`, `hardmask`, `indices`, `where` :Examples: >>> print f Data : air_temperature(time(12), latitude(73), longitude(96)) K Cell methods : time: mean Dimensions : time(12) = [15, ..., 345] days since 1860-1-1 : latitude(73) = [-90, ..., 90] degrees_north : longitude(96) = [0, ..., 356.25] degrees_east : height(1) = [2] m >>> f.shape (12, 73, 96) >>> f.subspace[...].shape (12, 73, 96) >>> f.subspace[slice(0, 12), :, 10:0:-2].shape (12, 73, 5) >>> lon = f.coord('X').array >>> f.subspace[..., lon<180] >>> f.shape (12, 73, 96) >>> f.subspace[0, ...].shape (1, 73, 96) >>> f.subspace[3, slice(10, 0, -2), 95].shape (1, 5, 1) >>> f.shape (12, 73, 96) >>> f.subspace[:, [0, 72], [5, 4, 3]].shape (12, 2, 3) >>> f.subspace().shape (12, 73, 96) >>> f.subspace(latitude=0).shape (12, 1, 96) >>> f.subspace(latitude=cf.wi(-30, 30)).shape (12, 25, 96) >>> f.subspace(long=cf.ge(270, 'degrees_east'), lat=cf.set([0, 2.5, 10])).shape (12, 3, 24) >>> f.subspace(latitude=cf.lt(0, 'degrees_north')) (12, 36, 96) >>> f.subspace(latitude=[cf.lt(0, 'degrees_north'), 90]) (12, 37, 96) >>> import math >>> f.subspace(longitude=cf.lt(math.pi, 'radian'), height=2) (12, 73, 48) >>> f.subspace(height=cf.gt(3)) IndexError: No indices found for 'height' values gt 3 >>> f.subspace(dim2=3.75).shape (12, 1, 96) >>> f.subspace[...] = 273.15 >>> f.subspace[f.indices(longitude=cf.wi(210, 270, 'degrees_east'), ... latitude=cf.wi(-5, 5, 'degrees_north'))] = cf.masked >>> index = f.indices(longitude=0) >>> f.subspace[index] = f.subspace[index] * 2 ''' __slots__ = [] def __call__(self, *exact, **kwargs): ''' Return a subspace of the field defined by coordinate values. :Parameters: kwargs: optional Keyword names identify coordinates; and keyword values specify the coordinate values which are to be reinterpreted as indices to the field's data array. ~~~~~~~~~~~~~~ /?????? Coordinates are identified by their exact identity or by their axis's identifier in the field's domain. A keyword value is a condition, or sequence of conditions, which is evaluated by finding where the coordinate's data array equals each condition. The locations where the conditions are satisfied are interpreted as indices to the field's data array. If a condition is a scalar ``x`` then this is equivalent to the `cf.Query` object ``cf.eq(x)``. :Returns: out: `cf.{+Variable}` :Examples: >>> f.indices(lat=0.0, lon=0.0) >>> f.indices(lon=cf.lt(0.0), lon=cf.set([0, 3.75])) >>> f.indices(lon=cf.lt(0.0), lon=cf.set([0, 356.25])) >>> f.indices(lon=cf.lt(0.0), lon=cf.set([0, 3.75, 356.25])) ''' field = self.variable if not kwargs: return field.copy() # List functionality if field._list: return type(field)([f.subspace(*exact, **kwargs) for f in field]) return field.subspace[field.indices(*exact, **kwargs)] #--- End: def def __getitem__(self, indices): ''' Called to implement evaluation of x[indices]. x.__getitem__(indices) <==> x[indices] Returns a `cf.Field` object. ''' field = self.variable if indices is Ellipsis: return field.copy() # List functionality if field._list: return type(field)([f.subspace[indices] for f in field]) data = field.Data shape = data.shape # Parse the index indices, roll = parse_indices(field, indices, True) if roll: axes = data._axes cyclic_axes = data._cyclic for iaxis, shift in roll.iteritems(): if axes[iaxis] not in cyclic_axes: raise IndexError( "Can't take a cyclic slice from non-cyclic %r axis" % field.axis_name(iaxis)) field = field.roll(iaxis, shift) #--- End: for new = field else: new = field.copy(_omit_Data=True) # cyclic_axes = [] # for i, axis in field.data_axes(): # if field.iscyclic(axis): # cyclic_axes.append(i) # # indices, roll = parse_indices(field, indices, cyclic_axes) # # if roll: # for iaxis, x in roll.iteritems(): # field = field.roll(iaxis, x) # # new = field # else: # # Initialise the output field # new = field.copy(_omit_Data=True) # Initialise the output field # new = field.copy(_omit_Data=True) ## Work out if the indices are equivalent to Ellipsis and ## return if they are. #ellipsis = True #for index, size in izip(indices, field.shape): # if index.step != 1 or index.stop-index.start != size: # ellipsis = False # break ##--- End: for #if ellipsis: # return new # ------------------------------------------------------------ # Subspace the field's data # ------------------------------------------------------------ new.Data = field.Data[tuple(indices)] domain = new.domain data_axes = domain.data_axes() # ------------------------------------------------------------ # Subspace ancillary variables. # # If this is not possible for a particular ancillary variable # then it will be discarded from the output field. # ------------------------------------------------------------ if hasattr(field, 'ancillary_variables'): new.ancillary_variables = FieldList() for av in field.ancillary_variables: axis_map = av.domain.map_axes(field.domain) av_indices = [] flip_axes = [] for avaxis in av.domain.data_axes(): #dimensions['data']: if av.domain._axes_sizes[avaxis] == 1: # Size 1 axes are always ok av_indices.append(slice(None)) continue if avaxis not in axis_map: # Unmatched size > 1 axes are not ok av_indices = None break faxis = axis_map[avaxis] if faxis in data_axes: # Matched axes spanning the data arrays are ok i = data_axes.index(faxis) av_indices.append(indices[i]) if av.domain.direction(avaxis) != domain.direction(faxis): flip_axes.append(avaxis) else: av_indices = None break #--- End: for if av_indices is not None: # We have successfully matched up each axis of the # ancillary variable's data array with a unique # axis in the parent field's data array, so we can # keep a subspace of this ancillary field if flip_axes: av = av.flip(flip_axes) new.ancillary_variables.append(av.subspace[tuple(av_indices)]) #--- End: for if not new.ancillary_variables: del new.ancillary_variables #--- End: if # ------------------------------------------------------------ # Subspace fields in coordinate references # ------------------------------------------------------------ refs = new.refs() if refs: broken = [] for key, ref in refs.iteritems(): for term, variable in ref.iteritems(): if not isinstance(variable, Field): continue # Still here? Then try to subspace a formula_terms # field. dim_map = variable.domain.map_axes(domain) v_indices = [] flip_dims = [] for vdim in variable.domain.data_axes(): if variable.domain._axes_sizes[vdim] == 1: # We can always index a size 1 axis of the # data array v_indices.append(slice(None)) continue if vdim not in dim_map: # Unmatched size > 1 axes are not ok v_indices = None break axis = dim_map[vdim] data_axes = domain.data_axes() if axis in data_axes: # We can index a matched axis which spans # the data array i = data_axes.index(axis) v_indices.append(indices[i]) if variable.domain.direction(vdim) != domain.direction(axis): flip_dims.append(vdim) else: v_indices = None break #--- End: for if v_indices is not None: # This term is subspaceable if flip_dims: variable = variable.flip(flip_dims) ref[term] = variable.subspace[tuple(v_indices)] else: # This term is broken ref[term] = None #--- End: for #--- End: for #--- End: if # ------------------------------------------------------------ # Subspace the coordinates and cell measures # ------------------------------------------------------------ for key, item in domain.items(role=('d', 'a', 'm'), axes=data_axes).iteritems(): item_axes = domain.item_axes(key) dice = [] for axis in item_axes: if axis in data_axes: dice.append(indices[data_axes.index(axis)]) else: dice.append(slice(None)) #--- End: for domain._set(key, item.subspace[tuple(dice)]) #--- End: for for axis, size in izip(data_axes, new.shape): domain._axes_sizes[axis] = size return new #--- End: def def __setitem__(self, indices, value): ''' Called to implement assignment to x[indices] x.__setitem__(indices, value) <==> x[indices] ''' field = self.variable # List functionality if field._list: for f in field: f.subspace[indices] = value return if isinstance(value, field.__class__): value = field._conform_for_assignment(value) value = value.Data elif numpy_size(value) != 1: raise ValueError( "Can't assign a size %d %r to a %s data array" % (numpy_size(value), value.__class__.__name__, field.__class__.__name__)) elif isinstance(value, Variable): value = value.Data field.Data[indices] = value #--- End: def #--- End: class # ==================================================================== # # FieldList object # # ==================================================================== class FieldList(Field, list): '''An ordered sequence of fields. Each element of a field list is a `cf.Field` object. A field list supports the python list-like operations (such as indexing and methods like `!append`), but not the python list arithmetic and comparison behaviours. Any field list arithmetic and comparison operation is applied independently to each field element, so all of the operators defined for a field are allowed. ''' # Do not ever change this: _list = True # Do not ever change this: _hasData = False def __init__(self, fields=None): ''' **Initialization** :Parameters: fields: (sequence of) `cf.Field`, optional Create a new field list with these fields. :Examples: >>> fl = cf.FieldList() >>> len(fl) 0 >>> f >>> fl = cf.FieldList(f) >>> len(fl 1 >>> fl = cf.FieldList([f, f]) >>> len(fl) 2 >>> fl = cf.FieldList(cf.FieldList([f] * 3)) >>> len(fl) 3 ''' if fields is not None: self.extend(fields) #--- End: def def __repr__(self): ''' Called by the :py:obj:`repr` built-in function. x.__repr__() <==> repr(x) ''' out = [repr(f) for f in self] out = ',\n '.join(out) return '['+out+']' #--- End: def def __str__(self): ''' Called by the :py:obj:`str` built-in function. x.__str__() <==> str(x) ''' return '\n'.join(str(f) for f in self) #--- End: def # ================================================================ # Overloaded list methods # ================================================================ def __getslice__(self, i, j): ''' Called to implement evaluation of f[i:j] f.__getslice__(i, j) <==> f[i:j] :Examples 1: >>> g = f[0:1] >>> g = f[1:-4] >>> g = f[:1] >>> g = f[1:] :Returns: out: `cf.FieldList` ''' return type(self)(list.__getslice__(self, i, j)) #--- End: def def __getitem__(self, index): ''' Called to implement evaluation of f[index] f.__getitem_(index) <==> f[index] :Examples 1: >>> g = f[0] >>> g = f[-1:-4:-1] >>> g = f[2:2:2] :Returns: out: `cf.Field` or `cf.FieldList` If *index* is an integer then a field is returned. If *index* is a slice then a field list is returned, which may be empty. ''' out = list.__getitem__(self, index) if isinstance(out, list): return type(self)(out) return out #--- End: def __len__ = list.__len__ __setitem__ = list.__setitem__ append = list.append extend = list.extend insert = list.insert pop = list.pop reverse = list.reverse sort = list.sort def __contains__(self, y): ''' Called to implement membership test operators. x.__contains__(y) <==> y in x Each field in the field list is compared with the field's `~cf.Field.equals` method (as aopposed to the ``==`` operator). Note that ``y in x`` is equivalent to ``any(g.equals(x) for g in f)``. ''' for f in self: if f.equals(y): return True return False #--- End: def def count(self, x): ''' L.count(value) -- return number of occurrences of value Each field in the {+variable} is compared to *x* with the field's `~cf.Field.equals` method (as opposed to the ``==`` operator). Note that ``f.count(x)`` is equivalent to ``sum(g.equals(x) for g in f)``. .. seealso:: `cf.Field.equals`, :py:obj:`list.count` :Examples: >>> f = cf.FieldList([a, b, c, a]) >>> f.count(a) 2 >>> f.count(b) 1 >>> f.count(a+1) 0 ''' return len([None for f in self if f.equals(x)]) #--- End def def index(self, x, start=0, stop=None): ''' L.index(value, [start, [stop]]) -- return first index of value. Each field in the {+variable} is compared with the field's `~cf.Field.equals` method (as aopposed to the ``==`` operator). It is an error if there is no such field. .. seealso:: :py:obj:`list.index` :Examples: >>> ''' if start < 0: start = len(self) + start if stop is None: stop = len(self) elif stop < 0: stop = len(self) + stop for i, f in enumerate(self[start:stop]): if f.equals(x): return i + start #--- End: for raise ValueError( "{0!r} is not in {1}".format(x, self.__class__.__name__)) #--- End: def def remove(self, x): ''' L.remove(value) -- remove first occurrence of value. Each field in the {+variable} is compared with the field's `~cf.Field.equals` method (as aopposed to the ``==`` operator). It is an error if there is no such field. .. seealso:: :py:obj:`list.remove` ''' for i, f in enumerate(self): if f.equals(x): del self[i] return raise ValueError( "{0}.remove(x): x not in {0}".format(self.__class__.__name__)) #--- End: def # ================================================================ # Special methods # ================================================================ def __array__(self): self._forbidden('special method', '__array__') def __data__(self): self._forbidden('special method', '__data__') # ================================================================ # Private methods # ================================================================ def _binary_operation(self, y, method): if isinstance(y, self.__class__): if len(y) != 1: raise ValueError( "Can't {0}: Incompatible {1} lengths ({2}, {3})".format( method, self.__class__.__name__, len(self), len(y))) y = y[0] if method[2] == 'i': # In place for f in self: f._binary_operation(y, method) return self else: # Not in place return type(self)([f._binary_operation(y, method) for f in self]) #--- End: def def _unary_operation(self, method): return type(self)([f._unary_operation(method) for f in self]) #--- End: def def _forbidden(self, x, name): raise AttributeError( "{0} has no {1} {2!r}. {2!r} may be accessed on each field element.".format( self.__class__.__name__, x, name)) #--- End: def # ================================================================ # CF properties # ================================================================ @property def add_offset(self): self._forbidden('CF property', 'add_offset') @property def calendar(self): self._forbidden('CF property', 'calendar') @property def cell_methods(self): self._forbidden('CF property', 'cell_methods') @property def comment(self): self._forbidden('CF property', 'comment') @property def Conventions(self): self._forbidden('CF property', 'Conventions') @property def _FillValue(self): self._forbidden('CF property', '_FillValue') @property def flag_masks(self): self._forbidden('CF property', 'flag_masks') @property def flag_meanings(self): self._forbidden('CF property', 'flag_meanings') @property def flag_values(self): self._forbidden('CF property', 'flag_values') @property def history(self): self._forbidden('CF property', 'history') @property def institution(self): self._forbidden('CF property', 'institution') @property def leap_month(self): self._forbidden('CF property', 'leap_month') @property def leap_year(self): self._forbidden('CF property', 'leap_year') @property def long_name(self): self._forbidden('CF property', 'long_name') @property def missing_value(self): self._forbidden('CF property', 'missing_value') @property def month_lengths(self): self._forbidden('CF property', 'month_lengths') @property def references(self): self._forbidden('CF property', 'references') @property def scale_factor(self): self._forbidden('CF property', 'scale_factor') @property def source(self): self._forbidden('CF property', 'source') @property def standard_error_multiplier(self): self._forbidden('CF property', 'standard_error_multiplier') @property def standard_name(self): self._forbidden('CF property', 'standard_name') @property def title(self): self._forbidden('CF property', 'title') @property def units(self): self._forbidden('CF property', 'units') @property def valid_max(self): self._forbidden('CF property', 'valid_max') @property def valid_min(self): self._forbidden('CF property', 'valid_min') @property def valid_range(self): self._forbidden('CF property', 'valid_range') # ================================================================ # Attributes # ================================================================ @property def ancillary_variables(self): self._forbidden('attribute', '') @property def array(self): self._forbidden('attribute', 'array') @property def attributes(self): self._forbidden('attribute', 'attributes') @property def Data(self): self._forbidden('attribute', 'Data') @property def data(self): self._forbidden('attribute', 'data') @property def day(self): self._forbidden('attribute', 'day') @property def domain(self): self._forbidden('attribute', 'domain') @property def dtarray(self): self._forbidden('attribute', 'dtarray') @property def dtvarray(self): self._forbidden('attribute', 'dtvarray') @property def dtype(self): self._forbidden('attribute', 'dtype') @property def Flags(self): self._forbidden('attribute', 'Flags') @property def hardmask(self): self._forbidden('attribute', 'hardmask') @property def hour(self): self._forbidden('attribute', 'hour') @property def isscalar(self): self._forbidden('attribute', 'isscalar') @property def Flags(self): self._forbidden('attribute', 'Flags') @property def minute(self): self._forbidden('attribute', 'minute') @property def month(self): self._forbidden('attribute', 'month') @property def ndim(self): self._forbidden('attribute', 'ndim') @property def properties(self): self._forbidden('attribute', 'properties') @property def rank(self): self._forbidden('attribute', 'rank') @property def second(self): self._forbidden('attribute', 'second') @property # def subspace(self): self._forbidden('attribute', 'subspace') # @property def shape(self): self._forbidden('attribute', 'shape') @property def size(self): self._forbidden('attribute', 'size') @property def T(self): self._forbidden('attribute', 'T') @property def Units(self): self._forbidden('attribute', 'Units') @property def varray(self): self._forbidden('attribute', 'varray') @property def X(self): self._forbidden('attribute', 'X') @property def Y(self): self._forbidden('attribute', 'Y') @property def year(self): self._forbidden('attribute', 'year') @property def Z(self): self._forbidden('attribute', 'Z') # ================================================================ # Methods # ================================================================ def all(self, *args, **kwargs): self._forbidden('method', 'all') def any(self, *args, **kwargs): self._forbidden('method', 'any') def allclose(self, *args, **kwargs): self._forbidden('method', 'allclose') def aux(self, *args, **kwargs): self._forbidden('method', 'aux') def auxs(self, *args, **kwargs): self._forbidden('method', 'auxs') def axes(self, *args, **kwargs): self._forbidden('method', 'axes') def axes_sizes(self, *args, **kwargs): self._forbidden('method', 'axes_sizes') def axis(self, *args, **kwargs): self._forbidden('method', 'axis') def axis_name(self, *args, **kwargs): self._forbidden('method', 'axis_name') def axis_size(self, *args, **kwargs): self._forbidden('method', 'axis_size') def coord(self, *args, **kwargs): self._forbidden('method', 'coord') def coords(self, *args, **kwargs): self._forbidden('method', 'coords') def cyclic(self, *args, **kwargs): self._forbidden('method', 'cyclic') def data_axes(self, *args, **kwargs): self._forbidden('method', 'data_axes') def dim(self, *args, **kwargs): self._forbidden('method', 'dim') def dims(self, *args, **kwargs): self._forbidden('method', 'dims') def field(self, *args, **kwargs): self._forbidden('method', 'field') def iscyclic(self, *args, **kwargs): self._forbidden('method', 'iscyclic') def insert_aux(self, *args, **kwargs): self._forbidden('method', 'insert_aux') def insert_axis(self, *args, **kwargs): self._forbidden('method', 'insert_axis') def insert_data(self, *args, **kwargs): self._forbidden('method', 'insert_data') def insert_dim(self, *args, **kwargs): self._forbidden('method', 'insert_dim') def insert_measure(self, *args, **kwargs): self._forbidden('method', 'insert_measure') def insert_ref(self, *args, **kwargs): self._forbidden('method', 'insert_ref') def indices(self, *args, **kwargs): self._forbidden('method', 'indices') def item(self, *args, **kwargs): self._forbidden('method', 'item') def item_axes(self, *args, **kwargs): self._forbidden('method', 'item_axes') def items(self, *args, **kwargs): self._forbidden('method', 'items') def items_axes(self, *args, **kwargs): self._forbidden('method', 'items_axes') def match(self, *args, **kwargs): self._forbidden('method', 'match') def max(self, *args, **kwargs): self._forbidden('method', 'max') def mean(self, *args, **kwargs): self._forbidden('method', 'mean') def measure(self, *args, **kwargs): self._forbidden('method', 'measure') def measures(self, *args, **kwargs): self._forbidden('method', 'measures') def mid_range(self, *args, **kwargs): self._forbidden('method', 'mid_range') def min(self, *args, **kwargs): self._forbidden('method', 'min') def period(self, *args, **kwargs): self._forbidden('method', 'period') def range(self, *args, **kwargs): self._forbidden('method', 'range') def ref(self, *args, **kwargs): self._forbidden('method', 'ref') def refs(self, *args, **kwargs): self._forbidden('method', 'refs') def remove_axes(self, *args, **kwargs): self._forbidden('method', 'remove_axes') def remove_axis(self, *args, **kwargs): self._forbidden('method', 'remove_axis') def remove_data(self, *args, **kwargs): self._forbidden('method', 'remove_data') def remove_item(self, *args, **kwargs): self._forbidden('method', 'remove_item') def remove_items(self, *args, **kwargs): self._forbidden('method', 'remove_items') def sample_size(self, *args, **kwargs): self._forbidden('method', 'sample_size') def sd(self, *args, **kwargs): self._forbidden('method', 'sd') def sum(self, *args, **kwargs): self._forbidden('method', 'sum') def unique(self, *args, **kwargs): self._forbidden('method', 'unique') def var(self, *args, **kwargs): self._forbidden('method', 'var') @property def binary_mask(self): '''For each field, a field of the binary (0 and 1) mask of the data array. Values of 1 indicate masked elements. .. seealso:: `mask` :Examples: >>> f[0].shape (12, 73, 96) >>> m = f.binary_mask >>> m[0].long_name 'binary_mask' >>> m[0].shape (12, 73, 96) >>> m[0].dtype dtype('int32') >>> m[0].data ''' return self._list_attribute('binary_mask') #--- End: def @property def mask(self): '''For each field, a field of the mask of the data array. Values of True indicate masked elements. .. seealso:: `binary_mask` :Examples: >>> f[0].shape (12, 73, 96) >>> m = f.mask >>> m[0].long_name 'mask' >>> m[0].shape (12, 73, 96) >>> m[0].dtype dtype('bool') >>> m[0].data ''' return self._list_attribute('mask') #--- End: def #--- End: class cf-python-1.3.2/cf/domain.py0000644000175000017500000031647512752572326016070 0ustar daviddavid00000000000000from itertools import izip, izip_longest, chain from operator import itemgetter from re import search as re_search from .coordinatereference import CoordinateReference from .functions import RTOL, ATOL, equals, allclose from .functions import inspect as cf_inspect from .query import Query, gt, le from .units import Units # ==================================================================== # # Domain object # # ==================================================================== class Domain(object): '''Completely describe a field's coordinate system (domain). It contains the domain axis constructs, dimension coordinate constructs, auxiliary coordinate constructs, cell measure constructs and coordinate reference constructs defined by the CF data model. ''' def __init__(self, axes=None, dim=None, aux=None, measure=None, ref=None, copy=True, assign_axes=None, **kwargs): '''**Initialization** :Parameters: axes : *optional* Initialize axes of the domain. The *axes* parameter may be one of: * `None`. This is the default and axes are inferred from the dimension coordinate specified with the *dim* parameter. .. * (A sequence of) `int`. For each integer, an axis with that size is inserted into the domain with domain identifiers ``'dim0'``, ``'dim1'``, etc. for the first to the last axes in the sequence. If *axes* is an integer (rather than a sequence) then it is treated as a single element sequence. *Example:* To insert an axis of size 12 with domain identifier ``'dim0'``: ``axes=12``. *Example:* To insert axes of sizes 73 and 96 with domain identifiers ``'dim0'`` and ``'dim1'`` respectively: ``axes=[73, 96]``. .. * A dictionary which maps axis domain identifiers to axis sizes. *Example:* To insert an axis of size 12 with domain identifier ``'dim4'``: ``axes={'dim4': 12}``. *Example:* To insert axes of sizes 73 and 96 with domain identifiers ``'dim3'`` and ``'dim4'`` respectively: ``axes={'dim3': 73, 'dim4': 96}``. Note that axis initialization occurs before the initialization of dimension coordiante, auxiliary coordinate and cell measure and coordinate reference objects. dim : *optional* Initialize dimension coordinate objects of the domain. Inserting a dimension coordinate object into the domain will automatically create a domain axis of the correct size, unless an axis with the same domain identifier has already been created with the *axes* parameter. So, in general, it is not necessary to initialize the axes spanned by dimension coordinates with the *axes* parameter. The *dim* parameter may be one of: * `None`. This is the default and no dimension coordinate objects are inserted into the domain. .. * (A sequence of) `cf.DimensionCoordinate`. Each dimension coordinate object is inserted into the domain with domain identifiers ``'dim0'``, ``'dim1'``, etc. for the first to the last dimension coordinate object in the sequence. If *dim* is a `cf.DimensionCoordinate` (rather than a sequence) then it is treated as a single element sequence. *Example:* To insert a dimension coordinate, ``x``, with domain identifier ``'dim0'``: ``dim=x``. *Example:* To insert dimension coordinates, ``x`` and ``y``, with domain identifiers ``'dim0'`` and ``'dim1'`` respectively: ``dim=[x, y]``. .. * A dictionary which maps dimension coordinate domain identifiers to `cf.DimensionCoordinate` objects. *Example:* To insert a dimension coordinate, ``t``, with domain identifier ``'dim4'``: ``dim={'dim4': t}``. *Example:* To insert dimension coordinates, ``x`` and ``y``, with domain identifiers ``'dim3'`` and ``'dim4'`` respectively: ``dim={'dim3': x, 'dim4': y}``. Note that dimension coordinate initialization occurs after axis initialization and before the initialization of auxiliary coordinate and cell measure and coordinate reference objects. aux : *optional* Initialize auxiliary coordinate objects of the domain. The axes spanned by an auxiliary coordinate **must** be defined by the *axes* and/or *dim* parameters. If there is no ambiguity (as will be the case if all of the axes have different sizes) then it is not necessary to describe which axes an auxiliary coordinate spans, and in which order. Otherwise, or in any case, the auxiliary coordinate axes may be specified with the *assign_axes* parameter. The *aux* parameter may be one of: * `None`. This is the default and no auxiliary coordinate objects are inserted into the domain. .. * (A sequence of) `cf.AuxiliaryCoordinate`. Each auxiliary coordinate object is inserted into the domain with domain identifiers ``'aux0'``, ``'aux1'``, etc. for the first to the last auxiliary coordinate object in the sequence. If *aux* is a `cf.AuxiliaryCoordinate` (rather than a sequence) then it is treated as a single element sequence. *Example:* To insert an auxiliary coordinate, ``p``, with domain identifier ``'aux0'``: ``aux=p``. *Example:* To insert auxiliary coordinates, ``p`` and ``q``, with domain identifiers ``'aux0'`` and ``'aux1'`` respectively: ``aux=[p, q]``. .. * A dictionary which maps auxiliary coordinate domain identifiers to `cf.AuxiliaryCoordinate` objects. *Example:* To insert an auxiliary coordinate, ``r``, with domain identifier ``'aux4'``: ``aux={'aux4': r}``. *Example:* To insert auxiliary coordinates, ``p`` and ``q``, with domain identifiers ``'aux3'`` and ``'aux4'`` respectively: ``aux={'aux3': p, 'aux4': q}``. Note that auxiliary coordinate initialization occurs after axis and dimension coordinate initialization. measure : *optional* Initialize cell measure objects of the domain. The axes spanned by a cell measure object **must** be defined by the *axes* and/or *dim* parameters. If there is no ambiguity (as will be the case if all of the axes have different sizes) then it is not necessary to describe which axes a cell measure spans, and in which order. Otherwise, or in any case, the cell measure axes may be specified with the *assign_axes* parameter. The *measure* parameter may be one of: * `None`. This is the default and no cell measure objects are inserted into the domain. .. * (A sequence of) `cf.CellMeasure`. Each cell measure object is inserted into the domain with domain identifiers ``'msr0'``, ``'msr1'``, etc. for the first to the last cell measure object in the sequence. If *msr* is a `cf.CellMeasure` (rather than a sequence) then it is treated as a single element sequence. *Example:* To insert a cell measure, ``m``, with domain identifier ``'msr0'``: ``msr=m``. *Example:* To insert cell measures, ``m`` and ``n``, with domain identifiers ``'msr0'`` and ``'msr1'`` respectively: ``msr=[m, n]``. .. * A dictionary which maps cell measure domain identifiers to `cf.CellMeasure` objects. *Example:* To insert a cell measure, ``m``, with domain identifier ``'msr4'``: ``msr={'msr4': m}``. *Example:* To insert cell measures, ``m`` and ``n``, with domain identifiers ``'msr3'`` and ``'msr4'`` respectively: ``msr={'msr3': m, 'msr4': n}``. Note that cell measure initialization occurs after axis, dimension coordinate and auxiliary coordinate initialization. assign_axes, kwargs : dict, optional Map coordinate and cell measure objects to the axes which they span. Each dictionary key is a domain identifier of a dimension coordinate, auxiliary coordinate or cell measure object which has been previously defined by the *dim*, *aux* or *measure* parameters. Its corresponding value specifies the axes that the item spans, in the correct order. The axes are those returned by this call of the domain's `axes` method: ``d.axes(value, order=True, **kwargs)`` (see `cf.Field.axes` for details). For each dimension coordinate, auxiliary coordinate or cell measure object, if there is no ambiguity as to which axes it spans (as will be the case if all of the axes have different sizes) then it is not necessary provide this item to the *assign_axes* dictionary, as the spanning axes may be deduced automatically. Otherwise it is required. *Example:* Auxiliary coordinate ``'aux0'`` spans axis ``'dim0'`` and auxiliary coordinate ``'aux1'`` spans axes ``'dim2'`` and ``dim1'``, in that order: ``assign_axes={'aux0': 'dim0', 'aux1': ['dim2', `dim1`]}``. *Example:* Auxiliary coordinate ``'aux0'`` spans axis the Z axis cell measure ``'msr1'`` spans the Y and X axes, in that order: ``assign_axes={'aux0': 'Z', 'msr1': ['Y', 'X']}``. In this case it is assumed that the axes have dimension coordinates with sufficient metadta to be able to define them as Z, Y and X axes. ref : *optional* Initialize coordinate reference objects of the domain. The *ref* parameter may be one of: * `None`. This is the default and no coordinate reference objects are inserted into the domain. .. * (A sequence of) `cf.CoordinateReference`. Each coordinate reference object is inserted into the domain with domain identifiers ``'ref0'``, ``'ref1'``, etc. for the first to the last coordinate reference object in the sequence. If *ref* is a `cf.CoordinateReference` (rather than a sequence) then it is treated as a single element sequence. *Example:* To insert a coordinate reference, ``b``, with domain identifier ``'ref0'``: ``ref=b``. *Example:* To insert coordinate references, ``b`` and ``c``, with domain identifiers ``'ref0'`` and ``'ref1'`` respectively: ``ref=[b, c]``. .. * A dictionary which maps coordinate reference domain identifiers to `cf.CoordinateReference` objects. *Example:* To insert a coordinate reference, ``m``, with domain identifier ``'ref4'``: ``ref={'ref4': m}``. *Example:* To insert coordinate references, ``b`` and ``c``, with domain identifiers ``'ref3'`` and ``'ref4'`` respectively: ``ref={'ref3': b, 'ref4': c}``. Note that coordinate reference initialization occurs after axis, dimension coordinate, auxiliary coordinate and cell measure initialization. copy : bool, optional If True (the default) then all dimension coordinate, auxiliary coordinate, cell measure and coordinate reference objects are copied prior to insertion. :Examples: In this example, four dots (``....``) refers to appropriate initialization parameters of the coordinate, cell measure and coordinate reference constructs, which are omitted here for clarity. >>> dim_coord_A = cf.DimensionCoordinate(....) >>> dim_coord_B = cf.DimensionCoordinate(....) >>> dim_coord_A.size, dim_coord_B.size (73, 96) >>> dim_coord_A.X, dim_coord_B.Y (True, True) >>> aux_coord_A = cf.AuxiliaryCoordinate(....) >>> aux_coord_A.shape (96, 73) >>> cell_measure_A = cf.CellMeasure(....) >>> cell_measure_A.shape (73, 96) >>> ref_A = cf.CoordinateReference(name='latitude_longitude', ....) >>> d = cf.Domain(dim=[dim_coord_A, dim_coord_B], ... aux=aux_coord_A, ... measure=cell_measure_A, ... ref=ref_A) ... >>> d.items_axes() {'aux0': ['dim1', 'dim0'], 'msr0': ['dim0', 'dim1'], 'dim1': ['dim1'], 'dim0': ['dim0']} >>> d.refs {'ref0' : } It was not necessary to specify the axis mappings for ``aux_coord_A`` and ``cell_measure_A`` because the two axes have unambiguous sizes. The same domain could have been initialised using the dictionary form of the parameters and explicitly assigning axes described by their dimension coordinate metadata: >>> e = cf.Domain(axes={'dim0': 73, 'dim1': 96}, ... dim={'dim0': dim_coord_A, 'dim1': dim_coord_B}, ... aux={'aux0': aux_coord_A}, ... measure={'msr0': cell_measureA}, ... ref={'ref0': ref_A}, ... assign_axes={'aux0': ['Y', 'X'], ... 'msr0': ['X', 'Y']}) ... >>> e.equals(d) True ''' self.d = {} self.a = {} self.m = {} self.r = {} self._map = {} self._axes = {} self._axes_sizes = {} # ------------------------------------------------------------ # Initialize axes # ------------------------------------------------------------ if axes or axes == 0: if isinstance(axes, dict): for key, size in axes.iteritems(): self.insert_axis(size, key=key, replace=False) else: if isinstance(axes, (int, long)): axes = (axes,) for size in axes: self.insert_axis(size) #--- End: if # ------------------------------------------------------------ # Initialize dimension coordinates # ------------------------------------------------------------ if dim: if isinstance(dim, dict): for key, coord in dim.iteritems(): self.insert_dim(coord, key=key, copy=copy, replace=False) else: for coord in dim: key = self.new_axis_identifier() self.insert_dim(coord, key=key, copy=copy, replace=False) #--- End: if # ------------------------------------------------------------ # Assign axes to auxiliary coordinates and cell measures # ------------------------------------------------------------ if assign_axes: for key, value in assign_axes.iteritems(): self._axes[key] = self.axes(value, ordered=True) #--- End: if # ------------------------------------------------------------ # Initialize auxiliary coordinates # ------------------------------------------------------------ if aux: if isinstance(aux, dict): for key, coord in aux.iteritems(): aux_axes = self._axes.get(key, None) self.insert_aux(coord, key=key, axes=aux_axes, copy=copy) else: for coord in aux: key = self.new_aux_identifier() aux_axes = self._axes.get(key, None) self.insert_aux(coord, key=key, axes=aux_axes, copy=copy) #--- End: if # ------------------------------------------------------------ # Initialize cell measures # ------------------------------------------------------------ if measure: if isinstance(measure, dict): for key, msr in measure.iteritems(): msr_axes = self._axes.get(key, None) self.insert_measure(msr, key=key, axes=msr_axes, copy=copy) else: for msr in measure: key = self.new_measure_identifier() msr_axes = self._axes.get(key, None) self.insert_measure(msr, key=key, axes=msr_axes, copy=copy) #--- End: if # ------------------------------------------------------------ # Initialize coordinate references # ------------------------------------------------------------ if ref: if isinstance(ref, CoordinateReference): self.insert_ref(ref, copy=copy) elif isinstance(ref, dict): for key, coordref in ref.iteritems(): self.insert_ref(coordref, key=key, copy=copy) else: for N, coordref in enumerate(ref): self.insert_ref(coordref, copy=copy) #--- End: if #--- End: def def __repr__(self): ''' x.__repr__() <==> repr(x) ''' data_axes = self._axes.get('data', ()) w = sorted(["{0}({1})".format(self.axis_name(axis), size) for axis, size in self._axes_sizes.iteritems() if axis not in data_axes]) x = ["{0}({1})".format(self.axis_name(axis), self._axes_sizes[axis]) for axis in data_axes] axes = ', '.join(w+x) return ''.format(self.__class__.__name__, axes) #--- End: def def __str__(self): ''' x.__str__() <==> str(x) ''' mmm = {} def _print_coord(domain, key, variable, dimension_coord): '''Private function called by __str__''' if dimension_coord: name = "%s(%d)" % (domain.axis_name(key), domain._axes_sizes[key]) mmm[key] = name if key not in domain.d: return name else: variable = domain.d[key] x = [name] #--- End: if # Still here? if not dimension_coord: # Auxiliary coordinate shape = [mmm[dim] for dim in domain._axes[key]] shape = str(tuple(shape)).replace("'", "") shape = shape.replace(',)', ')') x = [variable.name('domain%'+key)] x.append(shape) #--- End: if try: variable.compress except AttributeError: if variable._hasData: x.append(' = ') x.append(str(variable.Data)) else: x.append(' -> compressed ') compressed = [] for unc in domain[key].compress: shape = str(unc.size) compressed.append(unc.name('unc')+'('+shape+')') x.append(', '.join(compressed)) return ''.join(x) #--- End: def string = [] x = [_print_coord(self, dim[0], None, True) for dim in sorted(self._axes_sizes.iteritems(), key=itemgetter(1))] if x: string.append('Axes : ') string.append('\n : '.join(x)) x = [_print_coord(self, aux, v, False) for aux, v in sorted(self.a.items())] if x: string.append('\n') string.append('Aux coords : ') string.append('\n : '.join(x)) # Cell measures x = [_print_coord(self, msr, v, False) for msr, v in sorted(self.m.items())] if x: string.append('\n') string.append('Cell measures : ') string.append('\n : '.join(x)) # Coordinate references x = [repr(ref) for ref in self.r.values()] if x: string.append('\n') string.append('Coord refs : ') string.append('\n : '.join(x)) #--- End: if return ''.join(string) #--- End: def def _conform_ref(self, ref): '''Replace the content of ref.coords with domain coordinate identifiers, where possible. :Parameters: ref : cf.CoordinateReference :Returns: None :Examples: >>> d._conform_ref(r) ''' coord_map = {} role = ('d', 'a') for identifier in ref.coords: key = self.item(identifier, role=role, exact=True, key=True) if key is not None: coord_map[identifier] = key # else: # coord_map[identifier] = ref._standard_coords.get(identifier, identifier) #--- End: for ref.change_coord_identities(coord_map, i=True) #--- End: def def _replace_refs_coord_identifier(self, key): ''' Replace a coordinate domain key with a coordinate identity in all coordinate references. If the coordinate object has no identity then the coordinate object is effectively removed. :Parameters: key : str A domain coordinate object identifier. :Returns: None :Examples: >>> d._replace_refs_coord_identifier('dim1') >>> d._replace_refs_coord_identifier('aux0') ''' coord_map = {key: self.get(key).identity(None)} for ref in self.r.itervalues(): ref.change_coord_identities(coord_map, i=True) #--- End: def def _set(self, key, value): ''' Set the item of a pre-existing identifier of the domain. An item is either a dimension coordinate, an auxiliary coordinate, a cell measure or a coordinate reference object. .. note:: Consistency is NOT checked. .. seealso:: `get`, `has` :Parameters: key : str A domain identifier. value : The new item corresponding to the domain identifier given by *key*. :Returns: None :Examples: >>> d.items().keys() ['dim0', 'aux0', 'aux1', 'ref0'] >>> d._set('aux1', cf.AuxiliaryCoordinate(....)) >>> d._set('ref0', cf.CoordinateReference(....)) ''' getattr(self, self._map[key])[key] = value #--- End: def def _equal_refs(self, t, u, domain, rtol=None, atol=None, pointer_map={}, ignore_fill_value=False, traceback=False): ''' :Parameters: t : cf.CoordinateReference u : cf.CoordinateReference domain : cf.Domain The domain which contains *u*. pointer_map : dict ignore_fill_value : bool, optional If True then data arrays with different fill values are considered equal. By default they are considered unequal. traceback : bool, optional If True then print a traceback highlighting where the two instances differ. :Returns: out : bool :Examples: >>> ''' if rtol is None: rtol = RTOL() if atol is None: atol = ATOL() if not t.equals(u, rtol=rtol, atol=atol, ignore_fill_value=ignore_fill_value, traceback=traceback): if traceback: print( "%s: Unequal coordinate references (%r != %r)" % (self.__class__.__name__, t, u)) return False # If coordinate references have coordinate-valued terms - # check them for term in t.coord_terms: if u[term] in pointer_map: if t[term] == pointer_map[u[term]]: continue elif u[term] == t[term]: continue # Still here? if traceback: print( "%s: Unequal %s coordinate references %r term" % (self.__class__.__name__, t.name, term)) return False #--- End: for return True #--- End: def @property def rank(self): ''' The number of axes in the domain. :Examples: >>> len(d.axes()) 4 >>> d.rank 4 ''' return len(self._axes_sizes) #--- End: def def equivalent(self, other, rtol=None, atol=None, traceback=False): ''' True if and only if two domains are logically equivalent. :Parameters: other : The object to compare for equivalence. atol : float, optional The absolute tolerance for all numerical comparisons, By default the value returned by the `ATOL` function is used. rtol : float, optional The relative tolerance for all numerical comparisons, By default the value returned by the `RTOL` function is used. traceback : bool, optional If True then print a traceback highlighting where the two objects differ. :Returns: out : bool Whether or not the two objects are equivalent. ''' if sorted(self._axes_sizes.values()) != sorted(self._axes_sizes.values()): if traceback: print("{0}: Different axis sizes: {1} != {2}".format( self.__class__.__name__, sorted(self._axes_sizes.values()), sorted(other._axes_sizes.values()))) return False s = self.analyse() t = other.analyse() if sorted(s['id_to_coord']) != sorted(t['id_to_coord']): if traceback: print( "{0}: Different axis identities: {1} != {2}".format( self.__class__.__name__, sorted(s['id_to_coord']), sorted(t['id_to_coord']))) return False for identity, coord0 in s['id_to_coord'].iteritems(): coord1 = t['id_to_coord'][identity] if not coord0._equivalent_data(coord1, rtol=rtol, atol=atol): if traceback: print( "{0}: Non-equivalent 1-d coordinate data array: {1}".format( self.__class__.__name__, identity)) return False #--- End: for keys1 = other.r.keys() for ref0 in self.r.itervalues(): found_match = False for key1 in keys1: ref1 = other_t[key1] if self.equivalent_refs(ref0, ref1, domain=other, traceback=False): found_match = True refs1.remove(key1) break #--- End: for if not found_match: if traceback: print( "{0}: Missing coordinate reference: {1}".format( self.__class__.__name__, ref0)) return False #--- End: for return True #--- End: def def equivalent_refs(self, t, u, domain, atol=None, rtol=None, traceback=False): ''' True if a coordinate refencence object is the same as one in another domain. :Parameters: t : cf.CoordinateReference u : cf.CoordinateReference domain : cf.Domain The domain which contains *u*. traceback : bool, optional If True then print a traceback highlighting where the two instances differ. :Returns: out : bool :Examples: >>> ''' if not t.equivalent(u, rtol=rtol, atol=atol, traceback=traceback): if traceback: print( "%s: Unequivalent coordinate references (%r != %r)" % (self.__class__.__name__, t, u)) return False t_coord_terms = t.coord_terms.copy() u_coord_terms = u.coord_terms.copy() for term in t_coord_terms.intersection(u_coord_terms): # Term is coordiante-valued in both t and u t_coord_terms.remove(term) u_coord_terms.remove(term) tcoord = self.item(t[term], role='da', exact=True) ucoord = domain.item(u[term], role='da', exact=True) if (tcoord is None or ucoord is None or not tcoord._equivalent_data(ucoord, rtol=rtol, atol=atol)): if traceback: print( "%s: Unequal coordinate reference %r term" % (self.__class__.__name__, term)) return False #--- End: for for term in t_coord_terms: # Term is coordiante-valued in t but missing from u coord = self.item(t[term], role='da', exact=True) default = t.default_value(term) if default is None or coord is None or not allclose(coord, default): if traceback: print( "%s: Unequivalent coordinate reference %r term" % (self.__class__.__name__, term)) return False #--- End: for for term in u_coord_terms: # Term is coordiante-valued in u but missing from t coord = self.item(u[term], role='da', exact=True) default = u.default_value(term) if default is None or coord is None or not allclose(coord, default): if traceback: print( "%s: Unequivalent coordinate reference %r term" % (self.__class__.__name__, term)) return False #--- End: for # Still here? return True #--- End: def def canonical_ref(self, ref): ''' ''' ref = ref.copy() for term, value in ref.iteritems(): data = getattr(value, '__data__', None) if data is None: # Value has no units continue data = data() units = ref.canonical_units(term) if units is None: continue if isinstance(units, basestring): # units is a standard_name of a coordinate coord = self.item(units, role='da', exact=True) if coord is None: continue units = coord.Units #--- End: if if units.equivalent(data.Units): data.Units = units else: raise ValueError("asdddddddddddddd 87236768") #--- End: for return ref #--- End: def def analyse(self): ''' Analyse a domain. :Returns: out : dict A desription of the domain. :Examples: >>> print d Axes : time(3) = [1979-05-01 12:00:00, ..., 1979-05-03 12:00:00] gregorian : air_pressure(5) = [850.000061035, ..., 50.0000038147] hPa : grid_longitude(106) = [-20.5400109887, ..., 25.6599887609] degrees : grid_latitude(110) = [23.3200002313, ..., -24.6399995089] degrees Aux coords : latitude(grid_latitude(110), grid_longitude(106)) = [[67.1246607722, ..., 22.8886948065]] degrees_N : longitude(grid_latitude(110), grid_longitude(106)) = [[-45.98136251, ..., 35.2925499052]] degrees_E Coord refs : >>> d.analyse() {'aux_coords': {'N-d': {'aux0': , 'aux1': }, 'dim0': {'1-d': {}, 'N-d': {}}, 'dim1': {'1-d': {}, 'N-d': {}}, 'dim2': {'1-d': {}, 'N-d': {'aux0': , 'aux1': }}, 'dim3': {'1-d': {}, 'N-d': {'aux0': , 'aux1': }}}, 'axis_to_coord': {'dim0': , 'dim1': , 'dim2': , 'dim3': }, 'axis_to_id': {'dim0': 'time', 'dim1': 'air_pressure', 'dim2': 'grid_latitude', 'dim3': 'grid_longitude'}, 'cell_measures': {'N-d': {}, 'dim0': {'1-d': {}, 'N-d': {}}, 'dim1': {'1-d': {}, 'N-d': {}}, 'dim2': {'1-d': {}, 'N-d': {}}, 'dim3': {'1-d': {}, 'N-d': {}}}, 'id_to_aux': {}, 'id_to_axis': {'air_pressure': 'dim1', 'grid_latitude': 'dim2', 'grid_longitude': 'dim3', 'time': 'dim0'}, 'id_to_coord': {'air_pressure': , 'grid_latitude': , 'grid_longitude': , 'time': }, 'id_to_key': {'air_pressure': 'dim1', 'grid_latitude': 'dim2', 'grid_longitude': 'dim3', 'time': 'dim0'}, 'undefined_axes': [], 'warnings': [], } ''' a = {} # ------------------------------------------------------------ # Map each axis identity to its domain identifier, if such a # mapping exists. # # For example: # >>> id_to_axis # {'time': 'dim0', 'height': dim1'} # ------------------------------------------------------------ id_to_axis = {} # ------------------------------------------------------------ # For each dimension that is identified by a 1-d auxiliary # coordinate, map its dimension's its domain identifier. # # For example: # >>> id_to_aux # {'region': 'aux0'} # ------------------------------------------------------------ id_to_aux = {} # ------------------------------------------------------------ # # # For example: # >>> id_to_key # {'region': 'aux0'} # ------------------------------------------------------------ id_to_key = {} # ------------------------------------------------------------ # Map each dimension's identity to the coordinate which # provides that identity. # # For example: # >>> id_to_coord # {'time': } # ------------------------------------------------------------ id_to_coord = {} axis_to_coord = {} aux_to_coord = {} # ------------------------------------------------------------ # # ------------------------------------------------------------ aux_coords = {} aux_coords['N-d'] = {} cell_measures = {} cell_measures['N-d'] = {} # ------------------------------------------------------------ # List the dimensions which are undefined, in that no unique # identity can be assigned to them. # # For example: # >>> undefined_axes # ['dim2'] # ------------------------------------------------------------ undefined_axes = [] # ------------------------------------------------------------ # # ------------------------------------------------------------ warnings = [] for axis in self._axes_sizes: # Find this axis's 1-d and N-d auxiliary coordinates aux_coords[axis] = {} aux_coords[axis]['1-d'] = {} aux_coords[axis]['N-d'] = {} for aux, coord in self.items(role='a', axes=axis).iteritems(): if coord.ndim > 1: aux_coords['N-d'][aux] = coord aux_coords[axis]['N-d'][aux] = coord else: aux_coords[axis]['1-d'][aux] = coord #--- End: for # Find this axis's 1-d and N-d cell measures cell_measures[axis] = {} cell_measures[axis]['1-d'] = {} cell_measures[axis]['N-d'] = {} for msr, cell_measure in self.items(role='m', axes=axis).iteritems(): if cell_measure.ndim > 1: cell_measures['N-d'][msr] = cell_measure cell_measures[axis]['N-d'][msr] = cell_measure else: cell_measures[axis]['1-d'][msr] = cell_measure #--- End: for if axis in self.d: # This axis of the domain has a dimension coordinate dim_coord = self.d[axis] identity = dim_coord.identity() if identity is None: # Dimension coordinate has no identity, but it may # have a recognised axis. for ctype in ('T', 'X', 'Y', 'Z'): if getattr(dim_coord, ctype): identity = ctype break #--- End: if if identity is not None and dim_coord._hasData: if identity in id_to_axis: warnings.append( "Domain has more than one %r axis" % identity) id_to_axis[identity] = axis id_to_key[identity] = axis id_to_coord[identity] = dim_coord axis_to_coord[axis] = dim_coord continue elif len(aux_coords[axis]['1-d']) == 1: # This axis of the domain does not have a dimension # coordinate but it does have exactly one 1-d # auxiliary coordinate, so that will do. aux = list(aux_coords[axis]['1-d'])[0] aux_coord = self.a[aux] identity = aux_coord.identity() if identity is not None and aux_coord._hasData: if identity in id_to_axis: warnings.append( "Domain has more than one %r axis" % identity) id_to_aux[identity] = aux id_to_key[identity] = aux id_to_axis[identity] = axis id_to_coord[identity] = aux_coord axis_to_coord[axis] = aux_coord continue #--- End: if # Still here? Then this axis is undefined undefined_axes.append(axis) #--- End: for # ------------------------------------------------------------ # Invert the mapping between dimensions and identities # ------------------------------------------------------------ axis_to_id = {} for k, v in id_to_axis.iteritems(): axis_to_id[v] = k return {'aux_coords' : aux_coords, 'axis_to_id' : axis_to_id, 'axis_to_coord' : axis_to_coord, 'cell_measures' : cell_measures, 'id_to_aux' : id_to_aux, 'id_to_coord' : id_to_coord, 'id_to_axis' : id_to_axis, 'id_to_key' : id_to_key, 'undefined_axes': undefined_axes, 'warnings' : warnings, } #--- End def # def attach_to_ref(self, ref, item, term=None, **kwargs): # ''' # #Attach a coordinate construct to a coordinate reference. # #:Parameters: # # ref : cf.CoordinateReference # # item, kwargs : *optional* # The coordinate to attach, identified as for the `item` # method. # # term : sequence of str, optional # # #:Returns: # # None # #:Examples: # #>>> t # #>>> d.attach_to_ref(t, 'dim2') #>>> d.attach_to_ref(t, 'longitude', term=['b1']) #>>> d.attach_to_ref(t, ['latitude', 'long_name:latitude'], exact=True) # #''' # kwargs['key'] = True # kwargs['role'] = ('d', 'a') # key = self.item(item, **kwargs) # if key is None: # raise ValueError("Can't find %r coordinate object to attach to %r" % # (item, ref)) # # if term: # for t in term: # ref[t] = key # else: # ref.coords.add(key) # # #--- End: def def get(self, key, *default): '''Return the item corresponding to an internal identifier. An item is a dimension coordinate, an auxiliary coordinate, a cell measure or a coordinate reference object. .. seealso:: `has`, `item` :Parameters: key : str An internal identifier. default : *optional* Return *default* if and only if the domain does not have the given *key*. :Returns: out : The item of the domain with the given internal identifier. If none exists and *default* is set then *default* is returned. :Examples: >>> d.get('dim0') >>> d.get('aux1') >>> d.get('msr0') >>> d.get('ref0') >>> d.get('bad_id') ValueError: Domain doesn't have internal identifier 'bad_id' >>> print d.get('bad_id', None) None ''' if key in self._map: return getattr(self, self._map[key])[key] elif default: return default[0] else: raise ValueError( "Domain doesn't have internal identifier %r" % key) #--- End: def def has(self, key): ''' True if the domain has the given internal identifier. .. seealso:: `get`, 'item`, `items` :Parameters: key : str An internal identifier. :Returns: out : bool Whether or not the domain has the internal identifier. :Examples: >>> d.items().keys() ['dim0', 'aux0', 'aux1', 'ref0'] >>> d.has('dim0') True >>> d.has('aux2') False ''' return key in self._map #--- End: def def axis_name(self, axes=None, **kwargs): ''' Return the canonical name for an axis. :Parameters: axis, kwargs : optional Select the axis which would be selected by this call of the domain's `~cf.Domain.axis` method: ``d.axis(axis, **kwargs)``. See `cf.Domain.axis` for details. :Returns: out : str The canonical name for the axis. :Examples: >>> d.axis_name('dim0') 'time' >>> d.axis_name('dim1') 'domain%dim1' >>> d.axis_name('dim2') 'ncdim%lat' ''' axis = self.axis(axes, **kwargs) if axis is None: raise ValueError("No unique axis could be identified") dim = self.item(role='d', axes_all=axis) if dim is not None: # Get the name from the dimension coordinate return dim.name('domain%%%s' % axis) aux = self.item(role='a', axes_all=axis) if aux is not None: # Get the name from the unique 1-d auxiliary coordinate return aux.name('domain%%%s' % axis) else: try: # Get the name from netCDF dimension name return 'ncdim%%%s' % self.nc_dimensions[axis] except (KeyError, AttributeError): # Get the name from axis domain identifier return 'domain%%%s' % axis #--- End: def def axis_identity(self, axis=None, **kwargs): ''' Return the canonical name for an axis. :Parameters: axis, kwargs : optional Select the axis which would be selected by this call of the domain's `~cf.Domain.axis` method: ``d.axis(axis, **kwargs)``. See `cf.Domain.axis` for details. :Returns: out : str The canonical name for the axis. :Examples: ''' axis = self.axis(axis, **kwargs) if axis is None: raise ValueError("No unique axis could be identified") dim = self.item(role='d', axes_all=axis) if dim is not None: # Get the identity from the dimension coordinate return dim.identity() aux = self.item(role='a', axes_all=axis) if aux is not None: # Get the identity from the unique 1-d auxiliary coordinate return aux.identity() return None #--- End: def def direction(self, axis): ''' Return True if an axis is increasing, otherwise return False. An axis is considered to be increasing if its dimension coordinate values are increasing in index space or if it has no dimension coordinate. .. seealso:: `directions` :Parameters: axis : str A domain axis identifier, such as ``'dim0'``. :Returns: out : bool Whether or not the axis is increasing. :Examples: >>> d._axes_sizes {'dim0': 3, 'dim1': 1, 'dim2': 2, 'dim3': 2, 'dim4': 99} >>> d.items_axes() {'dim0': ['dim0'], 'dim1': ['dim1'], 'aux0': ['dim0'], 'aux1': ['dim2'], 'aux2': ['dim3'], } >>> d['dim0'].array array([ 0 30 60]) >>> d.direction('dim0') True >>> d['dim1'].array array([15]) >>> d['dim1'].bounds.array array([ 30 0]) >>> d.direction('dim1') False >>> d['aux1'].array array([0, -1]) >>> d.direction('dim2') True >>> d['aux2'].array array(['z' 'a']) >>> d.direction('dim3') True >>> d.direction('dim4') True ''' if axis in self.d: return self.d[axis].direction() return True #--- End: def def directions(self): ''' Return a dictionary mapping axes to their directions. .. seealso:: `direction` :Returns: out : dict A dictionary whose key/value pairs are axis identifiers and their directions. :Examples: >>> d.directions() {'dim1': True, 'dim0': False} ''' self_direction = self.direction directions = {} for axis in self._axes_sizes: directions[axis] = self_direction(axis) return directions #--- End: def def map_axes(self, other): ''' Map the axis identifiers of the domain to their equivalent axis identifiers of another. :Parameters: other : cf.Domain :Returns: out : dict A dictionary whose keys are the axis identifiers of the domain with corresponding values of axis identifiers of the of other domain. :Examples: >>> d.map_axes(e) {'dim0': 'dim1', 'dim1': 'dim0', 'dim2': 'dim2'} ''' s = self.analyse() t = other.analyse() out = {} for identity, dim in s['id_to_axis'].iteritems(): if identity in t['id_to_axis']: out[dim] = t['id_to_axis'][identity] #--- End: for return out #--- End: def def insert_axis(self, size, key=None, replace=True): ''' Insert an axis into the domain in place. This method has exactly the same interface, functionality and outputs as `cf.Field.insert_axis`. Therefore see `cf.Field.insert_axis` for the full documentation details. .. seealso:: `insert_aux`, insert_measure`, insert_dim`, insert_ref` :Examples 1: >>> d.insert_axis(24) :Parameters: size : int The size of the new axis. key : str, optional The domain identifier for the new axis. By default a new, unique identifier is generated. replace : bool, optional If False then do not replace an existing axis with the same identifier but a different size. By default an existing axis with the same identifier is changed to have the new size. :Returns: out : The domain identifier of the new axis. :Examples 2: See `cf.Field.insert_axis`. ''' if key is not None: if (key in self._axes_sizes and not replace and self._axes_sizes[key] != size): raise ValueError( "Can't insert axis: Existing axis %r has different size (got %d, expected %d)" % (key, size, self._axes_sizes[key])) self._axes_sizes[key] = size return key # Still here? Then no identifier was specified for the # dimension, so create a new one. key = self.new_axis_identifier() self._axes_sizes[key] = size return key #--- End: def def new_axis_identifier(self): ''' Return a new, unique axis identifier for the domain. .. seealso:: `new_aux_identifier`, `new_measure_identifier`, `new_dim_identifier`, `new_ref_identifier` The domain is not updated. :Returns: out : str The new identifier. :Examples: >>> d._axes_sizes.keys() ['dim2', 'dim0'] >>> d.new_axis_identifier() 'dim3' >>> d._axes_sizes.keys() [] >>> d.new_axis_identifier() 'dim0' ''' dimensions = self._axes_sizes n = len(dimensions) new_key = 'dim%d' % n while new_key in dimensions: n += 1 new_key = 'dim%d' % n #--- End: while return new_key #--- End: def def new_aux_identifier(self): ''' Return a new, unique auxiliary coordinate identifier for the domain. .. seealso:: `new_measure_identifier`, `new_dimemsion_identifier`, `new_ref_identifier` The domain is not updated. :Returns: out : str The new identifier. :Examples: >>> d.items(role='a').keys() ['aux2', 'aux0'] >>> d.new_aux_identifier() 'aux3' >>> d.items(role='a').keys() [] >>> d.new_aux_identifier() 'aux0' ''' keys = self.a n = len(keys) new_key = 'aux%d' % n while new_key in keys: n += 1 new_key = 'aux%d' % n #--- End: while return new_key #--- End: def def new_measure_identifier(self): ''' Return a new, unique cell measure identifier for the domain. The domain is not updated. .. seealso:: `new_aux_identifier`, `new_axis_identifier`, `new_ref_identifier` :Returns: out : str The new identifier. :Examples: >>> d.items(role='m').keys() ['msr2', 'msr0'] >>> d.new_measure_identifier() 'msr3' >>> d.items(role='m').keys() [] >>> d.new_measure_identifier() 'msr0' ''' keys = self.m n = len(keys) new_key = 'msr%d' % n while new_key in keys: n += 1 new_key = 'msr%d' % n #--- End: while return new_key #--- End: def def new_ref_identifier(self): ''' Return a new, unique coordinate reference identifier for the domain. The domain is not updated. .. seealso:: `new_aux_identifier`, `new_axis_identifier`, `new_measure_identifier` :Returns: out : str The new identifier. :Examples: >>> d.items(role='r').keys() ['ref1'] >>> d.new_ref_identifier() 'ref2' >>> d.items(role='r').keys() [] >>> d.new_ref_identifier() 'ref0' ''' if not self.r: return 'ref0' keys = self.r n = len(keys) new_key = 'ref%d' % n while new_key in keys: n += 1 new_key = 'ref%d' % n #--- End: while return new_key #--- End: def def insert_coord(self, variable, key, copy=True, axes=None): ''' Insert a dimension coordinate or auxiliary coordinate into the domain in place. :Parameters: variable : cf.AuxiliaryCoordinate or cf.DimensionCoordinate or cf.Coordinate The new dimension coordinate or auxiliary coordinate. If required, it will be converted to the appropiate object type (dimension coordinate or auxiliary). key : str The identifier for the new coordinate. The identifier must start with the string ``dim`` or ``aux``, corresponding to whether the *variable* is to be a dimension coordinate or an auxiliary coordinate respectively. axes : list, optional If the *variable* is an auxiliary coordinate then the identities of its dimensions must be provided. Ignored if the *variable* is a dimension coordinate. copy: bool, optional If False then the *variable* is not copied before insertion. By default it is copied. :Returns: None :Examples: >>> ''' if key.startswith('d'): self.insert_dim(variable, key=key, copy=copy) elif key.startswith('a'): self.insert_aux(variable, key=key, axes=axes, copy=copy) else: raise ValueError("bad key in insert_coord: %r" % key) #--- End: def def insert_dim(self, item, key=None, axis=None, copy=True, replace=True): ''' Insert a dimension coordinate to the domain in place. :Parameters: item: cf.DimensionCoordinate or cf.Coordinate or cf.AuxiliaryCoordinate The new coordinate. If not a dimension coordinate object then it will be converted to one. axis : str, optional key : str, optional The identifier for the new dimension coordinate. The identifier is of the form ``'dimN'`` where the ``N`` part should be replaced by an arbitrary integer greater then or equal to zero. By default a unique identifier will be generated. copy: bool, optional If False then the dimension coordinate is not copied before insertion. By default it is copied. replace : bool, optional If False then do not replace an existing dimension coordinate with the same identifier. By default an existing dimension coordinate with the same identifier is replaced with *coord*. :Returns: out : str The identifier for the new dimension coordinate (see the *key* parameter). :Examples: >>> ''' item = item.asdimension(copy=copy) if key is None: key = axis elif axis is not None and key != axis: raise ValueError("Incompatible key and axis parameters: %r, %r" % (key, axis)) if key is None: key = self.insert_axis(item.size) else: if key in self.d and not replace: raise ValueError( "Can't insert dimension coordinate object: replace=%s and %r identifier already exists" % (replace, key)) self.insert_axis(item.size, key, replace=False) #--- End: if dimensions = self._axes dimensions[key] = [key] # ------------------------------------------------------------ # Turn a scalar dimension coordinate into size 1, 1-d # ------------------------------------------------------------ if item.isscalar: item.expand_dims(0, i=True) self.d[key] = item self._map[key] = 'd' refs = self.r if refs: for ref in refs.itervalues(): self._conform_ref(ref) return key #--- End: def def _insert_item(self, variable, key, role, axes=None, copy=True, replace=True): ''' Insert a new auxiliary coordinate into the domain in place, preserving internal consistency. :Parameters: coord :cf.Coordinate The new auxiliary coordinate. key : str The identifier for the auxiliary coordinate or cell measure. role : str axes : sequence, optional The ordered axes of the new coordinate. Ignored if the coordinate is a dimension coordinate. Required if the coordinate is an auxiliary coordinate. copy: bool, optional If False then the auxiliary coordinate is not copied before insertion. By default it is copied. replace : bool, optional If False then do not replace an existing dimension coordinate with the same identifier. By default an existing dimension coordinate with the same identifier is replaced with *coord*. :Returns: out : str The identifier for the new auxiliary coordinate (see the 'key' parameter). :Examples: >>> ''' if key in self._axes and not replace: raise ValueError( "Can't insert %s: %r identifier already exists" % (role, key)) ndim = variable.ndim if not ndim: ndim = 1 if axes is None: # -------------------------------------------------------- # The axes have not been set => infer the axes. # -------------------------------------------------------- variable_shape = variable.shape if (not variable_shape or len(variable_shape) != len(set(variable_shape))): raise ValueError( "Ambiguous %s shape: %s. Consider setting the axes parameter." % (variable.__class__.__name__, variable_shape)) axes = [] axes_sizes = self._axes_sizes.values() for n in variable_shape: if axes_sizes.count(n) == 1: axes.append(self.axis(size=n)) else: raise ValueError( "Ambiguous %s shape: %s. Consider setting the axes parameter." % (variable.__class__.__name__, variable_shape)) #--- End: for else: # Axes have been provided axes = self.axes(axes, ordered=True) if len(set(axes)) != ndim: raise ValueError( "Can't insert %s: Mismatched number of axes (%d != %d)" % (role, len(set(axes)), ndim)) aux_axes = [] for axis, size in izip_longest(axes, variable.shape, fillvalue=1): axis_size = self.axis_size(axis) if size != axis_size: raise ValueError( "Can't insert %s: Mismatched axis size (%d != %d)" % (role, size, axis_size)) aux_axes.append(axis) #--- End: for axes = aux_axes #--- End: if n_axes = len(set(axes)) if not (ndim == n_axes or (ndim == 0 and n_axes == 1)): raise ValueError( "Can't insert %s: Mismatched number of axes (%d != %d)" % (role, n_axes, ndim)) self._axes[key] = axes if not variable.ndim: # Turn a scalar item into size 1, 1-d, copying it # required. variable = variable.expand_dims(0, i=(not copy)) elif copy: # Copy the variable variable = variable.copy() return variable #--- End: def def inspect(self): ''' Inspect the object for debugging. .. seealso:: `cf.inspect` :Returns: None ''' print cf_inspect(self) #--- End: def def items(self, items=None, role=None, axes=None, axes_all=None, axes_subset=None, axes_superset=None, ndim=None, match_and=True, exact=False, inverse=False, copy=False, strict_axes=False, _restrict_inverse=False): ''' Return items of the domain. .. seealso:: `axes`, `item`, `remove_items` :Parameters: {+items} {+role} {+axes} {+axes_all} {+axes_subset} {+axes_superset} {+ndim} {+exact} {+match_and} {+inverse} {+copy} :Returns: out : dict A dictionary whose keys are domain item identifiers with corresponding values of items of the domain. The dictionary may be empty. :Examples: See `cf.Field.items`. All of these examples are for the same domain, whose complete dictionary of items is shown in the first example. >>> d.items() {{'dim0': , 'dim1': , 'dim2': , 'aux0': , 'aux1': , 'aux2': 'msr0': , 'ref0': }} >>> d.items(axes='grid_latitude') {{'dim0': , 'aux0': , 'aux1': degrees_N, 'msr0': }} >>> d.items(axes='grid_latitude', ndim=1) {{'dim0': }} >>> d.items(axes='grid_latitude', strict_axes=True) {{'dim0': }} >>> d.items(axes='time') {{'dim2': , 'aux2': }} >>> d.items(axes='time', role='d') {{'dim2': }} >>> d.items(axes='area') {{'aux0': , 'aux1': , 'msr0': }} >>> d.items(axes=['grid_latitude', 'grid_longitude']) {{'aux0': , 'aux1': , 'msr0': }} >>> d.items('grid') {{'dim0': , 'dim1': }} >>> d.items('grid', exact=True) {{}} >>> d.items({{'units': 'degrees_E'}}) {{'dim0': , 'dim1': , 'aux0': , 'aux1': degrees_N}} >>> d.items({{'units': 'degrees_E'}}, exact=True) {{'aux0': }} >>> d.items({{'units': 'radians', 'standard_name': 'time'}}) {{}} >>> d.items({{'units': 'radians', 'standard_name': 'time'}}, maximal_match=False) {{'dim0': , 'dim1': , 'dim2': , 'aux0': , 'aux1': degrees_N}} >>> d.items({{'units': 'radians', 'standard_name': 'time'}}, maximal_match=False, exact=True) {{'dim2': }} >>> set(d.items(role='da')) == set(d.items(role='ct', inverse=True)) True ''' if strict_axes: axes_all = axes print "WARNING: strict_axes has been deprecated. Replace the axes parameter with the axes_all parameter instead." pool = {} for r in ('d', 'a', 'm', 'r'): pool.update(getattr(self, r)) if inverse: if not _restrict_inverse or role is None: master = pool.copy() else: master = {} for r in role: master.update(getattr(self, r)) #--- End: if if items is None and axes is None and role is None and ndim is None: out = pool.copy() else: out = {} if pool and role is not None: # -------------------------------------------------------- # Select items which have a given role # -------------------------------------------------------- out = {} for r in role: out.update(getattr(self, r)) if match_and: pool = out else: for key in out: del pool[key] #--- End: if if pool and axes is not None: # -------------------------------------------------------- # Select items which span at least one of the given axes, # and possibly others. # -------------------------------------------------------- axes_out = {} if not isinstance(axes, dict): axes = {'axes': axes} axes_tmp = self.axes(**axes) if axes_tmp: domain_axes = self._axes for key, value in pool.iteritems(): if axes_tmp.intersection(domain_axes.get(key, ())): axes_out[key] = value #--- End: if if match_and: out = pool = axes_out else: for key in axes_out: out[key] = pool.pop(key) #--- End: if if pool and axes_subset is not None: # -------------------------------------------------------- # Select items whose data array spans all of the specified # axes, taken in any order, and possibly others. # -------------------------------------------------------- axes_out = {} if not isinstance(axes_subset, dict): axes_subset = {'axes': axes_subset} axes_tmp = self.axes(**axes_subset) if axes_tmp: domain_axes = self._axes for key, value in pool.iteritems(): if axes_tmp.issubset(domain_axes.get(key, ())): axes_out[key] = value #--- End: if if match_and: out = pool = axes_out else: for key in axes_out: out[key] = pool.pop(key) #--- End: if if pool and axes_superset is not None: # -------------------------------------------------------- # Select items whose data array spans a subset of the # specified axes, taken in any order, and no others. # -------------------------------------------------------- axes_out = {} if not isinstance(axes_superset, dict): axes_superset = {'axes': axes_superset} axes_tmp = self.axes(**axes_superset) if axes_tmp: domain_axes = self._axes for key, value in pool.iteritems(): if axes_tmp.issuperset(domain_axes.get(key, (None,))): axes_out[key] = value #--- End: if if match_and: out = pool = axes_out else: for key in axes_out: out[key] = pool.pop(key) #--- End: if if pool and axes_all is not None: # -------------------------------------------------------- # Select items which span all of the given axes and no # others # -------------------------------------------------------- axes_out = {} if not isinstance(axes_all, dict): axes_all = {'axes': axes_all} axes_tmp = self.axes(**axes_all) if axes_tmp: domain_axes = self._axes for key, value in pool.iteritems(): if axes_tmp == set(domain_axes.get(key, ())): axes_out[key] = value #--- End: if if match_and: out = pool = axes_out else: for key in axes_out: out[key] = pool.pop(key) #--- End: if if pool and ndim is not None: # -------------------------------------------------------- # Select items whose number of data array axes satisfies a # condition # -------------------------------------------------------- domain_axes = self._axes ndim_out = {} for key, item in pool.iteritems(): if ndim == len(domain_axes.get(key, ())): ndim_out[key] = item #--- End: for if match_and: out = pool = ndim_out else: for key in ndim_out: out[key] = pool.pop(key) #--- End: if if pool and items is not None: # -------------------------------------------------------- # Select items whose properties satisfy conditions # -------------------------------------------------------- items_out = {} if isinstance(items, (basestring, dict, Query)): items = (items,) if items: pool2 = pool.copy() match = [] for m in items: if m.__hash__ and m in pool: # m is a domain item identifier items_out[m] = pool2.pop(m) else: match.append(m) #--- End: for if match and pool: for key, item in pool2.iteritems(): if item.match(match, exact=exact): # This item matches the critieria items_out[key] = item #--- End: if if match_and: out = pool = items_out else: for key in items_out: out[key] = pool.pop(key) #--- End: if #--- End: if if inverse: # -------------------------------------------------------- # Select items other than those previously selected # -------------------------------------------------------- for key in out: del master[key] out = master #--- End: if if copy: # -------------------------------------------------------- # Copy the items # -------------------------------------------------------- out2 = {} for key, item in out.iteritems(): out2[key] = item.copy() out = out2 #--- End: if # ------------------------------------------------------------ # Return the selected items # ------------------------------------------------------------ return out #--- End: def def ref_axes(self, key): '''Return the axes spanned by the coordinate object inputs of a coordinate reference object. :Parameters: key : str A coordinate reference domain identifier. *Example:* To select the coordinate reference with domain identifier "ref1": ``key='ref1'``. :Returns: out : set A set of the domain identifiers of the axes spanned by the coordinate reference's coordinates. :Examples: >>> key = d.item('rotated_latitude_longitude', key=True) >>> d.ref_axes(key) set(['dim2', 'dim1']) ''' axes = self._axes raxes = [] for ckey in self.r[key].coords: raxes.extend(axes.get(ckey, ())) return set(raxes) #--- End: def def insert_aux(self, item, key=None, axes=None, copy=True, replace=True): ''' Insert a auxiliary coordinate into the domain in place. :Parameters: coord : cf.AuxiliaryCoordinate or cf.Coordinate or cf.DimensionCoordinate The new coordinate. If not an auxiliary coordinate object then it will be converted to one. key : str, optional The identifier for the new dimension coordinate. The identifier is of the form ``'auxN'`` where the ``N`` part should be replaced by an arbitrary integer greater then or equal to zero. By default a unique identifier will be generated. axes : list, optional The ordered axes of the new coordinate. Ignored if the coordinate is a dimension coordinate. Required if the coordinate is an auxiliary coordinate. copy: bool, optional If False then the auxiliary coordinate is not copied before insertion. By default it is copied. replace : bool, optional If False then do not replace an existing auxiliary coordinate with the same identifier. By default an existing auxiliary coordinate with the same identifier is replaced with *coord*. :Returns: out : str The identifier for the new auxiliary coordinate (see the *key* parameter). :Examples: >>> ''' item = item.asauxiliary(copy=copy) if not key: key = self.new_aux_identifier() item = self._insert_item(item, key, 'auxiliary coordinate', axes=axes, copy=False) self.a[key] = item self._map[key] = 'a' refs = self.r if refs: for ref in refs.itervalues(): self._conform_ref(ref) return key #--- End: def def insert_measure(self, item, key=None, axes=None, copy=True, replace=True): '''Insert a cell measure into the domain in place. :Parameters: item : cf.CellMeasure The new cell measure. key : str, optional The identifier for the new cell measure. The identifier is of the form ``'msrN'`` where the ``N`` part should be replaced by an arbitrary integer greater then or equal to zero. By default a unique identifier will be generated. axes : sequence, optional The ordered axes of the new cell measure. copy : bool, optional If False then the cell measure is not copied before insertion. By default it is copied. replace : bool, optional If False then do not replace an existing cell measure with the same identifier. By default an existing cell measure with the same identifier is replaced with *item*. :Returns: out : str The identifier for the new cell measure (see the *key* parameter). :Examples: >>> ''' if key is None: key = self.new_measure_identifier() item = self._insert_item(item, key, 'cell measure', axes=axes, copy=copy) self.m[key] = item self._map[key] = 'm' return key #--- End: def def insert_ref(self, item, key=None, copy=True, replace=False): ''' Insert a coordinate reference object into the domain in place. :Parameters: item : cf.CoordinateReference The new coordinate reference object. key : str, optional The identifier for the new coordinate reference object. By default a unique identifier will be generated. copy : bool, optional If False then the coordinate reference object is not copied before insertion. By default it is copied. replace : bool, optional If True then replace an existing coordinate reference object with the same identifier. By default an exception is raised if there is an existing coordinate reference object with the same identifier. :Returns: out : str The internal identifier of the new coordinate reference object. :Examples: >>> ''' if key is None: key = self.new_ref_identifier() elif not replace and key in self.r: raise ValueError( "Can't insert coordinate reference object: replace=%s and %r identifier already exists" % (replace, key)) if copy: item = item.copy() self._conform_ref(item) self.r[key] = item self._map[key] = 'r' return key #--- End: def def remove_axes(self, axes=None, **kwargs): ''' Remove and return axes from the domain. This method has exactly the same interface, functionality and outputs as `cf.Field.remove_axes`. Therefore see `cf.Field.remove_axes` for the full documentation details. .. seealso:: `axes`, `remove_axis`, `remove_item`, `remove_items` :Parameters: axes, kwargs : *optional* See `cf.Field.remove_axes`. :Returns: out : set The removed axes. The set may be empty. :Examples: See `cf.Field.remove_axes`. ''' d = self # ------------------------------------------------------------ # Find the domain axis identifiers # ------------------------------------------------------------ axes = d.axes(axes, **kwargs) if not axes: return set() if axes.intersection(d._axes.get('data', ())): raise ValueError( "Can't remove an axis which is spanned by the data array") axes_sizes = d._axes_sizes for axis in axes: if (axes_sizes[axis] > 1 and d.items(role=('d', 'a', 'm'), ndim=gt(1), axes=axis)): raise ValueError( "Can't remove an axis with size > 1 which is spanned by a multidimensional item") #--- End: for items = d.items(role=('d', 'a', 'm'), axes=axes) for key, item in items.iteritems(): item_axes = d._axes[key] # Remove the item if it only spans removed axes if axes.issuperset(item_axes): d.remove_item(key) continue # Still here? Then squeeze removed axes from the # multidimensional item. iaxes = [item_axes.index(axis) for axis in axes if axis in item_axes] item.squeeze(iaxes, i=True) # item.squeeze(axes.intersection(item_axes)) # if not item.ndim: # # Remove the multidimensional item if it doesn't span # # any axes after being squeezed # d.remove_item(key) # else: # Remove the removed axes from the multidimensional item's # list of axes for axis in axes.intersection(item_axes): item_axes.remove(axis) ##--- End: for #if not item_axes: # # Remove the item if it doesn't span any axes # # after being squeezed # d.remove_item(key) #--- End: for # ------------------------------------------------------------ # Remove the axes # ------------------------------------------------------------ for axis in axes: del axes_sizes[axis] return axes #--- End: def def remove_axis(self, axes=None, **kwargs): ''' Remove and return an axis from the domain. This method has exactly the same interface, functionality and outputs as `cf.Field.remove_axis`. Therefore see `cf.Field.remove_axis` for the full documentation details. .. seealso:: `axis`, `remove_axes`, `remove_item`, `remove_items` :Parameters: axes, kwargs : *optional* See `cf.Field.remove_axis`. :Returns: out : The domain identifier of the removed axis, or None if there isn't one. :Examples: See `cf.Field.remove_axis`. ''' axis = self.axis(axes, **kwargs) if axis is None: return return self.remove_axes(axis).pop() #--- End: def def remove_item(self, items=None, key=False, **kwargs): ''' Remove and return an item from the domain. This method has exactly the same interface, functionality and outputs as `cf.Field.remove_item`. Therefore see `cf.Field.remove_item` for the full documentation details. .. seealso:: `item`, `remove_axes`, `remove_axis`, `remove_items` :Parameters: items, kwargs : *optional* See `cf.Field.remove_item`. :Returns: out : The removed item, or None if no unique item could be found. :Examples: See `cf.Field.remove_item`. >>> d.items() {'dim0': , 'dim1': , 'dim2': , 'aux0': , 'aux1': , 'aux2': 'msr0': , 'ref0': } >>> d.remove_item('grid_long') >>> d.remove_item('aux1') >>> d.remove_item('T') >>> d.remove_item('longitude', role='a', exact=True) >>> d.remove_item('rotated_latitude_longitude') >>> d.remove_item({None: 'area', 'units': 'km2'}) >>> d.items() {'dim0': } ''' items = self.items(items, **kwargs) if not items: return item_key = items.popitem()[0] if items: return items = self.remove_items(item_key).popitem() if key: return items[0] else: return items[1] #--- End: def def remove_items(self, items=None, **kwargs): '''Remove and return items from the domain. This method has exactly the same interface, functionality and outputs as `cf.Field.remove_items`. Therefore see `cf.Field.remove_items` for the full documentation details. .. seealso:: `items`, `remove_axes`, `remove_axis`, `remove_item` :Parameters: items, kwargs : *optional* See `cf.Field.remove_items`. :Returns: out : dict A dictionary whose keys are domain item identifiers with corresponding values of the removed items of the domain. The dictionary may be empty. :Examples: See `cf.Field.remove_items`. ''' out = {} for key, item in self.items(items, **kwargs).iteritems(): x = self._map[key] # If the removed item is a dimension of auxiliary # coordinate then ..... if x in 'da': self._replace_refs_coord_identifier(key) del self._map[key] self._axes.pop(key, None) del getattr(self, x)[key] out[key] = item #--- End: if return out #--- End: def def copy(self): ''' Return a deep copy. ``d.copy()`` is equivalent to ``copy.deepcopy(d)``. :Returns: out : The deep copy. :Examples: >>> e = d.copy() ''' X = type(self) new = X.__new__(X) new._axes = {} for key, value in self._axes.iteritems(): new._axes[key] = value[:] new._axes_sizes = self._axes_sizes.copy() new._map = self._map.copy() new.d = {} for key, value in self.d.iteritems(): new.d[key] = value.copy() new.a = {} for key, value in self.a.iteritems(): new.a[key] = value.copy() new.m = {} for key, value in self.m.iteritems(): new.m[key] = value.copy() new.r = {} for key, value in self.r.iteritems(): new.r[key] = value.copy() nc_dimensions = getattr(self, 'nc_dimensions', None) if nc_dimensions: new.nc_dimensions = nc_dimensions.copy() else: new.nc_dimensions = {} return new #--- End: def def close(self): ''' Close all referenced open data files. :Returns: None :Examples: >>> d.close() ''' for item in self.items().itervalues(): item.close() #--- End: def def item(self, items=None, key=False, **kwargs): ''' Return an item of the domain, or its domain identifier. This method has exactly the same interface, functionality and outputs as `cf.Field.item`. Therefore see `cf.Field.item` for the full documentation details. .. seealso:: `axis`, `items`, `remove_item` :Parameters: items, kwargs : *optional* See `cf.Field.item`. key : bool, option See `cf.Field.item`. :Returns: out : See `cf.Field.item`. :Examples: See `cf.Field.items`. The following examples are base on the following domain: >>> d.items() {'dim0': , 'dim2': , 'aux0': , 'aux1': , 'msr0': , 'ref0': } >>> d.item('longitude') >>> d.item('long') >>> d.item('long', key=True) 'dim2' >>> d.item('lon', exact=True) None >>> d.item('longitude', exact=True) >>> d.item('msr0') >>> d.item({'units': 'degrees'}) None >>> d.item({'units': 'degreeN'}) >>> d.item(axes='time') >>> d.item(axes='grid_latitude') None >>> d.item(axes='grid_latitude', strict_axes=True) >> d.item(axes='grid_longitude', ndim=1, key=True) 'dim1' ''' d = self.items(items, **kwargs) if not d: return items = d.popitem() if d: return if key: return items[0] else: return items[1] #--- End: def def items_axes(self, items=None, **kwargs): ''' Return the axes of a domain item. This method has exactly the same interface, functionality and outputs as `cf.Field.item_axes`. Therefore see `cf.Field.item_axes` for the full documentation details. .. seealso:: `axes`, `data_axes`, `item` :Parameters: item, kwargs : *optional* See `cf.Field.item_axes`. :Returns: out : list or None The ordered list of axes for the item or, if there is no unique item or the item is a coordinate reference, then None is returned. :Examples: See `cf.Field.item_axes`. ''' kwargs.setdefault('role', ('d', 'a', 'm')) keys = self.items(items, **kwargs).keys() _items_axes = self._axes out = {} for key in keys: out[key] = _items_axes[key][:] return out #--- End: def def item_axes(self, items=None, **kwargs): ''' Return the axes of a domain item. This method has exactly the same interface, functionality and outputs as `cf.Field.item_axes`. Therefore see `cf.Field.item_axes` for the full documentation details. .. seealso:: `axes`, `data_axes`, `item` :Parameters: items, kwargs : *optional* See `cf.Field.item_axes`. :Returns: out : list or None The ordered list of axes for the item or, if there is no unique item or the item is a coordinate reference, then None is returned. :Examples: See `cf.Field.item_axes`. ''' kwargs['key'] = True key = self.item(items, **kwargs) if key is not None and self._map[key] != 'r': return self._axes[key][:] #--- End: def def data_axes(self): ''' Return the axes of the field's data array. This method has exactly the same interface, functionality and outputs as `cf.Field.data_axes`. Therefore see `cf.Field.data_axes` for the full documentation details. .. seealso:: `axes`, `item_axes` :Returns: out : list or None The ordered axes of the field's data array. If there is no data array then None is returned. :Examples: See `cf.Field.data_axes`. ''' axes = self._axes.get('data', None) if axes is not None: return axes[:] #--- End: def def axes(self, axes=None, size=None, ordered=False, **kwargs): ''' Return domain axis identifiers. This method has exactly the same interface, functionality and outputs as `cf.Field.axes`. See `cf.Field.axes` for details. .. seealso:: `axis`, `items`, `remove_axes` :Parameters: axes, kwargs: *optional* See `cf.Field.axes`. size : int or cf.Query, optional See `cf.Field.axes`. ordered : bool, optional See `cf.Field.axes`. :Returns: out : set or list A set of domain axis identifiers, or a list if *ordered* is True. The set or list may be empty. :Examples: See `cf.Field.axes`. ''' def _axes(self, axes, size, item_axes, axes_sizes, kwargs): a = None if axes is not None: if axes.__hash__: if isinstance(axes, slice): try: a = tuple(item_axes.get('data', ())[axes]) except IndexError: a = () elif axes in axes_sizes: # -------------------------------------------- # axes is a domain axis identifier # -------------------------------------------- a = (axes,) elif axes in item_axes and not kwargs: # -------------------------------------------- # axes is a domain item identifier # -------------------------------------------- a = item_axes[axes] elif isinstance(axes, slice): # -------------------------------------------- # axes is a slice object # -------------------------------------------- a = item_axes.get('data', ())[axes] else: # -------------------------------------------- # See if axes is an integer # -------------------------------------------- try: a = (item_axes.get('data', ())[axes],) except IndexError: a = () except TypeError: pass #--- End: if elif not kwargs: a = tuple(axes_sizes) #--- End: if if a is None: # ---------------------------------------------------- # Assume that axes is a value accepted by the items # method # ---------------------------------------------------- a = [] for key in self.items(axes, **kwargs): a += item_axes.get(key, ()) #--- End: if if size: a = [axis for axis in a if size == axes_sizes[axis]] return a #--- End: def if kwargs: kwargs['axes'] = None item_axes = self._axes axes_sizes = self._axes_sizes if axes is None or isinstance(axes, (basestring, dict, slice, int, long)): # -------------------------------------------------------- # axes is not a sequence or a set # -------------------------------------------------------- a = _axes(self, axes, size, item_axes, axes_sizes, kwargs) else: # -------------------------------------------------------- # axes is a sequence or a set # -------------------------------------------------------- a = [] for x in axes: a += _axes(self, x, size, item_axes, axes_sizes, kwargs) #--- End: if if not ordered: return set(a) else: return list(a) #--- End: def def axis(self, axes=None, size=None, **kwargs): ''' Return a domain axis identifier. The axis may be selected with the keyword arguments. When multiple criteria are given, the axis will be the intersection of the selections. If no unique axis can be found then None is returned. .. seealso:: `axes`, `item`, `items`, `remove_item` :Parameters: {+axes, kwargs} :Returns: out : str The unique domain axis identifier. If there isn't a unique axis then None is returned. :Examples: ''' axes = self.axes(axes, size=size, **kwargs) if not axes: return axis = axes.pop() if not axes: return axis else: return #--- End: def def axes_sizes(self, axes=None, size=None, key=False, **kwargs): ''' ''' out = {} axes = self.axes(axes, size=size, **kwargs) for axis in axes: out[axis] = self._axes_sizes[axis] if not key: out2 = {} for axis, size in out.iteritems(): out2[self.axis_name(axis)] = size return out2 #--- End: if return out #--- End: def def axis_size(self, axes=None, **kwargs): ''' ''' axis = self.axis(axes, **kwargs) if axis is None: return None return self._axes_sizes[axis] #--- End: def def expand_dims(self, coord=None, size=1, copy=True): ''' Expand the domain with a new dimension in place. The new dimension may by of any size greater then 0. :Parameters: coord : cf.Coordinate, optional A dimension coordinate for the new dimension. The new dimension's size is set to the size of the coordinate's array. size : int, optional The size of the new dimension. By default a dimension of size 1 is introduced. Ignored if *coord* is set. :Returns: None :Examples: >>> d.expand_dims() >>> d.expand_dims(size=12) >>> c >>> d.expand_dims(coord=c) ''' if coord: self.insert_dim(coord, copy=copy) else: self.insert_axis(size) #--- End: def def dump_axes(self, display=True, _level=0): ''' Return a string containing a description of the domain. :Parameters: display : bool, optional If False then return the description as a string. By default the description is printed. :Returns: out : str A string containing the description. :Examples: ''' indent1 = ' ' * _level indent2 = ' ' * (_level+1) string = ['%sAxes:' % indent1] data_axes = self._axes.get('data', ()) w = sorted(["{0}{1}({2})".format(indent2, self.axis_name(axis), size) for axis, size in self._axes_sizes.iteritems() if axis not in data_axes]) x = ["{0}{1}({2})".format(indent2, self.axis_name(axis), self._axes_sizes[axis]) for axis in data_axes] string = '\n'.join(string + w + x) if display: print string else: return string #--- End: def def dump_components(self, complete=False, display=True, _level=0): ''' Return a string containing a full description of the domain. :Parameters: complete : bool, optional display : bool, optional If False then return the description as a string. By default the description is printed. :Returns: out : str A string containing the description. :Examples: ''' indent1 = ' ' * _level string = [] # Dimension coordinates for key, value in sorted(self.d.iteritems()): string.append('') string.append('%sDimension coordinate: %s' % (indent1, value.name(''))) string.append(value.dump(display=False, domain=self, key=key, _level=_level+1)) # Auxiliary coordinates for key, value in sorted(self.a.iteritems()): string.append('') string.append('%sAuxiliary coordinate: %s' % (indent1, value.name(''))) string.append(value.dump(display=False, domain=self, key=key, _level=_level+1)) # Cell measures for key, value in sorted(self.m.iteritems()): string.append('') string.append(value.dump(display=False, domain=self, key=key, _level=_level)) # Coordinate references for key, value in sorted(self.r.iteritems()): string.append('') string.append(value.dump(display=False, complete=complete, domain=self, _level=_level)) return '\n'.join(string) #--- End: def def dump(self, complete=False, display=True, _level=0): ''' Return a string containing a full description of the domain. :Parameters: complete : bool, optional Output a complete dump. Fields contained in coordinate reference are themselves described with their dumps. display : bool, optional If False then return the description as a string. By default the description is printed, i.e. ``d.dump()`` is equivalent to ``print d.dump(display=False)``. :Returns: out : None or str A string containing the description. complete : bool, optional :Examples: ''' string = (self.dump_axes(display=False, _level=_level), self.dump_components(complete=complete, display=False, _level=_level), ) string = '\n'.join(string) if display: print string else: return string #--- End: def def equals(self, other, rtol=None, atol=None, ignore_fill_value=False, traceback=False, verbose=False): ''' True if two domains are equal, False otherwise. Equality is defined as follows: * There is one-to-one correspondence between dimensions and dimension sizes between the two domains. * For each domain component type (dimension coordinate, auxiliary coordinate and cell measures), the set of constructs in one domain equals that of the other domain. The component identifiers need not be the same. * The set of coordinate references in one domain equals that of the other domain. The coordinate reference identifiers need not be the same. Equality of numbers is to within a tolerance. :Parameters: other : The object to compare for equality. atol : float, optional The absolute tolerance for all numerical comparisons, By default the value returned by the `ATOL` function is used. rtol : float, optional The relative tolerance for all numerical comparisons, By default the value returned by the `RTOL` function is used. ignore_fill_value : bool, optional If True then data arrays with different fill values are considered equal. By default they are considered unequal. traceback : bool, optional If True then print a traceback highlighting where the two instances differ. :Returns: out : bool Whether or not the two instances are equal. :Examples: >>> d.equals(s) True >>> d.equals(t) False >>> d.equals(t, traceback=True) ''' if self is other: return True # Check that each instance is the same type if type(self) != type(other): print("%s: Different types: %s, %s" % (self.__class__.__name__, self.__class__.__name__, other.__class__.__name__)) return False #--- End: if if (sorted(self._axes_sizes.values()) != sorted(other._axes_sizes.values())): # There is not a 1-1 correspondence between dimensions and # dimension sizes between the two domains. if traceback: print("%s: Different domain ranks: %s != %s" % (self.__class__.__name__, sorted(self._axes_sizes.values()), sorted(other._axes_sizes.values()))) return False #--- End: if if rtol is None: rtol = RTOL() if atol is None: atol = ATOL() # ------------------------------------------------------------ # Test the coordinates and cell measures. Don't worry about # coordinate references yet - we'll do so later. # ------------------------------------------------------------ key_map = {} for self_keys, other_keys in izip((self.d, self.a, self.m), (other.d, other.a, other.m)): self_items = self_keys.items() other_items = other_keys.items() for key0, value0 in self_items: found_match = False for i, (key1, value1) in enumerate(other_items): if value0.equals(value1, rtol=rtol, atol=atol, ignore_fill_value=ignore_fill_value, traceback=verbose): found_match = True key_map[key1] = key0 other_items.pop(i) break #--- End: for if not found_match: if traceback: print("{0}: No {1} equal to: {2!r}".format( self.__class__.__name__, value1.__class__.__name__, value0)) return False #--- End: for #--- End: for # ------------------------------------------------------------ # Test the coordinate references # ------------------------------------------------------------ self_t = self.r other_t = other.r if not self_t: if other_t: # Self doesn't have any coordinate references but other does if traceback: print( "%s: Different numbers of coordinate references: 0 != %d" % (self.__class__.__name__, len(other_t))) return False else: if not other_t: # Other doesn't have any coordinate references but self does if traceback: print( "%s: Different numbers of coordinate references: %d != 0" % (self.__class__.__name__, len(self_t))) return False #--- End: if refs1 = other_t.keys() for key0, ref0 in self_t.iteritems(): found_match = False for key1 in refs1: ref1 = other_t[key1] if self._equal_refs(ref0, ref1, domain=other, pointer_map=key_map, ignore_fill_value=ignore_fill_value, traceback=verbose): # This coordinate reference is also in other found_match = True refs1.remove(key1) break #--- End: for if not found_match: # This coordinate reference was not found in other if traceback: print("%s: Missing coordinate reference: %r" % (self.__class__.__name__, ref0)) return False #--- End: for #--- End: if # ------------------------------------------------------------ # Still here? Then the two domains are equal # ------------------------------------------------------------ return True #--- End: def #--- End: class cf-python-1.3.2/cf/coordinate.py0000644000175000017500000026166112764224002016730 0ustar daviddavid00000000000000from numpy import empty as numpy_empty from numpy import ndarray as numpy_ndarray from numpy import size as numpy_size #from numpy.ma import argmax as numpy_argmax from itertools import izip from .functions import parse_indices from .coordinatebounds import CoordinateBounds from .timeduration import TimeDuration from .units import Units from .variable import Variable, SubspaceVariable from .data.data import Data # ==================================================================== # # Coordinate object # # ==================================================================== class Coordinate(Variable): ''' Base class for a CF dimension or auxiliary coordinate construct. **Attributes** =============== ======== =================================================== Attribute Type Description =============== ======== =================================================== `!climatology` ``bool`` Whether or not the bounds are intervals of climatological time. Presumed to be False if unset. =============== ======== =================================================== ''' # def __new__(cls, *args, **kwargs): # ''' # #Called to create a new instance with the `!_cyclic` attribute set to #True. ``*args`` and ``**kwargs`` are passed to the `__init__` method. # #''' # self = super(Coordinate, cls).__new__(Coordinate) # self._cyclic = True # return self # #--- End: def def __init__(self, properties={}, attributes={}, data=None, bounds=None, copy=True): ''' **Initialization** :Parameters: properties: `dict`, optional Initialize a new instance with CF properties from a dictionary's key/value pairs. attributes: `dict`, optional Provide the new instance with attributes from a dictionary's key/value pairs. data: `cf.Data`, optional Provide the new instance with an N-dimensional data array. bounds: `cf.Data` or `cf.CoordinateBounds`, optional Provide the new instance with cell bounds. copy: `bool`, optional If False then do not copy arguments prior to initialization. By default arguments are deep copied. ''' # DO NOT CHANGE _period IN PLACE self._period = None self._direction = None # Set attributes, CF properties and data super(Coordinate, self).__init__(properties=properties, attributes=attributes, data=data, copy=copy) # Bounds if bounds is not None: self.insert_bounds(bounds, copy=copy) # Set default standard names based on units #--- End: def def _query_contain(self, value): ''' ''' if not self._hasbounds: return self == value # bounds = self.bounds.Data # mn = bounds.min(axes=-1) # mx = bounds.max(axes=-1) return (self.lower_bounds <= value) & (self.upper_bounds >= value) # return ((mn <= value) & (mx >= value)).squeeze(axes=-1, i=True) #--- End: def # def _binary_operation(self, other, method): # ''' #''' # self_hasbounds = self._hasbounds # # if isinstance(other, self.__class__): # if other._hasbounds: # if not self_hasbounds: # raise TypeError("asdfsdfdfds 0000") # # other_bounds = other.bounds # elif self_hasbounds: # raise TypeError("asdfsdfdfds 00001") # # else: # other_bounds = other # if numpy_size(other) > 1: # raise TypeError("4444444") # ## elif isinstance(other, (float, int, long)): ## other_bounds = other ## ## elif isinstance(other, numpy_ndarray): ## if self_hasbounds: ## if other.size > 1: ## raise TypeError("4444444")# ## ## other_bounds = other # #-- End: if # # new = super(Coordinate, self)._binary_operation(other, method) # # if self_hasbounds: # new_bounds = self.bounds._binary_operation(other_bounds, method) # # inplace = method[2] == 'i' # # if not inplace: # if self_hasbounds: # new.bounds = new_bounds # # return new # else: # return self # #--- End: def def _change_axis_names(self, dim_name_map): ''' Change the axis names. Warning: dim_name_map may be changed in place :Parameters: dim_name_map: `dict` :Returns: `None` :Examples: ''' # Change the axis names of the data array super(Coordinate, self)._change_axis_names(dim_name_map) if self._hasbounds: bounds = self.bounds if bounds._hasData: b_axes = bounds.Data._axes if self._hasData: # Change the dimension names of the bounds # array. Note that it is assumed that the bounds # array dimensions are in the same order as the # coordinate's data array dimensions. It is not # required that the set of original bounds # dimension names (bar the trailing dimension) # equals the set of original coordinate data array # dimension names. The bounds array dimension # names will be changed to match the updated # coordinate data array dimension names. dim_name_map = {b_axes[-1]: 'bounds'} for c_dim, b_dim in izip(self.Data._axes, b_axes): dim_name_map[b_dim] = c_dim else: dim_name_map[b_axes[-1]] = 'bounds' #--- End: if bounds._change_axis_names(dim_name_map) #--- End: def def _equivalent_data(self, other, rtol=None, atol=None, traceback=False, copy=True): ''' :Parameters: copy: `bool`, optional If False then the *other* coordinate construct might get change in place. :Returns: `None` :Examples: >>> ''' if self._hasbounds != other._hasbounds: # add traceback return False if self.shape != other.shape: # add traceback return False if (self.direction() != other.direction() and self.direction() is not None and other.direction() is not None): other = other.flip(i=not copy) copy = False #--- End: if # DCH - should we test self.cyclic(), too? Think of non-cycli yet period coords .... # period = self._period # if period != other._period: # return False # Compare the data arrays if not super(Coordinate, self)._equivalent_data(other, rtol=rtol, atol=atol, copy=copy): return False # if period is None: # return False # # other = other.anchor(self.datum(0), i=not copy) # copy = False # # if not super(Coordinate, self)._equivalent_data(other, rtol=rtol, # atol=atol, copy=copy): # return False #--- End: if if self._hasbounds: # Both coordinates have bounds if not self.bounds._equivalent_data(other.bounds, rtol=rtol, atol=atol, copy=copy): return False #--- End: if # Still here? Then the data are equivalent. return True #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def attributes(self): ''' A dictionary of the attributes which are not CF properties. :Examples: >>> c.attributes {} >>> c.foo = 'bar' >>> c.attributes {'foo': 'bar'} >>> c.attributes.pop('foo') 'bar' >>> c.attributes {'foo': 'bar'} ''' attributes = super(Coordinate, self).attributes # Remove private attributes del attributes['_direction'] return attributes #--- End: def # ---------------------------------------------------------------- # Attribute (a special attribute) # ---------------------------------------------------------------- @property def bounds(self): ''' The `cf.CoordinateBounds` object containing the cell bounds. .. seealso:: `lower_bounds`, `upper_bounds` :Examples: >>> c >>> c.bounds >>> c.bounds = b AttributeError: Can't set 'bounds' attribute. Consider the insert_bounds method. >>> c.bounds.max() >>> c.bounds -= 1 AttributeError: Can't set 'bounds' attribute. Consider the insert_bounds method. >>> b = c.bounds >>> b -= 1 >>> c.bounds.max() ''' return self._get_special_attr('bounds') #--- End: def @bounds.setter def bounds(self, value): raise AttributeError( "Can't set 'bounds' attribute. Consider the insert_bounds method.") # self._set_special_attr('bounds', value) # self._hasbounds = True #--- End: def @bounds.deleter def bounds(self): self._del_special_attr('bounds') self._hasbounds = False #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def cellsize(self): ''' A `cf.Data` object containing the coordinate cell sizes. :Examples: >>> print c.bounds >>> print c.bounds.array [[-90. -87.] [-87. -80.] [-80. -67.]] >>> print d.cellsize >>> print d.cellsize.array [ 3. 7. 13.] >>> print c.sin().cellsize.array [ 0.00137047 0.01382178 0.0643029 ] >>> del c.bounds >>> c.cellsize AttributeError: Can't get cell sizes when coordinates have no bounds ''' if not self._hasbounds: raise AttributeError( "Can't get cell sizes when coordinates have no bounds") cells = self.bounds.data cells = (cells[:, 1] - cells[:, 0]).abs() cells.squeeze(1, i=True) return cells #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def ctype(self): ''' The CF coordinate type. One of ``'T'``, ``'X'``, ``'Y'`` or ``'Z'`` if the coordinate object is for the respective CF axis type, otherwise None. .. seealso:: `T`, `X`, `~cf.Coordinate.Y`, `Z` :Examples: >>> c.X True >>> c.ctype 'X' >>> c.T True >>> c.ctype 'T' ''' for t in ('T', 'X', 'Y', 'Z'): if getattr(self, t): return t #--- End: def # ---------------------------------------------------------------- # Attribute # ---------------------------------------------------------------- @property def dtype(self): ''' Numpy data-type of the data array. :Examples: >>> c.dtype dtype('float64') >>> import numpy >>> c.dtype = numpy.dtype('float32') ''' if self._hasData: return self.Data.dtype if self._hasbounds: return self.bounds.dtype raise AttributeError("%s doesn't have attribute 'dtype'" % self.__class__.__name__) #--- End: def @dtype.setter def dtype(self, value): if self._hasData: self.Data.dtype = value if self._hasbounds: self.bounds.dtype = value #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def isauxiliary(self): ''' True for auxiliary coordinate constructs, False otherwise. .. seealso:: `ismeasure`, `isdimension` :Examples: >>> c.isauxiliary False ''' return False #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def isdimension(self): ''' True for dimension coordinate constructs, False otherwise. .. seealso:: `isauxiliary`, `ismeasure` :Examples: >>> c.isdimension False ''' return False #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def isperiodic(self): ''' >>> print c.period() None >>> c.isperiodic False >>> c.period(cf.Data(360, 'degeres_east')) None >>> c.isperiodic True >>> c.period(None) >>> c.isperiodic False ''' return self._period is not None #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def lower_bounds(self): ''' The lower coordinate bounds in a `cf.Data` object. ``c.lower_bounds`` is equivalent to ``c.bounds.data.min(axes=-1)``. .. seealso:: `bounds`, `upper_bounds` :Examples: >>> print c.bounds.array [[ 5 3] [ 3 1] [ 1 -1]] >>> c.lower_bounds >>> print c.lower_bounds.array [ 3 1 -1] ''' if not self._hasbounds: raise ValueError("Can't get lower bounds when there are no bounds") return self.bounds.lower_bounds #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def subspace(self): ''' Return a new coordinate whose data and bounds are subspaced in a consistent manner. This attribute may be indexed to select a subspace from dimension index values. **Subspacing by indexing** Subspacing by dimension indices uses an extended Python slicing syntax, which is similar numpy array indexing. There are two extensions to the numpy indexing functionality: * Size 1 dimensions are never removed. An integer index i takes the i-th element but does not reduce the rank of the output array by one. * When advanced indexing is used on more than one dimension, the advanced indices work independently. When more than one dimension's slice is a 1-d boolean array or 1-d sequence of integers, then these indices work independently along each dimension (similar to the way vector subscripts work in Fortran), rather than by their elements. :Examples: ''' return SubspaceCoordinate(self) #--- End: def # ---------------------------------------------------------------- # Attribute: T (read only) # ---------------------------------------------------------------- @property def T(self): '''True if and only if the coordinates are for a CF T axis. CF T axis coordinates are for a reference time axis hhave one or more of the following: * The `axis` property has the value ``'T'`` * Units of reference time (see `cf.Units.isreftime` for details) * The `standard_name` property is one of ``'time'`` or ``'forecast_reference_time'longitude'`` .. seealso:: `ctype`, `X`, `~cf.Coordinate.Y`, `Z` :Examples: >>> c.Units >>> c.T True >>> c.standard_name in ('time', 'forecast_reference_time') True >>> c.T True >>> c.axis == 'T' and c.T True ''' if self.ndim > 1: return self.getprop('axis', None) == 'T' if (self.Units.isreftime or self.getprop('standard_name', 'T') in ('time', 'forecast_reference_time') or self.getprop('axis', None) == 'T'): return True else: return False #--- End: def # ---------------------------------------------------------------- # Attribute # ---------------------------------------------------------------- @property def Units(self): ''' The Units object containing the units of the data array. ''' return Variable.Units.fget(self) #--- End: def @Units.setter def Units(self, value): Variable.Units.fset(self, value) # Set the Units on the bounds if self._hasbounds: self.bounds.Units = value # Set the Units on the period if self._period is not None: period = self._period.copy() period.Units = value self._period = period self._direction = None #--- End: def @Units.deleter def Units(self): Variable.Units.fdel(self) if self._hasbounds: # Delete the bounds' Units del self.bounds.Units if self._period is not None: # Delete the period's Units period = self._period.copy() del period.Units self._period = period self._direction = None #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def upper_bounds(self): ''' The upper coordinate bounds in a `cf.Data` object. ``c.upper_bounds`` is equivalent to ``c.bounds.data.max(axes=-1)``. .. seealso:: `bounds`, `lower_bounds` :Examples: >>> print c.bounds.array [[ 5 3] [ 3 1] [ 1 -1]] >>> c.upper_bounds >>> c.upper_bounds.array array([5, 3, 1]) ''' if not self._hasbounds: raise ValueError("Can't get upper bounds when there are no bounds") return self.bounds.upper_bounds #--- End: def # ---------------------------------------------------------------- # Attribute: X (read only) # ---------------------------------------------------------------- @property def X(self): '''True if and only if the coordinates are for a CF X axis. CF X axis coordinates are for a horizontal axis have one or more of the following: * The `axis` property has the value ``'X'`` * Units of longitude (see `cf.Units.islongitude` for details) * The `standard_name` property is one of ``'longitude'``, ``'projection_x_coordinate'`` or ``'grid_longitude'`` .. seealso:: `ctype`, `T`, `~cf.Coordinate.Y`, `Z` :Examples: >>> c.Units >>> c.X True >>> c.standard_name 'longitude' >>> c.X True >>> c.axis == 'X' and c.X True ''' if self.ndim > 1: return self.getprop('axis', None) == 'X' if (self.Units.islongitude or self.getprop('axis', None) == 'X' or self.getprop('standard_name', None) in ('longitude', 'projection_x_coordinate', 'grid_longitude')): return True else: return False #--- End: def # ---------------------------------------------------------------- # Attribute: Y (read only) # ---------------------------------------------------------------- @property def Y(self): '''True if and only if the coordinates are for a CF Y axis. CF Y axis coordinates are for a horizontal axis and have one or more of the following: * The `axis` property has the value ``'Y'`` * Units of latitude (see `cf.Units.islatitude` for details) * The `standard_name` property is one of ``'latitude'``, ``'projection_y_coordinate'`` or ``'grid_latitude'`` .. seealso:: `ctype`, `T`, `X`, `Z` :Examples: >>> c.Units >>> c.Y True >>> c.standard_name == 'latitude' >>> c.Y True >>> c.axis 'Y' >>> c.Y True ''' if self.ndim > 1: return self.getprop('axis', None) == 'Y' if (self.Units.islatitude or self.getprop('axis', None) == 'Y' or self.getprop('standard_name', 'Y') in ('latitude', 'projection_y_coordinate', 'grid_latitude')): return True else: return False #--- End: def # ---------------------------------------------------------------- # Attribute: Z (read only) # ---------------------------------------------------------------- @property def Z(self): '''True if and only if the coordinates are for a CF Z axis. CF Z axis coordinates are for a vertical axis have one or more of the following: * The `axis` property has the value ``'Z'`` * Units of pressure (see `cf.Units.ispressure` for details), level, layer, or sigma_level * The `positive` property has the value ``'up'`` or ``'down'`` (case insensitive) * The `standard_name` property is one of ``'atmosphere_ln_pressure_coordinate'``, ``'atmosphere_sigma_coordinate'``, ``'atmosphere_hybrid_sigma_pressure_coordinate'``, ``'atmosphere_hybrid_height_coordinate'``, ``'atmosphere_sleve_coordinate``', ``'ocean_sigma_coordinate'``, ``'ocean_s_coordinate'``, ``'ocean_s_coordinate_g1'``, ``'ocean_s_coordinate_g2'``, ``'ocean_sigma_z_coordinate'`` or ``'ocean_double_sigma_coordinate'`` .. seealso:: `ctype`, `T`, `X`, `~cf.Coordinate.Y` :Examples: >>> c.Units >>> c.Z True >>> c.Units.equivalent(cf.Units('K')) and c.positive == 'up' True >>> c.Z True >>> c.axis == 'Z' and c.Z True >>> c.Units >>> c.Z True >>> c.standard_name 'ocean_sigma_coordinate' >>> c.Z True ''' if self.ndim > 1: return self.getprop('axis', None) == 'Z' units = self.Units if (units.ispressure or str(self.getprop('positive', 'Z')).lower() in ('up', 'down') or self.getprop('axis', None) == 'Z' or (units and units.units in ('level', 'layer' 'sigma_level')) or self.getprop('standard_name', None) in ('atmosphere_ln_pressure_coordinate', 'atmosphere_sigma_coordinate', 'atmosphere_hybrid_sigma_pressure_coordinate', 'atmosphere_hybrid_height_coordinate', 'atmosphere_sleve_coordinate', 'ocean_sigma_coordinate', 'ocean_s_coordinate', 'ocean_s_coordinate_g1', 'ocean_s_coordinate_g2', 'ocean_sigma_z_coordinate', 'ocean_double_sigma_coordinate')): return True else: return False #--- End: def # ---------------------------------------------------------------- # CF property: axis # ---------------------------------------------------------------- @property def axis(self): ''' The axis CF property. :Examples: >>> c.axis = 'Y' >>> c.axis 'Y' >>> del c.axis >>> c.setprop('axis', 'T') >>> c.getprop('axis') 'T' >>> c.delprop('axis') ''' return self.getprop('axis') #--- End: def @axis.setter def axis(self, value): self.setprop('axis', value) @axis.deleter def axis(self): self.delprop('axis') # ---------------------------------------------------------------- # CF property: calendar # ---------------------------------------------------------------- @property def calendar(self): ''' The calendar CF property. This property is a mirror of the calendar stored in the `Units` attribute. :Examples: >>> c.calendar = 'noleap' >>> c.calendar 'noleap' >>> del c.calendar >>> c.setprop('calendar', 'proleptic_gregorian') >>> c.getprop('calendar') 'proleptic_gregorian' >>> c.delprop('calendar') ''' return Variable.calendar.fget(self) #--- End: def @calendar.setter def calendar(self, value): Variable.calendar.fset(self, value) # Set the calendar of the bounds if self._hasbounds: self.bounds.setprop('calendar', value) #--- End: def @calendar.deleter def calendar(self): Variable.calendar.fdel(self) # Delete the calendar of the bounds if self._hasbounds: try: self.bounds.delprop('calendar') except AttributeError: pass #--- End: def # ---------------------------------------------------------------- # CF property # ---------------------------------------------------------------- @property def leap_month(self): ''' The leap_month CF property. :Examples: >>> c.leap_month = 2 >>> c.leap_month 2 >>> del c.leap_month >>> c.setprop('leap_month', 11) >>> c.getprop('leap_month') 11 >>> c.delprop('leap_month') ''' return self.getprop('leap_month') #--- End: def @leap_month.setter def leap_month(self, value): self.setprop('leap_month', value) @leap_month.deleter def leap_month(self): self.delprop('leap_month') # ---------------------------------------------------------------- # CF property # ---------------------------------------------------------------- @property def leap_year(self): ''' The leap_year CF property. :Examples: >>> c.leap_year = 1984 >>> c.leap_year 1984 >>> del c.leap_year >>> c.setprop('leap_year', 1984) >>> c.getprop('leap_year') 1984 >>> c.delprop('leap_year') ''' return self.getprop('leap_year') #--- End: def @leap_year.setter def leap_year(self, value): self.setprop('leap_year', value) @leap_year.deleter def leap_year(self): self.delprop('leap_year') # ---------------------------------------------------------------- # CF property # ---------------------------------------------------------------- @property def month_lengths(self): ''' The month_lengths CF property. Stored as a tuple but may be set as any array-like object. :Examples: >>> c.month_lengths = numpy.array([34, 31, 32, 30, 29, 27, 28, 28, 28, 32, 32, 34]) >>> c.month_lengths (34, 31, 32, 30, 29, 27, 28, 28, 28, 32, 32, 34) >>> del c.month_lengths >>> c.setprop('month_lengths', [34, 31, 32, 30, 29, 27, 28, 28, 28, 32, 32, 34]) >>> c.getprop('month_lengths') (34, 31, 32, 30, 29, 27, 28, 28, 28, 32, 32, 34) >>> c.delprop('month_lengths') ''' return self.getprop('month_lengths') #--- End: def @month_lengths.setter def month_lengths(self, value): value = tuple(value) self.setprop('month_lengths', value) #--- End: def @month_lengths.deleter def month_lengths(self): self.delprop('month_lengths') # ---------------------------------------------------------------- # CF property: positive # ---------------------------------------------------------------- @property def positive(self): ''' The positive CF property. :Examples: >>> c.positive = 'up' >>> c.positive 'up' >>> del c.positive >>> c.setprop('positive', 'down') >>> c.getprop('positive') 'down' >>> c.delprop('positive') ''' return self.getprop('positive') #--- End: def @positive.setter def positive(self, value): self.setprop('positive', value) self._direction = None #--- End: def @positive.deleter def positive(self): self.delprop('positive') self._direction = None # ---------------------------------------------------------------- # CF property # ---------------------------------------------------------------- @property def standard_name(self): ''' The standard_name CF property. :Examples: >>> c.standard_name = 'time' >>> c.standard_name 'time' >>> del c.standard_name >>> c.setprop('standard_name', 'time') >>> c.getprop('standard_name') 'time' >>> c.delprop('standard_name') ''' return self.getprop('standard_name') #--- End: def @standard_name.setter def standard_name(self, value): self.setprop('standard_name', value) @standard_name.deleter def standard_name(self): self.delprop('standard_name') # ---------------------------------------------------------------- # CF property: units # ---------------------------------------------------------------- # DCH possible inconsistency when setting self.Units.units ?? @property def units(self): ''' The units CF property. This property is a mirror of the units stored in the `Units` attribute. :Examples: >>> c.units = 'degrees_east' >>> c.units 'degree_east' >>> del c.units >>> c.setprop('units', 'days since 2004-06-01') >>> c.getprop('units') 'days since 2004-06-01' >>> c.delprop('units') ''' return Variable.units.fget(self) #--- End: def @units.setter def units(self, value): Variable.units.fset(self, value) if self._hasbounds: # Set the units on the bounds self.bounds.setprop('units', value) self._direction = None #--- End: def @units.deleter def units(self): Variable.units.fdel(self) self._direction = None if self._hasbounds: # Delete the units from the bounds try: self.bounds.delprop('units') except AttributeError: pass #--- End: def def asauxiliary(self, copy=True): ''' Return the coordinate recast as an auxiliary coordinate. :Parameters: copy: `bool`, optional If False then the returned auxiliary coordinate is not independent. By default the returned auxiliary coordinate is independent. :Returns: out: `cf.AuxiliaryCoordinate` The coordinate recast as an auxiliary coordinate. :Examples: >>> a = c.asauxiliary() >>> a = c.asauxiliary(copy=False) ''' return AuxiliaryCoordinate(attributes=self.attributes, properties=self.properties, data=getattr(self, 'Data', None), bounds=getattr(self, 'bounds', None), copy=copy) #--- End: def def asdimension(self, copy=True): ''' Return the coordinate recast as a dimension coordinate. :Parameters: copy: `bool`, optional If False then the returned dimension coordinate is not independent. By default the returned dimension coordinate is independent. :Returns: out: `cf.DimensionCoordinate` The coordinate recast as a dimension coordinate. :Examples: >>> d = c.asdimension() >>> d = c.asdimension(copy=False) ''' if self._hasData: if self.ndim > 1: raise ValueError( "Dimension coordinate must be 1-d (not %d-d)" % self.ndim) elif self._hasbounds: if self.bounds.ndim > 2: raise ValueError( "Dimension coordinate must be 1-d (not %d-d)" % self.ndim) return DimensionCoordinate(attributes=self.attributes, properties=self.properties, data=getattr(self, 'Data', None), bounds=getattr(self, 'bounds', None), copy=copy) #--- End: def def chunk(self, chunksize=None): ''' Partition the data array. ''' if not chunksize: # Set the default chunk size chunksize = CHUNKSIZE() # Partition the coordinate's data super(Coordinate, self).chunk(chunksize) # Partition the data of the bounds, if they exist. if self._hasbounds: self.bounds.chunk(chunksize) #--- End: def def clip(self, a_min, a_max, units=None, i=False): ''' Clip (limit) the values in the data array and its bounds in place. Given an interval, values outside the interval are clipped to the interval edges. Parameters : a_min: scalar a_max: scalar units: str or Units {+i} :Returns: `None` :Examples: ''' c = super(Coordinate, self).clip(a_min, a_max, units=units, i=i) if c._hasbounds: # Clip the bounds c.bounds.clip(a_min, a_max, units=units, i=True) return c #--- End: def def close(self): ''' Close all files referenced by the coordinate. Note that a closed file will be automatically reopened if its contents are subsequently required. :Returns: `None` :Examples: >>> c.close() ''' new = super(Coordinate, self).close() if self._hasbounds: self.bounds.close() #--- End: def @classmethod def concatenate(cls, coordinates, axis=0, _preserve=True): ''' Join a sequence of coordinates together. :Returns: out: `cf.{+Variable}` ''' coord0 = coordinates[0] if len(coordinates) == 1: return coordinates0.copy() out = Variable.concatenate(coordinates, axis=axis, _preserve=_preserve) if coord0._hasbounds: bounds = Variable.concatenate( [c.bounds for c in coordinates], axis=axis, _preserve=_preserve) out.insert_bounds(bounds, copy=False) return out #--- End: def def contiguous(self, overlap=True): ''' Return True if a coordinate is contiguous. A coordinate is contiguous if its cell boundaries match up, or overlap, with the boundaries of adjacent cells. In general, it is only possible for 1 or 0 dimensional coordinates with bounds to be contiguous, but size 1 coordinates with any number of dimensions are always contiguous. An exception occurs if the coordinate is multdimensional and has more than one element. :Parameters: overlap: `bool`, optional If False then overlapping cell boundaries are not considered contiguous. By default cell boundaries are considered contiguous. :Returns: out: `bool` Whether or not the coordinate is contiguous. :Raises: ValueError : If the coordinate has more than one dimension. :Examples: >>> c.hasbounds False >>> c.contiguous() False >>> print c.bounds[:, 0] [ 0.5 1.5 2.5 3.5 ] >>> print c.bounds[:, 1] [ 1.5 2.5 3.5 4.5 ] >>> c.contiuous() True >>> print c.bounds[:, 0] [ 0.5 1.5 2.5 3.5 ] >>> print c.bounds[:, 1] [ 2.5 3.5 4.5 5.5 ] >>> c.contiuous() True >>> c.contiuous(overlap=False) False ''' if not self._hasbounds: return False return self.bounds.contiguous(overlap=overlap, direction=self.direction) # if monoyine: # return self.monit()# # # return False #--- End: def def convert_reference_time(self, units=None, calendar_months=False, calendar_years=False, i=False): '''Convert reference time data values to have new units. Conversion is done by decoding the reference times to date-time objects and then re-encoding them for the new units. Any conversions are possible, but this method is primarily for conversions which require a change in the date-times originally encoded. For example, use this method to reinterpret data values in units of "months" since a reference time to data values in "calendar months" since a reference time. This is often necessary when when units of "calendar months" were intended but encoded as "months", which have special definition. See the note and examples below for more details. For conversions which do not require a change in the date-times implied by the data values, this method will be considerably slower than a simple reassignment of the units. For example, if the original units are ``'days since 2000-12-1'`` then ``c.Units = cf.Units('days since 1901-1-1')`` will give the same result and be considerably faster than ``c.convert_reference_time(cf.Units('days since 1901-1-1'))`` .. note:: It is recommended that the units "year" and "month" be used with caution, as explained in the following excerpt from the CF conventions: "The Udunits package defines a year to be exactly 365.242198781 days (the interval between 2 successive passages of the sun through vernal equinox). It is not a calendar year. Udunits includes the following definitions for years: a common_year is 365 days, a leap_year is 366 days, a Julian_year is 365.25 days, and a Gregorian_year is 365.2425 days. For similar reasons the unit ``month``, which is defined to be exactly year/12, should also be used with caution. :Examples 1: >>> d = c.convert_reference_time() :Parameters: units: `cf.Units`, optional The reference time units to convert to. By default the units days since the original reference time in the the original calendar. *Example:* If the original units are ``'months since 2000-1-1'`` in the Gregorian calendar then the default units to convert to are ``'days since 2000-1-1'`` in the Gregorian calendar. calendar_months: `bool`, optional If True then treat units of ``'months'`` as if they were calendar months (in whichever calendar is originally specified), rather than a 12th of the interval between 2 successive passages of the sun through vernal equinox (i.e. 365.242198781/12 days). calendar_years: `bool`, optional If True then treat units of ``'years'`` as if they were calendar years (in whichever calendar is originally specified), rather than the interval between 2 successive passages of the sun through vernal equinox (i.e. 365.242198781 days). {+i} :Returns: out: `cf.{+Variable}` The {+variable} with converted reference time data values. :Examples 2: >>> print c.Units months since 2000-1-1 >>> print c.array [1 3] >>> print c.dtarray [datetime.datetime(2000, 1, 31, 10, 29, 3, 831197) datetime.datetime(2000, 4, 1, 7, 27, 11, 493645)] >>> print c.bounds.array [[ 0 2] [ 2 4]] >>> print c.bounds.dtarray [[datetime.datetime(2000, 1, 1, 0, 0) datetime.datetime(2000, 3, 1, 20, 58, 7, 662441)] [datetime.datetime(2000, 3, 1, 20, 58, 7, 662441) datetime.datetime(2000, 5, 1, 17, 56, 15, 324889)]] >>> c.convert_reference_time(calendar_months=True, i=True) >>> print c.Units days since 2000-1-1 >>> print c.array [ 31., 91.] >>> print c.dtarray [datetime.datetime(2000, 2, 1, 0, 0) datetime.datetime(2000, 4, 1, 0, 0)] >>> print c.bounds.dtarray [[datetime.datetime(2000, 1, 1, 0, 0) datetime.datetime(2000, 3, 1, 0, 0)] [datetime.datetime(2000, 3, 1, 0, 0) datetime.datetime(2000, 5, 1, 0, 0)]] ''' if i: c = self else: c = self.copy() super(Coordinate, c).convert_reference_time(units=units, calendar_months=calendar_months, calendar_years=calendar_years, i=True) if c._hasbounds: c.bounds.convert_reference_time(units=units, calendar_months=calendar_months, calendar_years=calendar_years, i=True) return c #--- End: def def cos(self, i=False): ''' Take the trigonometric cosine of the data array and bounds in place. Units are accounted for in the calcualtion, so that the the cosine of 90 degrees_east is 0.0, as is the sine of 1.57079632 radians. If the units are not equivalent to radians (such as Kelvin) then they are treated as if they were radians. The Units are changed to '1' (nondimensionsal). :Parameters: {+i} :Returns: out: `cf.{+Variable}` :Examples: >>> c.Units >>> print c.array [[-90 0 90 --]] >>> c.cos() >>> c.Units >>> print c.array [[0.0 1.0 0.0 --]] >>> c.Units >>> print c.array [[1 2 3 --]] >>> c.cos() >>> c.Units >>> print c.array [[0.540302305868 -0.416146836547 -0.9899924966 --]] ''' if i: c = self else: c = self.copy() super(Coordinate, c).cos(i=True) if c._hasbounds: c.bounds.cos(i=True) return c #--- End: def def cyclic(self, axes=None, iscyclic=True): ''' Set the cyclicity of axes of the data array and bounds. .. seealso:: `cf.DimensionCoordinate.period` :Parameters: axes: (sequence of) `int` The axes to be set. Each axis is identified by its integer position. By default no axes are set. iscyclic: `bool`, optional :Returns: out: `list` :Examples: ''' old = super(Coordinate, self).cyclic(axes, iscyclic) if axes is not None and self._hasbounds: axes = _parse_axes(axes) self.bounds.cyclic(axes, iscyclic) return old #--- End: def def tan(self, i=False): ''' Take the trigonometric tangent of the data array and bounds in place. Units are accounted for in the calculation, so that the the tangent of 180 degrees_east is 0.0, as is the sine of 3.141592653589793 radians. If the units are not equivalent to radians (such as Kelvin) then they are treated as if they were radians. The Units are changed to '1' (nondimensionsal). :Parameters: {+i} :Returns: out: `cf.{+Variable}` :Examples: ''' if i: c = self else: c = self.copy() super(Coordinate, c).tan(i=True) if c._hasbounds: c.bounds.tan(i=True) return c #--- End: def def copy(self, _omit_Data=False, _only_Data=False): ''' Return a deep copy. Equivalent to ``copy.deepcopy(c)``. :Returns: out: The deep copy. :Examples: >>> d = c.copy() ''' new = super(Coordinate, self).copy(_omit_Data=_omit_Data, _only_Data=_only_Data, _omit_special=('bounds',)) if self._hasbounds: bounds = self.bounds.copy(_omit_Data=_omit_Data, _only_Data=_only_Data) new._set_special_attr('bounds', bounds) return new #--- End: def def delprop(self, prop): ''' Delete a CF property. .. seealso:: `getprop`, `hasprop`, `setprop` :Parameters: prop: `str` The name of the CF property. :Returns: `None` :Examples: >>> c.delprop('standard_name') >>> c.delprop('foo') AttributeError: Coordinate doesn't have CF property 'foo' ''' # Delete a special attribute if prop in self._special_properties: delattr(self, prop) return # Still here? Then delete a simple attribute # Delete selected simple properties from the bounds if self._hasbounds and prop in ('standard_name', 'axis', 'positive', 'leap_month', 'leap_year', 'month_lengths'): try: self.bounds.delprop(prop) except AttributeError: pass #--- End: if d = self._private['simple_properties'] if prop in d: del d[prop] else: raise AttributeError("Can't delete non-existent %s CF property %r" % (self.__class__.__name__, prop)) if self._hasbounds and prop in ('standard_name', 'axis', 'positive', 'leap_month', 'leap_year', 'month_lengths'): try: self.bounds.delprop(prop) except AttributeError: pass #--- End: def def direction(self): ''' Return None, indicating that it is not specified whether the coordinate object is increasing or decreasing. :Returns: `None` :Examples: >>> print c.direction() None ''' return #--- End: def def dump(self, display=True, omit=(), domain=None, key=None, _level=0): ''' Return a string containing a full description of the coordinate. :Parameters: display: `bool`, optional If False then return the description as a string. By default the description is printed, i.e. ``c.dump()`` is equivalent to ``print c.dump(display=False)``. omit: sequence of `str` Omit the given CF properties from the description. :Returns: out: `None` or `str` A string containing the description. :Examples: ''' indent0 = ' ' * _level indent1 = ' ' * (_level+1) string = [] if domain: x = ['%s(%d)' % (domain.axis_name(axis), domain.axis_size(axis)) for axis in domain.item_axes(key)] string.append('%sData(%s) = %s' % (indent0, ', '.join(x), str(self.Data))) if self._hasbounds: x.append(str(self.bounds.shape[-1])) string.append('%sBounds(%s) = %s' % (indent0, ', '.join(x), str(self.bounds.Data))) else: x = [str(s) for s in self.shape] string.append('%sData(%s) = %s' % (indent0, ', '.join(x), str(self.Data))) if self._hasbounds: x.append(str(self.bounds.shape[-1])) string.append('%sBounds(%s) = %s' % (indent0, ', '.join(x), str(self.bounds.Data))) #--- End: if if self._simple_properties(): string.append(self._dump_simple_properties(_level=_level)) string = '\n'.join(string) if display: print string else: return string #--- End: def def expand_dims(self, position=0, i=False): ''' Insert a size 1 axis into the data array and bounds in place. .. seealso:: `flip`, `squeeze`, `transpose` :Parameters: position: `int`, optional Specify the position amongst the data array axes where the new axis is to be inserted. By default the new axis is inserted at position 0, the slowest varying position. {+i} :Returns: out: `cf.{+Variable}` ''' if (not self._hasData and (not self._hasbounds or not self.bounds._hasData)): raise ValueError( "Can't insert axis into '%s'" % self.__class__.__name__) if self._hasData: c = super(Coordinate, self).expand_dims(position, i=i) elif i: c = self else: c = self.copy() if c._hasbounds and c.bounds._hasData: # Expand the coordinate's bounds position = _parse_axes([position])[0] c.bounds.expand_dims(position, i=True) # if i: # c = self # else: # c = self.copy() # # # Expand the coordinate's data, if it has any. # if c._hasData: ## super(Coordinate, self).expand_dims(position, i=True) # c.Data.expand_dims(position, i=True) # # # Expand the coordinate's bounds, if it has any. # if c._hasbounds and c.bounds._hasData: ## c.bounds.expand_dims(position, i=True) # c.bounds.Data.expand_dims(position, i=True) return c #--- End: def def flip(self, axes=None, i=False): ''' Flip dimensions of the data array and bounds in place. The trailing dimension of the bounds is flipped if and only if the coordinate is 1 or 0 dimensional. :Parameters: axes: (sequence of) `int`, optional Flip the dimensions whose positions are given. By default all dimensions are flipped. {+i} :Returns: out: `cf.{+Variable}` :Examples: >>> c.flip() >>> c.flip(1) >>> d = c.subspace[::-1, :, ::-1, :] >>> c.flip([2, 0]).equals(d) True ''' c = super(Coordinate, self).flip(axes, i=i) # ------------------------------------------------------------ # Flip the requested dimensions in the coordinate's bounds, if # it has any. # # As per section 7.1 in the CF conventions: i) if the # coordinate is 0 or 1 dimensional then flip all dimensions # (including the the trailing size 2 dimension); ii) if the # coordinate has 2 or more dimensions then do not flip the # trailing dimension. # ------------------------------------------------------------ if c._hasbounds and c.bounds._hasData: # Flip the bounds if not c.ndim: # Flip the bounds of 0-d coordinates axes = (-1,) elif c.ndim == 1: # Flip the bounds of 1-d coordinates if axes in (0, -1): axes = (0, -1) elif axes is not None: axes = _parse_axes(axes) + [-1] else: # Do not flip the bounds of N-d coordinates (N >= 2) axes = _parse_axes(axes) c.bounds.flip(axes, i=True) #--- End if direction = c._direction if direction is not None: c._direction = not direction return c #--- End: def def insert_bounds(self, bounds, copy=True): ''' Insert cell bounds into the coordinate in-place. :Parameters: bounds: `cf.Data` or `cf.CoordinateBounds` copy: `bool`, optional :Returns: None ''' # Check dimensionality if bounds.ndim != self.ndim + 1: raise ValueError( "Can't set coordinate bounds: Incorrect number of dimemsions: %d (expected %d)" % (bounds.ndim, self.ndim+1)) # Check shape if bounds.shape[:-1] != self.shape: raise ValueError( "Can't set coordinate bounds: Incorrect shape: %s (expected %s)" % (bounds.shape, self.shape+(bounds.shape[-1],))) if copy: bounds = bounds.copy() # Check units units = bounds.Units self_units = self.Units if units and not units.equivalent(self_units): raise ValueError( "Can't set coordinate bounds: Incompatible units: %r (not equivalent to %r)" % (bounds.Units, self.Units)) bounds.Units = self_units if not isinstance(bounds, CoordinateBounds): bounds = CoordinateBounds(data=bounds, copy=False) # Copy selected coordinate properties to the bounds for prop in ('standard_name', 'axis', 'positive', 'leap_months', 'leap_years', 'month_lengths'): value = self.getprop(prop, None) if value is not None: bounds.setprop(prop, value) self._set_special_attr('bounds', bounds) self._hasbounds = True self._direction = None #--- End: def def insert_data(self, data, bounds=None, copy=True): ''' Insert a new data array into the coordinate in place. A coordinate bounds data array may also inserted if given with the *bounds* keyword. Coordinate bounds may also be inserted independently with the `insert_bounds` method. :Parameters: data: `cf.Data` bounds: `cf.Data`, optional copy: `bool`, optional :Returns: `None` ''' if data is not None: super(Coordinate, self).insert_data(data, copy=copy) if bounds is not None: self.insert_bounds(bounds, copy=copy) self._direction = None #--- End: def def override_units(self, new_units, i=False): ''' {+i} ''' if i: c = self else: c = self.copy() super(Coordinate, c).override_units(new_units, i=True) if c._hasbounds: c.bounds.override_units(new_units, i=True) if c._period is not None: # Never change _period in place c._period.override_units(new_units, i=False) return c #--- End: def def roll(self, axis, shift, i=False): ''' {+i} ''' if self.size <= 1: if i: return self else: return self.copy() c = super(Coordinate, self).roll(axis, shift, i=i) # Roll the bounds, if there are any if c._hasbounds: b = c.bounds if b._hasData: b.roll(axis, shift, i=True) #--- End: if return c #--- End: def def setprop(self, prop, value): ''' Set a CF property. .. seealso:: `delprop`, `getprop`, `hasprop` :Parameters: prop: `str` The name of the CF property. value : The value for the property. :Returns: None :Examples: >>> c.setprop('standard_name', 'time') >>> c.setprop('foo', 12.5) ''' # Set a special attribute if prop in self._special_properties: setattr(self, prop, value) return # Still here? Then set a simple property self._private['simple_properties'][prop] = value # Set selected simple properties on the bounds if self._hasbounds and prop in ('standard_name', 'axis', 'positive', 'leap_month', 'leap_year', 'month_lengths'): self.bounds.setprop(prop, value) #--- End: def def sin(self, i=False): ''' Take the trigonometric sine of the data array and bounds in place. Units are accounted for in the calculation. For example, the the sine of 90 degrees_east is 1.0, as is the sine of 1.57079632 radians. If the units are not equivalent to radians (such as Kelvin) then they are treated as if they were radians. The Units are changed to '1' (nondimensionsal). :Parameters: {+i} :Returns: out: `cf.{+Variable}` :Examples: >>> c.Units >>> print c.array [[-90 0 90 --]] >>> c.sin() >>> c.Units >>> print c.array [[-1.0 0.0 1.0 --]] >>> c.Units >>> print c.array [[1 2 3 --]] >>> c.sin() >>> c.Units >>> print c.array [[0.841470984808 0.909297426826 0.14112000806 --]] ''' if i: c = self else: c = self.copy() super(Coordinate, c).sin(i=True) if c._hasbounds: c.bounds.sin(i=True) return c #--- End: def def log(self, base=10, i=False): ''' Take the logarithm the data array and bounds element-wise. :Parameters: base: number, optional {+i} :Returns: out: `cf.{+Variable}` ''' if i: c = self else: c = self.copy() super(Coordinate, c).log(base, i=True) if c._hasbounds: c.bounds.log(base, i=True) return c #--- End: def def squeeze(self, axes=None, i=False): ''' Remove size 1 dimensions from the data array and bounds in place. .. seealso:: `expand_dims`, `flip`, `transpose` :Parameters: axes: (sequence of) `int`, optional The size 1 axes to remove. By default, all size 1 axes are removed. Size 1 axes for removal may be identified by the integer positions of dimensions in the data array. {+i} :Returns: out: `cf.{+Variable}` :Examples: >>> c.squeeze() >>> c.squeeze(1) >>> c.squeeze([1, 2]) ''' c = super(Coordinate, self).squeeze(axes, i=i) if c._hasbounds and c.bounds._hasData: # Squeeze the bounds axes = _parse_axes(axes) c.bounds.squeeze(axes, i=True) return c #--- End: def def transpose(self, axes=None, i=False): ''' Permute the dimensions of the data array and bounds in place. .. seealso:: `expand_dims`, `flip`, `squeeze` :Parameters: axes: (sequence of) `int`, optional The new order of the data array. By default, reverse the dimensions' order, otherwise the axes are permuted according to the values given. The values of the sequence comprise the integer positions of the dimensions in the data array in the desired order. {+i} :Returns: out: `cf.{+Variable}` :Examples: >>> c.ndim 3 >>> c.transpose() >>> c.transpose([1, 2, 0]) ''' c = super(Coordinate, self).transpose(axes, i=i) ndim = c.ndim if c._hasbounds and ndim > 1 and c.bounds._hasData: # Transpose the bounds if axes is None: axes = range(ndim-1, -1, -1) + [-1] else: axes = _parse_axes(axes) + [-1] bounds = c.bounds bounds.transpose(axes, i=True) if (ndim == 2 and bounds.shape[-1] == 4 and axes[0] == 1 and (c.Units.islongitude or c.Units.islatitude or c.getprop('standard_name', None) in ('grid_longitude' or 'grid_latitude'))): # Swap columns 1 and 3 so that the coordinates are # still contiguous (if they ever were). See section # 7.1 of the CF conventions. bounds.subspace[..., [1, 3]] = bounds.subspace[..., [3, 1]] #--- End: if return c #--- End: def #--- End: class # ==================================================================== # # SubspaceCoordinate object # # ==================================================================== class SubspaceCoordinate(SubspaceVariable): __slots__ = [] def __getitem__(self, indices): ''' x.__getitem__(indices) <==> x[indices] ''' coord = self.variable if indices is Ellipsis: return coord.copy() indices, roll = parse_indices(coord, indices, True) if roll: data = coord.Data axes = data._axes cyclic_axes = data._cyclic for iaxis, shift in roll.iteritems(): if axes[iaxis] not in cyclic_axes: raise IndexError( "Can't do a cyclic slice on a non-cyclic axis") coord = coord.roll(iaxis, shift) #--- End: for new = coord else: new = coord.copy(_omit_Data=True) # # Copy the coordinate # new = coord.copy(_omit_Data=True) # # Parse the index (so that it's ok for appending the bounds # # index if required) # indices = parse_indices(coord, indices) coord_data = coord.Data new.Data = coord_data[tuple(indices)] # Subspace the bounds, if there are any if not new._hasbounds: bounds = None else: bounds = coord.bounds if bounds._hasData: if coord_data.ndim <= 1: index = indices[0] if isinstance(index, slice): if index.step < 0: # This scalar or 1-d coordinate has been # reversed so reverse its bounds (as per # 7.1 of the conventions) indices.append(slice(None, None, -1)) elif coord_data.size > 1 and index[-1] < index[0]: # This 1-d coordinate has been reversed so # reverse its bounds (as per 7.1 of the # conventions) indices.append(slice(None, None, -1)) #--- End: if new.bounds.Data = bounds.Data[tuple(indices)] #--- End: if new._direction = None # Return the new coordinate return new #--- End: def #--- End: class # ==================================================================== # # DimensionCoordinate object # # ==================================================================== class DimensionCoordinate(Coordinate): ''' A CF dimension coordinate construct. **Attributes** =============== ======== =================================================== Attribute Type Description =============== ======== =================================================== `!climatology` ``bool`` Whether or not the bounds are intervals of climatological time. Presumed to be False if unset. =============== ======== =================================================== ''' # def _query_contain(self, value): # '''# # #''' # if not self._hasbounds: # return self == value# # # return (self.lower_bounds <= value) & (self.upper_bounds >= value) # #--- End: def def _centre(self, period): ''' It assumed, but not checked, that the period has been set. ''' if self.direction(): mx = self.Data[-1] else: mx = self.Data[0] return ((mx // period) * period).squeeze(i=True) #--- End: def def _infer_direction(self): ''' Return True if a coordinate is increasing, otherwise return False. A coordinate is considered to be increasing if its *raw* data array values are increasing in index space or if it has no data not bounds data. If the direction can not be inferred from the coordinate's data then the coordinate's units are used. The direction is inferred from the coordinate's data array values or its from coordinates. It is not taken directly from its `cf.Data` object. :Returns: out: bool Whether or not the coordinate is increasing. :Examples: >>> c.array array([ 0 30 60]) >>> c._get_direction() True >>> c.array array([15]) >>> c.bounds.array array([ 30 0]) >>> c._get_direction() False ''' if self._hasData: # Infer the direction from the dimension coordinate's data # array c = self.Data if c._size > 1: c = c[0:2].unsafe_array return c.item(0,) < c.item(1,) #--- End: if # Still here? if self._hasbounds: # Infer the direction from the dimension coordinate's # bounds b = self.bounds if b._hasData: b = b.Data b = b[(0,)*(b.ndim-1)].unsafe_array return b.item(0,) < b.item(1,) #--- End: if # # Still here? Then infer the direction from the dimension # # coordinate's positive CF property. # positive = self.getprop('positive', None) # if positive is not None and positive[0] in 'dD': # return False # # Still here? Then infer the direction from the units. return not self.Units.ispressure #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def cellsize(self): ''' A `cf.Data` object containing the coordinate cell sizes. :Examples: >>> print c.bounds >>> print c.bounds.array [[-90. -87.] [-87. -80.] [-80. -67.]] >>> print d.cellsize >>> print d.cellsize.array [ 3. 7. 13.] >>> print c.sin().cellsize.array [ 0.00137047 0.01382178 0.0643029 ] >>> del c.bounds >>> c.cellsize AttributeError: Can't get cell sizes when coordinates have no bounds ''' if not self._hasbounds: raise AttributeError( "Can't get cell sizes when coordinates have no bounds") cells = self.bounds.data # if bounds_range is not None: # bounds_range = Data.asdata(bounds_range)# # # if not bounds_range.Units: # bounds_range = bounds_range.override_units(self.Units) # cells.clip(*bounds_range, units=bounds_range.Units, i=True) # #--- End: if if self.direction(): cells = cells[:, 1] - cells[:, 0] else: cells = cells[:, 0] - cells[:, 1] cells.squeeze(1, i=True) # if units: # if cells.Units.equivalent(units): # cells.Units = units # else: # raise ValueError("sdfm 845 &&&&") return cells #--- End: def @property def decreasing(self): ''' True if the dimension coordinate is increasing, otherwise False. A dimension coordinate is increasing if its coordinate values are increasing in index space. The direction is inferred from one of, in order of precedence: * The data array * The bounds data array * The `units` CF property :Returns: out: bool Whether or not the coordinate is increasing. True for dimension coordinate constructs, False otherwise. >>> c.decreasing False >>> c.flip().increasing True ''' return not self.direction() #--- End: def @property def increasing(self): ''' True for dimension coordinate constructs, False otherwise. >>> c.increasing True >>> c.flip().increasing False ''' return self.direction() #--- End: def @property def isauxiliary(self): ''' True for auxiliary coordinate constructs, False otherwise. .. seealso:: `ismeasure`, `isdimension` :Examples: >>> c.isauxiliary False ''' return False #--- End: def @property def isdimension(self): ''' True for dimension coordinate constructs, False otherwise. .. seealso:: `isauxiliary`, `ismeasure` :Examples: >>> c.isdimension True ''' return True #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def lower_bounds(self): ''' The lower dimension coordinate bounds in a `cf.Data` object. .. seealso:: `bounds`, `upper_bounds` :Examples: >>> print c.bounds.array [[ 5 3] [ 3 1] [ 1 -1]] >>> c.lower_bounds >>> print c.lower_bounds.array [ 3 1 -1] ''' if not self._hasbounds or not self.bounds._hasData: raise ValueError("Can't get lower bounds when there are no bounds") if self.direction(): i = 0 else: i = 1 return self.bounds.data[..., i].squeeze(1, i=True) #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def upper_bounds(self): ''' The upper dimension coordinate bounds in a `cf.Data` object. .. seealso:: `bounds`, `lower_bounds` :Examples: >>> print c.bounds.array [[ 5 3] [ 3 1] [ 1 -1]] >>> c.upper_bounds >>> c.upper_bounds.array array([5, 3, 1]) ''' if not self._hasbounds or not self.bounds._hasData: raise ValueError("Can't get upper bounds when there are no bounds") if self.direction(): i = 1 else: i = 0 return self.bounds.data[..., i].squeeze(1, i=True) #--- End: def # def anchor(self, value, i=False, dry_run=False): # ''' # ''' # if i or dry_run: # c = self # else: # c = self.copy() # # # period = c.period() # if period is None: # raise ValueError( #"Cyclic {!r} axis has no period".format(dim.name())) # # value = Data.asdata(value) # if not value.Units: # value = value.override_units(dim.Units) # elif not value.Units.equivalent(dim.Units): # raise ValueError( #"Anchor value has incompatible units: {!r}".format(value.Units)) # # axis_size = self.size # if axis_size <= 1: # # Don't need to roll a size one axis # if dry_run: # return {'axis': axis, 'roll': 0, 'nperiod': 0} # else: # return c # # d = c.data # # if c.increasing: # # Adjust value so it's in the range [d[0], d[0]+period) # n = ((d[0] - value) / period).ceil(i=True) # value1 = value + n * period # # shift = axis_size - numpy_argmax(d - value1 >= 0) # if not dry_run: # c.roll(axis, shift, i=True) # # dim = domain.item(axis) # n = ((value - c.data[0]) / period).ceil(i=True) # else: # # Adjust value so it's in the range (d[0]-period, d[0]] # n = ((d[0] - value) / period).floor(i=True) # value1 = value + n * period # # shift = axis_size - numpy_argmax(value1 - d >= 0) # if not dry_run: # c.roll(axis, shift, i=True) # # dim = domain.item(axis) # n = ((value - c.data[0]) / period).floor(i=True) # #--- End: if # # if dry_run: # return {'axis': axis, 'roll': shift, 'nperiod': n*period} # # if n: # np = n * period # c += np # if c.hasbounds: # bounds = c.bounds # bounds += np # #--- End: if # # return c # #--- End: def def asdimension(self, copy=True): ''' Return the dimension coordinate. :Parameters: copy: `bool`, optional If False then the returned dimension coordinate is not independent. By default the returned dimension coordinate is independent. :Returns: out: `cf.DimensionCoordinate` The dimension coordinate. :Examples: >>> d = c.asdimension() >>> print d is c True >>> d = c.asdimension(copy=False) >>> print d == c True >>> print d is c False ''' if copy: return self.copy() return self #--- End: def def direction(self): ''' Return True if the dimension coordinate is increasing, otherwise return False. A dimension coordinate is increasing if its coordinate values are increasing in index space. The direction is inferred from one of, in order of precedence: * The data array * The bounds data array * The `units` CF property :Returns: out: bool Whether or not the coordinate is increasing. :Examples: >>> c.array array([ 0 30 60]) >>> c.direction() True >>> c.bounds.array array([ 30 0]) >>> c.direction() False ''' _direction = self._direction if _direction is not None: return _direction _direction = self._infer_direction() self._direction = _direction return _direction #--- End: def #ppp # DimensionCoordinate method def get_bounds(self, create=False, insert=False, bound=None, cellsize=None, flt=0.5, copy=True): '''Get or create the cell bounds. Either return its existing bounds or, if there are none, optionally create bounds based on the coordinate array values. :Parameters: create: `bool`, optional If True then create bounds if and only if the the dimension coordinate does not already have them. Bounds for Voronoi cells are created unless *bound* or *cellsize* is set. insert: `bool`, optional If True then insert the created bounds into the coordinate in place. By default the created bounds are not inserted. Ignored if *create* is not True. bound: optional If set to a value larger (smaller) than the largest (smallest) coordinate value then bounds are created which include this value and for which each coordinate is in the centre of its bounds. Ignored if *create* is False. cellsize: optional Define the exact size of each cell that is created. Created cells are allowed to overlap do not have to be contigious. Ignored if *create* is False. The *cellsize* parameter may be one of: * A data-like scalar (see below) that defines the cell size, either in the same units as the coordinates or in the units provided. Note that in this case, the position of each coordinate within the its cell is controlled by the *flt* parameter. *Example:* To specify cellsizes of 10, in the same units as the coordinates: ``cellsize=10``. *Example:* To specify cellsizes of 1 day: ``cellsize=cf.Data(1, 'day')`` (see `cf.Data` for details). *Example:* For coordinates ``1, 2, 10``, setting ``cellsize=1`` will result in bounds of ``(0.5, 1.5), (1.5, 2.5), (9.5, 10.5)``. *Example:* For coordinates ``1, 2, 10`` kilometres, setting ``cellsize=cf.Data(5000, 'm')`` will result in bounds of ``(-1.5, 3.5), (-0.5, 4.5), (7.5, 12.5)`` (see `cf.Data` for details). *Example:* For decreasing coordinates ``2, 0, -12`` setting, ``cellsize=2`` will result in bounds of ``(3, 1), (1, -1), (-11, -13)``. .. * A `cf.TimeDuration` defining the cell size. Only applicable to reference time coordinates. It is possible to "anchor" the cell bounds via the `cf.TimeDuration` parameters. For example, to specify cell size of one calendar month, starting and ending on the 15th day: ``cellsize=cf.M(day=15)`` (see `cf.M` for details). Note that the *flt* parameter is ignored in this case. *Example:* For coordinates ``1984-12-01 12:00, 1984-12-02 12:00, 2000-04-15 12:00`` setting, ``cellsize=cf.D()`` will result in bounds of ``(1984-12-01, 1984-12-02), (1984-12-02, 1984-12-03), (2000-05-15, 2000-04-16)`` (see `cf.D` for details). *Example:* For coordinates ``1984-12-01, 1984-12-02, 2000-04-15`` setting, ``cellsize=cf.D()`` will result in bounds of ``(1984-12-01, 1984-12-02), (1984-12-02, 1984-12-03), (2000-05-15, 2000-04-16)`` (see `cf.D` for details). *Example:* For coordinates ``1984-12-01, 1984-12-02, 2000-04-15`` setting, ``cellsize=cf.D(hour=12)`` will result in bounds of ``(1984-11:30 12:00, 1984-12-01 12:00), (1984-12-01 12:00, 1984-12-02 12:00), (2000-05-14 12:00, 2000-04-15 12:00)`` (see `cf.D` for details). *Example:* For coordinates ``1984-12-16 12:00, 1985-01-16 12:00`` setting, ``cellsize=cf.M()`` will result in bounds of ``(1984-12-01, 1985-01-01), (1985-01-01, 1985-02-01)`` (see `cf.M` for details). *Example:* For coordinates ``1984-12-01 12:00, 1985-01-01 12:00`` setting, ``cellsize=cf.M()`` will result in bounds of ``(1984-12-01, 1985-01-01), (1985-01-01, 1985-02-01)`` (see `cf.M` for details). *Example:* For coordinates ``1984-12-01 12:00, 1985-01-01 12:00`` setting, ``cellsize=cf.M(day=20)`` will result in bounds of ``(1984-11-20, 1984-12-20), (1984-12-20, 1985-01-20)`` (see `cf.M` for details). *Example:* For coordinates ``1984-03-01, 1984-06-01`` setting, ``cellsize=cf.Y()`` will result in bounds of ``(1984-01-01, 1985-01-01), (1984-01-01, 1985-01-01)`` (see `cf.Y` for details). Note that in this case each cell has the same bounds. This because ``cf.Y()`` is equivalent to ``cf.Y(month=1, day=1)`` and the closest 1st January to both coordinates is 1st January 1984. {+data-like-scalar} flt: `float`, optional When creating cells with sizes specified by the *cellsize* parameter, define the fraction of the each cell which is less its coordinate value. By default *flt* is 05, so that each cell has its coordinate at it's centre. Ignored if *cellsize* is not set. *Example:* For coordinates ``1, 2, 10``, setting ``cellsize=1, flt=0.5`` will result in bounds of ``(0.5, 1.5), (1.5, 2.5), (9.5, 10.5)``. *Example:* For coordinates ``1, 2, 10``, setting ``cellsize=1, flt=0.25`` will result in bounds of ``(0.75, 1.75), (1.75, 2.75), (9.75, 10.75)``. *Example:* For decreasing coordinates ``2, 0, -12``, setting ``cellsize=6, flt=0.9`` will result in bounds of ``(2.6, -3.4), (0.6, -5.4), (-11.4, -17.4)``. copy: `bool`, optional If False then the returned bounds are not independent of the existing bounds, if any, or those inserted, if *create* and *insert* are both True. By default the returned bounds are independent. :Returns: out: `cf.CoordinateBounds` The existing or created bounds. :Examples: >>> c.get_bounds() >>> c.get_bounds(create=True) >>> c.get_bounds(create=True, bound=60) >>> c.get_bounds(create=True, insert=True) >>> c.get_bounds(create=True, bound=-9000.0, insert=True, copy=False) ''' if self._hasbounds: if copy: return self.bounds.copy() else: return self.bounds if not create: raise ValueError( "Dimension coordinates have no bounds and create={0}".format(create)) array = self.unsafe_array size = array.size if cellsize is not None: if bound: raise ValueError( "bound parameter can't be True when setting the cellsize parameter") if not isinstance(cellsize, TimeDuration): # ---------------------------------------------------- # Create bounds based on cell sizes defined by a # data-like object # # E.g. cellsize=10 # cellsize=cf.Data(1, 'day') # ---------------------------------------------------- cellsize = Data.asdata(abs(cellsize)) if cellsize.Units: if self.Units.isreftime: if not cellsize.Units.istime: raise ValueError("q123423423jhgsjhbd jh ") cellsize.Units = Units(self.Units._utime.units) else: if not cellsize.Units.equivalent(self.Units): raise ValueError("jhgsjhbd jh ") cellsize.Units = self.Units cellsize = cellsize.datum() cellsize0 = cellsize * flt cellsize1 = cellsize * (1 - flt) if not self.direction(): cellsize0, cellsize1 = -cellsize1, -cellsize0 bounds = numpy_empty((size, 2), dtype=array.dtype) bounds[:, 0] = array - cellsize0 bounds[:, 1] = array + cellsize1 else: # ---------------------------------------------------- # Create bounds based on cell sizes defined by a # TimeDuration object # # E.g. cellsize=cf.s() # cellsize=cf.m() # cellsize=cf.h() # cellsize=cf.D() # cellsize=cf.M() # cellsize=cf.Y() # cellsize=cf.D(hour=12) # cellsize=cf.M(day=16) # cellsize=cf.M(2) # cellsize=cf.M(2, day=15, hour=12) # ---------------------------------------------------- if not self.Units.isreftime: raise ValueError( "Can't create reference time bounds for non-reference time coordinates: {0!r}".format( self.Units)) bounds = numpy_empty((size, 2), dtype=object) cellsize_bounds = cellsize.bounds calendar = getattr(self, 'calendar', None) direction = bool(self.direction()) for c, b in izip(self.dtarray, bounds): b[...] = cellsize_bounds(*c.timetuple()[:6], calendar=calendar, direction=direction) else: if bound is None: # ---------------------------------------------------- # Creat Voronoi bounds # ---------------------------------------------------- if size < 2: raise ValueError( "Can't create bounds for Voronoi cells from one value") bounds_1d = [array.item(0,)*1.5 - array.item(1,)*0.5] bounds_1d.extend((array[0:-1] + array[1:])*0.5) bounds_1d.append(array.item(-1,)*1.5 - array.item(-2,)*0.5) dtype = type(bounds_1d[0]) else: # ---------------------------------------------------- # Create # ---------------------------------------------------- direction = self.direction() if not direction and size > 1: array = array[::-1] bounds_1d = [bound] if bound <= array.item(0,): for i in xrange(size): bound = 2.0*array.item(i,) - bound bounds_1d.append(bound) elif bound >= array.item(-1,): for i in xrange(size-1, -1, -1): bound = 2.0*array.item(i,) - bound bounds_1d.append(bound) bounds_1d = bounds_1d[::-1] else: raise ValueError("bad bound value") dtype = type(bounds_1d[-1]) if not direction: bounds_1d = bounds_1d[::-1] #--- End: if bounds = numpy_empty((size, 2), dtype=dtype) bounds[:,0] = bounds_1d[:-1] bounds[:,1] = bounds_1d[1:] #--- End: if # Create coordinate bounds object bounds = CoordinateBounds(data=Data(bounds, self.Units), copy=False) if insert: # Insert coordinate bounds in-place self.insert_bounds(bounds, copy=copy) return bounds #--- End: def def period(self, *value): '''Set the period for cyclic coordinates. :Parameters: value: data-like or `None`, optional The period. The absolute value is used. {+data-like-scalar} :Returns: out: `cf.Data` or `None` The period prior to the change, or the current period if no *value* was specified. In either case, None is returned if the period had not been set previously. :Examples: >>> print c.period() None >>> c.Units >>> print c.period(360) None >>> c.period() >>> import math >>> c.period(cf.Data(2*math.pi, 'radians')) >>> c.period() >>> c.period(None) >>> print c.period() None >>> print c.period(-360) None >>> c.period() ''' old = self._period if old is not None: old = old.copy() if not value: return old value = value[0] if value is not None: value = Data.asdata(abs(value*1.0)) units = value.Units if not units: value = value.override_units(self.Units) elif not units.equivalent(self.Units): raise ValueError( "Period units {0!r} are not equivalent to coordinate units {1!r}".format( units, self.Units)) range = self.Data.range() if range >= value: raise ValueError( "The coordinate range {0!r} is not less than the period {1!r}".format( range, value)) #--- End: if self._period = value return old #--- End: def def roll(self, axis, shift, i=False): ''' {+i} ''' if self.size <= 1: if i: return self else: return self.copy() shift %= self.size period = self._period if not shift: # Null roll if i: return self else: return self.copy() elif period is None: raise ValueError( "Can't roll %s array by %s positions when no period has been set" % (shift, self.__class__.__name__)) direction = self.direction() # if direction: # mx = self.Data[-1] # else: # mx = self.Data[0] # # centre = (mx // period) * period centre = self._centre(period) c = super(DimensionCoordinate, self).roll(axis, shift, i=i) isbounded = c._hasbounds if isbounded: b = c.bounds if not b._hasData: isbounded = False #--- End: if if direction: # Increasing c.subspace[:shift] -= period if isbounded: b.subspace[:shift] -= period if c.Data[0] <= centre - period: c += period if isbounded: b += period else: # Decreasing c.subspace[:shift] += period if isbounded: b.subspace[:shift] += period if c.Data[0] >= centre + period: c -= period if isbounded: b -= period #--- End: if c._direction = direction # # # if self.direction(): # indices = c > c.subspace[-1] # else: # indices = c > c.subspace[0] # # c.setdata(c - period, None, indices) # # isbounded = c._hasbounds # if isbounded: # b = c.bounds # if b._hasData: # indices.expand_dims(1, i=True) # b.setdata(b - period, None, indices) # else: # isbounded = False # #--- End: if # # shift = None # if self.direction(): # # Increasing # if c.datum(0) <= centre - period: # shift = period ## c += period # elif c.datum(-1) >= centre + period: # shift = -period ## c -= period # else: # # Decreasing # if c.datum(0) >= centre + period: # shift = -period ## c -= period # elif c.datum(-1) <= centre - period: # shift = period ## c += period # #--- End: if # # if shift: # c += shift # if isbounded: # b += shift # #--- End: if return c #--- End: def #--- End: class # ==================================================================== # # AuxiliaryCoordinate object # # ==================================================================== class AuxiliaryCoordinate(Coordinate): ''' A CF auxiliary coordinate construct. **Attributes** =============== ======== =================================================== Attribute Type Description =============== ======== =================================================== `!climatology` ``bool`` Whether or not the bounds are intervals of climatological time. Presumed to be False if unset. =============== ======== =================================================== ''' @property def isauxiliary(self): ''' True for auxiliary coordinate constructs, False otherwise. .. seealso:: `ismeasure`, `isdimension` :Examples: >>> c.isauxiliary True ''' return True #--- End: def @property def isdimension(self): ''' True for dimension coordinate constructs, False otherwise. .. seealso:: `isauxiliary`, `ismeasure` :Examples: >>> c.isdimension False ''' return False #--- End: def def asauxiliary(self, copy=True): ''' Return the auxiliary coordinate. :Parameters: copy: `bool`, optional If False then the returned auxiliary coordinate is not independent. By default the returned auxiliary coordinate is independent. :Returns: out: `cf.AuxiliaryCoordinate` The auxiliary coordinate. :Examples: >>> d = c.asauxiliary() >>> print d is c True >>> d = c.asauxiliary(copy=False) >>> print d == c True >>> print d is c False ''' if copy: return self.copy() return self #--- End: def #--- End: class def _parse_axes(axes): if axes is None: return axes return [(i + ndim if i < 0 else i) for i in axes] cf-python-1.3.2/cf/um/0000755000175000017500000000000012770523315014642 5ustar daviddavid00000000000000cf-python-1.3.2/cf/um/__init__.py0000600000175000017500000000000012603546021016723 0ustar daviddavid00000000000000cf-python-1.3.2/cf/um/read.py0000644000175000017500000031041212764213712016130 0ustar daviddavid00000000000000import os import netCDF4 import csv import re import textwrap from datetime import datetime from numpy import any as numpy_any from numpy import arange as numpy_arange from numpy import arccos as numpy_arccos from numpy import arcsin as numpy_arcsin from numpy import array as numpy_array from numpy import clip as numpy_clip from numpy import column_stack as numpy_column_stack from numpy import cos as numpy_cos from numpy import deg2rad as numpy_deg2rad from numpy import dtype as numpy_dtype from numpy import empty as numpy_empty from numpy import mean as numpy_mean from numpy import pi as numpy_pi from numpy import rad2deg as numpy_rad2deg from numpy import resize as numpy_resize from numpy import result_type as numpy_result_type from numpy import sin as numpy_sin from numpy import transpose as numpy_transpose from numpy import where as numpy_where from netCDF4 import date2num as netCDF4_date2num from .. import __version__, __Conventions__, __file__ from ..domain import Domain from ..coordinatereference import CoordinateReference from ..field import Field, FieldList from ..cellmethods import CellMethods from ..cfdatetime import Datetime from ..coordinate import DimensionCoordinate, AuxiliaryCoordinate from ..functions import RTOL, ATOL, equals from ..units import Units from ..functions import (open_files_threshold_exceeded, close_one_file, abspath) from ..data.data import Data, Partition, PartitionMatrix from .filearray import UMFileArray from .functions import _open_um_file from .umread.umfile import UMFileException # -------------------------------------------------------------------- # Constants # -------------------------------------------------------------------- _pi_over_180 = numpy_pi/180.0 # PP missing data indicator _pp_rmdi = -1.0e+30 # Reference surface pressure in Pascals _pstar = 1.0e5 # -------------------------------------------------------------------- # Characters used in decoding LBEXP into a runid # -------------------------------------------------------------------- _characters = ('a','b','c','d','e','f','g','h','i','j','k','l','m', 'n','o','p','q','r','s','t','u','v','w','x','y','z', '0','1','2','3','4','5','6','7','8','9') _n_characters = len(_characters) # -------------------------------------------------------------------- # Number matching regular expression # -------------------------------------------------------------------- _number_regex = '([-+]?\d*\.?\d+(e[-+]?\d+)?)' # -------------------------------------------------------------------- # Date-time object that copes with non-standard calendars # -------------------------------------------------------------------- netCDF4_netcdftime_datetime = netCDF4.netcdftime.datetime # -------------------------------------------------------------------- # Caches for derived values # -------------------------------------------------------------------- _cache_latlon = {} _cached_runid = {} _cached_latlon = {} _cached_time = {} _cached_ctime = {} _cached_size_1_height_coordinate = {} _cached_z_coordinate = {} _cached_date2num = {} _cached_model_level_number_coordinate = {} _Units = { None : Units(), '' : Units(''), '1' : Units('1'), 'Pa' : Units('Pa'), 'm' : Units('m'), 'hPa' : Units('hPa'), 'K' : Units('K'), 'degrees' : Units('degrees'), 'degrees_east' : Units('degrees_east'), 'degrees_north' : Units('degrees_north'), 'days' : Units('days'), 'gregorian 1752-9-13': Units('days since 1752-9-13', 'gregorian'), '365_day 1752-9-13' : Units('days since 1752-9-13', '365_day'), '360_day 0-1-1' : Units('days since 0-1-1', '360_day'), } # -------------------------------------------------------------------- # Names of PP integer and real header items # -------------------------------------------------------------------- _header_names = ('LBYR', 'LBMON', 'LBDAT', 'LBHR', 'LBMIN', 'LBDAY', 'LBYRD', 'LBMOND', 'LBDATD', 'LBHRD', 'LBMIND', 'LBDAYD', 'LBTIM', 'LBFT', 'LBLREC', 'LBCODE', 'LBHEM', 'LBROW', 'LBNPT', 'LBEXT', 'LBPACK', 'LBREL', 'LBFC', 'LBCFC', 'LBPROC', 'LBVC', 'LBRVC', 'LBEXP', 'LBEGIN', 'LBNREC', 'LBPROJ', 'LBTYP', 'LBLEV', 'LBRSVD1', 'LBRSVD2', 'LBRSVD3', 'LBRSVD4', 'LBSRCE', 'LBUSER1', 'LBUSER2', 'LBUSER3', 'LBUSER4', 'LBUSER5', 'LBUSER6', 'LBUSER7', 'BRSVD1', 'BRSVD2', 'BRSVD3', 'BRSVD4', 'BDATUM', 'BACC', 'BLEV', 'BRLEV', 'BHLEV', 'BHRLEV', 'BPLAT', 'BPLON', 'BGOR', 'BZY', 'BDY', 'BZX', 'BDX', 'BMDI', 'BMKS') # -------------------------------------------------------------------- # Positions of PP header items in their arrays # -------------------------------------------------------------------- (lbyr, lbmon, lbdat, lbhr, lbmin, lbday, lbyrd, lbmond, lbdatd, lbhrd, lbmind, lbdayd, lbtim, lbft, lblrec, lbcode, lbhem, lbrow, lbnpt, lbext, lbpack, lbrel, lbfc, lbcfc, lbproc, lbvc, lbrvc, lbexp, lbegin, lbnrec, lbproj, lbtyp, lblev, lbrsvd1, lbrsvd2, lbrsvd3, lbrsvd4, lbsrce, lbuser1, lbuser2, lbuser3, lbuser4, lbuser5, lbuser6, lbuser7, ) = range(45) (brsvd1, brsvd2, brsvd3, brsvd4, bdatum, bacc, blev, brlev, bhlev, bhrlev, bplat, bplon, bgor, bzy, bdy, bzx, bdx, bmdi, bmks, ) = range(19) # -------------------------------------------------------------------- # Assign CF standard name attributes to PP axis codes. (The full list # of field code keys may be found at # http://cms.ncas.ac.uk/html_umdocs/wave/@header.) # -------------------------------------------------------------------- _coord_standard_name = { 0 : None, # Sigma (or eta, for hybrid coordinate data). 1 : 'air_pressure', # Pressure (mb). 2 : 'altitude', # Height above sea level (km). 3 : 'atmosphere_hybrid_sigma_pressure_coordinate', # Eta (U.M. hybrid coordinates) only. 4 : 'depth', # Depth below sea level (m) 5 : 'model_level_number', # Model level. 6 : 'air_potential_temperature', # Theta 7 : 'atmosphere_sigma_coordinate', # Sigma only. 8 : None, # Sigma-theta 10 : 'latitude', # Latitude (degrees N). 11 : 'longitude', # Longitude (degrees E). 13 : 'region', # Site number (set of parallel rows or columns e.g.Time series) 14 : 'atmosphere_hybrid_height_coordinate', 15 : 'height', 20 : 'time', # Time (days) (Gregorian calendar (not 360 day year)) 21 : 'time', # Time (months) 22 : 'time', # Time (years) 23 : 'time', # Time (model days with 360 day model calendar) 40 : None, # pseudolevel 99 : None, # Other -10 : 'grid_latitude', # Rotated latitude (degrees). -11 : 'grid_longitude', # Rotated longitude (degrees). -20 : 'radiation_wavelength', } # -------------------------------------------------------------------- # Assign CF long names to PP axis codes. # -------------------------------------------------------------------- _coord_long_name = {} # -------------------------------------------------------------------- # Assign CF units strings to PP axis codes. # -------------------------------------------------------------------- #_coord_units = { _axiscode_to_units = { 0 : '1', # Sigma (or eta, for hybrid coordinate data) 1 : 'hPa', # air_pressure 2 : 'm', # altitude 3 : '1', # atmosphere_hybrid_sigma_pressure_coordinate 4 : 'm', # depth 5 : '1', # model_level_number 6 : 'K', # air_potential_temperature 7 : '1', # atmosphere_sigma_coordinate 10 : 'degrees_north', # latitude 11 : 'degrees_east', # longitude 13 : '', # region 14 : '1', # atmosphere_hybrid_height_coordinate 15 : 'm', # height 20 : 'days', # time (gregorian) 23 : 'days', # time (360_day) 40 : '1', # pseudolevel -10 : 'degrees', # rotated latitude (not an official axis code) -11 : 'degrees', # rotated longitude (not an official axis code) } _axiscode_to_Units = { 0 : _Units['1'], # Sigma (or eta, for hybrid coordinate data) 1 : _Units['hPa'], # air_pressure 2 : _Units['m'], # altitude 3 : _Units['1'], # atmosphere_hybrid_sigma_pressure_coordinate 4 : _Units['m'], # depth 5 : _Units['1'], # model_level_number 6 : _Units['K'], # air_potential_temperature 7 : _Units['1'], # atmosphere_sigma_coordinate 10 : _Units['degrees_north'], # latitude 11 : _Units['degrees_east'], # longitude 13 : _Units[''], # region 14 : _Units['1'], # atmosphere_hybrid_height_coordinate 15 : _Units['m'], # height 20 : _Units['days'], # time (gregorian) 23 : _Units['days'], # time (360_day) 40 : _Units['1'], # pseudolevel -10 : _Units['degrees'], # rotated latitude (not an official axis code) -11 : _Units['degrees'], # rotated longitude (not an official axis code) } # -------------------------------------------------------------------- # Assign CF axis attributes to PP axis codes. # -------------------------------------------------------------------- _coord_axis = { 1 : 'Z', # air_pressure 2 : 'Z', # altitude 3 : 'Z', # atmosphere_hybrid_sigma_pressure_coordinate 4 : 'Z', # depth 5 : 'Z', # model_level_number 6 : 'Z', # air_potential_temperature 7 : 'Z', # atmosphere_sigma_coordinate 10 : 'Y', # latitude 11 : 'X', # longitude 13 : None, # region 14 : 'Z', # atmosphere_hybrid_height_coordinate 15 : 'Z', # height 20 : 'T', # time (gregorian) 23 : 'T', # time (360_day) 40 : None, # pseudolevel -10 : 'Y', # rotated latitude (not an official axis code) -11 : 'X', # rotated longitude (not an official axis code) } # -------------------------------------------------------------------- # Assign CF positive attributes to PP axis codes. # -------------------------------------------------------------------- _coord_positive = { 1 : 'down', # air_pressure 2 : 'up', # altitude 3 : 'down', # atmosphere_hybrid_sigma_pressure_coordinate 4 : 'down', # depth 5 : None, # model_level_number 6 : 'up', # air_potential_temperature 7 : 'down', # atmosphere_sigma_coordinate 10 : None, # latitude 11 : None, # longitude 13 : None, # region 14 : 'up', # atmosphere_hybrid_height_coordinate 15 : 'up', # height 20 : None, # time (gregorian) 23 : None, # time (360_day) 40 : None, # pseudolevel -10 : None, # rotated latitude (not an official axis code) -11 : None, # rotated longitude (not an official axis code) } # -------------------------------------------------------------------- # Translate LBVC codes to PP axis codes. (The full list of field code # keys may be found at # http://cms.ncas.ac.uk/html_umdocs/wave/@fcodes.) # -------------------------------------------------------------------- _lbvc_to_axiscode = { 1 : 2, # altitude (Height) 2 : 4, # depth (Depth) 3 : None, # (Geopotential (= g*height)) 4 : None, # (ICAO height) 6 : 5, # model_level_number 7 : None, # (Exner pressure) 8 : 1, # air_pressure (Pressure) 9 : 3, # atmosphere_hybrid_sigma_pressure_coordinate (Hybrid pressure) 10 : 7, # atmosphere_sigma_coordinate (Sigma (= p/surface p)) ## dch check 16 : None, # (Temperature T) 19 : 6, # air_potential_temperature (Potential temperature) 27 : None, # (Atmospheric) density 28 : None, # (d(p*)/dt . p* = surface pressure) 44 : None, # (Time in seconds) 65 : 14, # atmosphere_hybrid_height_coordinate (Hybrid height) 129 : None, # Surface 176 : 10, # latitude (Latitude) 177 : 11, # longitude (Longitude) } # -------------------------------------------------------------------- # Names of PP extra data codes # -------------------------------------------------------------------- _extra_data_name = { 1 : 'x', 2 : 'y', 3 : 'y_domain_lower_bound', 4 : 'x_domain_lower_bound', 5 : 'y_domain_upper_bound', 6 : 'x_domain_upper_bound', 7 : 'z_domain_lower_bound', 8 : 'x_domain_upper_bound', 9 : 'title', 10 : 'domain_title', 11 : 'x_lower_bound', 12 : 'x_upper_bound', 13 : 'y_lower_bound', 14 : 'y_upper_bound', } # -------------------------------------------------------------------- # Model identifier codes. These are the the last four digits of # LBSRCE. # -------------------------------------------------------------------- _lbsrce_model_codes = {1111 : 'UM'} # -------------------------------------------------------------------- # LBCODE values for unrotated latitude longitude grids # -------------------------------------------------------------------- _true_latitude_longitude_lbcodes = set((1, 2)) # -------------------------------------------------------------------- # LBCODE values for rotated latitude longitude grids # -------------------------------------------------------------------- _rotated_latitude_longitude_lbcodes = set((101, 102, 111)) _axis = {'t' : 'dim0', 'z' : 'dim1', 'y' : 'dim2', 'x' : 'dim3', 'r' : 'dim4', 'p' : 'dim5', 'area': None, } class UMField(object): ''' ''' _debug = False def __init__(self, var, fmt, byte_ordering, word_size, um_version, set_standard_name, height_at_top_of_model, **kwargs): ''' **Initialization** :Parameters: var : cf.um.umread.umfile.Var byte_ordering : str 'little_endian' or 'big_endian' word_size : int Word size in bytes (4 or 8). fmt : str 'PP' or 'FF' um_version : number set_standard_name : bool If True then set the standard_name CF property. height_at_top_of_model : float, optional **kwargs : *optional* Keyword arguments specifying CF properties for the UM field. ''' self._nonzero = False self.fmt = fmt self.height_at_top_of_model = height_at_top_of_model self.byte_ordering = byte_ordering self.word_size = word_size self.atol = ATOL() self.domain = Domain() cf_properties = {} attributes = {} self.fields = [] filename = abspath(var.file.path) self.filename = filename groups = var.group_records_by_extra_data() n_groups = len(groups) if n_groups == 1: # There is one group of records groups_nz = [var.nz] groups_nt = [var.nt] elif n_groups > 1: # There are multiple groups of records, distinguished by # different extra data. groups_nz = [] groups_nt = [] groups2 = [] for group in groups: group_size = len(group) if group_size == 1: # There is only one record in this group split_group= False nz = 1 elif group_size > 1: # There are multiple records in this group # Find the lengths of runs of identical times times = [(self.header_vtime(rec), self.header_dtime(rec)) for rec in group] lengths = [len(tuple(g)) for k, g in itertools.groupby(times)] if len(set(lengths)) == 1: # Each run of identical times has the same # length, so it is possible that this group # forms a variable of nz x nt records. split_group = False nz = lengths.pop() z0 = [self.z for rec in group[:nz]] for i in range(nz, group_size, nz): z1 = [self.header_z(rec) for rec in group[i:i+nz]] if z1 != z0: split_group = True break else: # Different runs of identical times have # different lengths, so it is not possible for # this group to form a variable of nz x nt # records. split_group = True nz = 1 #--- End: if if split_group: # This group doesn't form a complete nz x nt # matrix, so split it up into 1 x 1 groups. groups2.extend([[rec] for rec in group]) groups_nz.extend([1] * group_size) groups_nt.extend([1] * group_size) else: # This group forms a complete nz x nt matrix, so # it may be considered as a variable in its own # right and doesn't need to be split up. groups2.append(group) groups_nz.append(nz) groups_nt.append(group_size/nz) #--- End: for groups = groups2 #--- End: if rec0 = groups[0][0] int_hdr = rec0.int_hdr self.int_hdr_dtype = int_hdr.dtype int_hdr = int_hdr.tolist() real_hdr = rec0.real_hdr.tolist() self.int_hdr = int_hdr self.real_hdr = real_hdr # ------------------------------------------------------------ # Set some metadata quantities which are guaranteed to be the # same for all records in a variable # ------------------------------------------------------------ LBNPT = int_hdr[lbnpt] LBROW = int_hdr[lbrow] LBTIM = int_hdr[lbtim] LBCODE = int_hdr[lbcode] LBPROC = int_hdr[lbproc] LBVC = int_hdr[lbvc] LBUSER5 = int_hdr[lbuser5] BPLAT = real_hdr[bplat] BPLON = real_hdr[bplon] BDX = real_hdr[bdx] BDY = real_hdr[bdy] self.lbnpt = LBNPT self.lbrow = LBROW self.lbtim = LBTIM self.lbproc = LBPROC self.lbvc = LBVC self.bplat = BPLAT self.bplon = BPLON self.bdx = BDX self.bdy = BDY # ------------------------------------------------------------ # Set some derived metadata quantities which are (as good as) # guaranteed to be the same for all records in a variable # ------------------------------------------------------------ self.lbtim_ia, ib = divmod(LBTIM, 100) self.lbtim_ib, ic = divmod(ib, 10) if ic == 1: calendar = 'gregorian' elif ic == 4: calendar = '365_day' else: calendar = '360_day' self.calendar = calendar self.reference_time_Units() header_um_version, source = divmod(int_hdr[lbsrce], 10000) if header_um_version > 0 and int(um_version) == um_version: #len(um_version) <= 3: # header_um_version = str(header_um_version) model_um_version = header_um_version self.um_version = header_um_version else: model_um_version = None self.um_version = um_version # Set source source = _lbsrce_model_codes.setdefault(source, None) if source is not None and model_um_version is not None: source += ' vn%s' % model_um_version if source: cf_properties['source'] = source # ------------------------------------------------------------ # Set the T, Z, Y and X axis codes. These are guaranteed to be # the same for all records in a variable. # ------------------------------------------------------------ if LBCODE == 1 or LBCODE == 2: # 1 = Unrotated regular lat/long grid # 2 = Regular lat/lon grid boxes (grid points are box # centres) ix = 11 iy = 10 elif LBCODE == 101 or LBCODE == 102: # 101 = Rotated regular lat/long grid # 102 = Rotated regular lat/lon grid boxes (grid points # are box centres) ix = -11 # rotated longitude (not an official axis code) iy = -10 # rotated latitude (not an official axis code) elif LBCODE >= 10000: # Cross section ix, iy = divmod(divmod(LBCODE, 10000)[1], 100) else: ix = None iy = None iz = _lbvc_to_axiscode.setdefault(LBVC, None) # Set it from the calendar type if iy in (20, 23) or ix in (20, 23): # Time is dealt with by x or y it = None elif calendar == 'gregorian': it = 20 else: it = 23 self.ix = ix self.iy = iy self.iz = iz self.it = it self.cf_info = {} # Set a identifying name based on the submodel and STASHcode # (or field code). stash = int_hdr[lbuser4] submodel = int_hdr[lbuser7] self.stash = stash # The STASH code has been set in the PP header, so try to find # its standard_name from the conversion table stash_records = _stash2standard_name.get((submodel, stash), None) um_Units = None long_name = None um_condition = None if stash_records: um_version = self.um_version for (long_name, units, valid_from, valid_to, standard_name, cf_info, um_condition) in stash_records: # Check that conditions are met if not self.test_um_version(valid_from, valid_to, um_version): continue if um_condition: if not self.test_um_condition(um_condition, LBCODE, BPLAT, BPLON): continue # Still here? Then we have our standard_name, etc. if standard_name: if set_standard_name: cf_properties['standard_name'] = standard_name else: attributes['_standard_name'] = standard_name cf_properties['long_name'] = long_name.rstrip() um_Units = _Units.get(units, None) if um_Units is None: um_Units = Units(units) _Units[units] = um_Units self.um_Units = um_Units self.cf_info = cf_info break #--- End: for #--- End: if if stash: section, item = divmod(stash, 1000) um_stash_source = 'm%02ds%02di%03d' % (submodel, section, item) cf_properties['um_stash_source'] = um_stash_source identity = 'UM_%s_vn%s' % (um_stash_source, self.um_version) else: identity = 'UM_%d_fc%d_vn%s' % (submodel, int_hdr[lbfc], self.um_version) if um_Units is None: self.um_Units = _Units[None] if um_condition: identity += '_%s' % um_condition if long_name is None: cf_properties['long_name'] = identity for recs, nz, nt in zip(groups, groups_nz, groups_nt): self.recs = recs self.nz = nz self.nt = nt self.z_recs = recs[:nz] self.t_recs = recs[::nz] LBUSER5 = recs[0].int_hdr.item(lbuser5,) self.cell_method_axis_name = {'area': 'area'} self.down_axes = set() self.z_axis = 'z' # ------------------------------------------------------------ # Get the extra data for this group # ------------------------------------------------------------ extra = recs[0].get_extra_data() self.extra = extra # ------------------------------------------------------------ # Set some derived metadata quantities # ------------------------------------------------------------ if self._debug: print self.__dict__ self.printfdr() # ------------------------------------------------------------ # Create the 'T' dimension coordinate # ------------------------------------------------------------ axiscode = it if axiscode is not None: c = self.time_coordinate(axiscode) # ------------------------------------------------------------ # Create the 'Z' dimension coordinate # ------------------------------------------------------------ axiscode = iz if axiscode is not None: # Get 'Z' coordinate from LBVC if axiscode == 3: c = self.atmosphere_hybrid_sigma_pressure_coordinate(axiscode) elif axiscode == 2 and 'height' in self.cf_info: # Create the height coordinate from the information # given in the STASH to standard_name conversion table height, units = self.cf_info['height'] c = self.size_1_height_coordinate(axiscode, height, units) elif axiscode == 14: c = self.atmosphere_hybrid_height_coordinate(axiscode) else: c = self.z_coordinate(axiscode) # Create a model_level_number auxiliary coordinate LBLEV = int_hdr[lblev] if LBVC in (2, 9, 65) or LBLEV in (7777, 8888): # CHECK! self.LBLEV = LBLEV c = self.model_level_number_coordinate(aux=bool(c)) #--- End: if # ------------------------------------------------------------ # Create the 'Y' dimension coordinate # ------------------------------------------------------------ axiscode = iy yc = None if axiscode is not None: if axiscode in (20, 23): # 'Y' axis is time-since-reference-date if extra.get('y', None) is not None: c = self.time_coordinate_from_extra_data(axiscode, 'y') else: LBUSER3 = int_hdr[lbuser3] if LBUSER3 == LBROW: self.lbuser3 = LBUSER3 c = self.time_coordinate_from_um_timeseries(axiscode, 'y') else: yc = self.xy_coordinate(axiscode, 'y') #--- End: if # ------------------------------------------------------------ # Create the 'X' dimension coordinate # ------------------------------------------------------------ axiscode = ix xc = None if axiscode is not None: if axiscode in (20, 23): # X axis is time since reference date if extra.get('x', None) is not None: c = self.time_coordinate_from_extra_data(axiscode, 'x') else: LBUSER3 = int_hdr[lbuser3] if LBUSER3 == LBNPT: self.lbuser3 = LBUSER3 c = self.time_coordinate_from_um_timeseries(axiscode, 'x') else: xc = self.xy_coordinate(axiscode, 'x') #--- End: if # -10: rotated latitude (not an official axis code) # -11: rotated longitude (not an official axis code) if (iy, ix) == (-10, -11) or (iy, ix) == (-11, -10): # ---------------------------------------------------- # Create a ROTATED_LATITUDE_LONGITUDE coordinate # reference # ---------------------------------------------------- transform = CoordinateReference( name='rotated_latitude_longitude', grid_north_pole_latitude=BPLAT, grid_north_pole_longitude=BPLON, coords=(_axis['y'], _axis['x'])) # -------------------------------------------------------- # Create UNROTATED, 2-D LATITUDE and LONGITUDE auxiliary # coordinates # -------------------------------------------------------- self.latitude_longitude_2d_aux_coordinates(yc, xc, transform) # Insert the coordinate reference into the domain self.domain.insert_ref(transform, copy=False) #--- End: if # ------------------------------------------------------------ # Create a RADIATION WAVELENGTH dimension coordinate # ------------------------------------------------------------ try: rwl, rwl_units = self.cf_info['below'] except (KeyError, TypeError): pass else: c = self.radiation_wavelength_coordinate(rwl, rwl_units) # Set LBUSER5 to zero so that it is not confused for a # pseudolevel LBUSER5 = 0 #--- End: try # ------------------------------------------------------------ # Create a PSEUDOLEVEL dimension coordinate. This must be # done *after* the possible creation of a radiation # wavelength dimension coordinate. # ------------------------------------------------------------ if LBUSER5 != 0: self.pseudolevel_coordinate(LBUSER5) attributes['int_hdr'] = int_hdr[:] attributes['real_hdr'] = real_hdr[:] attributes['file'] = filename attributes['id'] = identity cf_properties['Conventions'] = __Conventions__ cf_properties['runid'] = self.decode_lbexp() cf_properties['lbproc'] = str(LBPROC) cf_properties['lbtim'] = str(LBTIM) cf_properties['stash_code'] = str(stash) # ------------------------------------------------------------ # Create cell methods # ------------------------------------------------------------ cell_methods = self.create_cell_methods() if cell_methods is not None: cf_properties['cell_methods'] = cell_methods # ------------------------------------------------------------ # Set the data and extra data # ------------------------------------------------------------ data = self.create_data() cf_properties['_FillValue'] = data.fill_value # ------------------------------------------------------------ # Create the field # ------------------------------------------------------------ # Add kwargs to the CF properties cf_properties.update(kwargs) field = Field(domain=self.domain, data=self.data, axes=self.data_axes, properties=cf_properties, attributes=attributes, copy=False) # Check for decreasing axes that aren't decreasing down_axes = self.down_axes if down_axes: field.flip(down_axes, i=True) # Force cyclic X axis for paritcular values of LBHEM if int_hdr[lbhem] in (0, 1, 2, 4): field.cyclic('X', period=360) self.fields.append(field) #--- End: for self._nonzero = True #--- End: def def __nonzero__(self): ''' x.__nonzero__() <==> bool(x) ''' return self._nonzero #--- End: if def __repr__(self): ''' x.__repr__() <==> repr(x) ''' return self.fdr() #--- End: def def __str__(self): ''' x.__str__() <==> str(x) ''' out = [self.fdr()] attrs = ('endian', 'reftime', 'vtime', 'dtime', 'um_version', 'source', 'it', 'iz', 'ix', 'iy', 'site_time_cross_section', 'timeseries', 'file') for attr in attrs: out.append('%s=%s' % (attr, getattr(self, attr, None))) out.append('') return '\n'.join(out) #--- End: def def atmosphere_hybrid_height_coordinate(self, axiscode): ''' **From appendix A of UMDP F3** From UM Version 5.2, the method of defining the model levels in PP headers was revised. At vn5.0 and 5.1, eta values were used in the PP headers to specify the levels of model data, which was of limited use when plotting data on model levels. From 5.2, the PP headers were redefined to give information on the height of the level. Given a 2D orography field, the height field for a given level can then be derived. The height coordinates for PP-output are defined as: Z(i,j,k)=Zsea(k)+C(k)*orography(i,j) where Zsea(k) and C(k) are height based hybrid coefficients. Zsea(k) = eta_value(k)*Height_at_top_of_model C(k)=[1-eta_value(k)/eta_value(first_constant_rho_level)]**2 forlevels less than or equal to first_constant_rho_level C(k)=0.0 for levels greater than first_constant_rho_level where eta_value(k) is the eta_value for theta or rho level k. The eta_value is a terrain-following height coordinate; full details are given in UMDP15, Appendix B. The PP headers store Zsea and C as follows :- * 46 = bulev = brsvd1 = Zsea of upper layer boundary * 52 = blev = Zsea of level * 53 = brlev = Zsea of lower layer boundary * 47 = bhulev = brsvd2 = C of upper layer boundary * 54 = bhlev = C of level * 55 = bhrlev = C of lower layer boundary :Parameters: axiscode : int :Returns: out : cf.DimensionCoordinate or None ''' domain = self.domain zdim = _axis['z'] # Insert new Z axis domain.insert_axis(self.nz, key=zdim) # "a" auxiliary coordinate array = numpy_array([rec.real_hdr[blev] for rec in self.z_recs], # Zsea dtype=float) bounds0 = numpy_array([rec.real_hdr[brlev] for rec in self.z_recs], #Zsea lower dtype=float) bounds1 = numpy_array([rec.real_hdr[brsvd1] for rec in self.z_recs], #Zsea upper dtype=float) bounds = numpy_column_stack((bounds0, bounds1)) ac = AuxiliaryCoordinate() ac = self.coord_data(ac, array, bounds, units=_Units['m']) ac.id = 'UM_atmosphere_hybrid_height_coordinate_a' ac.long_name = 'height based hybrid coeffient a' key_a = domain.insert_aux(ac, axes=[zdim], copy=False) # atmosphere_hybrid_height_coordinate dimension coordinate TOA_height = bounds1.max() if TOA_height <= 0: TOA_height = self.height_at_top_of_model if not TOA_height: dc = None else: array = array / TOA_height bounds = bounds / TOA_height dc = DimensionCoordinate() dc = self.coord_data(dc, array, bounds, units=_Units['']) dc.standard_name = 'atmosphere_hybrid_height_coordinate' dc = self.coord_axis(dc, axiscode) dc = self.coord_positive(dc, axiscode, zdim) domain.insert_dim(dc, key=zdim, copy=False) #--- End: if # "b" auxiliary coordinate array = numpy_array([rec.real_hdr[bhlev] for rec in self.z_recs], dtype=float) bounds0 = numpy_array([rec.real_hdr[bhrlev] for rec in self.z_recs], dtype=float) bounds1 = numpy_array([rec.real_hdr[brsvd2] for rec in self.z_recs], dtype=float) bounds = numpy_column_stack((bounds0, bounds1)) ac = AuxiliaryCoordinate() ac = self.coord_data(ac, array, bounds, units=_Units['1']) ac.id = 'UM_atmosphere_hybrid_height_coordinate_b' ac.long_name = 'height based hybrid coeffient b' key_b = domain.insert_aux(ac, axes=[zdim], copy=False) if bool(dc): self.cell_method_axis_name['z'] = dc.identity() # atmosphere_hybrid_height_coordinate coordinate reference ref = CoordinateReference( name='atmosphere_hybrid_height_coordinate', a=key_a, b=key_b, coords=(key_a, key_b), coord_terms=('a', 'b')) self.domain.insert_ref(ref, copy=False) #--- End: if return dc #--- End: def def depth_coordinate(self, axiscode): ''' :Parameters: axiscode : int :Returns: out : cf.DimensionCoordinate or None ''' dc = self.model_level_number_coordinate(aux=False) domain = self.domain zdim = _axis['z'] array = numpy_array([rec.real_hdr[blev] for rec in self.z_recs], dtype=float) bounds0 = numpy_array([rec.real_hdr[brlev] for rec in self.z_recs], dtype=float) bounds1 = numpy_array([rec.real_hdr[brsvd1] for rec in self.z_recs], dtype=float) bounds = numpy_column_stack((bounds0, bounds1)) ac = AuxiliaryCoordinate() ac = self.coord_data(ac, array, bounds, units=_Units['m']) ac.id = 'UM_atmosphere_hybrid_height_coordinate_ak' ac.long_name = 'atmosphere_hybrid_height_coordinate_ak' domain.insert_aux(ac, axes=[zdim], copy=False) array = numpy_array([rec.real_hdr[bhlev] for rec in self.z_recs], dtype=float) bounds0 = numpy_array([rec.real_hdr[bhrlev] for rec in self.z_recs], dtype=float) bounds1 = numpy_array([rec.real_hdr[brsvd2] for rec in self.z_recs], dtype=float) bounds = numpy_column_stack((bounds0, bounds1)) ac = AuxiliaryCoordinate() ac = self.coord_data(ac, array, bounds, units=_Units['1']) ac.id = 'UM_atmosphere_hybrid_height_coordinate_bk' ac.long_name = 'atmosphere_hybrid_height_coordinate_bk' domain.insert_aux(ac, axes=[zdim], copy=False) if dc: self.cell_method_axis_name['z'] = dc.identity() return dc #--- End: def def atmosphere_hybrid_sigma_pressure_coordinate(self, axiscode): ''' atmosphere_hybrid_sigma_pressure_coordinate when not an array axis :Parameters: axiscode : int :Returns: out : cf.DimensionCoordinate ''' # 46 BULEV Upper layer boundary or BRSVD(1) # # 47 BHULEV Upper layer boundary or BRSVD(2) # # For hybrid levels: # - BULEV is B-value at half-level above. # - BHULEV is A-value at half-level above. # # For hybrid height levels (vn5.2-, Smooth heights) # - BULEV is Zsea of upper layer boundary # * If rho level: Zsea for theta level above # * If theta level: Zsea for rho level above # - BHLEV is C of upper layer boundary # * If rho level: C for theta level above # * If theta level: C for rho level above array = [] bounds = [] ak_array = [] ak_bounds = [] bk_array = [] bk_bounds = [] for rec in self.z_recs: BLEV, BRLEV, BHLEV, BHRLEV, BULEV, BHULEV = self.header_bz(rec) array.append(BLEV + BHLEV/_pstar) bounds.append([BRLEV + BHRLEV/_pstar, BULEV + BHULEV/_pstar]) ak_array.append(BHLEV) ak_bounds.append((BHRLEV, BHULEV)) bk_array.append(BLEV) bk_bounds.append((BRLEV , BULEV)) #--- End: for array = numpy_array(array , dtype=float) bounds = numpy_array(bounds , dtype=float) ak_array = numpy_array(ak_array , dtype=float) ak_bounds = numpy_array(ak_bounds, dtype=float) bk_array = numpy_array(bk_array , dtype=float) bk_bounds = numpy_array(bk_bounds, dtype=float) domain = self.domain zdim = _axis['z'] dc = DimensionCoordinate() dc = self.coord_data( dc, array, bounds, units=_axiscode_to_Units.setdefault(axiscode, None)) dc = self.coord_positive(dc, axiscode, zdim) dc = self.coord_axis(dc, axiscode) dc = self.coord_names(dc, axiscode) domain.insert_dim(dc, key=zdim, copy=False) ac = AuxiliaryCoordinate() ac = self.coord_data(ac, ak_array, ak_bounds, units=_Units['Pa']) ac.id = 'UM_atmosphere_hybrid_sigma_pressure_coordinate_ak' ac.long_name = 'atmosphere_hybrid_sigma_pressure_coordinate_ak' domain.insert_aux(ac, axes=[zdim], copy=False) ac = AuxiliaryCoordinate() ac = self.coord_data(ac, bk_array, bk_bounds, units=_Units['1']) domain.insert_aux(ac, axes=[zdim], copy=False) ac.id = 'UM_atmosphere_hybrid_sigma_pressure_coordinate_bk' ac.long_name = 'atmosphere_hybrid_sigma_pressure_coordinate_bk' self.cell_method_axis_name['z'] = dc.identity() return dc #--- End: def def create_cell_methods(self): '''Create the cell methods ''' cell_methods = [] LBPROC = self.lbproc LBTIM_IB = self.lbtim_ib tmean_proc = 0 if LBTIM_IB in (2, 3) and LBPROC in (128, 192, 2176, 4224, 8320): tmean_proc = 128 LBPROC -= 128 # ------------------------------------------------------------ # Area cell methods # ------------------------------------------------------------ # -10: rotated latitude (not an official axis code) # -11: rotated longitude (not an official axis code) if self.ix in (10, 11, 12, -10, -11) and self.iy in (10, 11, 12, -10, -11): cf_info = self.cf_info if 'where' in cf_info: cell_methods.append('area: mean') cell_methods.append(cf_info['where']) if 'over' in cf_info: cell_methods.append(cf_info['over']) #--- End: if if LBPROC == 64: cell_methods.append('x: mean') # dch : do special zonal mean as as in pp_cfwrite # ------------------------------------------------------------ # Vertical cell methods # ------------------------------------------------------------ if LBPROC == 2048: cell_methods.append('z: mean') # ------------------------------------------------------------ # Time cell methods # ------------------------------------------------------------ if LBTIM_IB == 0 or LBTIM_IB == 1: cell_methods.append('t: point') elif LBPROC == 4096: cell_methods.append('t: minimum') elif LBPROC == 8192: cell_methods.append('t: maximum') if tmean_proc == 128: if LBTIM_IB == 2: cell_methods.append('t: mean') elif LBTIM_IB == 3: cell_methods.append('t: mean within years') cell_methods.append('t: mean over years') #--- End: if if not cell_methods: return None cell_methods = CellMethods(' '.join(cell_methods)) cell_method_axis_name = self.cell_method_axis_name for c in cell_methods: names0 = c.names[0] c.axes = [_axis[name] for name in names0] c.names = [cell_method_axis_name[name] for name in names0] #--- End: for return cell_methods #--- End: def def coord_axis(self, c, axiscode): axis = _coord_axis.setdefault(axiscode, None) if axis is not None: c.axis = axis return c #--- End: def def coord_data(self, c, array=None, bounds=None, units=None, fill_value=None, climatology=False): ''' Set the data array of a coordinate construct. :Parameters: c : cf.DimensionCoordinate or cf.AuxiliaryCoordinate data : array-like, optional The data array. bounds : array-like, optional The Cell bounds for the data array. units : cf.Units, optional The units of the data array. fill_value : optional climatology : bool, optional Whether or not the coordinate construct is a time climatology. By default it is not. :Returns: out : cf.Coordinate ''' if array is not None: array = Data(array, units=units, fill_value=fill_value) if bounds is not None: bounds = Data(bounds, units=units, fill_value=fill_value) if climatology: c.climatology = True #--- End: if c.insert_data(array, bounds=bounds, copy=False) return c #--- End: def def coord_names(self, c, axiscode): ''' ''' standard_name = _coord_standard_name.setdefault(axiscode, None) if standard_name is not None: c.setprop('standard_name', standard_name) c.ncvar = standard_name else: long_name = _coord_long_name.setdefault(axiscode, None) if long_name is not None: c.long_name = long_name return c #--- End: def def coord_positive(self, c, axiscode, dim): positive = _coord_positive.setdefault(axiscode, None) if positive is not None: c.positive = positive if positive == 'down' and axiscode != 4: self.down_axes.add(dim) #--- End: def return c #--- End: def def ctime(self, rec): ''' ''' reftime = self.refUnits LBVTIME = tuple(self.header_vtime(rec)) LBDTIME = tuple(self.header_dtime(rec)) key = (LBVTIME, LBDTIME, self.refunits, self.calendar) ctime = _cached_ctime.get(key, None) if ctime is None: # LTIME = list(LBDTIME) # LTIME[0] = LBVTIME[0] ctime = Datetime(*LBDTIME) ctime.year = LBVTIME[0] if ctime < Datetime(*LBVTIME): ctime.year += 1 ctime = Data(ctime, reftime).array.item() _cached_ctime[key] = ctime #--- End: if return ctime #--- End: def def header_vtime(self, rec): ''' Return the list [LBYR, LBMON, LBDAT, LBHR, LBMIN] for the given record. :Parameters: rec : :Returns: out : list :Examples: >>> u.header_vtime(rec) [1991, 1, 1, 0, 0] ''' return rec.int_hdr[lbyr:lbmin+1] #--- End: def def header_dtime(self, rec): ''' Return the list [LBYRD, LBMOND, LBDATD, LBHRD, LBMIND] for the given record. :Parameters: rec : :Returns: out : list :Examples: >>> u.header_dtime(rec) [1991, 2, 1, 0, 0] ''' return rec.int_hdr[lbyrd:lbmind+1] #--- End: def def header_bz(self, rec): ''' Return the list [BLEV, BRLEV, BHLEV, BHRLEV, BULEV, BHULEV] for the given record. :Parameters: rec : :Returns: out : list :Examples: >>> u.header_bz(rec) ''' real_hdr = rec.real_hdr return (real_hdr[blev:bhrlev+1].tolist() + # BLEV, BRLEV, BHLEV, BHRLEV real_hdr[brsvd1:brsvd2+1].tolist()) # BULEV, BHULEV #--- End: def def header_lz(self, rec): ''' Return the list [LBLEV, LBUSER5] for the given record. :Parameters: rec : :Returns: out : list :Examples: >>> u.header_lz(rec) ''' int_hdr = rec.int_hdr return [int_hdr.item(lblev,), int_hdr.item(lbuser5,)] #--- End: def def header_z(self, rec): ''' Return the list [LBLEV, LBUSER5, BLEV, BRLEV, BHLEV, BHRLEV, BULEV, BHULEV] for the given record. :Parameters: rec : :Returns: out : list :Examples: >>> u.header_z(rec) ''' # ------------------------------------------------------------ # These header items are used by the compare_levels function # in compare.c # ------------------------------------------------------------ return self.header_lz + self.header_bz #--- End: def def create_data(self): ''' Sets the `!data` and `!data_axes` attributes. :Returns: None ''' LBROW = self.lbrow LBNPT = self.lbnpt yx_shape = (LBROW, LBNPT) yx_size = LBROW * LBNPT nz = self.nz nt = self.nt recs = self.recs units = self.um_Units data_type_in_file = self.data_type_in_file filename = self.filename data_axes = [_axis['y'], _axis['x']] if len(recs) == 1: # -------------------------------------------------------- # 0-d partition matrix # -------------------------------------------------------- rec = recs[0] data = Data(UMFileArray(file=filename, ndim=2, shape=yx_shape, size=yx_size, dtype=data_type_in_file(rec), header_offset=rec.hdr_offset, data_offset=rec.data_offset, disk_length=rec.disk_length), units=units, fill_value=rec.real_hdr.item(bmdi,)) else: # -------------------------------------------------------- # 1-d or 2-d partition matrix # -------------------------------------------------------- file_data_types = set() word_sizes = set() # Find the partition matrix shape pmshape = [n for n in (nt, nz) if n > 1] pmndim = len(pmshape) partitions = [] empty_list = [] partitions_append = partitions.append zero_to_LBROW = (0, LBROW) zero_to_LBNPT = (0, LBNPT) if pmndim == 1: # ---------------------------------------------------- # 1-d partition matrix # ---------------------------------------------------- data_ndim = 3 if nz > 1: pmaxes = [_axis[self.z_axis]] data_shape = (nz, LBROW, LBNPT) data_size = nz * yx_size else: pmaxes = [_axis['t']] data_shape = (nt, LBROW, LBNPT) data_size = nt * yx_size partition_shape = [1, LBROW, LBNPT] for i, rec in enumerate(recs): # Find the data type of the array in the file file_data_type = data_type_in_file(rec) file_data_types.add(file_data_type) subarray = UMFileArray(file=filename, ndim=2, shape=yx_shape, size=yx_size, dtype=file_data_type, header_offset=rec.hdr_offset, data_offset=rec.data_offset, disk_length=rec.disk_length) partitions_append(Partition( subarray = subarray, location = [(i, i+1), zero_to_LBROW, zero_to_LBNPT], shape = partition_shape, axes = data_axes, flip = empty_list, part = empty_list, Units = units)) #--- End: for # Populate the 1-d partition matrix matrix = numpy_array(partitions, dtype=object) else: # ---------------------------------------------------- # 2-d partition matrix # ---------------------------------------------------- pmaxes = [_axis['t'], _axis[self.z_axis]] data_shape = (nt, nz, LBROW, LBNPT) data_size = nt * nz * yx_size data_ndim = 4 partition_shape = [1, 1, LBROW, LBNPT] for i, rec in enumerate(recs): # Find T and Z axis indices t, z = divmod(i, nz) # Find the data type of the array in the file file_data_type = data_type_in_file(rec) file_data_types.add(file_data_type) subarray = UMFileArray(file=filename, ndim=2, shape=yx_shape, size=yx_size, dtype=file_data_type, header_offset=rec.hdr_offset, data_offset=rec.data_offset, disk_length=rec.disk_length) partitions_append(Partition( subarray=subarray, location=[(t, t+1), (z, z+1), zero_to_LBROW, zero_to_LBNPT], shape=partition_shape, axes=data_axes, flip=empty_list, part=empty_list, Units=units)) #--- End: for # Populate the 2-d partition matrix matrix = numpy_array(partitions, dtype=object) matrix.resize(pmshape) #--- End: if data_axes = pmaxes + data_axes # Set the data array data = Data(units=units, fill_value=recs[0].real_hdr.item(bmdi,)) data._axes = data_axes data._shape = data_shape data._ndim = data_ndim data._size = data_size data.partitions = PartitionMatrix(matrix, pmaxes) data.dtype = numpy_result_type(*file_data_types) #--- End: if self.data = data self.data_axes = data_axes return data #---End: def def decode_lbexp(self): '''Decode the integer value of LBEXP in the PP header into a runid. If this value has already been decoded, then it will be returned from the cache, otherwise the value will be decoded and then added to the cache. :Returns: out : str A string derived from LBEXP. If LBEXP is a negative integer then that number is returned as a string. :Examples: >>> self.decode_lbexp() 'aaa5u' >>> self.decode_lbexp() '-34' ''' LBEXP = self.int_hdr[lbexp] runid = _cached_runid.get(LBEXP, None) if runid is not None: # Return a cached decoding of this LBEXP return runid if LBEXP < 0: runid = str(LBEXP) else: # Convert LBEXP to a binary string, filled out to 30 bits with # zeros bits = bin(LBEXP) bits = bits.lstrip('0b').zfill(30) # Step through 6 bits at a time, converting each 6 bit chunk into # a decimal integer, which is used as an index to the characters # lookup list. runid = [] for i in xrange(0,30,6): index = int(bits[i:i+6], 2) if index < _n_characters: runid.append(_characters[index]) #--- End: for runid = ''.join(runid) #--- End: def # Enter this runid into the cache _cached_runid[LBEXP] = runid # Return the runid return runid #--- End: def def dtime(self, rec): ''' ''' reftime = self.refUnits units = self.refunits calendar = self.calendar LBDTIME = tuple(self.header_dtime(rec)) key = (LBDTIME, units, calendar) time = _cached_date2num.get(key, None) if time is None: # It is important to use the same time_units as vtime if self.calendar == 'gregorian': time = netCDF4_date2num( datetime(*LBDTIME), units, calendar) else: time = netCDF4_date2num( netCDF4_netcdftime_datetime(*LBDTIME), units, calendar) _cached_date2num[key] = time #--- End: if return time #--- End: def def fdr(self): '''Return a the contents of PP field headers as strings. This is a bit like printfdr in the UKMO IDL PP library. :Returns: out : list ''' out2 = [] for i, rec in enumerate(self.recs): out = ['Field %d:' % i] x = ['%s::%s' % (name, value) for name, value in zip(_header_names, self.int_hdr + self.real_hdr)] x = textwrap.fill(' '.join(x), width=79) out.append(x.replace('::', ': ')) if self.extra: out.append('EXTRA DATA:') for key in sorted(self.extra): out.append('%s: %s' % (key, str(self.extra[key]))) #--- End: if out.append('file: '+self.filename) out.append('format, byte order, word size: %s, %s, %d' % (self.fmt, self.byte_ordering, self.word_size)) out.append('') out2.append('\n'.join(out)) #--- End: for return out2 #--- End: def def latitude_longitude_2d_aux_coordinates(self, yc, xc, transform): ''' ''' BDX = self.bdx BDY = self.bdy LBNPT = self.lbnpt LBROW = self.lbrow BPLAT = self.bplat BPLON = self.bplon # Create the unrotated latitude and longitude arrays if we # couldn't find them in the cache cache_key = (LBNPT, LBROW, BDX, BDY, BPLAT, BPLON) lat, lon = _cache_latlon.get(cache_key, (None, None)) if lat is None: lat, lon = self.unrotated_latlon(yc.varray, xc.varray, BPLAT, BPLON) atol = self.atol if abs(BDX) >= atol and abs(BDY) >= atol: _cache_latlon[cache_key] = (lat, lon) #--- End: if # if xc.hasbounds and yc.hasbounds: # cache_key = ('bounds',) + cache_key # lat_bounds, lon_bounds = _cache_latlon.get(cache_key, (None, None)) # print lat_bounds # if lat_bounds is None: # print 'CALC BOUNDS' # xb = numpy_empty(xc.size+1) # yb = numpy_empty(yc.size+1) # xb[:-1] = xc.bounds.subspace[ :, 0].squeeze(1, i=True).array # xb[-1 ] = xc.bounds.subspace[-1, 1].squeeze(1, i=True).array # yb[:-1] = yc.bounds.subspace[ :, 0].squeeze(1, i=True).array # yb[-1 ] = yc.bounds.subspace[-1, 1].squeeze(1, i=True).array # # lat_bounds, lon_bounds = self.unrotated_latlon(yb, xb, BPLAT, BPLON) # # print lat_bounds # print lat_bounds.shape # yyy = numpy_empty(lat.shape + (4,)) # # # # print lat.shape, yyy.shape # # atol = self.atol # if abs(BDX) >= atol and abs(BDY) >= atol: # _cache_latlon[cache_key] = (lat, lon) #--- End: if axes = [_axis['y'], _axis['x']] for axiscode, array in zip((10, 11), (lat, lon)): ac = AuxiliaryCoordinate() ac = self.coord_data(ac, array, units=_axiscode_to_Units.setdefault(axiscode, None)) ac = self.coord_names(ac, axiscode) key = self.domain.insert_aux(ac, axes=axes, copy=False) transform.coords.add(key) #--- End: for #--- End: def def model_level_number_coordinate(self, aux=False): '''model_level_number dimension or auxiliary coordinate :Parameters: aux : bool :Returns: out : cf.AuxiliaryCoordinate or cf.DimensionCoordinate or None ''' array = tuple([rec.int_hdr.item(lblev,) for rec in self.z_recs]) key = array c = _cached_model_level_number_coordinate.get(key, None) if c is not None: if aux: self.domain.insert_aux(c, axes=[_axis['z']], copy=True) else: self.domain.insert_dim(c, key=_axis['z'], copy=True) self.cell_method_axis_name['z'] = c.identity() else: array = numpy_array(array, dtype=self.int_hdr_dtype) if array.min() < 0: return array = numpy_where(array==9999, 0, array) axiscode = 5 if aux: c = AuxiliaryCoordinate() c = self.coord_data(c, array, units=Units('1')) c = self.coord_names(c, axiscode) self.domain.insert_aux(c, axes=[_axis['z']], copy=False) else: c = DimensionCoordinate() c = self.coord_data(c, array, units=Units('1')) c = self.coord_names(c, axiscode) c = self.coord_axis(c, axiscode) self.domain.insert_dim(c, key=_axis['z'], copy=False) self.cell_method_axis_name['z'] = c.identity() #--- End: if _cached_model_level_number_coordinate[key] = c #--- End: if return c #--- End: def def data_type_in_file(self, rec): '''Return the data type of the data array. :Parameters: rec : umfile.Rec :Returns: out : numpy.dtype :Examples: ''' # Find the data type if rec.int_hdr.item(lbuser2,) == 3: # Boolean return numpy_dtype(bool) else: # Int or float return rec.get_type_and_num_words()[0] # rec_file = rec.file ## data_type = rec_file.c_interface.get_type_and_length( # data_type = rec_file.c_interface.get_type_and_num_words(rec.int_hdr)[0] # if data_type == 'int': # # Integer # data_type = 'int%d' % (rec_file.word_size * 8) # else: # # Float # data_type = 'float%d' % (rec_file.word_size * 8) # #--- End: if # # return numpy_dtype(data_type) #--- End: def def printfdr(self): '''Print out the contents of PP field headers. This is a bit like printfdr in the UKMO IDL PP library. :Examples: >>> u.printfdr() ''' for header in self.fdr(): print header #--- End: def def pseudolevel_coordinate(self, LBUSER5): ''' ''' if self.nz == 1: array = numpy_array((LBUSER5,), dtype=self.int_hdr_dtype) else: # 'Z' aggregation has been done along the pseudolevel axis array = numpy_array([rec.int_hdr.item(lbuser5,) for rec in self.z_recs], dtype=self.int_hdr_dtype) self.z_axis = 'p' #--- End: if axiscode = 40 dc = DimensionCoordinate() dc = self.coord_data( dc, array, units=_axiscode_to_Units.setdefault(axiscode, None)) dc.long_name = 'pseudolevel' # for PP stash_code %d' % self.stash dc.id = 'UM_pseudolevel' self.domain.insert_dim(dc, key=_axis['p'], copy=False) self.cell_method_axis_name['p'] = dc.identity() return dc #--- End: def def radiation_wavelength_coordinate(self, rwl, rwl_units): ''' ''' array = numpy_array((rwl,), dtype=float) bounds = numpy_array(((0.0, rwl)), dtype=float) units = _Units.get(rwl_units, None) if units is None: units = Units(rwl_units) _Units[rwl_units] = units axiscode = -20 dc = DimensionCoordinate() dc = self.coord_data(dc, array, bounds, units=units) dc = self.coords_names(dc, axiscode) self.domain.insert_dim(dc, key=_axis['r'], copy=False) self.cell_method_axis_name['r'] = dc.identity() return dc #--- End: def def reference_time_Units(self): ''' ''' time_units = 'days since %d-1-1' % self.int_hdr[lbyr] calendar = self.calendar key = time_units+' calendar='+calendar units = _Units.get(key, None) if units is None: units = Units(time_units, calendar) _Units[key] = units #--- End: if self.refUnits = units self.refunits = time_units return units #--- End: def def size_1_height_coordinate(self, axiscode, height, units): # Create the height coordinate from the information given in the # STASH to standard_name conversion table key = (axiscode, height, units) dc = _cached_size_1_height_coordinate.get(key, None) zdim = _axis['z'] if dc is not None: copy = True else: height_units = _Units.get(units, None) if height_units is None: height_units = Units(units) _Units[units] = height_units array = numpy_array((height,), dtype=float) dc = DimensionCoordinate() dc = self.coord_data(dc, array, units=height_units) dc = self.coord_positive(dc, axiscode, zdim) dc = self.coord_axis(dc, axiscode) dc = self.coord_names(dc, axiscode) _cached_size_1_height_coordinate[key] = dc copy = False #--- End: def self.domain.insert_dim(dc, key=zdim, copy=copy) self.cell_method_axis_name['z'] = dc.identity() return dc #--- End: def def test_um_condition(self, um_condition, LBCODE, BPLAT, BPLON): '''Return True if a field satisfies the condition specified for a STASH code to standard name conversion. :Parameters: um_condition : str LBCODE : int BPLAT : float BPLON : float :Returns: out : bool True if a field satisfies the condition specified, False otherwise. :Examples: >>> ok = u.test_um_condition('true_latitude_longitude', ...) ''' if um_condition == 'true_latitude_longitude': if LBCODE in _true_latitude_longitude_lbcodes: return True # Check pole location in case of incorrect LBCODE atol = self.atol if (abs(BPLAT-90.0) <= atol + RTOL()*90.0 and abs(BPLON) <= atol): return True elif um_condition == 'rotated_latitude_longitude': if LBCODE in _rotated_latitude_longitude_lbcodes: return True # Check pole location in case of incorrect LBCODE atol = self.atol if not (abs(BPLAT-90.0) <= atol + RTOL()*90.0 and abs(BPLON) <= atol): return True else: raise ValueError( "Unknown UM condition in STASH code conversion table: '%s'" % um_condition) # Still here? Then the condition has not been satisfied. return #--- End: def def test_um_version(self, valid_from, valid_to, um_version): '''Return True if the UM version applicable to tghis field is within the given range. If possible, the UM version is derived from the PP header and stored in the metadata object. Otherwise it is taken from the *um_version* parameter. :Parameters: valid_from : int, float or None valid_to : int, float or None um_version : int or float :Returns: out : bool True if the UM version applicable to this field is within the range, False otherwise. :Examples: >>> ok = u.test_um_version(401, 505, 1001) >>> ok = u.test_um_version(401, None, 606.3) >>> ok = u.test_um_version(None, 405, 401) ''' if valid_to is None: if valid_from <= um_version: return True elif valid_from is None: if um_version <= valid_to: return True elif valid_from <= um_version <= valid_to: return True return False # if valid_from is '': # valid_from = None # # if valid_to is '': # if valid_from <= um_version: # return True # elif valid_from <= um_version <= valid_to: # return True # # return False #--- End: def def time_coordinate(self, axiscode): ''' Return the T dimension coordinate ''' recs = self.t_recs vtimes = numpy_array([self.vtime(rec) for rec in recs], dtype=float) dtimes = numpy_array([self.dtime(rec) for rec in recs], dtype=float) IB = self.lbtim_ib if IB <= 1 or vtimes.item(0,) >= dtimes.item(0,): array = vtimes bounds = None climatology = False elif IB == 3: # The field is a time mean from T1 to T2 for each year # from LBYR to LBYRD ctimes = numpy_array([self.ctime(rec) for rec in recs]) array = 0.5*(vtimes + ctimes) bounds = numpy_column_stack((vtimes, dtimes)) climatology = True else: array = 0.5*(vtimes + dtimes) bounds = numpy_column_stack((vtimes, dtimes)) climatology = False #--- End: if dc = DimensionCoordinate() dc = self.coord_data(dc, array, bounds, units=self.refUnits, climatology=climatology) dc = self.coord_axis(dc, axiscode) dc = self.coord_names(dc, axiscode) self.domain.insert_dim(dc, key=_axis['t'], copy=False) self.cell_method_axis_name['t'] = dc.identity() return dc #--- End: def def time_coordinate_from_extra_data(self, axiscode, axis): ''' ''' extra = self.extra array = extra[axis] bounds = extra.get(axis+'_bounds', None) calendar = self.calendar if calendar == '360_day': units = _Units['360_day 0-1-1'] elif calendar == 'gregorian': units = _Units['gregorian 1752-9-13'] elif calendar == '365_day': units = _Units['365_day 1752-9-13'] else: units = None dc = DimensionCoordinate() dc = self.coord_data(dc, array, bounds, units=units) dc = self.coord_axis(dc, axiscode) dc = self.coord_names(dc, axiscode) self.domain.insert_dim(dc, key=_axis[axis], copy=False) self.cell_method_axis_name[axis] = dc.identity() self.cell_method_axis_name['t'] = self.cell_method_axis_name[axis] return dc #--- End: def def time_coordinate_from_um_timeseries(self, axiscode, axis): # This PP/FF field is a timeseries. The validity time is # taken to be the time for the first sample, the data time # for the last sample, with the others evenly between. rec = self.recs[0] vtime = self.vtime(rec) dtime = self.dtime(rec) size = self.lbuser3 - 1.0 delta = (dtime - vtime)/size array = numpy_arange(vtime, vtime+delta*size, size, dtype=float) dc = DimensionCoordinate() dc = self.coord_data(dc, array, units=units) dc = self.coord_axis(dc, axiscode) dc = self.coord_names(dc, axiscode) self.domain.insert_dim(dc, key=_axis[axis], copy=False) self.cell_method_axis_name['t'] = dc.identity() return dc #--- End: def def vtime(self, rec): ''' ''' reftime = self.refUnits units = self.refunits calendar = self.calendar # LBVTIME = tuple(rec.int_hdr[lbyr: lbmin+1]) LBVTIME = tuple(self.header_vtime(rec)) key = (LBVTIME, units, calendar) time = _cached_date2num.get(key, None) if time is None: # It is important to use the same time_units as dtime if self.calendar == 'gregorian': time = netCDF4_date2num( datetime(*LBVTIME), units, calendar) else: time = netCDF4_date2num( netCDF4_netcdftime_datetime(*LBVTIME), units, calendar) _cached_date2num[key] = time #--- End: if return time #--- End: def def dddd(self): for axis_code, extra_type in zip((11 , 10 ), ('x', 'y')): coord_type = extra_type + '_domain_bounds' if coord_type in p.extra: p.extra[coord_type] # Create, from extra data, an auxiliary coordinate should # with 1) data and bounds, if the upper and lower be # bounds have no missing values; or 2) data but no the # bounds, if the upper bound has missing values axis # but the lower bound does not. # which file_position = ppfile.tell() # has bounds = p.extra[coord_type][...] # axis_code # Reset the file pointer after reading the extra # 13 # data into a numpy array ppfile.seek(file_position, os.SEEK_SET) data = None if numpy_any(bounds[..., 1] == _pp_rmdi): # dch also test in bmdi? if not numpy_any(bounds[...,0] == _pp_rmdi): # dch also test in bmdi? data = bounds[...,0] bounds = None else: data = numpy_mean(bounds, axis=1) if (data, bounds) != (None, None): aux = 'aux%(auxN)d' % locals() auxN += 1 # Increment auxiliary number coord = _create_Coordinate(domain, aux, axis_code, p=p, array = data, aux=True, bounds_array = bounds, pubattr = {'axis': None}, dimensions = [xdim]) # DCH # xdim? # should # be # the # axis # which # has # axis_code # 13 #--- End: if else: coord_type = '%s_domain_lower_bound' % extra_type if coord_type in p.extra: # Create, from extra data, an auxiliary # coordinate with data but no bounds, if the # data noes not contain any missing values file_position = ppfile.tell() data = p.extra[coord_type][...] # Reset the file pointer after reading the # extra data into a numpy array ppfile.seek(file_position, os.SEEK_SET) if not numpy_any(data == _pp_rmdi): # dch also test in bmdi? aux = 'aux%(auxN)d' % locals() auxN += 1 # Increment auxiliary number coord = _create_Coordinate(domain, aux, axis_code, p=p, aux=True, array=numpy_array(data), pubattr={'axis': None}, dimensions=[xdim])# DCH xdim? #--- End: if #--- End: for #--- End: if # -------------------- def unrotated_latlon(self, rotated_lat, rotated_lon, pole_lat, pole_lon): ''' Create 2-d arrays of unrotated latitudes and longitudes. :Parameters: rotated_lat, rotated_lon, pole_lat, pole_lon ''' # Make sure rotated_lon and pole_lon is in [0, 360) pole_lon = pole_lon % 360.0 # Convert everything to radians pole_lon *= _pi_over_180 pole_lat *= _pi_over_180 cos_pole_lat = numpy_cos(pole_lat) sin_pole_lat = numpy_sin(pole_lat) # Create appropriate copies of the input rotated arrays rot_lon = rotated_lon.copy() rot_lat = rotated_lat.view() # Make sure rotated longitudes are between -180 and 180 rot_lon %= 360.0 rot_lon = numpy_where(rot_lon < 180.0, rot_lon, rot_lon-360) # Create 2-d arrays of rotated latitudes and longitudes in radians nlat = rot_lat.size nlon = rot_lon.size rot_lon = numpy_resize(numpy_deg2rad(rot_lon), (nlat, nlon)) rot_lat = numpy_resize(numpy_deg2rad(rot_lat), (nlon, nlat)) rot_lat = numpy_transpose(rot_lat, axes=(1,0)) # Find unrotated latitudes CPART = numpy_cos(rot_lon) * numpy_cos(rot_lat) sin_rot_lat = numpy_sin(rot_lat) x = cos_pole_lat * CPART + sin_pole_lat * sin_rot_lat x = numpy_clip(x, -1.0, 1.0) unrotated_lat = numpy_arcsin(x) # Find unrotated longitudes x = -cos_pole_lat*sin_rot_lat + sin_pole_lat*CPART x /= numpy_cos(unrotated_lat) # dch /0 or overflow here? surely # lat could be ~+-pi/2? if so, # does x ~ cos(lat)? x = numpy_clip(x, -1.0, 1.0) unrotated_lon = -numpy_arccos(x) unrotated_lon = numpy_where(rot_lon > 0.0, -unrotated_lon, unrotated_lon) if pole_lon >= self.atol: SOCK = pole_lon - numpy_pi else: SOCK = 0 unrotated_lon += SOCK # Convert unrotated latitudes and longitudes to degrees unrotated_lat = numpy_rad2deg(unrotated_lat) unrotated_lon = numpy_rad2deg(unrotated_lon) # Return unrotated latitudes and longitudes return unrotated_lat, unrotated_lon #--- End: def def xy_coordinate(self, axiscode, axis): ''' Create an X or Y dimension coordinate from header entries or extra data. :Parameters: axiscode : int axis : str 'x' or 'y' :Returns: out : cf.DimensionCoordinate ''' if axis == 'y': delta = self.bdy origin = self.real_hdr[bzy] size = self.lbrow else: delta = self.bdx origin = self.real_hdr[bzx] size = self.lbnpt if abs(delta) > self.atol: # Create regular coordinates from header items if axiscode == 11 or axiscode == -11: origin -= divmod(origin + delta*size, 360.0)[0] * 360 while origin + delta*size > 360.0: origin -= 360.0 while origin + delta*size < -360.0: origin += 360.0 #--- End: if array = numpy_arange(origin+delta, origin+delta*(size+0.5), delta, dtype=float) # Create the coordinate bounds if axiscode in (13, 31, 40, 99): # The following axiscodes do not have bounds: # 13 = Site number (set of parallel rows or columns # e.g.Time series) # 31 = Logarithm to base 10 of pressure in mb # 40 = Pseudolevel # 99 = Other bounds = None else: delta_by_2 = 0.5 * delta bounds = numpy_empty((size, 2), dtype=float) bounds[:, 0] = array - delta_by_2 bounds[:, 1] = array + delta_by_2 else: # Create coordinate from extra data array = self.extra.get(axis, None) bounds = self.extra.get(axis+'_bounds', None) #--- End: if dc = DimensionCoordinate() dc = self.coord_data( dc, array, bounds, units=_axiscode_to_Units.setdefault(axiscode, None)) dc = self.coord_positive(dc, axiscode, _axis[axis]) dc = self.coord_axis(dc, axiscode) dc = self.coord_names(dc, axiscode) self.domain.insert_dim(dc, key=_axis[axis], copy=False) self.cell_method_axis_name[axis] = dc.identity() return dc #--- End: def def z_coordinate(self, axiscode): '''Create a Z dimension coordinate from BLEV :Parameters: axiscode : int :Returns: out : cf.DimensionCoordinate ''' z_recs = self.z_recs array = tuple([rec.real_hdr.item(blev,) for rec in z_recs]) bounds0 = tuple([rec.real_hdr[brlev] for rec in z_recs]) # lower level boundary bounds1 = tuple([rec.real_hdr[brsvd1] for rec in z_recs]) # bulev if _coord_positive.get(axiscode, None) == 'down': bounds0, bounds1 = bounds1, bounds0 # key = (axiscode, array, bounds0, bounds1) # dc = _cached_z_coordinate.get(key, None) # if dc is not None: # copy = True # else: copy = False array = numpy_array(array, dtype=float) bounds0 = numpy_array(bounds0, dtype=float) bounds1 = numpy_array(bounds1, dtype=float) bounds = numpy_column_stack((bounds0, bounds1)) if (bounds0 == bounds1).all(): bounds = None else: bounds = numpy_column_stack((bounds0, bounds1)) dc = DimensionCoordinate() dc = self.coord_data( dc, array, bounds=bounds, units=_axiscode_to_Units.setdefault(axiscode, None)) dc = self.coord_positive(dc, axiscode, _axis['z']) dc = self.coord_axis(dc, axiscode) dc = self.coord_names(dc, axiscode) # _cached_z_coordinate[key] = dc # #--- End: if self.domain.insert_dim(dc, key=_axis['z'], copy=copy) self.cell_method_axis_name['z'] = dc.identity() return dc #--- End: def def z_reference_coordinate(self, axiscode): ''' ''' array = numpy_array([rec.real_hdr.item(brlev,) for rec in self.z_recs], dtype=float) LBVC = self.lbvc key = (axiscode, LBVC, array) dc = _cached_z_reference_coordinate.get(key, None) if dc is not None: copy = True else: if not 128 <= LBVC <= 139: bounds = [] for rec in self.z_recs: BRLEV = rec.real_hdr.item(brlev,) BRSVD1 = rec.real_hdr.item(brsvd1,) if abs(BRSVD1-BRLEV) >= ATOL: bounds = None break bounds.append((BRLEV, BRSVD1)) #--- End: for else: bounds = None if bounds: bounds = numpy_array((bounds,), dtype=float) dc = DimensionCoordinate() dc = self.coord_data( dc, array, bounds, units=_axiscode_to_Units.setdefault(axiscode, None)) dc = self.coord_axis(dc, axiscode) dc = self.coord_names(dc, axiscode) if not dc.get('positive', True): # ppp dc.flip(i=True) _cached_z_reference_coordinate[key] = dc copy = False #--- End: def self.domain.insert_dim(dc, key=_axis['z'], copy=copy) return dc #--- End: def #--- End: class _stash2standard_name = {} def load_stash2standard_name(table=None, delimiter='!'): '''Load a STASH to standard name conversion table. :Parameters: table : str, optional Use the conversion table at this file location. By default the table will be looked for at ``os.path.join(os.path.dirname(cf.__file__),'etc/STASH_to_CF.txt')`` delimiter : str, optional The delimiter of the table columns. By default, ``!`` is taken as the delimiter. :Returns: None *Examples:* >>> load_stash2standard_name() >>> load_stash2standard_name('my_table.txt') >>> load_stash2standard_name('my_table2.txt', ',') ''' # 0 Model # 1 STASH code # 2 STASH name # 3 units # 4 valid from UM vn # 5 valid to UM vn # 6 standard_name # 7 CF extra info # 8 PP extra info if table is None: # Use default conversion table package_path = os.path.dirname(__file__) table = os.path.join(package_path, 'etc/STASH_to_CF.txt') #--- End: if lines = csv.reader(open(table, 'r'), delimiter=delimiter, skipinitialspace=True) raw_list = [] [raw_list.append(line) for line in lines] # Get rid of comments for line in raw_list[:]: if line[0].startswith('#'): raw_list.pop(0) continue break #--- End: for # Convert to a dictionary which is keyed by (submodel, STASHcode) # tuples (model, stash, name, units, valid_from, valid_to, standard_name, cf, pp) = range(9) stash2sn = {} for x in raw_list: key = (int(x[model]), int(x[stash])) if not x[units]: x[units] = None try: cf_info = {} if x[cf]: for d in x[7].split(): if d.startswith('height='): cf_info['height'] = re.split(_number_regex, d, re.IGNORECASE)[1:4:2] if cf_info['height'] == '': cf_info['height'][1] = '1' if d.startswith('below_'): cf_info['below'] = re.split(_number_regex, d, re.IGNORECASE)[1:4:2] if cf_info['below'] == '': cf_info['below'][1] = '1' if d.startswith('where_'): cf_info['where'] = d.replace('where_', 'where ', 1) if d.startswith('over_'): cf_info['over'] = d.replace('over_', 'over ', 1) x[cf] = cf_info except IndexError: pass try: x[valid_from] = float(x[valid_from]) except ValueError: x[valid_from] = None try: x[valid_to] = float(x[valid_to]) except ValueError: x[valid_to] = None x[pp] = x[pp].rstrip() line = (x[name:],) if key in stash2sn: stash2sn[key] += line else: stash2sn[key] = line #--- End: for _stash2standard_name.clear() _stash2standard_name.update(stash2sn) # return stash2sn #--- End: def # --------------------------------------------------------------------- # Create the STASH code to standard_name conversion dictionary # --------------------------------------------------------------------- #_stash2standard_name = load_stash2standard_name() load_stash2standard_name() def read(filename, um_version=405, verbose=False, aggregate=True, byte_ordering=None, word_size=None, set_standard_name=True, height_at_top_of_model=None): '''Read fields from a PP file or UM fields file. The file may be big or little endian, 32 or 64 bit :Parameters: filename : file or str A string giving the file name, or an open file object, from which to read fields. um_version : number, optional The Unified Model (UM) version to be used when decoding the PP header. Valid versions are, for example, ``402`` (v4.2), ``606.3`` (v6.6.3) and ``1001`` (v10.1). The default version is ``405`` (v4.5). The version is ignored if it can be inferred from the PP headers, which will generally be the case for files created at versions 5.3 and later. Note that the PP header can not encode tertiary version elements (such as the ``3`` in ``606.3``), so it may be necessary to provide a UM version in such cases. verbose : bool, optional set_standard_name : bool, optional :Returns: out : FieldList The fields in the file. :Examples: >>> f = read('file.pp') >>> f = read('*/file[0-9].pp', um_version=708) ''' history = 'Converted from UM by cf-python v%s' % __version__ f = _open_um_file(filename) # print 'um.read.read.py um_version=', repr(um_version) um = [UMField(var, f.format, f.byte_ordering, f.word_size, um_version, set_standard_name, history=history, height_at_top_of_model=height_at_top_of_model) for var in f.vars] # # Clear the cache of unrotated latitude and longitude arrays # _cache_latlon.clear() return FieldList([field for x in um for field in x.fields if field]) #--- End: def def _atmosphere_hybrid_sigma_pressure_coordinate(f): # atmosphere_hybrid_sigma_pressure_coordinate real_hdr = f.real_hdr BLEV, BRLEV, BHLEV, BHRLEV = real_hdr[blev:bhrlev+1] BRSVD1, BRSVD2 = real_hdr[brsvd1:brsvd2+1] if 'z' not in pmaxes: indices = [0] * pmndim indices[pmaxes.index('z')] = slice(1, None, None) for rec in var.recs[tuple(indices)]: BLEV, BRLEV, BHLEV, BHRLEV = rec.real_hdr[blev:bhrlev+1] BRSVD1, BRSVD2 = rec.real_hdr[brsvd1:brsvd2+1] array.append(BLEV + BHLEV/_pstar) bounds.append([BRLEV + BHRLEV/_pstar, BRSVD1 + BRSVD2/_pstar]) ak_array.append(BHLEV) ak_bounds.append([BHRLEV, BRSVD2]) bk_array.append(BLEV) bk_bounds.append([BRLEV , BRSVD1]) array = numpy_array(array , dtype=float) bounds = numpy_array(bounds , dtype=float) ak_array = numpy_array(ak_array , dtype=float) ak_bounds = numpy_array(ak_bounds, dtype=float) bk_array = numpy_array(bk_array , dtype=float) bk_bounds = numpy_array(bk_bounds, dtype=float) domain = f.field.domain coord = _create_Coordinate(domain, vdim, axis_code=axis_code, p=p, array=array, bounds_array=bounds, dimensions=[vdim]) coord = _create_Coordinate( domain, aux, axis_code=None, p=p, pubattr={'standard_name': 'atmosphere_hybrid_sigma_pressure_coordinate_ak'}, units=_units['Pa'], array=ak_array, bounds_array=ak_array, dimensions=[vdim], aux=True) coord = _create_Coordinate( domain, aux, axis_code=None, p=p, pubattr={'standard_name': 'atmosphere_hybrid_sigma_pressure_coordinate_bk'}, units=_units['1'], array=bk_array, bounds_array=bk_array, dimensions=[vdim], aux=True) else: cache_key = ('atmosphere_hybrid_sigma_pressure_coordinate', BLEV, BHLEV, BRLEV, BHRLEV, BRSVD1, BRSVD2) cache_key_ak = ('atmosphere_hybrid_sigma_pressure_coordinate_ak', BLEV, BHLEV, BRLEV, BHRLEV, BRSVD1, BRSVD2) cache_key_bk = ('atmosphere_hybrid_sigma_pressure_coordinate_bk', BLEV, BHLEV, BRLEV, BHRLEV, BRSVD1, BRSVD2) if cache_key in _cached_coordinate: c = _cached_coordinate[cache_key] domain.insert_dim(c, key=vdim, copy=True) c = _cached_coordinate[cache_key_ak] domain.insert_aux(c, axes=[vdim], copy=True) c = _cached_coordinate[cache_key_bk] domain.insert_aux(c, axes=[vdim], copy=True) else: array = numpy_array((BLEV + BHLEV/_pstar,), dtype=float) bounds = numpy_array(((BRLEV + BHRLEV/_pstar, BRSVD1 + BRSVD2/_pstar)), dtype=float) ak_array = numpy_array((BHLEV,) , dtype=float) ak_bounds = numpy_array(((BHRLEV, BRSVD2)), dtype=float) bk_array = numpy_array((BLEV,) , dtype=float) bk_bounds = numpy_array(((BRLEV, BRSVD1)), dtype=float) coord = _create_Coordinate(domain, vdim, axis_code=axis_code, p=p, array=array, bounds_array=bounds, dimensions=[vdim], cache_key=cache_key) coord = _create_Coordinate( domain, aux, axis_code=None, p=p, pubattr={'standard_name': 'atmosphere_hybrid_sigma_pressure_coordinate_ak'}, units=_units['Pa'], array=ak_array, bounds_array=ak_array, dimensions=[vdim], aux=True, cache_key=cache_key_ak) coord = _create_Coordinate( domain, aux, axis_code=None, p=p, pubattr={'standard_name': 'atmosphere_hybrid_sigma_pressure_coordinate_bk'}, units=_units['1'], array=bk_array, bounds_array=bk_array, dimensions=[vdim], aux=True, cache_key=cache_key_bk) #--- End: def def is_um_file(filename): '''Return True if a file is a PP file or UM fields file. Note that the file type is determined by inspecting the file's contents and any file suffix is not not considered. :Parameters: filename : str :Returns: out : bool :Examples: >>> is_um_file('myfile.pp') True >>> is_um_file('myfile.nc') False >>> is_um_file('myfile.pdf') False >>> is_um_file('myfile.txt') False ''' try: f = _open_um_file(filename) except: return False try: f.close_fd() except: pass return True #--- End: def ''' Problems: Z and P coordinates /home/david/data/pp/aaaao/aaaaoa.pmh8dec.03328.pp /net/jasmin/chestnut/data-24/david/testpp/026000000000c.fc0607.000128.0000.00.04.0260.0020.1491.12.01.00.00.pp skipping variable stash code=0, 0, 0 because: grid code not supported umfile: error condition detected in routine list_copy_to_ptr_array umfile: error condition detected in routine process_vars umfile: error condition detected in routine file_parse OK 2015-04-01 /net/jasmin/chestnut/data-24/david/testpp/026000000000c.fc0619.000128.0000.00.04.0260.0020.1491.12.01.00.00.pp skipping variable stash code=0, 0, 0 because: grid code not supported umfile: error condition detected in routine list_copy_to_ptr_array umfile: error condition detected in routine process_vars umfile: error condition detected in routine file_parse OK 2015-04-01 /net/jasmin/chestnut/data-24/david/testpp/lbcode_10423.pp skipping variable stash code=0, 0, 0 because: grid code not supported umfile: error condition detected in routine list_copy_to_ptr_array umfile: error condition detected in routine process_vars umfile: error condition detected in routine file_parse OK 2015-04-01 /net/jasmin/chestnut/data-24/david/testpp/lbcode_11323.pp skipping variable stash code=0, 0, 0 because: grid code not supported umfile: error condition detected in routine list_copy_to_ptr_array umfile: error condition detected in routine process_vars umfile: error condition detected in routine file_parse OK 2015-04-01 EXTRA_DATA: /net/jasmin/chestnut/data-24/david/testpp/ajnjgo.pmm1feb.pp SLOW: (Not any more! 2015-04-01) /net/jasmin/chestnut/data-24/david/testpp/xgdria.pdk949a.pp /net/jasmin/chestnut/data-24/david/testpp/xhbmaa.pm27sep.pp RUN LENGTH ENCODED dump (not fields file) /home/david/data/um/xhlska.dak69h0 Field 115 (stash code 9) dch@eslogin008:/nerc/n02/n02/dch> ff2pp xgvwko.piw96b0 xgvwko.piw96b0.pp file xgvwko.piw96b0 is a byte swapped 64 bit ieee um file ''' cf-python-1.3.2/cf/um/umread/0000755000175000017500000000000012770523315016117 5ustar daviddavid00000000000000cf-python-1.3.2/cf/um/umread/umfile.py0000644000175000017500000002577512764213712017772 0ustar daviddavid00000000000000import os import numpy import cInterface from extraData import ExtraDataUnpacker class UMFileException(Exception): pass class File(object): """ a class for a UM data file that gives a view of the file including sets of PP records combined into variables """ def __init__(self, path, byte_ordering = None, word_size = None, format = None, parse = True): """ Open and parse a UM file. The following optional arguments specify the file type. If all three are set, then this forces the file type; otherwise, the file type is autodetected and any of them that are set are ignored. byte_ordering: 'little_endian' or 'big_endian' word_size: 4 or 8 format: 'FF' or 'PP' The default action is to open the file, store the file type from the arguments or autodetection as described above, and then parse the contents, giving a tree of variables and records under the File object. However, if "parse = False" is set, then an object is returned in which the last step is omitted, so only the file type is stored, and there are no variables under it. Such an object can be passed when instantiating Rec objects, and contains sufficient info about the file type to ensure that the get_data method of those Rec objects will work. """ c = cInterface.CInterface() self._c_interface = c self.path = path self.fd = None self.open_fd() if byte_ordering and word_size and format: self.format = format self.byte_ordering = byte_ordering self.word_size = word_size else: self._detect_file_type() self.path = path file_type_obj = c.create_file_type(self.format, self.byte_ordering, self.word_size) c.set_word_size(file_type_obj) if parse: info = c.parse_file(self.fd, file_type_obj) self.vars = info["vars"] self._add_back_refs() def open_fd(self): """ (Re)open the low-level file descriptor. """ if self.fd is None: self.fd = os.open(self.path, os.O_RDONLY) return self.fd def close_fd(self): """ Close the low-level file descriptor. """ if self.fd: os.close(self.fd) self.fd = None def _detect_file_type(self): c = self._c_interface try: file_type_obj = c.detect_file_type(self.fd) except: self.close_fd() raise IOError("File {0} has unsupported format".format(path)) d = c.file_type_obj_to_dict(file_type_obj) self.format = d["format"] self.byte_ordering = d["byte_ordering"] self.word_size = d["word_size"] def _add_back_refs(self): """ Add file attribute to Var objects, and both file and var attributes to Rec objects. The important one is the file attribute in the Rec object, as this is used when reading data. The others are provided for extra convenience. """ for var in self.vars: var.file = self for rec in var.recs: rec.var = var rec.file = self class Var(object): """ container for some information about variables """ def __init__(self, recs, nz, nt, supervar_index=None): self.recs = recs self.nz = nz self.nt = nt self.supervar_index = supervar_index def _compare_recs_by_extra_data(self, a, b): return cmp(a.get_extra_data(), b.get_extra_data()) def _compare_recs_by_orig_order(self, a, b): return cmp(self.recs.index(a), self.recs.index(b)) def group_records_by_extra_data(self): """ Returns a list of (sub)lists of records where each records within each sublist has matching extra data (if any), so if the whole variable has consistent extra data then the return value will be of length 1. Within each group, the ordering of returned records is the same as in self.recs """ compare = self._compare_recs_by_extra_data recs = self.recs[:] n = len(recs) if n == 0: # shouldn't have a var without records, but... return [] recs.sort(compare) # optimise simple case - if two ends of a sorted list match, # the whole list matches if not compare(recs[0], recs[-1]): return [self.recs[:]] groups = [] this_grp = [] for i, rec in enumerate(recs): this_grp.append(rec) if i == n - 1 or compare(rec, recs[i + 1]): this_grp.sort(self._compare_recs_by_orig_order) groups.append(this_grp) this_grp = [] return groups class Rec(object): """ container for some information about records """ def __init__(self, int_hdr, real_hdr, hdr_offset, data_offset, disk_length, file = None): """ Default instantiation, which stores the supplied headers and offsets. The 'file' argument, used to set the 'file' attribute, does not need to be supplied, but if it is not then it will have to be set on the returned object (to the containing File object) before calling get_data() will work. Normally this would be done by the calling code instantiating via File rather than directly. """ self.int_hdr = int_hdr self.real_hdr = real_hdr self.hdr_offset = hdr_offset self.data_offset = data_offset self.disk_length = disk_length self._extra_data = None if file: self.file = file @classmethod def from_file_and_offsets(cls, file, hdr_offset, data_offset, disk_length): """ Instantiate a Rec object from the file object and the header and data offsets. The headers are read in, and also the record object is ready for calling get_data(). """ c = file._c_interface int_hdr, real_hdr = c.read_header(file.fd, hdr_offset, file.byte_ordering, file.word_size) return cls(int_hdr, real_hdr, hdr_offset, data_offset, disk_length, file=file) def read_extra_data(self): """ read the extra data associated with the record """ c = self.file._c_interface file = self.file extra_data_offset, extra_data_length = \ c.get_extra_data_offset_and_length(self.int_hdr, self.data_offset, self.disk_length) raw_extra_data = c.read_extra_data(file.fd, extra_data_offset, extra_data_length, file.byte_ordering, file.word_size) edu = ExtraDataUnpacker(raw_extra_data, file.word_size, file.byte_ordering) return edu.get_data() def get_extra_data(self): """ get extra data associated with the record, either by reading or using cached read """ if self._extra_data == None: self._extra_data = self.read_extra_data() return self._extra_data def get_type_and_num_words(self): """ get the data type (as numpy type) and number of words as 2-tuple """ c = self.file._c_interface ntype, num_words = c.get_type_and_num_words(self.int_hdr) if ntype == 'integer': dtype = numpy.dtype(c.file_data_int_type) elif ntype == 'real': dtype = numpy.dtype(c.file_data_real_type) return dtype, num_words def get_data(self): """ get the data array associated with the record """ c = self.file._c_interface file = self.file data_type, nwords = c.get_type_and_num_words(self.int_hdr) # print "data_type = %s nwords = %s" % (data_type, nwords) return c.read_record_data(file.fd, self.data_offset, self.disk_length, file.byte_ordering, file.word_size, self.int_hdr, self.real_hdr, data_type, nwords) if __name__ == '__main__': import sys path = sys.argv[1] f = File(path) print f.format, f.byte_ordering, f.word_size print "num variables: %s" % len(f.vars) for varno, var in enumerate(f.vars): print print "var %s: nz = %s, nt = %s" % (varno, var.nz, var.nt) for recno, rec in enumerate(var.recs): print "var %s record %s" % (varno, recno) print "hdr offset: %s" % rec.hdr_offset print "data offset: %s" % rec.data_offset print "disk length: %s" % rec.disk_length print "int hdr: %s" % rec.int_hdr print "real hdr: %s" % rec.real_hdr print "data: %s" % rec.get_data() print "extra_data: %s" % rec.get_extra_data() print "type %s, num words: %s" % rec.get_type_and_num_words() # if recno == 1: # rec._extra_data['y'] += .01 # print "massaged_extra_data: %s" % rec.get_extra_data() print "-----------------------" print "all records", var.recs print "records grouped by extra data ", var.group_records_by_extra_data() print "===============================" f.close_fd() # also read a record using saved metadata if f.vars: format = f.format byte_ordering = f.byte_ordering word_size = f.word_size myrec = f.vars[0].recs[0] hdr_offset = myrec.hdr_offset data_offset = myrec.data_offset disk_length = myrec.disk_length del(f) fnew = File(path, format = format, byte_ordering = byte_ordering, word_size = word_size, parse = False) rnew = Rec.from_file_and_offsets(fnew, hdr_offset, data_offset, disk_length) print "record read using saved file type and offsets:" print "int hdr: %s" % rnew.int_hdr print "real hdr: %s" % rnew.real_hdr print "data: %s" % rnew.get_data() print "extra data: %s" % rnew.get_extra_data() print "nx = %s" % rnew.int_hdr[18] print "ny = %s" % rnew.int_hdr[17] rdata = open("recdata0.txt", "w") for value in rnew.get_data(): rdata.write("%s\n" % value) rdata.close() cf-python-1.3.2/cf/um/umread/__init__.py0000600000175000017500000000000012603546021020200 0ustar daviddavid00000000000000cf-python-1.3.2/cf/um/umread/c-lib/0000755000175000017500000000000012770523315017105 5ustar daviddavid00000000000000cf-python-1.3.2/cf/um/umread/c-lib/swap.c0000600000175000017500000000104112603546021020201 0ustar daviddavid00000000000000#include "umfileint.h" #define DO_SWAP(x, y) {t = p[x]; p[x] = p[y]; p[y] = t;} void swap_bytes_sgl(void *ptr, size_t num_words) { int i; char *p; char t; p = (char*) ptr; for (i = 0; i < num_words; i++) { DO_SWAP(3, 0); DO_SWAP(2, 1); p += 4; } } void swap_bytes_dbl(void *ptr, size_t num_words) { int i; char *p; char t; p = (char*) ptr; for (i = 0; i < num_words; i++) { DO_SWAP(7, 0); DO_SWAP(6, 1); DO_SWAP(5, 2); DO_SWAP(4, 3); p += 8; } } cf-python-1.3.2/cf/um/umread/c-lib/linklist.c0000600000175000017500000001472612603546021021076 0ustar daviddavid00000000000000#include "umfileint.h" /* LINKED LIST FUNCTIONS */ void *list_new(List *heaplist) { List *list; CKP( list = malloc_(sizeof(List), heaplist) ); list->first = NULL; list->last = NULL; list->n = 0; return list; ERRBLKP; } /* This function frees a list; * Set free_ptrs if the pointers which have been explicitly stored on the * list (2nd argument to list_add) are to be freed, not just the pointers * which are implicit in the linked list structure. NB there is no further * recursion, in the sense that if the stored pointers are to datatypes which * contain further pointers then these may have to be freed explicitly. */ int list_free(List *list, int free_ptrs, List *heaplist) { List_element *p, *next; CKP(list); for (p = list->first ; p != NULL ; p = next) { next = p->next; if (free_ptrs) CKI( free_(p->ptr, heaplist) ); CKI( free_(p,heaplist) ); } CKI( free_(list, heaplist) ); return 0; ERRBLKI; } int list_size(const List *list) { CKP(list); return list->n; ERRBLKI; } int list_add(List *list, void *ptr, List *heaplist) { List_element *el; CKP(list); CKP( el = malloc_(sizeof(List_element), heaplist) ); list->n ++; el->ptr = ptr; el->next = NULL; if (list->first == NULL) { el->prev = NULL; list->first = list->last = el; } else { list->last->next = el; el->prev = list->last; list->last = el; } return 0; ERRBLKI; } /* list_add_or_find takes a pointer to an item and tries to find it on the * list, using the comparision function as in list_find. * * If it already exists, it changes the item to point to the old value, and * calls the supplied function (if non-null) to free the item. If it does * not exist, it adds the item to the list. * * Return values: * 0 time already existed in axis * 1 time has been added to axis * -1 an error occurred (probably in memory allocation) * * NOTE: the return value of this function may be tested with the CKI() macro. * Do not add non-error cases with negative return values. * * NOTE 2: The item is formally declared as a void* but the * thing pointed to should itself be a pointer (to heap memory), * so you should pass in a foo** of some sort. The only reason for * not declaring as void** is that void* has the special property of * being treated by the compiler as a generic pointer hence no * warnings about incompatible pointer type */ int list_add_or_find(List *list, void *item_in, int (*compar)(const void *, const void *), int matchval, free_func free_function, int *index_return, List *heaplist) { void *oldptr; void **item = (void**) item_in; if ((oldptr = list_find(list, *item, compar, matchval, index_return)) != NULL) { if (free_function != NULL) CKI( free_function(*item, heaplist) ); *item = oldptr; return 0; } else { CKI( list_add(list, *item, heaplist) ); if (index_return != NULL) *index_return = list_size(list) - 1; return 1; } ERRBLKI; } /* call list_del to find a pointer ("ptr" element contained within the * listel structure) on the list, and then delete that element from the list, * or call list_del_by_listel directly (more efficient) if you already * have the listel structure pointer for what you want to delete. */ int list_del(List *list, void *ptr, List *heaplist) { List_element *p; CKP(list); for (p = list->first; p != NULL; p = p->next) if (p->ptr == ptr) return list_del_by_listel(list, p, heaplist); /* if what we're trying to remove is not found, fall through * to error exit */ ERRBLKI; } int list_del_by_listel(List *list, List_element *p, List *heaplist) { List_element *prev, *next; next = p->next; prev = p->prev; if (next != NULL) next->prev = prev; if (prev != NULL) prev->next = next; if (p == list->first) list->first = next; if (p==list->last) list->last = prev; CKI( free_(p, heaplist) ); list->n --; return 0; ERRBLKI; } /* call list_startwalk before a sequence of calls to list_walk */ int list_startwalk(const List *list, List_handle *handle) { CKP(list); CKP(handle); handle->current = list->first; handle->list = list; return 0; ERRBLKI; } /* list_walk: * designed to be called repeatedly, and returns the next element of the * list each time (but must not call either add or del between calls) * * (Set return_listel to nonzero to return the list element structure rather * than the pointer it contains. This is just so that if you put null * pointers on the list you can tell the difference from end of list.) */ void *list_walk(List_handle *handle, int return_listel) { void *ptr; CKP(handle); if (handle->current == NULL) return NULL; else { ptr = (return_listel) ? (void *) handle->current : handle->current->ptr; handle->current = handle->current->next; return ptr; } ERRBLKP; } /*------------------------------------------------------------------------------*/ /* list_find: find first item on the list matching specified item, where * "compar" is the matching function, and "matchval" is return value from * compar in the event of a match * * The pointer index_return, if non-NULL, is used to return the index number * on the list (set to -1 if not found). */ void *list_find(List *list, const void *item, int (*compar)(const void *, const void *), int matchval, int *index_return) { int index; List_element *listel; List_handle handle; void *ptr; list_startwalk(list, &handle); index = 0; while ((listel = list_walk(&handle, 1)) != NULL) { ptr = listel->ptr; if (compar(&item, &ptr) == matchval) { if (index_return != NULL) *index_return = index; return ptr; } index++; } if (index_return != NULL) *index_return = -1; return NULL; } int list_copy_to_ptr_array(const List *list, int *n_return, void *ptr_array_return, List *heaplist) { int n; List_handle handle; List_element *listel; void **ptr_array, **p; n = list_size(list); if (n == 0) ptr_array = NULL; else { CKP( ptr_array = malloc_(n * sizeof(void *), heaplist) ); p = ptr_array; list_startwalk(list, &handle); while ((listel = list_walk(&handle, 1)) != NULL) { *p = listel->ptr; p++; } } *n_return = n; * (void ***) ptr_array_return = ptr_array; return 0; ERRBLKI; } cf-python-1.3.2/cf/um/umread/c-lib/Makefile0000644000175000017500000000147212770452273020555 0ustar daviddavid00000000000000HEADERS=umfile.h umfileint.h bits/*.h LIBRARY=umfile.so CC=gcc CFLAGS=-Wall -fPIC -g CPP=gcc -E -P LD=ld LDFLAGS=-shared --build-id OBJS = umfile.o error.o filetype.o \ malloc.o linklist.o new_structs.o swap.o TYPE_DEP_LIBRARY = umfile_typedep.a TYPE_DEP_DIR = type-dep TYPE_DEP_LIBRARY_PATH = $(TYPE_DEP_DIR)/$(TYPE_DEP_LIBRARY) export CC CFLAGS CPP TYPE_DEP_LIBRARY .PHONY: clean all type-dep all: $(LIBRARY) clean: rm -f $(OBJS) $(MAKE) -C $(TYPE_DEP_DIR) clean type-dep: $(MAKE) -C $(TYPE_DEP_DIR) $(LIBRARY): $(OBJS) type-dep $(LD) $(LDFLAGS) -o $@ $(OBJS) --whole-archive $(TYPE_DEP_LIBRARY_PATH) %.o: %.c $(HEADERS) $(CC) $(CFLAGS) -c $< #bits/protos_sgl.h: bits/type_dep_protos.h # $(CPP) -DBUILD_HDR -DSINGLE $< > $@ # #bits/protos_dbl.h: bits/type_dep_protos.h # $(CPP) -DBUILD_HDR -DDOUBLE $< > $@ cf-python-1.3.2/cf/um/umread/c-lib/error.c0000600000175000017500000000244112603546021020365 0ustar daviddavid00000000000000#include #include #include "umfileint.h" static FILE *output = NULL; static int verbose; static const int do_debug = 1; void switch_bug(const char *routine) { gripe("no match in switch statement in routine; " "may indicate coding bug in umfile or unexpected header value"); } void gripe(const char *routine) { if (verbose || do_debug) { fprintf(output, "umfile: error condition detected in routine %s\n", routine); fflush(output); } verbose = 0; } void error_mesg(const char *fmt, ...) { va_list args; if (verbose || do_debug) { va_start(args, fmt); vfprintf(output, fmt, args); fprintf(output, "\n"); va_end(args); fflush(output); } verbose = 0; } void debug(const char *fmt, ...) { va_list args; if (do_debug) { va_start(args, fmt); fprintf(output, "DEBUG: "); vfprintf(output, fmt, args); fprintf(output, "\n"); va_end(args); fflush(output); } } void errorhandle_init() { /* init sets verbose -- called at start of each of the interface routines -- * then first call to error will cause a diagnostic to be printed, * but then unsets verbose to avoid series of knock-on messages */ verbose = 1; if (output == NULL) output = stderr; } cf-python-1.3.2/cf/um/umread/c-lib/README0000600000175000017500000000303212603546021017745 0ustar daviddavid00000000000000 For source files in the subdirectory type-dep, two versions of each object file will be built, one compiled with -DSINGLE, the other compiled with -DDOUBLE, and this will cause INTEGER and REAL and other dependent data types to be typedef-ed accordingly, meaning that they are suitable for data read in from 32- or 64-bit UM files without doing any casting. Functions should be prototyped in bits/type_dep_protos.h. The symbol names in these type-dependent functions will be renamed from 'foo' to 'foo_sgl' and 'foo_dbl' as appropriate for the two compiled versions. This happens automatically by the build process. This also includes renaming of external symbols where the functions called are provided by other source files also in the type-dep directory. Files in this (the parent) directory will be built without either -DSINGLE or -DDOUBLE, and no renaming of objects will take place, and the symbol names are unmodified. They should be protyped in bits/type_indep_protos.h. In the few places where a type-independent function calls a type-dependent function, the "_sgl" or "_dbl" part of the symbol name must be included explicitly (this will usually be in a 'switch' statement in a despatch function). These entry points into the type dependent code should be prototyped in bits/type_dep_entry_protos.h, using the processor macro WITH_LEN(foo), which expands to foo_sgl or foo_dbl; the header file is included twice with different defines, so a single prototype statement using this macro will suffice to prototype both versions of the function. cf-python-1.3.2/cf/um/umread/c-lib/umfileint.h0000600000175000017500000000110612603546021021232 0ustar daviddavid00000000000000#include "umfile.h" /*---------------------------*/ #include "bits/constants.h" #include "bits/datatype.h" #include "bits/ordering.h" #include "bits/typedefs.h" #include "bits/type_indep_protos.h" #include "bits/pp_header.h" #include "bits/err_macros.h" /* ----------------------------------------------------------- */ #if defined(SINGLE) || defined(DOUBLE) #include "bits/type_dep_protos.h" #else #define WITH_LEN(x) x ## _sgl #include "bits/type_dep_entry_protos.h" #undef WITH_LEN #define WITH_LEN(x) x ## _dbl #include "bits/type_dep_entry_protos.h" #undef WITH_LEN #endif cf-python-1.3.2/cf/um/umread/c-lib/type-dep/0000755000175000017500000000000012770523315020634 5ustar daviddavid00000000000000cf-python-1.3.2/cf/um/umread/c-lib/type-dep/date_and_time.c0000600000175000017500000001110212603546021023532 0ustar daviddavid00000000000000#include "umfileint.h" /* * Aside from the time_set() function, most of the infrastructure in this file * is for the purpose of calculating the length of the time mean period, just so * that e.g. monthly and daily means in the same file can be separated out into * different variables. */ REAL mean_period(const Time *time) { /* returns the averaging period in days, or 0. if it is not a mean field */ INTEGER lbtim = time->type; if (!is_time_mean(lbtim)) return 0.; return time_diff(lbtim, &time->time2, &time->time1); } int is_time_mean(INTEGER LBTIM) { int ib; ib = (LBTIM / 10) % 10; return (ib == 2) || (ib == 3); } REAL time_diff(INTEGER lbtim, const Date *date, const Date *orig_date) { int64_t secs; switch(calendar_type(lbtim)) { case gregorian: return sec_to_day(gregorian_to_secs(date) - gregorian_to_secs(orig_date)); break; /* notreached */ case cal360day: secs = date->second - orig_date->second + 60 * (date->minute - orig_date->minute + 60 * (date->hour - orig_date->hour + 24 * (date->day - orig_date->day + 30 * (date->month - orig_date->month + 12 * (int64_t) (date->year - orig_date->year) )))); return sec_to_day(secs); break; /* notreached */ case model: secs = date->second - orig_date->second + 60 * (date->minute - orig_date->minute + 60 * (date->hour - orig_date->hour + 24 * (int64_t) (date->day - orig_date->day))); return sec_to_day(secs); break; /* notreached */ default: SWITCH_BUG; } ERRBLKF; } REAL sec_to_day(int64_t seconds) { /* convert seconds to days, avoiding rounding where possible * by using integer arithmetic for the whole days */ const int secs_per_day = 86400; int64_t days, remainder; days = seconds / secs_per_day; remainder = seconds % secs_per_day; return days + remainder / (REAL) secs_per_day; } Calendar_type calendar_type(INTEGER type) { switch(type % 10) { case 0: /* fallthrough */ case 3: return model; break; /* notreached */ case 1: return gregorian; break; /* notreached */ case 2: return cal360day; break; /* notreached */ default: SWITCH_BUG; } /* on error return -1 (though only useful to calling routine if stored in an int * not a Calendar_type) */ ERRBLKI; } int64_t gregorian_to_secs(const Date *date) { /* Convert from Gregorian calendar to seconds since a fixed origin * * Can be with respect to any arbitary origin, because return values from this are * differenced. * * Arbitrary origin is what would be 1st Jan in the year 0 if hypothetically the * system was completely consistent going back this far. This simplifies the * calculation. * * Strictly, this is proleptic_gregorian rather than gregorian (see CF docs) * as this is more likely to match the code actually in the model. The UM * docs call it "gregorian" but I'm speculating (without checking model code) * that the model really doesn't have all that jazz with Julian calendar * before fifteen-something. */ const int sid = 86400; /* seconds in day */ const int sih = 3600; const int sim = 60; int64_t nsec; int year,nleap,nday,isleap; /* offsets from 1st Jan to 1st of each month in non-leap year */ int dayno[12] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; year = date->year; /* is the year leap? */ if (year % 400 == 0) isleap = 1; else if (year % 100 == 0) isleap = 0; else if (year % 4 == 0) isleap = 1; else isleap=0; /* nleap is number of 29th Febs passed between origin date and supplied date. */ nleap = year / 4 - year / 100 + year / 400; if (isleap && date->month <= 2) nleap--; nday = (year * 365) + dayno[date->month - 1] + (date->day - 1) + nleap; nsec = (int64_t) nday * sid + date->hour * sih + date->minute * sim + date->second; return nsec; } int time_set(Time *time, const Rec *rec) { time->type = LOOKUP(rec, INDEX_LBTIM); time->time1.year = LOOKUP(rec, INDEX_LBYR); time->time1.month = LOOKUP(rec, INDEX_LBMON); time->time1.day = LOOKUP(rec, INDEX_LBDAT); time->time1.hour = LOOKUP(rec, INDEX_LBHR); time->time1.minute = LOOKUP(rec, INDEX_LBMIN); time->time1.second = 0; time->time2.year = LOOKUP(rec, INDEX_LBYRD); time->time2.month = LOOKUP(rec, INDEX_LBMOND); time->time2.day = LOOKUP(rec, INDEX_LBDATD); time->time2.hour = LOOKUP(rec, INDEX_LBHRD); time->time2.minute = LOOKUP(rec, INDEX_LBMIND); time->time2.second = 0; return 0; } cf-python-1.3.2/cf/um/umread/c-lib/type-dep/redefs_sgl0000600000175000017500000000444412655106665022701 0ustar daviddavid00000000000000read_record_data_dummy read_record_data_dummy_dbl get_extra_data_length get_extra_data_length_dbl get_extra_data_offset_and_length_core get_extra_data_offset_and_length_core_dbl get_num_data_words get_num_data_words_dbl get_type get_type_dbl get_type_and_num_words_core get_type_and_num_words_core_dbl get_var_compression get_var_compression_dbl get_var_gridcode get_var_gridcode_dbl get_var_packing get_var_packing_dbl get_var_real_fill_value get_var_real_fill_value_dbl get_var_stash_item get_var_stash_item_dbl get_var_stash_model get_var_stash_model_dbl get_var_stash_section get_var_stash_section_dbl var_is_missing var_is_missing_dbl get_ff_disk_length get_ff_disk_length_dbl get_record get_record_dbl get_valid_records_ff get_valid_records_ff_dbl read_all_headers read_all_headers_dbl read_all_headers_ff read_all_headers_ff_dbl read_all_headers_pp read_all_headers_pp_dbl read_extra_data_core read_extra_data_core_dbl read_hdr read_hdr_dbl read_hdr_at_offset read_hdr_at_offset_dbl read_record_data_core read_record_data_core_dbl read_words read_words_dbl skip_fortran_record skip_fortran_record_dbl skip_word skip_word_dbl unpack_run_length_encoded unpack_run_length_encoded_dbl file_parse_core file_parse_core_dbl get_vars get_vars_dbl grid_supported grid_supported_dbl initialise_records initialise_records_dbl process_vars process_vars_dbl set_disambig_index set_disambig_index_dbl test_skip_var test_skip_var_dbl var_has_regular_z_t var_has_regular_z_t_dbl debug_dump_all_headers debug_dump_all_headers_dbl calendar_type calendar_type_dbl gregorian_to_secs gregorian_to_secs_dbl is_time_mean is_time_mean_dbl mean_period mean_period_dbl sec_to_day sec_to_day_dbl time_diff time_diff_dbl time_set time_set_dbl compare_dates compare_dates_dbl compare_levels compare_levels_dbl compare_lists compare_lists_dbl compare_mean_periods compare_mean_periods_dbl compare_records compare_records_dbl compare_records_between_vars compare_records_between_vars_dbl compare_records_within_var compare_records_within_var_dbl compare_times compare_times_dbl records_from_different_vars records_from_different_vars_dbl level_type level_type_dbl lev_set lev_set_dbl free_t_axis free_t_axis_dbl free_z_axis free_z_axis_dbl new_t_axis new_t_axis_dbl new_z_axis new_z_axis_dbl t_axis_add t_axis_add_dbl z_axis_add z_axis_add_dbl unwgdos unwgdos_dbl cf-python-1.3.2/cf/um/umread/c-lib/type-dep/Makefile0000644000175000017500000000226012747600703022275 0ustar daviddavid00000000000000STEMS = umfile_test_typedep interpret_header read process_vars \ debug_dump date_and_time compare levels axes unwgdos CFLAGS += -I.. SGL_OBJS=$(foreach stem, $(STEMS), $(stem)_sgl.o) DBL_OBJS=$(foreach stem, $(STEMS), $(stem)_dbl.o) SGL_TMP_OBJS=$(foreach stem, $(STEMS), $(stem)_sgl_tmp.o) DBL_TMP_OBJS=$(foreach stem, $(STEMS), $(stem)_dbl_tmp.o) TMP_OBJS = $(SGL_TMP_OBJS) $(DBL_TMP_OBJS) OBJS = $(SGL_OBJS) $(DBL_OBJS) REDEFINES_DBL = redefs_sgl REDEFINES_SGL = redefs_dbl LIB = $(TYPE_DEP_LIBRARY) .PHONY: all clean all: $(LIB) clean: rm -f $(OBJS) $(TMP_OBJS) $(LIB) $(REDEFINES_SGL) $(REDEFINES_DBL) %_dbl_tmp.o: %.c $(HEADERS) $(CC) $(CFLAGS) -c -DDOUBLE -o $@ $< %_sgl_tmp.o: %.c $(HEADERS) $(CC) $(CFLAGS) -c -DSINGLE -o $@ $< %_sgl.o: %_sgl_tmp.o $(REDEFINES_SGL) objcopy --redefine-syms=$(REDEFINES_SGL) $< $@ %_dbl.o: %_dbl_tmp.o $(REDEFINES_DBL) objcopy --redefine-syms=$(REDEFINES_DBL) $< $@ $(REDEFINES_SGL): $(SGL_TMP_OBJS) nm -A $(SGL_TMP_OBJS) | awk '/ T /{print $$3, $$3"_sgl"}' | grep -v thunk > $@ $(REDEFINES_DBL): $(DBL_TMP_OBJS) nm -A $(DBL_TMP_OBJS) | awk '/ T /{print $$3, $$3"_dbl"}' | grep -v thunk > $@ $(LIB): $(OBJS) rm -f $@ ar r $@ $(OBJS) cf-python-1.3.2/cf/um/umread/c-lib/type-dep/debug_dump.c0000600000175000017500000000777212603546021023112 0ustar daviddavid00000000000000#include "umfileint.h" void debug_dump_all_headers(File *file) { int irec; Rec *rec; debug("fd = %d", file->fd); debug("format = %d", file->file_type.format); debug("byte_ordering = %d", file->file_type.byte_ordering); debug("word_size = %d", file->file_type.word_size); debug("nrec = %d", file->internp->nrec); debug(""); for (irec = 0; irec < file->internp->nrec; irec++) { rec = file->internp->recs[irec]; debug("rec %d", irec); debug("header_offset = %d", rec->header_offset); debug("data_offset = %d", rec->data_offset); debug("disk_length = %d", rec->disk_length); debug("LBYR = %d", LOOKUP(rec, INDEX_LBYR)); debug("LBMON = %d", LOOKUP(rec, INDEX_LBMON)); debug("LBDAT = %d", LOOKUP(rec, INDEX_LBDAT)); debug("LBHR = %d", LOOKUP(rec, INDEX_LBHR)); debug("LBMIN = %d", LOOKUP(rec, INDEX_LBMIN)); debug("LBDAY = %d", LOOKUP(rec, INDEX_LBDAY)); debug("LBYRD = %d", LOOKUP(rec, INDEX_LBYRD)); debug("LBMOND = %d", LOOKUP(rec, INDEX_LBMOND)); debug("LBDATD = %d", LOOKUP(rec, INDEX_LBDATD)); debug("LBHRD = %d", LOOKUP(rec, INDEX_LBHRD)); debug("LBMIND = %d", LOOKUP(rec, INDEX_LBMIND)); debug("LBDAYD = %d", LOOKUP(rec, INDEX_LBDAYD)); debug("LBTIM = %d", LOOKUP(rec, INDEX_LBTIM)); debug("LBFT = %d", LOOKUP(rec, INDEX_LBFT)); debug("LBLREC = %d", LOOKUP(rec, INDEX_LBLREC)); debug("LBCODE = %d", LOOKUP(rec, INDEX_LBCODE)); debug("LBHEM = %d", LOOKUP(rec, INDEX_LBHEM)); debug("LBROW = %d", LOOKUP(rec, INDEX_LBROW)); debug("LBNPT = %d", LOOKUP(rec, INDEX_LBNPT)); debug("LBEXT = %d", LOOKUP(rec, INDEX_LBEXT)); debug("LBPACK = %d", LOOKUP(rec, INDEX_LBPACK)); debug("LBREL = %d", LOOKUP(rec, INDEX_LBREL)); debug("LBFC = %d", LOOKUP(rec, INDEX_LBFC)); debug("LBCFC = %d", LOOKUP(rec, INDEX_LBCFC)); debug("LBPROC = %d", LOOKUP(rec, INDEX_LBPROC)); debug("LBVC = %d", LOOKUP(rec, INDEX_LBVC)); debug("LBRVC = %d", LOOKUP(rec, INDEX_LBRVC)); debug("LBEXP = %d", LOOKUP(rec, INDEX_LBEXP)); debug("LBBEGIN = %d", LOOKUP(rec, INDEX_LBBEGIN)); debug("LBNREC = %d", LOOKUP(rec, INDEX_LBNREC)); debug("LBPROJ = %d", LOOKUP(rec, INDEX_LBPROJ)); debug("LBTYP = %d", LOOKUP(rec, INDEX_LBTYP)); debug("LBLEV = %d", LOOKUP(rec, INDEX_LBLEV)); debug("LBRSVD1 = %d", LOOKUP(rec, INDEX_LBRSVD1)); debug("LBRSVD2 = %d", LOOKUP(rec, INDEX_LBRSVD2)); debug("LBRSVD3 = %d", LOOKUP(rec, INDEX_LBRSVD3)); debug("LBRSVD4 = %d", LOOKUP(rec, INDEX_LBRSVD4)); debug("LBSRCE = %d", LOOKUP(rec, INDEX_LBSRCE)); debug("LBUSER1 = %d", LOOKUP(rec, INDEX_LBUSER1)); debug("LBUSER2 = %d", LOOKUP(rec, INDEX_LBUSER2)); debug("LBUSER3 = %d", LOOKUP(rec, INDEX_LBUSER3)); debug("LBUSER4 = %d", LOOKUP(rec, INDEX_LBUSER4)); debug("LBUSER5 = %d", LOOKUP(rec, INDEX_LBUSER5)); debug("LBUSER6 = %d", LOOKUP(rec, INDEX_LBUSER6)); debug("LBUSER7 = %d", LOOKUP(rec, INDEX_LBUSER7)); debug("BULEV = %f", RLOOKUP(rec, INDEX_BULEV)); debug("BHULEV = %f", RLOOKUP(rec, INDEX_BHULEV)); debug("BRSVD3 = %f", RLOOKUP(rec, INDEX_BRSVD3)); debug("BRSVD4 = %f", RLOOKUP(rec, INDEX_BRSVD4)); debug("BDATUM = %f", RLOOKUP(rec, INDEX_BDATUM)); debug("BACC = %f", RLOOKUP(rec, INDEX_BACC)); debug("BLEV = %f", RLOOKUP(rec, INDEX_BLEV)); debug("BRLEV = %f", RLOOKUP(rec, INDEX_BRLEV)); debug("BHLEV = %f", RLOOKUP(rec, INDEX_BHLEV)); debug("BHRLEV = %f", RLOOKUP(rec, INDEX_BHRLEV)); debug("BPLAT = %f", RLOOKUP(rec, INDEX_BPLAT)); debug("BPLON = %f", RLOOKUP(rec, INDEX_BPLON)); debug("BGOR = %f", RLOOKUP(rec, INDEX_BGOR)); debug("BZY = %f", RLOOKUP(rec, INDEX_BZY)); debug("BDY = %f", RLOOKUP(rec, INDEX_BDY)); debug("BZX = %f", RLOOKUP(rec, INDEX_BZX)); debug("BDX = %f", RLOOKUP(rec, INDEX_BDX)); debug("BMDI = %f", RLOOKUP(rec, INDEX_BMDI)); debug("BMKS = %f", RLOOKUP(rec, INDEX_BMKS)); } } cf-python-1.3.2/cf/um/umread/c-lib/type-dep/levels.c0000600000175000017500000000545312603546021022263 0ustar daviddavid00000000000000#include "umfileint.h" int lev_set(Level *lev, const Rec *rec) { lev->type = level_type(rec); switch (lev->type) { case hybrid_height_lev_type: lev->values.hybrid_height.a = RLOOKUP(rec, INDEX_BLEV); lev->values.hybrid_height.b = RLOOKUP(rec, INDEX_BHLEV); #ifdef BDY_LEVS lev->values.hybrid_height.ubdy_a = RLOOKUP(rec, INDEX_BULEV); lev->values.hybrid_height.ubdy_b = RLOOKUP(rec, INDEX_BHULEV); lev->values.hybrid_height.lbdy_a = RLOOKUP(rec, INDEX_BRLEV); lev->values.hybrid_height.lbdy_b = RLOOKUP(rec, INDEX_BHRLEV); #endif break; case hybrid_sigmap_lev_type: lev->values.hybrid_sigmap.a = RLOOKUP(rec, INDEX_BHLEV); lev->values.hybrid_sigmap.b = RLOOKUP(rec, INDEX_BLEV); #ifdef BDY_LEVS lev->values.hybrid_sigmap.ubdy_a = RLOOKUP(rec, INDEX_BHULEV); lev->values.hybrid_sigmap.ubdy_b = RLOOKUP(rec, INDEX_BULEV); lev->values.hybrid_sigmap.lbdy_a = RLOOKUP(rec, INDEX_BHRLEV); lev->values.hybrid_sigmap.lbdy_b = RLOOKUP(rec, INDEX_BRLEV); #endif break; case pseudo_lev_type: lev->values.pseudo.index = LOOKUP(rec, INDEX_LBUSER5); break; default: if (RLOOKUP(rec, INDEX_BLEV) == 0 && LOOKUP(rec, INDEX_LBLEV) != 9999 && LOOKUP(rec, INDEX_LBLEV) != 8888) lev->values.misc.level = LOOKUP(rec, INDEX_LBLEV); else lev->values.misc.level = RLOOKUP(rec, INDEX_BLEV); #ifdef BDY_LEVS lev->values.misc.ubdy_level = RLOOKUP(rec, INDEX_BULEV); lev->values.misc.lbdy_level = RLOOKUP(rec, INDEX_BRLEV); #endif break; } return 0; } Lev_type level_type(const Rec *rec) { if (LOOKUP(rec, INDEX_LBUSER5) != 0 && LOOKUP(rec, INDEX_LBUSER5) != INT_MISSING_DATA) return pseudo_lev_type; switch (LOOKUP(rec, INDEX_LBVC)) { /* * 1 Height (m) 8 Pressure (mb) * 9 Hybrid co-ordinates 10 Sigma (=p/p*) * 128 Mean sea level 129 Surface * 130 Tropopause level 131 Maximum wind level * 132 Freezing level 142 Upper hybrid level * 143 Lower hybrid level 176 Latitude (deg) * 177 Longitude (deg) */ /* also new dynamics: 65 hybrid height */ case 1: return height_lev_type; case 2: return depth_lev_type; case 5: return boundary_layer_top_lev_type; case 6: return soil_lev_type; case 8: return pressure_lev_type; case 9: return hybrid_sigmap_lev_type; case 65: return hybrid_height_lev_type; case 128: return mean_sea_lev_type; case 129: return surface_lev_type; case 130: return tropopause_lev_type; case 133: return top_of_atmos_lev_type; default: return other_lev_type; } } cf-python-1.3.2/cf/um/umread/c-lib/type-dep/redefs_dbl0000600000175000017500000000444412655106665022655 0ustar daviddavid00000000000000read_record_data_dummy read_record_data_dummy_sgl get_extra_data_length get_extra_data_length_sgl get_extra_data_offset_and_length_core get_extra_data_offset_and_length_core_sgl get_num_data_words get_num_data_words_sgl get_type get_type_sgl get_type_and_num_words_core get_type_and_num_words_core_sgl get_var_compression get_var_compression_sgl get_var_gridcode get_var_gridcode_sgl get_var_packing get_var_packing_sgl get_var_real_fill_value get_var_real_fill_value_sgl get_var_stash_item get_var_stash_item_sgl get_var_stash_model get_var_stash_model_sgl get_var_stash_section get_var_stash_section_sgl var_is_missing var_is_missing_sgl get_ff_disk_length get_ff_disk_length_sgl get_record get_record_sgl get_valid_records_ff get_valid_records_ff_sgl read_all_headers read_all_headers_sgl read_all_headers_ff read_all_headers_ff_sgl read_all_headers_pp read_all_headers_pp_sgl read_extra_data_core read_extra_data_core_sgl read_hdr read_hdr_sgl read_hdr_at_offset read_hdr_at_offset_sgl read_record_data_core read_record_data_core_sgl read_words read_words_sgl skip_fortran_record skip_fortran_record_sgl skip_word skip_word_sgl unpack_run_length_encoded unpack_run_length_encoded_sgl file_parse_core file_parse_core_sgl get_vars get_vars_sgl grid_supported grid_supported_sgl initialise_records initialise_records_sgl process_vars process_vars_sgl set_disambig_index set_disambig_index_sgl test_skip_var test_skip_var_sgl var_has_regular_z_t var_has_regular_z_t_sgl debug_dump_all_headers debug_dump_all_headers_sgl calendar_type calendar_type_sgl gregorian_to_secs gregorian_to_secs_sgl is_time_mean is_time_mean_sgl mean_period mean_period_sgl sec_to_day sec_to_day_sgl time_diff time_diff_sgl time_set time_set_sgl compare_dates compare_dates_sgl compare_levels compare_levels_sgl compare_lists compare_lists_sgl compare_mean_periods compare_mean_periods_sgl compare_records compare_records_sgl compare_records_between_vars compare_records_between_vars_sgl compare_records_within_var compare_records_within_var_sgl compare_times compare_times_sgl records_from_different_vars records_from_different_vars_sgl level_type level_type_sgl lev_set lev_set_sgl free_t_axis free_t_axis_sgl free_z_axis free_z_axis_sgl new_t_axis new_t_axis_sgl new_z_axis new_z_axis_sgl t_axis_add t_axis_add_sgl z_axis_add z_axis_add_sgl unwgdos unwgdos_sgl cf-python-1.3.2/cf/um/umread/c-lib/type-dep/compare.c0000600000175000017500000002412512603546021022414 0ustar daviddavid00000000000000/* * COMPARISON FUNCTIONS. * * NOTE: functions which take arguments of type void* (except for * compare_ptrs) are designed to be used with generic routines: * compare_records is envisaged for use with qsort; several other functions * are envisaged for use with compare_lists (below). * * In these cases if supplying pointers directly to the relevant structures, * need to generate an extra level of pointer with "&" syntax. * * But not all functions below are like that. Don't assume functions can be * used analogously without first examining the argument lists. */ /* The code profiler suggests that compare_ints and compare_reals are * candidates for inlining; however, unfortunately this sometimes gets * compiled with c89 which doesn't support inline functions. Use a #define * for compare_ints. compare_reals, which is more awkward to #define, is just * going to have to stay as it is for now (it's called less often). */ #include #include "umfileint.h" #define compare_ints(a, b) ((a) < (b) ? (-1) : (a) > (b) ? 1 : 0) /* * static int compare_ints(INTEGER a, INTEGER b) * { * if (ab) return 1; * return 0; * } */ static int compare_reals(REAL a, REAL b) { REAL delta; /* first test for special case (unnecessary, but code profiler shows * slightly more efficient) */ if (a == b) return 0; delta = fabs(b * REAL_TOLERANCE); if (a < b - delta) return -1; if (a > b + delta) return 1; return 0; } #define COMPARE_INTS(tag) {int cmp = compare_ints(LOOKUP(a, tag), LOOKUP(b, tag)); if (cmp != 0) return cmp;} #define COMPARE_REALS(tag) {int cmp = compare_reals(RLOOKUP(a, tag), RLOOKUP(b, tag)); if (cmp != 0) return cmp;} /* routine to compare two PP records, to see if they are in the same * variable * * returns: * * -1 or 1 headers are from different variables; * sign of return value gives consistent ordering * * 0 headers are from same variable */ int compare_records_between_vars(const Rec *a, const Rec *b) { int cmp; COMPARE_INTS(INDEX_LBUSER4); COMPARE_INTS(INDEX_LBUSER7); COMPARE_INTS(INDEX_LBCODE); COMPARE_INTS(INDEX_LBVC); COMPARE_INTS(INDEX_LBTIM); COMPARE_INTS(INDEX_LBPROC); COMPARE_REALS(INDEX_BPLAT); COMPARE_REALS(INDEX_BPLON); COMPARE_INTS(INDEX_LBHEM); COMPARE_INTS(INDEX_LBROW); COMPARE_INTS(INDEX_LBNPT); COMPARE_REALS(INDEX_BGOR); COMPARE_REALS(INDEX_BZY); COMPARE_REALS(INDEX_BDY); COMPARE_REALS(INDEX_BZX); COMPARE_REALS(INDEX_BDX); cmp = compare_mean_periods(a, b); if (cmp != 0) return cmp; /* Disambig index is used to force distinction between variables for records * whose headers are the same. It is initialised to the same value for all * records (in fact -1), but may later be set to different values according * to some heuristic. */ cmp = compare_ints(a->internp->disambig_index, b->internp->disambig_index); if (cmp != 0) return cmp; return 0; } /* helper routine for compare_mean_periods - test if both periods are in specified range * note - assumes that low, high are positive */ static int both_values_in_range(REAL low, REAL high, REAL a, REAL b) { REAL low1 = low * (1. - REAL_TOLERANCE); REAL high1 = high * (1. + REAL_TOLERANCE); return (a >= low1) && (a <= high1) && (b >= low1) & (b <= high1); } /* Routine to compare if two PP records have different meaning periods, such * that they should be considered to be part of different variables. Normally * this will be true if the mean periods differ by more than "delta", but in * the case of Gregorian calendar, we allow some tolerance relating to * climatology data. * * This should only get called if both records have already been checked for * having the same LBTIM and LBPROC. */ int compare_mean_periods(const Rec *a, const Rec *b) { int cmp; cmp = compare_reals(a->internp->mean_period, b->internp->mean_period); if (cmp == 0) return 0; /* if we get here, times differ - but for gregorian cut some slack */ if (calendar_type(LOOKUP(a, INDEX_LBTIM)) == gregorian) { if (both_values_in_range(28., 31., a->internp->mean_period, b->internp->mean_period) /* monthly */ || both_values_in_range(90., 92., a->internp->mean_period, b->internp->mean_period) /* seasonal */ || both_values_in_range(365., 366., a->internp->mean_period, b->internp->mean_period)) /* annual */ return 0; } return cmp; } /* routine to compare two PP records that the calling routine * has already established are in the same variable. * * returns: * * -1 or 1 times or levels differ; * sign of return value gives consistent ordering * of times and levels * * 0 records do not differ within values tested */ int compare_records_within_var(const Rec *a, const Rec *b) { int a_surface, b_surface; COMPARE_INTS(INDEX_LBFT); COMPARE_INTS(INDEX_LBYR); COMPARE_INTS(INDEX_LBMON); COMPARE_INTS(INDEX_LBDAT); COMPARE_INTS(INDEX_LBDAY); COMPARE_INTS(INDEX_LBHR); COMPARE_INTS(INDEX_LBMIN); COMPARE_INTS(INDEX_LBYRD); COMPARE_INTS(INDEX_LBMOND); COMPARE_INTS(INDEX_LBDATD); COMPARE_INTS(INDEX_LBDAYD); COMPARE_INTS(INDEX_LBHRD); COMPARE_INTS(INDEX_LBMIND); /* * Ordering of levels: * * Generally we want to sort on LBLEV before sorting on BLEV. * * This is because in the case of hybrid levels, BLEV contains the B values * (in p = A + B p_s), which won't do for sorting, and fortunately in this * case LBLEV contains the model level index which is fine. * * But there is a nasty special case: surface and boundary layer heat flux * has LBLEV = 9999, 2, 3, 4, ... where 9999 is the surface layer. In this * case we *could* in fact sort on BLEV, but then we need to know when it's * okay to do this (STASH code?). * * Maybe safer, treat 9999 lower than any level if comparing it with * another level. (9999 should always be a special value and it is rare * for it to be mixed with non-special values in the same variable.) */ a_surface = (LOOKUP(a, INDEX_LBLEV) == 9999); b_surface = (LOOKUP(b, INDEX_LBLEV) == 9999); if (a_surface && !b_surface) return -1; else if (b_surface && !a_surface) return 1; COMPARE_INTS(INDEX_LBLEV); COMPARE_REALS(INDEX_BLEV); COMPARE_REALS(INDEX_BHLEV); return 0; } /* routine to compare two PP records. * returns: * -2 or 2 headers are from different variable * -1 or 1 headers are from same variable * 0 difference not found in elements inspected * */ int compare_records(const void *p1, const void *p2) { const Rec *a = * (Rec **) p1; const Rec *b = * (Rec **) p2; int cmp; cmp = compare_records_between_vars(a, b); if (cmp != 0) { // debug("compare_records - variables differ %d %d", LOOKUP(a,INDEX_LBUSER4), // LOOKUP(b,INDEX_LBUSER4)); return cmp * 2; } cmp = compare_records_within_var(a, b); if (cmp != 0){ // debug("compare_records - variables same %d %d", LOOKUP(a,INDEX_LBUSER4), //LOOKUP(b,INDEX_LBUSER4)); return cmp; } //debug("compare_records - records same"); return 0; } int records_from_different_vars(const Rec *a, const Rec *b) { return (compare_records_between_vars(a, b) != 0); } int compare_lists(const List *l1, const List *l2, int (*compfunc)(const void*, const void*)) { int i, n, cmp; const void *item1, *item2; List_handle handle1, handle2; /* differ if number of items differs */ n = list_size(l1); if ((cmp = compare_ints(n, list_size(l2))) != 0) return cmp; /* differ if any individual item differs */ list_startwalk(l1, &handle1); list_startwalk(l2, &handle2); for (i = 0; i < n; i++) { item1 = list_walk(&handle1, 0); item2 = list_walk(&handle2, 0); if ((cmp = compfunc(&item1, &item2)) != 0) return cmp; } return 0; } int compare_levels(const void *p1, const void *p2) { const Level *a = *(Level **)p1; const Level *b = *(Level **)p2; /* macros called LCOMPARE_INTS and LCOMPARE_REALS to emphasise difference from those in compare_records */ #define LCOMPARE_INTS(tag) {int cmp = compare_ints(a->tag, b->tag); if (cmp != 0) return cmp;} #define LCOMPARE_REALS(tag) {int cmp = compare_reals(a->tag, b->tag); if (cmp != 0) return cmp;} LCOMPARE_INTS(type); switch (a->type) { case hybrid_height_lev_type: LCOMPARE_REALS(values.hybrid_height.a); LCOMPARE_REALS(values.hybrid_height.b); #ifdef BDY_LEVS LCOMPARE_REALS(values.hybrid_height.ubdy_a); LCOMPARE_REALS(values.hybrid_height.ubdy_b); LCOMPARE_REALS(values.hybrid_height.lbdy_a); LCOMPARE_REALS(values.hybrid_height.lbdy_b); #endif break; case hybrid_sigmap_lev_type: LCOMPARE_REALS(values.hybrid_sigmap.a); LCOMPARE_REALS(values.hybrid_sigmap.b); #ifdef BDY_LEVS LCOMPARE_REALS(values.hybrid_sigmap.ubdy_a); LCOMPARE_REALS(values.hybrid_sigmap.ubdy_b); LCOMPARE_REALS(values.hybrid_sigmap.lbdy_a); LCOMPARE_REALS(values.hybrid_sigmap.lbdy_b); #endif break; case pseudo_lev_type: LCOMPARE_INTS(values.pseudo.index); break; default: LCOMPARE_REALS(values.misc.level); #ifdef BDY_LEVS LCOMPARE_REALS(values.misc.ubdy_level); LCOMPARE_REALS(values.misc.lbdy_level); #endif break; } return 0; } int compare_times(const void *p1, const void *p2) { const Time *a = * (Time **) p1; const Time *b = * (Time **) p2; int cmp; /* LBTYP: ignore 100s digit = sampling frequency, as we don't use it for anything */ if ((cmp = compare_ints(a->type % 100, b->type % 100)) != 0) return cmp; if ((cmp = compare_dates(&a->time1, &b->time1)) != 0) return cmp; if ((cmp = compare_dates(&a->time2, &b->time2)) != 0) return cmp; return 0; } int compare_dates(const Date *a, const Date *b) { int cmp; if ((cmp = compare_ints(a->year ,b->year )) != 0) return cmp; if ((cmp = compare_ints(a->month ,b->month )) != 0) return cmp; if ((cmp = compare_ints(a->day ,b->day )) != 0) return cmp; if ((cmp = compare_ints(a->hour ,b->hour )) != 0) return cmp; if ((cmp = compare_ints(a->minute,b->minute)) != 0) return cmp; if ((cmp = compare_ints(a->second,b->second)) != 0) return cmp; return 0; } cf-python-1.3.2/cf/um/umread/c-lib/type-dep/read.c0000600000175000017500000003332312603546021021701 0ustar daviddavid00000000000000#include #include #include "umfileint.h" #define file_pos(f) (lseek(f, 0, SEEK_CUR)) #if defined(SINGLE) #define swap_bytes swap_bytes_sgl #elif defined(DOUBLE) #define swap_bytes swap_bytes_dbl #else #error Need to compile this file with -DSINGLE or -DDOUBLE #endif /* * reads n words from file, storing them at ptr, with byte swapping as required * returns number of words read (i.e. n, unless there's a short read) */ size_t read_words(int fd, void *ptr, size_t num_words, Byte_ordering byte_ordering) { size_t nread; CKP(ptr); nread = read(fd, ptr, num_words * WORD_SIZE) / WORD_SIZE; if (byte_ordering == REVERSE_ORDERING) swap_bytes(ptr, nread); return nread; ERRBLKI; } int read_extra_data_core(int fd, size_t extra_data_offset, size_t extra_data_length, Byte_ordering byte_ordering, void *extra_data_rtn) { /* reads extra data into storage provided by the caller * The caller must provide the offset and length, obtained * by a previous call to get_extra_data_offset_and_length() */ size_t extra_data_words; extra_data_words = extra_data_length / WORD_SIZE; CKI( lseek(fd, extra_data_offset, SEEK_SET) ); ERRIF( extra_data_length % WORD_SIZE != 0 ); ERRIF( read_words(fd, extra_data_rtn, extra_data_words, byte_ordering) != extra_data_words); return 0; ERRBLKI; } int read_hdr_at_offset(int fd, size_t header_offset, Byte_ordering byte_ordering, INTEGER *int_hdr_rtn, REAL *real_hdr_rtn) { /* as read_hdr below, but also specifying the file offset in bytes */ CKI( lseek(fd, header_offset, SEEK_SET) ); return read_hdr(fd, byte_ordering, int_hdr_rtn, real_hdr_rtn); ERRBLKI; } int read_hdr(int fd, Byte_ordering byte_ordering, INTEGER *int_hdr_rtn, REAL *real_hdr_rtn) { /* reads a PP header at specified word offset into storage provided by the caller */ ERRIF( read_words(fd, int_hdr_rtn, N_INT_HDR, byte_ordering) != N_INT_HDR); ERRIF( read_words(fd, real_hdr_rtn, N_REAL_HDR, byte_ordering) != N_REAL_HDR); return 0; ERRBLKI; } Rec *get_record(File *file, List *heaplist) { /* reads PP headers and returns a Rec structure -- * * file must be positioned at start of header (after any fortran record length integer) on entry, * and will be positioned at end of header on return * * the Rec structure will contain the headers in elements int_hdr and real_hdr, * but other elements will be left as initialised by new_rec() */ Rec *rec; CKP( rec = new_rec(WORD_SIZE, heaplist) ); CKI( read_hdr(file->fd, file->file_type.byte_ordering, rec->int_hdr, rec->real_hdr) ); return rec; /* success */ ERRBLKP; } int read_all_headers(File *file, List *heaplist) { switch (file->file_type.format) { case plain_pp: return read_all_headers_pp(file, heaplist); case fields_file: return read_all_headers_ff(file, heaplist); default: switch_bug("read_all_headers"); ERR; } return 0; ERRBLKI; } /* skip_fortran_record: skips a fortran record, and returns how big it was (in bytes), * or -1 for end of file, or -2 for any error which may imply corrupt file * (return value of 0 is a legitimate empty record). */ size_t skip_fortran_record(File *file) { INTEGER rec_bytes, rec_bytes_2; if( read_words(file->fd, &rec_bytes, 1, file->file_type.byte_ordering) != 1) return -1; CKI( lseek(file->fd, rec_bytes, SEEK_CUR) ); ERRIF( read_words(file->fd, &rec_bytes_2, 1, file->file_type.byte_ordering) != 1); ERRIF(rec_bytes != rec_bytes_2); return rec_bytes; ERRBLK(-2); } int skip_word(File *file) { CKI( lseek(file->fd, WORD_SIZE, SEEK_CUR) ); return 0; ERRBLKI; } int read_all_headers_pp(File *file, List *heaplist) { int fd; size_t nrec, rec_bytes, recno, header_offset; Rec **recs, *rec; fd = file->fd; /* count the PP records in the file */ lseek(fd, 0, SEEK_SET); for (nrec = 0; (rec_bytes = skip_fortran_record(file)) != -1; nrec++) { ERRIF(rec_bytes == -2); if (rec_bytes != N_HDR * WORD_SIZE) { error_mesg("unsupported header length in PP file: %d words", rec_bytes / WORD_SIZE); ERR; } ERRIF( skip_fortran_record(file) < 0); /* skip the data record */ } /* now rewind, and read in all the PP header data */ CKP( recs = malloc_(nrec * sizeof(Rec *), heaplist) ); file->internp->nrec = nrec; file->internp->recs = recs; lseek(fd, 0, SEEK_SET); for (recno = 0; recno < nrec; recno++) { CKI( skip_word(file) ); header_offset = file_pos(fd); CKP( rec = get_record(file, heaplist) ); CKI( skip_word(file) ); recs[recno] = rec; /* skip data record but store length */ rec->header_offset = header_offset; rec->data_offset = file_pos(fd) + WORD_SIZE; rec->disk_length = skip_fortran_record(file); } return 0; ERRBLKI; } #define READ_ITEM(x) \ ERRIF( read_words(fd, &x, 1, byte_ordering) != 1); int read_all_headers_ff(File *file, List *heaplist) { int fd; size_t hdr_start, hdr_size, header_offset, data_offset_calculated, data_offset_specified; int *valid, n_valid_rec, n_raw_rec, i_valid_rec, i_raw_rec; Byte_ordering byte_ordering; Rec *rec, **recs; INTEGER start_lookup, nlookup1, nlookup2, dataset_type, start_data; fd = file->fd; byte_ordering = file->file_type.byte_ordering; /* pick out certain information from the fixed length header */ CKI( lseek(fd, 4 * WORD_SIZE, SEEK_SET) ); READ_ITEM(dataset_type); ERRIF( read_words(fd, &dataset_type, 1, byte_ordering) != 1); CKI( lseek(fd, 149 * WORD_SIZE, SEEK_SET) ); READ_ITEM(start_lookup); READ_ITEM(nlookup1); READ_ITEM(nlookup2); CKI( lseek(fd, 159 * WORD_SIZE, SEEK_SET) ); READ_ITEM(start_data); /* (first dim of lookup documented as being 64 or 128, so * allow header longer than n_hdr (64) -- discarding excess -- but not shorter) */ if (nlookup1 < N_HDR) { error_mesg("unsupported header length: %d words", nlookup1); ERR; } CKP( valid = malloc_(nlookup2 * sizeof(int), heaplist) ); hdr_start = (start_lookup - 1) * WORD_SIZE; hdr_size = nlookup1 * WORD_SIZE; n_raw_rec = nlookup2; CKI( get_valid_records_ff(fd, byte_ordering, hdr_start, hdr_size, n_raw_rec, valid, &n_valid_rec) ); /* now read in all the PP header data */ CKP( recs = malloc_(n_valid_rec * sizeof(Rec *), heaplist) ); /* debug("n_raw_rec=%d n_valid_rec=%d", n_raw_rec, n_valid_rec); */ file->internp->nrec = n_valid_rec; file->internp->recs = recs; i_valid_rec = 0; data_offset_calculated = (start_data - 1) * WORD_SIZE; for (i_raw_rec = 0; i_raw_rec < n_raw_rec; i_raw_rec++) { if (valid[i_raw_rec]) { header_offset = hdr_start + i_raw_rec * hdr_size; CKI( lseek(fd, header_offset, SEEK_SET) ); CKP( rec = get_record(file, heaplist) ); recs[i_valid_rec] = rec; rec->header_offset = header_offset; rec->disk_length = get_ff_disk_length(rec->int_hdr); data_offset_specified = (size_t) LOOKUP(rec, INDEX_LBBEGIN) * WORD_SIZE; /* use LBBEGIN if available */ rec->data_offset = (data_offset_specified != 0) ? data_offset_specified : data_offset_calculated; data_offset_calculated += rec->disk_length; i_valid_rec++; } } CKI( free_(valid, heaplist) ); return 0; ERRBLKI; } size_t get_ff_disk_length(INTEGER *ihdr) { /* work out disk length in bytes */ /* Input array size (packed field): * First try LBNREC * then if Cray 32-bit packing, know ratio of packed to unpacked lengths; * else use LBLREC */ if (ihdr[INDEX_LBPACK] != 0 && ihdr[INDEX_LBNREC] != 0) return ihdr[INDEX_LBNREC] * WORD_SIZE; if (ihdr[INDEX_LBPACK] % 10 == 2) return get_num_data_words(ihdr) * 4; return ihdr[INDEX_LBLREC] * WORD_SIZE; } /* * check which PP records are valid; populate an array provided by the caller with 1s and 0s * and also provide the total count */ int get_valid_records_ff(int fd, Byte_ordering byte_ordering, size_t hdr_start, size_t hdr_size, int n_raw_rec, int valid[], int *n_valid_rec_return) { int n_valid_rec, irec; INTEGER lbbegin; n_valid_rec = 0; for (irec = 0; irec < n_raw_rec; irec++) { valid[irec] = 0; CKI( lseek(fd, hdr_start + irec * hdr_size + INDEX_LBBEGIN * WORD_SIZE, SEEK_SET) ); READ_ITEM(lbbegin); if (lbbegin != -99) { /* valid record */ valid[irec] = 1; n_valid_rec++; } else valid[irec] = 0; } *n_valid_rec_return = n_valid_rec; return 0; ERRBLKI; } int read_record_data_core(int fd, size_t data_offset, size_t disk_length, Byte_ordering byte_ordering, const void *int_hdr, const void *real_hdr, size_t nwords, void *data_return) { int pack; size_t packed_bytes, ipt, packed_words; void *packed_data; REAL mdi; packed_data = NULL; CKI( lseek(fd, data_offset, SEEK_SET) ); pack = get_var_packing(int_hdr); if (pack == 0) { /* unpacked data -- read, and byte swap if necessary */ ERRIF( read_words(fd, data_return, nwords, byte_ordering) != nwords); } else { /* PACKING IN USE */ /* Complain if not REAL data. In cdunifpp, this test was applied only to Cray 32-bit packing, * but in fact also unwgdos assumes real, so apply to both packing types. */ if (get_type(int_hdr) != real_type) { error_mesg("Unpacking supported only for REAL type data"); ERR; } /* first allocate array and read in packed data */ /* disk_length includes extra data, so subtract off */ packed_bytes = disk_length - get_extra_data_length(int_hdr); /* ---------------------------- * Possible alternative envisaged, that reads in slightly more data to * give tolerance against any situation where LBNREC does not include * the extra data. However, this is now of dubious gain because reading in * the extra data requires LBNREC to be used consistently so that the extra * data can be found at the end of the record where the packed data that precedes * it is of variable length. * * packed_bytes = disk_length; *----------------------------- */ /* An exception to the usual strategy heap memory management: no heaplist available, so use plain malloc * and be careful to free even if an error arose. * * (This is fairly much unavoidable: heaplist is attached to a File struct, but these exist only while * parsing the file metadata, not while the read callback is executed. A Python File object will exist * in the calling code, but that's not the same thing: it may have been instantiated with parse=False; * see the Python code.) */ CKP( packed_data = malloc(packed_bytes) ); ERRIF( read(fd, packed_data, packed_bytes) != packed_bytes ); /* NOW UNPACK ACCORDING TO PACKING TYPE (including byte swapping where necessary). */ switch(pack) { case 1: /* WGDOS */ /* unwgdos routine wants to know number of native integers in input. * input type might not be native int, so calculate: */ mdi = get_var_real_fill_value(real_hdr); /* Note - even though we read in raw (unswapped) data from the file, we do not * byte swap prior to calling unwgdos, as the packed data contains a mixture * of types of different lengths, so leave it to unwgdos() that knows about * this and has appropriate byte swapping code. */ CKI( unwgdos(packed_data, packed_bytes, data_return, nwords, mdi) ); break; case 2: if (byte_ordering == REVERSE_ORDERING) swap_bytes_sgl(packed_data, packed_bytes / 4); for (ipt = 0; ipt < nwords ; ipt++) ((REAL*) data_return)[ipt] = ((float32_t *) packed_data)[ipt]; break; case 3: error_mesg("GRIB unpacking not supported"); ERR; /* break; */ case 4: packed_words = packed_bytes / WORD_SIZE; if (byte_ordering == REVERSE_ORDERING) swap_bytes(packed_data, packed_words); mdi = get_var_real_fill_value(real_hdr); CKI( unpack_run_length_encoded(packed_data, packed_words, data_return, nwords, mdi) ); break; default: SWITCH_BUG; } free(packed_data); } return 0; err: GRIPE; if (packed_data != NULL) free(packed_data); return -1; } int unpack_run_length_encoded(REAL *datain, INTEGER nin, REAL *dataout, INTEGER nout, REAL mdi) { REAL *src, *dest, *end_src, *end_dest, data; INTEGER repeat; /* some pointers: * src and dest are current positions; * end_src and end_dest are the first position off the end of each array */ src = datain; dest = dataout; end_src = src + nin; end_dest = dest + nout; /* syntax reminder: *p++ means first dereference p and then increment p */ while (src < end_src && dest < end_dest) { data = *src++; if (data != mdi) *dest++ = data; else { /* check we didn't read the MDI as the last item in the input */ ERRIF(src == end_src); /* read in next word, round to nearest integer, and output MDI that many times * while checking we don't go beyond end of output data array */ for (repeat = (INTEGER)(0.5 + *src++); repeat > 0 && dest < end_dest; repeat--) *dest++ = mdi; /* check we didn't reach end of output data array with copies of the MDI still to write * (or read in a negative repeat count) */ ERRIF(repeat != 0); } } /* check we reached end of output data, * (not necessarily end of input data - it could be padded) */ ERRIF (dest != end_dest); return 0; ERRBLKI; } cf-python-1.3.2/cf/um/umread/c-lib/type-dep/unwgdos.c0000600000175000017500000002352712603546021022461 0ustar daviddavid00000000000000 /* * Modified version of unwgdos to remove the dependence on all the Cray * utilities, most of which were irrelevant (although some needed functions * have been added below and it also calls byte-swapping code in swap.c). * It is for use on machines with native IEEE integer types. * * Note API change compared to version taken from xconv: datain is void* and * second argument is number of bytes (not ints) */ /* unwgdos.c is unpack.c file from xconv but with GRIB stuff stripped out */ #include #include #include #include #include "umfileint.h" #include "stdlib.h" #define TRUE 1 #define FALSE 0 static int xpnd(int, int32_t *, REAL *, REAL, int, REAL, int, REAL); static int extrin(int32_t *, int, int, int, int *, int); static int bit_test(void *, int); static void move_bits(void *, int, int, void *); static float32_t get_float32(void *); static int16_t get_int16(void *, Byte_ordering); static int32_t get_int32(void *, Byte_ordering); int unwgdos(void *datain, int nbytes, REAL *dataout, int nout, REAL mdi) { int /* len, */ isc, ix, iy; REAL prec, base; int icx, j; int ibit, nop; int swap; char *p, *p1; /* Determine if data needs byte swapping */ p = datain; swap = -1; ix = get_int16(p + 8, big_endian); iy = get_int16(p + 10, big_endian); if (ix*iy == nout) swap = 0; if (swap == -1) { /* see if data is byte swapped with 4 byte words */ ix = get_int16(p + 10, little_endian); iy = get_int16(p + 8, little_endian); if (ix*iy == nout) swap = 4; } if (swap == -1) { /* see if data is byte swapped with 8 byte words */ ix = get_int16(p + 14, little_endian); iy = get_int16(p + 12, little_endian); if (ix*iy == nout) swap = 8; } if (swap == -1) { error_mesg("WGDOS data header record mismatch "); return 1; } else if (swap == 4) { swap_bytes_sgl(datain, nbytes / 4); } else if (swap == 8) { swap_bytes_dbl(datain, nbytes / 8); } /* Below only works for 32 bit integers, therefore there must be a 32 bit integer type */ /* Extract scale factor and number of columns and rows from header */ isc = get_int32(p + 4, big_endian); ix = get_int16(p + 8, big_endian); iy = get_int16(p + 10, big_endian); /* Expand compressed data */ prec = pow(2.0, (double) isc); icx = 3; for (j=0; j= 128) { btzer = TRUE; btmap = TRUE; ibit -= 128; } /* check if bitmap used for minimum values */ if (ibit >= 64) { btmin = TRUE; btmap = TRUE; ibit -= 64; } /* check if bitmap used for missing data values */ if (ibit >= 32) { btmis = TRUE; btmap = TRUE; ibit -= 32; } if (ibit > 32) { error_mesg("Number of bits used to pack wgdos data = %d must be <= 32 ", ibit); return 1; } if (btmap) { if ( (imap = malloc (ix*sizeof(int))) == NULL ) { error_mesg("Error unable to allocate memory for imap in xpnd ix = %d ", ix); return 1; } for (j=0; j 0) jbit--; else { jbit = 31; jword++; } } } /* Extract minimum value bitmap */ if (btmin) { if ( (imin = malloc (ix*sizeof(int))) == NULL ) { error_mesg("Error unable to allocate memory for imin in xpnd ix = %d ", ix); return 1; } for (j=0; j 0) jbit--; else { jbit = 31; jword++; } } } /* Extract zero value bitmap */ if (btzer) { if ( (izer = malloc (ix*sizeof(int))) == NULL ) { error_mesg("Error unable to allocate memory for izer in xpnd ix = %d ", ix); return 1; } for (j=0; j 0) jbit--; else { jbit = 31; jword++; } } } /* If bitmap used reset pointers to beginning of 32 bit boundary */ if (btmap && jbit != 31) { jbit = 31; jword++; } if (ibit > 0) { /* Unpack scaled values */ for (j=0; j> ibit) & ~(~0 << 1); if (i == 1) return TRUE; else return FALSE; } /* * Move nbits from 32 bit word1 starting at start1 into 32 bit word2. * 0 =< nbits <= 32, bits can cross into word1+1. */ static void move_bits(void *word1, int start1, int nbits, void *word2) { uint32_t *ui1, *ui2, temp1, temp2; ui1 = (uint32_t *) word1; ui2 = (uint32_t *) word2; if (start1+1-nbits >= 0) { /* move bits within one word */ ui2[0] = (ui1[0] >> (start1+1-nbits)) & ~(~0 << nbits); } else { /* move bits within two words */ temp1 = (ui1[0] << (nbits-start1-1)) & ~(~0 << nbits); temp2 = (ui1[1] >> (32+start1+1-nbits)) & ~(~0 << (nbits-start1-1)); ui2[0] = temp1 | temp2; } } #define I32_INFP 0x7f800000 #define I32_INFN 0xff800000 #define I32_ZEROP 0x00000000 #define I32_ZERON 0x80000000 /* based on ibmr4_to_r4 */ static float32_t get_float32(void *in) { unsigned char *pin; unsigned long man; int exp, sign; double d; uint32_t i32; pin = (unsigned char *) in; sign = pin[0] & 0x80; exp = pin[0] & 0x7f; man = ((unsigned long) pin[1] << 16) | ((unsigned long) pin[2] << 8) | (unsigned long) pin[3]; d = ldexp((double) man ,4*(exp-64-6)); if (d > (double) FLT_MAX || errno == ERANGE) { i32 = (sign ? I32_INFN : I32_INFP); return *(float32_t *) &i32; } else if (d < (double) FLT_MIN) { i32 = (sign ? I32_ZERON : I32_ZEROP); return *(float32_t *) &i32; } else return (sign ? -d : d); } /* functions to get data values that are stored starting at a specified * pointer with the specified byte ordering; if they are in native byte * ordering then just copy them, otherwise byte-swap them */ static int16_t get_int16(void *start, Byte_ordering byte_ordering) { if (byte_ordering == NATIVE_ORDERING) { return *(int16_t *) start; } else { char *in, out[2]; in = (char *) start; out[0] = in[1]; out[1] = in[0]; return *(int16_t *) out; } } static int32_t get_int32(void *start, Byte_ordering byte_ordering) { if (byte_ordering == NATIVE_ORDERING) { return *(int32_t *) start; } else { char *in, out[4]; in = (char *) start; out[0] = in[3]; out[1] = in[2]; out[2] = in[1]; out[3] = in[0]; return *(int32_t *) out; } } cf-python-1.3.2/cf/um/umread/c-lib/type-dep/axes.c0000600000175000017500000000350312603546021021723 0ustar daviddavid00000000000000#include #include "umfileint.h" /* * Functions relating to time and z axes. * * These functions have very similar content for Z and T axes, because in fact * the Z_axis and T_axis struct each only contains a list of values. In cdunifpp, * there are other elements (e.g. a time axis origin) that are used when comparing * axes (maybe unnecessarily). In umread, we do not even bother to compare axes * because axes are not returned to the caller: they are just used to evaluate the * shape of the variable (nz, nt) and ensure that it is regular. */ T_axis *new_t_axis(List *heaplist) { T_axis *t_axis; CKP( t_axis = malloc_(sizeof(T_axis), heaplist) ); t_axis->values = list_new(heaplist); return t_axis; ERRBLKP; } int free_t_axis(T_axis *t_axis, List *heaplist) { CKI( list_free(t_axis->values, 1, heaplist) ); CKI( free_(t_axis, heaplist) ); return 0; ERRBLKI; } Z_axis *new_z_axis(List *heaplist) { Z_axis *z_axis; CKP( z_axis = malloc_(sizeof(Z_axis), heaplist) ); z_axis->values = list_new(heaplist); return z_axis; ERRBLKP; } int free_z_axis(Z_axis *z_axis, List *heaplist) { CKI( list_free(z_axis->values, 1, heaplist) ); CKI( free_(z_axis, heaplist) ); return 0; ERRBLKI; } int t_axis_add(T_axis *t_axis, const Time *time, int *index_return, List *heaplist) { Time *timecopy; CKP( timecopy = dup_(time, sizeof(Time), heaplist) ); return list_add_or_find(t_axis->values, &timecopy, compare_times, 0, free_, index_return, heaplist); ERRBLKI; } int z_axis_add(Z_axis *z_axis, const Level *lev, int *index_return, List *heaplist) { Level *levcopy; CKP( levcopy = dup_(lev, sizeof(Level), heaplist) ); return list_add_or_find(z_axis->values, &levcopy, compare_levels, 0, free_, index_return, heaplist); ERRBLKI; } cf-python-1.3.2/cf/um/umread/c-lib/type-dep/interpret_header.c0000600000175000017500000000657612603546021024324 0ustar daviddavid00000000000000#include "umfileint.h" Data_type get_type(const INTEGER *int_hdr) { switch (int_hdr[INDEX_LBUSER1]) { case(2): case(-2): case(3): case(-3): return int_type; /* break; */ case(1): case(-1): return real_type; /* break; */ default: error_mesg("Warning: datatype %d not recognised, assuming real", int_hdr[INDEX_LBUSER1]); return real_type; } } /* Get number of data words. Does not include extra data. */ size_t get_num_data_words(const INTEGER *int_hdr) { if (int_hdr[INDEX_LBPACK] != 0 && int_hdr[INDEX_LBROW] > 0 && int_hdr[INDEX_LBNPT] > 0) /* if packed and horizontal grid sizes set, use them */ return int_hdr[INDEX_LBROW] * int_hdr[INDEX_LBNPT]; else /* otherwise use LBLREC */ return int_hdr[INDEX_LBLREC] - get_extra_data_length(int_hdr) / WORD_SIZE; } /* get length of (any) extra data in bytes */ size_t get_extra_data_length(const INTEGER *int_hdr) { if (int_hdr[INDEX_LBEXT] > 0) return int_hdr[INDEX_LBEXT] * WORD_SIZE; return 0; } size_t get_extra_data_offset_and_length_core(const INTEGER *int_hdr, size_t data_offset, size_t disk_length, size_t *extra_data_offset_rtn, size_t *extra_data_length_rtn) { size_t extra_data_length; extra_data_length = get_extra_data_length(int_hdr); *extra_data_length_rtn = extra_data_length; /* If data is packed, the only way of telling where the extra data is * is to assume that it is at the very end of data_length. * * If data is not packed, then can use data_length to work out where the * extra data starts, allowing resilience against the possibility that * disk_length might include some possible padding */ if (int_hdr[INDEX_LBPACK] != 0) *extra_data_offset_rtn = data_offset + disk_length - extra_data_length; else *extra_data_offset_rtn = data_offset + get_num_data_words(int_hdr) * WORD_SIZE; return 0; } int get_type_and_num_words_core(const INTEGER *int_hdr, Data_type *type_rtn, size_t *num_words_rtn) { *type_rtn = get_type(int_hdr); *num_words_rtn = get_num_data_words(int_hdr); return 0; } /* sometimes a variable is included but which has some * really essential header elements to missing data flag, * so the variable is essentially missing in that any * attempt to process the variable is only going to * lead to errors * * pp_var_missing() tests for this. * * FIXME: expand to test other header elements */ int var_is_missing(const INTEGER *int_hdr) { if (int_hdr[INDEX_LBNPT] == INT_MISSING_DATA) return 1; if (int_hdr[INDEX_LBROW] == INT_MISSING_DATA) return 1; return 0; } int get_var_stash_model(const INTEGER *int_hdr) { return int_hdr[INDEX_LBUSER7]; } int get_var_stash_section(const INTEGER *int_hdr) { return int_hdr[INDEX_LBUSER4] / 1000; } int get_var_stash_item(const INTEGER *int_hdr) { return int_hdr[INDEX_LBUSER4] % 1000; } int get_var_compression(const INTEGER *int_hdr) { return (int_hdr[INDEX_LBPACK] / 10) % 10; } int get_var_gridcode(const INTEGER *int_hdr) { return int_hdr[INDEX_LBCODE]; } int get_var_packing(const INTEGER *int_hdr) { return int_hdr[INDEX_LBPACK] % 10; } /* get the fill value from the floating point header. * caller needs to check that it is actually floating point data! */ REAL get_var_real_fill_value(const REAL *real_hdr) { return real_hdr[INDEX_BMDI]; } cf-python-1.3.2/cf/um/umread/c-lib/type-dep/umfile_test_typedep.c0000600000175000017500000000715512603546021025044 0ustar daviddavid00000000000000/* datatype dependent parts of the test code */ #include #include #include #include #include "umfileint.h" //Rec *rec_alloc() //{ // Rec *rec; // rec = xmalloc(sizeof(Rec)); // rec->internp = xmalloc(sizeof(struct _Rec)); // rec->int_hdr = xmalloc(45 * sizeof(INTEGER)); // rec->real_hdr = xmalloc(19 * sizeof(REAL)); // return rec; //} // //void rec_free(Rec *rec) //{ // _rec_internals_free(rec); // { // INTEGER *ihdr = rec->int_hdr; // REAL *rhdr = rec->real_hdr; // printf("freeing rec with ihdr=%d %d... rhdr=%f %f...\n", // ihdr[0], ihdr[1], rhdr[0], rhdr[1]); // } // xfree(rec->int_hdr); // xfree(rec->real_hdr); // xfree(rec); //} // // //Rec *rec_create_dummy(int k) //{ // int i; // Rec *rec; // rec = rec_alloc(); // for (i = 0; i < 45 ; i++) // ((INTEGER *)rec->int_hdr)[i] = k * 100 + i; // for (i = 0; i < 19 ; i++) // ((REAL *)rec->real_hdr)[i] = k + i / 100.; // rec->header_offset = k; // rec->data_offset = 500 + k; // rec->internp->blahblah = 200 + k; // return rec; //} // //int get_type_and_length_dummy(const void *int_hdr, Data_type *type_rtn, size_t *num_words_rtn) //{ // const INTEGER *int_hdr_4 = int_hdr; // *num_words_rtn = int_hdr_4[0]; // *type_rtn = real_type; // return 0; //} // void read_record_data_dummy(size_t nwords, void *data_return) { int i; REAL *data_return_4 = data_return; for (i = 0; i < nwords; i++) { data_return_4[i] = i / 100.; } } // int read_record_data_core(int fd, // size_t data_offset, // size_t disk_length, // Byte_ordering byte_ordering, // int word_size, // const void *int_hdr, // const void *real_hdr, // size_t nwords, // void *data_return) // { // int i; // assert(byte_ordering == little_endian); // assert(word_size == 4); // // printf("start of int header seen in read_record_data_dummy():"); // for (i = 0; i < 5; i++) // printf(" %d", ((INTEGER *) int_hdr)[i]); // printf("\n"); // printf("start of real header seen in read_record_data_dummy():"); // for (i = 0; i < 5; i++) // printf(" %f", ((REAL *) real_hdr)[i]); // printf("\n"); // // read_record_data_dummy(nwords, data_return); // return 0; // } // #ifdef MAIN int main() { int i, j, k, nrec; int fd; File *file; File_type file_type; Var *var; Rec *rec; REAL *data; int word_size; Data_type data_type; size_t nwords, nbytes; fd = 3; detect_file_type(fd, &file_type); printf("word size = %d\n", file_type.word_size); file = file_parse(fd, file_type); for (i = 0; i < file->nvars; i++) { printf("var %d\n", i); var = file->vars[i]; printf("nz = %d, nt = %d\n", var->nz, var->nt); nrec = var->nz * var->nt; for (j = 0; j < nrec; j++) { rec = var->recs[j]; printf("var %d rec %d\n", i, j); printf("int header:\n"); for (k = 0; k < 45; k++) printf(" ihdr[%d] = %d\n", k, ((INTEGER *)rec->int_hdr)[k]); printf("real header:\n"); for (k = 0; k < 19; k++) printf(" rhdr[%d] = %f\n", k, ((REAL *)rec->real_hdr)[k]); word_size = file_type.word_size; get_type_and_length(word_size, rec->int_hdr, &data_type, &nwords); nbytes = word_size * nwords;; printf("data (%ld items)\n", nwords); data = xmalloc(nbytes * sizeof(float)); read_record_data(fd, rec->data_offset, file_type.byte_ordering, file_type.word_size, rec->int_hdr, rec->real_hdr, nwords, data); for (k = 0; k < nwords; k++) printf(" data[%d] = %f\n", k, data[k]); xfree(data); } } return 0; } #endif cf-python-1.3.2/cf/um/umread/c-lib/type-dep/process_vars.c0000600000175000017500000002155212603546021023500 0ustar daviddavid00000000000000#include #include "umfileint.h" File *file_parse_core(int fd, File_type file_type) { File *file; List *heaplist; CKP( file = new_file() ); file->fd = fd; file->file_type = file_type; heaplist = file->internp->heaplist; CKI( read_all_headers(file, heaplist) ); CKI( process_vars(file, heaplist) ); return file; err: if (file) free_file(file); return NULL; } int process_vars(File *file, List *heaplist) { int nrec; Rec **recs; List *vars; nrec = file->internp->nrec; recs = file->internp->recs; /* initialise elements in the records before sorting */ CKI( initialise_records(recs, nrec, heaplist) ); /* sort the records */ qsort(recs, nrec, sizeof(Rec*), compare_records); /* now sort out the list of variables and dimensions */ CKP( vars = list_new(heaplist) ); CKI( get_vars(nrec, recs, vars, heaplist) ); /* move the variables from the linked list to the array */ CKI( list_copy_to_ptr_array(vars, &file->nvars, &file->vars, heaplist) ); CKI( list_free(vars, 0, heaplist) ); return 0; ERRBLKI; } /* * scan records for vars and add all to list */ int get_vars(int nrec, Rec **recs, List *vars, List *heaplist) { int recno; int at_start_rec, at_end_rec = 0; Rec *rec, **vrecs; Z_axis *z_axis; T_axis *t_axis; Var *var; int zindex, tindex; int nvrec; int svindex = 1; var = NULL; z_axis = NULL; t_axis = NULL; for (recno=0; recno < nrec ; recno++) { rec = recs[recno]; /* Some fieldsfiles have header fields with missing values */ if (var_is_missing(rec->int_hdr)) { error_mesg("skipping variable stash code=%d, %d, %d " "because of missing header data", get_var_stash_model(rec->int_hdr), get_var_stash_section(rec->int_hdr), get_var_stash_item(rec->int_hdr)); continue; } /* we are at start record of a variable at the very start, or if at we * were at the end record last time */ at_start_rec = ( recno == 0 || at_end_rec ); /* we are at end record of a variable at the very end, or if the header * shows a difference from the next record which constitutes a different * variable * * We also force end record of a variable if the grid type is not * supported; any such records are passed back as single-record * variables for the caller to deal with. */ at_end_rec = ( recno == nrec - 1 || records_from_different_vars(recs[recno + 1], rec) || !grid_supported(rec->int_hdr)); /* allow for variables which are unsupported for some reason */ if (at_start_rec && test_skip_var(rec)) continue; /* initialise new variable and axes if at first record of a variable */ if (at_start_rec) { CKP( var = new_var(heaplist) ); CKP( z_axis = new_z_axis(heaplist) ); CKP( t_axis = new_t_axis(heaplist) ); var->internp->first_rec_no = recno; var->internp->last_rec_no = -1; var->internp->first_rec = rec; } /* for every record, add the z, t values to the axes */ CKI( z_axis_add(z_axis, rec->internp->lev, &zindex, heaplist) ); rec->internp->zindex = zindex; CKI( t_axis_add(t_axis, rec->internp->time, &tindex, heaplist) ); rec->internp->tindex = tindex; if (at_end_rec) { var->internp->last_rec_no = recno; nvrec = var->internp->last_rec_no - var->internp->first_rec_no + 1; vrecs = recs + var->internp->first_rec_no; /* now if the axes are not regular, free the axes, split the variable * into a number of variables and try again... */ if (set_disambig_index(z_axis, t_axis, vrecs, nvrec, svindex)) { /* increment the supervar index, used later to show the connection * between the separate variables into which this one will be split */ svindex++; /* now re-sort this part of the record list, * now that we have set the disambig index */ qsort(vrecs, nvrec, sizeof(Rec *), compare_records); /* now go back to the start record of the variable; set to one less * because it will get incremented in the "for" loop reinitialisation */ recno = var->internp->first_rec_no - 1; /* and free the stuff associated with the var we won't be using */ CKI( free_z_axis(z_axis, heaplist) ); CKI( free_t_axis(t_axis, heaplist) ); CKI( free_var(var, heaplist) ); continue; } /* add the metadata the caller needs */ var->nz = list_size(z_axis->values); var->nt = list_size(t_axis->values); var->recs = &recs[var->internp->first_rec_no]; svindex = var->internp->first_rec->internp->supervar_index; if (svindex >= 0) var->supervar_index = svindex; /* add the variable */ CKI( list_add(vars, var, heaplist) ); /* don't need the axes any more */ CKI( free_z_axis(z_axis, heaplist) ); CKI( free_t_axis(t_axis, heaplist) ); } } return 0; ERRBLKI; } int test_skip_var(const Rec *rec) { char *skip_reason; INTEGER *int_hdr; int_hdr = rec->int_hdr; skip_reason = NULL; if (var_is_missing(int_hdr)) skip_reason = "PP record has essential header data set to missing data value"; /* Compressed field index */ if (get_var_compression(int_hdr) == 1) skip_reason = "compressed field index not supported"; /* remove grid_supported test - now used to split up variables, not to * exclude them. * * if (grid_supported(int_hdr) == 0) * skip_reason = "grid code not supported"; */ /* ADD ANY MORE VARIABLE SKIPPING CASES HERE. */ if (skip_reason != NULL) { error_mesg("skipping variable stash code=%d, %d, %d because: %s", get_var_stash_model(int_hdr), get_var_stash_section(int_hdr), get_var_stash_item(int_hdr), skip_reason); return 1; } return 0; } int initialise_records(Rec **recs, int nrec, List *heaplist) { int recno; Rec *rec; for (recno = 0; recno < nrec ; recno++) { rec = recs[recno]; rec->internp = rec->internp; rec->internp->disambig_index = -1; rec->internp->supervar_index = -1; /* store level info */ CKP( rec->internp->lev = malloc_(sizeof(Level), heaplist) ); CKI( lev_set(rec->internp->lev, rec) ); /* store time info */ CKP( rec->internp->time = malloc_(sizeof(Time), heaplist) ); CKI( time_set(rec->internp->time, rec) ); rec->internp->mean_period = mean_period(rec->internp->time); } return 0; ERRBLKI; } /* * set the disambig index on all records within a super-variable */ int set_disambig_index(Z_axis *z_axis, T_axis *t_axis, Rec **recs, int nvrec, int svindex) { int var_rec_no; Rec *vrec; int zindex, tindex, dindex; int prev_zindex, prev_tindex, prev_dindex; prev_zindex = prev_tindex = prev_dindex = 0; /* do nothing if axes are regular */ if (var_has_regular_z_t(z_axis, t_axis, recs, nvrec)) return 0; for (var_rec_no=0; var_rec_no < nvrec; var_rec_no++) { vrec = recs[var_rec_no]; zindex = vrec->internp->zindex; tindex = vrec->internp->tindex; /* check for dups coord pairs */ /* the exact expressions for dindex are fairly arbitrary -- just need to * ensure that indices for dup coordinate pairs will be different from * indices for non-dups on other levels */ if (var_rec_no > 0 && zindex == prev_zindex && tindex == prev_tindex) dindex = prev_dindex + 1; else dindex = zindex * nvrec; vrec->internp->disambig_index = dindex; if (vrec->internp->supervar_index < 0) vrec->internp->supervar_index = svindex; /* save vals for next iter */ prev_zindex = zindex; prev_tindex = tindex; prev_dindex = dindex; } return 1; } int grid_supported(INTEGER *int_hdr) { int gridcode; gridcode = get_var_gridcode(int_hdr); switch(gridcode) { case 1: case 101: case 11110: return 1; default: return 0; } } /* routine to test t and z indices to check whether the variable is on regular * array of times and levels (NB "regular" here refers to the ordering, not to * whether the spacing is uniform) */ int var_has_regular_z_t(Z_axis *z_axis, T_axis *t_axis, Rec **recs, int nvrec) { int var_rec_no, nz, nt; /* needed for check on variables */ Rec *rec; nz = list_size(z_axis->values); nt = list_size(t_axis->values); /*------------------------------------------------------------*/ /* first test the most obvious case of irregular (for possible speed) */ if (nvrec != nz * nt) return 0; /* z indices (faster varying) should loop be vrec % nz */ /* t indices (slower varying) should loop be vrec / nz */ for (var_rec_no=0; var_rec_no < nvrec; var_rec_no++) { rec = recs[var_rec_no]; if (rec->internp->zindex != var_rec_no % nz || rec->internp->tindex != var_rec_no / nz) return 0; } return 1; } cf-python-1.3.2/cf/um/umread/c-lib/umfile.h0000600000175000017500000001233012603546021020520 0ustar daviddavid00000000000000/* * ============================================================== * Header file only for stuff intended to be called directly from * python. Everything else should be in umfileint.h. * ============================================================== */ #include typedef enum { plain_pp, fields_file } File_format; typedef enum { little_endian, big_endian } Byte_ordering; typedef enum { int_type, real_type } Data_type; /* ---------------- * Placeholders for internal structures to be defined in umfileint.h * Here just need to predeclare them so that we can have pointers to them. */ struct _File; struct _Var; struct _Rec; /* ---------------- */ typedef struct { File_format format; Byte_ordering byte_ordering; int word_size; } File_type ; typedef struct { void *int_hdr; void *real_hdr; size_t header_offset; /* in bytes */ size_t data_offset; /* in bytes */ size_t disk_length; /* in bytes */ struct _Rec *internp; } Rec; typedef struct { Rec **recs; int nz; int nt; int supervar_index; struct _Var *internp; } Var; typedef struct { int fd; File_type file_type; int nvars; Var **vars; struct _File *internp; } File; /* ------------------------------------------------------------------- */ int detect_file_type(int fd, File_type *file_type_rtn); /* Given an open file, detect type of file (caller provides storage for info returned). if detection was successful, returns 0 and populates the File_type structure provided by the caller, otherwise returns 1. */ File *file_parse(int fd, File_type file_type); /* Given an open file handle, parse a file into a File structure, with embedded Var and Rec structures, relating the PP records to variables within the file. Caller should pass a File_type structure as either returned from detect_file_type() or populated by the caller. */ /* commented out - to handle in Python */ /* void close_fd(File *file); */ /* int reopen_fd(File *file); */ void file_free(File *file); /* * Free memory associated with a File structure (including anything hung off * the internal pointer) and all variables and records underneath it */ /* ------------------------------------------------------------------- */ /* functions for reading the actual data, not dependent on the above objects * (although may call common code in the implementation) */ int read_header(int fd, size_t header_offset, Byte_ordering byte_ordering, int word_size, void *int_hdr_rtn, void *real_hdr_rtn); /* reads a PP header at specified offset; function will do byte-swapping as necessary, but returned header data will match word size, and caller must provide storage of appropriate length to contain these (45 and 19 words respectively) */ int get_type_and_length(int word_size, const void *int_hdr, Data_type *type_rtn, size_t *num_words_rtn); /* Parses integer PP header, works out number of words and data type. Caller provides integer header as array of 4 or 8 byte ints as appropriate to passed word_size, and provides storage for returned info. Return value is 0 for success, otherwise 1. */ int read_record_data(int fd, size_t data_offset, size_t disk_length, Byte_ordering byte_ordering, int word_size, const void *int_hdr, const void *real_hdr, size_t nwords, void *data_return); /* Reads record data at specified offset; function will do byte-swapping and unpacking as necessary. Caller provides PP headers as arrays of 4 or 8 byte ints and floats/doubles as appropriate to passed word_size (real header needed for missing data value). This must match actual file word size, and there will be no casting of data except as appropriate when unpacking packed fields. Returns in data_return an array of int or float at this word size; caller must provide storage of size nwords words, and nwords must have been obtained by calling get_nwords(). Return value is 0 for success, 1 for failure. */ /* ------------------------------------------------------------------- */ int get_extra_data_offset_and_length(int word_size, const void *int_hdr, size_t data_offset, size_t disk_length, size_t *extra_data_offset_rtn, size_t *extra_data_length_rtn); /* Parses integer PP header in conjunction with data offset and length (where the length includes the extra data), to works out the offset and length of extra data Caller provides integer header as array of 4 or 8 byte ints as appropriate to passed word_size, and provides storage for returned info. Return value is length, or -1 on failure */ int read_extra_data(int fd, size_t extra_data_offset, size_t extra_data_length, Byte_ordering byte_ordering, int word_size, void *extra_data_return); /* Reads extra data at specified offset; function will do byte-swapping as necessary. Returns raw data (aside from the byte swapping) in extra_data_return; caller must provide storage of size extra_data_length * word_size bytes, and extra_data_length must have been obtained by calling get_extra_data_length(). Return value is 0 for success, 1 for failure. */ cf-python-1.3.2/cf/um/umread/c-lib/malloc.c0000600000175000017500000000625712603546021020514 0ustar daviddavid00000000000000#include #include #include "umfileint.h" /* Malloc functions * * These routines are closely integrated with the link list functions; they * are called with a linked list "heaplist"; the malloc_ function adds the * newly allocated pointer to this list, and the free_ function removes it * from the list. (They can also be called with NULL in which case they * ignore the heaplist; this is necessary when allocating or freeing memory * for the heaplist itself.) * * The idea is that all the dynamically memory allocation associated with * a given file should be through these functions. Then whenever the file * is closed properly or because an error condition gave an abort, the * memory can be freed without needing complicated tests to work out what * has been allocated: just go through the linked list freeing pointers. * * NOTE: this routine now allocates a little more memory than requested, * and saves the pointer to the list element on the heaplist at the start, * before returning to the calling routine the pointer to the actual block * of memory that the caller is interested in. This ensures that when freeing * the memory, list_del_by_listel can be used instead of list_del, giving * efficiency gains. */ static const int extrasize = sizeof(List_element*); void *malloc_(size_t size, List *heaplist){ void *ptr; List_element* *elp; if (size == 0) return NULL; /* The only call to malloc in umfile c-lib (except in unwgdos.c and packed_data in read.c) */ ptr = malloc(size + extrasize); if (ptr == NULL) { error_mesg("unable to allocate of %d bytes of memory", size); } else { /* copy the pointer so we can use the start of the address to store * the List_element* */ elp = (List_element**) ptr; /* Now increment the pointer (to after our stored List_element*) to give * what the calling routine calling routine sees the start of memory * (cast to char* for ptr arithmetic. Do this *before* storing it * on the heaplist, because pointers on will be freed with free */ ptr = (void*) ((char*)ptr + extrasize); if (heaplist != NULL) { CKI( list_add(heaplist, ptr, NULL) ); /* we just added to the list, so that heaplist->last will * contain pointer to the relevant List_element* */ *elp = heaplist->last; } else *elp = NULL; } return ptr; ERRBLKP; } void *dup_(const void *inptr, size_t size, List *heaplist) { void *outptr; CKP( outptr = malloc_(size, heaplist) ); memcpy(outptr, inptr, size); return outptr; ERRBLKP; } int free_(void *ptr, List *heaplist) { List_element *el; CKP(ptr); /* first subtract off the extra size we added (see malloc_) */ ptr = (void*) ((char*) ptr - extrasize); /* this is our list element */ el = * (List_element**) ptr; /* The only call to free in umfile c-lib * (except in unwgdos.c and packed_data in read.c) */ free(ptr); /* printf ("free: %p\n",ptr); */ if (heaplist != NULL) CKI( list_del_by_listel(heaplist, el, NULL) ); return 0; ERRBLKI; } int free_all(List *heaplist) { return list_free(heaplist, 1, NULL); } cf-python-1.3.2/cf/um/umread/c-lib/new_structs.c0000600000175000017500000000455712603546021021626 0ustar daviddavid00000000000000#include "umfileint.h" /* functions to create pointers to new structures (such as Rec, Var and File) * from heap memory * * Also for good measure functions to free these, although most are not * crucial if they are not called, because of the garbage collection procedure * employed in free_file() */ Rec *new_rec(int word_size, List *heaplist) { Rec *rec; CKP( rec = malloc_(sizeof(Rec), heaplist) ); CKP( rec->internp = malloc_(sizeof(struct _Rec), heaplist) ); CKP( rec->int_hdr = malloc_(N_INT_HDR * word_size, heaplist) ); CKP( rec->real_hdr = malloc_(N_REAL_HDR * word_size, heaplist) ); rec->header_offset = -1; rec->data_offset = -1; rec->disk_length = -1; return rec; ERRBLKP; } int free_rec(Rec *rec, List *heaplist) { CKI( free_(rec->internp, heaplist) ); CKI( free_(rec->int_hdr, heaplist) ); CKI( free_(rec->real_hdr, heaplist) ); CKI( free_(rec, heaplist) ); return 0; ERRBLKI; } Var *new_var(List *heaplist) { Var *var; CKP( var = malloc_(sizeof(Var), heaplist) ); CKP( var->internp = malloc_(sizeof(struct _Var), heaplist) ); var->nz = 0; var->nt = 0; var->supervar_index = -1; var->recs = NULL; return var; ERRBLKP; } int free_var(Var *var, List *heaplist) { CKI( free_(var->internp, heaplist) ); if (var->recs) CKI( free_(var->recs, heaplist) ); CKI( free_(var, heaplist) ); return 0; ERRBLKI; } /* new_file is a rather special case, because the heaplist is initialised as * part of the structure rather than supplied externally. Also free_file will * free everything on the heaplist. */ File *new_file() { File *file; if ( (file = malloc_(sizeof(File), NULL)) == NULL) goto err1; if ( (file->internp = malloc_(sizeof(struct _File), NULL)) == NULL) goto err2; if ( (file->internp->heaplist = list_new(NULL)) == NULL) goto err3; file->nvars = 0; file->vars = NULL; file->fd = -1; file->file_type.format = -1; file->file_type.byte_ordering = -1; file->file_type.word_size = -1; file->internp->nrec = 0; file->internp->recs = NULL; return file; err3: free_(file->internp, NULL); err2: free_(file, NULL); err1: GRIPE; return NULL; } int free_file(File *file) { CKI( free_all(file->internp->heaplist) ); CKI( free_(file->internp, NULL) ); CKI( free_(file, NULL) ); return 0; ERRBLKI; } cf-python-1.3.2/cf/um/umread/c-lib/bits/0000755000175000017500000000000012770523315020046 5ustar daviddavid00000000000000cf-python-1.3.2/cf/um/umread/c-lib/bits/type_dep_protos.h0000600000175000017500000000710512603546021023423 0ustar daviddavid00000000000000/* interpret_header.c */ Data_type get_type(const INTEGER *int_hdr); size_t get_num_data_words (const INTEGER *int_hdr); size_t get_extra_data_length(const INTEGER *int_hdr); int var_is_missing(const INTEGER *int_hdr); int get_var_stash_model(const INTEGER *int_hdr); int get_var_stash_section(const INTEGER *int_hdr); int get_var_stash_item(const INTEGER *int_hdr); int get_var_compression(const INTEGER *int_hdr); int get_var_gridcode(const INTEGER *int_hdr); int get_var_packing(const INTEGER *int_hdr); REAL get_var_real_fill_value(const REAL *int_hdr); /* read.c */ size_t read_words(int fd, void *ptr, size_t num_words, Byte_ordering byte_ordering); int read_extra_data_at_offset(int fd, size_t extra_data_offset, size_t extra_data_length, Byte_ordering byte_ordering, void *extra_data_rtn); int read_hdr(int fd, Byte_ordering byte_ordering, INTEGER *int_hdr_rtn, REAL *real_hdr_rtn); Rec *get_record(File *file, List *heaplist); int read_all_headers(File *file, List *heaplist); size_t skip_fortran_record(File *file); int skip_word(File *file); int read_all_headers_pp(File *file, List *heaplist); int read_all_headers_ff(File *file, List *heaplist); size_t get_ff_disk_length(INTEGER *ihdr); int get_valid_records_ff(int fd, Byte_ordering byte_ordering, size_t hdr_start, size_t hdr_size, int nrec, int valid[], int *n_valid_rec_return); int unpack_run_length_encoded(REAL *datain, INTEGER nin, REAL *dataout, INTEGER nout, REAL mdi); /* process_vars.c */ int process_vars(File *file, List *heaplist); int test_skip_var(const Rec *rec); int initialise_records(Rec **recs, int nrec, List *heaplist); int get_vars(int nrec, Rec **recs, List *vars, List *heaplist); int set_disambig_index(Z_axis *z_axis, T_axis *t_axis, Rec **recs, int nvrec, int svindex); int add_axes_to_var(Var *var, Z_axis *z_axis, T_axis *t_axis, List *z_axes, List *t_axes, List *heaplist); int grid_supported(INTEGER *int_hdr); int var_has_regular_z_t(Z_axis *z_axis, T_axis *t_axis, Rec **recs, int nvrec); /* level.c */ int lev_set(Level *lev, const Rec *rec); Lev_type level_type(const Rec *rec); /* date_and_time.c */ REAL mean_period(const Time *time); int is_time_mean(INTEGER LBTIM); REAL time_diff(INTEGER lbtim, const Date *date, const Date *orig_date); REAL sec_to_day(int64_t seconds); Calendar_type calendar_type(INTEGER type); int64_t gregorian_to_secs(const Date *date); int time_set(Time *time, const Rec *rec); /* axes.c */ Z_axis *new_z_axis(List *heaplist); int free_z_axis(Z_axis *z_axis, List *heaplist); T_axis *new_t_axis(List *heaplist); int free_t_axis(T_axis *t_axis, List *heaplist); int t_axis_add(T_axis *t_axis, const Time *time, int *index_return, List *heaplist); int z_axis_add(Z_axis *z_axis, const Level *lev, int *index_return, List *heaplist); /* compare.c */ int compare_records_between_vars(const Rec *a, const Rec *b); int compare_mean_periods(const Rec *a, const Rec *b); int compare_records_within_var(const Rec *a, const Rec *b); int compare_records(const void *p1, const void *p2); int records_from_different_vars(const Rec *a, const Rec *b); int compare_lists(const List *l1, const List *l2, int (*compfunc)(const void*, const void*)); int compare_levels(const void *p1, const void *p2); int compare_times(const void *p1, const void *p2); int compare_dates(const Date *a, const Date *b); /* unwgdos.c */ int unwgdos(void *datain, int nbytes, REAL *dataout, int nout, REAL mdi); /* Debug_dump.c */ void debug_dump_all_headers(File *file); #ifdef MAIN int main(); #endif cf-python-1.3.2/cf/um/umread/c-lib/bits/datatype.h0000600000175000017500000000041612603546021022015 0ustar daviddavid00000000000000#if defined(DOUBLE) #define REAL float64_t #define INTEGER int64_t #define COMPILED_TYPE (double_precision) #define WORD_SIZE 8 #elif defined(SINGLE) #define REAL float32_t #define INTEGER int32_t #define COMPILED_TYPE (single_precision) #define WORD_SIZE 4 #endif cf-python-1.3.2/cf/um/umread/c-lib/bits/typedefs.h0000600000175000017500000000643012603546021022027 0ustar daviddavid00000000000000#include typedef float float32_t; typedef double float64_t; enum { single_precision, double_precision }; /*---------------------------*/ /* for linked list */ struct _list_element { void *ptr; struct _list_element *prev; struct _list_element *next; }; typedef struct _list_element List_element; typedef struct { int n; List_element *first; List_element *last; } List; typedef struct { /* This is a little structure which stores the information needed for * pp_list_walk. Its main purpose is to store the position outside the list * structure itself, so that for read-only scanning of the list, the PPlist* * can be declared as const. */ List_element *current; const List *list; } List_handle; /*---------------------------*/ typedef enum { pseudo_lev_type, height_lev_type, depth_lev_type, hybrid_sigmap_lev_type, hybrid_height_lev_type, pressure_lev_type, soil_lev_type, boundary_layer_top_lev_type, top_of_atmos_lev_type, mean_sea_lev_type, surface_lev_type, tropopause_lev_type, other_lev_type } Lev_type; typedef enum { gregorian, cal360day, model } Calendar_type; typedef enum { lev_type, hybrid_sigmap_a_type, hybrid_sigmap_b_type, hybrid_height_a_type, hybrid_height_b_type } Lev_val_type; #if defined(INTEGER) typedef struct { INTEGER year; INTEGER month; INTEGER day; INTEGER hour; INTEGER minute; INTEGER second; } Date; typedef struct { /* this is a value on time axis */ INTEGER type; Date time1; Date time2; } Time; typedef struct { List *values; } T_axis; typedef struct { Lev_type type; union { struct { REAL level; #ifdef BDY_LEVS REAL ubdy_level; REAL lbdy_level; #endif } misc; struct { REAL a; REAL b; #ifdef BDY_LEVS REAL ubdy_a; REAL ubdy_b; REAL lbdy_a; REAL lbdy_b; #endif } hybrid_sigmap; struct { REAL a; REAL b; #ifdef BDY_LEVS REAL ubdy_a; REAL ubdy_b; REAL lbdy_a; REAL lbdy_b; #endif } hybrid_height; struct { INTEGER index; } pseudo; } values; } Level; typedef struct { List *values; } Z_axis; #else typedef void Z_axis; typedef void T_axis; typedef void Time; typedef void Level; #endif /*---------------------------*/ struct _File { List *heaplist; int nrec; Rec **recs; }; struct _Var { Z_axis *z_axis; T_axis *t_axis; Rec *first_rec; int first_rec_no; int last_rec_no; }; struct _Rec { Level *lev; Time *time; int zindex; /* index on z axis within a variable - used for detecting vars with irreg z,t */ int tindex; /* index on t axis within a variable - used for detecting vars with irreg z,t */ int disambig_index; /* index used for splitting variables with irreg z,t into * sets of variables with regular z,t */ int supervar_index; /* when a variable is split, this is set to an index which is common * across the set, but different from sets generated from other * super-variables */ float64_t mean_period; /* period (in days) of time mean (store here so as to calculate once only) */ }; /*---------------------------*/ cf-python-1.3.2/cf/um/umread/c-lib/bits/ordering.h0000600000175000017500000000043312603546021022012 0ustar daviddavid00000000000000#include #if BYTE_ORDER == LITTLE_ENDIAN #define NATIVE_ORDERING little_endian #define REVERSE_ORDERING big_endian #elif BYTE_ORDER == BIG_ENDIAN #define NATIVE_ORDERING big_endian #define REVERSE_ORDERING little_endian #else #error BYTE_ORDER not defined properly #endif cf-python-1.3.2/cf/um/umread/c-lib/bits/type_indep_protos.h0000600000175000017500000000360012603546021023746 0ustar daviddavid00000000000000/* PROTOTYPES */ /* error.c */ void switch_bug(const char *routine); void gripe(const char *routine); void error_mesg(const char *fmt, ...); void debug(const char *fmt, ...); void errorhandle_init(); /* malloc.c */ void *malloc_(size_t size, List *heaplist); void *dup_(const void *inptr, size_t size, List *heaplist); int free_(void *ptr, List *heaplist); int free_all(List *heaplist); /* swap.c */ /* NB the _sgl and _dbl functions are explicitly coded, hence not handled by type_dep * (reason: even in the DOUBLE case, we need swap_bytes_sgl available for 32-bit packed data) */ void swap_bytes_sgl(void *ptr, size_t num_words); void swap_bytes_dbl(void *ptr, size_t num_words); /* linklist.c */ typedef int(*free_func) (void *, List *); void *list_new(List *heaplist); int list_free(List *list, int free_ptrs, List *heaplist); int list_size(const List *list); int list_add(List *list, void *ptr, List *heaplist); int list_add_or_find(List *list, void *item_in, int (*compar)(const void *, const void *), int matchval, free_func free_function, int *index_return, List *heaplist); int list_del(List *list, void *ptr, List *heaplist); int list_del_by_listel(List *list, List_element *p, List *heaplist); int list_startwalk(const List *list, List_handle *handle); void *list_walk(List_handle *handle, int return_listel); void *list_find(List *list, const void *item, int (*compar)(const void *, const void *), int matchval, int *index_return); int list_copy_to_ptr_array(const List *list, int *n_return, void *ptr_array_return, List *heaplist); /* filetype.c */ int detect_file_type_(int fd, File_type *file_type); /* new_structs.c */ Rec *new_rec(int word_size, List *heaplist); int free_rec(Rec *rec, List *heaplist); Var *new_var(List *heaplist); int free_var(Var *var, List *heaplist); File *new_file(); int free_file(File *file); cf-python-1.3.2/cf/um/umread/c-lib/bits/type_dep_entry_protos.h0000600000175000017500000000245112603546021024643 0ustar daviddavid00000000000000/* prototypes for entry points to the type-dependent code; * need to be usable without INTEGER, etc, being defined, * so void* used for some pointer types that have specific * pointer types defined in the function declarations themselves */ void WITH_LEN(swap_bytes)(void *ptr, size_t num_words); int WITH_LEN(get_type_and_num_words_core)(const void *int_hdr, Data_type *type_rtn, size_t *num_words_rtn); int WITH_LEN(read_hdr_at_offset)(int fd, size_t header_offset, Byte_ordering byte_ordering, void *int_hdr_rtn, void *real_hdr_rtn); int WITH_LEN(read_record_data_core)(int fd, size_t data_offset, size_t disk_length, Byte_ordering byte_ordering, const void *int_hdr, const void *real_hdr, size_t nwords, void *data_return); File *WITH_LEN(file_parse_core)(int fd, File_type file_type); size_t WITH_LEN(get_extra_data_offset_and_length_core)(const void *int_hdr, size_t data_offset, size_t disk_length, size_t *extra_data_offset_rtn, size_t *extra_data_length_rtn); int WITH_LEN(read_extra_data_core)(int fd, size_t extra_data_offset, size_t extra_data_length, Byte_ordering byte_ordering, void *extra_data_rtn); cf-python-1.3.2/cf/um/umread/c-lib/bits/err_macros.h0000600000175000017500000000201312603546021022331 0ustar daviddavid00000000000000 /* error-checking macros */ /* these are to allow a compact way of incorporating error-checking of * the return value of a function call, without obfuscating the basic purpose * of the line of code, which is executing the function call. * * CKI used for integer functions which return negative value on failure * CKP used for pointer functions which return NULL on failure * CKF for floats for good measure (probably not used) * * put the ERRBLK (or ERRBLKI or ERRBLKP) at the end of the subroutine */ #define FLT_ERR -1e38 #ifdef DEBUG #define ERR abort(); #else /* ERR: unconditional branch */ #define ERR goto err; #endif #define CKI(i) if ((i) < 0){ ERR } #define CKP(p) if ((p) == NULL){ ERR } #define CKF(f) if ((f) == FLT_ERR){ ERR } /* ERRIF: conditional branch */ #define ERRIF(i) if (i){ ERR } #define GRIPE gripe(__func__); #define SWITCH_BUG switch_bug(__func__); ERR; #define ERRBLK(rtn) err: GRIPE; return (rtn); #define ERRBLKI ERRBLK(-1); #define ERRBLKP ERRBLK(NULL); #define ERRBLKF ERRBLK(FLT_ERR); cf-python-1.3.2/cf/um/umread/c-lib/bits/pp_header.h0000600000175000017500000000366212603546021022137 0ustar daviddavid00000000000000/* ----------------------------------------------------------- */ /* PP header interpretation */ #define N_INT_HDR 45 #define N_REAL_HDR 19 #define N_HDR (N_INT_HDR + N_REAL_HDR) #define INDEX_LBYR 0 #define INDEX_LBMON 1 #define INDEX_LBDAT 2 #define INDEX_LBHR 3 #define INDEX_LBMIN 4 #define INDEX_LBDAY 5 #define INDEX_LBYRD 6 #define INDEX_LBMOND 7 #define INDEX_LBDATD 8 #define INDEX_LBHRD 9 #define INDEX_LBMIND 10 #define INDEX_LBDAYD 11 #define INDEX_LBTIM 12 #define INDEX_LBFT 13 #define INDEX_LBLREC 14 #define INDEX_LBCODE 15 #define INDEX_LBHEM 16 #define INDEX_LBROW 17 #define INDEX_LBNPT 18 #define INDEX_LBEXT 19 #define INDEX_LBPACK 20 #define INDEX_LBREL 21 #define INDEX_LBFC 22 #define INDEX_LBCFC 23 #define INDEX_LBPROC 24 #define INDEX_LBVC 25 #define INDEX_LBRVC 26 #define INDEX_LBEXP 27 #define INDEX_LBBEGIN 28 #define INDEX_LBNREC 29 #define INDEX_LBPROJ 30 #define INDEX_LBTYP 31 #define INDEX_LBLEV 32 #define INDEX_LBRSVD1 33 #define INDEX_LBRSVD2 34 #define INDEX_LBRSVD3 35 #define INDEX_LBRSVD4 36 #define INDEX_LBSRCE 37 #define INDEX_LBUSER1 38 #define INDEX_LBUSER2 39 #define INDEX_LBUSER3 40 #define INDEX_LBUSER4 41 #define INDEX_LBUSER5 42 #define INDEX_LBUSER6 43 #define INDEX_LBUSER7 44 #define INDEX_BULEV 0 #define INDEX_BHULEV 1 #define INDEX_BRSVD3 2 #define INDEX_BRSVD4 3 #define INDEX_BDATUM 4 #define INDEX_BACC 5 #define INDEX_BLEV 6 #define INDEX_BRLEV 7 #define INDEX_BHLEV 8 #define INDEX_BHRLEV 9 #define INDEX_BPLAT 10 #define INDEX_BPLON 11 #define INDEX_BGOR 12 #define INDEX_BZY 13 #define INDEX_BDY 14 #define INDEX_BZX 15 #define INDEX_BDX 16 #define INDEX_BMDI 17 #define INDEX_BMKS 18 #define LOOKUP(rec, index) (((INTEGER *)((rec)->int_hdr))[index]) #define RLOOKUP(rec, index) (((REAL *)((rec)->real_hdr))[index]) /* ----------------------------------------------------------- */ cf-python-1.3.2/cf/um/umread/c-lib/bits/constants.h0000600000175000017500000000033212603546021022213 0ustar daviddavid00000000000000/* int_missing_data is convention in input file */ #define INT_MISSING_DATA -32768 /* for float comparisons */ #if defined(SINGLE) #define REAL_TOLERANCE 1e-5 #elif defined(DOUBLE) #define REAL_TOLERANCE 1e-13 #endif cf-python-1.3.2/cf/um/umread/c-lib/make.sh0000600000175000017500000000011012603546021020330 0ustar daviddavid00000000000000gcc -g -c -fPIC umfile_test.c ld -share -o umfile_test.so umfile_test.o cf-python-1.3.2/cf/um/umread/c-lib/filetype.c0000600000175000017500000001461012603546021021056 0ustar daviddavid00000000000000 /* Routines for auto-determining file type from the start of the file * contents. * * ================= * Fields file tests * ================= * * These are done first. We test the second word, which should be the * submodel ID - is this 1, 2 or 4? * * ==> Could the fields file test give a false +ve with PP file? * * Test for fields file only true if the first 16 bytes, when viewed * as 4 32-bit integers, are one of the following: * * bytes 1-4 bytes 5-8 bytes 9-12 bytes 13-16 * --------------------------------------------------- * any any 0 1/2/4(BE) <-- 64-bit BE FF * any any 1/2/4(LE) 0 <-- 64-bit LE FF * any 1/2/4(BE) any any <-- 32-bit BE FF * any 1/2/4(LE) any any <-- 32-bit LE FF * * For PP files, we in fact have: * * 0 512/1024(BE) 0 lbyr(BE) <--- 64-bit BE PP * 512/1024(LE) 0 lbyr(LE) 0 <--- 64-bit LE PP * 256/512(BE) lbyr(BE) lbmon(BE) lbdat(BE) <--- 32-bit BE PP * 256/512(LE) lbyr(LE) lbmon(LE) lbdat(LE) <--- 32-bit LE PP * * Possible false positives: * * - any PP with lbyr=1/2/4 looks like FF of same length and endianness * - 32-bit BE PP with lbmon=0, lbdat=1/2/4 looks like 64-bit BE FF * - 32-bit LE PP with lbmon=1/2/4, lbdat=0 looks like 64-bit LE FF * * Do we care about these cases? * lbyr=1/2/4: probably NO * lbmon=0, lbdat non-zero: probably NO * lbmon=1/2/4, lbdat=0 - possible monthly climatology? <== YES * * Always option for user to force file type, but: * **FIXME**: additional test could help. * * ======== * PP tests * ======== * * If the fields-file test is false, then test for types of plain PP file. * Here we test the first word, which should be record length (put there by * fortran). * * Check first for a 64-bit PP file, but in addition to the first word being * a valid possibility, this must also pass the stringent test of every * other 32-bit value being zero throughout the first 14 64-bit words, * although because of endianness issues we accept the sequence of * alternating zeros to start either at the first or second 32-bit value. * The point is that for a true 64-bit file, these should all be small * integers, so the most significant bytes will be 0. (The first possibly * large integer is the 15th: LBLREC.) However, for a 32-bit file this test * will span the first 28 elements. Even if the date elements (first 12 * words) are all 0, LBROW (18) and LBNPT (19) should both be non-zero, so * both the set of even-positioned integers and the set of odd-positioned * integers will each contain at least one non-zero value, and the test will * fail. * * If the 64-bit tests fail, try 32-bit. */ #include #include #include #include "umfileint.h" /* values passed to valid_um_word2 and valid_pp_word1 could be 32 or * 64-bit. Declare as longer of these two (int64_t), and shorter will be * accommodated also. */ static int valid_um_word2(int64_t val) { /* second word should be 1,2 or 4, reflecting model ID in fixed length header */ return (val == 1 || val == 2 || val == 4); } static int valid_pp_word1(int64_t val, int wsize) { /* first word should be integer from Fortan representing length of header record */ return (val == 64 * wsize || val == 128 * wsize); } /* tests whether sequence of integers has every other value = 0, but * only when starting at first value */ static int is_alternating_zeros_without_offset(int32_t *vals, int num_pairs) { int i; int32_t *p; p = vals; for (i = 0; i < num_pairs; i++) { if (*p != 0) return 0; p += 2; } return 1; } /* tests whether sequence of integers has every other value = 0, but * can either be when starting at first or second value */ static int is_alternating_zeros(int32_t *vals, int num_pairs) { return (is_alternating_zeros_without_offset(vals, num_pairs) || is_alternating_zeros_without_offset(vals + 1, num_pairs)); } #define N_PAIRS 14 int detect_file_type_(int fd, File_type *file_type) { int32_t data4[2 * N_PAIRS], data4s[2]; int64_t data8[2], data8s[2]; /* read and store first 24 4-byte words * and store first two integers of this according to possible suppositions * of 4- or 8- byte, and of native or swapped byte ordering */ lseek(fd, 0, SEEK_SET); if(read(fd, data4, 8 * N_PAIRS) != 8 * N_PAIRS) return 1; memcpy(data8, data4, 16); memcpy(data4s, data4, 8); swap_bytes_sgl(data4s, 2); memcpy(data8s, data4, 16); swap_bytes_dbl(data8s, 2); /* --- Fields file cases -- */ if (valid_um_word2(data4[1])) { file_type->format = fields_file; file_type->byte_ordering = NATIVE_ORDERING; file_type->word_size = 4; } else if (valid_um_word2(data8[1])) { file_type->format = fields_file; file_type->byte_ordering = NATIVE_ORDERING; file_type->word_size = 8; } else if (valid_um_word2(data4s[1])) { file_type->format = fields_file; file_type->byte_ordering = REVERSE_ORDERING; file_type->word_size = 4; } else if (valid_um_word2(data8s[1])) { file_type->format = fields_file; file_type->byte_ordering = REVERSE_ORDERING; file_type->word_size = 8; } /* --- Plain PP cases -- */ else if (valid_pp_word1(data8[0], 8) && is_alternating_zeros(data4, N_PAIRS)) { file_type->format = plain_pp; file_type->byte_ordering = NATIVE_ORDERING; file_type->word_size = 8; } else if (valid_pp_word1(data8s[0], 8) && is_alternating_zeros(data4, N_PAIRS)) { file_type->format = plain_pp; file_type->byte_ordering = REVERSE_ORDERING; file_type->word_size = 8; } else if (valid_pp_word1(data4[0], 4)) { file_type->format = plain_pp; file_type->byte_ordering = NATIVE_ORDERING; file_type->word_size = 4; } else if (valid_pp_word1(data4s[0], 4)) { file_type->format = plain_pp; file_type->byte_ordering = REVERSE_ORDERING; file_type->word_size = 4; } else { /* type not identified */ return 1; } return 0; } cf-python-1.3.2/cf/um/umread/c-lib/umfile.c0000600000175000017500000000673512603546021020527 0ustar daviddavid00000000000000#include #include #include "umfileint.h" int get_type_and_num_words(int word_size, const void *int_hdr, Data_type *type_rtn, size_t *num_words_rtn) { errorhandle_init(); switch (word_size) { case 4: return get_type_and_num_words_core_sgl(int_hdr, type_rtn, num_words_rtn); case 8: return get_type_and_num_words_core_dbl(int_hdr, type_rtn, num_words_rtn); default: return -1; } } int get_extra_data_offset_and_length(int word_size, const void *int_hdr, size_t data_offset, size_t disk_length, size_t *extra_data_offset_rtn, size_t *extra_data_length_rtn) { errorhandle_init(); switch (word_size) { case 4: return get_extra_data_offset_and_length_core_sgl(int_hdr, data_offset, disk_length, extra_data_offset_rtn, extra_data_length_rtn); case 8: return get_extra_data_offset_and_length_core_dbl(int_hdr, data_offset, disk_length, extra_data_offset_rtn, extra_data_length_rtn); default: return -1; } } int detect_file_type(int fd, File_type *file_type) { errorhandle_init(); return detect_file_type_(fd, file_type); } int read_extra_data(int fd, size_t extra_data_offset, size_t extra_data_length, Byte_ordering byte_ordering, int word_size, void *extra_data_return) { errorhandle_init(); switch (word_size) { case 4: return read_extra_data_core_sgl(fd, extra_data_offset, extra_data_length, byte_ordering, extra_data_return); case 8: return read_extra_data_core_dbl(fd, extra_data_offset, extra_data_length, byte_ordering, extra_data_return); default: return -1; } } int read_header(int fd, size_t header_offset, Byte_ordering byte_ordering, int word_size, void *int_hdr_rtn, void *real_hdr_rtn) { errorhandle_init(); switch (word_size) { case 4: return read_hdr_at_offset_sgl(fd, header_offset, byte_ordering, int_hdr_rtn, real_hdr_rtn); case 8: return read_hdr_at_offset_dbl(fd, header_offset, byte_ordering, int_hdr_rtn, real_hdr_rtn); default: return -1; } } File *file_parse(int fd, File_type file_type) { File *file; errorhandle_init(); switch (file_type.word_size) { case 4: CKP( file = file_parse_core_sgl(fd, file_type) ); break; case 8: CKP( file = file_parse_core_dbl(fd, file_type) ); break; default: ERR; } return file; ERRBLKP; } void file_free(File *file) { errorhandle_init(); CKI( free_file(file) ); return; err: GRIPE; } int read_record_data(int fd, size_t data_offset, size_t disk_length, Byte_ordering byte_ordering, int word_size, const void *int_hdr, const void *real_hdr, size_t nwords, void *data_return) { errorhandle_init(); switch(word_size) { case 4: CKI( read_record_data_core_sgl(fd, data_offset, disk_length, byte_ordering, int_hdr, real_hdr, nwords, data_return) ); return 0; case 8: CKI( read_record_data_core_dbl(fd, data_offset, disk_length, byte_ordering, int_hdr, real_hdr, nwords, data_return) ); return 0; } /* invalid word size falls through to error return */ ERRBLKI; } cf-python-1.3.2/cf/um/umread/extraData.py0000600000175000017500000000772112603546021020377 0ustar daviddavid00000000000000import sys import string import numpy _codes = { 1 : ('x', float), 2 : ('y', float), 3 : ('y_domain_lower_bound', float), 4 : ('x_domain_lower_bound', float), 5 : ('y_domain_upper_bound', float), 6 : ('x_domain_upper_bound', float), 7 : ('z_domain_lower_bound', float), 8 : ('x_domain_upper_bound', float), 10 : ('title', str), 11 : ('domain_title', str), 12 : ('x_lower_bound', float), 13 : ('x_upper_bound', float), 14 : ('y_lower_bound', float), 15 : ('y_upper_bound', float), } class ExtraData(dict): """ Extends dictionary class with a comparison method between extra data for different records. """ _key_to_type = dict([(key, typ) for key, typ in _codes.values()]) def sorted_keys(self): k = self.keys() k.sort() return k _tolerances = {numpy.dtype(numpy.float32): 1e-5, numpy.dtype(numpy.float64): 1e-13} def _cmp_floats(self, a, b, tolerance): if a == b: return 0 delta = abs(b * tolerance) if a < b - delta: return -1 if a > b + delta: return 1 return 0 def _cmp_float_arrays(self, avals, bvals): n = len(avals) c = cmp(n, len(bvals)) if c != 0: return c tolerance = self._tolerances[avals.dtype] for i in range(n): c = self._cmp_floats(avals[i], bvals[i], tolerance) if c != 0: return c return 0 def __cmp__(self, other): """ Compare two extra data dictionaries returned by unpacker """ if other == None: return 1 ka = self.sorted_keys() kb = other.sorted_keys() c = cmp(ka, kb) if c != 0: return c for key in ka: valsa = self[key] valsb = other[key] typ = self._key_to_type[key] if typ == float: c = self._cmp_float_arrays(valsa, valsb) elif type == str: c = cmp(valsa, valsb) else: assert(False) if c != 0: return c return 0 class ExtraDataUnpacker: _int_types = {4: numpy.int32, 8: numpy.int64} _float_types = {4: numpy.float32, 8: numpy.float64} def __init__(self, raw_extra_data, word_size, byte_ordering): self.rdata = raw_extra_data self.ws = word_size self.itype = self._int_types[word_size] self.ftype = self._float_types[word_size] # byte_ordering is 'little_endian' or 'big_endian' # sys.byteorder is 'little' or 'big' self.is_swapped = not byte_ordering.startswith(sys.byteorder) def next_words(self, n): """ return next n words as raw data string, and pop them off the front of the string """ pos = n * self.ws rv = self.rdata[:pos] assert(len(rv) == pos) self.rdata = self.rdata[pos:] return rv def tweak_string(self, st): """ undo byte-swapping of string and remove trailing NULs """ if self.is_swapped: # concatenate backwards substrings st = string.join([st[pos : pos + self.ws][::-1] for pos in range(0, len(st), self.ws)], "") while st.endswith("\x00"): st = st[:-1] return st def get_data(self): """ get list of (key, value) for extra data """ d = {} while self.rdata: i = numpy.fromstring(self.next_words(1), self.itype)[0] if i == 0: break ia, ib = (i / 1000, i % 1000) key, type = _codes[ib] rawvals = self.next_words(ia) if type == float: vals = numpy.fromstring(rawvals, self.ftype) elif type == str: vals = self.tweak_string(rawvals) d[key] = vals return ExtraData(d) cf-python-1.3.2/cf/um/umread/pp_unpacked.txt0000600000175000017500000003521312410001717021131 0ustar daviddavid00000000000000PP little_endian 4 num variables: 1 var 0: nz = 5, nt = 3 var 0 record 0 hdr offset: 187652 data offset: 187916 disk length: 46640 int hdr: [ 1979 5 1 0 0 121 1979 5 2 0 0 122 121 3648 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 1390592 12288 900 5 50 0 0 0 0 1111 1 1390592 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 5.00000038e+01 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [ 1.94408166 1.99718308 2.04474235 ..., -4.75558281 -5.05577517 -5.05779886] ----------------------- var 0 record 1 hdr offset: 140740 data offset: 141004 disk length: 46640 int hdr: [ 1979 5 1 0 0 121 1979 5 2 0 0 122 121 3648 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 1378304 12288 900 5 250 0 0 0 0 1111 1 1378304 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 2.50000015e+02 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [ 49.80299377 50.26750946 50.63897324 ..., 29.66181755 29.07848549 29.01329231] ----------------------- var 0 record 2 hdr offset: 93828 data offset: 94092 disk length: 46640 int hdr: [ 1979 5 1 0 0 121 1979 5 2 0 0 122 121 3648 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 1366016 12288 900 5 500 0 0 0 0 1111 1 1366016 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 5.00000031e+02 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [ 25.3536129 24.78829956 24.53061676 ..., 1.71871078 1.51844108 1.49270189] ----------------------- var 0 record 3 hdr offset: 46916 data offset: 47180 disk length: 46640 int hdr: [ 1979 5 1 0 0 121 1979 5 2 0 0 122 121 3648 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 1353728 12288 900 5 700 0 0 0 0 1111 1 1353728 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 7.00000061e+02 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [ 9.91138363 9.40522385 9.38437462 ..., -1.06550407 -1.1214056 -1.12985194] ----------------------- var 0 record 4 hdr offset: 4 data offset: 268 disk length: 46640 int hdr: [ 1979 5 1 0 0 121 1979 5 2 0 0 122 121 3648 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 1341440 12288 900 5 850 0 0 0 0 1111 1 1341440 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 8.50000061e+02 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [-0.12850454 0.30537409 0.89345634 ..., -0.90012771 -1.02400351 -1.02327657] ----------------------- var 0 record 5 hdr offset: 422212 data offset: 422476 disk length: 46640 int hdr: [ 1979 5 2 0 0 122 1979 5 3 0 0 123 121 3672 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 2902016 12288 900 5 50 0 0 0 0 1111 1 2902016 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 5.00000038e+01 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [ 1.12230837 1.13196766 1.14027655 ..., -3.34485221 -3.552737 -3.56620502] ----------------------- var 0 record 6 hdr offset: 375300 data offset: 375564 disk length: 46640 int hdr: [ 1979 5 2 0 0 122 1979 5 3 0 0 123 121 3672 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 2889728 12288 900 5 250 0 0 0 0 1111 1 2889728 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 2.50000015e+02 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [ 39.66373444 40.7345047 41.7251091 ..., 33.35466385 32.88820267 32.86706543] ----------------------- var 0 record 7 hdr offset: 328388 data offset: 328652 disk length: 46640 int hdr: [ 1979 5 2 0 0 122 1979 5 3 0 0 123 121 3672 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 2877440 12288 900 5 500 0 0 0 0 1111 1 2877440 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 5.00000031e+02 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [ 25.3900795 25.5765686 25.8936615 ..., 3.75123811 3.2344563 3.22648478] ----------------------- var 0 record 8 hdr offset: 281476 data offset: 281740 disk length: 46640 int hdr: [ 1979 5 2 0 0 122 1979 5 3 0 0 123 121 3672 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 2865152 12288 900 5 700 0 0 0 0 1111 1 2865152 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 7.00000061e+02 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [ 11.72118092 11.39163113 11.3867178 ..., 0.04169134 -0.12455849 -0.12718374] ----------------------- var 0 record 9 hdr offset: 234564 data offset: 234828 disk length: 46640 int hdr: [ 1979 5 2 0 0 122 1979 5 3 0 0 123 121 3672 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 2852864 12288 900 5 850 0 0 0 0 1111 1 2852864 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 8.50000061e+02 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [ 2.93325782 3.36176467 3.92748976 ..., -1.49084044 -1.61046946 -1.6003381 ] ----------------------- var 0 record 10 hdr offset: 656772 data offset: 657036 disk length: 46640 int hdr: [ 1979 5 3 0 0 123 1979 5 4 0 0 124 121 3696 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 4413440 12288 900 5 50 0 0 0 0 1111 1 4413440 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 5.00000038e+01 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [-0.70770234 -0.82124394 -0.92155576 ..., -1.15786588 -1.21203947 -1.22635651] ----------------------- var 0 record 11 hdr offset: 609860 data offset: 610124 disk length: 46640 int hdr: [ 1979 5 3 0 0 123 1979 5 4 0 0 124 121 3696 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 4401152 12288 900 5 250 0 0 0 0 1111 1 4401152 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 2.50000015e+02 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [ 27.31070709 29.02667999 30.62471199 ..., 32.79201889 32.61489868 32.60603714] ----------------------- var 0 record 12 hdr offset: 562948 data offset: 563212 disk length: 46640 int hdr: [ 1979 5 3 0 0 123 1979 5 4 0 0 124 121 3696 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 4388864 12288 900 5 500 0 0 0 0 1111 1 4388864 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 5.00000031e+02 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [ 21.56608963 22.70127678 23.89733124 ..., 2.47970223 2.33779645 2.34782624] ----------------------- var 0 record 13 hdr offset: 516036 data offset: 516300 disk length: 46640 int hdr: [ 1979 5 3 0 0 123 1979 5 4 0 0 124 121 3696 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 4376576 12288 900 5 700 0 0 0 0 1111 1 4376576 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 7.00000061e+02 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [ 9.23853111 8.94081306 8.94977283 ..., -1.343063 -1.55235732 -1.54391372] ----------------------- var 0 record 14 hdr offset: 469124 data offset: 469388 disk length: 46640 int hdr: [ 1979 5 3 0 0 123 1979 5 4 0 0 124 121 3696 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 4364288 12288 900 5 850 0 0 0 0 1111 1 4364288 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 8.50000061e+02 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [ 1.66281414 1.97502601 2.40246844 ..., -1.50481987 -1.87925422 -1.85736954] ----------------------- =============================== record read using saved file type and offsets: int hdr: [ 1979 5 1 0 0 121 1979 5 2 0 0 122 121 3648 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 1390592 12288 900 5 50 0 0 0 0 1111 1 1390592 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 5.00000038e+01 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [ 1.94408166 1.99718308 2.04474235 ..., -4.75558281 -5.05577517 -5.05779886] nx = 106 ny = 110 data_type = real nwords = 11660 cf-python-1.3.2/cf/um/umread/mail_from_Alan0000600000175000017500000015424312407776741020755 0ustar daviddavid00000000000000From david Mon Sep 8 13:42:05 2014 Received: from vimh4.rdg.ac.uk (2001:630:53:100::5b) by vime-hts1.rdg.ac.uk (2001:630:53:20::10c) with Microsoft SMTP Server id 14.3.195.1; Mon, 8 Sep 2014 10:35:06 +0100 Received: from engine19-1277-3.icritical.com ([93.95.13.95]) by vimh4.rdg.ac.uk (Exim: virusscanner) with esmtp id 1XQvLi-0005nD-FA for d.c.hassell@reading.ac.uk; Mon, 08 Sep 2014 10:35:06 +0100 Received: by iCritical outbound mailer at engine19-1277-3.icritical.com for d.c.hassell@reading.ac.uk; Mon, 08 Sep 2014 10:35:01 +0100 Received: from engine19-1277-3.icritical.com ([127.0.0.1]) by localhost (engine19-1277-3.icritical.com [127.0.0.1]) (amavisd-new, port 10024) with SMTP id 21874-05 for ; Mon, 8 Sep 2014 10:34:55 +0100 (BST) Received: (qmail 24533 invoked by uid 599); 8 Sep 2014 09:34:55 -0000 Received: from unknown (HELO exchsmtp.stfc.ac.uk) (130.246.236.11) by engine19-1277-3.icritical.com (qpsmtpd/0.28) with ESMTP; Mon, 08 Sep 2014 10:34:55 +0100 Received: from moon.badc.rl.ac.uk (130.246.190.93) by exchsmtp.stfc.ac.uk (130.246.236.18) with Microsoft SMTP Server (TLS) id 14.3.174.1; Mon, 8 Sep 2014 10:34:54 +0100 Received: from moon.badc.rl.ac.uk (localhost [127.0.0.1]) by moon.badc.rl.ac.uk (8.14.7/8.14.7/SuSE Linux 0.8) with ESMTP id s889YqT5005361 for ; Mon, 8 Sep 2014 10:34:54 +0100 Received: from localhost (iwi@localhost) by moon.badc.rl.ac.uk (8.14.7/8.14.7/Submit) with ESMTP id s889YqJQ005358 for ; Mon, 8 Sep 2014 10:34:52 +0100 X-Authentication-Warning: moon.badc.rl.ac.uk: iwi owned process doing -bs Date: Mon, 8 Sep 2014 10:34:51 +0100 From: Alan Iwi To: David Hassell Subject: Re: cf/pp In-Reply-To: <20140904132759.GF15794@met.reading.ac.uk> Message-ID: References: <1296817250.1639.4.camel@gethin-desktop> <20110204131949.GA30428@met.reading.ac.uk> <20110209164140.GC8624@met.reading.ac.uk> <20110304181512.GC11553@met.reading.ac.uk> <20110316225857.GB1198@met.reading.ac.uk> <20110317160802.GA30807@met.reading.ac.uk> <20110603083658.GB8542@met.reading.ac.uk> <20120404220545.GA12619@met.reading.ac.uk> <20140904132759.GF15794@met.reading.ac.uk> Content-Type: multipart/mixed; boundary="-159228482-749198422-1410168891=:4676" Received-SPF: None (EXCHHUB03.fed.cclrc.ac.uk: alan.iwi@stfc.ac.uk does not designate permitted sender hosts) X-Virus-Scanned: by iCritical at engine19-1277-3.icritical.com X-Scan-Signature: d00caa44b80bd571d3966f632055cf6d X-Spam-About: See http://www.reading.ac.uk/ITS/SpamFilter for details. X-Spam-Status: No, hits=-99.9 required=5.0 tests=BAYES_50=0.8,RCVD_IN_DNSWL_LOW=-0.7,USER_IN_WHITELIST=-100 autolearn=disabled version=3.3.1 X-Spam-Level: Return-Path: alan.iwi@stfc.ac.uk X-MS-Exchange-Organization-AuthSource: vime-hts1.rdg.ac.uk X-MS-Exchange-Organization-AuthAs: Anonymous MIME-Version: 1.0 Status: RO X-Status: A Content-Length: 52295 Lines: 716 ---159228482-749198422-1410168891=:4676 Content-Type: text/plain; charset="US-ASCII" David, Okay, this seems to be the right one (.tar.gz file attached). umfile.py is the top-level file. Type "make" inside the "c-lib" subdirectory and it should work. (Some time I ought to learn how to use setuptools.) Please drop me an email once you've at least verified that you can run the code okay on your system e.g. just 'python umfile.py' and got some sensible numbers from some PP file, and I'll be happy to answer questions / fix bugs when you come to incorporate it into CF-python. I hope it's not missing any agreed functionality, but say if you think it is. Alan On Thursday 4th September, David Hassell wrote: > > > ---- Original message from Alan Iwi (11AM 05 Apr 12) > > > Date: Thu, 5 Apr 2012 11:04:22 +0100 > Hi Alan, > > I've been away for quite a few weeks, but am back and trying to > rememeber what was going on! I was wondering if you had made any more > progress with the cduinfpp stuff? I, unfortunately, have not thought > about for a while. > > All the best, > > David > > > -- > David Hassell > National Centre for Atmospheric Science (NCAS) > Department of Meteorology, University of Reading, > Earley Gate, PO Box 243, > Reading RG6 6BB, U.K. > > Tel : +44 118 3785613 > E-mail: d.c.hassell@reading.ac.uk > -- Scanned by iCritical. ---159228482-749198422-1410168891=:4676 Content-Type: application/x-gzip; name="umread.tar.gz" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename="umread.tar.gz" H4sICIJ2DVQAA3VtcmVhZC50YXIA7D1rc9u2svla/gpM0zORfCWFL1GW3XSOLcmxTmRbIztp03PP cCgSsnhDkRqSsuN2+t/vLgC+ZUuOe+zpVJhMTGIf2F1ggcWD0GoRUst5azc9d/p2bH09hTcaRq22 Kqtvz6wvdOZ69NXTkgzJ0HX4ayiKKuNf2WjLLB+ToqmvFFWXVUMzOorxSlbaHU1+Rb4+sdyt0iqK rRBEeSofoUv69y+SNJksYndB3ym6Isuqum+oLaiHtq61la4EUKsM1eR9gHYUDaH2/bQvrdkubZNW ef//k/y9nLj/y/f5v6K3OyX/19sG+P+zOFHi/+6t+yCetXAeRPiL+v/p4Kg/mFy+Wy2w4ltzwh9c P4bnqRtHb/dac0kaDY8nR5PPCVoUSFKv9+7atqXeyejo/eW75s+W55HmbDzskea11BuPEUqaA9Ic S6P+O8+B/wVqNLdC6kgXx/+6JO9Ega2A0DAMQviLr/HdErP+V/puAXwDG5491//iuVEMjz69NaM4 XNlxBG/RrbVsgUBXn8cDsz8Ym0LYlLeJ3By6bFkZTn84ATgCmgCp0Jrjo6tTQPihlqeov829C8y6 JNGvyyCMSa9HuDEIaE/KeJLUGp9enH8+ILZHLZ+gudLiJXg7gMIyngzpQPouXIBRAYLGqkvf/VA7 O/owqJNmrywaZytJCc+Dh5AlKSvrIOGeiQOUo34d5eFVBiwC8sM/U8Rm83YeeLRphfbcvaGkahVm PyjmH63ggPyjZQOKaGlMiV4PufcS5gD+UZJes+a2DIM4iMzo2mvND3gLRLlMkMvkMGiPr5HHeAyk /eOPw1HfPO1P4PlyeP5+NABm5CcQV3pdZOlMv4Fl/+LjcY7lS7vrn55WD8V/E6iys8GTy9gu/tMM XVXbbZ3Ff0pb3cV/z5Fy8Z9sqEoH/mvpclsxZKWrluI/WdO1bqsjq7LclRUlH/+toX1pzXZpm1Tw /z/J38tpQ/ynyRX/1zodZRf/PUeSToKQRMEqtCkLvCLi+iSeUxKtpo4bUjsOwrs0MmiQ+DYgNzBA uIEfkWBGqGXPSTD9P0CUkJ7cuhDYTCmZrlwvbpDAp8QOFksAOQCL5+kw3WDFBPBfWMSQklG3QSzf ASw34lxtaxVRMjy/GrwfTBgMGuyIPXA2ICH1HerHxLFii0kdSXGA4vAQcNaEMizbDkLH9a+9uwZZ QNAEj1CKFaNAdwRiU1Deja0paDMD6zBe6CVgGmkWBguiqU0CAENvQjBBPp4Jy6HwwQoKD5Cj5d+B xFEMzy1CTlY+9JVotAhwPAdkkljswQRDo6+PS4D0CmvjbjENPOJbi7SGIprGekLpWVpGUgkhRQqH MKnfzILgDQFz4AMGWG+Y6dgbxEZvJCsi1hIKXoauFXPdsYqwytMKSuqeyQUVMwcKCiVaqzhYwFhh QyR7R6Z3ElJiG3AIcLRplFJYXhSACra3ckAXJiGaC9vS15iGvuUJbUENqFSKMkiZalgAViIAgPGN 68DL9E40gEJDFgVxHZLQNm3TLUk6ydo7yFVDvCXw9eM6yZp+oT2nVUxdVl4acgZhqdX6QUE17iGi YmKYZpOlZ9k0aeGlCgYhpJW/CBx35lKHN4G7rOGg4muajesXGo4kDbnuM3rLS0sMyj2jyfBLTYeZ N0owUnhqf+6032Pr+R5d4HtsOd+j2WJUs6QJWUDvigKL6nZwquS5thtDG6lljr2KVrzZICYU/iYC O9vzNwT65pguUECWDw1maQEgFafObQO9AuBAZS3B82KsUmjlSbXnegU7cOiW/sf4pcZsgIi8l6BJ cwblF5YdBtLPw6tTczQ4r4Ef1RtgYhd6RNATajZCbxPOhtYSnnbI+MxZpM3aKnEjKTERuJtrU95V Qv3PaMj6MzpzfRo1oIWDHVAWjzcDJn/OTkxOiZmWiccNHK1mM+QK4mREU/CZQl/OGouwbGsXv/0t UiH+Yy5QngTa0DpiC9yqNf/GMjbP/5Qk/uvA5AHiv46uKLv533Ok8vxvX5dbXbmtKm1d1iS1W5j/ qR2j01J03VC6Xb0y/SuSvrRiu7RVqvr/0/29nDbM/2Qtm/8J/zdUbTf/e5b0dg+jJXPhRhg4mGyu A7EDNIIbCCcwInTx3xJiXhap7L2VXvNgBCdi5tnwEiNgs390dUSaGnQQ+5IEPHHuMPMCK2YzByt0 I4wxkNidiWDGqfHYuZ4yxNmceXUxGkyOznsDotBmW3pNvRwFj7AfolA0IPEhcNp1QFulzeM/Ngm2 HfPN3cH2+/9yR+toOP6rym7991lScf9fkfc77ZYs63pXk+X90vqvgBoqQNVOt7T/X6Z9ac12aZtU 9f+n+3s5bRr/dcUo+b8ha/pu/H+O9HrN6FoYXvkwbuhmnB/42QosBA6F/N7F2Xg4GvRN3A0mNSdY TT1qLkNqu7jGkA3bP19M+ubl8NcBgWihOMInMcEaGTR1vQyF/KIMpMaXSh4WQpf+vjHD5vGfhqHJ lpK+eUKw3fwf/F9TZdz4gfG/req78f85Un7+3+0qHV3TWuq+0pGVbrtTnv/r+6rcArx2W2vvF+b/ VdKXVmyXtkpV/3+6v5fThvFfhQ6g5P+Gpqu78f85Ek7W2cG7pj2n9hfc5OCVj5N1BLKdRrbdFgd4 aC24JRaf1NsxubXucOPA9e0gXAahhZudZXYAlwjjQ0Iar0Kf3FjeimK+Vdx3aqTba8F0topszo5t JFqRa5PlCgqJKHITuxUeDuTwjBs7ydaLGxH6ldqrlLhQRguokUHvw5CsItwaDUIMIug17sVkG6iM lZDXp9cgyg1NBPfJzHK9VUg5o3HGiO0/3c/o/ONoVCE/yRZLIvZ4HQQO7ktHgEJqyzCYWlPvjvhB zAqqCw1wSQbVG0wmx6MPpAaU/HFI0sdxnfBtbUJxk3yW7OyHAZoHBXibRVonoysTyEhToRrGZe4M AKQ/OP74PsVBuDUNwrhWP8TIDWoD2gjkHhBQOYAgCtW2PDINLR8Uzy0XIel1ELNznodJwJXFbR+G NbdOIBKs4d8fiVz/nZH8kUMZ15YCBf6+e8fsuQbtpDYTaDOGJhRLMYXIw5MDslHk4UkilpvRJ/D3 kyEEmdehu6Q108RKN020iwBf/jy86p2aYD/CNzTN6eo6h4jsDvOFQY3Vwtivo4kOOPfDpO0wQBl7 mFA1lQpsnMCYlcrQkwSaGOdwN2L/HdPm+D8I4RkPsfwX1//4/p/W6bTltsrX/9q7+P85UmH/T9H2 u6raws93IAYzHrP/l5B2DSCFScCuN/lrpKr/P93fy2nj+p+mlfzfkLXOLv5/jvRanDsiP2JAZvmt +U9sj+7489XAvJj0BxOMoEbDq6vRwByc94dH52kkcX50NfwksIbn7yEaj2OPmpxRbgHv02BymUOb utcpDlv7K5Z1PHy/qaA8h/tKKQnDQtXXbGqSLw+DarH0iCejljT07v5Wi4Gbx//l0uRH1f6L53/U xP+1Dj//o+m773+fJZXHf62tthRDV9uqqhrl7z/E+L+P439pARBpgaylqvtdWW53dt///jVS1f+f 7u/ltGH81wyj7P+G0tl9//ss6e0eaX57wsUS4DAeJ6eZ2fLXMqSxxVbc8stL5yYeGMKvKvV2LpMd 4cFcpZvLxYxaRvE/OcTc3uDwvD/4xRwdf54QSHIl/+ziHPKVSn7/6Ary1Ur+KeOjVfkMkY++hs9n yG+vkacP+cY6eQDQWScP5O+vkQf5dNfJAwClqjAIhICqxlfDM7REVeUTtARRqjqPJoMeAKpK9y76 AwBUtT4dsDKqak8ufkZAVe/zMZauVBUf/MIAVc3HR70PUHNVzSeDEVZpVfOTHiqoVjXvMYha1Xw8 uQCIWtX8E2dV1XzCIGpV88EvYwRUNT8evIc2pVY1P2dmV9doPrn4F7TNquZXn7EMrar5aPAJAVXN J5ef+grRqpojQCVaVXMEaERbozkAdKJVNb+c9KCVaFXNP14OJlB4VXMEQOFVzRGgEb2qOQJ0olc1 R0Cb6FXNEWAQvao5AjpEL2t+/JEbsdK3HJ8KSLlwYapq7yJMVe1e0Ps/nq3pX46PeqzBVToYUbPV HuZ4IiBlsx+fCkDZ7NDFcEjZ7MfjEeskK50MAHivWtH8/QXrPiudzPGvn8naTua4LwAVzX/9hQMq mvcFoKL5WX9I1nUyx2cfLgnvZFLI6OLiw8dxLaR2g+BHUF/rpFarJSdK9uo1BNWbP+HB2LkT1uv/ Zlj/yZ07Xc+CnVXJ6CGy8koMpKePt3/u+L95/nfPJ1GPKGO7+R+e/1I0TVZeySqUq+3mf8+RSuc/ 1X2j3ep2ZF3Tu3L5/ieEGi1Z2ccLnjS1fP6zRPvSmu3SNqnq/0/393LaMP+D2Z5S8n9A13bzv+dI MB6lX4Ty4weFL2lz39E2i9/RHuIZBJ/iB6vsA/tVxD6YT05wiNG0QWgMQ+SU4mEMsdDaYOdBooDc BK6zlx2eiIIFTU9QcHnYV/lz64aSaEltd+ba7ORDASdZvhVfeqenPRxqe1Zo8WMYAFlE1LuhET/z gEWT9MtdvEHKnN7FNKrXGGRvGYcNErm/UTMm/mph3gahE9UPJQlKzuiuaczuljIt3zE96l/Hc9MO QlqvsY+oCOclwoiG9B0kwlPfii1GSvYYgzD2C3BR9F5atsm3/4vlo+sia9OKzWA2i2hcryHCzBHM BBs+ORcoAnQM6prJXg+Z5t+gghhKQfyciDw/iW7ulwyiIGDJvikSZhHCkVRVISBDEeJVgW70RVg3 B9xCfkgP1kMemGjTKJfuM/PnWHJ8JjE/moHKn7Bvo7JPwfHWsaUVRrSoOGNyklxJRtLLyV7u9MUj 4r9vHgm2j/80yOb9/+773+dJ5fs/O6rSkvV9We2qavn+Jw5VZKiprm50Kvd/FmlfWrNd2iY9EP/9 CZEfTxviv056/jfxf3aWfBf/PUfi3//yNftk38fGECmLUJIoRwQ16TpJsjxyKImhEhHZuMgHa3I/ AQ6H9wVP91CxsfPB2OnBwAlLvLFC042Sb503S4f40DqiubmAgNd7DEFEWRD6GBI3povt8PH0dUij aOsCrkPXwZh9O+ylxQ5u34/MlrkSbBY4QSDjmex0tKDiK2EZCa57YUfD25aoJBYkskrKB4ZJhIUh OHsth+E894H4L4lGq+FxLg4rBtqVCFmAN0WZAq1spKRNCjC3xrqAORExE2ybYh8q84ECJxSsj/XG A/MaD1oxCG2QkQu1tgdmWOIdu6JFMOksqFpunuhhCmHK6Iu7NGE+F4eWXy1JcGZIt2tB5ULN5fLx kpqz2VbCojVmMzM3xcjWgd2ya3huMqdh/HMx/YMVJuVnYg5z9zBuFHLgEdeRoZHjijIj4B0WFPnv /3DQnp+JkJt5SHwGj1dSoT9G3MOQIJ+72YIw+Y1NVi2An3gxNhhcy+Yoru/GLogAsxphhhrDQJQo J//6AkSHwX2d4+WpRcvlpIhXyipxi3CscSNrgWfB2Op67VfT+upGZO839rdBrsR7LN5z/liW+kYs 5APfG76cz0uxHGhVX2lkxgEzyycrZMKlzLYsk6vwG+OVmCcWbwWUss2g4zaj1RLvl6ZO7Z6OG7vh uQUjHb1eefD8mxlvNMZaE4iO2qM31MvaEbya2HeOMJvswWuDVNoHAPmYzIjz8UIOCZlDgMCHfJw5 8EJYb4UXMZpL8JjAEYRXgAACw/9J+4sYkYmoqS3Y3nYyKDEw3pqWgr0p5CXy9vFaQ5y602JOELrs 6hOa8IHhG6vcse5q4iNnzAp8tgbUs6CncMDOTF87/5YWKyb1CfE1VA0UAhoCV+AU1coCJV6ICqCx M+XXGBvtiI2Hmy+parwVnVd3bW1jmoWUJgjl5lEhuMoxjTcxFQjlNra+n2FAEzyrgl+u9rQHILwD ZJ4pur57uP+WcS+ryLnnG/GjuKPN+V02NHMNkZGOClMa31Lq834uV21WoRKnQtiEOtf0H0GVlIkr rq5f7rW3oi0sUy6VRmFFbKmmY6sY8sJgYaZXEj5SR7Rigs5t66XliXeV90S1PaTBZdz8MupeXri9 epk71uqW6iQ02MIeSYKOWnRdq9iRTEVDWfm3106QG4tFRi1bPHR90fGydeeGCNkQEqxiAWJPvHd0 3GSw79PpCnqr1WLJ2TOWTpp5T7yG1OKLvrOj4TkTagFC8O/4/j7nnXepmLZc/y3eLfvIMrZf/zVk VdVeyaqiaMZu/fc5UnH9V1M6htbqtrvKftfQtdL6L0L1Ftbifndf00vrv2Xal9Zsl7ZJ96z/Psnf y2nj+W9wl4L/K51O29it/z5HwtPbk4urC7wu6TK584H/ElMWXeS+XufRjj3HibC4RQAiCIbFv4N/ AIGxhWg3KrKZLSDKabVaCRqLZR7EYIzmMIn0sKW67DIClFv8VlQm+B7PMWvJ2hRbaKnE9iIqWy3N 0sZ9/hjAPbTpJCh/cuB+LJCnOpFC2dmvWNniQP35MTvLwO4Nxxvi8dbw3KUSeBtH7iZ1XNp1GmRO fZuyL9q4adi9+MluDjtzgdvyUeAfEAiX/eTAhPiFI9uK8AoNys90ZCciuAw3luulP4igqex3D3Cd GFAxZK1LubaSp9xwnKJMAWpuOoCB6xPJL4Exc4lfdsCIubbHbMzmDkQwSioDaXkOkpowr10/oWVQ ZCPA+M7DccYb5LpvZssoUeTiNKeEgFPTPOdNrSYhMsF1ZtAtF4iTJS3RXmO6AH9IF56z2ZQVFo+k FOc59YwRnxaAs99YXpabWjV7Yj8GkKcqzp8TyP0q4YbKo+0ARNBS2GSyRI7PJvX4Jfh7ywerCNdf by3vS6WeBBvuPkDM/qb9AyNmdGuweBPh2gv5ioTlugMLFfoaqDvMe1ydFapLvBcqIq+3HSzvcP0J bGxaYWjdrdFf7KOJ9eZkMUTkplXEyXN1/d26qmb3ACe/5ZfOhB0aUxvNIY6+mOneT3YuZi9/MAbZ 5H/wjy8Z4hoD5obUZgywfzA3ddGInCyjrcFjq7vIFNdS7udSXAiu4PE5N7JBLWp5SpZRnJO/9Pi/ 3fwP+tcnhIGb539J/Ke1Ox2D3f+x+/3f50lqt3j+R+vut1TZMJSOoleO/+iKgT/wa3QNpa3i5SD2 vaQvrdcubZfWz/+e5u/ltMH/Db3i/wDf3f/3LCm7/wNGKXagGm8ASYNqfod/ev3uYQrgl/tmlwPD UEYhTie/k/KNuw1SvgiY/MFG9Qe+c+KzIJxrYKwPkwyPjbIwO+VRAGEhVhLvSb9LueDkEF7WYQEw pDf3Q336FbT4I1NxLVo+zjyUyrhMErZ0j+UUY9KZG0ZxNduzMPcPkX8PSzAG++00/Pk0cbOJgOMd gfyOwSgOQnZkHn9EC0y34J9g43SOH7AHPnh4fmmmgWyLkGEcsX2A5HJFLCIOODP+c1dBxC7IIzCX j1yHinsXo5izy6SAvoN6M/YLVezYPtYe9i3NwIc5amRbvi+ug0w48B8TG4/xeY+zAyz8mICf3cef eYt41Nti4LcV69mrMGQ1QUg5mM2MKkL1LRpdanxsy8zyy4iunAA3mFg82oCsOXWv53EhCybY8byI dDdle/fu9QJmt2sga7iwQ10rvp2VZkaB6xUypsEK95thFmTd0RAC+iJ7fA9mphUvgqgAYLuMEbWK 3Ffh/7f35d9NJEnC+yv+K2o80yAZWej02fQuh+n2Dg08oHump5enV5ZKdjVSSauSMKaH72//4sqz siQZaDO7q3ozjVWVR2RkZGRkZBzDuO/2OJ9NppMp5lp0XlOGPf2GkSs/jgOI01fe6O6Bt+TtvcYg viJI0JqOGnCu0kOtlKM0Lnl/VoLoQnl5f+YOBw5SChgnV4lc7Ff99UlQqlv/qyQm9qN+jyfZ/MJ+ AQiwf15MFm75NFvME/sNWx0AKSMS8Y6xwCAUf5hr/qCjlKJwFvEl+D2rTR4eN0dlms6vFi8cvIYP d6ZMdKCXXMrSFXtJaWUYIliNokWG7AT+wM+KG9Ofv0dblsEcXeoeq1vLh49/6T09+fmVXWJxNrjq STG7ovVa7jbx20fV+jjN+wSJ27ndROw0eLYaCrcCvTorAhUXX52FYXSIOgBs9K8ILS8prlUKsYnc P0jec9mP8omZ7bFUl9ZtQnvKk7oeVf5DUSUH/9KVSFJQH52Xr4MvaSE4rxQYKojtym1FiRJ49reg VVqDYyU1gISEfxvjLBJIdHXUOlB117blWC9BZUujGyGhoyfNkh5CvehlE/UORRD9yu4Pm1CLWKxm joU1sIWOauEDT2ZE1uTwF3KfD8x62DyF2BLsBigz7hqXP1YGoViA1iSc9DKFHf08+lCbM9diq6hi 8/Mv17xrR2h1Y1wTpyh0SUPUTaG1FHOOCh0Xnh20V6Qcm159Mdlz4ckX02RGxuoansuLxBkkjJxg qmm+Dx1QhO5MYNfBsPuTMexD5ZBRtG+WG8n97gwzGOvEo5Q5mIA/T7JkBpuEZBMmcWDJeHEMu3q0 pQVxzPoQYRsB0rD5z6gCMwxbZ14l6RGpDwsqtWRUYWmVcttiflSSYEHi6ANq57gT9vE/o6sqdAec ZZ3Tx/8Z/YVz/g+k/sB7wM/tYz39X3uv023sN/Yx/me3u7fJ/3Ujj6X/a+y1G/sHhwf1ZrfTPtzb 993/Gq2Dxn69u9c9aDbae01b/1es+rXHtXnWe5z1/4XWu/+ssP9odTpNb/13gKI2+r+beIz+L58P 0gmH/7VexbNzUgjql9uLMd5dgZxSv9hGURE4RD96cvr0JNqZLOaYlYITMxzrj+SjkMzOJnliXrK6 hsSvSY9MPqBeU13Sr7A4EQ0D2ptsZxO+AkV7Bq7mpo2XOsfR9tat7XF8hfJR2kfBoD8ZkLcOdA3l eFyYO2ORJe+nIDiCqCNhDelYsV3Fc8UqWxdWAQ6jiow4+uc/9QirzkFzOJ3B8IcVxlpNYfaIzVtM agoRYznEhXQTfZP/V7at3L0iY2gjTQ9Hi/xCWq6aQ5aC6X7UMGNZZZbD6tWY1IYR0ENOx9G1hgi1 6La9gtVqETSpQXznD5/6w3JmFD6CYMimfoyxnStuhesMe4mZUfmIrz3Mwhgon8pRtP0VEOFMuGM+ pZRI+IulfYWy3V1Km4Oq2HlEg0QZPIlhlYkml9yHUYmoqDCHSlt0CJjjqYVOnNRIxMlfgLYvU/jV RxUjHGoGaXyeTXJkChxKhkabDGrcyBnnuYEFmjmQ4WGHeQUcEhI6XL3NJv23u7BigJjz+JyPHXTE MBRAyi6cSsWsJI0M4UgzMOB8lKbm4/92QWap/G+sNz6rj/Xv/2H3b0r+743994087v1/s7G/16h3 mgeH3f3DQvg3/ri3d9g9aDU73v2/V/Vrj2vzrPc46/8LrXf/WSH/ozGJt/678H0j/9/EYwn7V2z7 kbtngEUGQtDAPxdwgpgl5wK8v2dlfDSN85zDxLH/uljztsiymV9NORhAE4TexWiAMkC7FeGN9U60 10Fj43oUPeY7YVTvjSYZputjAQRFgctJpBx1qzVqN79Al2mRNM4o1V7cJ1XogHSY8Sif1LfEpMCc UhwAte8vvNYiEt/Ikb0hdiLgNmsIb9SpRbNkOBKlM91zRqePUW4fpu/RjIFCDLCQJkcLEk9Ujjfo CAWSJkrU8nfL+rvDJ5ACwAp9NsBskHqJJpEadhbFPNBTlfwQtbpPAGsxnDISvIuGAxQOQ6K5ALYZ ZAafvUKD4O91ANvUswV7s3Wg3vIoPsEYVJlXoCkK2Z13fu28qfFfOfwp1xGEAnx58GtLPh/k8CdJ 8RKIhImE9MaMFaQhQUVOpDKjwyHaQqD/PRtB5BHLpICLzi5O+MEuBXtgmss4SyTeF1zG0ykZ4KP+ WQJBaGF0lCfJ2wqOslGLXp2c/LX36uR1leVSipxH3wjsWtTcq0Z/uk//CJqbNI5xMu5Pryo0drtw 4WPufo18C31VqFOoerCsKprqq0KtqkLtTz8CJvqw5uLZFRn/5kcUWcJZNhXJQqnXxy5ZneBFRhMa i5SpSuffqxEWxtsNJld0bjhHHA9h/SbR3XcccBITENDhHU4rGH7y/CKax29F/MeGs7ecDHTG3y4S ukmZLOh25CzNJEokTCvwnXtIwOjggLcIk+wdcLiEW7qaLGZo5MKcJ83p0CCWK6f8ikeLCT4BL/w3 0IPAB1zsB7yk4Pd6MarMpTxIOfUkaoWpYEqS7xOqn11FEl+lCi0+TPgglc7v8C2O1TC3xSxU7IZ2 OSOScFokUzj68rlL/DqccmTPExP03BgMEWdBysLA4Cx1NplfyAUSzTIuhiHgCt6S3wY5rHxIZhNj xkPqA5fb8oJuvql6ahK1/He/Y6smOJ4N02SEHunpKDkuFnPCr6A2yk0fFaihrcehdMfoDfDeuAzS g68P6cF6kAJr/ANA9RNufSGs/ivAWo5XvdEyrTbe1DpV0sHdvh39SRMwbncNfMUv2vxijVFNR3Ga QSc3SNPOiA5wRAdfE9B1UZ8HcZ8XkJ//Mdj/YsTvoj//A/D/ebTvQIJWZiiRIf9PMRB0CstQREB8 jHyimpA3jf8DirT/oc9S/Z9xtPysPlbr/1py/9dqtdpd0v9t7v9v5nHy/7Wb7b3WYX2/3TpsYgz+ oAHAfrd5ANPY9vL/Fep+7ZFtnnUeZ/1/ofXuP8v1f83OnuT/Neu/C+U2+r+beMr0d7DXPz199teT x/DPq9fRk5+ePXp9+vzZK5M9odSP3jJwVcatj/76ogIiAd2n3o/soAyTIVWvYvgCqQ8FSdmAP0Dm odOsMilQb9FktfAy4wteLXao3k9evnz49K8vSOukPGl0mgh0zGWvGihMURJeJZavP8pq7AZD95y5 HNUpJ8VZkmR2HAZSJw3IOBVqYFM04EoLj8Sz8wVZJMBRW7n0V+lczGdv7HBQI9Hqt0U+d/rElrhb LJ+OuUMVv8H2kNLeOPVIYkjMEj6xw4BnbLGJ+q/+YsauWdJGnmSoRkW3HRmvjEUPWyBFMZXTbhBA 2Bqc+DGamerAVKFLW1bQotkFocwarIU5VsR+avQFTW+O/7/4czHtiWt2RMqYyhToxCau42iKKjYk Jvr7foR1q5Ej/OIrlLyBzKRhfFCS15DBceTRX08rEi+hAkUpnIFF2PqC3ilXK5Yg5xirDOPBL2fE a0Xkp0Tkq8JREMYcvFgrBgZY3t760SsCs8JuGk6/whiSUZgtqLrl7CGL7t49psMKYRtniF0A8YXM meISOFkOU5Grf3eiqaVZ8s6qGEU+N3K4kHI/0ec7pz1TVANk/FWszky540JNr5Oyeb+3UwgXwopQ 4G86aQ7biM+TManp5mQ7AS+pMHAV5l6KedWiRc6q00SiILIHp2afcY48REe4wJW8xdpQaCseoXBx BSsdvmOgWbK0yc6VmyICAV0TaCrV0GQ04Isj0qljWxG5j43ERH0xBTJAI3QFQQWmNZtku9liNKrS SGDF6PbRxZFgGUwo9w8tZWCyBBJBBMhywVHuiWosLxnbfJt1FHEjjUjcq+whsokW+iVwoaYUugAs 0WYBffFNmC6zC2VgPtgsZtInf8YBsKjZ5Cw+G6GxGmrkJ7OriFYHKaqrAtiz569PjgjcmQWiUk4b DCH3PWOtM7RNCnOshPylCh/7pJfdiR5PCDMAI+FTrNDiXPkqZMk5X3DYveV1C5iodQS7q2AypXRS uKivHH/OWPI+iV2PzAk9qKk/F0olNInan11LcQyGjivwGXmCoKdasxvKJ6irV9XxApImBgCa7NDt DeWayiczvFhEiMlHlaMjsausaQtxwvAjcDAAAn+HryxiCUhKU0z0iXmq4hEG354ms/kVdGY3xomw 5tDTXOIzycIC0WvG2CE/i7SvB6rCOtnNXMYzdKaF4meYbAtkOFyb8xRdQ+zsWO6++r8lipDl7w3c Qvg9/ybogVtWeJKqkYxGG/BVuIbwW8YFY4FD8AiXk6A2ZhBOUJ2qEhe8rUNLA3rpqXKOZKC+VqTL kICgBmIGaGnYGsf8kzeEKKSr4+70nu0MMdQfgm6P0YLcmROFOBIsuJFdpfELaQAdMQJDKKMdoIrl pPcda1lvw3C3IyUziHApbCt19iaor+XdqpK6eaC0s6H4CZ0kc5FsVZt00a3LYmvE5yy4TIypaJCC tIzCfWWMd8XJcAgiK0okiDHkMbIBYDMs4UrDNnR6dCh+XiIsWPMy5l2PYRRjhE+IjxWSf9cSfC25 l8VeEW5Z/4wUMRWhiqSqqjvJRWQJlU0tClP3wtAYjfsyuYMHidmV3K3PgHm/S9Sl4hBd22t4uTtS l7V86agNR2Gbnes7xLCI+ukxwkKInGGgcH2WKB4CRHibshinpEwqp3kE/tJinl2MXuli+EuLiKp9 KoYTYM1b1RNGnbL37xuxseqKkKpr9/BRYAdKsN7dXXbGcNayDqkGG9wQ10kMR8r/XtDOBbutiG9y 8qVy9r503YBsxeML/tDR2iKJf7j7nUSH8KjeKiAKCaUoKD1PKcEagTzijXiQ5Ol5ptNfipH0LJnS 1j66YibELbJoQDOrKIttl7SOgAyqSVasoFw0RhUArghCcZLSwRoFM3JqRYMmijPPiFXiYAUVF04E OoQNRDm8eefFRsNTHErDYvjULFY6AmSZma2FIOGduXFOQhO7nZKyQoX8EJaIlgoojVM7Wh1gMWgq haE+AMYRvVUOp/2E2XMCuAMUkRhuBZe8fgy+YmwYj1Zw0RToxbYJF6yps2DxgMfiRMXtN/p3FYCy WiDHI/8NcVm1hxaJt1Da1kAIeLoBs+kqhdfylOLXfTg0jxaejngDZ1ZEMos9zyQ/IauX9K14QCIR 5BI1U0gf2yxvbbM4nZgaWjykdbStJDEq6Bx3kF5YD4UNKY0WRjilVRZzk7JGXtsE7SR8kFMkTnMN +1iIzaK1aNixOluMz3iN2COtiP81nOeoJdnMqnWfeL9SHEgTmkjHXXB3OqZb/V5Wloqc46wh2SMs vs28+ra9rAhXoo+9vEDjrEpFuNJ9w0wrt9XSbVpSdWB5cVVnoeDKZQRVbjNV3UYpBVevwgUM+9bv aCSwRLxladsVcQVHt9zldUvFqaDPrHfiBVfefKj13aa12TBfcSSYmw3UGYhZVZj8MlKRQ5fuqYY/ iEACBwWj79PlLa1fhkEDWPOnKduXTKas3uO6+GIdSvws4tuZhmlvqmefgNBTgNIYfthR3B/PoP5E +KMoETtu5P5n6f3/OH6b1PPPjgO46v6/sd/B+79Op9Xt7jfo/q/b2fj/3Mjj3fC3O+3DOsxBo3HY aHWdG/52C1529+v7rVa70ejs721u+P8XPM76/0Lr3X9W2v80G97677Q3+R9u5jnv96Pd82gX/jt8 cfpIvOB7eFdQ72+NBtFufoF3v7sT51Pu/pxseMH/0GfF/s/5ND6zj/Xs/yT/9z7m/wY2sLH/u5HH zf/Uau3v79cPGk34t93eKwQAp68d/Lfb7Hr5n/y6X3tkm2edx9v/v8h6959V/r+t7r63/jvd9sb/ 90YeJ9gP0MC1HX3v7UQ/EtlY+YmMsi23ooKgGNEfTfKEzBrmyTlHE9T2CGjIxso03dIxfqC7NarM OnaqEDt2b9tKU7B9LFpEUipYZipi5IFNZcnlSJtTGBs3Nv1Ic/cKka9JTEN8YZVHeA21414l1qOo AkO+Is02+hdb9wIEMxmYpZnY8qFlhR5eep6pgNs6KKgO7ZglmMcbPSo5DKQYgmAw7RnBR87GZAZB QMFbuyExn6hXLR1oOkhibcEQKyX8VRaP0z5ZbBSMTqI4zyf9VE8ZTQo5Y2bse2k8ii0/Sxiinkw2 tchoEMm7ZCbOiiOaFAxUibQxEMsJAAGGcSa+jdpCxgRFOsfLVkT02WTGkcSxGQFbwoiznSFCi1YS GAkdMYU6w1HKc4/SK91MXU5mbzH8C11T8mWustlRhHLElx3nE8eR1CZDNRfqzsO2jTni6VTxm7LJ pW7ZCupOl8wyCLqBmeE1Ws7RcHbYaTl+J/ZTDuF6dzqim9Y0EM/FrBNzz2+Rgyld1LHuSW5jyRgF oMKfCtBAR3F/vohH0RlA/3aLvaENyHPdCqrYcw4PlIhtlLo4SjKMcy7kR0QtqNviqEHSXi10Iy9z S/r5NINXsb4qwpI1pElpSd3W96+AXPDeynH4NxHIkvfzWSwOUAHrQyt32Dr55H7f8q+cnMbQDnKq 7VG4V3RQK142bUngfzFPUiGUGAYrZBlt3lEled9PpmQWbNIPI8FwnjZMXhxTBDFAWL1f5St0Vq5z iwzLXYONqoZSjACK+lErdtj2IqPQtGjdJoSN8/INe8Hnhkq2ya5HOlAa9JCzGerBHfoDlnqZEAEs mHeaiFREl4MBRtDX+QukJSEpdxL0N+W8BpOCt3hOKdbdSvRtAukZLFvYCGe8yGzY0B4tHuJfk8VM mU+7VISAIcM0cF3a68Vedf7vPJE1rwes+L1qqtLHS350WYfzOm8COGvxDLjfOAF6xxAassPt8OLf ITCxGzaq4IY8zlHTTNi+yZWwGhaHpT8LWJW7UU7aHVUqBFwV3xboTF3paJZlbKz4DofNFoxNk4GQ rGK4LN0UYGkMmpwwx9ZWl8ZASN1YqzbERgKHRTdCxqzd430zmM13sZcIZIfr3MN/dpiQ3IatuyMi 9FtSyhgYf9za8u9y7Vvcz0hRufU7XVGIvdxiLq3ry5iI33kG2AGDa4kMwcXxrl13bZuQmx4c+NdJ k1liMi6Q4t3e8ZYVxyRfnAEB9XE18PongiKAcOp51iuwctTAHJ7n0yS93vWJ0kqsgMva2WKpMbpR 2inhG4TlEAsnE2WfgbOp03X5uLaGIq8JRhL3GnEgPVhS2/jtKPpmijEjqUhkhWEoLDgiSMuA0LWo MssON1tZddzpUn+EsvSnfDNtG5XRSEw3Tell40T8BzxL9X9O2sVP72N9/99GZ29/H/P/NVrtjf7v Jh7X/7ext99t1jt7nf1WWzR8Bf/fg0bnoNnsHOx7/r9+3a89ss2zzuOs/y+03v1nhf6v0yX9n73+ u3vwaqP/u4FniVrP6PPwVEEuK5Zz5wT1aMZ0NAdJa4EeqjkmnqlFmKoGhRaM41bVqjLLYUdUIw9Q T4aHlfPJZIBpPVAx4Hat/LkwP3k8kvhe4wmFZqZgJGT9B3Cg3w27r16pT6J/M4cYOSqex7Oz+Bxd b0YUrQ+ONNPZpJ8MFmyWmIyno8kV+3OZ1L1siXqd5MMk26iUw1qUpeh5RY9HKBcwetIVdr8j3GfT Yk0rYc/KFnoXA1vYf9Y7ffa698Pjl3gcNeNY0gZQwqjQCKaIWtXKljTAYQR7ILaj0aSxh4NPKNyG P6T5256EQvMs6CS7kX3cWC/js9iR06mSzyY2lgMnoGBZRMVaZRXe1igcKFImWy9LWk0DVKmq1SzK ORTeFOkIytr0I0Wrxapr0OKStqiB7IMyD+Wfc+enmwNJTzl9w8RY1uFZWwMXTp3rpewukoE9wMBU cPgmAcQ+LdnV8duqmSZo1p5plQidjoyU6Y/N9bXPId4oGE7nXgHkFNsdSqU5uWEik5taujPfB4C1 z9rbFo7FgAy8GahHwrMVV2SlCXH4hOyuZ1fsx+kpkkT56qdHJ+ybnOha5QgHYWq9QF+0o8iREHCm nbjPJ+wlpAO8SwtrkOqqJltlTRIvm1peJBQPo7SdNo2OW8goJZmQPL+SN4qu+eVwoIlfXqjAXXUd Diz82Y8EFi5lB/+yS+gRZrxXNQKfnIVoKFdF5duiMR9tKXJ3autDPSHYLeR8a+K371+evjgptZo2 O7QhpOKyRt1DyeyFl2cI3tKC3vevadN7nWfp+R/DvX6Bg8D69j/d/Q4c/EH+7zQ6m/P/TTyu/U+7 2d4/rLdah104zRfO//J1vwVfDxsHnv2PX/drj2zzrPM46/8LrXf/WXH+bzYo/5e9/jutVnNz/r+J p+z8/2dOfB09ft579bcHLyrva9FVNfqd3Ih/ff/mmP5LP67oxxX+mB9/1Pm7nBjj1p2PXFVlEvY3 N/5HKe6VnIlpqv+ck2BBV7PmnkY7tKckmERp9K1pEH7eveveUqtBtGtRQ0c8UC9b6P6j/Xqiuxiu VYVW2AqMBwOf/4uMZz80nj17POpll4O0uy87tajtjvzACSxB8tXXJtDN84c+Dv+ncMCDZFoQBH+M 3ybIHT6tj/XlP/yM+V/2O+2N/Hcjjyv/NZv7+3v11sFep4tpXP0EUPS13TrsdDvNvaYn//l1v/bI Ns86T3j9f956958V8l+r1Wp463+v1d3IfzfyvHp98uMrkDosby7SCwEVsOnmdJbMe5KriBLn0D1J nvdIW/VfW7coH2ZvsBhPMTpo0ouzQY8imbBvfhKNknfJKI/i90muLFq2th49efrg+1coc+ye1utb W6++f9p7/vA/X93/SwVN02LK4oo+/X+pEIhV/AvfVFGgrE+qW48frl0DRDasQZ28/vHFNTrqzcdT 1dk1akKHquaWqgZIhoIWBFX4bbdb3XKK2UX489bLk8cnT06fnbzqwUsoOINpGpKEbX2CuuYTALK1 9fT0IbX6+pcXJ73HJy968OLlg5e/QIv1Fz88f/bLEZmA90dJnG1twZ9HUBjKwHd6d7R1azaOdofw VgFljwFLwj8OBO4LgBba+sag5Sj6pt6HIj+cPHh88hKGdusvlUePsBLTRZUcEh8/fv7Tw6cn6Hv4 l/+I/vItNqHnZM0mXp0++77YBFU3bRWg37o1OfuNzE93dwmTcBTaza/G+f3iOL+FlmVw3KweZREH azWLJVWzfndHPg1t3cpgah4USOufUXz5NrpzL3od3fud7MCiv/wFzj/wn20c+PbHO9F3hS6w66MC WeounNfLuwAk2F0gjRwp+tHk9B9bt+BINKOpkU9fmx/+X3vWk/+Rd3+6Ymi1/K/2/3YXZEiU/5ut TfyHG3nc/K+tVvvwoN5q7O3BFPjpH1qtTrdbb3YOD/b2WoctL/+rV/Vrj2vzrPeE1//nrXf/WbH+ 291G21v/3f1N/Iebea7p64n3/E+0cdYsGbEfIjpHUDTsbBB9IEm/7viAGnsuipGKNgJRno7TUUwu fXMKyzqZRf+gFl5TC8aSAW2w0M5fOYf9o4fhs7ko/ykX+ZyWngztJVKhJHZAKwcJVx1Fp1nUHyyy dDid1qRJjFgJ/5+Q5YNY8edRJamf16EFHhr2M5ml52lWFbfJmXihkQObREcHZJCjHh52KuP4Cj3V MuXAmY6uqgwAL7sa+ikMOOw2BqyjRIrsa6IOT9QQ++uJK+R7caXFSnzLbJxb2O3uyJjAkf+LCmWX IArieaLTU+QX8VSbxGFGTHLgqmQfahFGuEUEs6eehHecc/C98wXMm5hzyASQQcec/g4aIaliXMQY lPHvomUGlw/YsnEFtJWg3MKW1YUVc1Zfv5vugmZBArAL3DL7IOOe4MJBTgpFkzkTZlU1vb6xzz8s xH4oR6wq9sFD7IcSxP6jDLEfroXYD8sRKwC7wK2H2A/XQ+yHImJXp8bg2SAnMn/u2bnqNa74HVz3 GFNPnNqK8cmDAzJ18aRn2XxG6h0glxy5uH1F8fAjlObCdoyxA7j7BHhbta5CmCekhckpyTBH/iOM 1by4l87sOpgiVH0wqPJnU4ISonYn2hlhnGSFqjUxZar6mJJXClHUuHLMxUrXQZRPULelcYMnVlB9 MqK+9hb+Wc965z/B1CeKhJ9w/ttrbu5/buS59vkPZulgD+Tzzub897/hCa//z1vv/rN8/bc6zVbX W/9QeuP/cyMPH+kePf/xxYOXp6+ePzOZ/tzgJeYEx9FrMK2UTmpHwR0oNTAnw1EuzDqTjtppKUsa HUy88Pl8jsIwAir9jQobdOS2MAMZBzPKUxCRd2ken2MuKDg64tmIGvhvTOtzHOVoiR6P5EynwefW EIKS6looSDEyTOUsGU0uqwoXdHbjsDacGCkdso38lR32xSQN8YMGGHcpSVeEMWkoLASOGo9mGOmG 3NhJKEG8qgAEBN327e0ov4Kz7XsF0sMFZwrAGxwzSQQ2DXOUvuXjG8V/yO7MMZAPzJpVmCOqYGM0 DXEWjybnk0UOA1Cxc9jjPnkfj9NM5QPTKQ0JVXIeFG/3/mSQ4E3hkPIa5Yvzcw60g8dIheEUCQfP mGZu4xGdbcmhC76kA4qOg/OTZiPq+Ti6mFzi1NbgXA0f5osMyiCq0U0f0zqR1AsInecqKnyqIzD1 Dw6FfjEdGCIDZw9a4fbdYEU/4Wk7EkM4FVjJBr4euaDXpG0AhOL4xJdvL+MZza+0UlMpE7C584mo TlRmROBEV5RQbS7JsyhKUCWd38lVHKkRxjeZDOdJJpHlrWBd43h+sVR9o2z67DFU4lp0hlEQ4mr0 LZA7JS7YbVajowhffSevmvC7UVUaIAmgk2buZFZOn70++f7kZQRtqj/PyPnvd6Z2dKGIv4UGRVYn fwP94TvzQb23TnE7GCbGit5jd07Yr6ALGnZN/56J6x3+PUhG81hFRWBKxntuwrDtOxNVjKoGjgeY iMOjY6C9XOI05KP0/ALXuJcXSMdjoDGhD8iZE9qnQYAQSHC8GcZneeUMk8yh/9zr509PXj549uhE uxnFMCln0S6Xd/Em37+D73e9700vGsNHM/fM6U/Q6e9VZR6fV6PfCZNjNEl0JvPp8+d//ekF0gcW gxMc/z7j39Vjjr8/phRCDd01vDj+WOgNR1fenUyf3+HL6/RInEfHrDL6s/nlJHrxIpJto0bLDGNv WG6iKgdqPGatmFKECYOVFC5Hkd4DMMkDkE4zitgugvVx5OCq8pjMdSv5sZ24jR/c+pC1O3ksMDJQ TodqjLOBIbzEdcf0G1HewSjQLwFvAc7ZdbxNsydpY8h0Q8LIkHNkrA7z9OvMShaByMVjuU01p88e n/y99/ThT69OXnaqSz/vl39+9PzxSfnXnx+Vf3t9+mP5xxcvn7tVmfT488MXTx+8Xvb1+bPyln84 WdLty+d/K//47MVr9n4N9vr985flIP3jl/Jvj5d8+8ffl9T7uxj9ok2ysxDHSZz1pkB0k4FsDIrP BFedcNTHIEaNz9Jzyflh5U4BBtvH3D45rEp2slaJi/TqICYs9MmM9fJikicOhavViarzgiujiFiy ACghDLQYo0tixLmOSV6sqEsE2NuYtWNWzFGMktUZxtfiVGzW8iU1aNzH6rQIJQ8ZZY68SBYzHFW/ Luy+gEreWy1Xs4FgiR1aAYTSb6uR7nB2ZHwXyWiK9lnC/2xBxZ5T2Eho44PG8aYhUq+FC5okPTNM 0kqxMicgk+6KyCjyG0iWtegCdj+qN53k6ZyCmgEarL0ZO+gxFmFYPWqRt2iqT39hI/JnaN+Ggk1U RIMQBGeKZh0ACWyTuiUsS2Bx4buhwoI53DepYRB0bt+mbZbryu8z6zP+0l/RM0Bw/rK42eCu4uw3 LNoZqsLJoJMCI74WYcwEvoPiQHBXVhhN2gpgEehDkvLXDWwymO9bkq1yc2muY7TBmUNteASAnnZu B7OQjjn4KHzbJklim5dImqkrNxKPoOvvZ8n5BPqk1GNJNkAHZoy1NcJJoqUxn4CkFGMiL+t2kCTx UQoS6gSOFleURtzcEKLgzqOmuzsQ3ZW4qwjVQadKuUvROfsXCUbFUkdNKKCOJ8QRaLegQwZvDVaW xSDTW7IpYhw14pl6XywsehZk7FVvNe4ueeuDs97v2+u9YadPTAgxeFdZi/iMI/O3S3NFMTTM7Czm kuN2FPffGoFUzRrZeFoinr23UgYl3ZTreYJtBFd266Bei9rNus5BhM+1MUGDHU+y+QXQAcfT++c/ w6zksAF9HbbqlNXo1qf2lVPKX5D/l3fW3uvi8Pb2Pr27KnYXZ9lCOrMvqJys3kRa6wq0bsRVO2Kk imGrE1QDbz6DLfMCT/ie1KvYCKWBXiXzMu3B32LXy1T4JaRcrz7qlKgvXL7cWUAUVoiQa3RZE5It VnZxznxdKhZzYQoSsWL9y+qPe/liBtIERltQfzoCniP+PfGkP+fjLy/L5cYfl4mjjz1J1vv4yxJB dlmXp8+WAvt4KbRLvgK4S7/+suTrD0u7PaVuiU+ykBY9VzEPMCww0c0Rf5Hv35OyDaNcA1NVWXhR a4ghK54+fHrys4qOjC8llAW+ZmlPWlEZMC0rFXunvLg6m6WKbmtU3VilYMGHQp3SHAqouJc8AMHl YTTt4R09q5MuSWs34DBJAhHHJ7f1X9R9qlojKJ4WOx1PMH0o6xZZXNcqKzywOwN8yAnaZxJsJIvz +ZWjLzmKhPYJmDPMd4hBykfxFaUtB8Y0HC3eS2vIixig+9EhPLWoBRy1FnVqUb1e54SQ9EFlglRt U3N10by6A4Tp2+mj4LCjbYTUNGJPNZVjPsOSStX6FpVqZLJDijVpb/I2JnXtQELkVl69fvDqB9L/ /Dva7NiI+ZHMevJ4iFpIyuXOgIMMpAKnxNmVwvLQMg1K5xI7ndqJM1ZOU0GMHk+tiCgUjy7jq5xz 3iukMwtFZIspTsxBjnfYfTSdi6A4Tt8rjSfmtHSq52HOb/RWmrlROOSChAB4JQEBYaVVeRYof7ak PKmtdB2Qtv+kW3AUZazkonSrJHU4VeJglWY560IwSk/ESz/+wF9Dx66V23Pd30xpJ23h7tlaS3u0 UuHkK36cvdHKqqszkuL0aws3YAtAG7w3lm2PTrzhadNNPzpt8XnN3jc5IC79je7NNI32Tup9b3HI nyVCdUB5VaKcYDH13j0aPPolVbb9i6NdS/cgwsI3A/jfttZwxjVXw1WTRkHq0+TtllABrI0EByOk oEEfS4djCR3hwVxzLEQIa45k7WHwEO7dK+1f/YW9b3uGV8raSo0Y6bWnSXylEtIOC1xZTQyMNNOr c4/nJlDVNCy/W5w4mtPt4g2QnXDXybe7U7Xc+2tRVlNI8lP4Qhf0LxFBMacqGrXRHy11whNSxNzB lF8YRQhsQBFpzszZS6va1GRTCaifsppdtlWtVgPqJBWj2gCAexfIBum7dICHFUrq7ADhp1xt6oSr TZ1A3v7e0t85BkEh1AGHOJDVS+gLpWltmmgHhNpQmZZVxsUKzivnCUZwqYESfHz0qdghJ5LnVvHE yGKKYuVGbLEiP3aqNluUl2deCU0b47g/m+grwKf2/saqDWffIkvf8RTkrTQvJlafk3Y1zXx+xHeJ cm3jdLH8lgjOwfCdjr1Ybq1bIRfeFddC1+kA15oL+tVUArnnwG9BzqXm8CURGwmRLKj3LhK8z8P5 Jd0InRh8SMWE3KlRj4Xe1imLbP7P6RDwED18/EsPJItXa9ddnA2uetfpjCqcXaPC6Lo9jFQPf06A Xwyp3hlM29tjD7l5ej6Op9dBLtdYD7lS9pOQK3XXR65dYS3kSoX1kWtXWIrcaZ4sBpMyrNICkJa5 ZN1cL1hNAb7ixWi+bE7Gad6vE+e7FoqpGiFK1V3VhV02NOylrJmURdeQVtlQW8RV/uHJq/zyzC/B 4SAtgRV49NOHr395caTyeDUbDdy4z1OMlwSy0ZRUc0NK5pT1r2po5UGuH3iyJ+UBK3Bh6+XYmVph G9rXhYdF32A/zBn1z+CeFm6LjGsqt7E1GBruimfyZ8nGuLKNlmmjbHMtnT1uifH+GC2hjEDIP8+q /q30EvxcJfEsimpn6q/1R6RaIC00tcB/Xb+FQXwVMQz81/VbuMCcI9QC//UJo0izxTyhUdBf128h TzDnGrbAf60zr1/bqHHzrP2sZ//vBPa4tlXw+vGfGvutbuvfGq3Gfru5sf+/iceL/9TYP+zUu02Y p/1Ww8//K1+7+/C1fejH//Trfu2RbZ51nvD6/7z17j/L4z81m82Gt/6b+93OJv/vjTzLXb0foAGK yXKL1NDLk3mlqg2la5yJQ3yI02w4i00oebmT4vywkuVVZaedLmbTCV+V9eNRf6FsRTBFH6d5kDbJ +9qyW6mxU3M+0XYz5KatrAZQITKIU0phG2fubQcnW+P8oXkCYg7lgJ2Qpct8QhCGbGsk6wfaGVk3 +hXfVVS0Pve0xp+t5NEN4dwY/SBAIA/mNdToN+ooevFlDhnx80CHaTIa8BlA2VGPzqALDLEKHbG8 r+S2P6U5LVMyZKlQOZDRbEVuo267RGNRHCUXFcdRI7+bX82qFtKdLhRIbC1ibEXTMwLpjO6ByO7m HpxIqnQusW2vsMT9qFVFawv50eauCMUGQGfs7mEAGZT7Bl3z6RChjwl7HUyJmPRzSwHkGcAItghZ rH2kg7U2fuFDsQYdGuvNJ9DLVUUXwRfYSYX6jnaj4hcDmo62yidapBWYdoollgxU1kwCAeBs7zWg JwVCTrH2t25hO0oWh9502/rd3Wjr1l4DT6z8mgV/t6i8u6s9du0KdNZwitMbLEylWx1TFk82TlF8 cVdsgNo2FHSIcoGgV3fJoKbZwqIyaVVVic5uTh18U4VzkMFk6QwhwtbHN12M/6vi2sdLCOtfFCWO TiiKXv3t9PWjH3oPf/perJWoD/aBfmJWrtWTtfwATxIUmVL6ZsAP9Xu6cSdmGKOGRuyXMvqDLQJg j8jTM9o+8J777Cpa5HSTjgnkEzu/rd5ZLi8mUB6b1XfaJtUzogAZOEIJjOoA5JKGXIIomBmgWTKO UV9GwZnxFWpyBOp7TjPM26S0Veobr5RhgdTcXavSvYhMY6teDUDsI5tfRS73UvyRFNqEYWFyWh1U 4GwNNaXoCROPRiqTub0U2h7Xo6Wx9kJqerU1O1y7hZbXgmaFn025H0VZN1Hp5LWpQVSRvGJkgbrI k+GCErX6VnXo78epnVM08kCaYcLk3duZLWNSYUcLUFRW3Cb8/U0vmkeyaEgOK1rgsk8L0xysDTTH AQkCLUA4XA0DyP99xMIPmYbMErr8p4TdGbrCnKVztN/hWib8jm2/lythMBVHvciSmfrJwDYgeoAN zkyLKORQwutLZeHchPH+J2GRFi6x+wbi+OJqiqYxsKrJTAv+5CbzK4yvGV3GOempRgmZPlnWhOxT d4Y2ryx5xjOVcz5PUQ0LolUu8W8oy7MSPSdZ3cbTq/ksRQ/Omk7/O50BV5kCRD1jZWunSjJvKeXw oyfRYCLZoXZQ3avaIVNrdMpk99BxjNdSc+UyGYPgTEMWlNDaoxEk0U8/CrqhXc4kDILjtu53m6yd Tu+MyVxIydMV5cFJhtL4hk3AsDcBTpuQ8he8dgMAlIOkmFyPuNhv8YcPTD3/uRjZRCjsmc3mhulw niTZLrljoj67rpeCxYnTgWbAbIrLJMzycbE05n0DPtA49t6jVLzXUEYktLaynFPCYQEkqlo2SuJp DeC8qqU5/q3U9pxqTqhakSNMS5PPNBRQiuUUAAttqbAyEyqr6DPaL7LJr80WZkD4HYOIRO0m/Kd7 CP85hJ9w5IX/dOFd8wD+02qCmN3qtOE/+/CfdgPD8Lc70UeCiZq+HxlpR5uA52aNIBD/bu4I6N03 ESBSzMd5jNCMa0Il5ZrFco1Quc6S1ujVfW2fTvilQ4w2XmgdAtKeJGewcuIcHXWU648wgwF7Ow9M jjF8UxczB+mRILkHkOyqPxH4u/o9UwPCLEDevh3ZwuW3eM6grYBa3N0lgDPe+3mcO0BU3Sq6UNI0 utJq8w18cISuJhbNNAkhpWFTWkKjtneIuO9GlkS3QxSsXolMuEPkq17yArDlBKZjHbVInb7t6ESW ycws6fOWYc6IOPL7yhqI8gr6TnSmOJ746nxbUlZJjJXtCoypsgrKgtmuwZchZTWUWbNdgy8/ymr8 EACK0VsG1GkRKJHn1VJwvrZWYuWx115rNVqKVVbipVhlFWICcK3CTLFKETWuidfX1mBtns951rz/ 0THeP0UZvN79T3uv0+zsd9sNvP9p7W/iP93I4+R/bx62O4d79U5rb38PA7MW8r8fHrTrnXZ3r31w sN9x878X6n7tkW2edZ6S+5/PWu/+s/z+p7G/v++t/+Y+soTN/c8NPGX3P2QwZcgAk6dKFpC8kGSV lP+ShdvJdS5m45TCluzSVUrb6rH1VWWxtUt4OW7t8n5a22A1p5Bd2053G6ypC9i1JAeuVcFJj2sX 3WZ7U7ZxVqlzCT3Rt6G6/M3P8MYVA+l2f8XSb5QmTPrE0gRbqoCxPvrZ1qlgMQ+7X83NxG4qWe8L VZwc7VYV8165GOg6KD6rwiVHDr8bkp+X1cFTR7ESSNDLKuHBo1jph6XA/RAE7nQ5cKdh4H5ZDtwv gUpw8FiOusdh3C2tRWeTIPaWVqPzSQh/S2v9EAbxdAWIpyUg/rICxF9C1fCickkt8ogvVHqylJae hEjp6cuTR8sq4fdANYyTs6waxdEJIP5k6agwmE2x0svnf1tWCYPcFCs9e7EUFxj8pljp5O9LK8Hn QKUXDx79dVkt/B4a1cnTpaM6eRqa4KVz9SQ4U8vrPApWwqAUS8eE8YyK1X5eWunnUJWXy+u8DFY6 +fuL5fP0IlDp4cn3y3kgFQiR0ool8iy8RABH/7kCh/8ZWvi/LB0bfA6tYnJgLl/EJz+HUP/q58fN pcjHAiUVW6sqtkoqtldVbJdU7Kyq2AlUfPXy0VI+hd8D1dDzcClqqEBJxaWooQIlFZeihgqUVFyK Gu1FGajYXVWxW1Jxb1XFvZKK+6sq7hcqPvxJyHu4bcLvWfXoe7HWD6uq/RCup4m0rF6YSA2NLqtX nAiUUX76cVk9KlCs9+DRo2W14HOxzgqMhPGxotLLMPZXIT9ca1VnP4R7wwh6y6pRhL1ALZbYy2sF RHaMjLesEgbOK9T5xy/LqvyjKEY/fLy0xuNAjX/8fWkffw/0sbTG40CNHx+fLqsCnwN1/vpqaZ2/ vlJ1MLU3n//X0//6mUCvpxVa3/6/Df/d+7dGq9nZ39/of2/ice3/WzBDnXqzu7+312q2CwkA+Osh fm039j37f7/u1x7Z5lnnCa//z1vv/rNC/9vpdjve+m+0242N/vcmnjL972NU85EJwXnCGaHFPk0Z He5Ayd7FYGYbHpIdBL781ZHe3/hmiJVW9cj82HV+tZ1P6pe+dMYOlPU7Pvd2lDmgZUJYaTqNNP1G 0MRpeSueGSFZC/bGSQ7b7N/iGcbwPKIglmxpOZBkbP3JeYZBaWscMJUMB6GrbQqKGJXg5ngpbLhT Y6ghjP2IHSrniDSLLlXcBtRWo0UhTBRpZ7lI2Xyxwb7UwfJQXLsI+zCiSuUN2wFtCaIW2TSmkJsc OUJhzJofuwHUar1RZkKBigLAfWPI4zXw8vnf3kTfRQ3B0u3bhS6evXhNJRhCaRAziweb2gnWVybA AQBO/r5m81hQI1KVM6hbjiA2rLIL6qlR9j9qIZJjFs9xDxBZtjBrOhCnWcs7VH82z8xHIYSdbDHu EUXhZ17UujRIlZoLKDJCkN1KUsomQbtwIXqWSdYQm+SDFN2ZONKA7Bk5PB0Gj8PiHE6L7BOTPE8y jAItMbFMUCu0qkxzshKnFTMcxeeUbiOfuIkOMYeIagX9haQSmV5ifseMYunG83kynpKZ7HQ2wewA hVY4bO3ExLodAUgUhwX5hopaOZ1iuKKedFOpUlhK5RCV6oyZT07//uPJUZS8n6J1HIa3xpDNHCnO G6oO2YXtprluehmnDpE4rSCgVKjR+/H0FeZM78FZ+EEguFrpEl2vesH9HykGoYddOL/okQXqUvBL VhHpM96UtJon5Kr2qe123rDdYRnQGEvoM9r+Jtw22jfPgNjWBLyEc9seWDYfwR7OZ+kAzYA/BXa8 dXhTbBIZ/CoCLGuSATagyqaHa22IkawluLvyRRyOJmzhTPlxZGXUOXMMJkGleI/EDMjy2c5gqo2s vTaQW/yJ1hS5s6hB0Y6MIHBYYBWzDIvs0DcfWerlr+awTrj62rJe6Fnv/M9Rrz71FLD6/K/y/7Ua +02y/+i0N/nfb+Rx8/81u3sHB/V2p3N42G41ffd//niwDx87jaaX/8+r+rXHtXnWe8Lr//PWu/+s OP93O922t/73Wvub8/+NPGXnf9rWMbIYOhzYOX49h4NIwqLDN3E5uM/xjPm0wPZIloJAlxMXdcs3 cVkgPukgHIAPuiy7YzleWfuspLaE/Q1FO1vWHAeSK2nzp/VA4thyZXCt2choGSAvr9FGKSDSiBWn TUdqK0xqMABgsGsV+G/5tKyqXgb0NSfViQ74qRPiRAz8RMpwggiumJC1GikDZK1JDQYedLu0Iw6W eJvwrfex2wn/COng8ORZNqWkZiEH+9u3S+0yMG4ZRiFfo9gBPMCgbtkjMkEQS8ZjY5+UOeXVP4c0 vaiK1yUoL9Di9cmAtZK+Puep0ILN/ItbhSgQyqmBYsupAAYlk2RKLlU4eEQqGj61D5WZTVmbksoo gc9OpJ5mFP1A3DGqjKuR8xxE0Qs8smPom8pY0j46lQ+hMueF6E92KbEYJTjFZhtR9ArXZ1S5P703 3QlUbraggx8xPkyeqPyw8gHafcXx8APVQIqPXs8m08mU3Ll1xWa7ibkM3qfjxTi6TFWSlVALrSh6 MkuSD3hWtjvuwIefpph6zE53EWih046ip5QewS4IH/b34AMcMuYog1QGyXlo4Pv7WDs7D5W6Z1T4 8SifwLH/MhpcZfE47edHUbTXjVSXvKmZGoaf+TELPBHk2JT0YxOAsDy/CBXsegVVdowepbPozSfT UK09P+DMJB2Fyh145aZCdqGyh/7ggjuyDYQPe1gws2oAZfoxIzBOEpBpuLQPkuRyCBZuN7zCc03K 4fJ++ApE9WTYi+fjSe7V8HYYqUCqVq/kx39R9c1nP+vpf0TxTeH2r38qXF//I/nfW429jf3HzTye /UerfXhQbzU6e+iCRSoe2/6j1Wnu1feah3uH+/u+/kdV3cOqG+uP/ylPeP1/3nr3n+Xrv9UEBuCu /+Z+t9Xe6H9u4jHp4/P5AGhgaQL5LeP515sCaSR8/4yqouGgtqXyPj5RznSRdqvj+xFTHXdVzr5y kcRTTOPBqZv++qIScZjG+yjJ4bVLUgExm44yynsQPeMG1gvd3X3TITWn2i660nm9nlZw948Hjpsj VqnpNhQQXNheIMGC5oDEw93Cu+AjOf+w6ySiaghSNQ+S3ln35M9+evrUXLA5/Rk01jwkGn/MzPbH xONXblCOjXD0kqCboao6oyh4ISdEOUthVBqdidlOKkUXdDNJLOKl0iPxm5Fo1dbJprD5GgHmYFRQ SlYDs7nTPjX43/jaqYx2DZMhppnaqdb8bCe6tYzS1mLKOM4URxllMHyNSaxEAUVhm8vwKjZX8COd YiHEEGWhAWqteADrccpNYl5h0BhMfFEYoyRAfZc4Nga5ufYcpRma0BCYkvo6ns1UvCTpjwDqT6ZX GFtsOp/1qEiFe7zNE5o5v0qAsdtDUpUmGoGidj5TO96ZRJLNMeyqmjI0eSDcIW7jwYDjS02oH5Og V2NN0XPNouaaCqdoSNp7VVwTUC+bHMuPWFIU9ahh+JVkg95M/HW3jCNzDTp8p4j+Hz04LgMNfKB/ 8c1reTPXb37GoELv4pnq6IMk/J7Tv+pthm0e64yi+TulKWvK4npHcaCYC0QRd2i9mPsvtsTnmAZ5 v3HMo8XsSjgo+YlZlhwNBw8Yh/crFXij/XOBDl9NKGZuMhrkSCWSfllsUPg9xwJTljMSIk6fsJHX eaYpM3QIVvYA1a1bv+Oc2eZ1+dt0OuXGxMCGrCwoYNn9bwa1iP8fbavtZlvFqYNVqwARGPFCX4zv IrMMHVsTB56yosqAZK3CZA7iDvMYB4l5ONNsAXvBrY8WkjF7NrDHeB4ROSrjOBiMZRUlAdreJbMr LkbRgzFX1xwaMBqTy2SmCwM9q8ZGcc7howpaE3sVYBwroRpSp/7zn/ay8KOLOqBbfZUDDoUU2PiO 58jAnl9MLtEUrJixCnN3vteYYYsw0i2m88U8sevMTXMmJ2JxyGapWwOmdbIbNWHcamJnSzLXmTUT 3Y2ab4irF0KwklIKU6MLxxNuzkNA3C0yDH8GGxCnMOec3TNKSu0uI2eibt8mo7AerhXKIEh9b90y JOZDYe3TqCAz84MM+D0mBSVaGqazvIQES6FRi5j3RGZbKLohXN4uoUtpdoYF+UfFlZ900blddB4q imWhM0tGoWEgbD2cWsX3C8VwWZhSmG+0vCVuxqxdjJ8K85UQZTPCarSVIbl+AG6vc0/LJv2eGSNV 5m2Vx92DShX+U8IlGPjwvvW22j98QTTySn9QO8gH2Wisruamq3mwKw4md3u+Zl9z1dfc7ksoQ1ZX VZEfUMcyvKvZoR0RfpeX3V02zXdx57z1ToRW+ufukvJQ1qwOlAKFK9E84cpki+7zxSie1UhM159B tgTkzB0JzfAdiiQfW4EQXUlyDuQSn8dpVq/XC6wJEZijCW2ax+Oz9LxH2NXUoabunci571jQZdFB b6a02vszEsYlkfI0meG6lMldYDTGUTxPOHIssF2JP5plvM+RGLUT6YiN1IiEy7eGQyNlVkbBTScZ BpYFSQ6j6yOGuJ17+I8AefcuL1fB+SzZFXEeA6zi7icx/9W+BSQoUh1XICO+y4QFkVysAxW2JKE1 d8gHAg9T+kgQBc8EwDAt4M4nEkeWF7C/O9uzf8ywTAgFgJpcQNapweeMGLRn1HPDMYSxGQyBsx2N JpMptK85dWymgkYkG9WyNbBLVrY8BMoPrsg2ny+GQ3RKmPRTynlAYpsMgbKgUyYymDiOrs09Mu+g I6rwaEWJAV6tiwqPnq9RFLeId7i+fIbub2S2wKSY7DiZx2TfzVnXLZtPxWaFmWcfIjtpKo9B3Yfq HZuLzp2i8yVFhdHcJjmgfE50qB4j4ZcUtt6pFdvTRwbNHaSV78itgPmqWxo6kELHAaQVt3P7iIf7 A5+k/FmJqnZrnLeOE6prnpldcWxjr+XV5FMovZSCFEH4l9DeqZMCpjoyUihSav8CD2tUhIUubMc3 W1ahhfFv3lq0aH+s5SyrDX0o2wqegMzhh8jCqbetU4eTy0PBx4HoXXiN4+NAFLqttBqPxHYchUpK JaI5I0MUsjHX7kEgCjeDsPXDreJGqYXYbT3qc7pkVO+d5hvB5s/5WnyQhFqEQT14/Dh68OyX6Mfn L0+inx+8PH3w8OlJ9Oqvpy9enD77Pnr04NXJq+iHk5cndWEAtF6sPv7E8+Je8X/K0VPY+lH0TS6n y9DJ0j0nhg+Uy8rQOdItYI3GdxtrlhlmUHC2op7N1qQY/YqnOYmKqpOXdnw3o3DgKGclKodVGgf9 QbNAa5nhT817XDbpikkiwocKFjjkbtNmZxTRXywS0mw4sVnYi4rfGJSDFsZ4ruv3KiJTkIVkdRln U7aUARGfhGWXwzJIlPpoNURUrAASRoleCpGOJx06CmiYQvi0siBhv1ZOpGJT1MRSVi0KwrA0B+sW lYNKc4hyC2ZeYKF214jf4ggVkJ5dnV3N09gZLU4UFdYEi42Wfs7oEtkxhE8SUvPdzESdd5V+NRiV rfwDNvqup4rQj7n9Y2C2b6skYNoqqn4N1C8di30wQQZKWWTxUK/OM3KWMZsAjgA2mZ58gD16Xjhp WOJz1TGuapj1bzCBWkfzC/kAKznNu4L+8Z3FDkyxN54CQyPgXejIqwrPS0o5Z1TMQUP+QAj7YDHF RBK43U7jdKY1l/d2WIP2Pu7P0RFP9khWXAvGEadDqDSSzBmU6GJ3l5OTsWg0YcB2oiQjmzB2QcoG aT/JVf/cPdmBCQzqCGUykaH6STVlV8d8BDSEiRitMA/LpayvhZVp+c5YSiq83rfpTL7N3W9zof9b gxD53Y0052XLR11KutgRWtiyZvXdCm4+sGbXHspS3v4ty8Ur+H9AQs7xSAlilKAWFY4pHpE1Gt2l 6JKeuzDnxW+D0KA+2tHUm5Y3nSs6lfhxSkEUTrA59bd44ToOfsYNd0vnCFIfq7AWt2w7OP6rYf2N GRqP7NXflOiulvWUzd0/Kv89lTVHObHO6VT6QROxds67vEgkk4rvWKv4Fnni0kUXnr3Za1hZLOZR 5dnDaFtKbkeUOGqWwOrR6jcVCrZGwiU76dqd5tO4TxwzjxZZikFnq+YiKsQpV+0qwb0ktH0ARB/g /3POZwR8QzTBjJhJZilciBQdAWz10XbViZb2jN3PeFjWRnUo6Y55nimZDF6knr1LJ4uc6QgmLp2p baiCY9TJvfIpDLxq9ibWBYLADgMErMwDew/0aAipMoxzXKyAqysM+ItaLcwxRDoV4KXU3DfU2j2u axhxJR+RYerSuvd03c/f85ZveTj8oGL3T/ftjnAwyKn/+c+watYtjeADW7QXqSOUNf9V3VM3zx/8 rGf/iWU+3Q5s/fhfe/ud5j7Ff280NvafN/G49p/tbme/We8ctPeb3eZBy3UAbu4dtBvdervZaqMH 8J4X/8uv+7VHtnnWecLr//PWu/8s9/9t7QH5eOu/u9/a5P++kcfYf4Lcm88HaP95PZvQP8M5AIV8 tgqd5JVhNarAITB5WxmSqdirk5O/9h799LJaxdIg33CFQQX9tp6eVHUL+WU87WHmhtz6s5efj7b+ nIyseo+f//Rwdb3BGdWD0+ifOdnnMz6U070fWlCa1OR0G7b7mOFBE5Xdx9yHcoBTSipcF3mkQm+R eQqbYaK+TtKXj9GQYjqf1bhZBIbAIs1ynEMb/71IZ8mA2+NE4ea2mFvGfqJKWk/qUVaDE8lIog7N kjto7gISKt1FxgM+pUgMJ7JgpQaUSS4rtyiXxw6CRD+ltI7dxG8fOmk13PwZdsSwDHvRxrrQKB8z COL7BEIFOyYE6C5gqH97/vJx79XpP06qII3qHyrql5fU43708uTnk5evTnpQ8OQlzItcGejprXAH hAPL/FCgC1wGEXLgENyL55K+wrJbRt06D8/JiSGflqCGMAxF/DO6jrF1ywsUY6Jr3dthamCw4KQB x5AaxbwiPzZM4pkOr4SomE4lHUeaRUztfPYS/TKvuEHNGwIvv1cnr6uuoabqmKp4Y7IHETmQL0Vt wRB8JeakWBn2lF62HIO8IOPoxQt1RYaGdIQ6TCl5yZf1gjW0doB1Gp8nok+azibvUoo0dmXfIjNa YZinTypRZC8rxJWDHA3ksx46o/7w+KWHTLw7xYsn9bkqtpplrdujdJpHJCxrX313bM8dZTvp0XDO SIWASiLWqq+0J9d41lhm5YviXjEpJfL5bNGfo55zd5ez6NJ/mHLHqBU9o3TeKd58Ac61xSNwPZm7 SjzEUzxeJcMxez7TJsMm6iFl/a5SBudsPruqcR8IjdKbul2gZaLpgPRJCLQFH068Cz+1hCYIsRho qEHDT8vKnS+EGRE8aTWVpXyhArbp4gq6UTKc47o3V3JEfWjcBkOtqJzRvqJHDM5ZdaAKay4auqpH rqAVDmqpiwNFTaWiX543yRSz77y9tyYCFr9UBK7ZTJ+z+y76FDrPyof9QlOkZiLhLFNhqlSe3CUZ oyyVC8csGMFs9qbTYihQp1so4ftzWN6lbPRMDhur2hkOw+14Pqc8ip6kcXLb2NbXb4CwwP2uYiSa GyOe8YpYFo+s7yN6icvUXVQ1ZxGjGRhdu80xvTbFSyRJqMl2jryMeET4ukWvcaWycMV2YOP4KsI0 25iTezZbTOdUA9uq2FnEsakGRWKD9XAOC2GM1x8YZVHZUlbrtmATGFQhCZnaQ1DjRbtjzfzZa4lZ gs9w1XogMx5Vran47vKkYsx4m1U1H3z5rMxpeDfW7VvNa3FYLZbgVhCArNeyYFsbPNODbgg/WK26 UoG8NhsHxufV0QlpJi5D+C8ZuMWjCgN39Lk2HYf4AS7MdRyf2DPMCKv9mkcSqHJ3RCTXTapmmTcM tPvTcKCUzv3JQuwqta2OdnmirY44nJHGGpYEdqz0x+J4BUvYmpX7QTonDFO0CyAwGlBBoexPL4jP uy3NO0ShbKb+GYoJrkT++9Yt2xDGtkqXndOEHYZhE/9DSxgiVu1hYXqxJHw0+tPsixmYgTmKyscM 3/Ayj3cPKMTWAWjsNHMCD3/cUs5obFKKkSwUa4vJxpKz1yeWkEjN2J5cYs2nTChofnZ8g9GCz1PA cS66r13vAo5zovcnWlpBIiVmNSVWNbL6zPJUKNRk4KcBNMf1gWUXYkkZloBYcHD0TUmWdWyZ+igj euvWFSfWnlQUnZQ9DlGcvn+dFVIWQnOFhaxLuvkL7dFGd93zp6ni5C8sJcyQpZV3KlKaCRDKH/dO X5/8WHlfjf5ridh/+z3x9jIWHuaIIGKszxHJDgxFFy3BWHwSDxziV0R/wtvCOdJCaA8OSv0FmpAP 3Pf65KV63IH9PoVCWY/+YGc7QGd8yX+m9vtUvcfaS46OvnveTLzzlAjArimjyeTtYgq98R9N/VeL Yc4lonVNyuO7ENuPIk85sXzjNb6x0xQvcIGe+8mMjhJoyYWyKRxOrDi26ftEn2+EPe3cI8nY31QB jx2bbxfP9obe7BFWj5edZ2+7yFhChWGQmp3DdYGyJ8b7pGYp/LplzjRu391r9o1j1c6/tmujaDfx YNuHoxoa8/AH3EjksBZhJlw5wrhLCT3JbDSSES3ezfov26GXHQ1RhS/RB+kYRWQeezSY9BfiMBCj OzUS4V4HpfBm66CGUc3lEEyeZmq/nmTnZNsA4n5GB9XKXqeKR3Pgcv0YTY7Oo+Q9ncngJbJdMrtF zWIys46hdB0vkwN7EAkP5Sa0pZKDIy44k+2db7aMJxkwBntPFlIw+zIwmOKuDPU1N8NpsWkOHSSq NsEcq9KcEFiP0yuiGZYp0zLCPpvbCBdjf8FhSKsWZLKGF7K2kB/hmrcttkkUjR4qlqizWrwpl3BM y2sIOioNsgL2Pqa8MC3cpzxzFlu34V4iKJlSq+QldpS2YBYv7fCmZOadMBGadc7PbM0rJmnWP781 g7Fe+0IXG9YBRL/qIm+UF1ZBUNE0edfqZ0dTguUas64q99Y1BbZbIotZaNQSGXyT7ytlrFtBaQk7 Hw571kvXB1p3ERQXaMJIFKkuSRjqziG7OaF7lco4iuau7+J0pBxcboVEQdZeVcJgYPTBavTvJUAe lZBbcGwWNd69X8SYMxSsa80Kesnd+qilTEcWIAeZivAH37a7VB61MsR4k2RU79qyED27JzMWXbBo KOUMlTrNpnhbQVZ5xEErkuCFdkZOurMTYdgXsgyDLZVTuKr3wLQynLRH2EC7tXuWziPJIFCL3hKL Q2EJt0JpeD4x6WcYKuIN1Bpe9Qk5PFWd3Nsqz3RTzD1AsScxwYyTGwPzswhhbPFRgdMXFAodl7eM WQ1wp2+5DEQniSkmTlFZU6weVekdkALv+UcY6zji9C/pZcQgk7R6yuQSFXaWDgMNmomujqPpZEqk C8KPTG/JTQndcDZZSGrk1Dp5lOMFllSh4vMJgM6qE22qH9w2nSu55fdHqkzxCGO/oU2WDDALGy3b YSL7fsNFdqwNqcfItALqOCcV2bLU6hmdnSXnacayQmGT0tuN2WmKm0xgf5G9Rfh0wztyW7uEvbe4 2wq8cXhoqbRszutGZJZROZokeUf6qMNDy+eYxTWjmrnlw8/u9ZnP5pRpN9uNB4eMtB2Ym6IEsdQb kI49DB8vNTt2VcT5kCxeoTdd94thnerLytvhSGKm8zW8uUXxv+hbJKfHTN/R65t8As+nT+SK1ome maRSe2bybzolJYkYBHARPvfKLet4kLLfiflmuzMWSM/BVIGcsBXLHl1lh3HM0ZGouJx2DFT0bycb Y0Ful2aRtXvasAKbyBI8yeCpTeuLys67FvZqCruFIy+aHl9KpChFgjpBlwUfsnf0PoSV9dOrE8vz WLwwR3TuH9LZihCMvddh54z6AzQ0n05rbIdCdtOXcL6Lp7Clw4AppxTsd6HNUfqQm0boYYiOKsR1 F9nl+WCScwK6hOwLRnRGxHapwbMJ8GxpKcIjaB4ORFDI+MXXBpKdLhS656dMNWsOgTQM5H40ejrx UlQeFgjp3HfLEnIEdXwMpqMKbUO0B9kqXZsqjIeGRfPkalEmbul+HmR0Bp6SSkZcBRb5AvaqfI7R Ds6vSMaKxsl4ArQ1jrP4nC50j2BGTXg5LXUSphfqtlEOW2a2iGxx85wlwwVFvCIP/eQdy0Gw2/Jl Wjyb5ImZFdNA5TXSCpotsefReAF7+CKLcUFj/0cGJrxdm89j2OxJbIo5+B5fcrOZCQwWw7a9p4hn OE0gEoyUaQT2hiH+HPsT5XLPXhRcnMM1wKygSEABEzCt2vukv4Dpr0fRg+jF1fwC0Ev9T85+S/oS DYF6Nr3JHQo2g52ib4qCM57fydlxA1014jHZbmEKRlgTeOVI4SDOMFRFCuw0RpdpHeSA4hTefwKL Q0cTIG9Dhlxgw87qxZjScrxymSFPasUmNttT0mE7bAplqtcirxosKYdqPTfQZ8//Fv30DJlM9ODR I6Bg5DWvn2u28/qXFyeY+gt1V2r3McZml+QIo1ljte7Fvta+QAgCL2jlBsR7+t++f/z8lWzm6rwl /EW59lzGknKP5HVjx5aB5P4uUQYbdEOW4nGhLqEx6AfzgzGF5cbphbVh6tFa0qeoIysSRrZyhQu8 sJtZ24+fx0tbLhxb43s2AQzu8pIE0licX2B4DMV2QFyLKouMMIwOK5xf0KhykQNAcXbBVIFLzEY1 naUTCrqiiFywiflCqQWbrYkBCl6Sj9P3aJgi7aEDFLJt/MM4CcpxiLA2SnBBpHM+L1EXmG4Q3Q9x mqDJM5g+aY62H+RMF7z7zCYAJnJdl5hoiViTIKKAat4hciVuBLdamBSjkMD/S14B+qWCrN9a2yzw FtOxbS5aKV1xcG7qmI5ZKJ/ORSaHP74VKCP6ifI4awsquHvtVO0BVX+FEiikViqURq7dwiyaVXu1 c5HycbaP/B30+5enD0XmwQG7gRDsLVPTq0lbe0tblsCXV387ff3oh97Dn7639leK4GjDF7zJkjil AMoLbZ5pc0AnjEKwScsgYuNV9C/+rOf/wybfPQqogoWgzDXcA9b2/+nuNxr73X9rtFqt9sb/50Ye 1/+n0W40uvXDVuuw29xrtL0EgPJ1rwlf9w/2Pf8fv+7XHtnmWecJr//PW+/+syL/336z2/XWfxNK bvx/buLBgCEqjz3McpINElImzea5inJHqgkKLYDqDeMcFOd5MpuXOQw579KJ/woFuqV+RffuKROP Hh+4qvDqd/i/bRmNv1ip+l6OZeYmE4Oxync7rpBXkA/EUS9QQeJ9qQqdrrkoFb2vU0MdJ6wqzUPr bhUkSFNe20bD74/wf/gfKeVwuCRTqTGaUZPmk8cBh1kuxfer+JXL2K4UgWhlUkb8KawCCnZVAk4A 2XxY2cZOUBBFHNNpGlvFy99vBvV6PZrRr2H0zRB+/VeGhoD37pFqHa8gGqhWxz8oOq56M+M3AvZH +u97NRj7vtD7YJ3WnC9VC4U20fShAhweBovx+Iq0vG8NKskW6riUliya49d8UJBjAhwSgBTgDzwe MLoq5hqt6ozi1xRPCG+BCmCDRO18uD2gE689nqKqO3LVGrTDGcnrFvn5t7ZvrW+uLVyXQHlbXB27 352N4gv8P5RquaUCBKsucZB39OAAKSdxQXlI5x09RkCI1+xQLXJyEY31jvYWYw8fNVnhXOK9DsDo 0LVb33ztdYDupIjqNLI0mc4IG3p8shy9OwMem6uajxzLjXINfaq17PZ3Goj12xgnGPrgjoREsBf7 AlG3w+ShSUOreT5ufYzw+u9etMY1CJRSowlehgS+W1ci9ufl9yJWQewbByiXdfan4MVJyXdzfVKE Uc+U9SkwU/BV+KjFISLe54q6iFE6n4OQhB6icVZ1C+vxKPsu+MgFFGvVvk+pzl6PWsmM1Exhsqse batufArpOvxDdxJFZJlj86fI4k2qNVUcWLj/SoOJ6P0j4RwSnML3IpvnlULJr0uAUFNuT/CxqmHW Ou9AWyrv5o8PTp/RbeE4TrOKtXZr0W+16G1NG3cbw1o3qU0g9w2+tpNCmC3HZgeqUU05+MLwy4H6 y/ZukCFmymNjS4xX22yzNU/6854Gg409TUYeuqATlJKfpBjBfTOgndyYt2qIlAmoWDyaNEDUtNuy P/FW0pEAH1NwYDRi6T+1w+1qo1usDyRx7NWjOEgYnZPCHUkLEvxX/THXDYr5mQoOvKMKqO8E+28M +2/a7v43Ugf+LlZFqj5ZVP3GSj53FFRKDQbIp+qUMav+iOlZ6SPfcr9vScyAf7USUq8Vkqm+Gbwx I31bWyKCvH3j9mwt5PKum4fBrmdW10PTdVhaoY6xAYsZhsiKAAgIEhVrU7CHJCbLYq98W9/T2jcD pssdtXs6SCBNZuUbDGI7T8Z5lcZitySXPUqSl4a1NE8q36oyqnMZUMXYExTEL7nHj0qMx4ufDQ7s Fl0jAleGVy8dw4FIlLOBqVbCRWC6sVJhuumlIioWw7lxUkobszU7DK2EUfjah93NU3jW1P/yLc8n 6oCuEf+p3dhrYfynvU57o/+9iceL/9SG2cYpP4SZ6DY9/a98xQSg7Vb7wI//5NX92iPbPOs8Jfrf z1rv/rMi/lO729r31v9eZ38T/+lGHglsFP04GbCR+ztg+mgNBUc+Zesxn8BmrpMSKi1xP1HBufEt mqlRQ4t5CgfjFK//OQToUEyNKTcZBgAdJe9ikH4r8UgMLCjplQp9usgoND4bExvDnnhA1scYJIdd ssTeDS0pctIu7DqmCng8xRf1frUesd3zKRlFofhD2eLQPKt/kWaJJLETy5PTk5MTZbaizeMYR2Qb 8uDFKaaNyM4TlUCG7KsU2ubx20S8+973J9k79hlA65ecNA5sBEbN5SAyorH07Jzcu7CEsZ9hebOC FgAATC7RaI0BTr3PsWrx7h3+piOZ6ZXspmhUZFHA6V9Q6Y5mK2TY76ryx/H8wtXQj9JxOs/ddyT0 uq+S2SybLNPjm9fqamDbuMe+fvnTSdTUP588ePrqJGpsbcGSnKd9Og6/n2aUPIIstNnGoianZv63 xrZC3p8gnVqNJO/xvqFitaBaNP+Rt27Fs3ROl2AVVhZ5JeglroselMvtMvIffmMqGEMR8sTgXxW/ FFRt7kkZ+lu37KjUnAq6Ufq7tAJbQiubHaMBSzMxkhfDHaOWAFqRT/SXMhI2mhEgSTiu1dBnNc3R NP49/P9K6zamZC9/FrP1HalS+lDiN/0LUIfmhFP1Ahct/s2pWabQ8LSp3CMfJ/NkNkZSwWhweELj hD+upRIb4U5FrcpW+VtsI6RzRGBn78U2jHE8je5GBzUMgWI0elDoqlCo2SiWQq+P9ztY+D4hqqp6 U/b/lIuEXiEEBTNnNEdUQ0rt8Sgrxg6/s/xvSHNaHAJC5ysmpXBxKAelZUsH1DE2Q19gWAfusESH vmR0nWuMrtm6/vAOLDfUZYOzjbbYSpIGKfpR8YIYpzkwVtj6TCCfYrYWcluyu+q4PXmmbWq1ZrY9 W2lbB6VtDc4CbR1UndnlRfeQ9lw2EJ7M3vIO2m4hb9TmnTUOTkiJnukvHfArltl0K7Dhp/JQhU5O gEOjDXsO+3lC5uwTDq1ldsT+ZLQYZxJ5DI0YabvTHvM4YXnfEAFwQSSCTnGxfrl1r2CfIkxWeiTH /3bK2sLp5LLSqkMblcFkcYYxMgBc7qv/XulsleL0Nwwr/tu3wEdZ7eitK4UtZKs1W2iAbSiaUizz 0cL5IujnhUYJAI3VfBOhw0vFPuZp6ChSxcaVY6fsVJbHNvJtF0XNILZJ3zqZFovuBYtSfNBnD16f /mxsPAt3LeGVQa0e0F4CzYnGiUuyEAHbjhEBqpFUqLJGi3Y33qx4SxLcTqZssaoBlOEDru7ep5Hd jVrqozSEX9L3zlJycjIFxBveNhVwKdKS2oXJmbJm76Zbt26ZrZPeM7C8TU9Du/TZfBzDB/gHkxPg Pxn+8yHRaap/u6SQYL9Ro7/VkDrjkd60d1KqD/9gffwHt/xU6sP/qAOYZZLhjvkFpW11XmTuC6hu v9iy0rOkRM3YJlErrgooPXFSTKudF0nxu/sYDcFdKaoDFDM1VQuc9jtqYJcacCZtGTAwlnS8GC+D Z6/jg8MIWBecvc41oPFzwYVBareKIOXXAKndKmz/3HShZXuDfOYyKIIajkzk9cUnTNG2fzPQ+8a3 2Fm0TVFAsYslO6gAQnAXHfQBQh4Pa/Jp47fiR1QpIx0aNEd0uxPpxx7BCbnlLDLyLEdvGuWZJI5B OAfUDUwwLmneZDBLuQ5jmr7XQ3CH4bs/ORvAe3XvhK3/+pv4UbpU8SpRkTRV6EvytkAeoomAVreS R39j3t1umkWndpQiISlas8mJyCaM6jS/EVSn+R+H6t+194E6/REu71ocsio3Jb+rWJgIkZ4e/U5N WUPefSR7f+VGqB5Tt6Et+7H733hlNapOaXy7u3usW3LhsKZWvUGoydVWIPjokY+Zeoujlc16VjLr 2c3MevYvN+vZZ8x69i8w62ZTDU/5BwkG5E8576x/+JRjN195yp1JA3jsSQvMhSmykiZueMpPXbkB zioJbhlk/EdKXvLsz5D9mxPD2WSRDbRftb3VYqQMguJPCIZLJM4O4wBngWRJD0XHb/Yl5vPgwBFp rjGtCkyNf4riYZJLyxwo9aA9+R0lCrOUfZvF4RoGpKRLdBTKeUrpnHRX5OWdqR1O5zcRm7CNY2e2 OU2dO6PO/EnluyxzuVNqe0rDpAYZN/o5kmc4ZerlTAQIqI9Ci7Ez4kI4jXwaHzLTF5w2qz4+QkSo lRN8dAx5+z8AmIkgaXefYTQzSvSOHr88unUooAhMYR2UizkBvKEX6QrppwRpmhL1Fu8ji+IthFZq kS8HIGvUG6vY9UrIFLvyIYO2fciMlM1+f7istP6TsaI+pLnzITMfMusDQisf8E8RR52zckh9L8dj OgPzaqU/JfoL67FTpdWHlT5WBdJzZY6LI8efATo0Cn3VjzSsGl2MQyo33VxRDUpXZ0rzhROHOgIq jivBJ+mS/nebDAH+a8Fg8wLqp7RdwgT6qzL+om+/jSrt5i63Dlv27ajy/xr4tt0MtI17BewEnIEF B0ytZck535qF2Ap3iJzO9M09VHgg0Ok/+dMyfLa+Dj6LcoGqWTXj2fWg96m3/CrJJlyUM4gsFxmO AvBLlx9kL65f0cVNKktkgZaVOxXnI5r2YqPqxgHRDeW++447gPn9f4J+HcuT8GzRrMCuTv5aZpX3 oqj5uGUujWEiMjrUkzLW0jI2+UhKOW/keNrkFBxWoVadmmlE97+VZujYX2M9QT/Oov5skudcj1q9 2+TA8Euv4Kik5G2mjg1TyNWlHHUvWNeMZZFCUfgvQDBPxhgyFv9paaQ3GadGh0g90TSlrdC3loVo BuVuc5dH+l1oAyTKps+S6HqS8e1Igaqhw18bb7jPJv4F8+x1UbXnnN+462xl7/PLiX/lJP8Qeqze 1aLOdxkGWtzh3rlyS1VuMujt1t0l0BfaPvbRwAD900yYSkOrLpdPYV5Onz15AR8a7/eHB2Sl4X99 Rl+Hoa//OHn5/AV+VVZrha/P8OuB+op39Sh9YAgcWIHjWac3n/RmHUprsPo6OM1CLGFnyteZ+i2G ecWwNEpPm7yf1ogVkgU4XTREg2ObyNM2J0OY0pm94rWP7gGcJZi4L5ZC/N6mkRFPeD91X+8P8TWA QKEQHMCqVK5J1NHcQ2ZP8xIs1aJSB1go9Ln9hlMOQyejAcBQ0bco2HOts1OBl7t7nd29qgkrNYCT hS735Onr3o8P/o7xd8loAdneycsHz74/8c63bSJNGv+/G7o40gTkayJ33PgPt1NbSaq3swFshC4s GNByRc9MVUeG/q7dt82+Vcu7FMmyqoMCapMbPAMCJTpaZAoagqEBKSj7wOHqsZVpCRm5nCVZNuWs yuozXfPqENmIEfh+RQ0DHYrpDRbCdrSTDQWIpITq/cmUAg+CKEeJdS7TPDFWP/Rly1pZZSYUIsmt zHUWjD3iXUu5ZKMnRHUN00G9LWG5vOTwJgUEGFgBWttOa0ktSKuViAoSv6OFZb9tytvGmwKNWCBB SYs5rrAfuRlsKeK9HrY618VWO4itlvO2FcRseylmFfguZr+2Wd/aj2P/GQ778dlWoOvbfzfb+x3O /9nsbOy/b+Jx7b+b7Wb3sN7eb3RbnXar49l/89dOaw++dg86nv23X/drj2zzrPM46/8LrXf/WRH/ o9Pq7Hnrv9NF/4+N/fcf/ywN02FSApeG6SgJAlBxnbrRCa0sCG4oJgC+LwkLgOIAXSNdQG+jpIe5 OSokF6uEgMZf1ZIfKOBax0vaF4pegO7wZE+kvQ1NpAIXlGPT8MG6DaPZ3ZoNe4kCnSxzImUgkgtu vsqV33gi7xjX3CXoU1HGvfZ6BedeN+0ryQtW3O6yPLqrwiT7UQBu3XJIRZGF6+v/5UmimCaYiCGQ jCGYB5jk0WXJc0sIJtAtksoX7HYNctoyruzi122mNeTYzpi3/d9LJmLLzdbpu5WXzgnHXy24m5s1 6pKmFYVVYi0W8b20SYXyVU16uAxl51TxAFSqU8IvES81TpcefgrFEtRJpE3K/ICF3RRrKmqIH7ix LOy5mxo8Ko157nzzop7Tt7VyOxdXNZ/lwntB4Zvt02wDZEVeodclUVfCTEFTo8UWoiU0iNgPRk3R JOjgzkFW2WrV69WsVRMh1R6Hk0jPRLcvknU5lIqqvwaUuCLuYbRfTg9g4kwMyW9rfjEjD7D5RCJf q5O1yRJ8ugki+kc+65z/Lz6zj/XO/+09PAHAGYDP/93N+f8mHuv8D7PTbR509+twjm/t7+/t7/vx P1vwst7stPeah4ftrn3+D9T92iPbPOs8ofP/5653/1l+/m82mq2ut/473fbG//tGHr7Jv/9ZD7bA +wYL1jrnB/sd46VQNmCb/zNJHTUAAQQElTkWnE3GdHtEqRjqsO+/S2ZXlOCBr8/yi8liRIkz0iyy tA/1LwK54wedzwcg25PCg8PeDqMELT1ImqScHr3pFNOvWLk/tyiFER2POL3rcaiy48CELRjnJ27A EaeDTaAsRjGPSOqX6IVcWetQjvlKb9d76HruxSjuJxeTEe7vbF0rwUQlK8hilogZaKTtfByE8zzP Er6SQ9dbcuOYAZz9Ucyuf2PMP0CXhpcJWXCQBZ9tZYqF6nJZx7FXn9BZSf36GaOkWWFZj4MDwnlT KJLC+jQq8xCp6ViZTNg5paC8acdxOw535BxejvULE0nVZCZz8ieKPCwO/n6GujVKGcE9WMogjqDD uJ48IkJlcChUVmdRJlOZD/qvuforX0yTGebRSGExk3ebNWNeXzSHwb5SJ25eIFIedUph4rYkbN6O +mXTi9chk1CIUj7hIeK6tm5NdC2UZQ9O4SlmEAH6n0yTTDKDcHPs+zoZMq+sSCY9yZaX0z17fJ7I Ah1OtvSZKhlgKAv0p6Z20M8HE0bliz4meBkuRjUpmEcN8pJVafwotwi2Y8DWK74ks599za4abda3 EDHXVRItQUnEZ/MaJ+mJYn5J1l5OviKAs0ZWBdhMMj5LKBgIEgcOE8nXcDBEAgxa5S2yEhxilI54 lqK/QY4NKSMnydxSp7w7j3g6ZM+ZxnkuoPh4A8wnKeJIz47sZIHIi1VM1qxmw8M0IxWd+yZjyfKM 5oy7CC6jB1e45CmCophqDzlNfzTJgdMNbC3SsRRgvQ+iOVRgiRrqWCz7nmBaKvHDABRM+lZCJX9m 7PxDcSYb98WCvAiGW5RgJjFbjewEVckTOTJTIvm9eK7Q1BRwGmPI6bmOffKF1rZj8zIkrUM8UAQT w6Aw1bdOc2Wiok+YWOIztJPjTFY57awmlA1mo8J5pdmUxFIqs1U6no4oeRhlgJeILv9KinSefQIH qd7kk0YLTm3Ko3YohUJO5jWYuEF4tjAUrsk9xZm89Eqx81RTdY6ToNVDNYmSo/KMkleoSiiqOCSw UDtdkeSBwuxKnDmJE5xBIxi6HdtrHoo1I7CJKXLQd8noqkrr78bvsQTXL5Dx5dqYWaO8JrEWkBUY L36GHodCmCM1OmmIvT1ENaemL5cMetAE5Y2XsBvkaMETZSOSXHMpjoFFRrSfhPaoLbM90X5FAL1k NR77L6S4H9FxgHcqe29R5rz/hzXVen98SetOYofQBH/CusOJwsZMEil7GdaLtKJJLtd0khtCwaYM rSARkMFhfo9NGfM1aCeiRGvYkJCjivQV9FtHEYeSHNKSZ7YgLJmEA2x2S9DLVMnxRggZmD8OQ4Ll c3Fio3Y5w6MP6eVFkrmIspNX5ywNvBTRJ81sdbdJiyzhu2EkhBacMEqnphnZseJg2FoZFyMsSeIx IRcKfcJvqJYOhIbtTM6QvbEgoTLJIe/iCpWqDXvpGmzSz2GcjmAPJyHky22wX1upsXnWftbQ/9PZ /3P6WFv/39zfb7U7FP+xvb/R/9/E4+j/W41u93Cv3jnYbx829w/3rqP/L9T92iPbPOs8Af3/Z693 /1lh/9dsNva89d9tdfc2+v+beHy7Ps69tbNkg3c05tvol3WPBGFMBOxG/KRvKrtY4JMSwgOfRHUY apAOV6iDnPZAlppPQmWmUzlPB74ls1lvHKNjoYz1c6QeuT8YKo155dXps++fnlTRzUi9evz8p4fw KjgObxTk9KD8yv52+vqH3tOTZ5X31eh99Oc/R2hvUtpKks1nV3Zb5K2rG1nS6uDsM1rdBPb/n/0I //clv/4paumGcT+pT68+t4/1/T/a+432xv/jJh/X/6PVOuy0691O++AQtmA//r98PcSvnT0//r9f 92uPbPOs8yj570uud/9Zvv7bnb1ux1v/nW53Y/9xI086xuzy0STfkr+yxXh65fyo9ykMPhwQ1Gt+ gRq1R6+31EuWH7e2UP3as5KhNg/5Vaozqna6W1v9EV6t6Yu1yqPX9VfqRqnKVq09MbKAGr9Wtvky f7sGXdYpD2q1Jhan5qlsO8rdVYW1itIu+EbB9jLph6Da3t5m+1vGAV8DRf3JDC8VJhnfI5GVA11M yne5AnpEF0JOO39GOZFy6s1Ja6lHHeesS+T7pxxvn6QCKUL1DQDp8aj/PsdXnk1nCd8xqQy+Uo/z D+igoUncv1AaTL57i0fWpQ92QBVRoauQ8nM8+0yk4K3tSqS4U4+WCTxFL55jlrOXFetPStwbnN7s wyoCyFbSk2v0sKq0pOedqnKI8N7UkBSS+2eij+5er4m/4WAV4PqqetuybQijDI0xVjVnygQmDAig ZMJWoe8E2FGFxy6Iw7NIj0z7e71KnoyGtWgni8dJXj3S7ePrOr0EbNC/umqc9/CF1HwXj6xqGOIo T+lc208q8K2GV95WAXxmWseuX+MRLljIwPErlH9jA0HEtS4UiPSVUBT6rHMf2PrW1hYalbF9gphK 3Wfkbr94AcjffvJku8plPLd+KeUYs2EFY8ymKuoMfbqSXEpiceQ0UFCm9ZGWPdzJVcSsP6s18CjK LyjvCmxJM4xNaCWNseoFiAMq0IwDUErfkU+2LXRigUGKmxScd6eYFeW3SZpV1A/4RATTY+T1yLBj u75dpGbv2SYF23bV6Qib9HsSAAyoVZeQ4TVUgeXx6PHTpxXVSnXLjDgFol6MRj2xtJCRTx3ahUO9 S0LwuY7X5nDez0O09SS245fKjdrPeLVEYTyD9Ph6tuAqGraCYQzDNhxYoKnZwydezCe7YjVFmx4Z iWmDJNswx2WdZqBoiYhmiGeJupgEIrKMl6q1iC+xBfQ4zckURcZIwZSHpnNsC41CyEYS4UoGQcj1 EDG+ubEDMv28gw9qQuvBVK0wx2oKjTFV1eYM0Mif7kcND/k4AhHG6j/9iJ2fqKFUtp+YgZCBkzcW i0AtPzY2NNWzaCzeANsY1GiQ9udqKjWk4RnF5ETJbK7m7jWZwvGcaSuCs6uABZUZN1uHYZ8wIlz9 NMdKfzVOYoxgOlyQVSsyLV1TItrArjlFS1glHAlfklA3yOneSSol5jXIzswaBMEKTXjymrqZxwtY dzHdYZ565yi68+LFHSSvO0+e3HFKOGwVCzoclesYnmrqstFUPnEa02IsNGRu7YskqTi9z/zrahs0 vpn8wSDd3waKe0OgES9SjGprRTZYnwB/d6jb4Jb/cBlvAa9eclWnrI22Yu/4fDQ034cta54UORcD 4duUGL/C8CrAJGG5os80my7mQpw3RUdhssHXDqm5jNZerBXht8YKUIyueES0oryFV12DGQexpbYg wx2XUTLLOULAtciZUOdZj6a5OZeUl7VqU7fl4awJCT279fugyGcP/VUyJ+Ndy3FSZU/QJz3DOLWV PXGvfHGWJ/+9AGZluC86XdaIA2IUr/5iBIcxbN62z7cMgrSprZw05mgWOhnq9pQNpM267elU9jli zUQmM8ytc2MOazGZogmY2LLQgw3dAVzdMSnzhOi0KS45Jih88TSw/QuMi5L+zXRCosjepIWqCW+c rTAlINkbIuFY6SVbfUBEfxLYBX3igIIBplc8PXh1tux+rW/3jccyPyRc0AhJFFfOI3gGIqUOha5a VkO7mOgqEmvOAtaH4eDaMOx1PgEGq1LguEUCkJFN7ez2KruI8DtKr/hNXt2Ovgku1h5aVTGn6xH1 yoIdcOpxLH3/2SQrY/MYS0/4ZOEsH/N4jB1ZHJ2Tfbzyg+CHough5GKQLvKaNuiLFtkI/uJyllUm 2SlT04Zech1ifxBQHfjAv72EVYZH5t/v0HBhlxgo7yP/uQPDGkOBZvDjcBSf5/C1cudR79HzZ69P v//p+U+v7tSiO397efr65MHDpyd3qh9tusYRu5PK0Px6Bw5+AMobjpP4IakV5FVPY1nPBkqI3tnh RkrmF4nTnuPQ5Nqn6jBtBKidmyrplQj8i3arl4zqF1tw+07G0/lVuOsllEy1hGpJVcj0FfeRWwtV m5UGO9O7dLLIRxYFYgxpciFwN8Gluz7PJ/XNM85UqE5PgXH7mObRhqa37NSZh9FEJuziN/dFQFYU YkHMwUgoyodImBerD1VLHGvQipyMyNE0G0UiPNDqww27JYnFsD0EUjwDj7DPWTWTyre/AG6WofMm tkLunm8xmifZ6Y6uzFJWHg/IcXLcvGc5rHtLVIyjUcpJgrUfSI013ywloCuFe5g3njMA7H8v0lmS WzKCkgxyOCBcRLvRaHK5O0reJSMbLZQGDiXUaoBdWVLBrqVfEAkhzlecUx1tQslTOExUV1QIn+cW Wd9WIhjByxVwpmoDtXSwTyjmjN1SHfAo5axausjLpF93lcpynbNdK/Ils9bsi5+Qzlc9lW11YRRq z+JUzuXS8hYdxxmlUmar/KX1LPeC69QyjgfXqFWq8XZnECcF5qjiMgNnxySc+ao/ru1ri5cqiGiZ IBXh6kTrcEcp5MRNKioMYQBQUwrU8e9fj+hPujUwoyLt1+/MDo6icTzlTYyqo0JpeoV/1aQ9Szb4 MwhAl9q9mIzi+5MpekeoPOScaxZ1ROxPrs8oSiqy2lKujugFh65r2uMtLCaB4EUJTpkBsI+ToIVC M4XWI34pFrOXUmi16YJqBn3+PHtnqSZcrMm+wW+nZWo44kDAfYUMrEs52hziVVdRd6DGzh1LuFwp TxJAMF4BrEg82Qf1tZ59MG/n5q3ZdfN3qX7tXtE5iwJKfevrR7kqSlgWaHjDqBvEHxbC6cuvQqDw U1ANf1W44q/wn3TwpiquhPA3Za/BFPEVGNRORLfK3gwaxFewjRoMH/4/ryF8VXty3R7V5OLbdSfX uoZec3KhxnUnl5PcCmDFyf2zEswxjjepMMhrJ5+oMAHncNLGhE/kYoTrEXv016PVHGy+j3Tuj3g4 RHc+8eB0Fr41CGV+YCCp+KeFWAnVNJC63rms2dN2Des3Y/Yr3Y6zOSnE1Z23uqy1IemS1jtTzmxB ppx5V0KBaOYQiPLlRR0six1mkWrIe5LJVaExTK5Ek67HoiW3GjMHNxv0pXLpRpWRbqviK5C0jEgi bXXLQ0IetXbniyleqQ8dNqG7PYruCGysTUUMOXpUD6TgEG0djiCjns6TsaP60RtHAJF1kGt5zQIr 0nfvK28dA88SYW2JpFL+uHf8ZSYB129HhKfojbsMjChLXVlnR+1eqz5zC6V3biFytf0/1wddr55r 1LEu9/S4luqVl7Wgh/7Z14MchA9PNbMxH9Dc9ceh+4oLtnhv6BoB6Nsh84a9Pa3Qt/zG8BPbK574 SBA55B8c+uD5zYeKLLkdUs+qmxz2lReLKUKMFe9DC4p4bFSMpshsq8g8LG1gLm0HO9T0a6Hn87mD tWCuXe1TurpmnS/FtJadLC0RLSAzmJq+Osk54obkBL9q6Wm2hFHZ6wAjQ6we5hqk7z7XuPpaozUr XMLqwtqnfnXRIqI+h8mpmB+WtaPFxXx2Vli0Wx6jsi+tyrkVPUsn0Ra0lpRywhyUFvNDHZQWXGfK Vs+UiYFQDrji/0vKsBv7UoZrB0lwua51P4b36u6N+nAQ7eqdy1MNDpK8P0un88nMrmHL3rsSggHP Q66sF7nC9y79UgFJVBgCgTlU2b2K3r3ONb4RLXd944/IMDAzaut2t2LtOY4mVDOvXc8meEkdI53t rpSYWUzbXSnN82OEfy4lN2E6IoKjkA1JdeH7BZuJWKLlfQO9y1NoDpdtBEK2TiXZZgp1i9uYrkaX qi5AhMG1oLH2lk8Ax94NLXhWX7AacNUFa4AEtq3Tl7u5WbzzCx10PlGe+TJ1PxngT6n4Rc9zSyni RhFpU+ob69RelIzsjXc98Yie9fZZr856u677fFnZip5rCVj0XEPKomeNndx9JMzRdbBfdUxZlshx KwQ4SxZYIsCRN8vWVoom4XgS7fWQtW73emMM6trb5o5Rh2mZo3NzQ8w62eY/LbPefshsl2tMZ+hT 06+HLWW9G5x+3b0O9z7jxS31Zl0NuzkqGI+ofEYNe5pRlV/5duWNQSgDtU1q9m9Q4TynP9D2pcJK d7REQzW7dd/DGm1sVGnGPbvxGUfu6tcxiJynkHQLhFSWbgmh0pKvWvL2CUmsHTKl/ekHdTu2PjfQ w7atXvomN60JhgodVQtwUNefwZM8JK1brcTg9vrVr81WLJRep8p1mYuF+jVrhGaIp5nZgPndX/t4 bS+qXxtvaC3gv4buy+tee4oCk1L9Y5JKlvj/y9n5y/gCr/b/b4j/71672aT4L81We+P/fxNP69D2 /2+3W62DeqfdbRw0mweu+39z76DdbNU7+81O6/Bgv7kFVfulVb/2uDbPeo+s/y+63v1n+fpv7nX2 O976b+/vbeI/3chj/P+1c7+Wf5WDpi+A679ER2c7iJOLs3bjpM9K6xJHXGRIVvg//SjqO/JIQ4se tH9GX5N3aXKpnLMkILiKL52jP4Q4IFiRvfuT8ZnkK/CDfOvetbrWcwlF98nARux7h6DBSKCYfbNb UkR7q5R859jn98ld0lJ6BpVWz6dk6DnQAdMBi7RwMWgqWn6PRpNLin1K80NGumIQKf5qxjhTo5fk jCg6HYoRFVlDoXEG3vVTCnYyB4Vx9DmUvOWLqVvTIX1rbgky4lzMJ8rDkF3YsiuZ4LGVYD6x/DYp Mfx5hinnLetOf16u5fCkp6rgJacn6SgiFytq5cWLO6ZjRK4k/UMrV/IKJX0l6Z2NKS2a4CceApS1 rTU2NSW4EDRusNE4Fz30GWIK44zrGLeZzLndkjKzqeHaYXNacdFZFlZdxxEwk0frFWjgh8ll8g7t L+CcvK0Ik3x/t3HAhiLiTAchsG2ldBxoMRTGnmDNzwExyRRbmIxhvhI4vuYTthv2icWoCBGVAzvE L9JEZi1vGU2KgL9aYJxgDRQ7mZmjr4QkRsjZU2eecooAYxslQXe1R1G+GA7TfopeRioNA8/eGZql uGBj+rosX8wSY6KMR1Dib+NkfjEZMLlPcgoK4uE95+DFaPJSD656sqwyAXoKCgpCF9unpdpXHqq4 H8XbHP9xP6g8Ac69msv/EDOG1ZGNFi8Yh52xebtid/xHsYDPWZ3fxeJBh7ol2mnWYS5xIC5FhqOt ocN80Ouzrpw+i6OpeSCbTkuVPNiXg3hade6QQioghsTWA7kt6ZGKRS4dXzkwx5sAvuLBoIf2d71Z MswrntOIIhAsWnItV3mZVDUvLL1ZC5O3DIUjIWAjFT1FNXz1vPfy8fNnT38p2JhIRctaUuXEWALp IyzzKWAqK+vhwJ0dgJD6VVNSDQyMzE2NBBKMg2DBq+2IrQW9hEyDzTmQDKjcCnWkS0DuYh78qgIw vXFL+KsZCroxmLzy9nKGsiYE0xsLPy41LpnMBwNOZALH1DlsmguOQG+smYWpn4F0IuXgF2pJdXmz 4UBFazcQiYpl4piSf5Asoxm/6VHMY4uMvaZjOMH/FnoHUopruu/ibkh6ymmHU/l4HB0seaBy8IQM tiTYBILosHTAeu27xIpaXDHixxLOt5XKXnxQgceG3PDf4Fe7eStqVDC0i+y2aDuFsekn48RxVOK9 NizPB0R5z5DasQv3feoIP2Lc7Rh8c8gcVJJbVuj8EheCbYSOL91ecNyuObodTezTUSDy2yoEhOx4 B6uNeEN6VZnFJd6tj0UetgSqSVYTwY+kN3FLXUyno1QnfWGBlKHIDRnjKriDnRrv7pr2dcejwdwq oJYejGICvaBTLCaVsJfymemYc8+gmza5lGFpkmHTOQteZEkgVRKV5aco1KrIBxKEyHJis2JyVZWT iORl0M0oebBStaS9CPALEz0iOZjSRkiiwwFyGytNFPbiGN+7Uuy7VJIyzWJygwcpNNMJFpdsusa+ zb96keWhjdgKly9UwBAXFAlcAFEh13w9dAvExRzr9ZDdusThKXExF1ca3kX+gxYdi956seBBjDdJ vBYSCqz0MSICn97WWSsli+FUzweeyn2PC71pKC9CCYugq6tEPSqzj1oevC70wiHnoxjPVzpBEj8Y E4ZalMtQfTaj8pyM084UomIrhIbSV/5bIeGjwGHMpZe6Q8Gq17iIx9GvcYVSfKijT7ry0rUDgrqI lkAVQa+Itbgptn1/SC6Wmvg01pdIM+fC5qxoGX7yNTPHpXOnV0Sp9GgXMiLi2jepNuswiPvsa1SF +cAV6vok5XOc9etYE7hGnU8jPpfo1obtGnesDt9ep8L1LlfVnPl2FHeUHcUd0fn+WQ7Y2yBhz+vT 6bb79t58PL33/rd4Nonr09+ah4fNcTzjMkuL1EcJlxpKXLUKR7+jikSA5nheOJsPvXgryiBiMTYi 5pEQKlBCheVnsQFhyTqb1JSAjXY9Cey3iSrnW1r4KwPrfQMdlBlgSNvL7DCwiEjopnslq1dDlhnS q9oX3N6oxaAxBDJ2XkAKIStNPLatjcuutNzsY9uylHVqBfZ/qxb+B6Cxa5Qbj5BvuV88aE1ijcQu a3bMUOmSzBDb/vyvSEUtdF3XOgxLCfNn3uBp79eGxAty0c5BeB2gkjHW8XqNBq5u6eD8g7q3PKiM E5rNWy3jK3bxZGq3LCDoqyMJUlGfWlwxkIv4tOHKgFLGowTZUUeVoTJ8ypJLmxsUuZ6nkiwWWKqS LBYPqiSLxRz9uQA7Y2AxnEJYHMXRrCmJ2kxMaIIoxCYMo6O2Tl1H23ZVfy0BAM5iKltEWM5ZRaHV g4Ws5ePw3fea/dl9/to8eOMUuyopts/FZmJ6RYpDxAP+btTn7zF6w/blts2/KRNe5kNlBdohlczl LAW2uv1N/l8Z9sqOaqYv0fb9QfY4N/2U2P/gpvLFjAFW2f806P6/3em0ut39Rhfj/3e6zY39z008 boaPZrfb2avvHe634f/dPSfDW7t50O229+vd/YNG+7DT3f9fQf//1x9Z/190vfvPyvXfaHjrv93q 7m/sfzbP5tk8m2fzbJ7Ns3k2z+bZPJtn82yezbN5Ns/m2TybZ/Nsns2zeTbP5tk8m+c6z/8HRjBD TwD4AgA= ---159228482-749198422-1410168891=:4676-- cf-python-1.3.2/cf/um/umread/out.txt0000600000175000017500000003575412410022744017464 0ustar daviddavid00000000000000PP little_endian 4 num variables: 1 type(f.vars[0].recs)= 15 [, , , , ] [, , ] var 0: nz = 5, nt = 3 var 0 record 0 hdr offset: 187652 data offset: 187916 disk length: 46640 int hdr: [ 1979 5 1 0 0 121 1979 5 2 0 0 122 121 3648 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 1390592 12288 900 5 50 0 0 0 0 1111 1 1390592 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 5.00000038e+01 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [ 1.94408166 1.99718308 2.04474235 ..., -4.75558281 -5.05577517 -5.05779886] ----------------------- var 0 record 1 hdr offset: 140740 data offset: 141004 disk length: 46640 int hdr: [ 1979 5 1 0 0 121 1979 5 2 0 0 122 121 3648 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 1378304 12288 900 5 250 0 0 0 0 1111 1 1378304 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 2.50000015e+02 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [ 49.80299377 50.26750946 50.63897324 ..., 29.66181755 29.07848549 29.01329231] ----------------------- var 0 record 2 hdr offset: 93828 data offset: 94092 disk length: 46640 int hdr: [ 1979 5 1 0 0 121 1979 5 2 0 0 122 121 3648 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 1366016 12288 900 5 500 0 0 0 0 1111 1 1366016 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 5.00000031e+02 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [ 25.3536129 24.78829956 24.53061676 ..., 1.71871078 1.51844108 1.49270189] ----------------------- var 0 record 3 hdr offset: 46916 data offset: 47180 disk length: 46640 int hdr: [ 1979 5 1 0 0 121 1979 5 2 0 0 122 121 3648 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 1353728 12288 900 5 700 0 0 0 0 1111 1 1353728 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 7.00000061e+02 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [ 9.91138363 9.40522385 9.38437462 ..., -1.06550407 -1.1214056 -1.12985194] ----------------------- var 0 record 4 hdr offset: 4 data offset: 268 disk length: 46640 int hdr: [ 1979 5 1 0 0 121 1979 5 2 0 0 122 121 3648 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 1341440 12288 900 5 850 0 0 0 0 1111 1 1341440 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 8.50000061e+02 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [-0.12850454 0.30537409 0.89345634 ..., -0.90012771 -1.02400351 -1.02327657] ----------------------- var 0 record 5 hdr offset: 422212 data offset: 422476 disk length: 46640 int hdr: [ 1979 5 2 0 0 122 1979 5 3 0 0 123 121 3672 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 2902016 12288 900 5 50 0 0 0 0 1111 1 2902016 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 5.00000038e+01 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [ 1.12230837 1.13196766 1.14027655 ..., -3.34485221 -3.552737 -3.56620502] ----------------------- var 0 record 6 hdr offset: 375300 data offset: 375564 disk length: 46640 int hdr: [ 1979 5 2 0 0 122 1979 5 3 0 0 123 121 3672 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 2889728 12288 900 5 250 0 0 0 0 1111 1 2889728 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 2.50000015e+02 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [ 39.66373444 40.7345047 41.7251091 ..., 33.35466385 32.88820267 32.86706543] ----------------------- var 0 record 7 hdr offset: 328388 data offset: 328652 disk length: 46640 int hdr: [ 1979 5 2 0 0 122 1979 5 3 0 0 123 121 3672 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 2877440 12288 900 5 500 0 0 0 0 1111 1 2877440 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 5.00000031e+02 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [ 25.3900795 25.5765686 25.8936615 ..., 3.75123811 3.2344563 3.22648478] ----------------------- var 0 record 8 hdr offset: 281476 data offset: 281740 disk length: 46640 int hdr: [ 1979 5 2 0 0 122 1979 5 3 0 0 123 121 3672 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 2865152 12288 900 5 700 0 0 0 0 1111 1 2865152 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 7.00000061e+02 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [ 11.72118092 11.39163113 11.3867178 ..., 0.04169134 -0.12455849 -0.12718374] ----------------------- var 0 record 9 hdr offset: 234564 data offset: 234828 disk length: 46640 int hdr: [ 1979 5 2 0 0 122 1979 5 3 0 0 123 121 3672 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 2852864 12288 900 5 850 0 0 0 0 1111 1 2852864 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 8.50000061e+02 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [ 2.93325782 3.36176467 3.92748976 ..., -1.49084044 -1.61046946 -1.6003381 ] ----------------------- var 0 record 10 hdr offset: 656772 data offset: 657036 disk length: 46640 int hdr: [ 1979 5 3 0 0 123 1979 5 4 0 0 124 121 3696 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 4413440 12288 900 5 50 0 0 0 0 1111 1 4413440 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 5.00000038e+01 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [-0.70770234 -0.82124394 -0.92155576 ..., -1.15786588 -1.21203947 -1.22635651] ----------------------- var 0 record 11 hdr offset: 609860 data offset: 610124 disk length: 46640 int hdr: [ 1979 5 3 0 0 123 1979 5 4 0 0 124 121 3696 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 4401152 12288 900 5 250 0 0 0 0 1111 1 4401152 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 2.50000015e+02 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [ 27.31070709 29.02667999 30.62471199 ..., 32.79201889 32.61489868 32.60603714] ----------------------- var 0 record 12 hdr offset: 562948 data offset: 563212 disk length: 46640 int hdr: [ 1979 5 3 0 0 123 1979 5 4 0 0 124 121 3696 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 4388864 12288 900 5 500 0 0 0 0 1111 1 4388864 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 5.00000031e+02 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [ 21.56608963 22.70127678 23.89733124 ..., 2.47970223 2.33779645 2.34782624] ----------------------- var 0 record 13 hdr offset: 516036 data offset: 516300 disk length: 46640 int hdr: [ 1979 5 3 0 0 123 1979 5 4 0 0 124 121 3696 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 4376576 12288 900 5 700 0 0 0 0 1111 1 4376576 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 7.00000061e+02 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [ 9.23853111 8.94081306 8.94977283 ..., -1.343063 -1.55235732 -1.54391372] ----------------------- var 0 record 14 hdr offset: 469124 data offset: 469388 disk length: 46640 int hdr: [ 1979 5 3 0 0 123 1979 5 4 0 0 124 121 3696 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 4364288 12288 900 5 850 0 0 0 0 1111 1 4364288 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 8.50000061e+02 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [ 1.66281414 1.97502601 2.40246844 ..., -1.50481987 -1.87925422 -1.85736954] ----------------------- =============================== record read using saved file type and offsets: int hdr: [ 1979 5 1 0 0 121 1979 5 2 0 0 122 121 3648 11660 101 3 110 106 0 0 2 56 0 128 8 0 133 1390592 12288 900 5 50 0 0 0 0 1111 1 1390592 0 15201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 5.00000038e+01 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.80000000e+01 1.90000000e+02 0.00000000e+00 2.37600002e+01 -4.39999998e-01 3.39019989e+02 4.39999998e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 11660 data: [ 1.94408166 1.99718308 2.04474235 ..., -4.75558281 -5.05577517 -5.05779886] nx = 106 ny = 110 data_type = real nwords = 11660 cf-python-1.3.2/cf/um/umread/cases0000600000175000017500000000227612433136710017132 0ustar daviddavid00000000000000 * Grid codes other than case 1: case 101: case 11110: 026000000000c.fc0607.000128.0000.00.04.0260.0020.1491.12.01.00.00.pp 026000000000c.fc0619.000128.0000.00.04.0260.0020.1491.12.01.00.00.pp lbcode_10423.pp lbcode_11323.pp * Extra data: Can we aggregate on this? * run length encoding xgvwko.piw96b0 * disk_length in Rec.from_file_and_offsets * Detecting file type when validity times are zero: int detect_file_type_(int fd, File_type *file_type) wgdos_packed.pp Input files/directories: /home/david/cf-python_cdunifpp/test/wgdos_packed.pp Field 1: LBYR: 0 LBMON: 0 LBDAT: 0 LBHR: 0 LBMIN: 0 LBDAY: 0 LBYRD: 0 LBMOND: 0 LBDATD: 0 LBHRD: 0 LBMIND: 0 LBDAYD: 0 LBTIM: 122 LBFT: 720 LBLREC: 3294 LBCODE: 1 LBHEM: 0 LBROW: 73 LBNPT: 96 LBEXT: 0 LBPACK: 1 LBREL: 2 LBFC: 16 LBCFC: 0 LBPROC: 128 LBVC: 129 LBRVC: 0 LBEXP: 0 LBEGIN: 0 LBNREC: 2048 LBPROJ: 870 LBTYP: 18 LBLEV: 9999 LBRSVD1: 0 LBRSVD2: 0 LBRSVD3: 0 LBRSVD4: 0 LBSRCE: 0 LBUSER1: 1 LBUSER2: 0 LBUSER3: 0 LBUSER4: 24 LBUSER5: 0 LBUSER6: 0 LBUSER7: 1 BRSVD1: 0 BRSVD2: 0 BRSVD3: 0 BRSVD4: 0 BDATUM: 0 BACC: -10 BLEV: 0 BRLEV: 0 BHLEV: 0 BHRLEV: 0 BPLAT: 90 BPLON: 0 BGOR: 0 BZY: 92.5 BDY: -2.5 BZX: -3.75 BDX: 3.75 BMDI: -1073741824 BMKS: 1 cf-python-1.3.2/cf/um/umread/recdata0.txt0000600000175000017500000027361412432373603020346 0ustar daviddavid000000000000001.94408 1.99718 2.04474 2.08681 2.09618 2.01876 1.93209 1.7896 1.63463 1.38096 1.08829 0.78914 0.483418 0.14303 -0.218474 -0.583086 -0.953391 -1.29803 -1.62932 -1.95229 -2.24253 -2.48075 -2.70903 -2.92367 -3.09873 -3.26267 -3.41704 -3.57128 -3.70919 -3.74978 -3.7913 -3.83425 -3.87655 -3.91989 -3.968 -3.98869 -4.01308 -4.02839 -4.01451 -4.01373 -3.97308 -3.93551 -3.88656 -3.81812 -3.75403 -3.65899 -3.56757 -3.45437 -3.33213 -3.1973 -3.03717 -2.8788 -2.67039 -2.46099 -2.22179 -1.95928 -1.68872 -1.39607 -1.09587 -0.809033 -0.52828 -0.246254 -0.0390264 0.167646 0.338082 0.440641 0.518459 0.56442 0.596609 0.645608 0.702396 0.771241 0.860629 0.962459 1.06654 1.18419 1.31538 1.40278 1.52138 1.71019 1.88271 2.01483 2.1412 2.2618 2.37176 2.46339 2.54577 2.61894 2.68798 2.78267 2.87707 2.97 3.06121 3.15265 3.25532 3.35198 3.44271 3.48485 3.51236 3.5872 3.67713 3.77009 3.86594 3.96458 4.06593 4.01438 2.0521 1.96232 1.94384 1.97068 1.99443 1.9825 1.88609 1.76377 1.58258 1.38071 1.09393 0.774761 0.459037 0.151023 -0.182868 -0.514175 -0.850528 -1.21221 -1.54975 -1.83671 -2.10898 -2.36899 -2.59425 -2.81298 -3.02914 -3.22204 -3.40938 -3.58046 -3.75471 -3.91605 -4.05208 -4.17673 -4.20519 -4.2421 -4.28492 -4.28474 -4.30083 -4.29439 -4.26841 -4.24361 -4.19385 -4.13295 -4.06735 -3.99041 -3.89077 -3.80724 -3.68895 -3.58041 -3.44774 -3.30029 -3.14787 -2.95956 -2.76851 -2.5433 -2.29742 -2.03227 -1.74234 -1.44665 -1.1435 -0.832967 -0.539743 -0.262106 -0.0234057 0.174079 0.340894 0.434289 0.508968 0.580807 0.633082 0.690084 0.763493 0.849444 0.946132 1.06426 1.19019 1.31929 1.45398 1.67365 1.87066 2.05631 2.23291 2.39182 2.52638 2.64524 2.75269 2.85231 2.9292 2.97704 3.02927 3.12002 3.22888 3.32915 3.41806 3.4967 3.5857 3.69211 3.7248 3.73028 3.75103 3.80233 3.89694 4.00216 4.09686 4.17607 4.22692 4.17518 2.17643 2.00196 1.7421 1.85649 1.94393 1.95066 1.94938 1.88595 1.77381 1.54293 1.29676 1.01093 0.704277 0.383577 0.0785405 -0.261303 -0.607984 -0.95968 -1.29129 -1.61951 -1.90684 -2.16781 -2.42753 -2.69554 -2.91251 -3.15064 -3.3808 -3.58042 -3.78724 -3.97293 -4.15973 -4.30521 -4.41379 -4.5113 -4.56272 -4.57529 -4.57883 -4.55236 -4.51027 -4.46043 -4.39206 -4.31327 -4.229 -4.1276 -4.02408 -3.9145 -3.80112 -3.67783 -3.54239 -3.39492 -3.22396 -3.04383 -2.83215 -2.60076 -2.34295 -2.05824 -1.7571 -1.44796 -1.13102 -0.799453 -0.510031 -0.239371 0.001902 0.190829 0.351865 0.484867 0.586958 0.672763 0.759809 0.84092 0.927306 1.03335 1.14915 1.27739 1.43628 1.64265 1.87643 2.11455 2.34062 2.53777 2.71495 2.88272 3.02765 3.14963 3.25162 3.33139 3.372 3.40803 3.46195 3.53662 3.645 3.74879 3.83771 3.92067 3.9949 4.00825 4.0191 4.03747 4.07449 4.1463 4.25715 4.40282 4.48209 4.36799 4.43732 4.38555 2.28727 2.13735 1.97839 2.01875 2.19793 2.29857 2.27468 2.19514 2.03271 1.86264 1.63326 1.33807 1.01981 0.72037 0.344309 -0.0262612 -0.353703 -0.719919 -1.08352 -1.40497 -1.72002 -2.05303 -2.3842 -2.66246 -2.93593 -3.21529 -3.47458 -3.72047 -3.95788 -4.1856 -4.39019 -4.5688 -4.72392 -4.84639 -4.92592 -4.97258 -4.9906 -4.96861 -4.92719 -4.87209 -4.80612 -4.73074 -4.65309 -4.5731 -4.4848 -4.4081 -4.31766 -4.22743 -4.12401 -3.99835 -3.85922 -3.68951 -3.50416 -3.28116 -3.03644 -2.76027 -2.45837 -2.1529 -1.83543 -1.51955 -1.22697 -0.936451 -0.648629 -0.400853 -0.155709 0.0839176 0.301031 0.511638 0.724161 0.938244 1.15369 1.38101 1.61905 1.88354 2.18894 2.50529 2.80917 3.08644 3.33911 3.54724 3.71695 3.85579 3.97255 4.05329 4.08701 4.07242 4.05656 4.05813 4.06628 4.09267 4.12935 4.18753 4.24265 4.28986 4.26287 4.23005 4.22458 4.26039 4.33735 4.50987 4.83427 4.98197 4.70323 4.59231 4.64434 4.5927 2.25972 2.24119 2.23588 2.45181 2.89923 2.74739 2.49582 2.36417 2.31788 2.23107 2.03569 1.69513 1.35608 1.01715 0.606678 0.215089 -0.134215 -0.490857 -0.90196 -1.23067 -1.5833 -2.02519 -2.47294 -2.85468 -3.24699 -3.59116 -3.92738 -4.26157 -4.56063 -4.8411 -5.09365 -5.32228 -5.52422 -5.70036 -5.86556 -6.02322 -6.18092 -6.35806 -6.55407 -6.77744 -7.02352 -7.28929 -7.56262 -7.83409 -8.09578 -8.3275 -8.53228 -8.6816 -8.77966 -8.82451 -8.81526 -8.77654 -8.69932 -8.59606 -8.46226 -8.29489 -8.08616 -7.83915 -7.55059 -7.21853 -6.84719 -6.39869 -5.89618 -5.33617 -4.70578 -4.02474 -3.30213 -2.53286 -1.72875 -0.899841 -0.0556386 0.790878 1.63977 2.47069 3.26001 3.98653 4.62913 5.17955 5.62254 5.9637 6.216 6.38291 6.46298 6.46665 6.4034 6.28715 6.13662 5.96862 5.79864 5.61834 5.43963 5.26246 5.08255 4.93157 4.79382 4.65708 4.57235 4.5456 4.63101 4.95873 5.48205 5.16312 4.85729 4.79827 4.84795 4.79659 2.14176 2.20869 2.3638 2.76332 3.13085 2.61651 2.15474 2.01696 2.12915 2.18497 2.04872 1.76143 1.39507 1.00847 0.550302 0.126938 -0.211611 -0.621474 -1.06516 -1.43968 -1.79771 -2.28175 -2.76858 -3.26957 -3.6862 -4.09324 -4.48764 -4.85564 -5.21027 -5.53961 -5.85123 -6.1519 -6.44744 -6.7525 -7.07997 -7.43916 -7.8427 -8.28985 -8.78166 -9.30417 -9.84334 -10.3808 -10.894 -11.3669 -11.7792 -12.1218 -12.3707 -12.5259 -12.5812 -12.5516 -12.4611 -12.3184 -12.1432 -11.9265 -11.6701 -11.3649 -11.0205 -10.6333 -10.2044 -9.72274 -9.192 -8.59043 -7.91387 -7.169 -6.35866 -5.49105 -4.56718 -3.58445 -2.54908 -1.47063 -0.363323 0.753999 1.8578 2.9247 3.92358 4.82725 5.62504 6.30906 6.87232 7.31708 7.6583 7.89038 8.02223 8.06403 8.02113 7.90941 7.73438 7.51993 7.26838 6.99097 6.68939 6.37765 6.08894 5.72701 5.53161 5.30432 5.07572 4.94209 4.9371 5.20355 5.52214 5.12234 4.94072 4.9376 5.04567 4.99474 2.03235 2.10757 2.38036 2.86504 3.26648 2.60845 1.97554 1.83482 2.02413 2.08482 2.04602 1.75761 1.391 0.976657 0.5367 0.0811616 -0.303086 -0.722274 -1.19724 -1.64696 -2.06322 -2.53197 -3.08575 -3.61192 -4.08014 -4.52018 -4.9451 -5.35438 -5.75416 -6.14793 -6.54561 -6.95765 -7.39773 -7.87715 -8.40297 -8.98002 -9.60007 -10.2556 -10.9262 -11.5901 -12.224 -12.8007 -13.3039 -13.7143 -14.0251 -14.2208 -14.2971 -14.2521 -14.1024 -13.8753 -13.596 -13.2855 -12.9373 -12.5432 -12.0899 -11.6035 -11.0966 -10.5427 -9.96504 -9.34656 -8.6672 -7.99049 -7.22749 -6.43302 -5.57943 -4.7121 -3.79843 -2.83518 -1.81956 -0.754716 0.341702 1.45323 2.5486 3.59964 4.5814 5.47614 6.2588 6.93251 7.49724 7.94955 8.29034 8.52964 8.68153 8.74729 8.73983 8.66014 8.52718 8.32866 8.09015 7.81551 7.5108 7.16931 6.84805 6.61647 6.11987 5.88267 5.60415 5.306 5.17444 5.24156 5.38376 5.07226 4.99704 5.0381 5.1782 5.12796 1.92959 2.02546 2.33241 2.76284 3.39501 2.80941 2.12186 1.99897 1.97287 2.14232 2.026 1.75753 1.39959 0.988738 0.505205 0.0414756 -0.366327 -0.808716 -1.31442 -1.81041 -2.27039 -2.74838 -3.31496 -3.82233 -4.32254 -4.78774 -5.23731 -5.68917 -6.14731 -6.62452 -7.13173 -7.67983 -8.27509 -8.91951 -9.60814 -10.3265 -11.0586 -11.7806 -12.4695 -13.0999 -13.6489 -14.0994 -14.439 -14.666 -14.7734 -14.7613 -14.6272 -14.3868 -14.0678 -13.7064 -13.33 -12.9339 -12.4924 -11.9714 -11.4002 -10.8267 -10.2218 -9.62005 -8.939 -8.26803 -7.56118 -6.80168 -6.07762 -5.28361 -4.48891 -3.66647 -2.83607 -1.95737 -1.03035 -0.058701 0.948343 1.96328 2.9682 3.93776 4.85242 5.6858 6.44556 7.09322 7.65149 8.0978 8.43697 8.66201 8.79656 8.86284 8.85205 8.77617 8.65089 8.48858 8.27821 8.02921 7.76459 7.53085 7.15472 6.8776 6.61532 6.13571 5.80222 5.46918 5.18319 5.08927 5.10068 5.00333 5.02207 5.11801 5.27761 5.22817 1.83711 1.97476 2.1833 2.57697 3.45506 3.03198 2.45805 2.09369 2.1985 2.24074 2.08129 1.83357 1.41606 0.917336 0.399162 -0.0679585 -0.519402 -0.96131 -1.44567 -1.9438 -2.41189 -2.91603 -3.41478 -3.94283 -4.44316 -4.92824 -5.41357 -5.9154 -6.44626 -7.01889 -7.64034 -8.31345 -9.03249 -9.78589 -10.5536 -11.3145 -12.0444 -12.722 -13.3257 -13.8372 -14.2422 -14.5311 -14.7058 -14.7658 -14.7155 -14.5539 -14.2922 -13.9523 -13.5729 -13.1906 -12.8116 -12.3984 -11.8855 -11.2748 -10.6588 -10.0387 -9.39265 -8.79265 -8.15239 -7.40698 -6.74623 -5.9909 -5.25497 -4.48652 -3.76175 -3.01179 -2.24211 -1.42747 -0.577128 0.296741 1.21067 2.10496 2.97969 3.8254 4.63523 5.39519 6.08168 6.73624 7.29172 7.77701 8.12358 8.40716 8.56903 8.64341 8.63504 8.55722 8.41955 8.24527 8.04018 7.81357 7.57102 7.2752 7.12221 6.69562 6.39933 5.98793 5.62736 5.29735 4.94364 4.67756 4.63495 4.87182 5.00733 5.15951 5.34439 5.29589 1.75539 1.84546 2.02215 2.34166 3.39622 3.24585 2.64417 2.37238 2.379 2.30142 2.26424 1.85133 1.32917 0.771322 0.24588 -0.249086 -0.682521 -1.11774 -1.56823 -2.02947 -2.49349 -2.96012 -3.46673 -3.98112 -4.48844 -4.99949 -5.53035 -6.09333 -6.70464 -7.36974 -8.08837 -8.85054 -9.63935 -10.4319 -11.2047 -11.935 -12.6046 -13.1975 -13.6996 -14.0994 -14.3874 -14.5638 -14.6304 -14.5943 -14.4573 -14.2269 -13.9148 -13.5516 -13.1754 -12.813 -12.4378 -11.9678 -11.3554 -10.6916 -10.0412 -9.33867 -8.82946 -8.11014 -7.5688 -6.92443 -6.1617 -5.4854 -4.69765 -3.9793 -3.23417 -2.55073 -1.76869 -0.967943 -0.143792 0.701432 1.49632 2.30737 3.03777 3.7197 4.37891 5.00405 5.59199 6.15453 6.66857 7.11708 7.49251 7.76577 8.018 8.14059 8.17192 8.11882 7.98801 7.80665 7.58925 7.3505 7.07973 6.82734 6.48003 6.22904 5.77884 5.48094 5.08134 4.82357 4.47499 4.08165 3.98734 4.66715 4.95236 5.16156 5.37819 5.33076 1.62436 1.69227 1.83868 2.03254 3.32617 3.30338 2.767 2.48241 2.35938 2.44877 2.15208 1.68971 1.1353 0.566003 0.0421926 -0.421776 -0.845498 -1.25753 -1.67098 -2.08892 -2.51744 -2.97587 -3.46411 -3.97049 -4.49377 -5.04049 -5.6223 -6.25447 -6.94237 -7.685 -8.46999 -9.27864 -10.0863 -10.8694 -11.6069 -12.2832 -12.8867 -13.4081 -13.8364 -14.1616 -14.3791 -14.4888 -14.498 -14.4118 -14.2377 -13.98 -13.6548 -13.2902 -12.9243 -12.5612 -12.1398 -11.5726 -10.8833 -10.2075 -9.48187 -8.99206 -8.28269 -7.81726 -7.12079 -6.5168 -5.85342 -5.1064 -4.3705 -3.62948 -2.93208 -2.15834 -1.35562 -0.505397 0.326364 1.15901 1.98036 2.6822 3.32786 3.89484 4.39989 4.89564 5.36141 5.77819 6.19862 6.5154 6.81821 7.07044 7.2671 7.42854 7.50511 7.49171 7.41361 7.25049 7.03491 6.78024 6.50319 6.18103 5.82628 5.48511 5.06147 4.71806 4.50171 4.10294 3.82134 3.36972 3.26437 4.4165 4.84672 5.11938 5.33803 5.29276 1.4195 1.54406 1.62606 1.75141 3.17348 3.2406 2.72708 2.42037 2.38814 2.2926 1.97494 1.51665 0.960988 0.403891 -0.103532 -0.557524 -0.973131 -1.36127 -1.74436 -2.12261 -2.52452 -2.95793 -3.43081 -3.9381 -4.48249 -5.06934 -5.70937 -6.40702 -7.16065 -7.95708 -8.7771 -9.59619 -10.3912 -11.142 -11.8353 -12.4617 -13.0146 -13.4852 -13.8623 -14.137 -14.3053 -14.3716 -14.3434 -14.2308 -14.0384 -13.7729 -13.4464 -13.0898 -12.7303 -12.3507 -11.8701 -11.2417 -10.5428 -9.81625 -9.3539 -8.7491 -8.21198 -7.61553 -6.98502 -6.28546 -5.65115 -4.92446 -4.2527 -3.49824 -2.79176 -1.95723 -1.09632 -0.21353 0.652605 1.48535 2.32381 3.04307 3.64947 4.18732 4.64236 5.03145 5.41534 5.74007 5.98763 6.23624 6.36776 6.51605 6.63072 6.70633 6.77426 6.77895 6.71775 6.61808 6.42734 6.17955 5.88944 5.55386 5.17848 4.70813 4.39939 4.01652 3.71148 3.43809 2.98894 2.5524 2.52156 4.14186 4.70469 4.99306 5.24947 5.20676 1.20688 1.32089 1.37313 1.50807 2.92287 3.0039 2.57679 2.33251 2.27652 2.1366 1.84965 1.38565 0.832582 0.288971 -0.229792 -0.661193 -1.07803 -1.44595 -1.7858 -2.14447 -2.51098 -2.92173 -3.38005 -3.89526 -4.46531 -5.09861 -5.79478 -6.55042 -7.35148 -8.17802 -9.00566 -9.81194 -10.5774 -11.2893 -11.9395 -12.5228 -13.0326 -13.4591 -13.7911 -14.0207 -14.1478 -14.1788 -14.1259 -13.9985 -13.8035 -13.5444 -13.2367 -12.9069 -12.5711 -12.1939 -11.7045 -11.0532 -10.3947 -9.83868 -9.33539 -8.83313 -8.28142 -7.5785 -6.94201 -6.27478 -5.61012 -4.95186 -4.23922 -3.56694 -2.74652 -1.92057 -0.979958 -0.127973 0.739388 1.6536 2.45198 3.21987 3.86276 4.39647 4.87737 5.28984 5.59145 5.87924 6.0493 6.14307 6.20703 6.19083 6.17351 6.15259 6.09432 6.07247 6.00396 5.89514 5.77059 5.55315 5.25736 4.92785 4.53686 4.10356 3.68798 3.4579 3.00437 2.66972 2.24525 1.68452 1.74196 3.83429 4.53329 4.83744 5.10077 5.06083 1.02051 1.10024 1.09666 1.21875 2.50835 2.64539 2.34016 2.16902 2.13975 2.02102 1.73013 1.25785 0.70245 0.146608 -0.304524 -0.830829 -1.15091 -1.49711 -1.82653 -2.13995 -2.47771 -2.86781 -3.32071 -3.8427 -4.45034 -5.12732 -5.87625 -6.67586 -7.50537 -8.33887 -9.15368 -9.93067 -10.6572 -11.3255 -11.9317 -12.4713 -12.9372 -13.3192 -13.6069 -13.7961 -13.8889 -13.8958 -13.8296 -13.7022 -13.519 -13.2863 -13.0188 -12.743 -12.4613 -12.1197 -11.6322 -11.095 -10.4864 -10.0719 -9.50843 -9.04895 -8.32984 -7.65874 -6.97675 -6.36364 -5.70907 -5.04376 -4.33991 -3.60617 -2.80911 -1.87633 -0.983879 -0.104472 0.774733 1.64849 2.53325 3.27395 3.95675 4.55017 5.05684 5.49511 5.8484 6.07295 6.21477 6.22995 6.16488 6.05333 5.89142 5.72618 5.5742 5.40486 5.29809 5.1756 5.01883 4.84603 4.59973 4.24564 3.87177 3.48219 3.09683 2.73312 2.43475 1.94537 1.4898 0.886478 0.994155 3.51063 4.34749 4.65887 4.92245 4.88524 0.858974 0.900808 0.829281 0.879626 2.00231 2.17715 2.01731 1.98128 1.99209 1.89847 1.58795 1.09778 0.555347 0.0449178 -0.504817 -0.81077 -1.2736 -1.52048 -1.83434 -2.08989 -2.43392 -2.78403 -3.24018 -3.79124 -4.42347 -5.15419 -5.94294 -6.77189 -7.6092 -8.42988 -9.21412 -9.94949 -10.6289 -11.2496 -11.8096 -12.3044 -12.7263 -13.0651 -13.3133 -13.469 -13.5383 -13.5329 -13.4677 -13.3537 -13.1983 -13.0075 -12.801 -12.5976 -12.3787 -12.0765 -11.6688 -11.2113 -10.7664 -10.2684 -9.89163 -9.16323 -8.52464 -7.80299 -7.09245 -6.49575 -5.86057 -5.13445 -4.43452 -3.64661 -2.8181 -1.89458 -0.976629 -0.131406 0.767222 1.65399 2.51307 3.28939 3.98197 4.61665 5.19159 5.65103 6.04189 6.26474 6.37799 6.35223 6.20859 5.98207 5.71298 5.41495 5.13838 4.88441 4.64194 4.47526 4.29552 4.07318 3.80983 3.52762 3.14196 2.76637 2.43144 2.065 1.70384 1.28491 0.742377 0.140141 0.353006 3.2195 4.15043 4.46208 4.7151 4.68055 0.721289 0.727525 0.583743 0.555794 1.47138 1.67069 1.66943 1.76838 1.84388 1.75127 1.41931 0.930795 0.396732 -0.114258 -0.523864 -1.02786 -1.30375 -1.59814 -1.7859 -2.06545 -2.27408 -2.67533 -3.12476 -3.70523 -4.38414 -5.16206 -5.98335 -6.82343 -7.64984 -8.43885 -9.17837 -9.86282 -10.4911 -11.0637 -11.579 -12.031 -12.4109 -12.7099 -12.924 -13.0553 -13.1128 -13.1098 -13.0604 -12.9767 -12.865 -12.7325 -12.5959 -12.4605 -12.2843 -12.0293 -11.7254 -11.311 -10.9724 -10.5355 -10.0117 -9.39552 -8.66128 -7.99054 -7.32013 -6.62657 -5.95831 -5.23013 -4.48699 -3.71447 -2.82432 -1.93321 -1.07188 -0.187525 0.681843 1.59598 2.4212 3.21467 3.92653 4.60136 5.18863 5.69865 6.08955 6.34969 6.43345 6.39014 6.20243 5.91476 5.55444 5.17835 4.80069 4.45469 4.15735 3.8631 3.61148 3.35563 3.04514 2.71152 2.39041 2.03057 1.68146 1.38539 0.998164 0.599947 0.0311443 -0.562485 -0.200755 3.00024 3.96258 4.24345 4.47914 4.44721 0.596578 0.583583 0.379629 0.294385 1.00884 1.19344 1.3382 1.55988 1.69147 1.58876 1.24402 0.763616 0.259981 -0.214209 -0.696217 -1.14849 -1.4434 -1.72039 -1.74809 -1.91624 -2.10677 -2.46054 -2.98302 -3.53933 -4.33868 -5.12014 -5.98419 -6.81804 -7.61313 -8.3559 -9.04136 -9.67168 -10.2509 -10.7801 -11.2551 -11.6678 -12.0089 -12.2732 -12.4619 -12.5813 -12.6429 -12.6592 -12.6437 -12.6061 -12.5516 -12.484 -12.4105 -12.313 -12.1678 -11.9724 -11.6776 -11.4511 -11.0368 -10.7354 -10.0777 -9.50213 -8.85292 -8.16698 -7.5187 -6.82469 -6.05955 -5.31909 -4.57532 -3.76728 -2.91937 -2.02428 -1.1871 -0.319215 0.577427 1.43609 2.26462 3.03245 3.77353 4.44144 5.05188 5.59552 5.96551 6.25358 6.34704 6.28581 6.09099 5.76692 5.39032 4.97196 4.55685 4.15688 3.77964 3.43826 3.09173 2.74429 2.40884 2.0159 1.644 1.30659 0.984719 0.674932 0.344043 -0.0988005 -0.622763 -1.11285 -0.551756 2.80817 3.83428 4.00357 4.21515 4.18574 0.481199 0.453581 0.232737 0.139997 0.661199 0.804281 1.05364 1.37535 1.53934 1.42922 1.08391 0.624714 0.157511 -0.305508 -0.75788 -1.2217 -1.71994 -1.66424 -1.82879 -1.67424 -2.00175 -2.24637 -2.73409 -3.47623 -4.15551 -5.06981 -5.92678 -6.74001 -7.4915 -8.1784 -8.8074 -9.38826 -9.92617 -10.4202 -10.8621 -11.2417 -11.5515 -11.792 -11.9696 -12.0942 -12.177 -12.228 -12.2571 -12.2703 -12.2701 -12.2554 -12.2216 -12.1498 -12.0292 -11.8525 -11.6383 -11.3804 -11.1506 -10.694 -10.1666 -9.56385 -8.95318 -8.34301 -7.65843 -6.97455 -6.20929 -5.44099 -4.67524 -3.86267 -2.9893 -2.15907 -1.27796 -0.439764 0.41747 1.24197 2.04224 2.78814 3.50218 4.16748 4.78324 5.29967 5.74071 5.98715 6.1231 6.07505 5.88243 5.58739 5.19516 4.79466 4.37494 3.96123 3.55644 3.15528 2.76161 2.35083 1.91926 1.49533 1.06097 0.677929 0.357956 0.0502364 -0.255585 -0.65208 -1.11157 -1.41379 -0.680904 2.64997 3.67557 3.82485 3.93459 3.90762 0.317703 0.353699 0.148738 0.084883 0.458305 0.543132 0.838275 1.21507 1.39477 1.28578 0.95146 0.523892 0.0997887 -0.300194 -0.77912 -1.26287 -1.64908 -1.9828 -1.75739 -1.92604 -1.94967 -2.257 -2.74097 -3.31111 -4.0782 -4.97992 -5.80611 -6.58867 -7.28556 -7.9141 -8.49455 -9.03714 -9.54663 -10.0173 -10.4373 -10.7954 -11.088 -11.3205 -11.5031 -11.6465 -11.759 -11.8465 -11.9129 -11.9616 -11.9939 -12.008 -11.9955 -11.9561 -11.8718 -11.66 -11.5788 -11.2571 -11.045 -10.5974 -10.1574 -9.55984 -9.02498 -8.4093 -7.76263 -7.05143 -6.32175 -5.55277 -4.74737 -3.9133 -3.0811 -2.21638 -1.38213 -0.559042 0.258586 1.03989 1.78315 2.50778 3.16678 3.79666 4.40156 4.90097 5.3398 5.63327 5.77497 5.7765 5.619 5.34922 5.00882 4.6162 4.22396 3.81678 3.40879 2.98843 2.55416 2.09876 1.60434 1.10771 0.626912 0.201076 -0.162442 -0.467253 -0.77001 -1.07602 -1.40098 -1.51299 -0.715813 2.50405 3.48321 3.64736 3.7577 3.73323 0.132883 0.201583 0.104332 0.10787 0.40956 0.416321 0.694845 1.07556 1.26087 1.16028 0.851856 0.469278 0.102694 -0.257226 -0.639198 -1.10736 -1.63992 -1.95066 -2.00133 -2.07097 -2.12456 -2.45083 -2.73411 -3.27999 -4.10364 -4.81721 -5.66145 -6.36845 -7.00436 -7.58729 -8.13219 -8.653 -9.14989 -9.61226 -10.0249 -10.3769 -10.6678 -10.9055 -11.1011 -11.2635 -11.3975 -11.5037 -11.5833 -11.6386 -11.6749 -11.6955 -11.7029 -11.6859 -11.6261 -11.5533 -11.3184 -11.2714 -10.8334 -10.5307 -10.0216 -9.57585 -9.03024 -8.42471 -7.78711 -7.08601 -6.34778 -5.56734 -4.7625 -3.92961 -3.10039 -2.26777 -1.45012 -0.656367 0.105428 0.839309 1.53281 2.19008 2.80339 3.39812 3.91773 4.45077 4.84315 5.16606 5.33685 5.36396 5.26393 5.03561 4.74206 4.39753 4.03037 3.65997 3.26778 2.85265 2.39633 1.9072 1.37499 0.823883 0.296861 -0.180684 -0.580296 -0.913547 -1.21051 -1.45328 -1.61574 -1.55312 -0.689849 2.3051 3.32524 3.49218 3.61564 3.59346 -0.0268054 0.0591522 0.0299862 0.145766 0.456494 0.402917 0.617021 0.963479 1.14172 1.05807 0.784978 0.458135 0.151995 -0.145443 -0.474711 -0.979255 -1.45369 -1.83576 -2.1762 -2.00038 -2.32869 -2.44913 -2.85631 -3.38873 -3.96215 -4.75167 -5.44611 -6.08781 -6.67865 -7.22545 -7.75232 -8.2688 -8.76932 -9.23785 -9.65686 -10.0153 -10.3135 -10.5596 -10.763 -10.9302 -11.063 -11.1606 -11.2238 -11.2592 -11.2767 -11.2881 -11.2974 -11.3099 -11.2809 -11.2795 -11.1343 -10.9962 -10.7633 -10.3447 -9.92013 -9.50465 -8.97529 -8.37982 -7.73066 -7.04049 -6.29697 -5.51238 -4.70944 -3.90556 -3.08056 -2.27437 -1.50081 -0.722442 -0.029133 0.655843 1.29141 1.87774 2.43849 2.95853 3.47274 3.92109 4.336 4.6222 4.80959 4.85609 4.77302 4.5987 4.33356 4.05014 3.73074 3.40525 3.06115 2.678 2.24231 1.73403 1.18202 0.589835 0.0252477 -0.484084 -0.935987 -1.30826 -1.61341 -1.82457 -1.82509 -1.55352 -0.636768 2.1811 3.17459 3.36877 3.49135 3.47119 -0.161986 -0.0585759 -0.0469924 0.122998 0.532904 0.464446 0.607196 0.892324 1.0528 0.984465 0.753376 0.481728 0.238209 -0.011581 -0.348343 -0.739095 -1.28433 -1.7868 -1.95676 -2.19503 -2.23933 -2.58513 -2.98427 -3.35888 -3.95518 -4.5837 -5.18138 -5.77965 -6.32538 -6.85201 -7.37726 -7.90368 -8.41924 -8.90347 -9.33605 -9.70507 -10.0102 -10.2576 -10.4549 -10.6066 -10.7149 -10.7797 -10.8064 -10.8049 -10.7919 -10.779 -10.7778 -10.8113 -10.8137 -10.7727 -10.8531 -10.59 -10.4452 -10.1061 -9.75195 -9.32121 -8.84149 -8.24122 -7.61027 -6.91699 -6.1816 -5.41414 -4.62476 -3.83457 -3.04652 -2.26115 -1.49945 -0.796762 -0.127683 0.486119 1.05662 1.59491 2.09567 2.54413 3.01771 3.43236 3.80432 4.08778 4.23717 4.27426 4.20048 4.02172 3.80813 3.54562 3.29426 3.03282 2.74569 2.4218 2.03227 1.5544 1.00201 0.410982 -0.185979 -0.73283 -1.20727 -1.64241 -1.97466 -2.14707 -1.99536 -1.46851 -0.483328 2.12753 3.0729 3.26044 3.38792 3.36952 -0.273303 -0.149137 -0.123596 0.0593386 0.604648 0.57711 0.661561 0.879387 1.00696 0.947367 0.754084 0.535099 0.337945 0.126527 -0.179265 -0.594302 -1.12082 -1.58757 -1.86326 -2.11534 -2.24832 -2.56146 -2.89916 -3.3651 -3.80079 -4.33308 -4.90692 -5.43759 -5.95736 -6.47923 -7.01282 -7.55588 -8.09058 -8.59148 -9.03614 -9.41165 -9.71592 -9.95401 -10.1316 -10.2535 -10.3227 -10.3438 -10.3251 -10.2826 -10.2314 -10.1908 -10.1851 -10.1724 -10.2411 -10.2348 -10.1981 -10.1858 -9.96036 -9.74659 -9.45644 -9.07771 -8.57572 -8.04083 -7.40355 -6.74094 -6.02217 -5.28101 -4.51932 -3.74889 -2.98948 -2.23755 -1.49168 -0.835792 -0.19431 0.331872 0.865869 1.33295 1.76712 2.20116 2.58631 2.9925 3.31388 3.5613 3.69421 3.69571 3.58653 3.42042 3.20012 2.98387 2.76426 2.55674 2.34499 2.08692 1.75682 1.34893 0.837641 0.276442 -0.297095 -0.860161 -1.37174 -1.83768 -2.21486 -2.32905 -2.00938 -1.24319 -0.202527 2.14818 3.00143 3.1814 3.30586 3.28898 -0.361147 -0.219025 -0.197453 0.00508153 0.691154 0.722429 0.773015 0.925425 1.01015 0.947363 0.785728 0.610519 0.45011 0.262394 -0.0189555 -0.45361 -0.916946 -1.38178 -1.77963 -1.89333 -2.16579 -2.44485 -2.77353 -3.13273 -3.58452 -4.06921 -4.57039 -5.07395 -5.58096 -6.1031 -6.64804 -7.207 -7.75596 -8.26658 -8.71516 -9.08845 -9.38368 -9.60454 -9.75633 -9.8436 -9.87209 -9.84823 -9.78632 -9.70199 -9.61212 -9.54906 -9.5196 -9.49269 -9.5657 -9.57018 -9.54648 -9.55031 -9.41348 -9.2685 -9.0428 -8.68472 -8.25699 -7.72174 -7.13866 -6.50864 -5.83019 -5.1111 -4.39127 -3.6604 -2.91818 -2.1809 -1.48219 -0.824756 -0.267358 0.265235 0.695801 1.12686 1.50696 1.87894 2.23851 2.58815 2.89776 3.10049 3.19415 3.17604 3.04314 2.84217 2.62911 2.4248 2.24452 2.07686 1.91154 1.71143 1.45932 1.11915 0.705708 0.224254 -0.293332 -0.819807 -1.34541 -1.81787 -2.21021 -2.2791 -1.77843 -0.830984 0.187546 2.19591 2.97328 3.1152 3.24534 3.22971 -0.420683 -0.275201 -0.252351 -0.00185255 0.814709 0.891544 0.92257 1.01774 1.05578 0.983942 0.846823 0.709388 0.577441 0.400305 0.119227 -0.28831 -0.777493 -1.22262 -1.5399 -1.7912 -1.98776 -2.2228 -2.5284 -2.86956 -3.27661 -3.72825 -4.20133 -4.68745 -5.18659 -5.71053 -6.26323 -6.82939 -7.38173 -7.89029 -8.3321 -8.69467 -8.9753 -9.1771 -9.3041 -9.36098 -9.35357 -9.29187 -9.18759 -9.06241 -8.94235 -8.85573 -8.75432 -8.85275 -8.73556 -8.86572 -8.87868 -8.79595 -8.82089 -8.68588 -8.48605 -8.20236 -7.82593 -7.30986 -6.81807 -6.20547 -5.58453 -4.91545 -4.23219 -3.53424 -2.82767 -2.11847 -1.43816 -0.802434 -0.274132 0.203439 0.612528 0.975702 1.3148 1.62564 1.95612 2.2704 2.53803 2.73201 2.80075 2.73668 2.60047 2.37533 2.15369 1.95539 1.78822 1.65682 1.52094 1.37152 1.17533 0.928705 0.621597 0.25824 -0.159875 -0.604011 -1.08227 -1.55718 -1.90916 -1.93329 -1.31932 -0.24405 0.698243 2.30367 2.9835 3.11421 3.20999 3.1953 -0.442222 -0.30308 -0.271062 0.0589804 0.975954 1.08259 1.09124 1.13825 1.1352 1.05496 0.940691 0.835385 0.725012 0.548104 0.254976 -0.152008 -0.628337 -1.04919 -1.34922 -1.56902 -1.73334 -1.93097 -2.18528 -2.51217 -2.8953 -3.3336 -3.79524 -4.27012 -4.76335 -5.28586 -5.8362 -6.39697 -6.93849 -7.43205 -7.85675 -8.20196 -8.46575 -8.65022 -8.7581 -8.79209 -8.75823 -8.66211 -8.52082 -8.35578 -8.21438 -8.04539 -8.04653 -7.935 -8.05431 -8.01436 -8.0689 -8.11489 -8.06781 -8.00918 -7.83628 -7.63243 -7.23467 -6.89276 -6.37513 -5.86985 -5.27873 -4.67439 -4.03089 -3.37152 -2.69881 -2.01629 -1.36335 -0.774144 -0.231929 0.190365 0.573532 0.898103 1.18423 1.46425 1.74053 2.0256 2.2843 2.44029 2.50037 2.44023 2.2649 2.04535 1.80283 1.60263 1.44819 1.32208 1.21788 1.10135 0.969534 0.807754 0.611846 0.364602 0.0750832 -0.28131 -0.674714 -1.10686 -1.44104 -1.40904 -0.738696 0.396862 1.26485 2.48745 3.04794 3.17258 3.27676 3.26311 -0.450915 -0.312312 -0.24132 0.172661 1.19085 1.29697 1.27285 1.27655 1.24283 1.16011 1.06804 0.989588 0.891552 0.708631 0.398264 -0.0187128 -0.462755 -0.848527 -1.11272 -1.26865 -1.39305 -1.5536 -1.77499 -2.08192 -2.46463 -2.89511 -3.34976 -3.81692 -4.30212 -4.8138 -5.34959 -5.89018 -6.4067 -6.87305 -7.27172 -7.59448 -7.83992 -8.00969 -8.104 -8.12474 -8.06986 -7.94767 -7.78123 -7.5805 -7.36865 -7.25368 -7.1411 -7.0951 -7.14765 -7.1838 -7.19672 -7.27105 -7.26477 -7.21919 -7.13224 -6.89802 -6.68204 -6.31446 -5.92545 -5.46253 -4.94322 -4.38338 -3.78456 -3.16379 -2.51699 -1.87396 -1.25061 -0.669769 -0.181061 0.239084 0.590804 0.875423 1.12591 1.3652 1.61593 1.86404 2.09223 2.25061 2.28698 2.2311 2.05419 1.8253 1.57658 1.36251 1.20546 1.09044 0.999154 0.923192 0.846927 0.760475 0.656442 0.507949 0.298555 0.0245627 -0.336346 -0.74152 -1.05808 -1.00604 -0.301596 0.897171 1.74108 2.67631 3.1449 3.24666 3.34867 3.33663 -0.45239 -0.315567 -0.208096 0.294894 1.43404 1.53418 1.46677 1.43089 1.37635 1.29688 1.22413 1.16367 1.06854 0.874834 0.551875 0.138653 -0.275275 -0.603142 -0.811594 -0.916778 -1.00218 -1.12306 -1.32589 -1.6214 -1.99793 -2.42344 -2.86978 -3.32596 -3.79488 -4.28519 -4.79278 -5.29908 -5.77773 -6.20665 -6.57164 -6.86701 -7.09212 -7.24791 -7.33443 -7.34641 -7.28335 -7.16048 -6.94383 -6.74777 -6.49777 -6.38801 -6.15908 -6.2692 -6.16237 -6.28368 -6.35538 -6.36277 -6.43018 -6.39322 -6.33178 -6.1797 -6.01276 -5.72082 -5.41667 -5.01063 -4.56308 -4.05303 -3.49788 -2.90247 -2.29076 -1.67544 -1.07341 -0.534209 -0.0514609 0.338294 0.648932 0.908689 1.13734 1.3277 1.54696 1.77494 1.97163 2.11025 2.14803 2.0826 1.91946 1.67799 1.43067 1.21284 1.04173 0.934919 0.864973 0.817973 0.790467 0.761103 0.701559 0.595538 0.398633 0.096574 -0.308866 -0.756256 -1.11229 -1.04426 -0.236862 1.12995 2.05136 2.81935 3.21532 3.30492 3.40306 3.3926 -0.446856 -0.306437 -0.174501 0.376509 1.66071 1.77737 1.6674 1.59732 1.53121 1.45771 1.39786 1.34373 1.24314 1.03729 0.711856 0.314838 -0.0576346 -0.329679 -0.478202 -0.545459 -0.593031 -0.687924 -0.870623 -1.15302 -1.51646 -1.9291 -2.36022 -2.79607 -3.23954 -3.69683 -4.16397 -4.62406 -5.05497 -5.43854 -5.76371 -6.02692 -6.22837 -6.37018 -6.44966 -6.46487 -6.41778 -6.26749 -6.10696 -5.83877 -5.69073 -5.36415 -5.38898 -5.19775 -5.33705 -5.33008 -5.45351 -5.50774 -5.55587 -5.56489 -5.49644 -5.46269 -5.26492 -5.11479 -4.83078 -4.51234 -4.12453 -3.66529 -3.15641 -2.58883 -2.00578 -1.41886 -0.842658 -0.318733 0.121165 0.494124 0.762568 0.998871 1.17163 1.35334 1.53392 1.72318 1.90047 1.99947 2.04676 1.96413 1.81386 1.57597 1.32346 1.10229 0.948756 0.839503 0.795536 0.775651 0.777127 0.75614 0.694445 0.527198 0.237685 -0.194814 -0.759257 -1.36079 -1.75988 -1.64713 -0.591649 1.13082 2.23792 2.89385 3.25269 3.34003 3.43806 3.42914 -0.434456 -0.289694 -0.15514 0.438133 1.85539 2.00673 1.86552 1.76935 1.69878 1.63192 1.57612 1.51743 1.40476 1.19018 0.86863 0.498695 0.168557 -0.0514625 -0.156092 -0.185065 -0.204255 -0.272779 -0.432538 -0.691089 -1.03132 -1.41892 -1.82339 -2.23002 -2.63872 -3.05373 -3.47096 -3.87709 -4.25428 -4.58803 -4.86966 -5.09676 -5.27143 -5.39695 -5.47603 -5.50573 -5.46273 -5.37699 -5.20964 -5.00044 -4.75745 -4.56095 -4.41398 -4.35936 -4.38799 -4.47026 -4.54085 -4.66928 -4.68519 -4.73222 -4.71315 -4.63685 -4.57306 -4.40169 -4.20273 -3.92959 -3.59774 -3.20209 -2.7263 -2.21062 -1.64723 -1.08349 -0.54802 -0.0440096 0.379186 0.68685 0.949444 1.11413 1.2623 1.39947 1.54446 1.70951 1.82885 1.91807 1.92414 1.86686 1.71493 1.48088 1.23631 1.02655 0.874259 0.801527 0.765698 0.7701 0.764251 0.714618 0.558456 0.253991 -0.244758 -0.922087 -1.70808 -2.49387 -2.97754 -2.65754 -1.15364 1.09017 2.3908 2.91221 3.2435 3.34329 3.45107 3.44363 -0.415341 -0.269646 -0.130723 0.497358 2.02693 2.21893 2.0607 1.94572 1.87474 1.81254 1.75325 1.68015 1.55252 1.3311 1.01982 0.675888 0.385151 0.202782 0.134691 0.136766 0.149327 0.110186 -0.0162371 -0.240796 -0.544133 -0.895113 -1.26348 -1.63319 -2.00089 -2.36784 -2.73095 -3.08052 -3.40328 -3.68722 -3.92465 -4.11434 -4.2608 -4.37177 -4.45303 -4.49906 -4.49951 -4.4624 -4.31597 -4.15694 -3.91732 -3.78452 -3.50981 -3.57965 -3.51699 -3.64334 -3.69776 -3.82277 -3.88223 -3.91488 -3.89625 -3.88879 -3.78701 -3.67436 -3.49608 -3.26573 -2.97562 -2.62593 -2.21069 -1.73017 -1.21662 -0.682253 -0.162045 0.295774 0.687234 0.966945 1.15963 1.29051 1.38616 1.46748 1.57534 1.68753 1.76846 1.80398 1.79414 1.74535 1.57267 1.39505 1.14257 0.95066 0.824512 0.76486 0.756298 0.754227 0.722648 0.584183 0.281365 -0.247349 -1.02334 -2.00031 -3.07397 -4.01243 -4.44895 -3.75519 -1.54647 1.27845 2.62929 2.86376 3.1834 3.31192 3.44371 3.43773 -0.364831 -0.246022 -0.0931753 0.564909 2.18059 2.42698 2.26734 2.1383 2.06562 2.00505 1.93474 1.84059 1.69368 1.46765 1.1661 0.845116 0.580375 0.426386 0.384784 0.418403 0.463829 0.46392 0.379151 0.201374 -0.0548139 -0.35988 -0.685808 -1.0141 -1.33825 -1.65602 -1.96689 -2.26331 -2.53639 -2.77491 -2.97197 -3.12708 -3.24848 -3.34831 -3.43423 -3.50627 -3.56092 -3.52937 -3.48727 -3.32496 -3.1726 -2.93561 -2.87361 -2.72574 -2.79662 -2.84609 -2.95648 -3.01238 -3.12655 -3.126 -3.14388 -3.09082 -3.03538 -2.90469 -2.74117 -2.52848 -2.27737 -1.96053 -1.60276 -1.17083 -0.698504 -0.211949 0.27492 0.715807 1.04404 1.30379 1.42685 1.50351 1.53394 1.56295 1.61339 1.66133 1.69046 1.6624 1.62345 1.55398 1.43405 1.22169 1.03373 0.85837 0.757936 0.716924 0.724111 0.701505 0.611789 0.357163 -0.132438 -0.922524 -1.9948 -3.28648 -4.59328 -5.60636 -5.76624 -4.42389 -1.40648 1.8987 3.01001 2.78022 3.08585 3.26724 3.4084 3.40389 -0.164892 -0.102352 -0.0171253 0.657159 2.32991 2.65058 2.50994 2.36834 2.28909 2.22395 2.13729 2.0151 1.84532 1.61117 1.31745 1.00954 0.760475 0.621976 0.602615 0.664214 0.747394 0.79135 0.758429 0.635724 0.435568 0.182205 -0.0967962 -0.382939 -0.662882 -0.937138 -1.20089 -1.45411 -1.68611 -1.88849 -2.05309 -2.18206 -2.2859 -2.38071 -2.47957 -2.57678 -2.65556 -2.70731 -2.64281 -2.58825 -2.39524 -2.25276 -2.15475 -2.069 -2.10478 -2.14304 -2.25264 -2.33086 -2.38035 -2.4089 -2.41337 -2.34444 -2.26725 -2.14191 -1.96509 -1.75835 -1.51262 -1.24796 -0.913689 -0.550779 -0.123013 0.327396 0.766529 1.16542 1.47988 1.65408 1.75163 1.75027 1.71505 1.6647 1.65509 1.63533 1.57349 1.50114 1.41556 1.29683 1.20451 1.03596 0.858577 0.728172 0.651877 0.641046 0.635112 0.594697 0.412834 0.0226776 -0.658735 -1.6851 -3.03131 -4.53402 -5.94145 -6.7783 -6.42873 -4.2741 -0.521397 2.89679 3.46615 2.69429 2.96566 3.13293 3.17917 3.17728 0.0475313 0.12434 0.223209 0.856245 2.52892 2.92371 2.81404 2.65946 2.56433 2.48784 2.37918 2.22486 2.02584 1.7789 1.48476 1.18168 0.935403 0.803629 0.797504 0.884732 1.00364 1.09597 1.1198 1.05986 0.921142 0.724822 0.493542 0.252552 0.0110679 -0.224618 -0.451655 -0.673027 -0.877047 -1.05464 -1.19982 -1.3144 -1.41294 -1.51309 -1.62621 -1.74936 -1.85679 -1.92323 -1.92081 -1.82591 -1.71733 -1.63985 -1.46263 -1.52783 -1.47391 -1.56688 -1.61925 -1.7053 -1.731 -1.74858 -1.69066 -1.64939 -1.5251 -1.37587 -1.19387 -0.973508 -0.735271 -0.477464 -0.195397 0.137735 0.499486 0.899351 1.30603 1.64738 1.93217 2.06645 2.08537 2.02918 1.91374 1.78921 1.69015 1.59335 1.45619 1.28908 1.13514 1.03118 0.888707 0.777371 0.649189 0.542879 0.497821 0.497915 0.485764 0.387188 0.117264 -0.410729 -1.27534 -2.47872 -3.96569 -5.52314 -6.75787 -7.15828 -6.098 -3.23085 0.90019 3.9818 3.83022 2.55816 2.73887 2.87069 2.89991 2.90058 0.281352 0.367697 0.469994 1.13353 2.80078 3.26475 3.19514 3.02726 2.908 2.81165 2.67797 2.48786 2.25531 1.98664 1.68381 1.37423 1.12167 0.984703 0.983432 1.08672 1.23795 1.37722 1.46111 1.46691 1.39438 1.25621 1.07793 0.88148 0.669729 0.480784 0.264998 0.0735826 -0.119838 -0.288809 -0.427787 -0.543722 -0.650388 -0.766382 -0.900312 -1.04391 -1.15937 -1.24901 -1.25047 -1.16465 -1.12636 -0.977312 -1.00373 -0.935146 -1.01819 -1.02848 -1.1033 -1.12033 -1.15484 -1.10908 -1.04866 -0.942793 -0.811452 -0.629714 -0.42082 -0.187886 0.0501946 0.310165 0.562655 0.851169 1.16802 1.50388 1.84256 2.18033 2.37796 2.49792 2.45079 2.31996 2.12637 1.92812 1.72869 1.55473 1.32793 1.05551 0.829753 0.651455 0.545857 0.446006 0.361395 0.303442 0.276856 0.267075 0.2355 0.0738349 -0.290625 -0.934672 -1.90405 -3.19357 -4.64493 -6.00438 -6.82887 -6.60108 -4.86605 -1.56401 2.41369 4.82691 3.98361 2.34795 2.46791 2.61557 2.65153 2.65531 0.536115 0.62287 0.73905 1.41805 3.106 3.65965 3.64748 3.47633 3.3287 3.20672 3.0454 2.81971 2.54868 2.25087 1.92819 1.60386 1.33414 1.18245 1.17218 1.28061 1.4544 1.63636 1.77775 1.85022 1.84329 1.76773 1.647 1.47643 1.34576 1.13227 0.987667 0.777919 0.586342 0.410426 0.259458 0.127302 -0.00188455 -0.143763 -0.300743 -0.450603 -0.597797 -0.638959 -0.668576 -0.618755 -0.550602 -0.493973 -0.524829 -0.522185 -0.576594 -0.623195 -0.62264 -0.650058 -0.595069 -0.535685 -0.421936 -0.276461 -0.0915102 0.10556 0.344776 0.586903 0.843741 1.08874 1.34095 1.58196 1.84525 2.1201 2.40882 2.67811 2.86219 2.90467 2.82979 2.61853 2.36204 2.06771 1.7909 1.51926 1.19934 0.838458 0.492412 0.262672 0.117448 0.0504685 0.00851559 -0.0270227 -0.0356856 -0.0501591 -0.131919 -0.34828 -0.779636 -1.47814 -2.45944 -3.64484 -4.88745 -5.83048 -6.0937 -5.26313 -3.11024 0.215226 3.67151 5.28809 3.95914 2.16371 2.21988 2.37118 2.41457 2.42116 0.811276 0.90384 1.04258 1.72559 3.42525 4.08027 4.15316 3.99889 3.82763 3.67712 3.48889 3.22837 2.91736 2.58225 2.2319 1.88399 1.59027 1.41225 1.37989 1.47743 1.66135 1.87512 2.06798 2.2024 2.26241 2.25054 2.16355 2.09924 1.92218 1.84012 1.67301 1.46481 1.25731 1.05132 0.871168 0.70771 0.544103 0.369955 0.190172 0.0230027 -0.0811872 -0.172187 -0.160058 -0.125183 -0.0732415 -0.140895 -0.095828 -0.237167 -0.235654 -0.273644 -0.252 -0.215287 -0.117211 0.00744558 0.173438 0.378083 0.596583 0.846888 1.09068 1.34836 1.60797 1.85733 2.09805 2.3156 2.51626 2.73214 2.96595 3.15802 3.32993 3.31588 3.18166 2.93899 2.59793 2.22324 1.88205 1.50953 1.09937 0.640191 0.198292 -0.140486 -0.325728 -0.415227 -0.440228 -0.437414 -0.450638 -0.479006 -0.588755 -0.8384 -1.28505 -1.93502 -2.78468 -3.72885 -4.57495 -5.04352 -4.77839 -3.53731 -1.2674 1.71032 4.47286 5.40651 3.82277 2.02266 1.99299 2.13176 2.18441 2.19347 1.10639 1.20968 1.37929 2.07043 3.75844 4.51192 4.6952 4.58231 4.39748 4.2207 4.0074 3.71645 3.36468 2.98832 2.60325 2.22776 1.90403 1.69185 1.62283 1.69343 1.86909 2.10018 2.33291 2.52344 2.64383 2.68241 2.67656 2.58191 2.51919 2.48025 2.31657 2.15716 1.89735 1.65165 1.42619 1.21719 1.00898 0.797948 0.59632 0.431492 0.323742 0.256512 0.259848 0.251628 0.24951 0.225517 0.0898474 0.0595851 -0.0226295 0.0121907 0.03114 0.164869 0.295573 0.496522 0.737382 0.992142 1.26978 1.54673 1.81304 2.07354 2.32875 2.58779 2.81454 3.01671 3.18365 3.33549 3.49171 3.65487 3.73743 3.71974 3.52626 3.2375 2.84863 2.40999 1.97511 1.54291 1.05829 0.496229 -0.042873 -0.478693 -0.770403 -0.899086 -0.944296 -0.941347 -0.939584 -0.976913 -1.09583 -1.32783 -1.7045 -2.20999 -2.81229 -3.41507 -3.83595 -3.87505 -3.2575 -1.86956 0.242263 2.76751 4.87068 5.29705 3.6413 1.90643 1.79376 1.9034 1.96088 1.97207 1.55194 1.57144 1.74713 2.43915 4.09808 4.95228 5.26061 5.21096 5.02539 4.82624 4.59316 4.27732 3.8892 3.46984 3.04831 2.64271 2.28845 2.03618 1.92015 1.94584 2.09338 2.32156 2.57821 2.81249 2.98374 3.07479 3.09002 2.99463 3.04362 2.90331 2.9539 2.76616 2.50837 2.21723 1.9467 1.679 1.41925 1.16941 0.948553 0.782778 0.66639 0.63255 0.584253 0.556945 0.495382 0.403893 0.290761 0.20208 0.180113 0.184916 0.297376 0.447022 0.659319 0.940171 1.24319 1.56157 1.89401 2.19886 2.48465 2.74504 2.99839 3.24946 3.4832 3.6757 3.82101 3.9168 4.0147 4.11872 4.14348 4.07056 3.86351 3.51538 3.09424 2.61123 2.10408 1.60767 1.05833 0.450822 -0.19477 -0.738052 -1.12709 -1.36367 -1.44667 -1.4665 -1.45841 -1.48508 -1.57304 -1.75585 -1.9995 -2.3002 -2.61401 -2.85767 -2.93966 -2.66881 -1.91049 -0.557662 1.31737 3.40921 5.02779 5.10439 3.44223 1.81624 1.6306 1.69579 1.73676 1.74961 2.07353 2.10408 2.24035 2.8582 4.45936 5.39829 5.83766 5.86847 5.69367 5.47719 5.22869 4.8977 4.48101 4.02402 3.56664 3.13327 2.74986 2.45789 2.28752 2.25394 2.35126 2.55222 2.81112 3.07046 3.28349 3.41186 3.41676 3.42337 3.24372 3.3406 3.32134 3.25259 3.0187 2.75904 2.42964 2.11119 1.80146 1.51185 1.26779 1.08907 0.990156 0.893248 0.837265 0.772755 0.642486 0.502452 0.423862 0.308046 0.313428 0.369809 0.511103 0.70082 1.01265 1.34099 1.70624 2.09362 2.4537 2.79319 3.0906 3.35498 3.60797 3.84504 4.07911 4.27872 4.40501 4.48043 4.52163 4.55211 4.53784 4.40163 4.1481 3.78912 3.32845 2.8066 2.26293 1.70948 1.11807 0.460674 -0.216865 -0.870219 -1.3749 -1.70622 -1.88741 -1.94521 -1.94206 -1.94355 -1.98302 -2.07151 -2.19249 -2.28489 -2.34384 -2.29952 -2.12174 -1.68405 -0.88284 0.362144 2.04333 3.8166 5.07772 4.90116 3.27233 1.79382 1.49999 1.48669 1.49067 1.5044 2.60125 2.64798 2.8003 3.3717 4.86939 5.85937 6.41919 6.54017 6.38651 6.15305 5.89206 5.55495 5.1242 4.63975 4.15347 3.69573 3.28901 2.96086 2.73605 2.63294 2.6595 2.80648 3.03994 3.30346 3.54107 3.70406 3.76991 3.72208 3.65179 3.64997 3.64016 3.59531 3.49782 3.21384 2.88443 2.53046 2.17013 1.84158 1.57316 1.37595 1.23037 1.13612 0.997493 0.862675 0.723315 0.592245 0.443692 0.442609 0.436694 0.558205 0.717317 1.0114 1.34277 1.73945 2.16661 2.5689 2.9699 3.32178 3.63032 3.90287 4.14388 4.38288 4.60941 4.79589 4.93476 4.99254 5.00399 4.97734 4.90216 4.70761 4.4123 4.02712 3.54868 3.00327 2.43081 1.83352 1.2246 0.553294 -0.160696 -0.849865 -1.44837 -1.89542 -2.16988 -2.2945 -2.32169 -2.30024 -2.28872 -2.28837 -2.28677 -2.23205 -2.09963 -1.86611 -1.49413 -0.953015 -0.129637 1.07051 2.56981 4.12702 5.07562 4.69421 3.08825 1.76522 1.35028 1.26639 1.24272 1.25697 3.13502 3.20458 3.36488 3.87811 5.29806 6.32843 6.99373 7.21485 7.09106 6.83862 6.55959 6.22333 5.79377 5.29955 4.79488 4.32042 3.89639 3.54042 3.26621 3.09114 3.03125 3.10202 3.27081 3.52629 3.76431 3.97376 4.07715 4.06995 4.07118 3.94848 3.99106 3.95325 3.87406 3.63034 3.32357 2.93135 2.53447 2.1742 1.87346 1.63914 1.45379 1.27718 1.11424 0.925496 0.754955 0.603969 0.541676 0.521553 0.608294 0.753308 0.990679 1.30849 1.69413 2.14141 2.60042 3.03576 3.43828 3.79636 4.10529 4.37621 4.61933 4.8436 5.06055 5.2578 5.38991 5.44715 5.44987 5.38348 5.24444 4.99326 4.64987 4.23352 3.74161 3.18812 2.59411 1.98368 1.35063 0.694229 -0.0110023 -0.711629 -1.35347 -1.87543 -2.24685 -2.44372 -2.51611 -2.49924 -2.44665 -2.38321 -2.28806 -2.12215 -1.87483 -1.50123 -0.999308 -0.354256 0.524234 1.68963 3.07825 4.39244 5.05693 4.45387 2.85264 1.66177 1.23478 1.03204 0.992949 1.00737 3.6746 3.77988 3.93913 4.38809 5.73463 6.78657 7.54715 7.87755 7.80001 7.52518 7.21632 6.87711 6.46234 5.97704 5.47112 4.98918 4.55633 4.18137 3.8691 3.62423 3.48214 3.43528 3.55733 3.70963 3.9958 4.20626 4.37514 4.42104 4.35928 4.33856 4.2595 4.3202 4.19339 4.06257 3.71935 3.31786 2.9054 2.51664 2.1808 1.89731 1.64859 1.41454 1.18458 0.975706 0.788609 0.672171 0.627529 0.666188 0.810157 1.01392 1.31043 1.65441 2.10061 2.57624 3.04957 3.50422 3.88463 4.22017 4.51588 4.77152 5.00901 5.23375 5.44418 5.64081 5.78334 5.85765 5.84794 5.77204 5.56244 5.26021 4.8599 4.40847 3.9075 3.34771 2.75065 2.13192 1.49865 0.853462 0.194031 -0.484892 -1.12283 -1.67792 -2.09668 -2.37597 -2.48467 -2.49595 -2.43501 -2.31891 -2.16323 -1.92565 -1.58458 -1.1192 -0.51614 0.234996 1.18288 2.32097 3.59187 4.63167 4.99776 4.16726 2.54927 1.50422 1.07997 0.852463 0.741357 0.755584 4.23269 4.365 4.53356 4.92913 6.17833 7.23098 8.06479 8.51166 8.50146 8.21148 7.85618 7.50061 7.10296 6.64445 6.15554 5.68074 5.24735 4.86351 4.52327 4.23121 3.98259 3.87782 3.81736 3.98668 4.16679 4.43414 4.64084 4.69362 4.70869 4.63025 4.58189 4.56841 4.59789 4.39893 4.09578 3.70356 3.2804 2.87641 2.50894 2.17274 1.85819 1.56391 1.29346 1.06273 0.88892 0.793002 0.782971 0.882491 1.05981 1.32537 1.66676 2.08779 2.56214 3.06866 3.55721 3.96487 4.31563 4.60301 4.85636 5.08638 5.31021 5.52733 5.75607 5.95605 6.11529 6.21476 6.22058 6.11671 5.87964 5.49045 5.03894 4.5566 4.03629 3.48501 2.89323 2.26955 1.64851 1.02685 0.410081 -0.202205 -0.804545 -1.34852 -1.79433 -2.09493 -2.26564 -2.30166 -2.23738 -2.11017 -1.90428 -1.61898 -1.21837 -0.68138 0.00204365 0.84159 1.82582 2.93862 4.02507 4.81375 4.85529 3.82269 2.19762 1.3045 0.894006 0.682688 0.488001 0.501697 4.73437 4.94771 5.12789 5.49293 6.6477 7.6717 8.54219 9.09289 9.17537 8.89064 8.48219 8.08757 7.69823 7.27461 6.82156 6.36976 5.94822 5.56435 5.20857 4.8754 4.57012 4.33665 4.22311 4.24962 4.39577 4.64145 4.83794 4.94494 4.92763 4.85038 4.86542 4.86228 4.85722 4.71615 4.45145 4.07082 3.66423 3.26377 2.87183 2.48919 2.11982 1.77755 1.48122 1.24299 1.09206 1.00623 1.04468 1.1541 1.37334 1.66573 2.05023 2.51846 3.03298 3.57698 4.05426 4.43001 4.72074 4.94757 5.12823 5.32711 5.5253 5.74793 5.97725 6.20518 6.39524 6.51218 6.55577 6.43766 6.15495 5.70642 5.18843 4.65924 4.13874 3.59223 3.01222 2.40274 1.78811 1.20138 0.634516 0.0853094 -0.446054 -0.937223 -1.37628 -1.69599 -1.88714 -1.95545 -1.90664 -1.77372 -1.5562 -1.23411 -0.801674 -0.224703 0.51521 1.38342 2.38018 3.40726 4.30369 4.8348 4.62219 3.41307 1.81351 1.06203 0.686314 0.485365 0.319513 0.332049 5.01612 5.27673 5.58824 6.02473 7.11222 8.09725 8.96415 9.59436 9.78602 9.54442 9.09305 8.64171 8.23951 7.8484 7.44295 7.03266 6.63623 6.26335 5.90714 5.53683 5.21284 4.86912 4.70375 4.56459 4.70296 4.85189 5.02722 5.14688 5.09673 5.06699 5.03958 5.09837 5.07238 5.01535 4.7456 4.4267 4.06188 3.67716 3.27707 2.86522 2.4603 2.08829 1.77588 1.54558 1.39164 1.34937 1.37269 1.51362 1.73391 2.05473 2.4635 2.97517 3.52807 4.0808 4.53912 4.89225 5.09658 5.2471 5.36687 5.50107 5.67576 5.91545 6.14722 6.39357 6.61291 6.77127 6.82521 6.72853 6.39256 5.88372 5.30579 4.73817 4.19915 3.67115 3.10963 2.52011 1.92644 1.36014 0.850907 0.372232 -0.0830816 -0.520234 -0.891329 -1.21299 -1.42009 -1.50914 -1.49131 -1.36479 -1.15062 -0.83449 -0.387784 0.193363 0.936298 1.79262 2.73032 3.63655 4.3741 4.67792 4.26638 2.94892 1.39663 0.79007 0.453206 0.290263 0.287494 0.299185 5.26837 5.50613 5.80444 6.28089 7.41934 8.42299 9.28997 9.97747 10.2887 10.1334 9.67539 9.16424 8.72762 8.3541 8.0001 7.64567 7.29244 6.94459 6.59033 6.23624 5.8393 5.51007 5.17699 5.05358 4.99838 5.11043 5.24237 5.2994 5.30149 5.24406 5.2308 5.26332 5.28968 5.19356 5.02137 4.76392 4.45473 4.10812 3.72039 3.30438 2.88712 2.50286 2.18257 1.94899 1.81137 1.76287 1.80605 1.94087 2.15686 2.49082 2.93406 3.46214 4.05862 4.59643 5.04095 5.30308 5.47226 5.50285 5.57882 5.64171 5.82558 6.0311 6.30102 6.55735 6.78695 6.97577 7.05757 6.94584 6.58679 6.02187 5.37976 4.78121 4.23102 3.71218 3.18656 2.6204 2.05042 1.52466 1.04899 0.634864 0.26003 -0.0923572 -0.41865 -0.690652 -0.898457 -1.00878 -1.02036 -0.925132 -0.733311 -0.438498 -0.0284968 0.522355 1.2149 2.0131 2.84405 3.61682 4.20028 4.36675 3.8118 2.45117 0.980403 0.532903 0.339958 0.341745 0.360462 0.371566 5.49195 5.71102 5.99808 6.43842 7.58944 8.62948 9.49288 10.2143 10.6362 10.606 10.1938 9.64728 9.16413 8.78959 8.48022 8.19084 7.89783 7.59169 7.26603 6.89981 6.51792 6.12693 5.77489 5.53174 5.40998 5.40898 5.457 5.45545 5.48665 5.46899 5.48455 5.4934 5.45886 5.38867 5.27617 5.07302 4.83559 4.54016 4.18713 3.7925 3.38619 3.00399 2.68046 2.44001 2.2996 2.24992 2.292 2.41275 2.63154 2.96314 3.42316 3.98954 4.57715 5.11534 5.5006 5.71389 5.77277 5.78568 5.74803 5.82522 5.95821 6.18806 6.4476 6.71036 6.95523 7.1474 7.23601 7.11597 6.71085 6.0967 5.41884 4.78016 4.22863 3.73054 3.23531 2.71192 2.17011 1.67047 1.24857 0.888337 0.57718 0.309745 0.0563636 -0.170324 -0.35845 -0.480483 -0.51807 -0.462559 -0.32261 -0.0733691 0.271079 0.748883 1.34266 2.03375 2.73642 3.37923 3.83184 3.89957 3.31128 1.98528 0.66281 0.45238 0.380537 0.397126 0.420839 0.431215 5.68732 5.89155 6.18179 6.57719 7.71252 8.74952 9.58128 10.2968 10.8015 10.9115 10.6016 10.0665 9.54785 9.15771 8.88069 8.65763 8.43841 8.19153 7.91324 7.5502 7.20213 6.77217 6.39591 6.08866 5.89989 5.74894 5.68277 5.66331 5.65403 5.69904 5.70952 5.73142 5.69731 5.64222 5.51407 5.38275 5.20469 4.96063 4.65823 4.30529 3.92763 3.56062 3.23866 2.99098 2.83222 2.76885 2.80018 2.90443 3.12892 3.46514 3.94349 4.51763 5.11446 5.60753 5.92199 6.08041 6.06744 6.02765 5.98665 6.02319 6.14782 6.37852 6.63013 6.88201 7.11859 7.31357 7.38359 7.22335 6.77628 6.11671 5.40545 4.75094 4.19716 3.72798 3.27204 2.78355 2.29362 1.82102 1.43945 1.13278 0.89 0.688728 0.510927 0.339927 0.186731 0.0632539 0.00570439 0.00899066 0.0965602 0.254344 0.518412 0.877923 1.35612 1.89816 2.4547 2.96903 3.33421 3.36088 2.79764 1.5989 0.460421 0.43312 0.412994 0.438877 0.468848 0.478357 5.8552 6.0596 6.35182 6.70745 7.80361 8.8056 9.57285 10.2421 10.784 11.0233 10.8541 10.3893 9.86816 9.46379 9.20652 9.04296 8.90469 8.74241 8.49288 8.25159 7.81964 7.47061 7.05712 6.72473 6.42445 6.20642 6.00566 5.87869 5.86095 5.8709 5.96015 5.9602 5.97141 5.88991 5.79734 5.69944 5.55869 5.37248 5.1205 4.8156 4.47824 4.13786 3.82501 3.57397 3.40024 3.3187 3.32708 3.44356 3.6529 4.00553 4.49014 5.07118 5.63679 6.08082 6.33031 6.38715 6.3708 6.27873 6.25954 6.27176 6.41213 6.60785 6.85217 7.09493 7.30458 7.47235 7.51508 7.28598 6.77923 6.08681 5.35877 4.69765 4.15526 3.71307 3.30284 2.86427 2.40432 1.98828 1.63656 1.3801 1.19549 1.05896 0.948041 0.841518 0.731587 0.631139 0.552836 0.516264 0.531593 0.602902 0.737754 0.969142 1.28946 1.67447 2.08786 2.4784 2.77368 2.81814 2.34993 1.31189 0.338836 0.419089 0.432241 0.464934 0.504687 0.513196 5.99614 6.1843 6.47091 6.78917 7.84335 8.79926 9.48974 10.08 10.6118 10.9448 10.9285 10.584 10.1087 9.7077 9.46531 9.35151 9.29198 9.21392 9.08261 8.83044 8.53981 8.13473 7.78501 7.42931 7.09005 6.7561 6.38277 6.18518 6.08363 6.109 6.18089 6.27245 6.2415 6.17124 6.09857 6.02548 5.92169 5.77436 5.56628 5.30672 5.01225 4.70448 4.41356 4.16118 3.9895 3.89505 3.89578 4.00974 4.23119 4.59028 5.07857 5.64591 6.17494 6.53534 6.69833 6.7056 6.64212 6.58331 6.53718 6.58163 6.69915 6.89134 7.11042 7.33154 7.52701 7.64884 7.61734 7.31635 6.74359 6.02264 5.28924 4.63742 4.11636 3.7087 3.33972 2.95219 2.53756 2.15803 1.85152 1.63387 1.50045 1.42253 1.37594 1.33091 1.27836 1.21312 1.14062 1.07544 1.02537 1.0073 1.01847 1.0973 1.25423 1.46689 1.72606 2.00615 2.26547 2.348 2.02517 1.15434 0.291943 0.430652 0.436603 0.47705 0.528602 0.535978 5.44485 5.90822 6.44181 6.77515 7.79938 8.7214 9.3427 9.84397 10.3267 10.7082 10.8288 10.6338 10.2511 9.88409 9.66011 9.58702 9.59847 9.61379 9.5783 9.39863 9.19217 8.83968 8.55164 8.22907 7.82899 7.30361 6.90834 6.53416 6.36293 6.41256 6.49577 6.58708 6.54744 6.48283 6.42498 6.36726 6.30286 6.17059 5.99981 5.77403 5.51832 5.24519 4.97956 4.74505 4.56951 4.48974 4.499 4.62291 4.86204 5.23899 5.73339 6.26681 6.72129 6.98594 7.04073 6.99873 6.92543 6.87567 6.85059 6.88017 6.98786 7.18021 7.38353 7.58924 7.76419 7.83836 7.70573 7.31824 6.68347 5.94872 5.21909 4.58789 4.09777 3.72806 3.4036 3.05696 2.69411 2.34738 2.08322 1.90632 1.81141 1.7788 1.78665 1.80445 1.80832 1.79401 1.74845 1.68688 1.60489 1.51093 1.4313 1.37063 1.36512 1.41612 1.51399 1.69273 1.90984 2.0541 1.86914 1.13675 0.315785 0.443217 0.451428 0.484238 0.54064 0.546742 4.85791 5.30225 5.81781 6.31373 7.47247 8.47185 9.09655 9.54147 9.96532 10.3562 10.5817 10.5401 10.2839 9.98393 9.79059 9.75048 9.82211 9.92601 9.96785 9.94767 9.73894 9.59074 9.34126 9.01426 8.52081 7.98726 7.41483 6.97955 6.79483 6.78431 6.90547 6.93986 6.90109 6.82639 6.77817 6.74961 6.68569 6.5848 6.42326 6.2317 6.00339 5.76391 5.517 5.32063 5.15532 5.07378 5.15558 5.27791 5.597 5.97426 6.46585 6.9476 7.28209 7.40511 7.35159 7.23836 7.17504 7.14911 7.14786 7.1462 7.2369 7.41627 7.65415 7.8445 7.99123 8.01489 7.78924 7.29789 6.62819 5.87576 5.16548 4.56658 4.11828 3.78873 3.50322 3.19778 2.87187 2.57541 2.34012 2.19355 2.13491 2.1371 2.17867 2.23734 2.30389 2.33572 2.34657 2.31594 2.24666 2.1381 1.99171 1.85922 1.72718 1.63843 1.59741 1.65906 1.82255 2.00785 1.91658 1.26055 0.39848 0.447524 0.514141 0.546895 0.572158 0.57623 4.24502 4.67949 5.16417 5.63655 6.89827 8.02463 8.71828 9.16054 9.54479 9.926 10.2226 10.32 10.2069 10.0022 9.85538 9.84531 9.96084 10.1348 10.2827 10.3354 10.3165 10.2314 10.0618 9.71947 9.23584 8.63775 8.02768 7.58313 7.30135 7.29666 7.3849 7.38312 7.29067 7.21612 7.17749 7.15371 7.09423 7.01268 6.86719 6.68733 6.4922 6.28058 6.06099 5.87457 5.75814 5.75057 5.81599 6.0806 6.39525 6.84897 7.27561 7.64268 7.81343 7.77216 7.58834 7.39812 7.33016 7.34882 7.38405 7.38323 7.43918 7.60043 7.85401 8.10096 8.19643 8.134 7.85263 7.28888 6.57485 5.82233 5.13902 4.58841 4.18951 3.90155 3.65088 3.38213 3.0946 2.82955 2.63481 2.51846 2.47462 2.49604 2.55687 2.64014 2.72394 2.81894 2.87834 2.90728 2.88584 2.81431 2.6894 2.52665 2.35476 2.18018 2.04725 1.99109 2.07684 2.22789 2.1846 1.52719 0.557298 0.526041 0.698509 0.701769 0.666552 0.668606 3.6067 4.02559 4.50107 4.93962 6.22979 7.44106 8.21388 8.6936 9.07078 9.4442 9.78653 9.99947 10.0302 9.94105 9.85836 9.87932 10.0237 10.2477 10.479 10.6438 10.7594 10.7728 10.6538 10.3632 9.91143 9.3457 8.77591 8.22259 7.98956 7.93361 7.94596 7.88809 7.76448 7.66395 7.61615 7.57809 7.55062 7.45237 7.33057 7.17836 7.00239 6.79228 6.62656 6.45009 6.42824 6.49405 6.68112 6.98407 7.36375 7.75894 8.09638 8.26369 8.26579 8.02315 7.69366 7.47477 7.37918 7.43332 7.48636 7.58024 7.6091 7.78251 8.03282 8.27313 8.39009 8.23536 7.84716 7.28948 6.55611 5.79878 5.14164 4.65485 4.31808 4.07515 3.84925 3.61509 3.36643 3.13653 2.96505 2.87517 2.85064 2.87186 2.92214 3.01295 3.10099 3.20612 3.3166 3.39502 3.45176 3.44764 3.39815 3.29512 3.15466 2.98405 2.80791 2.67536 2.65832 2.71977 2.62753 1.92802 0.813177 0.678555 0.888404 0.900517 0.822654 0.822702 2.94345 3.35941 3.82032 4.23401 5.52768 6.77472 7.61245 8.15015 8.55298 8.93205 9.30637 9.60888 9.77239 9.80919 9.80907 9.86726 10.0302 10.2821 10.5707 10.8455 11.061 11.1739 11.1327 10.9273 10.5615 10.079 9.49023 9.0287 8.72871 8.64025 8.60849 8.47612 8.30658 8.17493 8.09273 8.05875 8.00813 7.92617 7.83062 7.69392 7.50862 7.33353 7.16238 7.11919 7.16478 7.34315 7.63558 7.94326 8.31709 8.60598 8.74329 8.75199 8.51312 8.12745 7.69461 7.38473 7.31592 7.42395 7.56004 7.63241 7.78811 7.9588 8.22136 8.46016 8.51322 8.33199 7.84611 7.23614 6.54633 5.83199 5.18889 4.76689 4.49651 4.30558 4.12226 3.90561 3.68366 3.49716 3.35105 3.27614 3.25589 3.27427 3.31646 3.35627 3.44921 3.52743 3.64922 3.77617 3.89015 3.97363 4.0267 4.02817 3.97824 3.88429 3.73441 3.57807 3.44952 3.40626 3.21296 2.42972 1.12804 0.826655 1.08062 1.11223 1.03371 1.03185 2.26191 2.66785 3.11493 3.51156 4.78404 6.0502 6.94592 7.55694 8.01016 8.41401 8.81473 9.18368 9.45895 9.62154 9.71849 9.82767 10.0057 10.267 10.5882 10.9309 11.2339 11.4371 11.4948 11.3919 11.1378 10.7137 10.2463 9.80274 9.50461 9.42609 9.33224 9.10101 8.91395 8.75926 8.64915 8.5791 8.48878 8.43886 8.34802 8.22348 8.04828 7.86903 7.74366 7.81003 7.97187 8.24502 8.51556 8.8357 9.08118 9.21413 9.21984 8.95643 8.56725 8.08734 7.58632 7.22329 7.18607 7.32119 7.58262 7.73584 7.94792 8.1727 8.40341 8.64719 8.65352 8.36722 7.89252 7.21308 6.47891 5.84381 5.33088 4.92911 4.72974 4.59308 4.44447 4.26557 4.07966 3.90384 3.7946 3.72777 3.70514 3.70382 3.71824 3.73931 3.75812 3.83645 3.91434 4.06278 4.21229 4.38464 4.51554 4.62639 4.69417 4.6986 4.63321 4.49328 4.31404 4.16895 3.85854 2.98901 1.51821 0.992485 1.26835 1.32339 1.25713 1.25379 1.77074 2.04825 2.41053 2.7831 4.02684 5.30151 6.25675 6.94732 7.4701 7.91547 8.34605 8.76266 9.12488 9.39947 9.59989 9.77415 9.97441 10.2337 10.5594 10.9311 11.2944 11.5796 11.7357 11.7399 11.575 11.2976 10.89 10.5308 10.3279 10.2011 9.99115 9.81452 9.59752 9.42041 9.2678 9.1227 9.03925 8.95336 8.89285 8.79333 8.63945 8.48961 8.48517 8.6019 8.85961 9.11377 9.40858 9.57988 9.68443 9.61451 9.37784 9.02091 8.48985 7.89479 7.36768 7.04304 7.01893 7.27704 7.53461 7.93185 8.16407 8.38594 8.7143 8.78232 8.78784 8.43905 7.91471 7.18905 6.53867 5.83005 5.41527 5.20174 5.02961 4.94013 4.83092 4.68436 4.52517 4.39376 4.29467 4.22856 4.19479 4.16841 4.13937 4.11793 4.10503 4.12005 4.20095 4.31072 4.48315 4.68226 4.8907 5.07854 5.23618 5.33645 5.36337 5.26408 5.09274 4.85071 4.52425 3.56758 1.9478 1.24149 1.48454 1.55103 1.50166 1.49692 1.35773 1.64219 1.94135 2.22407 3.3656 4.6062 5.59682 6.36161 6.95845 7.46047 7.92823 8.38484 8.81 9.17476 9.47066 9.71822 9.95138 10.207 10.515 10.8814 11.2717 11.6191 11.8597 11.9551 11.9158 11.702 11.4675 11.1981 11.0403 10.8704 10.6939 10.5337 10.3346 10.1292 9.91253 9.7328 9.58883 9.51658 9.47189 9.37583 9.26962 9.21412 9.27773 9.43777 9.70766 9.89949 10.0779 10.1641 10.0527 9.81102 9.37726 8.86601 8.30276 7.61833 7.04409 6.82324 6.88718 7.26036 7.71965 8.13372 8.49036 8.84076 8.96176 9.06316 8.88922 8.5584 7.92375 7.27105 6.51037 6.02057 5.58525 5.42332 5.44154 5.36519 5.27513 5.16833 5.03122 4.93685 4.84918 4.77722 4.71073 4.64175 4.57186 4.50807 4.46954 4.45347 4.50516 4.60082 4.77526 4.97984 5.21421 5.44809 5.65029 5.82078 5.89098 5.85086 5.68871 5.39541 5.09154 4.1692 2.4435 1.52939 1.7444 1.79533 1.7349 1.72821 0.966109 1.27443 1.58066 1.84749 2.85739 4.02273 5.01725 5.83174 6.49731 7.06144 7.57844 8.07587 8.55103 8.9826 9.35661 9.67333 9.94665 10.2032 10.4821 10.8152 11.197 11.5752 11.8796 12.0625 12.0982 12.0329 11.8741 11.7324 11.6049 11.4586 11.3864 11.2192 11.0496 10.8136 10.5751 10.3504 10.1821 10.1076 10.0382 9.94677 9.88299 9.87522 9.92466 10.1209 10.2231 10.4447 10.4303 10.4282 10.1672 9.75223 9.20944 8.54111 7.86293 7.25205 6.77473 6.63767 6.89563 7.43225 8.06849 8.52875 8.99957 9.29274 9.38815 9.35652 9.03361 8.59952 8.00964 7.35856 6.69939 6.15729 5.90597 5.84013 5.80779 5.87998 5.79054 5.68687 5.618 5.51142 5.43839 5.347 5.2282 5.11221 4.99227 4.90206 4.8299 4.83188 4.86061 4.98654 5.14516 5.36414 5.60243 5.8448 6.06874 6.24248 6.31948 6.32882 6.09036 5.85716 5.50238 4.74826 2.99816 1.88132 2.04373 2.03513 1.96901 1.96 0.595485 0.93096 1.26315 1.53984 2.46 3.55749 4.53433 5.3779 6.09687 6.7236 7.2965 7.84317 8.36511 8.84986 9.28301 9.65733 9.97086 10.2347 10.4835 10.7647 11.104 11.4755 11.8156 12.0661 12.1902 12.2292 12.1547 12.1169 12.0145 11.9929 11.9473 11.8542 11.6694 11.4479 11.192 10.9596 10.8053 10.6928 10.577 10.5078 10.4336 10.3989 10.415 10.4871 10.5674 10.6153 10.6626 10.4083 10.0579 9.4807 8.77011 8.07009 7.39007 6.83054 6.57391 6.66847 7.17692 7.85599 8.57728 9.18541 9.58856 9.7684 9.85001 9.57372 9.20011 8.63193 8.09213 7.44204 6.9924 6.53207 6.29887 6.29534 6.38357 6.33567 6.37147 6.27361 6.20288 6.14562 6.03449 5.89909 5.73058 5.5462 5.3896 5.25514 5.2102 5.22073 5.27546 5.45415 5.64373 5.88716 6.13549 6.36022 6.58031 6.70255 6.81901 6.71331 6.5579 6.28836 5.86224 5.26194 3.56692 2.26148 2.37363 2.35627 2.22975 2.21859 0.245519 0.609466 0.976512 1.26689 2.12456 3.17498 4.13902 5.00076 5.76404 6.4447 7.07478 7.67385 8.24586 8.779 9.2611 9.68231 10.0333 10.3113 10.5375 10.7618 11.033 11.3598 11.7 11.9914 12.2062 12.2848 12.3581 12.3217 12.347 12.4018 12.401 12.335 12.1814 11.9848 11.7542 11.5446 11.3835 11.2348 11.1145 11.0183 10.9558 10.8405 10.8338 10.7465 10.9146 10.7909 10.6927 10.3477 9.76376 8.99758 8.28643 7.52762 6.98382 6.62647 6.58154 7.00513 7.73219 8.55816 9.30968 9.92181 10.1837 10.3085 10.1419 9.79667 9.30812 8.7394 8.16154 7.70788 7.21735 7.01914 6.86209 6.83753 6.95754 6.96485 6.91466 6.91592 6.82897 6.7547 6.61516 6.40339 6.17334 5.93031 5.72228 5.5915 5.55727 5.56847 5.82158 5.9394 6.27258 6.55174 6.81969 7.05473 7.21493 7.32433 7.33029 7.23745 6.9116 6.64713 6.49288 5.71938 4.07883 2.6696 2.7372 2.71711 2.51755 2.50439 -0.0842145 0.302985 0.702602 1.00609 1.80811 2.83842 3.8066 4.69593 5.4976 6.22482 6.90174 7.549 8.16799 8.74884 9.27726 9.74251 10.1321 10.4334 10.653 10.8307 11.0263 11.2797 11.5816 11.8857 12.135 12.3159 12.4076 12.4828 12.595 12.6804 12.7215 12.6745 12.5669 12.4168 12.244 12.056 11.8788 11.7361 11.6306 11.494 11.4092 11.3372 11.2429 11.2761 11.1423 11.0804 10.6532 10.1377 9.31948 8.53262 7.70204 7.25732 6.77098 6.67294 7.05862 7.69221 8.5339 9.47861 10.1825 10.6014 10.8083 10.6982 10.4142 9.97839 9.40878 8.88215 8.35228 7.95875 7.68618 7.43745 7.46365 7.54732 7.53438 7.65679 7.56192 7.52933 7.48301 7.31838 7.11256 6.8383 6.5196 6.22616 5.98741 5.87352 5.84171 6.01773 6.19951 6.62745 6.95592 7.33773 7.65357 7.87969 7.97121 8.01321 7.88007 7.78887 7.56294 6.99636 6.90084 6.27885 4.57734 3.06707 3.11844 3.05659 2.83197 2.81696 0.0840318 0.159968 0.45923 0.765005 1.53258 2.5484 3.53496 4.45519 5.29593 6.0591 6.77074 7.45045 8.10523 8.72627 9.29964 9.81195 10.2464 10.5857 10.8203 10.9768 11.1109 11.2826 11.5174 11.7944 12.0621 12.2872 12.4499 12.6072 12.7625 12.8688 12.9176 12.9069 12.8528 12.7589 12.6222 12.4682 12.324 12.1913 12.0603 11.945 11.7782 11.778 11.7439 11.6387 11.4596 11.0983 10.5548 9.71813 8.86787 8.02784 7.53333 7.13309 7.16403 7.26077 7.87181 8.80595 9.65393 10.4394 11.0288 11.2613 11.2317 11.0018 10.6052 10.0939 9.55723 9.02505 8.67313 8.24379 8.15146 8.00286 8.07221 8.2026 8.21386 8.26839 8.26809 8.12881 8.02983 7.80793 7.49436 7.13194 6.75475 6.41698 6.1821 6.06537 6.11184 6.38151 6.7243 7.22199 7.73595 8.21297 8.58429 8.80891 8.89942 8.79306 8.63997 8.23105 7.93221 7.67344 7.25385 6.74262 5.03486 3.45955 3.46721 3.40984 3.1721 3.15537 0.594231 0.642554 0.756677 0.853055 1.47183 2.40731 3.36477 4.2937 5.15626 5.9439 6.67302 7.3681 8.03908 8.6855 9.29539 9.85402 10.3436 10.7339 11.0127 11.1797 11.2855 11.3915 11.5496 11.7701 12.0248 12.2677 12.4946 12.7103 12.8738 12.997 13.0568 13.0732 13.0502 13.0028 12.9171 12.8098 12.6963 12.5789 12.4279 12.2485 12.1051 12.0674 11.9212 11.8983 11.4625 10.9694 10.2214 9.49577 8.60833 7.8768 7.79267 7.7383 7.91221 8.55696 9.10854 10.0021 10.8425 11.3573 11.6941 11.7185 11.5097 11.1504 10.6979 10.201 9.71291 9.27503 8.91396 8.80984 8.43102 8.72036 8.63137 8.82713 8.95283 8.8257 8.84369 8.71353 8.42433 8.13893 7.71541 7.27863 6.84797 6.49502 6.26975 6.20751 6.40368 6.65573 7.27984 7.8606 8.54086 9.12649 9.55882 9.80334 9.84853 9.72586 9.42636 9.0656 8.49768 8.16716 7.80184 7.14466 5.41579 3.81903 3.80468 3.75187 3.47761 3.45927 1.10316 1.15783 1.28315 1.35911 1.76156 2.51756 3.36887 4.24618 5.09337 5.87707 6.60478 7.29465 7.96354 8.61485 9.24547 9.84251 10.3861 10.8445 11.1865 11.4055 11.5216 11.5982 11.693 11.8456 12.0541 12.2938 12.5458 12.779 12.9647 13.0883 13.1657 13.1882 13.1923 13.1658 13.1283 13.0927 12.9789 12.8719 12.7 12.4229 12.3208 12.0532 12.1041 11.6959 11.4177 10.5983 10.1215 9.47947 8.78042 8.47987 8.47716 8.93855 9.24326 9.93706 10.5983 11.0885 11.6966 12.0749 12.1157 11.9653 11.6052 11.1919 10.7449 10.3057 9.90461 9.61154 9.28739 9.14507 9.18575 9.05422 9.37931 9.38049 9.51299 9.47329 9.27358 9.05606 8.70632 8.25202 7.77224 7.25022 6.79005 6.44575 6.27983 6.33782 6.56836 7.12615 7.74365 8.57013 9.35894 10.0454 10.5197 10.771 10.7976 10.6354 10.2813 9.7669 9.21563 8.65669 8.26559 7.4802 5.71226 4.13893 4.03134 3.85178 3.52227 3.50221 1.61085 1.67469 1.82153 1.9508 2.2584 2.85837 3.57154 4.34942 5.13136 5.87406 6.56925 7.23312 7.8786 8.51656 9.14891 9.76907 10.3489 10.8972 11.3007 11.6109 11.7833 11.8697 11.9374 12.0317 12.1802 12.3822 12.6157 12.8407 13.0351 13.1631 13.2397 13.2813 13.2863 13.277 13.2623 13.2544 13.2129 13.0194 12.7768 12.5475 12.2515 12.1313 11.9742 11.6701 11.0924 10.5946 10.2207 9.77912 9.4221 9.47996 9.67494 10.1235 10.8731 11.0962 11.7047 12.0519 12.1649 12.4223 12.322 12.0393 11.6072 11.1658 10.7649 10.4467 10.1696 9.89931 9.81916 9.57714 9.73116 9.72834 9.87427 9.98677 9.87772 9.84359 9.58 9.19004 8.76197 8.19914 7.61917 7.05348 6.58289 6.29252 6.22844 6.41541 6.86992 7.51422 8.37675 9.27545 10.1825 10.9089 11.425 11.6509 11.6705 11.4486 11.0069 10.4179 9.72169 9.01537 8.51585 7.62135 5.81638 4.23712 3.97536 3.86556 3.56744 3.54572 2.11729 2.19634 2.36169 2.52542 2.80825 3.33289 3.93848 4.60602 5.29455 5.95873 6.58896 7.19539 7.79676 8.40172 9.00891 9.63565 10.2709 10.8046 11.3985 11.7479 12.0207 12.1715 12.2553 12.3199 12.4158 12.5586 12.7386 12.9313 13.0995 13.23 13.3072 13.3459 13.3556 13.3457 13.3291 13.349 13.3104 13.0206 12.7583 12.4464 12.132 12.1861 11.7746 11.5856 10.9672 10.8104 10.4848 10.4154 10.3655 10.4672 10.9551 11.2817 11.6973 12.1564 12.1986 12.4866 12.5744 12.4449 12.3783 11.9967 11.5682 11.1503 10.8262 10.5972 10.4768 10.3477 10.2358 10.3348 10.1448 10.3894 10.2861 10.3141 10.2344 9.96483 9.62534 9.17292 8.57647 7.97257 7.28458 6.6933 6.26401 6.07197 6.17158 6.55814 7.19955 8.04808 9.07095 10.0476 10.9695 11.6735 12.1727 12.3976 12.3791 12.1085 11.5841 10.7881 9.98861 9.32361 8.37696 7.50477 5.70721 4.24607 3.95564 3.88328 3.61245 3.58914 2.62258 2.70922 2.91934 3.06243 3.33548 3.84107 4.39079 4.97837 5.57735 6.15067 6.68849 7.21074 7.73581 8.27919 8.86172 9.44259 10.0823 10.733 11.3198 11.8351 12.213 12.4621 12.5751 12.6756 12.7351 12.8238 12.9345 13.0682 13.1993 13.3084 13.3737 13.4078 13.4096 13.3818 13.3673 13.3912 13.2444 13.0175 12.6096 12.2153 12.1828 11.9172 11.9053 11.283 11.1855 10.8809 10.9813 10.9444 11.1178 11.4117 11.8016 12.0702 12.2087 12.5004 12.6325 12.527 12.724 12.5626 12.2604 11.9445 11.5471 11.1474 10.961 10.8592 10.8372 10.8122 10.8049 10.8099 10.7964 10.6772 10.6798 10.5282 10.2944 9.946 9.47785 8.9046 8.25233 7.50418 6.83204 6.23062 5.90065 5.89012 6.20393 6.81605 7.65127 8.76273 9.73808 10.9457 11.7162 12.418 12.7154 12.9729 12.8774 12.5677 11.9121 11.1185 10.0727 9.14728 8.30108 7.14653 5.42981 4.24209 3.96315 3.86193 3.6498 3.62499 3.17918 3.20733 3.43651 3.54554 3.80466 4.30806 4.84113 5.39233 5.9374 6.43588 6.88178 7.29938 7.72597 8.1826 8.67908 9.23873 9.83414 10.563 11.1438 11.812 12.284 12.6033 12.8786 12.9767 13.0647 13.091 13.1651 13.2545 13.3232 13.4171 13.4643 13.4846 13.4621 13.429 13.3905 13.364 13.2182 12.9443 12.4057 12.1872 12.0099 12.0033 11.6968 11.4278 11.1551 11.1663 11.2243 11.3405 11.6503 12.0984 12.3034 12.4628 12.6485 12.6116 12.7521 12.8165 12.6544 12.5495 12.2731 11.8717 11.5172 11.2701 11.115 11.2223 11.2484 11.323 11.2591 11.245 11.2055 11.0026 10.8427 10.5828 10.2007 9.68593 9.14281 8.45432 7.72534 6.93319 6.25662 5.78594 5.64318 5.8756 6.43781 7.2458 8.36094 9.39656 10.7419 11.6374 12.5368 13.0277 13.3648 13.3432 13.2901 12.8238 12.0681 11.1867 10.2585 8.98773 7.92544 6.65648 5.09852 4.23869 3.9699 3.8407 3.67296 3.64678 3.79053 3.80439 3.95446 3.99442 4.21772 4.70643 5.23046 5.7751 6.30546 6.76979 7.14899 7.47153 7.78466 8.13173 8.52421 8.99794 9.6355 10.2212 11.0128 11.6119 12.1712 12.5996 12.8797 13.1296 13.2285 13.3198 13.3563 13.376 13.4933 13.5164 13.5682 13.5602 13.5382 13.4665 13.4045 13.3467 13.2282 12.7664 12.4605 12.0864 11.9963 12.0945 11.7372 11.4973 11.2692 11.4529 11.4545 11.702 12.2026 12.4857 12.8021 12.9258 12.8289 12.9362 12.8622 12.9502 12.7567 12.5198 12.2412 11.904 11.5669 11.4444 11.4525 11.5455 11.7205 11.7984 11.7656 11.5439 11.4379 11.2623 10.9085 10.444 9.94348 9.29264 8.55913 7.84707 7.06582 6.325 5.70502 5.50606 5.65251 6.16258 6.9319 7.97794 9.05674 10.3433 11.4686 12.4424 13.2823 13.6253 13.8409 13.7667 13.4704 12.9366 12.2614 11.2573 10.0115 8.80703 7.37008 6.04933 4.67785 4.21443 3.97596 3.82477 3.64365 3.61647 4.39149 4.41779 4.49382 4.46577 4.63176 5.07221 5.56156 6.09377 6.62947 7.09511 7.45085 7.70937 7.92189 8.14203 8.44136 8.78158 9.35627 10.0153 10.6865 11.3505 11.9707 12.4448 12.7796 13.0707 13.3129 13.3846 13.4233 13.5036 13.5034 13.5572 13.6164 13.5888 13.535 13.4633 13.4077 13.3261 13.1383 12.8522 12.4657 12.1441 12.2601 12.1345 12.0154 11.7206 11.7058 11.6883 11.9641 12.355 12.6799 13.0842 13.227 13.2893 13.3561 13.1017 13.1649 12.9694 12.8509 12.6411 12.2466 11.9966 11.7778 11.6711 11.7882 11.9724 12.1917 12.1934 12.1041 11.9015 11.6089 11.2969 10.8468 10.2641 9.46437 8.78325 7.94878 7.15849 6.35144 5.79248 5.44352 5.54723 6.04917 6.78047 7.74496 8.77453 9.94235 11.2219 12.1922 13.2041 13.6534 14.1613 14.1363 14.0261 13.52 12.9075 12.0266 11.0068 9.71593 8.11733 6.62856 5.28558 4.18851 4.15081 3.9375 3.63017 3.26504 3.23738 4.98225 4.99706 5.03813 4.97664 5.10416 5.46887 5.8848 6.37319 6.8997 7.3806 7.74611 7.98213 8.12569 8.24702 8.38973 8.68311 9.10541 9.77842 10.3871 11.0341 11.7099 12.1858 12.6337 13.0164 13.2268 13.4282 13.5473 13.4894 13.4431 13.4899 13.4375 13.4532 13.3845 13.3905 13.3127 13.2025 13.1217 12.9406 12.5716 12.5862 12.5037 12.4862 12.4142 12.2526 12.2711 12.3421 12.6276 13.076 13.3191 13.6193 13.7435 13.7068 13.6825 13.5612 13.2363 13.1747 12.9686 12.661 12.4798 12.2068 12.0522 12.0645 12.1875 12.3652 12.761 12.5845 12.422 12.0934 11.7566 11.2379 10.7075 9.97665 9.13058 8.22201 7.4042 6.58842 5.94739 5.5219 5.68927 6.09636 6.82374 7.67412 8.60523 9.6805 10.8964 11.9118 12.9874 13.6708 14.2008 14.3257 14.3322 13.9553 13.4214 12.5421 11.4998 10.3059 8.94798 7.16589 5.62452 4.36861 3.5663 3.84274 3.54043 3.1771 2.81118 2.78315 5.56752 5.54765 5.57217 5.50244 5.62534 5.92216 6.25051 6.66057 7.14638 7.62687 8.01464 8.26209 8.37853 8.41835 8.45088 8.61697 8.96865 9.4737 10.0833 10.7125 11.2976 11.844 12.3697 12.8294 13.1505 13.4423 13.5622 13.532 13.4742 13.3846 13.3679 13.2881 13.2691 13.1607 13.2002 13.127 13.0563 12.9674 12.9736 12.9673 13.0038 13.0489 12.9844 12.9687 12.9651 13.1483 13.5295 13.6355 14.0298 14.078 14.2373 14.2418 13.8973 13.8763 13.5528 13.2847 13.1424 12.9222 12.7321 12.5842 12.5338 12.5506 12.6475 12.9001 12.9008 13.0877 12.6993 12.3036 11.6648 11.2079 10.5288 9.66775 8.94908 7.94206 7.20377 6.49079 6.10044 6.07835 6.41764 7.08989 7.79901 8.58449 9.44805 10.5564 11.6781 12.7249 13.6162 14.1202 14.4386 14.4957 14.244 13.6955 12.9031 11.8672 10.641 9.27394 7.70958 6.13233 4.45059 3.40927 2.8264 3.29951 3.05091 2.7184 2.3545 2.32614 6.11761 6.07338 6.08415 6.01891 6.15006 6.40952 6.65836 6.97741 7.39399 7.84959 8.25249 8.5297 8.64853 8.65649 8.63728 8.61227 8.89495 9.22969 9.6864 10.2847 10.7951 11.4454 12.0515 12.4511 13.0216 13.3189 13.5311 13.6207 13.5189 13.5265 13.5221 13.3508 13.2351 13.2359 13.1342 13.1124 13.0396 13.1328 13.2568 13.3312 13.5345 13.6365 13.6118 13.6662 13.6615 13.9212 14.0867 14.2717 14.4597 14.6708 14.6835 14.6194 14.4557 14.0734 13.9364 13.5738 13.3364 13.3166 13.214 13.1667 13.1407 13.1468 13.1732 13.2418 13.1753 13.1735 12.9663 12.4015 11.7962 11.0654 10.3949 9.76826 8.88905 8.16541 7.40936 7.03943 6.87906 7.13459 7.52802 8.12318 8.64468 9.38466 10.288 11.3269 12.4755 13.508 14.0631 14.5641 14.5859 14.409 13.946 13.2103 12.1189 10.8269 9.49585 8.02462 6.46152 4.88911 3.49117 2.53661 2.0601 2.68701 2.52806 2.2423 1.89469 1.86601 6.389 6.53341 6.53817 6.46275 6.6036 6.84098 7.03544 7.27691 7.62386 8.0425 8.45013 8.7519 8.93011 8.92088 8.8611 8.83877 8.86318 9.06283 9.39187 9.74893 10.3731 10.9449 11.4842 12.1149 12.5262 13.064 13.3973 13.4421 13.6612 13.6867 13.62 13.5519 13.4296 13.4459 13.2704 13.1964 13.2244 13.32 13.4573 13.6863 13.8968 14.043 14.1691 14.1682 14.2318 14.3131 14.4803 14.8037 14.9012 15.101 15.2114 15.0637 14.9853 14.5352 14.0862 13.9762 13.8223 13.8069 13.8495 13.8583 13.7954 13.7408 13.7141 13.4458 13.5497 13.2186 13.0076 12.5103 11.9275 11.1072 10.5721 10.0173 9.27851 8.77603 8.23059 7.92467 7.99107 8.14714 8.4913 8.82067 9.3747 10.0547 11.1149 12.2758 13.2677 14.1117 14.6611 14.7231 14.6168 14.1596 13.4629 12.4094 11.0898 9.59529 8.13198 6.77312 5.34014 3.83245 2.73794 1.87834 1.37703 2.07376 2.00473 1.74913 1.41772 1.38878 6.20234 6.33701 6.53363 6.61006 6.80135 7.06492 7.25134 7.46239 7.76936 8.16178 8.5726 8.9331 9.11744 9.19927 9.16175 9.09369 9.01508 9.0455 9.13647 9.45436 9.86447 10.3891 10.9223 11.5039 12.0597 12.5343 12.9352 13.3238 13.4962 13.6814 13.7309 13.6802 13.723 13.5757 13.6003 13.4502 13.48 13.5825 13.7337 13.9495 14.167 14.3674 14.5229 14.5938 14.7302 14.7707 14.9942 15.2205 15.4378 15.5662 15.6384 15.5966 15.3395 15.048 14.6039 14.4553 14.5935 14.5144 14.5168 14.4943 14.4137 14.2712 14.0174 13.8503 13.5138 13.4526 13.0655 12.6559 12.0513 11.4573 10.8572 10.4167 10.0105 9.4409 9.14017 8.89289 8.79958 8.90151 9.06711 9.3458 9.9983 10.8988 12.0605 13.168 14.214 14.7869 15.0368 14.8535 14.3441 13.6678 12.7201 11.4434 9.82444 8.30815 6.75499 5.62256 4.33919 3.12527 2.10905 1.37157 0.762479 1.47198 1.47576 1.24713 0.927514 0.898341 5.98827 6.09688 6.27092 6.37192 6.66514 6.99713 7.22738 7.4558 7.76491 8.15897 8.59396 8.98661 9.28062 9.44742 9.46476 9.39108 9.33592 9.17465 9.16158 9.292 9.56624 9.95118 10.4439 10.8834 11.4769 11.9101 12.4215 12.9029 13.1984 13.4846 13.5988 13.7393 13.8024 13.8322 13.8009 13.7907 13.8326 13.9127 14.0536 14.2295 14.4243 14.6182 14.7972 15.032 15.1326 15.4058 15.6131 15.6585 15.9045 16.0126 15.977 15.9447 15.7763 15.581 15.509 15.3125 15.2444 15.2826 15.1008 14.9904 14.8675 14.638 14.3531 13.9792 13.6558 13.4324 13.3131 12.8264 12.3051 11.9534 11.2857 10.9055 10.5705 10.1218 9.74331 9.48297 9.28618 9.31506 9.49029 10.0268 10.7726 11.9279 13.1222 14.1981 15.0482 15.4452 15.2992 14.7585 13.8353 12.8697 11.7743 10.242 8.61616 6.88856 5.67503 4.44394 3.46127 2.4882 1.68221 0.877911 0.105289 0.837542 0.944454 0.832561 0.739537 0.710742 5.7472 5.83033 5.98839 6.08955 6.39026 6.74312 7.00465 7.26442 7.5968 8.01406 8.48234 8.93621 9.34818 9.58304 9.75054 9.77818 9.64626 9.51415 9.40398 9.36006 9.50476 9.72394 10.0491 10.4662 10.8366 11.3734 11.9034 12.3127 12.8068 13.0409 13.3515 13.5899 13.7342 13.9403 13.9844 14.0972 14.1708 14.2573 14.3822 14.5263 14.6843 14.8664 15.0758 15.2963 15.5381 15.6895 15.9132 16.0585 16.1998 16.2612 16.2636 16.1511 16.1102 16.058 15.9716 15.9887 15.5655 15.597 15.6061 15.2615 15.1525 14.918 14.5752 14.145 13.771 13.4836 13.1967 13.1251 12.6247 12.0986 11.9251 11.3349 10.9046 10.5467 10.1567 9.84769 9.71764 9.76914 10.1969 10.8874 11.949 13.1486 14.2599 15.1543 15.6479 15.8242 15.3985 14.4044 13.1863 11.7932 10.4865 9.07011 7.3483 5.7232 4.52815 3.49875 2.66487 1.91307 1.25087 0.393345 -0.501528 0.353264 0.757779 0.8465 0.76884 0.740749 5.47959 5.53603 5.69115 5.79394 6.07731 6.40724 6.66942 6.94415 7.29798 7.73935 8.24624 8.776 9.24015 9.642 9.92289 10.0401 10.0208 9.96425 9.78895 9.69232 9.626 9.738 9.86553 10.1372 10.4909 10.8989 11.3293 11.8463 12.1905 12.6321 12.982 13.2315 13.6242 13.8467 14.123 14.2571 14.3928 14.5307 14.6527 14.7794 14.9286 15.1091 15.3333 15.5513 15.7637 15.9017 16.0453 16.2957 16.374 16.4437 16.4334 16.3694 16.2893 16.2451 16.1898 16.0252 15.9837 15.6334 15.7728 15.62 15.3254 15.0894 14.7526 14.3726 13.9512 13.5769 13.3444 12.9836 13.0248 12.4198 12.0257 11.6744 11.161 10.7922 10.4949 10.3053 10.3398 10.6253 11.3133 12.2368 13.2966 14.4616 15.3516 15.908 15.8654 15.6297 15.0966 13.996 12.4253 10.7631 9.0326 7.66066 6.10511 4.90979 3.64848 2.83822 2.05694 1.33698 0.731037 -0.0746008 -0.940768 0.185579 0.754778 0.869816 0.795003 0.767518 5.1858 5.22121 5.36445 5.45933 5.72525 6.02517 6.27122 6.54518 6.90517 7.35992 7.88959 8.47376 8.99311 9.53401 9.89219 10.1545 10.3246 10.3202 10.2426 10.1052 9.9996 9.90443 9.94005 10.0675 10.2488 10.567 10.9368 11.2885 11.7391 12.1189 12.4543 12.9238 13.3273 13.7048 13.9851 14.2635 14.4727 14.6415 14.7942 14.9449 15.1118 15.3108 15.5351 15.776 15.971 16.1064 16.3337 16.4519 16.5421 16.6064 16.5921 16.5482 16.48 16.4089 16.3576 16.1788 16.1094 16.0742 15.6671 15.9316 15.4621 15.2308 14.9521 14.5977 14.2217 13.8499 13.5603 13.2346 12.8457 12.7921 12.0362 11.7387 11.4478 11.0803 10.9689 11.0386 11.2955 11.8982 12.6567 13.7049 14.7541 15.5133 16.1802 16.1967 15.8705 15.0184 14.1964 13.2622 11.7688 9.90396 8.04307 6.33502 5.23727 4.17289 3.24154 2.38077 1.57334 0.761459 0.136819 -0.593049 -1.27599 0.106843 0.765091 0.890347 0.81862 0.79164 4.83427 4.87573 4.99319 5.07492 5.32073 5.59204 5.82074 6.08362 6.43714 6.8869 7.41882 7.99296 8.61425 9.1452 9.68571 10.0868 10.383 10.5349 10.6101 10.5359 10.4013 10.2911 10.2328 10.1637 10.2948 10.4557 10.6759 10.9398 11.2974 11.601 12.0352 12.5134 12.9376 13.3848 13.7398 14.0978 14.3636 14.5912 14.8008 14.9982 15.204 15.4278 15.6669 15.9179 16.0918 16.3341 16.4657 16.6028 16.6873 16.7354 16.7443 16.7192 16.6752 16.6067 16.4837 16.4576 16.2241 16.1841 16.0143 15.706 15.7307 15.4163 15.1728 14.9086 14.5589 14.2427 13.7539 13.4843 12.9031 12.4871 12.2726 11.8684 11.7764 11.7254 11.7717 12.0687 12.5938 13.2842 14.1235 14.9317 15.7339 16.2406 16.3571 16.1939 15.4339 14.3475 13.2104 12.1698 10.927 9.26124 7.58087 6.06505 4.89757 3.80181 2.95283 1.99761 0.942824 0.170983 -0.533887 -1.15728 -1.57438 0.0421048 0.786552 0.917088 0.840361 0.813789 4.401 4.44192 4.57589 4.6447 4.86112 5.10796 5.31454 5.56235 5.89662 6.32311 6.8311 7.39311 8.01417 8.61694 9.23411 9.76371 10.1967 10.5739 10.78 10.8433 10.82 10.7432 10.6617 10.5687 10.5706 10.579 10.676 10.8332 10.9525 11.2993 11.6586 12.0818 12.5608 12.9732 13.4609 13.8015 14.1355 14.4397 14.7027 14.9538 15.2049 15.4627 15.7244 15.965 16.2125 16.372 16.5944 16.6816 16.7951 16.8654 16.8996 16.8838 16.872 16.7819 16.6925 16.5906 16.5606 16.2398 16.299 15.8691 15.9215 15.7123 15.5053 15.2365 14.9211 14.4936 14.1622 13.5962 13.3079 12.788 12.7832 12.5336 12.4024 12.6714 12.9124 13.3556 13.9656 14.6122 15.2854 15.8012 16.0898 16.2188 15.9764 15.6306 14.9088 13.6492 12.547 11.331 10.1513 8.82681 7.43283 6.16553 4.89146 3.7832 2.67577 1.49045 0.426756 -0.548004 -1.21248 -1.73324 -1.86363 0.0152482 0.855585 0.936638 0.859824 0.833563 3.96976 4.02046 4.16212 4.21085 4.38582 4.58944 4.76557 4.98743 5.29242 5.68026 6.14701 6.69566 7.26577 7.95149 8.56721 9.21681 9.8111 10.3297 10.7053 10.9877 11.1187 11.1587 11.1256 11.1578 11.0 11.0186 10.9049 10.8959 11.017 11.1638 11.471 11.8528 12.2709 12.7288 13.1395 13.5463 13.9211 14.2554 14.5702 14.8712 15.1699 15.4663 15.7567 16.0323 16.2758 16.482 16.6876 16.8068 16.9451 17.0337 17.078 17.0868 17.0005 17.0099 16.8943 16.7383 16.7079 16.6774 16.2733 16.4489 16.1463 16.021 15.8148 15.5218 15.1689 14.7965 14.3599 14.0158 13.6105 13.4333 13.254 13.3688 13.3454 13.6116 14.0707 14.5322 15.0207 15.5142 15.8047 15.979 15.9174 15.5538 15.0938 14.5744 14.0924 13.2954 12.0905 10.8778 9.62311 8.38269 7.13721 6.0246 4.67576 3.51551 2.32232 0.990172 -0.121452 -1.02547 -1.8272 -2.19953 -2.0467 0.00557794 0.937249 0.965089 1.07992 1.05374 3.54053 3.60043 3.75469 3.80562 3.91981 4.06412 4.1962 4.38096 4.64627 4.99221 5.41657 5.92275 6.50099 7.13622 7.83567 8.52512 9.224 9.86172 10.4727 10.8914 11.2262 11.4708 11.5311 11.6152 11.662 11.4924 11.3941 11.3178 11.3379 11.4137 11.6468 11.9394 12.288 12.6732 13.0612 13.4516 13.821 14.1781 14.5237 14.8681 15.2064 15.548 15.8748 16.1867 16.4364 16.716 16.8678 17.0615 17.1848 17.2701 17.3056 17.2941 17.2071 17.1217 17.0901 17.0052 16.8302 16.7558 16.6905 16.5572 16.395 16.2154 15.9588 15.6596 15.3126 14.9405 14.575 14.2743 14.0291 13.9104 13.8513 14.1407 14.3304 14.4578 14.8007 15.1182 15.3968 15.574 15.6367 15.4729 15.1928 14.736 14.1274 13.7055 13.207 12.6008 11.558 10.4113 9.12994 7.83182 6.59035 5.36534 4.23951 2.98001 1.7121 0.445273 -0.733035 -1.47347 -2.00646 -2.37239 -2.03542 0.10823 1.25074 1.51631 1.65474 1.62833 3.11324 3.17889 3.34343 3.41454 3.46317 3.54986 3.63221 3.77438 3.9984 4.30374 4.69492 5.16726 5.73739 6.36467 7.05971 7.78485 8.55625 9.31961 9.97696 10.6375 11.1522 11.4778 11.8546 11.983 12.1066 12.0913 12.0219 11.9779 11.9596 12.0751 12.2047 12.4188 12.6853 12.9953 13.3156 13.6667 14.0069 14.3617 14.7184 15.0933 15.4598 15.8267 16.1887 16.4988 16.8107 17.037 17.2463 17.412 17.5097 17.5732 17.5815 17.5153 17.4638 17.3153 17.2295 17.2055 17.1379 16.9252 16.8955 16.6332 16.4782 16.2282 15.9407 15.629 15.3004 14.973 14.7086 14.4981 14.4216 14.4155 14.635 14.6504 14.782 14.7818 14.8144 14.8749 14.8921 14.8764 14.7498 14.5313 14.1886 13.7913 13.3336 12.8144 12.3705 11.543 10.7331 9.64787 8.4243 7.13241 5.94155 4.64725 3.47052 2.25963 1.043 -0.265959 -1.2326 -1.82632 -1.99444 -2.12592 -1.69079 0.470359 1.74068 2.07315 2.21927 2.19261 2.68789 2.75817 2.91563 3.00896 3.01549 3.06387 3.10422 3.20947 3.39374 3.66485 4.02701 4.4849 5.02839 5.65406 6.33274 7.09855 7.81168 8.63981 9.4484 10.1326 10.7664 11.3386 11.8115 12.1864 12.4217 12.5894 12.64 12.7463 12.847 12.9054 13.072 13.2455 13.4776 13.7017 13.995 14.2564 14.6044 14.9193 15.2826 15.6069 16.0268 16.3817 16.7205 17.0496 17.2806 17.5382 17.7206 17.8197 17.899 17.896 17.8622 17.7995 17.6649 17.5965 17.4779 17.3139 17.2874 17.2235 16.8822 16.6976 16.4154 16.0965 15.7751 15.4537 15.1524 14.9068 14.7184 14.6191 14.5598 14.5355 14.5159 14.4612 14.2903 14.1573 13.9829 13.8912 13.7494 13.6509 13.5501 13.3788 13.1335 12.797 12.4052 11.9432 11.3112 10.6309 9.75308 8.71399 7.56271 6.36701 5.06885 3.92097 2.64457 1.43099 0.268855 -0.880037 -1.7207 -1.93643 -1.80222 -1.64032 -1.16616 0.852176 2.19014 2.56432 2.75472 2.72802 2.42294 2.3473 2.51448 2.63429 2.63331 2.65839 2.6692 2.73567 2.88068 3.11378 3.44407 3.8761 4.40012 5.00236 5.67358 6.35758 7.14473 7.89451 8.72458 9.51142 10.1727 10.9308 11.4944 12.0827 12.5319 12.8287 13.1634 13.4191 13.5921 13.8145 13.9872 14.2444 14.4673 14.7038 14.9467 15.2165 15.4676 15.8045 16.086 16.4551 16.7287 17.114 17.4081 17.6779 17.8891 18.022 18.1856 18.2403 18.2595 18.2008 18.1212 18.0334 17.9091 17.7761 17.6354 17.521 17.3463 17.1325 16.9025 16.5806 16.2178 15.8508 15.494 15.1779 14.9299 14.7459 14.6119 14.4709 14.2876 14.0644 13.7248 13.4524 13.097 12.797 12.5641 12.385 12.4175 12.2666 12.2712 12.2476 12.1212 11.9059 11.5772 11.1258 10.5271 9.77298 8.85248 7.796 6.64759 5.43046 4.22484 2.97776 1.74936 0.566332 -0.52198 -1.47466 -2.0026 -1.94773 -1.46057 -0.970881 -0.528268 1.21393 2.56572 2.98556 3.22291 3.19621 2.60415 2.47115 2.51346 2.50915 2.46853 2.44325 2.40359 2.41493 2.50294 2.67931 2.958 3.34196 3.82725 4.39364 5.01374 5.67093 6.41135 7.13801 7.89654 8.68424 9.46294 10.1756 10.9338 11.643 12.1899 12.8052 13.2847 13.7201 14.092 14.4228 14.7485 15.0778 15.3853 15.6645 15.9098 16.1916 16.4356 16.6614 16.969 17.236 17.4993 17.7566 18.0302 18.1942 18.3641 18.4539 18.5229 18.5705 18.4799 18.4296 18.3222 18.2021 18.0856 17.9376 17.7507 17.5532 17.3543 17.0363 16.7249 16.3364 15.9214 15.5129 15.1503 14.8694 14.6628 14.4916 14.2853 13.9789 13.5364 12.9701 12.4129 11.8532 11.422 11.0828 10.876 10.8354 10.8934 11.044 11.08 11.1561 11.1846 11.0957 10.8749 10.4687 9.86049 9.03367 8.029 6.89931 5.69126 4.45856 3.22495 1.9882 0.781461 -0.343419 -1.2912 -1.97925 -2.25845 -1.83707 -0.992173 -0.183173 0.177437 1.54761 2.86333 3.33609 3.62246 3.59567 2.7937 2.67577 2.76746 2.73837 2.60956 2.48668 2.36025 2.29056 2.29161 2.38269 2.57896 2.89213 3.30081 3.80586 4.36398 5.00526 5.58731 6.34654 7.04577 7.6739 8.51836 9.23367 10.022 10.7729 11.542 12.2417 12.9286 13.5225 14.1003 14.5346 15.0329 15.4745 15.8869 16.2089 16.5396 16.8047 17.0978 17.2849 17.4489 17.6936 18.0027 18.1193 18.2962 18.4646 18.528 18.6311 18.6576 18.6649 18.592 18.5011 18.4051 18.3083 18.171 17.9863 17.7683 17.504 17.1704 16.8255 16.4089 15.9721 15.5337 15.1277 14.7992 14.5499 14.3288 14.046 13.6215 13.0103 12.2411 11.4162 10.6431 10.0178 9.56789 9.31353 9.21907 9.35997 9.51261 9.7775 9.97689 10.1519 10.2829 10.3301 10.2069 9.84313 9.19099 8.27547 7.16531 5.9383 4.66655 3.39555 2.13778 0.909563 -0.253866 -1.27552 -2.04652 -2.48179 -2.44158 -1.72982 -0.401936 0.640425 0.830909 1.78598 3.06561 3.60318 3.88275 3.85616 2.99153 2.91815 3.03594 3.029 2.89872 2.7208 2.51645 2.35386 2.25699 2.23549 2.32983 2.53103 2.8611 3.26562 3.77462 4.26794 4.88215 5.4441 6.06465 6.76106 7.35029 8.08954 8.89215 9.60921 10.4413 11.2336 12.0328 12.7987 13.4285 14.0608 14.6159 15.2125 15.6915 16.0884 16.4687 16.8429 17.0868 17.3237 17.4479 17.6551 17.8238 18.0453 18.148 18.3053 18.3862 18.4392 18.5313 18.5399 18.5177 18.418 18.3661 18.2709 18.1144 17.8898 17.5955 17.2395 16.8379 16.3986 15.9462 15.503 15.0895 14.7357 14.4485 14.1797 13.8255 13.2861 12.5173 11.5562 10.5136 9.53813 8.7288 8.14615 7.81201 7.70156 7.80382 7.971 8.32644 8.55105 8.85287 9.12783 9.36482 9.50547 9.43895 9.05682 8.33152 7.31316 6.1034 4.80568 3.49288 2.20171 0.938112 -0.271692 -1.36637 -2.25865 -2.854 -3.03903 -2.64856 -1.52065 0.219463 1.38648 1.31875 1.86289 3.0391 3.50092 3.71541 3.69086 3.19751 3.18622 3.30508 3.31934 3.22393 3.04332 2.79782 2.57781 2.36343 2.2462 2.22422 2.32082 2.52728 2.86277 3.23816 3.68878 4.12792 4.65459 5.13648 5.72694 6.24171 6.91565 7.52865 8.32096 9.06212 9.90274 10.731 11.499 12.2107 12.899 13.5728 14.1973 14.7541 15.2207 15.6612 16.0924 16.4502 16.6497 16.8801 17.0064 17.1967 17.4124 17.5767 17.7436 17.9041 18.0352 18.1638 18.2304 18.239 18.2025 18.1521 18.0321 17.8286 17.5332 17.1542 16.716 16.2481 15.7798 15.3451 14.9575 14.6231 14.3363 14.0516 13.6647 13.0548 12.1613 11.0295 9.79193 8.60597 7.6262 6.92467 6.48774 6.31641 6.38501 6.57458 6.86325 7.11444 7.40262 7.69111 8.00589 8.30988 8.48935 8.39808 7.94099 7.11175 6.00055 4.73281 3.41435 2.10911 0.833859 -0.406506 -1.58336 -2.60163 -3.36564 -3.77594 -3.69377 -2.84984 -1.16885 0.806194 1.94568 1.54316 1.66731 2.76319 3.27144 3.52493 3.5024 3.41155 3.451 3.57213 3.60275 3.54117 3.38378 3.14428 2.89232 2.60235 2.40299 2.28276 2.28435 2.39819 2.61878 2.89712 3.22074 3.59252 3.97087 4.43068 4.75122 5.28304 5.77795 6.31387 7.03284 7.71008 8.44597 9.20274 9.91816 10.6622 11.3431 12.0497 12.6848 13.2564 13.7904 14.3225 14.7818 15.2261 15.5347 15.7452 16.0161 16.2636 16.4657 16.7478 16.9712 17.2473 17.4923 17.6741 17.7797 17.8045 17.7961 17.6918 17.5082 17.2252 16.8431 16.3896 15.9045 15.4281 15.0032 14.651 14.3661 14.1245 13.8749 13.5199 12.9275 12.0053 10.7776 9.38144 8.00927 6.83065 5.94697 5.44409 5.2041 5.1633 5.3276 5.57093 5.79763 6.00412 6.20521 6.45785 6.76047 7.0491 7.17549 6.99087 6.41255 5.47874 4.30742 3.03626 1.75458 0.500604 -0.73185 -1.92997 -3.06217 -4.03953 -4.68545 -4.87492 -4.41988 -3.10024 -0.888947 1.32171 2.27112 1.58723 1.45221 2.48371 3.02403 3.31227 3.29173 3.75294 3.72544 3.84258 3.88475 3.84642 3.71964 3.5211 3.22369 3.00204 2.66654 2.51803 2.44264 2.4753 2.5716 2.74815 3.00609 3.28755 3.58799 3.86537 4.18891 4.57479 4.86715 5.52254 6.00292 6.54838 7.21318 7.83055 8.48744 9.12422 9.81629 10.4384 11.0685 11.6433 12.2223 12.7764 13.3275 13.7758 14.1958 14.5587 14.8924 15.2117 15.557 15.8948 16.2557 16.5788 16.8606 17.0796 17.2236 17.1697 17.0975 16.9181 16.6353 16.2645 15.8218 15.3424 14.873 14.4651 14.1412 13.901 13.7158 13.53 13.2578 12.7731 11.9546 10.7744 9.33892 7.83778 6.46765 5.4106 4.70178 4.33693 4.33336 4.38687 4.43714 4.64526 4.78447 4.88857 4.98749 5.15372 5.38686 5.57295 5.56965 5.23347 4.52344 3.50663 2.32148 1.09152 -0.112376 -1.30894 -2.4888 -3.67568 -4.77649 -5.69678 -6.24989 -6.11305 -5.12084 -3.22684 -0.697503 1.62717 2.3539 1.49696 1.24234 2.20885 2.76464 3.07959 3.061 4.32603 4.23886 4.25753 4.24628 4.18642 4.06994 3.91011 3.65587 3.37699 3.12594 2.90795 2.74365 2.70192 2.72883 2.85888 3.01275 3.23667 3.47124 3.64936 3.94445 4.14042 4.62093 5.03378 5.40048 5.91162 6.41492 6.91656 7.47111 8.03508 8.61272 9.19495 9.7717 10.3427 10.9 11.4768 12.0561 12.5815 13.0604 13.5256 13.948 14.3673 14.7962 15.1905 15.6041 15.9113 16.1677 16.3201 16.3694 16.2884 16.0436 15.7748 15.4256 15.0137 14.5759 14.1449 13.7504 13.4529 13.2393 13.0858 12.9456 12.7525 12.4051 11.7809 10.7993 9.4962 8.02093 6.56429 5.31133 4.40559 3.89269 3.68771 3.70573 3.79145 3.80506 3.75886 3.7984 3.776 3.81307 3.83851 3.93356 3.95731 3.76055 3.24548 2.40792 1.34432 0.184532 -0.976382 -2.11552 -3.2504 -4.44001 -5.62691 -6.70365 -7.49137 -7.79972 -7.23419 -5.56136 -3.0789 -0.364539 1.69876 2.22888 1.31641 1.02643 1.93894 2.49205 2.82789 2.81123 4.87782 4.7645 4.75907 4.72894 4.6108 4.49435 4.30556 4.16751 3.83781 3.65416 3.37115 3.25249 3.07092 3.07621 3.15636 3.27443 3.44027 3.55262 3.74176 3.92416 4.28145 4.66415 4.88666 5.33055 5.71577 6.10568 6.54249 6.98468 7.46694 7.97126 8.51786 9.02088 9.534 10.0919 10.6767 11.2385 11.7929 12.3122 12.8005 13.2679 13.7321 14.1626 14.5638 14.8683 15.095 15.2225 15.2703 15.1519 14.9938 14.6819 14.3338 13.9972 13.6295 13.2791 12.9348 12.6676 12.429 12.2831 12.1575 11.9967 11.74 11.2973 10.5738 9.53825 8.26117 6.89149 5.59407 4.51176 3.76299 3.41657 3.28242 3.26762 3.27193 3.22417 3.07886 2.92472 2.81194 2.70573 2.64432 2.51296 2.31693 1.89275 1.19136 0.239853 -0.847076 -1.95774 -3.0567 -4.15237 -5.27345 -6.4796 -7.64066 -8.60184 -9.07415 -8.85761 -7.75589 -5.51967 -2.54838 0.112548 1.71392 1.97954 1.0917 0.811549 1.66658 2.20716 2.55506 2.54032 5.40891 5.27151 5.25136 5.23848 5.10266 4.968 4.8011 4.63738 4.41861 4.20085 3.99057 3.76328 3.65587 3.54592 3.55967 3.683 3.70199 3.79028 3.94881 4.24648 4.56767 4.76896 5.12481 5.45572 5.83249 6.1463 6.52446 6.8857 7.32907 7.80913 8.27139 8.73684 9.21979 9.7446 10.2733 10.813 11.3159 11.8041 12.2618 12.7015 13.0939 13.4408 13.7104 13.8717 13.9383 13.8844 13.7666 13.6192 13.3498 13.0926 12.8005 12.5432 12.3158 12.0513 11.8359 11.6124 11.4304 11.2527 11.0756 10.8549 10.5097 9.97764 9.21512 8.22608 7.08612 5.91289 4.83643 3.9395 3.36413 3.07996 2.96781 2.90591 2.83212 2.65885 2.50396 2.25537 2.03354 1.80354 1.57909 1.25516 0.768251 0.0912624 -0.793892 -1.82719 -2.91626 -4.00538 -5.05203 -6.11185 -7.24708 -8.36293 -9.38775 -10.039 -9.99573 -9.02809 -7.23059 -4.77732 -1.7895 0.762566 1.93516 1.76488 0.865783 0.579979 1.32154 1.74251 1.92604 1.91305 5.91977 5.76467 5.73339 5.73257 5.60735 5.4742 5.35585 5.05413 5.06151 4.76634 4.56996 4.36573 4.21577 4.05173 4.00545 4.01595 4.04087 4.08692 4.30097 4.56572 4.76575 5.03433 5.35741 5.68975 6.01454 6.32457 6.61388 6.97374 7.39287 7.80629 8.23071 8.66776 9.10693 9.54263 10.0189 10.4512 10.8722 11.2562 11.6133 11.9282 12.1801 12.3547 12.4477 12.4337 12.3182 12.1622 11.9527 11.797 11.6435 11.4936 11.3616 11.2557 11.1582 11.0083 10.8223 10.5924 10.3993 10.1683 9.88947 9.54928 9.11001 8.51706 7.76096 6.88101 5.92816 4.98766 4.14125 3.46523 3.01961 2.77071 2.67145 2.5468 2.38324 2.22148 1.97835 1.71668 1.39333 1.09658 0.683013 0.158504 -0.572065 -1.49684 -2.56921 -3.67549 -4.77402 -5.81403 -6.84323 -7.86858 -8.89547 -9.81005 -10.4858 -10.5557 -9.86318 -8.25583 -5.80071 -3.0605 -0.672814 1.34088 2.26538 1.71778 0.657765 0.242395 0.833524 1.17483 1.32633 1.31508 6.41042 6.24015 6.20076 6.19279 6.10152 5.98886 5.80094 5.7192 5.47648 5.30274 5.1416 4.97887 4.65954 4.49506 4.46664 4.40317 4.36218 4.45819 4.60799 4.74399 4.94171 5.22773 5.51972 5.88898 6.14139 6.4261 6.69607 7.03614 7.37064 7.75713 8.13151 8.51212 8.86495 9.2369 9.58846 9.88917 10.1561 10.3921 10.5965 10.7285 10.798 10.7987 10.7159 10.5708 10.381 10.196 10.0709 10.003 10.0607 10.1066 10.1675 10.2031 10.1649 10.0814 9.85768 9.60547 9.32236 9.018 8.63656 8.15842 7.60595 6.97415 6.25652 5.50019 4.73707 4.01286 3.39028 2.91804 2.57505 2.43286 2.26914 2.1288 1.96854 1.76453 1.51753 1.20389 0.866807 0.460048 -0.045509 -0.748173 -1.65324 -2.7519 -3.96329 -5.16192 -6.26343 -7.28714 -8.26237 -9.1754 -9.94377 -10.4815 -10.5338 -9.98106 -8.57694 -6.45523 -3.81309 -1.13924 1.01589 1.98489 2.3451 1.68981 0.468688 -0.104518 0.3528 0.639561 0.756633 0.747102 6.7919 6.68983 6.63905 6.61967 6.52707 6.42095 6.27378 6.18498 5.87493 5.86803 5.61107 5.34396 5.10432 4.95872 4.86707 4.73587 4.70209 4.74854 4.78726 4.87146 5.08646 5.33506 5.64606 5.90947 6.18975 6.4066 6.66055 6.92378 7.2025 7.4994 7.8199 8.09331 8.36963 8.61898 8.80142 8.94921 9.0372 9.10125 9.12552 9.08234 8.98886 8.85542 8.69178 8.52057 8.38222 8.31131 8.34639 8.51403 8.74112 9.01196 9.20131 9.2977 9.28647 9.16913 8.92679 8.58197 8.20059 7.80573 7.31535 6.72628 6.08319 5.40615 4.75384 4.10194 3.50526 2.94919 2.51633 2.20201 2.02655 1.9078 1.78072 1.64603 1.48502 1.273 1.009 0.689581 0.327349 -0.104259 -0.684178 -1.4399 -2.4117 -3.57078 -4.81851 -6.06445 -7.17062 -8.15133 -8.98011 -9.64729 -10.0435 -10.0369 -9.41528 -8.18352 -6.30725 -3.84091 -1.31795 0.844766 2.3194 2.82778 2.34368 1.4774 0.21214 -0.422567 -0.0990023 0.132833 0.217206 0.209382 6.90077 6.82459 6.84999 6.88404 6.79769 6.70682 6.63061 6.39643 6.41275 6.12935 5.90146 5.65218 5.49586 5.36372 5.13415 5.04048 5.01601 4.97796 4.95846 5.06295 5.23097 5.44477 5.69545 5.91951 6.11492 6.30979 6.49248 6.65765 6.86169 7.05615 7.24589 7.41282 7.55015 7.64206 7.67182 7.63244 7.55721 7.47416 7.33538 7.1714 6.98759 6.81179 6.68141 6.60424 6.61988 6.74407 6.98867 7.32614 7.73086 8.0991 8.32647 8.41179 8.38379 8.20907 7.95801 7.56582 7.05694 6.53484 5.94377 5.27384 4.57708 3.89868 3.27448 2.74338 2.26992 1.90327 1.59785 1.41618 1.36125 1.31006 1.25469 1.12203 0.957082 0.749691 0.473732 0.146749 -0.214837 -0.640523 -1.18633 -1.92239 -2.83948 -3.89852 -5.04867 -6.17688 -7.2007 -8.01863 -8.60898 -8.89655 -8.81478 -8.22233 -7.09537 -5.34884 -3.2045 -0.895258 1.20946 2.74574 3.2962 3.22765 2.39357 1.17563 -0.144734 -0.752563 -0.538581 -0.349021 -0.293232 -0.299368 7.00261 6.91343 6.92473 6.96842 6.88307 6.826 6.75798 6.67304 6.55699 6.29719 6.11892 5.95967 5.78114 5.57277 5.43225 5.35341 5.28908 5.23761 5.23382 5.30445 5.41836 5.59059 5.74881 5.91136 6.03988 6.14965 6.22921 6.3099 6.37819 6.44753 6.4773 6.49896 6.47268 6.41114 6.3011 6.11233 5.92282 5.72531 5.51178 5.30016 5.1214 5.00953 4.98734 5.07782 5.27684 5.5818 5.96993 6.40796 6.85398 7.20014 7.41444 7.45869 7.37692 7.20524 6.93378 6.52822 5.99456 5.3112 4.58764 3.88322 3.1508 2.47961 1.90427 1.4718 1.13964 0.925899 0.812216 0.772459 0.772301 0.810914 0.778214 0.666099 0.494728 0.258938 -0.0268318 -0.349096 -0.702453 -1.09781 -1.57944 -2.19554 -2.94824 -3.79672 -4.69425 -5.55147 -6.28039 -6.78811 -7.01388 -6.87464 -6.31316 -5.293 -3.82781 -1.9959 0.0250427 1.85657 3.31423 3.97808 3.95317 3.21318 2.25703 0.845025 -0.510482 -1.08747 -0.93157 -0.807166 -0.774559 -0.779021 7.09705 6.99023 6.98455 7.01323 6.89147 6.82752 6.80293 6.76988 6.57908 6.45417 6.29752 6.13035 5.95372 5.8061 5.71441 5.65491 5.60305 5.55815 5.55877 5.57177 5.63781 5.72523 5.82277 5.89401 5.94145 5.94151 5.9204 5.87737 5.81216 5.71447 5.59632 5.44757 5.29297 5.11939 4.89499 4.65316 4.41527 4.17591 3.96554 3.79229 3.6971 3.69755 3.81348 4.04639 4.3702 4.7652 5.19145 5.61509 5.98469 6.26252 6.40053 6.40482 6.30853 6.16557 5.90664 5.51308 4.95038 4.21923 3.4385 2.67427 1.9475 1.28232 0.767287 0.410484 0.23287 0.16465 0.23289 0.337707 0.440912 0.500118 0.457841 0.342949 0.15031 -0.113982 -0.412764 -0.7344 -1.06578 -1.41746 -1.82889 -2.30954 -2.84933 -3.43857 -4.00216 -4.48485 -4.80499 -4.89875 -4.68872 -4.14601 -3.25426 -2.04643 -0.553911 1.05136 2.58476 3.82681 4.49742 4.55869 4.00445 3.0059 1.80551 0.423097 -0.884044 -1.43288 -1.35482 -1.35908 -1.43895 -1.44257 7.18377 7.05915 7.03164 7.0477 6.88309 6.80703 6.80346 6.74343 6.63741 6.52984 6.39389 6.23505 6.10414 6.01609 5.97001 5.93071 5.88845 5.85535 5.81248 5.78101 5.771 5.78154 5.79788 5.79582 5.75353 5.67061 5.54422 5.38483 5.18727 4.95268 4.69977 4.4402 4.20894 3.9881 3.76118 3.53903 3.32235 3.12749 2.9668 2.88821 2.89864 3.00622 3.20718 3.48753 3.83143 4.2014 4.55514 4.86465 5.10639 5.27008 5.33188 5.31642 5.24027 5.0978 4.88402 4.52241 3.95226 3.26711 2.53133 1.78776 1.10488 0.503169 0.0272661 -0.240713 -0.31916 -0.230824 -0.0712002 0.126811 0.293241 0.338053 0.270808 0.120909 -0.0963334 -0.351714 -0.641189 -0.943323 -1.24648 -1.56102 -1.89543 -2.24943 -2.63183 -2.98411 -3.27019 -3.43115 -3.39684 -3.11978 -2.57327 -1.75249 -0.712127 0.478745 1.73499 2.94307 3.93205 4.56924 4.69858 4.31308 3.48751 2.41313 1.12585 -0.204916 -1.38086 -1.89369 -1.92328 -1.99059 -2.11237 -2.11536 7.26325 7.12002 7.07175 7.07542 6.89588 6.7943 6.77279 6.70923 6.63585 6.53167 6.40268 6.27466 6.17179 6.11277 6.07453 6.03991 5.99866 5.93794 5.8546 5.76414 5.68254 5.62426 5.57807 5.51602 5.42009 5.27959 5.09458 4.86387 4.59223 4.29144 3.97841 3.70117 3.47745 3.30097 3.15497 3.01582 2.87549 2.74474 2.6691 2.67468 2.7669 2.91943 3.11428 3.34363 3.59181 3.83992 4.05686 4.20158 4.27895 4.3115 4.31811 4.27999 4.19909 4.07836 3.87054 3.51593 3.02951 2.44805 1.83062 1.23607 0.677912 0.172248 -0.222429 -0.428753 -0.430648 -0.30917 -0.12655 0.0568919 0.170879 0.171502 0.0586497 -0.119707 -0.307661 -0.510819 -0.73606 -0.978225 -1.23026 -1.48816 -1.7418 -2.00815 -2.26709 -2.49201 -2.635 -2.64244 -2.46594 -2.0606 -1.40904 -0.551233 0.412984 1.40075 2.334 3.12145 3.67102 3.87368 3.69415 3.13962 2.29451 1.24881 0.124571 -1.05455 -2.01108 -2.40871 -2.47232 -2.5718 -2.7612 -2.76366 7.17332 7.16356 7.09575 7.0687 6.88858 6.74792 6.67579 6.59163 6.49608 6.3795 6.2542 6.12964 6.0276 5.95463 5.89556 5.83757 5.76634 5.67249 5.55829 5.43437 5.31419 5.21943 5.13693 5.04383 4.93052 4.79135 4.61913 4.41155 4.1766 3.92047 3.67142 3.47977 3.35594 3.28469 3.23717 3.18763 3.12865 3.06688 3.03989 3.09438 3.20055 3.32256 3.43967 3.5501 3.64798 3.7397 3.79395 3.76714 3.68227 3.59534 3.52391 3.44335 3.3355 3.19853 2.98331 2.64887 2.23411 1.79719 1.36462 0.943948 0.53879 0.160385 -0.16048 -0.348292 -0.387716 -0.340024 -0.276708 -0.234087 -0.241943 -0.325027 -0.480181 -0.618831 -0.715306 -0.801582 -0.905384 -1.0281 -1.16901 -1.31564 -1.45409 -1.60381 -1.76686 -1.91166 -2.01161 -2.02818 -1.92826 -1.67542 -1.25538 -0.693264 -0.0992564 0.480093 1.00442 1.4111 1.63198 1.63046 1.39563 0.946888 0.339397 -0.365031 -1.14212 -1.96782 -2.63905 -2.89794 -2.98206 -3.12384 -3.37885 -3.38085 6.65412 6.67875 6.73404 6.77101 6.66729 6.56073 6.43879 6.31503 6.17256 6.03411 5.90265 5.78173 5.67047 5.56586 5.46324 5.36361 5.26021 5.14894 5.04095 4.92778 4.81757 4.71149 4.61772 4.52054 4.42468 4.33585 4.24131 4.13942 4.03505 3.93918 3.87929 3.85316 3.84449 3.85256 3.86351 3.86132 3.85528 3.84964 3.85327 3.88167 3.91392 3.93627 3.9513 3.95384 3.94546 3.91852 3.83548 3.69222 3.52681 3.36751 3.22302 3.06989 2.90403 2.72478 2.4866 2.17475 1.84375 1.52456 1.21797 0.902624 0.581776 0.262083 -0.0263592 -0.247738 -0.438171 -0.612146 -0.791657 -0.97844 -1.16536 -1.35637 -1.52579 -1.52097 -1.47371 -1.42622 -1.38754 -1.35614 -1.33006 -1.31156 -1.29188 -1.2831 -1.29469 -1.32182 -1.35998 -1.40394 -1.43282 -1.44298 -1.42389 -1.38736 -1.39967 -1.39738 -1.36202 -1.34213 -1.36152 -1.42257 -1.52575 -1.66908 -1.84525 -2.04738 -2.29225 -2.59189 -2.93174 -3.25314 -3.44825 -3.64972 -3.93632 -3.93781 6.13739 6.15766 6.18311 6.18973 6.17907 6.15844 6.13154 6.08896 6.01694 5.90809 5.7781 5.64942 5.52943 5.41052 5.29838 5.18736 5.07507 4.95958 4.84852 4.74641 4.63315 4.53165 4.43573 4.34544 4.26145 4.19169 4.11878 4.04752 3.98065 3.92952 3.92335 3.93033 3.94345 3.96618 3.9884 3.99997 4.0077 4.02783 4.02444 4.02124 4.00827 3.98791 3.96601 3.93803 3.89878 3.84238 3.70583 3.52439 3.33065 3.13827 2.95525 2.75444 2.54366 2.32574 2.06971 1.76983 1.46327 1.16138 0.869615 0.564157 0.247059 -0.0694156 -0.358021 -0.56289 -0.765485 -0.965969 -1.17137 -1.38008 -1.58252 -1.78044 -1.96768 -1.94264 -1.88644 -1.83404 -1.78845 -1.74827 -1.70717 -1.67018 -1.63761 -1.60977 -1.59775 -1.59891 -1.61547 -1.65178 -1.69297 -1.72355 -1.69722 -1.6746 -1.72757 -1.79397 -1.86145 -1.93566 -2.0194 -2.11497 -2.22266 -2.34036 -2.47009 -2.62281 -2.80488 -3.01959 -3.27627 -3.56726 -3.87556 -4.14273 -4.46403 -4.465 5.62324 5.64288 5.66188 5.67131 5.68401 5.68651 5.67761 5.65536 5.61423 5.56742 5.51074 5.44489 5.37325 5.29425 5.17957 5.06311 4.94366 4.82436 4.70953 4.59641 4.49088 4.39517 4.31811 4.24464 4.17123 4.10778 4.04138 3.97444 3.91623 3.88529 3.90544 3.93671 3.96968 4.00394 4.03585 4.0633 4.08773 4.11263 4.08157 4.04067 3.99429 3.94528 3.89538 3.84523 3.79084 3.71825 3.54843 3.32607 3.09306 2.86062 2.63206 2.39035 2.14168 1.88669 1.61617 1.32495 1.02695 0.73029 0.437948 0.136262 -0.172689 -0.482822 -0.77433 -0.965136 -1.15405 -1.34179 -1.53084 -1.72082 -1.90801 -2.09321 -2.27263 -2.28488 -2.23978 -2.19537 -2.1575 -2.12682 -2.09459 -2.06707 -2.0465 -2.02938 -2.0259 -1.99756 -1.94204 -1.90053 -1.8716 -1.84565 -1.82496 -1.81612 -1.86485 -1.9515 -2.04697 -2.15171 -2.26273 -2.38275 -2.51524 -2.65855 -2.81074 -2.98916 -3.19722 -3.4262 -3.68186 -3.9696 -4.27143 -4.53272 -4.80014 -4.80148 5.11162 5.13932 5.16189 5.1851 5.21184 5.2267 5.22988 5.22172 5.20233 5.17198 5.13093 5.07952 5.03089 4.98244 4.9218 4.84933 4.76546 4.67056 4.56504 4.44385 4.32312 4.26738 4.21495 4.15922 4.10051 4.03976 3.97697 3.91145 3.84342 3.82952 3.88733 3.94225 3.99453 4.04423 4.09146 4.13671 4.18031 4.2169 4.13515 4.05642 3.98027 3.90614 3.83337 3.76165 3.69061 3.6198 3.40871 3.1398 2.86824 2.59542 2.31926 2.03959 1.75571 1.46691 1.17622 0.888354 0.598432 0.306645 0.0128045 -0.283038 -0.580425 -0.879136 -1.17799 -1.35586 -1.53349 -1.71061 -1.88703 -2.06233 -2.23638 -2.40905 -2.5801 -2.62781 -2.58619 -2.54967 -2.51844 -2.49241 -2.42579 -2.33833 -2.25493 -2.17591 -2.11826 -2.06804 -2.02555 -1.99112 -1.96543 -1.94874 -1.941 -1.9425 -1.97696 -2.07966 -2.1922 -2.3149 -2.44785 -2.59094 -2.74449 -2.90897 -3.08462 -3.28078 -3.51313 -3.76372 -3.98106 -4.21836 -4.47644 -4.75558 -5.05578 -5.0578 cf-python-1.3.2/cf/um/umread/pp_packed.txt0000600000175000017500000000732712410001701020564 0ustar daviddavid00000000000000PP big_endian 4 num variables: 3 var 0: nz = 1, nt = 1 var 0 record 0 hdr offset: 4 data offset: 268 disk length: 13176 int hdr: [ 1909 12 1 0 0 331 1910 1 1 0 0 1 122 720 3294 1 0 73 96 0 1 2 16 0 128 129 0 352513 555008 2048 870 18 9999 0 0 0 0 1111 1 555008 0 24 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -1.00000000e+01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.00000000e+01 0.00000000e+00 0.00000000e+00 9.25000000e+01 -2.50000000e+00 -3.75000000e+00 3.75000000e+00 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 7008 data: [ 233.45117188 233.45117188 233.45117188 ..., 251.13476562 251.13476562 251.13476562] ----------------------- =============================== var 1: nz = 1, nt = 1 var 1 record 0 hdr offset: 13452 data offset: 13716 disk length: 28032 int hdr: [ 1909 12 1 0 0 331 1910 1 1 0 0 1 122 720 7008 1 0 73 96 0 0 2 37 0 128 129 0 352513 565248 8192 870 134 9999 0 0 0 0 1111 1 565248 0 31 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.00000000e+01 0.00000000e+00 0.00000000e+00 9.25000000e+01 -2.50000000e+00 -3.75000000e+00 3.75000000e+00 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 7008 data: [ 1.00000000e+00 1.00000000e+00 1.00000000e+00 ..., -1.07374182e+09 -1.07374182e+09 -1.07374182e+09] ----------------------- =============================== var 2: nz = 1, nt = 1 var 2 record 0 hdr offset: 41756 data offset: 42020 disk length: 28032 int hdr: [ 1909 12 1 0 0 331 1910 1 1 0 0 1 122 720 7008 1 0 73 96 0 0 2 687 0 128 129 0 352513 573440 8192 870 0 0 0 0 0 0 1111 1 573440 0 32 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -9.90000000e+01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.00000000e+01 0.00000000e+00 0.00000000e+00 9.25000000e+01 -2.50000000e+00 -3.75000000e+00 3.75000000e+00 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 7008 data: [ 2.00000000e+00 2.00000000e+00 2.00000000e+00 ..., -1.07374182e+09 -1.07374182e+09 -1.07374182e+09] ----------------------- =============================== record read using saved file type and offsets: int hdr: [ 1909 12 1 0 0 331 1910 1 1 0 0 1 122 720 3294 1 0 73 96 0 1 2 16 0 128 129 0 352513 555008 2048 870 18 9999 0 0 0 0 1111 1 555008 0 24 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 -1.00000000e+01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.00000000e+01 0.00000000e+00 0.00000000e+00 9.25000000e+01 -2.50000000e+00 -3.75000000e+00 3.75000000e+00 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 7008 data: [ 233.45117188 233.45117188 233.45117188 ..., 251.13476562 251.13476562 251.13476562] nx = 96 ny = 73 data_type = real nwords = 7008 cf-python-1.3.2/cf/um/umread/ff.txt0000600000175000017500000657101112410001672017242 0ustar daviddavid00000000000000DEBUG: n_raw_rec=1764 n_valid_rec=1764 FF big_endian 8 num variables: 119 var 0: nz = 38, nt = 1 var 0 record 0 hdr offset: 5216 data offset: 917504 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 114688 79872 -32768 5 1 0 0 0 0 7031111 1 1 0 2 0 0 1] real hdr: [ 2.00003377e+01 9.97716462e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.99820611e+00 0.00000000e+00 9.98858129e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-6.90907097 -6.9162221 -6.92416382 ..., -0.93425995 -0.79391634 -0.68335903] ----------------------- var 0 record 1 hdr offset: 5728 data offset: 1556480 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 194560 79872 -32768 5 2 0 0 0 0 7031111 1 156401 0 2 0 0 1] real hdr: [ 8.00013508e+01 9.90881510e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.99988815e+01 2.00003377e+01 9.94296273e-01 9.97716462e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-7.59037924 -7.59630299 -7.60318565 ..., -0.98843598 -0.84059107 -0.72435862] ----------------------- var 0 record 2 hdr offset: 6240 data offset: 2195456 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 274432 79872 -32768 5 3 0 0 0 0 7031111 1 312801 0 2 0 0 1] real hdr: [ 1.79999114e+02 9.79542572e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30000232e+02 8.00013508e+01 9.85203885e-01 9.90881510e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-7.97602654 -7.98019791 -7.98536158 ..., -1.03496766 -0.8811456 -0.76017696] ----------------------- var 0 record 3 hdr offset: 6752 data offset: 2834432 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 354304 79872 -32768 5 4 0 0 0 0 7031111 1 469201 0 2 0 0 1] real hdr: [ 3.20001478e+02 9.63777064e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.49998333e+02 1.79999114e+02 9.71644051e-01 9.79542572e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-8.23843765 -8.23892784 -8.24040699 ..., -1.14513993 -0.98694313 -0.85803121] ----------------------- var 0 record 4 hdr offset: 7264 data offset: 3473408 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 434176 79872 -32768 5 5 0 0 0 0 7031111 1 625601 0 2 0 0 1] real hdr: [ 5.00000592e+02 9.43695500e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.10001035e+02 3.20001478e+02 9.53709855e-01 9.63777064e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-8.51891422 -8.51495075 -8.51153564 ..., -1.53531754 -1.38898408 -1.24466038] ----------------------- var 0 record 5 hdr offset: 7776 data offset: 4112384 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 514048 79872 -32768 5 6 0 0 0 0 7031111 1 782001 0 2 0 0 1] real hdr: [ 7.20000381e+02 9.19438386e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.10000486e+02 5.00000592e+02 9.31527464e-01 9.43695500e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-8.94277954 -8.9317255 -8.92078209 ..., -1.65502298 -1.56236374 -1.45133293] ----------------------- var 0 record 6 hdr offset: 8288 data offset: 4751360 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 593920 79872 -32768 5 7 0 0 0 0 7031111 1 938401 0 2 0 0 1] real hdr: [ 9.80000846e+02 8.91177995e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.50000613e+02 7.20000381e+02 9.05253051e-01 9.19438386e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-8.83996391 -8.8205204 -8.80026722 ..., -1.27496433 -1.23050249 -1.17678857] ----------------------- var 0 record 7 hdr offset: 8800 data offset: 5390336 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 673792 79872 -32768 5 8 0 0 0 0 7031111 1 1094801 0 2 0 0 1] real hdr: [ 1.27999806e+03 8.59118341e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.13000142e+03 9.80000846e+02 8.75074549e-01 8.91177995e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-8.25003719 -8.20912361 -8.16720295 ..., -0.59777695 -0.57771009 -0.5700295 ] ----------------------- var 0 record 8 hdr offset: 9312 data offset: 6029312 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 753664 79872 -32768 5 9 0 0 0 0 7031111 1 1251201 0 2 0 0 1] real hdr: [ 1.61999988e+03 8.23493502e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.44999897e+03 1.27999806e+03 8.41211628e-01 8.59118341e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-7.73721933 -7.68866682 -7.63955688 ..., 0.49780205 0.52026635 0.49928823] ----------------------- var 0 record 9 hdr offset: 9824 data offset: 6668288 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 833536 79872 -32768 5 10 0 0 0 0 7031111 1 1407601 0 2 0 0 1] real hdr: [ 1.99999844e+03 7.84570542e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81000112e+03 1.61999988e+03 8.03914038e-01 8.23493502e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-8.58317089 -8.59107399 -8.5971117 ..., 1.86230028 1.85546529 1.80276155] ----------------------- var 0 record 10 hdr offset: 10336 data offset: 7307264 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 913408 79872 -32768 5 11 0 0 0 0 7031111 1 1564001 0 2 0 0 1] real hdr: [ 2.42000161e+03 7.42646223e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.21000002e+03 1.99999844e+03 7.63464495e-01 7.84570542e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-10.53792191 -10.53863716 -10.54244423 ..., 3.60485411 3.54652214 3.47289181] ----------------------- var 0 record 11 hdr offset: 10848 data offset: 7946240 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 993280 79872 -32768 5 12 0 0 0 0 7031111 1 1720401 0 2 0 0 1] real hdr: [ 2.88000152e+03 6.98050213e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.64999960e+03 2.42000161e+03 7.20175811e-01 7.42646223e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-10.13449764 -10.12039661 -10.10602951 ..., 5.45413828 5.35649252 5.27847338] ----------------------- var 0 record 12 hdr offset: 11360 data offset: 8585216 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 1073152 79872 -32768 5 13 0 0 0 0 7031111 1 1876801 0 2 0 0 1] real hdr: [ 3.37999819e+03 6.51142688e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.12999986e+03 2.88000152e+03 6.74392534e-01 6.98050213e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-10.12641811 -10.08581829 -10.04527283 ..., 7.13825083 6.97219849 6.85218239] ----------------------- var 0 record 13 hdr offset: 11872 data offset: 9224192 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 1153024 79872 -32768 5 14 0 0 0 0 7031111 1 2033201 0 2 0 0 1] real hdr: [ 3.91999946e+03 6.02314441e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.65000079e+03 3.37999819e+03 6.26490534e-01 6.51142688e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-11.3104744 -11.27217579 -11.23400402 ..., 8.13810539 7.90637493 7.68633413] ----------------------- var 0 record 14 hdr offset: 12384 data offset: 9863168 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 1232896 79872 -32768 5 15 0 0 0 0 7031111 1 2189601 0 2 0 0 1] real hdr: [ 4.50000140e+03 5.51988701e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.20999847e+03 3.91999946e+03 5.76877346e-01 6.02314441e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-11.94096088 -11.95355797 -11.96577835 ..., 7.64844894 7.38470078 7.15716887] ----------------------- var 0 record 15 hdr offset: 12896 data offset: 10502144 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 1312768 79872 -32768 5 16 0 0 0 0 7031111 1 2346001 0 2 0 0 1] real hdr: [ 5.12000009e+03 5.00619965e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.81000075e+03 4.50000140e+03 5.25990788e-01 5.51988701e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-10.12401581 -10.11274052 -10.10220242 ..., 5.88548231 5.70012283 5.61513853] ----------------------- var 0 record 16 hdr offset: 13408 data offset: 11141120 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 1392640 79872 -32768 5 17 0 0 0 0 7031111 1 2502401 0 2 0 0 1] real hdr: [ 5.77999946e+03 4.48693382e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.44999978e+03 5.12000009e+03 4.74301366e-01 5.00619965e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-8.83372116 -8.8561306 -8.87740803 ..., 5.73969603 5.72064018 5.7184968 ] ----------------------- var 0 record 17 hdr offset: 13920 data offset: 11780096 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 1472512 79872 -32768 5 18 0 0 0 0 7031111 1 2658801 0 2 0 0 1] real hdr: [ 6.47999950e+03 3.96725773e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.12999948e+03 5.77999946e+03 4.22309896e-01 4.48693382e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-6.25618935 -6.34341002 -6.42913866 ..., 6.02019882 6.0134263 5.98784065] ----------------------- var 0 record 18 hdr offset: 14432 data offset: 12419072 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 1552384 79872 -32768 5 19 0 0 0 0 7031111 1 2815201 0 2 0 0 1] real hdr: [ 7.22000022e+03 3.45265283e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.84999986e+03 6.47999950e+03 3.70548863e-01 3.96725773e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-5.29853821 -5.30048132 -5.30272341 ..., 5.989779 5.92720842 5.80245018] ----------------------- var 0 record 19 hdr offset: 14944 data offset: 13058048 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 1632256 79872 -32768 5 20 0 0 0 0 7031111 1 2971601 0 2 0 0 1] real hdr: [ 8.00000162e+03 2.94891378e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.61000092e+03 7.22000022e+03 3.19582071e-01 3.45265283e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-5.06662989 -5.02275324 -4.97992945 ..., 6.60415268 6.54679966 6.46123648] ----------------------- var 0 record 20 hdr offset: 15456 data offset: 13697024 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 1712128 79872 -32768 5 21 0 0 0 0 7031111 1 3128001 0 2 0 0 1] real hdr: [ 8.81999976e+03 2.46215071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.40999873e+03 8.00000162e+03 2.70004882e-01 2.94891378e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-4.07921934 -4.27748203 -4.47703266 ..., 6.46030855 6.4855094 6.57676601] ----------------------- var 0 record 21 hdr offset: 15968 data offset: 14336000 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 1792000 79872 -32768 5 22 0 0 0 0 7031111 1 3284401 0 2 0 0 1] real hdr: [ 9.67999858e+03 1.99878209e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.25000113e+03 8.81999976e+03 2.22443261e-01 2.46215071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.48974669 0.31589675 0.14074075 ..., 6.11589241 6.19894314 6.37020016] ----------------------- var 0 record 22 hdr offset: 16480 data offset: 14974976 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 1871872 79872 -32768 5 23 0 0 0 0 7031111 1 3440801 0 2 0 0 1] real hdr: [ 1.05799981e+04 1.56554224e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.01300003e+04 9.67999858e+03 1.77555424e-01 1.99878209e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.82380009 3.68331957 3.5437932 ..., 6.17898941 6.23975277 6.32581997] ----------------------- var 0 record 23 hdr offset: 16992 data offset: 15613952 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 1951744 79872 -32768 5 24 0 0 0 0 7031111 1 3597201 0 2 0 0 1] real hdr: [ 1.15199982e+04 1.16947874e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.10500001e+04 1.05799981e+04 1.36030234e-01 1.56554224e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 5.64574814 5.47591448 5.30715275 ..., 6.89827728 6.80700445 6.75715017] ----------------------- var 0 record 24 hdr offset: 17504 data offset: 16252928 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 2031616 79872 -32768 5 25 0 0 0 0 7031111 1 3753601 0 2 0 0 1] real hdr: [ 1.24999991e+04 8.17952369e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.20100006e+04 1.15199982e+04 9.85881076e-02 1.16947874e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 9.76994419 9.6009655 9.43653584 ..., 9.40565968 9.26583481 9.07647228] ----------------------- var 0 record 25 hdr offset: 18016 data offset: 16891904 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 2111488 79872 -32768 5 26 0 0 0 0 7031111 1 3910001 0 2 0 0 1] real hdr: [ 1.35200006e+04 5.18637157e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30100018e+04 1.24999991e+04 6.59807861e-02 8.17952369e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 10.54516888 10.42667961 10.30954933 ..., 10.23181915 10.15888786 10.16337585] ----------------------- var 0 record 26 hdr offset: 18528 data offset: 17530880 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 2191360 79872 -32768 5 27 0 0 0 0 7031111 1 4066401 0 2 0 0 1] real hdr: [ 1.45807997e+04 2.79368177e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.40504001e+04 1.35200006e+04 3.89823900e-02 5.18637157e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 7.29287863 7.25139856 7.20897055 ..., 16.88917542 16.78662109 16.73936081] ----------------------- var 0 record 27 hdr offset: 19040 data offset: 18169856 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 2271232 79872 -32768 5 28 0 0 0 0 7031111 1 4222801 0 2 0 0 1] real hdr: [ 1.56946399e+04 1.07164793e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.51377198e+04 1.45807997e+04 1.83146873e-02 2.79368177e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.73172522 4.71220589 4.69238663 ..., 19.38200951 19.46904945 19.5857048 ] ----------------------- var 0 record 28 hdr offset: 19552 data offset: 18808832 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 2351104 79872 -32768 5 29 0 0 0 0 7031111 1 4379201 0 2 0 0 1] real hdr: [ 1.68753114e+04 1.30179090e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.62849737e+04 1.56946399e+04 4.87210933e-03 1.07164793e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -4.90914059 -5.01599741 -5.1210804 ..., 14.89267159 14.92418671 14.94275951] ----------------------- var 0 record 29 hdr offset: 20064 data offset: 19447808 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 2430976 79872 -32768 5 30 0 0 0 0 7031111 1 4535601 0 2 0 0 1] real hdr: [ 1.81386262e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.75069688e+04 1.68753114e+04 0.00000000e+00 1.30179090e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.25998175 -0.22246747 -0.18742433 ..., 6.8030076 6.74472141 6.67466974] ----------------------- var 0 record 30 hdr offset: 20576 data offset: 20086784 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 2510848 79872 -32768 5 31 0 0 0 0 7031111 1 4692001 0 2 0 0 1] real hdr: [ 1.95030104e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.88208202e+04 1.81386262e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-5.56355715 -5.74156618 -5.91838646 ..., 3.46993566 3.49681544 3.53585196] ----------------------- var 0 record 31 hdr offset: 21088 data offset: 20725760 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 2590720 79872 -32768 5 32 0 0 0 0 7031111 1 4848401 0 2 0 0 1] real hdr: [ 2.09901876e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.02465990e+04 1.95030104e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.2430253 4.36680317 4.49031925 ..., -0.68407667 -0.72658545 -0.80208308] ----------------------- var 0 record 32 hdr offset: 21600 data offset: 21364736 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 2670592 79872 -32768 5 33 0 0 0 0 7031111 1 5004801 0 2 0 0 1] real hdr: [ 2.26260817e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.18081366e+04 2.09901876e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 12.85036564 13.00386238 13.15664101 ..., -5.22475958 -5.21599817 -5.21167755] ----------------------- var 0 record 33 hdr offset: 22112 data offset: 22003712 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 2750464 79872 -32768 5 34 0 0 0 0 7031111 1 5161201 0 2 0 0 1] real hdr: [ 2.44582854e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.35421836e+04 2.26260817e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 13.88268661 13.86568642 13.84945011 ..., -7.96067238 -8.03230286 -8.10739231] ----------------------- var 0 record 34 hdr offset: 22624 data offset: 22642688 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 2830336 79872 -32768 5 35 0 0 0 0 7031111 1 5317601 0 2 0 0 1] real hdr: [ 2.65836402e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.55209609e+04 2.44582854e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 5.95545816 5.79857492 5.64044046 ..., -7.47699976 -7.50259113 -7.53299093] ----------------------- var 0 record 35 hdr offset: 23136 data offset: 23281664 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 2910208 79872 -32768 5 36 0 0 0 0 7031111 1 5474001 0 2 0 0 1] real hdr: [ 2.92190802e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.79013583e+04 2.65836402e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 7.96865463 8.15729523 8.34681988 ..., -9.94889927 -9.90105343 -9.846385 ] ----------------------- var 0 record 36 hdr offset: 23648 data offset: 23920640 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 2990080 79872 -32768 5 37 0 0 0 0 7031111 1 5630401 0 2 0 0 1] real hdr: [ 3.29086931e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.10638886e+04 2.92190802e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-12.1228447 -12.16051197 -12.19809341 ..., -5.58229017 -5.59669495 -5.62246132] ----------------------- var 0 record 37 hdr offset: 24160 data offset: 24559616 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 3069952 79872 -32768 5 38 0 0 0 0 7031111 1 5786801 0 2 0 0 1] real hdr: [ 3.92548336e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.60817633e+04 3.29086931e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-30.40071869 -30.41720963 -30.43351746 ..., -3.99285245 -3.96516895 -3.93843913] ----------------------- =============================== var 1: nz = 38, nt = 1 var 1 record 0 hdr offset: 24672 data offset: 25198592 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 3149824 79872 -32768 6 1 0 0 0 0 7031111 1 5943201 0 3 0 0 1] real hdr: [ 2.00003377e+01 9.97716462e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.99820611e+00 0.00000000e+00 9.98858129e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 5.47162104 5.48271608 5.48055267 ..., -3.8123529 -3.93142653 -4.0571537 ] ----------------------- var 1 record 1 hdr offset: 25184 data offset: 25837568 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 3229696 79872 -32768 6 2 0 0 0 0 7031111 1 6099141 0 3 0 0 1] real hdr: [ 8.00013508e+01 9.90881510e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.99988815e+01 2.00003377e+01 9.94296273e-01 9.97716462e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 6.00424957 6.01580238 6.01249599 ..., -4.02531719 -4.155478 -4.29262352] ----------------------- var 1 record 2 hdr offset: 25696 data offset: 26476544 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 3309568 79872 -32768 6 3 0 0 0 0 7031111 1 6255081 0 3 0 0 1] real hdr: [ 1.79999114e+02 9.79542572e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30000232e+02 8.00013508e+01 9.85203885e-01 9.90881510e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 6.30735302 6.31851101 6.3133955 ..., -4.1819706 -4.32042313 -4.46609211] ----------------------- var 1 record 3 hdr offset: 26208 data offset: 27115520 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 3389440 79872 -32768 6 4 0 0 0 0 7031111 1 6411021 0 3 0 0 1] real hdr: [ 3.20001478e+02 9.63777064e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.49998333e+02 1.79999114e+02 9.71644051e-01 9.79542572e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 6.51704597 6.52664089 6.51822424 ..., -4.60776949 -4.74649 -4.89100122] ----------------------- var 1 record 4 hdr offset: 26720 data offset: 27754496 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 3469312 79872 -32768 6 5 0 0 0 0 7031111 1 6566961 0 3 0 0 1] real hdr: [ 5.00000592e+02 9.43695500e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.10001035e+02 3.20001478e+02 9.53709855e-01 9.63777064e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 6.66752672 6.67655897 6.66968107 ..., -6.15932798 -6.30670881 -6.45340061] ----------------------- var 1 record 5 hdr offset: 27232 data offset: 28393472 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 3549184 79872 -32768 6 6 0 0 0 0 7031111 1 6722901 0 3 0 0 1] real hdr: [ 7.20000381e+02 9.19438386e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.10000486e+02 5.00000592e+02 9.31527464e-01 9.43695500e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 6.14400482 6.17048502 6.2010951 ..., -7.76194286 -7.91002417 -8.05440807] ----------------------- var 1 record 6 hdr offset: 27744 data offset: 29032448 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 3629056 79872 -32768 6 7 0 0 0 0 7031111 1 6878841 0 3 0 0 1] real hdr: [ 9.80000846e+02 8.91177995e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.50000613e+02 7.20000381e+02 9.05253051e-01 9.19438386e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 4.96689177 5.01034117 5.06804752 ..., -9.08205223 -9.2135601 -9.3443346 ] ----------------------- var 1 record 7 hdr offset: 28256 data offset: 29671424 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 3708928 79872 -32768 6 8 0 0 0 0 7031111 1 7034781 0 3 0 0 1] real hdr: [ 1.27999806e+03 8.59118341e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.13000142e+03 9.80000846e+02 8.75074549e-01 8.91177995e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 3.61784124 3.65109396 3.69803619 ..., -10.22822857 -10.34791851 -10.47159195] ----------------------- var 1 record 8 hdr offset: 28768 data offset: 30310400 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 3788800 79872 -32768 6 9 0 0 0 0 7031111 1 7190721 0 3 0 0 1] real hdr: [ 1.61999988e+03 8.23493502e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.44999897e+03 1.27999806e+03 8.41211628e-01 8.59118341e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 2.50089359 2.51599598 2.52909136 ..., -11.21920013 -11.36090469 -11.51276016] ----------------------- var 1 record 9 hdr offset: 29280 data offset: 30949376 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 3868672 79872 -32768 6 10 0 0 0 0 7031111 1 7346661 0 3 0 0 1] real hdr: [ 1.99999844e+03 7.84570542e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81000112e+03 1.61999988e+03 8.03914038e-01 8.23493502e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 2.89413595 2.92508721 2.93938398 ..., -11.88370419 -12.11350727 -12.35338211] ----------------------- var 1 record 10 hdr offset: 29792 data offset: 31588352 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 3948544 79872 -32768 6 11 0 0 0 0 7031111 1 7502601 0 3 0 0 1] real hdr: [ 2.42000161e+03 7.42646223e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.21000002e+03 1.99999844e+03 7.63464495e-01 7.84570542e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 3.40942907 3.41985989 3.42368937 ..., -12.33702564 -12.68366337 -13.03192711] ----------------------- var 1 record 11 hdr offset: 30304 data offset: 32227328 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 4028416 79872 -32768 6 12 0 0 0 0 7031111 1 7658541 0 3 0 0 1] real hdr: [ 2.88000152e+03 6.98050213e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.64999960e+03 2.42000161e+03 7.20175811e-01 7.42646223e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 2.49500465 2.5144794 2.53639984 ..., -12.71473598 -12.96536541 -13.20791912] ----------------------- var 1 record 12 hdr offset: 30816 data offset: 32866304 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 4108288 79872 -32768 6 13 0 0 0 0 7031111 1 7814481 0 3 0 0 1] real hdr: [ 3.37999819e+03 6.51142688e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.12999986e+03 2.88000152e+03 6.74392534e-01 6.98050213e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.0559268 1.06115282 1.066167 ..., -13.20892334 -13.15956497 -13.09761429] ----------------------- var 1 record 13 hdr offset: 31328 data offset: 33505280 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 4188160 79872 -32768 6 14 0 0 0 0 7031111 1 7970421 0 3 0 0 1] real hdr: [ 3.91999946e+03 6.02314441e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.65000079e+03 3.37999819e+03 6.26490534e-01 6.51142688e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -0.9763971 -1.00386369 -1.03013885 ..., -13.01947784 -12.85447311 -12.68674564] ----------------------- var 1 record 14 hdr offset: 31840 data offset: 34144256 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 4268032 79872 -32768 6 15 0 0 0 0 7031111 1 8126361 0 3 0 0 1] real hdr: [ 4.50000140e+03 5.51988701e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.20999847e+03 3.91999946e+03 5.76877346e-01 6.02314441e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -2.53350043 -2.62188101 -2.71036029 ..., -10.95995998 -10.89640999 -10.82676697] ----------------------- var 1 record 15 hdr offset: 32352 data offset: 34783232 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 4347904 79872 -32768 6 16 0 0 0 0 7031111 1 8282301 0 3 0 0 1] real hdr: [ 5.12000009e+03 5.00619965e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.81000075e+03 4.50000140e+03 5.25990788e-01 5.51988701e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-1.51035488 -1.54397357 -1.58327448 ..., -8.19104671 -8.19596481 -8.18223095] ----------------------- var 1 record 16 hdr offset: 32864 data offset: 35422208 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 4427776 79872 -32768 6 17 0 0 0 0 7031111 1 8438241 0 3 0 0 1] real hdr: [ 5.77999946e+03 4.48693382e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.44999978e+03 5.12000009e+03 4.74301366e-01 5.00619965e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-2.47493863 -2.44018078 -2.3962853 ..., -5.82582331 -5.76281595 -5.69417048] ----------------------- var 1 record 17 hdr offset: 33376 data offset: 36061184 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 4507648 79872 -32768 6 18 0 0 0 0 7031111 1 8594181 0 3 0 0 1] real hdr: [ 6.47999950e+03 3.96725773e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.12999948e+03 5.77999946e+03 4.22309896e-01 4.48693382e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-3.92029691 -3.89933872 -3.86881208 ..., -3.60087109 -3.47843456 -3.36006951] ----------------------- var 1 record 18 hdr offset: 33888 data offset: 36700160 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 4587520 79872 -32768 6 19 0 0 0 0 7031111 1 8750121 0 3 0 0 1] real hdr: [ 7.22000022e+03 3.45265283e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.84999986e+03 6.47999950e+03 3.70548863e-01 3.96725773e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-2.91805482 -2.86119843 -2.81067252 ..., -2.01840091 -1.69910836 -1.39118409] ----------------------- var 1 record 19 hdr offset: 34400 data offset: 37339136 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 4667392 79872 -32768 6 20 0 0 0 0 7031111 1 8906061 0 3 0 0 1] real hdr: [ 8.00000162e+03 2.94891378e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.61000092e+03 7.22000022e+03 3.19582071e-01 3.45265283e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.55386871 -0.4466126 -0.34462482 ..., -0.66341829 -0.26388511 0.12612978] ----------------------- var 1 record 20 hdr offset: 34912 data offset: 37978112 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 4747264 79872 -32768 6 21 0 0 0 0 7031111 1 9062001 0 3 0 0 1] real hdr: [ 8.81999976e+03 2.46215071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.40999873e+03 8.00000162e+03 2.70004882e-01 2.94891378e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.52390194 1.55418229 1.57417953 ..., 0.48597038 0.99182308 1.50746059] ----------------------- var 1 record 21 hdr offset: 35424 data offset: 38617088 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 4827136 79872 -32768 6 22 0 0 0 0 7031111 1 9217941 0 3 0 0 1] real hdr: [ 9.67999858e+03 1.99878209e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.25000113e+03 8.81999976e+03 2.22443261e-01 2.46215071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 2.59443092 2.62044764 2.64329481 ..., 0.81401563 1.44203758 2.0935812 ] ----------------------- var 1 record 22 hdr offset: 35936 data offset: 39256064 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 4907008 79872 -32768 6 23 0 0 0 0 7031111 1 9373881 0 3 0 0 1] real hdr: [ 1.05799981e+04 1.56554224e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.01300003e+04 9.67999858e+03 1.77555424e-01 1.99878209e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 3.95750022 3.8970418 3.83082747 ..., 0.54630649 0.69874442 0.86124587] ----------------------- var 1 record 23 hdr offset: 36448 data offset: 39895040 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 4986880 79872 -32768 6 24 0 0 0 0 7031111 1 9529821 0 3 0 0 1] real hdr: [ 1.15199982e+04 1.16947874e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.10500001e+04 1.05799981e+04 1.36030234e-01 1.56554224e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 4.19559622 4.26132202 4.333673 ..., 2.43904018 2.26325512 2.09623575] ----------------------- var 1 record 24 hdr offset: 36960 data offset: 40534016 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 5066752 79872 -32768 6 25 0 0 0 0 7031111 1 9685761 0 3 0 0 1] real hdr: [ 1.24999991e+04 8.17952369e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.20100006e+04 1.15199982e+04 9.85881076e-02 1.16947874e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 2.876261 2.94223857 3.00846577 ..., 3.57153106 3.56785607 3.55585718] ----------------------- var 1 record 25 hdr offset: 37472 data offset: 41172992 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 5146624 79872 -32768 6 26 0 0 0 0 7031111 1 9841701 0 3 0 0 1] real hdr: [ 1.35200006e+04 5.18637157e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30100018e+04 1.24999991e+04 6.59807861e-02 8.17952369e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 4.85650635 4.84247541 4.83110189 ..., 4.31554937 4.28755236 4.27442455] ----------------------- var 1 record 26 hdr offset: 37984 data offset: 41811968 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 5226496 79872 -32768 6 27 0 0 0 0 7031111 1 9997641 0 3 0 0 1] real hdr: [ 1.45807997e+04 2.79368177e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.40504001e+04 1.35200006e+04 3.89823900e-02 5.18637157e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 3.31324196 3.23553467 3.14458489 ..., 3.40409827 3.41925502 3.4489789 ] ----------------------- var 1 record 27 hdr offset: 38496 data offset: 42450944 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 5306368 79872 -32768 6 28 0 0 0 0 7031111 1 10153581 0 3 0 0 1] real hdr: [ 1.56946399e+04 1.07164793e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.51377198e+04 1.45807997e+04 1.83146873e-02 2.79368177e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.21586527 -0.1586408 -0.09404125 ..., 6.56599569 6.61613417 6.67141533] ----------------------- var 1 record 28 hdr offset: 39008 data offset: 43089920 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 5386240 79872 -32768 6 29 0 0 0 0 7031111 1 10309521 0 3 0 0 1] real hdr: [ 1.68753114e+04 1.30179090e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.62849737e+04 1.56946399e+04 4.87210933e-03 1.07164793e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.74628282 1.70134163 1.66459239 ..., 4.61606693 4.54369688 4.47075367] ----------------------- var 1 record 29 hdr offset: 39520 data offset: 43728896 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 5466112 79872 -32768 6 30 0 0 0 0 7031111 1 10465461 0 3 0 0 1] real hdr: [ 1.81386262e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.75069688e+04 1.68753114e+04 0.00000000e+00 1.30179090e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.25948381 0.26440105 0.24517143 ..., 3.03027582 2.98107362 2.92889404] ----------------------- var 1 record 30 hdr offset: 40032 data offset: 44367872 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 5545984 79872 -32768 6 31 0 0 0 0 7031111 1 10621401 0 3 0 0 1] real hdr: [ 1.95030104e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.88208202e+04 1.81386262e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.02863959 -0.12012441 -0.20465723 ..., 2.50648236 2.49311948 2.48399353] ----------------------- var 1 record 31 hdr offset: 40544 data offset: 45006848 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 5625856 79872 -32768 6 32 0 0 0 0 7031111 1 10777341 0 3 0 0 1] real hdr: [ 2.09901876e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.02465990e+04 1.95030104e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.13828422 -0.0928887 -0.05017051 ..., -2.43211794 -2.52288818 -2.61791992] ----------------------- var 1 record 32 hdr offset: 41056 data offset: 45645824 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 5705728 79872 -32768 6 33 0 0 0 0 7031111 1 10933281 0 3 0 0 1] real hdr: [ 2.26260817e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.18081366e+04 2.09901876e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-3.2512393 -3.2307713 -3.21565413 ..., -1.41171896 -1.45357966 -1.49784088] ----------------------- var 1 record 33 hdr offset: 41568 data offset: 46284800 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 5785600 79872 -32768 6 34 0 0 0 0 7031111 1 11089221 0 3 0 0 1] real hdr: [ 2.44582854e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.35421836e+04 2.26260817e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.21740842 1.24793637 1.28697109 ..., -0.21679841 -0.14074028 -0.06364394] ----------------------- var 1 record 34 hdr offset: 42080 data offset: 46923776 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 5865472 79872 -32768 6 35 0 0 0 0 7031111 1 11245161 0 3 0 0 1] real hdr: [ 2.65836402e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.55209609e+04 2.44582854e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-1.72456121 -1.76280212 -1.81298018 ..., 2.28893137 2.24431133 2.19963479] ----------------------- var 1 record 35 hdr offset: 42592 data offset: 47562752 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 5945344 79872 -32768 6 36 0 0 0 0 7031111 1 11401101 0 3 0 0 1] real hdr: [ 2.92190802e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.79013583e+04 2.65836402e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 4.73102903 4.8047123 4.88309765 ..., -3.20597363 -3.21880341 -3.23186278] ----------------------- var 1 record 36 hdr offset: 43104 data offset: 48201728 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 6025216 79872 -32768 6 37 0 0 0 0 7031111 1 11557041 0 3 0 0 1] real hdr: [ 3.29086931e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.10638886e+04 2.92190802e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-1.1922754 -1.23104644 -1.25989735 ..., 5.57461214 5.5770359 5.57735348] ----------------------- var 1 record 37 hdr offset: 43616 data offset: 48840704 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 6105088 79872 -32768 6 38 0 0 0 0 7031111 1 11712981 0 3 0 0 1] real hdr: [ 3.92548336e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.60817633e+04 3.29086931e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 8.194417 8.15340328 8.10757256 ..., -10.8388319 -10.91020298 -10.98005962] ----------------------- =============================== var 2: nz = 38, nt = 1 var 2 record 0 hdr offset: 44128 data offset: 49479680 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 6184960 79872 -32768 1 1 0 0 0 0 7031111 1 11868921 0 4 0 0 1] real hdr: [ 4.99988815e+01 9.94296273e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.00003377e+01 0.00000000e+00 9.97716462e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 296.89230347 296.87695312 296.86392212 ..., 297.81918335 297.79702759 297.77575684] ----------------------- var 2 record 1 hdr offset: 44640 data offset: 50118656 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 6264832 79872 -32768 1 2 0 0 0 0 7031111 1 12025321 0 4 0 0 1] real hdr: [ 1.30000232e+02 9.85203885e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00013508e+01 4.99988815e+01 9.90881510e-01 9.94296273e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 296.85021973 296.83370972 296.81921387 ..., 297.76257324 297.74078369 297.71994019] ----------------------- var 2 record 2 hdr offset: 45152 data offset: 50757632 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 6344704 79872 -32768 1 3 0 0 0 0 7031111 1 12181721 0 4 0 0 1] real hdr: [ 2.49998333e+02 9.71644051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.79999114e+02 1.30000232e+02 9.79542572e-01 9.85203885e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 296.83154297 296.81414795 296.79840088 ..., 297.76956177 297.74636841 297.72402954] ----------------------- var 2 record 3 hdr offset: 45664 data offset: 51396608 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 6424576 79872 -32768 1 4 0 0 0 0 7031111 1 12338121 0 4 0 0 1] real hdr: [ 4.10001035e+02 9.53709855e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.20001478e+02 2.49998333e+02 9.63777064e-01 9.71644051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 296.79907227 296.78234863 296.7677002 ..., 299.64266968 299.52111816 299.39904785] ----------------------- var 2 record 4 hdr offset: 46176 data offset: 52035584 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 6504448 79872 -32768 1 5 0 0 0 0 7031111 1 12494521 0 4 0 0 1] real hdr: [ 6.10000486e+02 9.31527464e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.00000592e+02 4.10001035e+02 9.43695500e-01 9.53709855e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 296.81182861 296.80010986 296.78738403 ..., 303.9637146 303.90097046 303.83731079] ----------------------- var 2 record 5 hdr offset: 46688 data offset: 52674560 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 6584320 79872 -32768 1 6 0 0 0 0 7031111 1 12650921 0 4 0 0 1] real hdr: [ 8.50000613e+02 9.05253051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.20000381e+02 6.10000486e+02 9.19438386e-01 9.31527464e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 297.91644287 297.86779785 297.81222534 ..., 306.20150757 306.16430664 306.12686157] ----------------------- var 2 record 6 hdr offset: 47200 data offset: 53313536 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 6664192 79872 -32768 1 7 0 0 0 0 7031111 1 12807321 0 4 0 0 1] real hdr: [ 1.13000142e+03 8.75074549e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.80000846e+02 8.50000613e+02 8.91177995e-01 9.05253051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 298.94067383 298.89810181 298.8470459 ..., 307.16558838 307.121521 307.07717896] ----------------------- var 2 record 7 hdr offset: 47712 data offset: 53952512 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 6744064 79872 -32768 1 8 0 0 0 0 7031111 1 12963721 0 4 0 0 1] real hdr: [ 1.44999897e+03 8.41211628e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.27999806e+03 1.13000142e+03 8.59118341e-01 8.75074549e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 300.14169312 300.09432983 300.03829956 ..., 308.62796021 308.54443359 308.46087646] ----------------------- var 2 record 8 hdr offset: 48224 data offset: 54591488 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 6823936 79872 -32768 1 9 0 0 0 0 7031111 1 13120121 0 4 0 0 1] real hdr: [ 1.81000112e+03 8.03914038e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.61999988e+03 1.44999897e+03 8.23493502e-01 8.41211628e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 301.93203735 301.95907593 301.99206543 ..., 309.82623291 309.73471069 309.64379883] ----------------------- var 2 record 9 hdr offset: 48736 data offset: 55230464 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 6903808 79872 -32768 1 10 0 0 0 0 7031111 1 13276521 0 4 0 0 1] real hdr: [ 2.21000002e+03 7.63464495e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.99999844e+03 1.81000112e+03 7.84570542e-01 8.03914038e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 305.70913696 305.81484985 305.91943359 ..., 310.66659546 310.63900757 310.61181641] ----------------------- var 2 record 10 hdr offset: 49248 data offset: 55869440 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 6983680 79872 -32768 1 11 0 0 0 0 7031111 1 13432921 0 4 0 0 1] real hdr: [ 2.64999960e+03 7.20175811e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.42000161e+03 2.21000002e+03 7.42646223e-01 7.63464495e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 309.05859375 309.05078125 309.04977417 ..., 311.19277954 311.2255249 311.25814819] ----------------------- var 2 record 11 hdr offset: 49760 data offset: 56508416 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 7063552 79872 -32768 1 12 0 0 0 0 7031111 1 13589321 0 4 0 0 1] real hdr: [ 3.12999986e+03 6.74392534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.88000152e+03 2.64999960e+03 6.98050213e-01 7.20175811e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 310.24740601 310.25604248 310.26879883 ..., 311.88253784 311.90591431 311.92855835] ----------------------- var 2 record 12 hdr offset: 50272 data offset: 57147392 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 7143424 79872 -32768 1 13 0 0 0 0 7031111 1 13745721 0 4 0 0 1] real hdr: [ 3.65000079e+03 6.26490534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.37999819e+03 3.12999986e+03 6.51142688e-01 6.74392534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 312.02178955 312.02542114 312.03131104 ..., 313.46878052 313.5223999 313.57522583] ----------------------- var 2 record 13 hdr offset: 50784 data offset: 57786368 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 7223296 79872 -32768 1 14 0 0 0 0 7031111 1 13902121 0 4 0 0 1] real hdr: [ 4.20999847e+03 5.76877346e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.91999946e+03 3.65000079e+03 6.02314441e-01 6.26490534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 314.49276733 314.47366333 314.45477295 ..., 315.96749878 316.06591797 316.16345215] ----------------------- var 2 record 14 hdr offset: 51296 data offset: 58425344 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 7303168 79872 -32768 1 15 0 0 0 0 7031111 1 14058521 0 4 0 0 1] real hdr: [ 4.81000075e+03 5.25990788e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.50000140e+03 4.20999847e+03 5.51988701e-01 5.76877346e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 318.44772339 318.43386841 318.41824341 ..., 318.83911133 318.88522339 318.93145752] ----------------------- var 2 record 15 hdr offset: 51808 data offset: 59064320 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 7383040 79872 -32768 1 16 0 0 0 0 7031111 1 14214921 0 4 0 0 1] real hdr: [ 5.44999978e+03 4.74301366e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.12000009e+03 4.81000075e+03 5.00619965e-01 5.25990788e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 322.29580688 322.31143188 322.3269043 ..., 321.09909058 321.17675781 321.2555542 ] ----------------------- var 2 record 16 hdr offset: 52320 data offset: 59703296 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 7462912 79872 -32768 1 17 0 0 0 0 7031111 1 14371321 0 4 0 0 1] real hdr: [ 6.12999948e+03 4.22309896e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.77999946e+03 5.44999978e+03 4.48693382e-01 4.74301366e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 326.21536255 326.22998047 326.24795532 ..., 323.81292725 323.90762329 324.00201416] ----------------------- var 2 record 17 hdr offset: 52832 data offset: 60342272 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 7542784 79872 -32768 1 18 0 0 0 0 7031111 1 14527721 0 4 0 0 1] real hdr: [ 6.84999986e+03 3.70548863e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.47999950e+03 6.12999948e+03 3.96725773e-01 4.22309896e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 330.76730347 330.78649902 330.8057251 ..., 326.25698853 326.3059082 326.35598755] ----------------------- var 2 record 18 hdr offset: 53344 data offset: 60981248 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 7622656 79872 -32768 1 19 0 0 0 0 7031111 1 14684121 0 4 0 0 1] real hdr: [ 7.61000092e+03 3.19582071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.22000022e+03 6.84999986e+03 3.45265283e-01 3.70548863e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 334.94714355 334.95004272 334.95132446 ..., 328.98806763 329.02352905 329.05953979] ----------------------- var 2 record 19 hdr offset: 53856 data offset: 61620224 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 7702528 79872 -32768 1 20 0 0 0 0 7031111 1 14840521 0 4 0 0 1] real hdr: [ 8.40999873e+03 2.70004882e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00000162e+03 7.61000092e+03 2.94891378e-01 3.19582071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 336.34906006 336.347229 336.3460083 ..., 331.13861084 331.14425659 331.15093994] ----------------------- var 2 record 20 hdr offset: 54368 data offset: 62259200 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 7782400 79872 -32768 1 21 0 0 0 0 7031111 1 14996921 0 4 0 0 1] real hdr: [ 9.25000113e+03 2.22443261e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.81999976e+03 8.40999873e+03 2.46215071e-01 2.70004882e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 338.92510986 338.93182373 338.9336853 ..., 333.14154053 333.15612793 333.17050171] ----------------------- var 2 record 21 hdr offset: 54880 data offset: 62898176 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 7862272 79872 -32768 1 22 0 0 0 0 7031111 1 15153321 0 4 0 0 1] real hdr: [ 1.01300003e+04 1.77555424e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.67999858e+03 9.25000113e+03 1.99878209e-01 2.22443261e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 340.87686157 340.94146729 341.0072937 ..., 336.02590942 336.01699829 336.0062561 ] ----------------------- var 2 record 22 hdr offset: 55392 data offset: 63537152 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 7942144 79872 -32768 1 23 0 0 0 0 7031111 1 15309721 0 4 0 0 1] real hdr: [ 1.10500001e+04 1.36030234e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.05799981e+04 1.01300003e+04 1.56554224e-01 1.77555424e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 342.00595093 342.01974487 342.03405762 ..., 339.57171631 339.62521362 339.67834473] ----------------------- var 2 record 23 hdr offset: 55904 data offset: 64176128 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 8022016 79872 -32768 1 24 0 0 0 0 7031111 1 15466121 0 4 0 0 1] real hdr: [ 1.20100006e+04 9.85881076e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.15199982e+04 1.10500001e+04 1.16947874e-01 1.36030234e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 344.57180786 344.5586853 344.54779053 ..., 343.31506348 343.37207031 343.4296875 ] ----------------------- var 2 record 24 hdr offset: 56416 data offset: 64815104 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 8101888 79872 -32768 1 25 0 0 0 0 7031111 1 15622521 0 4 0 0 1] real hdr: [ 1.30100018e+04 6.59807861e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.24999991e+04 1.20100006e+04 8.17952369e-02 9.85881076e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 347.73416138 347.72650146 347.71844482 ..., 348.16079712 348.15335083 348.14663696] ----------------------- var 2 record 25 hdr offset: 56928 data offset: 65454080 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 8181760 79872 -32768 1 26 0 0 0 0 7031111 1 15778921 0 4 0 0 1] real hdr: [ 1.40504001e+04 3.89823900e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.35200006e+04 1.30100018e+04 5.18637157e-02 6.59807861e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 351.12255859 351.11431885 351.10650635 ..., 354.69061279 354.65820312 354.62545776] ----------------------- var 2 record 26 hdr offset: 57440 data offset: 66093056 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 8261632 79872 -32768 1 27 0 0 0 0 7031111 1 15935321 0 4 0 0 1] real hdr: [ 1.51377198e+04 1.83146873e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.45807997e+04 1.40504001e+04 2.79368177e-02 3.89823900e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 355.62509155 355.59378052 355.55905151 ..., 360.58157349 360.63522339 360.68890381] ----------------------- var 2 record 27 hdr offset: 57952 data offset: 66732032 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 8341504 79872 -32768 1 28 0 0 0 0 7031111 1 16091721 0 4 0 0 1] real hdr: [ 1.62849737e+04 4.87210933e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.56946399e+04 1.51377198e+04 1.07164793e-02 1.83146873e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 361.96655273 362.02056885 362.08209229 ..., 374.57620239 374.55270386 374.52883911] ----------------------- var 2 record 28 hdr offset: 58464 data offset: 67371008 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 8421376 79872 -32768 1 29 0 0 0 0 7031111 1 16248121 0 4 0 0 1] real hdr: [ 1.75069688e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.68753114e+04 1.62849737e+04 1.30179090e-03 4.87210933e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 382.84274292 382.76464844 382.72631836 ..., 394.8213501 394.75308228 394.68380737] ----------------------- var 2 record 29 hdr offset: 58976 data offset: 68009984 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 8501248 79872 -32768 1 30 0 0 0 0 7031111 1 16404521 0 4 0 0 1] real hdr: [ 1.88208202e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81386262e+04 1.75069688e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 421.14355469 421.2366333 421.28317261 ..., 424.0586853 423.91894531 423.78125 ] ----------------------- var 2 record 30 hdr offset: 59488 data offset: 68648960 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 8581120 79872 -32768 1 31 0 0 0 0 7031111 1 16560921 0 4 0 0 1] real hdr: [ 2.02465990e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.95030104e+04 1.88208202e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 461.02270508 460.81616211 460.61627197 ..., 460.31225586 460.37060547 460.42947388] ----------------------- var 2 record 31 hdr offset: 60000 data offset: 69287936 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 8660992 79872 -32768 1 32 0 0 0 0 7031111 1 16717321 0 4 0 0 1] real hdr: [ 2.18081366e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.09901876e+04 2.02465990e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 495.05432129 495.12130737 495.21176147 ..., 505.35684204 505.3677063 505.37689209] ----------------------- var 2 record 32 hdr offset: 60512 data offset: 69926912 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 8740864 79872 -32768 1 33 0 0 0 0 7031111 1 16873721 0 4 0 0 1] real hdr: [ 2.35421836e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.26260817e+04 2.18081366e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 551.85919189 551.97265625 552.07611084 ..., 556.90667725 556.85089111 556.79516602] ----------------------- var 2 record 33 hdr offset: 61024 data offset: 70565888 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 8820736 79872 -32768 1 34 0 0 0 0 7031111 1 17030121 0 4 0 0 1] real hdr: [ 2.55209609e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.44582854e+04 2.35421836e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 611.0447998 611.18457031 611.29815674 ..., 614.27410889 614.26422119 614.25512695] ----------------------- var 2 record 34 hdr offset: 61536 data offset: 71204864 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 8900608 79872 -32768 1 35 0 0 0 0 7031111 1 17186521 0 4 0 0 1] real hdr: [ 2.79013583e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.65836402e+04 2.55209609e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 675.62194824 675.24371338 674.87493896 ..., 682.77508545 682.82952881 682.88647461] ----------------------- var 2 record 35 hdr offset: 62048 data offset: 71843840 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 8980480 79872 -32768 1 36 0 0 0 0 7031111 1 17342921 0 4 0 0 1] real hdr: [ 3.10638886e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.92190802e+04 2.79013583e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 781.94042969 782.47692871 783.01379395 ..., 782.71575928 782.58319092 782.44726562] ----------------------- var 2 record 36 hdr offset: 62560 data offset: 72482816 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 9060352 79872 -32768 1 37 0 0 0 0 7031111 1 17499321 0 4 0 0 1] real hdr: [ 3.60817633e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.29086931e+04 3.10638886e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 943.62341309 943.68548584 943.74786377 ..., 932.54852295 932.64904785 932.75012207] ----------------------- var 2 record 37 hdr offset: 63072 data offset: 73121792 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 19 0 0 65 0 0 9140224 79872 -32768 1 38 0 0 0 0 7031111 1 17655721 0 4 0 0 1] real hdr: [ 4.24279038e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.92548336e+04 3.60817633e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1333.69848633 1333.32641602 1332.96508789 ..., 1298.50170898 1298.27355957 1298.0456543 ] ----------------------- =============================== var 3: nz = 4, nt = 1 var 3 record 0 hdr offset: 63584 data offset: 73760768 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 122 0 0 6 0 0 9220096 51200 -32768 191 1 0 0 0 0 7031111 1 17812121 0 9 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 3.9519031 3.91834974 4.61720133 ..., 14.82799244 14.82799244 14.82799244] ----------------------- var 3 record 1 hdr offset: 64096 data offset: 74170368 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 122 0 0 6 0 0 9271296 51200 -32768 191 2 0 0 0 0 7031111 1 17913836 0 9 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 22.8437767 22.52270699 24.25570107 ..., 37.07188797 37.07188797 37.07188797] ----------------------- var 3 record 2 hdr offset: 64608 data offset: 74579968 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 122 0 0 6 0 0 9322496 51200 -32768 191 3 0 0 0 0 7031111 1 18015551 0 9 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 85.87987518 85.36785889 87.04055023 ..., 96.38724518 96.38724518 96.38724518] ----------------------- var 3 record 3 hdr offset: 65120 data offset: 74989568 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 122 0 0 6 0 0 9373696 51200 -32768 191 4 0 0 0 0 7031111 1 18117266 0 9 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 352.980896 352.58425903 350.70077515 ..., 296.57617188 296.57617188 296.57617188] ----------------------- =============================== var 4: nz = 38, nt = 1 var 4 record 0 hdr offset: 65632 data offset: 75399168 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 9424896 79872 -32768 13 1 0 0 0 0 7031111 1 18218981 0 10 0 0 1] real hdr: [ 4.99988815e+01 9.94296273e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.00003377e+01 0.00000000e+00 9.97716462e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.01531784 0.01529938 0.01527745 ..., 0.01283094 0.01285407 0.012871 ] ----------------------- var 4 record 1 hdr offset: 66144 data offset: 76038144 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 9504768 79872 -32768 13 2 0 0 0 0 7031111 1 18375381 0 10 0 0 1] real hdr: [ 1.30000232e+02 9.85203885e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00013508e+01 4.99988815e+01 9.90881510e-01 9.94296273e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.01504947 0.01502802 0.01500229 ..., 0.01249647 0.01252538 0.01254792] ----------------------- var 4 record 2 hdr offset: 66656 data offset: 76677120 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 9584640 79872 -32768 13 3 0 0 0 0 7031111 1 18531781 0 10 0 0 1] real hdr: [ 2.49998333e+02 9.71644051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.79999114e+02 1.30000232e+02 9.79542572e-01 9.85203885e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.01495334 0.01492885 0.01489935 ..., 0.0123295 0.01235852 0.0123814 ] ----------------------- var 4 record 3 hdr offset: 67168 data offset: 77316096 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 9664512 79872 -32768 13 4 0 0 0 0 7031111 1 18688181 0 10 0 0 1] real hdr: [ 4.10001035e+02 9.53709855e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.20001478e+02 2.49998333e+02 9.63777064e-01 9.71644051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.0148615 0.01483517 0.01480333 ..., 0.00688178 0.00717135 0.00745894] ----------------------- var 4 record 4 hdr offset: 67680 data offset: 77955072 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 9744384 79872 -32768 13 5 0 0 0 0 7031111 1 18844581 0 10 0 0 1] real hdr: [ 6.10000486e+02 9.31527464e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.00000592e+02 4.10001035e+02 9.43695500e-01 9.53709855e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.01459916 0.01457434 0.01454616 ..., 0.00342907 0.00340898 0.00338505] ----------------------- var 4 record 5 hdr offset: 68192 data offset: 78594048 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 9824256 79872 -32768 13 6 0 0 0 0 7031111 1 19000981 0 10 0 0 1] real hdr: [ 8.50000613e+02 9.05253051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.20000381e+02 6.10000486e+02 9.19438386e-01 9.31527464e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.01233926 0.01233449 0.01232495 ..., 0.00455093 0.00439756 0.00424213] ----------------------- var 4 record 6 hdr offset: 68704 data offset: 79233024 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 9904128 79872 -32768 13 7 0 0 0 0 7031111 1 19157381 0 10 0 0 1] real hdr: [ 1.13000142e+03 8.75074549e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.80000846e+02 8.50000613e+02 8.91177995e-01 9.05253051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.01155234 0.01145738 0.01134611 ..., 0.00624686 0.00611956 0.00599151] ----------------------- var 4 record 7 hdr offset: 69216 data offset: 79872000 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 9984000 79872 -32768 13 8 0 0 0 0 7031111 1 19313781 0 10 0 0 1] real hdr: [ 1.44999897e+03 8.41211628e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.27999806e+03 1.13000142e+03 8.59118341e-01 8.75074549e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.01101692 0.01091149 0.01079121 ..., 0.00606743 0.0060388 0.00600919] ----------------------- var 4 record 8 hdr offset: 69728 data offset: 80510976 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 10063872 79872 -32768 13 9 0 0 0 0 7031111 1 19470181 0 10 0 0 1] real hdr: [ 1.81000112e+03 8.03914038e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.61999988e+03 1.44999897e+03 8.23493502e-01 8.41211628e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00929487 0.00909484 0.00885841 ..., 0.00527135 0.00519207 0.00511088] ----------------------- var 4 record 9 hdr offset: 70240 data offset: 81149952 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 10143744 79872 -32768 13 10 0 0 0 0 7031111 1 19626581 0 10 0 0 1] real hdr: [ 2.21000002e+03 7.63464495e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.99999844e+03 1.81000112e+03 7.84570542e-01 8.03914038e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.004836 0.00473817 0.00463706 ..., 0.00553135 0.00526548 0.0049986 ] ----------------------- var 4 record 10 hdr offset: 70752 data offset: 81788928 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 10223616 79872 -32768 13 11 0 0 0 0 7031111 1 19782981 0 10 0 0 1] real hdr: [ 2.64999960e+03 7.20175811e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.42000161e+03 2.21000002e+03 7.42646223e-01 7.63464495e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00351455 0.00349476 0.00347166 ..., 0.00611106 0.0059412 0.00577254] ----------------------- var 4 record 11 hdr offset: 71264 data offset: 82427904 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 10303488 79872 -32768 13 12 0 0 0 0 7031111 1 19939381 0 10 0 0 1] real hdr: [ 3.12999986e+03 6.74392534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.88000152e+03 2.64999960e+03 6.98050213e-01 7.20175811e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00322722 0.00318947 0.00314774 ..., 0.00537062 0.00544126 0.00551471] ----------------------- var 4 record 12 hdr offset: 71776 data offset: 83066880 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 10383360 79872 -32768 13 13 0 0 0 0 7031111 1 20095781 0 10 0 0 1] real hdr: [ 3.65000079e+03 6.26490534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.37999819e+03 3.12999986e+03 6.51142688e-01 6.74392534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00212499 0.0021015 0.00207758 ..., 0.00337384 0.00340422 0.00343615] ----------------------- var 4 record 13 hdr offset: 72288 data offset: 83705856 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 10463232 79872 -32768 13 14 0 0 0 0 7031111 1 20252181 0 10 0 0 1] real hdr: [ 4.20999847e+03 5.76877346e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.91999946e+03 3.65000079e+03 6.02314441e-01 6.26490534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.001803 0.00181257 0.00182334 ..., 0.00162378 0.00156393 0.00150527] ----------------------- var 4 record 14 hdr offset: 72800 data offset: 84344832 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 10543104 79872 -32768 13 15 0 0 0 0 7031111 1 20408581 0 10 0 0 1] real hdr: [ 4.81000075e+03 5.25990788e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.50000140e+03 4.20999847e+03 5.51988701e-01 5.76877346e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00097558 0.00097923 0.00098321 ..., 0.00111685 0.00110864 0.00110002] ----------------------- var 4 record 15 hdr offset: 73312 data offset: 84983808 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 10622976 79872 -32768 13 16 0 0 0 0 7031111 1 20564981 0 10 0 0 1] real hdr: [ 5.44999978e+03 4.74301366e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.12000009e+03 4.81000075e+03 5.00619965e-01 5.25990788e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00056475 0.0005631 0.00056206 ..., 0.00137282 0.00135421 0.00133379] ----------------------- var 4 record 16 hdr offset: 73824 data offset: 85622784 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 10702848 79872 -32768 13 17 0 0 0 0 7031111 1 20721381 0 10 0 0 1] real hdr: [ 6.12999948e+03 4.22309896e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.77999946e+03 5.44999978e+03 4.48693382e-01 4.74301366e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00033837 0.00033699 0.00033566 ..., 0.00107908 0.00101522 0.00095222] ----------------------- var 4 record 17 hdr offset: 74336 data offset: 86261760 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 10782720 79872 -32768 13 18 0 0 0 0 7031111 1 20877781 0 10 0 0 1] real hdr: [ 6.84999986e+03 3.70548863e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.47999950e+03 6.12999948e+03 3.96725773e-01 4.22309896e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00023609 0.00023526 0.00023426 ..., 0.00070432 0.00069595 0.00068745] ----------------------- var 4 record 18 hdr offset: 74848 data offset: 86900736 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 10862592 79872 -32768 13 19 0 0 0 0 7031111 1 21034181 0 10 0 0 1] real hdr: [ 7.61000092e+03 3.19582071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.22000022e+03 6.84999986e+03 3.45265283e-01 3.70548863e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00023343 0.00023141 0.00022892 ..., 0.00039471 0.00039252 0.00039034] ----------------------- var 4 record 19 hdr offset: 75360 data offset: 87539712 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 10942464 79872 -32768 13 20 0 0 0 0 7031111 1 21190581 0 10 0 0 1] real hdr: [ 8.40999873e+03 2.70004882e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00000162e+03 7.61000092e+03 2.94891378e-01 3.19582071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00018287 0.00018298 0.00018327 ..., 0.00028372 0.0002882 0.00029239] ----------------------- var 4 record 20 hdr offset: 75872 data offset: 88178688 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 11022336 79872 -32768 13 21 0 0 0 0 7031111 1 21346981 0 10 0 0 1] real hdr: [ 9.25000113e+03 2.22443261e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.81999976e+03 8.40999873e+03 2.46215071e-01 2.70004882e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00011557 0.00011543 0.00011616 ..., 0.00019767 0.00019291 0.00018818] ----------------------- var 4 record 21 hdr offset: 76384 data offset: 88817664 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 11102208 79872 -32768 13 22 0 0 0 0 7031111 1 21503381 0 10 0 0 1] real hdr: [ 1.01300003e+04 1.77555424e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.67999858e+03 9.25000113e+03 1.99878209e-01 2.22443261e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 9.50365866e-05 9.24517080e-05 8.96101265e-05 ..., 1.07228618e-04 1.04808896e-04 1.02469719e-04] ----------------------- var 4 record 22 hdr offset: 76896 data offset: 89456640 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 11182080 79872 -32768 13 23 0 0 0 0 7031111 1 21659781 0 10 0 0 1] real hdr: [ 1.10500001e+04 1.36030234e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.05799981e+04 1.01300003e+04 1.56554224e-01 1.77555424e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 8.07346660e-05 8.03818257e-05 7.99309128e-05 ..., 6.15587269e-05 5.96307000e-05 5.77137835e-05] ----------------------- var 4 record 23 hdr offset: 77408 data offset: 90095616 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 11261952 79872 -32768 13 24 0 0 0 0 7031111 1 21816181 0 10 0 0 1] real hdr: [ 1.20100006e+04 9.85881076e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.15199982e+04 1.10500001e+04 1.16947874e-01 1.36030234e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.10771354e-05 4.21180048e-05 4.31739099e-05 ..., 4.09067725e-05 4.03482081e-05 3.97821386e-05] ----------------------- var 4 record 24 hdr offset: 77920 data offset: 90734592 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 11341824 79872 -32768 13 25 0 0 0 0 7031111 1 21972581 0 10 0 0 1] real hdr: [ 1.30100018e+04 6.59807861e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.24999991e+04 1.20100006e+04 8.17952369e-02 9.85881076e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.57745762e-05 1.59221054e-05 1.61515309e-05 ..., 2.70048859e-05 2.71891568e-05 2.73629248e-05] ----------------------- var 4 record 25 hdr offset: 78432 data offset: 91373568 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 11421696 79872 -32768 13 26 0 0 0 0 7031111 1 22128981 0 10 0 0 1] real hdr: [ 1.40504001e+04 3.89823900e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.35200006e+04 1.30100018e+04 5.18637157e-02 6.59807861e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.36963481e-05 1.36330145e-05 1.35532728e-05 ..., 1.58521889e-05 1.60634900e-05 1.62848519e-05] ----------------------- var 4 record 26 hdr offset: 78944 data offset: 92012544 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 11501568 79872 -32768 13 27 0 0 0 0 7031111 1 22285381 0 10 0 0 1] real hdr: [ 1.51377198e+04 1.83146873e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.45807997e+04 1.40504001e+04 2.79368177e-02 3.89823900e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 6.26385508e-06 6.19976072e-06 6.14939654e-06 ..., 1.08502927e-05 1.10147139e-05 1.11766813e-05] ----------------------- var 4 record 27 hdr offset: 79456 data offset: 92651520 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 11581440 79872 -32768 13 28 0 0 0 0 7031111 1 22441781 0 10 0 0 1] real hdr: [ 1.62849737e+04 4.87210933e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.56946399e+04 1.51377198e+04 1.07164793e-02 1.83146873e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.21398045e-06 4.19906337e-06 4.18291393e-06 ..., 6.09169092e-06 6.02360433e-06 5.95555548e-06] ----------------------- var 4 record 28 hdr offset: 79968 data offset: 93290496 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 11661312 79872 -32768 13 29 0 0 0 0 7031111 1 22598181 0 10 0 0 1] real hdr: [ 1.75069688e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.68753114e+04 1.62849737e+04 1.30179090e-03 4.87210933e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.25665314e-06 3.25728092e-06 3.25842439e-06 ..., 3.34540323e-06 3.34684773e-06 3.34814240e-06] ----------------------- var 4 record 29 hdr offset: 80480 data offset: 93929472 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 11741184 79872 -32768 13 30 0 0 0 0 7031111 1 22754581 0 10 0 0 1] real hdr: [ 1.88208202e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81386262e+04 1.75069688e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.04788273e-06 3.04738796e-06 3.04744708e-06 ..., 3.28843271e-06 3.28858664e-06 3.28875626e-06] ----------------------- var 4 record 30 hdr offset: 80992 data offset: 94568448 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 11821056 79872 -32768 13 31 0 0 0 0 7031111 1 22910981 0 10 0 0 1] real hdr: [ 2.02465990e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.95030104e+04 1.88208202e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.52670156e-06 2.53035387e-06 2.53395592e-06 ..., 2.49999994e-06 2.49999994e-06 2.49999994e-06] ----------------------- var 4 record 31 hdr offset: 81504 data offset: 95207424 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 11900928 79872 -32768 13 32 0 0 0 0 7031111 1 23067381 0 10 0 0 1] real hdr: [ 2.18081366e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.09901876e+04 2.02465990e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.49999994e-06 2.49999994e-06 2.49999994e-06 ..., 2.49999994e-06 2.49999994e-06 2.49999994e-06] ----------------------- var 4 record 32 hdr offset: 82016 data offset: 95846400 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 11980800 79872 -32768 13 33 0 0 0 0 7031111 1 23223781 0 10 0 0 1] real hdr: [ 2.35421836e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.26260817e+04 2.18081366e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.49999994e-06 2.49999994e-06 2.49999994e-06 ..., 2.49999994e-06 2.49999994e-06 2.49999994e-06] ----------------------- var 4 record 33 hdr offset: 82528 data offset: 96485376 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 12060672 79872 -32768 13 34 0 0 0 0 7031111 1 23380181 0 10 0 0 1] real hdr: [ 2.55209609e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.44582854e+04 2.35421836e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.49999994e-06 2.49999994e-06 2.49999994e-06 ..., 2.49999994e-06 2.49999994e-06 2.49999994e-06] ----------------------- var 4 record 34 hdr offset: 83040 data offset: 97124352 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 12140544 79872 -32768 13 35 0 0 0 0 7031111 1 23536581 0 10 0 0 1] real hdr: [ 2.79013583e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.65836402e+04 2.55209609e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.49999994e-06 2.49999994e-06 2.49999994e-06 ..., 2.49999994e-06 2.49999994e-06 2.49999994e-06] ----------------------- var 4 record 35 hdr offset: 83552 data offset: 97763328 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 12220416 79872 -32768 13 36 0 0 0 0 7031111 1 23692981 0 10 0 0 1] real hdr: [ 3.10638886e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.92190802e+04 2.79013583e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.49999994e-06 2.49999994e-06 2.49999994e-06 ..., 2.49999994e-06 2.49999994e-06 2.49999994e-06] ----------------------- var 4 record 36 hdr offset: 84064 data offset: 98402304 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 12300288 79872 -32768 13 37 0 0 0 0 7031111 1 23849381 0 10 0 0 1] real hdr: [ 3.60817633e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.29086931e+04 3.10638886e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.49999994e-06 2.49999994e-06 2.49999994e-06 ..., 2.56581939e-06 2.56587259e-06 2.56591147e-06] ----------------------- var 4 record 37 hdr offset: 84576 data offset: 99041280 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 95 0 0 65 0 0 12380160 79872 -32768 13 38 0 0 0 0 7031111 1 24005781 0 10 0 0 1] real hdr: [ 4.24279038e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.92548336e+04 3.60817633e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.88359865e-06 2.88387605e-06 2.88441265e-06 ..., 2.83775285e-06 2.83834584e-06 2.83894110e-06] ----------------------- =============================== var 5: nz = 38, nt = 1 var 5 record 0 hdr offset: 85088 data offset: 99680256 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 12460032 79872 -32768 118 1 0 0 0 0 7031111 1 24162181 0 12 0 0 1] real hdr: [ 4.99988815e+01 9.94296273e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.00003377e+01 0.00000000e+00 9.97716462e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 1 hdr offset: 85600 data offset: 100319232 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 12539904 79872 -32768 118 2 0 0 0 0 7031111 1 24318581 0 12 0 0 1] real hdr: [ 1.30000232e+02 9.85203885e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00013508e+01 4.99988815e+01 9.90881510e-01 9.94296273e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 2 hdr offset: 86112 data offset: 100958208 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 12619776 79872 -32768 118 3 0 0 0 0 7031111 1 24474981 0 12 0 0 1] real hdr: [ 2.49998333e+02 9.71644051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.79999114e+02 1.30000232e+02 9.79542572e-01 9.85203885e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 3 hdr offset: 86624 data offset: 101597184 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 12699648 79872 -32768 118 4 0 0 0 0 7031111 1 24631381 0 12 0 0 1] real hdr: [ 4.10001035e+02 9.53709855e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.20001478e+02 2.49998333e+02 9.63777064e-01 9.71644051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 4 hdr offset: 87136 data offset: 102236160 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 12779520 79872 -32768 118 5 0 0 0 0 7031111 1 24787781 0 12 0 0 1] real hdr: [ 6.10000486e+02 9.31527464e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.00000592e+02 4.10001035e+02 9.43695500e-01 9.53709855e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 5 hdr offset: 87648 data offset: 102875136 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 12859392 79872 -32768 118 6 0 0 0 0 7031111 1 24944181 0 12 0 0 1] real hdr: [ 8.50000613e+02 9.05253051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.20000381e+02 6.10000486e+02 9.19438386e-01 9.31527464e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 6 hdr offset: 88160 data offset: 103514112 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 12939264 79872 -32768 118 7 0 0 0 0 7031111 1 25100581 0 12 0 0 1] real hdr: [ 1.13000142e+03 8.75074549e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.80000846e+02 8.50000613e+02 8.91177995e-01 9.05253051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 7 hdr offset: 88672 data offset: 104153088 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 13019136 79872 -32768 118 8 0 0 0 0 7031111 1 25256981 0 12 0 0 1] real hdr: [ 1.44999897e+03 8.41211628e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.27999806e+03 1.13000142e+03 8.59118341e-01 8.75074549e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 8 hdr offset: 89184 data offset: 104792064 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 13099008 79872 -32768 118 9 0 0 0 0 7031111 1 25413381 0 12 0 0 1] real hdr: [ 1.81000112e+03 8.03914038e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.61999988e+03 1.44999897e+03 8.23493502e-01 8.41211628e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 9 hdr offset: 89696 data offset: 105431040 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 13178880 79872 -32768 118 10 0 0 0 0 7031111 1 25569781 0 12 0 0 1] real hdr: [ 2.21000002e+03 7.63464495e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.99999844e+03 1.81000112e+03 7.84570542e-01 8.03914038e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 10 hdr offset: 90208 data offset: 106070016 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 13258752 79872 -32768 118 11 0 0 0 0 7031111 1 25726181 0 12 0 0 1] real hdr: [ 2.64999960e+03 7.20175811e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.42000161e+03 2.21000002e+03 7.42646223e-01 7.63464495e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 11 hdr offset: 90720 data offset: 106708992 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 13338624 79872 -32768 118 12 0 0 0 0 7031111 1 25882581 0 12 0 0 1] real hdr: [ 3.12999986e+03 6.74392534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.88000152e+03 2.64999960e+03 6.98050213e-01 7.20175811e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 12 hdr offset: 91232 data offset: 107347968 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 13418496 79872 -32768 118 13 0 0 0 0 7031111 1 26038981 0 12 0 0 1] real hdr: [ 3.65000079e+03 6.26490534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.37999819e+03 3.12999986e+03 6.51142688e-01 6.74392534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 13 hdr offset: 91744 data offset: 107986944 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 13498368 79872 -32768 118 14 0 0 0 0 7031111 1 26195381 0 12 0 0 1] real hdr: [ 4.20999847e+03 5.76877346e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.91999946e+03 3.65000079e+03 6.02314441e-01 6.26490534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 14 hdr offset: 92256 data offset: 108625920 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 13578240 79872 -32768 118 15 0 0 0 0 7031111 1 26351781 0 12 0 0 1] real hdr: [ 4.81000075e+03 5.25990788e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.50000140e+03 4.20999847e+03 5.51988701e-01 5.76877346e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 15 hdr offset: 92768 data offset: 109264896 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 13658112 79872 -32768 118 16 0 0 0 0 7031111 1 26508181 0 12 0 0 1] real hdr: [ 5.44999978e+03 4.74301366e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.12000009e+03 4.81000075e+03 5.00619965e-01 5.25990788e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 16 hdr offset: 93280 data offset: 109903872 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 13737984 79872 -32768 118 17 0 0 0 0 7031111 1 26664581 0 12 0 0 1] real hdr: [ 6.12999948e+03 4.22309896e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.77999946e+03 5.44999978e+03 4.48693382e-01 4.74301366e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 17 hdr offset: 93792 data offset: 110542848 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 13817856 79872 -32768 118 18 0 0 0 0 7031111 1 26820981 0 12 0 0 1] real hdr: [ 6.84999986e+03 3.70548863e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.47999950e+03 6.12999948e+03 3.96725773e-01 4.22309896e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 18 hdr offset: 94304 data offset: 111181824 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 13897728 79872 -32768 118 19 0 0 0 0 7031111 1 26977381 0 12 0 0 1] real hdr: [ 7.61000092e+03 3.19582071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.22000022e+03 6.84999986e+03 3.45265283e-01 3.70548863e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 19 hdr offset: 94816 data offset: 111820800 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 13977600 79872 -32768 118 20 0 0 0 0 7031111 1 27133781 0 12 0 0 1] real hdr: [ 8.40999873e+03 2.70004882e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00000162e+03 7.61000092e+03 2.94891378e-01 3.19582071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 20 hdr offset: 95328 data offset: 112459776 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 14057472 79872 -32768 118 21 0 0 0 0 7031111 1 27290181 0 12 0 0 1] real hdr: [ 9.25000113e+03 2.22443261e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.81999976e+03 8.40999873e+03 2.46215071e-01 2.70004882e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 21 hdr offset: 95840 data offset: 113098752 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 14137344 79872 -32768 118 22 0 0 0 0 7031111 1 27446581 0 12 0 0 1] real hdr: [ 1.01300003e+04 1.77555424e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.67999858e+03 9.25000113e+03 1.99878209e-01 2.22443261e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 22 hdr offset: 96352 data offset: 113737728 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 14217216 79872 -32768 118 23 0 0 0 0 7031111 1 27602981 0 12 0 0 1] real hdr: [ 1.10500001e+04 1.36030234e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.05799981e+04 1.01300003e+04 1.56554224e-01 1.77555424e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 23 hdr offset: 96864 data offset: 114376704 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 14297088 79872 -32768 118 24 0 0 0 0 7031111 1 27759381 0 12 0 0 1] real hdr: [ 1.20100006e+04 9.85881076e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.15199982e+04 1.10500001e+04 1.16947874e-01 1.36030234e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 24 hdr offset: 97376 data offset: 115015680 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 14376960 79872 -32768 118 25 0 0 0 0 7031111 1 27915781 0 12 0 0 1] real hdr: [ 1.30100018e+04 6.59807861e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.24999991e+04 1.20100006e+04 8.17952369e-02 9.85881076e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 25 hdr offset: 97888 data offset: 115654656 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 14456832 79872 -32768 118 26 0 0 0 0 7031111 1 28072181 0 12 0 0 1] real hdr: [ 1.40504001e+04 3.89823900e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.35200006e+04 1.30100018e+04 5.18637157e-02 6.59807861e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 26 hdr offset: 98400 data offset: 116293632 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 14536704 79872 -32768 118 27 0 0 0 0 7031111 1 28228581 0 12 0 0 1] real hdr: [ 1.51377198e+04 1.83146873e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.45807997e+04 1.40504001e+04 2.79368177e-02 3.89823900e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 27 hdr offset: 98912 data offset: 116932608 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 14616576 79872 -32768 118 28 0 0 0 0 7031111 1 28384981 0 12 0 0 1] real hdr: [ 1.62849737e+04 4.87210933e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.56946399e+04 1.51377198e+04 1.07164793e-02 1.83146873e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 28 hdr offset: 99424 data offset: 117571584 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 14696448 79872 -32768 118 29 0 0 0 0 7031111 1 28541381 0 12 0 0 1] real hdr: [ 1.75069688e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.68753114e+04 1.62849737e+04 1.30179090e-03 4.87210933e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 29 hdr offset: 99936 data offset: 118210560 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 14776320 79872 -32768 118 30 0 0 0 0 7031111 1 28697781 0 12 0 0 1] real hdr: [ 1.88208202e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81386262e+04 1.75069688e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 30 hdr offset: 100448 data offset: 118849536 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 14856192 79872 -32768 118 31 0 0 0 0 7031111 1 28854181 0 12 0 0 1] real hdr: [ 2.02465990e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.95030104e+04 1.88208202e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 31 hdr offset: 100960 data offset: 119488512 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 14936064 79872 -32768 118 32 0 0 0 0 7031111 1 29010581 0 12 0 0 1] real hdr: [ 2.18081366e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.09901876e+04 2.02465990e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 32 hdr offset: 101472 data offset: 120127488 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 15015936 79872 -32768 118 33 0 0 0 0 7031111 1 29166981 0 12 0 0 1] real hdr: [ 2.35421836e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.26260817e+04 2.18081366e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 33 hdr offset: 101984 data offset: 120766464 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 15095808 79872 -32768 118 34 0 0 0 0 7031111 1 29323381 0 12 0 0 1] real hdr: [ 2.55209609e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.44582854e+04 2.35421836e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 34 hdr offset: 102496 data offset: 121405440 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 15175680 79872 -32768 118 35 0 0 0 0 7031111 1 29479781 0 12 0 0 1] real hdr: [ 2.79013583e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.65836402e+04 2.55209609e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 35 hdr offset: 103008 data offset: 122044416 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 15255552 79872 -32768 118 36 0 0 0 0 7031111 1 29636181 0 12 0 0 1] real hdr: [ 3.10638886e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.92190802e+04 2.79013583e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 36 hdr offset: 103520 data offset: 122683392 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 15335424 79872 -32768 118 37 0 0 0 0 7031111 1 29792581 0 12 0 0 1] real hdr: [ 3.60817633e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.29086931e+04 3.10638886e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 5 record 37 hdr offset: 104032 data offset: 123322368 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 78 0 0 65 0 0 15415296 79872 -32768 118 38 0 0 0 0 7031111 1 29948981 0 12 0 0 1] real hdr: [ 4.24279038e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.92548336e+04 3.60817633e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 6: nz = 1, nt = 1 var 6 record 0 hdr offset: 104544 data offset: 123961344 disk length: 156400 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 0 2 222 0 0 143 0 0 15495168 157696 -32768 84 8888 0 0 0 0 7031111 2 30105381 0 14 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = integer nwords = 156400 data: [6 6 6 ..., 0 0 0] ----------------------- =============================== var 7: nz = 1, nt = 1 var 7 record 0 hdr offset: 105056 data offset: 125222912 disk length: 156400 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 0 2 223 0 0 142 0 0 15652864 157696 -32768 85 8888 0 0 0 0 7031111 2 30261781 0 15 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = integer nwords = 156400 data: [11 11 11 ..., 0 0 0] ----------------------- =============================== var 8: nz = 1, nt = 1 var 8 record 0 hdr offset: 105568 data offset: 126484480 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 219 0 0 0 0 0 15810560 79872 -32768 0 0 0 0 0 0 7031111 1 30418181 0 16 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.01563811 2.00422597 1.99102247 ..., 0. 0. 0. ] ----------------------- =============================== var 9: nz = 1, nt = 1 var 9 record 0 hdr offset: 106080 data offset: 127123456 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 174 0 0 129 0 0 15890432 51200 -32768 209 9999 0 0 0 0 7031111 1 30574581 0 17 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0.00111205 0.00110564 0.00135073 ..., 0.01207388 0.01261927 0.01394327] ----------------------- =============================== var 10: nz = 1, nt = 1 var 10 record 0 hdr offset: 106592 data offset: 127533056 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 175 0 0 129 0 0 15941632 51200 -32768 210 9999 0 0 0 0 7031111 1 30676296 0 18 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 2.96103525 3.46371579 4.35146761 ..., 20.83335495 21.65997696 22.67864227] ----------------------- =============================== var 11: nz = 4, nt = 1 var 11 record 0 hdr offset: 107104 data offset: 127942656 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 23 0 0 6 0 0 15992832 51200 -32768 190 1 0 0 0 0 7031111 1 30778011 0 20 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 296.18533325 296.02987671 295.9329834 ..., 299.64749146 299.62313843 299.56283569] ----------------------- var 11 record 1 hdr offset: 107616 data offset: 128352256 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 23 0 0 6 0 0 16044032 51200 -32768 190 2 0 0 0 0 7031111 1 30879726 0 20 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 297.57022095 297.49630737 297.33023071 ..., 302.296875 302.17019653 302.37954712] ----------------------- var 11 record 2 hdr offset: 108128 data offset: 128761856 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 23 0 0 6 0 0 16095232 51200 -32768 190 3 0 0 0 0 7031111 1 30981441 0 20 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 297.30004883 297.24206543 297.12115479 ..., 300.01031494 300.06848145 300.29870605] ----------------------- var 11 record 3 hdr offset: 108640 data offset: 129171456 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 23 0 0 6 0 0 16146432 51200 -32768 190 4 0 0 0 0 7031111 1 31083156 0 20 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 297.27554321 297.26040649 297.22128296 ..., 298.44567871 298.46594238 298.53121948] ----------------------- =============================== var 12: nz = 1, nt = 1 var 12 record 0 hdr offset: 109152 data offset: 129581056 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 271 0 0 275 0 0 16197632 51200 -32768 0 0 0 0 0 0 7031111 1 31184871 0 22 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 5.06077249e-14 1.13560914e-13 2.32368486e-13 ..., 0.00000000e+00 0.00000000e+00 0.00000000e+00] ----------------------- =============================== var 13: nz = 1, nt = 1 var 13 record 0 hdr offset: 109664 data offset: 129990656 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 93 0 0 129 0 0 16248832 79872 -32768 121 9999 0 0 0 0 7031111 1 31286586 0 23 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 14: nz = 1, nt = 1 var 14 record 0 hdr offset: 110176 data offset: 130629632 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 16 0 0 129 0 0 16328704 79872 -32768 18 9999 0 0 0 0 7031111 1 31442986 0 24 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 299.1628418 299.1427002 299.12347412 ..., 298.43670654 298.4543457 298.47253418] ----------------------- =============================== var 15: nz = 1, nt = 1 var 15 record 0 hdr offset: 110688 data offset: 131268608 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 5 0 0 5 0 0 16408576 79872 -32768 17 8888 0 0 0 0 7031111 1 31599386 0 25 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 610.00048828 610.00048828 610.00048828 ..., 367.1461792 369.13787842 371.19241333] ----------------------- =============================== var 16: nz = 1, nt = 1 var 16 record 0 hdr offset: 111200 data offset: 131907584 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 324 0 0 129 0 0 16488448 79872 -32768 170 9999 0 0 0 0 7031111 1 31755786 0 26 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.14335261e-04 2.14537315e-04 2.14445012e-04 ..., 4.63635988e-05 4.76836685e-05 4.93700427e-05] ----------------------- =============================== var 17: nz = 1, nt = 1 var 17 record 0 hdr offset: 111712 data offset: 132546560 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 701 0 0 129 0 0 16568320 79872 -32768 0 0 0 0 0 0 7031111 1 31912186 0 28 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 18: nz = 1, nt = 1 var 18 record 0 hdr offset: 112224 data offset: 133185536 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 702 0 0 129 0 0 16648192 79872 -32768 0 0 0 0 0 0 7031111 1 32068586 0 29 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 19: nz = 1, nt = 1 var 19 record 0 hdr offset: 112736 data offset: 133824512 disk length: 156400 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 0 2 395 0 0 129 0 0 16728064 157696 -32768 74 9999 0 0 0 0 7031111 3 32224526 0 30 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = integer nwords = 156400 data: [0 0 0 ..., 0 0 0] ----------------------- =============================== var 20: nz = 1, nt = 1 var 20 record 0 hdr offset: 113248 data offset: 135086080 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 37 0 0 129 0 0 16885760 79872 -32768 134 9999 0 0 0 0 7031111 1 32380926 0 31 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 21: nz = 1, nt = 1 var 21 record 0 hdr offset: 113760 data offset: 135725056 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 687 0 0 129 0 0 16965632 79872 -32768 0 0 0 0 0 0 7031111 1 32537326 0 32 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 22: nz = 1, nt = 1 var 22 record 0 hdr offset: 114272 data offset: 136364032 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1 0 0 129 0 0 17045504 79872 -32768 73 9999 0 0 0 0 7031111 1 32693726 0 33 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 23: nz = 1, nt = 1 var 23 record 0 hdr offset: 114784 data offset: 137003008 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 150 0 0 129 0 0 17125376 51200 -32768 0 0 0 0 0 0 7031111 1 32850126 0 34 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 14.72035313 20.94667435 14.45421696 ..., 144.68081665 161.23086548 102.96192932] ----------------------- =============================== var 24: nz = 1, nt = 1 var 24 record 0 hdr offset: 115296 data offset: 137412608 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 152 0 0 129 0 0 17176576 51200 -32768 0 0 0 0 0 0 7031111 1 32951841 0 35 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 9.09887603e-07 1.02330182e-06 4.21313462e-06 ..., 4.83336044e-05 1.47803148e-05 4.24878963e-05] ----------------------- =============================== var 25: nz = 1, nt = 1 var 25 record 0 hdr offset: 115808 data offset: 137822208 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 153 0 0 129 0 0 17227776 51200 -32768 0 0 0 0 0 0 7031111 1 33053556 0 36 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 1.86546879e-06 2.15547834e-06 -3.73652824e-06 ..., -5.01888753e-05 -2.57999891e-05 2.88022147e-05] ----------------------- =============================== var 26: nz = 1, nt = 1 var 26 record 0 hdr offset: 116320 data offset: 138231808 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 154 0 0 129 0 0 17278976 51200 -32768 0 0 0 0 0 0 7031111 1 33155271 0 37 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 7.86788314e-06 8.74451962e-06 1.28610181e-05 ..., 1.94381952e-04 1.58183102e-04 9.80764526e-05] ----------------------- =============================== var 27: nz = 1, nt = 1 var 27 record 0 hdr offset: 116832 data offset: 138641408 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 329 0 0 129 0 0 17330176 51200 -32768 0 0 0 0 0 0 7031111 1 33256986 0 40 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0.04050449 0.04050449 0.04050449 ..., 0.14828809 0.14828809 0.14828809] ----------------------- =============================== var 28: nz = 1, nt = 1 var 28 record 0 hdr offset: 117344 data offset: 139051008 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 330 0 0 129 0 0 17381376 51200 -32768 0 0 0 0 0 0 7031111 1 33358701 0 41 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0.11606015 0.11606015 0.11606015 ..., 0.27060732 0.27060732 0.27060732] ----------------------- =============================== var 29: nz = 1, nt = 1 var 29 record 0 hdr offset: 117856 data offset: 139460608 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 332 0 0 129 0 0 17432576 51200 -32768 0 0 0 0 0 0 7031111 1 33460416 0 43 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0.372899 0.372899 0.372899 ..., 0.427854 0.427854 0.427854] ----------------------- =============================== var 30: nz = 1, nt = 1 var 30 record 0 hdr offset: 118368 data offset: 139870208 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 333 0 0 129 0 0 17483776 51200 -32768 0 0 0 0 0 0 7031111 1 33562131 0 44 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0.02359283 0.02359283 0.02359283 ..., 0.00531349 0.00531349 0.00531349] ----------------------- =============================== var 31: nz = 1, nt = 1 var 31 record 0 hdr offset: 118880 data offset: 140279808 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 335 0 0 129 0 0 17534976 51200 -32768 0 0 0 0 0 0 7031111 1 33663846 0 46 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 1217830.125 1217830.125 1217830.125 ..., 1111107.5 1111107.5 1111107.5 ] ----------------------- =============================== var 32: nz = 1, nt = 1 var 32 record 0 hdr offset: 119392 data offset: 140689408 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 336 0 0 129 0 0 17586176 51200 -32768 0 0 0 0 0 0 7031111 1 33765561 0 47 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0.2674517 0.2674517 0.2674517 ..., 0.22088082 0.22088082 0.22088082] ----------------------- =============================== var 33: nz = 1, nt = 1 var 33 record 0 hdr offset: 119904 data offset: 141099008 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 342 0 0 129 0 0 17637376 51200 -32768 0 0 0 0 0 0 7031111 1 33867276 0 48 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0.04886636 0.04886636 0.04886636 ..., 0.18384846 0.18384846 0.18384846] ----------------------- =============================== var 34: nz = 1, nt = 1 var 34 record 0 hdr offset: 120416 data offset: 141508608 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 209 0 0 129 0 0 17688576 79872 -32768 0 0 0 0 0 0 7031111 1 33968991 0 49 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 271.3500061 271.3500061 271.3500061 ..., 271.3500061 271.3500061 271.3500061] ----------------------- =============================== var 35: nz = 24, nt = 1 var 35 record 0 hdr offset: 120928 data offset: 142147584 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 453 0 0 65 0 0 17768448 79872 -32768 0 1 0 0 0 0 7031111 1 34125391 0 60 0 0 1] real hdr: [ 4.81000075e+03 5.25990788e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.50000140e+03 4.20999847e+03 5.51988701e-01 5.76877346e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 9.23216206e-08 9.23567569e-08 9.23918435e-08 ..., 1.19239900e-07 1.19212487e-07 1.19185103e-07] ----------------------- var 35 record 1 hdr offset: 121440 data offset: 142786560 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 453 0 0 65 0 0 17848320 79872 -32768 0 2 0 0 0 0 7031111 1 34281791 0 60 0 0 1] real hdr: [ 5.44999978e+03 4.74301366e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.12000009e+03 4.81000075e+03 5.00619965e-01 5.25990788e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 9.34833366e-08 9.35185653e-08 9.35537443e-08 ..., 1.30796863e-07 1.30767049e-07 1.30737277e-07] ----------------------- var 35 record 2 hdr offset: 121952 data offset: 143425536 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 453 0 0 65 0 0 17928192 79872 -32768 0 3 0 0 0 0 7031111 1 34438191 0 60 0 0 1] real hdr: [ 6.12999948e+03 4.22309896e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.77999946e+03 5.44999978e+03 4.48693382e-01 4.74301366e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 9.51369330e-08 9.51730499e-08 9.52091241e-08 ..., 1.42370254e-07 1.42337910e-07 1.42305609e-07] ----------------------- var 35 record 3 hdr offset: 122464 data offset: 144064512 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 453 0 0 65 0 0 18008064 79872 -32768 0 4 0 0 0 0 7031111 1 34594591 0 60 0 0 1] real hdr: [ 6.84999986e+03 3.70548863e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.47999950e+03 6.12999948e+03 3.96725773e-01 4.22309896e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 9.73657706e-08 9.74032446e-08 9.74406689e-08 ..., 1.53306999e-07 1.53272012e-07 1.53237082e-07] ----------------------- var 35 record 4 hdr offset: 122976 data offset: 144703488 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 453 0 0 65 0 0 18087936 79872 -32768 0 5 0 0 0 0 7031111 1 34750991 0 60 0 0 1] real hdr: [ 7.61000092e+03 3.19582071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.22000022e+03 6.84999986e+03 3.45265283e-01 3.70548863e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.00182064e-07 1.00220547e-07 1.00258987e-07 ..., 1.62532913e-07 1.62495212e-07 1.62457582e-07] ----------------------- var 35 record 5 hdr offset: 123488 data offset: 145342464 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 453 0 0 65 0 0 18167808 79872 -32768 0 6 0 0 0 0 7031111 1 34907391 0 60 0 0 1] real hdr: [ 8.40999873e+03 2.70004882e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00000162e+03 7.61000092e+03 2.94891378e-01 3.19582071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.04726709e-07 1.04766670e-07 1.04806588e-07 ..., 1.71463213e-07 1.71423224e-07 1.71383306e-07] ----------------------- var 35 record 6 hdr offset: 124000 data offset: 145981440 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 453 0 0 65 0 0 18247680 79872 -32768 0 7 0 0 0 0 7031111 1 35063791 0 60 0 0 1] real hdr: [ 9.25000113e+03 2.22443261e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.81999976e+03 8.40999873e+03 2.46215071e-01 2.70004882e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.13193138e-07 1.13236695e-07 1.13280208e-07 ..., 1.82963674e-07 1.82922747e-07 1.82881877e-07] ----------------------- var 35 record 7 hdr offset: 124512 data offset: 146620416 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 453 0 0 65 0 0 18327552 79872 -32768 0 8 0 0 0 0 7031111 1 35220191 0 60 0 0 1] real hdr: [ 1.01300003e+04 1.77555424e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.67999858e+03 9.25000113e+03 1.99878209e-01 2.22443261e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.18159001e-07 1.18204731e-07 1.18250398e-07 ..., 1.88589354e-07 1.88547787e-07 1.88506306e-07] ----------------------- var 35 record 8 hdr offset: 125024 data offset: 147259392 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 453 0 0 65 0 0 18407424 79872 -32768 0 9 0 0 0 0 7031111 1 35376591 0 60 0 0 1] real hdr: [ 1.10500001e+04 1.36030234e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.05799981e+04 1.01300003e+04 1.56554224e-01 1.77555424e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.06865684e-07 1.06905937e-07 1.06946125e-07 ..., 1.73707306e-07 1.73663565e-07 1.73619895e-07] ----------------------- var 35 record 9 hdr offset: 125536 data offset: 147898368 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 453 0 0 65 0 0 18487296 79872 -32768 0 10 0 0 0 0 7031111 1 35532991 0 60 0 0 1] real hdr: [ 1.20100006e+04 9.85881076e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.15199982e+04 1.10500001e+04 1.16947874e-01 1.36030234e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.13151764e-07 1.13194268e-07 1.13236716e-07 ..., 1.82527657e-07 1.82482509e-07 1.82437418e-07] ----------------------- var 35 record 10 hdr offset: 126048 data offset: 148537344 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 453 0 0 65 0 0 18567168 79872 -32768 0 11 0 0 0 0 7031111 1 35689391 0 60 0 0 1] real hdr: [ 1.30100018e+04 6.59807861e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.24999991e+04 1.20100006e+04 8.17952369e-02 9.85881076e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.78435712e-07 1.78506923e-07 1.78578077e-07 ..., 2.70160399e-07 2.70116487e-07 2.70072633e-07] ----------------------- var 35 record 11 hdr offset: 126560 data offset: 149176320 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 453 0 0 65 0 0 18647040 79872 -32768 0 12 0 0 0 0 7031111 1 35845791 0 60 0 0 1] real hdr: [ 1.40504001e+04 3.89823900e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.35200006e+04 1.30100018e+04 5.18637157e-02 6.59807861e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.26973000e-07 2.27060553e-07 2.27148021e-07 ..., 3.77397271e-07 3.77319054e-07 3.77240951e-07] ----------------------- var 35 record 12 hdr offset: 127072 data offset: 149815296 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 453 0 0 65 0 0 18726912 79872 -32768 0 13 0 0 0 0 7031111 1 36002191 0 60 0 0 1] real hdr: [ 1.51377198e+04 1.83146873e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.45807997e+04 1.40504001e+04 2.79368177e-02 3.89823900e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.06246597e-07 2.06304776e-07 2.06362714e-07 ..., 4.62831252e-07 4.62647563e-07 4.62464044e-07] ----------------------- var 35 record 13 hdr offset: 127584 data offset: 150454272 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 453 0 0 65 0 0 18806784 79872 -32768 0 14 0 0 0 0 7031111 1 36158591 0 60 0 0 1] real hdr: [ 1.62849737e+04 4.87210933e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.56946399e+04 1.51377198e+04 1.07164793e-02 1.83146873e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.38081037e-07 3.38072084e-07 3.38062875e-07 ..., 7.17457908e-07 7.17043406e-07 7.16629017e-07] ----------------------- var 35 record 14 hdr offset: 128096 data offset: 151093248 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 453 0 0 65 0 0 18886656 79872 -32768 0 15 0 0 0 0 7031111 1 36314991 0 60 0 0 1] real hdr: [ 1.75069688e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.68753114e+04 1.62849737e+04 1.30179090e-03 4.87210933e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 7.18750755e-07 7.18664808e-07 7.18579145e-07 ..., 1.21045252e-06 1.20970446e-06 1.20895641e-06] ----------------------- var 35 record 15 hdr offset: 128608 data offset: 151732224 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 453 0 0 65 0 0 18966528 79872 -32768 0 16 0 0 0 0 7031111 1 36471391 0 60 0 0 1] real hdr: [ 1.88208202e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81386262e+04 1.75069688e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.16134163e-06 1.16130457e-06 1.16126967e-06 ..., 1.70539749e-06 1.70452574e-06 1.70365377e-06] ----------------------- var 35 record 16 hdr offset: 129120 data offset: 152371200 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 453 0 0 65 0 0 19046400 79872 -32768 0 17 0 0 0 0 7031111 1 36627791 0 60 0 0 1] real hdr: [ 2.02465990e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.95030104e+04 1.88208202e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.10210715e-06 2.10227017e-06 2.10243707e-06 ..., 2.55965438e-06 2.55888563e-06 2.55811597e-06] ----------------------- var 35 record 17 hdr offset: 129632 data offset: 153010176 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 453 0 0 65 0 0 19126272 79872 -32768 0 18 0 0 0 0 7031111 1 36784191 0 60 0 0 1] real hdr: [ 2.18081366e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.09901876e+04 2.02465990e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.40611166e-06 4.40655776e-06 4.40700796e-06 ..., 4.52862469e-06 4.52805398e-06 4.52748191e-06] ----------------------- var 35 record 18 hdr offset: 130144 data offset: 153649152 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 453 0 0 65 0 0 19206144 79872 -32768 0 19 0 0 0 0 7031111 1 36940591 0 60 0 0 1] real hdr: [ 2.35421836e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.26260817e+04 2.18081366e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 7.53074801e-06 7.53129689e-06 7.53184804e-06 ..., 7.15634224e-06 7.15614215e-06 7.15593978e-06] ----------------------- var 35 record 19 hdr offset: 130656 data offset: 154288128 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 453 0 0 65 0 0 19286016 79872 -32768 0 20 0 0 0 0 7031111 1 37096991 0 60 0 0 1] real hdr: [ 2.55209609e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.44582854e+04 2.35421836e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.04654464e-05 1.04659230e-05 1.04663959e-05 ..., 9.71344070e-06 9.71326153e-06 9.71308145e-06] ----------------------- var 35 record 20 hdr offset: 131168 data offset: 154927104 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 453 0 0 65 0 0 19365888 79872 -32768 0 21 0 0 0 0 7031111 1 37253391 0 60 0 0 1] real hdr: [ 2.79013583e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.65836402e+04 2.55209609e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.27358944e-05 1.27362091e-05 1.27365138e-05 ..., 1.18550361e-05 1.18542848e-05 1.18535354e-05] ----------------------- var 35 record 21 hdr offset: 131680 data offset: 155566080 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 453 0 0 65 0 0 19445760 79872 -32768 0 22 0 0 0 0 7031111 1 37409791 0 60 0 0 1] real hdr: [ 3.10638886e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.92190802e+04 2.79013583e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.44025262e-05 1.44022824e-05 1.44020323e-05 ..., 1.35172213e-05 1.35161345e-05 1.35150503e-05] ----------------------- var 35 record 22 hdr offset: 132192 data offset: 156205056 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 453 0 0 65 0 0 19525632 79872 -32768 0 23 0 0 0 0 7031111 1 37566191 0 60 0 0 1] real hdr: [ 3.60817633e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.29086931e+04 3.10638886e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.39634494e-05 1.39626281e-05 1.39618132e-05 ..., 1.35136743e-05 1.35130895e-05 1.35125092e-05] ----------------------- var 35 record 23 hdr offset: 132704 data offset: 156844032 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 453 0 0 65 0 0 19605504 79872 -32768 0 24 0 0 0 0 7031111 1 37722591 0 60 0 0 1] real hdr: [ 4.24279038e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.92548336e+04 3.60817633e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 6.42766190e-06 6.42739997e-06 6.42713803e-06 ..., 6.70056670e-06 6.70059035e-06 6.70061218e-06] ----------------------- =============================== var 36: nz = 39, nt = 1 var 36 record 0 hdr offset: 133216 data offset: 157483008 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 19685376 79872 -32768 324 9999 0 0 0 0 7031111 1 37878991 0 150 0 0 1] real hdr: [ 9.99820611e+00 9.98858129e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 1 hdr offset: 133728 data offset: 158121984 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 19765248 79872 -32768 324 1 0 0 0 0 7031111 1 38035391 0 150 0 0 1] real hdr: [ 4.99988815e+01 9.94296273e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.00003377e+01 0.00000000e+00 9.97716462e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 2 hdr offset: 134240 data offset: 158760960 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 19845120 79872 -32768 324 2 0 0 0 0 7031111 1 38191791 0 150 0 0 1] real hdr: [ 1.30000232e+02 9.85203885e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00013508e+01 4.99988815e+01 9.90881510e-01 9.94296273e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 3 hdr offset: 134752 data offset: 159399936 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 19924992 79872 -32768 324 3 0 0 0 0 7031111 1 38348191 0 150 0 0 1] real hdr: [ 2.49998333e+02 9.71644051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.79999114e+02 1.30000232e+02 9.79542572e-01 9.85203885e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 4 hdr offset: 135264 data offset: 160038912 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 20004864 79872 -32768 324 4 0 0 0 0 7031111 1 38504591 0 150 0 0 1] real hdr: [ 4.10001035e+02 9.53709855e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.20001478e+02 2.49998333e+02 9.63777064e-01 9.71644051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 5 hdr offset: 135776 data offset: 160677888 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 20084736 79872 -32768 324 5 0 0 0 0 7031111 1 38660991 0 150 0 0 1] real hdr: [ 6.10000486e+02 9.31527464e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.00000592e+02 4.10001035e+02 9.43695500e-01 9.53709855e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 6 hdr offset: 136288 data offset: 161316864 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 20164608 79872 -32768 324 6 0 0 0 0 7031111 1 38817391 0 150 0 0 1] real hdr: [ 8.50000613e+02 9.05253051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.20000381e+02 6.10000486e+02 9.19438386e-01 9.31527464e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 7 hdr offset: 136800 data offset: 161955840 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 20244480 79872 -32768 324 7 0 0 0 0 7031111 1 38973791 0 150 0 0 1] real hdr: [ 1.13000142e+03 8.75074549e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.80000846e+02 8.50000613e+02 8.91177995e-01 9.05253051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 8 hdr offset: 137312 data offset: 162594816 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 20324352 79872 -32768 324 8 0 0 0 0 7031111 1 39130191 0 150 0 0 1] real hdr: [ 1.44999897e+03 8.41211628e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.27999806e+03 1.13000142e+03 8.59118341e-01 8.75074549e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 9 hdr offset: 137824 data offset: 163233792 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 20404224 79872 -32768 324 9 0 0 0 0 7031111 1 39286591 0 150 0 0 1] real hdr: [ 1.81000112e+03 8.03914038e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.61999988e+03 1.44999897e+03 8.23493502e-01 8.41211628e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 10 hdr offset: 138336 data offset: 163872768 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 20484096 79872 -32768 324 10 0 0 0 0 7031111 1 39442991 0 150 0 0 1] real hdr: [ 2.21000002e+03 7.63464495e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.99999844e+03 1.81000112e+03 7.84570542e-01 8.03914038e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 11 hdr offset: 138848 data offset: 164511744 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 20563968 79872 -32768 324 11 0 0 0 0 7031111 1 39599391 0 150 0 0 1] real hdr: [ 2.64999960e+03 7.20175811e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.42000161e+03 2.21000002e+03 7.42646223e-01 7.63464495e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 12 hdr offset: 139360 data offset: 165150720 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 20643840 79872 -32768 324 12 0 0 0 0 7031111 1 39755791 0 150 0 0 1] real hdr: [ 3.12999986e+03 6.74392534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.88000152e+03 2.64999960e+03 6.98050213e-01 7.20175811e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 13 hdr offset: 139872 data offset: 165789696 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 20723712 79872 -32768 324 13 0 0 0 0 7031111 1 39912191 0 150 0 0 1] real hdr: [ 3.65000079e+03 6.26490534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.37999819e+03 3.12999986e+03 6.51142688e-01 6.74392534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 14 hdr offset: 140384 data offset: 166428672 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 20803584 79872 -32768 324 14 0 0 0 0 7031111 1 40068591 0 150 0 0 1] real hdr: [ 4.20999847e+03 5.76877346e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.91999946e+03 3.65000079e+03 6.02314441e-01 6.26490534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 15 hdr offset: 140896 data offset: 167067648 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 20883456 79872 -32768 324 15 0 0 0 0 7031111 1 40224991 0 150 0 0 1] real hdr: [ 4.81000075e+03 5.25990788e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.50000140e+03 4.20999847e+03 5.51988701e-01 5.76877346e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 16 hdr offset: 141408 data offset: 167706624 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 20963328 79872 -32768 324 16 0 0 0 0 7031111 1 40381391 0 150 0 0 1] real hdr: [ 5.44999978e+03 4.74301366e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.12000009e+03 4.81000075e+03 5.00619965e-01 5.25990788e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 17 hdr offset: 141920 data offset: 168345600 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 21043200 79872 -32768 324 17 0 0 0 0 7031111 1 40537791 0 150 0 0 1] real hdr: [ 6.12999948e+03 4.22309896e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.77999946e+03 5.44999978e+03 4.48693382e-01 4.74301366e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 18 hdr offset: 142432 data offset: 168984576 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 21123072 79872 -32768 324 18 0 0 0 0 7031111 1 40694191 0 150 0 0 1] real hdr: [ 6.84999986e+03 3.70548863e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.47999950e+03 6.12999948e+03 3.96725773e-01 4.22309896e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 19 hdr offset: 142944 data offset: 169623552 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 21202944 79872 -32768 324 19 0 0 0 0 7031111 1 40850591 0 150 0 0 1] real hdr: [ 7.61000092e+03 3.19582071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.22000022e+03 6.84999986e+03 3.45265283e-01 3.70548863e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 20 hdr offset: 143456 data offset: 170262528 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 21282816 79872 -32768 324 20 0 0 0 0 7031111 1 41006991 0 150 0 0 1] real hdr: [ 8.40999873e+03 2.70004882e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00000162e+03 7.61000092e+03 2.94891378e-01 3.19582071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 21 hdr offset: 143968 data offset: 170901504 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 21362688 79872 -32768 324 21 0 0 0 0 7031111 1 41163391 0 150 0 0 1] real hdr: [ 9.25000113e+03 2.22443261e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.81999976e+03 8.40999873e+03 2.46215071e-01 2.70004882e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 22 hdr offset: 144480 data offset: 171540480 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 21442560 79872 -32768 324 22 0 0 0 0 7031111 1 41319791 0 150 0 0 1] real hdr: [ 1.01300003e+04 1.77555424e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.67999858e+03 9.25000113e+03 1.99878209e-01 2.22443261e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 23 hdr offset: 144992 data offset: 172179456 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 21522432 79872 -32768 324 23 0 0 0 0 7031111 1 41476191 0 150 0 0 1] real hdr: [ 1.10500001e+04 1.36030234e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.05799981e+04 1.01300003e+04 1.56554224e-01 1.77555424e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 24 hdr offset: 145504 data offset: 172818432 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 21602304 79872 -32768 324 24 0 0 0 0 7031111 1 41632591 0 150 0 0 1] real hdr: [ 1.20100006e+04 9.85881076e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.15199982e+04 1.10500001e+04 1.16947874e-01 1.36030234e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 25 hdr offset: 146016 data offset: 173457408 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 21682176 79872 -32768 324 25 0 0 0 0 7031111 1 41788991 0 150 0 0 1] real hdr: [ 1.30100018e+04 6.59807861e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.24999991e+04 1.20100006e+04 8.17952369e-02 9.85881076e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 26 hdr offset: 146528 data offset: 174096384 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 21762048 79872 -32768 324 26 0 0 0 0 7031111 1 41945391 0 150 0 0 1] real hdr: [ 1.40504001e+04 3.89823900e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.35200006e+04 1.30100018e+04 5.18637157e-02 6.59807861e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 27 hdr offset: 147040 data offset: 174735360 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 21841920 79872 -32768 324 27 0 0 0 0 7031111 1 42101791 0 150 0 0 1] real hdr: [ 1.51377198e+04 1.83146873e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.45807997e+04 1.40504001e+04 2.79368177e-02 3.89823900e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 28 hdr offset: 147552 data offset: 175374336 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 21921792 79872 -32768 324 28 0 0 0 0 7031111 1 42258191 0 150 0 0 1] real hdr: [ 1.62849737e+04 4.87210933e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.56946399e+04 1.51377198e+04 1.07164793e-02 1.83146873e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 29 hdr offset: 148064 data offset: 176013312 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 22001664 79872 -32768 324 29 0 0 0 0 7031111 1 42414591 0 150 0 0 1] real hdr: [ 1.75069688e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.68753114e+04 1.62849737e+04 1.30179090e-03 4.87210933e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 30 hdr offset: 148576 data offset: 176652288 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 22081536 79872 -32768 324 30 0 0 0 0 7031111 1 42570991 0 150 0 0 1] real hdr: [ 1.88208202e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81386262e+04 1.75069688e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 31 hdr offset: 149088 data offset: 177291264 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 22161408 79872 -32768 324 31 0 0 0 0 7031111 1 42727391 0 150 0 0 1] real hdr: [ 2.02465990e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.95030104e+04 1.88208202e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 32 hdr offset: 149600 data offset: 177930240 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 22241280 79872 -32768 324 32 0 0 0 0 7031111 1 42883791 0 150 0 0 1] real hdr: [ 2.18081366e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.09901876e+04 2.02465990e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 33 hdr offset: 150112 data offset: 178569216 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 22321152 79872 -32768 324 33 0 0 0 0 7031111 1 43040191 0 150 0 0 1] real hdr: [ 2.35421836e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.26260817e+04 2.18081366e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 34 hdr offset: 150624 data offset: 179208192 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 22401024 79872 -32768 324 34 0 0 0 0 7031111 1 43196591 0 150 0 0 1] real hdr: [ 2.55209609e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.44582854e+04 2.35421836e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 35 hdr offset: 151136 data offset: 179847168 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 22480896 79872 -32768 324 35 0 0 0 0 7031111 1 43352991 0 150 0 0 1] real hdr: [ 2.79013583e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.65836402e+04 2.55209609e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 36 hdr offset: 151648 data offset: 180486144 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 22560768 79872 -32768 324 36 0 0 0 0 7031111 1 43509391 0 150 0 0 1] real hdr: [ 3.10638886e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.92190802e+04 2.79013583e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 37 hdr offset: 152160 data offset: 181125120 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 22640640 79872 -32768 324 37 0 0 0 0 7031111 1 43665791 0 150 0 0 1] real hdr: [ 3.60817633e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.29086931e+04 3.10638886e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 36 record 38 hdr offset: 152672 data offset: 181764096 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 22720512 79872 -32768 324 38 0 0 0 0 7031111 1 43822191 0 150 0 0 1] real hdr: [ 4.24279038e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.92548336e+04 3.60817633e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 37: nz = 1, nt = 1 var 37 record 0 hdr offset: 153184 data offset: 182403072 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1381 0 0 129 0 0 22800384 51200 -32768 0 0 0 0 0 0 7031111 1 43978591 0 207 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 3.6256001 3.6256001 3.6256001 ..., 6.34509993 6.34509993 6.34509993] ----------------------- =============================== var 38: nz = 38, nt = 1 var 38 record 0 hdr offset: 153696 data offset: 182812672 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 22851584 79872 -32768 12 1 0 0 0 0 7031111 1 44080306 0 211 0 0 1] real hdr: [ 4.99988815e+01 9.94296273e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.00003377e+01 0.00000000e+00 9.97716462e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 1 hdr offset: 154208 data offset: 183451648 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 22931456 79872 -32768 12 2 0 0 0 0 7031111 1 44236706 0 211 0 0 1] real hdr: [ 1.30000232e+02 9.85203885e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00013508e+01 4.99988815e+01 9.90881510e-01 9.94296273e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 2 hdr offset: 154720 data offset: 184090624 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 23011328 79872 -32768 12 3 0 0 0 0 7031111 1 44393106 0 211 0 0 1] real hdr: [ 2.49998333e+02 9.71644051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.79999114e+02 1.30000232e+02 9.79542572e-01 9.85203885e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 3 hdr offset: 155232 data offset: 184729600 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 23091200 79872 -32768 12 4 0 0 0 0 7031111 1 44549506 0 211 0 0 1] real hdr: [ 4.10001035e+02 9.53709855e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.20001478e+02 2.49998333e+02 9.63777064e-01 9.71644051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 4 hdr offset: 155744 data offset: 185368576 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 23171072 79872 -32768 12 5 0 0 0 0 7031111 1 44705906 0 211 0 0 1] real hdr: [ 6.10000486e+02 9.31527464e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.00000592e+02 4.10001035e+02 9.43695500e-01 9.53709855e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 5 hdr offset: 156256 data offset: 186007552 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 23250944 79872 -32768 12 6 0 0 0 0 7031111 1 44862306 0 211 0 0 1] real hdr: [ 8.50000613e+02 9.05253051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.20000381e+02 6.10000486e+02 9.19438386e-01 9.31527464e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.1280527 0.12654842 0.12500635 ..., 0. 0. 0. ] ----------------------- var 38 record 6 hdr offset: 156768 data offset: 186646528 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 23330816 79872 -32768 12 7 0 0 0 0 7031111 1 45018706 0 211 0 0 1] real hdr: [ 1.13000142e+03 8.75074549e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.80000846e+02 8.50000613e+02 8.91177995e-01 9.05253051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.1280527 0.12654842 0.12500635 ..., 0. 0. 0. ] ----------------------- var 38 record 7 hdr offset: 157280 data offset: 187285504 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 23410688 79872 -32768 12 8 0 0 0 0 7031111 1 45175106 0 211 0 0 1] real hdr: [ 1.44999897e+03 8.41211628e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.27999806e+03 1.13000142e+03 8.59118341e-01 8.75074549e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.1280527 0.12654842 0.12500635 ..., 0. 0. 0. ] ----------------------- var 38 record 8 hdr offset: 157792 data offset: 187924480 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 23490560 79872 -32768 12 9 0 0 0 0 7031111 1 45331506 0 211 0 0 1] real hdr: [ 1.81000112e+03 8.03914038e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.61999988e+03 1.44999897e+03 8.23493502e-01 8.41211628e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.1280527 0.12654842 0.12500635 ..., 0. 0. 0. ] ----------------------- var 38 record 9 hdr offset: 158304 data offset: 188563456 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 23570432 79872 -32768 12 10 0 0 0 0 7031111 1 45487906 0 211 0 0 1] real hdr: [ 2.21000002e+03 7.63464495e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.99999844e+03 1.81000112e+03 7.84570542e-01 8.03914038e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.04992953 0.04427817 0.04099748 ..., 0. 0. 0. ] ----------------------- var 38 record 10 hdr offset: 158816 data offset: 189202432 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 23650304 79872 -32768 12 11 0 0 0 0 7031111 1 45644306 0 211 0 0 1] real hdr: [ 2.64999960e+03 7.20175811e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.42000161e+03 2.21000002e+03 7.42646223e-01 7.63464495e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 11 hdr offset: 159328 data offset: 189841408 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 23730176 79872 -32768 12 12 0 0 0 0 7031111 1 45800706 0 211 0 0 1] real hdr: [ 3.12999986e+03 6.74392534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.88000152e+03 2.64999960e+03 6.98050213e-01 7.20175811e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 12 hdr offset: 159840 data offset: 190480384 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 23810048 79872 -32768 12 13 0 0 0 0 7031111 1 45957106 0 211 0 0 1] real hdr: [ 3.65000079e+03 6.26490534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.37999819e+03 3.12999986e+03 6.51142688e-01 6.74392534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 13 hdr offset: 160352 data offset: 191119360 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 23889920 79872 -32768 12 14 0 0 0 0 7031111 1 46113506 0 211 0 0 1] real hdr: [ 4.20999847e+03 5.76877346e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.91999946e+03 3.65000079e+03 6.02314441e-01 6.26490534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 14 hdr offset: 160864 data offset: 191758336 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 23969792 79872 -32768 12 15 0 0 0 0 7031111 1 46269906 0 211 0 0 1] real hdr: [ 4.81000075e+03 5.25990788e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.50000140e+03 4.20999847e+03 5.51988701e-01 5.76877346e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 15 hdr offset: 161376 data offset: 192397312 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 24049664 79872 -32768 12 16 0 0 0 0 7031111 1 46426306 0 211 0 0 1] real hdr: [ 5.44999978e+03 4.74301366e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.12000009e+03 4.81000075e+03 5.00619965e-01 5.25990788e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 16 hdr offset: 161888 data offset: 193036288 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 24129536 79872 -32768 12 17 0 0 0 0 7031111 1 46582706 0 211 0 0 1] real hdr: [ 6.12999948e+03 4.22309896e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.77999946e+03 5.44999978e+03 4.48693382e-01 4.74301366e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 17 hdr offset: 162400 data offset: 193675264 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 24209408 79872 -32768 12 18 0 0 0 0 7031111 1 46739106 0 211 0 0 1] real hdr: [ 6.84999986e+03 3.70548863e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.47999950e+03 6.12999948e+03 3.96725773e-01 4.22309896e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 18 hdr offset: 162912 data offset: 194314240 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 24289280 79872 -32768 12 19 0 0 0 0 7031111 1 46895506 0 211 0 0 1] real hdr: [ 7.61000092e+03 3.19582071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.22000022e+03 6.84999986e+03 3.45265283e-01 3.70548863e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 19 hdr offset: 163424 data offset: 194953216 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 24369152 79872 -32768 12 20 0 0 0 0 7031111 1 47051906 0 211 0 0 1] real hdr: [ 8.40999873e+03 2.70004882e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00000162e+03 7.61000092e+03 2.94891378e-01 3.19582071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 20 hdr offset: 163936 data offset: 195592192 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 24449024 79872 -32768 12 21 0 0 0 0 7031111 1 47208306 0 211 0 0 1] real hdr: [ 9.25000113e+03 2.22443261e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.81999976e+03 8.40999873e+03 2.46215071e-01 2.70004882e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 21 hdr offset: 164448 data offset: 196231168 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 24528896 79872 -32768 12 22 0 0 0 0 7031111 1 47364706 0 211 0 0 1] real hdr: [ 1.01300003e+04 1.77555424e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.67999858e+03 9.25000113e+03 1.99878209e-01 2.22443261e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 22 hdr offset: 164960 data offset: 196870144 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 24608768 79872 -32768 12 23 0 0 0 0 7031111 1 47521106 0 211 0 0 1] real hdr: [ 1.10500001e+04 1.36030234e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.05799981e+04 1.01300003e+04 1.56554224e-01 1.77555424e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 23 hdr offset: 165472 data offset: 197509120 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 24688640 79872 -32768 12 24 0 0 0 0 7031111 1 47677506 0 211 0 0 1] real hdr: [ 1.20100006e+04 9.85881076e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.15199982e+04 1.10500001e+04 1.16947874e-01 1.36030234e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 24 hdr offset: 165984 data offset: 198148096 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 24768512 79872 -32768 12 25 0 0 0 0 7031111 1 47833906 0 211 0 0 1] real hdr: [ 1.30100018e+04 6.59807861e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.24999991e+04 1.20100006e+04 8.17952369e-02 9.85881076e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 25 hdr offset: 166496 data offset: 198787072 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 24848384 79872 -32768 12 26 0 0 0 0 7031111 1 47990306 0 211 0 0 1] real hdr: [ 1.40504001e+04 3.89823900e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.35200006e+04 1.30100018e+04 5.18637157e-02 6.59807861e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 26 hdr offset: 167008 data offset: 199426048 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 24928256 79872 -32768 12 27 0 0 0 0 7031111 1 48146706 0 211 0 0 1] real hdr: [ 1.51377198e+04 1.83146873e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.45807997e+04 1.40504001e+04 2.79368177e-02 3.89823900e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 27 hdr offset: 167520 data offset: 200065024 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 25008128 79872 -32768 12 28 0 0 0 0 7031111 1 48303106 0 211 0 0 1] real hdr: [ 1.62849737e+04 4.87210933e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.56946399e+04 1.51377198e+04 1.07164793e-02 1.83146873e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 28 hdr offset: 168032 data offset: 200704000 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 25088000 79872 -32768 12 29 0 0 0 0 7031111 1 48459506 0 211 0 0 1] real hdr: [ 1.75069688e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.68753114e+04 1.62849737e+04 1.30179090e-03 4.87210933e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 29 hdr offset: 168544 data offset: 201342976 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 25167872 79872 -32768 12 30 0 0 0 0 7031111 1 48615906 0 211 0 0 1] real hdr: [ 1.88208202e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81386262e+04 1.75069688e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 30 hdr offset: 169056 data offset: 201981952 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 25247744 79872 -32768 12 31 0 0 0 0 7031111 1 48772306 0 211 0 0 1] real hdr: [ 2.02465990e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.95030104e+04 1.88208202e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 31 hdr offset: 169568 data offset: 202620928 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 25327616 79872 -32768 12 32 0 0 0 0 7031111 1 48928706 0 211 0 0 1] real hdr: [ 2.18081366e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.09901876e+04 2.02465990e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 32 hdr offset: 170080 data offset: 203259904 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 25407488 79872 -32768 12 33 0 0 0 0 7031111 1 49085106 0 211 0 0 1] real hdr: [ 2.35421836e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.26260817e+04 2.18081366e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 33 hdr offset: 170592 data offset: 203898880 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 25487360 79872 -32768 12 34 0 0 0 0 7031111 1 49241506 0 211 0 0 1] real hdr: [ 2.55209609e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.44582854e+04 2.35421836e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 34 hdr offset: 171104 data offset: 204537856 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 25567232 79872 -32768 12 35 0 0 0 0 7031111 1 49397906 0 211 0 0 1] real hdr: [ 2.79013583e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.65836402e+04 2.55209609e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 35 hdr offset: 171616 data offset: 205176832 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 25647104 79872 -32768 12 36 0 0 0 0 7031111 1 49554306 0 211 0 0 1] real hdr: [ 3.10638886e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.92190802e+04 2.79013583e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 36 hdr offset: 172128 data offset: 205815808 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 25726976 79872 -32768 12 37 0 0 0 0 7031111 1 49710706 0 211 0 0 1] real hdr: [ 3.60817633e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.29086931e+04 3.10638886e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 38 record 37 hdr offset: 172640 data offset: 206454784 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 218 0 0 65 0 0 25806848 79872 -32768 12 38 0 0 0 0 7031111 1 49867106 0 211 0 0 1] real hdr: [ 4.24279038e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.92548336e+04 3.60817633e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 39: nz = 1, nt = 1 var 39 record 0 hdr offset: 173152 data offset: 207093760 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1384 0 0 129 0 0 25886720 51200 -32768 0 0 0 0 0 0 7031111 1 50023506 0 213 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0.00017184 0.00016896 0.00020831 ..., 0.00088879 0.00088879 0.00122443] ----------------------- =============================== var 40: nz = 4, nt = 1 var 40 record 0 hdr offset: 173664 data offset: 207503360 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1385 0 0 6 0 0 25937920 51200 -32768 0 1 0 0 0 0 7031111 1 50125221 0 214 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0.10597784 0.10507805 0.12381909 ..., 0.34656665 0.34656665 0.34656665] ----------------------- var 40 record 1 hdr offset: 174176 data offset: 207912960 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1385 0 0 6 0 0 25989120 51200 -32768 0 2 0 0 0 0 7031111 1 50226936 0 214 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0.24503984 0.24159579 0.26018521 ..., 0.34658447 0.34658447 0.34658447] ----------------------- var 40 record 2 hdr offset: 174688 data offset: 208322560 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1385 0 0 6 0 0 26040320 51200 -32768 0 3 0 0 0 0 7031111 1 50328651 0 214 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0.35431281 0.35220039 0.35910138 ..., 0.34658569 0.34658569 0.34658569] ----------------------- var 40 record 3 hdr offset: 175200 data offset: 208732160 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1385 0 0 6 0 0 26091520 51200 -32768 0 4 0 0 0 0 7031111 1 50430366 0 214 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0.47329289 0.47276106 0.47023559 ..., 0.34658572 0.34658572 0.34658572] ----------------------- =============================== var 41: nz = 4, nt = 1 var 41 record 0 hdr offset: 175712 data offset: 209141760 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1386 0 0 6 0 0 26142720 51200 -32768 0 1 0 0 0 0 7031111 1 50532081 0 215 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 41 record 1 hdr offset: 176224 data offset: 209551360 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1386 0 0 6 0 0 26193920 51200 -32768 0 2 0 0 0 0 7031111 1 50633796 0 215 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 41 record 2 hdr offset: 176736 data offset: 209960960 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1386 0 0 6 0 0 26245120 51200 -32768 0 3 0 0 0 0 7031111 1 50735511 0 215 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 41 record 3 hdr offset: 177248 data offset: 210370560 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1386 0 0 6 0 0 26296320 51200 -32768 0 4 0 0 0 0 7031111 1 50837226 0 215 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 42: nz = 9, nt = 1 var 42 record 0 hdr offset: 177760 data offset: 210780160 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1391 0 0 129 0 0 26347520 51200 -32768 0 9999 0 0 0 0 7031111 1 50938941 0 216 1 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0.25624999 0.25624999 0.38679215 ..., 0. 0. 0. ] ----------------------- var 42 record 1 hdr offset: 178272 data offset: 211189760 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1391 0 0 129 0 0 26398720 51200 -32768 0 9999 0 0 0 0 7031111 1 51040656 0 216 2 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 42 record 2 hdr offset: 178784 data offset: 211599360 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1391 0 0 129 0 0 26449920 51200 -32768 0 9999 0 0 0 0 7031111 1 51142371 0 216 3 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0. 0. 0. ..., 0.80000001 0.80000001 0.47368422] ----------------------- var 42 record 3 hdr offset: 179296 data offset: 212008960 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1391 0 0 129 0 0 26501120 51200 -32768 0 9999 0 0 0 0 7031111 1 51244086 0 216 4 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0.69375002 0.69375002 0.56320786 ..., 0. 0. 0.10197368] ----------------------- var 42 record 4 hdr offset: 179808 data offset: 212418560 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1391 0 0 129 0 0 26552320 51200 -32768 0 9999 0 0 0 0 7031111 1 51345801 0 216 5 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0. 0. 0. ..., 0. 0. 0.12236842] ----------------------- var 42 record 5 hdr offset: 180320 data offset: 212828160 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1391 0 0 129 0 0 26603520 51200 -32768 0 9999 0 0 0 0 7031111 1 51447516 0 216 6 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 42 record 6 hdr offset: 180832 data offset: 213237760 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1391 0 0 129 0 0 26654720 51200 -32768 0 9999 0 0 0 0 7031111 1 51549231 0 216 7 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 42 record 7 hdr offset: 181344 data offset: 213647360 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1391 0 0 129 0 0 26705920 51200 -32768 0 9999 0 0 0 0 7031111 1 51650946 0 216 8 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0.05 0.05 0.05 ..., 0.2 0.2 0.30197367] ----------------------- var 42 record 8 hdr offset: 181856 data offset: 214056960 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1391 0 0 129 0 0 26757120 51200 -32768 0 9999 0 0 0 0 7031111 1 51752661 0 216 9 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 43: nz = 5, nt = 1 var 43 record 0 hdr offset: 182368 data offset: 214466560 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1392 0 0 129 0 0 26808320 51200 -32768 0 9999 0 0 0 0 7031111 1 51854376 0 217 1 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 9. 9. 9. ..., 5. 5. 5.] ----------------------- var 43 record 1 hdr offset: 182880 data offset: 214876160 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1392 0 0 129 0 0 26859520 51200 -32768 0 9999 0 0 0 0 7031111 1 51956091 0 217 2 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 4. 4. 4. ..., 4. 4. 4.] ----------------------- var 43 record 2 hdr offset: 183392 data offset: 215285760 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1392 0 0 129 0 0 26910720 51200 -32768 0 9999 0 0 0 0 7031111 1 52057806 0 217 3 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 2. 2. 2. ..., 4.25 4.25 4.25] ----------------------- var 43 record 3 hdr offset: 183904 data offset: 215695360 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1392 0 0 129 0 0 26961920 51200 -32768 0 9999 0 0 0 0 7031111 1 52159521 0 217 4 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 4. 4. 4. ..., 4. 4. 4.] ----------------------- var 43 record 4 hdr offset: 184416 data offset: 216104960 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1392 0 0 129 0 0 27013120 51200 -32768 0 9999 0 0 0 0 7031111 1 52261236 0 217 5 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 1. 1. 1. ..., 1. 1. 2.5] ----------------------- =============================== var 44: nz = 5, nt = 1 var 44 record 0 hdr offset: 184928 data offset: 216514560 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1393 0 0 129 0 0 27064320 51200 -32768 0 9999 0 0 0 0 7031111 1 52362951 0 218 1 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 28.12386703 28.12386703 28.12386703 ..., 19.00611496 19.00611496 19.00611496] ----------------------- var 44 record 1 hdr offset: 185440 data offset: 216924160 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1393 0 0 129 0 0 27115520 51200 -32768 0 9999 0 0 0 0 7031111 1 52464666 0 218 2 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 16.37897301 16.37897301 16.37897301 ..., 16.37897301 16.37897301 16.37897301] ----------------------- var 44 record 2 hdr offset: 185952 data offset: 217333760 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1393 0 0 129 0 0 27166720 51200 -32768 0 9999 0 0 0 0 7031111 1 52566381 0 218 3 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0.79370052 0.79370052 0.79370052 ..., 1.29493177 1.29493177 1.29493177] ----------------------- var 44 record 3 hdr offset: 186464 data offset: 217743360 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1393 0 0 129 0 0 27217920 51200 -32768 0 9999 0 0 0 0 7031111 1 52668096 0 218 4 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 1.25992107 1.25992107 1.25992107 ..., 1.25992107 1.25992107 1.25992107] ----------------------- var 44 record 4 hdr offset: 186976 data offset: 218152960 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1393 0 0 129 0 0 27269120 51200 -32768 0 9999 0 0 0 0 7031111 1 52769811 0 218 5 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 1. 1. 1. ..., 1. 1. 1.83374238] ----------------------- =============================== var 45: nz = 1, nt = 1 var 45 record 0 hdr offset: 187488 data offset: 218562560 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1395 0 0 129 0 0 27320320 51200 -32768 0 9999 0 0 0 0 7031111 1 52871526 0 220 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0.17 0.17 0.17 ..., 0.25999999 0.25999999 0.25999999] ----------------------- =============================== var 46: nz = 1, nt = 1 var 46 record 0 hdr offset: 188000 data offset: 218972160 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1397 0 0 129 0 0 27371520 51200 -32768 0 9999 0 0 0 0 7031111 1 52973241 0 223 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0. 0. 0. ..., 2. 2. 1.] ----------------------- =============================== var 47: nz = 5, nt = 1 var 47 record 0 hdr offset: 188512 data offset: 219381760 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1500 0 0 129 0 0 27422720 51200 -32768 0 9999 0 0 0 0 7031111 1 53074956 0 225 1 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [-1. -1. -1. ..., -1. -1. -1.] ----------------------- var 47 record 1 hdr offset: 189024 data offset: 219791360 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1500 0 0 129 0 0 27473920 51200 -32768 0 9999 0 0 0 0 7031111 1 53176671 0 225 2 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [-1. -1. -1. ..., -1. -1. -1.] ----------------------- var 47 record 2 hdr offset: 189536 data offset: 220200960 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1500 0 0 129 0 0 27525120 51200 -32768 0 9999 0 0 0 0 7031111 1 53278386 0 225 3 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [-1. -1. -1. ..., -1. -1. -1.] ----------------------- var 47 record 3 hdr offset: 190048 data offset: 220610560 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1500 0 0 129 0 0 27576320 51200 -32768 0 9999 0 0 0 0 7031111 1 53380101 0 225 4 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [-1. -1. -1. ..., -1. -1. -1.] ----------------------- var 47 record 4 hdr offset: 190560 data offset: 221020160 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1500 0 0 129 0 0 27627520 51200 -32768 0 9999 0 0 0 0 7031111 1 53481816 0 225 5 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [-1. -1. -1. ..., -1. -1. -1.] ----------------------- =============================== var 48: nz = 1, nt = 1 var 48 record 0 hdr offset: 191072 data offset: 221429760 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1504 0 0 129 0 0 27678720 51200 -32768 0 0 0 0 0 0 7031111 1 53583531 0 229 1 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 5.06077249e-14 1.13560914e-13 2.32368486e-13 ..., 0.00000000e+00 0.00000000e+00 0.00000000e+00] ----------------------- =============================== var 49: nz = 1, nt = 1 var 49 record 0 hdr offset: 191584 data offset: 221839360 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1505 0 0 129 0 0 27729920 51200 -32768 0 0 0 0 0 0 7031111 1 53685246 0 230 1 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0.7290625 0.7290625 0.76169807 ..., 0.56999999 0.56999999 0.48536184] ----------------------- =============================== var 50: nz = 1, nt = 1 var 50 record 0 hdr offset: 192096 data offset: 222248960 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1510 0 0 129 0 0 27781120 51200 -32768 0 9999 0 0 0 0 7031111 1 53786961 0 233 1 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 293.69213867 293.30126953 293.25888062 ..., 295.26724243 295.57891846 296.06271362] ----------------------- =============================== var 51: nz = 1, nt = 1 var 51 record 0 hdr offset: 192608 data offset: 222658560 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1511 0 0 129 0 0 27832320 51200 -32768 0 9999 0 0 0 0 7031111 1 53888676 0 234 1 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0.3813943 0.3813943 0.5472014 ..., 0.08213739 0.08213739 0.06597848] ----------------------- =============================== var 52: nz = 1, nt = 1 var 52 record 0 hdr offset: 193120 data offset: 223068160 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1579 0 0 129 0 0 27883520 51200 -32768 0 9999 0 0 0 0 7031111 1 53990391 0 236 1 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0.05750752 0.05750752 0.06366724 ..., 0.00903294 0.00903294 0.00822018] ----------------------- =============================== var 53: nz = 1, nt = 1 var 53 record 0 hdr offset: 193632 data offset: 223477760 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1580 0 0 129 0 0 27934720 51200 -32768 0 9999 0 0 0 0 7031111 1 54092106 0 237 1 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 54: nz = 1, nt = 1 var 54 record 0 hdr offset: 194144 data offset: 223887360 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1581 0 0 129 0 0 27985920 79872 -32768 0 9999 0 0 0 0 7031111 1 54193821 0 238 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 387.46356201 386.76901245 387.06063843 ..., 362.07226562 361.33483887 361.29989624] ----------------------- =============================== var 55: nz = 1, nt = 1 var 55 record 0 hdr offset: 194656 data offset: 224526336 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1582 0 0 129 0 0 28065792 79872 -32768 0 9999 0 0 0 0 7031111 1 54350221 0 239 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 291.91061401 292.22628784 292.10031128 ..., 290.74041748 290.99526978 291.27224731] ----------------------- =============================== var 56: nz = 1, nt = 1 var 56 record 0 hdr offset: 195168 data offset: 225165312 disk length: 51200 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 101715 101 3 0 0 0 122 2 1583 0 0 129 0 0 28145664 51200 -32768 0 9999 0 0 0 0 7031111 1 54506621 0 240 1 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 101715 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 57: nz = 38, nt = 1 var 57 record 0 hdr offset: 195680 data offset: 225574912 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 28196864 79872 -32768 420 1 0 0 0 0 7031111 1 54608336 0 253 0 0 1] real hdr: [ 2.00003377e+01 9.97716462e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.99820611e+00 0.00000000e+00 9.98858129e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.77139032e+13 4.77174516e+13 4.77207567e+13 ..., 4.75059622e+13 4.75072121e+13 4.75084955e+13] ----------------------- var 57 record 1 hdr offset: 196192 data offset: 226213888 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 28276736 79872 -32768 420 2 0 0 0 0 7031111 1 54764736 0 253 0 0 1] real hdr: [ 8.00013508e+01 9.90881510e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.99988815e+01 2.00003377e+01 9.94296273e-01 9.97716462e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.75670816e+13 4.75707474e+13 4.75742077e+13 ..., 4.73619717e+13 4.73630916e+13 4.73642492e+13] ----------------------- var 57 record 2 hdr offset: 196704 data offset: 226852864 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 28356608 79872 -32768 420 3 0 0 0 0 7031111 1 54921136 0 253 0 0 1] real hdr: [ 1.79999114e+02 9.79542572e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30000232e+02 8.00013508e+01 9.85203885e-01 9.90881510e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.72697893e+13 4.72736648e+13 4.72774062e+13 ..., 4.70671834e+13 4.70682740e+13 4.70694022e+13] ----------------------- var 57 record 3 hdr offset: 197216 data offset: 227491840 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 28436480 79872 -32768 420 4 0 0 0 0 7031111 1 55077536 0 253 0 0 1] real hdr: [ 3.20001478e+02 9.63777064e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.49998333e+02 1.79999114e+02 9.71644051e-01 9.79542572e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.68175846e+13 4.68214769e+13 4.68252518e+13 ..., 4.65428996e+13 4.65480209e+13 4.65532302e+13] ----------------------- var 57 record 4 hdr offset: 197728 data offset: 228130816 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 28516352 79872 -32768 420 5 0 0 0 0 7031111 1 55233936 0 253 0 0 1] real hdr: [ 5.00000592e+02 9.43695500e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.10001035e+02 3.20001478e+02 9.53709855e-01 9.63777064e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.62161424e+13 4.62195020e+13 4.62229372e+13 ..., 4.55920677e+13 4.56005402e+13 4.56092014e+13] ----------------------- var 57 record 5 hdr offset: 198240 data offset: 228769792 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 28596224 79872 -32768 420 6 0 0 0 0 7031111 1 55390336 0 253 0 0 1] real hdr: [ 7.20000381e+02 9.19438386e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.10000486e+02 5.00000592e+02 9.31527464e-01 9.43695500e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.54118804e+13 4.54172785e+13 4.54234273e+13 ..., 4.44094376e+13 4.44171635e+13 4.44250529e+13] ----------------------- var 57 record 6 hdr offset: 198752 data offset: 229408768 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 28676096 79872 -32768 420 7 0 0 0 0 7031111 1 55546736 0 253 0 0 1] real hdr: [ 9.80000846e+02 8.91177995e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.50000613e+02 7.20000381e+02 9.05253051e-01 9.19438386e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.44026176e+13 4.44109601e+13 4.44207412e+13 ..., 4.32923308e+13 4.32997128e+13 4.33071619e+13] ----------------------- var 57 record 7 hdr offset: 199264 data offset: 230047744 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 28755968 79872 -32768 420 8 0 0 0 0 7031111 1 55703136 0 253 0 0 1] real hdr: [ 1.27999806e+03 8.59118341e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.13000142e+03 9.80000846e+02 8.75074549e-01 8.91177995e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.32383459e+13 4.32473637e+13 4.32580172e+13 ..., 4.21338305e+13 4.21423365e+13 4.21508762e+13] ----------------------- var 57 record 8 hdr offset: 199776 data offset: 230686720 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 28835840 79872 -32768 420 9 0 0 0 0 7031111 1 55859536 0 253 0 0 1] real hdr: [ 1.61999988e+03 8.23493502e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.44999897e+03 1.27999806e+03 8.41211628e-01 8.59118341e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.19164984e+13 4.19214729e+13 4.19272317e+13 ..., 4.08839573e+13 4.08943885e+13 4.09048155e+13] ----------------------- var 57 record 9 hdr offset: 200288 data offset: 231325696 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 28915712 79872 -32768 420 10 0 0 0 0 7031111 1 56015936 0 253 0 0 1] real hdr: [ 1.99999844e+03 7.84570542e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81000112e+03 1.61999988e+03 8.03914038e-01 8.23493502e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.03685360e+13 4.03631086e+13 4.03577692e+13 ..., 3.95679147e+13 3.95768150e+13 3.95856818e+13] ----------------------- var 57 record 10 hdr offset: 200800 data offset: 231964672 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 28995584 79872 -32768 420 11 0 0 0 0 7031111 1 56172336 0 253 0 0 1] real hdr: [ 2.42000161e+03 7.42646223e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.21000002e+03 1.99999844e+03 7.63464495e-01 7.84570542e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.86432762e+13 3.86386331e+13 3.86336251e+13 ..., 3.81820160e+13 3.81836434e+13 3.81852414e+13] ----------------------- var 57 record 11 hdr offset: 201312 data offset: 232603648 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 29075456 79872 -32768 420 12 0 0 0 0 7031111 1 56328736 0 253 0 0 1] real hdr: [ 2.88000152e+03 6.98050213e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.64999960e+03 2.42000161e+03 7.20175811e-01 7.42646223e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.69737838e+13 3.69744633e+13 3.69745178e+13 ..., 3.67264667e+13 3.67212406e+13 3.67160145e+13] ----------------------- var 57 record 12 hdr offset: 201824 data offset: 233242624 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 29155328 79872 -32768 420 13 0 0 0 0 7031111 1 56485136 0 253 0 0 1] real hdr: [ 3.37999819e+03 6.51142688e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.12999986e+03 2.88000152e+03 6.74392534e-01 6.98050213e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.53280438e+13 3.53280899e+13 3.53277837e+13 ..., 3.51560018e+13 3.51478313e+13 3.51396944e+13] ----------------------- var 57 record 13 hdr offset: 202336 data offset: 233881600 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 29235200 79872 -32768 420 14 0 0 0 0 7031111 1 56641536 0 253 0 0 1] real hdr: [ 3.91999946e+03 6.02314441e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.65000079e+03 3.37999819e+03 6.26490534e-01 6.51142688e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.35535512e+13 3.35545998e+13 3.35554869e+13 ..., 3.34325749e+13 3.34224100e+13 3.34122996e+13] ----------------------- var 57 record 14 hdr offset: 202848 data offset: 234520576 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 29315072 79872 -32768 420 15 0 0 0 0 7031111 1 56797936 0 253 0 0 1] real hdr: [ 4.50000140e+03 5.51988701e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.20999847e+03 3.91999946e+03 5.76877346e-01 6.02314441e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.16296680e+13 3.16311800e+13 3.16327340e+13 ..., 3.15884883e+13 3.15800662e+13 3.15716629e+13] ----------------------- var 57 record 15 hdr offset: 203360 data offset: 235159552 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 29394944 79872 -32768 420 16 0 0 0 0 7031111 1 56954336 0 253 0 0 1] real hdr: [ 5.12000009e+03 5.00619965e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.81000075e+03 4.50000140e+03 5.25990788e-01 5.51988701e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.96380090e+13 2.96378350e+13 2.96377154e+13 ..., 2.97186634e+13 2.97115645e+13 2.97044216e+13] ----------------------- var 57 record 16 hdr offset: 203872 data offset: 235798528 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 29474816 79872 -32768 420 17 0 0 0 0 7031111 1 57110736 0 253 0 0 1] real hdr: [ 5.77999946e+03 4.48693382e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.44999978e+03 5.12000009e+03 4.74301366e-01 5.00619965e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.76576873e+13 2.76564290e+13 2.76550008e+13 ..., 2.78438556e+13 2.78359599e+13 2.78280347e+13] ----------------------- var 57 record 17 hdr offset: 204384 data offset: 236437504 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 29554688 79872 -32768 420 18 0 0 0 0 7031111 1 57267136 0 253 0 0 1] real hdr: [ 6.47999950e+03 3.96725773e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.12999948e+03 5.77999946e+03 4.22309896e-01 4.48693382e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.56724162e+13 2.56711873e+13 2.56698179e+13 ..., 2.59677980e+13 2.59619406e+13 2.59560393e+13] ----------------------- var 57 record 18 hdr offset: 204896 data offset: 237076480 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 29634560 79872 -32768 420 19 0 0 0 0 7031111 1 57423536 0 253 0 0 1] real hdr: [ 7.22000022e+03 3.45265283e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.84999986e+03 6.47999950e+03 3.70548863e-01 3.96725773e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.37180992e+13 2.37174952e+13 2.37169415e+13 ..., 2.41012509e+13 2.40978053e+13 2.40942947e+13] ----------------------- var 57 record 19 hdr offset: 205408 data offset: 237715456 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 29714432 79872 -32768 420 20 0 0 0 0 7031111 1 57579936 0 253 0 0 1] real hdr: [ 8.00000162e+03 2.94891378e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.61000092e+03 7.22000022e+03 3.19582071e-01 3.45265283e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.19152803e+13 2.19154229e+13 2.19155844e+13 ..., 2.22640409e+13 2.22624114e+13 2.22607337e+13] ----------------------- var 57 record 20 hdr offset: 205920 data offset: 238354432 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 29794304 79872 -32768 420 21 0 0 0 0 7031111 1 57736336 0 253 0 0 1] real hdr: [ 8.81999976e+03 2.46215071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.40999873e+03 8.00000162e+03 2.70004882e-01 2.94891378e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.01852432e+13 2.01852432e+13 2.01853522e+13 ..., 2.04741699e+13 2.04733667e+13 2.04725446e+13] ----------------------- var 57 record 21 hdr offset: 206432 data offset: 238993408 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 29874176 79872 -32768 420 22 0 0 0 0 7031111 1 57892736 0 253 0 0 1] real hdr: [ 9.67999858e+03 1.99878209e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.25000113e+03 8.81999976e+03 2.22443261e-01 2.46215071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.84700497e+13 1.84682923e+13 1.84665978e+13 ..., 1.86944680e+13 1.86942436e+13 1.86940821e+13] ----------------------- var 57 record 22 hdr offset: 206944 data offset: 239632384 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 29954048 79872 -32768 420 23 0 0 0 0 7031111 1 58049136 0 253 0 0 1] real hdr: [ 1.05799981e+04 1.56554224e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.01300003e+04 9.67999858e+03 1.77555424e-01 1.99878209e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.68288154e+13 1.68273369e+13 1.68257913e+13 ..., 1.69238520e+13 1.69226168e+13 1.69214340e+13] ----------------------- var 57 record 23 hdr offset: 207456 data offset: 240271360 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 30033920 79872 -32768 420 24 0 0 0 0 7031111 1 58205536 0 253 0 0 1] real hdr: [ 1.15199982e+04 1.16947874e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.10500001e+04 1.05799981e+04 1.36030234e-01 1.56554224e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.52102125e+13 1.52106623e+13 1.52110293e+13 ..., 1.52010500e+13 1.51987044e+13 1.51963514e+13] ----------------------- var 57 record 24 hdr offset: 207968 data offset: 240910336 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 30113792 79872 -32768 420 25 0 0 0 0 7031111 1 58361936 0 253 0 0 1] real hdr: [ 1.24999991e+04 8.17952369e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.20100006e+04 1.15199982e+04 9.85881076e-02 1.16947874e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.36054592e+13 1.36062414e+13 1.36069754e+13 ..., 1.35315849e+13 1.35309484e+13 1.35302847e+13] ----------------------- var 57 record 25 hdr offset: 208480 data offset: 241549312 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 30193664 79872 -32768 420 26 0 0 0 0 7031111 1 58518336 0 253 0 0 1] real hdr: [ 1.35200006e+04 5.18637157e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30100018e+04 1.24999991e+04 6.59807861e-02 8.17952369e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.20594104e+13 1.20600018e+13 1.20605806e+13 ..., 1.19094976e+13 1.19104455e+13 1.19113903e+13] ----------------------- var 57 record 26 hdr offset: 208992 data offset: 242188288 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 30273536 79872 -32768 420 27 0 0 0 0 7031111 1 58674736 0 253 0 0 1] real hdr: [ 1.45807997e+04 2.79368177e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.40504001e+04 1.35200006e+04 3.89823900e-02 5.18637157e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.05758945e+13 1.05767470e+13 1.05776341e+13 ..., 1.03884469e+13 1.03882697e+13 1.03880998e+13] ----------------------- var 57 record 27 hdr offset: 209504 data offset: 242827264 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 30353408 79872 -32768 420 28 0 0 0 0 7031111 1 58831136 0 253 0 0 1] real hdr: [ 1.56946399e+04 1.07164793e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.51377198e+04 1.45807997e+04 1.83146873e-02 2.79368177e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 9.14397069e+12 9.14381026e+12 9.14357748e+12 ..., 8.88680638e+12 8.88673613e+12 8.88667321e+12] ----------------------- var 57 record 28 hdr offset: 210016 data offset: 243466240 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 30433280 79872 -32768 420 29 0 0 0 0 7031111 1 58987536 0 253 0 0 1] real hdr: [ 1.68753114e+04 1.30179090e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.62849737e+04 1.56946399e+04 4.87210933e-03 1.07164793e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 7.63866802e+12 7.63919545e+12 7.63924316e+12 ..., 7.39746827e+12 7.39854464e+12 7.39963673e+12] ----------------------- var 57 record 29 hdr offset: 210528 data offset: 244105216 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 30513152 79872 -32768 420 30 0 0 0 0 7031111 1 59143936 0 253 0 0 1] real hdr: [ 1.81386262e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.75069688e+04 1.68753114e+04 0.00000000e+00 1.30179090e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 6.07608950e+12 6.07601767e+12 6.07610051e+12 ..., 5.99681401e+12 5.99834650e+12 5.99987113e+12] ----------------------- var 57 record 30 hdr offset: 211040 data offset: 244744192 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 30593024 79872 -32768 420 31 0 0 0 0 7031111 1 59300336 0 253 0 0 1] real hdr: [ 1.95030104e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.88208202e+04 1.81386262e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.72580568e+12 4.72661885e+12 4.72764541e+12 ..., 4.74575222e+12 4.74594201e+12 4.74612079e+12] ----------------------- var 57 record 31 hdr offset: 211552 data offset: 245383168 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 30672896 79872 -32768 420 32 0 0 0 0 7031111 1 59456736 0 253 0 0 1] real hdr: [ 2.09901876e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.02465990e+04 1.95030104e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.68706218e+12 3.68748370e+12 3.68779801e+12 ..., 3.67575617e+12 3.67536898e+12 3.67498887e+12] ----------------------- var 57 record 32 hdr offset: 212064 data offset: 246022144 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 30752768 79872 -32768 420 33 0 0 0 0 7031111 1 59613136 0 253 0 0 1] real hdr: [ 2.26260817e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.18081366e+04 2.09901876e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.80253432e+12 2.80202943e+12 2.80152139e+12 ..., 2.79338838e+12 2.79341643e+12 2.79344919e+12] ----------------------- var 57 record 33 hdr offset: 212576 data offset: 246661120 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 30832640 79872 -32768 420 34 0 0 0 0 7031111 1 59769536 0 253 0 0 1] real hdr: [ 2.44582854e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.35421836e+04 2.26260817e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.07123500e+12 2.07085450e+12 2.07055710e+12 ..., 2.08561858e+12 2.08562029e+12 2.08562094e+12] ----------------------- var 57 record 34 hdr offset: 213088 data offset: 247300096 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 30912512 79872 -32768 420 35 0 0 0 0 7031111 1 59925936 0 253 0 0 1] real hdr: [ 2.65836402e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.55209609e+04 2.44582854e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.50063782e+12 1.50105096e+12 1.50148350e+12 ..., 1.51333451e+12 1.51318548e+12 1.51303330e+12] ----------------------- var 57 record 35 hdr offset: 213600 data offset: 247939072 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 30992384 79872 -32768 420 36 0 0 0 0 7031111 1 60082336 0 253 0 0 1] real hdr: [ 2.92190802e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.79013583e+04 2.65836402e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.01612487e+12 1.01595644e+12 1.01578480e+12 ..., 1.03224168e+12 1.03224587e+12 1.03225236e+12] ----------------------- var 57 record 36 hdr offset: 214112 data offset: 248578048 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 31072256 79872 -32768 420 37 0 0 0 0 7031111 1 60238736 0 253 0 0 1] real hdr: [ 3.29086931e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.10638886e+04 2.92190802e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 6.08571490e+11 6.08475021e+11 6.08380846e+11 ..., 6.27475677e+11 6.27413156e+11 6.27351814e+11] ----------------------- var 57 record 37 hdr offset: 214624 data offset: 249217024 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 65 0 0 31152128 79872 -32768 420 38 0 0 0 0 7031111 1 60395136 0 253 0 0 1] real hdr: [ 3.92548336e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.60817633e+04 3.29086931e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.68947653e+11 2.69057802e+11 2.69168017e+11 ..., 2.81065259e+11 2.81058378e+11 2.81051562e+11] ----------------------- =============================== var 58: nz = 38, nt = 1 var 58 record 0 hdr offset: 215136 data offset: 249856000 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 31232000 79872 -32768 117 1 0 0 0 0 7031111 1 60551536 0 254 0 0 1] real hdr: [ 4.99988815e+01 9.94296273e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.00003377e+01 0.00000000e+00 9.97716462e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 1 hdr offset: 215648 data offset: 250494976 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 31311872 79872 -32768 117 2 0 0 0 0 7031111 1 60707936 0 254 0 0 1] real hdr: [ 1.30000232e+02 9.85203885e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00013508e+01 4.99988815e+01 9.90881510e-01 9.94296273e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 2 hdr offset: 216160 data offset: 251133952 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 31391744 79872 -32768 117 3 0 0 0 0 7031111 1 60864336 0 254 0 0 1] real hdr: [ 2.49998333e+02 9.71644051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.79999114e+02 1.30000232e+02 9.79542572e-01 9.85203885e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 3 hdr offset: 216672 data offset: 251772928 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 31471616 79872 -32768 117 4 0 0 0 0 7031111 1 61020736 0 254 0 0 1] real hdr: [ 4.10001035e+02 9.53709855e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.20001478e+02 2.49998333e+02 9.63777064e-01 9.71644051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 4 hdr offset: 217184 data offset: 252411904 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 31551488 79872 -32768 117 5 0 0 0 0 7031111 1 61177136 0 254 0 0 1] real hdr: [ 6.10000486e+02 9.31527464e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.00000592e+02 4.10001035e+02 9.43695500e-01 9.53709855e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 5 hdr offset: 217696 data offset: 253050880 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 31631360 79872 -32768 117 6 0 0 0 0 7031111 1 61333536 0 254 0 0 1] real hdr: [ 8.50000613e+02 9.05253051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.20000381e+02 6.10000486e+02 9.19438386e-01 9.31527464e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 6 hdr offset: 218208 data offset: 253689856 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 31711232 79872 -32768 117 7 0 0 0 0 7031111 1 61489936 0 254 0 0 1] real hdr: [ 1.13000142e+03 8.75074549e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.80000846e+02 8.50000613e+02 8.91177995e-01 9.05253051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.68283884e-07 1.38135761e-07 5.04654203e-08 ..., 0.00000000e+00 0.00000000e+00 0.00000000e+00] ----------------------- var 58 record 7 hdr offset: 218720 data offset: 254328832 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 31791104 79872 -32768 117 8 0 0 0 0 7031111 1 61646336 0 254 0 0 1] real hdr: [ 1.44999897e+03 8.41211628e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.27999806e+03 1.13000142e+03 8.59118341e-01 8.75074549e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.17767229e-06 1.58617740e-06 1.10078065e-06 ..., 0.00000000e+00 0.00000000e+00 0.00000000e+00] ----------------------- var 58 record 8 hdr offset: 219232 data offset: 254967808 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 31870976 79872 -32768 117 9 0 0 0 0 7031111 1 61802736 0 254 0 0 1] real hdr: [ 1.81000112e+03 8.03914038e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.61999988e+03 1.44999897e+03 8.23493502e-01 8.41211628e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 9 hdr offset: 219744 data offset: 255606784 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 31950848 79872 -32768 117 10 0 0 0 0 7031111 1 61959136 0 254 0 0 1] real hdr: [ 2.21000002e+03 7.63464495e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.99999844e+03 1.81000112e+03 7.84570542e-01 8.03914038e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 10 hdr offset: 220256 data offset: 256245760 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 32030720 79872 -32768 117 11 0 0 0 0 7031111 1 62115536 0 254 0 0 1] real hdr: [ 2.64999960e+03 7.20175811e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.42000161e+03 2.21000002e+03 7.42646223e-01 7.63464495e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 11 hdr offset: 220768 data offset: 256884736 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 32110592 79872 -32768 117 12 0 0 0 0 7031111 1 62271936 0 254 0 0 1] real hdr: [ 3.12999986e+03 6.74392534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.88000152e+03 2.64999960e+03 6.98050213e-01 7.20175811e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 12 hdr offset: 221280 data offset: 257523712 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 32190464 79872 -32768 117 13 0 0 0 0 7031111 1 62428336 0 254 0 0 1] real hdr: [ 3.65000079e+03 6.26490534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.37999819e+03 3.12999986e+03 6.51142688e-01 6.74392534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 13 hdr offset: 221792 data offset: 258162688 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 32270336 79872 -32768 117 14 0 0 0 0 7031111 1 62584736 0 254 0 0 1] real hdr: [ 4.20999847e+03 5.76877346e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.91999946e+03 3.65000079e+03 6.02314441e-01 6.26490534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 14 hdr offset: 222304 data offset: 258801664 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 32350208 79872 -32768 117 15 0 0 0 0 7031111 1 62741136 0 254 0 0 1] real hdr: [ 4.81000075e+03 5.25990788e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.50000140e+03 4.20999847e+03 5.51988701e-01 5.76877346e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 15 hdr offset: 222816 data offset: 259440640 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 32430080 79872 -32768 117 16 0 0 0 0 7031111 1 62897536 0 254 0 0 1] real hdr: [ 5.44999978e+03 4.74301366e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.12000009e+03 4.81000075e+03 5.00619965e-01 5.25990788e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 16 hdr offset: 223328 data offset: 260079616 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 32509952 79872 -32768 117 17 0 0 0 0 7031111 1 63053936 0 254 0 0 1] real hdr: [ 6.12999948e+03 4.22309896e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.77999946e+03 5.44999978e+03 4.48693382e-01 4.74301366e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 17 hdr offset: 223840 data offset: 260718592 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 32589824 79872 -32768 117 18 0 0 0 0 7031111 1 63210336 0 254 0 0 1] real hdr: [ 6.84999986e+03 3.70548863e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.47999950e+03 6.12999948e+03 3.96725773e-01 4.22309896e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 18 hdr offset: 224352 data offset: 261357568 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 32669696 79872 -32768 117 19 0 0 0 0 7031111 1 63366736 0 254 0 0 1] real hdr: [ 7.61000092e+03 3.19582071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.22000022e+03 6.84999986e+03 3.45265283e-01 3.70548863e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 19 hdr offset: 224864 data offset: 261996544 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 32749568 79872 -32768 117 20 0 0 0 0 7031111 1 63523136 0 254 0 0 1] real hdr: [ 8.40999873e+03 2.70004882e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00000162e+03 7.61000092e+03 2.94891378e-01 3.19582071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 20 hdr offset: 225376 data offset: 262635520 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 32829440 79872 -32768 117 21 0 0 0 0 7031111 1 63679536 0 254 0 0 1] real hdr: [ 9.25000113e+03 2.22443261e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.81999976e+03 8.40999873e+03 2.46215071e-01 2.70004882e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 21 hdr offset: 225888 data offset: 263274496 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 32909312 79872 -32768 117 22 0 0 0 0 7031111 1 63835936 0 254 0 0 1] real hdr: [ 1.01300003e+04 1.77555424e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.67999858e+03 9.25000113e+03 1.99878209e-01 2.22443261e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 22 hdr offset: 226400 data offset: 263913472 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 32989184 79872 -32768 117 23 0 0 0 0 7031111 1 63992336 0 254 0 0 1] real hdr: [ 1.10500001e+04 1.36030234e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.05799981e+04 1.01300003e+04 1.56554224e-01 1.77555424e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 23 hdr offset: 226912 data offset: 264552448 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 33069056 79872 -32768 117 24 0 0 0 0 7031111 1 64148736 0 254 0 0 1] real hdr: [ 1.20100006e+04 9.85881076e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.15199982e+04 1.10500001e+04 1.16947874e-01 1.36030234e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 24 hdr offset: 227424 data offset: 265191424 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 33148928 79872 -32768 117 25 0 0 0 0 7031111 1 64305136 0 254 0 0 1] real hdr: [ 1.30100018e+04 6.59807861e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.24999991e+04 1.20100006e+04 8.17952369e-02 9.85881076e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 25 hdr offset: 227936 data offset: 265830400 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 33228800 79872 -32768 117 26 0 0 0 0 7031111 1 64461536 0 254 0 0 1] real hdr: [ 1.40504001e+04 3.89823900e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.35200006e+04 1.30100018e+04 5.18637157e-02 6.59807861e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 26 hdr offset: 228448 data offset: 266469376 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 33308672 79872 -32768 117 27 0 0 0 0 7031111 1 64617936 0 254 0 0 1] real hdr: [ 1.51377198e+04 1.83146873e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.45807997e+04 1.40504001e+04 2.79368177e-02 3.89823900e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 27 hdr offset: 228960 data offset: 267108352 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 33388544 79872 -32768 117 28 0 0 0 0 7031111 1 64774336 0 254 0 0 1] real hdr: [ 1.62849737e+04 4.87210933e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.56946399e+04 1.51377198e+04 1.07164793e-02 1.83146873e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 28 hdr offset: 229472 data offset: 267747328 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 33468416 79872 -32768 117 29 0 0 0 0 7031111 1 64930736 0 254 0 0 1] real hdr: [ 1.75069688e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.68753114e+04 1.62849737e+04 1.30179090e-03 4.87210933e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 29 hdr offset: 229984 data offset: 268386304 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 33548288 79872 -32768 117 30 0 0 0 0 7031111 1 65087136 0 254 0 0 1] real hdr: [ 1.88208202e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81386262e+04 1.75069688e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 30 hdr offset: 230496 data offset: 269025280 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 33628160 79872 -32768 117 31 0 0 0 0 7031111 1 65243536 0 254 0 0 1] real hdr: [ 2.02465990e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.95030104e+04 1.88208202e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 31 hdr offset: 231008 data offset: 269664256 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 33708032 79872 -32768 117 32 0 0 0 0 7031111 1 65399936 0 254 0 0 1] real hdr: [ 2.18081366e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.09901876e+04 2.02465990e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 32 hdr offset: 231520 data offset: 270303232 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 33787904 79872 -32768 117 33 0 0 0 0 7031111 1 65556336 0 254 0 0 1] real hdr: [ 2.35421836e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.26260817e+04 2.18081366e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 33 hdr offset: 232032 data offset: 270942208 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 33867776 79872 -32768 117 34 0 0 0 0 7031111 1 65712736 0 254 0 0 1] real hdr: [ 2.55209609e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.44582854e+04 2.35421836e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 34 hdr offset: 232544 data offset: 271581184 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 33947648 79872 -32768 117 35 0 0 0 0 7031111 1 65869136 0 254 0 0 1] real hdr: [ 2.79013583e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.65836402e+04 2.55209609e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 35 hdr offset: 233056 data offset: 272220160 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 34027520 79872 -32768 117 36 0 0 0 0 7031111 1 66025536 0 254 0 0 1] real hdr: [ 3.10638886e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.92190802e+04 2.79013583e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 36 hdr offset: 233568 data offset: 272859136 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 34107392 79872 -32768 117 37 0 0 0 0 7031111 1 66181936 0 254 0 0 1] real hdr: [ 3.60817633e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.29086931e+04 3.10638886e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 58 record 37 hdr offset: 234080 data offset: 273498112 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 79 0 0 65 0 0 34187264 79872 -32768 117 38 0 0 0 0 7031111 1 66338336 0 254 0 0 1] real hdr: [ 4.24279038e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.92548336e+04 3.60817633e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 59: nz = 39, nt = 1 var 59 record 0 hdr offset: 234592 data offset: 274137088 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 34267136 79872 -32768 421 1 0 0 0 0 7031111 1 66494736 0 255 0 0 1] real hdr: [ 2.00003377e+01 9.97716462e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.99820611e+00 0.00000000e+00 9.98858129e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.00440848 1.00441313 1.00441802 ..., 1.00330508 1.00329137 1.00327766] ----------------------- var 59 record 1 hdr offset: 235104 data offset: 274776064 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 34347008 79872 -32768 421 2 0 0 0 0 7031111 1 66651136 0 255 0 0 1] real hdr: [ 8.00013508e+01 9.90881510e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.99988815e+01 2.00003377e+01 9.94296273e-01 9.97716462e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.00310576 1.00311029 1.00311518 ..., 1.00200462 1.0019908 1.00197709] ----------------------- var 59 record 2 hdr offset: 235616 data offset: 275415040 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 34426880 79872 -32768 421 3 0 0 0 0 7031111 1 66807536 0 255 0 0 1] real hdr: [ 1.79999114e+02 9.79542572e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30000232e+02 8.00013508e+01 9.85203885e-01 9.90881510e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.00049949 1.0005039 1.00050855 ..., 0.99940264 0.99938869 0.99937475] ----------------------- var 59 record 3 hdr offset: 236128 data offset: 276054016 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 34506752 79872 -32768 421 4 0 0 0 0 7031111 1 66963936 0 255 0 0 1] real hdr: [ 3.20001478e+02 9.63777064e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.49998333e+02 1.79999114e+02 9.71644051e-01 9.79542572e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.99658984 0.99659395 0.9965983 ..., 0.99549949 0.99548531 0.99547118] ----------------------- var 59 record 4 hdr offset: 236640 data offset: 276692992 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 34586624 79872 -32768 421 5 0 0 0 0 7031111 1 67120336 0 255 0 0 1] real hdr: [ 5.00000592e+02 9.43695500e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.10001035e+02 3.20001478e+02 9.53709855e-01 9.63777064e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.99137586 0.99137956 0.99138355 ..., 0.99031055 0.99029523 0.99027985] ----------------------- var 59 record 5 hdr offset: 237152 data offset: 277331968 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 34666496 79872 -32768 421 6 0 0 0 0 7031111 1 67276736 0 255 0 0 1] real hdr: [ 7.20000381e+02 9.19438386e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.10000486e+02 5.00000592e+02 9.31527464e-01 9.43695500e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.98485768 0.98486108 0.98486471 ..., 0.98390335 0.9838866 0.98386979] ----------------------- var 59 record 6 hdr offset: 237664 data offset: 277970944 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 34746368 79872 -32768 421 7 0 0 0 0 7031111 1 67433136 0 255 0 0 1] real hdr: [ 9.80000846e+02 8.91177995e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.50000613e+02 7.20000381e+02 9.05253051e-01 9.19438386e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.97705424 0.97705632 0.97705847 ..., 0.97627604 0.97625768 0.9762392 ] ----------------------- var 59 record 7 hdr offset: 238176 data offset: 278609920 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 34826240 79872 -32768 421 8 0 0 0 0 7031111 1 67589536 0 255 0 0 1] real hdr: [ 1.27999806e+03 8.59118341e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.13000142e+03 9.80000846e+02 8.75074549e-01 8.91177995e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.96797717 0.9679774 0.9679774 ..., 0.96741456 0.96739423 0.96737385] ----------------------- var 59 record 8 hdr offset: 238688 data offset: 279248896 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 34906112 79872 -32768 421 9 0 0 0 0 7031111 1 67745936 0 255 0 0 1] real hdr: [ 1.61999988e+03 8.23493502e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.44999897e+03 1.27999806e+03 8.41211628e-01 8.59118341e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.95764154 0.95763958 0.95763689 ..., 0.95733428 0.95731109 0.95728773] ----------------------- var 59 record 9 hdr offset: 239200 data offset: 279887872 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 34985984 79872 -32768 421 10 0 0 0 0 7031111 1 67902336 0 255 0 0 1] real hdr: [ 1.99999844e+03 7.84570542e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81000112e+03 1.61999988e+03 8.03914038e-01 8.23493502e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.94607085 0.94606858 0.94606549 ..., 0.9460324 0.94600528 0.94597811] ----------------------- var 59 record 10 hdr offset: 239712 data offset: 280526848 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 35065856 79872 -32768 421 11 0 0 0 0 7031111 1 68058736 0 255 0 0 1] real hdr: [ 2.42000161e+03 7.42646223e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.21000002e+03 1.99999844e+03 7.63464495e-01 7.84570542e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.933339 0.93334031 0.93334085 ..., 0.93351102 0.9334808 0.93345046] ----------------------- var 59 record 11 hdr offset: 240224 data offset: 281165824 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 35145728 79872 -32768 421 12 0 0 0 0 7031111 1 68215136 0 255 0 0 1] real hdr: [ 2.88000152e+03 6.98050213e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.64999960e+03 2.42000161e+03 7.20175811e-01 7.42646223e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.91947442 0.91947526 0.91947556 ..., 0.91976589 0.91973567 0.91970539] ----------------------- var 59 record 12 hdr offset: 240736 data offset: 281804800 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 35225600 79872 -32768 421 13 0 0 0 0 7031111 1 68371536 0 255 0 0 1] real hdr: [ 3.37999819e+03 6.51142688e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.12999986e+03 2.88000152e+03 6.74392534e-01 6.98050213e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.90440482 0.90440571 0.90440625 ..., 0.90479803 0.90476954 0.90474093] ----------------------- var 59 record 13 hdr offset: 241248 data offset: 282443776 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 35305472 79872 -32768 421 14 0 0 0 0 7031111 1 68527936 0 255 0 0 1] real hdr: [ 3.91999946e+03 6.02314441e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.65000079e+03 3.37999819e+03 6.26490534e-01 6.51142688e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.88816124 0.88816214 0.88816273 ..., 0.88864559 0.88862014 0.88859451] ----------------------- var 59 record 14 hdr offset: 241760 data offset: 283082752 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 35385344 79872 -32768 421 15 0 0 0 0 7031111 1 68684336 0 255 0 0 1] real hdr: [ 4.50000140e+03 5.51988701e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.20999847e+03 3.91999946e+03 5.76877346e-01 6.02314441e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.87080216 0.87080204 0.87080175 ..., 0.87137008 0.87134928 0.87132835] ----------------------- var 59 record 15 hdr offset: 242272 data offset: 283721728 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 35465216 79872 -32768 421 16 0 0 0 0 7031111 1 68840736 0 255 0 0 1] real hdr: [ 5.12000009e+03 5.00619965e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.81000075e+03 4.50000140e+03 5.25990788e-01 5.51988701e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.85242492 0.85242403 0.85242289 ..., 0.85302126 0.85300303 0.85298461] ----------------------- var 59 record 16 hdr offset: 242784 data offset: 284360704 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 35545088 79872 -32768 421 17 0 0 0 0 7031111 1 68997136 0 255 0 0 1] real hdr: [ 5.77999946e+03 4.48693382e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.44999978e+03 5.12000009e+03 4.74301366e-01 5.00619965e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.83305222 0.83305228 0.83305204 ..., 0.83358991 0.83357608 0.8335622 ] ----------------------- var 59 record 17 hdr offset: 243296 data offset: 284999680 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 35624960 79872 -32768 421 18 0 0 0 0 7031111 1 69153536 0 255 0 0 1] real hdr: [ 6.47999950e+03 3.96725773e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.12999948e+03 5.77999946e+03 4.22309896e-01 4.48693382e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.81271386 0.81271482 0.81271565 ..., 0.81311345 0.81310481 0.81309611] ----------------------- var 59 record 18 hdr offset: 243808 data offset: 285638656 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 35704832 79872 -32768 421 19 0 0 0 0 7031111 1 69309936 0 255 0 0 1] real hdr: [ 7.22000022e+03 3.45265283e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.84999986e+03 6.47999950e+03 3.70548863e-01 3.96725773e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.7914747 0.79147685 0.79147887 ..., 0.79159009 0.79158455 0.79157901] ----------------------- var 59 record 19 hdr offset: 244320 data offset: 286277632 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 35784704 79872 -32768 421 20 0 0 0 0 7031111 1 69466336 0 255 0 0 1] real hdr: [ 8.00000162e+03 2.94891378e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.61000092e+03 7.22000022e+03 3.19582071e-01 3.45265283e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.76933545 0.76933777 0.76933986 ..., 0.76905543 0.76905233 0.76904923] ----------------------- var 59 record 20 hdr offset: 244832 data offset: 286916608 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 35864576 79872 -32768 421 21 0 0 0 0 7031111 1 69622736 0 255 0 0 1] real hdr: [ 8.81999976e+03 2.46215071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.40999873e+03 8.00000162e+03 2.70004882e-01 2.94891378e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.74612761 0.74612981 0.74613178 ..., 0.74548745 0.74548477 0.74548221] ----------------------- var 59 record 21 hdr offset: 245344 data offset: 287555584 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 35944448 79872 -32768 421 22 0 0 0 0 7031111 1 69779136 0 255 0 0 1] real hdr: [ 9.67999858e+03 1.99878209e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.25000113e+03 8.81999976e+03 2.22443261e-01 2.46215071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.72194445 0.72194707 0.7219491 ..., 0.72088832 0.72088671 0.72088516] ----------------------- var 59 record 22 hdr offset: 245856 data offset: 288194560 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 36024320 79872 -32768 421 23 0 0 0 0 7031111 1 69935536 0 255 0 0 1] real hdr: [ 1.05799981e+04 1.56554224e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.01300003e+04 9.67999858e+03 1.77555424e-01 1.99878209e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.69675601 0.69676328 0.69677007 ..., 0.69533771 0.69533539 0.69533306] ----------------------- var 59 record 23 hdr offset: 246368 data offset: 288833536 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 36104192 79872 -32768 421 24 0 0 0 0 7031111 1 70091936 0 255 0 0 1] real hdr: [ 1.15199982e+04 1.16947874e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.10500001e+04 1.05799981e+04 1.36030234e-01 1.56554224e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.67051029 0.67051852 0.67052639 ..., 0.66890401 0.66890579 0.66890758] ----------------------- var 59 record 24 hdr offset: 246880 data offset: 289472512 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 36184064 79872 -32768 421 25 0 0 0 0 7031111 1 70248336 0 255 0 0 1] real hdr: [ 1.24999991e+04 8.17952369e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.20100006e+04 1.15199982e+04 9.85881076e-02 1.16947874e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.64332795 0.6433351 0.64334202 ..., 0.64162207 0.64162832 0.64163464] ----------------------- var 59 record 25 hdr offset: 247392 data offset: 290111488 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 36263936 79872 -32768 421 26 0 0 0 0 7031111 1 70404736 0 255 0 0 1] real hdr: [ 1.35200006e+04 5.18637157e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30100018e+04 1.24999991e+04 6.59807861e-02 8.17952369e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.61527103 0.61527753 0.61528379 ..., 0.61359924 0.6136049 0.61361063] ----------------------- var 59 record 26 hdr offset: 247904 data offset: 290750464 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 36343808 79872 -32768 421 27 0 0 0 0 7031111 1 70561136 0 255 0 0 1] real hdr: [ 1.45807997e+04 2.79368177e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.40504001e+04 1.35200006e+04 3.89823900e-02 5.18637157e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.58636189 0.58636767 0.58637321 ..., 0.58498234 0.58498532 0.58498836] ----------------------- var 59 record 27 hdr offset: 248416 data offset: 291389440 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 36423680 79872 -32768 421 28 0 0 0 0 7031111 1 70717536 0 255 0 0 1] real hdr: [ 1.56946399e+04 1.07164793e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.51377198e+04 1.45807997e+04 1.83146873e-02 2.79368177e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.55653006 0.55653322 0.55653584 ..., 0.55556512 0.55557245 0.5555799 ] ----------------------- var 59 record 28 hdr offset: 248928 data offset: 292028416 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 36503552 79872 -32768 421 29 0 0 0 0 7031111 1 70873936 0 255 0 0 1] real hdr: [ 1.68753114e+04 1.30179090e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.62849737e+04 1.56946399e+04 4.87210933e-03 1.07164793e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.52560258 0.52561033 0.5256182 ..., 0.52568555 0.52569109 0.52569664] ----------------------- var 59 record 29 hdr offset: 249440 data offset: 292667392 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 36583424 79872 -32768 421 30 0 0 0 0 7031111 1 71030336 0 255 0 0 1] real hdr: [ 1.81386262e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.75069688e+04 1.68753114e+04 0.00000000e+00 1.30179090e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.49445531 0.49445665 0.49446139 ..., 0.49548885 0.49548912 0.49548939] ----------------------- var 59 record 30 hdr offset: 249952 data offset: 293306368 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 36663296 79872 -32768 421 31 0 0 0 0 7031111 1 71186736 0 255 0 0 1] real hdr: [ 1.95030104e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.88208202e+04 1.81386262e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.4640123 0.46402034 0.46402839 ..., 0.46525845 0.46524876 0.46523917] ----------------------- var 59 record 31 hdr offset: 250464 data offset: 293945344 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 36743168 79872 -32768 421 32 0 0 0 0 7031111 1 71343136 0 255 0 0 1] real hdr: [ 2.09901876e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.02465990e+04 1.95030104e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.43383437 0.43382889 0.43382382 ..., 0.4350349 0.43502903 0.43502331] ----------------------- var 59 record 32 hdr offset: 250976 data offset: 294584320 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 36823040 79872 -32768 421 33 0 0 0 0 7031111 1 71499536 0 255 0 0 1] real hdr: [ 2.26260817e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.18081366e+04 2.09901876e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.4030593 0.40305802 0.40305865 ..., 0.40488231 0.4048771 0.40487188] ----------------------- var 59 record 33 hdr offset: 251488 data offset: 295223296 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 36902912 79872 -32768 421 34 0 0 0 0 7031111 1 71655936 0 255 0 0 1] real hdr: [ 2.44582854e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.35421836e+04 2.26260817e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.37240446 0.37240952 0.3724159 ..., 0.3744967 0.37448841 0.37448019] ----------------------- var 59 record 34 hdr offset: 252000 data offset: 295862272 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 36982784 79872 -32768 421 35 0 0 0 0 7031111 1 71812336 0 255 0 0 1] real hdr: [ 2.65836402e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.55209609e+04 2.44582854e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.34080997 0.34082222 0.34083444 ..., 0.34306052 0.34305173 0.343043 ] ----------------------- var 59 record 35 hdr offset: 252512 data offset: 296501248 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 37062656 79872 -32768 421 36 0 0 0 0 7031111 1 71968736 0 255 0 0 1] real hdr: [ 2.92190802e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.79013583e+04 2.65836402e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.30643392 0.30642691 0.30642033 ..., 0.30903757 0.30903149 0.30902559] ----------------------- var 59 record 36 hdr offset: 253024 data offset: 297140224 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 37142528 79872 -32768 421 37 0 0 0 0 7031111 1 72125136 0 255 0 0 1] real hdr: [ 3.29086931e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.10638886e+04 2.92190802e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.26696828 0.2669884 0.2670089 ..., 0.26960742 0.2695947 0.26958194] ----------------------- var 59 record 37 hdr offset: 253536 data offset: 297779200 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 37222400 79872 -32768 421 38 0 0 0 0 7031111 1 72281536 0 255 0 0 1] real hdr: [ 3.92548336e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.60817633e+04 3.29086931e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.21506505 0.21508855 0.21511248 ..., 0.21709894 0.21709184 0.21708481] ----------------------- var 59 record 38 hdr offset: 254048 data offset: 298418176 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 7 0 0 65 0 0 37302272 79872 -32768 421 39 0 0 0 0 7031111 1 72437936 0 255 0 0 1] real hdr: [ 4.24279038e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.24279038e+04 3.92548336e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.19183938 0.1918564 0.19187403 ..., 0.19325283 0.19324155 0.19323033] ----------------------- =============================== var 60: nz = 38, nt = 1 var 60 record 0 hdr offset: 254560 data offset: 299057152 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 37382144 79872 -32768 422 1 0 0 0 0 7031111 1 72594336 0 256 0 0 1] real hdr: [ 2.00003377e+01 9.97716462e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.99820611e+00 0.00000000e+00 9.98858129e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 1 hdr offset: 255072 data offset: 299696128 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 37462016 79872 -32768 422 2 0 0 0 0 7031111 1 72750736 0 256 0 0 1] real hdr: [ 8.00013508e+01 9.90881510e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.99988815e+01 2.00003377e+01 9.94296273e-01 9.97716462e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 2 hdr offset: 255584 data offset: 300335104 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 37541888 79872 -32768 422 3 0 0 0 0 7031111 1 72907136 0 256 0 0 1] real hdr: [ 1.79999114e+02 9.79542572e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30000232e+02 8.00013508e+01 9.85203885e-01 9.90881510e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 3 hdr offset: 256096 data offset: 300974080 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 37621760 79872 -32768 422 4 0 0 0 0 7031111 1 73063536 0 256 0 0 1] real hdr: [ 3.20001478e+02 9.63777064e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.49998333e+02 1.79999114e+02 9.71644051e-01 9.79542572e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 4 hdr offset: 256608 data offset: 301613056 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 37701632 79872 -32768 422 5 0 0 0 0 7031111 1 73219936 0 256 0 0 1] real hdr: [ 5.00000592e+02 9.43695500e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.10001035e+02 3.20001478e+02 9.53709855e-01 9.63777064e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 5 hdr offset: 257120 data offset: 302252032 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 37781504 79872 -32768 422 6 0 0 0 0 7031111 1 73376336 0 256 0 0 1] real hdr: [ 7.20000381e+02 9.19438386e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.10000486e+02 5.00000592e+02 9.31527464e-01 9.43695500e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 6 hdr offset: 257632 data offset: 302891008 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 37861376 79872 -32768 422 7 0 0 0 0 7031111 1 73532736 0 256 0 0 1] real hdr: [ 9.80000846e+02 8.91177995e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.50000613e+02 7.20000381e+02 9.05253051e-01 9.19438386e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 7 hdr offset: 258144 data offset: 303529984 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 37941248 79872 -32768 422 8 0 0 0 0 7031111 1 73689136 0 256 0 0 1] real hdr: [ 1.27999806e+03 8.59118341e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.13000142e+03 9.80000846e+02 8.75074549e-01 8.91177995e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 8 hdr offset: 258656 data offset: 304168960 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 38021120 79872 -32768 422 9 0 0 0 0 7031111 1 73845536 0 256 0 0 1] real hdr: [ 1.61999988e+03 8.23493502e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.44999897e+03 1.27999806e+03 8.41211628e-01 8.59118341e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 9 hdr offset: 259168 data offset: 304807936 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 38100992 79872 -32768 422 10 0 0 0 0 7031111 1 74001936 0 256 0 0 1] real hdr: [ 1.99999844e+03 7.84570542e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81000112e+03 1.61999988e+03 8.03914038e-01 8.23493502e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 10 hdr offset: 259680 data offset: 305446912 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 38180864 79872 -32768 422 11 0 0 0 0 7031111 1 74158336 0 256 0 0 1] real hdr: [ 2.42000161e+03 7.42646223e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.21000002e+03 1.99999844e+03 7.63464495e-01 7.84570542e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 11 hdr offset: 260192 data offset: 306085888 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 38260736 79872 -32768 422 12 0 0 0 0 7031111 1 74314736 0 256 0 0 1] real hdr: [ 2.88000152e+03 6.98050213e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.64999960e+03 2.42000161e+03 7.20175811e-01 7.42646223e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 12 hdr offset: 260704 data offset: 306724864 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 38340608 79872 -32768 422 13 0 0 0 0 7031111 1 74471136 0 256 0 0 1] real hdr: [ 3.37999819e+03 6.51142688e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.12999986e+03 2.88000152e+03 6.74392534e-01 6.98050213e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 13 hdr offset: 261216 data offset: 307363840 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 38420480 79872 -32768 422 14 0 0 0 0 7031111 1 74627536 0 256 0 0 1] real hdr: [ 3.91999946e+03 6.02314441e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.65000079e+03 3.37999819e+03 6.26490534e-01 6.51142688e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 14 hdr offset: 261728 data offset: 308002816 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 38500352 79872 -32768 422 15 0 0 0 0 7031111 1 74783936 0 256 0 0 1] real hdr: [ 4.50000140e+03 5.51988701e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.20999847e+03 3.91999946e+03 5.76877346e-01 6.02314441e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 15 hdr offset: 262240 data offset: 308641792 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 38580224 79872 -32768 422 16 0 0 0 0 7031111 1 74940336 0 256 0 0 1] real hdr: [ 5.12000009e+03 5.00619965e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.81000075e+03 4.50000140e+03 5.25990788e-01 5.51988701e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 16 hdr offset: 262752 data offset: 309280768 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 38660096 79872 -32768 422 17 0 0 0 0 7031111 1 75096736 0 256 0 0 1] real hdr: [ 5.77999946e+03 4.48693382e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.44999978e+03 5.12000009e+03 4.74301366e-01 5.00619965e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 17 hdr offset: 263264 data offset: 309919744 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 38739968 79872 -32768 422 18 0 0 0 0 7031111 1 75253136 0 256 0 0 1] real hdr: [ 6.47999950e+03 3.96725773e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.12999948e+03 5.77999946e+03 4.22309896e-01 4.48693382e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 18 hdr offset: 263776 data offset: 310558720 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 38819840 79872 -32768 422 19 0 0 0 0 7031111 1 75409536 0 256 0 0 1] real hdr: [ 7.22000022e+03 3.45265283e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.84999986e+03 6.47999950e+03 3.70548863e-01 3.96725773e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 19 hdr offset: 264288 data offset: 311197696 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 38899712 79872 -32768 422 20 0 0 0 0 7031111 1 75565936 0 256 0 0 1] real hdr: [ 8.00000162e+03 2.94891378e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.61000092e+03 7.22000022e+03 3.19582071e-01 3.45265283e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 20 hdr offset: 264800 data offset: 311836672 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 38979584 79872 -32768 422 21 0 0 0 0 7031111 1 75722336 0 256 0 0 1] real hdr: [ 8.81999976e+03 2.46215071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.40999873e+03 8.00000162e+03 2.70004882e-01 2.94891378e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 21 hdr offset: 265312 data offset: 312475648 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 39059456 79872 -32768 422 22 0 0 0 0 7031111 1 75878736 0 256 0 0 1] real hdr: [ 9.67999858e+03 1.99878209e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.25000113e+03 8.81999976e+03 2.22443261e-01 2.46215071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 22 hdr offset: 265824 data offset: 313114624 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 39139328 79872 -32768 422 23 0 0 0 0 7031111 1 76035136 0 256 0 0 1] real hdr: [ 1.05799981e+04 1.56554224e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.01300003e+04 9.67999858e+03 1.77555424e-01 1.99878209e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 23 hdr offset: 266336 data offset: 313753600 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 39219200 79872 -32768 422 24 0 0 0 0 7031111 1 76191536 0 256 0 0 1] real hdr: [ 1.15199982e+04 1.16947874e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.10500001e+04 1.05799981e+04 1.36030234e-01 1.56554224e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 24 hdr offset: 266848 data offset: 314392576 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 39299072 79872 -32768 422 25 0 0 0 0 7031111 1 76347936 0 256 0 0 1] real hdr: [ 1.24999991e+04 8.17952369e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.20100006e+04 1.15199982e+04 9.85881076e-02 1.16947874e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 25 hdr offset: 267360 data offset: 315031552 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 39378944 79872 -32768 422 26 0 0 0 0 7031111 1 76504336 0 256 0 0 1] real hdr: [ 1.35200006e+04 5.18637157e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30100018e+04 1.24999991e+04 6.59807861e-02 8.17952369e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 26 hdr offset: 267872 data offset: 315670528 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 39458816 79872 -32768 422 27 0 0 0 0 7031111 1 76660736 0 256 0 0 1] real hdr: [ 1.45807997e+04 2.79368177e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.40504001e+04 1.35200006e+04 3.89823900e-02 5.18637157e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 27 hdr offset: 268384 data offset: 316309504 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 39538688 79872 -32768 422 28 0 0 0 0 7031111 1 76817136 0 256 0 0 1] real hdr: [ 1.56946399e+04 1.07164793e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.51377198e+04 1.45807997e+04 1.83146873e-02 2.79368177e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 28 hdr offset: 268896 data offset: 316948480 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 39618560 79872 -32768 422 29 0 0 0 0 7031111 1 76973536 0 256 0 0 1] real hdr: [ 1.68753114e+04 1.30179090e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.62849737e+04 1.56946399e+04 4.87210933e-03 1.07164793e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 29 hdr offset: 269408 data offset: 317587456 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 39698432 79872 -32768 422 30 0 0 0 0 7031111 1 77129936 0 256 0 0 1] real hdr: [ 1.81386262e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.75069688e+04 1.68753114e+04 0.00000000e+00 1.30179090e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 30 hdr offset: 269920 data offset: 318226432 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 39778304 79872 -32768 422 31 0 0 0 0 7031111 1 77286336 0 256 0 0 1] real hdr: [ 1.95030104e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.88208202e+04 1.81386262e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 31 hdr offset: 270432 data offset: 318865408 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 39858176 79872 -32768 422 32 0 0 0 0 7031111 1 77442736 0 256 0 0 1] real hdr: [ 2.09901876e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.02465990e+04 1.95030104e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 32 hdr offset: 270944 data offset: 319504384 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 39938048 79872 -32768 422 33 0 0 0 0 7031111 1 77599136 0 256 0 0 1] real hdr: [ 2.26260817e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.18081366e+04 2.09901876e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 33 hdr offset: 271456 data offset: 320143360 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 40017920 79872 -32768 422 34 0 0 0 0 7031111 1 77755536 0 256 0 0 1] real hdr: [ 2.44582854e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.35421836e+04 2.26260817e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 34 hdr offset: 271968 data offset: 320782336 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 40097792 79872 -32768 422 35 0 0 0 0 7031111 1 77911936 0 256 0 0 1] real hdr: [ 2.65836402e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.55209609e+04 2.44582854e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 35 hdr offset: 272480 data offset: 321421312 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 40177664 79872 -32768 422 36 0 0 0 0 7031111 1 78068336 0 256 0 0 1] real hdr: [ 2.92190802e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.79013583e+04 2.65836402e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 36 hdr offset: 272992 data offset: 322060288 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 40257536 79872 -32768 422 37 0 0 0 0 7031111 1 78224736 0 256 0 0 1] real hdr: [ 3.29086931e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.10638886e+04 2.92190802e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 60 record 37 hdr offset: 273504 data offset: 322699264 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 40337408 79872 -32768 422 38 0 0 0 0 7031111 1 78381136 0 256 0 0 1] real hdr: [ 3.92548336e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.60817633e+04 3.29086931e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 61: nz = 38, nt = 1 var 61 record 0 hdr offset: 274016 data offset: 323338240 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 40417280 79872 -32768 423 1 0 0 0 0 7031111 1 78537536 0 257 0 0 1] real hdr: [ 2.00003377e+01 9.97716462e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.99820611e+00 0.00000000e+00 9.98858129e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 1 hdr offset: 274528 data offset: 323977216 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 40497152 79872 -32768 423 2 0 0 0 0 7031111 1 78693476 0 257 0 0 1] real hdr: [ 8.00013508e+01 9.90881510e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.99988815e+01 2.00003377e+01 9.94296273e-01 9.97716462e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 2 hdr offset: 275040 data offset: 324616192 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 40577024 79872 -32768 423 3 0 0 0 0 7031111 1 78849416 0 257 0 0 1] real hdr: [ 1.79999114e+02 9.79542572e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30000232e+02 8.00013508e+01 9.85203885e-01 9.90881510e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 3 hdr offset: 275552 data offset: 325255168 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 40656896 79872 -32768 423 4 0 0 0 0 7031111 1 79005356 0 257 0 0 1] real hdr: [ 3.20001478e+02 9.63777064e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.49998333e+02 1.79999114e+02 9.71644051e-01 9.79542572e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 4 hdr offset: 276064 data offset: 325894144 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 40736768 79872 -32768 423 5 0 0 0 0 7031111 1 79161296 0 257 0 0 1] real hdr: [ 5.00000592e+02 9.43695500e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.10001035e+02 3.20001478e+02 9.53709855e-01 9.63777064e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 5 hdr offset: 276576 data offset: 326533120 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 40816640 79872 -32768 423 6 0 0 0 0 7031111 1 79317236 0 257 0 0 1] real hdr: [ 7.20000381e+02 9.19438386e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.10000486e+02 5.00000592e+02 9.31527464e-01 9.43695500e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 6 hdr offset: 277088 data offset: 327172096 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 40896512 79872 -32768 423 7 0 0 0 0 7031111 1 79473176 0 257 0 0 1] real hdr: [ 9.80000846e+02 8.91177995e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.50000613e+02 7.20000381e+02 9.05253051e-01 9.19438386e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 7 hdr offset: 277600 data offset: 327811072 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 40976384 79872 -32768 423 8 0 0 0 0 7031111 1 79629116 0 257 0 0 1] real hdr: [ 1.27999806e+03 8.59118341e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.13000142e+03 9.80000846e+02 8.75074549e-01 8.91177995e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 8 hdr offset: 278112 data offset: 328450048 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 41056256 79872 -32768 423 9 0 0 0 0 7031111 1 79785056 0 257 0 0 1] real hdr: [ 1.61999988e+03 8.23493502e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.44999897e+03 1.27999806e+03 8.41211628e-01 8.59118341e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 9 hdr offset: 278624 data offset: 329089024 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 41136128 79872 -32768 423 10 0 0 0 0 7031111 1 79940996 0 257 0 0 1] real hdr: [ 1.99999844e+03 7.84570542e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81000112e+03 1.61999988e+03 8.03914038e-01 8.23493502e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 10 hdr offset: 279136 data offset: 329728000 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 41216000 79872 -32768 423 11 0 0 0 0 7031111 1 80096936 0 257 0 0 1] real hdr: [ 2.42000161e+03 7.42646223e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.21000002e+03 1.99999844e+03 7.63464495e-01 7.84570542e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 11 hdr offset: 279648 data offset: 330366976 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 41295872 79872 -32768 423 12 0 0 0 0 7031111 1 80252876 0 257 0 0 1] real hdr: [ 2.88000152e+03 6.98050213e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.64999960e+03 2.42000161e+03 7.20175811e-01 7.42646223e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 12 hdr offset: 280160 data offset: 331005952 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 41375744 79872 -32768 423 13 0 0 0 0 7031111 1 80408816 0 257 0 0 1] real hdr: [ 3.37999819e+03 6.51142688e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.12999986e+03 2.88000152e+03 6.74392534e-01 6.98050213e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 13 hdr offset: 280672 data offset: 331644928 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 41455616 79872 -32768 423 14 0 0 0 0 7031111 1 80564756 0 257 0 0 1] real hdr: [ 3.91999946e+03 6.02314441e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.65000079e+03 3.37999819e+03 6.26490534e-01 6.51142688e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 14 hdr offset: 281184 data offset: 332283904 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 41535488 79872 -32768 423 15 0 0 0 0 7031111 1 80720696 0 257 0 0 1] real hdr: [ 4.50000140e+03 5.51988701e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.20999847e+03 3.91999946e+03 5.76877346e-01 6.02314441e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 15 hdr offset: 281696 data offset: 332922880 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 41615360 79872 -32768 423 16 0 0 0 0 7031111 1 80876636 0 257 0 0 1] real hdr: [ 5.12000009e+03 5.00619965e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.81000075e+03 4.50000140e+03 5.25990788e-01 5.51988701e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 16 hdr offset: 282208 data offset: 333561856 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 41695232 79872 -32768 423 17 0 0 0 0 7031111 1 81032576 0 257 0 0 1] real hdr: [ 5.77999946e+03 4.48693382e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.44999978e+03 5.12000009e+03 4.74301366e-01 5.00619965e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 17 hdr offset: 282720 data offset: 334200832 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 41775104 79872 -32768 423 18 0 0 0 0 7031111 1 81188516 0 257 0 0 1] real hdr: [ 6.47999950e+03 3.96725773e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.12999948e+03 5.77999946e+03 4.22309896e-01 4.48693382e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 18 hdr offset: 283232 data offset: 334839808 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 41854976 79872 -32768 423 19 0 0 0 0 7031111 1 81344456 0 257 0 0 1] real hdr: [ 7.22000022e+03 3.45265283e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.84999986e+03 6.47999950e+03 3.70548863e-01 3.96725773e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 19 hdr offset: 283744 data offset: 335478784 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 41934848 79872 -32768 423 20 0 0 0 0 7031111 1 81500396 0 257 0 0 1] real hdr: [ 8.00000162e+03 2.94891378e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.61000092e+03 7.22000022e+03 3.19582071e-01 3.45265283e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 20 hdr offset: 284256 data offset: 336117760 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 42014720 79872 -32768 423 21 0 0 0 0 7031111 1 81656336 0 257 0 0 1] real hdr: [ 8.81999976e+03 2.46215071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.40999873e+03 8.00000162e+03 2.70004882e-01 2.94891378e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 21 hdr offset: 284768 data offset: 336756736 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 42094592 79872 -32768 423 22 0 0 0 0 7031111 1 81812276 0 257 0 0 1] real hdr: [ 9.67999858e+03 1.99878209e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.25000113e+03 8.81999976e+03 2.22443261e-01 2.46215071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 22 hdr offset: 285280 data offset: 337395712 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 42174464 79872 -32768 423 23 0 0 0 0 7031111 1 81968216 0 257 0 0 1] real hdr: [ 1.05799981e+04 1.56554224e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.01300003e+04 9.67999858e+03 1.77555424e-01 1.99878209e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 23 hdr offset: 285792 data offset: 338034688 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 42254336 79872 -32768 423 24 0 0 0 0 7031111 1 82124156 0 257 0 0 1] real hdr: [ 1.15199982e+04 1.16947874e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.10500001e+04 1.05799981e+04 1.36030234e-01 1.56554224e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 24 hdr offset: 286304 data offset: 338673664 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 42334208 79872 -32768 423 25 0 0 0 0 7031111 1 82280096 0 257 0 0 1] real hdr: [ 1.24999991e+04 8.17952369e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.20100006e+04 1.15199982e+04 9.85881076e-02 1.16947874e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 25 hdr offset: 286816 data offset: 339312640 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 42414080 79872 -32768 423 26 0 0 0 0 7031111 1 82436036 0 257 0 0 1] real hdr: [ 1.35200006e+04 5.18637157e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30100018e+04 1.24999991e+04 6.59807861e-02 8.17952369e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 26 hdr offset: 287328 data offset: 339951616 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 42493952 79872 -32768 423 27 0 0 0 0 7031111 1 82591976 0 257 0 0 1] real hdr: [ 1.45807997e+04 2.79368177e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.40504001e+04 1.35200006e+04 3.89823900e-02 5.18637157e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 27 hdr offset: 287840 data offset: 340590592 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 42573824 79872 -32768 423 28 0 0 0 0 7031111 1 82747916 0 257 0 0 1] real hdr: [ 1.56946399e+04 1.07164793e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.51377198e+04 1.45807997e+04 1.83146873e-02 2.79368177e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 28 hdr offset: 288352 data offset: 341229568 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 42653696 79872 -32768 423 29 0 0 0 0 7031111 1 82903856 0 257 0 0 1] real hdr: [ 1.68753114e+04 1.30179090e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.62849737e+04 1.56946399e+04 4.87210933e-03 1.07164793e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 29 hdr offset: 288864 data offset: 341868544 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 42733568 79872 -32768 423 30 0 0 0 0 7031111 1 83059796 0 257 0 0 1] real hdr: [ 1.81386262e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.75069688e+04 1.68753114e+04 0.00000000e+00 1.30179090e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 30 hdr offset: 289376 data offset: 342507520 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 42813440 79872 -32768 423 31 0 0 0 0 7031111 1 83215736 0 257 0 0 1] real hdr: [ 1.95030104e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.88208202e+04 1.81386262e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 31 hdr offset: 289888 data offset: 343146496 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 42893312 79872 -32768 423 32 0 0 0 0 7031111 1 83371676 0 257 0 0 1] real hdr: [ 2.09901876e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.02465990e+04 1.95030104e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 32 hdr offset: 290400 data offset: 343785472 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 42973184 79872 -32768 423 33 0 0 0 0 7031111 1 83527616 0 257 0 0 1] real hdr: [ 2.26260817e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.18081366e+04 2.09901876e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 33 hdr offset: 290912 data offset: 344424448 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 43053056 79872 -32768 423 34 0 0 0 0 7031111 1 83683556 0 257 0 0 1] real hdr: [ 2.44582854e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.35421836e+04 2.26260817e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 34 hdr offset: 291424 data offset: 345063424 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 43132928 79872 -32768 423 35 0 0 0 0 7031111 1 83839496 0 257 0 0 1] real hdr: [ 2.65836402e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.55209609e+04 2.44582854e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 35 hdr offset: 291936 data offset: 345702400 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 43212800 79872 -32768 423 36 0 0 0 0 7031111 1 83995436 0 257 0 0 1] real hdr: [ 2.92190802e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.79013583e+04 2.65836402e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 36 hdr offset: 292448 data offset: 346341376 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 43292672 79872 -32768 423 37 0 0 0 0 7031111 1 84151376 0 257 0 0 1] real hdr: [ 3.29086931e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.10638886e+04 2.92190802e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 61 record 37 hdr offset: 292960 data offset: 346980352 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 155940 101 3 339 460 0 2 2 57 0 0 65 0 0 43372544 79872 -32768 423 38 0 0 0 0 7031111 1 84307316 0 257 0 0 1] real hdr: [ 3.92548336e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.60817633e+04 3.29086931e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 62: nz = 39, nt = 1 var 62 record 0 hdr offset: 293472 data offset: 347619328 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 43452416 79872 -32768 424 9999 0 0 0 0 7031111 1 84463256 0 258 0 0 1] real hdr: [ 9.99820611e+00 9.98858129e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 1 hdr offset: 293984 data offset: 348258304 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 43532288 79872 -32768 424 1 0 0 0 0 7031111 1 84619656 0 258 0 0 1] real hdr: [ 4.99988815e+01 9.94296273e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.00003377e+01 0.00000000e+00 9.97716462e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 2 hdr offset: 294496 data offset: 348897280 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 43612160 79872 -32768 424 2 0 0 0 0 7031111 1 84776056 0 258 0 0 1] real hdr: [ 1.30000232e+02 9.85203885e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00013508e+01 4.99988815e+01 9.90881510e-01 9.94296273e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 3 hdr offset: 295008 data offset: 349536256 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 43692032 79872 -32768 424 3 0 0 0 0 7031111 1 84932456 0 258 0 0 1] real hdr: [ 2.49998333e+02 9.71644051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.79999114e+02 1.30000232e+02 9.79542572e-01 9.85203885e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 4 hdr offset: 295520 data offset: 350175232 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 43771904 79872 -32768 424 4 0 0 0 0 7031111 1 85088856 0 258 0 0 1] real hdr: [ 4.10001035e+02 9.53709855e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.20001478e+02 2.49998333e+02 9.63777064e-01 9.71644051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 5 hdr offset: 296032 data offset: 350814208 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 43851776 79872 -32768 424 5 0 0 0 0 7031111 1 85245256 0 258 0 0 1] real hdr: [ 6.10000486e+02 9.31527464e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.00000592e+02 4.10001035e+02 9.43695500e-01 9.53709855e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 6 hdr offset: 296544 data offset: 351453184 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 43931648 79872 -32768 424 6 0 0 0 0 7031111 1 85401656 0 258 0 0 1] real hdr: [ 8.50000613e+02 9.05253051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.20000381e+02 6.10000486e+02 9.19438386e-01 9.31527464e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 7 hdr offset: 297056 data offset: 352092160 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 44011520 79872 -32768 424 7 0 0 0 0 7031111 1 85558056 0 258 0 0 1] real hdr: [ 1.13000142e+03 8.75074549e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.80000846e+02 8.50000613e+02 8.91177995e-01 9.05253051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 8 hdr offset: 297568 data offset: 352731136 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 44091392 79872 -32768 424 8 0 0 0 0 7031111 1 85714456 0 258 0 0 1] real hdr: [ 1.44999897e+03 8.41211628e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.27999806e+03 1.13000142e+03 8.59118341e-01 8.75074549e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 9 hdr offset: 298080 data offset: 353370112 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 44171264 79872 -32768 424 9 0 0 0 0 7031111 1 85870856 0 258 0 0 1] real hdr: [ 1.81000112e+03 8.03914038e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.61999988e+03 1.44999897e+03 8.23493502e-01 8.41211628e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 10 hdr offset: 298592 data offset: 354009088 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 44251136 79872 -32768 424 10 0 0 0 0 7031111 1 86027256 0 258 0 0 1] real hdr: [ 2.21000002e+03 7.63464495e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.99999844e+03 1.81000112e+03 7.84570542e-01 8.03914038e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 11 hdr offset: 299104 data offset: 354648064 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 44331008 79872 -32768 424 11 0 0 0 0 7031111 1 86183656 0 258 0 0 1] real hdr: [ 2.64999960e+03 7.20175811e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.42000161e+03 2.21000002e+03 7.42646223e-01 7.63464495e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 12 hdr offset: 299616 data offset: 355287040 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 44410880 79872 -32768 424 12 0 0 0 0 7031111 1 86340056 0 258 0 0 1] real hdr: [ 3.12999986e+03 6.74392534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.88000152e+03 2.64999960e+03 6.98050213e-01 7.20175811e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 13 hdr offset: 300128 data offset: 355926016 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 44490752 79872 -32768 424 13 0 0 0 0 7031111 1 86496456 0 258 0 0 1] real hdr: [ 3.65000079e+03 6.26490534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.37999819e+03 3.12999986e+03 6.51142688e-01 6.74392534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 14 hdr offset: 300640 data offset: 356564992 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 44570624 79872 -32768 424 14 0 0 0 0 7031111 1 86652856 0 258 0 0 1] real hdr: [ 4.20999847e+03 5.76877346e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.91999946e+03 3.65000079e+03 6.02314441e-01 6.26490534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 15 hdr offset: 301152 data offset: 357203968 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 44650496 79872 -32768 424 15 0 0 0 0 7031111 1 86809256 0 258 0 0 1] real hdr: [ 4.81000075e+03 5.25990788e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.50000140e+03 4.20999847e+03 5.51988701e-01 5.76877346e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 16 hdr offset: 301664 data offset: 357842944 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 44730368 79872 -32768 424 16 0 0 0 0 7031111 1 86965656 0 258 0 0 1] real hdr: [ 5.44999978e+03 4.74301366e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.12000009e+03 4.81000075e+03 5.00619965e-01 5.25990788e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 17 hdr offset: 302176 data offset: 358481920 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 44810240 79872 -32768 424 17 0 0 0 0 7031111 1 87122056 0 258 0 0 1] real hdr: [ 6.12999948e+03 4.22309896e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.77999946e+03 5.44999978e+03 4.48693382e-01 4.74301366e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 18 hdr offset: 302688 data offset: 359120896 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 44890112 79872 -32768 424 18 0 0 0 0 7031111 1 87278456 0 258 0 0 1] real hdr: [ 6.84999986e+03 3.70548863e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.47999950e+03 6.12999948e+03 3.96725773e-01 4.22309896e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 19 hdr offset: 303200 data offset: 359759872 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 44969984 79872 -32768 424 19 0 0 0 0 7031111 1 87434856 0 258 0 0 1] real hdr: [ 7.61000092e+03 3.19582071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.22000022e+03 6.84999986e+03 3.45265283e-01 3.70548863e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 20 hdr offset: 303712 data offset: 360398848 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 45049856 79872 -32768 424 20 0 0 0 0 7031111 1 87591256 0 258 0 0 1] real hdr: [ 8.40999873e+03 2.70004882e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00000162e+03 7.61000092e+03 2.94891378e-01 3.19582071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 21 hdr offset: 304224 data offset: 361037824 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 45129728 79872 -32768 424 21 0 0 0 0 7031111 1 87747656 0 258 0 0 1] real hdr: [ 9.25000113e+03 2.22443261e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.81999976e+03 8.40999873e+03 2.46215071e-01 2.70004882e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 22 hdr offset: 304736 data offset: 361676800 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 45209600 79872 -32768 424 22 0 0 0 0 7031111 1 87904056 0 258 0 0 1] real hdr: [ 1.01300003e+04 1.77555424e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.67999858e+03 9.25000113e+03 1.99878209e-01 2.22443261e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 23 hdr offset: 305248 data offset: 362315776 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 45289472 79872 -32768 424 23 0 0 0 0 7031111 1 88060456 0 258 0 0 1] real hdr: [ 1.10500001e+04 1.36030234e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.05799981e+04 1.01300003e+04 1.56554224e-01 1.77555424e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 24 hdr offset: 305760 data offset: 362954752 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 45369344 79872 -32768 424 24 0 0 0 0 7031111 1 88216856 0 258 0 0 1] real hdr: [ 1.20100006e+04 9.85881076e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.15199982e+04 1.10500001e+04 1.16947874e-01 1.36030234e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 25 hdr offset: 306272 data offset: 363593728 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 45449216 79872 -32768 424 25 0 0 0 0 7031111 1 88373256 0 258 0 0 1] real hdr: [ 1.30100018e+04 6.59807861e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.24999991e+04 1.20100006e+04 8.17952369e-02 9.85881076e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 26 hdr offset: 306784 data offset: 364232704 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 45529088 79872 -32768 424 26 0 0 0 0 7031111 1 88529656 0 258 0 0 1] real hdr: [ 1.40504001e+04 3.89823900e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.35200006e+04 1.30100018e+04 5.18637157e-02 6.59807861e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 27 hdr offset: 307296 data offset: 364871680 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 45608960 79872 -32768 424 27 0 0 0 0 7031111 1 88686056 0 258 0 0 1] real hdr: [ 1.51377198e+04 1.83146873e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.45807997e+04 1.40504001e+04 2.79368177e-02 3.89823900e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 28 hdr offset: 307808 data offset: 365510656 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 45688832 79872 -32768 424 28 0 0 0 0 7031111 1 88842456 0 258 0 0 1] real hdr: [ 1.62849737e+04 4.87210933e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.56946399e+04 1.51377198e+04 1.07164793e-02 1.83146873e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 29 hdr offset: 308320 data offset: 366149632 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 45768704 79872 -32768 424 29 0 0 0 0 7031111 1 88998856 0 258 0 0 1] real hdr: [ 1.75069688e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.68753114e+04 1.62849737e+04 1.30179090e-03 4.87210933e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 30 hdr offset: 308832 data offset: 366788608 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 45848576 79872 -32768 424 30 0 0 0 0 7031111 1 89155256 0 258 0 0 1] real hdr: [ 1.88208202e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81386262e+04 1.75069688e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 31 hdr offset: 309344 data offset: 367427584 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 45928448 79872 -32768 424 31 0 0 0 0 7031111 1 89311656 0 258 0 0 1] real hdr: [ 2.02465990e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.95030104e+04 1.88208202e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 32 hdr offset: 309856 data offset: 368066560 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 46008320 79872 -32768 424 32 0 0 0 0 7031111 1 89468056 0 258 0 0 1] real hdr: [ 2.18081366e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.09901876e+04 2.02465990e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 33 hdr offset: 310368 data offset: 368705536 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 46088192 79872 -32768 424 33 0 0 0 0 7031111 1 89624456 0 258 0 0 1] real hdr: [ 2.35421836e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.26260817e+04 2.18081366e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 34 hdr offset: 310880 data offset: 369344512 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 46168064 79872 -32768 424 34 0 0 0 0 7031111 1 89780856 0 258 0 0 1] real hdr: [ 2.55209609e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.44582854e+04 2.35421836e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 35 hdr offset: 311392 data offset: 369983488 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 46247936 79872 -32768 424 35 0 0 0 0 7031111 1 89937256 0 258 0 0 1] real hdr: [ 2.79013583e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.65836402e+04 2.55209609e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 36 hdr offset: 311904 data offset: 370622464 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 46327808 79872 -32768 424 36 0 0 0 0 7031111 1 90093656 0 258 0 0 1] real hdr: [ 3.10638886e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.92190802e+04 2.79013583e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 37 hdr offset: 312416 data offset: 371261440 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 46407680 79872 -32768 424 37 0 0 0 0 7031111 1 90250056 0 258 0 0 1] real hdr: [ 3.60817633e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.29086931e+04 3.10638886e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 62 record 38 hdr offset: 312928 data offset: 371900416 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 42 0 0 65 0 0 46487552 79872 -32768 424 38 0 0 0 0 7031111 1 90406456 0 258 0 0 1] real hdr: [ 4.24279038e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.92548336e+04 3.60817633e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 63: nz = 1, nt = 1 var 63 record 0 hdr offset: 313440 data offset: 372539392 disk length: 156400 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 0 2 0 0 0 0 0 0 46567424 157696 -32768 5 0 0 0 0 0 7031111 2 90562856 0 259 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = integer nwords = 156400 data: [5 5 5 ..., 3 3 3] ----------------------- =============================== var 64: nz = 1, nt = 1 var 64 record 0 hdr offset: 313952 data offset: 373800960 disk length: 156400 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 0 2 0 0 0 143 0 0 46725120 157696 -32768 6 0 0 0 0 0 7031111 2 90719256 0 260 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = integer nwords = 156400 data: [0 0 0 ..., 0 0 0] ----------------------- =============================== var 65: nz = 1, nt = 1 var 65 record 0 hdr offset: 314464 data offset: 375062528 disk length: 156400 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 0 2 0 0 0 142 0 0 46882816 157696 -32768 6 0 0 0 0 0 7031111 2 90875656 0 261 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = integer nwords = 156400 data: [0 0 0 ..., 0 0 0] ----------------------- =============================== var 66: nz = 1, nt = 1 var 66 record 0 hdr offset: 314976 data offset: 376324096 disk length: 156400 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 0 2 0 0 0 0 0 0 47040512 157696 -32768 5 0 0 0 0 0 7031111 3 91032056 0 262 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = integer nwords = 156400 data: [1 1 1 ..., 0 0 0] ----------------------- =============================== var 67: nz = 1, nt = 1 var 67 record 0 hdr offset: 315488 data offset: 377585664 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 0 0 0 47198208 79872 -32768 6 0 0 0 0 0 7031111 1 91188456 0 263 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.0331536 0.03293961 0.03266689 ..., 0. 0. 0. ] ----------------------- =============================== var 68: nz = 1, nt = 1 var 68 record 0 hdr offset: 316000 data offset: 378224640 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 0 0 0 0 0 0 47278080 79872 -32768 6 0 0 0 0 0 7031111 1 91344856 0 264 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00019862 0.00019857 0.00019867 ..., 0.00026771 0.00026604 0.00026515] ----------------------- =============================== var 69: nz = 38, nt = 1 var 69 record 0 hdr offset: 316512 data offset: 378863616 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 47357952 79872 -32768 0 1 0 0 0 0 7031111 1 91501256 0 265 0 0 1] real hdr: [ 4.99988815e+01 9.94296273e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.00003377e+01 0.00000000e+00 9.97716462e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 1 hdr offset: 317024 data offset: 379502592 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 47437824 79872 -32768 0 2 0 0 0 0 7031111 1 91657656 0 265 0 0 1] real hdr: [ 1.30000232e+02 9.85203885e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00013508e+01 4.99988815e+01 9.90881510e-01 9.94296273e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 2 hdr offset: 317536 data offset: 380141568 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 47517696 79872 -32768 0 3 0 0 0 0 7031111 1 91814056 0 265 0 0 1] real hdr: [ 2.49998333e+02 9.71644051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.79999114e+02 1.30000232e+02 9.79542572e-01 9.85203885e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 3 hdr offset: 318048 data offset: 380780544 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 47597568 79872 -32768 0 4 0 0 0 0 7031111 1 91970456 0 265 0 0 1] real hdr: [ 4.10001035e+02 9.53709855e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.20001478e+02 2.49998333e+02 9.63777064e-01 9.71644051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 4 hdr offset: 318560 data offset: 381419520 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 47677440 79872 -32768 0 5 0 0 0 0 7031111 1 92126856 0 265 0 0 1] real hdr: [ 6.10000486e+02 9.31527464e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.00000592e+02 4.10001035e+02 9.43695500e-01 9.53709855e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 5 hdr offset: 319072 data offset: 382058496 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 47757312 79872 -32768 0 6 0 0 0 0 7031111 1 92283256 0 265 0 0 1] real hdr: [ 8.50000613e+02 9.05253051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.20000381e+02 6.10000486e+02 9.19438386e-01 9.31527464e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 6 hdr offset: 319584 data offset: 382697472 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 47837184 79872 -32768 0 7 0 0 0 0 7031111 1 92439656 0 265 0 0 1] real hdr: [ 1.13000142e+03 8.75074549e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.80000846e+02 8.50000613e+02 8.91177995e-01 9.05253051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.01471199 0.00902764 0.00420416 ..., 0. 0. 0. ] ----------------------- var 69 record 7 hdr offset: 320096 data offset: 383336448 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 47917056 79872 -32768 0 8 0 0 0 0 7031111 1 92596056 0 265 0 0 1] real hdr: [ 1.44999897e+03 8.41211628e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.27999806e+03 1.13000142e+03 8.59118341e-01 8.75074549e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.06276374 0.05513453 0.04742872 ..., 0. 0. 0. ] ----------------------- var 69 record 8 hdr offset: 320608 data offset: 383975424 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 47996928 79872 -32768 0 9 0 0 0 0 7031111 1 92752456 0 265 0 0 1] real hdr: [ 1.81000112e+03 8.03914038e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.61999988e+03 1.44999897e+03 8.23493502e-01 8.41211628e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 9 hdr offset: 321120 data offset: 384614400 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 48076800 79872 -32768 0 10 0 0 0 0 7031111 1 92908856 0 265 0 0 1] real hdr: [ 2.21000002e+03 7.63464495e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.99999844e+03 1.81000112e+03 7.84570542e-01 8.03914038e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 10 hdr offset: 321632 data offset: 385253376 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 48156672 79872 -32768 0 11 0 0 0 0 7031111 1 93065256 0 265 0 0 1] real hdr: [ 2.64999960e+03 7.20175811e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.42000161e+03 2.21000002e+03 7.42646223e-01 7.63464495e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 11 hdr offset: 322144 data offset: 385892352 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 48236544 79872 -32768 0 12 0 0 0 0 7031111 1 93221656 0 265 0 0 1] real hdr: [ 3.12999986e+03 6.74392534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.88000152e+03 2.64999960e+03 6.98050213e-01 7.20175811e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 12 hdr offset: 322656 data offset: 386531328 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 48316416 79872 -32768 0 13 0 0 0 0 7031111 1 93378056 0 265 0 0 1] real hdr: [ 3.65000079e+03 6.26490534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.37999819e+03 3.12999986e+03 6.51142688e-01 6.74392534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 13 hdr offset: 323168 data offset: 387170304 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 48396288 79872 -32768 0 14 0 0 0 0 7031111 1 93534456 0 265 0 0 1] real hdr: [ 4.20999847e+03 5.76877346e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.91999946e+03 3.65000079e+03 6.02314441e-01 6.26490534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 14 hdr offset: 323680 data offset: 387809280 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 48476160 79872 -32768 0 15 0 0 0 0 7031111 1 93690856 0 265 0 0 1] real hdr: [ 4.81000075e+03 5.25990788e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.50000140e+03 4.20999847e+03 5.51988701e-01 5.76877346e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 15 hdr offset: 324192 data offset: 388448256 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 48556032 79872 -32768 0 16 0 0 0 0 7031111 1 93847256 0 265 0 0 1] real hdr: [ 5.44999978e+03 4.74301366e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.12000009e+03 4.81000075e+03 5.00619965e-01 5.25990788e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 16 hdr offset: 324704 data offset: 389087232 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 48635904 79872 -32768 0 17 0 0 0 0 7031111 1 94003656 0 265 0 0 1] real hdr: [ 6.12999948e+03 4.22309896e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.77999946e+03 5.44999978e+03 4.48693382e-01 4.74301366e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 17 hdr offset: 325216 data offset: 389726208 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 48715776 79872 -32768 0 18 0 0 0 0 7031111 1 94160056 0 265 0 0 1] real hdr: [ 6.84999986e+03 3.70548863e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.47999950e+03 6.12999948e+03 3.96725773e-01 4.22309896e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 18 hdr offset: 325728 data offset: 390365184 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 48795648 79872 -32768 0 19 0 0 0 0 7031111 1 94316456 0 265 0 0 1] real hdr: [ 7.61000092e+03 3.19582071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.22000022e+03 6.84999986e+03 3.45265283e-01 3.70548863e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 19 hdr offset: 326240 data offset: 391004160 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 48875520 79872 -32768 0 20 0 0 0 0 7031111 1 94472856 0 265 0 0 1] real hdr: [ 8.40999873e+03 2.70004882e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00000162e+03 7.61000092e+03 2.94891378e-01 3.19582071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 20 hdr offset: 326752 data offset: 391643136 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 48955392 79872 -32768 0 21 0 0 0 0 7031111 1 94629256 0 265 0 0 1] real hdr: [ 9.25000113e+03 2.22443261e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.81999976e+03 8.40999873e+03 2.46215071e-01 2.70004882e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 21 hdr offset: 327264 data offset: 392282112 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 49035264 79872 -32768 0 22 0 0 0 0 7031111 1 94785656 0 265 0 0 1] real hdr: [ 1.01300003e+04 1.77555424e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.67999858e+03 9.25000113e+03 1.99878209e-01 2.22443261e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 22 hdr offset: 327776 data offset: 392921088 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 49115136 79872 -32768 0 23 0 0 0 0 7031111 1 94942056 0 265 0 0 1] real hdr: [ 1.10500001e+04 1.36030234e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.05799981e+04 1.01300003e+04 1.56554224e-01 1.77555424e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 23 hdr offset: 328288 data offset: 393560064 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 49195008 79872 -32768 0 24 0 0 0 0 7031111 1 95098456 0 265 0 0 1] real hdr: [ 1.20100006e+04 9.85881076e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.15199982e+04 1.10500001e+04 1.16947874e-01 1.36030234e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 24 hdr offset: 328800 data offset: 394199040 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 49274880 79872 -32768 0 25 0 0 0 0 7031111 1 95254856 0 265 0 0 1] real hdr: [ 1.30100018e+04 6.59807861e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.24999991e+04 1.20100006e+04 8.17952369e-02 9.85881076e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 25 hdr offset: 329312 data offset: 394838016 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 49354752 79872 -32768 0 26 0 0 0 0 7031111 1 95411256 0 265 0 0 1] real hdr: [ 1.40504001e+04 3.89823900e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.35200006e+04 1.30100018e+04 5.18637157e-02 6.59807861e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 26 hdr offset: 329824 data offset: 395476992 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 49434624 79872 -32768 0 27 0 0 0 0 7031111 1 95567656 0 265 0 0 1] real hdr: [ 1.51377198e+04 1.83146873e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.45807997e+04 1.40504001e+04 2.79368177e-02 3.89823900e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 27 hdr offset: 330336 data offset: 396115968 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 49514496 79872 -32768 0 28 0 0 0 0 7031111 1 95724056 0 265 0 0 1] real hdr: [ 1.62849737e+04 4.87210933e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.56946399e+04 1.51377198e+04 1.07164793e-02 1.83146873e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 28 hdr offset: 330848 data offset: 396754944 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 49594368 79872 -32768 0 29 0 0 0 0 7031111 1 95880456 0 265 0 0 1] real hdr: [ 1.75069688e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.68753114e+04 1.62849737e+04 1.30179090e-03 4.87210933e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 29 hdr offset: 331360 data offset: 397393920 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 49674240 79872 -32768 0 30 0 0 0 0 7031111 1 96036856 0 265 0 0 1] real hdr: [ 1.88208202e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81386262e+04 1.75069688e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 30 hdr offset: 331872 data offset: 398032896 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 49754112 79872 -32768 0 31 0 0 0 0 7031111 1 96193256 0 265 0 0 1] real hdr: [ 2.02465990e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.95030104e+04 1.88208202e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 31 hdr offset: 332384 data offset: 398671872 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 49833984 79872 -32768 0 32 0 0 0 0 7031111 1 96349656 0 265 0 0 1] real hdr: [ 2.18081366e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.09901876e+04 2.02465990e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 32 hdr offset: 332896 data offset: 399310848 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 49913856 79872 -32768 0 33 0 0 0 0 7031111 1 96506056 0 265 0 0 1] real hdr: [ 2.35421836e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.26260817e+04 2.18081366e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 33 hdr offset: 333408 data offset: 399949824 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 49993728 79872 -32768 0 34 0 0 0 0 7031111 1 96662456 0 265 0 0 1] real hdr: [ 2.55209609e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.44582854e+04 2.35421836e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 34 hdr offset: 333920 data offset: 400588800 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 50073600 79872 -32768 0 35 0 0 0 0 7031111 1 96818856 0 265 0 0 1] real hdr: [ 2.79013583e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.65836402e+04 2.55209609e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 35 hdr offset: 334432 data offset: 401227776 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 50153472 79872 -32768 0 36 0 0 0 0 7031111 1 96975256 0 265 0 0 1] real hdr: [ 3.10638886e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.92190802e+04 2.79013583e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 36 hdr offset: 334944 data offset: 401866752 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 50233344 79872 -32768 0 37 0 0 0 0 7031111 1 97131656 0 265 0 0 1] real hdr: [ 3.60817633e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.29086931e+04 3.10638886e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 69 record 37 hdr offset: 335456 data offset: 402505728 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1729 0 0 65 0 0 50313216 79872 -32768 0 38 0 0 0 0 7031111 1 97288056 0 265 0 0 1] real hdr: [ 4.24279038e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.92548336e+04 3.60817633e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 70: nz = 38, nt = 1 var 70 record 0 hdr offset: 335968 data offset: 403144704 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 50393088 79872 -32768 79 1 0 0 0 0 7031111 1 97444456 0 266 0 0 1] real hdr: [ 4.99988815e+01 9.94296273e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.00003377e+01 0.00000000e+00 9.97716462e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 1 hdr offset: 336480 data offset: 403783680 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 50472960 79872 -32768 79 2 0 0 0 0 7031111 1 97600856 0 266 0 0 1] real hdr: [ 1.30000232e+02 9.85203885e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00013508e+01 4.99988815e+01 9.90881510e-01 9.94296273e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 2 hdr offset: 336992 data offset: 404422656 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 50552832 79872 -32768 79 3 0 0 0 0 7031111 1 97757256 0 266 0 0 1] real hdr: [ 2.49998333e+02 9.71644051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.79999114e+02 1.30000232e+02 9.79542572e-01 9.85203885e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 3 hdr offset: 337504 data offset: 405061632 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 50632704 79872 -32768 79 4 0 0 0 0 7031111 1 97913656 0 266 0 0 1] real hdr: [ 4.10001035e+02 9.53709855e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.20001478e+02 2.49998333e+02 9.63777064e-01 9.71644051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 4 hdr offset: 338016 data offset: 405700608 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 50712576 79872 -32768 79 5 0 0 0 0 7031111 1 98070056 0 266 0 0 1] real hdr: [ 6.10000486e+02 9.31527464e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.00000592e+02 4.10001035e+02 9.43695500e-01 9.53709855e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 5 hdr offset: 338528 data offset: 406339584 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 50792448 79872 -32768 79 6 0 0 0 0 7031111 1 98226456 0 266 0 0 1] real hdr: [ 8.50000613e+02 9.05253051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.20000381e+02 6.10000486e+02 9.19438386e-01 9.31527464e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 6 hdr offset: 339040 data offset: 406978560 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 50872320 79872 -32768 79 7 0 0 0 0 7031111 1 98382856 0 266 0 0 1] real hdr: [ 1.13000142e+03 8.75074549e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.80000846e+02 8.50000613e+02 8.91177995e-01 9.05253051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.01114785 0.00720325 0.00371113 ..., 0. 0. 0. ] ----------------------- var 70 record 7 hdr offset: 339552 data offset: 407617536 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 50952192 79872 -32768 79 8 0 0 0 0 7031111 1 98539256 0 266 0 0 1] real hdr: [ 1.44999897e+03 8.41211628e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.27999806e+03 1.13000142e+03 8.59118341e-01 8.75074549e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.04554626 0.03617255 0.0273284 ..., 0. 0. 0. ] ----------------------- var 70 record 8 hdr offset: 340064 data offset: 408256512 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 51032064 79872 -32768 79 9 0 0 0 0 7031111 1 98695656 0 266 0 0 1] real hdr: [ 1.81000112e+03 8.03914038e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.61999988e+03 1.44999897e+03 8.23493502e-01 8.41211628e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 9 hdr offset: 340576 data offset: 408895488 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 51111936 79872 -32768 79 10 0 0 0 0 7031111 1 98852056 0 266 0 0 1] real hdr: [ 2.21000002e+03 7.63464495e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.99999844e+03 1.81000112e+03 7.84570542e-01 8.03914038e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 10 hdr offset: 341088 data offset: 409534464 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 51191808 79872 -32768 79 11 0 0 0 0 7031111 1 99008456 0 266 0 0 1] real hdr: [ 2.64999960e+03 7.20175811e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.42000161e+03 2.21000002e+03 7.42646223e-01 7.63464495e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 11 hdr offset: 341600 data offset: 410173440 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 51271680 79872 -32768 79 12 0 0 0 0 7031111 1 99164856 0 266 0 0 1] real hdr: [ 3.12999986e+03 6.74392534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.88000152e+03 2.64999960e+03 6.98050213e-01 7.20175811e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 12 hdr offset: 342112 data offset: 410812416 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 51351552 79872 -32768 79 13 0 0 0 0 7031111 1 99321256 0 266 0 0 1] real hdr: [ 3.65000079e+03 6.26490534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.37999819e+03 3.12999986e+03 6.51142688e-01 6.74392534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 13 hdr offset: 342624 data offset: 411451392 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 51431424 79872 -32768 79 14 0 0 0 0 7031111 1 99477656 0 266 0 0 1] real hdr: [ 4.20999847e+03 5.76877346e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.91999946e+03 3.65000079e+03 6.02314441e-01 6.26490534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 14 hdr offset: 343136 data offset: 412090368 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 51511296 79872 -32768 79 15 0 0 0 0 7031111 1 99634056 0 266 0 0 1] real hdr: [ 4.81000075e+03 5.25990788e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.50000140e+03 4.20999847e+03 5.51988701e-01 5.76877346e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 15 hdr offset: 343648 data offset: 412729344 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 51591168 79872 -32768 79 16 0 0 0 0 7031111 1 99790456 0 266 0 0 1] real hdr: [ 5.44999978e+03 4.74301366e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.12000009e+03 4.81000075e+03 5.00619965e-01 5.25990788e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 16 hdr offset: 344160 data offset: 413368320 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 51671040 79872 -32768 79 17 0 0 0 0 7031111 1 99946856 0 266 0 0 1] real hdr: [ 6.12999948e+03 4.22309896e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.77999946e+03 5.44999978e+03 4.48693382e-01 4.74301366e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 17 hdr offset: 344672 data offset: 414007296 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 51750912 79872 -32768 79 18 0 0 0 0 7031111 1 100103256 0 266 0 0 1] real hdr: [ 6.84999986e+03 3.70548863e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.47999950e+03 6.12999948e+03 3.96725773e-01 4.22309896e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 18 hdr offset: 345184 data offset: 414646272 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 51830784 79872 -32768 79 19 0 0 0 0 7031111 1 100259656 0 266 0 0 1] real hdr: [ 7.61000092e+03 3.19582071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.22000022e+03 6.84999986e+03 3.45265283e-01 3.70548863e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 19 hdr offset: 345696 data offset: 415285248 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 51910656 79872 -32768 79 20 0 0 0 0 7031111 1 100416056 0 266 0 0 1] real hdr: [ 8.40999873e+03 2.70004882e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00000162e+03 7.61000092e+03 2.94891378e-01 3.19582071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 20 hdr offset: 346208 data offset: 415924224 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 51990528 79872 -32768 79 21 0 0 0 0 7031111 1 100572456 0 266 0 0 1] real hdr: [ 9.25000113e+03 2.22443261e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.81999976e+03 8.40999873e+03 2.46215071e-01 2.70004882e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 21 hdr offset: 346720 data offset: 416563200 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 52070400 79872 -32768 79 22 0 0 0 0 7031111 1 100728856 0 266 0 0 1] real hdr: [ 1.01300003e+04 1.77555424e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.67999858e+03 9.25000113e+03 1.99878209e-01 2.22443261e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 22 hdr offset: 347232 data offset: 417202176 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 52150272 79872 -32768 79 23 0 0 0 0 7031111 1 100885256 0 266 0 0 1] real hdr: [ 1.10500001e+04 1.36030234e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.05799981e+04 1.01300003e+04 1.56554224e-01 1.77555424e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 23 hdr offset: 347744 data offset: 417841152 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 52230144 79872 -32768 79 24 0 0 0 0 7031111 1 101041656 0 266 0 0 1] real hdr: [ 1.20100006e+04 9.85881076e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.15199982e+04 1.10500001e+04 1.16947874e-01 1.36030234e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 24 hdr offset: 348256 data offset: 418480128 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 52310016 79872 -32768 79 25 0 0 0 0 7031111 1 101198056 0 266 0 0 1] real hdr: [ 1.30100018e+04 6.59807861e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.24999991e+04 1.20100006e+04 8.17952369e-02 9.85881076e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 25 hdr offset: 348768 data offset: 419119104 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 52389888 79872 -32768 79 26 0 0 0 0 7031111 1 101354456 0 266 0 0 1] real hdr: [ 1.40504001e+04 3.89823900e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.35200006e+04 1.30100018e+04 5.18637157e-02 6.59807861e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 26 hdr offset: 349280 data offset: 419758080 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 52469760 79872 -32768 79 27 0 0 0 0 7031111 1 101510856 0 266 0 0 1] real hdr: [ 1.51377198e+04 1.83146873e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.45807997e+04 1.40504001e+04 2.79368177e-02 3.89823900e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 27 hdr offset: 349792 data offset: 420397056 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 52549632 79872 -32768 79 28 0 0 0 0 7031111 1 101667256 0 266 0 0 1] real hdr: [ 1.62849737e+04 4.87210933e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.56946399e+04 1.51377198e+04 1.07164793e-02 1.83146873e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 28 hdr offset: 350304 data offset: 421036032 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 52629504 79872 -32768 79 29 0 0 0 0 7031111 1 101823656 0 266 0 0 1] real hdr: [ 1.75069688e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.68753114e+04 1.62849737e+04 1.30179090e-03 4.87210933e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 29 hdr offset: 350816 data offset: 421675008 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 52709376 79872 -32768 79 30 0 0 0 0 7031111 1 101980056 0 266 0 0 1] real hdr: [ 1.88208202e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81386262e+04 1.75069688e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 30 hdr offset: 351328 data offset: 422313984 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 52789248 79872 -32768 79 31 0 0 0 0 7031111 1 102136456 0 266 0 0 1] real hdr: [ 2.02465990e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.95030104e+04 1.88208202e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 31 hdr offset: 351840 data offset: 422952960 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 52869120 79872 -32768 79 32 0 0 0 0 7031111 1 102292856 0 266 0 0 1] real hdr: [ 2.18081366e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.09901876e+04 2.02465990e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 32 hdr offset: 352352 data offset: 423591936 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 52948992 79872 -32768 79 33 0 0 0 0 7031111 1 102449256 0 266 0 0 1] real hdr: [ 2.35421836e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.26260817e+04 2.18081366e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 33 hdr offset: 352864 data offset: 424230912 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 53028864 79872 -32768 79 34 0 0 0 0 7031111 1 102605656 0 266 0 0 1] real hdr: [ 2.55209609e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.44582854e+04 2.35421836e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 34 hdr offset: 353376 data offset: 424869888 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 53108736 79872 -32768 79 35 0 0 0 0 7031111 1 102762056 0 266 0 0 1] real hdr: [ 2.79013583e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.65836402e+04 2.55209609e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 35 hdr offset: 353888 data offset: 425508864 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 53188608 79872 -32768 79 36 0 0 0 0 7031111 1 102918456 0 266 0 0 1] real hdr: [ 3.10638886e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.92190802e+04 2.79013583e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 36 hdr offset: 354400 data offset: 426147840 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 53268480 79872 -32768 79 37 0 0 0 0 7031111 1 103074856 0 266 0 0 1] real hdr: [ 3.60817633e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.29086931e+04 3.10638886e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 70 record 37 hdr offset: 354912 data offset: 426786816 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 220 0 0 65 0 0 53348352 79872 -32768 79 38 0 0 0 0 7031111 1 103231256 0 266 0 0 1] real hdr: [ 4.24279038e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.92548336e+04 3.60817633e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 71: nz = 38, nt = 1 var 71 record 0 hdr offset: 355424 data offset: 427425792 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 53428224 79872 -32768 0 1 0 0 0 0 7031111 1 103387656 0 267 0 0 1] real hdr: [ 4.99988815e+01 9.94296273e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.00003377e+01 0.00000000e+00 9.97716462e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 1 hdr offset: 355936 data offset: 428064768 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 53508096 79872 -32768 0 2 0 0 0 0 7031111 1 103544056 0 267 0 0 1] real hdr: [ 1.30000232e+02 9.85203885e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00013508e+01 4.99988815e+01 9.90881510e-01 9.94296273e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 2 hdr offset: 356448 data offset: 428703744 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 53587968 79872 -32768 0 3 0 0 0 0 7031111 1 103700456 0 267 0 0 1] real hdr: [ 2.49998333e+02 9.71644051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.79999114e+02 1.30000232e+02 9.79542572e-01 9.85203885e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 3 hdr offset: 356960 data offset: 429342720 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 53667840 79872 -32768 0 4 0 0 0 0 7031111 1 103856856 0 267 0 0 1] real hdr: [ 4.10001035e+02 9.53709855e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.20001478e+02 2.49998333e+02 9.63777064e-01 9.71644051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 4 hdr offset: 357472 data offset: 429981696 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 53747712 79872 -32768 0 5 0 0 0 0 7031111 1 104013256 0 267 0 0 1] real hdr: [ 6.10000486e+02 9.31527464e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.00000592e+02 4.10001035e+02 9.43695500e-01 9.53709855e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 5 hdr offset: 357984 data offset: 430620672 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 53827584 79872 -32768 0 6 0 0 0 0 7031111 1 104169656 0 267 0 0 1] real hdr: [ 8.50000613e+02 9.05253051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.20000381e+02 6.10000486e+02 9.19438386e-01 9.31527464e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 6 hdr offset: 358496 data offset: 431259648 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 53907456 79872 -32768 0 7 0 0 0 0 7031111 1 104326056 0 267 0 0 1] real hdr: [ 1.13000142e+03 8.75074549e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.80000846e+02 8.50000613e+02 8.91177995e-01 9.05253051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.01114785 0.00720325 0.00371113 ..., 0. 0. 0. ] ----------------------- var 71 record 7 hdr offset: 359008 data offset: 431898624 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 53987328 79872 -32768 0 8 0 0 0 0 7031111 1 104482456 0 267 0 0 1] real hdr: [ 1.44999897e+03 8.41211628e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.27999806e+03 1.13000142e+03 8.59118341e-01 8.75074549e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.04554626 0.03617255 0.0273284 ..., 0. 0. 0. ] ----------------------- var 71 record 8 hdr offset: 359520 data offset: 432537600 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 54067200 79872 -32768 0 9 0 0 0 0 7031111 1 104638856 0 267 0 0 1] real hdr: [ 1.81000112e+03 8.03914038e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.61999988e+03 1.44999897e+03 8.23493502e-01 8.41211628e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 9 hdr offset: 360032 data offset: 433176576 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 54147072 79872 -32768 0 10 0 0 0 0 7031111 1 104795256 0 267 0 0 1] real hdr: [ 2.21000002e+03 7.63464495e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.99999844e+03 1.81000112e+03 7.84570542e-01 8.03914038e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 10 hdr offset: 360544 data offset: 433815552 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 54226944 79872 -32768 0 11 0 0 0 0 7031111 1 104951656 0 267 0 0 1] real hdr: [ 2.64999960e+03 7.20175811e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.42000161e+03 2.21000002e+03 7.42646223e-01 7.63464495e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 11 hdr offset: 361056 data offset: 434454528 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 54306816 79872 -32768 0 12 0 0 0 0 7031111 1 105108056 0 267 0 0 1] real hdr: [ 3.12999986e+03 6.74392534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.88000152e+03 2.64999960e+03 6.98050213e-01 7.20175811e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 12 hdr offset: 361568 data offset: 435093504 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 54386688 79872 -32768 0 13 0 0 0 0 7031111 1 105264456 0 267 0 0 1] real hdr: [ 3.65000079e+03 6.26490534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.37999819e+03 3.12999986e+03 6.51142688e-01 6.74392534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 13 hdr offset: 362080 data offset: 435732480 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 54466560 79872 -32768 0 14 0 0 0 0 7031111 1 105420856 0 267 0 0 1] real hdr: [ 4.20999847e+03 5.76877346e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.91999946e+03 3.65000079e+03 6.02314441e-01 6.26490534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 14 hdr offset: 362592 data offset: 436371456 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 54546432 79872 -32768 0 15 0 0 0 0 7031111 1 105577256 0 267 0 0 1] real hdr: [ 4.81000075e+03 5.25990788e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.50000140e+03 4.20999847e+03 5.51988701e-01 5.76877346e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 15 hdr offset: 363104 data offset: 437010432 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 54626304 79872 -32768 0 16 0 0 0 0 7031111 1 105733656 0 267 0 0 1] real hdr: [ 5.44999978e+03 4.74301366e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.12000009e+03 4.81000075e+03 5.00619965e-01 5.25990788e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 16 hdr offset: 363616 data offset: 437649408 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 54706176 79872 -32768 0 17 0 0 0 0 7031111 1 105890056 0 267 0 0 1] real hdr: [ 6.12999948e+03 4.22309896e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.77999946e+03 5.44999978e+03 4.48693382e-01 4.74301366e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 17 hdr offset: 364128 data offset: 438288384 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 54786048 79872 -32768 0 18 0 0 0 0 7031111 1 106046456 0 267 0 0 1] real hdr: [ 6.84999986e+03 3.70548863e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.47999950e+03 6.12999948e+03 3.96725773e-01 4.22309896e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 18 hdr offset: 364640 data offset: 438927360 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 54865920 79872 -32768 0 19 0 0 0 0 7031111 1 106202856 0 267 0 0 1] real hdr: [ 7.61000092e+03 3.19582071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.22000022e+03 6.84999986e+03 3.45265283e-01 3.70548863e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 19 hdr offset: 365152 data offset: 439566336 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 54945792 79872 -32768 0 20 0 0 0 0 7031111 1 106359256 0 267 0 0 1] real hdr: [ 8.40999873e+03 2.70004882e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00000162e+03 7.61000092e+03 2.94891378e-01 3.19582071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 20 hdr offset: 365664 data offset: 440205312 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 55025664 79872 -32768 0 21 0 0 0 0 7031111 1 106515656 0 267 0 0 1] real hdr: [ 9.25000113e+03 2.22443261e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.81999976e+03 8.40999873e+03 2.46215071e-01 2.70004882e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 21 hdr offset: 366176 data offset: 440844288 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 55105536 79872 -32768 0 22 0 0 0 0 7031111 1 106672056 0 267 0 0 1] real hdr: [ 1.01300003e+04 1.77555424e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.67999858e+03 9.25000113e+03 1.99878209e-01 2.22443261e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 22 hdr offset: 366688 data offset: 441483264 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 55185408 79872 -32768 0 23 0 0 0 0 7031111 1 106828456 0 267 0 0 1] real hdr: [ 1.10500001e+04 1.36030234e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.05799981e+04 1.01300003e+04 1.56554224e-01 1.77555424e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 23 hdr offset: 367200 data offset: 442122240 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 55265280 79872 -32768 0 24 0 0 0 0 7031111 1 106984856 0 267 0 0 1] real hdr: [ 1.20100006e+04 9.85881076e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.15199982e+04 1.10500001e+04 1.16947874e-01 1.36030234e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 24 hdr offset: 367712 data offset: 442761216 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 55345152 79872 -32768 0 25 0 0 0 0 7031111 1 107141256 0 267 0 0 1] real hdr: [ 1.30100018e+04 6.59807861e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.24999991e+04 1.20100006e+04 8.17952369e-02 9.85881076e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 25 hdr offset: 368224 data offset: 443400192 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 55425024 79872 -32768 0 26 0 0 0 0 7031111 1 107297656 0 267 0 0 1] real hdr: [ 1.40504001e+04 3.89823900e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.35200006e+04 1.30100018e+04 5.18637157e-02 6.59807861e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 26 hdr offset: 368736 data offset: 444039168 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 55504896 79872 -32768 0 27 0 0 0 0 7031111 1 107454056 0 267 0 0 1] real hdr: [ 1.51377198e+04 1.83146873e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.45807997e+04 1.40504001e+04 2.79368177e-02 3.89823900e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 27 hdr offset: 369248 data offset: 444678144 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 55584768 79872 -32768 0 28 0 0 0 0 7031111 1 107610456 0 267 0 0 1] real hdr: [ 1.62849737e+04 4.87210933e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.56946399e+04 1.51377198e+04 1.07164793e-02 1.83146873e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 28 hdr offset: 369760 data offset: 445317120 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 55664640 79872 -32768 0 29 0 0 0 0 7031111 1 107766856 0 267 0 0 1] real hdr: [ 1.75069688e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.68753114e+04 1.62849737e+04 1.30179090e-03 4.87210933e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 29 hdr offset: 370272 data offset: 445956096 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 55744512 79872 -32768 0 30 0 0 0 0 7031111 1 107923256 0 267 0 0 1] real hdr: [ 1.88208202e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81386262e+04 1.75069688e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 30 hdr offset: 370784 data offset: 446595072 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 55824384 79872 -32768 0 31 0 0 0 0 7031111 1 108079656 0 267 0 0 1] real hdr: [ 2.02465990e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.95030104e+04 1.88208202e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 31 hdr offset: 371296 data offset: 447234048 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 55904256 79872 -32768 0 32 0 0 0 0 7031111 1 108236056 0 267 0 0 1] real hdr: [ 2.18081366e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.09901876e+04 2.02465990e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 32 hdr offset: 371808 data offset: 447873024 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 55984128 79872 -32768 0 33 0 0 0 0 7031111 1 108392456 0 267 0 0 1] real hdr: [ 2.35421836e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.26260817e+04 2.18081366e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 33 hdr offset: 372320 data offset: 448512000 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 56064000 79872 -32768 0 34 0 0 0 0 7031111 1 108548856 0 267 0 0 1] real hdr: [ 2.55209609e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.44582854e+04 2.35421836e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 34 hdr offset: 372832 data offset: 449150976 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 56143872 79872 -32768 0 35 0 0 0 0 7031111 1 108705256 0 267 0 0 1] real hdr: [ 2.79013583e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.65836402e+04 2.55209609e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 35 hdr offset: 373344 data offset: 449789952 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 56223744 79872 -32768 0 36 0 0 0 0 7031111 1 108861656 0 267 0 0 1] real hdr: [ 3.10638886e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.92190802e+04 2.79013583e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 36 hdr offset: 373856 data offset: 450428928 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 56303616 79872 -32768 0 37 0 0 0 0 7031111 1 109018056 0 267 0 0 1] real hdr: [ 3.60817633e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.29086931e+04 3.10638886e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 71 record 37 hdr offset: 374368 data offset: 451067904 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1425 0 0 65 0 0 56383488 79872 -32768 0 38 0 0 0 0 7031111 1 109174456 0 267 0 0 1] real hdr: [ 4.24279038e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.92548336e+04 3.60817633e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 72: nz = 38, nt = 1 var 72 record 0 hdr offset: 374880 data offset: 451706880 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 56463360 79872 -32768 0 1 0 0 0 0 7031111 1 109330856 0 268 0 0 1] real hdr: [ 4.99988815e+01 9.94296273e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.00003377e+01 0.00000000e+00 9.97716462e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 1 hdr offset: 375392 data offset: 452345856 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 56543232 79872 -32768 0 2 0 0 0 0 7031111 1 109487256 0 268 0 0 1] real hdr: [ 1.30000232e+02 9.85203885e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00013508e+01 4.99988815e+01 9.90881510e-01 9.94296273e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 2 hdr offset: 375904 data offset: 452984832 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 56623104 79872 -32768 0 3 0 0 0 0 7031111 1 109643656 0 268 0 0 1] real hdr: [ 2.49998333e+02 9.71644051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.79999114e+02 1.30000232e+02 9.79542572e-01 9.85203885e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 3 hdr offset: 376416 data offset: 453623808 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 56702976 79872 -32768 0 4 0 0 0 0 7031111 1 109800056 0 268 0 0 1] real hdr: [ 4.10001035e+02 9.53709855e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.20001478e+02 2.49998333e+02 9.63777064e-01 9.71644051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 4 hdr offset: 376928 data offset: 454262784 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 56782848 79872 -32768 0 5 0 0 0 0 7031111 1 109956456 0 268 0 0 1] real hdr: [ 6.10000486e+02 9.31527464e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.00000592e+02 4.10001035e+02 9.43695500e-01 9.53709855e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 5 hdr offset: 377440 data offset: 454901760 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 56862720 79872 -32768 0 6 0 0 0 0 7031111 1 110112856 0 268 0 0 1] real hdr: [ 8.50000613e+02 9.05253051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.20000381e+02 6.10000486e+02 9.19438386e-01 9.31527464e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 6 hdr offset: 377952 data offset: 455540736 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 56942592 79872 -32768 0 7 0 0 0 0 7031111 1 110269256 0 268 0 0 1] real hdr: [ 1.13000142e+03 8.75074549e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.80000846e+02 8.50000613e+02 8.91177995e-01 9.05253051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 7 hdr offset: 378464 data offset: 456179712 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 57022464 79872 -32768 0 8 0 0 0 0 7031111 1 110425656 0 268 0 0 1] real hdr: [ 1.44999897e+03 8.41211628e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.27999806e+03 1.13000142e+03 8.59118341e-01 8.75074549e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 8 hdr offset: 378976 data offset: 456818688 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 57102336 79872 -32768 0 9 0 0 0 0 7031111 1 110582056 0 268 0 0 1] real hdr: [ 1.81000112e+03 8.03914038e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.61999988e+03 1.44999897e+03 8.23493502e-01 8.41211628e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 9 hdr offset: 379488 data offset: 457457664 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 57182208 79872 -32768 0 10 0 0 0 0 7031111 1 110738456 0 268 0 0 1] real hdr: [ 2.21000002e+03 7.63464495e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.99999844e+03 1.81000112e+03 7.84570542e-01 8.03914038e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 10 hdr offset: 380000 data offset: 458096640 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 57262080 79872 -32768 0 11 0 0 0 0 7031111 1 110894856 0 268 0 0 1] real hdr: [ 2.64999960e+03 7.20175811e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.42000161e+03 2.21000002e+03 7.42646223e-01 7.63464495e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 11 hdr offset: 380512 data offset: 458735616 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 57341952 79872 -32768 0 12 0 0 0 0 7031111 1 111051256 0 268 0 0 1] real hdr: [ 3.12999986e+03 6.74392534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.88000152e+03 2.64999960e+03 6.98050213e-01 7.20175811e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 12 hdr offset: 381024 data offset: 459374592 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 57421824 79872 -32768 0 13 0 0 0 0 7031111 1 111207656 0 268 0 0 1] real hdr: [ 3.65000079e+03 6.26490534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.37999819e+03 3.12999986e+03 6.51142688e-01 6.74392534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 13 hdr offset: 381536 data offset: 460013568 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 57501696 79872 -32768 0 14 0 0 0 0 7031111 1 111364056 0 268 0 0 1] real hdr: [ 4.20999847e+03 5.76877346e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.91999946e+03 3.65000079e+03 6.02314441e-01 6.26490534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 14 hdr offset: 382048 data offset: 460652544 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 57581568 79872 -32768 0 15 0 0 0 0 7031111 1 111520456 0 268 0 0 1] real hdr: [ 4.81000075e+03 5.25990788e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.50000140e+03 4.20999847e+03 5.51988701e-01 5.76877346e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 15 hdr offset: 382560 data offset: 461291520 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 57661440 79872 -32768 0 16 0 0 0 0 7031111 1 111676856 0 268 0 0 1] real hdr: [ 5.44999978e+03 4.74301366e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.12000009e+03 4.81000075e+03 5.00619965e-01 5.25990788e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 16 hdr offset: 383072 data offset: 461930496 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 57741312 79872 -32768 0 17 0 0 0 0 7031111 1 111833256 0 268 0 0 1] real hdr: [ 6.12999948e+03 4.22309896e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.77999946e+03 5.44999978e+03 4.48693382e-01 4.74301366e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 17 hdr offset: 383584 data offset: 462569472 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 57821184 79872 -32768 0 18 0 0 0 0 7031111 1 111989656 0 268 0 0 1] real hdr: [ 6.84999986e+03 3.70548863e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.47999950e+03 6.12999948e+03 3.96725773e-01 4.22309896e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 18 hdr offset: 384096 data offset: 463208448 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 57901056 79872 -32768 0 19 0 0 0 0 7031111 1 112146056 0 268 0 0 1] real hdr: [ 7.61000092e+03 3.19582071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.22000022e+03 6.84999986e+03 3.45265283e-01 3.70548863e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 19 hdr offset: 384608 data offset: 463847424 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 57980928 79872 -32768 0 20 0 0 0 0 7031111 1 112302456 0 268 0 0 1] real hdr: [ 8.40999873e+03 2.70004882e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00000162e+03 7.61000092e+03 2.94891378e-01 3.19582071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 20 hdr offset: 385120 data offset: 464486400 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 58060800 79872 -32768 0 21 0 0 0 0 7031111 1 112458856 0 268 0 0 1] real hdr: [ 9.25000113e+03 2.22443261e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.81999976e+03 8.40999873e+03 2.46215071e-01 2.70004882e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 21 hdr offset: 385632 data offset: 465125376 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 58140672 79872 -32768 0 22 0 0 0 0 7031111 1 112615256 0 268 0 0 1] real hdr: [ 1.01300003e+04 1.77555424e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.67999858e+03 9.25000113e+03 1.99878209e-01 2.22443261e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 22 hdr offset: 386144 data offset: 465764352 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 58220544 79872 -32768 0 23 0 0 0 0 7031111 1 112771656 0 268 0 0 1] real hdr: [ 1.10500001e+04 1.36030234e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.05799981e+04 1.01300003e+04 1.56554224e-01 1.77555424e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 23 hdr offset: 386656 data offset: 466403328 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 58300416 79872 -32768 0 24 0 0 0 0 7031111 1 112928056 0 268 0 0 1] real hdr: [ 1.20100006e+04 9.85881076e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.15199982e+04 1.10500001e+04 1.16947874e-01 1.36030234e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 24 hdr offset: 387168 data offset: 467042304 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 58380288 79872 -32768 0 25 0 0 0 0 7031111 1 113084456 0 268 0 0 1] real hdr: [ 1.30100018e+04 6.59807861e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.24999991e+04 1.20100006e+04 8.17952369e-02 9.85881076e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 25 hdr offset: 387680 data offset: 467681280 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 58460160 79872 -32768 0 26 0 0 0 0 7031111 1 113240856 0 268 0 0 1] real hdr: [ 1.40504001e+04 3.89823900e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.35200006e+04 1.30100018e+04 5.18637157e-02 6.59807861e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 26 hdr offset: 388192 data offset: 468320256 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 58540032 79872 -32768 0 27 0 0 0 0 7031111 1 113397256 0 268 0 0 1] real hdr: [ 1.51377198e+04 1.83146873e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.45807997e+04 1.40504001e+04 2.79368177e-02 3.89823900e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 27 hdr offset: 388704 data offset: 468959232 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 58619904 79872 -32768 0 28 0 0 0 0 7031111 1 113553656 0 268 0 0 1] real hdr: [ 1.62849737e+04 4.87210933e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.56946399e+04 1.51377198e+04 1.07164793e-02 1.83146873e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 28 hdr offset: 389216 data offset: 469598208 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 58699776 79872 -32768 0 29 0 0 0 0 7031111 1 113710056 0 268 0 0 1] real hdr: [ 1.75069688e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.68753114e+04 1.62849737e+04 1.30179090e-03 4.87210933e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 29 hdr offset: 389728 data offset: 470237184 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 58779648 79872 -32768 0 30 0 0 0 0 7031111 1 113866456 0 268 0 0 1] real hdr: [ 1.88208202e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81386262e+04 1.75069688e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 30 hdr offset: 390240 data offset: 470876160 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 58859520 79872 -32768 0 31 0 0 0 0 7031111 1 114022856 0 268 0 0 1] real hdr: [ 2.02465990e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.95030104e+04 1.88208202e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 31 hdr offset: 390752 data offset: 471515136 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 58939392 79872 -32768 0 32 0 0 0 0 7031111 1 114179256 0 268 0 0 1] real hdr: [ 2.18081366e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.09901876e+04 2.02465990e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 32 hdr offset: 391264 data offset: 472154112 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 59019264 79872 -32768 0 33 0 0 0 0 7031111 1 114335656 0 268 0 0 1] real hdr: [ 2.35421836e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.26260817e+04 2.18081366e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 33 hdr offset: 391776 data offset: 472793088 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 59099136 79872 -32768 0 34 0 0 0 0 7031111 1 114492056 0 268 0 0 1] real hdr: [ 2.55209609e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.44582854e+04 2.35421836e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 34 hdr offset: 392288 data offset: 473432064 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 59179008 79872 -32768 0 35 0 0 0 0 7031111 1 114648456 0 268 0 0 1] real hdr: [ 2.79013583e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.65836402e+04 2.55209609e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 35 hdr offset: 392800 data offset: 474071040 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 59258880 79872 -32768 0 36 0 0 0 0 7031111 1 114804856 0 268 0 0 1] real hdr: [ 3.10638886e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.92190802e+04 2.79013583e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 36 hdr offset: 393312 data offset: 474710016 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 59338752 79872 -32768 0 37 0 0 0 0 7031111 1 114961256 0 268 0 0 1] real hdr: [ 3.60817633e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.29086931e+04 3.10638886e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 72 record 37 hdr offset: 393824 data offset: 475348992 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 1426 0 0 65 0 0 59418624 79872 -32768 0 38 0 0 0 0 7031111 1 115117656 0 268 0 0 1] real hdr: [ 4.24279038e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.92548336e+04 3.60817633e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 73: nz = 1, nt = 1 var 73 record 0 hdr offset: 394336 data offset: 475987968 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 701 0 0 129 0 0 59498496 79872 -32768 0 0 0 0 0 0 7031111 1 115274056 0 269 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 74: nz = 1, nt = 1 var 74 record 0 hdr offset: 394848 data offset: 476626944 disk length: 79872 int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 702 0 0 129 0 0 59578368 79872 -32768 0 0 0 0 0 0 7031111 1 115430456 0 270 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 75: nz = 38, nt = 1 var 75 record 0 hdr offset: 395360 data offset: 477265920 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 59658240 79872 900 3 1 0 0 0 0 7031111 1 115586856 0 1181 0 0 1] real hdr: [ 4.99988815e+01 9.94296273e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.00003377e+01 0.00000000e+00 9.97716462e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 1 hdr offset: 395872 data offset: 477904896 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 59738112 79872 900 3 2 0 0 0 0 7031111 1 115743256 0 1181 0 0 1] real hdr: [ 1.30000232e+02 9.85203885e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00013508e+01 4.99988815e+01 9.90881510e-01 9.94296273e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 2 hdr offset: 396384 data offset: 478543872 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 59817984 79872 900 3 3 0 0 0 0 7031111 1 115899656 0 1181 0 0 1] real hdr: [ 2.49998333e+02 9.71644051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.79999114e+02 1.30000232e+02 9.79542572e-01 9.85203885e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 3 hdr offset: 396896 data offset: 479182848 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 59897856 79872 900 3 4 0 0 0 0 7031111 1 116056056 0 1181 0 0 1] real hdr: [ 4.10001035e+02 9.53709855e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.20001478e+02 2.49998333e+02 9.63777064e-01 9.71644051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 4 hdr offset: 397408 data offset: 479821824 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 59977728 79872 900 3 5 0 0 0 0 7031111 1 116212456 0 1181 0 0 1] real hdr: [ 6.10000486e+02 9.31527464e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.00000592e+02 4.10001035e+02 9.43695500e-01 9.53709855e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 5 hdr offset: 397920 data offset: 480460800 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 60057600 79872 900 3 6 0 0 0 0 7031111 1 116368856 0 1181 0 0 1] real hdr: [ 8.50000613e+02 9.05253051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.20000381e+02 6.10000486e+02 9.19438386e-01 9.31527464e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 6 hdr offset: 398432 data offset: 481099776 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 60137472 79872 900 3 7 0 0 0 0 7031111 1 116525256 0 1181 0 0 1] real hdr: [ 1.13000142e+03 8.75074549e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.80000846e+02 8.50000613e+02 8.91177995e-01 9.05253051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 7 hdr offset: 398944 data offset: 481738752 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 60217344 79872 900 3 8 0 0 0 0 7031111 1 116681656 0 1181 0 0 1] real hdr: [ 1.44999897e+03 8.41211628e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.27999806e+03 1.13000142e+03 8.59118341e-01 8.75074549e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 8 hdr offset: 399456 data offset: 482377728 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 60297216 79872 900 3 9 0 0 0 0 7031111 1 116838056 0 1181 0 0 1] real hdr: [ 1.81000112e+03 8.03914038e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.61999988e+03 1.44999897e+03 8.23493502e-01 8.41211628e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 9 hdr offset: 399968 data offset: 483016704 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 60377088 79872 900 3 10 0 0 0 0 7031111 1 116994456 0 1181 0 0 1] real hdr: [ 2.21000002e+03 7.63464495e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.99999844e+03 1.81000112e+03 7.84570542e-01 8.03914038e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 10 hdr offset: 400480 data offset: 483655680 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 60456960 79872 900 3 11 0 0 0 0 7031111 1 117150856 0 1181 0 0 1] real hdr: [ 2.64999960e+03 7.20175811e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.42000161e+03 2.21000002e+03 7.42646223e-01 7.63464495e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 11 hdr offset: 400992 data offset: 484294656 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 60536832 79872 900 3 12 0 0 0 0 7031111 1 117307256 0 1181 0 0 1] real hdr: [ 3.12999986e+03 6.74392534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.88000152e+03 2.64999960e+03 6.98050213e-01 7.20175811e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 12 hdr offset: 401504 data offset: 484933632 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 60616704 79872 900 3 13 0 0 0 0 7031111 1 117463656 0 1181 0 0 1] real hdr: [ 3.65000079e+03 6.26490534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.37999819e+03 3.12999986e+03 6.51142688e-01 6.74392534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 13 hdr offset: 402016 data offset: 485572608 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 60696576 79872 900 3 14 0 0 0 0 7031111 1 117620056 0 1181 0 0 1] real hdr: [ 4.20999847e+03 5.76877346e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.91999946e+03 3.65000079e+03 6.02314441e-01 6.26490534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 14 hdr offset: 402528 data offset: 486211584 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 60776448 79872 900 3 15 0 0 0 0 7031111 1 117776456 0 1181 0 0 1] real hdr: [ 4.81000075e+03 5.25990788e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.50000140e+03 4.20999847e+03 5.51988701e-01 5.76877346e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 15 hdr offset: 403040 data offset: 486850560 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 60856320 79872 900 3 16 0 0 0 0 7031111 1 117932856 0 1181 0 0 1] real hdr: [ 5.44999978e+03 4.74301366e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.12000009e+03 4.81000075e+03 5.00619965e-01 5.25990788e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 16 hdr offset: 403552 data offset: 487489536 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 60936192 79872 900 3 17 0 0 0 0 7031111 1 118089256 0 1181 0 0 1] real hdr: [ 6.12999948e+03 4.22309896e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.77999946e+03 5.44999978e+03 4.48693382e-01 4.74301366e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 17 hdr offset: 404064 data offset: 488128512 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 61016064 79872 900 3 18 0 0 0 0 7031111 1 118245656 0 1181 0 0 1] real hdr: [ 6.84999986e+03 3.70548863e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.47999950e+03 6.12999948e+03 3.96725773e-01 4.22309896e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 18 hdr offset: 404576 data offset: 488767488 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 61095936 79872 900 3 19 0 0 0 0 7031111 1 118402056 0 1181 0 0 1] real hdr: [ 7.61000092e+03 3.19582071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.22000022e+03 6.84999986e+03 3.45265283e-01 3.70548863e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 19 hdr offset: 405088 data offset: 489406464 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 61175808 79872 900 3 20 0 0 0 0 7031111 1 118558456 0 1181 0 0 1] real hdr: [ 8.40999873e+03 2.70004882e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00000162e+03 7.61000092e+03 2.94891378e-01 3.19582071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 20 hdr offset: 405600 data offset: 490045440 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 61255680 79872 900 3 21 0 0 0 0 7031111 1 118714856 0 1181 0 0 1] real hdr: [ 9.25000113e+03 2.22443261e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.81999976e+03 8.40999873e+03 2.46215071e-01 2.70004882e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 21 hdr offset: 406112 data offset: 490684416 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 61335552 79872 900 3 22 0 0 0 0 7031111 1 118871256 0 1181 0 0 1] real hdr: [ 1.01300003e+04 1.77555424e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.67999858e+03 9.25000113e+03 1.99878209e-01 2.22443261e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 22 hdr offset: 406624 data offset: 491323392 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 61415424 79872 900 3 23 0 0 0 0 7031111 1 119027656 0 1181 0 0 1] real hdr: [ 1.10500001e+04 1.36030234e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.05799981e+04 1.01300003e+04 1.56554224e-01 1.77555424e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 23 hdr offset: 407136 data offset: 491962368 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 61495296 79872 900 3 24 0 0 0 0 7031111 1 119184056 0 1181 0 0 1] real hdr: [ 1.20100006e+04 9.85881076e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.15199982e+04 1.10500001e+04 1.16947874e-01 1.36030234e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 24 hdr offset: 407648 data offset: 492601344 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 61575168 79872 900 3 25 0 0 0 0 7031111 1 119340456 0 1181 0 0 1] real hdr: [ 1.30100018e+04 6.59807861e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.24999991e+04 1.20100006e+04 8.17952369e-02 9.85881076e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 25 hdr offset: 408160 data offset: 493240320 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 61655040 79872 900 3 26 0 0 0 0 7031111 1 119496856 0 1181 0 0 1] real hdr: [ 1.40504001e+04 3.89823900e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.35200006e+04 1.30100018e+04 5.18637157e-02 6.59807861e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 26 hdr offset: 408672 data offset: 493879296 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 61734912 79872 900 3 27 0 0 0 0 7031111 1 119653256 0 1181 0 0 1] real hdr: [ 1.51377198e+04 1.83146873e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.45807997e+04 1.40504001e+04 2.79368177e-02 3.89823900e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 27 hdr offset: 409184 data offset: 494518272 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 61814784 79872 900 3 28 0 0 0 0 7031111 1 119809656 0 1181 0 0 1] real hdr: [ 1.62849737e+04 4.87210933e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.56946399e+04 1.51377198e+04 1.07164793e-02 1.83146873e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 28 hdr offset: 409696 data offset: 495157248 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 61894656 79872 900 3 29 0 0 0 0 7031111 1 119966056 0 1181 0 0 1] real hdr: [ 1.75069688e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.68753114e+04 1.62849737e+04 1.30179090e-03 4.87210933e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 29 hdr offset: 410208 data offset: 495796224 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 61974528 79872 900 3 30 0 0 0 0 7031111 1 120122456 0 1181 0 0 1] real hdr: [ 1.88208202e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81386262e+04 1.75069688e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 30 hdr offset: 410720 data offset: 496435200 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 62054400 79872 900 3 31 0 0 0 0 7031111 1 120278856 0 1181 0 0 1] real hdr: [ 2.02465990e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.95030104e+04 1.88208202e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 31 hdr offset: 411232 data offset: 497074176 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 62134272 79872 900 3 32 0 0 0 0 7031111 1 120435256 0 1181 0 0 1] real hdr: [ 2.18081366e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.09901876e+04 2.02465990e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 32 hdr offset: 411744 data offset: 497713152 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 62214144 79872 900 3 33 0 0 0 0 7031111 1 120591656 0 1181 0 0 1] real hdr: [ 2.35421836e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.26260817e+04 2.18081366e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 33 hdr offset: 412256 data offset: 498352128 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 62294016 79872 900 3 34 0 0 0 0 7031111 1 120748056 0 1181 0 0 1] real hdr: [ 2.55209609e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.44582854e+04 2.35421836e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 34 hdr offset: 412768 data offset: 498991104 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 62373888 79872 900 3 35 0 0 0 0 7031111 1 120904456 0 1181 0 0 1] real hdr: [ 2.79013583e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.65836402e+04 2.55209609e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 35 hdr offset: 413280 data offset: 499630080 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 62453760 79872 900 3 36 0 0 0 0 7031111 1 121060856 0 1181 0 0 1] real hdr: [ 3.10638886e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.92190802e+04 2.79013583e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 36 hdr offset: 413792 data offset: 500269056 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 62533632 79872 900 3 37 0 0 0 0 7031111 1 121217256 0 1181 0 0 1] real hdr: [ 3.60817633e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.29086931e+04 3.10638886e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 75 record 37 hdr offset: 414304 data offset: 500908032 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 62613504 79872 900 3 38 0 0 0 0 7031111 1 121373656 0 1181 0 0 1] real hdr: [ 4.24279038e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.92548336e+04 3.60817633e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 76: nz = 1, nt = 1 var 76 record 0 hdr offset: 414816 data offset: 501547008 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 186 0 128 129 0 387757194 62693376 79872 900 34 9999 0 0 0 0 7031111 1 121530056 0 1201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 77: nz = 1, nt = 1 var 77 record 0 hdr offset: 415328 data offset: 502185984 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 200 0 128 133 0 387757194 62773248 79872 900 174 8888 0 0 0 0 7031111 1 121686456 0 1207 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 78: nz = 1, nt = 1 var 78 record 0 hdr offset: 415840 data offset: 502824960 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 201 0 128 133 0 387757194 62853120 79872 900 175 8888 0 0 0 0 7031111 1 121842856 0 1208 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 79: nz = 38, nt = 1 var 79 record 0 hdr offset: 416352 data offset: 503463936 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 62932992 79872 900 3 1 0 0 0 0 7031111 1 121999256 0 2181 0 0 1] real hdr: [ 4.99988815e+01 9.94296273e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.00003377e+01 0.00000000e+00 9.97716462e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00056175 0.00051035 0.00039596 ..., -0.00940367 -0.00920019 -0.0090479 ] ----------------------- var 79 record 1 hdr offset: 416864 data offset: 504102912 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 63012864 79872 900 3 2 0 0 0 0 7031111 1 122155656 0 2181 0 0 1] real hdr: [ 1.30000232e+02 9.85203885e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00013508e+01 4.99988815e+01 9.90881510e-01 9.94296273e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00432144 -0.00430496 -0.00435058 ..., -0.00591739 -0.00596876 -0.00600921] ----------------------- var 79 record 2 hdr offset: 417376 data offset: 504741888 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 63092736 79872 900 3 3 0 0 0 0 7031111 1 122312056 0 2181 0 0 1] real hdr: [ 2.49998333e+02 9.71644051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.79999114e+02 1.30000232e+02 9.79542572e-01 9.85203885e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00422338 -0.00420053 -0.00424097 ..., -0.00336771 -0.00356603 -0.00373357] ----------------------- var 79 record 3 hdr offset: 417888 data offset: 505380864 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 63172608 79872 900 3 4 0 0 0 0 7031111 1 122468456 0 2181 0 0 1] real hdr: [ 4.10001035e+02 9.53709855e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.20001478e+02 2.49998333e+02 9.63777064e-01 9.71644051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00393832 -0.00391754 -0.00396582 ..., -0.00100763 -0.00103109 -0.00105698] ----------------------- var 79 record 4 hdr offset: 418400 data offset: 506019840 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 63252480 79872 900 3 5 0 0 0 0 7031111 1 122624856 0 2181 0 0 1] real hdr: [ 6.10000486e+02 9.31527464e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.00000592e+02 4.10001035e+02 9.43695500e-01 9.53709855e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00356971 -0.00353873 -0.00360745 ..., -0.00355011 -0.00355761 -0.00355469] ----------------------- var 79 record 5 hdr offset: 418912 data offset: 506658816 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 63332352 79872 900 3 6 0 0 0 0 7031111 1 122781256 0 2181 0 0 1] real hdr: [ 8.50000613e+02 9.05253051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.20000381e+02 6.10000486e+02 9.19438386e-01 9.31527464e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.0030582 -0.00297077 -0.00300333 ..., -0.00383625 -0.00380488 -0.00377953] ----------------------- var 79 record 6 hdr offset: 419424 data offset: 507297792 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 63412224 79872 900 3 7 0 0 0 0 7031111 1 122937656 0 2181 0 0 1] real hdr: [ 1.13000142e+03 8.75074549e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.80000846e+02 8.50000613e+02 8.91177995e-01 9.05253051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00378237 -0.00375185 -0.00376459 ..., -0.00355111 -0.00352791 -0.00351117] ----------------------- var 79 record 7 hdr offset: 419936 data offset: 507936768 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 63492096 79872 900 3 8 0 0 0 0 7031111 1 123094056 0 2181 0 0 1] real hdr: [ 1.44999897e+03 8.41211628e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.27999806e+03 1.13000142e+03 8.59118341e-01 8.75074549e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00423916 -0.00437904 -0.00433345 ..., -0.00370674 -0.00370946 -0.00371067] ----------------------- var 79 record 8 hdr offset: 420448 data offset: 508575744 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 63571968 79872 900 3 9 0 0 0 0 7031111 1 123250456 0 2181 0 0 1] real hdr: [ 1.81000112e+03 8.03914038e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.61999988e+03 1.44999897e+03 8.23493502e-01 8.41211628e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00632181 -0.00674624 -0.0074293 ..., -0.00323529 -0.00321788 -0.00320799] ----------------------- var 79 record 9 hdr offset: 420960 data offset: 509214720 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 63651840 79872 900 3 10 0 0 0 0 7031111 1 123406856 0 2181 0 0 1] real hdr: [ 2.21000002e+03 7.63464495e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.99999844e+03 1.81000112e+03 7.84570542e-01 8.03914038e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00722406 -0.00702752 -0.00629241 ..., -0.0032181 -0.00311029 -0.00303225] ----------------------- var 79 record 10 hdr offset: 421472 data offset: 509853696 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 63731712 79872 900 3 11 0 0 0 0 7031111 1 123563256 0 2181 0 0 1] real hdr: [ 2.64999960e+03 7.20175811e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.42000161e+03 2.21000002e+03 7.42646223e-01 7.63464495e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00420434 -0.00416971 -0.00413903 ..., -0.00367051 -0.0035717 -0.00350043] ----------------------- var 79 record 11 hdr offset: 421984 data offset: 510492672 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 63811584 79872 900 3 12 0 0 0 0 7031111 1 123719656 0 2181 0 0 1] real hdr: [ 3.12999986e+03 6.74392534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.88000152e+03 2.64999960e+03 6.98050213e-01 7.20175811e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00398122 -0.00396585 -0.00393618 ..., -0.00406653 -0.00412076 -0.00416192] ----------------------- var 79 record 12 hdr offset: 422496 data offset: 511131648 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 63891456 79872 900 3 13 0 0 0 0 7031111 1 123876056 0 2181 0 0 1] real hdr: [ 3.65000079e+03 6.26490534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.37999819e+03 3.12999986e+03 6.51142688e-01 6.74392534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00359825 -0.00357702 -0.00353531 ..., -0.0040561 -0.0041784 -0.00426686] ----------------------- var 79 record 13 hdr offset: 423008 data offset: 511770624 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 63971328 79872 900 3 14 0 0 0 0 7031111 1 124032456 0 2181 0 0 1] real hdr: [ 4.20999847e+03 5.76877346e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.91999946e+03 3.65000079e+03 6.02314441e-01 6.26490534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00441068 -0.00440989 -0.00441468 ..., -0.00318138 -0.0031711 -0.00316013] ----------------------- var 79 record 14 hdr offset: 423520 data offset: 512409600 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 64051200 79872 900 3 15 0 0 0 0 7031111 1 124188856 0 2181 0 0 1] real hdr: [ 4.81000075e+03 5.25990788e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.50000140e+03 4.20999847e+03 5.51988701e-01 5.76877346e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00447073 -0.00447083 -0.00448291 ..., -0.00273873 -0.00273252 -0.00273707] ----------------------- var 79 record 15 hdr offset: 424032 data offset: 513048576 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 64131072 79872 900 3 16 0 0 0 0 7031111 1 124345256 0 2181 0 0 1] real hdr: [ 5.44999978e+03 4.74301366e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.12000009e+03 4.81000075e+03 5.00619965e-01 5.25990788e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00397875 -0.00398433 -0.00399531 ..., -0.00336314 -0.00342486 -0.00347677] ----------------------- var 79 record 16 hdr offset: 424544 data offset: 513687552 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 64210944 79872 900 3 17 0 0 0 0 7031111 1 124501656 0 2181 0 0 1] real hdr: [ 6.12999948e+03 4.22309896e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.77999946e+03 5.44999978e+03 4.48693382e-01 4.74301366e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00330926 -0.00331035 -0.00331472 ..., -0.00394538 -0.00384665 -0.00376889] ----------------------- var 79 record 17 hdr offset: 425056 data offset: 514326528 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 64290816 79872 900 3 18 0 0 0 0 7031111 1 124658056 0 2181 0 0 1] real hdr: [ 6.84999986e+03 3.70548863e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.47999950e+03 6.12999948e+03 3.96725773e-01 4.22309896e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.003071 -0.00307871 -0.00308598 ..., -0.0040661 -0.00403469 -0.00400979] ----------------------- var 79 record 18 hdr offset: 425568 data offset: 514965504 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 64370688 79872 900 3 19 0 0 0 0 7031111 1 124814456 0 2181 0 0 1] real hdr: [ 7.61000092e+03 3.19582071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.22000022e+03 6.84999986e+03 3.45265283e-01 3.70548863e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00372603 -0.00371723 -0.00369517 ..., -0.00353504 -0.00352593 -0.00352477] ----------------------- var 79 record 19 hdr offset: 426080 data offset: 515604480 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 64450560 79872 900 3 20 0 0 0 0 7031111 1 124970856 0 2181 0 0 1] real hdr: [ 8.40999873e+03 2.70004882e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00000162e+03 7.61000092e+03 2.94891378e-01 3.19582071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00316743 -0.00317358 -0.00318038 ..., -0.00332367 -0.0033878 -0.00343625] ----------------------- var 79 record 20 hdr offset: 426592 data offset: 516243456 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 64530432 79872 900 3 21 0 0 0 0 7031111 1 125127256 0 2181 0 0 1] real hdr: [ 9.25000113e+03 2.22443261e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.81999976e+03 8.40999873e+03 2.46215071e-01 2.70004882e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00275996 -0.00277601 -0.00281186 ..., -0.00327186 -0.00326286 -0.00325143] ----------------------- var 79 record 21 hdr offset: 427104 data offset: 516882432 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 64610304 79872 900 3 22 0 0 0 0 7031111 1 125283656 0 2181 0 0 1] real hdr: [ 1.01300003e+04 1.77555424e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.67999858e+03 9.25000113e+03 1.99878209e-01 2.22443261e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00261864 -0.00259423 -0.00255981 ..., -0.00286507 -0.00284663 -0.00283211] ----------------------- var 79 record 22 hdr offset: 427616 data offset: 517521408 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 64690176 79872 900 3 23 0 0 0 0 7031111 1 125440056 0 2181 0 0 1] real hdr: [ 1.10500001e+04 1.36030234e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.05799981e+04 1.01300003e+04 1.56554224e-01 1.77555424e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00313347 -0.00309212 -0.00303494 ..., -0.00244962 -0.00241147 -0.00238186] ----------------------- var 79 record 23 hdr offset: 428128 data offset: 518160384 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 64770048 79872 900 3 24 0 0 0 0 7031111 1 125596456 0 2181 0 0 1] real hdr: [ 1.20100006e+04 9.85881076e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.15199982e+04 1.10500001e+04 1.16947874e-01 1.36030234e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00281956 -0.00284355 -0.00287197 ..., -0.00214543 -0.00211488 -0.00208969] ----------------------- var 79 record 24 hdr offset: 428640 data offset: 518799360 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 64849920 79872 900 3 25 0 0 0 0 7031111 1 125752856 0 2181 0 0 1] real hdr: [ 1.30100018e+04 6.59807861e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.24999991e+04 1.20100006e+04 8.17952369e-02 9.85881076e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00116436 -0.00117461 -0.00119117 ..., -0.00161133 -0.00160348 -0.00159533] ----------------------- var 79 record 25 hdr offset: 429152 data offset: 519438336 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 64929792 79872 900 3 26 0 0 0 0 7031111 1 125909256 0 2181 0 0 1] real hdr: [ 1.40504001e+04 3.89823900e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.35200006e+04 1.30100018e+04 5.18637157e-02 6.59807861e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00064617 -0.00064521 -0.00064216 ..., -0.00089659 -0.00090009 -0.00090482] ----------------------- var 79 record 26 hdr offset: 429664 data offset: 520077312 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 65009664 79872 900 3 27 0 0 0 0 7031111 1 126065656 0 2181 0 0 1] real hdr: [ 1.51377198e+04 1.83146873e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.45807997e+04 1.40504001e+04 2.79368177e-02 3.89823900e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 7.76133602e-05 8.09127087e-05 8.61530862e-05 ..., -9.54067291e-05 -1.09069995e-04 -1.20894132e-04] ----------------------- var 79 record 27 hdr offset: 430176 data offset: 520716288 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 65089536 79872 900 3 28 0 0 0 0 7031111 1 126222056 0 2181 0 0 1] real hdr: [ 1.62849737e+04 4.87210933e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.56946399e+04 1.51377198e+04 1.07164793e-02 1.83146873e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00096173 0.00095778 0.00095351 ..., 0.00048583 0.00049102 0.00049562] ----------------------- var 79 record 28 hdr offset: 430688 data offset: 521355264 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 65169408 79872 900 3 29 0 0 0 0 7031111 1 126378456 0 2181 0 0 1] real hdr: [ 1.75069688e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.68753114e+04 1.62849737e+04 1.30179090e-03 4.87210933e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00088996 0.00089298 0.00089596 ..., 0.00061824 0.00062187 0.00062574] ----------------------- var 79 record 29 hdr offset: 431200 data offset: 521994240 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 65249280 79872 900 3 30 0 0 0 0 7031111 1 126534856 0 2181 0 0 1] real hdr: [ 1.88208202e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81386262e+04 1.75069688e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00026211 0.00025666 0.00025256 ..., 0.00039372 0.0004012 0.00040788] ----------------------- var 79 record 30 hdr offset: 431712 data offset: 522633216 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 65329152 79872 900 3 31 0 0 0 0 7031111 1 126691256 0 2181 0 0 1] real hdr: [ 2.02465990e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.95030104e+04 1.88208202e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -3.80344369e-04 -3.70424095e-04 -3.55718541e-04 ..., -6.28725029e-05 -6.77930366e-05 -7.12483816e-05] ----------------------- var 79 record 31 hdr offset: 432224 data offset: 523272192 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 65409024 79872 900 3 32 0 0 0 0 7031111 1 126847656 0 2181 0 0 1] real hdr: [ 2.18081366e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.09901876e+04 2.02465990e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -9.03802138e-05 -9.44415151e-05 -9.86914383e-05 ..., -8.82711960e-04 -8.83860979e-04 -8.84019071e-04] ----------------------- var 79 record 32 hdr offset: 432736 data offset: 523911168 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 65488896 79872 900 3 33 0 0 0 0 7031111 1 127004056 0 2181 0 0 1] real hdr: [ 2.35421836e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.26260817e+04 2.18081366e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00121262 -0.00121849 -0.00122397 ..., -0.00179376 -0.00178947 -0.00178706] ----------------------- var 79 record 33 hdr offset: 433248 data offset: 524550144 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 65568768 79872 900 3 34 0 0 0 0 7031111 1 127160456 0 2181 0 0 1] real hdr: [ 2.55209609e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.44582854e+04 2.35421836e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00201673 -0.00202388 -0.00203076 ..., -0.00254221 -0.00254122 -0.00253964] ----------------------- var 79 record 34 hdr offset: 433760 data offset: 525189120 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 65648640 79872 900 3 35 0 0 0 0 7031111 1 127316856 0 2181 0 0 1] real hdr: [ 2.79013583e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.65836402e+04 2.55209609e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00229384 -0.00227837 -0.00225255 ..., -0.00305269 -0.00305596 -0.00305855] ----------------------- var 79 record 35 hdr offset: 434272 data offset: 525828096 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 65728512 79872 900 3 36 0 0 0 0 7031111 1 127473256 0 2181 0 0 1] real hdr: [ 3.10638886e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.92190802e+04 2.79013583e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00344506 -0.00346865 -0.0034988 ..., -0.00395747 -0.00394714 -0.00393977] ----------------------- var 79 record 36 hdr offset: 434784 data offset: 526467072 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 65808384 79872 900 3 37 0 0 0 0 7031111 1 127629656 0 2181 0 0 1] real hdr: [ 3.60817633e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.29086931e+04 3.10638886e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00526268 -0.00526751 -0.00527184 ..., -0.00509169 -0.00509504 -0.00509784] ----------------------- var 79 record 37 hdr offset: 435296 data offset: 527106048 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 65888256 79872 900 3 38 0 0 0 0 7031111 1 127786056 0 2181 0 0 1] real hdr: [ 4.24279038e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.92548336e+04 3.60817633e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.0171661 -0.01714898 -0.01713154 ..., -0.01537627 -0.01535951 -0.01534444] ----------------------- =============================== var 80: nz = 1, nt = 1 var 80 record 0 hdr offset: 435808 data offset: 527745024 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 187 0 128 129 0 387757194 65968128 79872 900 35 9999 0 0 0 0 7031111 1 127942456 0 2201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-66.94603729 -66.56295776 -66.99371338 ..., -86.84447479 -87.55038452 -88.06295776] ----------------------- =============================== var 81: nz = 1, nt = 1 var 81 record 0 hdr offset: 436320 data offset: 528384000 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 206 0 128 133 0 387757194 66048000 79872 900 176 8888 0 0 0 0 7031111 1 128098856 0 2205 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 291.96389771 291.91009521 292.08990479 ..., 290.52560425 290.88110352 291.16934204] ----------------------- =============================== var 82: nz = 38, nt = 1 var 82 record 0 hdr offset: 436832 data offset: 529022976 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 66127872 79872 900 0 1 0 0 0 0 7031111 1 128255256 0 2232 0 0 1] real hdr: [ 4.99988815e+01 9.94296273e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.00003377e+01 0.00000000e+00 9.97716462e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.74499746e-06 3.40232509e-06 2.63975653e-06 ..., -6.26911205e-05 -6.13345910e-05 -6.03193621e-05] ----------------------- var 82 record 1 hdr offset: 437344 data offset: 529661952 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 66207744 79872 900 0 2 0 0 0 0 7031111 1 128411656 0 2232 0 0 1] real hdr: [ 1.30000232e+02 9.85203885e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00013508e+01 4.99988815e+01 9.90881510e-01 9.94296273e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.88095871e-05 -2.86997256e-05 -2.90038988e-05 ..., -3.94492417e-05 -3.97917029e-05 -4.00614299e-05] ----------------------- var 82 record 2 hdr offset: 437856 data offset: 530300928 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 66287616 79872 900 0 3 0 0 0 0 7031111 1 128568056 0 2232 0 0 1] real hdr: [ 2.49998333e+02 9.71644051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.79999114e+02 1.30000232e+02 9.79542572e-01 9.85203885e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.81558387e-05 -2.80035256e-05 -2.82731598e-05 ..., -2.24513806e-05 -2.37735640e-05 -2.48904562e-05] ----------------------- var 82 record 3 hdr offset: 438368 data offset: 530939904 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 66367488 79872 900 0 4 0 0 0 0 7031111 1 128724456 0 2232 0 0 1] real hdr: [ 4.10001035e+02 9.53709855e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.20001478e+02 2.49998333e+02 9.63777064e-01 9.71644051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.62554368e-05 -2.61169243e-05 -2.64387945e-05 ..., -6.71753696e-06 -6.87391184e-06 -7.04655622e-06] ----------------------- var 82 record 4 hdr offset: 438880 data offset: 531578880 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 66447360 79872 900 0 5 0 0 0 0 7031111 1 128880856 0 2232 0 0 1] real hdr: [ 6.10000486e+02 9.31527464e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.00000592e+02 4.10001035e+02 9.43695500e-01 9.53709855e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.37980494e-05 -2.35915304e-05 -2.40496629e-05 ..., -2.36674241e-05 -2.37173790e-05 -2.36979595e-05] ----------------------- var 82 record 5 hdr offset: 439392 data offset: 532217856 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 66527232 79872 900 0 6 0 0 0 0 7031111 1 129037256 0 2232 0 0 1] real hdr: [ 8.50000613e+02 9.05253051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.20000381e+02 6.10000486e+02 9.19438386e-01 9.31527464e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.03879954e-05 -1.98051348e-05 -2.00222330e-05 ..., -2.55750219e-05 -2.53658382e-05 -2.51968813e-05] ----------------------- var 82 record 6 hdr offset: 439904 data offset: 532856832 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 66607104 79872 900 0 7 0 0 0 0 7031111 1 129193656 0 2232 0 0 1] real hdr: [ 1.13000142e+03 8.75074549e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.80000846e+02 8.50000613e+02 8.91177995e-01 9.05253051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.52157770e-05 -2.50123358e-05 -2.50972953e-05 ..., -2.36740489e-05 -2.35194311e-05 -2.34078143e-05] ----------------------- var 82 record 7 hdr offset: 440416 data offset: 533495808 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 66686976 79872 900 0 8 0 0 0 0 7031111 1 129350056 0 2232 0 0 1] real hdr: [ 1.44999897e+03 8.41211628e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.27999806e+03 1.13000142e+03 8.59118341e-01 8.75074549e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.82610490e-05 -2.91935976e-05 -2.88896645e-05 ..., -2.47116295e-05 -2.47297558e-05 -2.47378321e-05] ----------------------- var 82 record 8 hdr offset: 440928 data offset: 534134784 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 66766848 79872 900 0 9 0 0 0 0 7031111 1 129506456 0 2232 0 0 1] real hdr: [ 1.81000112e+03 8.03914038e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.61999988e+03 1.44999897e+03 8.23493502e-01 8.41211628e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -4.21453806e-05 -4.49749132e-05 -4.95286549e-05 ..., -2.15686141e-05 -2.14525498e-05 -2.13866188e-05] ----------------------- var 82 record 9 hdr offset: 441440 data offset: 534773760 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 66846720 79872 900 0 10 0 0 0 0 7031111 1 129662856 0 2232 0 0 1] real hdr: [ 2.21000002e+03 7.63464495e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.99999844e+03 1.81000112e+03 7.84570542e-01 8.03914038e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -4.81604293e-05 -4.68501348e-05 -4.19494099e-05 ..., -2.14540269e-05 -2.07352914e-05 -2.02149713e-05] ----------------------- var 82 record 10 hdr offset: 441952 data offset: 535412736 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 66926592 79872 900 0 11 0 0 0 0 7031111 1 129819256 0 2232 0 0 1] real hdr: [ 2.64999960e+03 7.20175811e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.42000161e+03 2.21000002e+03 7.42646223e-01 7.63464495e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.80289278e-05 -2.77980507e-05 -2.75935308e-05 ..., -2.44700932e-05 -2.38113607e-05 -2.33361898e-05] ----------------------- var 82 record 11 hdr offset: 442464 data offset: 536051712 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 67006464 79872 900 0 12 0 0 0 0 7031111 1 129975656 0 2232 0 0 1] real hdr: [ 3.12999986e+03 6.74392534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.88000152e+03 2.64999960e+03 6.98050213e-01 7.20175811e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.65414510e-05 -2.64390201e-05 -2.62412304e-05 ..., -2.71102326e-05 -2.74717077e-05 -2.77461113e-05] ----------------------- var 82 record 12 hdr offset: 442976 data offset: 536690688 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 67086336 79872 900 0 13 0 0 0 0 7031111 1 130132056 0 2232 0 0 1] real hdr: [ 3.65000079e+03 6.26490534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.37999819e+03 3.12999986e+03 6.51142688e-01 6.74392534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.39883593e-05 -2.38468328e-05 -2.35687312e-05 ..., -2.70406344e-05 -2.78560237e-05 -2.84457346e-05] ----------------------- var 82 record 13 hdr offset: 443488 data offset: 537329664 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 67166208 79872 900 0 14 0 0 0 0 7031111 1 130288456 0 2232 0 0 1] real hdr: [ 4.20999847e+03 5.76877346e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.91999946e+03 3.65000079e+03 6.02314441e-01 6.26490534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.94045312e-05 -2.93992725e-05 -2.94311740e-05 ..., -2.12092073e-05 -2.11406386e-05 -2.10675462e-05] ----------------------- var 82 record 14 hdr offset: 444000 data offset: 537968640 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 67246080 79872 900 0 15 0 0 0 0 7031111 1 130444856 0 2232 0 0 1] real hdr: [ 4.81000075e+03 5.25990788e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.50000140e+03 4.20999847e+03 5.51988701e-01 5.76877346e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.98048544e-05 -2.98055093e-05 -2.98860778e-05 ..., -1.82581771e-05 -1.82167678e-05 -1.82471194e-05] ----------------------- var 82 record 15 hdr offset: 444512 data offset: 538607616 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 67325952 79872 900 0 16 0 0 0 0 7031111 1 130601256 0 2232 0 0 1] real hdr: [ 5.44999978e+03 4.74301366e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.12000009e+03 4.81000075e+03 5.00619965e-01 5.25990788e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.65249873e-05 -2.65622020e-05 -2.66353836e-05 ..., -2.24209089e-05 -2.28323697e-05 -2.31784852e-05] ----------------------- var 82 record 16 hdr offset: 445024 data offset: 539246592 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 67405824 79872 900 0 17 0 0 0 0 7031111 1 130757656 0 2232 0 0 1] real hdr: [ 6.12999948e+03 4.22309896e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.77999946e+03 5.44999978e+03 4.48693382e-01 4.74301366e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.20617385e-05 -2.20689781e-05 -2.20981001e-05 ..., -2.63025286e-05 -2.56443200e-05 -2.51259371e-05] ----------------------- var 82 record 17 hdr offset: 445536 data offset: 539885568 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 67485696 79872 900 0 18 0 0 0 0 7031111 1 130914056 0 2232 0 0 1] real hdr: [ 6.84999986e+03 3.70548863e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.47999950e+03 6.12999948e+03 3.96725773e-01 4.22309896e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.04733060e-05 -2.05247106e-05 -2.05732085e-05 ..., -2.71073586e-05 -2.68979038e-05 -2.67319465e-05] ----------------------- var 82 record 18 hdr offset: 446048 data offset: 540524544 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 67565568 79872 900 0 19 0 0 0 0 7031111 1 131070456 0 2232 0 0 1] real hdr: [ 7.61000092e+03 3.19582071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.22000022e+03 6.84999986e+03 3.45265283e-01 3.70548863e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.48402048e-05 -2.47815060e-05 -2.46344662e-05 ..., -2.35669395e-05 -2.35061925e-05 -2.34984836e-05] ----------------------- var 82 record 19 hdr offset: 446560 data offset: 541163520 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 67645440 79872 900 0 20 0 0 0 0 7031111 1 131226856 0 2232 0 0 1] real hdr: [ 8.40999873e+03 2.70004882e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00000162e+03 7.61000092e+03 2.94891378e-01 3.19582071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.11162060e-05 -2.11572005e-05 -2.12025279e-05 ..., -2.21577866e-05 -2.25853491e-05 -2.29083580e-05] ----------------------- var 82 record 20 hdr offset: 447072 data offset: 541802496 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 67725312 79872 900 0 21 0 0 0 0 7031111 1 131383256 0 2232 0 0 1] real hdr: [ 9.25000113e+03 2.22443261e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.81999976e+03 8.40999873e+03 2.46215071e-01 2.70004882e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.83997035e-05 -1.85067329e-05 -1.87457572e-05 ..., -2.18123678e-05 -2.17524121e-05 -2.16761873e-05] ----------------------- var 82 record 21 hdr offset: 447584 data offset: 542441472 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 67805184 79872 900 0 22 0 0 0 0 7031111 1 131539656 0 2232 0 0 1] real hdr: [ 1.01300003e+04 1.77555424e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.67999858e+03 9.25000113e+03 1.99878209e-01 2.22443261e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.74575744e-05 -1.72948348e-05 -1.70654075e-05 ..., -1.91004910e-05 -1.89775183e-05 -1.88807644e-05] ----------------------- var 82 record 22 hdr offset: 448096 data offset: 543080448 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 67885056 79872 900 0 23 0 0 0 0 7031111 1 131696056 0 2232 0 0 1] real hdr: [ 1.10500001e+04 1.36030234e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.05799981e+04 1.01300003e+04 1.56554224e-01 1.77555424e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.08898018e-05 -2.06141049e-05 -2.02329593e-05 ..., -1.63308068e-05 -1.60764484e-05 -1.58790754e-05] ----------------------- var 82 record 23 hdr offset: 448608 data offset: 543719424 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 67964928 79872 900 0 24 0 0 0 0 7031111 1 131852456 0 2232 0 0 1] real hdr: [ 1.20100006e+04 9.85881076e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.15199982e+04 1.10500001e+04 1.16947874e-01 1.36030234e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.87970873e-05 -1.89570146e-05 -1.91464369e-05 ..., -1.43028710e-05 -1.40992088e-05 -1.39312833e-05] ----------------------- var 82 record 24 hdr offset: 449120 data offset: 544358400 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 68044800 79872 900 0 25 0 0 0 0 7031111 1 132008856 0 2232 0 0 1] real hdr: [ 1.30100018e+04 6.59807861e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.24999991e+04 1.20100006e+04 8.17952369e-02 9.85881076e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -7.76240358e-06 -7.83073392e-06 -7.94115385e-06 ..., -1.07421920e-05 -1.06898415e-05 -1.06355319e-05] ----------------------- var 82 record 25 hdr offset: 449632 data offset: 544997376 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 68124672 79872 900 0 26 0 0 0 0 7031111 1 132165256 0 2232 0 0 1] real hdr: [ 1.40504001e+04 3.89823900e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.35200006e+04 1.30100018e+04 5.18637157e-02 6.59807861e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -4.30780756e-06 -4.30140790e-06 -4.28108115e-06 ..., -5.97729877e-06 -6.00059411e-06 -6.03214630e-06] ----------------------- var 82 record 26 hdr offset: 450144 data offset: 545636352 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 68204544 79872 900 0 27 0 0 0 0 7031111 1 132321656 0 2232 0 0 1] real hdr: [ 1.51377198e+04 1.83146873e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.45807997e+04 1.40504001e+04 2.79368177e-02 3.89823900e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 5.17422450e-07 5.39418068e-07 5.74353919e-07 ..., -6.36044888e-07 -7.27133283e-07 -8.05960838e-07] ----------------------- var 82 record 27 hdr offset: 450656 data offset: 546275328 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 68284416 79872 900 0 28 0 0 0 0 7031111 1 132478056 0 2232 0 0 1] real hdr: [ 1.62849737e+04 4.87210933e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.56946399e+04 1.51377198e+04 1.07164793e-02 1.83146873e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 6.41151928e-06 6.38519487e-06 6.35673450e-06 ..., 3.23883501e-06 3.27348539e-06 3.30410353e-06] ----------------------- var 82 record 28 hdr offset: 451168 data offset: 546914304 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 68364288 79872 900 0 29 0 0 0 0 7031111 1 132634456 0 2232 0 0 1] real hdr: [ 1.75069688e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.68753114e+04 1.62849737e+04 1.30179090e-03 4.87210933e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 5.93305276e-06 5.95317078e-06 5.97305689e-06 ..., 4.12158306e-06 4.14580791e-06 4.17157389e-06] ----------------------- var 82 record 29 hdr offset: 451680 data offset: 547553280 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 68444160 79872 900 0 30 0 0 0 0 7031111 1 132790856 0 2232 0 0 1] real hdr: [ 1.88208202e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81386262e+04 1.75069688e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.74738602e-06 1.71103659e-06 1.68375914e-06 ..., 2.62478602e-06 2.67469295e-06 2.71920067e-06] ----------------------- var 82 record 30 hdr offset: 452192 data offset: 548192256 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 68524032 79872 900 0 31 0 0 0 0 7031111 1 132947256 0 2232 0 0 1] real hdr: [ 2.02465990e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.95030104e+04 1.88208202e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.53562916e-06 -2.46949389e-06 -2.37145696e-06 ..., -4.19150041e-07 -4.51953582e-07 -4.74989207e-07] ----------------------- var 82 record 31 hdr offset: 452704 data offset: 548831232 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 68603904 79872 900 0 32 0 0 0 0 7031111 1 133103656 0 2232 0 0 1] real hdr: [ 2.18081366e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.09901876e+04 2.02465990e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -6.02534726e-07 -6.29610099e-07 -6.57942962e-07 ..., -5.88474632e-06 -5.89240653e-06 -5.89346064e-06] ----------------------- var 82 record 32 hdr offset: 453216 data offset: 549470208 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 68683776 79872 900 0 33 0 0 0 0 7031111 1 133260056 0 2232 0 0 1] real hdr: [ 2.35421836e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.26260817e+04 2.18081366e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -8.08411005e-06 -8.12329290e-06 -8.15977182e-06 ..., -1.19584211e-05 -1.19298302e-05 -1.19137439e-05] ----------------------- var 82 record 33 hdr offset: 453728 data offset: 550109184 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 68763648 79872 900 0 34 0 0 0 0 7031111 1 133416456 0 2232 0 0 1] real hdr: [ 2.55209609e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.44582854e+04 2.35421836e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.34448483e-05 -1.34925476e-05 -1.35383880e-05 ..., -1.69480973e-05 -1.69414525e-05 -1.69309278e-05] ----------------------- var 82 record 34 hdr offset: 454240 data offset: 550748160 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 68843520 79872 900 0 35 0 0 0 0 7031111 1 133572856 0 2232 0 0 1] real hdr: [ 2.79013583e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.65836402e+04 2.55209609e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.52922858e-05 -1.51891400e-05 -1.50169799e-05 ..., -2.03512700e-05 -2.03730924e-05 -2.03903237e-05] ----------------------- var 82 record 35 hdr offset: 454752 data offset: 551387136 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 68923392 79872 900 0 36 0 0 0 0 7031111 1 133729256 0 2232 0 0 1] real hdr: [ 3.10638886e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.92190802e+04 2.79013583e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.29670804e-05 -2.31243503e-05 -2.33253613e-05 ..., -2.63831425e-05 -2.63142356e-05 -2.62651429e-05] ----------------------- var 82 record 36 hdr offset: 455264 data offset: 552026112 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 69003264 79872 900 0 37 0 0 0 0 7031111 1 133885656 0 2232 0 0 1] real hdr: [ 3.60817633e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.29086931e+04 3.10638886e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -3.50845366e-05 -3.51167146e-05 -3.51456292e-05 ..., -3.39445978e-05 -3.39669168e-05 -3.39855869e-05] ----------------------- var 82 record 37 hdr offset: 455776 data offset: 552665088 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 16 23 47 259 121 1295 156400 101 3 340 460 0 2 2 253 0 128 65 0 387757194 69083136 79872 900 0 38 0 0 0 0 7031111 1 134042056 0 2232 0 0 1] real hdr: [ 4.24279038e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.92548336e+04 3.60817633e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00011444 -0.00011433 -0.00011421 ..., -0.00010251 -0.0001024 -0.0001023 ] ----------------------- =============================== var 83: nz = 38, nt = 1 var 83 record 0 hdr offset: 456288 data offset: 553304064 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 69163008 79872 900 5 1 0 0 0 0 7031111 1 134198456 0 3185 0 0 1] real hdr: [ 2.00003377e+01 9.97716462e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.99820611e+00 0.00000000e+00 9.98858129e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.12386622 0.12476922 0.12535672 ..., 0.00499184 0.00419372 0.00331351] ----------------------- var 83 record 1 hdr offset: 456800 data offset: 553943040 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 69242880 79872 900 5 2 0 0 0 0 7031111 1 134354856 0 3185 0 0 1] real hdr: [ 8.00013508e+01 9.90881510e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.99988815e+01 2.00003377e+01 9.94296273e-01 9.97716462e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00392412 -0.00356191 -0.00360268 ..., -0.0059066 -0.00542623 -0.00490746] ----------------------- var 83 record 2 hdr offset: 457312 data offset: 554582016 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 69322752 79872 900 5 3 0 0 0 0 7031111 1 134511256 0 3185 0 0 1] real hdr: [ 1.79999114e+02 9.79542572e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30000232e+02 8.00013508e+01 9.85203885e-01 9.90881510e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.01020998 -0.00980653 -0.00922664 ..., -0.00578461 -0.00646706 -0.00631884] ----------------------- var 83 record 3 hdr offset: 457824 data offset: 555220992 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 69402624 79872 900 5 4 0 0 0 0 7031111 1 134667656 0 3185 0 0 1] real hdr: [ 3.20001478e+02 9.63777064e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.49998333e+02 1.79999114e+02 9.71644051e-01 9.79542572e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.01341842 0.01349768 0.01360025 ..., -0.00243128 -0.0037522 -0.00426623] ----------------------- var 83 record 4 hdr offset: 458336 data offset: 555859968 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 69482496 79872 900 5 5 0 0 0 0 7031111 1 134824056 0 3185 0 0 1] real hdr: [ 5.00000592e+02 9.43695500e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.10001035e+02 3.20001478e+02 9.53709855e-01 9.63777064e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.05020813 0.04975241 0.04933114 ..., 0.01001156 0.01083638 0.01061028] ----------------------- var 83 record 5 hdr offset: 458848 data offset: 556498944 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 69562368 79872 900 5 6 0 0 0 0 7031111 1 134980456 0 3185 0 0 1] real hdr: [ 7.20000381e+02 9.19438386e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.10000486e+02 5.00000592e+02 9.31527464e-01 9.43695500e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 7.73049286e-03 7.72893103e-03 7.72692775e-03 ..., 2.77497634e-07 2.71048151e-07 2.61365585e-07] ----------------------- var 83 record 6 hdr offset: 459360 data offset: 557137920 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 69642240 79872 900 5 7 0 0 0 0 7031111 1 135136856 0 3185 0 0 1] real hdr: [ 9.80000846e+02 8.91177995e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.50000613e+02 7.20000381e+02 9.05253051e-01 9.19438386e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 7.93622064e-07 8.72539999e-07 9.58923238e-07 ..., 2.09633598e-07 2.13413543e-07 2.07328910e-07] ----------------------- var 83 record 7 hdr offset: 459872 data offset: 557776896 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 69722112 79872 900 5 8 0 0 0 0 7031111 1 135293256 0 3185 0 0 1] real hdr: [ 1.27999806e+03 8.59118341e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.13000142e+03 9.80000846e+02 8.75074549e-01 8.91177995e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -6.06487049e-07 -6.69788847e-07 -7.37484299e-07 ..., 3.57466490e-07 4.59585351e-07 4.98418842e-07] ----------------------- var 83 record 8 hdr offset: 460384 data offset: 558415872 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 69801984 79872 900 5 9 0 0 0 0 7031111 1 135449656 0 3185 0 0 1] real hdr: [ 1.61999988e+03 8.23493502e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.44999897e+03 1.27999806e+03 8.41211628e-01 8.59118341e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -9.52952703e-08 -1.03086649e-07 -1.13173435e-07 ..., 3.74750158e-07 3.53507829e-07 3.58394601e-07] ----------------------- var 83 record 9 hdr offset: 460896 data offset: 559054848 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 69881856 79872 900 5 10 0 0 0 0 7031111 1 135606056 0 3185 0 0 1] real hdr: [ 1.99999844e+03 7.84570542e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81000112e+03 1.61999988e+03 8.03914038e-01 8.23493502e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.86150004e-07 -1.80452616e-07 -1.77621672e-07 ..., 1.57795819e-06 1.16500428e-06 1.03308639e-06] ----------------------- var 83 record 10 hdr offset: 461408 data offset: 559693824 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 69961728 79872 900 5 11 0 0 0 0 7031111 1 135762456 0 3185 0 0 1] real hdr: [ 2.42000161e+03 7.42646223e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.21000002e+03 1.99999844e+03 7.63464495e-01 7.84570542e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.81810293e-07 1.77748234e-07 1.76631289e-07 ..., 3.06815082e-07 -9.69445324e-08 -2.31625506e-07] ----------------------- var 83 record 11 hdr offset: 461920 data offset: 560332800 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 70041600 79872 900 5 12 0 0 0 0 7031111 1 135918856 0 3185 0 0 1] real hdr: [ 2.88000152e+03 6.98050213e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.64999960e+03 2.42000161e+03 7.20175811e-01 7.42646223e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -4.64796601e-09 -2.86082114e-09 -8.12833689e-10 ..., -2.11276870e-06 -1.54834504e-06 -1.35316088e-06] ----------------------- var 83 record 12 hdr offset: 462432 data offset: 560971776 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 70121472 79872 900 5 13 0 0 0 0 7031111 1 136075256 0 3185 0 0 1] real hdr: [ 3.37999819e+03 6.51142688e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.12999986e+03 2.88000152e+03 6.74392534e-01 6.98050213e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -3.21022753e-07 -3.50121809e-07 -3.80886405e-07 ..., -4.18232531e-07 -2.71487210e-07 -2.31395134e-07] ----------------------- var 83 record 13 hdr offset: 462944 data offset: 561610752 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 70201344 79872 900 5 14 0 0 0 0 7031111 1 136231656 0 3185 0 0 1] real hdr: [ 3.91999946e+03 6.02314441e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.65000079e+03 3.37999819e+03 6.26490534e-01 6.51142688e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.06803912e-07 3.30520493e-07 3.54794395e-07 ..., -2.92909803e-08 -2.65089390e-08 -2.43379006e-08] ----------------------- var 83 record 14 hdr offset: 463456 data offset: 562249728 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 70281216 79872 900 5 15 0 0 0 0 7031111 1 136388056 0 3185 0 0 1] real hdr: [ 4.50000140e+03 5.51988701e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.20999847e+03 3.91999946e+03 5.76877346e-01 6.02314441e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.25570583e-08 4.95921348e-08 5.76425627e-08 ..., -6.17276726e-07 -5.21240793e-07 -4.41859015e-07] ----------------------- var 83 record 15 hdr offset: 463968 data offset: 562888704 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 70361088 79872 900 5 16 0 0 0 0 7031111 1 136544456 0 3185 0 0 1] real hdr: [ 5.12000009e+03 5.00619965e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.81000075e+03 4.50000140e+03 5.25990788e-01 5.51988701e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.91106961e-08 -3.43036675e-08 -3.95027939e-08 ..., 6.20469848e-07 5.37483061e-07 4.64673604e-07] ----------------------- var 83 record 16 hdr offset: 464480 data offset: 563527680 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 70440960 79872 900 5 17 0 0 0 0 7031111 1 136700856 0 3185 0 0 1] real hdr: [ 5.77999946e+03 4.48693382e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.44999978e+03 5.12000009e+03 4.74301366e-01 5.00619965e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.26072919e-07 1.13478144e-07 1.02101019e-07 ..., 2.36987745e-08 1.06161222e-08 2.25098096e-09] ----------------------- var 83 record 17 hdr offset: 464992 data offset: 564166656 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 70520832 79872 900 5 18 0 0 0 0 7031111 1 136857256 0 3185 0 0 1] real hdr: [ 6.47999950e+03 3.96725773e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.12999948e+03 5.77999946e+03 4.22309896e-01 4.48693382e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.32453252e-07 -1.18304428e-07 -1.05534738e-07 ..., -5.68091307e-09 -8.12859202e-09 -8.85384210e-09] ----------------------- var 83 record 18 hdr offset: 465504 data offset: 564805632 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 70600704 79872 900 5 19 0 0 0 0 7031111 1 137013656 0 3185 0 0 1] real hdr: [ 7.22000022e+03 3.45265283e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.84999986e+03 6.47999950e+03 3.70548863e-01 3.96725773e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 5.87132121e-09 7.52222284e-09 9.41393097e-09 ..., 2.56330157e-09 4.11875156e-09 6.04589090e-09] ----------------------- var 83 record 19 hdr offset: 466016 data offset: 565444608 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 70680576 79872 900 5 20 0 0 0 0 7031111 1 137170056 0 3185 0 0 1] real hdr: [ 8.00000162e+03 2.94891378e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.61000092e+03 7.22000022e+03 3.19582071e-01 3.45265283e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.84718560e-08 9.80132064e-09 -2.04481321e-09 ..., -1.97255901e-09 -2.46441956e-09 -2.55883492e-09] ----------------------- var 83 record 20 hdr offset: 466528 data offset: 566083584 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 70760448 79872 900 5 21 0 0 0 0 7031111 1 137326456 0 3185 0 0 1] real hdr: [ 8.81999976e+03 2.46215071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.40999873e+03 8.00000162e+03 2.70004882e-01 2.94891378e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.58928367e-06 2.58683735e-06 2.57886109e-06 ..., -3.17090104e-11 -2.27862909e-10 -7.33847094e-10] ----------------------- var 83 record 21 hdr offset: 467040 data offset: 566722560 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 70840320 79872 900 5 22 0 0 0 0 7031111 1 137482856 0 3185 0 0 1] real hdr: [ 9.67999858e+03 1.99878209e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.25000113e+03 8.81999976e+03 2.22443261e-01 2.46215071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.27697535e-06 -1.25166741e-06 -1.22156632e-06 ..., 6.42666649e-12 3.46562969e-12 -1.33755030e-11] ----------------------- var 83 record 22 hdr offset: 467552 data offset: 567361536 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 70920192 79872 900 5 23 0 0 0 0 7031111 1 137639256 0 3185 0 0 1] real hdr: [ 1.05799981e+04 1.56554224e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.01300003e+04 9.67999858e+03 1.77555424e-01 1.99878209e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.51021925e-06 -1.51381857e-06 -1.52386065e-06 ..., 4.50338183e-10 1.13884006e-10 5.42113646e-11] ----------------------- var 83 record 23 hdr offset: 468064 data offset: 568000512 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 71000064 79872 900 5 24 0 0 0 0 7031111 1 137795656 0 3185 0 0 1] real hdr: [ 1.15199982e+04 1.16947874e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.10500001e+04 1.05799981e+04 1.36030234e-01 1.56554224e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.59333819e-07 4.52218671e-07 4.47259794e-07 ..., 1.59329687e-08 1.62882206e-08 1.49876023e-08] ----------------------- var 83 record 24 hdr offset: 468576 data offset: 568639488 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 71079936 79872 900 5 25 0 0 0 0 7031111 1 137952056 0 3185 0 0 1] real hdr: [ 1.24999991e+04 8.17952369e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.20100006e+04 1.15199982e+04 9.85881076e-02 1.16947874e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -5.13561076e-07 -5.07901973e-07 -5.05250910e-07 ..., -1.76038473e-08 -1.75704642e-08 -1.60425735e-08] ----------------------- var 83 record 25 hdr offset: 469088 data offset: 569278464 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 71159808 79872 900 5 26 0 0 0 0 7031111 1 138108456 0 3185 0 0 1] real hdr: [ 1.35200006e+04 5.18637157e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30100018e+04 1.24999991e+04 6.59807861e-02 8.17952369e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -7.87313326e-08 -7.34388621e-08 -6.91528257e-08 ..., 1.11407473e-06 1.08603422e-06 1.06172740e-06] ----------------------- var 83 record 26 hdr offset: 469600 data offset: 569917440 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 71239680 79872 900 5 27 0 0 0 0 7031111 1 138264856 0 3185 0 0 1] real hdr: [ 1.45807997e+04 2.79368177e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.40504001e+04 1.35200006e+04 3.89823900e-02 5.18637157e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.22724817e-08 1.72349157e-08 2.23455103e-08 ..., -1.21821870e-06 -1.18458104e-06 -1.15598550e-06] ----------------------- var 83 record 27 hdr offset: 470112 data offset: 570556416 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 71319552 79872 900 5 28 0 0 0 0 7031111 1 138421256 0 3185 0 0 1] real hdr: [ 1.56946399e+04 1.07164793e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.51377198e+04 1.45807997e+04 1.83146873e-02 2.79368177e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.54222471e-06 -1.63662935e-06 -1.72911143e-06 ..., -2.57958632e-08 -3.10070831e-08 -3.47142119e-08] ----------------------- var 83 record 28 hdr offset: 470624 data offset: 571195392 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 71399424 79872 900 5 29 0 0 0 0 7031111 1 138577656 0 3185 0 0 1] real hdr: [ 1.68753114e+04 1.30179090e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.62849737e+04 1.56946399e+04 4.87210933e-03 1.07164793e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.83521900e-06 1.92908192e-06 2.02212641e-06 ..., -1.31583022e-07 -1.38850297e-07 -1.42966016e-07] ----------------------- var 83 record 29 hdr offset: 471136 data offset: 571834368 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 71479296 79872 900 5 30 0 0 0 0 7031111 1 138734056 0 3185 0 0 1] real hdr: [ 1.81386262e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.75069688e+04 1.68753114e+04 0.00000000e+00 1.30179090e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -5.53752910e-09 -6.73670764e-09 -8.20109225e-09 ..., 1.69935888e-07 1.81055910e-07 1.87855392e-07] ----------------------- var 83 record 30 hdr offset: 471648 data offset: 572473344 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 71559168 79872 900 5 31 0 0 0 0 7031111 1 138890456 0 3185 0 0 1] real hdr: [ 1.95030104e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.88208202e+04 1.81386262e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 9.51274117e-08 1.12095044e-07 1.31440274e-07 ..., -1.95687822e-09 -2.43509879e-09 -2.79797208e-09] ----------------------- var 83 record 31 hdr offset: 472160 data offset: 573112320 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 71639040 79872 900 5 32 0 0 0 0 7031111 1 139046856 0 3185 0 0 1] real hdr: [ 2.09901876e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.02465990e+04 1.95030104e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -7.34886285e-08 -9.21130408e-08 -1.13300061e-07 ..., 3.26224381e-09 3.66809449e-09 4.00252098e-09] ----------------------- var 83 record 32 hdr offset: 472672 data offset: 573751296 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 71718912 79872 900 5 33 0 0 0 0 7031111 1 139203256 0 3185 0 0 1] real hdr: [ 2.26260817e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.18081366e+04 2.09901876e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -4.29379057e-08 -4.37540635e-08 -4.46678960e-08 ..., 4.57543448e-10 4.34331932e-10 4.13791418e-10] ----------------------- var 83 record 33 hdr offset: 473184 data offset: 574390272 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 71798784 79872 900 5 34 0 0 0 0 7031111 1 139359656 0 3185 0 0 1] real hdr: [ 2.44582854e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.35421836e+04 2.26260817e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -4.52733007e-09 -5.03922104e-09 -5.63352742e-09 ..., 2.09858988e-11 2.58637989e-11 2.89444788e-11] ----------------------- var 83 record 34 hdr offset: 473696 data offset: 575029248 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 71878656 79872 900 5 35 0 0 0 0 7031111 1 139516056 0 3185 0 0 1] real hdr: [ 2.65836402e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.55209609e+04 2.44582854e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 5.32844924e-09 5.97613381e-09 6.72722322e-09 ..., -4.83005996e-11 -4.38839208e-11 -4.09049496e-11] ----------------------- var 83 record 35 hdr offset: 474208 data offset: 575668224 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 71958528 79872 900 5 36 0 0 0 0 7031111 1 139672456 0 3185 0 0 1] real hdr: [ 2.92190802e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.79013583e+04 2.65836402e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -3.82172125e-08 -4.06261265e-08 -4.31595026e-08 ..., 1.99572622e-10 1.90882851e-10 1.83913496e-10] ----------------------- var 83 record 36 hdr offset: 474720 data offset: 576307200 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 72038400 79872 900 5 37 0 0 0 0 7031111 1 139828856 0 3185 0 0 1] real hdr: [ 3.29086931e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.10638886e+04 2.92190802e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.55233717e-08 4.83658660e-08 5.13463867e-08 ..., -1.67742528e-10 -1.63697611e-10 -1.59681365e-10] ----------------------- var 83 record 37 hdr offset: 475232 data offset: 576946176 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 72118272 79872 900 5 38 0 0 0 0 7031111 1 139985256 0 3185 0 0 1] real hdr: [ 3.92548336e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.60817633e+04 3.29086931e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 84: nz = 38, nt = 1 var 84 record 0 hdr offset: 475744 data offset: 577585152 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 72198144 79872 900 6 1 0 0 0 0 7031111 1 140141656 0 3186 0 0 1] real hdr: [ 2.00003377e+01 9.97716462e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.99820611e+00 0.00000000e+00 9.98858129e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.09720684 -0.09821519 -0.0988038 ..., 0.02439822 0.02664029 0.02957285] ----------------------- var 84 record 1 hdr offset: 476256 data offset: 578224128 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 72278016 79872 900 6 2 0 0 0 0 7031111 1 140297596 0 3186 0 0 1] real hdr: [ 8.00013508e+01 9.90881510e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.99988815e+01 2.00003377e+01 9.94296273e-01 9.97716462e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.00266592 0.00225396 0.00189312 ..., -0.02171884 -0.02244605 -0.02313847] ----------------------- var 84 record 2 hdr offset: 476768 data offset: 578863104 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 72357888 79872 900 6 3 0 0 0 0 7031111 1 140453536 0 3186 0 0 1] real hdr: [ 1.79999114e+02 9.79542572e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30000232e+02 8.00013508e+01 9.85203885e-01 9.90881510e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.0070381 0.00686637 0.00664348 ..., -0.02658319 -0.02708321 -0.02749181] ----------------------- var 84 record 3 hdr offset: 477280 data offset: 579502080 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 72437760 79872 900 6 4 0 0 0 0 7031111 1 140609476 0 3186 0 0 1] real hdr: [ 3.20001478e+02 9.63777064e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.49998333e+02 1.79999114e+02 9.71644051e-01 9.79542572e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.01551984 -0.01542769 -0.01504252 ..., -0.01822957 -0.0195913 -0.0208261 ] ----------------------- var 84 record 4 hdr offset: 477792 data offset: 580141056 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 72517632 79872 900 6 5 0 0 0 0 7031111 1 140765416 0 3186 0 0 1] real hdr: [ 5.00000592e+02 9.43695500e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.10001035e+02 3.20001478e+02 9.53709855e-01 9.63777064e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.03340201 -0.03331253 -0.03330179 ..., 0.04983612 0.05207298 0.05419889] ----------------------- var 84 record 5 hdr offset: 478304 data offset: 580780032 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 72597504 79872 900 6 6 0 0 0 0 7031111 1 140921356 0 3186 0 0 1] real hdr: [ 7.20000381e+02 9.19438386e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.10000486e+02 5.00000592e+02 9.31527464e-01 9.43695500e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -5.91812050e-03 -5.92643674e-03 -5.91810234e-03 ..., 6.49900414e-07 7.63858168e-07 8.57000600e-07] ----------------------- var 84 record 6 hdr offset: 478816 data offset: 581419008 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 72677376 79872 900 6 7 0 0 0 0 7031111 1 141077296 0 3186 0 0 1] real hdr: [ 9.80000846e+02 8.91177995e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.50000613e+02 7.20000381e+02 9.05253051e-01 9.19438386e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.60042009e-06 -1.77976415e-06 -1.92317907e-06 ..., 3.20237845e-08 -1.28586422e-08 -3.28660406e-08] ----------------------- var 84 record 7 hdr offset: 479328 data offset: 582057984 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 72757248 79872 900 6 8 0 0 0 0 7031111 1 141233236 0 3186 0 0 1] real hdr: [ 1.27999806e+03 8.59118341e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.13000142e+03 9.80000846e+02 8.75074549e-01 8.91177995e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.24151745e-06 1.38107043e-06 1.48438198e-06 ..., 5.09034370e-09 -1.32907829e-07 -2.52808547e-07] ----------------------- var 84 record 8 hdr offset: 479840 data offset: 582696960 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 72837120 79872 900 6 9 0 0 0 0 7031111 1 141389176 0 3186 0 0 1] real hdr: [ 1.61999988e+03 8.23493502e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.44999897e+03 1.27999806e+03 8.41211628e-01 8.59118341e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.67793473e-07 1.86525227e-07 2.09079104e-07 ..., 5.55414736e-08 5.08379792e-08 5.32343725e-09] ----------------------- var 84 record 9 hdr offset: 480352 data offset: 583335936 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 72916992 79872 900 6 10 0 0 0 0 7031111 1 141545116 0 3186 0 0 1] real hdr: [ 1.99999844e+03 7.84570542e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81000112e+03 1.61999988e+03 8.03914038e-01 8.23493502e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 4.08387351e-08 3.89140453e-08 3.83954131e-08 ..., -3.52324065e-07 -2.68876647e-07 -2.13193189e-07] ----------------------- var 84 record 10 hdr offset: 480864 data offset: 583974912 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 72996864 79872 900 6 11 0 0 0 0 7031111 1 141701056 0 3186 0 0 1] real hdr: [ 2.42000161e+03 7.42646223e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.21000002e+03 1.99999844e+03 7.63464495e-01 7.84570542e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -4.37585861e-08 -4.22630038e-08 -4.19166888e-08 ..., 4.50170674e-08 3.91176059e-07 6.24632719e-07] ----------------------- var 84 record 11 hdr offset: 481376 data offset: 584613888 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 73076736 79872 900 6 12 0 0 0 0 7031111 1 141856996 0 3186 0 0 1] real hdr: [ 2.88000152e+03 6.98050213e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.64999960e+03 2.42000161e+03 7.20175811e-01 7.42646223e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.02450151e-07 -1.08500458e-07 -1.17263752e-07 ..., 5.71032274e-07 3.70744544e-07 2.46488071e-07] ----------------------- var 84 record 12 hdr offset: 481888 data offset: 585252864 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 73156608 79872 900 6 13 0 0 0 0 7031111 1 142012936 0 3186 0 0 1] real hdr: [ 3.37999819e+03 6.51142688e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.12999986e+03 2.88000152e+03 6.74392534e-01 6.98050213e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -4.80280789e-07 -5.28677333e-07 -5.77930962e-07 ..., 1.60628261e-07 4.31415472e-08 -1.01191864e-08] ----------------------- var 84 record 13 hdr offset: 482400 data offset: 585891840 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 73236480 79872 900 6 14 0 0 0 0 7031111 1 142168876 0 3186 0 0 1] real hdr: [ 3.91999946e+03 6.02314441e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.65000079e+03 3.37999819e+03 6.26490534e-01 6.51142688e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 5.43209183e-07 5.88899013e-07 6.36051027e-07 ..., 1.33896393e-07 1.10287139e-07 9.00121506e-08] ----------------------- var 84 record 14 hdr offset: 482912 data offset: 586530816 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 73316352 79872 900 6 15 0 0 0 0 7031111 1 142324816 0 3186 0 0 1] real hdr: [ 4.50000140e+03 5.51988701e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.20999847e+03 3.91999946e+03 5.76877346e-01 6.02314441e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 4.23071036e-08 5.22658432e-08 6.41018474e-08 ..., 1.05404160e-06 9.39237395e-07 8.10001893e-07] ----------------------- var 84 record 15 hdr offset: 483424 data offset: 587169792 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 73396224 79872 900 6 16 0 0 0 0 7031111 1 142480756 0 3186 0 0 1] real hdr: [ 5.12000009e+03 5.00619965e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.81000075e+03 4.50000140e+03 5.25990788e-01 5.51988701e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -2.25556445e-08 -2.43997356e-08 -2.64926001e-08 ..., -9.24044059e-07 -7.54617872e-07 -5.72685451e-07] ----------------------- var 84 record 16 hdr offset: 483936 data offset: 587808768 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 73476096 79872 900 6 17 0 0 0 0 7031111 1 142636696 0 3186 0 0 1] real hdr: [ 5.77999946e+03 4.48693382e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.44999978e+03 5.12000009e+03 4.74301366e-01 5.00619965e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -6.55311965e-08 -6.15037976e-08 -5.76610226e-08 ..., -1.59021155e-07 -1.75388536e-07 -1.94367288e-07] ----------------------- var 84 record 17 hdr offset: 484448 data offset: 588447744 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 73555968 79872 900 6 18 0 0 0 0 7031111 1 142792636 0 3186 0 0 1] real hdr: [ 6.47999950e+03 3.96725773e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.12999948e+03 5.77999946e+03 4.22309896e-01 4.48693382e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 7.22224769e-08 6.72644092e-08 6.26489580e-08 ..., -9.36087119e-08 -1.04601078e-07 -1.10464939e-07] ----------------------- var 84 record 18 hdr offset: 484960 data offset: 589086720 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 73635840 79872 900 6 19 0 0 0 0 7031111 1 142948576 0 3186 0 0 1] real hdr: [ 7.22000022e+03 3.45265283e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.84999986e+03 6.47999950e+03 3.70548863e-01 3.96725773e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 5.71811327e-08 6.48454019e-08 7.36141885e-08 ..., -1.75000148e-09 -6.08998718e-09 -1.37263987e-08] ----------------------- var 84 record 19 hdr offset: 485472 data offset: 589725696 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 73715712 79872 900 6 20 0 0 0 0 7031111 1 143104516 0 3186 0 0 1] real hdr: [ 8.00000162e+03 2.94891378e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.61000092e+03 7.22000022e+03 3.19582071e-01 3.45265283e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.04401687e-08 -2.16234888e-08 -4.66287737e-08 ..., -2.12530260e-09 -2.17561436e-09 -1.77936488e-09] ----------------------- var 84 record 20 hdr offset: 485984 data offset: 590364672 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 73795584 79872 900 6 21 0 0 0 0 7031111 1 143260456 0 3186 0 0 1] real hdr: [ 8.81999976e+03 2.46215071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.40999873e+03 8.00000162e+03 2.70004882e-01 2.94891378e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 5.71933697e-07 5.87207410e-07 5.99405382e-07 ..., -1.57113800e-09 -2.63038080e-09 -4.71497597e-09] ----------------------- var 84 record 21 hdr offset: 486496 data offset: 591003648 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 73875456 79872 900 6 22 0 0 0 0 7031111 1 143416396 0 3186 0 0 1] real hdr: [ 9.67999858e+03 1.99878209e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.25000113e+03 8.81999976e+03 2.22443261e-01 2.46215071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.14836453e-07 -1.40206339e-07 -1.71608008e-07 ..., -6.67344478e-12 -3.41604661e-11 -3.25466154e-10] ----------------------- var 84 record 22 hdr offset: 487008 data offset: 591642624 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 73955328 79872 900 6 23 0 0 0 0 7031111 1 143572336 0 3186 0 0 1] real hdr: [ 1.05799981e+04 1.56554224e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.01300003e+04 9.67999858e+03 1.77555424e-01 1.99878209e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -5.78986715e-07 -5.40589497e-07 -5.01282614e-07 ..., 1.65299452e-09 4.48630633e-10 3.77166964e-10] ----------------------- var 84 record 23 hdr offset: 487520 data offset: 592281600 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 74035200 79872 900 6 24 0 0 0 0 7031111 1 143728276 0 3186 0 0 1] real hdr: [ 1.15199982e+04 1.16947874e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.10500001e+04 1.05799981e+04 1.36030234e-01 1.56554224e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.60677956e-07 -1.61015706e-07 -1.63527645e-07 ..., 3.39565509e-09 6.08794704e-09 6.82982204e-09] ----------------------- var 84 record 24 hdr offset: 488032 data offset: 592920576 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 74115072 79872 900 6 25 0 0 0 0 7031111 1 143884216 0 3186 0 0 1] real hdr: [ 1.24999991e+04 8.17952369e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.20100006e+04 1.15199982e+04 9.85881076e-02 1.16947874e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.71229615e-07 1.69146759e-07 1.68969621e-07 ..., -5.47525847e-09 -6.97645497e-09 -7.34480343e-09] ----------------------- var 84 record 25 hdr offset: 488544 data offset: 593559552 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 74194944 79872 900 6 26 0 0 0 0 7031111 1 144040156 0 3186 0 0 1] real hdr: [ 1.35200006e+04 5.18637157e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30100018e+04 1.24999991e+04 6.59807861e-02 8.17952369e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -4.18514325e-08 -4.08747205e-08 -4.08336476e-08 ..., -1.29519719e-07 -1.18254881e-07 -1.05634619e-07] ----------------------- var 84 record 26 hdr offset: 489056 data offset: 594198528 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 74274816 79872 900 6 27 0 0 0 0 7031111 1 144196096 0 3186 0 0 1] real hdr: [ 1.45807997e+04 2.79368177e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.40504001e+04 1.35200006e+04 3.89823900e-02 5.18637157e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -4.97917441e-08 -3.51304124e-08 -2.01469348e-08 ..., 1.57448611e-07 1.47841362e-07 1.36687589e-07] ----------------------- var 84 record 27 hdr offset: 489568 data offset: 594837504 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 74354688 79872 900 6 28 0 0 0 0 7031111 1 144352036 0 3186 0 0 1] real hdr: [ 1.56946399e+04 1.07164793e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.51377198e+04 1.45807997e+04 1.83146873e-02 2.79368177e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 4.63145881e-07 4.44096258e-07 4.23164835e-07 ..., -2.30787442e-08 -2.73092571e-08 -3.20490727e-08] ----------------------- var 84 record 28 hdr offset: 490080 data offset: 595476480 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 74434560 79872 900 6 29 0 0 0 0 7031111 1 144507976 0 3186 0 0 1] real hdr: [ 1.68753114e+04 1.30179090e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.62849737e+04 1.56946399e+04 4.87210933e-03 1.07164793e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -4.11541237e-07 -4.08721576e-07 -4.03159106e-07 ..., -2.57332928e-08 -2.56654964e-08 -2.51466048e-08] ----------------------- var 84 record 29 hdr offset: 490592 data offset: 596115456 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 74514432 79872 900 6 30 0 0 0 0 7031111 1 144663916 0 3186 0 0 1] real hdr: [ 1.81386262e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.75069688e+04 1.68753114e+04 0.00000000e+00 1.30179090e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.17202981e-09 1.23240296e-09 1.35441258e-09 ..., 3.81423924e-08 3.95524253e-08 4.11210479e-08] ----------------------- var 84 record 30 hdr offset: 491104 data offset: 596754432 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 74594304 79872 900 6 31 0 0 0 0 7031111 1 144819856 0 3186 0 0 1] real hdr: [ 1.95030104e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.88208202e+04 1.81386262e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.93306926e-09 3.53173912e-09 5.35019851e-09 ..., -3.42074857e-09 -3.75466236e-09 -4.24862634e-09] ----------------------- var 84 record 31 hdr offset: 491616 data offset: 597393408 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 74674176 79872 900 6 32 0 0 0 0 7031111 1 144975796 0 3186 0 0 1] real hdr: [ 2.09901876e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.02465990e+04 1.95030104e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.71260623e-08 -1.91806890e-08 -2.15242029e-08 ..., 4.38948522e-09 4.75251838e-09 5.29889377e-09] ----------------------- var 84 record 32 hdr offset: 492128 data offset: 598032384 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 74754048 79872 900 6 33 0 0 0 0 7031111 1 145131736 0 3186 0 0 1] real hdr: [ 2.26260817e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.18081366e+04 2.09901876e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.83124591e-08 1.86344664e-08 1.90011971e-08 ..., -9.07103628e-11 -9.12560374e-11 -8.81325984e-11] ----------------------- var 84 record 33 hdr offset: 492640 data offset: 598671360 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 74833920 79872 900 6 34 0 0 0 0 7031111 1 145287676 0 3186 0 0 1] real hdr: [ 2.44582854e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.35421836e+04 2.26260817e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.96880290e-09 -2.16033014e-09 -2.40233011e-09 ..., -6.18346043e-12 -9.62084839e-12 -1.37042877e-11] ----------------------- var 84 record 34 hdr offset: 493152 data offset: 599310336 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 74913792 79872 900 6 35 0 0 0 0 7031111 1 145443616 0 3186 0 0 1] real hdr: [ 2.65836402e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.55209609e+04 2.44582854e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 2.06330086e-09 2.34191999e-09 2.68276934e-09 ..., -1.16756049e-10 -1.08770694e-10 -1.00936752e-10] ----------------------- var 84 record 35 hdr offset: 493664 data offset: 599949312 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 74993664 79872 900 6 36 0 0 0 0 7031111 1 145599556 0 3186 0 0 1] real hdr: [ 2.92190802e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.79013583e+04 2.65836402e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.02937161e-08 -1.10215783e-08 -1.17983125e-08 ..., 4.47127863e-10 4.36172015e-10 4.23604180e-10] ----------------------- var 84 record 36 hdr offset: 494176 data offset: 600588288 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 75073536 79872 900 6 37 0 0 0 0 7031111 1 145755496 0 3186 0 0 1] real hdr: [ 3.29086931e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.10638886e+04 2.92190802e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.19817489e-08 1.27979485e-08 1.36547982e-08 ..., -3.67335828e-10 -3.64596547e-10 -3.59984625e-10] ----------------------- var 84 record 37 hdr offset: 494688 data offset: 601227264 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 75153408 79872 900 6 38 0 0 0 0 7031111 1 145911436 0 3186 0 0 1] real hdr: [ 3.92548336e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.60817633e+04 3.29086931e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 85: nz = 37, nt = 1 var 85 record 0 hdr offset: 495200 data offset: 601866240 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 75233280 79872 900 33 1 0 0 0 0 7031111 1 146067376 0 3216 0 0 1] real hdr: [ 2.00003377e+01 9.97716462e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.99820611e+00 0.00000000e+00 9.98858129e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 11.1311903 11.01538563 10.89190197 ..., -2.51573873 -2.32336736 -2.12963247] ----------------------- var 85 record 1 hdr offset: 495712 data offset: 602505216 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 75313152 79872 900 33 2 0 0 0 0 7031111 1 146223776 0 3216 0 0 1] real hdr: [ 8.00013508e+01 9.90881510e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.99988815e+01 2.00003377e+01 9.94296273e-01 9.97716462e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 11.84929371 11.90907669 12.01660156 ..., 3.03388524 3.0186398 2.9976964 ] ----------------------- var 85 record 2 hdr offset: 496224 data offset: 603144192 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 75393024 79872 900 33 3 0 0 0 0 7031111 1 146380176 0 3216 0 0 1] real hdr: [ 1.79999114e+02 9.79542572e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30000232e+02 8.00013508e+01 9.85203885e-01 9.90881510e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 10.33813 10.47502041 10.70191765 ..., -1.08497763 -1.12009549 -1.14855635] ----------------------- var 85 record 3 hdr offset: 496736 data offset: 603783168 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 75472896 79872 900 33 4 0 0 0 0 7031111 1 146536576 0 3216 0 0 1] real hdr: [ 3.20001478e+02 9.63777064e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.49998333e+02 1.79999114e+02 9.71644051e-01 9.79542572e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 7.95811176 7.92487049 7.90749598 ..., -8.30422211 -8.50788593 -8.72781467] ----------------------- var 85 record 4 hdr offset: 497248 data offset: 604422144 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 75552768 79872 900 33 5 0 0 0 0 7031111 1 146692976 0 3216 0 0 1] real hdr: [ 5.00000592e+02 9.43695500e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.10001035e+02 3.20001478e+02 9.53709855e-01 9.63777064e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-6.91600847 -6.92667055 -6.68833065 ..., 0. 0. 0. ] ----------------------- var 85 record 5 hdr offset: 497760 data offset: 605061120 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 75632640 79872 900 33 6 0 0 0 0 7031111 1 146849376 0 3216 0 0 1] real hdr: [ 7.20000381e+02 9.19438386e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.10000486e+02 5.00000592e+02 9.31527464e-01 9.43695500e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., -0.00248349 -0.00238629 -0.00229666] ----------------------- var 85 record 6 hdr offset: 498272 data offset: 605700096 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 75712512 79872 900 33 7 0 0 0 0 7031111 1 147005776 0 3216 0 0 1] real hdr: [ 9.80000846e+02 8.91177995e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.50000613e+02 7.20000381e+02 9.05253051e-01 9.19438386e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., -0.00110807 -0.00102157 -0.00092737] ----------------------- var 85 record 7 hdr offset: 498784 data offset: 606339072 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 75792384 79872 900 33 8 0 0 0 0 7031111 1 147162176 0 3216 0 0 1] real hdr: [ 1.27999806e+03 8.59118341e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.13000142e+03 9.80000846e+02 8.75074549e-01 8.91177995e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00176067 -0.00184604 -0.00195256 ..., -0.00173789 -0.00177781 -0.00174887] ----------------------- var 85 record 8 hdr offset: 499296 data offset: 606978048 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 75872256 79872 900 33 9 0 0 0 0 7031111 1 147318576 0 3216 0 0 1] real hdr: [ 1.61999988e+03 8.23493502e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.44999897e+03 1.27999806e+03 8.41211628e-01 8.59118341e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00034837 -0.00037506 -0.00042207 ..., -0.00174047 -0.00187555 -0.0019874 ] ----------------------- var 85 record 9 hdr offset: 499808 data offset: 607617024 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 75952128 79872 900 33 10 0 0 0 0 7031111 1 147474976 0 3216 0 0 1] real hdr: [ 1.99999844e+03 7.84570542e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81000112e+03 1.61999988e+03 8.03914038e-01 8.23493502e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.0005099 -0.00051264 -0.00052137 ..., -0.00237288 -0.00228787 -0.00235321] ----------------------- var 85 record 10 hdr offset: 500320 data offset: 608256000 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 76032000 79872 900 33 11 0 0 0 0 7031111 1 147631376 0 3216 0 0 1] real hdr: [ 2.42000161e+03 7.42646223e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.21000002e+03 1.99999844e+03 7.63464495e-01 7.84570542e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00045073 -0.00042567 -0.00040674 ..., -0.00238349 -0.00200362 -0.00184318] ----------------------- var 85 record 11 hdr offset: 500832 data offset: 608894976 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 76111872 79872 900 33 12 0 0 0 0 7031111 1 147787776 0 3216 0 0 1] real hdr: [ 2.88000152e+03 6.98050213e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.64999960e+03 2.42000161e+03 7.20175811e-01 7.42646223e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00013815 -0.00014582 -0.00015539 ..., -0.00186534 -0.0012766 -0.0009838 ] ----------------------- var 85 record 12 hdr offset: 501344 data offset: 609533952 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 76191744 79872 900 33 13 0 0 0 0 7031111 1 147944176 0 3216 0 0 1] real hdr: [ 3.37999819e+03 6.51142688e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.12999986e+03 2.88000152e+03 6.74392534e-01 6.98050213e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00081204 -0.00087058 -0.00093407 ..., -0.00068108 -0.00043165 -0.00034152] ----------------------- var 85 record 13 hdr offset: 501856 data offset: 610172928 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 76271616 79872 900 33 14 0 0 0 0 7031111 1 148100576 0 3216 0 0 1] real hdr: [ 3.91999946e+03 6.02314441e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.65000079e+03 3.37999819e+03 6.26490534e-01 6.51142688e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00087154 -0.00094211 -0.00101715 ..., -0.0002208 -0.00019424 -0.00016881] ----------------------- var 85 record 14 hdr offset: 502368 data offset: 610811904 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 76351488 79872 900 33 15 0 0 0 0 7031111 1 148256976 0 3216 0 0 1] real hdr: [ 4.50000140e+03 5.51988701e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.20999847e+03 3.91999946e+03 5.76877346e-01 6.02314441e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00016003 -0.00018701 -0.00021768 ..., -0.0018539 -0.00163826 -0.001403 ] ----------------------- var 85 record 15 hdr offset: 502880 data offset: 611450880 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 76431360 79872 900 33 16 0 0 0 0 7031111 1 148413376 0 3216 0 0 1] real hdr: [ 5.12000009e+03 5.00619965e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.81000075e+03 4.50000140e+03 5.25990788e-01 5.51988701e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00010639 -0.00011264 -0.00011971 ..., -0.00153613 -0.00145407 -0.00134977] ----------------------- var 85 record 16 hdr offset: 503392 data offset: 612089856 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 76511232 79872 900 33 17 0 0 0 0 7031111 1 148569776 0 3216 0 0 1] real hdr: [ 5.77999946e+03 4.48693382e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.44999978e+03 5.12000009e+03 4.74301366e-01 5.00619965e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00029018 -0.00026375 -0.00023985 ..., -0.0004728 -0.0005213 -0.00057089] ----------------------- var 85 record 17 hdr offset: 503904 data offset: 612728832 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 76591104 79872 900 33 18 0 0 0 0 7031111 1 148726176 0 3216 0 0 1] real hdr: [ 6.47999950e+03 3.96725773e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.12999948e+03 5.77999946e+03 4.22309896e-01 4.48693382e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00029109 -0.00026881 -0.0002484 ..., -0.00012851 -0.00015167 -0.0001771 ] ----------------------- var 85 record 18 hdr offset: 504416 data offset: 613367808 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 76670976 79872 900 33 19 0 0 0 0 7031111 1 148882576 0 3216 0 0 1] real hdr: [ 7.22000022e+03 3.45265283e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.84999986e+03 6.47999950e+03 3.70548863e-01 3.96725773e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.10268702e-04 -1.22925354e-04 -1.37271069e-04 ..., -1.81175601e-05 -2.83020781e-05 -4.41214979e-05] ----------------------- var 85 record 19 hdr offset: 504928 data offset: 614006784 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 76750848 79872 900 33 20 0 0 0 0 7031111 1 149038976 0 3216 0 0 1] real hdr: [ 8.00000162e+03 2.94891378e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.61000092e+03 7.22000022e+03 3.19582071e-01 3.45265283e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -9.51540060e-05 -7.88268881e-05 -6.94336413e-05 ..., -8.66539995e-06 -1.15965277e-05 -1.64627581e-05] ----------------------- var 85 record 20 hdr offset: 505440 data offset: 614645760 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 76830720 79872 900 33 21 0 0 0 0 7031111 1 149195376 0 3216 0 0 1] real hdr: [ 8.81999976e+03 2.46215071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.40999873e+03 8.00000162e+03 2.70004882e-01 2.94891378e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.67827308e-03 -1.63068320e-03 -1.59384508e-03 ..., -2.23831603e-06 -3.43618217e-06 -5.63316462e-06] ----------------------- var 85 record 21 hdr offset: 505952 data offset: 615284736 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 76910592 79872 900 33 22 0 0 0 0 7031111 1 149351776 0 3216 0 0 1] real hdr: [ 9.67999858e+03 1.99878209e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.25000113e+03 8.81999976e+03 2.22443261e-01 2.46215071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.97561504e-03 -2.01096502e-03 -2.05448852e-03 ..., -4.66120618e-08 -1.07523604e-07 -5.51963467e-07] ----------------------- var 85 record 22 hdr offset: 506464 data offset: 615923712 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 76990464 79872 900 33 23 0 0 0 0 7031111 1 149508176 0 3216 0 0 1] real hdr: [ 1.05799981e+04 1.56554224e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.01300003e+04 9.67999858e+03 1.77555424e-01 1.99878209e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -4.02153411e-04 -3.81887541e-04 -3.62525898e-04 ..., -3.28365809e-06 -1.12991881e-06 -7.79028426e-07] ----------------------- var 85 record 23 hdr offset: 506976 data offset: 616562688 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 77070336 79872 900 33 24 0 0 0 0 7031111 1 149664576 0 3216 0 0 1] real hdr: [ 1.15199982e+04 1.16947874e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.10500001e+04 1.05799981e+04 1.36030234e-01 1.56554224e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.72527657e-04 -2.68411532e-04 -2.66419229e-04 ..., -2.24707492e-05 -2.23624629e-05 -2.05002034e-05] ----------------------- var 85 record 24 hdr offset: 507488 data offset: 617201664 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 77150208 79872 900 33 25 0 0 0 0 7031111 1 149820976 0 3216 0 0 1] real hdr: [ 1.24999991e+04 8.17952369e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.20100006e+04 1.15199982e+04 9.85881076e-02 1.16947874e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.94614932e-04 -2.91634526e-04 -2.89976713e-04 ..., -2.25843050e-05 -2.45983283e-05 -2.31421873e-05] ----------------------- var 85 record 25 hdr offset: 508000 data offset: 617840640 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 77230080 79872 900 33 26 0 0 0 0 7031111 1 149977376 0 3216 0 0 1] real hdr: [ 1.35200006e+04 5.18637157e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30100018e+04 1.24999991e+04 6.59807861e-02 8.17952369e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -5.72886238e-05 -5.40645524e-05 -5.16787622e-05 ..., -7.01741723e-04 -6.89765788e-04 -6.65202970e-04] ----------------------- var 85 record 26 hdr offset: 508512 data offset: 618479616 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 77309952 79872 900 33 27 0 0 0 0 7031111 1 150133776 0 3216 0 0 1] real hdr: [ 1.45807997e+04 2.79368177e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.40504001e+04 1.35200006e+04 3.89823900e-02 5.18637157e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00013316 -0.0001199 -0.00010771 ..., -0.0006071 -0.0006104 -0.00060249] ----------------------- var 85 record 27 hdr offset: 509024 data offset: 619118592 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 77389824 79872 900 33 28 0 0 0 0 7031111 1 150290176 0 3216 0 0 1] real hdr: [ 1.56946399e+04 1.07164793e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.51377198e+04 1.45807997e+04 1.83146873e-02 2.79368177e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -6.06356421e-04 -6.24435837e-04 -6.42969157e-04 ..., -4.55637928e-05 -5.25678443e-05 -6.09283634e-05] ----------------------- var 85 record 28 hdr offset: 509536 data offset: 619757568 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 77469696 79872 900 33 29 0 0 0 0 7031111 1 150446576 0 3216 0 0 1] real hdr: [ 1.68753114e+04 1.30179090e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.62849737e+04 1.56946399e+04 4.87210933e-03 1.07164793e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00154763 -0.0016025 -0.00165598 ..., -0.00017193 -0.00018179 -0.00019365] ----------------------- var 85 record 29 hdr offset: 510048 data offset: 620396544 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 77549568 79872 900 33 30 0 0 0 0 7031111 1 150602976 0 3216 0 0 1] real hdr: [ 1.81386262e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.75069688e+04 1.68753114e+04 0.00000000e+00 1.30179090e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.29443288e-05 -1.53474666e-05 -1.81357809e-05 ..., -1.87599129e-04 -1.96772497e-04 -2.06474098e-04] ----------------------- var 85 record 30 hdr offset: 510560 data offset: 621035520 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 77629440 79872 900 33 31 0 0 0 0 7031111 1 150759376 0 3216 0 0 1] real hdr: [ 1.95030104e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.88208202e+04 1.81386262e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.00318015e-04 -1.14831550e-04 -1.30843750e-04 ..., -9.80366076e-06 -1.01047444e-05 -1.06529978e-05] ----------------------- var 85 record 31 hdr offset: 511072 data offset: 621674496 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 77709312 79872 900 33 32 0 0 0 0 7031111 1 150915776 0 3216 0 0 1] real hdr: [ 2.09901876e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.02465990e+04 1.95030104e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -9.94006768e-05 -1.10929948e-04 -1.23722508e-04 ..., -8.54931204e-06 -9.07027515e-06 -9.87075418e-06] ----------------------- var 85 record 32 hdr offset: 511584 data offset: 622313472 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 77789184 79872 900 33 33 0 0 0 0 7031111 1 151072176 0 3216 0 0 1] real hdr: [ 2.26260817e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.18081366e+04 2.09901876e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -4.30863220e-05 -4.37600502e-05 -4.44401339e-05 ..., -8.90112460e-07 -8.85866200e-07 -8.59048839e-07] ----------------------- var 85 record 33 hdr offset: 512096 data offset: 622952448 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 77869056 79872 900 33 34 0 0 0 0 7031111 1 151228576 0 3216 0 0 1] real hdr: [ 2.44582854e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.35421836e+04 2.26260817e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -4.61340323e-06 -5.00212263e-06 -5.45598323e-06 ..., -5.33268860e-08 -6.09495103e-08 -7.05337584e-08] ----------------------- var 85 record 34 hdr offset: 512608 data offset: 623591424 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 77948928 79872 900 33 35 0 0 0 0 7031111 1 151384976 0 3216 0 0 1] real hdr: [ 2.65836402e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.55209609e+04 2.44582854e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -3.77794777e-06 -4.13950602e-06 -4.55664849e-06 ..., -1.54377105e-07 -1.43784533e-07 -1.33523940e-07] ----------------------- var 85 record 35 hdr offset: 513120 data offset: 624230400 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 78028800 79872 900 33 36 0 0 0 0 7031111 1 151541376 0 3216 0 0 1] real hdr: [ 2.92190802e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.79013583e+04 2.65836402e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.60814725e-05 -1.70677849e-05 -1.81096457e-05 ..., -4.55160034e-07 -4.42277042e-07 -4.28085684e-07] ----------------------- var 85 record 36 hdr offset: 513632 data offset: 624869376 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 65 0 387757194 78108672 79872 900 33 37 0 0 0 0 7031111 1 151697776 0 3216 0 0 1] real hdr: [ 3.29086931e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.10638886e+04 2.92190802e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.55201305e-05 -1.62768974e-05 -1.70596322e-05 ..., -2.85954400e-07 -2.83964653e-07 -2.80667621e-07] ----------------------- =============================== var 86: nz = 1, nt = 1 var 86 record 0 hdr offset: 514144 data offset: 625508352 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 178 0 128 129 0 387757194 78188544 79872 900 33 9999 0 0 0 0 7031111 1 151854176 0 3217 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 11.1311903 11.01538563 10.89190197 ..., -2.51573873 -2.32336736 -2.12963247] ----------------------- =============================== var 87: nz = 37, nt = 1 var 87 record 0 hdr offset: 514656 data offset: 626147328 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 78268416 157696 900 36 1 0 0 0 0 7031111 1 152010576 0 3219 0 0 1] real hdr: [ 4.99988815e+01 9.94296273e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.00003377e+01 0.00000000e+00 9.97716462e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.10535773 -0.10545003 -0.10551265 ..., -0.00444464 -0.00371755 -0.00308432] ----------------------- var 87 record 1 hdr offset: 515168 data offset: 627408896 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 78426112 157696 900 36 2 0 0 0 0 7031111 1 152166976 0 3219 0 0 1] real hdr: [ 1.30000232e+02 9.85203885e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00013508e+01 4.99988815e+01 9.90881510e-01 9.94296273e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.08594422 -0.0858939 -0.08586334 ..., -0.00366575 -0.00306317 -0.00256726] ----------------------- var 87 record 2 hdr offset: 515680 data offset: 628670464 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 78583808 157696 900 36 3 0 0 0 0 7031111 1 152323376 0 3219 0 0 1] real hdr: [ 2.49998333e+02 9.71644051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.79999114e+02 1.30000232e+02 9.79542572e-01 9.85203885e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.08778191 -0.08756191 -0.08755057 ..., -0.00642202 -0.00559536 -0.00485743] ----------------------- var 87 record 3 hdr offset: 516192 data offset: 629932032 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 78741504 157696 900 36 4 0 0 0 0 7031111 1 152479776 0 3219 0 0 1] real hdr: [ 4.10001035e+02 9.53709855e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.20001478e+02 2.49998333e+02 9.63777064e-01 9.71644051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.09570476 -0.09517209 -0.09471102 ..., -0.0108926 -0.01059353 -0.00974119] ----------------------- var 87 record 4 hdr offset: 516704 data offset: 631193600 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 78899200 157696 900 36 5 0 0 0 0 7031111 1 152636176 0 3219 0 0 1] real hdr: [ 6.10000486e+02 9.31527464e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.00000592e+02 4.10001035e+02 9.43695500e-01 9.53709855e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.08125763 -0.08063871 -0.08006627 ..., -0.01349377 -0.01460866 -0.01430703] ----------------------- var 87 record 5 hdr offset: 517216 data offset: 632455168 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 79056896 157696 900 36 6 0 0 0 0 7031111 1 152792576 0 3219 0 0 1] real hdr: [ 8.50000613e+02 9.05253051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.20000381e+02 6.10000486e+02 9.19438386e-01 9.31527464e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.26786154e-02 -1.26775948e-02 -1.26759490e-02 ..., -5.67754405e-08 -1.26913887e-07 -1.71742010e-07] ----------------------- var 87 record 6 hdr offset: 517728 data offset: 633716736 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 79214592 157696 900 36 7 0 0 0 0 7031111 1 152948976 0 3219 0 0 1] real hdr: [ 1.13000142e+03 8.75074549e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.80000846e+02 8.50000613e+02 8.91177995e-01 9.05253051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., 3.88447452e-07 3.08052062e-07 2.47773386e-07] ----------------------- var 87 record 7 hdr offset: 518240 data offset: 634978304 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 79372288 157696 900 36 8 0 0 0 0 7031111 1 153105376 0 3219 0 0 1] real hdr: [ 1.44999897e+03 8.41211628e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.27999806e+03 1.13000142e+03 8.59118341e-01 8.75074549e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.50395240e-06 1.65382429e-06 1.81793149e-06 ..., 7.75818868e-07 7.02488245e-07 6.31039329e-07] ----------------------- var 87 record 8 hdr offset: 518752 data offset: 636239872 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 79529984 157696 900 36 9 0 0 0 0 7031111 1 153261776 0 3219 0 0 1] real hdr: [ 1.81000112e+03 8.03914038e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.61999988e+03 1.44999897e+03 8.23493502e-01 8.41211628e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.12599311e-07 2.27380630e-07 2.46955353e-07 ..., 1.51747927e-06 1.65624204e-06 1.66560369e-06] ----------------------- var 87 record 9 hdr offset: 519264 data offset: 637501440 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 79687680 157696 900 36 10 0 0 0 0 7031111 1 153418176 0 3219 0 0 1] real hdr: [ 2.21000002e+03 7.63464495e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.99999844e+03 1.81000112e+03 7.84570542e-01 8.03914038e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.02873547e-08 -1.37594894e-08 -1.78150815e-08 ..., 2.37247677e-06 2.46294472e-06 2.48365610e-06] ----------------------- var 87 record 10 hdr offset: 519776 data offset: 638763008 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 79845376 157696 900 36 11 0 0 0 0 7031111 1 153574576 0 3219 0 0 1] real hdr: [ 2.64999960e+03 7.20175811e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.42000161e+03 2.21000002e+03 7.42646223e-01 7.63464495e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -4.78857748e-07 -4.67931111e-07 -4.64805074e-07 ..., 6.26678483e-06 5.33862166e-06 5.03420373e-06] ----------------------- var 87 record 11 hdr offset: 520288 data offset: 640024576 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 80003072 157696 900 36 12 0 0 0 0 7031111 1 153730976 0 3219 0 0 1] real hdr: [ 3.12999986e+03 6.74392534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.88000152e+03 2.64999960e+03 6.98050213e-01 7.20175811e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 5.37582837e-09 5.42370370e-09 5.51298084e-09 ..., 7.07343884e-06 5.08276568e-06 4.42389714e-06] ----------------------- var 87 record 12 hdr offset: 520800 data offset: 641286144 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 80160768 157696 900 36 13 0 0 0 0 7031111 1 153887376 0 3219 0 0 1] real hdr: [ 3.65000079e+03 6.26490534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.37999819e+03 3.12999986e+03 6.51142688e-01 6.74392534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -7.59081675e-09 -2.55709356e-09 3.24574201e-09 ..., 1.21636963e-06 7.91033796e-07 6.73717383e-07] ----------------------- var 87 record 13 hdr offset: 521312 data offset: 642547712 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 80318464 157696 900 36 14 0 0 0 0 7031111 1 154043776 0 3219 0 0 1] real hdr: [ 4.20999847e+03 5.76877346e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.91999946e+03 3.65000079e+03 6.02314441e-01 6.26490534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -9.37527018e-07 -1.01678341e-06 -1.10009005e-06 ..., 1.03147043e-08 8.32982093e-09 6.75478498e-09] ----------------------- var 87 record 14 hdr offset: 521824 data offset: 643809280 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 80476160 157696 900 36 15 0 0 0 0 7031111 1 154200176 0 3219 0 0 1] real hdr: [ 4.81000075e+03 5.25990788e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.50000140e+03 4.20999847e+03 5.51988701e-01 5.76877346e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.58698721e-08 -3.46289464e-08 -4.57811219e-08 ..., -7.64104457e-08 -7.01341529e-08 -6.52612029e-08] ----------------------- var 87 record 15 hdr offset: 522336 data offset: 645070848 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 80633856 157696 900 36 16 0 0 0 0 7031111 1 154356576 0 3219 0 0 1] real hdr: [ 5.44999978e+03 4.74301366e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.12000009e+03 4.81000075e+03 5.00619965e-01 5.25990788e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.02134418e-07 1.14542297e-07 1.27613362e-07 ..., -1.93095430e-06 -1.63571970e-06 -1.39205581e-06] ----------------------- var 87 record 16 hdr offset: 522848 data offset: 646332416 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 80791552 157696 900 36 17 0 0 0 0 7031111 1 154512976 0 3219 0 0 1] real hdr: [ 6.12999948e+03 4.22309896e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.77999946e+03 5.44999978e+03 4.48693382e-01 4.74301366e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.44245363e-08 1.11880634e-08 8.59622001e-09 ..., -5.62710585e-08 -1.21768287e-08 1.12066458e-08] ----------------------- var 87 record 17 hdr offset: 523360 data offset: 647593984 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 80949248 157696 900 36 18 0 0 0 0 7031111 1 154669376 0 3219 0 0 1] real hdr: [ 6.84999986e+03 3.70548863e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.47999950e+03 6.12999948e+03 3.96725773e-01 4.22309896e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.91570591e-07 3.50643979e-07 3.14006524e-07 ..., 1.51170093e-08 1.97908142e-08 1.79802885e-08] ----------------------- var 87 record 18 hdr offset: 523872 data offset: 648855552 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 81106944 157696 900 36 19 0 0 0 0 7031111 1 154825776 0 3219 0 0 1] real hdr: [ 7.61000092e+03 3.19582071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.22000022e+03 6.84999986e+03 3.45265283e-01 3.70548863e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.54572149e-09 2.29593112e-09 3.27171737e-09 ..., -1.80864802e-09 -4.42143275e-09 -8.38546468e-09] ----------------------- var 87 record 19 hdr offset: 524384 data offset: 650117120 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 81264640 157696 900 36 20 0 0 0 0 7031111 1 154982176 0 3219 0 0 1] real hdr: [ 8.40999873e+03 2.70004882e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00000162e+03 7.61000092e+03 2.94891378e-01 3.19582071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.84235963e-08 2.39191506e-08 3.03323342e-08 ..., 5.68256695e-09 7.61408016e-09 9.27910473e-09] ----------------------- var 87 record 20 hdr offset: 524896 data offset: 651378688 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 81422336 157696 900 36 21 0 0 0 0 7031111 1 155138576 0 3219 0 0 1] real hdr: [ 9.25000113e+03 2.22443261e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.81999976e+03 8.40999873e+03 2.46215071e-01 2.70004882e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 9.81324470e-08 5.13546926e-08 2.46001055e-08 ..., 6.93310906e-11 6.01651683e-10 1.99832132e-09] ----------------------- var 87 record 21 hdr offset: 525408 data offset: 652640256 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 81580032 157696 900 36 22 0 0 0 0 7031111 1 155294976 0 3219 0 0 1] real hdr: [ 1.01300003e+04 1.77555424e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.67999858e+03 9.25000113e+03 1.99878209e-01 2.22443261e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 7.11664508e-06 7.06328810e-06 7.01497749e-06 ..., -1.78832469e-11 -2.50367847e-11 -1.98682644e-11] ----------------------- var 87 record 22 hdr offset: 525920 data offset: 653901824 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 81737728 157696 900 36 23 0 0 0 0 7031111 1 155451376 0 3219 0 0 1] real hdr: [ 1.10500001e+04 1.36030234e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.05799981e+04 1.01300003e+04 1.56554224e-01 1.77555424e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.79406388e-06 3.80682680e-06 3.83707854e-06 ..., -9.58235528e-13 -1.59064176e-11 -5.50782956e-11] ----------------------- var 87 record 23 hdr offset: 526432 data offset: 655163392 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 81895424 157696 900 36 24 0 0 0 0 7031111 1 155607776 0 3219 0 0 1] real hdr: [ 1.20100006e+04 9.85881076e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.15199982e+04 1.10500001e+04 1.16947874e-01 1.36030234e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.95801088e-08 5.37715005e-08 5.94897049e-08 ..., 1.12195172e-09 2.68049582e-10 8.01047413e-11] ----------------------- var 87 record 24 hdr offset: 526944 data offset: 656424960 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 82053120 157696 900 36 25 0 0 0 0 7031111 1 155764176 0 3219 0 0 1] real hdr: [ 1.30100018e+04 6.59807861e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.24999991e+04 1.20100006e+04 8.17952369e-02 9.85881076e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.12425495e-06 1.11182421e-06 1.10596092e-06 ..., 3.83763781e-08 3.83485990e-08 3.51155735e-08] ----------------------- var 87 record 25 hdr offset: 527456 data offset: 657686528 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 82210816 157696 900 36 26 0 0 0 0 7031111 1 155920576 0 3219 0 0 1] real hdr: [ 1.40504001e+04 3.89823900e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.35200006e+04 1.30100018e+04 5.18637157e-02 6.59807861e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.71724331e-09 3.56881717e-09 3.42731455e-09 ..., 1.79481660e-10 2.25741152e-10 3.09316906e-10] ----------------------- var 87 record 26 hdr offset: 527968 data offset: 658948096 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 82368512 157696 900 36 27 0 0 0 0 7031111 1 156076976 0 3219 0 0 1] real hdr: [ 1.51377198e+04 1.83146873e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.45807997e+04 1.40504001e+04 2.79368177e-02 3.89823900e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.54635134e-07 -1.44146573e-07 -1.35674441e-07 ..., 2.21367293e-06 2.15816317e-06 2.11010173e-06] ----------------------- var 87 record 27 hdr offset: 528480 data offset: 660209664 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 82526208 157696 900 36 28 0 0 0 0 7031111 1 156233376 0 3219 0 0 1] real hdr: [ 1.62849737e+04 4.87210933e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.56946399e+04 1.51377198e+04 1.07164793e-02 1.83146873e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.32079590e-07 -1.12492096e-07 -9.46469303e-08 ..., 1.79509167e-08 2.31227860e-08 2.66512903e-08] ----------------------- var 87 record 28 hdr offset: 528992 data offset: 661471232 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 82683904 157696 900 36 29 0 0 0 0 7031111 1 156389776 0 3219 0 0 1] real hdr: [ 1.75069688e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.68753114e+04 1.62849737e+04 1.30179090e-03 4.87210933e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.69851223e-06 -2.83597404e-06 -2.97196193e-06 ..., -2.37889861e-08 -2.70494739e-08 -2.95193398e-08] ----------------------- var 87 record 29 hdr offset: 529504 data offset: 662732800 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 82841600 157696 900 36 30 0 0 0 0 7031111 1 156546176 0 3219 0 0 1] real hdr: [ 1.88208202e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81386262e+04 1.75069688e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.66266819e-09 5.53637394e-09 6.59649601e-09 ..., -2.11579798e-07 -2.25241191e-07 -2.33616570e-07] ----------------------- var 87 record 30 hdr offset: 530016 data offset: 663994368 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 82999296 157696 900 36 31 0 0 0 0 7031111 1 156702576 0 3219 0 0 1] real hdr: [ 2.02465990e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.95030104e+04 1.88208202e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.28513830e-09 -2.91597400e-09 -3.69324900e-09 ..., -1.19621425e-09 -1.03806806e-09 -9.38943717e-10] ----------------------- var 87 record 31 hdr offset: 530528 data offset: 665255936 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 83156992 157696 900 36 32 0 0 0 0 7031111 1 156858976 0 3219 0 0 1] real hdr: [ 2.18081366e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.09901876e+04 2.02465990e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 9.78742643e-08 1.15129171e-07 1.34751200e-07 ..., -3.26387485e-09 -3.61128931e-09 -3.89582815e-09] ----------------------- var 87 record 32 hdr offset: 531040 data offset: 666517504 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 83314688 157696 900 36 33 0 0 0 0 7031111 1 157015376 0 3219 0 0 1] real hdr: [ 2.35421836e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.26260817e+04 2.18081366e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.21573779e-08 3.27529889e-08 3.34221843e-08 ..., -3.54146077e-10 -3.39880934e-10 -3.26484965e-10] ----------------------- var 87 record 33 hdr offset: 531552 data offset: 667779072 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 83472384 157696 900 36 34 0 0 0 0 7031111 1 157171776 0 3219 0 0 1] real hdr: [ 2.55209609e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.44582854e+04 2.35421836e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 6.37021597e-11 5.42411954e-11 4.55470899e-11 ..., -1.30188854e-11 -1.60539345e-11 -1.79669647e-11] ----------------------- var 87 record 34 hdr offset: 532064 data offset: 669040640 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 83630080 157696 900 36 35 0 0 0 0 7031111 1 157328176 0 3219 0 0 1] real hdr: [ 2.79013583e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.65836402e+04 2.55209609e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.73736716e-09 -3.06306809e-09 -3.43894678e-09 ..., 6.26102438e-14 6.81756625e-14 7.54751585e-14] ----------------------- var 87 record 35 hdr offset: 532576 data offset: 670302208 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 83787776 157696 900 36 36 0 0 0 0 7031111 1 157484576 0 3219 0 0 1] real hdr: [ 3.10638886e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.92190802e+04 2.79013583e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.12646070e-11 4.28778013e-11 5.82598172e-11 ..., -2.52425405e-11 -2.29209510e-11 -2.13511194e-11] ----------------------- var 87 record 36 hdr offset: 533088 data offset: 671563776 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 61 0 128 65 0 387757194 83945472 157696 900 36 37 0 0 0 0 7031111 1 157640976 0 3219 0 0 1] real hdr: [ 3.60817633e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.29086931e+04 3.10638886e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.66281254e-08 -1.76639568e-08 -1.87499448e-08 ..., 6.31864835e-11 6.16576635e-11 6.01400485e-11] ----------------------- =============================== var 88: nz = 37, nt = 1 var 88 record 0 hdr offset: 533600 data offset: 672825344 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 84103168 157696 900 37 1 0 0 0 0 7031111 1 157797376 0 3220 0 0 1] real hdr: [ 4.99988815e+01 9.94296273e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.00003377e+01 0.00000000e+00 9.97716462e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.08055518 0.08083716 0.08083459 ..., -0.02079743 -0.02199183 -0.02336828] ----------------------- var 88 record 1 hdr offset: 534112 data offset: 674086912 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 84260864 157696 900 37 2 0 0 0 0 7031111 1 157953316 0 3220 0 0 1] real hdr: [ 1.30000232e+02 9.85203885e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00013508e+01 4.99988815e+01 9.90881510e-01 9.94296273e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.06532048 0.06544362 0.06534795 ..., -0.01699086 -0.01783533 -0.0187541 ] ----------------------- var 88 record 2 hdr offset: 534624 data offset: 675348480 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 84418560 157696 900 37 3 0 0 0 0 7031111 1 158109256 0 3220 0 0 1] real hdr: [ 2.49998333e+02 9.71644051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.79999114e+02 1.30000232e+02 9.79542572e-01 9.85203885e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.06656877 0.06649888 0.06623413 ..., -0.02712481 -0.0283089 -0.02955106] ----------------------- var 88 record 3 hdr offset: 535136 data offset: 676610048 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 84576256 157696 900 37 4 0 0 0 0 7031111 1 158265196 0 3220 0 0 1] real hdr: [ 4.10001035e+02 9.53709855e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.20001478e+02 2.49998333e+02 9.63777064e-01 9.71644051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.07202989 0.071827 0.07138957 ..., -0.04766759 -0.0492386 -0.05079706] ----------------------- var 88 record 4 hdr offset: 535648 data offset: 677871616 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 84733952 157696 900 37 5 0 0 0 0 7031111 1 158421136 0 3220 0 0 1] real hdr: [ 6.10000486e+02 9.31527464e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.00000592e+02 4.10001035e+02 9.43695500e-01 9.53709855e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.05532257 0.05521788 0.05519399 ..., -0.06717051 -0.07020114 -0.07308381] ----------------------- var 88 record 5 hdr offset: 536160 data offset: 679133184 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 84891648 157696 900 37 6 0 0 0 0 7031111 1 158577076 0 3220 0 0 1] real hdr: [ 8.50000613e+02 9.05253051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.20000381e+02 6.10000486e+02 9.19438386e-01 9.31527464e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 9.70412667e-03 9.71880565e-03 9.70638569e-03 ..., -2.53293451e-06 -2.55774964e-06 -2.57115498e-06] ----------------------- var 88 record 6 hdr offset: 536672 data offset: 680394752 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 85049344 157696 900 37 7 0 0 0 0 7031111 1 158733016 0 3220 0 0 1] real hdr: [ 1.13000142e+03 8.75074549e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.80000846e+02 8.50000613e+02 8.91177995e-01 9.05253051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., -1.49006110e-06 -1.33179067e-06 -1.19544081e-06] ----------------------- var 88 record 7 hdr offset: 537184 data offset: 681656320 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 85207040 157696 900 37 8 0 0 0 0 7031111 1 158888956 0 3220 0 0 1] real hdr: [ 1.44999897e+03 8.41211628e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.27999806e+03 1.13000142e+03 8.59118341e-01 8.75074549e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -3.03208551e-06 -3.37241408e-06 -3.64489293e-06 ..., -1.43075819e-06 -1.35544288e-06 -1.25609424e-06] ----------------------- var 88 record 8 hdr offset: 537696 data offset: 682917888 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 85364736 157696 900 37 9 0 0 0 0 7031111 1 159044896 0 3220 0 0 1] real hdr: [ 1.81000112e+03 8.03914038e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.61999988e+03 1.44999897e+03 8.23493502e-01 8.41211628e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -3.89348085e-07 -4.32083758e-07 -4.83906729e-07 ..., -1.42006158e-06 -1.63112025e-06 -1.78070116e-06] ----------------------- var 88 record 9 hdr offset: 538208 data offset: 684179456 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 85522432 157696 900 37 10 0 0 0 0 7031111 1 159200836 0 3220 0 0 1] real hdr: [ 2.21000002e+03 7.63464495e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.99999844e+03 1.81000112e+03 7.84570542e-01 8.03914038e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 3.03363162e-09 4.15266000e-09 5.14418534e-09 ..., -1.29318568e-06 -1.51492547e-06 -1.76835961e-06] ----------------------- var 88 record 10 hdr offset: 538720 data offset: 685441024 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 85680128 157696 900 37 11 0 0 0 0 7031111 1 159356776 0 3220 0 0 1] real hdr: [ 2.64999960e+03 7.20175811e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.42000161e+03 2.21000002e+03 7.42646223e-01 7.63464495e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.05854847e-07 1.02116504e-07 1.01790431e-07 ..., -2.16249336e-06 -2.17841355e-06 -2.29448280e-06] ----------------------- var 88 record 11 hdr offset: 539232 data offset: 686702592 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 85837824 157696 900 37 12 0 0 0 0 7031111 1 159512716 0 3220 0 0 1] real hdr: [ 3.12999986e+03 6.74392534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.88000152e+03 2.64999960e+03 6.98050213e-01 7.20175811e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.07236380e-08 -1.04639090e-08 -9.85214562e-09 ..., -2.04373609e-06 -1.14863668e-06 -6.50226259e-07] ----------------------- var 88 record 12 hdr offset: 539744 data offset: 687964160 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 85995520 157696 900 37 13 0 0 0 0 7031111 1 159668656 0 3220 0 0 1] real hdr: [ 3.65000079e+03 6.26490534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.37999819e+03 3.12999986e+03 6.51142688e-01 6.74392534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -2.96542401e-07 -3.13162944e-07 -3.36996047e-07 ..., -4.60658644e-07 -1.20990512e-07 3.28867009e-08] ----------------------- var 88 record 13 hdr offset: 540256 data offset: 689225728 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 86153216 157696 900 37 14 0 0 0 0 7031111 1 159824596 0 3220 0 0 1] real hdr: [ 4.20999847e+03 5.76877346e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.91999946e+03 3.65000079e+03 6.02314441e-01 6.26490534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.68776527e-06 -1.84457562e-06 -2.01106533e-06 ..., 2.56309535e-09 3.39241449e-09 3.71748176e-09] ----------------------- var 88 record 14 hdr offset: 540768 data offset: 690487296 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 86310912 157696 900 37 15 0 0 0 0 7031111 1 159980536 0 3220 0 0 1] real hdr: [ 4.81000075e+03 5.25990788e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.50000140e+03 4.20999847e+03 5.51988701e-01 5.76877346e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -7.36467741e-08 -9.46479523e-08 -1.20985291e-07 ..., 3.99024187e-07 3.29849330e-07 2.70079385e-07] ----------------------- var 88 record 15 hdr offset: 541280 data offset: 691748864 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 86468608 157696 900 37 16 0 0 0 0 7031111 1 160136476 0 3220 0 0 1] real hdr: [ 5.44999978e+03 4.74301366e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.12000009e+03 4.81000075e+03 5.00619965e-01 5.25990788e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 5.36119965e-08 6.25732401e-08 7.18483420e-08 ..., 3.56604942e-06 3.15116892e-06 2.70254183e-06] ----------------------- var 88 record 16 hdr offset: 541792 data offset: 693010432 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 86626304 157696 900 37 17 0 0 0 0 7031111 1 160292416 0 3220 0 0 1] real hdr: [ 6.12999948e+03 4.22309896e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.77999946e+03 5.44999978e+03 4.48693382e-01 4.74301366e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.43394906e-08 -1.09344007e-08 -7.96488440e-09 ..., 7.73635777e-07 8.71268990e-07 9.72676489e-07] ----------------------- var 88 record 17 hdr offset: 542304 data offset: 694272000 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 86784000 157696 900 37 18 0 0 0 0 7031111 1 160448356 0 3220 0 0 1] real hdr: [ 6.84999986e+03 3.70548863e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.47999950e+03 6.12999948e+03 3.96725773e-01 4.22309896e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -2.10359976e-07 -1.94902193e-07 -1.80432019e-07 ..., 2.94449124e-07 3.42905332e-07 3.87300854e-07] ----------------------- var 88 record 18 hdr offset: 542816 data offset: 695533568 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 86941696 157696 900 37 19 0 0 0 0 7031111 1 160604296 0 3220 0 0 1] real hdr: [ 7.61000092e+03 3.19582071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.22000022e+03 6.84999986e+03 3.45265283e-01 3.70548863e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 2.29907345e-09 3.15012985e-09 4.02271387e-09 ..., 1.55056476e-08 3.12739075e-08 5.82698397e-08] ----------------------- var 88 record 19 hdr offset: 543328 data offset: 696795136 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 87099392 157696 900 37 20 0 0 0 0 7031111 1 160760236 0 3220 0 0 1] real hdr: [ 8.40999873e+03 2.70004882e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00000162e+03 7.61000092e+03 2.94891378e-01 3.19582071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.66682338e-07 1.89562948e-07 2.15640117e-07 ..., 1.03876623e-08 1.34713500e-08 1.81532886e-08] ----------------------- var 88 record 20 hdr offset: 543840 data offset: 698056704 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 87257088 157696 900 37 21 0 0 0 0 7031111 1 160916176 0 3220 0 0 1] real hdr: [ 9.25000113e+03 2.22443261e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.81999976e+03 8.40999873e+03 2.46215071e-01 2.70004882e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.95873003e-07 1.28975382e-07 8.50337440e-08 ..., 4.33860029e-09 7.27896202e-09 1.30874779e-08] ----------------------- var 88 record 21 hdr offset: 544352 data offset: 699318272 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 87414784 157696 900 37 22 0 0 0 0 7031111 1 161072116 0 3220 0 0 1] real hdr: [ 1.01300003e+04 1.77555424e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.67999858e+03 9.25000113e+03 1.99878209e-01 2.22443261e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.74616118e-06 1.72068739e-06 1.70983598e-06 ..., 1.71778829e-11 4.44479161e-11 1.20216712e-10] ----------------------- var 88 record 22 hdr offset: 544864 data offset: 700579840 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 87572480 157696 900 37 23 0 0 0 0 7031111 1 161228056 0 3220 0 0 1] real hdr: [ 1.10500001e+04 1.36030234e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.05799981e+04 1.01300003e+04 1.56554224e-01 1.77555424e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.44704359e-06 1.35564006e-06 1.26318334e-06 ..., -3.97146425e-13 -4.55027190e-11 -7.36695159e-10] ----------------------- var 88 record 23 hdr offset: 545376 data offset: 701841408 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 87730176 157696 900 37 24 0 0 0 0 7031111 1 161383996 0 3220 0 0 1] real hdr: [ 1.20100006e+04 9.85881076e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.15199982e+04 1.10500001e+04 1.16947874e-01 1.36030234e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.14773390e-08 1.53990749e-08 2.05103347e-08 ..., 4.12115017e-09 1.07305414e-09 2.03912353e-10] ----------------------- var 88 record 24 hdr offset: 545888 data offset: 703102976 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 87887872 157696 900 37 25 0 0 0 0 7031111 1 161539936 0 3220 0 0 1] real hdr: [ 1.30100018e+04 6.59807861e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.24999991e+04 1.20100006e+04 8.17952369e-02 9.85881076e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -3.64451499e-07 -3.61330581e-07 -3.62105044e-07 ..., 1.20596000e-08 1.53055910e-08 1.61690418e-08] ----------------------- var 88 record 25 hdr offset: 546400 data offset: 704364544 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 88045568 157696 900 37 26 0 0 0 0 7031111 1 161695876 0 3220 0 0 1] real hdr: [ 1.40504001e+04 3.89823900e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.35200006e+04 1.30100018e+04 5.18637157e-02 6.59807861e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 9.13695499e-09 7.73583598e-09 6.59579522e-09 ..., 1.79409716e-10 1.68830802e-10 2.33821843e-10] ----------------------- var 88 record 26 hdr offset: 546912 data offset: 705626112 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 88203264 157696 900 37 27 0 0 0 0 7031111 1 161851816 0 3220 0 0 1] real hdr: [ 1.51377198e+04 1.83146873e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.45807997e+04 1.40504001e+04 2.79368177e-02 3.89823900e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -7.50353509e-08 -7.44759611e-08 -7.55373578e-08 ..., -2.57141794e-07 -2.34788969e-07 -2.09664062e-07] ----------------------- var 88 record 27 hdr offset: 547424 data offset: 706887680 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 88360960 157696 900 37 28 0 0 0 0 7031111 1 162007756 0 3220 0 0 1] real hdr: [ 1.62849737e+04 4.87210933e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.56946399e+04 1.51377198e+04 1.07164793e-02 1.83146873e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.66308699e-07 -1.38871942e-07 -1.12460322e-07 ..., 2.66241272e-08 3.16532514e-08 3.66681952e-08] ----------------------- var 88 record 28 hdr offset: 547936 data offset: 708149248 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 88518656 157696 900 37 29 0 0 0 0 7031111 1 162163696 0 3220 0 0 1] real hdr: [ 1.75069688e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.68753114e+04 1.62849737e+04 1.30179090e-03 4.87210933e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 6.04503873e-07 6.00217904e-07 5.91771742e-07 ..., -1.07265034e-08 -1.25437956e-08 -1.51992496e-08] ----------------------- var 88 record 29 hdr offset: 548448 data offset: 709410816 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 88676352 157696 900 37 30 0 0 0 0 7031111 1 162319636 0 3220 0 0 1] real hdr: [ 1.88208202e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81386262e+04 1.75069688e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.63664313e-09 -1.80415990e-09 -2.05124478e-09 ..., -4.74595750e-08 -4.91851595e-08 -5.11044770e-08] ----------------------- var 88 record 30 hdr offset: 548960 data offset: 710672384 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 88834048 157696 900 37 31 0 0 0 0 7031111 1 162475576 0 3220 0 0 1] real hdr: [ 2.02465990e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.95030104e+04 1.88208202e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.65741004e-10 -2.57467371e-10 -3.51374019e-10 ..., -2.26782802e-10 -1.94976757e-10 -1.59679852e-10] ----------------------- var 88 record 31 hdr offset: 549472 data offset: 711933952 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 88991744 157696 900 37 32 0 0 0 0 7031111 1 162631516 0 3220 0 0 1] real hdr: [ 2.18081366e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.09901876e+04 2.02465990e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.86977415e-09 3.46174644e-09 5.28378255e-09 ..., -3.84256970e-09 -4.16387603e-09 -4.65089813e-09] ----------------------- var 88 record 32 hdr offset: 549984 data offset: 713195520 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 89149440 157696 900 37 33 0 0 0 0 7031111 1 162787456 0 3220 0 0 1] real hdr: [ 2.35421836e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.26260817e+04 2.18081366e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.34303459e-08 -1.36766797e-08 -1.39511485e-08 ..., 7.29187403e-11 7.50905607e-11 7.50190406e-11] ----------------------- var 88 record 33 hdr offset: 550496 data offset: 714457088 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 89307136 157696 900 37 34 0 0 0 0 7031111 1 162943396 0 3220 0 0 1] real hdr: [ 2.55209609e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.44582854e+04 2.35421836e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 2.57255476e-10 2.49634011e-10 2.47222876e-10 ..., 5.28959507e-12 7.05265232e-12 9.30746615e-12] ----------------------- var 88 record 34 hdr offset: 551008 data offset: 715718656 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 89464832 157696 900 37 35 0 0 0 0 7031111 1 163099336 0 3220 0 0 1] real hdr: [ 2.79013583e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.65836402e+04 2.55209609e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -9.60980298e-10 -1.08686931e-09 -1.23878888e-09 ..., 1.43448489e-12 1.05517470e-12 7.64881953e-13] ----------------------- var 88 record 35 hdr offset: 551520 data offset: 716980224 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 89622528 157696 900 37 36 0 0 0 0 7031111 1 163255276 0 3220 0 0 1] real hdr: [ 3.10638886e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.92190802e+04 2.79013583e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.11000607e-10 1.30162913e-10 1.55731934e-10 ..., -5.97373111e-11 -5.59272566e-11 -5.21082469e-11] ----------------------- var 88 record 36 hdr offset: 552032 data offset: 718241792 disk length: 155940 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 0 2 62 0 128 65 0 387757194 89780224 157696 900 37 37 0 0 0 0 7031111 1 163411216 0 3220 0 0 1] real hdr: [ 3.60817633e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.29086931e+04 3.10638886e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -4.37665171e-09 -4.67413662e-09 -4.98641256e-09 ..., 1.38358555e-10 1.37316048e-10 1.35568707e-10] ----------------------- =============================== var 89: nz = 37, nt = 1 var 89 record 0 hdr offset: 552544 data offset: 719503360 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 89937920 79872 900 15 1 0 0 0 0 7031111 1 163567156 0 3222 0 0 1] real hdr: [ 2.00003377e+01 9.97716462e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.99820611e+00 0.00000000e+00 9.98858129e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 6.18146587e-05 6.17821788e-05 6.17726910e-05 ..., 3.87350628e-05 3.95474635e-05 4.05256069e-05] ----------------------- var 89 record 1 hdr offset: 553056 data offset: 720142336 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 90017792 79872 900 15 2 0 0 0 0 7031111 1 163723556 0 3222 0 0 1] real hdr: [ 8.00013508e+01 9.90881510e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.99988815e+01 2.00003377e+01 9.94296273e-01 9.97716462e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 6.22163934e-05 6.26583860e-05 6.32545052e-05 ..., 5.22422488e-05 5.16898435e-05 5.11632934e-05] ----------------------- var 89 record 2 hdr offset: 553568 data offset: 720781312 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 90097664 79872 900 15 3 0 0 0 0 7031111 1 163879956 0 3222 0 0 1] real hdr: [ 1.79999114e+02 9.79542572e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30000232e+02 8.00013508e+01 9.85203885e-01 9.90881510e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.72767933e-05 4.82656069e-05 4.95629938e-05 ..., 3.55162629e-05 3.52625575e-05 3.49625225e-05] ----------------------- var 89 record 3 hdr offset: 554080 data offset: 721420288 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 90177536 79872 900 15 4 0 0 0 0 7031111 1 164036356 0 3222 0 0 1] real hdr: [ 3.20001478e+02 9.63777064e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.49998333e+02 1.79999114e+02 9.71644051e-01 9.79542572e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.68098699e-05 3.71925016e-05 3.78288496e-05 ..., 1.81573250e-05 1.89279745e-05 1.98083217e-05] ----------------------- var 89 record 4 hdr offset: 554592 data offset: 722059264 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 90257408 79872 900 15 5 0 0 0 0 7031111 1 164192756 0 3222 0 0 1] real hdr: [ 5.00000592e+02 9.43695500e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.10001035e+02 3.20001478e+02 9.53709855e-01 9.63777064e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.63846702e-05 3.60201302e-05 3.57522404e-05 ..., 0.00000000e+00 0.00000000e+00 0.00000000e+00] ----------------------- var 89 record 5 hdr offset: 555104 data offset: 722698240 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 90337280 79872 900 15 6 0 0 0 0 7031111 1 164349156 0 3222 0 0 1] real hdr: [ 7.20000381e+02 9.19438386e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.10000486e+02 5.00000592e+02 9.31527464e-01 9.43695500e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., -1.11675202e-09 -9.35194255e-10 -7.71359587e-10] ----------------------- var 89 record 6 hdr offset: 555616 data offset: 723337216 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 90417152 79872 900 15 7 0 0 0 0 7031111 1 164505556 0 3222 0 0 1] real hdr: [ 9.80000846e+02 8.91177995e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.50000613e+02 7.20000381e+02 9.05253051e-01 9.19438386e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., -1.65057190e-09 -1.54623325e-09 -1.42670809e-09] ----------------------- var 89 record 7 hdr offset: 556128 data offset: 723976192 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 90497024 79872 900 15 8 0 0 0 0 7031111 1 164661956 0 3222 0 0 1] real hdr: [ 1.27999806e+03 8.59118341e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.13000142e+03 9.80000846e+02 8.75074549e-01 8.91177995e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 8.71420658e-10 9.30385047e-10 9.98620631e-10 ..., 1.44908308e-10 3.19162682e-11 -8.83974768e-11] ----------------------- var 89 record 8 hdr offset: 556640 data offset: 724615168 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 90576896 79872 900 15 9 0 0 0 0 7031111 1 164818356 0 3222 0 0 1] real hdr: [ 1.61999988e+03 8.23493502e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.44999897e+03 1.27999806e+03 8.41211628e-01 8.59118341e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.40548090e-10 3.71722930e-10 4.25016411e-10 ..., 1.10052900e-09 1.26626332e-09 1.42823064e-09] ----------------------- var 89 record 9 hdr offset: 557152 data offset: 725254144 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 90656768 79872 900 15 10 0 0 0 0 7031111 1 164974756 0 3222 0 0 1] real hdr: [ 1.99999844e+03 7.84570542e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81000112e+03 1.61999988e+03 8.03914038e-01 8.23493502e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 6.17410956e-10 5.95203165e-10 5.76949932e-10 ..., -5.87390636e-10 -7.00133562e-11 3.73004211e-10] ----------------------- var 89 record 10 hdr offset: 557664 data offset: 725893120 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 90736640 79872 900 15 11 0 0 0 0 7031111 1 165131156 0 3222 0 0 1] real hdr: [ 2.42000161e+03 7.42646223e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.21000002e+03 1.99999844e+03 7.63464495e-01 7.84570542e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.13692911e-10 1.98309522e-10 1.85164675e-10 ..., -2.01234251e-09 -1.81696835e-09 -1.77722204e-09] ----------------------- var 89 record 11 hdr offset: 558176 data offset: 726532096 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 90816512 79872 900 15 12 0 0 0 0 7031111 1 165287556 0 3222 0 0 1] real hdr: [ 2.88000152e+03 6.98050213e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.64999960e+03 2.42000161e+03 7.20175811e-01 7.42646223e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.89621252e-11 4.21262747e-11 4.65774572e-11 ..., 2.01810701e-09 9.72122716e-10 4.28810487e-10] ----------------------- var 89 record 12 hdr offset: 558688 data offset: 727171072 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 90896384 79872 900 15 13 0 0 0 0 7031111 1 165443956 0 3222 0 0 1] real hdr: [ 3.37999819e+03 6.51142688e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.12999986e+03 2.88000152e+03 6.74392534e-01 6.98050213e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 5.59185531e-10 5.93402050e-10 6.29162222e-10 ..., 8.97573627e-10 5.69250536e-10 4.50950388e-10] ----------------------- var 89 record 13 hdr offset: 559200 data offset: 727810048 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 90976256 79872 900 15 14 0 0 0 0 7031111 1 165600356 0 3222 0 0 1] real hdr: [ 3.91999946e+03 6.02314441e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.65000079e+03 3.37999819e+03 6.26490534e-01 6.51142688e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.47610590e-10 1.46927762e-10 1.44131457e-10 ..., 1.70320577e-10 1.54455448e-10 1.38130521e-10] ----------------------- var 89 record 14 hdr offset: 559712 data offset: 728449024 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 91056128 79872 900 15 15 0 0 0 0 7031111 1 165756756 0 3222 0 0 1] real hdr: [ 4.50000140e+03 5.51988701e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.20999847e+03 3.91999946e+03 5.76877346e-01 6.02314441e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.74770805e-11 4.41218902e-11 5.18161763e-11 ..., 4.32494096e-10 3.52677665e-10 2.76630413e-10] ----------------------- var 89 record 15 hdr offset: 560224 data offset: 729088000 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 91136000 79872 900 15 16 0 0 0 0 7031111 1 165913156 0 3222 0 0 1] real hdr: [ 5.12000009e+03 5.00619965e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.81000075e+03 4.50000140e+03 5.25990788e-01 5.51988701e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.36379753e-11 1.44980946e-11 1.54510658e-11 ..., -1.14868795e-10 -1.09983883e-10 -1.02232882e-10] ----------------------- var 89 record 16 hdr offset: 560736 data offset: 729726976 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 91215872 79872 900 15 17 0 0 0 0 7031111 1 166069556 0 3222 0 0 1] real hdr: [ 5.77999946e+03 4.48693382e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.44999978e+03 5.12000009e+03 4.74301366e-01 5.00619965e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.05243184e-11 1.86214846e-11 1.69282730e-11 ..., 6.25900373e-11 7.78503859e-11 9.43088524e-11] ----------------------- var 89 record 17 hdr offset: 561248 data offset: 730365952 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 91295744 79872 900 15 18 0 0 0 0 7031111 1 166225956 0 3222 0 0 1] real hdr: [ 6.47999950e+03 3.96725773e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.12999948e+03 5.77999946e+03 4.22309896e-01 4.48693382e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 8.09437933e-12 7.43242707e-12 6.84740979e-12 ..., 2.28867376e-11 2.35616093e-11 2.34052291e-11] ----------------------- var 89 record 18 hdr offset: 561760 data offset: 731004928 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 91375616 79872 900 15 19 0 0 0 0 7031111 1 166382356 0 3222 0 0 1] real hdr: [ 7.22000022e+03 3.45265283e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.84999986e+03 6.47999950e+03 3.70548863e-01 3.96725773e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 8.33008182e-14 1.33477796e-13 2.07264381e-13 ..., 2.64537047e-12 4.07618383e-12 6.26595043e-12] ----------------------- var 89 record 19 hdr offset: 562272 data offset: 731643904 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 91455488 79872 900 15 20 0 0 0 0 7031111 1 166538756 0 3222 0 0 1] real hdr: [ 8.00000162e+03 2.94891378e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.61000092e+03 7.22000022e+03 3.19582071e-01 3.45265283e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.54897188e-12 3.62918983e-12 3.03064778e-12 ..., 5.70976805e-13 7.34109063e-13 1.00107542e-12] ----------------------- var 89 record 20 hdr offset: 562784 data offset: 732282880 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 91535360 79872 900 15 21 0 0 0 0 7031111 1 166695156 0 3222 0 0 1] real hdr: [ 8.81999976e+03 2.46215071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.40999873e+03 8.00000162e+03 2.70004882e-01 2.94891378e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 5.95812774e-11 5.79183368e-11 5.61461190e-11 ..., 1.32662097e-13 2.21627648e-13 3.91750488e-13] ----------------------- var 89 record 21 hdr offset: 563296 data offset: 732921856 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 91615232 79872 900 15 22 0 0 0 0 7031111 1 166851556 0 3222 0 0 1] real hdr: [ 9.67999858e+03 1.99878209e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.25000113e+03 8.81999976e+03 2.22443261e-01 2.46215071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.22953747e-11 3.52012135e-11 3.95267742e-11 ..., 2.02893169e-15 4.58123911e-15 2.29972799e-14] ----------------------- var 89 record 22 hdr offset: 563808 data offset: 733560832 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 91695104 79872 900 15 23 0 0 0 0 7031111 1 167007956 0 3222 0 0 1] real hdr: [ 1.05799981e+04 1.56554224e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.01300003e+04 9.67999858e+03 1.77555424e-01 1.99878209e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 6.65132316e-12 5.51774815e-12 4.36014853e-12 ..., 6.12025147e-14 2.04980838e-14 1.38439615e-14] ----------------------- var 89 record 23 hdr offset: 564320 data offset: 734199808 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 91774976 79872 900 15 24 0 0 0 0 7031111 1 167164356 0 3222 0 0 1] real hdr: [ 1.15199982e+04 1.16947874e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.10500001e+04 1.05799981e+04 1.36030234e-01 1.56554224e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 6.10794705e-12 5.86667997e-12 5.64934861e-12 ..., 1.79152239e-13 1.67548240e-13 1.44024807e-13] ----------------------- var 89 record 24 hdr offset: 564832 data offset: 734838784 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 91854848 79872 900 15 25 0 0 0 0 7031111 1 167320756 0 3222 0 0 1] real hdr: [ 1.24999991e+04 8.17952369e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.20100006e+04 1.15199982e+04 9.85881076e-02 1.16947874e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.71152371e-12 3.77769257e-12 3.85338896e-12 ..., 9.89603432e-14 1.03658422e-13 9.35534677e-14] ----------------------- var 89 record 25 hdr offset: 565344 data offset: 735477760 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 91934720 79872 900 15 26 0 0 0 0 7031111 1 167477156 0 3222 0 0 1] real hdr: [ 1.35200006e+04 5.18637157e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30100018e+04 1.24999991e+04 6.59807861e-02 8.17952369e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 7.25037231e-14 7.43265109e-14 7.87618194e-14 ..., 1.88396521e-12 1.84809698e-12 1.77579338e-12] ----------------------- var 89 record 26 hdr offset: 565856 data offset: 736116736 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 92014592 79872 900 15 27 0 0 0 0 7031111 1 167633556 0 3222 0 0 1] real hdr: [ 1.45807997e+04 2.79368177e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.40504001e+04 1.35200006e+04 3.89823900e-02 5.18637157e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.56388530e-13 3.22220901e-13 2.89786288e-13 ..., 8.74914290e-13 8.75046346e-13 8.61184496e-13] ----------------------- var 89 record 27 hdr offset: 566368 data offset: 736755712 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 92094464 79872 900 15 28 0 0 0 0 7031111 1 167789956 0 3222 0 0 1] real hdr: [ 1.56946399e+04 1.07164793e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.51377198e+04 1.45807997e+04 1.83146873e-02 2.79368177e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.41120009e-13 3.39115969e-13 3.38898858e-13 ..., 2.98167490e-14 3.60324326e-14 4.36621124e-14] ----------------------- var 89 record 28 hdr offset: 566880 data offset: 737394688 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 92174336 79872 900 15 29 0 0 0 0 7031111 1 167946356 0 3222 0 0 1] real hdr: [ 1.68753114e+04 1.30179090e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.62849737e+04 1.56946399e+04 4.87210933e-03 1.07164793e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.31643272e-13 1.34927714e-13 1.37560224e-13 ..., 4.36704302e-14 4.51471441e-14 4.69972301e-14] ----------------------- var 89 record 29 hdr offset: 567392 data offset: 738033664 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 92254208 79872 900 15 30 0 0 0 0 7031111 1 168102756 0 3222 0 0 1] real hdr: [ 1.81386262e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.75069688e+04 1.68753114e+04 0.00000000e+00 1.30179090e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.41631400e-16 1.68073307e-16 1.99174596e-16 ..., 9.96673176e-16 1.07360166e-15 1.15412019e-15] ----------------------- var 89 record 30 hdr offset: 567904 data offset: 738672640 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 92334080 79872 900 15 31 0 0 0 0 7031111 1 168259156 0 3222 0 0 1] real hdr: [ 1.95030104e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.88208202e+04 1.81386262e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.77644737e-15 3.17688368e-15 3.61818509e-15 ..., 4.53528969e-16 4.65238246e-16 4.88188869e-16] ----------------------- var 89 record 31 hdr offset: 568416 data offset: 739311616 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 92413952 79872 900 15 32 0 0 0 0 7031111 1 168415556 0 3222 0 0 1] real hdr: [ 2.09901876e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.02465990e+04 1.95030104e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.63454674e-16 2.05986422e-16 2.55187257e-16 ..., 4.21910669e-25 4.62258735e-25 5.31770199e-25] ----------------------- var 89 record 32 hdr offset: 568928 data offset: 739950592 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 92493824 79872 900 15 33 0 0 0 0 7031111 1 168571956 0 3222 0 0 1] real hdr: [ 2.26260817e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.18081366e+04 2.09901876e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 7.61786657e-25 9.74842851e-25 1.22688411e-24 ..., 4.94819066e-35 5.41162702e-35 6.05651883e-35] ----------------------- var 89 record 33 hdr offset: 569440 data offset: 740589568 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 92573696 79872 900 15 34 0 0 0 0 7031111 1 168728356 0 3222 0 0 1] real hdr: [ 2.44582854e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.35421836e+04 2.26260817e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.85667843e-34 6.75150048e-34 9.28801708e-34 ..., 0.00000000e+00 0.00000000e+00 0.00000000e+00] ----------------------- var 89 record 34 hdr offset: 569952 data offset: 741228544 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 92653568 79872 900 15 35 0 0 0 0 7031111 1 168884756 0 3222 0 0 1] real hdr: [ 2.65836402e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.55209609e+04 2.44582854e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 89 record 35 hdr offset: 570464 data offset: 741867520 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 92733440 79872 900 15 36 0 0 0 0 7031111 1 169041156 0 3222 0 0 1] real hdr: [ 2.92190802e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.79013583e+04 2.65836402e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., -3.74153058e-29 -3.61939683e-29 -3.47060791e-29] ----------------------- var 89 record 36 hdr offset: 570976 data offset: 742506496 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 184 0 128 65 0 387757194 92813312 79872 900 15 37 0 0 0 0 7031111 1 169197556 0 3222 0 0 1] real hdr: [ 3.29086931e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.10638886e+04 2.92190802e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., -4.62955928e-19 -4.59415802e-19 -4.53667259e-19] ----------------------- =============================== var 90: nz = 1, nt = 1 var 90 record 0 hdr offset: 571488 data offset: 743145472 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 180 0 128 129 0 387757194 92893184 79872 900 32 9999 0 0 0 0 7031111 1 169353956 0 3234 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 154.59846497 154.51722717 154.4934845 ..., 96.87638855 98.90820312 101.35454559] ----------------------- =============================== var 91: nz = 1, nt = 1 var 91 record 0 hdr offset: 572000 data offset: 743784448 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 1535 0 128 129 0 387757194 92973056 79872 900 328 8888 0 0 0 0 7031111 1 169510356 0 3305 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 92: nz = 1, nt = 1 var 92 record 0 hdr offset: 572512 data offset: 744423424 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 1536 0 128 129 0 387757194 93052928 79872 900 329 8888 0 0 0 0 7031111 1 169666756 0 3306 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 93: nz = 1, nt = 1 var 93 record 0 hdr offset: 573024 data offset: 745062400 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 1537 0 128 129 0 387757194 93132800 79872 900 330 8888 0 0 0 0 7031111 1 169823156 0 3307 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 1. 1. 1.] ----------------------- =============================== var 94: nz = 1, nt = 1 var 94 record 0 hdr offset: 573536 data offset: 745701376 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 1538 0 128 129 0 387757194 93212672 79872 900 331 8888 0 0 0 0 7031111 1 169979556 0 3308 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 95: nz = 1, nt = 1 var 95 record 0 hdr offset: 574048 data offset: 746340352 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 1539 0 128 129 0 387757194 93292544 79872 900 332 8888 0 0 0 0 7031111 1 170135956 0 3309 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 96: nz = 1, nt = 1 var 96 record 0 hdr offset: 574560 data offset: 746979328 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 1540 0 128 129 0 387757194 93372416 79872 900 333 8888 0 0 0 0 7031111 1 170292356 0 3310 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1. 1. 1. ..., 0. 0. 0.] ----------------------- =============================== var 97: nz = 38, nt = 1 var 97 record 0 hdr offset: 575072 data offset: 747618304 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 93452288 79872 900 3 1 0 0 0 0 7031111 1 170448756 0 4181 0 0 1] real hdr: [ 4.99988815e+01 9.94296273e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.00003377e+01 0.00000000e+00 9.97716462e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 1 hdr offset: 575584 data offset: 748257280 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 93532160 79872 900 3 2 0 0 0 0 7031111 1 170605156 0 4181 0 0 1] real hdr: [ 1.30000232e+02 9.85203885e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00013508e+01 4.99988815e+01 9.90881510e-01 9.94296273e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 2 hdr offset: 576096 data offset: 748896256 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 93612032 79872 900 3 3 0 0 0 0 7031111 1 170761556 0 4181 0 0 1] real hdr: [ 2.49998333e+02 9.71644051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.79999114e+02 1.30000232e+02 9.79542572e-01 9.85203885e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 3 hdr offset: 576608 data offset: 749535232 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 93691904 79872 900 3 4 0 0 0 0 7031111 1 170917956 0 4181 0 0 1] real hdr: [ 4.10001035e+02 9.53709855e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.20001478e+02 2.49998333e+02 9.63777064e-01 9.71644051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 4 hdr offset: 577120 data offset: 750174208 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 93771776 79872 900 3 5 0 0 0 0 7031111 1 171074356 0 4181 0 0 1] real hdr: [ 6.10000486e+02 9.31527464e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.00000592e+02 4.10001035e+02 9.43695500e-01 9.53709855e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 5 hdr offset: 577632 data offset: 750813184 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 93851648 79872 900 3 6 0 0 0 0 7031111 1 171230756 0 4181 0 0 1] real hdr: [ 8.50000613e+02 9.05253051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.20000381e+02 6.10000486e+02 9.19438386e-01 9.31527464e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -3.58910853e-07 -1.85158768e-07 -7.52887459e-08 ..., 0.00000000e+00 0.00000000e+00 0.00000000e+00] ----------------------- var 97 record 6 hdr offset: 578144 data offset: 751452160 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 93931520 79872 900 3 7 0 0 0 0 7031111 1 171387156 0 4181 0 0 1] real hdr: [ 1.13000142e+03 8.75074549e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.80000846e+02 8.50000613e+02 8.91177995e-01 9.05253051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00132997 0.00088421 0.00049927 ..., 0. 0. 0. ] ----------------------- var 97 record 7 hdr offset: 578656 data offset: 752091136 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 94011392 79872 900 3 8 0 0 0 0 7031111 1 171543556 0 4181 0 0 1] real hdr: [ 1.44999897e+03 8.41211628e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.27999806e+03 1.13000142e+03 8.59118341e-01 8.75074549e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00516085 0.00376491 0.00251778 ..., 0. 0. 0. ] ----------------------- var 97 record 8 hdr offset: 579168 data offset: 752730112 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 94091264 79872 900 3 9 0 0 0 0 7031111 1 171699956 0 4181 0 0 1] real hdr: [ 1.81000112e+03 8.03914038e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.61999988e+03 1.44999897e+03 8.23493502e-01 8.41211628e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 9 hdr offset: 579680 data offset: 753369088 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 94171136 79872 900 3 10 0 0 0 0 7031111 1 171856356 0 4181 0 0 1] real hdr: [ 2.21000002e+03 7.63464495e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.99999844e+03 1.81000112e+03 7.84570542e-01 8.03914038e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 10 hdr offset: 580192 data offset: 754008064 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 94251008 79872 900 3 11 0 0 0 0 7031111 1 172012756 0 4181 0 0 1] real hdr: [ 2.64999960e+03 7.20175811e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.42000161e+03 2.21000002e+03 7.42646223e-01 7.63464495e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 11 hdr offset: 580704 data offset: 754647040 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 94330880 79872 900 3 12 0 0 0 0 7031111 1 172169156 0 4181 0 0 1] real hdr: [ 3.12999986e+03 6.74392534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.88000152e+03 2.64999960e+03 6.98050213e-01 7.20175811e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 12 hdr offset: 581216 data offset: 755286016 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 94410752 79872 900 3 13 0 0 0 0 7031111 1 172325556 0 4181 0 0 1] real hdr: [ 3.65000079e+03 6.26490534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.37999819e+03 3.12999986e+03 6.51142688e-01 6.74392534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 13 hdr offset: 581728 data offset: 755924992 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 94490624 79872 900 3 14 0 0 0 0 7031111 1 172481956 0 4181 0 0 1] real hdr: [ 4.20999847e+03 5.76877346e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.91999946e+03 3.65000079e+03 6.02314441e-01 6.26490534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 14 hdr offset: 582240 data offset: 756563968 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 94570496 79872 900 3 15 0 0 0 0 7031111 1 172638356 0 4181 0 0 1] real hdr: [ 4.81000075e+03 5.25990788e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.50000140e+03 4.20999847e+03 5.51988701e-01 5.76877346e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 15 hdr offset: 582752 data offset: 757202944 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 94650368 79872 900 3 16 0 0 0 0 7031111 1 172794756 0 4181 0 0 1] real hdr: [ 5.44999978e+03 4.74301366e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.12000009e+03 4.81000075e+03 5.00619965e-01 5.25990788e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 16 hdr offset: 583264 data offset: 757841920 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 94730240 79872 900 3 17 0 0 0 0 7031111 1 172951156 0 4181 0 0 1] real hdr: [ 6.12999948e+03 4.22309896e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.77999946e+03 5.44999978e+03 4.48693382e-01 4.74301366e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 17 hdr offset: 583776 data offset: 758480896 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 94810112 79872 900 3 18 0 0 0 0 7031111 1 173107556 0 4181 0 0 1] real hdr: [ 6.84999986e+03 3.70548863e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.47999950e+03 6.12999948e+03 3.96725773e-01 4.22309896e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 18 hdr offset: 584288 data offset: 759119872 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 94889984 79872 900 3 19 0 0 0 0 7031111 1 173263956 0 4181 0 0 1] real hdr: [ 7.61000092e+03 3.19582071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.22000022e+03 6.84999986e+03 3.45265283e-01 3.70548863e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 19 hdr offset: 584800 data offset: 759758848 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 94969856 79872 900 3 20 0 0 0 0 7031111 1 173420356 0 4181 0 0 1] real hdr: [ 8.40999873e+03 2.70004882e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00000162e+03 7.61000092e+03 2.94891378e-01 3.19582071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 20 hdr offset: 585312 data offset: 760397824 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 95049728 79872 900 3 21 0 0 0 0 7031111 1 173576756 0 4181 0 0 1] real hdr: [ 9.25000113e+03 2.22443261e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.81999976e+03 8.40999873e+03 2.46215071e-01 2.70004882e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 21 hdr offset: 585824 data offset: 761036800 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 95129600 79872 900 3 22 0 0 0 0 7031111 1 173733156 0 4181 0 0 1] real hdr: [ 1.01300003e+04 1.77555424e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.67999858e+03 9.25000113e+03 1.99878209e-01 2.22443261e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 22 hdr offset: 586336 data offset: 761675776 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 95209472 79872 900 3 23 0 0 0 0 7031111 1 173889556 0 4181 0 0 1] real hdr: [ 1.10500001e+04 1.36030234e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.05799981e+04 1.01300003e+04 1.56554224e-01 1.77555424e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 23 hdr offset: 586848 data offset: 762314752 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 95289344 79872 900 3 24 0 0 0 0 7031111 1 174045956 0 4181 0 0 1] real hdr: [ 1.20100006e+04 9.85881076e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.15199982e+04 1.10500001e+04 1.16947874e-01 1.36030234e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 24 hdr offset: 587360 data offset: 762953728 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 95369216 79872 900 3 25 0 0 0 0 7031111 1 174202356 0 4181 0 0 1] real hdr: [ 1.30100018e+04 6.59807861e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.24999991e+04 1.20100006e+04 8.17952369e-02 9.85881076e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 25 hdr offset: 587872 data offset: 763592704 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 95449088 79872 900 3 26 0 0 0 0 7031111 1 174358756 0 4181 0 0 1] real hdr: [ 1.40504001e+04 3.89823900e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.35200006e+04 1.30100018e+04 5.18637157e-02 6.59807861e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 26 hdr offset: 588384 data offset: 764231680 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 95528960 79872 900 3 27 0 0 0 0 7031111 1 174515156 0 4181 0 0 1] real hdr: [ 1.51377198e+04 1.83146873e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.45807997e+04 1.40504001e+04 2.79368177e-02 3.89823900e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 27 hdr offset: 588896 data offset: 764870656 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 95608832 79872 900 3 28 0 0 0 0 7031111 1 174671556 0 4181 0 0 1] real hdr: [ 1.62849737e+04 4.87210933e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.56946399e+04 1.51377198e+04 1.07164793e-02 1.83146873e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 28 hdr offset: 589408 data offset: 765509632 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 95688704 79872 900 3 29 0 0 0 0 7031111 1 174827956 0 4181 0 0 1] real hdr: [ 1.75069688e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.68753114e+04 1.62849737e+04 1.30179090e-03 4.87210933e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 29 hdr offset: 589920 data offset: 766148608 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 95768576 79872 900 3 30 0 0 0 0 7031111 1 174984356 0 4181 0 0 1] real hdr: [ 1.88208202e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81386262e+04 1.75069688e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 30 hdr offset: 590432 data offset: 766787584 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 95848448 79872 900 3 31 0 0 0 0 7031111 1 175140756 0 4181 0 0 1] real hdr: [ 2.02465990e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.95030104e+04 1.88208202e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 31 hdr offset: 590944 data offset: 767426560 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 95928320 79872 900 3 32 0 0 0 0 7031111 1 175297156 0 4181 0 0 1] real hdr: [ 2.18081366e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.09901876e+04 2.02465990e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 32 hdr offset: 591456 data offset: 768065536 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 96008192 79872 900 3 33 0 0 0 0 7031111 1 175453556 0 4181 0 0 1] real hdr: [ 2.35421836e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.26260817e+04 2.18081366e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 33 hdr offset: 591968 data offset: 768704512 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 96088064 79872 900 3 34 0 0 0 0 7031111 1 175609956 0 4181 0 0 1] real hdr: [ 2.55209609e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.44582854e+04 2.35421836e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 34 hdr offset: 592480 data offset: 769343488 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 96167936 79872 900 3 35 0 0 0 0 7031111 1 175766356 0 4181 0 0 1] real hdr: [ 2.79013583e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.65836402e+04 2.55209609e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 35 hdr offset: 592992 data offset: 769982464 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 96247808 79872 900 3 36 0 0 0 0 7031111 1 175922756 0 4181 0 0 1] real hdr: [ 3.10638886e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.92190802e+04 2.79013583e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 36 hdr offset: 593504 data offset: 770621440 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 96327680 79872 900 3 37 0 0 0 0 7031111 1 176079156 0 4181 0 0 1] real hdr: [ 3.60817633e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.29086931e+04 3.10638886e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 97 record 37 hdr offset: 594016 data offset: 771260416 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 96407552 79872 900 3 38 0 0 0 0 7031111 1 176235556 0 4181 0 0 1] real hdr: [ 4.24279038e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.92548336e+04 3.60817633e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 98: nz = 1, nt = 1 var 98 record 0 hdr offset: 594528 data offset: 771899392 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 102 0 128 129 0 387757194 96487424 79872 900 61 8888 0 0 0 0 7031111 1 176391956 0 4201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 99: nz = 1, nt = 1 var 99 record 0 hdr offset: 595040 data offset: 772538368 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 99 0 128 129 0 387757194 96567296 157696 900 63 8888 0 0 0 0 7031111 1 176548356 0 4203 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 100: nz = 1, nt = 1 var 100 record 0 hdr offset: 595552 data offset: 773799936 disk length: 156400 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 0 2 118 0 128 129 0 387757194 96724992 157696 900 68 8888 0 0 0 0 7031111 1 176704756 0 4204 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 101: nz = 38, nt = 1 var 101 record 0 hdr offset: 596064 data offset: 775061504 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 96882688 79872 900 3 1 0 0 0 0 7031111 1 176861156 0 5181 0 0 1] real hdr: [ 4.99988815e+01 9.94296273e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.00003377e+01 0.00000000e+00 9.97716462e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00060455 0.00058165 0.00055382 ..., 0. 0. 0. ] ----------------------- var 101 record 1 hdr offset: 596576 data offset: 775700480 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 96962560 79872 900 3 2 0 0 0 0 7031111 1 177017556 0 5181 0 0 1] real hdr: [ 1.30000232e+02 9.85203885e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00013508e+01 4.99988815e+01 9.90881510e-01 9.94296273e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00060337 0.00058052 0.00055274 ..., 0. 0. 0. ] ----------------------- var 101 record 2 hdr offset: 597088 data offset: 776339456 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 97042432 79872 900 3 3 0 0 0 0 7031111 1 177173956 0 5181 0 0 1] real hdr: [ 2.49998333e+02 9.71644051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.79999114e+02 1.30000232e+02 9.79542572e-01 9.85203885e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00060141 0.00057863 0.00055094 ..., 0. 0. 0. ] ----------------------- var 101 record 3 hdr offset: 597600 data offset: 776978432 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 97122304 79872 900 3 4 0 0 0 0 7031111 1 177330356 0 5181 0 0 1] real hdr: [ 4.10001035e+02 9.53709855e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.20001478e+02 2.49998333e+02 9.63777064e-01 9.71644051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00059867 0.00057599 0.00054843 ..., 0. 0. 0. ] ----------------------- var 101 record 4 hdr offset: 598112 data offset: 777617408 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 97202176 79872 900 3 5 0 0 0 0 7031111 1 177486756 0 5181 0 0 1] real hdr: [ 6.10000486e+02 9.31527464e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.00000592e+02 4.10001035e+02 9.43695500e-01 9.53709855e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00059513 0.00057259 0.00054519 ..., 0. 0. 0. ] ----------------------- var 101 record 5 hdr offset: 598624 data offset: 778256384 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 97282048 79872 900 3 6 0 0 0 0 7031111 1 177643156 0 5181 0 0 1] real hdr: [ 8.50000613e+02 9.05253051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.20000381e+02 6.10000486e+02 9.19438386e-01 9.31527464e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00181796 0.00182429 0.00182783 ..., 0. 0. 0. ] ----------------------- var 101 record 6 hdr offset: 599136 data offset: 778895360 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 97361920 79872 900 3 7 0 0 0 0 7031111 1 177799556 0 5181 0 0 1] real hdr: [ 1.13000142e+03 8.75074549e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.80000846e+02 8.50000613e+02 8.91177995e-01 9.05253051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00195333 0.00194165 0.00192908 ..., 0. 0. 0. ] ----------------------- var 101 record 7 hdr offset: 599648 data offset: 779534336 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 97441792 79872 900 3 8 0 0 0 0 7031111 1 177955956 0 5181 0 0 1] real hdr: [ 1.44999897e+03 8.41211628e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.27999806e+03 1.13000142e+03 8.59118341e-01 8.75074549e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.0027624 0.00286862 0.00299324 ..., 0. 0. 0. ] ----------------------- var 101 record 8 hdr offset: 600160 data offset: 780173312 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 97521664 79872 900 3 9 0 0 0 0 7031111 1 178112356 0 5181 0 0 1] real hdr: [ 1.81000112e+03 8.03914038e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.61999988e+03 1.44999897e+03 8.23493502e-01 8.41211628e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00363014 -0.00405113 -0.00446088 ..., 0. 0. 0. ] ----------------------- var 101 record 9 hdr offset: 600672 data offset: 780812288 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 97601536 79872 900 3 10 0 0 0 0 7031111 1 178268756 0 5181 0 0 1] real hdr: [ 2.21000002e+03 7.63464495e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.99999844e+03 1.81000112e+03 7.84570542e-01 8.03914038e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00175942 -0.0015582 -0.00136421 ..., 0. 0. 0. ] ----------------------- var 101 record 10 hdr offset: 601184 data offset: 781451264 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 97681408 79872 900 3 11 0 0 0 0 7031111 1 178425156 0 5181 0 0 1] real hdr: [ 2.64999960e+03 7.20175811e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.42000161e+03 2.21000002e+03 7.42646223e-01 7.63464495e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 101 record 11 hdr offset: 601696 data offset: 782090240 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 97761280 79872 900 3 12 0 0 0 0 7031111 1 178581556 0 5181 0 0 1] real hdr: [ 3.12999986e+03 6.74392534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.88000152e+03 2.64999960e+03 6.98050213e-01 7.20175811e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 101 record 12 hdr offset: 602208 data offset: 782729216 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 97841152 79872 900 3 13 0 0 0 0 7031111 1 178737956 0 5181 0 0 1] real hdr: [ 3.65000079e+03 6.26490534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.37999819e+03 3.12999986e+03 6.51142688e-01 6.74392534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 101 record 13 hdr offset: 602720 data offset: 783368192 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 97921024 79872 900 3 14 0 0 0 0 7031111 1 178894356 0 5181 0 0 1] real hdr: [ 4.20999847e+03 5.76877346e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.91999946e+03 3.65000079e+03 6.02314441e-01 6.26490534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 101 record 14 hdr offset: 603232 data offset: 784007168 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 98000896 79872 900 3 15 0 0 0 0 7031111 1 179050756 0 5181 0 0 1] real hdr: [ 4.81000075e+03 5.25990788e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.50000140e+03 4.20999847e+03 5.51988701e-01 5.76877346e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 101 record 15 hdr offset: 603744 data offset: 784646144 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 98080768 79872 900 3 16 0 0 0 0 7031111 1 179207156 0 5181 0 0 1] real hdr: [ 5.44999978e+03 4.74301366e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.12000009e+03 4.81000075e+03 5.00619965e-01 5.25990788e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 101 record 16 hdr offset: 604256 data offset: 785285120 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 98160640 79872 900 3 17 0 0 0 0 7031111 1 179363556 0 5181 0 0 1] real hdr: [ 6.12999948e+03 4.22309896e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.77999946e+03 5.44999978e+03 4.48693382e-01 4.74301366e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 101 record 17 hdr offset: 604768 data offset: 785924096 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 98240512 79872 900 3 18 0 0 0 0 7031111 1 179519956 0 5181 0 0 1] real hdr: [ 6.84999986e+03 3.70548863e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.47999950e+03 6.12999948e+03 3.96725773e-01 4.22309896e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 101 record 18 hdr offset: 605280 data offset: 786563072 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 98320384 79872 900 3 19 0 0 0 0 7031111 1 179676356 0 5181 0 0 1] real hdr: [ 7.61000092e+03 3.19582071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.22000022e+03 6.84999986e+03 3.45265283e-01 3.70548863e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 101 record 19 hdr offset: 605792 data offset: 787202048 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 98400256 79872 900 3 20 0 0 0 0 7031111 1 179832756 0 5181 0 0 1] real hdr: [ 8.40999873e+03 2.70004882e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00000162e+03 7.61000092e+03 2.94891378e-01 3.19582071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 101 record 20 hdr offset: 606304 data offset: 787841024 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 98480128 79872 900 3 21 0 0 0 0 7031111 1 179989156 0 5181 0 0 1] real hdr: [ 9.25000113e+03 2.22443261e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.81999976e+03 8.40999873e+03 2.46215071e-01 2.70004882e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 101 record 21 hdr offset: 606816 data offset: 788480000 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 98560000 79872 900 3 22 0 0 0 0 7031111 1 180145556 0 5181 0 0 1] real hdr: [ 1.01300003e+04 1.77555424e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.67999858e+03 9.25000113e+03 1.99878209e-01 2.22443261e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 101 record 22 hdr offset: 607328 data offset: 789118976 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 98639872 79872 900 3 23 0 0 0 0 7031111 1 180301956 0 5181 0 0 1] real hdr: [ 1.10500001e+04 1.36030234e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.05799981e+04 1.01300003e+04 1.56554224e-01 1.77555424e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 101 record 23 hdr offset: 607840 data offset: 789757952 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 98719744 79872 900 3 24 0 0 0 0 7031111 1 180458356 0 5181 0 0 1] real hdr: [ 1.20100006e+04 9.85881076e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.15199982e+04 1.10500001e+04 1.16947874e-01 1.36030234e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 101 record 24 hdr offset: 608352 data offset: 790396928 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 98799616 79872 900 3 25 0 0 0 0 7031111 1 180614756 0 5181 0 0 1] real hdr: [ 1.30100018e+04 6.59807861e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.24999991e+04 1.20100006e+04 8.17952369e-02 9.85881076e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 101 record 25 hdr offset: 608864 data offset: 791035904 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 98879488 79872 900 3 26 0 0 0 0 7031111 1 180771156 0 5181 0 0 1] real hdr: [ 1.40504001e+04 3.89823900e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.35200006e+04 1.30100018e+04 5.18637157e-02 6.59807861e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 101 record 26 hdr offset: 609376 data offset: 791674880 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 98959360 79872 900 3 27 0 0 0 0 7031111 1 180927556 0 5181 0 0 1] real hdr: [ 1.51377198e+04 1.83146873e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.45807997e+04 1.40504001e+04 2.79368177e-02 3.89823900e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 101 record 27 hdr offset: 609888 data offset: 792313856 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 99039232 79872 900 3 28 0 0 0 0 7031111 1 181083956 0 5181 0 0 1] real hdr: [ 1.62849737e+04 4.87210933e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.56946399e+04 1.51377198e+04 1.07164793e-02 1.83146873e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 101 record 28 hdr offset: 610400 data offset: 792952832 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 99119104 79872 900 3 29 0 0 0 0 7031111 1 181240356 0 5181 0 0 1] real hdr: [ 1.75069688e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.68753114e+04 1.62849737e+04 1.30179090e-03 4.87210933e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 101 record 29 hdr offset: 610912 data offset: 793591808 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 99198976 79872 900 3 30 0 0 0 0 7031111 1 181396756 0 5181 0 0 1] real hdr: [ 1.88208202e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81386262e+04 1.75069688e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 101 record 30 hdr offset: 611424 data offset: 794230784 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 99278848 79872 900 3 31 0 0 0 0 7031111 1 181553156 0 5181 0 0 1] real hdr: [ 2.02465990e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.95030104e+04 1.88208202e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 101 record 31 hdr offset: 611936 data offset: 794869760 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 99358720 79872 900 3 32 0 0 0 0 7031111 1 181709556 0 5181 0 0 1] real hdr: [ 2.18081366e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.09901876e+04 2.02465990e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 101 record 32 hdr offset: 612448 data offset: 795508736 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 99438592 79872 900 3 33 0 0 0 0 7031111 1 181865956 0 5181 0 0 1] real hdr: [ 2.35421836e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.26260817e+04 2.18081366e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 101 record 33 hdr offset: 612960 data offset: 796147712 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 99518464 79872 900 3 34 0 0 0 0 7031111 1 182022356 0 5181 0 0 1] real hdr: [ 2.55209609e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.44582854e+04 2.35421836e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 101 record 34 hdr offset: 613472 data offset: 796786688 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 99598336 79872 900 3 35 0 0 0 0 7031111 1 182178756 0 5181 0 0 1] real hdr: [ 2.79013583e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.65836402e+04 2.55209609e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 101 record 35 hdr offset: 613984 data offset: 797425664 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 99678208 79872 900 3 36 0 0 0 0 7031111 1 182335156 0 5181 0 0 1] real hdr: [ 3.10638886e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.92190802e+04 2.79013583e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 101 record 36 hdr offset: 614496 data offset: 798064640 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 99758080 79872 900 3 37 0 0 0 0 7031111 1 182491556 0 5181 0 0 1] real hdr: [ 3.60817633e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.29086931e+04 3.10638886e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 101 record 37 hdr offset: 615008 data offset: 798703616 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 99837952 79872 900 3 38 0 0 0 0 7031111 1 182647956 0 5181 0 0 1] real hdr: [ 4.24279038e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.92548336e+04 3.60817633e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 102: nz = 38, nt = 1 var 102 record 0 hdr offset: 615520 data offset: 799342592 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 99917824 79872 900 5 1 0 0 0 0 7031111 1 182804356 0 5185 0 0 1] real hdr: [ 2.00003377e+01 9.97716462e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.99820611e+00 0.00000000e+00 9.98858129e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00685781 -0.00683447 -0.00680893 ..., 0. 0. 0. ] ----------------------- var 102 record 1 hdr offset: 616032 data offset: 799981568 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 99997696 79872 900 5 2 0 0 0 0 7031111 1 182960756 0 5185 0 0 1] real hdr: [ 8.00013508e+01 9.90881510e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.99988815e+01 2.00003377e+01 9.94296273e-01 9.97716462e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00685781 -0.00683447 -0.00680893 ..., 0. 0. 0. ] ----------------------- var 102 record 2 hdr offset: 616544 data offset: 800620544 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 100077568 79872 900 5 3 0 0 0 0 7031111 1 183117156 0 5185 0 0 1] real hdr: [ 1.79999114e+02 9.79542572e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30000232e+02 8.00013508e+01 9.85203885e-01 9.90881510e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00685781 -0.00683447 -0.00680893 ..., 0. 0. 0. ] ----------------------- var 102 record 3 hdr offset: 617056 data offset: 801259520 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 100157440 79872 900 5 4 0 0 0 0 7031111 1 183273556 0 5185 0 0 1] real hdr: [ 3.20001478e+02 9.63777064e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.49998333e+02 1.79999114e+02 9.71644051e-01 9.79542572e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00685781 -0.00683447 -0.00680893 ..., 0. 0. 0. ] ----------------------- var 102 record 4 hdr offset: 617568 data offset: 801898496 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 100237312 79872 900 5 5 0 0 0 0 7031111 1 183429956 0 5185 0 0 1] real hdr: [ 5.00000592e+02 9.43695500e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.10001035e+02 3.20001478e+02 9.53709855e-01 9.63777064e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00685781 -0.00683447 -0.00680893 ..., 0. 0. 0. ] ----------------------- var 102 record 5 hdr offset: 618080 data offset: 802537472 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 100317184 79872 900 5 6 0 0 0 0 7031111 1 183586356 0 5185 0 0 1] real hdr: [ 7.20000381e+02 9.19438386e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.10000486e+02 5.00000592e+02 9.31527464e-01 9.43695500e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00129272 0.00128961 0.00128621 ..., 0. 0. 0. ] ----------------------- var 102 record 6 hdr offset: 618592 data offset: 803176448 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 100397056 79872 900 5 7 0 0 0 0 7031111 1 183742756 0 5185 0 0 1] real hdr: [ 9.80000846e+02 8.91177995e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.50000613e+02 7.20000381e+02 9.05253051e-01 9.19438386e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00125114 0.00124972 0.00124773 ..., 0. 0. 0. ] ----------------------- var 102 record 7 hdr offset: 619104 data offset: 803815424 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 100476928 79872 900 5 8 0 0 0 0 7031111 1 183899156 0 5185 0 0 1] real hdr: [ 1.27999806e+03 8.59118341e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.13000142e+03 9.80000846e+02 8.75074549e-01 8.91177995e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00101104 0.0010049 0.00099831 ..., 0. 0. 0. ] ----------------------- var 102 record 8 hdr offset: 619616 data offset: 804454400 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 100556800 79872 900 5 9 0 0 0 0 7031111 1 184055556 0 5185 0 0 1] real hdr: [ 1.61999988e+03 8.23493502e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.44999897e+03 1.27999806e+03 8.41211628e-01 8.59118341e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00077333 0.00076552 0.0007577 ..., 0. 0. 0. ] ----------------------- var 102 record 9 hdr offset: 620128 data offset: 805093376 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 100636672 79872 900 5 10 0 0 0 0 7031111 1 184211956 0 5185 0 0 1] real hdr: [ 1.99999844e+03 7.84570542e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81000112e+03 1.61999988e+03 8.03914038e-01 8.23493502e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00078297 0.00078421 0.00078499 ..., 0. 0. 0. ] ----------------------- var 102 record 10 hdr offset: 620640 data offset: 805732352 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 100716544 79872 900 5 11 0 0 0 0 7031111 1 184368356 0 5185 0 0 1] real hdr: [ 2.42000161e+03 7.42646223e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.21000002e+03 1.99999844e+03 7.63464495e-01 7.84570542e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00466775 0.00465224 0.00463534 ..., 0. 0. 0. ] ----------------------- var 102 record 11 hdr offset: 621152 data offset: 806371328 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 100796416 79872 900 5 12 0 0 0 0 7031111 1 184524756 0 5185 0 0 1] real hdr: [ 2.88000152e+03 6.98050213e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.64999960e+03 2.42000161e+03 7.20175811e-01 7.42646223e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 102 record 12 hdr offset: 621664 data offset: 807010304 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 100876288 79872 900 5 13 0 0 0 0 7031111 1 184681156 0 5185 0 0 1] real hdr: [ 3.37999819e+03 6.51142688e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.12999986e+03 2.88000152e+03 6.74392534e-01 6.98050213e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 102 record 13 hdr offset: 622176 data offset: 807649280 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 100956160 79872 900 5 14 0 0 0 0 7031111 1 184837556 0 5185 0 0 1] real hdr: [ 3.91999946e+03 6.02314441e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.65000079e+03 3.37999819e+03 6.26490534e-01 6.51142688e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 102 record 14 hdr offset: 622688 data offset: 808288256 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 101036032 79872 900 5 15 0 0 0 0 7031111 1 184993956 0 5185 0 0 1] real hdr: [ 4.50000140e+03 5.51988701e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.20999847e+03 3.91999946e+03 5.76877346e-01 6.02314441e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 102 record 15 hdr offset: 623200 data offset: 808927232 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 101115904 79872 900 5 16 0 0 0 0 7031111 1 185150356 0 5185 0 0 1] real hdr: [ 5.12000009e+03 5.00619965e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.81000075e+03 4.50000140e+03 5.25990788e-01 5.51988701e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 102 record 16 hdr offset: 623712 data offset: 809566208 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 101195776 79872 900 5 17 0 0 0 0 7031111 1 185306756 0 5185 0 0 1] real hdr: [ 5.77999946e+03 4.48693382e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.44999978e+03 5.12000009e+03 4.74301366e-01 5.00619965e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 102 record 17 hdr offset: 624224 data offset: 810205184 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 101275648 79872 900 5 18 0 0 0 0 7031111 1 185463156 0 5185 0 0 1] real hdr: [ 6.47999950e+03 3.96725773e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.12999948e+03 5.77999946e+03 4.22309896e-01 4.48693382e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 102 record 18 hdr offset: 624736 data offset: 810844160 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 101355520 79872 900 5 19 0 0 0 0 7031111 1 185619556 0 5185 0 0 1] real hdr: [ 7.22000022e+03 3.45265283e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.84999986e+03 6.47999950e+03 3.70548863e-01 3.96725773e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 102 record 19 hdr offset: 625248 data offset: 811483136 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 101435392 79872 900 5 20 0 0 0 0 7031111 1 185775956 0 5185 0 0 1] real hdr: [ 8.00000162e+03 2.94891378e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.61000092e+03 7.22000022e+03 3.19582071e-01 3.45265283e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 102 record 20 hdr offset: 625760 data offset: 812122112 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 101515264 79872 900 5 21 0 0 0 0 7031111 1 185932356 0 5185 0 0 1] real hdr: [ 8.81999976e+03 2.46215071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.40999873e+03 8.00000162e+03 2.70004882e-01 2.94891378e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 102 record 21 hdr offset: 626272 data offset: 812761088 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 101595136 79872 900 5 22 0 0 0 0 7031111 1 186088756 0 5185 0 0 1] real hdr: [ 9.67999858e+03 1.99878209e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.25000113e+03 8.81999976e+03 2.22443261e-01 2.46215071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 102 record 22 hdr offset: 626784 data offset: 813400064 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 101675008 79872 900 5 23 0 0 0 0 7031111 1 186245156 0 5185 0 0 1] real hdr: [ 1.05799981e+04 1.56554224e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.01300003e+04 9.67999858e+03 1.77555424e-01 1.99878209e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 102 record 23 hdr offset: 627296 data offset: 814039040 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 101754880 79872 900 5 24 0 0 0 0 7031111 1 186401556 0 5185 0 0 1] real hdr: [ 1.15199982e+04 1.16947874e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.10500001e+04 1.05799981e+04 1.36030234e-01 1.56554224e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 102 record 24 hdr offset: 627808 data offset: 814678016 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 101834752 79872 900 5 25 0 0 0 0 7031111 1 186557956 0 5185 0 0 1] real hdr: [ 1.24999991e+04 8.17952369e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.20100006e+04 1.15199982e+04 9.85881076e-02 1.16947874e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 102 record 25 hdr offset: 628320 data offset: 815316992 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 101914624 79872 900 5 26 0 0 0 0 7031111 1 186714356 0 5185 0 0 1] real hdr: [ 1.35200006e+04 5.18637157e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30100018e+04 1.24999991e+04 6.59807861e-02 8.17952369e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 102 record 26 hdr offset: 628832 data offset: 815955968 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 101994496 79872 900 5 27 0 0 0 0 7031111 1 186870756 0 5185 0 0 1] real hdr: [ 1.45807997e+04 2.79368177e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.40504001e+04 1.35200006e+04 3.89823900e-02 5.18637157e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 102 record 27 hdr offset: 629344 data offset: 816594944 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 102074368 79872 900 5 28 0 0 0 0 7031111 1 187027156 0 5185 0 0 1] real hdr: [ 1.56946399e+04 1.07164793e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.51377198e+04 1.45807997e+04 1.83146873e-02 2.79368177e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 102 record 28 hdr offset: 629856 data offset: 817233920 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 102154240 79872 900 5 29 0 0 0 0 7031111 1 187183556 0 5185 0 0 1] real hdr: [ 1.68753114e+04 1.30179090e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.62849737e+04 1.56946399e+04 4.87210933e-03 1.07164793e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 102 record 29 hdr offset: 630368 data offset: 817872896 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 102234112 79872 900 5 30 0 0 0 0 7031111 1 187339956 0 5185 0 0 1] real hdr: [ 1.81386262e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.75069688e+04 1.68753114e+04 0.00000000e+00 1.30179090e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 102 record 30 hdr offset: 630880 data offset: 818511872 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 102313984 79872 900 5 31 0 0 0 0 7031111 1 187496356 0 5185 0 0 1] real hdr: [ 1.95030104e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.88208202e+04 1.81386262e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 102 record 31 hdr offset: 631392 data offset: 819150848 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 102393856 79872 900 5 32 0 0 0 0 7031111 1 187652756 0 5185 0 0 1] real hdr: [ 2.09901876e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.02465990e+04 1.95030104e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 102 record 32 hdr offset: 631904 data offset: 819789824 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 102473728 79872 900 5 33 0 0 0 0 7031111 1 187809156 0 5185 0 0 1] real hdr: [ 2.26260817e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.18081366e+04 2.09901876e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 102 record 33 hdr offset: 632416 data offset: 820428800 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 102553600 79872 900 5 34 0 0 0 0 7031111 1 187965556 0 5185 0 0 1] real hdr: [ 2.44582854e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.35421836e+04 2.26260817e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 102 record 34 hdr offset: 632928 data offset: 821067776 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 102633472 79872 900 5 35 0 0 0 0 7031111 1 188121956 0 5185 0 0 1] real hdr: [ 2.65836402e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.55209609e+04 2.44582854e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 102 record 35 hdr offset: 633440 data offset: 821706752 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 102713344 79872 900 5 36 0 0 0 0 7031111 1 188278356 0 5185 0 0 1] real hdr: [ 2.92190802e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.79013583e+04 2.65836402e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 102 record 36 hdr offset: 633952 data offset: 822345728 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 102793216 79872 900 5 37 0 0 0 0 7031111 1 188434756 0 5185 0 0 1] real hdr: [ 3.29086931e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.10638886e+04 2.92190802e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 102 record 37 hdr offset: 634464 data offset: 822984704 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 102873088 79872 900 5 38 0 0 0 0 7031111 1 188591156 0 5185 0 0 1] real hdr: [ 3.92548336e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.60817633e+04 3.29086931e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 103: nz = 38, nt = 1 var 103 record 0 hdr offset: 634976 data offset: 823623680 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 102952960 79872 900 6 1 0 0 0 0 7031111 1 188747556 0 5186 0 0 1] real hdr: [ 2.00003377e+01 9.97716462e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.99820611e+00 0.00000000e+00 9.98858129e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.00320236 0.00345042 0.00352976 ..., 0. 0. 0. ] ----------------------- var 103 record 1 hdr offset: 635488 data offset: 824262656 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 103032832 79872 900 6 2 0 0 0 0 7031111 1 188903496 0 5186 0 0 1] real hdr: [ 8.00013508e+01 9.90881510e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.99988815e+01 2.00003377e+01 9.94296273e-01 9.97716462e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.00320236 0.00345042 0.00352976 ..., 0. 0. 0. ] ----------------------- var 103 record 2 hdr offset: 636000 data offset: 824901632 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 103112704 79872 900 6 3 0 0 0 0 7031111 1 189059436 0 5186 0 0 1] real hdr: [ 1.79999114e+02 9.79542572e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30000232e+02 8.00013508e+01 9.85203885e-01 9.90881510e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.00320236 0.00345042 0.00352976 ..., 0. 0. 0. ] ----------------------- var 103 record 3 hdr offset: 636512 data offset: 825540608 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 103192576 79872 900 6 4 0 0 0 0 7031111 1 189215376 0 5186 0 0 1] real hdr: [ 3.20001478e+02 9.63777064e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.49998333e+02 1.79999114e+02 9.71644051e-01 9.79542572e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.00320236 0.00345042 0.00352976 ..., 0. 0. 0. ] ----------------------- var 103 record 4 hdr offset: 637024 data offset: 826179584 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 103272448 79872 900 6 5 0 0 0 0 7031111 1 189371316 0 5186 0 0 1] real hdr: [ 5.00000592e+02 9.43695500e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.10001035e+02 3.20001478e+02 9.53709855e-01 9.63777064e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.00320236 0.00345042 0.00352976 ..., 0. 0. 0. ] ----------------------- var 103 record 5 hdr offset: 637536 data offset: 826818560 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 103352320 79872 900 6 6 0 0 0 0 7031111 1 189527256 0 5186 0 0 1] real hdr: [ 7.20000381e+02 9.19438386e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.10000486e+02 5.00000592e+02 9.31527464e-01 9.43695500e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.00076051 -0.00081356 -0.00082394 ..., 0. 0. 0. ] ----------------------- var 103 record 6 hdr offset: 638048 data offset: 827457536 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 103432192 79872 900 6 7 0 0 0 0 7031111 1 189683196 0 5186 0 0 1] real hdr: [ 9.80000846e+02 8.91177995e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.50000613e+02 7.20000381e+02 9.05253051e-01 9.19438386e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.00064388 -0.00068861 -0.00070501 ..., 0. 0. 0. ] ----------------------- var 103 record 7 hdr offset: 638560 data offset: 828096512 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 103512064 79872 900 6 8 0 0 0 0 7031111 1 189839136 0 5186 0 0 1] real hdr: [ 1.27999806e+03 8.59118341e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.13000142e+03 9.80000846e+02 8.75074549e-01 8.91177995e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.00043196 -0.0004594 -0.00047236 ..., 0. 0. 0. ] ----------------------- var 103 record 8 hdr offset: 639072 data offset: 828735488 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 103591936 79872 900 6 9 0 0 0 0 7031111 1 189995076 0 5186 0 0 1] real hdr: [ 1.61999988e+03 8.23493502e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.44999897e+03 1.27999806e+03 8.41211628e-01 8.59118341e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.00023516 -0.00027174 -0.00028292 ..., 0. 0. 0. ] ----------------------- var 103 record 9 hdr offset: 639584 data offset: 829374464 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 103671808 79872 900 6 10 0 0 0 0 7031111 1 190151016 0 5186 0 0 1] real hdr: [ 1.99999844e+03 7.84570542e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81000112e+03 1.61999988e+03 8.03914038e-01 8.23493502e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.00037519 -0.00040685 -0.00041622 ..., 0. 0. 0. ] ----------------------- var 103 record 10 hdr offset: 640096 data offset: 830013440 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 103751680 79872 900 6 11 0 0 0 0 7031111 1 190306956 0 5186 0 0 1] real hdr: [ 2.42000161e+03 7.42646223e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.21000002e+03 1.99999844e+03 7.63464495e-01 7.84570542e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.00217396 -0.00233599 -0.0023883 ..., 0. 0. 0. ] ----------------------- var 103 record 11 hdr offset: 640608 data offset: 830652416 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 103831552 79872 900 6 12 0 0 0 0 7031111 1 190462896 0 5186 0 0 1] real hdr: [ 2.88000152e+03 6.98050213e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.64999960e+03 2.42000161e+03 7.20175811e-01 7.42646223e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 103 record 12 hdr offset: 641120 data offset: 831291392 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 103911424 79872 900 6 13 0 0 0 0 7031111 1 190618836 0 5186 0 0 1] real hdr: [ 3.37999819e+03 6.51142688e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.12999986e+03 2.88000152e+03 6.74392534e-01 6.98050213e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 103 record 13 hdr offset: 641632 data offset: 831930368 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 103991296 79872 900 6 14 0 0 0 0 7031111 1 190774776 0 5186 0 0 1] real hdr: [ 3.91999946e+03 6.02314441e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.65000079e+03 3.37999819e+03 6.26490534e-01 6.51142688e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 103 record 14 hdr offset: 642144 data offset: 832569344 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 104071168 79872 900 6 15 0 0 0 0 7031111 1 190930716 0 5186 0 0 1] real hdr: [ 4.50000140e+03 5.51988701e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.20999847e+03 3.91999946e+03 5.76877346e-01 6.02314441e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 103 record 15 hdr offset: 642656 data offset: 833208320 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 104151040 79872 900 6 16 0 0 0 0 7031111 1 191086656 0 5186 0 0 1] real hdr: [ 5.12000009e+03 5.00619965e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.81000075e+03 4.50000140e+03 5.25990788e-01 5.51988701e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 103 record 16 hdr offset: 643168 data offset: 833847296 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 104230912 79872 900 6 17 0 0 0 0 7031111 1 191242596 0 5186 0 0 1] real hdr: [ 5.77999946e+03 4.48693382e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.44999978e+03 5.12000009e+03 4.74301366e-01 5.00619965e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 103 record 17 hdr offset: 643680 data offset: 834486272 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 104310784 79872 900 6 18 0 0 0 0 7031111 1 191398536 0 5186 0 0 1] real hdr: [ 6.47999950e+03 3.96725773e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.12999948e+03 5.77999946e+03 4.22309896e-01 4.48693382e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 103 record 18 hdr offset: 644192 data offset: 835125248 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 104390656 79872 900 6 19 0 0 0 0 7031111 1 191554476 0 5186 0 0 1] real hdr: [ 7.22000022e+03 3.45265283e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.84999986e+03 6.47999950e+03 3.70548863e-01 3.96725773e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 103 record 19 hdr offset: 644704 data offset: 835764224 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 104470528 79872 900 6 20 0 0 0 0 7031111 1 191710416 0 5186 0 0 1] real hdr: [ 8.00000162e+03 2.94891378e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.61000092e+03 7.22000022e+03 3.19582071e-01 3.45265283e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 103 record 20 hdr offset: 645216 data offset: 836403200 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 104550400 79872 900 6 21 0 0 0 0 7031111 1 191866356 0 5186 0 0 1] real hdr: [ 8.81999976e+03 2.46215071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.40999873e+03 8.00000162e+03 2.70004882e-01 2.94891378e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 103 record 21 hdr offset: 645728 data offset: 837042176 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 104630272 79872 900 6 22 0 0 0 0 7031111 1 192022296 0 5186 0 0 1] real hdr: [ 9.67999858e+03 1.99878209e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.25000113e+03 8.81999976e+03 2.22443261e-01 2.46215071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 103 record 22 hdr offset: 646240 data offset: 837681152 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 104710144 79872 900 6 23 0 0 0 0 7031111 1 192178236 0 5186 0 0 1] real hdr: [ 1.05799981e+04 1.56554224e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.01300003e+04 9.67999858e+03 1.77555424e-01 1.99878209e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 103 record 23 hdr offset: 646752 data offset: 838320128 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 104790016 79872 900 6 24 0 0 0 0 7031111 1 192334176 0 5186 0 0 1] real hdr: [ 1.15199982e+04 1.16947874e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.10500001e+04 1.05799981e+04 1.36030234e-01 1.56554224e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 103 record 24 hdr offset: 647264 data offset: 838959104 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 104869888 79872 900 6 25 0 0 0 0 7031111 1 192490116 0 5186 0 0 1] real hdr: [ 1.24999991e+04 8.17952369e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.20100006e+04 1.15199982e+04 9.85881076e-02 1.16947874e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 103 record 25 hdr offset: 647776 data offset: 839598080 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 104949760 79872 900 6 26 0 0 0 0 7031111 1 192646056 0 5186 0 0 1] real hdr: [ 1.35200006e+04 5.18637157e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30100018e+04 1.24999991e+04 6.59807861e-02 8.17952369e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 103 record 26 hdr offset: 648288 data offset: 840237056 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 105029632 79872 900 6 27 0 0 0 0 7031111 1 192801996 0 5186 0 0 1] real hdr: [ 1.45807997e+04 2.79368177e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.40504001e+04 1.35200006e+04 3.89823900e-02 5.18637157e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 103 record 27 hdr offset: 648800 data offset: 840876032 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 105109504 79872 900 6 28 0 0 0 0 7031111 1 192957936 0 5186 0 0 1] real hdr: [ 1.56946399e+04 1.07164793e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.51377198e+04 1.45807997e+04 1.83146873e-02 2.79368177e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 103 record 28 hdr offset: 649312 data offset: 841515008 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 105189376 79872 900 6 29 0 0 0 0 7031111 1 193113876 0 5186 0 0 1] real hdr: [ 1.68753114e+04 1.30179090e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.62849737e+04 1.56946399e+04 4.87210933e-03 1.07164793e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 103 record 29 hdr offset: 649824 data offset: 842153984 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 105269248 79872 900 6 30 0 0 0 0 7031111 1 193269816 0 5186 0 0 1] real hdr: [ 1.81386262e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.75069688e+04 1.68753114e+04 0.00000000e+00 1.30179090e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 103 record 30 hdr offset: 650336 data offset: 842792960 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 105349120 79872 900 6 31 0 0 0 0 7031111 1 193425756 0 5186 0 0 1] real hdr: [ 1.95030104e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.88208202e+04 1.81386262e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 103 record 31 hdr offset: 650848 data offset: 843431936 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 105428992 79872 900 6 32 0 0 0 0 7031111 1 193581696 0 5186 0 0 1] real hdr: [ 2.09901876e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.02465990e+04 1.95030104e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 103 record 32 hdr offset: 651360 data offset: 844070912 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 105508864 79872 900 6 33 0 0 0 0 7031111 1 193737636 0 5186 0 0 1] real hdr: [ 2.26260817e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.18081366e+04 2.09901876e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 103 record 33 hdr offset: 651872 data offset: 844709888 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 105588736 79872 900 6 34 0 0 0 0 7031111 1 193893576 0 5186 0 0 1] real hdr: [ 2.44582854e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.35421836e+04 2.26260817e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 103 record 34 hdr offset: 652384 data offset: 845348864 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 105668608 79872 900 6 35 0 0 0 0 7031111 1 194049516 0 5186 0 0 1] real hdr: [ 2.65836402e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.55209609e+04 2.44582854e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 103 record 35 hdr offset: 652896 data offset: 845987840 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 105748480 79872 900 6 36 0 0 0 0 7031111 1 194205456 0 5186 0 0 1] real hdr: [ 2.92190802e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.79013583e+04 2.65836402e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 103 record 36 hdr offset: 653408 data offset: 846626816 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 105828352 79872 900 6 37 0 0 0 0 7031111 1 194361396 0 5186 0 0 1] real hdr: [ 3.29086931e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.10638886e+04 2.92190802e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 103 record 37 hdr offset: 653920 data offset: 847265792 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 105908224 79872 900 6 38 0 0 0 0 7031111 1 194517336 0 5186 0 0 1] real hdr: [ 3.92548336e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.60817633e+04 3.29086931e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 104: nz = 1, nt = 1 var 104 record 0 hdr offset: 654432 data offset: 847904768 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 94 0 128 129 0 387757194 105988096 79872 900 62 8888 0 0 0 0 7031111 1 194673276 0 5201 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00016328 0.00014046 0.00011888 ..., 0. 0. 0. ] ----------------------- =============================== var 105: nz = 1, nt = 1 var 105 record 0 hdr offset: 654944 data offset: 848543744 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 90 0 128 129 0 387757194 106067968 79872 900 213 8888 0 0 0 0 7031111 1 194829676 0 5216 0 0 1] real hdr: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.08851225e-06 9.36395679e-07 7.92525839e-07 ..., 0.00000000e+00 0.00000000e+00 0.00000000e+00] ----------------------- =============================== var 106: nz = 38, nt = 1 var 106 record 0 hdr offset: 655456 data offset: 849182720 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 106147840 79872 900 5 1 0 0 0 0 7031111 1 194986076 0 6185 0 0 1] real hdr: [ 2.00003377e+01 9.97716462e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.99820611e+00 0.00000000e+00 9.98858129e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 1 hdr offset: 655968 data offset: 849821696 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 106227712 79872 900 5 2 0 0 0 0 7031111 1 195142476 0 6185 0 0 1] real hdr: [ 8.00013508e+01 9.90881510e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.99988815e+01 2.00003377e+01 9.94296273e-01 9.97716462e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 2 hdr offset: 656480 data offset: 850460672 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 106307584 79872 900 5 3 0 0 0 0 7031111 1 195298876 0 6185 0 0 1] real hdr: [ 1.79999114e+02 9.79542572e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30000232e+02 8.00013508e+01 9.85203885e-01 9.90881510e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 3 hdr offset: 656992 data offset: 851099648 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 106387456 79872 900 5 4 0 0 0 0 7031111 1 195455276 0 6185 0 0 1] real hdr: [ 3.20001478e+02 9.63777064e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.49998333e+02 1.79999114e+02 9.71644051e-01 9.79542572e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 4 hdr offset: 657504 data offset: 851738624 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 106467328 79872 900 5 5 0 0 0 0 7031111 1 195611676 0 6185 0 0 1] real hdr: [ 5.00000592e+02 9.43695500e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.10001035e+02 3.20001478e+02 9.53709855e-01 9.63777064e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 5 hdr offset: 658016 data offset: 852377600 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 106547200 79872 900 5 6 0 0 0 0 7031111 1 195768076 0 6185 0 0 1] real hdr: [ 7.20000381e+02 9.19438386e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.10000486e+02 5.00000592e+02 9.31527464e-01 9.43695500e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 6 hdr offset: 658528 data offset: 853016576 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 106627072 79872 900 5 7 0 0 0 0 7031111 1 195924476 0 6185 0 0 1] real hdr: [ 9.80000846e+02 8.91177995e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.50000613e+02 7.20000381e+02 9.05253051e-01 9.19438386e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 7 hdr offset: 659040 data offset: 853655552 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 106706944 79872 900 5 8 0 0 0 0 7031111 1 196080876 0 6185 0 0 1] real hdr: [ 1.27999806e+03 8.59118341e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.13000142e+03 9.80000846e+02 8.75074549e-01 8.91177995e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 8 hdr offset: 659552 data offset: 854294528 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 106786816 79872 900 5 9 0 0 0 0 7031111 1 196237276 0 6185 0 0 1] real hdr: [ 1.61999988e+03 8.23493502e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.44999897e+03 1.27999806e+03 8.41211628e-01 8.59118341e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 9 hdr offset: 660064 data offset: 854933504 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 106866688 79872 900 5 10 0 0 0 0 7031111 1 196393676 0 6185 0 0 1] real hdr: [ 1.99999844e+03 7.84570542e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81000112e+03 1.61999988e+03 8.03914038e-01 8.23493502e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 10 hdr offset: 660576 data offset: 855572480 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 106946560 79872 900 5 11 0 0 0 0 7031111 1 196550076 0 6185 0 0 1] real hdr: [ 2.42000161e+03 7.42646223e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.21000002e+03 1.99999844e+03 7.63464495e-01 7.84570542e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 11 hdr offset: 661088 data offset: 856211456 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 107026432 79872 900 5 12 0 0 0 0 7031111 1 196706476 0 6185 0 0 1] real hdr: [ 2.88000152e+03 6.98050213e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.64999960e+03 2.42000161e+03 7.20175811e-01 7.42646223e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 12 hdr offset: 661600 data offset: 856850432 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 107106304 79872 900 5 13 0 0 0 0 7031111 1 196862876 0 6185 0 0 1] real hdr: [ 3.37999819e+03 6.51142688e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.12999986e+03 2.88000152e+03 6.74392534e-01 6.98050213e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 13 hdr offset: 662112 data offset: 857489408 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 107186176 79872 900 5 14 0 0 0 0 7031111 1 197019276 0 6185 0 0 1] real hdr: [ 3.91999946e+03 6.02314441e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.65000079e+03 3.37999819e+03 6.26490534e-01 6.51142688e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 14 hdr offset: 662624 data offset: 858128384 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 107266048 79872 900 5 15 0 0 0 0 7031111 1 197175676 0 6185 0 0 1] real hdr: [ 4.50000140e+03 5.51988701e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.20999847e+03 3.91999946e+03 5.76877346e-01 6.02314441e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 15 hdr offset: 663136 data offset: 858767360 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 107345920 79872 900 5 16 0 0 0 0 7031111 1 197332076 0 6185 0 0 1] real hdr: [ 5.12000009e+03 5.00619965e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.81000075e+03 4.50000140e+03 5.25990788e-01 5.51988701e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 16 hdr offset: 663648 data offset: 859406336 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 107425792 79872 900 5 17 0 0 0 0 7031111 1 197488476 0 6185 0 0 1] real hdr: [ 5.77999946e+03 4.48693382e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.44999978e+03 5.12000009e+03 4.74301366e-01 5.00619965e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 17 hdr offset: 664160 data offset: 860045312 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 107505664 79872 900 5 18 0 0 0 0 7031111 1 197644876 0 6185 0 0 1] real hdr: [ 6.47999950e+03 3.96725773e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.12999948e+03 5.77999946e+03 4.22309896e-01 4.48693382e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 18 hdr offset: 664672 data offset: 860684288 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 107585536 79872 900 5 19 0 0 0 0 7031111 1 197801276 0 6185 0 0 1] real hdr: [ 7.22000022e+03 3.45265283e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.84999986e+03 6.47999950e+03 3.70548863e-01 3.96725773e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 19 hdr offset: 665184 data offset: 861323264 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 107665408 79872 900 5 20 0 0 0 0 7031111 1 197957676 0 6185 0 0 1] real hdr: [ 8.00000162e+03 2.94891378e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.61000092e+03 7.22000022e+03 3.19582071e-01 3.45265283e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 20 hdr offset: 665696 data offset: 861962240 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 107745280 79872 900 5 21 0 0 0 0 7031111 1 198114076 0 6185 0 0 1] real hdr: [ 8.81999976e+03 2.46215071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.40999873e+03 8.00000162e+03 2.70004882e-01 2.94891378e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 21 hdr offset: 666208 data offset: 862601216 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 107825152 79872 900 5 22 0 0 0 0 7031111 1 198270476 0 6185 0 0 1] real hdr: [ 9.67999858e+03 1.99878209e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.25000113e+03 8.81999976e+03 2.22443261e-01 2.46215071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 22 hdr offset: 666720 data offset: 863240192 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 107905024 79872 900 5 23 0 0 0 0 7031111 1 198426876 0 6185 0 0 1] real hdr: [ 1.05799981e+04 1.56554224e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.01300003e+04 9.67999858e+03 1.77555424e-01 1.99878209e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 23 hdr offset: 667232 data offset: 863879168 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 107984896 79872 900 5 24 0 0 0 0 7031111 1 198583276 0 6185 0 0 1] real hdr: [ 1.15199982e+04 1.16947874e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.10500001e+04 1.05799981e+04 1.36030234e-01 1.56554224e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 24 hdr offset: 667744 data offset: 864518144 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 108064768 79872 900 5 25 0 0 0 0 7031111 1 198739676 0 6185 0 0 1] real hdr: [ 1.24999991e+04 8.17952369e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.20100006e+04 1.15199982e+04 9.85881076e-02 1.16947874e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 25 hdr offset: 668256 data offset: 865157120 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 108144640 79872 900 5 26 0 0 0 0 7031111 1 198896076 0 6185 0 0 1] real hdr: [ 1.35200006e+04 5.18637157e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30100018e+04 1.24999991e+04 6.59807861e-02 8.17952369e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 26 hdr offset: 668768 data offset: 865796096 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 108224512 79872 900 5 27 0 0 0 0 7031111 1 199052476 0 6185 0 0 1] real hdr: [ 1.45807997e+04 2.79368177e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.40504001e+04 1.35200006e+04 3.89823900e-02 5.18637157e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 27 hdr offset: 669280 data offset: 866435072 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 108304384 79872 900 5 28 0 0 0 0 7031111 1 199208876 0 6185 0 0 1] real hdr: [ 1.56946399e+04 1.07164793e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.51377198e+04 1.45807997e+04 1.83146873e-02 2.79368177e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 28 hdr offset: 669792 data offset: 867074048 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 108384256 79872 900 5 29 0 0 0 0 7031111 1 199365276 0 6185 0 0 1] real hdr: [ 1.68753114e+04 1.30179090e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.62849737e+04 1.56946399e+04 4.87210933e-03 1.07164793e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 29 hdr offset: 670304 data offset: 867713024 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 108464128 79872 900 5 30 0 0 0 0 7031111 1 199521676 0 6185 0 0 1] real hdr: [ 1.81386262e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.75069688e+04 1.68753114e+04 0.00000000e+00 1.30179090e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 30 hdr offset: 670816 data offset: 868352000 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 108544000 79872 900 5 31 0 0 0 0 7031111 1 199678076 0 6185 0 0 1] real hdr: [ 1.95030104e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.88208202e+04 1.81386262e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 31 hdr offset: 671328 data offset: 868990976 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 108623872 79872 900 5 32 0 0 0 0 7031111 1 199834476 0 6185 0 0 1] real hdr: [ 2.09901876e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.02465990e+04 1.95030104e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 32 hdr offset: 671840 data offset: 869629952 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 108703744 79872 900 5 33 0 0 0 0 7031111 1 199990876 0 6185 0 0 1] real hdr: [ 2.26260817e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.18081366e+04 2.09901876e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 33 hdr offset: 672352 data offset: 870268928 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 108783616 79872 900 5 34 0 0 0 0 7031111 1 200147276 0 6185 0 0 1] real hdr: [ 2.44582854e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.35421836e+04 2.26260817e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 34 hdr offset: 672864 data offset: 870907904 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 108863488 79872 900 5 35 0 0 0 0 7031111 1 200303676 0 6185 0 0 1] real hdr: [ 2.65836402e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.55209609e+04 2.44582854e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 35 hdr offset: 673376 data offset: 871546880 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 108943360 79872 900 5 36 0 0 0 0 7031111 1 200460076 0 6185 0 0 1] real hdr: [ 2.92190802e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.79013583e+04 2.65836402e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 36 hdr offset: 673888 data offset: 872185856 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 109023232 79872 900 5 37 0 0 0 0 7031111 1 200616476 0 6185 0 0 1] real hdr: [ 3.29086931e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.10638886e+04 2.92190802e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 106 record 37 hdr offset: 674400 data offset: 872824832 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 109103104 79872 900 5 38 0 0 0 0 7031111 1 200772876 0 6185 0 0 1] real hdr: [ 3.92548336e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.60817633e+04 3.29086931e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 107: nz = 38, nt = 1 var 107 record 0 hdr offset: 674912 data offset: 873463808 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 109182976 79872 900 6 1 0 0 0 0 7031111 1 200929276 0 6186 0 0 1] real hdr: [ 2.00003377e+01 9.97716462e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.99820611e+00 0.00000000e+00 9.98858129e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 1 hdr offset: 675424 data offset: 874102784 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 109262848 79872 900 6 2 0 0 0 0 7031111 1 201085216 0 6186 0 0 1] real hdr: [ 8.00013508e+01 9.90881510e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.99988815e+01 2.00003377e+01 9.94296273e-01 9.97716462e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 2 hdr offset: 675936 data offset: 874741760 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 109342720 79872 900 6 3 0 0 0 0 7031111 1 201241156 0 6186 0 0 1] real hdr: [ 1.79999114e+02 9.79542572e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30000232e+02 8.00013508e+01 9.85203885e-01 9.90881510e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 3 hdr offset: 676448 data offset: 875380736 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 109422592 79872 900 6 4 0 0 0 0 7031111 1 201397096 0 6186 0 0 1] real hdr: [ 3.20001478e+02 9.63777064e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.49998333e+02 1.79999114e+02 9.71644051e-01 9.79542572e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 4 hdr offset: 676960 data offset: 876019712 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 109502464 79872 900 6 5 0 0 0 0 7031111 1 201553036 0 6186 0 0 1] real hdr: [ 5.00000592e+02 9.43695500e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.10001035e+02 3.20001478e+02 9.53709855e-01 9.63777064e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 5 hdr offset: 677472 data offset: 876658688 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 109582336 79872 900 6 6 0 0 0 0 7031111 1 201708976 0 6186 0 0 1] real hdr: [ 7.20000381e+02 9.19438386e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.10000486e+02 5.00000592e+02 9.31527464e-01 9.43695500e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 6 hdr offset: 677984 data offset: 877297664 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 109662208 79872 900 6 7 0 0 0 0 7031111 1 201864916 0 6186 0 0 1] real hdr: [ 9.80000846e+02 8.91177995e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.50000613e+02 7.20000381e+02 9.05253051e-01 9.19438386e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 7 hdr offset: 678496 data offset: 877936640 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 109742080 79872 900 6 8 0 0 0 0 7031111 1 202020856 0 6186 0 0 1] real hdr: [ 1.27999806e+03 8.59118341e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.13000142e+03 9.80000846e+02 8.75074549e-01 8.91177995e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 8 hdr offset: 679008 data offset: 878575616 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 109821952 79872 900 6 9 0 0 0 0 7031111 1 202176796 0 6186 0 0 1] real hdr: [ 1.61999988e+03 8.23493502e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.44999897e+03 1.27999806e+03 8.41211628e-01 8.59118341e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 9 hdr offset: 679520 data offset: 879214592 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 109901824 79872 900 6 10 0 0 0 0 7031111 1 202332736 0 6186 0 0 1] real hdr: [ 1.99999844e+03 7.84570542e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81000112e+03 1.61999988e+03 8.03914038e-01 8.23493502e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 10 hdr offset: 680032 data offset: 879853568 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 109981696 79872 900 6 11 0 0 0 0 7031111 1 202488676 0 6186 0 0 1] real hdr: [ 2.42000161e+03 7.42646223e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.21000002e+03 1.99999844e+03 7.63464495e-01 7.84570542e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 11 hdr offset: 680544 data offset: 880492544 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 110061568 79872 900 6 12 0 0 0 0 7031111 1 202644616 0 6186 0 0 1] real hdr: [ 2.88000152e+03 6.98050213e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.64999960e+03 2.42000161e+03 7.20175811e-01 7.42646223e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 12 hdr offset: 681056 data offset: 881131520 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 110141440 79872 900 6 13 0 0 0 0 7031111 1 202800556 0 6186 0 0 1] real hdr: [ 3.37999819e+03 6.51142688e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.12999986e+03 2.88000152e+03 6.74392534e-01 6.98050213e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 13 hdr offset: 681568 data offset: 881770496 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 110221312 79872 900 6 14 0 0 0 0 7031111 1 202956496 0 6186 0 0 1] real hdr: [ 3.91999946e+03 6.02314441e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.65000079e+03 3.37999819e+03 6.26490534e-01 6.51142688e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 14 hdr offset: 682080 data offset: 882409472 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 110301184 79872 900 6 15 0 0 0 0 7031111 1 203112436 0 6186 0 0 1] real hdr: [ 4.50000140e+03 5.51988701e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.20999847e+03 3.91999946e+03 5.76877346e-01 6.02314441e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 15 hdr offset: 682592 data offset: 883048448 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 110381056 79872 900 6 16 0 0 0 0 7031111 1 203268376 0 6186 0 0 1] real hdr: [ 5.12000009e+03 5.00619965e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.81000075e+03 4.50000140e+03 5.25990788e-01 5.51988701e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 16 hdr offset: 683104 data offset: 883687424 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 110460928 79872 900 6 17 0 0 0 0 7031111 1 203424316 0 6186 0 0 1] real hdr: [ 5.77999946e+03 4.48693382e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.44999978e+03 5.12000009e+03 4.74301366e-01 5.00619965e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 17 hdr offset: 683616 data offset: 884326400 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 110540800 79872 900 6 18 0 0 0 0 7031111 1 203580256 0 6186 0 0 1] real hdr: [ 6.47999950e+03 3.96725773e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.12999948e+03 5.77999946e+03 4.22309896e-01 4.48693382e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 18 hdr offset: 684128 data offset: 884965376 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 110620672 79872 900 6 19 0 0 0 0 7031111 1 203736196 0 6186 0 0 1] real hdr: [ 7.22000022e+03 3.45265283e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.84999986e+03 6.47999950e+03 3.70548863e-01 3.96725773e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 19 hdr offset: 684640 data offset: 885604352 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 110700544 79872 900 6 20 0 0 0 0 7031111 1 203892136 0 6186 0 0 1] real hdr: [ 8.00000162e+03 2.94891378e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.61000092e+03 7.22000022e+03 3.19582071e-01 3.45265283e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 20 hdr offset: 685152 data offset: 886243328 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 110780416 79872 900 6 21 0 0 0 0 7031111 1 204048076 0 6186 0 0 1] real hdr: [ 8.81999976e+03 2.46215071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.40999873e+03 8.00000162e+03 2.70004882e-01 2.94891378e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 21 hdr offset: 685664 data offset: 886882304 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 110860288 79872 900 6 22 0 0 0 0 7031111 1 204204016 0 6186 0 0 1] real hdr: [ 9.67999858e+03 1.99878209e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.25000113e+03 8.81999976e+03 2.22443261e-01 2.46215071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 22 hdr offset: 686176 data offset: 887521280 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 110940160 79872 900 6 23 0 0 0 0 7031111 1 204359956 0 6186 0 0 1] real hdr: [ 1.05799981e+04 1.56554224e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.01300003e+04 9.67999858e+03 1.77555424e-01 1.99878209e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 23 hdr offset: 686688 data offset: 888160256 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 111020032 79872 900 6 24 0 0 0 0 7031111 1 204515896 0 6186 0 0 1] real hdr: [ 1.15199982e+04 1.16947874e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.10500001e+04 1.05799981e+04 1.36030234e-01 1.56554224e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 24 hdr offset: 687200 data offset: 888799232 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 111099904 79872 900 6 25 0 0 0 0 7031111 1 204671836 0 6186 0 0 1] real hdr: [ 1.24999991e+04 8.17952369e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.20100006e+04 1.15199982e+04 9.85881076e-02 1.16947874e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 25 hdr offset: 687712 data offset: 889438208 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 111179776 79872 900 6 26 0 0 0 0 7031111 1 204827776 0 6186 0 0 1] real hdr: [ 1.35200006e+04 5.18637157e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30100018e+04 1.24999991e+04 6.59807861e-02 8.17952369e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 26 hdr offset: 688224 data offset: 890077184 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 111259648 79872 900 6 27 0 0 0 0 7031111 1 204983716 0 6186 0 0 1] real hdr: [ 1.45807997e+04 2.79368177e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.40504001e+04 1.35200006e+04 3.89823900e-02 5.18637157e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 27 hdr offset: 688736 data offset: 890716160 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 111339520 79872 900 6 28 0 0 0 0 7031111 1 205139656 0 6186 0 0 1] real hdr: [ 1.56946399e+04 1.07164793e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.51377198e+04 1.45807997e+04 1.83146873e-02 2.79368177e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 28 hdr offset: 689248 data offset: 891355136 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 111419392 79872 900 6 29 0 0 0 0 7031111 1 205295596 0 6186 0 0 1] real hdr: [ 1.68753114e+04 1.30179090e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.62849737e+04 1.56946399e+04 4.87210933e-03 1.07164793e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 29 hdr offset: 689760 data offset: 891994112 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 111499264 79872 900 6 30 0 0 0 0 7031111 1 205451536 0 6186 0 0 1] real hdr: [ 1.81386262e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.75069688e+04 1.68753114e+04 0.00000000e+00 1.30179090e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 30 hdr offset: 690272 data offset: 892633088 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 111579136 79872 900 6 31 0 0 0 0 7031111 1 205607476 0 6186 0 0 1] real hdr: [ 1.95030104e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.88208202e+04 1.81386262e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 31 hdr offset: 690784 data offset: 893272064 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 111659008 79872 900 6 32 0 0 0 0 7031111 1 205763416 0 6186 0 0 1] real hdr: [ 2.09901876e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.02465990e+04 1.95030104e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 32 hdr offset: 691296 data offset: 893911040 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 111738880 79872 900 6 33 0 0 0 0 7031111 1 205919356 0 6186 0 0 1] real hdr: [ 2.26260817e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.18081366e+04 2.09901876e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 33 hdr offset: 691808 data offset: 894550016 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 111818752 79872 900 6 34 0 0 0 0 7031111 1 206075296 0 6186 0 0 1] real hdr: [ 2.44582854e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.35421836e+04 2.26260817e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 34 hdr offset: 692320 data offset: 895188992 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 111898624 79872 900 6 35 0 0 0 0 7031111 1 206231236 0 6186 0 0 1] real hdr: [ 2.65836402e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.55209609e+04 2.44582854e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 35 hdr offset: 692832 data offset: 895827968 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 111978496 79872 900 6 36 0 0 0 0 7031111 1 206387176 0 6186 0 0 1] real hdr: [ 2.92190802e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.79013583e+04 2.65836402e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 36 hdr offset: 693344 data offset: 896466944 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 112058368 79872 900 6 37 0 0 0 0 7031111 1 206543116 0 6186 0 0 1] real hdr: [ 3.29086931e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.10638886e+04 2.92190802e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 107 record 37 hdr offset: 693856 data offset: 897105920 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 112138240 79872 900 6 38 0 0 0 0 7031111 1 206699056 0 6186 0 0 1] real hdr: [ 3.92548336e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.60817633e+04 3.29086931e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 108: nz = 38, nt = 1 var 108 record 0 hdr offset: 694368 data offset: 897744896 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 112218112 79872 900 3 1 0 0 0 0 7031111 1 206854996 0 9181 0 0 1] real hdr: [ 4.99988815e+01 9.94296273e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.00003377e+01 0.00000000e+00 9.97716462e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00182846 -0.00227531 -0.00286316 ..., -0.01418971 -0.01365849 -0.01310923] ----------------------- var 108 record 1 hdr offset: 694880 data offset: 898383872 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 112297984 79872 900 3 2 0 0 0 0 7031111 1 207011396 0 9181 0 0 1] real hdr: [ 1.30000232e+02 9.85203885e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00013508e+01 4.99988815e+01 9.90881510e-01 9.94296273e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.0024151 0.00229171 0.00210077 ..., 0.00661258 0.00664433 0.00665623] ----------------------- var 108 record 2 hdr offset: 695392 data offset: 899022848 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 112377856 79872 900 3 3 0 0 0 0 7031111 1 207167796 0 9181 0 0 1] real hdr: [ 2.49998333e+02 9.71644051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.79999114e+02 1.30000232e+02 9.79542572e-01 9.85203885e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00255632 0.00273891 0.00300109 ..., 0.00779611 0.00797747 0.00818354] ----------------------- var 108 record 3 hdr offset: 695904 data offset: 899661824 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 112457728 79872 900 3 4 0 0 0 0 7031111 1 207324196 0 9181 0 0 1] real hdr: [ 4.10001035e+02 9.53709855e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.20001478e+02 2.49998333e+02 9.63777064e-01 9.71644051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.01212071 0.01210152 0.01189234 ..., -0.00683526 -0.00700168 -0.00718141] ----------------------- var 108 record 4 hdr offset: 696416 data offset: 900300800 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 112537600 79872 900 3 5 0 0 0 0 7031111 1 207480596 0 9181 0 0 1] real hdr: [ 6.10000486e+02 9.31527464e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.00000592e+02 4.10001035e+02 9.43695500e-01 9.53709855e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -4.57934570e-03 -4.58596647e-03 -4.42771707e-03 ..., 1.67429903e-06 1.60844581e-06 1.54770953e-06] ----------------------- var 108 record 5 hdr offset: 696928 data offset: 900939776 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 112617472 79872 900 3 6 0 0 0 0 7031111 1 207636996 0 9181 0 0 1] real hdr: [ 8.50000613e+02 9.05253051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.20000381e+02 6.10000486e+02 9.19438386e-01 9.31527464e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., -7.92786807e-07 -7.86481962e-07 -7.88967100e-07] ----------------------- var 108 record 6 hdr offset: 697440 data offset: 901578752 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 112697344 79872 900 3 7 0 0 0 0 7031111 1 207793396 0 9181 0 0 1] real hdr: [ 1.13000142e+03 8.75074549e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.80000846e+02 8.50000613e+02 8.91177995e-01 9.05253051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.05304750e-05 -1.49992356e-05 -9.54118514e-06 ..., 3.19569665e-07 3.83635779e-07 4.16649328e-07] ----------------------- var 108 record 7 hdr offset: 697952 data offset: 902217728 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 112777216 79872 900 3 8 0 0 0 0 7031111 1 207949796 0 9181 0 0 1] real hdr: [ 1.44999897e+03 8.41211628e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.27999806e+03 1.13000142e+03 8.59118341e-01 8.75074549e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.26528859e-04 -1.11624009e-04 -9.68979512e-05 ..., 1.26032518e-09 4.47163586e-08 1.08993135e-07] ----------------------- var 108 record 8 hdr offset: 698464 data offset: 902856704 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 112857088 79872 900 3 9 0 0 0 0 7031111 1 208106196 0 9181 0 0 1] real hdr: [ 1.81000112e+03 8.03914038e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.61999988e+03 1.44999897e+03 8.23493502e-01 8.41211628e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 6.62079742e-08 5.63970382e-08 4.07121483e-08 ..., 2.65060066e-07 1.72810743e-07 1.53298416e-07] ----------------------- var 108 record 9 hdr offset: 698976 data offset: 903495680 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 112936960 79872 900 3 10 0 0 0 0 7031111 1 208262596 0 9181 0 0 1] real hdr: [ 2.21000002e+03 7.63464495e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.99999844e+03 1.81000112e+03 7.84570542e-01 8.03914038e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.27051000e-08 -3.33895400e-08 -4.40205348e-08 ..., 4.25643520e-09 -1.10799220e-07 -1.98869671e-07] ----------------------- var 108 record 10 hdr offset: 699488 data offset: 904134656 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 113016832 79872 900 3 11 0 0 0 0 7031111 1 208418996 0 9181 0 0 1] real hdr: [ 2.64999960e+03 7.20175811e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.42000161e+03 2.21000002e+03 7.42646223e-01 7.63464495e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.14046678e-07 -1.02110960e-07 -9.17161103e-08 ..., -1.90704327e-07 -2.67657356e-07 -3.16430715e-07] ----------------------- var 108 record 11 hdr offset: 700000 data offset: 904773632 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 113096704 79872 900 3 12 0 0 0 0 7031111 1 208575396 0 9181 0 0 1] real hdr: [ 3.12999986e+03 6.74392534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.88000152e+03 2.64999960e+03 6.98050213e-01 7.20175811e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.35839281e-07 2.53642497e-07 2.72514598e-07 ..., -4.16616956e-07 -2.97308560e-07 -2.26037685e-07] ----------------------- var 108 record 12 hdr offset: 700512 data offset: 905412608 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 113176576 79872 900 3 13 0 0 0 0 7031111 1 208731796 0 9181 0 0 1] real hdr: [ 3.65000079e+03 6.26490534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.37999819e+03 3.12999986e+03 6.51142688e-01 6.74392534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.02249080e-08 2.43089051e-08 2.82282784e-08 ..., -1.56680429e-07 -8.08335372e-08 -5.88198397e-08] ----------------------- var 108 record 13 hdr offset: 701024 data offset: 906051584 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 113256448 79872 900 3 14 0 0 0 0 7031111 1 208888196 0 9181 0 0 1] real hdr: [ 4.20999847e+03 5.76877346e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.91999946e+03 3.65000079e+03 6.02314441e-01 6.26490534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.36788480e-07 -2.51288157e-07 -2.66043884e-07 ..., 5.44762202e-07 4.81827897e-07 4.11934508e-07] ----------------------- var 108 record 14 hdr offset: 701536 data offset: 906690560 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 113336320 79872 900 3 15 0 0 0 0 7031111 1 209044596 0 9181 0 0 1] real hdr: [ 4.81000075e+03 5.25990788e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.50000140e+03 4.20999847e+03 5.51988701e-01 5.76877346e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.77214599e-08 -2.45740654e-08 -3.23727853e-08 ..., -1.04826363e-07 -6.07401205e-08 -1.75021686e-08] ----------------------- var 108 record 15 hdr offset: 702048 data offset: 907329536 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 113416192 79872 900 3 16 0 0 0 0 7031111 1 209200996 0 9181 0 0 1] real hdr: [ 5.44999978e+03 4.74301366e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.12000009e+03 4.81000075e+03 5.00619965e-01 5.25990788e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 6.09259772e-08 5.00965207e-08 3.98326598e-08 ..., -3.50626379e-07 -3.07647298e-07 -2.56949647e-07] ----------------------- var 108 record 16 hdr offset: 702560 data offset: 907968512 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 113496064 79872 900 3 17 0 0 0 0 7031111 1 209357396 0 9181 0 0 1] real hdr: [ 6.12999948e+03 4.22309896e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.77999946e+03 5.44999978e+03 4.48693382e-01 4.74301366e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.23896160e-10 1.71639414e-09 2.88204660e-09 ..., -1.14324628e-07 -1.22772306e-07 -1.30826038e-07] ----------------------- var 108 record 17 hdr offset: 703072 data offset: 908607488 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 113575936 79872 900 3 18 0 0 0 0 7031111 1 209513796 0 9181 0 0 1] real hdr: [ 6.84999986e+03 3.70548863e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.47999950e+03 6.12999948e+03 3.96725773e-01 4.22309896e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -6.18168130e-08 -4.98728561e-08 -3.79873804e-08 ..., -3.72160613e-08 -4.15959143e-08 -4.48448212e-08] ----------------------- var 108 record 18 hdr offset: 703584 data offset: 909246464 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 113655808 79872 900 3 19 0 0 0 0 7031111 1 209670196 0 9181 0 0 1] real hdr: [ 7.61000092e+03 3.19582071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.22000022e+03 6.84999986e+03 3.45265283e-01 3.70548863e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -5.29169109e-09 -1.54552868e-08 -2.37794548e-08 ..., -3.25989657e-09 -5.76244696e-09 -9.54202317e-09] ----------------------- var 108 record 19 hdr offset: 704096 data offset: 909885440 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 113735680 79872 900 3 20 0 0 0 0 7031111 1 209826596 0 9181 0 0 1] real hdr: [ 8.40999873e+03 2.70004882e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00000162e+03 7.61000092e+03 2.94891378e-01 3.19582071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 5.71752253e-07 5.60456499e-07 5.50538857e-07 ..., -2.28530905e-09 -2.90175350e-09 -3.85108256e-09] ----------------------- var 108 record 20 hdr offset: 704608 data offset: 910524416 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 113815552 79872 900 3 21 0 0 0 0 7031111 1 209982996 0 9181 0 0 1] real hdr: [ 9.25000113e+03 2.22443261e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.81999976e+03 8.40999873e+03 2.46215071e-01 2.70004882e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.11584811e-07 1.42664021e-07 1.72780247e-07 ..., -8.10098044e-10 -1.23036747e-09 -1.87816807e-09] ----------------------- var 108 record 21 hdr offset: 705120 data offset: 911163392 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 113895424 79872 900 3 22 0 0 0 0 7031111 1 210139396 0 9181 0 0 1] real hdr: [ 1.01300003e+04 1.77555424e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.67999858e+03 9.25000113e+03 1.99878209e-01 2.22443261e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -6.16262753e-07 -6.38108077e-07 -6.62805519e-07 ..., 1.25666466e-09 3.96936400e-10 8.82233522e-11] ----------------------- var 108 record 22 hdr offset: 705632 data offset: 911802368 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 113975296 79872 900 3 23 0 0 0 0 7031111 1 210295796 0 9181 0 0 1] real hdr: [ 1.10500001e+04 1.36030234e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.05799981e+04 1.01300003e+04 1.56554224e-01 1.77555424e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -5.34894227e-08 -4.68236117e-08 -3.96537132e-08 ..., 7.90237120e-09 8.74523298e-09 8.12336864e-09] ----------------------- var 108 record 23 hdr offset: 706144 data offset: 912441344 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 114055168 79872 900 3 24 0 0 0 0 7031111 1 210452196 0 9181 0 0 1] real hdr: [ 1.20100006e+04 9.85881076e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.15199982e+04 1.10500001e+04 1.16947874e-01 1.36030234e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 9.75887460e-09 1.02578346e-08 1.04043991e-08 ..., 5.31260973e-11 9.90175608e-10 1.16934140e-09] ----------------------- var 108 record 24 hdr offset: 706656 data offset: 913080320 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 114135040 79872 900 3 25 0 0 0 0 7031111 1 210608596 0 9181 0 0 1] real hdr: [ 1.30100018e+04 6.59807861e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.24999991e+04 1.20100006e+04 8.17952369e-02 9.85881076e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.12609698e-07 -1.12719356e-07 -1.13058874e-07 ..., 3.25214074e-07 3.18511582e-07 3.07443685e-07] ----------------------- var 108 record 25 hdr offset: 707168 data offset: 913719296 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 114214912 79872 900 3 26 0 0 0 0 7031111 1 210764996 0 9181 0 0 1] real hdr: [ 1.40504001e+04 3.89823900e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.35200006e+04 1.30100018e+04 5.18637157e-02 6.59807861e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.92810264e-08 3.40819994e-08 2.90081896e-08 ..., -4.95909553e-08 -4.15680184e-08 -3.28268719e-08] ----------------------- var 108 record 26 hdr offset: 707680 data offset: 914358272 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 114294784 79872 900 3 27 0 0 0 0 7031111 1 210921396 0 9181 0 0 1] real hdr: [ 1.51377198e+04 1.83146873e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.45807997e+04 1.40504001e+04 2.79368177e-02 3.89823900e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.69246158e-07 2.87065546e-07 3.04528925e-07 ..., -3.26664548e-07 -3.24513678e-07 -3.15048936e-07] ----------------------- var 108 record 27 hdr offset: 708192 data offset: 914997248 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 114374656 79872 900 3 28 0 0 0 0 7031111 1 211077796 0 9181 0 0 1] real hdr: [ 1.62849737e+04 4.87210933e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.56946399e+04 1.51377198e+04 1.07164793e-02 1.83146873e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 5.97362032e-07 6.20699552e-07 6.42887528e-07 ..., 8.25977793e-08 8.44581862e-08 8.67402932e-08] ----------------------- var 108 record 28 hdr offset: 708704 data offset: 915636224 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 114454528 79872 900 3 29 0 0 0 0 7031111 1 211234196 0 9181 0 0 1] real hdr: [ 1.75069688e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.68753114e+04 1.62849737e+04 1.30179090e-03 4.87210933e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.11959457e-06 -1.15784121e-06 -1.19481672e-06 ..., 1.17520278e-08 1.12423031e-08 9.63314850e-09] ----------------------- var 108 record 29 hdr offset: 709216 data offset: 916275200 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 114534400 79872 900 3 30 0 0 0 0 7031111 1 211390596 0 9181 0 0 1] real hdr: [ 1.88208202e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81386262e+04 1.75069688e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 7.53660672e-08 8.58072369e-08 9.72045271e-08 ..., -1.54161199e-07 -1.61830272e-07 -1.69740957e-07] ----------------------- var 108 record 30 hdr offset: 709728 data offset: 916914176 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 114614272 79872 900 3 31 0 0 0 0 7031111 1 211546996 0 9181 0 0 1] real hdr: [ 2.02465990e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.95030104e+04 1.88208202e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -8.91429153e-10 -3.93553057e-09 -7.21866655e-09 ..., -1.27710464e-09 -1.05234577e-09 -7.94428245e-10] ----------------------- var 108 record 31 hdr offset: 710240 data offset: 917553152 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 114694144 79872 900 3 32 0 0 0 0 7031111 1 211703396 0 9181 0 0 1] real hdr: [ 2.18081366e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.09901876e+04 2.02465990e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -6.82483332e-08 -8.14093966e-08 -9.60958815e-08 ..., -9.30799171e-09 -9.94673410e-09 -1.09526939e-08] ----------------------- var 108 record 32 hdr offset: 710752 data offset: 918192128 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 114774016 79872 900 3 33 0 0 0 0 7031111 1 211859796 0 9181 0 0 1] real hdr: [ 2.35421836e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.26260817e+04 2.18081366e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -5.60212179e-08 -5.64447085e-08 -5.67818077e-08 ..., -1.21647170e-09 -1.19920429e-09 -1.14626653e-09] ----------------------- var 108 record 33 hdr offset: 711264 data offset: 918831104 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 114853888 79872 900 3 34 0 0 0 0 7031111 1 212016196 0 9181 0 0 1] real hdr: [ 2.55209609e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.44582854e+04 2.35421836e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.45611878e-09 -1.50316382e-09 -1.56681190e-09 ..., 1.75401027e-10 1.43806744e-10 1.09384501e-10] ----------------------- var 108 record 34 hdr offset: 711776 data offset: 919470080 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 114933760 79872 900 3 35 0 0 0 0 7031111 1 212172596 0 9181 0 0 1] real hdr: [ 2.79013583e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.65836402e+04 2.55209609e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.56418424e-08 2.69423648e-08 2.82425727e-08 ..., 6.19306662e-10 6.14602869e-10 6.06522832e-10] ----------------------- var 108 record 35 hdr offset: 712288 data offset: 920109056 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 115013632 79872 900 3 36 0 0 0 0 7031111 1 212328996 0 9181 0 0 1] real hdr: [ 3.10638886e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.92190802e+04 2.79013583e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.35561729e-09 -1.92396388e-09 -2.56587640e-09 ..., -4.09954737e-10 -3.83539117e-10 -3.57118779e-10] ----------------------- var 108 record 36 hdr offset: 712800 data offset: 920748032 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 115093504 79872 900 3 37 0 0 0 0 7031111 1 212485396 0 9181 0 0 1] real hdr: [ 3.60817633e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.29086931e+04 3.10638886e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -4.80665534e-08 -5.04063884e-08 -5.28261772e-08 ..., -8.53463689e-10 -8.47572068e-10 -8.37779623e-10] ----------------------- var 108 record 37 hdr offset: 713312 data offset: 921387008 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 115173376 79872 900 3 38 0 0 0 0 7031111 1 212641796 0 9181 0 0 1] real hdr: [ 4.24279038e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.92548336e+04 3.60817633e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 109: nz = 38, nt = 1 var 109 record 0 hdr offset: 713824 data offset: 922025984 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 115253248 79872 900 0 1 0 0 0 0 7031111 1 212798196 0 10185 0 0 1] real hdr: [ 2.00003377e+01 9.97716462e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.99820611e+00 0.00000000e+00 9.98858129e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 1 hdr offset: 714336 data offset: 922664960 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 115333120 79872 900 0 2 0 0 0 0 7031111 1 212954596 0 10185 0 0 1] real hdr: [ 8.00013508e+01 9.90881510e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.99988815e+01 2.00003377e+01 9.94296273e-01 9.97716462e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 2 hdr offset: 714848 data offset: 923303936 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 115412992 79872 900 0 3 0 0 0 0 7031111 1 213110996 0 10185 0 0 1] real hdr: [ 1.79999114e+02 9.79542572e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30000232e+02 8.00013508e+01 9.85203885e-01 9.90881510e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 3 hdr offset: 715360 data offset: 923942912 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 115492864 79872 900 0 4 0 0 0 0 7031111 1 213267396 0 10185 0 0 1] real hdr: [ 3.20001478e+02 9.63777064e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.49998333e+02 1.79999114e+02 9.71644051e-01 9.79542572e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 4 hdr offset: 715872 data offset: 924581888 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 115572736 79872 900 0 5 0 0 0 0 7031111 1 213423796 0 10185 0 0 1] real hdr: [ 5.00000592e+02 9.43695500e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.10001035e+02 3.20001478e+02 9.53709855e-01 9.63777064e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 5 hdr offset: 716384 data offset: 925220864 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 115652608 79872 900 0 6 0 0 0 0 7031111 1 213580196 0 10185 0 0 1] real hdr: [ 7.20000381e+02 9.19438386e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.10000486e+02 5.00000592e+02 9.31527464e-01 9.43695500e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 6 hdr offset: 716896 data offset: 925859840 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 115732480 79872 900 0 7 0 0 0 0 7031111 1 213736596 0 10185 0 0 1] real hdr: [ 9.80000846e+02 8.91177995e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.50000613e+02 7.20000381e+02 9.05253051e-01 9.19438386e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 7 hdr offset: 717408 data offset: 926498816 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 115812352 79872 900 0 8 0 0 0 0 7031111 1 213892996 0 10185 0 0 1] real hdr: [ 1.27999806e+03 8.59118341e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.13000142e+03 9.80000846e+02 8.75074549e-01 8.91177995e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 8 hdr offset: 717920 data offset: 927137792 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 115892224 79872 900 0 9 0 0 0 0 7031111 1 214049396 0 10185 0 0 1] real hdr: [ 1.61999988e+03 8.23493502e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.44999897e+03 1.27999806e+03 8.41211628e-01 8.59118341e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 9 hdr offset: 718432 data offset: 927776768 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 115972096 79872 900 0 10 0 0 0 0 7031111 1 214205796 0 10185 0 0 1] real hdr: [ 1.99999844e+03 7.84570542e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81000112e+03 1.61999988e+03 8.03914038e-01 8.23493502e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 10 hdr offset: 718944 data offset: 928415744 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 116051968 79872 900 0 11 0 0 0 0 7031111 1 214362196 0 10185 0 0 1] real hdr: [ 2.42000161e+03 7.42646223e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.21000002e+03 1.99999844e+03 7.63464495e-01 7.84570542e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 11 hdr offset: 719456 data offset: 929054720 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 116131840 79872 900 0 12 0 0 0 0 7031111 1 214518596 0 10185 0 0 1] real hdr: [ 2.88000152e+03 6.98050213e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.64999960e+03 2.42000161e+03 7.20175811e-01 7.42646223e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 12 hdr offset: 719968 data offset: 929693696 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 116211712 79872 900 0 13 0 0 0 0 7031111 1 214674996 0 10185 0 0 1] real hdr: [ 3.37999819e+03 6.51142688e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.12999986e+03 2.88000152e+03 6.74392534e-01 6.98050213e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 13 hdr offset: 720480 data offset: 930332672 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 116291584 79872 900 0 14 0 0 0 0 7031111 1 214831396 0 10185 0 0 1] real hdr: [ 3.91999946e+03 6.02314441e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.65000079e+03 3.37999819e+03 6.26490534e-01 6.51142688e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 14 hdr offset: 720992 data offset: 930971648 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 116371456 79872 900 0 15 0 0 0 0 7031111 1 214987796 0 10185 0 0 1] real hdr: [ 4.50000140e+03 5.51988701e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.20999847e+03 3.91999946e+03 5.76877346e-01 6.02314441e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 15 hdr offset: 721504 data offset: 931610624 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 116451328 79872 900 0 16 0 0 0 0 7031111 1 215144196 0 10185 0 0 1] real hdr: [ 5.12000009e+03 5.00619965e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.81000075e+03 4.50000140e+03 5.25990788e-01 5.51988701e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 16 hdr offset: 722016 data offset: 932249600 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 116531200 79872 900 0 17 0 0 0 0 7031111 1 215300596 0 10185 0 0 1] real hdr: [ 5.77999946e+03 4.48693382e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.44999978e+03 5.12000009e+03 4.74301366e-01 5.00619965e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 17 hdr offset: 722528 data offset: 932888576 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 116611072 79872 900 0 18 0 0 0 0 7031111 1 215456996 0 10185 0 0 1] real hdr: [ 6.47999950e+03 3.96725773e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.12999948e+03 5.77999946e+03 4.22309896e-01 4.48693382e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 18 hdr offset: 723040 data offset: 933527552 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 116690944 79872 900 0 19 0 0 0 0 7031111 1 215613396 0 10185 0 0 1] real hdr: [ 7.22000022e+03 3.45265283e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.84999986e+03 6.47999950e+03 3.70548863e-01 3.96725773e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 19 hdr offset: 723552 data offset: 934166528 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 116770816 79872 900 0 20 0 0 0 0 7031111 1 215769796 0 10185 0 0 1] real hdr: [ 8.00000162e+03 2.94891378e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.61000092e+03 7.22000022e+03 3.19582071e-01 3.45265283e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 20 hdr offset: 724064 data offset: 934805504 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 116850688 79872 900 0 21 0 0 0 0 7031111 1 215926196 0 10185 0 0 1] real hdr: [ 8.81999976e+03 2.46215071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.40999873e+03 8.00000162e+03 2.70004882e-01 2.94891378e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 21 hdr offset: 724576 data offset: 935444480 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 116930560 79872 900 0 22 0 0 0 0 7031111 1 216082596 0 10185 0 0 1] real hdr: [ 9.67999858e+03 1.99878209e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.25000113e+03 8.81999976e+03 2.22443261e-01 2.46215071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 22 hdr offset: 725088 data offset: 936083456 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 117010432 79872 900 0 23 0 0 0 0 7031111 1 216238996 0 10185 0 0 1] real hdr: [ 1.05799981e+04 1.56554224e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.01300003e+04 9.67999858e+03 1.77555424e-01 1.99878209e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 23 hdr offset: 725600 data offset: 936722432 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 117090304 79872 900 0 24 0 0 0 0 7031111 1 216395396 0 10185 0 0 1] real hdr: [ 1.15199982e+04 1.16947874e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.10500001e+04 1.05799981e+04 1.36030234e-01 1.56554224e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 24 hdr offset: 726112 data offset: 937361408 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 117170176 79872 900 0 25 0 0 0 0 7031111 1 216551796 0 10185 0 0 1] real hdr: [ 1.24999991e+04 8.17952369e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.20100006e+04 1.15199982e+04 9.85881076e-02 1.16947874e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 25 hdr offset: 726624 data offset: 938000384 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 117250048 79872 900 0 26 0 0 0 0 7031111 1 216708196 0 10185 0 0 1] real hdr: [ 1.35200006e+04 5.18637157e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30100018e+04 1.24999991e+04 6.59807861e-02 8.17952369e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 26 hdr offset: 727136 data offset: 938639360 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 117329920 79872 900 0 27 0 0 0 0 7031111 1 216864596 0 10185 0 0 1] real hdr: [ 1.45807997e+04 2.79368177e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.40504001e+04 1.35200006e+04 3.89823900e-02 5.18637157e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 27 hdr offset: 727648 data offset: 939278336 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 117409792 79872 900 0 28 0 0 0 0 7031111 1 217020996 0 10185 0 0 1] real hdr: [ 1.56946399e+04 1.07164793e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.51377198e+04 1.45807997e+04 1.83146873e-02 2.79368177e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 28 hdr offset: 728160 data offset: 939917312 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 117489664 79872 900 0 29 0 0 0 0 7031111 1 217177396 0 10185 0 0 1] real hdr: [ 1.68753114e+04 1.30179090e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.62849737e+04 1.56946399e+04 4.87210933e-03 1.07164793e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 29 hdr offset: 728672 data offset: 940556288 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 117569536 79872 900 0 30 0 0 0 0 7031111 1 217333796 0 10185 0 0 1] real hdr: [ 1.81386262e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.75069688e+04 1.68753114e+04 0.00000000e+00 1.30179090e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 30 hdr offset: 729184 data offset: 941195264 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 117649408 79872 900 0 31 0 0 0 0 7031111 1 217490196 0 10185 0 0 1] real hdr: [ 1.95030104e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.88208202e+04 1.81386262e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 31 hdr offset: 729696 data offset: 941834240 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 117729280 79872 900 0 32 0 0 0 0 7031111 1 217646596 0 10185 0 0 1] real hdr: [ 2.09901876e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.02465990e+04 1.95030104e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 32 hdr offset: 730208 data offset: 942473216 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 117809152 79872 900 0 33 0 0 0 0 7031111 1 217802996 0 10185 0 0 1] real hdr: [ 2.26260817e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.18081366e+04 2.09901876e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 33 hdr offset: 730720 data offset: 943112192 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 117889024 79872 900 0 34 0 0 0 0 7031111 1 217959396 0 10185 0 0 1] real hdr: [ 2.44582854e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.35421836e+04 2.26260817e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 34 hdr offset: 731232 data offset: 943751168 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 117968896 79872 900 0 35 0 0 0 0 7031111 1 218115796 0 10185 0 0 1] real hdr: [ 2.65836402e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.55209609e+04 2.44582854e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 35 hdr offset: 731744 data offset: 944390144 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 118048768 79872 900 0 36 0 0 0 0 7031111 1 218272196 0 10185 0 0 1] real hdr: [ 2.92190802e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.79013583e+04 2.65836402e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 36 hdr offset: 732256 data offset: 945029120 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 118128640 79872 900 0 37 0 0 0 0 7031111 1 218428596 0 10185 0 0 1] real hdr: [ 3.29086931e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.10638886e+04 2.92190802e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 109 record 37 hdr offset: 732768 data offset: 945668096 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 118208512 79872 900 0 38 0 0 0 0 7031111 1 218584996 0 10185 0 0 1] real hdr: [ 3.92548336e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.60817633e+04 3.29086931e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- =============================== var 110: nz = 38, nt = 1 var 110 record 0 hdr offset: 733280 data offset: 946307072 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 118288384 79872 900 0 1 0 0 0 0 7031111 1 218741396 0 10186 0 0 1] real hdr: [ 2.00003377e+01 9.97716462e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.99820611e+00 0.00000000e+00 9.98858129e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -8.36915319e-08 -1.65153807e-07 -2.39662683e-07 ..., -3.31638688e-07 -3.92469587e-07 -4.41360783e-07] ----------------------- var 110 record 1 hdr offset: 733792 data offset: 946946048 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 118368256 79872 900 0 2 0 0 0 0 7031111 1 218897336 0 10186 0 0 1] real hdr: [ 8.00013508e+01 9.90881510e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.99988815e+01 2.00003377e+01 9.94296273e-01 9.97716462e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 2.62724001e-07 2.11101849e-07 1.64497294e-07 ..., -8.14698069e-08 -8.81172610e-08 -8.90620697e-08] ----------------------- var 110 record 2 hdr offset: 734304 data offset: 947585024 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 118448128 79872 900 0 3 0 0 0 0 7031111 1 219053276 0 10186 0 0 1] real hdr: [ 1.79999114e+02 9.79542572e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30000232e+02 8.00013508e+01 9.85203885e-01 9.90881510e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 5.69202939e-07 5.57593353e-07 5.63520416e-07 ..., 2.41555057e-07 2.85336313e-07 3.28615755e-07] ----------------------- var 110 record 3 hdr offset: 734816 data offset: 948224000 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 118528000 79872 900 0 4 0 0 0 0 7031111 1 219209216 0 10186 0 0 1] real hdr: [ 3.20001478e+02 9.63777064e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.49998333e+02 1.79999114e+02 9.71644051e-01 9.79542572e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 8.86780242e-07 8.45844852e-07 8.66270966e-07 ..., 8.58593054e-08 9.73888206e-08 1.17992052e-07] ----------------------- var 110 record 4 hdr offset: 735328 data offset: 948862976 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 118607872 79872 900 0 5 0 0 0 0 7031111 1 219365156 0 10186 0 0 1] real hdr: [ 5.00000592e+02 9.43695500e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.10001035e+02 3.20001478e+02 9.53709855e-01 9.63777064e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 4.93830498e-07 3.68818149e-07 3.78812274e-07 ..., -7.90571590e-08 -8.93431036e-08 -6.44842757e-08] ----------------------- var 110 record 5 hdr offset: 735840 data offset: 949501952 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 118687744 79872 900 0 6 0 0 0 0 7031111 1 219521096 0 10186 0 0 1] real hdr: [ 7.20000381e+02 9.19438386e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.10000486e+02 5.00000592e+02 9.31527464e-01 9.43695500e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -6.78723140e-08 -1.64695905e-07 -1.61893581e-07 ..., -1.93117664e-08 -2.18874181e-08 7.23347944e-12] ----------------------- var 110 record 6 hdr offset: 736352 data offset: 950140928 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 118767616 79872 900 0 7 0 0 0 0 7031111 1 219677036 0 10186 0 0 1] real hdr: [ 9.80000846e+02 8.91177995e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.50000613e+02 7.20000381e+02 9.05253051e-01 9.19438386e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 5.49131123e-08 -4.70460504e-10 8.18144996e-10 ..., -6.57880506e-09 -8.10077250e-09 -1.66188612e-12] ----------------------- var 110 record 7 hdr offset: 736864 data offset: 950779904 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 118847488 79872 900 0 8 0 0 0 0 7031111 1 219832976 0 10186 0 0 1] real hdr: [ 1.27999806e+03 8.59118341e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.13000142e+03 9.80000846e+02 8.75074549e-01 8.91177995e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 2.75133551e-08 -5.63771074e-09 -3.61184549e-09 ..., -1.03819069e-08 -1.12708323e-08 6.78192366e-13] ----------------------- var 110 record 8 hdr offset: 737376 data offset: 951418880 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 118927360 79872 900 0 9 0 0 0 0 7031111 1 219988916 0 10186 0 0 1] real hdr: [ 1.61999988e+03 8.23493502e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.44999897e+03 1.27999806e+03 8.41211628e-01 8.59118341e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 7.37931094e-09 5.00152737e-08 6.05493753e-08 ..., -1.22918840e-08 -1.28304416e-08 6.49862868e-13] ----------------------- var 110 record 9 hdr offset: 737888 data offset: 952057856 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 119007232 79872 900 0 10 0 0 0 0 7031111 1 220144856 0 10186 0 0 1] real hdr: [ 1.99999844e+03 7.84570542e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81000112e+03 1.61999988e+03 8.03914038e-01 8.23493502e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 5.87699702e-08 1.75780158e-07 1.72177053e-07 ..., -2.18739356e-08 -2.26418457e-08 8.88005544e-13] ----------------------- var 110 record 10 hdr offset: 738400 data offset: 952696832 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 119087104 79872 900 0 11 0 0 0 0 7031111 1 220300796 0 10186 0 0 1] real hdr: [ 2.42000161e+03 7.42646223e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.21000002e+03 1.99999844e+03 7.63464495e-01 7.84570542e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -3.39749846e-08 -2.09979746e-07 -1.96534060e-07 ..., -3.65468154e-08 -3.74396656e-08 -6.35284100e-12] ----------------------- var 110 record 11 hdr offset: 738912 data offset: 953335808 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 119166976 79872 900 0 12 0 0 0 0 7031111 1 220456736 0 10186 0 0 1] real hdr: [ 2.88000152e+03 6.98050213e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.64999960e+03 2.42000161e+03 7.20175811e-01 7.42646223e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -9.41012712e-10 -1.51541215e-07 -1.45560549e-07 ..., -6.41124487e-08 -6.65693349e-08 -1.21068901e-11] ----------------------- var 110 record 12 hdr offset: 739424 data offset: 953974784 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 119246848 79872 900 0 13 0 0 0 0 7031111 1 220612676 0 10186 0 0 1] real hdr: [ 3.37999819e+03 6.51142688e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.12999986e+03 2.88000152e+03 6.74392534e-01 6.98050213e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.23727261e-11 -1.51723910e-07 -1.45523416e-07 ..., -1.05436506e-07 -1.09690767e-07 -6.66481323e-12] ----------------------- var 110 record 13 hdr offset: 739936 data offset: 954613760 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 119326720 79872 900 0 14 0 0 0 0 7031111 1 220768616 0 10186 0 0 1] real hdr: [ 3.91999946e+03 6.02314441e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.65000079e+03 3.37999819e+03 6.26490534e-01 6.51142688e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -7.51888482e-12 -1.61112212e-07 -1.53669433e-07 ..., -1.47542693e-07 -1.49179627e-07 1.50678636e-11] ----------------------- var 110 record 14 hdr offset: 740448 data offset: 955252736 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 119406592 79872 900 0 15 0 0 0 0 7031111 1 220924556 0 10186 0 0 1] real hdr: [ 4.50000140e+03 5.51988701e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.20999847e+03 3.91999946e+03 5.76877346e-01 6.02314441e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.32676040e-11 -2.14017774e-07 -2.04004593e-07 ..., -1.72354291e-07 -1.68730921e-07 2.29027856e-11] ----------------------- var 110 record 15 hdr offset: 740960 data offset: 955891712 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 119486464 79872 900 0 16 0 0 0 0 7031111 1 221080496 0 10186 0 0 1] real hdr: [ 5.12000009e+03 5.00619965e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.81000075e+03 4.50000140e+03 5.25990788e-01 5.51988701e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.56853361e-12 -2.07993949e-07 -2.00549877e-07 ..., -1.94518492e-07 -1.92019641e-07 -1.49665193e-11] ----------------------- var 110 record 16 hdr offset: 741472 data offset: 956530688 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 119566336 79872 900 0 17 0 0 0 0 7031111 1 221236436 0 10186 0 0 1] real hdr: [ 5.77999946e+03 4.48693382e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.44999978e+03 5.12000009e+03 4.74301366e-01 5.00619965e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.76974277e-12 -1.31528381e-07 -1.27932452e-07 ..., -2.28167451e-07 -2.26021740e-07 -2.45308045e-11] ----------------------- var 110 record 17 hdr offset: 741984 data offset: 957169664 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 119646208 79872 900 0 18 0 0 0 0 7031111 1 221392376 0 10186 0 0 1] real hdr: [ 6.47999950e+03 3.96725773e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.12999948e+03 5.77999946e+03 4.22309896e-01 4.48693382e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -9.69708797e-13 -4.66500616e-08 -4.38084626e-08 ..., -2.02377109e-07 -1.97342231e-07 -8.94262442e-12] ----------------------- var 110 record 18 hdr offset: 742496 data offset: 957808640 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 119726080 79872 900 0 19 0 0 0 0 7031111 1 221548316 0 10186 0 0 1] real hdr: [ 7.22000022e+03 3.45265283e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.84999986e+03 6.47999950e+03 3.70548863e-01 3.96725773e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.68430775e-12 -2.69458607e-08 -2.31560282e-08 ..., -1.90987862e-07 -1.95846781e-07 -2.93937769e-12] ----------------------- var 110 record 19 hdr offset: 743008 data offset: 958447616 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 119805952 79872 900 0 20 0 0 0 0 7031111 1 221704256 0 10186 0 0 1] real hdr: [ 8.00000162e+03 2.94891378e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.61000092e+03 7.22000022e+03 3.19582071e-01 3.45265283e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 7.39735356e-12 -5.29734372e-08 -5.20180699e-08 ..., -2.20458816e-07 -2.31308519e-07 -9.54524220e-13] ----------------------- var 110 record 20 hdr offset: 743520 data offset: 959086592 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 119885824 79872 900 0 21 0 0 0 0 7031111 1 221860196 0 10186 0 0 1] real hdr: [ 8.81999976e+03 2.46215071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.40999873e+03 8.00000162e+03 2.70004882e-01 2.94891378e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -2.80266713e-11 -8.64361382e-08 -8.80628761e-08 ..., -2.35161195e-07 -2.52609027e-07 -4.87233084e-13] ----------------------- var 110 record 21 hdr offset: 744032 data offset: 959725568 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 119965696 79872 900 0 22 0 0 0 0 7031111 1 222016136 0 10186 0 0 1] real hdr: [ 9.67999858e+03 1.99878209e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.25000113e+03 8.81999976e+03 2.22443261e-01 2.46215071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -8.10563769e-11 -1.10235973e-07 -1.10694941e-07 ..., -2.32668626e-07 -2.46086671e-07 -1.76379744e-13] ----------------------- var 110 record 22 hdr offset: 744544 data offset: 960364544 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 120045568 79872 900 0 23 0 0 0 0 7031111 1 222172076 0 10186 0 0 1] real hdr: [ 1.05799981e+04 1.56554224e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.01300003e+04 9.67999858e+03 1.77555424e-01 1.99878209e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.13818148e-11 -7.22800451e-08 -7.40159720e-08 ..., -2.32520904e-07 -2.33458351e-07 6.81041595e-13] ----------------------- var 110 record 23 hdr offset: 745056 data offset: 961003520 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 120125440 79872 900 0 24 0 0 0 0 7031111 1 222328016 0 10186 0 0 1] real hdr: [ 1.15199982e+04 1.16947874e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.10500001e+04 1.05799981e+04 1.36030234e-01 1.56554224e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 5.23233204e-13 -6.44146709e-08 -6.53549606e-08 ..., -3.14884886e-07 -3.09452105e-07 1.09563639e-12] ----------------------- var 110 record 24 hdr offset: 745568 data offset: 961642496 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 120205312 79872 900 0 25 0 0 0 0 7031111 1 222483956 0 10186 0 0 1] real hdr: [ 1.24999991e+04 8.17952369e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.20100006e+04 1.15199982e+04 9.85881076e-02 1.16947874e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.10934927e-12 -5.19278522e-08 -5.00448785e-08 ..., -3.39959286e-07 -3.37980595e-07 5.74638982e-11] ----------------------- var 110 record 25 hdr offset: 746080 data offset: 962281472 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 120285184 79872 900 0 26 0 0 0 0 7031111 1 222639896 0 10186 0 0 1] real hdr: [ 1.35200006e+04 5.18637157e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30100018e+04 1.24999991e+04 6.59807861e-02 8.17952369e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.76042113e-12 -2.18873115e-08 -2.10413358e-08 ..., -2.72633514e-07 -2.76101531e-07 6.02529693e-11] ----------------------- var 110 record 26 hdr offset: 746592 data offset: 962920448 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 120365056 79872 900 0 27 0 0 0 0 7031111 1 222795836 0 10186 0 0 1] real hdr: [ 1.45807997e+04 2.79368177e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.40504001e+04 1.35200006e+04 3.89823900e-02 5.18637157e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.27416491e-12 1.20239418e-09 1.56750890e-09 ..., -1.31672664e-07 -1.35309961e-07 -9.08998155e-11] ----------------------- var 110 record 27 hdr offset: 747104 data offset: 963559424 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 120444928 79872 900 0 28 0 0 0 0 7031111 1 222951776 0 10186 0 0 1] real hdr: [ 1.56946399e+04 1.07164793e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.51377198e+04 1.45807997e+04 1.83146873e-02 2.79368177e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -4.08743508e-14 -3.05403813e-10 -7.47728213e-10 ..., 6.86584158e-08 6.78615919e-08 -7.50694090e-11] ----------------------- var 110 record 28 hdr offset: 747616 data offset: 964198400 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 120524800 79872 900 0 29 0 0 0 0 7031111 1 223107716 0 10186 0 0 1] real hdr: [ 1.68753114e+04 1.30179090e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.62849737e+04 1.56946399e+04 4.87210933e-03 1.07164793e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -7.80979188e-12 1.63656679e-08 1.82519901e-08 ..., 1.68551026e-07 1.70965265e-07 2.48254976e-11] ----------------------- var 110 record 29 hdr offset: 748128 data offset: 964837376 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 120604672 79872 900 0 30 0 0 0 0 7031111 1 223263656 0 10186 0 0 1] real hdr: [ 1.81386262e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.75069688e+04 1.68753114e+04 0.00000000e+00 1.30179090e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -2.24085962e-12 2.25447216e-09 -2.66984945e-09 ..., 7.43565280e-08 7.43204964e-08 -2.38782726e-11] ----------------------- var 110 record 30 hdr offset: 748640 data offset: 965476352 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 120684544 79872 900 0 31 0 0 0 0 7031111 1 223419596 0 10186 0 0 1] real hdr: [ 1.95030104e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.88208202e+04 1.81386262e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.18997672e-12 -1.01325215e-09 -8.12193812e-10 ..., -2.85109469e-09 -1.92650851e-09 9.95725963e-13] ----------------------- var 110 record 31 hdr offset: 749152 data offset: 966115328 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 120764416 79872 900 0 32 0 0 0 0 7031111 1 223575536 0 10186 0 0 1] real hdr: [ 2.09901876e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.02465990e+04 1.95030104e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -9.40489115e-13 -3.20054339e-09 -2.00950856e-09 ..., 4.72402135e-08 4.32302905e-08 1.05398448e-12] ----------------------- var 110 record 32 hdr offset: 749664 data offset: 966754304 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 120844288 79872 900 0 33 0 0 0 0 7031111 1 223731476 0 10186 0 0 1] real hdr: [ 2.26260817e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.18081366e+04 2.09901876e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -3.47019895e-12 -1.96662935e-08 -1.31796503e-08 ..., 2.47845009e-07 2.42452160e-07 2.21746666e-12] ----------------------- var 110 record 33 hdr offset: 750176 data offset: 967393280 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 120924160 79872 900 0 34 0 0 0 0 7031111 1 223887416 0 10186 0 0 1] real hdr: [ 2.44582854e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.35421836e+04 2.26260817e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -4.52810668e-13 -2.09034461e-08 -1.91197707e-08 ..., 3.27452426e-07 3.19039401e-07 1.42353428e-13] ----------------------- var 110 record 34 hdr offset: 750688 data offset: 968032256 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 121004032 79872 900 0 35 0 0 0 0 7031111 1 224043356 0 10186 0 0 1] real hdr: [ 2.65836402e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.55209609e+04 2.44582854e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -2.04831746e-12 1.96360219e-07 2.06692519e-07 ..., 6.81051802e-07 6.61892500e-07 -1.89391038e-13] ----------------------- var 110 record 35 hdr offset: 751200 data offset: 968671232 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 121083904 79872 900 0 36 0 0 0 0 7031111 1 224199296 0 10186 0 0 1] real hdr: [ 2.92190802e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.79013583e+04 2.65836402e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -4.00356262e-13 -2.41456746e-07 -2.27810119e-07 ..., 9.78633466e-07 9.18064700e-07 -4.58733156e-14] ----------------------- var 110 record 36 hdr offset: 751712 data offset: 969310208 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 121163776 79872 900 0 37 0 0 0 0 7031111 1 224355236 0 10186 0 0 1] real hdr: [ 3.29086931e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.10638886e+04 2.92190802e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.23951836e-12 -1.20910997e-07 -1.42752071e-07 ..., 9.66956691e-07 9.44728640e-07 2.77064829e-13] ----------------------- var 110 record 37 hdr offset: 752224 data offset: 969949184 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 121243648 79872 900 0 38 0 0 0 0 7031111 1 224511176 0 10186 0 0 1] real hdr: [ 3.92548336e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.60817633e+04 3.29086931e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.96251457e-12 4.75139672e-07 3.85643375e-07 ..., 1.68189570e-06 1.58556611e-06 1.16715082e-13] ----------------------- =============================== var 111: nz = 38, nt = 1 var 111 record 0 hdr offset: 752736 data offset: 970588160 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 121323520 79872 900 3 1 0 0 0 0 7031111 1 224667116 0 12181 0 0 1] real hdr: [ 4.99988815e+01 9.94296273e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.00003377e+01 0.00000000e+00 9.97716462e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 111 record 1 hdr offset: 753248 data offset: 971227136 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 121403392 79872 900 3 2 0 0 0 0 7031111 1 224823516 0 12181 0 0 1] real hdr: [ 1.30000232e+02 9.85203885e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00013508e+01 4.99988815e+01 9.90881510e-01 9.94296273e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 111 record 2 hdr offset: 753760 data offset: 971866112 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 121483264 79872 900 3 3 0 0 0 0 7031111 1 224979916 0 12181 0 0 1] real hdr: [ 2.49998333e+02 9.71644051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.79999114e+02 1.30000232e+02 9.79542572e-01 9.85203885e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 111 record 3 hdr offset: 754272 data offset: 972505088 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 121563136 79872 900 3 4 0 0 0 0 7031111 1 225136316 0 12181 0 0 1] real hdr: [ 4.10001035e+02 9.53709855e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.20001478e+02 2.49998333e+02 9.63777064e-01 9.71644051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., 0.00000000e+00 -4.70482553e-14 -7.76285096e-14] ----------------------- var 111 record 4 hdr offset: 754784 data offset: 973144064 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 121643008 79872 900 3 5 0 0 0 0 7031111 1 225292716 0 12181 0 0 1] real hdr: [ 6.10000486e+02 9.31527464e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.00000592e+02 4.10001035e+02 9.43695500e-01 9.53709855e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 111 record 5 hdr offset: 755296 data offset: 973783040 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 121722880 79872 900 3 6 0 0 0 0 7031111 1 225449116 0 12181 0 0 1] real hdr: [ 8.50000613e+02 9.05253051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.20000381e+02 6.10000486e+02 9.19438386e-01 9.31527464e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 111 record 6 hdr offset: 755808 data offset: 974422016 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 121802752 79872 900 3 7 0 0 0 0 7031111 1 225605516 0 12181 0 0 1] real hdr: [ 1.13000142e+03 8.75074549e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.80000846e+02 8.50000613e+02 8.91177995e-01 9.05253051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 111 record 7 hdr offset: 756320 data offset: 975060992 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 121882624 79872 900 3 8 0 0 0 0 7031111 1 225761916 0 12181 0 0 1] real hdr: [ 1.44999897e+03 8.41211628e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.27999806e+03 1.13000142e+03 8.59118341e-01 8.75074549e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 111 record 8 hdr offset: 756832 data offset: 975699968 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 121962496 79872 900 3 9 0 0 0 0 7031111 1 225918316 0 12181 0 0 1] real hdr: [ 1.81000112e+03 8.03914038e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.61999988e+03 1.44999897e+03 8.23493502e-01 8.41211628e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 111 record 9 hdr offset: 757344 data offset: 976338944 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 122042368 79872 900 3 10 0 0 0 0 7031111 1 226074716 0 12181 0 0 1] real hdr: [ 2.21000002e+03 7.63464495e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.99999844e+03 1.81000112e+03 7.84570542e-01 8.03914038e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 111 record 10 hdr offset: 757856 data offset: 976977920 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 122122240 79872 900 3 11 0 0 0 0 7031111 1 226231116 0 12181 0 0 1] real hdr: [ 2.64999960e+03 7.20175811e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.42000161e+03 2.21000002e+03 7.42646223e-01 7.63464495e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., -1.05382791e-13 -1.05379410e-13 -1.05376015e-13] ----------------------- var 111 record 11 hdr offset: 758368 data offset: 977616896 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 122202112 79872 900 3 12 0 0 0 0 7031111 1 226387516 0 12181 0 0 1] real hdr: [ 3.12999986e+03 6.74392534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.88000152e+03 2.64999960e+03 6.98050213e-01 7.20175811e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 111 record 12 hdr offset: 758880 data offset: 978255872 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 122281984 79872 900 3 13 0 0 0 0 7031111 1 226543916 0 12181 0 0 1] real hdr: [ 3.65000079e+03 6.26490534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.37999819e+03 3.12999986e+03 6.51142688e-01 6.74392534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., -5.09909159e-14 -5.52385659e-14 -1.01975794e-13] ----------------------- var 111 record 13 hdr offset: 759392 data offset: 978894848 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 122361856 79872 900 3 14 0 0 0 0 7031111 1 226700316 0 12181 0 0 1] real hdr: [ 4.20999847e+03 5.76877346e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.91999946e+03 3.65000079e+03 6.02314441e-01 6.26490534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., 0.00000000e+00 0.00000000e+00 5.00382139e-14] ----------------------- var 111 record 14 hdr offset: 759904 data offset: 979533824 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 122441728 79872 900 3 15 0 0 0 0 7031111 1 226856716 0 12181 0 0 1] real hdr: [ 4.81000075e+03 5.25990788e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.50000140e+03 4.20999847e+03 5.51988701e-01 5.76877346e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., 9.80562812e-14 9.80541332e-14 9.80519715e-14] ----------------------- var 111 record 15 hdr offset: 760416 data offset: 980172800 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 122521600 79872 900 3 16 0 0 0 0 7031111 1 227013116 0 12181 0 0 1] real hdr: [ 5.44999978e+03 4.74301366e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.12000009e+03 4.81000075e+03 5.00619965e-01 5.25990788e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 111 record 16 hdr offset: 760928 data offset: 980811776 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 122601472 79872 900 3 17 0 0 0 0 7031111 1 227169516 0 12181 0 0 1] real hdr: [ 6.12999948e+03 4.22309896e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.77999946e+03 5.44999978e+03 4.48693382e-01 4.74301366e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 111 record 17 hdr offset: 761440 data offset: 981450752 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 122681344 79872 900 3 18 0 0 0 0 7031111 1 227325916 0 12181 0 0 1] real hdr: [ 6.84999986e+03 3.70548863e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.47999950e+03 6.12999948e+03 3.96725773e-01 4.22309896e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., 2.65583822e-12 2.62539990e-12 2.59876430e-12] ----------------------- var 111 record 18 hdr offset: 761952 data offset: 982089728 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 122761216 79872 900 3 19 0 0 0 0 7031111 1 227482316 0 12181 0 0 1] real hdr: [ 7.61000092e+03 3.19582071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.22000022e+03 6.84999986e+03 3.45265283e-01 3.70548863e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., 2.32039691e-12 2.21869701e-12 2.21129191e-12] ----------------------- var 111 record 19 hdr offset: 762464 data offset: 982728704 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 122841088 79872 900 3 20 0 0 0 0 7031111 1 227638716 0 12181 0 0 1] real hdr: [ 8.40999873e+03 2.70004882e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00000162e+03 7.61000092e+03 2.94891378e-01 3.19582071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., 1.85173946e-12 1.81943826e-12 1.80866877e-12] ----------------------- var 111 record 20 hdr offset: 762976 data offset: 983367680 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 122920960 79872 900 3 21 0 0 0 0 7031111 1 227795116 0 12181 0 0 1] real hdr: [ 9.25000113e+03 2.22443261e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.81999976e+03 8.40999873e+03 2.46215071e-01 2.70004882e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., 1.96312324e-12 1.94748666e-12 1.94053649e-12] ----------------------- var 111 record 21 hdr offset: 763488 data offset: 984006656 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 123000832 79872 900 3 22 0 0 0 0 7031111 1 227951516 0 12181 0 0 1] real hdr: [ 1.01300003e+04 1.77555424e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.67999858e+03 9.25000113e+03 1.99878209e-01 2.22443261e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., 2.38762070e-12 2.39433126e-12 2.39936413e-12] ----------------------- var 111 record 22 hdr offset: 764000 data offset: 984645632 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 123080704 79872 900 3 23 0 0 0 0 7031111 1 228107916 0 12181 0 0 1] real hdr: [ 1.10500001e+04 1.36030234e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.05799981e+04 1.01300003e+04 1.56554224e-01 1.77555424e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., -2.55698544e-12 -2.57961599e-12 -2.60224676e-12] ----------------------- var 111 record 23 hdr offset: 764512 data offset: 985284608 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 123160576 79872 900 3 24 0 0 0 0 7031111 1 228264316 0 12181 0 0 1] real hdr: [ 1.20100006e+04 9.85881076e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.15199982e+04 1.10500001e+04 1.16947874e-01 1.36030234e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., -2.76687462e-12 -2.76844498e-12 -2.77622565e-12] ----------------------- var 111 record 24 hdr offset: 765024 data offset: 985923584 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 123240448 79872 900 3 25 0 0 0 0 7031111 1 228420716 0 12181 0 0 1] real hdr: [ 1.30100018e+04 6.59807861e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.24999991e+04 1.20100006e+04 8.17952369e-02 9.85881076e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., -3.29560381e-12 -3.26886565e-12 -3.24658854e-12] ----------------------- var 111 record 25 hdr offset: 765536 data offset: 986562560 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 123320320 79872 900 3 26 0 0 0 0 7031111 1 228577116 0 12181 0 0 1] real hdr: [ 1.40504001e+04 3.89823900e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.35200006e+04 1.30100018e+04 5.18637157e-02 6.59807861e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., -3.28613851e-12 -3.32592699e-12 -3.35435477e-12] ----------------------- var 111 record 26 hdr offset: 766048 data offset: 987201536 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 123400192 79872 900 3 27 0 0 0 0 7031111 1 228733516 0 12181 0 0 1] real hdr: [ 1.51377198e+04 1.83146873e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.45807997e+04 1.40504001e+04 2.79368177e-02 3.89823900e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., 3.24375807e-14 3.24379026e-14 6.48764625e-14] ----------------------- var 111 record 27 hdr offset: 766560 data offset: 987840512 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 123480064 79872 900 3 28 0 0 0 0 7031111 1 228889916 0 12181 0 0 1] real hdr: [ 1.62849737e+04 4.87210933e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.56946399e+04 1.51377198e+04 1.07164793e-02 1.83146873e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 111 record 28 hdr offset: 767072 data offset: 988479488 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 123559936 79872 900 3 29 0 0 0 0 7031111 1 229046316 0 12181 0 0 1] real hdr: [ 1.75069688e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.68753114e+04 1.62849737e+04 1.30179090e-03 4.87210933e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., 1.69477825e-14 2.90533148e-14 2.90535181e-14] ----------------------- var 111 record 29 hdr offset: 767584 data offset: 989118464 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 123639808 79872 900 3 30 0 0 0 0 7031111 1 229202716 0 12181 0 0 1] real hdr: [ 1.88208202e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81386262e+04 1.75069688e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., 1.59479312e-14 0.00000000e+00 0.00000000e+00] ----------------------- var 111 record 30 hdr offset: 768096 data offset: 989757440 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 123719680 79872 900 3 31 0 0 0 0 7031111 1 229359116 0 12181 0 0 1] real hdr: [ 2.02465990e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.95030104e+04 1.88208202e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., 3.52347342e-14 2.88279024e-14 2.24212891e-14] ----------------------- var 111 record 31 hdr offset: 768608 data offset: 990396416 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 123799552 79872 900 3 32 0 0 0 0 7031111 1 229515516 0 12181 0 0 1] real hdr: [ 2.18081366e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.09901876e+04 2.02465990e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., -1.19569255e-14 -9.96396196e-15 -8.96746666e-15] ----------------------- var 111 record 32 hdr offset: 769120 data offset: 991035392 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 123879424 79872 900 3 33 0 0 0 0 7031111 1 229671916 0 12181 0 0 1] real hdr: [ 2.35421836e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.26260817e+04 2.18081366e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 111 record 33 hdr offset: 769632 data offset: 991674368 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 123959296 79872 900 3 34 0 0 0 0 7031111 1 229828316 0 12181 0 0 1] real hdr: [ 2.55209609e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.44582854e+04 2.35421836e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., 1.06813638e-11 1.06862696e-11 1.06962919e-11] ----------------------- var 111 record 34 hdr offset: 770144 data offset: 992313344 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 124039168 79872 900 3 35 0 0 0 0 7031111 1 229984716 0 12181 0 0 1] real hdr: [ 2.79013583e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.65836402e+04 2.55209609e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., 1.07549464e-11 1.07469771e-11 1.07390121e-11] ----------------------- var 111 record 35 hdr offset: 770656 data offset: 992952320 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 124119040 79872 900 3 36 0 0 0 0 7031111 1 230141116 0 12181 0 0 1] real hdr: [ 3.10638886e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.92190802e+04 2.79013583e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., -1.07761603e-11 -1.07772723e-11 -1.07770008e-11] ----------------------- var 111 record 36 hdr offset: 771168 data offset: 993591296 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 124198912 79872 900 3 37 0 0 0 0 7031111 1 230297516 0 12181 0 0 1] real hdr: [ 3.60817633e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.29086931e+04 3.10638886e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., -1.06738535e-14 -1.54162029e-14 -1.66011241e-14] ----------------------- var 111 record 37 hdr offset: 771680 data offset: 994230272 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 124278784 79872 900 3 38 0 0 0 0 7031111 1 230453916 0 12181 0 0 1] real hdr: [ 4.24279038e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.92548336e+04 3.60817633e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00000000e+00 0.00000000e+00 0.00000000e+00 ..., 3.88773596e-15 1.94376443e-15 0.00000000e+00] ----------------------- =============================== var 112: nz = 38, nt = 1 var 112 record 0 hdr offset: 772192 data offset: 994869248 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 124358656 79872 900 5 1 0 0 0 0 7031111 1 230610316 0 12185 0 0 1] real hdr: [ 2.00003377e+01 9.97716462e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.99820611e+00 0.00000000e+00 9.98858129e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.02612345 -0.02696702 -0.02693129 ..., 0. 0. 0. ] ----------------------- var 112 record 1 hdr offset: 772704 data offset: 995508224 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 124438528 79872 900 5 2 0 0 0 0 7031111 1 230766716 0 12185 0 0 1] real hdr: [ 8.00013508e+01 9.90881510e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.99988815e+01 2.00003377e+01 9.94296273e-01 9.97716462e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.02686534 -0.0277191 -0.02767779 ..., 0. 0. 0. ] ----------------------- var 112 record 2 hdr offset: 773216 data offset: 996147200 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 124518400 79872 900 5 3 0 0 0 0 7031111 1 230923116 0 12185 0 0 1] real hdr: [ 1.79999114e+02 9.79542572e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30000232e+02 8.00013508e+01 9.85203885e-01 9.90881510e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.02688881 -0.02775283 -0.02770931 ..., 0. 0. 0. ] ----------------------- var 112 record 3 hdr offset: 773728 data offset: 996786176 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 124598272 79872 900 5 4 0 0 0 0 7031111 1 231079516 0 12185 0 0 1] real hdr: [ 3.20001478e+02 9.63777064e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.49998333e+02 1.79999114e+02 9.71644051e-01 9.79542572e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.02640097 -0.02725304 -0.02721016 ..., 0. 0. 0. ] ----------------------- var 112 record 4 hdr offset: 774240 data offset: 997425152 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 124678144 79872 900 5 5 0 0 0 0 7031111 1 231235916 0 12185 0 0 1] real hdr: [ 5.00000592e+02 9.43695500e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.10001035e+02 3.20001478e+02 9.53709855e-01 9.63777064e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.02552507 -0.02640056 -0.02636424 ..., 0. 0. 0. ] ----------------------- var 112 record 5 hdr offset: 774752 data offset: 998064128 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 124758016 79872 900 5 6 0 0 0 0 7031111 1 231392316 0 12185 0 0 1] real hdr: [ 7.20000381e+02 9.19438386e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.10000486e+02 5.00000592e+02 9.31527464e-01 9.43695500e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.0232899 -0.02404976 -0.02403859 ..., 0. 0. 0. ] ----------------------- var 112 record 6 hdr offset: 775264 data offset: 998703104 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 124837888 79872 900 5 7 0 0 0 0 7031111 1 231548716 0 12185 0 0 1] real hdr: [ 9.80000846e+02 8.91177995e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.50000613e+02 7.20000381e+02 9.05253051e-01 9.19438386e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.01663608 -0.01673992 -0.0168419 ..., 0. 0. 0. ] ----------------------- var 112 record 7 hdr offset: 775776 data offset: 999342080 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 124917760 79872 900 5 8 0 0 0 0 7031111 1 231705116 0 12185 0 0 1] real hdr: [ 1.27999806e+03 8.59118341e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.13000142e+03 9.80000846e+02 8.75074549e-01 8.91177995e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00771318 -0.00662006 -0.00682865 ..., 0. 0. 0. ] ----------------------- var 112 record 8 hdr offset: 776288 data offset: 999981056 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 124997632 79872 900 5 9 0 0 0 0 7031111 1 231861516 0 12185 0 0 1] real hdr: [ 1.61999988e+03 8.23493502e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.44999897e+03 1.27999806e+03 8.41211628e-01 8.59118341e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00247263 0.00492706 0.0046382 ..., 0. 0. 0. ] ----------------------- var 112 record 9 hdr offset: 776800 data offset: 1000620032 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 125077504 79872 900 5 10 0 0 0 0 7031111 1 232017916 0 12185 0 0 1] real hdr: [ 1.99999844e+03 7.84570542e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81000112e+03 1.61999988e+03 8.03914038e-01 8.23493502e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00346104 0.00599859 0.00594606 ..., 0. 0. 0. ] ----------------------- var 112 record 10 hdr offset: 777312 data offset: 1001259008 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 125157376 79872 900 5 11 0 0 0 0 7031111 1 232174316 0 12185 0 0 1] real hdr: [ 2.42000161e+03 7.42646223e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.21000002e+03 1.99999844e+03 7.63464495e-01 7.84570542e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.01027868 -0.00773553 -0.0079224 ..., 0. 0. 0. ] ----------------------- var 112 record 11 hdr offset: 777824 data offset: 1001897984 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 125237248 79872 900 5 12 0 0 0 0 7031111 1 232330716 0 12185 0 0 1] real hdr: [ 2.88000152e+03 6.98050213e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.64999960e+03 2.42000161e+03 7.20175811e-01 7.42646223e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00776496 -0.00601525 -0.00635143 ..., 0. 0. 0. ] ----------------------- var 112 record 12 hdr offset: 778336 data offset: 1002536960 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 125317120 79872 900 5 13 0 0 0 0 7031111 1 232487116 0 12185 0 0 1] real hdr: [ 3.37999819e+03 6.51142688e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.12999986e+03 2.88000152e+03 6.74392534e-01 6.98050213e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00545767 -0.00416825 -0.0044937 ..., 0. 0. 0. ] ----------------------- var 112 record 13 hdr offset: 778848 data offset: 1003175936 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 125396992 79872 900 5 14 0 0 0 0 7031111 1 232643516 0 12185 0 0 1] real hdr: [ 3.91999946e+03 6.02314441e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.65000079e+03 3.37999819e+03 6.26490534e-01 6.51142688e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.0015831 -0.00062624 -0.00094608 ..., 0. 0. 0. ] ----------------------- var 112 record 14 hdr offset: 779360 data offset: 1003814912 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 125476864 79872 900 5 15 0 0 0 0 7031111 1 232799916 0 12185 0 0 1] real hdr: [ 4.50000140e+03 5.51988701e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.20999847e+03 3.91999946e+03 5.76877346e-01 6.02314441e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00451681 0.00549134 0.00519842 ..., 0. 0. 0. ] ----------------------- var 112 record 15 hdr offset: 779872 data offset: 1004453888 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 125556736 79872 900 5 16 0 0 0 0 7031111 1 232956316 0 12185 0 0 1] real hdr: [ 5.12000009e+03 5.00619965e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.81000075e+03 4.50000140e+03 5.25990788e-01 5.51988701e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00496364 0.00612364 0.00579774 ..., 0. 0. 0. ] ----------------------- var 112 record 16 hdr offset: 780384 data offset: 1005092864 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 125636608 79872 900 5 17 0 0 0 0 7031111 1 233112716 0 12185 0 0 1] real hdr: [ 5.77999946e+03 4.48693382e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.44999978e+03 5.12000009e+03 4.74301366e-01 5.00619965e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00313482 0.00408925 0.00371348 ..., 0. 0. 0. ] ----------------------- var 112 record 17 hdr offset: 780896 data offset: 1005731840 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 125716480 79872 900 5 18 0 0 0 0 7031111 1 233269116 0 12185 0 0 1] real hdr: [ 6.47999950e+03 3.96725773e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.12999948e+03 5.77999946e+03 4.22309896e-01 4.48693382e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.0030277 0.00327422 0.00293615 ..., 0. 0. 0. ] ----------------------- var 112 record 18 hdr offset: 781408 data offset: 1006370816 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 125796352 79872 900 5 19 0 0 0 0 7031111 1 233425516 0 12185 0 0 1] real hdr: [ 7.22000022e+03 3.45265283e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.84999986e+03 6.47999950e+03 3.70548863e-01 3.96725773e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00322691 -0.00288348 -0.00327633 ..., 0. 0. 0. ] ----------------------- var 112 record 19 hdr offset: 781920 data offset: 1007009792 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 125876224 79872 900 5 20 0 0 0 0 7031111 1 233581916 0 12185 0 0 1] real hdr: [ 8.00000162e+03 2.94891378e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.61000092e+03 7.22000022e+03 3.19582071e-01 3.45265283e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00832277 -0.00758309 -0.00794967 ..., 0. 0. 0. ] ----------------------- var 112 record 20 hdr offset: 782432 data offset: 1007648768 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 125956096 79872 900 5 21 0 0 0 0 7031111 1 233738316 0 12185 0 0 1] real hdr: [ 8.81999976e+03 2.46215071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.40999873e+03 8.00000162e+03 2.70004882e-01 2.94891378e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.01112135 -0.0103954 -0.01055182 ..., 0. 0. 0. ] ----------------------- var 112 record 21 hdr offset: 782944 data offset: 1008287744 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 126035968 79872 900 5 22 0 0 0 0 7031111 1 233894716 0 12185 0 0 1] real hdr: [ 9.67999858e+03 1.99878209e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.25000113e+03 8.81999976e+03 2.22443261e-01 2.46215071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.01456148 -0.01249538 -0.0126918 ..., 0. 0. 0. ] ----------------------- var 112 record 22 hdr offset: 783456 data offset: 1008926720 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 126115840 79872 900 5 23 0 0 0 0 7031111 1 234051116 0 12185 0 0 1] real hdr: [ 1.05799981e+04 1.56554224e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.01300003e+04 9.67999858e+03 1.77555424e-01 1.99878209e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.03723374 -0.03534178 -0.03525288 ..., 0. 0. 0. ] ----------------------- var 112 record 23 hdr offset: 783968 data offset: 1009565696 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 126195712 79872 900 5 24 0 0 0 0 7031111 1 234207516 0 12185 0 0 1] real hdr: [ 1.15199982e+04 1.16947874e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.10500001e+04 1.05799981e+04 1.36030234e-01 1.56554224e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.04340626 -0.04203902 -0.04223308 ..., 0. 0. 0. ] ----------------------- var 112 record 24 hdr offset: 784480 data offset: 1010204672 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 126275584 79872 900 5 25 0 0 0 0 7031111 1 234363916 0 12185 0 0 1] real hdr: [ 1.24999991e+04 8.17952369e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.20100006e+04 1.15199982e+04 9.85881076e-02 1.16947874e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.03622615 -0.03564773 -0.03602058 ..., 0. 0. 0. ] ----------------------- var 112 record 25 hdr offset: 784992 data offset: 1010843648 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 126355456 79872 900 5 26 0 0 0 0 7031111 1 234520316 0 12185 0 0 1] real hdr: [ 1.35200006e+04 5.18637157e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30100018e+04 1.24999991e+04 6.59807861e-02 8.17952369e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.03604982 -0.03514753 -0.03535103 ..., 0. 0. 0. ] ----------------------- var 112 record 26 hdr offset: 785504 data offset: 1011482624 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 126435328 79872 900 5 27 0 0 0 0 7031111 1 234676716 0 12185 0 0 1] real hdr: [ 1.45807997e+04 2.79368177e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.40504001e+04 1.35200006e+04 3.89823900e-02 5.18637157e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.02974088 -0.02863974 -0.0287471 ..., 0. 0. 0. ] ----------------------- var 112 record 27 hdr offset: 786016 data offset: 1012121600 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 126515200 79872 900 5 28 0 0 0 0 7031111 1 234833116 0 12185 0 0 1] real hdr: [ 1.56946399e+04 1.07164793e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.51377198e+04 1.45807997e+04 1.83146873e-02 2.79368177e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.01037708 -0.0082554 -0.0085917 ..., 0. 0. 0. ] ----------------------- var 112 record 28 hdr offset: 786528 data offset: 1012760576 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 126595072 79872 900 5 29 0 0 0 0 7031111 1 234989516 0 12185 0 0 1] real hdr: [ 1.68753114e+04 1.30179090e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.62849737e+04 1.56946399e+04 4.87210933e-03 1.07164793e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.03691517 -0.03753376 -0.03740808 ..., 0. 0. 0. ] ----------------------- var 112 record 29 hdr offset: 787040 data offset: 1013399552 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 126674944 79872 900 5 30 0 0 0 0 7031111 1 235145916 0 12185 0 0 1] real hdr: [ 1.81386262e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.75069688e+04 1.68753114e+04 0.00000000e+00 1.30179090e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00598945 -0.02157346 -0.02251826 ..., 0. 0. 0. ] ----------------------- var 112 record 30 hdr offset: 787552 data offset: 1014038528 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 126754816 79872 900 5 31 0 0 0 0 7031111 1 235302316 0 12185 0 0 1] real hdr: [ 1.95030104e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.88208202e+04 1.81386262e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.0414094 -0.04169727 -0.04190233 ..., 0. 0. 0. ] ----------------------- var 112 record 31 hdr offset: 788064 data offset: 1014677504 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 126834688 79872 900 5 32 0 0 0 0 7031111 1 235458716 0 12185 0 0 1] real hdr: [ 2.09901876e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.02465990e+04 1.95030104e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.02909095 0.02687305 0.02619221 ..., 0. 0. 0. ] ----------------------- var 112 record 32 hdr offset: 788576 data offset: 1015316480 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 126914560 79872 900 5 33 0 0 0 0 7031111 1 235615116 0 12185 0 0 1] real hdr: [ 2.26260817e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.18081366e+04 2.09901876e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.01338193 0.00252325 0.00139489 ..., 0. 0. 0. ] ----------------------- var 112 record 33 hdr offset: 789088 data offset: 1015955456 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 126994432 79872 900 5 34 0 0 0 0 7031111 1 235771516 0 12185 0 0 1] real hdr: [ 2.44582854e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.35421836e+04 2.26260817e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.03119715 -0.03977725 -0.04012266 ..., 0. 0. 0. ] ----------------------- var 112 record 34 hdr offset: 789600 data offset: 1016594432 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 127074304 79872 900 5 35 0 0 0 0 7031111 1 235927916 0 12185 0 0 1] real hdr: [ 2.65836402e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.55209609e+04 2.44582854e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.0839676 -0.08405687 -0.08463736 ..., 0. 0. 0. ] ----------------------- var 112 record 35 hdr offset: 790112 data offset: 1017233408 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 127154176 79872 900 5 36 0 0 0 0 7031111 1 236084316 0 12185 0 0 1] real hdr: [ 2.92190802e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.79013583e+04 2.65836402e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.05412403 0.05101195 0.05033591 ..., 0. 0. 0. ] ----------------------- var 112 record 36 hdr offset: 790624 data offset: 1017872384 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 127234048 79872 900 5 37 0 0 0 0 7031111 1 236240716 0 12185 0 0 1] real hdr: [ 3.29086931e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.10638886e+04 2.92190802e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.18757428 -0.19140765 -0.19067319 ..., 0. 0. 0. ] ----------------------- var 112 record 37 hdr offset: 791136 data offset: 1018511360 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 0 0 128 65 0 387757194 127313920 79872 900 5 38 0 0 0 0 7031111 1 236397116 0 12185 0 0 1] real hdr: [ 3.92548336e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.60817633e+04 3.29086931e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.2985335 -0.30224624 -0.30087531 ..., 0. 0. 0. ] ----------------------- =============================== var 113: nz = 38, nt = 1 var 113 record 0 hdr offset: 791648 data offset: 1019150336 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 127393792 79872 900 6 1 0 0 0 0 7031111 1 236553516 0 12186 0 0 1] real hdr: [ 2.00003377e+01 9.97716462e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.99820611e+00 0.00000000e+00 9.98858129e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.0211712 0.02315317 0.02417497 ..., 0.01777851 0.01761995 0.01782275] ----------------------- var 113 record 1 hdr offset: 792160 data offset: 1019789312 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 127473664 79872 900 6 2 0 0 0 0 7031111 1 236709456 0 12186 0 0 1] real hdr: [ 8.00013508e+01 9.90881510e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.99988815e+01 2.00003377e+01 9.94296273e-01 9.97716462e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.0199544 0.02189645 0.0229219 ..., 0.01915272 0.01887006 0.01897126] ----------------------- var 113 record 2 hdr offset: 792672 data offset: 1020428288 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 127553536 79872 900 6 3 0 0 0 0 7031111 1 236865396 0 12186 0 0 1] real hdr: [ 1.79999114e+02 9.79542572e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30000232e+02 8.00013508e+01 9.85203885e-01 9.90881510e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.01930208 0.02114605 0.02216156 ..., 0.02118229 0.0207755 0.0207764 ] ----------------------- var 113 record 3 hdr offset: 793184 data offset: 1021067264 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 127633408 79872 900 6 4 0 0 0 0 7031111 1 237021336 0 12186 0 0 1] real hdr: [ 3.20001478e+02 9.63777064e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.49998333e+02 1.79999114e+02 9.71644051e-01 9.79542572e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.01907552 0.02074974 0.02172011 ..., 0.02454118 0.02409602 0.02399088] ----------------------- var 113 record 4 hdr offset: 793696 data offset: 1021706240 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 127713280 79872 900 6 5 0 0 0 0 7031111 1 237177276 0 12186 0 0 1] real hdr: [ 5.00000592e+02 9.43695500e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.10001035e+02 3.20001478e+02 9.53709855e-01 9.63777064e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.01849051 0.01996725 0.02091772 ..., 0.02670214 0.02624467 0.02581616] ----------------------- var 113 record 5 hdr offset: 794208 data offset: 1022345216 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 127793152 79872 900 6 6 0 0 0 0 7031111 1 237333216 0 12186 0 0 1] real hdr: [ 7.20000381e+02 9.19438386e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.10000486e+02 5.00000592e+02 9.31527464e-01 9.43695500e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.01108036 0.01255395 0.01374559 ..., 0.02022974 0.01985499 0.01930633] ----------------------- var 113 record 6 hdr offset: 794720 data offset: 1022984192 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 127873024 79872 900 6 7 0 0 0 0 7031111 1 237489156 0 12186 0 0 1] real hdr: [ 9.80000846e+02 8.91177995e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.50000613e+02 7.20000381e+02 9.05253051e-01 9.19438386e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.00216221 0.0029948 0.0038769 ..., 0.01205168 0.01188795 0.01165154] ----------------------- var 113 record 7 hdr offset: 795232 data offset: 1023623168 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 127952896 79872 900 6 8 0 0 0 0 7031111 1 237645096 0 12186 0 0 1] real hdr: [ 1.27999806e+03 8.59118341e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.13000142e+03 9.80000846e+02 8.75074549e-01 8.91177995e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.00767881 -0.00781771 -0.00757932 ..., 0.00503642 0.00486696 0.0048627 ] ----------------------- var 113 record 8 hdr offset: 795744 data offset: 1024262144 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 128032768 79872 900 6 9 0 0 0 0 7031111 1 237801036 0 12186 0 0 1] real hdr: [ 1.61999988e+03 8.23493502e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.44999897e+03 1.27999806e+03 8.41211628e-01 8.59118341e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.02036964 -0.0216952 -0.02228449 ..., -0.00668689 -0.00710796 -0.00704323] ----------------------- var 113 record 9 hdr offset: 796256 data offset: 1024901120 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 128112640 79872 900 6 10 0 0 0 0 7031111 1 237956976 0 12186 0 0 1] real hdr: [ 1.99999844e+03 7.84570542e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81000112e+03 1.61999988e+03 8.03914038e-01 8.23493502e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.02911777 -0.02942347 -0.02871296 ..., -0.0198236 -0.01976337 -0.01919173] ----------------------- var 113 record 10 hdr offset: 796768 data offset: 1025540096 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 128192512 79872 900 6 11 0 0 0 0 7031111 1 238112916 0 12186 0 0 1] real hdr: [ 2.42000161e+03 7.42646223e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.21000002e+03 1.99999844e+03 7.63464495e-01 7.84570542e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.00384085 0.00388998 0.00360343 ..., -0.0369389 -0.03600337 -0.03483069] ----------------------- var 113 record 11 hdr offset: 797280 data offset: 1026179072 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 128272384 79872 900 6 12 0 0 0 0 7031111 1 238268856 0 12186 0 0 1] real hdr: [ 2.88000152e+03 6.98050213e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.64999960e+03 2.42000161e+03 7.20175811e-01 7.42646223e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.01143756 0.01100509 0.01016869 ..., -0.05299215 -0.05134275 -0.04980227] ----------------------- var 113 record 12 hdr offset: 797792 data offset: 1026818048 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 128352256 79872 900 6 13 0 0 0 0 7031111 1 238424796 0 12186 0 0 1] real hdr: [ 3.37999819e+03 6.51142688e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.12999986e+03 2.88000152e+03 6.74392534e-01 6.98050213e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.01411534 0.01373551 0.01281473 ..., -0.06365515 -0.06127497 -0.05934214] ----------------------- var 113 record 13 hdr offset: 798304 data offset: 1027457024 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 128432128 79872 900 6 14 0 0 0 0 7031111 1 238580736 0 12186 0 0 1] real hdr: [ 3.91999946e+03 6.02314441e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.65000079e+03 3.37999819e+03 6.26490534e-01 6.51142688e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.01142486 0.01077545 0.00952185 ..., -0.06207722 -0.05964311 -0.05733813] ----------------------- var 113 record 14 hdr offset: 798816 data offset: 1028096000 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 128512000 79872 900 6 15 0 0 0 0 7031111 1 238736676 0 12186 0 0 1] real hdr: [ 4.50000140e+03 5.51988701e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.20999847e+03 3.91999946e+03 5.76877346e-01 6.02314441e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.01586466 0.01474973 0.01295157 ..., -0.04380028 -0.04159979 -0.03985895] ----------------------- var 113 record 15 hdr offset: 799328 data offset: 1028734976 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 128591872 79872 900 6 16 0 0 0 0 7031111 1 238892616 0 12186 0 0 1] real hdr: [ 5.12000009e+03 5.00619965e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.81000075e+03 4.50000140e+03 5.25990788e-01 5.51988701e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.01954225 0.01879788 0.017393 ..., -0.02252292 -0.02093386 -0.02048355] ----------------------- var 113 record 16 hdr offset: 799840 data offset: 1029373952 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 128671744 79872 900 6 17 0 0 0 0 7031111 1 239048556 0 12186 0 0 1] real hdr: [ 5.77999946e+03 4.48693382e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.44999978e+03 5.12000009e+03 4.74301366e-01 5.00619965e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.01140226 0.01117734 0.01035294 ..., -0.02068768 -0.02045873 -0.02041409] ----------------------- var 113 record 17 hdr offset: 800352 data offset: 1030012928 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 128751616 79872 900 6 18 0 0 0 0 7031111 1 239204496 0 12186 0 0 1] real hdr: [ 6.47999950e+03 3.96725773e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.12999948e+03 5.77999946e+03 4.22309896e-01 4.48693382e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.00046344 -0.00060497 -0.00143208 ..., -0.03119689 -0.03161676 -0.03176821] ----------------------- var 113 record 18 hdr offset: 800864 data offset: 1030651904 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 128831488 79872 900 6 19 0 0 0 0 7031111 1 239360436 0 12186 0 0 1] real hdr: [ 7.22000022e+03 3.45265283e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.84999986e+03 6.47999950e+03 3.70548863e-01 3.96725773e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.00389542 -0.00397498 -0.00478961 ..., -0.03074156 -0.02930465 -0.02711432] ----------------------- var 113 record 19 hdr offset: 801376 data offset: 1031290880 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 128911360 79872 900 6 20 0 0 0 0 7031111 1 239516376 0 12186 0 0 1] real hdr: [ 8.00000162e+03 2.94891378e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.61000092e+03 7.22000022e+03 3.19582071e-01 3.45265283e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.00146854 0.00199099 0.00190257 ..., -0.02917142 -0.02682492 -0.02408909] ----------------------- var 113 record 20 hdr offset: 801888 data offset: 1031929856 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 128991232 79872 900 6 21 0 0 0 0 7031111 1 239672316 0 12186 0 0 1] real hdr: [ 8.81999976e+03 2.46215071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.40999873e+03 8.00000162e+03 2.70004882e-01 2.94891378e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.01237385 0.0128185 0.01270176 ..., -0.02549564 -0.0220792 -0.01930569] ----------------------- var 113 record 21 hdr offset: 802400 data offset: 1032568832 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 129071104 79872 900 6 22 0 0 0 0 7031111 1 239828256 0 12186 0 0 1] real hdr: [ 9.67999858e+03 1.99878209e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.25000113e+03 8.81999976e+03 2.22443261e-01 2.46215071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.02883686 0.02898683 0.02875526 ..., -0.01974216 -0.01698962 -0.01517382] ----------------------- var 113 record 22 hdr offset: 802912 data offset: 1033207808 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 129150976 79872 900 6 23 0 0 0 0 7031111 1 239984196 0 12186 0 0 1] real hdr: [ 1.05799981e+04 1.56554224e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.01300003e+04 9.67999858e+03 1.77555424e-01 1.99878209e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.02370502 0.02443461 0.02485556 ..., -0.01218144 -0.01214571 -0.01254661] ----------------------- var 113 record 23 hdr offset: 803424 data offset: 1033846784 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 129230848 79872 900 6 24 0 0 0 0 7031111 1 240140136 0 12186 0 0 1] real hdr: [ 1.15199982e+04 1.16947874e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.10500001e+04 1.05799981e+04 1.36030234e-01 1.56554224e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.02473336 0.02510072 0.02505934 ..., 0.01086778 0.01185263 0.01225687] ----------------------- var 113 record 24 hdr offset: 803936 data offset: 1034485760 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 129310720 79872 900 6 25 0 0 0 0 7031111 1 240296076 0 12186 0 0 1] real hdr: [ 1.24999991e+04 8.17952369e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.20100006e+04 1.15199982e+04 9.85881076e-02 1.16947874e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.03515777 0.03481863 0.03371802 ..., 0.00858555 0.0105517 0.01299428] ----------------------- var 113 record 25 hdr offset: 804448 data offset: 1035124736 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 129390592 79872 900 6 26 0 0 0 0 7031111 1 240452016 0 12186 0 0 1] real hdr: [ 1.35200006e+04 5.18637157e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30100018e+04 1.24999991e+04 6.59807861e-02 8.17952369e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.0352795 0.0351449 0.03424846 ..., 0.01597585 0.01928076 0.02173112] ----------------------- var 113 record 26 hdr offset: 804960 data offset: 1035763712 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 129470464 79872 900 6 27 0 0 0 0 7031111 1 240607956 0 12186 0 0 1] real hdr: [ 1.45807997e+04 2.79368177e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.40504001e+04 1.35200006e+04 3.89823900e-02 5.18637157e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.01171076 0.01145621 0.01047998 ..., -0.03574342 -0.03304692 -0.03094704] ----------------------- var 113 record 27 hdr offset: 805472 data offset: 1036402688 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 129550336 79872 900 6 28 0 0 0 0 7031111 1 240763896 0 12186 0 0 1] real hdr: [ 1.56946399e+04 1.07164793e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.51377198e+04 1.45807997e+04 1.83146873e-02 2.79368177e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.00897801 0.00857145 0.00804529 ..., -0.02162208 -0.02105946 -0.02084269] ----------------------- var 113 record 28 hdr offset: 805984 data offset: 1037041664 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 129630208 79872 900 6 29 0 0 0 0 7031111 1 240919836 0 12186 0 0 1] real hdr: [ 1.68753114e+04 1.30179090e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.62849737e+04 1.56946399e+04 4.87210933e-03 1.07164793e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.00011603 0.00121911 0.0021763 ..., 0.00297954 0.00366119 0.00445147] ----------------------- var 113 record 29 hdr offset: 806496 data offset: 1037680640 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 129710080 79872 900 6 30 0 0 0 0 7031111 1 241075776 0 12186 0 0 1] real hdr: [ 1.81386262e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.75069688e+04 1.68753114e+04 0.00000000e+00 1.30179090e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.00054462 0.00173673 -0.00316778 ..., 0.00466089 0.0042703 0.00402696] ----------------------- var 113 record 30 hdr offset: 807008 data offset: 1038319616 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 129789952 79872 900 6 31 0 0 0 0 7031111 1 241231716 0 12186 0 0 1] real hdr: [ 1.95030104e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.88208202e+04 1.81386262e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 3.26013360e-05 -4.91576560e-04 -1.95128703e-03 ..., -4.42213006e-02 -4.11533937e-02 -3.82397883e-02] ----------------------- var 113 record 31 hdr offset: 807520 data offset: 1038958592 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 129869824 79872 900 6 32 0 0 0 0 7031111 1 241387656 0 12186 0 0 1] real hdr: [ 2.09901876e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.02465990e+04 1.95030104e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.01779642 0.01710099 0.01426875 ..., -0.04823704 -0.04272189 -0.03682187] ----------------------- var 113 record 32 hdr offset: 808032 data offset: 1039597568 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 129949696 79872 900 6 33 0 0 0 0 7031111 1 241543596 0 12186 0 0 1] real hdr: [ 2.26260817e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.18081366e+04 2.09901876e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.0426585 0.0413453 0.03570244 ..., -0.05314843 -0.05099285 -0.04874997] ----------------------- var 113 record 33 hdr offset: 808544 data offset: 1040236544 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 130029568 79872 900 6 34 0 0 0 0 7031111 1 241699536 0 12186 0 0 1] real hdr: [ 2.44582854e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.35421836e+04 2.26260817e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.03078767 0.03372023 0.03295583 ..., -0.00393827 -0.00087182 0.00227773] ----------------------- var 113 record 34 hdr offset: 809056 data offset: 1040875520 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 130109440 79872 900 6 35 0 0 0 0 7031111 1 241855476 0 12186 0 0 1] real hdr: [ 2.65836402e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.55209609e+04 2.44582854e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.04277928 -0.0454906 -0.04899852 ..., -0.06465164 -0.05994182 -0.05514932] ----------------------- var 113 record 35 hdr offset: 809568 data offset: 1041514496 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 130189312 79872 900 6 36 0 0 0 0 7031111 1 242011416 0 12186 0 0 1] real hdr: [ 2.92190802e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.79013583e+04 2.65836402e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.06835365 0.06751093 0.06472282 ..., -0.06233161 -0.05192851 -0.04161263] ----------------------- var 113 record 36 hdr offset: 810080 data offset: 1042153472 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 130269184 79872 900 6 37 0 0 0 0 7031111 1 242167356 0 12186 0 0 1] real hdr: [ 3.29086931e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.10638886e+04 2.92190802e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.01052885 -0.0036681 -0.00054332 ..., -0.06786246 -0.06470639 -0.06137188] ----------------------- var 113 record 37 hdr offset: 810592 data offset: 1042792448 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 0 0 128 65 0 387757194 130349056 79872 900 6 38 0 0 0 0 7031111 1 242323296 0 12186 0 0 1] real hdr: [ 3.92548336e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.60817633e+04 3.29086931e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.09334621 -0.08675178 -0.08118775 ..., -0.07678866 -0.07062395 -0.06437619] ----------------------- =============================== var 114: nz = 38, nt = 1 var 114 record 0 hdr offset: 811104 data offset: 1043431424 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 130428928 79872 900 0 1 0 0 0 0 7031111 1 242479236 0 13185 0 0 1] real hdr: [ 2.00003377e+01 9.97716462e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.99820611e+00 0.00000000e+00 9.98858129e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 114 record 1 hdr offset: 811616 data offset: 1044070400 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 130508800 79872 900 0 2 0 0 0 0 7031111 1 242635636 0 13185 0 0 1] real hdr: [ 8.00013508e+01 9.90881510e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.99988815e+01 2.00003377e+01 9.94296273e-01 9.97716462e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.06963546e-06 5.12978318e-07 1.13981503e-06 ..., -1.92389479e-07 -2.93422914e-07 6.65106427e-06] ----------------------- var 114 record 2 hdr offset: 812128 data offset: 1044709376 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 130588672 79872 900 0 3 0 0 0 0 7031111 1 242792036 0 13185 0 0 1] real hdr: [ 1.79999114e+02 9.79542572e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30000232e+02 8.00013508e+01 9.85203885e-01 9.90881510e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.66636346e-05 5.83395558e-06 9.32268176e-06 ..., -2.19098325e-07 -3.18680691e-07 7.02504531e-06] ----------------------- var 114 record 3 hdr offset: 812640 data offset: 1045348352 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 130668544 79872 900 0 4 0 0 0 0 7031111 1 242948436 0 13185 0 0 1] real hdr: [ 3.20001478e+02 9.63777064e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.49998333e+02 1.79999114e+02 9.71644051e-01 9.79542572e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.07364685e-05 1.03069842e-05 1.41295441e-05 ..., 7.72681918e-10 4.70747052e-10 5.14795850e-09] ----------------------- var 114 record 4 hdr offset: 813152 data offset: 1045987328 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 130748416 79872 900 0 5 0 0 0 0 7031111 1 243104836 0 13185 0 0 1] real hdr: [ 5.00000592e+02 9.43695500e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.10001035e+02 3.20001478e+02 9.53709855e-01 9.63777064e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.63314928e-06 9.13439271e-06 1.02603126e-05 ..., 1.19987098e-09 9.47871892e-10 1.15884236e-08] ----------------------- var 114 record 5 hdr offset: 813664 data offset: 1046626304 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 130828288 79872 900 0 6 0 0 0 0 7031111 1 243261236 0 13185 0 0 1] real hdr: [ 7.20000381e+02 9.19438386e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.10000486e+02 5.00000592e+02 9.31527464e-01 9.43695500e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.61450719e-08 1.80110451e-08 1.62356208e-08 ..., 8.04405875e-10 7.23048565e-10 1.55278439e-08] ----------------------- var 114 record 6 hdr offset: 814176 data offset: 1047265280 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 130908160 79872 900 0 7 0 0 0 0 7031111 1 243417636 0 13185 0 0 1] real hdr: [ 9.80000846e+02 8.91177995e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.50000613e+02 7.20000381e+02 9.05253051e-01 9.19438386e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.00598249e-09 -5.84287285e-09 -7.19667170e-09 ..., 9.16287601e-10 7.87363563e-10 2.21679297e-08] ----------------------- var 114 record 7 hdr offset: 814688 data offset: 1047904256 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 130988032 79872 900 0 8 0 0 0 0 7031111 1 243574036 0 13185 0 0 1] real hdr: [ 1.27999806e+03 8.59118341e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.13000142e+03 9.80000846e+02 8.75074549e-01 8.91177995e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.36671820e-08 -4.01487092e-08 -4.57162272e-08 ..., -5.46782897e-11 -1.20960977e-10 6.14362827e-09] ----------------------- var 114 record 8 hdr offset: 815200 data offset: 1048543232 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 131067904 79872 900 0 9 0 0 0 0 7031111 1 243730436 0 13185 0 0 1] real hdr: [ 1.61999988e+03 8.23493502e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.44999897e+03 1.27999806e+03 8.41211628e-01 8.59118341e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -4.07673628e-09 -4.58263161e-09 -5.07602316e-09 ..., -4.80485118e-09 -5.07109688e-09 -9.72446230e-08] ----------------------- var 114 record 9 hdr offset: 815712 data offset: 1049182208 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 131147776 79872 900 0 10 0 0 0 0 7031111 1 243886836 0 13185 0 0 1] real hdr: [ 1.99999844e+03 7.84570542e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81000112e+03 1.61999988e+03 8.03914038e-01 8.23493502e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -6.72578604e-10 -3.63326660e-11 1.77889356e-10 ..., -1.91558058e-08 -1.46429961e-08 -1.26097757e-06] ----------------------- var 114 record 10 hdr offset: 816224 data offset: 1049821184 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 131227648 79872 900 0 11 0 0 0 0 7031111 1 244043236 0 13185 0 0 1] real hdr: [ 2.42000161e+03 7.42646223e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.21000002e+03 1.99999844e+03 7.63464495e-01 7.84570542e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.66944449e-08 5.22736876e-09 4.00183353e-09 ..., -1.23762529e-08 -7.07241377e-09 -6.32614001e-06] ----------------------- var 114 record 11 hdr offset: 816736 data offset: 1050460160 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 131307520 79872 900 0 12 0 0 0 0 7031111 1 244199636 0 13185 0 0 1] real hdr: [ 2.88000152e+03 6.98050213e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.64999960e+03 2.42000161e+03 7.20175811e-01 7.42646223e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 8.69461836e-09 8.00297606e-09 7.96362265e-09 ..., 2.17854925e-08 1.11742491e-08 -9.05613160e-06] ----------------------- var 114 record 12 hdr offset: 817248 data offset: 1051099136 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 131387392 79872 900 0 13 0 0 0 0 7031111 1 244356036 0 13185 0 0 1] real hdr: [ 3.37999819e+03 6.51142688e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.12999986e+03 2.88000152e+03 6.74392534e-01 6.98050213e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.77262205e-08 1.32796831e-08 1.69893362e-08 ..., 1.41434917e-08 5.77535841e-09 -3.31903357e-06] ----------------------- var 114 record 13 hdr offset: 817760 data offset: 1051738112 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 131467264 79872 900 0 14 0 0 0 0 7031111 1 244512436 0 13185 0 0 1] real hdr: [ 3.91999946e+03 6.02314441e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.65000079e+03 3.37999819e+03 6.26490534e-01 6.51142688e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.01678903e-08 2.78020220e-08 3.40873605e-08 ..., 2.06571893e-09 1.92822180e-09 -4.76382951e-07] ----------------------- var 114 record 14 hdr offset: 818272 data offset: 1052377088 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 131547136 79872 900 0 15 0 0 0 0 7031111 1 244668836 0 13185 0 0 1] real hdr: [ 4.50000140e+03 5.51988701e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.20999847e+03 3.91999946e+03 5.76877346e-01 6.02314441e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.08150315e-08 1.82652613e-08 1.93410710e-08 ..., 2.48381227e-08 2.45323850e-08 -3.60751778e-06] ----------------------- var 114 record 15 hdr offset: 818784 data offset: 1053016064 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 131627008 79872 900 0 16 0 0 0 0 7031111 1 244825236 0 13185 0 0 1] real hdr: [ 5.12000009e+03 5.00619965e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.81000075e+03 4.50000140e+03 5.25990788e-01 5.51988701e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -5.43744383e-09 6.69651390e-10 7.54670271e-10 ..., 6.31744967e-08 5.40440830e-08 -3.23319910e-06] ----------------------- var 114 record 16 hdr offset: 819296 data offset: 1053655040 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 131706880 79872 900 0 17 0 0 0 0 7031111 1 244981636 0 13185 0 0 1] real hdr: [ 5.77999946e+03 4.48693382e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.44999978e+03 5.12000009e+03 4.74301366e-01 5.00619965e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -3.09625298e-10 4.67958960e-09 6.13696116e-09 ..., 6.37354214e-09 5.24489829e-09 -8.99592806e-07] ----------------------- var 114 record 17 hdr offset: 819808 data offset: 1054294016 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 131786752 79872 900 0 18 0 0 0 0 7031111 1 245138036 0 13185 0 0 1] real hdr: [ 6.47999950e+03 3.96725773e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.12999948e+03 5.77999946e+03 4.22309896e-01 4.48693382e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.16612906e-08 7.25001659e-09 1.31893216e-08 ..., 3.64799968e-10 -7.98271227e-10 -2.52172896e-07] ----------------------- var 114 record 18 hdr offset: 820320 data offset: 1054932992 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 131866624 79872 900 0 19 0 0 0 0 7031111 1 245294436 0 13185 0 0 1] real hdr: [ 7.22000022e+03 3.45265283e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.84999986e+03 6.47999950e+03 3.70548863e-01 3.96725773e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -7.57779084e-09 -3.31159526e-08 -3.64810582e-08 ..., -9.47244616e-10 -2.08771178e-09 -2.10283773e-08] ----------------------- var 114 record 19 hdr offset: 820832 data offset: 1055571968 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 131946496 79872 900 0 20 0 0 0 0 7031111 1 245450836 0 13185 0 0 1] real hdr: [ 8.00000162e+03 2.94891378e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.61000092e+03 7.22000022e+03 3.19582071e-01 3.45265283e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.40083835e-07 2.99506731e-08 2.60689106e-08 ..., -3.31149469e-10 -5.67022984e-10 -2.33283668e-08] ----------------------- var 114 record 20 hdr offset: 821344 data offset: 1056210944 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 132026368 79872 900 0 21 0 0 0 0 7031111 1 245607236 0 13185 0 0 1] real hdr: [ 8.81999976e+03 2.46215071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.40999873e+03 8.00000162e+03 2.70004882e-01 2.94891378e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.67888094e-06 2.05026868e-06 1.17318223e-06 ..., 1.41026149e-10 2.60007516e-10 -6.70666189e-09] ----------------------- var 114 record 21 hdr offset: 821856 data offset: 1056849920 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 132106240 79872 900 0 22 0 0 0 0 7031111 1 245763636 0 13185 0 0 1] real hdr: [ 9.67999858e+03 1.99878209e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.25000113e+03 8.81999976e+03 2.22443261e-01 2.46215071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.20678271e-06 1.26510804e-06 7.50305105e-07 ..., 2.55524204e-12 5.79252549e-11 -5.85850424e-10] ----------------------- var 114 record 22 hdr offset: 822368 data offset: 1057488896 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 132186112 79872 900 0 23 0 0 0 0 7031111 1 245920036 0 13185 0 0 1] real hdr: [ 1.05799981e+04 1.56554224e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.01300003e+04 9.67999858e+03 1.77555424e-01 1.99878209e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.51749862e-06 1.51716142e-06 1.41007172e-06 ..., -7.26773676e-12 -2.72531286e-11 -1.09428669e-07] ----------------------- var 114 record 23 hdr offset: 822880 data offset: 1058127872 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 132265984 79872 900 0 24 0 0 0 0 7031111 1 246076436 0 13185 0 0 1] real hdr: [ 1.15199982e+04 1.16947874e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.10500001e+04 1.05799981e+04 1.36030234e-01 1.56554224e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.79565506e-07 5.86478848e-07 6.46532840e-07 ..., 1.68116854e-09 1.62209768e-09 -2.06479584e-07] ----------------------- var 114 record 24 hdr offset: 823392 data offset: 1058766848 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 132345856 79872 900 0 25 0 0 0 0 7031111 1 246232836 0 13185 0 0 1] real hdr: [ 1.24999991e+04 8.17952369e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.20100006e+04 1.15199982e+04 9.85881076e-02 1.16947874e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.31111665e-06 -8.72371004e-07 -6.59928503e-07 ..., -1.62812230e-09 -1.16551280e-09 -1.26009340e-07] ----------------------- var 114 record 25 hdr offset: 823904 data offset: 1059405824 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 132425728 79872 900 0 26 0 0 0 0 7031111 1 246389236 0 13185 0 0 1] real hdr: [ 1.35200006e+04 5.18637157e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30100018e+04 1.24999991e+04 6.59807861e-02 8.17952369e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.86648244e-08 5.37074518e-09 -3.68552611e-09 ..., 7.40865929e-08 5.90746581e-08 -7.03734668e-06] ----------------------- var 114 record 26 hdr offset: 824416 data offset: 1060044800 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 132505600 79872 900 0 27 0 0 0 0 7031111 1 246545636 0 13185 0 0 1] real hdr: [ 1.45807997e+04 2.79368177e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.40504001e+04 1.35200006e+04 3.89823900e-02 5.18637157e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 5.99279986e-08 3.80100786e-08 2.91178122e-08 ..., 5.49691705e-08 4.37417960e-08 -1.16190186e-05] ----------------------- var 114 record 27 hdr offset: 824928 data offset: 1060683776 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 132585472 79872 900 0 28 0 0 0 0 7031111 1 246702036 0 13185 0 0 1] real hdr: [ 1.56946399e+04 1.07164793e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.51377198e+04 1.45807997e+04 1.83146873e-02 2.79368177e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.08753495e-09 -1.82985307e-08 -2.43627554e-08 ..., -4.43781545e-09 -6.52179910e-09 -4.85261410e-07] ----------------------- var 114 record 28 hdr offset: 825440 data offset: 1061322752 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 132665344 79872 900 0 29 0 0 0 0 7031111 1 246858436 0 13185 0 0 1] real hdr: [ 1.68753114e+04 1.30179090e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.62849737e+04 1.56946399e+04 4.87210933e-03 1.07164793e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.38651288e-07 1.06527786e-07 9.88884992e-08 ..., -2.53626631e-09 -1.31465372e-09 -1.59519868e-06] ----------------------- var 114 record 29 hdr offset: 825952 data offset: 1061961728 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 132745216 79872 900 0 30 0 0 0 0 7031111 1 247014836 0 13185 0 0 1] real hdr: [ 1.81386262e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.75069688e+04 1.68753114e+04 0.00000000e+00 1.30179090e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.45824852e-10 -5.88349924e-11 -5.51496314e-11 ..., -1.60560076e-09 -1.74008441e-09 -6.38055894e-07] ----------------------- var 114 record 30 hdr offset: 826464 data offset: 1062600704 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 132825088 79872 900 0 31 0 0 0 0 7031111 1 247171236 0 13185 0 0 1] real hdr: [ 1.95030104e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.88208202e+04 1.81386262e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.83010762e-08 1.40273049e-09 1.79108739e-09 ..., 4.24446589e-11 9.83686604e-11 -2.32768311e-08] ----------------------- var 114 record 31 hdr offset: 826976 data offset: 1063239680 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 132904960 79872 900 0 32 0 0 0 0 7031111 1 247327636 0 13185 0 0 1] real hdr: [ 2.09901876e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.02465990e+04 1.95030104e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.34094655e-08 -1.29451294e-09 -5.21298116e-09 ..., -3.64545116e-10 -3.25033001e-10 6.55971499e-09] ----------------------- var 114 record 32 hdr offset: 827488 data offset: 1063878656 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 132984832 79872 900 0 33 0 0 0 0 7031111 1 247484036 0 13185 0 0 1] real hdr: [ 2.26260817e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.18081366e+04 2.09901876e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 7.04518177e-09 5.99076033e-09 1.77526061e-09 ..., -1.87692201e-12 -1.65634607e-12 4.78233053e-09] ----------------------- var 114 record 33 hdr offset: 828000 data offset: 1064517632 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 133064704 79872 900 0 34 0 0 0 0 7031111 1 247640436 0 13185 0 0 1] real hdr: [ 2.44582854e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.35421836e+04 2.26260817e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -8.96265728e-10 -7.53286156e-10 -6.76214584e-10 ..., 1.29590921e-11 1.56686625e-11 6.01795336e-10] ----------------------- var 114 record 34 hdr offset: 828512 data offset: 1065156608 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 133144576 79872 900 0 35 0 0 0 0 7031111 1 247796836 0 13185 0 0 1] real hdr: [ 2.65836402e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.55209609e+04 2.44582854e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -3.42531753e-10 -7.70860542e-10 -3.15764637e-10 ..., 2.75741582e-11 2.90158956e-11 4.31790692e-09] ----------------------- var 114 record 35 hdr offset: 829024 data offset: 1065795584 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 133224448 79872 900 0 36 0 0 0 0 7031111 1 247953236 0 13185 0 0 1] real hdr: [ 2.92190802e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.79013583e+04 2.65836402e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -5.52874146e-09 1.44941863e-08 7.64403207e-09 ..., 8.85724619e-11 8.41215361e-11 1.95032914e-08] ----------------------- var 114 record 36 hdr offset: 829536 data offset: 1066434560 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 133304320 79872 900 0 37 0 0 0 0 7031111 1 248109636 0 13185 0 0 1] real hdr: [ 3.29086931e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.10638886e+04 2.92190802e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -3.42222890e-08 -3.98754985e-08 -4.19320223e-08 ..., -1.16203219e-11 -2.45597076e-12 1.76940436e-08] ----------------------- var 114 record 37 hdr offset: 830048 data offset: 1067073536 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 133384192 79872 900 0 38 0 0 0 0 7031111 1 248266036 0 13185 0 0 1] real hdr: [ 3.92548336e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.60817633e+04 3.29086931e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -7.21293514e-09 -7.16490201e-09 -4.10498036e-09 ..., -2.21285750e-11 -2.21977089e-11 4.63490668e-09] ----------------------- =============================== var 115: nz = 38, nt = 1 var 115 record 0 hdr offset: 830560 data offset: 1067712512 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 133464064 79872 900 0 1 0 0 0 0 7031111 1 248422436 0 13186 0 0 1] real hdr: [ 2.00003377e+01 9.97716462e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.99820611e+00 0.00000000e+00 9.98858129e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0. 0. 0. ..., 0. 0. 0.] ----------------------- var 115 record 1 hdr offset: 831072 data offset: 1068351488 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 133543936 79872 900 0 2 0 0 0 0 7031111 1 248578376 0 13186 0 0 1] real hdr: [ 8.00013508e+01 9.90881510e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.99988815e+01 2.00003377e+01 9.94296273e-01 9.97716462e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.01719843e-05 -1.19946417e-05 -1.28604888e-05 ..., 6.83290295e-08 -3.94140613e-08 -1.20667671e-08] ----------------------- var 115 record 2 hdr offset: 831584 data offset: 1068990464 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 133623808 79872 900 0 3 0 0 0 0 7031111 1 248734316 0 13186 0 0 1] real hdr: [ 1.79999114e+02 9.79542572e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30000232e+02 8.00013508e+01 9.85203885e-01 9.90881510e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -6.15321915e-05 -8.60634464e-05 -9.69694593e-05 ..., 3.61821648e-08 -8.41283807e-08 -5.48107479e-08] ----------------------- var 115 record 3 hdr offset: 832096 data offset: 1069629440 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 133703680 79872 900 0 4 0 0 0 0 7031111 1 248890256 0 13186 0 0 1] real hdr: [ 3.20001478e+02 9.63777064e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.49998333e+02 1.79999114e+02 9.71644051e-01 9.79542572e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -2.24710268e-04 -1.62499069e-04 -1.89440296e-04 ..., 1.14060247e-10 2.58730815e-11 4.08055756e-10] ----------------------- var 115 record 4 hdr offset: 832608 data offset: 1070268416 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 133783552 79872 900 0 5 0 0 0 0 7031111 1 249046196 0 13186 0 0 1] real hdr: [ 5.00000592e+02 9.43695500e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.10001035e+02 3.20001478e+02 9.53709855e-01 9.63777064e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.95680055e-04 -8.46707189e-05 -1.01054902e-04 ..., 3.20737964e-10 3.31757066e-10 6.52156606e-10] ----------------------- var 115 record 5 hdr offset: 833120 data offset: 1070907392 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 133863424 79872 900 0 6 0 0 0 0 7031111 1 249202136 0 13186 0 0 1] real hdr: [ 7.20000381e+02 9.19438386e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.10000486e+02 5.00000592e+02 9.31527464e-01 9.43695500e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -8.16378853e-10 9.11580145e-09 5.76358516e-09 ..., 3.41347395e-10 3.86696314e-10 3.03111425e-11] ----------------------- var 115 record 6 hdr offset: 833632 data offset: 1071546368 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 133943296 79872 900 0 7 0 0 0 0 7031111 1 249358076 0 13186 0 0 1] real hdr: [ 9.80000846e+02 8.91177995e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.50000613e+02 7.20000381e+02 9.05253051e-01 9.19438386e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 4.67200643e-08 7.96772497e-08 8.10583174e-08 ..., -1.56805628e-11 7.41193010e-11 -5.25404664e-10] ----------------------- var 115 record 7 hdr offset: 834144 data offset: 1072185344 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 134023168 79872 900 0 8 0 0 0 0 7031111 1 249514016 0 13186 0 0 1] real hdr: [ 1.27999806e+03 8.59118341e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.13000142e+03 9.80000846e+02 8.75074549e-01 8.91177995e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 3.05251113e-08 4.69141739e-08 5.56526096e-08 ..., -1.13577137e-09 -1.12455845e-09 3.36527334e-10] ----------------------- var 115 record 8 hdr offset: 834656 data offset: 1072824320 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 134103040 79872 900 0 9 0 0 0 0 7031111 1 249669956 0 13186 0 0 1] real hdr: [ 1.61999988e+03 8.23493502e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.44999897e+03 1.27999806e+03 8.41211628e-01 8.59118341e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 6.71678602e-10 1.75397175e-09 2.98307556e-09 ..., -2.55934163e-09 -3.60529140e-09 1.02521436e-09] ----------------------- var 115 record 9 hdr offset: 835168 data offset: 1073463296 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 134182912 79872 900 0 10 0 0 0 0 7031111 1 249825896 0 13186 0 0 1] real hdr: [ 1.99999844e+03 7.84570542e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81000112e+03 1.61999988e+03 8.03914038e-01 8.23493502e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -4.63006744e-10 -1.61871327e-09 2.65701766e-10 ..., 1.13370504e-08 2.19984830e-09 -3.28821805e-08] ----------------------- var 115 record 10 hdr offset: 835680 data offset: 1074102272 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 134262784 79872 900 0 11 0 0 0 0 7031111 1 249981836 0 13186 0 0 1] real hdr: [ 2.42000161e+03 7.42646223e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.21000002e+03 1.99999844e+03 7.63464495e-01 7.84570542e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.12896448e-09 -6.43299303e-10 2.34743908e-11 ..., 9.08057061e-08 4.86020326e-08 -1.90943581e-07] ----------------------- var 115 record 11 hdr offset: 836192 data offset: 1074741248 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 134342656 79872 900 0 12 0 0 0 0 7031111 1 250137776 0 13186 0 0 1] real hdr: [ 2.88000152e+03 6.98050213e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.64999960e+03 2.42000161e+03 7.20175811e-01 7.42646223e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.39243550e-08 -3.17600914e-08 -3.08180361e-08 ..., 7.53349028e-08 4.01401117e-08 -1.52027710e-07] ----------------------- var 115 record 12 hdr offset: 836704 data offset: 1075380224 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 134422528 79872 900 0 13 0 0 0 0 7031111 1 250293716 0 13186 0 0 1] real hdr: [ 3.37999819e+03 6.51142688e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.12999986e+03 2.88000152e+03 6.74392534e-01 6.98050213e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.66737568e-09 -5.83604205e-08 -6.82848906e-08 ..., -5.05653408e-10 4.59558336e-10 6.05016259e-09] ----------------------- var 115 record 13 hdr offset: 837216 data offset: 1076019200 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 134502400 79872 900 0 14 0 0 0 0 7031111 1 250449656 0 13186 0 0 1] real hdr: [ 3.91999946e+03 6.02314441e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.65000079e+03 3.37999819e+03 6.26490534e-01 6.51142688e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.16488552e-08 -1.48380188e-08 -2.91496836e-08 ..., -1.60291014e-09 -1.25713673e-09 1.18600652e-09] ----------------------- var 115 record 14 hdr offset: 837728 data offset: 1076658176 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 134582272 79872 900 0 15 0 0 0 0 7031111 1 250605596 0 13186 0 0 1] real hdr: [ 4.50000140e+03 5.51988701e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.20999847e+03 3.91999946e+03 5.76877346e-01 6.02314441e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.27501201e-08 5.38639995e-08 3.90671957e-08 ..., -1.59466595e-09 1.77782900e-09 4.72441331e-09] ----------------------- var 115 record 15 hdr offset: 838240 data offset: 1077297152 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 134662144 79872 900 0 16 0 0 0 0 7031111 1 250761536 0 13186 0 0 1] real hdr: [ 5.12000009e+03 5.00619965e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.81000075e+03 4.50000140e+03 5.25990788e-01 5.51988701e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.50004575e-09 1.61764806e-08 1.43924090e-08 ..., 1.69669812e-09 1.08973301e-08 2.78647527e-09] ----------------------- var 115 record 16 hdr offset: 838752 data offset: 1077936128 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 134742016 79872 900 0 17 0 0 0 0 7031111 1 250917476 0 13186 0 0 1] real hdr: [ 5.77999946e+03 4.48693382e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.44999978e+03 5.12000009e+03 4.74301366e-01 5.00619965e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 7.62570309e-08 1.18451410e-07 1.11576320e-07 ..., 1.09898179e-09 1.98685224e-09 -9.53393808e-10] ----------------------- var 115 record 17 hdr offset: 839264 data offset: 1078575104 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 134821888 79872 900 0 18 0 0 0 0 7031111 1 251073416 0 13186 0 0 1] real hdr: [ 6.47999950e+03 3.96725773e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.12999948e+03 5.77999946e+03 4.22309896e-01 4.48693382e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 7.94209214e-08 1.35693099e-07 1.32405788e-07 ..., 1.27600996e-09 1.26589150e-09 -1.43636847e-09] ----------------------- var 115 record 18 hdr offset: 839776 data offset: 1079214080 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 134901760 79872 900 0 19 0 0 0 0 7031111 1 251229356 0 13186 0 0 1] real hdr: [ 7.22000022e+03 3.45265283e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.84999986e+03 6.47999950e+03 3.70548863e-01 3.96725773e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -8.26900077e-08 -9.90455987e-07 -8.22080722e-07 ..., 1.46683266e-09 2.02428829e-09 -1.38542344e-09] ----------------------- var 115 record 19 hdr offset: 840288 data offset: 1079853056 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 134981632 79872 900 0 20 0 0 0 0 7031111 1 251385296 0 13186 0 0 1] real hdr: [ 8.00000162e+03 2.94891378e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.61000092e+03 7.22000022e+03 3.19582071e-01 3.45265283e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.26206373e-06 -4.31680246e-06 -2.92576829e-06 ..., 9.22991517e-10 1.24542998e-09 -9.58440216e-10] ----------------------- var 115 record 20 hdr offset: 840800 data offset: 1080492032 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 135061504 79872 900 0 21 0 0 0 0 7031111 1 251541236 0 13186 0 0 1] real hdr: [ 8.81999976e+03 2.46215071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.40999873e+03 8.00000162e+03 2.70004882e-01 2.94891378e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -2.14643842e-06 -6.61272315e-06 -4.35538641e-06 ..., 6.77502110e-10 1.18397125e-09 -4.39708048e-10] ----------------------- var 115 record 21 hdr offset: 841312 data offset: 1081131008 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 135141376 79872 900 0 22 0 0 0 0 7031111 1 251697176 0 13186 0 0 1] real hdr: [ 9.67999858e+03 1.99878209e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.25000113e+03 8.81999976e+03 2.22443261e-01 2.46215071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -2.51415531e-06 -1.27860985e-05 -1.04550791e-05 ..., 3.19053568e-11 2.43911974e-10 5.66172248e-11] ----------------------- var 115 record 22 hdr offset: 841824 data offset: 1081769984 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 135221248 79872 900 0 23 0 0 0 0 7031111 1 251853116 0 13186 0 0 1] real hdr: [ 1.05799981e+04 1.56554224e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.01300003e+04 9.67999858e+03 1.77555424e-01 1.99878209e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.53197254e-06 -2.67669179e-06 -2.98977625e-06 ..., -4.43331316e-10 -1.30061059e-10 1.42864376e-09] ----------------------- var 115 record 23 hdr offset: 842336 data offset: 1082408960 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 135301120 79872 900 0 24 0 0 0 0 7031111 1 252009056 0 13186 0 0 1] real hdr: [ 1.15199982e+04 1.16947874e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.10500001e+04 1.05799981e+04 1.36030234e-01 1.56554224e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.04805883e-06 -2.36293636e-06 -2.31209447e-06 ..., 8.56690829e-10 1.08778442e-09 4.28980636e-11] ----------------------- var 115 record 24 hdr offset: 842848 data offset: 1083047936 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 135380992 79872 900 0 25 0 0 0 0 7031111 1 252164996 0 13186 0 0 1] real hdr: [ 1.24999991e+04 8.17952369e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.20100006e+04 1.15199982e+04 9.85881076e-02 1.16947874e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -2.45241807e-07 -7.80932510e-07 -7.84448616e-07 ..., 7.69126873e-10 7.24077576e-10 9.20058918e-10] ----------------------- var 115 record 25 hdr offset: 843360 data offset: 1083686912 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 135460864 79872 900 0 26 0 0 0 0 7031111 1 252320936 0 13186 0 0 1] real hdr: [ 1.35200006e+04 5.18637157e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30100018e+04 1.24999991e+04 6.59807861e-02 8.17952369e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -2.51205279e-08 -2.82507813e-08 -2.01602628e-08 ..., 7.05077374e-09 1.61591700e-08 6.36381259e-09] ----------------------- var 115 record 26 hdr offset: 843872 data offset: 1084325888 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 135540736 79872 900 0 27 0 0 0 0 7031111 1 252476876 0 13186 0 0 1] real hdr: [ 1.45807997e+04 2.79368177e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.40504001e+04 1.35200006e+04 3.89823900e-02 5.18637157e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.93272935e-08 1.63423035e-08 1.50578749e-08 ..., 1.91732639e-08 2.89540694e-08 2.53288981e-08] ----------------------- var 115 record 27 hdr offset: 844384 data offset: 1084964864 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 135620608 79872 900 0 28 0 0 0 0 7031111 1 252632816 0 13186 0 0 1] real hdr: [ 1.56946399e+04 1.07164793e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.51377198e+04 1.45807997e+04 1.83146873e-02 2.79368177e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.26125414e-07 -4.88540820e-07 -4.53036051e-07 ..., 2.07764694e-09 2.09627071e-09 8.57275195e-10] ----------------------- var 115 record 28 hdr offset: 844896 data offset: 1085603840 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 135700480 79872 900 0 29 0 0 0 0 7031111 1 252788756 0 13186 0 0 1] real hdr: [ 1.68753114e+04 1.30179090e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.62849737e+04 1.56946399e+04 4.87210933e-03 1.07164793e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -3.56467800e-10 -6.39659845e-08 -1.07719579e-07 ..., 4.07096606e-10 7.78625386e-10 3.04783554e-09] ----------------------- var 115 record 29 hdr offset: 845408 data offset: 1086242816 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 135780352 79872 900 0 30 0 0 0 0 7031111 1 252944696 0 13186 0 0 1] real hdr: [ 1.81386262e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.75069688e+04 1.68753114e+04 0.00000000e+00 1.30179090e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.98163019e-09 -1.79194448e-09 -1.39505396e-09 ..., -7.40359996e-10 -1.22158050e-09 -5.06581332e-10] ----------------------- var 115 record 30 hdr offset: 845920 data offset: 1086881792 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 135860224 79872 900 0 31 0 0 0 0 7031111 1 253100636 0 13186 0 0 1] real hdr: [ 1.95030104e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.88208202e+04 1.81386262e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 2.13296882e-08 4.07779979e-08 3.73307998e-08 ..., 6.42558090e-11 9.95137930e-11 9.26476673e-11] ----------------------- var 115 record 31 hdr offset: 846432 data offset: 1087520768 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 135940096 79872 900 0 32 0 0 0 0 7031111 1 253256576 0 13186 0 0 1] real hdr: [ 2.09901876e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.02465990e+04 1.95030104e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -3.69765374e-08 -5.89140114e-08 -5.52149970e-08 ..., -1.98274470e-11 1.33368891e-12 2.41594245e-10] ----------------------- var 115 record 32 hdr offset: 846944 data offset: 1088159744 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 136019968 79872 900 0 33 0 0 0 0 7031111 1 253412516 0 13186 0 0 1] real hdr: [ 2.26260817e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.18081366e+04 2.09901876e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.51739457e-08 -2.07549142e-08 -2.00357615e-08 ..., -9.43124138e-12 -1.22974348e-11 -1.30845734e-11] ----------------------- var 115 record 33 hdr offset: 847456 data offset: 1088798720 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 136099840 79872 900 0 34 0 0 0 0 7031111 1 253568456 0 13186 0 0 1] real hdr: [ 2.44582854e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.35421836e+04 2.26260817e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.17094656e-09 -1.87022509e-09 -2.20714713e-09 ..., 1.01160616e-12 1.38853685e-12 -5.50756272e-13] ----------------------- var 115 record 34 hdr offset: 847968 data offset: 1089437696 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 136179712 79872 900 0 35 0 0 0 0 7031111 1 253724396 0 13186 0 0 1] real hdr: [ 2.65836402e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.55209609e+04 2.44582854e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 1.07649789e-09 2.45892595e-09 3.17589910e-09 ..., 4.29374765e-12 5.08894446e-12 3.38548482e-12] ----------------------- var 115 record 35 hdr offset: 848480 data offset: 1090076672 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 136259584 79872 900 0 36 0 0 0 0 7031111 1 253880336 0 13186 0 0 1] real hdr: [ 2.92190802e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.79013583e+04 2.65836402e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.48197890e-08 -3.71386406e-08 -5.16296801e-08 ..., -3.68910562e-11 -3.37314031e-11 -3.57847120e-11] ----------------------- var 115 record 36 hdr offset: 848992 data offset: 1090715648 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 136339456 79872 900 0 37 0 0 0 0 7031111 1 254036276 0 13186 0 0 1] real hdr: [ 3.29086931e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.10638886e+04 2.92190802e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 5.85085367e-08 8.52298001e-08 1.04498618e-07 ..., 3.76878785e-13 -5.01587704e-12 1.15981389e-12] ----------------------- var 115 record 37 hdr offset: 849504 data offset: 1091354624 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 136419328 79872 900 0 38 0 0 0 0 7031111 1 254192216 0 13186 0 0 1] real hdr: [ 3.92548336e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.60817633e+04 3.29086931e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ -1.25546915e-08 -4.19233857e-08 -6.14168414e-08 ..., -1.18832938e-11 -2.64744932e-12 4.04766325e-12] ----------------------- =============================== var 116: nz = 38, nt = 1 var 116 record 0 hdr offset: 850016 data offset: 1091993600 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 136499200 79872 900 0 1 0 0 0 0 7031111 1 254348156 0 30181 0 0 1] real hdr: [ 4.99988815e+01 9.94296273e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.00003377e+01 0.00000000e+00 9.97716462e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.82943347e-07 2.82631703e-07 2.82479164e-07 ..., -7.67044141e-04 -1.51258660e-04 -7.19355739e-05] ----------------------- var 116 record 1 hdr offset: 850528 data offset: 1092632576 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 136579072 79872 900 0 2 0 0 0 0 7031111 1 254504556 0 30181 0 0 1] real hdr: [ 1.30000232e+02 9.85203885e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00013508e+01 4.99988815e+01 9.90881510e-01 9.94296273e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.96111539e-04 -5.76448743e-04 -5.40205103e-04 ..., -9.16334521e-03 -4.29588743e-02 6.25908724e-05] ----------------------- var 116 record 2 hdr offset: 851040 data offset: 1093271552 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 136658944 79872 900 0 3 0 0 0 0 7031111 1 254660956 0 30181 0 0 1] real hdr: [ 2.49998333e+02 9.71644051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.79999114e+02 1.30000232e+02 9.79542572e-01 9.85203885e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -5.83806195e-06 -6.94418486e-05 -1.13075679e-04 ..., 1.57451804e-03 6.13702054e-04 -4.59248287e-04] ----------------------- var 116 record 3 hdr offset: 851552 data offset: 1093910528 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 136738816 79872 900 0 4 0 0 0 0 7031111 1 254817356 0 30181 0 0 1] real hdr: [ 4.10001035e+02 9.53709855e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.20001478e+02 2.49998333e+02 9.63777064e-01 9.71644051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.0001412 0.00044457 0.00044175 ..., 0.00213116 -0.000519 0.00041725] ----------------------- var 116 record 4 hdr offset: 852064 data offset: 1094549504 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 136818688 79872 900 0 5 0 0 0 0 7031111 1 254973756 0 30181 0 0 1] real hdr: [ 6.10000486e+02 9.31527464e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.00000592e+02 4.10001035e+02 9.43695500e-01 9.53709855e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.80478998e-04 1.89797764e-04 7.40375253e-05 ..., 1.96721777e-03 -1.32012868e-03 -2.50983983e-03] ----------------------- var 116 record 5 hdr offset: 852576 data offset: 1095188480 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 136898560 79872 900 0 6 0 0 0 0 7031111 1 255130156 0 30181 0 0 1] real hdr: [ 8.50000613e+02 9.05253051e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.20000381e+02 6.10000486e+02 9.19438386e-01 9.31527464e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 8.14370287e-05 2.79155229e-05 -8.11762147e-05 ..., -2.13200459e-03 -2.05822056e-03 -4.85333090e-04] ----------------------- var 116 record 6 hdr offset: 853088 data offset: 1095827456 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 136978432 79872 900 0 7 0 0 0 0 7031111 1 255286556 0 30181 0 0 1] real hdr: [ 1.13000142e+03 8.75074549e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.80000846e+02 8.50000613e+02 8.91177995e-01 9.05253051e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.10495093e-04 5.72768913e-05 1.78951068e-05 ..., -3.51072522e-05 3.03329056e-04 9.95686860e-04] ----------------------- var 116 record 7 hdr offset: 853600 data offset: 1096466432 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 137058304 79872 900 0 8 0 0 0 0 7031111 1 255442956 0 30181 0 0 1] real hdr: [ 1.44999897e+03 8.41211628e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.27999806e+03 1.13000142e+03 8.59118341e-01 8.75074549e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -7.98911205e-05 6.20597621e-06 1.28612548e-04 ..., -6.57008728e-04 -4.00461140e-04 1.43620549e-04] ----------------------- var 116 record 8 hdr offset: 854112 data offset: 1097105408 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 137138176 79872 900 0 9 0 0 0 0 7031111 1 255599356 0 30181 0 0 1] real hdr: [ 1.81000112e+03 8.03914038e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.61999988e+03 1.44999897e+03 8.23493502e-01 8.41211628e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -6.11513606e-05 7.70230108e-05 1.53253975e-04 ..., -1.56337151e-03 -1.21981895e-03 -1.05784333e-04] ----------------------- var 116 record 9 hdr offset: 854624 data offset: 1097744384 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 137218048 79872 900 0 10 0 0 0 0 7031111 1 255755756 0 30181 0 0 1] real hdr: [ 2.21000002e+03 7.63464495e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.99999844e+03 1.81000112e+03 7.84570542e-01 8.03914038e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00022818 0.00030911 0.00019314 ..., 0.00052674 0.00047954 0.00011639] ----------------------- var 116 record 10 hdr offset: 855136 data offset: 1098383360 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 137297920 79872 900 0 11 0 0 0 0 7031111 1 255912156 0 30181 0 0 1] real hdr: [ 2.64999960e+03 7.20175811e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.42000161e+03 2.21000002e+03 7.42646223e-01 7.63464495e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.54862806e-04 2.33367216e-04 4.37326293e-04 ..., 1.50326407e-03 1.12059715e-05 -1.35951198e-03] ----------------------- var 116 record 11 hdr offset: 855648 data offset: 1099022336 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 137377792 79872 900 0 12 0 0 0 0 7031111 1 256068556 0 30181 0 0 1] real hdr: [ 3.12999986e+03 6.74392534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.88000152e+03 2.64999960e+03 6.98050213e-01 7.20175811e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00053446 0.0003309 0.0003718 ..., 0.0814073 0.08152538 0.00130582] ----------------------- var 116 record 12 hdr offset: 856160 data offset: 1099661312 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 137457664 79872 900 0 13 0 0 0 0 7031111 1 256224956 0 30181 0 0 1] real hdr: [ 3.65000079e+03 6.26490534e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.37999819e+03 3.12999986e+03 6.51142688e-01 6.74392534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00038889 0.00044314 0.00034152 ..., -0.00118336 0.00703177 0.03138081] ----------------------- var 116 record 13 hdr offset: 856672 data offset: 1100300288 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 137537536 79872 900 0 14 0 0 0 0 7031111 1 256381356 0 30181 0 0 1] real hdr: [ 4.20999847e+03 5.76877346e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.91999946e+03 3.65000079e+03 6.02314441e-01 6.26490534e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00250412 -0.00357226 -0.00024445 ..., 0.03892733 0.13628259 0.20435472] ----------------------- var 116 record 14 hdr offset: 857184 data offset: 1100939264 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 137617408 79872 900 0 15 0 0 0 0 7031111 1 256537756 0 30181 0 0 1] real hdr: [ 4.81000075e+03 5.25990788e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.50000140e+03 4.20999847e+03 5.51988701e-01 5.76877346e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00628127 -0.01780905 0.00045502 ..., -0.00019372 -0.00037178 -0.00085232] ----------------------- var 116 record 15 hdr offset: 857696 data offset: 1101578240 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 137697280 79872 900 0 16 0 0 0 0 7031111 1 256694156 0 30181 0 0 1] real hdr: [ 5.44999978e+03 4.74301366e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.12000009e+03 4.81000075e+03 5.00619965e-01 5.25990788e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00017758 -0.00010898 0.00020012 ..., 0.00013374 -0.00067598 -0.00064645] ----------------------- var 116 record 16 hdr offset: 858208 data offset: 1102217216 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 137777152 79872 900 0 17 0 0 0 0 7031111 1 256850556 0 30181 0 0 1] real hdr: [ 6.12999948e+03 4.22309896e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.77999946e+03 5.44999978e+03 4.48693382e-01 4.74301366e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.17129959e-04 1.54763227e-04 6.03517947e-05 ..., -3.44843837e-04 -3.12518911e-04 -8.51672813e-02] ----------------------- var 116 record 17 hdr offset: 858720 data offset: 1102856192 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 137857024 79872 900 0 18 0 0 0 0 7031111 1 257006956 0 30181 0 0 1] real hdr: [ 6.84999986e+03 3.70548863e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.47999950e+03 6.12999948e+03 3.96725773e-01 4.22309896e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00054344 -0.00048722 -0.00062986 ..., 0.02800661 0.01236946 -0.03300723] ----------------------- var 116 record 18 hdr offset: 859232 data offset: 1103495168 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 137936896 79872 900 0 19 0 0 0 0 7031111 1 257163356 0 30181 0 0 1] real hdr: [ 7.61000092e+03 3.19582071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.22000022e+03 6.84999986e+03 3.45265283e-01 3.70548863e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00086717 0.00086914 0.0010519 ..., -0.02607399 0.00386426 -0.0078873 ] ----------------------- var 116 record 19 hdr offset: 859744 data offset: 1104134144 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 138016768 79872 900 0 20 0 0 0 0 7031111 1 257319756 0 30181 0 0 1] real hdr: [ 8.40999873e+03 2.70004882e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.00000162e+03 7.61000092e+03 2.94891378e-01 3.19582071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00019707 -0.00024024 -0.00023394 ..., 0.01420664 0.00086563 0.00030448] ----------------------- var 116 record 20 hdr offset: 860256 data offset: 1104773120 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 138096640 79872 900 0 21 0 0 0 0 7031111 1 257476156 0 30181 0 0 1] real hdr: [ 9.25000113e+03 2.22443261e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.81999976e+03 8.40999873e+03 2.46215071e-01 2.70004882e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 9.15297496e-05 9.79519682e-05 1.31451234e-04 ..., 1.15877716e-03 6.26715715e-04 -1.99855072e-04] ----------------------- var 116 record 21 hdr offset: 860768 data offset: 1105412096 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 138176512 79872 900 0 22 0 0 0 0 7031111 1 257632556 0 30181 0 0 1] real hdr: [ 1.01300003e+04 1.77555424e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.67999858e+03 9.25000113e+03 1.99878209e-01 2.22443261e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.70637077e-04 1.66603422e-04 -8.74894395e-05 ..., -3.68690758e-04 -5.00945200e-04 -3.14247678e-04] ----------------------- var 116 record 22 hdr offset: 861280 data offset: 1106051072 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 138256384 79872 900 0 23 0 0 0 0 7031111 1 257788956 0 30181 0 0 1] real hdr: [ 1.10500001e+04 1.36030234e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.05799981e+04 1.01300003e+04 1.56554224e-01 1.77555424e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.17870387e-04 1.61369171e-04 -1.94307518e-06 ..., 2.11262886e-04 2.10468381e-04 3.28921160e-04] ----------------------- var 116 record 23 hdr offset: 861792 data offset: 1106690048 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 138336256 79872 900 0 24 0 0 0 0 7031111 1 257945356 0 30181 0 0 1] real hdr: [ 1.20100006e+04 9.85881076e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.15199982e+04 1.10500001e+04 1.16947874e-01 1.36030234e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 7.34729183e-05 2.11582337e-05 5.21610491e-05 ..., 5.28474397e-04 7.45879312e-04 9.36757715e-04] ----------------------- var 116 record 24 hdr offset: 862304 data offset: 1107329024 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 138416128 79872 900 0 25 0 0 0 0 7031111 1 258101756 0 30181 0 0 1] real hdr: [ 1.30100018e+04 6.59807861e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.24999991e+04 1.20100006e+04 8.17952369e-02 9.85881076e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00048107 -0.0007924 -0.00066554 ..., 0.2165087 0.08290058 -0.0011714 ] ----------------------- var 116 record 25 hdr offset: 862816 data offset: 1107968000 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 138496000 79872 900 0 26 0 0 0 0 7031111 1 258258156 0 30181 0 0 1] real hdr: [ 1.40504001e+04 3.89823900e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.35200006e+04 1.30100018e+04 5.18637157e-02 6.59807861e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00018112 -0.00068936 -0.00149939 ..., -0.00049486 -0.00043867 -0.00019472] ----------------------- var 116 record 26 hdr offset: 863328 data offset: 1108606976 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 138575872 79872 900 0 27 0 0 0 0 7031111 1 258414556 0 30181 0 0 1] real hdr: [ 1.51377198e+04 1.83146873e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.45807997e+04 1.40504001e+04 2.79368177e-02 3.89823900e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00202992 -0.00203857 -0.00237884 ..., -0.00094897 -0.00062818 -0.00083318] ----------------------- var 116 record 27 hdr offset: 863840 data offset: 1109245952 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 138655744 79872 900 0 28 0 0 0 0 7031111 1 258570956 0 30181 0 0 1] real hdr: [ 1.62849737e+04 4.87210933e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.56946399e+04 1.51377198e+04 1.07164793e-02 1.83146873e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.04371235e-04 4.56932205e-04 6.95978408e-04 ..., 3.45712848e-04 9.55970827e-05 -3.55904223e-04] ----------------------- var 116 record 28 hdr offset: 864352 data offset: 1109884928 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 138735616 79872 900 0 29 0 0 0 0 7031111 1 258727356 0 30181 0 0 1] real hdr: [ 1.75069688e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.68753114e+04 1.62849737e+04 1.30179090e-03 4.87210933e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 7.17256917e-04 4.23661113e-04 8.59357024e-05 ..., -6.07021339e-02 2.11298466e-02 3.32333222e-02] ----------------------- var 116 record 29 hdr offset: 864864 data offset: 1110523904 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 138815488 79872 900 0 30 0 0 0 0 7031111 1 258883756 0 30181 0 0 1] real hdr: [ 1.88208202e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81386262e+04 1.75069688e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.21290059e-05 1.89336351e-05 -4.35919064e-05 ..., -1.25574865e-04 -1.14472423e-04 -1.05451094e-04] ----------------------- var 116 record 30 hdr offset: 865376 data offset: 1111162880 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 138895360 79872 900 0 31 0 0 0 0 7031111 1 259040156 0 30181 0 0 1] real hdr: [ 2.02465990e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.95030104e+04 1.88208202e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -3.83066363e-03 2.36827938e-04 1.83467942e-04 ..., -1.19118158e-04 -7.96292588e-05 -3.67979628e-05] ----------------------- var 116 record 31 hdr offset: 865888 data offset: 1111801856 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 138975232 79872 900 0 32 0 0 0 0 7031111 1 259196556 0 30181 0 0 1] real hdr: [ 2.18081366e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.09901876e+04 2.02465990e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.24609396e-02 -9.26208624e-04 5.91514632e-04 ..., 2.42535352e-05 -1.39621152e-05 -5.48983335e-05] ----------------------- var 116 record 32 hdr offset: 866400 data offset: 1112440832 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 139055104 79872 900 0 33 0 0 0 0 7031111 1 259352956 0 30181 0 0 1] real hdr: [ 2.35421836e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.26260817e+04 2.18081366e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00868215 0.00739981 0.00464716 ..., -0.00039014 -0.00036211 -0.00025247] ----------------------- var 116 record 33 hdr offset: 866912 data offset: 1113079808 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 139134976 79872 900 0 34 0 0 0 0 7031111 1 259509356 0 30181 0 0 1] real hdr: [ 2.55209609e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.44582854e+04 2.35421836e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.02264193 -0.01933589 0.02141335 ..., -0.0001423 -0.00022869 -0.0003309 ] ----------------------- var 116 record 34 hdr offset: 867424 data offset: 1113718784 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 139214848 79872 900 0 35 0 0 0 0 7031111 1 259665756 0 30181 0 0 1] real hdr: [ 2.79013583e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.65836402e+04 2.55209609e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.00087783 -0.00086724 -0.00071804 ..., 0.00034581 0.00114422 0.00116335] ----------------------- var 116 record 35 hdr offset: 867936 data offset: 1114357760 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 139294720 79872 900 0 36 0 0 0 0 7031111 1 259822156 0 30181 0 0 1] real hdr: [ 3.10638886e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.92190802e+04 2.79013583e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00018076 0.00018554 0.00020379 ..., 0.00132739 0.0013075 0.00128129] ----------------------- var 116 record 36 hdr offset: 868448 data offset: 1114996736 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 139374592 79872 900 0 37 0 0 0 0 7031111 1 259978556 0 30181 0 0 1] real hdr: [ 3.60817633e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.29086931e+04 3.10638886e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.00085313 0.00055053 0.00083139 ..., -0.0032429 -0.00305993 -0.00304384] ----------------------- var 116 record 37 hdr offset: 868960 data offset: 1115635712 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 16 0 128 65 0 387757194 139454464 79872 900 0 38 0 0 0 0 7031111 1 260134956 0 30181 0 0 1] real hdr: [ 4.24279038e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.92548336e+04 3.60817633e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -5.11823571e-04 -5.90320618e-04 -5.06894081e-04 ..., 2.24441510e-06 2.24391647e-06 2.24354153e-06] ----------------------- =============================== var 117: nz = 38, nt = 1 var 117 record 0 hdr offset: 869472 data offset: 1116274688 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 139534336 79872 900 0 1 0 0 0 0 7031111 1 260291356 0 30185 0 0 1] real hdr: [ 2.00003377e+01 9.97716462e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.99820611e+00 0.00000000e+00 9.98858129e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.09088496 0.09096773 0.0916165 ..., 0.00499184 0.00419372 0.00331351] ----------------------- var 117 record 1 hdr offset: 869984 data offset: 1116913664 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 139614208 79872 900 0 2 0 0 0 0 7031111 1 260447756 0 30185 0 0 1] real hdr: [ 8.00013508e+01 9.90881510e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.99988815e+01 2.00003377e+01 9.94296273e-01 9.97716462e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.03764519 -0.03811497 -0.03808827 ..., -0.00590679 -0.00542653 -0.00490081] ----------------------- var 117 record 2 hdr offset: 870496 data offset: 1117552640 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 139694080 79872 900 0 3 0 0 0 0 7031111 1 260604156 0 30185 0 0 1] real hdr: [ 1.79999114e+02 9.79542572e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30000232e+02 8.00013508e+01 9.85203885e-01 9.90881510e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.04393993 -0.044388 -0.04373556 ..., -0.00578483 -0.00646738 -0.00631182] ----------------------- var 117 record 3 hdr offset: 871008 data offset: 1118191616 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 139773952 79872 900 0 4 0 0 0 0 7031111 1 260760556 0 30185 0 0 1] real hdr: [ 3.20001478e+02 9.63777064e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.49998333e+02 1.79999114e+02 9.71644051e-01 9.79542572e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-0.01982962 -0.02057952 -0.02040471 ..., -0.00243128 -0.0037522 -0.00426623] ----------------------- var 117 record 4 hdr offset: 871520 data offset: 1118830592 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 139853824 79872 900 0 5 0 0 0 0 7031111 1 260916956 0 30185 0 0 1] real hdr: [ 5.00000592e+02 9.43695500e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.10001035e+02 3.20001478e+02 9.53709855e-01 9.63777064e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 0.01782788 0.01652651 0.01616822 ..., 0.01001156 0.01083638 0.0106103 ] ----------------------- var 117 record 5 hdr offset: 872032 data offset: 1119469568 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 139933696 79872 900 0 6 0 0 0 0 7031111 1 261073356 0 30185 0 0 1] real hdr: [ 7.20000381e+02 9.19438386e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.10000486e+02 5.00000592e+02 9.31527464e-01 9.43695500e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.42666642e-02 -1.50312092e-02 -1.50254341e-02 ..., 2.78302025e-07 2.71771199e-07 2.76893417e-07] ----------------------- var 117 record 6 hdr offset: 872544 data offset: 1120108544 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 140013568 79872 900 0 7 0 0 0 0 7031111 1 261229756 0 30185 0 0 1] real hdr: [ 9.80000846e+02 8.91177995e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.50000613e+02 7.20000381e+02 9.05253051e-01 9.19438386e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.53841479e-02 -1.54893342e-02 -1.55932121e-02 ..., 2.10549885e-07 2.14200909e-07 2.29496834e-07] ----------------------- var 117 record 7 hdr offset: 873056 data offset: 1120747520 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 140093440 79872 900 0 8 0 0 0 0 7031111 1 261386156 0 30185 0 0 1] real hdr: [ 1.27999806e+03 8.59118341e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.13000142e+03 9.80000846e+02 8.75074549e-01 8.91177995e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -6.70276908e-03 -5.61587187e-03 -5.83112985e-03 ..., 3.57411807e-07 4.59464417e-07 5.04562479e-07] ----------------------- var 117 record 8 hdr offset: 873568 data offset: 1121386496 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 140173312 79872 900 0 9 0 0 0 0 7031111 1 261542556 0 30185 0 0 1] real hdr: [ 1.61999988e+03 8.23493502e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.44999897e+03 1.27999806e+03 8.41211628e-01 8.59118341e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.24586057e-03 5.69247315e-03 5.39578963e-03 ..., 3.69945326e-07 3.48436714e-07 2.61149978e-07] ----------------------- var 117 record 9 hdr offset: 874080 data offset: 1122025472 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 140253184 79872 900 0 10 0 0 0 0 7031111 1 261698956 0 30185 0 0 1] real hdr: [ 1.99999844e+03 7.84570542e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81000112e+03 1.61999988e+03 8.03914038e-01 8.23493502e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.24381951e-03 6.78262394e-03 6.73087547e-03 ..., 1.55880230e-06 1.15036130e-06 -2.27891263e-07] ----------------------- var 117 record 10 hdr offset: 874592 data offset: 1122664448 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 140333056 79872 900 0 11 0 0 0 0 7031111 1 261855356 0 30185 0 0 1] real hdr: [ 2.42000161e+03 7.42646223e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.21000002e+03 1.99999844e+03 7.63464495e-01 7.84570542e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -5.61073609e-03 -3.08310846e-03 -3.28687835e-03 ..., 2.94438848e-07 -1.04016941e-07 -6.55776557e-06] ----------------------- var 117 record 11 hdr offset: 875104 data offset: 1123303424 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 140412928 79872 900 0 12 0 0 0 0 7031111 1 262011756 0 30185 0 0 1] real hdr: [ 2.88000152e+03 6.98050213e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.64999960e+03 2.42000161e+03 7.20175811e-01 7.42646223e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -7.76495924e-03 -6.01524347e-03 -6.35142252e-03 ..., -2.09098312e-06 -1.53717076e-06 -1.04092933e-05] ----------------------- var 117 record 12 hdr offset: 875616 data offset: 1123942400 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 140492800 79872 900 0 13 0 0 0 0 7031111 1 262168156 0 30185 0 0 1] real hdr: [ 3.37999819e+03 6.51142688e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.12999986e+03 2.88000152e+03 6.74392534e-01 6.98050213e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -5.45797730e-03 -4.16858867e-03 -4.49406216e-03 ..., -4.04089036e-07 -2.65711833e-07 -3.55042880e-06] ----------------------- var 117 record 13 hdr offset: 876128 data offset: 1124581376 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 140572672 79872 900 0 14 0 0 0 0 7031111 1 262324556 0 30185 0 0 1] real hdr: [ 3.91999946e+03 6.02314441e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.65000079e+03 3.37999819e+03 6.26490534e-01 6.51142688e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.58274884e-03 -6.25883753e-04 -9.45692009e-04 ..., -2.72252620e-08 -2.45807179e-08 -5.00720887e-07] ----------------------- var 117 record 14 hdr offset: 876640 data offset: 1125220352 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 140652544 79872 900 0 15 0 0 0 0 7031111 1 262480956 0 30185 0 0 1] real hdr: [ 4.50000140e+03 5.51988701e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.20999847e+03 3.91999946e+03 5.76877346e-01 6.02314441e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.51687071e-03 5.49141178e-03 5.19849453e-03 ..., -5.92438596e-07 -4.96708424e-07 -4.04937691e-06] ----------------------- var 117 record 15 hdr offset: 877152 data offset: 1125859328 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 140732416 79872 900 0 16 0 0 0 0 7031111 1 262637356 0 30185 0 0 1] real hdr: [ 5.12000009e+03 5.00619965e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.81000075e+03 4.50000140e+03 5.25990788e-01 5.51988701e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 4.96360660e-03 6.12360518e-03 5.79770049e-03 ..., 6.83644316e-07 5.91527169e-07 -2.76852552e-06] ----------------------- var 117 record 16 hdr offset: 877664 data offset: 1126498304 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 140812288 79872 900 0 17 0 0 0 0 7031111 1 262793756 0 30185 0 0 1] real hdr: [ 5.77999946e+03 4.48693382e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.44999978e+03 5.12000009e+03 4.74301366e-01 5.00619965e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.13494168e-03 4.08936664e-03 3.71358683e-03 ..., 3.00723180e-08 1.58610209e-08 -8.97341863e-07] ----------------------- var 117 record 17 hdr offset: 878176 data offset: 1127137280 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 140892160 79872 900 0 18 0 0 0 0 7031111 1 262950156 0 30185 0 0 1] real hdr: [ 6.47999950e+03 3.96725773e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.12999948e+03 5.77999946e+03 4.22309896e-01 4.48693382e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 3.02755297e-03 3.27411247e-03 2.93605844e-03 ..., -5.31611333e-09 -8.92686369e-09 -2.61026742e-07] ----------------------- var 117 record 18 hdr offset: 878688 data offset: 1127776256 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 140972032 79872 900 0 19 0 0 0 0 7031111 1 263106556 0 30185 0 0 1] real hdr: [ 7.22000022e+03 3.45265283e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.84999986e+03 6.47999950e+03 3.70548863e-01 3.96725773e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -3.22690955e-03 -2.88350973e-03 -3.27635556e-03 ..., 1.61605684e-09 2.03103978e-09 -1.49824864e-08] ----------------------- var 117 record 19 hdr offset: 879200 data offset: 1128415232 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 141051904 79872 900 0 20 0 0 0 0 7031111 1 263262956 0 30185 0 0 1] real hdr: [ 8.00000162e+03 2.94891378e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.61000092e+03 7.22000022e+03 3.19582071e-01 3.45265283e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -8.32297653e-03 -7.58305052e-03 -7.94964936e-03 ..., -2.30370834e-09 -3.03144265e-09 -2.58872017e-08] ----------------------- var 117 record 20 hdr offset: 879712 data offset: 1129054208 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 141131776 79872 900 0 21 0 0 0 0 7031111 1 263419356 0 30185 0 0 1] real hdr: [ 8.81999976e+03 2.46215071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.40999873e+03 8.00000162e+03 2.70004882e-01 2.94891378e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.11140823e-02 -1.03907604e-02 -1.05480654e-02 ..., 1.09317222e-10 3.21445474e-11 -7.44050865e-09] ----------------------- var 117 record 21 hdr offset: 880224 data offset: 1129693184 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 141211648 79872 900 0 22 0 0 0 0 7031111 1 263575756 0 30185 0 0 1] real hdr: [ 9.67999858e+03 1.99878209e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.25000113e+03 8.81999976e+03 2.22443261e-01 2.46215071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.45605523e-02 -1.24953641e-02 -1.26922671e-02 ..., 8.98185259e-12 6.13908924e-11 -5.99225947e-10] ----------------------- var 117 record 22 hdr offset: 880736 data offset: 1130332160 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 141291520 79872 900 0 23 0 0 0 0 7031111 1 263732156 0 30185 0 0 1] real hdr: [ 1.05799981e+04 1.56554224e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.01300003e+04 9.67999858e+03 1.77555424e-01 1.99878209e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -3.72337326e-02 -3.53417769e-02 -3.52529958e-02 ..., 4.43070552e-10 8.66308136e-11 -1.09374461e-07] ----------------------- var 117 record 23 hdr offset: 881248 data offset: 1130971136 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 141371392 79872 900 0 24 0 0 0 0 7031111 1 263888556 0 30185 0 0 1] real hdr: [ 1.15199982e+04 1.16947874e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.10500001e+04 1.05799981e+04 1.36030234e-01 1.56554224e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -4.34054211e-02 -4.20379862e-02 -4.22319844e-02 ..., 1.76141377e-08 1.79103186e-08 -1.91491978e-07] ----------------------- var 117 record 24 hdr offset: 881760 data offset: 1131610112 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 141451264 79872 900 0 25 0 0 0 0 7031111 1 264044956 0 30185 0 0 1] real hdr: [ 1.24999991e+04 8.17952369e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.20100006e+04 1.15199982e+04 9.85881076e-02 1.16947874e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -3.62279713e-02 -3.56491096e-02 -3.60217467e-02 ..., -1.92319689e-08 -1.87359763e-08 -1.42051903e-07] ----------------------- var 117 record 25 hdr offset: 882272 data offset: 1132249088 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 141531136 79872 900 0 26 0 0 0 0 7031111 1 264201356 0 30185 0 0 1] real hdr: [ 1.35200006e+04 5.18637157e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30100018e+04 1.24999991e+04 6.59807861e-02 8.17952369e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -3.60498764e-02 -3.51475962e-02 -3.53511050e-02 ..., 1.18816138e-06 1.14510885e-06 -5.97561939e-06] ----------------------- var 117 record 26 hdr offset: 882784 data offset: 1132888064 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 141611008 79872 900 0 27 0 0 0 0 7031111 1 264357756 0 30185 0 0 1] real hdr: [ 1.45807997e+04 2.79368177e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.40504001e+04 1.35200006e+04 3.89823900e-02 5.18637157e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.97408123e-02 -2.86396872e-02 -2.87470501e-02 ..., -1.16324964e-06 -1.14083923e-06 -1.27750045e-05] ----------------------- var 117 record 27 hdr offset: 883296 data offset: 1133527040 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 141690880 79872 900 0 28 0 0 0 0 7031111 1 264514156 0 30185 0 0 1] real hdr: [ 1.56946399e+04 1.07164793e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.51377198e+04 1.45807997e+04 1.83146873e-02 2.79368177e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.03786197e-02 -8.25705566e-03 -8.59345682e-03 ..., -3.02336787e-08 -3.75288813e-08 -5.19975629e-07] ----------------------- var 117 record 28 hdr offset: 883808 data offset: 1134166016 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 141770752 79872 900 0 29 0 0 0 0 7031111 1 264670556 0 30185 0 0 1] real hdr: [ 1.68753114e+04 1.30179090e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.62849737e+04 1.56946399e+04 4.87210933e-03 1.07164793e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -3.69131975e-02 -3.75317298e-02 -3.74059603e-02 ..., -1.34119290e-07 -1.40164957e-07 -1.73816466e-06] ----------------------- var 117 record 29 hdr offset: 884320 data offset: 1134804992 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 141850624 79872 900 0 30 0 0 0 0 7031111 1 264826956 0 30185 0 0 1] real hdr: [ 1.81386262e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.75069688e+04 1.68753114e+04 0.00000000e+00 1.30179090e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -5.98945236e-03 -2.15734653e-02 -2.25182641e-02 ..., 1.68330288e-07 1.79315819e-07 -4.50200474e-07] ----------------------- var 117 record 30 hdr offset: 884832 data offset: 1135443968 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 141930496 79872 900 0 31 0 0 0 0 7031111 1 264983356 0 30185 0 0 1] real hdr: [ 1.95030104e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.88208202e+04 1.81386262e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -4.14092876e-02 -4.16971594e-02 -4.19021919e-02 ..., -1.91443350e-09 -2.33673014e-09 -2.60748028e-08] ----------------------- var 117 record 31 hdr offset: 885344 data offset: 1136082944 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 142010368 79872 900 0 32 0 0 0 0 7031111 1 265139756 0 30185 0 0 1] real hdr: [ 2.09901876e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.02465990e+04 1.95030104e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 2.90908627e-02 2.68729590e-02 2.61920895e-02 ..., 2.89769853e-09 3.34306161e-09 1.05622364e-08] ----------------------- var 117 record 32 hdr offset: 885856 data offset: 1136721920 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 142090240 79872 900 0 33 0 0 0 0 7031111 1 265296156 0 30185 0 0 1] real hdr: [ 2.26260817e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.18081366e+04 2.09901876e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 1.33818910e-02 2.52321572e-03 1.39484939e-03 ..., 4.55666532e-10 4.32675645e-10 5.19612176e-09] ----------------------- var 117 record 33 hdr offset: 886368 data offset: 1137360896 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 142170112 79872 900 0 34 0 0 0 0 7031111 1 265452556 0 30185 0 0 1] real hdr: [ 2.44582854e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.35421836e+04 2.26260817e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -3.11971605e-02 -3.97772565e-02 -4.01226655e-02 ..., 3.39449198e-11 4.15324060e-11 6.30739738e-10] ----------------------- var 117 record 34 hdr offset: 886880 data offset: 1137999872 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 142249984 79872 900 0 35 0 0 0 0 7031111 1 265608956 0 30185 0 0 1] real hdr: [ 2.65836402e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.55209609e+04 2.44582854e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -8.39675888e-02 -8.40568617e-02 -8.46373513e-02 ..., -2.07264206e-11 -1.48681432e-11 4.27700186e-09] ----------------------- var 117 record 35 hdr offset: 887392 data offset: 1138638848 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 142329856 79872 900 0 36 0 0 0 0 7031111 1 265765356 0 30185 0 0 1] real hdr: [ 2.92190802e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.79013583e+04 2.65836402e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ 5.41239828e-02 5.10119237e-02 5.03358766e-02 ..., 2.88144980e-10 2.75004325e-10 1.96872048e-08] ----------------------- var 117 record 36 hdr offset: 887904 data offset: 1139277824 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 142409728 79872 900 0 37 0 0 0 0 7031111 1 265921756 0 30185 0 0 1] real hdr: [ 3.29086931e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.10638886e+04 2.92190802e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -1.87574267e-01 -1.91407651e-01 -1.90673172e-01 ..., -1.79362927e-10 -1.66153688e-10 1.75343615e-08] ----------------------- var 117 record 37 hdr offset: 888416 data offset: 1139916800 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 156400 101 3 340 460 0 2 2 48 0 128 65 0 387757194 142489600 79872 900 0 38 0 0 0 0 7031111 1 266078156 0 30185 0 0 1] real hdr: [ 3.92548336e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.60817633e+04 3.29086931e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [ -2.98533499e-01 -3.02246273e-01 -3.00875306e-01 ..., -2.21285958e-11 -2.21976517e-11 4.63490668e-09] ----------------------- =============================== var 118: nz = 38, nt = 1 var 118 record 0 hdr offset: 888928 data offset: 1140555776 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 142569472 79872 900 0 1 0 0 0 0 7031111 1 266234556 0 30186 0 0 1] real hdr: [ 2.00003377e+01 9.97716462e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.99820611e+00 0.00000000e+00 9.98858129e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.07283337 -0.07161178 -0.0710993 ..., 0.0421764 0.04425985 0.04739516] ----------------------- var 118 record 1 hdr offset: 889440 data offset: 1141194752 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 142649344 79872 900 0 2 0 0 0 0 7031111 1 266390496 0 30186 0 0 1] real hdr: [ 8.00013508e+01 9.90881510e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.99988815e+01 2.00003377e+01 9.94296273e-01 9.97716462e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.02581276 0.02758904 0.02833208 ..., -0.00256614 -0.00357612 -0.00416731] ----------------------- var 118 record 2 hdr offset: 889952 data offset: 1141833728 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 142729216 79872 900 0 3 0 0 0 0 7031111 1 266546436 0 30186 0 0 1] real hdr: [ 1.79999114e+02 9.79542572e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30000232e+02 8.00013508e+01 9.85203885e-01 9.90881510e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.02948157 0.03137733 0.0322384 ..., -0.00540062 -0.0063075 -0.00671513] ----------------------- var 118 record 3 hdr offset: 890464 data offset: 1142472704 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 142809088 79872 900 0 4 0 0 0 0 7031111 1 266702376 0 30186 0 0 1] real hdr: [ 3.20001478e+02 9.63777064e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.49998333e+02 1.79999114e+02 9.71644051e-01 9.79542572e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.00653422 0.00861081 0.01001878 ..., 0.00631169 0.00450482 0.0031649 ] ----------------------- var 118 record 4 hdr offset: 890976 data offset: 1143111680 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 142888960 79872 900 0 5 0 0 0 0 7031111 1 266858316 0 30186 0 0 1] real hdr: [ 5.00000592e+02 9.43695500e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.10001035e+02 3.20001478e+02 9.53709855e-01 9.63777064e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.01190434 -0.00997917 -0.00895499 ..., 0.07653818 0.07831757 0.08001497] ----------------------- var 118 record 5 hdr offset: 891488 data offset: 1143750656 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 142968832 79872 900 0 6 0 0 0 0 7031111 1 267014256 0 30186 0 0 1] real hdr: [ 7.20000381e+02 9.19438386e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.10000486e+02 5.00000592e+02 9.31527464e-01 9.43695500e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.00440166 0.00581379 0.0070034 ..., 0.02023037 0.01985573 0.01930719] ----------------------- var 118 record 6 hdr offset: 892000 data offset: 1144389632 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 143048704 79872 900 0 7 0 0 0 0 7031111 1 267170196 0 30186 0 0 1] real hdr: [ 9.80000846e+02 8.91177995e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.50000613e+02 7.20000381e+02 9.05253051e-01 9.19438386e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.00151683 0.00230448 0.00317005 ..., 0.0120517 0.01188793 0.01165151] ----------------------- var 118 record 7 hdr offset: 892512 data offset: 1145028608 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 143128576 79872 900 0 8 0 0 0 0 7031111 1 267326136 0 30186 0 0 1] real hdr: [ 1.27999806e+03 8.59118341e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.13000142e+03 9.80000846e+02 8.75074549e-01 8.91177995e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.00810947 -0.00827569 -0.00805014 ..., 0.00503642 0.00486682 0.00486244] ----------------------- var 118 record 8 hdr offset: 893024 data offset: 1145667584 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 143208448 79872 900 0 9 0 0 0 0 7031111 1 267482076 0 30186 0 0 1] real hdr: [ 1.61999988e+03 8.23493502e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.44999897e+03 1.27999806e+03 8.41211628e-01 8.59118341e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.02060462 -0.02196671 -0.02256713 ..., -0.00668685 -0.00710793 -0.00704322] ----------------------- var 118 record 9 hdr offset: 893536 data offset: 1146306560 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 143288320 79872 900 0 10 0 0 0 0 7031111 1 267638016 0 30186 0 0 1] real hdr: [ 1.99999844e+03 7.84570542e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.81000112e+03 1.61999988e+03 8.03914038e-01 8.23493502e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.02949286 -0.02983011 -0.02912897 ..., -0.01982396 -0.01976366 -0.01919198] ----------------------- var 118 record 10 hdr offset: 894048 data offset: 1146945536 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 143368192 79872 900 0 11 0 0 0 0 7031111 1 267793956 0 30186 0 0 1] real hdr: [ 2.42000161e+03 7.42646223e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.21000002e+03 1.99999844e+03 7.63464495e-01 7.84570542e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.00166681 0.00155374 0.0012149 ..., -0.0369388 -0.03600297 -0.03483026] ----------------------- var 118 record 11 hdr offset: 894560 data offset: 1147584512 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 143448064 79872 900 0 12 0 0 0 0 7031111 1 267949896 0 30186 0 0 1] real hdr: [ 2.88000152e+03 6.98050213e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.64999960e+03 2.42000161e+03 7.20175811e-01 7.42646223e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.01143744 0.0110048 0.0101684 ..., -0.05299157 -0.05134241 -0.04980217] ----------------------- var 118 record 12 hdr offset: 895072 data offset: 1148223488 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 143527936 79872 900 0 13 0 0 0 0 7031111 1 268105836 0 30186 0 0 1] real hdr: [ 3.37999819e+03 6.51142688e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.12999986e+03 2.88000152e+03 6.74392534e-01 6.98050213e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.01411486 0.01373477 0.01281394 ..., -0.06365509 -0.06127504 -0.05934215] ----------------------- var 118 record 13 hdr offset: 895584 data offset: 1148862464 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 143607808 79872 900 0 14 0 0 0 0 7031111 1 268261776 0 30186 0 0 1] real hdr: [ 3.91999946e+03 6.02314441e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.65000079e+03 3.37999819e+03 6.26490534e-01 6.51142688e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.01142541 0.01077586 0.0095223 ..., -0.06207724 -0.05964315 -0.05733804] ----------------------- var 118 record 14 hdr offset: 896096 data offset: 1149501440 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 143687680 79872 900 0 15 0 0 0 0 7031111 1 268417716 0 30186 0 0 1] real hdr: [ 4.50000140e+03 5.51988701e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.20999847e+03 3.91999946e+03 5.76877346e-01 6.02314441e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.01586472 0.01474962 0.01295147 ..., -0.0437994 -0.04159902 -0.03985814] ----------------------- var 118 record 15 hdr offset: 896608 data offset: 1150140416 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 143767552 79872 900 0 16 0 0 0 0 7031111 1 268573656 0 30186 0 0 1] real hdr: [ 5.12000009e+03 5.00619965e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.81000075e+03 4.50000140e+03 5.25990788e-01 5.51988701e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.01954223 0.01879767 0.01739279 ..., -0.02252404 -0.0209348 -0.02048412] ----------------------- var 118 record 16 hdr offset: 897120 data offset: 1150779392 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 143847424 79872 900 0 17 0 0 0 0 7031111 1 268729596 0 30186 0 0 1] real hdr: [ 5.77999946e+03 4.48693382e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.44999978e+03 5.12000009e+03 4.74301366e-01 5.00619965e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.01140227 0.01117726 0.01035287 ..., -0.02068807 -0.02045913 -0.02041428] ----------------------- var 118 record 17 hdr offset: 897632 data offset: 1151418368 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 143927296 79872 900 0 18 0 0 0 0 7031111 1 268885536 0 30186 0 0 1] real hdr: [ 6.47999950e+03 3.96725773e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.12999948e+03 5.77999946e+03 4.22309896e-01 4.48693382e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.00046329 -0.00060481 -0.00143193 ..., -0.03119719 -0.03161706 -0.03176832] ----------------------- var 118 record 18 hdr offset: 898144 data offset: 1152057344 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 144007168 79872 900 0 19 0 0 0 0 7031111 1 269041476 0 30186 0 0 1] real hdr: [ 7.22000022e+03 3.45265283e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 6.84999986e+03 6.47999950e+03 3.70548863e-01 3.96725773e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.00389545 -0.00397594 -0.00479038 ..., -0.03074175 -0.02930485 -0.02711434] ----------------------- var 118 record 19 hdr offset: 898656 data offset: 1152696320 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 144087040 79872 900 0 20 0 0 0 0 7031111 1 269197416 0 30186 0 0 1] real hdr: [ 8.00000162e+03 2.94891378e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 7.61000092e+03 7.22000022e+03 3.19582071e-01 3.45265283e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.00146729 0.00198659 0.00189954 ..., -0.02917164 -0.02682515 -0.02408909] ----------------------- var 118 record 20 hdr offset: 899168 data offset: 1153335296 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 144166912 79872 900 0 21 0 0 0 0 7031111 1 269353356 0 30186 0 0 1] real hdr: [ 8.81999976e+03 2.46215071e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.40999873e+03 8.00000162e+03 2.70004882e-01 2.94891378e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.01237228 0.01281238 0.01269792 ..., -0.02549587 -0.02207946 -0.0193057 ] ----------------------- var 118 record 21 hdr offset: 899680 data offset: 1153974272 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 144246784 79872 900 0 22 0 0 0 0 7031111 1 269509296 0 30186 0 0 1] real hdr: [ 9.67999858e+03 1.99878209e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.25000113e+03 8.81999976e+03 2.22443261e-01 2.46215071e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.02883423 0.0289738 0.02874453 ..., -0.0197424 -0.01698987 -0.01517382] ----------------------- var 118 record 22 hdr offset: 900192 data offset: 1154613248 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 144326656 79872 900 0 23 0 0 0 0 7031111 1 269665236 0 30186 0 0 1] real hdr: [ 1.05799981e+04 1.56554224e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.01300003e+04 9.67999858e+03 1.77555424e-01 1.99878209e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.02370291 0.02443132 0.02485199 ..., -0.01218167 -0.01214594 -0.01254661] ----------------------- var 118 record 23 hdr offset: 900704 data offset: 1155252224 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 144406528 79872 900 0 24 0 0 0 0 7031111 1 269821176 0 30186 0 0 1] real hdr: [ 1.15199982e+04 1.16947874e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.10500001e+04 1.05799981e+04 1.36030234e-01 1.56554224e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.02473215 0.02509813 0.0250568 ..., 0.01086747 0.01185233 0.01225687] ----------------------- var 118 record 24 hdr offset: 901216 data offset: 1155891200 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 144486400 79872 900 0 25 0 0 0 0 7031111 1 269977116 0 30186 0 0 1] real hdr: [ 1.24999991e+04 8.17952369e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.20100006e+04 1.15199982e+04 9.85881076e-02 1.16947874e-01 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.03515769 0.03481797 0.03371736 ..., 0.0085852 0.01055135 0.01299427] ----------------------- var 118 record 25 hdr offset: 901728 data offset: 1156530176 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 144566272 79872 900 0 26 0 0 0 0 7031111 1 270133056 0 30186 0 0 1] real hdr: [ 1.35200006e+04 5.18637157e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.30100018e+04 1.24999991e+04 6.59807861e-02 8.17952369e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.03527943 0.03514481 0.03424838 ..., 0.01597545 0.01928038 0.02173102] ----------------------- var 118 record 26 hdr offset: 902240 data offset: 1157169152 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 144646144 79872 900 0 27 0 0 0 0 7031111 1 270288996 0 30186 0 0 1] real hdr: [ 1.45807997e+04 2.79368177e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.40504001e+04 1.35200006e+04 3.89823900e-02 5.18637157e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.01171069 0.01145619 0.01047997 ..., -0.03574337 -0.03304688 -0.03094687] ----------------------- var 118 record 27 hdr offset: 902752 data offset: 1157808128 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 144726016 79872 900 0 28 0 0 0 0 7031111 1 270444936 0 30186 0 0 1] real hdr: [ 1.56946399e+04 1.07164793e-02 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.51377198e+04 1.45807997e+04 1.83146873e-02 2.79368177e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.00897834 0.00857141 0.00804526 ..., -0.02162204 -0.02105941 -0.02084272] ----------------------- var 118 record 28 hdr offset: 903264 data offset: 1158447104 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 144805888 79872 900 0 29 0 0 0 0 7031111 1 270600876 0 30186 0 0 1] real hdr: [ 1.68753114e+04 1.30179090e-03 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.62849737e+04 1.56946399e+04 4.87210933e-03 1.07164793e-02 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.00011562 0.00121866 0.0021758 ..., 0.00297969 0.00366134 0.00445145] ----------------------- var 118 record 29 hdr offset: 903776 data offset: 1159086080 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 144885760 79872 900 0 30 0 0 0 0 7031111 1 270756816 0 30186 0 0 1] real hdr: [ 1.81386262e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.75069688e+04 1.68753114e+04 0.00000000e+00 1.30179090e-03 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.00054462 0.00173673 -0.00316778 ..., 0.004661 0.00427041 0.004027 ] ----------------------- var 118 record 30 hdr offset: 904288 data offset: 1159725056 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 144965632 79872 900 0 31 0 0 0 0 7031111 1 270912756 0 30186 0 0 1] real hdr: [ 1.95030104e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.88208202e+04 1.81386262e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 3.26246009e-05 -4.91533254e-04 -1.95124513e-03 ..., -4.42213044e-02 -4.11534011e-02 -3.82397920e-02] ----------------------- var 118 record 31 hdr offset: 904800 data offset: 1160364032 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 145045504 79872 900 0 32 0 0 0 0 7031111 1 271068696 0 30186 0 0 1] real hdr: [ 2.09901876e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.02465990e+04 1.95030104e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.01779637 0.01710091 0.01426867 ..., -0.04823699 -0.04272184 -0.03682186] ----------------------- var 118 record 32 hdr offset: 905312 data offset: 1161003008 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 145125376 79872 900 0 33 0 0 0 0 7031111 1 271224636 0 30186 0 0 1] real hdr: [ 2.26260817e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.18081366e+04 2.09901876e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.0426585 0.04134528 0.03570242 ..., -0.05314819 -0.0509926 -0.04874997] ----------------------- var 118 record 33 hdr offset: 905824 data offset: 1161641984 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 145205248 79872 900 0 34 0 0 0 0 7031111 1 271380576 0 30186 0 0 1] real hdr: [ 2.44582854e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.35421836e+04 2.26260817e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.03078767 0.0337202 0.03295581 ..., -0.00393794 -0.0008715 0.00227773] ----------------------- var 118 record 34 hdr offset: 906336 data offset: 1162280960 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 145285120 79872 900 0 35 0 0 0 0 7031111 1 271536516 0 30186 0 0 1] real hdr: [ 2.65836402e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.55209609e+04 2.44582854e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.04277928 -0.0454904 -0.04899831 ..., -0.06465096 -0.05994116 -0.05514932] ----------------------- var 118 record 35 hdr offset: 906848 data offset: 1162919936 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 145364992 79872 900 0 36 0 0 0 0 7031111 1 271692456 0 30186 0 0 1] real hdr: [ 2.92190802e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.79013583e+04 2.65836402e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [ 0.06835362 0.06751064 0.06472253 ..., -0.06233063 -0.0519276 -0.04161263] ----------------------- var 118 record 36 hdr offset: 907360 data offset: 1163558912 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 145444864 79872 900 0 37 0 0 0 0 7031111 1 271848396 0 30186 0 0 1] real hdr: [ 3.29086931e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.10638886e+04 2.92190802e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.01052878 -0.00366812 -0.00054334 ..., -0.0678615 -0.06470545 -0.06137188] ----------------------- var 118 record 37 hdr offset: 907872 data offset: 1164197888 disk length: 79872 int hdr: [ 2006 9 16 23 0 259 2006 9 17 0 0 260 121 1296 155940 101 3 339 460 0 2 2 49 0 128 65 0 387757194 145524736 79872 900 0 38 0 0 0 0 7031111 1 272004336 0 30186 0 0 1] real hdr: [ 3.92548336e+04 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 3.60817633e+04 3.29086931e+04 0.00000000e+00 0.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.50550000e+01 1.10000000e-01 3.34890000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 155940 data: [-0.09334622 -0.08675135 -0.08118743 ..., -0.07678698 -0.07062236 -0.06437619] ----------------------- =============================== record read using saved file type and offsets: int hdr: [ 2006 9 17 0 0 260 2006 7 25 0 0 0 1 1296 156400 101 3 340 460 0 2 2 56 0 0 65 0 0 114688 79872 -32768 5 1 0 0 0 0 7031111 1 1 0 2 0 0 1] real hdr: [ 2.00003377e+01 9.97716462e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 9.99820611e+00 0.00000000e+00 9.98858129e-01 1.00000000e+00 7.90000000e+01 1.80000000e+02 0.00000000e+00 -1.51100000e+01 1.10000000e-01 3.34945000e+02 1.10000000e-01 -1.07374182e+09 1.00000000e+00] data_type = real nwords = 156400 data: [-6.90907097 -6.9162221 -6.92416382 ..., -0.93425995 -0.79391634 -0.68335903] nx = 460 ny = 340 data_type = real nwords = 156400 cf-python-1.3.2/cf/um/umread/cInterface.py0000600000175000017500000004423412603546021020525 0ustar daviddavid00000000000000import os import numpy import numpy.ctypeslib import ctypes as CT import umfile _len_real_hdr = 19 _len_int_hdr = 45 class File_type(CT.Structure): _fields_ = [("format", CT.c_int), ("byte_ordering", CT.c_int), ("word_size", CT.c_int)] def _get_ctypes_array(dtype, size=None): """ get ctypes corresponding to a numpy array of a given type; the size should not be necessary unless the storage for the array is allocated in the C code """ kwargs = {'dtype': dtype, 'ndim': 1, 'flags': ('C_CONTIGUOUS', 'WRITEABLE')} if size: kwargs['shape'] = (size,) return numpy.ctypeslib.ndpointer(**kwargs) def _gen_rec_class(int_type, float_type): class Rec(CT.Structure): """ ctypes object corresponding to the Rec object in the C code, """ _fields_ = [("int_hdr", _get_ctypes_array(int_type, _len_int_hdr)), ("real_hdr", _get_ctypes_array(float_type, _len_real_hdr)), ("header_offset", CT.c_size_t), ("data_offset", CT.c_size_t), ("disk_length", CT.c_size_t), ("_internp", CT.c_void_p)] return Rec Rec32 = _gen_rec_class(numpy.int32, numpy.float32) Rec64 = _gen_rec_class(numpy.int64, numpy.float64) def _gen_var_class(rec_class): class Var(CT.Structure): """ ctypes object corresponding to the Var object in the C code """ _fields_ = [("recs", CT.POINTER(CT.POINTER(rec_class))), ("nz", CT.c_int), ("nt", CT.c_int), ("supervar_index", CT.c_int), ("_internp", CT.c_void_p)] return Var Var32 = _gen_var_class(Rec32) Var64 = _gen_var_class(Rec64) def _gen_file_class(var_class): class File(CT.Structure): """ ctypes object corresponding to the File object in the C code """ _fields_ = [("fd", CT.c_int), ("file_type", File_type), ("nvars", CT.c_int), ("vars", CT.POINTER(CT.POINTER(var_class))), ("_internp", CT.c_void_p)] return File File32 = _gen_file_class(Var32) File64 = _gen_file_class(Var64) class Enum(object): def __init__(self, *names): self.names = names def as_name(self, val): if isinstance(val, str): return val else: return self.names[val] def as_index(self, val): if isinstance(val, int): return val return self.names.index(val) enum_file_format = Enum("PP", "FF") enum_byte_ordering = Enum("little_endian", "big_endian") enum_data_type = Enum("integer", "real") class CInterface(object): """ Interface to the C shared library functions """ def __init__(self, lib_name = "umfile.so"): lib_dir = os.path.join(os.path.dirname(__file__) or ".", "c-lib") lib_path = os.path.join(lib_dir, lib_name) self.lib = CT.CDLL(lib_path) def _is_null_pointer(self, ptr): try: ptr.contents return False except ValueError: return True def detect_file_type(self, fd): """ auto-detect file type; returns a File_type ctypes object that can be passed to file_parse(), or raises an exception if file type cannot be detected """ file_type = File_type() rv = self.lib.detect_file_type(fd, CT.pointer(file_type)) if rv != 0: raise umfile.UMFileException("File type could not be detected") return file_type def file_type_obj_to_dict(self, file_type): """ converts a FileType object returned by detect_file_type() into a dictionary that include meaningful string values in place of the integers that derive from the C enum statments, specifically: 'format': 'PP' or 'FF' 'byte_ordering': 'little_endian' or 'big_endian' and also 'word_size': 4 or 8 """ format = enum_file_format.as_name(file_type.format) byte_ordering = enum_byte_ordering.as_name(file_type.byte_ordering) word_size = file_type.word_size return { 'format': format, 'byte_ordering': byte_ordering, 'word_size': word_size } def create_file_type(self, format, byte_ordering, word_size): """ takes string input values: 'format': 'PP' or 'FF' 'byte_ordering': 'little_endian' or 'big_endian' 'word_size': 4 or 8 and returns a FileType object (ctypes structure containing integer values) that can be passed to file_parse() """ return File_type(format = enum_file_format.as_index(format), byte_ordering = enum_byte_ordering.as_index(byte_ordering), word_size = word_size) def set_word_size(self, val): """ Sets the word size used to interpret returned pointers from subsequent calls, in particular the pointers to PP headers embedded in the tree of objects returned by file_parse() and the data array that is populated by read_record_data(). the 'val' argument contains either just the word_size value to use or a file_type object from which it is to be extracted """ if isinstance(val, File_type): word_size = val.word_size else: word_size = val if word_size == 4: self.file_class = File32 self.file_data_int_type = numpy.int32 self.file_data_real_type = numpy.float32 elif word_size == 8: self.file_class = File64 self.file_data_int_type = numpy.int64 self.file_data_real_type = numpy.float64 else: raise ValueError("word size must be 4 or 8 (not %s)" % word_size) def _get_ctypes_int_array(self, size=None): return _get_ctypes_array(self.file_data_int_type, size) def _get_ctypes_real_array(self, size=None): return _get_ctypes_array(self.file_data_real_type, size) def _get_empty_real_array(self, size): """ get empty numpy real array according to word size previously set with set_word_size() """ return numpy.empty(size, dtype = self.file_data_real_type) def _get_empty_int_array(self, size): """ as _get_empty_real_array but for int """ return numpy.empty(size, dtype = self.file_data_int_type) def parse_file(self, fh, file_type): """ Given an open file handle, work out information from the file, and return this in a dictionary, of which currently the only key actually implemented is 'vars', containing a list of variables, as that is all that the caller requires. arguments: fh - low-level file handle (integer) file_type - File_type object as returned by detect_file_type() or create_file_type() """ func = self.lib.file_parse file_p_type = CT.POINTER(self.file_class) func.restype = file_p_type file_p = func(fh, file_type) if self._is_null_pointer(file_p): raise umfile.UMFileException("file parsing failed") file = file_p.contents c_vars = file.vars[:file.nvars] rv = {'vars': map(self.c_var_to_py_var, c_vars)} # now that we have copied all the data into python objects for the # caller, free any memory allocated in the C code before returning free_func = self.lib.file_free free_func._fields_ = file_p_type free_func(file_p) return rv def c_var_to_py_var(self, c_var_p): """ create a umfile.Var object from a ctypes object corresponding to 'Var*' in the C code """ c_var = c_var_p.contents nz = c_var.nz nt = c_var.nt svi = c_var.supervar_index if svi < 0: svi = None c_recs = c_var.recs recs = [self.c_rec_to_py_rec(c_recs[recid]) for recid in range(nz * nt)] return umfile.Var(recs, nz, nt, svi) def c_rec_to_py_rec(self, c_rec_p): """ create a umfile.Rec object from a ctypes object corresponding to 'Rec*' in the C code """ c_rec = c_rec_p.contents # numpy.copy used here so we can go back and free the memory allocated # by C without affecting the python object int_hdr = numpy.copy(numpy.ctypeslib.as_array(c_rec.int_hdr)) real_hdr = numpy.copy(numpy.ctypeslib.as_array(c_rec.real_hdr)) header_offset = c_rec.header_offset data_offset = c_rec.data_offset disk_length = c_rec.disk_length return umfile.Rec(int_hdr, real_hdr, header_offset, data_offset, disk_length) def get_type_and_num_words(self, int_hdr): """ from integer header, work out data type and number of words to read (read_record_data requires this) returns 2-tuple of: data type: 'integer' or 'real' number of words """ word_size = int_hdr.itemsize self.lib.get_type_and_num_words.argtypes = [ CT.c_int, self._get_ctypes_int_array(), CT.POINTER(CT.c_int), CT.POINTER(CT.c_size_t) ] data_type = CT.c_int() num_words = CT.c_size_t() rv = self.lib.get_type_and_num_words(word_size, int_hdr, CT.pointer(data_type), CT.pointer(num_words)) if rv != 0: raise umfile.UMFileException("error determining data type and size from integer header") return enum_data_type.as_name(data_type.value), num_words.value def get_extra_data_offset_and_length(self, int_hdr, data_offset, disk_length): """ from integer header, gets offset and length of extra data returns 2-tuple (offset, length), both in units of BYTES """ word_size = int_hdr.itemsize func = self.lib.get_extra_data_offset_and_length func.argtypes = [ CT.c_int, self._get_ctypes_int_array(), CT.c_size_t, CT.c_size_t, CT.POINTER(CT.c_size_t), CT.POINTER(CT.c_size_t) ] extra_data_offset = CT.c_size_t() extra_data_length = CT.c_size_t() rv = func(word_size, int_hdr, data_offset, disk_length, CT.pointer(extra_data_offset), CT.pointer(extra_data_length)) if rv != 0: raise umfile.UMFileException("error determining extra data length from integer header") return extra_data_offset.value, extra_data_length.value def read_header(self, fd, header_offset, byte_ordering, word_size): """ reads header from open file, returning as 2-tuple (int_hdr, real_hdr) of numpy arrays """ self.lib.read_header.argtypes = [ CT.c_int, CT.c_size_t, CT.c_int, CT.c_int, self._get_ctypes_int_array(), self._get_ctypes_real_array()] int_hdr = self._get_empty_int_array(_len_int_hdr) real_hdr = self._get_empty_real_array(_len_real_hdr) rv = self.lib.read_header(fd, header_offset, enum_byte_ordering.as_index(byte_ordering), word_size, int_hdr, real_hdr) if rv != 0: raise umfile.UMFileException("error reading header data") return int_hdr, real_hdr def read_extra_data(self, fd, extra_data_offset, extra_data_length, byte_ordering, word_size): """ reads record data from open file inputs: fd - integer low-level file descriptor extra_data_offset - offset in bytes extra_disk_length - disk length of extra data in bytes byte_ordering - 'little_endian' or 'big_endian' word_size - 4 or 8 returns: extra data as string) """ extra_data = "\0" * extra_data_length self.lib.read_extra_data.argtypes = [ CT.c_int, CT.c_size_t, CT.c_size_t, CT.c_int, CT.c_int, CT.c_char_p ] rv = self.lib.read_extra_data(fd, extra_data_offset, extra_data_length, enum_byte_ordering.as_index(byte_ordering), word_size, extra_data) if rv != 0: raise umfile.UMFileException("error reading extra data") return extra_data def read_record_data(self, fd, data_offset, disk_length, byte_ordering, word_size, int_hdr, real_hdr, data_type, nwords): """ reads record data from open file inputs: fd - integer low-level file descriptor data_offset - offset in words disk_length - disk length of data record in words byte_ordering - 'little_endian' or 'big_endian' word_size - 4 or 8 int_hdr - integer PP headers (numpy array) real_hdr - real PP headers (numpy array) data_type - 'integer' or 'real' nwords - number of words to read type and nwords should have been returned by get_type_and_num_words() """ if data_type == 'integer': data = self._get_empty_int_array(nwords) ctypes_data = self._get_ctypes_int_array() elif data_type == 'real': data = self._get_empty_real_array(nwords) ctypes_data = self._get_ctypes_real_array() else: raise ValueError("data_type must be 'integer' or 'real'") self.lib.read_record_data.argtypes = [ CT.c_int, CT.c_size_t, CT.c_size_t, CT.c_int, CT.c_int, self._get_ctypes_int_array(), self._get_ctypes_real_array(), CT.c_size_t, ctypes_data ] rv = self.lib.read_record_data(fd, data_offset, disk_length, enum_byte_ordering.as_index(byte_ordering), word_size, int_hdr, real_hdr, nwords, data) if rv != 0: raise umfile.UMFileException("error reading record data") return data if __name__ == "__main__": import sys c = CInterface() fd = os.open(sys.argv[1], os.O_RDONLY) file_type = c.detect_file_type(fd) print c.file_type_obj_to_dict(file_type) c.set_word_size(file_type) info = c.parse_file(fd, file_type) for var in info['vars']: print "nz = %s, nt = %s" % (var.nz, var.nt) for rec in var.recs: print rec.hdr_offset print "data offset", rec.data_offset print "disk length", rec.disk_length print "int hdr", rec.int_hdr print "real hdr", rec.real_hdr data_type, nwords = c.get_type_and_num_words(rec.int_hdr) print "data_type = %s nwords = %s" % (data_type, nwords) data = c.read_record_data(fd, rec.data_offset, rec.disk_length, file_type.byte_ordering, file_type.word_size, rec.int_hdr, rec.real_hdr, data_type, nwords) print "data (%s values): %s ... %s" % (len(data), data[:10], data[-10:]) extra_data_offset, extra_data_length = \ c.get_extra_data_offset_and_length(rec.int_hdr, rec.data_offset, rec.disk_length) print "extra data offset: %s" % extra_data_offset print "extra data length: %s" % extra_data_length extra_data = c.read_extra_data(fd, extra_data_offset, extra_data_length, file_type.byte_ordering, file_type.word_size) print "extra data (%s bytes) read" % (len(extra_data)) print c.read_header(fd, info['vars'][0].recs[0].hdr_offset, file_type.byte_ordering, file_type.word_size) cf-python-1.3.2/cf/um/umread/cinterface.diff0000600000175000017500000001270712414512627021052 0ustar daviddavid00000000000000diff --git a/umread/cInterface.py b/umread/cInterface.py index ce70b52..d64e783 100644 --- a/umread/cInterface.py +++ b/umread/cInterface.py @@ -13,34 +13,65 @@ class File_type(CT.Structure): ("byte_ordering", CT.c_int), ("word_size", CT.c_int)] -class Rec(CT.Structure): - """ - ctypes object corresponding to the Rec object in the C code - """ - # defer setting _fields_ as this depends on - # file data type for correct interpretation of the - # void* used for each of int and real PP header data - pass -class Var(CT.Structure): +def _get_ctypes_array(dtype, size=None): """ - ctypes object corresponding to the Var object in the C code + get ctypes corresponding to a numpy array of a given type; + the size should not be necessary unless the storage for the array + is allocated in the C code """ - _fields_ = [("recs", CT.POINTER(CT.POINTER(Rec))), - ("nz", CT.c_int), - ("nt", CT.c_int), - ("supervar_index", CT.c_int), - ("_internp", CT.c_void_p)] - -class File(CT.Structure): + kwargs = {'dtype': dtype, + 'ndim': 1, + 'flags': ('C_CONTIGUOUS', 'WRITEABLE')} + if size: + kwargs['shape'] = (size,) + return numpy.ctypeslib.ndpointer(**kwargs) + +def _gen_rec_class(int_type, float_type): + class Rec(CT.Structure): + _fields_ = [("int_hdr", _get_ctypes_array(int_type, _len_int_hdr)), + ("real_hdr", _get_ctypes_array(float_type, _len_real_hdr)), + ("header_offset", CT.c_size_t), + ("data_offset", CT.c_size_t), + ("disk_length", CT.c_size_t), + ("_internp", CT.c_void_p)] """ - ctypes object corresponding to the File object in the C code + ctypes object corresponding to the Rec object in the C code, """ - _fields_ = [("fd", CT.c_int), - ("file_type", File_type), - ("nvars", CT.c_int), - ("vars", CT.POINTER(CT.POINTER(Var))), - ("_internp", CT.c_void_p)] + return Rec + +Rec32 = _gen_rec_class(numpy.int32, numpy.float32) +Rec64 = _gen_rec_class(numpy.int64, numpy.float64) + +def _gen_var_class(rec_class): + class Var(CT.Structure): + """ + ctypes object corresponding to the Var object in the C code + """ + _fields_ = [("recs", CT.POINTER(CT.POINTER(rec_class))), + ("nz", CT.c_int), + ("nt", CT.c_int), + ("supervar_index", CT.c_int), + ("_internp", CT.c_void_p)] + return Var + +Var32 = _gen_var_class(Rec32) +Var64 = _gen_var_class(Rec64) + +def _gen_file_class(var_class): + class File(CT.Structure): + """ + ctypes object corresponding to the File object in the C code + """ + _fields_ = [("fd", CT.c_int), + ("file_type", File_type), + ("nvars", CT.c_int), + ("vars", CT.POINTER(CT.POINTER(var_class))), + ("_internp", CT.c_void_p)] + return File + +File32 = _gen_file_class(Var32) +File64 = _gen_file_class(Var64) class Enum(object): def __init__(self, *names): @@ -138,32 +169,21 @@ class CInterface(object): word_size = val if word_size == 4: + self.file_class = File32 self.file_data_int_type = numpy.int32 self.file_data_real_type = numpy.float32 elif word_size == 8: + self.file_class = File64 self.file_data_int_type = numpy.int64 self.file_data_real_type = numpy.float64 else: raise ValueError("word size must be 4 or 8 (not %s)" % word_size) - def _get_ctypes_array(self, dtype, size=None): - """ - get ctypes corresponding to a numpy array of a given type; - the size should not be necessary unless the storage for the array - is allocated in the C code - """ - kwargs = {'dtype': dtype, - 'ndim': 1, - 'flags': ('C_CONTIGUOUS', 'WRITEABLE')} - if size: - kwargs['shape'] = (size,) - return numpy.ctypeslib.ndpointer(**kwargs) - def _get_ctypes_int_array(self, size=None): - return self._get_ctypes_array(self.file_data_int_type, size) + return _get_ctypes_array(self.file_data_int_type, size) def _get_ctypes_real_array(self, size=None): - return self._get_ctypes_array(self.file_data_real_type, size) + return _get_ctypes_array(self.file_data_real_type, size) def _get_empty_real_array(self, size): """ @@ -190,14 +210,8 @@ class CInterface(object): create_file_type() """ func = self.lib.file_parse - file_p_type = CT.POINTER(File) + file_p_type = CT.POINTER(self.file_class) func.restype = file_p_type - Rec._fields_ = [("int_hdr", self._get_ctypes_int_array(_len_int_hdr)), - ("real_hdr", self._get_ctypes_real_array(_len_real_hdr)), - ("header_offset", CT.c_size_t), - ("data_offset", CT.c_size_t), - ("disk_length", CT.c_size_t), - ("_internp", CT.c_void_p)] file_p = func(fh, file_type) if self._is_null_pointer(file_p): raise umfile.UMFileException("file parsing failed") cf-python-1.3.2/cf/um/filearray.py0000644000175000017500000001156512752572326017210 0ustar daviddavid00000000000000from numpy.ma import masked_where as numpy_ma_masked_where from ..constants import _file_to_fh from ..functions import (open_files_threshold_exceeded, close_one_file, parse_indices, get_subspace) from ..data.filearray import FileArray from .functions import _open_um_file, _close_um_file from .umread.umfile import Rec _filename_to_file = _file_to_fh.setdefault('UM', {}) # ==================================================================== # # UMFileArray object # # ==================================================================== class UMFileArray(FileArray): '''A sub-array stored in a PP or UM fields file. **Initialization** :Parameters: file : str The file name in normalized, absolute form. dtype : numpy.dtype The data type of the data array on disk. ndim : int The number of dimensions in the unpacked data array. shape : tuple The shape of the unpacked data array. size : int The number of elements in the unpacked data array. header_offset : int The start position in the file of the header. data_offset : int The start position in the file of the data array. disk_length : int The number of words on disk for the data array, usually LBLREC-LBEXT. If set to 0 then `!size` is used. :Examples: >>> a = UMFileArray(file='file.pp', header_offset=3156, data_offset=3420, ... dtype=numpy.dtype('float32'), shape=(30, 24), ... size=720, ndim=2, disk_length=0) >>> a = UMFileArray(file='packed_file.pp', header_offset=3156, data_offset=3420, ... dtype=numpy.dtype('float32'), shape=(30, 24), ... size=720, ndim=2, disk_length=423) ''' def __getitem__(self, indices): ''' Implement indexing x.__getitem__(indices) <==> x[indices] Returns a numpy array. ''' f = self.open() rec = Rec.from_file_and_offsets(f, self.header_offset, self.data_offset, self.disk_length) int_hdr = rec.int_hdr real_hdr = rec.real_hdr array = rec.get_data().reshape(int_hdr.item(17,), int_hdr.item(18,)) if indices is not Ellipsis: indices = parse_indices(array, indices) array = get_subspace(array, indices) LBUSER2 = int_hdr.item(38,) if LBUSER2 == 3: # Return the numpy array now if it is a boolean array return array.astype(bool) integer_array = LBUSER2 == 2 # ------------------------------------------------------------ # Convert to a masked array # ------------------------------------------------------------ # Set the fill_value from BMDI fill_value = real_hdr.item(17,) if fill_value != -1.0e30: # -1.0e30 is the flag for no missing data if integer_array: # The fill_value must be of the same type as the data # values fill_value = int(fill_value) # Mask any missing values mask = (array == fill_value) if mask.any(): array = numpy_ma_masked_where(mask, array, copy=False) #--- End: if # ------------------------------------------------------------ # Unpack the array using the scale_factor and add_offset, if # either is available # ------------------------------------------------------------ # Treat BMKS as a scale_factor if it is neither 0 nor 1 scale_factor = real_hdr.item(18,) if scale_factor != 1.0 and scale_factor != 0.0: if integer_array: scale_factor = int(scale_factor) array *= scale_factor # Treat BDATUM as an add_offset if it is not 0 add_offset = real_hdr.item(4,) if add_offset != 0.0: if integer_array: add_offset = int(add_offset) array += add_offset # Return the numpy array return array #--- End: def def __str__(self): ''' x.__str__() <==> str(x) ''' return "%s%s in %s" % (self.header_offset, self.shape, self.file) #--- End: def @property def file_pointer(self): ''' ''' return (self.file, self.header_offset) #--- End: def def close(self): ''' Close the file containing the data array. If the file is not open then no action is taken. :Returns: None :Examples: >>> f.close() ''' _close_um_file(self.file) #--- End: def def open(self): ''' Open the file containing the data array. :Returns: out : um.umread.umfile.File :Examples: >>> f.open() ''' return _open_um_file(self.file) #--- End: def #--- End: class cf-python-1.3.2/cf/um/functions.py0000600000175000017500000000332612603546021017212 0ustar daviddavid00000000000000from ..constants import _file_to_fh from ..functions import open_files_threshold_exceeded, close_one_file from .umread.umfile import File, UMFileException _file_to_UM = _file_to_fh.setdefault('UM', {}) def _open_um_file(filename, aggregate=True): '''Open a UM fields file or PP file and read it into a `umread.umfile.File` object. If there is already a `umread.umfile.File` object for the file then it is returned with an open file descriptor. :Parameters: filename : str The file to be opened. :Returns: out : umread.umfile.File The opened file with an open file descriptor. :Examples: ''' f = _file_to_UM.get(filename, None) if f is not None: if f.fd is None: if open_files_threshold_exceeded(): # Close a random data array file to make way for this # one close_one_file() f.open_fd() #--- End: if return f if open_files_threshold_exceeded(): # Close a random data array file to make way for this one close_one_file() try: f = File(filename) except Exception as error: try: f.close_fd() except: pass raise error # Add a close method to the file object f.close = f.close_fd # Update the _file_to_UM dictionary _file_to_UM[filename] = f return f #--- End: def def _close_um_file(filename): '''Close a PP or UM fields file. Does nothing if the file is already closed. :Parameters: filename : str The file to be closed. :Returns: None :Examples: ''' f = _file_to_UM.pop(filename, None) if f is not None: f.close_fd() #--- End: def cf-python-1.3.2/cf/constants.py0000644000175000017500000000576312752572326016630 0ustar daviddavid00000000000000import sys from psutil import virtual_memory from tempfile import gettempdir from numpy.ma import masked as numpy_ma_masked from numpy.ma import nomask as numpy_ma_nomask #platform = sys.platform #if platform == 'darwin': # from psutil import virtual_memory # -------------------------------------------------------------------- # Find the total amount of memory, in bytes # -------------------------------------------------------------------- _TOTAL_MEMORY = float(virtual_memory().total) #if platform == 'darwin': # # MacOS # _MemTotal = float(virtual_memory().total) #else: # # Linux # _meminfo_file = open('/proc/meminfo', 'r', 1) # for line in _meminfo_file: # field_size = line.split() # if field_size[0] == 'MemTotal:': # _MemTotal = float(field_size[1]) * 1024 # break # #--- End: for # _meminfo_file.close() ##--- End: if # -------------------------------------------------------------------- # A dictionary of useful constants. # # Whilst the dictionary may be modified directly, it is safer to # retrieve and set the values with a function where one is # provided. This is due to interdependencies between some values. # # :Keys: # # ATOL : float # The value of absolute tolerance for testing numerically # tolerant equality. # # TOTAL_MEMORY : float # Find the total amount of physical memory (in bytes). # # CHUNKSIZE : float # The chunk size (in bytes) for data storage and # processing. # # FM_THRESHOLD : float # The minimum amount of memory (in bytes) to be kept free # for temporary work space. This should always be # MINNCFM*CHUNKSIZE. # # MINNCFM : int # The number of chunk sizes to be kept free for temporary # work space. # # OF_FRACTION : float # The fraction of the maximum number of concurrently open # files which may be used for files containing data # arrays. # # RTOL : float # The value of relative tolerance for testing numerically # tolerant equality. # # TEMPDIR : str # The location to store temporary files. By default it is # the default directory used by the :mod:`tempfile` module. # # FREE_MEMORY : float or None # # REGRID_LOGGING : bool # Whether or not to enable ESMPy logging. If it is logging is performed # after every call to ESMPy. By default logging is disabled. # # -------------------------------------------------------------------- CONSTANTS = {'RTOL' : sys.float_info.epsilon, 'ATOL' : sys.float_info.epsilon, 'TEMPDIR' : gettempdir(), 'MINNCFM' : 10, 'OF_FRACTION' : 0.5, 'TOTAL_MEMORY': _TOTAL_MEMORY, 'CHUNKSIZE' : _TOTAL_MEMORY * 0.01, 'FREE_MEMORY' : None, 'REGRID_LOGGING' : False } CONSTANTS['FM_THRESHOLD'] = CONSTANTS['MINNCFM']*CONSTANTS['CHUNKSIZE'] masked = numpy_ma_masked nomask = numpy_ma_nomask _file_to_fh = {} cf-python-1.3.2/cf/write.py0000644000175000017500000003022512765460072015733 0ustar daviddavid00000000000000from .netcdf.write import write as netcdf_write def write(fields, filename, fmt='NETCDF3_CLASSIC', overwrite=True, verbose=False, cfa_options=None, mode='w', least_significant_digit=None, endian='native', compress=0, fletcher32=False, no_shuffle=False, datatype=None, single=False, double=False, reference_datetime=None, variable_attributes=None, HDF_chunksizes=None, unlimited=None): '''Write fields to a CF-netCDF or CFA-netCDF file. NetCDF dimension and variable names will be taken from variables' `~Variable.ncvar` attributes and the domain attribute `~Domain.nc_dimensions` if present, otherwise they are inferred from standard names or set to defaults. NetCDF names may be automatically given a numerical suffix to avoid duplication. Output netCDF file global properties are those which occur in the set of CF global properties and non-standard data variable properties and which have equal values across all input fields. Logically identical field components are only written to the file once, apart from when they need to fulfil both dimension coordinate and auxiliary coordinate roles for different data variables. .. seealso:: `cf.read` :Parameters: fields: (arbitrarily nested sequence of) `cf.Field` or `cf.FieldList` The field or fields to write to the file. filename: `str` The output netCDF file. Various type of expansion are applied to the file names: ==================== ====================================== Expansion Description ==================== ====================================== Tilde An initial component of ``~`` or ``~user`` is replaced by that *user*'s home directory. Environment variable Substrings of the form ``$name`` or ``${name}`` are replaced by the value of environment variable *name*. ==================== ====================================== Where more than one type of expansion is used in the same string, they are applied in the order given in the above table. Example: If the environment variable *MYSELF* has been set to the "david", then ``'~$MYSELF/out.nc'`` is equivalent to ``'~david/out.nc'``. fmt: `str`, optional The format of the output file. One of: ===================== ================================================ fmt Description ===================== ================================================ ``'NETCDF3_CLASSIC'`` Output to a CF-netCDF3 classic format file ``'NETCDF3_64BIT'`` Output to a CF-netCDF3 64-bit offset format file ``'NETCDF4_CLASSIC'`` Output to a CF-netCDF4 classic format file ``'NETCDF4'`` Output to a CF-netCDF4 format file ``'CFA3'`` Output to a CFA-netCDF3 classic format file ``'CFA4'`` Output to a CFA-netCDF4 format file ===================== ================================================ By default the *fmt* is ``'NETCDF3_CLASSIC'``. Note that the netCDF3 formats may be slower than any of the other options. overwrite: `bool`, optional If False then raise an exception if the output file pre-exists. By default a pre-existing output file is over written. verbose: `bool`, optional If True then print one-line summaries of each field written. cfa_options: `dict`, optional A dictionary giving parameters for configuring the output CFA-netCDF file: ========== =============================================== Key Value ========== =============================================== ``'base'`` * If ``None`` (the default) then file names within CFA-netCDF files are stored with absolute paths. * If set to an empty string then file names within CFA-netCDF files are given relative to the directory or URL base containing the output CFA-netCDF file. * If set to a string then file names within CFA-netCDF files are given relative to the directory or URL base described by the value. For example: ``'../archive'``. ========== =============================================== By default no parameters are specified. mode: `str`, optional Specify the mode of write access for the output file. One of: ======= ===================================================== mode Description ======= ===================================================== ``'w'`` Open a new file for writing to. If it exists and *overwrite* is True then the file is deleted prior to being recreated. ======= ===================================================== By default the file is opened with write access mode ``'w'``. endian: `str`, optional The endian-ness of the output file. Valid values are ``'little'``, ``'big'`` or ``'native'``. By default the output is native endian. compress: `int`, optional Regulate the speed and efficiency of compression. Must be an integer between ``0`` and ``9``. ``0`` means no compression; ``1`` is the fastest, but has the lowest compression ratio; ``9`` is the slowest but best compression ratio. The default value is ``0``. An exception is raised if compression is requested for a netCDF3 output file format. least_significant_digit: `int`, optional Truncate the input field data arrays. For a positive integer, N the precision that is retained in the compressed data is '10 to the power -N'. For example, a value of ``2`` will retain a precision of 0.01. In conjunction with the *compress* parameter this produces 'lossy', but significantly more efficient compression. fletcher32: `bool`, optional If True then the Fletcher-32 HDF5 checksum algorithm is activated to detect compression errors. Ignored if *compress* is ``0``. no_shuffle: `bool`, optional If True then the HDF5 shuffle filter (which de-interlaces a block of data before compression by reordering the bytes by storing the first byte of all of a variable's values in the chunk contiguously, followed by all the second bytes, and so on) is turned off. By default the filter is applied because if the data array values are not all wildly different, using the filter can make the data more easily compressible. Ignored if *compress* is ``0``. datatype: `dict`, optional Specify data type conversions to be applied prior to writing data to disk. Arrays with data types which are not specified remain unchanged. By default, input data types are preserved. Data types defined by `numpy.dtype` objects in a dictionary whose are input data types with values of output data types. **Example:** To convert 64-bit floats and 64-bit integers to their 32-bit counterparts: ``datatype={numpy.dtype('float64'): numpy.dtype('float32'), numpy.dtype('int64'): numpy.dtype('int32')}``. single: `bool`, optional Write 64-bit floats as 32-bit floats and 64-bit integers as 32-bit integers. By default, input data types are preserved. Note that ``single=True`` is exactly equivalent to ``datatype={numpy.dtype('float64'): numpy.dtype('float32'), numpy.dtype('int64'): numpy.dtype('int32')}``. double: `bool`, optional Write 32-bit floats as 64-bit floats and 32-bit integers as 64-bit integers. By default, input data types are preserved. Note that ``double=True`` is exactly equivalent to ``datatype={numpy.dtype('float32'): numpy.dtype('float64'), numpy.dtype('int32'): numpy.dtype('int64')}``. HDF_chunksizes: `dict`, optional Manually specify HDF5 chunks for the field data arrays. Chunking refers to a storage layout where a data array is partitioned into fixed-size multi-dimensional chunks when written to a netCDF4 file on disk. Chunking is ignored if the field is written to a netCDF3 format file. A chunk has the same rank as the data array, but with fewer (or no more) elements along each axes. The chunk is defined by a dictionary whose keys identify axes with values of the chunks size for those axes. If a given chunk size for an axis is larger than the axis size for any field, then the size of the axis at the time of writing to disk will be used instead. If chunk sizes have been specified for some but not all axes, then the each unset chunk size is assumed to be the full size of the axis for each field. If no chunk sizes have been set for any axes then the netCDF default chunk is used (http://www.unidata.ucar.edu/software/netcdf/docs/netcdf_perf_chunking.html). If any chunk sizes have already been set on a field with the `cf.Field.HDF_chunks` method then these are used in instead. A detailed discussion of HDF chunking and I/O performance is available at https://www.hdfgroup.org/HDF5/doc/H5.user/Chunking.html and http://www.unidata.ucar.edu/software/netcdf/workshops/2011/nc4chunking. Basically, you want the chunks for each dimension to match as closely as possible the size and shape of the data block that users will read from the file. unlimited: sequence of `str`, optional Create a unlimited dimensions (dimensions that can be appended to). A dimension is identified by either a standard name; one of T, Z, Y, X denoting time, height or horixontal axes (as defined by the CF conventions); or the value of an arbitrary CF property preceeded by the property name and a colon. For example: Multiple unlimited axes may be defined by specifying more than one --unlimited option. Note, however, that only netCDF4 formats support multiple unlimited dimensions. For example, to set the time and Z dimensions to be unlimited you could use --unlim- ited=time --unlimited=Z An example of defining an axis by an arbitrary CF property could be --unlimited=long_name:pseudo_level :Returns: `None` :Raises: IOError: If *overwrite* is False and the output file pre-exists. :Examples: >>> f [, , , ] >>> write(f , 'file') >>> type(f) >>> type(g) >>> cf.write([f, g], 'file.nc', verbose=True) [, , , ] ''' if fields: netcdf_write(fields, filename, fmt=fmt, overwrite=overwrite, verbose=verbose, cfa_options=cfa_options, mode=mode, least_significant_digit=least_significant_digit, endian=endian, compress=compress, no_shuffle=no_shuffle, fletcher32=fletcher32, datatype=datatype, single=single, double=double, reference_datetime=reference_datetime, variable_attributes=variable_attributes, HDF_chunks=HDF_chunksizes, unlimited=unlimited) #--- End: def cf-python-1.3.2/cf/regrid.py0000644000175000017500000006017112752572326016062 0ustar daviddavid00000000000000# -*- coding: utf-8 -*- from numpy import array as numpy_array from numpy import empty as numpy_empty from numpy import where as numpy_where from numpy import sum as numpy_sum from .data.data import Data from .coordinate import DimensionCoordinate from .functions import REGRID_LOGGING from . import _found_ESMF if _found_ESMF: try: import ESMF except Exception as error: print("WARNING: Can not import ESMF for regridding: {0}".format(error)) class Regrid: """ Class containing all the methods required for accessing ESMF regridding through ESMPY and the associated utility methods. """ def __init__(self, srcfield, dstfield, srcfracfield, dstfracfield, method='conservative'): """ Creates a handle for regridding fields from a source grid to a destination grid that can then be used by the run_regridding method. :Parameters: srcfield: ESMF.Field The source field with an associated grid to be used for regridding. dstfield: ESMF.Field The destination field with an associated grid to be used for regridding. srcfracfield: ESMF.Field A field to hold the fraction of the source field that contributes to conservative regridding. dstfracfield: ESMF.Field A field to hold the fraction of the source field that contributes to conservative regridding. method: string, optional By default the regridding method is set to 'conservative'. In this case first-order conservative regridding is used. If it is set to 'bilinear' then multilinear interpolation is used. If it is set to 'nearest_stod' then nearest neighbor interpolation is used where each destination point is mapped to the closest source point. A given source point may map to multiple destination points, but no destination point will receive input from more than one source point. If it is set to 'nearest_dtos' then nearest neighbor interpolation is used where each source point is mapped to the closest destination point. A given destination point may receive input from multiple source points, but no source point will map to more than one destination point. srchasbounds: bool, optional Whether or not the source field has bounds for use by the auto method. dsthasbounds: bool, optional Whether or not the destination fields has bounds for use by the auto method """ # create a handle to the regridding method if method == 'conservative': regrid_method = ESMF.RegridMethod.CONSERVE elif method == 'bilinear': regrid_method = ESMF.RegridMethod.BILINEAR elif method == 'nearest_stod': regrid_method = ESMF.RegridMethod.NEAREST_STOD elif method == 'nearest_dtos': regrid_method = ESMF.RegridMethod.NEAREST_DTOS else: raise ValueError('Regrid method not recognised.') self.regridSrc2Dst = ESMF.Regrid(srcfield, dstfield, regrid_method=regrid_method, src_mask_values=numpy_array([0], dtype='int32'), dst_mask_values=numpy_array([0], dtype='int32'), src_frac_field=srcfracfield, dst_frac_field=dstfracfield, unmapped_action=ESMF.UnmappedAction.IGNORE) #--- End: def def destroy(self): """ Free the memory associated with the ESMF.Regrid instance. """ self.regridSrc2Dst.destroy() #--- End: def @staticmethod def initialize(): """ Check whether ESMF has been found. If not raise an import error. Initialise the ESMPy manager. Whether logging is enabled or not is determined by cf.REGRID_LOGGING. If it is then logging takes place after every call to ESMPy. :Returns: manager: ESMF.Manager A singleton instance of the ESMPy manager. """ if not _found_ESMF: raise ImportError('The ESMF package is needed to support regridding.') manager = ESMF.Manager(debug=REGRID_LOGGING()) return manager #--- End: def @staticmethod def create_grid(lon, lat, cyclic, mask=None, use_bounds=True): """ Create an ESMPy grid given 1D latitude and 1D longitude coordinates for use as a source or destination grid in regridding. Optionally the grid may have an associated mask. :Parameters: lon : DimensionCoordinate The DimensionCoordinate containing the 1D longitude coordinates. lat : DimensionCoordinate The DimensionCoordinate containing the 1D latitude coordinates. cyclic : bool Whether or not the longitude is cyclic. mask : numpy.ndarray, optional An optional numpy array of booleans containing the grid points to mask. Where the elements of mask are True the output grid is masked. use_bounds : bool, optional Whether to populate the grid corners with information from the bounds or not. True by default. :Returns: out: ESMF.Grid The resulting ESMPy grid for use as a source or destination grid in regridding. """ if use_bounds: # Get the bounds, creating them if they do not exist x_bounds = lon.get_bounds(create=True) y_bounds = lat.get_bounds(create=True).clip(-90, 90, 'degrees').array # If not set as cyclic already, check for cyclicity if not cyclic: cyclic = abs(x_bounds.datum(-1) - x_bounds.datum(0)) == Data(360, 'degrees') #--- End: if x_bounds = x_bounds.array #--- End: if # Create empty grid max_index = numpy_array([lon.size, lat.size], dtype='int32') if use_bounds: staggerLocs = [ESMF.StaggerLoc.CORNER, ESMF.StaggerLoc.CENTER] else: staggerLocs = [ESMF.StaggerLoc.CENTER] #--- End: if if cyclic: grid = ESMF.Grid(max_index, num_peri_dims=1, staggerloc=staggerLocs) else: grid = ESMF.Grid(max_index, staggerloc=staggerLocs) #--- End: if # Populate grid centres x, y = 0, 1 gridXCentre = grid.get_coords(x, staggerloc=ESMF.StaggerLoc.CENTER) gridXCentre[...] = lon.array.reshape((lon.size, 1)) gridYCentre = grid.get_coords(y, staggerloc=ESMF.StaggerLoc.CENTER) gridYCentre[...] = lat.array.reshape((1, lat.size)) if use_bounds: # Populate grid corners gridCorner = grid.coords[ESMF.StaggerLoc.CORNER] if cyclic: gridCorner[x][...] = x_bounds[:, 0].reshape(lon.size, 1) else: n = x_bounds.shape[0] tmp_x = numpy_empty(n + 1) tmp_x[:n] = x_bounds[:,0] tmp_x[n] = x_bounds[-1,1] gridCorner[x][...] = tmp_x.reshape(lon.size + 1, 1) #--- End: if n = y_bounds.shape[0] tmp_y = numpy_empty(n + 1) tmp_y[:n] = y_bounds[:,0] tmp_y[n] = y_bounds[-1,1] gridCorner[y][...] = tmp_y.reshape(1, lat.size + 1) #--- End: if # Add the mask if appropriate if mask is not None: gmask = grid.add_item(ESMF.GridItem.MASK) gmask[...] = 1 gmask[mask] = 0 #--- End: if return grid #--- End: def @staticmethod def create_2Dgrid(lon, lat, x_order, y_order, cyclic, mask=None, use_bounds=True): """ Create an ESMPy grid given 2D latitude and 2D longitude coordinates for use as a source or destination grid in regridding. Optionally the grid may have an associated mask. :Parameters: lon: AuxiliaryCoordinate The AuxiliaryCoordinate containing the 2D longitude coordinates. lat : AuxiliaryCoordinate The AuxiliaryCoordinate containing the 2D latitude coordinates. x_order : tuple A tuple indicating the order of the x and y axes for longitude. y_order : tuple A tuple indicating the order of the x and y axes for latitude. cyclic : bool Whether or not the longitude is cyclic. mask : numpy.ndarray, optional An optional numpy array of booleans containing the grid points to mask. Where the elements of mask are True the output grid is masked. use_bounds : bool, optional Whether to populate the grid corners with information from the bounds or not. True by default. :Returns: out: ESMF.Grid The resulting ESMPy grid for use as a source or destination grid in regridding. """ # Get the shape of the grid shape = lon.transpose(x_order).shape if lat.shape != lon.shape: raise ValueError('The longitude and latitude coordinates must' + ' have the same shape.') # Check whether bounds exist or not, and get them if they do if use_bounds: x_bounds = lon.bounds y_bounds = lat.bounds.clip(-90, 90, 'degrees') n = x_bounds.shape[0] m = x_bounds.shape[1] x_bounds = x_bounds.array y_bounds = y_bounds.array tmp_x = numpy_empty((n + 1, m + 1)) tmp_x[:n,:m] = x_bounds[:,:,0] tmp_x[:n,m] = x_bounds[:,-1,1] tmp_x[n,:m] = x_bounds[-1,:,3] tmp_x[n,m] = x_bounds[-1,-1,2] tmp_y = numpy_empty((n + 1, m + 1)) tmp_y[:n,:m] = y_bounds[:,:,0] tmp_y[:n,m] = y_bounds[:,-1,1] tmp_y[n,:m] = y_bounds[-1,:,3] tmp_y[n,m] = y_bounds[-1,-1,2] x_bounds = tmp_x y_bounds = tmp_y #--- End: if # Create empty grid max_index = numpy_array(shape, dtype='int32') if use_bounds: staggerLocs = [ESMF.StaggerLoc.CORNER, ESMF.StaggerLoc.CENTER] else: staggerLocs = ESMF.StaggerLoc.CENTER #--- End: if if cyclic: grid = ESMF.Grid(max_index, num_peri_dims=1, staggerloc=staggerLocs) else: grid = ESMF.Grid(max_index, staggerloc=staggerLocs) #--- End: if # Populate grid centres x, y = 0, 1 gridXCentre = grid.get_coords(x, staggerloc=ESMF.StaggerLoc.CENTER) gridXCentre[...] = lon.transpose(x_order).array gridYCentre = grid.get_coords(y, staggerloc=ESMF.StaggerLoc.CENTER) gridYCentre[...] = lat.transpose(y_order).array # Populate grid corners if there are bounds if use_bounds: gridCorner = grid.coords[ESMF.StaggerLoc.CORNER] x_bounds = x_bounds.transpose(x_order) y_bounds = y_bounds.transpose(y_order) if cyclic: x_bounds = x_bounds[:-1,:] y_bounds = y_bounds[:-1,:] gridCorner[x][...] = x_bounds gridCorner[y][...] = y_bounds #--- End: if # Add the mask if appropriate if mask is not None: gmask = grid.add_item(ESMF.GridItem.MASK) gmask[...] = 1 gmask[mask] = 0 #--- End: if return grid #--- End: def @staticmethod def create_cartesian_grid(coords, mask=None, use_bounds=True): """ Create a cartesian grid with between 1 and 3 dimensions given a tuple or list of dimension coordinates and optionally a mask. The number of coordinates passed will determine the dimensionality of the grid. :Parameters: coords : tuple or list of cf.DimensionCoordinate objects The coordinates specifying the grid. There must be between 1 and 3 elements. mask : numpy.ndarray, optional An optional numpy array of booleans containing the grid points to mask. Where the elements of mask are True the output grid is masked. use_bounds : bool, optional Whether to populate the grid corners with information from the bounds or not. True by default. :Returns: out: ESMF.Grid The resulting ESMPy grid for use as a source or destination grid in regridding. """ # Test the dimensionality of the list of coordinates ndim = len(coords) if ndim < 1 or ndim > 3: raise ValueError('Cartesian grid must have between 1 and 3 ' + 'dimensions.') #--- End: if if ndim == 1: coords = [DimensionCoordinate(data=Data(0), bounds=Data([-1e-6,1e-6]))] + coords if mask is not None: mask = mask[None,:] ndim = 2 #--- End: if shape = list() for coord in coords: shape.append(coord.size) # Initialize the grid max_index = numpy_array(shape, dtype='int32') if use_bounds: if ndim < 3: staggerLocs = [ESMF.StaggerLoc.CORNER, ESMF.StaggerLoc.CENTER] else: staggerLocs = [ESMF.StaggerLoc.CENTER_VCENTER, ESMF.StaggerLoc.CORNER_VFACE] #--- End: if else: if ndim < 3: staggerLocs = [ESMF.StaggerLoc.CENTER] else: staggerLocs = [ESMF.StaggerLoc.CENTER_VCENTER] #--- End: if #--- End: if grid = ESMF.Grid(max_index, coord_sys=ESMF.CoordSys.CART, staggerloc=staggerLocs) # Populate the grid centres for d in xrange(0, ndim): if ndim < 3: gridCentre = grid.get_coords(d, staggerloc=ESMF.StaggerLoc.CENTER) else: gridCentre = grid.get_coords(d, staggerloc=ESMF.StaggerLoc.CENTER_VCENTER) gridCentre[...] = coords[d].array.reshape([shape[d] if x == d else 1 for x in xrange(0, ndim)]) #--- End: if #--- End: for # Populate grid corners if use_bounds: if ndim < 3: gridCorner = grid.coords[ESMF.StaggerLoc.CORNER] else: gridCorner = grid.coords[ESMF.StaggerLoc.CORNER_VFACE] #--- End: if for d in xrange(0, ndim): boundsD = coords[d].get_bounds(create=True).array if shape[d] > 1: tmp = numpy_empty(shape[d] + 1) tmp[0:-1] = boundsD[:, 0] tmp[-1] = boundsD[-1, 1] boundsD = tmp #--- End: if gridCorner[d][...] = boundsD.reshape([shape[d] + 1 if x == d else 1 for x in xrange(0, ndim)]) #--- End: for #--- End: if # Add the mask if appropriate if mask is not None: gmask = grid.add_item(ESMF.GridItem.MASK) gmask[...] = 1 gmask[mask] = 0 #--- End: if return grid #--- End: def @staticmethod def create_field(grid, name): """ Create an ESMPy field for use as a source or destination field in regridding given an ESMPy grid and a name. :Parameters: grid : ESMF.Grid The ESMPy grid to use in creating the field. name : str The name to give the field. :Returns: out : ESMF.Field The resulting ESMPy field for use as a source or destination field in regridding. """ field = ESMF.Field(grid, name) return field #--- End: def def run_regridding(self, srcfield, dstfield): dstfield = self.regridSrc2Dst(srcfield, dstfield, zero_region=ESMF.Region.SELECT) return dstfield #--- End: def @staticmethod def concatenate_data(data_list, axis): """ Concatenates a list of Data objects into a single Data object along the specified access (see cf.Data.concatenate for details). In the case that the list contains only one element, that element is simply returned. :Parameters: data_list : list The list of data objects to concatenate. axis : int The axis along which to perform the concatenation. :Returns: out : Data The resulting single Data object. """ if len(data_list) > 1: return Data.concatenate(data_list, axis=axis) else: assert len(data_list) == 1 return data_list[0] #--- End: if #--- End: def @staticmethod def reconstruct_sectioned_data(sections): """ Expects a dictionary of Data objects with ordering information as keys, as output by the section method when called with a Data object. Returns a reconstructed cf.Data object with the sections in the original order. :Parameters: sections : dict The dictionary or Data objects with ordering information as keys. :Returns: out : Data The resulting reconstructed Data object. """ ndims = len(sections.keys()[0]) for i in range(ndims - 1, -1, -1): keys = sorted(sections.keys()) if i==0: if keys[0][i] is None: assert len(keys) == 1 return sections.values()[0] else: data_list = [] for k in keys: data_list.append(sections[k]) return Regrid.concatenate_data(data_list, i) #--- End: if else: if keys[0][i] is None: pass else: new_sections = {} new_key = keys[0][:i] data_list = [] for k in keys: if k[:i] == new_key: data_list.append(sections[k]) else: new_sections[new_key] = Regrid.concatenate_data(data_list, i) new_key = k[:i] data_list = [sections[k]] #--- End: if new_sections[new_key] = Regrid.concatenate_data(data_list, i) sections = new_sections #--- End: if #--- End: if #--- End: def @staticmethod def get_latlong(f, name): """ Retrieve the latitude and longitude coordinates of a field for regridding and the associated informarion required. If 1D lat/long coordinates are found then these are returned, otherwise 2D lat/long coordinates are searched for and if found returned. :Parameters: f : Field The field to retrieve coordinates from. name : string A name to identify the field in error messages. :Returns: x : Coordinate The x coordinate (1D dimension coordinate or 2D auxilliary coordinate). y : Coordinate The y coordinate (1D dimension coordinate or 2D auxilliary coordinate). x_axis : string The key of the x dimension coordinate. y_axis : string The key of the y dimension coordinate. x_key : string The key of the x coordinate (1D dimension coordinate or 2D auxilliary coordinate). y_key : string The key of the y coordinate (1D dimension coordinate or 2D auxilliary coordinate). x_size : int The size of the x dimension coordinate. y_size : int The size of the y dimension coordinate. f_2D : bool True if 2D auxiliary coordinates are returned. """ # Retrieve the field's X and Y dimension coordinates x = f.dims('X') y = f.dims('Y') if len(x) != 1 or len(y) != 1: raise ValueError('Unique dimension coordinates specifying the X' + ' and Y axes of the ' + name + ' field not found.') #--- End: if x_axis, x = x.popitem() y_axis, y = y.popitem() x_key = x_axis y_key = y_axis x_size = x.size y_size = y.size # If 1D latitude and longitude coordinates for the field are not found # search for 2D auxiliary coordinates. if not x.Units.islongitude or not y.Units.islatitude: lon_found = False lat_found = False for key, aux in f.auxs(ndim=2).iteritems(): if aux.Units.islongitude: if lon_found: raise ValueError('The 2D auxiliary longitude coordinate' + ' of the ' + name + ' field is not unique.') else: lon_found = True x = aux x_key = key #--- End: if #--- End: if if aux.Units.islatitude: if lat_found: raise ValueError('The 2D auxiliary latitude coordinate' + ' of the ' + name + ' field is not unique.') else: lat_found = True y = aux y_key = key #--- End: if #--- End: if if not lon_found or not lat_found: raise ValueError('Both longitude and latitude coordinates' + ' were not found for the ' + name + ' field.') f_2D = True else: f_2D = False #--- End: if return x, y, x_axis, y_axis, x_key, y_key, x_size, y_size, f_2D #--- End: def @staticmethod def get_cartesian_coords(f, name, axes): ''' Retrieve the specified cartesian dimension coordinates of a field and their corresponding keys. :Parameters: f : Field The field to retrieve dimension coordinates from. name : string A name to identify the field in error messages. axes : iterable Specifiers for the dimension coordinates to be retrieved. See cf.Field.axes for details. :Returns: axis_keys : list A list of the keys of the dimension coordinates retrieved. coords : list A list of the dimension coordinates retrieved. ''' axis_keys = [] for axis in axes: tmp = f.axes(axis) if len(tmp) != 1: raise ValueError('Each item in axes keywrod must specify ' + 'exactly one axis.') axis_keys.append(tmp.pop()) coords = [] for key in axis_keys: d = f.dim(key) if d is None: raise ValueError('No ' + name + ' dimension coordinate ' + 'matches key ' + key + '.') coords.append(d) return axis_keys, coords @staticmethod def compute_mass_grid(valuefield, areafield, dofrac=False, fracfield=None, uninitval=422397696.): ''' Compute the mass of a data field. :Parameters: valuefield : ESMF.Field This contains data values of a field built on the cells of a grid. areafield : ESMF.Field This contains the areas associated with the grid cells. fracfield : ESMF.Field This contains the fractions of each cell which contributed to a regridding operation involving 'valuefield. dofrac : bool This gives the option to not use the 'fracfield'. uninitval : float The value uninitialised cells take. :Returns: mass : float The mass of the data field is computed. ''' mass = 0.0 areafield.get_area() ind = numpy_where(valuefield.data != uninitval) if dofrac: mass = numpy_sum(areafield.data[ind] * valuefield.data[ind] * fracfield.data[ind]) else: mass = numpy_sum(areafield.data[ind] * valuefield.data[ind]) return mass #--- End: def #--- End: class cf-python-1.3.2/cf/functions.py0000644000175000017500000016216612762500411016610 0ustar daviddavid00000000000000import resource import copy import cPickle import netCDF4 import psutil from numpy import __file__ as numpy__file__ from numpy import __version__ as numpy__version__ from numpy import all as numpy_all from numpy import allclose as numpy_allclose from numpy import array as numpy_array from numpy import ascontiguousarray as numpy_ascontiguousarray from numpy import dtype as numpy_dtype from numpy import ndarray as numpy_ndarray from numpy import ndim as numpy_ndim from numpy import take as numpy_take from numpy import tile as numpy_tile from numpy import shape as numpy_shape from numpy import where as numpy_where from numpy.ma import all as numpy_ma_all from numpy.ma import allclose as numpy_ma_allclose from numpy.ma import is_masked as numpy_ma_is_masked from numpy.ma import isMA as numpy_ma_isMA from numpy.ma import masked as numpy_ma_masked from collections import Iterable from hashlib import md5 as hashlib_md5 from marshal import dumps as marshal_dumps from math import ceil as math_ceil from os import getpid, listdir, mkdir, curdir from os.path import isfile as os_path_isfile from os.path import abspath as os_path_abspath from os.path import commonprefix as os_path_commonprefix from os.path import expanduser as os_path_expanduser from os.path import expandvars as os_path_expandvars from os.path import dirname as os_path_dirname from os.path import join as os_path_join from os.path import relpath as os_path_relpath from inspect import getargspec from itertools import product as itertools_product from itertools import izip, izip_longest from platform import system, platform, python_version from psutil import virtual_memory, Process from sys import executable as sys_executable from urlparse import urlparse as urlparse_urlparse from urlparse import urljoin as urlparse_urljoin from . import __version__, __file__ from .constants import CONSTANTS, _file_to_fh # Are we running on GNU/Linux? _linux = system() == 'Linux' if _linux: # ---------------------------------------------------------------- # GNU/LINUX # ---------------------------------------------------------------- _meminfo_fields = set(('SReclaimable:', 'Cached:', 'Buffers:', 'MemFree:')) _meminfo_file = open('/proc/meminfo', 'r', 1) def _free_memory(): ''' The amount of available physical memory on GNU/Linux. This amount includes any memory which is still allocated but is no longer required. :Returns: out: `float` The amount of available physical memory in bytes. :Examples: >>> _free_memory() 96496240.0 ''' # https://github.com/giampaolo/psutil/blob/master/psutil/_pslinux.py # ---------------------------------------------------------------- # The available physical memory is the sum of the values of # the 'SReclaimable', 'Cached', 'Buffers' and 'MemFree' # entries in the /proc/meminfo file # (http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/filesystems/proc.txt). # ---------------------------------------------------------------- free_KiB = 0.0 n=0 for line in _meminfo_file: field_size = line.split() if field_size[0] in _meminfo_fields: free_KiB += float(field_size[1]) n += 1 if n > 3: break #--- End: for _meminfo_file.seek(0) return free_KiB * 1024 #--- End: def else: # ---------------------------------------------------------------- # NOT GNU/LINUX # ---------------------------------------------------------------- def _free_memory(): ''' The amount of available physical memory. :Returns: out: float The amount of available physical memory in bytes. :Examples: >>> _free_memory() 96496240.0 ''' return float(virtual_memory().available) #--- End: def #--- End: if def FREE_MEMORY(): ''' The available physical memory. If the FREE_MEMORY constant is not None then its value is returned, otherwise the actual amount of free memory is calculated and returned. In either case, the FREE_MEMORY constant is not updated. The FREE_MEMORY constant is set with the ``cf.SET_FREE_MEMORY`` function. Note that in the former case, the returned value is likely to differ from the actual amount of free memory. However, calculating the actual amount of free memory is expensive, so it may be desireable to set it once at the start of a process, ideally resetting it to None after the process has completed. :Returns: out: `float` The amount of free memory in bytes. :Examples: >>> import numpy >>> print 'Free memory =', cf.FREE_MEMORY()/2**30, 'GiB' Free memory = 88.2728042603 GiB >>> a = numpy.arange(10**9) >>> print 'Free memory =', cf.FREE_MEMORY()/2**30, 'GiB' Free memory = 80.8082618713 GiB >>> del a >>> print 'Free memory =', cf.FREE_MEMORY()/2**30, 'GiB' Free memory = 88.2727928162 GiB ''' free_memory = CONSTANTS['FREE_MEMORY'] if free_memory is None: return _free_memory() return free_memory #--- End: def def SET_FREE_MEMORY(*arg): ''' :Parameters: arg: `None`, optional :Returns: `None` :Examples: >>> cf.SET_FREE_MEMORY() >>> cf.SET_FREE_MEMORY(None) ''' if arg: CONSTANTS['FREE_MEMORY'] = arg[0] else: CONSTANTS['FREE_MEMORY'] = _free_memory() #--- End: def def FM_THRESHOLD(): ''' The amount of memory which is kept free as a temporary work space. :Returns: out: float The amount of memory in bytes. .. seealso:: `cf.CHUNKSIZE`, `cf.MINNCFM` :Examples: >>> cf.FM_THRESHOLD() 10000000000.0 >>> old = cf.MINNCFM(2*cf.MINNCFM()) >>> cf.FM_THRESHOLD() 20000000000.0 ''' return CONSTANTS['FM_THRESHOLD'] #--- End: def def CHUNKSIZE(*size): ''' The memory chunk size in bytes for data storage and processing. When setting the chunk size, the amount of minimum amount of memory to be kept free as a temporary work space is also updated. :Parameters: size: int, optional The new chunk size in bytes. The default is to not change the current value. :Returns: out: float The value prior to the change, or the current value if no new value was specified. .. seealso:: `cf.MINNCFM` :Examples: >>> cf.CHUNKSIZE() 57095864.32 >>> old = cf.CHUNKSIZE(2**30) >>> cf.CHUNKSIZE(old) 1073741824 >>> cf.CHUNKSIZE() 57095864.32 ''' old = CONSTANTS['CHUNKSIZE'] if size: size = size[0] CONSTANTS['CHUNKSIZE'] = size CONSTANTS['FM_THRESHOLD'] = MINNCFM() * size #--- End: if return old #--- End: def def TOTAL_MEMORY(): ''' ''' return CONSTANTS['TOTAL_MEMORY'] #--- End: def def MINNCFM(*arg): ''' The number of chunks of memory to be kept free as a temporary work space. A chunk of memory is the amount of memory set by `cf.CHUNKSIZE`. :Parameters: arg: int, optional The number of chunks to be kept free as a temporary work space. The default is to not change the current value. :Returns: out: int The value prior to the change, or the current value if no new value was specified. .. seealso:: `cf.CHUNKSIZE` :Examples: >>> cf.MINNCFM() 10 >>> old = cf.MINNCFM(20) >>> cf.MINNCFM(old) 20 >>> f.MINNCFM() 10 ''' old = CONSTANTS['MINNCFM'] if arg: minncfm = arg[0] CONSTANTS['MINNCFM'] = minncfm CONSTANTS['FM_THRESHOLD'] = minncfm * CHUNKSIZE() return old #--- End: def def TEMPDIR(*arg): ''' The directory for internally generated temporary files. When setting the directory, it is created if the specified path does not exist. :Parameters: arg: str, optional The new directory for temporary files. Tilde expansion (an initial component of ``~`` or ``~user`` is replaced by that *user*'s home directory) and environment variable expansion (substrings of the form ``$name`` or ``${name}`` are replaced by the value of environment variable *name*) are applied to the new directory name. The default is to not change the directory. :Returns: out: str The directory prior to the change, or the current directory if no new value was specified. :Examples: >>> cf.TEMPDIR() '/tmp' >>> old = cf.TEMPDIR('/home/me/tmp') >>> cf.TEMPDIR(old) '/home/me/tmp' >>> cf.TEMPDIR() '/tmp' ''' old = CONSTANTS['TEMPDIR'] if arg: tempdir = os_path_expanduser(os_path_expandvars(arg[0])) # Create the directory if it does not exist. try: mkdir(tempdir) except OSError: pass CONSTANTS['TEMPDIR'] = tempdir #--- End: if return old #--- End: def def OF_FRACTION(*arg): ''' The amount of concurrently open files above which files containing data arrays may be automatically closed. The amount is expressed as a fraction of the maximum possible number of concurrently open files. Note that closed files will be automatically reopened if subsequently needed by a variable to access its data array. :Parameters: arg: float, optional The new fraction (between 0.0 and 1.0). The default is to not change the current behaviour. :Returns: out: float The value prior to the change, or the current value if no new value was specified. .. seealso:: `cf.close_files`, `cf.close_one_file`, `cf.open_files`, `cf.open_files_threshold_exceeded` :Examples: >>> cf.OF_FRACTION() 0.5 >>> old = cf.OF_FRACTION(0.33) >>> cf.OF_FRACTION(old) 0.33 >>> cf.OF_FRACTION() 0.5 The fraction may be translated to an actual number of files as follows: >>> old = cf.OF_FRACTION(0.75) >>> import resource >>> max_open_files = resource.getrlimit(resource.RLIMIT_NOFILE)[0] >>> threshold = int(max_open_files * cf.OF_FRACTION()) >>> max_open_files, threshold (1024, 768) ''' old = CONSTANTS['OF_FRACTION'] if arg: CONSTANTS['OF_FRACTION'] = arg[0] return old #--- End: def def REGRID_LOGGING(*arg): """ Whether or not to enable ESMPy logging. If it is logging is performed after every call to ESMPy. :Parameters: arg: bool, optional The new value (either True to enable logging or False to disable it). The default is to not change the current behaviour. :Returns: out: bool The value prior to the change, or the current value if no new value was specified. :Examples: >>> cf.REGRID_LOGGING() False >>> cf.REGRID_LOGGING(True) False >>> cf.REGRID_LOGGING() True """ old = CONSTANTS['REGRID_LOGGING'] if arg: CONSTANTS['REGRID_LOGGING'] = arg[0] return old #--- End:def def dump(x, **kwargs): ''' Print a description of an object. If the object has a `!dump` method then this is used to create the output, so that ``cf.dump(f)`` is equivalent to ``print f.dump()``. Otherwise ``cf.dump(x)`` is equivalent to ``print x``. :Parameters: x: The object to print. kwargs: *optional* As for the input variable's `!dump` method, if it has one. :Returns: None :Examples: >>> x = 3.14159 >>> cf.dump(x) 3.14159 >>> f >>> cf.dump(f) >>> cf.dump(f, complete=True) ''' if hasattr(x, 'dump') and callable(x.dump): print x.dump(**kwargs) else: print x #--- End: def _max_number_of_open_files = resource.getrlimit(resource.RLIMIT_NOFILE)[0] if _linux: # ---------------------------------------------------------------- # GNU/LINUX # ---------------------------------------------------------------- # Directory containing a symbolic link for each file opened by the # current python session _fd_dir = '/proc/'+str(getpid())+'/fd' def open_files_threshold_exceeded(): ''' Return True if the total number of open files is greater than the current threshold. GNU/LINUX. The threshold is defined as a fraction of the maximum possible number of concurrently open files (an operating system dependent amount). The fraction is retrieved and set with the `OF_FRACTION` function. :Returns: out: bool Whether or not the number of open files exceeds the threshold. .. seealso:: `cf.close_files`, `cf.close_one_file`, `cf.open_files` :Examples: In this example, the number of open files is 75% of the maximum possible number of concurrently open files: >>> cf.OF_FRACTION() 0.5 >>> print cf.open_files_threshold_exceeded() True >>> cf.OF_FRACTION(0.9) >>> print cf.open_files_threshold_exceeded() False ''' return len(listdir(_fd_dir)) > _max_number_of_open_files * OF_FRACTION() #---End: def else: # ---------------------------------------------------------------- # NOT GNU/LINUX # ---------------------------------------------------------------- _process = Process(getpid()) def open_files_threshold_exceeded(): ''' Return True if the total number of open files is greater than the current threshold. The threshold is defined as a fraction of the maximum possible number of concurrently open files (an operating system dependent amount). The fraction is retrieved and set with the `OF_FRACTION` function. :Returns: out: bool Whether or not the number of open files exceeds the threshold. .. seealso:: `cf.close_files`, `cf.close_one_file`, `cf.open_files` :Examples: In this example, the number of open files is 75% of the maximum possible number of concurrently open files: >>> cf.OF_FRACTION() 0.5 >>> print cf.open_files_threshold_exceeded() True >>> cf.OF_FRACTION(0.9) >>> print cf.open_files_threshold_exceeded() False ''' return len(_process.open_files()) > _max_number_of_open_files * OF_FRACTION() #---End: def #---End: if def close_files(file_format=None): '''Close open files containing sub-arrays of data arrays. By default all such files are closed, but this may be restricted to files of a particular format. Note that closed files will be automatically reopened if subsequently needed by a variable to access the sub-array. If there are no appropriate open files then no action is taken. :Parameters: file_format: str, optional Only close files of the given format. Recognised formats are ``'netCDF'`` and ``'PP'``. By default files of any format are closed. :Returns: None .. seealso:: `cf.close_one_file`, `cf.open_files`, `cf.open_files_threshold_exceeded` :Examples: >>> cf.close_files() >>> cf.close_files('netCDF') >>> cf.close_files('PP') ''' if file_format is not None: if file_format in _file_to_fh: for fh in _file_to_fh[file_format].itervalues(): fh.close() _file_to_fh[file_format].clear() else: for file_format, value in _file_to_fh.iteritems(): for fh in value.itervalues(): fh.close() _file_to_fh[file_format].clear() #---End: def def close_one_file(file_format=None): '''Close an arbitrary open file containing a sub-array of a data array. By default a file of arbitrary format is closed, but the choice may be restricted to files of a particular format. Note that the closed file will be automatically reopened if subsequently needed by a variable to access the sub-array. If there are no appropriate open files then no action is taken. :Parameters: file_format: str, optional Only close a file of the given format. Recognised formats are ``'netCDF'`` and ``'PP'``. By default a file of any format is closed. :Returns: None .. seealso:: `cf.close_files`, `cf.open_files`, `cf.open_files_threshold_exceeded` :Examples: >>> cf.close_one_file() >>> cf.close_one_file('netCDF') >>> cf.close_one_file('PP') >>> cf.open_files() {'netCDF': {'file1.nc': , 'file2.nc': , 'file3.nc': }} >>> cf.close_one_file() >>> cf.open_files() {'netCDF': {'file1.nc': , 'file3.nc': }} ''' if file_format is not None: if file_format in _file_to_fh and _file_to_fh[file_format]: filename, fh = next(_file_to_fh[file_format].iteritems()) fh.close() del _file_to_fh[file_format][filename] else: for values in _file_to_fh.itervalues(): if not values: continue filename, fh = next(values.iteritems()) fh.close() del values[filename] return #---End: def def open_files(file_format=None): ''' Return the open files containing sub-arrays of data arrays. By default all such files are returned, but the selection may be restricted to files of a particular format. :Parameters: file_format: str, optional Only return files of the given format. Recognised formats are ``'netCDF'`` and ``'PP'``. By default all files are returned. :Returns: out: dict If *file_format* is set then return a dictionary of file names of the specified format and their open file objects. If *file_format* is not set then return a dictionary for which each key is a file format whose value is the dictionary that would have been returned if the *file_format* parameter was set. .. seealso:: `cf.close_files`, `cf.close_one_file`, `cf.open_files_threshold_exceeded` :Examples: >>> cf.open_files() {'netCDF': {'file1.nc': }} >>> cf.open_files('netCDF') {'file1.nc': } >>> cf.open_files('PP') {} ''' if file_format is not None: if file_format in _file_to_fh: return _file_to_fh[file_format].copy() else: return {} else: out = {} for file_format, values in _file_to_fh.iteritems(): out[file_format] = values.copy() return out #---End: def def ufunc(name, x, *args, **kwargs): ''' The variable must have a `!copy` method and a method called *name*. Any optional positional and keyword arguments are passed unchanged to the variable's *name* method. :Parameters: name: str x: The input variable. args, kwargs: :Returns: out: A new variable with size 1 axes inserted into the data array. :Examples: ''' x = x.copy() getattr(x, name)(*args, **kwargs) return x #--- End: def def _numpy_allclose(a, b, rtol=None, atol=None): ''' Returns True if two broadcastable arrays have equal values to within numerical tolerance, False otherwise. The tolerance values are positive, typically very small numbers. The relative difference (``rtol * abs(b)``) and the absolute difference ``atol`` are added together to compare against the absolute difference between ``a`` and ``b``. :Parameters: a, b: array_like Input arrays to compare. atol: float, optional The absolute tolerance for all numerical comparisons, By default the value returned by the `ATOL` function is used. rtol: float, optional The relative tolerance for all numerical comparisons, By default the value returned by the `RTOL` function is used. :Returns: out: bool Returns True if the arrays are equal, otherwise False. :Examples: >>> cf._numpy_allclose([1, 2], [1, 2]) True >>> cf._numpy_allclose(numpy.array([1, 2]), numpy.array([1, 2])) True >>> cf._numpy_allclose([1, 2], [1, 2, 3]) False >>> cf._numpy_allclose([1, 2], [1, 4]) False >>> a = numpy.ma.array([1]) >>> b = numpy.ma.array([2]) >>> a[0] = numpy.ma.masked >>> b[0] = numpy.ma.masked >>> cf._numpy_allclose(a, b) True ''' if not (numpy_ma_isMA(a) or numpy_ma_isMA(b)): try: return numpy_allclose(a, b, rtol=rtol, atol=atol) except (IndexError, NotImplementedError, TypeError): return numpy_all(a == b) else: try: return numpy_ma_allclose(a, b, rtol=rtol, atol=atol) except (IndexError, NotImplementedError, TypeError): out = numpy_ma_all(a == b) if out is numpy_ma_masked: return True else: return out #--- End: def def parse_indices(data, indices, cyclic=False): ''' :Parameters: data: array-like indices: tuple :Returns: out: list [, dict] :Examples: ''' parsed_indices = [] roll = {} if not isinstance(indices, tuple): indices = (indices,) # Initialize the list of parsed indices as the input indices with any # Ellipsis objects expanded length = len(indices) n = data.ndim ndim = n for index in indices: if index is Ellipsis: m = n-length+1 parsed_indices.extend([slice(None)] * m) n -= m else: parsed_indices.append(index) n -= 1 length -= 1 #--- End: for len_parsed_indices = len(parsed_indices) if ndim and len_parsed_indices > ndim: raise IndexError("Invalid indices %s for array with shape %s" % (parsed_indices, data.shape)) if len_parsed_indices < ndim: parsed_indices.extend([slice(None)]*(ndim-len_parsed_indices)) if not ndim and parsed_indices: ## If data is scalar then allow it to be indexed with an ## equivalent to [0] #if (len_parsed_indices == 1 and # parsed_indices[0] in (0, # -1, # slice(0, 1), # slice(-1, None, -1), # slice(None, None, None))): # parsed_indices = [] #else: raise IndexError("Scalar array can only be indexed with () or Ellipsis") #--- End: if for i, (index, size) in enumerate(zip(parsed_indices, data.shape)): if isinstance(index, slice): start = index.start stop = index.stop step = index.step if start is None or stop is None: step = 0 elif step is None: step = 1 if step > 0: if 0 < start < size and 0 <= stop <= start: # 6:0:1 => -4:0:1 # 6:1:1 => -4:1:1 # 6:3:1 => -4:3:1 # 6:6:1 => -4:6:1 start = size-start elif -size <= start < 0 and -size <= stop <= start: # -4:-10:1 => -4:1:1 # -4:-9:1 => -4:1:1 # -4:-7:1 => -4:3:1 # -4:-4:1 => -4:6:1 # -10:-10:1 => -10:0:1 stop += size elif step < 0: if -size <= start < 0 and start <= stop < 0: # -4:-1:-1 => 6:-1:-1 # -4:-2:-1 => 6:-2:-1 # -4:-4:-1 => 6:-4:-1 # -10:-2:-1 => 0:-2:-1 # -10:-10:-1 => 0:-10:-1 start += size elif 0 <= start < size and start < stop < size: # 0:6:-1 => 0:-4:-1 # 3:6:-1 => 3:-4:-1 # 3:9:-1 => 3:-1:-1 stop -= size #--- End: if if step > 0 and -size <= start < 0 and 0 <= stop <= size+start: # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # -1:0:1 => [9] # -1:1:1 => [9, 0] # -1:3:1 => [9, 0, 1, 2] # -1:9:1 => [9, 0, 1, 2, 3, 4, 5, 6, 7, 8] # -4:0:1 => [6, 7, 8, 9] # -4:1:1 => [6, 7, 8, 9, 0] # -4:3:1 => [6, 7, 8, 9, 0, 1, 2] # -4:6:1 => [6, 7, 8, 9, 0, 1, 2, 3, 4, 5] # -9:0:1 => [1, 2, 3, 4, 5, 6, 7, 8, 9] # -9:1:1 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] # -10:0:1 => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] if cyclic: index = slice(0, stop-start, step) roll[i] = -start else: index = slice(start, stop, step) elif step < 0 and 0 <= start < size and start-size <= stop < 0: # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # 0:-4:-1 => [0, 9, 8, 7] # 6:-1:-1 => [6, 5, 4, 3, 2, 1, 0] # 6:-2:-1 => [6, 5, 4, 3, 2, 1, 0, 9] # 6:-4:-1 => [6, 5, 4, 3, 2, 1, 0, 9, 8, 7] # 0:-2:-1 => [0, 9] # 0:-10:-1 => [0, 9, 8, 7, 6, 5, 4, 3, 2, 1] if cyclic: index = slice(start-stop-1, None, step) roll[i] = -1 - stop else: index = slice(start, stop, step) else: start, stop, step = index.indices(size) if (start == stop or (start < stop and step < 0) or (start > stop and step > 0)): raise IndexError("Invalid indices %s for array with shape %s" % (parsed_indices, data.shape)) if step < 0 and stop < 0: stop = None index = slice(start, stop, step) elif isinstance(index, (int, long)): if index < 0: index += size index = slice(index, index+1, 1) else: convert2positve = True if getattr(getattr(index, 'dtype', None), 'kind', None) == 'b': # Convert booleans to non-negative integers. We're # assuming that anything with a dtype attribute also # has a size attribute. if index.size != size: raise IndexError( "Invalid indices %s for array with shape %s" % (parsed_indices, data.shape)) index = numpy_where(index)[0] convert2positve = False #--- End: if len_index = len(index) if len_index == 1: index = index[0] if index < 0: index += size index = slice(index, index+1, 1) elif not len_index: raise IndexError("Invalid indices %s for array with shape %s" % (parsed_indices, data.shape)) else: if convert2positve: # Convert to non-negative integer numpy array index = numpy_array(index) index = numpy_where(index < 0, index+size, index) steps = index[1:] - index[:-1] step = steps[0] if step and not (steps - step).any(): # We can replace the list with a slice object if step > 0: start, stop = index[0], index[-1]+1 elif step < 0: start, stop = index[0], index[-1]-1 if stop < 0: stop = None index = slice(start, stop, step) else: index = index.tolist() #--- End: if parsed_indices[i] = index #--- End: for if cyclic: return parsed_indices, roll else: return parsed_indices #--- End: def def get_subspace(array, indices): ''' :Parameters: array: numpy array indices: list Subset the input numpy array with the given indices. Indexing is similar to that of a numpy array. The differences to numpy array indexing are: 1. An integer index i takes the i-th element but does not reduce the rank of the output array by one. 2. When more than one dimension's slice is a 1-d boolean array or 1-d sequence of integers then these indices work independently along each dimension (similar to the way vector subscripts work in Fortran). indices must contain an index for each dimension of the input array. ''' gg = [i for i, x in enumerate(indices) if not isinstance(x, slice)] len_gg = len(gg) if len_gg < 2: # ------------------------------------------------------------ # At most one axis has a list-of-integers index so we can do a # normal numpy subspace # ------------------------------------------------------------ return array[tuple(indices)] else: # ------------------------------------------------------------ # At least two axes have list-of-integers indices so we can't # do a normal numpy subspace # ------------------------------------------------------------ if numpy_ma_isMA(array): take = numpy_ma_take else: take = numpy_take indices = indices[:] for axis in gg: array = take(array, indices[axis], axis=axis) indices[axis] = slice(None) if len_gg < len(indices): array = array[tuple(indices)] return array #--- End: if #--- End: def def set_subspace(array, indices, value): ''' ''' gg = [i for i, x in enumerate(indices) if not isinstance(x, slice)] if len(gg) < 2: # ------------------------------------------------------------ # At most one axis has a list-of-integers index so we can do a # normal numpy assignment # ------------------------------------------------------------ array[tuple(indices)] = value else: # ------------------------------------------------------------ # At least two axes have list-of-integers indices so we can't # do a normal numpy assignment # ------------------------------------------------------------ indices1 = indices[:] for i, x in enumerate(indices): if i in gg: y = [] args = [iter(x)] * 2 for start, stop in izip_longest(*args): if not stop: y.append(slice(start, start+1)) else: step = stop - start stop += 1 y.append(slice(start, stop, step)) #--- End: for indices1[i] = y else: indices1[i] = (x,) #--- End: for if not numpy_ndim(value) : for i in itertools_product(*indices1): array[i] = value else: indices2 = [] ndim_difference = array.ndim - numpy_ndim(value) for i, n in enumerate(numpy_shape(value)): if n == 1: indices2.append((slice(None),)) elif i + ndim_difference in gg: y = [] start = 0 while start < n: stop = start + 2 y.append(slice(start, stop)) start = stop #--- End: while indices2.append(y) else: indices2.append((slice(None),)) #--- End: for for i, j in izip(itertools_product(*indices1), itertools_product(*indices2)): array[i] = value[j] #--- End: def def ATOL(*arg): ''' The value of absolute tolerance for testing numerically tolerant equality. :Parameters: arg: int, optional The new value of absolute tolerance. The default is to not change the current value. :Returns: out: float The value prior to the change, or the current value if no new value was specified. .. seealso:: `cf.RTOL` :Examples: >>> cf.ATOL() 1e-08 >>> old = cf.ATOL(1e-10) >>> cf.ATOL(old) 1e-10 >>> cf.ATOL() 1e-08 ''' old = CONSTANTS['ATOL'] if arg: CONSTANTS['ATOL'] = arg[0] return old #--- End: def def RTOL(*arg): ''' The value of relative tolerance for testing numerically tolerant equality. :Parameters: arg: int, optional The new value of relative tolerance. The default is to not change the current value. :Returns: out: float The value prior to the change, or the current value if no new value was specified. .. seealso:: `cf.ATOL` :Examples: >>> cf.RTOL() 1.0000000000000001e-05 >>> old = cf.RTOL(1e-10) >>> cf.RTOL(old) 1e-10 >>> cf.RTOL() 1.0000000000000001e-05 ''' old = CONSTANTS['RTOL'] if arg: CONSTANTS['RTOL'] = arg[0] return old #--- End: def def equals(x, y, rtol=None, atol=None, ignore_fill_value=False, traceback=False): ''' True if and only if two objects are logically equal. If the first argument, *x*, has an :meth:`equals` method then it is used, and in this case ``equals(x, y)`` is equivalent to ``x.equals(y)``. Else if the second argument, *y*, has an :meth:`equals` method then it is used, and in this case ``equals(x, y)`` is equivalent to ``y.equals(x)``. :Parameters: x, y : The objects to compare for equality. atol: float, optional The absolute tolerance for all numerical comparisons, By default the value returned by the `ATOL` function is used. rtol: float, optional The relative tolerance for all numerical comparisons, By default the value returned by the `RTOL` function is used. ignore_fill_value: bool, optional If True then `cf.Data` arrays with different fill values are considered equal. By default they are considered unequal. traceback: bool, optional If True then print a traceback highlighting where the two objects differ. :Returns: out: bool Whether or not the two objects are equal. :Examples: >>> f >>> cf.equals(f, f) True >>> cf.equals(1.0, 1.0) True >>> cf.equals(1.0, 33) False >>> cf.equals('a', 'a') True >>> cf.equals('a', 'b') False >>> type(x), x.dtype (, dtype('int64')) >>> y = x.copy() >>> cf.equals(x, y) True >>> cf.equals(x, x+1) False >>> class A(object): ... pass ... >>> a = A() >>> b = A() >>> cf.equals(a, a) True >>> cf.equals(a, b) False ''' eq = getattr(x, 'equals', None) if callable(eq): # x has a callable equals method return eq(y, rtol=rtol, atol=atol, ignore_fill_value=ignore_fill_value, traceback=traceback) eq = getattr(y, 'equals', None) if callable(eq): # y has a callable equals method return eq(x, rtol=rtol, atol=atol, ignore_fill_value=ignore_fill_value, traceback=traceback) if isinstance(x, numpy_ndarray): if isinstance(y, numpy_ndarray): if x.shape != y.shape: return False if rtol is None: rtol = RTOL() if atol is None: atol = ATOL() return _numpy_allclose(x, y, rtol=rtol, atol=atol) else: return False elif isinstance(y, numpy_ndarray): return False else: return x == y #--- End: def def set_equals(x, y, rtol=None, atol=None, ignore_fill_value=False, traceback=False): ''' ''' eq = getattr(x, 'set_equals', None) if callable(eq): # x has a callable set_equals method return eq(y, rtol=rtol, atol=atol, ignore_fill_value=ignore_fill_value, traceback=traceback) eq = getattr(y, 'set_equals', None) if callable(eq): # y has a callable set_equals method return eq(x, rtol=rtol, atol=atol, ignore_fill_value=ignore_fill_value, traceback=traceback) return equals(x, y, rtol=rtol, atol=atol, ignore_fill_value=ignore_fill_value, traceback=traceback) #--- End: def def equivalent(x, y, rtol=None, atol=None, traceback=False): ''' True if and only if two objects are logically equivalent. If the first argument, *x*, has an `!equivalent` method then it is used, and in this case ``equivalent(x, y)`` is the same as ``x.equivalent(y)``. :Parameters: x, y: The objects to compare for equivalence. atol: float, optional The absolute tolerance for all numerical comparisons, By default the value returned by the `ATOL` function is used. rtol: float, optional The relative tolerance for all numerical comparisons, By default the value returned by the `RTOL` function is used. traceback: bool, optional If True then print a traceback highlighting where the two objects differ. :Returns: out: bool Whether or not the two objects are equivalent. :Examples: >>> f >>> cf.equivalent(f, f) True >>> cf.equivalent(1.0, 1.0) True >>> cf.equivalent(1.0, 33) False >>> cf.equivalent('a', 'a') True >>> cf.equivalent('a', 'b') False >>> cf.equivalent(cf.Data(1000, units='m'), cf.Data(1, units='km')) True For a field, ``f``: >>> cf.equivalent(f, f.transpose()) True ''' if rtol is None: rtol = RTOL() if atol is None: atol = ATOL() if hasattr(x, 'equivalent') and callable(x.equivalent): # x has a callable eequivalent method return x.equivalent(y, rtol=rtol, atol=atol, traceback=traceback) return equals(x, y, rtol=rtol, atol=atol, ignore_fill_value=True, traceback=traceback) #--- End: def def flat(x): ''' Return an iterator over an arbitrarily nested sequence. :Parameters: x: scalar or arbitrarily nested sequence The arbitrarily nested sequence to be flattened. Note that a If *x* is a string or a scalar then this is equivalent to passing a single element sequence containing *x*. :Returns: out: generator An iterator over flattened sequence. :Examples: >>> print cf.flat([1, [2, [3, 4]]]) >>> print list(cf.flat([1, (2, [3, 4])])) [1, 2, 3, 4] >>> import numpy >>> print list(cf.flat((1, [2, numpy.array([[3, 4], [5, 6]])])) [1, 2, 3, 4, 5, 6] >>> for a in cf.flat([1, [2, [3, 4]]]): ... print a, 1 2 3 4 >>> for a in cf.flat(['a', ['bc', ['def', 'ghij']]]): ... print a, ' ', a bc def ghij >>> for a in cf.flat(2004): ... print a 2004 >>> for a in cf.flat('abcdefghij'): ... print a abcdefghij >>> f >>> for a in cf.flat(f): ... print repr(a) >>> for a in cf.flat([f, [f, [f, f]]]): ... print repr(a) >>> fl = cf.FieldList(cf.flat([f, [f, [f, f]]]) >>> fl [, , , ] ''' if not isinstance(x, Iterable) or isinstance(x, basestring): x = (x,) for a in x: if not isinstance(a, basestring) and isinstance(a, Iterable): for sub in flat(a): yield sub else: yield a #--- End: def def pickle(x, filename, overwrite=False): ''' Write a binary pickled representation of an object to a file. Note that Field and FieldList objects are picklable and their pickle file size will be very small if their data arrays contain file pointers as opposed to numpy arrays. The pickling is equivalent to:: import cPickle fh = open('file.pkl', 'wb') cPickle.dump(x, fh, 2) fh.close() :Parameters: x: The object to be pickled. filename: str The name of the file in which to write the pickled representation of *x*. overwrite: bool, optional If True a pre-existing output file is over written. By default an exception is raised if the output file pre-exists. :Returns: None :Raises: IOError : If *overwrite* is False and the output file pre-exists. PickleError : If the object is not picklable. .. seealso:: `cf.unpickle` :Examples: For any picklable object, x: >>> cf.pickle(x, 'file.pkl') >>> y = cf.unpickle('file.pkl') >>> cf.equals(x, y) True ''' if not overwrite and os_path_isfile(filename): raise IOError( "Can't pickle to an existing file unless overwrite=True") fh = open(filename, 'wb') try: cPickle.dump(x, fh, 2) except: fh.close() raise cPickle.PickleError("Failed whilst pickling %s" % repr(x)) fh.close() #--- End: def def unpickle(filename): ''' Return the reconstituted (unpickled) object from a binary pickle file. Any binary pickle file may be used as input. The unpickling is equivalent to:: import cPickle fh = open('file.pkl', 'rb') x = cPickle.load(fh) fh.close() :Parameters: filename: str The name of the file containing the pickled object. :Returns: out: The reconstituted object. :Raises: UnpicklingError: If the file can not be unpickled. In particular, this might be raised when attempting to unpickle fields which were pickled with a different, incompatible version of cf. .. seealso:: `cf.pickle` :Examples: For any picklable object, x: >>> cf.pickle(x, 'file.pkl') >>> y = cf.unpickle('file.pkl') >>> cf.equals(x, y) True ''' fh = open(filename, 'rb') try: x = cPickle.load(fh) except: # Failed unpickling can throw up any type of error, so trap # them all, but raise an informative UnpicklingError. fh.close() raise cPickle.UnpicklingError( "Failed whilst unpickling file '%s'" % filename) fh.close() return x #--- End: def _d = {'char': numpy_dtype('S1')} def string_to_numpy_data_type(string): ''' ''' try: return numpy_dtype(string) except TypeError: try: return _d[string] except KeyError: raise TypeError("asdasd kkasdhahsjj734654376") #--- End: def def abspath(filename): ''' Return a normalized absolute version of a file name. If a string containing URL is provided then it is returned unchanged. :Parameters: filename: str The name of the file. :Returns: out: str The normalized absolutized version of *filename*. .. seealso:: `cf.dirname`, `cf.pathjoin`, `cf.relpath` :Examples: >>> import os >>> os.getcwd() '/data/archive' >>> cf.abspath('file.nc') '/data/archive/file.nc' >>> cf.abspath('..//archive///file.nc') '/data/archive/file.nc' >>> cf.abspath('http://data/archive/file.nc') 'http://data/archive/file.nc' ''' u = urlparse_urlparse(filename) if u.scheme != '': return filename return os_path_abspath(filename) #--- End: def def relpath(filename, start=None): ''' Return a relative filepath to a file. The filepath is relative either from the current directory or from an optional start point. If a string containing URL is provided then it is returned unchanged. :Parameters: filename: str The name of the file. start: str, optional The start point for the relative path. By default the current directoty is used. :Returns: out: str The relative path. .. seealso:: `cf.abspath`, `cf.dirname`, `cf.pathjoin` :Examples: >>> cf.relpath('/data/archive/file.nc') '../file.nc' >>> cf.relpath('/data/archive///file.nc', start='/data') 'archive/file.nc' >>> cf.relpath('http://data/archive/file.nc') 'http://data/archive/file.nc' ''' u = urlparse_urlparse(filename) if u.scheme != '': return filename if start is not None: return os_path_relpath(filename, start) return os_path_relpath(filename) #--- End: def def dirname(filename): ''' Return the directory name of a file. If a string containing URL is provided then everything up to, but not including, the last slash (/) is returned. :Parameters: filename: str The name of the file. :Returns: out: str The directory name. .. seealso:: `cf.abspath`, `cf.pathjoin`, `cf.relpath` :Examples: >>> cf.dirname('/data/archive/file.nc') '/data/archive' >>> cf.dirname('..//file.nc') '..' >>> cf.dirname('http://data/archive/file.nc') 'http://data/archive' ''' u = urlparse_urlparse(filename) if u.scheme != '': return filename.rpartition('/')[0] return os_path_dirname(filename) #--- End: def def pathjoin(path1, path2): ''' Join two file path components intelligently. If either of the paths is a URL then a URL will be returned :Parameters: path1: str The first component of the path. path2: str The second component of the path. :Returns: out: str The joined paths. .. seealso:: `cf.abspath`, `cf.dirname`, `cf.relpath` :Examples: >>> cf.pathjoin('/data/archive', '../archive/file.nc') '/data/archive/../archive/file.nc' >>> cf.pathjoin('/data/archive', '../archive/file.nc') '/data/archive/../archive/file.nc' >>> cf.abspath(cf.pathjoin('/data/', 'archive/') '/data/archive' >>> cf.pathjoin('http://data', 'archive/file.nc') 'http://data/archive/file.nc' ''' u = urlparse_urlparse(path1) if u.scheme != '': return urlparse_urljoin(path1, path2) return os_path_join(path1, path2) #--- End: def def hash_array(array): ''' Return the hash value of a numpy array. The hash value is dependent on the data type, shape of the data array. If the array is a masked array then the hash value is independent of the fill value and of data array values underlying any masked elements. The hash value is not guaranteed to be portable across versions of Python, numpy and cf. :Parameters: array: numpy.ndarray The numpy array to be hashed. May be a masked array. :Returns: out: int The hash value :Examples: >>> print array [[0 1 2 3]] >>> cf.hash_array(array) -8125230271916303273 >>> array[1, 0] = numpy.ma.masked >>> print array [[0 -- 2 3]] >>> cf.hash_array(array) 791917586613573563 >>> array.hardmask = False >>> array[0, 1] = 999 >>> array[0, 1] = numpy.ma.masked >>> cf.hash_array(array) 791917586613573563 >>> array.squeeze() >>> print array [0 -- 2 3] >>> cf.hash_array(array) -7007538450787927902 >>> array.dtype = float >>> print array [0.0 -- 2.0 3.0] >>> cf.hash_array(array) -4816859207969696442 ''' h = hashlib_md5() h_update = h.update h_update(marshal_dumps(array.dtype.name)) h_update(marshal_dumps(array.shape)) if numpy_ma_isMA(array): if numpy_ma_is_masked(array): mask = array.mask if not mask.flags.c_contiguous: mask = numpy_ascontiguousarray(mask) h_update(mask) array = array.copy() array.set_fill_value() array = array.filled() else: array = array.data #--- End: if if not array.flags.c_contiguous: # array = array.copy() array = numpy_ascontiguousarray(array) h_update(array) return hash(h.digest()) #--- End: def def inspect(self): ''' Inspect the attributes of an object. :Returns: out: str :Examples: >>> print x.inspect ---------------------------------------------------- _dict: {'grid_north_pole_latitude': 38.0, 'grid_north_pole_longitude': 190.0} coord_terms: set([]) coords: set(['dim2', 'dim1', 'aux2', 'aux3']) name: 'rotated_latitude_longitude' ncvar: 'rotated_latitude_longitude' type: 'grid_mapping' ''' name = repr(self) out = [name, ''.ljust(len(name), '-')] if hasattr(self, '__dict__'): for key, value in sorted(self.__dict__.items()): out.append('%s: %s' % (key, repr(value))) return '\n'.join(out) #--- End: def def broadcast_array(array, shape): ''' Broadcast an array to a given shape. It is assumed that ``numpy.ndim(array) <= len(shape)`` and that the array is broadcastable to the shape by the normal numpy broadcasting rules, but neither of these things is checked. For example, ``a[...] = broadcast_array(a, b.shape)`` is equivalent to ``a[...] = b``. :Parameters: a: numpy array-like shape: tuple :Returns: out: numpy array :Examples: >>> a = numpy.arange(8).reshape(2, 4) [[0 1 2 3] [4 5 6 7]] >>> print cf.broadcast_array(a, (3, 2, 4)) [[[0 1 2 3] [4 5 6 0]] [[0 1 2 3] [4 5 6 0]] [[0 1 2 3] [4 5 6 0]]] >>> a = numpy.arange(8).reshape(2, 1, 4) [[[0 1 2 3]] [[4 5 6 7]]] >>> print cf.broadcast_array(a, (2, 3, 4)) [[[0 1 2 3] [0 1 2 3] [0 1 2 3]] [[4 5 6 7] [4 5 6 7] [4 5 6 7]]] >>> a = numpy.ma.arange(8).reshape(2, 4) >>> a[1, 3] = numpy.ma.masked >>> print a [[0 1 2 3] [4 5 6 --]] >>> cf.broadcast_array(a, (3, 2, 4)) [[[0 1 2 3] [4 5 6 --]] [[0 1 2 3] [4 5 6 --]] [[0 1 2 3] [4 5 6 --]]] ''' a_shape = numpy_shape(array) if a_shape == shape: return array tile = [(m if n == 1 else 1) for n, m in zip(a_shape[::-1], shape[::-1])] tile = shape[0:len(shape)-len(a_shape)] + tuple(tile[::-1]) return numpy_tile(array, tile) #--- End: def def allclose(x, y, rtol=None, atol=None): ''' Returns True if two broadcastable arrays have equal values to within numerical tolerance, False otherwise. The tolerance values are positive, typically very small numbers. The relative difference (``rtol * abs(b)``) and the absolute difference ``atol`` are added together to compare against the absolute difference between ``a`` and ``b``. :Parameters: x, y: array_like Input arrays to compare. atol: float, optional The absolute tolerance for all numerical comparisons, By default the value returned by the `ATOL` function is used. rtol: float, optional The relative tolerance for all numerical comparisons, By default the value returned by the `RTOL` function is used. :Returns: out: bool Returns True if the arrays are equal, otherwise False. :Examples: ''' if rtol is None: rtol = RTOL() if atol is None: atol = ATOL() allclose = getattr(x, 'allclose', None) if callable(allclose): # x has a callable allclose method return allclose(y, rtol=rtol, atol=atol) allclose = getattr(y, 'allclose', None) if callable(allclose): # y has a callable allclose method return allclose(x, rtol=rtol, atol=atol) # x nor y has a callable allclose method return _numpy_allclose(x, y, rtol=rtol, atol=atol) #--- End: def def _section(o, axes=None, data=False, stop=None, chunks=False, min_step=1, **kwargs): """ Return a list of m dimensional sections of a Field of n dimensions or a dictionary of m dimensional sections of a Data object of n dimensions, where m <= n. In the case of a Data object the keys of the dictionary are the indicies of the sections in the original Data object. The m dimensions that are not sliced are marked with None as a placeholder making it possible to reconstruct the original data object. The corresponding values are the resulting sections of type cf.Data. :Parameters: axes: *optional* In the case of a Field this is a query for the m axes that define the sections of the Field as accepted by the Field object's axes method. The keyword arguments are also passed to this method. See `cf.Field.axes` for details. If an axis is returned that is not a data axis it is ignored, since it is assumed to be a dimension coordinate of size 1. In the case of a Data object this should be a tuple or a list of the m indices of the m axes that define the sections of the Data object. If axes is None (the default) all axes are selected. data: bool, optional If True this indicates that a data object has been passed, if False it indicates that a field object has been passed. By default it is False. stop: int, optional Stop after taking this number of sections and return. If stop is None all sections are taken. chunks: bool, optional If True return sections that are of the maximum possible size that will fit in one chunk of memory instead of sectioning into slices of size 1 along the dimensions that are being sectioned. min_step: int, optional The minimum step size when making chunks. By default this is 1. Can be set higher to avoid size 1 dimensions, which are problematic for bilinear regridding. :Returns: out: list or dict The list of m dimensional sections of the Field or the dictionary of m dimensional sections of the Data object. :Examples: Section a field into 2D longitude/time slices, checking the units: >>> _section(f, {None: 'longitude', units: 'radians'}, ... {None: 'time', ... 'units': 'days since 2006-01-01 00:00:00'}) Section a field into 2D longitude/latitude slices, requiring exact names: >>> _section(f, ['latitude', 'longitude'], exact=True) """ # retrieve the index of each axis defining the sections if data: if axes == None: axis_indices = range(o.ndim) else: axis_indices = axes else: axis_keys = o.axes(axes, **kwargs) axis_indices = list() for key in axis_keys: try: axis_indices.append(o.data_axes().index(key)) except ValueError: pass #--- End: for #--- End: if # find the size of each dimension sizes = o.shape if chunks: steps = list(sizes) # Define the factor which, when multiplied by the size of the # data array, determines how many chunks are in the data array. factor = (o.dtype.itemsize + 1.0)/CHUNKSIZE() # n_chunks = number of equal sized bits the partition # needs to be split up into so that each bit's # size is less than ther chunk size. n_chunks = int(math_ceil(o.size*factor)) for (index, axis_size) in enumerate(sizes): if int(math_ceil(float(axis_size)/min_step)) <= n_chunks: n_chunks = int(math_ceil(n_chunks/float(axis_size)*min_step)) steps[index] = min_step else: steps[index] = int(axis_size/n_chunks) break #--- End: for else: steps = [1] * len(sizes) # use recursion to slice out each 2D horizontal section if data: d = dict() else: fl = [] indices = [slice(None)] * len(sizes) nl_vars = {'count': 0} def loop_over_index(current_index): # Expects an index to loop over in the list indices. If this is less # than 0 the horizontal slice defined by indices is appended to the # FieldList fl, if it is the specified axis indices the value in # indices is left as slice(None) and it calls itself recursively with # the next index, otherwise each index is looped over. In this loop # the routine is called recursively with the next index. If the count # of the number of slices taken is greater than or equal to stop # it returns before taking any more slices. if current_index < 0: if data: d[tuple([x.start for x in indices])] = o[tuple(indices)] else: fl.append(o.subspace[tuple(indices)]) nl_vars['count'] += 1 return if current_index in axis_indices: loop_over_index(current_index - 1) return for i in range(0, sizes[current_index], steps[current_index]): if not stop is None and nl_vars['count'] >= stop: return indices[current_index] = slice(i, i + steps[current_index]) loop_over_index(current_index - 1) #--- End: def current_index = len(sizes) - 1 loop_over_index(current_index) if data: return d else: return fl #--- End: def def ENVIRONMENT(): ''' ''' print 'Platform:' , platform() print 'HDF5 library:' , netCDF4. __hdf5libversion__ print 'netcdf library:', netCDF4.__netcdf4libversion__ print 'python:' , python_version() , sys_executable print 'netCDF4:' , netCDF4.__version__, os_path_abspath(netCDF4.__file__) print 'numpy:' , numpy__version__ , os_path_abspath(numpy__file__) print 'psutil:' , psutil.__version__ , os_path_abspath(psutil.__file__) print 'cf:' , __version__ , os_path_abspath(__file__) #--- End: def cf-python-1.3.2/cf/variable.py0000644000175000017500000052771312764224100016370 0ustar daviddavid00000000000000from copy import deepcopy from functools import partial as functools_partial from re import match as re_match from re import findall as re_findall from textwrap import fill as textwrap_fill from itertools import izip from cPickle import dumps, loads, PicklingError from re import search as re_search from netCDF4 import default_fillvals as _netCDF4_default_fillvals from operator import truediv as truediv from operator import itruediv as itruediv from re import compile as re_compile from numpy import array as numpy_array from numpy import result_type as numpy_result_type from numpy import vectorize as numpy_vectorize from .flags import Flags from .functions import RTOL, ATOL, equals, set_equals from .functions import inspect as cf_inspect from .query import Query from .units import Units from .timeduration import TimeDuration from .data.data import Data _units_None = Units() docstring = { # ---------------------------------------------------------------- '{+chunksizes}': '''chunksizes: `dict` or `None`, optional Specify the chunk sizes for axes of the {+variable}. Axes are given by dictionary keys, with a chunk size for those axes as the dictionary values. A dictionary key may be an integer or a tuple of integers defining axes by position in the data array. Iln the special case of *chunksizes* being `None`, then chunking is set to the netCDF default. *Example:* To set the chunk size for first axes to 365: ``{0: 365}``. *Example:* To set the chunk size for the first and third data array axes to 100: ``{0: 100, 2: 100}``, or equivalently ``{(0, 2): 100}``. *Example:* To set the chunk size for the second axis to 100 and for the third axis to 5: ``{1: 100, 2: 5}``. *Example:* To set the chunking to the netCDF default: ``None``.''', # ---------------------------------------------------------------- '{+data-like}': '''A data-like object is any object containing array-like or scalar data which could be used to create a `cf.Data` object. *Example:* Instances, ``x``, of following types are all examples of data-like objects (because ``cf.Data(x)`` creates a valid `cf.Data` object): :py:obj:`int`, :py:obj:`float`, :py:obj:`str`, :py:obj:`tuple`, :py:obj:`list`, `numpy.ndarray`, `cf.Data`, `cf.Coordinate`, `cf.Field`.''', # ---------------------------------------------------------------- '{+data-like-scalar}': '''A data-like scalar object is any object containing scalar data which could be used to create a `cf.Data` object. *Example:* Instances, ``x``, of following types are all examples of scalar data-like objects (because ``cf.Data(x)`` creates a valid `cf.Data` object): :py:obj:`int`, :py:obj:`float`, :py:obj:`str`, and scalar-valued `numpy.ndarray`, `cf.Data`, `cf.Coordinate`, `cf.Field`.''', # ---------------------------------------------------------------- '{+atol}': '''atol: `float`, optional The absolute tolerance for all numerical comparisons, By default the value returned by the `cf.ATOL` function is used.''', # ---------------------------------------------------------------- '{+rtol}': '''rtol: `float`, optional The relative tolerance for all numerical comparisons, By default the value returned by the `cf.RTOL` function is used.''', # ---------------------------------------------------------------- '{+axis_selection}': '''Axes are selected with the criteria specified by the keyword parameters. If no keyword parameters are specified then all axes are selected.''', # ---------------------------------------------------------------- '{+HDF_chunks}': '''Specify HDF5 chunks for the data array. Chunking refers to a storage layout where the data array is partitioned into fixed-size multi-dimensional chunks when written to a netCDF4 file on disk. Chunking is ignored if the data array is written to a netCDF3 format file. A chunk has the same rank as the data array, but with fewer (or no more) elements along each axis. The chunk is defined by a dictionary in which the keys identify axes and the values are the chunk sizes for those axes. If a given chunk size for an axis is larger than the axis size, then the size of the axis at the time of writing to disk will be used instead. If chunk sizes have been specified for some but not all axes, then the each unspecified chunk size is assumed to be the full size of its axis. If no chunk sizes have been set for any axes then the netCDF default chunk is used (http://www.unidata.ucar.edu/software/netcdf/docs/netcdf_perf_chunking.html). A detailed discussion of HDF chunking and I/O performance is available at https://www.hdfgroup.org/HDF5/doc/H5.user/Chunking.html and http://www.unidata.ucar.edu/software/netcdf/workshops/2011/nc4chunking. Basically, you want the chunks for each dimension to match as closely as possible the size and shape of the data block that users will read from the file.''', # ---------------------------------------------------------------- '{+item_selection}': '''Items are selected with the criteria specified by the keyword parameters. By default, if multiple criteria are given then the items will be the intersection of each keyword's selection (see the *match_and* parameter). If no keyword parameters are specified then all items are selected.''', # ---------------------------------------------------------------- '{+item_criteria}': '''There are two main types of item selection criteria: ============================ ================================== Selection criteria Parameters ============================ ================================== Attributes and CF properties *items* Data array axes *axes*, *axes_all*, *axes_subset*, *axes_superset*, *ndim* ============================ ==================================''', # ---------------------------------------------------------------- '{+items_criteria}': '''There are three main types of item selection criteria: ============================ ================================== Selection criteria Parameters ============================ ================================== Attributes and CF properties *items* Data array axes *axes*, *axes_all*, *axes_subset*, *axes_superset*, *ndim* Item role *role* ============================ ==================================''', # ---------------------------------------------------------------- '{+ndim}': '''ndim: optional {+Fef,}Select the items whose number of data array dimensions satisfy the given condition. A range of data numbers of array axes may be selected if *ndim* is a `cf.Query` object. *Example:* ``ndim=1`` selects items which span exactly one axis and ``ndim=cf.ge(2)`` selects items which span two or more axes (see `cf.ge`).''', # ---------------------------------------------------------------- '{+axes}': '''axes: optional {+Fef,}Select items which span at least one of the specified axes, taken in any order, and possibly others. Axes are defined by identfiying items of the field (such as dimension coordinate objects) or by specifying axis sizes. In the former case the selected axes are those which span the identified items. The axes are interpreted as those that would be returned by the field's `~cf.Field.axes` method, i.e. by ``f.axes(axes)`` or, if *axes* is a dictionary, ``f.axes(**axes)``. See `cf.Field.axes` for details. *Example:* To select items which span a time axis, and possibly others, you could set: ``axes='T'``. *Example:* To select items which span a latitude and/or longitude axes, and possibly others, you could set: ``axes=['X', 'Y']``. *Example:* To specify axes with size 19 you could set ``axes={'size': 19}``. To specify depth axes with size 40 or more, you could set: ``axes={'axes': 'depth', 'size': cf.ge(40)}`` (see `cf.ge`).''', # ---------------------------------------------------------------- '{+axes_subset}': '''axes_subset: optional {+Fef,}Select items whose data array spans all of the specified axes, taken in any order, and possibly others. The axes are those that would be selected by this call of the field's `~cf.Field.axes` method: ``f.axes(axes_subset)`` or, if *axes_subset* is a dictionary of parameters , ``f.axes(**axes_subset)``. Axes are defined by identfiying items of the field (such as dimension coordinate objects) or by specifying axis sizes. In the former case the selected axes are those which span the identified field items. See `cf.Field.axes` for details. *Example:* To select items which span a time axes, and possibly others, you could set: ``axes_subset='T'``. *Example:* To select items which span latitude and longitude axes, and possibly others, you could set: ``axes_subset=['X', 'Y']``. *Example:* To specify axes with size 19 you could set ``axes_subset={'size': 19}``. To specify depth axes with size 40 or more, you could set: ``axes_subset={'axes': 'depth', 'size': cf.ge(40)}`` (see `cf.ge`).''', # ---------------------------------------------------------------- '{+axes_superset}': '''axes_superset: optional {+Fef,}Select items whose data arrays span a subset of the specified axes, taken in any order, and no others. The axes are those that would be selected by this call of the field's `~cf.Field.axes` method: ``f.axes(axes_superset)`` or, if *axes_superset* is a dictionary of parameters, ``f.axes(**axes_superset)``. Axes are defined by identfiying items of the field (such as dimension coordinate objects) or by specifying axis sizes. In the former case the selected axes are those which span the identified field items. See `cf.Field.axes` for details. *Example:* To select items which span a time axis, and no others, you could set: ``axes_superset='T'``. *Example:* To select items which span latitude and/or longitude axes, and no others, you could set: ``axes_superset=['X', 'Y']``. *Example:* To specify axes with size 19 you could set ``axes_superset={'size': 19}``. To specify depth axes with size 40 or more, you could set: ``axes_superset={'axes': 'depth', 'size': cf.ge(40)}`` (see `cf.ge`).''', # ---------------------------------------------------------------- '{+axes_all}': '''axes_all: optional {+Fef,}Select items whose data arrays span all of the specified axes, taken in any order, and no others. The axes are those that would be selected by this call of the field's `~cf.Field.axes` method: ``f.axes(axes_all)`` or, if *axes_all* is a dictionary of parameters, ``f.axes(**axes_all)``. Axes are defined by identfiying items of the field (such as dimension coordinate objects) or by specifying axis sizes. In the former case the selected axes are those which span the identified field items. See `cf.Field.axes` for details. *Example:* To select items which span a time axis, and no others, you could set: ``axes_all='T'``. *Example:* To select items which span latitude and longitude axes, and no others, you could set: ``axes_all=['X', 'Y']``. *Example:* To specify axes with size 19 you could set ``axes_all={'size': 19}``. To specify depth axes with size 40 or more, you could set: ``axes_all={'axes': 'depth', 'size': cf.ge(40)}`` (see `cf.ge`).''', # ---------------------------------------------------------------- '{+role}': '''role: (sequence of) `str`, optional Select items of the given roles. Valid roles are: ======= ============================ role Items selected ======= ============================ ``'d'`` Dimension coordinate objects ``'a'`` Auxiliary coordinate objects ``'m'`` Cell measure objects ``'r'`` Coordinate reference objects ======= ============================ Multiple roles may be specified by a multi-character string or a sequence. *Example:* Selecting auxiliary coordinate and cell measure objects may be done with any of the following values of *role*: ``'am'``, ``'ma'``, ``('a', 'm')``, ``['m', 'a']``, ``set(['a', 'm'])``, etc.''', # ---------------------------------------------------------------- '{+exact}': '''exact: `bool`, optional {+Fef,}The *exact* parameter applies to the interpretation of string-valued conditions given by the *items* parameter. By default *exact* is False, which means that: * A string-valued condition is treated as a regular expression understood by the :py:obj:`re` module and an item is selected if its corresponding value matches the regular expression using the `re.match` method (i.e. if zero or more characters at the beginning of item's value match the regular expression pattern). * Units and calendar strings are evaluated for equivalence rather then equality (e.g. ``'metre'`` is equivalent to ``'m'`` and to ``'km'``). .. *Example:* To select items with with any units of pressure: ``f.{+name}('units:hPa')``. To select items with a standard name which begins with "air" and with any units of pressure: ``f.{+name}({'standard_name': 'air', 'units': 'hPa'})``. If *exact* is True then: * A string-valued condition is not treated as a regular expression and an item is selected if its corresponding value equals the string. * Units and calendar strings are evaluated for exact equality rather than equivalence (e.g. ``'metre'`` is equal to ``'m'``, but not to ``'km'``). .. *Example:* To select items with with units of hectopascals but not, for example, Pascals: ``f.{+name}('units:hPa', exact=True)``. To select items with a standard name of exactly "air_pressure" and with units of exactly hectopascals: ``f.{+name}({'standard_name': 'air_pressure', 'units': 'hPa'}, exact=True)``. Note that `cf.Query` objects provide a mechanism for overriding the *exact* parameter for individual values. *Example:* ``f.{+name}({'standard_name': cf.eq('air', exact=False), 'units': 'hPa'}, exact=True)`` will select items with a standard name which begins "air" but with units of exactly hectopascals (see `cf.eq`). *Example:* ``f.{+name}({'standard_name': cf.eq('air_pressure'), 'units': 'hPa'})`` will select items with a standard name of exactly "air_pressure" but with any units of pressure (see `cf.eq`).''', # ---------------------------------------------------------------- '{+match_and}': '''match_and: `bool`, optional By default *match_and* is True and{+,fef,} items are selected if they satisfy the all of the specified conditions. If *match_and* is False then items are selected if they satisfy at least one of the specified conditions. *Example:* To select items with identity beginning with "ocean" **and** two data array axes: ``f.{+name}('ocean', ndim=2)``. *Example:* To select items with identity beginning with "ocean" **or** two data array axes: ``f.{+name}('ocean', ndim=2, match_and=False)``.''', # ---------------------------------------------------------------- '{+inverse}': '''inverse: `bool`, optional If True then{+,fef,} select items other than those selected by all other criteria.''', # ---------------------------------------------------------------- '{+copy}': '''copy: `bool`, optional If True then a returned item is a copy. By default it is not copied.''', # ---------------------------------------------------------------- '{+key}': '''key: `bool`, optional If True then{+,fef,} return the domain's identifier for the selected item, rather than the item itself.''', # ---------------------------------------------------------------- '{+items}': '''items: optional {+Fef,}Select items whose attributes or CF properties satisfy the given conditions. The *items* parameter may be one, or a sequence, of: * `None` or an empty dictionary. All items are selected. This is the default. .. * A string specifying one of the CF coordinate types: ``'T'``, ``'X'``, ``'Y'`` or ``'Z'``. An item has an attribute for each coordinate type and is selected if the attribute for the specified type is True. *Example:* To select CF time items: ``items='T'``. .. * A string which identifies items based on their string-valued metadata. The value may take one of the following forms: ============== ======================================== Value Interpretation ============== ======================================== Contains ``:`` Selects on the CF property specified before the first ``:`` Contains ``%`` Selects on the attribute specified before the first ``%`` Anything else Selects on identity as returned by the item's `!identity` method ============== ======================================== By default the part of the string to be compared with an item is treated as a regular expression understood by the :py:obj:`re` module and an item is selected if its corresponding value matches the regular expression using the :py:obj:`re.match` method (i.e. if zero or more characters at the beginning of item's value match the regular expression pattern). See the *exact* parameter for details. *Example:* To select items with standard names which begin "lat": ``items='lat'``. *Example:* To select items with long names which begin "air": ``items='long_name:air'``. *Example:* To select items with netCDF variable names which begin "lon": ``items='ncvar%lon'``. *Example:* To select items with identities which end with the letter "z": ``items='.*z$'``. *Example:* To select items with long names which start with the string ".*a": ``items='long_name%\.\*a'``. .. * A dictionary which identifies properties of the items with corresponding tests on their values. An item is selected if **all** of the tests in the dictionary are passed. In general, each dictionary key is a CF property name with a corresponding value to be compared against the item's CF property value. If the dictionary value is a string then by default it is treated as a regular expression understood by the :py:obj:`re` module and an item is selected if its corresponding value matches the regular expression using the :py:obj:`re.match` method (i.e. if zero or more characters at the beginning of item's value match the regular expression pattern). See the *exact* parameter for details. *Example:* To select items with standard name of exactly "air_temperature" and long name beginning with the letter "a": ``items={'standard_name': cf.eq('air_temperature'), 'long_name': 'a'}`` (see `cf.eq`). Some key/value pairs have a special interpretation: ================== ==================================== Special key Value ================== ==================================== ``'units'`` The value must be a string and by default is evaluated for equivalence, rather than equality, with an item's `units` property, for example a value of ``'Pa'`` will match units of Pascals or hectopascals, etc. See the *exact* parameter. ``'calendar'`` The value must be a string and by default is evaluated for equivalence, rather than equality, with an item's `calendar` property, for example a value of ``'noleap'`` will match a calendar of noleap or 365_day. See the *exact* parameter. `None` The value is interpreted as for a string value of the *items* parameter. For example, ``items={None: 'air'}`` is equivalent to ``items='air'``, ``items={None: 'ncvar%pressure'}`` is equivalent to ``items='ncvar%pressure'`` and ``items={None: 'Y'}`` is equivalent to ``items='Y'``. ================== ==================================== *Example:* To select items with standard name starting with "air", units of temperature and a netCDF variable name of "tas" you could set ``items={'standard_name': 'air', 'units': 'K', None: 'ncvar%tas$'}``. .. * A domain item identifier (such as ``'dim1'``, ``'aux0'``, ``'msr2'``, ``'ref0'``, etc.). Selects the corresponding item. *Example:* To select the item with domain identifier "dim1": ``items='dim1'``. If *items* is a sequence of any combination of the above then the selected items are the union of those selected by each element of the sequence. If the sequence is empty then no items are selected.''', # ---------------------------------------------------------------- '{+axes, kwargs}': '''axes, kwargs: optional Select axes. The *axes* parameter may be one, or a sequence, of: * `None`. If no *kwargs* arguments have been set then all axes are selected. This is the default. .. * An integer. Explicitly selects the axis corresponding to the given position in the list of axes of the field's data array. *Example:* To select the third data array axis: ``axes=2``. To select the last axis: ``axes=-1``. .. * A :py:obj:`slice` object. Explicitly selects the axes corresponding to the given positions in the list of axes of the field's data array. *Example:* To select the last three data array axes: ``axes=slice(-3, None)`` .. * A domain axis identifier. Explicitly selects this axis. *Example:* To select axis "dim1": ``axes='dim1'``. .. * Any value accepted by the *items* parameter of the field's `items` method. Used in conjunction with the *kwargs* parameters to select the axes which span the items that would be identified by this call of the field's `items` method: ``f.items(items=axes, axes=None, **kwargs)``. See `cf.Field.items` for details. *Example:* To select the axes spanned by one dimensionsal time coordinates: ``f.{+name}('T', ndim=1)``. If *axes* is a sequence of any combination of the above then the selected axes are the union of those selected by each element of the sequence. If the sequence is empty then no axes are selected.''', # ---------------------------------------------------------------- '{+size}': '''size: optional Select axes whose sizes equal *size*. Axes whose sizes lie within a range sizes may be selected if *size* is a `cf.Query` object. *Example:* ``size=1`` selects size 1 axes. *Example:* ``size=cf.ge(2)`` selects axes with sizes greater than 1 (see `cf.ge`).''', # ---------------------------------------------------------------- '{+i}': '''i: `bool`, optional If True then update the {+variable} in place. By default a new {+variable} is created. In either case, a {+variable} is returned.''', # ---------------------------------------------------------------- } p = re_compile('(?<=.)([A-Z])') # E.g. DimensionCoordinate or Variable one = re_compile('(\[\+N\].*\n|\[\+1\])') many = re_compile('(\[\+1\].*\n|\[\+N\])') zero = re_compile('\[\+0\]') #first_char = re.compile('^(\s|\n)*(.)') fef = re_compile('{\+.*?[Ff]ef,?}(.)') fefx = re_compile('{\+(.*?)([Ff])ef,?}(.)') def _replacement(match): '''Used in a `re.sub` for for replacing: '{+Fef,}X' with 'For each field, x' and '{+,fef,}' with ', for each field,' ''' comma = match.group(1) if comma: comma += ' ' return comma+match.group(2)+"or each field, "+match.group(3).lower() def _replacement0(match): '''Used in a `re.sub` for for replacing: '{+Fef,}X' with 'For each field, X' and '{+,fef,}' with ', for each field,' ''' return match.group(1) def _update_docstring(name, f, attr_name): ''' ''' doc = f.__doc__ if doc is None: return name_lc = p.sub(r' \1', name).lower() doc = doc.replace('{+name}' , attr_name) doc = doc.replace('{+Variable}', name) doc = doc.replace('{+variable}', name_lc) kwargs = {} for arg in set(re_findall('{\+.*?}', doc)): if arg in ('{+Fef,}', '{+,fef,}', '{+fef}'): continue ds = docstring[arg].replace('{+name}', attr_name) ds = ds.replace('{+Variable}', name) ds = ds.replace('{+variable}', name_lc) doc = doc.replace(arg, ds) if name == 'FieldList': doc = many.sub('', doc) doc = zero.sub('[0]', doc) doc = fefx.sub(_replacement, doc) else: doc = one.sub('', doc) doc = zero.sub('', doc) doc = fef.sub(_replacement0, doc) f.__doc__ = doc #--- End: def class RewriteDocstringMeta(type): '''Modify docstrings. To do this, we intercede before the class is created and modify the docstrings of its attributes. This will not affect inherited methods, however, so we also need to loop through the parent classes. We cannot simply modify the docstrings, because then the parent classes' methods will have the wrong docstring. Instead, we must actually copy the functions, and then modify the docstring. ''' # http://www.jesshamrick.com/2013/04/17/rewriting-python-docstrings-with-a-metaclass/ def __new__(cls, name, parents, attrs): for attr_name in attrs: # skip special methods if attr_name.startswith('__'): continue # skip non-functions attr = attrs[attr_name] if not hasattr(attr, '__call__'): continue if not hasattr(attr, 'func_doc'): continue # update docstring _update_docstring(name, attr, attr_name) for parent in parents: for attr_name in dir(parent): # we already have this method if attr_name in attrs: continue # skip special methods if attr_name.startswith('__'): continue # get the original function and copy it a = getattr(parent, attr_name) # skip non-functions if not hasattr(a, '__call__'): continue f = getattr(a, '__func__', None) if f is None: continue # copy function attr = type(f)( f.func_code, f.func_globals, f.func_name, f.func_defaults, f.func_closure) doc = f.__doc__ # update docstring and add attr _update_docstring(name, attr, attr_name) attrs[attr_name] = attr # create the class obj = super(RewriteDocstringMeta, cls).__new__( cls, name, parents, attrs) return obj #--- End: class # ==================================================================== # # Variable object # # ==================================================================== class Variable(object): ''' Base class for storing a data array with metadata. A variable contains a data array and metadata comprising properties to describe the physical nature of the data. All components of a variable are optional. ''' __metaclass__ = RewriteDocstringMeta # Do not ever change this: _list = False # Define the reserved attributes. These are methods which can't be # overwritten, as well as a few attributes. _reserved_attrs = ('_reserved_attrs', '_insert_data' '_set_Data_attributes', 'binary_mask', 'chunk', 'clip', 'copy', 'cos', 'delprop', 'dump', 'equals', 'expand_dims', 'flip', 'getprop', 'hasprop', 'identity', 'match', 'name', 'override_units', 'select', 'setprop', 'sin', 'subspace', 'transpose', 'where', ) _special_properties = set(('units', 'calendar', '_FillValue', 'missing_value')) def __init__(self, properties={}, attributes=None, data=None, copy=True): ''' **Initialization** :Parameters: properties: dict, optional Initialize a new instance with CF properties from the dictionary's key/value pairs. attributes: dict, optional Provide the new instance with attributes from the dictionary's key/value pairs. data: cf.Data, optional Provide the new instance with an N-dimensional data array. copy: bool, optional If False then do not deep copy arguments prior to initialization. By default arguments are deep copied. ''' self._fill_value = None # _hasbounds is True if and only if there are cell bounds. self._hasbounds = False # True if and only if there is a data array stored in # self.Data self._hasData = False # Initialize the _private dictionary with an empty Units # object self._private = {'special_attributes': {}, 'simple_properties' : {}, } setprop = self.setprop if copy: for prop, value in properties.iteritems(): setprop(prop, deepcopy(value)) if attributes: for attr, value in attributes.iteritems(): setattr(self, attr, deepcopy(value)) # self.__dict__.update(deepcopy(attributes)) else: for prop, value in properties.iteritems(): setprop(prop, value) if attributes: # self.__dict__.update(attributes) for attr, value in attributes.iteritems(): setattr(self, attr, value) #--- End: if if data is not None: self.insert_data(data, copy=copy) else: # _hasData is True if and only if there is a data array # stored in self.Data self._hasData = False #--- End: def def __array__(self, *dtype): ''' ''' if self._hasData: return self.data.__array__(*dtype) raise ValueError("%s has no numpy.ndarray interface'" % self.__class__.__name__) #--- End: def def __contains__(self, value): ''' Called to implement membership test operators. x.__contains__(y) <==> y in x ''' return self.equals(value) #--- End: def def __data__(self): ''' Returns a new reference to self.data. ''' if self._hasData: return self.data raise ValueError( "{0} has no Data interface".format(self.__class__.__name__)) #--- End: def def __delattr__(self, attr): ''' x.__delattr__(attr) <==> del x.attr ''' if attr in self._reserved_attrs: raise AttributeError("Can't delete reserved attribute %r" % attr) super(Variable, self).__delattr__(attr) #--- End: def def __getitem__(self, index): ''' Called to implement evaluation of x[index]. x.__getitem__(index) <==> x[index] Not to be confused with `subspace`. ''' # if ((isinstance(index, slice) and len((None,)[index]) != 1) or # index not in (0, -1)): # raise IndexError("%s index out of range: %s" % # (self.__class__.__name__, index)) if index != 0 and index != -1: raise IndexError("%s index out of range: %s" % (self.__class__.__name__, index)) return self #--- End: def def __len__(self): ''' Called by the :py:obj:`len` built-in function. x.__len__() <==> len(x) Always returns 1. :Examples: >>> len(f) 1 ''' return 1 #--- End: def def __deepcopy__(self, memo): ''' Called by the :py:obj:`copy.deepcopy` standard library function. ''' return self.copy() #--- End: def def __add__(self, y): ''' The binary arithmetic operation ``+`` x.__add__(y) <==> x+y ''' return self._binary_operation(y, '__add__') #--- End: def def __iadd__(self, y): ''' The augmented arithmetic assignment ``+=`` x.__iadd__(y) <==> x+=y ''' return self._binary_operation(y, '__iadd__') #--- End: def def __radd__(self, y): ''' The binary arithmetic operation ``+`` with reflected operands x.__radd__(y) <==> y+x ''' return self._binary_operation(y, '__radd__') #--- End: def def __sub__(self, y): ''' The binary arithmetic operation ``-`` x.__sub__(y) <==> x-y ''' return self._binary_operation(y, '__sub__') #--- End: def def __isub__(self, y): ''' The augmented arithmetic assignment ``-=`` x.__isub__(y) <==> x-=y ''' return self._binary_operation(y, '__isub__') #--- End: def def __rsub__(self, y): ''' The binary arithmetic operation ``-`` with reflected operands x.__rsub__(y) <==> y-x ''' return self._binary_operation(y, '__rsub__') #--- End: def def __mul__(self, y): ''' The binary arithmetic operation ``*`` x.__mul__(y) <==> x*y ''' return self._binary_operation(y, '__mul__') #--- End: def def __imul__(self, y): ''' The augmented arithmetic assignment ``*=`` x.__imul__(y) <==> x*=y ''' return self._binary_operation(y, '__imul__') #--- End: def def __rmul__(self, y): ''' The binary arithmetic operation ``*`` with reflected operands x.__rmul__(y) <==> y*x ''' return self._binary_operation(y, '__rmul__') #--- End: def def __div__(self, y): ''' The binary arithmetic operation ``/`` x.__div__(y) <==> x/y ''' return self._binary_operation(y, '__div__') #--- End: def def __idiv__(self, y): ''' The augmented arithmetic assignment ``/=`` x.__idiv__(y) <==> x/=y ''' return self._binary_operation(y, '__idiv__') #--- End: def def __rdiv__(self, y): ''' The binary arithmetic operation ``/`` with reflected operands x.__rdiv__(y) <==> y/x ''' return self._binary_operation(y, '__rdiv__') #--- End: def def __floordiv__(self, y): ''' The binary arithmetic operation ``//`` x.__floordiv__(y) <==> x//y ''' return self._binary_operation(y, '__floordiv__') #--- End: def def __ifloordiv__(self, y): ''' The augmented arithmetic assignment ``//=`` x.__ifloordiv__(y) <==> x//=y ''' return self._binary_operation(y, '__ifloordiv__') #--- End: def def __rfloordiv__(self, y): ''' The binary arithmetic operation ``//`` with reflected operands x.__rfloordiv__(y) <==> y//x ''' return self._binary_operation(y, '__rfloordiv__') #--- End: def def __truediv__(self, y): ''' The binary arithmetic operation ``/`` (true division) x.__truediv__(y) <==> x/y ''' return self._binary_operation(y, '__truediv__') #--- End: def def __itruediv__(self, y): ''' The augmented arithmetic assignment ``/=`` (true division) x.__itruediv__(y) <==> x/=y ''' return self._binary_operation(y, '__itruediv__') #--- End: def def __rtruediv__(self, y): ''' The binary arithmetic operation ``/`` (true division) with reflected operands x.__rtruediv__(y) <==> y/x ''' return self._binary_operation(y, '__rtruediv__') #--- End: def def __pow__(self, y, modulo=None): ''' The binary arithmetic operations ``**`` and ``pow`` x.__pow__(y) <==> x**y ''' if modulo is not None: raise NotImplementedError("3-argument power not supported for %r" % self.__class__.__name__) return self._binary_operation(y, '__pow__') #--- End: def def __ipow__(self, y, modulo=None): ''' The augmented arithmetic assignment ``**=`` x.__ipow__(y) <==> x**=y ''' if modulo is not None: raise NotImplementedError("3-argument power not supported for %r" % self.__class__.__name__) return self._binary_operation(y, '__ipow__') #--- End: def def __rpow__(self, y, modulo=None): ''' The binary arithmetic operations ``**`` and ``pow`` with reflected operands x.__rpow__(y) <==> y**x ''' if modulo is not None: raise NotImplementedError("3-argument power not supported for %r" % self.__class__.__name__) return self._binary_operation(y, '__rpow__') #--- End: def def __mod__(self, y): ''' The binary arithmetic operation ``%`` x.__mod__(y) <==> x % y .. versionadded:: 1.0 ''' return self._binary_operation(y, '__mod__') #--- End: def def __imod__(self, y): ''' The binary arithmetic operation ``%=`` x.__imod__(y) <==> x %= y .. versionadded:: 1.0 ''' return self._binary_operation(y, '__imod__') #--- End: def def __rmod__(self, y): ''' The binary arithmetic operation ``%`` with reflected operands x.__rmod__(y) <==> y % x .. versionadded:: 1.0 ''' return self._binary_operation(y, '__rmod__') #--- End: def def __eq__(self, y): ''' The rich comparison operator ``==`` x.__eq__(y) <==> x==y ''' return self._binary_operation(y, '__eq__') #--- End: def def __ne__(self, y): ''' The rich comparison operator ``!=`` x.__ne__(y) <==> x!=y ''' return self._binary_operation(y, '__ne__') #--- End: def def __ge__(self, y): ''' The rich comparison operator ``>=`` x.__ge__(y) <==> x>=y ''' return self._binary_operation(y, '__ge__') #--- End: def def __gt__(self, y): ''' The rich comparison operator ``>`` x.__gt__(y) <==> x>y ''' return self._binary_operation(y, '__gt__') #--- End: def def __le__(self, y): ''' The rich comparison operator ``<=`` x.__le__(y) <==> x<=y ''' return self._binary_operation(y, '__le__') #--- End: def def __lt__(self, y): ''' The rich comparison operator ``<`` x.__lt__(y) <==> x x&y ''' return self._binary_operation(y, '__and__') #--- End: def def __iand__(self, y): ''' The augmented bitwise assignment ``&=`` x.__iand__(y) <==> x&=y ''' return self._binary_operation(y, '__iand__') #--- End: def def __rand__(self, y): ''' The binary bitwise operation ``&`` with reflected operands x.__rand__(y) <==> y&x ''' return self._binary_operation(y, '__rand__') #--- End: def def __or__(self, y): ''' The binary bitwise operation ``|`` x.__or__(y) <==> x|y ''' return self._binary_operation(y, '__or__') #--- End: def def __ior__(self, y): ''' The augmented bitwise assignment ``|=`` x.__ior__(y) <==> x|=y ''' return self._binary_operation(y, '__ior__') #--- End: def def __ror__(self, y): ''' The binary bitwise operation ``|`` with reflected operands x.__ror__(y) <==> y|x ''' return self._binary_operation(y, '__ror__') #--- End: def def __xor__(self, y): ''' The binary bitwise operation ``^`` x.__xor__(y) <==> x^y ''' return self._binary_operation(y, '__xor__') #--- End: def def __ixor__(self, y): ''' The augmented bitwise assignment ``^=`` x.__ixor__(y) <==> x^=y ''' return self._binary_operation(y, '__ixor__') #--- End: def def __rxor__(self, y): ''' The binary bitwise operation ``^`` with reflected operands x.__rxor__(y) <==> y^x ''' return self._binary_operation(y, '__rxor__') #--- End: def def __lshift__(self, y): ''' The binary bitwise operation ``<<`` x.__lshift__(y) <==> x< x<<=y ''' return self._binary_operation(y, '__ilshift__') #--- End: def def __rlshift__(self, y): ''' The binary bitwise operation ``<<`` with reflected operands x.__rlshift__(y) <==> y<>`` x.__lshift__(y) <==> x>>y ''' return self._binary_operation(y, '__rshift__') #--- End: def def __irshift__(self, y): ''' The augmented bitwise assignment ``>>=`` x.__irshift__(y) <==> x>>=y ''' return self._binary_operation(y, '__irshift__') #--- End: def def __rrshift__(self, y): ''' The binary bitwise operation ``>>`` with reflected operands x.__rrshift__(y) <==> y>>x ''' return self._binary_operation(y, '__rrshift__') #--- End: def def __abs__(self): ''' The unary arithmetic operation ``abs`` x.__abs__() <==> abs(x) ''' return self._unary_operation('__abs__') #--- End: def def __neg__(self): ''' The unary arithmetic operation ``-`` x.__neg__() <==> -x ''' return self._unary_operation('__neg__') #--- End: def def __invert__(self): ''' The unary bitwise operation ``~`` x.__invert__() <==> ~x ''' return self._unary_operation('__invert__') #--- End: def def __pos__(self): ''' The unary arithmetic operation ``+`` x.__pos__() <==> +x ''' return self._unary_operation('__pos__') #--- End: def def __repr__(self): ''' Called by the :py:obj:`repr` built-in function. x.__repr__() <==> repr(x) ''' name = self.name('') if self._hasData: dims = ', '.join([str(x) for x in self.shape]) else: dims = [] dims = '(%s)' % dims # Units if self.Units._calendar: units = self.Units._calendar else: units = getattr(self, 'units', '') return '' % (self.__class__.__name__, self.name(''), dims, units) #--- End: def def __str__(self): ''' Called by the :py:obj:`str` built-in function. x.__str__() <==> str(x) ''' return self.__repr__() #--- End: def # ================================================================ # Private methods # ================================================================ def _binary_operation(self, y, method): ''' Implement binary arithmetic and comparison operations on the {+variable}'s Data with the numpy broadcasting rules. It is intended to be called by the binary arithmetic and comparison methods, such as `!__sub__` and `!__lt__`. :Parameters: operation: `str` The binary arithmetic or comparison method name (such as ``'__imul__'`` or ``'__ge__'``). :Returns: new: `cf.+{Variable}` A new {+variable}, or the same {+variable} if the operation was in-place. :Examples: >>> u = cf.{+Variable}(data=cf.Data([0, 1, 2, 3])) >>> v = cf.{+Variable}(data=cf.Data([1, 1, 3, 4])) >>> w = u._binary_operation(u, '__add__') >>> print w.array [1 2 5 7] >>> w = u._binary_operation(v, '__lt__') >>> print w.array [ True False True True] >>> u._binary_operation(2, '__imul__') >>> print u.array [0 2 4 6] ''' if not self._hasData: raise ValueError( "Can't apply operator %s to a %s with no Data" % (method, self.__class__.__name__)) inplace = method[2] == 'i' xsn = self.getprop('standard_name', None) ysn = getattr(y, 'standard_name', None) x_Units = self.Units y_Units = getattr(y, 'Units', _units_None) if isinstance(y, self.__class__): y = y.Data if not inplace: new = self.copy(_omit_Data=True) new.Data = self.Data._binary_operation(y, method) #if not new.Data.Units.equivalent(original_units): # # this is coarse! # new.delprop('standard_name') # # if hasattr(new, 'history'): # history = [new.getprop('history')] # else: # history = [] # # history.append(new.getprop('standard_name')) # history.append(method) # # new.setprop('history', ' '.join(history)) ##--- End: if # return new else: new = self new.Data._binary_operation(y, method) #--- End: def new_Units = new.Data.Units if (not (new_Units.equivalent(x_Units) or new_Units.equivalent(y_Units)) or xsn is not None and ysn is not None and xsn != ysn): try: new.delprop('standard_name') except AttributeError: pass try: new.delprop('long_name') except AttributeError: pass try: del new.ncvar except AttributeError: pass try: del new.id except AttributeError: pass #--- End: if return new #--- End: def def _change_axis_names(self, dim_name_map): '''Change the axis names of the Data object. :Parameters: dim_name_map: `dict` :Returns: `None` :Examples: >>> f._change_axis_names({'0': 'dim1', '1': 'dim2'}) ''' if self._hasData: self.Data.change_axis_names(dim_name_map) #--- End: def def _conform_for_assignment(self, other): return other def _del_special_attr(self, attr): ''' ''' d = self._private['special_attributes'] if attr in d: del d[attr] return raise AttributeError("Can't delete non-existent %s attribute %r" % (self.__class__.__name__, attr)) #--- End: def def _dump_simple_properties(self, omit=(), _level=0): ''' :Parameters: omit: sequence of strs, optional Omit the given CF properties from the description. _level: int, optional :Returns: out: `str` :Examples: ''' indent1 = ' ' * _level string = [] # Simple properties simple = self._simple_properties() attrs = sorted(set(simple) - set(omit)) for attr in attrs: name = '%s%s = ' % (indent1, attr) value = repr(simple[attr]) indent = ' ' * (len(name)) if value.startswith("'") or value.startswith('"'): indent = '%(indent)s ' % locals() string.append(textwrap_fill(name+value, 79, subsequent_indent=indent)) #--- End: for return '\n'.join(string) #--- End: def def _equivalent_data(self, other, atol=None, rtol=None, copy=True): ''' :Parameters: transpose: dict, optional {+atol} {+rtol} copy: `bool`, optional If False then the *other* coordinate construct might get change in place. :Returns: out: `bool` Whether or not the two variables have equivalent data arrays. ''' if self._hasData != other._hasData: # add traceback return False if not self._hasData: return True data0 = self.data data1 = other.data units = data0.Units if not units.equivalent(data1.Units): # add traceback return if data0._shape != data1.shape: # add traceback return False if not units.equals(data1.Units): if copy: data1 = data1.copy() copy = False data1.Units = units #--- End: if if not data0.equals(data1, rtol=rtol, atol=atol, ignore_fill_value=True): # add traceback return False return True #--- End: def def _get_special_attr(self, attr): ''' ''' d = self._private['special_attributes'] if attr in d: return d[attr] raise AttributeError("%s doesn't have attribute %r" % (self.__class__.__name__, attr)) #--- End: def def _list_attribute(self, attr): return type(self)([getattr(f, attr) for f in self._list]) #--- End: def def _list_method(self, method, kwargs={}): if 'i' in kwargs and kwargs['i']: # In-place for f in self: getattr(f, method)(**kwargs) return self else: # New instance return type(self)([getattr(f, method)(**kwargs) for f in self]) #--- End: def def _parameters(self, d): del d['self'] if 'kwargs' in d: d.update(d.pop('kwargs')) return d #--- End: def def _parse_match(self, match): '''Called by `match` :Parameters: match: As for the *match* parameter of `match` method. :Returns: out: `list` ''' if not match: return () if isinstance(match, (basestring, dict, Query)): match = (match,) matches = [] for m in match: if isinstance(m, basestring): if ':' in m: # CF property (string-valued) m = m.split(':') matches.append({m[0]: ':'.join(m[1:])}) else: # Identity (string-valued) or python attribute # (string-valued) or axis type matches.append({None: m}) elif isinstance(m, dict): # Dictionary matches.append(m) else: # Identity (not string-valued, e.g. cf.Query). matches.append({None: m}) #--- End: for return matches #--- End: def def _query_set(self, values, exact=True): ''' ''' kwargs2 = self._parameters(locals()) if self._list: return self._list_method('_query_set', kwargs2) new = self.copy(_omit_Data=True) new.Data = self.Data._query_set(**kwargs2) return new #--- End: def def _query_contain(self, value): ''' ''' kwargs2 = self._parameters(locals()) if self._list: return self._list_method('_query_contain', kwargs2) new = self.copy(_omit_Data=True) new.Data = self.Data._query_contain(**kwargs2) return new #--- End: def def _query_wi(self, value0, value1): ''' ''' kwargs2 = self._parameters(locals()) if self._list: return self._list_method('_query_wi', kwargs2) new = self.copy(_omit_Data=True) new.Data = self.Data._query_wi(value0, value1) return new #--- End: def def _query_wo(self, value0, value1): ''' ''' kwargs2 = self._parameters(locals()) if self._list: return self._list_method('_query_wo', kwargs2) new = self.copy(_omit_Data=True) new.Data = self.Data._query_wo(value0, value1) return new #--- End: def def _simple_properties(self): return self._private['simple_properties'] #--- End: def def _set_special_attr(self, attr, value): self._private['special_attributes'][attr] = value #--- End: def def _unary_operation(self, method): ''' Implement unary arithmetic operations on the data array. :Parameters: method: `str` The unary arithmetic method name (such as "__abs__"). :Returns: new: `cf.{+Variable}` A new {+variable}. :Examples: >>> print v.array [1 2 -3 -4 -5] >>> w = v._unary_operation('__abs__') >>> print w.array [1 2 3 4 5] >>> w = v.__abs__() >>> print w.array [1 2 3 4 5] >>> w = abs(v) >>> print w.array [1 2 3 4 5] ''' if not self._hasData: raise ValueError( "Can't apply operator %s to a %s with no Data" % (method, self.__class__.__name__)) new = self.copy(_omit_Data=True) new.Data = self.Data._unary_operation(method) return new #--- End: def def _YMDhms(self, attr): ''' ''' if self._hasData: out = self.copy(_omit_Data=True) out.insert_data(getattr(self.data, attr), copy=False) try: del out.standard_name except AttributeError: pass out.long_name = attr return out #--- End: if raise ValueError( "ERROR: Can't get {0}s when there is no data array".format(attr)) #--- End: def def _hmmm(self, method): if self._hasData: out = self.copy(_omit_Data=True) out.insert_data(getattr(self.data, method)(), copy=False) try: del out.standard_name except AttributeError: pass out.long_name = method return out #--- End: if raise ValueError( "ERROR: Can't get {0} when there is no data array".format(method)) #--- End: def def _forbidden(self, x, name): raise AttributeError( "{0} has no {1} {2!r}.".format(self.__class__.__name__, x, name)) #--- End: def # ================================================================ # Forbidden methods # ================================================================ def append(self, *args, **kwargs): self._forbidden('method', 'append') # def count(self, *args, **kwargs): self._forbidden('method', 'count') def extend(self, *args, **kwargs): self._forbidden('method', 'extend') def index(self, *args, **kwargs): self._forbidden('method', 'index') def insert(self, *args, **kwargs): self._forbidden('method', 'insert') def pop(self, *args, **kwargs): self._forbidden('method', 'pop') def remove(self, *args, **kwargs): self._forbidden('method', 'remove') # ================================================================ # Attributes # ================================================================ @property def Data(self): ''' The `cf.Data` object containing the data array. The use of this attribute does not guarantee that any missing data value that has been set is passed on to the `cf.Data` object. Use the `data` attribute to ensure that this is the case. :Examples: >>> f.Data ''' if self._hasData: return self._private['Data'] raise AttributeError("%s doesn't have attribute 'Data'" % self.__class__.__name__) #--- End: def @Data.setter def Data(self, value): private = self._private private['Data'] = value # Delete Units from the variable private['special_attributes'].pop('Units', None) self._hasData = True #--- End: def @Data.deleter def Data(self): private = self._private data = private.pop('Data', None) if data is None: raise AttributeError("Can't delete non-existent %s attribute 'Data'" % self.__class__.__name__) # Save the Units to the variable private['special_attributes']['Units'] = data.Units self._hasData = False #--- End: def # ---------------------------------------------------------------- # Attribute # ---------------------------------------------------------------- @property def data(self): ''' The `cf.Data` object containing the data array. .. seealso:: `array`, `cf.Data`, `hasdata`, `varray` :Examples: >>> f.hasdata True >>> f.data ''' if self._hasData: data = self.Data data.fill_value = self._fill_value return data raise AttributeError("%s object doesn't have attribute 'data'" % self.__class__.__name__) #--- End: def @data.setter def data(self, value): self.Data = value @data.deleter def data(self): del self.Data # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def hasbounds(self): ''' True if there are cell bounds. If present, cell bounds are stored in the `!bounds` attribute. :Examples: >>> if c.hasbounds: ... b = c.bounds ''' return self._hasbounds #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def hasdata(self): ''' True if there is a data array. If present, the data array is stored in the `data` attribute. .. seealso:: `data`, `hasbounds` :Examples: >>> if f.hasdata: ... print f.data ''' return self._hasData #--- End: def # ---------------------------------------------------------------- # Attribute # ---------------------------------------------------------------- @property def reference_datetime(self): units = self.Units if not units.isreftime: raise AttributeError( "{0} doesn't have attribute 'reference_datetime'".format( self.__class__.__name__)) return units.reftime @reference_datetime.setter def reference_datetime(self, value): units = self.Units if not units.isreftime: raise AttributeError( "Can't set 'reference_datetime' for non reference date-time units".format( self.__class__.__name__)) units = units.units.split(' since ') try: self.units = "{0} since {1}".format(units[0], value) except (ValueError, TypeError): raise ValueError( "Can't override reference date-time {0!r} with {1!r}".format( units[1], value)) #--- End: def # ---------------------------------------------------------------- # Attribute # ---------------------------------------------------------------- @property def Units(self): '''The `cf.Units` object containing the units of the data array. Stores the units and calendar CF properties in an internally consistent manner. These are mirrored by the `units` and `calendar` CF properties respectively. :Examples: >>> f.Units >>> f.Units ''' if self._hasData: return self.Data.Units try: return self._get_special_attr('Units') except AttributeError: self._set_special_attr('Units', _units_None) return _units_None #--- End: def @Units.setter def Units(self, value): if self._hasData: self.Data.Units = value else: self._set_special_attr('Units', value) #--- End: def @Units.deleter def Units(self): raise AttributeError( "Can't delete %s attribute 'Units'. Use the override_units method." % self.__class__.__name__) @property def year(self): ''' The year of each date-time data array element. Only applicable to data arrays with reference time units. .. seealso:: `month`, `day`, `hour`, `minunte`, second` :Examples: >>> f.dtarray [ 450-11-15 00:00:00 450-12-16 12:30:00 451-01-16 12:00:45] >>> f.year.array [450 450 451] ''' return self._YMDhms('year') #--- End: def @property def month(self): ''' The month of each date-time data array element. Only applicable to data arrays with reference time units. .. seealso:: `year`, `day`, `hour`, `minunte`, second` :Examples: >>> f.dtarray [ 450-11-15 00:00:00 450-12-16 12:30:00 451-01-16 12:00:45] >>> f.month.array [11 12 1] ''' return self._YMDhms('month') #--- End: def @property def day(self): ''' The day of each date-time data array element. Only applicable to data arrays with reference time units. .. seealso:: `year`, `month`, `hour`, `minute`, second` :Examples: >>> f.dtarray [ 450-11-15 00:00:00 450-12-16 12:30:00 451-01-16 12:00:45] >>> f.day.array [15 16 16] ''' return self._YMDhms('day') #--- End: def @property def hour(self): ''' The hour of each date-time data array element. Only applicable to data arrays with reference time units. .. seealso:: `year`, `month`, `day`, `minute`, second` :Examples: >>> f.dtarray [ 450-11-15 00:00:00 450-12-16 12:30:00 451-01-16 12:00:45] >>> f.hour.array [ 0 12 12] ''' return self._YMDhms('hour') #--- End: def @property def minute(self): ''' The minute of each date-time data array element. Only applicable to data arrays with reference time units. .. seealso:: `year`, `month`, `day`, `hour`, second` :Examples: >>> f.dtarray [ 450-11-15 00:00:00 450-12-16 12:30:00 451-01-16 12:00:45] >>> f.minute.array [ 0 30 0] ''' return self._YMDhms('minute') #--- End: def @property def second(self): ''' The second of each date-time data array element. Only applicable to data arrays with reference time units. .. seealso:: `year`, `month`, `day`, `hour`, `minute` :Examples: >>> f.dtarray [ 450-11-15 00:00:00 450-12-16 12:30:00 451-01-16 12:00:45] >>> f.second.array [ 0 0 45] ''' return self._YMDhms('second') #--- End: def def mask_invalid(self, i=False): '''{+Fef,}Mask the array where invalid values occur (NaN or inf). Note that: * Invalid values in the results of arithmetic operations only occur if the raising of `FloatingPointError` exceptions has been suppressed by `cf.Data.seterr`. * If the raising of `FloatingPointError` exceptions has been allowed then invalid values in the results of arithmetic operations it is possible for them to be automatically converted to masked values, depending on the setting of `cf.Data.mask_fpe`. In this case, such automatic conversion might be faster than calling `mask_invalid`. .. seealso:: `cf.Data.mask_fpe`, `cf.Data.seterr` :Examples 1: >>> g = f.mask_invalid() :Parameters: {+i} :Returns: out: `cf.{+Variable}` :Examples: >>> print f[+0].array [ 0. 1.] >>> print g[+0].array [ 1. 2.] >>> old = cf.Data.seterr('ignore') >>> h = g/f >>> print h[+0].array [ inf 2.] >>> h.mask_invalid(i=True) >>> print h[+0].array [-- 2.] >>> h = g**12345 >>> print h[+0].array [ 1. inf] >>> h = h.mask_invalid() >>> print h[+0].array [1. --] >>> old = cf.Data.seterr('raise') >>> old = cf.Data.mask_fpe(True) >>> print (g/f)[+0].array [ -- 2] >>> print (g**12345)[+0].array [1. -- ] ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('mask_invalid', kwargs2) if i: v = self else: v = self.copy() if self._hasData: v.Data = v.Data.mask_invalid(i=True) return v #--- End: def def max(self): '''The maximum of the data array. .. seealso:: `collapse`, `mean`, `mid_range`, `min`, `range`, `sample_size`, `sd`, `sum`, `var` :Examples 1: >>> d = f.{+name}() :Returns: out: `cf.Data` The maximum of the data array. :Examples 2: >>> f.data >>> f.max().data ''' if self._hasData: return self.data.max(squeeze=True) raise ValueError( "ERROR: Can't get the maximum when there is no data array") #--- End: def def mean(self): '''The unweighted mean the data array. .. seealso:: `collapse`, `max`, `mid_range`, `min`, `range`, `sample_size`, `sd`, `sum`, `var` :Examples 1: >>> d = f.{+name}() :Returns: out: `cf.Data` The unweighted mean the data array. :Examples 2: >>> f.data >>> f.mean() ''' if self._hasData: return self.data.mean(squeeze=True) raise ValueError( "ERROR: Can't get the mean when there is no data array") #--- End: def def mid_range(self): '''The unweighted average of the maximum and minimum of the data array. .. seealso:: `collapse`, `max`, `mean`, `min`, `range`, `sample_size`, `sd`, `sum`, `var` :Examples 1: >>> d = f.{+name}() :Returns: out: `cf.Data` The unweighted average of the maximum and minimum of the data array. :Examples 2: >>> f.data >>> f.mid_range() ''' if self._hasData: return self.data.mid_range(squeeze=True) raise ValueError( "ERROR: Can't get the mid-range when there is no data array") #--- End: def def min(self): '''The minimum of the data array. .. seealso:: `collapse`, `max`, `mean`, `mid_range`, `range`, `sample_size`, `sd`, `sum`, `var` :Examples 1: >>> d = f.{+name}() :Returns: out: `cf.Data` The minimum of the data array. :Examples 2: >>> f.data >>> f.min() ''' if self._hasData: return self.data.min(squeeze=True) raise ValueError( "ERROR: Can't get the minimum when there is no data array") #--- End: def def range(self): ''' The absolute difference between the maximum and minimum of the data array. .. seealso:: `collapse`, `max`, `mean`, `mid_range`, `min`, `sample_size`, `sd`, `sum`, `var` :Examples 1: >>> d = f.{+name}() :Returns: out: `cf.Data` The absolute difference between the maximum and minimum of the data array. :Examples 2: >>> f.data >>> f.range() ''' if self._hasData: return self.data.range(squeeze=True) raise ValueError( "ERROR: Can't get the range when there is no data array") #--- End: def remove_data(self): ''' Remove and return the data array. :Returns: out: `cf.Data` or `None` The removed data array, or `None` if there isn't one. :Examples: >>> f._hasData True >>> f.data >>> f.remove_data() >>> f._hasData False >>> print f.remove_data() None ''' if not self._hasData: return data = self.data del self.Data return data #--- End: def def sample_size(self): '''The number of non-missing data elements in the data array. .. seealso:: `collapse`, `max`, `mean`, `mid_range`, `min`, `range`, `sd`, `sum`, `var` :Examples 1: >>> d = f.{+name}() :Returns: out: `cf.Data` The number of non-missing data elements in the data array. :Examples 2: >>> f.data >>> f.sample_size() ''' if self._hasData: return self.data.sample_size(squeeze=True) raise ValueError( "ERROR: Can't get the sample size when there is no data array") #--- End: def def sd(self): '''The unweighted sample standard deviation of the data array. .. seealso:: `collapse`, `max`, `mean`, `mid_range`, `min`, `range`, `sample_size`, `sum`, `var` :Examples 1: >>> d = f.{+name}() :Returns: out: `cf.Data` The unweighted sample standard deviation of the data array. :Examples 2: >>> f.data >>> f.sd() ''' if self._hasData: return self.data.sd(squeeze=True) raise ValueError( "ERROR: Can't get the standard deviation when there is no data array") #--- End: def def sum(self): '''The sum of the data array. .. seealso:: `collapse`, `max`, `mean`, `mid_range`, `min`, `range`, `sample_size`, `sd`, `var` :Examples 1: >>> d = f.{+name}() :Returns: out: `cf.Data` The sum of the data array. :Examples 2: >>> f.data >>> f.sum() ''' if self._hasData: return self.data.sum(squeeze=True) raise ValueError( "ERROR: Can't get the sum when there is no data array") #--- End: def def var(self): '''The unweighted sample variance of the data array. .. seealso:: `collapse`, `max`, `mean`, `mid_range`, `min`, `range`, `sample_size`, `sd`, `sum` :Examples 1: >>> d = f.{+name}() :Returns: out: `cf.Data` The unweighted sample variance of the data array. :Examples 2: >>> f.data >>> f.var() ''' if self._hasData: return self.data.var(squeeze=True) raise ValueError( "ERROR: Can't get the variance when there is no data array") #--- End: def # ---------------------------------------------------------------- # Attribute: ancillary_variables # ---------------------------------------------------------------- @property def ancillary_variables(self): '''An object containing one or more CF ancillary variables. :Examples: >>> f.ancillary_variables [] ''' return self._get_special_attr('ancillary_variables') #--- End: def @ancillary_variables.setter def ancillary_variables(self, value): self._set_special_attr('ancillary_variables', value) @ancillary_variables.deleter def ancillary_variables(self): self._del_special_attr('ancillary_variables') # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def T(self): ''' Always False. .. seealso:: `X`, `Y`, `Z` :Examples: >>> print f.T False ''' return False #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def X(self): ''' Always False. .. seealso:: `T`, `Y`, `Z` :Examples: >>> print f.X False ''' return False #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def Y(self): ''' Always False. .. seealso:: `T`, `X`, `Z` :Examples: >>> print f.Y False ''' return False #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def Z(self): ''' Always False. .. seealso:: `T`, `X`, `Y` :Examples: >>> print f.Z False ''' return False #--- End: def # ---------------------------------------------------------------- # CF property # ---------------------------------------------------------------- @property def add_offset(self): ''' The add_offset CF property. This property is only used when writing to a file on disk. :Examples: >>> f.add_offset = -4.0 >>> f.add_offset -4.0 >>> del f.add_offset >>> f.setprop('add_offset', 10.5) >>> f.getprop('add_offset') 10.5 >>> f.delprop('add_offset') ''' return self.getprop('add_offset') #--- End: def @add_offset.setter def add_offset(self, value): self.setprop('add_offset', value) self.dtype = numpy_result_type(self.dtype, numpy_array(value).dtype) #--- End: def @add_offset.deleter def add_offset(self): self.delprop('add_offset') if not self.hasprop('scale_factor'): del self.dtype #--- End: def # ---------------------------------------------------------------- # CF property: calendar # ---------------------------------------------------------------- @property def calendar(self): ''' The calendar CF property. :Examples: >>> f.calendar = 'noleap' >>> f.calendar 'noleap' >>> del f.calendar >>> f.setprop('calendar', 'proleptic_gregorian') >>> f.getprop('calendar') 'proleptic_gregorian' >>> f.delprop('calendar') ''' value = getattr(self.Units, 'calendar', None) if value is None: raise AttributeError("%s doesn't have CF property 'calendar'" % self.__class__.__name__) return value #--- End: def @calendar.setter def calendar(self, value): self.Units = Units(getattr(self, 'units', None), value) #--- End: def @calendar.deleter def calendar(self): if getattr(self, 'calendar', None) is None: raise AttributeError("Can't delete non-existent %s CF property 'calendar'" % self.__class__.__name__) self.Units = Units(getattr(self, 'units', None)) #--- End: def # ---------------------------------------------------------------- # CF property # ---------------------------------------------------------------- @property def comment(self): ''' The comment CF property. :Examples: >>> f.comment = 'This simulation was done on an HP-35 calculator' >>> f.comment 'This simulation was done on an HP-35 calculator' >>> del f.comment >>> f.setprop('comment', 'a comment') >>> f.getprop('comment') 'a comment' >>> f.delprop('comment') ''' return self.getprop('comment') #--- End: def @comment.setter def comment(self, value): self.setprop('comment', value) @comment.deleter def comment(self): self.delprop('comment') # ---------------------------------------------------------------- # CF property # ---------------------------------------------------------------- @property def _FillValue(self): ''' The _FillValue CF property. Note that this attribute is primarily for writing data to disk and is independent of the missing data mask. It may, however, get used when unmasking data array elements. The recommended way of retrieving the missing data value is with the `fill_value` method. .. seealso:: `fill_value`, `missing_value` :Examples: >>> f._FillValue = -1.0e30 >>> f._FillValue -1e+30 >>> del f._FillValue Mask the data array where it equals a missing data value: >>> f.setitem(cf.masked, condition=f.fill_value()) DCH ''' d = self._private['simple_properties'] if '_FillValue' in d: return d['_FillValue'] raise AttributeError("%s doesn't have CF property '_FillValue'" % self.__class__.__name__) #--- End: def @_FillValue.setter def _FillValue(self, value): # self.setprop('_FillValue', value) self._private['simple_properties']['_FillValue'] = value self._fill_value = self.getprop('missing_value', value) #--- End: def @_FillValue.deleter def _FillValue(self): self._private['simple_properties'].pop('_FillValue', None) self._fill_value = getattr(self, 'missing_value', None) #--- End: def # ---------------------------------------------------------------- # CF property # ---------------------------------------------------------------- @property def history(self): ''' The history CF property. :Examples: >>> f.history = 'created on 2012/10/01' >>> f.history 'created on 2012/10/01' >>> del f.history >>> f.setprop('history', 'created on 2012/10/01') >>> f.getprop('history') 'created on 2012/10/01' >>> f.delprop('history') ''' return self.getprop('history') #--- End: def @history.setter def history(self, value): self.setprop('history', value) @history.deleter def history(self): self.delprop('history') # ---------------------------------------------------------------- # CF property # ---------------------------------------------------------------- @property def leap_month(self): ''' The leap_month CF property. :Examples: >>> f.leap_month = 2 >>> f.leap_month 2 >>> del f.leap_month >>> f.setprop('leap_month', 11) >>> f.getprop('leap_month') 11 >>> f.delprop('leap_month') ''' return self.getprop('leap_month') #--- End: def @leap_month.setter def leap_month(self, value): self.setprop('leap_month', value) @leap_month.deleter def leap_month(self): self.delprop('leap_month') # ---------------------------------------------------------------- # CF property # ---------------------------------------------------------------- @property def leap_year(self): ''' The leap_year CF property. :Examples: >>> f.leap_year = 1984 >>> f.leap_year 1984 >>> del f.leap_year >>> f.setprop('leap_year', 1984) >>> f.getprop('leap_year') 1984 >>> f.delprop('leap_year') ''' return self.getprop('leap_year') #--- End: def @leap_year.setter def leap_year(self, value): self.setprop('leap_year', value) @leap_year.deleter def leap_year(self): self.delprop('leap_year') # ---------------------------------------------------------------- # CF property # ---------------------------------------------------------------- @property def long_name(self): ''' The long_name CF property. :Examples: >>> f.long_name = 'zonal_wind' >>> f.long_name 'zonal_wind' >>> del f.long_name >>> f.setprop('long_name', 'surface air temperature') >>> f.getprop('long_name') 'surface air temperature' >>> f.delprop('long_name') ''' return self.getprop('long_name') #--- End: def @long_name.setter def long_name(self, value): self.setprop('long_name', value) @long_name.deleter def long_name(self): self.delprop('long_name') # ---------------------------------------------------------------- # CF property # ---------------------------------------------------------------- @property def missing_value(self): ''' The missing_value CF property. Note that this attribute is used primarily for writing data to disk and is independent of the missing data mask. It may, however, be used when unmasking data array elements. The recommended way of retrieving the missing data value is with the `fill_value` method. .. seealso:: `_FillValue`, `fill_value` :Examples: >>> f.missing_value = 1.0e30 >>> f.missing_value 1e+30 >>> del f.missing_value Mask the data array where it equals a missing data value: >>> f.setitem(cf.masked, condition=f.fill_value()) DCH ''' d = self._private['simple_properties'] if 'missing_value' in d: return d['missing_value'] raise AttributeError("%s doesn't have CF property 'missing_value'" % self.__class__.__name__) #--- End: def @missing_value.setter def missing_value(self, value): self._private['simple_properties']['missing_value'] = value self._fill_value = value #--- End: def @missing_value.deleter def missing_value(self): self._private['simple_properties'].pop('missing_value', None) self._fill_value = getattr(self, '_FillValue', None) #--- End: def # ---------------------------------------------------------------- # CF property # ---------------------------------------------------------------- @property def month_lengths(self): ''' The month_lengths CF property. Stored as a tuple but may be set as any array-like object. :Examples: >>> f.month_lengths = numpy.array([34, 31, 32, 30, 29, 27, 28, 28, 28, 32, 32, 34]) >>> f.month_lengths (34, 31, 32, 30, 29, 27, 28, 28, 28, 32, 32, 34) >>> del f.month_lengths >>> f.setprop('month_lengths', [34, 31, 32, 30, 29, 27, 28, 28, 28, 32, 32, 34]) >>> f.getprop('month_lengths') (34, 31, 32, 30, 29, 27, 28, 28, 28, 32, 32, 34) >>> f.delprop('month_lengths') ''' return self.getprop('month_lengths') #--- End: def @month_lengths.setter def month_lengths(self, value): self.setprop('month_lengths', tuple(value)) @month_lengths.deleter def month_lengths(self): self.delprop('month_lengths') # ---------------------------------------------------------------- # CF property # ---------------------------------------------------------------- @property def scale_factor(self): ''' The scale_factor CF property. This property is only used when writing to a file on disk. :Examples: >>> f.scale_factor = 10.0 >>> f.scale_factor 10.0 >>> del f.scale_factor >>> f.setprop('scale_factor', 10.0) >>> f.getprop('scale_factor') 10.0 >>> f.delprop('scale_factor') ''' return self.getprop('scale_factor') #--- End: def @scale_factor.setter def scale_factor(self, value): self.setprop('scale_factor', value) @scale_factor.deleter def scale_factor(self): self.delprop('scale_factor') # ---------------------------------------------------------------- # CF property # ---------------------------------------------------------------- @property def standard_name(self): ''' The standard_name CF property. :Examples: >>> f.standard_name = 'time' >>> f.standard_name 'time' >>> del f.standard_name >>> f.setprop('standard_name', 'time') >>> f.getprop('standard_name') 'time' >>> f.delprop('standard_name') ''' return self.getprop('standard_name') #--- End: def @standard_name.setter def standard_name(self, value): self.setprop('standard_name', value) @standard_name.deleter def standard_name(self): self.delprop('standard_name') # ---------------------------------------------------------------- # CF property # ---------------------------------------------------------------- @property def units(self): ''' The units CF property. :Examples: >>> f.units = 'K' >>> f.units 'K' >>> del f.units >>> f.setprop('units', 'm.s-1') >>> f.getprop('units') 'm.s-1' >>> f.delprop('units') ''' value = getattr(self.Units, 'units', None) if value is None: raise AttributeError("%s doesn't have CF property 'units'" % self.__class__.__name__) return value #--- End: def @units.setter def units(self, value): self.Units = Units(value, getattr(self, 'calendar', None)) #--- End: def @units.deleter def units(self): if getattr(self, 'units', None) is None: self.Units = Units(None, getattr(self, 'calendar', None)) #--- End: def # ---------------------------------------------------------------- # CF property # ---------------------------------------------------------------- @property def valid_max(self): ''' The valid_max CF property. :Examples: >>> f.valid_max = 100.0 >>> f.valid_max 100.0 >>> del f.valid_max >>> f.setprop('valid_max', 100.0) >>> f.getprop('valid_max') 100.0 >>> f.delprop('valid_max') ''' return self.getprop('valid_max') #--- End: def @valid_max.setter def valid_max(self, value): self.setprop('valid_max', value) @valid_max.deleter def valid_max(self): self.delprop('valid_max') # ---------------------------------------------------------------- # CF property # ---------------------------------------------------------------- @property def valid_min(self): ''' The valid_min CF property. :Examples: >>> f.valid_min = 8.0 >>> f.valid_min 8.0 >>> del f.valid_min >>> f.setprop('valid_min', 8.0) >>> f.getprop('valid_min') 8.0 >>> f.delprop('valid_min') ''' return self.getprop('valid_min') #--- End: def @valid_min.setter def valid_min(self, value): self.setprop('valid_min', value) @valid_min.deleter def valid_min(self): self.delprop('valid_min') # ---------------------------------------------------------------- # CF property # ---------------------------------------------------------------- @property def valid_range(self): ''' The valid_range CF property. Stored as a tuple but may be set as any array-like object. :Examples: >>> f.valid_range = numpy.array([100., 400.]) >>> f.valid_range (100.0, 400.0) >>> del f.valid_range >>> f.setprop('valid_range', [100.0, 400.0]) >>> f.getprop('valid_range') (100.0, 400.0) >>> f.delprop('valid_range') ''' return tuple(self.getprop('valid_range')) #--- End: def @valid_range.setter def valid_range(self, value): self.setprop('valid_range', tuple(value)) @valid_range.deleter def valid_range(self): self.delprop('valid_range') # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def subspace(self): ''' Return a new variable whose data is subspaced. This attribute may be indexed to select a subspace from dimension index values. **Subspacing by indexing** Subspacing by dimension indices uses an extended Python slicing syntax, which is similar numpy array indexing. There are two extensions to the numpy indexing functionality: * Size 1 dimensions are never removed. An integer index i takes the i-th element but does not reduce the rank of the output array by one. * When advanced indexing is used on more than one dimension, the advanced indices work independently. When more than one dimension's slice is a 1-d boolean array or 1-d sequence of integers, then these indices work independently along each dimension (similar to the way vector subscripts work in Fortran), rather than by their elements. :Examples: ''' return SubspaceVariable(self) #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def shape(self): ''' A tuple of the data array's dimension sizes. .. seealso:: `data`, `hasdata`, `ndim`, `size` :Examples: >>> f.shape (73, 96) >>> f.ndim 2 >>> f.ndim 0 >>> f.shape () >>> f.hasdata True >>> len(f.shape) == f.dnim True >>> reduce(lambda x, y: x*y, f.shape, 1) == f.size True ''' if self._hasData: return tuple(self.Data.shape) raise AttributeError("%s doesn't have attribute 'shape'" % self.__class__.__name__) #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def ndim(self): ''' The number of dimensions in the data array. .. seealso:: `data`, `hasdata`, `isscalar`, `shape` :Examples: >>> f.hasdata True >>> f.shape (73, 96) >>> f.ndim 2 >>> f.shape () >>> f.ndim 0 ''' if self._hasData: return self.Data.ndim raise AttributeError("%s doesn't have attribute 'ndim'" % self.__class__.__name__) #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def size(self): ''' The number of elements in the data array. .. seealso:: `data`, `hasdata`, `ndim`, `shape` :Examples: >>> f.shape (73, 96) >>> f.size 7008 >>> f.shape () >>> f.ndim 0 >>> f.size 1 >>> f.shape (1, 1, 1) >>> f.ndim 3 >>> f.size 1 >>> f.hasdata True >>> f.size == reduce(lambda x, y: x*y, f.shape, 1) True ''' if self._hasData: return self.Data.size raise AttributeError("%s doesn't have attribute 'size'" % self.__class__.__name__) #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def dtarray(self): ''' An independent numpy array of date-time objects. Only applicable for reference time units. If the calendar has not been set then the CF default calendar will be used and the units will be updated accordingly. The data type of the data array is unchanged. .. seealso:: `array`, `asdatetime`, `asreftime`, `dtvarray`, `varray` :Examples: ''' if self._hasData: return self.data.dtarray raise AttributeError("%s has no data array" % self.__class__.__name__) #--- End: def # ---------------------------------------------------------------- # Attribute # ---------------------------------------------------------------- @property def dtype(self): ''' The `numpy` data type of the data array. By default this is the data type with the smallest size and smallest scalar kind to which all sub-arrays of the master data array may be safely cast without loss of information. For example, if the sub-arrays have data types 'int64' and 'float32' then the master data array's data type will be 'float64'; or if the sub-arrays have data types 'int64' and 'int32' then the master data array's data type will be 'int64'. Setting the data type to a `numpy.dtype` object, or any object convertible to a `numpy.dtype` object, will cause the master data array elements to be recast to the specified type at the time that they are next accessed, and not before. This does not immediately change the master data array elements, so, for example, reinstating the original data type prior to data access results in no loss of information. Deleting the data type forces the default behaviour. Note that if the data type of any sub-arrays has changed after `dtype` has been set (which could occur if the data array is accessed) then the reinstated default data type may be different to the data type prior to `dtype` being set. :Examples: >>> f.dtype dtype('float64') >>> type(f.dtype) >>> print f.array [0.5 1.5 2.5] >>> import numpy >>> f.dtype = numpy.dtype(int) >>> print f.array [0 1 2] >>> f.dtype = bool >>> print f.array [False True True] >>> f.dtype = 'float64' >>> print f.array [ 0. 1. 1.] >>> print f.array [0.5 1.5 2.5] >>> f.dtype = int >>> f.dtype = bool >>> f.dtype = float >>> print f.array [ 0.5 1.5 2.5] ''' if self._hasData: return self.Data.dtype raise AttributeError("%s doesn't have attribute 'dtype'" % self.__class__.__name__) #--- End: def @dtype.setter def dtype(self, value): # DCH - allow dtype to be set before data c.f. Units if self._hasData: self.Data.dtype = value #--- End: def @dtype.deleter def dtype(self): if self._hasData: del self.Data.dtype #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def dtvarray(self): ''' A numpy array view the data array converted to date-time objects. Only applicable for reference time units. If the calendar has not been set then the CF default calendar will be used and the units will be updated accordingly. .. seealso:: `array`, `asdatetime`, `asreftime`, `dtarray`, `varray` :Examples: ''' if self._hasData: return self.data.dtvarray raise AttributeError("%s has no data array" % self.__class__.__name__) #--- End: def # ---------------------------------------------------------------- # Attribute (read/write only) # ---------------------------------------------------------------- @property def hardmask(self): ''' Whether the mask is hard (True) or soft (False). When the mask is hard, masked elements of the data array can not be unmasked by assignment, but unmasked elements may be still be masked. When the mask is soft, masked entries of the data array may be unmasked by assignment and unmasked entries may be masked. By default, the mask is hard. .. seealso:: `where`, `subspace` :Examples: >>> f.hardmask = False >>> f.hardmask False ''' if self._hasData: return self.Data.hardmask raise AttributeError("%s doesn't have attribute 'hardmask'" % self.__class__.__name__) #--- End: def @hardmask.setter def hardmask(self, value): if self._hasData: self.Data.hardmask = value else: raise AttributeError("%s doesn't have attribute 'hardmask'" % self.__class__.__name__) #--- End: def @hardmask.deleter def hardmask(self): raise AttributeError("Won't delete %s attribute 'hardmask'" % self.__class__.__name__) #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def array(self): ''' A numpy array deep copy of the data array. Changing the returned numpy array does not change the data array. .. seealso:: `data`, `dtarray`, `dtvarray`, `varray` :Examples 1: >>> f.data >>> a = f.array >>> type(a) >>> print a [0 1 2 3 4] >>> a[0] = 999 >>> print a [999 1 2 3 4] >>> print f.array [0 1 2 3 4] >>> f.data ''' if self._hasData: return self.data.array raise AttributeError("%s has no data array" % self.__class__.__name__) #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def unsafe_array(self): ''' ''' if self._hasData: return self.data.unsafe_array raise AttributeError("%s has no data array" % self.__class__.__name__) #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def varray(self): ''' A numpy array view of the data array. Changing the elements of the returned view changes the data array. .. seealso:: `array`, `data`, `dtarray`, `dtvarray` :Examples 1: >>> f.data >>> a = f.array >>> type(a) >>> print a [0 1 2 3 4] >>> a[0] = 999 >>> print a [999 1 2 3 4] >>> print f.array [999 1 2 3 4] >>> f.data ''' if self._hasData: return self.data.varray raise AttributeError("%s has no data array" % self.__class__.__name__) #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def isauxiliary(self): ''' True if the variable is an auxiliary coordinate object. .. seealso:: `ismeasure`, `isdimension` :Examples: >>> f.isauxiliary False ''' return False #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def ismeasure(self): '''True if the variable is a cell measure object. .. seealso:: `isauxiliary`, `isdimension` :Examples: >>> f.ismeasure False ''' return False #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def isdimension(self): '''True if the variable is a dimension coordinate object. .. seealso:: `isauxiliary`, `isdimension` :Examples: >>> f.isdimension False ''' return False #--- End: def @property def isscalar(self): '''True if the data array is scalar. .. seealso:: `hasdata`, `ndim` :Examples: >>> f.ndim 0 >>> f.isscalar True >>> f.ndim >= 1 True >>> f.isscalar False >>> f.hasdata False >>> f.isscalar False ''' if not self._hasData: return False return self.Data.isscalar #--- End: def def ceil(self, i=False): '''{+Fef,}The ceiling of the data array. The ceiling of the scalar ``x`` is the smallest integer ``i``, such that ``i >= x``. .. versionadded:: 1.0 .. seealso:: `floor`, `rint`, `trunc` :Examples 1: Create a new {+variable} with the ceiling of the data: >>> g = f.ceil() :Parameters: {+i} :Returns: out: `cf.{+Variable}` {+Fef,}The {+variable} with the ceiling of data array values. :Examples 2: >>> print f.array [-1.9 -1.5 -1.1 -1. 0. 1. 1.1 1.5 1.9] >>> print f.ceil().array [-1. -1. -1. -1. 0. 1. 2. 2. 2.] >>> print f.array [-1.9 -1.5 -1.1 -1. 0. 1. 1.1 1.5 1.9] >>> print f.ceil(i=True).array [-1. -1. -1. -1. 0. 1. 2. 2. 2.] >>> print f.array [-1. -1. -1. -1. 0. 1. 2. 2. 2.] ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('ceil', kwargs2) if not self._hasData: raise ValueError("Can't ceil %r" % self.__class__.__name__) if i: v = self else: v = self.copy() v.Data.ceil(i=True) return v #--- End: def def chunk(self, chunksize=None): ''' Partition the data array. :Parameters: chunksize: `int` :Returns: `None` ''' if self._hasData: self.Data.chunk(chunksize) #--- End: def def clip(self, a_min, a_max, units=None, i=False): ''' Clip (limit) the values in the data array in place. Given an interval, values outside the interval are clipped to the interval edges. Parameters : a_min: scalar a_max: scalar units: `str` or `cf.Units` {+i} :Returns: `None` :Examples: ''' if i: v = self else: v = self.copy() if self._hasData: v.Data.clip( a_min, a_max, units=units, i=True) return v #--- End: def def close(self): ''' Close all files referenced by the variable. Note that a closed file will be automatically reopened if its contents are subsequently required. :Returns: `None` :Examples: >>> v.close() ''' # List functionality if self._list: for f in self: f.close() return if self._hasData: self.Data.close() #--- End: def @classmethod def concatenate(cls, variables, axis=0, _preserve=True): ''' Join a sequence of variables together. :Parameters: variables: sequence of `cf.{+Variable}` axis: `int`, optional _preserve: `bool`, optional :Returns: out: `cf.{+Variable}` ''' variable0 = variables[0] if len(variables) == 1: return variable0.copy() out = variable0.copy(_omit_Data=True) out.Data = Data.concatenate([v.Data for v in variables], axis=axis, _preserve=_preserve) return out #--- End: def def copy(self, _omit_Data=False, _only_Data=False, _omit_special=None, _omit_properties=False, _omit_attributes=False): ''' Return a deep copy. ``f.copy()`` is equivalent to ``copy.deepcopy(f)``. :Examples 1: >>> g = f.copy() :Returns: out: The deep copy. :Examples 2: >>> g = f.copy() >>> g is f False >>> f.equals(g) True >>> import copy >>> h = copy.deepcopy(f) >>> h is f False >>> f.equals(g) True ''' if self._list: kwargs2 = self._parameters(locals()) return self._list_method('copy', kwargs2) new = type(self)() # ts = type(self) # new = ts.__new__(ts) if _only_Data: if self._hasData: new.Data = self.Data.copy() return new #--- End: if self_dict = self.__dict__.copy() self_private = self_dict.pop('_private') del self_dict['_hasData'] new.__dict__['_fill_value'] = self_dict.pop('_fill_value') new.__dict__['_hasbounds'] = self_dict.pop('_hasbounds') if self_dict and not _omit_attributes: try: new.__dict__.update(loads(dumps(self_dict, -1))) except PicklingError: new.__dict__.update(deepcopy(self_dict)) private = {} if not _omit_Data and self._hasData: private['Data'] = self_private['Data'].copy() new._hasData = True special = self_private['special_attributes'].copy() if _omit_special: for prop in _omit_special: special.pop(prop, None) #--- End: if for prop, value in special.iteritems(): special[prop] = value.copy() private['special_attributes'] = special if not _omit_properties: try: private['simple_properties'] = loads(dumps(self_private['simple_properties'], -1)) except PicklingError: private['simple_properties'] = deepcopy(self_private['simple_properties']) else: private['simple_properties'] = {} new._private = private return new #--- End: def def cos(self, i=False): ''' {+Fef,}Take the trigonometric cosine of the data array. Units are accounted for in the calculation, so that the the cosine of 90 degrees_east is 0.0, as is the cosine of 1.57079632 radians. If the units are not equivalent to radians (such as Kelvin) then they are treated as if they were radians. The output units are '1' (nondimensionsal). .. seealso:: `sin`, `tan` :Examples 1: >>> g = f.cos() :Parameters: {+i} :Returns: out: `cf.{+Variable}` {+Fef,}The {+variable} with the cosine of data array values. :Examples 2: >>> f.Units >>> print f.array [[-90 0 90 --]] >>> f.cos() >>> f.Units >>> print f.array [[0.0 1.0 0.0 --]] >>> f.Units >>> print f.array [[1 2 3 --]] >>> f.cos() >>> f.Units >>> print f.array [[0.540302305868 -0.416146836547 -0.9899924966 --]] ''' if i: v = self else: v = self.copy() if v._hasData: v.Data.cos(i=True) return v #--- End: def def count(self, x): ''' Emulate f.count(x) Equality is tested with the {+variable}'s `cf.{+Variable}.equals` method (as opposed to the ``==`` operator). Note that ``f.count(x)`` is equivalent to ``1 if f.equals(x) else 0``. ''' return int(self.equals(x)) #--- End: def def cyclic(self, axes=None, iscyclic=True): ''' Set the cyclicity of axes of the data array. .. seealso:: `iscyclic` :Parameters: axes: (sequence of) `int` The axes to be set. Each axis is identified by its integer position. By default no axes are set. iscyclic: `bool`, optional If False then the axis is set to be non-cyclic. By default the axis is set to be cyclic. :Returns: out: `set` :Examples: >>> f.cyclic() {} >>> f.cyclic(1) {} >>> f.cyclic() {1} ''' if self._hasData: return self.Data.cyclic(axes, iscyclic) else: return {} #--- End: def def datum(self, *index): ''' Return an element of the data array as a standard Python scalar. The first and last elements are always returned with ``f.datum(0)`` and ``f.datum(-1)`` respectively, even if the data array is a scalar array or has two or more dimensions. :Parameters: index: optional Specify which element to return. When no positional arguments are provided, the method only works for data arrays with one element (but any number of dimensions), and the single element is returned. If positional arguments are given then they must be one of the following: * An integer. This argument is interpreted as a flat index into the array, specifying which element to copy and return. Example: If the data aray shape is ``(2, 3, 6)`` then: * ``f.datum(0)`` is equivalent to ``f.datum(0, 0, 0)``. * ``f.datum(-1)`` is equivalent to ``f.datum(1, 2, 5)``. * ``f.datum(16)`` is equivalent to ``f.datum(0, 2, 4)``. If *index* is ``0`` or ``-1`` then the first or last data array element respecitively will be returned, even if the data array is a scalar array or has two or more dimensions. .. * Two or more integers. These arguments are interpreted as a multidimensionsal index to the array. There must be the same number of integers as data array dimensions. .. * A tuple of integers. This argument is interpreted as a multidimensionsal index to the array. There must be the same number of integers as data array dimensions. Example: ``f.datum((0, 2, 4))`` is equivalent to ``f.datum(0, 2, 4)``; and ``f.datum(())`` is equivalent to ``f.datum()``. :Returns: out: A copy of the specified element of the array as a suitable Python scalar. :Examples: >>> print f.array 2 >>> f.datum() 2 >>> 2 == f.datum(0) == f.datum(-1) == f.datum(()) True >>> print f.array [[2]] >>> 2 == f.datum() == f.datum(0) == f.datum(-1) True >>> 2 == f.datum(0, 0) == f.datum((-1, -1)) == f.datum(-1, 0) True >>> print f.array [[4 -- 6] [1 2 3]] >>> f.datum(0) 4 >>> f.datum(-1) 3 >>> f.datum(1) masked >>> f.datum(4) 2 >>> f.datum(-2) 2 >>> f.datum(0, 0) 4 >>> f.datum(-2, -1) 6 >>> f.datum(1, 2) 3 >>> f.datum((0, 2)) 6 ''' if not self._hasData: raise ValueError( "ERROR: Can't return an element when there is no data array") return self.Data.datum(*index) #--- End: def def dump(self, display=True, prefix=None, omit=()): ''' Return a string containing a full description of the instance. :Parameters: display: `bool`, optional If False then return the description as a string. By default the description is printed, i.e. ``f.dump()`` is equivalent to ``print f.dump(display=False)``. omit: sequence of `str`, optional Omit the given CF properties from the description. prefix: optional Ignored. :Returns: out: `None` or `str` A string containing the description. :Examples: >>> f.dump() Data(1, 2) = [[2999-12-01 00:00:00, 3000-12-01 00:00:00]] 360_day axis = 'T' standard_name = 'time' >>> f.dump(omit=('axis',)) Data(1, 2) = [[2999-12-01 00:00:00, 3000-12-01 00:00:00]] 360_day standard_name = 'time' ''' string = [] if self._hasData: data = self.Data string.append('Data%s = %s' % (data.shape, data)) string.append(self._dump_simple_properties(omit=omit)) string = '\n'.join(string) if display: print string else: return string #--- End: def def equals(self, other, rtol=None, atol=None, ignore_fill_value=False, traceback=False, ignore=(), _set=False): ''' True if two {+variable}s are equal, False otherwise. :Parameters: other: The object to compare for equality. {+atol} {+rtol} ignore_fill_value: `bool`, optional If True then data arrays with different fill values are considered equal. By default they are considered unequal. traceback: `bool`, optional If True then print a traceback highlighting where the two {+variable}s differ. ignore: `tuple`, optional The names of CF properties to omit from the comparison. :Returns: out: `bool` Whether or not the two {+variable}s are equal. :Examples: >>> f.equals(f) True >>> g = f + 1 >>> f.equals(g) False >>> g -= 1 >>> f.equals(g) True >>> f.setprop('name', 'name0') >>> g.setprop('name', 'name1') >>> f.equals(g) False >>> f.equals(g, ignore=['name']) True ''' # Check for object identity if self is other: return True # Check that each instance is of the same type if not isinstance(other, self.__class__): if traceback: print("{0}: Incompatible types: {0}, {1}".format( self.__class__.__name__, other.__class__.__name__)) return False #--- End: if # Check that there are equal numbers of variables len_self = len(self) if len_self != len(other): if traceback: print("{0}: Different numbers of ppp: {1}, {2}".format( self.__class__.__name__, len_self, len(other))) return False #--- End: if if len_self != 1: if not _set: # ---------------------------------------------------- # Two lists, each with more than one element: Check # the lists pair-wise. # ---------------------------------------------------- for i, (f, g) in enumerate(zip(self, other)): if not f.equals(g, rtol=rtol, atol=atol, ignore_fill_value=ignore_fill_value, traceback=traceback, ignore=ignore): if traceback: print("{0}: Different element {1}: {2!r}, {3!r}".format( self.__class__.__name__, i, f, g)) return False else: # ---------------------------------------------------- # Two lists, each with more than one element: Check # the lists set-wise. # ---------------------------------------------------- # Group the variables by identity self_identity = {} for f in self: self_identity.setdefault(f.identity(), []).append(f) other_identity = {} for f in other: other_identity.setdefault(f.identity(), []).append(f) # Check that there are the same identities if set(self_identity) != set(other_identity): if traceback: print("{0}: Different sets of identities: {1}, {2}".format( self.__class__.__name__, set(self_identity), set(other_identity))) return False #--- End: if # Check that there are the same number of variables # for each identity for identity, fl in self_identity.iteritems(): gl = other_identity[identity] if len(fl) != len(gl): if traceback: print("{0}: Different numbers of {1!r} {2}s: {3}, {4}".format( self.__class__.__name__, identity, fl[0].__class__.__name__, len(fl), len(gl))) return False #--- End: fo # For each identity, check that there are matching # pairs of equal fields. for identity, fl in self_identity.iteritems(): gl = other_identity[identity] for f in fl: found_match = False for i, g in enumerate(gl): if f.equals(g, rtol=rtol, atol=atol, ignore_fill_value=ignore_fill_value, ignore=ignore, traceback=False): found_match = True del gl[i] break #--- End: for if not found_match: if traceback: print("{0}: No {1} equal to: {2!r}".format( self.__class__.__name__, g.__class__.__name__, f)) return False #--- End: if # -------------------------------------------------------- # Lists are equal # -------------------------------------------------------- return True #--- End: if # Still here? if self._list: self = self[0] if other._list: other = other[0] # ------------------------------------------------------------ # Check the simple properties # ------------------------------------------------------------ if ignore_fill_value: ignore += ('_FillValue', 'missing_value') self_simple = self._private['simple_properties'] other_simple = other._private['simple_properties'] if (set(self_simple).difference(ignore) != set(other_simple).difference(ignore)): if traceback: print("%s: Different properties: %s, %s" % (self.__class__.__name__, self_simple, other_simple)) return False #--- End: if if rtol is None: rtol = RTOL() if atol is None: atol = ATOL() for attr, x in self_simple.iteritems(): if attr in ignore: continue y = other_simple[attr] if not equals(x, y, rtol=rtol, atol=atol, ignore_fill_value=ignore_fill_value, traceback=traceback): if traceback: print("%s: Different %s properties: %r, %r" % (self.__class__.__name__, attr, x, y)) return False #--- End: for # ------------------------------------------------------------ # Check the special attributes # ------------------------------------------------------------ self_special = self._private['special_attributes'] other_special = other._private['special_attributes'] if set(self_special) != set(other_special): if traceback: print("%s: Different attributes: %s" % (self.__class__.__name__, set(self_special).symmetric_difference(other_special))) return False #--- End: if for attr, x in self_special.iteritems(): y = other_special[attr] if attr == 'ancillary_variables': result = set_equals(x, y, rtol=rtol, atol=atol, ignore_fill_value=ignore_fill_value, traceback=traceback) else: result = equals(x, y, rtol=rtol, atol=atol, ignore_fill_value=ignore_fill_value, traceback=traceback) if not result: if traceback: print("%s: Different %s properties: %r, %r" % (self.__class__.__name__, attr, x, y)) return False #--- End: for # ------------------------------------------------------------ # Check the data # ------------------------------------------------------------ self_hasData = self._hasData if self_hasData != other._hasData: if traceback: print("%s: Different data" % self.__class__.__name__) return False if self_hasData: if not self.data.equals(other.data, rtol=rtol, atol=atol, ignore_fill_value=ignore_fill_value, traceback=traceback): if traceback: print("%s: Different data" % self.__class__.__name__) return False #--- End: if return True #--- End: def def convert_reference_time(self, units=None, calendar_months=False, calendar_years=False, i=False): '''Convert reference time data values to have new units. Conversion is done by decoding the reference times to date-time objects and then re-encoding them for the new units. Any conversions are possible, but this method is primarily for conversions which require a change in the date-times originally encoded. For example, use this method to reinterpret data values in units of "months" since a reference time to data values in "calendar months" since a reference time. This is often necessary when when units of "calendar months" were intended but encoded as "months", which have special definition. See the note and examples below for more details. For conversions which do not require a change in the date-times implied by the data values, this method will be considerably slower than a simple reassignment of the units. For example, if the original units are ``'days since 2000-12-1'`` then ``c.Units = cf.Units('days since 1901-1-1')`` will give the same result and be considerably faster than ``c.convert_reference_time(cf.Units('days since 1901-1-1'))`` .. note:: It is recommended that the units "year" and "month" be used with caution, as explained in the following excerpt from the CF conventions: "The Udunits package defines a year to be exactly 365.242198781 days (the interval between 2 successive passages of the sun through vernal equinox). It is not a calendar year. Udunits includes the following definitions for years: a common_year is 365 days, a leap_year is 366 days, a Julian_year is 365.25 days, and a Gregorian_year is 365.2425 days. For similar reasons the unit ``month``, which is defined to be exactly year/12, should also be used with caution. :Examples 1: >>> g = f.convert_reference_time() :Parameters: units: `cf.Units`, optional The reference time units to convert to. By default the units days since the original reference time in the the original calendar. *Example:* If the original units are ``'months since 2000-1-1'`` in the Gregorian calendar then the default units to convert to are ``'days since 2000-1-1'`` in the Gregorian calendar. calendar_months: `bool`, optional If True then treat units of ``'months'`` as if they were calendar months (in whichever calendar is originally specified), rather than a 12th of the interval between 2 successive passages of the sun through vernal equinox (i.e. 365.242198781/12 days). calendar_years: `bool`, optional If True then treat units of ``'years'`` as if they were calendar years (in whichever calendar is originally specified), rather than the interval between 2 successive passages of the sun through vernal equinox (i.e. 365.242198781 days). {+i} :Returns: out: `cf.{+Variable}` The {+variable} with converted reference time data values. :Examples 2: >>> print f.array [1 2 3 4] >>> print f.Units months since 2000-1-1 >>> print f.dtarray [datetime.datetime(2000, 1, 31, 10, 29, 3, 831197) datetime.datetime(2000, 3, 1, 20, 58, 7, 662441) datetime.datetime(2000, 4, 1, 7, 27, 11, 493645) datetime.datetime(2000, 5, 1, 17, 56, 15, 324889)] >>> f.convert_reference_time(calendar_months=True, i=True) >>> print f.dtarray [datetime.datetime(2000, 2, 1, 0, 0) datetime.datetime(2000, 3, 1, 0, 0) datetime.datetime(2000, 4, 1, 0, 0) datetime.datetime(2000, 5, 1, 0, 0)] >>> print f.array [ 31. 60. 91. 121.] >>> print f.Units days since 2000-1-1 ''' def _convert_reftime_units(value, units, reftime, calendar): '''sads :Parameters: value: number units: `cf.Units` :Returns: out: `datetime.datetime` or `cf.Datetime` ''' t = TimeDuration(value, units=units) if value > 0: return t.interval(*reftime, calendar=calendar, end=False)[1] else: return t.interval(*reftime, calendar=calendar, end=True)[0] #--- End: def # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('convert_reference_time', kwargs2) if not self.Units.isreftime: raise ValueError( "{0} must have reference time units, not {1!r}".format( self.__class__.__name__, self.Units)) if i: v = self else: v = self.copy() units0 = self.Units if units is None: # By default, set the target units to "days since # , # calendar=" units = Units('days since '+units0.units.split(' since ')[1], calendar=units0._calendar) elif not getattr(units, 'isreftime', False): raise ValueError( "New units must be reference time units, not {0!r}".format(units)) if units0._utime.units in ('month', 'months'): if calendar_months: units0 = Units('calendar_'+units0.units, calendar=units0._calendar) else: units0 = Units('days since '+units0.units.split(' since ')[1], calendar=units0._calendar) v.Units = units0 elif units0._utime.units in ('year', 'years', 'yr'): if calendar_years: units0 = Units('calendar_'+units0.units, calendar=units0._calendar) else: units0 = Units('days since '+units0.units.split(' since ')[1], calendar=units0._calendar) v.Units = units0 #--- End: def # Not LAMAed! v.Data = Data( numpy_vectorize( functools_partial(_convert_reftime_units, units=units0._utime.units, reftime=units0.reftime.timetuple()[:6], calendar=units0._calendar), otypes=[object])(v), units=units) return v #--- End: def def floor(self, i=False): '''{+Fef,}Floor the data array. The floor of the scalar ``x`` is the largest integer ``i``, such that ``i <= x``. .. versionadded:: 1.0 .. seealso:: `ceil`, `rint`, `trunc` :Examples 1: Create a new {+variable} with the floor of the data: >>> g = f.floor() :Parameters: {+i} :Returns: out: `cf.{+Variable}` {+Fef,}The {+variable} with the floor of data array values. :Examples 2: >>> print f.array [-1.9 -1.5 -1.1 -1. 0. 1. 1.1 1.5 1.9] >>> print f.floor().array [-2. -2. -2. -1. 0. 1. 1. 1. 1.] >>> print f.array [-1.9 -1.5 -1.1 -1. 0. 1. 1.1 1.5 1.9] >>> print f.floor(i=True).array [-2. -2. -2. -1. 0. 1. 1. 1. 1.] >>> print f.array [-2. -2. -2. -1. 0. 1. 1. 1. 1.] ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('floor', kwargs2) if not self._hasData: raise ValueError("Can't floor %r" % self.__class__.__name__) if i: v = self else: v = self.copy() v.Data.floor(i=True) return v #--- End: def def match(self, match=None, ndim=None, exact=False, match_and=True, inverse=False, _Flags=False, _CellMethods=False): ''' Determine whether or not a variable satisfies conditions. Conditions may be specified on the variable's attributes and CF properties. :Parameters: :Returns: out: `bool` Whether or not the variable matches the given criteria. :Examples: ''' conditions_have_been_set = False something_has_matched = False if ndim is not None: conditions_have_been_set = True try: found_match = self.ndim == ndim except AttributeError: found_match = False if match_and and not found_match: return bool(inverse) something_has_matched = True #--- End: if matches = self._parse_match(match) if matches: conditions_have_been_set = True found_match = True for match in matches: found_match = True # ---------------------------------------------------- # Try to match cf.Units # ---------------------------------------------------- if 'units' in match or 'calendar' in match: match = match.copy() units = Units(match.pop('units', None), match.pop('calendar', None)) if not exact: found_match = self.Units.equivalent(units) else: found_match = self.Units.equals(units) if not found_match: continue #--- End: if # ---------------------------------------------------- # Try to match cell methods # ---------------------------------------------------- if _CellMethods and 'cell_methods' in match: f_cell_methods = self.getprop('cell_methods', None) if not f_cell_methods: found_match = False continue match = match.copy() cell_methods = match.pop('cell_methods') if not exact: n = len(cell_methods) if n > len(f_cell_methods): found_match = False else: found_match = f_cell_methods[-n:].equivalent(cell_methods) else: found_match = f_cell_methods.equals(cell_methods) if not found_match: continue #--- End: if # --------------------------------------------------- # Try to match cf.Flags # --------------------------------------------------- if _Flags and ('flag_masks' in match or 'flag_meanings' in match or 'flag_values' in match): f_flags = getattr(self, Flags, None) if not f_flags: found_match = False continue match = match.copy() found_match = f_flags.equals( Flags(flag_masks=match.pop('flag_masks', None), flag_meanings=match.pop('flag_meanings', None), flag_values=match.pop('flag_values', None))) if not found_match: continue #--- End: if for prop, value in match.iteritems(): if prop is None: if value is None: continue if isinstance(value, basestring): if value in ('T', 'X', 'Y', 'Z'): # Axis type x = getattr(self, value) value = True else: value = value.split('%') if len(value) == 1: value = value[0].split(':') if len(value) == 1: # Identity (string-valued) x = self.identity(None) value = value[0] else: # CF property (string-valued) x = self.getprop(value[0], None) value = ':'.join(value[1:]) else: # Python attribute (string-valued) x = getattr(self, value[0], None) value = '%'.join(value[1:]) else: # Identity (not string-valued, e.g. cf.Query) x = self.identity(None) else: # CF property x = self.getprop(prop, None) if x is None: found_match = False elif isinstance(x, basestring) and isinstance(value, basestring): if exact: found_match = (value == x) else: found_match = re_match(value, x) else: found_match = (value == x) try: found_match == True except ValueError: found_match = False #--- End: if if not found_match: break #--- End: for if found_match: something_has_matched = True break #--- End: for if match_and and not found_match: return bool(inverse) if conditions_have_been_set: if something_has_matched: return not bool(inverse) else: return bool(inverse) else: return not bool(inverse) #--- End: def @property def mask(self): '''The mask of the data array. Values of True indicate masked elements. .. seealso:: `binary_mask` :Examples: >>> f.shape (12, 73, 96) >>> m = f.mask >>> m.long_name 'mask' >>> m.shape (12, 73, 96) >>> m.dtype dtype('bool') >>> m.data ''' if not self._hasData: raise ValueError( "ERROR: Can't get mask when there is no data array") out = self.copy(_omit_Data=True, _omit_properties=True, _omit_attributes=True) out.insert_data(self.data.mask, copy=False) out.long_name = 'mask' return out #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def attributes(self): ''' A dictionary of the attributes which are not CF properties. :Examples: >>> f.attributes {} >>> f.foo = 'bar' >>> f.attributes {'foo': 'bar'} >>> f.attributes.pop('foo') 'bar' >>> f.attributes {'foo': 'bar'} ''' attributes = self.__dict__.copy() del attributes['_hasbounds'] del attributes['_hasData'] del attributes['_private'] return attributes #--- End: def # ---------------------------------------------------------------- # Attribute (read only) # ---------------------------------------------------------------- @property def properties(self): ''' A dictionary of the CF properties. :Examples: >>> f.properties {'_FillValue': 1e+20, 'foo': 'bar', 'long_name': 'Surface Air Temperature', 'standard_name': 'air_temperature', 'units': 'K'} ''' return self._simple_properties().copy() #--- End: def # ================================================================ # Methods # ================================================================ def all(self): '''Test whether all data array elements evaluate to True. Performs a logical and over the data array and returns the result. Masked values are considered as True during computation. .. seealso:: `any` :Examples 1: >>> b = f.all() :Returns: out: `bool` Whether ot not all data array elements evaluate to True. :Examples: >>> print f.array [[0 3 0]] >>> f.all() False >>> print f.array [[1 3 --]] >>> f.all() True ''' if self._hasData: return self.Data.all() return False #--- End: def def allclose(self, y, atol=None, rtol=None): '''Returns True if two broadcastable {+variable}s have equal array values to within numerical tolerance. For numeric data arrays ``f.allclose(y, atol, rtol)`` is equivalent to ``(abs(f - y) <= atol + rtol*abs(y)).all()``; for other data types it is equivalent to ``(f == y).all()``. .. seealso:: `~cf.{+Variable}.equals` :Examples 1: >>> b = f.allclose(y) :Parameters: y: data-like object The object to be compared with the data array. *y* must be broadcastable to the data array and if *y* has units then they must be compatible. {+data-like} {+atol} {+rtol} :Returns: out: `bool` Whether or not the two data arrays are equivalent. :Examples 2: ''' if not self._hasData: return False if isinstance(y, self.__class__): if not y._hasData: return False y = self._conform_for_assignment(y) #-- End: if y = getattr(y, 'Data', y) return self.Data.allclose(y, rtol=rtol, atol=atol) #--- End: def def any(self): '''Return True if any data array elements evaluate to True. Performs a logical or over the data array and returns the result. Masked values are considered as False during computation. .. seealso:: `all` :Examples 1: >>> b = f.any() :Returns: out: `bool` Whether ot not any data array elements evaluate to True. :Examples 2: >>> print f.array [[0 0 0]] >>> f.any() False >>> print f.array [[-- 0 0]] >>> d.any() False >>> print f.array [[-- 3 0]] >>> f.any() True ''' if self._hasData: return self.Data.any() return False #--- End: def def asdatetime(self, i=False): '''{+Fef,}Convert the internal representation of data array elements to date-time objects. Only applicable to {+variable}s with reference time units. If the calendar has not been set then the CF default calendar will be used and the units will be updated accordingly. .. seealso:: `asreftime` :Examples 1: >>> g = f.asdatetime() :Parameters: {+i} :Returns: out: `cf.{+Variable}` :Examples 2: >>> t.asreftime().dtype dtype('float64') >>> t.asdatetime().dtype dtype('O') ''' raise NotImplementedError("asdatetime is dead. Consider {0}.dtarray instead".format(self.__class__.__name__)) # # List functionality # if self._list: # kwargs2 = self._parameters(locals()) # return self._list_method('asdatetime', kwargs2) # # if not self._hasData: # raise AttributeError( # "{0} has no data array".format(self.__class__.__name__)) # # if i: # v = self # else: # v = self.copy() # # v.data.asdatetime(i=True) # return v # #--- End: def def asreftime(self, i=False): '''{+Fef,}Convert the internal representation of data array elements to numeric reference times. Only applicable to {+variable}s with reference time units. If the calendar has not been set then the CF default calendar will be used and the units will be updated accordingly. .. seealso:: `asdatetime` :Examples 1: >>> g = f.asreftime() :Parameters: {+i} :Returns: out: `cf.{+Variable}` :Examples 2: >>> t.asdatetime().dtype dtype('O') >>> t.asreftime().dtype dtype('float64') ''' raise NotImplementedError("asreftime is dead. Consider {0}.array instead".format(self.__class__.__name__)) # # List functionality # if self._list: # kwargs2 = self._parameters(locals()) # return self._list_method('asreftime', kwargs2) # # if not self._hasData: # raise AttributeError( # "{0} has no data array".format(self.__class__.__name__)) # # if i: # v = self # else: # v = self.copy() # # v.data.asreftime(i=True) # return v # #--- End: def def files(self): ''' Return the names of any files containing parts of the data array. :Returns: out: `set` The file names in normalized, absolute form. :Examples: >>> f = cf.read('../file*') >>> f[0].files() {'/data/user/file1', '/data/user/file2', '/data/user/file3'} >>> a = f[0].array >>> f[0].files() set() ''' if not self._hasData: return set() return self.Data.files() #--- End: def def fill_value(self, default=None): ''' Return the data array missing data value. This is the value of the `missing_value` CF property, or if that is not set, the value of the `_FillValue` CF property, else if that is not set, ``None``. In the last case the default `numpy` missing data value for the array's data type is assumed if a missing data value is required. :Parameters: default: optional If the missing value is unset then return this value. By default, *default* is `None`. If *default* is the special value ``'netCDF'`` then return the netCDF default value appropriate to the data array's data type is used. These may be found as follows: >>> import netCDF4 >>> print netCDF4.default_fillvals :Returns: out: The missing data value, or the value specified by *default* if one has not been set. :Examples: >>> f.fill_value() None >>> f._FillValue = -1e30 >>> f.fill_value() -1e30 >>> f.missing_value = 1073741824 >>> f.fill_value() 1073741824 >>> del f.missing_value >>> f.fill_value() -1e30 >>> del f._FillValue >>> f.fill_value() None >>> f,dtype dtype('float64') >>> f.fill_value(default='netCDF') 9.969209968386869e+36 >>> f._FillValue = -999 >>> f.fill_value(default='netCDF') -999 ''' fillval = self._fill_value if fillval is None: if default == 'netCDF': d = self.dtype fillval = _netCDF4_default_fillvals[d.kind + str(d.itemsize)] else: fillval = default #--- End: if return fillval # return self._fill_value #--- End: def def flip(self, axes=None, i=False): ''' {+Fef,}Flip dimensions of the data array in place. .. seealso:: `expand_dims`, `squeeze`, `transpose` :Parameters: axes: (sequence of) `int` Flip the dimensions whose positions are given. By default all dimensions are flipped. :Returns: out: `cf.{+Variable}` :Examples: >>> f.flip() >>> f.flip(1) >>> f.flip([0, 1]) >>> g = f[::-1, :, ::-1] >>> f.flip([2, 0]).equals(g) True ''' kwargs2 = self._parameters(locals()) # List functionality if self._list: return self._list_method('flip', kwargs2) if not self._hasData and (axes or axes == 0): raise ValueError("Can't flip %r" % self.__class__.__name__) if i: v = self else: v = self.copy() if v._hasData: kwargs2['i'] = True v.Data.flip(**kwargs2) return v #--- End: def def select(self, *args, **kwargs): ''' Return the instance if it matches the given conditions. ``v.select(*args, **kwargs)`` is equivalent to ``v if v.match(*args, **kwargs) else cf.List()``. See `cf.Variable.match` for details. :Parameters: args, kwargs: optional See `cf.Variable.match`. :Returns: out: `cf.{+Variable}` or `list` If the variable matches the given conditions then it is returned as an object identity. Otherwise an empty list is returned. ''' if self.match(*args, **kwargs): return self else: return [] #--- End: def @property def binary_mask(self): ''' A binary (0 and 1) missing data mask of the data array. The binary mask's data array comprises dimensionless 32-bit integers and has 0 where the data array has missing data and 1 otherwise. :Examples: >>> print f.mask.array [[ True False True False]] >>> b = f.binary_mask() >>> print b.array [[0 1 0 1]] ''' return type(self)(properties={'long_name': 'binary_mask'}, data=self.Data.binary_mask(), copy=False) #--- End: def def exp(self, i=False): '''{+Fef,}The exponential of the data array. .. seealso:: `log` :Examples 1: >>> g = f.exp() :Parameters: {+i} :Returns: out: `cf.{+Variable}` {+Fef,}The {+variable} with the exponential of data array values. :Examples 2: >>> f[+0].data >>> f.exp()[+0].data >>> f[+0].data >>> f.exp()[+0].data >>> g = f.exp(i=True) >>> g is f True >>> f[+0].data >>> f.exp() ValueError: Can't take exponential of dimensional quantities: ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('exp', kwargs2) if i: v = self else: v = self.copy() if v._hasData: v.Data.exp(i=True) return v #--- End: def def expand_dims(self, position=0, i=False): ''' Insert a size 1 axis into the data array. .. seealso:: `flip`, `squeeze`, `transpose` :Parameters: position: `int`, optional Specify the position amongst the data array axes where the new axis is to be inserted. By default the new axis is inserted at position 0, the slowest varying position. {+i} :Returns: `None` :Examples: >>> v.expand_dims(2) >>> v.expand_dims(-1) ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('expand_dims', kwargs2) if not self._hasData: raise ValueError( "Can't insert axis into %r" % self.__class__.__name__) if i: v = self else: v = self.copy() v.Data.expand_dims(position, i=True) return v #--- End: def def set_equals(self, other, rtol=None, atol=None, ignore_fill_value=False, traceback=False, ignore=()): ''' ''' kwargs2 = self._parameters(locals()) return self.equals(_set=True, **kwargs2) #--- End: def def sin(self, i=False): ''' {+Fef,}Take the trigonometric sine of the data array. Units are accounted for in the calculation. For example, the the sine of 90 degrees_east is 1.0, as is the sine of 1.57079632 radians. If the units are not equivalent to radians (such as Kelvin) then they are treated as if they were radians. The Units are changed to '1' (nondimensionsal). .. seealso:: `cos`, `tan` :Examples 1: >>> g = f.sin() :Parameters: {+i} :Returns: out: `cf.{+Variable}` {+Fef,}The {+variable} with the sine of data array values. :Examples 2: >>> f.Units >>> print f.array [[-90 0 90 --]] >>> f.sin() >>> f.Units >>> print f.array [[-1.0 0.0 1.0 --]] >>> f.Units >>> print f.array [[1 2 3 --]] >>> f.sin() >>> f.Units >>> print f.array [[0.841470984808 0.909297426826 0.14112000806 --]] ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('sin', kwargs2) if i: v = self else: v = self.copy() if v._hasData: v.Data.sin(i=True) return v #--- End: def def tan(self, i=False): ''' Take the trigonometric tangent of the data array. Units are accounted for in the calculation, so that the the tangent of 180 degrees_east is 0.0, as is the sine of 3.141592653589793 radians. If the units are not equivalent to radians (such as Kelvin) then they are treated as if they were radians. The Units are changed to '1' (nondimensionsal). :Parameters: {+i} :Returns: out: `cf.{+Variable}` {+Fef,}The {+variable} with the tangent of data array values. :Examples: ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('tan', kwargs2) if i: v = self else: v = self.copy() if v._hasData: v.Data.tan(i=True) return v #--- End: def def log(self, base=10, i=False): '''{+Fef,}The logarithm of the data array. By default the natural logarithm is taken, but any base may be specified. .. seealso:: `exp` :Examples 1: >>> g = f.log() :Parameters: base: number, optional The base of the logiarthm. By default a natural logiarithm is taken. {+i} :Returns: out: `cf.{+Variable}` {+Fef,}The {+variable} with the logarithm of data array values. :Examples: :Examples 2: >>> f[+0].data >>> f.log()[+0].data >>> f[+0].data >>> f.log()[+0].data >>> f[+0].data >>> f.log()[+0].data >>> g = f.log(i=True) >>> g is f True >>> f[+0].Units >>> f.log() ValueError: Can't take the logarithm to the base 2.718281828459045 of ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('log', kwargs2) if i: v = self else: v = self.copy() if v._hasData: v.Data.log(base, i=True) return v #--- End: def def squeeze(self, axes=None, i=False): ''' Remove size 1 dimensions from the data array in place. .. seealso:: `expand_dims`, `flip`, `transpose` :Parameters: axes: (sequence of) `int`, optional The size 1 axes to remove. By default, all size 1 axes are removed. Size 1 axes for removal are identified by their integer positions in the data array. {+i} :Returns: out: `cf.Variable` :Examples: >>> v.squeeze() >>> v.squeeze(1) >>> v.squeeze([1, 2]) ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('squeeze', kwargs2) if not self._hasData and (axes or axes == 0): raise ValueError("Can't squeeze %r" % self.__class__.__name__) if i: v = self else: v = self.copy() if v._hasData: v.Data.squeeze(axes, i=True) return v #--- End: def def transpose(self, axes=None, i=False): ''' {+Fef,}Permute the dimensions of the data array. .. seealso:: `expand_dims`, `flip`, `squeeze` :Parameters: axes: (sequence of) `int` The new axis order of the data array. By default the order is reversed. Each axis of the new order is identified by its original integer position. {+i} :Returns: out: `cf.{+Variable}` :Examples: >>> f.shape (2, 3, 4) >>> f.transpose() >>> f.shape (4, 3, 2) >>> f.transpose([1, 2, 0]) >>> f.shape (3, 2, 4) >>> f.transpose((1, 0, 2)) >>> f.shape (2, 3, 4) ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('transpose', kwargs2) if not self._hasData and (axes or axes == 0): raise ValueError( "Can't transpose %r with no data" % self.__class__.__name__) if i: v = self else: v = self.copy() if v._hasData: v.Data.transpose(axes, i=True) return v #--- End: def def trunc(self, i=False): '''{+Fef,}Truncate the data array. The truncated value of the scalar ``x``, is the nearest integer ``i`` which is closer to zero than ``x`` is. I.e. the fractional part of the signed number ``x`` is discarded. .. versionadded:: 1.0 .. seealso:: `ceil`, `floor`, `rint` :Examples 1: >>> g = f.trunc() :Parameters: {+i} :Returns: out: `cf.{+Variable}` {+Fef,}The {+variable} with truncated data array values. :Examples 2: >>> print f.array [-1.9 -1.5 -1.1 -1. 0. 1. 1.1 1.5 1.9] >>> print f.trunc().array [-1. -1. -1. -1. 0. 1. 1. 1. 1.] >>> print f.array [-1.9 -1.5 -1.1 -1. 0. 1. 1.1 1.5 1.9] >>> print f.trunc(i=True).array [-1. -1. -1. -1. 0. 1. 1. 1. 1.] >>> print f.array [-1. -1. -1. -1. 0. 1. 1. 1. 1.] ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('trunc', kwargs2) if not self._hasData: raise ValueError("Can't trunc %r" % self.__class__.__name__) if i: v = self else: v = self.copy() v.Data.trunc(i=True) return v #--- End: def def unique(self): '''The unique elements of the data array. :Examples 1: >>> f.unique() :Returns: out: `cf.Data` Returns the unique data array values in a one dimensional `cf.Data` object. :Examples 2: >>> print f.array [[4 2 1] [1 2 3]] >>> print f.unique().array [1 2 3 4] >>> f.subspace[1, -1] = cf.masked >>> print f.array [[4 2 1] [1 2 --]] >>> print f.unique().array [1 2 4] ''' if self._hasData: return self.data.unique() raise ValueError( "ERROR: Can't get unique values when there is no data array") #--- End: def def setprop(self, prop, value): ''' {+Fef,}Set a CF property. .. seealso:: `delprop`, `getprop`, `hasprop` :Examples 1: >>> f.setprop('standard_name', 'time') >>> f.setprop('foo', 12.5) :Parameters: prop: `str` The name of the CF property. value : The value for the property. :Returns: `None` ''' # List functionality if self._list: for f in self: f.setprop(prop, value) return # Set a special attribute if prop in self._special_properties: setattr(self, prop, value) return # Still here? Then set a simple property self._private['simple_properties'][prop] = value #--- End: def def hasprop(self, prop): ''' Return True if a CF property exists, otherise False. .. seealso:: `delprop`, `getprop`, `setprop` :Examples 1: >>> x = f.hasprop('standard_name') :Parameters: prop: `str` The name of the property. :Returns: out: `bool` True if the CF property exists, otherwise False. ''' # Has a special property? # DCH if prop in self._special_properties: return hasattr(self, prop) # Still here? Then has a simple property? return prop in self._private['simple_properties'] #--- End: def def identity(self, default=None): '''Return the identity. The identity is the first found of the following: * The `standard_name` CF property. * The `!id` attribute. * The value of the *default* parameter. .. seealso:: `name` :Parameters: default: optional The identity if one could not otherwise be found. By default, *default* is `None`. :Returns: out: The identity. :Examples: >>> f.standard_name = 'Kelvin' >>> f.id = 'foo' >>> f.identity() 'Kelvin' >>> del f.standard_name >>> f.identity() 'foo' >>> del f.id >>> f.identity() None >>> f.identity('bar') 'bar' >>> print f.identity() None ''' return self.name(default, identity=True) #--- End: def def index(self, x, start=0, stop=None): ''' L.index(value, [start, [stop]]) -- return first index of value. Each field in the {+variable} is compared with the field's `~cf.Field.equals` method (as aopposed to the ``==`` operator). It is an error if there is no such field. .. seealso:: :py:obj:`list.index` :Examples: >>> ''' try: if stop is None: (None,).index(x, start) else: (None,).index(x, start, stop) except ValueError: raise ValueError("{0} is not equal to {1!r}".format( self.__class__.__name__, x)) if not self.equals(x): raise ValueError("{0} is not equal to {1!r}".format( self.__class__.__name__, x)) return 0 #--- End: def def insert_data(self, data, copy=True): ''' Insert a new data array into the variable in place. :Parameters: data: `cf.Data` copy: `bool`, optional :Returns: `None` ''' # List functionality if self._list: for f in self: f.insert_data(data, copy=copy) return if not copy: self.Data = data else: self.Data = data.copy() #--- End: def def inspect(self): ''' Inspect the object for debugging. .. seealso:: `cf.inspect` :Returns: `None` :Examples: >>> f.inspect() ''' print cf_inspect(self) #--- End: def # def getattr(self, attr, *default): # ''' # #Get a named attribute. # #``f.getattr(attr, *default)`` is equivalent to ``getattr(f, attr, #*default)``. # #.. seealso:: `delattr`, `hasattr`, `setattr` # #:Parameters: # # attr: `str` # The attribute's name. # # default: optional # When a default argument is given, it is returned when the # attribute doesn't exist; without it, an exception is raised in # that case. # #:Returns: # # out: # The attribute's value. # #:Examples: # #>>> f.foo = -99 #>>> fl.getattr('foo') #-99 #>>> del f.foo #>>> fl.getattr('foo', 'bar') #'bar' # #''' # return getattr(self, attr, *default) # #--- End: def # # def hasattr(self, attr): # ''' # #Return whether an attribute exists. # #``f.hasattr(attr)`` is equivalent to ``hasattr(f, attr)``. # #.. seealso:: `delattr`, `getattr`, `setattr` # #:Parameters: # # attr: `str` # The attribute's name. # #:Returns: # # out: `bool` # Whether the object has the attribute. # #:Examples: # #>>> f.foo = -99 #>>> fl.hasattr('foo') #True #>>> del f.foo #>>> fl.hasattr('foo') #False # #''' # return hasattr(self, attr) # #--- End: def def getprop(self, prop, *default): ''' Get a CF property. When a default argument is given, it is returned when the attribute doesn't exist; without it, an exception is raised in that case. .. seealso:: `delprop`, `hasprop`, `setprop` :Parameters: prop: `str` The name of the CF property. default: optional Return *default* if and only if the variable does not have the named property. :Returns: out: The value of the named property, or the default value. :Raises: AttributeError : If the variable does not have the named property and a default value has not been set. :Examples: >>> f.getprop('standard_name') >>> f.getprop('standard_name', None) >>> f.getprop('foo') AttributeError: Field doesn't have CF property 'foo' >>> f.getprop('foo', 'bar') 'bar' ''' # Get a special attribute if prop in self._special_properties: return getattr(self, prop, *default) # Still here? Then get a simple attribute d = self._private['simple_properties'] if default: return d.get(prop, default[0]) elif prop in d: return d[prop] raise AttributeError("%s doesn't have CF property %r" % (self.__class__.__name__, prop)) #--- End: def # def delattr(self, attr): # ''' # #Delete an attribute. # #[+1]Note that ``f.delattr(attr)`` is equivalent to ``delattr(f, attr)``. # #.. seealso:: `getattr`, `hasattr`, `setattr` # #:Examples 1: # #>>> f.delattr('foo') # #:Parameters: # # attr: `str` # The attribute's name. # #:Returns: # # `None` # #:Examples 2: # #>>> f.getattr('foo') #'bar' # #''' # # List functionality # if self._list: # for f in self: # f.delattr(attr) # return # # delattr(self, attr) # #--- End: def def delprop(self, prop): ''' Delete a CF property. .. seealso:: `getprop`, `hasprop`, `setprop` :Examples 1: >>> f.delprop('standard_name') :Parameters: prop: `str` The name of the CF property. :Returns: `None` :Examples 2: >>> f.foo = 'bar' >>> f.delprop('foo') >>> f.delprop('foo') AttributeError: Can't delete non-existent Field CF property 'foo' ''' # List functionality if self._list: for f in self: f.delprop(prop) return # Delete a special attribute if prop in self._special_properties: delattr(self, prop) return # Still here? Then delete a simple attribute d = self._private['simple_properties'] if prop in d: del d[prop] else: raise AttributeError("Can't delete non-existent %s CF property %r" % (self.__class__.__name__, prop)) #--- End: def def name(self, default=None, identity=False, ncvar=False): '''Return a name. By default the name is the first found of the following: 1. The `standard_name` CF property. 2. The `long_name` CF property, preceeded by the string ``'long_name:'``. 3. The `!id` attribute. 4. The `!ncvar` attribute, preceeded by the string ``'ncvar%'``. 5. The value of the *default* parameter. Note that ``f.name(identity=True)`` is equivalent to ``f.identity()``. .. seealso:: `identity` :Examples 1: >>> n = f.name() >>> n = f.name(default='NO NAME')) :Parameters: default: optional If no name can be found then return the value of the *default* parameter. By default the default is `None`. identity: `bool`, optional If True then only 1., 3. and 5. are considered as possible names. ncvar: `bool`, optional If True then only 4. and 5. are considered as possible names. :Returns: out: The name. :Examples 2: >>> f.standard_name = 'air_temperature' >>> f.long_name = 'temperature of the air' >>> f.ncvar = 'tas' >>> f.name() 'air_temperature' >>> del f.standard_name >>> f.name() 'long_name:temperature of the air' >>> del f.long_name >>> f.name() 'ncvar:tas' >>> del f.ncvar >>> f.name() None >>> f.name('no_name') 'no_name' >>> f.standard_name = 'air_temperature' >>> f.name('no_name') 'air_temperature' ''' if ncvar: if identity: raise ValueError( "Can't find identity/name: ncvar and identity parameters can't both be True") n = getattr(self, 'ncvar', None) if n is not None: return 'ncvar%%%s' % n return default #--- End: if n = self.getprop('standard_name', None) if n is not None: return n if identity: n = getattr(self, 'id', None) if n is not None: return n return default n = self.getprop('long_name', None) if n is not None: return 'long_name:%s' % n n = getattr(self, 'id', None) if n is not None: return n n = getattr(self, 'ncvar', None) if n is not None: return 'ncvar%%%s' % n return default #--- End: def def HDF_chunks(self, *chunksizes): '''{+HDF_chunks} .. versionadded:: 1.1.13 :Examples 1: To define chunks which are the full size for each axis except for the first axis which is to have a chunk size of 12: >>> old_chunks = f.HDF_chunks({0: 12}) :Parameters: {+chunksizes} :Returns: out: `dict` The chunk sizes prior to the new setting, or the current current sizes if no new values are specified. ''' if self._hasData: return self.Data.HDF_chunks(*chunksizes) else: return None #--- End: def def override_calendar(self, calendar, i=False): '''{+Fef,}Override the calendar of date-time units. The new calendar **need not** be equivalent to the original one and the data array elements will not be changed to reflect the new units. Therefore, this method should only be used when it is known that the data array values are correct but the calendar has been incorrectly encoded. Not to be confused with setting `cf.Field.calendar` or `cf.Field.Units` attributes to a calendar which is equivalent to the original calendar .. seealso:: `cf.Field.calendar`, `cf.Field.override_calendar`, `cf.Field.units`, `cf.Field.Units` :Examples 1: >>> g = f.override_calendar('noleap') :Parameters: calendar: `str` The new calendar. {+i} :Returns: out: `cf.{+Variable}` :Examples 2: ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('override_calendar', kwargs2) if i: v = self else: v = self.copy() if v._hasData: v.Data.override_calendar(calendar, i=True) else: if not v.Units.isreftime: raise ValueError( "Can't override the calender of non-reference-time units: {0!r}".format( self.Units)) v.Units = Units(getattr(v.Units, 'units', None), calendar=calendar) return v #--- End: def def override_units(self, units, i=False): '''{+Fef,}Override the units. The new units **need not** be equivalent to the original ones and the data array elements will not be changed to reflect the new units. Therefore, this method should only be used when it is known that the data array values are correct but the units have incorrectly encoded. Not to be confused with setting `cf.Field.units` or `cf.Field.Units` attributes to units which are equivalent to the original units. .. seealso:: `cf.Field.calendar`, `cf.Field.override_units`, `cf.Field.units`, `cf.Field.Units` :Examples 1: >>> g = f.override_units('m') :Parameters: units: `str` or `cf.Units` The new units for the data array. {+i} :Returns: out: `cf.{+Variable}` :Examples 2: >>> f[+0].Units >>> f[+0].datum(0) 100000.0 >>> f.override_units('km') >>> f[+0].Units >>> f[+0].datum(0) 100000.0 >>> f.override_units(cf.Units('watts')) >>> f[+0].Units >>> f[+0].datum(0) 100000.0 ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('override_units', kwargs2) if i: v = self else: v = self.copy() if v._hasData: v.Data.override_units(units, i=True) else: v.Units = Units(units) return v #--- End: def def rint(self, i=False): ''' {+Fef,} round data array. The scalar ``x`` is rounded to the nearest integer ``i``. .. versionadded:: 1.0 .. seealso:: `ceil`, `floor`, `trunc` :Examples 1: Create a new {+variable} with rounded data: >>> g = f.rint() :Parameters: {+i} :Returns: out: `cf.{+Variable}` {+Fef,}The {+variable} with rounded data array values. :Examples 2: >>> print f.array [-1.9 -1.5 -1.1 -1. 0. 1. 1.1 1.5 1.9] >>> print f.rint().array [-2. -2. -1. -1. 0. 1. 1. 2. 2.] >>> print f.array [-1.9 -1.5 -1.1 -1. 0. 1. 1.1 1.5 1.9] >>> print f.rint(i=True).array [-2. -2. -1. -1. 0. 1. 1. 2. 2.] >>> print f.array [-2. -2. -1. -1. 0. 1. 1. 2. 2.] ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('rint', kwargs2) if not self._hasData: raise ValueError("Can't rint %r" % self.__class__.__name__) if i: v = self else: v = self.copy() v.Data.rint(i=True) return v #--- End: def def round(self, decimals=0, i=False): '''{+Fef,} evenly round elements of the data array to the given number of decimals. .. versionadded:: 1.1.4 .. seealso:: `ceil`, `floor`, `rint`, `trunc` :Parameters: decimals: `int`, optional Number of decimal places to round to (default: 0). If decimals is negative, it specifies the number of positions to the left of the decimal point. {+i} :Returns: out: `cf.{+Variable}` {+Fef,}The {+variable} with rounded data array values. :Examples: >>> print f.array [-1.81, -1.41, -1.01, -0.91, 0.09, 1.09, 1.19, 1.59, 1.99]) >>> print f.round().array [-2., -1., -1., -1., 0., 1., 1., 2., 2.] >>> print f.round(1).array [-1.8, -1.4, -1. , -0.9, 0.1, 1.1, 1.2, 1.6, 2. ] >>> print f.round(-1).array [-0., -0., -0., -0., 0., 0., 0., 0., 0.] ''' # List functionality if self._list: kwargs2 = self._parameters(locals()) return self._list_method('round', kwargs2) if not self._hasData: raise ValueError("Can't round %r" % self.__class__.__name__) if i: v = self else: v = self.copy() v.Data.round(decimals=decimals, i=True) return v #--- End: def def roll(self, iaxis, shift, i=False): ''' .. seealso:: `expand_dims`, `flip`, `squeeze`, `transpose` :Parameters: iaxis: `int` {+i} :Returns: out: `cf.{+Variable}` :Examples: ''' if not self._hasData: raise ValueError("Can't roll %r" % self.__class__.__name__) if i: v = self else: v = self.copy() v.Data.roll(iaxis, shift, i=True) return v #--- End: def # def setattr(self, attr, value): # ''' # #Set a named attribute. # #``f.setattr(attr, value)`` is equivalent to ``setattr(f, attr, #value)``. # #.. seealso:: `delattr`, `hasattr`, `getattr` # #:Parameters: # # attr: str # The attribute's name. # # value: # The value to set the attribute. # #:Returns: # # `None` # #:Examples: # #>>> f.setattr('foo', -99) #>>> f.foo #-99 # #''' # # setattr(self, attr, value) # #--- End: def def where(self, condition, x=None, y=None, i=False): ''' Set data array elements depending on a condition. .. seealso:: `cf.masked`, `hardmask`, `subspace` :Returns: out: `cf.{+Variable}` ''' if not self._hasData: raise ValueError( "ERROR: Can't set data in nonexistent data array") if isinstance(condition, Variable): if not condition._hasData: raise ValueError( "ERROR: Can't set data when %r condition has no data array" % condition.__class__.__name__) condition = condition.Data #--- End: if if x is not None and isinstance(x, Variable): if not x._hasData: raise ValueError( "ERROR: Can't set data from %r with no data array" % x.__class__.__name__) x = x.Data #--- End: if if y is not None and isinstance(y, Variable): if not y._hasData: raise ValueError( "ERROR: Can't set data from %r with no data array" % y.__class__.__name__) y = y.Data #--- End: if if i: v = self else: v = self.copy() v.Data.where(condition, x, y, i=True) return v #--- End: def #--- End: class # ==================================================================== # # SubspaceVariable object # # ==================================================================== class SubspaceVariable(object): __slots__ = ('variable',) def __init__(self, variable): ''' Set the contained variable. ''' self.variable = variable #--- End: def def __getitem__(self, indices): ''' Called to implement evaluation of x[indices]. x.__getitem__(indices) <==> x[indices] ''' variable = self.variable new = variable.copy(_omit_Data=True) if variable._hasData: new.Data = variable.Data[indices] return new #--- End: def def __setitem__(self, indices, value): ''' Called to implement assignment to x[indices] x.__setitem__(indices, value) <==> x[indices] ''' if isinstance(value, Variable): value = value.Data self.variable.Data[indices] = value #--- End: def #--- End: class cf-python-1.3.2/docs/0000755000175000017500000000000012770523315014561 5ustar daviddavid00000000000000cf-python-1.3.2/docs/source/0000755000175000017500000000000012770523316016062 5ustar daviddavid00000000000000cf-python-1.3.2/docs/source/function.rst0000644000175000017500000000512612747600703020445 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj .. _function: Functions of the :mod:`cf` module ================================= Input and output ---------------- .. autosummary:: :nosignatures: :toctree: generated/ :template: function.rst cf.close_files cf.close_one_file cf.dump cf.open_files cf.open_files_threshold_exceeded cf.pickle cf.read cf.write cf.unpickle Aggregation ----------- .. autosummary:: :nosignatures: :toctree: generated/ :template: function.rst cf.aggregate .. _functions-mathematical-operations: Mathematical operations ----------------------- Comparison ---------- .. autosummary:: :nosignatures: :toctree: generated/ :template: function.rst cf.equals cf.equivalent The following functions generate `cf.Query` instances for evaluating objects against given criteria. For example, ``cf.wi(3, 5)`` generates a query for testing whether, or where, an object is in the range [3, 5]. .. autosummary:: :nosignatures: :toctree: generated/ :template: function.rst cf.contain cf.eq cf.ge cf.gt cf.le cf.lt cf.ne cf.set cf.wi cf.wo **Climatological seasons** The following functions generate `cf.Query` instances for evaluating objects against given criteria. For example, ``cf.djf()`` generates a query for testing whether, or where, a date-time object is in a December--February season. .. autosummary:: :nosignatures: :toctree: generated/ :template: function.rst cf.djf cf.mam cf.jja cf.son cf.seasons **Date-time** .. autosummary:: :nosignatures: :toctree: generated/ :template: function.rst cf.dteq cf.dtge cf.dtgt cf.dtle cf.dtlt cf.dtne cf.year cf.month cf.day cf.hour cf.minute cf.second **Coordinate cell bounds** .. autosummary:: :nosignatures: :toctree: generated/ :template: function.rst cf.cellgt cf.cellge cf.cellle cf.celllt cf.cellwi cf.cellwo cf.cellsize Date-time --------- .. autosummary:: :nosignatures: :toctree: generated/ :template: function.rst cf.dt cf.Y cf.M cf.D cf.h cf.m cf.s Retrieval and setting of constants ---------------------------------- .. autosummary:: :nosignatures: :toctree: generated/ :template: function.rst cf.ATOL cf.CHUNKSIZE cf.FM_THRESHOLD cf.MINNCFM cf.OF_FRACTION cf.REGRID_LOGGING cf.RTOL cf.TEMPDIR Miscellaneous ------------- .. autosummary:: :nosignatures: :toctree: generated/ :template: function.rst cf.abspath cf.dirname cf.flat cf.pathjoin cf.relpath cf-python-1.3.2/docs/source/constant.rst0000600000175000017500000000127512603546021020433 0ustar daviddavid00000000000000.. currentmodule:: cf Constants of the :mod:`cf` module ================================= .. data:: cf.masked The :attr:`cf.masked` constant allows data array values to be masked by direct assignment. This is consistent with the :ref:`behaviour of numpy masked arrays `. For example, masking every element of a field's data array could be done as follows: >>> f.subspace[...] = cf.masked To mask every element of a field's data array whose value is less than zero: >>> f.where(cf.lt(0), cf.masked, i=True) .. seealso:: `cf.Field.hardmask`, `cf.Field.subspace`, `cf.Field.where`, `cf.lt` cf-python-1.3.2/docs/source/units_structure.rst0000644000175000017500000001472112747600703022103 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj .. _units: Units handling by the `cf.Units` object ======================================= A field (as well as any other object which :ref:`inherits ` from `cf.Variable`) always contains a `cf.Units` object which gives the physical units of the values contained in its data array. The `cf.Units` object is stored in the field's `~Field.Units` attribute but may also be accessed through the field's `~Field.units` and `~Field.calendar` CF properties, which may take any value allowed by the `CF conventions `_. In particular, the value of the `~Field.units` CF property is a string that can be recognized by `UNIDATA's Udunits-2 package `_, with a few exceptions for greater consistency with CF. These are detailed by the `cf.Units` object. Assignment ---------- The Field's units may be assigned directly to its `cf.Units` object: >>> f.Units.units = 'days since 1-1-1' >>> f.Units.calendar = 'noleap' >>> f.Units = cf.Units('metre') But the same result is achieved by assigning to the field's `~Field.units` and `~Field.calendar` CF properties: >>> f.units = 'days since 1-1-1' >>> f.calendar = 'noleap' >>> f.Units >>> f.units 'days since 1-1-1' >>> f.calendar 'noleap' Time units ---------- Time units may be given as durations of time or as an amount of time since a reference time: >>> f.units = 'day' >>> f.units = 'seconds since 1992-10-8 15:15:42.5 -6:00' .. note:: It is recommended that the units ``'year'`` and ``'month'`` be used with caution, as explained in the following excerpt from the CF conventions: "The Udunits package defines a year to be exactly 365.242198781 days (the interval between 2 successive passages of the sun through vernal equinox). It is not a calendar year. Udunits includes the following definitions for years: a common_year is 365 days, a leap_year is 366 days, a Julian_year is 365.25 days, and a Gregorian_year is 365.2425 days. For similar reasons the unit ``'month'``, which is defined to be exactly year/12, should also be used with caution." Calendar ^^^^^^^^ The date given in reference time units is always associated with one of the calendars recognized by the CF conventions and may be set with the *calendar* CF property (on the field or Units object). If the calendar is not set then, as in the CF conventions, for the purposes of calculation and comparison, it defaults to the mixed Gregorian/Julian calendar as defined by Udunits: >>> f.units = 'days since 2000-1-1' >>> f.calendar AttributeError: Can't get 'Field' attribute 'calendar' >>> g.units = 'days since 2000-1-1' >>> g.calendar = 'gregorian' >>> g.Units.equals(f.Units) True The calendar is ignored for units other than reference time units. Changing units -------------- Changing units to equivalent units causes the variable's data array values to be modified in place (if required) when they are next accessed, and not before: >>> f.units 'metre' >>> f.array array([ 0., 1000., 2000., 3000., 4000.]) >>> f.units = 'kilometre' >>> f.units 'kilometre' >>> f.array array([ 0., 1., 2., 3., 4.]) >>> f.units 'hours since 2000-1-1' >>> f.array array([-1227192., -1227168., -1227144.]) >>> f.units = 'days since 1860-1-1' >>> f.array array([ 1., 2., 3.]) The `cf.Units` object may be operated on with augmented arithmetic assignments and binary arithmetic operations: >>> f.units 'kelvin' >>> f.array array([ 273.15, 274.15, 275.15, 276.15, 277.15]) >>> f.Units -= 273.15 >>> f.units 'K @ 273.15' >>> f.array array([ 0., 1., 2., 3., 4.]) >>> f.Units = f.Units + 273.15 >>> f.units 'K' >>> f.array array([ 273.15, 274.15, 275.15, 276.15, 277.15]) >>> f.units = 'K @ 237.15' 'K @ 273.15' >>> f.array array([ 0., 1., 2., 3., 4.]) If the field has a data array and its units are changed to non-equivalent units then a :py:mod:`TypeError` will be raised when the data are next accessed: >>> f.units 'm s-1' >>> f.units = 'K' >>> f.array TypeError: Units are not convertible: , Overriding units ^^^^^^^^^^^^^^^^ If the units are incorrect, either due to a data manipulation or an incorrect encoding, it is possible to replace the existing units with new units, which don't have to be equivalent, without altering the data values: >>> f.units 'mm/day' >>> f.mean() >>> g = f.override_units('kg m-2 s-1') >>> g.mean() >>> g.override_units('watts m-2', i=True) >>> g.mean() Overriding the calendar of reference time units is done in a similar manner: >>> f.calendar '360_day' >>> f.array.min() 59.0 >>> f.min() >>> g = f.override_calandar('gregorian') >>> g.array.min() 59.0 >>> g.min() Note that in this case the data values have remained unchanged, but their date-time interpretation has been redefined. See `cf.Field.override_units` and `cf.Field.override_calendar` for details. Equality and equivalence of units --------------------------------- The `cf.Units` object has methods for assessing whether two units are equivalent or equal, regardless of their exact string representations. Two units are equivalent if and only if numeric values in one unit are convertible to numeric values in the other unit (such as ``'kilometres'`` and ``'metres'``). Two units are equal if and only if they are equivalent and their conversion is a scale factor of 1 (such as ``'kilometres'`` and ``'1000 metres'``). Note that equivalence and equality are based on internally stored binary representations of the units, rather than their string representations. >>> f.units = 'm/s' >>> g.units = 'm s-1' >>> f.Units == g.Units True >>> f.Units.equals(g.Units) True >>> g.units = 'km s-1' >>> f.Units.equivalent(g.Units) False >>> f.units = 'days since 1987-12-3' >>> g.units = 'hours since 2000-12-1' >>> f.Units == g.Units False >>> f.Units.equivalent(g.Units) True Coordinate units ---------------- The units of a coordinate's bounds are always the same as the coordinate itself, and the units of the bounds automatically change when a coordinate's units are changed: >>> c.units 'degrees' >>> c.bounds.units 'degrees' >>> c.bounds.array array([ 0., 90.]) >>> c.units = 'radians' >>> c.bounds.units 'radians' >>> c.bounds.array array([ 0. , 1.57079633]) cf-python-1.3.2/docs/source/images/0000755000175000017500000000000012770523316017327 5ustar daviddavid00000000000000cf-python-1.3.2/docs/source/images/inheritance1.png0000600000175000017500000000575012603546021022377 0ustar daviddavid00000000000000‰PNG  IHDR½(óBbKGDÿÿÿ ½§“ IDATxœíÝLÔõð'ô%DNQ!B±­åZQÓj'éiâÑ«£ÒkÞÐÁD¤Ìá••©S@ÃyŽáüÅb¶åiæFÐnmMwÖf+jØRü5 8— œ?¸ïŽOÜq¿¸»Ï}îó¹çã¹ÏÝûýù|^/>¯Ïë>÷áŒq8)X¬Ô@DDDD$66½DDDD¤xlz‰ˆˆˆHñØô‘âýÏuÕjÅž={¤ØY9zô¨(ó2þ¡ÁüH‹ñ—ã/-ÆŸ`áÂ…(++eî={öÀjµŠ2·R¸‹ÿ˜¦·»»f³999aÛ09±X,¢ÎÏø‡ù‘ã/-Æ_ZŒ?°X,ˆ‹‹mþ3gÎðwÁ OñÓôŽØµk—¨$WÍÍÍ0 ¢¯‡ñ ó#-Æ_ZŒ¿´ŽßƒÜÜ\TUU‰¾9òÞÓKDDDDŠÇ¦—ˆˆˆˆM/)›^""""R<6½DD^dffJ½ DDlz)¤Ø È óE¢íضý•R$ÇÚãW–‰a$111HLLDzz:^zé%èõz$%%kžŽŽ±6SV¤Œ©»1ÌËX¡Ê‘˜¯ÜiÆF|çÏŸÇ®]»pöìY8Ì›7ï¿ÿ>ž|òI©7Mö¼5¢ÿ~KY÷xn Œ·>`<=Âè×EZ¿Ö¦ø/·o߯… pòäI¼ñÆhllDZZZ¸7GÓÈÇE¾H*ÌÑ »»«V­Bii)jjj---X½z5‘‘‘!ñÊ[$4¬{i$»½!!!O=õ>øàäççÃd2 Ï]¾|ëÖ­ƒZ­ÆóÏ?5kÖ ¿¿Àï333ÞÉz-BÓááaìÞ½/¿ü2^xá”——cppÐëן¿üòKh4Ì›7ùùù8{ö,Nž<‰¼¼<Ì;Z­]]]~­S ¼åÈn·Ãh4"++ YYY¨¬¬„Ýnž$ž¾Ž ×|=zK—.æúã?DŽˆ¼øŠ§ÝnÇG}„_|ÙÙÙ8tèSŒ­V+òóó1wî\,]ºÇ—b7"B]]V®\ ­V •J•J­V ½^ºº:áuî®Xú[§F^ûùçŸãÕW_ųÏ>‹•+W¢¥¥Åi¾k×®aÑ¢EaO#S8kµ·ºç+¿®ù;ŸþÙŸZËZ虯øŒÎÁÈ¿‘R#âžÞ×_mmmÂãÒÒRèt:œ>}§NÂìÙ³Q]] à¿wŽ®ÏxBÓýû÷ã÷߇ÙlÆ©S§ÚÚZ¯c\µµµ¡¡¡­­­ÈÍÍEII NŸ>àÇDNNŒF£_ëT×™L&ôôôà›o¾ASS®]»†½{÷:o<Ç{\üüóÏhllDkk+/^ŒÊÊÊï·œùЧÉdÂÍ›7a±XpâÄ üòË/Nã7mÚ„’’œ9s hoo÷.DŒ¶¶6äååYž——‡Ÿ~úÉïyü©0›ÍhooGQQêëë1<<,<___N•JøÉ\¸jµkÝóÇèüÏFó§Ö²zçO|<åBÊ:MïôéÓqãÆ áñ×_ µZøøx¨T*¼ûî»hmmõ:G c”,1ýꫯ°iÓ&¤¤¤ 11ëׯÇwß}7®í¨¨¨@jj*&L˜€wÞyƒƒƒøä“Oœ–ýöÛo!]§\¸æ¨¥¥ƒS§NErr2>üðC477;o<Ç›÷?þ3fÌ@BBôz=:;;C¿ãjäj„ëU‰Ñ|ų¥¥7nDRR’’’P^^î4>>>½½½°ÙlxôÑG£úDj³ÙœœÌ˜1Ãiy__&Ožì÷<þÔ ×uá³Ï>ƒF£A]] …ã)Z…«V»Ö=¸æ/Øó½?µ6kall,†‡‡ë|=Ôݲ`â#eŒˆ¦÷øñã˜?¾ðxÆ (//ÇÂ… ‘˜˜ˆÁÁAdeey#1JŠ˜NŸ>GŽSpÄ$Å:¥âš£iÓ¦áòå˘5k€÷­¹»6<.BËW<§M›†«W¯"==påʧñÏ<ó L&¬V+6oÞµM¯Z­FSS –755A­V zè! ˜ëUÂ@jFvv6L&vïÞsçÎaëÖ­AìIt ´V»Ö=_ùu'غ&F­U‚ÔÔTtuuaΜ9NËÿüóO¤¦¦†l=RÖAÉnoBgg'ªªªpâÄ ”–– ÏÙívÄÇÇãá‡Æ•+WÆ\úž4i.\¸à´Ìטhê˜Àh4âÒ¥K¸ÿ>ºººœ>®u7&X¾Ö)wÞr¤ÑhPUU…þþ~ô÷÷cÇŽÐh4A­ÇEhùЧF£AMM l6l6›ð­#6n܈¿þú ÷î݃Ãሊ«Gž””” ¡¡f³À±cÇpðàA ¯›3g044„žžlÙ²Åiž@jFLL ŠŠŠpøða#..N”}T²ñÄÝ[Ýó•_w9Ÿ&F­U‚‚‚lÞ¼ííí¸sçîܹƒ_ýxë­·šÓ].¤¬ƒa¿Ò›™™‰˜˜$$$`æÌ™X°`Ìf3¦N*¼æÓO?Euu5®^½Š””èõzáþ+ÐëõxóÍ7qëÖ-á#I_c”L¬˜®Zµ ‡ÂêÕ«ÑÓÓƒÙ³g;ŒÜ –¯uÊ•?9*++ömÛ›› ÈÉÉAYYYPëæãB ¾â¹nÝ:TVVbÉ’%HLL„N§ƒÕjžå•WðÞ{ïáÒ¥KxüñDZ}ûv)v#"dddàÀ¨­­ÅÎ;qëÖ-Lœ8ÄOMŒZ«………HHH€ÑhÄÅ‹<8NµZ-Þ~ûí€æt— )ë`ŒÃápŒ^ðÅ_`ÅŠüÎJš››a0à¶aüƒÃüH‹ñwö÷ßcÍš5a{£!çøß½{(..ËU·²²2h4¡ñ 9ÇŸBË`0`Ê”)8räˆ(ó¯X±7nÜ@UU•(ó˧øGÄ·7)Euu5þý÷_ôöö¢¦¦‹/–z“d!..[·n>vËðð0Ž;†îîn~¤Me"âÙˆˆ”"-- yyy°ÛíÈÎÎÆÚµk¥Þ$Ùxúé§ñý÷ß‹ºŽçž{iiiعs瘿H'"ecÓKDB::NêÍ xkQôâÛ\""""R<6½DDDD¤xlz‰ˆˆˆHñØô‘â±é%""""ÅcÓKDDDDŠçñ+Ë6lØÎí _ÿ=b¨0þa~¤ÅøK‹ñ—ãO#, –/_.ê:š››qïÞ=Q×!Wžâ?¦é5k´ZmX6JŽÄŽ ãæGZŒ¿´i1þ4B«ÕB­V‹6¿Z­ÆÝ»wE›_î<Å?Æ!ÖNDDDD!xO/)›^""""R<6½DDDD¤xlz‰ˆˆˆHñþgR½}o¯Î¨IEND®B`‚cf-python-1.3.2/docs/source/images/inheritance3.png0000600000175000017500000003243612611506114022400 0ustar daviddavid00000000000000‰PNG  IHDR8P¤ºõ bKGDÿÿÿ ½§“ IDATxœíÝyXçºðaA±JؤXµÇ£}‚˵¢‚-­–( HUBÖQ‘EJQz°EыĀX«”s´¨(Z¯¨xµ. `dieÑ!Ìýc"Y“L&yð$ß̼ß;3¼Y&3ßè¡(Š4›>Ù äƒB€ P (T(ÀPÆ´çÏŸoܸ±««KmÙhccヾÿþûCZYY9ô8š†¨MÛGz2Žúæåå1™LWWWBz¢–K—.åææz{{=”žžžƒƒƒ••ÕÐCi¢6lEÈzGŤ¤¤ÒµÐét£}ýõ× ƒÀ€š€ÀMÛG.øŽ @¡@P¨Pª–“öM‰ØoPÚJs¶% Us6ÐXZöOBL¡>{ölË–-ÎÎγfÍòññ¹té’rqܸåååÊÅ×døºkÙ˜Juvv¦¦¦.[¶löìÙNNN¡¡¡·o߯&iÙ? …Z__Ïápf̘‘ŸŸ_ZZT4ô°ÈÙÖÖvðàÁ[·n.]º4==ì¤T‚€B=tè‹ÅZ³fµµµ‘‘‘ƒƒÃÞ½{±I===ÉÉÉ......ÉÉÉ===X;NÏËËc0³gÏöõõ­©©AþýNB§Óñ·”úúúððpggçyóæ………½zõ _\FAúúú222 †““S\\œP(Äç?vìØ¢E‹†¾âªðîFPp]¤m+A²²²>ýôSggç]»v‰D¢~=J‹O wïÞˆˆ°··6lؘ1c Fvv66IòŸDÖ(m­E"Qbb¢³³³‹‹ JP¨·oßvsspÒáÇkjjrsssss«ªª233ñI7nÜÈÎξ~ýú‚ V)//Ç?´„‡‡ûøø\¹r¥¸¸˜F£íß¿ÿÝ.Þƒ ÈñãÇïܹ“••uáÂ…ÞÞÞ´´4|þ»wïž8q¢¬¬lè+® ïn×EƶºuëV~~~AAÁ³gÏŽ9Ò¯Gñ5ßǼcÇŽû÷ïwwwK›§üßâãã?ýôS¬QÚZgffÖÕÕäææ–””¨cC@¡¾~ýÚÂÂbÀIç΋‰‰±´´´´´Ü¶mÛ¹sçðIqqq666&&&l6»¢¢bÀÅOŸ>=gΜáÇ›šš†††¸áŒsêÔ©íÛ·ÛÚÚš™™EFF^¾|Ÿ?&&†F£)¿¶j§àºÈØVØl4-::ú—_~Q<¾æÛ½{÷„ œœ–,Y’’’ÒÙÙ9àœ¥¥¥yyyÉÉÉØSik]XXˆm.ì?VM«¡ù§ÊennÞÒÒ2~üøw'I¶ÛÙÙ |Ò¸qã°ÆÆÆÒ^?~¼oß¾ÊÊÊöövAôõxY0Nss³»»;>ä‚ÖÖÖ ¯™FPp]dl+i»@n|Ígjj‚¢èÓ§O=}ðàÁ~³=}úôÿøÇáÇGމµH[k@ ¹¹T¿Š" P‹ŠŠÞdaaÑØØ8iÒ$A侕éééI>ŠŠ NII5jTGG‡³³³‚)Y[[gddØØØÈíBõËPÁu‘±­ð]ÐØØøî.ŸBôôô&OžýÅ_ô›ÔÚÚöÝwßI®£´µ¦Ñh’ÿ±ªN[q¼|nذ᧟~:vìŸÏïéé)//Ç&¹¹¹%%%ñù|>ŸŸ””$í«,ÎÜܼ¶¶* MMMMLLš››wîÜ©xJL&3>>¾¶¶V$UWWGEE)±^dé·\ÛŠËå @Àår—.]ÚoAJo+‡sñâÅ—/_ööö655íÛ·oæÌ™ýæÙ´iS@@@¿vikíææ†o.üs²& àÕÞÞžÇã8p ==½««kÊ”)›´wï^&“‰ ƒÁ ”* ÀÏϯ££;”’Àår#"",,,Ølvqq±‚)±X,}}ý°°°¦¦&{{ûM›6 aýÔ­ßFPp]dl+GGÇU«Võöö.Y²äÝ]@ém|òäÉ„„„îîîqãÆ}òÉ'IIIýæ)+++++Û¾};öTöV JNNöòò244d³Ù¥¥¥ê\ä_ªe?+ˆN§x=êž={´ò2.¢®G…í#•Ž ³ P (T(  €B€ P (T(@þ §NRCÚ­´´´££ƒì,4lùPéJJJ ÈN%%%26Žâ¼\A µ‰`û(BV¡jšM›6=yòDéÅ»ººrrr<<<’’’^¾|I`bjðúõk77·ßÿ}(A?~Ìd2{{{‰ÊJúúúΞ=»råÊmÛ¶UWW%”··wkk+Q‰‘‹J…úüùó   ¡Ç¹~ý:‡ÃY¿~}eeåУ©Akkë’%K†X¥˜k×®=Ž*¼yó&55ÕÕÕ555µ­­mˆÑnܸñÍ7ß’˜& R¡¢(Êápêëë U]]æééyöìÙ¾¾>BbªBGGDzeËÊÊʈ ˜••Åår‰ŠFˆúúúÍ›7¯X±âìÙ³b±˜˜,ëÅ‹„„Ò+Ô²²²ÈÈH¶µµ¥¦¦zxxddd¼}û–ÀÈ„èììtww¿ÿ>±a£££Ož{ö¬——Wtttcc#±Á•ÖÕÕõå—_Þ¼y“ðÈ}}}§´´”ðÈ êééÁðù|Âã³Ùì?þøƒð°$¢^¡^½zu×®]* ~÷îÝ€€ÿ‡ª¨ õôô`ƒ•©(þÛ·o—/_NÔ÷ŵ´´ÄÇÇ/_¾žž®ê^„BaNNŽ»»{jjjGG‡ª»Ã‰Åâµk×þóŸÿTC_Ø6"‘Hu]ôööæåå¹»»GGG«¡~ž={¶víZU÷¢~”,T±X¼téRõ¼×‰Åâââb‹µyóæºº:Uw×××”ŸŸ¯êŽp.\ SEäW¯^%%%¹»»gdd¨í•.$$„*¿º Ь¡X4Yffæ˜1cV®\©¶«ªªÒÓÓ›šš-Z¤¢^ÂÃçOŸ¾fÍÅPfffWW£%ÕÕÕ¥¦¦¶´´p8œÏ?ÿ\mC677oݺõøñãêéN­È~¥PRWW—‡‡‡úûIII999===ÄÿöÛo9BlL………9sfèqŠ‹‹™Læ–-[9=c°"##ccã‘#Gþë_ÿâñx>>>øé5ÁåË—™Læ÷ßÏápN:åîînnn~àÀààà®®.²³؉'˜L&µî’®$²_)ˆÑ××·lÙ2•^2t÷îÝswwǹyýú5>¸„P($++ìnOOOi×pÿïÿþïš5k4íÐ4Š¢b±xñâÅšü ‚@Úp0 “““3lØ0‹Ev"«¨¨ˆŠŠ:qâÄèÑ£%ÛE"Ñ¿þõ¯“'O:88„„„¨óØ‹/ÒÒÒ>|Èb±<==ŒŒ¤Í™ŸŸ_QQ¯¶Ü‘ŸŸßÒÒ²aòQ ²_)ÓÓÓ³lÙ2 |áGQôéÓ§Ë–-“=‚ >¸ã˜ISVVæïï?¨“ŠŽ;¦Ò¬¥¯¯oÉ’%õs®JiO¡¢(š’’RTTDvý={öŒÁ`(xH¦©©)>>ÞÝÝ]ƒK`×p{xxÄÇÇ755 jÙ¾¾¾µk×’uÄ» wïÞMvê£U…ÚÙÙ¹råJ²³ø‹¦¦&ƒ1ØÓ:::222°Á%<óV6ü¥¿÷ôô¬X±¢ªªjèù ݲeËÙ2T¡U…Š¢è7ß|£9—Püù矮®®J † .áëë»yóf¥ƒTVV®[·ŽÅbý{Á‹/ÜÝÝI~þÊ•+¤_l¤fÚV¨|>õêÕdg¢(úòåËÅ‹ñ¦ ˜{{{+~/ìÆžžžaaaľÖÔÔ|ùå—ä~9üòË/ɺê•,ÚV¨(Šnܸ‘ôgíííC¹Sλø|>~N¼Œ¢Ôp ÷ÿüÏÿ¬[·N‘QRRCVïdÑÂB}úôéÆIL» …ŠÆéîîÎÉÉY¼xq|||¿[]544¨íîìì줤$•v!ͪU«4ùd)ÑÂBEQÔÏϯ¹¹™”®…B¡———¡Çouõøñã›7o®^½:$$ä·ß~Su¿¸mÛ¶8qBmÝaîÞ½»yóf5wª ´³Pïß¿Oʘ Ø•7nÜPOw"‘h÷îÝ'Nœ6mÚ±cÇÔür__Ÿ¿¿¿šÝùúúv°í 'IΘ1£²²²­­Mööör8œàààùó竺¯—/_îØ±ÃÝÝF£UTTܺu«µµuñâÅû÷ï …ªî£§§wðàÁäääúúzõôøøñcSSSm½ñ±d¿R¨ÊÅ‹÷ìÙ£¶îz{{ýüüÔpºÅ£G8ÎêÕ«¯_¿ÞoÒ — JKK‹»»;á·í¿¿ÿÓ§OÕБÒÚBEQÔÝÝ]E·!êG,¨® ìç–U«VÅÄÄÈýgýí·ßÖ®]Ëb±Ôs¿65ÜEÑêê꯿þZ¥]h2m.Ô'Ndgg«¡£ÐÐÐüQEÁ;;;SSS±C êî?þø#>>ÞÓÓS ·º***RõÌׯ__QQ¡Ò.4™6jooïÒ¥KUýCExxxVV–*"×ÕÕmÞ¼Ù××·¸¸Xéµ\B¥P333U7€xcc£Š‚S‚ö\æ6 ´´4{{{Õ {•ðÞ{ï…„„öòåË™™™¶¶¶ëÖ­›2eÊТ(zåÊ•ììl¶yóæ & =æ»""">ùäOOOÂ#‡‡‡¯^½zæÌ™„G¦ ²_)TëÍ›7ª—ùûï¿ß»w/…BaFFv ·@ 02®ªªjË–-L&³¸¸˜ðàb±ØÏÏïþýûĆåóù_~ù%±1)GË EÑ;w*~ЬâöìÙOT´¦¦¦èèh///Õ݇[’ê—xóæ§§'±ÇœcccoÞ¼I`@*ÒþB}ùò%‹Å"6fzz:Q§›>|øp°×pEòVW---D…Ô}1äjmm]¶l!¡(Mû EÑÍ›7gggÏ;÷«¯¾R:ÈÕ«W±?þøcTTÔS®áöôôŒ'ëlGÜÝ»w9Qc#Þ»wÏÛÛ»··÷íÛ·Ja¾¢oÛ¶íâÅ‹„dEiZ^¨b±øèÑ£“&M1b‚ ŽŽŽÊÅ©®®633óöö>yòä† †r²^kk+~ ·F$R[[íîî®Ü­®úÉËËÛ¾};N=z´·ommµµµEÄÂÂbéÒ¥Ä^‡DEZ^¨•••’ƒ‰988(ÇÃÃAccãY³f½}ûV‘Eúúú~úé'É–ŠŠŠuëÖ}õÕWïžT¤9ÚÛÛ\âÑ£Gƒ:ãÿæÍ›ï¿ÿ>¶Ù}}}›FYY>ΛžžNl-£å…Š¢èÕ«W±×fA>üðC%"ðù|,Âðáÿøâ ¹CTŠD"777SSÓ_ýUònB®#WìlÄ+VlÞ¼ùùóç(Š:99YXX(x¬øÁƒcÇŽÅ_'Nœ8ØA=Ï;‡ŠˆU©zNQÔdÚ_¨(Šž?«´÷ß_‰36lØ€ñúè#üÖOVVVJ|CÓ4^^^øÛã¸qãöï߯ÈRØñv¦ÄÑ€€x/•¤+…Š¢hVV–‰‰ÉǵÔÎ;Gµ`ÁE~ÊS¦Léw[1ÂR³×¯_[XXH®Ñ˜1c¿2©¤¤dæÌ™¦¦¦ƒ táÂ…S¦L¡èÇU ³PKJJdŒÎ®#&L˜@â..ì###Uœ£:†$n¬¦¦¦žžìÛˆnzðàÁ?þHvýéÂ~‰ˆˆhjj";‹A ³P1®®®d§@E5°P1º¼_4vÅ€–B€ P (T( h::Nv ä£@¡b£{-[¶löìÙNNN¡¡¡·oß&;)€Ðétlô ¼EQOOOÂ몼¼œØ€TDBŒŒlkk;xðà­[· —.]šžžNvRAÄØØøÚµkøÓ«W¯š˜˜˜£@¡Þ½{7""ÂÞÞ~ذacÆŒa0ÙÙÙØ¤¾¾¾ŒŒ ƒáää‡/‰]\\²³³ñ×ø~/öøSiqètz^^ƒÁ˜={¶¯¯oMM Ö.‹ÓÒÒ\]]çÏŸŸ““#;ˆó÷÷ÏÊÊŸòx<üi}}}xx¸³³ó¼yóÂÂÂ^½z…µÓéô¬¬¬O?ýÔÙÙy×®]"‘Hn;þ`ÀÝÑÓÓóÝwßa»;++K+?*S P?þøã;vÜ¿¿»»»ß¤ãÇß¹s'++ëÂ… ½½½iiiX{fff]]]AAAnnnII‰Ü.¤ÅAäÆÙÙÙׯ__°`ABBÖÈãñîÝ»ÇãñŠŠŠø|¾Ü ÚjÑ¢E­­­<@äÎ;mmm‹-§†‡‡ûøø\¹r¥¸¸˜F£íß¿ŸtëÖ­üüü‚‚‚gÏž9rDn;nÀÝqøðáæææ‚‚‚¼¼|øð®®.cccA^¼x·K‹#••UCCÃäÉ“%D;ùúúÆÆÆ†††ö»æ&***888%%eÔ¨QÎÎÎø$|ï466b¬Ên—Í¢©©éƒ>ÀúJi ¼ês8œ‹/¾|ù²···©©iß¾}øˆéL&3>>¾¶¶V$UWWGEEaínnn\.W ‚ääd<Ô´iÓŽ=* ›ššðo82âHãéé¹k×®ÆÆÆööv.—«\­±víÚHFÂ…BSSS“æææ;wJNÂ÷—Ë]ºt©ÜvÙ$w÷îÝ»‡¸:š‰ï¨ÁÁÁ'OžLHHèîî7nÜ'Ÿ|’””„Mb±XúúúaaaMMMööö›6mÂÚƒ‚‚’““½¼¼ Ùlvii)Öþí·ßÆÇÇ9rdìØ±þþþW¯^•G‡# Ùl¶P(\·nrA´^BB—ˈˆ°°°`³ÙÅÅÅø$GGÇU«Võöö.Y²$00Pn»lAAAIIIØîf±XZy<‰Ì{Ïäåå1™L5üœM§Ó5óGó‹/FFF’¸ ¤êý"mw²›ªªªBCC‹ŠŠäæ››ëíí=ÄîÔ†}‹Ëå¾xñ¢¹¹™Ëå.\¸ìtˆG¾Èeccããã#‰>ÿüs­üÒ¡…ª™Ÿ{u–´Ý1”Ýäççççç§ôâš>ú@P¨P*… 0IñßµµÏË—/ÉNA*]Þ/ˆÌButtôññ‹ÅêïEQ>Ÿoee¥þ®%ÙÙÙIžÇ¯!ÈÚ/b±øåË—ŠŸâ;&LpttTCGD!óÌ$UUU=zt×®]d'þ£¯¯Édæç瓈&ÒÑï¨?ž6mÙY€¿Ð××'åã%èn¡~ôÑGdgú³²²ÂGÌ’t´PŸø÷…C¾Ô¦bt¢Pá/uÁ‰„(T8Ë—ºlllþüóO²³ ŸNêï¿ÿ>eʲ³JBQîp¡ÍR¿}ûöÁƒÓ¦MƒC¾”foo_[[‹íD=Ö §Å¯U>tqq155566¦Ñh?üðÙIA8sæ Ç«««kooooo÷ööNOO';)rhó;êßÿþw33³çÏŸ#RSS3|øp²3ƒÓÒÒríÚµöövAôõõçÎKvF¤Ñæï¨Ã‡755Å[[[óx TË uÖ¬Y‚ØØØ8p€ì\€2þë¿þkΜ9‚Œ1bäÈ‘d§C-/Ô 1™Ì1cÆ PRzzº­­í¨Q£ÈN„L9˜TWWwéÒ%²RQ@`hh8a„Ç“Ëûøø 1NOOÏÏ?ÿL¹ÓܧL™òúõkªïÄ?üð³Ï>SraT‚¡‰">}²Ó§O“½ºËÐÐPé÷—wT±Xìêêš’’BÖšièt:!ÃÆcAàFiêwñâÅÈÈH¥×òï¨h(T(  иB•vö‰.Ÿ•¢}`/–Æ*š@Ó^2]¨t:}ùòå¨Ä57(ŠKC›„ÇIDATzzzÊ]1U¯ygggjjê²eËfÏžíääzûöm•ö¨Å4v/+Ø`iÚqeÞQ¯]»†?½zõª‰‰ q)))22²­­íàÁƒ·nÝ*,,\ºt©Î^EÍÜˈ'¦Rʪ¿¿VVþ”ÇãùûûãOû½¶aOñ¿øÔúúúððpggçyóæ………½zõ _$++ëÓO?uvvÞµk—H$ê×{___FFƒÁprrŠ‹‹ …XûÝ»w#""ìíí‡ 6f̃‘-{‘H”˜˜èìììââ’ç6à*ȈC§Óóòò ÆìÙ³}}}kjj°v±Xœ––æêê:þüœœÙA4fîe¹‰Ië‘N§Ø£ŒvüÁ€;·§§ç»ï¾Ãþy²²²TýQB™B]´hQkk+66Ü;wÚÚÚ-Z${ìƒDyy9þ‰"<<ÜÇÇçÊ•+ÅÅÅ4mÿþýøÌ·nÝÊÏÏ/((xöìÙ‘#Gú…:~üø;w²²².\¸ÐÛÛ›––†µüñÇ;vì¸ÿ~ww·‚‹dffÖÕÕäææ–””È]qiq¹qãFvvöõë×,X€5òx¼{÷îñx¼¢¢"üfG2‚hÍÜËrS¢GÙ™ RvîáÇ››› òòòÔð%K™BÕ××g³ÙØ«Çc³ÙJŒš{úôé9sæ`—Œ†††JÖILL F£ÑhÑÑÑ¿üòK¿O:µ}ûv[[[33³ÈÈÈË—/cí»wïž0aBbb¢““Ó’%KRRR:;;e/RXXˆõeii¹mÛ6¹9K‹ƒ H\\œ‰‰ ›ÍÆÇ¡=sæLll¬™™ÙÖ­[åÑ(š¹—å&¦D²3A¤ìÜsçÎmݺ[ß¹ª£ä‡:þ|UU•rW=~üxß¾}•••øõûø¤ñãÇcìììA¿›››ÝÝÝñ§ø‚¦¦¦!!!!!!(Š>}úôèÑ£ÑÑÑ”±ˆ@ ìKnÎÒâ ‚]3‰ ˆ±±1þ–Îçóß +#ˆ¦ÑÀ½,71%z” "eç¶´´ØÚÚö‹ :Jª‘‘‘¯¯olllhhh¿K:°{`ƒ‰½xño×ÓÓ“œ-***888%%eÔ¨QÎÎÎø¤ÆÆFl «ÆÆFÖ¯kkk댌 i¹éééMž<9::ú‹/¾½FÃûjhh» r»îÇÊʪ¡¡aòäɃÊ_shì^–‘˜=ÊÎD ‹¦¦&l4‚ÆÆF—Ršò/çk×®}ðàä÷xÌ´iÓŽ=* ›ššðô‚˜››×ÖÖâO…B¡©©©‰‰IssóÎ;%#p¹\@ ¸\îÒ¥KûÅg2™ñññµµµ"‘¨ºº:** kçp8/^|ùòeoooSSÓ¾}ûfΜ){777¼¯ääd¹« -Ž4žžž»víjlllooçr¹Ê!—¦íe¹‰)Ñ£ìL¤‘üçÙ½{·‚K)øÏ]ß~û-öµÛßßßÉÉ oðóóÃŽ%$$ìÛ·ÏÑÑÑßßöìÙ’W­ZåååeggØ/>‹Åúì³ÏÂÂÂæÎíææ†µ_¸pÁÃÃcîܹk×®544LJJ’½HPPÐøñã½¼¼V­Z5þ|¹« -Ž4gÆŒl6{É’%VVVÊÑLdíe¹”èQv&ÒYYYaÿ<3gÎ44Tí8.ÔÛÛ»­­Mg/s£Óéšö37ŽN§çææz{{1N^^“ÉÔØÕTi;—^UUZTT$cì27TÙÑy5÷HŽËå¾xñ¢¹¹™Ëå.\¸P¥}i󸾨”H$úüóÏ7mÚ¤Ò¾ PÿC?êi;w(;ÝÏÏÏÏÏOéÅ>ú@P¨P*… @¡@9êk``péÒ%M„`9÷ÅÀÀѼqFt¶ñ•ó—3“jkkûí7"RÒ'Nœ`±XdgA 77·¡ß7½««ëüùób±˜¬ÔÒûÔÒÒò“O>QnYm¾ã8“ÉÌÍÍ%; @$ݧð €B€ P (T(  €B€ P (T(  €B€ P (T(  €B€ P (T(  €B€ P (T(  €B€ P (T(  €B€ P (T(  €B€ P (T(  €B€ P (T(  €B€ P C² ^kkë•+WiooÏÏÏ9r¤››ÙI!}ª‡¢(Ù9¬¼¼ÜÉÉ©££{jgg÷üùsrSCûT ?úÒét[[[챞žÞªU«ÈÍ ìS-,TA–/_®§§‡ ˆ¥¥åÆÉN@Ç÷©vêúõë­¬¬±°°˜8q"Ùéèø>ÕÎB}ÿý÷i4šÙ¹bèø>ÕÎBE„ÉdŽ1‚Íf“ Œ.ïSbŽú†††VVV=zzz=z4kÖ,²éoݺu+W®$; Â<þ|ãÆ]]]jèKÍûtêÔ©PO_rS¨zzzØW ÃÇ?ù䓼¼<²!L^^“Étuu%;‚ýùçŸeeešóã%a'<|ýõ× ƒ¨hÚ*""‚ìT"%%…ìvñâÅÈÈH²³ø­ýŽ €6B€ P .T:Þïá‘IY€ÁÒèB@’.¿>ªµPŸ={¶eËggçY³fùøø\ºti°ètúòåË%š£(êéé)wêò>¦:N§ÓæÍ›·jÕª}ûö½zõ ŸZ^^.{YÕ'Hõj}}=‡Ã™1cF~~~iiilllQQ‘qŒ¯]»†?½zõª‰‰ qi’•———••ýúë¯ ÝÝÝ+W®lnn&;)ò©¯P:Äb±Ö¬Ycmmmddäàà°wï^lR___FFƒÁprrŠ‹‹ …2âøûûgeeáOy<ž¿¿?þtÀPØk-öjÏ™——Ç`0fÏžíëë[SSƒ5öôô$''»¸¸¸¸¸$''÷ôô`í"‘(11ÑÙÙÙÅÅ%;;rûömooïÙ³g3ŒÓ§Oqœ‰‰ÉÔ©Scbb¼¼¼þû¿ÿkÄwŸX,NKKsuu?~NN"ekõêíÛ·¥]•üøñ;wîdee]¸p¡··7--MFœE‹µ¶¶>xðA;wî´µµ-Z´Hv(ì#Syy¹äg§7ndgg_¿~}Á‚ XãáÇkjjrsssss«ªª233±öÌÌ̺ºº‚‚‚ÜÜÜ’’<ȶmÛoÞ¼yôèѲ²2å¶ aÅŠ¥¥¥ýy<Þ½{÷x<^QQŸÏG¤ìbm¢¾B}ýúµ……Å€“N:µ}ûv[[[33³ÈÈÈË—/ˈ£¯¯Ïf³±7UÇf³õõÿ³ЇЋ‹³±±111a³ÙXã¹sçbbb,-----·mÛvîÜ9¬½°°0&&†F£aíxƒ–––ÖÖVkkë;w*¼1€¢,,,^¿~ݯñÌ™3±±±vvvfff[·n%%15SߘIæææ---ãÇwRss³»»;þT²ðäááqèСóçÏWUUõ;mZñPãÆÃwwwc%3´³³Øc@ ÙŽ9pà@zzú?ü0zô蘘gggÙ™ƒÁjii3fL¿F>Ÿ/¹tú ÕÑѱ¨¨( àÝIÖÖÖ666 †222òõõ 522R$68€\“&MB¤¡¡F£aí4M²ŸêÔ©û÷ïGQôúõëqqqW¯^Up€‚NŸ>=wîÜ~VVV “'O–lTpS”ú>únذ᧟~:vìŸÏïéé)//Ç&1™ÌøøøÚÚZ‘HT]]%7ÚÚµkŸÏOJJ¿T»¹¹q¹\@ ’““ñù·nÝúôéÓÞÞ^D@q]]]•••ÉÉÉÿüç?CBBúMõôôܵkWccc{{;—ËÅÜÅ¥¾wT{{{‡}Vìêêš2e ‡ÃÁ&±X,}}ý°°°¦¦&{{ûM›6)Ý‹´P~~~²6íÝ»—Éd"Â`0ñöääd///CCC6›Þøì³ÏÂÂÂþøã‰'~ÿý÷J§ pt:]OOÏÄÄÄÎÎÎÉÉ)??ÿ½÷Þë7‡Ã …l6[(®[·kTpSa×£îÙ³.s“+""bôèÑÚw=ªöÕv™›æ\ ŸÖ (T(  €B€ P (T(  섇ÒÒRü®x@šÆÆÆÑ£G“ñN:Ev {üø1Ù)üJ„OµŠˆˆ d›kˆ’’²7ªJØÙÙ‘½uÿC od ´“ÉÌÍÍ%; ÀwT(  €B€ P (T(  €B€ P (T(  €B€ P (T(  €B€ P (T(  €B€ P (T(  €B€ P (T(  €B€ P (T(  €B€ P (T(  €B€ P (T(  €B€ P =EÉÎ9=z´zõjƒÖÖÖ÷Þ{o̘1ÅÅÅd'¥V†d'€|¶¶¶­­­ÏŸ?GäÙ³gŽŽŽdg¤nðÑPÀ˜1clmm±ÇÆÆÆäæ£~P¨€‚‚‚Œ±´´ôöö&;uƒBÔàíímee… È|0jÔ(²ÓQ7(T@ #FŒ˜4iÒˆ#BBBÈÎ…P¨€2Ö¯_¯¯¯¿téR²!ü<£%&L˜P__Ov€QQQ\.W²~žÑõõõ«W¯ž1cÙ‰€¡ÊÉÉ©««ë×…ª=¦OŸîêêJv`¨.^¼øn#|G€ P (T( N§“Â>|¸lÙ2ÍÌM.(T BU{÷îݲeKyy9Ù‰(Žúê–gÏž8pàÎ;oß¾ýÛßþæïï¯ÒÅJWNWdYü…ÀÜÜÜÁÁaëÖ­öööÒf®ªªZ°`rùÞQuH}}=‡Ã™1cF~~~iiilllQQÙI Uyyyyyù/¿ü2uêÔo¾ùFÆœFFFjKŒXP¨:äСC,kÍš5ÖÖÖFFF{÷îÅ&õôô$''»¸¸¸¸¸$''÷ôôÈn§ÓéÇŽ[´h‘ƒƒ‚ "‘(11ÑÙÙÙÅÅ%;;ïÇ£Óéyyy cöìÙ¾¾¾555X{}}}xx¸³³ó¼yóÂÂÂ^½z…/E§ÓñÅûúú222 †““S\\œP(ì·jæææçÉ“'ÒfîSZÀ~ë%c¶WG,§¥¥¹ººÎŸ??''GÁä…ªCnß¾íææ6à¤Ã‡×ÔÔäæææææVUUeffÊnGäîÝ»'Nœ(++C$33³®®®   77·¤¤dÀ.nܸ‘}ýúõ $$$`ááá>>>W®\)..¦Ñhû÷ïGþý{«Äf;~üø;w²²².\¸ÐÛÛ›––Ö/x[[[vvößþö7i3÷‹)# äzɘmÀÕáñx÷îÝãñxEEE|>_Áä…ªC^¿~maa1à¤sçÎÅÄÄXZZZZZnÛ¶íܹs²Û‰‰‰¡ÑhØãÂÂBì)6Û€]ÄÅÅÙØØ˜˜˜°Ù슊 ¬ñôéÓsæÌ>|¸©©ihh¨´"?uêÔöíÛmmmÍÌÌ"##/_¾ŒOÂÞ$ öìÙ#{fEJ®—ŒÙ\3gÎÄÆÆÚÙÙ™™™mݺUnÅÁÁ$bnnÞÒÒ2~üøw'I¶ÛÙÙ Ùí‚X[[ãälö>nÜ8ì±±qww7öøñãÇûöí«¬¬looGD_àwŽææfwwwü©älååå(Š666nß¾½²²ÒÆÆFÆÌŠ”\/³ ¸:|>ÿÝÕW$¹ Puˆ££cQQQ@@À»“,,,'Mš„ HCCþ–"­A===ü1F“œMñ”¢¢¢‚ƒƒSRRFÕÑÑáììünpA¬­­322lll ¢§§ggg—””Äb±æÎ+{f¹%»V$”$++«†††É“'+ž¼‚࣯Ù°aÃO?ýtìØ1>ŸßÓÓS^^ŽMrssKJJâóù|>?)) ÿ*+­½777.—+Arr²â) …BSSS“æææ;wâíæææµµµøS&“_[[+‰ª««£¢¢Þ emm=kÖ¬óçÏ+2³"ó(>ÎÓÓs×®]íííøujƒ 2 xGÕ!ööö<ïÀééé]]]S¦Láp8ؤ   ½{÷2™LA >z˜´ö~‚‚‚’““½¼¼ Ùlvii©‚)%$$p¹Üˆˆ 6›àçç×ÑÑûa±XúúúaaaMMMööö›6m0ÚŠ+RSSþùg¹3+PÁÙpG(²Ùl¡P¸nÝ:å‚ .×zzz{öìa0d'†*""bôèÑyyy’ðÑ €B€ P (T(  €B€ P øUKèéé}øá‡cÇŽ%;0TÕÕÕŸþy¿ßQáÌ$->¨“lƲ³³{÷vuðŽ ÀwT(  €B€ P €ÿ09vV­¢WöIEND®B`‚cf-python-1.3.2/docs/source/images/inheritance2.png0000600000175000017500000002567112611506114022402 0ustar daviddavid00000000000000‰PNG  IHDRY»Vë‹çbKGDÿÿÿ ½§“ IDATxœíÝy\wþ?ð‡-Þ ‚PW]¥¶qÕj-tÅ®+JKT@9ªX}l-Å TêÖ®‹ø]´ºÖEA¡JQn¬xâÕoq‹ˆÝj‹ ˆ‚V«\J~øKÖ@ &ÇëùxäñL2óžù|2¾2ŸÉŒX,ƒˆˆˆˆTÊP興ˆˆtC‘0d©C‘ ]‘PÒÒÒ°eË¡ËÐh¦¦¦øòË/ñÊ+¯] ‘ÖaÈ""½•’’‚‚‚ØÛÛ ]ŠÆÊÎΆŸŸCQ0d‘^³··Gtt´Ðeh,‘H$t DZ‹çd©C‘0d©C‘–Pt~ÏŸ"Ò, YDDb0"Ò] YDD ”””`üøñ¨­­•;ýÑ£GpwwGUUU«ç]PPÐÞòˆHC1d)пŒ1YYYr§§¤¤`ذaèÚµkWFDšŒ!‹ˆH ³gÏÆŽ;ÐÐÐ ó|}}=víÚ…ÀÀ@””” 44ŽŽŽ;v,BBBPYY)}­H$ÂŽ;0a 6Lúœ„¢÷ÀöíÛ1nÜ88::âÿøêëëåÖÛÐЀ-[¶ÀÙÙˆˆˆ@uuµª6)!‹ˆH C‡… Ž9"óüþýû!‰Ð¿„††ÂËË GENN,,,°aÙ×_¸pIII¸téR“e(óþÓ§O#55¸~ý:âââäÖ›˜˜ˆóçÏcûöí8pàž>}ŠM›6µs+Qk0d)iöìÙˆ—y¾BPP ==£G†‰‰ ÌÍͱ`ÁäææÊ¼>,, rçßš÷[XX`éҥػw¯Üy¥¥¥aÅŠèׯºvíŠE‹5 ˆD¤^¼­‘’Þxã âܹs=z4Nž<‰îÝ»K‡ü ±~ýzüøãÒ“à e¿ËZYY5;eÞocc#ý·­­-***äΫ¬¬ ®®®2Ï5ž©?qDD­ðâѬ„„éQ,X¼x1Þÿ}ìß¿ùùùÈÍÍmr—A³óVæý¥¥¥2ÿn••:„‚‚é#??¿ÕëKDmÇEDÔ NNN¸sçöîÝ‹ÊÊJ8::J§UWWÃÜÜfff(++ÃgŸ}Öªy+óþµk×¢¢¢X»v-Þ}÷]¹óòôôÄÊ•+QTT„úúz\»v ‹/nÝÊQ»0dµ‚>øàDDD 00PfÚªU«°~ýzŒ3AAA5jT«æ­ÌûÇŒƒ3fÀÍÍ ¶¶¶˜3gŽÜyy{{cüøñ Á›o¾‰¥K—ÂÅÅ¥UõQûˆÅb±ÐE ÁÃÃ>Dtt´Ð¥h,‘H„äädxxx] ‘Öá‘,""""5`È""""R†,""""5`È""""R†,""""5`È""""R†,""""5འ‰H¯•––"--Mè2ˆH1d‘Þ²µµEjjj«o£OŒŒŒÐ¯_?¡Ë ÒJ¼â;éµêêj¤¦¦"++ }ûöÅ|€‘#G¶{¾Ïž=Ü9s0mÚ´fï/¨ óçχ“““J¯Èþ믿"==ÇŽCß¾}áçç§’mB¤o²ˆH/åææ")) ¿ýö\]]áêê SSS•Ì»¾¾˜5k&Nœ¨’y6G,#44üã1kÖ,•Ï¿¤¤»wïÆ™3g`oo??? 4HåË!ÒE YD¤7îܹƒ¯¾ú §NÂ[o½___•…udÀ’PwÐ’(,,ÄÎ;qùòeüå/ÁÌ™3aaa¡¶åi;†,"Òiê”§¾¾AAAðóóë°€%ÑQA x>zúôi$%%áÎ;˜:u*¦M›†—_~Y­Ë%Ò6 YD¤“Ô9(K¢#ƒ–DMM rrr––†gÏžÁÓÓ“&MB§N:dùDšŒ!‹ˆtFG Ê£ KB,ã“O>Áˆ#:,hITVVbï޽ؿ?ºwï___888ÀÀÀ Cë Ò YD¤Õ:r8P!ÎÁRDÈ %qóæMdddàĉ°³³CPP† "H-DBaÈ""­ÔÑÃòhbÀ’Є %QXXˆÔÔT\¸po¿ý6üýýÑ·o_Ak"ê YD¤5ÊËË‘ ôññ µhrÀ’Ф  8uê222PTTÌœ9]ºtº4"µ`È""VWW‡={ö`×®]‚ Ê£ KBÓ‚–Dmm->ŒììlŽŽŽB—EzŽ!‹ˆTF‡åч€%!‹‚Q£Fi}Ð’(..Frr2N:…?þñðññÁàÁƒ….‹ôCµ‹6Ê£OKBƒ–Daa!vî܉˗/ã/ù ¼¼¼`ii)tY¤'²ˆ¨Mrss‘˜˜ˆû÷ïcÆŒZ7(>, ]ZÀóæOŸ>¤¤$\¿~nnn¼¥©C)MW†å‘,___8;; ]Ž té­–ÔÔÔ ''©©©xüø1¼¼¼0uêTtêÔIèÒHÇ0dQ‹tm8P¬ÿÑ— %QYY‰½{÷";;/½ô|}}yKR†,"’K‡åyúô)°^ ëC‡Í¹qã233qôèQ 0>|¸Ðe‘cÈ"")]”‡«yú´$ ‘ššŠ .`Ô¨Qð÷÷Ç€„.‹´ C‘žÓ‡á@y°Ó÷  8uêÒÓÓqýúuŒ?>>>èÝ»·Ð¥‘`È"ÒSú2(–ò$Aë7Þ€¯¯¯Ð媶¶‡ÆÞ½{ñðáC¼û>}:^zé%¡K# ÅE¤Gôm8P¬ÖcÐjêÁƒøæ›o““ƒN:ÁÍÍ·ô¡&²ˆtœ¾ÊÀÕv ZÍ+--Ezz:Ž;†ßýîw˜1coéC²ˆtV^^bccõr8P¬öcÐRLrÂ|^^FŽ ___üþ÷¿º,C‘áp | XªÃ ¥É ó©©©¸zõ*&MšÄ[úè!†,"-ÇáÀ–=}úAAAðññaÀR­Ö©««Ã¡C‡‘‘ÊÊJ¸»»ÃÝÝæææB—FjÆE¤¥¾÷Þ{033º,€¥> ZmSUU…¬¬,dggÃØØ3gÎĤI“xKÅE¤E8¨<,õcÐjŸ²²2¤¦¦âرc°²²‚¯¯/xKÂE¤á8Øz<«ã0h©Æÿû_ìÞ½¹¹¹5jagg'tYÔN YDŠÃm# X>>>˜4i’Ðåè±XŒ?þ£GfÐR¼¼<ìØ±—/_ÆÄ‰1kÖ,XYY ]µC‘©¨¨@||¼t8ÐÛÛ¶¶¶B—¥5°„à¥zÏž=ÃñãÇñõ×_ãÎ;pssƒ——ºví*ti¤$†,"q8P5$ç`y{{3` „AK}ª««‘””444ÀËË S¦LAçÎ….ZÀE$ª–æ`ÐR¿û÷ï#-- ß|ó z÷îiÓ¦ÁÅÅFFFB—F0du ª–æaÐê87nÜÀ®]»““ƒ×_·ôÑ0 YDjÆá@õaÀÒ\ Z¯°°;wîD^^àçç‡Aƒ ]–^cÈ"R“‹/bëÖ­T,ÍÇ % É-}vî܉k×®aÊ”)˜9s&,,,„.Mï0d©d8ðäÉ“pppàp  UVVâÑ£Gxå•W°´ˆ¼ •ŸŸ{{{+Ó555ÈÉÉARRªªªàééÉ[út †,¢vª¯¯GVV’’’`eeooo¼õÖ[044º42sæLœ8qGÅš5k°´ˆ$h3wîÜÁÊ•+qðàAž;ÔÁÌh€ÂÂB¤¦¦â»ï¾ÃèÑ£„!C†xŽmllð׿þË—/¸RíÃE$GFF>úè#”••aÀ€ؼy³ô"€pvvæ5i:Hee%ìííqóæM€,,,°`Á,[¶LàêHb±cǎŵkפ! Ƈ'NWÉœ0ŸššŠüü|Lž<ÖÖÖ˜?>àÍ7ßDVV^~ùe+Õ YD¬X±[·nÅÝ»w/¿ü2,X€Å‹£GW§æÍ›‡­[·ÂØØ666˜>}:–/_Î[‹h¡K—.aÑ¢EÈÏÏGEEz÷î#GŽð$x ôäÉìÙ³«W¯Faa!ÀÈȃ Â0pà@+Ô YDÿ_}}=fΜ‰#GŽàáÇ2Óþô§?áÛo¿¨2ýõèÑ#ØÚÚ¢oß¾puuExx8zöì)tYÔNùùùXºt).^¼‘H„£G ]ÉñÛo¿A$¡¸¸XæykkkÄÄÄÀÕÕU˜Â´‰˜tVÿþýÅøè Çâŋٞzô`{ó¡IuôÇo¿ýVÜ·o_ñÀÅÝ»w|5ý!¯ ŒA:«¤¤~~~>|¸Ð¥è¼¯¾úªÉ·=Uc{j¶7iuõÇ?ýéO¸}û6ÀÃÃ?ýôüýýU¾]Ð\0dé8{{{Lœ8Qè2tÞ¡C‡:d9lOÍÀö&MÒQý±oß¾ìÍh® xµD""""5`È""""R†,""""5`È"$‰„. ÛlRûŠbÜFª¥h{ µ½²HãqgD¤½øù¥¶Ò…¾Ã_’ŒëׯcãÆ8þ<ž„G²Hª¤¤>|8RSSqæÌ,[¶ º4ju·§©©i“«à?~fff*™?µ?¿Í“ü‡ýÃ? %%X²d‰ÐeÑ $m¤+áJ‚!‹¤6oÞ oooøûûÃÊÊ ;wưaðnÝ:ékêêê'''899!** uuuJO‰Dرc&L˜€aÆx~;›Õ«WÃÑÑNNNˆ—©«ñyA)))pvvƨQ£àãミþY:½¤¤¡¡¡pttÄØ±c‚ÊÊJ™ùˆD"™y644`Ë–-pvv†ƒƒ"""P]]­ŠM*(eÚ³=ë„íÛ·Ë<·mÛ6É<§h-µœ={5jœ‘žž.&ïpãþÒ¸¿és{ëûç×ÐÐøðÃ¥÷ãSv½kÍz)ÚF-õq}ÖÖvV´½;CI={...-¾fëÖ­øù矑œœŒääd\½z±±±JO€ . )) —.]ÄÆÆ¢¸¸HNNFnnn‹5œÅ¦M›”ØbšM™ölϺO˜0÷ïßÇ?ü8þ<>|ˆ &´j-µ„‡‡cΜ98uê¤ýFYû›>··¾~pïÞ=ÄÆÆÊü®Ìz+ÒÒz)ÚFííãú 5íÜÚ>©N Y$õàÁôéÓ§Å×ìÛ·aaa°´´„¥¥%ÂÃñoß>¥§@XX,,,¤gggKŸ“¼§%°¶¶†™™påÊé´ôôtŒ=&&&077Ç‚ ~ÀÒÒÒ°bÅ ôë×]»vÅ¢E‹päÈ‘ߣ ”iÏö¬»¡¡!¤G³¶mÛ†€€ÊîV-CQ›áîÝ»¸ÿ>¬¬¬ðÙgŸ)» 4íoúÜÞúúù•ý²··Çøñã‘––†åË—·j½ii½m£ööq] i£ÆG*%Zó¹mmŸT'žøNRÝ»wÇÝ»waccÓìkO·µµEEE…ÒÓÀÊÊJæïŠŠŠ&ïiIïÞ½¥ÿ655Emm­ôïÂÂB¬_¿?þø#ªªª Éú•••5¹›¼¢÷heÚ³½ëþþûïcóæÍØ¿?®^½Š7¶zŠÚlãÆˆ‰‰Á¿ÿýotëÖ aaapttTºÆÆýMŸÛ[_?¿/ùª¬¬Dbb"Ö¬Yƒ¸¸8Ê­·"-­—¢mÔÞ>® ‡ÕšÏmkû¤:1d‘Ô˜1cpðàAÌž=»Ù×ôéÓ¥¥¥4hàæÍ›2ßjM ók4°°°hòž¶Z¼x1>üðCDGG£K—.xôè‘ÌΪñ²çÿilÙ²ÖÖÖm^®&R¦=Û»î;w†–-[†  sçέ^†¢6:t(6lرXŒï¿ÿ8~ü8ÀÄÄ555055Ü»w¯Éü·¹>·7?¿@=„qãÆIŸS´ÞÊô³–(ÚF-õqz®5í¬Ê>Ù^ÚÿõTfþüùøú믱cÇ”——£®® •¾ÆÅÅkÖ¬Ayy9ÊË˱fÍ™ó@M—ÇÅÅk×®EEE***Õæu¨®®†¹¹9ÌÌÌPVVÖä°{÷îÝQTT$󜧧'V®\‰¢¢"Ô××ãÚµkX¼xq›kÐÊ´§*Öýƒ>À?üÐä„we—¡¨Í–,Y‚_~ùOŸ> ûíõµ×^CBBª««qëÖ-™ó`š£ÏíÍÏïóaÕøøxØÙÙɬCKëÝ–~ö"EÛ¨¥>Nϵ¦UÙ'Û‹G²Hªÿþضm›ôÐuMM ììì(}Mpp0Ö­[OOO€³³3æÌ™£ôty‚ƒƒ777# gΜiÓ:¬Zµ k×®ÅÂ… ѧO ''G:}öìÙðõõÅ£G¤‡§½½½ahhˆܺu ýû÷ÇG}Ô¦åkeÚ³#Ö]Ñ2µÙøñã‚Û·ocàÀˆŒŒ”NûôÓO±råJÄÅÅ¡W¯^ Rx@ŸÛ[_?¿/žãÓ­[7Œ1kÖ¬Qz½ÛÒÏ^¤hµÔÇé¹Ö|nUÙ'ÛË@,‹Y2©þùÏÂÙÙYèRtÞÂ… Ñ­[7¤¤¤¨mlOÍÁö&MÒýÑÃÃ>Dtt´Ú–¡Íšk“$"""R†,""""5`È""""R†,""""5`È""""R†,""""5`È""""R^'K‡`ðàÁèÕ«—Ð¥è¼k×®áwÞQûu“ØžšíMš¤#ú£‡‡Ž;†Áƒ«mÚ¬¹6àßuXhh¨ ÷lzöì.^¼ˆ!C† [·n¶\É-1D"‘Ü{œ©“­­-<<<Ôº ¡Ú“šb{“&éˆþ8cÆ µÎ¿µ=zèÒ¥‹À•<×\ðH©Tqq1æÎ‹•+Wâ­·Þêðå8p›7oFll,úöíÛáË'""õKMM yá¯1ž“E*süøqÌ›7Û·o$`ÀäÉ“±nÝ:Ìš5 çÏŸ¤"""€Ã…¤"ÿú׿ðŸÿü™™™055´–Áƒ#==ÁÁÁpvvF@@€ õ‘~â‘,j—úúzÌ›7Ož<Á¶mÛX]ºtARRÊËË1oÞ<Ô×× ]é†,j³ŠŠ ¸»»ÃÕÕK—.íð“Í100ÀÒ¥Káââ‚iÓ¦¡¢¢Bè’ˆˆH0dQ›\¼x>>>ˆŽŽ†‹‹‹Ðå´ÈÕÕ«W¯†¯¯/ „.‡ˆˆôCµZff&>ÿüs$''cÈ!B—£‘H„Ý»wcåÊ•HKKº""Ò Y¤´††„……áܹsHKKCÏž=….©Uzöì‰ÔÔTäåå!,, B—DDD:Œ!‹”òøñcÌš5 ¿ÿýï ###¡Kj###DFFbøðáðððÀƒ„.‰ˆˆtC)T\\ wwwÌŸ?³gϺ•ðòòŠ+àáá+W®]é †,j‘&\`T]†ޤ¤$,[¶ YYYB—CDD:†!‹šµiÓ&ìܹ™™™èׯŸÐå¨EïÞ½‘––†³gÏò<-""R)†,jBrÑÇkÔFÕÅØØ‘‘‘øÃþ///TUU ]é†,’¡éU'___„……aúôéøïÿ+t9DD¤å²HêòåËÀ?ÿùO¿À¨ºŒ1 X¸p!>,t9DD¤Å²Àó ŒFDD 11vvvB—#(kkkddd ##QQQ‹ÅB—DDDZˆ!KÏiûFÕÅÄÄ111èÑ£üýýñäÉ¡K"""-Ã¥Çtå£êŒàà`¸»»£¸¸XèrˆˆH‹0dé)]¼À¨º8::"..óçÏDZcÇ„.‡ˆˆ´C–:qâ„Î^`T]lll‘‘¤¤$DEE ]i†,=§óUSSSÄÅÅ¡G DuuµÐ%‘cÈÒ’ Œþú믈‹‹Óù ŒªSpp0àîîŽ7n]i(†,= ÏU—qãÆaÓ¦M˜3gNŸ>-t9DD¤²tÜåË—áããƒÈÈH½½À¨º 4éééøòË/'t9DD¤a²tXff&V¬XäädüáºdnnŽ;wâ×_żyóPWW'tIDD¤!²tX,æF;–.]Š÷ßÓ¦MÃ;w„.‰ˆˆ4C–Žyòä üüü0hÐ DFFÂØØXè’ôÆäÉ“±nÝ:øûûãܹsB—CDDcÈÒ!ÅÅÅpssüyó0gΡËÑKƒFZZÖ¯_„„¡Ë!""1déÉF·mÛ¡ËÑk]ºtARRÊËË1oÞ<Ô×× ] €!KlÛ¶MzQ¡Ë!üï<­wß}Ó¦MCEE…Ð%QcÈÒb’ ŒÞ»wÕPï½÷þïÿþ¾¾¾ÈË˺""ê@ YZêîÝ»pwwÇ{ï½Ç Œj8;;;ìÞ½«W¯FjjªÐåQaÈÒB………ðööÆ?þñ¼ûî»B—CJèÙ³'RSSqñâE„‡‡£¡¡Aè’ˆˆHͲ´LVV–/_ŽäädˆD"¡Ë¡V022Bdd$ìííááá]©/¢¤%Äb1ÂÃÃa``€´´4^ÿJ‹yyyáÕW_…‡‡Ö¯_×_]è’ˆˆH x$K |(tIDD¤"wÒPÛ¶mñcÇ––†—_~YèrHÍ|||0tèP̘17nÄ«¯¾*tIDDÔN<’¥a^¼Àhbb"–1b¾úê+,\¸‡º""j'†,  Œ’••222‘‘¨¨(ˆÅb¡K""¢6bȈX,–ùU/0J&&&ˆ‰‰A=àïï'Ožx~”óĉÂGD$ €€XZZâã?ÆÇ KKK ]V³²òå—_Â××6l^`t÷îݼÀ(IcîܹpwwÇõë×1sæLL›6 ¿üò‹Ð¥ ÂÇǵµµ¸}û6nß¾ÚÚZøøø]V³ ÄèpwïÞÅÈ‘#qóæMôîÝNNNHLL„‰‰‰Ð¥‘***ÂܹsqîÜ9TUUá7ÞÀÙ³g9œLDz§¡¡vvvøù矃 ÂÕ«Wah¨™ÇŒ4³*7{öl”––îÝ»‡sçÎIÿ&jì§Ÿ~B~~>ªªª¤oݺUઈˆ:ž¡¡!FŽ)ý{ôèѰ†¬wúôiœ9sFæ„æªª*lÚ´IÀªH“-Y²EÙ»ó bIDATuuuÒ¿«ªª°víZ^S‹ˆôÒ'Ÿ|‚ž={¢W¯^ ºœq¸°Õ××cøðá¸rå zôèW^yS§NÅܹsaee%ty¤Áòòò°nÝ:œ;wwîÜÁãÇáææ†ôôt¡K#"êPb±vvvžÙ×äS'š„¬ââb^£GMŽ=Šììl¼ú꫘8q"  tIjajj ///tîÜYm˨««ÃîÝ»QSS£¶eh¢§OŸ"??'Nœ@II -Z„W^yEè²ôÎĉñ»ßýNè2ˆ:Œ¦eƒ;wÂÀÀ¾¾¾B—"%w¿ nÄËËK €>ÚõHOOoܵT*==]ðuäC3gÎTkÿ&Ò4ÌmÛ/4¹­Î³gÏ0qâDDGG7žD¤‘H„§OŸªu’ù¨u9D-\¸Píý›HÓ0´¬¹ýO|'"""R†,""""5`È""""R­ YúxË}\gÒ/ìãDÔEûMßh|Èjnjú†U}\玦ÉÛX“kS}XG"}'Äç\¨}‹ÊBV||<ìíí¯ªYhþ×cêþUÙõë×ñÉ'ŸÀÑÑ#FŒ€———à×Qå:ëÛf"‘"‘Æ ÃØ±c1cÆ ¬_¿•••2¯Óä_+ªº6öq"R'É~÷Å ¾ýlKŸye—©êý†JBVCC’““±téR¤¤¤ ¡¡A³LII 1|øp¤¦¦âÌ™3X¶l<(tiÔ¸téŽ;†U«V¡¶¶Ó§OGYY™Ð¥u8öq"ê2}£’•››‹®]»ÂÛÛÝ»wÇÉ“'e¦ËK†’ç>ÿüsdeeÉLËÌÌÄçŸÞì{?_RR‚ÐÐP8::bìØ± ‘9B!‰°cÇL˜0Æ ƒ¿¿?8 3¿Û·oãwÞÁo¿ý†Í›7ÃÛÛþþþ°²²BçÎ1lØ0¬[·Núúºº:DEEÁÉÉ NNNˆŠŠ’¹¿œ¢ékžßvgõêÕptt„““S“£‚/®³H$BJJ œ1jÔ(øøøHïJ®h›Hæóâ7 àyXÞ²e œáàà€ˆˆTWWËÝþÚÌÌÌ C‡EXXÜÜÜð¯ýK:­ñ6NNNƤI“0bĸ¹¹áâŋسgÞ{ï=év¿~ýºô=ж¡¢v;{ö,<<<0jÔ(8;;ËÜ6çÅÚ”é_--‡}\·û8‘&këgRÑþCÙe6·Ÿmn¿Ñ* Y»w·7ÀËË »víRú½aaaÈÊÊ¡C‡Äž={®ô}ªó7®ž6mΜ9Óìôï¾û±±±8yò$\\\0þ|=z111øþûïáää$³Ý•Ù†-µ[xx8æÌ™ƒS§N!!!AÚ7S¦µ´öqýéãDš¬5ŸÉÖî?šÓÜ~¶¹ýF{´;d•––âòå˘}Z\æ¾}ûKKKXZZ"<<ûöíSzzãš ;;[úœä=-‰ˆˆ€µµ5ÌÌÌ€+W®´j›4–––†+V _¿~èÚµ+-Z„#GŽ´øm×§O“[—2ý«¥å°ëO'’¼s²^ÔšÏdk÷ÍQv?« Ê'™f$''£²²£Fjò|hh¨RóèÕ«\]]ƒE‹¡W¯^­ª¡°°ëׯÇ?þˆªª*€¡¡l~´²²’ù;88ë֭äI“°yófÁÔÔн{wܽ{666Í.³ñt[[[TTT(=]^MMÞÓ’Þ½{KÿmjjŠÚÚZéßÊl“ÆÊÊÊàêê*óœ¢÷h»»wï¢GÍN1ˆHúGKÛ]™mØÒû7n܈˜˜üûßÿF·nÝGGG¹u+ê_--‡}üt½ IÑ¡Ö|&[»ÿh޲ûYUh×Þ¥¶¶{öìÁ¡C‡dNl;xð ²²²¤;DÔÔÔHßwïÞ=™ùüôÓOÈÌÌÄ_|;vàÆ­ªcñâÅxÿý÷±ÿ~äçç#77·ÉÉ÷2;99¡S§Nøâ‹/ðÃ?`ÆŒÒicÆŒQxpŸ>}PZZ*ýûæÍ›2ߨM—W“……E“÷´•¢mÒxÙÀóÿ·e~~~›kÐéééxóÍ7U6¿önáC‡bÆ øî»ï°dÉDDDÈ}2ý«%ìãúÓlj4Yk>“ªÚ´´Ÿ•·ßhv…¬ƒbذa°¶¶–y¾_¿~xýõ×¥;ñ×^{ ¨®®Æ­[·dΫ¨®®Fxx8¢¢¢ðç?ÿX´h‘Ì7VEª««ann333”••)uèÏÀÀÁÁÁˆÇܹsÑ©S'é´ùóçã믿Ǝ;P^^Žºº:È™sqqÁš5kP^^Žòòr¬Y³FæEÓåqqqÁÚµkQQQŠŠ DEE)½ S´Mºw¢"™ç<==±råJ¡¾¾×®]ÃâÅ‹Û\ƒ¦ª©©Á?þˆ¨¨(dffâ¯ý«ÊæÝÞm¸dÉüòË/Ò6÷®-ýëEìãºÝlj´Ek>“ªÚ´´Ÿ•·ßhv îÚµ«Ùÿ <==±eËL™2Ÿ~ú)V®\‰¸¸8ôêÕ AAA8~ü8àïÿ;¼½½1räHÏ0ݸqÿûߥ¿0TdÕªUX»v-.\ˆ>}ú 999 ßghhˆþýûcÊ”)2Ï÷ïßÛ¶m“R¬©©¥¯‘ 7zzzœ1gÎ¥§ËŒ¨¨(¸¹¹ÁØØ-ž”ÝEÛdöìÙðõõÅ£G¤‡s½½½ahhˆܺu ýû÷ÇG}Ô¦åk"‘H˜™™ÁÖÖHMMEÏž=U¶ŒönÃñãÇ#$$·o߯À)÷umé_/b×Í>N¤mZó™Tfÿ!OÆC–-ígåí7ÚÃ@,‹_|ÂÃÃ>Dttt»g®é>úè#Lž<¹UGH1É¥<<<Ô¶Œ””xzzêåuWHX .D·nÝ’’"t)DFŸ²A[4·_h÷‰ïÚ¨¡¡¸uë&Mš$t9DDD¤ƒô2dÙÛÛÃÚÚëÖ­ã/‹ˆˆˆH-ô2dqˆ‰ˆˆˆÔ‡qˆˆˆˆÔ€!‹ˆˆˆH ²ˆˆˆˆÔ€!‹ˆˆˆH ²ˆˆˆˆÔ É¯ ŒŒpøða¹WM%R–±±z¸jdd@þÕ}‰ÔÍËËKèˆ:³bòö M®ø^TT„¼¼¼+Št‘‘\\\`jjª¶eÔÔÔ`ÿþýxöì™Ú–AÔœ‘#GbàÀB—AÔa˜ “·_h²ˆˆˆˆ¨ýxN‘0d©C‘Hº""""]óÿ•káe]iæIEND®B`‚cf-python-1.3.2/docs/source/class.rst0000600000175000017500000000373612611506114017711 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj .. _class: Classes of the :mod:`cf` module =============================== Field classes ------------- .. autosummary:: :nosignatures: :toctree: classes/ cf.Field cf.FieldList Field component classes ----------------------- .. autosummary:: :nosignatures: :toctree: classes/ cf.AuxiliaryCoordinate cf.CellMeasure cf.CellMethods cf.CoordinateBounds cf.CoordinateReference cf.Data cf.DimensionCoordinate cf.Domain cf.Flags cf.Units Miscellaneous classes --------------------- .. autosummary:: :nosignatures: :toctree: classes/ cf.Datetime cf.Query cf.TimeDuration Base classes ------------ .. autosummary:: :nosignatures: :toctree: classes/ cf.Coordinate cf.Dict cf.Variable .. comment Data component classes ---------------------- .. autosummary:: :nosignatures: :toctree: classes/ cf.Partition cf.PartitionMatrix .. _inheritance_diagrams: Inheritance diagrams -------------------- The classes defined by the `cf` package inherit as follows: ---- .. image:: images/inheritance1.png .. commented out .. inheritance-diagram:: cf.Domain cf.Data cf.Flags cf.Units cf.Datetime cf.TimeDuration cf.Query :parts: 1 ---- .. image:: images/inheritance2.png .. commented out .. inheritance-diagram:: cf.CoordinateBounds cf.AuxiliaryCoordinate cf.DimensionCoordinate cf.FieldList cf.CellMeasure :parts: 1 ---- .. image:: images/inheritance3.png .. commented out .. inheritance-diagram:: cf.CellMethods cf.CoordinateReference :parts: 1 ---- cf-python-1.3.2/docs/source/examples.rst0000644000175000017500000000055712747600703020441 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj Examples ======== Regriding example ----------------- :download:`html link ` :download:`Download ipy nb ` Next example ------------ :download:`html link ` :download:`Download ipy nb ` cf-python-1.3.2/docs/source/installation.rst0000644000175000017500000000311712752572343021323 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj .. highlight:: bash Installation ============ Install by conda ---------------- These two commands will install cf-python, all of its required dependencies and the two optional packages cf-plot (``_) and ESMF (``_):: conda install -c ncas -c scitools cf-python cf-plot conda install -c nesii esmpy To install cf-python and all of its required dependencies alone:: conda install -c ncas -c scitools cf-python To update cf-python, cf-plot and ESMF to the latest versions:: conda update -c ncas -c scitools cf-python cf-plot conda update -c nesii esmpy Dependencies ------------ If not installing with conda, then the dependencies will need to satisfied manually. See ``_ for the current list of dependencies. Install from PyPi with pip --------------------------- :: pip install cf-python Install from source ------------------- Download the cf package from ``_ Unpack the library:: tar zxvf cf-python-1.2.1.tar.gz cd cf-python-1.2.1 To install the cf package to a central location:: python setup.py install To install the cf package locally to the user in a default location:: python setup.py install --user To install the cf package in the of your choice:: python setup.py install --home= Issues ------ Please raise any questions or problems at ``_ cf-python-1.3.2/docs/source/conf.py0000755000175000017500000003066412765460072017400 0ustar daviddavid00000000000000# -*- coding: utf-8 -*- # # Python cf muodule documentation build configuration file, created by # sphinx-quickstart on Wed Aug 3 16:28:25 2011. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented # out serve to show the default. import sys import os import re # If extensions (or modules to document with autodoc) are in another # directory, add these directories to sys.path here. If the directory # is relative to the documentation root, use os.path.abspath to make # it absolute, like shown here. sys.path.insert(0,os.path.abspath('.')) sys.path.insert(0, os.path.abspath('../..')) # -- General configuration ---------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = ['sphinx.ext.autodoc', 'sphinx.ext.autosummary', # 'sphinx.ext.viewcode', 'sphinx.ext.linkcode', 'sphinx.ext.mathjax', 'sphinx.ext.graphviz', 'sphinx.ext.inheritance_diagram', 'sphinx.ext.intersphinx', 'sphinx.ext.doctest', ] # Boolean indicating whether to scan all found documents for # autosummary directives, and to generate stub pages for each # (http://sphinx-doc.org/latest/ext/autosummary.html) autosummary_generate = True # Both the class’ and the __init__ method’s docstring are concatenated # and inserted. autoclass_content = 'both' inheritance_graph_attrs = {'rankdir': "TB", 'clusterrank': 'local'} inheritance_node_attrs = {'style': 'filled'} # This value selects how automatically documented members are sorted # (http://sphinx-doc.org/latest/ext/autodoc.html) autodoc_member_order = 'groupwise' # This value is a list of autodoc directive flags that should be # automatically applied to all autodoc # directives. (http://sphinx-doc.org/latest/ext/autodoc.html) autodoc_default_flags = ['members', 'inherited-members', 'show-inheritance'] intersphinx_cache_limit = 5 # days to keep the cached inventories intersphinx_mapping = { 'sphinx': ('http://sphinx.pocoo.org', None), 'python': ('http://docs.python.org/2.7', None), 'matplotlib': ('http://matplotlib.sourceforge.net', None), 'numpy': ('http://docs.scipy.org/doc/numpy', None), 'scipy': ('http://docs.scipy.org/doc/scipy/reference', None), } # The name of the default domain. Can also be None to disable a # default domain. The default is 'py'. #primary_domain = 'cf' # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates', '../_templates', '../../_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = u'Python cf package' copyright = u'2016, David Hassell' # The version info for the project you're documenting, acts as # replacement for |version| and |release|, also used in various other # places throughout the built documents. def _read(fname): """Returns content of a file. """ fpath = os.path.dirname(__file__) fpath = os.path.join(fpath, fname) with open(fpath, 'r') as file_: return file_.read() def _get_version(): """Returns library version by inspecting __init__.py file. """ return re.search(r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]', _read("../../cf/__init__.py"), re.MULTILINE).group(1) # The full version, including alpha/beta/rc tags. release = _get_version() # The short X.Y version. version = re.findall('^\d+\.\d+', release) # The language for content autogenerated by Sphinx. Refer to # documentation for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today # to some non-false value, then it is used: #today = '' #Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = [] # The reST default role (used for this markup: `text`) to use for all #documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. add_function_parentheses = False # If true, the current module name will be prepended to all # description unit titles (such as .. function::). add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in # the output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. #pygments_style = 'sphinx' # The default language to highlight source code highlight_language = 'python' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # -- Options for HTML output -------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the # documentation for a list of builtin themes. html_theme = 'default' #/home/opt-user/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/Sphinx-1.2.2-py2.7.egg/sphinx/themes # Theme options are theme-specific and customize the look and feel of # a theme further. For a list of options available for each theme, # see the documentation. html_theme_options = {"stickysidebar" : "true", "externalrefs" : "false", 'sidebarbgcolor' : '#F2F2F2', 'sidebartextcolor': '#777777', 'sidebarbgcolor' : '#F2F2F2', 'sidebartextcolor': '#777777', 'sidebarlinkcolor': '#003469', 'relbarbgcolor' : '#5682AD', 'relbartextcolor' : '#ffffff', 'relbarlinkcolor' : '#ffffff', 'headbgcolor' : '#FFFFFF', 'headtextcolor' : '#000000', } # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". html_title = "Documentation" # A shorter title for the navigation bar. Default is the same as # html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at # the top of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon # of the docs. This file should be a Windows icon file (.ico) being # 16x16 or 32x32 pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style # sheets) here, relative to this directory. They are copied after the # builtin static files, so a file named "default.css" will overwrite # the builtin "default.css". html_static_path = ['_static'] # If not '', a 'Last updated on:' timestamp is inserted at every page # bottom, using the given strftime format. html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {'**': ['my_con.html', 'globaltoc.html', 'sourcelink.html']} # Additional templates that should be rendered to pages, maps page # names to template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. html_split_index = True #False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default # is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is # True. #html_show_copyright = True # If true, an OpenSearch description file will be output, and all # pages will contain a tag referring to it. The value of this # option must be the base URL from which the finished HTML is served. #html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'cfdoc' # -- Options for LaTeX output ------------------------------------------------- ## The paper size ('letter' or 'a4'). #latex_paper_size = 'a4' # The font size ('10pt', '11pt' or '12pt'). #latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples (source # start file, target name, title, author, documentclass # [howto/manual]). latex_documents = [ ('index', 'cf-python.tex', 'cf-python Documentation', 'David Hassell', 'manual'), ] # The name of an image file (relative to this directory) to place at # the top of the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are # parts, not chapters. latex_use_parts = True # If true, show page references after internal links. latex_show_pagerefs = False # If true, show URL addresses after external links. latex_show_urls = 'footnote' # Additional stuff for the LaTeX preamble. #latex_preamble = '' # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. latex_domain_indices = True # A dictionary that contains LaTeX snippets that override those Sphinx # usually puts into the generated .tex files. latex_elements = {'papersize': 'a4paper'} # -- Options for manual page output ------------------------------------------- # One entry per manual page. List of tuples (source start file, name, # description, authors, manual section). man_pages = [ ('index', 'cf-python', 'cf-python Documentation', 'David Hassell', 1) ] # Set up copybutton def setup(app): app.add_javascript('copybutton.js') # This is a function which should return the URL to source code # corresponding to the object in given domain with given information. import inspect, cf from os.path import relpath, dirname def linkcode_resolve(domain, info): #================================================================= # Must delete all .doctrees directories in build for changes to be # picked up. E.g.: # # >> rm -fr build/.doctrees build/*/.doctrees build/*/*/.doctrees #================================================================= online_source_code = True # online_source_code = False if domain != 'py': return None if not info['module']: return None modname = info['module'] fullname = info['fullname'] submod = sys.modules.get(modname, None) if submod is None: return None obj = submod for part in fullname.split('.'): try: obj = getattr(obj, part) except: return None try: fn = inspect.getsourcefile(obj) except: fn = None if not fn: return None try: source, lineno = inspect.findsource(obj) nlines = len(inspect.getsourcelines(obj)[0]) except: lineno = None fn = relpath(fn, start=dirname(cf.__file__)) if lineno: # linespec = "#cl-%d" % (lineno + 1) ##This format used to work in bitbucket, but doesn't now 910/02/2016) linespec = "#{0}-{1}".format(fn, lineno+1) #, lineno+nlines) # Can add range when jump-to feature is enable in bitbucket else: linespec = "" # ---------------------------------------------------------------- # NOTE: You need to touch the .rst files to get the change in # ---------------------------------------------------------------- if online_source_code: # commit = '11dddff56c31c24d86c3b83995e503989f90911b' # commit = 'master' commit = 'v'+release print "https://bitbucket.org/cfpython/cf-python/src/{0}/cf/{1}{2}".format( commit, fn, linespec) return "https://bitbucket.org/cfpython/cf-python/src/{0}/cf/{1}{2}".format( commit, fn, linespec) else: # Point to local source code relative to this directory return "../../../cf/{0}{1}".format(fn, linespec) cf-python-1.3.2/docs/source/field_creation.rst0000600000175000017500000003510712603546021021552 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj .. _field_creation: Creating `cf.Field` objects =========================== A new field may be created by initializing a new `cf.Field` instance. Data and metadata are provided with the following keyword parameters, all of which are optional: ======================= ============================================================= Keyword Description ======================= ============================================================= ``ancillary_variables`` Provide the new field with ancillary variable fields in a `cf.AncillaryVariables` object ``attributes`` Provide the new field with attributes in a dictionary ``data`` Provide the new field with a data array in a `cf.Data` object ``dimensions`` Provide the new field with a data array dimensions ``domain`` Provide the new field with a coordinate system in a `cf.Domain` object ``flags`` Provide the new field with self-describing flag values in a `cf.Flags` object ``properties`` Provide the new field with CF properties in a dictionary ======================= ============================================================= .. _domain-creation: Domain creation --------------- Creating a domain possibly comprises the largest part of field creation, because the domain itself is composed of many interrelated items (dimension and auxiliary coordinate, cell measure and coordinate reference objects). It is not, however, difficult and is essentially a methodical assembly of components. Domain initialization is fully described in the documention of the `cf.Domain` object. Each component of the field's domain has an internal identifier (unique strings such as ``'dim1'``, ``'aux0'``, ``'msr2'`` and ``'ref0'``), but for many field initializations, there is no need to provide, nor have any knowledge of these. However, they are easy to set if required (which may be the case if, for example, two multidimensional auxiliary coordinates span the same dimensions but in different orders) or if desired for clarity. .. _inserting-and-removing-components: Inserting and removing components --------------------------------- Inserting field components after initialization is done with the following methods: .. autosummary:: :nosignatures: :template: method.rst cf.Field.insert_aux cf.Field.insert_axis cf.Field.insert_data cf.Field.insert_dim cf.Field.insert_measure cf.Field.insert_ref For example: >>> coord >>> f.domain.insert_dim(coord) Note that inserting domain items during field initialization is likely to be faster than using the insertion methods afterwards. Removing field components is done with the following methods: .. autosummary:: :nosignatures: :template: method.rst cf.Field.remove_axis cf.Field.remove_axes cf.Field.remove_data cf.Field.remove_item cf.Field.remove_items For example: >>> f.domain.remove_item('forecast_reference_time') .. _field-creation_examples: Examples -------- To improve readability, it is recommended that the construction of a field is done by first creating the components separately (data, coordinates, properties, *etc.*), and then combining them to make the field (as in :ref:`example 3 ` and :ref:`example 4 `), although this may not be necessary for very simple fields (as in :ref:`example 1 ` and :ref:`example 2 `). .. _fc-example1: Example 1 ~~~~~~~~~ An empty field: >>> f = cf.Field() >>> print f field summary -------------- .. _fc-example2: Example 2 ~~~~~~~~~ A field with just CF properties: >>> f = cf.Field(properties={'standard_name': 'air_temperature', ... 'long_name': 'temperature of air'}) ... >>> print f air_temperature field summary ----------------------------- .. _fc-example3: Example 3 ~~~~~~~~~ A field with a simple domain. Note that in this example the data and coordinates are generated using :py:obj:`range` and `numpy.arange` simply for the sake of having some numbers to play with. In practice it is likely the values would have been read from a file in some arbitrary format: >>> import numpy >>> data = cf.Data(numpy.arange(90.).reshape(10, 9), 'm s-1') >>> properties = {'standard_name': 'eastward_wind'} >>> dim0 = cf.DimensionCoordinate(data=cf.Data(range(10), 'degrees_north'), ... properties={'standard_name': 'latitude'}) ... >>> dim1 = cf.DimensionCoordinate(data=cf.Data(range(9), 'degrees_east')) >>> dim1.standard_name = 'longitude' >>> domain = cf.Domain(dim=[dim0, dim1]) >>> f = cf.Field(properties=properties, data=data, domain=domain) >>> print f eastward_wind field summary --------------------------- Data : eastward_wind(latitude(10), longitude(9)) m s-1 Dimensions : latitude(10) = [0, ..., 9] degrees_north : longitude(9) = [0, ..., 8] degrees_east Note that the default dimension order of ``['dim0', 'dim1']`` is applicable to the field's data array. Adding an auxiliary coordinate to the "latitude" axis and a cell method may be done with the :ref:`relevant method ` and by simple assignment respectively (note that these coordinate values are just for illustration): >>> aux = cf.AuxiliaryCoordinate(data=cf.Data(['alpha','beta','gamma','delta','epsilon', ... 'zeta','eta','theta','iota','kappa'])) ... >>> aux.long_name = 'extra' >>> print f.items() {'dim0': , 'dim1': } >>> f.insert_aux(aux, axes=['dim0']) 'aux0' >>> f.cell_methods = cf.CellMethods('latitude: point') >>> f.long_name = 'wind' >>> print f eastward_wind field summary --------------------------- Data : eastward_wind(latitude(10), longitude(9)) m s-1 Cell methods : latitude: point Dimensions : latitude(10) = [0, ..., 9] degrees_north : longitude(9) = [0, ..., 8] degrees_east Auxiliary coords: long_name:extra(latitude(10)) = ['alpha', ..., 'kappa'] Removing the auxiliary coordinate and the cell method that were just added is also done with the :ref:`relevant method ` and by simple deletion respectively: >>> f.remove_item({'long_name': 'extra'}) >>> del f.cell_methods >>> print f eastward_wind field summary --------------------------- Data : eastward_wind(latitude(10), longitude(9)) m s-1 Dimensions : latitude(10) = [0, ..., 9] degrees_north : longitude(9) = [0, ..., 8] degrees_east .. _fc-example4: Example 4 ~~~~~~~~~ .. highlight:: guess A more complicated field is created by the following script. Note that in this example the data and coordinates are generated using `numpy.arange` simply for the sake of having some numbers to play with. In practice it is likely the values would have been read from a file in some arbitrary format:: import cf import numpy #--------------------------------------------------------------------- # 1. CREATE the field's domain items #--------------------------------------------------------------------- # Create a grid_latitude dimension coordinate Y = cf.DimensionCoordinate(properties={'standard_name': 'grid_latitude'}, data=cf.Data(numpy.arange(10.), 'degrees')) # Create a grid_longitude dimension coordinate X = cf.DimensionCoordinate(data=cf.Data(numpy.arange(9.), 'degrees')) X.standard_name = 'grid_longitude' # Create a time dimension coordinate (with bounds) bounds = cf.CoordinateBounds( data=cf.Data([0.5, 1.5], cf.Units('days since 2000-1-1', calendar='noleap'))) T = cf.DimensionCoordinate(properties=dict(standard_name='time'), data=cf.Data(1, cf.Units('days since 2000-1-1', calendar='noleap')), bounds=bounds) # Create a longitude auxiliary coordinate lat = cf.AuxiliaryCoordinate(data=cf.Data(numpy.arange(90).reshape(10, 9), 'degrees_north')) lat.standard_name = 'latitude' # Create a latitude auxiliary coordinate lon = cf.AuxiliaryCoordinate(properties=dict(standard_name='longitude'), data=cf.Data(numpy.arange(1, 91).reshape(9, 10), 'degrees_east')) # Create a rotated_latitude_longitude grid mapping coordinate reference grid_mapping = cf.CoordinateReference('rotated_latitude_longitude', grid_north_pole_latitude=38.0, grid_north_pole_longitude=190.0) # -------------------------------------------------------------------- # 2. Create the field's domain from the previously created items # -------------------------------------------------------------------- domain = cf.Domain(dim=[T, Y, X], aux=[lat, lon], ref=grid_mapping) #--------------------------------------------------------------------- # 3. Create the field #--------------------------------------------------------------------- # Create CF properties properties = {'standard_name': 'eastward_wind', 'long_name' : 'East Wind', 'cell_methods' : cf.CellMethods('latitude: point')} # Create the field's data array data = cf.Data(numpy.arange(90.).reshape(9, 10), 'm s-1') # Finally, create the field f = cf.Field(properties=properties, domain=domain, data=data) print "The new field:\n" print f .. highlight:: none Running this script produces the following output:: The new field: eastward_wind field summary --------------------------- Data : eastward_wind(grid_longitude(9), grid_latitude(10)) m s-1 Cell methods : latitude: point Axes : time(1) = [2000-01-02 00:00:00] noleap : grid_longitude(9) = [0.0, ..., 8.0] degrees : grid_latitude(10) = [0.0, ..., 9.0] degrees Aux coords : latitude(grid_latitude(10), grid_longitude(9)) = [[0, ..., 89]] degrees_north : longitude(grid_longitude(9), grid_latitude(10)) = [[1, ..., 90]] degrees_east Coord refs : .. highlight:: guess .. _fc-example5: Example 5 ~~~~~~~~~ :ref:`Example 4 ` would be slightly more complicated if the ``grid_longitude`` and ``grid_latitude`` axes were to have the same size. In this case the domain needs be told which axes, and in which order, are spanned by the two dimensional auxiliary coordinates (``latitude`` and ``longitude``) and the field needs to know which axes span the data array:: import cf import numpy #--------------------------------------------------------------------- # 1. CREATE the field's domain items #--------------------------------------------------------------------- # Create a grid_latitude dimension coordinate Y = cf.DimensionCoordinate(properties={'standard_name': 'grid_latitude'}, data=cf.Data(numpy.arange(10.), 'degrees')) # Create a grid_longitude dimension coordinate X = cf.DimensionCoordinate(data=cf.Data(numpy.arange(10.), 'degrees')) X.standard_name = 'grid_longitude' # Create a time dimension coordinate (with bounds) bounds = cf.CoordinateBounds( data=cf.Data([0.5, 1.5], cf.Units('days since 2000-1-1', calendar='noleap'))) T = cf.DimensionCoordinate(properties=dict(standard_name='time'), data=cf.Data(1, cf.Units('days since 2000-1-1', calendar='noleap')), bounds=bounds) # Create a longitude auxiliary coordinate lat = cf.AuxiliaryCoordinate(data=cf.Data(numpy.arange(100).reshape(10, 10), 'degrees_north')) lat.standard_name = 'latitude' # Create a latitude auxiliary coordinate lon = cf.AuxiliaryCoordinate(properties=dict(standard_name='longitude'), data=cf.Data(numpy.arange(1, 101).reshape(10, 10), 'degrees_east')) # Create a rotated_latitude_longitude grid mapping coordinate reference grid_mapping = cf.CoordinateReference('rotated_latitude_longitude', grid_north_pole_latitude=38.0, grid_north_pole_longitude=190.0) # -------------------------------------------------------------------- # 2. Create the field's domain from the previously created items # -------------------------------------------------------------------- domain = cf.Domain(dim=[T, Y, X], aux={'aux0': lat, 'aux1': lon}, ref=grid_mapping, assign_axes={'aux0': ['grid_latitude', 'grid_longitude'], 'aux1': ['grid_longitude', 'grid_latitude']}) #--------------------------------------------------------------------- # 3. Create the field #--------------------------------------------------------------------- # Create CF properties properties = {'standard_name': 'eastward_wind', 'long_name' : 'East Wind', 'cell_methods' : cf.CellMethods('latitude: point')} # Create the field's data array data = cf.Data(numpy.arange(90.).reshape(9, 10), 'm s-1') # Finally, create the field f = cf.Field(properties=properties, domain=domain, data=data, axes=['grid_latitude', 'grid_longitude']) print "The new field:\n" print f .. highlight:: none Running this script produces the following output:: eastward_wind field summary --------------------------- Data : eastward_wind(grid_latitude(10), grid_longitude(10)) m s-1 Cell methods : latitude: point Axes : time(1) = [2000-01-02 00:00:00] noleap : grid_longitude(10) = [0.0, ..., 9.0] degrees : grid_latitude(10) = [0.0, ..., 9.0] degrees Aux coords : latitude(grid_latitude(10), grid_longitude(10)) = [[0, ..., 99]] degrees_north : longitude(grid_longitude(10), grid_latitude(10)) = [[1, ..., 100]] degrees_east Coord refs : .. highlight:: guess cf-python-1.3.2/docs/source/a_first_example.rst.NEW0000644000175000017500000000715712747600703022420 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj A first example =============== The cf package allows a data array and its associated metadata to be contained and manipulated as a single entity called a *field*, which is stored in a `cf.Field` object. Much of the basic field manipulation syntax can be seen in this simple read-modify-write example which: * Reads a field from a file on disk and find out information about it. * Modifies a CF property and the units of its data. * Modifies the data values. * Modifies a subspace of the data values. * Writes it out to another file on disk. The example may be reproduced by downloading the :download:`sample netCDF file (file.nc) <../file.nc>` (taking care not to overwrite an existing file with that name) [#f1]_. **1.** Import the cf package. >>> import cf **2.** Read a field from disk and find a summary of its contents. >>> f = cf.read('file.nc')[0] >>> type(f) cf.field.Field >>> f >>> print f air_temperature field summary ----------------------------- Data : air_temperature(latitude(4), longitude(5)) K Cell methods : time: mean Axes : time(1) = [2000-01-16 00:00:00] 360_day : height(1) = [2.0] m : latitude(4) = [-2.5, ..., 5.0] degrees_north : longitude(5) = [0.0, ..., 15.0] degrees_east **3.** Find all of the field's CF properties and its data array as a numpy array. >>> f.properties {'Conventions': 'CF-1.5', '_FillValue': 1e+20, 'experiment_id': 'stabilization experiment (SRES A1B)', 'long_name': 'Air Temperature', 'standard_name': 'air_temperature', 'title': 'SRES A1B'} >>> print f.array [[ 274.15, 276.15, 275.15, 277.15, 278.15], [ 274.15, 275.15, 276.15, 277.15, 276.15], [ 277.15, 275.15, 278.15, 274.15, 278.15], [ 276.15, 274.15, 275.15, 277.15, 274.15]] **4.**. Modify the field's long name CF property and change the field's data from units of Kelvin to Celsius. .. note:: Changing the units automatically changes the data when it is next accessed. >>> f.long_name 'Air Temperature' >>> f.long_name = 'Surface Air Temperature' >>> f.long_name 'Surface Air Temperature' >>> print f.Units K >>> f.Units -= 273.15 >>> print f.Units K @ 273.15 >>> print f.array [[ 1. 3. 2. 4. 5.] [ 1. 2. 3. 4. 3.] [ 4. 2. 5. 1. 5.] [ 3. 1. 2. 4. 1.]] **5.** Check that the field has 'air_temperature' as its standard name and that at least one of its latitude coordinate values is greater than 0.0. >>> f.match('air_temperature', items={'latitude' : cf.gt(0)}) True **6.** Modify the data values. >>> g = f + 100 >>> print g.array [[ 101. 103. 102. 104. 105.] [ 101. 102. 103. 104. 103.] [ 104. 102. 105. 101. 105.] [ 103. 101. 102. 104. 101.]] >>> g = f + f >>> print g.array [[ 2. 6. 4. 8. 10.] [ 2. 4. 6. 8. 6.] [ 8. 4. 10. 2. 10.] [ 6. 2. 4. 8. 2.]] >>> g = f / cf.Data(2, 'seconds') >>> print g.array [[0.5 1.5 1.0 2.0 2.5] [0.5 1.0 1.5 2.0 1.5] [2.0 1.0 2.5 0.5 2.5] [1.5 0.5 1.0 2.0 0.5]] >>> print g.Units s-1.K **7.** Access and modify a subspace of the data values. >>> g = f.subspace[0::2, 2:4] >>> print g.array [[ 2. 4.] [ 5. 1.]] >>> f.subspace[0::2, ...] = -10 >>> print f.array [[-10. -10. -10. -10. -10.] [ 1. 2. 3. 4. 3.] [-10. -10. -10. -10. -10.] [ 3. 1. 2. 4. 1.]] **8.** Write the modified field to disk. >>> cf.write(f, 'newfile.nc') ---- .. rubric:: Footnotes .. [#f1] This file may be also found in the ``docs/build/_downloads/`` directory of the installation. cf-python-1.3.2/docs/source/fieldlist.rst0000600000175000017500000001026612603546021020561 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj .. _fs_field_list: Introduction to the `cf.FieldList` object ========================================= A `cf.FieldList` object is an ordered sequence of `cf.Field` objects. It supports nearly all of the :ref:`python list-like operations `, the exceptions being the arithmetic and comparison operators for which it has :ref:`its own definitions `. For example: >>> fl [, ] >>> fl[0] >>> fl[::-1] [, ] >>> fl[slice(1, -1, 2)] [] Note that an integer index returns an individual field, but other types of index always return a field list. >>> len(fl) 2 >>> f = fl.pop() >>> f >>> len(fl) 1 >>> fl.append(f) >>> len(fl) 2 >>> f in fl True >>> from operator import attrgetter >>> fl [, ] >>> fl.sort(key=attrgetter('standard_name')) [, ] Field list methods ^^^^^^^^^^^^^^^^^^ A subset of a field's callable methods are also available to a field list object (see the list of :ref:`field list methods `). In general, these are methods which, on a field, return a field or `None`. On a field list the same methods return a field list or `None` respectively: >>> gl = fl.max() >>> fl.max(i=True) is exactly equivalent to >>> gl = cf.FieldList([f.max() for f in fl]) >>> for f in fl: ... f.max(i=True) The `~cf.FieldList.subspace` attribute ..... >>> fl [, ] >>> fl.subspace[0] [, ] >>> fl.subspace(latitude=0) [, ] For cases for which there is no field list method to apply changes to each field element, fields must be updated individually; For example: list are easily carried out in a loop: >>> fl[-1].standard_name = 'y_wind' >>> for f in fl: ... f.long_name = 'An even longer ' + f.long_name .. _fs-fl-a-and-c: Arithmetic and comparison ^^^^^^^^^^^^^^^^^^^^^^^^^ Any arithmetic and comparison operation is applied independently to each field element, so all of the :ref:`operators defined for a field ` are allowed. In particular, the usual :ref:`python list-like arithmetic and comparison operator behaviours ` do **not** apply. For example, the ``+`` operator will concatenate two built-in lists, but adding ``2`` to a field list will add ``2`` to the data array of each of its fields. For example these commands: >>> gl = fl + 2 >>> gl = 2 // fl >>> gl = fl == 0 >>> fl += 2 are exactly equivalent to: >>> gl = cf.FieldList(f + 2 for f in fl) >>> gl = cf.FieldList(2 // f for f in fl) >>> gl = cf.FieldList(f == 0 for f in fl) >>> for f in fl: ... f += 2 Field versus field list ^^^^^^^^^^^^^^^^^^^^^^^ In some contexts, whether an object is a field or a field list is not known. So to avoid awkward type testing, some aspects of the `cf.FieldList` interface are shared by a `cf.Field` object and vice versa. A field may be used in the same iterative contexts as a field list: >>> f >>> f is f[0] is f[slice(-1, None, -1)] is f[::-1] True >>> for g in f: ... print repr(g) ... Field methods which cf-python-1.3.2/docs/source/a_first_example.rst0000644000175000017500000000754112747600703021765 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj A first example =============== The cf package allows a data array and its associated metadata to be contained and manipulated as a single entity called a *field*, which is stored in a `cf.Field` object. Much of the basic field manipulation syntax can be seen in this simple read-modify-write example which: * Reads a field from a file on disk and find out information about it. * Modifies a CF property and the units of its data. * Modifies the data values. * Modifies a subspace of the data values. * Writes it out to another file on disk. The example may be reproduced by downloading the :download:`sample netCDF file (file.nc) <../file.nc>` (taking care not to overwrite an existing file with that name) [#f1]_. .. .. raw:: html :file: examples/first_example.html :download:`1 ` :download:`2 ` :download:`3 ` :download:`4 ` **1.** Import the cf package. >>> import cf **2.** Read a field from disk and find a summary of its contents. >>> f = cf.read('file.nc') >>> type(f) cf.field.Field >>> f >>> print f air_temperature field summary ----------------------------- Data : air_temperature(latitude(4), longitude(5)) K Cell methods : time: mean Axes : time(1) = [2000-01-16 00:00:00] 360_day : height(1) = [2.0] m : latitude(4) = [-2.5, ..., 5.0] degrees_north : longitude(5) = [0.0, ..., 15.0] degrees_east **3.** Find all of the field's CF properties and its data array as a numpy array. >>> f.properties {'Conventions': 'CF-1.5', '_FillValue': 1e+20, 'experiment_id': 'stabilization experiment (SRES A1B)', 'long_name': 'Air Temperature', 'standard_name': 'air_temperature', 'title': 'SRES A1B'} >>> print f.array [[ 274.15, 276.15, 275.15, 277.15, 278.15], [ 274.15, 275.15, 276.15, 277.15, 276.15], [ 277.15, 275.15, 278.15, 274.15, 278.15], [ 276.15, 274.15, 275.15, 277.15, 274.15]] **4.**. Modify the field's long name CF property and change the field's data from units of Kelvin to Celsius. .. note:: Changing the units automatically changes the data when it is next accessed. >>> f.long_name 'Air Temperature' >>> f.long_name = 'Surface Air Temperature' >>> f.long_name 'Surface Air Temperature' >>> print f.Units K >>> f.Units -= 273.15 >>> print f.Units K @ 273.15 >>> print f.array [[ 1. 3. 2. 4. 5.] [ 1. 2. 3. 4. 3.] [ 4. 2. 5. 1. 5.] [ 3. 1. 2. 4. 1.]] **5.** Check that the field has 'air_temperature' as its standard name and that at least one of its latitude coordinate values is greater than 0.0. >>> f.match('air_temperature', items={'latitude' : cf.gt(0)}) True **6.** Modify the data values. >>> g = f + 100 >>> print g.array [[ 101. 103. 102. 104. 105.] [ 101. 102. 103. 104. 103.] [ 104. 102. 105. 101. 105.] [ 103. 101. 102. 104. 101.]] >>> g = f + f >>> print g.array [[ 2. 6. 4. 8. 10.] [ 2. 4. 6. 8. 6.] [ 8. 4. 10. 2. 10.] [ 6. 2. 4. 8. 2.]] >>> g = f / cf.Data(2, 'seconds') >>> print g.array [[0.5 1.5 1.0 2.0 2.5] [0.5 1.0 1.5 2.0 1.5] [2.0 1.0 2.5 0.5 2.5] [1.5 0.5 1.0 2.0 0.5]] >>> print g.Units s-1.K **7.** Access and modify a subspace of the data values. >>> g = f.subspace[0::2, 2:4] >>> print g.array [[ 2. 4.] [ 5. 1.]] >>> f.subspace[0::2, ...] = -10 >>> print f.array [[-10. -10. -10. -10. -10.] [ 1. 2. 3. 4. 3.] [-10. -10. -10. -10. -10.] [ 3. 1. 2. 4. 1.]] **8.** Write the modified field to disk. >>> cf.write(f, 'newfile.nc') ---- .. rubric:: Footnotes .. [#f1] This file may be also found in the ``docs/build/_downloads/`` directory of the installation. cf-python-1.3.2/docs/source/index.rst0000600000175000017500000000106512603546021017706 0ustar daviddavid00000000000000.. cf-python documentation master file, created by sphinx-quickstart on Wed Aug 3 16:28:25 2011. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. .. currentmodule:: cf .. default-role:: obj cf-python |release| documentation ================================= .. toctree:: :maxdepth: 3 introduction ---- .. toctree:: :maxdepth: 3 getting_started ---- .. toctree:: :maxdepth: 3 reference Indices and tables ================== * :ref:`genindex` * :ref:`search` cf-python-1.3.2/docs/source/introduction.rst.NEW0000600000175000017500000000317712527614562021771 0ustar daviddavid00000000000000Introduction ============ `CF `_ is a `netCDF `_ convention which is in wide and growing use for the storage of model-generated and observational data relating to the atmosphere, ocean and Earth system. This package is an implementation of the `CF data model `_, and as such it is an API allows for the full scope of data and metadata interactions described by the CF conventions. With this package you can: * Read `CF-netCDF `_ files, `CFA-netCDF `_ files and UK Met Office fields files and PP files. * Create CF fields. * Write fields to CF-netCDF and CFA-netCDF files on disk. * Aggregate collections of fields into as few multidimensional fields as possible using the `CF aggregation rules `_. * Create, delete and modify a field's data and metadata. * Select and subspace fields according to their metadata. * Perform broadcastable, metadata-aware arithmetic, comparison and trigonometric operation with fields. * Collapse fields by statistical operations. * Sensibly deal with date-time data. * Allow for cyclic axes. * Visualize fields the `cfplot package `_. All of the above use :ref:`LAMA` functionality, which allows multiple fields larger than the available memory to exist and be manipulated. See the `cf-python home page `_ for downloads, installation and source code. cf-python-1.3.2/docs/source/introduction.rst0000600000175000017500000000317712603546021021326 0ustar daviddavid00000000000000Introduction ============ `CF `_ is a `netCDF `_ convention which is in wide and growing use for the storage of model-generated and observational data relating to the atmosphere, ocean and Earth system. This package is an implementation of the `CF data model `_, and as such it is an API allows for the full scope of data and metadata interactions described by the CF conventions. With this package you can: * Read `CF-netCDF `_ files, `CFA-netCDF `_ files and UK Met Office fields files and PP files. * Create CF fields. * Write fields to CF-netCDF and CFA-netCDF files on disk. * Aggregate collections of fields into as few multidimensional fields as possible using the `CF aggregation rules `_. * Create, delete and modify a field's data and metadata. * Select and subspace fields according to their metadata. * Perform broadcastable, metadata-aware arithmetic, comparison and trigonometric operation with fields. * Collapse fields by statistical operations. * Sensibly deal with date-time data. * Allow for cyclic axes. * Visualize fields the `cfplot package `_. All of the above use :ref:`LAMA` functionality, which allows multiple fields larger than the available memory to exist and be manipulated. See the `cf-python home page `_ for downloads, installation and source code. cf-python-1.3.2/docs/source/field_structure.rst0000600000175000017500000004256612661402454022022 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj .. _field_structure: Structure and contents of a `cf.Field` object ============================================= A field (stored in a `cf.Field` object) is a container for a data array and metadata comprising properties to describe the physical nature of the data and a coordinate system (called a *domain*), which describes the positions of each element of the data array. It is structured in exactly the same way as a field construct defined by the `CF data model `_. As in the CF data model, all components of a field are optional. Displaying the contents ----------------------- The structure may be exposed with three different levels of detail. The built-in `repr` function returns a short, one-line description of the field: >>> type(f) >>> print repr(f) >>> f This gives the identity of the field (air_temperature), the identities and sizes of its data array dimensions (time, latitude and longitude with sizes 12, 64 and 128 respectively) and the units of the field's data array (K). The built-in `str` function returns the same information as the the one-line output, along with short descriptions of the field's other components: >>> print f air_temperature field summary ----------------------------- Data : air_temperature(time(1200), latitude(64), longitude(128)) K Cell methods : time: mean (interval: 1.0 month) Dimensions : time(12) = [ 450-11-01 00:00:00, ..., 451-10-16 12:00:00] noleap calendar : latitude(64) = [-87.8638000488, ..., 87.8638000488] degrees_north : longitude(128) = [0.0, ..., 357.1875] degrees_east : height(1) = [2.0] m This shows that the field has a cell method and four dimension coordinates, one of which (height) is a coordinate for a size 1 dimension that is not a dimension of the field's data array. The units and first and last values of the coordinates' data arrays are given and relative time values are translated into strings. The field's `~cf.Field.dump` method (or the `cf.dump` function) also returns each component's properties, as well as the first and last values of the field's data array:: >>> print f.dump() ====================== Field: air_temperature ====================== Dimensions height(1) latitude(64) longitude(128) time(12) Data(time(12), latitude(64), longitude(128)) = [[[236.512756348, ..., 256.93371582]]] K cell_methods = time: mean (interval: 1.0 month) experiment_id = 'pre-industrial control experiment' long_name = 'Surface Air Temperature' standard_name = 'air_temperature' title = 'model output prepared for IPCC AR4' Dimension coordinate: time Data(time(12)) = [ 450-11-16 00:00:00, ..., 451-10-16 12:00:00] noleap calendar Bounds(time(12), 2) = [[ 450-11-01 00:00:00, ..., 451-11-01 00:00:00]] noleap calendar axis = 'T' long_name = 'time' standard_name = 'time' Dimension coordinate: latitude Data(latitude(64)) = [-87.8638000488, ..., 87.8638000488] degrees_north Bounds(latitude(64), 2) = [[-90.0, ..., 90.0]] degrees_north axis = 'Y' long_name = 'latitude' standard_name = 'latitude' Dimension coordinate: longitude Data(longitude(128)) = [0.0, ..., 357.1875] degrees_east Bounds(longitude(128), 2) = [[-1.40625, ..., 358.59375]] degrees_east axis = 'X' long_name = 'longitude' standard_name = 'longitude' Dimension coordinate: height Data(height(1)) = [2.0] m axis = 'Z' long_name = 'height' positive = 'up' standard_name = 'height' .. _fs-data-array: Data ---- A field's data array is a `cf.Data` object and is returned by its `~Field.data` attribute. >>> f.data The `cf.Data` object: * Contains an N-dimensional array with many similarities to a `numpy` array. * Contains the units of the array elements. * Uses :ref:`LAMA ` functionality to store and operate on arrays which are larger then the available memory. * Supports masked arrays [#f1]_, regardless of whether or not it was initialized with a masked array. Data attributes --------------- A field has reserved attributes which return information on its data. See the :ref:`list of reserved data attributes ` for details. For example, to find the shape of the data and to retrieve the data array as an actual `numpy` array: >>> f.shape (1, 3, 4) >>> f.array array([[[ 89., 80., 71.], [ 85., 76., 67.], [ 83., 74., 65.], [ 84., 75., 66.]]]) The data array's missing value mask may be retrieved with the `~Field.mask` attribute. The mask is returned as a new field with a boolean data array: >>> m = f.mask >>> m.data If the field contains no missing data then a mask field with False values is still returned. CF properties ------------- Standard CF data variable properties (such as `~cf.Field.standard_name`, `~cf.Field.units`, etc.) all have reserved attribute names. See the :ref:`list of reserved CF properties ` for details. These properties may be set, retrieved and deleted like normal python object attributes: >>> f.standard_name = 'air_temperature' >>> f.standard_name 'air_temperature' >>> del f.standard_name as well as with the dedicated `~Field.setprop`, `~Field.getprop` and `~Field.delprop` field methods: >>> f.setprop('standard_name', 'air_temperature') >>> f.getprop('standard_name') 'air_temperature' >>> f.delprop('standard_name') Non-standard CF properties *must* be accessed using these three methods: >>> f.setprop('foo', 'bar') >>> f.getprop('foo') 'bar' >>> f.delprop('foo') All of the field's CF properties may be retrieved with the field's `~Field.properties` attribute: >>> f.properties {'cell_methods' : XXXXXXXXXXXXXXXXXXXXXXXXXXX, '_FillValue': 1e+20, 'foo': 'bar', 'long_name': 'Surface Air Temperature', 'standard_name': 'air_temperature', 'units': 'K'} Other attributes ---------------- A field has other reserved attributes which have a variety of roles. See the :ref:`list of reserved attributes ` for details. Any unreserved attribute may be set on a field object with, in general, no special meaning attached to it. The following unreserved attributes do, however, have particular interpretations: ========= ============================================================== Attribute Description ========= ============================================================== `!file` The name of the file the field was read from `!id` An identifier for the field in the absence of a standard name. See the `~Field.identity` method for details. `!ncvar` A netCDF variable name of the field. ========= ============================================================== All of the field's attributes may be retrieved with the field's `~Field.attributes` attribute: >>> f.attributes {'ncar': 'tas'} Methods ------- A field has a large range of methods which, in general, either return information about the field or change the field in place. See the :ref:`list of methods ` and :ref:`manipulating fields ` section for details. .. _domain_structure: Domain structure ---------------- A field's domain completely describes the field's coordinate system and is stored in its `~Field.domain` attribute, the value of which is a `cf.Domain` object. It contains axes (which describe the field's dimensionality), dimension coordinate, auxiliary coordinate and cell measure objects (which themselves contain data arrays and properties to describe them) and coordinate reference objects (which provide geo-locating metadata for the coordinate objects). Each item has a unique internal identifier (is a string containing a number), which serves to link related items. Items ^^^^^ Domain items are stored in the following objects: ======================================= ============================ Item `cf` object ======================================= ============================ Dimension coordinate object `cf.DimensionCoordinate` Auxiliary coordinate object `cf.AuxiliaryCoordinate` Cell measure object `cf.CellMeasure` Coordinate reference object `cf.CoordinateReference` ======================================= ============================ These items may be retrieved with a variety of methods, some specific to each item type (such as `cf.Field.dim`) and some more generic (such as `cf.Field.coords` and `cf.Field.item`): ================================= ============================================================ Item Field retrieval methods ================================= ============================================================ Dimension coordinate object `~Field.dim`, `~Field.dims`, `~Field.coord`, `~Field.coords` `~Field.item`, `~Field.items` Auxiliary coordinate object `~Field.aux`, `~Field.auxs`, `~Field.coord`, `~Field.coords` `~Field.item`, `~Field.items` Cell measure object `~Field.cm`, `~Field.cms`, `~Field.item`, `~Field.items` Cooridnate reference object `~Field.ref`, `~Field.refs`, `~Field.item`, `~Field.items` ================================= ============================================================ In each case the singular method form (such as `~Field.aux`) returns an actual domain item whereas the plural method form (such as `~Field.auxs`) returns a dictionary whose keys are the domain item identifiers with corresponding values of the items themselves. For example, to retrieve a unique dimension coordinate object with a standard name of "time": >>> f.dim('time') To retrieve all coordinate objects and their domain identifiers: >>> f.coords() {'dim0': BLAH To retrieve all domain items and their domain identifiers: >>> f.items() {'dim0': BLAH Axes ^^^^ Common dimensions of variation in the field's data array and the domain's items are defined by the domain's axes. Each axis has a domain identifier (such as ``'dim1'``) and an integer size and is stored in the domain's `!dimension_sizes` attribute: >>> f.domain.dimension_sizes {'dim1': 19, 'dim0': 12, 'dim2': 73, 'dim3': 96} Particular axes may be retrieved with the `~cf.Field.axes` method: >>> f.axes() set(['dim1', 'dim0' 'dim2' 'dim3']) >>> f.axes(size=19) set(['dim1']) >>> f.axes('time') set(['dim0']) The axes spanned by a domain item or the field's data array may be retrieved with the fields `~cf.Field.item_axes` or `~cf.Field.data_axes` methods respectively: >>> f.item_axes('time') ['dim0'] >>> f.data_axes() ['dim0', 'dim1' 'dim2' 'dim3'] Note that the field's data array may contain fewer size 1 dimensions than its domain. .. _fs_field_list: Field list ---------- A `cf.FieldList` object is an ordered sequence of fields. It supports the :ref:`python list-like operations `. For example: >>> fl [, ] >>> fl[0] >>> fl[::-1] [, ] >>> len(fl) 2 >>> f = fl.pop() >>> f >>> len(fl) 1 >>> fl.append(f) >>> len(fl) 2 >>> f in fl True A field list, however, has :ref:`its own definitions ` of the arithmetic and comparison operators. Methods, attributes and CF properties ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ A field list object also has all of the callable methods, reserved attributes and reserved CF properties that a field object has. When used with a field list, a callable method (such as `~cf.FieldList.item`) or a reserved attribute or CF property (such as `~cf.FieldList.Units` or `~cf.FieldList.standard_name`) is applied independently to each field and, unless a method (or assignment to a reserved attribute or CF property) carries out an in-place change to each field, a sequence of the results is returned. The type of sequence that may be returned will either be a new `cf.FieldList` object or else a new `cf.List` object. For example, `cf.FieldList.subspace` will return a new field list of subspaced fields: >>> fl [, ] >>> fl.subspace[0, ...] [, ] whereas `cf.FieldList.ndim`, `cf.FieldList.standard_name` and `cf.FieldList.item` return a `cf.List` of integers, strings and domain items respectively: >>> fl.ndim [3, 3] >>> fl.standard_name ['air_temperature', 'air_pressure'] >>> fl.item('time') [, ] A `cf.List` object is very much like a built-in list, in that it has all of the built-in list methods, but it also has an extra method, called `~cf.List.method`, which allows any callable method (with arguments) to be applied independently to each element of the list, returning the result in a new `cf.List` object: >>> fl.standard_name[::-1] ['air_pressure', 'air_temperature'] >>> fl.standard_name.method('upper') ['AIR_TEMPERATURE', 'AIR_PRESSURE'] >>> fl.item('time').method('getprop', 'standard_name') ['time', 'time'] >>> fl.item('time').method('delrop') [None, None] >>> fl.item('time').method('setprop', 'standard_name', 'foo') [None, None] >>> fl.item('time').method('getprop', 'standard_name') ['foo', 'foo'] The `cf.FieldList` object also has an equivalent method called `~cf.FieldList.method` which behaves in an analogous way, thus reducing the need to know which type of sequence has been returned from a field list method: >>> fl.getprop('standard_name') == fl.method('getprop', 'standard_name') True Assignment to reserved attributes and CF properties assigns the value to each field in turn. Similarly, deletion is carried out on each field: >>> fl.standard_name ['air_pressure', 'air_temperature'] >>> fl.standard_name = 'foo' ['foo', 'foo'] >>> del fl.standard_name >>> fl.getprop('standard_name', 'MISSING') ['MISSING', 'MISSING'] Note that the new value is not copied prior to each field assignment, which may be an issue for values which are mutable objects. Changes tailored to each field in the list are easily carried out in a loop: >>> for f in fl: ... f.long_name = 'An even longer ' + f.long_name .. _fs-fl-a-and-c: Arithmetic and comparison ^^^^^^^^^^^^^^^^^^^^^^^^^ Any arithmetic and comparison operation is applied independently to each field element, so all of the :ref:`operators defined for a field ` are allowed. In particular, the usual :ref:`python list-like arithmetic and comparison operator behaviours ` do not apply. For example, the ``+`` operator will concatenate two built-in lists, but adding ``2`` to a field list will add ``2`` to the data array of each of its fields. For example these commands: >>> fl + 2 >>> 2 + fl >>> fl == 0 >>> fl += 2 are equivalent to: >>> cf.FieldList(f + 2 for f in fl) >>> cf.FieldList(2 + f for f in fl) >>> cf.FieldList(f == 0 for f in fl) >>> for f in fl: ... f += 2 Field versus field list ^^^^^^^^^^^^^^^^^^^^^^^ In some contexts, whether an object is a field or a field list is not known. So to avoid ungainly type testing, most aspects of the `cf.FieldList` interface are shared by a `cf.Field` object. A field may be used in the same iterative contexts as a field list: >>> f >>> f is f[0] True >>> f is f[slice(-1, None, -1)] True >>> f is f[::-1] True >>> for g in f: ... print repr(g) ... When it is not known whether or not you have a field or a field list, iterating over the output of a callable method could be complicated because the output of the field method will be a scalar when the output of the same field list method will be a sequence of scalars. The problem is illustrated in this example (note that ``f.standard_name`` is an alias for ``f.getprop('standard_name')``): >>> f = fl[0] >>> for x in f.standard_name: ... print x+'.', ... a.i.r._.p.r.e.s.s.u.r.e. >>> for x in fl.standard_name: ... print x+'.', ... air_pressure.air_temperature. To overcome this difficulty, both the field and field list have a method call `!iter` which has no effect on a field list, but which changes the output of a field's callable method (with arguments) into a single element sequence: >>> f = fl[0] >>> for x in f.iter('getprop', 'standard_name'): ... print x+'.', ... air_pressure. >>> for x in fl.iter('getprop', 'standard_name'): ... print x+'.', ... air_pressure.air_temperature. ---- .. rubric:: Footnotes .. [#f1] Arrays that may have missing or invalid entries cf-python-1.3.2/docs/source/classes/0000755000175000017500000000000012770523316017517 5ustar daviddavid00000000000000cf-python-1.3.2/docs/source/classes/cf.CoordinateReference.rst0000644000175000017500000000267612752572327024567 0ustar daviddavid00000000000000cf.CoordinateReference ====================== .. currentmodule:: cf .. autoclass:: CoordinateReference .. automethod:: __init__ .. rubric:: Methods .. autosummary:: ~CoordinateReference.__init__ ~CoordinateReference.canonical_units ~CoordinateReference.change_coord_identities ~CoordinateReference.clear ~CoordinateReference.close ~CoordinateReference.copy ~CoordinateReference.default_value ~CoordinateReference.dump ~CoordinateReference.equals ~CoordinateReference.equivalent ~CoordinateReference.get ~CoordinateReference.has_key ~CoordinateReference.identity ~CoordinateReference.inspect ~CoordinateReference.items ~CoordinateReference.iteritems ~CoordinateReference.iterkeys ~CoordinateReference.itervalues ~CoordinateReference.keys ~CoordinateReference.match ~CoordinateReference.pop ~CoordinateReference.popitem ~CoordinateReference.remove_all_coords ~CoordinateReference.set ~CoordinateReference.setcoord ~CoordinateReference.setdefault ~CoordinateReference.structural_signature ~CoordinateReference.update ~CoordinateReference.values .. rubric:: Attributes .. autosummary:: ~CoordinateReference.T ~CoordinateReference.X ~CoordinateReference.Y ~CoordinateReference.Z ~CoordinateReference.hasbounds cf-python-1.3.2/docs/source/classes/cf.Comparison.rst0000600000175000017500000000055212430173161022734 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj cf.Comparison ============= .. autoclass:: cf.Comparison :no-members: :no-inherited-members: Comparison methods ------------------ .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~Comparison.addattr ~Comparison.copy ~Comparison.dump ~Comparison.evaluate cf-python-1.3.2/docs/source/classes/cf.AuxiliaryCoordinate.rst0000644000175000017500000000707712763331675024641 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj cf.AuxiliaryCoordinate ====================== .. autoclass:: cf.AuxiliaryCoordinate :no-members: :no-inherited-members: AuxiliaryCoordinate CF properties --------------------------------- .. autosummary:: :toctree: ../generated/ :template: attribute.rst ~cf.AuxiliaryCoordinate.add_offset ~cf.AuxiliaryCoordinate.axis ~cf.AuxiliaryCoordinate.calendar ~cf.AuxiliaryCoordinate.comment ~cf.AuxiliaryCoordinate._FillValue ~cf.AuxiliaryCoordinate.history ~cf.AuxiliaryCoordinate.leap_month ~cf.AuxiliaryCoordinate.leap_year ~cf.AuxiliaryCoordinate.long_name ~cf.AuxiliaryCoordinate.missing_value ~cf.AuxiliaryCoordinate.month_lengths ~cf.AuxiliaryCoordinate.positive ~cf.AuxiliaryCoordinate.scale_factor ~cf.AuxiliaryCoordinate.standard_name ~cf.AuxiliaryCoordinate.units ~cf.AuxiliaryCoordinate.valid_max ~cf.AuxiliaryCoordinate.valid_min ~cf.AuxiliaryCoordinate.valid_range AuxiliaryCoordinate attributes ------------------------------ .. autosummary:: :toctree: ../generated/ :template: attribute.rst ~cf.AuxiliaryCoordinate.array ~cf.AuxiliaryCoordinate.attributes ~cf.AuxiliaryCoordinate.bounds ~cf.AuxiliaryCoordinate.cellsize ~cf.AuxiliaryCoordinate.ctype ~cf.AuxiliaryCoordinate.data ~cf.AuxiliaryCoordinate.day ~cf.AuxiliaryCoordinate.dtarray ~cf.AuxiliaryCoordinate.dtype ~cf.AuxiliaryCoordinate.hour ~cf.AuxiliaryCoordinate.hardmask ~cf.AuxiliaryCoordinate.hasbounds ~cf.AuxiliaryCoordinate.isauxiliary ~cf.AuxiliaryCoordinate.isdimension ~cf.AuxiliaryCoordinate.isscalar ~cf.DimensionCoordinate.lower_bounds ~cf.AuxiliaryCoordinate.mask ~cf.AuxiliaryCoordinate.minute ~cf.AuxiliaryCoordinate.month ~cf.AuxiliaryCoordinate.ndim ~cf.AuxiliaryCoordinate.properties ~cf.AuxiliaryCoordinate.second ~cf.AuxiliaryCoordinate.shape ~cf.AuxiliaryCoordinate.size ~cf.AuxiliaryCoordinate.subspace ~cf.AuxiliaryCoordinate.T ~cf.AuxiliaryCoordinate.unique ~cf.AuxiliaryCoordinate.Units ~cf.DimensionCoordinate.upper_bounds ~cf.AuxiliaryCoordinate.varray ~cf.AuxiliaryCoordinate.X ~cf.AuxiliaryCoordinate.Y ~cf.AuxiliaryCoordinate.year ~cf.AuxiliaryCoordinate.Z AuxiliaryCoordinate methods --------------------------- .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.AuxiliaryCoordinate.asauxiliary ~cf.AuxiliaryCoordinate.asdimension ~cf.AuxiliaryCoordinate.binary_mask ~cf.AuxiliaryCoordinate.chunk ~cf.AuxiliaryCoordinate.clip ~cf.AuxiliaryCoordinate.close ~cf.AuxiliaryCoordinate.contiguous ~cf.AuxiliaryCoordinate.convert_reference_time ~cf.AuxiliaryCoordinate.copy ~cf.AuxiliaryCoordinate.cos ~cf.AuxiliaryCoordinate.datum ~cf.AuxiliaryCoordinate.delprop ~cf.AuxiliaryCoordinate.dump ~cf.AuxiliaryCoordinate.equals ~cf.AuxiliaryCoordinate.expand_dims ~cf.AuxiliaryCoordinate.files ~cf.AuxiliaryCoordinate.fill_value ~cf.AuxiliaryCoordinate.flip ~cf.AuxiliaryCoordinate.getprop ~cf.AuxiliaryCoordinate.hasprop ~cf.AuxiliaryCoordinate.HDF_chunks ~cf.AuxiliaryCoordinate.identity ~cf.AuxiliaryCoordinate.insert_bounds ~cf.AuxiliaryCoordinate.insert_data ~cf.AuxiliaryCoordinate.mask_invalid ~cf.AuxiliaryCoordinate.match ~cf.AuxiliaryCoordinate.name ~cf.AuxiliaryCoordinate.override_units ~cf.AuxiliaryCoordinate.select ~cf.AuxiliaryCoordinate.setprop ~cf.AuxiliaryCoordinate.sin ~cf.AuxiliaryCoordinate.squeeze ~cf.AuxiliaryCoordinate.transpose ~cf.AuxiliaryCoordinate.where cf-python-1.3.2/docs/source/classes/cf.Variable.rst0000644000175000017500000000411212757622406022370 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj cf.Variable =========== .. autoclass:: cf.Variable :no-members: :no-inherited-members: Variable CF Properties ---------------------- .. autosummary:: :toctree: ../generated/ :template: attribute.rst ~cf.Variable.add_offset ~cf.Variable.calendar ~cf.Variable.comment ~cf.Variable._FillValue ~cf.Variable.history ~cf.Variable.leap_month ~cf.Variable.leap_year ~cf.Variable.long_name ~cf.Variable.missing_value ~cf.Variable.month_lengths ~cf.Variable.scale_factor ~cf.Variable.standard_name ~cf.Variable.units ~cf.Variable.valid_max ~cf.Variable.valid_min ~cf.Variable.valid_range Variable attributes ------------------- .. autosummary:: :toctree: ../generated/ :template: attribute.rst ~cf.Variable.array ~cf.Variable.attributes ~cf.Variable.data ~cf.Variable.day ~cf.Variable.dtarray ~cf.Variable.dtype ~cf.Variable.hour ~cf.Variable.hardmask ~cf.Variable.isscalar ~cf.Variable.mask ~cf.Variable.minute ~cf.Variable.month ~cf.Variable.ndim ~cf.Variable.properties ~cf.Variable.second ~cf.Variable.shape ~cf.Variable.size ~cf.Variable.subspace ~cf.Variable.Units ~cf.Variable.varray ~cf.Variable.year Variable methods ---------------- .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Variable.binary_mask ~cf.Variable.chunk ~cf.Variable.clip ~cf.Variable.close ~cf.Variable.copy ~cf.Variable.cos ~cf.Variable.datum ~cf.Variable.delprop ~cf.Variable.dump ~cf.Variable.equals ~cf.Variable.expand_dims ~cf.Variable.files ~cf.Variable.fill_value ~cf.Variable.flip ~cf.Variable.getprop ~cf.Variable.hasprop ~cf.Variable.HDF_chunks ~cf.Variable.identity ~cf.Variable.insert_data ~cf.Variable.mask_invalid ~cf.Variable.match ~cf.Variable.name ~cf.Variable.override_units ~cf.Variable.select ~cf.Variable.setprop ~cf.Variable.sin ~cf.Variable.squeeze ~cf.Variable.transpose ~cf.Variable.unique ~cf.Variable.where cf-python-1.3.2/docs/source/classes/cf.Domain.rst0000600000175000017500000000222312603546021022027 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj cf.Domain ========= .. autoclass:: cf.Domain :no-members: :no-inherited-members: Domain methods -------------- .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Domain.analyse ~cf.Domain.axes ~cf.Domain.axis ~cf.Domain.axis_name ~cf.Domain.close ~cf.Domain.copy ~cf.Domain.ref_axes ~cf.Domain.data_axes ~cf.Domain.direction ~cf.Domain.directions ~cf.Domain.dump ~cf.Domain.dump_axes ~cf.Domain.dump_components ~cf.Domain.equals ~cf.Domain.equivalent ~cf.Domain.equivalent_refs ~cf.Domain.expand_dims ~cf.Domain.get ~cf.Domain.has ~cf.Domain.insert_aux ~cf.Domain.insert_axis ~cf.Domain.insert_coord ~cf.Domain.insert_dim ~cf.Domain.insert_measure ~cf.Domain.insert_ref ~cf.Domain.item ~cf.Domain.item_axes ~cf.Domain.items ~cf.Domain.map_axes ~cf.Domain.new_aux_identifier ~cf.Domain.new_axis_identifier ~cf.Domain.new_measure_identifier ~cf.Domain.new_ref_identifier ~cf.Domain.remove_axes ~cf.Domain.remove_axis ~cf.Domain.remove_item ~cf.Domain.remove_items cf-python-1.3.2/docs/source/classes/cf.List.rst0000600000175000017500000000142312603546021021534 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj cf.List ======= .. autoclass:: cf.List :no-members: :no-inherited-members: List methods ------------ .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.List.copy ~cf.List.count ~cf.List.delattr ~cf.List.equals ~cf.List.getattr ~cf.List.index ~cf.List.iter ~cf.List.method ~cf.List.setattr List list-like methods ---------------------- These methods provide functionality exactly as their counterparts in a built-in :py:obj:`list`. .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.List.append ~cf.List.extend ~cf.List.insert ~cf.List.pop ~cf.List.remove ~cf.List.reverse ~cf.List.sort cf-python-1.3.2/docs/source/classes/cf.CalendarYears.rst0000600000175000017500000000057712461710015023345 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj cf.CalendarYears ================ .. autoclass:: cf.CalendarYears :no-members: :no-inherited-members: CalendarYears methods --------------------- .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.CalendarYears.copy ~cf.CalendarYears.inspect ~cf.CalendarYears.interval cf-python-1.3.2/docs/source/classes/cf.CalendarMonths.rst0000600000175000017500000000060312461710007023521 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj cf.CalendarMonths ================= .. autoclass:: cf.CalendarMonths :no-members: :no-inherited-members: CalendarMonths methods ---------------------- .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.CalendarMonths.copy ~cf.CalendarMonths.inspect ~cf.CalendarMonths.interval cf-python-1.3.2/docs/source/classes/cf.CellMethods.rst0000600000175000017500000000252012603546021023023 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj cf.CellMethods ============== .. autoclass:: CellMethods :no-members: :no-inherited-members: CellMethods attributes ---------------------- .. autosummary:: :nosignatures: :toctree: ../generated/ :template: attribute.rst ~cf.CellMethods.axes ~cf.CellMethods.comment ~cf.CellMethods.intervals ~cf.CellMethods.method ~cf.CellMethods.names ~cf.CellMethods.over ~cf.CellMethods.where ~cf.CellMethods.within CellMethods methods ------------------- Undocumented methods behave exactly as their counterparts in a built-in list. .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.CellMethods.copy ~cf.CellMethods.dump ~cf.CellMethods.equals ~cf.CellMethods.equivalent ~cf.CellMethods.has_cellmethod ~cf.CellMethods.inspect ~cf.CellMethods.netcdf_translation CellMethods list-like methods ----------------------------- These methods provide functionality exactly as their counterparts in a built-in :py:obj:`list`. .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.CellMethods.append ~cf.CellMethods.count ~cf.CellMethods.extend ~cf.CellMethods.index ~cf.CellMethods.insert ~cf.CellMethods.pop ~cf.CellMethods.remove ~cf.CellMethods.reverse cf-python-1.3.2/docs/source/classes/cf.Flags.rst0000600000175000017500000000077312603546021021664 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj cf.Flags ======== .. autoclass:: Flags :no-members: :no-inherited-members: Flags attributes ---------------- .. autosummary:: :nosignatures: :toctree: ../generated/ :template: attribute.rst ~Flags.flag_masks ~Flags.flag_meanings ~Flags.flag_values Flags methods ------------- .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~Flags.copy ~Flags.dump ~Flags.equals ~Flags.sort cf-python-1.3.2/docs/source/classes/cf.Dict.rst0000600000175000017500000000140112603546021021500 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj cf.Dict ========= .. autoclass:: cf.Dict :no-members: :no-inherited-members: Dict methods ------------ .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Dict.copy ~cf.Dict.equals Dict dict-like methods ---------------------- These methods provide functionality exactly as their counterparts in a built-in :py:obj:`dict`. .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Dict.clear ~cf.Dict.get ~cf.Dict.has_key ~cf.Dict.items ~cf.Dict.iteritems ~cf.Dict.iterkeys ~cf.Dict.itervalues ~cf.Dict.keys ~cf.Dict.pop ~cf.Dict.popitem ~cf.Dict.setdefault ~cf.Dict.update ~cf.Dict.values cf-python-1.3.2/docs/source/classes/cf.TimeDuration.rst0000644000175000017500000000101412752572327023246 0ustar daviddavid00000000000000cf.TimeDuration =============== .. currentmodule:: cf .. autoclass:: TimeDuration .. automethod:: __init__ .. rubric:: Methods .. autosummary:: ~TimeDuration.__init__ ~TimeDuration.copy ~TimeDuration.equals ~TimeDuration.equivalent ~TimeDuration.inspect ~TimeDuration.interval ~TimeDuration.is_day_factor .. rubric:: Attributes .. autosummary:: ~TimeDuration.Units ~TimeDuration.isint ~TimeDuration.iso cf-python-1.3.2/docs/source/classes/cf.FieldList.rst0000644000175000017500000001523212763331675022531 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj .. _fieldlist: cf.FieldList ============ .. autoclass:: cf.FieldList :no-members: :no-inherited-members: .. _fieldlist_methods: Domain operations ----------------- **Domain axes** .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.FieldList.autocyclic Subspacing ---------- .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.FieldList.subspace Mathematical functions ---------------------- **Trigonometry** .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.FieldList.cos ~cf.FieldList.sin ~cf.FieldList.tan **Exponents and logarithms** .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.FieldList.exp ~cf.FieldList.log **Rounding** .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.FieldList.ceil ~cf.FieldList.floor ~cf.FieldList.rint ~cf.FieldList.trunc **Statistics** .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.FieldList.collapse **Miscellaneous mathematical functions** .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.FieldList.clip Data array operations --------------------- .. rubric:: Data array mask .. autosummary:: :nosignatures: :toctree: ../generated/ :template: attribute.rst ~cf.FieldList.binary_mask ~cf.FieldList.mask **Order and number of dimensions** .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.FieldList.expand_dims ~cf.FieldList.squeeze ~cf.FieldList.transpose ~cf.FieldList.unsqueeze **Rearranging elements** .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.FieldList.anchor ~cf.FieldList.flip ~cf.FieldList.roll Regridding operations --------------------- .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.FieldList.regrids Logic functions --------------- **Comparison** .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.FieldList.equals ~cf.FieldList.equivalent ~cf.FieldList.equivalent_data ~cf.FieldList.equivalent_domain Miscellaneous ------------- .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.FieldList.binary_mask ~cf.FieldList.chunk ~cf.FieldList.close cf.FieldList.concatenate ~cf.FieldList.convert_reference_time ~cf.FieldList.copy ~cf.FieldList.datum ~cf.FieldList.dump ~cf.FieldList.fill_value ~cf.FieldList.identity ~cf.FieldList.insert_data ~cf.FieldList.mask_invalid ~cf.FieldList.match ~cf.FieldList.name ~cf.FieldList.override_units ~cf.FieldList.override_calendar ~cf.FieldList.promote ~cf.FieldList.remove_data ~cf.FieldList.select ~cf.FieldList.weights ~cf.FieldList.where List-like operations -------------------- These methods provide functionality similar to that of a :ref:`built-in list `. .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.FieldList.append ~cf.FieldList.count ~cf.FieldList.extend ~cf.FieldList.index ~cf.FieldList.insert ~cf.FieldList.pop ~cf.FieldList.reverse ~cf.FieldList.sort ~cf.FieldList.__contains__ ~cf.FieldList.__getitem__ ~cf.FieldList.__len__ ~cf.FieldList.__setitem__ Arithmetic and comparison operations ------------------------------------ Any arithmetic, bitwise or comparison operation is applied independently to each field element of the field list In particular, the built-in :py:obj:`list` arithmetic and comparison operator behaviours do not apply. For example, adding ``2`` to a field list will add ``2`` to the data array of each of its fields, but the ``+`` operator will concatenate two built-in lists. **Comparison operators** .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.FieldList.__lt__ ~cf.FieldList.__le__ ~cf.FieldList.__eq__ ~cf.FieldList.__ne__ ~cf.FieldList.__gt__ ~cf.FieldList.__ge__ **Binary arithmetic operators** .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.FieldList.__add__ ~cf.FieldList.__sub__ ~cf.FieldList.__mul__ ~cf.FieldList.__div__ ~cf.FieldList.__truediv__ ~cf.FieldList.__floordiv__ ~cf.FieldList.__pow__ ~cf.FieldList.__mod__ **Binary arithmetic operators with reflected (swapped) operands** .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.FieldList.__radd__ ~cf.FieldList.__rsub__ ~cf.FieldList.__rmul__ ~cf.FieldList.__rdiv__ ~cf.FieldList.__rtruediv__ ~cf.FieldList.__rfloordiv__ ~cf.FieldList.__rpow__ ~cf.FieldList.__rmod__ **Augmented arithmetic assignments** .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.FieldList.__iadd__ ~cf.FieldList.__isub__ ~cf.FieldList.__imul__ ~cf.FieldList.__idiv__ ~cf.FieldList.__itruediv__ ~cf.FieldList.__ifloordiv__ ~cf.FieldList.__ipow__ ~cf.FieldList.__imod__ **Unary arithmetic operators** .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.FieldList.__neg__ ~cf.FieldList.__pos__ ~cf.FieldList.__abs__ **Binary bitwise operators** .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.FieldList.__and__ ~cf.FieldList.__or__ ~cf.FieldList.__xor__ ~cf.FieldList.__lshift__ ~cf.FieldList.__rshift__ **Binary bitwise operators with reflected (swapped) operands** .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.FieldList.__rand__ ~cf.FieldList.__ror__ ~cf.FieldList.__rxor__ ~cf.FieldList.__rlshift__ ~cf.FieldList.__rrshift__ **Augmented bitwise assignments** .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.FieldList.__iand__ ~cf.FieldList.__ior__ ~cf.FieldList.__ixor__ ~cf.FieldList.__ilshift__ ~cf.FieldList.__irshift__ **Unary bitwise operators** .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.FieldList.__invert__ Special methods --------------- .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.FieldList.__deepcopy__ ~cf.FieldList.__repr__ ~cf.FieldList.__str__ cf-python-1.3.2/docs/source/classes/cf.Query.rst0000644000175000017500000000072412752572327021756 0ustar daviddavid00000000000000cf.Query ======== .. currentmodule:: cf .. autoclass:: Query .. automethod:: __init__ .. rubric:: Methods .. autosummary:: ~Query.__init__ ~Query.addattr ~Query.copy ~Query.dump ~Query.equals ~Query.equivalent ~Query.evaluate ~Query.inspect .. rubric:: Attributes .. autosummary:: ~Query.attr ~Query.exact ~Query.operator ~Query.value cf-python-1.3.2/docs/source/classes/cf.CellMeasure.rst0000644000175000017500000000414012757622406023045 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj cf.CellMeasure ============== .. autoclass:: cf.CellMeasure :no-members: :no-inherited-members: CellMeasure CF properties ------------------------- .. autosummary:: :toctree: ../generated/ :template: attribute.rst ~cf.CellMeasure.add_offset ~cf.CellMeasure.calendar ~cf.CellMeasure.comment ~cf.CellMeasure._FillValue ~cf.CellMeasure.history ~cf.CellMeasure.leap_month ~cf.CellMeasure.leap_year ~cf.CellMeasure.long_name ~cf.CellMeasure.missing_value ~cf.CellMeasure.month_lengths ~cf.CellMeasure.scale_factor ~cf.CellMeasure.standard_name ~cf.CellMeasure.units ~cf.CellMeasure.valid_max ~cf.CellMeasure.valid_min ~cf.CellMeasure.valid_range CellMeasure attributes ---------------------- .. autosummary:: :toctree: ../generated/ :template: attribute.rst ~cf.CellMeasure.array ~cf.CellMeasure.data ~cf.CellMeasure.dtarray ~cf.CellMeasure.dtype ~cf.CellMeasure.hardmask ~cf.CellMeasure.isscalar ~cf.CellMeasure.mask ~cf.CellMeasure.ndim ~cf.CellMeasure.properties ~cf.CellMeasure.shape ~cf.CellMeasure.size ~cf.CellMeasure.subspace ~cf.CellMeasure.Units ~cf.CellMeasure.varray CellMeasure methods ------------------- .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.CellMeasure.binary_mask ~cf.CellMeasure.chunk ~cf.CellMeasure.clip ~cf.CellMeasure.close ~cf.CellMeasure.copy ~cf.CellMeasure.cos ~cf.CellMeasure.datum ~cf.CellMeasure.delprop ~cf.CellMeasure.dump ~cf.CellMeasure.equals ~cf.CellMeasure.expand_dims ~cf.CellMeasure.files ~cf.CellMeasure.fill_value ~cf.CellMeasure.flip ~cf.CellMeasure.getprop ~cf.CellMeasure.hasprop ~cf.CellMeasure.HDF_chunks ~cf.CellMeasure.identity ~cf.CellMeasure.insert_data ~cf.CellMeasure.mask_invalid ~cf.CellMeasure.match ~cf.CellMeasure.name ~cf.CellMeasure.override_units ~cf.CellMeasure.select ~cf.CellMeasure.setprop ~cf.CellMeasure.sin ~cf.CellMeasure.squeeze ~cf.CellMeasure.transpose ~cf.CellMeasure.where cf-python-1.3.2/docs/source/classes/cf.Data.rst0000644000175000017500000001230112757622406021513 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj cf.Data ======= .. autoclass:: cf.Data :no-members: :no-inherited-members: Data attributes --------------- .. autosummary:: :nosignatures: :toctree: ../generated/ :template: attribute.rst ~cf.Data.array ~cf.Data.data ~cf.Data.day ~cf.Data.dtarray ~cf.Data.dtype ~cf.Data.fill_value ~cf.Data.hardmask ~cf.Data.hour ~cf.Data.ismasked ~cf.Data.isscalar ~cf.Data.mask ~cf.Data.minute ~cf.Data.month ~cf.Data.nbytes ~cf.Data.ndim ~cf.Data.second ~cf.Data.shape ~cf.Data.size ~cf.Data.Units ~cf.Data.varray ~cf.Data.year Data methods ------------ .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Data.all ~cf.Data.allclose ~cf.Data.max ~cf.Data.min ~cf.Data.any ~cf.Data.binary_mask ~cf.Data.chunk ~cf.Data.ceil ~cf.Data.clip ~cf.Data.close ~cf.Data.copy ~cf.Data.cos ~cf.Data.datum ~cf.Data.dump ~cf.Data.dumpd ~cf.Data.equals ~cf.Data.equivalent ~cf.Data.expand_dims ~cf.Data.files ~cf.Data.flat ~cf.Data.flip ~cf.Data.floor ~cf.Data.func ~cf.Data.HDF_chunks ~cf.Data.isclose ~cf.Data.loadd ~cf.Data.mask_invalid ~cf.Data.mean ~cf.Data.mid_range ~cf.Data.ndindex ~cf.Data.outerproduct ~cf.Data.override_calendar ~cf.Data.override_units ~cf.Data.partition_boundaries ~cf.Data.range ~cf.Data.rint ~cf.Data.roll ~cf.Data.save_to_disk ~cf.Data.sample_size ~cf.Data.sd ~cf.Data.sin ~cf.Data.squeeze ~cf.Data.sum ~cf.Data.sum_of_weights ~cf.Data.sum_of_weights2 ~cf.Data.swapaxes ~cf.Data.tan ~cf.Data.to_disk ~cf.Data.to_memory ~cf.Data.transpose ~cf.Data.trunc ~cf.Data.unique ~cf.Data.var ~cf.Data.where Data static methods ------------------- .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Data.mask_fpe ~cf.Data.seterr Data arithmetic and comparison operations ----------------------------------------- Arithmetic, bitwise and comparison operations are defined as element-wise data array operations which yield a new `cf.Data` object or, for augmented assignments, modify the data array in-place. **Comparison operators** .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.Data.__lt__ ~cf.Data.__le__ ~cf.Data.__eq__ ~cf.Data.__ne__ ~cf.Data.__gt__ ~cf.Data.__ge__ **Truth value of an array** .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.Data.__nonzero__ **Binary arithmetic operators** .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.Data.__add__ ~cf.Data.__sub__ ~cf.Data.__mul__ ~cf.Data.__div__ ~cf.Data.__truediv__ ~cf.Data.__floordiv__ ~cf.Data.__pow__ ~cf.Data.__mod__ **Binary arithmetic operators with reflected (swapped) operands** .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.Data.__radd__ ~cf.Data.__rsub__ ~cf.Data.__rmul__ ~cf.Data.__rdiv__ ~cf.Data.__rtruediv__ ~cf.Data.__rfloordiv__ ~cf.Data.__rpow__ ~cf.Data.__rmod__ **Augmented arithmetic assignments** .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.Data.__iadd__ ~cf.Data.__isub__ ~cf.Data.__imul__ ~cf.Data.__idiv__ ~cf.Data.__itruediv__ ~cf.Data.__ifloordiv__ ~cf.Data.__ipow__ ~cf.Data.__imod__ **Unary arithmetic operators** .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.Data.__neg__ ~cf.Data.__pos__ ~cf.Data.__abs__ **Binary bitwise operators** .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.Data.__and__ ~cf.Data.__or__ ~cf.Data.__xor__ ~cf.Data.__lshift__ ~cf.Data.__rshift__ **Binary bitwise operators with reflected (swapped) operands** .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.Data.__rand__ ~cf.Data.__ror__ ~cf.Data.__rxor__ ~cf.Data.__rlshift__ ~cf.Data.__rrshift__ **Augmented bitwise assignments** .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.Data.__iand__ ~cf.Data.__ior__ ~cf.Data.__ixor__ ~cf.Data.__ilshift__ ~cf.Data.__irshift__ **Unary bitwise operators** .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.Data.__invert__ Data special methods -------------------- **Standard library functions** .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.Data.__deepcopy__ ~cf.Data.__hash__ **Container customization** .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.Data.__len__ ~cf.Data.__getitem__ ~cf.Data.__iter__ ~cf.Data.__setitem__ ~cf.Data.__contains__ **String representations** .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.Data.__repr__ ~cf.Data.__str__ cf-python-1.3.2/docs/source/classes/cf.Units.rst0000600000175000017500000000147712603546021021734 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj cf.Units ======== .. autoclass:: cf.Units :no-members: :no-inherited-members: Units attributes ---------------- .. autosummary:: :toctree: ../generated/ :template: attribute.rst ~Units.calendar ~Units.isdimensionless ~Units.islatitude ~Units.islongitude ~Units.ispressure ~Units.isreftime ~Units.istime ~Units.reftime ~Units.units Units methods ------------- .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Units.conform ~cf.Units.copy ~cf.Units.dump ~cf.Units.equals ~cf.Units.equivalent ~cf.Units.formatted ~cf.Units.log Units static methods -------------------- .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~Units.conform cf-python-1.3.2/docs/source/classes/cf.CoordinateBounds.rst0000644000175000017500000000543012757622406024111 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj cf.CoordinateBounds =================== .. autoclass:: cf.CoordinateBounds :no-members: :no-inherited-members: CoordinateBounds CF Properties ------------------------------ .. autosummary:: :toctree: ../generated/ :template: attribute.rst ~cf.CoordinateBounds.add_offset ~cf.CoordinateBounds.calendar ~cf.CoordinateBounds.comment ~cf.CoordinateBounds._FillValue ~cf.CoordinateBounds.history ~cf.CoordinateBounds.leap_month ~cf.CoordinateBounds.leap_year ~cf.CoordinateBounds.long_name ~cf.CoordinateBounds.missing_value ~cf.CoordinateBounds.month_lengths ~cf.CoordinateBounds.scale_factor ~cf.CoordinateBounds.standard_name ~cf.CoordinateBounds.units ~cf.CoordinateBounds.valid_max ~cf.CoordinateBounds.valid_min ~cf.CoordinateBounds.valid_range CoordinateBounds data attributes -------------------------------- .. autosummary:: :toctree: ../generated/ :template: attribute.rst ~cf.CoordinateBounds.array ~cf.CoordinateBounds.data ~cf.CoordinateBounds.dtarray ~cf.CoordinateBounds.dtype ~cf.CoordinateBounds.hardmask ~cf.CoordinateBounds.isscalar ~cf.CoordinateBounds.mask ~cf.CoordinateBounds.ndim ~cf.CoordinateBounds.shape ~cf.CoordinateBounds.size ~cf.CoordinateBounds.Units ~cf.CoordinateBounds.varray CoordinateBounds attributes --------------------------- .. autosummary:: :toctree: ../generated/ :template: attribute.rst ~cf.CoordinateBounds.attributes ~cf.CoordinateBounds.day ~cf.CoordinateBounds.hour ~cf.CoordinateBounds.minute ~cf.CoordinateBounds.month ~cf.CoordinateBounds.properties ~cf.CoordinateBounds.second ~cf.CoordinateBounds.subspace ~cf.CoordinateBounds.year CoordinateBounds methods ------------------------ .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.CoordinateBounds.binary_mask ~cf.CoordinateBounds.chunk ~cf.CoordinateBounds.clip ~cf.CoordinateBounds.close ~cf.CoordinateBounds.copy ~cf.CoordinateBounds.cos ~cf.CoordinateBounds.datum ~cf.CoordinateBounds.delprop ~cf.CoordinateBounds.dump ~cf.CoordinateBounds.equals ~cf.CoordinateBounds.expand_dims ~cf.CoordinateBounds.files ~cf.CoordinateBounds.fill_value ~cf.CoordinateBounds.flip ~cf.CoordinateBounds.getprop ~cf.CoordinateBounds.hasprop ~cf.CoordinateBounds.HDF_chunks ~cf.CoordinateBounds.identity ~cf.CoordinateBounds.insert_data ~cf.CoordinateBounds.mask_invalid ~cf.CoordinateBounds.match ~cf.CoordinateBounds.name ~cf.CoordinateBounds.override_units ~cf.CoordinateBounds.select ~cf.CoordinateBounds.setprop ~cf.CoordinateBounds.sin ~cf.CoordinateBounds.squeeze ~cf.CoordinateBounds.transpose ~cf.CoordinateBounds.where cf-python-1.3.2/docs/source/classes/cf.Datetime.rst0000600000175000017500000000076412603546021022364 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj cf.Datetime =========== .. autoclass:: cf.Datetime :no-members: :no-inherited-members: Datetime methods ---------------- .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Datetime.copy ~cf.Datetime.inspect ~cf.Datetime.timetuple Datetime class methods ---------------------- .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Datetime.utcnow cf-python-1.3.2/docs/source/classes/cf.Coordinate.rst0000644000175000017500000000527612757622406022746 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj cf.Coordinate ============= .. autoclass:: cf.Coordinate :no-members: :no-inherited-members: Coordinate CF properties ------------------------ .. autosummary:: :toctree: ../generated/ :template: attribute.rst ~cf.Coordinate.add_offset ~cf.Coordinate.axis ~cf.Coordinate.calendar ~cf.Coordinate.comment ~cf.Coordinate._FillValue ~cf.Coordinate.history ~cf.Coordinate.leap_month ~cf.Coordinate.leap_year ~cf.Coordinate.long_name ~cf.Coordinate.missing_value ~cf.Coordinate.month_lengths ~cf.Coordinate.positive ~cf.Coordinate.scale_factor ~cf.Coordinate.standard_name ~cf.Coordinate.units ~cf.Coordinate.valid_max ~cf.Coordinate.valid_min ~cf.Coordinate.valid_range Coordinate attributes --------------------- .. autosummary:: :toctree: ../generated/ :template: attribute.rst ~cf.Coordinate.array ~cf.Coordinate.attributes ~cf.Coordinate.bounds ~cf.Coordinate.cellsize ~cf.Coordinate.ctype ~cf.Coordinate.data ~cf.Coordinate.dtarray ~cf.Coordinate.dtype ~cf.Coordinate.day ~cf.Coordinate.hardmask ~cf.Coordinate.hasbounds ~cf.Coordinate.hour ~cf.Coordinate.isauxiliary ~cf.Coordinate.isdimension ~cf.Coordinate.isscalar ~cf.Coordinate.lower_bounds ~cf.Coordinate.mask ~cf.Coordinate.minute ~cf.Coordinate.month ~cf.Coordinate.ndim ~cf.Coordinate.properties ~cf.Coordinate.second ~cf.Coordinate.shape ~cf.Coordinate.size ~cf.Coordinate.subspace ~cf.Coordinate.T ~cf.Coordinate.unique ~cf.Coordinate.Units ~cf.Coordinate.upper_bounds ~cf.Coordinate.varray ~cf.Coordinate.X ~cf.Coordinate.Y ~cf.Coordinate.year ~cf.Coordinate.Z Coordinate methods ------------------ .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Coordinate.asauxiliary ~cf.Coordinate.asdimension ~cf.Coordinate.binary_mask ~cf.Coordinate.chunk ~cf.Coordinate.clip ~cf.Coordinate.close ~cf.Coordinate.contiguous ~cf.Coordinate.copy ~cf.Coordinate.cos ~cf.Coordinate.datum ~cf.Coordinate.delprop ~cf.Coordinate.dump ~cf.Coordinate.equals ~cf.Coordinate.expand_dims ~cf.Coordinate.files ~cf.Coordinate.fill_value ~cf.Coordinate.flip ~cf.Coordinate.getprop ~cf.Coordinate.hasprop ~cf.Coordinate.HDF_chunks ~cf.Coordinate.identity ~cf.Coordinate.insert_bounds ~cf.Coordinate.insert_data ~cf.Coordinate.mask_invalid ~cf.Coordinate.match ~cf.Coordinate.name ~cf.Coordinate.override_units ~cf.Coordinate.select ~cf.Coordinate.setprop ~cf.Coordinate.sin ~cf.Coordinate.squeeze ~cf.Coordinate.transpose ~cf.Coordinate.where cf-python-1.3.2/docs/source/classes/cf.AncillaryVariables.rst0000600000175000017500000000522012527132527024376 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj cf.AncillaryVariables ===================== .. autoclass:: cf.AncillaryVariables :no-members: :no-inherited-members: AncillaryVariables attributes ----------------------------- .. autosummary:: :toctree: ../generated/ :template: attribute.rst ~cf.AncillaryVariables.subspace AncillaryVariables methods -------------------------- .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.AncillaryVariables.append ~cf.AncillaryVariables.aux ~cf.AncillaryVariables.auxs ~cf.AncillaryVariables.axes ~cf.AncillaryVariables.binary_mask ~cf.AncillaryVariables.chunk ~cf.AncillaryVariables.clip ~cf.AncillaryVariables.close ~cf.AncillaryVariables.coord ~cf.AncillaryVariables.coords ~cf.AncillaryVariables.copy ~cf.AncillaryVariables.cos ~cf.AncillaryVariables.count ~cf.AncillaryVariables.data_axes ~cf.AncillaryVariables.datum ~cf.AncillaryVariables.delattr ~cf.AncillaryVariables.delprop ~cf.AncillaryVariables.dim ~cf.AncillaryVariables.dims ~cf.AncillaryVariables.dump ~cf.AncillaryVariables.equals ~cf.AncillaryVariables.expand_dims ~cf.AncillaryVariables.fill_value ~cf.AncillaryVariables.extend ~cf.AncillaryVariables.flip ~cf.AncillaryVariables.getattr ~cf.AncillaryVariables.getprop ~cf.AncillaryVariables.hasattr ~cf.AncillaryVariables.hasprop ~cf.AncillaryVariables.identity ~cf.AncillaryVariables.index ~cf.AncillaryVariables.indices ~cf.AncillaryVariables.insert ~cf.AncillaryVariables.insert_data ~cf.AncillaryVariables.item ~cf.AncillaryVariables.item_axes ~cf.AncillaryVariables.items ~cf.AncillaryVariables.iter ~cf.AncillaryVariables.mask_invalid ~cf.AncillaryVariables.match ~cf.AncillaryVariables.measure ~cf.AncillaryVariables.measures ~cf.AncillaryVariables.method ~cf.AncillaryVariables.name ~cf.AncillaryVariables.override_units ~cf.AncillaryVariables.pop ~cf.AncillaryVariables.ref ~cf.AncillaryVariables.refs ~cf.AncillaryVariables.remove ~cf.AncillaryVariables.remove_axes ~cf.AncillaryVariables.remove_axis ~cf.AncillaryVariables.remove_data ~cf.AncillaryVariables.remove_item ~cf.AncillaryVariables.remove_items ~cf.AncillaryVariables.reverse ~cf.AncillaryVariables.select ~cf.AncillaryVariables.set_equals ~cf.AncillaryVariables.setattr ~cf.AncillaryVariables.setprop ~cf.AncillaryVariables.sin ~cf.AncillaryVariables.sort ~cf.AncillaryVariables.squeeze ~cf.AncillaryVariables.subspace ~cf.AncillaryVariables.transpose ~cf.AncillaryVariables.unsqueeze ~cf.AncillaryVariables.where cf-python-1.3.2/docs/source/classes/cf.DimensionCoordinate.rst0000644000175000017500000000771512763331675024616 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj cf.DimensionCoordinate ====================== .. autoclass:: cf.DimensionCoordinate :no-members: :no-inherited-members: DimensionCoordinate CF properties --------------------------------- .. autosummary:: :toctree: ../generated/ :template: attribute.rst ~cf.DimensionCoordinate.add_offset ~cf.DimensionCoordinate.axis ~cf.DimensionCoordinate.calendar ~cf.DimensionCoordinate.comment ~cf.DimensionCoordinate._FillValue ~cf.DimensionCoordinate.history ~cf.DimensionCoordinate.leap_month ~cf.DimensionCoordinate.leap_year ~cf.DimensionCoordinate.long_name ~cf.DimensionCoordinate.missing_value ~cf.DimensionCoordinate.month_lengths ~cf.DimensionCoordinate.positive ~cf.DimensionCoordinate.scale_factor ~cf.DimensionCoordinate.standard_name ~cf.DimensionCoordinate.units ~cf.DimensionCoordinate.valid_max ~cf.DimensionCoordinate.valid_min ~cf.DimensionCoordinate.valid_range DimensionCoordinate attributes ------------------------------ .. autosummary:: :toctree: ../generated/ :template: attribute.rst ~cf.DimensionCoordinate.array ~cf.DimensionCoordinate.attributes ~cf.DimensionCoordinate.bounds ~cf.DimensionCoordinate.cellsize ~cf.DimensionCoordinate.ctype ~cf.DimensionCoordinate.data ~cf.DimensionCoordinate.day ~cf.DimensionCoordinate.dtarray ~cf.DimensionCoordinate.dtype ~cf.DimensionCoordinate.hour ~cf.DimensionCoordinate.hardmask ~cf.DimensionCoordinate.hasbounds ~cf.DimensionCoordinate.isauxiliary ~cf.DimensionCoordinate.isdimension ~cf.DimensionCoordinate.isscalar ~cf.DimensionCoordinate.lower_bounds ~cf.DimensionCoordinate.mask ~cf.DimensionCoordinate.minute ~cf.DimensionCoordinate.month ~cf.DimensionCoordinate.ndim ~cf.DimensionCoordinate.properties ~cf.DimensionCoordinate.second ~cf.DimensionCoordinate.shape ~cf.DimensionCoordinate.size ~cf.DimensionCoordinate.subspace ~cf.DimensionCoordinate.T ~cf.DimensionCoordinate.unique ~cf.DimensionCoordinate.Units ~cf.DimensionCoordinate.upper_bounds ~cf.DimensionCoordinate.varray ~cf.DimensionCoordinate.X ~cf.DimensionCoordinate.Y ~cf.DimensionCoordinate.year ~cf.DimensionCoordinate.Z DimensionCoordinate methods --------------------------- .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.DimensionCoordinate.asauxiliary ~cf.DimensionCoordinate.asdimension ~cf.DimensionCoordinate.binary_mask ~cf.DimensionCoordinate.chunk ~cf.DimensionCoordinate.clip ~cf.DimensionCoordinate.close ~cf.DimensionCoordinate.contiguous ~cf.DimensionCoordinate.convert_reference_time ~cf.DimensionCoordinate.copy ~cf.DimensionCoordinate.cos ~cf.DimensionCoordinate.datum ~cf.DimensionCoordinate.delprop ~cf.DimensionCoordinate.direction ~cf.DimensionCoordinate.dump ~cf.DimensionCoordinate.equals ~cf.DimensionCoordinate.expand_dims ~cf.DimensionCoordinate.files ~cf.DimensionCoordinate.fill_value ~cf.DimensionCoordinate.flip ~cf.DimensionCoordinate.get_bounds ~cf.DimensionCoordinate.getprop ~cf.DimensionCoordinate.hasprop ~cf.DimensionCoordinate.HDF_chunks ~cf.DimensionCoordinate.identity ~cf.DimensionCoordinate.insert_bounds ~cf.DimensionCoordinate.insert_data ~cf.DimensionCoordinate.match ~cf.DimensionCoordinate.max ~cf.DimensionCoordinate.mean ~cf.DimensionCoordinate.mid_range ~cf.DimensionCoordinate.min ~cf.DimensionCoordinate.name ~cf.DimensionCoordinate.override_units ~cf.DimensionCoordinate.period ~cf.DimensionCoordinate.range ~cf.DimensionCoordinate.sample_size ~cf.DimensionCoordinate.sd ~cf.DimensionCoordinate.select ~cf.DimensionCoordinate.setprop ~cf.DimensionCoordinate.sin ~cf.DimensionCoordinate.squeeze ~cf.DimensionCoordinate.sum ~cf.DimensionCoordinate.transpose ~cf.DimensionCoordinate.unique ~cf.DimensionCoordinate.var ~cf.DimensionCoordinate.where cf-python-1.3.2/docs/source/classes/cf.Field.rst0000644000175000017500000002547112765460072021677 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj cf.Field ======== .. autoclass:: cf.Field :no-members: :no-inherited-members: .. _field_cf_properties: CF Properties ------------- .. autosummary:: :toctree: ../generated/ :template: attribute.rst ~cf.Field.add_offset ~cf.Field.calendar ~cf.Field.cell_methods ~cf.Field.comment ~cf.Field.Conventions ~cf.Field._FillValue ~cf.Field.flag_masks ~cf.Field.flag_meanings ~cf.Field.flag_values ~cf.Field.history ~cf.Field.institution ~cf.Field.leap_month ~cf.Field.leap_year ~cf.Field.long_name ~cf.Field.missing_value ~cf.Field.month_lengths ~cf.Field.references ~cf.Field.scale_factor ~cf.Field.source ~cf.Field.standard_error_multiplier ~cf.Field.standard_name ~cf.Field.title ~cf.Field.units ~cf.Field.valid_max ~cf.Field.valid_min ~cf.Field.valid_range Setting, retrieving and deleting non-standard (and reserved) CF properties. .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Field.delprop ~cf.Field.getprop ~cf.Field.hasprop ~cf.Field.properties ~cf.Field.setprop .. _field_methods: Domain operations ----------------- .. rubric:: Domain object .. autosummary:: :nosignatures: :toctree: ../generated/ :template: attribute.rst ~cf.Field.domain .. rubric:: Domain axes .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Field.autocyclic ~cf.Field.axes ~cf.Field.axes_sizes ~cf.Field.axis ~cf.Field.axis_name ~cf.Field.axis_size ~cf.Field.cyclic ~cf.Field.data_axes ~cf.Field.insert_axis ~cf.Field.iscyclic ~cf.Field.item_axes ~cf.Field.items_axes ~cf.Field.period ~cf.Field.remove_axes ~cf.Field.remove_axis .. rubric:: Domain items A domain item is a dimension coordinate, auxiliary coordinate, cell measure or coordinate reference object. .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Field.aux ~cf.Field.auxs ~cf.Field.coord ~cf.Field.coords ~cf.Field.dim ~cf.Field.dims ~cf.Field.insert_aux ~cf.Field.insert_dim ~cf.Field.insert_measure ~cf.Field.insert_ref ~cf.Field.item ~cf.Field.items ~cf.Field.measure ~cf.Field.measures ~cf.Field.ref ~cf.Field.refs ~cf.Field.remove_item ~cf.Field.remove_items Subspacing ---------- .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Field.indices ~cf.Field.subspace Mathematical functions ---------------------- .. http://docs.scipy.org/doc/numpy/reference/routines.math.html .. rubric:: Trigonometry .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Field.cos ~cf.Field.sin ~cf.Field.tan .. rubric:: Exponents and logarithms .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Field.exp ~cf.Field.log .. rubric:: Rounding .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Field.ceil ~cf.Field.floor ~cf.Field.rint ~cf.Field.trunc .. rubric:: Statistics .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Field.collapse ~cf.Field.max ~cf.Field.mean ~cf.Field.mid_range ~cf.Field.min ~cf.Field.range ~cf.Field.sample_size ~cf.Field.sum ~cf.Field.sd ~cf.Field.var ~cf.Field.weights .. http://docs.scipy.org/doc/numpy/reference/routines.statistics.html .. rubric:: Miscellaneous mathematical functions .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Field.clip Data array operations --------------------- .. http://docs.scipy.org/doc/numpy/reference/routines.array-manipulation.html .. _field_data_array_access: .. rubric:: Data array access .. autosummary:: :nosignatures: :toctree: ../generated/ :template: attribute.rst ~cf.Field.array ~cf.Field.data ~cf.Field.datum ~cf.Field.dtype ~cf.Field.hasdata ~cf.Field.ndim ~cf.Field.shape ~cf.Field.size ~cf.Field.varray .. rubric:: Data array units .. autosummary:: :nosignatures: :toctree: ../generated/ :template: attribute.rst ~cf.Field.calendar ~cf.Field.units ~cf.Field.Units .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Field.override_units ~cf.Field.override_calendar .. rubric:: Data array mask .. autosummary:: :nosignatures: :toctree: ../generated/ :template: attribute.rst ~cf.Field.binary_mask ~cf.Field.hardmask ~cf.Field.mask .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Field.fill_value .. rubric:: Order and number of dimensions .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Field.expand_dims ~cf.Field.squeeze ~cf.Field.transpose ~cf.Field.unsqueeze .. rubric:: Changing data array values .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Field.indices ~cf.Field.mask_invalid ~cf.Field.subspace ~cf.Field.where .. rubric:: Adding and removing elements .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Field.unique .. rubric:: Rearranging elements .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Field.anchor ~cf.Field.flip ~cf.Field.roll .. rubric:: Miscellaneous data array operations .. autosummary:: :nosignatures: :toctree: ../generated/ :template: attribute.rst ~cf.Field.chunk ~cf.Field.insert_data ~cf.Field.isscalar ~cf.Field.remove_data Regridding operations --------------------- .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Field.regridc ~cf.Field.regrids Date-time operations -------------------- .. autosummary:: :nosignatures: :toctree: ../generated/ :template: attribute.rst ~cf.Field.day ~cf.Field.dtarray ~cf.Field.hour ~cf.Field.minute ~cf.Field.month ~cf.Field.second ~cf.Field.year .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Field.convert_reference_time Logic functions --------------- .. http://docs.scipy.org/doc/numpy/reference/routines.logic.html#truth-value-testing .. rubric:: Truth value testing .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Field.all ~cf.Field.any .. rubric:: Comparison .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Field.allclose ~cf.Field.equals ~cf.Field.equivalent ~cf.Field.equivalent_data ~cf.Field.equivalent_domain .. rubric:: Set operations .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Field.unique Miscellaneous ------------- .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Field.close cf.Field.concatenate ~cf.Field.copy ~cf.Field.dump ~cf.Field.field ~cf.Field.files ~cf.Field.HDF_chunks ~cf.Field.identity ~cf.Field.match ~cf.Field.name ~cf.Field.select ~cf.Field.unlimited .. autosummary:: :nosignatures: :toctree: ../generated/ :template: attribute.rst ~cf.Field.attributes ~cf.Field.Flags ~cf.Field.hasbounds ~cf.Field.isauxiliary ~cf.Field.isdimension ~cf.Field.ismeasure ~cf.Field.rank ~cf.Field.T ~cf.Field.X ~cf.Field.Y ~cf.Field.Z List-like operations -------------------- These methods view the field as a single element :ref:`field list `, e.g. ``f.count(g)`` is equivalent to ``cf.FieldList(f).count(g)``. .. autosummary:: :nosignatures: :toctree: ../generated/ :template: method.rst ~cf.Field.count ~cf.Field.index ~cf.Field.reverse ~cf.Field.sort ~cf.Field.__contains__ ~cf.Field.__getitem__ ~cf.Field.__len__ Arithmetic and comparison operations ------------------------------------ Arithmetic, bitwise and comparison operations are defined on a field as element-wise operations on its data array which yield a new `cf.Field` object or, for augmented assignments, modify the field's data array in-place. .. rubric:: Comparison operators .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.Field.__lt__ ~cf.Field.__le__ ~cf.Field.__eq__ ~cf.Field.__ne__ ~cf.Field.__gt__ ~cf.Field.__ge__ .. rubric:: Binary arithmetic operators .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.Field.__add__ ~cf.Field.__sub__ ~cf.Field.__mul__ ~cf.Field.__div__ ~cf.Field.__truediv__ ~cf.Field.__floordiv__ ~cf.Field.__pow__ ~cf.Field.__mod__ .. rubric:: Binary arithmetic operators with reflected (swapped) operands .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.Field.__radd__ ~cf.Field.__rsub__ ~cf.Field.__rmul__ ~cf.Field.__rdiv__ ~cf.Field.__rtruediv__ ~cf.Field.__rfloordiv__ ~cf.Field.__rpow__ ~cf.Field.__rmod__ .. rubric:: Augmented arithmetic assignments .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.Field.__iadd__ ~cf.Field.__isub__ ~cf.Field.__imul__ ~cf.Field.__idiv__ ~cf.Field.__itruediv__ ~cf.Field.__ifloordiv__ ~cf.Field.__ipow__ ~cf.Field.__imod__ .. rubric:: Unary arithmetic operators .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.Field.__neg__ ~cf.Field.__pos__ ~cf.Field.__abs__ .. rubric:: Binary bitwise operators .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.Field.__and__ ~cf.Field.__or__ ~cf.Field.__xor__ ~cf.Field.__lshift__ ~cf.Field.__rshift__ .. rubric:: Binary bitwise operators with reflected (swapped) operands .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.Field.__rand__ ~cf.Field.__ror__ ~cf.Field.__rxor__ ~cf.Field.__rlshift__ ~cf.Field.__rrshift__ .. rubric:: Augmented bitwise assignments .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.Field.__iand__ ~cf.Field.__ior__ ~cf.Field.__ixor__ ~cf.Field.__ilshift__ ~cf.Field.__irshift__ .. rubric:: Unary bitwise operators .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.Field.__invert__ Special methods --------------- .. autosummary:: :nosignatures: :toctree: generated/ :template: method.rst ~cf.Field.__deepcopy__ ~cf.Field.__repr__ ~cf.Field.__str__ cf-python-1.3.2/docs/source/classes/_templates/0000755000175000017500000000000012770523316021654 5ustar daviddavid00000000000000cf-python-1.3.2/docs/source/classes/_templates/cfbase.rst0000600000175000017500000000010612603546021023607 0ustar daviddavid00000000000000{{ fullname }} {{ underline }} .. auto{{ objtype }}:: {{ fullname }} cf-python-1.3.2/docs/source/classes/_templates/base.rst0000600000175000017500000000010612603546021023276 0ustar daviddavid00000000000000{{ fullname }} {{ underline }} .. auto{{ objtype }}:: {{ fullname }} cf-python-1.3.2/docs/source/field.rst0000600000175000017500000004412612770522175017700 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj .. _field_structure: Introduction to the `cf.Field` object ===================================== A `cf.Field` object stores a field as defined by the `CF-netCDF conventions `_ and the `CF data model `_. It is a container for a data array and metadata comprising properties to describe the physical nature of the data and a coordinate system (called a *domain*), which describes the positions of each element of the data array. It is structured in exactly the same way as a filed in the CF data model and, as in the CF data model, all components of a `cf.Field` object are optional. Displaying the contents ----------------------- The structure may be exposed with three different levels of detail. The built-in `repr` function returns a short, one-line description of the field: >>> f This gives the identity of the field (air_temperature), the identities and sizes of its data array axes (time, latitude and longitude with sizes 12, 64 and 128 respectively) and the units of the field's data array (K). The built-in `str` function returns the same information as the the one-line output, along with short descriptions of the field's other components: >>> print f air_temperature field summary ----------------------------- Data : air_temperature(time(1200), latitude(64), longitude(128)) K Cell methods : time: mean (interval: 1.0 month) Axes : time(12) = [ 450-11-01 00:00:00, ..., 451-10-16 12:00:00] noleap calendar : latitude(64) = [-87.8638000488, ..., 87.8638000488] degrees_north : longitude(128) = [0.0, ..., 357.1875] degrees_east : height(1) = [2.0] m This shows that the field has a cell method and four dimension coordinates, one of which (height) is a coordinate for a size 1 axis that is not a axis of the field's data array. The units and first and last values of the coordinates' data arrays are given and relative time values are translated into strings. The field's `~cf.Field.dump` method describes each component's properties, as well as the first and last values of the field's data array:: >>> f.dump() ====================== Field: air_temperature ====================== Axes: height(1) latitude(64) longitude(128) time(12) Data(time(12), latitude(64), longitude(128)) = [[[236.512756348, ..., 256.93371582]]] K cell_methods = time: mean (interval: 1.0 month) experiment_id = 'pre-industrial control experiment' long_name = 'Surface Air Temperature' standard_name = 'air_temperature' title = 'model output prepared for IPCC AR4' Dimension coordinate: time Data(time(12)) = [ 450-11-16 00:00:00, ..., 451-10-16 12:00:00] noleap calendar Bounds(time(12), 2) = [[ 450-11-01 00:00:00, ..., 451-11-01 00:00:00]] noleap calendar axis = 'T' long_name = 'time' standard_name = 'time' Dimension coordinate: latitude Data(latitude(64)) = [-87.8638000488, ..., 87.8638000488] degrees_north Bounds(latitude(64), 2) = [[-90.0, ..., 90.0]] degrees_north axis = 'Y' long_name = 'latitude' standard_name = 'latitude' Dimension coordinate: longitude Data(longitude(128)) = [0.0, ..., 357.1875] degrees_east Bounds(longitude(128), 2) = [[-1.40625, ..., 358.59375]] degrees_east axis = 'X' long_name = 'longitude' standard_name = 'longitude' Dimension coordinate: height Data(height(1)) = [2.0] m axis = 'Z' long_name = 'height' positive = 'up' standard_name = 'height' .. _fs-data-array: Data ---- A field's data array is a `cf.Data` object and is returned by its `~Field.data` attribute. >>> f.data The `cf.Data` object: * Contains an N-dimensional array with many similarities to a `numpy` array. * Contains the units of the array elements. * Uses :ref:`LAMA ` functionality to store and operate on arrays which are larger then the available memory. * Supports masked arrays [#f1]_, regardless of whether or not it was initialized with a masked array. Data attributes --------------- Some of a field's reserved attributes return information on its data. See the :ref:`list of reserved data attributes ` for details. For example, to find the shape of the data and to retrieve the data array as an actual `numpy` array: >>> f.shape (1, 3, 4) >>> f.array array([[[ 89., 80., 71.], [ 85., 76., 67.], [ 83., 74., 65.], [ 84., 75., 66.]]]) The data array's missing value mask may be retrieved with the `~Field.mask` attribute. The mask is returned as a new field with a boolean data array: >>> m = f.mask >>> m.data If the field contains no missing data then a mask field with False values is still returned. CF properties ------------- Standard CF data variable properties (such as `~cf.Field.standard_name`, `~cf.Field.units`, etc.) all have reserved attribute names. See the :ref:`list of reserved CF properties ` for details. These properties may be set, retrieved and deleted like normal python object attributes: >>> f.standard_name = 'air_temperature' >>> f.standard_name 'air_temperature' >>> del f.standard_name as well as with the dedicated `~Field.setprop`, `~Field.getprop` and `~Field.delprop` field methods: >>> f.setprop('standard_name', 'air_temperature') >>> f.getprop('standard_name') 'air_temperature' >>> f.delprop('standard_name') Non-standard CF properties *must* be accessed using these three methods: >>> f.setprop('foo', 'bar') >>> f.getprop('foo') 'bar' >>> f.delprop('foo') All of the field's CF properties may be retrieved with the field's `~Field.properties` attribute: >>> f.properties {'_FillValue': 1e+20, 'foo': 'bar', 'long_name': 'Surface Air Temperature', 'standard_name': 'air_temperature', 'units': 'K'} Other attributes ---------------- A field has other reserved attributes which have a variety of roles. See the :ref:`list of reserved attributes ` for details. Any unreserved attribute may be set on a field object with, in general, no special meaning attached to it. The following unreserved attributes do, however, have particular interpretations: ========= ============================================================== Attribute Description ========= ============================================================== `!file` The name of the file the field was read from `!id` An identifier for the field in the absence of a standard name. See the `~Field.identity` method for details. `!ncvar` A netCDF variable name of the field. ========= ============================================================== All of the field's attributes may be retrieved with the field's `~Field.attributes` attribute: >>> f.attributes {'ncar': 'tas'} Methods ------- A field has a large range of methods which, in general, either return information about the field or change the field in place. See the :ref:`list of methods ` and :ref:`manipulating fields ` section for details. .. _domain_structure: Domain structure ---------------- A field's domain completely describes the field's coordinate system and is stored in its `~Field.domain` attribute, the value of which is a `cf.Domain` object. It contains axes (which describe the field's dimensionality), dimension coordinate, auxiliary coordinate and cell measure objects (which themselves contain data arrays and properties to describe them) and coordinate reference objects (which relate the field's coordinate values to locations in a planetary reference frame). Each item has a unique internal identifier (is a string containing a number), which serves to link related items. Items ^^^^^ Domain items are stored in the following objects: =========================== ======================== Item `cf` object =========================== ======================== Dimension coordinate object `cf.DimensionCoordinate` Auxiliary coordinate object `cf.AuxiliaryCoordinate` Cell measure object `cf.CellMeasure` Coordinate reference object `cf.CoordinateReference` =========================== ======================== These items may be retrieved with a variety of methods, some specific to each item type (such as `cf.Field.dim`) and some more generic (such as `cf.Field.coords` and `cf.Field.item`): =========================== ================================================================== Item Field retrieval methods =========================== ================================================================== Dimension coordinate object `~Field.dim`, `~Field.dims`, `~Field.coord`, `~Field.coords` `~Field.item`, `~Field.items` Auxiliary coordinate object `~Field.aux`, `~Field.auxs`, `~Field.coord`, `~Field.coords` `~Field.item`, `~Field.items` Cell measure object `~Field.measure`, `~Field.measures`, `~Field.item`, `~Field.items` Coordinate reference object `~Field.ref`, `~Field.refs`, `~Field.item`, `~Field.items` =========================== ================================================================== In each case the singular method form (such as `~Field.aux`) returns an actual domain item whereas the plural method form (such as `~Field.auxs`) returns a dictionary whose keys are the domain item identifiers with corresponding values of the items themselves. For example, to retrieve a unique dimension coordinate object with a standard name of "time": >>> f.dim('time') To retrieve all coordinate objects and their domain identifiers: >>> f.coords() {'dim0': , 'dim1': , 'dim2': , 'dim3': } To retrieve all domain items and their domain identifiers: >>> f.items() {'dim0': , 'dim1': , 'dim2': , 'dim3': } In this example, all of the items happen to be coordinates. Axes ^^^^ Common axes of variation in the field's data array and the domain's items are defined by the domain's axes. Each axis has a domain identifier (such as ``'dim1'``) and an integer size and is stored in the domain's `!dimension_sizes` attribute: >>> f.domain.dimension_sizes {'dim1': 19, 'dim0': 12, 'dim2': 73, 'dim3': 96} Particular axes may be retrieved with the `~cf.Field.axes` method: >>> f.axes() set(['dim1', 'dim0' 'dim2' 'dim3']) >>> f.axes(size=19) set(['dim1']) >>> f.axes('time') set(['dim0']) The axes spanned by a domain item or the field's data array may be retrieved with the fields `~cf.Field.item_axes` or `~cf.Field.data_axes` methods respectively: >>> f.item_axes('time') ['dim0'] >>> f.data_axes() ['dim0', 'dim1' 'dim2' 'dim3'] Note that the field's data array may contain fewer size 1 axes than its domain. .. COMMENTED OUT .. _fs_field_list: Field list ---------- A `cf.FieldList` object is an ordered sequence of fields. It supports the :ref:`python list-like operations `. For example: >>> fl [, ] >>> fl[0] >>> fl[::-1] [, ] >>> len(fl) 2 >>> f = fl.pop() >>> f >>> len(fl) 1 >>> fl.append(f) >>> len(fl) 2 >>> f in fl True A field list, however, has :ref:`its own definitions ` of the arithmetic and comparison operators. Methods, attributes and CF properties ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ A field list object also has all of the callable methods, reserved attributes and reserved CF properties that a field object has. When used with a field list, a callable method (such as `~cf.FieldList.item`) or a reserved attribute or CF property (such as `~cf.FieldList.Units` or `~cf.FieldList.standard_name`) is applied independently to each field and, unless a method (or assignment to a reserved attribute or CF property) carries out an in-place change to each field, a sequence of the results is returned. The type of sequence that may be returned will either be a new `cf.FieldList` object or else a new `cf.List` object. For example, `cf.FieldList.subspace` will return a new field list of subspaced fields: >>> fl [, ] >>> fl.subspace[0, ...] [, ] whereas `cf.FieldList.ndim`, `cf.FieldList.standard_name` and `cf.FieldList.item` return a `cf.List` of integers, strings and domain items respectively: >>> fl.ndim [3, 3] >>> fl.standard_name ['air_temperature', 'air_pressure'] >>> fl.item('time') [, ] A `cf.List` object is very much like a built-in list, in that it has all of the built-in list methods, but it also has an extra method, called `~cf.List.method`, which allows any callable method (with arguments) to be applied independently to each element of the list, returning the result in a new `cf.List` object: >>> fl.standard_name[::-1] ['air_pressure', 'air_temperature'] >>> fl.standard_name.method('upper') ['AIR_TEMPERATURE', 'AIR_PRESSURE'] >>> fl.item('time').method('getprop', 'standard_name') ['time', 'time'] >>> fl.item('time').method('delrop') [None, None] >>> fl.item('time').method('setprop', 'standard_name', 'foo') [None, None] >>> fl.item('time').method('getprop', 'standard_name') ['foo', 'foo'] The `cf.FieldList` object also has an equivalent method called `~cf.FieldList.method` which behaves in an analogous way, thus reducing the need to know which type of sequence has been returned from a field list method: >>> fl.getprop('standard_name') == fl.method('getprop', 'standard_name') True Assignment to reserved attributes and CF properties assigns the value to each field in turn. Similarly, deletion is carried out on each field: >>> fl.standard_name ['air_pressure', 'air_temperature'] >>> fl.standard_name = 'foo' ['foo', 'foo'] >>> del fl.standard_name >>> fl.getprop('standard_name', 'MISSING') ['MISSING', 'MISSING'] Note that the new value is not copied prior to each field assignment, which may be an issue for values which are mutable objects. Changes tailored to each field in the list are easily carried out in a loop: >>> for f in fl: ... f.long_name = 'An even longer ' + f.long_name .. _fs-fl-a-and-c: Arithmetic and comparison ^^^^^^^^^^^^^^^^^^^^^^^^^ Any arithmetic and comparison operation is applied independently to each field element, so all of the :ref:`operators defined for a field ` are allowed. In particular, the usual :ref:`python list-like arithmetic and comparison operator behaviours ` do not apply. For example, the ``+`` operator will concatenate two built-in lists, but adding ``2`` to a field list will add ``2`` to the data array of each of its fields. For example these commands: >>> fl + 2 >>> 2 + fl >>> fl == 0 >>> fl += 2 are equivalent to: >>> cf.FieldList(f + 2 for f in fl) >>> cf.FieldList(2 + f for f in fl) >>> cf.FieldList(f == 0 for f in fl) >>> for f in fl: ... f += 2 Field versus field list ^^^^^^^^^^^^^^^^^^^^^^^ In some contexts, whether an object is a field or a field list is not known. So to avoid ungainly type testing, most aspects of the `cf.FieldList` interface are shared by a `cf.Field` object. A field may be used in the same iterative contexts as a field list: >>> f >>> f is f[0] True >>> f is f[slice(-1, None, -1)] True >>> f is f[::-1] True >>> for g in f: ... print repr(g) ... When it is not known whether or not you have a field or a field list, iterating over the output of a callable method could be complicated because the output of the field method will be a scalar when the output of the same field list method will be a sequence of scalars. The problem is illustrated in this example (note that ``f.standard_name`` is an alias for ``f.getprop('standard_name')``): >>> f = fl[0] >>> for x in f.standard_name: ... print x+'.', ... a.i.r._.p.r.e.s.s.u.r.e. >>> for x in fl.standard_name: ... print x+'.', ... air_pressure.air_temperature. To overcome this difficulty, both the field and field list have a method call `!iter` which has no effect on a field list, but which changes the output of a field's callable method (with arguments) into a single element sequence: >>> f = fl[0] >>> for x in f.iter('getprop', 'standard_name'): ... print x+'.', ... air_pressure. >>> for x in fl.iter('getprop', 'standard_name'): ... print x+'.', ... air_pressure.air_temperature. ---- .. rubric:: Footnotes .. [#f1] Arrays that may have missing or invalid entries cf-python-1.3.2/docs/source/further_examples.rst0000600000175000017500000001265512603546021022163 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj Further examples ================ Reading files ------------- The `cf.read` function will read `CF-netCDF `_ and `CFA-netCDF `_ files (or URLs if DAP access is enabled) and Met Office (UK) PP files and fields files from disk and return their contents as a field or a :ref:`field list `, i.e. an ordered collection of fields stored in a `cf.FieldList` object: >>> f = cf.read('data.nc') >>> f [, , , ] >>> f[-1] Multiple files may be read at once by using Unix shell wildcard characters in file names or providing a sequence of files: >>> f = cf.read('~/file.nc') >>> f = cf.read('file[1-9a-c].nc') >>> f = cf.read('dir*/*.pp') >>> f = cf.read(['file1.nc', 'file2.nc', 'file3*.nc']) File names may use environment variables and ``~`` expansion: >>> f = cf.read('~/*.nc') >>> f = cf.read('$DATA/*.nc') >>> f = cf.read('$DATA/${MORE_DATA}/*.nc') >>> f = cf.read('~/$DATA/${MORE_DATA}/*.nc') For each file, the file format is inferred from the file contents, not from the file name suffix. Writing files ------------- The `cf.write` function will write a field or field list to a CF-netCDF or CFA-netCDF file on disk: >>> cf.write(f, 'newfile.nc') A sequence of fields and field lists may be written to the same file: >>> cf.write([f, g], 'newfile.nc') All of the input fields are written to the same output file, but if metadata (such as coordinates) are identical in two or more fields then that metadata is only written once to the output file. Output file names are arbitrary (in particular, they do not require a suffix). CF properties and attributes ---------------------------- The field's CF properties are those which are intended to be essential metadata for the data array and would be included as data variable properties in a CF compliant netCDF file (such as `~Field.standard_name`). The field's attributes are any other attributes, such as the names of the files containing the data array values. The CF properties are returned by the field's `~Field.properties` attribute: >>> f.properties {'_FillValue': 1e+20, 'cell_methods': , 'standard_name': 'air_temperature', 'units': 'K'} A CF property *recognised by the CF conventions* or an attribute may be set, retrieved and deleted as standard python object attributes: >>> f.standard_name = 'air_temperature' >>> f.standard_name 'air_temperature' >>> del f.standard_name >>> getattr(f, 'standard_name') AttributeError: Field doesn't have CF property 'long_name' >>> getattr(f, 'standard_name', 'air_pressure') 'air_pressure' >>> setattr(f, 'standard_name', 'air_pressure') >>> f.ncvar = 'tas' >>> getattr(f, 'ncvar') 'tas' >>> del f.ncvar Any CF property (recognised by the CF conventions or not) may be set, retrieved and deleted with the field's `~Field.setprop`, `~Field.getprop` and `~Field.delprop` methods: >>> f.properties {} >>> f.setprop('long_name', 'temperature at 1.5m') >>> f.getprop('long_name') 'temperature at 1.5m' >>> f.delprop('long_name') >>> f.getprop('long_name') AttributeError: Field doesn't have CF property 'long_name' >>> f.getprop('long_name', 'pressure') 'pressure' >>> f.setprop('long_name', 'pressure') >>> f.setprop('foo', 'bar') >>> f.properties {'foo': 'bar', 'long_name': 'pressure'} Selecting fields ---------------- Fields may be selected with the `~cf.Field.match` and `~cf.Field.select` methods. These methods take conditions on field CF properties, attributes and coordinates as inputs: >>> f [, ] >>> f.match('air') [False, True] >>> g = f.select('air_temperature', items={'longitude': 0}) >>> g [] The data array -------------- The field's data array may be retrieved as an independent numpy array with the field's `~Field.array` attribute: >>> print f.array [[ 2. 4.] [ 5. 1.]] A particular element of the data array may be retrieved with the field's `~cf.Field.datum` method: >>> f.datum(0) 2.0 >>> f.datum(-1) 1.0 >>> f.datum(0, 1) 4.0 Coordinates ----------- A dimension or auxiliary coordinate object of the field's domain may be returned by the field's `~cf.Field.coord` method. A coordinate object has the same CF property and data access principles as a field: >>> c = f.coord('time') >>> c >>> c.properties {'_FillValue': None, 'axis': 'T', 'bounds': , 'calendar': 'noleap', 'long_name': 'time', 'standard_name': 'time', 'units': 'days since 0000-1-1'} >>> c.Units >>> print c.array [ 0 30 60 90 120 150 180 210 240 270 300 330] .. _creating-a-field: Creating a field ---------------- A new field may be created by initializing a new `cf.Field` instance. See the section on :ref:`field creation ` for details. cf-python-1.3.2/docs/source/field_manipulation.rst0000644000175000017500000010740312770522310022455 0ustar daviddavid00000000000000.. set tocdepth in sidebar :tocdepth: 2 .. currentmodule:: cf .. default-role:: obj .. _manipulating-fields: Manipulating `cf.Field` objects =============================== Manipulating a field generally involves operating on its data array and making any necessary changes to the field's domain to make it consistent with the new array. Data array ---------- Conversion to a numpy array ^^^^^^^^^^^^^^^^^^^^^^^^^^^ A field's data array may be converted to either an independent numpy array or a numpy array view (`numpy.ndarray.view`) with its `~Field.array` and `~Field.varray` attributes respectively: >>> a = f.array >>> print a [[2 -- 4 -- 6]] >>> a[0, 0] = 999 >>> print a [[999 -- 4 -- 6]] >>> print f.array [[2 -- 4 -- 6]] Changing the numpy array view in place will also change the field's data array in-place: >>> v = f.varray >>> print v [[2 -- 4 -- 6]] >>> v[0, 0] = 999 >>> print f.array [[999 -- 4 -- 6]] A field exposes the numpy array interface and so may be used as input to any of the `numpy array creation functions `_: >>> print f.array [[2 -- 4 -- 6]] >>> numpy.all(f.array) True >>> numpy.all(f) True .. note:: The numpy array created by the `~Field.varray` or `~Field.array` attributes forces all of the data to be read into memory at the same time, which may not be possible for very large arrays. Data mask ^^^^^^^^^ A copy of a field's missing data mask is returned by its `~cf.Field.mask` attribute. This mask is an independent field in its own right, and so changes to it will not be seen by the field which generated it. See the :ref:`assignment section ` for details on how to edit the field's mask in place. Copying ------- A deep copy of a field may be created with its `~Field.copy` method, which is functionally equivalent to, but faster than, using the :py:obj:`copy.deepcopy` function: >>> g = f.copy() >>> import copy >>> g = copy.deepcopy(f) Copying utilizes :ref:`LAMA copying functionality `. .. _Subspacing: Subspacing ---------- Subspacing a field means subspacing its data array and its domain in a consistent manner. A field may be subspaced via its `~Field.subspace` attribute. This attribute returns an object which may be :ref:`indexed ` to select a subspace by data array index values (``f.subspace[indices]``) or :ref:`called ` to select a subspace by dimension coordinate array values (``f.subspace(**coordinate_values)``): >>> g = f.subspace[0, ...] >>> g = f.subspace(latitude=30, longitude=cf.wi(0, 90, 'degrees')) The result of subspacing a field is a new, independent field whose data array and, crucially, any data arrays within the field's metadata (such as coordinates, ancillary variables, coordinate references, *etc.*) are appropriate subspaces of their originals: >>> print f air_temperature field summary ----------------------------- Data : air_temperature(time(12), latitude(73), longitude(96)) K Cell methods : time: mean Axes : time(12) = [1860-01-16 12:00:00, ..., 1860-12-16 12:00:00] : latitude(73) = [-90, ..., 90] degrees_north : longitude(96) = [0, ..., 356.25] degrees_east : height(1) = [2] m >>> g = f.subspace[-1, :, 48::-1] >>> print g air_temperature field summary ----------------------------- Data : air_temperature(time(1), latitude(73), longitude(49)) K Cell methods : time: mean Axes : time(1) = [1860-12-16 12:00:00] : latitude(73) = [-90, ..., 90] degrees_north : longitude(49) = [180, ..., 0] degrees_east : height(1) = [2] m Subspacing utilizes :ref:`LAMA subspacing functionality `. .. _indexing: Indexing ^^^^^^^^ Subspacing by axis indices uses an extended Python slicing syntax, which is similar to :ref:`numpy array indexing `: >>> f.shape (12, 73, 96) >>> f.subspace[...].shape (12, 73, 96) >>> f.subspace[slice(0, 12), :, 10:0:-2].shape (12, 73, 5) >>> f.subspace[..., f.coord('longitude')<180].shape (12, 73, 48) There are three extensions to the numpy indexing functionality: * Size 1 axes are never removed. An integer index *i* takes the *i*-th element but does not reduce the rank of the output array by one: >>> f.shape (12, 73, 96) >>> f.subspace[0].shape (1, 73, 96) >>> f.subspace[3, slice(10, 0, -2), 95:93:-1].shape (1, 5, 2) * The indices for each axis work independently. When more than one axis’s slice is a 1-d boolean sequence or 1-d sequence of integers, then these indices work independently along each axis (similar to the way vector subscripts work in Fortran), rather than by their elements: >>> f.shape (12, 73, 96) >>> f.subspace[:, [0, 72], [5, 4, 3]].shape (12, 2, 3) Note that the indices of the last example would raise an error when given to a numpy array. * Boolean indices may be any object which exposes the numpy array interface, such as the field's coordinate objects: >>> f.subspace[:, f.coord('latitude')<0].shape (12, 36, 96) .. _calling: Coordinate values ^^^^^^^^^^^^^^^^^ Subspacing by values of 1-d coordinates allows a subspaced field to be defined via coordinate values of its domain. The benefits of subspacing in this fashion are: * The axes to be subspaced may identified by name. * The position in the data array of each axis need not be known and the axes to be subspaced may be given in any order. * Axes for which no subspacing is required need not be specified. * Size 1 axes of the domain which are not spanned by the data array may be specified. Coordinate values are provided as keyword arguments to a call to the `~Field.subspace` attribute. Coordinates are identified by their `~Coordinate.identity` or their axis's identifier in the field's domain. >>> f.subspace().shape (12, 73, 96) >>> f.subspace(latitude=0).shape (12, 1, 96) >>> f.subspace(latitude=cf.wi(-30, 30)).shape (12, 25, 96) >>> f.subspace(long=cf.ge(270, 'degrees_east'), lat=cf.set([0, 2.5, 10])).shape (12, 3, 24) >>> f.subspace(latitude=cf.lt(0, 'degrees_north')) (12, 36, 96) >>> f.subspace(latitude=[cf.lt(0, 'degrees_north'), 90]) (12, 37, 96) >>> import math >>> f.subspace('exact', longitude=cf.lt(math.pi, 'radian'), height=2) (12, 73, 48) >>> f.subspace(height=cf.gt(3)) IndexError: No indices found for 'height' values gt 3 >>> f.subspace(dim2=3.75).shape (12, 1, 96) >>> f.subspace(time=cf.le(cf.dt('1860-06-16 12:00:00')).shape (6, 73, 96) >>> f.subspace(time=cf.gt(cf.dt(1860, 7)),shape (5, 73, 96) Note that if a comparison function (such as `cf.wi`) does not specify any units, then the units of the named coordinate are assumed. .. _fm_cyclic_axes: Cyclic axes ----------- >>> f.subspace[..., -10, 10] (12, 25, 96) >>> f.subspace(longitude=cf.wi(-30, 30)) (12, 3, 24) >>> f.subspace(long=cf.ge(270, 'degrees_east'), lat=cf.set([0, 2.5, 10])).shape (12, 3, 24) .. _fm_assignment: Assignment ---------- Elements of a field's data array may be changed by assigning values directly to a subspace of the field defined by the `~cf.Field.subspace` attribute or by using the `~cf.Field.where` method. Assignment uses :ref:`LAMA functionality `, so it is possible to assign to fields which are larger than the available memory. Array elements may be set from a field or logically scalar object, using the same :ref:`metadata-aware broadcasting rules ` as for field arithmetic and comparison operations. In the `~cf.Field.subspace` case, the object attribute must be broadcastable to the defined subspace, whilst in the `~cf.Field.where` case the object must be broadcastable to the field itself. The treatment of missing data elements depends on the value of field's `~cf.Field.hardmask` attribute. If it is True then masked elements will not unmasked, otherwise masked elements may be set to any value. In either case, unmasked elements may be set to any value (including missing data). Set all values to 273.15: >>> f.subspace[...] = 273.15 or equivalently: >>> f.where(True, 273.15, None, i=True) Set all negative data array values to zero and leave all other elements unchanged: >>> g = f.where(f<0, 0) Double the values in the northern hemisphere: >>> index = f.indices(longitude=cf.ge(0)) >>> f.subspace[index] *= 2 See `cf.Field.where` for more examples. Selection --------- Field selection ^^^^^^^^^^^^^^^ Fields from field lists may be selected according to conditions on their metadata with the `cf.FieldList.select` method (as well as the `cf.Field.select` method). Conditions may be given on attributes and CF properties, domain items of the field (dimension coordinate, auxiliary coordinate, cell measure or coordinate reference objects), the number of field domain axes and the number of field data array axes. For example: >>> f [, ] >>> f.select('air_temperature') ] >>> f.select('air_temperature', rank=2) [] >>> f.select('air_temperature', items={'latitude': cf.gt(0)}, rank=cf.ge(3)) Any of the `~FieldList.select` arguments may also be used with `cf.read` to select fields when reading from files: >>> f = cf.read('file*.nc', select='air_temperature') >>> f = cf.read('file*.nc', select_options={'rank': cf.gt(2)}) >>> f = cf.read('file*.nc', select='air_temperature', select_options={'rank': cf.gt(2)}) This may be faster than reading all fields and then selecting afterwards. Domain item selection ^^^^^^^^^^^^^^^^^^^^^ Domain items may be retrieved with a variety of methods, some specific to each item type (such as `cf.Field.dim`) and some more generic (such as `cf.Field.coords` and `cf.Field.item`): =========================== ================================================================== Item Field retrieval methods =========================== ================================================================== Dimension coordinate object `~Field.dim`, `~Field.dims`, `~Field.coord`, `~Field.coords` `~Field.item`, `~Field.items` Auxiliary coordinate object `~Field.aux`, `~Field.auxs`, `~Field.coord`, `~Field.coords` `~Field.item`, `~Field.items` Cell measure object `~Field.measure`, `~Field.measures`, `~Field.item`, `~Field.items` Coordinate reference object `~Field.ref`, `~Field.refs`, `~Field.item`, `~Field.items` =========================== ================================================================== In each case the singular method form (such as `~Field.aux`) returns an actual domain item whereas the plural method form (such as `~Field.auxs`) returns a dictionary whose keys are the domain item identifiers with corresponding values of the items themselves. For example, to retrieve a unique dimension coordinate object with a standard name of "time": >>> f.dim('time') To retrieve all coordinate objects and their domain identifiers: >>> f.coords() {'dim0': , 'dim1': , 'dim2': , 'dim3': } To retrieve all domain items and their domain identifiers: >>> f.items() {'dim0': , 'dim1': , 'dim2': , 'dim3': } In this example, all of the items happen to be coordinates. Aggregation ----------- Fields are aggregated into as few multidimensional fields as possible with the `cf.aggregate` function, which implements the `CF aggregation rules `_. >>> f [, ] >>> print f air_temperature field summary ----------------------------- Data : air_temperature(time(12), latitude(73), longitude(96)) K Cell methods : time: mean AXes : time(12) = [1860-01-16 12:00:00, ..., 1860-12-16 12:00:00] : latitude(73) = [-90, ..., 90] degrees_north : longitude(96) = [0, ..., 356.25] degrees_east : height(1) = [2] m air_temperature field summary ----------------------------- Data : air_temperature(latitude(73), longitude(96)) K @ 273.15 Cell methods : time: mean Axes : time(12) = [1859-12-16 12:00:00] : longitude(96) = [356.25, ..., 0] degrees_east : latitude(73) = [-90, ..., 90] degrees_north : height(1) = [2] m ... >>> g = cf.aggregate(f) >>> g [] >>> print g air_temperature field summary ----------------------------- Data : air_temperature(time(13), latitude(73), longitude(96)) K Cell methods : time: mean Axes : time(13) = [1859-12-16 12:00:00, ..., 1860-12-16 12:00:00] : latitude(73) = [-90, ..., 90] degrees_north : longitude(96) = [0, ..., 356.25] degrees_east : height(1) = [2] m By default, the fields returned by `cf.read` have been aggregated: >>> f = cf.read('file*.nc') >>> len(f) 1 >>> f = cf.read('file*.nc', aggregate=False) >>> len(f) 12 .. _Arithmetic-and-comparison: Arithmetic and comparison ------------------------- Arithmetic, bitwise and comparison operations are defined on a field as element-wise operations on its data array which yield a new `cf.Field` object or, for augmented assignments, modify the field's data array in-place. A field's data array is modified in a very similar way to how a numpy array would be modified in the same operation, i.e. :ref:`broadcasting ` ensures that the operands are compatible and the data array is modified element-wise. Broadcasting is metadata-aware and will automatically account for arbitrary configurations, such as axis order, but will not allow fields with incompatible metadata to be combined, such as adding a field of height to one of temperature. The :ref:`resulting field's metadata ` will be very similar to that of the operands which are also fields. Differences arise when the existing metadata can not correctly describe the newly created field. For example, when dividing a field with units of *metres* by one with units of *seconds*, the resulting field will have units of *metres per second*. Arithmetic and comparison utilizes :ref:`LAMA functionality ` so data arrays larger than the available physical memory may be operated on. .. _broadcasting: Broadcasting ^^^^^^^^^^^^ The term broadcasting describes how data arrays of the operands with different shapes are treated during arithmetic, comparison and assignment operations. Subject to certain constraints, the smaller array is "broadcast" across the larger array so that they have compatible shapes. The general broadcasting rules are similar to the :mod:`broadcasting rules implemented in numpy `, the only difference occurring when both operands are fields, in which case the fields are temporarily conformed so that: * The fields have matching units. * Axes are aligned according to their coordinates' metadata to ensure that matching axes are broadcast against each other. * Common axes have matching axis directions. This restructuring of the field ensures that the matching axes are broadcast against each other. Broadcasting is done without making needless copies of data and so is usually very efficient. Valid operands ^^^^^^^^^^^^^^ A field may be combined or compared with the following objects: +----------------+----------------------------------------------------+ | Object | Description | +================+====================================================+ |:py:obj:`int`, | The field's data array is combined with | |:py:obj:`long`, | the python scalar | |:py:obj:`float` | | +----------------+----------------------------------------------------+ |`cf.Data` | The field's data array | |with size 1 | is combined with the `cf.Data` object's scalar | | | value, taking into account: | | | | | | * Different but equivalent units | +----------------+----------------------------------------------------+ |`cf.Field` | The two field's must satisfy the field combination | | | rules. The fields' data arrays and domains are | | | combined taking into account: | | | | | | * Axis identities | | | * Array units | | | * Axis orders | | | * Axis directions | | | * Missing data values | +----------------+----------------------------------------------------+ A field may appear on the left or right hand side of an operator. .. warning:: Combining a numpy array on the *left* with a field on the *right* does work, but will give generally unintended results -- namely a numpy array of fields. .. _resulting_metadata: Resulting metadata ^^^^^^^^^^^^^^^^^^ When creating a new field which has different physical properties to the input field(s) the units will also need to be changed: >>> f.units 'K' >>> f += 2 >>> f.units 'K' >>> f.units 'K' >>> f **= 2 >>> f.units 'K2' >>> f.units, g.units ('m', 's') >>> h = f / g >>> h.units 'm s-1' When creating a new field which has a different domain to the input fields, the new domain will in general contain the superset of the axes of the two input fields, but may not have some of either input field's auxiliary coordinates or size 1 dimension coordinates. Refer to the field combination rules for details. .. _floating_point_errors: Floating point errors ^^^^^^^^^^^^^^^^^^^^^ It is possible to set the action to take when an arithmetic operation produces one of the following floating-point errors: .. tabularcolumns:: |l|l| ================= ================================= Error Description ================= ================================= Division by zero Infinite result obtained from finite numbers. Overflow Result too large to be expressed. Invalid operation Result is not an expressible number, typically indicates that a NaN was produced. Underflow Result so close to zero that some precision was lost. ================= ================================= For each type of error, one of the following actions may be chosen: * Take no action. Allows invalid values to occur in the result data array. * Print a `RuntimeWarning` (via the Python `warnings` module). Allows invalid values to occur in the result data array. * Raise a `FloatingPointError` exception. The treatment of floating-point errors is set with `cf.Data.seterr`. Converting invalid numbers to masked values after an arithmetic operation may be done with the `cf.Field.mask_invalid` method. It is also possible to mask invalid numbers during arithmetic operations (see `cf.Data.mask_fpe`). Note that these setting apply to all data array arithmetic within the `cf` package. Statistical operations ---------------------- Axes of a field may be collapsed by statistical methods with the `cf.Field.collapse` method. Collapsing an axis involves reducing its size with a given (typically statistical) method. By default all axes with size greater than 1 are collapsed completely with the given method. For example, to find the minumum of the data array: >>> g = f.collapse('min') By default the calculations of means, standard deviations and variances use a combination of volume, area and linear weights based on the field's metadata. For example to find the mean of the data array, weighted where possible: >>> g = f.collapse('mean') Specific weights may be forced with the weights parameter. For example to find the variance of the data array, weighting the X and Y axes by cell area, the T axis linearly and leaving all other axes unweighted: >>> g = f.collapse('variance', weights=['area', 'T']) A subset of the axes may be collapsed. For example, to find the mean over the time axis: >>> f >>> g = f.collapse('T: mean') >>> g For example, to find the maximum over the time and height axes: >>> g = f.collapse('T: Z: max') or, equivalently: >>> g = f.collapse('max', axes=['T', 'Z']) An ordered sequence of collapses over different (or the same) subsets of the axes may be specified. For example, to first find the mean over the time axis and subequently the standard deviation over the latitude and longitude axes: >>> g = f.collapse('T: mean area: sd') or, equivalently, in two steps: >>> g = f.collapse('mean', axes='T').collapse('sd', axes='area') Grouped collapses are possible, whereby groups of elements along an axis are defined and each group is collapsed independently. The collapsed groups are concatenated so that the collapsed axis in the output field has a size equal to the number of groups. For example, to find the variance along the longitude axis within each group of size 10 degrees: >>> g = f.collapse('longitude: variance', group=cf.Data(10, 'degrees')) Climatological statistics (a type of grouped collapse) as defined by the CF conventions may be specified. For example, to collapse a time axis into multiannual means of calendar monthly minima: >>> g = f.collapse('time: minimum within years T: mean over years', ... within_years=cf.M()) In all collapses, missing data array elements are accounted for in the calculation. The following collapse methods are available, over any subset of the axes: ========================= ===================================================== Method Notes ========================= ===================================================== Maximum The maximum of the values. Minimum The minimum of the values. Sum The sum of the values. Mid-range The average of the maximum and the minimum of the values. Range The absolute difference between the maximum and the minimum of the values. Mean The unweighted mean, :math:`m`, of :math:`N` values :math:`x_i` is .. math:: m=\frac{1}{N}\sum_{i=1}^{N} x_i The weighted mean, :math:`\tilde{m}`, of :math:`N` values :math:`x_i` with corresponding weights :math:`w_i` is .. math:: \tilde{m}=\frac{1}{\sum_{i=1}^{N} w_i} \sum_{i=1}^{N} w_i x_i Standard deviation The unweighted standard deviation, :math:`s`, of :math:`N` values :math:`x_i` with mean :math:`m` and with :math:`N-ddof` degrees of freedom (:math:`ddof\ge0`) is .. math:: s=\sqrt{\frac{1}{N-ddof} \sum_{i=1}^{N} (x_i - m)^2} The weighted standard deviation, :math:`\tilde{s}_N`, of :math:`N` values :math:`x_i` with corresponding weights :math:`w_i`, weighted mean :math:`\tilde{m}` and with :math:`N` degrees of freedom is .. math:: \tilde{s}_N=\sqrt{\frac{1} {\sum_{i=1}^{N} w_i} \sum_{i=1}^{N} w_i(x_i - \tilde{m})^2} The weighted standard deviation, :math:`\tilde{s}`, of :math:`N` values :math:`x_i` with corresponding weights :math:`w_i` and with :math:`N-ddof` degrees of freedom :math:`(ddof>0)` is .. math:: \tilde{s}=\sqrt{ \frac{a \sum_{i=1}^{N} w_i}{a \sum_{i=1}^{N} w_i - ddof}} \tilde{s}_N where :math:`a` is the smallest positive number whose product with each weight is an integer. :math:`a \sum_{i=1}^{N} w_i` is the size of a new sample created by each :math:`x_i` having :math:`aw_i` repeats. In practice, :math:`a` may not exist or may be difficult to calculate, so :math:`a` is either set to a predetermined value or an approximate value is calculated (see `cf.Field.collapse` for details). Variance The variance is the square of the standard deviation. Sample size The sample size, :math:`N`, as would be used for other statistical calculations. Sum of weights The sum of sample weights, :math:`\sum_{i=1}^{N} w_i`, as would be used for other statistical calculations. Sum of squares of weights The sum of squares of sample weights, :math:`\sum_{i=1}^{N} {w_i}^{2}`, as would be used for other statistical calculations. ========================= ===================================================== See `cf.Field.collapse` for more details. Regridding operations --------------------- A field may be regridded onto a new latitude-longitude grid: >>> f >>> g >>> h = f.regrids(g) >>> h By default the interpolation is first-order conservative, but bilinear interpolation is also possible. The missing data masks of the field and the new grid are aslo taken into account. See `cf.Field.regrids` for more details. .. _units: Units ----- A field (as well as any other object which :ref:`inherits ` from `cf.Variable`) always contains a `cf.Units` object which gives the physical units of the values contained in its data array. The `cf.Units` object is stored in the field's `~Field.Units` attribute but may also be accessed through the field's `~Field.units` and `~Field.calendar` CF properties, which may take any value allowed by the `CF conventions `_. In particular, the value of the `~Field.units` CF property is a string that can be recognized by `UNIDATA's Udunits-2 package `_, with a few exceptions for greater consistency with CF. These are detailed by the `cf.Units` object. Assignment ^^^^^^^^^^ The Field's units may be assigned directly to its `cf.Units` object: >>> f.Units.units = 'days since 1-1-1' >>> f.Units.calendar = 'noleap' >>> f.Units = cf.Units('metre') But the same result is achieved by assigning to the field's `~Field.units` and `~Field.calendar` CF properties: >>> f.units = 'days since 1-1-1' >>> f.calendar = 'noleap' >>> f.Units >>> f.units 'days since 1-1-1' >>> f.calendar 'noleap' Time units ^^^^^^^^^^ Time units may be given as durations of time or as an amount of time since a reference time: >>> f.units = 'day' >>> f.units = 'seconds since 1992-10-8 15:15:42.5 -6:00' .. note:: It is recommended that the units ``'year'`` and ``'month'`` be used with caution, as explained in the following excerpt from the CF conventions: "The Udunits package defines a year to be exactly 365.242198781 days (the interval between 2 successive passages of the sun through vernal equinox). It is not a calendar year. Udunits includes the following definitions for years: a common_year is 365 days, a leap_year is 366 days, a Julian_year is 365.25 days, and a Gregorian_year is 365.2425 days. For similar reasons the unit ``'month'``, which is defined to be exactly year/12, should also be used with caution." The date given in reference time units is always associated with one of the calendars recognized by the CF conventions and may be set with the *calendar* CF property (on the field or Units object). If the calendar is not set then, as in the CF conventions, for the purposes of calculation and comparison, it defaults to the mixed Gregorian/Julian calendar as defined by Udunits: >>> f.units = 'days since 2000-1-1' >>> f.calendar AttributeError: Can't get 'Field' attribute 'calendar' >>> g.units = 'days since 2000-1-1' >>> g.calendar = 'gregorian' >>> g.Units.equals(f.Units) True The calendar is ignored for units other than reference time units. Changing units ^^^^^^^^^^^^^^ Changing units to equivalent units causes the variable's data array values to be modified in place (if required) when they are next accessed, and not before: >>> f.units 'metre' >>> f.array array([ 0., 1000., 2000., 3000., 4000.]) >>> f.units = 'kilometre' >>> f.units 'kilometre' >>> f.array array([ 0., 1., 2., 3., 4.]) >>> f.units 'hours since 2000-1-1' >>> f.array array([-1227192., -1227168., -1227144.]) >>> f.units = 'days since 1860-1-1' >>> f.array array([ 1., 2., 3.]) The `cf.Units` object may be operated on with augmented arithmetic assignments and binary arithmetic operations: >>> f.units 'kelvin' >>> f.array array([ 273.15, 274.15, 275.15, 276.15, 277.15]) >>> f.Units -= 273.15 >>> f.units 'K @ 273.15' >>> f.array array([ 0., 1., 2., 3., 4.]) >>> f.Units = f.Units + 273.15 >>> f.units 'K' >>> f.array array([ 273.15, 274.15, 275.15, 276.15, 277.15]) >>> f.units = 'K @ 237.15' 'K @ 273.15' >>> f.array array([ 0., 1., 2., 3., 4.]) If the field has a data array and its units are changed to non-equivalent units then a :py:mod:`TypeError` will be raised when the data are next accessed: >>> f.units 'm s-1' >>> f.units = 'K' >>> f.array TypeError: Units are not convertible: , Overriding units ^^^^^^^^^^^^^^^^ If the units are incorrect, either due to a data manipulation or an incorrect encoding, it is possible to replace the existing units with new units, which don't have to be equivalent, without altering the data values: >>> f.units 'mm/day' >>> f.mean() >>> g = f.override_units('kg m-2 s-1') >>> g.mean() >>> g.override_units('watts m-2', i=True) >>> g.mean() Overriding the calendar of reference time units is done in a similar manner: >>> f.calendar '360_day' >>> f.array.min() 59.0 >>> f.min() >>> g = f.override_calandar('gregorian') >>> g.array.min() 59.0 >>> g.min() Note that in this case the data values have remained unchanged, but their date-time interpretation has been redefined. See `cf.Field.override_units` and `cf.Field.override_calendar` for details. Equality and equivalence of units ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The `cf.Units` object has methods for assessing whether two units are equivalent or equal, regardless of their exact string representations. Two units are equivalent if and only if numeric values in one unit are convertible to numeric values in the other unit (such as ``'kilometres'`` and ``'metres'``). Two units are equal if and only if they are equivalent and their conversion is a scale factor of 1 (such as ``'kilometres'`` and ``'1000 metres'``). Note that equivalence and equality are based on internally stored binary representations of the units, rather than their string representations. >>> f.units = 'm/s' >>> g.units = 'm s-1' >>> f.Units == g.Units True >>> f.Units.equals(g.Units) True >>> g.units = 'km s-1' >>> f.Units.equivalent(g.Units) False >>> f.units = 'days since 1987-12-3' >>> g.units = 'hours since 2000-12-1' >>> f.Units == g.Units False >>> f.Units.equivalent(g.Units) True Coordinate units ^^^^^^^^^^^^^^^^ The units of a coordinate's bounds are always the same as the coordinate itself, and the units of the bounds automatically change when a coordinate's units are changed: >>> c.units 'degrees' >>> c.bounds.units 'degrees' >>> c.bounds.array array([ 0., 90.]) >>> c.units = 'radians' >>> c.bounds.units 'radians' >>> c.bounds.array array([ 0. , 1.57079633]) Manipulating other variables ---------------------------- A field is a subclass of `cf.Variable`, and that class and other subclasses of `cf.Variable` share generally similar behaviours and methods: ======================== =============================================== Class Description ======================== =============================================== `cf.AuxiliaryCoordinate` A CF auxiliary coordinate construct. `cf.CellMeasure` A CF cell measure construct containing information that is needed about the size, shape or location of the field's cells. `cf.Coordinate` Base class for storing a coordinate. `cf.CoordinateBounds` A CF coordinate's bounds object containing cell boundaries or intervals of climatological time. `cf.DimensionCoordinate` A CF dimension coordinate construct. `cf.Variable` Base class for storing a data array with metadata. ======================== =============================================== In general, different axis identities, different axis orders and different axis directions are not considered, since these objects do not contain a coordinate system required to define these properties (unlike a field). Coordinates ^^^^^^^^^^^ Coordinates are a special case as they may contain a data array for their coordinate bounds which needs to be treated consistently with the main coordinate array. If a coordinate has bounds then all coordinate methods also operate on the bounds in a consistent manner: >>> c >>> c.bounds >>> d = c.subspace[0:10] >>> d.shape (10, 96) >>> d.bounds.shape (10, 96, 4) >>> d.transpose([1, 0]) >>> d.shape (96, 10) >>> d.bounds.shape (96, 10, 4) .. note:: If the coordinate bounds are operated on independently, care should be taken not to break consistency with the parent coordinate. cf-python-1.3.2/docs/source/_static/0000755000175000017500000000000012770523316017510 5ustar daviddavid00000000000000cf-python-1.3.2/docs/source/_static/default.css0000600000175000017500000001034112611506114021624 0ustar daviddavid00000000000000/* * default.css_t * ~~~~~~~~~~~~~ * * Sphinx stylesheet -- default theme. * * :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @import url("basic.css"); /* -- page layout ----------------------------------------------------------- */ body { font-family: sans-serif; font-size: 100%; background-color: #11303d; color: #000; margin: 0; padding: 0; } div.document { background-color: #F2F2F2; } div.documentwrapper { float: left; width: 100%; } div.bodywrapper { margin: 0 0 0 230px; } div.body { background-color: #ffffff; color: #000000; padding: 0 20px 30px 20px; } div.footer { color: #ffffff; width: 100%; padding: 9px 0 9px 0; text-align: center; font-size: 75%; } div.footer a { color: #ffffff; text-decoration: underline; } div.related { background-color: #5682AD; line-height: 30px; color: #ffffff; } div.related a { color: #ffffff; } div.sphinxsidebar { top: 30px; bottom: 0; margin: 0; position: fixed; overflow: auto; height: auto; } /* this is nice, but it it leads to hidden headings when jumping to an anchor */ /* div.related { position: fixed; } div.documentwrapper { margin-top: 30px; } */ div.sphinxsidebar h3 { font-family: 'Trebuchet MS', sans-serif; color: #777777; font-size: 1.4em; font-weight: normal; margin: 0; padding: 0; } div.sphinxsidebar h3 a { color: #777777; } div.sphinxsidebar h4 { font-family: 'Trebuchet MS', sans-serif; color: #777777; font-size: 1.3em; font-weight: normal; margin: 5px 0 0 0; padding: 0; } div.sphinxsidebar p { color: #777777; } div.sphinxsidebar p.topless { margin: 5px 10px 10px 10px; } div.sphinxsidebar ul { margin: 10px; padding: 0; color: #777777; } div.sphinxsidebar a { color: #003469; } div.sphinxsidebar input { border: 1px solid #003469; font-family: sans-serif; font-size: 1em; } /* -- hyperlink styles ------------------------------------------------------ */ a { color: #355f7c; text-decoration: none; } a:visited { color: #355f7c; text-decoration: none; } a:hover { text-decoration: underline; } /* -- body styles ----------------------------------------------------------- */ div.body h1, div.body h2, div.body h3, div.body h4, div.body h5, div.body h6 { font-family: 'Trebuchet MS', sans-serif; background-color: #FFFFFF; font-weight: normal; color: #000000; border-bottom: 1px solid #ccc; margin: 20px -20px 10px -20px; padding: 3px 0 3px 10px; } div.body h1 { margin-top: 0; font-size: 200%; } div.body h2 { font-size: 160%; } div.body h3 { font-size: 140%; } div.body h4 { font-size: 120%; } div.body h5 { font-size: 110%; } div.body h6 { font-size: 100%; } a.headerlink { color: #c60f0f; font-size: 0.8em; padding: 0 4px 0 4px; text-decoration: none; } a.headerlink:hover { background-color: #c60f0f; color: white; } div.body p, div.body dd, div.body li { text-align: justify; line-height: 130%; } div.admonition p.admonition-title + p { display: inline; } div.admonition p { margin-bottom: 5px; } div.admonition pre { margin-bottom: 5px; } div.admonition ul, div.admonition ol { margin-bottom: 5px; } div.note { background-color: #eee; border: 1px solid #ccc; } div.seealso { background-color: #ffc; border: 1px solid #ff6; } div.topic { background-color: #eee; } div.warning { background-color: #ffe4e4; border: 1px solid #f66; } p.admonition-title { display: inline; } p.admonition-title:after { content: ":"; } pre { padding: 5px; background-color: #eeffcc; color: #333333; line-height: 120%; border: 1px solid #ac9; border-left: none; border-right: none; } tt { background-color: #ecf0f3; padding: 0 1px 0 1px; font-size: 0.95em; } th { background-color: #F2F2F2; } .warning tt { background: #efc2c2; } .note tt { background: #d6d6d6; } .viewcode-back { font-family: sans-serif; } div.viewcode-block:target { background-color: #f4debf; border-top: 1px solid #ac9; border-bottom: 1px solid #ac9; }cf-python-1.3.2/docs/source/_static/copybutton.js0000600000175000017500000000463112611506114022237 0ustar daviddavid00000000000000$(document).ready(function() { /* Add a [>>>] button on the top-right corner of code samples to hide * the >>> and ... prompts and the output and thus make the code * copyable. */ var div = $('.highlight-python .highlight,' + '.highlight-python3 .highlight') var pre = div.find('pre'); // get the styles from the current theme pre.parent().parent().css('position', 'relative'); var hide_text = 'Hide the prompts and output'; var show_text = 'Show the prompts and output'; var border_width = pre.css('border-top-width'); var border_style = pre.css('border-top-style'); var border_color = pre.css('border-top-color'); var button_styles = { 'cursor':'pointer', 'position': 'absolute', 'top': '0', 'right': '0', 'border-color': border_color, 'border-style': border_style, 'border-width': border_width, 'color': border_color, 'text-size': '75%', 'font-family': 'monospace', 'padding-left': '0.2em', 'padding-right': '0.2em' } // create and add the button to all the code blocks that contain >>> div.each(function(index) { var jthis = $(this); if (jthis.find('.gp').length > 0) { var button = $('>>>'); button.css(button_styles) button.attr('title', hide_text); jthis.prepend(button); } // tracebacks (.gt) contain bare text elements that need to be // wrapped in a span to work with .nextUntil() (see later) jthis.find('pre:has(.gt)').contents().filter(function() { return ((this.nodeType == 3) && (this.data.trim().length > 0)); }).wrap(''); }); // define the behavior of the button when it's clicked $('.copybutton').toggle( function() { var button = $(this); button.parent().find('.go, .gp, .gt').hide(); button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'hidden'); button.css('text-decoration', 'line-through'); button.attr('title', show_text); }, function() { var button = $(this); button.parent().find('.go, .gp, .gt').show(); button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'visible'); button.css('text-decoration', 'none'); button.attr('title', hide_text); }); }); cf-python-1.3.2/docs/source/lama.rst0000600000175000017500000001651412603546021017516 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj .. _LAMA: Large Amounts of Massive Arrays (LAMA) ====================================== Data arrays contained within fields are stored and manipulated in a very memory efficient manner such that large numbers of fields may co-exist and be manipulated regardless of the size of their data arrays. The limiting factor on array size is not the amount of available physical memory, but the amount of disk space available, which is generally far greater. The basic functionality is: * **Arrays larger than the available physical memory may be created.** Arrays larger than a preset number of bytes are partitioned into smaller sub-arrays which are not kept in memory but stored on disk, either as part of the original file they were read in from or as newly created temporary files, whichever is appropriate. Therefore data arrays larger than a preset size need never wholly exist in memory. * **Large numbers of arrays which are in total larger than the available physical memory may co-exist.** Large numbers of data arrays which are collectively larger than the available physical memory may co-exist, regardless of whether any individual array is in memory or stored on disk. * **Arrays larger than the available physical memory may be operated on.** Array operations (such as subspacing, assignment, arithmetic, comparison, collapses, etc.) are carried out on a partition-by-partition basis. When an operation traverses the partitions, if a partition is stored on disk then it is returned to disk before processing the next partition. * **The memory management does not need to be known at the API level.** As the array's metadata (such as size, shape, data-type, number of dimensions, etc.) always reflect the data array in its entirety, regardless of how the array is partitioned and whether or not its partitions are in memory, fields and other variables containing data arrays may be used in the API as if they were normal, in-memory objects (like numpy arrays). Partitioning does carry a performance overhead, but this may be minimised for particular applications or hardware configurations. .. _LAMA_reading: Reading from files ------------------ When a field is read from a file, the data array is not realized in memory, however large or small it may be. Instead each partition refers to part of the original file on disk. Therefore reading even very large fields is initially very fast and uses up only a very small amount of memory. .. _LAMA_copying: Copying ------- When a field is deep copied with its `~Field.copy` method or the :py:func:`copy.deepcopy` function, the partitions of its data array are transferred to the new field as object identities and are *not* deep copied. Therefore copying even very large fields is initially very fast and uses up only a very small amount of memory. The independence of the copied field is preserved, however, since each partition that is stored in memory (as opposed to on disk) is deep copied if and when the data in the new field is actually accessed, and then only if the partition's data still exists in the original (or any other) field. Aggregation ----------- When two fields are aggregated to form one, larger field there is no need for either field's data array partitions to be accessed, and therefore brought into memory if they were stored on disk. The resulting field recombines the two fields' array partitions as object identities into the new larger array. Therevy creating an aggregated field that uses up only a very small amount of extra memory. The independence of the new field is preserved, however, since each partition that is stored in memory (as opposed to on disk) is deep copied when the data in the new field is actually accessed, and then only if the partition's data still exists in its the original (or any other) field. .. _LAMA_subspacing: Subspacing ---------- When a new field is created by :ref:`subspacing ` a field, the new field is actually a :ref:`LAMA deep copy ` of the original but with additional instructions on each of its data partitions to only use the part specified by the subspace indices. As with copying, creating subspaced fields is initially very fast and uses up only a very small amount of memory, with the added advantage that a deep copy of only the requested parts of the data array needs to be carried out at the time of data access, and then only if the partition's data still exists in the original field. When subspacing a field that has previously been subspacing but has not yet had its data accessed, the new subspace merely updates the instructions on which parts of the array partitions to use. For example: >>> f.shape = (12, 73, 96) >>> g = f.subspace[::-2, ...] >>> h = g.subspace[2:5, ...] is equivalent to >>> h = f.subspace[7:2:-2, ...] and if all of the partitions of field ``f`` are stored on disk then in both cases so are all of the partitions of field ``h`` and no data has been read from disk. Speed and memory management --------------------------- The creation of temporary files for array partitions of large arrays and the reading of data from files on disk can create significant speed overheads (for example, recent tests show that writing a 100 megabyte array to disk can take O(1) seconds), so it may be desirable to configure the maximum size of array which is kept in memory, and therefore has fast access. The data array memory management is configurable as follows: * Data arrays larger than a given size are partitioned into sub-arrays, each of which is smaller than the chunk size. By default this size is set to 1% of the total physical memory and is found and set with the `cf.CHUNKSIZE` function. * In-memory sub-arrays may be written to tempoary files on disk when the amount of available physical memory falls below a specified amount. By default this amount is 10% of the total physical memory and is found and set with the `cf.MINNCFCM` function. .. _LAMA_temporary_files: Temporary files ^^^^^^^^^^^^^^^ The directory in which temporary files is found and set with the `cf.TEMPDIR` function: >>> cf.TEMPDIR() '/tmp' >>> cf.TEMPDIR('/home/me/tmp') >>> cf.TEMPDIR() '/home/me/tmp' The removal of temporary files which are no longer required works in the same way as python's automatic garbage collector. When a partition's data is stored in a temporary file, that file will only exist for as long as there are partitions referring to it. When no partitions require the file it will be deleted automatically. When python exits normally, all temporary files are always deleted. Changing the temporary file directory does not prevent temporary files in the original directory from being garbage collected. Partitioning ^^^^^^^^^^^^ To maximise looping efficiency, array partitioning preserves as much as is possible the faster varying (inner) dimensions' sizes in each of the sub-arrays. **Examples** If an array with shape (2, 4, 6) is partitioned into 2 partitions then both sub-arrays will have shape (1, 4, 6). If the same array is partitioned into 4 partitions then all four sub-arrays will have shape (1, 2, 6). If the same array is partitioned into 8 partitions then all eight sub-arrays will have shape (1, 2, 3). If the same array is partitioned into 48 partitions then all forty eight sub-arrays will have shape (1, 1, 1). cf-python-1.3.2/docs/source/pp_library_mappings.rst0000600000175000017500000005443712527620662022664 0ustar daviddavid00000000000000.. currentmodule:: cf .. default-role:: obj .. |midlman| replace:: http://climate.ncas.ac.uk/cgi-bin/midlman? .. _pp_library_mappings: +------------------+----------------------------------------+----------------------------------------------------+ | Object | | Description | +==================+========================================+====================================================+ || `!ppa` | | `cf.read` | || `!ppasooc` | | | || `!ncassoc` | | | +------------------+----------------------------------------+----------------------------------------------------+ || `!ppw` | | `cf.write` | +------------------+----------------------------------------+----------------------------------------------------+ || `!pp_area_avg` | | `cf.Field.collapse` | +------------------+----------------------------------------+----------------------------------------------------+ || `!pats_area_avg`| | `cf.Field.collapse` | +------------------+----------------------------------------+----------------------------------------------------+ || `!pp_vol_avg` | | `cf.Field.collapse` | +------------------+----------------------------------------+----------------------------------------------------+ || `!pp_extract` | | `cf.Field.subspace` | +------------------+----------------------------------------+----------------------------------------------------+ || `!pp_ff` | ``pp_ff('5.7*(a/AVG(b))', pp1, pp2)`` | | +------------------+----------------------------------------+----------------------------------------------------+ || `!pp_regrid | | `cf.Field.regrid` +------------------+----------------------------------------+----------------------------------------------------+ =============================== ======================================================================= ppp cfp =============================== ======================================================================= `!ppa` `cf.read` `!ppasooc` `cf.read` `!ncassoc` `cf.read` `!ppw` `cf.write` `!pp_area_avg` `cf.Field.collapse` `!pats_area_avg` `cf.Field.collapse` `!pp_vol_avg` `cf.Field.collapse` `!pp_extract` `cf.Field.subspace` `!pp_ff` :ref:`Field arithmetic `, `cf.Field.where` =============================== ======================================================================= `!pp_regrid `_ `cf.Field.regrids` ======================================== ================================================= ppp cfp ======================================== ================================================= ``PP_FF('5.7*(a/AVG(b))', pp1, pp2)`` ``5.7*f/g.mean()`` ``PP_FF('c*a/(AVG(b))', pp1, pp2, 5.7)`` ``5.7*f/g.mean()`` ``PP_FF('a*sin(b)+1', pp1, pp2)`` ``f*g.sin() + 1`` ``PP_FF('a', pp1, pp2)`` ``f.where(g.mask, cf.masked)`` ``PP_REGRID(f, g)`` ``f.regrids(g)`` ======================================== ================================================= Introduction to the `cf.Field` object ===================================== A `cf.Field` object stores a field as defined by the `CF data model `_. It is a container for a data array and metadata comprising properties to describe the physical nature of the data and a coordinate system (called a *domain*), which describes the positions of each element of the data array. It is structured in exactly the same way as a CF data model field and, as in the CF data model, all components of a `cf.Field` object are optional. Displaying the contents ----------------------- The structure may be exposed with three different levels of detail. The built-in `repr` function returns a short, one-line description of the field: >>> print repr(f) >>> f This gives the identity of the field (air_temperature), the identities and sizes of its data array axes (time, latitude and longitude with sizes 12, 64 and 128 respectively) and the units of the field's data array (K). The built-in `str` function returns the same information as the the one-line output, along with short descriptions of the field's other components: >>> print f air_temperature field summary ----------------------------- Data : air_temperature(time(1200), latitude(64), longitude(128)) K Cell methods : time: mean (interval: 1.0 month) Axes : time(12) = [ 450-11-01 00:00:00, ..., 451-10-16 12:00:00] noleap calendar : latitude(64) = [-87.8638000488, ..., 87.8638000488] degrees_north : longitude(128) = [0.0, ..., 357.1875] degrees_east : height(1) = [2.0] m This shows that the field has a cell method and four dimension coordinates, one of which (height) is a coordinate for a size 1 axis that is not a axis of the field's data array. The units and first and last values of the coordinates' data arrays are given and relative time values are translated into strings. The field's `~cf.Field.dump` method describes each component's properties, as well as the first and last values of the field's data array:: >>> f.dump() ====================== Field: air_temperature ====================== Axes: height(1) latitude(64) longitude(128) time(12) Data(time(12), latitude(64), longitude(128)) = [[[236.512756348, ..., 256.93371582]]] K cell_methods = time: mean (interval: 1.0 month) experiment_id = 'pre-industrial control experiment' long_name = 'Surface Air Temperature' standard_name = 'air_temperature' title = 'model output prepared for IPCC AR4' Dimension coordinate: time Data(time(12)) = [ 450-11-16 00:00:00, ..., 451-10-16 12:00:00] noleap calendar Bounds(time(12), 2) = [[ 450-11-01 00:00:00, ..., 451-11-01 00:00:00]] noleap calendar axis = 'T' long_name = 'time' standard_name = 'time' Dimension coordinate: latitude Data(latitude(64)) = [-87.8638000488, ..., 87.8638000488] degrees_north Bounds(latitude(64), 2) = [[-90.0, ..., 90.0]] degrees_north axis = 'Y' long_name = 'latitude' standard_name = 'latitude' Dimension coordinate: longitude Data(longitude(128)) = [0.0, ..., 357.1875] degrees_east Bounds(longitude(128), 2) = [[-1.40625, ..., 358.59375]] degrees_east axis = 'X' long_name = 'longitude' standard_name = 'longitude' Dimension coordinate: height Data(height(1)) = [2.0] m axis = 'Z' long_name = 'height' positive = 'up' standard_name = 'height' .. _fs-data-array: Data ---- A field's data array is a `cf.Data` object and is returned by its `~Field.data` attribute. >>> f.data The `cf.Data` object: * Contains an N-dimensional array with many similarities to a `numpy` array. * Contains the units of the array elements. * Uses :ref:`LAMA ` functionality to store and operate on arrays which are larger then the available memory. * Supports masked arrays [#f1]_, regardless of whether or not it was initialized with a masked array. Data attributes --------------- A field has reserved attributes which return information on its data. See the :ref:`list of reserved data attributes ` for details. For example, to find the shape of the data and to retrieve the data array as an actual `numpy` array: >>> f.shape (1, 3, 4) >>> f.array array([[[ 89., 80., 71.], [ 85., 76., 67.], [ 83., 74., 65.], [ 84., 75., 66.]]]) The data array's missing value mask may be retrieved with the `~Field.mask` attribute. The mask is returned as a new field with a boolean data array: >>> m = f.mask >>> m.data If the field contains no missing data then a mask field with False values is still returned. CF properties ------------- Standard CF data variable properties (such as `~cf.Field.standard_name`, `~cf.Field.units`, etc.) all have reserved attribute names. See the :ref:`list of reserved CF properties ` for details. These properties may be set, retrieved and deleted like normal python object attributes: >>> f.standard_name = 'air_temperature' >>> f.standard_name 'air_temperature' >>> del f.standard_name as well as with the dedicated `~Field.setprop`, `~Field.getprop` and `~Field.delprop` field methods: >>> f.setprop('standard_name', 'air_temperature') >>> f.getprop('standard_name') 'air_temperature' >>> f.delprop('standard_name') Non-standard CF properties *must* be accessed using these three methods: >>> f.setprop('foo', 'bar') >>> f.getprop('foo') 'bar' >>> f.delprop('foo') All of the field's CF properties may be retrieved with the field's `~Field.properties` attribute: >>> f.properties {'_FillValue': 1e+20, 'foo': 'bar', 'long_name': 'Surface Air Temperature', 'standard_name': 'air_temperature', 'units': 'K'} Other attributes ---------------- A field has other reserved attributes which have a variety of roles. See the :ref:`list of reserved attributes ` for details. Any unreserved attribute may be set on a field object with, in general, no special meaning attached to it. The following unreserved attributes do, however, have particular interpretations: ========= ============================================================== Attribute Description ========= ============================================================== `!file` The name of the file the field was read from `!id` An identifier for the field in the absence of a standard name. See the `~Field.identity` method for details. `!ncvar` A netCDF variable name of the field. ========= ============================================================== All of the field's attributes may be retrieved with the field's `~Field.attributes` attribute: >>> f.attributes {'ncar': 'tas'} Methods ------- A field has a large range of methods which, in general, either return information about the field or change the field in place. See the :ref:`list of methods ` and :ref:`manipulating fields ` section for details. .. _domain_structure: Domain structure ---------------- A field's domain completely describes the field's coordinate system and is stored in its `~Field.domain` attribute, the value of which is a `cf.Domain` object. It contains axes (which describe the field's dimensionality), dimension coordinate, auxiliary coordinate and cell measure objects (which themselves contain data arrays and properties to describe them) and coordinate reference objects (which relate the field's coordinate values to locations in a planetary reference frame). Each item has a unique internal identifier (is a string containing a number), which serves to link related items. Items ^^^^^ Domain items are stored in the following objects: ======================================= ============================= Item `cf` object ======================================= ============================= Dimension coordinate object `cf.DimensionCoordinate` Auxiliary coordinate object `cf.AuxiliaryCoordinate` Cell measure object `cf.CellMeasure` Coordinate reference object `cf.CoordinateReference` ======================================= ============================= These items may be retrieved with a variety of methods, some specific to each item type (such as `cf.Field.dim`) and some more generic (such as `cf.Field.coords` and `cf.Field.item`): ================================= ====================================================================== Item Field retrieval methods ================================= ====================================================================== Dimension coordinate object `~Field.dim`, `~Field.dims`, `~Field.coord`, `~Field.coords` `~Field.item`, `~Field.items` Auxiliary coordinate object `~Field.aux`, `~Field.auxs`, `~Field.coord`, `~Field.coords` `~Field.item`, `~Field.items` Cell measure object `~Field.measure`, `~Field.measures`, `~Field.item`, `~Field.items` Coordinate reference object `~Field.ref`, `~Field.refs`, `~Field.item`, `~Field.items` ================================= ====================================================================== In each case the singular method form (such as `~Field.aux`) returns an actual domain item whereas the plural method form (such as `~Field.auxs`) returns a dictionary whose keys are the domain item identifiers with corresponding values of the items themselves. For example, to retrieve a unique dimension coordinate object with a standard name of "time": >>> f.dim('time') To retrieve all coordinate objects and their domain identifiers: >>> f.coords() {'dim0': , 'dim1': , 'dim2': , 'dim3': } To retrieve all domain items and their domain identifiers: >>> f.items() {'dim0': , 'dim1': , 'dim2': , 'dim3': } In this example, all of the items happen to be coordinates. Axes ^^^^ Common axes of variation in the field's data array and the domain's items are defined by the domain's axes. Each axis has a domain identifier (such as ``'dim1'``) and an integer size and is stored in the domain's `!dimension_sizes` attribute: >>> f.domain.dimension_sizes {'dim1': 19, 'dim0': 12, 'dim2': 73, 'dim3': 96} Particular axes may be retrieved with the `~cf.Field.axes` method: >>> f.axes() set(['dim1', 'dim0' 'dim2' 'dim3']) >>> f.axes(size=19) set(['dim1']) >>> f.axes('time') set(['dim0']) The axes spanned by a domain item or the field's data array may be retrieved with the fields `~cf.Field.item_axes` or `~cf.Field.data_axes` methods respectively: >>> f.item_axes('time') ['dim0'] >>> f.data_axes() ['dim0', 'dim1' 'dim2' 'dim3'] Note that the field's data array may contain fewer size 1 axes than its domain. .. COMMENTED OUT .. _fs_field_list: Field list ---------- A `cf.FieldList` object is an ordered sequence of fields. It supports the :ref:`python list-like operations `. For example: >>> fl [, ] >>> fl[0] >>> fl[::-1] [, ] >>> len(fl) 2 >>> f = fl.pop() >>> f >>> len(fl) 1 >>> fl.append(f) >>> len(fl) 2 >>> f in fl True A field list, however, has :ref:`its own definitions ` of the arithmetic and comparison operators. Methods, attributes and CF properties ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ A field list object also has all of the callable methods, reserved attributes and reserved CF properties that a field object has. When used with a field list, a callable method (such as `~cf.FieldList.item`) or a reserved attribute or CF property (such as `~cf.FieldList.Units` or `~cf.FieldList.standard_name`) is applied independently to each field and, unless a method (or assignment to a reserved attribute or CF property) carries out an in-place change to each field, a sequence of the results is returned. The type of sequence that may be returned will either be a new `cf.FieldList` object or else a new `cf.List` object. For example, `cf.FieldList.subspace` will return a new field list of subspaced fields: >>> fl [, ] >>> fl.subspace[0, ...] [, ] whereas `cf.FieldList.ndim`, `cf.FieldList.standard_name` and `cf.FieldList.item` return a `cf.List` of integers, strings and domain items respectively: >>> fl.ndim [3, 3] >>> fl.standard_name ['air_temperature', 'air_pressure'] >>> fl.item('time') [, ] A `cf.List` object is very much like a built-in list, in that it has all of the built-in list methods, but it also has an extra method, called `~cf.List.method`, which allows any callable method (with arguments) to be applied independently to each element of the list, returning the result in a new `cf.List` object: >>> fl.standard_name[::-1] ['air_pressure', 'air_temperature'] >>> fl.standard_name.method('upper') ['AIR_TEMPERATURE', 'AIR_PRESSURE'] >>> fl.item('time').method('getprop', 'standard_name') ['time', 'time'] >>> fl.item('time').method('delrop') [None, None] >>> fl.item('time').method('setprop', 'standard_name', 'foo') [None, None] >>> fl.item('time').method('getprop', 'standard_name') ['foo', 'foo'] The `cf.FieldList` object also has an equivalent method called `~cf.FieldList.method` which behaves in an analogous way, thus reducing the need to know which type of sequence has been returned from a field list method: >>> fl.getprop('standard_name') == fl.method('getprop', 'standard_name') True Assignment to reserved attributes and CF properties assigns the value to each field in turn. Similarly, deletion is carried out on each field: >>> fl.standard_name ['air_pressure', 'air_temperature'] >>> fl.standard_name = 'foo' ['foo', 'foo'] >>> del fl.standard_name >>> fl.getprop('standard_name', 'MISSING') ['MISSING', 'MISSING'] Note that the new value is not copied prior to each field assignment, which may be an issue for values which are mutable objects. Changes tailored to each field in the list are easily carried out in a loop: >>> for f in fl: ... f.long_name = 'An even longer ' + f.long_name .. _fs-fl-a-and-c: Arithmetic and comparison ^^^^^^^^^^^^^^^^^^^^^^^^^ Any arithmetic and comparison operation is applied independently to each field element, so all of the :ref:`operators defined for a field ` are allowed. In particular, the usual :ref:`python list-like arithmetic and comparison operator behaviours ` do not apply. For example, the ``+`` operator will concatenate two built-in lists, but adding ``2`` to a field list will add ``2`` to the data array of each of its fields. For example these commands: >>> fl + 2 >>> 2 + fl >>> fl == 0 >>> fl += 2 are equivalent to: >>> cf.FieldList(f + 2 for f in fl) >>> cf.FieldList(2 + f for f in fl) >>> cf.FieldList(f == 0 for f in fl) >>> for f in fl: ... f += 2 Field versus field list ^^^^^^^^^^^^^^^^^^^^^^^ In some contexts, whether an object is a field or a field list is not known. So to avoid ungainly type testing, most aspects of the `cf.FieldList` interface are shared by a `cf.Field` object. A field may be used in the same iterative contexts as a field list: >>> f >>> f is f[0] True >>> f is f[slice(-1, None, -1)] True >>> f is f[::-1] True >>> for g in f: ... print repr(g) ... When it is not known whether or not you have a field or a field list, iterating over the output of a callable method could be complicated because the output of the field method will be a scalar when the output of the same field list method will be a sequence of scalars. The problem is illustrated in this example (note that ``f.standard_name`` is an alias for ``f.getprop('standard_name')``): >>> f = fl[0] >>> for x in f.standard_name: ... print x+'.', ... a.i.r._.p.r.e.s.s.u.r.e. >>> for x in fl.standard_name: ... print x+'.', ... air_pressure.air_temperature. To overcome this difficulty, both the field and field list have a method call `!iter` which has no effect on a field list, but which changes the output of a field's callable method (with arguments) into a single element sequence: >>> f = fl[0] >>> for x in f.iter('getprop', 'standard_name'): ... print x+'.', ... air_pressure. >>> for x in fl.iter('getprop', 'standard_name'): ... print x+'.', ... air_pressure.air_temperature. ---- .. rubric:: Footnotes .. [#f1] Arrays that may have missing or invalid entries cf-python-1.3.2/docs/source/visualisation.rst0000600000175000017500000000040112603546021021462 0ustar daviddavid00000000000000Visualisation ============= The `cfplot package `_ at version 1.7.5 or newer provides metadata-aware visualisation for cf-python fields. This is a seperate library and `cf` does not depend on it. cf-python-1.3.2/docs/source/reference.rst0000644000175000017500000000027212752572327020561 0ustar daviddavid00000000000000Reference manual ================ .. toctree:: :maxdepth: 2 field fieldlist field_creation field_manipulation visualisation lama function class constant cf-python-1.3.2/docs/source/getting_started.rst0000644000175000017500000000020512747600703022000 0ustar daviddavid00000000000000Getting started =============== .. toctree:: :maxdepth: 1 installation a_first_example examples .. further_examples cf-python-1.3.2/docs/source/_themes/0000755000175000017500000000000012770523316017506 5ustar daviddavid00000000000000cf-python-1.3.2/docs/source/_themes/theme.conf0000644000175000017500000000000012747600703021445 0ustar daviddavid00000000000000cf-python-1.3.2/docs/source/_themes/homepage/0000755000175000017500000000000012770523316021273 5ustar daviddavid00000000000000cf-python-1.3.2/docs/source/_themes/homepage/theme.conf0000600000175000017500000000006212603546021023223 0ustar daviddavid00000000000000[theme] inherit = basic [options] homepage = Nonecf-python-1.3.2/docs/_templates/0000755000175000017500000000000012770523315016716 5ustar daviddavid00000000000000cf-python-1.3.2/docs/_templates/function.rst0000600000175000017500000000015612603546021021261 0ustar daviddavid00000000000000{{ fullname }} {{ underline }} .. currentmodule:: cf .. default-role:: obj .. autofunction:: {{ fullname }} cf-python-1.3.2/docs/_templates/attribute.rst0000600000175000017500000000015712603546021021440 0ustar daviddavid00000000000000{{ fullname }} {{ underline }} .. currentmodule:: cf .. default-role:: obj .. autoattribute:: {{ fullname }} cf-python-1.3.2/docs/_templates/layout.html0000644000175000017500000000164712757246212021134 0ustar daviddavid00000000000000{% extends "!layout.html" %} {% block rootrellink %}
  • Archive «
  • cf-python {{ release }} »
  • {{ super() }} {% endblock %} cf-python-1.3.2/docs/_templates/method.rst0000600000175000017500000000015412603546021020712 0ustar daviddavid00000000000000{{ fullname }} {{ underline }} .. currentmodule:: cf .. default-role:: obj .. automethod:: {{ fullname }} cf-python-1.3.2/docs/_templates/base.rst0000600000175000017500000000010612603546021020341 0ustar daviddavid00000000000000{{ fullname }} {{ underline }} .. auto{{ objtype }}:: {{ fullname }} cf-python-1.3.2/Changelog.md0000644000175000017500000003242612770520710016045 0ustar daviddavid00000000000000Version 1.3.2 - 21 September 2016 --------------------------------- * Added --build-id to LDFLAGS in umread Makefile, for sake of RPM builds (otherwise fails when building debuginfo RPM). Pull request #16, thanks to Klaus Zimmerman. * Improved test handling. Pull request #21, thanks to Klaus Zimmerman. * Removed udunits2 database. This removes the modified version of the udunits2 database in order to avoid redundancies, possible version incompatibilities, and license questions. The modifications are instead carried out programmatically in units.py. Pull request #20, thanks to Klaus Zimmerman. Version 1.3.1 - 09 September 2016 --------------------------------- * New method: cf.Field.unlimited, and new 'unlimited' parameter to cf.write and cfa Version 1.3 - 05 September 2016 ------------------------------- * Removed asreftime, asdatetime and dtvarray methods * New method: convert_reference_time for converting reference time data values to have new units. Version 1.2.3 - 23 August 2016 ------------------------------ * Fixed bug in Data.equals Version 1.2.2 - 22 August 2016 ------------------------------ * Fixed bug in binary operations to do with the setting of Partition.part * Added TimeDuration functionality to get_bounds cellsizes parameter. Also new parameter flt ("fraction less than") to position the coordinate within the cell. Version 1.2 - 05 July 2016 -------------------------- * Added HDF_chunks methods Version 1.1.11 - 01 July 2016 ----------------------------- * Added cellsize option to cf.Coordinate.get_bounds, and fixed bugs * Added variable_attributes option to cf.write * Added cf.ENVIRONMENT method Version 1.1.10 - 23 June 2016 ----------------------------- * Added reference_datetime option to cf.write * Fixed bug in cf.um.read.read which incorrectly ordered vertical coordinates ersion 1.1.9 - 17 June 2016 ---------------------------- * New methods cf.Variable.files and cf.Data.files, cf.Field.files which report which files are referenced by the data array. * Fix to stop partitions return numpy.bool_ instead of numy.ndarray * Fix to determining cyclicity of regridded fields. * Functionality to recursively read directories in cf.read, cfa and cfump * Print warning but carry on when ESMF import fails * Fixed bug in cf.Field.subspace when accessing axes derived from UM format files Version 1.1.8 - 18 May 2016 --------------------------- * Slightly changed the compression API to cf.write * Added compression support to the cfa command line script * Added functionality to change data type on writing to cf.write and cfa - both in general and for with extra convienience for the common case of double to single (and vice versa). * Removed annoying debug print statements from cf.um.read.read Version 1.1.7 - 04 May 2016 --------------------------- * Added fix for change in numpy behaviour (numpy.number types do not support assingment) * Added capability to load in a user STASH to standard name table: cf.um.read.load_stash2standard_name Version 1.1.6 - 27 April 2016 ----------------------------- * Added --reference_datetime option to cfa * Bug fix to cf.Field.collapse when providing cf.Query objects via the group parameter * Added auto regridding method, which is now the default Version 1.1.5 - 03 March 2016 ----------------------------- * Bug fix in cf.Field.where() when using cf.masked * conda installation (with thanks to Andy Heaps) * Bug fix for type casting in cf.Field.collapse * Dispay long_name if it exists and there is no standard_name * Fix for compiling the UM C code on certiain OSs (with thanks to Simon Wilson) * Fixed incorrect assignment of cyclicity in cf.Field.regrids * Nearest neighbour regridding in cf.Field.regrids Version 1.1.4 - 09 February 2016 -------------------------------- * Bug fix to cf.Field.autocyclic * Bug fix to cf.Field.clip - now works when limit units are supplied * New methods: cf.Data.round, cf.Field.Round * Added lbtim as a Field property when reading UM files * Fixed coordinate creation for UM atmosphere_hybrid_height_coordinate * Bug fix to handling of cyclic fields by cf.Field.regrids * Added nearest neighbour field regridding * Changed keyword ignore_dst_mask in regrids to use_dst_mask, which is false by default Version 1.1.3 - 10 December 2015 -------------------------------- * Bug fixes to cf.Field.collapse when the "group" parameter is used * Correct setting of cyclic axes on regridded fields * Updates to STASH_to_CF.txt table: 3209, 3210 Version 1.1.2 - 01 December 2015 -------------------------------- * Updates to STASH_to_CF.txt table * Fixed bug in decoding UM version in cf.um.read.read * Fixed bug in cf.units.Utime.num2date * Fixed go-slow behaviour for silly BZX, BDX in PP and fields file lookup headers Version 1.1.1 - 05 November 2015 -------------------------------- * Fixed bug in decoding UM version in cf.read Version 1.1 - 28 October 2015 ----------------------------- * Fixed bug in cf.Units.conform * Changed cf.Field.__init__ so that it works with just a data object * Added cf.Field.regrids for lat-lon regridding using ESMF library * Removed support for netCDF4-python versions < 1.1.1 * Fixed bug which made certain types of coordinate bounds non-contiguous after transpose * Fixed bug with i=True in cf.Field.where and in cf.Field.mask_invalid * cyclic methods now return a set, rather than a list * Fixed bug in _write_attributes which might have slowed down some writes to netCDF files. * Reduced annoying redirection in the documentation * Added cf.Field.field method and added top_level keyword to cf.read * Fixed bug in calculation of standard deviation and variance (the bug caused occasional crashes - no incorrect results were calculated) * In items method (and friends), removed strict_axes keyword and added axes_all, axes_superset and axes_subset keywords Version 1.0.3 - 23 June 2015 ---------------------------- * Added default keyword to fill_value() and fixed bugs when doing delattr on _fillValue and missinge_value properties. Version 1.0.2 - 05 June 2015 ---------------------------- * PyPI release Version 1.0.1 - 01 June 2015 ---------------------------- * Fixed bug in when using the select keyword to cf.read Version 1.0 - 27 May 2015 ------------------------- * Max OS support * Limited Nd funtionality to Field.indices * Correct treatment of add_offset and scale_factor * Replaced -a with -x in cfa and cfdump scripts * added ncvar_identities parameter to cf.aggregate * Performance improvements to field subspacing * Documentation * Improved API to match, select, items, axes, etc. * Reads UM fields files * Optimised readin PP and UM fields files * cf.collapse replaced by cf.Field.collapse * cf.Field.collapse includes CF climatological time statistics Version 0.9.9.1 - 09 January 2015 --------------------------------- * Fixed bug for changes to netCDF4-python library versions >= 1.1.2 * Miscellaneous bug fixes Version 0.9.9 - 05 January 2015 ------------------------------- * Added netCDF4 compression options to cf.write. * Added __mod__, __imod__, __rmod__, ceil, floor, trunc, rint methods to cf.Data and cf.Variable * Added ceil, floor, trunc, rint to cf.Data and cf.Variable * Fixed bug in which array cf.Data.array sometimes behaved like cf.Data.varray * Fixed bug in cf.netcdf.read.read which affected reading fields with formula_terms. * Refactored the test suite to use the unittest package * Cyclic axes functionality * Documentation updates Version 0.9.8.3 - 14 July 2014 ------------------------------ * Implemented multiple grid_mappings (CF trac ticket #70) * Improved functionality and speed of field aggregation and cfa and cfdump command line utilities. * Collapse methods on cf.Data object (min, max, mean, var, sd, sum, range, mid_range). * Improved match/select functionality Version 0.9.8.2 - 13 March 2014 ------------------------------- * Copes with PP fields with 365_day calendars * Revamped CFA files in line with the evolving standard. CFA files from PP data created with a previous version will no longer work. Version 0.9.8.1 - December 2013 -------------------------------- Version 0.9.8 - 06 December 2013 -------------------------------- * Improved API. * Plenty of speed and memory optimizations. * A proper treatment of datetimes. * WGDOS-packed PP fields are now unpacked on demand. * Fixed bug in functions.py for numpy v1.7. Fixed bug when deleting the 'id' attribute. * Assign a standard name to aggregated PP fields after aggregation rather than before (because some stash codes are too similar, e.g. 407 and 408). * New subclasses of cf.Coordinate: cf.DimensionCoordinate and cf.AuxiliaryCoordinate. * A cf.Units object is now immutable. Version 0.9.7.1 - 26 April 2013 ------------------------------- * Fixed endian bug in CFA-netCDF files referring to PP files * Changed default output format to NETCDF3_CLASSIC and trap error when when writing unsigned integer types and the 64-bit integer type to file formats other than NETCDF4. * Changed unhelpful history created when aggregating Version 0.9.7 - 24 April 2013 ----------------------------- * Read and write CFA-netCDF files * Field creation interface * New command line utilities: cfa, cfdump * Redesigned repr, str and dump() output (which is shared with cfa and cfdump) * Removed superceded (by cfa) command line utilities pp2cf, cf2cf * Renamed the 'subset' method to 'select' * Now needs netCDF4-python 0.9.7 or later (and numpy 1.6 or later) Version 0.9.6.2 - 27 March 2013 ------------------------------- * Fixed bug in cf/pp.py which caused the creation of incorrect latitude coordinate arrays. Version 0.9.6.1 - 20 February 2013 ---------------------------------- * Fixed bug in cf/netcdf.py which caused a failure when a file with badly formatted units was encountered. Version 0.9.6 - 27 November 2012 -------------------------------- * Assignment to a field's data array with metadata-aware broadcasting, assigning to subspaces, assignment where data meets conditions, assignment to unmasked elements, etc. (setitem method) * Proper treatment of the missing data mask, including metadata-aware assignment (setmask method) * Proper treatment of ancillary data. * Ancillary data and transforms are subspaced with their parent field. * Much faster aggregation algorithm (with thanks to Jonathan Gregory). Also aggregates fields transforms, ancillary variables and flags. Version 0.9.5 - 01 October 2012 ------------------------------- * Restructured documentation and package code files. * Large Amounts of Massive Arrays (LAMA) functionality. * Metadata-aware field manipulation and combination with metadata-aware broadcasting. * Better treatment of cell measures. * Slightly faster aggregation algorithm (a much improved one is in development). * API changes for clarity. * Bug fixes. * Added 'TEMPDIR' to the cf.CONSTANTS dictionary * This is a snapshot of the trunk at revision r195. Version 0.9.5.dev - 19 September 2012 ------------------------------------- * Loads of exciting improvements - mainly LAMA functionality, metadata-aware field manipulation and documentation. * This is a snapshot of the trunk at revision r185. A proper vn0.9.5 release is imminent. Version 0.9.4.2 - 17 April 2012 ------------------------------- * General bug fixes and code restructure Version 0.9.4 - 15 March 2012 ----------------------------- * A proper treatment of units using the Udunits C library and the extra time functionality provided by the netCDF4 package. * A command line script to do CF-netCDF to CF-netCDF via cf-python. Version 0.9.3.3 - 08 February 2012 ---------------------------------- * Objects renamed in line with the CF data model: 'Space' becomes 'Field' and 'Grid' becomes 'Space'. * Field aggregation using the CF aggregation rules is available when reading fields from disk and on fields in memory. The data of a field resulting from aggregation are stored as a collection of the data from the component fields and so, as before, may be file pointers, arrays in memory or a mixture of these two forms. * Units, missing data flags, dimension order, dimension direction and packing flags may all be different between data components and are conformed at the time of data access. * Files in UK Met Office PP format may now be read into CF fields. * A command line script for PP to CF-netCDF file conversion is provided. Version 0.9.3 - 05 January 2012 ------------------------------- * A more consistent treatment of spaces and lists of spaces (Space and SpaceList objects respectively). * A corrected treatment of scalar or 1-d, size 1 dimensions in the space and its grid. * Data stored in Data objects which contain metadata need to correctly interpret and manipulate the data. This will be particularly useful when data arrays spanning many files/arrays is implemented Version 0.9.2 - 26 August 2011 ------------------------------- * Created a setup.py script for easier installation (with thanks to Jeff Whitaker). * Added support for reading OPeNDAP-hosted datasets given by URLs. * Restructured the documentation. * Created a test directory with scripts and sample output. * No longer fails for unknown calendar types (such as '360d'). Version 0.9.1 - 06 August 2011 ------------------------------ * First release. cf-python-1.3.2/README.md0000644000175000017500000001470012770520755015117 0ustar daviddavid00000000000000CF Python ========= The cf python package implements the CF data model for the reading, writing and processing of data and metadata. ---------------------------------------------------------------------- Home page ========= [**cf-python**](http://cfpython.bitbucket.org) ---------------------------------------------------------------------- Documentation ============= * [**Online documentation for the latest stable release**](http://cfpython.bitbucket.org/docs/latest/ "cf-python documentation") * Online documentation for previous releases: [**cf-python documention archive**](http://cfpython.bitbucket.org/docs/archive.html) * Offline documention for the installed version may be found by pointing a browser to ``docs/build/index.html``. * [**Change log**](https://bitbucket.org/cfpython/cf-python/src/master/Changelog.md) ---------------------------------------------------------------------- Dependencies ============ * **Required:** A [**GNU/Linux**](http://www.gnu.org/gnu/linux-and-gnu.html) or [**Mac OS**](http://en.wikipedia.org/wiki/Mac_OS) operating system. * **Required:** A [**python**](http://www.python.org) version from 2.6 up to, but not including, 3.0. * **Required:** The [**python psutil package**](https://pypi.python.org/pypi/psutil) at version 0.6.0 or newer (the latest version is recommended). * **Required:** The [**python numpy package**](https://pypi.python.org/pypi/numpy) at version 1.7 or newer. * **Required:** The [**python matplotlib package**](https://pypi.python.org/pypi/matplotlib) at version 1.4.2 or newer. * **Required:** The [**python netCDF4 package**](https://pypi.python.org/pypi/netCDF4) at version 1.1.1 or newer, **but not version 1.2**. This package requires the [**netCDF**](http://www.unidata.ucar.edu/software/netcdf), [**HDF5**](http://www.hdfgroup.org/HDF5) and [**zlib**](ftp://ftp.unidata.ucar.edu/pub/netcdf/netcdf-4) libraries. * **Required:** The [**UNIDATA Udunits-2 library**](http://www.unidata.ucar.edu/software/udunits). This is a C library which provides support for units of physical quantities. If The Udunits-2 shared library file (``libudunits2.so.0`` on GNU/Linux or ``libudunits2.0.dylibfile`` on Mac OS) is in a non-standard location then its path should be added to the ``LD_LIBRARY_PATH`` environment variable. * **Optional:** For regridding to work, the [**ESMF package**](https://www.earthsystemcog.org/projects/esmf) at version 7.0.0 or newer is required. If this package is not installed then regridding will not work, but all other cf-python functionality will be unaffected. ESMF may be installed via [**conda**](http://conda.pydata.org/docs) (see below) or from source (see the file [**ESMF.md**](ESMF.md) for instructions). * **Optional:** The [**cf-plot package**](https://pypi.python.org/pypi/cf-plot) at version 1.9.10 or newer provides metadata-aware visualisation for cf-python fields. This is not a dependency for cf-python. ---------------------------------------------------------------------- Installation ============ * To install version 1.2.1 by [**conda**](http://conda.pydata.org/docs): conda install -c ncas -c scitools cf-python cf-plot conda install -c nesii esmpy These two commands will install cf-python, all of its required dependencies and the two optional packages cf-plot (for visualisation) and ESMF (for regridding). To install cf-python and all of its required dependencies alone: conda install -c ncas -c scitools cf-python To update cf-python, cf-plot and ESMF to the latest versions:: conda update -c ncas -c scitools cf-python cf-plot conda update -c nesii esmpy * To install the **latest** version from [**PyPI**](https://pypi.python.org/pypi/cf-python): pip install cf-python * To install from source: 1. Download the cf package from [**cf-python downloads**](https://bitbucket.org/cfpython/cf-python/downloads). 2. Unpack the library: tar zxvf cf-python-1.3.2.tar.gz cd cf-python-1.3.2 3. Install the package: * To install the cf package to a central location: python setup.py install * To install the cf package locally to the user in a default location: python setup.py install --user * To install the cf package in the ```` of your choice: python setup.py install --home= ---------------------------------------------------------------------- Tests ===== The test scripts are in the ``test`` directory. To run all tests: python test/run_tests.py ---------------------------------------------------------------------- Command line utilities ====================== The ``cfdump`` tool generates text representations on standard output of the CF fields contained in the input files. The ``cfa`` tool creates and writes to disk the CF fields contained in the input files. During the installation described above, these scripts will be copied automatically to a location given by the ``PATH`` environment variable. For usage instructions, use the ``-h`` option to display the manual pages: cfdump -h cfa -h ---------------------------------------------------------------------- Code license ============ [**MIT License**](http://opensource.org/licenses/mit-license.php) * 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. cf-python-1.3.2/test/0000755000175000017500000000000012770523316014611 5ustar daviddavid00000000000000cf-python-1.3.2/test/xtest_Coordinate.py0000600000175000017500000000727012426425535020501 0ustar daviddavid00000000000000import tempfile import os import sys import itertools from operator import mul import numpy import cf import unittest class CoordinateTest(unittest.TestCase): print 'cf version', cf.__version__, 'running from', os.path.abspath(cf.__file__) filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test_file.nc') chunk_sizes = (17, 34, 300, 100000)[::-1] def test_Coordinate_squeeze(self): '''cf.Coordinate.squeeze''' print a = numpy.arange(89.5, -90, -1) b = numpy.empty(a.shape+(2,)) b[:,0] = a+0.5 b[:,1] = a-0.5 c = cf.Coordinate(data=cf.Data(a), bounds=cf.Data(b)) for chunksize in chunk_sizes[::-1]: cf.CHUNKSIZE(chunksize) self.assertTrue(c.equals(c.squeeze(), traceback=True)) print "cf.Coordinate.squeeze passed", "pmshape =", c.Data._pmshape #--- End: def def test_Coordinate_roll(self): '''cf.Coordinate.roll''' print modulus = 10 for a in (numpy.arange(modulus), numpy.arange(modulus)[::-1]): c = cf.DimensionCoordinate(data=cf.Data(a, 'km')) # Add bounds c.period(cf.Data(1000*modulus, 'm')) pmshape = c.Data._pmshape for offset in (-16, -10, -6, 0, 6, 10, 16, 20): d = c + offset for shift in range(offset-21, offset+22): if d.direction(): centre = (d.datum(-1)//modulus)*modulus a0 = d.datum(0) - (shift % modulus) if a0 <= centre - modulus: a0 += modulus a1 = a0 + modulus step = 1 else: centre = (d.datum(0)//modulus)*modulus a0 = d.datum(0) + (shift % modulus) if a0 >= centre + modulus: a0 -= modulus a1 = a0 - modulus step = -1 e = d.roll(0, shift).array b = numpy.arange(a0, a1, step) self.assertTrue( (e == b).all(), '%s, shift=%s (%s), %s, %s' % (d.array, shift, shift%modulus, e, b)) #--- End: for #--- End: for #--- End: for print "cf.DimensionCoordinate.roll passed", "pmshape =", pmshape #--- End: def def test_Coordinate_flip(self): '''cf.Coordinate.flip''' print a = numpy.arange(89.5, -90, -1) b = numpy.empty(a.shape+(2,)) b[:,0] = a+0.5 b[:,1] = a-0.5 c = cf.Coordinate(data=cf.Data(a), bounds=cf.Data(b)) for chunksize in chunk_sizes[::-1]: cf.CHUNKSIZE(chunksize) d1 = c.flip() d1.flip(i=True) self.assertTrue(c.equals(d1, traceback=True)) print "cf.Coordinate.flip passed", "pmshape =", c.Data._pmshape #--- End: def def test_Coordinate_transpose(self): '''cf.Coordinate.flip''' print a = numpy.arange(89.5, -90, -1) b = numpy.empty(a.shape+(2,)) b[:,0] = a+0.5 b[:,1] = a-0.5 c = cf.Coordinate(data=cf.Data(a), bounds=cf.Data(b)) for chunksize in chunk_sizes[::-1]: cf.CHUNKSIZE(chunksize) self.assertTrue(c.equals(c.transpose(), traceback=True)) print "cf.Coordinate.transpose passed", "pmshape =", c.Data._pmshape #--- End: def #--- End: class if __name__ == '__main__': original_chunksize = cf.CHUNKSIZE() unittest.main() cf.CHUNKSIZE(original_chunksize) cf-python-1.3.2/test/file3.nc0000644000175000017500000016776412752572327016170 0ustar daviddavid00000000000000CDF heighttimebounds2latIlon`  ConventionsCF-1.5 height unitsmpositiveup standard_nameheight long_nameheightaxisZü time_bndstime  long_nametime standard_nametimeunitsdays since 0000-1-1calendarnoleapbounds time_bndsaxisTlat_bndslat units degrees_north long_namelatitude standard_namelatitudeboundslat_bndsaxisYH ¬lon_bnds ôlon units degrees_east long_name longitude standard_name longitudeboundslon_bndsaxisXôtas  _FillValueD¯€ standard_nameair_temperature cell_methods time: mean (interval: 1.0 month)unitsK missing_value`­xìÛô@APA@AÈÀV€ÀV0ÀV0ÀUÀUÀTðÀTðÀTPÀTPÀS°ÀS°ÀSÀSÀRpÀRpÀQÐÀQÐÀQ0ÀQ0ÀPÀPÀOàÀOàÀN ÀN ÀM`ÀM`ÀL ÀL ÀJàÀJàÀI ÀI ÀH`ÀH`ÀG ÀG ÀEàÀEàÀD ÀD ÀC`ÀC`ÀB ÀB À@àÀ@àÀ?@À?@À<ÀÀ<ÀÀ:@À:@À7ÀÀ7ÀÀ5@À5@À2ÀÀ2ÀÀ0@À0@À+€À+€À&€À&€À!€À!€ÀÀÀÀ¿ô¿ô?ô?ô@@@@@!€@!€@&€@&€@+€@+€@0@@0@@2À@2À@5@@5@@7À@7À@:@@:@@<À@<À@?@@?@@@à@@à@B @B @C`@C`@D @D @Eà@Eà@G @G @H`@H`@I @I @Jà@Jà@L @L @M`@M`@N @N @Oà@Oà@P@P@Q0@Q0@QÐ@QÐ@Rp@Rp@S@S@S°@S°@TP@TP@Tð@Tð@U@U@V0@V0@V€ÀV€ÀUàÀU@ÀT ÀTÀS`ÀRÀÀR ÀQ€ÀPàÀP@ÀO@ÀNÀLÀÀK€ÀJ@ÀIÀGÀÀF€ÀE@ÀDÀBÀÀA€À@@À>À;€À9À6€À4À1€À.À)À$ÀÀÀ@@@@$@)@.@1€@4@6€@9@;€@>@@@@A€@BÀ@D@E@@F€@GÀ@I@J@@K€@LÀ@N@O@@P@@Pà@Q€@R @RÀ@S`@T@T @U@@Uà@V€¿þ?þ?þ@€@€@"À@"À@*@@*@@0à@0à@4 @4 @8`@8`@< @< @?à@?à@AÐ@AÐ@C°@C°@E@E@Gp@Gp@IP@IP@K0@K0@M@M@Nð@Nð@Ph@Ph@QX@QX@RH@RH@S8@S8@T(@T(@U@U@V@V@Vø@Vø@Wè@Wè@XØ@XØ@YÈ@YÈ@Z¸@Z¸@[¨@[¨@\˜@\˜@]ˆ@]ˆ@^x@^x@_h@_h@`,@`,@`¤@`¤@a@a@a”@a”@b @b @b„@b„@bü@bü@ct@ct@cì@cì@dd@dd@dÜ@dÜ@eT@eT@eÌ@eÌ@fD@fD@f¼@f¼@g4@g4@g¬@g¬@h$@h$@hœ@hœ@i@i@iŒ@iŒ@j@j@j|@j|@jô@jô@kl@kl@kä@kä@l\@l\@lÔ@lÔ@mL@mL@mÄ@mÄ@n<@n<@n´@n´@o,@o,@o¤@o¤@p@p@pJ@pJ@p†@p†@pÂ@pÂ@pþ@pþ@q:@q:@qv@qv@q²@q²@qî@qî@r*@r*@rf@rf@r¢@r¢@rÞ@rÞ@s@s@sV@sV@s’@s’@sÎ@sÎ@t @t @tF@tF@t‚@t‚@t¾@t¾@tú@tú@u6@u6@ur@ur@u®@u®@uê@uê@v&@v&@vb@@@&€@.@2À@6€@:@@>@@à@BÀ@D @F€@H`@J@@L @N@Oà@Pà@QÐ@RÀ@S°@T @U@V€@Wp@X`@YP@Z@@[0@\ @]@^@^ð@_à@`h@`à@aX@aÐ@bH@bÀ@c8@c°@d(@d @e@e@f@f€@fø@gp@gè@h`@hØ@iP@iÈ@j@@j¸@k0@k¨@l @l˜@m@mˆ@n@nx@nð@oh@oà@p,@ph@p¤@pà@q@qX@q”@qÐ@r @rH@r„@rÀ@rü@s8@st@s°@sì@t(@td@t @tÜ@u@uT@u@uÌ@v@vD@mqM‘@m†ÎÞ˜@m|n¹IÕm@mq.ýWÅ@meÅÀ h~@m[#‚°3@mPDr"5@mEž²G@m;- ƒT@m1À|¤I9@m(Uç9Æ¿@m! «;2í@mDù@mmèÆ@mUbG¬@m ¹ˆÕ«@m&Sú¸@m)5@lÿM&á`¡@lý•N Ë–@lüçA@lý](ç=r@lþÝ%G<ô@m I)÷ò@mž?˜¤t@m 4Ñ]›-@mн”kš@m SÖ@m#‡mÄǨ@m+Ò}eÆÎ@m5¤¼¨d„@m@6h˜L@mJ…ôÁö(@mW uõ@@mcd¨ó‹Û@mošàß@m|jDÀ¦@mŠÕê¡Ü@m–ã¥Äì@m¡œ&j³@m¯žœ @m»}¨^æ*@mÉ0­Ù>è@mÖ4M±±R@máÎâÍÁ»@mí‘:± @mø_L„@n6ùNÒm@n óúë/@nŠ»Öì@nÑͯS@nLÐÜ@nE³kÀ@n"N"–Ø@n$­É›[›@n&@m7JC¥@mÅÉÊÓ@m6k@@m‘މžÇ@lýb’éúö@lø‚•F³@lôä³N€@lñÌ[‘@lïùÌõ@lïK;©)ô@lïÓ†àm3@lñ’j¨Â@lôŸ¹Pt@lù â›&!@lÿ$%%s6@mï"Ú†@md¯™{@mÿÆbÃu@m#®l¹8@m/5±Âо@m;¹ ¤Û·@mH4Ü\h@mW,³gƒg@mfgš]}Ï@mtæÀF[ò@m…›œÖUF@m—tÉÆê·@m¦èÚÚžt@mµ›‰ÜÆ@mƳ_Rëæ@mÖ,Æ»¤¹@mç-·uL‹@m÷…¨J @nÓWŸÃ@nŽI7@n"Vv\ŽÎ@n-Ð#Ôs@n9 ÌÈsþ@nBñå¿@nIý ål@@nP¯µ¦Â¿@nV2¯ ý`@nZZ݉@n\ôŠ;º1@n^™k4b’@n_u†—Ã@n_mß°Á=@n^n«$Åþ@n\ªhÅžC@nY.ß@C@nTð’º(Û@nQ±'|@nL<¯×@nF¬“_ #@nAkûM>@n:üô€@n2Ùùe@n,ðc›Ë@n%‰c @n!»Ýd0@níTþ@nà:æ@n7S1‹@n5&lK›@nÒ.(@n_wá´@nvµ9VL@n–U4å@n¼šw‡8@n9µ @n•Ï‚öý@n æd­ÿ@n æˆc•‹@nbǦ£@nLä–Îú@n öºÒ@mý¥<‡ÿ@mö¶µ›@mïgÏþ}@mæ…|­i @mÜ”2‹ÚÂ@mÒÚœ×"@mÆ‘ }ä÷@mº€"¢/@m¯×c{Õ³@nSÃiÎ@nlŒáø³@måö'è×!@mÆlþ{ó@m¥]*Ð5š@mˆ{Gþ‚~@mj¡ŠM<@mLsÄ_J@m2VG|ù@m5Â5%Û@lû·T¤ÿÈ@læv¬Á®ê@lÒÖd§-@lÁqè·Yª@l¶=Gzr@l­FÜ3Ýž@l¦€jÐÅ@lŸkƒP@lš¢VçT@l—ª)êºí@l–ýüÔø'@l—íi]„—@l›T…Tx@l C?ó)7@l§rÍËü¾@l°Ûß×Q@l»IФT@lÉÖ1„Î@lÜ*/½Ž@lîÜú.@mow¶9@m:z:õè@m9-yÃ!>@mX Ýûf$@my𧙕¥@m›! ÀÙ@mÁK¯4²w@méVU6@nÛÊ–uë@n7s„D¿;@n_«ÊUþ0@nƒOóÜe&@n©ãû¾@nϱWÈü~@nï…×°O@o³ú1œ@o2ü5êd@oO.js‰@ojØ®Ï “@oƒ{I ¼@o—¢µÀE¦@o«V¦ÖD@oº‘·Ç€@oÃüö6 €@oÊZX 1"@oÌM9Ap*@oÉáã½»w@oÃÑdÙnØ@oºmîv(Ä@o¯2/&;@ožôŒÿî@oŒ×œ‰²@o{„ž²J@og¥—=œ¦@oS@Ò^@o>þrkõä@o'yIk @oÿOå=@nü¦'xÈ@n韱›'6@nÚæ£P@nÏ¿k‹˜<@nÇ+ðx‘@nÁ,T @n½·‹ÝŠ@nºŸ·B@n¸ª€¾¾¦@n·Â|¬VÚ@nºØÂa—@nÁEÅ–-Ì@nÄoßß@nÇäè\\@nÉ]Vùïœ@nÈfË&Ó@nÆÌRõ@nÇフ)@nÈz…žˆ@nÅD"IA,@n¾Zz®À@n³ü(@n¥¶õí>@n”4{¾„¨@nƒõjƒÅ@ncß7ZnÆ@nK¨1llÖ@n7:a÷E]@nmÀÕW|ð@n@j®/r@nšv,ù @mé©#?†@mº¼fÔÇ*@m‘gç/Ü¡@mi ú3Æ~@mB#)'\@m!^Ñ =@m|’–?n@lá\3W@lÎ ÖÏ(y@l¹3*âÚœ@l©£^?¾@l¤úßårÜ@l¡4 ¶¥@lŸ¸ ùö@lU¡µ@lžUô»@lœö#§µ@l›}Úñ‰@l™8¨Æ’@l–ðë ZÜ@l˜¤Ï”À~@lžÜTz>@l¤Öõ¯ÚÚ@l­;E*  @l¹«†ËúI@lËb¢´@l݃‚¿j@lùBÆm‰+@mjës}@m;:ïSJ“@meù]±„v@m”,¥›â@m¿n„•ì@mô!¼Œ@n+†g,–@n]™¯š›u@n–²3Ïœ @nÏÿ NV/@oƒbœC@o9"vÅÁ@onþ¤…óp@o ƒ”vdÆ@oÔ—e¿6*@pä\¦g"@p¸^†“@p1;¸V¯@pC—MÇœ”@pRfåg[@p`s§*@pi7ukß`@pncÙ@ppÊÓ„@pn5n;Q¸@pi¼Ù£Å×@paÙ•ïwÍ@pWAS°L-@pK¤­ñÿ@p=™éµ[ð@p.êòrðx@p!ý a(@pªµD\@pþõŽC×@oõ’à~Ä—@oß Ylþ @oÌt îf%@o¸} éžÀ@ožŠô uê@oŠ­àOâ@o|šE’½î@ot›þÆè@omþ¦ódN@oižÂ#±v@of v"@oaå½Mi@o]ëर¹@o[ŠL¤¯@o]¡E]S@oa*Á”@off忹ú@ok²ä ¼@opHÛ†n@owÆ+dŸ_@o~a"%ÛÞ@o‚¼ó+ÛÚ@o}+L3ÿ¼@opãºçªÏ@oh … É‚@oSý¸3@o4ȉ8¤®@omƒ,@nå OTÄ@n»JÖÀ«ê@n”ÿ‰C³Q@nej¯Ø[“@n,í¹‚g@mû4þhóa@mÆq³%ÒÊ@m˜šUš„š@moâ¦Hd@mG2°iÄ¡@m&„ÃÛJÌ@m àæ N@lö‚c1½Ý@lçò'9@làJ#’@lÝRi¾s˜@là×µÏê@låý\î'@lìWtý¶y@lõ^žÀÕ@løÇRNh @l÷ÅFg@lö‹V Þ@lñsrYq³@lèXîÙ´’@lÝömŒÄ@lÒºó„Ú@lÇÒ\>@lÀ c±C@lÄÅÇ|Á´@lÑ8 ä„@lä|6†@lù1uG¼Ñ@mš‚”ê@m<]nµx@m^K auÔ@m…Xb©%.@m®g¼óÆA@mÖ¦ZÂÆ@n &Hià¼@nE¡ÍßÜ@n|#ŠY@n·¦¡­h¯@nö0"BÉV@o/”ço9@oo»Eã—@o°mªNp2@oê£iËÔ@pþ<Ï?¦@p1æèe·«@pLM`ÓýÌ@pdæû±þ.@py?\äíF@pˆNÏÃ/L@p‘ûV͈$@p–í,ß@p•ù\tà@pûabNÂ@pˆ°÷l@p}e¾ªJ;@pniÜ!W¨@p]‚¥b±R@pM*‘çÐÝ@p:ªi¤—@p%éA B@pPl 9#@p$cRb@p †~ä=@pEæ­Óç@p{ûäÓ @p‰)“6Ý@oö‡5~JÖ@oèjNž@oÙÁÿ^LÔ@oË9Åî.$@o»|*²Xž@o­”X§ ^@oŸ2 Šà@o“èçÀ*¤@ov‡+ü>@o"?ô@o’–i_â‚@o›¿W/ål@o§âr—A@o³ˆÄN@@oÀI†ô4æ@oÊ©Ê#@oßž5¬Ý@pŽFª@pKž”â¹@pß9ao@oô€Â\Ì@oÕ  ²§@o¬™ð†Â¬@o~:_\Bæ@oO<{ã«@ogn~Ã×@nÕáÂhá‹@nŸµp (­@nuܘD@n-9²EñŠ@móµ0t²@m¼)“–ëm@m ª4ä@mk¶•ˆ¥@mH4wK@m+:t(@m¯_,ŒÖ@mË#•Çh@lúå!óC€@lø«ºx @lü`áÔ@m14¾å@mÞ"ƒD@m! S»:@m8Æç}Œ@mRžÑC¼@meîV'<°@mp~»Ç@mpóWŽB @mdÝtËò@mNvWOˆ€@m4Úݼ"@moÈQ@mƒ3jžQ@m?VÓ–@m Uu_¥¼@m›ŸËgX@m2ø#ud@mQ EoÝÏ@moç,1ó@m‰s,5b@mŸ(š¸l@m¼vƒŽbw@mÚ}Çèä–@nÉyQ¹›@n/{´ÔB@n]{tЦ@n™›®:;Ê@nÙF¦¼§,@o€wóë…@o_OÒNƒ@o®?P4@oúµŒ«V—@p'³a|¼­@pOðãŸ@po­¾–wn@pŒTü(´=@p ÏMù@p®SÝ1BQ@p³ás:ˆ@p³¯eÜ£@p®ŠZÚNŒ@p¤¼ ’fš@p•¹,¬\{@p„Øå ãC@pp³bÿ·@p\ü?%@pKòÝŸÄ@p7ðS‹Ù~@p&ûFMO‡@p ¦×‹@p!FHš£µ@p"ÿ“õ›ë@p#ÈéçÒ@p!]×ÙË@pNviZ%@p†S0“`@p} >]@p´¡#Ä…@oþ'ÃRj~@oê!Si1x@oÖ™3æ¶@oÅ t`¥L@o¶‹lcê@o«Ë´†E½@o§£¾`:@o®hßâÈÚ@oÀQ@F@oÜÝW¾ú@p·õîFí@p–+d@p*šˆdq@p=ԥ߮@pLöOcˆ@pRììsQU@pQ‘Ý®™Ÿ@pD´’Í|K@p/Jžäc@pÎ8ø @oׯŸY…@o™Ù1²ƒ @oPå=2Ž-@oѸ@n¿å÷YP3@néUõ˜ãy@n¢,G¸ý @nl„Uïþ–@n<òÙÊ,®@næËè¥@nÏTÉ@mé´¤?*@mÖ^-´YA@mÆ+w†Ô¯@m´NdÍ}¹@m›¦;ÆvÓ@m‚}%Há@mfÔÒSô@mUóç`´@mS|±P-$@m_f*yí@m‰nŠ¥¢í@m¼ÏV½Þ8@mí]?ó\ó@n†Íçb@n ß|ì¾@n[¿WI@mñœi4@mÁ¹²[o#@mŽðS@mnã|[~Â@mdiÀd@mj’Y‰è@m ;õ[=@m—çw§@m³§ŒùŽ@mËÔÇ:[@mÙU§#:@mÝòšæï+@måìE±@mõ=|é´…@n°a¢Õ@n?—\‘ø@nhohé¯@@nœØ?QZò@n×ÐýøÏ¼@oÊØÚ®@o_ÇŽÔþ@o¶1&”U'@p;ˆ@.ñ@p3ǵµvi@p_»ý (=@p…THÚSG@p¦[%®s@p½<óoL@pÉ‘–˜ƒ@pÍdà±h@p˪6öM@pÇP%yœ*@p¿=µâøC@p´D/›Vš@p©4¹7)@pš]àò%L@pŒ ³bªà@pþ66uð@pqEv¬vg@peø'ü@p`nî¦ Ç@pabWƾû@pd»©™G%@pfòÐït@pe~K>`@p`x¸Õ®~@pYÖK.­@pM<ß x@p@·”6üˆ@p8AI,7@p/áWùžé@p&bÇ9äC@p2 T@p…¿ 7i@p Eš,@oþ„³S %@oúLD2Àr@pçp6_Ž@phâ6E@p*&7`,~@pG$!¤@pa#iH@pwc³@p†uB‰”@pŒ!¸áê@p‹rtLT@p‚«·2Œ@pqG%˜°Ó@pTK‘î@p1eÍ(¡¹@p ‹$ÞIœ@oÇ`ÑI¬@otF³TÄ@o0Üþ§Çi@oÂq³¶9f@o“¨04ü@om×"¿^@oOÊCÌM@o?ÔÈ„@@o3ܘÜ[q@o-¥Ð/š@o(æKªéÒ@oíA­)@o%¯ä@@n×ph§Ê@n™XÔ2Á@nIN­m|@n“´ ¬e@mØ-š??H@mÒÊå]e@náž7­ý@nO¸Ó/@nÊÇú¹@nÝ-âœ@núÌ¡ˆž@n󂉃åú@nÀ…£=Ž@n| p2ñ@n4@Šz‡:@nb\,çÂ@mö8BÀ&õ@mûÛf=×?@n€ 'kd@n(i ˜Ä@n>ô'ú8@nJaZ}÷@nR(…9a»@nQN”8@nMöeÞOa@nU–x¾ F@nt#½¤ð@n¡&Få£@nÌó«·:†@o`Å8`@o6×`0[@ol–uo>@o®a:\Rÿ@oþ#‚Ë@p& Ç *@pS3!1•@p}jm°‘~@pž 2Ù8Þ@p½K”DÃJ@pÑÙš€bÌ@pÛ½…ÄD@pß9MŸÈ@p߸!@pß°Zn¾†@pÝþýx~õ@pÛ¤…wF8@pØÛº Ã@pÑÑ_sûD@pÉ ÊÙû@pÁ4ÄF<,@p·*W«^…@p¯ë>…À@pªà¾Äåf@p«?¥n’Ì@p°ŽHÜb@p¶¡Z°@p·/³çáî@p²ÒW@p©Õ÷l¶¤@p›Âo›|@p›¸´þÄ@pˆÔ¢@N@pƒ³5í–?@p&üÙ}Ù@p{A <ª¹@prpë 4@p_MFïÈž@pPp…ùò@pFVÓ¯y@pDÖEŒQG@pO°ð¸®Ô@p\še¢])@pw‰{çið@pŽ=šKÁ@pŸ‚’/ò@p§†ÕPá@p©….Cá9@p¨;Üj­E@p¤¯ f!<@p ¶lÎË@pŒP?4+ƒ@ptåvZ:@p[qµ«n@p8GÉš±@p¹}³ù|@oóˆ X°>@pZ/´Û¢þ@pP$›Š¥@pF Uس&@p@0Äýz@p?.Úâ@pA-Ú¡±2@pG¤<ì5d@pK…ôm²š@pM& Ü΂@pAá«ü½ @p$ˆ‡³¼@oòÌøtfé@o{“®SlC@o¾à,Õ^@n±ºÜ€šå@n‘§¾ JA@n¿ªc@o3-42@os(±„ä@oÃîxõ‹Á@oèÜTï£é@oâ*Àñ£·@o§Áq?Ž›@o_S*F@oxs™@né/½ }@nÙIn§NO@nÜcëŨü@nëmÜü"?@ný¼³ [a@o "–0d+@o X¤²2@othV@o WKëg@nÿµØá¹ @o±Ø›2ª@oõ¸ÔŒÆ@oIJÏC“@owÖézœä@o¬"œw@o܃…¤’ë@p©— ²@p\È Q@p9Y¦¬—@pVuV*öv@p{Û kÞ™@pŸ·ò@pº;ð®È@pÓ2X¿¯@pãœÇ·Ù@pêÒoŒÂ@pí¨]*Š$@pï è@pðЭVo@pòòYîÇ@pôM¦ç @põiHI@pògÝöÞ @pí¸ßœ @pé9Â><@pã»E]8í@p߈¿ç=–@pÜ ‚uØ@pܱü½Ý@páÙþº@pê’à@pï=}*Ø@píÛ‰Jø@pèdÙ‡ ì@pÞ1)Zé @pÕc?s¾é@pÐÕÔì|@pÏÍêT§Ÿ@pÑ769’æ@pÒ*7‹@p͘¨¸½¸@p»hÛ®»@p«pÉç a@pš_ÂóÖ@pŽÿW”IK@p%¥-q@p–«ù³ï¾@p©Hû@p·iÁ‹f•@p½Ô5—Üg@p¼áæß §@p¹j­ë§Ó@p¶ÛŨ@pµëB\K@p¶§Cœ%¬@p²|¬Jöì@p¨Ýq<(@p ªÅ‚:‹@p’X ã@p||ùµåK@pg' -E–@p¼Ž,¦‚“@p¹..Ü*@p´F‰ä ÿ@pµ;ÑWèM@p¹ÇÛ0ýÐ@p¿ìÈ…SÐ@pʶŸ¦Û@pÑ4Ë:'@pÖéUÖÛö@pÑ«h…@p¹sã(%k@p“–t»@pZvO îÇ@pº[áéÜ@oÔàx˜‰@oš[±æÃ@o²)˜³Ò@oõÃk±@p(ë{7×W@pM)¨žçã@p`®–Am@p[”†@pC›Åé0‹@p+{od@pXÜ2þ”@pßÕºÐG@p°xÈø@paùYF@pÅh•Ã@pEÍe°þ@p %œ{À@p¹)†@p Kür@p=:TÝC@oïÆc«'Ø@oé9´‹“ž@oïh`ýkV@pÓÃÁsŸ@pöMŸÒy@p)c5þçú@p=sÀ¬ò¼@pL²«YUÄ@p\)ÚðõÃ@pmÅu·a@p€àØs—û@pœÕL´1‚@p¸#‘hHe@pÏÔ³fj}@pævL Yî@pö” ‹$@pü§!: ‹@pÿº¤]ê$@q<Ý4Á=@pÿ…èñyZ@pÿ‘騀@qYn¤×ï@pÿÌpâ©@püu>ŠˆN@púa¼öÁ@pøÓ¶Kä@p÷»\­j,@pöц²@pô<g@pójì눪@pö—7‹¿@pü… ã¼@qÚÌ™r@q "aÌÉ@q òsõ©@qQI šý@pÿ=yåqL@pü&Æt@pý;#ÅYJ@qétm+@qÃìJ^@qÂ:í@pü˜HÚvG@pïI.Ó @pßèù,Á@pÒ@4Ùaé@pÍÒ ­@pÒ.(ý @pØ‚¹Ë¾@pÝd¶W@pÛ+”4³@pÔú*²m–@pκ.¾iÈ@pÉÔzrÖ@pÉ·(0š—@pËõ5S"ð@pÌàÐÛã@pÊB\Œ @pËy„´å@pЭRó@pÊÚOàn@pÁQo·ÿŽ@pû/EÇÒ«@pú\³UMt@pö†ñ[ƒü@pøJ}•É6@pÿ“*ûQ@qQÕ¼‘@qõ ¹~Ï@q™£GaÂ@qÃ3ÏR@q¡X[’#@qvüg[I@püÆBRý@pÛæ¤÷Íú@p°ÑM~Ö´@pŠP²ð X@pjjCTÀi@phzŽPw%@pxÌs’ ,@p*óDY‡@p¤¢j‡=!@p³š«‰k@p®éÃÖ@p sÌðaÎ@pœCL¡5Ÿ@pš;x\@p™Jñ÷í@p—§{?@p’ !•¨@p{Z@p‰ÇÅnŸ¥@pû0KWÕ@pÍQ^<…@p’ß¡X@pŠK6õh@p|ôz° Q@po’'»ßæ@p`Ó±?Ò§@pYñ—i.T@pc“0²@pkä$¤@pxR…/‡´@pÖŒ‹­È@pˆ%6t¶<@p“Ûã ü@p¤³O"@p»ò…w7'@pÐ)ƒ Áa@pãÑg•=@pûïŸ@q "Ó»Ù@qL~ÿW@qiøÈV'@q©«¦Û@q¤_ùç@q³/t2@qšÒ³}¥@qð†Ëtš@qóP¨Õ@q í!î@q D# Q2@q cÐ]"»@q ÓPØ Ù@q Ž g,@q W=úš@q ÂcÐ@qI6‡¹@q„n Sü@q–x4[@qwë,­@q’#=¶¿@q{‹‡@qÚf¾O@qã¬o@qÒû{š@qdõjãK@q,¶'Ë@qm…H@qe³<æã@qlzùIÛ@qwe[R@qáÊ ¸@qj+„ß@q#„ƒþ@q*%9+&†@q/×'ôaÀ@q1ô(ä:¯@q-/k@q!1ÂïÛó@q˜þÎT]@qáÜïí¹@pöf0u@@pógì<Ξ@pô/àöX@põï†äË@póŸòJ@pìè׌aÑ@pé¯R«hÏ@pìÆàpm@pôG2­qJ@pùf*Ðü@pù–Oš@põ8Ý!L@pðg]ëÆ@píź~@pí‘~åCÎ@põ¬$_XB@pýð“겺@pü^Gz@píÎÝ@pÙoaqQ@pÁŽ?×J/@p±Žw2ä¥@p´IÀÆ—{@pÀÓ\cÓw@pÇz*¢@pÇà<û4(@pÉN¸ÿ`8@pÑO_¸È'@pÝ÷«jÞ@pëñYÕ³ˆ@pú5® lË@q£¼ÿ@qòÓ|yñ@q)„úCjF@q2¼ô\k@q6}Y•’­@q8<ÿ©.Ó@q9¤Öd¢@q8y÷Ü0@q8&H« @q6ªy0Ÿ@q5WÌ>>Ñ@q6{5Þq@q8,ü<­‡@q6®Øx¥Ð@q6êd ¼š@q6u±s3@q5££+“@q4ϸ;3@q4–ÿP\@q3obJd½@q/¶–¥Ê5@q-lËžÆ@q,@‰|v¸@q*L8¿Ég@q'.Z@q#4©sÏ£@q!|)j@q#_tùí@q)½»,¶$@q1£…S1v@q4~}õü@q-ÈKt›@q%œûš@q)œTã=Å@q+ÉÄØ@q¤øa<\@q;â:M @qB>o@q èÙ˜hÓ@q I„/ÊŠ@qŒÁüW@pÿ¨î!Ží@pøï!|@pï:ÙÂÈC@pçÜHñŠ@p箞Í}@pëÄÜù‘±@pôWÏQì4@qòÔÍ^@q&ÓqšT@q8öÔt@qÎV8Ëf@q=ôL¨@q\a í9@qªYy—T@qC¼i@q k€k@qCêH^Î9@qFÅÐÝÊ@qM`ñË6º@qVœÓ/º‡@qZ^…Æ\@qY‡lpÌ»@qV« æþ@qSå!o•@qQ–ܦ @qQïŽç©N@qQK¥4ï.@qNB4@qJ-@yÈ@qG½Šë]@qFœ«Ek@qHžPŽk3@qMûG§ƒò@qMùêXã@qNFücOÑ@qZ‘ÓV›¨@qU¦C ™‡@qK¬‘Åx@qK¾”,@qS¡ð#]@qZ•4l¸ @qgc¨á–@qrÄÚHa@qw!S›â@qzT ÊS°@qzʺœÿ@qsü»@E@qlÑAŽéŸ@qowÃés§@qxQr•ƒ+@qßÔÝ@qo¼Xz@q„c¼÷²@qˆ^bÇÒ@q…\7:–@q‚¯Èó,æ@q‰tí€éº@q‚Ó¢²@qtöjð|ó@qpÎ8¡>@qh/d¦é@qf Ü*‡@qbiü’¢¤@q`ã}ô>@q[Gg@q]]ºÞ@qc@<Ð}@qj¿À øí@qp»¿ð}ƒ@qt¤×Bú«@qfP§î¦@qbóe¹àÄ@qc´×{6X@qZÀ© ÷S@qQ`œ6³x@qKψÇ@qAò+"¢@q5RÅ3ŽV@q+À7]ç@q(d-³.@q(0}w=@q''ê´í@q%ÿóxŒÎ@q%ùü!+@q*ZUj8™@q+¿•Íœ@q) ­¯&ð@q7bÁÝæ¤@q7óX[F@q9qç£Dë@q9Ž–ôX@q8|Šr…@q7îÇÃ@q7ÍnSé¨@q7çÓ‡S@q8„óÅm@q;x‡-ðá@qB¸§e¡@qKë  @qS½åÚáƒ@qZª–À Ý@q`H‹àä¥@qc—!F‚E@qcåtßD@qcÇŠs´“@qeŽC¹"J@qg¨[ª(@qfî 8M@q]?³Ì(ƒ@qR&êUÀË@qT®\ˆ+@q\5I5‚²@qdîˆá”@qh[Q¼¢¹@ql_b)´@qq‘#vƒº@qq¨¤°o¶@qmšå’TM@qhË­P©@qg˜.ˆ„@qd ïŒEö@qc˜@†Eü@qdcàNl@qdA9`à”@qaz¼—¦Ë@q\ÖB¹@q]¦±Yù>@qfìFÌ{\@qké…§7V@qpJV'`@qpᘕ7@q|Æã¿Í@qÚèOŽä@qt«jœ†@qmÑôÖùP@ql¨=çWo@quôLW­ƒ@qþALo@qŠˆ®Þ@q’4Éš@q—t´àÞ@q™É=ìÇ¿@q•jÌ€@q‘E=7IG@q’9À_&Ó@q˜¤Æ'@qœ›8ôN3@q–>|œÚ@q›2cÌMG@q  o|@q ¡#6{c@qŸÖ>ÝLÆ@q¢«övÏ…@q 'Cí‡@q™~a´@q”rû$¸|@qŒÐÒ@q‰¢Õ/Ü@q…Úâ(_a@q~W¥sµ@q|N-ɶa@q}øK™?@q0žs À@qŠÑ;@q’N„Û!ú@q•Dd‘x@q¿¸2´u@q‹‰{éºM@q‡N3J7Â@qx$]K¥(@qmÅ„_…Ú@qdF×ÔÕ9@qZy²´Öc@qQy÷¶8@qCöÆsà¾@q@z¿¢™@q@¹hTð@qE¹ÇeÇ›@qGñ™Þ@qH>3äq<@qHï—s«@qDySFm@q<—â¤b…@qTÉ^é¾@qPÂ&£ÿ@qN‚¥E²€@qK^ʾP(@qKd„†3z@qK±•ð@qJèÛ¦Ô@qH˜{Ur°@qIeññî@qNa˜T9@qVžOÐøÂ@q\¤8ƒ-™@q^òs^<@q`‹ê* Å@qd@=Ê@qh}Éýˆ!@qj¨µôu@qj£soj @qkT™µ4ê@qn ¼Cé$@qpÝý¶à@qr>f¥Eé@qsÃçiÀ@quk1ûBþ@qyJ {ƒ]@q€?'¦Ý@q‚^¯Ï1Á@qˆ4_æx½@q‰þÝ–.‘@q‰äi êV@q‰ýIƒù@q‡^R©@q…dçÊ^@qÒ¦Îd@q}ƒæ²Å-@qzgg€ªN@qz¾}&-@qzkÅÆhý@qzHkñ(1@qy>ž©û@qÌ%$ȳ@q…Õù±ú@qó6ã6@q’È {ÔG@q™²:ÒÜx@q°AÐ)@q˜åï ±Á@q’@¨´H@qŽ5Їše@q˜œê5q@qMÐ’ï @q¤-Aª(J@q¯Ü›U§O@q°…¬@áz@q²à”`øÕ@q²4‚+J@q±%>¢°‡@q³“ÄTö@q´l€U±@q´KvíE¬@q°IyJJ«@q³ bd÷Ù@q³ïLÓ'T@q³Ä©e–@q³/ºÖR³@q´I&,9@q³jË¢@q®¬áÈ+@q©¿Ùÿ~@q¤³¸nf@q£AŸk¾n@q ãK®<@q›äàQ@qšª|@qœcìW²@q›ÕèÛ"…@qž¡B.o"@q¢Vsu¥@q¯ú’¡(@q«²æKŽ]@q«1^Ç?è@qÙÓñ"@q¸ZE @qƒ‘-¸cÍ@q{ga“õ@qsèwðí@qlpÎxÀd@q`”×F¸ý@q^mÅÜ­@q_ìÛ¶v`@qe2†7»\@qdý g"b@qhhj=°Q@qc­ÞŸG^@q[T›åP#@qWDAŽ@q~à0k¨’@qyþ‘‚ÿ@qu6’FÞ@qnµP†Bñ@qlßÛ‡õ˜@qk©¬Uö+@qhjm‹ü¼@qe 8T´“@qd"Scˆ@qbÞ(pè@qd´®Ÿæ'@qdÙ±M¹@qcʺKm@qc,5vè}@qdé#1s@qiÁc ©­@qn¶Ò(t@@qp!" ^@qq+á×@qt7­‰@qyrí¬ù¹@q‚p  +Ý@qŽ^øLÁD@q’3å û_@q”ºÔ”Õ@q—»jëÙ.@qšX„S@q¢`…+D@@q¤ÞÈ„K@q§¡Vm@q©‹v W@q¨9eO<1@q¦÷pOh@q¥”*Ró@q¡òåŒÆõ@qœ·ìí³’@qšøàüNK@q€½¤ù]@q¡?%X@qŸ)ì°t@q 4Æ‚ë@q¢®LÂf-@q©Jm¯l@q«©ê ¢¸@q®:¦¢Ws@q¯ÿ2¿±ò@q±6Í׳@q³|}HÏ@q¸PÂBý‚@q¾šÆ¥+@qÀ¤ G6@qÅ&ñA"@qËfdtK@qÊJ©üúó@qʨQŽÓ@qÉ™÷Pš{@qÉ1v;X@qËcœ­ÃT@qË…Ãc÷Æ@qÉϘ4ñÓ@qÈÚÃZ>@qǼ†žï@qÅÐÊá@q´ëB·@qÂk—ÉÔy@qÂâD£³V@qÁ!·òÕº@q¼ÐÔ0@q¸J”n,@qµ™¹(°@qµªµÐ<þ@q³>%Ê@q°PK@q±‘€öéÐ@qµýñjtŒ@q³@«kL@qªº+†Q¹@q¨”ÛüP@qÃQfr¦@qÊÂü ÍW@q½Ú Â@q¬¾íÖÊ@q¡øX÷N@qŸÜe .‹@q—†|„«@q“)zñÙª@q[õv¤y@q‡8¶Wo»@q€ÂäÈ@F@q€ßè¦p@q…°`YzÜ@q…Gò²²a@q‡¨üb@q£NOª@qzIÔû¥@q|a°¶ó@q¨Dx+»@q¥$çŒÓ<@q B×¾@qœòÞô@q–e aãŒ@q‘kæXJ–@qý‹”Žû@qŠ©– @q†s£]‰@q|dÉ (y@qu^‰¨_&@qpž³®¼@qpq=¶þ]@qq à¹cŒ@qo޳{†ï@qrxª¥Y×@qwSéLßP@qxÌePâÇ@q|p?”@qÅðü5l@qŒ z]@q˜í 7·@q¤5»œŒ\@q¨Ù¶ÓI@q¬>­$ã@q¯£ko@q³[¹÷ ¸@q»A¥ƒ@q¿X;2&õ@qÃ3µ±Ö@qÅ5òÕù€@qíÁ¨=4@qÂ>J,@qÂŽ&ó°œ@qÁ›ö@q¼¹A!O@q»/C®ø@q¾Mßr²@qÁ4eê)n@qÀŸ ¹ê¸@q¿ÀŠßÀ@q¾( å„$@q½ÞcÆo|@q¾+Ëz ø@q¾+Bƒ‚@q½ÅÂÚ5º@qƹQo @qÔL18@qߛʨ™õ@qâè±m™@qâÌÙý*T@qäZ)AÛŒ@qæ"ª'T@qåÚ Æd@qäUÞ@qàP¾‘ÝÍ@qß {ø€Û@qájhÊ~@qâžKí |@qàÑ`{B¼@qÞ¥§Ëî@qÚÇ<É3ž@qÖ2ÿ­1ž@qÒ1ó8@#@qÒ7×o9k@qÒ€ºq‰È@qЪ?½Ýì@qÍó ·ñÝ@qʰ)ýïy@qÈ øÅ­¹@qÈi=%@qÇëíÖ©L@qÇÔ9·cR@qÈâa~#@qÏ¢_õª@qÌ”kaHº@q·À¦)^@q¯¥AHóù@qÓ/|Û@qé®>\è@qÑÿX'þ@qÅ)4 2„@qÁþ¦Y@qÇp-Ž^;@q»€‚£‡'@qºªéJJ@q·D]J§#@q°n¹ÅEƒ@q©jC·Ü@q©Æ »Õ@qª?¬(Îæ@q©Kd;B@q¨bý‡ÉF@q ìÄC©o@qŸv2ù÷@q¤£ýU"@qÌʇ8#@qÊÀhÿÂ@qÇÇб$Ø@qÆå÷r@q¾cÏ£ è@q·§/߃@q´,Æ" ï@q±ßÒˆ$ @q«ûlv@qžÔ…¸q@q”‘M«ô@q÷ugåÿ@q“GóG?u@q”—-·>@q‘º~ê`S@q’œQçm@q•¥Þ@q’†„N¡@qšÇEz0¾@q¢R£à@q®äL=ò@qºU‰v0@q½ÃÇ4@q¿PM,6Ù@q°%c»@qÇ´Á*Ø@q̓Nð¤ì@qÒF&ÀK@qÕsš#k@qØ}ºòç@qÚ<1°ÎÔ@qØ£¹ˆ@q×S&ñ ¿@qØžÅK}@qÖ"•h ÷@qÒÚ:R@qÒì®@qÕ¹ÀŠ˜>@q×âœÿ@qÛ-ò@qÜn#¡o™@q×#G  ¥@qÓ8Ñ)aŸ@qѬwž/@qÏS5<1@qͨ ?‡@qÛ.ˆ;î@qï=“ãœ@qû®zò•@qý4 <]@qýØci@ÿ@qý![GÂ@qþF\bO]@qýÿœÓn@qûÙ#ì@q÷ˆ²È?€@qõÜ.um}@qø¥,…@qúRTíw@q÷£¦ú>&@qò.`•3@qí©†? @qè•,˜-@qäÐ/øw@qäÙ+<[@qäP L(~@qâö &=@qã{í°/Š@qâ"TX_@qÝ´”ë½£@q܉›±‹@qà_fNPK@qäK0þ þ@qâÓq .B@qèÐD;¬Á@qç¯}Ÿ¥!@qËEZÇ@q¼¬†pŒ@qã® 3%¡@r0ÃÈ”@qó«|ðí^@qðé^‘™@qóÄØºœø@qù”ýÓ. @qãåÔ6y@qã.{—Ðá@qßZ!T#f@qÚû…Ðq@q×Ô±õ@qئRµ@qÔ`I¾¹Ê@qÑ 2@qÎГî®K@qÍF÷9´@qÊ,0ÏK%@qÌó£1zÅ@qðÀKÜÊI@qî‚­€ã@qî­±(y&@qíÒƒÅá@qæ@qì,ìáž@qëô¶¹(Y@qçã΋j‰@qävˆ¼Ld@qæ8ei @qéz{¦F@qî]-¯ ‡@qøY“í“H@qü PöX¦@qò†,ßz@qìé­~NN@qê)>ÿ{@qæýÊ<@qⴃŠ@qí°8Õ*@r¾œé‚@r½îÛ~d@r“¥K’Õ@r2nŠZ@r{ž|)?@rİ¥U@r.*Õ!@r‘]ô© @r ÄÛûÔ=@r ˜ŒØ®.@r ›H?‘@rÎÎ!ú@r mf„v@r´§|@râQÜU@qýz„0Ð9@qúasšâ@qùÎ5ûç@qø(õà·@qöèÙØ?@qøÿµE@qù5'‰×š@qôN­®&Œ@qñùøÃžý@qø§ôoP†@qýª·´Ž@qúA ¸ý«@qýß4Ç€@rÀ‡òÀ@qãƒOº@qÍÃ$Ø Ñ@qñ§ðz%Y@r,Ó ç@rÓ£m¹¼@r!Kˆíyè@r%lŒ´1M@r&§»q@r ýáåUü@r3ñrkô@r8¡A”î@r&g¿C@r\ŽwF@rê @qýxA£…<@qø„öùÍj@qøIëaÅ@qýo$ M@qö€0ÖNä@qôˆªµ@rÅ8ü‹@r/q×Ù@r>OnÒÝ@rç›Ì"}@rŸ¿·ªî@rÐVÇd+@r>™¯s@råss¾@r Cœ›<@r‘¯ÅTj@rwkêH†@rÔØ¦ê@r«ýõÎ@qþt²¡@qÿ\L™D›@r¸ìq/@qÿ:.Ql@qúÿ݈o@qùì@Š+@qö{%ÿ @qõ6¶œÓ@qõëP³Æ@qõLjVƒ˜@qõ‚ =,@qõ³ôo»@qúÝN-‹@qþÜ’!«×@rq7Ï€@r®˜ë@rʘ¯P@r7y[|@rT[½k@rEú‚8E@qÿÓÿ<K@qúYÌ@qøžÚU^Æ@qüz£þûû@rGCeJÔ@r ÜÀ;¼¡@r–ÎÌnˆ@r )§IÆá@r‚ý5ô¶@r JÞV>€@ró${Ö@r†^i‡H@qüZƒŸûY@r„)Uª@r:« ‚Â@r$õÜRZ@r$õ3A’D@r$1ÎFY[@r"À†·o@r IްV$@r±î©Š¡@r½w0îÆ@rU#@r(?Œm‘@rH§œ„Ò@rv(¥Ñx@rVBYb—@r‚é4Ò@rÊ›;Cð@ršPîf@r8Ys É@rCÔ9m@rNT üöß@rœ"6½@r7Z5Ÿ@r4ÄŸûɇ@r/d€P@r&¸LŽ’@r" KóE½@r!zïîÕL@r& »çòË@r,Nì“@r/Нý[¦@r3Vè€×@r9ZDgT@r;îˆq¢@r<(Ji@r9e·õ¬/@r:/çîÖß@r>êËóÏå@rAïœ V[@rM‹ìH‰@r\CðWï@r[(GêÖ@rN>&1ü@r>+ÐM@r>² ˜@rV÷@A’@rjasÓĘ@r{òhQ©@rÒ Ìh@r€Ôãô@rv ·§6¾@r\WöÝ@rEȤ8æ¡@r<¡ ÷ŸÞ@r6ÞÈXx@r1p„‘ä@r8Ü\7|ˆ@rE”#±Ï@rH–+üç@rI0dNŒ@rH@¿z@rFÛsÿÓþ@rFj·ü°'@rDô³l@rEt òœe@rHàœ £@rIoTÜ1@rHÝ{þQd@rHÖsþA@rFÚÌH¸@rC¤½ü@r=¼çìÉ$@r; í|Ô@r; @ ‹)@r7µõ¸ÿ@r9 ù@r97 ²…@r6$ôÇ;@r:Ï(".@r8ËŒ*6s@r0!WìmÉ@r6=¼ _@r7!@$1@r/š‡î†Ê@r4˜péU@r›ø¥;ú@qüÝ¿­€¦@r9¯¥·°@rWu/oa¢@rs^X6es@r‚Йõð@rrÀgè×@rX§®§å@rNÏSýZÞ@rIê ÄÍ@rCÆcôýÒ@rEäb}@rEŒ ´°@rEâÐz’@rKô/q5@rGè N¾@rI)°C@rN2Ä.…G@rJ¬”à@rK_d“ä@rYU¾¬{@rSœÊÆ_@rT!—pl@rRx/o2@ra[¼å@rr2ÊŽ¨@rfH•ðSI@rRWåK·@rb´âiQ@rqUê $@rgYS±Õ.@rbÝäÂ63@raÓÙ¢äæ@rY{ Ê è@rV#’óB|@rSt•a×@rNäÉï@rK>í-C»@rE¿†ªð"@rIˆrÿ«ÿ@rNLn®£@rN–¹Ã@rS-eþËÔ@rW,ß3”@rZ½ Âè¦@r\·šP×g@rZJxºXÒ@rZ\ïØ,@r\qïGé+@r`däÜ@roÖ«ÐiÈ@r‹£ÝÅ|ê@r‰éK9ׇ@rù†´û@ryåàQz@r|AD¡¨²@rŽë‚¼Cå@r©øtq Ô@r°ÄH57Ò@r¬ïµY3@rŸ°•h‹@r‰‰1@rsÍäñÈ@r_ô E:@rR¦^+S@rM1g¨×@rKÓÅ)„d@rP÷5 X@rYtðó%@r\vgdwÚ@r_ÁQéN@r] œ[­@rX-ë]Á@rWœæLO±@rW¨:ïs¼@rX"ºê]@rZ¶Pq@rZhrìKì@rZÉ#çÆ@rZkmt›@rWš†/ @rVëô«ª@rUt³TÛ®@rS¿I,Í@rR1ïuŠ,@rL\D4!<@rLþ­Á“@rNø!ˆ@N@rLtRÀ¾@rLbqŸ²œ@rHà\þ¯D@rCÔ i¿@rLé§@rGßHª«@r;ʸ9@@rE@Ôz'¹@r<˜9}ìþ@rB¿l-@r8äú;²@rrÄ×Q^@rŽhDwX@r™\Á‡(@rÞ×­Šn@ruù»@¯K@rid¯"Ç;@raËÌåú=@r\vëôá±@raì¤j]Ü@rbäês)@rcžOG»Ø@ri'Ìcj@rdïqk4@raö¡/M@rc£–ëßÌ@ral²‘p»@r`Šb×°@rd¡~Š‹@r_ÌøT}@r`ƒ3[y{@rd09Ý?@rvÌ«åé»@r‰R3z@rrˆjb‡@rPiû»Š«@r[ƒ–6ÿ@r€·Ê¢Rf@r‡L‘Mq@r†`†@r…K~—c¦@r{tÍ7Q÷@rvˆ¢_û@rr½l¹´@ro‹xR@rosšþ‚ï@ri*d¢@rj›®‘̼@rkÉŸÇA@rgú ‹b@rmU{01z@ro¿ýÂàÈ@rrclb×@rv!…I p@rrßW @rq´sQ}¼@rsBòO‘Á@ru Ù,2<@rŠÅPÜ@r®ÛlBy@r¥`îe¯¼@rž®Qz¦@r–ZáeK¶@rœ°ÙŽo8@r¿8Öùü@rÌÂØÊ°Á@rÍÒ‹q«ö@rȈ‡Ïqf@r«¨P8oi@r’‹¢3™:@r~D‘|v@rq†æç·@rf_£é;€@reŒªDwN@rk´j•@rnò´”ò@rr¹)e.N@rs wš°Í@ru=Â%c@rtIá| o@ro±>¦?é@rpПH @rpí)ŽHÝ@roÁñìNe@roE«œ~æ@rn¥ÎŠã@rnÌ7ø D@rné¸bÕÏ@rkƒ;Qg1@rmé0µŸÄ@rn†ïÓ×–@rj»±Â5\@ri*¼&ü@rbÖ¯’é@r]ÿ´¡ \@r`‰UØ8 @r_OY‹º¾@r_¦§˜L@r\릫e@rYõër=@r[LHº«@rRD‘[,@rI·›t»Ç@rWFõ¹@rTE¯op@r3CÅ8!@rEr¢ZM@r‰wbÝ#Í@r§êËÛ D@r¦ g¶_@r–í¦"í¶@r€<ò÷‚-@r}1D'@r}ÓÉÍäé@r{D¿dšï@r€Wî2f@r}•5µÕ@r{ ´p.Ã@r}J9Zø/@rw.gtët@rsÂÃŒH\@ro3ž/@rnÄ †º @ronM{Ûž@rp‚èlû@roQtë÷è@roµ§hãÙ@ry)ž _@ršÒ½¨%@rž•~yáI@rŠ“5£;@rqïcÂ@rvVCå›Î@r–ªÉÿº1@r Žiúä@r£¨&›ý@r©Wo…@r•&!O÷@r€É©ú%@rˆ\±7«@rÄœ ¶M@r„¯2¼È@r‚;äRiô@r„ÞÕ‹ÈE@r†Žž•W@r‚*•QÍK@r…Ìp§½@r„1Eò>@r„Ÿ ]¿@r‰Ý7|@rƒšB¯¨}@rVSVqG@rá µæ@r…i¤Jy;@r£Q,/vB@rÐô{“áw@rÁ"G‡ÐË@r³ôøÅú@r±Ð˜ÿxä@r¿b»«—>@rÚe-øï«@rÛØ8Ë!.@rä *ÿJ@rÙ½Gñ@r¾£À$îZ@rŸÆÎ’@rЉÆRÓ@r†\ ê^@rÅÑA±&@rƒžŠAÉ@rŽET…>þ@rïÞAá@rXDOÞ@rŽ5DÈ]7@rŽíI{¡@rˆœUÏ—@r‹ßgíó@rŒ{ë¨÷á@rЬ˜%w@r‡žoœ®:@r†}80¸Þ@r† “ ä@r‡¹®ÆÂ@r†?ŠWs@r€Iv²h@rUÈÙ€@r‚ZDô@r}¥« -¶@r|͹h„ó@rxŠÈšè®@rr!?¸“É@rrÃÊFxŽ@rsc¢ÊJb@rr+¸‚ @rp[Ù×°@rm“‡„âb@rg¥dž@r_—Àxqº@r[Ÿu3y@raŒ»Ó¯@rfó¥g?I@rJRo](†@r=lþ Й@r‘Fó¶÷ú@rÆ <²ç@r²òž.Ó×@r‹¾†‚‰@r{gûŠø)@r…Rïïo@r”:ÂÈY @r—Ü—†|¯@r›ž´× ®@r”‘&~О@r‹&µ|ú@rŽÿùaú@rˆ5UAe™@rƒ~ÿÛ¯@r{UÕ–7@rz;.¿p¾@rzp¼+å‘@ry©Øõ¢@r|le]”@rzÕ9˜@rt™I @r»u´?Åú@r¯tœœÊÒ@r¥Á)%_g@r£P­p @r¬n[ØF@r´¾uâmc@r·a=Û¹‹@r½×ØðR@r¿·BKä@r¤bè9Xc@r­¢ßŠ@r›¹ö<½ð@r“ýÌM@r˜š†Õr@r™-Ø]@r›r˜sƒ@ržà‹I@r™“±üVP@rš_åb7@r•؈b­6@r•îžÕÉ@rœLE @r”ÇG—Þ@r‘0Ò?µã@rø/©—Ä@r— ¬jï@rÄü6qÓ‚@róC|ü¡/@r狌 ëì@r׉$8êÝ@rÍüëþ\@rÚ#DOa@rënµaŠØ@rðÁõ×XP@rø#^H@rç¶`%‘š@rÎL+^~@r­©Ï/*4@ržF+ç`@ržL1ÞO@ršµé@‹@rŸà5¶hU@rª^î2fô@r«æê}@r«’îÒÝU@rª¯H*@r§8Wa£­@r¥Ë+â@r¥#I·–@r¤ôóÝ©@rŸ¾è lW@r™Ê#ku@rœàâÏ“¤@rž5ƒˆˆ’@r¢V-®ßN@r [VwÀ@r˜àO–î@r–À:R`@r–/Éø@r“„°¼ðÄ@r“ÑÒ4ô‹@r‰ÞC¦@rŠæ¾%‚‘@rŠê H8Û@rŠQŒrj]@r…3¦.@r ú¥0@r~¡°Ó@rt¯:@roonÜî@rmþMîÎ@rhcžó†ð@rxãI_É@ra %ÇH @r+³%ƒsf@r…ZZ@rØ|k6@rÂ6ËÝ@ró^$J@r€Ãl}Ò,@rŽ´Z° À@r¨yÈ^¸@r¯9vZ&¦@r²h£<ø¤@r©àBeü@r£mFˆyf@r¡Aº2—@r˜ÀžõKu@r’âôᡊ@r‰¦hÓN¡@r…¶ÇŒY @r‚…ƒÒª@r‚}¿€Õ´@r†#.[@r‚ÓPúÉ@r¡ éñ,e@rÔEΨ @r¿žžó»@rÃN@FÝO@rϘ-^¹C@rÜTdg|Ü@rÎÿ|ÂÊô@rÊ\»"_@rÖÀf{?Ä@rÊ&Éu”@rª(ï@r¥Ôú¾ö@r¯1h<8˜@r©ž·6!"@r°³¨¶^µ@r±5,£@r¯û·]ÎA@r±ˆ>`x@r¬HvR@rªÍ §ù<@r§#ׇtÀ@r§Ð¹îoð@r¬ÈjP¦*@r¥cG+ˆ@r£ŒÓ`Xç@r£ŽÞSo@r«Ö˜G@rÛ|Æe³@s­'!Z¿@s –—@rýdséïð@rïù<Ü:@rø2Ýn5‰@s¤&,<@säÕAlA@s †ÔO«m@rîŽòœÜ@rÏ1mç@r¸mž‡@r²™…Â"@r³*íy•@r°û-³j@r´ž• Wk@r½Qèàã @r¿[6”)@rÁÅÉGƒ@rÂA ¯Oò@r½éňÚn@r¹¾è±rï@r¹­¬Ñ„|@r·º-F‚@r´jÊR@r´pÑR˜@r±£¥[’u@r³$–'f@r»u ís@r»Õr5æ@rµ€uj ÷@r²?íb•@r°Fþvµy@r¯¯Þ$–Y@r°ïå ï@r«G²ÖE@r§ˆirG@r§lHue@r¢Óz-²@ršGzÎð$@r‘ÉBto@rŽe.h–Æ@rƒú·›@r€KùMÝ6@r~¸àc L@rt–ØÞ6~@rˆõh\v@rn„wù’«@rˆCN¯J@rsŠñaT@rØW4O=S@rÏ `ÌÏ@rª„1,d@r• X?ó@r™Û§)öt@r»s6O@rÃBÈ9ú˜@rÅwàR9@r¼×)}X*@r´<ãö@r°<éÏW@r¥ñ«Î@rŸ˜×äIÔ@r–’Ét3ê@rÒ'£Ê@rˆñGQ]µ@rlu€p1@r‘Sˆ˜Ý@r’.Oº@r³¨W4“l@rß³ò^@rÌõK#Q@rÞú @réå?2Ží@ríÙžÑÕ@@ràn 5TÁ@rدÑÖn@rêV‰j+@rÕÂWä@r²óòÌ÷@r²E?ÙçÕ@rÂsØš@rÀº}Hâ@rÈCzÿw@rÈ7·À@rÄ€©Ò¨@rÃñkY3@r½±ë»¬ã@r»"¹yD@rºÝÖu¤™@r»+‘ºÓ1@r»ç]ð@rµÈ´³>P@rµ -gbò@r¶М&)@r¿+Ñ3Æ@rá(nç*@sÞÅœm@sù¾ð€Ž@sˆr+@s íOØø@s”?äÚŠ@s(’þbs­@s'„È»Câ@s0çUâ@rê|¸Ÿ@rÇ-k5@rÃüW7Ä@rÂCg°c@r A,®3@rÁ¸Ì‹Ê1@rÃ{=«x‚@rÌ5ísY½@rÑBZUrµ@rÕu¤à,)@rÕÚ’x²@rÑä¢å&z@rÍ«>4Ó¢@rÌý<"–Ò@rÊŒ=,¤ @rÊ{ʳE…@rÌxâ%–´@rÆgûYr@rƨÉ8ZW@rÑMIƒ‹Ô@rÔ]þ&ÔÍ@rÐ!Uµ¤±@rÎŒ‘6s'@rÌNèqƒÍ@rÌÀ½‡P@rÏko9Ó²@rÇà—·™Þ@rÃÉ)Å´V@rÀè€0@r¸sˆº¾…@r¯ÿvÈSu@r£Fžx£:@r­NíÝm@r•áJ¤ÀÙ@r‹ŽÌjQ@rð  @r…¸+ ;@rŠÛ¨š7h@rd££ôx“@r@žÿ90@rvx)¹û)@rÔ†, Ôk@rÕðÐ{Ò@rÈyOÝ;Ã@r¯›Ý-Ñ@r¤×OØýM@rÈ‘èüc=@rÓEÕs @rÕÓÞ!1=@r͌Ռ@rÁh·¯@@r»2û{é@r°{tÃ*ò@rª_õ#ö@r¡zDÇÔÈ@r™g–Ãíš@r“^äiï@r ¨2³‹Â@r ³™ÏQy@rŸt¹@r½Ä[Á¯@rÔ‰\3@rÎ Žo‡@réO0@rìW!io@rã]‡]*@rìõæhy@ræŒã£×m@rôk¯R§™@rè(à+c×@rÇýŽS@rÈ!)0/@rÖ®,Ð@rÔò´††e@rÛ"–B“w@rÜ5ÝA_@rÙf\@„@rÙ!2>8@rÒÈɨ c@rÏž5¡S&@rÑ.z+ )@rÏ…øÖ&Ú@rËï$KÎ@rÆ×˜ýÞŒ@rÄ(NÜ@rÅÉ)à»y@rÑL˜Ãüä@rê¹cõ}p@s‡£‰ý@s˜D£^@s•X' @s xež¾@s*o§ä÷@s9ÊîÛ°º@sLé™ß@s|ænl}@ráA1!G@rÈh®À…F@rÑÏ0 §w@rÎüv¡Õ@rÏD„Rç¨@rÐÞØŠóÛ@rÒ.Ö—De@rÛ©æÐt@rãñEmE„@rè“GÊ­¬@ræX£¨Í§@rãÃB‹@râJuä*@rásðë÷:@rÞy*hƒû@rÞ\<Š&y@ràsÚoœÀ@rÚø¶ÑG­@rÛxRÑ…@râ÷Ä?”@r滑¤j@rá¨ÈcûC@rá¦ÞÉÃ.@ráDQ@”@rá处µÎ@rçÏyÓ_@rà( c»Ž@rÚf¬¹Ã‰@rÔwFî@rÈeº÷ú@r†•ó@r´e ù¼@r¬’³c`_@r§ŠTR6@ržOØ©tÊ@ržÔ&¼Þ“@r˜ …p½@ruá£p*Â@rGD×ëç½@r9}¿ @r¥ŽÆä;F@ràäŒ9ÐÃ@rÚg{û@rß6—O3¶@rÆön×¶–@r´®Ú¢1@rÎgMlþ@rÜSåóY@râ¤úˆ·@rÝ»g{r@rÏ‹-•ë@rÇ:§Z+œ@r½+©C­#@r·i’Ïòì@r­îM{_ø@r¥±–å“f@r¢ÀÙÑ[ç@r°Á™DLÍ@r±Á«îÞF@r±„äq@r´ë û@r¼\x)£*@r¾•tÖG@rÕ‰Q„ë[@rЄ¤À@rÍåeŠñI@rè½V$Ž@rínæ^È‚@rù%Q|œ@róD À³@rÛæ¹VÃ@rÝ Ž_•µ@rìí|i/ç@ríâ–®ë$@rîþ¨I@rîÄœ® @ríÙ^É)@ríÍ(”Q@ré»'u¢“@rå»VLW3@räºUð@rá.Ä\pù@rÝÉÅO>@rÚ›ˆ=b@rÖcý)¢®@r×\Œ]¡@râÊÒ‹u@rò׿%*@rÿ`l’ D@s ‘ÒÈÅ÷@rý‰Pá“9@s.“UÇ@s&tç̘ß@sýßwk@s Aøn±@rùÐGE’‰@rÚFÜa'@rÕ†E¨mœ@ráÏüæ@rÛ È,8@rÞ}+ÈUN@rßì>ÈÝÔ@râ,ü gE@rê¿+b&@rñNlí¢Y@rõå_æ$@ròXè¿x@rðÁ¦÷@ròoÍ#û@rò6·:ˆ2@ríßäÉ_@réoS|ª@rê¨öPÔ·@réºsaiô@rêà”{Ë@rî©"í³á@ròã!û#$@rìqZû(Ã@rê¸3 ;®@ríµ5hþ,@rî0ÊiI®@rô±ž²@rïp¥°@rèâ{JK@rãoLbqø@rÖúfJ±@rÑ’ð•e@rÃÉo@Ü@r» $¨@rµÝ¦Ùáj@r§ ú•@@r¡éQë·@rŒízÕY@r^ÅóÒàþ@rA³ Q!7@r~_Y)U†@rÿ\ÁÜš@rþoMs@rè˜þ?@rñZ&òß;@rß§R&Z@rÎÒvI¦@rØý8V Û@rá™­ºÔô@rèú#ß@rè20a}÷@rß{Þ²žÝ@rÖ’‹gÑd@r̸ØJC9@rÆÁ-¨#¥@r½(ƒ/ @r´ß±²í£@r±È;üp@rÃZ;8¿@rÄ“Šbä@rÇA_ã™@rÅl*™Z@r¤<ÎÁV@rž˜ð éã@r¼ ¨n@ÿ@rÉ-¶ƒV~@rÌ`|Š{@rÈ¡Hëc@r×Ïâ#Fb@rî±y?®+@ròÿLK@rè’D*{Q@rꩬ@I@rú3N¦g@rþÕÏ×( @rú¶(,´@rùò;ÄÚ @rúQ<â@rú†Vš¨@rüψëg÷@røIʦÂ@rñjý›Ûþ@rì•<Þ¿=@rê¿qq.3@ré:J“øº@rèÁó-–³@ré7Ó¬‰v@rí#ë]±@røyê @rþ'Þ1jk@s $³¤@rþù\}ÓÕ@rì\¯Ç<@s w^œý@sÛÓÍdh@rþ$¾•ñÔ@s^"Æ¿@rÖÁJü´@rÙÍ&FÏR@rêN©`.÷@ræ×"!@rêÏèË+@rë…z!'š@rñfÌ M–@rõ#"Ö•¸@rõDŽw@røÍÇžg„@rõÊÈã’­@rö)µ–l@r÷Q Ÿë½@r÷7Áw¨F@ró;ôyt@rìÅM}Ðq@rìk|(²G@rñ”é@ró%àæÐI@rökÖ]D@se6½‘ñ@rýiC#™@röðF'b@rû1IA(@rúAê‘Q“@rü®?¥Rø@röÙ<¨Or@rð!íùo_@rïDÿI ×@råqˆÅšu@rÝB®·&6@rѾÙ@rȃJµ)$@r¼¶Ü½Ü“@r«TâVøŒ@r {Må­@r„ŒJE‰ß@riº‘Š"@r{ìGZ:Ù@rùúv³×@sF"ôªYy@s`¨MØ@rý¶HFº@s ÷‹ásw@s‰ejé@rõøs•›@ròƒ ·d@rçMº¼Ú@rä6¦¤@ræÆ^ß|\@rçh@|@rä'­»@rÞ’µD@r׳€ÃêO@rÏ*r x@rÆðø‚@rÁà nIÀ@rà }{Ï@rØ´à+f@rÙ(ÈöEh@rØ kën@r®n¾Lë@r¥mì =@r¶ Š•Jï@r·K.& Ã@r¼Dp Ö @r´el.à@rÆ-Elé@rçmϽ€ÿ@rïíWc̆@rï@ <è@rõ§Ë{ã@r÷/(ùæ@r÷äüŒ:Ú@rö¥M<Ñ@rû8Ý…@rþ~“ZÄÜ@sBý²HD@s­½.ü,@sè•X@rûú° jÕ@röžÙä/þ@ròÒ¼Ãâ@r2~ñ@rðírÓs@rñ€ôƒÿ@rñ>âYœ@röeÛ;,·@rê½T,<á@rìóÂ! @rõ§c±üz@r÷X¬6{`@rú):Þ¤@r÷@½ G\@s ôR‚©@s¾2;@rÛÏâØ/×@r؈c7Æà@rïv²bn@rñj$ûB@rôŽjÞºh@rô–³8í@rû{ƒÈgh@rþ—B@u@rúÿ¶Ü½e@rý8ï½’h@rüÝíÑÒ@rÿeN@«Ö@rþ.ëz ÷@rûyd܃÷@rúÒFÝ,@r÷®^ñÃ@r÷¦¢bÇé@rúÚŠ”;@rþ±Q/=‘@sª£ùBñ@s l…Äs@sÏPÓ”/@síÅz§D@sF#SÌ9@s³¥^5@s<ÿ„Ï`@rþ¾ÿbL@rôq…)7@rð“iLp@rèœÄ‚¯&@râ§aâ’@rÚ,úÎ$É@rÏbÉF@r¾n'a¢@r¶ÿ€(?Õ@r®ÏÊ_Ä@r‘é³ß»@r—Ï‚ z@rÒ†¯VÉ^@s&Fç ©@s™¹”Å6@rðžd0D @s Äx„ÛÖ@s,ìø–.@s!½ Ï@sikаö@s \2ECÔ@rûÖ]µ@ràUvÝ·@ràwÖ[åº@råö~÷ÚÔ@rêÕvø%q@rï%¯¦@réPí¡‰*@r䈚&@rßoKŠE@rÛÝëØj´@rî±ûëWI@r囇XF@râl Ìeç@ràÓv@r¾è:• @r·ì¶5©—@r½Âê#÷ÿ@r²¿ v@rª–0ŽsY@r¯×Ý«@rÅ ¨\¸@ræ0z¡Y<@réyЛ@rîUà„T@rõë¹!³@róšŽEH@rõH)t @røD8JÒD@rÿ¢+âA@s ÚÔTÁ@s*³ ½m@s#‘8y}@s”; ¥‰@ss˜]@síBÛØi@rûÅtô4î@røafƒ¬@røf‰£ô<@rôŸm˜Ò@r稿Ý»@rôÚD{º£@røš=î•·@rñ7;¹J!@ríE{´"ë@rî36A’º@rð2£fÿÊ@rí‚#µæ2@rüI³_@röâù¯ÿ…@rÙ߃6¼ø@råè³ß_Ò@r÷( Ñi@rú;båè@rý}¤¢Ò-@rþ¼3@s­ë~F @s×®Ûâó@s‰I€@sä%{T @s¥d¯Ùd@sÂACg‡@sõ¨äý@s¦'KŽÆ@sq¥&È@rÿNGá«„@rÿÁÖí¨L@rþÕÉh@rþ:×%×a@rû`8É‹"@rùQ:n¼Õ@røª û9ô@røº˜.Š@rù$+ï@r÷¤‡øÚ@rù6~ª…¡@r÷£•þf@rï–TèŒ@ræá¿™%n@râp!qÓ‡@ráÐ'?#‘@rÜ4&k…Œ@rÔ¸€ƒ@ÿ@rÇn.\@rÊ´ãNò@rÁB* µß@r¢èWCûÏ@r·î g@rì½1kÿF@s ª°¢@rû»O¥Áç@r÷ð[x¸@sè*^—@s=\ÑÂG0@s&Ø .nª@s%¶JÆkÙ@sfµà@sYCwÍ@rÛÖú_4_@râÅá&@réÅ:Ô±û@rì7[V£V@ròŠUç@ríJ½G±–@rë35UO@réà™Çg@rè·¹-ø&@rñ!o˜à@ríRžßÊ@rèv¿zÂ\@rÜk+õ*l@rÈLÓ[@r¾]j˜òq@r¼ÿéQxy@r¦=[êòÄ@r˜㋺´@rŸ)ú—F@rÁ墶@rå ‰Fö@ræx´’¾J@rçgVu²@rî ÿª@rôlתSI@rý„åÝÈŽ@s8™tøë@s׬@s°XÐâæ@s \FRf4@sø¢*š@sðãFÂ=@s*ºÁ÷@süôW@sæ–hRV@sí³-‚Ì@rû'¼Û@rù]±Z{@rûîò á`@s}¸lV@só3ɨm@rú˜ó›³@ró{Bœ@ró“ËQ¥Ñ@rñÚ¡N½s@rÛs{f@rÙ¿á´Ó@rÝ*Ìð-œ@rçNÎÅ +@røãÑ›û<@rû®¤ë@rþ]2W=ð@s‰4—ë@sÄ4‡ë(@sQ_ïÌ@sâ W@sx¯@söé ã‰@s·–úú@så/eÿ@rÿ71èr@rýŸqH~@rø±kÛÃ@rôÃ#‹G…@rôÆÎ´È@rñm"„@rðObd@r뙚@râ’”"ì³@ráIë:(@ráéfÊÝ@rà ¡²&¤@rà/ÛƒÖM@ràõcõlž@rÞ{©¾XÂ@rÜTÉÌN@rÕÜ.ÉŒ@rÕ}Z ñ@rØ'WJÏ.@rÖ>êáú@rÚm6Ù;@rÕÐð„?@rØæüyÿ@rÍñúY0O@r«”ä°z3@rÌ‹×ö¸Œ@rô……É´@rôŒDÞ:¶@rÿ<ó!›R@s /; g@s.XÏSðÖ@s; ì@s&` Âà@sju¬©Ô@s¶Ì4¯ä@rӢ·@rÍ *á¦<@rÛõ3áȆ@räš¶H,@rã»dZ[@rè›^rÆ@räÝÑ[@rä@½÷V$@rè ¹¾d@rëjãÅ@R@rñ™è@róG×:Øí@réCw¢{@rÏó¿Þƒ7@rÂ_TF×ä@r¢¿ãZ@r¿f—Ì@r£]Ø“V@rŒLócçº@r‡‡ ,®Ó@r·'íXb@rä1}Mén@réQïål8@ræâaÀ@rêFD©)e@rôHSl„@rÿ˜Jzß@svØÑ]™@sÿøˆÂ@s vfu ™@sÝÌ<ùP@s àw#k@s'}±Ž@sœÕ~Â@sê 7êÊ@s‚½ÌàP@r÷gµæG@rïm.¶Ü@rüzùžN®@si†œæ@sâ5ÿþ±@rö´\Uô@@røj¦}¢@r÷i¢à@røŒ£)Ú@rò5š0; @rÚc ¶a@rÔH>à@râ[Î-C@rû¬j¿dÌ@s`V+cÇ@rýº¶ŠO…@rþT‹&Ý@rû›-@rú rö@rú,)¢äÃ@rú’„+’@rúÉÇ…n;@rö•T{@rõd»üjô@rñqƒë5¼@rëgyÒ…@rëiÒwŽ@rçÜíGAG@râTÞ°Ò!@râc§ûL@ràfmî0o@rÞ¤R^9Q@rÛI2òó@rÔzW9@§@rÑèYb@rΑÓì@rÉÖ°˜ñ@rÈÈÀz|.@rÇ•QÑ@rÃìç‘ûø@rÂ÷-ƒð"@r¿QÎIƒl@rÁhp£Þ@rÆFÿ=" @rÊÕ„‹@rÛ‰œJ“@rÜã–z@rÜ‹.AYt@rÓþRÊ,@r°½LŸµ@rφ7SÆ@ròD~+ù†@ríEƒf@rüàžÆ]»@s4IëØ@s3“3 o©@s*Za—0@s/*èòc@sØFMjÀ@rê X-@rÑ@ríí¥ƒ’@rôó^*¾@rþ¾uÔms@s Šh'Ž@s{±pÕÞ@sFªä…e@sœ·–+-@s t}ú @s-A4‡@s \øþµz@s:NtXT@rê|ùC@ràÎÈ–@rü2Óz+@rÿ·¼?@rß“ò*`@rÕ¸àO¬@rîÒ;Ig@r÷SÈâZ&@rúÈfAK&@sð%Ø×@s S‡J@Þ@s fÃíù@s ž#ÂN@s ±S‘œô@s ¾¬«~“@s @rÓkÑ2Ô^@râÝ\18@rêº>+¬@rïÃú5ïº@r÷ùA|—’@rü· Ò:/@rý7qÖu@síB­@rø)Ñžo@rîUÀˆÐÿ@s£újQŠ@s €Ü´U@s£k‡8@s ʃ°X5@rüÅüÅ;@rë|M³@r÷ ¿Îàà@rö±X>k@ròæþOÄ@rðpi*®8@rþä‡ÜÉ1@rëX¨z¨¢@ròÆz¦@s P¯ßµ†@s ä]w·ÿ@s ÃYª`9@s ¢"3@s Md—Ÿ@sˆzz@s‰£=@s ø¼zîY@s Ç/N|@s ªeÚp@s ^’÷ ª@s »fÊf¢@s ¶éŸ@s볜O@sË>QŒN@s@ðª2n@s¡kxð@s[ ¤LÈ@sEÆCÎi@rþ«Y÷@rüä›/¾å@rúÙ¶O¿L@rùÞN|ŽÏ@rùõѺ T@r÷c<_ËB@r÷]Ψä­@rôÆó¦j@rô"ñn.@róÑC5Á@r7Hó@róD¸D¸@röyÊdðv@r÷%æ@rñ„Ë8@ró²˜ Ú@rñìlÚ Ê@rô?“a­^@rñ”l ‚7@rîF޹8@ríw¸:ž@rØB×/Ç@rÀyXGþ@rºÚ=žÊ,@rÂN(©’@ræ,ý %º@ràøl>Àá@rÓS7û¿‰@rÕ#¿r¤_@rã™}€ï@rÙ(yÔ@rͶzEý@r¶Ê¹qáž@rÛ´­ú–7@r³ˆo4S™@rRˆÈV@r`_‚>º@rÓšØ;/@rÝÑ¥5CÔ@rî^£ ²@rôK-‰†@rõXiàô•@rø³c ¹@sÏ)-Þì@sÐÕ†½Ñ@rõ¯}t¶@räeoûV@s|—r,m@s XÌÓù(@s ϵ’þ@s!4AK@rüwÁMQ@rñàþy]–@råÞP§§U@ræÌ='@rù¸µÓE@s·EϤé@s¶Ù÷I@rè •Œ @rñ¬žô?@@s úEAŠ @s µ~J @s q€)Ã@sË’1@sÎÖ÷¼@s ûµÀÿ-@s ¡Æw@s„ãd+ @sÝd•{@sÝü´í¤@sÐA-§@sÜ«Áɽ@sà{v4ù@sØåÊÍ@s ¹Ù{úB@s rÕC@søé%@sýs·U¥@sÿ‘eT@rùÓ(<àÑ@rùÈBL{Ð@røy¤¶CI@r÷ÊÆ}ª@rú™‘®ø¸@rú‡ªS$@rý›u—­¥@rù¢‹sÝ­@rù¥êE¹@rþBi ˜/@rùÉÞ40@rüKøµÖü@sUä×y@sÏvðÅ@rùÁGФÄ@rö¹`„'x@rúærÒû@sã¿ ËÈ@s&@ f{@s ¾½?@se#ÛiÜ@rüzD1@rêjrT…r@rêe„*·¼@rý4{ŠtZ@ròâ)ÅG\@rá=þ}1…@r܈ôX@ræe€}Iv@ríÁd)Dg@rì xÃ!@rïiß¿—V@rïké¦%@rèò1c°Ó@rèé,†$@räÙ‰J!/@rá=‡v¬@rëv­ !Q@rÞ‹·ãg@rÉ TA[R@rÖÎöF¼@rÝ4ÿÛ,B@rä¾ZÔž@rÎz„‡3@r¼j~7†@r´xôª#@r¬ÅèË+@r°¨Œ³@ríP³t@rtÞg¢y@rÃTuæ¤@rÎÁhØbp@r€n©+¸m@r“È2zQ@rÂc¾šžÀ@rÔV»ãj@ròßïe@rùÀäü M@rû¨L—(@s} ƒÅ@sÉb¶@s-CñNè@ræš ¹Ý»@r×öVîK@rüŽÉbÿ@sE Dô@s N<+@s§ÓRÒ•@rÿ„ñ¼4@rÔ²¿âRï@rµ¨qqn@r¨ûœ@rð:?~ d@s+³ý“n@rú(›¹ì@rñ±”3¡@rúÅâSŽ‘@s¿ŠÅõç@s Dãô@Ô@s*›Ïñ@s N*kîÒ@s Uª.„ @s©,`3`@s]” Õ@s¹FÄÀ2@rýQ­ÊHšÆ@ró£™·@röW6㯌@rö¾¥Œ´@rùšáûÙ>@rö¼8Aÿ@rú¾C¤sI@rÿO†òéÚ@rÿº¿uB@sš4£ži@sNÆŽP¼@sÛ-ŸŒ@rú£ÆÖzh@rîžU\|Â@r躋ö7B@ré0ÔÕ@rô0Tý ]@rðÓÔ™u@rèoôH‰@rãå°â¸¥@rᇓ7@rä®aƒ7£@rò *]K@rôC¶;Q@ríUq,"8@rêxß=u@rêœT F@råíHšþL@rÛ|dSɾ@rØŒhÔ×@rÕ,z&É@r×ó˜‹þ@rà87ì¾·@rÝãgˆF†@rД5|m@rرÌ+S¾@ràé×§™Ú@r·ºøm@¯@r¤‹4ú( @r‘Š{o£@rƒ‰†&™@r{n:m.@rlÍ»z–@rK…˜#>@rB}Ì j@r€gµ%¡v@r»f„I@r³÷èr‡@r®¢©=@rô¬*N&@rªÛmïJ-@rÛzÍ%@rë_@rü Ђó¿@sÒ˜‚ðÛ@sº¼õ@rÿ˜öåáu@rÚÊÛ(5@rÕ#Ó@rõ‚Ḱ@sO4@s^wðã@sâ‚ê@rÝrÖ5@r¬!ü©ˆâ@r„¬6uâ@r¦È *MT@rây=´»@rõ‰,˜@rç.p™’¾@ræ¾b®¦@rûŸûŽG@s1uQÞí@sÂVjJ‘@s|3 ó@rÿuAIÔ9@rÿxX~¼@rÿíªŽŒ–@rü •ùsž@røáó3@róº6²• @ròˆ.‡ëß@róP.öVŽ@rð¡ñ³šH@rïi£/@róø÷Å)U@rôÈð ö@rò_ë—@rî¼qO4¡@r꧆ì"Ê@rìtvP@rç険_£@ræ§ÔÒ-²@rçiw”@råºÞÅ6@rç`^ª@rçeU4æ@rí]މÿ@rôVÚXl«@rô kׄ@rðÝZ„d@rò¤;Gï@rú$PzT@rüH @›@s"_”ô;@sJÈR–J@rý•mmîž@rì‘eµ Ò@rá‰ÉÂE¬@rÐðÕ\ªs@rʃ=Õ§ÿ@ràlT Èó@róœ_œ@rñ½Ýn8>@rꈵdûÅ@rì´VW-‘@rñ›xÞd@rò\™sà±@rôÙ¼¢¿@rëÃPÏÙ?@rãçÕYBf@rä¶71o@rß”˜¿Tt@rØŒéÏ`p@rÐ_¥r°Ô@rÍ. Íï@rËmÍ2rj@rϹZF¡C@râ8úܰr@rç°îú]u@rÞL§§û~@r¼V¦‡‘@r«Oé–Z<@r†'e* ¿@rlçíÁ@rYÉÓ‚¤@rS<øã(Â@rP0½š(@rDËûµU@r.Õ›3ñ@r-Òm À@rU@†Iñu@rŽÒ¹¿È@r® |b.ÿ@r˜”ߺ6ì@rOŸ¯[`T@reúlúí@rª_»ܸ@rÖQB~Žx@rë>,¼í@róTÕ©ú^@rø£&¬@rø5Ás@rÚR ´§’@rÈ~½J7@rÛQ±Ÿé­@rñX˜ãDZ@rý÷ú‘@rÙמLú@r¯(Ʀ:@r„!A*@r}ö™Š@r™M'è›t@rÒ˜Y1@—@rä8äæv@rÛ|ûDí@rÞcÉ3@rõAMŽ@rýIYwÙ@rÿ5sŒ@s˜Úç›ó@rûëÎ:*E@rûi5x@røÛÉ[_@ròo»if(@rîúÇC8@réRˆÙü@rè#ð¦g @rè±ÓaR@r榘õÑ+@rémre@rí•ø'îz@réñþþA @rç0‹ÌyX@ræïëÞ\@rãçôžON@räVùEÍÔ@rßýæÙo»@rÜò;®@ráß@ŠƒÐ@ràÜí¼ õ@râÃú›±@räì®q™@ræøÆ².@rè †p¶Ï@rè™>4@rê uQ}í@rñ¯©í@röF~L‰”@rü7¤Û¨ @s ïåê¬@rï&£4o@r¯Yñ]Ѻ@r¢Øž@räq@rCX@ràéº;‹@ræ W<2@rìËÃg¾=@rîÃd’p@rçñòøýN@r߃P$P@rÜÀ}ç6@rÛE˜›I@rÑûÃ)v¯@rÍ[Bít@rÇcˆ?Câ@r¿«œËð^@r¼U;Ü”j@rÂÄzHŸ:@rÔóÏ@=[@rÑ'º³6g@r³ Š8ºG@r‰&ßiáç@r¹ú±Å@rl¨ìÎð†@r;–šã»å@r"AR”¼‰@r,ÐÍe„@r.‹'€]G@r%@S9@r"`@ò–@r.C¦3ÜÛ@rCºÀ@rs‹§~I@r£€ÿWëT@rq›lUN³@r(NéÆ ~@r@Ocd°Å@r‹äχ@rÂÏ0W%G@ráYߘ@rê/«r44@rì†D¡,I@rÙ°†oîM@rÁûòЇ†@r¯ÃàJ@r·¡âºÃ8@rÈæ KØ8@rá45×CÓ@rÈ7JV6@r“€úìŽë@raz—0‚@raCÏð»¼@rÊðÆÞ@r°ø­Ö8î@rÊ¿þ Ð@rÎ]‘Û¶)@rÖ×s£žÒ@ré7=çÈ@rñÿ,D@röÅSyPõ@rùèÂÈ·@rù·æË_G@rö¸æ@rí¦êLº¦@rçOøà@rã¿Çy´@rßüwž@rÛ¨!ºÕ«@rÚëh´@rÛ£ñ®¾R@rÜòéo®—@rß®uX¹@rßtqwE˜@rÜŸ  ï=@rÛó`Qç@rÛ*hí@rÚu±¡°@rÓ€<^”@rÎ=ð¢ö°@rÖèS½Ë@rÖ%HÓ@rÖ,w³X†@rØ)ÓžÅf@rÖš_~Î@rÔԚɔ@rØsSAë—@rÞÛ©Æ.ô@r塒ô@rê+Û¼2@rúØØá¬@rü¿p;Ì@r¶áóUn\@rcó*Žnç@rw°£‚ÿ¥@r²˜ Õe@rÄ)áÏq@r×¶ ?O@ræÅ&+hª@rÝU;…œÛ@rØ9tÒI@rÔÍØ¥é@r壸7¬@rì C2›@rçýž¥@rßËKŠÝ$@rÚÿTŽô.@r׌MT Õ@rÏñÒM¾ö@rƼ} ÿx@rÄ¿ ÕQ@r¾€-jÈ@r²£{KÛ@r«zù½–@r°ìt!@rºÎ¥ð@r¤Þ]² ¾@r‹^`‡ŒÁ@rrÂLþ@rwªì⩘@r[†´&…e@r6üqÄ@qùòñ2g@qþ@êyS@r äÛE@r ßã¹@re{qäÿ@rHÛ»ªI@r-ˆ —úü@rSñ;YÛS@r~‰ Òô@r=KË|@r m·x•O@rB±×G@r†8 §T@r¦ÓÌfWi@rÃ.‹Œ ª@r×2ã_åM@rÇï•Fš@r à³9g@r•hgë™@rž""  m@r¨Ÿý΄”@r¬ß”°]Ö@r»õXÍÇÔ@r­äŒ€<|@rh'ÚYí‹@r5ÀL¬§Õ@r1àh(Î?@rJ*¹M †@rsC)”ªþ@r›Í~vóˆ@r´ÛÖøá8@rÊMü.Ñ@rÙîúdD@ráÒ¾‘}Ï@ré}Ý/÷i@rì€ A§Ð@rï_Æ›h@rëÎõÙ`@ràb¯Ï©h@rÙ#Ünt@rÔg0R±Ø@rÐx'U¼“@rÌïFåŒ|@rË)%Üÿ«@rÎîO GÚ@rÐ"£Öæu@rÑhjWþD@rÕ¯ú’¯@rÒ]}™Á@rÏ’š„Ó@@rÏAø³#@rÌ-S.@rÅP“¢nÏ@rÁ€ÖQ…õ@rÅ‘#ê"@rÄi8>@rÁ†'”f@rÀ)ö ΢@r¾8Ä“at@rÀPh“w\@rÄùÁþÓ@rÊâ<@rÎçç|mN@r×È} Ç¥@râ™h”zQ@rÐ…Õ§@rz¡çûd@r=3LÐ|ò@rzWcÖÚ“@r»´ªe½@@rÆŠ´¯™@rÍ@r,Öº@rÏ JÓ‡@r̈e:³}@rÖ•ð ÑL@rÙé¯e­@räþûÑl˜@rèDlMp@râ_=¯¯@rÜWÞ¥Ï{@rØe ]Þ@rÐíZè¨z@rÆÔWí](@rÀÿ¢þŒ@r½*Œ½ @rµ{z½1@r¬EJ 6¡@r£¨„£a²@r¡K æ^>@r¡°ËR+@rƒ9yjˆ@rh¡Îu‘É@r`@‘ñ†•@rl¶Ø}@rCüï@r¿A®¼–@qó±Öt7@qê¥_æŒ@qúÖ{/ã@rp VO@r¢§<*@r é?c&Z@r;ÊX6@r'sŸ Ýq@r4!¼IT„@qü“Ø@qö;’Þ•.@rK¹Ãz…@rxzÒÒF@rkÃê¼üz@ryr¼?,'@r‹þ›~`@r€T©@@raÒv[Ì@ro(¡5³@rŽ.„¢<@rØ'ª_â@reн0›º@rf¥ÕC@rVßû‹ ?@rî|Î?@qû.œòv@qôɬh(Î@rzÑö@r-Pñú¿Ç@r\x`ñ2@r†N9}Oå@r°zzk @rÇj±Û¼@rÏ*,Íc@rØÍL@@rÛát]’Þ@rßQí o™@rÝÃb±— @rÓúÌ®’@rÊ‚ìð@rÀk. j©@r»Û—JbD@r».Â8ð@r¸²ñô«@r¼â°7@rÁ·ï#–@rÂÄ÷­ÒB@rÈCó¥Á÷@rÇ»÷ÒÁ@rÅbæ9ƒ&@rÃz ÷Šù@r½B7˜6p@r¸—,HÕ@rµÿ+ÅË@r²¦t#‚×@r¯E3ªc¤@rª!Ëù¨-@r¤T•Ü|´@r£˜³N‹¬@r©˜á`…@r¬$™=µM@r¯vÒF~@r·Ø†â¿‡@r¼ˆ •Æ=@rº4q–;@r•rã¼@rCHÍX°½@r.~îæòx@r€[¬jþ@r¸>,·Ùë@r¼JM…Û%@r»™±Ðß@r·œ™¢Kû@rÁÁì*Ø@rÓÏ2†`@rÚŠ–KPX@rÝ¡#¾n@rÝ—O®Sø@rÙú\¤œ@rÖ#‰ªòU@rѳQ7±Á@rȼèÔu@rÀ"\­cY@r»;=Tå@r´/‰În@r¬Ü.‡·@rª5·.o@r¢mDöÏ~@r˜ý\ÿ< @r”ŸetÝm@ryhrṄ@rS¹ ŸÐ·@rEŸ7‡tt@rF)’’Ùø@r ÿ=¨a@r½òk@qÿ{^ƒeC@qö¦ˆáB@r2úë·@rÄÜßë@rÄz·_@rCµÅ@º@r9Jù@rÉø£Íˆ@qåéó-í´@qÄÕª}d·@qñ’’\± @r;JIªf@r96‚Ž(@r ˆ;e>@r1*]~å@rá¼”õ@r%ã\›§@r3€MËy@rKùkòi@rJ1)^@r¸ƒnw,d@r°ú­}sv@r¨…EÓѸ@r£‚{¢ÂÁ@r£!>ûpÁ@rœÇ Îò‰@r’âèr@r9gtÓÈ@r}LK¯@rPŸòí+¤@r*&F÷š1@rÓÌ,¿ @qýß<”Ó@rü!^ߌ@qþ¥MÅ@r ~O>Å^@r7ª·Ò`@r¢zµc6@r *2Õ<@r+ Yéó@r-œàƒÝ«@ríâç7@qÆŠ¼Æï½@qµQôÜP<@që>LèbŒ@rÚH«Nz@qÎqÜmoQ@qR2Y)ß@q£þ‘[r@q¤„Õ>ó‹@qÊ"CŸ¦@r~Î@@rJªé@q¯ea‡ñ@q4äâ›g@pî­È ³ÿ@qgf¡J@q.2¥€óì@qB‘äØ@qd`7H@qwªb¨š@qŒIÐuí@q»RZ°Ù@qã+d8÷@rPT›ˆä@rtàTK@r’&F0(@r’jäêu@rŸzî£üÞ@rª™©ýÔ@r´Ú8|b*@rµW™3@r«ñÒµ@r§ŽSu¬@r~CÄ&L@r’Ó@žö•@r’|ønJ@r‰·7Åf@r‹@JSï@r’RÍb?ô@r›5íOÏU@r¤"ËÆ˜@r«¤Œ‡Ø@r°gÀ˜†@r®Öòr&O@r¨²…ÂÃÝ@r£¤Š@rœ4N¬[@r“ŒYmüŽ@r‹`wkÉm@r€5‡•—Û@rvFΓíW@rqÜmê°@roŸÞ€@ru#,&KC@r‰G‚%2 @r’‡„äcÎ@rqz¡N˜¹@rEÌeÐC@rÖÜ`*@qÜãðægè@qõ2ef@r-«éf{@rQ1œ,@rkeim!@ryL¿Bn@r}Ðf”ìy@rŸ‡Õ0Òö@r­¥Z[Rü@r­q2Æ@r¶ß'±¥@r½N'ܧ@r»’nôÛW@r¹ýpJ8@r¶ö–˜Ÿ@r³eV¿n@r¬Í ;Ãu@r¢žú–@r40Ê·@rš»§ê¥â@r–1Ò5íV@reüFÉ@r‹ŠY#W@rŠXø —©@r¨?@r\²ðÂj†@rؤĎ×@qý¨ ]#@qð±×R@qëšuöq(@qó×ï¡­Ë@r1½÷Q@r8qEÿÑ@r<¾fS©@r6#o´£Ø@rBÑK¡7§@rJ- ánr@r%ëE Âl@q߃ã¹Á@qÃôcU;@qÇš80Î@q¨.÷ ¯@qw…‡ºº@qY:⧺@qY}#°Lè@qWvQ0Á@qhƒ#Ò»b@q‘_ËÝ{ô@qx&;#^y@qúѵÐ@p…óÆ93@pU°%3;[@p{W Z}@p¸°wÚÕ@päÜ0»`@qœîP‘@q8æ¢ è@q[YuïY@q–§îšž]@qÅoúÕ5”@qüÌ£õM @rQ»L .¹@rc;.è¼@rW­ãuÒ @r_}¡yúÙ@rp·$f§‹@rŠàó;–@r“ˆØȸ@r‹Ú:n@rŠ£âa@rˆ·îû[ª@r~’4¡'k@r{sPÁ÷Ó@ryo,ï@rtà uŠ´@rx(“~¡@r‚ìÏúEL@rŽTn>è€@r—U«?h@rœãå §Õ@rŸÞ¾[‡K@rŸ12 é@r–`¼/ã@rŠÿx Y«@r…£ÈÕ/·@r|Kgñé @rm¶¿¤ù@rdð- z4@r[â¹7’0@rRBÕu£Ï@r_/`SÆu@rx!$HŽ.@rcqG @r(èZr@qó]ÂjWù@q¼´û´@q¥‰¡±© @qÂQX_/@qëGSª@r:ÐK@r2\øih@r=7F4¼é@rH€Ã$èË@rl4ø­Ïð@r“ææ“¾@r›‹¼C_@r¦KؼçN@rª ÞµÑ@r¨P~ç 1@r¥µŽ’­â@r¢Âd†ýS@r¡Åü ûÅ@rLË$@r–¼®åð@r–΄,ð@r”¯Óׄ@r‹ø(gà7@rˆ ü ã@r†;µ5@r‚]ÂNŸ•@r…ÃÜäû@rw]¯OÝ@r2oðÄñâ@r(¦w@ršˆ8éÚ@rœ/§@r0XSÌy@r#sûpýÆ@rPXkÈóÿ@rT>wäÀw@rFû—Ã@©@r8°ˆ}‘×@r/¢¸=ê@rôçr)j@qφœ¬ Q@q§è’²@qˆl=)„@qc”M5°@qRI‹Ñë@qO57㥠@qQÆä @q?GW9°@q%µ§ú@q 2À„q @pÞÑkGþ@@p¾°8p½@pšúd…/@p|®K­&÷@p(œñ@pšýó³v@p»ôPž T@pö<Ü{@qDŽßq@q; ¶·j@qy ^É@q¬!GI«¾@qçY\ïí$@r*=vT¥@r)E€Öð@r&Yœ -@r$ Cêûß@r$^cóhH@rH¦\ö3@rk¼ lHï@rjn$ ò{@rfì¸ó@rh™L4¢Q@rajˆ½M@r_…° <,@rbpTï0@r_Çô Å'@r_–€ dˆ@rgnsôUÕ@rrþ{ÙïO@r|fLÿù@rƒä+þï@r‹%cçSx@r:´p÷@rˆ—D=ü@r~JØ È@rz;ñÖ@rp™!÷ @ra—àö"@rZêWðX@rMZì×R@r@/ì‡g@rQ1Lc…?@rX콊h@r9q^ @qÒ[C7Õ€@q Jð@qt5,]••@qmþd1F®@qLß=A@q¸—£Ñ¹@qÔ±poy@qîå¤x‹«@qñ¹Çûuø@qÿJÔ\2-@r1´›Þ§ @rmêÏ^™“@r‹cl0½¤@r“T˜/Da@r‚ì .þ@rŽˆGþr@r‹»D Ÿ(@r†ûhŸ@r‡ƒ0 gA@r‰æÐÁ@rŠØ—ùÇë@r§0 ËÇ@rŒ¯ ©š@r†¼ cº@r…Æ @r€Ð,ˆš@rw›xܺ@r}›@0£v@r}cñv:@rLP€“rŒ@r$ ûtR¹@r½»Ï@r'4Žˆãñ@r*I‹¢'ñ@r#êkµú@r=p B@r"bñXq›@r Òñí+Í@qúðìsù^@qË~%¼~@q™û©ð@qq,T-’@q^0qŽÖ@qCý À‰€@qIôk:@qUôË×\Þ@qO@}i‚@qT¼²ôqC@qTò,ÁŽÀ@q6ü ¸@pÃà¹À’@p›0,ú…-@pнˉµF@qú2ä¼L@pÿŸÛB²A@pà*S9l@pÛlèWg@pãG|Ë6­@pú½Œ Ær@q½S@q*ZTm@qI ú“^Ù@qxIÑ®¯‚@q¨ÄûÕF@qÑ!8 ¾»@qÚ}þŒö@r»ÛÇÿ²@r«6M,Å@qï£餜@rª©½¥Š@r;A$Umî@rEH™ ¿”@rAèœBÏ“@rC(G”²¿@r>L/%ž@rƒ—.Æ-@r§ÐÒï@q®PLÑ}@qnþ ;@qSié¡+@q=Þ”û` @qA©íÏ#“@qk’u¯!@qÖŠªŠ@qœá^²ßÚ@q®"r\&Ü@qµQó«á@q»ý,rÃø@qßs’Ÿ@r$»Ðþô»@rX…zj/@rjl‡ x@rgÆMÝc9@rg&Ò—ûR@rfs•³„V@rb`Åü×@rc2d¨¨@rmmñ³9(@rv¥Ûh@r{§*N@ryÈmU@rueø!T+@ru’‚)b³@rnëzÐåz@rgfüöø@rnÂl^Ž@rfþ½b@r/‚ÎaF@r~¶Rˆ@qûG-Ä@r3s`¼@rg¾—Ãê@r ð/»DF@qö¨I»ý@qá¨nÑ*t@qËÔÉLÏ@q–ªl¸@q¦r{†bT@q}:µ=Ë€@qa‘r£”´@qO9ÜL3&@q:Àc ‹Ã@qB{£Ð@qQf˜f(Î@qSyÓsá¼@qQèDzuj@qNšI%ß@q+ƒHŒ¢ž@pÎÉtó‘c@p£?¹u¤F@pÂ)û¿å”@pñ l±ïÃ@p÷°ûÑ?»@pø¸ÚË:Â@pú3zÊ4@p÷ìðžN@q˸wÉI@q´Dœ)@qÂÖ|Ç/@q º˜,ÌÓ@q-¼ÜÂ@q_ü”-p@qxUÿIP,@q‡ °Ç`@q &I@qåìšù`c@qЫ~£ðó@q̔“Ù@rq×18@r?:8ò@r© ¯Z²@ráû,d*@rÑÌ’ø@ròTÙïE@r7dóÈ@r!`7.úç@r#ê–L¶Í@r&´ÒK%ú@r+w¤Çpà@r5ê5K”@r?¥%øc@rCeô›»‰@rDá 5ž•@rH‘².¿!@rM3<=¬@rN…'fóˆ@rJíKmö@rFÇÿ­r*@rCoà¨\L@r7Ú±g@r/j”¨§p@r(œ!Þ@qÖ´P‹-@qnˬç²H@q:Ê,@@q+¼B`­\@q#"ƒ·—@q0œTù¥§@q[/£þ¤|@qmd‚-?¡@qm0ùm¬@qzeBç#@qˆº`¬@q‹ÔجX²@qš}…C;@qÚSú ;@qõ• õ»@r -üjS@r-:.²z@r2½xV}@r9V¿° Ã@r9L¢ñXº@r71õôZ@rAkÉæy@rX¯e¿î@ri9w´/H@rhΞt N@rdŸ§P­†@rc;d2 Ì@r]ßæ-aª@rZ»{½@r_RêÕ'@@rKò6B:,@r ÈL<ñ³@q꨻I!@qÎf5]\@qÖÇ=2i@qÖXe=ût@qÏ`x,m@qijv @?@q²ÿXáÜw@qgbN~n@qšŠºÄ¼Ù@q’p¥u¯p@q}€Ë‰®·@qkѪ¶¦@q_ô@qHФÙ@q:Ç2QŸ@q@8)8¾@q@ñù#ß@q?šÍ9@q<áY™B@q+©é]v–@pçúþ?› @p»â»ÏÇ¢@p²g‹š/@p¬”Š_>X@p¶€eçüŒ@pÜH5]Ñõ@pçPfÉ¿‡@pÞ…N׃¾@pè÷ÊÀð@púeS dP@pùÁ!=Hk@pêC0õê™@p÷`÷k(@qúpH¢™@q!B<=ÿ@q$¾íH5T@qN¨>tŽ@qzËGyP @qˆ {¯€j@q’R Ö@q·À}~p¶@qÝ5œÆ"@qç÷ oå9@qîŠy+zÊ@qï8'ŽùŒ@qó+¿(Ü@qúói‘[š@r_ȧh¤@rÖv&­ò@r *Üüñ@r ¢¶ú¶ƒ@rÇ_rØP@r™Šæ=@rlâ °×@réc)‰7@rP,©@r }p.@r#Ó@qZ”„W@q†{ÊF£@q%Íøò?Ñ@qA;Üië@qIÌ/ª±@qCf°%?@qFôòˆ¬Ó@qR|OT\@qXõ<L{@q`—¼¸»`@qxíîŠÃ¹@q'Hiç@q üàª@qÙ9U©èM@qì§ß‚ÚQ@qþü-^ð?@r g2BÌ@r ˜•sQÏ@ræ«–eÎ@r;Uu@rRÁ§«@rTÍץ›@rRï-j‹B@rS² ¦é_@rPøxD @rM ‰ˆ@rOPOˆÓ^@r@ å®@r: > ±@qÞSØX(@q¼wÞƒxN@qŸ^I\p&@qŒ3 t @qŠzmm%@q“Îö`•@q‹ðÉw³@qyddvL @qw™X#¼@q{46¡ÙÁ@qv~wÀß@qgš~Ëù@qYY2ÃC@qAO (@q-}ïþkL@q&ûýUÓ@q%ÉRåL1@q;ß„!Ô@qÅ;q)å@q rZD«@pôwêb;@pÛ¸,6åŸ@p¾»÷0@p˜9°7ØA@p• ™ Fu@p©ê¹®¯â@p¥þeÄe@pšÕI#¶;@p°™pŸ@@pÏz6¸ÎJ@pܦ"J@pÚ•I:Þ`@pà\uäãØ@på‹: ´@pëzÊïË@pæÀCØo@pò­“zI‰@q_¦=o@q6ò µ™@qXÚ“ÂN@q†RÂJk(@q¬º¿!ýq@q»MZ{ t@qÁ´Ö@qÁr¯ $@qÆ‘)M­@qÐósÆ{Z@q×UeóÎY@q܇­€@@qãgèè@qåä¯ôfx@qèÎwì=@qï_‹_wÊ@qõÙeŽXƒ@qølx!J€@q÷¾Ñ¹*Ì@q÷ƒ:xÜm@qú2ß;7@qûú:ÝÇU@qøŠÞNq@qö–ç#a@qùBjΗª@r)¯úÁ×@qôÙ"L§d@qªm$¶5@qS—œ wÚ@q#\^á‹(@ql¶¶@q y€ZD@qKëô¶@q$êã)å§@q'¹W¬Ê@qÅÙ+[Þ@qßOä+@qëýn@q#~MÑòt@q.ÊS~iw@q9çÑ‹Í@qIE2•ì@qeI+ @q‹j—°éæ@q§3ηÓ*@qÄ%HÙ«:@qѵd’Ê9@qØã½º¤ @qëÐ’]3@r‰ä…_@r(n±«›@r6~«'Æ @r:ÛˆÉýN@r=˜´xª@r=@Á‰u¼@r8ÚÛí@r7H¡è<<@r6ŽÈÆ1@rÃù w@qì,röúø@q¼,xC@q‘)îÌ-@qoG"\™E@qbKÆÆ3œ@qm‰‚\GÑ@qj ßÂß@qZ¶?˼@qS °û¦@qXøè÷ï@qXº;’¨ò@qKI¸äÐ@q=“᫪@q(ùfy@q`O Å@q5 ÔOÕ@q e6ò@q)>'L @pñzEáq1@påíxŠ*@pæ5½ß@pà‹“‰Áþ@pË«cs…¢@p €¿9nÙ@p‰TiÚ®Á@pxQô;q@pl"A@ph,ýÃ{ù@p‡à^G>Ô@p«¤ï æ@p½NdÎ&@pÆnÒ@ Ž@pÉj‰RÌ@pÃéè<ÛR@pÄî=€@pÁñŽÑDÝ@pºâÖ‡´À@pÂqßç>@pék¦Ž¡]@q#æ]}@qZI½»XÁ@q~ÛÌqÄ*@qöÐWv@q’o”Ï–@q’G G°—@q™’ŽŠ7@q¥t$jBv@q«Ý%ÄüÍ@q°æÝñ@qºe59¬œ@qÃô8Ù¾@qƵÏTz@qÆüûMoú@qÉyi d@q̶ßni>@qÏÅ@RÌä@qÑ‰× +b@qÓtѰ@@qÑýOxo@q͸&‹gé@qÍX âþ@q×C.F>@qÞÌÄÉöX@qÈÕ,JÆ@q€2×±@q1õ è!@q`Hûk”@q,—Ó¹^@qÃÖeÅB@qc˜åÄ@q~ Ý4@qÖe91‹@põØ8Oë@päª^š@pâ¡ô2X@pÆÙ@pù¦"æŽ#@p÷·qä¸ý@pø,Æ„Õ@qu]»}»@qDtƒ°¼ý@qi"1DK@q†"‡…^*@q—)Ï&!=@q£ÖúÒ"@q·Ûàæ–Y@q×EÕïç@qûUÒJ @r-FÈ÷j@r$Rõâ@r"¦Ã÷ºe@r!çé)1@ré¡Àƒ@rˆÚ“Ѩ@rÁW^®…@r3fˆ¢@q鑎=ð @q¸{€¢›@q_²Û¨@q|ôx õ@qcÃ8[(@qaSÕv©@qZuÍ\&s@qHÖ°V`»@q8ñ›-¨@q8»Î@q6ùÇyÜ8@q.j#g ô@q"^¡Ñ˜×@q©Ët@q°ö9«@pûÎw5@pòôiÍ™í@pëùwÙO@pÝúE'ª@pÏ‚’ʼn@pÌµà‰š@pÌQ,Þ¥@pǾdO@pªÓˆ/œ@pøPÁŽ\@poò¬¶:@ph”ªÎÞ×@poW~Þ©n@pˆ¡”i×@pš½éî@pžäÉ]Ö@p£VÒ;¿Ë@p ŒeÉã@pš¹õ…¬@pœM¡"€±@pžKºŒ‹ì@pŒzt*-@p.ê§ö@p­…i¿@pèP×UîA@q.s­ª9º@qQÅW*Vî@qYwߤÙT@qWò:(v@q]{P(ÙÎ@qmJ«iŽ@q}Bg¬^!@q†¸ñÆ©@q‹Å#¼u@q•ÛË5ù‚@q¤´™Ðÿ,@qªµúàc @q§:ÒB¹[@q¤ä€Ð¾@q¥Ï:*•°@q© ‹$@q­º¦îûõ@q°mÕuô@q®&cÊyT@q¬í¾ï¹@q®°6(îº@q·…Ò;‚†@q­ÐõI¿@q‚uI#D@q1¸ßAp@pïWr-I°@pÚSnLú@pæ±¢r)Æ@pîi3Dµº@pêAN#½S@pÞšŒÛß@pÓ>6zÇ8@pÌÜéypm@p½gz*Ts@p¸¬±Ô]Ú@p¿ H@pÃg:SLÇ@pº‘›²:@pµŠQ ´È@pÊÿYZøJ@pù—¶$E[@q!F"z@qA+çw¦D@q_@þ¨úe@qvä[Sz@qšg…Ìà@qÁ¯Å7º9@qÝß‹_ä@qò¯!“G@r=ƒâ-â@ròAŽ@rÚ*Üù@qù€"9r‰@qöî÷W<@qñ=Âýw?@qâ¡+DPa@qËYI~ýL@q©„€"Ð@q¨Ιï@q ›õïž@qv4P¹9ô@qg¸NÔ$@q\D¥ž@qE’…ÿ>¼@q.;ÞB'z@q#¬ŽlÀ@q >Îóüÿ@q B•Å@qjWa¶T@púƒXJ@pï|+Ö’@pæàQƒ3ú@pÜ-Ù6Û-@pÖth–îÅ@pÒ¨ÖFÌF@pÈÎòÀ0@p½ñ¨±Õ@p¹k~éaè@p¹4TBâ@p°‘s°@p þÝÉ÷§@p‘ã‘M´@pýÆÙø@pšEñ§8ÿ@p V4Á\@p•±v^s@p…ÓCt»@pzj¿2~@po9Ã×d@ph÷χŠ@pkîÅPÏ@poŸdµº«@pdn,ý¦£@pcøsU ]@p‰H)ï. @pÆ5)à@@q ì7¾ŠÔ@q)ýIÑ\:@q%¨W|3¢@qf \ÿ£@q%J]¹ý@q?;H7d,@qV]?Û@qd”)‰ó.@qky%P€Q@qsE°Çì@qËÄ—0P@qŒk5BUÄ@qZ •Ô@q‰`2xŠG@q‰ôzì€þ@q‡£W¼'y@qŒMoD®@q’ÉšÉ÷@q’;6ŠÎ@q’ºç ö@q•³¶’*@qk†=HX@qdàtId2@q#þˆ€^@pÔª´^r@p«ñ>Rú4@p³5¡q~@pË0ˆIæ²@pÒr™w‰@pÅ- c@p±Vxé˜@p¡žÞ‹]-@p ç;¥@pš±W+;u@p•qpõÿ@p”'‡-f@p’à#x©@pt¸Q^«@p‰9˜9º@p‘ÏÜ<Ÿú@p­# Aé@pÎsÓ†à@pý«Á&`@q3?'@qb_ 4Û@q–õ-ßÒò@q¸Øuݼ@qË-?,g²@qÚZ%¿w@qà4þóÞ@qß2…P@qÜ%·ü@qÚÌ@q×Î¥`É\@q€-‡Ï@q°{BGÑf@q¦0Œ.l@q›’}sxñ@q¥gU;›@q‡Ä%b«3@qoÐù;h9@qbˆfš†ö@qZ²ø§ìˆ@qB÷8‹@q$œ—ši@qïbÃÚ@q ç`fe@qTÌa‘@pöí™Ùœ9@pãÆì{@pØeÒÑM@pÑCi£@pÉÞ±ý]@pÉg<¹@pÍ„æBÈô@pÉþ#E¬ö@p¾ç¬ïw@p· ÀÛî@p³*t,@p´ Çx”@p°;GgÄ@pªyÌÅc7@p¬ó­ôÙC@p®µkjÒ@p§Ø‹Cí@p+pJü:@pq» 5"â@p]#@ Ê @pMð'ïÞV@pE‚¦šÊý@pA1<"¦R@pD#À`@pB9¥Ú–@pJíºØ²¤@ptÞjË@p®Y)‘@pëõ¦@ªÃ@q³6/]>@pþ›qŒ6d@pí:²ÃW@pó(qu¶Ö@q Á€Ø<@q'ßÍðb@q9€Ÿ`z @qA¢7FlU@qGê3}@qT)û†#¸@qc%ögQÀ@qlâNãa@qmCϩĺ@qmj$‰Ê5@qf!€´cØ@qf6ºì@qn4=G<$@qrõ õh×@qtp¡kÊ@qlŽý­ŽŒ@qMi¸ÕI@q²ÛæÞÎ@p¿l’@p“< ÅJ@p’}’ ~g@p§]Ì¢@p¶õSù Ž@p­˜`Ìo@p”•EáË@pz&ëz/î@poUlæŽ@pr^ÃYG@pq9ÈÈa@pjQý§@pe.‰LÚZ@peSÈœW@ph`â?ŵ@phi÷¤Â@pgaÀ%Þá@poù ¹ì@pŒëù¶xÁ@pÌhÂs€@qûÕš±Ë@qa-êYu0@qŠæm(ÒJ@qžêÚ*®È@q¬“VBz¼@q´HÁè¦Ë@qºŠáùf @qºÖUW+@q¶ÇÐ=ý@qº».›Ü|@q¼ÖÖZ&þ@qª›úÛ'@q˜qGIà@qmKã.@q–‡7/@@q‡r)è×@qbb}y£Y@qGã óã±@q>x°[…¤@qD"hÛ1ò@q6qÕ”T’@q žfÕ}@pÿRï¶v@põÝã>™0@pðs33Hd@på£ã‰@pÕ„Cäq“@pÈU!mÖ@p¿;5ŽÕ@p½B/b#5@p¿ Ô…Ä>@pÆg•M²G@pÇ‘Ô& %@pÁ"2œí@p¹þ2uÂÈ@p¸“Ùi@p·\î!»ô@p³W3§MB@p«ŠÉç0`@p¨„"¸Â@p¦Ý…¿ü@pš ;SLE@p…ÜÂÍ}@piä¯j@pU»ÆIŠ×@pKBŸfn~@pDý*1ÆÇ@p=‰+:3@p9Aáû0&@p8®Èü¯@p>šý@p[¬}Ê@pŸ˜³^›@p«þÁ‡YB@pŇû…@pÌÜm²°@pÉ'8×@pÆæIáÎ@p×ôZ…ëß@pç\¥Nö8@p÷ÉÕJ߬@q@‚Íä@qb7Ío@q$@^ß¹ù@q/dãצ’@q6 ]½Ùx@q7ÔN@q1çÙ 3@q'‰X÷£ò@q$H^«Àu@q)š´Ä.@q7ˆ¼7Ó†@q7±Ñ@q¨ÊãÔ@pÜÊE4u@p–– *€C@pqÅÖŠÃ@pyaÎcËF@p)qüöÚ@pœü°î##@p•Y&u˜ã@pxM_§È@pWK‘0@pAúg¸@p?Œ±¯ÕY@pA¶íŽ:@p;‰‚œ´j@p.ôçKö@p(Þ™…wQ@p0TÛ2W´@p9 ³Ë]@p;IÏ3ç@p8¹wc @pCíþÿP@pco»@p·ãTí1@qx‡4eq@qAÕQäÔÀ@qK(™Ô¾@qPåÒžZ@qndUó @q»“Ç*@q“CÞ ïv@q•Q4êÝ @q–žÊ@q,®™½@q£„q^’@q¥ú†€Ö @q—ÂG9®m@q†Q4öí@qu ì2ý@q\`XuB@q3h€¾}@qžŽ»„–@q ÈL2O6@q¹]üQ @qÿO˶ò@qÍ8æ@pðuq²¤¯@pçÞSe_D@pâ ¾T @pÜMW@pϹ›¤ç@p <ë·@p»¹•'‰@p·ðÞß÷í@p¶U8VÜ@p¶)Ï >@p·@zZu@p³Ï(Cm@p°Á ¡n@p²2q |Ä@p°8½¶‚@p©H¸º*”@p›ààˆ³†@p¬–ÜÐ@p…m½v)b@p€mDç¨@pwIEº|@pkº¾ñÈ @p`N&ʾ‡@pYšrI.@pV³ëO‘@pSĶ[´@pMáÃíp@pC= èå@p3NàCd@p$(›ÎTL@p(~{ìjí@p3±í=;9@p?Þù @pT:e@£@pt€©$8É@pvˆ^À/@ptïKŠ«]@p~Þ‚Àœ¬@p‘¥Á~Ò@p¹1eE1@pæ+C-ò@pÿ>]UK@q©?÷o{@pìÆÝGç@pÖ?‚³@p½Ë”Ñß@p¨el¿†@p ›Mr3Î@p¥n:#%@p©ãÃÝH†@p bã ˆ@pÄs³~@pOÄ·‘Rî@p6˜û–K@p8Gt]@}@pOlÿ%]@pg1N8@ú@pf€ü‚@pR¥KàGù@p3ЧŽRè@p­°@pþvIõI@p±À†@º@oôª]f×í@oÛ¡¥ss@oÈÏzá"@o˯ ›6Ö@oá `ƒ@oèED±·È@oâˆlk{:@oò$KxìÖ@p`|˜¯@pIòµ’m@p•ÐzI X@pÄÍß­ÇÇ@pÁ2É¿@pÁn–›?@pÎ_ š@qÜžyƒÔ@qCže¹VV@qcÆq¡@qrYinU@qxüMýU@q~f@×€æ@q‚±mìì@q„­$­t/@qt}œÐŠ@q~Êôè½Ñ@q7jØJä¯@q4„Lö<@qXT¡“ä@qŒ{5þ@pöŒT¥ô@pô~}bÍŠ@péºÒpO@pØÂÑÝ9S@pÉ~3nÉ-@p¿ä ¨X}@p¾zäxòý@pÁ)ï-:@p¿H‘¡_²@p¹Žç_ÝØ@p³ÿ&:ÎK@p®„Ç@‘@p®nólæ@p®°É@p­ž=–@p«^dcs'@pªw’wÍX@p©’®g„-@p¥ ùÆëÆ@p™Œ’³Ø*@p‡âTBîê@puj¾Cù@pi—ÆA ò@p_à¹ß1@p[y @pYo¤<@pWm߯–Û@pVøoúB*@pV_Pæ@pS²bÙÿq@pHñ¢‰?]@p6?œÖ¸@pܽF@p…tÔ@oø S… @oÿ8{× n@p 55Ni@pmÊ=µC@p$%ÁC@p %gé±@p}•ø‰«@p ?êÒÑt@p#u= Z”@pTD$îŽK@p‘z"1Ô@pÆ7]~¡¸@pÁ—r{ž@p©ˆÑuò­@pƒßYã@pb™x=‰ž@pG’]6aŒ@p6pÆ€Mµ@p/­W÷@p(àXÜ…@p!¤™8>@põÅÉÈ@pa’g@pÁ!7@pï*•'»@p øîËU@p–ÛüŽÙ@pº)äf@p®ý,?S@oÜøi¤ê@o»]/%ÉŒ@ošûèŠÄó@oyf æ…Ý@o_xÝgÒ@oQV1z@É@o]Qrni@osHª¶Ì@o|ºÔ×&O@oh¿Õlg@oUùØ´ãö@on塘ò@oÉÉ/1=º@p ^‘²@pRn”™@pSê™>Ò@p4±¹¾@pþÆq0@p2†+dJÐ@p\…#@p ÷¹D¨@p±§¦@oÎøz"æ@oǪʦû@oݵ5ri@oÅ Õ9‡Ý@oÄÑD™@o¾¶š¹@o°h•§RH@o“ákuÃØ@osI½Â@oONtÎg£@o)Bí¤}@o{”àì#@nåNÝž¹É@nÅŽÇó@n¸->= @n»XdB$@nÈjîìèB@nɱ:û@0@nµ½jÇí!@n¡Ð†Ú@nªÐÃÔwK@né‹×(fH@oUYS(“¸@oмM„GJ@oÇŠ~àWõ@o Êà~=Ð@oWe"QyA@oH+€@nñY0Ü@o 3"H}@oPwQQ·x@o‰Š‰,U}@oßËÊ«€y@ppà#ÛR@p¢¼IŸ@p8Ê%²e@p[A£¶à@pz¹Jx Ù@p›†°i@p‡Im÷@p·„¹ µ@pØé¶WÀ8@pô“ I9‡@pó[¤N4@pÛžï¦Ê@pºÀõ;ý@pšäéŒ5¦@pS!ge @p‘,ßáF@p:ïÕ«!@p ™®¢@oùEŒ7÷ @o´ÐbkÛ@@o£”éä(@o…!pÅ™«@opƒ,½øR@ok˜ù¼­ø@olVTÏ @ok·Ýhm˜@owZõð@o¤¼)ت@oÀoúO É@oÃp )÷/@o¾·ñÌ@oµ G‹1@o©ŸOtl@o• ¶ƒ­¼@o~l”³ü³@o•d¨¼«@o—›Ý3?@o€ûe2^@og!ö’ƒe@oD¢ó®Æg@o#7ÕZj@oQ¬I^@nÞøÚq¥-@nÀÎ (%ü@n¡tüG4@n‡ §\×t@n|(rY¦v@nvD)Sõ@np—ÖÂaÿ@nf’Y¹@nX}ø™}¶@nTÜœ•C@nkΊİ@n¡‡ûC“$@nÒì¤óc6@nþ3ùÐ@o>5ÅhÈa@o ÙÌ+Œ@nöSÿ¶Fw@n»“Å\@n•.ŽÑe@nš89Ýn@nƉ`¥Šº@n÷Ù`“‡@o#¶ >,‚@oJ¤­F<@o<•ò‘o_@o~¾+EÊ.@oÖó&nÝn@p R¶õè@pRÜ`7ÜÄ@p@â7Þ@pvHî@pœ]5(>³@pÀ©)X‰È@pÍ¢ßvf_@p±“º ƒÁ@p¬,Š9«@pt³ü¨"@@p`7J$Ë@pDÒÛ¯YÕ@p9QÈ…PÜ@p:RÛ-ç@p@ЃˆZÏ@pMmïá@›@pZ5?º@pU‘oìÁ@pB‰[›š@p3“J‘Îà@p)o¼ù=Ä@p+ /xf@p$ f˜@p¨Ëä6Q@p }Gb|@p#²· è¡@p'˜ïz„ö@p* Ç%@p*=µ;>@p'aooH@n1æ½ýë@n#Äóâ'°@n#¢Ýý@n|zZ¡@n½8õÎ\@nu)S`@n5üzº\Š@nA«ró [@nrõ¤>èt@n Q̘@n”Ïlq@n…¨ – @n]Ùþúªú@nFM°ÀÇË@nREe@nm¯ü™ë@nŠsÀ£fÖ@n›½NŠ1@n©ïÇK]æ@nšVsA¿b@n¼Ú3¯ÃŒ@o E1i¼@o|?“Ùá@o÷Î2JÉœ@oÄ$È Õý@pÛàï@pEIó±’¤@peÆìØ@pnAmåcC@pWЉÆýˆ@p;S›,•@p$*ܵÅX@p6\ ö@pf¡È@oükvúÁ@oþ~W¨”þ@pR«?@pê#“V@p'1Ñ€éO@p0·&ä_Õ@p-²©e /@p%y¿7ð@p »&waF@pò‡z¸°@oþ l²U@oóœ‚öá@oñøÅ´B4@oøñäá|Ó@p B÷ƒXô@pþ–´U@pEK4ôd@pýõâÓ@p xx3ó@pŠEeý©@oõD OûC@oãGõìZ]@oÒ ºÜÐÐ@oË„–<Ê@oÆNºgB™@o°»Jÿâ5@oÁ"O6!@oµ(QRQ@o¡›"Æ`z@o‰D°ƒM@olwÅää@of»ð@o,Ô?Jkã@oU§d©@oì˜@ol îÀ@nþ Ö-b@nöÓ™i(Z@nòú ‚‰@nóä <@nö Æ/2z@núYž+h°@o@¸7á@oC¿é:@o-˜xm@oÎòà‰@n÷‹ŒE5ã@nëB g¸@náÐWH`@nڼ^@nÔb7‡ÿú@n˹ÕC@nÃÛœù“*@n·V¦.Q@n aíZ’p@nˆ»¦Î}f@nnZNµCì@nT.ðqõ?@n<àèC;B@n%"ÙÆ*@niè£Ï@naé"O”@mùè/IM@mîQálíx@mä½5]°Î@máA—ÅÌ@mà^…# @mÖ O‹‹@màA Œê@mìc ¢a(@nÿ‡eIÒ@nc»o~@nßiÝg@n…Ë¡\@n fgü@n ú%haN@nâ¤ÏË@n"½R‡w–@n/¬3ª0}@n,&‹Q@n'æî‚@n#ïPé$@n,¾@Iýÿ@nr—¼@nÌÐZyRj@o9Kóœ|¾@næ’vî@oDxìNÉ@oŠ·Ìå¡@oÀ—#äæe@oÕ`Å$Ýé@oÔò?äÀÏ@oͰÜ%“ó@o©_m–r¤@orógé#@oht.;@okŠ»´@oy‰²§±@o »‡W'@o©ÍÌ_òk@o¿Á»Í¿å@oìqͤŸ@oó¿OÍg?@oíë@¶y@oÜDW @o«uÅŸ@ožóØ|Û@o•«6í @o‘•)€†@o‘*6 @o»Xî?@oÏâCÈ%®@oÏ@“dkÑ@oÉ힊Þ@oºòbõ¬@o¥›ü¥ÒŒ@o“õŸ!m±@oz¿êíF@oY3;{hÚ@oL‹õƒ€@oD}žL¥»@o=ÐŽ¤@oP&\¢BQ@oI!· Ÿ@o?4eoM@o.·@¡D@oĪA¼°@o—<6–Å@nò(ô:@nè¸i.˜”@nã£Æ-à@nÞëÒÛðë@nÝZPÈ@nÜ^° %@nØ´_ý‚-@nÓ`ƒuÛ8@nÍ‹ðcõ@nÈ!_yF@nà$Ñ›@n¿®"éÀ@n¶b½OW@nª´r× …@n o6V6¯@n”SÙCf@nŠÙÞý#@nƒ]NÇXF@nbçÚüº@nzÓ•¾~@nr–](#ƒ@nrR ž>Ñ@nf;_k“ö@nU¾¡‹p@nD£¦–Ö1@n,|æêUa@nÿõP&@n­NVP!@móS2.¥Î@mæV'Ú”ñ@mÚˆ¹‹Íñ@mÑÙò–H@mÇ(cMO@m½+‘õ‡Æ@mÁ©$´“@mÈgY ÷@mÍóA R@mÔFX{Î@mÙ*¼A{@m×hsL6@mÛÝ•?…‹@mäæ 2n@mè©ÍAeÁ@mîeqá2p@mïŠ_V3@mèà¡:èÆ@mäA™Y´@mÕð¤iÍ*@mÌônzå@mË ic’ò@mÖóˆ‰ @n­,س?@nCÙù*Mÿ@n‰E@n]…è„@n2æ~€¶@mù¯U×Ç:@mëz4ì@mà¿,ñ”Ò@mÖãI3v@mÏ–Û³Šc@mÅZŒ]ˈ@m¼$“… @m¸Ä[œ†@m¸ìì ˜÷@m¸5ï2ÏK@m¸Í+Ub@m¿R€‡&>@m¾óqn à@mÅëKÖq@mÕäÀd@mØù{“k@m׃ÀP€Ç@mÔ©lñ¥@mÊäàïj³@m¾A+\7Ñ@m¶br@@mµxÐ+@m½ÿ´‚+°@mË7jzí•@m¿D*¡B@mÞç±þL@n¤žúl3@mÑPÖc@mæç¿Ïø@mû$'ÿ@n$Hãá@n"û×ÊjØ@n2R¨x¹ê@nCÏ‚@@nTSTqz@nd@¡ÇÌ@nvRÝ€÷@nŠ uº®[@n›mb{ò@n¬¶‹ëzÐ@n»bÔiÈ@nÆó“ng@nѹ`@é@nÛëVs&@nã ‘3'¡@nêbû@nïZx†21@nó0ã—;g@n÷¬‰Þ@nüÍwM5@oCDIŽ™@o <4â̳@oJ6¨{†@nü´]ì@nö’ŽIÙ@nðˆH~Ò¥@nê #"l@nã ¤/@n۶Å@nÔ­Šn«@nÍoÄzO@nÇy¸º@nÁ³€[@n¼g„žÿî@n¹Çy•Çø@n·–Bí”@nµ#ß'ãô@n³´Hßñ*@n±o€)§@n¯c³O ’@n®|šÆiY@n­ :×í\@n«ò¶gù}@n§°°ÅKÒ@n Kh·,@n–?ùÀ @nŠ k­$Á@n}€Â^ÒB@nrˆ •èx@nh¾†Ð: @n^}iô„¶@nSœÙ”k@nKO‡Ú²+@nEÛY‘ @n<Œó“<]@n4iùá@n/7a˜“_@n*Ãc‰÷£@n'"ñê—@n#¬€á‚@n/Ä>÷0@nl“²lÎ@nýM.­@n1Ãc™@mý,bù @mñÎV/õ@må¼$%~ð@må|Ã!¦#@mï‚êxŸ@mé>Fìɾ@mäŠ,A>@mß­:.@mØ_™1£@mÑôóQ «@mÑ_õ4+ê@mÑ‚^Ǭà@mЪb%Ìs@mÏ1ëPÿš@mÍ&¯—TÑ@mÊ#ÇÂëc@mÈnwl X@mÈ}–Ká@mÇú3‰çØ@mƇýV}@mÁ•”¹o¥@m¼jU¬n@m¸b†£fP@m´þQ|*@mµŒd²#@m¸¹íñàW@mŸ=„Û@m¦¡ð2‡H@mº*"[@m¶xüþ’@mÅ ´˜¥¢@mÐŒ¦ùî@mÛÙÞµÿ@mçAs¯³„@mòzÛ ç_@mÿÙ÷üš@n íFG˜@nÀw¯A5@n(ÕX¢÷@n6·ë×Þì@nC_ŒþÊŸ@nP{žÌÅ¡@n\r`q~D@ne ùx@nmé,ø—@nsGÞl)@ny×ÄiÉ@n‚g4UÕ@n‹—ùjö@n‘í*{a@n™ûÍ’@n [ú Üw@n¥\˜òt@n©€¹e@nª¼ýþì]@n«B÷º@o@n«*aw­@n©Ž\ê4—@n¥ñä‘:@n£(ÒÊø @n¡^ʤ¼@nžoçZ†ò@nš·cŠ@n•5J xd@n‘Wëpí@nŽ.eÓn@n‹Ø•¶r@nˆæ|j@n…·•=/:@nƒ Kqê©@n€¿ùgÊú@n~,`£¬@n{ñ-'S@nzV“ i @nyaŽ£¥@nv¿äWB@nrpëºL@nk ×"®@@nc^bwdC@n[àîíïº@nU:fA5@nOÐ.Æ· @nKeí¶@nFkXJé@nA‚þ%ŒŽ@n<íÊ*@n7Ô:Vý@n3;'Î"'@n/fÔg8@n*úÃ;=Æ@n&5~-¬Ñ@n!ž’ú@nÅìP@n¢]gñ&@n²ŠÍå@n æÄû0R@nÝ¡ö8@mÿs˜Ô@møh 7t@mñÁ.1@mêXJmœó@mã8¸îÅ@m܇[Zu©@mÖÄØQ;¤@mÏÑb[u;@mÈHÌöC@mÁ‰wX’@mº44@m°ýñ`.ˆ@m¥ds¦p@m˜™Wòé]@m[‚§”@mŠ›÷;`ž@m‰«ÑbBS@m‹ˆ}M¸Ï@m³ëæc¸@mÙïÏW@m‘Sw¨Ü¬@m’mRã@7@m’Ê%B߸@m“•ŠnQB@m”`ºý©@m–B!Ír@m›JÁ8],@m¦iÁ@m×â_™ñ­@mޟ凵@mäj·¸ Í@mêó&©0@mðüE'@mõ&g'³³@mû²A‡@nPï’ðÂ@nê ‹ô˜@n olAÌ@nüÚEO@nƒþªŽÉ@n‹ü[@n$|Õm{¶@n(ã-•÷¦@n,æÚ›Úg@n0ž vwX@n4&]=T’@n8ltýá@n<àç¥/@n@¬{˜qC@nDawçk>@nG»‰²‡‡@nJq*&î@nL·(9Yš@nN†a#¶`@nOÚœI4Ë@nQýëð§@nQ¥+ È§@nQàRú6@nRN03¥9@nR¨.ó†]@nR‡×>Ø@nQÎJ IV@nPþL޳Ü@nPLútÏ2@nO‰Àz)ö@nNÑäý)S@nNPCy@nMðºA@nLäþ-@nKdÛöa@n,ªPÞªð@n)´#aÙ@n'ôÁªÇ@n$³‰F2@n þȺI]@nÚyf×@nÆÚ%WÕ@n@ê¹}x@nÉ0-ˆM@nÈ~æ¼™@n žiP~¨@næ9ð÷Ë@n¼“ô‘@mÿ€†‚ö„@múð¼˧@mö;×GÓ@mò f¾y’@mî<é·O@méè^9É@må{’A‘˜@máTÑ&«"@mÜÙuÍ>@mØ@™÷Sß@mÓÁM\Š·@mÏlóiý@mÌ4e—æ@mÊO J˜Ò@mÉ3˜ƒì@mÈÅ9€%@mÈœìš9@mÈ~þ绎@mÈ@»Ð~@mÇãë ë@mÇt€[@mÈdi@mÇùŸF›Ñ@mÉ/,LÕ@mÌEÑ#*@mÒ'¥:æ@mݾCT@mâÈ_d|@mç‹Æ‡¸L@mìJ©Ÿvç@mñ\i„)@mõÏL¶@múbd&Ü@mÿ_Yåéý@nÛf:ùè@n 77ÿ _@n¢v7“@n†É€@nô #@nÜàƒ¨Î@n‰˜eÿx@n#Übå@n&Wâk{#@n)h˜úò@n-~8j6@n@PÜÕ@nAÄ}X.@nC56oã8@nD™±½=@nDëJ»@nEÚK÷ý@nF†dOm@nFÔÜ ­*@nF­“ï5m@nFzÛ·µÌ@nFP sš@nEãßð¥á@nEj?ÌL@nE1™@nD]Åxi@nC¦ŠØT¾@nC*¸÷\Ž@nB²5»l@nB<¦Ô÷@nAÁœð*µ@nA0q!€D@n?ëz§ú@n?"µw'O@n=T[}'@n;“| @n9]­6E@n7“ßqþ`@n5£uý@n4K»Þé@n2tÀ3@n/ô£+1<@n-£¡Sê@n*òû3×@n(<’cÚ@n%ÅÁ^à¾@n# ïšJò@n 1#ºt@n‹¿&r@nxGÒçE@n1é Ѹ@nôBúí@n:Ññ£@n {ˆÝ9@n 3—@ì®@n{;è~@n¹™ Ó@mýƒ m#@mù‡]IR@mõt“üÑ]@mñÙçËV^@míí©à@méû¿ç;Ó@mæ;D[“@mâ4àXF1@mÞM´ …¨@mÚæ‚÷C¥@m×ÞŠÕÍ@mÕ”äBÂB@mÔ V¤¥™@mÒûÄÛ? @mÒ5^Ò¹@mѰá‘@mÑ8ƒ³¸7@mзçd@mÐ!]­I @mÏügjD@mÐ*$‡TR@mÏíq‘ˆÃ@mÐó¨ƒsª@mÓÒ_/×õ@mØå”íöcf-python-1.3.2/test/file6.nc0000644000175000017500000000532412752572327016152 0ustar daviddavid00000000000000CDF timexlatbounds2lon  ConventionsCF-1.5 time unitsdays since 1900-1-1 long_nametimecalendar gregorianÀ$ lat_boundsälat units degrees_north long_namelatitude climatology lat_boundsô lon_boundsülon units degrees_east long_name longitude climatology lon_bounds pre  _FillValueGžunitsmm missing_valueGž cell_methodslat: lon: meanÀ@Üè@Üï€@ÜöÀ@Üþ€@Ý@Ý À@Ý@@Ý@Ý$À@Ý,@@Ý4@Ý;€@ÝC@@ÝJÀ@ÝR@ÝYÀ@Ýa@@Ýi@Ýp€@Ýx@@Ý€@݇€@Ý@@Ý–À@Ýž€@ݦ@Ý­@@ݵ@ݼ€@ÝÄ@@ÝËÀ@ÝÓ€@ÝÛ@@ÝâÀ@Ýê€@Ýò@ÝùÀ@Þ@@ÞÀ@Þ€@Þ@ÞÀ@Þ'@@Þ/@Þ6À@Þ>@@ÞF@ÞM€@ÞU@@Þ\À@Þd@ÞkÀ@Þs@@Þ{@Þ‚€@ÞŠ@@Þ’@Þ™€@Þ¡@@Þ¨À@Þ°€@Þ¸@Þ¿@@ÞÇ@Þ΀@ÞÖ@@ÞÝÀ@Þå€@Þí@@ÞôÀ@Þü€@ß@ß À@ß@@߀@ß"@@ß)À@ß1€@ß9@ß@À@ßH€@ßP@ßWÀ@ß_@@ßg@ßn€@ßv@ß}À@ß…@@ß@ß”€@ßœ@@ߤ@ß«€@ß³@@ߺÀ@߀@ßÊ@ßÑ@@ßÙ@ßà€@ßè@@ßïÀ@ß÷€@ßÿ@@à`@à@@à @àà@à @à@@à @àà@à!À@à%€@à)`@à-@@à1@à4à@à8 ÀVp@VpÀfx@fx@L±<ì·‚@JÀ;?.:ø@L”wÑj Ë@K«¤¶9X_@N烗b@Q º|ao¼@S¨"‡|‚@Rj[@OM£Ñ˜³j@N ½ïÈîÚ@Ké:߇Á·@KtI±¨‹@M´âN†@J-Þ‡é`@MæTµeÓk@Lû@q»³@Lõ©0xà@NëÄo*°@Q<3÷ñ¯½@Q_éõi!@NoÛ˜´øô@LíyÓoô@KµïxØ@K~{Û®{ @J¶è*@H ‡äµ¤ @Lúmò¸È@LáÐÉØíð@OI"»@N½ÆÜ8ÿ@QŠƒA-$@Q»n@œ€A@PCµt™ãz@Nrxô@Ù(@L Œs-,Y@L»i^(¦q@LkmŒ2¡Ç@IÜ4 Äq@KÉ̉%^@J¿uÝô)@N  ¶‡â@PþX(ÍRŽ@Rù…K ¶@Rt¤u­óÒ@PA˜\R,Ø@M^{Û®{"@JÞv8_‡^@J¦M©C"¸@J9}Žb‰<@Hú—™!×»@KQ€Ö=¸0@JÛ:WqG@KüyLç ô@O3Ûæx¬µ@RJ#¡ÅvÌ@RÔòáZWî@PC³ ´ã.@M»x. @L0œÓÕ @J‹HÚ@5Ú@K#¥ƒ…­Ñ@HeÖ>B¥@Kuýµ§ìø@K1F8Ð@Ksðÿý¬@PY£ú´¹@R ;–FÝ@Q8»ø¦@OÈÛƒµä”@NF¹›¤-\@Kž…$)Ûò@Ij¼cöº¢@KÏe¯§N@H€szð@Kqïÿ^A@Hºyœ9|%@K©ôÓÒ¶à@N5¡7îÅ4@Qâ\Éî´@QÞlŒZJ¶@N¾„P¤ê@J­UéÚù@J½Üpäbp@KÛ%’ÂY@Jí”Àz¬g@IžÕÅöRl@LÍ>nî®@J$Ìc S8@KÚÕ9üuD@Po…xíA)@SÆç¨»ÓR@T)£,¼a@P”w6©·@KíŸ3“ Á@KÛ“¥4@L–5n¨Ñ@KRÔ’ÒG@H–øÙl±@Mã"“í¼Ï@Ju7ÌÏ@M‘Ù m¦@PÞˆâ8¿ö@RÕIJÒb@RN³ëãþ@O¾_·”óÎ@Nò€%·<@KjûŒt@LôxÝ@LpÙr"p@Iß/'`›q@K6³ íÑ@LÌ”-Ê@NÓÁÀ¬@Pv#4æ®U@R¼sاò@Q{¡[´P@O,ªJÁÕ@MnŸ­ª¸g@Jÿ M‚@LŽÒkqJBcf-python-1.3.2/test/Field2.py0000600000175000017500000000631612426367522016271 0ustar daviddavid00000000000000import tempfile import os import sys import itertools from operator import mul import numpy import cf import unittest class FieldTest(unittest.TestCase): print 'cf version', cf.__version__, 'running from', os.path.abspath(cf.__file__) filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test_file.nc') chunk_sizes = (17, 34, 300, 100000)[::-1] def test_Field_anchor(self): for chunksize in self.chunk_sizes: f = cf.read(self.filename)[0] f.cyclic('grid_lon', period=16) for anchor in numpy.arange(-20, 76, 0.5): print anchor g = f.anchor('grid_lon', anchor) x0, x1 = g.coord('grid_lon').array[0:2] self.assertTrue(x0 <= anchor < x1, "x0=%s, anchor=%s, x1=%s" % \ (x0, anchor, x1)) #--- End: for print "cf.Field.anchor passed", "pmshape =", f.Data._pmshape #--- End: def def test_Field_transpose(self): for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) f = cf.read(self.filename)[0] h = f.copy() h.transpose((1, 2, 0), i=True) h.transpose((2, 0, 1), i=True) h.transpose(('grid_longitude', 'atmos', 'grid_latitude'), i=True) h.transpose(('atmos', 'grid_latitude', 'grid_longitude'), i=True) self.assertTrue(cf.equals(f, h, traceback=True), "cf.Field.transpose failed") print "cf.Field.tranpose passed", "pmshape =", f.Data._pmshape #--- End: def def test_Field_match(self): '''Test cf.Field.match''' f = cf.read(self.filename)[0] f.long_name = 'qwerty' all_kwargs = ( {'inverse': False}, {'inverse': False, 'match': 'eastward_wind'}, {'inverse': False, 'match': {'long_name': 'qwerty'}}, {'inverse': False, 'match': {None: 'east'}}, {'inverse': False, 'match': 'east'}, {'inverse': False, 'match': {None: 'east.*'}, 'regex': True}, {'inverse': False, 'match': 'east.*', 'regex': True}, {'inverse': False, 'match': cf.eq('east.*', regex=True)}, {'inverse': False, 'match': {None: cf.eq('east.*', regex=True)}}, {'inverse': False, 'match': {None: 'east', 'long_name': 'qwe'}}, {'inverse': False, 'match': {None: 'east', 'long_name': 'qwe'}, 'match_all': False}, {'inverse': False, 'match': {None: 'east', 'long_name': 'asd'}, 'match_all': False}, # {'inverse': True, 'match': {None: 'east', 'long_name': 'asd'},}, ) for kwargs in all_kwargs: self.assertTrue(f.match(**kwargs), "f.match(**%s) failed" % kwargs) kwargs['inverse'] = not kwargs['inverse'] self.assertFalse(f.match(**kwargs), "f.match(**%s) failed" % kwargs) #--- End: for print "cf.Field.match passed" #--- End: def #--- End: class if __name__ == '__main__': unittest.main() cf-python-1.3.2/test/Collapse.py0000600000175000017500000006726712321244666016737 0ustar daviddavid00000000000000import cf import numpy import os import time def test(chunk_sizes=(17, 34, 60, 300, 100000)): start_time = time.time() print '----------------------------------------------------------' print 'cf.collapse' print '----------------------------------------------------------' # Save original chunksize original_chunksize = cf.CHUNKSIZE() filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), "test_file.nc") for squeeze in (True, False): for missing_data in (True, False): for chunk in chunk_sizes: cf.CHUNKSIZE(chunk) f = cf.read(filename, squeeze=squeeze)[0] parameters = 'CHUNKSIZE=%s, missing_data=%s, squeeze=%s' % \ (cf.CHUNKSIZE(), missing_data, squeeze) if missing_data: for i in range(9): f.subspace[..., [i, 9-i], i] = cf.masked print f print f.array print f.Data.dumpd() w = f.cm('area') w /= 10000. w = w.copy() w.transpose() w = w.array w = w.reshape(f.array.shape) if numpy.ma.is_masked(f.array): w = numpy.ma.array(w, mask=f.array.mask) assert(w.shape == f.array.shape) print repr(f) print '--------------------------------------------------------------------' print 'Unweighted collapse, %s' % parameters print '--------------------------------------------------------------------' method='mean' for axes, axis in zip(('grid_latitude', 'grid_longitude', ['grid_longitude', 'grid_latitude'], None), (-2, -1, None, None)): c = cf.collapse(f, method, axes=axes, weights=None) expected = numpy.ma.average(f.array, axis=axis) assert numpy.ma.allclose(c.array.flatten(), expected), '%s %s %s\n%s\n%s' % (method, axes, axis, c.array, expected) print "Unweighted %s over %s passed" % (method, repr(axes)) method='maximum' for axes, axis in zip(('grid_latitude', 'grid_longitude', ['grid_longitude', 'grid_latitude'], None), (-2, -1, None, None)): c = cf.collapse(f, method, axes=axes, weights=None) expected = numpy.ma.amax(f.array, axis=axis) assert(numpy.ma.allclose(c.array.flatten(), expected)) print "Unweighted %s over %s passed" % (method, repr(axes)) method='minimum' for axes, axis in zip(('grid_latitude', 'grid_longitude', ['grid_longitude', 'grid_latitude'], None), (-2, -1, None, None)): c = cf.collapse(f, method, axes=axes, weights=None) expected = numpy.ma.amin(f.array, axis=axis) assert(numpy.ma.allclose(c.array.flatten(), expected)) print "Unweighted %s over %s passed" % (method, repr(axes)) method='mid_range' for axes, axis in zip(('grid_latitude', 'grid_longitude', ['grid_longitude', 'grid_latitude'], None), (-2, -1, None, None)): c = cf.collapse(f, method, axes=axes, weights=None) expected = numpy.ma.ptp(f.array, axis=axis) / 2.0 assert(numpy.ma.allclose(c.array.flatten(), expected)) print "Unweighted %s over %s passed" % (method, repr(axes)) method='sum' for axes, axis in zip(('grid_latitude', 'grid_longitude', ['grid_longitude', 'grid_latitude'], None), (-2, -1, None, None)): c = cf.collapse(f, method, axes=axes, weights=None) expected = numpy.ma.sum(f.array, axis=axis) assert(numpy.ma.allclose(c.array.flatten(), expected)) print "Unweighted %s over %s passed" % (method, repr(axes)) method='variance' for axes, axis in zip(('grid_latitude', 'grid_longitude', ['grid_longitude', 'grid_latitude'], None), (-2, -1, None, None)): c = cf.collapse(f, method, axes=axes, weights=None) expected = numpy.ma.var(f.array, axis=axis) assert(numpy.ma.allclose(c.array.flatten(), expected)) print "Unweighted biased %s over %s passed" % (method, repr(axes)) method='variance' for axes, axis in zip(('grid_latitude', 'grid_longitude', ['grid_longitude', 'grid_latitude'], None), (-2, -1, None, None)): c = cf.collapse(f, method, axes=axes, weights=None, biased=False) expected = numpy.ma.var(f.array, axis=axis, ddof=1) assert(numpy.ma.allclose(c.array.flatten(), expected)) print "Unweighted unbiased %s over %s passed" % (method, repr(axes)) method='standard_deviation' for axes, axis in zip(('grid_latitude', 'grid_longitude', ['grid_longitude', 'grid_latitude'], None), (-2, -1, None, None)): c = cf.collapse(f, method, axes=axes, weights=None) expected = numpy.ma.std(f.array, axis=axis) assert(numpy.ma.allclose(c.array.flatten(), expected)) print "Unweighted biased %s over %s passed" % (method, repr(axes)) method='standard_deviation' for axes, axis in zip(('grid_latitude', 'grid_longitude', ['grid_longitude', 'grid_latitude'], None), (-2, -1, None, None)): c = cf.collapse(f, method, axes=axes, weights=None, biased=False) expected = numpy.ma.std(f.array, axis=axis, ddof=1) assert(numpy.ma.allclose(c.array.flatten(), expected)) print "Unweighted unbiased %s over %s passed" % (method, repr(axes)) print '--------------------------------------------------------------------' print 'Weighted collapse, %s' % parameters print '--------------------------------------------------------------------' method='maximum' for axes, axis in zip(('grid_latitude', 'grid_longitude', ['grid_longitude', 'grid_latitude'], None), (-2, -1, None, None)): c = cf.collapse(f, method, axes=axes, weights='XY') expected = numpy.ma.amax(f.array, axis=axis) assert(numpy.ma.allclose(c.array.flatten(), expected)) print "Weighted %s over %s passed" % (method, repr(axes)) method='minimum' for axes, axis in zip(('grid_latitude', 'grid_longitude', ['grid_longitude', 'grid_latitude'], None), (-2, -1, None, None)): c = cf.collapse(f, method, axes=axes, weights='XY') expected = numpy.ma.amin(f.array, axis=axis) assert(numpy.ma.allclose(c.array.flatten(), expected)) print "Weighted %s over %s passed" % (method, repr(axes)) method='mid_range' for axes, axis in zip(('grid_latitude', 'grid_longitude', ['grid_longitude', 'grid_latitude'], None), (-2, -1, None, None)): c = cf.collapse(f, method, axes=axes, weights='XY') expected = numpy.ma.ptp(f.array, axis=axis) / 2.0 assert(numpy.ma.allclose(c.array.flatten(), expected)) print "Weighted %s over %s passed" % (method, repr(axes)) method='sum' for axes, axis in zip(('grid_latitude', 'grid_longitude', ['grid_longitude', 'grid_latitude'], None), (-2, -1, None, None)): c = cf.collapse(f, method, axes=axes, weights='XY') expected = numpy.ma.sum(f.array, axis=axis) assert(numpy.ma.allclose(c.array.flatten(), expected)) print "Weighted %s over %s passed" % (method, repr(axes)) method='mean' #for axes, axis in zip(('grid_latitude', 'grid_longitude', # ['grid_longitude', 'grid_latitude'], None), # (-2, -1, None, None)): # print f # print 'AXES=', axes # print f.Data._axes # print 'f.shape=', f.shape # print 'f.array=', f.array # print 'w.shape=', w.shape # print 'w=', w # print f.cm().array # c = cf.collapse(f, method, axes=axes, weights='XY') # expected = numpy.ma.average(f.array, weights=w, axis=axis) # print 'c.array=', c.array # print 'n=', expected # assert numpy.ma.allclose(c.array.flatten(), expected), 'weighted %s %s %s\n%s\n%s' % (method, axes, axis, c.array, expected) # print "Weighted %s over %s passed" % (method, repr(axes)) # method='mean' # for axes, axis, y in zip(('grid_latitude', 'grid_longitude', # ['grid_longitude', 'grid_latitude'], None), # (-2, -1, None, None), # ('grid_lat', 'grid_longitude', # ('grid_long', 'grid_latitude'), # ('X', 'grid_latitude'))): # c = cf.collapse(f, method, axes=axes, weights=y) # expected = numpy.ma.average(f.array, weights=w, axis=axis) # assert numpy.ma.allclose(c.array.flatten(), expected), 'weighted %s %s %s\n%s\n%s' % (method, axes, axis, c.array, expected) # print "Weighted %s over %s passed" % (method, repr(axes)) # # method='variance' # for axes, axis in zip(('grid_latitude', 'grid_longitude', # ['grid_longitude', 'grid_latitude'], None), # (-2, -1, None, None)): # c = cf.collapse(f, method, axes=axes, weights='XY') # mean, sw = numpy.ma.average(f.array, weights=w, returned=True, axis=axis) # if axis is not None: # mean = numpy.expand_dims(mean, axis) # expected = numpy.ma.average((f.array-mean)**2, weights=w, axis=axis) # assert(numpy.ma.allclose(c.array.flatten(), expected)) # print "Weighted %s over %s passed" % (method, repr(axes)) # # method='variance' # for axes, axis in zip(('grid_latitude', 'grid_longitude', # ['grid_longitude', 'grid_latitude'], None), # (-2, -1, None, None)): # c = cf.collapse(f, method, axes=axes, weights='XY', biased=False) # mean, sw = numpy.ma.average(f.array, weights=w, returned=True, axis=axis) ## print 'mean=', mean ## print 'sw=', sw # if axis is not None: # mean = numpy.expand_dims(mean, axis) # variance = numpy.ma.average((f.array-mean)**2, weights=w, axis=axis) # sw2 = numpy.ma.sum(w**2, axis=axis) # expected = (sw**2/((sw**2)-sw2))*variance ## print 'sw2=', sw2 ## print 'variance=', variance ## print c.array ## print expected # assert(numpy.ma.allclose(c.array.flatten(), expected)) # print "Weighted unbiased %s over %s passed" % (method, repr(axes)) # # method='standard_deviation' # for axes, axis in zip(('grid_latitude', 'grid_longitude', # ['grid_longitude', 'grid_latitude'], None), # (-2, -1, None, None)): # c = cf.collapse(f, method, axes=axes, weights='XY') # mean, sw = numpy.ma.average(f.array, weights=w, returned=True, axis=axis) # if axis is not None: # mean = numpy.expand_dims(mean, axis) # variance = numpy.ma.average((f.array-mean)**2, weights=w, axis=axis) # expected = variance**0.5 # assert(numpy.ma.allclose(c.array.flatten(), expected)) # print "Weighted %s over %s passed" % (method, repr(axes)) # # method='standard_deviation' # for axes, axis in zip(('grid_latitude', 'grid_longitude', # ['grid_longitude', 'grid_latitude'], None), # (-2, -1, None, None)): # c = cf.collapse(f, method, axes=axes, weights='XY', biased=False) # mean, sw = numpy.ma.average(f.array, weights=w, returned=True, axis=axis) # sw2 = numpy.ma.sum(w**2, axis=axis) # if axis is not None: # mean = numpy.expand_dims(mean, axis) # variance = numpy.ma.average((f.array-mean)**2, weights=w, axis=axis) # variance *= sw**2/(sw**2-sw2) # expected = variance**0.5 # assert(numpy.ma.allclose(c.array.flatten(), expected)) # print "Weighted unbiased %s over %s passed" % (method, repr(axes)) print '--------------------------------------------------------------------' print 'Weighted collapse, no cell measure, %s' % parameters print '--------------------------------------------------------------------' cm = f.remove_item('area') wlat = cf.tools.collapse.calc_weights(f.item('grid_latitude'), infer_bounds=True).array wlon = cf.tools.collapse.calc_weights(f.item('grid_longitude'), infer_bounds=True).array w0 = wlat.reshape(10, 1) w1 = wlon.reshape( 1, 9) w = w0*w1 w = w.reshape(f.array.shape) assert(w.shape == f.array.shape) if numpy.ma.is_masked(f.array): w = numpy.ma.array(w, mask=f.array.mask) method='maximum' for axes, axis in zip(('grid_latitude', 'grid_longitude', ['grid_longitude', 'grid_latitude'], None), (-2, -1, None, None)): c = cf.collapse(f, method, axes=axes, weights='XY') expected = numpy.ma.amax(f.array, axis=axis) assert(numpy.ma.allclose(c.array.flatten(), expected)) print "Weighted, no cell measure, %s over %s passed" % (method, repr(axes)) method='minimum' for axes, axis in zip(('grid_latitude', 'grid_longitude', ['grid_longitude', 'grid_latitude'], None), (-2, -1, None, None)): c = cf.collapse(f, method, axes=axes, weights='XY') expected = numpy.ma.amin(f.array, axis=axis) assert(numpy.ma.allclose(c.array.flatten(), expected)) print "Weighted, no cell measure, %s over %s passed" % (method, repr(axes)) method='mid_range' for axes, axis in zip(('grid_latitude', 'grid_longitude', ['grid_longitude', 'grid_latitude'], None), (-2, -1, None, None)): c = cf.collapse(f, method, axes=axes, weights='XY') expected = numpy.ma.ptp(f.array, axis=axis) / 2.0 assert(numpy.ma.allclose(c.array.flatten(), expected)) print "Weighted, no cell measure, %s over %s passed" % (method, repr(axes)) method='sum' for axes, axis in zip(('grid_latitude', 'grid_longitude', ['grid_longitude', 'grid_latitude'], None), (-2, -1, None, None)): c = cf.collapse(f, method, axes=axes, weights='XY') expected = numpy.ma.sum(f.array, axis=axis) assert(numpy.ma.allclose(c.array.flatten(), expected)) print "Weighted, no cell measure, %s over %s passed" % (method, repr(axes)) method='mean' for axes, axis, x in zip(('grid_latitude', 'grid_longitude', ['grid_longitude', 'grid_latitude'], None), (-2, -1, None, None), (wlat, wlon, w, w)): c = cf.collapse(f, method, axes=axes, weights='XY') expected = numpy.ma.average(f.array, weights=x, axis=axis) assert(numpy.ma.allclose(c.array.flatten(), expected)) print "Weighted, no cell measure, %s over %s passed" % (method, repr(axes)) method='mean' for axes, axis, x, y in zip(('grid_latitude', 'grid_longitude', ['grid_longitude', 'grid_latitude'], None), (-2, -1, None, None), (wlat, wlon, w, w), ('Y', 'X', 'XY', 'YX')): c = cf.collapse(f, method, axes=axes, weights=y) expected = numpy.ma.average(f.array, weights=x, axis=axis) assert(numpy.ma.allclose(c.array.flatten(), expected)) print "Weighted, no cell measure, %s over %s passed" % (method, repr(axes)) method='mean' for axes, axis, x, y in zip(('grid_latitude', 'grid_longitude', ['grid_longitude', 'grid_latitude'], None), (-2, -1, None, None), (wlat, wlon, w, w), ('grid_latitude', 'grid_longitude', ('grid_longitude', 'grid_latitude'), ('X', 'grid_latitude'))): c = cf.collapse(f, method, axes=axes, weights=y) expected = numpy.ma.average(f.array, weights=x, axis=axis) assert(numpy.ma.allclose(c.array.flatten(), expected)) print "Weighted, no cell measure, %s over %s passed" % (method, repr(axes)) method='variance' for axes, axis in zip(('grid_latitude', 'grid_longitude', ['grid_longitude', 'grid_latitude'], None), (-2, -1, None, None)): c = cf.collapse(f, method, axes=axes, weights='XY') mean, sw = numpy.ma.average(f.array, weights=w, returned=True, axis=axis) if axis is not None: mean = numpy.expand_dims(mean, axis) expected = numpy.ma.average((f.array-mean)**2, weights=w, axis=axis) assert(numpy.ma.allclose(c.array.flatten(), expected)) print "Weighted, no cell measure, %s over %s passed" % (method, repr(axes)) method='variance' for axes, axis in zip(('grid_latitude', 'grid_longitude', ['grid_longitude', 'grid_latitude'], None), (-2, -1, None, None)): c = cf.collapse(f, method, axes=axes, weights='XY', biased=False) mean, sw = numpy.ma.average(f.array, weights=w, returned=True, axis=axis) # print 'mean=', mean # print 'sw=', sw if axis is not None: mean = numpy.expand_dims(mean, axis) variance = numpy.ma.average((f.array-mean)**2, weights=w, axis=axis) sw2 = numpy.ma.sum(w**2, axis=axis) expected = (sw**2/((sw**2)-sw2))*variance # print 'sw2=', sw2 # print 'variance=', variance # print c.array # print expected assert(numpy.ma.allclose(c.array.flatten(), expected)) print "Weighted, no cell measure, unbiased %s over %s passed" % (method, repr(axes)) method='standard_deviation' for axes, axis in zip(('grid_latitude', 'grid_longitude', ['grid_longitude', 'grid_latitude'], None), (-2, -1, None, None)): c = cf.collapse(f, method, axes=axes, weights='XY') mean, sw = numpy.ma.average(f.array, weights=w, returned=True, axis=axis) if axis is not None: mean = numpy.expand_dims(mean, axis) variance = numpy.ma.average((f.array-mean)**2, weights=w, axis=axis) expected = variance**0.5 assert(numpy.ma.allclose(c.array.flatten(), expected)) print "Weighted, no cell measure, %s over %s passed" % (method, repr(axes)) method='standard_deviation' for axes, axis in zip(('grid_latitude', 'grid_longitude', ['grid_longitude', 'grid_latitude'], None), (-2, -1, None, None)): c = cf.collapse(f, method, axes=axes, weights='XY', biased=False) mean, sw = numpy.ma.average(f.array, weights=w, returned=True, axis=axis) sw2 = numpy.ma.sum(w**2, axis=axis) if axis is not None: mean = numpy.expand_dims(mean, axis) variance = numpy.ma.average((f.array-mean)**2, weights=w, axis=axis) variance *= sw**2/(sw**2-sw2) expected = variance**0.5 assert(numpy.ma.allclose(c.array.flatten(), expected)) print "Weighted, no cell measure, unbiased %s over %s passed" % (method, repr(axes)) #axes=['grid_longitude', 'grid_latitude'] #c = cf.collapse(f, 'mean', axes=axes, weights='XY') # #expected = numpy.ma.average(f.array, weights=w) #assert(numpy.ma.allclose(c.array.flatten(), expected)) #print "Weighted mean over %s (no cell measure) passed" % repr(axes) # #cell_methods='grid_longitude: mean grid_latitude: max' #c = cf.collapse(f, cell_methods, weights='XY') #d = cf.collapse(f, 'mean', axes='grid_longitude', weights='XY') #expected = cf.collapse(d, 'max', axes='grid_latitude', weights='XY').array #assert(numpy.ma.allclose(c.array.flatten(), expected)) #print "Weighted mean, max over %s (no cell measure) passed" % repr(cell_methods) # #f.domain.insert_cm(cm, axes=['dim1', 'dim0']) # #axes=['grid_longitude', 'grid_latitude'] #c = cf.collapse(f, 'mean', axes=axes, weights='XY') #expected = numpy.ma.average(f.array, weights=w) #assert(numpy.ma.allclose(c.array.flatten(), expected)) #print "Weighted mean over %s (with cell measure) passed" % repr(axes) # #axes=None #c = cf.collapse(f, 'variance', weights='XY') #mean, sw = numpy.ma.average(f.array, weights=w, returned=True) #expected = numpy.ma.sum(w*(f.array-mean)**2)/sw #numpy.ma.sum(w) #assert(numpy.ma.allclose(c.array.flatten(), expected)) #print "Weighted biased variance over %s passed" % repr(axes) # #axes=None #c = cf.collapse(f, 'variance', weights='XY', biased=False) #mean, sw = numpy.ma.average(f.array, weights=w, returned=True) #sw2 = numpy.sum(w**2) #expected = (sw/(sw**2-sw2))*numpy.sum(w*((f.array-mean)**2)) #expected = (sw**2/(sw**2-sw2))*numpy.ma.average((f.array-mean)**2, weights=w) #assert(numpy.ma.allclose(c.array.flatten(), expected)) #print "Weighted unbiased variance over %s passed" % repr(axes) # #print '--------------------------------------------------------------------' #print 'Cell measures weighted collapse' #print '--------------------------------------------------------------------' # #axes=['grid_longitude', 'grid_latitude'] #c = cf.collapse(f, 'mean', axes=axes, weights='XY') #w = f.cm('area').copy() #w.transpose() #w = w.array #expected = numpy.ma.average(f.array, weights=w) #assert(numpy.ma.allclose(c.array.flatten(), expected)) #print "Cell measures weighted mean over %s passed" % repr(axes) f.cell_methods = cf.CellMethods('grid_longitude: mean grid_latitude: maximum') #--- End: for #--- End: for #--- End: for # Reset chunk size cf.CHUNKSIZE(original_chunksize) time_elapsed = (time.time() - start_time)/60.0 print print '---------------------------------------------------------------------------' print 'All cf.collapse tests passed for cf version', cf.__version__ print 'Running from', os.path.abspath(cf.__file__) print 'Time elapsed: %f minutes' % time_elapsed print '---------------------------------------------------------------------------' print #--- End: def if __name__ == "__main__": test() cf-python-1.3.2/test/test_TimeDuration.py0000600000175000017500000002321312756571666020636 0ustar daviddavid00000000000000import cf import datetime import numpy import os import time import unittest class TimeDurationTest(unittest.TestCase): filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test_file.nc') chunk_sizes = (17, 34, 300, 100000)[::-1] def test_TimeDuration(self): self.assertTrue(cf.TimeDuration(2, 'calendar_years') > cf.TimeDuration(1, 'calendar_years')) self.assertTrue(cf.TimeDuration(2, 'calendar_years') < cf.TimeDuration(25, 'calendar_months')) self.assertTrue(cf.TimeDuration(2, 'hours') <= cf.TimeDuration(1, 'days')) self.assertTrue(cf.TimeDuration(2, 'hours') == cf.TimeDuration(1/12.0, 'days')) self.assertTrue(cf.TimeDuration(2, 'days') == cf.TimeDuration(48, 'hours')) self.assertTrue(cf.TimeDuration(2, 'days') == cf.Data(2)) # self.assertTrue(cf.TimeDuration(2, 'days') > cf.Data(1.5, '')) # self.assertTrue(cf.TimeDuration(2, 'days') > cf.Data(1.5, '1')) # self.assertTrue(cf.TimeDuration(2, 'days') < cf.Data(0.03, '100')) self.assertTrue(cf.TimeDuration(2, 'days') == cf.Data([2.], 'days')) self.assertTrue(cf.TimeDuration(2, 'days') > cf.Data([[60]], 'seconds')) self.assertTrue(cf.TimeDuration(2, 'hours') <= 2) self.assertTrue(cf.TimeDuration(2, 'days') != 30.5) self.assertTrue(cf.TimeDuration(2, 'calendar_years') > numpy.array(1.5)) self.assertTrue(cf.TimeDuration(2, 'calendar_months') < numpy.array([[12]])) self.assertFalse(cf.TimeDuration(2, 'calendar_years') <= cf.TimeDuration(1, 'calendar_years')) self.assertFalse(cf.TimeDuration(2, 'calendar_years') >= cf.TimeDuration(25, 'calendar_months')) self.assertFalse(cf.TimeDuration(2, 'hours') > cf.TimeDuration(1, 'days')) self.assertFalse(cf.TimeDuration(2, 'hours') != cf.TimeDuration(1/12.0, 'days')) self.assertFalse(cf.TimeDuration(2, 'days') != cf.TimeDuration(48, 'hours')) self.assertFalse(cf.TimeDuration(2, 'days') != cf.Data(2)) # self.assertFalse(cf.TimeDuration(2, 'days') <= cf.Data(1.5, '')) # self.assertFalse(cf.TimeDuration(2, 'days') <= cf.Data(1.5, '1')) # self.assertFalse(cf.TimeDuration(2, 'days') >= cf.Data(0.03, '100')) self.assertFalse(cf.TimeDuration(2, 'days') != cf.Data([2.], 'days')) self.assertFalse(cf.TimeDuration(2, 'days') <= cf.Data([[60]], 'seconds')) self.assertFalse(cf.TimeDuration(2, 'hours') > 2) self.assertFalse(cf.TimeDuration(2, 'days') == 30.5) self.assertFalse(cf.TimeDuration(2, 'calendar_years') <= numpy.array(1.5)) self.assertFalse(cf.TimeDuration(2, 'calendar_months') >= numpy.array([[12]])) self.assertTrue(cf.TimeDuration(64, 'calendar_years') + 2 == cf.Y(66)) self.assertTrue(cf.TimeDuration(64, 'calendar_years') - 2.5 == cf.Y(61.5)) self.assertTrue(cf.M(23) + cf.TimeDuration(64, 'calendar_years') == cf.M(791)) self.assertTrue(cf.TimeDuration(64, 'calendar_years') + cf.M(24) == cf.Y(66)) self.assertTrue(cf.TimeDuration(36, 'calendar_months') / numpy.array(8) == cf.M(4)) self.assertTrue(cf.TimeDuration(36, 'calendar_months') / numpy.array(8.0) == cf.M(36/8.0)) self.assertTrue(cf.TimeDuration(12, 'calendar_months') * cf.Data([[1.5]]) == cf.Y(1.5)) self.assertTrue(cf.TimeDuration(36, 'calendar_months') // cf.Data([0.825], '10') == cf.M(4.3)) self.assertTrue(cf.TimeDuration(36, 'calendar_months') % 10 == cf.M(6)) self.assertTrue(cf.TimeDuration(24, 'hours') + cf.TimeDuration(0.5, 'days') == cf.h(36.0)) self.assertTrue(cf.TimeDuration(0.5, 'days') + cf.TimeDuration(24, 'hours') == cf.D(1.5)) t = cf.TimeDuration(24, 'hours') t += 2 self.assertTrue(t == cf.h(26)) t -= cf.Data(3, 'hours') self.assertTrue(t == cf.h(23)) t = cf.TimeDuration(24.0, 'hours') t += 2 self.assertTrue(t == cf.h(26)) t -= cf.Data(2.5, 'hours') self.assertTrue(t == cf.h(23.5)) t *= 2 self.assertTrue(t == cf.h(47.0)) t -= 0.5 self.assertTrue(t == cf.h(46.5)) t /= 3 self.assertTrue(t == cf.h(15.5)) t += 5.5 self.assertTrue(t == cf.h(21.0)) t //= numpy.array(2) self.assertTrue(t == cf.h(10.0)) t *= 10 self.assertTrue(t == cf.h(100.0)) t %= 3 self.assertTrue(t == cf.h(1.0)) self.assertTrue(cf.M().interval(1999, 12) == (cf.dt('1999-12-01 00:00:00'), cf.dt('2000-01-01 00:00:00'))) self.assertTrue(cf.Y(2).interval(2000, 2, end=True) == (cf.dt('1998-02-01 00:00:00'), cf.dt('2000-02-01 00:00:00'))) self.assertTrue(cf.D(30).interval(1983, 12, 1, 6) == (cf.dt('1983-12-01 06:00:00'), cf.dt('1983-12-31 06:00:00'))) self.assertTrue(cf.D(30).interval(1983, 12, 1, 6, end=True) == (cf.dt('1983-11-01 06:00:00'), cf.dt('1983-12-01 06:00:00'))) self.assertTrue(cf.D(0).interval(1984, 2, 3) == (cf.dt('1984-02-03 00:00:00'), cf.dt('1984-02-03 00:00:00'))) self.assertTrue(cf.D(5, hour=6).interval(2004, 3, 2, end=True) == (cf.dt('2004-02-26 06:00:00'), cf.dt('2004-03-02 06:00:00'))) self.assertTrue(cf.D(5, hour=6).interval(2004, 3, 2, end=True, calendar='noleap') == (cf.dt('2004-02-25 06:00:00'), cf.dt('2004-03-02 06:00:00'))) self.assertTrue(cf.D(5, hour=6).interval(2004, 3, 2, end=True, calendar='360_day') == (cf.dt('2004-02-27 06:00:00'), cf.dt('2004-03-02 06:00:00'))) self.assertTrue(cf.h(19897.5).interval(1984, 2, 3, 0) == (cf.dt('1984-02-03 00:00:00'), cf.dt('1986-05-12 01:30:00'))) self.assertTrue(cf.h(19897.546).interval(1984, 2, 3, 0, end=True) == (cf.dt('1981-10-26 22:27:14'), cf.dt('1984-02-03 00:00:00'))) #--- End: def def test_TimeDuration_bounds(self): for direction in (True, False): for x, y in zip( [cf.Y().bounds(1984, 1, 1, direction=direction), cf.Y().bounds(1984, 12, 1, direction=direction), cf.Y().bounds(1984, 12, 3, direction=direction), cf.Y(month=9).bounds(1984, 1, 1, direction=direction), cf.Y(month=9).bounds(1984, 3, 3, direction=direction), cf.Y(month=9).bounds(1984, 9, 20, direction=direction), cf.Y(month=9, day=13).bounds(1984, 12, 12, direction=direction), ], [(cf.dt('1984-01-01'), cf.dt('1985-01-01')), (cf.dt('1984-01-01'), cf.dt('1985-01-01')), (cf.dt('1984-01-01'), cf.dt('1985-01-01')), (cf.dt('1983-09-01'), cf.dt('1984-09-01')), (cf.dt('1983-09-01'), cf.dt('1984-09-01')), (cf.dt('1984-09-01'), cf.dt('1985-09-01')), (cf.dt('1984-09-13'), cf.dt('1985-09-13')), ]): if direction is False: y = y[::-1] self.assertTrue(x==y, "{}!={}".format(x, y)) for x, y in zip( [cf.M().bounds(1984, 1, 1, direction=direction), cf.M().bounds(1984, 12, 1, direction=direction), cf.M().bounds(1984, 12, 3, direction=direction), cf.M(day=15).bounds(1984, 12, 1, direction=direction), cf.M(day=15).bounds(1984, 12, 3, direction=direction), cf.M(day=15).bounds(1984, 12, 15, direction=direction), cf.M(day=15).bounds(1984, 12, 20, direction=direction), ], [(cf.dt('1984-01-01'), cf.dt('1984-02-01')), (cf.dt('1984-12-01'), cf.dt('1985-01-01')), (cf.dt('1984-12-01'), cf.dt('1985-01-01')), (cf.dt('1984-11-15'), cf.dt('1984-12-15')), (cf.dt('1984-11-15'), cf.dt('1984-12-15')), (cf.dt('1984-12-15'), cf.dt('1985-01-15')), (cf.dt('1984-12-15'), cf.dt('1985-01-15')), ]): if direction is False: y = y[::-1] self.assertTrue(x==y, "{}!={}".format(x, y)) for x, y in zip( [cf.D().bounds(1984, 1, 1, direction=direction), cf.D().bounds(1984, 12, 3, direction=direction), cf.D(hour=15).bounds(1984, 12, 1, direction=direction), cf.D(hour=15).bounds(1984, 12, 1, 12, direction=direction), cf.D(hour=15).bounds(1984, 12, 1, 15, direction=direction), cf.D(hour=15).bounds(1984, 12, 1, 20, direction=direction), ], [(cf.dt('1984-01-01'), cf.dt('1984-01-02')), (cf.dt('1984-12-03'), cf.dt('1984-12-04')), (cf.dt('1984-11-30 15:00'), cf.dt('1984-12-01 15:00')), (cf.dt('1984-11-30 15:00'), cf.dt('1984-12-01 15:00')), (cf.dt('1984-12-01 15:00'), cf.dt('1984-12-02 15:00')), (cf.dt('1984-12-01 15:00'), cf.dt('1984-12-02 15:00')), ]): if direction is False: y = y[::-1] self.assertTrue(x==y, "{}!={}".format(x, y)) #--- End: def #--- End: class if __name__ == "__main__": print 'cf-python version:', cf.__version__ print 'cf-python path:' , os.path.abspath(cf.__file__) print'' unittest.main(verbosity=2) cf-python-1.3.2/test/test_Units.py0000600000175000017500000001425712603546021017316 0ustar daviddavid00000000000000import cf import math import os import unittest class UnitsTest(unittest.TestCase): filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test_file.nc') chunk_sizes = (17, 34, 300, 100000)[::-1] def test_Units___eq__(self): self.assertTrue(cf.Units('')==cf.Units('')) self.assertTrue(cf.Units('18')==cf.Units('18')) self.assertTrue(cf.Units('1')==cf.Units('1')) self.assertTrue(cf.Units('m')==cf.Units('m')) self.assertTrue(cf.Units('m')==cf.Units('metres')) self.assertTrue(cf.Units('m')==cf.Units('meTRES')) self.assertTrue(cf.Units('days since 2000-1-1')==cf.Units('d since 2000-1-1 0:0')) self.assertTrue(cf.Units('days since 2000-1-1')!=cf.Units('h since 1234-1-1 0:0')) self.assertTrue(cf.Units('days since 2000-1-1')==cf.Units('d since 2000-1-1 0:0', calendar='gregorian')) self.assertTrue(cf.Units('days since 2000-1-1')==cf.Units('d since 2000-1-1 0:0', calendar='standard')) self.assertTrue(cf.Units(calendar='noleap')==cf.Units(calendar='noleap')) self.assertTrue(cf.Units(calendar='noleap')==cf.Units(calendar='365_day')) self.assertTrue(cf.Units(calendar='nOLEAP')==cf.Units(calendar='365_dAY')) self.assertTrue(cf.Units('days since 2000-1-1', calendar='all_leap')==cf.Units('d since 2000-1-1 0:0', calendar='366_day')) self.assertTrue(cf.Units('days since 2000-1-1', calendar='all_leap')!=cf.Units('h since 2000-1-1 0:0', calendar='366_day')) #--- End: def def test_Units_equivalent(self): self.assertTrue(cf.Units('').equivalent(cf.Units(''))) self.assertTrue(cf.Units('').equivalent(cf.Units('1'))) self.assertTrue(cf.Units('').equivalent(cf.Units('18'))) self.assertTrue(cf.Units('18').equivalent(cf.Units('1'))) self.assertTrue(cf.Units('18').equivalent(cf.Units('18'))) self.assertTrue(cf.Units('1)').equivalent(cf.Units('1'))) self.assertTrue(cf.Units('m').equivalent(cf.Units('m'))) self.assertTrue(cf.Units('meter').equivalent(cf.Units('km'))) self.assertTrue(cf.Units('metre').equivalent(cf.Units('mile'))) self.assertTrue(cf.Units('s').equivalent(cf.Units('h'))) self.assertTrue(cf.Units('s').equivalent(cf.Units('day'))) self.assertTrue(cf.Units('second').equivalent(cf.Units('month')) ) self.assertTrue(cf.Units(calendar='noleap').equivalent(cf.Units(calendar='noleap'))) self.assertTrue(cf.Units(calendar='noleap').equivalent(cf.Units(calendar='365_day'))) self.assertTrue(cf.Units(calendar='nOLEAP').equivalent(cf.Units(calendar='365_dAY'))) self.assertTrue(cf.Units('days since 2000-1-1').equivalent(cf.Units('d since 2000-1-1 0:0'))) self.assertTrue(cf.Units('days since 2000-1-1').equivalent(cf.Units('h since 1234-1-1 0:0'))) self.assertTrue(cf.Units('days since 2000-1-1').equivalent(cf.Units('d since 2000-1-1 0:0', calendar='gregorian'))) self.assertTrue(cf.Units('days since 2000-1-1').equivalent(cf.Units('h since 1234-1-1 0:0', calendar='standard'))) self.assertTrue(cf.Units('days since 2000-1-1', calendar='all_leap').equivalent(cf.Units('d since 2000-1-1 0:0', calendar='366_day'))) self.assertTrue(cf.Units('days since 2000-1-1', calendar='all_leap').equivalent(cf.Units('h since 1234-1-1 0:0', calendar='366_day'))) #--- End: def def test_Units_BINARY_AND_UNARY_OPERATORS(self): self.assertTrue((cf.Units('m')*2) ==cf.Units('2m')) self.assertTrue((cf.Units('m')/2) ==cf.Units('0.5m')) self.assertTrue((cf.Units('m')//2) ==cf.Units('0.5m')) self.assertTrue((cf.Units('m')+2) ==cf.Units('m @ -2')) self.assertTrue((cf.Units('m')-2) ==cf.Units('m @ 2')) self.assertTrue((cf.Units('m')**2) ==cf.Units('m2')) self.assertTrue((cf.Units('m')**-2) ==cf.Units('m-2')) self.assertTrue((cf.Units('m2')**0.5)==cf.Units('m')) u = cf.Units('m') v = u u *= 2 self.assertTrue(u==cf.Units('2m')) self.assertTrue(u!=v) u = cf.Units('m') v = u u /= 2 self.assertTrue(u==cf.Units('0.5m')) self.assertTrue(u!=v) u = cf.Units('m') v = u u //= 2 self.assertTrue(u==cf.Units('0.5m')) self.assertTrue(u!=v) u = cf.Units('m') v = u u += 2 self.assertTrue(u==cf.Units('m @ -2')) self.assertTrue(u!=v) u = cf.Units('m') v = u u -= 2 self.assertTrue(u==cf.Units('m @ 2')) self.assertTrue(u!=v) u = cf.Units('m') v = u u **= 2 self.assertTrue(u==cf.Units('m2')) self.assertTrue(u!=v) self.assertTrue((2*cf.Units('m')) ==cf.Units('2m')) self.assertTrue((2/cf.Units('m')) ==cf.Units('2 m-1')) self.assertTrue((2//cf.Units('m'))==cf.Units('2 m-1')) self.assertTrue((2+cf.Units('m')) ==cf.Units('m @ -2')) self.assertTrue((2-cf.Units('m')) ==cf.Units('-1 m @ -2')) self.assertTrue((cf.Units('m')*cf.Units('2m')) ==cf.Units('2 m2')) self.assertTrue((cf.Units('m')/cf.Units('2m')) ==cf.Units('0.5')) self.assertTrue((cf.Units('m')//cf.Units('2m'))==cf.Units('0.5')) u = cf.Units('m') v = u u *= u self.assertTrue(u==cf.Units('m2')) self.assertTrue(u!=v) u = cf.Units('m') v = u u /= u self.assertTrue(u==cf.Units('1')) self.assertTrue(u!=v) u = cf.Units('m') v = u u //= u self.assertTrue(u==cf.Units('1')) self.assertTrue(u!=v) self.assertTrue(cf.Units('m').log(10) ==cf.Units('lg(re 1 m)')) self.assertTrue(cf.Units('m').log(2) ==cf.Units('lb(re 1 m)')) self.assertTrue(cf.Units('m').log(math.e)==cf.Units('ln(re 1 m)')) self.assertTrue(cf.Units('m').log(1.5) ==cf.Units('2.46630346237643 ln(re 1 m)')) #--- End: def #--- End: class if __name__ == '__main__': print 'cf-python version:', cf.__version__ print 'cf-python path:' , os.path.abspath(cf.__file__) print '' unittest.main(verbosity=2) cf-python-1.3.2/test/test_Variable.py0000644000175000017500000000306712770450215017752 0ustar daviddavid00000000000000import os import numpy import cf import unittest import inspect class VariableTest(unittest.TestCase): def setUp(self): self.filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test_file.nc') self.chunk_sizes = (17, 34, 300, 100000)[::-1] self.original_chunksize = cf.CHUNKSIZE() self.f = cf.read(self.filename)[0] self.test_only = () def test_Variable_max_mean_mid_range_min_range_sd_sum_var(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: f = cf.read(self.filename)[0] self.assertTrue(f.max() == f.data.max(squeeze=True)) self.assertTrue(f.mean() == f.data.mean(squeeze=True)) self.assertTrue(f.mid_range() == f.data.mid_range(squeeze=True)) self.assertTrue(f.min() == f.data.min(squeeze=True)) self.assertTrue(f.range() == f.data.range(squeeze=True)) self.assertTrue(f.sd() == f.data.sd(squeeze=True)) self.assertTrue(f.sum() == f.data.sum(squeeze=True)) self.assertTrue(f.var() == f.data.var(squeeze=True)) #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def #--- End: class if __name__ == '__main__': print 'cf-python version:', cf.__version__ print 'cf-python path:' , os.path.abspath(cf.__file__) print'' unittest.main(verbosity=2) cf-python-1.3.2/test/Aggregate.py0000600000175000017500000000544012357206160017040 0ustar daviddavid00000000000000import cf import os import time def test(chunk_sizes=(17, 34, 60, 300, 100000)): start_time = time.time() print '----------------------------------------------------------' print 'cf.aggregate' print '----------------------------------------------------------' #import create_field #f = create_field.test() filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), "test_file.nc") original_chunksize = cf.CHUNKSIZE() cf.CHUNKSIZE(10000000) f = cf.read(filename, squeeze=True)[0] print f f.transform('at').inspect() for chunksize in chunk_sizes[::-1]: f.aux('aux0').id = 'atmosphere_hybrid_height_coordinate_ak' f.aux('aux1').id = 'atmosphere_hybrid_height_coordinate_bk' g = cf.FieldList(f.subspace[0]) g.append(f.subspace[1:3]) g.append(f.subspace[3]) g[-1].flip(0, i=True) g.append(f.subspace[4:7]) g[-1].flip(0, i=True) g.extend([f.subspace[i] for i in range(7, f.shape[0])]) g0 = g.copy() assert g.equals(g0, traceback=True), "g != itself" h = cf.aggregate(g, info=1) assert h[0].shape == (10, 9), 'h[0].shape is '+repr(h[0].shape) assert h[0].equals(f, traceback=True), 'asdasds' assert g.equals(g0, traceback=True), "g != itself after aggregation" i = cf.aggregate(g, info=1) assert i.equals(h, traceback=True), "The second aggregation != the first" assert g.equals(g0, traceback=True), "g != itself after the second aggregation" i = cf.aggregate(g, info=1, axes='grid_latitude') assert i.equals(h, traceback=True), "The third aggregation != the first" assert g.equals(g0, traceback=True), "g !=itself after the third aggregation" assert i[0].shape == (10,9), 'i[0].shape is '+repr(i[0].shape) i = cf.aggregate(g, info=1, axes='grid_latitude', donotchecknonaggregatingaxes=1) assert i.equals(h, traceback=True), "The fourth aggregation != the first" assert g.equals(g0, traceback=True), "g != itself after the fourth aggregation" assert i[0].shape == (10,9), 'i[0].shape is '+repr(i[0].shape) #--- End: for print h time_elapsed = (time.time() - start_time)/60.0 print print '---------------------------------------------------------------------------' print 'All aggregation tests passed for cf version', cf.__version__ print 'Running from', os.path.abspath(cf.__file__) print 'Time elapsed: %f minutes' % time_elapsed print '---------------------------------------------------------------------------' #--- End: def if __name__ == "__main__": test() cf-python-1.3.2/test/__init__.py0000600000175000017500000000000012603546021016671 0ustar daviddavid00000000000000cf-python-1.3.2/test/oldtest.py0000600000175000017500000000133312350773240016626 0ustar daviddavid00000000000000import cf import os import time import test1 import Units import Data import Datetime import Comparison import Collapse import PP import Transform import create_field import Aggregate start_time = time.time() create_field.test() Datetime.test() Comparison.test() Transform.test() Aggregate.test() Units.test() PP.test() Collapse.test() Data.test() time_elapsed = (time.time() - start_time)/60.0 print print '---------------------------------------------------------------------------' print 'All tests passed for cf version', cf.__version__ print 'Running from', os.path.abspath(cf.__file__) print 'Time elapsed: %f minutes' % time_elapsed print '---------------------------------------------------------------------------' cf-python-1.3.2/test/example4.py0000600000175000017500000000525612231474664016705 0ustar daviddavid00000000000000import cf import numpy #--------------------------------------------------------------------- # 1. Create the field's domain items #--------------------------------------------------------------------- # Create a grid_latitude dimension coordinate dim0 = cf.DimensionCoordinate(properties={'standard_name': 'grid_latitude'}, data=cf.Data(numpy.arange(10.), 'degrees')) # Create a grid_longitude dimension coordinate dim1 = cf.DimensionCoordinate(data=cf.Data(numpy.arange(9.), 'degrees')) dim1.standard_name = 'grid_longitude' # Create a time dimension coordinate (with bounds) bounds = cf.CoordinateBounds( data=cf.Data([0.5, 1.5], cf.Units('days since 2000-1-1', calendar='noleap'))) dim2 = cf.DimensionCoordinate(properties=dict(standard_name='time'), data=cf.Data(1, cf.Units('days since 2000-1-1', calendar='noleap')), bounds=bounds) # Create a longitude auxiliary coordinate aux0 = cf.AuxiliaryCoordinate(data=cf.Data(numpy.arange(90).reshape(10, 9), 'degrees_north')) aux0.standard_name = 'latitude' # Create a latitude auxiliary coordinate aux1 = cf.AuxiliaryCoordinate(properties=dict(standard_name='longitude'), data=cf.Data(numpy.arange(1, 91).reshape(9, 10), 'degrees_east')) # Create a rotated_latitude_longitude grid mapping transform trans0 = cf.Transform(grid_mapping_name='rotated_latitude_longitude', grid_north_pole_latitude=38.0, grid_north_pole_longitude=190.0) # -------------------------------------------------------------------- # 2. Create the field's domain from the previously created items # -------------------------------------------------------------------- domain = cf.Domain(dim=[dim0, dim1, dim2], aux=[aux0, aux1], trans=trans0, assign_axes={'aux1': ['dim1', 'dim0']}) #--------------------------------------------------------------------- # 3. Create the field #--------------------------------------------------------------------- # Create CF properties properties = {'standard_name': 'eastward_wind', 'long_name' : 'East Wind', 'cell_methods' : cf.CellMethods('latitude: point')} # Create the field's data array data = cf.Data(numpy.arange(90.).reshape(9, 10), 'm s-1') # Finally, create the field f = cf.Field(properties=properties, domain=domain, data=data, axes=domain.axes(['grid_long', 'grid_lat'], ordered=True)) print "The new field:\n" print f cf-python-1.3.2/test/file4.nc0000644000175000017500000106030012752572327016144 0ustar daviddavid00000000000000CDF heighttimebounds2 grid_latitudengrid_longitudej  ConventionsCF-1.5 height unitsmpositiveup standard_nameheight long_nameheightaxisZ< time_bndsDtime  long_nametime standard_nametimeunitsdays since 0000-1-1calendarnoleapbounds time_bndsaxisTTgrid_latitude_boundsà\ grid_latitude unitsdegrees standard_name grid_latitudeboundsgrid_latitude_boundsaxisYp<grid_longitude_bounds ¬grid_longitude unitsdegrees standard_namegrid_longitudeboundsgrid_longitude_boundsaxisXPLlatitude units degrees_north standard_namelatitudel`œ longitude units degrees_east standard_name longitudel`‡ürotated_latitude_longitude grid_north_pole_latitude@Cgrid_mapping_namerotated_latitude_longitudegrid_north_pole_longitude@gÀô\tas  _FillValueD¯€ grid_mappingrotated_latitude_longitude coordinateslatitude longitude standard_nameair_temperature cell_methods time: mean (interval: 1.0 month)unitsK missing_value`­xìl`ô`@APA@AÈ@7Š=t€@7™€@7™€@6¨õÆ€@6¨õÆ€@68Qï€@68Qï€@5Ç®€@5Ç®€@5W A€@5W A€@4æfj€@4æfj€@4u“€@4u“€@4¼€@4¼€@3”zå€@3”zå€@3#×€@3#×€@2³37€@2³37€@2B`€@2B`€@1Ñ뉀@1Ñ뉀@1aG²€@1aG²€@0ð£Û€@0ð£Û€@0€€@0€€@0\-€@0\-€@/=p­@/=p­@.\(ÿ@.\(ÿ@-záQ@-záQ@,™™£@,™™£@+¸Qõ@+¸Qõ@*× G@*× G@)õ™@)õ™@)zë@)zë@(33=@(33=@'Që@'Që@&p£á@&p£á@%\3@%\3@$®…@$®…@#ÌÌ×@#ÌÌ×@"ë…)@"ë…)@" ={@" ={@!(õÍ@!(õÍ@ G®@ G®@ÌÌâ@ÌÌâ@ =†@ =†@G®*@G®*@…Î@…Î@Âr@Âr@@@=pº@=pº@zá^@zá^@¸R@¸R@ ë…L@ ë…L@ ff”@ ff”@áGÜ@áGÜ@\)$@\)$?ÿ®Ø?ÿ®Ø?ø£×h?ø£×h?ñ™™ø?ñ™™ø?å¹?å¹?Ì(øÀ?Ì(øÀ¿Ì(òÀ¿Ì(òÀ¿å·¿å·¿ñ™™8¿ñ™™8¿ø£Ö¨¿ø£Ö¨¿ÿ®¿ÿ®À\(ÄÀ\(ÄÀáG|ÀáG|À ff4À ff4À ë„ìÀ ë„ìÀ¸QÒÀ¸QÒÀzá.Àzá.À=pŠÀ=pŠÀÿÿæÀÿÿæÀÂBÀÂBÀ…žÀ…žÀG­úÀG­úÀ =VÀ =VÀÌ̲ÀÌ̲À G®À G®À!(õµÀ!(õµÀ" =cÀ" =cÀ"ë…À"ë…À#ÌÌ¿À#ÌÌ¿À$®mÀ$®mÀ%\À%\À&p£ÉÀ&p£ÉÀ'QëwÀ'QëwÀ(33%À(33%À)zÓÀ)zÓÀ)õÂÀ)õÂÀ*× /À*× /À+¸QÝÀ+¸QÝÀ,™™‹À,™™‹À-zá9À-zá9À.\(çÀ.\(çÀ/=p•À/=p•À0\!€À0\!€À0ÿø€À0ÿø€À0ð£Ï€À0ð£Ï€À1aG¦€À1aG¦€À1Ñë}€À1Ñë}€À2BT€À2BT€À2³3+€À2³3+€À3#×€À3#×€À3”zÙ€À3”zÙ€À4°€À4°€À4u‡€À4u‡€À4æf^€À4æf^€À5W 5€À5W 5€À5Ç® €À5Ç® €À68Qã€À68Qã€À6¨õº€À6¨õº€À7™‘€À7™‘€À7Š=h€À7Š=h€À7úá?€À7úá?€À8k…€À8k…€À8Ü(í€@7Që‰@6áG²@6p£Û@6@5\-@5¸V@4®@4=p¨@3ÌÌÑ@3\(ú@2ë…#@2záL@2 =u@1™™ž@1(õÇ@0¸Qð@0G®@/®„@.ÌÌÖ@-ë…(@- =z@,(õÌ@+G®@*ffp@)…Â@(£×@'Âf@&áG¸@& @%¸\@$=p®@#\)@"záR@!™™¤@ ¸Qö@®@ë…4@(õØ@ff|@£× @áGÄ@¸h@\) @™™°@®¨@ (õð@£×8@¸€@™™È?ü(ö ?õ¸°?ì(ö€?Ü(÷@>˜¿Ü(ô@¿ì(õ¿õ·ð¿ü(õ`À™™hÀ¸ À£ÖØÀ (õÀ®HÀ™™€À\(ÜÀ¸8ÀáG”À£ÖðÀffLÀ(õ¨Àë…À®`À ¸QÞÀ!™™ŒÀ"zá:À#\(èÀ$=p–À%¸DÀ%ÿÿòÀ&áG À'ÂNÀ(£ÖüÀ)…ªÀ*ffXÀ+G®À,(õ´À- =bÀ-ë…À.Ì̾À/®lÀ0G® À0¸QäÀ1(õ»À1™™’À2 =iÀ2zá@À2ë…À3\(îÀ3ÌÌÅÀ4=pœÀ4®sÀ5¸JÀ5\!À5ÿÿøÀ6p£ÏÀ6áG¦À7Që}À7ÂTÀ833+À8£×À4€À4Qì=€À4Qì=€À3áHf€À3áHf€À3p¤€À3p¤€À3¸€À3¸€À2\á€À2\á€À2¹ €À2¹ €À1®3€À1®3€À1=q\€À1=q\€À0ÌÍ…€À0ÌÍ…€À0\)®€À0\)®€À/× ¯À/× ¯À.õÄÀ.õÄÀ.|SÀ.|SÀ-34¥À-34¥À,Qì÷À,Qì÷À+p¥IÀ+p¥IÀ*]›À*]›À)®íÀ)®íÀ(ÌÎ?À(ÌÎ?À'놑À'놑À' >ãÀ' >ãÀ&(÷5À&(÷5À%G¯‡À%G¯‡À$fgÙÀ$fgÙÀ#… +À#… +À"£Ø}À"£Ø}À!ÂÏÀ!ÂÏÀ áI!À áI!À sÀ sÀ=sŠÀ=sŠÀzä.Àzä.À¸TÒÀ¸TÒÀõÅvÀõÅvÀ36À36Àp¦¾Àp¦¾À®bÀ®bÀëˆÀëˆÀ(øªÀ(øªÀ ÌÒœÀ ÌÒœÀ G³äÀ G³äÀ•,À•,À=vtÀ=vt¿ýp¯x¿ýp¯x¿öfr¿öfr¿î¸i0¿î¸i0¿à£îP¿à£îP¿´{›€¿´{›€?× à?× à?陂P?陂P?óÖþ˜?óÖþ˜?úá<?úá<@õ¼¼@õ¼¼@zÛt@zÛt@ÿú,@ÿú,@ …ä@ …ä@ 7œ@ 7œ@G«*@G«*@ :†@ :†@ÌÉâ@ÌÉâ@Y>@Y>@Qèš@Qèš@wö@wö@×R@×R@™–®@™–®@\& @\& @ Z³@ Z³@!p¢a@!p¢a@"Qê@"Qê@#31½@#31½@$yk@$yk@$õÁ@$õÁ@%×Ç@%×Ç@&¸Pu@&¸Pu@'™˜#@'™˜#@(zßÑ@(zßÑ@)\'@)\'@*=o-@*=o-@+¶Û@+¶Û@+ÿþ‰@+ÿþ‰@,áF7@,áF7@-Âå@-Âå@.£Õ“@.£Õ“@/…A@/…A@032w€@032w€@0£ÖN€@0£ÖN€@1z%€@1z%€@1…ü€@1…ü€@1õÁÓ€@1õÁÓ€@2feª€@2feª€@2× €@2× €@3G­X€@3G­X€@3¸Q/€@3¸Q/€@4(õ€@4(õ€@4™˜Ý€@4™˜Ý€@5 <´€@5 <´€@5zà‹€@5zà‹€@5ë„b€@5ë„b€@6\(9€@6\(9€@6ÌÌ€@6ÌÌ€@7=oç€@7=oç€@7®¾€@7®¾€@8·•€@8·•€@8[l€@8[l€@8ÿÿC€@8ÿÿC€@9p£€@9p£€@9áFñ€À4Š>)À4šRÀ3¨ö{À38R¤À2Ç®ÍÀ2W öÀ1ægÀ1uÃHÀ1qÀ0”{šÀ0#×ÃÀ/fgØÀ.… *À-£Ø|À,ÂÎÀ+áI À+rÀ*¹ÄÀ)=rÀ(\*hÀ'zâºÀ&™› À%¸S^À$× °À#õÄÀ#|TÀ"34¦À!QìøÀ p¥JÀ»8À\+ÜÀ™œ€À× $À}ÈÀQîlÀ_ÀÌÏ´À @XÀaøÀ C@À…$ˆÀÐÀzç¿ùëÀ¿òáSP¿ç®+À¿Ó3aÀ?Áë(?âDà?ðQßà?÷\P?þfZÀ@¸L@=jÐ@ ‰ˆ@ G¨@@fc|@(òØ@ë‚4@®@p ì@30H@õ¿¤@¸O@zÞ\@ ¶Ü@ ÿþŠ@!áF8@"Âæ@#£Õ”@$…B@%fdð@&G¬ž@'(ôL@( ;ú@(냨@)ÌËV@*®@+Z²@,p¢`@-Qê@.31¼@/yj@/õÁ@0k„c@0Ü(:@1LÌ@1½oè@2.¿@2ž·–@3[m@3ÿD@3ð£@4aFò@4ÑêÉ@5BŽ @5³2w@6#ÖN@6”z%@7ü@7uÁÓ@7æeª@8W @8Ç­X@98Q/@9¨õ@PÇúq,õn@PÚJkDX2@Pìp9&Ãã@Pþj&Æs@Q6kvm@Q!Ó.À+@Q3>„^¦„@QDvkaÌo@QUxÎæ@QfC…,•…@QvÔO$Ë@Q‡(Ø˾@Q—>´ó [@Q§dÄòA@Q¶¤OÖA@QÅîÇü@QÔð›Ð1@Qã¥6ä@Qò b3Z°@R„®<_@R Þ„ mm@RE2•Í$@R(PP}Ô¦@R4ü]AÏ@RAFŠž@RM*Úõ¨Ã@RX¦ ;ºÉ@Rc´šäï@RnS Ý…²@Rx}Ûˆ!ß@R‚1‹ž³ @R‹j¥i£¥@R”%¾Hn^@Rœ_|„`ç@R¤œcãØ@R«Aõr@R±äì à@R·ùZBÞÓ@R½}Îÿ™@RÂoXKF@RÆË©¦Ô@RÊ­æoc@Rͼ”3>¦@RÐMÍo)@RÒCf¡@RÓ›iÝ„ß@RÔV#ÁÇ@RÔrâð6@RÓñ–8µ@RÒÒÖ{©@RÑ60´@Rν’¼*Ò@RËÉÂøÒ[@RÈ<;–0@RĶù‹@R¿[14‡C@Rº ã‚âo@R´+?eíä@R­»éu]K@R¦À³ý «@RŸ<™~³þ@R—2·-_@RަGv<@R…šœ«@R|×Z~@Rr7ך @Rgžl³©!@R\¸;IV@RQd%Kºl@RE¥©šÖ®@R9€@õé@R,÷[ƒÉ@R [¸ZU@RÈ™±E@R)Yôt@Q÷3ÐDcã@Qèë ­ô@QÚRUÔF§@QËlj ó²@Q¼7¯`”@P©¬¼nÏ£@P–õBoS@P„Bb×–@Pq%N=@P]ùEÞ@PJ·îç£@P7Waˆï€@P#ØÏ ¯Â@P=]'3´@Où Kez˜@OÑhnaãU@P´=¹®O@PÆ11Í¡@PØ)Œ”¼@Péóÿ\1‡@Pû`Mßi@Q üO›ò@Q5ä"ʯ@Q/;!í™Ï@Q@ ùº™Œ@QP H–F½@Q`û×~Q|@Qq[È*@Q€ùse‘@Q–«ÁIl@QŸïz±K@Q¯BŽ@Q½ÉOÈ…@QÌDÚï @QÚq Ö@QèJñÒäT@QõÏõ–@RûÓ…ì»@RÌ<˜¬@R>¾}ì@R(NûM{@R3úÃx@R?<®Ã5 @RJ†ŽÖö@RT{CrÑJ@R^p“Ú@Rgð(@î@Rpö¾‚K@Ry®tN@RŒ##:¤@R‰¼vŽÆ@RöA½ @R–’ü (W@Rœƒ0]û@R¡åÖé‰þ@R¦¸Ï á‘@RªùâËŒÏ@R®§&~@R±¾è½½É@R´?º0À¸@R¶(l®€#@R·x›u@R¸.œ™@R¸J ëÀ@R·Ìè7Ä@R¶´?µŸI@Rµ’"Ô@R²¹Ú&Ö@R¯Ø{KDK@R¬ah…$>@R¨Uàûª“@R£·»jB˜@Rž‰Úš@R˜Ì N–Ð@R’ƒ;+´@R‹±8jäý@R„Xʱ¾F@R||Û]‡²@Rt p•'Æ@RkF¨qQ@Raò´Hùÿ@RX'Ô.@RMéR¤nŸ@RC:€š¯\@R8±ªöM@R,™8§_œ@R ­dtp3@R^}2)–@R¯Á³Š@Qú¤e?´o@Qí?£Ä@Qß„Q}ÈÊ@QÑu¶ÛH_@QòRë@Q´j$‹+@Q¥rÜ‹ÿ6@Q–3”Ë@Q†®ðêp@QvçƒõЇ@QfßÉ~)ß@QVš(þbl@QFõKe¼@Q5^lÆìB@Q$l¹¦ô@QEòGü‚@Qì›…@PðaŒ9‘@PÞ¦á€É@PÌ¿*Ò›W@Pº«µ\ÒR@P¨n)ý[:@P–!$,Ž@Pƒ{#_O@PpÈ©ç÷~@P]ò/ @PJøßhvÜ@P7Þ9{!@P$£m†Ê¶@PI±jº³@Oû¤ZˆÅŠ@OÔ{ûÜ´@O­j'¿å@PŸâK÷Ù@P±Øƒ‹?@Pâ¯ÑV“@PÕ? „v@Pæ¬ÝÕà@P÷糆Êt@Qð¯Ÿ\@QÃZ¨Ÿz@Q*_a„k@Q:ÂÅ¥6@QJéL;ï@QZÒÀ&ÆD@Qj|d²d@Qyâÿ7Q@Q‰çS:*@Q—ßI2ŽÆ@Q¦o„/@Q´²å 5,@Q¦§r{Ê@QÐGõ¶÷î@QÝ“ê8Èu@Qê‡x<@Q÷æn ñ@RYÞ$‘š@R2_‰Þ^@R¦J‡÷+@R%²y]Ü5@R0SÃ=è_@R:†ÿ1ê@RDI>Au@RM–»ÓÉ@RVmo$ñ@R^Èâ~5@Rf§Wr>)@Rn†þfÄ@Rtà¬s›µ@R{6"1ªÔ@Rf¾¥@R†F<@RŠü(º3@R#búµ›@R’º)|@R•¾Þª8h@R˜0,ÑA•@Rš ügÉ«@R›TvpYÏ@RœUc@Rœ![3Çâ@R›¦h”2@Rš•fƒçŠ@R˜îѳ@R–³gWpÑ@R“ä)‘xê@R‚W,¯L@RŒkõ»å@Rˆ ýmØ@R‚ýU\Q@R}b0ôiî@Rw=û) é@Rp“'È&@RidP '@Ra´-×Ï‚@RY…—Q„æ@RPÛzm…c@RG¸Ø«ïö@R> ÂóEO@R4Uœn@R)œ´³©â@R·{nè@Rhz)>ö@R´0ë3„@QûO0AÃ@Qï&ð5¶m@QâT%ØšT@QÕ'ö©+2@QÇ¥\=ß@Q¹ÏAÂÚé@Q«¨‚Â\à@Q3ê"NŠ@QŽt1S û@Qkÿ«N@QpéíD@Q`ŒqðÅ@QPºnß½@Q@©ë ƒ@Q0[¯¶‡w@QÔB šÞ@QÜ6³¡@Pþß‘w@PìöTLë¼@PÛ›Ã:Ú@Pʺ熯@P¸Uý+RÌ@P¦o™>ôî@P”^6ˆÒÂ@P‚#l 1M@PoÀÃÊj@@P]7µy@PJ‰¬Ë8¬@P7¸Ýh@P$Ä ,‡@P¯)½O@Oüô²þ6@OÖM›÷Б@O¯k—Õ Ÿ@OˆP©ýfã@P‹y%Tð¢@PBòËE@@P®ßÛ¦«‹@PÀN0¼¿p@PÑŒ3•@Pâ˜G¼Ð@Póoñž >@QÝA²¡@Q{Ô1ˆ@Q$«Â÷B›@Q4Ÿ„wüX@QDTáÕ4C@QSÉ’`áT@Qbû;§MË@Qqçq‘££@Q€‹¶¤>D@QŽå|[ü@Qœò#­éí@Qª®ý¬·Ž@Q¸LWm]@QÅ.C”Õâ@QÑë ^õ"@QÞL¼!ºq@QêPjOÓŠ@Qõó0&+@R1Úåõ¼@R ŸµO@Rwj‚ëš@R x:“F@R* ‚Â@R3't‚å@R;Ï{Ñ(@RCþ}0ˆ@RK²hn½§@RRè&7ÿ<@RY«åþ@R_ÎÔeg@RezðÏ>@RjŸA„“@Ro9½Íù@RsH‹ â[@RvÉÿâ7M@Ry¼§t'€@R|DL= @R}ðÒãlÒ@R0‹»a @RÝåõþ@Rø“µñ2@R€ŒGNá@R~v°Y@R|Ùj×i@Rz«s€!{@Rwí Ǹ@RtŸ_Qš@RpÃËW™·@Rl[翤@Rgi}¢{ï@Raî…(ªÈ@R[í!ãDû@RUgž÷u@RN`k*à8@RFÚßm@R>×F ›¢@R6ZÀ4¿@R-gX”ìÞ@R#ÿô;ü;@R'„s8@RáC‚@R/p.A @QúÍ$F@Qî—­…>@Qâ¶ZV:ù@QÖv‚R5c@QÉÚ…_ù™@Q¼åKåóË@Q¯™³INz@Q¡úŒ{âO@Q” š¾x,@Q…Ì’”G@QwCäab@QhpÂE¦Þ@QYXqÁ&@QIû{Û¸à@Q:]_f¿:@Q*€ 9åP@Qe¿­žz@Q ¥P‚@Pù‚ÖýƒS@Pè¾] @P×Å.zR@PÆ™1I}Ž@Pµ<:¹B>@P£°«s<@P‘öe«­@P€à×”@PnÚ@ô@P[ÈÓõÏ@PIhÇ@P6ã$žž@P$9hú^@PkÀ6ùÇ@Oüù&©Pì@OÖÙqõn3@O°z»zrÕ@O‰ßEò3 @Oc >~±}@PvÕ8t^Í@Pˆrø²®Ô@P™ãqÖM@P«#¸§HÛ@P¼3Q(Ï9@PÍY¥à@PÝ·ýß­@Pî)M^8’@PþaúDÁ@Q_ùšê9@Q!/íPr@Q-£q:Ãì@Q<ä€þÛ[@QKâN;‹@QZ™È ¼¬@Qi 58ŒI@Qw-Ýb+¸@Q…51=¿@Q’Œ£ @QŸÁ€@N›@Q¬¡ep½@Q¹(°,ê¬@QÅU|pvM@QÑ$­Ò@QÜ“mT*@Qçžà)H@QòD(0î‰@Qü€h TH@RPÄÜG#@R²i8£Á@R¢ˆ+ó€@R!`\&Å@R)#?[D”@R0®…ê²@R7½§t?ß@R>N5ÐÈ'@RD]ÜÇjÁ@RIêiÅõç@RNñΦ’”@RSr%+ô+@RWi²V©‚@RZÖé†Ö2@R]¸o]Í#@R` S‹@RaÓþôëÐ@Rc ]À£Ý@Rcµ¸š†@RcÏÉÎ\Ž@RcZ†—|@RbVU0É@R`Âþë^û@R^¡Ê&çÿ@R[ó^T7@RX¸Ï2s@RTófžÈé@RP¤ž}ë@RKÎ!Ýâ@RFqÇj——@R@‘>MY@R:/Ÿ8å@R3N>ÑÀ,@R+ïÔÛ²¦@R$âxã~@RÆ*,þ@RÿÚð@R Ç, @RÀ²@Qö i-‡D@Që‰ÿ9ö—@Qà£_¸ò @QÕXh‹'Ä@QÉ«ö @Q½ áó>@Q±9üoË7@Q¤zxá‚@Q—cèJ}P@Q‰ú2Pí@Q|? Xõ@Qn6Æ÷mj@Q_â@¯Œ@QQDŒ";¿@QB`ûRå@Q37S)b@Q#Ì„ƒ M@Q!òˆdÎ@Q9Ï=‚ú@Pô<œã@Pã¹Jð@PÓ$ù±F^@PÂ[;(A‚@P±]î ZÐ@P .äg¯l@PŽÏÝ=t@P}BŠ¢G#@Pkˆ/1@PY£~ñ~*@PG”ßËêÄ@P5^)ÙcP@P#ÇÓ&Û@P~wÝ„@Oû®Óæõ@OÖŽt)@O°F?bg‚@OŠ/Ô&)@OcÛ ®çß@O=J«ÝÑ@PaøÙÿÆ7@Psjñ^×k@P„®—P4Â@P•Â#nN@P¦£Þë–!@P·RQ”‹@PÇÊ¿Aúm@PØ ,EÒË@PèX¦ @P÷áBQ/@Qp×ÏŠÚ@QÀøIHÄ@Q%Ïs´ƒ@Q4š ‘ã@QCo¹S@QQZD–¨Ç@Q_K ›Ä@Qlî‹;©@QzAÿíÐÒ@Q‡Bîeí@Q“NŒ@Q BÂþiA@Q¬@QìE˜uÛ@QõF“ÓÈ@Qþ Á>À @R\2K@R8Z˜F@RœÀTé@R†þtýG@R"ôʘ…@R(ãó¸?@R.Rkš?¼@R3>D¾2ÿ@R7¥¸ p@R;‡'U6è@R>á ¾ª@RA²^½„@RCùÍ»ì@RE¶åч@RFçñÁÅk@RGüž~@RG¦ý­^ó@RG4ZÒÚg@RF5Æg@RD«¤J@RB–8Q¦@R?÷P7":@R<Îî|)@R9šÕõî@R4ç·7ü(@R0+Ò?n@R*ì¤z…»@R%, xù1@Rì·.@R.Òg›4@Rö”,N¶@R E±Ä:ë@R»´R@QøƒÞ%ÜŒ@Qïx h0†@QåýÃ8n@Qܹ"{@QÑÈ ¬ÎO@QÇ3­@Q»ú.B’÷@Q°€LfÓÕ@Q¤¨GÆ¿@Q˜tÕËð@Q‹è¥Ð~‰@Q_ý¦@QqС©1u@QdJvG@QVuàÚ¼@QHT+~ñ@Q9éãÅÍÏ@Q+8cþA@QBº‚,@Q ÿs¨J@Pý‘>4äL@PíÚdiÆ@PÝç‰! C@Pͺ´W¬@P½UÝf6%@P¬ºî<šS@P›ëÀ`áR@PŠê¯K5@Py·ÅB‘@PhVaµ¥@PVÇ“iD¢@PE ëØ ¬@P3'îäB@P!0qo@PäÂ{]«@Où³ó'@OÔUhO@O®ÊóÍyQ@O‰?¼É@Ocpß«ø^@O=bÒ¯. @O*“}@PLæE~µ¼@P^-9ôû@PoDÔ v@P€+¿ç&à@Pà0’7x@P¡`f>á @P±ª’õ¶ @PÁ¼Ú†ß@PÑ•RqÆù@Pá2Ù×@PðáŠj@Pÿ¯Üô±@QŒÍ¿ïµ@Q%…6C@Q+wÃc¤«@Q9<‡ @QG?–“³4@QT°nbT@QaÑR€¿@QnŸÉ±0º@Q{P ÆK@Q‡;Yèɱ@Q“Tàó@Qžn©LE\@Q©z»ëR@Q´$ﺺr@Q¾j§ðó×@QÈIJ%¶U@QѾ@¡×s@QÚÆüÕ“+@Qã`ùò|C@Q뉿¥u¦@Qó>äì8ª@Qú~ l@REVm®@R‘››¯Ã@R a¾Â¦L@R³þV@R…¯f£@RÔÒ;ŸÃ@R¡0»Üx@R"è×õ„@R%ª—f¸E@R'ånÙIE@R)˜‹§|û@R*ÃLwê+@R+eAï–(@R+~/~dX@R+ Îà©@R*׃º@R(“k&­@R&‰Û7ôU@R#ùm´’@R áûµÆÑ@RE»Üx‘@R%›ü’@RƒFóC@R_¸ÒÌ@R ½S±×Ü@RÆ»v@@Qý'@Qõï^xð/@QîdÜU­@QæeÝo@QÝôÄs(@QÕ&˰@QËÆË @Q Ÿ²eX@Q·íD¦@Q­g"{Þ¼@Q¢~Z…ý@Q—5]މ„@Q‹ŽÇ±¢ª@Q2R@Qs31CÅd@QfƒSw ­@QY€YE‘@QL,´6@Q>‰¡]õ+@Q0›4F^‰@Q"c(§,¨@QãÏT–¿@Ql,?@Pö5 3À@PæÐT[Ę@P×Iâÿô²@Pdžíõ_É@P·‰sQ{å@P§SbÍ8'@P–æË]@P†D÷jáˆ@Pup4©”—@Pdj ‹{1@PS4(O†0@PAÐ#ªCm@P0?YV@PƒåÐj×@P ž¢¸e@Oõ"X«{@Oй»õåý@O¬ø]ñ@O‡ ä$H@OaǦQ¨¯@O¤[ñ@R ¡;x0;@R ÐÍcv@R zý@@Ržr$˜b@R<ù'Ä@RU_h‹[@Rçœ/Ó?@R óֵܻ@R zeàÎ@R {Ï«Aè@RøÈ:†Ï@Rò0§„‹@Ri @Qý^¬ÿ÷4@QøÔUD8@QóË‘G/–@QîF{@QèE€º™@QáËàg»g@QÚÛ'™ÓÔ@QÓuoYá7@QËœæz @QÃSÎÕÕû@QºœzœR@Q±yI¨Û¯@Q§ì¦ôi@QùËY@Q“ á0æ@Qˆæµœóí@Q}ÍÞª@QrVK¶(Ö@Qf… O{@QZ[½a`@QMÜ×°TK@QA ɯw§@Q3çûF¢ç@Q&v˽z!@Q¹Ç€@Q ²•­­&@Püd¤V@PíÐT ˜@PÞùj6ÿ‹@PÏáx‡P@PÀŠŽfzi@P°ö¬µk@P¡'Çô·O@P‘Çñ°@P€àƒ_š½@PpkɈÚ@P_ÃVáp@PNèÞT @P=ÞçÝX@P,¤_9Y~@P={:Û‡@P ªÖoÓ)@OïÛÆZ5Ò@O̺—"@O§õ>›j@Oƒñºçr@O^ܱþô@O9ãò£¹I@O¦ó@Nï%Z]™ @NÉd Mg@P"&ïøò•@P3¦ô»¬@PCÙö"y@PTiB‚½º@PdÄäòï@Ptë)ÁAL@P„ÚPÅ‚c@P”EõÝ@P¤ üÐû@P³JÕ%H @PÂK˜@PÑ ¡÷½á@P߇–ïQ#@Pí¿ÑƒmW@Pû±0y~@Q Y‡Ól@Q¶¡g¦é@Q#Æ=t]@Q0†öNX@Q<óÔzã@QI (<‚@QTϲÃ{Ò@Q`9F©È@QkFæ.@QuöÆ^I@Q€FN¨4Å@QŠ3‡»@Q“ºÒÏy†@QœÛeª—@Q¥‘š¤f@Q­ÜàÔ²@Qµ¸STª³@Q½$&ˆ ,@QÄxÎ\b@QÊ¢FÉúÝ@Qа£ójí@QÖF½Kp@QÛbÚîk@QàdJòq@Qä&à¥iø@QçËú0O&@Qêñé´@Qí–gu ¦@Qï¹ÎË4c@QñZý¢?ù@Qòyf ';@Qó¨E&@Qó,*j@QòÁS@QñÒOJµ8@Qð`¡Öv“@Qîlƒuf@QëöœñýÚ@QèÿÁN‘@QåˆìiÎâ@Qá“Akؤ@QÝ úì4@QØ0¯@CN@QÒÆÁúS@QÌãí%a§@QƉú¼Cn@Q¿ºÎ!¢–@Q¸xb¯ÐC@Q°ÄÈûlº@Q¨¢$M…y@Q ¨$‡™@Q—•ÁqØ@Q¶9Æú@Qƒíéè°Ô@QyÂÀ)@Qo4å¬Ic@QdHöÛÜ„@QY›ržù@QM^7ÐÁ@QAd-ø+ö@Q5Ü"Â@Q(r›K·S@Q¾7×î@Q>)´ã@Q±T Úg@PòÚC‹ (@P从ps¦@PÖWYîy@PǯÀ$ÂC@P¸ÆÏ¯ƒ‡@P©ž‹N~S@Pš8éŸôD@PŠ—ÔíàŒ@Pz½+ Ö@Pjª½Cî¤@PZbPQJ?@PIåœf®‘@P96M?îg@P(V<Ô,@PFN„a“@P¹/L'@Oé=zñhé@OÆ•èT@O¢–‹J‹@O~É ØY+@OZ­¸Óõ„@O6GAùÎ@O—8Ú@N졊 ¤-@NÇgN)@N¡ë[2³@P ~0%­@PF TCC@P-Üî+ƒ@P>ABïu=@PNqh>¿@P^k°û0â@Pn.dEé÷@P}·½xÄ@Pì5]@Pœ{¡•@PªéNÒÓù@P¹z¨}cÙ@PÇÉ#Áx{@PÕÒ¸B›1@Pã•So²b@PñÙ¸@Pþ=#®Œ@Q «žà@Q¯I«Kë@Q#¤²@Q/Úw¿@Q;nî~—’@QF«/œê!@QQŒyô­@@Q\ª (@Qf4ü Ç!@Qo÷¡@Gè@QyV.- F@Q‚NfPÖ@QŠÞÔ@Q“¦8 @Qš»C¨ä±@Q¢˜óË@Q¨Ýo£@Q¯BÙ‡$@Qµ4 ·ÇŠ@Qº®õŸ×{@Q¿±øßV @QÄ;“öÑ1@QÈJdak§@QËÝ(‘{¹@QÎòÁÉ;þ@QÑŠ5ɆH@QÓ¢°PÜ=@QÕ;„e„÷@QÖT-f#ˆ@QÖìOÜæ9@Q׺B@QÖšd] @QÕ°q/ Ç@QÔF,Ý%@QÒ\ $b@QÏò°nðÀ@QÍ ÜØN?@QÉ¥~ø-ã@QÅèuþ<@QÁfŽjãÜ@Q¼‡—™£@Q·@ t-S@Q±y«Õ¢@Q«>7C©@Q¤—Õ+@Qn˜òD@Q•Þ},ª(@QàÓ¬S·@Q…w²m“@Q|¥> ±Ð@Qsk¦¸·Î@QiÍ&*§@Q_ËüäΘ@QUjq­6²@QJªÎ:h»@Q?^-T@Q4mG]`@Q(NEãÍj@Q-/„2@Q¹m¾ö@Qõ>¢ @PõâÚßf@Pè„p±É#@PÚÜ*ñ‹å@PÌì(x—&@P¾¶nÁã@P°=;ô…Q@P¡‚_­U`@P’‡á^˜V@PƒO¬¡¼/@PsÛ¡§ë;@Pd-• è @PTGO¾§P@PD*Žã;ƒ@P3ÙÞÕ°@P#TTU‡@Pž<¡É@P·ãó˜ @OáFhȦQ@O¾ÃT{@O›èy{yo@Ox¹…NÕ¸@OU8×fß@O1iVS@O Lœ ÖÓ@Nèæ¶5‰@NÄ7˜pþ¬@NŸC¦—œi@Nz cßj@OíN|ʈC@PE»ÇÖž@P²»ªÚ@P'ì«ÛÕW@P7ñòù-å@PGÀê9@PWWߤP˜@Pfµeà@PuÖÉóX9@P„»%*¤¸@P“`LH¡@P¡ÄX+šß@P¯åW¡{S@P½ÁOȇô@PËV<ƒ3 @PØ¢T@P墸Y u@PòVEƒB@PþºéÀY@Q Ìd»g%@QŠÿsx@Q!ó§n3@Q-)Vh@Q7ºPýV¸@QBꆲŽ@QLÃø”u@QU¨®Ýûî@Q^ßÿÿV@Qg±6•§@QpaNŸ§@QxF°G@Q±Èš—@Q†Ùõ S§@Q’ìAp@Q“Úߢ"@Q™°ÝRª@QŸïvå+@Q£ûä—²g@Q¨o‰‰_©@Q¬j8Ï@Q¯ëÉL½@Q²ò'?Øï@Qµ|¾x}»@Q·ŠÇY«@Q¹ŸH@Qº.ÉŸþZ@QºÃðs¥f@QºÚåß)@Qºs ?†^@Q¹ŽB`Š,@Q¸+'ëÜ@Q¶J8L¹@Q³í!w˜@Q±®-'a@Q­¿ên£@Q©ð*Bõ@Q¥¨>Ql@Q è…""Ø@Q›²_ç½M@Q–Lí|@QèášjQ@Q‰XÐn=@Q‚XÞâ ×@QzêçLʲ@QsÕóýö@Qj̦ìhK@Qb džË@QY"¨’ò@QO˜¯[@QEÀ(欿@Q;ˆÄËc@Q0ôƒ¥v@Q&zY„@Q»CD]‘@Q©˜â[@Q'‚GNP@Pöàûø4@PêJA;†@PÝev€Üx@PÐ4»'6D@Pº&§M©@P´÷ÈÖx^@P¦ï© J@P˜£Å—¢r@PŠ9‘N@P{H|ÇÕ@Pl<âÒ“@P\õ`ð@PMrñ¼hñ@P=¸&JKü@P-ÆnrjÚ@PŸt‘›@P D×öð^@OùpYÕ+Ä@O×õùzy›@O¶‹¾Oò@O“é÷ûÖë@Oq^P‰@ON|‘ë0½@O+H%j¹X@OÃ_:ä4@Nãð¿þHŸ@N¿Ò´úŒÇ@N›k˜‰*Ï@Nv½²‹a^@NQË8à€k@OÁGË8•?@Oâ3 $†8@P],Ý÷@PmOc.G@P!HX¢sý@P0ì©7”@P@X—aL@POŠo4@P^€rÞ @Pm8Ø!S¬@P{±Ï1ÿú@P‰é{°4™@P—ÝøÔqÈ@P¥Y @P²õ¦jO‰@PÀãB_;@PÌé ¸¸Ý@PÙp‘g@På§æ ÝF@PñŽt`Þ@Pý!¡8r×@Q_Pç¨Å@QEe Ø@QÑÁLXÜ@Q(Fä™*@Q1ÔÛê>@Q;Giî/@QDWà4/#@QM5f©@QUJi[¬/@Q](†ò0è@Qdœ¥ïî@Qk¤ìò”Ì@Qr?“c#@Qxjãnnu@Q~%;ö7(@QƒmƒÙ@Qˆ@õ%Ù@QŒŸŒJxh@Q‡œv)Ä@Q“øêæ•@Q–ïÐ,1T@Q™n`<è@Q›r!‰&@QœûU’K @Qž >.Js@Qž›Š‚¾Ê@Qž²ŸpŒ@QžLÿdª@QkÈRæý@Qœ_ÒmÚ@Qš7òZòá@Q—æ ö@Q•\i"/@Q‘Õµz¶@QŽ¥ûå@Q‰åiÞÓ@Q…< †0È@Q€5*IV@QzUYõ@QtŠëÖšQ@Qn‘»@Qg7õŒ'@Q_êÙGÚ)@QX3o6@QP~ŒO@QG‹ÒS!@Q>žË×À@Q5O­ ý@Q+ŸÆ÷,È@Q!‘-cô‘@Q%ù†3d@Q `G¤Ì:@QB5D`@PõÍá~ìI@Pêh>Bw@PÝêä€ã@PÑ€m‚-@PÄÈ–°@P·Ã랸'@PªuõxZT@Pœà3ûÛV@PŸ÷¿@P€å*ú•@Prƒº^—µ@Pcâ/É<Â@PU_âÆU@PEæûD@P6‹sð@P&ÿÃ^¸@P7Á¬(@P:¿oÕ—@OîM¬–»@OÍL „Ù@O¬"Ãok®@OŠšeÙ„+@OhµÒ¹,@OFwÔÈ:•@O#ã"Äô½@Oú_¼¯@@NÝÀ^Z‚@Nº6ÒSÊÄ@N–`î ©"@Nr@È$@NMؤiý@N)*¸A‚@O”ë¹w|@Oµ†FÙª-@OÕ»ýy3É@Oõ‰ÓØcæ@P vVs&Ý@Pð¬]@P)2H¢c3@P89€®Ën@PGŸƒ@PU‘å‡(M@Pcߌ™WP@PqëÄ0k@P´³Èðf@P8zé n@Pšu1˜(ƒ@P§hèî¨J@P´«¶$@PÀm»@PÌzc„­_@PØ6UUô|@PãŸMÿ\q@Pî³Dúi¶@Pùp0í7»@QÔá7Í@Q ÜÅÅJ@QˆbÃôG@Q Ôàгš@Q)ÀF H@Q2H ¯ÚÍ@Q:løY@QB(žgÍù@QI|“C,ø@QPf$jr¤@QVã '‡+@Q\ófþ ²@Qb“íx;ø@Qgý츴@Qlz9º@QpËÝlÌ»@Qt¡½_Ö„@Qx 11Y@QzëÙ¨a+@Q}^Tv?+@QXËQ(@Q€Ú­éÎ@Qã°ÁZ@Q‚sxÛ‘@Q‚‰6Üa@Q‚%ÐyÁû@QIÿ!æ@QóþfÐ@Q~$q”«†@Q{݉ߠó@Qy D؃@Qu黌ý’@Qr>ÕØ"@Qn[^f~@QiŠn0½@Qdƒó­¨Y@Q_ @þGö@QY$Ãoú@QRÎþ¿@QL ‹TR*@QDßz¼«@Q=HVÆþ@Q5J4…@Q,æA~™û@Q$¨7¡s@Qõ@øµ@Ql-ë@Q„æ²Ú@PýAô‰2@Pò¥1á-\@Pç°¦œº²@PÜf\»Ø@PÐÈ[E0@PÄØ«6@P¸™QÀI7@P¬ O[@PŸ3ŸüÕ @P’<¬@P„§kf!@Pv÷´F0@Pi&Í.@PZÍ 8¨?@PLV´!f@P=¡ßxÄÒ@P.°Oé"@Pƒ½éîZ@PØŒ‘è@P€ESAÂ@OáY@'Ì:@OÁHõÊr3@O Ò¼*¿J@OùR"Ž@O^À[ÄêØ@O=)ôш@O9µÒ@Nøð†Öã­@NÖRÌøC¤@N³bzƒ¢@N"ž2 @Nl“Ú€*±@NHºGÆmR@N$—’ÐÆ¯@N-î c÷@Oh=/Þ-@OˆˆrÖ™@O¨m¯ òê@OÇêFXˆ`@Oæû(äz@PΚ?"@PæšgÀg@P ÃñÎë@P/dô‹;Ì@P=Çî&ZX@PKë!Ö¨Ò@PYÌÊÓèê@Pgk´Ï^@PtÄCÜ¿¯@PÖeù©á@PŽŸ¢’àÞ@P›©±Ð@P§OÎlq@P³2ãü™¯@P¾ÅbH~@PÊTøç @PÔðÆrÓO@Pß…Àí\A@PéÂO›¤@Pó¤éÓC@Pý*bÎ'¹@QR*ZÖ@Qž>ñ/@Q7-Aý@Q†ò@Q'Dè¬@Q.R7£É@Q52I*R@Q;˜“Kˆ@QAtßÕ1D@QFüÁËú@QLIê@QP½¼ä á@QTô¸¯­š@QX¹"LÅø@Q\ ú†à±@Q^æ^TŒÏ@QaM‡ûV%@Qc>Ð"Ù@Qd¹®^î¹@Qe½º?/@QfJ¬»@Qf`]ÚÄÂ@QeþÇèk@Qe&ð­o@QcÖSïÌ@Qbx§Ü@Q_Ó²@éé@Q]!Ûq.¾@QYûDÙ>“@QV`Æùãk@QRSVìÉ6@QMÔ,Ø™@QHãüB}@QC„Wÿ@Q=¶è¸qo@Q7|¨?ZÞ@Q0×AºÆ@Q)ÈKDëþ@Q"Qk˜Â@QtXe Ñ@Q2Ô¡U@Q Ž®çÙý@Q‰¿×Z—@P÷%è@^@PíeØl›@PãI&L–Ç@PØÔMÝÌ@PÎàÿßÖ@PÂæoóbc@P·q¼õMÍ@P««¼ñ}ï@PŸ–b鬻@P“3Ÿ…@P†…]˜» @Py†‡Ûˆ@PlMü\`Y@P^È›¶v@PPÿ:²ÆÔ@PBó¨fˆ¸@P4§¬kýž@P&~†Ý@PUn%g@PR’lG_@Oò,3Q+{@OÓCB•Ÿ?@O³í{u¨&@O”-ô|´j@Ot±Ñc6@OS}¥%ó;@O2’­¸ ×@OI˜^`{@N異ÂX@NͧëçJR@N«T“•Y@Nˆ­›UAe@NeµvM…Ý@NBn†h¦”@NÛ Å@MúýyNÔr@MÖ×Ì€×@O;@ot”ç@O[<µ³^U@OzÒ•¯Xù@O™ÿD@O¸¿LüƒM@O×9J"@Oôî=há€@P +R©]:@P£;™Ã@P%Ü|Âõt@P3Öö †@PAŽ>6½@PO±E<@P\2+‰q1@Pi´”¦Æ@PuºyÓ£è@P‚¤§U@PŽWý@©@P™Ò¶ê½@P¥<ߨÈ@P°Tïeóƒ@P»«Û–@PŇ6hq@PÏ© š½@PÙZ{³Æd@Pâ»Ót@Pë¿Ú› @PôdÂnê@Pü¨Â×cÄ@QŠSŒÈ@Q $úZÛ@Q-ÀöJ@QÍ¡¬ªó@Q ø`'^@Q%ﺧ“þ@Q+_„W½@Q0b93@Q4öGp[@Q9Tí-€@Q<ÍöÎ]@Q@ôNW!@QBßv˜È¢@QE;©Gï@QG$:8 J@QH˜\ƒiK@QI—ÆõÜm@QJ"5¦Ò@QJ7ƒ¯·Ô@QI׫cþ@QIÆPùæ@QG¹ Ï@QEú×Kþ~@QCÈš®X†@QA"êç¬ø@Q> x¢>j@Q:€²ª@Q6„›O@Q2ác—@Q->§ô™@Q'öwÁ K@Q"AÑæË@Q"·àe@Q˜­Ë•¦@Q§"nT@QOün@Pÿ‘óìý@P÷q ç?@PîïÂJ n@PæTÎs@PÜ΀„Ûä@PÓ2¼L¯î@PÉ<ªÚïÛ@P¾î)Æ[)@P´IÈ<@P©O]‰=c@PžØzž½@P’emǶ4@P†xÿT¹U@Pz?lÑÆy@Pmº’ßà×@P`ìJHÙ@PSÖgCó/@PFz¸Øj÷@P8Û@R@P*ùf;¶@PÖ¥r…@Pud_$(@Oÿ®IÈ7@OáúKÕ©Š@OÃÒ×’<@O¥:Ó)3@O†5Xke@OfÅpuù@OFî:ä@O&²"ôµª@OxìÐ@NåÖ¯d@Nþî,s@N¢ _¶ä@N€»L«@N]¤~oœØ@N:ô¶t@Nóäá¡@Mô¦00w»@MÑ 9"Ù™@M­++û®™@O ÷ZSKj@O-¦&ë­@OLí³ñFU@OkË^ Ñ4@OŠ<—\@O¨<ä™Të@OÅʧR?g@Oââ>ˆÈØ@Oÿ€vôéÝ@P Ñ_EÎ@P¡Û “]@P)1éè8@P6|Ù.í@PCƒ”5,¾@PPCy ‚+@P\ºÂù1¦@Phç©'Ðá@PtÈ_Få§@P€[Ou@P‹ýPv@P–BOžQ@P¡-9êà@P«užáô+@Pµg, @P¾ÿ¬¬¾ã@PÈ=šÚ¸Z@PÑIy@PÙ¢{r–=@PáÅþôå @Pé‡þïmø@PðæÜjL@P÷áÁ2\@Pþtóój@Q¡1¾+Ì@Q d[³K @Q½ü$¥@Qª9ì@Q*‚) g@Q<ä—Rk@Q àbïhâ@Q$3a @Q&×8Þ÷~@Q))ÚÕ…@Q+ Sb¦@Q,v½pÎ@Q-q´îF@Q-ù¹Ž«@Q.¨mhõ@Q-°|*ŒÓ@Q,ßLñá@Q+›PZÍô@Q)äÙ'êã@Q'¼VÜ@@Q%"U1$@Q"{k(f@Qœ‹Œï™@Q²anWW@QYñ¸ˆ@Q”HÉÇK@Q b‰„&­@QÅì È@Q¿¼k‡s@PúQYHì@Pó|2f¬!@PìAÇIV.@P䣥¼Oø@PÜ£hf+@PÔBµY’ @P˃<¬ù¬@PÂf·K@P¸îä›+ü@P¯‹1%¶@P¤ôut;@PšuqçÜ‹@P¢PÖ«5@P„|ä8M¥@Pyþ,ä²@PmBp 8@@Pa1 äE»@PTÔ˜ÜxY@PH.ç9t±@P;A»E? @P.Ö¿f×@P —öHÈf@PÞÐÞaH@Påb¢@OíXèi6¡@OÐm¨°2@O³ ï'e®@O•2ž¥Õd@Ovê>}ß@OX3Ù£©Ç@O9j¢]ÿ@OˆÜý>@NùšT=š@NÙH¹ k@N¸—§šb @N—‰|Ôà‘@Nv Ñ*n@NT`,¶¦@N2J_Yg@NàÉóF@Mí&ɧ$@MÊQ§«@M¦É™û×@Mƒ*Ìp%å@Nàe._ã‹@NÿÇd§i¢@OÁéV_è@O=Qän9¸@O[tn´ k@Oy&‘ëÆž@O–eI"õø@O³- ó@OÏ|~F@OëMàÜt-@POÏgž§@P·t0o@PÚé8uË@P*¹Ì&þ@P7Qû'ý@PC¡¾_ÂÆ@PO§[Y ›@P[a!ZÑ@PfÍ(ɽ-@PqéØÅ@P|µ` ~¨@P‡-ÿp‰$@P‘Qö @P›†iRÖ@P¤”ö þ€@P­°Oâj@P¶p¢DÆë@P¾Ó…åkñ@PÆ×™bGF@PÎ{Ehud@PÕ¼ýq6@PÜ›A49@PãcЀ@Pé'®8)â@PîÓ]@Pô®Í´@Pøî,µ@Pý[{xÞ3@Q\–&¤@Qð‹Éõ@Q‚p2X@Q ͹ž @Q ‰®ñ @Qíd/bZ@QTÕ×Û@QK†Pp@QÑ8Âù=@QåÌ$Ø@Q‰;_(â@Q»T÷K@Q}$Ç_`@Q Î íZ@Q ®øéèó@Q 3£—j@Q"nÐÕ@@Q¶bh¸Y@PþÜÞø3@Pú–̳î†@Põå*sÆQ@PðÉ šx´@PëC›ì;¼@PåVVúO@PßïN@PØHbñÉ@PÑ*P)ˆN@Pɪ¬#@PÁÈä0GT@P¹ˆLB±@P°éìf‹@P§ïjÇ© @Pžštû*ì@P”ì¾À;ˆ@PŠèÒG@P€÷ÄU\@Puàbé±@PjáLL»@P_‘š±kk@PSóê­@PH ³Äµ@P;Ô´ F@P/V©LàC@P"‘J‰Ÿí@P†M)I·@P7a~ã@OõLe©äy@OÙ¨Íýº×@O½‡;ÌdE@O êâbo@OƒÖçàg¶@OfNd­€Ð@OHTbÿV=@O)ëÞu{@O Ãdžò@NëÚð„N¾@NÌ82á„@N¬2I—Tî@N‹ËãÐ2¬@Nk¡g@NIèu~ @N(oµNVæ@N ý¥ûò@Mä~L'Ú@M óQCÃ@MŸF6г@M|5J¹{*@MXÙU·Âu@N²Œª0‡ƒ@NÑ£nûüÑ@NðQô ‚à@O•n!0@O,k»$œ@OIÏÍWùê@OfÀÕÈìL@Oƒ;—E£@OŸ;Œ{˜@Oº¿èÓÚ@OÕÂ}¬AŒ@OðB££Ê@P"ÄÍ¢@PÖî"¼@PGom 4@P*p™ÍeÑ@P6Oà óO@PAã”&cE@PM*þ Ç@PX!z쇜@PbÈI«=ß@Pm½ÆŽ•@Pw'‰€¬@P€ÇÙöo¼@PŠ+Ì+²@P“x–Éj@P›µ!Ë7@P£øì|Ž@P«Þ3¹U?@P³d‡`¹Ï@PºŠ»¤æ@PÁM]ŠI @PÇ­²½E@PͧÏ~ô@PÓ<[×Ïa@PØi€zá @PÝ.(s–@PበÇZY@Påy”|Õ@Pèþ’°u\@PìM YÁ@Pîà M|Ä@Pñ1'Ñ(@PòÑ4åb@Pô2ª <ì@Põ%<и-@Põ¨³ŠÖ'@Põ¼îå«^@Põaêñ@Pô—º¶@Pó^ýÎà`@PÉå… š@Pêc)ÐÔ@P½ ']ë@P¶ .¥ž£@P®¥ã Š@P¦â½CûA@PžÁ=¦€@P–Bð¼ãM@Pik*@P„6I ci@Pz«,ÌÃJ@PpɾƒÂ@Pf“¨ŸH“@P\ ›Ešb@PQ0Fóž:@PF]½¡v@P:Ž‘ûõ)@P.Ê•ulè@P"¼—±@Pdɽsƒ@P ÆT‚xS@OùÄÂJ‘ò@Oßu'ì£Ã@OÄ¡¨+J@O©KÍh Ì@Oxno¯V@Oq*›ï/@OTcë¼ @O7(âþ³F@O{üs¸P@Nû`$ ¢¶@NÜØ:'‚@N½ç {òê@Nž`­²A@N~Óç9s@N^·Eíl@N><ÕBM@NdÕ7pÌ@Mü4”õ²@MÚ¬ ¸!@M¸ÏHÉ\Z@M– kÒê@Mt {àÌ×@MQRâ0üF@M.9X[ ~@N„pmÍ!™@N£<Ï¿®n@NÁ rzn³@Nߘ—ö—@Ný"s<Ú¯@O;,²%Ÿ@O6ßÞo{@@OS –­÷@OnÁWÜ×j@O‰ø0ö¥@O¤®ÇH)W@O¾âDám@OØkªâ@Oñ³ &j8@P$ùÒÜÄ@P(q¯Aõ@PâMË­V@P(PëöÑj@P3r¨Úrº@P>Eà·Å @PHÈð0k¿@PRú5ë}@P\Øi?é@Pf`â o@Po“õW>@Pxm€]@P€íKi'l@P‰< WO@PÚd[Mõ@P˜DO øý@PŸN‘S°h@P¥÷Ì@P¬>­%%±@P²!ðä”@P· _ãþ2@P¼¸×ŒÌä@PÁjC‰7–@Pų¢®G@PÉ”7›ì@PÍ —ºŒ*@PлÎ@PÒ·B_@PÔìFdY@PÖ´Œî@PØ>Ä{@PØþÚ³@PÙ€*(…Î@PÙ”¾Q¡@PÙ:‰.Í9@PØs¨;…@P×?›÷u@PÕž¨¹ä@PÓ‘0)#e@PѨ¢äk@PÎ2¡Z`@PÊâ¿Y1@PÇ(¿Äî@PÃt¸-@P¾yÂÓ91@P¹†¦*O¹@P´-+ I@P®npdMæ@P¨K¥_À@P¡Æù*ë@PšÞè¸ÿ@P“—ž‹Ñ@P‹ñ‘¾ÄÈ@Pƒî3µû@P{ŽÿΔÅ@PrÕz£Š@PiÃ.’•@P`Y­¯O @PVšd ¸@PL‡qÜ ˆ@PB!ñ+L @P7k¯ÒLç@P,fPØ ã@P!wð3™@PtÈ­we@P ‹åÀ®@Oú´à‰4@OáÄ+©ò@OÈHŒq²i@O®EŒ”ã@O“¾7û³\@Oxµ¯L8¨@O]/ – |@OA-S’;H@O$³Žø‘,@Oıèã@Nêc¦gº@NÌ“Ií·@N®VmaQ@N¯ÒüKl@Np¢1¥Ü­@NQ01!Z»@N1\k¸3@N)mÂÛ+@M𙵙µg@Mϯ³ •@M®mÉøL¸@MŒÖM0ŒG@Mj냶¼B@MH¯¦C›@M&$ßëÈ»@MMNFJ1@NVü[@Nt–ÕRÿ@N’¯äÏ£ç@N°]ÞjhÌ@NÍ7›êÿ@Nêk&7‚Â@OÄÔMo@O"§`š¿ @O>ß =á@OXûYGP@OsfÏc§@OO8ªÌ@O¦±ƒí^@O¿Š™i‰æ@O××Z¾È@O€v@P_§Ÿãå@PªfóÁ@P¨Æº@P$WôíP¸@P.¸5Í3 @P8Ç=ãÑ@PBƒ||£@PKëbŠ]@PTýg¢çÑ@P]¸æ‹Ó@PfÂá,@Pn!!Ñ0 @PuÌ·a J@P} 6@P„ ÷tðK@PŠšöÄå@PÉ×–Ûú@P––d"JA@P›ÿuC¬1@P¡óˆŠË@P¥¢Ø2ç@P©Û..0¯@P­¬å@P±·½@P´a£~%@P¶ªka×@P¸ÖD"²@Pº—s0çò@P»í•r˜]@P¼Ø_V®+@P½WœÙ=W@P½k1¼O@P½¥É6@P¼Oh& ?@P» H »+@P¹…þV;@P·€ãY%@Pµh®¿Ó@P²8ËD@P®õ‹Ë+Ù@P«Jz+ñQ@P§7©Ô̼@P¢½ö@Vè@PÞM×-l@P˜™±Ð@P’ñ1L<Â@PŒåð4EJ@P†ySµ3@P«ú9;)@PxÏ['@Ppõõr6@PiÍ62Ê@P`Îç¥@PX4Lž=ñ@POAãðó@PEù øØß@P<[L“ãÉ@P2j2+àâ@P('LÆåy@P”/!`Ì@P²mÒtp@Pƒž{@Oø®ÀÓ@OàŠY¢œø@OÈqhp1V@O¯ÊÿndÖ@O–š>ãÑL@O|âA@þå@Ob¦=@OGèÕU—(@O,­v#FV@Oöönì7@NôÈFÍb@NØ$Jf4|@N» ÝpÄ@N‡Í·*ó@N”ݹ-o@Na7Ûêç@NBs(å‘¶@N#IªB¬S@N½×Xº×@MãÒ2¤†^@MÉ1cK¾@M¢å;…â'@Mè«­ ‰@M`•Ï. @M>îæWO@Mö#k3@Lú­¬èÿ{@LØ›}‰u@N'v¼@NE±Ìm9@Nc‚®o—’@N€ç£+L?@NÝ­£@Nºb4VW@NÖr Zø¡@Nò Å%b†@O )g¸¿9@O'Ë æMö@OAìÊÒ‹x@O[‹©®ó9@Ot¤®‡“@O4×!E×@O¥9ôz@O¼®q2J@OÓ‘Çå= @Oéà(>@Oÿ–5nÙ@P X”ñø@P–îîUL@P„£5Æ$@P( .÷s@P1hä8p@P:ZÔ9Y@PBöüÑmã@PK;Ão @PS%Ωˆ6@PZµ¯söZ@Paéi=@Ph¿¯K[@Po7@Z@PuNæ>26@P{y£„@P€YàJÞE@P…Kd¬›@P‰Ø 5ñƒ@Pÿí¾U@P‘ÁÙä« @P• ¤ œ@P˜Önª{@Pšœ–Ie@Pœ¿Å|f@PžyîMN@PŸÊ³¾t @P ±Î(¶@P¡/ ÕœM@P¡BQëiP@P ëœF|6@P *ý&5@PŸžßWt@PlÀ#-£@P›o·Jê@P™ ð3]B@P–;ì0`†@P“A€4@Piš¸ñ@P‹f¶‹Ø@P†þdÖ¹d@P‚1ŠEZ}@P} :\@Pwn@åÛ@Pqy¢q³—@Pk$кÒ!@Pdpׯ.?@P]^ôÌû]@PUðp•šñ@PN&žpŽ@PFÛ6ñ@P=†ŒE•Ù@P4³‰T@P+Š}ÍÑ@P" º?Ð@@P<º¡A@PˆDï‘@Pª§ÄüŠ@Oñ×?¿s©@OÛ¿ñ`#@OÅuàüø@O­ÑÞŠ¶¿@O–;,E@O}£˜ÛD?@Od¼Ï×@OKMwLÕ@O1Zú¬å@Oç‚mi'@Nûõþg5@Nà‰VÌ@NĤg• @N¨J·@ç@N‹}Çİ@Nn@j¡“@NP•ñ ©u@N2Eì%¸@N®6@Mõ"º‘nð@MÕÝð€xÌ@M¶8ÈS-9@M–5® K@Mu×ûªß@MUñÈk@M4,þÌy@M¬…–Òx@LðöJ—«å@LÎïœ[,­@L¬šŽÏ&‡@MøúÝ@N‘7(Q@N4[x@NQ8*Œxr@NmæYà@NŠ",”“@N¥é¶ðqA@NÁ9ôB`…@NÜ£­Ý@NöiW¶zÁ@OBÑM’ë@O)™¦%Èz@OBjî±kz@OZ³½ö`@Orq"A<@O‰ '_ä«@O =ÕMx @O¶G3ÊOÓ@O˹JeZñ@Oà‘" Ú@OôËÆu;‹@P3#Çæ3@P ®Ý‹`«@Pן°B@P«ûvq]@P(*‹,³Ë@P0QìõÆ‘@P8 Æ¿j@P?•Æ’`>@PF¯£‚7(@PMmŸ;@PSÍè@PYÎ+<Ø–@P_oyM:’@Pd¯à„Sç@PiŽaîÄí@Pn Ð@Pr"è0Ø@PuÕ{`j$@Py#²iÞã@P| €3o@P~ÒV @P€¨¢gˆi@P‚\{y@Pƒ§œ è@P„‹'´8@P…wR—@P…qWœq@P„ÄÔÉþ@P„j~Ö‹@P‚࢞è@PRöæ'@P]¹7Á×@P}PO,@Pz>7^P@PwýŽ•ú@Ps†EzbV@Po’ÄŒ¹@Pk;BRMj@Pf€—Å‚ë@Pac®ÇJ@P[åê™-@PVbéá@POÉ‚U~A@PI-íU>Ä@PB5…-s@P:á„îý•@P332¢‰@P++Û.H¯@P"Ì×°@P†FHH@P LJ$ @P¯”Ê=x@OûÿŸWÚ@Oçþᢂj@OÓ_Þ™DK@O¾%‰(ûÝ@O¨R׋P@O‘êÁÚ¿@Ozð@µT@OcfKù@OKOÙÿ»@O2¯ÜSËú@O‰BùÈ‹@NÿÞ÷$I®@Nå³Üx¸Ö@NË ÏÎe·@N¯æ¦n¤¯@N”J-f«µ@Nx8(êŽu@N[³SÈ­à@N>¾^ìäª@N![ðò³d@Nޥũ@MåYOB­@Mƽ°1z3@M§¿?´@Mˆ_|Ô@@Mh¡x¤P@MH‡O­§ @M(L¡ðä@MG®)äÓ@Læ&¦ä“@LIJ]l"@L¢ììc©Þ@L€Øb„\ú@MÉŠébXÛ@Mç87ñ{@N{M…ÔÌ@N!Qžè¬¸@N=¸–×ý@NY­–_ÕÎ@Nu-õNào@N7§Š@NªÆ,Ú@NÄØ;ùsÌ@NÞjß'j@N÷{ ˆæ@O,oÌ@O( *‹ÆŸ@O?>Óg•@OVkŠ„D@OlÅ-30=@O‚‹Eîóô@O—ºôuç@O¬QZx§@OÀKœ÷E@OÓ¦å¨àw@Oæ`doS¢@OøuPä@PñuõÅ„@P S@«ÇÏ@P^´Ê-,@P…¯t¥@P$mnÁQ¯@P+n4N@P2¤oÛ@P8\—î¸@P>Gó"ZF@PCÔ¦Õj@PI±-(@PMÎ' ‹@PR9 !õ@PVAœèø@PYçËU’@P](½C3@P`ô‘í£@Pb~+[8@Pdå*Òi@Pf=¸ìûÿ@Pg„QR3k@Phdm"ôc@PhÝß^¦@Phð RR@Phœ{sÀ@Pgá±OßV@PfÀXU„ò@Pe8©ïQ9@PcJô&yx@P`÷˜ékÑ@P^? ­@P[!Úü.%@PW ›õòÙ@PS»ý¼®—@POt¾Ö@PJË®}Öð@PEÁ«í\Ø@P@W¥—ÂO@P:Ž˜]ÝÔ@P4gŽºq@P-ãŸèw @P'ïûæ@Pɪ-îÐ@P6 ŸVü@PJNÐAq@Pí/@OþßrSK‚@OíL)@OÚ‰~Š&@OÇhT)Ä@O³§^@OŸI¾æê@OŠQY¨Hò@OtÁ ê|@O^P~Ä‘@OGçKõ2@O0¢s#µë@OÑ¥‡³¯@OwÀFD@Nç—'.Q@NÎ4¡î±@N´Oíü“Ô@N™íü|&Þ@N¦9g@Nc»¶“"I@NGðÒPb,@N+²ÿR›}@Nßö~^@Mñé n@MÔb‡9Ï@M¶r~ þ@M˜Àš”±@MycLŸÜ¶@MZH†c)@M:ÎÇ Mç@Mø\€+@Lúlj=æ%@LÚ>„ZÄ@L¹_ytE@L˜,ˆ²q@Lv§ÆÊÞ@LTÓ=N%@Mš?¤äcA@M·§ÂZªû@MÔ¥fŽœ@Mñ6Œw€@N W<ÖÓ@N)W!ˆE@ND@Ç6ý@N_ëIÝ[@NyMäxx@N“¦.¥@N¬fÖæ†Q@NÅ1ñ¶ ó@NÝx67a¬@Nõ6à,UÓ@O k(S!Ž@O#E^½@O9)lü¢Ø@ON­Ôô³X@Ocœ´LðU@OwóD†òR@O‹®ÂéSo@OžÌqØä2@O±Iš@BŠ@OÃ#âc@OÔW¤ˆj@OäãF52@OôÃä²Å@Pû4¶²@P =­çì@P%}L`Ö@P³™€?.@PæL'–Ÿ@P"¼…a׉@P(5A`Œ@P-O‰4ñ@P2 s“?)@P6e%›Ä:@P:^Ó‹M@P=öÁn©€@PA,CÆ´@PCþÀû=@PFm­ P`@PHx•òv@PJ‚v‡@PK`Ö@7\@PL=Ÿ†ð]@PLµDЧ|@PLÇ®d3@PLtØ„Xÿ@PK¼ÓýN'@PJŸÄ-EÛ@PIà?|C@PG7r¤ò@PDìØÉ¿µ@PB>‚Ælå@P?,òîý³@P;¸½_¡º@P7â‡ua$@P3«:î@P/Ãô¨@P*O‰ùJ@P$ÄÑ®b_@P{@³Ô@PÿKxˆH@P’Mê”@P Ê™¹3)@P©PÁÓ‚@Oú_=‘ Â@Oê½qEëç@OÚo¶Çć@OÉx—¢0@O·Ú¨NÌA@O¥˜ŒK¿L@O’´îÜ !@O2„Z3k@Ok,5ô@OV\;Wó@OA ã#N×@O++ÇÆ{q@O¸³* Ž@Ný·o·ÖÑ@Næ*Ç;>Ã@NÎÒ5B@Nµzdïã@Nœ\2k @N‚½§©oÛ@Nh¡|Êù^@NN cñn@N2û’Ç–@NvÛŸù@Mû~ WP@Mß©\i©@MÂ?\¿aü@M¤ý¯FÐ4@M‡Sd£þ@MiB ±Iû@MJÌä¨èˆ@M+ös@M ¿¸´u@Lí,FiiÜ@LÍ=çÉ•a@L¬öÌ32@LŒYê^@LkfåˆÀ@LJ"A´ù•@L(1¶Í@Mj¾0ƒžµ@M‡â~³X@M¤›^¥€ @MÀç{öž€@MÜÃüËÓ¤@Mø.^=ýr@N$•6ò@N-¢Å¼ý@NG§6úû@Na/i*þÒ@Nz8‚Åxx@N’¿Ú_}@NªÂÂ{ŽÉ@NÂ>Š[xË@NÙ0~âk³@Nï•ë†þ@OlRx@O°Yó{f@O/_ôÝW2@OCxƒ‰”@P(á´†R@P&<¨ùá?@P#6\Ô±&@PÎÆÌ #@P„ðm@PÞERtL@PVÅmñ @PpÑŠu„@P -D@PâÞÿ@Oû"$œ@OîtŸi3Þ@OáÌ0å]@OÓÄÌ:@OÄ@ÆË~“@O´Ó&9ÿ@O¤»D?%ë@O“û‘€:î@O‚–‹Æ4„@Op޼×V@O]æ·E§u@OJ¡hÖ@O6Àƒ‡ÊÈ@O"G¢:Á@O 9"»AM@N÷—¶¨ò¶@NáfÒµË@Nʦéè_@N³\ñ96A@N›ŠÞôì@Nƒ3a(ïñ@NjY)m®á@NPþáÏ#|@N7'0¸˜#@NÔ·I¡œ@N ªÅ8@MæÉÑpt}@Mˇ òG@M®ò·I©Ã@M’`ßÜv³@MucuõW@MWüåæø¦@M:/’Ô‘@MýÖkmj@Lýj¦£+@LÞvWœOð@L¿%SÒž@LŸxq¤m¦@LrŽØ@L_‰ë¢æ@L>cwÞ™½@L^`RÏ´@KüA:§Q@M;z3¹`@MWé:4¦e@Mt_W[®@MgÁŸ0@M¬´¶UÂ@MÇ'„5Zø@MáÙ³2þ=@Mü¾²Ÿ`@NÖ—Ý9@N/A=ÀÅ@NGá–Cü@N`&„u‡@NwçqûI@N!¾J­Ø@N¥ÒÌ^â@N»÷úéú@NÑŽ©–¡w@Næ”94 À@Nû ˉ@OáŠÂaå@O"$ U²@O4Ë7]?c@OFÔN„ÓS@OX<ã¬þ@Oi€¿ì@Oy"ºÊŒ@Oˆ›3h6í@O—iš3ô¿@O¥‹®=æ»@O²ÿ?‚íð@O¿Â0dΚ@OËÒw Î@O×.B¼F@OáÓKE®@OëÀ4øXH@Oôó0Ú`=@Oýj­ip@P’š°[O@P¸\@P /Þ¨Ö@P íz@PJYçy`@PF\ú{»@PàÊÇÈ€@PY=@PïÏŒÏ@Pdàªl@Puè2¡§@P%rΉÅ@Pr´_qõ@P]Íq>½@PæðS”$@P`í Š@P Ôt@P 9‘Z´!@P>.‡Î3@PâÓ]´è@P(ߎ@Oø@\À÷@Oï.H6ÿû@Oå„Ìîàã@OÛ"qX#@OÐð÷+`@OÄ:!ÛöR@O··ð4@Oª„]»”@Oœ¡t©Ç@OŽ„·Žù@O~Ö¢wä/@Onó%¦× @O^ig¼³Û@OM;ÏEë/@O;lÎu/¸@O(þá¼2á@OôŽlbV@OPa`äæ@Nîí²ï‘@NÙDËyg@NÃâ–”ž@N­ðí†ß@N—rpZE;@N€i¿”\æ@NhÙ{7Ê@NPÄAÔ,@N8,¯¤R@N]º¿B@N€á<]@MëqÊ©>g@MÐê¥3%æ@Mµíö!‰i@Mš~P@O|F>YS,@OˆÞpÚ,É@O”Åü˜4@OŸû #/@Oª{³¸)t@O´Faƒ?&@O½Yoòõ@Oų^dÇî@OÍRÇ@…É@OÔ6a ß&@OÚ\ÿm_@OßÅ”42×@Oäo0#9›@OèYÂÏ—@Oë‚` Öú@Oíê·§Ï@O0Àæ@OðvÄîGZ@OðšÀ˜L@Oïûakj¼@Oîšêú9·@Oìxã§ì]@Oé•«¨ì¸@OåñÄØÞ@OáÒGC¨@OÜj—³ùü@OÖˆøáæ×@OÏéøÛÔ˜@OÈŽ¹æã@OÀxx£—å@O·¨’ð5×@O® ~ð¸3@O£áÍÛÚß@O˜î)ý}î@OGUvS×@O€ï(ðì™@Osç’N,@Of2“K3@OWÒ@"»ó@OHȾ+ν@O9Bw¸[@O(Ãp÷É@OËx|Õx@O3Ö¡.ì@Nóþ‘/æ†@Ná.yG @NÍÄà†‰Ä@N¹ÅiÝ @N¥26N¨¿@N ÌÍjw@NzZ·Tè«@NdØ6º@NMR¹?j§@N6êq‡2@N.¡k‚‰@NØhd‰‰@MíÆÿˆL@MÓ°A‰ì @M¹ãXGV@MŸž†Ë0õ@M„äC\†g@Mi¶þin)@MN"¡@M2 l„¯@M•(¥-”@Lø³¼°ä@LÛk%²²@L½½²u@LŸ­2{H‚@L<_\S @Lbm1´–ª@LCAÊoW´@L#¼A>r@LÞ¤wÎ@Kãªù'a7@KÃ#:´[b@K¢I[%FÁ@LÛ—ß¾é@L÷dêøkc@MW&)—@M.ÛüPP‘@MIñ|†ý@Md”#YCã@M~¹ŸsP@M˜zv“–8@M±¸ï޵Õ@MÊ{µ’å!@MâÀUë“@Mú„ZÙãƒ@NÅLM8Û@N(€°¨í@N>´ ë@NT\èÐ&É@NixÉ9$@N~7Ÿ²†@N‘ÿ¿Ù§W@N¥eñÊžô@N¸5b{BE@NÊk­:KŸ@NÜtÆð‘@NídƒÈø@Ný`1±;Æ@O œ®\@O0r?M@O*ŸŒÕÚ¶@O8eÕàç<@OEGÄ@OQïëÅ+"@O]¯âg@Oh¿\e@Os¢g^r@O|Æ| º@O…º"Ð&”@O÷b„Ã@O•|zÅ–®@OœH/ÐZx@O¢Yaë9´@O§¯H—t@O¬HOÖ‘V@O°$_øÁh@O³B—*äA@Oµ¢m‹/.@O·C{KM2@O¸%y(@O¸H@ÔO@O·«ÊA*&@O¶P2œÌ@O´5´Ù@O±\¬Pxp@O­Å•ø m@O©q §®=@O¤_μ™“@Ož’³I»m@O˜ ³cMe@OÈäW¥ù@OˆÎwÒ£@O€ºíÓ@Ovµ/ ¦@Ol™w$9@OaÊ*âµ@OVJ/ž¦¡@OJÛ²zc@O=> Â,…@O/µ§ÉŠõ@O!ƒµÒÖ¡@OªDªv@O+t‘s—@Nó sðaG@NâF~ ?(@NÐäÙ¾È@N¾æØ3ˆŽ@N¬NÓªøw@N™.D¹Ê@N…ZPÑý{@Nq©°ó·@N\«²U@NF¤Í¿E@N0£†A@^@NQPÖÈ@N¨ê@Mët#.R@MÓ]â™ ¼@MºÈ´¬H˜@M¡¶ðAœ@Mˆ+Âbü@Mn'a|ä @MS®k Ò@M8„±ª@@Mf bŠ@M›T`Çi@Låd°\ly@LÈÄgšÃ¢@L«¼»WL¼@LŽOåAY@Lp€‚NŸ@LROxéíZ@L3À-Pç~@LÔL š@Kõå ƒ<@KÕîþä­W@Kµù—›Š@K•¯¤Ò@Ku-Ç@Lª¿âòYð@M—óbh—@M¯ù£@MÇ~tåü@MÞS†>D@Môÿ5ª¨T@N õ²·ÀL@N bb¢Êû@N5BÞÒ©Î@NI”à £@N]U®kÍ®@NpƒDb«<@Nƒ-Æ}Ü@N•ã«_@N¦€¿š€¡@N·IÞƒ%@NÇt@HK@NÖý¸î@Nåä)Ö׉@Nô%- M@O¿¼$û@O°çdä @O÷!†í¿@O&›±™@O1{˜*i@O;¶q´Á@OE?–ÞTO@ON\«à@OV6óAð?@O]¢®"@OdWÒâ×@OjSkÙHÁ@Oo–¿¶#È@Ot #ëA@OwîÚ4Qû@O{B=Ê@O}YÙ‡Æ@O~õ= Ü@OÔ(KÊ–@Oöv3Ý¢@O\! ±@O~B†X…@O{ò¢€@Oy"ìƒæ@Ou˜D*Ð!@OqR°µ®@OlRã²"Î@Of™¯ÿ@O`(µýf@OXþå©Z@OQ}ò”û@OH‹ 4r@O?Båÿ²Í@O5H€*P @O*blX@OC+ô?@O;‘PÀ@OˆZSÆÚ@Nù+bÌ©Ê@Në&—e“‡@NÜ{õa±J@NÍ-‰1kg@N½=m7þ @N¬­È’t¨@N›€Íádc@N‰¸º©ø@NwWÓHV•@Nd`g‰Ý†@NPÔËÌyH@N<·ZǤ²@N( sêhã@NÐzV'@Mý Óãk@Mæ¾è1:e@MÏì¿;@M¸•ãøs@M ¾™ès°@Mˆhªn™@Mo–xŒ:Æ@MVJe7¾É@M<†ÍÐc®@M"N ‰úw@M¢rà­Ú@Lì†S}@LÐûõÄ?*@Lµž^G@L˜¥‰à¢@L{Ýîm¯@L^°ûy@LA ×(µr@L#/¢Ã&ð@LßuÊ\|@Kæ2`# ¬@KÇ*ivóZ@K§É‘ $v@KˆÍ´:8@Kh ©¿U@KG¥6Š—@LzJÜò]@L–(–IAé@L±›—‰Ì@LÌ ?ª @Lç5¾n9•@MYZ~¶Å@MΕä¶@M4AÑ 5m@MMT‰×@MeGG ÏA@M}i*@M”W.àd@M«4Çßê@MÁ^ÓàAC@M׳ø`à@MìK~˜©™@NñßÐZ@N ƒP@N(“xl@N;‰cEve@NMë¿ç•@N_µèaœ;@Npç´T^@N~GˆO@N‘w~Ð&@@N ÑB6º@N¯‰…Aç@N½žIoÙ‚@NË žÁü@N×Õ¤yƒœ@NãôŠÊ; @Nïh“ÑÊ…@Nú0¼U¶@OIvÞ &@O ³8Æ1{@OkïI«@OrF¡J@O%ź…Ö@O,ch @O2K9êŠM@O7|¾^ƒ @O;ö¼NÄ€@O?¸}UŠ‹@OBÁg©qö@OEþ•:3@OF¦âÙ‡@OG‚Ò÷ëß@OG¤«f¶œ@OG f­\@OEºg‹«@OC®41ë@O@èu‡´à@O=iÝj“^@O92Í“@O4Cð³æm@O.žyÔP@O(BnÒ@O!0ïŽú@OkÇ*@OóÉžy~@OÊBjó@Nýð”F&¢@Nóh8¨Yw@Nè2¾£/Ì@NÜQÉÖ4G@NÏÇV Q@N”^Ž5@N´»ŒCÚ@N¦>„¯Œ6@N—AÕkâ@N‡_ÊÛ€@Nw3 %³@Nf›rC8@NTu+ê0@NBJÍ[ö@N/‰™ö^J@N5ôAˆJ@NQn‚k¸@MóÞU€¬@MÞÞùý)¦@MÉU¯Á"ž@M³D̵Æ5@Mœ®¨n@M…•™M‰ @Mmû÷Éÿ|@MUä¡×¨@M=PS-xl@M$BöN\/@M ¾QÐ5t@LðİԋÀ@LÖXZH©B@L»{e¦Ç@L 0:Z’@L„y‘>æ @LhXÄñ˜e@LKÐV|Ô@L.âje¥@L‘B¬@KóÞˆ{Â@KÕ̸ Ï@K·]´Zë·@K˜“}¥ú@Kyp ±Û&@KYõJDE@K:%%¦Š@K{»Äþ@LIªè2‚@LeIe­³c@L€}†*!º@L›DI©sú@Lµ›90 @LÏ€ùW@LèòyX @MíÅF@Mp“†m@M2xÀg#‚@MJèôå @MaÑFK@Mwš1¹SÒ@M ÃŒn@M£!?Çß@M¸`ò!@M̆㳣Ë@Màg‡²Ê]@Mó¹xÉX@NyF^ù @N¥÷„Q@N*<øÈõž@N;<&Óª•@NK¡gê3@N[j¨êE<@Nj•戟Ï@Ny!&9Ç'@N‡ {`—@N”P’åc@N ïû¶Ö6@N¬è™1H@N¸82j|ä@NÂÝ,ÿœÛ@NÌÖ©)Õ@NÖ!=΋D@NÞ½„ba§@N橎ÑÏž@Níä-è5?@NôlJ¥ú2@Nú@ç Ê@NÿaÅÜÔ@OÌ'ït@OSÖ'@O €!_@O Çàf@OXn Rë@O1yC„û@ORߥ®@O¼›óv%@O nÅŶ@O i‘z¤@O­P y(@O:nÓú@Ow7Úê@Nü3@Ê6@NöŸôþ»@NðY–z2@Né_1fáœ@Ná³‹Žƒ@NÙW8ŒXk@NÐKvHÜ@NÆ‘šŒùP@N¼+j“@N±TòÂ@N¥]þàÒ@N˜ú³×’ò@N‹ñ,TFž@N~C1œ‚ü@Noòœ¨ž@NaU ù@NQqOÜyE@NADŽšrÐ@N0}2«@NpHn@N &”á™g@Mú›ÄØ3@Mç~Ôݽ-@MÓÑúœVø@M¿—pæ’¯@MªÑvÇ/¯@M•‚N™z@M¬=(.@MiQˆÛ\@MRtxæ/’@M;T‰2ˆ@M#@N¼rÿŽ^@NÂ4Œxî.@NÇCô-¦’@NË tÐ,¶@NÏIfm@NÒ>;vY@NÔ~(¯·@NÖ ßáü@NÖàcü@N×ûש@NÖlÁ£Öæ@NÕ#=þ)Ÿ@NÓ$ºHta@NÐq„5`!@NÍ ²¸è@NÈî¿›šZ@NÄ SW0o@N¾Ÿxd³Ž@N¸mÕdý@N±‰×µló@N©÷d”—@N¡µ•ßìÍ@N˜ÆÉý†G@N+ä›o@N„æBÃ7!@Ny÷UÃFä@Nn`¢?Y%@Nb#¿9l€@NUBU€æ@NG¾’rI@N9˜ÝÎ;þ@N*Ôo3çê@Nr´wa @N u‹Y@Múß%™Q@Mé±Qûé¹@M×î1@Mv© 2.@Ma’ÕÜL@MKöh=SÁ@M5ÕùÐ_@M3ÁæG(@Mø9¯s@LðrÔ7°B@LØXŒVØï@L¿ÅUu:@L¦»b@¶@L<â¤s@LsLI5@LXêíEë@L>Ä®ö@L"àª#O…@L;¸v"w@Kë/HMB@Kμ ‡0@K±æ”ôA@K”®ã¼<@KwŒƒ“Z@KY"„çÆ@K:Ѽo½Ž@K'•¢.@Jý$ƒ›¨ö@JÝËÎq+¢@J¾Θ³‹@KçëpÝ7@L[¥ß@LÊyÞÔÆ@L8d×@LQõ {è@Lka;c¾Û@L„Yî\ 8@LœÜú%ŠÖ@L´è:hÑT@LÌyˆÐM@L㎽™-@Lú%°/™Â@M<7Ïô™@M%Ð,3Q‹@M:ßfCL¬@MOgÀÖQG@Mcgsêå@MvÛQ Ö„@M‰ÂM2yø@Mœø)V"@M­àB‘÷G@M¿#ëÔï@Mϰ›•€„@Mß¶±½p@Mï#xV o@Mýõ 9-@N )•OK@N¿I)³Q@N&´ja@N3J]@N>¶J"ì4@NI¿ÛJªü@NT"€ï5ó@N]ÜЙP@Nfís"o@NoS%’‰£@Nw ¹ð‘q@N~ xG@N„w>6Z@NŠ&Aø¯@N%P­+@N“s°.J@N—¾ïñ*@N™ûõ=$·@Nœ4äÐç@N»9†‘@NžŽ¹‡éß@Nž¯EtJ…@NžØvYx@Nœ×ˆIH)@Nšß…(‚¬@N˜5¬¦6@N”ت•yâ@NʶDö@NŒ Õ‘ý@N†œ¹ä@N€~*¡GÜ@Ny± S34@Nr6Wfð@NjòZ$@Na<€¡@NW¿¿HB’@NMš)hz•@NBÍ"ss@N7ZhWž@N+B©¹U@NˆZ.§@N,ÙXòÚ@N1ß¶ k@Mô™3,Än@Måd¦×–”@MÕ–â@MÅ/vŽf@M´2±=S™@M¢¡Çwáã@M~¾ýQé@M}ˤÕ!5@MjŠŒf(D@MV½Ž“p@MBfÈßT@M-ˆ\•ss@M$mûä@M=#Œ)@LëÔ¥3IC@LÔíœ!Õ@L½ˆ¯_P@L¥©ˆþß@LQϹ@Ltƒ¦±Ô@L[A2Ó @LAŒ“W—+@L'gäÙúï@L Õ@+á!@KñÖ¹ëQ¾@KÖnbÐe@KºžCßC«@Kžhdúh@KÎŰ@KdÓ`job@KGx){¬÷@K)¿êô@K ©ø@@ @Jí:ÆY´@JÎsSBF6@J¯Ura÷@JâîæÇ—@K¶Ï¿ ”@KѹH Ze@Kì7ÂõÕ:@LI'à@Lëjìåˆ@L9|·Ç @LQÚJÂÐÀ@Lj"¿í,+@LóÄñ™@L™K@ìåm@L°'ìs‹@LÆ…5„ÍP@LÜcyp:þ@Lñ¿Ì5I¸@M˜Õ ¸@Mê@w@M.´9Yí@MAóñ0ƒ-@MT§]TÈ9@MfÌxeh\@MxaC'ª@M‰cÅc§ê@M™Òƾ¶@M©ª7È c@M¸êb‘½Ý@MÇ»ìK÷@MÕ›|+{@Mãè;—@Mï×Qò¨@Mü3ÖV@N°¥„æ@Nx•/v@N»XÀ·Ç@N&Wž,Ù@N/LþV2@N7—˜Lú@N?8ó{º>@NF/øJ/@NLy"êùö@NRÛB@NWEGF(@N[Eæ-`Ž@N^×e†â@Na¹@³A"@Ncë Ó¥@Nel|@Nf=SàT~@Nf]wþö@NeÌá@Nd‹¦½Jº@Nb™ö]Ô @N_ø£Ã@N\¦kX’H@NX¥k'¬c@NSõ©C @NN—ÐO@NHŒ¡f  @NAÔö£:º@N:q¿}üt@N2dµø9@N)¬ØU˦@N MrûÖf@NG@N › “~@NJÛ½û@MôWâð±q@Mçõ0M @MÚì†')@M̾1¤9 @M¾P:ù_5@M¯GËÄ h@MŸ¦³$xF@MnË/-•@M~¡ø¶@MmB&Õ[@M[QM-Š@MHÑg¦8Ô@M5Äy¨h@M",ŒqJ@M ¬R€@Lùcì<¯@Lä7`”Ý@LΈ  ˆ°@L¸XEfq@L¡©èõ8W@LŠ%½Ž@LrÚîU\@LZ¼ÒàQ@LB)t}Ü…@L)"¿.Ð@L¨»%€â@Kõ¿„CÛ@KÛhyIV˜@KÀ¥£žÿT@K¥y}ÉÓ@K‰ä¨—‰@KmêÂnÿ@KQŒ„¬K|@K4̨”‰Ê@K¬× ­ö@Jú.õ¿Ä@JÜTä;¦e@J¾ {Êc&@JŸ“C@†@J€¯êëY@JawTWt@K…Ž;‡=Ð@K <ë˜ ¯@Kº€¦°n@KÔWo/cí@Kí¿E ²@L¶$V1„@L:’ÍÀ@L7Hã’ @LNà¯%½Å@Leÿ_,7K@L|¢æ”¸Ž@L’É8µ~²@L¨pIXpÜ@L½– \¤Î@LÒ8{_r@LæUŒj’_@Lùë<®@M ÷Œ9Ê@MxÂØ)@M1l!k­@MBÐ’@MS£·¤ÒC@Mcãâõ†¸@Ms+˜Ã¯@M‚£Ã@ýí@M‘æÌk@MŸÛÁìÛ@M¬G÷ú¼[@M¸ð›»?2@MÄú5öÈ@@MÐcDG×@MÛ*TßB6@MåN/h¥@MîÍæÌG@M÷¦¤ :@MÿØ ò9@NaÏþ;È@NB^J3@NxÈRs0@N5(oî@Nãáÿ¤Æ@N#"¯(:@N&b$|è@N)v"ÇéÜ@N+ þÑ™•@N-¨Žù`@N-ëê—êá@N. §ór@N-|Ü+¨X@N,?›PÊ#@N*TëkR@N'º„Ý× @N$sQ4Úa@N ~ëè5ÿ@NÝá‹1@NÕí¶@N˜ƒ®›Ò@N õ»¿¿]@N©dÜ­­@Mú´zô­@Mò‰ý@MèÕDjÐ@MÞíRð0@MÔa…_ q@MÉ36ù·@M½cÔI.m@M°ôÙÜÖ@M£çÓrd”@M–>[®Í@M‡úU½P@My¿<(Ä@Mi¨“¯(@MYÓòëC@MHÿàà $@M7Ðò^_@M&Rökš@M‹gD@Mè°Ù@Lí„»!%Z@LÙ˜ªÍjÿ@LÅ&ƒR©@L°0E)@Lš·þT^œ@L„¿·—»Ì@LnI|×ó@LWWZ¥Ê2@L?ë]¥ @L(‘óE@L®›Ïõ@Köà¹×@KÝ¡¼­qü@KÃó @MÓ¥3 @M-æ¹Cç,@M=f$ˆÅI@MLP'òˆe@MZ£qö½@Mh].)–@Mu|éCŒ×@M‚®ÆÙt@Mæûkj@M™.ZiIÅ@M£ÕfJ p@M­Úɱ! @M·=@c~@M¿û–§ˆÝ@MȬÀ¥@MχtÔ».@MÖRôúäm@MÜvGЉ:@Máð›¯ç@MæÁ5ìPZ@Mêçp—ñ¹@Mîb¼Dªà@Mñ2  Šh@MóVºD¦i@Môοö:@Mõš}×¶¦@Mõ¹Ø •@Mõ,ÊJ…Ó@MóógÝu@Mò Û˜uM@Mï|g½Ú@Mì?eË9 @MèWFG{@MãÄp{«@MÞ‡áåë^@MØ¡îA»=@MÒ~£îÉ@MÊÝq1Ç´@Mø‰þ@Mº~[( @M±Wr˪)@M§+òW@M Ä>× @M’‹-N@M†fáh@Mz57{@Mm5³Ÿg@M_²ÜWG@MQ—UA„[@MBä ú@M3šÌÃð@M#½80Y™@MMão@@MLIq‘Ñ@L𼔞ɸ@Lޟܹ@LËøþl±@L¸Æûs<Í@L¥¬‚C@LÑ Þ@L|Ž«”@LfͽaX¤@LQ ”¸@L:Ìæám@L$dÐF-@L Þ}\ž‹@Kõ3/ź´@KÝzŠOê@KÄ~Zå8È@K«xÌQ6e@K’È·–@Kx!DΘ€@K]Ó6Ň@KCŒ¦7@K'ü3C/,@K wÖu<@JðŽ¾—M@JÔC 5Ñ@J·—݈…Ÿ@JšŽZÚ d@J}(Sï @J_g’ýF€@JAMÜ€.e@J"ÜïÞe@JƒNX¿@K"Ãn!@K<ÙI4@KVªúi@KpT\“a@K‰jÓ…@K¡‰GïI@K¹œ&©É²@KÑ:²Â¶@Kèbú?áˆ@Kÿ ƒwo@LHðÐû@L+ºÓØ`@L@>w9n0@LTú6@G@Li4 Y_J@L|êÍ Ã@LJb±@L¢Âì·æ@L´â°‹ì@LÆuÜ·rš@L×|€ó°ë@Lçô1M|@L÷Û*‹.Â@M/²-×@MðÍÞ@M$±½ýš@M1­æý­R@M>¨&pgñ@MKì’»@MVËÃ?±!@MaòB|Òé@Mlz6¦ë@Mvaæ à@M¨‡ÔÆ@MˆLθ°¯@MM¤wñÐ@M—ªAvY@MžaDÅQ@M¤q¸D_i@M©Ûdß*@M®OG€@M²¶Ú?’Ä@M¶'zõ@M¸î½Kõ@M» B€¿@M¼Ã2|ž@M½I Æe@M½hlÒ™@M¼Ü¬¶@M»§ +“@M¹ÇVô–œ@M·=ÆCÜ@M´ ²/‰v@M°.‡€@M«©Æò"À@M¦} ¸€Š@M ¨üGŽ–@Mš.`R"9@M“ Ôü2@M‹Hè’’–@M‚ßó„T@MyÔ'1IC@L5*nö@Kð±Nf>ô@KÙ´…½Û‰@KÂ@Ã.À@KªWøýaC@K‘üy„r@Ky/„´(@K_òÒFA@KFIEûôï@K,4V÷r@Kµèe…@JöÏß^¦{@JÛ„Æ6j@J¿ÔrPêÖ@J£Â¿`@F@J‡PÒÁ@Jj€yoì@JMS{b7]@J/Ë›U-¬@Jê–¡GÛ@Ió²%•@IÕ#øÅ“e@Jðñ/®z@K ô[v/ó@K$ŒýŸx§@K=¹8q¦C@KVw+À…Í@KnÄõ=±/@K† °àÈÖ@KžyU×@K´úhqãæ@KËt—­ºc@Káu ¦ÖÛ@Köú¦oó@L ª.‚0@L ‰ãŒ¼°@L4és% @LHÞ–=(@L[éPlh@LmŒ4JaÀ@L{ï(7@LáO:+U@L¡º2æ)@L²ôÞÛ×@LÁÁÇàAÇ@LÐì\l¨<@Lß„ ká@Lí‡F[?ó@LúôsÉ& @MÊ[r@M±jÚY@M¨ádšm@M*¯H‚‘Q@M5™„Úö@M>ã–eL±@MHD×@MP™ëÛ¨p@MXƒ=Ì@M_É¢‘–€@Mfl›À¿¨@Mlk0Ýö@MqÄ §@Mvx;}Ö@Mz…ihŸ³@M}ë¤ßJ6@M€ª}âëÃ@M‚Á™¸¤f@M„0³!ð„@M„÷šˆq´@M…6ý@M„Œã¡‚@MƒZ¾ïŠ@M€‡[Û¢@M~þ¦ï8@M{Õ>ò‹õ@Mxº&›7@Ms•@MnpaûÌ?@Mh­ÇcÆß@MbFöì@M[;YðQ†@MS6¥ó @MK= pè@MBKÙõò@M8º½Ü,o@M.ŠÝà£@M#½rS´î@MSÃÑ@M O&y­Á@Lÿ±cAu@LòzŸL@Lä­ò Ü@LÖLÓÝ‚@LÇV·”±@L·Ï†48›@L§¸&/'@L—IÚ§Ž@L…ß«¦Ï @Lt" asÊ@LaÛ7|ûG@LO øYØ@L;¹#“Ìw@L'á‘SJ¿@Lˆ£Xß@Kþ®§ÌO@KéW³¿á@KÓƒ?AÍ@K½5Ì"Ì@K¦n{†Àh@K1VúÀÝ@KwŽƒ/±@K_[Ða@KFŧoRš@K-ÁP\@KOã–i9@Jús?¹åù@Jà-@¤¨²@JÅ¿cŸ@Jªl|zò@JŽõ†iY0@Jsn‰_W@JVãCJ@J:K6å@JV›|ÚÙ@Jü†ym@Iâ^Þ=é@IÄ]†‡ïP@I¦ '*@J¿#8fHn@JØî×[ %@JòPT—@K E-»Ç@K#Ì;¿ÖÌ@K;ãl¾†G@KSˆç¢áÑ@KjºÒU+…@KwR, k@K—¼ŒdZ@K­ˆ¦žV@KÂÙÇb O@K×®¥ÐŠ@Kì¾^ÍQ@KÿØëV|@L+ÌsÃÆ@L%ú•÷ÙÜ@L8C€Àt@LJÅÿ0*@L[<¬{@LkézíT@L| ‚–Ð@L‹›\l@Lšœ¤ÆÉ-@L© ‰i1+@L¶é<‹ò%@LÄ1R<}³@MBS'JÏ@ME¯@KÙ@MHeæU)©@MJvÁÿ«_@MKá•ÉÐ@ML¦$@NJ@MLÄd!ôW@MLEAlY@LÕ[zúz@LÈàœC§@L»Ï0]=@L®(CÇ|@LŸí¹Þ Å@L‘ ù» Ñ@LÕö´~@Lq×*Ù€@La]]m²‡@LPWÚÉÁ³@L>ÈW\ŠÅ@L,°Ž;Ü«@L@u×L@Lï4e•J@KóI5 ‹ö@Kß"jf@KÊ{›åöf@KµW©¬¼@KŸ¸™¬@K‰ž®>š'@Ks X'¸@K\ê‡Ô%@KDŠ@³€@K,œ3I®@K=„Ñ/@JûpWÙÂ@Jâ66W“3@JÈ‘äÆ0@J®‚µ¯,P@J” öî+(@Jy1Ÿ¿!Ð@J]òxÙ-Æ@JBQGFH@J&OÌ!œ6@J ïÄZéß@Ií2è~Ûˆ@IÐì„Ã@I²©œìÖ@I”àL g–@IvÀ÷¨ï@J4ðâ=Ñ@J¦É˾0)@J¿ô|ÉÍ»@Jس:Ib@Jñ8“°„@Kåªpä@K UÁ~ðM@K7R®›gB@KMÚ¢RÅ@KcëÍU*3@Ky„`ðx@KŽ¢¹‘@K£D?¾3@K·h8ÀÂ@KË ÑlïR@KÞ/ž"@KðÏhçi@Léxùp§@L}7’@L%ˆŽº¦Õ@L6 Ôd¿.@LEÿe“ì-@LUg§ @LdAîé?@Lr‰øˆ6n@L€@þÝóç@Ld£mûÍ@L™ó{ØâÑ@L¥ì)Ž™H@L±MZyÃ@L¼ɤ &@LÆD?ä9g@LÏ×”rÉ™@LØÎ­j@Lá( g@Lèäp@Lð€!¦@Lö|ê8@LüX*k@M’´gp@M*¾‚c?@M œ‚O@M rS)ÚN@M ú$Ù@M+½KèY@M’\SÙ@MT«†R@Mr‘…nò@Mì 0u@MÁ+.¿H@MòÏbI@M~þè|Ü@M h9~G-@M®$l¤ý@MQ4-[›@LþQð’÷a@Lø°ôxÀ2@Lòníh*g@L댛4>–@Lä Ï‹~³@LÛêm€Ù‚@LÓ,i F—@LÉÑÆƒ­e@L¿Ûš À@LµKx @Lª!?xæQ@Lž_ƒb A@L’ &jï@L…oàÀ@Lw—ضÃ.@LiƒÌ3íÔ@LZÞÆ•4@LKªN ô@L;çòi5`@L+™Kº‚„@L¿úQ¬ƒ@L ]¥¾›@K÷sü7¶Ó@Kå±òºß@KÒ€€tj@K¾œ&+ÚŒ@Kª¦e\Ún@K–2ÿ,­@K@Êí~®@KkÔ…a1”@KUïfçl@K?’ X Ø@K(¿rYä@Kyß¿€@JùÀš7¸"@Já—øB@JÉï*Ô¬@J¯ýK»¢@J–ŽØBCp@J|·]n*@JbxŸþ‘Ò@JGÔdý@J,Ìi64¦@Jbkûb¡@Iõ˜%K¿u@IÙoJ3Õ!@I¼é‹©y@I –XX`@I‚ÎrîÆ@Ie;£‡Â @IGRèZ·J@J['ai›¹@Jt†<ík¹@J{$ÿ–$@J¦Y ®@J¾ ÙÜØ@JÕÌŸÞb×@Jí*©°Ç@KÐôÉ ¼@K%9´‚C@K05@¶@KEi$„Œ@KZUD)½U@KnÅÕCŸš@K‚¹~Ê@K–-UÒ@K© Ò¥:Ò@K»‘Ü[ø@KÍ~Ãëu@KÞåß{µÍ@KïÅŠú„ˆ@L(¿èÁ@Lè".L@L'èV9@L-Ùôš00@L;üÉV„N@LIŽò…{{@LVf_=@Lbû¦"Ä@LnÓ~qx]@LzH:{¨@L„¿É4Wz@LŽÑÔ7†@L˜JKFä3@L¡(B^@L©jIVBÚ@L±ÞLÝ@L¸ú:Z^@L¾Í7OJ@LÄL—”B@LÉw«dcY@LÎl¦ a@LÑìQ›ˆX@LÕ4ãh@L×ۼΠ@LÙàx,Ý@LÛC0à@LÜ/à{@LÜ ¾M@z@LÛ›Á:¼\@LÚtGÚ>˜@Lتu°Å@LÖ>³~í@LÓ0¶'Æ@LÏpv¥É@LË1 øœÂ@LÆ@J²xÍ@LÀ¯ƒ ¤@Lºquʼn@L³°ÏÎ0@L¬DfLmb@L¤;\¼“@L›•¾ß„@L’UgM¼û@Lˆ{xX€@L~åûì{@Lrüý®ê¶@Lg[“ ÿ@L[$è’‚@LNZM1Ùò@L@ýžÃ[@L3¹´Ù¶@L$—ÐÁy@L„0*T[@Lë.n@KõÆ¥Øë¢@Kå£g‘@KÓâ˜ý7Ñ@KÂ&)q(€@K¯äü=h@K ¾š”@K‰Û"аË@KvÞG0}@KaÒ«¨`î@KMG˜‚é@K7Ùqˆ@K"&êæ¤P@K ýv¡HC@Jõ^ؤ}Ý@JÞLÕcö<@JÆÉ1fø¿@J®Õ°Ùè‰@J–t$æß@J}¦&‡—®@JdmŸºÿ@JJÌA’°¨@J0ÃÈ±Š°@JUï0&@Iû„lV³Œ@IàPôUß @IĽ8x@I¨Ê䧬n@IŒ{£°Õa@IoÑ“Ÿ0@IRÌê‘sÊ@I5p°ù@I¾ì´ý@J(ûˆû@JB%$úž-@JZåÇ$w@Js9|×s@J‹ É%nï@J¢™4þ @J¹¡Y®@JÐ6È,@JæWïŠx@Jü•}¢ç@K7»I'F@K%òªJ«@K:2­ ;¨@KMöñòÞ@Ka;)1)@KtG@9@K†CÃ¥âØ@K˜ûõ¥@K©?Rnú@K¹ô-Äò@KÊ ýrrÉ@KÙÄ6^ZŠ@KèÜUo¨^@K÷gßÈs&@Lecc7Y@LÓw±.^@L°¾8Vd@L+ûã0ž@L7³ž¥Ý@LBÖ²rx¢@LMcð²@LWZ4l@L`¸hâVÊ@Li}‡}lx@Lq¨—Y•8@Ly8¯0¬0@L€,õmKü@L†„ žÑ @LŒ>÷æ@L‘[SYðâ@L•ÙdM@@L™·Î,¨@LœöõmcŽ@LŸ–1ŸW_@L¡•4EÜe@L¢óÁÚs@L£±°g|ð@L£ÎêÀ@L£Klk?@L¢'E™(@L b˜Mcƒ@Lý™Œêô@Lšøÿrà@L—SØÆN@L“ÝJ|@LŽ-üö›@Lˆ¬(3`@L‚ 0’@L{Ò8MÙ@Ltz³<¨î@Ll‡åd Ê@Lcú²,§Þ@LZÔ ˜þ”@LQö"¸@LF¾€YÉ@L;ÑÈ~¿@L0OùÕë@L$:K‘ ä@L’ªÙ¾@L Xq%Ûª@KüŽîªqQ@Kî6á/ ˆ@KßQ·Z]¾@KÏàèå¼@K¿åõû¶M@K¯bf “(@KžWÊm‰@KŒÇ¶"R@Kz³Æ·+%@Kh^@KUßsé÷@KAq8/Ù¤@K-^Uw˜.@KÏè£êy@KÇ¥·B/@JîGBÛfÓ@JØPwãcæ@JÁäýÑä‹@J«Žd@J“¶ã¡có@J{÷·oxD@JcÊÃ+¨@JK1¿H¹S@J2.bñ¯O@JÂc±`B@Iþïu×@Iä·HŽty@IÊŒÇÀ"@I¯í¿×@I“ÀXa@Ix¦"ó¯@I[êE(È@I?u¶¦@I"§ ,ä+@I€ŒÓ]@Hèg±7@Iö²YP4@J§t4H0@J(3<Ï@J@S‹ÕÃÛ@JX,z7@JoLFÐp@J†!+ ëã@Jœ„)HäÄ@J²s’!‘@JÇí¶tkQ@JÜðéOë@Jñ{}Ä…c@K‹Êäu<@K ).ÉÞ@K,6ô‰ÐÚ@K>ÎŒ{~(@KPåT°Ôð@Kbyµˆsz@KsŠŸød@K„ýcïÆ@K”Ñ¡ïø@K£”†@K²…_ ‹ÿ@KÀë1yæ@KÎÄ)2@@KÜéØ2H@KèÊezÌ@Kôô€¬¤@LŒÏŽÏ@L ‘ÙŒ½@LxX'Ü@LÝ’^à@L)"PV @L1Ï©¢°@L9ãŽ,÷>@LA^¦_œ@LH?Šý3â@LN…yeQÔ@LT/¿/@LY=¹§HI@L]®×é£;@La‚™m£T@Ld¸-·1@LgP[·Q–@LiI³^›ì@Lj¤\h„`@Lk`/*ñ„@Lk}"ðõ@LjûÄ;@LiÚ%©¼@Lh~/ß3@Le¼J¿hë@Lb¿Ð‚5‹@L_%fyDS@LZíuL~@LVw U@LP¦÷X<@LJ™‘Jvñ@LCðò…ÈV@L<­×Ž·È@L4Ñ ÇS@L,[nêu@L#Mè)vå@L©r$ÒÐ@Lo6\@LŸã-$@Kù=Ælˆ@KíG›"®Å@KàÀì7F@KÓª9=P@KÆÒRS@K·Òß/¸@K©Y ùÐ@K™Ê!Ê@K‰÷¿ÖН@KyÏØøO@Kh½ÊÚPÌ@KWY;- ]@KEq±'È„@K3“¼¦@K 'z@K ¹&ÑLò@JøÕ»õ:@JäwnT& @JÏŸè4h@JºPÔZÏX@J¤‹ßÐõÕ@JŽR¸üI@Jw§+F@J`Š’*R`@JHþñب"@J1ÝÅ™@J¡ÍŠQ@IÿÒÄv2@I暺MH@IÌüŸ†¡k@I²ùmÄOz@I˜’Ë>1@I}Ê[Ï4V@Ib¡À€¼Û@IG—NHµ@I+6zí0È@I÷˜t@Hò]ÁànÝ@HÕlH~_—@H¸$"+œ@IÄL¿oòÚ@Iݘ%@Iõf*8H@J Se>¥@J$ÔÁ¤ä@J;æ«“¹Ž@JR‰kb¨q@Jhº¶6«@J~x楇@J“ÂXîo@J¨•gq,!@J¼ðsY.@JÐÑܰ¡w@Jä8zè@J÷!YZè\@K Œ>˜"@Kw#Ýç@K,à~S $@K=ÆÆ)Eƒ@KN(yì+@K^‚w”@KmX?ºpú@K|#pØÈz@KŠdM(1:@K˜x‰U@K¥A ³ó@K±ÛzOöÔ@K½åÈp9«@KÉ_V2Í*@KÔFúÁíG@KÞ›™*ç­@Kè\ ã+h@Kñ‡ŽIº™@Kúë$w@LOÄ$@L àøÕ@LOÒð"ñ@L„kmœ‘@Lýüß@L!êúñ|@L%ƒ¨Û•M@L)Lº¦àÄ@L,yµ!Øg@L/ > '˜@L0þ Uß–@L2Tè=A@L3«vcv@L3+A<ƒ,@L2ª¦\öÌ@L1Œé9¡ò@L/Ò)Àó¨@L-z™\tà@L*†zÕÙÑ@L&ö"2¸D@L"Éô‡/@Lg¾æì@L _$?@L£[>"¯@L 4(B@LÝòÄ=1@Ký­½Â„@Kô¸×9h@KëÃ)B±;@Kâ8¾@HÞVvÈ0@HÁñÕ ¦@H¥4ê<Ù@Hˆ!<Èø@I‘Ë ›þ@IªYÛ?56@IÂ$¿ÞÄ@IÚ9Þ!eì@Iñˆk9uÓ@Ji/ué@JÚŽ5î@J4Úë'4‰@JJhª­–@J_‚2?F²@Jt%èØ!*@JˆR7`„@Jœ‰!¹@J¯>L6‚ø@JÁúò xŸ@JÔ9ïÈëÚ@Jåù¾çà¯@J÷8Ý~ƒ@KõÏg„@K/ŽÃ@K'ãW­QÌ@K76m@KE¶ðýrü@KSÓ“ÂEB@Kaeª·‚ò@Knkí VE@Kzåy³z@K†Ð¿Ïª@K’+r6@KœöPI±z@K§/‡}A@K°Öv°ƒ@K¹èëYõ/@KÂg/`Y@KÊOù¹j:@KÑ¢w}ÚI@KØ]äØ@KÞ‰˜`@Kä Á-…N@Kèþó]ÈŸ@KíW˜a\@Kñ8fê@Kô:kÑÐ$@KöÃÛpw|@Kø²@ªY‘@Kúe¥dè@Kú½%bŸA@KúÙkÑݤ@KúZ5ÜzR@Kù?‘fû@K÷‰I¦(@Kõ8‰@8@KòL•Ï«_@KîÆ%Ÿe@Kê¥eëЬ@KåêýC@Kà—[¤ 6@KÚ«bÈj@KÔ&Åœ™?@KÍ "É3X@KÅXê3÷O@K½éœ6Õ@K´3üÏnr@KªÃ =ä2@K ¿Š!„@K–) Áö@K‹~­@KK42ÿü@Ks¡âÏ=@Kf2Š"¹@KXÓ(?Ę@KJè´ @Kô+@K•5„ j@K—ãYmT@K…eôîrû@K| †o!@KsHÇV@Ki^èyf|@K^ä”Õ¨@KSÚ›Tûr@KHB˜Ž‰@K< C @K/i¼|:„@K",QrT@KeÙlZ@K!i²G@J÷=î\¾¸@JçàÂêp@J×þûÅ·¨@JÇ™ü™¼q@J¶³/‡²z@J¥L¥Àû@J“eñLn@Jp–ôI@Jn#êŽÅ@JZÉ%yfï@JFödÌüO@J2¬H„|ð@Jì\ã-M@J¸0aëí@IóSCøÝ@IÜùW/#Ÿ@IÆqÎÇ}/@I¯|MN¦g@I˜fFÎE@I€M­n²@Ih´ÁÒz@IOz{jL@I6vNsó@Ill@IB¶ÛÚ9@HéúÚÉ@HΉW¶‹³@H³žUM"*@H˜Vxê½C@H|³EÊB@H`¶9^t@HD`Ò1„¸@H'´ˆ®@I,z ¨ù@ID¤A¯;@I\fË"F@Is½Ý²›z@IŠª>Æ2/@I¡)žZôv@I·:r9@IÌÛ0(í¯@Iâ Oè]þ@IöÆIòbc@J ˜®Ýž@JÞ¸°ne@J28)3Ú@JEl ~Ë@JW~PE/@Jig„)'C@JzÓp}Ðö@J‹À^î|å@Jœ,çaX¥@J¬§|…I@J»C!iž@JÊbdéÇ@JØ¿¾ ûN@Jæ– ÈÛÐ@Jóä„Å@K¨ƒÐ@K âP¹×@KKo?2@K#±[·ºa@K.Ds>#À@K8HŽâö@KA¼¶ýÍ@@KJŸÿÔ©£@KRñ‰þ/»@KZ°‚̳f@KaÜ$¯h@Khs· ¥@Knv‘)·¥@Ksä[ïh@Kx»¶vR@K|üõ}(¼@K€§bjc§@Kƒºœc8a@K†6Q鿉@KˆAÆø@K‰f7f. @KŠzm.@KŠ5¿„* @K‰¹; Ã@Kˆ¤“ÊÊ•@K†÷äÓd„@K„³[S¡z@K×3•Õ¼@K~c¹wq@KzYH@áƒ@Ku¸J{q³@Kp9¸hƒ@Kj´žV—ß@KdS>Ü¥@K]]1šr”@KUÓ¸ƒž@KM·d­&@KE  –¼@K;ÉqtW·@K1ù”1SÖ@K'š_ ÿ @K¬ÒÄÈ@K1÷Í¡@K*ã¯JL@Jø˜µ£)F@Jë|–²¤¢@JÝ×¹I5@Imhû1@IƒJ›³‚>@I˜¼ŸJP}@I­½†K$q@IÂKÒŒ>[@IÖfÄé|@Iê «ðô|@Iý8G·³@JífÑÄ@J"(˜z‚š@J3èoÙ €@JE+„q¼@JUðr˜€è@Jf5ÛäI@Juúg¤$R@J…<ÃU€°@J“û£Do@J¢5Â5s^@J¯éãy `@J½ÑǺ@JÉ»`‡%@JÕÖlCk@JáfÚG‹L@JìkšÊyÕ@Jöã§§Q@KΨ¡@K )ÄÈ0°@Kö›~@K1à²àë@K"Ü™ô±@K)õj7“#@K0{¢r²@K6n›Ñãœ@K;ÍÀGŠ=@K@˜†[LÔ@KDÎs/%ç@KHo`’l@KKz=Xé@KMï/ñmÓ@KOέÀì@KQŒÇÆÐ@KQÈ…ÑšŒ@KQã誚Ø@KQh²ˆoó@KPVïøog@KN®¼Ù\%@KLpDMŠ.@KI›À¥v2@KF1{Bé©@KB1ÌtÍ+@K=KÒ€@K8sÝh(@K2¶–Àn‚@K,eÙb1×@K%‚E,*Ø@K ‡‚—u@KZýû_@K m‡ @KEß¿/P@JúEÇø@JðJ¢úìÆ@Jåxð•³@JÚ0•q@JÎ2màQ\@JÁ¿ÀÎ5à@J´ÄI Iû@J§A0¯Æ@J™7§¾¨'@JЍê™@J{–:€u@Jlàåâ@J[ê-åu®@JKSwþ_á@J:>’Ò€@J(«zrt¿@Jœûf*w@J ½sÂ@Iñݤ?@IݘÓ,x@Iɨðå+C@IµD±+wÔ@I mL'Pv@I‹$?^Õ@Iuk ûo¡@I_C,kI<@IH®(ã€@I1­~³ìÀ@IB²š_@IoEÈöü@Hê4¹ì M@HÑ”Êß@H¸Hã @HŸ)`îÅ@H…aWê@Hk9¨£B×@HP³ÌÇ@8@H5Ñ;ÛA’@H“k Šp@GþûÌñ*ø@Gã Ñxë@GÆÄå¥=è@HÆÄ@ƒÝ@HÞŒõQk‘@Hõíå×&@I å˜@_‰@I#r’¬_»@I9“[u“@IOFy¼7V@IdŠuD¨á@Iy]×Eö0@I¿*‰%R@I¡¬ûÒ§Ó@Iµ%ÚB¯2@IÈ(W¸$@@IÚ³ 6h@IìćK£}@Iþ[n}¬@Jv_²öë@J ¡±§@J02ü> ˆ@J?Ò-„u@JNïÌ2‚|@J]‹¤A|@Jk¢ ÞrÒ@Jy5<´uç@J†A»ãÃñ@J’Æú…Í~@JžÃÝ€ñ@Jª7Rø/*@Jµ R¹?À@J¿}Þ¨¨«@JÉO+w{@JҒ׎=¥@JÛH~hï¢@Jão%ÿH @JëPò@Jò lï·°@Jø¦W’@Jþe9>œ@K¶'F Ý@KtWÀfk@K Ÿ/ºÔ@K6FL­Š@K9@ËEF@K§Òî]@K¾÷,Â@KÆÕÐG@Kv÷ ì‰@K’_Ùz@K!ÙÁÍ@K 4³†X@Kedä @K,Ü'z¦@K_ÒêHm@K þ.¢×@K iiÚ@K€Â[qç@Ke ݆æ@Jú¶È®ÏR@Jôvƒ6rÖ@Jí¤×Aúº@JæBl½¡Ù@JÞOøgP@JÕÎ;|•d@J̾cïu@Jà )QÂ[@J¸õ‘éNô@J®?,Ú ¨@J¢ýôyÉ@J—2í[ØR@JŠß%åÙ[@J~µâJI@Jp¡¾ah@Jbºg¸"@JTNä0¤ @JE`ltÆ@J5ð@«òÜ@J%ÿ§½[@Jî×U|@J¢i@Ió8n¨äë@IáS]5¦@IÎô–•S)@I¼€Öð@I¨Ï…¶K/@I• >^@I€Ô–Z'g@Il*„tëø@IWQn@IA„rŒ—c@I+‹`8î@I%“§¹c@HþT…sª@H篰¬@HÏvŒB«@H·l”Ò¡@HžýB„äh@H†* ¸½o@Hlôm¿¨C@HS]Ø Òé@H9gÂÜ*@HŸ1.@HbÞhèÊ@GéVï"ùT@GÍñ=¥¨‰@G²33°ö‰@G–8T‘Ê@H“Å’ ,ì@H«^ƒ¸)@H¤Á@HÙXŸçz@Hï¶æ¸EP@I©f¸w@I.¯?èU@I0EP´z@IDëÜÛF@IY ç1Î-@IlãIØ2@I€0Ï%-˜@I“ß–†@I¥iÔ¡+¯@I·ROáõ@IÈÀöîÿ>@IÙ´sų@Iê+u/á@Iú$¯0…,@J žÛoM…@J˜¹¥`á@J' ºÎ@J5«ÃÖ8@JBxaOZw@JOe ó|]@J[Ë“*ÁÒ@JgªáÔ:@JsìÈ Ç@J}ϵì\"@JˆEðIÇ@J‘˰†Ž’@Jšø£@J£—™¹çM@J«©vZÖ.@J³,êIP9@Jº!AðD @JÀ…Ö“@JÆZ @JËV:â@JÐO4@I‡óÙÑ5@IsõÑgãâ@I`]Øzî@ILRp¿ @I7ÕËA @I"æùl Ç@I ‰ÄšáG@H÷¾Ò|Ë¥@Hᇓ`Þ„@HÊåxl»£@H³ÙóLÒ@Hœfuâ­¹@H„Œrx¬@HlMY#=X@HSªœgJ@H:¥ªío-@H!?ôkc@Hzæw‘@GíWëæœ@GÒØoú ë@G·ýÚ€ÊÜ@GœÉ‘~¢@G<øž£@GeYq£ì@H`¯ÿûÕ@HxÍ”è@H~Ï@H¥¶§kȼ@H»æßÎ.â@HÑ«½Ö’@HçÙÄ~@HûíÊqm@Ih*úÝç@I$q—ÞäG@I8®Ð]Â@IK,ro“@I]Ú`H¡@IpEã@IÒi3}z@I“{ 3§@I£æ-dôƒ@I´77ÐǾ@IÄ Wtø@IÓaMŽ#~@Iâ7ã´c@Iðè •¡@Iþb0{ÉÀ@J ³™ÂÜ*@Jbx@J$ÉhçTÙ@J0‹°R(ã@J;ÆÜ}R;@JFyô€â‰@JP¤ »4@JZD4ðe±@JcY(T@Jkãqˆ5ð@JsàìêF@J{QU‰¿@J‚3ýT¦Œ@JˆˆB5#N@JŽMŽY’@J“ƒXv’z@J˜)$IŒ@Jœ>vb7@JŸÃn“2@J¢¶uétH@J¥pesž@J¦èÄÁo@J¨'D£Ð@J¨ÓÓô‹@J¨îa‡MÍ@J¨vêÕQe@J§m{?KC@J¥Ò, ¿@J£¥$R1´@J æ˜úû@J–Ì‘&6@J™¶5H@J•D¾nÞ@JCE ³@JвÊa,@J„‘Äo¯Ì@J}âÓ>ò{@Jv¥äßÊþ@JnÛ£2ü@Jf„Ã_™6@J]¢Ö¶W@JT49¯eµ@JJ<2ùÐõ@J?ºÔD?p@J4± >Ûð@J)Ç\Ãý@J r´ó@JjãSª£@JIYkÃF@Iõ¤ˆY»6@Iç}‡R@IØÕ™Àèú@IÉ­Ò̧'@Iºqq/@I©ã¯Ýú@I™CР7”@Iˆ)Ýs @Iv”×E8@IdˆXi©]@IRñþi=@I? ûÒµ@I+žÑ>¨8@I¾Ð 8¶@ImZ÷‡‡@Hî«ÓŽéc@HÙ{Ÿ¡wb@HÃÞ&µB@H­ÔÎÔÄ›@H—a#:ÿ@H€„,¨­}@Hi?µyË@HQ•º‰ø@H9…`˜@H!¯å€U@H=Øõ,@Gïm° @GÕs×g†¢@G»zq¬a@G¡2ºnv @G†ˆù0˜'@Gk…–ŽM @GP)ð4Ùú@G4wa~Â@H-„7è®@HD¿|Àqô@H[“û|¨Ô@HrQS @Hˆк@Hšû½­ @H²ÆÌê1@HÇ„s¸!y@HÛÓOÍmˆ@Hï±ÆB8`@I}ˆp @I¥ðš@I(UŽº@I:¬Ñ|ÎÎ@ILEET›³@I]egü°¶@In ôÁ¬ñ@I~7«·#@IçRDÿ@I²µg‹@I«ÍžD#!@Iºë×Ó@Iǵy<2f@IÔç+[Ò,@Iá•î¤#@IíÀ·hÉ-@Iùf‚Eð’@J†TT°@JÓª/Ñ,@J7êV+@J.ÚØ\¿@J&0BR³@J··ã½@JØ?ëB@Jp£@¶6@IýƬ¶Z@Iò ˜Ûp@Iæ6(p@IÙ“.a@IÌúÚ"g@I¿ ‡:Õ“@I±ëŸÙI@I¢G²(@I“|Áù‚@Iƒú‡xCA@IsûËFd³@IcÆ-h—@IR¶D‹—@IA ÞÃæ@I/<†“¼l@Iáú „@I ˆh‘â@HöÏ„˜@HãD‹]È@HÎô êï9@Hº^t»1@H¥Zµ@HéøˆÍS@Hz ç`°Ã@HcÇʽg@HM”3B@H6÷V8D@H‡©Y|@H¦’#ÉÒ@Gîbÿ Ql@GÕ½®MÙ@G¼¸ n¾@G£SU.@G‰‘  1@Gor€èJ*@GTù‚Òã@G:&/#˜@Gúã¯K3@GxÔžJ@GúBá"/ä@HP5g @H'÷l‚@H>6;Ʋ@HT 6³ Ó@Hiwµz@H~w^¼@H“ Ú²ÅÉ@H§-Óù %@Hºáö«ë)@HÎ$ñTÇ@Hàõu±7@HóR61ì@I9ì?@I«Q²ð:@I'¥&m:£@I8&-¾Ú@IH-/ô%H@IW¸ú~ˆÇ@IfÈ`L{Á@IuZ:-g•@Iƒmg1BÀ@I‘Íø!@IžXf–¾@Iª£ý]@I¶±·¿>@IÂ;‹} Ò@IÍ@…ýb@I׿¹Ž@JG³ Ð@J “!zŸ§@JSsHÃ@Jˆu€@J0j|î@J#Lx!@J'Ú`ï¿K@J+Û§¾G@J/MáB@J22UîO‰@J4ˆ:6'@J6OXÍÅ9@J7‡‡E…x@J80©‚ÜÔ@J8J°´i@J7Õ˜ªVq@J6Ñmâ}@J5>Gxl@J3J!l@J0k§~xÚ@J-,ž á@J)_xüÊî@J%%ßd@J GÌT@J§€k)@J¥f鑱@JÓ“ Ä@Jþê±"ä@Iÿ[Kâ¨@I÷-¡ëø„@Iîv¢v2ž@Iå7 ¾Êü@IÛo®LþÃ@IÑ!X k)@IÆLêÝmú@IºóLvøæ@I¯mÖ!@I¢´Gÿµ@I•ÐÜ8"K@Iˆl3¥óÃ@Iz‡^ó1Ä@Il#uíéX@I]A—(!(@IMâç—~Í@I>’4Þ @I-³Çœ©@I彬;Q@I Ÿ¯(`Á@HùâÛYj@Hç°…°Æÿ@HÕ õlè@HÁðu<¬<@H®eRêz@Hšiß°@H…ÿlx?.@Hq'P`ß@H[âá”ä@HF3xcû‰@H0nO* @H™¶:À@H°á“þ$@Gëc8™@GÓ±´@G»œ9+«@G£%ßtKO@GŠO`ÿžq@Gq 0Z@GW‡YÇsé@G=˜€É2@G#NßM¬#@G«Ë@j›@Fí°•ÓY¡@FÒ^ŽôÖ@GÆìQë@GÝÌ•xks@GôF{e%g@H XúèH@H À½7è@H5Bzƒb@HJ×v@H^~†z:Ú@Hrx:ä>F@H†¨KÐO@H™…g@H«ÄŠcˆ@H½ùtFIs@HϺ4óØ@Há÷R€@HñÙÉ„@I58%Œ^@I­u~@I!€¦¾¡2@I0m¨(ǹ@I>ÞŠ3À@ILТ¬/Ã@IZDoßj;@Ig8`X[@Is«o‰ug@Iœ €Æ³@I‹ þ>ó@I•õœì@I [•çuÖ@Iª<ª}&@I³–:Óµ@I¼iK`ëF@IÄ´„Üù@IÌw2ðº@IÓ°¬Åá@IÚ`QG$ú@Ià…Žäý@IæÜK»@Ië.¼]•Ï@Iï±½­ô@Ió¨z¥Êô@I÷™»2¿@IùïÍŽS@Iü?Õ õT@Iþ{”í.@Iÿ7˜þ®@@Iÿß¹×@IÿøÖÓ÷Õ@Iÿ„æª@IþƒI—«Ÿ@Iüô–'µ@Iú×vŽèê@Iø-“Èr@Iôö¬R=Ò@Iñ3 •3@Iì㉣‰@Ièòh$œ@IâŸLU}/@Iܬ‡4t]@IÖ/'s(@IÏ'¼Ó(E@IÇ–â/i2@I¿}=;~Ò@I¶Û~A#@I­²_ÙgO@I¤¦¢Åû@I™Í ô3@I¦n™@IƒÔDÞÛ@Ix_³5@IkÎnÝ$@I_ ?Ûlò@IQÃÔ†F@ICÿ6#@I5¼t˜Úu@I&ü§$3«@IÀêÓS¼@I bÄŒØ@H÷Ú7ª ±@Hç1—mΜ@HÖ´ÖGH@HÄ{Ç+”õ@H²q ÝΫ@HŸò¼,a @H νS@Hy }žs§@HeÏBò7@HQDÞ÷@H<âG¿à;@H'Ésñ@HF„§à@GüY‡8å@GæÕA›@GÏJYÅ@G¸)ÙÎ]@G ¥¹‡ (@Gˆ¿ËÚ2@Gpw˜{@GWÏ?eB@G>ÈÎð˜d@G%e¨S@G ¥nTFh@Fñ‹-1Ê@F×vh")@F¼KÃ.fŒ@F¡)NÓÞŸ@G“‚.í@Gª55Rù£@GÀ‚­b@GÖi"‘&Å@GëçHÍ7@HûÔÿ0v@H¥}Q;>@H)âùvm @H=³ôv‹@HQUoD–@Hd®ö|½@Hv…ÐTºí@Hˆ“}`rß@Hš-}NU@H«R›ª@H¼¥rg'@HÌ9oá @HÛøÒOü—@Hë>©É­Ô@Hú ؼ·ˆ@IYGT)@I+ãÐ>³@I#€¢Þó@I0Vô<9@I<¬}¡º@IH¥í˜a@ISÕ ¨e6@I^¥ÅÁ+@Ihòùš«è@Ir»ÑX Ã@I{ÿ0Õô@I„½FºÉÏ@IŒôi5i]@I”¤9Ñ %@I›Ìói¼@I¢k]x·š@I¨†ñW@I® Û»u@I³rÚ]¾@I·ˆMå”Ó@I»u:y„@I¾Öá¼ê}@IÁ¬ø©ãp@IÃ÷@)+@Iŵ….|ï@IÆç ÎÁk@IÇxO¡@IǦý3dM@IÇ4-?ª@IÆ5{4â@IÄ©Ã/ð³@IÂ’aÛ%T@I¿ï!ð"@I¼À/¼ÕÈ@I¹à^éç@I´À˜Á@I¯ðq²ÿ@Iª–‰üÔ@I¤±ñcUL@IžDv¸}4@I—N6ôi@IÏÅ‘ä1@I‡ÉÆ/Ïà@I<ã­‰@Iv)Ñ/ 4@Il‘O«Å@Ibt&ÝÜ@IWÓ(^jš@IL¯.¥Mê@IA ºI@I4áÝânW@I(:eL@I­¹–@I n¹*~g@HÿL„i°@Hð®C:Îï@Há”æöŽ@HÒ—=H-@HÁõuÁí@H±q¦¾†Ò@H wW8U@H¶ 9ä@H}#öäk«@HjÍQ@›à@HX]$@HDÌA‘æ@H1$V¥Ÿ@H‚ØH_@HŒ çÖØ@Góž9€#^@GÞFTð„°@GÈ…¨ãjN@G²] 9@G›Ï*95@G„Ûñf|@Gm…#géX@GUÌ—†Ò@G=±ÿøK-@G%8D|´û@G `(~5d@Fó*÷‰L@FÙ™ü*UC@F¿®ÀÀ@F¥iÊO!m@FŠÍ"QŸ%@FoÙÌ•Œ@G`µÐ-ƒ@GvЧí“ö@GŒ¬B 4J@G¢g>E°@G·ºW”ŒY@G̤IýØŸ@Gá#ÒÝÍÄ@Gõ7±-pC@HÞ¥ÉyË@Hs»­ù@H.àà…èw@HA9´nÊ¿@HS ºÏì¤@Hd”Âep–@Hu”žÙˆ@H†"ðýç@H–3-(ðz@H¥Ï›¿µO@H´óS.–‚@HÃ=Cê)@HÑÌIxv@HßmB®ì@H쵤oK¥@Hùmñr)­@I§]¼é@I`ú ’œ@I™ÞÈîs@I'Q,Cí@I1† Í£@I;7¬^W@IDeJ&ÚZ@IM'‘¿ß@IU1‘/€7@I\ÎÝ?Â@@Icåkò‹=@Ijt§¦GÏ@Ip|"w+@IuûÎÃÿ@Izñ-æXÇ@I^§@·@IƒAd}¨Í@I†š½*ج@I‰iÙç¾=@I‹®}‚êú@IhvyæF@IŽ—Ÿ »ý@I;ÝR³¥@IU#; ‡@IŽãn@b@IæÉ4"É@IŒ_H›˜r@IŠMG.M@I‡°Gt=I@I„‰-r@I€ØÇ@I|Q‘@IwØÏö|ü@Ir‹‡«Û«@Ilµ´yWŸ@IfWÓ @@I_rjÈa@IX ŠB.@IPWuÁF@IGšîµ?,@I>ƒ:Y¦@I5Îz×Á@I+“*ÌB@I Žœô)­@I„À,í@I ùÙ…¼`@HýîÍÄUO@Hñd‰j*@Hä\gH?@HÖÖ-Ƨr@HÈÔZy=@HºV¹gÍ@H«_.QÃ?@H›î†D}™@HŒÚàï@H{¦Jã©Ö@HjÐùØõ›@HY‡ÀAþ@HGɸ½;@H5š$Äœj@H"ù‡Jî©@Héôz²@Güj F“½@Gè}¦ZY‚@GÔ% ‘Ð@G¿a¼J&m@Gª4»› š@G”ŸbÐ×@G~¢ôCß@Gh@·å„Ô@GQyó/²Ð@G:OìÎÈT@G"Ã뇢@G ×6k7t@Fò‹Ã÷@FÙàÉ»H*@FÀÙ¸Ñ+@F§vÔGUÛ@F¹°åæ¥@Fs£uÛAÎ@FY5d b¨@F>pºÏ89@G,r9ÕJÙ@GBÍ{g3@GXÃÃå…Ý@GnSÕ5Ë@Gƒ|pÒÒ@G˜Q @Hå¤ P|7@HíKkù&@Hô2ÌÆ{@Hú‚2TDO@Ilƾl@IÑvÓÂ<@I ¯Ó—Ö–@Ixt* @IØ _SÈ@I!=A÷@IâÈÍvg@Iu("&@IÎs7@I÷€% ð@I˜¢×gï@I±nOqþ@IAàƒã3@IJ¬Ä@IÉèôKL@IÁ³¡Ÿ@I1‹iaõ@I§À;@IzH´a@I S¹p;‡@I¦Pa¢@Irn6Ã@Hü¸~(U(@Höxõº£ @Hï´T³´@Hèk$6´±@Hà÷÷îE@HØMlŽã@HÏz(9}@HÆ$ÙèaB@H¼N9’@H±÷§Éž@H§ ßø@H›Êïq@HöC¢@Hƒ¤´¶€û@Hv× F4£@HiòDZê@H[Êeš¦æ@HM\[à@H>××—O@H/ªÝy¸@H y‚Iñ@Hî¼46@GÿaºÈ޵@GîaŽà„x@GÜïV85@GË 2Z0€@G¸¹HSÚM@G¥÷ÀjÈX@G’ÈÅÓAk@G-†gøñ@Gk'2c$@GV¶ü¬@GAÞ³íT@G,ºò@G÷äÉõ@Gëu±ÏÀ@Fê{þV-À@FÓ©ðkÈ@F¼v…ì³g@F¤âù³Ñ@FŒðƒË@Ft `&µT@F[óLJù6@FBëòÃnÛ@F)Šâq„@FÏs÷ÌC@Eõ½6öY@EÛT—‰˜G@FÅìã@FÛa”@Fð¾¡3ÂD@Gúy¾ð@GϺCúÍ@G/=3”‰@GCA¶:üî@GVÜKΠ@Gj ,Vg@G|ÍÌ«`’@G"Ó¶f-@G¡ ¹ @G²ŽV“w@GÃ…šð@GÔoC @@Gä8´lZ@GóäÄáNs@H–_VL@HÜ!æž×@H %fK@H-öf±ƒÞ@H;N-«oú@HH+ʱnª@HTŽSÕð@H`tåÇ`@HkÞ¤J^@Hvʹ…ðþ@H8XERl@H‹&º@V±@HFDó¤;@H$xo×@H)XÿRUP@H4¨þíý*@H?|S¾ú©@HIÒ5ƒp"@HS©ã†Ià@H]¤ßߟ@HeÛÈ´Ì×@Hn4¦rÐM@Hv ž „.@H}c,À¨@H„7†v|-@HЉc­ý¬@HX3î6ß@H•£„Õa@Hšjí­ã_@Hž®—×@H¢l•©éù@H¥¦5Ÿˆ@H¨Z­4YÚ@Hª‰Ç½æÒ@H¬3X¿7’@H­W>º0 @H­õb¯Ó@H® ¸'xL@H­ =6Ø“@H¬¬úŠ‚@H«4-Pb@H©5tîf @H¦±wèn@H£¨>§yf@H  éò@Hœ:ø@H—o½lø @H’TYë'f@HŒµOÚ´„@H†“p•@Hî 'ê@HxÆÎÕ3›@HqÞ7œ‰@HhóÏf‚¦@H`I?Ifo@HWÓ`m@HMu9Š|@HCM'ÉD@H8§\Xu@H-„›À²Ž@H!å³ñ‚;@HËx¡Éc@H 6Ĺþ@Gü(y·Z'@Gî¡g©ì@Gà¢ÃŸÎÊ@GÒ-9õ_@GÃAÛtû@G³á¦\~÷@G¤ Ð@G“ÆÉ’äb@Gƒ5¿Y*@Gqäò~í”@G`LÃ`b@GND±A°@G;Ïäå^Ì@G(îÍr@G¢‰ùÛî@Gì>Q…~@FíÍP*@FÙF#MÝÀ@FÄX£¿@F¯¹Èrƒ@F™N‘uîÇ@Fƒ4VÕÅñ@Fl¸6üïÇ@FUÛ_‘Dý@F>žþ”´Ÿ@F'B2;L@F XŒ¡æ@Eö¸oÜ@EÞ ´¿<@EÅUåÄ@E« |À|®@E‘èW!ß@EwÚÞ+@F]wG)?Ö@Fs(÷ÊMH@Fˆw;¦@F`í9ž¸@F±äè4¬@FÆ ·*^@FÙ·0‰Ü÷@Fí=Zî~@Fÿåûm®@G[–ž Í@G$e°ï@G6JK¼@GG0RŒ0ð@GW¦Ý@Gh=faµ@HE‚îÚ;Ê@HLG‹âÏî@HRŠ»ûà@HXL¹ÓÚ@H]Šü÷@HbG8öÕA@Hf€^‰C„@Hj61aã@Hmh&A â@Hp@ôo~@Hr@6‰Z+@HsåÜSÀ@HuÊÈ@Hu£À˜År@Hu»Ü£e@HuOd Û¶@Ht^_7a’@HrèàÁU@Hpï~7@HnpôkÒS@HknÞ£˜@HgèÿH>º@Hcß›o³@H_S mà@HZC‹ÁF@HT±šÞÙ>@HN›!žD@HH™Ð”@H@ñL~CÜ@H9ZÿM@H1BµåÀ@H(«ûV&@H–v°RÒ@HÐCŒ“@H ñ¹h*@Hcê …–@GöZ#@]ò@GêÕ,ý@G»žõç@GÆ/]âÇ@GÐÒdr²Ø@GÚùôêß‚@Gä¥XÉþR@GíÓáy?@Gö„æ3ä´@Gþ·Èâ˜@Hkñ­C·@H  Ñ€[Ö@HUáÇ0±@HФšÔ@H >¤ì»c@H%qv²¾:@H*"· µg@H.R _5|@H1ÿ&‡„t@H5)¾ä›A@H7јzÔ@H9ö€2˜@H;˜L*E@H<¶Ý áQ@H=R9ÔŠ@H=j×Ú @H<þ†}G@H<µ ¤Œ@H: ” @H8¨bË<\@H60#OæØ@H35HDL@H/·f(êî@H+·eRv@H'5Z¸`U@H"1F˜ì@H¬ŒA ;@H¦bú@H u7¶@H ¨.‘–@H“º2t@GùŽÜì<$@Gñ ¥T¶@Gè ¯Èö@GÞŒ ÐÏå@GÔ’$µ²•@GÊïIÞ|@G¿*»­Ü@G³¿L^¯@G§Úi„½¿@G›|ãœ.ƒ@GާMé‡@G[K¢e@Gs˜÷uѰ@Gea{5øš@GVµÃŸ³µ@GG–Â|M@G8n]|æ@G(Â\‘ž@G½Õ‹ð@G­d%«Ü@Fõ\¼i& @FãžÑ9™¦@FÑt°m.³@F¾ßjÖy @F«à:†@F˜wÂ6@F„§/|f@FppÑR @F[Óæ[Û@FFÒ­˜Š@F1nzǾ@F§ â+@F~çèšK@Eîöµ`ðÿ@Eؘ¤­Ê@EÀÊ´c2@E©)+r™“@E‘, ¢.E@ExÔ¶Ž}û@E`$w{@EGMÎo@E-»wîé@Eùذ…@Eõ”(¼f@F ôêra@FñDìP0@F4ŠÉ-ú@FH¿{nˆ\@F\ŽDö‰ƒ@FoöÏw @F‚õËüdÒ@F•Œe³×ù@F§¸Ïš³ô@F¹yþ)@FÊÎè;@FÛ¶ˆE°@Fì/Ü>) @Fü9åfˆ¹@G Ó©Í_@Gü0qeŠ@G)²‰~Ô]@G7õÆ’à@GEÄþ÷/@GSOüo@G`ØÖ%‘@Glq×ï»@Gxh<¹ÀB@Gƒæw³q¹@GŽë®Zâx@G™w! @G£ˆJ®`@G­ß/Íd@G¶7ÎnØ3@G¾ÕB&R¥@GÆõŸ)rÆ@GΘR3Xw@GÕ¼Ð-Ý@GÜb•ô ¬@Gâ‰)W}5@Gè0q˜@GíVú6é%@Gñýn†ïZ@Gö#LôB@GùÇ»Ÿ9Ž@GüëÚŠX@GÿŒµº¶®@H¬¥oÎp@HJ¨° Ô@Hf ÆPf@HxRQ@H$Ç*‚@H­£ƒ@HÀü¶8@HRAø{Ð@HaŽ~s±@Gýïf@GúúÚn˜@G÷…?iÏ+@GóŽx6è§@GïÏëÙ@Gê—ÀVœ@Gä¦/S@GÞ­úïè@GØ6iæ4}@GÑ?óPv°@GÉË•ý@GÁØ]-¸A@G¹hV'_@G°{šCŠ@G§Éšò*@G.‹Ü#_@G’Ïœ™@G‡öŒgP@G|¤=ù~O@GpÙh’@Gd–ÖoD@GWÝXc¨@GJ­ÃÅ¥©@G=õÕ1.@G.ïÏש­@G c8ªA-@Gd${½@Gój×ÈÐ@FòÏÓ@FáÁ"N|9@FÑ“+þ@F¿Ô8“².@F®:KÀ¹œ@Fœ4ÂÆb–@F‰Ä¨NLŒ@Fvë Âks@Fc¨÷À¿@FOÿ‚pH@F;ïÀ%—î@F'zÆLõ@F¡¬›€š@EýeŒ2ÿ©@EçÇbÿm@EÑÈ¡y„}@E»jޏ@E¤¬ãWýý@E’<ïñØ@Ev8°ªü@E^Hôô@EFŒ4“@E-—LY @E¹Æç+@Dû…¢ o´@DáûË U‹@EÁŠÐ]ö@EÖÂy {¸@Eë—éD,”@F =]d@FÒ…À@F'À(C4Y@F;ÿf¨”@FMÜJãL@F`Mÿå½B@FrVöŠ@Fƒó‡¬”@F•%Qô@é@F¥êu?ã @F¶AõI.D@FÆ*ÙfÜÌ@FÕ¤,Éî=@Fä¬þ»Qß@FóDbÙÌ @GiqW÷@GG:Bá@GY”ÇÀ@G)!ÖÈÚõ@G5täÂ0Ú@GAQc3r±@GL¶ŠÒ @GW£š‘—#@Gb×Ýú@GlŽÐÇg@Gu“q @G~˜¼àù@G‡"ï–¹V@G1Žx@G–™{S¼@GÖùöSt@G¤mµ«4ì@Gª†U‚ñ@G° jËÚÒ@Gµ;_.@G¹×eĪ@G½ó™O‚p@GÁÞB#F@GÄ«ñâ#À@GÇGš’Õ½@GÉb§èß»@GÊüò»OÓ@GÌ]1u@GÌ®ÒÍt3@GÌÆHs¹@GÌ\¼nH@GËr6møý@GÊLj-~@GÈŠ/t‘@GÅ­¢+a@GÂÀ<ŠQ@G¿R“r¹@G»dÚ³æ@G¶÷fcÞ@G² „wY@G¬žŽ ÂD@G¦³çQ˜Á@G Jû|„”@G™d>›^å@G’-@GŠK?#>@GÂ%³Q@GxéPŸÇÞ@Go•g×®¬@GeÇ”†@G[~ï?¤ê@GP½»A·‡@GE„*ÆÁ@G9Òü‡6×@G-ªõÛ|@G! á ë@Gùè3/@GqØÛ*ë@Føv—ãZ­@Fê®,A@FÛ)É´U@FËØ}yî«@F¼gŠË@F«è­ëœ@F›KMO±ñ@FŠ@éÕb@FxÊ" L@Ffé°z@FT«å\•@FAéK/ @F.Ìý‚}ÿ@FIÏ#ݤ@F`Îm´Z@Eó ™yò@EÞa˜‰I“@EÉMˆ’ÃP@E³×ðK)£@EžåTÇR@E‡Ì~-© @Eq8Ñÿ´F@EZGør#þ@EBû |r.@E+S:³Ø@EQKÃlA@Dúö¬þÚ’@DâDXÄ4@DÉ;e]½#@D¯Üêî6@Er0¬DŸ@E¢‚ZÄ@E·0/¬'S@EË{i7å*@Eßb·ük»@EòåÙdÉ@Fj‚¡@F¶½µ}|@F+oGŸ@F<è?$‘‘@FNbjù`b@F_q‹ú!³@Fp¨UR9@F€JÉ•½Þ@FüÝ@ã@FŸlSï÷@F®Uá_Œ@F¼ÎÀç%L@FÊֆϷ@FØjïÏJX@F匉My@Fò:Å“Z@Fþr mÝ$@G 5ˆ(× @Gý¾³¿@G WEøb@G*´¨k!q@G4™x‡(±@G> ôÈP@GFöÄ4W~@GOnî@GWj9"õ@@G^êØ['y@Geï]ÓK†@GlwM§W@Gr‚3ú@Gx¥Ö@G}=µßæ@G°¢Ù•@G…Â0dz@G‰W’»S@GŒl‘ž?Ê@GHÎý@G‘ˆ @G’¯*ÐB1@G“ÆŠÞ @G”]+Ô”@G”tkß&D@G” Ñ¿ü@G“#b¸ùc@G‘»1k@GÓWeU@GköÚ®Í@GŠ…;Ìò@G‡ZÿŠH@Gƒ:’ ¯@G~×'¨˜@GyõjÉ—Ç@Gt•³S\i@Gn¸a’µò@Gh]Þ3q7@Ga†šÆâ@GZ3KéH@GRc»¬7G@GJ*í2@GASìVU^@G8—˜ò'@G.[Ë -Í@G$*._Gc@G€lžFE@G_9Å5@@GÇO¦ Ý@Fö¹nEw¸@Fê6[¢Å@FÝ>ã}jö@FÏÓ×Çø@FÁö âÈ@F³¦a¼Æ@F¤å³‡ªÞ@F•´éºâ@F†ì£I@FvªWç@@Fe‹0¬^@FT£[¿@FCOÄv‰d@F1‘ÿY›5@FjÎØ+à@F Û4Š0Q@Eùä4“8@@Eæ†ÕjÈÁ@EÒÄ¥ž|@E¾¿é²@EªÛè”§@E•&gͤ@EØÐi¾²@Ej+%Òê@ETy …•@E=³ÛÎŽò@E&ì`l8¼@EÉ“ÙG@DøK.8™@Dàsu3B@DÈC=‚Ä@D¯»…º³:@D–Ý`˜á@D}©ÞOo!@EYJ´@E–ß?¹%¯@Eª ‹¨èf@E½ý[¼î—@EÐô¬HWž@Eã…{®Yö@Eõ®Ê—Þ@Foœ$Ìš@FÆö+ ·@F)³áe ~@F:5i­¶i@FJJž7ú$@FYò‘ÇmM@Fi,Zéj @Fw÷.`L@F†QÜcMX@F”;ÖË;n@F¡´+X«ë@F®ºæÍé@F»L›raü@FÇk R+Z@FÓÒnÍÜ@FÞHôy÷ì@FéÏ$¶Ó@FóM±TÓÖ@FýðY7@GsèV?@GQûW¢@G¶“¿ÁË@G¡"98ö@G'ÿ›®@G. Ó= @G4j!”¡@G:|Ï,@G?ýÐ,Æ»@GE x–%@GI‰+Ÿ*J@GM’݈Ãz @F×5Á@æ@FË¶Š—Áš@F¿Âl#Àê@F³YöhOã@F¦}ð†Ì@F™/%-ä¹@F‹ng*@F}<Œ ;@Fnšo%]‹@F_ˆïú-=@FPòvO¾@F@^…î@F/Á R&p@Fû'ïß@F Êeï+c@Eü/Òô9*@Eê,gOžç@E×Áê¯G@EÄîø<à@E±¶ôã-@Ežh•Ä@EŠaÖè@EuµÝ¾VH@E`ð“†ié@EKÊ‹îø‡@E6DÑ „é@E `p=ev@E t41Ÿ@Dóê“mÓ@DÜ…àÞ}f@DÅ1dãà@D­ƒ„”æ@D•}MÝãÃ@D}ÎË@Ddlôj3@DKc+8@E%Â.Á¤@E9Öy’~9@EN74£G@Eb5ð•@EuѪ/ŸB@E‰ bÑ»Ñ@E›Üϼ@E®HÙ4 @EÀN ¾¡‘@EÑì{‰WD@Eã!tÌ,Œ@EóìšÊ˹@FLþå•Ê@FAµÐ!@F#É×Çcë@F2ä€Éý%@FAÐÎFZ@FOÍëúPÁ@F]šúÛ'Ç@Fj÷*œð@Fwá­=°4@F„Y¹ÌŠ<@F^Œ—u-@F›ïge*5@F§ ‘©A‡@F±²X¸V@F»ãû5ø@FÅ!9@FÎß¼P¼@FתxU½@Fßü²Ó Ž@FçÕàmô¥@Fï5|ô¤…@Fö Lh@Fü†Ú3Þ@Gv1p,@Gêôeä‰@G 䜒@Ga´N @Ga¯Á=&@Gå»à @Gìê9Äq@GwCC[@G ƒè£{@G"gV<•@G#%hêâÀ@G#¹Ú‰²G@G#бü¾@G#ií¯š†@G"…”¶•ß@G!#¶Å§B@GDl.‚Å@GçÕ×ÈÉ@G2A@G·t)ãF@Gäо@G”B«Wì@G ÈG×Ù @G€w¹7«@Fþ½-z²@Fø~Ì6œ@Fñž٦@Fê’x2Î@FâåqÏu¢@FÚ¿-Ñ(ª@FÒ 4ÊšØ@FÉ ’q½@F¿ziä°%@FµtÌ5Ú@Fªøá€=p@F TÅ@F” Ô€Ï@FˆÆð@F|wÞ&¹j@Fo¶åQea@Fbƒõ¯Â@FTßÛo¢Ò@FFËg¬ @F8Gp/íI@F)TÏA‚Ñ@Fôckˆ@F 'C;“@Eùí¹5ƒð@EéIKKa`@EØ:²õ;à@EÆÂàÓëP@E´âÈ‚¤^@E¢›`aoì@Eí¡`AÛ@E|Ú†ÊÂÎ@Eicßp@EUˆ6¨.p@EAK²=@E,¬qóÐì@E­‹‘,å@EOSãdm@Dì’ÑJÉG@DÖy |¾@DÀõ-|@D©1Ó“ @D’s¨è)@Dzò8¹§@Db¥XS2¯@DJq®òÅ2@D1çþ×ày@D Pf|½@DðоVd%@Elë6A@E¦³ÿë¢@E-Ö¿›@E@öm$ÏB@ET |ý@Ef¸ DƒÏ@Ey'@vù@EŠãÖ‚¢«@Eœ_)9•@E­r/Ëóx@E¾þ;¢Ø@EÎ[«*O*@EÞ0P¥¾|@Eí™ >XÅ@Eü”ÿ ˜@F8éñ> @F+ÒynC\@FJÒñ›@FS*z§@Fìð?T@EóùÉ@Eã×~»5ò@EÔ)þhøî@EÄ#Þ¬Ð@E³ÓÍÜ @E¢ öI@E‘KvŽàô@EŽBÖ77@EmjLüŒ@EZà…æ(O@EGñæ%@E4ŸdíÕ@E éüR»@E Ò¨1yY@DøZf™_@Dã‚4°‰@DÎK^@D¸¶Hê@D¢Ä ‘F9@DŒv*Ó?@DuÍbZú6@D^ʹ5%Ì@DGo2Ó0„@D/»ÓÞx@D±Ÿ‚Ž@CÿQšü"ˆ@CæœÉÅ)Ë@D¼ Zm@DÐôCWÛI@Då WK:ß@Dø½LUä@E +,¾ô@EýþE‰@E1ˆÒa·@EC®´ðº@EUn·ØVQ@EfÇŠ@EÔ®ÃÞË@Eⱸf @EðFì‰A@Eýk.š. @F #E½‹@Fd=§jÜ@F"6ÊÿŸ@F-—fR@F8„C‘†á@FBýähT¢@FM>‡ñ÷@FV“³õ̾@F_®¬ç—@FhS—îÿù@Fpê$¶@Fx9N Q@Fxº Êõ@F†@CôS®@FŒMĽæ@F’eox,—@F—ÂHlÒ«@Fœ¥€è€@F¡Ã.}q@F¤ýÉ¥@F¨rPàáD@F«l¿Üú@F­ë*x@F¯îÍ´4ñ@F±wbˆ4–@F²„¥•'@F³…0I@F³,÷-\ò@F²ÇúÂ¥@F±ç•àû@F°‹×ûùÁ@F®´×ç>Î@F¬b´Èhß@F©••Û-R@F¦Mªd½‰@F¢‹)¤¢ä@FžNRÃØ@F™—l½H@F”fÆM‰@F޼µÕ×@Fˆ™™>i @FýÕáÀ†@FzéØe ¯@Fs^šê£@Fk[_v@Fbá,s7u@FYñTpw@FP‹FÊg@FF°]9| @F<`ó|æ@F1ª±Ö¿@F&g*”7Ô@F¾ “æ¯@F£?©'®@F@#;£@EõßwÃ@Eç®à N@EÙÔ ê“@EË‹&7H@E¼Õ—V@E­²jÚs@Ež$kâ·D@EŽ+¢ï¿L@E}ɸÜ@Elýxî:@E[ÉßJS@EJ/#ûÑU@E8.2y‰Ã@E%ÇøÞét@EýgÖØÚ@DÿÏr<]ü@Dì? êÿK@DØM.ío@DÃúÏ|B@D¯Hév¡ž@Dš8w‘ˆ@D„Êuý’i@Dnÿáà†Ò@DXÙ¹+éÚ@DBXútåV@D+~¤ÍHÇ@DK·¨@CüÁ2€ Õ@Cäà?Å@CÌ©_šk@C´®ç@Dˆ ÓãÝ@Dœo™à…@D°_wST@DÃî§¿ ã@D×8l@Déç7ðн@DüN¸ÁÁP@EQÎ.Ýç@EïŽ*{"@E1'&ß™@EA÷rF@ER_ÏŠs@Eb_JÒ+@Eqõ Ïl@E +iÔ@@Eßå†D×@Ež3c¥Äe@E¬ÙÑÂ@E¹’}QNP@EÆœŒOÖÊ@EÓ7F˜Ôð@Eßañƒ0}@Eë×b…†@EödG¶Å™@F:—[)@F ž ´U€@FŽCÝž@F fÕC.@F(õ§•S@F0¤b˜áÌ@F8Á&N H@F@g¿óà @FG—µdÈ@FNP“J¸<@FT‘íFøV@FZ[^  j@F_¬‡‚m%@Fd…Þ¿â@Fhä°Â:@FlËP8O@Fp8 E`@Fs+Q Iì@Fu¤¶ÇïŠ@Fw¤tJH@Fy)Hàþ@Fz4:ï@FzÄØÁÃ@FzÛr$!@Fzvûb²@Fy˜…]­@Fx?Åç@FvlÑ–$¾@FtÉ3@FqXÑÅû@Fn–N9@Fj]ÖT•,@Ff*E{ú/@Fa}¬(6›@F\XWJ@FVºšàk@FP¤ÐõMå@FJ^7Ï@FC«¶…b@F;—*Bnb@F3¥QŠ´G@F+=Ÿù>á@F"`šŽ@F̶b½@FHÈ) f@F$¸…i@Eúb€*„K@EïC~ œ@Eã²Ç‚_ó@E×± !‹Õ@EË>ü¹Y?@E¾]U(8@E± Ò*;@E£N6)±<@E•"H ?@E†‰ÓRh@Ew…¦aBŒ@Eh•R‘@EX=vÃ^C@EGû%%@»@E7P~;M¯@E&>bë·K@EÅ·e@Eça<¹@Dð¤J ts@DÝý^ÆÔ@DÊó‹mÞ¼@D·‡ÀZ‹E@D£ºï'ÚJ@DŽ Á_@D{úû¹@DfÞÞ È@DPЄ&@D;,ð¹'@D%.ô~@DÕÕIW@Cø"¢c¬Í@Cáîwßñ@CɵåÐQ@C±ýP»4@C™ï¾Ql™@C— œ@DS³ÿpŒD@DgÞ[vLƒ@D{©jF@D<^»@D¢å Ð@D´Åx ó@DÇ –@DØê¼Œ×@Dêf tsF@Dû|ÖÀó™@E ,‘Y@Et½á5Ÿ@E,T·¹=@E;Ë–]£æ@EJ؆{ï@EYz¸]œé@Eg±`o@Eu{µ´“+@E‚ØõpXñ@EÈ_Û¿@EœI:®¨@E¨ZÍäÖ @E³üjr@E¿-bZ4@EÉíÖ£1@EÔ:Ðÿx@EÞ ç6›@Eç~$f}ê@Eðr@Ú@EøòÃO,Ù@Fþ9¦+}@F”u»í @FµŒ @F_iºh@F“G²U…@F"P7É|Î@F'•ÞYI%@F,cæÜT¡@F0ºuµ@F4—ïá*@F7ýkÖæÒ@F:ê@Ð>r@F=^??Ï·@F?Y?1ðg@F@Û Y ö@FAãÊžÊ@FBs+‡ðõ@FB‰;DÕ@FB%øš»–@FAIi+÷@F?ó›J @F>$¤Å€1@F;Ü£ Á!@F9»ˆº@F5âÈ¿Õ@F2/õ<ÉÓ@F.†ÁY¬@F)c¡•@F$Hã€rw@F·KF§4@F®£Wi@F/JÝ©+@F 9©ãª@FÎ-ÿÑP@EûíKξ@Eó—~Fä@EêÍG®ñ\@Eá/Dé{@E×ÝÃK@E͹—ȹt@EÃ#F”´;@E¸o03:@E¬¢¶™26@E ¹ÇðL@E”aP5E@E‡šF7m@Ezd¢…‡›@ElÁâÀHk@E^²‰.Å@EP7\D!@EAQ&€5Í@E2¶>;E@E"FÝ…¯ý@E$qÚ_N@EšL ­3@Dð©H {@DßRD­ò @DÍ–#’›2@D»uÈâôP@D¨ò,u¬@D– 1Ãò@D‚Äk½ä™@DoAxp@D[r¸Œ·@DF­ï]†-@D1騡Ày@DÈó]Q@DK›ËÖ@Cñs½ˆÔÞ@CÛAëF@CÄ··Ò.@C­ÔBF@C–šW®Æ%@C RWø@Cg%(º©@CNëÑ|Æî@D;] ç@D3@à¶å@DFç‚ÓY.@DZ.[ 4§@Dm€ŠÃ1@D™ o“š@D‘»&à¢@D£yÇ/Ët@D´Ô3\+Ô@DÅÉ€üçÀ@DÖXÕÂè@DæWg•Þ@DöB2ãÛé@Eš•”…E@E‰°ìûb@E#¹ñC_@E1(éd*†@E>×{õgê@EL²ol@EXîÑæ"@EeV#â~ó@EqNö‘‡ˆ@E|Øœïõá@E‡ònörÊ@E’›ÉÄñã@EœÔÍIE@E¦š¨üìm@E¯ïå²;@E¸Ðå@EÁ>ÌM ²@EÉ94…î@EпO2¼@E×ШW{ú@EÞlÒxEÛ@Eä“f¶®ø@EêDñøï@Eï~Sâk@EôB4ò@EøŽÁ÷e@EüdPùö°@EÿÂrX$ð@F¨ð~ú@F›Ø y@FNÄì @FŒéd‚@F “S¾í@F !}_$p@F 7]\\µ@F ÔòVeu@FúByÜü@F§[}vz@FÜRÈd@F™D–Ïò@FÞU›.|@Eý«±I&±@EúŠaê@Eõàㆤ@EñG¦¤«*@Eì8s“°Ø@Eæ²Òw•’@Eà·Ê@EÚE¨ j@EÓ^àÕÛ@EÌ/~8@EÄ3´çk@E»îÛ~IÚ@E³7/4 –@Eª …T-Ç@E ohYA@E–`h›á™@E‹à$ã[@E€ï‰F@Eu޾(£@Ei½˜ð‘@E]~bXŸ @EPÑš–@EC¶}Þ_@E6/>m^@E(<n²@EÝײ-æ@E 8ºS«@Dûã+¢=@DìHL j@DÜE*Õ@DËÛ"Äë™@D» Ò1aI@D©ÕÈn@D˜:Â9¹¯@D†<¾Üä@DsÛꮚ@Da)•ª:@DMõaÙ@D:qzAå@D&Ž]\Gl@DLõæ0Û@Cý®0V…@Cè²úaQ¿@CÓ\BÏñ@C½ªùZÞ[@C§ „r0@C‘Ž _Ú@EE°=¸µ@EP³‹~)!@E[Fàá––@Eeiö±Ø@Eo8—ÎÜ@Ex]ˆä@E, fø@E‰ˆ%ú@E‘r&«Ø@E˜èZZ@@EŸê¹#›€@E¦xØR•ˆ@E¬’S¨ás@E²6Í{ƒ<@E·eîÍ´:@E¼gj»@EÀbíù¾Ì@EÄ0@;~@ELJ"p…@EÊg`ºÏ5@EÌÐÍßùª@EÎÃCüûN@EÐ>¤p1d@EÑB×â‰ì@EÑÏÎN‚õ@EÑåú@Eуè¯È'@EЫR(À@EÏ[Fêø@EÍ“Üt÷Lå@E2¼¤—Åf@E&–Yƒñ¼@EÂH!¬@E i_‡@Dÿ–uà2@Dñ¿.ìðr@Dã}wë¾@DÔÒ(Dk@Dޱ@·@D¶AR+ø¹@D¦]Œ§¬½@D–AqM@D…cBæÿ@DtNfIš@DbÕƒ—c@DPùuY&d@D>»zÖ§@D,L ?”@DñzÕÎ@Dºë &@Cñü`ã»@CÝßs ¢…@CÉeήFU@C´3V@CŸ_BŸGŽ@C‰Ô0_¦L@CsïÐ^].@C]³LéS@CGÚk¢õ@C04h@CóÌÛÝ@Enƒ…±ÏÓ@Et‡¼@Ez(™b-@ELµŒ@EƒüÎÿÀ@Eˆ6eÕ@E‹ûÀ Ál@EK~®Ä«@E’%”¦×W@E”‰Öš¼@E–x¢6©@E—ðQ癵@E˜òV®Ðc@E™~\î@E™“ |œX@E™2ÛÀ™­@E˜[ÖL@E—œI]@E•KB´d˜@E“ä‡Ôµ@Eb¤*ß@E=ªÍ”@E‰£)Ñ @E…“VŒ7@EpÓ\@E|¼ѹ@Ev¦…èe¾@EpÄÒo÷@EjmâÈ^.@Ec¤.,@E\gg¸ÄZ@ET·ûgDz@EL–[Oy@EDÿ‰b@E:þf aC@E1‰LÖ@E'£Ž[Q8@ENh;¶|@EŠ4DŸ2@EW‹¶Ö<@Dû· ÖÁR@Dï©ZÄŽ#@Dã/S¯Ü@DÖIáà @DÈ÷¶,íK@D»;ò)ÎG@D­mÙ+@Dž‡æÝU@D‘¼Ž@D€2ÒOÜÈ@DpmÑçî¸@D`Bå2@DO²Ù˜@D>¾€M@D-f«Ñ!¸@D¬2ײb@D í`V%@C÷µêë¦@Cä5i¿Ò@CÐøå*7@C½^ ‹ @C©eº÷"µ@C•Ù®"g@C€`K;œÍ@CkTõR¢@CUᆭ @C@1ŽÍ¤ú@C*N@C­åqn@Büê>?nÃ@BåÑBAl1@BÎcÛq‰0@B¶¢óæpð@Cˆö{%˜@C•",%uÞ@C¨]ËWÄä@C»:÷ÂŽB@C͸ÖËPR@CßÖ²ô$@Cñ“K¼ÂÓ@Dî6UÜk@Dæ}=$@D${P«”'@D4«ã|ì@DDwkX¬K@DSÝ ÛG‘@DbÜ?¿‰Ÿ@Dqt|@D£¹(ÞÂ@Djœ0È@DšÇùòëx@D§» /ã^@D´C`¾Á<@DÀ`µ³Í@DÌ’Em@D×T3a¬@Dâ*få8C@Dì’¾gó@DöŒ3‡@Eƒ!Õ;@E 16Œ\Ù@EÛ¶SØõ@E…Žt@E!Þ-qS@E)5;Oõó@E0DûŠÀ@E6ŒäŸD~@E<Œºü€0@EBo"@EG2®SFß@EKØ,‚W@EP ¤m¦@ESÆÕÍŠ@EW‰‰Øë@EYãžü¢@E\B·? r@E^,âul–@E_¡ò0œ@E`¡ÐKžÂÚ D@E8ÈÁìEy@E2Ö –;@E+Ä]ñ{Ç@E$–» `?@E÷W6zú@Eæ¡°*°@E e–ï@EsÆÀ@DúF¶%¶@Dð@[3@Dæ è@DÛQÖ,nÌ@DÐ5ìl_ß@DĬó>”s@D¸·‰ä,h@D¬VT;¸Î@DŸ‰ú™«˜@D’S) CÞ@D„²’ @Dv¨èÁ÷™@Dh6æ8Gs@DY]F»(T@DJÊ >P@D:v3D@D*jH¨Â@DùÓ„+k@D %Ÿû ]@C÷î|ã¸ý@CæU;dˆ@CÔZ¯ç ½@CÁÿ¯ºO`@C¯Eþ%@Cœ+´Àæ@Cˆ´n#”ð@CtàÌXº@C`¯¤Èbl@CL#à3¾ø@C7=²Y"¬@C!ýýŽ“x@C e¥Ô]@BöuŒë˜Ñ@Bà.™Ä…û@BÉ‘°Ï[@B²Ÿ·¢û>@B›Y” ;K@BƒÀ,QB@CLá 3@C`VÞ%'@CsoŠB;@C†*6÷‚@C˜† dK@Cª‚9Ðak@C¼é·ò@CÍXLôÈ¥@CÞ0•±9K@Cî¥ø3L@Cþ·¬Ï¥Ã@Ddìz'a@D¬ô„Òñ@D,üHû@D; a+ÆÐ@DIOÅB9@DVÊ xÝ@Dd ïáÕ@DpæƒNoC@D}UÈ À@D‰Z9Î¥@D”ó4ÚªE@D  5ƺ@Dªà\™/Á@Dµ3\@ì@D¿ŽR\€@DÈhÿÑ#@DÑ—g«A@DÚ0 @DâXÙ;Ö"@Dê]þ»@DñY*¶^q@Dø/Öš_@Dþ”þÉæ@EˆFe««@E V°Ó<@Eß ,è@E³•t‡¯@EÜ5Î\=@E‘‚À¦@EÓEb³@E!¡M\.@E#ûpùjQ@E%á0x@E'S…®h[@E(QDÞ«F@E(Ú»ñ2‘@E(ïâÞ©@E(¸j¼E@E'½B$v@E&uŒd©@E$¹ªJjR@E"‰µµ o@EåÏ?­ˆ@EÎ20_@EBÐ{ê@ED£Ð@EÒ7ºI@E íiH¯R@E•÷?d@EÌ/àRû@Dúg¬¡@DóâùJ@DìÄEl©‡@Då4²»•¹@DÝ4­¶ «@DÔĨ–lH@DËå4)›@D–‚ä¹@D¸ÙbZ`—@D®®A„j¸@D¤­k&ì@D™8 qa@DžxvêyI;@CQp:±¾@CcI—»Ç2@Cu$ú® @C†ŸùÈÂ@C—¹ÂäÚ¹@C¨rf6¯@C¸È°ÞMÐ@CÈ»Þfo"@CØK-Ž¿@CçuÞ.!Ë@Cö;5ã#/@Dš{°Ðñ@D’úji#@D $eÖ0@D-Lߢ9¼@D: íîDÑ@DFc…KÒ@DRPâS@D]Ñɉڣ@Dhè?‹Ì³@Ds’Ï÷·¹@D}Ðê‹@D‡¢Óªt@D‘•RV@D™û›ÖË@D¢‚ y‹'@Dªš'ÙÜ@D²B¿Ùšö@D¹{ `Þ@DÀCþiJ@Dƛ݆6K@DÌ‚ÁÓŒg@DÑøV¼*@DÖüM¹ls@DÛŽ^i?e@Dß®F¡0¡@Dã[ʀʒ@Dæ–´ò*@Dé^Õ‡¥•@Dë´ëŠ@Dí– †’@Dï ¿ÀÚ@Dð´Ž—g@Dð‰ ƒ™™@DðžËÏ7@Dð?¢2õ1@Dïmê#Óì@Dî(禺ô@Dìp­^"þ@DêETxp@Dç¦üÖí@Dä•̦Wp@Dáð·Æ@DÝœ;KE@DسÅ£è@DÓØv9 ¾@DÎŒ*·@DÈÎrŒ—¼@DŸ ¶d@D¼ Ï ç@D´ðî]s@D­p™Ž!@D¥€¤7û@D!Ü| B@D”Tx öT@D‹ÜžN@Do‰¼¸×@DwYÖ@DlÕÕGO@Daæ‹ãcš@DV‹»&JË@DJÅúçäŠ@D>•çr¦s@D1ü!_3`@D$ùMo0U@DŽgª{@D »"ë l@Cû)S@Ä@CìàÛŠo¯@CÝÚðå$Ñ@CÎp#û2w@C¾¡2…@C®nÝ õA@CÙçT|@CŒã>tõ@C{‹5ƒ‹ž@CiÓ %“O@CW»k]9d@CEEtÞ@C2pú£¹@C?Ïél³@C ²sê"I@B÷ɼË*A@Bㆂ2@BÎéœy‚@B¹óåàTå@B¤¦95b@BqÔ”@Bylwp}@Bb¶5@BLÁ@B5ŒK8h@BÍ5žÀ@BãpI«mÃ@Bö b‘à@C t1 Ù@Cêç6„@C.¶Î¶@C?½Ôç@CQuK*;@CbÒÎiq@Cr¬'Q…*@C‚ã¯öºÃ@C’¸¬vÌ@C¢*_F%'@C±8 º(å@C¿á.—@CÎ$‚*ü @CÜâˆV@Céxs•Jµ@Cö‡‹=š1@D.ƒ,Úé@Dl¸ôPß@DAŽ/@D&¬h¦ö@D1¬²sYí@D¶@CL÷*…p@C\®I” @Cl³u÷@Czó±‡ÞN@C‰€$’l@C—¨žÉÙ@C¥k08ï@C²Çš¡æn@C¿½7À;¤@CÌKe-@CØqƒ«fç@Cä.øø³@Cïƒ.?„@Cúm‘^i@Dí“pDæ@D«ÀáX@D¬UEÑ@D!êV‘l@D*»_"È`@D3Î0ÎÇ@D;ëJuà@DB Jo‹—@DI»„ðÜ @DPh9ŠÈ@DV¦ z‘@D\t§œ¯¶@DaÓº|4Ç@DfÂúk—@DkB"• @DoPô‡>@Drï5ônœ@Dvµ] ®@DxÙE„>@D{$¿Æî@D|ÿ±}Ô@D~g÷ ¶™@D_…Ó?µ@Då¢V­1@DúE$Ô’@DmÏ”@D~ÏXKe@D}gR$7@D{ÞV»N @Dy¼Š ™@Dw(‘ï}ƒ@Dt$ Ox¿@Dp®Û6Ì{@DlÈóOÚŒ@DhrŸUž@Dc¬$Û@D^u¬ {(@DXÏ—þ%@DRº.4@DL5ÂÅyŒ@DEB¯kŸÅ@D=áSlIÑ@D65¿@D-ÕY¾­'@D%+•xèÝ@D;(a—@D’ÄM@D¤¯Q@CþKil@Có‡¼w”]@CèYòè®k@Cܳ”û8@CГž_@CÄZ,Nb@C·Šó²@CªS¿6X@Cœµ‚ Æ5@C޲I#‘×@C€JJNÑ@Cq}Wk7@CbM êˆ@CR¹²½A†@CBÄ$÷ K@C2môXB@C!µ:Ž¥â@C\Ø$@Bÿ&:E.h@BíP™íù-@BÛB‰@@BÈŒûnxŸ@Bµ ÑWÂ@B¢X΄É@B޶‚gh@Bzº{¾:Ñ@Bfe‹“ @BQ¸‚'ùÉ@B<´3¬ì@B'YsL(…@B©yC-@Aû£ïTÇ+@AåJÖ‘]J@AΞ¡W‚ @A· &*M@ByÕ†mV@BŒÁ6!¨@BŸQ{¾KÓ@B±…ÿFt@BÃ\­a§@BÔÖD¶‹@Båð÷ †(@Bö¬¢>Õ\@CT¯B-@CS—º@C&œæÀÿ@C5ÔX ´@CD¨öî‚@CS¥ˆ@Ca&úc³¡@CnÏ PJ`@C|š]ÔÆ@CˆîÿÅù@C•c´Lþð@C¡r!óÜ@C­`By·@C¸V5{,O@CÃ*ôÂ\é@CÍ–Xy†@C×— çÜÄ@Cá-Y£ö_@CêX‚g¼D@Có ÓTs@Cûk…hçã@DR}¨Žê@D ÌŒ+H@DÙL¼ê@Dx`uã@D©mΕ´@D$l ¾©r@D)À*Éœ@D.¥C,É@D3&…2ø@D7!—¸ô‘@D:¸_/Ž@D=ßKJ¢@D@–0_Ã@DBÜèÁç’@DD³TÎ=p@DFZð‡a@DGç¬7@DG“í¢ %@DG¨e“(B@DGLN`‘ä@DF­™‰@DEBŒÅöF@DC”þÇc[@DAwq î@D>èý3TÅ@D;êÊŠ»@D8|«óUñ@D4žÐä c@D0Qn¼Wª@D+”À¸¢‰@D&iã À@D ΋-‚@DÅ–†ù¨@DN|y)~@D i”b`Û@D;8”@CþWÓD%]@Cö+Ä a@Cí“z9·@Cäg{Û§@CÛ o„@CÑEÆ€ý@CÇ3ÎûW@C¼RÏ p@C±;!a¤6@C¥º¸Lžñ@C™Ò%€ø@CþLJ@C€ÊÝÚôf@Cs­`Ju)@Cf*'S^o@CXA×ÁÁ@CIõÉ­ñ@C;D˜ëáÜ@C,1Ër¹@C» ‘-@C ãf:Ðl@BüªÉ’5ì@Bìïð`=@BÛ•§Ñˆ@BÉÂy_jF@B¸ [ðÿ@B¥ûBûZ@B“Œ+/hg@B€Á£Yã_@Bmœ1 ”@BZž7%Ô@BFC¶Â@B2E+ÝV@B‰Q”õ@B©O@AórÌäËÝ@AÝçL§@AÈQáb@A±Ó®x°‹@A›M4Óâˆ@A„t·½_ž@BDùÌË@BWÃtö@Bj2<å@B|E>/dÌ@Bûý]²‡@BŸU}áŒ@B°Q}%@BÀíÎ[iŠ@BÑ+)„az@Bá\«©¤@Bð„³{Z‡@BÿŸ|G*@CX-¶M@C­«;OÀ@C*Ÿ¼ŠÎ”@C8-–gÌï@CEV–p-µ@CRµ@C^wÞˆ_@CjnXGÁ@Cuýà#œ6@C%˜œQF@C‹äõñºõ@C–;p™ƒF@C (…]“t@C©«µzV@C²Ä†º©è@C»rƒ—@Cõ;Næ^@CËŒB3[@CÒ÷0Õ¯ì@CÙõ¥÷ƒ›@Cà‡DË3 @C櫵öm2@Cìb§x´·@Cñ«Ì¿Ø¥@Cö†Þ»1(@Cúó›í”Î@CþñÈ}ûë@D.FÈ;@D¡œã§Ï@DRé¾ µ@D ”ð$1@D g‘p‚@D ʳǹÉ@D¾E+–Ý@DB87`K@DV…Ù˜S@Dû,ûÃî@D02‚³™@D õ¡M;Ò@D KŠ1]ú@D 2÷ãv@D©+Vm@D±"çþ1@DJ#ý@Cüt*S¿å@Cø/œ†›µ@Có|£„…Y@Cî[~¿JÑ@CèÌsBm8@CâÏË¡¥.@CÜe׿þ@CÕŽízdx@CÎKg>í@CÆ›¤£4Ã@C¾€ /ê@CµùÉs»@C­nü¯@C£ªqî è@C™ãÑË;ú@C³% Š@C…U—Jm@Cz„@Cn®©ðmË@CbÝ^pw @CV¥0üW¦@CJ·Öo@C=@¦@C/™N"Âv@C!Ëœ_æ@Cš9[@Cuqoé@BöRâ¦@Bæµba @BÖûT™r¨@BÆàÜílˆ@B¶f±SÀ@B¥Š2Û¨@B”V"FG@B‚Á6v˜ž@BpÏ…»á!@B^ÐüMó@BKØÚëÍÇ@B8ÕgìT@B%x=ír@BÂ$M@Aý³ã½5@AéNFÕ–@AÔ’cç@A¿€ }&ã@Aª13g›@A”^ %@A~O5f@Agî•_Q@AQ;Í­ÂX@BßÐÍ©@B"»j…+L@B5 kW2¶@BFü"Í:@BX’Ó0Pñ@BiÌÀ«Šð@Bz©1kœŸ@B‹'m¾À @B›FÀ4ׯ@B«u¿Å@BºeÝÓèX@BÉdJˆ½z@Bع‹I@Bæ;ˆ&L@Bô “Xò@C†øì @C–±a+(@CA™ŠI@C'‡…‘ @C3f‘’@C>ߓʭ·@CIñq"¥@CT›¬T›ª@C^ÝÁ2B¢@Ch·/z>é@Cr'{[”A@C{.-}Se@CƒÊÓ Ï@C‹üþ~¿@C“ÄE/[j@C› Cê<Á@C¢šÕ•c@C¨”©@C®¬ìÌhH@C´XB’VB@C¹–¦&‹@C¾gÒ1!@CˆÎ:$@CÆÁ‰šÑö@CÊI¥ÄUý@CÍc¬+®@CÐsƒË@CÒLÖ»èî@CÔ¹ aþ@CÕ|ß#-@CÖmžoÈÊ@CÖð‚Y@C×¥ùDÂ@CÖªý³ý@CÕà¯íDØ@CÔ¨¥bë@CÓùÇÇA@CÐìÃWMŽ@CÎi6Z@CËw+¶ƒŽ@CÈÀ Ú@CÄITyÓ@CÀ -<Å@C»cÉ×qÒ@C¶M Xó@C°ÉX3*S@CªØÖ¤Þ@C¤{Þο@C²Å¶S@C–}ãWpu@CŽÝ•RF @C†Ò>I4h@C~\EÈ'c@Cu|,/¥@Cl2&н@Cb~æ“©Y@CXbÒ}? @CMÞhá @CBò,£"&@C7ž¤Ó‚U@C+ä\Øu@CÃâéÈj@C=ʾk@CRªŸ„4@Bù±Ù;@BëO¾‹;ó@BÝ91Ò&@BÎÀe^E@B¿åª¯!@B°¨äþ÷]@B¡ !M@B‘€.õ@B€³³ÌÃÆ@Boùp¼ˆà@B^ámᯖ@BMldLÑt@B;›ºj@B)n+Y°Ó@Bæwà Î@Bµ7 â@AðÉ¥w‘µ@AÝ6 ,@AÉJ®3=Â@AµQ¢ÕÂ@A o½ª; @A‹ºv]“@Av?Õ@A`¨‹]˜²@AJ¾óÎJŠ@A4ƒz-@Aõ»ëI @AÛ#8£ás@Aíª¥·Aã@Aÿ×ùEÔN@Bªwšé<@B#!fÄÑ«@B4<³B @BDù¹V­@BUY²»Ôã@Be[I1¯ð@BtýÍb@B„@’t95@B“"î,J•@B¡¤9 \l@B¯ÃÎjc¨@B½ £½)@BÊÛU(¯¹@B×Ò ¥Êþ@Bäd›!Á@Bð’l@BüZ@C½•Š>“@C¹×l¦$@CO.ÙLI@C'}lé@C1CîZW@C: ½jp@CC•‡O‡@CL! …™y@CTBÛŒ™u@C[ú“—@CcGЃéÜ@Cj*56 £@Cp¡ii]ö@Cv­è[¼@C|Lø™Ž9@C€¼’nÔ@C†H")#@CŠ¢ë ž@CŽÞ.w@C’Èס@C•%z½F)@C—ËÍŽD@C𗏼@C›ÏÍ}RJ@C-Eƒêü@Cžó— @CžžËOÆœ@Cž²ÅóCè@CžXây o@C‘%ˆ÷Ö@Cœ[™zˆ¶@Cš¸NR;®@C˜§Y½†x@C–(× _m@C“<ç/^‚@Cã°¥z@CŒ_|d@C‡ê%@†@CƒJ8ñÖQ@C~=Öõñ@CxÅA ‚…@Crà¾0m@Clš¢v«@CeÕ'¼æ·@C^®»êØ·@CW²’œÒ@CO"kÿœ!@CF½MK© @C=îÀG_B@C4·3aŸ×@C+Ž6{@C!ê+´Ì@CŸ è‘3@C È=§–Î@CŠÄc´@Bôç=5‡@BèÞ3Š{†@BÜp7^6ï@BÏÛÅo@ABY8/Û£@A,æÿ:®À@A")×Þ@A ~$ø@@ê¢Ô9 k@A¦*Vª‹G@A¸ñ°gQ@AÊã´´T@AÜPt²þJ@Aí§îiÀ¦@Aþ£œwçø@BBÌz˜u@B„Î+0w@B/hó}}£@B>î¾@BNü°îm@B\Û¯¹@BkA¨È³˜@ByF£Ý&Œ@B†éã¿÷G@B”*ÍT @B¡Ȫåæ@B­ƒA"'@B¹™¥‚ i@BÅKh§‰@BЗþáIô@BÛ~ã@@Båÿ“´H]@Bðæyq@BùÌ`É 0@C4Ì@C ú¤FŠ9@Cu8†@C†àôWF@C$/9'u¢@C+máaM‹@C2B~¥|p@C8¬ºÎ›Q@C>¬D¢y5@CD@ÏåO’@CIjkæ%@CN'Ó,œS@CRyÌON™@CV_É<*@CYÙ—¨©@C\ç ¤é$@C_‡ú¥œ¡@Ca¼EŽN¦@CcƒÎ¹¯4@CdÞ¨’@CeÌDÀ\@CfMÝ>å@Cf`åÈ¢ß@Cf¹Ðâ@CeA“Œ¦@Cd~²ó@Cbnˆ‘·Û@C`aÈNŤ@C]èWæ~Û@C[WyfV@CW¯ì™ñC@CSñBCG@COƈθG@CK/õççº@CF-ľR@C@À4¾m@C:ç‹òpS@C4¤‚÷ô@C-öÛ Ÿ@C&ÝüX¥›@C\ 7¶Â@Cp¢~ï@C*åj~@C_ ÄCD@Bý9ªöÈ@Bó¬~Æ1Õ@Bé·ùϨ½@Bß\”êdN@BÔšÍ ý@BÉs#2øU@B½æ?¨Î@B±ô@ãZi@B¥ž}í @B˜äBÝõ@B‹ÇAÖÐ÷@B~G³»Ê¯@Bpf1©(W@Bb#X²a²@BSÈç¡À@BD|%7B@B5O4Ð@B%W;~hú@B7H–4G@B¹çËÍq@AóßÈ™áš@A⩜¢O,@AÑ¿@A¿+îùZº@A¬åÚB ¥@AšF’~F½@A‡NÒUŽ@AsÿUæ˜@A`XÚ¨Ii@AL\Sr¤@A8 ãÁɰ@A#bèÕÀ&@Agð_w@@ù½Á¾@@ãy¬®@@͆³¯Œø@@·Cf@›ï@Aq(u“éº@AƒnˆjÎ@@A•[bäd>@A¦îP˜7È@A¸&žà`Ç@AÉœö)¨@AÙ„œõ@Aé¨ïyZ\@AùoìºnÉ@BØë«3æ@BãF–„@B&ŽZT´T@B4Ù†m Z@BBÄ-/Ö”@BPM³Õ¸@B]u‚šeÙ@Bj;ßÂD@Bv©DÌö@B‚œáÅ–‘@BŽ8#×-Ã@B™nèƒÔÑ@B¤@¬†Óä@B®¬ðgÛ¬@B¸³8•ëÚ@BÂS ±@BË‹û·MP@BÔ]“÷ý@BÜÇkPä@BäÉ3Öu@BìbA‘#ô@Bó’€è~d@BúY€a¢Â@C¶ëßøj@Cªt@C 3Η×í@CRµì‹ï@Céž’+@CP.Kà@C.M¯µ.@C!¡¸M_@C$¨]‰ò»@C'Cûì!@C)sÏzóŽ@C+7½]I'@C,®e@C-{’ü<@C-û[Ç,[@C.zeß@C-¶Ž#y@C,ñú0î@C+ÁSzï5@C*$©@á{@C(%« @C%§¢*«_@C"Ç~©g@C{ÊKë@Cįì@C¢\¦d@C£„”@Cås“6@Cº:Èc@CíG &õ@Bü¶UEÅ|@Bö² ÁÑ@Bï ¯Ë*`@B瘥«æÿ@Bß¼ï|«~@B×xí§þo@BÎÍ_8@BŹŸ5–›@B¼?)¥=R@B²^Z„’@B¨ÛiLr@Biòð”e@B’WÛR2@B†á~»±@B{( Û@BnÇ›ëë°@Bb%ýß7R@BU!Þ·Ã@BG»ÏøQ¦@B9ôj5 !@B+ÌFyÊú@BDk ¥@B\:‚A@Aÿ“ðW³@Aïp²€ @Aßn=xJ@AÏÞ~²O@A¾SAz (@A­<tío@A›Ê€¦4@A‰ý̘( @Aw؃Yk@AeYº’’@ARƒJud@A?U9¸Y@A+ÐÁå_Ý@Aöiö0¾@AÆî5j‹@@ïC úǽ@@Úk‘ @@ÅAq’@@¯Äq‚6¥@@™ölOÒx@@ƒ×¿£R‰@A<ÏiŸÔ@ANC¢Dté@A`­‚Ûø@Aq„@D¥ã@A‚«k~f@A“\A¶¾ @A£¿Wßu¹@A³ÆD´«¨@AÃpa7Àä@AÒ½¸ö‘@A᫘ô J@Að;r,Ù@Aþk÷Lä@B <ûØP@B¬žÄEë@B&»•'ðh@B3hßÀ*‡@B?³ðY‡@BKœ< ¡Š@BW!;bË@BbBjc%@BlÿH¹Æ@BwWYËg@BJ$ÒúL@BŠ×4øh¥@B“þj¾#@Bœ¾ex@B¥°¥Xb@B­ –ļn@B´“¸ ?@B»µ¹*Ç @BÂoC\­Œ@BÈÀTd@BΧ¯#Þ0@BÔ%ú é¤@BÙ:£#S@BÝåi½ï@Bâ&x6—@Båün[Ü@BéhGBÛ@BìiuÑå@BîÿÑ—@Bñ+<1Ïž@Bòë™ë…£@Bô@Ô 9ü@Bõ*Û„›˜@Bõ©£<@Bõ½% ˆ¬@Bõe`tãU@Bô¢Y§E~@Bót<ö@BñÚ±L¶@BïÖ2S¨ @Bíf·[á@BêŒ^ÂæE@BçGLS¤m@Bã—¨ýT?@Bß}¢Í×=@BÚùlæ3@BÖ ?m…ª@BгW…ÓÁ@BÊñ÷;ÄŸ@BÄÇexGE@B¾3íïý@B·7áÖO@B¯Ó“ô¸@B¨`D3‚@BŸÓ¤,Yé@B—8ÂD·<@BŽ7!z}ÿ@B„Ï,ùïe@B{T @BpÎ 5‘c@Bf5ưe@B[9ÀV/@BOØCbc1@BD=|±@B7ìЇÖ@B+c.ëÐM@Bw­l‰É@B*ÜJí@B}Nå­@Aõo›¥E@Aç[Ö‚@AØ6+”à@AÉ ©§Š@A¹ƒwkl}@A©ž8²Ê¬@A™\“¨?z@Aˆ¿0³ŠR@Awƺ\¯…@AfsÝ/«–@ATÇG T³@ABÁ©îrÖ@A0c¶ Á@A®x7G@A ¡›7œz@@÷>ߦ@@ㆤfE£@@Ïy¢E<Ù@@»“!?[@@¦d1ÐcÀ@@‘]:Þ¡@@|hCº0@@fZy¯$@@P`, ‘«@A œŸŒ@Av+‹@A*½øº=ó@A<w8'Ö@AM EÝ¡Â@A]­ºÜI@Amó.\ׯ@A}Üúšˆ»@Aj{þ N@Aœ›<<@A«nk-ß@A¹âþ%q–@AÇù¡5‡@AÕ¯èÍiê@AãÅm4Ä@Aïý$3r’@Aü’vÞ c@BÆ2Q¯@B—α׻@B Ç»@B+›µ–m@B5ºÍÖÎ@B?þäMÛ@BIÞh\š¹@BSXèæ[@B\möAÜþ@Be'f4–@BmfÙ^ @BuH_¼‡G@B|ç|ã„@Bƒ×“è/>@BŠƒÐ@e™@BÈ N@@B–£üu"@BœY¿éÑ@B¡!áõä”@B¥ÃW¦å²@B©û‚:X&@B­Ê-ü,î@B±/,(Õ7@B´*Rø"È@B¶»}§Ê@B¸âŒ€7ª@BºŸdãG@B»ññLca@B¼Ú!VŽÃ@B½WéÂR…@B½kDvþî@B½0„dÎ@B¼R²#b@B»&Ò³?@B¹ º¾@B·/ác @Bµ%˜ìwq@B²Pù¸Þ>@B¯u4­@B«j3Sèÿ@B§Xa U³@B¢Ý0I×@Bø×Ûï›@B˜«“ryJ@B’õ£Šìc@BŒ×MbŸ@B†PÚç@Bbš¤ú%@Bx ß·s@BpP³,|@Bh,\–ÔÖ@B_¢P³>È@BV²B˜) @BM\šþ#z@BC¡Æ°@B9‚6tAã@B.þ^ôRK@B$¸¥I@BË¿®’<@B óн@B ØK¾ì@Aô›óÄÒE@AçÈÐ+ú±@AÚ”ú¡;‘@AÍYŠê@A¿ }ƒŒ @A°ºÿ,@A¢ !"À@A’û~ÝðI@Aƒ¶_`³@AsÇh@¿@Ac£6Í4@AS#Ç|ý@ABIÁ=£´@A1Í,Ÿ#@Aˆ–IhF@A ¢É_ @@ûeèG‚@@èÐ(õ;@@Õä·ÅŠ@@£r&¦­@@¯ iÆ @@›"A:ݨ@@†ãÁ…W@@rREY¤@@]n†oLz@@H9=sƒ@@2³$<™1@@ÜõB-€@@Ñï 1ø@@ãÕ9ýÏ@@õcx>ÿ¡@A™'†Oe@Auž¦©@A'ø70©@A8 L©4T@AGí<¤ )@AW^fÞyz@Afs-Z(W@Au*ôwí!@Aƒ…#¬ö@A‘"š6º@AŸ_.;@A¬\G¸2¢@A¹:N—X@AÅ·æê®)@AÑÔŠIg@Aݳ?ô@Aèèà6å@Aóß’þ-@AþsPäÊÂ@B£¢Ò£@Bp_+ @BØ8êKÈ@B$Û¡²”7@B-yçì¬@B5²§Ö+@B=…Ъ3@BDòp`-@BKø’К@BR—/q,6@BXÏ ²v‘@B^Ÿb|Ñ8@Bdñ…ãÌ@Biw"Xd@Bm ·Tds@BqÐzÙVr@Bu—6!H@BxõÆÂÞ×@B{êøµCj@B~w)üŸ@B€™Á,ö¤@B‚SÀƒQ@Bƒ£ã_T@B„‰c•’@B…/Ü%@B…cô@B„ÂþaÍ@@B„Õ'÷@B‚Ù}D±M@BFxÝi@BJ Ï@B|äHGÒl@BzQnož@BvÝG[¹=@Bs5þ¨Í‰@@)u77%4@@c6U—4@?þe.âk@?ÒœÆij@@œËk_B™@@®’Ik@@À^]}Œ@@Ñã±£@@áÖäàÔž@@ò;ä1¸2@AFÞ¤p·@A÷5×@A!LJxÃ6@A0E„S @A>âI}œ8@AM"ºY@@A["a-<@Ahˆ®“¾@Au­DŸ¸@A‚s0 *×@AŽÙK¿kH@Ašß’;©@A¦„ƒµ @A±ÇœÒ@A¼©f/T@AÇ(æL‹¯@AÑE© U@AÚÿ=zT @AäU6{7N@AíG*ºF.@AõÔ´ÅM*@Aýýs j¼@BÁZwö@B  Âk@BVR ú@B©iÕ:@B ÕÔ¿ž@B&™ç{D¦@B+÷ÇWsÅ@B0îg@Ù@B5}Œ¡w/@B9¥‚Îþ@B=d”™îÿ@B@¼RƒN@BC«gØá@BF2]#Å@BHPÚø“¥@BJÇù@BKT¤}@BL8¢Z‘Ã@BL´uc¥A@BLÇ‚ðÓ@BLqÊlª@BK³Nìæµ@BJŒQ8¹@BHü: +w@BGÁé@BD¢ÆÊµ!@BAÙg·Š¡@B>§Å%¡ @B;+ݯ@B7 R¥4X@B2¢Ý&ü@B-ÑØö=v@B(™~ûÿ @B"ú ¸—ž@BóÄ6 Z@B†ëù{°@B³Îó±-@Bz¼pÇ@BÜ@AøØ „Ó @AðoÞ%@Aç¡¢Û@AÞoý8ªg@AÔÚ–*GÕ@AÊáØ­õc@AÀ†4A|X@AµÈ œ@Aª¨ºø‡@AŸ&n‚‘Ø@A“CÐíГ@A‡®Ò/…@Az]Œ4Ž;@AmZð06@A_ùdÝœ8@AR9w8ê@AD·W@A5 ¶Â\@A&É sËË@A•L¥×û@AD µ@@øþ‚Q4@@çשÂâ@@×9¶|pu@@ÆBÇ K=@@´ó€¯H@@£L‡7?R@@‘N„‹«Å@@~ú!Z‘Š@@lP|–‹@@YPæ-Ê-@@EýgõOþ@@2VÑ"Ä@A¹ÅÞ&l@A$‚@&y…@A1íð~k@A>ùÚ9q@AK§æÎ߯@AWöÀf W@Acåä¶@AotÔŽsŸ@Az£ðâ@A…p*%ÿ@@AÛ¡ØÎë@A™å )­{@A£‹ñÆ¥U@A¬Ïñý@Aµ°Ÿâ¤@A¾-›Cý@AÆFƒÛn@AÍúþZÞ@AÕJ³x7ª@AÜ5P›:@A⺅^*@AèÚ¦ú—@Aî“‘—@Aóæàn™ß@AøÓ¶Å3*@AýYÛJ—M@ByK" @B1@£ih@B‚%Êàd@B k¡Ý~à@B í’¤i]@BÚ”c@Bºa_L@BÍ#7@Bçݽ³@Bbº\Ê@Bu¡þh3@B “Ù@Bc“˜$¨@B>ª6±@B±å!Ƙ@B½V£Fü@B aÇÐC@B >Yõ@BqðÚ N@BßRzÑ·@AþåG$@Aú„Ï!Dà@Aõ½KªÛ`@Að:G™@Aêú×®–@Aåbn&n@AÞ !]Žf@A×Ú] Â"@AЯbñ¬n@AÉ„ºÂ`@AÁ+3·Ñ@A¸Òw8u·@A°ÿ¡Zì@A¦ö/ÐM@Asz9h@A“u×JË@A‰E›Hϰ@A~›øeèS@As‘DÊÖ@Ah%-dB@A\X÷“—ž@AP,Ýݲ@AC¡all@A6·uð†@A)nT!¼,@AÇÔo<@A Ä͇@@ÿc¢”§ƒ@@ð§È‘@@áŽö#ç@@ÒæiÀï@@ÂN{¤k¯@@²'Q?¸@@¡§Ê•­@@Î3/ç]@@€Jáü@@n÷@@\7¾ü‰@@J~¾FA@@7x¯Žï,@@$š<.¨‰@@gÎç±®@?ûÄ&ré @?Ôk‚ã@?«¾ÈIè@?‚Ç™ðß„@?Y/?[àY@?.÷õøo@? ˆ‹ 7@@2l‡Ñœ‰@@Cõ¯…Ô@@U' ÞEÑ@@fñ¤a@@v„ï¯ì*@@†¯ýìº@@–#þ@@¥øìKëâ@@µ˜¿øò@@ÃÙwú–a@@Ò@÷Ã#¸@@àLˆEx)@@íûœ*?Y@@ûM¨¯C5@AB%¿š4@AØŽ ±Y@A!_!(ï@A,é‚{@A8b@¾c@AC{[†û†@AN3óÈ‹¡@AX‹–¿øZ@AbÕÑ@AlBÚðà@AuHwÏ¢I@A~FK@A†„¨Pˆ-@AŽå͹½@A–3n}òÿ@AtíF:@A¤RHcÙ@AªÊŠç„¡@A°Þä–¯@A¶Œfg¥¹@A»ÕAÜvð@AÀ¸jQb@AÅ5¦îì@AÉLÅ.{Y@AÌý•º×k@AÐGî¶@AÓ+¨1õÅ@AÕ¨¢·êì@A×¾ÀмŒ@AÙmêJ»@AÚ¶ ˜¸ƒ@AÛ—Ö[¹@AÜþËlõ@AÜ#Àî@AÛÏ[d1/@AÛÒQ@AÙñ-PR@AØgz| @AÖvËc0'@AÔ6‡c˜@AÑ`× éñ@AÎ;̯;‡@Aʰ;Äl@AƾM)rÝ@AÂf.A»·@A½¨èÃ@A¸„+i{@A²ú¸oðõ@A­ ÷8Â@A¦¸*im7@AŸÿš/¢j@A˜â’Sq@A‘aa»|@A‰|]'òk@A3ܬ@Axˆ:W@Aoy×bδ@Af Õ@@A\6^Ûë{@ARÝns@AGl¸®Å:@AñE$}ž@>ÇR¹p©½@>œÂ}HâÙ@?úcbÂã@@›–éF¡@@¯[Cnw@@0l`ÜÉü@@@Ò ;+X@@Pßôm@@`”ï„*é@@oðùæ¶J@@~óO-C@@›]×Dr@@›è–©·Î@@©ÚlÆÌ5@@·pUÅv!@@Ä©ÉÈñ}@@цC˜&a@@Þ@´è’@@ê&As ?@@õèÉ2g@AL]Ń@A Pˆçã½@AôÖô º@A!8ש!2@A+U@A4ž@Ñg@A=¾ÙÇžÀ@AF}†•,@ANÙèvϺ@AVÓ¤cpª@A^jcZé@AeÑHß»@AlmŸsNc@ArÙ‚-=ª@Axá2°@A~„kç€@AƒÂðŠôd@Aˆœ…!§@Aó{¬@A‘ ÎS@A”É–5¿m@A˜ sö u@Ašë|9î@AcŽ_8ç@AŸuŽAJ@A¡!d?5™@A¢fý@ãè@A£FJ»:ž@A£¿B³HŒ@A£ÑßÀsV@A£~! ¥ò@A¢Ä Y8@A¡££õ€f@A úÄ<<@Až0 6‡H@A›Ý*G«)@A™$3xž~@A–ZÊD@A’€Ã¶´!@AŽ––)“1@AŠFþwzI@A…’-Ttå@A€xWÉ™p@Azù·)Á]@Au‰f‰@AnÏ«Ô@Ah#V—<@AaS¨„C@AY¡ªÕo@AQËäìV@AI“XÒo­@A@ø`«ç4@A7ûYxµq@A.œ¤Qw•@A$Ü¥éÓÌ@A»Æ|¾¤@A:q¸@@AY¨Á@@ú'£ê@@îx3Ã@@âyfý"@@Ö‰².@@Ébð˜Ž@@¼JN3]"@@®Õõ·ø@@¡~h$ï@@’ÙqÂl@@„R[¬É@@upÊʉl@@f5O‰Ì–@@V |æÀ‰@@F²çæ‰S@@6m'•†d@@%ÏÔïÃV@@ÛŠÉ~õ@@å·Ïx@?ãáòÔ×@?¿ö ¿-ª@?›bnŸ@?v&pe7 @?PD`¤D@?)½1þû@?’0 À†@>ÚĪ¸Ì€@>²Uòkº¼@>‰GY¨†±@>_š4‘MF@>5OØ»À@?ßüü¦@?²uêÅ—,@?Ôap¿)f@?õ aš»·@@ Æ:» @@ âò$@@*¢ïd¹@@9ã[™ ò@@HÊ•ê8@@WXÉÜÅ@@e‹<龨@@sc“Pº@@€à‹r–@@Ž FŽ®@@šÆO]úá@@§.úÆ“@@³8€%Àù@@¾å Ä´'@@Ê3A°=Ì@@Õ"°É`À@@ß²çÆä@@éãv±ªà@@ó³õ*a6@@ý#ûLx6@A3%Zfg@Aá¾ø@A-gàä@Aʳ.w@A&ŸæHƒc@A-Åi#OA@A4ˆŸß@A:çrÁ@A@ãhŽM@AF{§ƒÚ´@AK¯ñ>X;@AP€ 8‰µ@ATëÃMÛ@AXòäÃÆl@A\•DW©¯@A_Ò¹D¸Ì@Ab«NV@AeV”7@Ag,C™.–@AhÔÏI  @Ajæý‰R@Ajõ|‚N•@Akm†úµ@Akþv=@Ak,äÌúg@Ajt<Ät˜@AiV|†O@AgÒfŠán@AeéUø[²@Acšò=GT@A`çU<Ú@A]Î?¤Ý@AZPìí!@AVnkDH…@AR'C“e+@AM{¥nØ_@AHkħ"2@AB÷Ù>ö@A= Z×Ü@A6ä×> r@A0FE3ìÖ@A)D±†™!@A!àhoJ@Aºã6@Aðú5ÑÕ@A f€£P–@Az¨¤ê@@÷-Ñ(ü@@í€\¨—Ð@@ãr±™>@@Ù7½–á@@Î8]C…‚@@à ‘€n?@@·‚Gs¦÷@@«™õ,¯‡@@ŸTµ¼+@@’±ýõº@@…±•Ãwì@@xUù}D@@jžÎCïÄ@@\Œš¼Ù­@@Nè©g@@?YAŠes@@095eJ@@ ÀR•gÁ@@ï,§]@@ÆU“ô@?àŒÊ-±¾@?¾ßäË«@?œ‡.aõ@?yƒÜuÙm@?U×)n¼‹@?1‚Qê@? †“ñcØ@>æå2©¬ø@>ÀŸr Þ@>™¶˜žÌú@>r+ï?V“@>JÀštó@>!6Y2ˆ@=÷Î-ÖŠ@=ÍÉ.ï’@?%LS:µ@?G¦Í zZ@?iVÈ_¨>@?Š[áf@?ª²œ¤“@?Ê\3sã@?éVZÅÞ@@Ð6/µ@@œR £@@!¯½ñÙ@@/) ÿÍ@@@<èò”˜@@JLZÕçR@@WUHd´@@dcçý@@pS0RÛ@@|G3QÌö@@‡Ýõc/o@@“ë¾'@@ñçKfü@@¨n6ñÒ@@²‹…r’x@@¼Ij˜ø¨@@ŧ{}Œ@@Î¥hŽ¿5@@×BÁ¸Š@@ß2_Nc@@çZc€Ä&@@îÔ½ºB@@õë½m'@@ü¡Jª»O@AôagQ1@Aä½v q@Arš¹Q@AœH–ÆW@Ac5yÅ@AÆWI@A Å]ý¬=@A$`¢RÙ@A'—¿µ$@A*j’½Ëä@A,ØüIP«@A.âá}F:@A0ˆ+ÎSq@A1ÈÉà<@A2¤«@í×@A3Èý@A3.—¨@@¬&íÔf@@¡ÍgÄ@@—’œ‚7@@‹ý·Z@@€ˆü]$@@t¶ÕõŸä@@h‡ºW: @@[ü"ÐÜð@@O‹uA‘@@AÑsSO@@43ZÚ€_@@&:ÆÐàº@@è=1;I@@ ë©1N§v@>Ç’þ\×¹@>¢Ö²]«Ó@>}u‰;(A@>WpÁT-@>0É›T×@> Z ¦ç@=á™B:×o@=¹š‚Ã@=î«%üK@=f.½î›†@>º««ˆ4@>ÜÊ-!Þ!@>þ?ØJ@? 4wyÆ@??'l›¾@?^˜˜;™–@?}[›6(Ç@?›oZüP­@?¸ÒÁ uo@?Õ„½mhø@?ñ„Atæ@@h!ä§Õ@@³àÅwZ@@ ¤Ý˜×@@-:›P‰@@9tŸ @@ERrdÛ£@@PÓŸÚC@@[÷³Kÿq@@f¾?ýs®@@q&Øîes@@{1ˆ@@„ÜŽR5ã@@Ž(â-ß@@—±å>@@Ÿ¢žûeD@@§ÏSk­â@@¯›y@•µ@@·¾÷ @@¾Ö®BL@@Ĺv6x@@ËWL'@@Ðå6ÄMW@@ÖgÖ`@@@Û‡û¯û@@àEmë]N@@äŸûþSÀ@@è—vd@@@ì+²Hþ@@ï\ˆó[ã@@ò)×Í @@ô“€iÅ€@@ö™h‹Á@@ø;z22@@ùy£‹„¿@@úS× Ì©@@úÊ eÐ@@úÜ;-]@@úŠfÁNW@@ùÔy–`@@øºÀx¥Ú@@÷=À½@@õ[g“é͸·L@>Ç'ØhQ@>¤žP€ @>l‚!•d@>]”~a>@>90Ò‡³@>õÌ)3W@=î1Š0È@=ÇË¥3|@= ÅZ­I@=yéfŽ@=PÜ’,@='ü—|<Þ@<þ=aÑ@>OýdIE@>qàaO˜ý@>“¤ˆíA@>³« )}n@>ÓuÁç„@>òÉÈhss@?Uêâ§Ó@?/3ÈÎù,@?LbQ·¡@?hày®Þ¯@?„­8“©ì@?ŸÇ‹ QÕ@?º.r¡s@?Óàõ6"Ê@?ìÞøñq@@’~”Op@@ZT(88@@Æ8 ¥@@$Õj™ç@@/‡Íä ì@@9ÜÞÓa@@CÔ6 ÍF@@MmoÍ®@@V¨+ßa@@_„ úö@@h·GJ@@pÖ, @@wÛ±{@@8'(y;@@†4½0¤¯@@ŒÐ«Þ@@“ Y¾Iô@@˜äÚDíæ@@ž\ÓâqL@@£s 2ž@@¨'P«@@¬yk,œ@@°i0ˆŠ5@@³övKÚ×@@·!ŸYÑ@@¹èï·S¦@@¼MãÙò›@@¾OÙeJd@@¿îºÔ‘Í@@Á*vĈ@@Âÿ÷ß@@ÂxMU©›@@ŠYóÈß@@Â9%_ @@Á„²?@@ÀmŒ^q@@¾ò4r@@¸/jiƒ@@µ(² “@@±¿I E@@­óQ ¢‹@@©ÄôÉ ã@@¥4^æó»@@ AÀRý@@šíMQD @@•7>øŠ@@Îo:Þ@@ˆ§>OFG@@ÍÑ)íé@@z“Î2qº@@rù€>±t@@jÿ5¸ÃŸ@@b¥@÷@@Yëö)E@@PÓ¯Oýùõ—ó?@>Þÿ2Ô{@>¿XŠ‚+ð@>Ÿ2wV@>~ ”0ùÔ@>\cÒT>k@>:`È @>!yHúX@=ó‡4ïF@=ÏHqý£L@=ªf`½cT@=„â3ïcÇ@=^½ ¤«Ô@=7ø^|6@=•%„Ú@<蔲œ@<¿ø@n¨@<–ÁÚ{@=åAÕØš¨@>é½®»z@>'éÎ qž@>H@é¶i@>gíöÙ§ß@>†ïßÈ~@>¥E´T8@>ÂíùÎ48@>ßèt,U@>ü2Ò×Sü@?Í8q€À@?2¶E-–@?Lìÿ­=@?fprÝ@??¯CÁj@?—YÊ.X@?®½Ýà}@?Åk º=ü@?Û`sÞŸj@?ðFûæ^@@Yð¿A@@ tø¨ÝT@@üÀ;@@%k·™ÿ@@'ð†Njå@@0]Ì¢¬@@8jÅvM?@@@CíÄ-@@GhCBÞ;@@NWy–¹@@Tæž@&A@@[o¬†Ñ@@`ã­™];@@fQ Bi@@k]‚¿fÉ@@p­@ŠÐ@@tRjçG}@@x:Žè¢U@@{Àð]èO@@~åjL˱@@§Û®Á@@„'w˜8@@†4›MJ@@‡¡îc@@ˆÛBá€K@@‰²&@@Š&ŽÏÆ@@Š8x>Á±@@‰çá¥y§@@‰4ÎX¿ž@@ˆE¿Î@@†§SOI9@@„ÍïJ@@‚s vå@@ñ°[_@@|ðÚ@F@@yŽÖÁ'@@uÉu!Èó@@q£1s§÷@@mp-ÿÁ@@h2`‘,l@@bè5²ó@@]=&t|Â@@W1mw˜@@PÅIZØ@@IøûH ½@@BÌɲ}M@@;@ý~´¾@@3UãZ@@+ ËdÑø@@"c #ì@@[ómkW@@öä`§Ø@@49M˜­@?ø(¥P ˆ@?ã/'êÓ @?Í|ÇvfD@?·VÙ‚ç@?Ÿð®±ôø@?ˆ­/6í@?o‹5ìƒW@?VI1ÊgÕ@?êF‚„à@>ÍŒqb`@>°"í[‰‡@>’ "4¸Ò@>sH¼wBh@>SÙÍ{”@>3ÀjO¯ä@>ý«Žêý@=ñ’­9ƒt@=Ï€ŽŒ’Ñ@=¬ÈqÚ‡@=‰k|aiZ@=ejÖ'Œ@=@Ç©Ð^Ù@=ƒ$w½Y@<õžu‹,Ý@<ÏΣîK@<§ùca‚è@<€;iD«É@ #›/@>9*Ά^E@>Vž02„@>sdC'Ô@>|Ýïœ@>ªä{ó@>Åœ©´Ì@>ߣ…^$@>øøfÇ)@?š @?)‡Ó' o@?@À¯§mÚ@?WCÔ§ô‘@?ml»X@?‚%¥’'@?–‚¶>£7@?ª&Ù5Ä—@?½O„·È@?ÏA`Sù@?à¶Y¨j@?ñod¡%@@¶+Ò×á@@V QëÉ@@—÷Nc@@yô£@@û¨óE@@#Ÿ e@@(á¶:L@@.D³ Ù@@3G`K  @@7éˆûâb@@<*þ &N@@@ “ðm"@@C‹"ríì@@F©…ƒæ@@IfœÜ¯Ó@@KÂLX@@M¼z ô@@OUHJb@@PŒ–û@@QaI{ú+@@QÔÏ×C¹@@Qæ–pŇ@@Q–œC)@@Päåt¿@@OÑxZ‹@@N\`vkp@@L…¬ñÉ-@@JMpéù:@@G³ÃkÉÎ@@D¸¿nòµ@@A\ƒÐÂ*@@=Ÿ3N°@@9€ô|FÁ@@5ñÂo@@0"YOl@@*â]ˆC@@%B2²¹@@BcÚ@@âèîµòv]@>Ï(ršäÐ@>´°œ¬á@>™ˆ&Û1d@>}°oú‡@>a)=%íï@>CôÅJ€@>&¤(ºÊ@>†â¾¥@=èOŒ·DÞ@=Èn±¶µÔ@=§ådäwY@=†´¼Æ÷ð@=dÝÓ@=BaIJ[þ@=A±Bd@<û~»H’„@<×ß @<²¾—úñ@<Œp XKó@×!ßÿ*@>"¼N(íP@>=ó9*x½@>Xzï7À@>rR€O(ì@>‹yC$â@>£íŽÜ ò@>»¯Dþ£ @>Ò½Hb@>éÂÛ'@>þºâ1%T@?¨Ús'@?'ß儘ë@?;_BUò‚@?N&6*Ëñ@?`4 'íÍ@?qˆfb@?‚!©ä‚—@?’&ÿê“@?¡"ñ6Õ¾@?¯‰srJ=@?½3K\f@?Êm%bŒ@?ÖMÜGZ@?á½òò|á@?ìo>{ß@?öaS_=@?ÿ“ÍT¾:@@'±àÿ@@ÜAúR@@ Up”—@@miÁŇ@@%4bþ@@|R’Ê]@@r¬gÚ{@@-Ì^m@@<Ɔ—Ò@@j;³@@ƒo)«@@”´Š}%@@EUØ ê@@”÷†=¢@@ƒ ¦H-@@\*Í@@>8å´ú@@ I…I_@@u¤@@ €dbá´@@ *§&Ô@@tŽÐU@@^A2@?ùÏÎÔä/@?ð#]æ8°@?å·‘®‰@?ÚŒÑ ò@?ΣŽÂ@?Áü?WÞ@?´—bøe@?¦u~??@?——¯C\@?‡üÑbø@?w§5~g/@?f–èÏýC@?TÌ‘Šœ)@?BHÜ)Ú"@?/ {Rï‚@?'µ7×@?lŸéë @>ñ ¨S÷@>Úó ú5@>Ä&—l±@>¬¦"›$÷@>”r†³Øq@>{Œ¢ÿÖž@>aõ[¾`ï@>G­š2œ@>,¶K‚nè@>b‰F­@=ô¼Õºa…@=×¼Ÿ÷§@=ºÀ6¾@=›º9_~ø@=|º"šl@=]TÓý—@=<ÁEf8@=ÊR 1@<ú.3?ƒ1@<×íÈŠ›!@<µ ,ÏTÌ@<‘„}è\@ùÚcy—@>òuXJ_@>6:9Ÿ¬ø@>MÐJÆî@>d³ÑT1Á@>zãúéT»@>_úf`ì@>¥' z@>¹8aš?@>Ì“Jv¼@>ß7 Ʋ/@>ñ"ô’¶Î@?VYã1”@?Жßà@?"‘ èÙú@?1—#º{È@??âI€è8@?Mqòö.j@?ZE›zÇ©@?f\Å-ÍÎ@?q¶ùÛ@?|SÆÞ@ø@?†2Åf@?S“6Ú|@?—µÔÆzâ@?ŸY6ŸÑ¡@?¦=l]åÕ@?¬b0ñº™@?±ÇF¯tt@?¶lwZœ@?ºQ”.û@?½vuéãì@?¿ÚüÕü$@?Áʪú@?Âb¡4Ò}@?Â…¥)@?Áè¥Î@?ÀŠ bcô@?¾k}ÏÐq@?»ŒÄNÖ@?·íV8û@?³û¯Zd@?®nª3Ê@?¨•K–@?¡ð÷ïÔU@?š“-3@?’v4»5l@?‰š©¦l@?€Ëˆãh@?u¨ùÕ›~@?j“›•=@?^Áí¦s@?R1óØ›@?Dæ›A @?6ß•VÝ$@?(j÷/W@? «–#:@?ií$bÇ@>÷yËôåÐêËŸ@>Óoñâ:§@>ÀWŽ*Ó@>¬ˆ{[M:@>˜lÑ8Ç@>‚É%%‰M@>lÚjSÚ@>V8áüv@>>âËóy“@>&ÛŽòg@>#*…ž@=ôº~8aœ@=Ú¢nS0@=¿Ûã»]@=¤gËʯ@=ˆG-ñJ@=kz¾ÁÎ9@=N¹iÿˆ@=/ãï{@=¥ØÖö@<ñ¨žI˜Î@<Ñ÷ÙÃ@<°Ó¾o•Q@ «¢fö;@>!ÿØ1À@>6 O3Ñã@>JŒIލ#@>]ÑÑÚ@>pCëJÀw@>‚2Œ“\@>“!= ¸@>£|i„Åm@>³Ć@>ÂÁ×(\@>Ð8ʆÿ@>Ý®­O‚@>êiéÆ\q@>öjb@?®ˆ¸¬9@? 7 &_ @?á®ô@?jN @?'d‘ÎÔ@?.ùDU>@?5Ð6ò&€@?;é&"ÀŸ@?ACÕX@?Eà]lá@?I½¨¬*U@?LÜx*“‡@?O<_Ø6@?PÝH4O@?Q¿ ·½¸@?Qáàï&š@?QE‡d‘Ë@?Oê+ÿ”@?MϦÆ%Ç@?JöBÞŒ@?G^„/&@?Cªèp@?=ñ¬ãS@?8çºÜ–@?1Œ§ó@?*ú˜Î|µ@>îÜßÓÖq@>âe¤2}@>Õ3”F—õ@>ÇG/a¢È@>¸ ûa9@>©A„–yÁ@>™)]®=²@>ˆY•ðT@>vÑiaLø@>d’à.ƒ›@>Qž/ ¨l@>=ôÏYæ@>)•©*@>‚0êOÖ@=þ¼ù?@=èCU&“¬@=Ñùùé@=¹=¿i޽@= ²|ÒH@=‡x »ñf@=mNÃÇ-@=Rù'½Ì@=7¶~0~ˆ@=È@ô&z@<ÿ/`LÒj@<áìÑ(¼@<ÄŒKâI@<¥nŽ3z³@<†4ÖêàÂ@Lîó³@>õÞdéJ@>#èÕ€H@>4%6u°Æ@>CªirœP@>Rwܼ[Ý@>`Érä@>mé\Z Ø@>zŒds@>†u¥¤‚@>‘¤«Ù¾@>œ ÜvÃ@>¥Òf‡o¬@>®ÐXqú@>·‹½}Æ@>¾˜±h®@>Åb€ç¹@>ËoµÓLJ@>ÐÀ¡m*@>ÕSq°7”@>Ù)—O–@>ÜBbüÂÐ@>Þ¶iFÒ@>à;z€£Õ@>áŸl¥“@>á>˜XÏ@>à¢ð±¦í@>ßJ!©•V@>Ý3¼³(s@>Ú_Ö@êÜ@>ÖΊ½@>ÒúØx4@>ÍtRÛËÂ@>Ç«ÃHý@>Á&„yƒ@>¹äÕß…Ž@>±æýô£s@>©-J-˜>@>Ÿ¸í ü@>•‡§tá@>ŠœuÐèž@>~öâÍo@>r—]ÜßÇ@>e~]W4@>W¬\Ñ(@>I!à-—Ý@>9ßp^Ê@>)åœáµM@>4ûT‘â@>Î'\ÖQ@=õ±ÂŒr‘@=âàtF=D@=ÏZ顜ø@=»!ÕMx@=¦5ïryü@=—õ”­*@=zHªtˆ)@=cHÕïeï@=K™Dßø@=3:Èûq•@=.8µPS@=todv@<æK¬Œ°@<Êü²JX"@<¯@‹át@<’ÚÁøuÄ@¯a@;v¤•Ö€@;SDd4ˆ@;/Õ†û€@; É3-U@:ç id%@:ÁÜG©¸@:›ýæÕ¢X@:u†aàÿ¾@:NvÕ’ ›@:&Ð`_ܺ@;cדڕJ@;„%œ4×À@;£Ñ£™@;ÂÙj†{@;á ­çÓ@>±â7¥@>!™kíÍ@>+ùÝN2Z@>5 £·h­@>>cxÉ@>F¿Ç®æ?@>N7‚ÿ`@>TôK=@>Zõâ­Ý@>`<Àý@>dÆœÈÌ“@>h•aÔƒ@>k¨6þU@>mÿÝrê@>o™¨$æ›@>pxXóè@>pšXÝ…@>pW¹@>nª ­@>l—ÀÝå@>iÉK °@>f>ÛöàÊ@>aø•dƒ@>\öŸX«I@>W9+N(@>PÀoJ—Ó@>IŒª rG@>Až <-@>8õ™Žò@>/‘ô§îÉ@>%tþ£~s@>ž›p©@>1ŠÔÌ@>Ç-ò Æ@=õÇS@=è-Ë>Ú@=Ù +!æy@=Êz‚cªà@=ºž¿òHZ@=ª v1o @=˜Ç=m¿C@=†Ì³Âó@=t}?¬@=`½B‘ø3@=L©³[|@=7䃤~ƒ@="nlö§Ç@= H.«~@<õrŠwÍä@<ÝîJøìö@<ż<é@<¬Ý2U©D@<“RÔ3g@Ã@=ô9“p<@=øù‘@=û ôÇ«ì@=ý`?…ôF@=þ÷Ñ%B@=ÿÔšíU@=ÿö“hÚa@=ÿ]º–«Ÿ@=þ ¹"b@=ûû±mÛ³@=ù2¡@-@=õ®ÿ¤ÐG@=ñpíö¥@=ìx”o]@=æÆ"Ÿa@=àYÌéÑ@=Ù3Ñrw@=ÑTsó@=È»ûöÀ@=¿j¼´Þ@=µa ˜¶ú@=ªŸIm @=Ÿ%×l¾š@=’õ!4âE@=† —±Œ@=xo² x@=j팈+@=[͘R@=KTÛ†¤É@=:⦕†@=)¼ÃÍKå@=ãÍèÚÒ@=Xe;¶@<ò/—’h@<Þ,Ø19ò@<ÉŽ„Ê®@<´?‹9Yp@<žB×@<‡–?Š{#@.ØL7B@2s@=A~çÈ•"@=K·üƒ‹à@=U:gj@=^éÆóî@=f^¨>@=ms^búS@=ttv@=z(ËÔ@=3$µW@=ƒ¬Uò¿´@=‡l‰èåÝ@=ŠsœïÔ@=ŒÁr²U@=ŽUõ 6¦@=1첨@=RÎ’m>@=Ž»Ut-@=jÃ0Á@=‹_‘1i@=ˆ›Ù¼ J@=…öA½n@=€é_FÔ@={ú4i³©@=vR«gW@=oò¡™ÿ@=hÚP™¡[@=a üÎ7@=Xë®c@=OBn‰d<@=EKÙí…@=:ž‰”}V@=/:߈wZ@=#!DÐQ@=R%ª æ@=ÍøßNW@<ú•8I«@<ë¨dr2z@<ܽÜZ@<Ë´¢W#©@<º®Òµô@<¨÷*k_À@<–ŽHA;;@<ƒtÍè*¹@YE@;Œ>Ã9òÒ@;£î•ã@;º}·ŽD@;Ð!rÜ!@;åCPÊž@;ùÕVq@< ¹‚ü»Ñ@< ï+C†@<3u©SS·@@:àŽ`@9íhähÁ@9Ì åû1@9ª=S·á@9‡¾X‰–Ü@9d¤óK4@9@ò%$Ýu@9¦ñnë’@8÷Ä]“w5@8ÒKpñb@8¬=4¿+‘@8…š³î(e@9·XÐlº@9ÖÇÉ÷vÉ@9õ—À/‰­@:ÇÇý"@:1VùYRè@:NDok¾)@:jH¨Ç@:†6¦ì]y@:¡9¯žVô@:»—‹É‘r@:ÕOh<Îô@:î`u§sÖ@;Éè¶¹ @;Šú2¡á@;5¢çª¸@;LðÂ*À@;aÔ\ì\ý@;vìuè 2@;‹XŠªÃD@;Ÿîë¸?@;²)û=ÿÝ@;ÄŽ *iÐ@;ÖC‡H½×@;çIÑXeò@;÷ XXyö@<FŽŸ#ð@<;ëðTò@<$í“Â@<2j!‰@<>ñ@®˜\½@<«ƒ·ÇÇê@<­1€tÇ@<­ê ›y#@<® Dm§@<­uÔÈâ—@<¬)ÃüUá@<ª'Ó….@<§mô”Al@<£þ`û{>@<ŸØ‚8÷q@<šü}éæ™@<•j€b,@<"»Ñ‚@<ˆ%g®:%@<€rÄâ~¤@n4O@:•ôÈÕC@:+§(êpÀ@:CŒÔ@:YÖ~áø@:oòSÁÕ@:…f/ ÛW@:š0öÌKg@:®Qÿråq@:ÁȤZâ,@:Ô”DúŽç@:æ´Ej™@:ø(:¼¥@;ï@;».fº@;(tˆßЧ@;71öŸ¾¢@;E@‡9}¾@;RŸÂ×Ô}@;_O7qH@;kNw"ò@;v°h…@;:Ã&U@;‹' #F@;”a±ï0@;œêQâ@;¤À§@Í@;«äoB.Å@;²Uj‹‘@;¸`¤ç(@;½$ Â@;Áuyµ­@;ÅJ!ì—@;È pX‹q@;ÊEÒp„€@;ËÎ\¯Sf@;Ì£‹³l@;Ìù¯èÊ@;Ì0ƒúýç@;Êée€ô.@;Èîi‰èm@;Æ?¡*á@;ÂÝ%=Kö@;¾Çf¥@;¹ý²B@;´€¿7E‰@;®PÙ/5G@;§n2éª@;ŸØ£Å@;—Ò‘þ@;Ž–æu_@;„ë-a å@;zûTs@;oªå–@;cÀ™;}ó@;WQ-ð ¦@;J1Ó V%@;¸/´É@:iå0ó-@:ïIñ[P@9êϨC¼@9Ñ ÅâI¤@9¶¤lYÊJ@9›šhçŒc@9îŒ`ëÇ@9c¡«ÈÖ@9F´œ¹…³@9)(<<êÈ@9 ýg»ú@8ì5\¸ó@8ÌÏê3öÅ@8¬Ï )²@8Œ3OÙð`@8jý¡~¤Ë@8I.ïͳ½@8&È+à@8ÊIpý@7à6<ø®0@7¼ ÿ$t’@7—O‰(@7qþÖlŽ@7Läôl@8uP #@8”Z‹-mð@8²‰g}û¢@8Ðmœ@8íŽÕ5â@9 c'ùÞ@9%úëî×@9@,9&f@9ZŸÃ@9to¿ìó@9w&q«@9¦'v!#–@9¾ ýÍ9@9ÕMQÙÎg@9ëç»ÀLa@:Û‡ëñ|@:(LX™@:+Ì#\@:?Èy‚€@:S#g»_@:eÃðέµ@:wÂHÍG@:‰—¨I@:™½Nƒ‹à@:©¸ãw®T@:¹ѧ,[@:Ç©™RÔB@:Õ¿í“à@:âãÐ/–b@:ï{Z(¬8@:ûcóQö5@;6žÍÀ@;&ÄŒãª@;C3à@;$)^RLX@;,¡Ç^U@;4i5kµ@;;eë¯Ô@;AäR—ö@;G—†ö—@;L˜>8g@;PçO ñ@;T„+›©@;Wn´P”@;Y¦ÐlÕ@;[,lJ+@;[ÿz‡Ö-@;\ô,O@;[׿oÀ@;ZI*ä&{@;XQø)@;U¨P¦Î°@;RLK©-@;N>P´@;I}£Ïs×@;D MU'‰@;=ç2ôÊ@;7‡†E@;/Їž 0ÑÑÀEÜÎ3:˜ÀEwhßBOÐÀE“Ã~.IÀD§‚К÷ÀD<&8 ­GÀCÎn[7uÀC^JqâwÀBë«déÝRÀBv°M™ÀAþ»äÏùæÀA„L]•óÀA#s|À>ý‚ëAGÀ=ìNú€Í`À<Õ$™®‹À;·ï4]ÍÀ:”œë*^À9ké,õÀ8;iÍ?GÀ7vR`vÀ5É@gzÎyÀ4†ÊAÆ–JÀ3>! À1ï<„[À0šAýó~óÀ.~ˆf”‹À+¼Ã.3‹÷À(DNÀ&Jœÿ&À#3÷×Ú{À F“Úü(Àžé87C Àž`ü9$À ²¯ÐÀ¶À×r€^¡t¿áäàl?ïùr…ÿ# @‹OO‡æh@•"´$@ëÅ"Yn@Gª2Ín@!Ópbþ@%·Äo(·@(3®Ó‘»A@+bX¶˜~F@.Ž»w+@0ÛðÖ^Bƒ@2nn*x¡n@3þbFjÈú@5‹^‘­çÌ@7ùÿt<@@8šÑ¨•Üq@:‰K µ@;™Ë®„S@=JëSD@>…Àœxß@?óíðY‚~@@®MÓÄÚÎ@A_ÌýË>@B`9y°Ü@B¹öÒ]¤@Cbƒuž½G@Dü  µ›@DªY{ØYå@EI—ÁÜ@Eå´¨™N@F~±–&~õ@G‘\4;¾@G§Xþy-c@H7L0ÝÂ@Hü­µ†·@IMjôCŸ•@IÔ%,6ÙÞ@JW÷qùM@JØîÉÉ:L@KWúhAj@KÒ„j¸:9@LK@=‹î@LÁ[ u,÷@M4åä¸í@M¥îÅF¬@N…›%†o@N€»Ü\ò¿@Nê ±¨Qž@ORCóÇ.@O·µ[r"Õ@P ‚;APT@P> OS@@Pm¼x¼:@@Pœ^$ñ/@PÊ N=÷@PöÏÛÕ¢@Q"¬V‡ƒ´@QM«cij6@QwÒÓ‰9@Q¡)!šÀ @QÉ´ž#!@Qñ{m‚œØ@RƒˆWϹ@R>Ò»¶ò@Rdn©ƒ4]ÀF—ßff HÀF9¾ÎicÀEØWª-§HÀEu— ~ßÀEÅ•ÛÀD©ÔÔ^š€ÀD@¶3WMÚÀCÕ[ ÛßÀCg´ªëë2ÀB÷´i:/{ÀB…K°Â )ÀBlI`@ÀA™\îÉÞÀA©â}AÀ@¢w~e»À@#1á#|À?BdðùUÀ>8ÛN¸3À=)±gŸšœÀ<ÓÌľ×À:ú1f,0.À9Ù»Ã]ü„À8³gpõ.ëÀ7‡,QŸ,HÀ6UùÌÝ)À5ô )-"À3Þúœ·`[À2›"„I5þÀ1QyÅÊRMÀ0à­ß9À-ZG=Ñ!À*¤÷ìÜœÀ'å49ÚxÀ%ß¹¡Ÿ&À"F¢ÉÀÑ´-#æÕÀPÎÕAÀ%s UðÚÀ n1=j]Ñ¿üé<“›×b¿Óøx÷Ø?ó“UÀÖ$ª@;»Ë'>@+³ÐÃ~†@Yâ ²W3@ŒéW¥‹ @!á~íÀÁê@$ý(!Têò@(‡"­×@+2³YÒÿ@.JÆxà @0¯ïPÀ‚@28ŽÛ'r@3¾×¹ßü@5Bc54Œ@6ÂÏRœà¥@8?À ¶Àˆ@9¸ÞÛMd@;-Û‡—UŠ@<žlZ h@> NIN É@?qE(ì¬@@i b–œ@AÑ ïXŠ@AÃX½ggj@BlÜÃôÊ@Côª×jC@C´ð^¶’@DTþú§Ž©@Dò(_ú•@EŒBò7@F#rõâ×Ì@F·¯yol†@GHú÷¢äC@G×Z”—Ø@HbÕü¯@HërS—KÖ@Iq;Ú­D¯@Iô;÷D¨@Jt}÷xÜ#@Jò óá/X@Klø¯^Ê @KåKyo…w@L[ð–ñ@LÎ`•F+­@M??[Ñèê@M­¾ïžW@@Níõ!ñV@NƒÛúZð@Në•~þ@OQ*o Ê©@O´©¸ÔãÇ@P ¥&]‹@P:Ï©[z@Pi˜æ‡æ@P—s=–@PÄeml@Pðv¯í¬@Q«´D/Û@QF œã8š@QoŸŠaú@Q˜hìÃÙ@QÀpB*éÅ@Q纾4¿@RMöüÝ@R4/WñUÖÀF4²LÁzÀEÕ¯µ24KÀEtÃ-sËÀEß-qÄmÀD¬öUû•ÎÀDEû-ŠàÀCÜà)±+.ÀCq—¹ã’TÀCS¤±žÀB”H€CîÀB"&ì:ª.ÀA­¢xOŸÀA6®L‡«ÖÀ@½=í?+À@AEQ6À?…qøuætÀ>ƒ1&j–À={u* ¼¡Àžžrê{À1ÿŠ$´ô@À0ºû.O{À.âÞmÀ,Cÿ–2‚À)š¹LJµeÀ&çÕ®ë‚ÂÀ$+;ÖYIÀ!eNމ°úÀ,ù´V ÇÀ~ƒ×¢~bÀÀI÷Ú¾=Àæãå„‘é¿ødà™uÔ¿©w•žz?öø}]í@p]>²@ºŒ|D@Áðpïùe@ÎV=ÄY4@!îÆßRLl@$öõSÜg¯@'þßL¸Kõ@+®N º@. Œýe<@0†Ud-ØÓ@2’ꉡ@3‚»ÿ¤š”@4ýQZÚø#@6už5Î@7éyŠ[Û@9Ze ½,H@:Çy”ç¦@<0qvÐ] @=• Í\@>õæ\z@@(&’h°¯@@ÓHÃ\P@A{Úö€@B!Ͷx+@BÅôV­v@Ce›0~6h@Dc Wø@Džb†sГ@E6•q·âh@EËúöR@F^§3ë@Fî[& F<@G{]C¯v»@Hœ.îðˆ@Hsüt{@IëÓí×[@I” !hzÅ@JŒ—A@Js]—@K Î )Ž@K‚¨@„úö@KøëR@Lk PVGÞ@LÛ°b–ã@MJe¤;@M¶ëàð'@N  ½2@N‡ÀzÄg@NíhŸ²Y$@OQ ÷†Q@O²©"˜‹¾@P .Ô?S@P8°Úd@PfÎmЪ@P“.Öú"@P¿k + ž@PêÏ—èÆR@Qb@su@Q?)¯zr @Qh*èD ‚@QkÎ÷™Q@Q·ñäɇ@QÞÂ…!O@Râì-77ÀEÔ¦} ­ÀEt×-K¬ÀEËÑûºQÀD°Ô0%î«ÀDKã˱*ÀCäî£JgÀC{æŽoùôÀCÀžÉWÀB£oÕÁ‹½ÀB3çÝXã2ÀAÂކšˆÀANÙ7À@׌¡¼¬àÀ@^±>xRWÀ?ÆÊGâ¤À>Ë¡âùÀ1j×Ç¡aÝÀ0+G “&À-ÍDM7ÍÀ+:›Ø+<À(F½G˜À%ö¶þ¼ÄXÀ#GCEä”cÀ –ÉNÀBÛfÍÀ ¦~?¦Àm\„B«¡À€ô‘Š¿ô¤¿Êi?Ç«O—‹ ?ú/ æ>Ò¡@ÅebV÷@@¾"‹À¶@$mÿ²Y@ Ayîùï@!ûX[«ÆV@$ñ²œ@'æ—®ÖB@*ÛªƒW@-ÍÀÁÊ@0^ñ¾@1Õ] ù+@3IÈŽà¾×@4»Ù£öŽ@6+;îºÌV@7—ž½$ì@9µõ…@:f:dÖUB@;Çê…„˜@=%ˆ!îËž@>~Ý~GÉ@?Ó¸[»íÒ@@‘ö> Ò¡@A7©‰nþ˜@AÚåT^ ]@B{›{Ä[@CÀ]IÇl@CµJ¼#ò„@DN3¢³Mð@DävAÂ#@ExÎ nU@Fÿ\©Â´@F—E¾üÏ/@G"å^ƒûƒ@G«âüu@H2Aü¼z@H¶ËŬ@I7@Ò°_@IµðÇ$é@J2" ý@J«àj¦;@K#3k¦@K˜'âëÆ5@L ÈÛàŽv@L{"!Ò©¾@Lé?Ƭcû@MU.+¢i@M¾ùmF,›@N&®^ù3@NŒYq0¾=@Nð3i%#@OQÄ&¿žþ@O±œ¹ŽØ!@PΟdÇ@P5èó˜V`@Pc#]Ä»v@PƒËÆŸs@P»عÏ@PåÍíËÙ{@QÂûdö@Q8ô¾ž@Qah™?@Q‰#Ѳ•>@Q°+ŽÇù@QÖ„Ô\}ÈÀEu¿[¶ÀExÍ>µÿÀDµ]¾7ÀDR`lƒOÙÀCíwšˆïÀC†•m¼»ÀC¯Úë½ÀB²ºÌ1LÖÀBEªÏŸQ§ÀAÖt‹ÀZÀAe '2PÝÀ@ñi¦½s…ù6KÀ=¯ ÈL»À<Ø5@óÀ; jž‘6À9þÒcfÉ„À8ì4SdF½À7ÔŠuÞ‹À6·Ïí¶hdÀ5–88gÀ4o,lÒ<`À3CK|¨ê¡À2l “ÃQÀ0Ü›§n¸ºÀ/CØÖÌÀ,Äæ”ÔòÀ*<˜÷ç±À'«+‹ À%èfAáÀ"n!.bÀ†dï’©ãÀ! òþÀ¬ÿ‚¬VÚÀV•*À9Ö,îK¿ð 㮋ɀ?Ú4Ý Á?ý;Å£÷˜5@ Ö` ¨×@À~lË]@Í*üÌb@Fó÷Ò°@"B ë?M@$ëˆf¦Q@'Ï”Y8á@*²¬µ¬Æç@-”Ñÿ|\@09–´@äñ@1§˜«#@3¾))ç@4}´vK¼@5å,2£²Ž@7IÙ“º»@8«u¡®°@: ¼­"Í@;dp_½ªÖ@<»Vý/`@>;°DÏ@?\î›]®{@@S¢m×Õ@@öŒ@?”—@A—$;Ä/ò@B5\7ó¿@BÑ(Y-«$@Cj~ûõc¾@DX™Œ€²@D•¯­b‘@E'€•]» @E¶Év»h0@FCбË@FÍÃÐjÚ8@GUyLÙ©@GÚ®‹b~u@H]h¯?>{@HÝ­åÝÐ@I[…Jd¡Ì@IÖöÊ‘ÂÖ@JP ø@²@JÆËXÇŒ@K;AÍÅ@K­wÅÁ¨`@LxÓÖÄ_@L‹OŸÌ¡@L÷]~§@M`«qøsn@MÈGbÉ3@N-æË Õ½@N‘•Oꫵ@Nó^–™ŒE@OSN;g¦ @O±oÉÕÇý@PçZÏ Û@P4;*MA¾@P`¸ì¼#¢@PŒf'“^ò@P·HJxÑ@Pád­›sV@Q ÀTÓO@Q3a A6@Q[KOGV@Q‚„% ê@Q©lHÀEÕ.1«¦ÀDº…½“ÀDYbòÀãÀCön¤ôŒÂÀC‘™Ç€ÀC*ÙŠÝÊÀBÂ#1¤˜àÀBWlHÄ¿ÀAꩽÁ&ÀA{ÑÚ ÿnÀA ÚbRQÇÀ@—¹AÐuÀ@"f2ÉQÐÀ?U®|6ÔrÀ>b¨kÀ=i˱¯ú&ÀQÀ8JŒœÀ75TNS–¹À6ͶxŸÀ4ýuÖ›üÀ3ÚPÕ¼žÀ2²fÜ]rÀ1…À„x²ìÀ0Tn Z’hÀ.=ªñ7¦À+È')Öz…À)Jw¶À&Ä3ïè<À$5¢#NuÈÀ!Ÿà.4ÀÂã¦ËÀ¶Ö²Ôq\À^:ô&­óÀ ñ« ’…5À;ÌË’¿è\Üќ̶?ãÐÖ—…)a@Áùr½@ < IU@9Î ƒ H@Út)ì¾@~«_>f@"‘ EÇ@$æAMr;ä@'¹ºþxF¤@*ŒR÷àOß@-]_svÏ9@0‡IÇ@1|ä:î†@2àcõؼ¬@4B¡y5>ƒ@5¢Œ'Ä]l@6ÿÝù@8ZPô¯i@9±¨oá´@;¨M½Hœ@ë‹-!jÆ@@ñJí”@@¸O‡ç”^@AVV}p¾@Aò~ú¶c@B‹ŸÍí&Ý@C"Íîë`@C·ŸZAÖX@DJ‰ïÞ@DÚNBÉ@EgÀ‘o@EòúŒ,Å2@F{ÌFì@G6ãˆc¾@G†=Mãúd@Hã‘ ô@H‡.¼R@Õ@I$ÉxU„@I~̃ªŒ@I÷-oÐYŽ@JmO¶ ˜@Já< {ï­@KRû£u¿Ã@K˜ésº@L0I?˜ò@L›{z;ó@Mÿ ø£@Mlt²j¬Š@MÑûÔX@N5œØo3Ã@N—dÿÍnF@N÷^O7›Õ@OU““`›@O²ŠÞ­@Pno0Jõ@P3Ci@P^ÊÝ7&Í@P‰Ë ³E@P´‹ƒö@P݈|UÅ•@QO¼sn@Q.cA? @QUÇR£§æ@Q|P'ÜÀDÀ3®ÀC86uÊÀBÑ£pæbëÀBi(f1;òÀAþ»pNÍÀA’QÿÿšåÀA#ã«•Z=À@³g Ô“À@@ÓZó¼À?˜@ƒ³Ð?À>ª‹½?ó+À=¸y®ˆ(ôÀ<ÁüßxlÀ;Ç :è{«À:Ç”9˜HÙÀ9ÕPgÀ8»؉4cÀ7­ÞÌ‚ËÁÀ6œ lzÀ5…ɶ‘|À4jÝW¸ômÀ3K`Ý|޽À2'\æØ,DÀ0þÝSgÉÀ/£âà^¸9À-AXBThÀ*ÖH ‡ÎÀ(bç<²´oÀ%çr¹¤üÈÀ#d/„å?×À ÙjÍôAÀŽóõ§)À]u6Ù±âÀ$šezƒÀ ©ºl°¿ýþ"(Ôp—¿áüiÎ?êBÁ~²R@q˜¥•RZ@ `? ;XÚ@­*¡Àkf@.¾H>¶¡@³¤xºp@"Q'¦mT@$á<ç 2Q@'¤õÚëº@*gÜ«{\%@-)S> ”Q@/è½”M£¥@1RÁXCb’@2¯†´ø!Ú@4 fš!~â@5ck–†@6¹b‰Ï’Z@8 üšµö±@9]­Çöðr@:«=ò“;´@;õxۀЀ@=<.AxÛ:@>1ô9J@?¾[Ý­^@@|ÄÊè)@AK:3ˆk@A±µ¥‘T@BH÷?"&N@BÞê{¥@CpÙ[Ò°…@DkPuØ@D¶»yÊ@E·Dq@@E¥l1]FÇ@F,Õ ö¯!@F±òbwK˜@G4Æ4¶J"@GµS”:/@H3žóKk@H¯¬  Ž“@I)‚<@I¡&Å qŒ@J¡yö™ @J‰ùÙ™Í&@Jû8È7Ö@KjdÈÝçÔ@K׈ïyl3@LB­Ï]&‰@L«Üît[r@M ô‰@@Mx€ñ‘ˆî@MÜ ®¹r+@N=ÄHÌP@NºÕ@òª@Nû÷j®„@OX„¤Ž°@O³jæLBp@PZá`ù@P27Ed¯@P]O}íN/@P‡¨\EÂ@P±FŸ“î@PÚ.òk¢@Qeîî‡ @Q)ð Ë"@QPÑÛïÚBÀDhÇÀyùËÀD }¢PÕ•ÀC¨}£Y–yÀCE¾_žÀBá6~VîKÀBzÜÀ6fÀB¨È×UÀA¨M‡xÀA<‰ÜPÒÀ@Î+g˜»À@^—t?eÀ?Ù3üÿ_À>ñ¥ß•:À>âÃ.Y“À=r›[ž?À<“©q±À;&Èrµ¦À:){„‚Ó˜À9'ÔÊ©ðÝÀ8!Ï¿<:À7gfa¤«À6œ´É¯À4õpcŸ•À3ÝæÏZÂÀ2ÂZ{gÀ1¡ØÁþ#÷À0}j±w7;À.©˜½TÀ,PðÌÇ7À)îš]ÍÃÀ'…;Ë2ütÀ%?ùÂ&ÙÀ"›ê¢†À „¼‰pøÀ,Ä%0¡ªÀ·=vPjÀî¤fÿ½À|¶æz+'¿úçMŒy3¿Óúž]»Ë˜?ð3w‡Ùï6@Á·ñ$zº@ v‰³øòÌ@I›qÐ@~þ®÷ ô@æ‹c ,@"'÷$Ê@$Üv=GÛL@'‘0€(@*E%÷ËÓÈ@,÷ÄU JÔ@/¨yŽëVÇ@1+[XßC@2€ø| á@3ÔÏPY@@5&Ÿ®0K@6v*Šå9†@7Ã4.§F¦@9 „ ž;Ñ@:TäèÀ*¿@;™%iWw@<Úm~u@>ŽKj@?QfÌvw @@C¾À@@Ü×ñŒé@Asò þLn@B ¶úS„@B›ýËóú@C,ÛWL”µ@C»”pwßj@DH#¼C t@DÒ…XÁ4@EZ¶È3“@Eà¶ÛB1a@Fd…šÍ @Fæ$1›kå@Ge”Ö# @GâÚ´žJ@H]ùÙ™?â@HÖ÷"Æ @IMصpc@I¢áú»÷@J5^\tû<@J¦Ä#@KÄÏ Ñ&@K” Ó@KìJ|&ÊÌ@LU.5£$Ï@L¼3§Bîö@M!cå=@M„È%é#Ö@Mæi¹Ò'U@NFRZË@N¤Še¨f@OQUÛ@O\* ,˜@OµrJµö}@P¤@™>@P1Ï>q«@P\=ñ1J @P…õÕþ6@P®ù)üÆ?@P×N‚áu@PþùsïÈ,@Q%þ9ÔAÂÀD˜{x­ÀC´L©¥ÀCSlM$)ÀBð×Ç}ÜÐÀBŒ†qAš|ÀB&o¿N9‡ÀA¾‹KÕúÀATÐà1íÀ@é8‰‚žÀ@{ºrTÜÀ@ OR¾‘‡À?5à3Ïc¸À>O,\úhÀ=dvã+M¼Àé£CÏš@@ °p@@£Ó,l.°@A8­»w#Í@AË™zA @B\Œ$U=‚@Bë}OÐÉ@Cxdô‚@)@D>0ïßB@DŒcó¦@E´„Ù)z@E—LǼøÓ@F̉ä¢@Fš4=Þ¶w@G…W–aˆ@G”Â8Žñ®@Hîpùt@H‡  •@Hý#¬ñà•@Iq7k¯á@IãN.ÖÇ@JSndÍX@JÁžîqâÑ@K-ç¥MÇ@K˜Nf³Èß@LÜÕ ÷@Lgš€TÍ8@L̼¥E@M/Å 5ïÔ@M‘C*:Ä@Mñb›Ìï@NO;èÒ¥ê@N«Èc1¤r@OÀŸÎûÕ@O`-h®qõ@O¸~“dh@PCÊ0T @P1Ã%~B @P[Žפ¢@P„¨×y¬Ö@P­’Öè/@PÔÞec¯g@Pü[ްøÀCÀOþÏ 7ÀCa:ˈ–ÀCƒ$â ÀBž#µÚ ÀB:·¡Õ²ÀAÔG]ÇC\ÀAl¼AÏ*ÀAhâe‡#À@˜Eüs²“À@+L–+À?x쬮À>—x,½ö¾À=²1ÊOöÀ<É>¦¢À;Üò ÕéÀ:ë ƒ*êÀ9öçI~À8ý/‹¡÷/À8Dw¯ÉäÀ6ÿWp7ÕêÀ5úhËô#À4ñx!~rKÀ3ä‹Voz>À2Ó§ÖÓ¡ÑÀ1¾Ö-b[À0¦!qAHSÀ/.ПCÀ,Ò‘?ý{YÀ*Š‘ñ{•À(;[H(}À%å".иÿÀ#ˆs•™ŽÀ!$’3®ˆEÀu€M5À•é]Ç’À«UœêÀ kµ¹Ñ|Àl4÷(dÆ¿ò¶_¨ZL?¸ÍhÝgó?õíÌnû‘@4y zaf@}K£Õ¾@ç»ìWw@…Ú˜‚@Dã‚Îz@":iš»¯@$ÓžèÖ„@'lZh³Šw@*xÓÙN¦@,›jËê“@/0°¾ÄÏD@0áæ ºRH@2*"ÓŸÙ@3pÑG¼dÑ@4µ¸;Í/b@5ø ÚÁ­@79SŽl«@8w ,b•+@9³U×SJ@:ìG‘SQò@<"KFÍØ@=U9ð!Žã@>„“Y@?±K5A9@@m”ý@@ÿÁEX|„@A•Ã"è½@B‹>Ê,Z@B¬˜ì…úJ@C7·iØØi@CÀà¯ãÞW@DHk”¹@DÍAéÒ Ý@EPtGVÔ@EÑ¥:jþy@FPÕ?˜Ã{@FÎæ"@GI5Û%F:@GÂjŸ¢q|@H9¦v|,j@H®íSõeQ@I"CÍK¼[@I“¯ÿª@J4¯Çó©@JpÚÞ<ß@Jܨ=^³@KF£7%Í@K®Óg·t–@L@ß&·@Lyðâ+dã@LÜí¡.@M>>Gáêæ@Mêé†ì#@Mûû­×¸w@NXxʦ‹@N³j}eî}@O Ùfó@OdÌž ]3@O»M}†›@P1ä-v‹@P2 Ì/È3@P[8xÌÓ–@Pƒ»á-î%@P«™ðÍ@PÒÖ‚ç ÀCo"Õ®ñÀC4ÍËsÀB¯°> /ÀBM\šcÀAéÄÄ*»ÀA„O5Ôw¿ÀA%¡`;À@´A/À@I›I{‰µÀ?º[KiÀ>Ýä¢L6À=ýÇzPì3À=ù” ÔéÀ<2qª)©À;G'Œœ•À:X=/DÀ9e2 9,ËÀ8n|¼'$À7sñ–À–À6u–èf$À5sWƒ©MªÀ4mL5˜ŠÀ3cr›ÚäÀ2UÐ>ÍÙ’À1Dp›õ’À0/\é;‹vÀ.-J!Ð8?À+ô²bR„ëÀ)µ`†cžÀ'n«jª3úÀ%!šmQW³À"ÎpÈHÀ ts”îä³À)¼]¹_^À_MA*áòÀŠ6¢>XÀ V@!ÜžÀ…xܺ ׿îŽ<¿¹½o?Òo„âOÄY?øšÑÈû7@Y+Ж¸e@7¾ƒu õ@GIÄgTê@ZMÚéÇ@oܲŠD#@"C‚ŒÅ\@$Ïi슥t@'[*z0 :@)æJdãßt@,pP¤+;¤@.øÅŒž}@0¿™®ùC±@2“i–0@3BÐ]Â@4€ðxç •@5½èì8H]@6øÎÙ›Íg@81rC‘¬Ä@9g¥¦—»@:›>˜lþ@;Ìhúu@<ú%q¢²@>$á»E"{@?L˜pS>@@8ƒ´Ø×½@@É T½M²@AWÔ‚Ê(@AäØ œâ•@Bp Ág­@BùiÇ@C€èãÿm>@D†Yâ·è@DŠ=¢"޾@E øç¡Û@E‹ï¦yTˆ@F çï~T"@F…õj7@Gôxóq@GxR—¶Þ@Gî§…JŠ¥@Hc~@HÕ­íšO@IFg»'eS@IµL_ló@J"a@ÖýÚ@J¬0I†š@J÷3XÕ @K^ý6%I8@Kʼnmôw@L)tOb‰@LŒ/¶Ûù@LíJ!Êf@MLÊìå²{@Mª¹ÈÌW@NR-ä@Nb=ÿ·'@N»gEÅ…Š@O[&¸õÒ@Oiãšé?h@O¿Ul}_@P hH-v@P2¢˜9Ö@P[69û±w@Pƒ'Éä@PªxöÔ±ªÀCéM£_ÀBÁ,YÜ™ÀB`â*œ–žÀAÿ¡oçWÀA›Œ¤ªºàÀA6sŒ‡ßHÀ@ϲãË ÍÀ@gDp|´¤À?úDz}~?À?"Fvª=À>GX©ZäÀ=hœÏüŽÀ<†PÆ÷ÙÀ; l“$…xÀ:¶éK&À9ÉÁ1Öà¨À8ØïÑ’.ÜÀ7är&óÀ6ìFsIÁNÀ5ðlícAÍÀ4ðçJdÿÀ3í¹$z7yÀ2æèL†`À1Ü{r[§À0Î}ÎÀ/yó´ÙŽëÀ-OýùÀÀ+;^€pgÀ(çÒuQÏÀ&©îéf4wÀ$eÁ™._>À"€¤¨kÀ–ÎæEÞÓÀëmbcÝåÀ5h…"Ë.ÀuVV.—nÀ W­°r¦¿ÿfN¶¸®¿çùý6é· ?Þ&œcŸO?û*”oìä{@qOs«5@«Ÿª÷·ž@¢¶o3´@óÃu³@™Ìó±[@"LÇŸÍb@$Ëqc¯Uç@'J¹Ì@)Éjê Û¦@,GÐ@@.ÃCÓ¸²@0žÆþ”G@1ÚÀOÃYÂ@3[•‰ù@4Ndž8ÅX@5…©ÚZ<@6ºû¬¬›p@7î,“šû4@9MKÎ’@:M€ö!(š@;yU!˜«@<¢ií‹T@=Èžô¬|@>ëÒßWX@@ö+ ºô@@”hˆvgÍ@A!5$ŽcÌ@A¬Qå'¾@B5µòyS«@B½Y® D¯@CC6«¹\Ö@CÇG Ä‹@DIˆ]ƒý @DÉõ½’PW@EHšÑ4Ì@EÅN¿l=w@F@8׬@F¹Lc&@G0Цµ š@G¥õžwà1@Hîé,ë@H‹\×­àÙ@Hû`&Wk@Iiž(“@IÖŸöë!@J@ݸhÜZ@J©éùƒß@KF<¢e@Kvø£Hfî@KÛ¢±š@L=y—n×ë@LžU~SÓ@Lý¢-wì @M[f¬Qøp@M·ªøœi@Ns§@Ì@NkÊè„@NöÖR«@O=„"ù@Oohqúw@OÃ=âä@P áψM@P3u¿¤¯@P[4@@P‚ä#À0ÀBÒ”¢ÛoßÀBt¨*ñGÀBüß™ûÀA²w2Ѭ ÀAOW==%À@ê¡Q û›À@„P:¯ôœÀ@^gj†À?e‹a~¡À>PqòÀ=µˆïíÑÀ<×É ‘•‡À;÷Äa–åÀ;Ìå0ÊìÀ:+­¾À9?Ü€áŠJÀ8Q üÀ7^Ø2\µOÀ6i y¾ã2À5oµÔNÊTÀ4rÜâUëgÀ3r„ü?À2n±riã½À1gmX{äÀ0\ÁçáË7À.vå¦+À,zÐ÷¹ ¾À*Q³“DÝÀ("Dên/ÀÀ%ì¯î$Ï·À#±$^…UÀ!oÖÖBO½ÀRš’DÀ¹Á& ºÀrÏniÀk¥9Þ…Àmäóƒ¿ûçéYvŽç¿á«@ Ô}‚?ä°š`¹\4?ýžúihÃû@}´˜–Æ@ Ôƒ~H@úG}:ƒT@Üÿ9kvá@Áõ…Œd”@"T*¨>Mý@$Ç£õñß@':û“)@)­ÄDœc@,”ÞËÚê@. Mº@0SHãU@1µŒ¡¾Á/@2ê{®v\Ý@4ïøÎB@5Oº üGð@6®vê¤@7­ ”,?`@8Ùg‹—\@:Üzˆ†@;)Ú¦]õ@ŽÀnã’«@?ª£ißZ@@a½Ñ*‰@@ì™`qª‚@AuÚh`\ý@AýxU z@BƒjÌfÊ]@C«ðû @CŠ6 Bž%@D ®«{@DŠ_”6@Eb›VUC@E‚íÁÔJ.@Eüµ ºÉ,@Ft¸xŠ­J@FêøË“i@G_wt÷~œ@GÒ6‰Ôqy@HC8¶¤ —@H²2é¹£@I µ;¶@I‹ôgµ'Ç@Iö'ÜÛ}Ú@J^³ÿ*ð@JÅ›$›h@K*åÈH]Š@KŽ˜À“µ©@KðºXÎ@LQOü:·«@L°`Ø&@M ó,¹==@Mj —ã@MĶËçØ7@Nõ:“@Nuа-Üè@NÌO&¢-@O!wb˜.b@OuP¡'zó@OÇá++³@P ˜{Á^@P4¢É߸ @P\ Ìâ¦ÀB‡d¤f}ÀB(ÏÅ\²øÀAÉH îEÀAgÓýǾÝÀA ‹ NÀ@ Æ É+À@:êÇyÖÀ?¦ôÂ*"sÀ>Ôás ãÀ=ÿ’)¡½öÀ=&þ’EA–À5*û¼Û@?Lõ…XKÃ@@0î?–n·@@¹åÀi÷@AAU=œ ²@AÇ6,~i>@BK€$Ê÷Â@BÎ,ƒÝª@CO5¨Üib@CΖë˜YŒ@DLL’¦^t@DÈSÈÔ÷í@EBª’#¯Ì@E»OÀ^+n@F2Bçz|%@F§„Q×­¹@GôvÖ\@GŒöcF%ÿ@Gý*Å’¯x@Hk´Ê²ö@HØ—žù«~@ICÖàý”Ê@I­v—A9—@J{&BØn@J{éFû# @JàÅýÏy@KD‘ú¾@K¥à…nqî@L),ƒv@Ld÷Š'@LÂP‚C!@M:š þ@Mx¼:º@MÑÛ7Ê2w@N)žn½@N€ œm1@NÕ*½Ùe?@O)¸ò°@O{”‚ò,†@OÌìˆ<Ø@P‡–ØÆDÀ?æß²¤ÊÀ? Œâ*BÀ>H K'ÄÀ=t4äm À<œÚøKTÀ;Ât ®@ZÀ:ä×»bÀ:H0À9ìïbvÀ88˜oÀ7N@ÑÀ6`'Ñ¥h%À5o _¤ÌÀ4z´?í À3ƒ v¿æ˜À2ˆW I›À1ŠaÖâÀ0‰E”×>À/ Wˆé”À,ûšâ aüÀ*çù¨Ô›À(̸ÂhüªÀ&¬¢hiqçÀ$†þ/¸"ÉÀ"[ù~¡´´À +Åáì9DÀí2IòÀyYˆ£”%Àü}Êÿg±À îDÚ&œqÀÓ¥Il¿õTƒñÅL¬¿Ç4Þ¿2»i?ï?Û.óè’@@‘Fª@ v6£€]@ë<׿÷s@žÏÝt:‡@UQùc@ ³2é³@"cxÅbÈ@$À|{Ü@'gÌQ @)yÒH_J/@+Õ` €÷À@./³Qùh@0D7X±í@1o›êi·¹@2™Ú¹kÜ@3ÂÈj 9r@4ê:õµ/@6 Æ Á\@74 â{@8V"#áE@9v"¨½«€@:“î@¬7Ê@;¯e$…‘Î@<Èi±Dû@=ÞàN',@>ò¯t(‚û@@ß×lТ@@ˆýÎÌ.@A§ô2²@A’Õ£fÈ@B4:a @B–øw@C,24ÞK@C”%Ý|¾@D„Ÿ Rƒ@D‹GÈ+~@El>2³Ü@E{ðzÝ¥m@EñÓ°¾Éx@FfÁ…`z@FØ·3A6Ñ@GI¹%¹S„@G¹GÙΠ@H&åÍJ÷@H“d:d@Hý¯+tqO@If¶¨¾|@IÎ/¿â“@J4¨#K‰@J˜‡æÿ0@JûpDÅ5A@K\ÜÆ†~G@K¼Ò¦w‰Ï@LWMR»@LxpJœÿj@LÔ#Q(¢ü@M.v.âëØ@M‡nÈÛÔ@Mß!Ô¾@N5iH:@NŠvæ8 @NÞBŠb6½@O0Ò?l‘@O‚+³âô@OÒU\98@Pª‘ EþÀAõ\oÀA—¨¼“ ƒÀA8Š… À@Ø ²öŽß>‡:À=¿!çzYtÀ<ì\Ggò°À<‡¾j²ÎÀ;=ž¬Û¾dÀ:aœI¹pÂÀ9‚|´Ý$üÀ8 = £ˆXÀ7ºÛqð ÉÀ6ÒW9p?^À5æ°àÿÕ¼À4÷ê2 = À4QÂ^áÀ3 ÔPˆÀ2ú͸¹‰À1àærBÀ0Åi0‘OÀ.=f§á7µÀ,5n˺è±À*'ÀWÇô—À(|Ñi(À%ûÆ•ÆÁTÀ#ÝÈ0FàFÀ!º­WÖÀ%J­JÜ2ÀËÉ“#â½ÀiF/:/VÀþ7?øíùÀ 5‰ùwûÀ ëƒ5þl¿ò;OŬL¿{»Œí®?ò^ÎÌ&8@4WÀñÖ;@ c¤ý€(—@Md{@@ì6ôK"Œ@›¯ë‚u@ p÷M@"j«‚vþS@$½#‰»+@'~Þ±å9@)acp8ß@+²w¦áF@.b»€ÛÊ@0(f‹µPR@1N°Q)@2sä‹MW@3—Ú(L›©@4ºiJE®@5Ûkh ÷Ä@6ú»m¨?Í@85ÔìÉ @93¸¾<¨›@:M$uHî@;dYM‘ˆ@›¡™O0@?¨ôÌÄfZ@@YË?J^E@@ݹ۫6/@A`=±Çà‹@AáO%ÐÎ@B`ç„ç=@Bßÿ&&t@C[– Òß @CÖ¤JÎ¥0@DP&ªlžë@DÈ0Æé@E>€ ©/‰@E³T=‚p@F&–Ït]e@F˜Hd]‘@Giˆs©i@Gvû}òa'@GäG¢Y@HOyb­TN@H¹j6øf½@I!Õ”§¡Â@Iˆ¾è;@Iî)òÚùN@JRÂT²N@J´•©p…˜@KŸ8¤¿¥@Ku<7')î@KÓqœ^[@L0D‰°Ø£@L‹ºD·\Œ@LåØ1ÆÈO@M>£ÎÙìž@M–"®Òµ<@MìZuú¾@NAPÑb¡[@N• |4¼2@Nç3%A?@O8äµÎ¾@O‰Âßli@OØpÿ$ÀA¯ÚœRÿÀAQ¤Pa5À@òåL…·iÀ@’Å1åvÀ@1?ȆŽÀ?œ _v¼ÅÀ>Óæ(™À>IcsÀ=9Â9j8ÀGŸ¡@èß@?QN½÷?_@@,6}E¶è@@®sá"¦4@A/W!™*–@A®Ø³ò³@B,ñç’’…@B©œàë|t@C$Ô“™ýã@Cž”»Ós@DÙ×7âG@D¡$·ü@Eèv ¬•@Ev®uøl#@EèòN"$d@FY³Éü†ž@FÈóC|å@G6±šØ@G¢ð-Æ ˜@H °ÎÑêå@Hvõ¼ÞðÑ@HÞÁšÚäå@IEg­$˜@I©úvhmž@J nfÅcH@Jowêp‘@Jп„ì@K/W§2öi@K8bHm @Ké¿©à΢@LDò]LÁ@LžÕ|Ñ¢É@L÷n$¼ÑÃ@MNÁˆÈk@M¤ÔïÏý+@Mù­¯Ðæç@NMQ*6À @NŸÄÈmÚ@Nñ øº§¥@OA2+RNT@O6ϱJàÀAjN ©üÀA AÝqÉÀ@®âEG16À@O+ ”A-À?Ü0REúÀ?KŽ¥JÀ>O  xz­À=…(à1¹À<·Þ9è®À;ç»;DÞ¾À;»!æzÂÀ:>ÙêBâÀ9f^çƒÀ8Šh(uÀ7«ÓÛ‚÷ºÀ6ÊW š«À5åò\Z­8À4þ§‰‹rÀ4y€¡F¿À3'lkcÒÞÀ27…À%)ßÀ1DÌPdõ*À0OHVµNÀ.®jšÀ,¸ç:ÚÀ*¼ËQôÀ(¼Oh„T»À&¶¾>)-¼À$¬:û£VÀ"œì‘§À ˆûX€,ôÀá+¦iã9À§×Çÿ"sÀfbEÅ*ßÀ8¤´GtÀ™"„Äã¿ýÖv› ÈÍ¿èÁ)\Ÿ‹ˆ?Ô±cÛòE­?öÎ+ÀÇfI@AUP®2”@ #Åä~¼·@ {Jä@~AKa(@ø1×™Z™@ 9èlüš@"x?zÍr@$¶Íl>6…@&õA¶Š @)3KЪÜc@+p›™4ç¾@-¬áœ@C@/çÏ_¨N@1‹ÔíÒ@2,7c)›!@3FÅcK¡¹@4`ß§]u@5wúrã$@6Ž\%´óÕ@7£þ¦:Š@8¶žg¶£@9Ç"ùÜY@:Ö7Ûin@;ã4&0$è@<íþ¨ÏÕª@=ö€?¶Ïd@>ü£mƒD@@*.aÓ@@€Ào¥NQ@A 5¯]@A~ Z&±@Aú§GÑë@Buê D9"@BïÉ4Þ"Õ@Ch@g GO@CßK÷(T@DTèëÁ±V@DÉôX ï@E;Îaâ0Å@E­ Lg@Få¨GˆÅ@F‹CÏT<@Fø,¹‘\%@Gc£Ë)§M@GÍ©«êÂÆ@H6@9tò@Hi±Ñ÷=@I(°XRf@Ig€!ü%¦@IÊs@tâp@J,‹\Š@JŒ:¿è|ü@JëÖ3ëT@KH÷Éž«@K¤Ô{Â{u@Kÿ¾ápO@LYaÉãZ@L±Áô㹂@Mä<©ÉI@M^ͳ'"@M³‚îgeH@N gœŸ@NYf•Þ;@Nªž*Í@Nú¶‡ž§Á@OI´œŸ/uÀA'%-h°À@Êsâ†D¾À@lxå6À@ -ßåp˜À?Y#9üYîÀ>•?©¾Š À=Ϊž}¸À=^-Î À<9Us0À;jŠ]7ëÀÀ:˜ú:Ë<õÀ9Ä¡I.lÄÀ8í}ùiÀ8‹¶Ä;À76ÌžÝ|íÀ6W?æá!‘À5tæ¾ýŸÀ4Ãi¨^&À3§ÙJ1˜À2½,ò1D¯À1ÏÄ0}°²À0ߦêEKÀ/Ù¶J{¦GÀ-îÚ0õ£ÕÀ+þÎbtþ”À* ¬=ŸuÀ( °À&™Tº½ÎÀ$ êXôÞØÀ"¨¥°®Àïù‰ñöÀÎ$óÐnÝÀ¤0®Tf¤Àr€)q­öÀrù7"jvÀó)Ò À¿úÌõ·ùƒÀ¿ã7}ñŽ8?Þ­ZT½Ïæ?ù>…~­@9m»Çô†@ ÷€X@eâ@^óˆVê@Ã;§[Y,@*ˆB EÙ@ I¶c)R@"~¨â é4@$³Ïqa@&èݳ–Ah@)‡c ùK@+Q€–¹ø„@-„~Që@/¶5B„é"@0ó.Š>.@2 VÎK_@3 pNgC@45Xظc{@5Hï@Úè^@6[xݰÚ@7k¦¦ÚeY@8z‹8]/@9‡¤óW¬ò@:’Ù•Ϋ@;œ ­–v@<£,$q]@=¨íí à@>ªË£„@?«$¸¿¹@@T‹S6øƒ@@ÒHßHŠ@AN°rè@AÉó~«l@BCÓ÷oøÇ@B¼`8Ž»@C3’ø[µR@C©hàgW @DÞ§óÉh@DñÍ=p:@E hk~@@Eré$–$·@EáË8n*@FOF_àÓ'@F»ZÒæWj@G& ?þ´x@GRÃòÇ0@G÷8âÅ(›@H]½€‘“m@HÂâÚ’y`@I&«€Sü0@I‰M]?@Iê2a€çÊ@JI÷U_;@J¨l³=@K•#_ÙS@Kav5l¢Í@K¼tK@Lq(,µ@Lm“¹‰A@LĬ†û@M9œEG@MnÆ7¯m'@MÂ*=Èô.@Njz`&˜@Ne‹Âü8©@Nµ’ô°b@O„î²YÀ@å‰íï¹À@‰-O^ÆZÀ@+™;—sÍÀ?™އ&ÕÀ>Ù;:¿»†À>_@÷ûfÀ=Påàmì”À<ˆÉÝçWÀ;¾†’SÀ:ð—èþ ‘À: zˆ$îÀ9M«ÁÍ…\À8x)®é À7Ÿó9ÓÑÀ6Å+¤À5çi:? ¼À5”2$À4$q}‘À3>kK¥{À2VûlrŸÀ1k$,ÑÕ^À0}–ÿ}zÀ/òS/À-5¨Q˜À+Kg3ÆŸêÀ)\GæybÀ'hfa™E#À%oáq²ÃáÀ#rÚ¾xÇÀ!qvÎO¨¢À׺ cÀÄoK3:À©g|¹3À‡PmIÀ »I¿Å·ZÀ[s>äû¿÷Þ¾‡Ëš¿Û¿¶Ð§Âñ?ä'Rée.ù?û*È@(¥Ô¹aì@à×Dæ¥@²uÂhœ»@¸³¥×@[ ÀduÓ@ XñÎÀ@"„ÖÓ›¤×@$°í5âJ=@&ÜìŽvß@)Œ‹<>@+3….^y@-] ùç‘@/†cŠ|‡@0ÖÞúŠ@1髼Œb—@2ûwì²\@4 "#QR@5Œ }G@6)•Ïã˜@76"^§[¢f«qH@?X¸²A(@@)ÁžMˆ@@¥ù f’@A ûf½%­@AšÂ"4:@BGWäÐ>@BŠ…å ²@H„6Ÿ=Ô¨@Hçm³+Uƒ@IIU'è„@I©ï–øJá@J @7}l@JgJ;#E@Jĉ@K˜qgÁ„@Kyä®òb@KÒ÷þè@L*Ø<Ћ@L‰4»œ@LסFÇ@M+mt®ôß@M~©òȤ@MÐÈ }@N!Î/@Nq¾¸uh @NÀŸ]ÍÀ@¥PæÜî4À@Ia‚ €À?Øqx.ÿ5À?¦ºš9!À>\\ÅãK<À=šŽÍ{À<Ö5SÔPÌÀ<Né’¶À;EÔ]ŽOlÀ:yÄž?¿À9«)T¿À8ÙØ¼ ÈÀ8ù-ÀÑpÀ7/|ã»19À6Vd**©^À5z°0îaùÀ4œcëTzÀ3»û!¢?À2Ø þ|‰=À1ò YB‚bÀ1 a dˆÀ0z”çOÀ.aûEÉ*øÀ,‚(òJ‚¢À*”в°èÀ(´VÿF[BÀ&Æ‹ÞxÉpÀ$ÔQ],ðÀ"ÝÈ[ÿÄ"À ãih¸‚ÀÈ·€Ù/qÀÃŽ‡}õÀ·ê=ÀÞÀ£vѤ¢À ŠÔ|‚4ÀÑ­vóî¿õ UÙij.¿Ño Á·Ü¨?èÍ!)Õg?ý:ÇŽ3™@{ƪÓå@ˆ“Þ‘Ìß@Õ+Ršå@EÜ0‘×D@‰ÙƒÍ%_@ g£&·o@"ŠÌ©Ìm@$®%*–ø@&ÑgΜ í@(ôOðÀDD@+™9©+@-7ÿØÑc @/X@½4zR@0»Œæ4/ã@1Ê% Ýá@2×ÉrXÆ@3äYØzÐ@4ï¹Z6WØ@5ùÊ]Pã@7p´ÿ¬³@8 ‘L•÷@93ò‘®@:Ú­¤ï‘@;Ó9¼ @<åžÄ€„@=üðÄWE@>–?n@?íKTc®@@Q‘‚ák@@{ Ãcj¢@@ôž3B‚@Am:†Í@Aä1ù¡ŽŠ@BZ(M#&@BÎá'·½@CBWÜè[@C´‰^eåè@D%rÒŒ'.@D•õùR@Ee \'%@EpjÕ›Žk@EÜ"‘×è@FF‹ñL“G@F¯§/ [@Gt~xçß@G}õÄs@Gã*//¸@HGR]+à@H©¸nˆW@I ¶Ä’@Ik/¢]ž©@IÊçmWt@J'¤u•½@J„põép@Jß/-P-Ô@K9%)fÔÅ@K‘ë óg@K鄘€Êˆ@L?õ¹PÉ7@L•Bm³â@LénÍk@M<íŸÑ@MŽwM?‘û@Mß[ó;í@N/1IÁG@N}û®DÁçÀ@fi‚ã0À@ GmÄŒÀ?\” —˜çÀ> ·oe׌À=âmR)–€À=!°²êVÀ<^} ˜†‚À;˜ÎY)¦ÐÀ:С%ý6gÀ:ò”ŠXÀ98ÀjGï5À8i ÅÄÀ7–ËÒéÕæÀ6„CŒfÀ5ê¿ðdÈÀ5ó´/ýÀ44¦S 4À3UÛA²Ž]À2t–ñ=Z¤À1ÞÙ ˆ÷À0ª¹€Ì:[À/„]+NÁÀ-®lõ,dÀ+ÔèbEzÀ)õ¿¯lpÀ(–™YäqÀ&)¾‘?-&À$=¨?4*ÝÀ"MsºÝYpÀ YCœ”ëíÀÂyö_¼ÀËÌðyŸÀÌ™¼qøYÀÇs‹}ÉÒÀ wóNècÊÀUùÒfå¿òN["ÞA¿½ß˜rk]4?íJh"«?ÿ9fubä,@îdŸ±þÎ@#_•«û@Reœê'@ƒÇA©N@·Ñ×…þ@ uÑ &C{@"} åw@$«uÜ»¡¶°^@?°U ©±@@QoÕ7С@@É™Ê_Û÷@A@¢/U¬@A¶‚µÿMˆ@B+6¸we‹@Bž¹r[5«@CÞÛuC@C‚‡y…é@Cñô‹Îß@D`_qÐ@DÍê?€6@E:²Á„@E¤ÚÁA @FnãµÂM@Fv¿ûr Ã@FÝÎO&0ó@GCšƒý¼ë@G¨%˜:%Ó@H pÝžåc@Hm}óó¾‰@HÎNã¬@I-åxxç@IŒD|ˆ±@Iéns6çÔ@JEf4y)Ž@J .È6Ñ©@JùËaãl|@KR?\F=@K©Ž5tH@Kÿ»Šü‘e@LTËFq@L¨À©"Œ=@Lû *‹:8@MMm“—ÏÒ@Mž,ìu¸@MíâJ~ã-@N<‘Ì(ïÀ@))›,ÁÀ?œ¦ß À>ãí˜ðƒÀ>(˜ÇxFçÀ=kSS·+À<«­ ô ÖÀ;é¢5¸9À;%/*„—À:^PÞbuÔÀ9•,Ê«À8ÉJKâŸÀ7û)OÀ7*ƒkgº‹À6Wws{™WÀ5ülUšùÀ4ªSÀå–À3Ϻ À2ó AecgÀ2î¼µåtÀ12x#®~ÍÀ0N¬&&9;À.Ñ$ýíáúÀ-göúºªÀ++5¡jRÀ)Q¢2/Ú_À'sÇÒÅ8ÑÀ%‘Àˆ×ܼÀ#«©K]7À!Á¡hg6"À§• Ö;ÀÄ‘4u/ÍÀÚƒÞ(F•Àé¾Éç&Àå*ýÊ ÀêDZ7C¿ÿÊÅL°_¿ïS mÖi$?¡S¡ ¤#?ðЧo¦y‰@“s½wU@ÅÍCS@>f½â–@žL¶¨@¿˜§ ]=@â«0»Úª@ ƒ„Á×V‹@"–0³ÆÛ@$¨Ýò¼[@&»‹óüð$@(Íè0A¤R@*ß´ät´©@,ð´¿|@/«6%ì@0‡­ÿ?Ï@1ŽFQ‚^@2”¤œˆm@3˜ÃÅÚ÷@4œq?Œé@5žïh‹]Ü@6 $yPá.@7Ÿ÷–_:K@8žPßî¸@9›};¯@:–;¦ kk@;¢®'.@<‡;²A@=|òEe¹«@>p·-ùÎ @?by«e[@@)j¨Zò@@ŸÞw"#ä@A‘°Ä;û@AŠ)_ç-@Aý ][~@Boò­Ì_@Bágï²D@CQÞÉ1@C¿ám Ð-@D-zŽs'@D™ß6Ð@E ÌÈ7d@Eo,”@E×ĘÑ=@F?K¾ Þ@F¥š§Ôœó@G ±¾;@Gn‘¿K@GÑ;ºéæÅ@H2± ¦Æù@H’óZÌ[å@Hòˆ7Ñ©@IOæ¹]?ú@I¬œJŸžÞ@J'ÌÎ1@JbŒÌC@J»ËÓ\çW@KêY$&H@KjêÊË<”@KÀÐWŠS@Lžò­2¤@LiY®?^ç@L¼Yí“R@M ¢¯ ‚˜@M^8w ™U@M­É‹´M@MüYÎìsÀ?Ú4ÌýB–À?$̓ᵠÀ>m#Á”‚ŸÀ=³2ÅgýŠÀ<öö3êá(À<8jPbÀ;w‹÷À:´VQÀ9îÈ©N=À9&á awÀ8\ØŸà|À7þ‹3LÀ6Á*cn†À5ï¬}£Ì À5ü ÐíÀ4Eô.¥ÔIÀ3m˜À¬À2’ëŸ »À1µóޖߎÀ0Ö¶Ÿü7êÀ/êudì8DÀ.#Å7aÀ,WNá(\À*‡CÏ~ÏÁÀ(³:™ÝÀ&Ú¯‹þ›úÀ$þW––6À#sš’SÀ!:¨Ô>À¤åÒG)YÀΔ2JXÀñˆ@KÀ 9mÀItg¿ÀjYµ]–¿ýÀȬ}`¿ê5JoÔïÏ?ÆøÔ4$Ä$?òéëïT@‚l"Är@ –o*‹¡@Ø„ùeÃ@箘@ùløš¢:@ ÛŽéi@ Âür@"›{pÿn€@$¦\.bªO@&±*ËÛ\@(»ª:íâ~@*Å¡·|@@,ÎÖ24@.× Þ Ýa@0o×`®R@1qÑÀã‘ç@2sÉ#o!@3tÓ†ïv@4tÕRþ€o@5s¶co@6q]’Õ}@7m³cÚ@8hŸé@Þ@9b,ó e@:Yèß~¥¦@;P y¦@(ËŠáÑ@?óž‰_Ö@@í›’ŒN@@w]ë‚“@@ëÁøð @A_³Q8@AÑVîiÑ@BB{¦ƒ;–@B²ƒ1Ý(f@C!i,°z@C*~6@CûÄ…°8—@Dg5«ª@DÑzx^˜p@E:“Wá&w@E¢~Ík¦y@F À>° *Ã-À=ùb÷Â~gÀ=@nL”Ü7À<…>I+â„À;ÇÏyï ÈÀ;ßâ}À:F)øþà›À9îȻܪÀ8»kà·4À7ò i}é£À7'Œ+dÛíÀ6Z/—hvÀ5Š‹ÐyãÀ4¸¢² AGÀ3ävÝ$vrÀ3 ¼ríœÀ25eޤyÀ1Z‰mÚîßÀ0}}W&µøÀ/`¬@7=þ^y¶@84›(\f@9*Æ»–+@:pƒdK´@;…>ï7(@<ò§«%,@<ó§vx#­@=á“goÇ@>ͧñžš%í À>=ö`’†À=ˆ)нÛÐÀ<Ð5ÝÚBÀ<λºFÀ;YÅí, ¬À:›Eå·`ñÀ9Ú’£m~)À9ª“ܲýÀ8RŒ¯%‚À7‹8€".°À6Á®,˜¡À5õî}k–7À5'úæÀÙÀ4WÕ ž^À3…[ý£µÀ2±ð%çÀ1Ú[¼na?À1”3dÀ0&°ÚïG,À.“r|üàÀ,Õj—OÀ+YýØòÀ)MU§YoÀ'ƒrTà*‚À%µÇ7/¡^À#ämi½u²À"ö:çüÀ 7Ô-ÎÀ¶¿Í]ËÇÀøÙïä_+À4ËdÔ?ŒÀjÝ/m³À 6·Ð–¡‚À/Hy†{¿÷³>åo¿àt¸Q‘Ðô?Ý?PVGŒ›?öéÏG¬@H¬ÊWÎO@ "ÖyD@> “<’@siÍÉ;@@g†ùáMœ@],ÜéñÅ@ ©øÔ‡çã@"¥µ`Ò):@$¡–ƒÊ°>@&f“fÿ @(˜ïñü|7@*“ý5 °Ô@,ŽYK¥@.‡Ï¤Jø@0@(äŠk@1;ž„$@26f€»í¯@30VÌòõ˜@4)VùÆüØ@5!O¨šÎÃ@6*,åÿ@7 ДŒŠ€@8-».W @8õ-L^(@9æ»Ïc0@:ÖÆ¯ÑÁ@;Å<@%Þ@<² ÆÍgg@=%wGy@>†z|¦7Ô@?müø6°@@)Ð)"@@›«Ôä–É@A Œy"ÈÅ@A|lèäýu@AëH–ªlÊ@BYj^û@BÅá¾éû@C1˜_y7(@Cœ<„qƸ@DËÐ/Œí@DnDK‰Bó@DÕ¤b( À@E;êÞ¹ôá@E¡çL˜@F'÷òCl@Fhág×ï@FÉøÂHŽ@G*¹Nð'@GŠ_WùUò@Gèì°{ê@HFb?¿e@H¢ÁrpvÌ@Hþ ì#\©@IXCƒŽ¬î@I±j>ßñ<@J ‚P,?”@J`ŽþŸC@J¶ª¬@K ŠÇኳ@K_M@K²uã º@@Ll eÑ@LUf¦,@L¥hÐaZ¦@Lôu¼Œ°T@MB«w_À>€þ&¼À=Î;©úýÀ=cU(ÀATÙE‡ô@?&:õôÄ(@@ªTT€@@uK™Æ@@@äúl{mf@AS³NV@AÁq<ºÿ¶@B.0"ã?@B™ìXúi@C¢žœ ò@CnP ‹ËT@CÖòm!‚¦@D>‡u{‘@D¥ ‰R9°@E ƒSƒqH@EnçÖ€_Y@EÒ:h£ä@F4z°vHè@F•¨ ëBf@FõÄu”@GTÎ®× ß@G²È)P;@H±’Rµ:@HkŒs¾$f@HÆZ Úw@I :Ž« @IxÔÄò@IÐ…^<@J'0 JfŽ@J|ט±;@JÑ~8’R@K%&s€üT@KwÒð¶1@KɆpX…@LCÊõí@Lj íge@L¸çÕž$Û@MÔ”2À>µaýÿœÀ=`Ü?¹žýÀ<¬ûNt# À;÷ŽZëÀ;?_wëÀ:… ‹BÎúÀ9ÈóHlšÀ9 ÆC4â]À8J…¤}ðÀ7ˆ1¤wúÀ6ÃÈÐÖÙ6À5ýM™É’1À54ÀÐÙÑÀ4j$t~ó„À3{)—^À2ÎÈ?nVÀ1þ»/LÀ1+VXê¬cÀ0V¡“â.À.ÿïVÐ¥åÀ-N¿O¡âåÀ+™Â½ÄU+À)á ïm¯»À($ªÜ °À&d·)^|cÀ$¡F/cÅÀ"ÚoúTk™À!NK=|À…ù-u½?Àå0½yÀ>~º\V¢À’&;G=QÀÀÕN¬ŸŸÀS&€BnÀÛÔ›o£€¿ò¶ôäõ¿Í+iª”Xc?æ÷A±¶>«?úªâëËf@ó|…ç=@ —@.E8@@ ¸r Ï@ö‰9•ˆO@ÎÕ?šÃ@¨‡>ÐM5@ ÁŸ\ÔÖ@"¯M@”­²@${Hä@&ŠÜ&Ó!@(x[g·²è@*eiŽQú‘@,QÖ7Ô…D@.=qn¼“ú@0åIÊ@1»G^” @1üÁä ê@2ð5iÛ@3âi4MÙ@4ÓÞié@5ÄMóÄ=Â@6³£˜ÊP¯@7¡ËÊ‹…ž@8޳²n'…@9zI8Ñ;Ó@:d{ þ­µ@;M8¦{†@<4rQåç@=.×â&@=þ3½÷Ë@>àw0¾Óº@?ÁÐI<@@OöK‘â‘@@¾yñÑk«@A,vм@A˜µ^-¾ @Bd™îß@Bo~½¼@BØÓÉð®t@CAšc@C©En§o»@Dù$lëv@Du¦òÞùR@DÚMhÔ(@E=ëiH¦8@E €(§>@F &/&\@FbŒ.Ô½¹@FÂSf¡n@G pè7 =@G}Õ€÷Œé@GÚ1í=KÒ@H5‡5úÓ@HÖ•¾@Hé!}Yû@@IAi‰ÜŸì@I˜°ƒ$@Iîø[×@JDC&yX@J˜“Æ­²@Jë꘵A@K>L ¿ƒ @Kºš@Kà7,»T@L/Æ<ÿ'ù@L~jg}±@LÌ%eøŒ0À=¦±Áh²À<õÅ1Àœ›r1òò@?zÉí¨‘@@+¡÷ Ž@@˜ÿÀ<@AxÃÏ…@Aq Oe=-@AÛ­pŽ@BE`} õ<@B® / Ï @CéHË9À@C|¹; "@CâÒz·@DGe0‹ G@D«=̉€‡@Em+o™@Eoî'E @EÐÄZHEV@F0˜­9Ñ@Fk ªÚ@Fí;Ÿì¦@GJ ÓÎBš@G¥ÙMcß@H§åì”à@HZw­ÆÔJ@H³I了 @I ø¿|@Iaû‚ž;@I·ÞC±&@J Ê«ý@J`Á •¹@J³Åmi—m@KÙJÛQ@KVÿ5SN@K§9Lû¦@KöŠv£Í@LDõ6jÈ@L’|?C$ÇÀ=<á8DÓiÀ<Œã»´2À;ÚùhjšÀ;'ógq%À:qUoŒ?´À9¹˜SuaÀ8ÿçeàšÀ8DBCIÅðÀ7†¨d»ôÀ6Ç%ßìÀ6˜GzB]À5B$Õ‡dÀ4|¿kË.•À3µl²‡–À2ì.ðh÷:À2! É€1ÝÀ1T…Ì»¶À0…:ŒµÀ/h¸2—vöÀ-Õ¾ËwÀ,ÜÝhÿ¢À*n 5ñÖÀ(¾çE=œ¢À' Íù’¬-À%UeÜðÅÀ#›Â,žÏUÀ!ÞüˆÊÀ +qÑ]@À¸ÔNÀ—¯À-§wà ÎÀ IÌΠÀ9‘ä¦òÀ Øéݘ¶4À™ýwOèT¿ü¤o߀ªŒ¿ì¡[®WZ?¥g\ÑG£?îÒÐw°?þ3Ë£¶ @…*n¯Xü@ õ«~Mç@µ`—jÝ×@qà’Ly¤@/ÿE²¯Ï@ïe@»µl@ ×Ý ú'@"¸R·~^@$˜æÆŽ0e@&yl;^@(Y·“¹ïÍ@*9›( åÝ@,ëc7O@-÷{‰9£@/Õ! ¨™Ã@0ØØh”Q‡@1Æ€X©Ï´@2³s§R¿{@3Ÿž…õC@4ŠëÚ”ÐÜ@5uI¸˜Õô@6^¤ü!Q¹@7FëŠ1@8. æÏ/A@9õ=DiT@9ø—ew’ð@:ÛâéðÃ@;½É cÝB@<ž;ÉyN™@=}-Û¾Šœ@>Z’½Ã?Ÿ@?6^«i¦*@@CQ8Ç#@@t€1#wJ@@ßá5ŽÑ>@AJaþ2l:@A³þ‰N¤c@B³2Nå½@B„|°)|@BëX€Ho@CQBÄpŒ@C¶:€é¹Ã@D=YÜn@D}I­šžº@Dß^-_@E@yШ­@E ›Ùhfm@EÿÃÍm"@F]ñtÉ©´@F»$Ö‰¶@G^5ªW‚@Gržwû@GÌåž½ @H&4% ÷Ü@H~Œ]Ö@HÕîû±Ré@I,]lôæ@IÙDf1@IÖd;08@J**óÿ5@J|¯Å–‹@JÎrþ-I@KN+S@KoBáؽ@K¾S)­@L ‚.Ü @LYÒiØÕÀ<Õ2b«ÅôÀ<&&{ðGÀ;u:©§É¥À:Âlò¾À: »· ÅvÀ9W%¾LŽšÀ8žª1K UÀ7äH¨”KmÀ7(.‡#\À6iÔE‰‘<À5©Âí¢“¯À4çΪÀ4#ù†ŠsÀ3^Fæ”À2–·šdø‡À1ÍQÃÜr¼À1û|:¯À05DÈloÀ.̆‘Ê0ˆÀ-+d´Ù¹_À+†ÌñÄäxÀ)ÞΧdbJÀ(3z™qG@À&„âô†ÒòÀ$ÓQçÞÀ#8´¸&`À!fQ“I· ÀVûš„\`ÀÛ­[eVÀZí̃SÀÔõçî~ÀIþ =9À tŒužy¡ÀLNÂXÝ¿ú6[t8º²¿ç‰6¾M'?ÅßpU¯C?ñJ“RÀ˜?ÿä½’<Òp@EQHf8@G3ärÆ@üÏù>áB@¬Ü C»[@^uGW`”@G²)õ±@ âq3ß@"¼¢å½‹×@$–ムZ€@&q…’ö@(K.Ì•„@*$¨å©Ö=@+ý³N@!@-ÖcÀ]»@/­x“^@0Áðiéôo@1¬‹_ \C@2–yR4@3¦ÔÌ@4hçrÔ@5Ou ;Lò@65ñB¿ÍI@7d`¦@7ÿ¼ÆOFû@8âêú@Åß@9ÄßÑ×!@:¥Š?/7"@;„ÞSe@I<Ù@>ó¾Þ5{ü@?Ë >—t®@@Pñ§J‡Ó@@»?ZîÃ5@A$´è”<é@ANX4&@Aõ 9xL@B[Þ¶îN@BÁÏhœùé@C&ׂ*5N@CŠô´˜Ç¡@Cî%(@DPfµ²|@D±¸kL¨@Eâå@Eq‡ŸàòX@EЭ‹(¼@F-ŒÓ(ïÆ@FŠ"ö ’«@FåÆ5¹ÔX@G@vé)gú@Gš5›æˆÊ@Gó O¢=@HJà#Ò´D@H¡Íþ5ØŸ@H÷ÍÜì F@ILá)x @I¡ qßB…@IôHf-8`@JFŸÖ 7¢@J˜®d©o@JèŸ÷.Ј@K8LÑ15ï@K‡sòD@KÕ +³\ˆ@L"!Wƒ‘ˆÀÀ öHö¾Ào?K4¿÷Ù†î"Û¿ã)ÞåéÁ?Ò÷WÊ&&í?ó¯NÙ,6@Ľ {4^@ÅÅ‘@@!ÓNõï@B7\+Ï@æ)rqO@‹—Ó_¨@22@»õ_@ ìÓäºð6@"ÀÓ{güè@$”îÿyˆ@&hý{t”@(<Ö:áØ@*OÁ¹ˆ@+ãB+¨„à@-µ„û½é@/†ðY2-m@0«®uác@1“Qù,N²@2zO¬E<œ@3`”å¢ @4Ff+³á@5*­bq!1@6]‹<ó@6ñ‚Ó¨@7Ò±ÁŸ@8³5áâW@9’Œ`fvì@:p¦Ä(Ýy@;Mw5k$D@<(ðYÈõ@=ûb°@=Û¬'k°ô@>²×kgP@?ˆ}`,Fg@@.JÝ-¢@@—‰L9·¶@@ÿøšf@Ag’UU»@AÎTôÙA@B4<.A'v@B™E6|D2@Býmh"}@C`²k¡³Ü@CÃ5F¹/@D$‹Ÿò@D…Z¬¾¡@Dä±JÃ@EC~ž@E¡NÒ)°@Eþ3Ê»?@FZ,ÄÚôß@Fµ9¿’¶™@GZïо@Gh½É3Š@GÀÛÂZø¨@H<Äzô@Hn´¶¡üK@HÄD´R2@Iíÿ•Ó:@Il±þš|`@I¿’9SЮ@JW0ÂÍ@Jb®áUÁ@J²íj.o@KP7äIù@KPؕРó@Kžˆ¨Ðér@Këb¨üìÃÀ< ÷?M¤À;^ÔcæÄ<À:¯ê[Ž}YÀ9ÿ7¾^§œÀ9L»|Ö~DÀ8˜t䮯GÀ7âc¥·*·À7*‡Ö¸ @À6páúSŠ5À5µsà1dÀ4ø<\7úÀ49?ænñ.À3x€}9ýÀ2µÿ›µâkÀ1ñÂ!ýšÀ1+Ëu¥:ÏÀ0d 9éÖ À/5‹¿:À-Ÿ‚á‘À,2À À*i¨åIÀ(Éõ­³ÓnÀ''(±ŠâÑÀ%S†oø:À#؉àwÀ",ÝWël'À ~eÞÈ›Àšr’…éuÀ2ß ââ,ÀÆC‚IUÀTÔ¿"±ÎÀ½“ÞœEÀȹ&J}ªÀË×§l9¿õ-˜+¯¿ÝÒXnÜä?ÚÆtu‹‹Ý?ôä\‚­0©@‘Hñ5n@µF/PÙ@ÞrúèGc@…®”]K@ÜK«—@·v‡Ô[Ž@R0XÊX’@ öÞBq@"ÄåíËXP@$“‹ßŒµ@&a¬š8Š@(/´¡ú@)üˆ¯fàÒ@+ÉŽ‘[½ä@-•ì#V(½@/a{.hŠ–@0– ùÏFt@1zË }¿ç@2^íBظ;@3B]ò»^@4% %qHh@5æ¼]z@5çÝ Ö)@6ÇÞèÈs@7¦Ü£Jw"@8„Ç$›@9aµ:Úì@:=(u±¾o@;ƒð+ {@;ð•UWîk@<ÈPsáùE@=ž©º­}×@>s–:ycW@?G ¦á'µ@@ €+ckª@@tµ¢½Ù@@Ü"¾–~@ABÁu1Cç@A¨_ÚD@B ‹€ˆÅy@Bq¯äuÍÜ@BÔúáƒO@C7jÀ#@C˜ûsδË@Cù­"÷·‰@DY}›"Íj@D¸k“³c@EvOÔÀ@Esœ"–ƒ@EÏÝ_Ä–ê@F+9fR"@F…°†J@FßA‰Ñ@G7îlÈ@GµúÉaî@GæšDÓÖ@H<›#³Ž@H‘º7è@Håøî$:@I9VZ§¸ë@I‹ÖG©=…@IÝy_€Tì@J.A@äš@J~/¥¦c&@JÍF`µœ˜@K‡\0ô@Khô—ˆtA@Kµ%½H§À;ªKLœoÀ:þ˜økÀ:P7Ê«”rÀ9 “ýâŠùÀ8ï2å ¤À8< ð@“À7‡7YØ(üÀ6Ð !¯ƒÀ6FÇ1À5^3[ᘰÀ4¢f‹$¬À3äá® HÂÀ3%§Jƒ,ÞÀ2dºd™ìiÀ1¢‚·hÁÀ0Ý×±P8ŽÀ0ê†tþÜÀ. ¸J>|ÛÀ-d€k=òÀ+xæ:~÷ÚÀ)àK-/ÈÀ(D¢<[³À&¥û{4£À%h0äŽ[À#_úÙ¼ÒAÀ!¸Ç&kCÀ áûõÁ¾ÀÄÂãŽùÀf¹taóÀÙ ý šÀœTYê>À`Á÷.À€mè»îÀ˜ )¾O¿óP–C¿Õ‹†@.?á/ÈëÒ?öžµjU§@XCwÙÝV@ f#lÈãº@<7}y¢Ö@ÇL *ßy@T@5÷_@â áêƒ@qL·>Ø@!¡\:«"@"ÈÛ›À‘}@$‘/…E@&YwtnW‡@(!Ìî:H@)éM#ƒR@+°é}áí@-w1Wp@/= ¬20™@0€þÕþ•’@1bðOYþ@2DI1e¤¸@3$ø?º¦ª@4ìšë_7@4äȪâ@5Âc»h}S@6ŸÆÙmS¡@7|0WR™@8W𠳓@91Ú„Yï@: 2·@:âô£e7î@;¹«iA$@<©ú~@=c1 9@>5ê$+úø@?9¤g9@?×*ÈþD@@R»mÎ@@¹)ºŽr@AÒ'A”/@Aƒ±+M\Y@AçÈ÷@BKLG|W@B­vÉÀMˆ@Cœè±¨@Coצ³`@CÏÄ ÃAp@D.Ö2’N¬@D Á~›‡@DêfœÁR¿@EFâäSIy@E¢€ñ¦2@Eý@Uüìü@FW ×”X@F°"méB@GED6Ð@G_‰±?"ä@Gµð9ižD@H yŠ-Šp@H`&xÀ¦_@H³÷ÿ¶P@Iï<ÖÛ0@IY oß6@IªSô·@IúÄG@ç@JJ_ýÈ»Å@J™(Çb‘I@Jç j>™l@K4HÂD\`@K€£¿(­?À;J€äaß§À:ŸLÿxdÀ9òiE–œüÀ9CÔ̲£dÀ8“Žÿ4Ç–À7á— 5™EÀ7-îϾë À6x• wXÀ5Á‹DÀf&À5ÒÁ³À4NmBõIÀ3’\÷UÓ€À2Ô¤†CÊÀ2G ¦œîÀ1TH)]¥uÀ0‘«õímÀ/šî%ÓQ—À.]OfõÀ,€°ÇŸÿÀ*îõ"•À)Z7¡YpÀ'‡Góu5À&'óÏïÀ$ŠŽ0²ˆ‹À"êh†O³´À!G–:' ÀDVj’ÀôzïhmÀŸÆø²ŽÀFiÿÚ¶fÀ蕬€À û~@G‡À@°˜×§¿þÙq_A;¿ñ#„ošÊ¿Êùuãµz“?äâƒÅe&‰?øMD½Ìb@ìT>@ ú^ùÐý@‡#‰¤qS@$Ô׫>@ˆ»Ìs@ ¢KxV€@‘u¼!D@! í\w@"̵ÏV-A@$cQ H¯@&RTôß³@(wÃþc@)Ö–¡¢‘@+˜>ñøa@-YJ³T}U@/™%ïpË@0lƒUKÜã@1K¸wšü¶@2*[BÑñ@3Z Œ¥‹@3å¦ÖÈ@4Â/Ûõ;@5æ7öÕÚ@6xºßDˆ'@7RŸ9fˆ@8+…%ŽŽ@9_O}5@9Ú©î¹r@:¯º‡‘@;„#†³Ì@Èö͇k©@?–ÄÞ"îd@@1’2"ƒu@@— tÝô@@û»ó"˲@A_®«M£î@AÂÛ‘U©r@B%?³âz @B†Øf¿¶ƒ@Bç£A‘”‹@CGže\@C¦Çhd@DˆÐžø@DbìrÒ@D¿Ghmmé@E¶åU@Ev7~@?@EÐ9cïh@F)ƒéh®¡@Fõ¦wŒ¾@FÙŽ¨èl@G0O+¤‚ü@G†7”•BÄ@GÛHr„h@H/‚{¯Ž@H‚æˆ]¥­@HÕu—ˆyÍ@I'0Æ&ÄÂ@IxPðÁ@IÈ0ê~®@JwøCÂ}@JeñÈÝ@J³þšá@K ´Ù@KL—ë)À:ìŠLXÀ:BO>*v"À9–oÀØÀ8èêæ<¤À89ÀQ:jŽÀ7ˆïøÞŽÀ6Öz,!ýÀ6"_&CÀ5l¡]DÀ4µ@ä³À3ü@F@À3A¡=U·’À2…g P(À1Ç”ò÷•÷À1.cõˆÀ0G7™¥¡ùÀ/ j{JåÀ-Xí°À+öEàBôTÀ*h=³N öÀ(×MÕ6ÀvÀ'C„Åg„bÀ%¬ò}p³À$¦o­|cÀ"w³U?À Ù,@¬8ÀpHÝÏÂÀ)b„1pÀÝÐBßÙÀÁs»6‚À9eÔžéÀ Áß3èÔÀ %S}Õ ¿ü’’ iè¿îõÈs~¿¶Ž7!Ë];?è|ŠÝ»ý?ùðJÜ@Ö}üå U@ ¹J1¾•@ÐÕú©Ç@ELÒûµ=@¼ ggý@4 /2#@­0fæ@!_Ãø4%@"Ðu¿U”F@$£^¸„œ@&JÅõËd@(ºÞ:'k@)Ä_Šˆß?@+€‘˜Éez@-<.å_¶@.÷›»x.@0X’%y‰'@15útc@2AK@2ì|nŠ¿û@3Ç1xö¯Œ@4¡*äL@5zYÆÛœ@6R¯œÕr¢@7*N%z‚@8˜3Ðó%@8ÖÒji@9ªyRq†t@:}ÇœKz@;OïB}„@< å襵@<ðž`™)»@=¿T·è@>Œ3lH <@?Wü~áÑá@@1Ü‘ñY@@u°Áz]@@Ùv ,ùÅ@A<€™{s°@AžËK#Àº@BSÇ•ØZ@Bac:gî@BÁ³L Æ@C FŒ—Ö@C~®न@CÜHb¿ýn@D99 ô @D•J>û÷@Dð;Ô›M@EJ•;D¹÷@E¤±7.(@Eüш+Hè@FT³†‚ûß@F«Â ‰ #@Gþöt£ý@GWhÒlQo@G¬¦Šì@GÿÇ å{÷@HR¼»›–»@H¤â–æÌ5@Hö9›7Z–@IFÂåW£@I–®š:@IåqK—@J3™'Ö½´@J€øÉWûü@J͑ɷՇ@Ke×8 žÀ:XŽùjÀ9çŒyýÝÀ9<<¸íbæÀ8Ç•ÃO~À7á·õ®"¨À72 ÿ}„À6€Ê1Ò®nÀ5ÍífÖ‰®À5x×ÛÅóÀ4cn úÁÀ3«ÏD’º„À2òž®¾?%À27ß8›AÌÀ1{”+{À0½ÁCåUnÀ/üÕhØÅ¯À.{*P›ˆÀ,ö‹‹®…ÚÀ+oaŒhÀ)ä¡ü›À(WnðËXLÀ&Ç|;®6À%4ØFSOõÀ#Ÿ“fúÏÀ"¾ú´qòÀ mmdØÚ°À¡d2hLÀcB¿n^²À ¡Šž¥ÀÙ­GiéÏÀŽ”¬µç]À £fBÀÙu>' {¿úYOÉ ¿éålŒàlè? :áP%?ëþê´L ï?û‰ ˆ¥¿w@Ž1'$nc@ \DS¼ÐÒ@!D^/@ÖÀÙÜÌ@î™®Ò@çy @ɹ•ùÈÚ@!`±—² @"Ô¦è`@$‹ï%jG¢@&C·!X @'ûS:‚`¹@)²¢?¿}–@+iƒ'¥¦`@-Õ#>/@.Õw®0Û@0E%P*ó„@1©>æ@1ø¢Îù@2ÑU(Vú@3©ƒ§,¼!@4€ý^•õÅ@5W´C†œ@6-šSǸÿ@7¡ò]¦@7ֽ웘ð@8©á~ÏÏQ@9|Xg¯O@:MŸ¡ä@;ôÁg*@;ëÌtÅÆº@<¹f»©-¥@=…Åæ&‘@>Pà“/@?­äÊ@?ã%~1BD@@UÅ?ì@@·úYu@AKnú@A{ŠÉë @AÜ:”‘;î@B<+ÉpC—@B›[üªr@BùÈÿ*ž)@CWpÝ^ƒô@C´QÝÕœá@DjdžT@Dk¹y„ï@DÆ=¶ÕíF@EöWHˆ@Exâ¬r)@EÑ8&{Þ@F(Tª¦@@F~ÙàÈK'@FÔ‘âðU@G)|ßÒ$@G}›/4·@GÐíO!h@H#sÞ„7Ô@Hu/Ÿ"ƒ÷@HÆ!r Å5@IJVcG@Ie«g=$@I´EÛCí@JuÒp@JO,= ^@J›{  Å@Jç îéÀ:5ÞÁ‹À9˜ `àcÀ8ãÂ4ÓPÀ88\°±ã…À7‹g•ºeeÀ6Üã6rÀ6,Ð:ï7“À5{/¤·DÀ4Èά™ÛÀ4KwS.IÀ3] ½"EpÀ2¥F%$wXÀ1ëýPŽlÀ115püêÀ0tñ“ã®À/nl(PúáÀ-ðZ‹kpÀ,n×ÎüeÀ*êÎX”=‡À)d¹2ôÀ'Ú}•4ÂBÀ&NP¬,RúÀ$¿‰Ða%}À#.9ëd-À!šoN9xÀ >JìSÀ×sÄ=Ó¡À¡éþž›LÀh ‘¤Ì€À)ýÿ½pÀÏé7¯ãJÀ D8ûKhÀ±LèNu¿ø/×ó¶¿åÝ`‚ê*å?ÂíÕV4ïÜ?ïj¡Óè*?ý10o@A:[–ëù@ ûbs q@\]|õ×@¼ÔLÒ­@³–λ@»]w@å®d¬fÓ@!%&^àE¾@"׫W– R@$ŠF$,§‡@&<ÖÁà@'ï=/÷Á@)¡YˆVIA@+S Õo@-5"ƒ­@.´µ’ÁJÇ@0274uòc@1  ðz#@>ÞÊ¡œ¥É@?¥[°œ@@5LÛB^@@—?¨/ô;@@ø‚“¸÷@AY}ì#,@A¸ìƒºH@B þ(×ñ@Bvtn ›@BÔÛë/¦@C1£[@C1kØâî@Cè˜V@DC;~„/@D ?4@Dö22(RB@EN„†Óq@E¦ÆB†ê@EüÑõ_ïÄ@FRÍc*æË@F¨{ÃÁ@FülåúN@GPR^CC@G¢î¨µÆ@Gõn¤rk@HFVJ´ûú@H–â h@Hæ©y¦D‹@I5­®èÐ@Iƒï»Í”‰@IÑpÒrVJ@J2<Àª@Jj5W¿±é@Jµ{˜†áGÀ9ÝŽŒßæÀ95ì6âˆÀ8Œò·ø’éÀ7✑!€ÀÀ76ÁcQT|À6‰a©ºŠÀ5Ú~2\ö?À5*!>¨mÀ4x0óŽ}GÀ3ÄÊ‚½B¹À3çÃÀ2Y‰³é*À1¡³Â27}À0èj_ný À0-°Åþ8‚À.ãgÍ¿ðÀ-gü«ŠzæÀ+ê‘m&«À*i‡8Õ”À(æB¥SæšÀ'`]ÈŸå¡À%׿|¯ÂöÀ$L눧ûnÀ"¿| Œ²IÀ!/ªeTÛÀ; ÄÜ rÀF5ž Àå'‘Ò÷XÀ³Ù£óè‘À~†™< wÀŠ´ÙÚœCÀŠøhDÀ]Îùçh¿ö>›®”Ò¿á¢‘ˆ?мd‰Ò” ?ñ`Pvj^\?þ›o&Á¬@ïË€b¿v@ •ò»ú&v@ŸÝŠÿú@öV* €@N)‰;b@§(¶H@î€ýñÀ@!-³Noì¢@"Û#ý@$ˆ§áBrø@&6"ÝɈê@'ãuJ /@)€uꃩ@+=%ÕF@@,éGGI¼@.”Æ #ÅÖ@0€ült@0ô³FùÝ„@1É&Ùz ¸@2÷í]@3p]¥!üJ@4C-V•^@5ø+ò‰*@5æ)èsÍ@6¶Œ¥¸“à@7†L´@8T¶à ƒ÷@9"fù™@9ïËÜ~¯@:ºÃ [!‡@;…Zñ_!‹@¤Dýˆã@?höF–š@@0ƵS’@@w?np&é@@×£îŽc@A7[/vJ@A–bTÏÊ-@Aô¶»ýsb@BRUùüõ‹@B¯=ÛÍ2@C le á@CfßÎÙP#@CÁ–†•ò8@D,ŸD­@DtÈ’ë€Í@DÍA»›€ @E$ù×~&è@E{ðDˆ”Q@EÒ$ŒE9«@F'–b;çO@F|E¢T¼,@FÐ2O7Ê€@G#\«&Ý@Guıð÷¡@GÇk &ý5@HPh¨í¢@Hhu7vßÍ@H·ÚU åð@I€§¸Ú5@ITi,KDì@I¡”ú`)’@Iî@nN@J9»@Üy@J„¸TÀ‡lÀ9…ÞJÝÿ^À8ßZ-"À87ÁC³YÀ7ŽzYnÀ6㸒×NÀ67{í:ÒÀ5‰ÆˆôGÀ4Ú™9¥ÏÀ4)õ‰úú§À3wÝs†ðÀ2ÄSE‚hÀ2Y¬NíÔÀ1Xó¸hºsÀ0¡$Ûã®.À/ÏáÞW /À.Z¸eCûPÀ,âÖ¡0À+hF½jYWÀ)ëÀ1b“À(kI‹é':À&èôáº\€À%d#bÝëøÀ#Üã‘s‡À"SDз)ãÀ ÇWd—{¶ÀrXá,ÊóÀQ«ëú÷FÀ,Í¢®ÐÕÀånZßÀ×`í¤À M:ND·½Àå( û&êÀv]>K+¿ôr²´L¶¿Ü0æ ©}~?×Ô¡Ý?óåá;±æ@ †ŠQÒ@šÇ•ïj@ ,ý|ƒô@á²Gëâ@.l"¬°@|s1Dš<@˹M @wSe@!6 ß}Å5@"Þ„ËTä/@$‡é¤7O@&/™›©ï@'×øDàÅÛ@)€_ƒt›@+'Ê…!&@,Ï>K@.u VÂ@0 Â. é@0àI W¥@1²X‰èа@2ƒá-äRw@3TÖLû®@4%)ò2Q@4ôÏë$o@5ûZ(g @6‘ßôÃ`B@7_1Éz[@8+¥Bέ@8÷/+1@@9Áijv¦[@:‹[p±0›@;SéaÏÉ@<dñå°@<áÄõƸù@=§µ¼^Õ@>kæ=ÿp@?-ê¬Æw @?UpU@@Wòâ8¡!@@·|IlØ@A]ør—@At•ÕÞd@AÒè×@B.ùoî¹@B‹"÷QØ@Bæ–מޮ@CAVX”«@C›^&«üü@Cô­£&%N@DMCR³Y@D¥)CI@Dü=K~gÃ@ER FÝÔ@E¨EÕNÒ=@Eý.WG•@FQYUóD@F¤Æ½£<@F÷v£h._@GIi;s[ÿ@GšžÜû‰@Gëúꨦ@H:Õ,„¦@H‰×îŸy@HØ¢ˆˆ@I%¬—Ìë @IrþŒ@I¾Ÿê{“Ò@J …‡×@JTº Š AÀ90>»Ï£;À8ŠèÇàÀ7ä!O ©çÀ7;è‚Ê,ûÀ6’>ÙjhÀ5ç%7óÀ5:œFlµØÀ4Œ¥ÍýõìÀ3ÝC`MM/À3,wÒêŒÀ2zC'­šÀ1ƪ~BmÀ1°&ÃÀ0[W™rÀ/GI|?зÀ-Õ7•r­^À,`‚ÒœÀ*é5L8jÀ)oYîˆÈ¢À'òüv4ÜàÀ&t)t¸íîÀ$òîPÿ!BÀ#oYGömŒÀ!éyl”¬òÀ a^§<½éÀ®3i%lÀ•xF‚…Àx°¤WÛ ÀXØšc¸À3–Ê«F®À +ÓOö±ÀÀVCzhñ¿þÆ @'µ¿ñÿ*Ó¥Ì~¿Ô³UD´Í?ÞÁt[Ò¢y?ô—}°a@ÃæÁP@@?Ýhyä@ À`{ó¥ã@!îÁ³I@e%#Øš@©œ^Ķë@ïÔ½¸¬@5njV"€@!>,PC~ @"áÑW°¸"@$…‰Ð‹A@&)96šÚx@'Ìà Aq@)p ÜÚXu@+ô`ÕÆ;@,µct—^Y@.W<0ñË1@/øbõ× Ì@0Ì^;{ê•@1œä£;@2kN47L{@39÷'oç»@4ùõî@4Õk.1Ë]@5¢‘~<ì@6n@­±@797¬3æäái@>ô*Ä©¦å@?´º ó@@9SˆÞTO@@˜—¡@@öCy¬V@AS~2ƦÏ@A°@P7o@B X5¨á‹@BgðÌ9E@B€Àé¡@C–¦a…@Cuè’å?@CÎE«[@D&ƒlúÒº@D}ÀóŸË@DÔGïåöè@E*¢Q¡›@E/t?@EÓŽö‡Â7@F'5à9Ù@Fz$ zõ#@FÌYz…!}@GÖJÉË@Gnš¾4øp@G¾§4 Ç@H ü+`\j@H\š;ÛO,@Hª‚%¼v@H÷´“ —K@ID2žßi@Iý“Ÿ@IÛ:Ó§@J%{¿h»dÀ8Ü%&£¢À87Éÿ:Å~À7’Ãr».À6êÛ±_À6BI`a~À5˜P²ýƒ÷À4ìòÕÕ1êÀ4@1D#HÀ3’ É|-ìÀ2⊅‘ŸÀ21©ëK¾ôÀ1nÈY©¼À0ËÜB`õlÀ0õÛu1nÀ.Á~æø’¬À-Rz“΀-À+àçþ|aÀ*lÑ,ø€GÀ(ö@ìk—ÔÀ'}BÓéÀ&ãA–8*À$„/d :À#527—TÀ!‚otKOÀûSSÓdMÀîprqÈ~ÀÝ€yŽ#Àȧ/ÒÂ8À° âS„À“ÏWÏŠúÀ è?”Gù^À¢I¶Ë2¿ü¬&(Ãúï¿ðè’¨ìпÊćF‹“Ü?âÂK ÀÅx?ö$|¹|-@xW ôò;@âzØKÙ@PAy`¼@`¢ö¢~@šS4Ë@Õ°Ç;´p@Ѻ$ç@N¼%6ð@!FÀ4ú³@"å š¤w@$„ /{>@&#>±N@'ÁÒ­G8Ö@)`eÂt@*þÿÿØM@,œ`Mgc@.9‘Ÿ»º@/ÖÉd¯Á@0¸ì —¶@1†\Be»æ@2SOÙzÐ@3º7nÛ@3뀿`@4¶Â;…@5Hç… @6KãM@7§[ê—@7ÜWr1j°@8£·»ìó@9j4RJ¢ï@:/Ãd;´&@:ô[{.úæ@;·ó¬„|@»ªÈ%°@?yÇÈЀ@@[2³mO@@y8%aƒ@@ÖwÄ(Ò @A3IƒNU@A!æ<@Aêkë:Nó@BEt3ùø@BŸ#»™?@Bøïk”ß@CQ/kþ¯¦@C©0ºûÙ @D‚’T!ã@DW#Ó#HÇ@D­ˆ…G-@EPæ`AÜ@EVÛH$¨¾@Eª²/…1ô@EýÕC(MN@FPDMT™@F¡ÿ:™Ì@Fóws@GCYÊ0@G’øxŒäH@Gáä®J;Í@H08ü²«@H}¥¶ ðø@HÊ{ÞüD@I¡~ÌÞ@Ib{=‘Ñ@I¬ÞÏÔ@ß@Iöø‰ÁýÀ8‰…æâMÀ7æ%y=þMÀ7Ae÷úOHÀ6›GÕÉÏÀ5óËÇ©SãÀ5JòÍ À4 ¾-é†À3õ/{‚-À3HH—J$À2š ±ÌÛkÀ1ê{Of—À19šF×—uÀ0‡kÇÀå{À/§æ±HfàÀ.>i´ßW<À,ÒiZ}À+cíÿÊO À)ói£¹À(°þô\À' -„À%’ #s~HÀ$ÏÒßÉ}À"›`î(SrÀ!ÌéÖ À8Eö†4XÀ2æ.KB1À)›ß+¼ÛÀ‰âædÀ Ô‚h`2ÀïBÜjßsÀ À/k.`ÜÀŠ¿y% M¿úžŒÂ™âC¿ì8gâ‹ÙK¿¸òN[¡s?æÖí=ä?÷¨C÷Èen@(“¹ÐFé@€ê„óû®@ÜÄ81ƒ­@Þ¤ p@θ,Ëå@»‚xýÅ@3µ+2ƒã@gpòª$@!MÝ2 þâ@"è.e]6@$‚‘£–n»@&ìv[É@'·$jDÂ@)QoA=@*êÂBÙ?9@,ƒóÀ¡@.™¨‡œj@/´šM@j@0¥î%Ñáæ@1q#JÊ>O@2;à>Aî@3ÝÄ•x@3ÏÁ@©Í@4˜Í¼(ÛÇ@5a2è²R@6(å¥ vÖ@6ïÛ¦ý@7¶Àµf7@8{d`*%Í@9?äÓ$û@:~Uexù@:Æ)ë·¿?@;‡ÞÄy1@˜y}@=ÆÚ@às @>„_4Ñ{^@?@Å÷½ @?üíîi7@@[nU§s@@·‚tù²,@AZNj¢@An”lM<@AÉ.rކ@B#&0¸@B|y¥sþp@BÕ&þbr£@C-,“ªuá@C„ˆéªµi@CÛ:¯cgò@D1@½p¢@D†š÷ž@DÛEÞ…Ö@E/ChíðŠ@E‚’(5¾@EÕ1³ªãÜ@F'!ÆŽ%@Fxb:ûÁ@FÈó.çG@GÔZJÉo@GhWx?Ç@G¶‰Z(³“@H]ÑÒJ¦@HQ„G¯[@Hý]O@HéÉÌW¹Þ@I4êc\L@I`¤CQ@IÉ+®à\À88V3•˜ºÀ7•ð)O3À6ò3­·ÒÀ6M!•FÖÀ5¦ºX?RÀ4þÿݯü«À4Uò´ðÎ À3«”Ë%³À2ÿè½1½À2RîÏ¢QÀ1¤«?ÃÀ0õ!4j·À0DRô-¨ÑÀ/$ˆ°úðúÀ-½òƒ}ÌUÀ,TëÐ_vGÀ*é}ºE|®À){²\À( “væ²pÀ&™-ùV&À%$‹*ÛÀ#­¹ÞуÀ"4Ç!܇À ¹Àñ›¢àÀylW¢0 À{lÈÁ ŒÀy£Æ/PÀt3AQËšÀk>ˆ¿óÇÀ½Ô~HØÖÀž¸§ KyÀywîÃ2Ö¿øœÆO†¯S¿èw5îÞU?‡ó®nÂLG?éJ#:ôJ?ù#0µ/ @ÔÆåJ2@ ·A Ý@f ¥·þ³@Ù°iµ¦è@¬ØÞ@*Ç¿5G@TÏu”´@’þ¥‘y@!Uo¤?@"ë@}Pæ@$"ÑÒ©@&ýa@'¬µ ÓÊŸ@)B3*;š@*×\Mï-!@,lÚ·n@.LÏ×0–@/“âgÙÄÌ@0“`’‚ò@1\fé3@2$ùÏÝÁ¦@2í éÝõ@3´•Å@4{†º³k/@5AÖÚÝe@6z¸1ж@6ÌgÓ÷T@7“õwiZ@8Sõ6y@9ü¬›ß@9Ø1å‘“@:˜ùPha\@;XÒNàwŠ@<³¸ _g@<Õ•¡(/@=’pzeÇ@>N= Û@}@?ôƒýèî@?Â` ß@@=…A %@@™.“:M"@@ôAr±@AN»Y1å @A¨™í½³Z@BÛÅ'@BZ|œ²I@B²|á9¬ï@C Ú)A…@C`’õ*#L@C¶¥í"­@D ⫸X@D`ÕÎe½@D´ðÍÄi`@Eb%a¸@E[);s³G@E­EšÓUR@Eþ¶îìëÌ@FO}ß{&@FŸ—Å ðÂ@Fï;Þ©ƒ@G=ËŽ§ ½@G‹äÿ[G~@GÙSêlO@H&Å”*p@Hr4¬9ä@H½¦š9@Ipó¯´ö@IR“ùƒƒ¡@IœŽÜÌ~À7è‹VEÔåÀ7G ¨‘±À6¤ea·À6]þÑÏmÀ5[ ÙÕ4À4´lÈèβÀ4 …@Oä“À3cUû%2À2¸àý^”qÀ2 (•¾,?À1`/_¬±À0±øDù%ÀÀ0†…À.£»5–À-@êc¢ŠÀ+Ùì‚ô‹üÀ*qXÁÀ)ÊL:53À'™Ò¤W üÀ&*¥1£±ÔÀ$¹M¾):À#EØÃ¥^À!ÐSlÇSÎÀ XË“9¢|À¾Ÿ~ó#ÀÇÞL ÙQÀÍsO’²ÀϘ%›«ÀÎ%‚n½À “UÅ):Àƒ›ÖT£Àn6šE‹¿ö¦`ÚùJ¿äËb¨7‡¸?¾O—1/9ê?ìqí¶÷në?ú•™¤’²i@}v @ ³fšþ»@ì4ô@’6@&™ç’Ý@3wzSáž@SÝxB1Ü@u(y}@—(û)´@!\Õ¡Ã>/@"î@ž[{º@$¼bK@&0QpjO@'¢ƒÔW!@)3ž`ο9@*Äg…"˜@,TÆôÒ#‚@-䤎+q@/sèiHì,@0=oѾ“@1H"K!){@2—C‚:@2Ô‘£ó@3šod›@4^æ˜JØ@5#,ÒôƒŒ@5æÌ°]z@6©¼`½×@7kðè³ @8-a¿mÒÍ@8î6˜:Ý@9­ÒIÂ"X@:lÀD››â@;*ÆÄÈz @;çÝ»…†‰@<£ýo š@=_{ª}Ñ@>9Ô±Í1@>ÒHÅZÛ@?ŠDïˆæ@@ ”'“2@@{v›–7¿@@ÕÇ)¯Y@A/ƒQ-—f@Aˆ¨À-·ñ@Aá5MHª@B9&ú˜‘@B{ñ ¤@Bç2ˆm¾„@C=I; @C’¾­¡÷@C瑪ó@D;Á#‹Î1@DL,º¸@Dâ1ÿ™ry@E4qøÃ'@E† “œ“P@EÖþp‹[@F'JL’÷ì@Fvïߺ@FÅìê%—@GCXfü@Gaò—ÝQO@G®û& @Gû^Ou¯÷@HGTuØ@H’3.¥¼n@Hܦ†`ÿG@I&vçw@Io¢¯;9›À7š9ÇãÀ6ù§þ/§¨À6WïÄRâÀ5´òƒ¼ú@À5±Ûwœ À4k.ÜñõïÀ3ÄkÅ +À3h@Ñ—À2s(€c¶ÒÀ1È®+q*À1ûåÚÏ«À0pŸÃ€?À/ƒ÷,¦È­À.%hª8½ÍÀ,Ä…n»óíÀ+aUÒL À)ûâЖ'ÒÀ(”6 |TaÀ'*YÇa‰7À%¾XönÐÀ$P?-v—ÿÀ"à¬rtÙÀ!mòYêy¼Àó³‡Üš@Àº=6xOÀ…7ÓÀ$çU"‘ÌÀ.LãܹÀ4hèÓFÀ nºN<ÑÀnœ•?ÛWÀhÁëcL¤¿ôºì³©.«¿á4 ©ëý?̃ƒÌë?ï‡ê1ÔXê?ûÿÑÊ äú@!®~b@ FôE}ó@7°Üw[@MNƒzvÿ@d%œ ·`@|%ìÜ@”ǰözÚ@®5oÈÏý@!d%¥gÁ@"ñ/{;2@$~^,8­@& „ùzD@'˜Œ§æmÿ@)%]_²B|@*±ß‰þ…Ö@,=û±{ï@-ÉšŒAد@/T¥¡²S@0o‚!¯™ @14PÜ:F¥@1ø³’Ï„@2¼ŸO‚ä™@3€ Q¤½)@4Bç Ä!M@5.!^ŽÔ@5ÆÔ}™é@6‡ÐB/4@7HÖ_FÐ@8¡äÙô@8Æe]ó5V@9„Y€fþ@:AuÓ†Y’@:ý²-A‚c@;¹²æ°Þ@œ¸‹}x@?SH†Íô@@6è\3’@@^UFÓ¹@@·æ¯2@AæøfZà@AiU†H'Š@AÁ/£jiL@BsS‹k›@BoÂvæÎ@BÅ0CjKô@C¦PhN@Co‰}l@Cú³ôk@DV¹ƒy@DjR§g&F@D¼­­xª'@Eg9ƒ¸@E_~hØE@E¯ó".J@EÿÄùº#â@FNó½•=8@FXe ]@FëgÐOª€@G8­EåÚÛ@G…OóÇØ@GÑP*'Ù’@H®T“‰Á@HgjòÛ@H±†—…«¡@Hûíùu¹@ICݱž‰À7LûTMlDÀ6­€éT9UÀ6 É*€lÅÀ5jÔôä)À4Ç¥bVNGÀ4#;ËR½2À3}™ÈÖå À2ÖÁ6*JÀ2.´2™×À1…u#Í®À0Û³éRaÀ0/kÙñìeÀ/O¨2îÀ-©|ZsŒÀ,Kew“2õÀ*ëH¸•³À)ˆŽ³Ò2À(#á;¾"3À&½ˆ0±À%T4Ñ÷À#éLÛ«`À"|f¤ À! ‘RéXÀ9²©¥öÝÀT™àNeÀkò鮦¸ÀÞSÆRÀz³œÎÅÀè•ßÖMÀ P“N>RÜÀ__iVÇ¿þÑÆ)(=¢¿òÚhÏÆt¿ÛaTs'á?Ôʲ×+rÝ?ñFaÙ Iö?ýb(p—c@¬øJ¢™@ ×§{q©@w×À+“@…4Þ85Â@“ÁbK@£PyB@³´6>/g@ÄÀ{v½@!k#ºfÅ@"ô ½;3@$}`¥@&ù¸?zL@'ŽÍÝ Ý@)lò­Ïf@*ŸÀ3._@,'°øäg@-¯(ì•T@/6IÊöª@0^*<‡ý+@1 îA²4#@1ãIó5±H@2¥2¹Ð4Þ@3fž,Úš@4'‚%@4çÔiõS@5§‹f¬¸l@6f|†_@7%Y#«@7â­î²I@8Ÿšq‰Þ_@9[¾\Y1F@:qÛˆ»@:Ñ‹¾¢Ç,@;‹%š«!V@h:ÃÔ²@? ‰-Å@?ÐÑVþ®@@AņÁÁ”@@š™9‰¢@@òá+šŸ=@AJ›4¡Ö@A¡ÄÕì ­@Aø\tAÉ @BN`(¦@B£Î#y/¿@Bø¤ÿUj$@CLãM}©@C ‡Î—×™@Có‘fjmŠ@DEÿ fA@D—Ð e$@D陉Fî@E9™RH@E‰ìã(@EØè¤|p@F'¡ç1@FuºÀ”ÀÃ@FÃ5&h“™@GR¤Ñ@G\LoaBš@G§é¾ýZÊ@GòèšWÏ@H=Ip2U@H‡ Ä(õ@HÐ3-°bu@I½W*•…À7"¦ÖòeÀ6b Jn À5Âè"þÀ5!ûã°À4ÛŒ@ÊïÀ3܉¥1LÀ38ryªÑÀ2’VÜÊOâÀ1ëzˆŠ À1CsuVÈVÀ0šEÆg¼À/ßçâå[éÀ.‰}„uóÀ-/âg7ÑÀ+ÔBÃ*rÀ*wH_‰À)qFyVÀ'µ¸¡y—ŒÀ&QñX­S¾À$ì&ÆÅÀ#„aÐ+Ç À"°Šsx[À ¯“ío'ÀƒqÍŒ¡ªÀ¥'–ÑÀÃRT¿õÀÞ8L˜^ÀõêÊÎ À ‡—Hq<À 8c 4ÏÀVdÐ$¿üÜ˾)­y¿ñD'¨g¿Ô€‹êµýƒ?Û0äÓµ¦?òÀŽ~?þ¼ç¦«D@`6Aöea@ e=FFA@¶š¹ÕJÌ@»åÁöt¸@ÂU#Y…‚@ɽìüKW@ÑôɶOÎ@ÚÎJ5Í@!rìäŒÑ@"öÜ›¾à@${¸3°þ¢@&WçÆ;@'…EQàè´@) ÊÆN@*ŽÎd§@,áïó|­@-•Iy×@/&ŸÈô@0M2¾Æ=@1 öW%K^@1ÎUÚŠ`Â@2ŽFR¥ý@3M½©÷z£@4 ±ý±I@4Ëš´íg@5ˆëö*ñ@6FôÕœé@7¦cï@7¾~…¶!‰@8yœÎÕÄé@93øödÓ:@9íŠ÷Û²=@:¦KÖRº@;^1Öž›a@<8€ ~@<ËVÛåØ@=€‡£>ì@>4ĸî©@>è;¸ŽÃ@?šHX+†a@@%ƒRÚ@@}Û–(@½@@ÕlýVÓ’@A,tw—¼@A‚ïéT`Z@AØÝ\K8D@B.:ÿ"½Œ@Bƒ$ë‘.@B×@D“ð@C*äøG‹ê@C}óüÏGë@CÐl0Ó‡ç@D"L” À@Ds”FÝù@DÄBˆ¶‡ @EV¸ #Ú@EcÐPÿŠ@E²®ì­a@Fò@&©Ž@FNš‘{@F›¦i5ê®@Fè,~@G3ì[©_@G&šŸÈ=@GÉÅÁÀò@HÊUŽnc@H]4ÉSúQ@H¦£íg8@Hî=~ÝiÀ6¶‡¶mHºÀ6ü<ƒÀ…À5zBàËÏÀ4Ú\§-ÍÀ49JÐæÉ1À3—×P$áÀ2óªpæk¤À2O’%‡÷À1©po^ À1Ÿ|X_=À0Z¯q3µpÀ/cF1¼qÀ.ü€I"À,¸‡¼,“À+_ïÚ{6íÀ*=¹±À(¨wãÎz“À'I©ÊÉ£—À%èÜñò$À$†˜xÀ#!næ‚ò9À!ºåÏ&À R‰ Ké´ÀÐϾ5ÐhÀù Ã^uÀÎ:•çÀ?Ö¶"oÐÀ^}Ž¢lŒÀôR[“b´À %òàNÇÀRaº;¿úò1 È3¿îl›/¨):¿Ë‰ì¤Ý?ๅ“Ðù?ô2ȈNŒ@+ÿD:î@úk •c@ ïÒ„¦¨L@ô -ßk@ñl°Tí @ïê´Å¶Ù@ïY·Ð @ï×h”¾@ðbâÿT½@!xÔ5øJ¶@"ùšë@$zp4–jò@%û>°XÃÕ@'{ðþýQ@(üqÌS]ù@*|«×Ï=þ@+ü‰üéåf@-{÷;e5@.úÞ¿m0f@0<•ôÇ/@0ûe+=@1¹ÒóH°S@2wÕb˜cž@35b·Ú¨˜@3òq^Eá@4®÷ï÷ºß@5jí:¨úD@6&H@àN@6á=u¡€@7› ¥å †@8Te,žŒ~@9 þ×@9ÄÚ›ÈCk@:{è+½"B@;2#,8DX@;ç„›ïv@<œÀ(VW@=O %¤¬@>M¡Uî @>´Pæ& @?dÊ›Œh@@ G—ãº@@a¨„<@@¸…³R¡‚@AÜêýéî@Ad¬¸‘ë@A¹ñ=ëÓ¢@Bª—oøŠ@BbÖu–Z@B¶sMCÎX@C ¸.©@C[úox©²@C­âMn²6@Cÿ6L]O²@DOõ…Ö–@D 1ï _@DﲦtIÁ@E>¯V´k@EϬ½`@EÚâ½&AE@F(âàAó@Ft·ªÒ×@FÀ½fëÆ@G +ɶ†O@GWkîÚŒ@G¡Aˆ\‹¸@GêénË@º@H3úƒ' @H|u<œc@HÄZ$·ŠˆÀ6m!ŠÍ "À5ÐŒ@o.À52Ðw@À4“ïF>CÀ3óéþ(È—À3RÂ&<ÇÎÀ2°y¢ËYÀ2 &rKÀ1hŽ ãÍgÀ0Âïï“ÆëÀ0:wÄ’oÀ.èá=øD,À-—+E…+ãÀ,CZ%:TÀ*íu [z’À)•„c¤ú/À(;«¤èÀ&ߣ žÀ%Å1;Ñ2À$"_•N%À"Àb_„Õ¥À!\ó‡2ä…ÀïoÆé#À!¬¹úpÀP‚ÕkX!À|¸Ç´9À¤œdãqÒÀÊßâ»À Ùd_EPnÀ¦Ä:îÀSpyUs¿ù—ì-2¿êå¢jO¿¼¯¤s»y†?ãÊ™.r*?õYÐμ¥@®^Ÿ­c@‘joî@ wƒüý3@0.âzè@%ÔÈ!@‹s3»¶@+=ý @ ‹|"…í@ Á³{·@!tü¯„\@"üK"°@$y/É 0@%ö ¨ˆW@'rÎö*cQ@(ïak‹éH@*k¯}tÂ@+礻“»N@-c,×èÌÂ@.Þ3®tŸ°@0,R¦a¼‰@0é6ü¤G@1¥½BT¨@2aÛnøàp@3ˆVåJ@3Ø»ï¹@4“içgìÏ@5MŒ8Zw³@6@Fú@6À{$uo@7xQ¿½ÿ@8/ì•ö€@8æÑ¸ê˜@9œøì³ p@:R[Yï}H@;ñ½PG…@;ºµ@Öm@°å~@?0OmDê@?Þ ¡OÁï@@EûƒÚÅS@@œ&Ãól5@@ñÏÝj.@AFô¿X Å@A›“{1°È@AïªDr+¯@BC7p6h@B–9tÈY‘@Bè®é!¹¾@C:–„[´«@C‹ï>¡@CÜ·¨ßx@D,ï;q”,@D|•’@D˨VÞN@E(—àJç@EhNspê@Eµna†÷@F2µÑÔ@FNbðΨ_@F™þ·½À@Få :ì)@G/yæþr@GyWËÔou@G¢§¯gÓ@H Yëæ»o@HS~Ö[‚@H›`óºèÀ6$çwÛhÀ5‰GlXžkÀ4ìˆð¬À4Nª‡·¸À3¯°4‘FÀ3šª¤]@À2nk·¶æÐÀ1Ì%c„•À1(Éñ"\À0„[ߌ,À/½»Ø-zÀ.p¦$*~ÏÀ-!}G‚À+ÐG­ÂD>À*} [SÀ)'Ö˜í*À'Ъv2½À&w“k[›À%šˆXPÀ#¿ÉßÐιÀ"a, bXµÀ!Ì"kÎ"À=kš@DoÀuê_°—À«-äWžÀÝP|IèÀ mvÄZBÀ8¡$-JÀ ÄVcÙ>À„”BLÀYÚÚu¿÷:£]0'Ö¿çp³Ã€”¿†®þ=ôѺ?æËó¿‚?÷ˆ¿ü| @Q,-dEÈ@%RĺY@ ülBÁM°@kÅã`n@Y'ùÿ9ß@H@I‘S@89ݯª@(íŠ3ü;@ îº)@!…ò–ÞzÀ@"þìÔnè@$wô±Ž°N@%ðö32C¸@'iÝ`¹!¾@(â–K†xì@*[ «Y@+Ó-ýÚÁB@-Jå]åuQ@.ºî'ý@0dä 1@0×h72È@1’i¾ÈÜ@2LT0 âþ@3*c ®@3¿Šáµ@4xj@p)²@50ÂnÞ9è@5芲y8@6Ÿ¸üËÍ@7VGÚÖÄ@8 ,eˆ}@8Áasaû‘@9uÞÍ£´„@:)KÒÐÒ@:Ü–*¬¾@;ŽÂGÝ[Ê@<@®'ƒT@<ðœ 7þ[@= =uëïÃ@>NúG`\@>üÍXQt@?©°Ð~¥‹@@*ÐD=`£@@€KÓñØÖ@@ÕHë޵@A)Å~XÙì@A}¿£¾=@AÑ5‘¹a`@B$%Ÿ B«@BvŽB´‹!@BÈn®ü@CÃÄ>à@CjŽ*þt·@CºÌ8]=@D |û+@DYŸžŠœ@D¨3hΔ„@Dö7½P‰¡@EC¬Y0z@ENˆ)@EÜãT…{æ@F(¥¬{Yý@FsÖ÷ ÈH@F¾w)ªç:@G†OKK@GRˆïj¶@Gšò 0`@GãOzj@H+ R0@HrYg8À5ÝÑÃîZÀ5C%OjWÀ4§a*ŽèÀ4 …ã h³À3l”ãôÐëÀ2ÍÍÕÝiÀ2-xxn\À1ŒPò‹.À0ê„[˜§À0FÚ±ðD™À/E"rÚmÀ-ú„((gÀ,­àõ“ýGÀ+_?ÅZ>ÅÀ*§ÿ«ê»À(¼!Šò†ÖÀ'g´Ì±.BÀ&jª'<)À$¹Lˆ±ÖCÀ#_dMé[CÀ"¼_wä À ¦_¢¦AÀ޲÷:ÀÍk˜¯ PÀ æŽ'ÀA“HŸžÀw/BÝaÑÀ©ü†.émÀ ´'«eÀ%íLWÀe-¹MŠ¿õlÿF(I¿ä iøWÙË?¶€Ò,4Ò?é½;}½ü?ø\˜€p­µ@𳡔Û@¶>c¢ p@ ~¤âGoÿ@¤Ï7ÓÛ±@‹p·²¦é@s·ÉâÍ@[Œ¡v˜Å@D»×rg@ <)ÁÁ@!ŒNJ>‹@#€æ*@¼@$vÀ¯6ü,@%ëúR.~&@'a~% ù@(Ö ë©bý@*JÁcì‰ì@+¿!ÇÚKû@-31@.¦vÿýà@0 ÉœžÝŽ@0ÅõqIùx@1~É›ùÏ@27;‘‰^½@2ïCýã&L@3¦Ù¥;@t@4]ó÷¨®À@5Šic‘@5Ê•8`!H@6€ èlÙÇ@74æËž;ï@7éA;]¥@8œªÞ¤£¥@9O…q Aµ@:¦þþå¬@:³ÉÑT©@;c¤NÏö@@<sHS}é@<Âo®¦›@=p“¸Àh“@>ÙÜÞÕ@>Ê<Ðî³@?u·ŠÕ¦2@@" Iǹ@@dð´ I­@@¹CÛôF9@A ¢°@A`qr¬à@A³H5öúÄ@Bœµx,ÿ@BWmhÝšô@B¨¸æ Ý•@Bù}áíš@CI»*Ü\H@C™o±s¹@Cèš ^@D7:¹tûe@D…O¡ƒ?›@DÒØ’]ä·@EÕÕyK@ElDz°%å@E¸&¥ò°þ@F{@&ä@FNBš—k@F˜{(¨NŽ@Fâ&`îí•@G+CÚ”6c@GsÓ½‚[,@G»ÖD¦–ç@HK½0‚Ê@HJ4…ÒœŽÀ5—ÖW7\À4þÀÇŸtÀ4cS–/ ïÀ3Çyµ]BÀ3*È7p§À2Œ™Fjb'À1í—v öÃÀ1MŒlüÁÅÀ0¬zxhc>À0 d´Þ„À.Θ6úÚÀ-†jÔÚ__À,üÀ*ð2 ¡?VÀ)¢4Öä1À(RV°RXÀ'ŸàZÕÀ%­*â óÀ$WËÎŽbÕÀ#Á„ƽ¢À!¨z ÄÀ MŸr›^‰Àã:þ¯À(ŽÇüÀiã¿`}øÀ¨Á©0ý3ÀäÈH%Àzs\/À ©wö.ŠÀ·-K#¿þê÷Iœ¿ó¨X3Õ=¿à»®½—°?Ç«d&r}ô?ì  *ãÊ?ù±É.T©@‰)ci@DJ:|ò@ þF;/ï³@Ý`Éi,@¼¸SçÆ,@ÙÒÑ@~*=cÝÙ@_úÑKdÃ@ !*Røæã@!’‰M_ë»@#µYË0@$u’ÜòÉ @%ç‘yÕ@'X„¢Ç¡è@(ÉÅé!~¨@*:ÉLìÒf@+«|Lñå‚@-Ì… @.‹§´óSã@/úûÆ+'@0´ÛibÙ@1kã•¡_y@2"®Dcn@2ØÑψb@3Ž¥f—”@4DCe-j@4øß‹÷¶@5­5Ff®@6`û¦`º@7+Bâ˜@7Ƽªž@8x§ƒL'@9)æT‚²ç@9Úq½ìÅ'@:ŠC+·ƒe@;9TC:Å=@;çžä ã@<•(ºž=@=AÉgÝ®@=íž4Xðg@>˜–]ýL·@?B¬ñÈõo@?ëÝ:“w@@J_PTö@@¼¢9âÏ@@ðîfÖ–©@AC¤Ì•= @A•Þ HX@A瘮?$@B8ÒÁ€fe@B‰‹<±på@BÙÀ´45@C)q÷HÛZ@Cxñk°@CÇC§³¶Ú@Dbîô@7¥_¸@8UQZsß(@9û<Ì« @9³÷ê8@:b>¡Ù6@;Ë^J–7@;¼—‘­@gÒMã®ó@?‰v«Ÿö@?¸`ÏnZ@@/©øU`Á@@‚¯WÍ•’@@Õ>aåw@A'U½§¢d@Axó*,1V@AÊ16âñ@BºM~‹@BjáÓ—@Bºˆ<¿U•@C ®B¥@CXRø“I@C¦ty;ð$@Cô.ü«C@DA+P åã@D¿+\¦@DÙÍ(v@E%TÄ«ås@EpU–Ô•ø@EºÏJNš>@FÁ „œá@FN,oÔé~@F—¢æw@Fßk7úI¼@G'?@Að @Gn‹ß-ÕÖ@GµQIÁ¢@GûÅæË£À5|+f”À4w?\ŠâÀ3ÞdìdØÀ3D‡•–JÀ2©¨ˆÐÜGÀ2 ɬAÀ1pìlò RÀ0ÓjµA›À04@ÎmÕÀ/(î=´§óÀ-çr3y oÀ,¤c½8À+^ØÐÀ©À*Ç'‰wÉÀ(Îç¬âöhÀ'„AN^'PÀ&7ÜνÀ$éÀ•©|kÀ#™÷­$ ‰À"HŠÄ áuÀ õƒ¬u>ÀAÙPüæÀ• Î‘{šÀætœ¬—À4j+ ÊðÀ›þÂ>ÀÈcù›À!‰Ÿz¸À£üwðZÀ%IEÖÓc¿ûEø <›¿ð8È—»Ôš¿Ôä ÇÛ?×åüéU«Ã?ñ¦,S9?üHÎ`@¼ÆW»ö@ X&‰…Y@öe@K6ò&èG@g÷Ôë@î€Ë[&@Á_JÕqU@”á S¹¥@ 4q¹D|â@!ž¡ÖO]@#ïgG@$sHêÇ`±@%ÝœÚá\Â@'GÙ´B @(±íûmÑ@*ÈC]@+…W2;4@,­@.WN*}á@/¿”wŠ@0“¥H\ðÏ@1G0viØ@1úccþÑú@2­5ý ;à@3_ L:v @4šJUo@4Ãèñc/@5t  rh@6$œp§ÜÔ@6ÔŠÿøAC@7ƒä¬Ó¥@82¢žÛu@8à¾2÷;@9Ž0ñL@::ôšÍôw@:ç ë¾Í@;’Vªñæÿ@<<é–½Ñ@<æ¶uñ]@=¸žÀ@>7éw³/S@>ßEÖÖ#¼@?…È¥ð Ê@@¶È"© @@h<º÷@@º¾ªÕï@A €wâ"›@A\ƒ®#“@A­ÂÒÉ(@Aý 2±5¥@BL¶•О@B›Ðüo®@BêmÖkS@C8ŠìîFv@C†)Ž @CÓF»@Dã ¬ß@Dký3x#@D·”¶kN @E©ëäÃ@EM9¡A8ª@E—F;[K9@EàΈ5ÇI@F)ÒU8nÓ@FrQƒ•‡w@FºL¦É@GÁèIL`@GH³>8ïh@G 3k -@GÕ lõïÀ4Ì>u(^nÀ45XÐa˜-À3tÅ,n‰À3“¸¬ÜÀ2j·>ßéÀ1Ïá½:¸À147ç]ÖÀ0—OÁÖ<¶À/ó2…@À.µã3A@7À-v¸SÐJ;À,5·TS¶šÀ*òæ{S-ØÀ)®LyMnÇÀ(gði†«¾À'ÙÒ¨QµÀ%Ö§/ØHÀ$ŠEªSpÀ#=ˆxºšeÀ!îÛvçúÉÀ žŸâ3‘àÀ™¿Žå$ùÀóK:ר>ÀIø‡oôÂÀÞÂ;´À=À=¯´b÷À ™ã$<À§ÄrF¨À5àÈ"hK¿ù€°"˜¹&¿í˜xwò^¿Ì;¥Dš?ݨzeI?òzRPsÙ?ýŠw• ,‹@POúz@ Þ'/ºh”@n‚¼£@€OzE@Jàç(_<@ ¹6@â­ÉR´@®‘q†í@ =Îf©¯ž@!¤…‹°«@# Q*Ô‡I@$r,b,”W@%Ù3E­7@'?Á§«<¢@(¦YÐpº@* ¹Ì˜Y?@+rÐÍ’–”@,ØŽ'ý.@.=á'r1@/¢¹v|zÚ@0ƒƒ`ÐWÏ@15\våV@1æà ÇÑ<@2˜B%1@3HÇg¹K@3ùàÙ Ì@4¨ü:úò¬@5Xa&Ú@6CyÇí@6µœ7”ì@7cd‰¢Œ²@8•Érýì@8½)|vâ@9iWÝé8@:_AU_9@:¾õP$†ê@;hÕÎ(jê@<û8¯G[@<º`A3ÕR@=aÿÍøÜ°@>Ôú…’@@>®Ûf@?T ­}û¶@?øhx$0@@Móµ\a@@ŸCWULD@@ð!Q] |@A@‹í¤ˆ@Aì½M@AàºP‚{@B/úµY@B}–Ù+ñ@BË©×C‘V@CBšû@Cf]ÓÛ‘k@C²ü+5t«@CÿH‹Q=@DJ½pùvB@D•ßQ‰1@Dà€h’Hõ@E*¡1Zý½@Et@÷[(È@E½_k¿&@FüS™M¢@FN‡K @F•°ñéxá@FÜÈ¢õ7@G#^r# ô@GirµöEÑ@G¯‹íôÿÀ4Šf#ÔsÀ3ôo#MX8À3]Å5>ôÀ2Å™wu©ÓÀ2,½Ôž“À1’î¤Ô&iÀ0ø-Þ°Ô£À0\}¨“¦À/À®3ïÀ.D°ä…ĶÀ-ÑcõƒíÀ+É(ß½=À*ˆºô×¢–À)Fße‘FÀ(°Æ»À&½"9ìæÀ%uì¨Í[õÀ$-µ;}À"â®áGGÐÀ!–¸9TÑÀ I>//ÍÀô•8M yÀSÏ|çe:À°@pÚÜÊÀ þ·ŽžÀaSmÉÀµ»›NEÀ ÖyÎþÀ¯ŽgÆ ÏÀJÒ]çБ¿÷î¶©T¿éÓIʤ £¿À?¼¦hW?áÁÒ#1SÔ?óЉé¢Úþ?þÆu¿Â{{@á¬×ñu@ a§ÎÏ%â@ä¤Û©“@´éÍ·Æ@xzöÁI@<äî ¥@Ó»zq@ÇÅó,pŠ@ Fýå7Ü>@!ªDן†@# §lëÌÊ@$q7öÌÖ@%Ô}Ç×O@'7Эf@(šý€ÀØ6@)ýóæÅ—@+`£–†LÆ@,Âü^¯d@.$î*ÓÏ\@/†i¨v­@0s®–”6@1#Ý|·BC@1Ó¹ìW@2ƒ;9•…@32ZŠÓUß@3á´FÏ^@4VB\g@5=$q€@5êsH–H@6—<üÖa@7Cz’etI@7ï%Ž3Ø@8š7 œ[@9Dª§…ÈW@9îx®Ç¸…@:—›ñ¦ºÄ@;@Û¶?@;çÌ ¯¯@<ŽÎJ-M’@=5žEM@=ÚŽ:Ð@>B„à³é@?#)Ü—[@?Æ=ÇÒƒ@@4>H¹v@@„ðÖžv.@@Õ4­_@A%[³4é@Atj ä3@AÃXOnx¨@BÑÆ¯»@B_Õ#w~B@B­a1öÿ@BútÖ…8É@CG IëR@C“.éËú@CÞÓ–‡ß@D)üTv(@Dt¨z˜iI@D¾×usc@EˆÆŽðh@EQ¼í+@Ešp×€’¦@Eâ¦þŸžÆ@F*^Is±G@Fq–šh•k@F¸O噣Â@FþŠ0>#å@GDE'ð@G‰‚*ÑC8À4I„¦Œ|À3´{ľÀ3~þãdÀ2‡‘à”]ŸÀ1ïµXÒäEÀ1Vë4»fÚÀ0½5n\òÀ0"–-~ üÀ/§åÂÀ-ÕIˆUíNÀ,š¯«þ(„À+^WÆܵÀ* H/daÀ(à†îT†·À'Ÿ{ ?fÀ&\ üáœÀ%c(£˜¤À#Ñ&f\·À"‰^R}RÀ!@¯%ÂÀê¤êqÆÀRB”ó“ À·kT}#À5:Ëë«Àx´’ýÓÀÕª§¼Ê À0.ƒœÚ)À ¯›uYÌÀ¼}À¤bÀcù|ÅT¿ö¬9'µ¿æ› Ÿ—Û­¿ ¡UJÞã?ä”îÅŃ?õ „ñLÍ–?ÿü­4 ò¶@o>§»Ò@ â½ñN@,MbnN@èL!Û@¥<‚J'ä@bÿßx¯P@!wÑ.ñ@à‚ÆæÒP@ P½ãÎ@!¯ì×9Â@#ò‘êR@$p=kò@%Ð×z0@'0q“M@(×&oÈÏ@)ïtX ™@+ṄCë@,­Ð·’”@. qåy@/jž)*~y@0d$Q&Ø(@1°¬’î…@1Àìª1ä@2nÐè$úÄ@3V{Q4@3Éu$Kác@4v&ð1ƒF@5"dš"3@5Î'_ ì€@6yhžñÔÉ@7$!âD@7ÎLد`@8wã\¸È@9 ßsÏ–@9É;Lø]h@:pñH”µà@;ûòeÚ@;¾VØõí@Pu©Í°Ï@>óaF@?”æá­'^@@ôžéÀ @@k ÜÍøK@@º·e\Db@A õŒ'…g@AXĽYTò@A§#}„Ü@AõinD@BBŠ5Ì6ƒ@B®ý`@Bܸ·ŽÉ@C(9M­…Ê@CsÛ0¢ @C¿tÉq @D ¶kËwª@DSí¶ãh”@Dª½ …O@Dæìûù­^@E/´Πx@EwÿreñÓ@E¿Ïè(A@F"~Ø@FMù½‹È(@F”T«±¹@FÚ3EeY@G•—g«€@Gd{½ÌîLÀ4 “S…À3uuï]8‘À2àk¾m‘ÂÀ2Jv=S2À1³——°mÀ1Ð~9­À0ƒ#0ÅhàÀ/Ó%>¹¼À.žAbžÀ-gŸÒ'Q¤À,/EñRžäÀ*õ9<ÁÀ)¹€˜XïSÀ(|!¸íŒ–À'=#»F«0À%üÙ<‹1À$ºg¬*cÀ#v¹,ôPÀ"1гßJnÀ êäø9‰ ÀE¢£ý’À²°Ü{@xÀ ÇÒ¸?À„Á9ï®óÀéì?ÔQ]ÀL ˜&bÀYé_OÌ,À ÿ:’ƒÀͲ;²M¿ÿf;i¿ôag¨Ðàd¿ãqü ¸?®ßhœ‰‡[?ç[ñ§:a?öjwê§›@–§{èòŸ@úЖ,Y@ a~1ûš@e;8pü”@¿`øà9@Ñ-õüÂ@ˆi S@@R‚${@øËòµ§@ XÛh™ªn@!µz5в2@#2ù™Â@$nöEÕeN@%Ë´§æõr@'(^¯ mÓ@(„äñ2¬@)á8V‡¾@+=H» %@,™¼Ê0Þ@-ôeô9(û@/OTaÚLZ@0Tâ’Yp@1ÓJÆ4%@1®vu5@2ZĶàFL@3¶¯¯X)@3²E„ìVj@4]j_ì'†@5Š iG@5²[nÒBš@6\œÅ/ä@7UÇÁF@7®ÊTx@8V'¥‘!@8ý²…|q÷@9¤¡¾ü£@:JïÒvzÎ@:ð—lkû€@;•“fG,ß@<9ÞÇ%A@<ÝtÄ:Ø@=€PÁCzÃ@>"nQÉJT@>ÃÉ81¹Ø@?d]f¯!ø@@™Ýd@@Q‘)»t @@ ¥òr›@@ïP29Ù¹@A=ŽY8 v@A‹^ïÛ8@AØÀ’À¨@B%±úMí@Br1òšèS@B¾?_[¥@C Ù9Rñ¤@CTþàÍÉ@CŸ®Š¼ËŒ@Céèañ…@D3«b‰›@D|öò^Ú@DÅʇiÍ@E%«è²»@EVüûE@Eq*#c«@Eä`ôÆæV@F*×/­ùý@FpÓ¾€W@F¶V•?ém@Fû_·Åð@G?ï9;,øÀ3Ê‹·qåÀ37Y@rcûÀ2£?‡ ]À2@UÂUÀ1x\‚ÜúuÀ0á–¶ÞPÀ0IðªK~À/b٠ͺÀ.0>A[JÀ,û¦ìÀìÀ+ŇqDv¿À*À]¾ŠÀ)TX$éØ À(Tʬ ‚À&ܽ4¾ˆ˜À%ž˜‚ÜÕ”À$^î0…ºÀ#Æò˸À!Û(bä;’À —¨?ƒÀ£]šÿ8ÀÊ)ë_OÀ…”3²k]ÀòÏžMköÀ]ü™ÀÅí‹I½ýÀWöZõòíÀ  Ñ¯‚¿Àã¼…οýD»RøýÇ¿ò» UN‘&¿àVH%öm?Ãbž•AH¬@?4›4)Z[@?Ó/¡=ú©@@8}›gC„@@†ýAÍb@@Õ(=@A"éî9@AplOðá@A¼ß¯àè@B I3³Sc@BUD¾¬Ý@B ÐŠÌä@BëëÕN¶@C6”àI'@C€Ë›U@CÊŽùKŽo@DÞE @D\¸ß+z¢@D¥8j(›@Dí Öc;@E4‡PŠã@E{ŠP;ùv@EÂ@T@F+ÜUyÝ@FMʳ_@F’ñŒÌ@F× ò’†*@GÙ¦tHÙÀ3Œg‘x£oÀ2úÂ4 À2fôºÔüÀ1ÒéeÀ1=ÿa^nÀ0¨8ä]À0—–TÀ.ô;C`qÍÀ-Ú²…µâÀ,‘Ru&±³À+]gÛçpKÀ*'àÆCðÀ(ðˆÀx~À'¸"U ýÀ&}Ü㸻À%B!>æË±À$ë%À"ÆAp¨êÀ!†,-rç1À D³Âb²ªÀÁÕgùÀ{yp½G0Àð¡%ësÀcLh‹xÆÀÓW<;ÀA~®¤lãÀ Z_™Fï˜À-qS:ÜÀü_ªÏÌO¿ûޱÊgà›¿ñÆÍ;¿Ú‘T¾|ol?ÎÙ°N.p?ìÂGþùG?øí íïI^@¿E©(,[@ ™éŒ@ XK$6<@ÔÁ‡²?@|øsoòÎ@&ºÁ*Š@Ñ=€Ò¡@|dMŸ’@(gÛ–@ jÄ"Èf@!ÀI)¯Àé@#”ûäSd@$lê¶9ä@%Ã;ÑWâ@'yÆKa†@(o–¢cF@)Å‚IGï‡@+/úH›Ê@,pÔ÷iD@-Å–G¡È@/33@07,K+œz@0àüuž›Ý@1Šƒ?-"@23¹ãÖæc@2Ü™¸–@3…)±>¾@4-:Â-§é@4Ôï(8@5|3 Üà-@6#’E>@6ÉQ‚äºî@7o ÆK¸@8f±;DŠ@8¹±=…@9]E¸@.‹@:Óˆ'|‹@:£Ä (©(@;FT‘Ü @;繡z8—@<ˆµYZ5 @=)Œ€8@=Ș~·Æü@>gw“!ÈC@?š`ì1F@?¢ý);ÎÙ@@Î,¥X{@@mºE2õ@@»A@ëÑW@Aa˜_Æ@AUÙèµ@A¡h©Šæ'@AíLÀÀ,€@B8ÄîEÉ@BƒÐÚd@BÎm0uÂ@C›I°¬ç@CbY„ù@C«§á³Ä@CôƒA¨ªõ@D<íhÆÖ@D„ä÷X´‡@DÌimÂ…@Ez^B¯@EZl„ƒh@E @M/‰@EåôÅrZÅ@F+4ª‘æÊ@Foÿánü4@F´V^ê@Fø8#,ÛÀ3O Ô±c(À2½Àbþ³oÀ2+ƒO_ÚôÀ1˜k&Sp~À1yšyËÀ0o°…4º À/´#ÎfÀ.‡?ÒÀÔ À-X¹¹.]‚À,(–uÏbÎÀ*öÛO*^À)ÃßܹÀ(Ž´ùwwÀ'XT,Þ3hÀ& tþöÀ$çÀØtÀ#¬SeóÙÀ"p Fïy…À!2‹L¦¿Àç9g©þBÀfº ÊÎÀãªr†ÏŽÀ^ÜcÃsÀÖ$_Ð@˜ÀKÔ¤TåýÀ¿Aìå‰iÀ a)2<1À?O£ÈÀ– ˜tÏ¿ùà ÂË!+¿ï ,8áÞ¿Ô©I#!7?Õ[ãô- ?ïdlDXé?ú&ó¢Xí@O¿ •.F@Ž÷qðK@ Ð|Þ㲌@ 'ˆ.@¬Í3à™@Pc¥q2@ô³Ú '@™£Ñxw_@?;¡i@ ry¦¹c@!ÅŒS”È¡@#·Bf’Ì@$këÍù·@%¿Ý?›M@'9X†ì–@(e6-ÃÏ›@)¸TÔ*Ã@+ •Ó¼py@,\ÜÂÙöÐ@-®ËQÈ5@/SDzèJ@0(´Gm™@0Ðþ~ûp@1y¯sÙê@2 µyµ+s@2ÈûzÐ@3oч²Œ@4À²Ôδ@4»þr*#;@5aÎÿ¤³ï@6,j(Ïn@6¬à¿ì@7Pv³áƒ”@7ôXV¦gR@8—°_æ4$@9:y‹>ˆ9@9Ü®ºÍ3@:~Jôu¼@;Ih¿¤™@;¿¥o,Nw@<_Z‡5÷@<þdYÊDX@=œ¾¹Z²@>:e¢1Âè@>×U:³!œ@?s‰Ó‡+à@@óÙ<ü@@TÚLý@@¡Ñ ú$C@@îe(Ôzí@A:“7Ï:y@A†Zt»ºm@Aѹ› 7Ú@B¯{q@Bg:øÇ=q@B±[ ÅR¬@BûÃ/X@CDU;²?@C-©(ÍK@CÕ—QI/@D‘ŒI¿@DeÄG@D¬5v 0´@DòÞ.aˆ@E9‹ìgo@E~Û=¥®œ@EÄ/¢ê;@F ©ªL¼@FM€ÂU¦@F‘}$À·¾@FÕàØV«À3±£Ô¥À2‚8BÄz–À1ðçXŸùÀ1^Àt÷~ÁÀ0ËÅMµ]À07÷»Ù1¶À/F³„GV~À.Ûô`—À,ïj´Ù=À+Ágb>_À*‘ÖR,…}À)`½MM¦À(.!|%jÃÀ&ú À–»ÈÀ%Ä|]åÜÀ$€$Ó àÀ#U7›¢]À"X ÇÀ à;_Ú9;ÀGœ¾”ÀÌ2wŠÌàÀNIµ7m¨ÀÍô[;ÄÀKE5ÊÀÆNò`(ëÀ?%ä³êqÀ k¼wiúÀUÃÓQWÀ:Ž—ú¨¿ø8Ò=o¤¿ëé¾½x¿ÍSmÀÉzS?Ú™¥„¹ý?ðýFdpf?ûYÈm~@ÝÅÕÌO@c¡‡@ F¢ÛÕË@?Þ/Â@ÛÐv\ƒÜ@yTåÇÞ @ŽžÌ8_@¶bÞ[j@U¶³¶íó@ z·„'å@!ʸSصO@#Ð#Ï`Ã@$jñH-@%»ÓVˆ@' Ó¤!b@([åiÙø@)ªÁ¨}FW@*úD‹°°@,IO?{@-˜cɰJ@.æåg÷š@0{\FÓ@0ÁESX8@1gÊ"ƒGB@2f_€ð@2³êÑs’@3Yz-ªþŠ@3þ«]óÊö@4£x_ÁCü@5GÛL„@5ëÎ[^3@6KàäíÀ@72NSv º@7ÔÐIIÕ¯@8vÌ{Ž @9=ħ‰¾@9¹%ù¿@:YkÃÚïo@:ùèÈܬ@;˜4už@<6¦±á2†@<Ôr¬ÖYý@=q“ÝXBf@>Rx2ü@>©ÆC²Gù@?DÐË’@?ß C„„Ø@@äÀª}Œh„÷À4À·‰\À»DyÞÓ;À@Zµ™¼Àœ™ÆR&ÀBìþÐG À‚3¿ò À zn=ZâgÀn²He\!À_)»Îä¿ö—þäÔêR¿èÕ|ù³{“¿Á·^†ïN?à<œùô?òCàjLN?üˆa.Ž 4@imépÊ“@‘±2°@ ºÍÈxÿt@sFjRÁb@ RsW+@¡– Ä2Ù@9ÒËK@Ò¥“(&O@kô9óÍf@ ‚Ò9ùK@!ÏÍé €@#ßío]Ó@$iûdÓõ@%·ÙfÔ@'1+•T@(PýňS@)¸]P1"@*ê9Ì,‘@,6tölC'@-‚\ÔÆðù@.ÍäxØ@0 †ryL@0±ÏÇ@1VÝ.Êî÷@1û¡ˆØ}@2 mþ Ç@3D4B­à@3ç÷™ñù@4‹Yšz@5.T…ªÈH@5Ðâ¸öΗ@6rþ¯!°¨@7£p³å@7µÊhÈÊ@8Vo¾¹&S@8öþr)ú@9– E¨nú@:5!ÕcÏ^@:ÓŽºW{@;q`‡w'§@<”â­[ö@<«&ù7!!@=GÆ!0)@=âTkû@>|è0CâZ@?Ê…MÚ>@?¯ø­ôn@@$6°¦ç@@pÄNu@@»‘Ã^@A¯Eä{L@AQjù©W„@A›ÃžŽ£o@Aå¸Þ:@B/GѬÂ@BxoÓ^i@BÁ19üQ@C Šmes@CQzRËÞ@C™ 4C@Cà à<@D&ÍýDžº@DmZ_D@D²ì¥_=Ì@DøYtU@E=YkÉË_@Eì?ã×ì@EƳ·/c@F ɘá8]@FMÏ#{@FðCý2"À2œCOù ìÀ2 ”&)#À1~8«À0íÎI¶JÀ0\º‹“ïÀ/•¼ÄJ¦À.pw>ø„òÀ-I¨ÏV cÀ,!VÀþÚÀ*÷ƒ¼YéËÀ)Ì7l)À(Ÿu…èJYÀ'qDÁÂßÀ&AªÐ6¥À%®è¸[À#ÞTòí·ÅÀ"ª¦Š®¹ùÀ!u©û­žÀ ?fÃ$|ÀÉQ¤=ÀžWy¼”ÈÀ*ˆ³ôz+À´nC/À<÷ù6ÀÁž.µÊ\ÀŠ—TkõÀ Œøq¸¢À‹úÂ/DÈ¿ÿ–½^Íí¿ôþ(Cžþ¿åÍþ* Õi¿©.ZûÈ?â´G@ÑZ?óƒj/o—+?ý²Tô!­@òÊYâ´@ Þ4ÁX@- §-˜¨@¦”u>Ð@7~ i@É,!$Þ@[…(&\[@îoäeƒ@ÒëÉ.t@ ŠÊY¸}@!ÔÍÊÒ«@#æét@$iÔ](Š@%³&¤ úd@&ý3uJ:Ã@(G"fEé@)æ KV@*ÚsWcµ@,#»ÐØ•@-l³dz}±@.µMTg@/ý}°æ¯¨@0¢›ÍH8@1F7ƒpÙo@1é‹ñkày@2Œ“!€y/@3/G3Cg@3Ñ¢] @4sží_kO@57LEIË@5¶eü‘@6W%Ï@6÷péà‰k@7—B½Yi@86–Mßó@8ÕeýËÇ@9s­¾&8È@:h°0@:®’Q¶9'@;K&E{ñX@;ç QJÌR@<‚|_V h@=6~x/3@=·J⌠2@>Pµä³ô¡@>ét0G@?ã^B@@ n' 3@@WÀ²eë@@¢µTQã@@íLt[Ec@A7„)øX@A[7äʾ@AÊÐsRìµ@BâþyŒ@B\‘"¿4@B¤Ú›ÓM”@Bì¾L&So@C4;bQ@C{QªS@CÁþÐ-@DCÙœW%@DN¬—@D“‘É rA@DØ™Áí@E75ÖÂ6@EaiÕRÖº@E¥1]Ç€p@Eè›8@F+~gxÅ@Fn©Ê jÀ2b9SñYsÀ1ÔmL‡­eÀ1EØ1;,À0¶{™¹ºÀ0&Y@¦ çÀ/*æ’À.•·>öìÀ,âÅß8rÀ+¼{.5 À*”¹öܲAÀ)k‡Îë ·À(@éì)ÊÀ'åö¸œÙÀ%çßÇB­@3»¨»Â“@4\ECL›c@4ü€bËÿS@5œTÁB„ @6;½ xWÊ@=ŒäÝ_v@>%*s(]Ì@>¼Çds`@?S¸Ýöch@?éû;j*@@?ÅÏŠ/å@@Š3”n^T@@ÔE«#@AúnÄ^Í@AgPý*Ýý@A°H!©”@AøÞ—ó@BAxú1C@BˆåÕ !É@BÐTÁ¥Fi@C_l…UU@C^ ¥þ@C¤EôZ”@C꤬ª@D/‘Z$®f@Dtœ§:ÏÞ@D¹@¶w@@Dý{JÎøœ@EAMèD8‚@E„·ªAù@EǸVáZ@F OÃÜ@FL}Т À2(ñ*‰RüÀ1œôXž À1X9z6&À0æ“æóÀ/ág|BCuÀ.Áƒ'EÙ7À- $"‡>sÀ,}N«&PÿÀ+YBVˆðÀ*3R­ëh}À) 5øÍߢÀ'ã¶sYdÀ&¹Ù³ aÀ%Ž¥•”¯LÀ$b ;ÊJÀ#4P çÀ";µz[NÀ Ôê*°a&ÀFÅFÖOÀáY8 ÁÀyŸ©c®À¨¡CŸÞÀ£„ªY” À5DÑt`ÀÄú£-½ À ¥pR–CÀ½Ï·%ÛÀÑ)´$Y¿ûÃi»wŽ˜¿ñÝÒýO¿ßÇv…Ò”²?À”ÁëÆ?çï©Ø­R?õôèÕ?HF?ÿ÷N”¾°@þèâàÆù@ z4ů@ 7ã@ ³Ï`¾Î@3–åbê@llbž@@F£5ò@$ªb”ê@¬«ð‘@ šW0¿4¢@!Þ&bîL@#"Û’¥Q¸@$g0KŸ3@%«% X@&ïÁóþ">@(3æ‘‘ÓŽ@)wâÞò£½@*»ªÈ[ÇŽ@+ÿ2HwB¶@-Bmk¢R:@.…PS& )@/ÇÏ8bý@0„ï7óœ_@1%¹6@`à@1Æ?á’þ@2f}”tù[@3l¿Ò\@3¦ç`3U@4EI¥aÜ>@4ä,«e;î@5‚«Ãr¤Œ@6 ÁÑ,dH@6¾iÒß0—@7[žâ‚ʤ@7ø\6ªá@8”#eAÕ@90] µ@9Ë—¯ÙÙ@:fHjÞ(@;k«ù@;™ü¢p†@<2÷Ø_5Ô@<ËYhïv~@=c«\¸Õ@=úA£Â@>ÀPe‘@?&˜à @?»Å8ÂK@@("hB”6@@r oã[@@»˜ æ°@AË{|x?ž@7Ùô”…Î @8tô—Âq@9w&‚•@9©w­ŸUø@:Bò5³Öä@:Ûâ‘ iº@;tDÉ,½ @< %c×@<£OŠÅ©–@=9ðÆÊ•@=Ïõ@!È÷@>eY¤]³@>ú¿§¢\@?Ž5€ßf@@Ó{‡²ÿ@@Z6*–«Ä@@£Aw)Ún@@ëôÃî¦@A4Lã›^@A|Jª‚•õ@AÃì\Ê€p@B 0÷³ü@BR†b@B˜Ÿ'z0*@BÞÇ#´è@C$Ža¼é@Ciôƒ O@C®øÅñr½@Cóš”Pù @D7Ùf +Š@D{´Ã·Óƒ@D¿,@…¼s@E?Á(@EDî1œê€@E‡8xdì@EÉïü.@F œœ èRÀ1¸’[МÀ1-gÔ£@8À0¡Š²9À0á=À/qq'4À-òñŠó+À,ÕimƒýöÀ+¶|I,AÀ*–.ˆÁÀ)t„ê;n¹À(Q„OF6À'-1íNò7À&“5ÍÎÀ$à­Û!0ÚÀ#¸‡ÐŠKØÀ"'JEÀ!d’¼AÏ À 8ÐÛìøÀÑ;G©À»Âjhå#À]„*øÌÀý%Úk°hÀš·UÌ}åÀ6Hî(,ÀŸÖÕ_VÀ Ï` =Q—ÀûPÖIÀ#Íc¶ïÇ¿ø‘õrJ1¿í«ú +B¿ÔOþF¾¿™?ÒÎÔq³"?í¡B+[q?øS‡è¡¸@ú‰£u0@«§‹f„@ òi’ ¤@ä 6pïÁ@k¯‚Gsä@æ}%Â&@a>W¨@Üõ­rw†@Y.õ3Ç@ÕÓ€þ"H@ ©fC}D@!è“jÿ@#&°7ê:P@$ef³tèŒ@%¤†m`@&â½2/ê†@(!F<#Ö*@)_©0Éݲ@*Ú¦Åïü@+ÛÏAâjê@-{¶ ÙB@.VÔÊs¡è@1¤ lñÍ@2A–±Jy@2ÞÖ 6ñs@3{Åò&du@4aA4åõ@4´¢ðÊÞ<@5P† ´¨@5ì¼-Í@6‡8ÙÝé@7!ÇÙ»C+@7¼ Éà@8UÄd‘)@8ï æbä@9‡Ø&!å2@: 7ˆ»u@:·á²Ë@;O´(ôP@;åÁw±U¸@<{ØWãѽ@=YÎî]á@=¦BvËE @>: ~Eà@>ÎO¬§Õ×À!ñår¹ÀØÛ+Ê3ØÀƒ•x¶ì‘À, ŒFâÀÒ‰}„edÀvàÞnÀ5³†EÀ¹—ôA60À°0 ½"À é“*úÀjï1ËÀQë}[þ¿÷f¿NÑ¢¿êµó^Ø¿Íjוñê9?Ø¢€›³E?ï{ÛYϘ·?ù{$Õ7n˜@ž~¿íÞë@’õWNu@ f¥ž¨[@&Æg {@›…!@_`Ö¢@…ɼã6ñ@6l¶y´~@7€±1—§@7ž~? @87 …©`@8ÏÉKçA@9fµ`³ú7@9ýÎÅwϺ@:”e Üœû@;*te7(@;¿ù aÑr@\&°ßp@>¢øŒSÔ@?4ö«ÅË*@?ÆSªß“Ý@@+†g`–Ð@@s½è½@@»DšÔ¶O@A£Ï„í\@AI¬<Ô’o@A\Ó1s@AÖ´‘¦ç{@B²‡m“k@BbUÒ„¨@B§ž4æ@Bì‰'$ê@C1¶c“@CuH¤8ƒø@C¹V£$V@CüAŒJ$@D?£ær|Ÿ@D‚XÔ)p¢@DÄ­¦—5ß@E¢oP@EH5¨ëõè@E‰hO…­ƒ@EÊ9Ç©}NÀ1Kt)é¿À0Á[öwÀ07lË_+IÀ/Y.¼Ù—À.B#›¢µûÀ-)»ÞncrÀ,ûküpÀ*ôæbVtqÀ)Ø wAÀ(ºÐ=f`•À'›Ø šÀ&{Ÿ½J$À%Z)AÄc~À$7|{öÃèÀ#ž“Y7À!¨À Èg™à7øÀB6|˜›ÀñnSK”XÀž„“zÄéÀI‡ŒUîìÀò…ÿóÀ™DfÐÀ>²†¾Î_À Ä/t‘À «e˜…ÀFºaš¡¿ÿ8Ê”ô4¿õx·˜[•_¿çÊqNaÚ¿Â`+<ˆåœ?ÝJ]d!Û3?ðöQIöÐ?úžÛ±ï$G@%óµ.?@þ’‚ôyÓ@ Ù!ëæü@Z¼Ží@è@É·j60s@9l±kèÎ@©Ç_Aº@²CyJ÷@Œ €*2@ýã@jß@ ·ÿ+Æ+C@!ñ)ÖÜ¿@#*fÈãná@$c«$”h[@%œì ¾{c@&Ö?Æ@(8ü~@)H-bR(@*€óö4¨@+¹€ýÀF @,ñÉÈÍø@.)ø™Ò@/adBo~Ë@0LPy ]Ž@0ç·¶–ho@1‚â¹ÿUÛ@2ÌrËTs@2¸oà¡D@3RÈ‚ÚY@3ìÐ1â¾@4†ƒo² j@5Ýgª[@5¸ØñÙ@6QqJ eä@6風 ¯@7hÞÔö•@8¿‚¥’@8¯¡p#”@9F ÇW@9Ûú1;…W@:qhØ[<è@;TÍ‘ @;š¸\@<.‘’|}@<ÁÜîd@=T—û†I@=æ¼Çò©ž@>xJþŒBK@? >ÊV+ @?™•[öâ[@@¦œË@@\0 5þ@@£g¯Q}Ç@@êK¤}YÔ@A0ÚØn@Aw<„H@A¼öÒù…ç@B«SL@BG³ã÷Œ‚@BŒŒ©±J@BÑ 7ƒëÊ@C.Ö~æž@CXöÝŒeï@Cœb±<þå@CßqÃo @D"#“»¥@Ddw­ì@D¦m« P(@Dè0sª~@E)=ïÁÙ‰@Ej¦|t¾@Eª’Ø)À18ñvSšÀ0Œ¤¢þÀ0_É ™¥À.òÛ)ãC›À-Ýžm§fLÀ,Ç C§pÀ+¯*Í1ŠˆÀ*•ûàöÞÀ){„‘…5^À(_Éj‡.åÀ'BÏ1š½?À&$šæw§úÀ%1ÄÀ#ä™;DpuÀ"ÂÖý[Þ£À!ŸðñBÓñÀ {í8Œÿ…À­¤\DØÀaLÊŠ^ÀáT"uÀÂoÿKXEÀp@i3vÀµ÷>ÞÀÅ‹n¡ÁÀ Û.¯C¾À'Ó“öÍ$Àq&€>D:¿ýn’SQ¡¿óô¼7¢ý¿äê ¨Š.Ô¿­úÞW'³?á5N]ÈŒK?ò*Ü[ií?û¾G±kk@«i÷×Î@y¸Ö.1@ IëÕ ¥Å@í(` e@÷® äQÑ@b$Rs²Û@Í;€Z °@8Þù»óJ@¤ùýœžá@w¬ú¨©@ ¿!‡þï»@!õ£š]n@#,7Znë@$bÒ]§@%™jré@&Ïó¸EV@(dï4…™@)<³.-P@*rÓÈ7Õ)@+¨¼uÿH‚@,ÞbÂD V@.¼Wk³Ï@/H¾ó¹@0>°4 úô@0ØËQ9f_@1r«Ó«öþ@2 L̽@2¥©]4«‰@3>¼¶t»—@3ׂ†íb@4oôâ–5@5s–Z @5ŸÐMÓÇj@6703“î@6Î+@["¨@7d½Ã D@7úãdºa\@8˜Žˆ¿@9%×âºo@9ºží: ¢@:NétW!š@:â³Ñ(©@;uúxè@<¹øÞpö@<šîÿ³VÜ@=,–T¿ôM@=½¬ÜÌRn@>N/™\þB@>Þ¨ÚÑ@?mnF®»Ž@?ü$ËR÷@@EV, z@@‹Ù¾0‘@@ÒCu‡q@AZbx=Å@A^y«¾@A£‹¾Š@Aè¤@ÛHÉ@B-f!8j&@BqÐŒU’@Bµâ½#nü@Bù›ü5À@C<ûŸ¯@C€ o@C«­,XÂ@DûíN1@DFî›x‘¸@Dˆ†ø3@DÉÀé¼™:@E žñýœ^@EKÙ™÷½@E‹CeÕD½À0à?M>¬À0X\`Xl?À/ŸëɯÞþÀ.ÊÏXSVÀ-zY=9KGÀ,ešµ4ä»À+O“õÓ¥À*8F]TûeÀ)¸ä®I=À(ï%$ À&êíÕÐ =À%ιåá“À$±X|§ò~À#’ÎùˆxÀ"s"óß”¢À!RZ:ÌeœÀ 0zÔæ*ÖÀÿ¶QäÀÓ"_ñ À‰(5®)À=4ý –{ÀïW"TDƒÀŸˆ£wÀNêíÿvÀ õ¡¼øÊ+ÀK»kA Àž™–¯]¿ûÜ·SGºÇ¿òvIwÖg¿âZý}<‡?™Õ¾ ãkI?ã»ùTè1Â?óY{;Äæñ?üÙ‰,rûO@.íôMc‹@óìŸg@ ¹7˜6%@À^×E›@$øBIÊb@ŠBó„]½@ð*8ÇR@VšëU@½~0ü*@$Â2$1Ã@ Æ(òHtf@!ú [Bú$@#.1ƒ@$aüÈø ž@%•õ;»bÁ@&ÉàqA´@'ý³.mâ¢@)1d(ð•º@*dè׬s=@+˜7L è@,ËD­îuj@-þ§œ[ü@/0uþ³‡ž@01Bå£ÅT@0Êž;á@1b±MWFO@1û$ô{@2“(eçÃv@3*û`ê¢\@3‚w¬œ@4Y¹ @4ðšØæ‡,@5‡#CÐB@6N ÑÇö@6³÷ÙÆ®@7HyÞø¶ê@7Ýr³Ëf@8qý|¥‹±@9\6H@9™¹‹…Ì@:,ã[ÝPÆ@:¿:Ôjl@;Q¼®|V*@;ãeWæO@$¢`{€H@>³‰>7”®@?AÚV+I2@?Ï“ zñ @@.Xl­á@@t˜®…Z-@@º‰%èÓ@A(»íÕ´@AEvg–ƒú@AŠq-µÌE@AÏ Û5`@Bja6+=@BWgv,s@B› §NÔ@BÞ\ý Ot@C!T¿ïbV@Ccô8~ö›@C¦:Õ“£^@Cè(‚q‡@D)»væ¶"@Djô–j¯ð@D«ÓŽâ@DìVjê=@E,~ÌxYÉ@ElK†L…$À0«—)Ç\åÀ0$´÷×”À/:UßuªKÀ.)õV”ÝgÀ-K¼ÝWÇÀ,\®»Œ0À*ñ+ý¡kàÀ)Û½°aŽÀ(Åz4ùÀ'­9iOvvÀ&”,ŠS׉À%yôE­±À$^•®o¢éÀ#B¿ŒÀ"$zíøe¼À!Éû„¸ŸÀÌKsÜãÀŠ}2; ÀFájAUÀKAFuØÀ¹É$ªe7Àphš¹^À%7æ/Y­À°‹W×xÀ AÞXeÀr²%rÜÀÎû¥ò!©¿úP}¤*¿ðý7]f¿Þ‘¤T,h¡?»š˜XS­o?æ9v Þg´?ô„„ØÊq?ýð¿SN]Ó@°âkí@j±@x¢ú@ &›yQˆ@òêÿ5ç@Q›¾‚u@±Í³˜F@—zgI@sæ¶£ÿ@Õ§%Êé@7Åß=»@ Í7D°Ï@!þdÀN‰²@#/ÄHø¬@$a*OÓ–Ê@%’Qâ̵@&Ãã"2†â@'õ!Á·›`@)&?7ê]@*W1îÒ_@+‡îè„úŸ@,¸mcáæ8@-è£8Mõö@/†¬›ƒ—@0$ ¶áŒ@0»—úº÷@1Rñă@1ꔑKf@2€êòâ?Q@3ëÐó²@3­ÎþŸ@4CÍ»­î{@4ÙyÅd\¡@5nÎÑ B@7,š@­C2@7ÀiþuÁ(@8SÎ#¼@8æÃùÄâ@9yFº`›.@: S)kç=@:œåÅPÊ’@;-û&V2ø@;¾þPTø@‰ƒ¢XKZ@?Õ–´~„@?£’ÁZZn@@ÜT’aÐ@@]¢xcP@@£©wåª@@èCÔñGG@A-óÙš$@Aq¥ üeø@AµÛ4oPK@Aù¾‹xÙ@B=N@s^‹@B€‰Ž¬Žb@BÃo¾A††@C#÷Å@CH:!#ð@CŠ#) ´@C˨£ñÊ@D Ü)F£@DM·Cô @DŽ9‘~>Y@DÎb¹ë^¹@E2p‰ýŠ@EM¨s‚ΗÀ0w´›ÏbÀ/ãSžß”"À.Õõ³ò”‚À-ÇR§ëo›À,·mÞ`¢&À+¦JíÙûÀ*“í 0ïrÀ)€Yòâ À(k”NïÓÀ'U rïÒ-À&>ƒŸt{À%&BjÓ&À$ á×GŠ·À"òg9äóÀ!ÖסíKÀ º9 ÒÛÀ9">o¤ÀûËÛ¢;À¼{T L.À{={õGjÀ8ˆjˆÀó/r4œÀ¬z Î=[ÀȘb´¯À 3ø ÔÀœ¡0 áÀ8ÀaB>¿øÉºlÍÛ ¿ï»Ù˜d¿Ùu–\c÷?È:$‰ÐV®?è®s‡&Ž?õ«\¼á»Œ?ÿ7Ñð5@0_å1ê;@àÒÙÖÉ@ ’™³ÆÉ@#+Yöã@}›‡‚ëæ@ØÇ ,«@4‡­;@ÈY3DÎ@íwÏ)æÀ@J‚5¶CÚ@ Óê ‡Ç@"­8†Šª@#1€¶ëñÁ@$`ZÚ@×Ý@%1ãܪu@&½üÕ³Í@'쯵Wu@)C ÷½Å@*I¬o`.@+wâ7äzä@,¥ÚÐ7ðÍ@-ÓŒ¯?¸î@/î]Þ€@0û:=ê_@0­MÒã @1Cj\¶@1ÙLF?@2nïÐÞƒ@3NB®jÖ@3™e}©·@4.0l¶a@4ª˶Á‰@5VÐl,µ6@5ê0$ Û@6~ æûS@7\@7£ÆVeáŸ@86'Ì@8ÇÝšõ5W@9YCG7”5@9ê5”¥O®@:z±»ýD@; ²q+|X@;š6l6ã‹@<)9á ˜‚@<·¹Ä¨@=E³#{­@=Ó#%ƒ]@>` ÜÞ¶@>ì\4d“°@?x }ñ†@@¨ÕúL@@Fõ"JÈÈ@@‹ö¦ÿ@@Щ­ãþr@Aßx@AY%VÌöû@Aœëtb ^@Aà`—_@B#ƒî 5Ó@BfTµ#ž@B¨Ò4EGÜ@Bêû¿ïr”@C,諆¢@CnPŠúñ @C¯z¯*c @CðN©#;Ù@D0Ì:Æ{@DpòfÿxÖ@D°Ák` @Dð8Īåƒ@E/X.ëkÀ0Dkž«7À/~mä2À.rÃcûLgÀ-eÚèS2úÀ,W·Ð}FÕÀ+H]¬·ÀþÀ*7Ð>íd“À)&zýðüÀ(+†÷˜ À&ÿ»@ÛŠÀ%é뢲,¹À$ÓœúžÐ À#¼5²ÌaÀ"£ºíX‚`À!Š1þŒ3¾À o lœa¹À¨Þ®ƒYÀnôß|<ÅÀ3䈘ÀöòGŠÜÀ¸+¨é¿/ÀwžVy±ÄÀ5W¶~p4À âËŸ‘-ïÀ W® æÀÉtp´³À8;°ÉÑ¿÷HG‰|w¿ì5.IKa¿Óž˜U6@99¬%¿ß@9ɇqî@:Xîé•ð[@:çß=fž°@;vU>äÊ@<MØhD@<‘Æ Œ® @=ºör)<@=«)Éô ó@>7ÓÕ²|@>Âjyåá@?M7;Õj@?×s¯”î)@@0ŽÄa{Y@@uH¡µ:@@¹XVtİ@@ýJìT*`@A@ð×}@B *7£w@BLmÂé@BŽ‚b)§@BÐE–ŸÂ@C¶Û¶@CRÓDƒÇ@C“œ8ñˆ@CÔü o>@D0郣$@DSû˜îà@D“p­pª}@DÒÔµ’^@EXƾ˜èÀ0¸UÀáÀ/±¾þÀ.·F€²îÀ-†w.TeÀ+ù!ü˜JÇÀ*ë`WžøÀ)ÜÌ\vÀ(ÌâÙæß®À'»ÔôG ÓÀ&©¦öqZ@À%–]\X¼êÀ$üÒ°0EÀ#lŠ6ÝöÀ"V –Ø‹XÀ!>ƒ0þûeÀ %ùsÎÐÀåû qÀãë7éf À­—.jÀt\nàC¶À9ápl¬îÀýª§RGÆÀ¿Åw’¦©À 7ö- À~NH(Àùæ0ˆU¿þáàïA¶¿õËþâ·Ì¿éa|pn}@¿Ì‚ÿŒO?ÖSur•0®?í}rYð\‚?÷ìñ÷¤˜@¢ŸBÉA@*·Í”Ã3@ Ç–eİŸ@fàF¯@ƒ«ž÷@ÓÇÄiãÌ@%t‹q @vûÏĦ»@ÉVÊ•…@;dÂ@o3ã_lÞ@ áH¶ï·‚@" ;¿@#4çGµÌ@$^Ä Eíü@%ˆŸrò@&²mD-'Û@'Ü&7ôä@)ÀVLêá@*/2Ë;ì8@+XtUS·@,{Úûd@-ª@Q½"Æ@.Ò¸½Wt«@/úÜ38&f@0‘P@1%{+Ã@1¸xkVÆÚ@2K´uÛt@2Þ°_*€@3qgúX @4×(8y@4•ùÛ|20@5'Ì)`#@5¹Iëû®ƒ@6Jo‚ÅRð@6Û9E3@7k¢è쫞@7û©d.ßü@8‹HùWëø@9~1íZô@9©E¬ýP·@:7œÓ7@:Å~UDc@;Ré/¡ ¢@;ßÙ¨ƒx•@šjŽrˆ@>˜üÏ>†ï@?"ԛ͗X@?¬qú@@m„ER@@^‚™; @@¢Mí “Q@@å΀“Q†@A)aD±@Akë§ñ@A®†yxš¯@AðÓÓÏô@B2ІsÈ@Bt~Y$r=@BµÛ¸Ò@Böè"z¥@C7¢Ãó—@Cx PG£ã@C¸!4kÅ@C÷ãû@r*@D7S<&, @Dvn—µp@Dµ5¹Dú@Dó¨U˜4ÇÀ/¿.Ø9–À.¸«'÷SÀ-¯ÉêuØéÀ,¦Mì'šªÀ+›¥—YÎÀ*Ò¶fÀ)‚Ú²Á À(tÀÙšÔ˜À'e‰9ÔûÀ&U8[¬~À%CÑÍ4™]À$1[ zm•À#Ø‘KŽnÀ" O^§0UÀ óÄš9Þ€Àº{61½›À‹ÌØ.äÀZ¢^ ZÀ'î©Õ&ƒÀópÉ‚¹HÀ½5.q3¥À…H ¦[RÀK¸=JžÀ !"éò[µÀ§ÄçìÓÀ+pLý>¿ýX‡„4^À¿ôT¸µÐŒø¿æ—_8¡AI¿ÁíIX.?ÛTsì?ïØÆ=rõo?ùéóéè@¸2Û…@¥Z[8ýù@ 8º+6C'@͵÷ãÄ„@²ÝŸ!0@ýü„Äg@J}¸Úg@—‡çà@å …(Ñ:@2ðâ^è‚@,7g'£@ çÔÔøÀ1@"+¨P²W@#6‘›ŽÛ¦@$]ý±{Å@%…féØ4C@&¬ÄG~h@'Ô ÎZÃi@(û7‡„Z@*";‚Ù •@+IÙ Óp@,o«­’É@-–0¼ßÊ@.¼¡Žjú@/áÔO·cú@0ƒ›Nº €@1€²ÞÜ@1¨c„07©@2:r+–z@2ÌBV«@3]Ïð¬£p@3ïö—}F@4€rs†Ú@5Á~ÍÄ”@5¡Fâ @61#H´@6ÀÏšû‹@7P¾½—@7ß Š}£@8m”ú¹¹ú@8û¶¬p "@9‰mPDú@:µ¬jàZ@:£Œœ¡¦n@;/ï‰Ga@;»Úù9@U ‚@=\²Ý¿œ@=æ£`fåÏ@>p¸«Ž–@>øô­“Ñ@?Oè„*×@@•4ÏÄ@@H0%Þæ@@‹ˆžA•œ@@ΘäW@A]`æQQ@AS×Õ»ÿÆ@A–‡T~†@A×è§ëP @B}u*X:@BZÄ8UŽ@B›¼DÔŠå@BÜdúÇÁU@C½Ä2Ç¿@C\Æ2—5@Cœ}p’B @CÛã]¢×Ô@D÷rXj@DY¹Lºï½@D˜(–‹@DÖEøBÀ/\VDlÀ.V”q1è¿À-OôË{ À,H*&"gÀ+?9ÀÍL0À*5&“À))ô4‰ÿÀ(¦z¾ WÀ'AhÒÓcÀ&É/WÙèÀ$òB,aÍ…À#á°ë€K©À"Ð%§áiÀ!½‚Á ÍãÀ ©ïÐçºzÀ*Í*r%¿ÀÿØôÏVõÀÓ1ºâ®À¤xiÏìÀt#ẍ¸ÀB“uüÉÀm?«À²J§r…iÀ D¡òîÝÇÀÓûNÕUÀ`r?zï¿ûÔEÅeø¿òâSÈ&¿¬¿ãÖ‘ïüý¿­ì‚M1~?à"P@½ð'?ñhÉŸÙ?ú%š“»Ï@–4gX’@\X0ØÑ@ ¨\ÂPpÖ@3îž&@àx_»§n@' Ô¦ÍØ@o_Ê~Ýi@·¤<«@]úµ\@IxóYÌ™@’橜$¼@ îJc¦ì¼@"8ìÈ+Y@#861P~@$]9oËÐ@%‚9äU‰w@&§.Ìdëã@'ÌgÙ™ë@(ðÒû …é@*pÑ'24@+9à=K@,^FúÀ@-‚[rP@.¥ÁîÏ#€@/É!àŠ:ß@0veñ3@1g,{t@1˜…'ß @2)jDEõ@2ºz*ñ[@3JyÐq 4@3ÚœZûÙã@4jv<„"Ê@4ú§ú-@5‰@ÜÅ ¤@6*0J1@6¦¼¬0Ì@74òÒÓb@7ÂË ÀÉ@8PAˆÅ¡,@8ÝR»¢í@9iû{WT@9ö8žå¥@:‚¼Æ@; cÕy÷¨@;˜Kÿw§–@<"¼»ÔÈ @<¬³LVHQ@=6-äQ@=¿'_¹ù@>GŸÕ†Ï^@>Ï”–‘Ä@?W¡Ý“Í@?Ýæs ªÄ@@2 ,HÐ@@u¤P†@@·¥¨²@@ùüIOâÃ@A< ¥!Ñ<@A}ÌãÑU9@A¿E8Ós”@Bqâ±å@BAR*ó¿š@BåffÐ@BÂ*óç¤@C";÷ã@CAʵ,h@C#Ý(@T@CÀ-=2¶Å@CþæhGÕþ@D=Nûhhÿ@D{fVü°@D¹,þk¦ŽÀ.ù÷—¶€À-ö&T –„À,ñ.¾€nÀ+ëôVBÙÀ*ãÙ=üjaÀ)Û‚JošÀ(ҹøÀ'ÇŒòÕÀ&»öÆû nÀ%¯S¨%ë@À$¡§å3¯ÌÀ#’÷ù:TKÀ"ƒH‹%B"À!ržmŒ€ÏÀ `þž{ù›ÀœÜŽV*fÀuåwHÕ<ÀM"ôº~À" WyJÀöiC$³Àȉ¬öAÀ™ ÚqiÀпÎ74À jè=½/²ÀàˆµÐ÷À˜ýÚä¿úT÷”B./¿ñt¬‰mí¿áÒ/•‘n?–¦(*V’A?â’; l}ã?ò;éËrG?û2¿ÏÛÊ(@±?Ô—@•É…z¡^@ ‰Ê@˜ÏÔekW@>¿–AŒ@P¸³ßµA@“ÅPd„ý@×Sþ—d@T ‹W”@_´«…¼l@¤dýC@ ôª²&ý@"8pN-_@#9Õ3xX@$\wÈÜ6*@%¦Û)@&¡¬Dpüo@'Ä-éÐ@(摨šÌž@*Ñq£È@+*äžÉy@,LÀíTå2@-n_Ù–À@.¸s ðÑ@/°ÂzÒ¨@0hºÞë!ü@0øåax²@1ˆÛÌÜ{R@2›Η@2¨ x"Ì@37cÀ«oc@3ÆecŠŠ­@4U />e+@4ãl§ý@5q²ţ@5ÿ‚­™Â@6Œý’D¤@7¬ËÙ@7¦å–ÁØ$@83LYƒj@8¿O©ŠÆÙ@9Jíf/ä @9Ö"²²û@:`êËmŒ7@:ëDÊ@;u,\±å[@;þŸ•4›@<‡›ë^@=—I‘@=˜#,Ë™æ@>©ß:õ@>¦¯S.¯@?-1Cƒ@?³-~mø@@P÷[IÉ@@^ÆF˜ð@@ õ¶©df@@âÞ[³îõ@A$TÌu¬@Ae×Ëæß×@A¦æõÇvÚ@Aç¬ð`Ù@B(&jŒV]@BhUTV´Ê@B¨8.@BçÎb–^u@C'd[öõ@Cf±°_E@C¤¿Òh0Â@CãX) @D!-ÞCP†@D^î ‰U@Dœ^ˆ%3úÀ.˜õÒ^à²À-–ÄvÜé—À,“sÃy0À+¾Fª,À*‰|»mrÀ)‚ÞvMXÕÀ({-…:³µÀ'rm¨ìêçÀ&h¢Ì–YRÀ%]ÑïVÀ$Qü•4£À#E)ålžÀ"7]Š–À%À!(œDë [À êý0`ÉÀŒV§Àí™·× ÀÈÕFÌ"ÆÀ¢[Sô·Àz7IØSœÀPtá•øÀ% !•¹ZÀ ðЏ1îãÀ “â[VlÀ4`öæýÀÒ âÇì¿øÚz8û8¿ð ¡oYÖƒ¿Üß¿„`[|?ºîê¼5?äú4,}¸??ó]þ$ˆI?üBÒŽËÊ@•­ƒld©@ ­>¬gì@ ƒI“Z @ücE;Tü@;mc¿š$@yH!‰¶´@·±Î(H@öš>ÓŠ@5ñ+¸å@u¦4x½K@µ¨ç“ö@ úô`-õ @"*–¾^¦@#;nÉûÞì@$[¸©]Õ@%{ÿã x•@&œ<&ôq@'¼e#eïN@(ÜrxQ%@)ü\(¢È@+®ûç@,;¢ð"µu@-ZïÃöR@.yøR>•@/˜³Å¿º8@0[u%@0ê’ʧñ@1yeöÞó÷@2~*6@2–f]"«@3$‹øwP@3²p.ñ݃@4@Q|%@4Íe¿!ç"@5Zoå³ÀU@5ç*Bb-V@6s‘bS @6ÿ¡ã/Až@7‹Xs¨2P@8±Óö‘]@8¡ªÖP¢Ó@9,@_Xí‰@9¶of„ð@:@4ö{ÝÇ@:ÉŽ-m]’@;Rx=`Mè@;Úðly”@~C^Þ«[@?Û‹˜.@?ˆñ—Sg@@ÀÞ¢D@@HÅÙ%¥Õ@@І~˶g@@Ìæ%ªÐ@A 70X¸@AN%‰×µ@AŽÌ&ta=@AÏ*IØS@B?;ÞÌ@BO SôED@BŽŠð§d@BÍÀ{UºT@C ªgMnž@CKH1®Uu@C‰™aIP@Cdž|¡@DT;ªÕ@DB½"ÿÈ@D×ç°žÀ.8ü¤ª>À-8h,ù#À,6ºm-…™À+3õØÌ-À*0©nbÀ)+5DOâÀ(%@6¾š«À'B6r–;À&?"úäÀ% ;^_À$: 8ZÊÀ"ø@‘‚À!ìS‚úæÀ ßvW8ÈÀ£^,4<^À†«—ÆÄÀfêuWÂÀF!æüùÀ#ž–UgÀÿƒo¢‰ÀÙÒí~‰`À²š5ìšÀ É(šš4À¿}{ô™6Àhjf™Æ"À©®ÛEµ¿÷d«>ù0x¿íN$èíN¿×’ùµš?ÇÄ1 11?çZsð›íª?ô|lÎl–!?ýOvóêA˜@Æ»@€~ZAe@ î¨|ä°g@/Y$%@hŒîÅ¥@¡RñÙàb@Û(«o4)@yôãNþ@P6ïR¿«@‹O¥ ¡œ@Æ´ â¶m@!*ÉBŒ@"À‘Sz@#=*çØ@$Zûÿž@%xòM„±»@&–Ýìe›n@'´¶ÂÏõd@(Òt»å@@)ðÈ€’p@+ àìôn@,*½•Ä@-G¿E°¦Ó@.d~¶êÔ§@/€óB2@0NŠí3± @0Üob)@1j"6Gh>@1÷ ·B}[@2„æÊíß@3ð¾»@3žºë´(6@4+Aº£¯â@4·ŸiÒŠ@5CwÌz@5ÏÄW¿@6Zu6íÚ²@6åw%P'@7p!P °Ú@7úpŠÝ6a@8„a·QÔå@9 ñËñÅ@9—ÍS@:â×4´@:¨>À¼‚@;0,ÈLgt@;·¬AÇÓB@<>¹èÄ‹@<ÅS7¬Yô@=Ku¼ð²™@=Ñ2Óh@>VM d³B@>ÚýRâàÑ@?_-ׇuf@?âÜ‹¶BX@@3¼12\@@tV]†µ¢@@µeBà @@ö/á@A6´pØ•:@Avó‰_@A¶êÚFDK@AöšïÊêÛ@B6´Å¬:@Bu!ˆÁ*±@B³öÕ ¨¼@Bò‚ œ@ó@C0«ö @Cn¸9 Éì@C¬bCÇ®@CéÀbs‰@D&Ò8¹i,@Dc—py©À-Ú©!cÀ,Û ø7FÀ+ÚþXpÀ*ÙàÕÃÆ£À)×µ¥ì{›À(Ô€$vV¬À'ÐCÔóÎzÀ&Ëb­I×À%ÄÅ ®åCÀ$½‹‰Ê]ÍÀ#µZ@ŒÆÂÀ"¬6'³À!¢#gMƒõÀ —&â|ÀŠ~©ÄÆÀýÌH–ýÀáÌÇi;BÀÄæÖŸ©¸À¦_«œ#éÀ†BB"…áÀd™ÞäÑaÀAr@ÛSÀ 9­EÂ%XÀí§h€öFÀžë:#ì?¿þ›#æ,ož¿õój–Kµ.¿ê½Ö¦¼¿ÒVØëÛ#?Ðdü1j?é³0Òù-?õ—OUyä9?þXÅL—)t@Žàk@óâCuB@ X¯ŸJa?@_âòêL @”W¥sZ@ÈÜØ[æ@þ-0a¡ô@3õþæµ~@j'ʈ@ ³+¨Þ@׈Êý@!K Á1@""èK‰á@#>’OÖÑ_@$ZA¸G8\@%uîœñÊ@&‘‘ùˆz@'­!Aµ³@(È—.ÉJɶ¼@>²“‡ÿ€¡@?5àØóÍñ@?¸¯9=.@@~[¶ p@@^c»§Àú@@Ÿ×Ökl@@ßfÕ«~'@A‚är! @A_Z=Le–@Ažì#%ØÇ@AÞ7⣠@B<Ò'¢@B[úQPŒ@BšoɹÕ@BØœ® @C€zM×@CT³±À@C‘jèu0“@CÎp¯Æöð@D +©žü<@DG›~žÔÎÀ-|g lÀ,~¦‡KÎmÀ+€8Š ™À*€¿xhë2À)€>~ ž‚À(~¸ï,ÍÂÀ'|2EÍhÀ&x®"]÷À%t0KËZÀ$n¼¯wâéÀ#hWa2‰®À"a›Q­À!XȽt݉À O¨N…YÀ‹Oô…Ì Àu™$!ûÝÀ^6É#iÀE1¹\À*”rœX9Àk€ƒ0ÀðÀºµSÀ£=MRéÀ b$Ú»×MÀN|R•üÀ×Òbá(¿ý’tnô¿ô†˜Z…¾o¿çÕÓj×: ¿ÊUÕNFóP?Õfÿõ—Õ?쟇Z޶?ö®¾«¿XH?ÿ^ÕBŰ@ -w-‰1@d‹¯Ißø@ Áh|¢ñc@ÓmÔq@¿”½¾È@ïéiZœÆ@ Šû+•@R"³…@ƒÆ´õ@µÒ?¡i @è&YÔ @! Y‹ŠL/@"&´4fÒ@#@‰Ä@$Y‰Ãù†î@%rôмºŠ@&ŒU)£—Ü@'¥£î’|õ@(¾Ù+ ·@)×í6 Í@*ðØmI†…@, “6±»@-"`º±@.:YKÕ2´@/RU›„Œ6@05Ä*[(@0À­Ü‡s¼@1L+råVŽ@1×vì¨SÀ@2bŒ¹:*æ@2íiR²0æ@3x >xm‰@4i ãr@4Œ…^ЮN@5ZÜ7á@5Ÿæ>³h@6)$M~Á@6²ÜÁÉ=@7:«Òg‡R@7Âï"8 @8JØÐq3@8Òeñ½²l@9Y“«“ÙS@9à_4Ž@:fÅÔ¼9†@:ìÄåîN0@;rYÓøb@;÷‚íÉ@<|;QZ®@=ƒoî=@=„W-e@>µ1„‹×@>Š›0rƒy@? x@?ŽöºÃ@@4/£z@@H­ MB@@ˆåHnx@@ÈÛqvû@API‚–@AGÿí2ó³@A‡,Œ}Q”@AÆ{Êï¼@B·C½@BC¯½Ê@B)¾/(¥@B¾ø°í¥@Bü€é¬@C9¿5¿\q@CvµÛ{Êä@C³cˆ\£@CïÇÛ´‚@D+âz©À-þéé8À,#4´:“À+&bçÂqùÀ*(‹¬¹'À))²)?Þ¿À()Ù¨„m¦À')šÛ¤[À&'9•Ñ"<À%$yT,‹À$ ȵëɰÀ#+À2À"¦+];À!=›ä~À õ0–äÀ£ãÁ“ˆÀï±;yÀÜ&2jÀÆî«à ­À°3½²¹À—óþ<ƒÀ~<1‡GoÀÆ-”˜ÝöÀ Bݪ‰ÀQaŸ8ÎàÀW•Ò¦¿û¤&l\u¿óÞ‰©à¿å&)ìß;¿À{P À?Ú?›×’•È?îNó–ê?÷ÂÒöVÔM@0ÞŒªéÖ@‚““rí@Ô³Õ6°9@ (ÜH ;³@¿.ÌfîÕ@ê—ê+þ@|6F@BëÎ4J·@oÎà.m@$&ñ@ʯ@Íš¢@ø†g±@!T„'>l@"*tçRi¹@#A¡ì¯%@$XÔ¥DG@%pÒ‘¦¦@&‡)¬MÏ…@'ž>· S@(µ9©4Ã@)ÌÖ=@*âÈ2ÖÀ™@+ùLU7 @-™Ü¢]Û@.%©tñª@/;sÒ‰}!@0(xÞu+@0³µ{N@1=uËmˆ}@1Ǭ°þâ‹@2Q¯9k2o@2Ûyóöµ@3e zÂdš@3îZsj0@4wi‘NÖ@53t(@5ˆµ8mk@6ëizøÂ@6˜Ó·Ã@7 iÐD´@7§ªqxßì@8.”UÐ.ä@8µ#ÙÅÖ5@9;V1vzð@9Á(¡õ‚@:F˜Zý«@:Ë£1Mc@;PF0;Ð@;Ô_Õ°@cgoY¡@>äwìÙ{@?e°Yœ|@?æGpŒæ@@@30Ñ}Êï@@rþz[Áö@@²‹Ü´Àß@@ñØ+£à@A0â£~Áq@Aoª‰Óˆ@A®/-Q–Å@AìoåÃm@B*löE6@Bh#!¬j-@B¥”„"Œ@Bâ¿®â<}@C¤-Ø×k@C\A‹ Üu@C˜—[™é•@CÔ¥<ôÈ›@DjÔÌ‹xÀ,Â䢚AÌÀ+ȯ‚Ô-¾À*Íw| Ï«À)Ñ?‰j‹HÀ(Ô ÉbÞFÀ'ÕÜ~¡„éÀ&Ö¸º òÀ%Ö¡GoÀ$Õ›휤À#ÓªPLµÀ"ÐÑÚÿ*0À!ͦVÞãÀ È|¨VÒwÀ†„Ö½øÀy{òX’¾ÀkDè™÷À[tú(ÀJ…óºÀ72ãÿ„À"Ó›¹ýÀ ,dCúÀ ë£Sõ¦ŸÀ ºˆcòuÚÀ†Ð?Í\ÄÀP’ƒáT¿ú/ËÀ–È¿ñ¹ÅjNEü¿â~ˆVUG ¿¨&«ìÍã?ß £<Ö|}?ðI.u÷†?øÓ£•òÿÆ@°É©PC@ùdwKú@ C…òO}–@ èõuº@íù'ÛCm@Ÿ8ˆ@<˜G©Ñ @d«ó‹ëG@/[ÁLÂ@¶#-³ç@ßKÙ\jG@ cþª‹ù@!=<4ô@".)¤±­ë@#C"›kÕ1@$X ‘T%@%m2SmÀ@&‚*Ê­Ð@'–ï) Ÿ@(«·ÞÅÙ!@)Àaª‹@*ÔãQDÊ@+é7ñ @,ýV‹Å @.9'`@/$Ø'.Ý‘@0NÙ^@0¥—¿÷L@1.ìï Ϩ@1¸lÏŠv@2AÓ:½°@2ÉÀÆ äV@3RBóÈŸ@3Úˆ{¿@4bŒð@Ò@4êNT¡”@5qÉ žÄ@5øú>Ó/3@6Þ§…1å@7sa?Ž@7Œµ€jƒ@8¢(câË@8˜6Œ¹c@9oïŠ}Ø@9¢K£.¼N@:&Ç 4ˆÂ@:ªß—¨àÜ@;.’ÏXÎÉ@;±ÞF ¯_@<4¿¡½L2@<·4™ÂÖ@=9:öýÏV@=ºÐ“ùø'@>;ó] S“@>¼¡Pe^T@?<Ø~,’g@?¼—‚W>@@í‘Å¿H@@]QЏ¸Ï@@œv›/V@@Û[ø9³…@AßÞ5@AXd™ ìp@A–†sš=Î@AÔeÈ&óq@Bøx‰@BOZmŒ“@BŒn›0S¡@BÉ=üCt¤@CÈr^¿@CB oÁÌ–@C~ ¢tþ@C¹ÂHí#À@Cõ3– ¦À,g´@`amÀ+oB›JÀ*up|çg|À)zÕM½8À(B¨á1ŠÀ'‚»È9·òÀ&…D‡ÌbÀ%†ÞénוÀ$‡ r¥!À#‡[9ëAõÀ"†DVî&À!„Oo.Ö7À €¯ÏxÛÀû¸ÐZ¨pÀòÎ9²ÕÀèJN8ÃÀÜ6éöÀÎç·=À¿ˆ.z²°À¯îÀ:ÕºÀ uNßNÀêR¨°ëgÀ¾ŠN TÀK¼â¿ø¿XWdµp¿ðYŠ0å[=¿ß½nËqëý?ŸÀ˜6c”¥?á⽬^Ú?ñg†pwÞY?ùáG/ñ(@/6Œˆ¸@oaògn¢@ ± V¾kµ@ ôþ^ˆñ@6u>€@>÷m·×˜@bA,ÿíò@†ÜÇ8@ª7ŒZß@ÎÈ9Íÿù@ó©Íïçq@ g/Á&@!Ð{@"1Óï²+@#Dž¶ßÊô@$Wo3“>ä@%j=jE@&}4ªµŒ@'¶oÉk£@(¢RúñG`@)´ÐºYŽ@*Ç(˜Fçï@+ÙS†kÜu@,ëJFüP@-ý‡|@/€¯(±b@0Ù ™÷¬@0˜IïKµ†@1 ¥Ñ5R@1¨¦ÒšØP@20Œ#ûêy@2¸@8{›Îµ@8ÿÞ›T}}@9ƒÅá‡@:O_‚ñ@:Šw¥{3ü@; =2Ý%7@;W[×@<•ÃavÚ@<“$8".å@=F‡½k@=”ú•d×@>>Uy³@>•Í¡àö@?màC„@?“TSœ @@ááÕÅW@@GÜØ+ET@@†š;* £@@ÅAáÁD@AY,tÖ@AAYBtJ@AÕ­@A¼—>Qaz@AùÓà¬Ð@B6Î$íZo@Bs…›¶@B¯ùkW³@Bì)kOF@C( šœç@Cc»ß)ó@CŸžWA@CÚ9–<êrÀ, g5GX]À+Sܦ5€À*HFP_9À)%G`³À(+T9JÄÀ'0r!†õÀ&4¤tjŠÀ%7íÕëÄ›À$:RéñþdÀ#;פ¬óÀ"<}ÿ»¸-À!mæ?8Ö[@>ìk(p@?j|“!À@?è¾NÊó@@2žýG•<@@põT˜Z§@@¯ž/s@@ìêŒíw@A*‡“¤á@Agäဿå@A¥ÖàQÊ@AáàY€_†@B|Ôaø¦@BZ׺¨‡*@B–ð‡‡kè@BÒÆ¾-üs@CYé±øK@CI©œøŠ³@C„µrîÓ@C¿} ÛË`À+³÷ñÚØ2À*¾r3½™ÒÀ)ÇùZIaÀ(ÐL}wmÀ'Ø:ñŸ¿À&ÞùÒè{´À%äÒØY_jÀ$éÈ‹ñN À#íÞx âÀ"ñGœà›À!óyÆAÌÀ õßfviÀë‡>éu¢Àëhd‚”pÀ鹯ê–]Àæ„<<£%ÀáÐØ¬´ŽÀÛ¨íÂP©ÀÔ }ä½ÀË!õh¨ÊÀ­k¿À j}ÊÞÀPÇÁ/ñoÀ4¢ÛˆÊ'¿þ,HD|ù‚¿õêÄßb¿ëIÉ3ƒ†È¿Õke¶ÃH×?Ç™zÔ„ë?æŠ ÅøŽ¢?óš{ cÕÁ?ûó^`¿@'¾§µï@WSBBÑ@ ˆSÃ;È@º¦ªë;@wXÅÍ@‘n:׉ô@¬E™"®ò@Ç’X´@ãF?‚ªØ@ÿTè g@°–=õ@ %è\“@!*Œ‰xl@"9e–…P@#G‰³—ó@$V¤iÍé@%d™kuE)@&s:œÉ@'…Eòî2@(ÜÄ¥ü@)žñÙ §@*¬-Å&ã@+ºc)CŒ@,ÇÒ>÷¬…@-ÕSûÑó@.â–ü© ô@/){@0~#LZ @1S”"‘@1ŠV™Ù$@2*–u–l@2•ËñwŒW@37’6.Ê@3 jiÕDW@4%asÄ…/@4ª¶:@5.B«Y­@5²Â69ç–@66¬º%EP@6ºM0ƒ¦@7= W²×@7À¤“»õ@8CUdg†@8űçüÛi@9G·vÊ@9ÉbIèÂ?@:J±G‘¯ê@:Ë¡¦$67@;L1ùì@;Ì]jáJÑ@G"È(@>ÄÐ[Ò|@?B 6B­@?¾×aH¦å@@–ž:@@[†ˆÛ¶@@™:¬!•@@Ö²K.)Ë@Aì±nÊ @APé2iL…@A§)´UÉ@AÊ%úêúp@BeŸ#Ù@BBcáJ9Þ@B~!å<%>@B¹ž ˆ¾Û@BôÙóÀ_@C/ÒoÛJA@Cjˆ°!@C¤üX.À+[a à¨8À*gfÁ›“À)r~_%ì@À(|ªÃ”>À'…îî–q·À&ŽMÿƒX%À%•Ë5b^„À$œiîçîòÀ#¢-ªkTÀ"§ÑuŠÀ!«2¾sÍÀ ®{°ó€iÀañ²$™Àe\¢ãH&Àg@¦¥ë7Àg¦l“qAÀf–ßÈBnÀd&“aÀ`<¡Ÿ(ÑÀ[ëŒíÀ¨ûªŸÉúÀ ™bÔÄqÔÀ‡SÔ¤T@Àrã”S-r¿ü¸NÊT“®¿ô†iùû´o¿è ‰Ì¬x¿ÐX1ì?ž?РF˜ÝÀ?èÓÎV5há?ô¯E ï´?ü÷û×l#@¡í—a@ÉY+ "‘@ ò(ù@A.csÒ@£ÅÇ 06@¹öáLDÝ@Чb ÿ@çÉ›-Ф@ÿQeZ=ƒ@1sµ–j@/\­”(i@ #âö?²@!0/þ¦øß@"<ŽÒ¥"Œ@#HøÐýÍ"@$UgV}«Ž@%aÓ¿Fÿ@&n7g#ê@'z‹¬ž½_@(†Éðl((@)’ë—Žêt@*žê gþ @+ª¾¿îþ”@,¶c*è{T@-ÁÐÏÁy@.Í8r§z@/×íþAÒÛ@0qHb'û @0öqžIY@1{o’¿`@2?(TL@2„ÝO!Þ3@3 Gw]>@3y?bX@4q”¾¤@4•+¡;R@5¥ý8(@5›ÝYAÝ@6Îíà2l@6¡wÿÞB@7#Õàtç±@7¥åí¥Å@8'¥’‘rË@8©Gȧª@9*)“˜\M@9ªé PÐ@@:+NN‡uð@:«WS¾4@;+†Å’@;ªJ Ýå¡@<)002 @<§°ë–éø@=%Ê‘êX@=£{!.ü@> Àšètå@>™E:*@?R, @?•ý ¢¬Ù@@Âg«¶¡@@FL‚mÉ©@@ƒœË<î@@À°`ßÖ­@@ýˆ¶ª~c@A:$jOÐ@Av‚סɭ@A²£cô*<@Aî…{1 ›@B*(‘:R0@BeŒ!€V@B ¯¯A‚ @BÛ’ÄÖž@C4ô=fÞ@CP•Ö¸iØ@Cе Â’UÀ+8(wÀ*,Fi+¡À)Ò^D„À()‘™ ^ÝÀ'4m®"2´À&>it¢£À%GˆÃ%ÈÀ$OÍ"bÀ#W;–‚(SÀ"]×dÐbKÀ!c¤eÏlÀ h¥“àUÐÀÙ¿[ãî$Àà¬îM»áÀæ-DƒÀê¡ ”Àì¢$ dÀíÊnµ¢Àí—÷KÈÀìVdÒÀ ÒÎA»÷À Ê}ŽÍÀºÀÀÂÐÀ³4$¦°4¿ûHN±û½¿ó%⾕>Ý¿åþŸbðP ¿Æ¦ úk&?ÕflÊàF?ë2,¡ëÏ?õÁ :óHÖ?ýùÀåóÜ@ÅÂJ0r@:ožõ@ ZÑø“ë=@|Èi¨³@Ïô¬f@â ¡o!¨@ô¡WqBR@¥–X?`@ · ³@.ÊbɃ@BЩDMI@ +‰í’:;@!5ÃZ#É @"@%Û^@#JcÕàû­@$T½ò?@%_þQ'@&ie±‡@'s¥üÖ,á@(}Ðÿ-v@)‡àæ—@*‘ÌÎ,¬û@+›ÆDš«@,¥%œÄQt@-®„ú³ø@.·¨’årZ@/ÀŠ#[v@0d‘º}¨@0è·/¹Dî@1l²c»M@1ð€P™“9@2tø…Wâ@2÷ˆfF{Ã@3z¼­·G´@3ý·ì:Ç@4€wI/{@5÷ö]ú€@5…70c[ @62?I[@6ˆæuí¦k@7 Q4S¦L@7‹oæEï@8 @pÜ@8Œ¿ä#è@9 ê£ü`ó@9ŒÀYÔÊ@: =áMþ7@:‹`öHÔˆ@; 'bÝ5@;ˆŽÿ‹S@<•³ií¤@<„9tM;…@=xFêõ¢@=~P>øãf@=ú¿FÞ’@>vÄ9Ô>¥@>ò\¯àÀc@?m‡1øþÊ@?èBþ•˜@@1Eô–Ò@@n1† A¾@@ªã OÑ[@@çYÓ¡Ç@A#•3VÍ3@A_”Š$Î@A›W<Ëñ9@AÖܸ1à@B$p¯ÑÊ@BM-â ø´@B‡øaº$@B„E‡@BüÏλ_@C6Û‹Á@Cp¦×ÐB—À*¬§S)cùÀ)»½¤3’áÀ(ÉïƒZw\À'×?ÂŒ:ÆÀ&ã±Ql^ÉÀ%ïG=[ù½À$ú±zKÀ$ìöp:À# sC«À"K«x‹=À!É@»HYÀ #ñÏ©zÀRç53À]Pgby@ÀfC¥iÀmÉQ4 ~ÀsêòÅÀx®˜ïöÀ| se<À~G¨Äâ”À þ]¯!ÀRÀý¾„cÀúÅHtõÀõ†ºxñ6¿ùÜ-F—ú¿ñÉx}B¿ãcØ_|À¿¹n HHÕ?ÚЬZØ"?íTcz¿q‡?öÏß„\ ?þø¾|°,@’PJX¬©@©«™Ú?@ ÂY È ¹@ÜB—,ÒA@û§>“tø@ ²{5þ@7 +Æ@'(nSö@6zY¨$%@F b^ü@V ¢à@ 3fà7B@!;G njˆ@"Cƒ¢€h‡@#KÊÞõ7@$Tiö[X@%\_ò‹pø@&d¡$U"£@'lÓ­j„ï@(tñ>Žux@)|óŒU?@*„ÔPG) @+ŒJS–@,”@aZ«@-›o„FŒ@.¢‹hü€b@/©gVÖúg@0Wþ]Vêt@0Û"ÇÙ‹@1^ï[®@1àìß‘vÉ@2cŒ«þ1”@2åúpgD¸@3h3QM“Ù@3ê4|_]é@4kû(ç `@4턘6ó@5nÎ É@5ïÔøùEE@6p–¢½˜)@6ñ€¢—@7q@ Ñwf@7ñ"ɤ~N@8p¶Kóå@8ïø1^-H@9næ%‹Ïá@9í}ánSí@:k½+z´ø@:é¡×ß&G@;g)È´-ù@;äRî)Z@PN§þ@>˽.@?EsSÝ{@?¿bªé´4@@q›ÓJ@@Xù¼4yˆ@@•I¢ *@@Ñ^»›(V@A :AÁî¬@AHÚóõg@A„@5õZ·@A¿iwþªÛ@AúV.ä@B5Ô]Xu@Bowî«@B©¬m¯@Bã¡«ß…­@CXy¥Ú‹@CVÐ âg{À*VzVE6@À)gÝÅWÙÀ(vÑšHñ¢À'…°V‰XÀ&“´ú -åÀ% â‰0œ¸À$­<% l˜À#¸Å ÑÙEÀ"À—ðëˆÀ!Ír@Ç,QÀ Öš>rÀ¾ ¨pÀÍ`uo2¯ÀÛ>l±‚^À箕MˆÃÀò¹-s ÀÀüf©V’XÀ¿²u ~À Í&ÊßíÀ˜ïJZÀ ,S”TÄÀ3fÝSxÀ7Žô’ÜÿÀ9Íétú ¿øsЛýñX¿ðoå 0ÏM¿àÐ’¡é¿—Ñx¹&?ÞËø=×û‹?,Í>+?÷ÛØÜ¦r?ÿõ à ¢@– Ó,¥@ø!¯Š@ (Æ´Ok@\ +{@&â¶$¡!@0먮@;jì«$@FT…¤ùø@Qœa˜&Ñ@]6^i ÿ@iKWè@ :—õ’„¿@!@»{Ç£@"FïŽxÇ/@#M.Ê”`@$Sp±däÁ@%Y±fÕÍ­@&_éøÀÉ@'f9Sg–@(l*®ÜB@)r%+³Çò@*wÿ–Áì@+}³(¤©@,ƒ9ËÑÜ@-ˆv%Ú@.¨$C ?@/’ƒÝx³æ@0KZ’k@0ͳcv”‘@1O± ©Uí@1󮇓þ@2S(1i×@2Ô›Õšÿ•@3UÛÏÑC@3Öå]–ã;@4WµÅµûµ@4ØJX¢ o@5X pÚ@5صsHŸO@6X†ÏŸKâ@6Ø®|ƒ@7WTŒ¸«F@7ÖLÁ @8Tö Øó¬@8ÓPCa(ì@9QXiQ @9Ï ?r)@:Li–˜«b@:ÉnLÙð0@;FM»x9@;Âe’_hâ@<>T!«øT@<¹ân–@=5 z¿º@=¯Ô¥Ä¼@>*5¼ww@>¤/²@?¿>p€@?–ãýK”@@Î9á5}@@CówЭò@@á'µæ@@»–-Ë£Õ@@÷PÏd¨@A2TÌmŠ@@Am]´Ô@A¨*qúeò@Aâ¼ØLp@B®"@BW,€)ëë@B‘ €ail@BÊ©?å‰_@C VŸ-È@C=/c&“†À*[HñÀ)0Šz¿À($s'ÀÀ'4Þ‹ÞÀ&Dsé;HÀ%S6¤³îÀ$a)ÔÃ7ŽÀ#nP¬ŠÕFÀ"z®zùs¦À!†Fª±5À ‘ÁæC»À6hÄbá[ÀI"Á+<ÀZn˜tð—ÀjTÀxXÙÀxÝ"›²3À† Þ5°À‘öµí<Àœ—²F¬.ÀKü-ÛÀ \d.µtrÀjzQ†ÀvQa•Þ•¿þÿùN!T»¿÷ƒ.Γ¿î4zŸ  m¿Ü…í&Ÿv?«_ªÞË–?á¶yv ?ðÞj{J2T?øå •f@wZA¨¹x@}Ÿœ´° @…>—yƒ@ Ž ²‹’<@L›†aâ@Q©+!¤@WºÐÞÞ @^?“5æ~@e,,¢‡Ë@ltÓqõU@t ­Ð²µ@{êÓÕÔ€@ B(ÊÑ@!F!—øë@"JR*}2@#NdƤB@$RÌ»öëû@%W 'Õó¶@&[? ‚³%@'_gƒòì@(cz ØÇ@)gt$Óõ@*kM­-&>@+oFl@,rˆþúæº@-uÞð%L @.xý:T[@/{Þ A@0?=Ç?^ @0ÀhEÛ…@1AjêÔ½S@1ÂCŸkÜi@2BïYÃ+@2ÃkV;ÆÈ@3C´ÙMö&@3ÃÉ/óðÔ@4C¥°L@4ÃG¸ÖëÖ@5B¬³#Y[@5ÁÒße:@6@µRVùt@6¿SüŽæ@7=«£‘sÞ@7»¹åÄM@89|m'PO@8¶ðï  Î@94/6í@9°æúTªA@:-d+úÆ@:©Š«ô´@;%Xo Âå@; Ëw-AË@<áÓ˜•—@<–™ ú¯¨@=ñ ‘?ž@=ŠæEDoš@>w™½•r@>}£Zyê&@>ögèÙW4@?nô)mz@?æµ9¬™*@@/‚NÔó@@j©×â@@¥þîÅjò@@á#âSç@A×ëQÛ@AV¬sH7@A‘eC¶“@AËV$¬ò@BS,sýG@B?N@Bx›/÷ ã@B±åFzµ5@BêòÝyOç@C#Ó*À)¬gšŒäÀ(ÀŒ~æ.À'ÒЫê×ÔÀ&äÅ´ì[À%õé~´tÀ%>ûŒ<À$É8˽¶À#$‹^Í•À"2ˆ°ÙÝÛÀ!?Ä ©À LBl%{vÀ° ÂëîDÀÆ%5*K†ÀÚØ¾cm¡Àî.!™±ªÀ-Tßh ÀÞ€±½LÀ IÿC‰CÀ.x[·òçÀv䢙ÔÀ Ž”êóôÀ£Ù¿ÈìÀ¶ÿ¯ ú¿ý œ¿õ®‚hiy¿ë ¯²ÿ›¿×xÿ-¥ý ?Ày6E å¤?ä åu½×?ñô2¯ÏÛ?ùë„q<¦»@òè|„Í@ñuXû÷^@ñTI\U¨@ ònäÜ&@zWz{¾@{ÿ 0uÐ@~"ÚŸ*@€·‡üÁ…@ƒ±¢(”~@‡¤†iô@Чûw]É@ŽÏî÷@ IT‹j•æ@!Kx<Võ@"M«¶GI@#OéÀ<@$R*}¤ƒ•@%Tj·Tj@&V¡Æ8u‡@'XËâÁÕÖ@(ZâyM‰@)\ß­:ͳ@*^½¦Q “@+`v‘Ä.@,b£/ôë@-cb—a(@.d‰,^Û0@/et4Aƒ@03Â"“@0³?¿Q@@13JHÞ‹Ÿ@1³+œ{Ä@22àþÎJ@2²g»ÜY¾@31½'v›@3°Þž×2@4/É‚ì„@4®{Dí9S@5,ñZæù@5«)D8„§@6) Œ¢#@6¦ÔÈ¥Ir@7$C—̉þ@7¡j¤‘>î@8G¤¢_’@8šØY'b÷@9Žÿ%¹@9“ úËç@:ªî›V@:‰ôí¢Ê@;è†E=@;‚‚Uhl@;ùÂ9‚¹Ú@WqK’@>Ïk°ª»~@?Fÿ{Ï¿‘@?¾+.ð•@@v¬Ãy‘@@U¢LLQÛ@@—ËZB¾@@ËV…ö¶Ù@AÝÞè´Y@A@-?®ýÄ@AzDx¶¦@A´!à™¦@AíÆÍë@B'08Ui£@B`_×{°-@B™T‚„@BÒ ÐÙ5Á@C ‹`=nˆÀ)XxiíäoÀ(m—¡&ÛÔÀ'äXþqŠÀ&•aF-L¡À%¨7°È‡À$¹÷ÈãÀ#Ëæï—êÀ"ÛpÅÉx:À!ë ëg–À ùç¨qJ_À  iqŽÑÀ*ífrÝýÀD`HË£ÏÀ\té™g'Às2êv¶Àˆ¢U§UÀœÊˆäBÀ¯´]Ò_qÀÁh&À £Ü'E.À ž?Ž(Àß(•ßáÀù »˜{¿ü#¼íLÏi¿ôP^ÏÚ(Œ¿èòLnù®i¿Òxè;e Í?ÊñB;Î?æD4´¢?ð?ó1çtÁ?úï[©i¥l@m6üµ¬;@d[-‹S@ \Q¥KÈ@ U¸Z‡åj@¨â´ûæ@¥æÂÑÚ@¤&~Ø©I@¢Õ?ì ¹@¡çM²ç@¡P»€ªò@¡æâµ@ þ7¤‘ë@ P•¤F3@!PÁT™@"PüoÑ@#QA6½Ô@$Q‰êÀ-è@%QÐʈ@&R$ï¬@'RB ~H@(R`íœq@)Rg-Ø@*RN›ç=d@+R8ñ@,Q«ŠÓ­@-Q•¦ã©@.PJ†²i@/ODËð@0&ÿn¢S¹@0¦9ž®É @1%N=L Ž@1¤:—íÀ’@2"ü¸¾À@2¡Øì<í@3ó}H\/@3ž$Zq¿ë@4ãR"]@4™ã“uÄó@5lïe¡3@5”¹„þ@T@6ÆëÃ!¹@6Ž’Å.œ@7 ¼þ%2@7‡\‰zòF@8Uë¾ß^@8¯õ•@8úf­™á¨@9uyǯ>@9ð;ì÷{x@:j«$”+@:äÅP¢/@;^ˆ§µúŒ@;×ó>¹qÛ@1–­ì„@>¨Èi®â@?•LZÐ@?•ü Y_8@@ýÏ¥¦2@@@É8ÿ†F@@{_—¹oý@@µÀIa#@@ïê²0 @A)Þ!?ûð óò@æOaçý,@Õ¥ƒ¸ÿZ@ Æ> TÖD@ ¸ôUj@Õqiá½@Ïah\F«@ÉÈf z@Ä›Ï4@¿Î¡ ¸£@»WðúL@·,tlz@³?µÇŽ @ WÃöF^O@!Uü»Â_@"TD‘;ãŽ@#R•Ú ÿì@$Pê÷ó%@%O>L ƒ[@&MŠ7½SÃ@'KɰÒÏ@(IõbÁYW@)H nîô@*Eÿ®NÄè@+CÒ‘ùÆ(@,A|ùŠr@->ø)2•«@. SýëE@>‚zþÆû@>ø‚7íeÄ@?n%Œ÷Î@?ãc•kÏ@@,z¥*@@fU/1V@@ XG”ÿ@@Ú&)™@A¾?œ»™@AMý%Ù@A†JÚ ì@A¿>UA‚@A÷ùòãó{@B0}>–[¼@BhÇÉGsW@B Ù**ßk@BذþxÑãÀ(²·ž ‹À'ÊÏ«a=À&â‘5®oÀ%ø£õ`ÆÒÀ%e–o¿…À$#eKžÔ<À#7¦ÌìíÀ"K*Êi3gÀ!]ö½ZKôÀ p ßcÀâPÑaÀ$L¶Ü¿³ÀD`brÿaÀc$…XeÀ€ þzÀœÛàõ®YÀ·ÞdOÛôÀѯòñ‰UÀÔ±C³À Áb°iàÀ0¡rHoÀ[a½ºTÀ„<¡y™¿ùU•Üì‰æ¿ñŸ/sˆA6¿ãÊ43Ȳ¿Á;Ö·Ìì©?Öf ›ú¿h?껑"ð¹Á?õ%}ÕÖ?üïe„—ÿX@^9cx³ë@FzBòç@ / ¨ªD´@X]å·@P쾫¢@øt?Œ[@ï #\F¢@æ sà)@ÝjVá“@ÕÎ-@ÍÑ»R@ÅRÃ%Á*@ ^à“u®@![*Ð @"W„VÒÂY@#SçD®Ë@$PMš9ÀÛ@%L²[édJ@&IàÕS}@'E`¬³Å$@(AŸEXÐH@)=Æ3Ÿû@*9ÐNëm@+5·I·=@,1v™_@--’k;‡@.(gÚoŸ@/#ÚrD@0<‹J™I@0ŒAEu@1 À<9@1†ÉxàZú@2©Ø@2€^­\òš@2üåx%Æ@3y;¿8Ó¢@3õ_ o0@4qMKæ@4í73ðÙ@5hQÞ'@5ã¿Kñ@6^À ræ@6Ù€"‘Eï@7SýF•’@7Î4ÓVŠ}@8H%#?l9@8ÁËú ö•@9;'N€2w@9´5"`Ñ3@:,ó‚˜@:¥`‡>È(@;zTÂÎ@;•?xß@< ­\H@<ƒÂµv}@<ú}¼j_>@=pÝ$rϧ@=æß"ì0ß@>\‚/*ZÈ@>ÑÄÌÅ#ª@?F¥‹¢¼@?»#þå½@@õ7ŒŠ@@QwsñÔ'@@‹`Òû3@@Ä"©ê@@ýÌ&l ‡@A6Óß0F©@Ao¥Æ(ð@A¨AZš¡T@Aà¦!Öœ€@BÓ§-¡ô@BPÉ{æx$@Bˆ‡71u¿@BÀ vYœÀ(`Ý9G¢À'znè䞬À&“:w(ø¢À%«B‚tVgÀ$‰ÁÈzÀ#ÙfîÝÀ"îá)xBzÀ"÷7C^EÀ!X@n+uÀ ,r1Ô™À~"hÊçÀ¢ºò·ÿqÀÆ;7%-Àè)r)Àú°M˜À(’ŠtwbÀFø7ÅñtÀd3|¢”À˜q’ À 6•g"WÄÀjnq?Àœ33Çê¶¿ÿ—ìB„ë¿÷óq+Må¿ðKvh¦± ¿á?„YÕ½Õ¿® ÑøLl?ÛˆiGŠ/?ìïåú<È?ö01£ý?ýëº÷Ü(@Ôüé@µd¯ÕA]@ —rBt@y¼ÛbÀ@.Á¤¬6@! ÎJôª@ñ7܇†@(€/S+@ú¼5mÞð@î¡Öľ$@âÎÖt®@×8™„v4@ eê>ºVA@!`KêývÕ@"Z»ø^ÁŸ@#U5 V0í@$O±ÆáÀ@%J,Íbò¦@&D Á‡H@'?G"B3@(9^½[@)3œ¡'í@*-¾ÊÔQ,@+'¿2l¹ë@,!˜Ž)@-Eœv¾Q@.Á 6ÛšÆ_}@>«Z²2Iú@?yä‡WÝ@?“7Ò?Ò|@@I“è0@@<ÅNÔnt@@v|)@@¯$ƒíý¸@@èÔx3@A ´áÙ7@@AY.&@A‘r!A P@AÉ€Y;(@BXYJìŒ@B8ù³Z Ñ@Bpcþq=@B§–׬.À(«Ï×CŽÀ'*µR.c À&Dü¡ºÄÀ%^„Se8OÀ$wOJ£úÀ#_²%·À"¦¹I)*À!½]õi}…À ÓQ›ú“ÐÀÑ.*¥‰ÅÀúc2í IÀ"HíÖÛÍÀHæ% ,€ÀnAÎW,çÀ’c 7|¤ÀµQ(AÐÀלÄúÀ÷² æÀ.hp« À kD7ÍI9À¦Â×^ÀÞÃ#ÜZª¿þ+/„–A¿ö”Ì!ò”t¿íõ¿»•Q¿Ýu¶µ¢åo?Ù§fôŒg?ßâ»æ_ ?ïGhÔz^?÷8ÂbŒ?þå®ùñY:@J¡¦(Û,@#¬`ö¹4@ ýä/‡Ðs@Ù5dÛð¢@ZÆÙ’@Ij: @8}Àü$@'ôuØ8Ê@Æ.žq@çöÊÔN@øO~ç„f@èòiÜšÐ@ lã(ÐOý@!e`d"õÑ@"]ë¬Óa¢@#VƉðÞ@$Os‚f<@%G­ud¤±@&@<Žs@'8¿€·Ô¦@(114q¤@))Œ b5¤@*!Ë4´\;@+éa±0@,ádÅûc@- ®fn@.JfQ@.ø±0sï@/ïÝl\ @0se c&m@0î¹MÑu@1ièhÙ@1äð‡Ç¢z@2_Ï  / @2ÚŽH?3@3U±:8@3ÏYÚ›@4Iyä9ò@4Ãd—ƒ¢7@5=Ö’@5¶‘Ý)1@6/Ϧ3Õ†@6¨ÏRá @7!ŽÆ ûN@7š ëÿ=€@8Dº¢^,@8Š71±K©@9áZð˜Ó@9yAJ^â@9ðUaë@:gÿðF2@:Ý‘"¾£@;SµÅZ ¹@;ɇ1SrÐ@…7˜±3@>…AÙl±€@>ø ƒ¯JF@?kŸÛ­é@?Þ>ö”Ü@@(=¯!š´@@a*†ÈÂ@@™å8Šf€@@Òm3ÌÝ@A Áí¿kç@ABâáUU¬@AzÏ?¹ @A²‡}æMP@Aê 9_›@B!WSd³'@BXncL‡‰@BOúÇãÀ'¿<úyËÀ&ÛžË;#À%÷_üQ04À%e_£ßìÀ$,±›%{£À#FGkHb‹À"_)¢î©þÀ!w[+T2À ŽßóxÀKp„ĬiÀwÔ$]޳À¢ïi[õÀÌÉ–Œ•ÀõgŃRÀÒ¸<[âÀCï>Àh*MðDÀŒ%1eÈoÀ ^feÒÀ ¡Á¬RqwÀãbÂ|¥À#å «ª¿üÁ{ŒF·¿õ93r±Û¶¿ëZ®/uÅ|¿Øx"1‡Á?·IQ‚`9?â¼(ä¿?ð£.Þ>Ë?ø>âm)¶?ÿÝSú;Àp@¿/|±@í—«–m@ cÒw|aÄ@7ÊsNSS@†anŸÂ@qR÷nn@\±š;@HquZˆ@4Š$2vƒ@ ñ·Yž@ œ3ƒaâ@ú\±ÜÞ@ sË3•~Ð@!jhž¹@"a©U@#WÇ`ŠÎ^@$N~–@%E4* cA@&;âüüϤ@'2…ð1rL@()æð˜Ë@)“Ç2Ý+@*ôzrËì@+ 4îz1û@,P-Ëí@,ø@êW\@-îjk{V@.ãRQ@/Øã’%(-@0fü°xå˜@0áf¹Îö@1[«Žæ“¤@1ÕÊ·ž*‚@2OÁ1ey.@2ÉŒ£ýmý@3C*½¶Û:@3¼™3Ãýœ@45Õ‡’X@4®Þ-áhð@5'°AxYÉ@5 IÑ¿@6¨¸…5@6ÊÜŸ…I@7®*Àþ‘@7€P™iO@7÷°(_‰@8nÊàêòk@8åžÖ#@9\*$%f@9ÒjóL®x@:H_s…U¬@:¾à©©@;3\€ºÑß@;¨a¤]:½@<¦ö+š@<‘pîÆ`Ë@=wí£@=y'ãkø@=ì}À–x@>_x@5†@>Òa•"@?DY-C@?¶<Õ1@@ߊ[­E@@LptsWâ@@„Ð2Të@@¼þ4¤“w@@ôùñªk»@A,ÂåE?"@AdX釲@A›º{™ú @AÒè1ßæH@B áE“å@B@¥N½¢¹@Bw3é¶{À'o3t <ÎÀ&'PŒ’À%ª`ŽXwÀ$Æá¶¤EHÀ#â­fËMgÀ"ýÆRgáeÀ"/BÔ­×À!1ë8À JüúüÄÀÆÎ¥¼»Àö[ÆÍjÀ$§T<ÀQ·ß›À}”%\sÀ¨C í3ÀÑËšD ÝÀú5 :À!†¸4ÝÀ GÉ=ÀÚìOU À"q÷ìÈÀhðLåÍó¿û[(F¯ò¿óà±vÄ€s¿èÅÍXç¿Ó…ýmŒ]ß?Å.NMdp?äUI[Ò™þ?ñµ:Ñó.?ùB¢´|Ä@i\Aënð@2¬yºí@ý/-_ü«@ Èѳ‡$@•7 í²@±•\Úû¤@˜Ý‹x'Y@€ƒQÖ/@h¡J¾@Q îW´Ã@9¾Íœ9½@"¶QFàh@ æ’eú³@ z¢Ð•¨ª@!odÃ;[6@"d4"±š@#Y îkCæ@$Mç$‰œ@%BÀ¢–û@&7“ÆI¸@',[//Û•@(!ý6ÅO@)³3ðY@* 9Ú Ðô@*þ úWf@+ò㤖ý™@,æüî5¾n@-Úçó 2¸@.ΟÖ"ή@/ÂÂbéñ@0Z±u¬“ù@0Ô2FòÚ@1Møw”&@1ÆÈ3_·@2?Ø¥"e@2¸¿E€ý@31yER¨@3ªu˜@4"_¢ÿú@4š†²ª`@5y'Üh©@5Š4T†c@6¶‹¹g@6xüs†î¡@6ðM¼]×@7fά¦Ö&@7ÝV™¸9Š@8S›'Ž@8Éšr#“µ@9?Ržÿôè@9´ÁÝbß±@:)æfm2m@:ž¾}G ²@;HoCX@;‡‚“ÿ9É@;ûkM€*8@9ûïÏ‘3@>«Ü‚»°@?aƒ7|µ@?މ©T×Ý@?ÿS¸\@@7ß>µcç@@oäié¿@@§¸Í5¨¢@@ß[âWúã@AÍ%Yî@AN {n"@A…CcXð@A»ñ3”ï@Aò–yú"Ÿ@B)¯¶=¥@B_Dq@“cÀ'ä§ÌÀ&?Jô1«ÐÀ%]úsÙÀ${õ†wÀ#™>«|öÀ"µØ£ñÜ1À!ÑÆ(T„ÒÀ í ‰i·À §=VPóÀCAl€>tÀuóÆœxÀ§iÈéõÀ׫ùT­9ÀÀH™Ñ À4­}a– Àaz…¯V]À.uôÀo¡㮀À ÂÐ9'œ¡Àùlv¤ÂÀc+úüÀ°wvÞù¿ù÷×xžZ½¿ò‹1Ì%·¿æ6=B1<^¿Í=ùmÑ¡?ÎvVñž½ ?溻cþ?òÄÕºi*?úDðõ7l@âõËb&@¥ ï!‘A@hw̽ˆÐ@ ,è!-”ø@ò_Âý@Üe¨–BD@À nÖ<¬@¤¤!¬¥@ˆ†Êœ›@mGV†”@RR­qß0@7Ÿ,.ä@##ˆ|í@ jnG¨a@!tULƒêž@"gMJ›Îu@#ZM„«8j@$MQˆE²@%@S„øp@&3N¥0ñÒ@'&>Ú>ù@(Ó“žš@) é±kFœ@)þš–´™¤@*ñ,ªËñ@+㛡ôè@,Õá\s@-ÇùÏ*Nq@.¹àmT©@/«“$¹¸@0N‚—OzŒ@0ÇÛ”Q@1?”ÆÜÆ@1·èËR@20n€ž.@2¨¦è@3ï£J@3—™ÄG¬j@4JÆàØ@4†\í—íœ@4ýq âÐ@5tPô)<@5êö|âý@6ab´iYÔ@6×’ÁROl@7M„­Û°Ð@7Ã6ŒìÁ@88¦zF@8­Òš¸òy@9"¹N+~@9—X6tž@@: ®*(¤¢@:¹Bx{@:ówÒËÇw@;fè:¹zï@;Úân¶A@ÊýÑ3@>…í÷?z_@>ö·-Œæ¹@?g%\¤B @?×7Kp„@@#uäúˆ@@[ Ú‘lÂ@@’›ù€Øh@@ÉæºK9{@Aš½I@A7ééË­@AnŸÌ$Bò@A¥$2úª-@AÛuå.5í@B”z«)“@BGÉÀ&Ñ.€þ½.À%òáWuˆÀ%)àƒ À$1œõüÖ¼À#Pa°Ö ¼À"nz²¤¯ÜÀ!‹ê±ìøÆÀ ¨´yŽ0ÝÀ‰µÑDÍGÀÀÁä¹ Àö“;ÁdiÀ+0 .ó%À^ž²÷hÀ峯PªÀ ¸ƒ¥õÀòϸÀ!1tY³Àùg–®›À ÷Ȫ4tÀOœëÆÆkÀ¥…2Y¦¿ÿó!ŽêÔ5¿ø—žm;‹¿ñ8 –W“ò¿ã¬=¢\­¿Ã…¬X†ò?Óߨ"’'Û?èÇ2„ÁêZ?óÒ8­­?ûC>¡Õê?@[}çß×È@“Z:Ó@ÒÍólþƒ@ Óºš*@'5yX×d@Ô×gO@æâ7›_@ÇT¢×»y@¨#êæÐ@‰DÓžY@j®9ƒEw@LXÞ…@.8!"ë@ ˆ"x+w2@!y:zÙÖÚ@"j_RŒ¹@#[Œ7=€D@$L¼_°’@%=ë%¸¥@&/UƒÑ@' 0!Ñ@(=ì ¸6@)6¤¸i@)óø¼*‹@*ã×*£gò@+ÔuŠL@,ÄìIÒ[Õ@-µ6ÕÕ1@.¥P~•T@/•4¤kD@0BoWÙr8@0º%¹œR@11¹"äd@1©)e×͉@2 s›ª¬@2—•}òÉ@3;ž¨@3…X÷<ª@3ûôE8â@4r_²AõQ@4è˜=Pd)@5^›Úߊ–@5Ôh†æ»i@6IüE[@6¿U! [@74q.–_@7©N‰ÙZA@8ëWŒãž@8’EÅ%ëA@9\ V@9z,b Å@9íµ©Øò@:`ôƒ6UZ@:Óè÷Ý÷@;FÝØ)Ø@;¸ê¤!QÀ@<*ôË-@<œ­¾Útz@="×z @=&†c‹1@=ï㊆õ;@>`IÚ~r@>ÐX+ÅÊZ@?@ > Ø@?¯gÛ([@@3lNæu@@F„‰ê¬@@}¦»!ˆ°@@´™yZ@@ë\D)ŸÆ@A!îž²º@AXP@ž @AŽ€,ñ)@AÄ~ñ†Ô@AúJ©v°Ã@B/ä@µ²À&ƒ ¯iÑÀ%¥TW4ÚÀ$Æë¾©À#çÔn1iÀ#ÔGPÀ"'¨æÁ&’À!F™S—¯À dæÛCЙÀ(¥+©ÚÀ?IBû|ŒÀx5†¤''À¯óFjÀ扙6§ÀþHÆÀPWˆŸ-Àƒœ«ƒÀµÔP6ÿKÀ Î â—pNÀ .nT'aÊÀŒápÜ¡òÀér÷)ÜA¿þˆcÍo*-¿÷:Zý¤€j¿ïÑÔóâ ¿á(ch}z7¿³Å ]†é}?Øzb!|êF?êøÑ¿’{?ôÜÿ@vâ‡?ü@:Q3ðÍð@3èýç«dŽ@4^ÙZÁ:@4ÓìæÀ)@5I]4N¿@5¾ ôb%@62ÇÔ½î@6§KU@7’Éy\å@7!¤Àß@8hGQ¹ï@8vòpnWê@8ê9Û‡Ý@9]<Ïó×ç@9Ïùö¨¬@:Bnžç€×@:´š5QÊÞ@;&zÍ"@;˜Û|l@< Tß`ý@:îR¯)@>ªBŸ[®\@??jÎDã@?‡ã‚œñ@?ö-¾`g@@2ÚùÏ@@hØš@@Ÿs%Ïà/@@Õß%¼_o@A ±@.@AB(r @Ax!´ÆÂ@A­¯P‰ß@Aã);. @@Bq€QªÖÀ&5~U¾]À%Y2ªyà À$|:„û-þÀ#ž˜Og]À"ÀN‡>ýEÀ!á_½P×À!Ε ç6À !ÇRwjÀ 9ÊâÀ¾Ðä|¾RÀúÓpV;À5­á4SÀof_Û*À¨:wzÀߊàþÀéÚ½ÀKu ˜¬@À ÿÊ8ÉoÀ f¶6Ó+ÑÀ˼GagÀ.êââ¿ý ¡|ÄØ”¿õßù¢)œy¿í7ù+ă›¿ÝS$·Z}»¿dýa·mV ?Ý ³³8.?í%¸›¯†?õå¬.•~O?ý;ê7Ïð@Iv+ØC@öŒÇ¬Üÿ@ ¤»öh‘@ SòŠü½ @‚Ÿ–FQ@Z˜Tš»Þ@3ŠŸ‡/@ ݪQ®Â@戓](>@À‚j‡jû@šÂ4Šl„@u>ëÛ«Õ@OïúÐÕ@ •epa°‡@!‚ãõàí@"pnÀÙÁ@#^>ƒÀ@$K–Ûv²î@%9+{Ò/@&&¹"©³Ÿ@'<¥ûk¼@(°ûýŽ˜@(ï•z­@)ÜYæ&ü@*É…eJüR@+¶ŽlÛù@,£sáø^k@--åå œ@.|¹&Zxz@/i6RYŽ@0*˜Ø&Û@0 ‹C…¹@1]:1h3@1Œ nm@2˜yæ¸@2vý\zQû@2ì9£+e@3aK<`Ýú@3Ö0÷Õí@4JæC£™Á@4¿k¯´ÜD@53¾k;u—@5§Ü†A7@6ĉ–@6s?$În@7è!ês&@7v îd²º@7éÚ¢ú[@8[×$ßê]@8ÎQ«îz@9@‡öhŸ@9²z#ÎjÕ@:$%ýOþÉ@:•‰ëúùD@;¤b6[p@;wsÛ‹A/@;çöܾa™@Ùˆ×@>„t´M!’@>òº =«±@?`¨csŸ@?Î>šÀ±[@@½ÊW½*@@T/¹í@@ŠrÉ Wa@@ÀˆHÊ:@@öo"ñìé@A,&â4è@Aa¯!†ò@A—Tž–$@AÌ/3ø x@B&RÎr,À%è|Õ”¹À% D6AîÀ$2öpêÀ#Uå™TÙÀ"yP«µ°À!››Çq¸6À ½‡Ñ3À½«ÌoJ›Àÿö÷kìÀ?RMtxãÀ~f˜]lrÀ¼XÄP_Àù.àf½†À4ï _ ÀoŸÙ”0ÚÀ©GƒÊ,tÀÃÙpÊTAÀ 3,c²k(À •–!6}À "ý‘öéÀuâÍÎHZ¿û»Æïp¿ôˆgMŒ ž¿ê£‰ x`¿Ø_ó.òÀA?²Mï]À?àÉ ´c£û?ïNzgb?öì'ýx0?þ3Ô`Î_l@¾óê’‰@e ¸,Øÿ@ _ûÎ}e@ ´ ñ –@®éW„f‰@ƒòP‚{@Ybb@/0Èe»T@UgoÏò@ÛÇ;3ñ…@²}z@Za@‰oQ=/@`“ä/9^@ ›ñ'Þȯ@!‡¨Õ<ìõ@"slƒJÉ@#_7¸‹“@$Kûª“@%6ÒÒ þ3@&"™ÁzÔ¾@'VP¤M«@'ú´¨g@(åžqf/@)Ñ!²Ñ&@*¼‡’^|Û@+§Ío´œ@,’îKí6@-}åÃX'@.h¯}·K@/SG#¹Ÿ©@0Ô4Ò—k@0“焼(@1Ûba'ã@1}­´ JÀ@1ò\d ƺ@2fåaî‡ @2ÛF¢~/œ@3O~ Ò@3ÉÚÛÔò@47gÙûŸ@4«'f@5’×Û*#@5‘ÜFcÄ@6ïÏò'à@6wÌ_´Ôà@6êoã¿ÌÎ@7\Ø’ÏÝ@7Ï«[eí@8@òs¾9¦@8² :c/O@9$ Uëci@9•5%S#|@:‚­@:v¶†G•Ý@:ç ÀW½@;W*5å@;ÆÙ!Há@<6MÇI:û@<¥t½aàü@=LšY‹s@=‚Ô ]^@=ñ Îå·¬@>^ì Ä©a@>Ì{N,•%@?9´«¸ìó@?¦——s&Û@@ ‘|jö_@@?ªàg%‚@@u—tÝtð@@«V»´®¬@@àè;ˆÌÿ@AK§Í6@AK€ ¢9@A€…™_MÈ@Aµ[œå'e@AêÀ„X÷À%œ¢¤mVÀ$¡&dÀ#èu¼“"À# ·PXŒÀ"2WÊBïÀ!VY©«W*À y¿€ã³:À9ç3TtÀ}ƒnò‡ÀÀÇ'Æi¹ÀèÊüTÀCîß>cÀƒÝÄ»UÀ»â6*åÀ­µ2À=aÖΫuÀòk³.t7À h&¤:g“ÀÜ÷¥ÇÀN aÞË“À¾PÓ”&¿úYÀðeÛ­¿ó3‘ik£)¿è`—t‡¿ÓvìöGÆ ?Â}ŒÖî§?ãäµhV?ð¸ìúáÎ?÷ðF¬¼‚?ÿ*^FE´@3{¬•-@ÒÌ}áÿW@ s)ÝÄï@ƒa“`P@Ûd=¶ø@¬ô>/q@~éKW ü@Q:ð ·T@#àª&"@öÑë#2v@ÊlM@t•i{è@q±L o@ ¢nÞÅ«@!Œc#>Æ@"vcÝ™X@#`k™—=@$JvR,6à@%4¥ù˜Î@&ƒ3Ô2Þ@'|›eô@'òg}Ê'B@(Ü?~7,ï@)ÆB”N@*¯¥tiy@+™*Àî@,‚‹×ù›ž@-kÄrçÖö@.TÐMoÌ@/=«*Œa’@0(jƒ@0‡^Ðã@0ûuí9®¦@1olyX4À@1ã@'ȹ@2Vîòü¯¾@2ÊvÚƒô@3=ÕãB@3± ¹y@4$ˆ=BÛ@4–êK4òË@5 ’}Ps’@5|AÁµ@5îIÂq‹ó@6`U02ýZ@6Ò(Âôt]@7C¹îÙ³@7µ![Ò„g@8&Böñýr@8—%áj‘a@9ÈyJ©î@9x)$µí8@9èFRÜ@:XwïÉE@:ǰ•™N@;6ù²­ü@;¥ùß”êL@<¯5gÕC@<ƒVì1@<ñ3ìt†q@=_¬NÙî@=Ì}RsùO@>9¨¤Â´R@>¦r3bæ@?’ߣ=@?6èŽ@?ë\ä@@+JqSÑ6@@`à<=•Ï@@–I‘Àá«@@Ë…ùh®@A”ÿPªØ@A5v4!ª®@Aj)- H˜Ê@'¯1?wô@'êÚï ô@(Òô57š@)ºö¿£‡¨@*¢ÞP>jŽ@+Ц¬ ëý@,rKœ{o@-YÈïé:l@.AzEýè@/(<ž€T@0”ÑV¡†@0zú @0î,ÅB#@1aH•ÖÍ@1ÔBïƒfI@2G/»n£@2¹É`?<Î@3,Q@ZÅ@3ž¯ÔW[;@4âF¾ò«@4‚çP'@4ô¼<륄@5f`KÔ„@5×нœ2á@6I uy\v@6º{^O@7*ÞÐÓ@7›p– ˜@8 ÇP»Q@8{à¢û8î@8ëºò¦µ¼@9[T¬ætã@9ʬFÖ @:9À=£ [@:¨©ÐA@;_c+@;…W®^ûœ@;óN¡–‡@@<`úàE¯@<Î[Çô@=;nk¨ê@=¨2i[#»@>§ Êp @>€Ê»q˜@>ìœY䕌@?XÉ™7@?ÃD÷ìÎÇ@@ í‘äÍ@@LL96‹h@@_âïÆ¼@@¶Gs;¢ì@@ëw}N@A±âƒ@ASñ"ü ’@Aˆ#û‚@A¼(¦z²ñÀ%¨S˜s/À$.ö IÀ#VÀ×À"~Þ¿ÃßÏÀ!¦b‘ÃìíÀ ÍMå¨OÀçFwkÈÀ2ÊH±ÅùÀ},ƒ¬HÀÆrŒ³G9À¡ék>ßÀUÀ@ïÒÀ›ÓW.cÀàá d:À$ïi¤¤Àhº÷3ÍÀ TN©¨iÀ Ö¹ úñÀWYñþÀÖ9¡ò¿×¿þ¦Ñ|ž<)¿÷è’k¿ð‘ÒÑ2å¿ã[„º¿Ã„«‡çÜ”?Ò‘dðô^½?çxÿÌO?òÖD8ÀÛõ?ùóíAü8@‰g@á@Ÿmèt@«ƒ§Ú™q@ >Eå¤Êq@ÑùšÎ8€@3GtE;^@ýúè¥rÓ@ÉjLT@”{ø/¿(@`9R_r@,>úFŸô@ø„´5~¤@Å;š.@‘¯D#äÈ@ ¯A½sß&@!•»CÃ0@"|@©á @#bËÖAQd@$IZ¦¸‚@%/çב!·@&o¦çaÂ@&üí¿UªL@'ã]ñãÄ@(ɼ†½Ð@)°ó¼ï@*–1qJ @+|@eÓTR@,b,²l¼€@-Gò<'ÐŽ@.-Œí£ó@/ø·g6¤@/ø1i )@0n™»Mfé@0àý7·@1SAD,ƒá@1Åcë«b@27c=³ @2©=N„¤­@3ð7[¹@3Œz©üó@3ýÙUz'@4o Mé^í@4àþÏl‘@5PâXƒO¶@5Áƒ–ÄÝp@61ðûÈv@6¢(Ðeñ@7)dC@7ñ @7ñ~+fÞÖ@8`Ï!~£ˆ@8Ïâ\ÄÕ&@9>¶QEgN@9­Iz½[@:š\¹1•@:‰§‚±QÅ@:÷o€$^S@;dð𯀤@;Ò*x$¨@[Ux=´­@>ÆtJþ ì@?1A‚{³ñ@?›¼îØ@@ñtÅ€C@@7Ú‰Öª½@@l˜Ë×@@¡+Ä<¼Û@@Õ“Ëð5@A Θº<@A=Ü“TÄ@Aq¾ªV;@A¥rFy¼$@o-²–-@oÕTÞ€2@o…óp¼@ní:R°ÿ@n؉†È3@nÄçáÁ@n»f9›@n°º-°Ž@n¦È¡ù @n ßtˆa@nŸ­Ãû@nšÉ@1H@nšïØI1@nž9~ÏÜ@n ì—`@n¢<Ǿœ@n£¨È“N@n¥@" òá@n£¥ñ© ¾@n¡Q`WÉ@nžæc¶0@n›ôE·V@n—!’Ui@n‘lß.ýÊ@nŠ^©¨@nSüýeÍ@ntí—`P@niÍÉÍòh@nTQ54‚@nB|½YiÅ@nRkißG/@ndMý€&@nwEÎ@«®@n‹”*”¥r@n§”S,P@nÅ |T°@néwgW1Þ@oFª÷V@o=dŒ´G@olʶÿ«F@oŸNòLõ¯@oÍbÛN!@où<Û9È @p³=Ü@p"½ßÖ@p0Àü÷@p>¶ûç@pJÝfú†@pTKL®ú@p[XÝ{^p@pZÜ›ah@pWçŸôåà@pMªÈµ”]@pC}’ð@p<&@÷s@p5–ZŒ<@p0Îkü×v@p)gh9§ö@p ä!–RS@p»¯ã@p¾’‚à¸@p§è%1ö@pÈ2ÓG@p¼—,Nz@p¤™‹lµ@p`¸­¥@p!]Fs@p$Aû^ì@p(Ã7BE7@p.Ò«@p4žö54@p;%¹TIA@pAÚ£çí@pHfŽ„7È@pQô^êÊ@p]uæÒˆ@pf÷xÄÎ@piæß š@pl`ò-Á@pmJ-ƺ/@pmÂýêàˆ@pnOÀE6@pmG^2ç§@pjS v`@phÈFÍ»@phé5|lò@pjÞZzm@pm Í…@ppô—­p@ptÊŽH<®@pv¹V@pyPÍ}h@p{òppy@p=«0ëB@p‚À‡‘¶2@p†yœÉ3@pŠˆš*¶©@pŽÞù'*]@p“U °ßa@p–ã»Cî#@p˜»[â$Í@pš„Åû·‹@pœpÓÚÅ@pž~`¸sœ@p ¬Y˜ÙÖ@p£ Cîa@o'4Éè¬@oFædÃŽ@oZáyÙŒ@nñ›GÈŠø@nݤãã°?@nЯ‰O.”@nÃÓiéýc@n¹¾ò¼I@n´%vµ]@n±0Ø5v2@n­ú(½‰@n®C¬®é@n²Fø9@nµºQt4Ë@n¸_Skà@n¹Òr*¤µ@nº&rœ@pájáQ@p'oPÿ\@p9*‚kŽË@pG¼ø @pU¢¶£/»@pb(ÛÒˆð@pköfWÕ;@ps1ëgž@prÀbïk@pnß«‰óˆ@pbݤԇÖ@pUR ¦Øl@pLŠ·d@pD §_x@p>Δ«Š@p9 *Yêü@p3FÐqÂ@p/ÃWÙvÞ@p.T;Ýà@p-5`º@p+oJ×D@p)Iu~@p(OÍИ@p'å±ÿzR@p)Êuòd@p+æúg³@p0£Ú Ë@p5—Ä–‘å@p;Õ¿[ç€@pB~@½p„@pI&Ô(w¶@pO£H먽@pUøÅ›¥ç@p_ò;r02@piOIDd@pom¶¬q'@pp`¸+ @pqW¾7L@pr©Ö]@pr¯°íWÏ@psV…¢çù@pr‰q¹ä@pqLPñb@pqfêg§ð@prùAˆoµ@pudz–@px¯Âñ¹k@pzi“£¥@p|bÕëì@p~ÆòSXW@p•-WG@p„Ìx†º@pˆQÈ æÖ@pŒ ¡t@pû)’±š@p”.`86@p—ªz‚`@p™h¢Ÿ@p›‡ˆÚ[-@ph-õ‰Š@pŸP Üß@p¡ZoàÜ@p£„ì©ÿ@p¥ÎôsT¸@o*Ò®áB@o´Àä@o ÕÙB|Ì@nø¼l±à[@níÏ+‹š@ná ï²:v@nÒf‡Å3«@nÇ[Rls@nĮ͂¨@nÁÂî%÷o@nÁS"à@nÆHEw*@nÊ3ù½¬š@nÍÞ5 ê@nÐÉšéý@nÒ¤‚VrØ@nÒ±„ÛSC@nÐ9ŠIt@nËúö9í@nËN},`@nËÕupY@nÊé \Å>@nÈgJo2@nÄ•*g7Q@n³v¥¦@nŸº¤d Ö@n“|JÈ@n‹…¿Lý@n˜µ -@nŽ£aO@n›ª_“Ö@n«Ú2œú@n¼q¶5Uö@nÕ{À1¨â@nïÆü»ü¹@oãZ?.@o8IÃQ¨@oh9 ÝO@o™œ?8f@oÏ9D¥š@px¤Ï @p Ó««0@p-*5èW‘@p?â„dŠ@pPMbYçê@p^´â¸l@pl’2Ä@pys·P’n@pƒŸÿ’¯@p‹?/w#@pŠËëÑ©@p† .@é|@pxɺ‡v@phiõ(»@p]sýß{/@pRסz:D@pMÃ@Á>@pG3K»ï@pCõfÿ@p@ŒMr@p=Ýy`&Ý@p:ÿ­þ¤@p7³„­¥Ý@p3Q–~¹N@p2½,Ž@p0ò‚sD@p2J"+[š@p4}uo8Û@p89ê0K @p=eéñ%d@pCÀ Ø@pIÁÆíêø@pPˆqÒÙî@pW‹\à¸@p]O´º@pcÙÍ_Ñ@pjï(®ts@pq) –æ@pt?c•Œ¸@pu9Æ0´À@pv7àßæ@pvõÊ<‚@pw£½P6@@pxct—A@px5ö‡ˆ’@pxmÛÓ@pzLgÓŽ@p|:¢Ž½ù@p}´ÔI¡f@pz]Lz@pˆ„Ö£ü@pƒ÷?ß)@p†ÎôÐýP@pŠ Äþ­Ô@p ‘2æ^@p‘^_²ô@p•P#…#§@p˜vèö$š@pšjû&v@pœ^ÿµº@pžK"‰¨@p .ÁÎL–@p¢ €dÅ@p¤ pQ@p¦5ˆgÖ@p¨|²ŸG@o39SÖ‡@@o$+›®~™@oÈ‹ªø±@o Ò1U”@o=ühž@nó‘ #]v@néõw@nâ{D@n×jÏ« @nÔc=÷Ü@nÙ6“ÃÉ@nÞ[†îSÓ@nâ¾@nåÑõþùs@oÃÆ2º`@o‘5Ú@oAìŽ@of»rª@o–ƒTáâ$@oÇ]‘Á¥,@oüÛ"ûà¤@pþ?)@p.Å• óñ@pDÜG·O@pVlSt@pgj­+ n@pu©ÑgY@pƒ…]2À@p¾Èù$ @p›H·®@ì@p¢Ùíyò¬@p¢ø¡ò^ì@pœž\Ÿy~@pŽ) èOU@p{Ñùõòr@po{9r@pd[?ÿ@p]¯QÉ`,@pX‡'äµ@pSàxÐß–@pOîÔrj8@pL¯|Õíü@pI’p™@pE1mr­¹@p?a±ë@p;½ÑXè@p:¤ZBÇB@p:šý%Ë@p<÷®«GÊ@p?Œ¯³¥Á@pDîÆ–Üë@pJ„3oñ¾@pPñÌ­Þx@pWÊ Ä @p^ˆ€òV@pbíèï.Ó@pgDB_„Ù@plÁnN˲@pr„.—ì@pwlpK @py'ËIÀ@pzóz@p{kz”Å@p{ØAï@p|ŸO¿Èx@p}vÕí8@p~Nè¢2,@p+‡@p€Ó_¦b%@p‚^ÚõÙ@p„0ªò@p†KHuÄ@pˆ«xÅ»@p‹êД@pŽÔõMâ‹@p’}8¼›ò@p–qM´­@p™Qp~@p›=§ ê@p0ŒÛ%€@pŸ(Q¾²@p¡^©Ûì@p¢ûð™ù‰@p¤ÙF 5@p¦®R§@p¨¿s {q@pªë¥%Ç@o=’=r:@o.¾ÿxð\@o'®-£-°@oí¢òa~@onùÌ-b@o X2Õ­@obù.@oÿN®É†@n÷,ò¤¨/@nómk݉§@nò3_/hx@n÷7p¿³+@nü­•>åX@o`âÙ«@oi›v·@ou ŠÒ@o<…úü@o~ê?­@oT!œõì@o)`#^E@oáÊo…@o^-ê/Â@o¶9û_s@næ[cÇ@nÊ U³,%@n¼ ÐfoÒ@nÀUhjHÊ@nÀ¶ Ì]@nËÁOϬÚ@n×.;™s@nçÕæäœÊ@nùÙš9ø@oðͤx@o,;Ýø¶V@oJïÅ @onå #}@o–)â·£$@oćúZö@oóVV«¤Â@pytÆ>@p*Xf±ñL@p>Ò2Jä6@pRs »Š@pc¿×¡$Î@ptòY4u@p‚[yËL;@p9ýe@pmñu”@p¨ä—¡y@p¯ÐÕ}aö@p°d¤r ’@p©ó̪¬@pßšN;@pqJ×Eq@p€¹ I2@pv»"³\@po#|U•Ÿ@pi(Jô–@pd¨‚¬@p_¥Ïçš@p[©éúÈ@pXP ã’y@pSÓwšÔ@pL¡Û¨@pE~¹t @pD]¥êWC@pC/öqk”@pEEMÔ@pGé—÷ôñ@pL6㟕"@pQÿÉèâ–@pXB¸é@p]Vþ\)@pb{Äø³™@pg!`²®¸@pksÖÓ\ò@po¸„2ì@pté˜l @pykoåðæ@p|çbÌ—œ@p}ììOt@p~ô7ÜÂ=@pön,@p€Ä4€®å@pŸÛ»F@@p‚“d¤Ô@pƒÀÓ¯N–@p…"·#@p†¶ù §w@pˆßa,Ú@pŠ·­o£@p$†:ÞQ@pÖä£×@p“)P`q@p–Ü{€í@p™Ë,¥Ö‚@pœ Oí@pú©·F5@pŸïôb@p¡é‹l1‘@p£éË¡@p¥ÐÖª @p§¯½ü\@p©‡ñ, @p«LÜfž@p¬W ö‹@oK©ldäÕ@oD[·DÎó@o=tœ7@o4ú¿üÈ@o.5…Ý @o-AwKÝœ@o)˜•h$@o##æ›GÞ@o! Ò¼´µ@oòR–DÚ@oš÷¹^=@of6zè@o¬{Té4@o¿aV<8@o!?l9Á@o$1 Ž‘@o%¼Þû•v@o'irw$P@o(ÇÙVˆÐ@o)+˜µ†@o(wk@o&­7­yÖ@o^O =@n÷ŵI @nÔÁ‡>ð|@nÕÛxz]¦@nÝÿ•jÌÔ@nåvmGðò@nïÿµ®å@nü¦Ð†º@oä¤e\@o!_×À< @o<@€!ä@oWáß%©’@oxâÝ„@oœJpz±d@oÄ›~¡Ë|@oðÏ4Ф<@pغøA@p%Ì0rFÆ@p;B")„@pN„ñý|N@p`™ð­[@ppâ×ç@p€:eÄå@pŽå,Ï@p›­_»t@p¨ÍoL†Î@p³Íxó@p¼$ªÐ@p½Òsº6°@p·KÔ)Â@@p­ {W§@pžŸ³Ëf@p’2–S0Ó@pˆÖžàÂü@p€¹¦¢)ó@pzn@¬K@pt~4Ü&×@po ©LþÏ@pjÊVy6@pg6®@pcwpgñ±@pZý€r¨±@pQå–ö@pN3ßq@pLèºÅJ@pMid•æ@pP3õ±Ù@pRòíæAK@pW®B5%ø@p\wL„@pa|¾#¨@pf„­Œ!ú@pk^ttH(@po°~›¢@psñ6êÿŽ@px@ ƒD@p|\ ›¦q@p­&Ñà-@p»ù9!@@p‚ÇYý¬@pƒÕä4ÑU@p„º²Æí\@p…’³ÏV@p†•)§Ö@p‡ÃßVäœ@p‰3Ôï†x@pŠÕ¤L”@pŒ§š¤;x@pŽÑMEµ@p‘KyÏñ@p”ç–ó–@p— N­Ž¬@p™¿ƒþ¶ê@pœ(^@pž{BÖª@p ®[1R@p¢¤d¸§þ@p¤ {Z4G@p¦¢mkÔ@p¨ª ÀVç@pª\x“¤@p¬Tµ»+¸@p¬ú8>©ä@p­Ÿ«ƒMy@opœ÷Át4@o`¢¸@Àq@oU/ú˜ƒæ@oOV c~@oQ’»ˆz@oQ69rª@oN+î ÉL@oM¤ÂD–N@oMU:Nø\@oJâ/a> @oDáT‘.@o<…ŒSí@o7ǪSÄ@o9xØp@o>˲Få@oB¢žû?V@oE…¯:@oHY8ÊY5@oJ?Hôá@oK85g z@oK3_Û@oJ 6c¸@o-Õ6RR^@o AzS¬@nùz-kð@nÿ< ¸G"@o+<1þ@o z†i¥Ã@oºš%ò@o"øà;@o6Jžj¾9@oK…‘-@og½“™F@oƒÅYyø2@o¦s9Ç@oÉSb¤†8@oò#iJJ2@pU ’3ö@p#Fé2>l@p8s§g×e@pKËDë5X@p]äÏ‹©@pnˆr(™@p}ÙÏ=@pŒSIê-@p™ÑÔ*­Æ@p§ K}’:@p´,ç_Ì@p¿ríaGØ@pÈ?è&@pËBEyÑ@pĦ˜­à®@p»ãAQEð@p¯Ø›&@p£sòX†@pš²þ¤<Ü@p’oà¤ð×@p‹×A¯D@p…(*Š¡\@pÛ ‡|J@pzOcZnž@pvAéÏ.p@prLÿâ@pjdÅÄ[@p_¤¼3šÓ@pWåÛS÷@pV¨Íß{¶@pTxž+U*@pVNž×òŒ@pXa2ÏÁC@p\…X¼ð@p`ì²Ì€ù@peÔ3ÃI@pj¿ÝǨ¦@po~oŸäª@psù¡ùöö@px6솗 @p|ghÿT@p€2Q œ“@pƒ!Þ1=â@p…P¼€Sd@p†ƒxU›)@p‡bnsj@pˆX¿ìû–@p‰Qí4ë@@pŠcÅMh@p‹‡€ˆ@p x…¾¾@p޹.r½Ç@p˜‘å4 @p’¦8h@p•#¤;R@p—២ü@p™ÿr°_ª@pœ4A A–@pžœÕÞSÒ@p ï— ô@p£-3Š]Å@p¥P߉´à@p§N­6ð»@p©RX¦F@p«[´k² @p­PýDñ5@p®VÛËu@p®¦9™×Œ@p¯LËÞü@o˜Y‹s P@oˆ²yÑ•@ow¨42Ó@ouüx®ž@owØ\ñyL@ox³ú@oy:7ÄÄÒ@o{™ivN/@o{ìpCVæ@ox ¢ã }@oj¿ïý’@oa Þ9ë8@o[*Y%NÀ@o^g(Üðà@o_«e©Už@ob³°ò<ê@ofì¥Ï^@ojA¬­ÁÉ@olµ³=:4@on^÷ ÿ@oo£Ô‡@ob`9ä@oCÈË9æ@o$3Ò5 ¿@o$ó›3b@o+jÜaï–@o1›ª¸x@o8`§q!€@o>ÙÒk3L@oN8v"úÊ@o^—sg„@ovÞª„™@o“gÛXÔ§@o±zI`š@oӨฟÝ@oö}Jô£@pi„ïöÀ@p#ß –9‹@p7¯kTÁ@pJ|g(P×@p[û k¼@plø¸@p|Bý mì@pЦ%_@p˜`Â-ˆ@p¥€¶=–@p²’E‡’+@p¿Œ©¿÷ù@pË>Ëã¥@pÔaÊÊGf@pØ´RÎ;â@pÒF¹9Å@pÊCFܱ\@p¿o®þˆ@p´”svS@p¬U1æ‘ø@p¤Mz|@pad§‡½@p–WË”I¹@pQhê¦@pŠ\0«¸@p…qŽáé@pF]”Bn@pzÄ[Q½@pl–/üûÔ@p_-UÌë@p\§ån_·@pZÇí¥K@p[V¾]-k@p]©É¨Ù@p`dÂuyÉ@peO÷8x«@pjGŽ7G@po*®˜@psÎ~¸Ž@pxGÍ™rú@p|ˆ«áÀÛ@p€µ®«@p„Ö/|eV@p‡qgPÏ@pˆ±€-K@p‰×ó*w@pŠÃ”HþÇ@p‹Å;Ê@pŒÜ¢ë®Â@pŽÆ³à@pI’+÷/@p¸þ Ë&@p’d#l{@p”QD’-Ý@p–lº‰þ@p˜@ P@pš‘èë y@pœ³û­åÒ@pžägž@p¡'ÐÙÞ@p£z<àÞÝ@p¥·¥ ä@p§à®fD–@p©ô ´’@p«ùøÛ°_@p­ÈVŽAÿ@p®Ÿ¡Z“Â@p¯•k~x_@p°PöÇŸÞ@p°÷7 ï@o”Þêkœ@o³E¦æ @o«¯Œ9½@o¥½• Æ@o¡ @o£Ò-F{=@o¨ÅïnäÇ@o«ÃRTì@o¬º:ôÀ@o›øùfX@o bV°Ÿ@o¾¶ÚVÞ@oƒqßÿ@o‡W3ÂÜ@o‰—“hŠœ@o‹"ðm`@o‰ïZ·¦@oF·‘@oDD[•@o’’‹nõh@o“åé¿ûü@oxwÆR@o["¬˜>@oIH”ûœÚ@oQ3j›|@oX[[Î\Ì@o_y¡5G@ofx£oÐ@ooðͧÕ@o¨tå@o—ºA6@o§Šs2è@oÁBå•ò¼@oß/™ã&w@pE1º+@pôç…Æª@p%]"@p8•ú@pJ»/±¯@p[ñÓ" {@pkØZijh@p{ÄŸ …~@p‰Í˜°CW@p—Mm=cÔ@p¤a¦D:@p±(žK‘k@p¾´ÙþÞ@pÊíG_C@pÖ¨ñ}”@pàxÉ'4F@pæ(ÛÏ^w@pßeˆ<@pØAÒlPd@pέòÿ<"@pÅnõ)V@p½Á»Í@p¶F²ËÖ_@p¯ ½5W@p§º±xÊ@p¡´û‘@p˜{¿?µÜ@p#—hèm@p‡9¤i l@pŒæCý­@prÎUÑn@pgAx§µö@paõ‹½@p`˜¬@µö@p`V@pb¬LàQ@peußFþ@pi¢x™<@pnªÎ¸@ps½ÉûÕ”@pxLbH€@p|¬afÎ@p€åúv˜,@p…ù³@pˆS ¿{@pЦ~u:@p‹ÓòÕL@pŒö³A±î@pŽˆKR@pj×%@p7~j×Ï@p‘o7ËY@p’Æë/q@p”DÈ÷¤ @p•ç˜Ý'@p—ÔÓÖg@p™¥l=ž@p›_†Ë®—@p/—½û@pŸV ð}@p¡ŠÀÓâµ@p£ÍI¶§×@p¦€fÅ@p¨W‡J,@pª€N-þR@p¬•o)@p®7q5¾@p®ñæ ð@p¯ÉæÙA[@p°Á87Åò@p±Ö7±"@p²¡18w@oï8ãý®ú@oå¨`CrŠ@oÞ«4Äb@o×ϪŽÿx@oÔJ2±ˆ@o׺ïh @oÚnôËÛ@oÞ ¹ýí{@oÏ2 ¶@o»ªÜî@o«/ž£Œ @o¦%©vX@o­4g"£@@o²`†+ùW@o¶ç3ù_@o»¦oòN@o¼²¤)@o¹‰`¦ç¢@o´øC–sþ@o·Æ%@‹°@o«oó„È @o9Ø÷]@osГ%ï²@ouœs›¤±@o~/'mÀ@o† ‘¢Yv@o‰(so @o”ÀÀ›À:@o¡eï”á,@o°³Ÿ7X8@oÁÜÖdŒ@o؃݆_*@oðCÜíØd@phFÀ°Š@p›D’]Ã@p&–DíI¤@p9®HxŸ@pKG"Úv/@p[Éø©?2@pl½ødÈ@p{i¡O@pŠOó²Õ@p—+ó€úÜ@p£ÑÓ«®Ê@p°Y-Áº@p¼Êdês@pÉtÿ¦½Ç@pÖNQ…ã@pâ:×Nêó@pì…,,D³@pó "÷8]@pìÉ-‡YÆ@pååè–@$@pÝÜÆ´Î@pÕ× Ž@pÌBåÂ,5@pÂW†íÕ@p¸(É~×@p­zþ‚@p£ŽêD@p™eWeOÂ@pÞÆöàB@pˆVµý3@p 5&/@pw†çn¸"@pmÇl˜•…@pfÈü†»¼@peìp›×°@peuŽÇÞ@pgmy`á4@pjrÄ2D@pmä S4Ñ@prü3»–@pxÉy¥q@p|õ©¨bÛ@p<àcZÆ@p„®ü¦L½@p‡°õ$z@pŠ”Ò)„6@p[ÌÅ+)@p©¯@p{ q@p‘3òц¢@p’JN¨¹Š@p“wˆ•J¯@p”¹¢•b@p–£íù@p—¤«b@p™QC[@pšÃj#Œ‚@pœk‡8"î@pž*ñ²S.@pŸø‘¬O¼@p¡æcl¬@p¤€—w´@p¦f[°AL@p¨ºÞ"Ü@p« 3¡¥@p­4޼(Î@p®¢04¶ä@p¯I'†²@p¯ö(’Mv@p°ÐúTþy@p±Ê#’Í@p²àËùTº@p´'>I:@pÿ[Q:@p tŒ]p@pÉqGR@p,Xð@pÉ,¸‚@p Z‹þ3î@p G  }@pÎßQùÊ@oìÙ2vë@o×dýpz’@oÇ’vŒu§@oÑWPÔ^À@oÙN¼~ñ+@oßkŽð²Å@oéL#ƒN¡@oð2Û;“@oóy!èôê@oíº‰IêÕ@oèL_3» @oâæÌmˆÛ@oÄ\L(q¾@o©DÂ\‡@o˜»IÄ ‡@o¢§Ó0F@o«Ýézª€@o´œ $@o»È¸;+A@oÃŵ!@oÒzÙÞî{@oábQ' =@oóX‰q¸§@p3°x@pBìÇðý@pYf1£²@p*U³Äø@p9àd5§@pJšw%ö@pZÅ…ÄE6@pj$Ï¡¯›@py¦è@uS@pˆ—X›‹š@p—‡v}¾~@p£àP·q¨@p°/àÊ$J@p¼ œí@Ê@pÇÎ/“ýê@pÓ¾B„L@pßÇkÞx|@pêýļ‰@pò¸ºQÞ@pø¶ ð—f@pñ‰\"Ä@p錰ÁG@pà`DÔ©$@p×ûLý@pÍ.-ÕV@pÃ%ÞÐB@p¸œÂC[½@p®‹Ùг@p£„ðM$±@pšÝln@pá&œ \@p‰0$aŸ@p‚>ÍØŠ·@pzÖôPf@pr× WmX@pl&ªì:@pjÊ”|°@pjÍNÊà @pkð~=°@po0Y޾¥@pr£5(ùâ@pw>û5¼ @p|r/E±%@p€Üôy°T@p„ fÿd@p‡³îr@pŠ! µ[´@pŒõqÌ,@p­„íå‹@p’5Ue/@p“PÄ·71@p”b(=®@p•iÄr»j@p–ž•”@p—ê¡Óê@p™K1™¢Æ@pšãQ)Tâ@pœvm x@pÚv`àI@pŸ}¶4.@p äN,9~@p¢·4™y@p¤—ÆÔ¢@p¦£[qªÑ@p¨î¤Ñéÿ@p«G3yÈû@p­¬ªÝêy@p¯ ¶?® @p¯°ê6¤n@p°X„[´l@p±z f@p±µøD@p²±E¿ÔA@p³Éþó@p´ÿWA(@p(˜ã¸@p#YºŒX @p8¨¶ž@p$N:2úé@p*DÄã @p-±gŒÈ@p,& (ú@p²6.@pH&JÄC@oïS`@Î@oóÒ¢±¶¢@oþw\¤@p«-J@p ‰…LÐ+@pȇšæ¡@pLרž@pñoÀ©Ó@pM}¨O@p )“<¹Z@p¦ðX@oí8_¡mx@oΊ[Ø@oȽÏQW@oÐ`!Ne@oÚ#Š= @oâN£‹ÃÝ@oê7õV@oôâ!q,@p›Bü+Á@pÝ}x»`@p¿¿^÷@p:óéž@p%¿õLií@p1yj›í@p=ð4à÷@@pLUW‰"@p[`¬h³'@piÐt í¯@pxfA™@p†Áðw@p•ž]‘º@p¤7RÁò†@p°Zšãßp@p¼~šä·Û@pÇ€ÐâU?@pÒQ¯w @pÝBßU…@pçµt)@pðˆ½Gæ@põHzÜx@pùU…ÕN@pñË;7²@pê“NL"-@pá›â@pØ/®·(@pÎ9¡öù@pê¬Ù.@p¹%ìD@p®|Ÿxå@p£ü‚< @pš«Idžj@p‘·%–h@p‰ËÙP½ì@pƒ3xF¸@p|ÑSx!@pv†23Qå@pqfëßÖÜ@po9ÙßÀ@po³†6@pp‰œðIy@ps²/Z™&@pwLì\PP@pz^X'u@p~…LüŽ@p‚µcaÂG@p†{‚yü4@p‰‰CÎi@pŒøá „@ps€ëëË@p’Ý5rª@p”«EÀÓ@p–‹gäÚ|@p—™Y骵@p˜¯F!‹@p™¬±ræ@p› x+å(@pœºNšÿh@pžL›Ò‘î@pŸÍÈÞ@p¡#bU@p¢KÔ&ža@p£Œ^8ŽC@p¥dŸd@p§JnÊhø@p©=jUn®@p«fÎ(íÍ@p­ÃÑyT@p®íÏ R‘@p¯íxÇiY@p°½Rwž@p±e“ÉDH@p²1<¯ó@p²º!*†ì@p³w¨’@p´’¶îy@pµÊRùQˆ@p?pýGWl@p:‹<’$!@p>tîœ@pG°àGn„@pN|Î }Ò@pRÆr¯¡ô@pEÿÙÜ@p5|/ÛAµ@p"çÔfÕ@p÷@³ f@p¾ýS @p¹ àvœ@p“ü–^@p%óæþ¦@p,Äð>¨ @p1°ßB@p-*À!Ö@p);JÄN@p$â`ñ@p€€;vT@p ªß  Ü@pû;Íáˆ@pÁ¢Vû@p8R,ÂD@p' ´@pk!´é@p iÀ†h@pÔ¿yŒ@pϼmº@p!̃îO@p)1AíÌq@p1Ì`¨QM@p;m&oü@pEÕdg­6@pQ7>ô§@p^Ïu£-@pkmÖVSÒ@pxo{ ðb@p…§›åK˜@p“ÓвN@p¢œ¹£©D@p°ÑŽ`¾â@p¼ËM?“%@pÈŤdã¿@pÒÜzgªG@pÜÄ÷a>@pæX‰u)¥@pï§¡ P@pö«Š¤×k@pø#i*Ã@pù]ÐâÞ@pòmqà@pë‡Ä)^Ô@pâÝ8J@@pÙ`0%c@pÏcH®¸­@pÄr¹ZÅF@p¹eÄ´Ú%@p®ìð ü£@p¤}`pãÖ@p› Qêb•@p’`1([º@pŠ,Ú¼|€@pƒêãSr @p}ÝHϲ…@pxèê¶÷@pugL˜`£@ps@x ^;@pt-2òŠ@pu ý†4@pv¾r¡Š@py˜¿¸‡@p|v+C@p€F§q–@p„‚'üTJ@pˆÆf´ï@p‹üËòÂ@p·uè‹@p’`Ÿ•@p”¨ˆR©ˆ@p—(éæ@p™œ|ž«@pšÙ=(9@p›ÚQ¦è×@p,/2“@pž»RØî@p ^ó5nã@p¡ço™¤@p£UCκ¥@p¤œQ™Ž2@p¥¶ÂÔÕÛ@p¦¥ÔQË£@p¨‡·×u@p©ì§¥…¿@p«äÙhG•@p­°.I¨ @p®±åÒP@p¯» b @p°¹/ûÇ‚@p±«à û]@p²ppQXÃ@p³¹”P@p³ÆVàd@p´s=Œq@pµ;î'ÍH@p¶wfû—í@pV$Û¦@pWAµ˜:@pc§þ6§Û@pm´«:9@puW¢½Û8@poéã ó8@pb/út/„@pRzHT9]@pB’Ÿ6Ž“@p>a_dæÜ@p:Qé¢Yl@p6eÄùˆ@p9VÒQÂC@pC>ŸÑ`ö@pK†ÙÒk¨@pJ¶3kö@pEË`\Ú@pAWÇEë–@p:'ôKïÉ@p/ìÙSfØ@p$F Ÿ¨ @p BAaUJ@p Jꥫd@p ÿ /x@p"¤"¢X@p#¡¥[à@p&5°êYŠ@p+tlÝ’@p1Ü­Ã×L@p8ÃÉõìª@p@ ÒJ"U@pGÐ8§öŽ@pPX_Lƒ?@pYyXw´@pc´¼¢ö@pnòý³;@pzÃ/LÓ@p†©ˆº”±@p’ܼdèé@p ÝuÕ3˜@p¯”',=(@p½a]¸(l@pÉ3WNe@pÕͯ%l@pÞ žMc@pç)RÁŸ@pï—ò Ú@p÷˜ÿF;@püöá¡+"@pûEù¡¨…@pùYžÔ@ý@pó%AÙž@pìk8˜Á`@päÿWt@pÚ’Ðúðp@pЩUœˆ†@pÅZJ åo@p¹ï¿c=@p¯S$ÁÝ@p¤ó^)‘—@p›GrÍí´@p’Þì]¹,@pŠ™éû1 @p„h"‹ùÌ@p~¬œ§_@pz¡c»>@pxHà5H”@pvß.ê¢@pw ŒD’@pwê¼Ñj@pxþÌë`º@p{ßlaÒ¿@p~Ã0³P@pý#êÏz@p†Cãt*ú@pŠ“/²C]@pŽtÞ¸ø@p‘zÏÚø@p”{™Ï$@p—OQ°Öå@p™ÁØY²…@pœ&m?;@pžhêÔ7@pŸò æ€@p¡UD<ýQ@p¢“›·ª–@p¤î‚d´@p¥š±ÔF@p§Aá]l@p¨C‡ wŒ@p©OÝ¡’é@pª1W(’5@pªéËÕª@p¬ BÒ@p­è~)&@p®ËÜ7`ø@p¯™\Š©Î@p°” &'“@p±‘+Q1µ@p²‚YòÐ@p³h|w{T@p´$,Rç’@p´Ðy%Uœ@pµ~cYà@p¶Sˆk«@p¸Aç Cc@pu™îÙè @p~ú݃¶@p‹cÑáæõ@p–AãÝÇ-@p˜}®ƒZ9@pr¨½š@p€~ûáf@pq–íC§¦@pjÚ”õip@pf‰êØø<@pbZ®á¤@p_×[fa@pa0Ýmî@peâ?*þ@phèêE–Õ@pc)2ɺ4@p]ÛȲM@pX±àuC@pPò’qz~@pGØÆˆB!@p? ²³åº@p=·’ ðÎ@p=Žô¥Õ@p<ðí!‘?@p=PK5Ð8@p>20Å$@p@Q@Â…@pCí¤°\2@pH«ˆ u³@pN5̪û“@pTÐýÙ9R@p\€Ä›a‚@pdŒßåÌ@plpV7Ã@puuG¤ ô@p3þ&È@p‰˜nĨ@p”„üÏ"á@pŸ¼>iy?@p­ßÀø¢&@p¼…-V¥>@pÉç¿óÞ¤@pÕ“œÕ@pá(¦@Fª@péN£¡SÆ@pñöû©`@pøÏKXþn@pÿ—uÀß@qhzÑã@pþ«’dÌ”@pùµ ?v6@póˆ'X\@pí>¸Ã<@@påbÙÖzÉ@pÛÈnpø@pÒ $ÍD@pÆ_Š2…F@pºšJó{ê@p¯¯Öä>z@p¥_î!Ò@p›[òìÁw@p“5ÀpÇ @p‹n>tT@p…¯Úë@p8ò'@p||’#©F@p{#„÷T@pyíHl(‰@py®(c @pzŸßxÂÞ@p{×ë‚–Þ@p~!EMÁ@p +@pƒ÷Ë^Ö@p‡û,NÌ@pŒU^8> @p·Ê”Ê0@p“ö!|ú@p–ö“u@p™ñ-4ÿ @pœ¹nä¹­@pŸ¶sQ@p¢mœ^…Ï@p¤SD¢j@p¥¤ªî<@p¦ÑÆRžU@p§ùCçÄ[@p©n"7ï@pªÉY51œ@p¬ •ø~l@p­ˆR–Ø@p­éRp¯@p®“ߌÄÚ@p®=ÂñóÎ@p¯!EvüÍ@p¯ÿ8ÐÐ(@p°ÇƒoB@p±z¹)Ô–@p²u pÔõ@p³d¦@4î@p´IK`Ð@pµ#E!ŒÚ@pµØ¢tß@p¶ÍØLUp@p¸t9*J@pºO„QŽ@pŸË&©@p¨©Ì*M@p³ á’˜@p¿Æ«ß§V@p·P/äÙ@p­Ù¢µÌ@p Ø‰š#@p—tCür>@p’äc™Ö@pŽt³gã@pŠ)ºiü™@p‡ªL)@p‡@U!¬@p‰}C`Uâ@pƒexªx@p{¤»"œæ@puaë]@poÛ)Eñ@pi0 Ýa@pa2ÜÈa@p\lŒ©2Ä@pZfU…3…@pXÿ5w¼@pX7ÁU—@pWïq]_é@pX&o̺„@pYŠüÏ@p[™Êá¬@p^Iõ_@paÐešÿ@pf’ô6ä@plÜA°$@ptËXöN@p{ÛûéÈ @p„û›Érú@pŽ:SQŸw@p—êïÝ’¼@p¢¶´I½@p¬KxÏ*z@pºÛˆ©rx@pÉp”<ê8@pÖe¦·ø@páìóÁT@píú„¶½@pôhŠ*û[@pûʰÿM@qÿXl+9@q•;0ÒÜ@q þE_Øæ@qPVñÁÊ@púj®bK@pôíþ3ì@pî;Mä’@p樲 w@pÜÿ}ÉOE@pÓSž|É/@pÇ€ÍKB@p»u"Ñͤ@p°tÌ`~#@p¦¹ ç/Ð@p%ƒ..@p•Æ0@pŽÓjÈ¥@pˆÂ,våÌ@p„J"Aªž@pð­üC{@p}Ô×—ã˜@p|ÑѼa“@p{ð¶i7Ò@p})Þ’@p~Ïl/™@p€^—Õä @pƒNpß_Û@p†A%3áY@p‰¨ŽR @pŽ €T@p’z7!v@p–un«"@p™Ñõ^»s@p­væF@p¡#Ô¡®˜@p£öú·=Š@p¦…0ü¡@p¨Ñ8NéÛ@pªì÷@p«4é&¢@p¬.ÙÃ÷@p­XÈÜî@p®©æ$Ÿ)@p¯ã ZH‹@p±2ž©‚@p±C™^¯v@p°ÏÖ F*@p°yÅv¨è@p°q ÷\O@p±I|dn@p² zŠÕ@p²º–Ax*@p³drÔÁ¬@p´Rl"fØ@pµ5„lnn@p¶ܧ?@p·.úàב@p¸«Ó]p‰@pºZÎâÞ@p¼=ÇЩf@pÆLrÐü@pÍb £h@p׻ĥ Ö@pئѨB@pÕ»Tu›Ž@pηW÷@pÄ/|ØF@p¿bÐ`H`@pº´\™{*@p¶%_ “@p°”ñe%@p¬`'7å‚@pª‹üëæ@p¦òï¬@@pœÐiµØ@p”o„ÇÂ@pŒÌvŠ™@p‡µB^NÚ@p‚ÑÒÈgh@p|Z!€‰@py ¦òGï@pvXó8µ@ptGåÒöþ@prâþíú@pqöáª@pq3èñS@pp ¿2U•@pqòòË“@prFžVn@pt4-qL$@pw+VXPÜ@p|‘C,F@p‚±w[³„@p‰Ó^9î@p’œ¹¢´á@p›„:@p¤óD\G@p®¯•£š@p¹­,ù@@pÆæ¥Ì9V@pÔùDóK@pá+Í5U@pì`:!êë@p÷ k—«@pýÇ®ä“@@q—ƒÊÒ@q ¨9™n@q è: T,@qÉTý@q2dù7`@pûtÎì@pô¡÷c’²@p ÒŽ@pçµN7À7@pÝîf ‡@pÔ$B"^í@pÈòª¾‰@p½€,… @p²¥Üét«@p©Jg @p Ñ’o¢@p˜(J#@p‘þAb_A@p‹³•JE@p‡n«ø @pƒG—Ãä`@p€`…j£@pŽá„›R@p~ÞJö@pŠö½y@p·¹ó`@p‚ט‚pÍ@p…|uÄ@pˆ†P]Ô@p‹t3u@p¼ pç@p”ç§R@pš犩9@pž¯ØËƒä@p¢U›{4@p¥°Kìj@p¨~‘™uù@pªäæÑ®·@p­ “Ý:X@p®°®\-@p¯»©È)@p°¤aÀVa@p±k²]1ø@p²£±š@p³Ó%€äm@p³–VcV@p³HÀƒ@p²ßYÑ\[@p²”ÆÅ@p²eBM@p²©ê(}…@p³g‡Ø8•@p´uØ@p´¥8ª§ë@pµKW—Š@p¶,Ôž@p·47¢ :@p¸–Íwv´@pºOï4m£@p¼Œq&@p½òæÜÆ)@pé?ÉŒ6@pï-ôŒ<@pñ€Héâ@pî“7¾D@pìªk[ò@péþ{Á‘@pì€Ö]@pçgq][@pâMO:{O@pÜUAGží@pÔR†•”æ@pΗ-d>@pË2:˼@p¿àœÐÕ÷@p´¸à\ Å@pªÝŒ"mr@p¤ö&Û@pžr”\Ë@p™k: º@p–%§LÅl@p”lµ¸É­@p‘™"pÄ@pŽý8#@pŒû\:õ@p‹nÏ‘c³@p‰ÇÞ@p†÷ºõø5@p…í Ø"¶@p…;ˆsq¼@p…qÔþ®â@p‡f¼@p‹©âæ:@pº£Ê@p—ž¿_S@p —K’@p¨§¯‰æH@p±ÒѹÑ]@p»*±™"ë@pņt©Øz@pÒ?þ¹]T@pß81NXœ@péÊ”§¦‹@póª”Íaî@püÄüÎ^i@q”xÍÞ@qtõÅc@q ÁÝ4Æ @q ýÄÛÝ2@q ú3I‰@q6 Oô]@pü…¼zÉ@põ™ÈJÃ^@pïg[ \@pèï+²&@pÞµh²ÞÂ@pÔÙ¿Â# @pÊ>VÓž@p¿V^‹µ¥@p´®Ð«éu@p«¯Ïé:î@p¢ÖO@p›&tÑê@p”òêÀð@pŽíB&Íî@pŠqÄ!#ç@p†{¡9¯ô@p‚È2K:@p‚&‹RÜ’@p¥=¹à@pÅ<)XB@pƒ†Ä副@p…j›U:4@p‡ÈyûTo@pŠÆâü @p6rJ5@p”HñY€ú@p™ðœ˜¥È@pŸB$bç@p£Û¯¹ @p§Lƒ+ =@pªsý/®@p­J`ëcr@p¯ˆúæ@p±‡ q@p³F/F$§@p´dÃñù@pµ=Ð3ç@pµô•cê@pµÛ;=@pµ“|œP@pµQýî ÷@pµŽJ]„@p´ÎJJ¾¿@p´¼DtÐ@p´iwµî@p´`½þZ—@p´×üŒÂE@pµ{¨`YF@p¶ ZK°N@p¶€;‡Äï@p· jÄ5Ò@p¸&rÕÝö@p¹œ  î@p»i‘~ò@p½|zoO@p¿pÈ_Í@qÅ4ÿ¿b@q Hݬø@q¾õ[@@qñG´@qåc@V@qFâ›"@qÏÕB•@qâu›úÏ@q ²Í]Ω@pþûy¶n@põG&&@pî@Á(žC@päÁC];>@p×Y| ?ò@pË0®¨K@pÀÿ:lJû@pº´Ž}=V@p´Îw—$@p¯cT+:@p¬‰f@pª6±ì¯ñ@p¨o®¢z•@p§_x +©@p¦‡¢óͳ@p¤+Tà)@pŸ°‚|žœ@pœ.'_ľ@p™y¾–Ìß@p—¬˜›‡@p•˜Ð hö@p–Ÿ>Ç-L@pš,OšAá@pž5è%`@p¥@Õãp@p­eÆ e7@pµ¯g óu@p¾Œ%WÉÜ@pÇ‚Õ^ï;@pѤç4"#@pÝO ò@pé6ÁÑ@pò(2I›a@pú¾þÞy@qbþcko@qK¤t“Š@q DÄŒ¿:@q ÏÏeL@q´ejŠ@q ãÃÖœò@q$Èþ'¦@pýy UAV@pö›¶ÄJ@pð$Ïd'@péiyI´@pß_éz@pÕ’–<„@pË\)Ér@pÀú¤ö @@p¶Âî x@p­ìÂ̈‚@p¥l±wE@p‹úBš@p—³ñùpq@p’Œ®r@pU6çëg@p‰Ž§Ðð@p…ã}îâ@p„š¼‰4%@p„G‹è\Ë@p„ ù@p…Çñ\Ã@pˆÇçFÕ@pŒ}í¨ˆ@p‘'úÛÂ@p•Ÿ¾‰@pš©çT@pŸRÙ‡½­@p¤^ðƒç®@p©ÈÛD†@p¬Žô3ÒÙ@p¯ƒ§Õƒë@p²2-€Ò’@p´ošÈ£@p¶FðõË&@p·àí±äM@p¹/ ÏjT@p¹‚(數@p¸® áp›@p·ÍQ'ä@p·Dwbm@p·úLíJ@p¶Í{˜îS@p¶šÎ«F@p¶hŸ«Ò@p¶N`hð@p¶OéYŒ­@p¶lš@p¶û“ó¼@p·^:e–?@p·’ü`Ü@p·ÉaBê@p¸¹"x¯<@pºC9§Î@p¼#Ÿ[ÏÛ@p¾XKˆÖZ@pÀ¸RТó@q$úôÛÙ@q!=Zêê@q€`ß4‹@q)› k¹@q}`5Þ„@q» G'i@qrSÁ(@q­¨1Â@q¼¼H@qÚyb°¾@q5eÙLæ@q `5ïåã@pûÎ2àN@pímªMÄÝ@pàEÿ @p×›. ¯ª@pÐíz/\w@pÊ¢}Ö.@pÅ·³ýU}@pÂJ o'@p¿aDŠÊ@p½ ²P¶ˆ@p»Þ7/@pºP—@N,@p¸?³%@p´åàãµ°@p°R“Š“@p«Ôv8Ãñ@p§ÎkDâÉ@p¤·sÄù@p¥’¯QûO@p¨"òÇ?‘@p«,qìì×@p²¼,Yé@pº’¬,Þº@p¢@Sf”@pË!¡â¶@pÓº5¯í@pÝtÒ"÷@pèTm‹r@pòöÒfMµ@púHh Æü@q —½¬@qå3N ò@q îL:@qɯï@qÒÁ´@q8½ä14@q Â' ;@qÿÄ›ñ@pþPÔ#ì@p÷¥Vûü™@pðíKµ@pê+™óœ@pàL(˜›@pÖNœ2Ê·@pÌOÈÝ!h@pÂo°j’+@p¸¸šžÆ¼@p°{ê¸@p§Ø‡N~(@pŸÐNÅÜP@pšD Ø_À@p”ðWÀ@p®@1²@pŒ‚gb@p‰ÓŽ@p†í?§`1@p‡á«âF@p‰³H† Š@pŒŒãµ@=@p>€‹~@p“½‘AXQ@p—½Ê¨¬F@pœ'&vb@p p³YTæ@p¥ ™¿å@p©Ò|ÒÖ¦@p®IÀJiÐ@p²쫼Ô@p´Ü–ÊŽC@p·ZW¦ @p¹”»mw@p»FÐ!7<@p¼’æ«Ð@p¼X;Lè>@p»°ÝngŠ@pºÕèF[@p¹î†ñr@p¸úúf@p¸²ž8ÎÁ@p¸} GÖ@p¸MA×­ª@p¸$=ó³H@p¸ά{@p¸ ìç€É@p¸G²Î@p¸9þ\Ѻ@p¸mÌ*qØ@p¸£Gòû @p¸Úef©þ@p¹ßt @pºžCó@p¼Ó«i±@p¾É¿p1@pÁc}~4@q; hkÚ—@q6º?Ä€@q2ÉTèÏ~@q/=·}U@q-ÃÝ]@q,‡>ÞËð@q-mNQÛ^@q/I;´@q,!ËŽKi@q)<¡£ê@q&™â+N\@q§rɲ@q‚YÚõ~@q,Dâ>ö@põ.…ή:@píÀÁCØj@pæ±”ó>T@pàR[œí@pÛnëX]«@p×plÎC@pÓô£YP@pÑM%,èê@pÏ"íϞ@pÍc‡¬3þ@pËÞˆ{¡>@pÉOë'Ê@pÆ*=®@pÀ s~A¨@p¹»™%æ{@p³¡J|âÐ@p³ú ñá@pµ”hžï@p¸¢œo¾|@pÀ"¿Jû@pLj÷³ç@pÏp%Ø@pו3f1@pßÒà¶r¶@pèúª6E@pòŸ—I¨è@pü84•—(@q.³—Úe@qRA®’@q M>ØTƒ@q~Eÿëç@q¾Í˜è@qËXQI@q]œ3ø@q •Ä9¤w@qÈ ²åO@pÿ lxE¶@pø¸%ÛÞk@pñÀ?ÑJ@pê¾ùÒƒ@pá¢à Ô@p× ¬éÜ~@pÍC)Gˆ@p÷ý¬CE@pº}—!7©þ@p³ÏÑùÞ@p··Ã(ì@pº{ø¬ùË@p¼É¤çoŒ@p¾Î¨þR@p¿3Æÿó@p¿ »«@p¾¨$¢@p½ëøuT@p½ Ëkæ"@p¼ÎËJ@p»!Ôt@pºX8I·e@pº%–ü Ñ@p¹ø¨¸ @p¹ÑD‘ú@p¹¾£ÏØ!@p¹§Y‰“¼@p¹hÿc,#@p¹Y‡ùÑ@p¹{ø@p¹±9ggê@p¹é1³@pº"~ œ©@pº~h#©B@p¼†Ò ½à@p¾âamb@pÁ9{µp@qN̲¹ @qKÂþ¿®C@qGž•ÌÎ@qCÔXÁÊ@qAÛ·@q?ºˆˆPx@q?Яºwx@q=ºvuà¦@q:dÀ‡Ê@q7N_ùŦ@q3À‡L@q*ð`±@qši8@q6‚ì›ì@q AšŠß@qu„ödi@pübÆ,è@põ™gŠˆ¶@pð*è4@pì„» ¯@pèå†Pø@päûŠ4t>@pâH‹1hl@pàaÁ ¹w@pà-âä™Ý@pß! Qº@pÜ2SöÖ@pÕI<_b@pÎ’{ÆE]@pÉ!Ï0@pÇ(¾ ‰Æ@pÅð¥ß7 @pÇóne8@pÍñ¥Ëø¼@pÔû|% @pܺ°L…@pãéÖ›Ô@pëÎÇ&@pô:“z`@püèœ'v@q¾ðên@q ÞNòµ¹@qÖ­6ç@qœ§´ƒ@qü& x@qjޱtn@qº.o@q‡X@q _J)-@q~ÊEi@pÿ¯kÕ@pùÓ’n$@pò'ÿ"õ@pë^¹š@páí±ÑGœ@p×ϦFLˆ@p;µîò@pÄÕÙÔ¾£@p¼f/~o@p³ÃÂq¹@p­Z3ðú@p§ˆb~c@p£E¬f@p SÇ:ô@pqpGÝr@p›Ÿ\µº@pšF›yaÈ@p˜ï¯¿Z@p™ï}$Á@p›tzo‰ÿ@pœÛS1’’@pŸ¿ŸgÜÞ@p¢Ô?·?@p¥¹ç*.@p©w2å@p­¥wê@p±fJxG@pµ¯è…Ç@p¹¥m¼Ñ@p½OC|F@pÀLÃI}@pÁN~â@pÁñ×,@pÂ8B0ÝØ@pÁì‡E¾@pÁKðœo¬@pÀ^Më® @p¿IUC¤‡@p¾TÆjA3@p½Ti’gÑ@p¼Hx4£1@p»Ç]èVØ@p»Lö8Ö@p»x¸ƒ×*@pºçl÷D@pºx~E¤Þ@pºKýäÆ@pºMå,ƒ @pº}òúô@pº¼êÛâç@pºõ~ž^³@p»/¦~Òo@p»kWúM‡@p¼5€$Ÿ@p¾¤ª¦Úh@pÁt'Ý@qZ«¿yÀ@q[ Š=hì@q[ì¿V@qW …¨×Þ@qS‡®|@qQcå.íe@qO¢=ÏE…@qKÞÇ&U@qHY½†Ó1@qE¢õS>@q>ƒù¨r@q5y[t @q+– Ò^„@q!ì{VŸ@q‡ãrÐ=@q …C+»@qñ{h_@q ´Ö¾—û@q"i@­¦@q 2Ï…@pûÏ‚–©@pø1üùÅ@pôù1±{`@pôprõÇ@põpOsT@põŠ«S¦@pñ“S-,3@pêF;š#ä@pã*ÐP"@pÝÅZe¡@pÚCdMqb@p×}‘ˈæ@pÙN$yÂu@pÝÁ¾‘Ž@pâÐ÷#"Û@péa[ wK@pðeÌž=@p÷¥rhB@pÿ;ëV@q¿¼8~u@q vpºó@q$ Þ ¦@q¥+Ô$@qÔ×=¾z@qhùàÝÔ@q ¼Úܪ@qŸÑ6s@q´àÝË¥@q$ä6@q$;YÌ@q:g@¥k@púõÅþ ¼@p󀂅ÒÈ@pì1!¡»½@pãn)n7Z@pÚ7yTй@pÑcúpF~@pÊ è­û@pà |—ßÄ@p¼iB&@p¶ô{cPá@p±·Ãï€0@p­S ¢9@pªŠ‚v=Ê@p§ÑaÕyJ@p¥¶T^ðþ@p¤gÞÐV4@p£]ü\@p£[ß:U@p¤€Lÿ¢@p¥ÂÚÆXý@p§ÆÔÏ{@pª§>ÁÎ@p­Z&6-±@p°oɃª@p´kõõø@p¸JIºlâ@p¼iÖª¯@p¿{V£—¢@pÁïpí33@pÄ&u¶#Ô@pÅoÑë@pÅu]Úðü@pÅxì@òm@pÅNF®š@pÄ@ŒýBä@pÃ!óë=Ý@pÁ¹.šÒÒ@pÀ™¿~?@p¿’`˜sb@p¾€Ad @p½bî+›@p½áì5@p¼“ñ2hÔ@p»åÎV@p»*j@pºý9g:@p»äBÇ@p»Q¹Æ*@p»½!t÷Š@p»ÿÆ®Á·@p¼:«·Ø@p¼wm%@p¼ÁñÖ•Ç@p¾éMsò@pÁvªýå@qf%³¸œ@qfïA³×º@qf£(’Ѝ@qfBC¬Ï@qd}àÑ@qa‘wÏR@q]ª)ªê@qY¹b'²@qV5<¸¬@qQË4s#@qJ)•Â\¼@qA·n`ݲ@q8oäÔ%@q1¥÷®ön@q,;@¢Œ@q&ÍãÔÐ@q!«¸ßÃ@qK!Ó–@q~8@q’…I‡Þ@qU+šL@q ö9®Ù]@q:V>áÜ@q nßc µ@q ››áÔè@q è \G@q´?Ú@pÿ ªDø@p÷…âGœ@pñ'õ¼@pìŽY§£@pèE ?aâ@péô¦U‡$@pìè ë ƒ@pðxÊÁ`@pö‚ —âº@püÄäËL@q&ýûA†@q U®ó¯¸@qË)O¼Þ@q‡YÚ @qKëqc4@q[îÂ^K@q¥…9¿@q\(Ø…Ê@q'ãÆÙ|@qj9üÁ9@qWºç^@qØ)6ZŸ@q½‡»èÂ@pÿž2HôP@pú¨²xªF@pô,„(%¹@píÕÅn @p没^æ®@pß*Â0\@pØjšU@pÑwѬµ@pË>tË7@pÅ?fYÈZ@pÀO•ï…ˆ@p»£Û Ò@p·MD‰j@p´«õÄI±@p²DËí÷@p¯ÆYXbF@p®‚4Û±@p­?²¸Ä@p¬j1‹@p­¦ÛãOê@p®Æ{˜é@p¯øÁò¼!@p²§‘bá!@pµ)O1@p·~_xLî@p»L>±»#@p¾~€mŒ-@pÁ.Öµ~@päá=\p@pÅäàçµx@pÇèðkK@pÉ>Hå1@pÉW¿Z`@pÉ›úçÄ@pÈ‚’/E5@pǃWH1@pÆ4;¤q@pÄ›êLýŠ@pÂèl&¿E@pÁÛf±& @pÀ» ±|Ð@p¿mš}I@p¾fó,¼Y@p½Íp…=@p½ éÓ Ï@p¼&8ð„F@p»E¿ï@p»¤Œý@p»õHS@p¼qìÚãí@p½{@p½C£Õ£í@p½ÎŽ~6d@p¾¬ºˆ—î@p¿ª|±$@pÁ¦ó|@qq=~m‚ @qq¥ @K@qoÜ/ú|Q@qo/ >‘@qo Q@C€@qn¶xá%@qkjÿ8ç;@qgMQÌ @qclpwÓL@q]¸Cº[@qV©tdq€@qNÍÑx­@qFÈxQ1î@qAZ"3½"@q;éYÜ„þ@q6vŒù@q1¤v)ß1@q-Yú@q(µ\ó”@q$®—b¬<@q!ÀI@qM¤})@q)-¹ú@qSF™#±@q"¦S*ûÆ@q#Ô[vÅ­@q—ÇŒ$<@q‰u @q ¯I)Ŧ@q‰É¯¥ù@pþ´ØVJ@pù¨¬™à@pùï—<'.@pûmÏI¨@pþ¿©¤@q]|§8î@qâžÙ<)@qML†9®@qJÝþ@@q_†sÒ@q8"Áˆ»@q!qN@qT(P•ï@q:r×@qòî Ëu@q¿é‰3Ü@qèßXåž@q:QBr@q¸®ƒ^@qZÝìÂ@pþøz¤r@pú:÷³W-@pô±%žo5@pïK¾4cÔ@p阸m’ª@pã³Mw;D@pÞ+Ýj¬@pا=HT@pÓ.aübÑ@pÍîX÷Åx@pÉnÁáûö@pÅPÆ4+@pÁe nÔy@p¾¸¼(~&@p¼Ms¯@pÀ¢ƒ±@pÁr´ ðv@pÂ8úŸr@q{ö Í@qyÿvt@qx‚q…@qw‰Œ/Sf@qw]†}@qu èª¤/@qt¡Î6Q@qts;@qp2YÍʺ@qjyØÍBv@qcû÷äŠk@q\´c¼ë°@qV~˜@qQ ¡|®V@qK’×#ª@qF;c3YÀ@qAx>êÆ@q<Ï:³æ@q8@åPq@q4b=“*¶@q0­÷I€@q-_ë@q.…Ïh;@q4U‹˜l@q:‡¯7i@q8ÛÖé{@q0AÎØV>@q'ÕŸêè@qL·-?"@q¿¯Ý$@qÜåÕÐ@q Ã/vmÃ@q GQ¥,@q Xs±«N@q _ùLù @q÷LÙW2@qĨ¹²ó@q%ÄÌ@qñ÷Î+@q! Ùȃ@q!3ƒÄ@q¨µ‹t3@q ­" Ê@q´v¦ y@qv­ãÿ@qK¢ô²Æ@qhÆ"Ä@q ô¹°X @q›­È)ü@qüŽ-ËÀ@pþXþ ‘¬@pù®ºÑTî@põO“¨°@pð•UMôt@pì%è°Æ@pçÖPâøx@pãã'x¡Û@pß›Qrñ@pÚݯW›d@pÖWt¨tZ@pÒU¼‘@pο¹°$@pË]X›ÐÕ@pȲ>­›@pÆl6^Sï@pÄ4Õ·r@p£ Ç½¨@pÁtÏs‹¬@pÀGÁ @pÀBÁén@pÀÎs>M~@pÀï]ø@pÁ±£;§@pÃSœ=¾@pÄä˜è*@pÆ‘^x5@pÈï”xÚ^@pÊý|åíŒ@p̼Ď©l@pÎ… 9'a@pÐ%Ÿ)ð“@pѲc…@pÒ)MâÜÞ@pÑgb,Hç@pÐQkòû\@pÎé?²_@pÍ8ÊBÌp@pÊ×¾.<@pÈgˆú¯@pÆ Tñ®@pÄ¿ePö@pÃi£(wU@p áMD@pÀ·/"®@p¿ÒŒHq€@p¾È¹Ó¥‰@p½šh´ß¾@p¼HR¹°4@p¼´²†•@p½¿æÿîò@p¿uŠ»°$@pÀÒ»¦µ^@pÁÊ›f=Y@p£ Œ‰ @pÃpw7? @pÄ3n]¡@q„¦¬·@q‚a.G±Å@q€šøgg@qVÍND@q}”Zß@q|™çMP@qzÚÜø @qyüƒŽ’>@qx°ŒÌ›@qwap}@qrþ5Üj@qk¨.l¥@qf/®ñ'@q`µ‰çC@q[8[^|à@qVúÃl@qQ(ø¿«ä@qL\¥w-@qGÚý6ïÇ@qCÿ·Ð÷ˆ@q@1QIã@q–);@p×õ½@~Õ@pÕ÷<ü@pÒ™ ;o@pÐwÕ×5@pÎd•)ÀÞ@p̬.¥ã“@pÊÑ'Ë#–@pÈòãÁ@pÇ”ÿ€ªk@pǽã¬Ë÷@pÇð6½@pÈ;;rÇ@pÉÍ)3½Z@pËO8@pÌŠ† ¤@pΡÇKF@pÐ`©ßl@pÑÒo*oþ@pÓ+gÊ@pÔ›jœZ!@pÕÓðëÝæ@pÖÖÀz¤@pÖ+Íò£@pÔ»uÿ½<@pÒ`žK–Ê@pÏЧÊÑ@pÍXü~Òw@pÊõÌd-ë@pȦ{y½G@pÆË>]åÑ@pÅqgÁhÕ@pÄ­  @p©%>“@pÁnc‰fñ@pÀSúiÛ@p¿°§î@p½°ñ^ÒÄ@p¾5Š Þ@pÀ#7_I@pÁ·e¸–A@pÂôЍ@pÃÚé—}ú@pÄ®TŒ¿@pÅx¶_P@pÆ8®9ep@qŒÇˆ˜?@qŠ9òsá@qˆ*ŒQ¡Ò@q†Z¸++Ü@q„íÖ5Ê@q‚0 ѦÄ@q€«›f¥@qMŽÓÌr@q}¾¶ï¾A@q|RФ"@q{ ùŒ@qz,Ò˜Îþ@quÝÍ¡!@qp]+ÄëÂ@qjâ,¯¥o@qeÀÝâ]ý@q`¸r}9_@q[ÉcB%&@qW{ì«u@qSˆXë`ã@qO¡¹‡m@qMSq|Úµ@qO."ܺÙ@qR éBÅß@qU[&™oø@qPK‘µ2ô@qK!NøT@qEŒ¼k@q=øð•6@q5˰Bý@q-;ú°Y5@q) ]äêd@q&+×Ý÷M@q#½ÂT@q%:„ãè)@q(sWÊÉD@q+ߦt@q-ɱºé@q/eQ†wŽ@q1@ÏEøÕ@q-5Ñ<¬Y@q'Ûq³Ø@q"ÄÞNK@q\ñfÑ@qE@'£@q@lÛ¬@ql  &œ@q gë{oW@qh£ÿsÞ@qL)¢L@pý+|¡F@pø@Oš¡´@põe4}×ñ@pò«´ÿÁ‹@pð@ùž@pîþÏNe@pî—Êf@pìÜü \ë@pé†ü.­ò@pæe¹@âÆ@pã‚Ì@pàôúÄQ5@pÞŽ‹¥_x@pÜtŒ@pÙŽ'rŒI@pÖÆ`Á¨@pÓä6ß@@pÒ³?ëú@pÐGܤ@pΈy_â´@pΠkÝr@pÎãÇz@pÏ0.-©B@pÐTVkÆý@pÑÇ¿¿Ì@pÓ,6e@pÔ¡ÑÅh@pÖYß@p×7÷Bv@pØi~f´@pÙHÏGew@pÚR‚3Oè@pÛ&Ì„‹r@pÙôM¹ˆ¢@p×^7ÚÖM@pÔÊD;_)@pÒ8P™Õ@pÏÄLúû9@pÍmþ÷n @pË+L-'²@pÈû¸º é@pÇxép@pÆË/„­@pįjîU@pÃ=l…Ëë@pÂ3^P@pÁT |@pÁxà¤n@pÁ²2¤ü@@pÂá!•^@pÄSÎUÆP@pÅoÍÔq-@pÆ6ër.§@pÆÃg»@pÇ‹9 Ê@pÈH|š„D@q”b6X°@q‘ÔÙ@q5³¦R@qŒ…óWeù@qŠ •üª@q‡Ûôh×E@q†Xé@@q„P³lw@q‚¥÷!@qfçÿ¸@qÒAè@@q*Ì<`Â@q~x;Ae^@q}º,…O]@qz•oÍbÞ@quR£3¤@qp(eζ@qk ßU'Ê@qgÚ&o³@qbýeØ^†@q^þ¾$Öe@q]i5?h@q]Úýì?@q_HŸ¹+¾@q^ûúÍÛ@qZ9ZõÓƒ@qUCü¯ýf@qOÕúcÕ@qH½Æ6+8@qAF•¬„Í@q9Œ£·¦@q6¦žú<Ø@q3¹öyq9@q0ÆŒq÷Q@q2JÔà´Ó@q4vÞ`ï@q7Ç$@q7§á_’P@q89)(ô@q9ÝÁW@q2‘tMÅB@q+ÃlY¾@q$Ì(ù@q ÄÖU@q’ô"‚@qªµŽp@qïK»ÀŽ@q ½tò@qRc 2@qù¯øÍ@püœç<0®@p÷`¬˜…Ú@põ^ç‚0@pó|M÷!¢@pñØLe2P@pò éé@pòË=’¡¤@pózöWJb@pðõ+ܨø@pî’{&à@@pìO÷¼vò@péà+RWK@pçdÇd @päÝâ€e™@páæœx‚Ž@pÞµ¼Š®@pÛO•‚ô@pÙB–ô¸†@p׎Všðé@pÕãùu·@pÕvø¨M@pÕÊÍ8@pÖ'¼ÅG @pÖè<1zå@pØM¿}@pÙ£0§É&@pÚë[D²@pÜÂÁx@pÜê…ð4¹@pÝ|vÂÆ@pÞD³`š@pݬFÃÒ<@pÝ©þçÎ@pÜ/À†É@pÙÃi@4û@p×0·ÌÔ@pÔ fµÀ@pÒ}·7–@pÏÐ/@pÍš·ù‚ž@pËwazÂM@pÉ“³º¸W@pÈ+ÆA@pÆ»å¡=@pÅ^‚sÖ@@pÅ ªh^@pÅ;4Ô†ª@pÅj~¿$Y@pÅ®¶&ã@pƈåYï@pÇHI k@pÈCŸjO@pÈêê„e­@pÉ?Ö¹8ª@pɧ˔ì @pÊbUŠK›@q› 7"@q˜Zî¾§@q•iå)> @q’Löd\Ó@qŠ®©ÏD@q$Ð`Fé@q‹f¯£<@q‰.Ý@q‡gÄŠ ;@q…Ã(H:´@q„ÑÀŽƒ@q„2lÎûe@qƒˆ Ža˜@q‚Òh×0 @qÚÇR“ƒ@q€Êcõq9@qzx´l@qz²aD“ @qvƒ¢+-@qr`º!.@qnOÎ@qllú½{ÐH@q?R_Í(@q@Fº Ž@qAƒe´š@qAÌÄæ?@q@è5WþÄ@q@×סö<@q8Œš]S@q0a×¼À&@q(X[UàE@q#k«íH@q–5é~[@qÌð2HZ@qüè[jÎ@q'£@ü|@qQИÓ@q,™Ÿ@pþÄ•Ý @pøú ¹[@pø‰©@p÷2méç@pö€¯s n@p÷¾«”b@pù.Þ×Ô¿@púÂH­`@pøõºZù@p÷ŽHÜ@põ<ßÛ÷@pòÔ[ú@pðCKÕíå@pí§_L\T@pêqÄÍë+@pæÚ<E @p㪠$3@pàg–K‡Ÿ@pÞÇÀÜ.æ@pÝ1£O ‘@pÜAšÂMÒ@pÜ¥û;§Â@pÝ¢O@p݈Ñl)¢@pÞß™øË@pà') }Ò@páaJôv¯@pâVF!/õ@pâ Hp÷Û@páTkȾ@pà…Nû.@pßï˼'Ù@pßÝV¬g@pÝûÈ»•%@pÜ%œé²,8s@pÉî“—4@pÉ  ®‡­@pÉEVy&@pÉ“(ý”@pÉôªŒ²ì@pÊ’÷@pËm#Z@pËô““º@pÌ*q©`@pÌK£™¹@pÍ)æoº†@q¡jîº@qž²õÝgJ@q›2aŸ!Õ@q—³¡@Cb@q”²êWØø@q’ ð7é„@qé+ðK,@qç F‚¯@qŒ„AÛD@qŠgÖžà9@q‰Úýþ@q‰C]‘ñ@qˆ¡0Ú}À@q‡årÜb½@q‡ïW˼@q†{9|¡@q„õ¨Ž×@q„81¬ÇÞ@qƒŠJ’×T@q±—ÏÂ?@q}¡Ì¡@qziÊŸtD@qxcâè@qvÆÞö$ @qrÔìí@@qn©Ë¶3@qjMR ø@qe%à×Õ@q_fS¦@g@qYLôEî@qT–žP#@qQ¶9•S@qNϦ9°@qLˆ ÆO×@qKîˆOæ‡@qK±¯žó´@qK‰”£±@qJcOïéœ@qIh ؼ@qG´¯¤/ó@q>£VC@q5Œ ]æØ@q,Ð)ü ½@q'NƒLÊ%@q!Ø?Õ¢3@qlü5›@qazy+Ú@qUg Gk@q HÊ?®@qu“a@qËŠ+ê@pü–óq@pû¡ @pû•n} @pû¤l¾M@pýX¿µë‚@pÿi[ B@qœ-s8@qѪÈì@pÿW ßšÂ@pýý1G7"@pûÏ”úÖô@pù)ýÑÕï@pöy…ýàI@pó-ÅÖ¤@pï1èõ}@pë7Ô[+@pç€k1½@påôŒ h@pär;H-@p㘴PO@pãuûê @pãòÿYð@päxu Ú@på}mɧ @pæF=—9Ð@pærú;@på×p"zF@på Ò(Òò@pä6ƒè@pãW¦BŸÚ@pâvŒcÝX@páb/-ÉG@pà ËâNâ@pÞw‹\ɯ@pÛô¼ Ùh@pÙfqy'c@pÖÙþŽþ@pÔZ ˆÐP@pÒùÌÉ @q‹Z³À@qŠt?ßïÜ@q‰Í¡¬{à@q‰"©/@qˆsE·$o@q‡>m)Ö4@q…Ðb/à@qƒËÌÇ)l@q€¾V 4‡@q} m±@qy)(?>ô@qu¦BD@qpZä¬×@qkB3QNŒ@qeÑ‘J&@qböÐð@q_@>ÕU @q\\’ª…¸@qYä³Ýb@qX$+{PÎ@qV¾;ž4R@qUXö;Pö@qStæ¶z@qQºå·Šú@qNfdÞJB@qDnÀ"BÈ@q:–#Zä.@q1@ ì L@q+!öÕ ø@q% œ×ù@qö8dm@qÄþje¶@qƒ~_×–@q AyQÕ;@qЄ —@q~:ý÷ä@pÿ26MhŸ@pÿ&ñ´Ù@pÿ׸‰h>@q£!åãâ@qϤza~@q|ž‹§L@qK .Há@qŠ¿ÝÑ@qÞF*J@q•ÆÈ @qÒÁÙÀˆ@qÈhŸÀ@pÿT<'4â@püçð<@p÷ºòøˆ@pó+S×;@pîÈå†õ@pínë½n@pë¦|Û¾¹@pê@µD™Ÿ@pê;s[zS@pêV7 D@péšrjG6@péëcõ5@pèæ‘I}@pèÆuç¬l@pè¯ÀMvi@pèª}˜@pç!n¤@pæ9wk @på>EËþ°@pãïUµžr@pâ`yŽr@pà’ÎTÎä@pÞR£b@pÛŃVt@pÙ:9ƒŸ@pÖ°¦@õÛ@pÔÕ?îæå@pÓ›úû$@pÒxkÑÃ@pÑjŽÁ@pÐÌZ²“Œ@pЖ R2>@pÐfIx@pІôãÔ@pй½Á…²@pÑì™~þ@pÑ‘s ßÉ@pÒð£~Ü@pÒµ ¿„â@pÓ&s¨ø,@pÓ•l4Êß@pÔ^€IÒ@pÔsGx>æ@q­ó" »‹@qªQÙÌ @q¦¸A'Ð]@q£(Ÿ ’@qŸ£ëYÙ@qœ Ehâ@q™¥´Úo¸@q–ñ$l®Ž@q”ûKþQº@q”‡hϼ@q” yÖA@q“T@q’îÓõü2@q’JäoB @q‘‘GþÞ@qÁ¦@q K†ÁE@qem8¯È@q޽U"óø@qŽË× –@qŒ¢ÁÊÑÔ@q‹9äÔpN@q‰Ë;h@q‡áÜÜíb@q…µ<ïô@qƒ•Ö1x'@q€\©üô@q{èÙ™@qwt2¾š@qr¨î$ù‚@qo§U0oú@qlÌ3Dû8@qiëWXaœ@qfØ]®W@qc÷Ømq™@qaoï©¥¸@q^ô:_G@q\Vç¼ü@qYâÚh1n@qTî÷í-ê@qJ)ˆW@q?˜ƒ³J@q5Z„À”@q.æÈÞÏl@q(;$c,~@q!œ­™Ôù@q'ÏX @q±õY˜Ã@q;ÙhU@q ˆI’V@q(Lñ›@q=6 ™ÿ@q“¾§û@qû¼ÐÒ|@q~àô|@q$ù…W@q jxu¿@qЭe @q"¢Áã³@q„É)NV@qL±\¼@q Ý…Ï@q œx=C@q7mv@q1“ú2@qs§å0d@pû…7Íø@pöfÜÈB@pô+LŒÆ@pñô²Ø˜b@pïw–dî@pí©|Ù>a@pìòPvû@pìC§” @pëU š@pë{ÁbYŠ@pëgÿÌŒ @pë] Á=@pêü²¥Ìt@pêòCN@pé$jñÊ@pè* 0é@pæ¼*?o”@päô¤§Aü@pâïX¦²0@pà­IâjÙ@pÞ" $—@pÜ_‡@pÚ=̶ÝÙ@pØ`–ˆà@p×68‘N@pÖ!Mq6¸@pÕ!aõQð@pÔ6ºb@pÔ~gx@pÔ Í=+ @pÔ$ˆX0ù@pÔ\ÍZ@pÔÁ à:Q@pÕ@ˆ“j@pÕð ®íK@pÖ¨Kµ¡ç@p×*„l@pך³­«@pØ «Õî@pØyûsC@q³µ Ö@q° ÒÞ¬@q¬i®oÓF@q¨Ñ¶Hä|@q¥_„Á•@q¢'ãÆTl@qŸQEÚ@qœ9½Æ(õ@qšƒªïx@q™­4uý@q™.iéå@q˜­Æ%ß8@q˜-XK£Ä@q—pâ p@q–øFê©o@q–=ôp”ì@q• Ó·è@q”ÿ§8 @q”ZaÕ@q“hî-)å@q’ );\@q§¹Éª@q>„æ@qÈ ÃF@qм`“´Ô@qˆƒø5F@q…Ô– 6#@qƒóåQ@q€¿¯À¨µ@q.æô­ @q}3‹´@qzZo§Œ@qw|NRÇ@qsgž×|ø@qomÙ·¶ð@qkÊÆ0ȧ@qh]g,W@qe ‡;†ö@qaáêA^^@q[PK>òè@qOÁ7a8c@qDOÕÄô@q9èþg­Š@q2°êZÒ@q+]a:c@q$1M°5{@q‰M›9@qàØfk@q7çfyÁ@q \Ó–oÿ@qÊ/…wÊ@q=‘pˆÊ@qæf¯£ë@qŠ;JÐ@q 8%­3"@q ZFŠï`@q4œ¾V@q.ó ®@qšäú$Õ@qg~€ª@qRÎ$Œ@qïÚ 1–@qpI"@q# KÑ+@q-³\ú¨@qVåÀ@q+RŠ@pü @ù@p÷Ѹ¸u¤@põG(ËÙ@pò¨±¤n@pð/š©@pï„Õ:Áš@pîãuÓ¸@pîIh1wP@pî”]Ò‰@píÿ„.§@pî†V®@p°‘@píÙ© ±@pì/äz@pës^ü@p鯧RV@pçÇA:)»@på‹_Ÿ{@pã§X0þ¨@páëZÞ¹>@pà ñŸ¶ü@pÞ=‘J@pÜA˜så@pÚ¹Æ}Qú@pÙ³Z„”ð@pØÁ®Àò@p×äU„5ã@p×háÏVƒ@p×vL¤»œ@pסÏ$q@p×êÚ3‹Ô@pØU~ÇÀ?@pÙaEÀÿ¿@pÚ5öf•6@pÚÔ—ê“è@pÛ>$ØÊ¼@pÛB.·@pÜ aÏ ö@pÜ}}?@q¹kÓ¤Õ®@qµ¹v‹ð0@q²Ÿù@q®p 0¤=@qªìgƒ4@q§’TÍ/\@q¤b|ÒXÞ@q¡q]FÊ2@q r&eóz@qŸ‡È[ãÊ@qž² mþ€@qøc†òº@q€¨¶ö@qxY]ì@qœsn„ãœ@q›Õ…ÜRÿ@q›:êgjŠ@qšœcþ‘›@q™ùäÑ„@q˜Ð@0m_@q—w¤¡[@q–†{õ@q”|}¶0¤@q’0‹@q´€‚ñw@qc–%–J@q‰D§‚à@q…®Ú ÑN@q‚Uå]’Þ@q€ZJ˪Þ@qù[mW(@q•÷ùh6@q®Eº@q|}Ð[Ùß@qye*ßR@quѦ=oz@qq—&³„t@qm”Ù…½@qi¹öÉzÒ@qaŒ%M"ÿ@qU8 ÉÐ@qI,„ÃÐ@q>#Ï~n@q6G\oÚ@q.uj|ø@q&Äp´x@qêP$¯¬@q4<7B@q5¡c½@qš³ö:@q dLP[#@q3ÎhpÝ@q "8×\ @q ímâYÌ@qÑŽ9Û7@qpü¥À@qܦ9­;@qg¡":ó@qõÓ!@qñmçSa@q»n6“@qcÒõ3@q“î?¨ë@qvaŸþM@q(üõ V@q ¤±@q‹îÀ!@q|¥K'T@pûY½5 Ô@pø­_B6J@põìß J:@póu ª@pò1}ÒÌ@pñxú´(«@pðëÓÐËÔ@pðŠFü¥@pðp?õ@pð™dBÈ@pð­º&“ð@pðòðw´@pï†-ª@pîgŸbq@pìó°]”°@pësøÌç@péÅt±>;@pèèæ¾f@pæ)iüœ~@päK³“Æ€@pâUp½êN@pàFüÖk@pÞ'm¦Ê‚@pÝ/\,`T@pÜKË¼Ý @pÛ|SÜ@pÚÀüÏ@pÚŸ–œ¡@pÚÿËIÔU@pÛÚÕ$Zï@pÜò Mf@pÝõÕª@pÞ°ðí$@pß6 †fT@p߇Ø-h@pߥ€I¬X@pàùO±@pà€É]'@q¿ý¬Dë@q»]‹³™@q·¬9m @q³ñSHèÖ@q°L'¡¼R@q¬Ð;ít@q©}¨!¢@q§\Š„–G@q¦IRO ²@q¥J¯A:@q¤`ú¿Þ@q£˜S€o•@q¢ôM'Ù¦@q¢nüí2@q¢Aª@@q¡oÈ¡»@q ×¦¼3@q ;¹;Vo@qŸŠm @qž;ÄnË—@qœè7‹<@q›O‚$@q™•³ú@q—Ë8îð@q”žM'¦¹@q’'{T­Ï@qŒ¹Ið'~@q‡Íã.Fœ@qƒg<å:@q‡ê²ªÎ@q+ò^‰ @q€Í–1@q€Nð×ð@qÚË" @q}t§C @q{TixrY@qwÞ.B@qt:͸v@qp‰@¦wŽ@qg€Ïýƒº@q[ ¯ð{@qN¦[ÔØ@qC`Òä@q:ù³gŒŸ@q2‘ß1@q*R"½©@q#c­Ä@qrÒïñ—@q °åà@qCÂým½@q…èpn“@q Ôô8£@q ™°p@q™ÏNï@q$Ä5rl@q ÚaÈ@qd¶»Œ@q!:”Þÿ@q%À-ä@q$D•ˆ@q$wýXG@q#DØ™l@qž Î;Š@q ý`¤<@qKr@qè +v@q â^÷Ïñ@qå^¿’Þ@pþô4G@pü&´`@pùE‚Ì-Ž@pöPÔ"n@pôŽÌÜÕ@pôð‰d@pó…sTò@pó ßA,@pó,íýr@pó)H|@póH¦!!@pó!ïv@pòO-CœW@pñ¶—€aê@pñ"qÏ@pðý&Û±@pîH”«@pìqŒËŸ@pê…âÜó7@pè¹¾ÿ¼@pæ„ËÊwª@pädO @pâ+ßÌ q@pà–íó@pßÀ{Sr†@pÞþÂл9@pÞP‡É„×@pÞJø…þR@pßKðý3•@pà]A•‰¯@pá~¢s‡Ñ@pâ¯Ï¸¤@pã`F{Xd@pãÍÒø@päŽÛþ@pä ]î³@pä~$¬?@pä‚ð7¤@qĘ Õc@qÀ÷‰¡@q½4ç+d®@q¹Fž ¨@qµ€H^¾@q±âw++n@q®mÆ_G†@q­0juï'@q¬ t™£Ð@qªöÑì=•@q©øãÜS @q©6ç^¿@q¨QO>+x@q§ª§|Ø„@q§(@ @q¦žJð*@q¦B-5j¢@q¥Ý½çú|@q¤ôü¤Ï@q£«Èu4@q¢\çÎ@q¡ ­N @qž V}’@qœFóJm@q™zogýö@q•ÉN@qXц@q‰g? Å$@qƒøP€4@q‚·¹^=Î@q‚`›žQF@q‚)¨U@q‚o$Up@q‚7Æ…öP@q÷–*³¼@q*ìxwÏ@q}ÇÄ#µ@qzWNbû@qvØd1¬ÿ@qmc‚ël@qaz¾¨4°@qUy°y²@qJï€Ø@qBŠuuÕ¼@q:#CŽõ@q1ûù½±@q+ss® @q$çËâàü@qYÈÊÎ@qÿ}s/Í@q#·w!ø@qC¥³…@q$<@q±¥ã«@q= f`@q Õ§¡@q$ržvÒ@q'ã@…P4@q+'¿÷ö@q*g¬þdù@q)hi}Â@q(I‡#D@q$ÔZkžæ@qÐ.k¿@qžGß@q"–Ñž_@q.î¼oú@q C̹œá@q`àô@q@pÿ²u·ç@pü±PcÖ$@pùœüçÚ¶@p÷ùý@pöŠK!g“@pö]{Y™@põ¨9i,@põŽн¹@põÌ|†ïç@pö_Já]W@pöâá“ø@pöm§»…í@põÚ¯]Æ @põLàì@pô²ß÷‹<@pòÞ×x¢@pðõ¶ß ù@pî÷Ä%¢@pìæpüí@pêË ÉGh@pè˜B@pæN^ì¹›@pãí­‹ÎÎ@pã t[­n@pâ¸øÀ‡˜@pâÑɨÏ4@pâétAÞw@pã²L–hA@päÍÆ4=Q@påù+­˜@pç4;-:6@pèBÀ«ž@pè–Ôe@pè·¦˜ÝP@p観Ñ@pèbð&ŒZ@pè„+¤õ°@qÉÿm®7@qÆ~²Ó®†@q²óçÏ@q¾q\«‰_@qºŠ7å@q¶Ë w@q´<¯8W@q²íß°P'@q±³míí½@q° ó@q¯uî³MB@q®sMƒ/˜@q­ŽáÕ @q¬Æ†ß®Ø@q¬±­§´@q«\÷o:@qªÔhunÜ@qªošBO@q©F‡~Y@q¨|]ºuë@q§Õ½fTÂ@q¦XÄ@ŠÉ@q£‘!p@q íHÕjz@qžIˆ[Zî@q˜ßE¦Y@q‘p¹è<ß@qŠÒ¯A@q„9ν[@qƒéªßXÈ@qƒ—Lc@(@qƒB©!É'@q„9:L3Š@q…Éý"^¯@q†éºpžº@q†ð„Öå@qƒ¾]­Ó¹@q€~úˇ4@q}2®â@qs_ôd;”@qgÿ2%…³@q\†ÁK0*@qR~Þ+ce@qJWY@qAµ9çáX@q9©x‡ïà@q3ƒP„@q-[yÎí.@q'0Â"ÚÌ@q#¼P„qÎ@q ÃQð¶@qÆ3e>@q;<ÅÛ@q!É,¶F@q%TøJ¤Î@q(Ä´DÑ@q+ªè2ó¦@q.e^0ž¸@q0ô´9ÝÏ@q0O©{õ±@q.ï+"ý@q-oY[»@q*5ózb@q$Á[Ãmw@q â¨@qT"Öµz@qr-â©@q ˜o„ ¿@qÆÚóß{@qPh0÷Ö@q/µƒ}Â@püüVçà˜@pù¶t6ãr@pùiî‡@pø¹Ñ›ÝB@pøÏkc¹’@pùÔ'ËP@pù¥n‹ë¡@pú&ä;«b@pú™pl+“@pú†*ι@pùù H@pùoùúÁF@pøë,Î@p÷‰t*X@põèh$q@pó}é„aÀ@pñY¶ @pï'¨9‚—@pìâÿCuu@pê‡;gb@pèVø/À@pç|ÝZ{@pç–v±d@pç¯HÉ¢”@pçÇ?=@pènm@pé,ÿ0:@pêbX]¯´@pë§9áõ3@pìûg—ì{@pí’£XÉÆ@pí›f¥_†@pírYÛ@pí"•,@pí Ñ>û%@qÏŽæ3à@q̪y@qÈÒ¤@qÃçè't†@q¿³'°#ˆ@q»‹7° m@q¹öú‰lr@q¸•ÂÏüX@q·H J$@q¶;gªT@q´ÒäCŠõ@q³°Ç”`›@q²«—\ô{@q±ÃÃL€ @q°ÌÿgÄè@q¯ö"£GY@q¯AàR@q®a"––@q¬9§V@qªOÝÏå”@q©@cç @q¨L?e¿@q¦éQ¨÷A@q¥²MØ´E@q£ 1ÏY8@q›oõ?)@q“ év@q‹4è&¬@q…iADF@q…´(H@q„ÏûM@q„€ îÈ@q†è±D±[@q‰Ï1bñN@qŒGv(¸@qŒÃØ}1@q‰Á’}]à@q†²g„tP@qƒ–2Ј@qyuUëî@qn™`ͨ@qc¦RÖV"@qZ_V™U@qQ«»µ†€@qIG-bS@qAZ±u§Œ@q;•s(Ô@q5Î%²­b@q0[þB$@q,zoþ½ @q)däÕÿ@q&Kc©`Ð@q&R9Õß @q)àrr°@q-lÅÅRì@q0ØLO;@q3 •Õüþ@q5@q6TLãhù@q4”¸Vé#@q2¶ˆ£ä@q/¿Ðlì@q)Þ Õ¡2@q#ÑQ‚šÙ@q™Bê§@q¬Wùí²@qãÁÁõ'@q #"Þ^‘@qÿ¹Ô@qÀ*‘a@q“´Iõ@pýŠ$êà@pünÒûš@pü.íë @püÅañ…^@pýR‹@pýŒE©l@pýü­S_È@pþ^yrM”@pþ™ÿ±Z@pþýŠ™8@pýŽRî—š@pýç†yÆ@püGbvkT@pú9¨”ˆc@pøÙ+ÔÕ@põâ/¤N†@póšþïV@pñ‡-(@pïÖÄã@pî#Öý*¼@pìn^8Ú`@pìs¡kÉ@pìŒtþÆ@pì¤Eo®@pì»Pëx@pí{‚^Ñr@p’ž¾@pð aî‘@pñg2W€U@pò¿v>`N@pò«–®ÆÀ@pñþ[tÎ"@pñ¸ Ì{@pñÖùWŠc@qÕF³Ÿ?²@qÑ’3±n@qÍ“°ZsJ@qÉ\{@qÅZÍf3@qÂøèœ@q¿üKjI%@q¾(ã ý@q¼È7RyÎ@q»n,5ê@qºéëê\@q¸ÏÆÀÉF@q·«'‚×@q¶Oc½1@qµln·»@q´k#}ŒÖ@q³‹åç¼@q±YÅ/¡@q®ØôÖ@q«{…× ¸@q©-©W@q§ÂŸâ &@q¦Eœ¸@q¤˜Û­E@q¢ä=¹j‡@q›_f½…³@q“}’}k @q‹=Ið@q†šÜ#ü#@q†SÌðÅß@q† ŸW&Ö@q…¿Jò{g@qŠ{¯é @qŽCZZƒ®@q’ ­üý@q’¤“æ.@qÑõ1‰@qŒñÓ Û@q‰çQR_þ@q¢è{—¡@quH«‘ï×@qj×ê¬ ¼@qaž;h†0@qY<¯_ÔZ@qPÙV@qIºÎ@qC¨áùX@q>@ l@q8Ô÷Ÿ)P@q5: "F@q2›:8º@q.Ó]È”@q.iR–L@q1÷åêÁ“@q5„²¾—‘@q9&Eò@q:“c/¸@q;íÎyÛ,@q= I]À@q\@qÞºx@q^­X@qnIî…J@q Ù? ¬@qºfCJ6@qÂÛΔ"@qãש£F@q Ƕ{*@qM„âö>@q£ºEX@q‘V@q€¨®^t@qàLnÊ@q1ŸåÒÃ@qtÖlÁé@q%Ë_º@q§s½@q-U¢/i@q·Z.‚@pþø‡å°@püÅ!äÓ @púÄEùô@pù}¬åÌ@p÷X%uï@põ¦FÕ[Ö@póñþ×V@pò;E„Žn@pñPŸh Z@pñis^$§@pñW<Ê@pñ˜Jòý4@pñ¹ß’@póîX¦Š@pô[C˜p¤@põ§5l0@pö•e-QÉ@pöw˜iЈ@põýQ­”Š@põèîÈæb@pö8ÂÛ£@qÛm¦ë @q×#V6Í@qÓ2){Oô@qÏ-ƒ+E@qËû°¾ï@qÄVöÞ@qƒüº‘@qÀ¹õãªð@q¿1+;@q½Ñ^ï/­@q¼ÄŠ Q@q»4hò±¨@q¹èKej@q¸½?쇚@q·³¸(Â+@q³¨G89@q¯‡»\•@q¬à—ºV@q©&‡uà@q§ X,Z]@q¥Ê{Î@q£UY ;u@q öU+¨@q™Kö-Á@q’!Ãó»d@qŠšþ-<â@qˆ…èò@q‡¸\û‘Œ@q‡i+E—²@q‡É;•Ç@qºÂ×9@q“"®ôÍÄ@q˜4íAÑ1@q˜’jî‹à@q•첬ó.@q“:½¤áý@q®"…t@q…çû†WJ@q| „x°+@qr(„@qi.©¤Ë)@q`Î#OÏö@qXkî!Nø@qPÈ©öz@qK¾ ¯#Š@qF±˜ê$Û@qA¢õ8Œ#@q=ûh­ƒ@q:®¦`ü@q7^G.É­@q6€Ä`ö@q:´šn>@q=œý*ŽL@qA(¹F'‚@qBA"Ùuª@qBñZF{@qCyPS“I@qB°*¸Ê@q@8}f&@q=£œE.@q:‡˜òëR@q3Ö)ÕõÜ@q,äNrpŠ@q& ^ Ù@q¦-åuB@qw¼7C@q—Õ£ÒÊ@q5ˈ·@q ¥Qy²’@q×í‰ào@q"£`}@q•'nR(@qõ°¾¶ò@qkVäNx@qõÑôï@q‚Höi@qÑn‚×f@qŽcfJ@qEÙT@q4½„ÿa@q»¥ñ•@qFÀ$$ß@qÕù/Šô@qüœ @q •Ï@q`e‘]@pþ¼ùSVÝ@pý*‰4U@pûvÌ/€@pùÁ, m@pø 4ôâê@pöNÞhÜz@pöFk7QÀ@pö^a·Ï@pöuzt>@pö‹µÃòû@p÷;r U@pø`PÉx@pù ‘s²@pùˆO™|@pùǘÍ[VE@qBl¤@I@qEM(Á¶¨@qHzɪ•@qHð²¢F…@qH°{{K@qHWE|I@qG(É÷{@qCÚ¤›š´@q@}z†Z®@q=窖a@q7TÝ:@q0Y¬ß@q)·‚8|þ@q#O×µ @qîþA®J@q¦Äª@qv²y­Ö@qwð1¦6@q ÓåŠ@q GŠTÍí@qÒYÝ@qˆ„ÝCÝ@q3çÂ@qÆÍå¸@q ƒd£~@q ÏÆÙ»V@q õð1N@q $—Bçu@q :×hŠ@q êÈîûè@q ¹/9¡Š@q xI!Œ„@q (H7f@qƒ© ô@qÞRþË@qTè”~Â@qæ÷»@qHx# §@pÿ‘‚™Œþ@pýØPs=×@püØÿ×5@pû#‚P¶>@pû;‹v[ê@pûRÈþð@pûRôEnn@pû^8]|@pûÎ! ˆ@pü]Ù¬Ôù@pü´ÒÊÞu@püÓê¯r@püÊÖ€~@pý©ûi¬@pýʹÔ‹@qæAÅQiÅ@qâ}?—ŸÒ@qÞ¦Jò#ò@qÚ¼‡ù‰@q×¶À"SŠ@qÕš% 1@qÒ„o°eN@qÐ-ÒHµ4@qÍØ{&¥â@qË–§†‹å@qɇ v*@qǪ‹ì|@qÅó†‹]ñ@qÄ>èØú@q½k~@qÀý’ÅkH@q¼ÉÜWõ@q¶[#˜1@q°ƒ—D+y@q«EO‚uÏ@q§ÀeŽž@q¥1ýÀõ@q¢¦Jv}@q UËV"@q›¬³‹›J@q–>®ºs¶@qxërÈ@q‹!%­¬@qŠù@7Ï8@qŠËAY®@qŠ—Y±Ü@qŒ—¨æ˜@q‘,¾’²@q•ñùãÀý@qšè l4{@qœÖc]@qœEV@qœ+VtÛ@q™ÿŠ@q?’¡ÆÔ@q‡Tź"î@q~\CŽ6@qvUF¹Ë÷@qn‰"i¨ @qf°Ý™*Ð@q_¬,w(@q[çˆ@qV`ôžÀ-@qQ¹“g9:@qN Æèað@qJ¬f¦ƒ;@qGO ï­ @qEqf @qH ªF˜@qJ²*ºà@qM'ƽa4@qMmJÛé•@qLÅy@qLRLHÞ@qJÀ{q[(@qG&£êHk@qCpË„ªp@q?Ÿ&‹Â8@q:8`v[À@q3·¹@q-M%p#@q&ø3Îiñ@q!²éÈ6Å@qœy@ï@q&øZ@q3*(jd@q·±“¥I@qS‚Ñ"@q BàÇ@q É\T*@q ¹°#G÷@q €ÄÇ;â@q [Ë>.@q Û±l~@q ÿm©óÂ@qAé ³@q©-ˆÉ:@q¿ÜÉ@q~YŒ@q.ʵ¼@q ÏM_8Ò@q Êav~°@q ?$§¤@q ÏR©X@qz·Ót@qo9³@qc&ñ÷ù@q¨¼_‰l@qì&¡Ý®@q-\Œ_@q öË3$@pÿÀîQÙl@pÿ„§´R“@pÿTîD—’@pÿsų.@pÿⶆ[ñ@qœ9žL@qNž-Ô@pÿâš©ü3@qu—q&@qÿ×oåá@qëå#J[Š@qèEdÌe@qä{R¾Š@qàÛKàTõ@qÝÙ˜–+@qÛ¤Gu·@qØU°™Ä‚@qÕÓzX¦²@qÓ,ƒÅ^@qе„ò\~@qÎpœ“(²@qÌ]åX!¥@qÊ—gÿY‹@qÈÛì‰×©@qÇ%;X°a@qÅsY¿+#@q¾Ñ @D@q·?Ãoãh@q°¸ü´í@qªý2À@q¦Íå™È²@q£ëÑi@q¡/v®M=@qžnÔ4]ñ@qš5o"ˆ@q•>—°b@q%ä>«G@qŒ˜üí@qŒ}ºåB@qŒ\æÈ„Æ@qŒ6r†ô[@qŽ®>×_Q@q’°Ne“@q–áÌD@q›9®TÑ@q3œ^$'@qžØt³r@q 'MÛM|@q7úœV@q”§¯ f@qŒ G6™º@qƒ^X”@q{æÖ—³y@qtŸ‘z@qmL€+,Ì@qf¸µct@qb³ª¼@q]hY)É@qX¾à%c”@qUwå!@qQÞGÄÄd@qNž*§ÌÄ@qL]‘ÕdY@qNW>áC@qP4¬]õ[@qQöN?Kf@qQÿ4ºAü@qPñ+Øp@qOË%;h@qN~;x(@qJŒìDS”@qF€= õ@qBXY•=Œ@q=I":¬Š@q6ÿU@Þ@q0Ë4¤ªÇ@q*¬TÚ›³@q%_%dñï@q xÁm"™@q©±Ö€Q@qñ*Í@q„6DúB@qGwjß@q!Fú!@qq<¸RË@qAüÌÅ@q&pæ””@q•·Òû@qЃWÔ6@q2ºÝ©@qŒ‘ÿÙì@q!)}=ü@q¡!ê^F@qPò«Ø®@qòêÄ<@q„¬˜²@qõ:\÷G@qƒ™ X@q-3on@q ñ›õ @q Ðjc_÷@q 6=þR(@q zk˜@q«Ù2¸@q‚¦¬ê8@qþ*è@qÛôÀœå@q¨Õßì@qŸfá–@qfïçý¬@qž`^M@qµiÖú@q•ì¨Cõ@q@¯»@qÃøG @qÕy±¿e@qñOí?—@qíѨÌ*@qêEľ@qæø,Ýj@qãΟgVV@qàσ¡Ü©@qÝûF5 @qÛ&¼ü·f@qØL‰Wò@qÕ¡œÁ€É@qÓ(Î9H@qÐüa¿,%@qÏ5b(Dä@qÍs#ÑÈ@q˵©G@qÈæ`˜X@qÁŒÊlUÈ@qºç1ía@q²’óÔ”V@q«ª¹qÜ@q§  «h@q¢a¨T@qŸ’“M~@qœuÂò»8@q˜®ÄyB¾@q””R¤nÒ@q%iìç£@qŽ9!Æ@qŽÀ \o@qóÕùØ,@qÚl9ð@q‘‚†Ba@q”hü@q—£ào1§@q›dâî»ä@qž¼<,øy@q¡À1Ä] @q¤oút3Î@q¡ar€¤Ä@q™ŒÓ³Ý@qÉ Ðb`@qˆi…?÷@q…˱xÐ@qzÀ|=à,@qsï³5O@qmܨ6=@qiúYø±@qdovÜîâ@q_Ãîþw@q\2cLˆd@qY ½ÊÂS@qUê;!²ú@qS^ßÒˆ@qT§ €|@qUÓÓi¡;@qVå[©e@qV¥×|&þ@qU4±-‚@qSªùr.Å@qR Ãy9v@qN µTš@qIªôÚý@qE.”s©•@q@Edéð@q:1VO‡Û@q42S‹:@q.H¬x—Y@q(ô{WŒ@q$=­7ù@q¸ª$­@qP‰ì“@q:Klfß@q$EÈ,Ý@q&ºåx¡@qW §½)@q×,Y…@qÀü­BÍ@q¨0žFF@qŒÕe1¦@q¿U@q±¦Â4@qrÙÔ2W@qWM5@q1s‡àÜ@qÃç:Eü@qHü|@q¾Fî@q¬ÚéUÄ@qozl‡­@qL•µw @qCȸÃê@qïÕYõ>@qºÔXÉä@q Âà-å@q njÊþ @qV—Ôä@qé¼…Cr@q¿&¦oÑ@q é/@qŽÔ² @q¨ ÜÁ@q‡ ™Å²@qH“ôk@qÕ–¯@q- Í+‘@q°Ì๿@qöÇWAn+@qóR¬@qïÛ=‘5@qì—it@qévx92@qær’'H@qãv†÷œS@qàG`»äÞ@qÝ:œJº@qÚ\~Ø@qׯ ØN@qÕ›gqù @qÓÍÂÞâ@qÒÚß§@qÐ@±³@qËšK^žH@qÄ`]Ð@q½OV×@qµ¦¥¥}O@q¯Ä' ‹§@q«AÍ×0@q¦´©|9@q¢ 3h£@qy@V˲@q˜ÎÞI@õ@q”=+!M@qt勹V@q™ vÙ“@q—1 Ÿö@qïêtŽ@q‹e÷@q’C.ê®@q•( ‹@Ñ@q˜:o‹]ž@q›ð&°;¼@q ´ 5 @q¤ù„¦ˆ'@q©îh$”@q¥™(Ð@qœ£ã"{@q•“Ò쉞@q~TTK‰@q‡1Û~dÒ@q€ëµ"Ø@qzšf/‡d@qtÏé¾J@qp#(‡íÖ@qkvƒõ.Š@qfÈõÒµ¯@qcCÌÉÆ_@q`;Ñ’@q]3‹ßïü@qZt„Rìj@q[rêŠ@q[ŽÒ@ËÙ@q[óûªN@q[`¥6ýÑ@qYBM¢@qW£ó³@qU¢MPJÄ@qQ¥B–¼@qLð%Tƒø@qH ùŽô@qC-é‰Ü@q=N‡´æ7@q7„ ªÎ@q1ί@q,sÿrÒß@q'ë¶Æ8÷@q#^ÈäD@qå=x7ì@q›öF@q¼šYË·@qþ¦^@q”¦_1€@qv“ñíY@q]i#Œw@qA¹F•@q#‘4\@qè]Ǫ́@q²]e®@qŸ|8«@q¯V,æÔ@q`„«.@q£]È@qgL~‡@q¥€o›@q»¹Š-á@q—¤´Ê@qNʲ߇@qãÚw¼@q›_2új@qŒ2O8†@qhöWg@qOaË’I@q ?BŠl @q ê·½Ò!@q ÈÛ²`^@q ³> -i@q ©±š r@q ¬ ü.@q b?)@q 0$d@q ÙŠŽ2‚@q ¸}…‚@q |áˆ\›@qüK8=â7@qøà3ˆ>@qõb„ &@qñþla¹ë@qî½­<@qëží†G¶@qèƒEn¡o@qå46Gb@qá÷ÊÊš‚@qÞç§ñäÝ@qÜ ïa–é@qÚ5Ŷ@qØ`Õ·l.@qÖ‘]8½@qÔÆž’J@qÎf3ŸÝ'@qÇK">¾ @qÀ_µHÜ@q¸ÐtPøA@q³ç¸§â«@q¯tôLk„@qªøbø"@q¦p¥ðZP@q¡ÔRˆ—@q1¸áË@q˜Š†ÅÒ&@q“Þ¹ÂA@q“å*¡5@q’@¿§Qò@q‘˜—@q‘–L›zå@q“ÄçyX@q–‰ºì@q˜¦¨’A2@qœØ^ñ>‚@q¢Õ.ãr€@q¨ÞZ>ª@q­Ýá^]v@q©ÞÃÈŽ·@q¢*(mÈ@qšig–?Ö@q’©îRB¶@qŒêÂ@ Â@q‡!ì¤"@qLŒxìf@q{Ú†iä@qw,t!«i@qr}¶®˜@qmÎ*…ä˜@qjS÷F˜´@qgfÜ2@qdzkÿ¸Ñ@qaž *@qaŽ–¯@qadê/ªî@qa!K4¦@q`/1 9@q]ü›¤@q[²Ò©¨@qYSkâ©¿@qUU刃l@qPO¹äs@qK.¹$¡†@qEôñÿiB@q@8ÞMfª@q:V– ?œ@q4‘ØUé@q.ú¶Sb‹@q*‚ºñPf@q&;rS¶@q"$@G÷~@q¨íD\e@qæ,!@qÆS7ø@q–ÄÜ:@qÛGe©@qûÂ,AÅ@qÝ;&ù·@q¼R´kù@qšDµ—@qà?I@q¨?èû@q â×€ª@q"ÌçÔ@q!9õ$0@q øG¤±@q RÏm@q3øÈ@q³·Á@qEéß2@qún"dò@qÓO Ê@qSYè´Ç@q7ÜWÝ @q%õȯn@qt–|Ê@q(ØP²@qÆOír@q¹ p,@q·õÉ @q­¬¹I@q×Mï¯@qÜ“ª *@qÆð.î…@q–Á’–î@qLaƒª@rÛjo}+@qþjŸ®Ým@qúÄðy^ @q÷AJõ)@qóßÿÌ´{@qð¡e§ Ô@qíCWܲ@qéàÔrÇÓ@qæf;ã3@qãR,ö^@qà¨äzåç@qÞɉíÖJ@qÜîä$ä±@qÛó&àî@qØ03f&@qÑI;¯Pú@qÊLƒÜ<¶@qÃ9‡q@q¼nÎäÄ@q¸>—¡\@q³±öíå@q¯D¾B¯r@qªÊþ¹†@q¦3`u l@q¡˜hí—b@qœøý‡9@q™Bm¹Þ@q—üY¼ @q–úµ\gþ@q–†Á›@q–.£â@q—€åëŒ@q™!ô7@qš ð»@qžÞ«D~t@q¥Ml¨,,@q¬ ’Ÿ•@q²þ®>µä@q®1õFÒž@q¦ÃŸ$A@qŸI–+ƒv@q—õÑ…Õ’@q’°B}¥@q`uoNi@qˆ ÞX@q‚æRGX@q~6½¸š@qy…EJȈ@qtÓÃ~+@qqc$ý•Ñ@qn|öõ@qk¿)Ua‚@qhï ˜ºÄ@qh%Tsw@qgUið @qflvŸQ@qe¼H—4@qb2²gkP@q_y$Ö„@q[ðItÓL@qWš‡B\@qR M×Í@qLŠ]ƒÆn@qGgÝBÿ@qA„ö´‡@q;êÛ™:@q6n Qª@q1÷Oaß@q,ÍDZõ@q(ç%Ò0k@q%0w/7 @q!¨w­S @q Qc~à@qJª[]R@qs52Ò@qËŽ¨sˆ@qœ„u…@qz”R@q W%ÓÇ@q!1Jž@q"KI°Ñ`@q#ŽBi@q$òôýù@q&y kz6@q&TË0 @q%¤×õ5@q#âœùÂZ@q"¬¢á?Î@q!d|,&B@q õë~@qìùr¦>@qæ Џ@q¹LxŽ@qüÛÁ/J@qòZnV@qñ• @qùÄEKø@q·XÕ©¡@q²Á¸ƒ@q¿“‘ž@q`7^y @q×°} @qóéŒ@qÎ ¹¡«@qŽÕ²¹í@q5ÊGKÄ@rwÌeA2@rÈbqq°@rëðÙ@qüaüÞÊ@qøà5˜EÒ@qõw„ ›‚@qñð  Þ@qîzVõb²@qëôF@qçĨ+@qåšš0\®@q㥠‹ª@qá—4؆@qß›ãª8@qÛ B³ˆ@qÔBÒ‡J¤@qÍcõ Ö@qÆo=¢©°@qÀ— Í @q¼L|š—@q·ø|²ô@q³š¶‰–ÿ@q¯%ë±@qª–lKu@q¦ñœ,@q¡k&þôŽ@qž3’/47@qœÚÈE>N@q›šÚÔÅÐ@qšsõ+ö@qš“‘ñ(@q›Ãü`F@qÉ0Í@qžb+v˜@q¢F?Nn@q§rº•t"@q¬ëÒŽúã@q²²ˆ±‰ö@q­a9nõà@q¦æVâŒÑ@q UZTá@q™ïŠ, á@q”þœrÍ@q‚;¤@q‹"ÔXY@q†KˆU›@q•Ô¢”t@q|àD*²Î@qx*µžìB@qt‘s+üÐ@qq(M¥L@qnŽ+hõì@qkŽayn@qiä®°æä@qhZU5t@qfÌ^Ê=`@qe,ÌØ©@qaæZßâG@q^Ì£±ü@q[´é™¤P@qWÏ+íBŽ@qRw)¸7@qM1$e@qGü¤™¶@qB³ÞÒm~@q=bNè.@q8-1Hç@q3#5ú@q.éÅu@q+crâÅW@q( ‚“Þv@q$ásÉq@q#U8[ÐM@q"ŸGÚrh@q"&/2@q!¿_d–@q">mº¶n@q#\¹% @q#ô[T0@q$Ë©­"@q%å§<Ë@q'Pgôd@@q(•=ñX/@q)š°–ì@q)ěж@q(ŒÐ© ~@q'W'ñ‹ä@q&#‘çS@q$ñüNJ@q#ņoX@q"»ÉSíó@q!Ô¨¤_Å@q!´ˆÃn@q¸Wnc@qµ‹Æ’Ê@q¼ÐÕA@q˲}Ñ@qä!Š«$@qb-ŸòŽ@qïõý@q–ŽP@qòl":@q"ÆÍ¸Â@qîp*…‡@q Ls’è@q8¯iù¹@r A†b@r bIã@r €ºÛž@r^Þ9S+@qý¾Â83@qú$8ØÍ\@qöŠoå+@qó`1a¦@qïŠf{já@qìoÍüx|@qê®…šÅ£@qèÕŽ³Ï«@qæäœU«ƒ@qäÛ]Æu7@qÞÖü^æ?@q×¾U×8u@qÐñ´ä@qɺG‘@qÄÉW$7@qÀ~ o@q¼H`—ßi@q·ùȆ^N@q³…˜ø<¨@q®ýxN œ@qªqV‹æ¬@q¥ácxÌ@q£4©|o¯@q¡Ÿ&‹Ý@q "MŽ@qž½¬Cò@qŸ?[xh@qŸò‚£\@q ÷Ò±™@q¢\M†@q¥YG>HÏ@q©Ip©·÷@q­„üˆ\’@q±íƒ16m@q¬UÞq@q¦PF‘[@q Îú5@qš.€Š‚4@q•(/úäý@q#«iq@q‹ Ðmjö@q†8©g @qt ´1@q|¯Ž‡…`@qwë³È@qtOÂõ×D@qq^iÝÿO@qnnW4YÔ@qkpå@qi®°hòb@qh o¡ÇO@qff£‰· @qd«Ÿ1/¹@qa˜-è’¸@q^†Ë ¾@q[w[‘Bü@qWó¾ð1õ@qRÓÓcD@qMÅ|‡4û@qHÈue@qCÉ! Ý@q>½Ü\݆@q9΃††\@q4úºp"É@q0ÚLs™@q-±Õ?‘@q*¶íw@q'épí@q&+ôµsS@q%ÅkÊnë@q%Œé‹{6@q%‚¿8”@q%âÜ'“@q&¼zO@q'šÇIK@q(¥"FÕ¼@q)¸bÙP@q*îÜÍê@q+æRµªo@q,Ÿvþò@q-ò?%â@q+üŒFìˆ@q*É:Iþ@q)—ýåÿE@q(hÈeÑ@q'QÂæL@q&gàñ|Ä@q% *úº@q$ú4a ‰@q$j­áBº@q"oQ-pk@q }-f<@qŒ$$”´@q~¥Š&@qøó´LÈ@q‹ZA_@qô¸–m_@q5•5 X@qNo™£p@q'·ÎÊ@qÊ¿²DV@qT©ßõ–@r)H¦@r hï&@r ­Ÿ$o@r;–÷Ê+@r|“K´@qþ¾‘©zÊ@qûÞŒ-0@q÷v‹úÜü@qóì®Ç9-@qñàÞÙp@qïÚ=Å€€@qî]½“@qìH÷lzr@qéH‚+õ@qäH’¤@qÝéî0Ér@q×Õ±ªš@qϧÿ+T@qÊ>0-[ý@qÄ×ìÖ:]@qÀ¡a¹G@q¼aÕ6 @q·é•»j@q³hˆà’@q®ãPÂ@qªZ¨Û>@q¨|õZ@q¦J^õÔ@q¤‘V34@q¢ð©³»@q£Yý€@q¤ Xä÷¤@q¤ÓdHŠÖ@q¥®Qu©}@q¨³¥•>@qªÔ ê‰Ç@q­ØOŶ@q°/7 µq@qªÔÌ\,¢@q¥eÙ"@qŸá<°ˆ&@qškÚoþ@q•O½Àç@q6<ö¨á@q‹]rZè@q†%Jø&#@qRL <@q|~óÀ…‚@qw«Ø:°@qt H¶:@qq,ˆ1@qnMàÂØ@qkn«ÜB¯@qi{ǾP@qgÂ*RÉ@qfóØ @qdDIŒ9$@qaH7Öj½@q^>ÿ‡1@q[7®ÞÐ6@qX¾ûo@qSÓÆ–²@qNH&±LÏ@qIvEÊ@qDÄ­u,@q?þc‚³@q;S‚ˆF¨@q6ôÈ7@q2ŸüT‚@q/Ó´‚Ï@q-4.ª(@q*Àýs@q(ÖõÍø@q(¾./@q(ÓK Ük@q)/Z²š@q)å2á@q*ö„6@q+ü­@q,ö ¿‘d@q-ä²·’@q.ÊKA‘î@q/uˆÀW#@q/ãÔPî@q0Õ‘Ëe@q/jŠk@q.8ý=;Ý@q- ˆø@q+Ý5*Z@q*¼ ÂÞ@q)ò7¶É¬@q)I‹·Š@q(Â5dªk@q(vŒ“$ @q(]w’,@q'v¤P`@q&p‹@q%J?ÕF@q$ú0É­@q$-M8@q${gòSV@q$¡QÚÞ°@q$ŸÇéÄÜ@q$w>†ìÀ@q$ ÐO".@q#‰Zµv@rjzò_û@r°é~°@rà‰¹út@r ø4£Fo@r;Æù¹@rG'¥`±@qÿˆ3Ó€;@qûÚoîÄJ@qø=îL²_@qö§­yY¤@qõH}ôH@qó|¡~¦@qñÃÒ$x@qî¡+À78@qéÿîA6°@qä»¶$å@qÞÒß&’@qØÛ·Ãåƒ@qÓÈÙ²c@qÎo\ä@qÉàøÃ@qÃAZˆ?Ä@q½<ÜÕ@q·×£þ–m@q³YÍ íQ@q¯ 9d@q¬èöÂí@qªÝQ3ã @q¨éa”{\@q§8tÄÃ@q§›³e 3@q¨=x-²@q¨œ1†¦ª@q©Gð<¯@qªŠX 8@q¬ßEµ—@q­çì(Z@q®ŠÆ©Î[@q©±Òr²ë@q¤Äl˜u@qŸÂW*l@qš¥#:2@q•uT׌Ï@qGCü=@q‹Ê÷9“@q†pt@q/àù½@q|NqU@qwm€@qsÊQÊT@qpùŠÔ‡¯@qn*E2^í@qk\íaÎ@qiKØøL(@qg{6¶rÙ@qe§+i‡@qcÏ«¨öj@q`ö„/èg@q]õL³@qZõò}5@qWø\Ë^â@qS[¬æ¨œ@qN¹žÜT›@qJ(= —a@qE§Kjqå@qA$¸Q¹@q<½ ¯»@q8oüM°Ý@q4=8Œ¶¹@q1Êf¶&µ@q/„©çÝœ@q-t&zå@q+›—1¤ç@q+×;¢( @q,uTŠE˜@q-Où?ÀÊ@q.f²‚• @q/sD¨¯@q0h†ö5ä@q1RvÙ¯Æ@q214ÛžÄ@q2á0FGÒ@q3ATD£ @q3e<²‘N@q3Maÿó@q2ÕY‚@q1¦šòãÇ@q0yû‹äÂ@q/Ol\Ø@q.&ÞÇ—Ø@q-[¹ãgÐ@q-M“[{á@q.#m.o@q.óò%¯n@q/’VáU@q.’8Qt@q-rà­e„@q,4£AwÓ@q*×Ï Š]@q)öÖ÷¢ó@q*)f´¿ @q*4™7d@q*å@‹ô@q)Ö»aþ@q)i%æ%@q(¼3â~6@rÛoùœÖ@r5êçõ`@ryùØ“@r§@ö•@r ¿‚ÙtÌ@rÄ ä2¨@rí”·’@r-›ÄÁF@qý@*Æø@qûæ¾öÎÉ@qúw3îÔz@qøñJ˜»ƒ@q÷TÀÓ@qôN)@qðŽäbK§@qì/eüúp@qç.$+ÝÊ@qâEÿÄ*@q݈žÂQº@qØ—»/w@qÓrÆ“è|@qÍ€öv z@qÆäù­ûb@qÀ”¡¾þþ@qºF|â@qµ‘qgK±@q²u¥ Î@q¯Œc«¾Ø@q­+ ⣵@q«¢Æ¦@q«Ê!´@q¬äöI@q¬Rã£ø@@q¬“óÂêa@q¬­£AÊP@q­)-7@q­µÓý—+@q¬ÿ]·ÏI@q¨¥YÑÂ'@q¤7@£¨U@qŸ´Þ^ß:@qšÜø¸\»@q•™†‚•@qVÌãëÀ@q‹!YÆ@q…ý%•@q €Rl-@q|ïAõ@qw.‡T<5@qs†56n@qpÅxÖ¼H@qnGÝ4@qkGÚFâ@qiÍÎt7@qg7¨´‚ß@qeM*p+~@qc_G ª @q`£¸€@q]©¾WH“@qZ²2Ò„@qW¼b_9@qS‡Ù Ã@qOhçá@qJ½Vh @qFpk“Ý=@qB1£ÑЋ@q> ^ @q:#äE-)@q6TKVr<@q3ûT™/*@q2#ð¾@q0n¼*ñ²@q.Ûm¾`@q.íâ å¨@q/òhÇ¿,@q12wκ@q2­£Hð@q3ú¬8m@q4ßÙ²¬£@q5¹öÑÏ@q6‰üÝ@q72g½@q7H?ZÛ”@q7#)f Ú@q6ÃiWµ$@q6)ƒ0f€@q5;¬8b@q3çÞµÈ@q2¿–÷Èç@q2©šé<2@q3ÔØ©¬@q3ٞþ@q4ª*ÌÈR@q5v Ôh¾@q6<ÛWÕ@q5ËïÙ.@q4”ºt–@q3=ÚÑ)!@q1ɇ…t¼@q07ccFì@q/þQM8@q/î¼y®-@q/¹‘žV@q/]„Àßð@q-¹?ùàG@q,: 0@rbŸÙî@rÐë“?@r)+ó<½@rjÑ|0œ@r—n'y@r °”x›M@rµõôÇ@r§A@r|¦mw@r<¨”¦Š@qÿç–:”@qþ|’¸ÈM@qüä”ᔌ@qúŸüÖ7@q÷¿9‡‰@qô@ñ«n@qð#µG¹@qëåŸî”Ù@qç|SÇN@qâàŠz.­@qÞ¾œ<«@q×o…ÚY“@qÐ? Sø¬@qÉY¿þ@q½´Ãm¥@q½»JûH@qº"†ºë@q¶¼Ã˜0®@q³‰þ®é@q±[ÁÖZg@q°ŠJ„º@q° ò»Š@q¯á÷ ¶®@q¯Ê‹)@q®…ã_@q­ÂüF@q­Cí¤ê@@q«Œ4ýS4@q§®±dÊ@q£½r¶æú@qŸ¸NøX@@q›•dIõ@q•ºä‰¬b@qdãpÝÎ@q‹iTW@q…èQ£/=@q€ê謹²@q{í®“!Ñ@qvðgË 2@qsAEâÙ­@qpX͵A@qmà•£¤q@qk1çS@qhôŽy°@qf÷U²¾@qdöÒC¢ì@qbòøˆ(H@q`N{/H@q]\aQ6÷@qZl}ï¢s@qW驵d@qSÁ$nf$@qO£ãè!@qK˜šyÂ@qGŸ_ÔM@qC¿¹Õ“ @q?üSûM8@qú@r‚Ô+@r•ô×@rþ¢}^,@r’Þ>x@qÿŒÿB¿k@qüì…Í-@qùŸE1@qõ¹tþì@qñ¢à¯Yz@qíZІ®Ž@qèàÇåv@qá‹®Ñ@qÙMF¾@qÑÓõ0ÛÇ@qʤSp¼@qÅ­î{<@qÁ›\Äà@q½ºÍ‚ßU@qº c¶Üô@q·f°g4ï@qµ•«b8@q´âÜ”>@q²êž¼¾ª@q±Xx]Ë$@q¯iîT@q­¶{÷8v@q¬@ÀñÜ@q©—™‚.@q¥«¬Üêz@q¡Ú³eóŒ@qž$˜Z@q™­„P:‘@q”k¡öI>@q.Ú‘Ü@q‰÷j ª@q„ßÝ%.+@qâÚë…z@qzåúè@quèX@qr0¡ÿ†ÿ@qoA’þ¿@ql÷•õbß@qjoö @qh7^3¡…@qfAþÚÊ@qd^ËGö¸@qb²¶@q`.^@q]aȈP¼@qZrÖú@qWßâ|ëÏ@qT{€ô^@qP–ò‰’Þ@qLÄ}AÖ@qIaï@@qE[|n_×@qAÔšoúÙ@q>e´ä¡e@q;“ú{@q8v½á07@q7(‚B®ë@q5ûO˜~@q4îéìì@q4qH°Ï­@q6=›  @q8C1Ä›@q:‚¡±w»@q<ú­>|Ü@q=îšêè@q>©Ê™Uð@q?Z„ p´@q@á>öd@q@®ÒÐ@q?a'•…@q?Ü$W š@q@Z(C@q@Ù i=ì@qAp7¢ð@qA5UÔ @qA-{в@q@Ùcu”Œ@q@þO\ÿh@qAÅê›Þ@qBˆ³j`1@qCF¼)Ýi@qD~Á¦@qC/ÔÜí @qAªV8¸@q@»ùa8@q>HEó¸Y@q;œ}Ä<@q9ä/@q8EñÈ1Ô@q6vÏêÀ‹@q4w,:Ð@q2Gz7…@r(²0a%²@r%Gn•ø@r!Æ¸Éø@r-ˆaÐ&@rÞ4ç@rÃsxµ@rñÿo:@r'÷y–@r¡ìäàV@r ‰‘^@r ’Û‚^@r 7ÆÇ@r ‚h¡ì„@ròl`H@rô~ :±@r.„â}|@rUŒ^C@qÿÀn®ZÈ@qûû?öpS@qø’¼Z›@qòýY[˜Ô@qêcjêV@qâŒ7p@qÚº¢®@qÒFFáq°@qÍk­n–@qÈáFø‹~@qĈÍ$@qÀ`>„fƒ@q½WÎÎÆ@qºLÁ»à@q·Ñ÷›©‚@qµ¨.¦³@q²í(‚[A@q°zt2;@q­WqÊ!ã@qªæW_A@q§.%vÂv@q¢œ>LîÈ@qž$½¿ãø@q™Çþ¡ð@q”Ëd:–n@qKø­Éâ@q‰Ñ|lžR@q„[ÁMn@qDãK@qzykÊ €@qu­¤#±O@qpákô$@qmš”ß¾ˆ@qk±a¼ÔŽ@qiÕŠàÀ$@qhý©?@qf_Ëð6I@qdá‹^œ@qcuVÂ@qb_ÄÉ?@q`"%Êj@q]vkê@qZÒ,!Â@qX5Oض™@qU%ØSE@qQxò þ@qMÝ\PÌ@qJRìuD@qFáö:‡@qC•Ö=î@q@a½–F@q=E;¸Éû@q:…´N6@q9zJˆ¼0@q8[w•–@q7ıM*á@q7·÷¥@q9þØâk@q;uk ,½@q>(c+@q@êðµ¯ò@qB…Ä lK@qC1ÖÞ¾J@qCãb¬Ä@qEns¿B¦@qFÍ&€rÞ@qGHo…3h@qGÆÔð Å@qHHTA3z@qHÌëf…Ä@qHÿõ÷á^@qHåǽRw@qHžXù2Ê@qH*Ý+Û@qG˜ ë@qH[G‡-@qIg©Ø@qIÓ!Dö@qJˆVÝi^@qJ©„æÈ©@qI ¿ìƒ@qFC£Ég’@qCN µÓ@q@ir@q=ð[ªÕô@q<0m c.@q:@)ÊÿB@q8 z;f@q5Ðx4"@r-yákVŠ@r*"E$Té@r&±ûÉÑT@r#+ð|@r“ÁŸN:@ré,YòÜ@r+éjD"@rGÍwón@r¿L¯!“@r9N8@rµÊáœZ@ryk¤ o@róBA@rik­e@rÚ͸ã @rHj_Hö@r fN>­Ô@r ùŽÈÈ(@r„}ÁO©@rßç¿’@qü“câ°@qómn¯æ@qêŽjîUä@qáöp"zš@qÚ&’wjK@qÔö:ËE@qÏõÝ'ç@qË&.7af@qƇv½,@qÂsZŠl@q¾±»À-ü@q»?ƒv¸@q¸Ï'@q´?ÏìÙé@q°bz¤–@q¬¿± ã+@q©Wju@q¤¥éÄs@qŸq1}r4@qšVVt·@q•U)'¨@qâÓ€ @qŠ'í…"@q„p±·@q~½¢j±8@qy«Ö©7‹@quõê@qpu°$/,@qkÙèAG@qhüŽ~¼h@qgÉòºP@qf¤\qé¬@qe‹×Ì¢o@qdyàêëþ@qcpzeM@qbx~KËÊ@qa‘ë=—¾@q`±~ m@q]ƒ÷êQ@qZÿ”jŠ@qX‚qÑr@qUÀ¤AF@qRJbM½™@qNå c¡œ@qK¸ø,ñ@qHQ¡•U@qE@ ZsÎ@qBF)´EÚ@q?cAOÁë@q<—(«ÒF@q;¬úw×@q;2­â®@q:y*m]>@q:¶l\÷@q;ªI¸è.@q>o´Ú¤y@qAl‹Ë:×@qDë Ìk’@qH$TŒ9MݱŽ@q;øõÓV@q9‰Ì§qx@r1ífð{ö@r/À±@r+°uÇ*@r(=Qa¦@r$¸`‘š@r!!a’àÀ@ró*܈h@repˆ!@rÚOI¶@rQ¿K®î@r˹¶\@rè^j63@rh)>Ì•@räx("@r\»‚@rÄlD'@rSAÁ@r™Q´@r î‡ZÂK@r Ô×NG4@rR@qAi[sDê@q>Õ‚üÞ@q=ÁqÃ{@q=W½Ö0¾@q= FÁϦ@q= Åë6–@q?M$ý7í@qC\q¶ô@qG`ï´8¸@qK\ ûå"@qOB@Ȫ@qPØ‘^ý@qR}Q‚Õ@qT/É*À@qUðšÖ,`@qW H™Â@qW’ o[™@qXð´óX@qX¦Ñ•ð@qY5Lép@qXÌE0ƒ¢@qX&!«_¶@qWT«¿mE@qVX7Ÿ×?@qU”HäT@qUõRkk=@qUMoQŽ @qT›KÃ; @qSÞúgôÜ@qRbœ ã@qOv~_’@qLšßýOÔ@qIσsY@qG-'‰s@qD“êþÃ@qBagÙ‰@q@‡êö@q=rŸçœÚ@r5J*Ù¶@r2¾Ê·¦@r0¾¡†@r-[:3I @r)ïxÒ8@r&kÒ«üþ@r$J¶õ@r"€éÑ¥p@r ó1Yw¡@rh/Ú»@rß™‹uI@r[‹ÖK9@rá4Wäu@rc*f/+@rácI¹@r“y¸³@r.Ïw,@rÚMaÓ@r•ö> ‚@raÏ–“@r sÀ¤‘@r+ÆÊ„@qø½ ‚?h@qð(5„q»@qé½ø@qãu¿¶s@qÝ‘¸î‡@q×Úo&ëJ@qÒ¹Ñ5@qÌ/SõS@qÆŽ®\8ì@qÁ:·Lw‘@q¼M~l@q¶&ZuQ@q°m Å@qªì(„­¤@q¥£‚ðÆA@qŸ<4¾X¹@q˜ÊëXÞ@q’rr…;ö@qŒ2…ûä@q…þ‡”HR@qÍ~Âɬ@qy åF…@qsxÀB@qn~¨Í\~@qjBŒá@q`æÚ‰@q`_ajO@q`„^’W‡@q`^+¿œ@q`H§1–@q`Câ@r²@q_Ø Îø“@q]Š”Oyþ@q[D,ÉÝ`@qYÃÝG£@qVÉTµ½@qS½tñK@qPÁù‚ãì@qMÖÅ —«@qJû¾lyÎ@qHSÃî@qEÊà¹3S@qCX9G3@qAˆï²jÅ@qAB|ƒð@qB'Ѱ„@qC+´n=X@qDN Gj×@qEüÊð@qIù3J I@qM죪~@qQÖš½Î@qU·C›4@qWüÀXé?@qY´ÁŠâÒ@q[zϯØÅ@q]Nâ¿ñú@q^ìsÉ@q_tX@q_ÿþs˜@q`Ž÷gúé@qa!BqB¨@qaÈ "_@q`,-Õiò@q_-ûÑr@q]Ü­N’@qZ“vÀþâ@qYõ_4ü@qXßlQË@qX#Ö„Ö@qW^Dð‚@qVŽÆ0”p@qS÷ç;²W@qQ)-…£@qNjTÏÕ@qK»~çœ@qIW9oÐ@qF·¬$N6@qD7µ»³@qAŠ%ÌÒ@r8­|ùj@r6@eñ™@@r3½sÈŽ@r1”ì@r.]#³Ä@r+ʶˆÏ@r*-t%–Â@r(šuà@r' .Ûìa@r%|—Ÿ1£@r$D·ú÷@r#Ó È¢æ@r#^zßës@r"æbd´[@r"j·>¦§@r xoÔL@rúCÌ$“@rŒÌŠ&@r-㳬@r¦ë«@r Ò‰óV@rØi©qŒ@qý¸©·ºß@qõrjN Ð@qîàJW@qç4MEò@qàáÓz/x@qÛ {"ž@qÕGî@5¨@qÏY]ÈæÓ@qÉ”ñª—«@qÃÌu¤h™@q½–DïPJ@q¶½¬§šî@q°Áxµ@q©³;k©@q£€ S4.@qœ\+™d@q•PîÙ´S@qŽ^„@q‡ƒøß¢@qÙáò@qz˜Ð’_7@qt3 ß…à@qmÑOVnä@qhê@7ú@qdÛœ—æý@q`Ìxº@@q\¼˜Èm@qZó‚5Û¢@q[ÐX»‡0@q\¹:¹µ@q]®Xj}ê@q^uhÞ w@q^½²¶i"@q_Q{4‹@q_\­i’@q_³,@q]„´—°@q[[Ãä[@qY:dŠcô@qWÖYûá@qT_ø‚‹@qQØ£Mkz@qOËABó@qM½³Ï²i@qLškx@qJ”C’¹@qII[Ü:@qHº6‰@qG±ï᲋@qHÔðï@qJ/Úœ·@qKriÚ@qLîœÉDe@qPŸÆi×¶@qTü¸gø@qXZý¤Î9@q\*òÎ-1@q_Ôêž@q`ß´Wð@qb¸'2ú@qdŸ33î]@qf”%sä“@qgS­HÀ@qgâžH@qhtõ*ö@qi ²¢© @qhñÎÖû”@qeó û’@qc>1‡@q`Ò#‹À@q^¯‰Òá@q]6‘HYe@q\{~n —@q[¶‘1d@qZçÙÍÚ@qZgG@qXiê±±l@qU§·Ü’@qRõç6Í@qPS ò @qMÀ(F<Ä@qK;_µ ¶@qG/çQO@qB¸É¡“´@r<(¨@r9ठ˙@r7|Y‹.\@r4úÚ$Á@r2[Ùa §@r0=ŽÏdg@r/#t0ª@r. „ÚTZ@r,óÓð¼@r+u¹j@r*º{V+D@r*Nó}„@r)à³r@r)mØòΟ@r(ôX$@r&M:¥»Ù@r#µòå¨ã@r!.}\Üa@r¶Ø“°Â@ràÞ³©n@rXŸð™‡@r «^µŠ\@rØÀ&X¦@qúÙ1í¡ü@qòjê)¦@qêtnÄŠ"@qâøož¬@qÛö ˆ„»@qÕZlþŠ6@qÎìH•‹æ@qȧ†¹@q‹ù}ñ @q¼@Êë©%@qµnýÆÔâ@q®¤Ó·ðÄ@q§âg÷¯@q¡®×†H@q™‰Í|ȼ@q‘û…Ð~T@qŠf§ ” @q‚Êÿ¶­‘@q|ÖÁ·´@qu^׋Qõ@qnÀô¨©v@qh&ê°ð@qcV¥"Ð@q_u=¸kÿ@q[“l@qW°3]¥@qV6f#ÿ>@qW¼¥––•@qYNŸY m@qZì‘v¡ö@q\Y^/%´@q]‰X­º*@q^ÃÜ̼>@q_ÿ9Áú}@qa7m‘Ú„@q_»j´Ò@q^>oº|ô@q\Àr9û@q[Ad¸@qYVÈL$,@qWG¦;+@qU8€YR@qS)FÑr°@qQ{‰KÕ@qPa£nb4@qOiN“øõ@qN’sX7À@qNy¹_‘@qOcE ï®@qPÞÁl @qRwà§>A@qT.˜8F@qWO°ÉËÎ@q[ ïÍUg@q^é<ž*8@qb¨¿Eþ²@qfTD×ú@qgül’7r@qièYä†@qkâ9@qmé¤ãR@qo0ìgE@qoÂ'ÌÕW@qnX5Þ> @qlÜô.Fö@qkPt«r@qhß#¯Ë@qfw¡·ö€@qdXeàv@qb€È—•@q`ð:Gã@q`!Š4s@q_Saì<@q^{žñú,@q]šQ¢mŽ@q\¯…mÀæ@qZL(L@qWqy˜‹½@qTÛJ‰ '@qPš”PNN@qKOÌ´!Ó@qFޤà,Â@qBŸÔ`Å@r?È,6Ž&@r=žö1é³@r;YK`óÙ@r8öæÙŒ"@r6wÆæ@r4þf^™@r3âd+÷^@r2ÈU_+@r1°4O«@r0™úf\@r0a_Ô@r0„ñþÃÝ@r0fùð@r/ù¨ÖPN@r.Òûå @r,j[.|@r)bh”œ÷@r&Âë @r$1\ˆ5»@rC®"a¦@rëSG¸@r£Ø4é@r ‹÷@qÿâ|€‰@qöR—¾)¿@qí:PÉ-`@q䙉2L@qÜp0n°h@qÕ@æ¾E@qÎT—øÔ@qÇ‘ÂôJ@qÀ÷Z¹*?@qº=R4ñ@q³L¹á è@q¬c™³²@q¥µJ@qžŒ6ï·«@q—,T.UÜ@qÆ à@qˆYf¡š@q€åÿÙÔ@qztÀÜ‘@qt?ánÿ¬@qmç)¾Ý@qgƒJum*@qc@„’Æ@q`÷S,@q\È©BÈY@qY‹à¥p@qX§r¦0@qZà–Êÿ@q]ÐÆ@q_f•@qaß=©@qb½>賩@qcùì.‡@qe6¬Jöõ@qftÎq@qe0ß~û_@qc­&X¤~@qb(†jâ@q`¢ò¾ë§@q^Çå x@q\¶ðp`¦@qZ¦ÔñÏ@qX•3AÒj@qVÖ¶s§e@qV×¢³p@qUh£Þ@qTâ3ñ’ß@qT}Qž(@qUÖ…Ê‚Ž@qWŒX“i8@qY_høÏl@q[O±h@@q^ìo»-@qaÉt÷d†@qeMLjQ@qi0_‹@ql׉&]D@qo yà¬Ú@qq í…Z€@qsù>†–@qs•uÙ@@qs•òl@qr'MKï@qp§ö™²²@qož@qmvRÐe¢@qk„Ûâʨ@qiiݺذ@qg–÷)~@qfì¿<¹@qdÁå»^¼@qcÑvëǤ@qbú,1ÈN@qbyk39@qa/k-ª@q`< ºŠ@q^x…¤@qAÄW°w’@rC†B,{£@rAzÖ Ô@r?Slü@r=Âá@r:Ý#ówð@r9½–Šo‚@r8 90@r7„Š_Öl@r6jþ˜Ò @r5c AQ9@r4¸¬’º†@r4ctU‰@r4d^†ßÂ@r4»Üò>å@r3¼éÆ@r1Ȉ{ý@r/+Úï8@r,GPœ=Ê@r)ð4¡Ú@r"Í›+ê“@rÙ(µ¤ý@rÁm´@r …‹‹$@rj«–„j@qù¾â@îY@qïˆÂ¬‚!@qåÈøÊ@q܈É7»è@qÔùûIs@qÍ“[|ÚP@qÆT¤§Ž»@q¿=–$À@q¸1^fÄ-@q±"‹mSý@qª*Z@q£ŽÂtô@qœv"¨#@q”ÕÝðÇA@q—åD@q†Q¿ÛÐ@qã"+@qyEÒè5@qs~×ÅÍW@qm¬éÙÿÆ@qgÐY ä@qdNLË@qaÓªº¬@q_X3¡0@q\ÜV92@q\u]C‘¦@q_¼ƒv,@qaœï•e@qd;,'¾@qf³—!?@qgðŽ5`@qi.ƒbSw@qjmv¹Ø@qk­pÄ e@qj§}•ˆa@qi%ž´@qg’Ùê@qf:.@qd9f%ɦ@qb&§íNl@q`oþL@q^ž•|@q\ ½ì¸@q[œÖi.@q[F-‹t @q[›ÉÛ@qZúaR:@q\.¡È~ë@q^ÛC™[@q`)ïDàö@qbRÝ(Å‚@qdËvPk@qh{‡F$¨@ql#*Rrö@qo„su…@qsa¼ @qt¥ìO«á@qu@¥ÄÎ'@quªWO®0@quãCBl@quë¥ÏË„@qtY¹ÇV@qsé]4v@qqcÄ9Ž@qo­÷™@qmåûz™ß@ql¥+ß@qj8Bϱ@qiIŸdÞ@qhK6íìÚ@qg‹.z*@qfªÛð’@qeÁQÚ@qdΛ·+Ð@qas®à¶@q]Ž4®a¼@qX˜Rº@qR½ÂR`ú@qM‡Ã=c@qHr®|ñÅ@qC~4­/@q@,QXéZ@rGaÃÔß@rEsÇ[læ@rCjAáVÝ@rADõL^¦@r?œdø&@r>{Kí…Ì@r=\GT4@r°Ýi@qÌ©”Ÿ=¨@qÄñèU@q½_ŠŠ´8@q¶÷*a@q®ð•i(‰@q§Ë6\Æ@q ¬ºÎŽ´@q™˜'ȪÁ@q’†+Í*!@q‹nö¤Ø@q„O~ÑÑÞ@q}Cà<-w@qx è¿0à@qrÉ5Vu@qm{ÊKl@qh#I‰hì@qeb'7­@qc¤¥‡¹F@qaæˆÊÅ&@q`(,å(@q`?r$ãu@qc&â–@qfW½»š@qi¨ÞûV@qkäØ7» @qm#q¼Ít@qnchÈ¥@qo£ÁzE@qpåŒFuÜ@qpeX…ë@qnŽ‹õò!@qlý8j¢@qkjÀ<º!@qi«rå¨@qg–òà÷P@qe‚·Õê@qcn®t{t@qaZÈÂ-ˆ@qa ŒÄb @qa¹DŸP@qaòá½ú@qaU9q/@qblnߥµ@qd”&j`@qfØWx±ç@qi94ˆl@qk¶: §¥@qnЊM@qq¯¢bQ@qt8Öx…Z@qvm©ât@qwùS9iä@qxL×î@qxp,&ðˆ@qxcò@qx'1XÓ2@qw$pv@quz¿„áÅ@qsÁí¸”@qq÷Fl]@qp±÷@qnêT@qm?cE»<@qlDrY§@qkÇ;X{@qkõåE@qj†ƒ×x@qfƒi$@qbΣQA@q^ñ ^í@qZì Áس@qV"øg»–@qPçǸ@qKËê¢ð @qFÑKà[/@qAöÀÒž@q=ÚHT7U@rJ¢`¥÷Q@rI‰R…{X@rGWnðÎ@rE– ¾Æò@rDZR¹@rC7²»ìj@rB4Á–A@r@øÑ$is@r?Ü-·Ù@r=õÈÙ‘@r<`ëS´â@r;J)ÈG@r:14ëîi@r8›ß(¸Ö@r3Ò5_µ@r/Ðø›¿Í@r,˜¬€@r*)®…Ý\@r' áŠ(@r"ÖÿM·@rÕ¾©@rÑ2I‰Ò@rÿÇ×}¸@r ŒHK@qÿ.Ú‚,Ñ@qòË_²Ñ@qæØ§L¸µ@qÜl[âÁ`@qÓîß•ú•@q˘7uÍ{@qÃh Jhì@q»^ ?í@q´ ‹ò!@q¬¶ø2V{@q¥tHÄY.@qž8Q&ô@q—) Â/H@q=½@@q‰JÛ¸ø@q‚RqõŠÅ@q{•œãùe@qvßW,Ó1@qrcƒ˜¼@qmRÚÆ<À@qh|Ô»U@qf{x“_i@qewè]ã@qdsá+0@qco]ç6Þ@qdæ`4k@qgAôìl@qjƒ*¤6@qmËã-³²@qqè°…W@qrVH´@qs—TgÍ@qtÙ¹Ö´@qvKI^l@qu˜¸5äæ@qt{rÔ@qri¬J«P@qpÑ@rDdº… @rA½B¤Ì¸@r?µèÆpb@r>’N4@r<ƒú–@r8±G7„#@r2¡«¬J@r-WL<Š @r(Ò¼Ûò@r%´ Ya@r Ë+]ê@rT¹œ¥@rþÐHð @rÉ=²o4@rí¢ÝØ@rÿãµ—9@qú¸ÂCD@qðëA_E@qå*˜vl@qÛ“ßaÉw@qÓ)Kå`^@qÊ`+S¿@qÁºME§Ð@q¹I|_®k@q±ÜLG@qªuÑ¢cÑ@q£Vð@q›½gY?§@q”ÀÜV=!@qú#[c×@q‡-^†H@q€ZiTæê@qyö—¿êB@qu¿À7$ @qq~`-RË@qm2˜òØ@qhÜŠÆô@qgšWÇ'@qgMr,Iæ@qfÿþ¨@qf²\¿ÊA@qgÈíÓ¬Ã@qkWM‡à#@qnìMH8â@qrˆ3¿)Ð@qv+HFe~@qwˆ™~¥©@qxËuy`Ž@qz†æ(ú@q{TØTk9@q{˜¥Þ@qyvˆîh@qwØm­%@qv9šû ¥@qt‘Å çÇ@qryÜãÜ&@qpbg8Ê6@qnKS’>ú@qlJœÓzn@qkÃÑ<Ș@qlV“¬õ¶@qlî\\It@qm‹0j@¾¦@qGò7…±×@qC+Æ¥K{@q>„A"·@q9ü1)eÔ@rO6ª(3,@rNfö[-@rMxéOðH@rLÏtT @rLQÆ;o7@rKÕ@rKYT›ªe@rJh·%”¬@rGùÍí1á@rE0ï²,ß@rB¸¯™Ñ—@r@‘=ð¹@r>ºÔ-@r7õã ÐÎ@r0¥-Û|Æ@r*ŽÆâ´@r$J@¥ 2@r>gQŸ@rgaN´r@r°@‚£@rån\ @r ¡4* @r«`v.Í@qý”~íÅx@qô$ê—û@qê\uW~x@qà:燣N@qØ=k¿á@qÐnr“ò¥@qÈŠ‘‹lž@qÀf”šâm@q¸QaÁ8@q±)õ‚<Î@q©®ÄÝ¡Ð@q¡à(è-Y@q™¾r"ç@q’_bå @q‹½Z(âG@q…VŸ—Ð@q~g6¥i@qxffSá@qt¬Ë\£@qpèÌ7Í®@qm“:Œe@qiBH‰/)@qh¾«Bš±@qi%CD,¿@qi‹T ÐJ@qiñHÃÜC@qkˆ»7Ô£@qohÎ=£”@qsOq_¶ƒ@qw<ð‡@q{1˜¢<@q|»1õÚ@q}ÿŸu=õ@qEUSœX@q€Œ]×6í@q€¡ „w6@q6Ñ8ØÔ@q}½pÙ8µ@q|4ÖIî@qzœÖÕ«ë@qxª&ºM@qv«i¦¥@qt¦A^Px@qršuj½‘@qq—ˆS@qiy©Iäš@qfÕ.Ö•@qd*l,¹@q`ÇÐÙ%ß@q\¨8#÷^@qXaƒ„ @qSóÐî3;@qO_9Xq@qJ¡H‘ Þ@qEÕlå#@qA(µ°«@q=¦­hF@q;| ¿Z"@rQ¯+&zî@rPÿ@q¾@rP7x¬Ä"@rO¸`š8:@rO:O1« @rN½Aë¦@rNA3!Àæ@rM·h†@rJá¸æU@rH1¬wü@rEk BëÝ@rBÓtÃì@r?º;Z%Ò@r6n-m°Ñ@r-á ÙÐ@r&õðb@rñ娆@r÷9·@rá 4Ÿ(@rê&dË`@r _ÿ¹Ð@rY˜Õðh@qþÈ’—Yœ@qö…Ý”O@qíêQbü´@qäø>ìÞ@qÛ®0E-ñ@qÔÖ Ÿl@qÍõ½z¶š@qÆÖh>ç@q¿xaF×@q¸’u¸\@q²Ä8ŸoŽ@q¬£®8Ú¾@q¦1GFÀÔ@qŸml?y@q™ 7Ïœ@q’« T÷g@qŒýØÞô@q…fv{ƒà@qsÔsÆ!@q{¬eÞ‡O@qwÝ.Èy@qt^nEŠ@qp(#=»ú@qoãcQ‰;@qp#»ú±@qqð4õN@qq¿¨ƒ•z@qsyVEg\@qwf*áow@q{Gœ´¸#@qT§Æ¼@q‚æúm^á@q„™F×Å@q…Ý·XÅ@q‡Rm2.@qˆBîø'd@qˆsæ&·@q†Â&# Ì@q…ÁÁ4 @qƒ2‹ L<@qTRÉ®@qK»þÓ@q}3ëLàl@q{j2Û@qxòêŸ@qwgPús’@qx =|ÝÏ@qx¸8iß¾@qyhHZ€]@qztgºµ@q{ÖƒmVÚ@q~OÉXhp@q€Òן79@qƒ_ÀãSy@q…ö˜Ï¶@q†Øs£-y@q‡-!a@q‡2”9Ÿ@q†èîØqY@q†Nº[—´@q…bl›ýö@q„IXw’-@qƒ™èa@q€ÆMÛ3¼@q~* @qzÝ Ô[{@qw‡µ˜ú@qt øÑçH@qpoö§°@qlÞL÷–@qjRVú”@qg­žÛÛ@qdï_³0·@qbêîÅÖ@q_'Ha«@qZéN@qV€%çe@qQð|Ìî~@qM:gßæ-@qH]÷l8H@qDõÃÜŽi@qBó³æ+@q@Ð7mϳ@q>‹|_)®@rTEâêˆ@rSµáýï_@rS A­rì@rR ¾xÆ@rR"K_f@rQ¤å{ˆ@rQ(ˆ´ü@rO³Ûcß@rL«>¯Æˆ@rIÇácÈÛ@rG Ç&¯@rDp÷â—–@r>šÃ+\ú@r4d‰Q6@r*YzpyE@r!P}0}@rp¤@rŒúl=@r 8£°åó@róÜr€@rëÁEï@qýòå™õ@q÷BØD?ë@qïÏx¸yY@qè½1¦@qßæ¤*;Ú@q׿“*ûÓ@qÑÝ›i[@q˽’ß|ç@qÅ_„ÅÚ@q¾Ã©Çl8@q¹2&ã¾ÿ@q´·?:e@q¯ë{FæÁ@qªÏbÉ-ª@q¥cu{Yq@q 2!ð'@qšã¼ƒÓ’@q•k]Ëi<@qÉ~ìw@qŠçÅ€÷@q‡œED@q„IT7sô@q€ï(m©@q}øœ õ@q}Gç@q}¨A(T@q~ ¼mAC@q~tQsx6@q¼mK¤@q‚êD x@q† “EÖÍ@q‰%‘îoP@qŒ1Û¸è@q—­Ån,@qŽÿÍù<@q`ÞWl@@q4A0Ã@qTo$¤e@qŽ\w»êÚ@qŒVG$Yt@qŠAª²'Ä@qˆn?ƒÿ@q…ó'gWf@qƒÃÊÝ_¦@qŽYØw¨@qRº'O@q}3md†@q}â²éÈ@q~— ¾Dy@qP{÷M@q€`*Š@qv£Õ@q„E÷?í@q†”3¶2@q‰1íÜ@q‹Ù‰hLZ@qŒê?Ñà@qŒ·+V é@qŒ5à@q‹fÑrôô@qŠ9Ï Xl@qˆ„"þQÂ@q†s;·L@qƒÿüò°&@q*‚ÕH@q}óF€@qzö§l@qwÍôwu@qsiÞzV¬@qo¡0;‚d@qk´Æë4M@qh¹`.ç˜@qeú™ªœ“@qc"ç²ê@q`2PÅÜ£@q](Ü.ÜÞ@qYPOæî@qTÄÒ‘Àù@qP‘Ç<@qM æx‚¤@qJÈG©RC@qHv¢¿"5@qFY¾ôþ!@qDï[ª@qA½\C¿µ@rVúRŒÁ@rV‰ž«d@rV“Gî@rUˆ¦‡¶@rU ÓSzó@rTŒA½”@rTlH@rQ‰ -N¨@rNN_µ<À@rK8k- ª@rHG+§š@rEz¤[¼h@r=­:67@r2C_Å¿t@r'šµ » @rbò‰J@r†!’ÞF@r 8j0Œ@rnªì‰¦@rû(…@qû¥bt@qöi¸ò«@qðë‚®@qéqb¿™@qâv%¡Ýs@qÛ&7¾“ú@qÔMí3Ì@qÏ'Odõ_@qÉÄl~C@qÄ$˜ùW›@q¾Gøv6K@qº.L1¾i@q· ¬Î@q³„ZÌT@q¯¸ÖvŠ„@q«Ÿ)û1á@q§‰{É©Ö@q£J)Þ1±@qžáÂçU<@qšPщ:@q–iX@q“—¤šÞg@q¾Õ7@qß(ö{°@qŠøÞ{ @qЍA$@qŠÏÿûp2@qŠû-Áƒú@q‹)¢åâ@qŒ­œ ½@qŽxœPj@qáh5@q“>žÂ!@q•Ò5޼@q–¡Þ”U@q—2ÏJ™V@q—¹z x¬@q˜4ÝTÎä@q˜B¤åí@q–¥gÈ3@q“º×F–ú@q‘bn¼Ó@qŽúî6Ãú@qŒ¢/“µ@qŠ[˜¨@qˆ®Ö@q…»$xÜ©@qƒb$Iü@qƒ´”ŸJã@q„r"-v!@q…4ÏWÓ¥@q…ü¤˜ºÐ@q‡ É@½º@q‰¨ªÅ@qŒM3ÆþÊ@qŽû{ݨ@q‘³˜äY@q“I³dü@q’6jÛ@q̷Κ@qlvˆÊ@q.Œ á&@qŠò4@]†@qˆSéÿXØ@q…Tä:lW@qõK1Ä @q~5q«îÇ@q½“â«@q›/MMf @q˜“d«ç§@q•éœ"¶P@q“X?é-§@qù½¦I×@qŽ•_ªB@qŒ+Á§ ‹@q‰¼ qûŸ@q‰ƒ&4ïÏ@qŠIÄo@q‹‡•Ú@q‹æx…çÂ@qŒ¼¡û½Ó@qK“U&0@q’@HIŸ@q”Žør@q–Æ|–j@q˜e?½¦@q–Êo­ÜX@q”íXXtc@q’ÍÖŒjª@qkäge™@q¾Á*C@qŠ• 4q‰@q‡ /2"j@qƒ$I¦Ô@q~ÝiöeX@qz^€%NÂ@qv‡“ƒÖƒ@qrñ­]@qnq˜…l@qj2…“×@qeЯÿ©Q@qbÝ…¬@q_Óß\+@q]¶¯«â@q\Ÿ¥˜¸d@q[˜4³&@qY®ZêGõ@qWWl1¿@qTóË—B@qRƒwèšj@qPqvå¢@qM‰¨Vèu@qKô£ ÷@qH†rå{ª@r\QBš Ð@r\;\SZ@r[Ø2Ev@r[Ww|s@rZ×è@g˜@rZY‚_@ˆ@rXΠØr@rTÁf‡ð@rQ$´,éa@rM«©èwp@rJV=ú^±@rDšá’½@r9Šlõ~-@r.O,º@r#§~eº@rÓ—Òºf@r4Àá¤@rÛÕrïŒ@ržÀÿ1\@qù}BÌ–˜@qòwü"j@qìHÓƒ@qæ>]´@qàïÄ ê@qÙ¦²‘¹@qÒílh’¢@qÎ1aói¸@qÊ{ðye@qƉor¸r@qÂ\ð‰ÂW@q½õÁƒ Û@q½3سTŒ@q¼‘„é…Å@q»¢…vZS@qºg£5^‹@q¸ÒW@q¶ËÍ‹^€@q´¯RÉ@q²Ge½,@q¯ÊHÏàÛ@q­•ÓN¿@q«±9„@q©Æ•V@q§Õ¦£»@q¥Þõ9j@q¥e\nM3@q¥ Éï@q¤Øˆ6e@q¤—©q/Ê@q¤®¤SÔ&@q¥´rå¥$@q¦°ªîã¿@q§¢Ç+˜@q¨ŠAWzp@q¨Ôß Õ@q¨¹ä‰Ÿ„@q¨”•S(È@q¨d±ç@q¨)ù£kd@q¥„)i @q¢³‰‘Ÿ@qŸÕ¨Ù¾@qœêG=”@qšeØÛÈ@q—Ÿä0°!@q•$þÖõr@q’¤–н‘@qŒŽw@qS]UÍP@q}{úr@q‘¦=ò¾@q’Í7€Pr@q“òÞìU#@q–8âb8@q˜5Q9“:@qš"Z8¤6@q›ÊH_Ë‚@q- s•@q› ¢ÃPÒ@q™Q×Fó@q–Á˦^@q“ðoÐÐÛ@qݯ1¡‚@q4Ä4Í@q‰#ö–² @q„µ£§m@qéÏOàb@qzÀvwL4@qvwá0dú@qrT·W¶@qnYƒvÌ@qi§¿‘å{@qe8ã¶+@qcQûã×ò@qb+!J¨|@qa?£b@q` >Õ{ã@q_—)6@q]Ä®F¦'@q[a›~ć@qXòÝpæ@qVvnLô@qSí¬²Q—@qQX¢èÀ@qNÇZE§O@qL¿(ö:@r^w<%‘?@r^ygc-†@r^[Snø@r^ø{|v@r]¼*œ‡Ã@r]?íÍ—]@rZXa>@rV&%‹Ù@rRYp$‹y@rN¯ÞXÌ@rK)b'<À@rBܲŒ³P@r7¯ ;\@r,•Lúô¨@r!Ћ@rœ+ È(@r ¯`þq@r!ŸºðR@qþ¯|¹P@q÷XqŸ%@qð=5[ @qÄüPk @qÀƒ+ŸE@qÀV¦„3í@qÀ T×=@qÀ$¤Z~@qÀ* ,%’@q¿ºÈb@qš[¯äÄ€@q˜[Qk@q— ¥¼—%@q˜,cOî@q™KÊÛ¡O@qšiát|@q›†ª¼è@qœþÉKï@qž „/€Š@qŸþ{ªZ@q¡—ƒ¥¼@q¡î¼cPà@q ·Ïéð~@qøô±z@qšùÿ¬/ƒ@q—ºØËˆ†@q”;a@~@q1R¡mÊ@q‹škµN@q†§~™Sƒ@qX…[m@q{­pÂÓ@qv‰ïO»*@qr=ÅŠ&8@qon—GÔù@ql“C¨·@qiiO‘@@qfêçx¥@qei?¾¨@qdbaX²x@qck97eL@qbƒ²ž‰~@qa«º‘#`@q_yd«ý@q\þ‡c€@qZvžj··@qWâæ› ~@qUBïà¶Ð@qR—ß6@qOÓ¦?žµ@r`± ”t@r`ÚAªÝß@r`ãSU‰@r`ÌC‘5Ð@r`”üÍ@Ì@r_å_sý@r[ÑaB j@rWþao*@rSjÙ'%à@rO‘fñÝÐ@rKÚƒF@rA ÕÀAê@r5¾¬šÈã@r*‡/0@rb¬‘8B@rQ*ä›N@r ­´0P@rJkWvë@qü¤ Õe4@qõIŒO@qí¦Û‡RZ@qé ¡”ý@qä™oz‰ç@qßÒ ÿó@qÚÄ‹/É@qÕ{·=:@qÓÌ.Y ~@qѱÔó3@qÏ,Ó@v½@qÌ=âÙS{@qÉ ðÙΉ@qÊV¿N@qÊGª ”@qÊkZ2ô@qÊoÏ–ÿ@qÊ>°ƒs„@qÉÉ¢·ÈÒ@qÉ0ÿ»1¢@qÈu‹»ÝÜ@qǘ®üM@qÆDRUáµ@qÄνܗ°@qÃjòä œ@qÂ\dd @qÀÖfÅv@qÀ~õ¶ý@q¿fÑp`@q¾¹6¢Ï@q¾Š-/^@q½|oµÉÁ@q½(Ê€Ó@q¼ÎÚÂÀN@q¼n#{ï“@q¼'Ø@q»q’ß=¥@qºªæúm@q¹Ô¹šf@q¸î¢5!è@q·ø3A/˜@qµhÁâP¬@q²_`‹¬;@q¯Z˸@q¬ZÛ¶N @q©_šFÚ1@q§_ˆ@q¤ÜQ,|Ê@q¢¢Áˆ—r@q m¤±@qžÆÅßûï@qŸÞEå]p@q ô›ì£ë@q¢ Ì “|@q£Ú%ÎL@q¤=’3@q¥P˜^‚@q¦! 8lj@q¦° ^K†@q¦û®áª|@q¦Ô7æÈ@q¢áƒv>µ@qŸu;¢&š@q›ÉÛîÐp@q—ß=òÀ@q“‰ Qõ@qŽm×sæR@qˆø’Íþ@qƒ'½Š@q~„Û};.@qz@†Â°@qw äÈŽ@qt²îæ9@qqv„É{Š@qmí£Îç@qjpÕ— @qh˜}æ¬c@qg¡ss‡5@qf¹õ*X@qeáïÔó@qeQð¿@qcž¬ï¶ @qaÈ¢¶@q^„ášRÍ@q[æ4žÖ@qY;õV@qWË*ùPÊ@qXñéaÉZ@rc Æ~1@rc]YÈ#c@rc`™NÖ@rc̘ï@rcŽŠ”º@raás'@-@r^#£¯­3@rZ)—­–¶@rUó'$žü@rQ€#¾`@rKV¥Ul@r?!ÚC„ö@r3¹¡ãïG@r(d¡-7Œ@r"eñ@rYëɲ5@r J÷$#Z@rV¾ˆ@qú|ñª÷Ž@qò½E] 0@q뜉/yÓ@qè y³>O@qä6+õ‡@qà‰`^@qÛº@q×÷²äí6@qלƒð@qÖ¿ï ;á@qÕ†ƒ”_þ@qÓå)c*}@qÒæÁ°æk@qÓ׳¥@qÔ©L³êË@qÕ\Ï6Ò@qÕðI  @qÖzN›ì@qÖõ}ñ´@q×Mñf¬z@qׄzýs @q×™ê)c|@qÖ.š¥@qÓü·›Ñn@qÑü '$¶@qÐ ˆÙv@qÎ-”¥ÜŒ@qÍLYCŸõ@qÌy¡Q¸À@qË«+;OŒ@qÊàÒQéÖ@qÊÊA8,@qÉ6ãÈöƒ@qÈRE*@qÇfÙŸïî@qÆt«$MR@qÅaEè”Ý@qÄ Õ+¦Z@qÂÑabFU@qÁrx'e\@qÀ¥¨©ü@q½…‰Ö@qº†Ë€U•@q·Œådýò@q´—ÈP:â@q±§f(7ˆ@q¯Pôÿ´@q­×È<­@qªçOUô4@q¨¹N§¼ª@q¦Êê @q§“M5™ @q¨ ³ó.Õ@q©­ßD+@qª¸”I“@q«¼ô]x@q¬D]¯¢‘@q¬ŠŒLô¤@q¬U_@q¬R†oŒ@q«¤½/@q¨ fgð@q¤2WE—@q G.x©@q›È.L@q—FÿÈHB@q“Tßò@q޹é@qŠDÆ’l@q…±ÒYo:@qîf‰M@q}“¾—ká@qzE|ÉÌ@qv« ß9 @qrÄvž†H@qn‘ÅŠl@qk¹6†Ú»@qjÑÑÒ N@qiùϤ¶@qi1CÜÀ@qhw­¢ô÷@qgÍoYÊc@qe>òIZ@qb Ì®²u@qb0#,¥ @qc,Pj(•@qdjà@qeýÆÑ@reŒ›f>ó@rf&Rh@rfX¥¾Äe@rf<@rf¨RRe!@rd„7%@r`µí+=@r]0¢@rY2Égžv@rUôÈ*°@rL“~¥ô@r@YÝ®˜@r3þ£Êá@r'ñí.@rà¬ËfU@r®1Ék_@rm~ÎÜ@rG›í4@qø:¤wL@qðGØô¥°@qê2Óa„V@qçIűÀ…@qä÷°E@qੳ­°X@qÜó=€Ít@qÚìôE8™@qÛȈËp@qÜ—@qÝöF‰®@q±ñûèŠÑ@q°î ñËw@q­rj*Ç@q©·#_’@q¦)ü@q¢™ÁÔ$@qŸÿ[í@qšä‡Û1ß@q–`8§åf@q‘¾ÐÁ¯7@q1¨„b@qˆ$9ÈU@qƒÔô‚ú¸@q€'´Ts@q|/†Ü3¨@qwìq‚ù@qs^q¤Úä@qnËÁpM@qmóÕ|›@qm+"JÛ@qlq˜ŸÒ@qkÇ)f£¢@qk+Ç™¥@ql°¨^š@qm¶Ëœû+@qn° Nû@qoœœ pF@qp|x¹‹@qqO¾ð@rh-Ý9;@rhÈ%‘Ût@riD£þl˜@ri¢^B@riußn5 @rf›¡¯Š"@rc‡$ä@r`8R„z¸@r\¯6¹@rXëF3ÅŒ@rNC Q˜‚@rBFðülh@r6)U\÷@r)éì>‡„@rˆfSÉ@r/üÔ@r ½>¨ð@ržKR@qö-}{,@qí¸q’<Ž@qéû˪³@qæÐpýÄŸ@qäH<è:‘@qá|´îh@qÞn(*u¬@qÞXˆoR@qàq¿dj[@qâ$öh÷@qãs/‚¼à@qä]c…º—@qåèBw.@qçísÔx–@qéÔ·}@qëž’øð@qíK‹ —2@qï{› FÒ@qñËr3æ/@qóú6×Mk@qöÖú™H@q÷ø=ÉŽ›@qõnÓI1@qò*6¢@qî÷™¥Ç@qëÖËÊ@qèÇ(iwß@qç¯:…Ô(@qæœþÐ@qå’0§k@q䃆Ïê¤@qãVë*X@qáh¬ñ@qßttåÞd@qÝ{ Ây@qÛ{o ¾@qÙk¶MdÞ@q×=Àhú@qÕ»UŽ—@qÒ·'ÎȦ@qÐ]„,°@q͸aÒÎÅ@qÊÎrº Ÿ@qÇéši@qÅ º5Ï@qÂ.eÓ™À@q¿¸VS@q½ŽÑ˜~“@q»j Y¬ì@q¹Iø.ÏÛ@q·.G3´@q·t4‰è@q¸_c%˜@q¸þ¥­¦@q¹ùG~°®@qºóHœ3x@qºò™WEï@qº)NWè@q¹¼ˆ±¿ @q¸þ2–Q›@q·Æ8¸T½@qµ“W0õ@q±Œ9ä¹@q­øÙ™iD@qªdV¨ôä@q¦Î•Ö@q¢ÖãíQ@qž&OÃð—@q™Y?Új§@q”o‘ÈÎ@qi xÃÊ@qŠb„¬ÜÂ@q†Ww.r¬@q‚¼É“@q}dP‘þh@qx|*–Ò@qsJ6Ny˜@qqÒ‚Jr@qpNCZ@qqaÿâ8H@qt­á F @qwaŽf^a@qya]ƒÆ@qzW2–™¢@q{@—¸·@q|£J+@q|îj÷@q}²ÿ‰š:@rjîÊ^… @rk®Ý8 @rlPãäú²@rlÔÙá.B@rkßà*@riW¹¤#¾@rf–=V@rc›]Ãþš@r`gÉ å@r[¶ö{º)@rPÇn”´@rDWì¨:5@r8w!¼@r,uˆ³@r Q™¨Æ€@rKÄ4ö@rNp[¬@rZ´¶‹@qû¬IèöC@qò;ªX@qí=•´¶ì@qéµM$@qæ&Tës@qâ’Ã# i@qà)¦ ! @qâ86§MI@qåŠ)ìHÅ@qèwßÛñF@qën§@qí*á_´Â@qï¢êñFÆ@qò.îø±>@qô·Hp@qöïÒ3D³@qù%Ì{Á‚@qü@!$2É@qÿt™ç:@rˆÏ¥J-@r}À4 )@rTc[@rÛËìB@r+A/`@qýcs†. @qù¬»Y‹²@qö qV@qôßMPr@qó¬ˆ×jŠ@qò~ÊOó_@qñU±±¼ñ@qïþ“5Ö@qí‹–F1Ç@që㊨@qè–Írmµ@qæ·•»Ý@qã†rR>‘@qàäž“0³@qÞ542ZÅ@qÛw¬^Æó@qØ«Á5@qÕÏ|‹ô@qÒïCqLë@qÐ’õ †@qÍ>çu*(@qÊn4Ä5à@qÇéµd–@qÅÆ×ýìì@qèÎ'ŸÖ@qÁâ™@q¿{ ~J•@q¾Æë*Û@q¿ºHC˜@qÁ"ų ˆ@qÂæ¹^%&@qÄË¢5‘«@qÅË[þ$@qÅxA4–@qÃÁ!X´n@q Öù†`@q¿Û ¦Ûû@q¼üEÆ)@q¹dÈEHÂ@qµÌ(ÏNR@q²2’°ø@q®—錨R@qªèc/Ê@q¦ Ö ÒT@q¡·¾¾¨@q›ÿ’ݺ@q–Ï>ìzê@q‘‚ˆ¹@qŒÓ¡v&W@qˆ#‰_<@qƒ*áØ&@q}é¶ :@qx_â5/å@qx̬æG@q| é @qÞt’Æ,@q‚…Êu¤>@q„—V7o7@q†sU9þ@q‡À¬@q‡áÆ1©¦@qˆ¯~zdz@q‰qX@ªÀ@qŠ'eb>@rmÐE$ÄW@rn¨P´fE@royæ¨ è@rp&€…–j@rnˆæ§¦î@rlQȇe@riâ@qÌt­B—À@qÎ~­Žt@qЩRè¢@qÒ>ãhí+@qÐ{JfÁ@qÎC}ýM’@qË–í¤”@qÈtü¯ö\@qÄÞÚ@qÁ@øØtû@q½£1zKx@qºŸ)Ò@q¶e%*¹@q²Ä¦›#@q®zrbP@q¨íã¶D@q£¯Ü“T$@qžV99¶m@q˜àË „J@q“› -3|@qŽ·fÖ­@qŒy‘_¤Ö@q‹d²ù@qŠqØZÿß@q‰¢²Ð>ü@qŒa3.Å>@qŽù¥Û~­@qþVŠÃ™@q’o¡ýsü@q“MÕY\Â@q“ɧeÔM@q”“¾åÑó@q•RK½2@q–_È @q–­ yôë@rp¼ Ôņ@rqœÊ3Ñ’@rrw;¼Ò›@rrÑJ^çh@rq5–àÊ@roÉ[ÌÙ@rmj1ÚÜ‘@rk·;@rh†BRåk@r_W^ÍŸ@rT,í4w»@rHãBAü¥@r=yĺÀ@r1ð5Ë…@r(ÌŠ¬@r ‰—@qÙA’L©r@qÕ£R‘bº@qÑ‘ÊNTç@qÍ B/'f@qÉ öÕKN@qÅ~Iä@qÁÚ¦; @q¾6q•&«@qº‘cÚ@q¶3ò탖@q°çv.øø@q«€׊³@q¥ýºÙ.'@q¢ôúò@q ŽY¦j@qŸUŽ@qž?ÜžÂÆ@qM3÷N@qœ}Š«z@q›Ð×gA@qœ¼:°Ó’@qž±t³ï@q [kh7@q è=$ýì@q¡*Xÿ3@q ÛßJb@q¡V£¥ý"@q¢,Èæ@q¢ª Ïµ@q£D-^@rs¯t9dä@rt˜Êð†\@ru{ûG @ruÈqÈ@rs£‹Ü(@rr¹Éh@rpjLÔçÌ@rn§AØLR@rl ûå_ì@ra\Ö_|N@rVl3öaî@rK\ƒI@r@-Œ5•»@r4ߦ¤ê@r, ëü‚@r%J}6q@rhÞ#X@rŒî~d@r |nýð‚@r£Ârœ­@rjGà@r*`A˜@qýä€BP*@qú˜yšž{@qø¤¿Æ¯z@qú挄@qû¼²¢i%@qý›–Šïf@qÿ± kåÆ@r0x%X@r ›‡<@rç›m@r B\uT@r‚Ž“†@rJçç@rµ ÅX´@r·"ì-@r fŽ ‹{@r%c'×eÐ@r)—S’³‘@r%«›»Ô|@r!µ§Œ#ó@rµîà°ò@r¬èÆWF@rÜY¤W¶@rf¤C@r'¡¤˜Ì@rσM~@rwé3ËÐ@rî‰]ôÑ@r ‘>'·@r?¤ž.v@rúK¬%~@rÁÃ,ü@qþ“»àìá@qû\fwþV@qø:eT9á@qõ.-¶Æ¤@qò86—@qïs¦ ˜@qî&¨î*@qíl˜ã@qì6Õd¼©@që—+G&‹@që*¼Wð3@qèÝòR~‰@qæqøÿ@qãæMÒ&„@qá:qçœ@qÞmÜ‹éÛ@qàLâDl~@qâÀ 9£"@qåRîE@qèØeÈ’@qêÙÁ%@qèÕe ý@qä¹o‚VÓ@qà- @qÛ/Z"÷Ÿ@qÕ¿¶®4?@qÑîRþ@qÍ]ÎM×@qÉ´Ò÷ ¢@qÆ ù_X,@qÂbpxFã@q¾uüFÁ=@q¼\ ¨mÚ@qº5, @q·Ø¥m@qµE‡@q²}aOˆ@q°Ûaç@q¯è:)ì@q¯íI€¡@q®jsâÅ@q­ßÆÁ8„@q­° Íþ@q¯â³×‰@q¯ÈÐ*<*@q¯ÿYÿï@q¯¦à©Ræ@q®ÀWÐÛð@q®*™“ú~@q®ËCž*‡@q­è›„[m@q«É86Îè@rvªwøA @rwœJ2$¥@rxˆ2ƒ0@rw~ùìE@rv-Àæ§ó@rtÃaí„f@rs?Ü(Nü@rq£--’ò@rlœ´F3@rbv¬Ã@rX'²íš@rM¬õ­Ïã@rCO¥êf@r7ðwúЧ@r1 ô>Š[@r*JåÌá@r"å˜gr¢@ryôŒ™ê@rÚrw„"@rZÛ„o@r 7³ë9{@r tÝå@ráXf@r­YLà@rS1†Ü˜@r$«ï?2@r- cö@rk¿7æ@rà.É8Ž@rÍP|ñ@r f¼V!¤@r ™jq.@râ–$}°@rÄbä—p@rû»Õñ—@rï Rõ@r\ŽY¶@r"±^%"@r'õ¦é@r*Z>Ú5@r&í/¦ @r#v–@rõbkmª@rkŸÞ2"@r0¹â(@rÚÓEŽÔ@r˜®ºŠb@rWÖ2u@r\Ý7£@r¹É®Ùe@rë‡4ÒX@r (Î3ä@r r5Âæ@rÈS"b‹@r)ýì@@rpcß±@qÿË;Ä@qý;»oØ{@qúÂg¦§Î@qø_J Y@q÷ï'î×D@q÷ÂÁ³Ëw@q÷ψ³@qøx`Ó@qø˜“{R@qö?È[Øí@qó_y“nA@qð`M5š@qíAº ߤ@qê4-Í7@qëáä¢Â@qí»?s2d@qð‘ìY¾@qó†Š'rÄ@qöœ¥40@qõ²¡ W@qð©CTpÁ@që2 ÍÁ.@qåK­Ñ=@qÞõM4&@qØí Cak@qÕ@SGH@qÒÄm4B@qѹçm@qÑbçŸi9@qÑÀÚEï@qÏîž Ð~@qÍp?G6‘@qʽ½*ä@qÇÖîØó¸@qÄ»£Ã’Ò@qÂDµ …~@qÁs«Ð³l@qÀÅON¶@qÀ9š#åQ@q¿ÐŠ ‹;@q¿Š ?Ë,@q¿ï ÷‹@qÀ˾Sn@q¿²4x¼­@q¾Áo5â#@q½D‘§ø÷@q¸†uJr@q´ÌX7Éš@q²—Œ‚ @q±<«Y²6@ry­N Ä@rz§@Òs¸@r{f'i»@rzuPD™@rxÓÇp6@rwŽa—¸@rv0F‚çÈ@rt¹vžï­@rmZ&òŠ@rc~‡Ï'È@rYyZJU'@rOJ|´jL@rDñÊ]2@r;‘M½@r511У@r.âžXé"@r(›`ìñ@r!ž5á<@rn(:v@ràºÄô@rgN@rþTùÁG@r 秆­H@r Ë\8§H@r ÆçmŠ{@r üsA¹@r gzÐÐ-@r e³ä›@r Þ@¬Zþ@r kC×Ð@r¨ëö€@rþí'µ@rl¾6Ë<@rò nuì@rÙ*6@roúÕÞò@r!ä£c@r$åX©5Í@r(ÂÉé˜Ø@r+,‚Nœ»@r(<AŒ’@r%AÎéôl@r">%9Ž@r1¡`F@r`á„0@r4º4ÑF@r Ö· ò@ràKV̺@r¸,w F@r ùºë@r>¼¹@rÿ>l@rÝßW˜¿@r À]ÞZº@r °bý0@r rÕA³Ü@rI !V4@r4c˜q@r5æ+f“@rM™Tb@r† Šu@r>;pa@r.Â}†@rX²´iÈ@r½1•A@rÄÓÐ4¥@rqù]ÿ@qýX¡´@qùqŒ¦}@qõÂ×ö7@qõ¢±ZÍK@qø›C(†§@qû²ð]?¬@qþê Ôsî@r@ëK}@rµ¡&&@qýVï¸v@qö°¯{º&@qð þŒK@qéâXýu'@qãñ^‘@qâHñèè@qáåTü:2@qáûÀeyñ@qâÃ):Áf@qä<=8 2@qã¼­á{@qàè´ÊÇ”@qÝáЗ0@qÚ§Îü}ª@q×:{ÌoŒ@qÓ™›é®@qÒã-W„@qÒVX67@qÑëÿÈ“{@qѤ$ƒZH@qÑ~ÉûÊÈ@qÑq?ŒÍI@qÐý„>@qÎÄ˱ëé@qÈç$á¡l@q¹2×an@q¼:×Ãö@q·Óò¸a@q¶dþà§@qµÍ3H@@r|·1šm@r}¹©2q@r}Ž#2g@r|Ú”}Ç@r{•@"ÐJ@rzt[ŒW”@ry;2?±‰@rw°YÑh@rnF_°)>@rd³›;é@rZ÷ô`q@rQN0@rG‹e u@r>Õ–Ù”@r8\U1@r1òé™Ñê@r+™ÒŸO@r%P‹§í«@r¬ZBl@rSA#ÍM@rBdµÀ@r÷a½ä@r÷ƒ”‰ã@rò™l"Ò@r0‰Éa@rœt³ò¬@rm*ÿ¡Â@rrªÔ%Y@r¬OÚÎ@rïºö8@rÒÇ÷V¿@rÎS?k@rá_gQÀ@r “mýD@rš=náY@r ¥Ý75@r#ÉD(¨¶@r'Ü"q¤@r*UÓ„@r, Ü;@r)˜$û›æ@r'¶YÄ@r$„±t@r!þÞõÞ@r¤€k±€@r2X`h@r{2þWâ@rh—ÒÇ@rWvbÆ<@r@EÞÎL@r‰K_x@rÝŒ²Ý!@r=®‘ÜY@rªVþÈ@r$+A¦ @reaÂíh@r´ÇÂð7@r CSQÓ@r “^â)-@r #¦ŒO—@r ëû®W@r …(/ø±@rUê­ ®@r_X¼¶@r¢Œpû]@rlÚ©«õ@r ©1ëAñ@r ÈIKÄ=@rÉŠ· ú@r¬]]@r'κm@r`äÜrA@r¹}.JS@r riTÂ@r Ä’ ñ@rE>^@r´Šj= @roÜõLÂ@qüww™†…@qöË¢2jF@qñl« Î@qïÏËz—"@qðU`xñ@@qñˆ¿vß@qójš 0@qõû±L@q÷ÆgÍ J@qôó`ÉL@qñCÇj©¾@qí·¬øú@qéùh[Yþ@qæ¹%0g@qä7´»ø@qãÌZÞ‘@qゞ»Ú@qã[’éÒ™@qãVãò<@qߥv4@qÚ& çäq@qÔDûô4¤@qÎi®àÐ@qÇ”Í* ”@qÀƾ0Þ@qº !ü´@q¹T“Ñ_ú@q¹~-^@rÆh*®@r€Ó1'ê@r€#àBÞ@rVÌ—ƒ@r~qÑhÈ%@r}tøõж@r|`KL*+@rx‚»Äi@ro`¢¡à@rf/ à¥@r\¢¿Y@@rS¿êƒ±@rIBø<}…@rB på°&@r;vP^ï@r4óUÖa™@r.€:à¥h@r(ºbÕ–@r"þu iÏ@rþß~"@rFgšá@rÔRa @r§çãi×@rÖž 8F@rPƒà@rvº¬ßÑ@râž9m@r«£?¥ú@rKað#Œ@rZ »;@räè)@r‡YÉãø@r@ÿYÂK@rzam@r!?–øè @r#Â)¾Ê@r&\1X§@r) ÇŽ3@r+Ô1åûN@r,þ ‘S2@r+mÃ@r(ú¡fÀ¸@r&ë+¿×Û@r$ÓLvô@r"é"ÇS@r!êR»@r ìݪÅ@rð×€Xó@röXâoX@rûí½ÀÕ@rÍPM¹Ï@r©É2lî@r’ùQy@r†­Gä@rˆq¸¦Ã@rH*²@rã‚fO@rêx/Ag@rÛyB5ê@râxéÂ@r" àL0@r˜ÉãÁ7@rFYZ–ã@r+Ù—ù)@rJpJ~É@r7ª÷û@ræ4¬l@rµ¬þŠ%@ræ°O”Ü@r J° WÂ@r =ïM\ˆ@r 9v¿ò2@r¦»Z@rës’¾¶@r¡Š,l@r@*(š@r™ØgªÎ@r çóï+@rLþ Û@rf4w{@qþ—/š@qüv— @qþòéï`@rd_~ËÅ@r\Ìñ@r¬è@r Uv@rš‹¸@rã<{@r€rT@qü÷õØ$x@qø¸…{>ç@qõr2v\0@qõ':|ˆ@qò­¯Ȥ@qîÅH¾@$@qêzZ˜`¢@qåÌ©(Ï@qàNÇ•×o@qÚì‰8@qÓ—hÝ/ @qÌÇÜ…@qŨÔ]¿ @q¾€ŸÝå>@r7ä>\€ü@r1W‰+.ª@r*Ú9šÉê@r&/Ö¼0@r"]š6†U@r4@rç³]Òc@rÛÜk @r^²Üo@r%žä¨@rFÙí@ryXx·@r¾|çíñ@rL@a@rš§¬œö@rheS}Ú@rcD@@rŠb!m¶@r!ÜáKŽ@r$i40>¨@r&Åk ¤Q@r(Ø+Èÿ@r+m”·d@r-@"VD@r-üÓƒÃ@r,vÐ<,A@r*çl0‹@r)O>ƒì’@r'®Ý«Á~@r&.Û[‚@r%F2µÆ@r$^îFÚ¢@r#y&4ŒP@r"”òê@r!²ÌÅh @r! p%<@r m&!ë@rÛ> Û@rUÍб@rÝhgƒ@r®L@rWæ–’ð@r¨ÂLŸn@r׸ €@rŒqa]@r,@Èž@r 3UÁ3;@r# )Ò’´@r%ò*çí@r(¨ÄÝý]@r(ú|탰@r$]<Å@rõOF *@rÃMEót@rÇÒä8@r€²®k@r·sJƒv@rV ÈDž@rß@ƒóô@rQ)Žž@r ¬†¢"@r8A @rŽãí@r@&prÎ@r³Ä¥ýc@r rS;ò@rwT䈫@r 0JKt @r‘õ§oÜ@r.D@rRÙ+[@r³êìÈž@r½VI–@r¿ÕG§;@r’º+’Z@r5½¾%a@r ¸¨Úô&@rSÛQ@qþ«FH”}@qúª‰!ûP@qöI fï@qñ†ÏW"Œ@qìcRœJ@qæÉ¦ÜÆ:@qàBŒ…ë@qÙo ¡c@qÒNÿòÿ@qÊâ0™Ÿ«@qÃ(geH¯@q¼¨xtLz@q¾Np—Š@rƒ0³*@rƒ ê~.@r‚ŽÐgô@r‚G¢(Ù@r‚73@r‚][—•@@r‚¹øþ„@rz¯µJ´H@rrÞ “ƒ@ri[)ú%ã@r`vVò@rWkÅž@rO´“~g@rH@È(^@rA{\ànî@r:Åûk÷@r4  Š@r-‰\sâ¢@r(µü‡‚ @r$pÕQ@r p™Zr¼@r´z6@r;­gL@r@¸úT@r3öÞ¼@rËJ „@rý:èa¡@r @'Kü@r2RVÒñ@re*i.@r'·Ò×Î@re[}”Ä@rÎd¸t@raëGº@r?oòóÆ@r!C½a60@r#aO´4D@r%—Hò³¾@r'äÌíL@r(ð@ŸeX@r(y•Öêy@r'în;O’@r'OÞds€@r&žù%@r%ï¸xéy@r%vÝúæŒ@r$úg @r${ÕÏ`R@r#ûÆ E@r#{lúÿ/@r#Ÿ™îõ’@r#Ýv§·•@r$5F–G‹@r$¨þHGÂ@r%:”anQ@r%/¼Øáü@r$üy1_Ð@r$á‚,@@r$àYi{@r$ù]¬3@r&It<„@r(ËfœŽ @r+3š±h@r- Õ&$@r/´Þ4¾5@r0Á>ÒMù@r,ÄZ¶Än@r(üA‰ñ@r%hÓHÒq@r" u¢ßÃ@rä‘E p@r P ¶@r"ªË”ø@r$ïœø î@r'>´`@r)6tº:@r(‘BðÌÐ@r#þÕáÆ]@rµ›[%©@rµö­É@rNcƒ @r•úM@r¡€¬…—@r²m­@r!/<ûÜ@r&ñmGF @r-\òÛBØ@r1&Þº-’@r)Q?õ@r!œR¯Sî@r*Æ÷X@r*ÏËË@r œ•í+@rŠ[Þ1 @rv­r@qþ7‹[Ë@qøÿUr3¯@qóg‡œ£r@qíoËêy_@qæ½Ý¬Ê‰@qßšS]Þ @qØ+t17&@qÐqâŠ`@qÈjÏãÖ@qÀƒDù>@q¿s^a=@r„ˆØöðÌ@rƒŠ"'ž€@r‚Á·ôf{@r‚/dOb@rÒõÍ®È@r¬?¤@l@rhøNrf@rwòD™c@rp¾&vÇ@ri˯L¢¦@rbŸŸWû|@rYÚ¤hŸª@rR1݃Pî@rKDn–>,@rDfÞiá@r=˜àÓQr@r6Ú*ì!Õ@r0GJ^ Ï@r+<K7@r&9âð@r!™^ó•é@r;ÚºÍ)@r ‚x4ö@rV O±ˆ@r÷,·…ô@rªø@rn–Íq@rDSeè‰@r27-F@r]ˆu¥ƒ@rµUL¬@r8¥…™@ræ„TÎ@r¾R¨@róŒ‘é@rLÀòKô@r¾®…«@rHo*¢!@ré9b@r áûú¨@r!/Y¹ª@r!he«k%@r!Ž<8¿@r!¡úõî@r!·Ù‰Õ@r!ýr÷¨C@r"?…ª¬’@r")‹ÞÑ@r"½vMŒ@r"ûƒšf¹@r$uaÒ@r&é©ò(@r'ÃïĤ@r)“x-Š @r+€‰Â Ÿ@r,R™@r,«+Ù‹@r-$A @r-¥ÝQ-A@r.IŒ~»â@r/‚>’2ý@r1€Äô®†@r3f_ú«ä@r52p2ø<@r6äTL=V@r8YC, S@r4úY4ôÁ@r1Ï4^o@r.Ø}ÞÂ@r,âÍý•@r)‹F l@r*ùK @r,X-Ná@r.Rûí@r0­½ c@r1ß*ÃOu@r2¦MË`@r. §¯{€@r*ã3~…ý@r'n\Oà@r$B’þã@r!`N?ˆ9@r#ns o@r(ï¢í»@r.¯þ´â@r1›¼æòl@r4ðrÖþ@r8…$6@r0žw(þ@r)[XV\A@r"ˆ kúˆ@r$¹T¯*@r1šxä²@rϼ”jº@r Þ+±A@r6"/è@râ,ôÃ@qú×ãdj@qônчS@qíŠïV´@qæE(Á»@qÞ[~[ì@qÖT[¦É@qΘœp¿@qÄD -–@q½"u@r…ÿ³¸@rƒË»°Ë@r‚¹ö#~@rÝtŸÀ@r5ÿ#•ô@r€ÃeL”l@r{¢õ£Ô@rsÃ3ýh@rl$—TÜq@rdÆÕ%B@r]©Ešçü@rVË_ìO@rQ¢•å@rL´’¾Ê`@rGCxJ¡<@r@]AP@r9† )$I@r3%aÙ@r-;>¾‚Â@r'º"4@r"{ŒÁ£Z@r~úÓ¥[@rÃq›!‰@rV³‚Ã@rÂH›Õw@r?b"âí@rͶe†Ý@rlüû—@rû‹h@rpìÊ×@rQz©@rÝØ¬ÔP@rÓeQ+I@rñ±[ @r…û†=P@r6¼Å×W@rÿ­ ¤@rßÞ'¡Þ@rÖclëG@rë™õy7@rùí12’@rô)€Â@rÛ>‰Ï@r°ˆ¦¬@rˆ(}ÍZ@r‰4ʈ@r†¨“Ѿ@r ¦™“§@r!{NYCü@r"tÀ ôÓ@r%9.Ôs@r(*¼ƒmš@r+5{e Õ@r.[Xn¬@r1žj2ª@r3bæÎwê@r4E!Ï|?@r5?TF|˜@r6RLdÏ@r7~ØšiŠ@r8ÕðyÏ‚@r:S0k¥’@r;¸,ª‰C@r=?dp@r>6Àü¡P@r?Oë¹3@r=J†þÑ@r:p ºÚÛ@r8|´&¶@r5ëXŽå²@r3øVLw-@r3Ð4ûsŠ@r5¥œ›@r7e2µÁ\@r97¥N­@r:¥ê$P@r<&:/#@r8ýû ˆ@r5Êg‚^È@r2Þ{»À.@r/´‚JfV@r,ÿŠ@r+Z—j¡@r.ÿà‘t@r2d‡®%@r5ˆF`R-@r8jÐßZR@r; ÖÔŽ@r7Mnj†û@r0¨-ô^T@r*q {™t@r$¨|‰‘h@rNáÃd@rcyÝ@rn?,â@rNààV@r /7V@¾@r³÷г@qûÚ‹Ãú@qô£Ç|@qìçýY¾@qäy/DÜ@qÙkÛb»@qÎãTí»<@qÄßlÖ‡×@q»_þÏ @r…azh†ñ@rƒÒ—t®Ä@r‚xfsÉÌ@rR§¯z*@r€aÒ½[@r£—áQâ@rw‘™<:Õ@roJ‹YË@rgBÉØÂ@r_{ö>@rWòwÔ²<@rQ äÔi@rKÔ.}ì~@rF¶j»@rA¯d&Ñ(@r<¾ÂIª@r7ä- ŸÆ@r3;žxß@r.²±© J@r(òkY¶=@r#GÍ5V@r~ñ|Xd@r%„Ò¸@rCí,²@ryÙSQ@rÁæóƒË@râ!ÆÂ@r„xÖ1@r.Þz@rQ_KÁ@r>ˆ«å@rU¡Ju‚@r•¢€òg@rábð@r÷&Úß@r b+Ñ@r$”:™T@r]Î`Y™@r¬Äa¡½@r x0´â@rؾ0èq@r‘ìoM@r6xª°h@rÊJdÉ@r`a­T!@rðV÷“@rÏØpM@rƒAÄ]@r 5UÐ+@r!ç<ƽH@r%êâPæH@r*.guÜ@r.Š„Ÿ@r3[ÕÕê@r7•·ªT@r:a,!…@r;ÊïG\9@r=L`¡"y@r>æT·~L@r@™¡Zw¬@rBD…„A¦@rCBoæð@rD(º›…@rDö¼üÜ@rE«Å× R@rFG(Df\@rD×6½fŠ@rBß—‹\¸@rAô]@r?Š ,o•@r>-—ëd@r=·–¤´ @r?Jô­P»@r@Ê@Æá@rB4¬.\ó@rCŠ}²Ç@rC6·h@r?¬ÍÖÙ@r;mS>i@r7Ée‹þ^@r4Â9-•@r2Y•$@r0è¸zœÄ@r4æ¢ý˜@r7 ¡âÚ@r9½œ~È@r`ÿgj´@r=ŽCl@r7„»<»@r1çûÝùg@r,¸‹I,@r'õTöøö@r#  ë0@r¬'û@ru\iéþ@rä¬ç™@r ÷ã†1À@r°TªC@qù7¥])@qíØÐ1©Ÿ@qâØ}ù^B@qØ[4ž”²@qÎ`Ãv^&@qÄéj˜Œ@q»óàò'H@r…u#«ç@rƒŸŠðÿÇ@rýÙ@x@r€Ê=Ú@rUÎT7@r|#ivr'@rs5çûµ@rjˆ+_)s@rb¨Ì£@rYémëˆG@rQ÷00ϼ@rKLšå¶@rEé,àC@r@œY5]*@r;eÂ×g@r6EqÉ@r19â\Åv@r,‡Üöò@r'î£ÈI­@r#YãdÛ×@rÉd˜ˆ@r<ð “@r‰»=øô@r80@r+qã“@r1ô°’@rV]u¨c@r‹̽8@rí÷Y¸Ó@rÿ¦-½*@r;»©<@r  ¡åö@r -Í{™«@r øF3@r Gq=…¯@r®ü”†œ@r-¦èÿ©@rÂr³¢@rlcêç@r Cõ„zØ@r Ë? Òâ@r>°ö@€@rŸ‚¡Ðì@rîêyÍš@r@C/lo@r¯x)]@rö¹€@rƒï£|²@rë“u(2@r!S¶¥@r&‹Dh@r,]¢>î@r1ÃÚUp@r7†7´=¼@r=e_¯y@rAMíZ³@rC=$ ï@rEC â@rGb¡HP@rIšœ$B@rKÍÕÞT@rLNM=æ&@rL·ÊOÐ%@rM ›äð@rMC æ]Ë@rMcg`Ž3@rL€àâU@rKé„ Œ@rIïý=C¤@rHô}¶ò@rG²ëOÚ@rE$¥A†v@rDC•# @rC…†´› @rBêæÔìØ@rBt$ò 2@rB!³¾z@r@a+0B£@r=^+J@r:ôhªÿ@r9$?ss9@r7ïì"®@r7X~<¼j@r9x¹`@r;ù Õ•@r>:Ä€~@r@=‡¹F@rBõ†Â"@rCb,«ý@r=òÑov@r8îy*¬@r4Un²#@r0(»gƒ@r,fšÂôM@r(ª²ÈS@r"‘Ï@rm˜Ögè@r ½ó:qþ@rJ°$ª©@qö¬VÐ@qëlõl @qକ” Ê@qֽɼm@qÍOã¨wÁ@qÄbÈÔ¬N@q»öiúc@r„8çÊ"@rƒ3`¯ì—@rK]B@r•œO$ @r~´pÓ@rwâ’Z@rnÕ¢v@re~L@r\©É«ˆÁ@rT§M¾ä@rK¸BÓÌ@rEs´˜q@r?áÎúš@r:fžjç4@r5,t—@r/±+PŒ@r*y!ò@r%ËiEAX@r!"*ð`ž@r}-®ú˜@rÜ9iJ\@r?U¡@r]Î~@rMûÉ|ª@r=o¢*œ@r+Ò@c@r˜~Ú@r8•7ú@rŸ¶c€@r ËÛH¶@r Ö­òv@r¿s†!÷@rœnîDÛ@rÈ,|²å@rw6X+Ô@r=ß§¿@r"/Ÿ@r øäZ@qÿ_÷8 @r‘v«¯@rÐæ®¼?@rü¦ëô/@r ÷³@rÉu@r'ŒÅù´@rIœÎ˜@rgç>Ð@rƒ¤A@rž 9 @r ¸Y]|ê@r'{¤ÜÒ@r-ò A†¦@r4áWÔ“@r;êš* ø@rC$™@rH)§DŽ@rJœK©%p@rM&±%˜@rOÇÖuö@rR‚~¬´@rUVìÕ*@rUvHðk@rUe"¾ «@rTŠ#yÇ~@rRõPÉ=™@rQ_æµC@rOG”ÍjG@rL—‚VG@rIô ¤K½@rG]c@D@rDÓ·’[½@rBW:uÂ@rA˜ý°£(@rA6ljê@r@÷ULI8@r@Û#Ž@r@âÁäv@r@yº?nà@r>®Ï6ô"@r=z=zv$@r<Ý\³§_@r<ÙÌË|@r=pE-\A@r?|:L@rA+ãÌŸò@rBþÑÑm+@rD“åõ;ö@rEê» @rGçÈ@rCô-¶Œß@r?†_¢@r;‚V™ÃÑ@r7èp"ÍÈ@r2Y0[I*@r*ˆr@r«:íýn@r  ›@r´d¢&@qý’UÇ@qò«·žæ@qçÿI|wd@qÝ÷6 Š,@qÔ•b¦å@q˲…ª×G@qÃN7·@q»iyô{¯@rûÑU I@r~¨ È @r}¤ïÙx@r|ðYkÎh@r|Š~›wÓ@rsVÞÒ”¢@ri£Hu!…@r`-UU@rVôSÓÆ@rM÷—E*@rEQ\Õ…N@r?|Ô¾e˜@r9¾S`1ö@r4uë¸@r.×É\f@r) Ð×@r#ÃtŸ¦@r3Ó‚ @rM6åì@r˜B  ³@rç ¾Ú@r 9”mE;@r .ô¿»@r ¤‚þ)@r 0`N@r èŒì€¼@r ίJ0ï@r ³Œ†ñã@rÉÖ@rµ‡9Þ@r `É£]@rt:qe@rF–l•,@rŒü«Ñ¼@qþ÷õ:È@qý]ò:‘Á@qû¿_•@qú@ È@qør³E©@qû\,¬FR@qþó%s¹ê@r†mºv@rvHP@r £Ewôÿ@r C?ö@rQ¢ O@rÇ4%‰»@r†t<2Û@rDŸ\ë·@r BôP?@r'@`òdX@r.ñO°Ì@r6•·%LÎ@r>-À+¨9@rE¸YEFO@rK¬®[_@rM æð _@rNü/S§!@rPçì­ð@rRÐ œ©N@rTµ­·š@rS¦$Žâ±@rRG†õ@rP¿ê?7@rOµHp@rMr°Ù+Ì@rK™ÙJõ@rIO)@@rF¥Z?¿@rD>,Äv¸@rAã²Ôh@r?– G—u@r>Éu%Æ@r>ÁÄä7Ï@r>Ü/Íoî@r?.¡ü@r?y<“„ø@r?øÖ-Í@r?a³ÍÞU@r?^[Õ·Š@r?ð6»Œ @rA·ì…^@rBÙ]÷ø@rEaïd0@rF£PÔr @rHåæ @rI1¹zÕÓ@rJ`ð”0@rJËkÈA=@rIŠx'ø±@rC?JÌUð@r;Íæ#ó»@r4'-ëµZ@r,J±Ó½¨@r$7ý_*L@r¼·÷Û@rtë‰t;@rhX@4@qù–*«Ì@qîþI•ë“@q䠡ˉ@qÚºö˜@qÑ㮑à@qÉŠ`Ðà²@qÁ®§Œ@qºN×§œr@r{cl Œ@ry wôv@rx+¨”ç>@rw‘³™Ú@rtO›M´Ç@rkçÉø!@rc:3D:@rZI6¿r»@rPùõ¯%v@rG˜ÿ$§z@r?j•lgQ@r9iüÎzZ@r3~ó%Xµ@r-©wõU@r'çöd*B@r";<'j@r±>-”@r8+EX¨@ro²6<2@r« .!.@r éÿ”@r,Sì@rýïÒ×ñ@ràð¢<@r®L{ù@r£’DÛ@r‚8¤#6@rOŒºÿ@rÚ‹Œ8@r” ¬µõ@rˆŽöã@qÿ^S*^±@qþ™ =(@qü¨pVùþ@qû%ÔÎiò@qùž=Äp“@qø½»B@qö€fáÂ|@qôêK>@qø@bÿXk@qûêŸ?˜„@qÿ‘:íÏ+@r4rtE@rÔ‚o^@r ›ø©;œ@r¢6r°J@r¦;´{@r¨˜AkB@r©Ü´Ç@rª™Xº@r%[¥¥<`@r,s¶8-@r3€ 7Â@r:Úäæp@rAr\!è@rFÄ’)Ù@rH±¤“áõ@rJ›¹Æú@rL‚Ùž5€@rNg È@rPHW½6¬@rO™ RÊ@rNÛâßB@rLîU2–@rK B¶#@rIƒÙQs@rGÜ‹ûöÁ@rE‹õ‹Óý@rCG`,Ò<@rA<Ù@r>ã ç)•@r<ö5ÛÈ@r;ÕvÁ»æ@r<'¡’å@r<šÃ -@r=.ñ[/@r=æRúP{@r>À§§Mq@r?y-ñ«Æ@r@¢â«ðà@rB_R«¶@rD°h9@rG–}$ñ@rK_+"I@rL^Š/c»@rMX.ffÃ@rM`¼â{Â@rJþ›¿Ï@rH„N“ÏŒ@rE°©äε@r>0€ç‚Û@r6|34Ød@r.“Pi­x@r&ud#5P@r!õï^w@rŒÐ˜c¼@r –ðÀÏ@qÿÚO@qõW™Âk”@që ù_¿¨@qàý ÉXï@q×&†GÕ¦@qΪEZ@qÆÙJ‰¬@q¿ƒàÝÓ@q¸¨1HÚZ@rvpÑQî@rt?†ð»@rr[îÏÜ@rpÂä\[@rk®Ÿg_;@rc±OE›'@r[pÒO@rRì¡á©´@rJ%Á^ua@rA%W?T@r9¯ÊD¯¢@r3\+á¸T@r-#â×µ@r'!¦»S–@r!3´µwg@rY¦»ZÚ@r<ÅGb@ra<Z«@r ‰Šõâ!@rµvx@räÖ¿Â@qþ9_7x@qýÊNÓDb@qý¦¸jÓ\@qýÂîÓ@qý[bó‚@qý3Œùÿ@qý$%Õ@qü¥3m) @qü)~%@qûŽ—Mn@qúÖRúîŸ@qúî«”@qøÇ¼•d@q÷WHÞ˜™@qõáÙ¦ÚŠ@qôg‚8zó@qòèU‹rž@qñfHÇ´E@qõ'RÎ’a@qøä}R@qüž Cô@rT'Áƒ©@r""¬@r÷¸k2@r @ mœÉ@r†?=*@rʃ½É8@r Ì¥òr@rPŒª¸@r#~‰]£@r*TÜîÆ@r0v‘ŸôÊ@r6àpº¯@r=="tŒª@rBmx>Q@rDV Ï Å@rF;÷ 1‚@rH䕜œ@rIþØ&HÚ@rKÛÙ–º@rKŠžiy»@rJ”)@rH–¨Kn@rGXXˆ*@rE“IHÒ?@rDD­V@rAðhŠWØ@r?Ú@ëÌJ@r=Ð_W&@r;Ñê9Áñ@r9à*¡1@r8½v€óá@r9fùzQ@r:1JØÙ€@r;í@ïé@r<*d ½†@r=Z5¥Uˆ@r>÷tŸ@Ñ@rAJ P€@rD-6@rG¡èÃ@1@rKsÁïq@rMN\0 S@rLQ˜‡á`@rIþÐ4L@rG’òS@rE0×@é@rBu†m´‘@r?¹m°Á@r9W= ,Ÿ@r1`ïºQv@r)6ÊÆ@r ØSÙ(ï@rE§÷„@r|€:ª†@rxÉ@qû ¿f5@qð×$Xæ@qæÚê~Ü£@q݃´ˆ@qÓ‹y’‹@qÊê§4º@qà'Ê—i@qÁà3ÕJà@qÀdœm» @rq% ½‘x@rn†ÐL•|@rl4 øS‘@rj,DæqY@rcV¢ª° @r[Ã.{KC@rSí0óf;@rKÔðÒ9 @rCz°Žè@r:Þ«ó¿<@r4€=µ³@r.TíN“œ@r(¤|Ü @r!¾®¾{@rSˆ†¤@rÑØ×¨@rkE@„@r R®-Õ@ršªõT@r·h4@qû×REz@q÷¼ŽØÇ|@q÷“ëP"@q÷i×VèQ@q÷>GPrl@q÷/‡bú@qöâ„+Á_@qö×è»)@qöé&'å@qö܇ë@qö±ÞÁÚ@qöiã<üÕ@qöJ¯2ç@qôê´ãµ@qóŒ&|ÈY@qò(œ‰ƒ@qðÀ+«Z@qïRåÛû1@qî=2ä¹ @qòÙêåþ@qõàž¼]@qù¬¿d{@qýuy°Þï@r; 7(@rV^b„g@r ß¹äÛ+@rfËÚ î@rì)žäT@rphn@Â@rôxÖ@r!¨ßfµÄ@r'–¡âÞä@r-yt:”@r3O,*æ@r9IOS@r> |2£@r?úó5#@rAÜÅ'#@rC»ŠÉG@rE—K^æI@rGp øló@rGzÅb@rF¥›fÂ@rD  ´@rC¶Ñø@rA éòª@r@(93P@r>F|ã;"@r<^ówf@r:\Ph@r8°wò9f@r6먀9U@r5áUåÃ@r6‚a*½@r7¢‰3FÌ@r8ã¤u7@r:Eù4îR@r;ÊM@r=›§nß@r?ÜxJ@rAœÊ[@rC~,Ÿñ @rEAȸåy@rFçba@rFÛÇ|†@rDg|ÈÌì@rAÛýVÇ@r?9 ÂÜ@r<~~y-8@r9¬ €@r4²£Ù¾q@r,{;«¹õ@r$¶^vÂ@rr—À¢p@r _ËS{@r ™ŠšŒ@rè @qõüŽh¿@qìw˜ì@qâeΫ.@qØí4éb@qÒÅñ¨@qωôPŸð@qÎGñ@qÌ• »Ü@qËjë@rkÓŠ@rhwFç ô@re·IñÆ@rb/`/à@r[Fi8j @rT{ò %@rL®éaܶ@rEþ Üh@r=ÉÔˆ@r5QõÞQç@r/emδ @r)cc ÐÌ@r#Kâ_žV@rö&ä@rÜ©vÏk@råòJÈ\@r m ϸ@rç$R˜*@rîÅš§@qûÔžlÄÞ@qõæà_à@qñ‰‹[i@qñZžò €@qñ*%ㄉ@qðøÌ@qðÄ]KÄD@qðŽõ§ùC@qðÍq ï@qñM ½»N@qñ®@ž…ø@qññÑNÉ4@qòxÿä@qò"òö@qñ-x#`@qïÄCiR¹@qîr]µ¢@qí‘%AÀ@që¿ò/ã@qëä[ @qîüÖª>"@qòÞäLØ@qö½Kôøw@qú˜L¦Œ@qþp"ë™W@r·Ë(h@r%ˆþŒ@r H.%Ýy@r |Âω@rÑ©îñ@r•JzÅ@rÚ|ލü@r%6eF9G@r*‡2ÿV@r/˺’ J@r5p㼩@r9¿]-¹O@r; =rKÛ@r=}þ» “@r?X¨Mu@rA0A9«@rCÐ\›b@rCieæÝp,ó@r<;bêÖ]@r9x¿3Y¶@r6ž¶é¨¾@r3­ <·@r0Aãdp»@r'Ê@ ¢s@r :S‘Î@rCPŽíÊ@r 2ÿªÃã@rîÀ3Œ>@qúv×Z@qð­šÌ @qè¯Å8[n@qãÿ( @qàÞG$Î@qÜö9qR@qÚžmRþH@qØøë/7é@q×aCõ‘m@qÕºì7¼(@re…×TG@rbÎU¸@r^æ™mì`@rYÿ^©•¨@rS|Ä6´ù@rL¹ü|Õ@rE´˜¨ƒë@r>o°XX.@r6ꤩÁ¨@r0%Û%(?@r*aØB=@r$‡~…@r—áJc@r“~'0@ryüÃxT@r PÅ^l@r ¦Ú»@r—Ùj™2@qÿÕ;Ý<@qúϧžO6@qõ‡ò F@qòžì¹'6@qñO­F@qðwg‚M§@qï-èÅÆ¬@qíÁ…È*¾@qì2î¹r @që‘úLÞ-@qëÐ?¬•«@qì°VJ@qíMßÁM´@qíᎠBJ@qîY{瀼@qí:û>Ú´@qëÿv ~@qê¾õ ä‹@qéyŇ@qè/Ub«1@qçó::ƒ@qëë'àWƒ@qïß.e°@qóÏwã@q÷¼ƒø@qû¦O%C{@rßã¥@r$6cáƒ@r *3:¥@r.oöíÂ@r1‡Mž@r4Bq@r7hG@r"ßh¡@r' ¯l3@r,U̽¸@r0þ<¢ãù@r5hß–÷A@r7EÅG0Ù@r9€Ò¯É@r:öMd|@r<É•–Öh@r>™üZŒV@r?Vd˜9b@r=ïó%ò&@r<ˆu…±@r;íg*@r9¶\k@r8Bm“R˜@r6y˜üAÈ@r4ÀP2@r2È<*x^@r0ûGÀ»¨@r/6d‚1@r-yÂï•å@r-ÁJ™[ò@r.Ì5§j@r/Þ.Œì@r0öåó'@r2j >@r3>›&Là@r4Ö^q@r6i¡±œ@r7àtizÒ@r9:=|¾Þ@r:vºxÔ¨@r;•§€ýp@r9{°0è€@r6°¬"7²@r3ÎÁÍ«#@r0Õ´-¾v@r-ÅD¢¿@r*2æZo@r#M1…õ<@rd„–>µ@rI¨–mK@rüX<Ü@qÿ…€¬8@qùBfÙm@qóÌ߈“-@qïE)Ž@që;ÆX@qèÆ†&R@qæGˆ¹^€@qäÓPê‚@qãñÑ+ìf@qâDµ¬µÁ@qà‰]km@r`þß™Ñ0@r\Hqv"@rWÁÎDÚ_@rRÀù4@rKø‘i;Ù@rEšÏRÙ/@r>ý*žö@r8ú‚\@r1’Öy@r+޽xŠ@r%r;Â@r¿¦ïKO@rø6`c|@rܯ H@r*§›¢M@r ¢¶û@rqÄÇn¥@r”*ú„@qþsÚ0]@qú´”¨Æ@qõn•î™´@qóð¥íd—@qó^הΠ@qò©cœ‰T@qñÑErñ@qðÖm§Ý8@qïºWѱó@qï„\)‹@qïi¢)TM@qïGZ19½@qï̤±Ø@qîíA“Æ#@qîŸÃ#—@qìÆ¡pñJ@qêëeê@qé9ëÉ0@qç/LlV@qåNÇ1ë“@qäê‚í@qèÛ¬×Õ@qìá^_˜@qðãe…/L@qôâõ@qøÝvh°@qý‚~By?@rÈÓÓ@r Ç %©@r Nõö¿ @rû¼K@rÐrè¹Ó@rRæ­ç0@r ‘w\¦@r$Å'ú¾f@r(ízù@r-SÌ@r1qÏ>4@r2×o!J>@r4xƒÜŽ@r6>|fÀ²@r7äCÀùc@r9€–ùL2@r:\âò˜§@r8Ƈ°@r7-ö·Q@r5“DÎ-@r3ömïÙÂ@r2WtZ@r0«zÏöß@r.ô5}°@rñ#HÊ@qývk`£@qø¢(zcG@qõܬFö@qò,_(Ú@qðn»…ì@qî¼ØX1æ@qî)w:p§@qîZ5j»@qí?ƒyEõ@qëogжÜ@r]—‘ŠÞ¥@rXÓDïÛø@rS¾ Ë#@rM^ÕC@rFŽ» n@r?NÎD÷@r8‡–mîx@r2Úäeí@r+p\2oL@r& ±]¼@r ˜µ×@r œˆ£@rly-Aj@r·­$ò•@r îG²FÙ@r¸–ìœ@r¢`&¦@rÛD•ß@qýZ¾œ·@qù™Å›r£@qõ˜ùuCÁ@qõnÊL¡&@qõK*:“9@qõˆ|à@qô›¢Þú@qô5½+@qómMD¸.@qó‚ñ.'d@qóôÝ n@qó—¢Óm=@qó—E!ýl@qó%såC@qó<øQÅ@qñ‚-j4Ð@qïÆRíÌÏ@qî­¸s¨@qìIjæ©d@qꈷƒïÆ@qêRÂf ]@qí/Ç‘ƒ@qð!Ü«¬@qó'È¿X@qö?r³7ˆ@qùhDž@qýmv©½-@r)Å1›”@rçÚO” @r ¦téœ@rdSöHø@r 6LÜÂ@r#z¹Æd@rߦÝäý@r ‘übPZ@r$9Çÿþ<@r'ÖUÕÙ@r+fñFˆ¤@r-Ìâï@r.±ú]³ß@r0<+Hÿ@r1½'6Ža@r34µ,«†@r4Hßü$@r2¹ä _@r1)•Œ?@r/–Þc¿@r.ý‡>]@r,jáUZ0@r*Òb¦|@r)?æ‡77@r'´’¢±|@r&0™ŸŽ7@r$´.W@r#?„öØÔ@r"¶…Éû_@r#óZÙ‘@r%6–Åæc@r&€j’´@r'ѤžŠ@r)(ŸÑê@r*{3‹€×@r+¦\]s5@r,µxAµ\@r-¨B>¥‘@r.~s…b¤@r/7ÃeØÌ@r.ãìÙÌä@r+Û!U ë@r(»ó‚pÚ@r%‹/YÞ!@r"øÓ€Y)@r ™§#D;@r $Ãí@r&ñ#U¢@rÌqÝ–L@r ýaþ}°@rº†)^@r¬¹©@qüÜ­å\²@qù÷‰yU@qø¿€ý”@qöΜ¹³@qöXûPãN@qö£ÃÃß@q÷¯ì‘k@qøQÂY¯@qöm ‰O1@rZ"À D¶@rUPÌO$@rP5 0¾W@rJ‰éÒo8@rDo¦£Â·@r=çKÊ|@r6ñ(èC@r/Žft €@r(1;0N‹@r!qfØC@rÒdÀ¯±@rm“–Çì@rôEªi¤@r fôè¬@r‹j…¥È@rm„1$7@r (S|v@qÿkN9è¯@qüˆé® @qùfçÞ3@qö¬®J@q÷È*ÔK@q÷a¾ÍPØ@q÷ˆV5×O@q÷P“lÀ@q÷qnû@q÷Pøa²@q÷«?À@q÷ÃÑA@q÷òÙŽí4@qøœî@qø<¾{ª@q÷ÞË÷i@qöC³I¬\@qô¦Æ]@qó1ã«"@qñh$Û¼D@qïÆÍ?*$@qï -ëñÅ@qñ°û$‡–@qóÖ ŠRR@qö¤¯fŒ@qøZS= @qúµé&d^@qþ6}<@r_ž—Ÿ@r •gö@r 2xF@r•¶¢º@rêœÙÖ@rœéÐ@rë™ð§ë@r1x+ßÊ@rläq¼ì@r"'^@r%Á‡gI¡@r'kä)÷@r(Úlõê2@r*@U5,o@r+ÝQÔ@r,ðbÍA@r.1éߪ@r,«ð:“œ@r+#š›&G@r)˜ëü?@r( ç.ši@r&|ŽÛš@r$îKzAµ@r#€0vR@r"µvȲ@r ¸uqÄ@r_‚©I©@r…T@r!D7Cv@rvƒùÇe@rÑí,L1@r!3±ÙÂ@r"œlÁ@r$ ³Ì]@r%ufϵÏ@r&m^Ü @r'I¥¶4~@r( öB¼À@r(®•w,@r)5‹°7³@r)µ¡ä²@r&ý‹Pþ’@r$`å§‘R@r!õ¯d@@r¼Rq-#@rµ>8<2@ràã÷c@rú¹½öB@ri—µ+ @r a¢¥°p@rãª~Š@rð†än@r‰–¸ª@qþ¶1õ@qý ñ¹Ì¸@qüµò¤«2@qý åø&@qþDñå‘ç@r)襠+@rΕëö@r‚žÑ95@rV y–8$@rQÁ—@rM.YG®ö@rH4øÊ@rBÎ2î¼@r<úê+¸*@r6»÷#¨L@r0,BI2@r)wè_¡X@r"öKe6c@rXF-FV@rž üf@rÇÎÌq@rÕ¾--Æ@r—c"Õ@roR‰@rKM3:f@qþDZ @qûýg·Ý1@qùx5–@qøãÏ@qøîñ—7@qù¢G”8@qú4T\'<@qú¥œ›å>@qúö±ˆLç@qû?˜|v@qû¤}n5w@qü.ZçÏ@qüXø·ý@qü©)•}m@qüó ª!ä@qü‡ÿñç}@qû A9 \@qùŒÏQVf@qø Ù°šÚ@qö‹º~ú@qõ ÈyÆ@qôÒæƒª@qöé/_@q÷vÕÀÓ@qøæ;ÁgD@qúgB™®@qûøkTiD@qþ'hÓ@rÜ_µsê@r*b1Ü@rxàß×@r ÆŽ7¤@rÑF4@røR9p@rþ™Í’@rÙ›×"@@rªC‰4J@roÕhPˆ@r )•G£O@r!½|¹ej@r#ŽÜl»@r$Jµ¹‡6@r%ƒ¶@fÚ@r&³TÖáO@r'ÙUOÞ@r&œ{>?@r%I®@r#™E¯W3@r"”û›@r ŒUóÀ8@r?›ëw@r´¯d@rpÑyz@r3Ë a?@rýÑ´K@rÏÑb @r§à&Ë®@rî´ˆÞæ@rañâ?©@rÛNÚ5&@rZþÔ¢›@rá5•µ‹@r n'I¨g@r!PµòLå@r"sû6Â@r"´öÈ@r#@ü î+@r#³@=GR@r$ }¸ô’@r"zPG%ï@r 7X R.@r$á¿:@rCZfü2@r“6ÐÝ@rì3B@r7o90À@rm5(Š @r )ê”é@r nh!ªƒ@r;’r-²@r’U~„@rs§!Z@rAhdMv@rËïâ.æ@rU7³ˆ@ršb”@rº, ˜Ñ@r¼%­|R@rÖ@lÓ¾@rSÊ`ïæ@rN…•Ú&@rJ¨Hrsî@rF^_Ö‡@rA¨ËÒt¿@r<ˆu=óÂ@r6þ>­j@r1 ÐZ¶@r*â ² ª@r$Û­ŽF@r=Å™@rÁýñÙØ@r*ºæ‹§@r x.½¿7@rÛgÏ2C@rgÄ݇ @rϽš®@qÿç WL@qü4ÔÈ@qùÌÒç@qù®Ç\ñ=@qúî1ä·­@qü ±7 (@qýÐS¹@qýä5¦•@qþ Ÿ˜Ñ@qÿ;¸•Ð@qÿÇ^;q@rLM¨Ä@rÉü§¯x@rA’ÄwÕ@r³Ëã_@r7»¼Î@qÿØæ… @qþx€G-&@qý¹[3@qû³Â9,û@qúOËRÀÞ@qùër•ã:@qúlôßN@qûÞôi@qû«©Ç 3@qüeÏdÎM@qý/Ê»C @qÿŽH¦v@r®Ô´w@rHæÚ..@rãp¼=Ú@r }n?v@r ›ß&„@r2ñ$Õ@roŠœ8@rŠ'šŽØ@rñœëÔ@rN°@ržÀ„Ju@rRë“@r<®æY@r[ ‰xã@rpÔ*÷Ñ@r }B»8%@r!€ÐP@r ‹\J¶.@rÔÓJ@r—ÃD=¿@r+Ëä@rš‡/I@rs¾»¸@rÝÂÏ Ý@r¼ãµ0@r¢™mÈ@rc«b@r‚¦’–2@r}mÉÈ@r[äd”)@rðn÷Ú@rѦA°¡@r’G—ä+@r1ÚÆ/S@r¯å¢Î­@r Lè–>@r1õ§ü@rª¸uÏ@r QŠj@rPyæ#Q@r|넲ì@r¾²³ @rÔ@ªJ@rc+‰Á@rŽÛ)@r4:pú@r ߬®@rÞÉ.n@rÙ øA~@r X)Þ@r \œn8@rç· W6@rúO¦@r•ctH@r¬t˜0 @ruQ±óÒ@r à-•Sa@rò6òª@r5Ø¿¸Ü@r#(à÷ž@r$é9ôÌ@rOs¼p9$@rKÓò`è@rH¡DšÖZ@rE–m¼6@r@ýò6r@r<ŽIÁÂ@r7¶…Jƒ@r2['Ö @r,o>n-ù@r&gµ C´@r DÅÆ&W@r©Eô@r­–á™j@r 9ÄJµ|@r =åDï@r ÉËða@rΨÖ^f@rrsÐxò@róÁ…î@qÿS&Ö—†@qÿ<åKîà@qÿßCÝñ1@rzåsù @ráe›@rŸ¥ó¿@rnÜí{”@rDpP*]@röE™#,@r¡QRݵ@rEã°´Q@räLŒ@r|Ûp¿A@rî æ+ @r¬³™fû@riëΗ)@r%æÈ(@ràÓï8/@qÿšæÝxÍ@qþêSµ8´@qþ¨¡G˜’@qþ{ýì-@qþ`?Z6J@qþVuóž@qþ\76¦¼@qÿ•Жø{@r|Í޾@re–\8¶@rNÒÓ{+@r7(¤‰b@r =ç6R@r %ƒ»|š@r 8å…FJ@rBÝ;?ì@rB¨àzð@r7…ë@r ±'ÊY@roÖë«T@rtà ]¹@rqq~v@rd$™Ò@rMäw>õ@r.qO:@rxi´§@r¤%@r”<,#º@r5¦áO@r¥”!D{@r*[y¬@rû@ÿ»Ô@r¡cQö@r›»¯Ðr@rº/õ^@r¢ô@r$dM™ž@rââ–ª@r—àgÒ@r-?0Z¦@r¢†v™°@r÷:¹S@r*Þà5@rëVÐî@rm’èø@r¹ºWy£@ríþ.@r)v å@r ià|@rË8û;@r8+‡¡È@rÓÉ:B@@rž‰äœ@r˜è=z@rÃaúxž@rwßJØ@r®ÌÐwå@r í³1&c@r °Ð,@röÂ(\@r»ØB@r dÉ5á‡@r ¦$¼~¯@r2Cøs@rŽçoa!@r½Gy\y@r"¾ªV§V@r*”d_¶Ò@r3?Ø7e|@rKÉWž5•@rI 0L7º@rGÌß$C@rD&&u@r@Ì;~e„@r= \@r8ãxŸ¹@r3Ï¡ r†@r.Þï®@r(S{ë@r"lïËi5@rk¹Ž´´@rPT·_@r#`[ö@rŽa f@@r ÕÌQ•å@r ú@¢`ƒ@r üZqB4@rÜ´ENâ@r›æÒì@r[æÜ¾Z@r ;ÿD”@rÞÿ°@r•Êÿ=ƒ@r G’ Ìì@r ó¸f¤‘@r ôµuÊ®@r õ98ÎÊ@r \‚Zì@r `'ÖHL@r È¥˜ú@r QáçlÀ@r ˜+®ŒÄ@r }v@rʶP$À@r-þPWö@r³H‡Ø@r[»ô²ž@r&]_t@r2)@rC1¦ @r›ÊÉ¿@r 씚 @r X¸UÚ@r Þ÷~Z,@r~·Ü@r4пÓs@rÙob¼ì@r}€Ô@r*}Äå@ràÍòË@rŸDy›@qÿdeG @qÿ~LD~Ÿ@r2dFaï@råôTÒ@r˜Eû‹õ@rH¢·P×@röSÚa7@r•û¦À@r„##öt@réLÃË@rIåm@r ¥Ä…Þ@r ü½QÉÊ@r #pׂ@r &?IŸ@r):¢h@r,#rÞ®@r/›É©t@r3¯Ð'@rV†¿z@rxiÓÿþ@r£„µðN@rØ:RÈx@rî $L@r ` z@r Ä»´t@r O¯¿¿@r ØCîóü@r `CÔÂY@r ç°!í@r l¼¼„ @r *‚!ë´@r I÷3п@r JÌQµ@r ,‚GTf@r î˜1Íe@r‹e}.@r×\Ž/@r+’÷Œ @r!±Pï¼j@rJÓëúoç@rH8½#@rE~úGÇ2@rB¦æþ¼}@r?°ÆÆTí@r1@r €-!Ðf@r 虂Æ@r ZÅdìÁ@r ×Rc[@r ^>µ@r ê¢R¬Ø@r uÐk¥@rÿÇÉ9@rˆ‰ã¾@r«ñe@r–n^ÞT@rSžWh@r ·„@r ¥+$††@r w]@r zŠ€@r ´jH@r ®Ê @r yÊg@r -¡×8Õ@r ÉHT‘X@r LoI¼B@r¶Æþ²@r wóZÙ@r †ÜûkB@r 'Æ™Ç@r ë˜ö?[@rÒº9„@rÝ’”“T@r ŒSßW@r¿©Ï®Ý@r‘üÚˆ-@rß`$[@r©B C@rðPõS@@r#µÈ +d@r(¿yiŸ@r0)[¼À@r9NýÿÃ@rBÅ Q@rMBôÙ³•@rX¤ëÌK@rN€ |çg@rL7ï=Þ›@rIÑl}o@rGLßí¥ù@rDª‘×¥Æ@rAêÇIð@r>™f€>@r:Z$/2#@r5œ!{Ï©@r0`¯?S$@r*©v~†P@r$x’ F@ròmE˜"@rGfSu@rù<‡Sº@rOªü³g@r…;7³G@rš“âžï@rYúxÐ@rßE–¶@r s‹ÄÐ@r3±Êõb@rUJøC@rq‰ul@r ˆ·l%£@r º´Ö_@r+¶#µê@r¿üÙ‹6@rvƒHÏ@rNFR.Ô@rFD‰E°@r,À&´–@r?d‡/Ù@rmä "Û@r¶÷fO¿@rU@Þž@r “·Ù«ê@r $Ùíº¬@rçM!¤æ@r·Íeˆ?@r‘ÍÿüÕ@rt\¯ê @qþ^‡ ÇR@qüO]G—þ@qûÉ=µjw@qûÎ>¶*S@qûÒ­É@qûÕÍOB@qûÖã݃@qûÕ5÷„@qüŠð 0)@qý¡æ@qþôªD¶Ä@r"Àú Ã@rLðÚ@@rp‚±@r•otá¼@rÀM|@rêü²X@r±I\Î@r@w’:@r kóêâÀ@r 3šc‹Ø@r ½.&d@r Ov[ÿ@rêÙyaŠ@r¾ê@r>‹LÜ0@r÷;[ @r…¢éä}@rËSO‚@ržµ#@r)`ÏÑË@r²Î»M`@r:ÿ3È@r} ‰¾@ríg°m˜@r?—³Sž@rs_¶@r‡[ÚwG@r{Þ‹n@rG€4ª@réj@ÚI@r’hŠ@rš Z1ó@rªÑ~K@r ÄÖNÖ@r èAz4~@r ¶¡K@rgùÌÆ@ra˜ ~}@r}ùÈq%@r½‰a^3@r ³Ah@r†6Ò~e@røß@rõ2Ê«$@r"c™¸p{@r&MfvHI@r*³º*Sš@r/—½— …@r7?b¿À@rA Ç|€Ò@rKž·ÀϦ@rVùá®Ì @rbÊCrT@rO֯ߺ·@rMÁ÷…Ò°@rKué[Í@rI?vVø@rFÒANÖŽ@rDHfìÌ@rA~»Y´@r>7É æn@r:sïq#@r64çÿúþ@r1|eSÛp@r,LŸæ@r'Å„Àׂ@r&g)×Bq±@r T“w@@r säŸÈ^@r œYoûø@r Îí!Ê@rt¡@ø@r‚C×@r°1hAÎ@rß¾U@rt§ò«g@r JöC@rÅpÆ{@råéUj@r#~‚œQT@r'{¢Np@r,õÙÇ@r1)lw@r6 tK@r=u»€óÍ@rH"†hÅ@rRMâÒ¢@r\ ¼Rú@rfNCQ@rQSw@rOqªð{Á@rMr„<¥{@rKVi¦Þ@rI¥• @rFÚoFÄN@rEwšZ@rB²/Ô»½@r?åK»8@r<Ÿ>>@r8áè& æ@r4¯3Õ\@r1Ï j@r0€àM¼@r/2Dº,Î@r-æ(ÿiâ@r,›ßFî@r+S|O~k@r*zº?*@r*”„¯JQ@r+O'!@r,Mº±êƒ@r-¿-e@r.ížV[@r0Eù„\Ö@r/ FÙËk@r,’&°*@r*@ê>@ê> @ê> @ê>@@ê>@@ê>`@ê>`@ê>€@ê>€@ê> @ê> @ê>À@ê>À@ê>à@ê>à@ê?@ê?@ê? @ê? @ê?@@ê?@@ê?`@ê?`@ê?€@ê?€@ê? @ê? @ê?À@ê?À@ê?à@ê?à@ê@@ê@@ê@ @ê@ @ê@@@ê@@@ê@`@ê@`@ê@€@ê@€@ê@ @ê@ @ê@À@ê@À@ê@à@ê@à@êA@êA@êA @êA @êA@@êA@@êA`@êA`@êA€@êA€@êA @êA @êAÀ@êAÀ@êAà@êAà@êB@êB@êB @êB @êB@@êB@@êB`@êB`@êB€@êB€@êB @êB @êBÀ@êBÀ@êBà@êBà@êC@êC@êC @êC @êC@@êC@@êC`@êC`@êC€@êC€@êC @êC @êCÀ@êCÀ@êCà@êCà@êD@êD@êD @êD @êD@@êD@@êD`@êD`@êD€@êD€@êD @êD @êDÀ@êDÀ@êDà@êDà@êE@êE@êE @êE @êE@@êE@@êE`@êE`@êE€@êE€@êE @êE @êEÀ@êEÀ@êEà@êEà@êF@êF@êF @êF @êF@@êF@@êF`@êF`@êF€@êF€@êF @êF @êFÀ@êFÀ@êFà@êFà@êG@êG@êG @êG @êG@@êG@@êG`@êG`@êG€@êG€@êG @êG @êGÀ@êGÀ@êGà@êGà@êH@êH@êH @êH @êH@@êH@@êH`@êH`@êH€@êH€@êH @êH @êHÀ@êHÀ@êHà@êHà@êI@êI@êI @êI @êI@@êI@@êI`@êI`@êI€@êI€@êI @êI @êIÀ@êIÀ@êIà@êIà@êJ@êJ@êJ @êJ @êJ@@êJ@@êJ`@êJ`@êJ€@êJ€@êJ @êJ @êJÀ@êJÀ@êJà@êJà@êK@êK@êK @êK @êK@@êK@@êK`@êK`@êK€@êK€@êK @êK @êKÀ@êKÀ@êKà@êKà@êL@êL@êL @êL @êL@@êL@@êL`@êL`@êL€@êL€@êL @êL @êLÀ@êLÀ@êLà@êLà@êM@êM@êM @êM @êM@@êM@@êM`@êM`@êM€@êM€@êM @êM @êMÀ@êMÀ@êMà@êMà@êN@êN@êN @êN @êN@@êN@@êN`@êN`@êN€@êN€@êN @êN @êNÀ@êNÀ@êNà@êNà@êO@êO@êO @êO @êO@@êO@@êO`@êO`@êO€@êO€@êO @êO @êOÀ@êOÀ@êOà@êOà@êP@êP@êP @êP @êP@@êP@@êP`@êP`@êP€@êP€@êP @êP @êPÀ@êPÀ@êPà@êPà@êQ@êQ@êQ @êQ @êQ@@êQ@@êQ`@êQ`@êQ€@êQ€@êQ @êQ @êQÀ@êQÀ@êQà@êQà@êR@êR@êR @êR @êR@@êR@@êR`@êR`@êR€@êR€@êR @êR @êRÀ@êRÀ@êRà@êRà@êS@êS@êS @êS @êS@@êS@@êS`@êS`@êS€@êS€@êS @êS @êSÀ@êSÀ@êSà@êSà@êT@êT@êT @êT @êT@@êT@@êT`@êT`@êT€@êT€@êT @êT @êTÀ@êTÀ@êTà@êTà@êU@êU@êU @êU @êU@@êU@@êU`@êU`@êU€@êU€@êU @êU @êUÀ@êUÀ@êUà@êUà@êV@êV@êV @êV @êV@@êV@@êV`@êV`@êV€@êV€@êV @êV @êVÀ@êVÀ@êVà@êVà@êW@êW@êW @êW @êW@@êW@@êW`@êW`@êW€@êW€@êW @êW @êWÀ@êWÀ@êWà@êWà@êX@êX@êX @êX @êX@@êX@@êX`@êX`@êX€@êX€@êX @êX @êXÀ@êXÀ@êXà@êXà@êY@êY@êY @êY @êY@@êY@@êY`@êY`@êY€@êY€@êY @êY @êYÀ@êYÀ@êYà@êYà@êZ@êZ@êZ @êZ @êZ@@êZ@@êZ`@êZ`@êZ€@êZ€@êZ @êZ @êZÀ@êZÀ@êZà@êZà@ê[@ê[@ê[ @ê[ @ê[@@ê[@@ê[`@ê[`@ê[€@ê[€@ê[ @ê[ @ê[À@ê[À@ê[à@ê[à@ê\@ê\@ê\ @ê\ @ê\@@ê\@@ê\`@ê\`@ê\€@ê\€@ê\ @ê\ @ê\À@ê\À@ê\à@ê\à@ê]@ê]@ê] @ê] @ê]@@ê]@@ê]`@ê]`@ê]€@ê]€@ê] @ê] @ê]À@ê]À@ê]à@ê]à@ê^@ê^@ê^ @ê^ @ê^@@ê^@@ê^`@ê^`@ê^€@ê^€@ê^ @ê^ @ê^À@ê^À@ê^à@ê^à@ê_@ê_@ê_ @ê_ @ê_@@ê_@@ê_`@ê_`@ê_€@ê_€@ê_ @ê_ @ê_À@ê_À@ê_à@ê_à@ê`@ê`@ê` @ê` @ê`@@ê`@@ê``@ê``@ê`€@ê`€@ê` @ê` @ê`À@ê`À@ê`à@ê`à@êa@êa@êa @êa @êa@@êa@@êa`@êa`@êa€@êa€@êa @êa @êaÀ@êaÀ@êaà@êaà@êb@êb@êb @êb @êb@@êb@@êb`@êb`@êb€@êb€@êb @êb @êbÀ@êbÀ@êbà@êbà@êc@êc@êc @êc @êc@@êc@@êc`@êc`@êc€@êc€@êc @êc @êcÀ@êcÀ@êcà@êcà@êd@êd@êd @êd @êd@@êd@@êd`@êd`@êd€@êd€@êd @êd @êdÀ@êdÀ@êdà@êdà@êe@êe@êe @êe @êe@@êe@@êe`@êe`@êe€@êe€@êe @êe @êeÀ@êeÀ@êeà@êeà@êf@êf@êf @êf @êf@@êf@@êf`@êf`@êf€@êf€@êf @êf @êfÀ@êfÀ@êfà@êfà@êg@êg@êg @êg @êg@@êg@@êg`@êg`@êg€@êg€@êg @êg @êgÀ@êgÀ@êgà@êgà@êh@êh@êh @êh @êh@@êh@@êh`@êh`@êh€@êh€@êh @êh @êhÀ@êhÀ@êhà@êhà@êi@êi@êi @êi @êi@@êi@@êi`@êi`@êi€@êi€@êi @êi @êiÀ@êiÀ@êià@êià@êj@êj@êj @êj @êj@@êj@@êj`@êj`@êj€@êj€@êj @êj @êjÀ@êjÀ@êjà@êjà@êk@êk@êk @êk @êk@@êk@@êk`@êk`@êk€@êk€@êk @êk @êkÀ@êkÀ@êkà@êkà@êl@êl@êl @êl @êl@@êl@@êl`@êl`@êl€@êl€@êl @êl @êlÀ@êlÀ@êlà@êlà@êm@êm@êm @êm @êm@@êm@@êm`@êm`@êm€@êm€@êm @êm @êmÀ@êmÀ@êmà@êmà@ên@ên@ên @ên @ên@@ên@@ên`@ên`@ên€@ên€@ên @ên @ênÀ@ênÀ@ênà@ênà@êo@êo@êo @êo @êo@@êo@@êo`@êo`@êo€@êo€@êo @êo @êoÀ@êoÀ@êoà@êoà@êp@êp@êp @êp @êp@@êp@@êp`@êp`@êp€@êp€@êp @êp @êpÀ@êpÀ@êpà@êpà@êq@êq@êq @êq @êq@@êq@@êq`@êq`@êq€@êq€@êq @êq @êqÀ@êqÀ@êqà@êqà@êr@êr@êr @êr @êr@@êr@@êr`@êr`@êr€@êr€@êr @êr @êrÀ@êrÀ@êrà@êrà@ês@ês@ês @ês @ês@@ês@@ês`@ês`@ês€@ês€@ês @ês @êsÀ@êsÀ@êsà@êsà@êt@êt@êt @êt @êt@@êt@@êt`@êt`@êt€@êt€@êt @êt @êtÀ@êtÀ@êtà@êtà@êu@êu@êu @êu @êu@@êu@@êu`@êu`@êu€@êu€@êu @êu @êuÀ@êuÀ@êuà@êuà@êv@êv@êv @êv @êv@@êv@@êv`@êv`@êv€@êv€@êv @êv @êvÀ@êvÀ@êvà@êvà@êw@êw@êw @êw @êw@@êw@@êw`@êw`@êw€@êw€@êw @êw @êwÀ@êwÀ@êwà@êwà@êx@êx@êx @êx @êx@@êx@@êx`@êx`@êx€@êx€@êx @êx @êxÀ@êxÀ@êxà@êxà@êy@êy@êy @êy @êy@@êy@@êy`@êy`@êy€@êy€@êy @êy @êyÀ@êyÀ@êyà@êyà@êz@êz@êz @êz @êz@@êz@@êz`@êz`@êz€@êz€@êz @êz @êzÀ@êzÀ@êzà@êzà@ê{@ê{@ê{ @ê{ @ê{@@ê{@@ê{`@ê{`@ê{€@ê{€@ê{ @ê{ @ê{À@ê{À@ê{à@ê{à@ê|@ê|@ê| @ê| @ê|@@ê|@@ê|`@ê|`@ê|€@ê|€@ê| @ê| @ê|À@ê|À@ê|à@ê|à@ê}@ê}@ê} @ê} @ê}@@ê}@@ê}`@ê}`@ê}€@ê}€@ê} @ê} @ê}À@ê}À@ê}à@ê}à@ê~@ê~@ê~ @ê~ @ê~@@ê~@@ê~`@ê~`@ê~€@ê~€@ê~ @ê~ @ê~À@ê~À@ê~à@ê~à@ê@ê@ê @ê @ê@@ê@@ê`@ê`@ê€@ê€@ê @ê @êÀ@êÀ@êà@êà@ê€@ê€@ê€ @ê€ @ê€@@ê€@@ê€`@ê€`@ꀀ@ꀀ@ꀠ@ꀠ@ê€À@ê€À@ê€à@ê€à@ê@ê@ê @ê @ê@@ê@@ê`@ê`@ê€@ê€@ê @ê @êÀ@êÀ@êà@êà@ê‚@ê‚@ê‚ @ê‚ @ê‚@@ê‚@@ê‚`@ê‚`@ê‚€@ê‚€@ê‚ @ê‚ @ê‚À@ê‚À@ê‚à@ê‚à@êƒ@êƒ@êƒ @êƒ @êƒ@@êƒ@@êƒ`@êƒ`@ꃀ@ꃀ@ꃠ@ꃠ@êƒÀ@êƒÀ@êƒà@êƒà@ê„@ê„@ê„ @ê„ @ê„@@ê„@@ê„`@ê„`@ê„€@ê„€@ê„ @ê„ @ê„À@ê„À@ê„à@ê„à@ê…@ê…@ê… @ê… @ê…@@ê…@@ê…`@ê…`@ê…€@ê…€@ê… @ê… @ê…À@ê…À@ê…à@ê…à@ê†@ê†@ê† @ê† @ê†@@ê†@@ê†`@ê†`@ꆀ@ꆀ@ꆠ@ꆠ@ê†À@ê†À@ê†à@ê†à@ê‡@ê‡@ê‡ @ê‡ @ê‡@@ê‡@@ê‡`@ê‡`@ꇀ@ꇀ@ꇠ@ꇠ@ê‡À@ê‡À@ê‡à@ê‡à@êˆ@êˆ@êˆ @êˆ @êˆ@@êˆ@@êˆ`@êˆ`@ꈀ@ꈀ@ꈠ@ꈠ@êˆÀ@êˆÀ@êˆà@êˆà@ê‰@ê‰@ê‰ @ê‰ @ê‰@@ê‰@@ê‰`@ê‰`@ꉀ@ꉀ@ꉠ@ꉠ@ê‰À@ê‰À@ê‰à@ê‰à@êŠ@êŠ@êŠ @êŠ @êŠ@@êŠ@@êŠ`@êŠ`@ꊀ@ꊀ@ꊠ@ꊠ@êŠÀ@êŠÀ@êŠà@êŠà@ê‹@éª@éª0@éªP@éªp@éª@骰@éªÐ@éªð@é«@é«0@é«P@é«p@é«@é«°@é«Ð@é«ð@é¬@é¬0@é¬P@é¬p@é¬@鬰@é¬Ð@é¬ð@é­@é­0@é­P@é­p@é­@é­°@é­Ð@é­ð@é®@é®0@é®P@é®p@é®@é®°@é®Ð@é®ð@é¯@é¯0@é¯P@é¯p@é¯@鯰@é¯Ð@é¯ð@é°@é°0@é°P@é°p@é°@é°°@é°Ð@é°ð@é±@é±0@é±P@é±p@é±@é±°@é±Ð@é±ð@é²@é²0@é²P@é²p@é²@é²°@é²Ð@é²ð@é³@é³0@é³P@é³p@é³@é³°@é³Ð@é³ð@é´@é´0@é´P@é´p@é´@é´°@é´Ð@é´ð@éµ@éµ0@éµP@éµp@éµ@éµ°@éµÐ@éµð@é¶@é¶0@é¶P@é¶p@é¶@é¶°@é¶Ð@é¶ð@é·@é·0@é·P@é·p@é·@é·°@é·Ð@é·ð@é¸@é¸0@é¸P@é¸p@é¸@鸰@é¸Ð@é¸ð@é¹@é¹0@é¹P@é¹p@é¹@é¹°@é¹Ð@é¹ð@éº@éº0@éºP@éºp@éº@麰@éºÐ@éºð@é»@é»0@é»P@é»p@é»@é»°@é»Ð@é»ð@é¼@é¼0@é¼P@é¼p@é¼@é¼°@é¼Ð@é¼ð@é½@é½0@é½P@é½p@é½@é½°@é½Ð@é½ð@é¾@é¾0@é¾P@é¾p@é¾@é¾°@é¾Ð@é¾ð@é¿@é¿0@é¿P@é¿p@é¿@é¿°@é¿Ð@é¿ð@éÀ@éÀ0@éÀP@éÀp@éÀ@éÀ°@éÀÐ@éÀð@éÁ@éÁ0@éÁP@éÁp@éÁ@éÁ°@éÁÐ@éÁð@éÂ@éÂ0@éÂP@éÂp@éÂ@é°@éÂÐ@éÂð@éÃ@éÃ0@éÃP@éÃp@éÃ@éð@éÃÐ@éÃð@éÄ@éÄ0@éÄP@éÄp@éÄ@éİ@éÄÐ@éÄð@éÅ@éÅ0@éÅP@éÅp@éÅ@éŰ@éÅÐ@éÅð@éÆ@éÆ0@éÆP@éÆp@éÆ@鯰@éÆÐ@éÆð@éÇ@éÇ0@éÇP@éÇp@éÇ@éǰ@éÇÐ@éÇð@éÈ@éÈ0@éÈP@éÈp@éÈ@éȰ@éÈÐ@éÈð@éÉ@éÉ0@éÉP@éÉp@éÉ@éɰ@éÉÐ@éÉð@éÊ@éÊ0@éÊP@éÊp@éÊ@éʰ@éÊÐ@éÊð@éË@éË0@éËP@éËp@éË@é˰@éËÐ@éËð@éÌ@éÌ0@éÌP@éÌp@éÌ@ḛ́@éÌÐ@éÌð@éÍ@éÍ0@éÍP@éÍp@éÍ@éͰ@éÍÐ@éÍð@éÎ@éÎ0@éÎP@éÎp@éÎ@éΰ@éÎÐ@éÎð@éÏ@éÏ0@éÏP@éÏp@éÏ@éϰ@éÏÐ@éÏð@éÐ@éÐ0@éÐP@éÐp@éÐ@éа@éÐÐ@éÐð@éÑ@éÑ0@éÑP@éÑp@éÑ@éѰ@éÑÐ@éÑð@éÒ@éÒ0@éÒP@éÒp@éÒ@éÒ°@éÒÐ@éÒð@éÓ@éÓ0@éÓP@éÓp@éÓ@éÓ°@éÓÐ@éÓð@éÔ@éÔ0@éÔP@éÔp@éÔ@éÔ°@éÔÐ@éÔð@éÕ@éÕ0@éÕP@éÕp@éÕ@éÕ°@éÕÐ@éÕð@éÖ@éÖ0@éÖP@éÖp@éÖ@éÖ°@éÖÐ@éÖð@é×@é×0@é×P@é×p@é×@é×°@é×Ð@é×ð@éØ@éØ0@éØP@éØp@éØ@騰@éØÐ@éØð@éÙ@éÙ0@éÙP@éÙp@éÙ@éÙ°@éÙÐ@éÙð@éÚ@éÚ0@éÚP@éÚp@éÚ@éÚ°@éÚÐ@éÚð@éÛ@éÛ0@éÛP@éÛp@éÛ@éÛ°@éÛÐ@éÛð@éÜ@éÜ0@éÜP@éÜp@éÜ@éܰ@éÜÐ@éÜð@éÝ@éÝ0@éÝP@éÝp@éÝ@éݰ@éÝÐ@éÝð@éÞ@éÞ0@éÞP@éÞp@éÞ@éÞ°@éÞÐ@éÞð@éß@éß0@éßP@éßp@éß@éß°@éßÐ@éßð@éà@éà0@éàP@éàp@éà@éà°@éàÐ@éàð@éá@éá0@éáP@éáp@éá@éá°@éáÐ@éáð@éâ@éâ0@éâP@éâp@éâ@éâ°@éâÐ@éâð@éã@éã0@éãP@éãp@éã@éã°@éãÐ@éãð@éä@éä0@éäP@éäp@éä@éä°@éäÐ@éäð@éå@éå0@éåP@éåp@éå@éå°@éåÐ@éåð@éæ@éæ0@éæP@éæp@éæ@éæ°@éæÐ@éæð@éç@éç0@éçP@éçp@éç@éç°@éçÐ@éçð@éè@éè0@éèP@éèp@éè@éè°@éèÐ@éèð@éé@éé0@ééP@éép@éé@éé°@ééÐ@ééð@éê@éê0@éêP@éêp@éê@éê°@éêÐ@éêð@éë@éë0@éëP@éëp@éë@éë°@éëÐ@éëð@éì@éì0@éìP@éìp@éì@éì°@éìÐ@éìð@éí@éí0@éíP@éíp@éí@éí°@éíÐ@éíð@éî@éî0@éîP@éîp@éî@éî°@éîÐ@éîð@éï@éï0@éïP@éïp@éï@éï°@éïÐ@éïð@éð@éð0@éðP@éðp@éð@éð°@éðÐ@éðð@éñ@éñ0@éñP@éñp@éñ@éñ°@éñÐ@éñð@éò@éò0@éòP@éòp@éò@éò°@éòÐ@éòð@éó@éó0@éóP@éóp@éó@éó°@éóÐ@éóð@éô@éô0@éôP@éôp@éô@éô°@éôÐ@éôð@éõ@éõ0@éõP@éõp@éõ@éõ°@éõÐ@éõð@éö@éö0@éöP@éöp@éö@éö°@éöÐ@éöð@é÷@é÷0@é÷P@é÷p@é÷@é÷°@é÷Ð@é÷ð@éø@éø0@éøP@éøp@éø@éø°@éøÐ@éøð@éù@éù0@éùP@éùp@éù@éù°@éùÐ@éùð@éú@éú0@éúP@éúp@éú@éú°@éúÐ@éúð@éû@éû0@éûP@éûp@éû@éû°@éûÐ@éûð@éü@éü0@éüP@éüp@éü@éü°@éüÐ@éüð@éý@éý0@éýP@éýp@éý@éý°@éýÐ@éýð@éþ@éþ0@éþP@éþp@éþ@éþ°@éþÐ@éþð@éÿ@éÿ0@éÿP@éÿp@éÿ@éÿ°@éÿÐ@éÿð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê @ê 0@ê P@ê p@ê @ê °@ê Ð@ê ð@ê @ê 0@ê P@ê p@ê @ê °@ê Ð@ê ð@ê @ê 0@ê P@ê p@ê @ê °@ê Ð@ê ð@ê @ê 0@ê P@ê p@ê @ê °@ê Ð@ê ð@ê @ê 0@ê P@ê p@ê @ê °@ê Ð@ê ð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê @ê 0@ê P@ê p@ê @ê °@ê Ð@ê ð@ê!@ê!0@ê!P@ê!p@ê!@ê!°@ê!Ð@ê!ð@ê"@ê"0@ê"P@ê"p@ê"@ê"°@ê"Ð@ê"ð@ê#@ê#0@ê#P@ê#p@ê#@ê#°@ê#Ð@ê#ð@ê$@ê$0@ê$P@ê$p@ê$@ê$°@ê$Ð@ê$ð@ê%@ê%0@ê%P@ê%p@ê%@ê%°@ê%Ð@ê%ð@ê&@ê&0@ê&P@ê&p@ê&@ê&°@ê&Ð@ê&ð@ê'@ê'0@ê'P@ê'p@ê'@ê'°@ê'Ð@ê'ð@ê(@ê(0@ê(P@ê(p@ê(@ê(°@ê(Ð@ê(ð@ê)@ê)0@ê)P@ê)p@ê)@ê)°@ê)Ð@ê)ð@ê*@ê*0@ê*P@ê*p@ê*@ê*°@ê*Ð@ê*ð@ê+@ê+0@ê+P@ê+p@ê+@ê+°@ê+Ð@ê+ð@ê,@ê,0@ê,P@ê,p@ê,@ê,°@ê,Ð@ê,ð@ê-@ê-0@ê-P@ê-p@ê-@ê-°@ê-Ð@ê-ð@ê.@ê.0@ê.P@ê.p@ê.@ê.°@ê.Ð@ê.ð@ê/@ê/0@ê/P@ê/p@ê/@ê/°@ê/Ð@ê/ð@ê0@ê00@ê0P@ê0p@ê0@ê0°@ê0Ð@ê0ð@ê1@ê10@ê1P@ê1p@ê1@ê1°@ê1Ð@ê1ð@ê2@ê20@ê2P@ê2p@ê2@ê2°@ê2Ð@ê2ð@ê3@ê30@ê3P@ê3p@ê3@ê3°@ê3Ð@ê3ð@ê4@ê40@ê4P@ê4p@ê4@ê4°@ê4Ð@ê4ð@ê5@ê50@ê5P@ê5p@ê5@ê5°@ê5Ð@ê5ð@ê6@ê60@ê6P@ê6p@ê6@ê6°@ê6Ð@ê6ð@ê7@ê70@ê7P@ê7p@ê7@ê7°@ê7Ð@ê7ð@ê8@ê80@ê8P@ê8p@ê8@ê8°@ê8Ð@ê8ð@ê9@ê90@ê9P@ê9p@ê9@ê9°@ê9Ð@ê9ð@ê:@ê:0@ê:P@ê:p@ê:@ê:°@ê:Ð@ê:ð@ê;@ê;0@ê;P@ê;p@ê;@ê;°@ê;Ð@ê;ð@ê<@ê<0@ê@ê>0@ê>P@ê>p@ê>@ê>°@ê>Ð@ê>ð@ê?@ê?0@ê?P@ê?p@ê?@ê?°@ê?Ð@ê?ð@ê@@ê@0@ê@P@ê@p@ê@@ê@°@ê@Ð@ê@ð@êA@êA0@êAP@êAp@êA@êA°@êAÐ@êAð@êB@êB0@êBP@êBp@êB@êB°@êBÐ@êBð@êC@êC0@êCP@êCp@êC@êC°@êCÐ@êCð@êD@êD0@êDP@êDp@êD@êD°@êDÐ@êDð@êE@êE0@êEP@êEp@êE@êE°@êEÐ@êEð@êF@êF0@êFP@êFp@êF@êF°@êFÐ@êFð@êG@êG0@êGP@êGp@êG@êG°@êGÐ@êGð@êH@êH0@êHP@êHp@êH@êH°@êHÐ@êHð@êI@êI0@êIP@êIp@êI@êI°@êIÐ@êIð@êJ@êJ0@êJP@êJp@êJ@êJ°@êJÐ@êJð@êK@êK0@êKP@êKp@êK@êK°@êKÐ@êKð@êL@êL0@êLP@êLp@êL@êL°@êLÐ@êLð@êM@êM0@êMP@êMp@êM@êM°@êMÐ@êMð@êN@êN0@êNP@êNp@êN@êN°@êNÐ@êNð@êO@êO0@êOP@êOp@êO@êO°@êOÐ@êOð@êP@êP0@êPP@êPp@êP@êP°@êPÐ@êPð@êQ@êQ0@êQP@êQp@êQ@êQ°@êQÐ@êQð@êR@êR0@êRP@êRp@êR@êR°@êRÐ@êRð@êS@êS0@êSP@êSp@êS@êS°@êSÐ@êSð@êT@êT0@êTP@êTp@êT@êT°@êTÐ@êTð@êU@êU0@êUP@êUp@êU@êU°@êUÐ@êUð@êV@êV0@êVP@êVp@êV@êV°@êVÐ@êVð@êW@êW0@êWP@êWp@êW@êW°@êWÐ@êWð@êX@êX0@êXP@êXp@êX@êX°@êXÐ@êXð@êY@êY0@êYP@êYp@êY@êY°@êYÐ@êYð@êZ@êZ0@êZP@êZp@êZ@êZ°@êZÐ@êZð@ê[@ê[0@ê[P@ê[p@ê[@ê[°@ê[Ð@ê[ð@ê\@ê\0@ê\P@ê\p@ê\@ê\°@ê\Ð@ê\ð@ê]@ê]0@ê]P@ê]p@ê]@ê]°@ê]Ð@ê]ð@ê^@ê^0@ê^P@ê^p@ê^@ê^°@ê^Ð@ê^ð@ê_@ê_0@ê_P@ê_p@ê_@ê_°@ê_Ð@ê_ð@ê`@ê`0@ê`P@ê`p@ê`@ê`°@ê`Ð@ê`ð@êa@êa0@êaP@êap@êa@êa°@êaÐ@êað@êb@êb0@êbP@êbp@êb@êb°@êbÐ@êbð@êc@êc0@êcP@êcp@êc@êc°@êcÐ@êcð@êd@êd0@êdP@êdp@êd@êd°@êdÐ@êdð@êe@êe0@êeP@êep@êe@êe°@êeÐ@êeð@êf@êf0@êfP@êfp@êf@êf°@êfÐ@êfð@êg@êg0@êgP@êgp@êg@êg°@êgÐ@êgð@êh@êh0@êhP@êhp@êh@êh°@êhÐ@êhð@êi@êi0@êiP@êip@êi@êi°@êiÐ@êið@êj@êj0@êjP@êjp@êj@êj°@êjÐ@êjð@êk@êk0@êkP@êkp@êk@êk°@êkÐ@êkð@êl@êl0@êlP@êlp@êl@êl°@êlÐ@êlð@êm@êm0@êmP@êmp@êm@êm°@êmÐ@êmð@ên@ên0@ênP@ênp@ên@ên°@ênÐ@ênð@êo@êo0@êoP@êop@êo@êo°@êoÐ@êoð@êp@êp0@êpP@êpp@êp@êp°@êpÐ@êpð@êq@êq0@êqP@êqp@êq@êq°@êqÐ@êqð@êr@êr0@êrP@êrp@êr@êr°@êrÐ@êrð@ês@ês0@êsP@êsp@ês@ês°@êsÐ@êsð@êt@êt0@êtP@êtp@êt@êt°@êtÐ@êtð@êu@êu0@êuP@êup@êu@êu°@êuÐ@êuð@êv@êv0@êvP@êvp@êv@êv°@êvÐ@êvð@êw@êw0@êwP@êwp@êw@êw°@êwÐ@êwð@êx@êx0@êxP@êxp@êx@êx°@êxÐ@êxð@êy@êy0@êyP@êyp@êy@êy°@êyÐ@êyð@êz@êz0@êzP@êzp@êz@êz°@êzÐ@êzð@ê{@ê{0@ê{P@ê{p@ê{@ê{°@ê{Ð@ê{ð@ê|@ê|0@ê|P@ê|p@ê|@ê|°@ê|Ð@ê|ð@ê}@ê}0@ê}P@ê}p@ê}@ê}°@ê}Ð@ê}ð@ê~@ê~0@ê~P@ê~p@ê~@ê~°@ê~Ð@ê~ð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê€@ê€0@ê€P@ê€p@ê€@ꀰ@ê€Ð@ê€ð@ê@ê0@êP@êp@ê@ê°@êÐ@êð@ê‚@ê‚0@ê‚P@ê‚p@ê‚@ê‚°@ê‚Ð@ê‚ð@êƒ@êƒ0@êƒP@êƒp@êƒ@ꃰ@êƒÐ@êƒð@ê„@ê„0@ê„P@ê„p@ê„@ê„°@ê„Ð@ê„ð@ê…@ê…0@ê…P@ê…p@ê…@ê…°@ê…Ð@ê…ð@ê†@ê†0@ê†P@ê†p@ê†@ꆰ@ê†Ð@ê†ð@ê‡@ê‡0@ê‡P@ê‡p@ê‡@ꇰ@ê‡Ð@ê‡ð@êˆ@êˆ0@êˆP@êˆp@êˆ@ꈰ@êˆÐ@êˆð@ê‰@ê‰0@ê‰P@ê‰p@ê‰@ꉰ@ê‰Ð@ê‰ð@êŠ@êŠ0@êŠP@êŠp@êŠ@ꊰ@êŠÐ@êŠðÀV€ÀVXÀVXÀVÀVÀU¸ÀU¸ÀUhÀV€ÀV0ÀUàÀU¿î?î?î@€@€@À@À@@@@@ à?þ@@€@?øC{T„C{®”CzòîC|JäCz C|ªúC| LC|-œC{Š”C{ÝÌC|ÃC}môC}ÞúC}ï:C}ŸäC~G²C|´ˆC~>\C|ú”C~ ˆC|ŠC|n–C{ "CzÏzC{oC{nC{‡6C}ÈC} ¾C|ž,C|ÊC|ÜÌC} NC}öC}¼|C|ZNC}–FC{C{_ C|1šC|C{µHC|SòC{¢ÌC{mzC{“ÀC|¼$C}–VC|W†C}?C|x:C|tC}ªC}lC|ÈC},6C|ÅC~eäC}§bC~C}sðC{„C~³\C ÒC~”(C~L&C€ëC€š‚C€†4C€p0C€ LC} äC}«,C}~$C{î>C|¦®C}{œC}|8C}`C|¿FC}6ŒCŽæC€jCjC-îC~åÌC€»œC€XC€lbC€s C‚óþC‚=C‚ëdC‚÷DC‚VÔC~‹C~=žCŸ‚CÄ®C~ËC<àC  C€æ$CAŠCž¤C‚ C‚ÞC‚ÊöC‚þC‚¬èC‚G4C‚k6C‚èC‚©4CÈÖC€1hC:(C€aÀC†C.jC‚Y^CýLC‚T¨C‚ vC‚€C‚‰8C‚ݨC‚”äC‚δC‚èÌCƒœøCƒ\ŠCƒ_.Cƒc¸CƒC‚N¦C‚TC‚¼*C‚Ú€C‚®,C‚»RCƒ4dCƒ)úC‚}ÚC‚ÔðC‚¦dCƒM²Cƒo†C‚©ŠCƒfCƒtrCƒWêC‚³ÌCƒ?îCƒaÌC‚2C‚¤C‚¥ C‚ë"C‚dØC‚ÐäC‚ý:C‚9$C‚nC‚¬ÜCƒäCƒ:îC‚¾@Cƒ.$C‚OnCƒcèC‚µ2Cƒ$^C‚±bC‚ÎFC‚8~C‚)®C‚¹&CêäCÜC‚ânC‚Y®CñHC‚~C‚jXC‚f C‚}ÞC‚aC‚&vC‚a¦C‚RúC‚œ’C‚P8Cê"C‚4C‚C‚OìC«BC†(C‚(ÆC‚nnC‚ŽZCçÄC‚†$C‚ˆðC‚´C‚œ\C‚ñNC‚CxC‚—ÖC‚ß C‚„C‚4œC‚ÊRC‚ÆCF\CǸCPòC7¾CÈ8C‚–C¸CÏDC‚JÆC‚xC‚@lC‚C‚@BC‚\šC¾C‚öC‚ZRC‚ohC‚‚ºC‚“PCg¸CHˆC¤¶C‚?ÄCzÐCédC‚!~C‚‚C—¸C‚¤C‚rÄC‚+hC‚Å$C‚2C‚Z C‚ÍÊC‚»(C‚—ZC‚VC‚¼ÌC‚ÒCƒFC²¨C^ôC‚øC‚`rCÔÒCÖC°ZCƆC‚K|C‚¹|C‚)JC‚˜¨C;C‚?C‚¡NC‚—DC‚ŸC‚C_¦C{¼CmDC‚„C‚)øCܬC‚sÆC̺C‚›XC‚6C‚kCÃöC‚$VCÑC‚C˜âCÊC‚8¢C‚]8C‚\^C»xCÉZCÌ|C‚ÜCƨC‚C&C­¾C‚öCÞC‚(lCˆœC‚8nC‹®C‚iÀCæRC.|CÀüC€CÉPCº\C‚ÖCÉ$Cô˜CДC|C‚kŠCåúC¢îC‚äCûþC‚z¬C‚ÐÒC‚€C‚é~C‚ þCm‚C:C€Î&C!C€¯rC€²2Cf\CvêC„¶CC]¤C‚,®C·|C‚\BC‚!xC‚¶C zC‚Z¤C‚ЦC–ÆC€ÑÎC€*0C€ª:CüùC€| CÀîCxÚC¦’C.ˆCsØC`öC€ÿöCI~C€õ–C¹zCÆ‚CõCñBC‚‚C‚!6C€ú^C€ºFCw|C€¾¤Ci C³CÎèC@æC„Có C”C‚`C‚pCN^CøˆCÙ(CËúCâC+ŒC9–C,®CCòC€Å®CY¦C€pJC€¾”C~C€¯êCKÚC)ÖC¦ÚCOÊC³CCõ$C©¨C ÚC‚ C¸žC‰VC€@ØC€!¬C€¿šC€¾.C€‚ŽC€P®C€wŽC€ÞðC€^ C€žèC)¨C\¶C;ÎCPFC€ðC‚i^CéxC‚k¤CæêC‚-8C€i¨C€\C€5C€%bC€€¾C€éêC€ÙœC6šC€ävC€?"C˜lC(´C5²C LC€ôC‚L*CåHC‚ ,CÑÈCÓ€C€@¢C€ŽÂCS¦C…ŠC€uÒC€´$C€»hC€­bC€R¦C€;èC–¢C#äC‚þCVCI´C‚lÂCºöCçªC‚:CÛ.Cû‡C€€ŠC€øC¾+C€€6C€gÚC€LXC€:C€‚C€âÀC2èC€õÆC€Æ¤CHC€¦ØC‚,’C‚lC‚WC‚"C€(ÆC€¦C8C€ëäC€fhC€”C€ÿrC€ŽC€aîC­0C€ æC€«hC~ø¼C€?øC€¬Cb0C~îZC€€C€3ÂC€§C€FŠC€ÐC}ÚC‰”C~ÖC~é>C6ìC~8,C}—ÌC~^C|·$C}ñºCwnC~Ó,C}Ç®C~OžC~ CBÆC~åCÙäC~>ÌCÂC|0C}V8C|îHC|vC|ùnC|æ²C}êªC}~nC|ûC~#àCfâC}Ø^C}÷lC}».C}¢NCrŠCêC}üC~NÒC~G€C~aC}¢ÊC}›rC}C~"*C}âÒC~JC~C~ƒŽC^„C}"C}-ÂC}¨C~‚C~H`C}¼þC}¯²CNC}ª²C~–C~:PC}F–C}U¬C}˜C}ÌzC~¦zC‘ªCP.Cã8C€ÛC~z8C~42C>VC>DCXfC~Z¼C~x´C~XrC~DÞC~ ðCzÔºC{'ÆC{¨æC|^ŽC{(C|©ØC}~C~®¢C}IrC~8VC|xC}DÌC|áPC{æŽC|vHC}ûúC}®2C}@ÂC}>C~xØC}zVC~–BC~a C}ôC};vC}ÓC}]ÂC~¿2C~Ô:C}¨žC~ÒÔC€f¶CáC2C€c2C€gBC€FNC€ÐdC€Š–C€)ðC|î`C}ïC~j¬C~)*C}ÆÚC C~ªC}ÇüC~-C}±äC$C€lÐCÙ„CHºC?xC\C~C€ž²C€†®C†C€øhC€5 C€˜úC€Ž2C€üCx(C€¯C)¼CªC#ŠC€ãŽC€ì>C€šºCPC‡|CI,C€µnC€óÜC .C%0C€vC€zŠC€CzC€-JC€Æ:CžC)¾CPšC€¯öC€ÝÚC‚ 4C~CC¸CXfC'BC‚zCøCFfC7LC¯´C€­ C€NC€KtC€FC€“ºC€PC€ÜCéÌC€TC€2®Cm,CoÒC€åˆC€v¦C€ŽC–C¹ C€ÔÊC€é¢C€²ìC}äâC}ˆŠCVC}BÌC}‘ÒCùìC€`C€1–C€)*C“`CÂC€ìpC€+pC€ìDC€¡JC$C€ƒ.C€ÿvC€‘VC€•êC~8šCƒ˜C~ŽC}ĸCSâC~ÈTCYdCc0C^C~ô°C~fªC~CÌC~òC~À$C}©NCC}oFCC~ª|C|JvC|œxCz̶C|q¾C|_´C{‚ C|QæC{—¦C{QðC|JC{¾C|iJCz×êC|N˜C{MÎC|!pC|–ÐC| C{è|C{b¼CzlÄCzžCz£’C{ C{2C| ÒC}EC}[ C}1RC}—C{äÎC{{C{îC|ÈCzÙ–CzØ0C{"RCzJC{ìCzõzCyýCzªCyW2CyêÖCz¶.C{AŠC|fC{R:CzæžC|X$CzãpCyÐCyÆæCxý&Cy²vC{A¢C{øC{yBC{v&CzöRCv’lCv!ÞCvrCv‡nCv¿bCw.Cv@øCvXîCvÖCwç¦CyCyf>CxæÌCxâüCx×CzNºCz°~CzjÜCzv4CyNìCtCuyCtÊšCt4Ct6Cw%Cuð"CwuÒCvi–Cv|Cy1`CxÂÈCxèjCxCxv.CwF¶Cx=¸CwŠ:CxÌCxm„CtˆîCtGÌCuÛŠCtl˜Ct·jCtäêCuµZCuZ”Ct~RCuóøCvä.Cw"CvGCwv¤Cv4øCwØŠCx‚ˆCxׯCxpÂCxoÎCsï8CsÙ CsæCt÷²Cså(CvMæCuß"Cu¦ØCvj Cv¾ÞCvM°Cx¸CwØœCvu˜CwɶCw&CvçŒCvØJCv]dCw<ÄCz‰ÖC| ªC{`bCz~0C|4C|±øC{q C{¢ÂC{ÂC|PC{„(C|žC{g¾C{¼âC|9°C{`C{É®C{©2C{_ C{>ÄC{z\C{8ôCzÌÒCzéìC{ŒbCç C ÚCž¼Cg”C€<*C€ŽèC€‹C€WNCÀC€d C€SnC€-C€¾C7âCì.C~xŠC|×*C|ÇC~{ÆC}„œC€3úC€CCºC”C€ÌCÚCuC(>C~¹8CÖúC~ΤC~ʈC~£C}â"C}&C}ŠC|ÏŠC}^ÞC|ÙC}òrC}¨2C|>¤C{¿ŽC}†ÈC}eœC|ˤC{*6C{£Cy}|Cy¢Cw² CwCwMØCw 8Cv¤ŽCw‰ðCw¦2Cv=ÒCuݲCw^ðCxzCyDúCy CxCìCw8¼CrX‚Cs>ÌCsRCr;ÜCrgÖCt5\CsãìCrzCrw4CrbÂCw~ºCvŠPCv²¨Cv#ŠCv¦ CwÔ CvL¨Cw<¢CvèCv|îCq’\Cr^ÒCq8Cq·jCrÆCvM‚Cw*ÀCv¯Cw“ˆCw8CwéžCyBCw ÊCx+zCw޼C{`²C{|¶CzDzC{ôCzÝšCzæCz‹ŠCz„öC{·ªCz9:CÔªCýUC`ÊC̰C€>*C€ŸJC€x¸C70C€²C€¨C& C ¨CQC§ÖC-,CuŽvCv$¸Cv„¬Cv×CtìîCyÐCy´CzT€Cz VCzâšC}BxC} C}¬C}|ðC}Ÿ¶C~Á¸C¥jC~øŠC¤C~¬BCsÚìCtÞCt/LCuLCtäÊCvCâCwÆžCw‚ôCw CxæCyKÆCyjþCy6ÌCy¦CzS~CzÆäCz%`Cz•`CzFCz{†Ct'6Cs²*Ct_¤CsÒ¼Ct' Cw¤¤CwJ¦Cvë&CuànCvRXCwRCvM Cx#6Cv™¤CvpÒCxiâCxX$Cx,,Cwí¶Cx|Cs;ÜCs'dCr*¦Cs4ŠCrúCv¸ŠCv¢pCuèHCtÒpCt•CtÆvCtŠRCr¥ÈCr‰¸Ct;CvJ0Cu-VCvµ|CuRnCuË6CnYjCmõÊCnïCmãêCmø:CpC^––Cn±JCmèLCn5fCméÊCmò:CsþèCsÿ´Cs¾àCss”CrŽfCvyÎCvª>CwÌðCv $Cw‘ˆCcÓôCeFCe\HCcÖnCc¨ŽCp¼Cp¯ºCpÛºCp ºCo­ŽCuqŒCuÅæCu†°CvCvZnCxèÜCw’˜CvÞ CxPlCvÅŽCf8²Cf+ÖCgrøCgDªCg"jCpÓxCq=LCq³ÌCqööCpnC`¦ÈCd†Cei.Cd¸dCd bCd¨ChÔÔCi¨4CiC¾Cj²Ck.æC[ŽCZû¶C[éÈC\.èC\òC_¸îC`Ó^CaCÔC`Y¦C`ȆChwPChW&Ch°.CieøCi~CmkCmYþCl·¾Cl©^CkÒÊC^bôC^,rC_,òC^ÎbC^‹ChHÀCgÜCgÊôCg-®CfµòCjÑvCjÌÌCk”CkrCjÆÎCkáòCkê6CjîªCjtÖCi¼ÐC_÷vC_f‚C`–ÚC`Ë"C_£¤Ceª¼CeaCe9CeàCe…>CfCe"¾CcýPCdÿ˜CdPòCg¡øCgŸNCfñCg'FCfæ Ci-„Ci`XChä6Cia¨Ch ºCn\Cm³àCmh¨CmClÿÄCo ÒCoňCoÓøCnŽCnÓòCqRÞCq6,CoŒCo,dCo°RCpèCqŽVCqªhCqobCq;„CnêrCnÚ CnÿXCn”CoÇ~CmÊ Cn RCn‹,Cn„„Cm^nCp#üCo“|Co8Cm‡ÂCm%ìCoù8Co¼xCo¤ZCpãCq-vCl–ºCmÍòCmÆ€CnŽCmȼCjtöCl úCkH ClNÎCjÿ¼Ch¯®CfÕLCg>ChäÆCh”ÞChµœCg°*Ch›Ch—ChN4CfÃCgw´Ch‚ˆCi?žCiÖJCiÄæChzVCiqBChCiæCd†¤Cc{@CdEœCd_>CdT”C]0ŒC]¸dC\‹8C\ÀúC]Ú–C_UÔC_¼*C_C^*C_‹`Cb9†CbD”C`†Cao¨C`€ðCbÀöCb’C`üVC`¹TC`רC^°C^á8C^.C]Ñ C]ʸC_ËèCa1\C`òîC` ”C`ÍBCbï˜Cc¾Cc´CdTCc+jCfÀCe™ÔCeg„Ceß$Cf{\C^ fC]ð$C^bC^&ZC]°8Ce@RCc©DCedTCex¶CdlCh°êCgݬChÞÞChCh®Cj¬2Ciñ²Ci£ÂChŸJCga|CZµhC[8C[ñâCZáCZÑþCb hCc/zCaøŽCa· CaïCd¡pCdd¬CeónCe^CebpCdÝìCcobCc*CbîÂCc$¼CTú¶CT«@CUxÎCU)nCTA.CYèÈCY5‚CYéfCY† CY:nC\0.C\hC[Þ8C[æCZÀ¼CaLCb‚˜CaÜBC`°:C_»ÞCY &CXªCX„>CW‡CXlìCW øCVzØCW0ChvÈCg4\ChZŒCg‘RCgW†CaïXCaNCb®CbúÊCb‚ÄC_±4C_ôzC_¼^C^ËC^4 CdíCe¨\Cd%ØCdœCdnÎCg%ºCfi€CfwöCf(CfaCdˆœCe#œCdòdCdÄXCe>CbPÈCft„CgÅ|CgÝøCh–CgxîCj!‚Ck‹nCk1ŒCk¸Cke”C_8C_-ÄC_gæC_OîC`JCbå|Cb¬VCb.ÎC`ó¢C`ëxCfCc?°CdšÊCc’àCd CdˆòCf¦ÔCeÎXCec@CgV¦CgEVCeŒCcªòCdüCdºîCd%ÈCd‚ôCd[ØCdý@Ce CeY°CaîÈC`> Ca€C^ã‚C_¯ÜCeüêCeþZCgÐCeÙÐCf{ÒCeø´CePCdùzCcþÆCeø˜CTv CU\ôCTžàCUøtCTÓ¸C] ®C]ëÔC]QšC\ÊHC]}ÐCgŠîCf°ÞCgß2CgÝ¢Cf]”ChR¦CiGÔChT&ChœÔChÉCP¢âCR)pCQXCQ^$CPuªCZuCYДCWì®CX¥èCV,Cn^ŠCnÈClÕClUÀCkÒCp‘®CnjCo CPXCQ)CQ§šCa ŽCa^nCa¡ŽCc< CbË@Cf&CeæäCfÀXCf~XCf1¨CWóØCXû\CXäzCXÓ>CW0ÒCW•CVÔÈCW9ZCU°6CU/¢CXÏþCXž–CWàÈCXÙìCWà~CZñ|C\ưC[ÖìC\‹ÆC\îCeøCds\CeižCcí¤Cd ¸Cf´VCg"ÚCfAÚCfVCe0‚Cd~ˆCc9HCc…’Cb‘’Cb§C`YÂC^¨®C^%C^œC^6PCdCenôCd>øCcÞ`Ce2*CeK\Cd`~Ce!DCe£Cd”*CbÐ2Cc2Ccu´Cb[ÀCc%,CbÔDCb°Ca<¾CauVC`ËêC\ëúC]ÆäC]±¾C^nC]„C^8vC\vvC\@àC]ªÚC]rÚCb~lCaÅþCa'C`ÛNCb6Ca &CaØ6CaC`hæC`wÖCUÇ8CUÍ0CUßêCU ÈCT˜rCZCYÉCZªCZ\CZ†lC_jC`bC`DC_C_z*C_™^C]¼*C^±žC]üêC]ÕðCXP¶CY/bCY½’CY·üCYŠÆC^ÓC^¸C^pC]B\C]ˆÌC]ÊÈC\b4C]ôC\‡‚C]®ØC[Ê’CZi C[¯˜C\LÆC[ݾC_¥¬C_«¬C^ó’C_šC_ÜCe6CduCe=äCdÃCeChCg­lCfüìCe®PCeº’CeÀCgR*Ce®CdexCd»„Cd4öC^þJC]Ó„C]ÁâC]¨üC^2C^>ŠC_S®C]ô:C^"ÜC\…lC[s¨C\8C\¥nC\rÄC[V>Ca%(Ca™’C`V`C`q€C_í:CgVCg[æCfººCfZ®CfÂChÄChVCrú¾CrOZCrMjCq‰HCi´ŽCh«–Ch¿4CikøCja@CqpCpÒvCp LCoøCpÎÐCqrŽCq¾fCpÜÆCq2ôCo›êCr*$Cr\Cpö$Cpí CpgjCaXºC`ºzC`»TC`uxCaš¤Cl/ÔCjØ\ClôClÀCk[BCp²0CpŒ~Cp^ÞCq&@CpΔCsFÔCsçBCs— CsÆZCt#ØC]HþC]m0C\ÕjC]"PC\™´Cf…VCg€VCgÔCh›úCg<$Ci—øChÒ¦Ci¯(CipüChÈ„CkGhCjÝ~Cjø¼CjÔ`CiÅäCY˜CXBöCYÂÊCYÄCYаCZ$0C[VrC[|CZÕàCZÛVC`8C`yÄC_ÜŠC``¶C^CaÃxCax€Cb> CbLÒCbm0CT¤LCTºhCUzCT´´CSí>CTZ^CSÒšCRÓ”CSĪCT˜¶C]U0C] ÖC^˜nC\ö–C]’²CcUFCbÆ&Cb£˜Cc™¦Cb*”CVÎØCVã”CV‘èCWÚ”CX| C_§ÆC^®C^C__8C^»ÀC]À.C^@˜C^p(C^\C_¨C_J C^Æ.C^ÐTC_˜„C`Y°C`£0C`IþC`*Ca6ÜCatCaçnC`vLCa‘:CX:CW–CX2àCW·ÆCXš8CXÕ6CWÓ¸CXï°CWEÌCW¯ÔC]n0C\ZœC[÷NC]%^C[ÿC\ÔC\™C]ÕFC_?C_;*C]¶ÄC^ØC_?C_y:C^ìC^ÄÜC_C_‰¢C^+ÖC_ŽZC^»C^+¦C^$†C]'ØC\H"C[¬ØC\òC_3´CaöCaavC_ÁÄC`¿ÞC_ÅìC]XPC^™–C\ªHC\2Ca#ðCbVÎCbâCcþCb×€CgjCeÁ¬Ce'²CfÚNCe/"CeK2Cc `CcÆ>CbúÊCcd C_Ÿ0C_CøC\Ú:C]:bC]X®CaT@Ca%6CaØC`TÒC`º†CeŠCcãÖCdݶCd†CcŸîCaÒCaÿ0C`‹¨C`PdC`&ÐC[ÍêCZÏÚC[ ÄCY”CZ/4CUŸÐCU]CTInCTQ’CU?6C\}ˆC\“¾C\)NC];xC\oîC\?~CZC\öC[nC[ãhCYš2CZ"ÞCY‘‚CXªXCZACV¨CW¡BCWÜCWDCWQüC[¦C\“ˆC[¥þC[ÞC[ÔC]þ^C\_C[ÌC\kŒC\5CXˆàCXÎCWXþCWsÈCX’üC]»|C]Y$C]ÙºC^¨´C]^HCeð¸CfFnCeÍ&CddöCcÊ„Cd{¦Cd¬’Cc Cc³¦CdRÔCbøCa®CañFCbCaë„C^c’C^WøC^pC^§C]•üCe+~Cen¢CeM¢Ce0Cc_Cd4Cd#zCb"CaûÔCb½TCaÑ’C`µÚC`côCab‚C_ðC[àCZݸC[»LCZÜèC[WÂC^í8C^rC_hÎC_;lC_6ÎC^BÆC].C]»vC]ºœC\Š C[¨àCZk>C[X:C[àhCZp°CTXòCUè´CT–¬CU~ÊCTo˜CTxCTô¦CSîlCU~CSù$C[VCZY\CZȰCZÉxCYŸPCZlÂCZRRCZ²ÜC[^ÈCZó4CQ)CQ œCQ¦CQ²CP{CS<ôCTµ(CSÔJCS©dCTýŠCX²CYÆ’CX¥"CXcÌCXšCXVFCWâLCX‘¸CWýnCX:COTCMýjCMÜBCNË\CNštCS,ZCS´CUù`CTôŽCUƒøCT?PCN:COe¦CNÅCNÖCNÇâCV5€CVJCW³üCVDCUׯCX!¶CW@CWð@CVRJCV®ÀCWVêCUR¦CUåžCUÇ CTºrCQU*CQz0CRV°CRyÞCQÛ0CZ;>CZµ²CYá¨CZÉàCZYC[¬CZ-VC[ÊpC[v"C[ vC]ìC[y|C\¿VC\ÜC\r„CX"äCVuCWwÊCVâòCWÒžC^·òC_>C`D¶C_zvC^¢lC_õZC^ýC`s6C_ûÞC_j¨C`ŠC_‰ØC^ÈCQâCQß.Cda~Cc ðCcœìCeXCeĨCj¸ŠCl„œCjú²CkÛCl”ÐCo‘ÈCq4”Co‚lCp!ÒCpù^CapZCb9nCa˜CbeÒCa×rCpׂCo—ZCpG"Cq/¶CprCq9dCrK‚Cr2Cq±nCq–ŠCu$ÞCsþœCu`Ct-ÖCtE0CbCHCcÔCc_þCcgxCb£fCo"†CnáüCoCnÆÄCoO\Cnú`Cn0Cno†Cn5pCm8BCq:Cq9`Cp~CpgCpPC]2ÒC](dC[æ^C]§C] žCe/ºCdøCdñ˜CdÀpCeÊðCdúRCc”ŒCdWhCe5ÆCe`Cd!²CcœœCcÿŽCb8CbÑRCYO|CX¥ÜCXžÂCY7fCYþC`‚®C`½lC`êC`îÐC`ñ4CaåÜC`½ÂCa°CaØHC`¯”CaÈCa}¤Ca®CaµCb+ÈCXiRCX.¦CXO.CYZ¼CX—ÊCaõâCb6ÎCa…zCaKÊCaåôCb¾„CcœZCc²âCbʪCaÙ¼CcÖCd²Cc¡RCb+èCbK Cb¼–CbþFCf¾ Cfà®Cg™üCgVCgY@CfAÜCf"Cf}ÜCf%|CeΰCd¯ìCcÑzCcé.Cc&:CbtC_†RC_üXC_[”Ca C`R¬CdaCbòtCd»¾CdZHCd Cc$ CcߨCb§Cb².Cb ŽCabâC`ðC_vJC_ nC_gžCS[*CTUCR¹¤CT*¼CSûLCV‹îCV fCU— CUùjCUEvCZ{xCZDÂCY«€CXìCXŽxCZ7¼CYüˆCZê CZÔCZƒØCTxàCSdCS_‚CT…¾CS¢dC\ C[ÑÜC\lC\tÖC\EBC^fXC^Þ2C^$€C]tC]„C`ÕäCaJrC` ÒC`pòC`CbÆCb3šCb¨úCbn Cb¬ÚCfµðCfb’Cf”DCfÿüCfkCfžàCf\¬CfïŽCf4 CdËÐCg*Cfž$Cfv²Cf7XCe ¢Ce¢žCfÌÈCfæCgDCg-²Ch0¼Ci#°CiŸêCgüÒCi^bCjaˆChušChd Cif>Ch£XCj54Cj3ŒChïŒCh§ØChýÆCd†ìCe|CdšdCe@|Cd?.Cgë2Cg|˜Cgë°Cg˜ÄChCizÈCi/LCgƒPCh=æCfüCjäCjôdCi‹VCiÔ6ChÂ4C]hC]#FC]tC]Ò,C^ÏtC_î¢C^»ÄC^=¦C_XC`í¬Cb%jCb•CaˆúCa Ca9rCf1øCe bCd³(CcúÀCd Cb¼C`gbCa{Ca¨þCa&‚Cd lCcé Cd5àCd_.Cc'¾CahxCaFÞCbAÈC`ÁpCaCc¥CbÏCbnîCbQªCbŒC`4C_ʬCa‰ÜCar@C`nèC\NC\phC] øC\ç(C^SÊCbÜCcê CcŠ>CcXNCdøCcÒÞCaã CcT>CbgJCb):C`ã.CaKªC`@Ca:bCa¥ôC`NÒC`”VC_fŽC`üC_ëðCbbrCaÑpCaC”CafC`ýÔC^oìC_ò^C_,¬C_GŒC`IzCU±ÈCVÖCU×CV *CV8C[c8CZTpCZ\TC[ÂCZ`„C_÷C_^¾C_¢„C_ÎC_KÀCaâ‚Ca ˆCbVCaRtC`,ìCQäÖCQµ˜CP´ CRÚCR†¶CYC*CZ7þCYÓ.CZáCZ}C_DC`¹èC_èˆC_­C_6ÒCbˆ²Cb( CaðÈCaSþC_àªCQ~ÌCRuJCQDCQ‘òCQT\CYô¸CZÊLCY½ÆC[a¢CZ»ÞC`‰öC^ØC_q C_õÚC_»*C`XfC_¤C^IüC_&xC]øCQûœCQ»¸CPu¼CQ:èCQ/¤CUÐCW0CU±ˆCWfCV(~CZ£ôCZCZóÎCZ¸ÎC[šC[•"CZÆC[$ CZí|CYi"CYoÞCYâòCYæ|CXçCXT¢C^IC^„dC]‘ˆC]ù.Ca9CaŠCa'JC_eC`—ÊCaˆC_{,C]›–C\€–C[Ú0C\¿0C\“ C\ˆC\tC\YˆC^D¤C]ȲC\¶ÎC\’DC]˜>C^qC^¨ C^[ C]‰¢C]"*C^ß8C]ú®C]C¶C]ŽC[©äC]xdC]˜„C]fC\ŸdC]>.C_"C_+šC^é$C^ŒÈC^0(C[bôC[3ªC[%lC[-,CZkhCXÒCX;>CW:êCVìæCWT CVm(CUp~CU¤´CWšCUÓCV•CVèCUKfCU¢žCUÔCWÔ\CXÅ0CV¿œCV¨ÐCVLxCUº¢CV÷dCU¯ CU‹CgÕ(ChÀæCg^Cgú¦Cg‰þCgàCgO¢CflCg :Ce¿´CaÚ´C`fxC_ÞÀC`C†Ca úCbNCbMxCaôCajC`ê†Cc›æCd¾ŽCdpêCd*DCdZÔCaäCc=nCbb.CaöCbëäC`ƒC_þ¶C`ÝC`ÁC_ZC`hìC_yNC`+ôC_ C_)C]þÄC_#*C_@°C^íjC]ÛCbîCaÌêCb8CPíŒCOd®CWá6CXP.CX<@CXžCX[CY †CYËpCX|¬CX-úCY@CYÂàCY¡PCY ÀCYCl—CgÚ¾Cg|CgfDCf¯ºCgHÖCjÊþCjðâCkmvCkâCiûdCjq¶CiÕvCi*üCiÚDCjþCiÖCgfâCgߘCh…‚Cg·¾Cb>®CaúdCb”Cb,Ca¾äCe¬ÖCf’´CfÿnCg°ÒCgBÔCfÅ2Cf9ÂCfŽCgBCf¦ Ch†Cg90CgylCf€€CeC‚CZ9ðCXý€CYàdCYeHCZÐC]®ÞC^ÔZC^}nC^WêC^$¼CfNCe­nCeîCd5FCcæCh@bCiV’Cg3xCg›üCfÝ‚CYíCY¨¾CYªŠCYºDCYçžC]6ÒC]¼üC]¡`C_"èC^ãfCaÒöCa”Ca@ÚCaJ^Cc¨C`û¢C`‹CRª*CS¹FCR ¤CR†âCY»~CXÛØCXÐCX¶–CXáŒCWNêCWNdCWçCWðîCX”ÆCWg\CWD¶CW¼øCX zCVõ¦CTý$CTͼCUaøCUè*CU³ÀCXcCY8¤CXFCXÍèCW°4C]šŽC]ˆ8C\ C\xDC]'ºC\¨C\œDC\ ¦C\ÐlC]v*C[‰C[ßC\e:C\1HC\ pCVžCUþ&CWeæCWzCV{¢C[´‚C]LC[õtC\N:C[½CZûCYï4C[|CY¤¸CZ¶ÈCW=RCVp|CVúÒCVz0CVA¶CKpüCKÀðCK³¤CJ CK‹:CSKœCRŒFCStjCRé>CR—ªCUenCU¨CUëžCV PCU¦’CYTCWwâCVºhCW1˜CW‹COÂbCN>¢CO CO!`CN³ÂCVuCWE,CW4þCUL¬CU–¦C^ C^\C\ÞjC]GàC]°C]4”C\œ®C]C[ÞþCZµbCd–4Cd€ÄCdÕpCd­^Cc04Cj–ÞChÛ„ChÛ:CiCiÓìCgÞ`CgðCg!ØCg‰CgƒPCb¥Ca^VCaKXCaˆžCarüCe‘òCf ÂCeÙžCe׺CfahCi|Ci›ŽCjÏöCjFCi,Cg:4ChrDCgsrCgV*ChVCbÍVCa&Ca8úC`íìC`ø~C]ŸC]ÐHC^˜C]¾"C]äˆCc¡FCbÖ:CcºÒCbþPCcKhCcpfCaÉCbÌ0Ca]PCa ¢C`+,C_@tC^%nC^\ÄC]zCZ–CZÉRCYáCYÙLCZã6C^ C^–ŽC_ZpC^rC^¡ØC^?öC^iCYKºCXXCY›üCW…þCWð`CXpFCWÍHCX*¨CYêCWk€CXNCW°~CV·˜CPÚZCPÂlCQ’ÄCOÆÞCPz4CTÖ4CV9–CVÃÔCUã¦CUÓêCYêÀCYXCZ)¨CYŸCXúCZNCY‰ðCZE¢CZZCZ ÖCR\îCS¤„CRµªCR†nCS´C[ÞäC[&ªC[®$C[„C[UvCZðnCZMŠCZ|CZ´zC[°,CXíCY8CY÷8CY¹HCXÄ>CTgCU CTXCUX¸CTz¬C[ÔCZ»LC\:CZ¿pC\K"CYèžCYÆC[ŒCZøC[âÊCYx2CX¦JCYØCY~ðCYËpCTòðCTØÐCTCU¶JCUÈC]„C\ùtC[²C]3XC[ÄÌC[=CZ®ÔC[FvC[ìCZC”CYp¨CW¬„CY2CX÷pCY÷ÞCSüCT_BCT²CRÒªCRÃÊCY©`CXqöCXÞ4CY nCXÛNCW”0CWÑCXÊCWÀüCW‚PCS/CRà&CS(ôCS"ZCS6€CN-bCM‡ CMçCMjúCMêZCTüæCU3 CU0CV=–CU¼ÒC[–CZmC[m(CZhîC[÷ÈC_6C_Ä>C^ã¶C_FC_¯.COÑ CNßæCO ÀCN COtúCV¸,CVýRCW¬¬CWB~CY0ÖC]·C^yüC]Ÿ"C^šÌC^ôôCf5CeC†CgCfÀ¤Cg<šCO© CN©hCO 2CN:lCOsÞC_±`C_C`C_ƒZC`”C_ÿVCV+tCU)@CV PCUˆLCUazCb7|CbRCar:Ca¥ôCbùjCa¾¢Cb-¢Cbô~Cb|ÖCbÌâCc|4Cc"öCcitCc6nCd‡*CU˜CUjCT£PCTüÎCTïèCaË~C`E¢C`[Ca ˜CayHCa$DC`ËXCbšCb'€Cb¡CbÚŠCc7¦CbÒ¬CaÿCc}ŒCT—@CUk¬CVSfCTŽ\CV8’C]RC\«žC]°øC]–>C\îC^C\æ C^ªC]t–C\æC_g˜C]ÿÂC]Å®C]p\C^ÁÒCUCTGžCU2CUÏÜCV2ÚC[šC\+tC[ÖC\…C\ZC]ªÄC^\^C]{C]›šC^Š8C^BC^g C]åC\ýPC]4€Cg­”CgÉfCfb´Ce÷þCgõ€CiŒ°Ci†Ci¿(Ci6ChðChèŒCg¦CgS:CgÕ"ChBCeãÈCeÆŠCebzCcáCc/lCjã6Cl ÞCkt¬CkÌCkº´Clb”Cm+îCm™BCl>îCmèCl)”Ck¡¤Clk,Cj·Cjã¸Ci­dChqŒChoCfˆCexŒCl?†ClžCk9ºCkzClAŒCn0PCm…CnêrCmŽ®Co<¦Ck¤þCk•NCl0Ck–šCl Cgi,Cf–ÆCeúlCg žCeCTCh¦”CiÍÒCiÎîCiq*ChÈ>CmoCm®CläÂCm°ŽCmØXCkêCj>ôChùÔCjp\CiÄÐCiÔCfÎ$Cgš‚CfRZCdGàC\‹¦C[nÊCZü4C[2 C[EXC_œ„C_ÓC_‰ C^îšC]Ê\Cab.CaŒCb¢–CaÉøCaÉ6Cb]nCailCbªŒCbxCbP²CZQjCY³jCZCZ²CMø¦COBBCTñêCU ÐCUSTCU§šCT)BC`hC_õlC_@C_Ä\C_aÊC^5 C_†C^ C\óRC\âCg9NCg 2CgŸhCfÖÈCh@Cge@CfÄCfâlCfBêCg®ÊCb]Cað0CaqðCa<ÔC`<C\3FC\2C])€C[ªC[žºCiè¦ChÜôCiϘCi[@CiøŽCi8`ChóÂCi,NCiöfCgö`CfU4Cg"ÂCeÔ(Cf½~CeA¨Cb9Ca¤CaðC`WC`-Ch#žChaÂChy(CgôèCh!¼CfüCf‹`CfiîCgTCe×fCcNNCaàVCbÄàCbª¸Cbg(C_@°C^‘|C^C]ÂÌC]¤–C]X>C\rØC]P C\WC]þüC]&C\èC[ÝC[€ÀC[gèCYoLCZNèCZ³ÄCY×(CY£bCXÃ~CXd*CVÛtCX8TCX~Cn_0CpU0CnäpCo3žCpPxCnÝrCn9hCm3ÜCnðCmú¼Cg®€CeºžCfñCf@vCeþ*C\ÕæC]TTC[ÎÎC]KèC\2¨Co…|CnrúCoä*Co•(Cp' Cnó4CnÌÌCnäÒCmõFCn¨îCj2CiC*Ci´àChÎ,ChƺC]â*C^w C]Ú´C]ºC]PˆCfÌCg!èCh^jCg%œCfÔæCdCd*ŠCd‘ìCeKÔCdäZC`WÞC^®üC_ôŠC_üC^›šCbÍ\Cb£ÀCay"CaCÞCaôC^—ÔC^mLC^A¦C^xC^§ˆC^}ŽC^5C^×–C]É”C]dC^žÂC_ÔbC^ÉFC_C^'˜C`YîC`:TC_©ôC` C^žzCZâCYÊDC[C[©ÆCZà0CZVÀC^‚ÀC\¦¤CZÜCYðØCZ,BCYÑBC[>hCZÕ0C[ìÊCZï,C[RÌC[VCcA2CdÓRCeRøCf{ÜCf5pCd±Ce<ÊCe1¢Ce‹ŒCgFèCXÐfCZÒCX0xCX½*CXf²CXôRCZPŽCY˜ÎCZ«ôC[¬CdnÊCd*¤Ce‹îCfgpCg¶Ce;ÔCdÓ"Ce5ŽCfbtCg¹|COb.CO»2CP jCNã¢CN×€CXgCVãêCV¬¸CWfpCXÞC]¾ðC\ÿ&C\ÞüC]XC^`\C]¸C](úC[ܺC[âC[”BCS‰ŠCT¨CS²nCSCT±ªCS.CS¥¾CT3hCSZCRòFCT@.CS­|CTVCT2CRëCWÕCVüVCV¤¨CU,¨CU†ÚC['^C\²”C\äFC[!´C]@C] 2C^urC^¹®C]|"C_(C_&šC^ ðC_EC^6C^wŒCXnºCXœðCVr|CV?´CUŽCc¸®Cb½üCc)‚CbPCc¤Cc£hCc»$CbÎäCd|Cd ,CaXœCa§ÌCb#¼C`^œC`ôBCZ,LC[6ÀCYŸCYxCXž*Ceb*CeìCdäCd’CezNCgi„Ch>€Cg¥€Ch4hChMâCe*8CeؼCeÏJCdØCe›ÒC`D$C_%C_! C]ÊC]’¶Cb‡¤Cc³.Cc‡ŠCbî²CdEVCeÖJCe­XCeÅCd‡ìCeKlC`ïÒCbˆCaÈŒCaäüCbYpC\„ØC\sPC[äCZ?¦C[ÎCTòCT^CUŸ´CUJ†CU†þC[ÒC[3ÒCYõhCYíšCYþ4C\®C[ü„C\C[#¾C\O¢C[§ÈC[ 8CZ.¬CZ™ÄCYC"CXM’CWWxCWÇÖCW•úCVõpC[j|C\NLCZÕÂCZäHC[çC\täC\¥"C\R$C\ú*C\lC^ŠC\úæC] úC\x˜C[½¼C[¢CZKCZâCZv–C[¾C]{8C\|XC^]‚C]R\C\ÎJC]ð*C]“C[ÅJC\þ¤C\©ôC[ÙJCZ©ØCZô8CZVdC[¬ZC[ÿ²CZÃTCZP@C[·(C[fJC[9¼CZGîC[ùöC[ CYèBCZüBCYõ8CYélCZÖCYghCYÔCY¤CX¢‚CX¹žCXöCT0öCSB†CT4\CSN>CUôCTûôCSðÎCSÞ\CUÖCT˜hCVÈCU±úCSÚœCUIÐCTdCT‰òCTˆCSMÄCS0CSÀCY>æCY(CX™pCYVJCX­ÖC^ù C` (C^ƒ¬C` ºC_†ÜC[ï,C\×úC[_¾C[|ÐCZœÂCWLCWYÀCV¾¾CVØÈCUÁôCXÚ¸CX³CX±€CYy¢CW©èC_MC_1>C_\C^Ä4C_«ÂC[æjC\ã²C\ÛrC\r”CZß°CX@CXÁòCW9BCWhÄCUÄ CT•vCU&CU“CT˜CTÝöCT#,CTuDCU:tCU PCTttC[ÔCYxÜCZ“nCYÜCY pC]bœC^w’C^„ªC^°C]®CT¨úCTHCU’ÜCUfCT¸CR¤`CS¦àCS¢CRØCQ}C[ªJCZÜfCYþ¬C[HÖCZT:C^›8C^†¢C]îºC]~C^¨4CYÔŽCYî”CZ4CZZvCZPNCYjzCZCXŠCX¬öCXbäCX èCW¹ÒCWiCV‹¤CUôÐCVÜØCWo*CW¨CV¶dCV™>C\v¨C\°€C]C]6C\÷$C_~|C`ÒæC_"CY;ŠCW°ˆCX4èC[bCYúVCX¯LCY7@CY["C[ΖCZÕ:CZ»ÄC[ŸC[ C\¸ C\NC\™îC[<`C\œÀC[,¬CZ(ŒC[€.CY¸ØCY²ÀC]äC]7HC]ÚªC\R¾C\:CW°CY‚ÐCXÕzCWíCW˜C^OCRѰCPß²CR CRa€CR¿dCTh†CT5 CRȺCRÀŠCSCYˆêCY>CXëØCX¡hCX€6CZç®CZ¤lCZ®âCY°†CZ;ŽCP®COW”CPn,CPT¢CO›ÜCP=lCPCQ5CPu¾CP‹„CT´†CT§\CTIXCU›Cc¸ÂCb´âCbþCa_ÒC_ì6CVJ´CV"jCU~^CV8CUPðC[1PC[xC[9VC[“ØCZ©CaÕèCa$ìC_ë²C_„zC^Ù&CjQÒChŽ"ChàCf™CeÊC`¯ðC`óÄC`FbC`ÌjC_æ:CaHCc(þCac¸Cb‡’Cb)C`'”CkjCm®Ck†ÂClQ¼CjçTCjñXCkE˜CkCkuÂCkÖCiÝCgbCeÍrCf…äCfìCdù.Cfë´CfÞjCcû:CdšLCc ‚Cdj’Cc˜C_š.C`=ÈC_ 0C^*6CarJCak Ca®jC`ªC_Ë–CeÁ„Ce&vCfTBCev–Ce½ŽCdèZCeÑ2Cdô¶CedÐCeÞpCc‘ÔCcIÀCc?fCc lCbèC`†|C_”ðC_dC]¦æC]zLCf‚CeàÂCfÚBCf—òCg–Ch>ôCgCcƺCaþúCc6pCckCb½PCb’*Ca{ºCqòÊCr}hCs†xCqíÐCqmøCtjâCt¼ÂCtÈCs› Cu!úCpdvCo8ÌCoŽFCo¤Coá6Ct5HCrÐüCt6ØCs CsQ Cs¤¶Cs#@Cs¦ÎCt·DCsDCtÇðCtÏ CsóÒCrêâCrÎ(Cs€´Cs|ìCrº6Cs˜Cs¥èCtûòCs×DCt¤CsgâCtFCs}Clc@ClínCkÄCläCnÐCm4CmÊxCm”ClhCm¢\CmZCmcˆCm¤Cm@PCjGÖCj”œCiÄpCk?èCiøCh]°CgðbCh5ÊCgòöCi5 CiCTCiNJCg¡žCgJChFVCj86CiaÂCh’°ChT CgË:Cdó>Cfš´CfäCfĤCf!6Ch6ChûvCgÊCi5jCh•~CjÍ2Ci؈CjŽCiPtCjÖ2Ck bCkϾCkó@CjNHCjÐ’CiB¦ChxCh¶þChîChñÒCjEìCk' Cku´CjöÖCjÑ4Cny Cm´ÜCndÜCmÚÚCmi CoµDCp'Cn´Co^Cnò4CmôCk£ŠClCmâCl“¶CnÀCl~CmG¦Cm2òCmöCm˜ÞCnN¶Cm jCmÑCm¹Coî`Což8Cp#ÒCp^Coí–Cl݆Cm&ÎClüCl9ClZpCp©HCp ¼Cp„Cq.Cp\´Crÿ^CsYCrJCq¹PCr¥ÞCt(äCs!ÖCsì‚Csý®Cs¦zCnì2Cn6BCnŒCn®Cn’CpLDCo²”Cp8ìCq²Co¦RCs%ÐCq, CqŠªCq/JCqó0CuèCs°žCrµDCt"CršöCr´Cr^Cpß‚Cr‚´Cpâ¢Ct2HCsü¸CtE’Cs€Cr,xCsu®Ct*|CsŽFCs˜âCy{CxoCxCwìÜCxöÂCx .Cx8ŽCxICxú„CyƶCx7~Cy–vC{A¬CzΦCzCyhÂCz,Cxç´CxrCygbCz(žCz.CxüôCxTHCx¨°Cy—öCxªCy@|Cy3NCyG6Cx«¦CxG¾CzÝÂCz7¢CzÀCyÏ6Cx÷”C{oC|lC{hCyðZCybJCz-¨Cy‚´Cy$ÜCz}|CxùCy|BCy°*CyµCxË‚Cz®Cy@ CyáJCxǘCxÀòCxR|CyyòCx«CwÅ¢CwxCw¯$CyH–Cxñ~Cxå8Cx8:Cx´CwØCyeèCyÞÄCyÃÚCyÊCy ÀCyËðCy‹CyÔCyQLCyéTCy\PCzrRCzzØCz€C{ºCzô>CyŒCyNfCzn8Czq@C{0†C{yPCz bC{DCzÆÄCzs–C}OœC|QØC|S¾C{ÛC|¬ÜC{”RC{¢C|ÇjC|u>C|PfC}ºC|–6C|ÝTC{ÎìCzœC{g®C{qJC{$CyäèC|qC{æzCzÈŠC{ZCzˆ0C|HC{âCzýúCzûŒC|Ò^C}.tC|ÖC}žC}(ÈC}¢C{X.Cz¦CzH@Cz4œCz!„C{Ê"C{ŒtCzõ‚C{\tC{™nC{\ÎC{Ž„C{FtC{ߪC|¼C}1@C|aüC{ç\C|Œ,C{×ÈC{±üCz/LC|ÎCzI¾CzC C|,ÊC{PDC{«æC|îCz„rC|/ÂC{¡ˆC|¶C{ÛC{ãÀC{êÞC{®²C|<‚C|ƒ*C|zîCzÑJC{…²C{Ç4C{ÈCzÛšCzÛúC{gzC{OªCyÚòC{WC{i`C{¹FC|cÊC{ÿC{Ê C}(ðC|›„C|ÛÚC|hC||”C|bVC{TÜC|û8C}øC}DC|ÓºC|£ôC|ÝdC}ªC|QC{üC{QèC{/ŠC{ƒ,CzÙC|ÍC|&C{®ÖC|‚C{þFC{–lC|&ªC{d|C|‚tC}jC|(€C}¢C{c C|*C{rÎC}6BC|C}u€C|üðC|uÂC},C}ÐC{¢šC{‹üC{ó|C|vúC{Æ C{fC{`ÊC}C|«þC|ô"C}9 C|ŸÀC}ΆC|>ºC|lœC|Ý8C|C|C|ÐC|ÇŠC|C}žC{UfC|(\C{¯ðC|ŽðC|3*C{ÙÔC{ܶC|wxC|êÔC}€fC{©C|IìC}ðC}¹ÀC}…„C|ª>C}wîC|ǬC|ülC}ôC~%°C}nC|úC{êªC|æ C|k C}­ C}í C}^hC~nC|æºC|¥6C}K€C}ã¶C|³¤C|^ÆC|C|C~ZBC|‡ C~C}ˆÜC}®C|mâC|1"C}">C}v\C|2ŒC|¹ˆC}$²C|¯ÞC~E\C~jnC|ÝŽC|»hC|&‚C|› C{wôC~ VC}ÙÂC}·C€ÓŠC€K€C€¶¾C€àC€s|C:°C€õlCnLC€œ¦C1DC~BCC@®C~­ØC¬C€XÂC€ÖC€ÛœC€ö C€JCCñVCïþCî$CGàC©&C‚šC‚"ªC×xCº°CÚ¸C¢&C~JŠC~\8CßC~ŸfC%°C¡œC~¶*C}½|C%rC~ŸüC~>ˆC¾ìCï&C"pCyvC©@C‘pCöÞCcÖC~ŠC~P¶C~žnC~ÃÜCêC€8|C€SšCC€6XC\C€¼,CBšC:C€wÊC€LÞC³FCAžC‘dCºüC€ÒÖC€¡ŒC€±fC`CpÎC€±ÂCLpC‚,CfC\CLàC‚VÚC‚I,CÞC›öC‚òC‚(HCtšCìŽC‚RCÉbC€á¦C€‚4C€ÿC€išC€ìPC€wðCF,C€ÎÞC€¥ZC CÉØC‚ºCô@C…’Cà~CƒüC‚‰XC‚xèC‚”¶C‚ TC)2CjÎCgÈC€Ï"CaÜCU,CóÌC'¦C3ÂC ˆCÝ0C_ÐCï€CÒC= CªðCÁCzÀCŽlC ´C©&C}†C€ÈŽCN6C™¾C èC¯†CÏVCpTC]CÊšCæüC½ÞCüC¼2C‚á”C‚ÞC‚KÎCƒCÁÀC\rC€êäCÚC€ÀRC€¿dC~ÀCx€C‚C¾´CÜC‚bCÖªC –CxâC¢€C‚5 C‚dŒC‚\¬C‚jÈC‚DNClÆC€ÜPC€çfC€Å˜CCšC dC C"RCn|C¥PC‚VCs"C¼|CJæCv~C׊C‚:fC‚IJCþC”C‚(C­„C‚c¾C‚ÚlC€üC=ºC¸C‚pCؼC´¸C‚–Cp C‚WºC‚&(C‚¥C‚uXC‚–C‚h¸C‚öBC‚÷”C‚ŽBC‚RnCVC€ÚC€¾ÎC%ÄC LC‚LfCÞ*CßÞC‚SC~\C‚kîCƒ‚C‚jÜC‚]äC‚ÒrCƒš¾Cƒ(FCƒ¤jC‚ÞÖCƒRþC‚$CùCéCÉþC‚,JC‚X4C‚WžC‚¢ªCƒC‚oìC‚ºVC‚¦ Cƒ>C‚ÎCƒK"CƒªCƒ3.C‚­nCƒ"C‚fXC‚lC‚ƒC‚/@C‚•êC‚vCƒ8rC‚°C‚wäC‚÷VC‚T„Cƒ C‚†úCƒþCƒpC‚I"CƒÆC‚³0Cƒ1–C‚¶ÎCƒ¶Cž˜C±bCHC€üšCWìCí®CRC^CÎC€þ®C‚i\CýðCÒC‚… C‚(ÒC‚;ØC‚"HC‚§‚C‚¢8CƒC€4LC€à"CC€¼jC€J˜C‚C‚ >CøDC‚rCÖŒC‚ÄúCõ¾C‚HTCìäCÖäC‚ëàC‚f¦C‚ÛìC‚éHC‚v0C¢ŒCæC FC€µ4CV Cñ0C¤úCgþCqæCî0C‚aC‚ãC‚®JC‚C‚©ÒC‚·ÒCƒ0C‚gfC‚ˆFC‚¾DC–HCV˜CR C~>C§C’JCCæCß C ”CšàC‚—vC¿C‚cüC‘„CgZC‚NòCØÌC„°CÜ~C–CtC€¹ºC€NêC€†€C€äC€î¨C€ßC¨CaŽC—ÀC€ÐZC€êvC€ÏtC€^øC€wöC7ŒC,®C€»`CòC€yôC€£ C€&ŠC€µ¾C€ƒ„C€xÀC»CœwC€BpC€a¸C€²ðC€Ã$C€¡@C€¯¦C€l C€KnC€ÝòC4äC€ÄjCˆÚC€ò„C~Ï¢C~}þC~hªCbFC~šØCvfC~¶C~òC~¾fCC€^žC[NC€ôC€.ÜCºØC€XèC"°C€½C€FÈC€ìPC€öªC C€`àC€x¼C€ÌFCZÎC€ð˜C€æC\C€»ÞC€›ÞC€XC€Ê¶C€ÏNC€;¶C€ÒC€D.C ZC]šC· CC=Cc¼CP†C#C€—¬Ca¼C€›*C€ÍC}ÕJC}Á¾C{ýÔC|i¢C{¬ZC{®C{ÞCzC{Ç*C|ðC{£ CzùÐC{`¶Cz¼CzÕC{¹ÚC{ÞC{³ŒC{‚CzXPCz‘bCz±Cz ¦C{×nC|èhC|;BC|§C{e¢C{C|šJC}dC|ªC}p¬C|ÓVCyECxSþCxÂ@Cyä²CzHCz@4C{µnC{¦€CzqVCz­ÈC{J„Cz€bC{Õ†Cz¸”C{C{ËÐCzì8CzSC{¾lC{4jCyI”Cx$Cw©ðCy]6Cx’6Cz±Cy~CzŽ„CzEäCyjCzÜ:Cy¹úC{œCz-tCy¥‚Cz3RCzêŠCzèCzìCy…žCwrCvó€CxÌCw¾„Cwi\CwbCxRºCwGdCx‚Cw7‚CwŒÈCy ðCwÝÐCxªpCwHZCyhCwëÂCw£CxD¦Cwà^Cv&PCv«LCu¸TCu•rCuICuhÄCujLCvdèCv«JCw^CwŒCv0Cw—fCvúØCx$CwȨCw¦Ct™ÀCsðæCt¦~Cu´Ct€JCtAtCuŸCtÅnCu­òCtØ.Cv.CvŒCvtCw’pCvÑbCv•˜CwpÌCv]ˆCwªäCwg:CrúêCsµŽCrâFCsŽÌCs­fCtédCu[$Cte CtúCu¬CuæØCv±DCvaÖCvñ8CvœðCuÐCvY¤CuëÒCvÃêCvƒrCtx~CtufCs·ÚCt,CtÓîCr«TCtL2Ct¾Cs~zCr§€Cu©&CtCs÷Cu£Cu>¦Cs’`Cs~ÀCsÒTCtÄÜCt¾®Ctö‚CuW>Ct@CuDTCuvlCs{2Cs êCq÷ÀCróÂCrCrì”CrCs©tCsu^Cq»`CróîCtºCràlCqàòCržCq¨îCqùCr* Crl`CqÝ>CoP(Cn°œCn½NCn™¶Cn©àCqIÀCp»@Cp Cp©DCpRÌCtYòCtýÖCs·´Cu\œCu¼CnbCm<¸Cm5´CmClã8Cm&CmäHCn‚xCmuNCn:@CpezCp¤ÒCoôàCoy CoļCr‹ÜCršÒCrÈtCrýCqÑŠCmªnCmbºCmWCl&ZClÉÆCnrÞCnfCnèºCnZÚCnFˆCpbÆCp§(CooxCpm´Cn¥JCq;ÖCqæVCqÄCqj®Cq«0Cm$~Cl2Cl±ÎCm4ClÇâCnïFCo:òCp_šCo»¨CorCróàCrH6CrçCr8HCqá‚Cv ¢CvîÂCuèCt£Cu­CjôžCjÒªCj4&CjuðCiœlCo¥ Cp?bCn‡CnHCoO°CuÙæCuCtô’Cu4CuˆÂCx:®Cw?"Cw•Cw¸èCvÁ¾CoœHCoôøCnH€Cn?CotªCpz6Cp‘ÂCpÁ°CoÈÚCp¦2CsÑœCsˆ Cr¯âCrƒCsSäCtÝ¢Ct0,Ct-þCuT¾Ct™þCp‘TCpîCp¤ìCpOpCp°CpõCp´RCoJ‚CoHêCnç²Co§~CoõìCo¨vCp,BCo®šCrN¢Cr™ Cq=jCpÕôCr(CnDCn)ÒCnE¬CmZZCnf Cpk CnÝjCo¡æCpP$Coì2Cpc˜Cn¸*CnË´Cn½¼CoQÚCq+tCpUfCoñÆCo\àCp1CtCt²Ct…ÈCuCtaÒCzOâCyjhCy§„Cy8ðCx§Cw?–CwACvq CwdCv[$Cu=¨CtøCsmzCsážCs¡´CsJLCrP@Cr-FCr¸äCrÿÂCxÇZCy—PCyŒÚCzDDCxm¾Cx°Cx®rCxFœCvŸØCv©:CxwpCwÈNCv;êCwjrCwGÚCvÌÎCwMLCvÊöCw|HCvô¸Cz[ÊCx¯DCzCXCxbäCz6HCvx"CwdCv×ÒCuÿ„CvBCtk>Cuj*Ct 2CuUTCt\,Ct“rCu!XCu“pCu­îCtäÎCu„ CtżCtºÆCu%ÚCuVPCs‰€CsS:Cs`ŒCt%PCrP0Cs+€Cqf|CqúCqâlCr¶ºCnœÌCmÉHCm€dCmF4CmyzCo/CoqÒCnýCoñúCn–²Cp,NCq#¦Cod¬CpCp(Cn™ConCmòtCo—œCmïvCmø€CnºCnZ:Cmœ|Cn¨hCnÁ¦CmY.CmXFCn CmêÖClâæCmmFCmvCl2ClÎCk»ŠCkAüCk™hCk`CkC´CmE’CnŠöCn@Cm’‚Cm³ÆCmfúCm,˜Cl‘nCl1âCm”Cl¥>ClœCkÍêCl~CkÆCj^¶CkMžCjáÂCj/zCjz Cm~tCnþCmqÖCm~Cn].CloˆCl®ClJÞCmDCm ^CmHÀClÆèCl…’ClrCm–Cjâ€CjŠÖCiþCjŽCherCm ¼Cm²bCnPJCl§RClЀCm,*Cm„þCmõVCnAìC[^C]ÉC] ÒC\ù–C\ÚÚC]M$C^^DC]²ÚC]— C^†öC`<ÊC^XC_{ÒC`NÔC`ºäC`tŒCf*CewCeüÀCeò¸Ce÷tCdEFCbÜÐCc&ÐCb¦äCb·¶CbÄCaå¨CbaÜCaÎŒC`ò C`GŠC`‹LC_ÐüC`Í6C_Þ~CgÜCg0`Cf´pCfÀ@CgGîCcSCdöêCcGnCbåCcÝÈCcÞ*CdšCc/ Cc³rCcz$Cb÷jCc´Cc¶CbæÀCaú6C_ÒšCaF†Ca9C_¬2Ca>¼C]¤ÌC]˜üC^#ÞC^Ó´C]©ÒCaxNCb œCbãtCb¦CTÝêCUjÐCVVCXã–CYóÞCYÿ¶CX3‚CYÞØCXBCYŸÄCZ+¨CY»`CXû\CXœ®CXšÆCWîCWÊ&CXFCVÞÆCWÝØCXüCVùðCW£ÚCV¡ÔCV¤CWжCUêÊCU †CUì,CUpCU4öCTÅrCTÏ®Ca>C`gCaRC_––C`ˆC_øæC`wjC`¿C_ÍøC` C[©šC[FDC\QCZ‹rCZ)˜CWèCXø´CXPàCWhCW8.C_ÑJC^C_ˆàC_C^Cb[þCbdÂC`ü¦CaC`FªC^‘C_í C^å¨C_Â\C^ùC_º~C_RxC` –C_C]GHCe ,Cd€ÊCdÖ Ce6ŽCdwÎCf©rCgS¢Cf|>CfˆnCgÁ˜CgªÔCgÆ6CfZCghCgf8CaíxCbê(Caz Ca[C_&nCdbfCe0ÐCeáÖCefzCdª6CiuzCi”Ci®ðCiú€CiXJCh3ZCif†CgáØCiòCg×tCc‚¼Cb”CbNbCbŠC`Ý"CcCaþÜCcsÔCbÀCcFÖCeœØCe¬äCeÓCffrCfƒTCc%BCa„Cb’öCa©ÄC`üòC_ËC_çþC_ŠC_:C^,C] (C^&êC^LæC\þŒC\íXC]HPC]C]|bC\ÙBC\©C[W^C[NÎCZÄŒC[ºhCZ5ÂCZÍÌCY3ÀCZöCX·ÜCYLCYʦCX ‚CYŠðCZ>´CY¡,CU-²CTÞBCUÖCUcšCTb¬CS\¦CSCS¤HCSÊNCSîìCRrúCR?ŽCRÇðCS=nCQŒPCSD*CRÆ@CTYDCSQ0CSI2CU&$CT”îCSêCT1ŠCS4.CUÈ~CTH^CS¡dCUjnCUF@CUŸ~CTŒZCUôCTºCSk$CY©¦CY‹xCYƒCZ CZ¶C^ö¬C_ؤC_}àC_£(C_;ºC`’ÖC`öCaRÐCaHC_ºvCaª¦CamXCaÅ^C`òtC^µÞCaØdCb0òCb§hCbÙNCb¼CfhtCe¸CfÅúCdÀ Ce¨CbÁCc ÜCbƒúCczÖCcDòC`¦ÆCa¦ôCaeâC` .C_†ŽCkðCk£ŠCkŒDCk,ÒCjývCl/ºCkõòCjÂfCl€ÆCjïˆCdÖèCe¨üCe±CeyüCe,ºCck8CdHCcC>Cd-¢CbÇšCo¾ÂCnƒêCn»rCn˜úCnâ´CpÑPCnòªCpx¼CoJCn­"Cjñ CjªCi 8Ci‰^Ci²œCgŸÖCfgÐCf °CdðÆCed¶CoiÎCoÑjCpÜòCq^CpãˆCpzCqCkºèCkœpCjå"CjÄÐCkaâCl‰ÀCk Ck­’Clï|Ck(ÊCkÖRClϾClÚÀClàCl؆CmÒCm)bCløBCmÚCmfðCc¦VCc™rCdöÞCc’ZCdeÌCi#ÌCglÈCiFCgÁCg Ch¥¸Cj BCiUÀCh˜ChïnCiéêCgõâCiCh¶TCi# CrÈ>Cr¸èCr‚Ce4¨CnÀ$Cn\CmÄCnš8Cn”CqÂCp¬êCom$CpøCoÛ’Cp¢Co,ðCl¿RCm0Cn#ÈChOÀCg CgDøCgÅôCfÍ´CgdàCfOæCgó(CgIzCh(ØCcÌCdYtCcÝZCdCcznC`Ä®Ca„C`ÛpC`a C_ÃfCc VCcÖCd¬Ccÿ|Ccç*CfWCe$CfˆüCfwôCfЬCd¼,CcSCb´ÒCc1æCc[ØC_BC]¨îC^áÜC]<¼C]ôC[© C[/hCZÆJC[”\C[öC[ÛC]]DC[þ2C[³’C\ ŠCd#òCc{hCcjäCdqVCcMCkiCkq~CjØXCjÚCjEDCWË&CWº CV8CVÏ6CVä’C`KLCaAZC`ïC_ô®C` xCjGLCjº^Ci=xCj(îCj‚Cm ClÑjCm~jCn(Cm2DC[&(CYÙØCZ©&C[ŽCYÔ&CeDCd¢ÊCezdCdxCdAÆCjI´Cj]vCj´"Ck<.Cj²ClG¾CkR CkkÆCjÒCkàCY6âCY~–CYû.CZ±VCZº¾C^ÈC^ç¶C^ELC^à C^ÉØCb®¤Cb~Cc.¬CcMôCbÇ\CaµCau2Caø’C`eC`¶æCZ"þCZt~CZúþCZ~êC[$¸C[·CZC[^ÎCZJ´CZÜ‚C[)JC[ìZCZIšCZîÎC[sœCZÜüCZªCXüÎCXV²CY˜CUÆÒCVXdCWP˜CVožCVÔ^CVÀ:CUJCU™ÞCVVCVžþCY‡ìCYÊjCZgÎCYŒCZeC[LjCY€œCZ—ÊCYÐCX¬ÚCU °CS[$CT6šCT±|CT žCY<„CZHÔCY ôCYr$CYPtC[+C[³>C[krC\C\Ÿ–C\sC[7.C[TÐC[ ÞC[Ã2CT¨TCU˜>CUÌCTç CT!"CZ–CZ)XCZ ‚CZ²CZ€C[‰úC[ؤC\€„C[(C\‚C\:êC[ÇœC\=FC[‘@CZCUH®CSmŽCT޾CTÌšCS CYÀCXˆ´CXñFCYÅ,CY¨C[^^C[NC\^ìC[XC[ˆCZh CZôCZ9öCZažCYˆàCT*HCUO"CS”CTCCT¯”CP(œCP‰ÎCQ|ŽCP6tCPcøCXb¦CXjDCW zCW jCWîCZzCX̼CY©XCXþÞCYÅîCSÆÎCS_CTÚ.CSMšC_¦ÀCa!†CaT¨C_ÕªCat2C_°`C^übC_NVC]ç¶C]öC[šÒC]š¤C^s¸C]TøC]°C]ÞCd§CcZôCcöCc*Cc< Caé¢Ca3ÌC`òÔCaŽpC`vžCaŠC`âC_-˜C^´XC_³þC]œ\C]t`C^§@C]ï²C^ÒCa.&C`ÑCi£ZCr6œCrFfCrâjCsSœCs& CRäCR,CQgÖCR' CQÔ~C_šŠC_àBC`öC`P†C` ¸Cdé,CdÿÜCd8ÒCchCcʲChI8CgACfB CeîÌCeдC]fNC]ïC]vÄC^FúC]øÞClW CkÊðCkšCl9´ClFüCm+ClœôCkªÂClnCkäClçRCm ,CkŽCiÖ2ChýÞC]¢C\œC\IàC\QJC\ICmClÃlClÕœCk–Ck£TCoº¢CoÊnCnü~Cn‚¾CmÜhCp$®Co›Cm‚Ck­äCkjCV/*CUîCUù>CV¢PCUÚNCd CcÞŒCcýèCd–$CdRjCl1Ck¸@CkùXCkPCi¹ºCiEâCi‹Cià Ci`ŒCjHºCc>CböØCcŠæCbN®Cb_XCq¨ŽCqÝÈCr­jCqU¤Cr€CuOCu„rCu\Cv8¼Ct¶CuµÈCv¬êCuPCtÿ CumCcm>CdºxCd7CdÛLCdÌÔCn²¶CoTÈCo~ºCn»0Co$Clô€ClkÒCl–4Clì²Cm pCm‚ðCk¬2Cl³ôCl…Ck[êCZh2CZŸ@CYnDCXШCY–@C^G¤C]gêC]lìC]™^C]ÍâCbOLCbßlCb2ŒCaÇ:CaÔÀCa6nCa¢PCaÕBC`IæCafÔCZëHCYÊ:CY‘:CZ øCYÓüCY=CY‰˜CXðÈCY¬¼CZà`CYËbCZlnC[lÂCYɲCY´CZ&CZœ®CY1CYW®CYw¨C[ÜHC[ :C[˸C\ tC[ÉvCWu²CWIBCXûÎCXïªCX –CWd´CW¸CX— CWÞîCVßCX_´CW?þCWafCUe’CU®¾CT¶þCU­bCTâäCUT CU¤DCV÷CJýÞCK>CL¨CJîøCJÒþCO~ØCOë*CPìPCO”CP¢~CVÇ®CXŠˆCW•TCW©Cf8Ceü0Cfp0Cf>¦CezäCf˜CfÊrCeøCfÞCgTChCf@\CfàúCfÀNCVÊTCU\ÈCUèzCV4hCUWÄC\lNC\ªC]þC\WŠC\~ÌCbŠfCb$ÎCa‘Cb€CbF²Ccn CdŽCdŽCd"öCd"RCR@\CRK^CRP`CR8CR’ÖCWüCW´CWÀ‚CX—CXqpC[¸ÎC[¬dC[©æC\‹0C[U†C[»ÀC[«ÊC[ÅŽC[ÔüC[3&CU¸RCUƒòCVjŽCTêCV:6C^C\­æC]ÌC\yTC][ÄCb†ÀCb (Cb_°CbáTCaz€CcèÎCbŠÞCc@dCaÕ¢Cav.CVCUÓØCVªCVuÂCVÁÞC[¬2C\r`C\p¨C]*–C\¤C`ì¢Cb*úCb\Cb›LCaÎæCd\CdœCd¼‚CbýôCb”\CTÊ\CU·†CUÞCTtCTÔCZµ~CZ…CZîŒC\ nCZÃC`³VC_ 2C_›†C_‚C`^C]#tC^~dC\‹,C]IDC]µâCR^CQCQ| CRMCOÎ^CPΈCN¹jCN|CO¯DCN?COXVCQ‹ÖCR&CQûlCP~šCPǤCUQèCTó’CT‘CS²CRâTCOifCNë(CO~¬CN}nCN«~CMgˆCM|CL׸CN_2CLšPCPÑ.CP“ZCOUbCO”ÞCPCXCP¯COÉ^CPîCM¥FCN_NCP¾ØCPÈCOœÆCO©HCP™ÚCQ£*CPîÈCQcNCPBCQy€CR•¬CT;C]ƒ’C]ÖÒC]̶C^i,C]¿¼C]I°C]bCV}TCUζCUÅDCU~œCV¥:CYâàCYâCYÌhCZ~‚CZ´\C]70C]‚C]ÔÚC]ÓJC]xHC\¸hC^eC^?êC^‘vC]¬PC^û\C]ÆC]5ðC]ìPC^36C`IÖC` ’Ca3âC_È*Ca @C]œlC]9C]=JC[Ñ´C[±CXôxCW®äCYRŠCXÀCXsNCaîCbt€Cb³~Ca«|Cb ¤Cc¨°Cc0ÆCX°`CYƒ¨CUçÈCU ^CU`’CTÜCVKöCY]CY‚.CXœBCX?nCX³ZCW7`CWêCVmÆCV‰ŽCWDžCR®CR÷ìCR6ÈCQ9ºCR.šCWÌlCXß4CXÙ´CW’ÌCWD„C\ÀrC]d€C\Å8C\™ C^=€C]¾"C\DøC]…0C]­2C^øºCOïˆCOÕ¦CPÚ:CPñrCQbØC[öÊC[ŒŠC[ªâC[þCZ þC]wøC\æŽC]_€C\‹ZC]ÅjC\ÎêC]d–C]?ŽC^{C]ÎCN`ÊCMž°CMnâCO2âCMþæCV@CU#tCV¯¨CUQRCUytCY/ªCY74CX͸CX˜¨CXQC[EŠC\/ìC[ù„C[wLCZöLCO3ªCNÇÖCO,ªCNà¾COتCXµâCZ)ÖCZ{àCZ|XCZNC_>¸C_Þ˜C_îC_²hC_“ CeM\Ce}îCeÄCe DCe¶ŽCOéîCO?æCP tCP¾ÌCPæòCXb¬CYÞhCZXîCZ"†C[жCaÖC`GCa\@CaðpCaFŽCe«hCf*CeüCg³ZCfyÔCRq4CQ”ŒCQÍšCQò–CRÉ*CUÁ’CV²,CUX6CUUÈCV dCZ®ÔC[î´CZñ6C[¡CaÐFCc bCaÁúCapRCdCb ìCaølCbŠhCaødCb.CmëCmcèCl­CkEÎCk…¶CmÜÂCmeèCl6Ckq>Ciú2CléŠCkäúCm(&Cll´CmsøCoåHCnêôCntCnmLCnjÀCmÉCTÝlCS§ÀCSâ®CS“LCR;xCQ"CQ?.CP"2CPnCfª\Cg"dCfðšCgVCeÑìCko Ckj˜Ck{CjÿCkjºCd6HCd$CdCdCd›Ccz†C`aZC_ožC_tüC\”`C[ÿVCfÇXCfÆCgèÎCf¶TCfBLCld\Cm¤Cl›ðCmÖîCk÷¾Cfy¨CeÀâCfºjCfàCeÂÒCa¦„C_»BC` \C_áPC^Í`CcžúCaÌÊCc±rCaôhCbíbCc}>Cb;¸CbVÔCcÀæCbðTC`ú C`FCa5.C`Å$C_f0C_¨œC^rÞC^c²C^õÌC_ÚC_¼C^íôC_[BC_kÔC`\ CcPVCbªPCc=xCbÌCcC¼Cb6vC`¸æCa«îCbŤCaäøC_H¼C_ÎC^•¸C_0LC_L´CZ!.CYá6CZYCYÎþCZíÎC]ç8C^*ÄC] C\/FC\­C^ äC\@C[É¢CZ CZæœC[:jCY¼´CX’œCW5ŒCW%CT@CT¬HCUñÂCUðøCT¦CT¼¨CUÉ‚CU=CUDCTW(CUÚŠCV€ÜCV‰„CUøCVŠCVÒvCV &CUfCU ˆCUÊ&CPêzCPÿ8CQ(CQ¸LCPË`CO·(COýîCP—ŠCPH*CQ„CTw”CTëØCT PCTX€CUq¦CTÚNCTõ CU/¬CVCUƒÎCTÂÆCTCTˆ.CU JCSïŒCT VCSàpCTïJCTy’CTfCY¦~CZ3,CZ²ðCY—$CZ ZCY{XCWÐHCWËþCWû.CWIÖCX@zCWÙÞCWžêCXLôCX TCXM,CVüCWACWØØCW JCY*ìCXøCZÆCXðžCY³ÐCY„ÚCYoºCYö CXØ´CXüøCYŒFCW¼ÞCY>ÒCWÏPCXaâCYA°CYRvCX•öCYmÞCZòC\”C[à8C\ÝCZþ\C[¶C]HC\qÈC\ó¾C[•HC[ \CX ,CX¶CW·ZCWøXCXÞ¨CYäöCX³HCYúCY ºCXkC[JC[„¦C\~ŒC\PžC[$TC\¿LC]2&C]C\(C[G CRûèCRðCSUFCRÀ2CSsXCQöœCQŒCSòCRŠ~C[NÒC[|fC[:CZƒPCZ»C\HÞC[EþC[ôC[zCW„ŽCV¶ CW9âCV—nCV–ìCY‚îCYÊêCY tCYCZ„CYŸvCZ`žCZšúCZ¬òCY“zCZ¤pCYþ¨CY¸CXß8CXÜäC` "C_©äC_ ^C^Ê$C_.FC`‘~C`ò–C`æ@C` C_kÎCUçŒCUZ*CUaCU]RCT=ôCUk6CUà®CVª(CVÉàCVLÂC^f8C^TtC` C^ALC^MþC^îhC^”C^ˆ.C^³ÐC`cøCRLCStCR‹šCSˆ¶CR6$CS3ªCR¬CQêXCSTCS˜6CXà&CYª–CYdšCX}àCX¿CZ>"CZXRC[ŽêCZ-$CZªCR—^CQþžCRyCQ‚tCRÃCQYôCQ0tCP—ðCQüCQ[ CUˆrCT6ˆCU-ÞCTãCTä¶CWQCVX0CUÂCT’JCU×^Cb0ŽC`õòC`Û²C`ÖTCb]¢C`æ,C`¬RC`›ÌC`¨@CaköC]&ŠC]ä2C^ nC]C^hCXÙÀCXL8CYðCXþœCX\VCa8ŒCb’ÀCbÒCb9^Cb8CaéŽCbFTC`ò|Ca˜(Ca\XC^ß6C]ÑHC]QÚC]“ÔC^ëTCYjCX†CX¼CW³CXíCY%¸CY@pCV…ðCWÈ CV¦CVrÚCV€LCYOúCZ CYOšCYØCY›*CXJüCVÈúCWÔCV¨CW(CS–ÊCSCTþÚCSÑ CSýðCRVRCR’ÒCRËÂCRäÂCQÅ0CUõæCU”CVÈ4CUô°CV CV¨CVóCVøØCUÖàCW#0CQ±òCQÕ¸CR´FCR¨XCRÏÈCVþ¦CUzdCVݸCVÓòCUŠÆCY•"CYTVCYÄCY«.CXž4CWÎÜCX‹VCY"CX?ÎCXŠCX –CXÞ4CXÚZCX9ºCWÆhC[W¢CZèøC[ÖbC\o2C\W(C\œ¨C]L¶C\á0C\ïC\À@C]rLC\¡lC\oBC^¬C^0CX½ÈCXì®CY&lCW°ˆCYVZC[†C[=XC[Ð~C[µC[w‚C^›\C]X°C_A`C^ÿ6C_…:Ca öCaBnCb#zCb=öCbÂCWQfCVACU±šCU÷¼CU£®C]JRC]þàC^ŽNC]AâC\±fCcUxCc†CcÙTCcL‚CbmÒCeLCdc~CdDCdË\CcXfCcBžCcÝ"CbV CcÜfCc¦èCf&Cg©bCgDCgwøCfÇÄCgˆPCh™ºCgT¤CfŸNCfjœCiPvCgÑFCf¤DCgìCf9âCiæŠCj{’Ci© Cjc4Ci«îCl´Cl–ìClUTClòØCmžCmw¼Cl6Ckh¨Cl8¶Clâ CjšÈCjÂrCiÔZCiÖfCiîCgv~CgsæCftîCfì>Ch&¼Ce>CdŽzCe•œCcŸ(Cc àCcjCbBCcH¼CcfôCa…&Cb`Cb¥Ca”¦CaTC`ßlCXˆCY»CXÆCYEÀCYqîC[`îCZECZÿ˜CZ)\CY)¸CY›CWÖbCc¤þCc„ÀCdxþCdhÄCd¿zCf¯0CfLCg CfõÀCfgnCeXâCfÖCfKZCe$CdgpCbaCažìCa^ˆC`ê^CbüCeÁªCezCd7 CeʲCe:&ChúêChÏ>ChCg¤êChš¤Cg**Cg¦ŽCf.¼CfhCfÒžCiXCgàHCgëüCf|ÂCg|œCWëHCVãDCXÊCXDCW "C^Á¨C`kŠC_V²C`DÜC`+°CgCfD°CgZºCf¶úCfè´CiXCh)˜ChíæCgW$CfþCSyâCU CT[$CS½øCSbCR:CQFCP¯4CPõ6CQôPCY-¬CZ(PCYš†CY#PCZ¡TC_ZðC`€`C`Ã\C^µxC`mâCXˆCXCX]DCYü6CZ PC[ÌžC\x¦C\ÞŽC\- CZë†C\Ý2C^xC\ôøC]8C\Ï^CZ †CYhBCZ-bCZÄCZ 0CZ]hC[û’C[· CZlTCZ=°CaºCa DCa²ÎCa‹¼Ca?HC`7äC`ŒFC` C_ö¨CX¬ôCXƒÒCVΔCX‘’CWivCVxHCV«ªCU8¦CT78CTÕjCWRjCU2rCUÞ”CT§¨CTôCU!®CTÃ\CT]îCUo.CVbCXà”CYøäCZ=–CZ!.CX‰CX¸CWòŽCW´PCW2ÐCWÑâCV¥DCW¢CU‡øCUñÎCTú"CS¨CSÖ¬CS1*CS-’CRÔtCT†ŒCTZ¤CS"ÊCT¬CT<CYÔCXÑ0CY`„CXçCXh0CX¥LCYè4CY9 CX¹>CY±$CR¢TCS’ CS%¶CS ðCS*CSb¦CTCSàLCT'0CSjxCY‚ØCYæCZƒæCY_bCYFàCZÁ´CY@LCY½TCXêèCZ ^CRBäCRVØCQðbCQñÞCS„CX"CX ÈCXÆÒCW£àCVù˜C^4êC^C_)ªC^bâC\õ¨C^%ªC]ïþC]KBC]“C^]˜CT:CSÿLCSÌCT´CS€ºCXòCXˆjCX7ÆCXÑCX$C_–VC_ŒˆC_Ô¼C`‡ C^é Cb°^Ca>CbQbC`ÛÞC`8¤C[cÚCZâCZ¼CYóœC[°”CfÙŽCfÃCgÏòCföDCgÿChOèCiIšChÈ’ChùàCh­øCg¾öCgø¦Cg>¼Cg5žCf^RCZ¼œC[‹2C\«"C\¥C[+BCh0„Cf®ªCfv Ch5 Cgª8Cfç¬Cf6CfÍöCeŒæCdîîCdrCc>üCcmtCbOCb bCU2øCUMðCUSBCVxCVâêCYã¦C[Ï„C[S"CYìªC[–øC^äC^-ÔC^Ÿ¦C^À„C]dRC^QÔC^dC^ZîC^BC\ǪC[tC[OÔCZè‚CZätC\' C]Ï´C]A¨C]0þC^ªC]UCZ'¨CYÖpCZ1&CYšCXâ.C]ŒˆC^C] ÖC\¶²C\’ÖC\ÜnC\C]-ˆC\~¶C]9¬CbÙNCb€xCbˆdCb–JCbS˜CcèFCcJCcºnCdCdmtCa¥¨C`<žC`ªC`¡úC`6èC^B.C\õRC]´6C^ŽRC]š‚C_wC^‰ÊC` öC^èC^½ºC` C_1ŽC^ÅÌC_éBC_ùCa:C_ÐØC`KzC^¯¶C`¦C^«ÌC]œ€C]©èC_~œC]®C`0CbžÜC`»nCaW¼C`רCch0Cd5úCdŸŽCc]*CcìÞCd ŽCc§CbbCc¤CbêC\÷:C]}fC]W˜C[ÉÜC\d"C]¤lC_`îC^ÄüC^÷ªC_ØC_ÈrC`„†C`¨nC_³¸C^ÆÔC^K°C_sÎC_®ZC]ªC^ƒ(C[MÐC\PC\õC\¤`C\ÂC\JôC[¼NC] VC\C|C[wC_r¼C^çˆC_¢ºC^ÆVC^ÊÌCa@Ca]2C`÷ÜCacCb8DCWp´CW¯àCWê8CX½CWECV¨¾CV TCU¼„CUñÜCVCZ¦ôCZþvCY0CZv–CZçHCZ¶dCZ8ìCZzCZ›°CYóCcÁCd84CcI4Cb»RC_zC`t¶C_C`UòC`äC^¶îC](C\ǶC]Ï C\QäCd0CetCdÙ¢Cd3ØCc¶CcU@CcJäCdÍîCb´žCb­PC_šŒC_iŽC`zC`V4C_ÒC^ìØC]œžC^T C]ƼC_` C`³êCbsžCb:Ca» CaͶC_M¨C_C_üC`oœC`jºCp9ÀCoI˜CnÝäCo•ÎCpÄCp,pCo ¬CoTHCogZCn²°Ci’ CiýbCjðCixChˆBClúCk€¾CjVCj’Ch „CoäpCpôfCo‘ŒCo}JCqºCps@Co×–CqkÔCp¹Cp’ºCp*~CoÒTCoÒCq[šCp­ CqŽ\Cp}´Cq ’CqY„CpQ^CpvCpo2CqT8Cp§–CpÚôCpæBCo ¦Co"PCo\>CpŒCm ÐCm¡¼ClÕŠCl´†CmQCnïDCo2CnŸXCn•¦CoÆCqÍÆCq|ÌCqµ–Cr XCr6€CpмCoó^CqGÜCpfÄCp·hCo¶ÎCnçFCoCojCnbêCm£HCn]Cm$FCl¬ClÏìCq,CpØ2Cq0šCpº¾Cp¸CpP¶Cp‚ÒCp ˆCp',CqÜCpCLCo;¢Cnˆ@Cn¿ÄCoåClŠšCldCm ¼ClÄPCjýbCo“²Coâ8CpÂCo’fCnfžCoÆCoCÔCoÀCnjÂCo¸PCl-ŒClžpClõÊClרCkuPCjqBCif$CjÍBChÓCi]ØCkDTCiΠCk?CjlòCjÕœCm= ClÒ>CmSðCl”ÊCm!Cja€Cj±œCkþCiójCkG&Cl´ClÀìCl~òCkr¢ClíæCm ClµfCmÄ’CmRîCm?lCm¦ÜCn5†Cm¨Cm‹(CjójCiì$CjÕ˜CjìzCkÌ@Clš¬ClÎCl3\ClWÔCk[¨CoìCnIÖCnÚZCm±"CmGCoL*Cnï®Co|öCmoÐCm‘úCmŒèCmÂClãæCkШClë(Cl“¼Cl.Ck=àClŽpCk²ÈCmãLCmýxCmCNCn^CncøCnìCmOnCnXCnjdCmöCu½DCtZCuvŽCtlFCuNCróžCrÐCrŒÚCs¼ŒCs®Cq8ŠCqàCq#~CpŽ^Cq^fCoì\Cp-XCoþäCnúCo–Cv1ÈCvlCuíXCvéCwcòCwPüCvKnCvaŽCv¾öCuŽÖCs:ºCrgÌCs dCrPNCrÕœCs¸lCsžŒCt îCt.îCræ¾CxpRCxß CyzÜCyR˜CxœCyQCyRÆCzÞCz DCy†CvêŒCvÝLCvÌHCu¡>Cu½:CwbæCvöÆCx*bCx–ŠCwÜCsPCtDCsþCt`®CsnÚCwáøCx? Cy&æCx.CwöîCt%TCsÿ"CuÞCt…XCuÖCv¡tCuedCv6@CtɘCu¡"Cr©Cs^¤Cs¾~CsûCrá¨CrðCrÁbCtCs6òCs}0CtI8CteÎCsª Cu#òCtßRCuÜdCuû$Cvž€CuôCu‰ÔCqUrCq@CrŸ,CrEjCr |Ct‘ CtQCsÿrCtÑÎCt3pCu’®CvžCv¨ðCuÌlCvÂXCvåÀCv¾´Cu³°CvtŠCu6\Cs·rCrû(CràÒCrerCs›ÚCs›ÒCsiÄCuøCsh€Ct±HCtø*CuªCuxšCu²†Cuö˜Cv:CtòœCv"ØCwþCxrCw CwœCvêRCvw.CvNCu²CvÈCu%TCuyÆCu[ìCv˜"Ct§èCu7öCu“6Cw2LCunÚCuVCx3æCx«XCx²¾CyåCx“TCx´ Cz4tCzkHCy°Cz&ìC{RdC{ lCz2þCz C{…˜Cyõ(Czq$C|;nC{#C{æ*CzÈæC|IôCzÃ\C|$6C{ÇÖCzqÐC|>xC|MºC|[C{‘®C|2’C|z°C{€C{0LC{G0C{:C|ÐC{¼C|–øC}C|(C{ÑÆC}nüC}V¦C|nÆC{ÃÊC}¿ôC}zC{íBC}.ŠC{÷˜C}ìC}€ŠC}ç¶C|eC}¥˜C|êtC} ”C}óžC|MŽC|zC|IDC}‘šC|V²C{·–C{|ÆC~.€C~VC~)€C|®C~EC|›–C|zäC}ûFC|d¤C|Þ:C}ßxC~kÚC}}øC|âþC|ð€C~b¤C~&¾C~=DC}C|¡¨C|¶&C}‘øC}àC|²¬C~øC|ýC|ñC|˜`C}2vC} HC}`àC~/:C}/ÜC}¶BC|™ØC~yhC~PC|†²C|cØC|húC{ÿVC|àžC}*êC|(pC|ž°C{º:C|M†C|ÖàC| $C{ÉC}ÈC}…2C|~VC|ˆäC}K¶C|ØZC~;fC|ËtC|aTC}žÔC|„¾C{G6C| pC{ñ8C{UøC|>|C|:¦C|#xC|iòC|óC5*CrC~c(C~ƒRC~+CèŽCw¦C}î¶C~¢C}ØC,¤C~œ’C~$zC}»pC~2hC«rCS®C~©âC~òXC–C€J†Cs\C€z>CûŠC~ð¾C€Y^C€OC€enC³lC´6C} C}ÀC} ‚C~4C|±|C}‰C}Æ C|•PC~YC~/>C~Co¾C~°C~®VC~¬Cƒ4CÐCØC€OCËC€AÚChCépC€ÇCEC~fC~cC~üâC~ÙúC~ÓâC}SC~'FC~4þC}VèC€D>C€ FC€D.CcC€<^C€ zC¬C€9C(šCCC~RÞC~¶ÒC}nhCÐCUJCõÐCtØCmšC€TžC€ƒ–C€'DC€0ˆC€ÂC€P C€ÍâC€u4C€üøCzC}Ó~C~õäC~(C”CG¤CÞ0C€FîC€JC×ÞC€]C€áZC€ôTC€lzCXC€yC™PCÐ"C®šC–C‚rC}ɤC|̸C}½ C}]ÆC}ôtC3ÄC~’C~¨dC~òèCŽ"C~CfC~êxC~þCSðC~€¬C€ùC€_^C€GæC€…’C€eèC€ ŽC€RâC€O¨CòC`CͦC´ÖC~†‚C~Ú¤CP‚C~ö¦C~:C~ÇTC~”àC+bC€BxC€åtC€æC€òÊC€ÎÐC€Ò"C€ˆfC.¦C0C€[C€ã’C}¥šC}é CštC~%\C}°„CÛ˜C€ZdC€CõlCþC€“|C€°C‚!0C‚‚CÅCp\C€†C€ÍCE–CžC‚A¾CôÄCžÐCi$CÎxC›”C“$CÅC†€CëBCÖúC‚ \C‚ÊC‚ÞC„üC<CdÌC€Ë*C“ŽC€õ:C}ŽC±"C•ÞCÂHC@C‚(ÀCä0CáØC‚6äC‚rFC‚1\C‚FpC‚nîC‚apC‚NŽC{ C¾”C{òCâxC€÷ÔCùÒCÈDC‚âJC‚!,C‚]„C‚‚ìC‚çjC‚ C‚ËŽCƒE`CƒØC‚Ž‚Cƒ8Cƒ—œC‚ÖŒC‚È.CƒWCƒlCƒ± Cƒ ~CƒdêCƒ—ðC‚öBCƒ8œCƒ8^CƒrDC‚üŒC„ZCƒ“C„LCƒ,îCƒ³$C„1jC„-JCƒ«CƒrzCƒŸpCƒT´C‚ÝLCƒòCƒ„¾C‚ÿCƒ3^CƒAàCƒÏ¾C‚ÙÈCƒÍCƒÀ|Cƒl(Cƒ”C‚èRC‚öhCƒ-&C‚ã`C‚ÄXC‚êèCƒJHCæäC‚9DClCÎC‚#hC‚ÑC‚X>C‚]öC‚Ø´C‚¯jC‚ C‚ÉDC‚C‚â²C‚wÎCƒòCƒ!ÐC‚–òC‚ö¢C‚’ÌC‚ehC“ Cz8CÇtC‚CøC‚2C‚=ìC‚fZC‚ÔüC‚ç C‚ÌCƒèC‚®¨C‚X,Cƒ´C‚q>C‚ÌC‚:CÿþC‚tFCýêC»þC‚,@C‚!þC‚ÔC‚ÌÚC‚:ÚCÇ Cš2C¹ÜC‚:C‚XC‚;bC‚?‚C‚ÐCƒ"NC‚Cƒ¤C‚ƶC‚–ŒC¿¾C›`C‚vÂC‚ ˆC‚9ˆC‚xþC‚ÄC‚•@C‚}ÆC‚¢C‚’&C‚Å„C‚Ì(C‚¸ÚC‚âôCƒ&¸C‚ôCƒ8lCƒVCƒJC°C‚ TC‚(Cï4C‚3rCŒBC¤VC "C€ó€C0C ŽCÎÔCÍVC‚.¦C‚Á¾CéžCƒHêC‚e´C‚¥äCƒ´C‚(lCíœCVÄC<’CB¢C€þbC‚$‚C?\CaVCÞÜCºrC‚b¤CÛ¶C‚ÔC‚QrCà|Cè@C‚‰ C‚ItC‚,ÔCL:C› CDbCÇJC‚îCÔRCÜCNLC0 Cy,Cˆ¤C~¢C€¡@C€›C¾C€Ý˜CeBC¦öCA~C[4C€à¬C$CtøCWþC@bCôC€–tC€uäC€>C€ÜCì C€è¶C€è4C.6CjC€å¼CërC[C‘ŽCìjCâC€läC€jœC€ÙÎC€ÖC€ C€ã~C3~C€ýC€‰Ca’C ¬C€ÎÐC€ù²C¤C šC= CˆHCÄîC€î–C€úâC€ üC€ C€r~C€L¼C€xbC€Š CŸÙC€³°C}ëàC}8àC~OXC}“‚C}¤¾C}@¦C~ÌðC}Ÿ†C}ñ C7rC~jþCŸC~×ÜCzžÚCz¨CzeCzž|C{nÀC~nhC}A‚C¦C}üæC~,PC|žvC}›BC}m(C}ÕC|z¨C~G–C}n>C|8C}¬C|jÜCz^Cz\^Cz+Czã:Cz C||C|±ªC|ÚìC{«ŽC{f:C|æ²C|U&C{¶HC{¤6C|á$C~E(C~C}#C|è C}*FCz ÎCz¯*Cy¢üCyâ®Cy5C{TTC|Š®C{¶C|(ÄC{C}+âC}_fC{ÐC{N\C{â&C}ÀàC|¥äC|ÖÌC|0C{ؤCy56Cy’ÞCyÔCzúCyÊCz+CzÊPCzDjCzSîC{ C{àdC|4BC{½’CzÐ.C{ÀC|Cx¸FCy "Cxv&Cya`CyáCzq²Cy@¬Cy}œCw4FCv&TCv'HCv®Cw˜CvðCwpCu^HCw ^CuËCv”CwïÀCw”¨Cw’–CvTCw`ÜCyäCwâCxK4Cw• Cv„jCw[ºCwÕCváÌCvŸ8CvøCuæCvu¸Cu¼œCvÍCu·|Cu¨èCwI:Cv¶tCvæCvVJCwmÜCwÙ(CwW`Cwu*Cv|„Cw¯xCvÕCw$TCwáìCuð¨CvCt­øCuzPCvO^CuÔCu0ªCuyÂCv_LCu}ÐCuA¬Cuº¸CtõDCv|ˆCum¾CuMVCuÙÆCueÎCt‹Ct´ÊCuKðCu¬ŽCu©CtAfCu•|CtL Cup Cs»NCtD Ctë^Cu‘ìCsmºCs€0Ct8CtgúCzøCz5¢CzZìCy•ÌCxðæCx(Cw¥8Cx1tCww^CyVCw[NCxi’Cx#@Cwt&Cv4ìCvH4CwPVCuiNCvaCu(.CyK$Cz•\Cy£Cy+²Cy“èCxB2Cw¢üCx«ØCxÒ CwrCtòøCtò|CuëLCu¬*CtãÌCu”öCu«~CvPäCtä¢CvnJCx‡VCwX|CxÒCwë$Cx—¢CsCs‡ZCt“\Cs9¦CsŒØCuÕÐCuN.Cv4¬Cu·ŒCuìCuDàCuLˆCun8CuP8CuôCwNCvZ^CwàCv ŽCwßæCu)úCuT\Ct_ CuiDCuáFCvÏ CwBCvFCv×lCv¡8CvXDCvé6Cw®Cw“(CvþÌCt\2Ct°Cs $Cu fCu*>CrSäCrýCrÊCruzCsdˆCu6Ct´€CtiìCtpCuv¼Cv`ÆCw_`Cw3vCw$CvÿºCvذCwn CvF¢Cw%ˆCuÙCtülCt âCtU*Cu‰hCu~:CtÔ¸Cu*RCt{œCs¸ŽCt…œCtÆìCu›œCtå¬Csÿ–Cu~Cu¾æCv„œCvŠšCv~ÂCv[ÒCt¯fCsí’Ct‹4Cs°.CtÝ‚Cs§¶CtG´Csš®Ct>^Ct$CuCvvÀCtÃ,Cu¾CtÜ@CtLHCs´ÌCsÖ†Ct&æCt\ÐCwJCw)öCvç>Cv£dCwMCy/dCyLCyLœCw¡œCwDzCzVCyê$CyçÄCzW¨CyüÌCsJCs¢àCtQÌCt]þCtò0Cwa–CxÛôCx„Cxw2Cwq$CzÎCxº–CxŽZCy ~CxÆCzCzyºCxòìCxßCxä Ct¶CsI(Ct¢CräªCrþbCuêCwlšCvçÈCv•²CvHÜCu$äCv:ÐCu,HCv¸Cu¦„Ct¤>CuCt·$Ct\ŠCtÚ®Co’†CoxfCn»dCnŒhCo’Cr\TCqÉbCq»òCqç6Cq1ŽCpýèCpÕòCpR’CpÜRCoÚ CržCr°ÐCqÎCp¤Cq Cn’4ClèBCm£ÞCmRCmXCn`Coè€CnÏbCn¿ÎCn CnÍ^Co#þCodPCoØCmªxCn]8CoƒˆCo›dCouØCn‡tClâClpPCl Cm øCl”~Ck©®CkDCkk‚Cjî,ClWêCmlˆCl°Ck¡~Cl§²CmœCnSèCm:CmíÂClzClµCl7DClÍüCmY~Cl­BCm CiHCióÎCi^ChÐvCiÅÊCkk¦Ck} Ck LCjÞCjNTCk~^Cl³ôCl¯ÊCk.CmZCj‰CiÔÊCj¥úCm%LCl[ðCkoØCkŽCkò*Ck™Cj'NCjÊ2CiãnCk¤Ck1.CjÄöCiß&Cj?œChg†Cg‰¤Cf:Cf æCfkàCgúnCg|üCgxNChbŠCh#ÈChìCh¯ÎChdØChNChl*Cg7BCgɪCfýâCh›ÐChpCfÑ®Cf2¾CfâCf¡¤CeéþCfQxCf½üCf9&Cf®CgrôCgZCfÇtChAÞCf½ôCfmFCfEÞCfbXCglXCe¼°CfÝüCgnÞCh;(CgúLCg-ìCfCcRHCbYCcA²Cbâ„Cc8jCe æCd¯ôCdðPCeRjCe/„CgޤCe‹tCfmFCfk Ce{’Cg 8Cg CfzZCeÔCeÚpCa ¼CbotCa>ÀCaXÞCaxCaCaDâC`—jC`°C`ùBCd;CdØ Cdq„Cc„CcJCeµnCf;NCd–¨Cd6Cc{CbE0Cb§.CbxCaPlCaŒÞCc`CbÿCaÊJCbæfC`öÐCeÕPCe¦FCd*JCdâfCd’ CfžÖCe0†CfIrCdiCdVCa(ÊCbÌCaDtCa[ÌCb`CalC`Þ:Ca9ˆC`‚C`°ZCdÞCeÏ,Cd)|CdœCd.²Cf‰øCeþ Cd\Ce¿vCdô°Ca”ìCbdC`ØôCaEäCb@4CaƒòCaòC`‰RCajC`cCb«²CbËCbÏCc °Cb‚JCd TCdeCbéRCcA^Cb‘ÀCaÔÔCaOC`ìBCaš¨Ca–òC_¥àC_ŒÎC`ФC_ÒRC`c€Cb‘CaÀCbÉðCbÒCbö|Ccb4CdÌRCcŒœCdTÖCe@DCb>&Cb˜þCb*RCbŠ&CcSúCa vCa<¨CbW,Cao¶CbFtCaÈCal˜CbûZCb4‚CaàCdëòCföÌCf|ÖCg!FCeÁBCf"CesNCd\Ce rCdúCb».C_C`kÐC`úC`\DC`x|CejbCeêCeD&CdVnCdÄCcû^CbÌ‚Cb¬îCbø~CbJäC`lâCa'ŽC`ÅLC`ê C_v¶Cmz°CnÀCmÔXCl–öCn?æCn Cmž–Cm¶ŒCl¬DCmÖCjÑœCj@œCjÚCh :ChøÀCgÙúCf«.CecäCcÒ”Cc›ˆCnŠCnïÀCn¤NCnH&CnxCnǰCm0 CmŠCn{œCmþþClÖJClÕâCmj€CkÆClkÎCl,lCl5NCj¢¤Cjø¤Ci¶²Cq ´CqzXCr Cq|Cqò(CrˆÜCq¡ÈCp”òCp‚0Cp®CnŽÊCo`ðCmÛCm©šCm°CldÖCkNCjIˆCiøCgò¾Cr< CrY€CqQrCq3ªCr},Cp߈Cqf„CpƒCp^°CqQRCo&¼CoÃCo¸Cn øCn ÌClú¢Cl˜öCk&|CiíhCi CiTÎCiË CjÜCi­xCiÁhCln"ClxÖClä$CkÂÖClAâCiHðCiñ Ch;zCi~ÔCicöCfqðCeOhCel@Cd•èCeŠ C]]^C\ЈC\º C[Ò¼C\|°C\SŽC\J„C\®fC[º~C\2C\NÀC\å C\VœC\* C[Ø´CZÎC\KôC[b8C\•ÌC[€ÈCP9(CQxCQbhCQ¬¨CQùÒCR»~CR®CRßœCR­ZCQ0RCUŒºCV×øCUBCV CVlC\øºC]Ë$C\uC]{ C]N>CPP–COÇ2CPjÒCPw¢CPûHCR',CQºCQªCQé:CQe¼CU¨RCVÐŒCUÌ:CVÚCU»¼CYó(CZØ‚CZø C[r|C\#LCa–VCa3ŒCbc Cb¶CaðhCh‰RCi4ÖChoChŠCgÚ0Cj]êCiF,ChÙPChœâCi[ŽCi[ Ch„CgƒdCf€:CgB~C[Ø4C\ÞC[ЀC[pFC[RZCg+ÄCg¼NCg£>Ce÷¸Cg~CijChÙ„CiBCh*ÆCg®zCh7¼Cf±ÂCgÑÆCf+ŠCftCW;¶CV‘úCV¶¼CVîàCV\ÔC]]®C\ C]öC^#ÆC\îbC`(C`4C_FC_i~C_ÃôCd[ŽCdúCcAÈCbVCb‡CSØ8CSCTQCSYCT½nCTíxCTý–CU{ìCTdÌCSÉ C^X@C]{C]U~C\¢0C\àÔCd,0Cb± Cd ŠCd€ Cc»æCQtFCR5øCQÅ`CR CQµ$CUš CVé>CVãRCV„pCUPCYvCX VCW•äCVôdCWçNC]s C\CVC]‘C]­2C\œCU»ŠCU`ÐCT”:CTªfCUâXC`‹^C`hpC_ÿC`$C`’¶Cb8ÄC`ÅxC`‚‚Caª¸C_Í®CatbCau`C_Ò`C_üC^¯Caß\CaÖCaT˜CbeC`ŠCd¬BCe‡„CdmRCdËâCe³ŠCdÕ|Ce3¸CdÂÚCeNCerCdXCcMÊCc’4CaÖºCc(vCeµ8Ce¨Cf„ÞCdã.Ce†þCf*Cf †CdšCePCenCe Cdq¢Cd‚”Cd«Ce~&Cd´CcgÔCdFCbqBCbPxCsúHCsº.CsþHCr9PCsN¢CqÐCrCr7öCrkdCqõ¬CiˆCj*PCiYêCh¬ŽCiüCh€ZCfáèCe§ÈCea4Ce[ÌCr¦tCsŒvCsQ€CrÑ0CrfÎCsCqe°Cr§@CrÂCq(Ck8†Ci9LCi0HCjƒ¨Ci#’Cf£CftCe°6CføCeùCr"öCr”`CrqÒCr©`CsZCo CoMjCo±àCnõCooŒCj£ÂCkÉÚCjC^—PC^G‚C_G´C`AðC_Î@Cb”úCc?üCcÕàCciÞCc­RCbntCbû`CaŠ‚Cc'CaëCaáfCbC`ìêCb]Ca“Cc*lCbð|Cc?œCddCdf6Cb’0CdFCc?¾Cb³6CbÆC[|C[ ^C\CZ‹’C[HLC[LC[X\C[mZC\q*C\IÞCb¾CcyzCbÅÖCcãèCcæhCdžCcªCcCZRCY‚CX‰jCY(„CX‡lCU*^CTCbCTˆCTjCUµvCU…¢CU"|CU¥tCTœÀCTçtCU,fCUà CVRÄCUç„CUÑ®CXúCX¥ CWohCW\CX"ÜCN¿’CO4CNñ®CMš„CMÚ†CRCSŸêCS•jCSg$CQØVCXZÆCXêÒCW€CW1CWÚC[âC[›DCZÃ|CZ-ÎCX9ŠCPê¾CQhCP:xCP”CP"0CYï&CZ,CZžCXî,CY1˜Ce&Cd Ccó¶CaßCb‚ìCeðØCe‰ªCcßpCc‚TCbÀCQ/tCPIVCP·HCPŒØCQJˆC[AäCYÜTC[VDCZ4¾CYbdCfz.CgüCføØCdÊÐCfG¸CiJCgáCh6ÐCgšœCgßCQ–4CQ.NCP,rCQ®´CPØxCRCS¤–CRñCQɨCRiàC^wC]ïÜC^Q~C^¡pC^<úCduòCcÊ`Cd)hCbmBCcD|COpîCP³pCPõºCOÕžCOÛöCM”ÂCMwlCNa2CMI CNƒzCUçˆCWlôCVápCVDÂCVðZCZËC[æ C[C[ƒJCZ¸CYÓÎCY•†CXð`CY+"CXÈC`qœC`‹XC_ãPC`ÄC_¸*Cc­’Cc<ÆCbCbxŒCb˜HCaò‚Cao\C`õÆCaÎC`ŠC[ƒÈC[ðöC[Ô>C[²C[žCaÏ‚CbFtCa úCa)æC`}žCd±0Ce Cd•^Cbê CcêªCb&CcfCa†´Ca`NC_édCV¼®CW€CWøZCV³ìCVú@CP¹ZCR4CR¶xCR'VCRÏDCXþCXôæCX‡ CW øCWÎBCWŒ CX†ÄCV‡xCWnVCVCUÕ¨CUÏCUspCU>´CU$2CTŒêCTÓÎCV?ªCUtnCT‹>CWqCV%RCV&–CVõ´CUÍDCUòìCVzŠCVžCTêhCU¬6C_/XC`ºrCaCQp¦CGÕÆCFˆÊCG¼²CGŒzCEÄèCMJ CLµ¸CLíVCLr¸CM“ÐCM›êCM\*CN¹úCOn®CNfèCL;~CL@¤CLX CJÈCJ¹¢CF¤~CF§œCF­0CFnCEêCOpªCP&hCPæCNºèCNÚ&CSvCR?pCS_œCShCTCŽCL³„CKsCL˜ÌCLÞDCL;ŠCH„,CIZˆCHtÈCIEDCHeîCP8æCO­CO¸øCO!COzCTæCS–CSîâCTg4CT`fCLÃrCL¸lCL>DCLưCLq˜CHCH06CIàCILCH‹ºCOe@CO+VCO¾COH´CNÀ>CRCQCQé–CQCPÞÈCICI7¬CItºCIö¾CJ¶CN–CMiCLšdCN FCMoVCUcÎCTxªCTFæCS¡˜CSÈCUòCSuÈCS;6CS‡¨CRÿøCME*CKϰCL©ØCM(RCL¸ CO%†CO†CO rCPÊCO‹fCWALCW}žCVØòCVŠRCVªRCVÜhCWÌ(CWS6CW |CWrVCN¨CNP"CO´CO~üCNãÄCP.ÒCPš:CN¾àCO®tCOòÆCW/žCVœ’CUÿþCW£€CViàCW ”CWöbCW>CVÑCVxÌCO³¨CO·ÄCO=COo CNÅäCNÖ(CNÝ2COdþCNžêCM,CR²,CRŠCRKîCQ`>CPCR¤CS`CRµêCRk”CPCNÃCNCNrÈC`žêCa.^CaHþC`~C`ø„C`_|C_C_½ C^C`‘ŠC_ñFC^V8C^ *C\ž>CgFâCg©¢Cg9ÄCg%ŠCh ØCk¼ôClÂCjÒ¾CjóèCkQzCl¢|CkÒLCjù$Ck7ÞCj‹Cmo¤CkÔCkÃhCkþlCj=üCe*hCdí.Cd÷ÂCe@ÊCdÍdCiæ&Chè„Ci~ÔCiiCjÀCl&ˆCjýPCj_,CjÊ.CiJÔCkŒ®CkTÖClt$CkCi¨\CZO¸CXª¾CYËŠCZ®CXÇHC]±rC]VèC^R:C^_C\âÞCZÃJC[€CZtêCY:–CXñ”CZtâCY}òCX?pCW#öCUbpC_+šC^OvC^ìÔC^ÇÆC^Y,CjèCiýChf‚CgmJCgmØCjb€CjºChò”Cg¦lCf<$Cg;äCe½*Cdc€CaÝDC`#øCk°ºCl`CkìLClõ’Cln¶ClÏZClPöCkOCkÃÆCkx”Cim ChÈÂCfܺCd†CcéšCc=øCbÈÂCb(~CaÿCaÒ>Ck%âCj°CjlŽCjZ¾CkÄØCf¹"Cf—ºCfd°Ceû|CeÔ¨CfKnCe׆Ce¡ Ce NCe;vCdÛªCcFCc•C_PüC_ަC_ÔCdÐèCcoCd/4Cdƒ´CcOVCbáìCb®6Cb¶Cc4PCb'VC`‚JC_­C_lC_±ôC^«TC[ÂRC[t CZð`C[#~CZä$C^urC_ ÈC_h€C_dxC]÷îC^¡ C`a–C`CRC_2²C_*úC]RNC\5vC\WšC[¿üC]$$CX«xCX›àCXŸòCY©tCXÄ6CVeÚCU]°CVcCU±ÒCV‹BC[^2C\hÄC]ŠÐC\ðC[ÈCZÛ¾CY¿PCZe`CY–üC[I¬CT¦xCTÞÒCUÂ8CTÆHCV%–CRnöCTu2CS3lCU –CSËnCZ½CZí0CZÍ@CYíRC[úÚCY¤šCYPŠCY†~CXàŠCZ^FCRe†CS–JCR™,CSëŠCS­"CT²TCUú,CU 4CUÒ–CUæ CZš&C\4C[€âC[øbC[·jCZ÷²C\[rC[I2C\TC]fCSâCShZCTq´CS×\CTÅC[äC[÷tC\lªC[˜4C[vþCaB>C`±>C`„PC`çlC`ËÈCaDÈC`ÎøC_T$C`¥èC^Þ„CS·CT žCUÈCT7CT,C\èC\2C\èC[!†C\W4C^IÜC_q\C^:ÚC^ÖþC]¨RC^ (C^<öC]*fC]+,C]|CSZnCT ÊCSÙdCR» CSbÞCSˆZCSƒ¤CRüÞCT²VCT¶vCZÊ”CY]°CY™ÀCYP®CYˆCZÐÊC[5¦CZöˆCYÑÊCYH€C[†ÜC[¾’CZöŒC[ÖC[C`C\ʲC[”CcCb}CbzìCcCCbÌC`“C_×6C]fTC\³fC\CXO¦CWÄCWCXˆäCWœfCZÎÌC[ŠôC[rêC[±ŽC\C]1`C\yC[À®C]¼C\’C]nC\›àC\X8C[̆C\ÉCU$ÈCTÔ–CTÃ\CT·zCV±šCZKHCY§ÔCY½ÌCZÒšCY–C[bÒCZPêCY©ºCX0CX‰¸CX4CV¨XCU‘ÚCUE:CT¿CX<CW¤&CWkÐCWÏ(CWêHCV–tCVOCUʪCV5úCT€TCR©jCQÞCSbCRNtCR¶CPúCQ³lCP>îCQûCP C[X¾CY®fC[ºC[6CYùC^‰C[çØC]±C]W´C\•CT;$CSÓRCTRæCRöªCSÒžCS‡ÌCSCS°fCS3tCSž”C[$CZuÖCZÞðC[%:CZzPC[¶ÔC]ÜlC\˜âC_h CdªCe \Ch3’Ch•òCi CX—„CWרCX=¨CY/CW^~CV_’CW:jCTöCTŸ‚CUÊCUÂÔCU/CTCRž´CQØÒCWü(CXVÚCX»ðCY‰æCWß„CY¿ÄCX†ºCXþCY/ CXwîCY*CX/âCWhrCWCU˜.CWœŒCV~ˆCSü0CSCC\íÆC\€*C]‘C]¡®C^¾C^¾jC^!èC^4XC_ ¼C]® C\x¢C\Ó*C\Œ8C]vC[€îCZ¡ÔCZLhCXÚTCX–CX´þC]2C]C\”ChͬCh@ÄCgÙhCgñCaVXCa^`C`¦(C_ûºC_ó>CcB6Cc·òCb¼‚CdÄöCc:ÎCh¿nCh CU‡¸CXÒCY;CY´´CYçäCY$”C`XlC_ç(Ca¾Ca3”C`¬8C`í*C`¼ÔC`_tC`å C^ËÌCgÛ‚Cgi¨CgÔ”Cg°ChuCh¨¾Cg™\CgnÚChIØCg±Ce—`Ce×ÄCf<¢CeÌCe_CaPCaÝC`êCaÁCaÎpCm6¢CmJÚCmÚClGfCmªÒCnHæCm¾CmðDCm¢èCl†ŒCm‰ÆCm³ÀCm;žClgCj¤|ClÿClðCmVTClL~CkŸvChÒâCifèCj’CiJ2Ch”ðCjòÖCiÈCh;ÚCg5fChƒCl0CkzCj˜ÖCi¾VCi("ClhCl„Ck CcªžCc4CeΪCg ¨CfépCf½VCgHlCgðDCgÂCg2ÐCgµCgDCf‘2Ce¼$Ce˜CeŽ´Cdù&C\!~C[ÿªC\ÆC]^\C\‘CdF®CdòTCd8XCdNCdŒ„Cd¥NCc· Cd¤CeB CdølCb-xCcKˆCaãÚCb#&CañÐCY¦CXõCXÅŒCX&XCXJ Ce¯"Cdç$Cdô†CeÍÌCfºCfyCd½TCehºCf^€Ce³èCfL¤CdÐ’Cf‰Ce÷$Ce7úCZQæCYCÈCYû‚CZ-ôC[¨Ce…®Ceš:CeÜCeœCeÅÌCdâÔCdôžCf@®CezbCeéèCcïCd6(Cd?CdtVCd¬HCZ]´CY³ðCYépCYä CX̾CVîdCV—:CWRVCWÊ&CW’‚CYk”CYÐæCYÇ&CXܪCYê"CZ”¾CZÀúC[VŽCY€CYò CTE CSIdCSÀCSFCTA®CY®òCYè²CYÒúCXެCY\C[ ~C[„VC[ˆ¾CZ—CZA8CY0CX¿¶CXb¦CXüäCXàÊCS· CU2ÂCS_ŽCSkøCTÛÊCZ¨hC[2œC[¬CYÎúCZF C]ð&C\_¦C\ß C\ÀBC]Ž8C^ †C]C\ÛC[µ:CZ,CSqtCS>CR œCS®†CSQpC[ÚCYýÆCY&’CYWFCZ’^C]}âC]˜äC^9`C]~C\ΨC]ÇTC]‚`C^ǬC_€ÚC_<ºC^Ï C^þÌC^÷`CR,pCQáÌCRÆCRôCRÉCRÁCS°®CR¦tCT$CRw¶C[\–CZްC[îŠC[q4C[oöCZóZC[£¸C[¿CZèRC\8CRªFCQDCR$HCQ ’CQyCN‘ˆCOÇlCNûäCOæCOaþCX7¤CW×\CX"úCWUŒCVtCY:‚CX‚þCY5¤CYZ8CZ–ÒCMGŽCMbÊCM­”CMS®C^’ZC^· Ceó¢CfGlCf1CePCeâCitCfÝ^CfƒòCg%PCgZ CX" CV–xCVKCW»LCWÏ^C].üC]r€C^ÂÔC^‹ØC]æJCe@Ce± CdmâCdúðCe÷ÀCgîœCgGšCfHÐCfBêCf9C[.XC[h¤C[QC[b C\ ÖCY™æC[dCZXCYAîC[ BC_wþC^–âC]+ŠC\•JC\êîCa32C`ÿºCa’`Ca̺C`ÏCXÛ&CZ…NCZ àCXåLCZ³ÚC\×|C]5¦C\yC\¦C[zVCfO~CeaúCdÎCeÈ\CdÕþCjϪCj*Cj¬tCh³bChÙ¦CX¾`CX¶CXTCXÖ¤CXúCa²ÜCbC`ñ|C`¡êCbŠ*Cg:HCggŒCg8RCgŒCgÔCgþChxCfÕ¢CgùvCgf˜C^Y6C^w„C]*C^w¤C^CgcòCgtªCgCiÈCh7~Ck‘êCk©`Cl àCjôÜCk<úCköCl–ØCkÕ¾CjÍðCklZCbÌÖCb®öCa'fCaÅCb*æCiƒÊCi~Ch6¼ChjChßZCj¾þCköCjjrCkH0Ck'Ci:âCiVzCiØÔChŽ’Ci|C]dC]e¨C]úC\Å(C\ÂCe¶CdÕÞCe”CdLCd!®Cgé&Cgt&Chõ’ChþCg½Cj ìCjr®Ci;pCjT6Ci06Cb CaÖdCbdCaƒŠCcVrCg1HCg ÈCg:¦CgÕlCh#NCh÷LChÔCi·Ch¥,Cgé–CiϰCj Ci9FCj=^CjLChŒ8Ch)TCiš$Ck þCjã’Ck„CjÎHCj‡*Coê€Cp£úCoÚ CpèCoÓÈCo›:Cp‰’CpðCp©ÖCo\ÆCm!|CmA0Cm&úCl÷,Cl½´CkðCk÷4Ck…ÄCk ØCj†CkfþCi¤ôCjÚ Cj×HCkÄCjM CpCoZCoq”CocCpKCpÓ’Co!ÎCo4ÐCpÅbCoíÆCoÔCnCnõœCnCnøCnìCpSRCpõVCqCÄCu÷CtКCvÔCtúVCtÓ¸Ct‰ZCt>4CtS0Crb*CrýÒCs¾FCt}ÌCsï€Cs£PCrTJCrûCríÊCrðCqvCrÕˆCu9VCuHbCu2„CvÔCu,žCtÓ†CsÞˆCsÐCsñöCtÚCrÍÄCs¾¤CsîVCråhCsêäCsY¼CqßCqîlCre,Cpï@Cr ÚCq¸èCq=RCpHœCp‰:Cs$ØCrï`Cr "Crü.CsÛ²Cr |CrÈZCs.ÊCs8˜Cs-îCp´CpÕpCp“àCp ŒCoªÔCpŽCoX*Cn÷²Cn¦CpDŒCmïjCn xCmŽVCnt–Cnç¨CmØjCnn¤CmŸøCnÄCn¸ÂCnCl˜Cm8ôClpCkóöCm×îCmÒÊCnÊÔCmú`CoæCr…ÌCsÔCrbÆCs^Cr;àCsQ–Ct5,Cr˜èCsÜCreØCr÷HCs§ìCqµøCq€&Cpå”Co2îCn'TCn"ºCoj¬Cn †Cr?´CrÛ"CsÊÚCrìèCrÝìCs=lCt¦CsƒžCt CsÆCu†¸Cu`¬Cu=˜Cu\ÄCsô@CtslCrexCsJCrbZCr!äCs©¦Cs€zCs-ÌCsÄ:CràCsó¦Cr2CqïÚCqÚäCs6CqêTCrP¢Cr¶¢Cq¯JCs(BCr¨@CoÚ¨CqSpCq*Cq>@Cp«\CqCq“ŽCr3¼Cq›pCq&Cq™Crî.CrNCrâ^Cq6&Cr“âCqCs'èCrþ€CqùÒCoƒºCo—òCpÚCo‘ºCo“*Cr€Cs#HCržþCrC¶Cqÿ`Csø„Csn¢CsÒŠCs¼àCs”˜Cu¯CtæLCu€’CtàPCuvCqdðCqSfCp÷ZCq\üCqyhCrÝÞCs ^Cr¦ˆCsð®Cs©~CrûFCs<Cs–¶CritCr›ÜCsƒžCs‹àCsÆ>Cs_²CsÓöCq~Cp;CqƒFCpºCq8âCr*CqÔCpžÌCqÆCpó’CtZjCtBCrž Crþ|Cr«æCsÚœCs¦†Ctx˜CtK(Ct;CpŒþCoÈnCp..CoDôCo¬\Cqx´Crˆ¤CrñCq(Cq[ôCtlÎCus¬CtFøCsžjCuRCt›xCt ZCu¹ÐCubCuk(Coô¸CnÖòCoF&CpGCp‹LCp–îCq€äCqÁðCp“ºCqAªCr'¨Cre|Csç0Cs7®Cs¸.Ct@Cs¾ŽCrìÌCs^îCsfLCpÅÀCoåÎCqOTCp<äCpP@CrKæCr=ìCro–CszCrʺCtªpCuO"Ct¶ÞCsp`CtS\Ct™þCx8ÒCxtÜCwp¶CxN:Cy‹¸CwõÂCxTìCx¡¢Cx¢ÌCx›vCx¯ôCw—zCvçrCuù0Cw[FCv LCw/ØCwJÖCwçÄCx&vCx}šCxãœCx÷CyWþCxzÂCxè(Cy€(Cx´(CwFCvèŠCv¸NCuÝ CuùØCx^dCvw\CwZ¨Cw‘ CwÈÂCyuÌCw¦²CxedCxuCyCy¼CxtŽCyp"CxkzCyˆ~CyÙ¨CyeâCyÜšCztCyOC{jCz¦CzñˆCy­¼C{"$CzºØCyèìCyÃŒCyŸÚCzÌCzåöC{§XC{°C{´C{,C|2æC{ʈC|säC|@ C{åzC{úC|=:Czå CzØ0Cz´:C{ãÄC{ŠØC{AðC{(C{2HC{bC| DC{ÎöCzÏ–Cz)ˆC{ €C|³:C|`¶C|ÆC|ìºC|=jC|pCzùJCzü†CzØÖC{QœCz«C{BÎC{H‚Cz¦¨Cz…‚C{|CzƒèCzšºCz‚´Cy¾¸Cy=ŒCy®Cxî@CzðCzWC{¬Cz]‚Cz×ôC{B†CzsÒC{@ÈCz­ÄCzµüC{ÏTC{öC|C{^BCz®¤Czw†C|”DC|9C|^öC|1\C|à8CgdCÍÆC~TCÔC}ížC€UÜC€l2C€jºC€U¬CvÔC€wC€w”C€ljC€u–C€›ÔC€K.CÈXC€4FC•ðC€,ŽC€àÔC€3èCÝ_C€ŽÀC€‘TC€È:C€bC€^C€çêC€ØC€ÌÐC€¨C€n C€ÈC€¹òC#8C~bpC(CJ&CÊ^C~¼"C~ðCSCªCHTC~ÚäC °CRÞC}nÀC~±~C~MC}ƒ¨C}âtC|¼†C}C}'ÎC|Ì6C|Þ´C}mÈC}ÉdC~צC~ÄC~¤C~±ŒC}FC€äC~Ÿ¶CZ„C}ÏÀC¦C¦C€TRC€¸¢C€ìCã8C}'C}/ C}¿ÀC|ð¬C}Ê4C~¸ÒC~7òC}  C&¼C~ýC€#uC ÈC rCU€C~ýRC€¦ŽCžC~î†C¾bC3„C}ïÌC}¼¶C~ï®C~ülC~‹tC~ÔCetC~ÖÔC}Å,C~äC{JC€0ÎCþ C CCüÕC€¯HC€¢ˆC€l"C€îC~¬´C}ÙC àC}+TC}§"CpÊCt€C}Ö2C‰¼C†FC€ŽCîLC€"RC€76C+æC€†æCðC€!C‹äC€yÌC}{.C!tC}‘¾C~uC}ç¨C“²C~¾C~D¬C+:CûîC€&îC€_C€qÞCŸzC€6C€^ CÝÔC€MòC€{C€«îC€Â"C€^bC€8RC€üC€uHCšRC€¸CŒ–C€™`CúC‚)¸CåvC‚ƒàCͼC‚£ Cƒ:.CƒC‚¡nC‚ŒNC‚}ÞCƒÖÆCƒCƒQúCƒhCƒÒÀC„T´CƒÏÔCƒäêCƒñÊC„b0C„>C„)þC„„C„iÎC„V”C„•,C„oÜC„òúC…ÊC„«†C„gòC„=†C„.>C„|C„ÑC…iâC„ñC…›C…fC…/nC…Ë@C…tC…6C† ÆC…×,C…ÐCbÖCÔC€ÒêC‚ CõüCƒDC‚9ÞC‚"*C€Ÿ®C€ŽàC€g€C€ âC€C€´jC-0C€³xCBäC¾CÎCnCƒ2CÆCvÈCbC}êCéCªØCDC|C€ËòC€ÖDC'šC€(œC€cÜCê¤C€?¨C€ >C€: C€C€:†C€€C€zHC€ËPC>JC-C :C(¤C ŠC€¸¢C€»nC€~C¦C°´C;C€ áCá¼C€ ÕC@C€V C€‡¬C€XxCLxC€´,C€ HC€oÖCÅC€nCÜC€ìîC€6>C€6jC€~üCB¸CAC~ö6C~ ÖC}ûC€©ÂC€nÌC—¤CÞDCÚÜC! C€Ð²C®C€ùŽCTNC‚PCOŠCRÔCœŠC$C*C}XˆC}Ø@C}SÂC}cPC,¾C\C_ÖC3 C‚®C»C:CÕÈC§LCpCi¦CpðC\ZC”¾CiŠC€QîC€krC6"C.ØCVCŽFC;4C€¤ºCtâCUC€Ä¶C²C€™úC€œRC€¨ÊC@C{ýVCzwêCyºCxÙòCyzÄCx;&Cx5Cx'ôCx¶,Cy@CxþÎCxQZCy×C{œCyÂÖCy« C{CzâöC{¼&C{qC|BCzµêCzP–Cx• Cy³¬CzyfCz!ÌCy`Cyg8CxZCwêCxD^C{:\C{ Cyî~C{CyˆºCyøCz­~C{h¸Cz’âCz-¢CwñHCwÂCv¹úCv[ Cx;šCw:˜CxN`CwàCwAîCwš|Cy“PCz CyˆœCyúCx Cy=>CzJ‚CzrCzQlCxÎâCxñDCx®CwÎ.Cxq6Cy”CxÕúCw CwN¦Cx*XCwšÐCw»$Cw…ÞCwOCxÅ4CwðÞCxî(Cx&Cy †Cw•ÀCw‹`CxãžCyL2Cxw,CxtBCyfCwȤCwßrCw”DCvRÌCwA$CvÅCwÅ¢CwñÞCvpÈCw;„CwsîCwÔCuâˆCu×>CvuCuìCv*FCveˆCvþ\CvcCtl¢CtLÖCs”CtÃCkòCj•ÀCj}8Ck†2CiÇ6CkdÊCkNCd—DCe¤ŽCe™>CdðCcä Cdï@Cdõ8Cen8CdÚöCe£šCiKêCi>CiOâCh¼CiCi° Ci”CiðŒCi€êCiãøCcèCds¦Cc¿VCcvšCcCŠCbx„Cc‡LCb2ÒCc6¶CcHÂCed¤Ce‚CeÛ CeÇCelÞCfõ Cf04Cgc~CfÓŠCfã¦Cc[*Cb²jCcÈCcq*Cbô"C_¢öC_†ÐC`JTC`ŽÚC`‘”Cbü`Cc©œCcû,CbèzCc7žCdàCd[HCcíCc¢CcÍC^É|C_ˆ¬C]ÿÀC_¹C]êhC]ùâC_¬C]|C]güC^ÔC`lCaG^Ca`CbÚCaIþCb§0Cb…ÜCcÔ$CbyŠCaï@C\ŸDC[ñîC[çC\xÖC[u\C\úìC\)PC]ÜJC\ÎzC]ðCa C`2nC_ͤC_ÁÀC_GÎCa­¶Ca]CaÄfCaúCb¼C[lLCZÆìCZy"C\+CZuúCZî8C[Ò®C\®pC[ÛèC\$¾C_ÂxC^dúC_*öC^.ÞC__¢CaÚ Caw”Ca|4C`ßþC`ƒ:CZÊÂC\&vC[°üC[†„C\‹ÆC_ÍÞC^ÎC^2C^(*C^kZCaUÄC`¦ C`æPC`~žC`vÞCb#0Caœ¬C`ZÐC`ÚC`jrC\=ÆC[ΤC]= C]­C]%„C\3âC]rúC]x C]Ò.C^1œC_Q2C_²C`x€C`“ÄC_i~CaºœCaôC`ôC`Ï^C_ÓŠC]YC^ôC]ÔÔC]\C] CYùbCZÑCZ—ÂCZ'üCZÉ*C^ÕC_ª8C]ûâC_f²C]ÂC`ûÎC`ÉîC_«FC`-šC_(nC^8ÖC]DC]µŠC\rÎC]¼lC]‹´C]sÆC^òC]ÐnC]àúCe(~Cey@CcÅöCdT|CdDÂCe7òCf,ÞCd4CdòÀCcn>CVhCVVâCVtCb¾Caî€Cb ˆC]†¸C^-œC]¡ÐC]%6C^*ÒC\YêC\L C[@,CZ¸òCZ=C_ HC^yœC_ÍüC^iŠC^JžC]­C]yîC\ØrC\Ø¢C[þ$C[É®C\"CZãlC[¬CZôÀCY” CZìCX¯^CXLTCYèCYA€CY[®CXû&CX­ÄCXwvCU6ÖCUèÄCV† CU‘CU.ÎCWWDCWešCVÅ:CUßnCV^CYpîCYÀDCXÙ~CV»|CVW‚CW†bCV‰jCWRØCUźCV1®CVD’CV!$CU˜ÞCVS\CVªôCZºŽC[#CdëÐCj CiZCiešCjÚCjšêCjøCiÁæCjã„CiÏìCjYCj©ÊCjªCiœÔCiü®Cj™xCaœ„Ca36CbFtCb€æCaÿ¸Cl]¬Cm8nCmiXCmÜClÅðCmÓCn¯úCnÜCm6šCmp4Cn¾ŒCnShCo)ìCmô2CmßôCb‰CcsCb†€CcA(Cb!BCkÐ.Cj¸¾CkÛ–Cj„CjÐnCm(üClE¦Clž*ClM˜Cm!Cq]ÀCr`CqƬCqgCr'ÚCh’¼Cgž6Cg½¢ChÚCfÖÊCq˜FCr2\Cqé$Cr fCpÕœCr "CraNCq¿NCs>XCrãÄCrD@Cr'zCsJCr¢°Cra6CjàÜCl¼CjXbCk'öCkº€CqZ¦CqHðCpçüCq^þCqQCo-~Cm^ÎCniÒCmuTCn!LCi øCh¢ChTFCgHCgthCdÅæCe0úCd+DCeqCd¤CeÔCeFCe~rCdØ”Cd½ìCcÊCbØCbòCc'îCaxÞCa°CYnNCZO8CZ2vCYÛ¦C[:úCX±FCWØ‚CX^CX”¶CX<¾CYÌPCZN CY¬CZ¨®CY&CWH¦CUüœCVÇCUþCU–¨CWÒˆCVzFCW; CVk>CW̆CSÕòCS»6CRŽCR¾€CT.RCYó|CYóvCYû˜C[ÏVCZmpCT þCSíCS™²CSçCS­ÐCWxvCWq~CWC’CUà CWQCPÈÐCP“ÄCQ4>COÂCQiÆCW.bCWäBCW¡œCUõ¢CU”âCP?†CP¥¨CQCOr.CPšCPß6CQ‘¤CRXCP¥*CQ¤òCO[¶CM¶\CNŠFCNvˆCMwîCW6CU XCU"ÞCTt˜CUKÞCTÛRCTm¼CT zCS*ˆCSâªCPTCQóþCQÇÌCQ|¬COþjCMf CMïªCNØ„CO*HCNÍHCVQòCU²ðCV¹ìCU6"CV.œCVΦCXðCWû|CWÿ8CVúCVËFCW-6CWD¬CV ¢CWŠCSÜ^CT,CSìCRäNCR.CXÂCY<ÂCY4žCYûCZ ÚC\sôC]®C\´C[†üC[YÈC[¨@C[6^C[#²C[NCY“äCXðÜCYÛäCW˜\CVO>CW0ªCXlÂCXjìCW®CWóbCVãäC\º†C^\C\£”C]öC]® C]T4C^hC^b˜C]gC\x†C]°C[_PCZ'8CYvCZj”CX·ŽCVìôCVó¢CXÍ CWŒÂC[UäCZ¡hC[£C[? CZ\lC[ø¢C[âC[­¬CYHöCYÞPC[HC`øÒCa|øC`9ÎCaòC_ÎC[ÂæC[€ÌC[÷¾CZ3zC[¬`CZOÌCYÖXC[ZÈC[QÂC\RÔC[½ÒC[ÒC_M¸C_=(C]ì8C]œªC]fªCVûªCV2rCV”CVÿCVž,CSfRCRϨCRëšCRóìCS;ÔCWDrCWnøCV8FCW'–CV{CWfPCXJàCXRCW?VCV3ÜCZ jCYëŽCYJœCZ:CZ'CW‘ŽCWˆjCW-àCVËXCVÏCU×ÜCTòCUâCTÉ’CTLCUYŒCUJdCUOÔCU³CT«àCWÏ€CX¥îCX$TCX[àCX´CSõ–CU¶žCU!´CTCU‹àCW¾†CVήCVæâCV^ŒCW"CZÐ’CZ£JCYd4CYß¾CY!4CRœXCQ*âCR%|CPë0CPâ¸COÝ$CP)ŽCPnžCPÜCP@øCWKÚCV;XCV™ÄCVÔCUÙ¨CZâ¦CYï:CYÐPCYÐCXî¶CRæCRG€CRXÄCR¤ÆCR®rCU?fCVnÞCU¼RCVÒÜCUB C`ÃC`PþC_«CYÄ:CY$®CYZCY{´CjîFCi|ˆCiz,Cj…~CjV0Cr`ØCq¾nCq" CqY¤CqT´CXJtCWˆbCX:¬CVî®CWºCaÍNCcsZCbF˜Cb^ªCaûCm˜ Cm)(CneHCmI6CnÁVCqküCq7NCp ¦Cq CoäÀC]ˆC\3ÜC\$ C[ÝC[Ê8ChÚ&ChúCh¾¨Cj“\CizCi¿^ChêXCiƒzCi¥JCh÷òCh¾DCinXChAÜCbüCb²ªCb†lCbúCb„CcrCcjŠCbϲCc“øCcÔ*Cd rCbÿJCbé4CcXXCc&ÎCdC¢Cdc°Cd3`CcÅCc¯:C[¦€C\³ˆC[’dC\i¤C[{|CZ¹lC[]VC[ ŽCYÏ"CZ,"C\uŒC[°~C[õrC[œtC\KC]]^C]a¼C[·DC\NC[Î"C`w¤C`> C_Ú¸C_oòC_˜C_ãÈC_qÈC_S8C_+C^]ÚC^N´C\öÒC]ÜâC[[ÄC[`èC^TœC]JÈC] ¼C\Å.CZÌ@CaÊ Caƒ(CaDfCaïºCaTÐC_¤bC`onC`U²C`n^C`ð"C_EªC^ .C^î|C^4þC\wNC]Ö C]ŸC]y²C]æÔC[­>C_×ÞC_` C_…FC_fC^ëìCasCagHC`ö†CazC`èêC`ÒÔC`åôC_æÀC`:$C`òªC[q"C[^2CZêC[1îC[*ŠC_ìC_.DC_TØC_‚ÂC^b C`i‚C_ÄòC`dŽC`RÆC`A”C^ËŠC_A0C_0ÒC^pÔC_@PC[VÄCZÖCYìÄCY‚îCZRC[(CZ®:C[p"CZ•ðC[ *C\‘ÜC[drC\ ìC[aøC[o„C[cìC\>lC[ ÎC[ýÊC\ÍrCZCYžÔCYiÚCX‘ìCXëPCZ­RCZJ6CZ ªCZAºCZ` CX (CXúTCW¨0CWœCWHC]—¾C^åüC]–C]VC\rhC^Cd*–Cd[†Cd„ÞCh‹CiºCi|Ciu$CiFC]!°C[ŠrC\¾C\»hC[üÞCbépCc…fCdàæCd%ÆCcÄþChÎPCižVCieCh@ÐCi2Ck ÐCiìÊCi€nCjù^CjZC\ñrC[Å6C]HžC\D’C\SFC_k¶C` C`PüC`=vCaÌCbͼCcCd’zCdâ4CcʬCbZ¤Cc ¢CcH¾Ccˆ¦Ce{,CWÌCXÊÜCX3ôCX¨&CX–ÜC]ÏC]{¸C^)LC]Ù’C_¼lCc ÂCcTbCdZ‚Ccÿ¤CdBpCb|HCb¶Cd( Cd£6CdËàCW.üCX ÆCWªCW”ˆCX ÈC\ÏLC\þC\”HC\ûŒC\~C\ÆšC]8^C\vC\Ä C^^:C^oLC^¶C\¤‚C]þÖC\d„CU½¢CUô*CV?8CU"CUsVC\¶ÎC]0äC\ÖC[ŽC\ÿ.C]WTC^W C]ÔC]IìC^„LC\ÂTC])vC\òžC]°nC\òCR¾˜CSTòCSNCT CSåÒCVpCVû¸CV‡ŒCVièCUÿZCX…˜CXn°CX)ŒCX×ÔCXË’CYÁjCX æCXõòCXL*CYâvCYžðCZ9ÔCYa CY&CXÎCX!.CY{†CWüðCWöÀCY‘€CZ€LCYà¬CYøÂCYjnCXý²CXÀ:CX)6CW˜NCWâCV{TCg¹®Cg£Cg²8ChæCg°Cd9ÖCdS¸Cek‚CeoŽCeMâCa_öCaÕC`ž Ca”C_ C`xBC`ï¶C`5|C_¬âC`;ŒCgW€CgD,CgD~Cg'œCg=ÚCk7öCj«†CjChCi0¶ChÍCkáÊCk°CjÀdCkÔCkŽClýJCkù$ClgCl>ÎCk€Ce~šCdÎCeLpCd§2CdÀCmTfCmQŒCnppCm²NCm9ÞCnÖðCn&*Cn”vCoËnCoðCo«@CoAèCpIFCpêŽCp·`Cc)BCc§ÒCbS^Cc@¤CcX.Ci}¸ChþCiÏ|CjY¦CjSCiSVCjlCk*ìCjCjø6CjçêCkê´CjvHCkÒ€Clm0Cb ÄCcXÔCc`Cc‚žCa½~CcYCcuŒCc(¦CaçCaŠFC^×&C`¶C_Õ(C`&^C_hÜC]åDC]å8C]öC]ÏrC^JCc]âCcr6CbßzCbžCb˜˜CbxÆCcµpCdN`CbôCbìDC]/C^ãFC]eTC^uxC]¾°C\L C[itC\QC\_"C[$CZÆÔCZpCUêCU:CV:CTSCV|dCWÆðCVúCUm¤CUTCYK CY±ÖCZCY®ÀCXŽ.CZ].CXÊCXžˆCXþJCZ<èC[!0CYËCY²*CYShCXÏC[¦ÄCZÞ.CXÖÀCY7ÞCYs”CY,ØCZfCYŽ2CY“¢CXμCYxHCYŽÊCZAþCYfxCYÞCYúCYCYd¸CWùŽCXö„C]ǰC]C\MCZÚ:C[\CO5œCNª,CNû¤CNRhCOùCO?ºCN˜®CPŽCO ÒCOTìCVâCTwjCT‡†CTlfCU¶tC] €C[d6CZ…¶CY¤ˆCY=ÊCN¢&CMª8CMoPCM{²CNHÔCSWÂCR9xCQZ’CRÚÒCR´ÒCVœØCVbCU¾jCV2öCUíÖCZÛˆCX†nCX´ÎCWè@CVÃbCP×BCP‚úCQðÐCP:CP@CT5²CT€vCUCU—¸CS±ÂC[C[ÖC[inCZ'äCYþNC`‰RC`\C^dNC[õJC[°rCU€>CVbÖCW14CUÎPCWC[. CZ`^CY¶–CYR€CZC\ÌþC\v°C\ª²C\³ìC\ÔÊCaìC_õ°C_ÿ¼C_¡ÞC][œCV~DCU¼’CV@rCV4èCVñJC\¥^C\­C[¨C\>ŠC[-ÆC]ÉÈC^¨€C]EÂC^HC^‚&Ca€JCbë´C`¤C`S®C`CRñCR$RCRÁ”CRp CS­fCTß’CSãÜCSîÎCUk>CT CY^òCY¶ÈCXãšCXóRCWݰC^»šC\/ÆCZFŽCYújCYgZCR‚rCR!|CSÂCR³~CR¿†CYmÆCX³PCY2CYP¾CX"òC\®C\ ¸C[(HCZö&CZs2C_YŠC][CZ± CZaÌCYÖ¨Ce×ÌCe_ØCf‰òCf{ÒCfKØCf¤¬CfØCfCftÐCf`PCd`PCc¡ÆCc6ôCcN„CcÂC^ÌRC]ê”C]­°C]c0C\¯2CeqŠCf0ˆCdÕ,CfúCeŒCe˜ŽCfרCeœFCf}bCeÖhCaÕhCa÷ŒCa®zCa¶ÂCaŒ¼C`¾lCaîC`ÕC`î|C`,8CZ*CZ¨nC[É"CZTtC[DCXa@CX…*CY{ÀCXâœCXÚæC]Ë´C]²zC]>¼C]*¨C]½þC]ÿŒC]ãvC^*C\‰ÌC\—ÆC\dCR€8CNv^CNyÚCOiòCP$CQ>CUû|CV}¼CVÖ@CX[ŽCX*ÄCR¨†CRãÂCSiâCQú„CTÖCVÔ2CUüŒCVvCV>ìCVC\îC[hTC[BÆC[‚†C\3äCX­fCYÂFCZL’CYÐÞCZprCVLtCV9ªCV‡¤CWÜ|CWÄCVûtCW%ÜCWBRCV1CW¢CZuöCY$CZH$CY¼èCYåCYVCZóCZjðC[CZmC[»lCaI¶Cb:’CafC`‚¬Ca|CbÏ’CbB|CcþCb¬ÎCcÊCaOÒC`uÞC_fC_ÎzC_r”CZÒþC[GlC[?C\,fCZPCeÔCcÄCdèCdu.CdÌžCc}LCc^€CbÍRCcZfCc•Cbª|Cap(Ca(CbLxCb=¼C]ëØC\.FC\e¢C\Ï:C\˜XCdDCdm>CdZ8Ca±FC`²4CbŸxCaCbC_DC_ãÎC`kÔC_èæC_¸ÄCQZâCPþCQdTCQ2ÄCQ.CU::CX\tCW½:CW†ðCWßæCWÓ>CTVöCSÑTCTDþCT¢´CTGDCUöCT#„CT.ÈCS¼JCT’(CRÉÆCQŒbCR>CQ§CRHˆCQѬCQÍLCP£CP,CPX"CUwCUjüCU;|CT5ˆCTÞCY†>CZ˜tCZ—`CYØ^CYúC[ÑfC[pœC[WªC[×€C\1nCU…îCT’$CUmCVLìCUµ@C_i¼C^³nC^9^C_jC^‰|C`àC`´lCb*CbnÆC`‡ÊCbSCb•ŽCb`ªCb³*CbÎzCZ©jC[ûÈC\RC[ ªCZ–˜CcNdCb{PCd,”CcwRCbøCc2ÜCb$ÀCaÜšCbÊúCO5fCO*øCWCžCVúdCUÿàCV¼°CVÜàC]–C\ÛC[ÞhC\SÈCZ´C`RC^ðhC_ÖC\b¶C\ý&CQjÞCR20CPÕÈCQælCQs\CWa¨CV'8CW[ÐCV ªCVfXC\°C\ñÒC\$C]JC[§’Cc% Cb2ðCa…ÈC_ýZC^&äCRlCQK´CR`CR_æCPœdCZÒC[mðCYÑfCZX(CZIøC[ (CYÉCX˜ CYÑCXàjCZç CXÛ€CY8LCWµºCWÏrCVi CUªèCVޤCU¶ CWPC[&þC[†CZ ”CZF¸CZÓ²CZQšCZJ˜C[­^C[ÙCZì†CY¹RCXÊ$CY@DCXLŠCXevCVãvCWI¬CW)´CWZ²CVÂzCXS¤CX;’CVÃlCX8øCVå|CW­¶CW…8CX–LCY´CWÊ\CYD€CYˆCWJCXôCX¼ÌCSÕšCTÅCS•ÚCSƒ CT¿ÞCYÈCY—0CYTLCXBCX&¸CYü CYíhCY¡¦CZ'hCX™RCZfCWøTCWà€CW2&CX+àCPñ¨CQbCQLjCRÖCRÔCS‘.CR8CSÚ€CSNCRçâCQâXCSôhCS–8CS2œCTSÐCRjøCRÀTCRLŽCSCSU&COZ®CPÕäCOØÜCP+CP›,CV\vCV6TCTjÄCUK²CSïÆCT¼dCTCSŒÒCQáÒCP°øCS¥PCSµžCROÈCSnCS#JCf`BCf˜Ce{CerCfA€Cf@Cf½BCe*zCdü Cf¹ÈCcƒÄCdCckCc\ðCb̈Cb®œCa†C`‰€C`QàC^bCm ªCm ÆCn•¬Cn!XCmûÄCnBCnÅ´CoQ¾CoÒCo+ðCiÃÀCi¢Cj!îCj9Ch³²Ci¥DCh[ÄCh…’Cg¾ÜChŒCkð\CjùCjíìCkùCkgöCn"Co^ÚCo¤HCng$CnPBCmƒäCl(ðClÎþCk–ClyxCl©ŽCl †Ck®Cl]zCkû¬CPTæCP=LCQœCO½ŠCOîºCQá²CQ1HCOÙ€CQ:¶CPúCX,~CWZFCUç CUORCU‹ÆC\§C]tºC\2C[ŠôC\1ÈCQönCQ|~CQÂZCQ"VCRñ>CMƒÐCM<âCN?®CMCNBCRCR_CRØCR©0CQ6´CS8hCR{jCSEFCQÅBCS*¸CKϲCK¢`CJ¨CK6¶CK ÀCPµCgÓÒChþòChøNChÍîChNàCgä,C\ñ^C]ä:C\søC\¸²C]gšC^Ù C^ë,C]ÐŽC\ŒtC\_4CiºˆCi¥êCjpCa C`Ž,C`§¤C`_~C_kC_²tC` `C^ÙŒCZ¤üCY–†CY\úCZUôCX|ŠCYM¼CY¬CWÖ¢CXþpCW©vCX»¸C[XCX^CWÅÜCUùFCUu\CU².CZ²ÞC[u$CZÚ*C\ÔC[MºC\l(C[Î(C[âœC[â`C]PC[,ÎC[$CZRCYš¾CZ¿CV™äCVûÎCVµCU>CUÖ6CZCYU2CY%„CZ‹àCZsêC]%²C^H°C^8ðC\Ÿ†C]FNC]ƒ¸C\a˜C](C]FC\åšC[ãüC[@²CZoHCZ7.CZ¾¨CYTzCZÊìCZbpC[4`CYÉC\ƒŽC\qÔC]C\°ÀC].œC\`C]æbC\ÅfC\Í C\¨BC[«CZ™C\A˜C[pÜCZ£ªCZ=xCZXJC_¦€C^Ú&C^¤üC]•¼C]‡ŠC]»ÀC^±CRìHCS§úCSe¼CS4CR¦HCXjCXèCVàhCWÎCXCY|àCYLºCZ,TCYÜCYúCYYŠCWÓ¶CXÅÄCZzVCY¥4CZ‰úCZ»ÈCX¼LCOy°COOCOPÌCOa¦CO`dCSMZCS4ÌCTÓúCT2ÈCTööCVôCWòøCVhÐCVÒŽCVˆRCX“ÀCXyvCXMtCYfPCXç†CKð¦CLøCK”CJªCKœCR(êCRY(CSCXCbÝÌCd:Cd{âCbðBCdTCe<‚Ce¼CeDCcúâCcÏDCb÷˜CbXîCaC¸CaQpC`>C\ÞFC[eÞC\‡ÞC[’ìCZô®CcêBCcmœCc,ðCd"JCc`&CdØCcĬCd˜Cd(CcÆÖC_æÌC_W¢C^ÓXC` 6C`YžC\h®C]ŠÈC]—C]†"C\òCcÄCcºèCcFCaû®Cc{ÆCfCe-0CdüäCedŠCf6ÒCfà8CfD²Cgm¦CfDÐCfCaØ:CaÌ2CbCbU”CcCaú\C`7"Ca£ðCa¢üCaÍCe܈Cdü’CfDœCfFCetHCe¬ Cd@²Cd}æCe€ÂCfrClˆ–Ck5øCk'NCiÎþChñtCc:úCd7XCc»8Cc¦:Cc4`Cn3öCoKªCo˜öCnØLCnfzCo’CptÆCpá*Cp|Cp5¼CrþðCr&zCpÂäCpe&CqrCe@LCeÓCf£ŽCfuhCeûLCm§ Cm`(Cl_CmöCkÊÂClÙöClÓtCkpLCl]ÚCk5†CkËDClF@CkCjÌzCjY CiÈvCkA´Cjœ Ci úCišClÄrCm´ÄCm96CkâTCm"&Cl ¾ClЀCl¸ClØCk ÀCk̶Cl¾Cj9Ck|ChÙVCd+¨CcbvCcÌ’Cc>CdŠCfÌCfe˜CeWrCe)†CewŽCb¾CcBxCb¡PCa˜CcJC`2pCa`C`–¢C`´C`©˜Cg½¾CijCh³¾Ch«üChÔClæÀCl¨âCm16CkpXCl!ÐCi¤4Cg‰¬CgSÜChnCfù˜Ch¦¢ChP”Cd8´CdÖCdôCaüCcêCb0hCc_òCbnœCoTâCn.CoCCnØŒCnÿZCpôCo­âCnCnΆCmºÔCn®ÌCnˆ´CmndClWôCjCvC\kC\ý^C\QC]3LC\5ìCp+ºCo®øCoü\CoCn@BCp5C^–VC^¦,C^ÄC_”ÂC^ šCblÆC`(¤C`O„C`µ†CaèC`ŸCao^Ca~¸C`wÌC`õ´C[ÒCZÿòCZúC[TCYtæCa[>C`ýpC_ÈÈC_xÈC_C[¢’C\ߺC[âHC[kfCZ–ôC^åÊC^œ(C^o8C]î¦C^ÐäC[¦:C]†8C\ C\ÁäC]—ÐC[sèCZúC[±þC[ù¬C[ä¢C\ö(CZ~*C[¸CZZÎCZ¬´CY´CYnvCY œCX´CWþªChš2Ci£¾Ci£ÖCii$CgòCgÙPCg„¼CfÑØCfVdCeq´C` ÞCaúC`°C^Ÿ.C_±‚CWÒCX§àCYbCXêCY ÐCl&0Cl(´CkfClw¢CjsºCiCj,†Ci\tCig°Ch>Ck*Cjä2CiŽøCièCi0CRðCQý¨CR4€CR3þCSºCeÊCdIêCcŒ¦Cc‘Cc¨þCp¼ÔCol¬CoOCp€Coˆ”CqÖ‚CpÈCpîVCpäCnåCTï CS¾JCTRDCTÌFCS*Ccë¦CdCböCcDfCduºCnȼCoDCnÙŽCn»CmÝÔCoëªCpo6Cn¥NCog”CojtChVjCh@Ch¶êCh´LCh0Cg=ìCfÂ0CgUîCe|pCfþ€Cc>äCbëCcMôCcÁCdðCjÏæCiICi}äCh‹.Ch¢CjŒÚCjŸCiÓŒCjTBCj¶LCjÌ’Cj¿xCk,VCj Cj´ZCj²BCh–tCiòÈCh4Ci(Cf/xCdNCf,âCd}CbìÜC^ÍC]~ÚC^ŒÐC]ç€C^¿CdpFCd4ŒCdðCc)ÀCc/Cj­RCjXFCh¦jChÓbChã”CeÙ^Cd~†Cd[°CdV¶Cd˜CZÝèC\\ÞCZµFC\“hC\¾C]„CbnÒC_ïæC`~C^ÀRC^ÛÐC_¡HCXüCYÐCX,vCX¼ˆCYàZC`ÅdC`ËôCa C`ÐôCaºCj¥ÀCj‚œCjŸVCkâCk2(Cp» Coç Co¨CpFCp&þCZc˜C[YZCZOZC[PCYÍCfIlCf¨*Cg=ÌCgéCgÝ6CqàCo¡æCpîCqYŠCpj†CqôCpÒCq‘0Cq«"CpQæCfÄÆCe˶Ce£dCe’œCeódCigCiO¤Ch¹ØCgå(Chj^Cl”Clâ2Cm4xCmNCmÊCj{ªCj3ÞCi¾CjsúCjšxCcIœCe´CcÚCc&CdcChÈCh–~Ch³2CgœâChqòCfœvCf[NCg²bCg1ÜCf˜0CfòCfž†CfCrCeþCdâ C^>°C_fC^åLC_72C^ÙÖCdŽCdÖHCdý4CeæCeTØCfwCeï*CeK\CeòCdøCf"”Cd+FCd|CcqCb‹zC[C²C\^ZC]TC\ÙÒC\_Ca'*Ca˜Cb^ÌCaNCaôCdß"CeÕbCe™(Ce)ÜCeù¨CfØ–CfÌ–CeµjCe¿CYôCYäCYõ.CYêàCZÆ$C\&®C\C[JjCZÖ’C[¿´C_‚þC`ó6C_¡ÊC_Â$Ca#BCa¬C`iòC`àªC`ØhC`!(CXÖ,CYytCXÆÐCY"äCX€C\ÅâC\—,C[bHC[ZðC\ÄCbÊ–Ca¤bCaßC`¤¨Ca»¢CdHCc«øCcÙTCcÙŽCd-LCYͰCYG4CXÒ–CXŽCXž’C\þC\Ð`C\mvC\{xC\ÔäCaR¼Cb% CbpŒCbJøCc‘˜Cc§ÔCc«ÜCdܾCd©˜CeùôChx–Ch?„ChÐ0Cg>:Ch±nCiS4CiÂ(Ci^Ch‡äChŽªCf^ªCeM"CdóŒCdƒèCdÅvCd×"CcÀhCbôÆCbbC€|œCÞ§C€fC€j¸C•¢C€ÚCµCqìCíÛC-êCšÚC~»ìCõ C|^îC|"C}ÁC}¥’C|—DC€ZCÌC|hC€-¦C~º C~‹ C}A&C~ZhC}ž¦C}Ø C€ ²CÙšC¡¶C~¤ôC~VC|tNC|ülC|†pC|(êC{ÎC|¸xC|ëüC}'C}—BC}WÄC~¯vC|ÊC}ÖC~hC}dC}j0C|¹¾C~C}ÚÆC|òæC|‹C{_~C{\2C{­ÜC} ’C|åXC|m€C~".C}6úC|íVC~´æC}ì‚C~¶C~”FC|úâCæšC}ÑžC'.C~¶bC~aÖC}"C}IÂC}ÚC}˜öC~3fC}†,C|ÄÂC|Œ¾C}DC~.€C~w C}ÑRC}ãîC~ C}ÓC~#„C tC~ÀÖC~fC}OÒC}dRC<¼C~-C~³àC}ÀºC}`C}¼C}œîC~8lC|¼*C}°ÀC}ÔdCo¬CIxC~¾æC~6´C€C*âC~tCSPC~!C}[nC}™C*hC~AjC}M¾C|äÒC|K\C}ãºC|ãrC~ÔlC}þˆCÞC}`ÒC}óèCˆZC|C}è¶C~×âC~öBC{ÓvC}!,C}$C{«âC|ç‚C|KnC|ôC}¡>C|ú8C}_ÆC}äC~A C}hHC}¹&C|RC~ˆC}íºC}§êC}°C}lºC}sšC|t®C|QRC{æ C}mÚC~…êC~<ðC~Cµ¢C€CãðCyCJC€™ŒC€Ì¤C€ÈC ZC€„8C€ÿ²C€üPC€ôC±PC²¸CA´Cï†C JC€ì"C¤CˆjC€{C€ŠÀC€…ˆC–ÎC6„C€ÜdC€f¾C€LC€Ç"C€60C€#fC€9\C€xC…rCĘC~å¦C€S`CÞèC~j‚C€ENC€8C€dXC€ŽXCÀdC€£HC€=xC èC€ž~C€ LCIzC€í*C€;ÄC€ÃÔC€!„C~”NC€ Cv CóÆC‹ŽCjC~•¨C~ ªCi¦CüCCà8CW¦C~DvC0ˆC€vC€RœC€W2C€rC€SÐC€ôC€I"C€±VCÏáC€¨C `C~Á€C~kVC/ÈC}ü¤C~~LC~À"C€CcºCm†CŠþC0¼C…¤C~Ü&C\CX&ClC€2üCï¹C€$ØC€©BC€~€C½C.ÐC€jØC€l0C€FC€¶²C~ÊC~ïtC€¬Cv€C~YˆCÈHCL˜CƒC€ZC€SžC€¦FCÛ¼C€g¤Cî\C€`C€ØNC€ä’C€”C€ô–C€ èCšCT C}ðnC~N–CxC€$C/ŠCGØC' C¦ C€%xC€+ CFŒC€//C~¶žC€®ŽC PC€UzC€sÜC€µÄC¶¬CâxC€[fC€1ÈC€1TCq˜C~¸ÀC~$CÏÂC~CdC TCËC»üC}ýüC}ù\C€¼C€]ÀC¿`C€×ÞC€C€?¶C€_TC€>C€+âC€föC€í C€Z˜C&C€Y:C€ÄœC4C~Û¢C~ß C~Õ|C TC€_žC€’¦C€›&C€ÚBC€›lC€ÿêC€«¢C€”¸C€ÔC€&C€!ÀCûãC€¼’C©©C€“C€vC€G*CÝÅC€hÚC€ðlC€ttC€"C€ÍÌCdhC€zC€gŒC€Ž†C€8C1ØC®¾C~±>Cð^C€õC€ßC€[¤C¦wC¬C€(xC€ú„CìC€ùBC€C€FÎC‘ÒC”C“nC(CP˜C~MÀCM&C&C~ C‰C2æC/|C€š C€©êC€Ï®C€¢\CæC€§6C!C€´CvÎC€ñC«C€ÈC€î`C~L²C€ wC~ßêC øC¾PCÄC€V\C€»¾C€|C€ŽC€ž¾C€}TC C€– CB>C€äÆC–êC€ÐCjCcC€4ŒC€ß6C€+xC€CÿGCLC"C€ÎÂCNC€áôC¯òC€â¬C‘‚C€íèCÌC¼jCºxC€þhCàC€åC‰xCìC¡ÂCXCmÚC€k C€®C€°pC€ÃâC€×¶C‰hC€Š2C€‰hC€pC€øèC„C€œæC€ˆ@C€¸tC=2C€®øC€y¶C€yHC€È”C€¸ÎC€¢DCLC€ÃŠC€®ŒC€0ºC€ªœC€Í‚C€DtC€¹ÀCÔC~“FCúêCÿòC~¤6C~‹JCÖCïâC€0C{˜C-nC€Ú€C€ŸöC€J8C€Ÿ8C€RpC€cC€>‚C€ùNC€!„CW”CÔ>CxC€+\C€ C±¬C?TC:’C6ŒC0|C–C~$ôC~³C€ ½C~­^Cf@C~-hC~‘–C~oäC~Ê®C~ßrC~¢\C4êC€ÖC~ÀàCC€MØC~Y$C~¥>C}«C}¥NC}eHC}ùèC…HCbC~ŒlCzÚC ‚Ch°C€|fC€{¦C+fC€"C€4C€*C€”†C€WÒC}ŒCÈC}¨JC~kdC~ÀCyÎC€)RC€„¼C€lÔC€œBC€C~/|C~—,C~É C3CZC~äŒC€[C€!2C€|C€_XC€ðCäCòoC€"C€ŠŽC€šC€.*C~-¢C~)–C~«~C~ÌJC~[,C~²C~CInC“ŒC\ÆC€±¸C€2VC€´’Cê³C€"þC€•”C€9þC€¯C€(C€J¼C~.dC}#üC|ÞC|ňC|éhCOVC~öCS~Cc~C}øbC€¸vC€k†C€”ÀC€`úC€l$C!„C€gÆC€?€C´C€ônC}2C|–¶C{Á(C}Œ2C{¡ØC~ÝØC~e"C~ööC7C~¶C~ûªCŸÔC~¸èC~ÙºC~dòC~$:CŠ C~’„C}æ2C}Å.C|qrC{"ôC{š¶C{'C{FJCB¨CPÖC~¸\C~/\C~ÉÈCÄÌC€3˜C˰CtÀC.C€C€.hC€„þCù®C€<…C|ÿFC}‘C|óªC}íÎC} C€PæCØC€ „C¬˜C€$C€È$C€ÏÀC€û"C€1ZC€\C€hC€\ÔC€ÎC€tC€2C~B(CNC}ÏüCC}Ö C€2CoC€2ZC0C€ÞCªC~Ô:CKîC~-`C~;VC}<C~_ÞC}„bC~9C}FC{ÄžC{ñBCz‹ZCzÈCr‘RCqÍCu[ðCvClzCmIêCg-6CfBHCgO†CgÃCg‘ÂChçCjLÒCh³¢Cj7ÐCià®CoŸJCnÅ"CnvCn]*CmÒøCsÈÈCsaàCqÚ6CqŽhCq ˆCqù"CqýVCrAðCqç˜Cq­öCvˆFCwâCuãúCuvœCv¸:Cu xCuÞNCu6Ct¦Ct¹îCrŒCrCrìbCqÇðCq•ôCt|CtHCsÐðCs¨àCsìzCtCsHÚCrêCrCs>"CtfCuECuÇêCtøZCutCu‰„CtZ‚CsR*CskjCrå¨CsæÈCq(ŠCqòœCpò~CqsæCqh`Cp$äCp>LCqBÖCp BCo*&CmžÚClš¸Cm½bCmYhCmræCo†ÎCoÍfCnĦCoYtCoZCoH"Cn LCo£ÌCn±Cn¨0Co”2CmÃ`CoCmó¶Cmâ6Cj¥^Cj}Ci¼LCjrBCjCjà@CiýæCjÅâCi7êCi»CiÐÀCjB`CiøøCj˜¤CjðÞCj1–CjØ€ChöÒCiÕˆCh¡žCc€|Cc¶ Cdß”Cdæ¢Cc8BCe™¢Cd3VCeLCd—PCc¾ CmôCmbØCl¾Cl¢ Cl;rClGCZH6C[«ÈCY„¬CXºâCX…BCXìÒCX6ÔCR@CPÛCPµXCPÙ0CQåJCX³2CWÇCW8ÔCXS"CW͈CU"¨CUˆrCTÝCU\ÄCTj\CPdPCPĘCOÝ®CPËÆCQÔCRa~CRO:CP¸tCQCQÊCWCWù:CV¹ŠCVU¦CWæCWrCW¥LCY# CX®ÀCXT$CQ êCRntCQV¦CR]vCRŽjCU@CV£pCVq¾CVÖlCWZðC_4úC_$ˆC]²ðC^ZC^²tCb¨Ca¸4C` C_fpC_žÔCTí†CUñ¼CUCTÒ´CVaCWwPCXCWY²CWK¤CWXvCa rC`Ü"C` ˆC_ËîCa`Cb,ìCc`¢Cb=Cb+ŒCažjCb%"CcCbNfCbÒÖCbíHCc8þCczCc£Cc>Cd‚Cd¶~Cd°ˆCeÌšCeöüCdFÖCbîÄCbDCb¶Cb0CaÿäCdÛjCd}èCdÄÜCdÁæCeuCe`6CeèRCe9¬Ce&0CdËþCf´Cg_BChS†Cg†Cg›ÐCfâ¬CfÑîCgôúCg,Chð6CblCbòCbÜCa¿FCb¦Cg7šCgõ¨CgK CgVCgÒChröCh¾CiäCi/CiäCgAdCg/$CgÓxCgzzChöÒC_¤ C^^C]¼C_1ÌC_ŸêCe_pCdtºCdrCdø€Ce™XCmHPClиCk¶|Cl`:CkÖTCpù¤CpópCp¯ÊCp_6Cn?nCl|ÖCl@ÒCkožCkX´CkóÎCzëC{íæC{ϤC{…jCz ˆC|+$C|9ªC}1hC|Ó C|ú6C~øC~, C|¥|C}ÔC}LâCoϺCp.²Co@ŠCp1‚Co8´C{)ˆCzÊ C{$C|d¸C|\ÌC|¨ÆC{ÛàC|œC{9°C|ß0C}φC|ÚÈC|ãvC|pÞC{C`'ÆC`yøC_C_ƒºC`ª’CmªâCn†CmN®Cm"¨ClâCx¡†CwôàCxžâCxo~Cw­|CxÉCxEþCwºCxxCv™ªCe Cd#âCd¬¶CdRCd’CrùFCs~ÚCs3xCr(¢CržCy7&Cx>ZCwêöCwÁ¸Cx£ÌCy*CxˆCy„Cw(TCwGCeŽ~Cd©HCeHvCe´˜CeîâCrÀCpñtCrÖnCq³NCr¹¨CuV`Cu úCv*CvECunJCxbFCxµŒCx´CvoÞCvÊDCiÐÂCj¹˜CjÀChë\ChòÂCrôxCsÌCrv|Cs Cr¡jCtàŠCudCs2šCs¦"Cs]ìCqÒ(CpÚCp”¾CozCo$ÈCgÊDCfâLCfàŽCh~ ChHÈClXtCm$ÔCl×®Cm.èCl]˜Cmà†Cm5ÞClÅÜCmÝæCmÌCn{Co~ÎCnÞCmËàCojC_‹ìC^ö¶C_!îC^‘C^UâCd˜dCeDCddvCc€˜Cd…BCe*:CeVþCffôCfŒDCea Ce¶ðCfrCgCf…”CeÛÚCXnCY ÀCX;jCY øCWSÊC[&¾CZëüCY©nCZ;C["0CbM–Ca9¤Caè°C`w€C_sLCj·CkYCi¿&Cié4Ci¢CQBCO?”CPÎCO¢COÅ®C[hCY¦¾CZ;ÐCY~XCZ úCbÒèCb`†Cc˜ÎCc"Cc:ŠCl6ìCkn¦CjNHCi(œCi–fCZâC[AäC[ÍDC\ašCZþüCZ·øC[Ë2C[•(C[½ºC[›ÚC_E¦C_CVûNCX-êCWhjCVŸèC\hC\øúC\öÀC[´C[ÿúC],øC]zhC\UC\M2C[:„CRT–CR?hCQö>CP´ôCPƒRCXÁCX„äCW}CWåžCXhC\§˜C[DCZï„C\gC[›xC]%ÞC\ýrC]qÊC[ÎC[y–CVCU8|CUCTãHCTÒCW?CVACV[îCVLüCV CZ]fCY$˜CZm^CZRCXíVC[ô^C]±Ctð„CuœöCtÉÌCsÅ6CtÆÐCu1NCaŽ,Cb@êCbúvCb¸0CbUvCh ¬Cf‘:CfeCf@(Cfd„CiŪCiø|Ch³¦ChãChVChí*Ci½,CjžCi1¦Ch–ÞC\>.C[ ‚C[û¸C\RðC\„CcÂÞCdÍØCc™®CcZZCcn\Cj®CjÄ6Cj¸CjFCiòÜCk>Cjö¢CiÖNCjßXCj–pC]NÚC\™¤C\´C]à(C]! Cc|ÔCd“ðCd CdŠøCdøìCiEÈChˆôChàôChÃlCj¤HCjø$CiÃØCj œCj5èCjf²C\C\ÁVC[òLC[àÖC\–ÈC\¬ØC]õ²C]8C^^ÀC_zÞCaH Ca¶fCa+þCaACbêCbm Cb>CbÁCbÚZCbPôCU>NCUÎÔCV::CUCU§îC]”ÐC](þC\l¬C]©rC]·NCa=–CaÉæCaTjCbgtCasCbº4CcVCc"6Cbî®Cb´:CT¯\CUÑLCUp€CVQ¶CVÔC]lC\ ÆC\‹rC\ÊzC]¼€C_¸vC_anC`Œ>C_ÑÄC`»RCaFC`À|Ca°˜C`ˆÐC`•ØCnCn‘æCnB¨Co„Cn{èCowÎCo×lCojÜCn\ÖCn¤ChÒfChžCfòjCfò¾CgH Cd 8Cb8Cb›nCch6CbMCoø(CqªCqšCp Cq'JCqºîCq©0Cr™CqðÚCp©"CjƒRCjàCj¼$CjÉôCj´CegŒCdh Cd¥CeR˜CdlˆCn?ÒCmhCnIØCmßFCm˜@Cká¼ClêCm7æCmP’ClÏ’Cf°°Cfu^Cg~îCfìCg‚œCfdÈCfKÚCe*ÂCeœ6CfÒC`(C`@XC_K&C`{C_qLCbÕBCb†ðCbuòCbðCbÎØCd`0Cd0Ce“¦Ce(¨CdÎCdžCc¨ŽCcÎúCc€CbÈ\CtPRCrÑèCtBœCsíÀCsP‚CzžhCzËlCyélCy ¬Cy…PCnîCmþCmœ Co;Cm²„Cm(CmÅhCm:^Cm·ØCk¾°Ck3XCk¼^ClM@CløPCk`ŠCw[þCv¾CxzÊCw_ÌCvéúCm/Cn&ÄCm<CmònCn>Cn’CnðôCnB`ClïNCm±FCfSœCe–øCdí\CfE4Ce|zCe¹ÀCe×âCezCeHCeW®Ceæ¸Ce«œCdãCd½ÎCeCeSúCcûCcÚ¼Cd+@Cc£0ChüCgYLCh*Cg+ÔCgÃCgŒ¼Ci "ChŽrCiXØC\@ÆC\~ìC\ C[’HC[²C^‰òC^ÒC_C_x¨C_ùfC]Ó&C]”èC^˜C] C]ãCUÚúCU—|CWCpõîCqYöCpÅZCoðnCpüCoç’CpÂCnÞ¼CmÄ&Cmµ€Cne¢Cm*Cr,fCqkÈCq,®Cq(lCqtCq‰CqHCq.Cp÷ CqCg6HC^$C_5¼C^¬XC^C^K`CeH¤CeÓªCdÃ4Cd¥†CcìðCjS~Cj=VCiFþCj%†Ch˜üCpîÎCp¸Co ØCmüCmA’CX½TCY”CY2CX´¤CX ŠCb:úCbˆêCaÂHCb*¦CaáˆCf>”Cg€RCeœ CfÓ’Cfe|Cm0Ck²úCj•dCjé>Ciï^CYmÔCX¶Ch‡æCp•âCoÚCoŒêCp6ŒCpPCq°œCrlbCrÒªCqÆúCpí\Cp¢”Co/tCoÿ&Cn­|CnJCn°¦Cn”ClÝàCl•ðCk¬üCq±ÌCp“Cq ¶CpTÄCq&jCqï¾CrœCqøCpßvCqCoôâCo«¶Coh CmäÂCn¿”ClØCjZØCiü8CjŠCgÕ¤CiECjÎzCitCjLXCia–Cl}ÞCl³²Cj¼®Ckn|Cj´Ci’Ci†^ChÇ"ChjdCgqTCi ÒChVŒCh±ChˆCgÿvCb´Ca–Cb¿(Ca°rCa CjxÀCjföCi¦Ch*ÚCipÖChÛ¦ChœnCgÓdChd*Ch€ÖCj#ìCišCh”CgXHCg ŒCj‡¸CiçCißBCi¬CkÊCiþŽCim@CiiCi1üCjƒÆCi=CgŒ¨CiNàCgÎöCg÷JCgñÚCd“:Ce‹TCdÖ Cd0Ccq0CcWCb2ŽCdúCcèØCb hChȰCgÿäCh™NCgª–CgÔPCh¦CgäºCgqCh%ÂCg‘lCd5òCd„TCe¼CeÓ6Cd†€C]àhC]ÿ¬C_8C^zÈC_·:C`ÀC_¥vC_í*C`çhC_´fC`»°C`ÓjCaZÈCaÚÜC`mRC]s‚C[x|C[B¦C\øC\r®C]SÄC]i¦C]ŸžC]{òC]üŒCZ™êCX¤CXCXxCWò|CW„CX>CW„„CV÷XCWý¸CY¸CY¥RCYtCY.BCXÒC]1~C]IøC\žÐC\éÎC\ñtCWʘCW[ CU¬„CWI>CU CV‚®CV¬†CU1(CU6œCU)°CVtCTðÈCU»žCV7@CVfCYóºCX4’CYQ*CYz”CY CW¨PCWH’CWWCVzÎC\¤„C]=ÜCO¼ÔCPÄ(COšŠCPKCOåºCW"XCW¸ŒCW*CVf²CWnC[‹C\¢øC\ºC[QîC[rC_øØC_»¼C_¼®C_j¶C^CLúNCLg4CMOÂCMX.CLËpCP¹ CPJ8CQ”CQY¤CP\øCYýÔCYÛ¢CY&,CX}þCYˆ|C[6ðC[ˆ´C[âC[¾@C[9BCK9ÞCKHCKvnCK%CK¨CK$ CKÒnCJ½ŽCJ•þCJ?vCOFÂCNådCN¾\CMBCMΪCNœ°CNb˜CMp^CN]ÆCN?\CMîCL¸^CMï˜CMó¢CMÔªCSÐÚCSÞCT7ˆCT?èCT&DCYÈ|CZ þCYÆzCXý®CWúPCZu‚CX·’CZØCXµæCWíüCQŒ8CQìCPXºCQlCOè|CZ2jCXùCUdhCT©þCT±RCSõÊCZxC[^LC[„,C[!°CZa’C[™°CZ¶>CZ¯ÄC\'¢C[ë˜CióºCjeCiChÜFCh lCn$Cn4ØCn¡hCmCŽCmÄ,Cg®6CiòCgy\Cg#¶Cg¶ðCd2CcPCcf(CaQÂCb^ÌCnbCmÁ,Cn?¨Cn©>Cm,’CukªCvCK~^CL9ÆCLD:CLxVCP øCO&šCO;ŒCOðjCO×@CVJCWñÌCWݨCWéôCVUüC^¬ÂC^ûHC]ÆîC^ŸpC^ÉCLÍÆCKºCKĶCL&HCKçCMµ€CMCN/ŠCLNäCMÂCVkPCWgdCVœCXvCXEŠCc‡&CchèCdûŒCeèCd“NCHÌÌCH¶òCGê¼CH§ÊCIêCUà&CUÁ:CSí¸CU_ÞCT5˜C]…ÒC]‘vC\C[¿þC\—¼C_XC^ÂC`BœC_MÄC_« CJÒ°CKõfCJ÷vCK°rCKîÒCY€–CR&ÜCQÊÊCSލCS˜XCSìCRv–CR¡‚CR)8CSålCQÅVCRÿCR†ÂCQïÖCQ‚€CQ4hCQ¬úCQsøCQ-LCPäÞCWMjCVóPCW ²CUE¨CU|rCX‰CW”–CV€RCVmÊCUÃHCS÷`CR„ÊCSÞCS1vCQÊC\cæC\Œ\C[Q¨C\&C\Ê”C`(ŽC`9ÆC^ý¶C^’jC_˜ŒC\øhC\¯2C\‚C[ÏrC[²ŒCX<CWåªCWS`CXFCVôLC]:¢C\0C]WC\èC\1.C`uC_ëôC^ŽC_Ž´C^>C[ÛºC[ñÎC\6üCZíC[Ñ®CZ¶C[|CYw¶CZ<ìCY¦CTÊCVJCUCUsCT×$CU^ CS›òCU|CT:CSÚnCY,CX¬ÚCX.|CXOÜCX¾ÐCY£ÄCX±CYüjCX¸CY¿ÐCT_BCSdþCSz4CR›þCTàCW¢ÂCWzžCX3TCX"\CVþCXzfCVp†CUü¸CW.rCVCWnÜCUœCT«CSÁèCS„ CW“CXÄúCXñ CXaPCWÅöCazÊCbwÚCaŽ&CbMCQè0C]6TC^"vC^¸C^`àC`'°Cl¢ClzCk„2Ck¨vCk§RCkt†CkòCi6€CjŠ"CiS\CPñÂCPÿHCRE€CPÔîCPîâCWÜ^CXªøCXýŒCYöCYZªC[ªCZÓòCZÄ.CYrîCZøüCY­”CZBúCZÁ>CYCY×èCN2JCN“îCOW¸CN¥²CNwžCO¼ðCPÕ¶COä´CP6CNÜàCU-nCSµ CTL@CS2ŒCRÚÖCS×nCSÜCSX\CRåXCS-zCJYNCKgÌCJ%èCK^¾CJ©¶CM3®CMÔCMtæCNh²CMéŽCSÍlCR­8CR´ŒCRv–CRÆ CS ˜CS»‚CQö^CQë”CQÙºCL/LCLD¾CKoœCJ¹ CK¥þCQ9@CPºCPE¨CP¾`CO?^CUt¶CV CTæ²CU@¤CUJvCWÝÔCWÐRCW>ÊCV|CUüCJ¬ŠCK³ŽCJü„CLzCJ‡˜CMÜZCNËšCN±ÞCL³ÚCMÐCWµxCWxCW{CVN CWC^å–C_ÈÈC^v„C_ñhC]öÊCKúîCL"òCKC”CLGhCLQòCO}ÚCNl&COdtCOÌ¢CNN¸C\CP•lCP­pCOÞ‚CP«ŒC]JØC\ñC]'ìC^1¶C\ÃhC_µ6C`y C_VC_†bC_•ÐCQéêCQÅlCRê^CRtœCRnÖCQ>ôCPÿ`CRA–CQüCQ1ØCWQ(CVáRCU0âCUÖCUФCUîCWB*CVIpCWWCV¹CXÞ’CYÔjCY!œCXåŽCY¤CYž–CY”.CXüpCX\ CXèŠCXrPCXBCVm8CVã6CVÆHCU´ÜCT}CTlCP¨CPúCPCNÂCRWCSRCRg|CQdäCQÝtCJEÎCJ!LCIaªCI–CJG°CGqœCG…êCH5LCHsfCH ¾CJÑÈCK.ÂCJTCKX0CJçvCMd@CM'nCK—"CMCMÂCM˜‚CMñnCM£†CLËâCL‡PCHVCJJ^CIÈCIêÀCHˆTCM^ØCLz¼CMXCLÃXCM[ÊCH©`CH°CHìîCG§LCI_öCY,TCX˜RCXÉCXަCX˜ÜC\§,C\•@C[ÁÜC[mVC\ËìC[ôlC]2C[ C\ÎüC\0C\êˆC\:ÖCYß:CZLCYxØC_4DC`E€C`‘ôC_5rC`"úCg^vCg?”CeÎrCe/êCflCf‚äCdÎCc*>CbœCaÛFCb¿.CcOâCbÅšCaÂC`Ì C\}®C\âPC\]ôC\¦®C]}fCbǰCb2ÆCcëCc#¦CbäðCb·¦CdCcžäCb6>CaoCeÎCedþCe§°Cd™~Cd“PC[@xC[H¢C[>ÚC[plC[®C`ðC`U:C`€êC^ÍÞC_£ChbCeïÔCgŸCpfCoCptCp24CnɼCoÉèCm÷"Cn‚ºCm’ÊCm@pCkKÐCkððCnNCnºCmðšClçœCn5ÈCnÃÜCnÙ€Cnk’CnO~CmňCmœCm€rCm4>ClΠCl‡zCkxÖCjè®Cj”RCi÷BCkZ€CgX4Cg- CgäÖChÄCg‘CkÜ~Cjy&Cjú–Ck!Ck,CjÜ:Cj+ÈCkªÌCj6ÀCjrCk ÚCiW¾Cj­òCjšCi,C^;òCW±€CWb¸CWLNCX æCWë4C_¶^C_²C_tC_ÑÄC`o,CbWCbĆCbqþCb'fCbâÜC`_nC`À>C_q.C_ŸøC`Y2CU©ÄCVƒhCU¾JCV)ªCVdCU®ÒCU­CVÞ~CV CTêŽC[kXC[äC[ÙCY»lCZgCZêÚCZ¢hCZÁrC[p4C[CQöÒCR‘CRRŠCQ²œCSj´CV=ŽCVÊ‚CU½ÜCV6¶CVêC[_„CZ1ÄCZãºCYBèCY²tC[jCZÕòCYJêCYÒCXºCRÃÞCRCSIŠCSvCRv$CSÚCSÈÞCT(CSQ.CT½´CU¡ÖCUE|CUÉrCU°lCSȲCW+JCVKCV¢ØCTÀ"CT¢¾CR¡:CRsîCS«ØCR$0CQº"CS;´CTÜCTfCSWVCSY´CWí€CWÆTCV¾CVãžCU”VCXõCW‹àCVm*CVT,CUëCQ<²CPNCO¶¢CPÑCPýŠCT‚VCT'TCTwêCUfPCTc˜C[.C[Þ®CZ‚ÐC[©úCZSpCZù@C\`CYðCYsøCZO CVW®CWA¼CV CV}ìCW C[ŠîC[€œCZƒžC[FCZ¿–C_® C_GèC]ÆNC_ C]”tCbÑ C`ÛÄC`ÿtC_xÒC^óÊCY.CY"ÀCZK@CY?ZCXÓÄC`y¬C_"ðC_úC^ C_¾Cb8Cb›–CaŠDCbô¤Cb¶Cc…NCcz8Cc‘ÆCa̲C`¾ÜCXéìCXèDCYqBCYøZCYeLC` ¤C_ÒC^rNC^†ÄC^·ìCa´ÊCbo~Cb­°Cb`2Ca¨Ca¨ºCb`^C`òC`ÓbC`"âCWHöCWÛÖCW~”CXUðCX ’C]šJC^a@C^ øC_*`C^s2CaìFCaÚCasÞCa¢Ca4NCbDCaùàC`üªCaAC`¾CR#èCQ×NCQAxCQÖCQÛòCU¢¼CU^žCVYšCVL CVðCZ(CZ dCYojCZ TCYäˆCZgäCZ¾²CYZHCXExCXÆXCWë`CWúØCWÃZCXnCWðàCQiTCP€ CQ[lCPÔ2CQ8hCV÷2CX“CQ8àCPÍCQTCQâ&CS‡tCS´CS`|CRÉCYå|CXß@CYÀòCZîCYn.CW×¾CWò¦CVÃCW°CWï(CZÈ&CY9ºCZ3~CYB’CZ»žC`Á¸C`ï¼C`!ôC`æêC`’C_ôºC_‘RC_å,C_¨jC^Í"C[F€CYá*CZ46CZ4CY§>Cb7 CcbCbÏ€CbƒCaý¼CeŽ:CeàØCdI¦Cd0ŽCd›Cb*CbªDCbK0CbröCbaÊC^*|C^j0C^›JC\|†C[C`ÓlCaòäCbvC`ßCaÆÔCdÔCc»BCcAŠCc¢>CbžNCaðØCa7LCaž CaÒC`¨ØCbœCdÔZCa0C`ŠC`šöC^7*C^)ÖC]ÂC]TC^ ¼C`œCa.ÒCaòÔC`£ªCa&0Cae~CaðCbbÐC`ÛðC`Ò¨C`!VC`ÀCaàCaÊCa((C^C^¡rC^Þ¾C^3ŽC^jC`*~C`„C^ªìC_ôHC_°°C]×üC\ýC\è¶C]£ÐC]JªC[IjC[ÜìCZ=fCZJCZ0¼C[ó†C\Y|C[‘@C\ŽÔC\6pC^bPC^J^C]£òC]¤C^~2C]ì˜C]Ö"C\DFC\`zC[ÿ†C[äC[CZuCZˆ°CZtLCZÃæC\N:C[×CZ©xCZ°TC`•ÂC`IvC_ÕJC_(¸C_:(CaªCb`RCaÀC` >C`:ŠCbš¤Cb'¼C`ä¦Ca)šC_ÝC^Á†ChÕÐCh .Cj#ÐCjñ¼Cj2.Ck)´Cj ÌCir¦Ci©ˆCiÕChâChB\Ch¬ÒCfë4CgÇCg>’Cg~ŠCeÛvCeLCe/bCer~Cdî:Cj:xCi×´CjlŒCjwÂChÄþCgýòCi{"ChæøCi&Chý CiÕChzªCiÕtCiPChJ*CháFCi¯ÚCi¯ŽCh¤Ch¦ZCkÒ(Cki^CkClŽ~Cl' Clb.CjúJCksŒCjÕ>CkxÆCl&ÀCk^Cj~ÐCi~”Ciå´CiÚCiõZCiÊCiОCi‡öClèCkØCjXøCjr¾CjDÜCjƒÎCi CioîCj›`CjÐCfúlCg'CfäêCfCfjCe¥~CeK°Cd?lCe‚CdÊœC`ýjCb”Cb·Cb#|CaDöCc/ÐCcÐrCbŽ^CcCb€~C`³¨C`˜†CaM²Ca6–C`dCcTØCc¾Cb Cc¡Cc`äCYZðCZ¯–CZ»†CZhlCZC_tC_‚„C_9†C_äFC_T$C`ùŒC_ÙÊC`eŽC`®¤C_¨CbA´Cb+CbÕÈCb’FCc 2C\êC\ C[lbCZôÈC[ƒîC^†ìC]ù‚C]·ÊC_OØC_[CbZCabøCb=Ca>CbsºC[uìC]ðC\ÍNC[ýòC[E*CbÁJCc\ðCcô¤Cc²CcA˜Ch ChFCg‹`CfãCfÒ*Cff¨CeôôCfÀ®CaéøCa›Cb]¬Ca’0Caª¬CgnCgyPCfdCg§hCf84Cg°dCg*¾CgB˜CgÙ|Ch-`CgŒCg!xCgoZCfø Cg)žC`Ï@C_†ŠC`èC`'àC_vRCeCŠCd6ÊCc‘.Cd2CdðøCbù`Cbì"Cc§èCd7ÄCc†ðCbCc=èCcœ¸CcHCaªÐCY‰îCZ¹tCYȆCY¯ CY߬C\H´C\£:C\Ó¢C\§¶C\pC]k(C]ˆ€C^ C]ÈnC\»¸C_ÓVC]ðPC^…ÜC\ìüC^W¼CW¼RCWŠCVòCVC`òØC`ƒ6C_˜ÂC_÷ÔC`œC`C`gC`ß`CVÀÜCWª4CVÒCVž CWx€CZËJC[‚HC\ZhC\¬C[­ C^êvC_†fC`¬ÜC_ù²C`ôlC_%C_=$C_Q`C_žìC`g’CT9DCSÕ|CTšCT*¢CUªCX+fCXkòCWú¾CX\DCX’ÚCZèúCZÚŠC[²C[C[ÜC\˲C\ÂC\ã`C]€VC]2&CW1tCXµ$CXô°CW9CW~8CU]ÖCUÊCTóhCUë`CUnªCY°‚CY¤ CZWºCZµ@CY… C\ÞšC]\îC]¶VC[ÏFC\ôCYi"CY,âCXo*CYiPCXÄXCW¦CXvCX¦ÐCWûÔCXZèC[ºXCZÔÒC\,CZknCZZ„C]j C^ù’C_C^³’C]'0CXs¾CVÍîCWµŠCWÛ|CX1BCWŠCX_’CWQDCW(:CVʶCZó@C[ÙêC\$ÈC[³ C\sœC^‘¾C^opC]qšC]NÎC]†úC``C`¹HC`)HC`èPC_«¸C_ÑÒC_j€C`f¸C_N"C_‹"C^šC^#C]‘ÄC^"¤C^ ŽC]¯šC]­†C_ zC]ZC]/vC`SC_xC_¶âC_ÿÚC_õìC_ÙDC_¨®C^Ý,C_½C_¢&C^°RC_UC^½,C]˜úC^4C_ C^tC_.®C^Ô´C^²ÊC[(ŠC\œC\k\C[G†C\Ñ"C\±¤C[À>C\žpC]m4C]°^C`k„Caä*CaqvCaÖÚCcVtC`CaÁ>CbðCbi CbHC\dPC[ú4C[<¾CZ¬Clõ4CkÖCiQÀCi‚LCioìCh@ÄCiöCn™Cm܆Cn8CnX2Csš®Cs :Cs“vCs6HCsíCs†ôCqÜâCs ÔCsCqzCq¬ÒCq¾Cq)šCq24Cpv6Cp8šCqÇCpÄ‚CpÊÆCq'Cuv„Cu'ÔCt(CsÌàCtoüCv,¦Cvj^Cv›&Cu`FCu“üCyO CxrCx?BCy6Cx'&CxrRCwxÂCw.Cw ¶CxIÈC|]ZC{ý6C{£¶C{xC{5pC{9RC|ÛC|¹C{ÌNCzÝC{-xC{DC{zC{þÒCzCz§âCzNÖC{Ö–C{WˆC{\C|DÒCz¶†C|µÆC|ÕC|¦dC{¢>C|«HCz¢ C{BC{ÁˆCzú@CzeþCz~lC|˜Cz×ÚCyÂdC{bC{ÒtC|RCzèÜC{´˜C|šC|Õ0C}'4C}.6C~º C}.šC|˜8C{@®C{+ÞCzü>CzË|CzÐCzšÒCz"‚Cyà C{i|CzJ²CzŽ:Cz8¢CzÈC{Czè‚CzŽ˜CzêC{|úC{ZpC|ðC{ž˜¿Ü(ô@¿ì(õ¿õ·ð¿ü(õ`À™™hÀ¸ À£ÖØÀ (õÀ®HÀ™™€À\(ÜÀ¸8ÀáG”À£ÖðÀffLÀ(õ¨Àë…À®`À ¸QÞÀ!™™ŒÀ"zá:À#\(èÀ$=p–À%¸DÀ%ÿÿòÀ&áG À'ÂNÀ(£ÖüÀ)…ªÀ*ffXÀ+G®À,(õ´À- =bÀ-ë…À.Ì̾À/®lÀ0G® À0¸QäÀ1(õ»À1™™’À2 =iÀ2zá@À2ë…À3\(îÀ3ÌÌÅÀ4=pœÀ4®sÀ5¸JÀ5\!À5ÿÿøÀ6p£ÏÀ6áG¦À7Që}À7ÂTÀ833+À8£×À4€À4Qì=€À4Qì=€À3áHf€À3áHf€À3p¤€À3p¤€À3¸€À3¸€À2\á€À2\á€À2¹ €À2¹ €À1®3€À1®3€À1=q\€À1=q\€À0ÌÍ…€À0ÌÍ…€À0\)®€À0\)®€À/× ¯À/× ¯À.õÄÀ.õÄÀ.|SÀ.|SÀ-34¥À-34¥À,Qì÷À,Qì÷À+p¥IÀ+p¥IÀ*]›À*]›À)®íÀ)®íÀ(ÌÎ?À(ÌÎ?À'놑À'놑À' >ãÀ' >ãÀ&(÷5À&(÷5À%G¯‡À%G¯‡À$fgÙÀ$fgÙÀ#… +À#… +À"£Ø}À"£Ø}À!ÂÏÀ!ÂÏÀ áI!À áI!À sÀ sÀ=sŠÀ=sŠÀzä.Àzä.À¸TÒÀ¸TÒÀõÅvÀõÅvÀ36À36Àp¦¾Àp¦¾À®bÀ®bÀëˆÀëˆÀ(øªÀ(øªÀ ÌÒœÀ ÌÒœÀ G³äÀ G³äÀ•,À•,À=vtÀ=vt¿ýp¯x¿ýp¯x¿öfr¿öfr¿î¸i0¿î¸i0¿à£îP¿à£îP¿´{›€¿´{›€?× à?× à?陂P?陂P?óÖþ˜?óÖþ˜?úá<?úá<@õ¼¼@õ¼¼@zÛt@zÛt@ÿú,@ÿú,@ …ä@ …ä@ 7œ@ 7œ@G«*@G«*@ :†@ :†@ÌÉâ@ÌÉâ@Y>@Y>@Qèš@Qèš@wö@wö@×R@×R@™–®@™–®@\& @\& @ Z³@ Z³@!p¢a@!p¢a@"Qê@"Qê@#31½@#31½@$yk@$yk@$õÁ@$õÁ@%×Ç@%×Ç@&¸Pu@&¸Pu@'™˜#@'™˜#@(zßÑ@(zßÑ@)\'@)\'@*=o-@*=o-@+¶Û@+¶Û@+ÿþ‰@+ÿþ‰@,áF7@,áF7@-Âå@-Âå@.£Õ“@.£Õ“@/…A@/…A@032w€@032w€@0£ÖN€@0£ÖN€@1z%€@1z%€@1…ü€@1…ü€@1õÁÓ€@1õÁÓ€@2feª€@2feª€@2× €@2× €@3G­X€@3G­X€@3¸Q/€@3¸Q/€@4(õ€@4(õ€@4™˜Ý€@4™˜Ý€@5 <´€@5 <´€@5zà‹€@5zà‹€@5ë„b€@5ë„b€@6\(9€@6\(9€@6ÌÌ€@6ÌÌ€@7=oç€@7=oç€@7®¾€@7®¾€@8·•€@8·•€@8[l€@8[l€@8ÿÿC€@8ÿÿC€@9p£€@9p£€@9áFñ€À4Š>)À4šRÀ3¨ö{À38R¤À2Ç®ÍÀ2W öÀ1ægÀ1uÃHÀ1qÀ0”{šÀ0#×ÃÀ/fgØÀ.… *À-£Ø|À,ÂÎÀ+áI À+rÀ*¹ÄÀ)=rÀ(\*hÀ'zâºÀ&™› À%¸S^À$× °À#õÄÀ#|TÀ"34¦À!QìøÀ p¥JÀ»8À\+ÜÀ™œ€À× $À}ÈÀQîlÀ_ÀÌÏ´À @XÀaøÀ C@À…$ˆÀÐÀzç¿ùëÀ¿òáSP¿ç®+À¿Ó3aÀ?Áë(?âDà?ðQßà?÷\P?þfZÀ@¸L@=jÐ@ ‰ˆ@ G¨@@fc|@(òØ@ë‚4@®@p ì@30H@õ¿¤@¸O@zÞ\@ ¶Ü@ ÿþŠ@!áF8@"Âæ@#£Õ”@$…B@%fdð@&G¬ž@'(ôL@( ;ú@(냨@)ÌËV@*®@+Z²@,p¢`@-Qê@.31¼@/yj@/õÁ@0k„c@0Ü(:@1LÌ@1½oè@2.¿@2ž·–@3[m@3ÿD@3ð£@4aFò@4ÑêÉ@5BŽ @5³2w@6#ÖN@6”z%@7ü@7uÁÓ@7æeª@8W @8Ç­X@98Q/@9¨õ@PÇúq,õn@PÚJkDX2@Pìp9&Ãã@Pþj&Æs@Q6kvm@Q!Ó.À+@Q3>„^¦„@QDvkaÌo@QUxÎæ@QfC…,•…@QvÔO$Ë@Q‡(Ø˾@Q—>´ó [@Q§dÄòA@Q¶¤OÖA@QÅîÇü@QÔð›Ð1@Qã¥6ä@Qò b3Z°@R„®<_@R Þ„ mm@RE2•Í$@R(PP}Ô¦@R4ü]AÏ@RAFŠž@RM*Úõ¨Ã@RX¦ ;ºÉ@Rc´šäï@RnS Ý…²@Rx}Ûˆ!ß@R‚1‹ž³ @R‹j¥i£¥@R”%¾Hn^@Rœ_|„`ç@R¤œcãØ@R«Aõr@R±äì à@R·ùZBÞÓ@R½}Îÿ™@RÂoXKF@RÆË©¦Ô@RÊ­æoc@Rͼ”3>¦@RÐMÍo)@RÒCf¡@RÓ›iÝ„ß@RÔV#ÁÇ@RÔrâð6@RÓñ–8µ@RÒÒÖ{©@RÑ60´@Rν’¼*Ò@RËÉÂøÒ[@RÈ<;–0@RĶù‹@R¿[14‡C@Rº ã‚âo@R´+?eíä@R­»éu]K@R¦À³ý «@RŸ<™~³þ@R—2·-_@RަGv<@R…šœ«@R|×Z~@Rr7ך @Rgžl³©!@R\¸;IV@RQd%Kºl@RE¥©šÖ®@R9€@õé@R,÷[ƒÉ@R [¸ZU@RÈ™±E@R)Yôt@Q÷3ÐDcã@Qèë ­ô@QÚRUÔF§@QËlj ó²@Q¼7¯`”@P©¬¼nÏ£@P–õBoS@P„Bb×–@Pq%N=@P]ùEÞ@PJ·îç£@P7Waˆï€@P#ØÏ ¯Â@P=]'3´@Où Kez˜@OÑhnaãU@P´=¹®O@PÆ11Í¡@PØ)Œ”¼@Péóÿ\1‡@Pû`Mßi@Q üO›ò@Q5ä"ʯ@Q/;!í™Ï@Q@ ùº™Œ@QP H–F½@Q`û×~Q|@Qq[È*@Q€ùse‘@Q–«ÁIl@QŸïz±K@Q¯BŽ@Q½ÉOÈ…@QÌDÚï @QÚq Ö@QèJñÒäT@QõÏõ–@RûÓ…ì»@RÌ<˜¬@R>¾}ì@R(NûM{@R3úÃx@R?<®Ã5 @RJ†ŽÖö@RT{CrÑJ@R^p“Ú@Rgð(@î@Rpö¾‚K@Ry®tN@RŒ##:¤@R‰¼vŽÆ@RöA½ @R–’ü (W@Rœƒ0]û@R¡åÖé‰þ@R¦¸Ï á‘@RªùâËŒÏ@R®§&~@R±¾è½½É@R´?º0À¸@R¶(l®€#@R·x›u@R¸.œ™@R¸J ëÀ@R·Ìè7Ä@R¶´?µŸI@Rµ’"Ô@R²¹Ú&Ö@R¯Ø{KDK@R¬ah…$>@R¨Uàûª“@R£·»jB˜@Rž‰Úš@R˜Ì N–Ð@R’ƒ;+´@R‹±8jäý@R„Xʱ¾F@R||Û]‡²@Rt p•'Æ@RkF¨qQ@Raò´Hùÿ@RX'Ô.@RMéR¤nŸ@RC:€š¯\@R8±ªöM@R,™8§_œ@R ­dtp3@R^}2)–@R¯Á³Š@Qú¤e?´o@Qí?£Ä@Qß„Q}ÈÊ@QÑu¶ÛH_@QòRë@Q´j$‹+@Q¥rÜ‹ÿ6@Q–3”Ë@Q†®ðêp@QvçƒõЇ@QfßÉ~)ß@QVš(þbl@QFõKe¼@Q5^lÆìB@Q$l¹¦ô@QEòGü‚@Qì›…@PðaŒ9‘@PÞ¦á€É@PÌ¿*Ò›W@Pº«µ\ÒR@P¨n)ý[:@P–!$,Ž@Pƒ{#_O@PpÈ©ç÷~@P]ò/ @PJøßhvÜ@P7Þ9{!@P$£m†Ê¶@PI±jº³@Oû¤ZˆÅŠ@OÔ{ûÜ´@O­j'¿å@PŸâK÷Ù@P±Øƒ‹?@Pâ¯ÑV“@PÕ? „v@Pæ¬ÝÕà@P÷糆Êt@Qð¯Ÿ\@QÃZ¨Ÿz@Q*_a„k@Q:ÂÅ¥6@QJéL;ï@QZÒÀ&ÆD@Qj|d²d@Qyâÿ7Q@Q‰çS:*@Q—ßI2ŽÆ@Q¦o„/@Q´²å 5,@Q¦§r{Ê@QÐGõ¶÷î@QÝ“ê8Èu@Qê‡x<@Q÷æn ñ@RYÞ$‘š@R2_‰Þ^@R¦J‡÷+@R%²y]Ü5@R0SÃ=è_@R:†ÿ1ê@RDI>Au@RM–»ÓÉ@RVmo$ñ@R^Èâ~5@Rf§Wr>)@Rn†þfÄ@Rtà¬s›µ@R{6"1ªÔ@Rf¾¥@R†F<@RŠü(º3@R#búµ›@R’º)|@R•¾Þª8h@R˜0,ÑA•@Rš ügÉ«@R›TvpYÏ@RœUc@Rœ![3Çâ@R›¦h”2@Rš•fƒçŠ@R˜îѳ@R–³gWpÑ@R“ä)‘xê@R‚W,¯L@RŒkõ»å@Rˆ ýmØ@R‚ýU\Q@R}b0ôiî@Rw=û) é@Rp“'È&@RidP '@Ra´-×Ï‚@RY…—Q„æ@RPÛzm…c@RG¸Ø«ïö@R> ÂóEO@R4Uœn@R)œ´³©â@R·{nè@Rhz)>ö@R´0ë3„@QûO0AÃ@Qï&ð5¶m@QâT%ØšT@QÕ'ö©+2@QÇ¥\=ß@Q¹ÏAÂÚé@Q«¨‚Â\à@Q3ê"NŠ@QŽt1S û@Qkÿ«N@QpéíD@Q`ŒqðÅ@QPºnß½@Q@©ë ƒ@Q0[¯¶‡w@QÔB šÞ@QÜ6³¡@Pþß‘w@PìöTLë¼@PÛ›Ã:Ú@Pʺ熯@P¸Uý+RÌ@P¦o™>ôî@P”^6ˆÒÂ@P‚#l 1M@PoÀÃÊj@@P]7µy@PJ‰¬Ë8¬@P7¸Ýh@P$Ä ,‡@P¯)½O@Oüô²þ6@OÖM›÷Б@O¯k—Õ Ÿ@OˆP©ýfã@P‹y%Tð¢@PBòËE@@P®ßÛ¦«‹@PÀN0¼¿p@PÑŒ3•@Pâ˜G¼Ð@Póoñž >@QÝA²¡@Q{Ô1ˆ@Q$«Â÷B›@Q4Ÿ„wüX@QDTáÕ4C@QSÉ’`áT@Qbû;§MË@Qqçq‘££@Q€‹¶¤>D@QŽå|[ü@Qœò#­éí@Qª®ý¬·Ž@Q¸LWm]@QÅ.C”Õâ@QÑë ^õ"@QÞL¼!ºq@QêPjOÓŠ@Qõó0&+@R1Úåõ¼@R ŸµO@Rwj‚ëš@R x:“F@R* ‚Â@R3't‚å@R;Ï{Ñ(@RCþ}0ˆ@RK²hn½§@RRè&7ÿ<@RY«åþ@R_ÎÔeg@RezðÏ>@RjŸA„“@Ro9½Íù@RsH‹ â[@RvÉÿâ7M@Ry¼§t'€@R|DL= @R}ðÒãlÒ@R0‹»a @RÝåõþ@Rø“µñ2@R€ŒGNá@R~v°Y@R|Ùj×i@Rz«s€!{@Rwí Ǹ@RtŸ_Qš@RpÃËW™·@Rl[翤@Rgi}¢{ï@Raî…(ªÈ@R[í!ãDû@RUgž÷u@RN`k*à8@RFÚßm@R>×F ›¢@R6ZÀ4¿@R-gX”ìÞ@R#ÿô;ü;@R'„s8@RáC‚@R/p.A @QúÍ$F@Qî—­…>@Qâ¶ZV:ù@QÖv‚R5c@QÉÚ…_ù™@Q¼åKåóË@Q¯™³INz@Q¡úŒ{âO@Q” š¾x,@Q…Ì’”G@QwCäab@QhpÂE¦Þ@QYXqÁ&@QIû{Û¸à@Q:]_f¿:@Q*€ 9åP@Qe¿­žz@Q ¥P‚@Pù‚ÖýƒS@Pè¾] @P×Å.zR@PÆ™1I}Ž@Pµ<:¹B>@P£°«s<@P‘öe«­@P€à×”@PnÚ@ô@P[ÈÓõÏ@PIhÇ@P6ã$žž@P$9hú^@PkÀ6ùÇ@Oüù&©Pì@OÖÙqõn3@O°z»zrÕ@O‰ßEò3 @Oc >~±}@PvÕ8t^Í@Pˆrø²®Ô@P™ãqÖM@P«#¸§HÛ@P¼3Q(Ï9@PÍY¥à@PÝ·ýß­@Pî)M^8’@PþaúDÁ@Q_ùšê9@Q!/íPr@Q-£q:Ãì@Q<ä€þÛ[@QKâN;‹@QZ™È ¼¬@Qi 58ŒI@Qw-Ýb+¸@Q…51=¿@Q’Œ£ @QŸÁ€@N›@Q¬¡ep½@Q¹(°,ê¬@QÅU|pvM@QÑ$­Ò@QÜ“mT*@Qçžà)H@QòD(0î‰@Qü€h TH@RPÄÜG#@R²i8£Á@R¢ˆ+ó€@R!`\&Å@R)#?[D”@R0®…ê²@R7½§t?ß@R>N5ÐÈ'@RD]ÜÇjÁ@RIêiÅõç@RNñΦ’”@RSr%+ô+@RWi²V©‚@RZÖé†Ö2@R]¸o]Í#@R` S‹@RaÓþôëÐ@Rc ]À£Ý@Rcµ¸š†@RcÏÉÎ\Ž@RcZ†—|@RbVU0É@R`Âþë^û@R^¡Ê&çÿ@R[ó^T7@RX¸Ï2s@RTófžÈé@RP¤ž}ë@RKÎ!Ýâ@RFqÇj——@R@‘>MY@R:/Ÿ8å@R3N>ÑÀ,@R+ïÔÛ²¦@R$âxã~@RÆ*,þ@RÿÚð@R Ç, @RÀ²@Qö i-‡D@Që‰ÿ9ö—@Qà£_¸ò @QÕXh‹'Ä@QÉ«ö @Q½ áó>@Q±9üoË7@Q¤zxá‚@Q—cèJ}P@Q‰ú2Pí@Q|? Xõ@Qn6Æ÷mj@Q_â@¯Œ@QQDŒ";¿@QB`ûRå@Q37S)b@Q#Ì„ƒ M@Q!òˆdÎ@Q9Ï=‚ú@Pô<œã@Pã¹Jð@PÓ$ù±F^@PÂ[;(A‚@P±]î ZÐ@P .äg¯l@PŽÏÝ=t@P}BŠ¢G#@Pkˆ/1@PY£~ñ~*@PG”ßËêÄ@P5^)ÙcP@P#ÇÓ&Û@P~wÝ„@Oû®Óæõ@OÖŽt)@O°F?bg‚@OŠ/Ô&)@OcÛ ®çß@O=J«ÝÑ@PaøÙÿÆ7@Psjñ^×k@P„®—P4Â@P•Â#nN@P¦£Þë–!@P·RQ”‹@PÇÊ¿Aúm@PØ ,EÒË@PèX¦ @P÷áBQ/@Qp×ÏŠÚ@QÀøIHÄ@Q%Ïs´ƒ@Q4š ‘ã@QCo¹S@QQZD–¨Ç@Q_K ›Ä@Qlî‹;©@QzAÿíÐÒ@Q‡Bîeí@Q“NŒ@Q BÂþiA@Q¬@QìE˜uÛ@QõF“ÓÈ@Qþ Á>À @R\2K@R8Z˜F@RœÀTé@R†þtýG@R"ôʘ…@R(ãó¸?@R.Rkš?¼@R3>D¾2ÿ@R7¥¸ p@R;‡'U6è@R>á ¾ª@RA²^½„@RCùÍ»ì@RE¶åч@RFçñÁÅk@RGüž~@RG¦ý­^ó@RG4ZÒÚg@RF5Æg@RD«¤J@RB–8Q¦@R?÷P7":@R<Îî|)@R9šÕõî@R4ç·7ü(@R0+Ò?n@R*ì¤z…»@R%, xù1@Rì·.@R.Òg›4@Rö”,N¶@R E±Ä:ë@R»´R@QøƒÞ%ÜŒ@Qïx h0†@QåýÃ8n@Qܹ"{@QÑÈ ¬ÎO@QÇ3­@Q»ú.B’÷@Q°€LfÓÕ@Q¤¨GÆ¿@Q˜tÕËð@Q‹è¥Ð~‰@Q_ý¦@QqС©1u@QdJvG@QVuàÚ¼@QHT+~ñ@Q9éãÅÍÏ@Q+8cþA@QBº‚,@Q ÿs¨J@Pý‘>4äL@PíÚdiÆ@PÝç‰! C@Pͺ´W¬@P½UÝf6%@P¬ºî<šS@P›ëÀ`áR@PŠê¯K5@Py·ÅB‘@PhVaµ¥@PVÇ“iD¢@PE ëØ ¬@P3'îäB@P!0qo@PäÂ{]«@Où³ó'@OÔUhO@O®ÊóÍyQ@O‰?¼É@Ocpß«ø^@O=bÒ¯. @O*“}@PLæE~µ¼@P^-9ôû@PoDÔ v@P€+¿ç&à@Pà0’7x@P¡`f>á @P±ª’õ¶ @PÁ¼Ú†ß@PÑ•RqÆù@Pá2Ù×@PðáŠj@Pÿ¯Üô±@QŒÍ¿ïµ@Q%…6C@Q+wÃc¤«@Q9<‡ @QG?–“³4@QT°nbT@QaÑR€¿@QnŸÉ±0º@Q{P ÆK@Q‡;Yèɱ@Q“Tàó@Qžn©LE\@Q©z»ëR@Q´$ﺺr@Q¾j§ðó×@QÈIJ%¶U@QѾ@¡×s@QÚÆüÕ“+@Qã`ùò|C@Q뉿¥u¦@Qó>äì8ª@Qú~ l@REVm®@R‘››¯Ã@R a¾Â¦L@R³þV@R…¯f£@RÔÒ;ŸÃ@R¡0»Üx@R"è×õ„@R%ª—f¸E@R'ånÙIE@R)˜‹§|û@R*ÃLwê+@R+eAï–(@R+~/~dX@R+ Îà©@R*׃º@R(“k&­@R&‰Û7ôU@R#ùm´’@R áûµÆÑ@RE»Üx‘@R%›ü’@RƒFóC@R_¸ÒÌ@R ½S±×Ü@RÆ»v@@Qý'@Qõï^xð/@QîdÜU­@QæeÝo@QÝôÄs(@QÕ&˰@QËÆË @Q Ÿ²eX@Q·íD¦@Q­g"{Þ¼@Q¢~Z…ý@Q—5]މ„@Q‹ŽÇ±¢ª@Q2R@Qs31CÅd@QfƒSw ­@QY€YE‘@QL,´6@Q>‰¡]õ+@Q0›4F^‰@Q"c(§,¨@QãÏT–¿@Ql,?@Pö5 3À@PæÐT[Ę@P×Iâÿô²@Pdžíõ_É@P·‰sQ{å@P§SbÍ8'@P–æË]@P†D÷jáˆ@Pup4©”—@Pdj ‹{1@PS4(O†0@PAÐ#ªCm@P0?YV@PƒåÐj×@P ž¢¸e@Oõ"X«{@Oй»õåý@O¬ø]ñ@O‡ ä$H@OaǦQ¨¯@O¤[ñ@R ¡;x0;@R ÐÍcv@R zý@@Ržr$˜b@R<ù'Ä@RU_h‹[@Rçœ/Ó?@R óֵܻ@R zeàÎ@R {Ï«Aè@RøÈ:†Ï@Rò0§„‹@Ri @Qý^¬ÿ÷4@QøÔUD8@QóË‘G/–@QîF{@QèE€º™@QáËàg»g@QÚÛ'™ÓÔ@QÓuoYá7@QËœæz @QÃSÎÕÕû@QºœzœR@Q±yI¨Û¯@Q§ì¦ôi@QùËY@Q“ á0æ@Qˆæµœóí@Q}ÍÞª@QrVK¶(Ö@Qf… O{@QZ[½a`@QMÜ×°TK@QA ɯw§@Q3çûF¢ç@Q&v˽z!@Q¹Ç€@Q ²•­­&@Püd¤V@PíÐT ˜@PÞùj6ÿ‹@PÏáx‡P@PÀŠŽfzi@P°ö¬µk@P¡'Çô·O@P‘Çñ°@P€àƒ_š½@PpkɈÚ@P_ÃVáp@PNèÞT @P=ÞçÝX@P,¤_9Y~@P={:Û‡@P ªÖoÓ)@OïÛÆZ5Ò@O̺—"@O§õ>›j@Oƒñºçr@O^ܱþô@O9ãò£¹I@O¦ó@Nï%Z]™ @NÉd Mg@P"&ïøò•@P3¦ô»¬@PCÙö"y@PTiB‚½º@PdÄäòï@Ptë)ÁAL@P„ÚPÅ‚c@P”EõÝ@P¤ üÐû@P³JÕ%H @PÂK˜@PÑ ¡÷½á@P߇–ïQ#@Pí¿ÑƒmW@Pû±0y~@Q Y‡Ól@Q¶¡g¦é@Q#Æ=t]@Q0†öNX@Q<óÔzã@QI (<‚@QTϲÃ{Ò@Q`9F©È@QkFæ.@QuöÆ^I@Q€FN¨4Å@QŠ3‡»@Q“ºÒÏy†@QœÛeª—@Q¥‘š¤f@Q­ÜàÔ²@Qµ¸STª³@Q½$&ˆ ,@QÄxÎ\b@QÊ¢FÉúÝ@Qа£ójí@QÖF½Kp@QÛbÚîk@QàdJòq@Qä&à¥iø@QçËú0O&@Qêñé´@Qí–gu ¦@Qï¹ÎË4c@QñZý¢?ù@Qòyf ';@Qó¨E&@Qó,*j@QòÁS@QñÒOJµ8@Qð`¡Öv“@Qîlƒuf@QëöœñýÚ@QèÿÁN‘@QåˆìiÎâ@Qá“Akؤ@QÝ úì4@QØ0¯@CN@QÒÆÁúS@QÌãí%a§@QƉú¼Cn@Q¿ºÎ!¢–@Q¸xb¯ÐC@Q°ÄÈûlº@Q¨¢$M…y@Q ¨$‡™@Q—•ÁqØ@Q¶9Æú@Qƒíéè°Ô@QyÂÀ)@Qo4å¬Ic@QdHöÛÜ„@QY›ržù@QM^7ÐÁ@QAd-ø+ö@Q5Ü"Â@Q(r›K·S@Q¾7×î@Q>)´ã@Q±T Úg@PòÚC‹ (@P从ps¦@PÖWYîy@PǯÀ$ÂC@P¸ÆÏ¯ƒ‡@P©ž‹N~S@Pš8éŸôD@PŠ—ÔíàŒ@Pz½+ Ö@Pjª½Cî¤@PZbPQJ?@PIåœf®‘@P96M?îg@P(V<Ô,@PFN„a“@P¹/L'@Oé=zñhé@OÆ•èT@O¢–‹J‹@O~É ØY+@OZ­¸Óõ„@O6GAùÎ@O—8Ú@N졊 ¤-@NÇgN)@N¡ë[2³@P ~0%­@PF TCC@P-Üî+ƒ@P>ABïu=@PNqh>¿@P^k°û0â@Pn.dEé÷@P}·½xÄ@Pì5]@Pœ{¡•@PªéNÒÓù@P¹z¨}cÙ@PÇÉ#Áx{@PÕÒ¸B›1@Pã•So²b@PñÙ¸@Pþ=#®Œ@Q «žà@Q¯I«Kë@Q#¤²@Q/Úw¿@Q;nî~—’@QF«/œê!@QQŒyô­@@Q\ª (@Qf4ü Ç!@Qo÷¡@Gè@QyV.- F@Q‚NfPÖ@QŠÞÔ@Q“¦8 @Qš»C¨ä±@Q¢˜óË@Q¨Ýo£@Q¯BÙ‡$@Qµ4 ·ÇŠ@Qº®õŸ×{@Q¿±øßV @QÄ;“öÑ1@QÈJdak§@QËÝ(‘{¹@QÎòÁÉ;þ@QÑŠ5ɆH@QÓ¢°PÜ=@QÕ;„e„÷@QÖT-f#ˆ@QÖìOÜæ9@Q׺B@QÖšd] @QÕ°q/ Ç@QÔF,Ý%@QÒ\ $b@QÏò°nðÀ@QÍ ÜØN?@QÉ¥~ø-ã@QÅèuþ<@QÁfŽjãÜ@Q¼‡—™£@Q·@ t-S@Q±y«Õ¢@Q«>7C©@Q¤—Õ+@Qn˜òD@Q•Þ},ª(@QàÓ¬S·@Q…w²m“@Q|¥> ±Ð@Qsk¦¸·Î@QiÍ&*§@Q_ËüäΘ@QUjq­6²@QJªÎ:h»@Q?^-T@Q4mG]`@Q(NEãÍj@Q-/„2@Q¹m¾ö@Qõ>¢ @PõâÚßf@Pè„p±É#@PÚÜ*ñ‹å@PÌì(x—&@P¾¶nÁã@P°=;ô…Q@P¡‚_­U`@P’‡á^˜V@PƒO¬¡¼/@PsÛ¡§ë;@Pd-• è @PTGO¾§P@PD*Žã;ƒ@P3ÙÞÕ°@P#TTU‡@Pž<¡É@P·ãó˜ @OáFhȦQ@O¾ÃT{@O›èy{yo@Ox¹…NÕ¸@OU8×fß@O1iVS@O Lœ ÖÓ@Nèæ¶5‰@NÄ7˜pþ¬@NŸC¦—œi@Nz cßj@OíN|ʈC@PE»ÇÖž@P²»ªÚ@P'ì«ÛÕW@P7ñòù-å@PGÀê9@PWWߤP˜@Pfµeà@PuÖÉóX9@P„»%*¤¸@P“`LH¡@P¡ÄX+šß@P¯åW¡{S@P½ÁOȇô@PËV<ƒ3 @PØ¢T@P墸Y u@PòVEƒB@PþºéÀY@Q Ìd»g%@QŠÿsx@Q!ó§n3@Q-)Vh@Q7ºPýV¸@QBꆲŽ@QLÃø”u@QU¨®Ýûî@Q^ßÿÿV@Qg±6•§@QpaNŸ§@QxF°G@Q±Èš—@Q†Ùõ S§@Q’ìAp@Q“Úߢ"@Q™°ÝRª@QŸïvå+@Q£ûä—²g@Q¨o‰‰_©@Q¬j8Ï@Q¯ëÉL½@Q²ò'?Øï@Qµ|¾x}»@Q·ŠÇY«@Q¹ŸH@Qº.ÉŸþZ@QºÃðs¥f@QºÚåß)@Qºs ?†^@Q¹ŽB`Š,@Q¸+'ëÜ@Q¶J8L¹@Q³í!w˜@Q±®-'a@Q­¿ên£@Q©ð*Bõ@Q¥¨>Ql@Q è…""Ø@Q›²_ç½M@Q–Lí|@QèášjQ@Q‰XÐn=@Q‚XÞâ ×@QzêçLʲ@QsÕóýö@Qj̦ìhK@Qb džË@QY"¨’ò@QO˜¯[@QEÀ(欿@Q;ˆÄËc@Q0ôƒ¥v@Q&zY„@Q»CD]‘@Q©˜â[@Q'‚GNP@Pöàûø4@PêJA;†@PÝev€Üx@PÐ4»'6D@Pº&§M©@P´÷ÈÖx^@P¦ï© J@P˜£Å—¢r@PŠ9‘N@P{H|ÇÕ@Pl<âÒ“@P\õ`ð@PMrñ¼hñ@P=¸&JKü@P-ÆnrjÚ@PŸt‘›@P D×öð^@OùpYÕ+Ä@O×õùzy›@O¶‹¾Oò@O“é÷ûÖë@Oq^P‰@ON|‘ë0½@O+H%j¹X@OÃ_:ä4@Nãð¿þHŸ@N¿Ò´úŒÇ@N›k˜‰*Ï@Nv½²‹a^@NQË8à€k@OÁGË8•?@Oâ3 $†8@P],Ý÷@PmOc.G@P!HX¢sý@P0ì©7”@P@X—aL@POŠo4@P^€rÞ @Pm8Ø!S¬@P{±Ï1ÿú@P‰é{°4™@P—ÝøÔqÈ@P¥Y @P²õ¦jO‰@PÀãB_;@PÌé ¸¸Ý@PÙp‘g@På§æ ÝF@PñŽt`Þ@Pý!¡8r×@Q_Pç¨Å@QEe Ø@QÑÁLXÜ@Q(Fä™*@Q1ÔÛê>@Q;Giî/@QDWà4/#@QM5f©@QUJi[¬/@Q](†ò0è@Qdœ¥ïî@Qk¤ìò”Ì@Qr?“c#@Qxjãnnu@Q~%;ö7(@QƒmƒÙ@Qˆ@õ%Ù@QŒŸŒJxh@Q‡œv)Ä@Q“øêæ•@Q–ïÐ,1T@Q™n`<è@Q›r!‰&@QœûU’K @Qž >.Js@Qž›Š‚¾Ê@Qž²ŸpŒ@QžLÿdª@QkÈRæý@Qœ_ÒmÚ@Qš7òZòá@Q—æ ö@Q•\i"/@Q‘Õµz¶@QŽ¥ûå@Q‰åiÞÓ@Q…< †0È@Q€5*IV@QzUYõ@QtŠëÖšQ@Qn‘»@Qg7õŒ'@Q_êÙGÚ)@QX3o6@QP~ŒO@QG‹ÒS!@Q>žË×À@Q5O­ ý@Q+ŸÆ÷,È@Q!‘-cô‘@Q%ù†3d@Q `G¤Ì:@QB5D`@PõÍá~ìI@Pêh>Bw@PÝêä€ã@PÑ€m‚-@PÄÈ–°@P·Ã랸'@PªuõxZT@Pœà3ûÛV@PŸ÷¿@P€å*ú•@Prƒº^—µ@Pcâ/É<Â@PU_âÆU@PEæûD@P6‹sð@P&ÿÃ^¸@P7Á¬(@P:¿oÕ—@OîM¬–»@OÍL „Ù@O¬"Ãok®@OŠšeÙ„+@OhµÒ¹,@OFwÔÈ:•@O#ã"Äô½@Oú_¼¯@@NÝÀ^Z‚@Nº6ÒSÊÄ@N–`î ©"@Nr@È$@NMؤiý@N)*¸A‚@O”ë¹w|@Oµ†FÙª-@OÕ»ýy3É@Oõ‰ÓØcæ@P vVs&Ý@Pð¬]@P)2H¢c3@P89€®Ën@PGŸƒ@PU‘å‡(M@Pcߌ™WP@PqëÄ0k@P´³Èðf@P8zé n@Pšu1˜(ƒ@P§hèî¨J@P´«¶$@PÀm»@PÌzc„­_@PØ6UUô|@PãŸMÿ\q@Pî³Dúi¶@Pùp0í7»@QÔá7Í@Q ÜÅÅJ@QˆbÃôG@Q Ôàгš@Q)ÀF H@Q2H ¯ÚÍ@Q:løY@QB(žgÍù@QI|“C,ø@QPf$jr¤@QVã '‡+@Q\ófþ ²@Qb“íx;ø@Qgý츴@Qlz9º@QpËÝlÌ»@Qt¡½_Ö„@Qx 11Y@QzëÙ¨a+@Q}^Tv?+@QXËQ(@Q€Ú­éÎ@Qã°ÁZ@Q‚sxÛ‘@Q‚‰6Üa@Q‚%ÐyÁû@QIÿ!æ@QóþfÐ@Q~$q”«†@Q{݉ߠó@Qy D؃@Qu黌ý’@Qr>ÕØ"@Qn[^f~@QiŠn0½@Qdƒó­¨Y@Q_ @þGö@QY$Ãoú@QRÎþ¿@QL ‹TR*@QDßz¼«@Q=HVÆþ@Q5J4…@Q,æA~™û@Q$¨7¡s@Qõ@øµ@Ql-ë@Q„æ²Ú@PýAô‰2@Pò¥1á-\@Pç°¦œº²@PÜf\»Ø@PÐÈ[E0@PÄØ«6@P¸™QÀI7@P¬ O[@PŸ3ŸüÕ @P’<¬@P„§kf!@Pv÷´F0@Pi&Í.@PZÍ 8¨?@PLV´!f@P=¡ßxÄÒ@P.°Oé"@Pƒ½éîZ@PØŒ‘è@P€ESAÂ@OáY@'Ì:@OÁHõÊr3@O Ò¼*¿J@OùR"Ž@O^À[ÄêØ@O=)ôш@O9µÒ@Nøð†Öã­@NÖRÌøC¤@N³bzƒ¢@N"ž2 @Nl“Ú€*±@NHºGÆmR@N$—’ÐÆ¯@N-î c÷@Oh=/Þ-@OˆˆrÖ™@O¨m¯ òê@OÇêFXˆ`@Oæû(äz@PΚ?"@PæšgÀg@P ÃñÎë@P/dô‹;Ì@P=Çî&ZX@PKë!Ö¨Ò@PYÌÊÓèê@Pgk´Ï^@PtÄCÜ¿¯@PÖeù©á@PŽŸ¢’àÞ@P›©±Ð@P§OÎlq@P³2ãü™¯@P¾ÅbH~@PÊTøç @PÔðÆrÓO@Pß…Àí\A@PéÂO›¤@Pó¤éÓC@Pý*bÎ'¹@QR*ZÖ@Qž>ñ/@Q7-Aý@Q†ò@Q'Dè¬@Q.R7£É@Q52I*R@Q;˜“Kˆ@QAtßÕ1D@QFüÁËú@QLIê@QP½¼ä á@QTô¸¯­š@QX¹"LÅø@Q\ ú†à±@Q^æ^TŒÏ@QaM‡ûV%@Qc>Ð"Ù@Qd¹®^î¹@Qe½º?/@QfJ¬»@Qf`]ÚÄÂ@QeþÇèk@Qe&ð­o@QcÖSïÌ@Qbx§Ü@Q_Ó²@éé@Q]!Ûq.¾@QYûDÙ>“@QV`Æùãk@QRSVìÉ6@QMÔ,Ø™@QHãüB}@QC„Wÿ@Q=¶è¸qo@Q7|¨?ZÞ@Q0×AºÆ@Q)ÈKDëþ@Q"Qk˜Â@QtXe Ñ@Q2Ô¡U@Q Ž®çÙý@Q‰¿×Z—@P÷%è@^@PíeØl›@PãI&L–Ç@PØÔMÝÌ@PÎàÿßÖ@PÂæoóbc@P·q¼õMÍ@P««¼ñ}ï@PŸ–b鬻@P“3Ÿ…@P†…]˜» @Py†‡Ûˆ@PlMü\`Y@P^È›¶v@PPÿ:²ÆÔ@PBó¨fˆ¸@P4§¬kýž@P&~†Ý@PUn%g@PR’lG_@Oò,3Q+{@OÓCB•Ÿ?@O³í{u¨&@O”-ô|´j@Ot±Ñc6@OS}¥%ó;@O2’­¸ ×@OI˜^`{@N異ÂX@NͧëçJR@N«T“•Y@Nˆ­›UAe@NeµvM…Ý@NBn†h¦”@NÛ Å@MúýyNÔr@MÖ×Ì€×@O;@ot”ç@O[<µ³^U@OzÒ•¯Xù@O™ÿD@O¸¿LüƒM@O×9J"@Oôî=há€@P +R©]:@P£;™Ã@P%Ü|Âõt@P3Öö †@PAŽ>6½@PO±E<@P\2+‰q1@Pi´”¦Æ@PuºyÓ£è@P‚¤§U@PŽWý@©@P™Ò¶ê½@P¥<ߨÈ@P°Tïeóƒ@P»«Û–@PŇ6hq@PÏ© š½@PÙZ{³Æd@Pâ»Ót@Pë¿Ú› @PôdÂnê@Pü¨Â×cÄ@QŠSŒÈ@Q $úZÛ@Q-ÀöJ@QÍ¡¬ªó@Q ø`'^@Q%ﺧ“þ@Q+_„W½@Q0b93@Q4öGp[@Q9Tí-€@Q<ÍöÎ]@Q@ôNW!@QBßv˜È¢@QE;©Gï@QG$:8 J@QH˜\ƒiK@QI—ÆõÜm@QJ"5¦Ò@QJ7ƒ¯·Ô@QI׫cþ@QIÆPùæ@QG¹ Ï@QEú×Kþ~@QCÈš®X†@QA"êç¬ø@Q> x¢>j@Q:€²ª@Q6„›O@Q2ác—@Q->§ô™@Q'öwÁ K@Q"AÑæË@Q"·àe@Q˜­Ë•¦@Q§"nT@QOün@Pÿ‘óìý@P÷q ç?@PîïÂJ n@PæTÎs@PÜ΀„Ûä@PÓ2¼L¯î@PÉ<ªÚïÛ@P¾î)Æ[)@P´IÈ<@P©O]‰=c@PžØzž½@P’emǶ4@P†xÿT¹U@Pz?lÑÆy@Pmº’ßà×@P`ìJHÙ@PSÖgCó/@PFz¸Øj÷@P8Û@R@P*ùf;¶@PÖ¥r…@Pud_$(@Oÿ®IÈ7@OáúKÕ©Š@OÃÒ×’<@O¥:Ó)3@O†5Xke@OfÅpuù@OFî:ä@O&²"ôµª@OxìÐ@NåÖ¯d@Nþî,s@N¢ _¶ä@N€»L«@N]¤~oœØ@N:ô¶t@Nóäá¡@Mô¦00w»@MÑ 9"Ù™@M­++û®™@O ÷ZSKj@O-¦&ë­@OLí³ñFU@OkË^ Ñ4@OŠ<—\@O¨<ä™Të@OÅʧR?g@Oââ>ˆÈØ@Oÿ€vôéÝ@P Ñ_EÎ@P¡Û “]@P)1éè8@P6|Ù.í@PCƒ”5,¾@PPCy ‚+@P\ºÂù1¦@Phç©'Ðá@PtÈ_Få§@P€[Ou@P‹ýPv@P–BOžQ@P¡-9êà@P«užáô+@Pµg, @P¾ÿ¬¬¾ã@PÈ=šÚ¸Z@PÑIy@PÙ¢{r–=@PáÅþôå @Pé‡þïmø@PðæÜjL@P÷áÁ2\@Pþtóój@Q¡1¾+Ì@Q d[³K @Q½ü$¥@Qª9ì@Q*‚) g@Q<ä—Rk@Q àbïhâ@Q$3a @Q&×8Þ÷~@Q))ÚÕ…@Q+ Sb¦@Q,v½pÎ@Q-q´îF@Q-ù¹Ž«@Q.¨mhõ@Q-°|*ŒÓ@Q,ßLñá@Q+›PZÍô@Q)äÙ'êã@Q'¼VÜ@@Q%"U1$@Q"{k(f@Qœ‹Œï™@Q²anWW@QYñ¸ˆ@Q”HÉÇK@Q b‰„&­@QÅì È@Q¿¼k‡s@PúQYHì@Pó|2f¬!@PìAÇIV.@P䣥¼Oø@PÜ£hf+@PÔBµY’ @P˃<¬ù¬@PÂf·K@P¸îä›+ü@P¯‹1%¶@P¤ôut;@PšuqçÜ‹@P¢PÖ«5@P„|ä8M¥@Pyþ,ä²@PmBp 8@@Pa1 äE»@PTÔ˜ÜxY@PH.ç9t±@P;A»E? @P.Ö¿f×@P —öHÈf@PÞÐÞaH@Påb¢@OíXèi6¡@OÐm¨°2@O³ ï'e®@O•2ž¥Õd@Ovê>}ß@OX3Ù£©Ç@O9j¢]ÿ@OˆÜý>@NùšT=š@NÙH¹ k@N¸—§šb @N—‰|Ôà‘@Nv Ñ*n@NT`,¶¦@N2J_Yg@NàÉóF@Mí&ɧ$@MÊQ§«@M¦É™û×@Mƒ*Ìp%å@Nàe._ã‹@NÿÇd§i¢@OÁéV_è@O=Qän9¸@O[tn´ k@Oy&‘ëÆž@O–eI"õø@O³- ó@OÏ|~F@OëMàÜt-@POÏgž§@P·t0o@PÚé8uË@P*¹Ì&þ@P7Qû'ý@PC¡¾_ÂÆ@PO§[Y ›@P[a!ZÑ@PfÍ(ɽ-@PqéØÅ@P|µ` ~¨@P‡-ÿp‰$@P‘Qö @P›†iRÖ@P¤”ö þ€@P­°Oâj@P¶p¢DÆë@P¾Ó…åkñ@PÆ×™bGF@PÎ{Ehud@PÕ¼ýq6@PÜ›A49@PãcЀ@Pé'®8)â@PîÓ]@Pô®Í´@Pøî,µ@Pý[{xÞ3@Q\–&¤@Qð‹Éõ@Q‚p2X@Q ͹ž @Q ‰®ñ @Qíd/bZ@QTÕ×Û@QK†Pp@QÑ8Âù=@QåÌ$Ø@Q‰;_(â@Q»T÷K@Q}$Ç_`@Q Î íZ@Q ®øéèó@Q 3£—j@Q"nÐÕ@@Q¶bh¸Y@PþÜÞø3@Pú–̳î†@Põå*sÆQ@PðÉ šx´@PëC›ì;¼@PåVVúO@PßïN@PØHbñÉ@PÑ*P)ˆN@Pɪ¬#@PÁÈä0GT@P¹ˆLB±@P°éìf‹@P§ïjÇ© @Pžštû*ì@P”ì¾À;ˆ@PŠèÒG@P€÷ÄU\@Puàbé±@PjáLL»@P_‘š±kk@PSóê­@PH ³Äµ@P;Ô´ F@P/V©LàC@P"‘J‰Ÿí@P†M)I·@P7a~ã@OõLe©äy@OÙ¨Íýº×@O½‡;ÌdE@O êâbo@OƒÖçàg¶@OfNd­€Ð@OHTbÿV=@O)ëÞu{@O Ãdžò@NëÚð„N¾@NÌ82á„@N¬2I—Tî@N‹ËãÐ2¬@Nk¡g@NIèu~ @N(oµNVæ@N ý¥ûò@Mä~L'Ú@M óQCÃ@MŸF6г@M|5J¹{*@MXÙU·Âu@N²Œª0‡ƒ@NÑ£nûüÑ@NðQô ‚à@O•n!0@O,k»$œ@OIÏÍWùê@OfÀÕÈìL@Oƒ;—E£@OŸ;Œ{˜@Oº¿èÓÚ@OÕÂ}¬AŒ@OðB££Ê@P"ÄÍ¢@PÖî"¼@PGom 4@P*p™ÍeÑ@P6Oà óO@PAã”&cE@PM*þ Ç@PX!z쇜@PbÈI«=ß@Pm½ÆŽ•@Pw'‰€¬@P€ÇÙöo¼@PŠ+Ì+²@P“x–Éj@P›µ!Ë7@P£øì|Ž@P«Þ3¹U?@P³d‡`¹Ï@PºŠ»¤æ@PÁM]ŠI @PÇ­²½E@PͧÏ~ô@PÓ<[×Ïa@PØi€zá @PÝ.(s–@PበÇZY@Påy”|Õ@Pèþ’°u\@PìM YÁ@Pîà M|Ä@Pñ1'Ñ(@PòÑ4åb@Pô2ª <ì@Põ%<и-@Põ¨³ŠÖ'@Põ¼îå«^@Põaêñ@Pô—º¶@Pó^ýÎà`@PÉå… š@Pêc)ÐÔ@P½ ']ë@P¶ .¥ž£@P®¥ã Š@P¦â½CûA@PžÁ=¦€@P–Bð¼ãM@Pik*@P„6I ci@Pz«,ÌÃJ@PpɾƒÂ@Pf“¨ŸH“@P\ ›Ešb@PQ0Fóž:@PF]½¡v@P:Ž‘ûõ)@P.Ê•ulè@P"¼—±@Pdɽsƒ@P ÆT‚xS@OùÄÂJ‘ò@Oßu'ì£Ã@OÄ¡¨+J@O©KÍh Ì@Oxno¯V@Oq*›ï/@OTcë¼ @O7(âþ³F@O{üs¸P@Nû`$ ¢¶@NÜØ:'‚@N½ç {òê@Nž`­²A@N~Óç9s@N^·Eíl@N><ÕBM@NdÕ7pÌ@Mü4”õ²@MÚ¬ ¸!@M¸ÏHÉ\Z@M– kÒê@Mt {àÌ×@MQRâ0üF@M.9X[ ~@N„pmÍ!™@N£<Ï¿®n@NÁ rzn³@Nߘ—ö—@Ný"s<Ú¯@O;,²%Ÿ@O6ßÞo{@@OS –­÷@OnÁWÜ×j@O‰ø0ö¥@O¤®ÇH)W@O¾âDám@OØkªâ@Oñ³ &j8@P$ùÒÜÄ@P(q¯Aõ@PâMË­V@P(PëöÑj@P3r¨Úrº@P>Eà·Å @PHÈð0k¿@PRú5ë}@P\Øi?é@Pf`â o@Po“õW>@Pxm€]@P€íKi'l@P‰< WO@PÚd[Mõ@P˜DO øý@PŸN‘S°h@P¥÷Ì@P¬>­%%±@P²!ðä”@P· _ãþ2@P¼¸×ŒÌä@PÁjC‰7–@Pų¢®G@PÉ”7›ì@PÍ —ºŒ*@PлÎ@PÒ·B_@PÔìFdY@PÖ´Œî@PØ>Ä{@PØþÚ³@PÙ€*(…Î@PÙ”¾Q¡@PÙ:‰.Í9@PØs¨;…@P×?›÷u@PÕž¨¹ä@PÓ‘0)#e@PѨ¢äk@PÎ2¡Z`@PÊâ¿Y1@PÇ(¿Äî@PÃt¸-@P¾yÂÓ91@P¹†¦*O¹@P´-+ I@P®npdMæ@P¨K¥_À@P¡Æù*ë@PšÞè¸ÿ@P“—ž‹Ñ@P‹ñ‘¾ÄÈ@Pƒî3µû@P{ŽÿΔÅ@PrÕz£Š@PiÃ.’•@P`Y­¯O @PVšd ¸@PL‡qÜ ˆ@PB!ñ+L @P7k¯ÒLç@P,fPØ ã@P!wð3™@PtÈ­we@P ‹åÀ®@Oú´à‰4@OáÄ+©ò@OÈHŒq²i@O®EŒ”ã@O“¾7û³\@Oxµ¯L8¨@O]/ – |@OA-S’;H@O$³Žø‘,@Oıèã@Nêc¦gº@NÌ“Ií·@N®VmaQ@N¯ÒüKl@Np¢1¥Ü­@NQ01!Z»@N1\k¸3@N)mÂÛ+@M𙵙µg@Mϯ³ •@M®mÉøL¸@MŒÖM0ŒG@Mj냶¼B@MH¯¦C›@M&$ßëÈ»@MMNFJ1@NVü[@Nt–ÕRÿ@N’¯äÏ£ç@N°]ÞjhÌ@NÍ7›êÿ@Nêk&7‚Â@OÄÔMo@O"§`š¿ @O>ß =á@OXûYGP@OsfÏc§@OO8ªÌ@O¦±ƒí^@O¿Š™i‰æ@O××Z¾È@O€v@P_§Ÿãå@PªfóÁ@P¨Æº@P$WôíP¸@P.¸5Í3 @P8Ç=ãÑ@PBƒ||£@PKëbŠ]@PTýg¢çÑ@P]¸æ‹Ó@PfÂá,@Pn!!Ñ0 @PuÌ·a J@P} 6@P„ ÷tðK@PŠšöÄå@PÉ×–Ûú@P––d"JA@P›ÿuC¬1@P¡óˆŠË@P¥¢Ø2ç@P©Û..0¯@P­¬å@P±·½@P´a£~%@P¶ªka×@P¸ÖD"²@Pº—s0çò@P»í•r˜]@P¼Ø_V®+@P½WœÙ=W@P½k1¼O@P½¥É6@P¼Oh& ?@P» H »+@P¹…þV;@P·€ãY%@Pµh®¿Ó@P²8ËD@P®õ‹Ë+Ù@P«Jz+ñQ@P§7©Ô̼@P¢½ö@Vè@PÞM×-l@P˜™±Ð@P’ñ1L<Â@PŒåð4EJ@P†ySµ3@P«ú9;)@PxÏ['@Ppõõr6@PiÍ62Ê@P`Îç¥@PX4Lž=ñ@POAãðó@PEù øØß@P<[L“ãÉ@P2j2+àâ@P('LÆåy@P”/!`Ì@P²mÒtp@Pƒž{@Oø®ÀÓ@OàŠY¢œø@OÈqhp1V@O¯ÊÿndÖ@O–š>ãÑL@O|âA@þå@Ob¦=@OGèÕU—(@O,­v#FV@Oöönì7@NôÈFÍb@NØ$Jf4|@N» ÝpÄ@N‡Í·*ó@N”ݹ-o@Na7Ûêç@NBs(å‘¶@N#IªB¬S@N½×Xº×@MãÒ2¤†^@MÉ1cK¾@M¢å;…â'@Mè«­ ‰@M`•Ï. @M>îæWO@Mö#k3@Lú­¬èÿ{@LØ›}‰u@N'v¼@NE±Ìm9@Nc‚®o—’@N€ç£+L?@NÝ­£@Nºb4VW@NÖr Zø¡@Nò Å%b†@O )g¸¿9@O'Ë æMö@OAìÊÒ‹x@O[‹©®ó9@Ot¤®‡“@O4×!E×@O¥9ôz@O¼®q2J@OÓ‘Çå= @Oéà(>@Oÿ–5nÙ@P X”ñø@P–îîUL@P„£5Æ$@P( .÷s@P1hä8p@P:ZÔ9Y@PBöüÑmã@PK;Ão @PS%Ωˆ6@PZµ¯söZ@Paéi=@Ph¿¯K[@Po7@Z@PuNæ>26@P{y£„@P€YàJÞE@P…Kd¬›@P‰Ø 5ñƒ@Pÿí¾U@P‘ÁÙä« @P• ¤ œ@P˜Önª{@Pšœ–Ie@Pœ¿Å|f@PžyîMN@PŸÊ³¾t @P ±Î(¶@P¡/ ÕœM@P¡BQëiP@P ëœF|6@P *ý&5@PŸžßWt@PlÀ#-£@P›o·Jê@P™ ð3]B@P–;ì0`†@P“A€4@Piš¸ñ@P‹f¶‹Ø@P†þdÖ¹d@P‚1ŠEZ}@P} :\@Pwn@åÛ@Pqy¢q³—@Pk$кÒ!@Pdpׯ.?@P]^ôÌû]@PUðp•šñ@PN&žpŽ@PFÛ6ñ@P=†ŒE•Ù@P4³‰T@P+Š}ÍÑ@P" º?Ð@@P<º¡A@PˆDï‘@Pª§ÄüŠ@Oñ×?¿s©@OÛ¿ñ`#@OÅuàüø@O­ÑÞŠ¶¿@O–;,E@O}£˜ÛD?@Od¼Ï×@OKMwLÕ@O1Zú¬å@Oç‚mi'@Nûõþg5@Nà‰VÌ@NĤg• @N¨J·@ç@N‹}Çİ@Nn@j¡“@NP•ñ ©u@N2Eì%¸@N®6@Mõ"º‘nð@MÕÝð€xÌ@M¶8ÈS-9@M–5® K@Mu×ûªß@MUñÈk@M4,þÌy@M¬…–Òx@LðöJ—«å@LÎïœ[,­@L¬šŽÏ&‡@MøúÝ@N‘7(Q@N4[x@NQ8*Œxr@NmæYà@NŠ",”“@N¥é¶ðqA@NÁ9ôB`…@NÜ£­Ý@NöiW¶zÁ@OBÑM’ë@O)™¦%Èz@OBjî±kz@OZ³½ö`@Orq"A<@O‰ '_ä«@O =ÕMx @O¶G3ÊOÓ@O˹JeZñ@Oà‘" Ú@OôËÆu;‹@P3#Çæ3@P ®Ý‹`«@Pן°B@P«ûvq]@P(*‹,³Ë@P0QìõÆ‘@P8 Æ¿j@P?•Æ’`>@PF¯£‚7(@PMmŸ;@PSÍè@PYÎ+<Ø–@P_oyM:’@Pd¯à„Sç@PiŽaîÄí@Pn Ð@Pr"è0Ø@PuÕ{`j$@Py#²iÞã@P| €3o@P~ÒV @P€¨¢gˆi@P‚\{y@Pƒ§œ è@P„‹'´8@P…wR—@P…qWœq@P„ÄÔÉþ@P„j~Ö‹@P‚࢞è@PRöæ'@P]¹7Á×@P}PO,@Pz>7^P@PwýŽ•ú@Ps†EzbV@Po’ÄŒ¹@Pk;BRMj@Pf€—Å‚ë@Pac®ÇJ@P[åê™-@PVbéá@POÉ‚U~A@PI-íU>Ä@PB5…-s@P:á„îý•@P332¢‰@P++Û.H¯@P"Ì×°@P†FHH@P LJ$ @P¯”Ê=x@OûÿŸWÚ@Oçþᢂj@OÓ_Þ™DK@O¾%‰(ûÝ@O¨R׋P@O‘êÁÚ¿@Ozð@µT@OcfKù@OKOÙÿ»@O2¯ÜSËú@O‰BùÈ‹@NÿÞ÷$I®@Nå³Üx¸Ö@NË ÏÎe·@N¯æ¦n¤¯@N”J-f«µ@Nx8(êŽu@N[³SÈ­à@N>¾^ìäª@N![ðò³d@Nޥũ@MåYOB­@Mƽ°1z3@M§¿?´@Mˆ_|Ô@@Mh¡x¤P@MH‡O­§ @M(L¡ðä@MG®)äÓ@Læ&¦ä“@LIJ]l"@L¢ììc©Þ@L€Øb„\ú@MÉŠébXÛ@Mç87ñ{@N{M…ÔÌ@N!Qžè¬¸@N=¸–×ý@NY­–_ÕÎ@Nu-õNào@N7§Š@NªÆ,Ú@NÄØ;ùsÌ@NÞjß'j@N÷{ ˆæ@O,oÌ@O( *‹ÆŸ@O?>Óg•@OVkŠ„D@OlÅ-30=@O‚‹Eîóô@O—ºôuç@O¬QZx§@OÀKœ÷E@OÓ¦å¨àw@Oæ`doS¢@OøuPä@PñuõÅ„@P S@«ÇÏ@P^´Ê-,@P…¯t¥@P$mnÁQ¯@P+n4N@P2¤oÛ@P8\—î¸@P>Gó"ZF@PCÔ¦Õj@PI±-(@PMÎ' ‹@PR9 !õ@PVAœèø@PYçËU’@P](½C3@P`ô‘í£@Pb~+[8@Pdå*Òi@Pf=¸ìûÿ@Pg„QR3k@Phdm"ôc@PhÝß^¦@Phð RR@Phœ{sÀ@Pgá±OßV@PfÀXU„ò@Pe8©ïQ9@PcJô&yx@P`÷˜ékÑ@P^? ­@P[!Úü.%@PW ›õòÙ@PS»ý¼®—@POt¾Ö@PJË®}Öð@PEÁ«í\Ø@P@W¥—ÂO@P:Ž˜]ÝÔ@P4gŽºq@P-ãŸèw @P'ïûæ@Pɪ-îÐ@P6 ŸVü@PJNÐAq@Pí/@OþßrSK‚@OíL)@OÚ‰~Š&@OÇhT)Ä@O³§^@OŸI¾æê@OŠQY¨Hò@OtÁ ê|@O^P~Ä‘@OGçKõ2@O0¢s#µë@OÑ¥‡³¯@OwÀFD@Nç—'.Q@NÎ4¡î±@N´Oíü“Ô@N™íü|&Þ@N¦9g@Nc»¶“"I@NGðÒPb,@N+²ÿR›}@Nßö~^@Mñé n@MÔb‡9Ï@M¶r~ þ@M˜Àš”±@MycLŸÜ¶@MZH†c)@M:ÎÇ Mç@Mø\€+@Lúlj=æ%@LÚ>„ZÄ@L¹_ytE@L˜,ˆ²q@Lv§ÆÊÞ@LTÓ=N%@Mš?¤äcA@M·§ÂZªû@MÔ¥fŽœ@Mñ6Œw€@N W<ÖÓ@N)W!ˆE@ND@Ç6ý@N_ëIÝ[@NyMäxx@N“¦.¥@N¬fÖæ†Q@NÅ1ñ¶ ó@NÝx67a¬@Nõ6à,UÓ@O k(S!Ž@O#E^½@O9)lü¢Ø@ON­Ôô³X@Ocœ´LðU@OwóD†òR@O‹®ÂéSo@OžÌqØä2@O±Iš@BŠ@OÃ#âc@OÔW¤ˆj@OäãF52@OôÃä²Å@Pû4¶²@P =­çì@P%}L`Ö@P³™€?.@PæL'–Ÿ@P"¼…a׉@P(5A`Œ@P-O‰4ñ@P2 s“?)@P6e%›Ä:@P:^Ó‹M@P=öÁn©€@PA,CÆ´@PCþÀû=@PFm­ P`@PHx•òv@PJ‚v‡@PK`Ö@7\@PL=Ÿ†ð]@PLµDЧ|@PLÇ®d3@PLtØ„Xÿ@PK¼ÓýN'@PJŸÄ-EÛ@PIà?|C@PG7r¤ò@PDìØÉ¿µ@PB>‚Ælå@P?,òîý³@P;¸½_¡º@P7â‡ua$@P3«:î@P/Ãô¨@P*O‰ùJ@P$ÄÑ®b_@P{@³Ô@PÿKxˆH@P’Mê”@P Ê™¹3)@P©PÁÓ‚@Oú_=‘ Â@Oê½qEëç@OÚo¶Çć@OÉx—¢0@O·Ú¨NÌA@O¥˜ŒK¿L@O’´îÜ !@O2„Z3k@Ok,5ô@OV\;Wó@OA ã#N×@O++ÇÆ{q@O¸³* Ž@Ný·o·ÖÑ@Næ*Ç;>Ã@NÎÒ5B@Nµzdïã@Nœ\2k @N‚½§©oÛ@Nh¡|Êù^@NN cñn@N2û’Ç–@NvÛŸù@Mû~ WP@Mß©\i©@MÂ?\¿aü@M¤ý¯FÐ4@M‡Sd£þ@MiB ±Iû@MJÌä¨èˆ@M+ös@M ¿¸´u@Lí,FiiÜ@LÍ=çÉ•a@L¬öÌ32@LŒYê^@LkfåˆÀ@LJ"A´ù•@L(1¶Í@Mj¾0ƒžµ@M‡â~³X@M¤›^¥€ @MÀç{öž€@MÜÃüËÓ¤@Mø.^=ýr@N$•6ò@N-¢Å¼ý@NG§6úû@Na/i*þÒ@Nz8‚Åxx@N’¿Ú_}@NªÂÂ{ŽÉ@NÂ>Š[xË@NÙ0~âk³@Nï•ë†þ@OlRx@O°Yó{f@O/_ôÝW2@OCxƒ‰”@P(á´†R@P&<¨ùá?@P#6\Ô±&@PÎÆÌ #@P„ðm@PÞERtL@PVÅmñ @PpÑŠu„@P -D@PâÞÿ@Oû"$œ@OîtŸi3Þ@OáÌ0å]@OÓÄÌ:@OÄ@ÆË~“@O´Ó&9ÿ@O¤»D?%ë@O“û‘€:î@O‚–‹Æ4„@Op޼×V@O]æ·E§u@OJ¡hÖ@O6Àƒ‡ÊÈ@O"G¢:Á@O 9"»AM@N÷—¶¨ò¶@NáfÒµË@Nʦéè_@N³\ñ96A@N›ŠÞôì@Nƒ3a(ïñ@NjY)m®á@NPþáÏ#|@N7'0¸˜#@NÔ·I¡œ@N ªÅ8@MæÉÑpt}@Mˇ òG@M®ò·I©Ã@M’`ßÜv³@MucuõW@MWüåæø¦@M:/’Ô‘@MýÖkmj@Lýj¦£+@LÞvWœOð@L¿%SÒž@LŸxq¤m¦@LrŽØ@L_‰ë¢æ@L>cwÞ™½@L^`RÏ´@KüA:§Q@M;z3¹`@MWé:4¦e@Mt_W[®@MgÁŸ0@M¬´¶UÂ@MÇ'„5Zø@MáÙ³2þ=@Mü¾²Ÿ`@NÖ—Ý9@N/A=ÀÅ@NGá–Cü@N`&„u‡@NwçqûI@N!¾J­Ø@N¥ÒÌ^â@N»÷úéú@NÑŽ©–¡w@Næ”94 À@Nû ˉ@OáŠÂaå@O"$ U²@O4Ë7]?c@OFÔN„ÓS@OX<ã¬þ@Oi€¿ì@Oy"ºÊŒ@Oˆ›3h6í@O—iš3ô¿@O¥‹®=æ»@O²ÿ?‚íð@O¿Â0dΚ@OËÒw Î@O×.B¼F@OáÓKE®@OëÀ4øXH@Oôó0Ú`=@Oýj­ip@P’š°[O@P¸\@P /Þ¨Ö@P íz@PJYçy`@PF\ú{»@PàÊÇÈ€@PY=@PïÏŒÏ@Pdàªl@Puè2¡§@P%rΉÅ@Pr´_qõ@P]Íq>½@PæðS”$@P`í Š@P Ôt@P 9‘Z´!@P>.‡Î3@PâÓ]´è@P(ߎ@Oø@\À÷@Oï.H6ÿû@Oå„Ìîàã@OÛ"qX#@OÐð÷+`@OÄ:!ÛöR@O··ð4@Oª„]»”@Oœ¡t©Ç@OŽ„·Žù@O~Ö¢wä/@Onó%¦× @O^ig¼³Û@OM;ÏEë/@O;lÎu/¸@O(þá¼2á@OôŽlbV@OPa`äæ@Nîí²ï‘@NÙDËyg@NÃâ–”ž@N­ðí†ß@N—rpZE;@N€i¿”\æ@NhÙ{7Ê@NPÄAÔ,@N8,¯¤R@N]º¿B@N€á<]@MëqÊ©>g@MÐê¥3%æ@Mµíö!‰i@Mš~P@O|F>YS,@OˆÞpÚ,É@O”Åü˜4@OŸû #/@Oª{³¸)t@O´Faƒ?&@O½Yoòõ@Oų^dÇî@OÍRÇ@…É@OÔ6a ß&@OÚ\ÿm_@OßÅ”42×@Oäo0#9›@OèYÂÏ—@Oë‚` Öú@Oíê·§Ï@O0Àæ@OðvÄîGZ@OðšÀ˜L@Oïûakj¼@Oîšêú9·@Oìxã§ì]@Oé•«¨ì¸@OåñÄØÞ@OáÒGC¨@OÜj—³ùü@OÖˆøáæ×@OÏéøÛÔ˜@OÈŽ¹æã@OÀxx£—å@O·¨’ð5×@O® ~ð¸3@O£áÍÛÚß@O˜î)ý}î@OGUvS×@O€ï(ðì™@Osç’N,@Of2“K3@OWÒ@"»ó@OHȾ+ν@O9Bw¸[@O(Ãp÷É@OËx|Õx@O3Ö¡.ì@Nóþ‘/æ†@Ná.yG @NÍÄà†‰Ä@N¹ÅiÝ @N¥26N¨¿@N ÌÍjw@NzZ·Tè«@NdØ6º@NMR¹?j§@N6êq‡2@N.¡k‚‰@NØhd‰‰@MíÆÿˆL@MÓ°A‰ì @M¹ãXGV@MŸž†Ë0õ@M„äC\†g@Mi¶þin)@MN"¡@M2 l„¯@M•(¥-”@Lø³¼°ä@LÛk%²²@L½½²u@LŸ­2{H‚@L<_\S @Lbm1´–ª@LCAÊoW´@L#¼A>r@LÞ¤wÎ@Kãªù'a7@KÃ#:´[b@K¢I[%FÁ@LÛ—ß¾é@L÷dêøkc@MW&)—@M.ÛüPP‘@MIñ|†ý@Md”#YCã@M~¹ŸsP@M˜zv“–8@M±¸ï޵Õ@MÊ{µ’å!@MâÀUë“@Mú„ZÙãƒ@NÅLM8Û@N(€°¨í@N>´ ë@NT\èÐ&É@NixÉ9$@N~7Ÿ²†@N‘ÿ¿Ù§W@N¥eñÊžô@N¸5b{BE@NÊk­:KŸ@NÜtÆð‘@NídƒÈø@Ný`1±;Æ@O œ®\@O0r?M@O*ŸŒÕÚ¶@O8eÕàç<@OEGÄ@OQïëÅ+"@O]¯âg@Oh¿\e@Os¢g^r@O|Æ| º@O…º"Ð&”@O÷b„Ã@O•|zÅ–®@OœH/ÐZx@O¢Yaë9´@O§¯H—t@O¬HOÖ‘V@O°$_øÁh@O³B—*äA@Oµ¢m‹/.@O·C{KM2@O¸%y(@O¸H@ÔO@O·«ÊA*&@O¶P2œÌ@O´5´Ù@O±\¬Pxp@O­Å•ø m@O©q §®=@O¤_μ™“@Ož’³I»m@O˜ ³cMe@OÈäW¥ù@OˆÎwÒ£@O€ºíÓ@Ovµ/ ¦@Ol™w$9@OaÊ*âµ@OVJ/ž¦¡@OJÛ²zc@O=> Â,…@O/µ§ÉŠõ@O!ƒµÒÖ¡@OªDªv@O+t‘s—@Nó sðaG@NâF~ ?(@NÐäÙ¾È@N¾æØ3ˆŽ@N¬NÓªøw@N™.D¹Ê@N…ZPÑý{@Nq©°ó·@N\«²U@NF¤Í¿E@N0£†A@^@NQPÖÈ@N¨ê@Mët#.R@MÓ]â™ ¼@MºÈ´¬H˜@M¡¶ðAœ@Mˆ+Âbü@Mn'a|ä @MS®k Ò@M8„±ª@@Mf bŠ@M›T`Çi@Låd°\ly@LÈÄgšÃ¢@L«¼»WL¼@LŽOåAY@Lp€‚NŸ@LROxéíZ@L3À-Pç~@LÔL š@Kõå ƒ<@KÕîþä­W@Kµù—›Š@K•¯¤Ò@Ku-Ç@Lª¿âòYð@M—óbh—@M¯ù£@MÇ~tåü@MÞS†>D@Môÿ5ª¨T@N õ²·ÀL@N bb¢Êû@N5BÞÒ©Î@NI”à £@N]U®kÍ®@NpƒDb«<@Nƒ-Æ}Ü@N•ã«_@N¦€¿š€¡@N·IÞƒ%@NÇt@HK@NÖý¸î@Nåä)Ö׉@Nô%- M@O¿¼$û@O°çdä @O÷!†í¿@O&›±™@O1{˜*i@O;¶q´Á@OE?–ÞTO@ON\«à@OV6óAð?@O]¢®"@OdWÒâ×@OjSkÙHÁ@Oo–¿¶#È@Ot #ëA@OwîÚ4Qû@O{B=Ê@O}YÙ‡Æ@O~õ= Ü@OÔ(KÊ–@Oöv3Ý¢@O\! ±@O~B†X…@O{ò¢€@Oy"ìƒæ@Ou˜D*Ð!@OqR°µ®@OlRã²"Î@Of™¯ÿ@O`(µýf@OXþå©Z@OQ}ò”û@OH‹ 4r@O?Båÿ²Í@O5H€*P @O*blX@OC+ô?@O;‘PÀ@OˆZSÆÚ@Nù+bÌ©Ê@Në&—e“‡@NÜ{õa±J@NÍ-‰1kg@N½=m7þ @N¬­È’t¨@N›€Íádc@N‰¸º©ø@NwWÓHV•@Nd`g‰Ý†@NPÔËÌyH@N<·ZǤ²@N( sêhã@NÐzV'@Mý Óãk@Mæ¾è1:e@MÏì¿;@M¸•ãøs@M ¾™ès°@Mˆhªn™@Mo–xŒ:Æ@MVJe7¾É@M<†ÍÐc®@M"N ‰úw@M¢rà­Ú@Lì†S}@LÐûõÄ?*@Lµž^G@L˜¥‰à¢@L{Ýîm¯@L^°ûy@LA ×(µr@L#/¢Ã&ð@LßuÊ\|@Kæ2`# ¬@KÇ*ivóZ@K§É‘ $v@KˆÍ´:8@Kh ©¿U@KG¥6Š—@LzJÜò]@L–(–IAé@L±›—‰Ì@LÌ ?ª @Lç5¾n9•@MYZ~¶Å@MΕä¶@M4AÑ 5m@MMT‰×@MeGG ÏA@M}i*@M”W.àd@M«4Çßê@MÁ^ÓàAC@M׳ø`à@MìK~˜©™@NñßÐZ@N ƒP@N(“xl@N;‰cEve@NMë¿ç•@N_µèaœ;@Npç´T^@N~GˆO@N‘w~Ð&@@N ÑB6º@N¯‰…Aç@N½žIoÙ‚@NË žÁü@N×Õ¤yƒœ@NãôŠÊ; @Nïh“ÑÊ…@Nú0¼U¶@OIvÞ &@O ³8Æ1{@OkïI«@OrF¡J@O%ź…Ö@O,ch @O2K9êŠM@O7|¾^ƒ @O;ö¼NÄ€@O?¸}UŠ‹@OBÁg©qö@OEþ•:3@OF¦âÙ‡@OG‚Ò÷ëß@OG¤«f¶œ@OG f­\@OEºg‹«@OC®41ë@O@èu‡´à@O=iÝj“^@O92Í“@O4Cð³æm@O.žyÔP@O(BnÒ@O!0ïŽú@OkÇ*@OóÉžy~@OÊBjó@Nýð”F&¢@Nóh8¨Yw@Nè2¾£/Ì@NÜQÉÖ4G@NÏÇV Q@N”^Ž5@N´»ŒCÚ@N¦>„¯Œ6@N—AÕkâ@N‡_ÊÛ€@Nw3 %³@Nf›rC8@NTu+ê0@NBJÍ[ö@N/‰™ö^J@N5ôAˆJ@NQn‚k¸@MóÞU€¬@MÞÞùý)¦@MÉU¯Á"ž@M³D̵Æ5@Mœ®¨n@M…•™M‰ @Mmû÷Éÿ|@MUä¡×¨@M=PS-xl@M$BöN\/@M ¾QÐ5t@LðİԋÀ@LÖXZH©B@L»{e¦Ç@L 0:Z’@L„y‘>æ @LhXÄñ˜e@LKÐV|Ô@L.âje¥@L‘B¬@KóÞˆ{Â@KÕ̸ Ï@K·]´Zë·@K˜“}¥ú@Kyp ±Û&@KYõJDE@K:%%¦Š@K{»Äþ@LIªè2‚@LeIe­³c@L€}†*!º@L›DI©sú@Lµ›90 @LÏ€ùW@LèòyX @MíÅF@Mp“†m@M2xÀg#‚@MJèôå @MaÑFK@Mwš1¹SÒ@M ÃŒn@M£!?Çß@M¸`ò!@M̆㳣Ë@Màg‡²Ê]@Mó¹xÉX@NyF^ù @N¥÷„Q@N*<øÈõž@N;<&Óª•@NK¡gê3@N[j¨êE<@Nj•戟Ï@Ny!&9Ç'@N‡ {`—@N”P’åc@N ïû¶Ö6@N¬è™1H@N¸82j|ä@NÂÝ,ÿœÛ@NÌÖ©)Õ@NÖ!=΋D@NÞ½„ba§@N橎ÑÏž@Níä-è5?@NôlJ¥ú2@Nú@ç Ê@NÿaÅÜÔ@OÌ'ït@OSÖ'@O €!_@O Çàf@OXn Rë@O1yC„û@ORߥ®@O¼›óv%@O nÅŶ@O i‘z¤@O­P y(@O:nÓú@Ow7Úê@Nü3@Ê6@NöŸôþ»@NðY–z2@Né_1fáœ@Ná³‹Žƒ@NÙW8ŒXk@NÐKvHÜ@NÆ‘šŒùP@N¼+j“@N±TòÂ@N¥]þàÒ@N˜ú³×’ò@N‹ñ,TFž@N~C1œ‚ü@Noòœ¨ž@NaU ù@NQqOÜyE@NADŽšrÐ@N0}2«@NpHn@N &”á™g@Mú›ÄØ3@Mç~Ôݽ-@MÓÑúœVø@M¿—pæ’¯@MªÑvÇ/¯@M•‚N™z@M¬=(.@MiQˆÛ\@MRtxæ/’@M;T‰2ˆ@M#@N¼rÿŽ^@NÂ4Œxî.@NÇCô-¦’@NË tÐ,¶@NÏIfm@NÒ>;vY@NÔ~(¯·@NÖ ßáü@NÖàcü@N×ûש@NÖlÁ£Öæ@NÕ#=þ)Ÿ@NÓ$ºHta@NÐq„5`!@NÍ ²¸è@NÈî¿›šZ@NÄ SW0o@N¾Ÿxd³Ž@N¸mÕdý@N±‰×µló@N©÷d”—@N¡µ•ßìÍ@N˜ÆÉý†G@N+ä›o@N„æBÃ7!@Ny÷UÃFä@Nn`¢?Y%@Nb#¿9l€@NUBU€æ@NG¾’rI@N9˜ÝÎ;þ@N*Ôo3çê@Nr´wa @N u‹Y@Múß%™Q@Mé±Qûé¹@M×î1@Mv© 2.@Ma’ÕÜL@MKöh=SÁ@M5ÕùÐ_@M3ÁæG(@Mø9¯s@LðrÔ7°B@LØXŒVØï@L¿ÅUu:@L¦»b@¶@L<â¤s@LsLI5@LXêíEë@L>Ä®ö@L"àª#O…@L;¸v"w@Kë/HMB@Kμ ‡0@K±æ”ôA@K”®ã¼<@KwŒƒ“Z@KY"„çÆ@K:Ѽo½Ž@K'•¢.@Jý$ƒ›¨ö@JÝËÎq+¢@J¾Θ³‹@KçëpÝ7@L[¥ß@LÊyÞÔÆ@L8d×@LQõ {è@Lka;c¾Û@L„Yî\ 8@LœÜú%ŠÖ@L´è:hÑT@LÌyˆÐM@L㎽™-@Lú%°/™Â@M<7Ïô™@M%Ð,3Q‹@M:ßfCL¬@MOgÀÖQG@Mcgsêå@MvÛQ Ö„@M‰ÂM2yø@Mœø)V"@M­àB‘÷G@M¿#ëÔï@Mϰ›•€„@Mß¶±½p@Mï#xV o@Mýõ 9-@N )•OK@N¿I)³Q@N&´ja@N3J]@N>¶J"ì4@NI¿ÛJªü@NT"€ï5ó@N]ÜЙP@Nfís"o@NoS%’‰£@Nw ¹ð‘q@N~ xG@N„w>6Z@NŠ&Aø¯@N%P­+@N“s°.J@N—¾ïñ*@N™ûõ=$·@Nœ4äÐç@N»9†‘@NžŽ¹‡éß@Nž¯EtJ…@NžØvYx@Nœ×ˆIH)@Nšß…(‚¬@N˜5¬¦6@N”ت•yâ@NʶDö@NŒ Õ‘ý@N†œ¹ä@N€~*¡GÜ@Ny± S34@Nr6Wfð@NjòZ$@Na<€¡@NW¿¿HB’@NMš)hz•@NBÍ"ss@N7ZhWž@N+B©¹U@NˆZ.§@N,ÙXòÚ@N1ß¶ k@Mô™3,Än@Måd¦×–”@MÕ–â@MÅ/vŽf@M´2±=S™@M¢¡Çwáã@M~¾ýQé@M}ˤÕ!5@MjŠŒf(D@MV½Ž“p@MBfÈßT@M-ˆ\•ss@M$mûä@M=#Œ)@LëÔ¥3IC@LÔíœ!Õ@L½ˆ¯_P@L¥©ˆþß@LQϹ@Ltƒ¦±Ô@L[A2Ó @LAŒ“W—+@L'gäÙúï@L Õ@+á!@KñÖ¹ëQ¾@KÖnbÐe@KºžCßC«@Kžhdúh@KÎŰ@KdÓ`job@KGx){¬÷@K)¿êô@K ©ø@@ @Jí:ÆY´@JÎsSBF6@J¯Ura÷@JâîæÇ—@K¶Ï¿ ”@KѹH Ze@Kì7ÂõÕ:@LI'à@Lëjìåˆ@L9|·Ç @LQÚJÂÐÀ@Lj"¿í,+@LóÄñ™@L™K@ìåm@L°'ìs‹@LÆ…5„ÍP@LÜcyp:þ@Lñ¿Ì5I¸@M˜Õ ¸@Mê@w@M.´9Yí@MAóñ0ƒ-@MT§]TÈ9@MfÌxeh\@MxaC'ª@M‰cÅc§ê@M™Òƾ¶@M©ª7È c@M¸êb‘½Ý@MÇ»ìK÷@MÕ›|+{@Mãè;—@Mï×Qò¨@Mü3ÖV@N°¥„æ@Nx•/v@N»XÀ·Ç@N&Wž,Ù@N/LþV2@N7—˜Lú@N?8ó{º>@NF/øJ/@NLy"êùö@NRÛB@NWEGF(@N[Eæ-`Ž@N^×e†â@Na¹@³A"@Ncë Ó¥@Nel|@Nf=SàT~@Nf]wþö@NeÌá@Nd‹¦½Jº@Nb™ö]Ô @N_ø£Ã@N\¦kX’H@NX¥k'¬c@NSõ©C @NN—ÐO@NHŒ¡f  @NAÔö£:º@N:q¿}üt@N2dµø9@N)¬ØU˦@N MrûÖf@NG@N › “~@NJÛ½û@MôWâð±q@Mçõ0M @MÚì†')@M̾1¤9 @M¾P:ù_5@M¯GËÄ h@MŸ¦³$xF@MnË/-•@M~¡ø¶@MmB&Õ[@M[QM-Š@MHÑg¦8Ô@M5Äy¨h@M",ŒqJ@M ¬R€@Lùcì<¯@Lä7`”Ý@LΈ  ˆ°@L¸XEfq@L¡©èõ8W@LŠ%½Ž@LrÚîU\@LZ¼ÒàQ@LB)t}Ü…@L)"¿.Ð@L¨»%€â@Kõ¿„CÛ@KÛhyIV˜@KÀ¥£žÿT@K¥y}ÉÓ@K‰ä¨—‰@KmêÂnÿ@KQŒ„¬K|@K4̨”‰Ê@K¬× ­ö@Jú.õ¿Ä@JÜTä;¦e@J¾ {Êc&@JŸ“C@†@J€¯êëY@JawTWt@K…Ž;‡=Ð@K <ë˜ ¯@Kº€¦°n@KÔWo/cí@Kí¿E ²@L¶$V1„@L:’ÍÀ@L7Hã’ @LNà¯%½Å@Leÿ_,7K@L|¢æ”¸Ž@L’É8µ~²@L¨pIXpÜ@L½– \¤Î@LÒ8{_r@LæUŒj’_@Lùë<®@M ÷Œ9Ê@MxÂØ)@M1l!k­@MBÐ’@MS£·¤ÒC@Mcãâõ†¸@Ms+˜Ã¯@M‚£Ã@ýí@M‘æÌk@MŸÛÁìÛ@M¬G÷ú¼[@M¸ð›»?2@MÄú5öÈ@@MÐcDG×@MÛ*TßB6@MåN/h¥@MîÍæÌG@M÷¦¤ :@MÿØ ò9@NaÏþ;È@NB^J3@NxÈRs0@N5(oî@Nãáÿ¤Æ@N#"¯(:@N&b$|è@N)v"ÇéÜ@N+ þÑ™•@N-¨Žù`@N-ëê—êá@N. §ór@N-|Ü+¨X@N,?›PÊ#@N*TëkR@N'º„Ý× @N$sQ4Úa@N ~ëè5ÿ@NÝá‹1@NÕí¶@N˜ƒ®›Ò@N õ»¿¿]@N©dÜ­­@Mú´zô­@Mò‰ý@MèÕDjÐ@MÞíRð0@MÔa…_ q@MÉ36ù·@M½cÔI.m@M°ôÙÜÖ@M£çÓrd”@M–>[®Í@M‡úU½P@My¿<(Ä@Mi¨“¯(@MYÓòëC@MHÿàà $@M7Ðò^_@M&Rökš@M‹gD@Mè°Ù@Lí„»!%Z@LÙ˜ªÍjÿ@LÅ&ƒR©@L°0E)@Lš·þT^œ@L„¿·—»Ì@LnI|×ó@LWWZ¥Ê2@L?ë]¥ @L(‘óE@L®›Ïõ@Köà¹×@KÝ¡¼­qü@KÃó @MÓ¥3 @M-æ¹Cç,@M=f$ˆÅI@MLP'òˆe@MZ£qö½@Mh].)–@Mu|éCŒ×@M‚®ÆÙt@Mæûkj@M™.ZiIÅ@M£ÕfJ p@M­Úɱ! @M·=@c~@M¿û–§ˆÝ@MȬÀ¥@MχtÔ».@MÖRôúäm@MÜvGЉ:@Máð›¯ç@MæÁ5ìPZ@Mêçp—ñ¹@Mîb¼Dªà@Mñ2  Šh@MóVºD¦i@Môοö:@Mõš}×¶¦@Mõ¹Ø •@Mõ,ÊJ…Ó@MóógÝu@Mò Û˜uM@Mï|g½Ú@Mì?eË9 @MèWFG{@MãÄp{«@MÞ‡áåë^@MØ¡îA»=@MÒ~£îÉ@MÊÝq1Ç´@Mø‰þ@Mº~[( @M±Wr˪)@M§+òW@M Ä>× @M’‹-N@M†fáh@Mz57{@Mm5³Ÿg@M_²ÜWG@MQ—UA„[@MBä ú@M3šÌÃð@M#½80Y™@MMão@@MLIq‘Ñ@L𼔞ɸ@Lޟܹ@LËøþl±@L¸Æûs<Í@L¥¬‚C@LÑ Þ@L|Ž«”@LfͽaX¤@LQ ”¸@L:Ìæám@L$dÐF-@L Þ}\ž‹@Kõ3/ź´@KÝzŠOê@KÄ~Zå8È@K«xÌQ6e@K’È·–@Kx!DΘ€@K]Ó6Ň@KCŒ¦7@K'ü3C/,@K wÖu<@JðŽ¾—M@JÔC 5Ñ@J·—݈…Ÿ@JšŽZÚ d@J}(Sï @J_g’ýF€@JAMÜ€.e@J"ÜïÞe@JƒNX¿@K"Ãn!@K<ÙI4@KVªúi@KpT\“a@K‰jÓ…@K¡‰GïI@K¹œ&©É²@KÑ:²Â¶@Kèbú?áˆ@Kÿ ƒwo@LHðÐû@L+ºÓØ`@L@>w9n0@LTú6@G@Li4 Y_J@L|êÍ Ã@LJb±@L¢Âì·æ@L´â°‹ì@LÆuÜ·rš@L×|€ó°ë@Lçô1M|@L÷Û*‹.Â@M/²-×@MðÍÞ@M$±½ýš@M1­æý­R@M>¨&pgñ@MKì’»@MVËÃ?±!@MaòB|Òé@Mlz6¦ë@Mvaæ à@M¨‡ÔÆ@MˆLθ°¯@MM¤wñÐ@M—ªAvY@MžaDÅQ@M¤q¸D_i@M©Ûdß*@M®OG€@M²¶Ú?’Ä@M¶'zõ@M¸î½Kõ@M» B€¿@M¼Ã2|ž@M½I Æe@M½hlÒ™@M¼Ü¬¶@M»§ +“@M¹ÇVô–œ@M·=ÆCÜ@M´ ²/‰v@M°.‡€@M«©Æò"À@M¦} ¸€Š@M ¨üGŽ–@Mš.`R"9@M“ Ôü2@M‹Hè’’–@M‚ßó„T@MyÔ'1IC@L5*nö@Kð±Nf>ô@KÙ´…½Û‰@KÂ@Ã.À@KªWøýaC@K‘üy„r@Ky/„´(@K_òÒFA@KFIEûôï@K,4V÷r@Kµèe…@JöÏß^¦{@JÛ„Æ6j@J¿ÔrPêÖ@J£Â¿`@F@J‡PÒÁ@Jj€yoì@JMS{b7]@J/Ë›U-¬@Jê–¡GÛ@Ió²%•@IÕ#øÅ“e@Jðñ/®z@K ô[v/ó@K$ŒýŸx§@K=¹8q¦C@KVw+À…Í@KnÄõ=±/@K† °àÈÖ@KžyU×@K´úhqãæ@KËt—­ºc@Káu ¦ÖÛ@Köú¦oó@L ª.‚0@L ‰ãŒ¼°@L4és% @LHÞ–=(@L[éPlh@LmŒ4JaÀ@L{ï(7@LáO:+U@L¡º2æ)@L²ôÞÛ×@LÁÁÇàAÇ@LÐì\l¨<@Lß„ ká@Lí‡F[?ó@LúôsÉ& @MÊ[r@M±jÚY@M¨ádšm@M*¯H‚‘Q@M5™„Úö@M>ã–eL±@MHD×@MP™ëÛ¨p@MXƒ=Ì@M_É¢‘–€@Mfl›À¿¨@Mlk0Ýö@MqÄ §@Mvx;}Ö@Mz…ihŸ³@M}ë¤ßJ6@M€ª}âëÃ@M‚Á™¸¤f@M„0³!ð„@M„÷šˆq´@M…6ý@M„Œã¡‚@MƒZ¾ïŠ@M€‡[Û¢@M~þ¦ï8@M{Õ>ò‹õ@Mxº&›7@Ms•@MnpaûÌ?@Mh­ÇcÆß@MbFöì@M[;YðQ†@MS6¥ó @MK= pè@MBKÙõò@M8º½Ü,o@M.ŠÝà£@M#½rS´î@MSÃÑ@M O&y­Á@Lÿ±cAu@LòzŸL@Lä­ò Ü@LÖLÓÝ‚@LÇV·”±@L·Ï†48›@L§¸&/'@L—IÚ§Ž@L…ß«¦Ï @Lt" asÊ@LaÛ7|ûG@LO øYØ@L;¹#“Ìw@L'á‘SJ¿@Lˆ£Xß@Kþ®§ÌO@KéW³¿á@KÓƒ?AÍ@K½5Ì"Ì@K¦n{†Àh@K1VúÀÝ@KwŽƒ/±@K_[Ða@KFŧoRš@K-ÁP\@KOã–i9@Jús?¹åù@Jà-@¤¨²@JÅ¿cŸ@Jªl|zò@JŽõ†iY0@Jsn‰_W@JVãCJ@J:K6å@JV›|ÚÙ@Jü†ym@Iâ^Þ=é@IÄ]†‡ïP@I¦ '*@J¿#8fHn@JØî×[ %@JòPT—@K E-»Ç@K#Ì;¿ÖÌ@K;ãl¾†G@KSˆç¢áÑ@KjºÒU+…@KwR, k@K—¼ŒdZ@K­ˆ¦žV@KÂÙÇb O@K×®¥ÐŠ@Kì¾^ÍQ@KÿØëV|@L+ÌsÃÆ@L%ú•÷ÙÜ@L8C€Àt@LJÅÿ0*@L[<¬{@LkézíT@L| ‚–Ð@L‹›\l@Lšœ¤ÆÉ-@L© ‰i1+@L¶é<‹ò%@LÄ1R<}³@MBS'JÏ@ME¯@KÙ@MHeæU)©@MJvÁÿ«_@MKá•ÉÐ@ML¦$@NJ@MLÄd!ôW@MLEAlY@LÕ[zúz@LÈàœC§@L»Ï0]=@L®(CÇ|@LŸí¹Þ Å@L‘ ù» Ñ@LÕö´~@Lq×*Ù€@La]]m²‡@LPWÚÉÁ³@L>ÈW\ŠÅ@L,°Ž;Ü«@L@u×L@Lï4e•J@KóI5 ‹ö@Kß"jf@KÊ{›åöf@KµW©¬¼@KŸ¸™¬@K‰ž®>š'@Ks X'¸@K\ê‡Ô%@KDŠ@³€@K,œ3I®@K=„Ñ/@JûpWÙÂ@Jâ66W“3@JÈ‘äÆ0@J®‚µ¯,P@J” öî+(@Jy1Ÿ¿!Ð@J]òxÙ-Æ@JBQGFH@J&OÌ!œ6@J ïÄZéß@Ií2è~Ûˆ@IÐì„Ã@I²©œìÖ@I”àL g–@IvÀ÷¨ï@J4ðâ=Ñ@J¦É˾0)@J¿ô|ÉÍ»@Jس:Ib@Jñ8“°„@Kåªpä@K UÁ~ðM@K7R®›gB@KMÚ¢RÅ@KcëÍU*3@Ky„`ðx@KŽ¢¹‘@K£D?¾3@K·h8ÀÂ@KË ÑlïR@KÞ/ž"@KðÏhçi@Léxùp§@L}7’@L%ˆŽº¦Õ@L6 Ôd¿.@LEÿe“ì-@LUg§ @LdAîé?@Lr‰øˆ6n@L€@þÝóç@Ld£mûÍ@L™ó{ØâÑ@L¥ì)Ž™H@L±MZyÃ@L¼ɤ &@LÆD?ä9g@LÏ×”rÉ™@LØÎ­j@Lá( g@Lèäp@Lð€!¦@Lö|ê8@LüX*k@M’´gp@M*¾‚c?@M œ‚O@M rS)ÚN@M ú$Ù@M+½KèY@M’\SÙ@MT«†R@Mr‘…nò@Mì 0u@MÁ+.¿H@MòÏbI@M~þè|Ü@M h9~G-@M®$l¤ý@MQ4-[›@LþQð’÷a@Lø°ôxÀ2@Lòníh*g@L댛4>–@Lä Ï‹~³@LÛêm€Ù‚@LÓ,i F—@LÉÑÆƒ­e@L¿Ûš À@LµKx @Lª!?xæQ@Lž_ƒb A@L’ &jï@L…oàÀ@Lw—ضÃ.@LiƒÌ3íÔ@LZÞÆ•4@LKªN ô@L;çòi5`@L+™Kº‚„@L¿úQ¬ƒ@L ]¥¾›@K÷sü7¶Ó@Kå±òºß@KÒ€€tj@K¾œ&+ÚŒ@Kª¦e\Ún@K–2ÿ,­@K@Êí~®@KkÔ…a1”@KUïfçl@K?’ X Ø@K(¿rYä@Kyß¿€@JùÀš7¸"@Já—øB@JÉï*Ô¬@J¯ýK»¢@J–ŽØBCp@J|·]n*@JbxŸþ‘Ò@JGÔdý@J,Ìi64¦@Jbkûb¡@Iõ˜%K¿u@IÙoJ3Õ!@I¼é‹©y@I –XX`@I‚ÎrîÆ@Ie;£‡Â @IGRèZ·J@J['ai›¹@Jt†<ík¹@J{$ÿ–$@J¦Y ®@J¾ ÙÜØ@JÕÌŸÞb×@Jí*©°Ç@KÐôÉ ¼@K%9´‚C@K05@¶@KEi$„Œ@KZUD)½U@KnÅÕCŸš@K‚¹~Ê@K–-UÒ@K© Ò¥:Ò@K»‘Ü[ø@KÍ~Ãëu@KÞåß{µÍ@KïÅŠú„ˆ@L(¿èÁ@Lè".L@L'èV9@L-Ùôš00@L;üÉV„N@LIŽò…{{@LVf_=@Lbû¦"Ä@LnÓ~qx]@LzH:{¨@L„¿É4Wz@LŽÑÔ7†@L˜JKFä3@L¡(B^@L©jIVBÚ@L±ÞLÝ@L¸ú:Z^@L¾Í7OJ@LÄL—”B@LÉw«dcY@LÎl¦ a@LÑìQ›ˆX@LÕ4ãh@L×ۼΠ@LÙàx,Ý@LÛC0à@LÜ/à{@LÜ ¾M@z@LÛ›Á:¼\@LÚtGÚ>˜@Lتu°Å@LÖ>³~í@LÓ0¶'Æ@LÏpv¥É@LË1 øœÂ@LÆ@J²xÍ@LÀ¯ƒ ¤@Lºquʼn@L³°ÏÎ0@L¬DfLmb@L¤;\¼“@L›•¾ß„@L’UgM¼û@Lˆ{xX€@L~åûì{@Lrüý®ê¶@Lg[“ ÿ@L[$è’‚@LNZM1Ùò@L@ýžÃ[@L3¹´Ù¶@L$—ÐÁy@L„0*T[@Lë.n@KõÆ¥Øë¢@Kå£g‘@KÓâ˜ý7Ñ@KÂ&)q(€@K¯äü=h@K ¾š”@K‰Û"аË@KvÞG0}@KaÒ«¨`î@KMG˜‚é@K7Ùqˆ@K"&êæ¤P@K ýv¡HC@Jõ^ؤ}Ý@JÞLÕcö<@JÆÉ1fø¿@J®Õ°Ùè‰@J–t$æß@J}¦&‡—®@JdmŸºÿ@JJÌA’°¨@J0ÃÈ±Š°@JUï0&@Iû„lV³Œ@IàPôUß @IĽ8x@I¨Ê䧬n@IŒ{£°Õa@IoÑ“Ÿ0@IRÌê‘sÊ@I5p°ù@I¾ì´ý@J(ûˆû@JB%$úž-@JZåÇ$w@Js9|×s@J‹ É%nï@J¢™4þ @J¹¡Y®@JÐ6È,@JæWïŠx@Jü•}¢ç@K7»I'F@K%òªJ«@K:2­ ;¨@KMöñòÞ@Ka;)1)@KtG@9@K†CÃ¥âØ@K˜ûõ¥@K©?Rnú@K¹ô-Äò@KÊ ýrrÉ@KÙÄ6^ZŠ@KèÜUo¨^@K÷gßÈs&@Lecc7Y@LÓw±.^@L°¾8Vd@L+ûã0ž@L7³ž¥Ý@LBÖ²rx¢@LMcð²@LWZ4l@L`¸hâVÊ@Li}‡}lx@Lq¨—Y•8@Ly8¯0¬0@L€,õmKü@L†„ žÑ @LŒ>÷æ@L‘[SYðâ@L•ÙdM@@L™·Î,¨@LœöõmcŽ@LŸ–1ŸW_@L¡•4EÜe@L¢óÁÚs@L£±°g|ð@L£ÎêÀ@L£Klk?@L¢'E™(@L b˜Mcƒ@Lý™Œêô@Lšøÿrà@L—SØÆN@L“ÝJ|@LŽ-üö›@Lˆ¬(3`@L‚ 0’@L{Ò8MÙ@Ltz³<¨î@Ll‡åd Ê@Lcú²,§Þ@LZÔ ˜þ”@LQö"¸@LF¾€YÉ@L;ÑÈ~¿@L0OùÕë@L$:K‘ ä@L’ªÙ¾@L Xq%Ûª@KüŽîªqQ@Kî6á/ ˆ@KßQ·Z]¾@KÏàèå¼@K¿åõû¶M@K¯bf “(@KžWÊm‰@KŒÇ¶"R@Kz³Æ·+%@Kh^@KUßsé÷@KAq8/Ù¤@K-^Uw˜.@KÏè£êy@KÇ¥·B/@JîGBÛfÓ@JØPwãcæ@JÁäýÑä‹@J«Žd@J“¶ã¡có@J{÷·oxD@JcÊÃ+¨@JK1¿H¹S@J2.bñ¯O@JÂc±`B@Iþïu×@Iä·HŽty@IÊŒÇÀ"@I¯í¿×@I“ÀXa@Ix¦"ó¯@I[êE(È@I?u¶¦@I"§ ,ä+@I€ŒÓ]@Hèg±7@Iö²YP4@J§t4H0@J(3<Ï@J@S‹ÕÃÛ@JX,z7@JoLFÐp@J†!+ ëã@Jœ„)HäÄ@J²s’!‘@JÇí¶tkQ@JÜðéOë@Jñ{}Ä…c@K‹Êäu<@K ).ÉÞ@K,6ô‰ÐÚ@K>ÎŒ{~(@KPåT°Ôð@Kbyµˆsz@KsŠŸød@K„ýcïÆ@K”Ñ¡ïø@K£”†@K²…_ ‹ÿ@KÀë1yæ@KÎÄ)2@@KÜéØ2H@KèÊezÌ@Kôô€¬¤@LŒÏŽÏ@L ‘ÙŒ½@LxX'Ü@LÝ’^à@L)"PV @L1Ï©¢°@L9ãŽ,÷>@LA^¦_œ@LH?Šý3â@LN…yeQÔ@LT/¿/@LY=¹§HI@L]®×é£;@La‚™m£T@Ld¸-·1@LgP[·Q–@LiI³^›ì@Lj¤\h„`@Lk`/*ñ„@Lk}"ðõ@LjûÄ;@LiÚ%©¼@Lh~/ß3@Le¼J¿hë@Lb¿Ð‚5‹@L_%fyDS@LZíuL~@LVw U@LP¦÷X<@LJ™‘Jvñ@LCðò…ÈV@L<­×Ž·È@L4Ñ ÇS@L,[nêu@L#Mè)vå@L©r$ÒÐ@Lo6\@LŸã-$@Kù=Ælˆ@KíG›"®Å@KàÀì7F@KÓª9=P@KÆÒRS@K·Òß/¸@K©Y ùÐ@K™Ê!Ê@K‰÷¿ÖН@KyÏØøO@Kh½ÊÚPÌ@KWY;- ]@KEq±'È„@K3“¼¦@K 'z@K ¹&ÑLò@JøÕ»õ:@JäwnT& @JÏŸè4h@JºPÔZÏX@J¤‹ßÐõÕ@JŽR¸üI@Jw§+F@J`Š’*R`@JHþñب"@J1ÝÅ™@J¡ÍŠQ@IÿÒÄv2@I暺MH@IÌüŸ†¡k@I²ùmÄOz@I˜’Ë>1@I}Ê[Ï4V@Ib¡À€¼Û@IG—NHµ@I+6zí0È@I÷˜t@Hò]ÁànÝ@HÕlH~_—@H¸$"+œ@IÄL¿oòÚ@Iݘ%@Iõf*8H@J Se>¥@J$ÔÁ¤ä@J;æ«“¹Ž@JR‰kb¨q@Jhº¶6«@J~x楇@J“ÂXîo@J¨•gq,!@J¼ðsY.@JÐÑܰ¡w@Jä8zè@J÷!YZè\@K Œ>˜"@Kw#Ýç@K,à~S $@K=ÆÆ)Eƒ@KN(yì+@K^‚w”@KmX?ºpú@K|#pØÈz@KŠdM(1:@K˜x‰U@K¥A ³ó@K±ÛzOöÔ@K½åÈp9«@KÉ_V2Í*@KÔFúÁíG@KÞ›™*ç­@Kè\ ã+h@Kñ‡ŽIº™@Kúë$w@LOÄ$@L àøÕ@LOÒð"ñ@L„kmœ‘@Lýüß@L!êúñ|@L%ƒ¨Û•M@L)Lº¦àÄ@L,yµ!Øg@L/ > '˜@L0þ Uß–@L2Tè=A@L3«vcv@L3+A<ƒ,@L2ª¦\öÌ@L1Œé9¡ò@L/Ò)Àó¨@L-z™\tà@L*†zÕÙÑ@L&ö"2¸D@L"Éô‡/@Lg¾æì@L _$?@L£[>"¯@L 4(B@LÝòÄ=1@Ký­½Â„@Kô¸×9h@KëÃ)B±;@Kâ8¾@HÞVvÈ0@HÁñÕ ¦@H¥4ê<Ù@Hˆ!<Èø@I‘Ë ›þ@IªYÛ?56@IÂ$¿ÞÄ@IÚ9Þ!eì@Iñˆk9uÓ@Ji/ué@JÚŽ5î@J4Úë'4‰@JJhª­–@J_‚2?F²@Jt%èØ!*@JˆR7`„@Jœ‰!¹@J¯>L6‚ø@JÁúò xŸ@JÔ9ïÈëÚ@Jåù¾çà¯@J÷8Ý~ƒ@KõÏg„@K/ŽÃ@K'ãW­QÌ@K76m@KE¶ðýrü@KSÓ“ÂEB@Kaeª·‚ò@Knkí VE@Kzåy³z@K†Ð¿Ïª@K’+r6@KœöPI±z@K§/‡}A@K°Öv°ƒ@K¹èëYõ/@KÂg/`Y@KÊOù¹j:@KÑ¢w}ÚI@KØ]äØ@KÞ‰˜`@Kä Á-…N@Kèþó]ÈŸ@KíW˜a\@Kñ8fê@Kô:kÑÐ$@KöÃÛpw|@Kø²@ªY‘@Kúe¥dè@Kú½%bŸA@KúÙkÑݤ@KúZ5ÜzR@Kù?‘fû@K÷‰I¦(@Kõ8‰@8@KòL•Ï«_@KîÆ%Ÿe@Kê¥eëЬ@KåêýC@Kà—[¤ 6@KÚ«bÈj@KÔ&Åœ™?@KÍ "É3X@KÅXê3÷O@K½éœ6Õ@K´3üÏnr@KªÃ =ä2@K ¿Š!„@K–) Áö@K‹~­@KK42ÿü@Ks¡âÏ=@Kf2Š"¹@KXÓ(?Ę@KJè´ @Kô+@K•5„ j@K—ãYmT@K…eôîrû@K| †o!@KsHÇV@Ki^èyf|@K^ä”Õ¨@KSÚ›Tûr@KHB˜Ž‰@K< C @K/i¼|:„@K",QrT@KeÙlZ@K!i²G@J÷=î\¾¸@JçàÂêp@J×þûÅ·¨@JÇ™ü™¼q@J¶³/‡²z@J¥L¥Àû@J“eñLn@Jp–ôI@Jn#êŽÅ@JZÉ%yfï@JFödÌüO@J2¬H„|ð@Jì\ã-M@J¸0aëí@IóSCøÝ@IÜùW/#Ÿ@IÆqÎÇ}/@I¯|MN¦g@I˜fFÎE@I€M­n²@Ih´ÁÒz@IOz{jL@I6vNsó@Ill@IB¶ÛÚ9@HéúÚÉ@HΉW¶‹³@H³žUM"*@H˜Vxê½C@H|³EÊB@H`¶9^t@HD`Ò1„¸@H'´ˆ®@I,z ¨ù@ID¤A¯;@I\fË"F@Is½Ý²›z@IŠª>Æ2/@I¡)žZôv@I·:r9@IÌÛ0(í¯@Iâ Oè]þ@IöÆIòbc@J ˜®Ýž@JÞ¸°ne@J28)3Ú@JEl ~Ë@JW~PE/@Jig„)'C@JzÓp}Ðö@J‹À^î|å@Jœ,çaX¥@J¬§|…I@J»C!iž@JÊbdéÇ@JØ¿¾ ûN@Jæ– ÈÛÐ@Jóä„Å@K¨ƒÐ@K âP¹×@KKo?2@K#±[·ºa@K.Ds>#À@K8HŽâö@KA¼¶ýÍ@@KJŸÿÔ©£@KRñ‰þ/»@KZ°‚̳f@KaÜ$¯h@Khs· ¥@Knv‘)·¥@Ksä[ïh@Kx»¶vR@K|üõ}(¼@K€§bjc§@Kƒºœc8a@K†6Q鿉@KˆAÆø@K‰f7f. @KŠzm.@KŠ5¿„* @K‰¹; Ã@Kˆ¤“ÊÊ•@K†÷äÓd„@K„³[S¡z@K×3•Õ¼@K~c¹wq@KzYH@áƒ@Ku¸J{q³@Kp9¸hƒ@Kj´žV—ß@KdS>Ü¥@K]]1šr”@KUÓ¸ƒž@KM·d­&@KE  –¼@K;ÉqtW·@K1ù”1SÖ@K'š_ ÿ @K¬ÒÄÈ@K1÷Í¡@K*ã¯JL@Jø˜µ£)F@Jë|–²¤¢@JÝ×¹I5@Imhû1@IƒJ›³‚>@I˜¼ŸJP}@I­½†K$q@IÂKÒŒ>[@IÖfÄé|@Iê «ðô|@Iý8G·³@JífÑÄ@J"(˜z‚š@J3èoÙ €@JE+„q¼@JUðr˜€è@Jf5ÛäI@Juúg¤$R@J…<ÃU€°@J“û£Do@J¢5Â5s^@J¯éãy `@J½ÑǺ@JÉ»`‡%@JÕÖlCk@JáfÚG‹L@JìkšÊyÕ@Jöã§§Q@KΨ¡@K )ÄÈ0°@Kö›~@K1à²àë@K"Ü™ô±@K)õj7“#@K0{¢r²@K6n›Ñãœ@K;ÍÀGŠ=@K@˜†[LÔ@KDÎs/%ç@KHo`’l@KKz=Xé@KMï/ñmÓ@KOέÀì@KQŒÇÆÐ@KQÈ…ÑšŒ@KQã誚Ø@KQh²ˆoó@KPVïøog@KN®¼Ù\%@KLpDMŠ.@KI›À¥v2@KF1{Bé©@KB1ÌtÍ+@K=KÒ€@K8sÝh(@K2¶–Àn‚@K,eÙb1×@K%‚E,*Ø@K ‡‚—u@KZýû_@K m‡ @KEß¿/P@JúEÇø@JðJ¢úìÆ@Jåxð•³@JÚ0•q@JÎ2màQ\@JÁ¿ÀÎ5à@J´ÄI Iû@J§A0¯Æ@J™7§¾¨'@JЍê™@J{–:€u@Jlàåâ@J[ê-åu®@JKSwþ_á@J:>’Ò€@J(«zrt¿@Jœûf*w@J ½sÂ@Iñݤ?@IݘÓ,x@Iɨðå+C@IµD±+wÔ@I mL'Pv@I‹$?^Õ@Iuk ûo¡@I_C,kI<@IH®(ã€@I1­~³ìÀ@IB²š_@IoEÈöü@Hê4¹ì M@HÑ”Êß@H¸Hã @HŸ)`îÅ@H…aWê@Hk9¨£B×@HP³ÌÇ@8@H5Ñ;ÛA’@H“k Šp@GþûÌñ*ø@Gã Ñxë@GÆÄå¥=è@HÆÄ@ƒÝ@HÞŒõQk‘@Hõíå×&@I å˜@_‰@I#r’¬_»@I9“[u“@IOFy¼7V@IdŠuD¨á@Iy]×Eö0@I¿*‰%R@I¡¬ûÒ§Ó@Iµ%ÚB¯2@IÈ(W¸$@@IÚ³ 6h@IìćK£}@Iþ[n}¬@Jv_²öë@J ¡±§@J02ü> ˆ@J?Ò-„u@JNïÌ2‚|@J]‹¤A|@Jk¢ ÞrÒ@Jy5<´uç@J†A»ãÃñ@J’Æú…Í~@JžÃÝ€ñ@Jª7Rø/*@Jµ R¹?À@J¿}Þ¨¨«@JÉO+w{@JҒ׎=¥@JÛH~hï¢@Jão%ÿH @JëPò@Jò lï·°@Jø¦W’@Jþe9>œ@K¶'F Ý@KtWÀfk@K Ÿ/ºÔ@K6FL­Š@K9@ËEF@K§Òî]@K¾÷,Â@KÆÕÐG@Kv÷ ì‰@K’_Ùz@K!ÙÁÍ@K 4³†X@Kedä @K,Ü'z¦@K_ÒêHm@K þ.¢×@K iiÚ@K€Â[qç@Ke ݆æ@Jú¶È®ÏR@Jôvƒ6rÖ@Jí¤×Aúº@JæBl½¡Ù@JÞOøgP@JÕÎ;|•d@J̾cïu@Jà )QÂ[@J¸õ‘éNô@J®?,Ú ¨@J¢ýôyÉ@J—2í[ØR@JŠß%åÙ[@J~µâJI@Jp¡¾ah@Jbºg¸"@JTNä0¤ @JE`ltÆ@J5ð@«òÜ@J%ÿ§½[@Jî×U|@J¢i@Ió8n¨äë@IáS]5¦@IÎô–•S)@I¼€Öð@I¨Ï…¶K/@I• >^@I€Ô–Z'g@Il*„tëø@IWQn@IA„rŒ—c@I+‹`8î@I%“§¹c@HþT…sª@H篰¬@HÏvŒB«@H·l”Ò¡@HžýB„äh@H†* ¸½o@Hlôm¿¨C@HS]Ø Òé@H9gÂÜ*@HŸ1.@HbÞhèÊ@GéVï"ùT@GÍñ=¥¨‰@G²33°ö‰@G–8T‘Ê@H“Å’ ,ì@H«^ƒ¸)@H¤Á@HÙXŸçz@Hï¶æ¸EP@I©f¸w@I.¯?èU@I0EP´z@IDëÜÛF@IY ç1Î-@IlãIØ2@I€0Ï%-˜@I“ß–†@I¥iÔ¡+¯@I·ROáõ@IÈÀöîÿ>@IÙ´sų@Iê+u/á@Iú$¯0…,@J žÛoM…@J˜¹¥`á@J' ºÎ@J5«ÃÖ8@JBxaOZw@JOe ó|]@J[Ë“*ÁÒ@JgªáÔ:@JsìÈ Ç@J}ϵì\"@JˆEðIÇ@J‘˰†Ž’@Jšø£@J£—™¹çM@J«©vZÖ.@J³,êIP9@Jº!AðD @JÀ…Ö“@JÆZ @JËV:â@JÐO4@I‡óÙÑ5@IsõÑgãâ@I`]Øzî@ILRp¿ @I7ÕËA @I"æùl Ç@I ‰ÄšáG@H÷¾Ò|Ë¥@Hᇓ`Þ„@HÊåxl»£@H³ÙóLÒ@Hœfuâ­¹@H„Œrx¬@HlMY#=X@HSªœgJ@H:¥ªío-@H!?ôkc@Hzæw‘@GíWëæœ@GÒØoú ë@G·ýÚ€ÊÜ@GœÉ‘~¢@G<øž£@GeYq£ì@H`¯ÿûÕ@HxÍ”è@H~Ï@H¥¶§kȼ@H»æßÎ.â@HÑ«½Ö’@HçÙÄ~@HûíÊqm@Ih*úÝç@I$q—ÞäG@I8®Ð]Â@IK,ro“@I]Ú`H¡@IpEã@IÒi3}z@I“{ 3§@I£æ-dôƒ@I´77ÐǾ@IÄ Wtø@IÓaMŽ#~@Iâ7ã´c@Iðè •¡@Iþb0{ÉÀ@J ³™ÂÜ*@Jbx@J$ÉhçTÙ@J0‹°R(ã@J;ÆÜ}R;@JFyô€â‰@JP¤ »4@JZD4ðe±@JcY(T@Jkãqˆ5ð@JsàìêF@J{QU‰¿@J‚3ýT¦Œ@JˆˆB5#N@JŽMŽY’@J“ƒXv’z@J˜)$IŒ@Jœ>vb7@JŸÃn“2@J¢¶uétH@J¥pesž@J¦èÄÁo@J¨'D£Ð@J¨ÓÓô‹@J¨îa‡MÍ@J¨vêÕQe@J§m{?KC@J¥Ò, ¿@J£¥$R1´@J æ˜úû@J–Ì‘&6@J™¶5H@J•D¾nÞ@JCE ³@JвÊa,@J„‘Äo¯Ì@J}âÓ>ò{@Jv¥äßÊþ@JnÛ£2ü@Jf„Ã_™6@J]¢Ö¶W@JT49¯eµ@JJ<2ùÐõ@J?ºÔD?p@J4± >Ûð@J)Ç\Ãý@J r´ó@JjãSª£@JIYkÃF@Iõ¤ˆY»6@Iç}‡R@IØÕ™Àèú@IÉ­Ò̧'@Iºqq/@I©ã¯Ýú@I™CР7”@Iˆ)Ýs @Iv”×E8@IdˆXi©]@IRñþi=@I? ûÒµ@I+žÑ>¨8@I¾Ð 8¶@ImZ÷‡‡@Hî«ÓŽéc@HÙ{Ÿ¡wb@HÃÞ&µB@H­ÔÎÔÄ›@H—a#:ÿ@H€„,¨­}@Hi?µyË@HQ•º‰ø@H9…`˜@H!¯å€U@H=Øõ,@Gïm° @GÕs×g†¢@G»zq¬a@G¡2ºnv @G†ˆù0˜'@Gk…–ŽM @GP)ð4Ùú@G4wa~Â@H-„7è®@HD¿|Àqô@H[“û|¨Ô@HrQS @Hˆк@Hšû½­ @H²ÆÌê1@HÇ„s¸!y@HÛÓOÍmˆ@Hï±ÆB8`@I}ˆp @I¥ðš@I(UŽº@I:¬Ñ|ÎÎ@ILEET›³@I]egü°¶@In ôÁ¬ñ@I~7«·#@IçRDÿ@I²µg‹@I«ÍžD#!@Iºë×Ó@Iǵy<2f@IÔç+[Ò,@Iá•î¤#@IíÀ·hÉ-@Iùf‚Eð’@J†TT°@JÓª/Ñ,@J7êV+@J.ÚØ\¿@J&0BR³@J··ã½@JØ?ëB@Jp£@¶6@IýƬ¶Z@Iò ˜Ûp@Iæ6(p@IÙ“.a@IÌúÚ"g@I¿ ‡:Õ“@I±ëŸÙI@I¢G²(@I“|Áù‚@Iƒú‡xCA@IsûËFd³@IcÆ-h—@IR¶D‹—@IA ÞÃæ@I/<†“¼l@Iáú „@I ˆh‘â@HöÏ„˜@HãD‹]È@HÎô êï9@Hº^t»1@H¥Zµ@HéøˆÍS@Hz ç`°Ã@HcÇʽg@HM”3B@H6÷V8D@H‡©Y|@H¦’#ÉÒ@Gîbÿ Ql@GÕ½®MÙ@G¼¸ n¾@G£SU.@G‰‘  1@Gor€èJ*@GTù‚Òã@G:&/#˜@Gúã¯K3@GxÔžJ@GúBá"/ä@HP5g @H'÷l‚@H>6;Ʋ@HT 6³ Ó@Hiwµz@H~w^¼@H“ Ú²ÅÉ@H§-Óù %@Hºáö«ë)@HÎ$ñTÇ@Hàõu±7@HóR61ì@I9ì?@I«Q²ð:@I'¥&m:£@I8&-¾Ú@IH-/ô%H@IW¸ú~ˆÇ@IfÈ`L{Á@IuZ:-g•@Iƒmg1BÀ@I‘Íø!@IžXf–¾@Iª£ý]@I¶±·¿>@IÂ;‹} Ò@IÍ@…ýb@I׿¹Ž@JG³ Ð@J “!zŸ§@JSsHÃ@Jˆu€@J0j|î@J#Lx!@J'Ú`ï¿K@J+Û§¾G@J/MáB@J22UîO‰@J4ˆ:6'@J6OXÍÅ9@J7‡‡E…x@J80©‚ÜÔ@J8J°´i@J7Õ˜ªVq@J6Ñmâ}@J5>Gxl@J3J!l@J0k§~xÚ@J-,ž á@J)_xüÊî@J%%ßd@J GÌT@J§€k)@J¥f鑱@JÓ“ Ä@Jþê±"ä@Iÿ[Kâ¨@I÷-¡ëø„@Iîv¢v2ž@Iå7 ¾Êü@IÛo®LþÃ@IÑ!X k)@IÆLêÝmú@IºóLvøæ@I¯mÖ!@I¢´Gÿµ@I•ÐÜ8"K@Iˆl3¥óÃ@Iz‡^ó1Ä@Il#uíéX@I]A—(!(@IMâç—~Í@I>’4Þ @I-³Çœ©@I彬;Q@I Ÿ¯(`Á@HùâÛYj@Hç°…°Æÿ@HÕ õlè@HÁðu<¬<@H®eRêz@Hšiß°@H…ÿlx?.@Hq'P`ß@H[âá”ä@HF3xcû‰@H0nO* @H™¶:À@H°á“þ$@Gëc8™@GÓ±´@G»œ9+«@G£%ßtKO@GŠO`ÿžq@Gq 0Z@GW‡YÇsé@G=˜€É2@G#NßM¬#@G«Ë@j›@Fí°•ÓY¡@FÒ^ŽôÖ@GÆìQë@GÝÌ•xks@GôF{e%g@H XúèH@H À½7è@H5Bzƒb@HJ×v@H^~†z:Ú@Hrx:ä>F@H†¨KÐO@H™…g@H«ÄŠcˆ@H½ùtFIs@HϺ4óØ@Há÷R€@HñÙÉ„@I58%Œ^@I­u~@I!€¦¾¡2@I0m¨(ǹ@I>ÞŠ3À@ILТ¬/Ã@IZDoßj;@Ig8`X[@Is«o‰ug@Iœ €Æ³@I‹ þ>ó@I•õœì@I [•çuÖ@Iª<ª}&@I³–:Óµ@I¼iK`ëF@IÄ´„Üù@IÌw2ðº@IÓ°¬Åá@IÚ`QG$ú@Ià…Žäý@IæÜK»@Ië.¼]•Ï@Iï±½­ô@Ió¨z¥Êô@I÷™»2¿@IùïÍŽS@Iü?Õ õT@Iþ{”í.@Iÿ7˜þ®@@Iÿß¹×@IÿøÖÓ÷Õ@Iÿ„æª@IþƒI—«Ÿ@Iüô–'µ@Iú×vŽèê@Iø-“Èr@Iôö¬R=Ò@Iñ3 •3@Iì㉣‰@Ièòh$œ@IâŸLU}/@Iܬ‡4t]@IÖ/'s(@IÏ'¼Ó(E@IÇ–â/i2@I¿}=;~Ò@I¶Û~A#@I­²_ÙgO@I¤¦¢Åû@I™Í ô3@I¦n™@IƒÔDÞÛ@Ix_³5@IkÎnÝ$@I_ ?Ûlò@IQÃÔ†F@ICÿ6#@I5¼t˜Úu@I&ü§$3«@IÀêÓS¼@I bÄŒØ@H÷Ú7ª ±@Hç1—mΜ@HÖ´ÖGH@HÄ{Ç+”õ@H²q ÝΫ@HŸò¼,a @H νS@Hy }žs§@HeÏBò7@HQDÞ÷@H<âG¿à;@H'Ésñ@HF„§à@GüY‡8å@GæÕA›@GÏJYÅ@G¸)ÙÎ]@G ¥¹‡ (@Gˆ¿ËÚ2@Gpw˜{@GWÏ?eB@G>ÈÎð˜d@G%e¨S@G ¥nTFh@Fñ‹-1Ê@F×vh")@F¼KÃ.fŒ@F¡)NÓÞŸ@G“‚.í@Gª55Rù£@GÀ‚­b@GÖi"‘&Å@GëçHÍ7@HûÔÿ0v@H¥}Q;>@H)âùvm @H=³ôv‹@HQUoD–@Hd®ö|½@Hv…ÐTºí@Hˆ“}`rß@Hš-}NU@H«R›ª@H¼¥rg'@HÌ9oá @HÛøÒOü—@Hë>©É­Ô@Hú ؼ·ˆ@IYGT)@I+ãÐ>³@I#€¢Þó@I0Vô<9@I<¬}¡º@IH¥í˜a@ISÕ ¨e6@I^¥ÅÁ+@Ihòùš«è@Ir»ÑX Ã@I{ÿ0Õô@I„½FºÉÏ@IŒôi5i]@I”¤9Ñ %@I›Ìói¼@I¢k]x·š@I¨†ñW@I® Û»u@I³rÚ]¾@I·ˆMå”Ó@I»u:y„@I¾Öá¼ê}@IÁ¬ø©ãp@IÃ÷@)+@Iŵ….|ï@IÆç ÎÁk@IÇxO¡@IǦý3dM@IÇ4-?ª@IÆ5{4â@IÄ©Ã/ð³@IÂ’aÛ%T@I¿ï!ð"@I¼À/¼ÕÈ@I¹à^éç@I´À˜Á@I¯ðq²ÿ@Iª–‰üÔ@I¤±ñcUL@IžDv¸}4@I—N6ôi@IÏÅ‘ä1@I‡ÉÆ/Ïà@I<ã­‰@Iv)Ñ/ 4@Il‘O«Å@Ibt&ÝÜ@IWÓ(^jš@IL¯.¥Mê@IA ºI@I4áÝânW@I(:eL@I­¹–@I n¹*~g@HÿL„i°@Hð®C:Îï@Há”æöŽ@HÒ—=H-@HÁõuÁí@H±q¦¾†Ò@H wW8U@H¶ 9ä@H}#öäk«@HjÍQ@›à@HX]$@HDÌA‘æ@H1$V¥Ÿ@H‚ØH_@HŒ çÖØ@Góž9€#^@GÞFTð„°@GÈ…¨ãjN@G²] 9@G›Ï*95@G„Ûñf|@Gm…#géX@GUÌ—†Ò@G=±ÿøK-@G%8D|´û@G `(~5d@Fó*÷‰L@FÙ™ü*UC@F¿®ÀÀ@F¥iÊO!m@FŠÍ"QŸ%@FoÙÌ•Œ@G`µÐ-ƒ@GvЧí“ö@GŒ¬B 4J@G¢g>E°@G·ºW”ŒY@G̤IýØŸ@Gá#ÒÝÍÄ@Gõ7±-pC@HÞ¥ÉyË@Hs»­ù@H.àà…èw@HA9´nÊ¿@HS ºÏì¤@Hd”Âep–@Hu”žÙˆ@H†"ðýç@H–3-(ðz@H¥Ï›¿µO@H´óS.–‚@HÃ=Cê)@HÑÌIxv@HßmB®ì@H쵤oK¥@Hùmñr)­@I§]¼é@I`ú ’œ@I™ÞÈîs@I'Q,Cí@I1† Í£@I;7¬^W@IDeJ&ÚZ@IM'‘¿ß@IU1‘/€7@I\ÎÝ?Â@@Icåkò‹=@Ijt§¦GÏ@Ip|"w+@IuûÎÃÿ@Izñ-æXÇ@I^§@·@IƒAd}¨Í@I†š½*ج@I‰iÙç¾=@I‹®}‚êú@IhvyæF@IŽ—Ÿ »ý@I;ÝR³¥@IU#; ‡@IŽãn@b@IæÉ4"É@IŒ_H›˜r@IŠMG.M@I‡°Gt=I@I„‰-r@I€ØÇ@I|Q‘@IwØÏö|ü@Ir‹‡«Û«@Ilµ´yWŸ@IfWÓ @@I_rjÈa@IX ŠB.@IPWuÁF@IGšîµ?,@I>ƒ:Y¦@I5Îz×Á@I+“*ÌB@I Žœô)­@I„À,í@I ùÙ…¼`@HýîÍÄUO@Hñd‰j*@Hä\gH?@HÖÖ-Ƨr@HÈÔZy=@HºV¹gÍ@H«_.QÃ?@H›î†D}™@HŒÚàï@H{¦Jã©Ö@HjÐùØõ›@HY‡ÀAþ@HGɸ½;@H5š$Äœj@H"ù‡Jî©@Héôz²@Güj F“½@Gè}¦ZY‚@GÔ% ‘Ð@G¿a¼J&m@Gª4»› š@G”ŸbÐ×@G~¢ôCß@Gh@·å„Ô@GQyó/²Ð@G:OìÎÈT@G"Ã뇢@G ×6k7t@Fò‹Ã÷@FÙàÉ»H*@FÀÙ¸Ñ+@F§vÔGUÛ@F¹°åæ¥@Fs£uÛAÎ@FY5d b¨@F>pºÏ89@G,r9ÕJÙ@GBÍ{g3@GXÃÃå…Ý@GnSÕ5Ë@Gƒ|pÒÒ@G˜Q @Hå¤ P|7@HíKkù&@Hô2ÌÆ{@Hú‚2TDO@Ilƾl@IÑvÓÂ<@I ¯Ó—Ö–@Ixt* @IØ _SÈ@I!=A÷@IâÈÍvg@Iu("&@IÎs7@I÷€% ð@I˜¢×gï@I±nOqþ@IAàƒã3@IJ¬Ä@IÉèôKL@IÁ³¡Ÿ@I1‹iaõ@I§À;@IzH´a@I S¹p;‡@I¦Pa¢@Irn6Ã@Hü¸~(U(@Höxõº£ @Hï´T³´@Hèk$6´±@Hà÷÷îE@HØMlŽã@HÏz(9}@HÆ$ÙèaB@H¼N9’@H±÷§Éž@H§ ßø@H›Êïq@HöC¢@Hƒ¤´¶€û@Hv× F4£@HiòDZê@H[Êeš¦æ@HM\[à@H>××—O@H/ªÝy¸@H y‚Iñ@Hî¼46@GÿaºÈ޵@GîaŽà„x@GÜïV85@GË 2Z0€@G¸¹HSÚM@G¥÷ÀjÈX@G’ÈÅÓAk@G-†gøñ@Gk'2c$@GV¶ü¬@GAÞ³íT@G,ºò@G÷äÉõ@Gëu±ÏÀ@Fê{þV-À@FÓ©ðkÈ@F¼v…ì³g@F¤âù³Ñ@FŒðƒË@Ft `&µT@F[óLJù6@FBëòÃnÛ@F)Šâq„@FÏs÷ÌC@Eõ½6öY@EÛT—‰˜G@FÅìã@FÛa”@Fð¾¡3ÂD@Gúy¾ð@GϺCúÍ@G/=3”‰@GCA¶:üî@GVÜKΠ@Gj ,Vg@G|ÍÌ«`’@G"Ó¶f-@G¡ ¹ @G²ŽV“w@GÃ…šð@GÔoC @@Gä8´lZ@GóäÄáNs@H–_VL@HÜ!æž×@H %fK@H-öf±ƒÞ@H;N-«oú@HH+ʱnª@HTŽSÕð@H`tåÇ`@HkÞ¤J^@Hvʹ…ðþ@H8XERl@H‹&º@V±@HFDó¤;@H$xo×@H)XÿRUP@H4¨þíý*@H?|S¾ú©@HIÒ5ƒp"@HS©ã†Ià@H]¤ßߟ@HeÛÈ´Ì×@Hn4¦rÐM@Hv ž „.@H}c,À¨@H„7†v|-@HЉc­ý¬@HX3î6ß@H•£„Õa@Hšjí­ã_@Hž®—×@H¢l•©éù@H¥¦5Ÿˆ@H¨Z­4YÚ@Hª‰Ç½æÒ@H¬3X¿7’@H­W>º0 @H­õb¯Ó@H® ¸'xL@H­ =6Ø“@H¬¬úŠ‚@H«4-Pb@H©5tîf @H¦±wèn@H£¨>§yf@H  éò@Hœ:ø@H—o½lø @H’TYë'f@HŒµOÚ´„@H†“p•@Hî 'ê@HxÆÎÕ3›@HqÞ7œ‰@HhóÏf‚¦@H`I?Ifo@HWÓ`m@HMu9Š|@HCM'ÉD@H8§\Xu@H-„›À²Ž@H!å³ñ‚;@HËx¡Éc@H 6Ĺþ@Gü(y·Z'@Gî¡g©ì@Gà¢ÃŸÎÊ@GÒ-9õ_@GÃAÛtû@G³á¦\~÷@G¤ Ð@G“ÆÉ’äb@Gƒ5¿Y*@Gqäò~í”@G`LÃ`b@GND±A°@G;Ïäå^Ì@G(îÍr@G¢‰ùÛî@Gì>Q…~@FíÍP*@FÙF#MÝÀ@FÄX£¿@F¯¹Èrƒ@F™N‘uîÇ@Fƒ4VÕÅñ@Fl¸6üïÇ@FUÛ_‘Dý@F>žþ”´Ÿ@F'B2;L@F XŒ¡æ@Eö¸oÜ@EÞ ´¿<@EÅUåÄ@E« |À|®@E‘èW!ß@EwÚÞ+@F]wG)?Ö@Fs(÷ÊMH@Fˆw;¦@F`í9ž¸@F±äè4¬@FÆ ·*^@FÙ·0‰Ü÷@Fí=Zî~@Fÿåûm®@G[–ž Í@G$e°ï@G6JK¼@GG0RŒ0ð@GW¦Ý@Gh=faµ@HE‚îÚ;Ê@HLG‹âÏî@HRŠ»ûà@HXL¹ÓÚ@H]Šü÷@HbG8öÕA@Hf€^‰C„@Hj61aã@Hmh&A â@Hp@ôo~@Hr@6‰Z+@HsåÜSÀ@HuÊÈ@Hu£À˜År@Hu»Ü£e@HuOd Û¶@Ht^_7a’@HrèàÁU@Hpï~7@HnpôkÒS@HknÞ£˜@HgèÿH>º@Hcß›o³@H_S mà@HZC‹ÁF@HT±šÞÙ>@HN›!žD@HH™Ð”@H@ñL~CÜ@H9ZÿM@H1BµåÀ@H(«ûV&@H–v°RÒ@HÐCŒ“@H ñ¹h*@Hcê …–@GöZ#@]ò@GêÕ,ý@G»žõç@GÆ/]âÇ@GÐÒdr²Ø@GÚùôêß‚@Gä¥XÉþR@GíÓáy?@Gö„æ3ä´@Gþ·Èâ˜@Hkñ­C·@H  Ñ€[Ö@HUáÇ0±@HФšÔ@H >¤ì»c@H%qv²¾:@H*"· µg@H.R _5|@H1ÿ&‡„t@H5)¾ä›A@H7јzÔ@H9ö€2˜@H;˜L*E@H<¶Ý áQ@H=R9ÔŠ@H=j×Ú @H<þ†}G@H<µ ¤Œ@H: ” @H8¨bË<\@H60#OæØ@H35HDL@H/·f(êî@H+·eRv@H'5Z¸`U@H"1F˜ì@H¬ŒA ;@H¦bú@H u7¶@H ¨.‘–@H“º2t@GùŽÜì<$@Gñ ¥T¶@Gè ¯Èö@GÞŒ ÐÏå@GÔ’$µ²•@GÊïIÞ|@G¿*»­Ü@G³¿L^¯@G§Úi„½¿@G›|ãœ.ƒ@GާMé‡@G[K¢e@Gs˜÷uѰ@Gea{5øš@GVµÃŸ³µ@GG–Â|M@G8n]|æ@G(Â\‘ž@G½Õ‹ð@G­d%«Ü@Fõ\¼i& @FãžÑ9™¦@FÑt°m.³@F¾ßjÖy @F«à:†@F˜wÂ6@F„§/|f@FppÑR @F[Óæ[Û@FFÒ­˜Š@F1nzǾ@F§ â+@F~çèšK@Eîöµ`ðÿ@Eؘ¤­Ê@EÀÊ´c2@E©)+r™“@E‘, ¢.E@ExÔ¶Ž}û@E`$w{@EGMÎo@E-»wîé@Eùذ…@Eõ”(¼f@F ôêra@FñDìP0@F4ŠÉ-ú@FH¿{nˆ\@F\ŽDö‰ƒ@FoöÏw @F‚õËüdÒ@F•Œe³×ù@F§¸Ïš³ô@F¹yþ)@FÊÎè;@FÛ¶ˆE°@Fì/Ü>) @Fü9åfˆ¹@G Ó©Í_@Gü0qeŠ@G)²‰~Ô]@G7õÆ’à@GEÄþ÷/@GSOüo@G`ØÖ%‘@Glq×ï»@Gxh<¹ÀB@Gƒæw³q¹@GŽë®Zâx@G™w! @G£ˆJ®`@G­ß/Íd@G¶7ÎnØ3@G¾ÕB&R¥@GÆõŸ)rÆ@GΘR3Xw@GÕ¼Ð-Ý@GÜb•ô ¬@Gâ‰)W}5@Gè0q˜@GíVú6é%@Gñýn†ïZ@Gö#LôB@GùÇ»Ÿ9Ž@GüëÚŠX@GÿŒµº¶®@H¬¥oÎp@HJ¨° Ô@Hf ÆPf@HxRQ@H$Ç*‚@H­£ƒ@HÀü¶8@HRAø{Ð@HaŽ~s±@Gýïf@GúúÚn˜@G÷…?iÏ+@GóŽx6è§@GïÏëÙ@Gê—ÀVœ@Gä¦/S@GÞ­úïè@GØ6iæ4}@GÑ?óPv°@GÉË•ý@GÁØ]-¸A@G¹hV'_@G°{šCŠ@G§Éšò*@G.‹Ü#_@G’Ïœ™@G‡öŒgP@G|¤=ù~O@GpÙh’@Gd–ÖoD@GWÝXc¨@GJ­ÃÅ¥©@G=õÕ1.@G.ïÏש­@G c8ªA-@Gd${½@Gój×ÈÐ@FòÏÓ@FáÁ"N|9@FÑ“+þ@F¿Ô8“².@F®:KÀ¹œ@Fœ4ÂÆb–@F‰Ä¨NLŒ@Fvë Âks@Fc¨÷À¿@FOÿ‚pH@F;ïÀ%—î@F'zÆLõ@F¡¬›€š@EýeŒ2ÿ©@EçÇbÿm@EÑÈ¡y„}@E»jޏ@E¤¬ãWýý@E’<ïñØ@Ev8°ªü@E^Hôô@EFŒ4“@E-—LY @E¹Æç+@Dû…¢ o´@DáûË U‹@EÁŠÐ]ö@EÖÂy {¸@Eë—éD,”@F =]d@FÒ…À@F'À(C4Y@F;ÿf¨”@FMÜJãL@F`Mÿå½B@FrVöŠ@Fƒó‡¬”@F•%Qô@é@F¥êu?ã @F¶AõI.D@FÆ*ÙfÜÌ@FÕ¤,Éî=@Fä¬þ»Qß@FóDbÙÌ @GiqW÷@GG:Bá@GY”ÇÀ@G)!ÖÈÚõ@G5täÂ0Ú@GAQc3r±@GL¶ŠÒ @GW£š‘—#@Gb×Ýú@GlŽÐÇg@Gu“q @G~˜¼àù@G‡"ï–¹V@G1Žx@G–™{S¼@GÖùöSt@G¤mµ«4ì@Gª†U‚ñ@G° jËÚÒ@Gµ;_.@G¹×eĪ@G½ó™O‚p@GÁÞB#F@GÄ«ñâ#À@GÇGš’Õ½@GÉb§èß»@GÊüò»OÓ@GÌ]1u@GÌ®ÒÍt3@GÌÆHs¹@GÌ\¼nH@GËr6møý@GÊLj-~@GÈŠ/t‘@GÅ­¢+a@GÂÀ<ŠQ@G¿R“r¹@G»dÚ³æ@G¶÷fcÞ@G² „wY@G¬žŽ ÂD@G¦³çQ˜Á@G Jû|„”@G™d>›^å@G’-@GŠK?#>@GÂ%³Q@GxéPŸÇÞ@Go•g×®¬@GeÇ”†@G[~ï?¤ê@GP½»A·‡@GE„*ÆÁ@G9Òü‡6×@G-ªõÛ|@G! á ë@Gùè3/@GqØÛ*ë@Føv—ãZ­@Fê®,A@FÛ)É´U@FËØ}yî«@F¼gŠË@F«è­ëœ@F›KMO±ñ@FŠ@éÕb@FxÊ" L@Ffé°z@FT«å\•@FAéK/ @F.Ìý‚}ÿ@FIÏ#ݤ@F`Îm´Z@Eó ™yò@EÞa˜‰I“@EÉMˆ’ÃP@E³×ðK)£@EžåTÇR@E‡Ì~-© @Eq8Ñÿ´F@EZGør#þ@EBû |r.@E+S:³Ø@EQKÃlA@Dúö¬þÚ’@DâDXÄ4@DÉ;e]½#@D¯Üêî6@Er0¬DŸ@E¢‚ZÄ@E·0/¬'S@EË{i7å*@Eßb·ük»@EòåÙdÉ@Fj‚¡@F¶½µ}|@F+oGŸ@F<è?$‘‘@FNbjù`b@F_q‹ú!³@Fp¨UR9@F€JÉ•½Þ@FüÝ@ã@FŸlSï÷@F®Uá_Œ@F¼ÎÀç%L@FÊֆϷ@FØjïÏJX@F匉My@Fò:Å“Z@Fþr mÝ$@G 5ˆ(× @Gý¾³¿@G WEøb@G*´¨k!q@G4™x‡(±@G> ôÈP@GFöÄ4W~@GOnî@GWj9"õ@@G^êØ['y@Geï]ÓK†@GlwM§W@Gr‚3ú@Gx¥Ö@G}=µßæ@G°¢Ù•@G…Â0dz@G‰W’»S@GŒl‘ž?Ê@GHÎý@G‘ˆ @G’¯*ÐB1@G“ÆŠÞ @G”]+Ô”@G”tkß&D@G” Ñ¿ü@G“#b¸ùc@G‘»1k@GÓWeU@GköÚ®Í@GŠ…;Ìò@G‡ZÿŠH@Gƒ:’ ¯@G~×'¨˜@GyõjÉ—Ç@Gt•³S\i@Gn¸a’µò@Gh]Þ3q7@Ga†šÆâ@GZ3KéH@GRc»¬7G@GJ*í2@GASìVU^@G8—˜ò'@G.[Ë -Í@G$*._Gc@G€lžFE@G_9Å5@@GÇO¦ Ý@Fö¹nEw¸@Fê6[¢Å@FÝ>ã}jö@FÏÓ×Çø@FÁö âÈ@F³¦a¼Æ@F¤å³‡ªÞ@F•´éºâ@F†ì£I@FvªWç@@Fe‹0¬^@FT£[¿@FCOÄv‰d@F1‘ÿY›5@FjÎØ+à@F Û4Š0Q@Eùä4“8@@Eæ†ÕjÈÁ@EÒÄ¥ž|@E¾¿é²@EªÛè”§@E•&gͤ@EØÐi¾²@Ej+%Òê@ETy …•@E=³ÛÎŽò@E&ì`l8¼@EÉ“ÙG@DøK.8™@Dàsu3B@DÈC=‚Ä@D¯»…º³:@D–Ý`˜á@D}©ÞOo!@EYJ´@E–ß?¹%¯@Eª ‹¨èf@E½ý[¼î—@EÐô¬HWž@Eã…{®Yö@Eõ®Ê—Þ@Foœ$Ìš@FÆö+ ·@F)³áe ~@F:5i­¶i@FJJž7ú$@FYò‘ÇmM@Fi,Zéj @Fw÷.`L@F†QÜcMX@F”;ÖË;n@F¡´+X«ë@F®ºæÍé@F»L›raü@FÇk R+Z@FÓÒnÍÜ@FÞHôy÷ì@FéÏ$¶Ó@FóM±TÓÖ@FýðY7@GsèV?@GQûW¢@G¶“¿ÁË@G¡"98ö@G'ÿ›®@G. Ó= @G4j!”¡@G:|Ï,@G?ýÐ,Æ»@GE x–%@GI‰+Ÿ*J@GM’݈Ãz @F×5Á@æ@FË¶Š—Áš@F¿Âl#Àê@F³YöhOã@F¦}ð†Ì@F™/%-ä¹@F‹ng*@F}<Œ ;@Fnšo%]‹@F_ˆïú-=@FPòvO¾@F@^…î@F/Á R&p@Fû'ïß@F Êeï+c@Eü/Òô9*@Eê,gOžç@E×Áê¯G@EÄîø<à@E±¶ôã-@Ežh•Ä@EŠaÖè@EuµÝ¾VH@E`ð“†ié@EKÊ‹îø‡@E6DÑ „é@E `p=ev@E t41Ÿ@Dóê“mÓ@DÜ…àÞ}f@DÅ1dãà@D­ƒ„”æ@D•}MÝãÃ@D}ÎË@Ddlôj3@DKc+8@E%Â.Á¤@E9Öy’~9@EN74£G@Eb5ð•@EuѪ/ŸB@E‰ bÑ»Ñ@E›Üϼ@E®HÙ4 @EÀN ¾¡‘@EÑì{‰WD@Eã!tÌ,Œ@EóìšÊ˹@FLþå•Ê@FAµÐ!@F#É×Çcë@F2ä€Éý%@FAÐÎFZ@FOÍëúPÁ@F]šúÛ'Ç@Fj÷*œð@Fwá­=°4@F„Y¹ÌŠ<@F^Œ—u-@F›ïge*5@F§ ‘©A‡@F±²X¸V@F»ãû5ø@FÅ!9@FÎß¼P¼@FתxU½@Fßü²Ó Ž@FçÕàmô¥@Fï5|ô¤…@Fö Lh@Fü†Ú3Þ@Gv1p,@Gêôeä‰@G 䜒@Ga´N @Ga¯Á=&@Gå»à @Gìê9Äq@GwCC[@G ƒè£{@G"gV<•@G#%hêâÀ@G#¹Ú‰²G@G#бü¾@G#ií¯š†@G"…”¶•ß@G!#¶Å§B@GDl.‚Å@GçÕ×ÈÉ@G2A@G·t)ãF@Gäо@G”B«Wì@G ÈG×Ù @G€w¹7«@Fþ½-z²@Fø~Ì6œ@Fñž٦@Fê’x2Î@FâåqÏu¢@FÚ¿-Ñ(ª@FÒ 4ÊšØ@FÉ ’q½@F¿ziä°%@FµtÌ5Ú@Fªøá€=p@F TÅ@F” Ô€Ï@FˆÆð@F|wÞ&¹j@Fo¶åQea@Fbƒõ¯Â@FTßÛo¢Ò@FFËg¬ @F8Gp/íI@F)TÏA‚Ñ@Fôckˆ@F 'C;“@Eùí¹5ƒð@EéIKKa`@EØ:²õ;à@EÆÂàÓëP@E´âÈ‚¤^@E¢›`aoì@Eí¡`AÛ@E|Ú†ÊÂÎ@Eicßp@EUˆ6¨.p@EAK²=@E,¬qóÐì@E­‹‘,å@EOSãdm@Dì’ÑJÉG@DÖy |¾@DÀõ-|@D©1Ó“ @D’s¨è)@Dzò8¹§@Db¥XS2¯@DJq®òÅ2@D1çþ×ày@D Pf|½@DðоVd%@Elë6A@E¦³ÿë¢@E-Ö¿›@E@öm$ÏB@ET |ý@Ef¸ DƒÏ@Ey'@vù@EŠãÖ‚¢«@Eœ_)9•@E­r/Ëóx@E¾þ;¢Ø@EÎ[«*O*@EÞ0P¥¾|@Eí™ >XÅ@Eü”ÿ ˜@F8éñ> @F+ÒynC\@FJÒñ›@FS*z§@Fìð?T@EóùÉ@Eã×~»5ò@EÔ)þhøî@EÄ#Þ¬Ð@E³ÓÍÜ @E¢ öI@E‘KvŽàô@EŽBÖ77@EmjLüŒ@EZà…æ(O@EGñæ%@E4ŸdíÕ@E éüR»@E Ò¨1yY@DøZf™_@Dã‚4°‰@DÎK^@D¸¶Hê@D¢Ä ‘F9@DŒv*Ó?@DuÍbZú6@D^ʹ5%Ì@DGo2Ó0„@D/»ÓÞx@D±Ÿ‚Ž@CÿQšü"ˆ@CæœÉÅ)Ë@D¼ Zm@DÐôCWÛI@Då WK:ß@Dø½LUä@E +,¾ô@EýþE‰@E1ˆÒa·@EC®´ðº@EUn·ØVQ@EfÇŠ@EÔ®ÃÞË@Eⱸf @EðFì‰A@Eýk.š. @F #E½‹@Fd=§jÜ@F"6ÊÿŸ@F-—fR@F8„C‘†á@FBýähT¢@FM>‡ñ÷@FV“³õ̾@F_®¬ç—@FhS—îÿù@Fpê$¶@Fx9N Q@Fxº Êõ@F†@CôS®@FŒMĽæ@F’eox,—@F—ÂHlÒ«@Fœ¥€è€@F¡Ã.}q@F¤ýÉ¥@F¨rPàáD@F«l¿Üú@F­ë*x@F¯îÍ´4ñ@F±wbˆ4–@F²„¥•'@F³…0I@F³,÷-\ò@F²ÇúÂ¥@F±ç•àû@F°‹×ûùÁ@F®´×ç>Î@F¬b´Èhß@F©••Û-R@F¦Mªd½‰@F¢‹)¤¢ä@FžNRÃØ@F™—l½H@F”fÆM‰@F޼µÕ×@Fˆ™™>i @FýÕáÀ†@FzéØe ¯@Fs^šê£@Fk[_v@Fbá,s7u@FYñTpw@FP‹FÊg@FF°]9| @F<`ó|æ@F1ª±Ö¿@F&g*”7Ô@F¾ “æ¯@F£?©'®@F@#;£@EõßwÃ@Eç®à N@EÙÔ ê“@EË‹&7H@E¼Õ—V@E­²jÚs@Ež$kâ·D@EŽ+¢ï¿L@E}ɸÜ@Elýxî:@E[ÉßJS@EJ/#ûÑU@E8.2y‰Ã@E%ÇøÞét@EýgÖØÚ@DÿÏr<]ü@Dì? êÿK@DØM.ío@DÃúÏ|B@D¯Hév¡ž@Dš8w‘ˆ@D„Êuý’i@Dnÿáà†Ò@DXÙ¹+éÚ@DBXútåV@D+~¤ÍHÇ@DK·¨@CüÁ2€ Õ@Cäà?Å@CÌ©_šk@C´®ç@Dˆ ÓãÝ@Dœo™à…@D°_wST@DÃî§¿ ã@D×8l@Déç7ðн@DüN¸ÁÁP@EQÎ.Ýç@EïŽ*{"@E1'&ß™@EA÷rF@ER_ÏŠs@Eb_JÒ+@Eqõ Ïl@E +iÔ@@Eßå†D×@Ež3c¥Äe@E¬ÙÑÂ@E¹’}QNP@EÆœŒOÖÊ@EÓ7F˜Ôð@Eßañƒ0}@Eë×b…†@EödG¶Å™@F:—[)@F ž ´U€@FŽCÝž@F fÕC.@F(õ§•S@F0¤b˜áÌ@F8Á&N H@F@g¿óà @FG—µdÈ@FNP“J¸<@FT‘íFøV@FZ[^  j@F_¬‡‚m%@Fd…Þ¿â@Fhä°Â:@FlËP8O@Fp8 E`@Fs+Q Iì@Fu¤¶ÇïŠ@Fw¤tJH@Fy)Hàþ@Fz4:ï@FzÄØÁÃ@FzÛr$!@Fzvûb²@Fy˜…]­@Fx?Åç@FvlÑ–$¾@FtÉ3@FqXÑÅû@Fn–N9@Fj]ÖT•,@Ff*E{ú/@Fa}¬(6›@F\XWJ@FVºšàk@FP¤ÐõMå@FJ^7Ï@FC«¶…b@F;—*Bnb@F3¥QŠ´G@F+=Ÿù>á@F"`šŽ@F̶b½@FHÈ) f@F$¸…i@Eúb€*„K@EïC~ œ@Eã²Ç‚_ó@E×± !‹Õ@EË>ü¹Y?@E¾]U(8@E± Ò*;@E£N6)±<@E•"H ?@E†‰ÓRh@Ew…¦aBŒ@Eh•R‘@EX=vÃ^C@EGû%%@»@E7P~;M¯@E&>bë·K@EÅ·e@Eça<¹@Dð¤J ts@DÝý^ÆÔ@DÊó‹mÞ¼@D·‡ÀZ‹E@D£ºï'ÚJ@DŽ Á_@D{úû¹@DfÞÞ È@DPЄ&@D;,ð¹'@D%.ô~@DÕÕIW@Cø"¢c¬Í@Cáîwßñ@CɵåÐQ@C±ýP»4@C™ï¾Ql™@C— œ@DS³ÿpŒD@DgÞ[vLƒ@D{©jF@D<^»@D¢å Ð@D´Åx ó@DÇ –@DØê¼Œ×@Dêf tsF@Dû|ÖÀó™@E ,‘Y@Et½á5Ÿ@E,T·¹=@E;Ë–]£æ@EJ؆{ï@EYz¸]œé@Eg±`o@Eu{µ´“+@E‚ØõpXñ@EÈ_Û¿@EœI:®¨@E¨ZÍäÖ @E³üjr@E¿-bZ4@EÉíÖ£1@EÔ:Ðÿx@EÞ ç6›@Eç~$f}ê@Eðr@Ú@EøòÃO,Ù@Fþ9¦+}@F”u»í @FµŒ @F_iºh@F“G²U…@F"P7É|Î@F'•ÞYI%@F,cæÜT¡@F0ºuµ@F4—ïá*@F7ýkÖæÒ@F:ê@Ð>r@F=^??Ï·@F?Y?1ðg@F@Û Y ö@FAãÊžÊ@FBs+‡ðõ@FB‰;DÕ@FB%øš»–@FAIi+÷@F?ó›J @F>$¤Å€1@F;Ü£ Á!@F9»ˆº@F5âÈ¿Õ@F2/õ<ÉÓ@F.†ÁY¬@F)c¡•@F$Hã€rw@F·KF§4@F®£Wi@F/JÝ©+@F 9©ãª@FÎ-ÿÑP@EûíKξ@Eó—~Fä@EêÍG®ñ\@Eá/Dé{@E×ÝÃK@E͹—ȹt@EÃ#F”´;@E¸o03:@E¬¢¶™26@E ¹ÇðL@E”aP5E@E‡šF7m@Ezd¢…‡›@ElÁâÀHk@E^²‰.Å@EP7\D!@EAQ&€5Í@E2¶>;E@E"FÝ…¯ý@E$qÚ_N@EšL ­3@Dð©H {@DßRD­ò @DÍ–#’›2@D»uÈâôP@D¨ò,u¬@D– 1Ãò@D‚Äk½ä™@DoAxp@D[r¸Œ·@DF­ï]†-@D1騡Ày@DÈó]Q@DK›ËÖ@Cñs½ˆÔÞ@CÛAëF@CÄ··Ò.@C­ÔBF@C–šW®Æ%@C RWø@Cg%(º©@CNëÑ|Æî@D;] ç@D3@à¶å@DFç‚ÓY.@DZ.[ 4§@Dm€ŠÃ1@D™ o“š@D‘»&à¢@D£yÇ/Ët@D´Ô3\+Ô@DÅÉ€üçÀ@DÖXÕÂè@DæWg•Þ@DöB2ãÛé@Eš•”…E@E‰°ìûb@E#¹ñC_@E1(éd*†@E>×{õgê@EL²ol@EXîÑæ"@EeV#â~ó@EqNö‘‡ˆ@E|Øœïõá@E‡ònörÊ@E’›ÉÄñã@EœÔÍIE@E¦š¨üìm@E¯ïå²;@E¸Ðå@EÁ>ÌM ²@EÉ94…î@EпO2¼@E×ШW{ú@EÞlÒxEÛ@Eä“f¶®ø@EêDñøï@Eï~Sâk@EôB4ò@EøŽÁ÷e@EüdPùö°@EÿÂrX$ð@F¨ð~ú@F›Ø y@FNÄì @FŒéd‚@F “S¾í@F !}_$p@F 7]\\µ@F ÔòVeu@FúByÜü@F§[}vz@FÜRÈd@F™D–Ïò@FÞU›.|@Eý«±I&±@EúŠaê@Eõàㆤ@EñG¦¤«*@Eì8s“°Ø@Eæ²Òw•’@Eà·Ê@EÚE¨ j@EÓ^àÕÛ@EÌ/~8@EÄ3´çk@E»îÛ~IÚ@E³7/4 –@Eª …T-Ç@E ohYA@E–`h›á™@E‹à$ã[@E€ï‰F@Eu޾(£@Ei½˜ð‘@E]~bXŸ @EPÑš–@EC¶}Þ_@E6/>m^@E(<n²@EÝײ-æ@E 8ºS«@Dûã+¢=@DìHL j@DÜE*Õ@DËÛ"Äë™@D» Ò1aI@D©ÕÈn@D˜:Â9¹¯@D†<¾Üä@DsÛꮚ@Da)•ª:@DMõaÙ@D:qzAå@D&Ž]\Gl@DLõæ0Û@Cý®0V…@Cè²úaQ¿@CÓ\BÏñ@C½ªùZÞ[@C§ „r0@C‘Ž _Ú@EE°=¸µ@EP³‹~)!@E[Fàá––@Eeiö±Ø@Eo8—ÎÜ@Ex]ˆä@E, fø@E‰ˆ%ú@E‘r&«Ø@E˜èZZ@@EŸê¹#›€@E¦xØR•ˆ@E¬’S¨ás@E²6Í{ƒ<@E·eîÍ´:@E¼gj»@EÀbíù¾Ì@EÄ0@;~@ELJ"p…@EÊg`ºÏ5@EÌÐÍßùª@EÎÃCüûN@EÐ>¤p1d@EÑB×â‰ì@EÑÏÎN‚õ@EÑåú@Eуè¯È'@EЫR(À@EÏ[Fêø@EÍ“Üt÷Lå@E2¼¤—Åf@E&–Yƒñ¼@EÂH!¬@E i_‡@Dÿ–uà2@Dñ¿.ìðr@Dã}wë¾@DÔÒ(Dk@Dޱ@·@D¶AR+ø¹@D¦]Œ§¬½@D–AqM@D…cBæÿ@DtNfIš@DbÕƒ—c@DPùuY&d@D>»zÖ§@D,L ?”@DñzÕÎ@Dºë &@Cñü`ã»@CÝßs ¢…@CÉeήFU@C´3V@CŸ_BŸGŽ@C‰Ô0_¦L@CsïÐ^].@C]³LéS@CGÚk¢õ@C04h@CóÌÛÝ@Enƒ…±ÏÓ@Et‡¼@Ez(™b-@ELµŒ@EƒüÎÿÀ@Eˆ6eÕ@E‹ûÀ Ál@EK~®Ä«@E’%”¦×W@E”‰Öš¼@E–x¢6©@E—ðQ癵@E˜òV®Ðc@E™~\î@E™“ |œX@E™2ÛÀ™­@E˜[ÖL@E—œI]@E•KB´d˜@E“ä‡Ôµ@Eb¤*ß@E=ªÍ”@E‰£)Ñ @E…“VŒ7@EpÓ\@E|¼ѹ@Ev¦…èe¾@EpÄÒo÷@EjmâÈ^.@Ec¤.,@E\gg¸ÄZ@ET·ûgDz@EL–[Oy@EDÿ‰b@E:þf aC@E1‰LÖ@E'£Ž[Q8@ENh;¶|@EŠ4DŸ2@EW‹¶Ö<@Dû· ÖÁR@Dï©ZÄŽ#@Dã/S¯Ü@DÖIáà @DÈ÷¶,íK@D»;ò)ÎG@D­mÙ+@Dž‡æÝU@D‘¼Ž@D€2ÒOÜÈ@DpmÑçî¸@D`Bå2@DO²Ù˜@D>¾€M@D-f«Ñ!¸@D¬2ײb@D í`V%@C÷µêë¦@Cä5i¿Ò@CÐøå*7@C½^ ‹ @C©eº÷"µ@C•Ù®"g@C€`K;œÍ@CkTõR¢@CUᆭ @C@1ŽÍ¤ú@C*N@C­åqn@Büê>?nÃ@BåÑBAl1@BÎcÛq‰0@B¶¢óæpð@Cˆö{%˜@C•",%uÞ@C¨]ËWÄä@C»:÷ÂŽB@C͸ÖËPR@CßÖ²ô$@Cñ“K¼ÂÓ@Dî6UÜk@Dæ}=$@D${P«”'@D4«ã|ì@DDwkX¬K@DSÝ ÛG‘@DbÜ?¿‰Ÿ@Dqt|@D£¹(ÞÂ@Djœ0È@DšÇùòëx@D§» /ã^@D´C`¾Á<@DÀ`µ³Í@DÌ’Em@D×T3a¬@Dâ*få8C@Dì’¾gó@DöŒ3‡@Eƒ!Õ;@E 16Œ\Ù@EÛ¶SØõ@E…Žt@E!Þ-qS@E)5;Oõó@E0DûŠÀ@E6ŒäŸD~@E<Œºü€0@EBo"@EG2®SFß@EKØ,‚W@EP ¤m¦@ESÆÕÍŠ@EW‰‰Øë@EYãžü¢@E\B·? r@E^,âul–@E_¡ò0œ@E`¡ÐKžÂÚ D@E8ÈÁìEy@E2Ö –;@E+Ä]ñ{Ç@E$–» `?@E÷W6zú@Eæ¡°*°@E e–ï@EsÆÀ@DúF¶%¶@Dð@[3@Dæ è@DÛQÖ,nÌ@DÐ5ìl_ß@DĬó>”s@D¸·‰ä,h@D¬VT;¸Î@DŸ‰ú™«˜@D’S) CÞ@D„²’ @Dv¨èÁ÷™@Dh6æ8Gs@DY]F»(T@DJÊ >P@D:v3D@D*jH¨Â@DùÓ„+k@D %Ÿû ]@C÷î|ã¸ý@CæU;dˆ@CÔZ¯ç ½@CÁÿ¯ºO`@C¯Eþ%@Cœ+´Àæ@Cˆ´n#”ð@CtàÌXº@C`¯¤Èbl@CL#à3¾ø@C7=²Y"¬@C!ýýŽ“x@C e¥Ô]@BöuŒë˜Ñ@Bà.™Ä…û@BÉ‘°Ï[@B²Ÿ·¢û>@B›Y” ;K@BƒÀ,QB@CLá 3@C`VÞ%'@CsoŠB;@C†*6÷‚@C˜† dK@Cª‚9Ðak@C¼é·ò@CÍXLôÈ¥@CÞ0•±9K@Cî¥ø3L@Cþ·¬Ï¥Ã@Ddìz'a@D¬ô„Òñ@D,üHû@D; a+ÆÐ@DIOÅB9@DVÊ xÝ@Dd ïáÕ@DpæƒNoC@D}UÈ À@D‰Z9Î¥@D”ó4ÚªE@D  5ƺ@Dªà\™/Á@Dµ3\@ì@D¿ŽR\€@DÈhÿÑ#@DÑ—g«A@DÚ0 @DâXÙ;Ö"@Dê]þ»@DñY*¶^q@Dø/Öš_@Dþ”þÉæ@EˆFe««@E V°Ó<@Eß ,è@E³•t‡¯@EÜ5Î\=@E‘‚À¦@EÓEb³@E!¡M\.@E#ûpùjQ@E%á0x@E'S…®h[@E(QDÞ«F@E(Ú»ñ2‘@E(ïâÞ©@E(¸j¼E@E'½B$v@E&uŒd©@E$¹ªJjR@E"‰µµ o@EåÏ?­ˆ@EÎ20_@EBÐ{ê@ED£Ð@EÒ7ºI@E íiH¯R@E•÷?d@EÌ/àRû@Dúg¬¡@DóâùJ@DìÄEl©‡@Då4²»•¹@DÝ4­¶ «@DÔĨ–lH@DËå4)›@D–‚ä¹@D¸ÙbZ`—@D®®A„j¸@D¤­k&ì@D™8 qa@DžxvêyI;@CQp:±¾@CcI—»Ç2@Cu$ú® @C†ŸùÈÂ@C—¹ÂäÚ¹@C¨rf6¯@C¸È°ÞMÐ@CÈ»Þfo"@CØK-Ž¿@CçuÞ.!Ë@Cö;5ã#/@Dš{°Ðñ@D’úji#@D $eÖ0@D-Lߢ9¼@D: íîDÑ@DFc…KÒ@DRPâS@D]Ñɉڣ@Dhè?‹Ì³@Ds’Ï÷·¹@D}Ðê‹@D‡¢Óªt@D‘•RV@D™û›ÖË@D¢‚ y‹'@Dªš'ÙÜ@D²B¿Ùšö@D¹{ `Þ@DÀCþiJ@Dƛ݆6K@DÌ‚ÁÓŒg@DÑøV¼*@DÖüM¹ls@DÛŽ^i?e@Dß®F¡0¡@Dã[ʀʒ@Dæ–´ò*@Dé^Õ‡¥•@Dë´ëŠ@Dí– †’@Dï ¿ÀÚ@Dð´Ž—g@Dð‰ ƒ™™@DðžËÏ7@Dð?¢2õ1@Dïmê#Óì@Dî(禺ô@Dìp­^"þ@DêETxp@Dç¦üÖí@Dä•̦Wp@Dáð·Æ@DÝœ;KE@DسÅ£è@DÓØv9 ¾@DÎŒ*·@DÈÎrŒ—¼@DŸ ¶d@D¼ Ï ç@D´ðî]s@D­p™Ž!@D¥€¤7û@D!Ü| B@D”Tx öT@D‹ÜžN@Do‰¼¸×@DwYÖ@DlÕÕGO@Daæ‹ãcš@DV‹»&JË@DJÅúçäŠ@D>•çr¦s@D1ü!_3`@D$ùMo0U@DŽgª{@D »"ë l@Cû)S@Ä@CìàÛŠo¯@CÝÚðå$Ñ@CÎp#û2w@C¾¡2…@C®nÝ õA@CÙçT|@CŒã>tõ@C{‹5ƒ‹ž@CiÓ %“O@CW»k]9d@CEEtÞ@C2pú£¹@C?Ïél³@C ²sê"I@B÷ɼË*A@Bㆂ2@BÎéœy‚@B¹óåàTå@B¤¦95b@BqÔ”@Bylwp}@Bb¶5@BLÁ@B5ŒK8h@BÍ5žÀ@BãpI«mÃ@Bö b‘à@C t1 Ù@Cêç6„@C.¶Î¶@C?½Ôç@CQuK*;@CbÒÎiq@Cr¬'Q…*@C‚ã¯öºÃ@C’¸¬vÌ@C¢*_F%'@C±8 º(å@C¿á.—@CÎ$‚*ü @CÜâˆV@Céxs•Jµ@Cö‡‹=š1@D.ƒ,Úé@Dl¸ôPß@DAŽ/@D&¬h¦ö@D1¬²sYí@D¶@CL÷*…p@C\®I” @Cl³u÷@Czó±‡ÞN@C‰€$’l@C—¨žÉÙ@C¥k08ï@C²Çš¡æn@C¿½7À;¤@CÌKe-@CØqƒ«fç@Cä.øø³@Cïƒ.?„@Cúm‘^i@Dí“pDæ@D«ÀáX@D¬UEÑ@D!êV‘l@D*»_"È`@D3Î0ÎÇ@D;ëJuà@DB Jo‹—@DI»„ðÜ @DPh9ŠÈ@DV¦ z‘@D\t§œ¯¶@DaÓº|4Ç@DfÂúk—@DkB"• @DoPô‡>@Drï5ônœ@Dvµ] ®@DxÙE„>@D{$¿Æî@D|ÿ±}Ô@D~g÷ ¶™@D_…Ó?µ@Då¢V­1@DúE$Ô’@DmÏ”@D~ÏXKe@D}gR$7@D{ÞV»N @Dy¼Š ™@Dw(‘ï}ƒ@Dt$ Ox¿@Dp®Û6Ì{@DlÈóOÚŒ@DhrŸUž@Dc¬$Û@D^u¬ {(@DXÏ—þ%@DRº.4@DL5ÂÅyŒ@DEB¯kŸÅ@D=áSlIÑ@D65¿@D-ÕY¾­'@D%+•xèÝ@D;(a—@D’ÄM@D¤¯Q@CþKil@Có‡¼w”]@CèYòè®k@Cܳ”û8@CГž_@CÄZ,Nb@C·Šó²@CªS¿6X@Cœµ‚ Æ5@C޲I#‘×@C€JJNÑ@Cq}Wk7@CbM êˆ@CR¹²½A†@CBÄ$÷ K@C2môXB@C!µ:Ž¥â@C\Ø$@Bÿ&:E.h@BíP™íù-@BÛB‰@@BÈŒûnxŸ@Bµ ÑWÂ@B¢X΄É@B޶‚gh@Bzº{¾:Ñ@Bfe‹“ @BQ¸‚'ùÉ@B<´3¬ì@B'YsL(…@B©yC-@Aû£ïTÇ+@AåJÖ‘]J@AΞ¡W‚ @A· &*M@ByÕ†mV@BŒÁ6!¨@BŸQ{¾KÓ@B±…ÿFt@BÃ\­a§@BÔÖD¶‹@Båð÷ †(@Bö¬¢>Õ\@CT¯B-@CS—º@C&œæÀÿ@C5ÔX ´@CD¨öî‚@CS¥ˆ@Ca&úc³¡@CnÏ PJ`@C|š]ÔÆ@CˆîÿÅù@C•c´Lþð@C¡r!óÜ@C­`By·@C¸V5{,O@CÃ*ôÂ\é@CÍ–Xy†@C×— çÜÄ@Cá-Y£ö_@CêX‚g¼D@Có ÓTs@Cûk…hçã@DR}¨Žê@D ÌŒ+H@DÙL¼ê@Dx`uã@D©mΕ´@D$l ¾©r@D)À*Éœ@D.¥C,É@D3&…2ø@D7!—¸ô‘@D:¸_/Ž@D=ßKJ¢@D@–0_Ã@DBÜèÁç’@DD³TÎ=p@DFZð‡a@DGç¬7@DG“í¢ %@DG¨e“(B@DGLN`‘ä@DF­™‰@DEBŒÅöF@DC”þÇc[@DAwq î@D>èý3TÅ@D;êÊŠ»@D8|«óUñ@D4žÐä c@D0Qn¼Wª@D+”À¸¢‰@D&iã À@D ΋-‚@DÅ–†ù¨@DN|y)~@D i”b`Û@D;8”@CþWÓD%]@Cö+Ä a@Cí“z9·@Cäg{Û§@CÛ o„@CÑEÆ€ý@CÇ3ÎûW@C¼RÏ p@C±;!a¤6@C¥º¸Lžñ@C™Ò%€ø@CþLJ@C€ÊÝÚôf@Cs­`Ju)@Cf*'S^o@CXA×ÁÁ@CIõÉ­ñ@C;D˜ëáÜ@C,1Ër¹@C» ‘-@C ãf:Ðl@BüªÉ’5ì@Bìïð`=@BÛ•§Ñˆ@BÉÂy_jF@B¸ [ðÿ@B¥ûBûZ@B“Œ+/hg@B€Á£Yã_@Bmœ1 ”@BZž7%Ô@BFC¶Â@B2E+ÝV@B‰Q”õ@B©O@AórÌäËÝ@AÝçL§@AÈQáb@A±Ó®x°‹@A›M4Óâˆ@A„t·½_ž@BDùÌË@BWÃtö@Bj2<å@B|E>/dÌ@Bûý]²‡@BŸU}áŒ@B°Q}%@BÀíÎ[iŠ@BÑ+)„az@Bá\«©¤@Bð„³{Z‡@BÿŸ|G*@CX-¶M@C­«;OÀ@C*Ÿ¼ŠÎ”@C8-–gÌï@CEV–p-µ@CRµ@C^wÞˆ_@CjnXGÁ@Cuýà#œ6@C%˜œQF@C‹äõñºõ@C–;p™ƒF@C (…]“t@C©«µzV@C²Ä†º©è@C»rƒ—@Cõ;Næ^@CËŒB3[@CÒ÷0Õ¯ì@CÙõ¥÷ƒ›@Cà‡DË3 @C櫵öm2@Cìb§x´·@Cñ«Ì¿Ø¥@Cö†Þ»1(@Cúó›í”Î@CþñÈ}ûë@D.FÈ;@D¡œã§Ï@DRé¾ µ@D ”ð$1@D g‘p‚@D ʳǹÉ@D¾E+–Ý@DB87`K@DV…Ù˜S@Dû,ûÃî@D02‚³™@D õ¡M;Ò@D KŠ1]ú@D 2÷ãv@D©+Vm@D±"çþ1@DJ#ý@Cüt*S¿å@Cø/œ†›µ@Có|£„…Y@Cî[~¿JÑ@CèÌsBm8@CâÏË¡¥.@CÜe׿þ@CÕŽízdx@CÎKg>í@CÆ›¤£4Ã@C¾€ /ê@CµùÉs»@C­nü¯@C£ªqî è@C™ãÑË;ú@C³% Š@C…U—Jm@Cz„@Cn®©ðmË@CbÝ^pw @CV¥0üW¦@CJ·Öo@C=@¦@C/™N"Âv@C!Ëœ_æ@Cš9[@Cuqoé@BöRâ¦@Bæµba @BÖûT™r¨@BÆàÜílˆ@B¶f±SÀ@B¥Š2Û¨@B”V"FG@B‚Á6v˜ž@BpÏ…»á!@B^ÐüMó@BKØÚëÍÇ@B8ÕgìT@B%x=ír@BÂ$M@Aý³ã½5@AéNFÕ–@AÔ’cç@A¿€ }&ã@Aª13g›@A”^ %@A~O5f@Agî•_Q@AQ;Í­ÂX@BßÐÍ©@B"»j…+L@B5 kW2¶@BFü"Í:@BX’Ó0Pñ@BiÌÀ«Šð@Bz©1kœŸ@B‹'m¾À @B›FÀ4ׯ@B«u¿Å@BºeÝÓèX@BÉdJˆ½z@Bع‹I@Bæ;ˆ&L@Bô “Xò@C†øì @C–±a+(@CA™ŠI@C'‡…‘ @C3f‘’@C>ߓʭ·@CIñq"¥@CT›¬T›ª@C^ÝÁ2B¢@Ch·/z>é@Cr'{[”A@C{.-}Se@CƒÊÓ Ï@C‹üþ~¿@C“ÄE/[j@C› Cê<Á@C¢šÕ•c@C¨”©@C®¬ìÌhH@C´XB’VB@C¹–¦&‹@C¾gÒ1!@CˆÎ:$@CÆÁ‰šÑö@CÊI¥ÄUý@CÍc¬+®@CÐsƒË@CÒLÖ»èî@CÔ¹ aþ@CÕ|ß#-@CÖmžoÈÊ@CÖð‚Y@C×¥ùDÂ@CÖªý³ý@CÕà¯íDØ@CÔ¨¥bë@CÓùÇÇA@CÐìÃWMŽ@CÎi6Z@CËw+¶ƒŽ@CÈÀ Ú@CÄITyÓ@CÀ -<Å@C»cÉ×qÒ@C¶M Xó@C°ÉX3*S@CªØÖ¤Þ@C¤{Þο@C²Å¶S@C–}ãWpu@CŽÝ•RF @C†Ò>I4h@C~\EÈ'c@Cu|,/¥@Cl2&н@Cb~æ“©Y@CXbÒ}? @CMÞhá @CBò,£"&@C7ž¤Ó‚U@C+ä\Øu@CÃâéÈj@C=ʾk@CRªŸ„4@Bù±Ù;@BëO¾‹;ó@BÝ91Ò&@BÎÀe^E@B¿åª¯!@B°¨äþ÷]@B¡ !M@B‘€.õ@B€³³ÌÃÆ@Boùp¼ˆà@B^ámᯖ@BMldLÑt@B;›ºj@B)n+Y°Ó@Bæwà Î@Bµ7 â@AðÉ¥w‘µ@AÝ6 ,@AÉJ®3=Â@AµQ¢ÕÂ@A o½ª; @A‹ºv]“@Av?Õ@A`¨‹]˜²@AJ¾óÎJŠ@A4ƒz-@Aõ»ëI @AÛ#8£ás@Aíª¥·Aã@Aÿ×ùEÔN@Bªwšé<@B#!fÄÑ«@B4<³B @BDù¹V­@BUY²»Ôã@Be[I1¯ð@BtýÍb@B„@’t95@B“"î,J•@B¡¤9 \l@B¯ÃÎjc¨@B½ £½)@BÊÛU(¯¹@B×Ò ¥Êþ@Bäd›!Á@Bð’l@BüZ@C½•Š>“@C¹×l¦$@CO.ÙLI@C'}lé@C1CîZW@C: ½jp@CC•‡O‡@CL! …™y@CTBÛŒ™u@C[ú“—@CcGЃéÜ@Cj*56 £@Cp¡ii]ö@Cv­è[¼@C|Lø™Ž9@C€¼’nÔ@C†H")#@CŠ¢ë ž@CŽÞ.w@C’Èס@C•%z½F)@C—ËÍŽD@C𗏼@C›ÏÍ}RJ@C-Eƒêü@Cžó— @CžžËOÆœ@Cž²ÅóCè@CžXây o@C‘%ˆ÷Ö@Cœ[™zˆ¶@Cš¸NR;®@C˜§Y½†x@C–(× _m@C“<ç/^‚@Cã°¥z@CŒ_|d@C‡ê%@†@CƒJ8ñÖQ@C~=Öõñ@CxÅA ‚…@Crà¾0m@Clš¢v«@CeÕ'¼æ·@C^®»êØ·@CW²’œÒ@CO"kÿœ!@CF½MK© @C=îÀG_B@C4·3aŸ×@C+Ž6{@C!ê+´Ì@CŸ è‘3@C È=§–Î@CŠÄc´@Bôç=5‡@BèÞ3Š{†@BÜp7^6ï@BÏÛÅo@ABY8/Û£@A,æÿ:®À@A")×Þ@A ~$ø@@ê¢Ô9 k@A¦*Vª‹G@A¸ñ°gQ@AÊã´´T@AÜPt²þJ@Aí§îiÀ¦@Aþ£œwçø@BBÌz˜u@B„Î+0w@B/hó}}£@B>î¾@BNü°îm@B\Û¯¹@BkA¨È³˜@ByF£Ý&Œ@B†éã¿÷G@B”*ÍT @B¡Ȫåæ@B­ƒA"'@B¹™¥‚ i@BÅKh§‰@BЗþáIô@BÛ~ã@@Båÿ“´H]@Bðæyq@BùÌ`É 0@C4Ì@C ú¤FŠ9@Cu8†@C†àôWF@C$/9'u¢@C+máaM‹@C2B~¥|p@C8¬ºÎ›Q@C>¬D¢y5@CD@ÏåO’@CIjkæ%@CN'Ó,œS@CRyÌON™@CV_É<*@CYÙ—¨©@C\ç ¤é$@C_‡ú¥œ¡@Ca¼EŽN¦@CcƒÎ¹¯4@CdÞ¨’@CeÌDÀ\@CfMÝ>å@Cf`åÈ¢ß@Cf¹Ðâ@CeA“Œ¦@Cd~²ó@Cbnˆ‘·Û@C`aÈNŤ@C]èWæ~Û@C[WyfV@CW¯ì™ñC@CSñBCG@COƈθG@CK/õççº@CF-ľR@C@À4¾m@C:ç‹òpS@C4¤‚÷ô@C-öÛ Ÿ@C&ÝüX¥›@C\ 7¶Â@Cp¢~ï@C*åj~@C_ ÄCD@Bý9ªöÈ@Bó¬~Æ1Õ@Bé·ùϨ½@Bß\”êdN@BÔšÍ ý@BÉs#2øU@B½æ?¨Î@B±ô@ãZi@B¥ž}í @B˜äBÝõ@B‹ÇAÖÐ÷@B~G³»Ê¯@Bpf1©(W@Bb#X²a²@BSÈç¡À@BD|%7B@B5O4Ð@B%W;~hú@B7H–4G@B¹çËÍq@AóßÈ™áš@A⩜¢O,@AÑ¿@A¿+îùZº@A¬åÚB ¥@AšF’~F½@A‡NÒUŽ@AsÿUæ˜@A`XÚ¨Ii@AL\Sr¤@A8 ãÁɰ@A#bèÕÀ&@Agð_w@@ù½Á¾@@ãy¬®@@͆³¯Œø@@·Cf@›ï@Aq(u“éº@AƒnˆjÎ@@A•[bäd>@A¦îP˜7È@A¸&žà`Ç@AÉœö)¨@AÙ„œõ@Aé¨ïyZ\@AùoìºnÉ@BØë«3æ@BãF–„@B&ŽZT´T@B4Ù†m Z@BBÄ-/Ö”@BPM³Õ¸@B]u‚šeÙ@Bj;ßÂD@Bv©DÌö@B‚œáÅ–‘@BŽ8#×-Ã@B™nèƒÔÑ@B¤@¬†Óä@B®¬ðgÛ¬@B¸³8•ëÚ@BÂS ±@BË‹û·MP@BÔ]“÷ý@BÜÇkPä@BäÉ3Öu@BìbA‘#ô@Bó’€è~d@BúY€a¢Â@C¶ëßøj@Cªt@C 3Η×í@CRµì‹ï@Céž’+@CP.Kà@C.M¯µ.@C!¡¸M_@C$¨]‰ò»@C'Cûì!@C)sÏzóŽ@C+7½]I'@C,®e@C-{’ü<@C-û[Ç,[@C.zeß@C-¶Ž#y@C,ñú0î@C+ÁSzï5@C*$©@á{@C(%« @C%§¢*«_@C"Ç~©g@C{ÊKë@Cįì@C¢\¦d@C£„”@Cås“6@Cº:Èc@CíG &õ@Bü¶UEÅ|@Bö² ÁÑ@Bï ¯Ë*`@B瘥«æÿ@Bß¼ï|«~@B×xí§þo@BÎÍ_8@BŹŸ5–›@B¼?)¥=R@B²^Z„’@B¨ÛiLr@Biòð”e@B’WÛR2@B†á~»±@B{( Û@BnÇ›ëë°@Bb%ýß7R@BU!Þ·Ã@BG»ÏøQ¦@B9ôj5 !@B+ÌFyÊú@BDk ¥@B\:‚A@Aÿ“ðW³@Aïp²€ @Aßn=xJ@AÏÞ~²O@A¾SAz (@A­<tío@A›Ê€¦4@A‰ý̘( @Aw؃Yk@AeYº’’@ARƒJud@A?U9¸Y@A+ÐÁå_Ý@Aöiö0¾@AÆî5j‹@@ïC úǽ@@Úk‘ @@ÅAq’@@¯Äq‚6¥@@™ölOÒx@@ƒ×¿£R‰@A<ÏiŸÔ@ANC¢Dté@A`­‚Ûø@Aq„@D¥ã@A‚«k~f@A“\A¶¾ @A£¿Wßu¹@A³ÆD´«¨@AÃpa7Àä@AÒ½¸ö‘@A᫘ô J@Að;r,Ù@Aþk÷Lä@B <ûØP@B¬žÄEë@B&»•'ðh@B3hßÀ*‡@B?³ðY‡@BKœ< ¡Š@BW!;bË@BbBjc%@BlÿH¹Æ@BwWYËg@BJ$ÒúL@BŠ×4øh¥@B“þj¾#@Bœ¾ex@B¥°¥Xb@B­ –ļn@B´“¸ ?@B»µ¹*Ç @BÂoC\­Œ@BÈÀTd@BΧ¯#Þ0@BÔ%ú é¤@BÙ:£#S@BÝåi½ï@Bâ&x6—@Båün[Ü@BéhGBÛ@BìiuÑå@BîÿÑ—@Bñ+<1Ïž@Bòë™ë…£@Bô@Ô 9ü@Bõ*Û„›˜@Bõ©£<@Bõ½% ˆ¬@Bõe`tãU@Bô¢Y§E~@Bót<ö@BñÚ±L¶@BïÖ2S¨ @Bíf·[á@BêŒ^ÂæE@BçGLS¤m@Bã—¨ýT?@Bß}¢Í×=@BÚùlæ3@BÖ ?m…ª@BгW…ÓÁ@BÊñ÷;ÄŸ@BÄÇexGE@B¾3íïý@B·7áÖO@B¯Ó“ô¸@B¨`D3‚@BŸÓ¤,Yé@B—8ÂD·<@BŽ7!z}ÿ@B„Ï,ùïe@B{T @BpÎ 5‘c@Bf5ưe@B[9ÀV/@BOØCbc1@BD=|±@B7ìЇÖ@B+c.ëÐM@Bw­l‰É@B*ÜJí@B}Nå­@Aõo›¥E@Aç[Ö‚@AØ6+”à@AÉ ©§Š@A¹ƒwkl}@A©ž8²Ê¬@A™\“¨?z@Aˆ¿0³ŠR@Awƺ\¯…@AfsÝ/«–@ATÇG T³@ABÁ©îrÖ@A0c¶ Á@A®x7G@A ¡›7œz@@÷>ߦ@@ㆤfE£@@Ïy¢E<Ù@@»“!?[@@¦d1ÐcÀ@@‘]:Þ¡@@|hCº0@@fZy¯$@@P`, ‘«@A œŸŒ@Av+‹@A*½øº=ó@A<w8'Ö@AM EÝ¡Â@A]­ºÜI@Amó.\ׯ@A}Üúšˆ»@Aj{þ N@Aœ›<<@A«nk-ß@A¹âþ%q–@AÇù¡5‡@AÕ¯èÍiê@AãÅm4Ä@Aïý$3r’@Aü’vÞ c@BÆ2Q¯@B—α׻@B Ç»@B+›µ–m@B5ºÍÖÎ@B?þäMÛ@BIÞh\š¹@BSXèæ[@B\möAÜþ@Be'f4–@BmfÙ^ @BuH_¼‡G@B|ç|ã„@Bƒ×“è/>@BŠƒÐ@e™@BÈ N@@B–£üu"@BœY¿éÑ@B¡!áõä”@B¥ÃW¦å²@B©û‚:X&@B­Ê-ü,î@B±/,(Õ7@B´*Rø"È@B¶»}§Ê@B¸âŒ€7ª@BºŸdãG@B»ññLca@B¼Ú!VŽÃ@B½WéÂR…@B½kDvþî@B½0„dÎ@B¼R²#b@B»&Ò³?@B¹ º¾@B·/ác @Bµ%˜ìwq@B²Pù¸Þ>@B¯u4­@B«j3Sèÿ@B§Xa U³@B¢Ý0I×@Bø×Ûï›@B˜«“ryJ@B’õ£Šìc@BŒ×MbŸ@B†PÚç@Bbš¤ú%@Bx ß·s@BpP³,|@Bh,\–ÔÖ@B_¢P³>È@BV²B˜) @BM\šþ#z@BC¡Æ°@B9‚6tAã@B.þ^ôRK@B$¸¥I@BË¿®’<@B óн@B ØK¾ì@Aô›óÄÒE@AçÈÐ+ú±@AÚ”ú¡;‘@AÍYŠê@A¿ }ƒŒ @A°ºÿ,@A¢ !"À@A’û~ÝðI@Aƒ¶_`³@AsÇh@¿@Ac£6Í4@AS#Ç|ý@ABIÁ=£´@A1Í,Ÿ#@Aˆ–IhF@A ¢É_ @@ûeèG‚@@èÐ(õ;@@Õä·ÅŠ@@£r&¦­@@¯ iÆ @@›"A:ݨ@@†ãÁ…W@@rREY¤@@]n†oLz@@H9=sƒ@@2³$<™1@@ÜõB-€@@Ñï 1ø@@ãÕ9ýÏ@@õcx>ÿ¡@A™'†Oe@Auž¦©@A'ø70©@A8 L©4T@AGí<¤ )@AW^fÞyz@Afs-Z(W@Au*ôwí!@Aƒ…#¬ö@A‘"š6º@AŸ_.;@A¬\G¸2¢@A¹:N—X@AÅ·æê®)@AÑÔŠIg@Aݳ?ô@Aèèà6å@Aóß’þ-@AþsPäÊÂ@B£¢Ò£@Bp_+ @BØ8êKÈ@B$Û¡²”7@B-yçì¬@B5²§Ö+@B=…Ъ3@BDòp`-@BKø’К@BR—/q,6@BXÏ ²v‘@B^Ÿb|Ñ8@Bdñ…ãÌ@Biw"Xd@Bm ·Tds@BqÐzÙVr@Bu—6!H@BxõÆÂÞ×@B{êøµCj@B~w)üŸ@B€™Á,ö¤@B‚SÀƒQ@Bƒ£ã_T@B„‰c•’@B…/Ü%@B…cô@B„ÂþaÍ@@B„Õ'÷@B‚Ù}D±M@BFxÝi@BJ Ï@B|äHGÒl@BzQnož@BvÝG[¹=@Bs5þ¨Í‰@@)u77%4@@c6U—4@?þe.âk@?ÒœÆij@@œËk_B™@@®’Ik@@À^]}Œ@@Ñã±£@@áÖäàÔž@@ò;ä1¸2@AFÞ¤p·@A÷5×@A!LJxÃ6@A0E„S @A>âI}œ8@AM"ºY@@A["a-<@Ahˆ®“¾@Au­DŸ¸@A‚s0 *×@AŽÙK¿kH@Ašß’;©@A¦„ƒµ @A±ÇœÒ@A¼©f/T@AÇ(æL‹¯@AÑE© U@AÚÿ=zT @AäU6{7N@AíG*ºF.@AõÔ´ÅM*@Aýýs j¼@BÁZwö@B  Âk@BVR ú@B©iÕ:@B ÕÔ¿ž@B&™ç{D¦@B+÷ÇWsÅ@B0îg@Ù@B5}Œ¡w/@B9¥‚Îþ@B=d”™îÿ@B@¼RƒN@BC«gØá@BF2]#Å@BHPÚø“¥@BJÇù@BKT¤}@BL8¢Z‘Ã@BL´uc¥A@BLÇ‚ðÓ@BLqÊlª@BK³Nìæµ@BJŒQ8¹@BHü: +w@BGÁé@BD¢ÆÊµ!@BAÙg·Š¡@B>§Å%¡ @B;+ݯ@B7 R¥4X@B2¢Ý&ü@B-ÑØö=v@B(™~ûÿ @B"ú ¸—ž@BóÄ6 Z@B†ëù{°@B³Îó±-@Bz¼pÇ@BÜ@AøØ „Ó @AðoÞ%@Aç¡¢Û@AÞoý8ªg@AÔÚ–*GÕ@AÊáØ­õc@AÀ†4A|X@AµÈ œ@Aª¨ºø‡@AŸ&n‚‘Ø@A“CÐíГ@A‡®Ò/…@Az]Œ4Ž;@AmZð06@A_ùdÝœ8@AR9w8ê@AD·W@A5 ¶Â\@A&É sËË@A•L¥×û@AD µ@@øþ‚Q4@@çשÂâ@@×9¶|pu@@ÆBÇ K=@@´ó€¯H@@£L‡7?R@@‘N„‹«Å@@~ú!Z‘Š@@lP|–‹@@YPæ-Ê-@@EýgõOþ@@2VÑ"Ä@A¹ÅÞ&l@A$‚@&y…@A1íð~k@A>ùÚ9q@AK§æÎ߯@AWöÀf W@Acåä¶@AotÔŽsŸ@Az£ðâ@A…p*%ÿ@@AÛ¡ØÎë@A™å )­{@A£‹ñÆ¥U@A¬Ïñý@Aµ°Ÿâ¤@A¾-›Cý@AÆFƒÛn@AÍúþZÞ@AÕJ³x7ª@AÜ5P›:@A⺅^*@AèÚ¦ú—@Aî“‘—@Aóæàn™ß@AøÓ¶Å3*@AýYÛJ—M@ByK" @B1@£ih@B‚%Êàd@B k¡Ý~à@B í’¤i]@BÚ”c@Bºa_L@BÍ#7@Bçݽ³@Bbº\Ê@Bu¡þh3@B “Ù@Bc“˜$¨@B>ª6±@B±å!Ƙ@B½V£Fü@B aÇÐC@B >Yõ@BqðÚ N@BßRzÑ·@AþåG$@Aú„Ï!Dà@Aõ½KªÛ`@Að:G™@Aêú×®–@Aåbn&n@AÞ !]Žf@A×Ú] Â"@AЯbñ¬n@AÉ„ºÂ`@AÁ+3·Ñ@A¸Òw8u·@A°ÿ¡Zì@A¦ö/ÐM@Asz9h@A“u×JË@A‰E›Hϰ@A~›øeèS@As‘DÊÖ@Ah%-dB@A\X÷“—ž@AP,Ýݲ@AC¡all@A6·uð†@A)nT!¼,@AÇÔo<@A Ä͇@@ÿc¢”§ƒ@@ð§È‘@@áŽö#ç@@ÒæiÀï@@ÂN{¤k¯@@²'Q?¸@@¡§Ê•­@@Î3/ç]@@€Jáü@@n÷@@\7¾ü‰@@J~¾FA@@7x¯Žï,@@$š<.¨‰@@gÎç±®@?ûÄ&ré @?Ôk‚ã@?«¾ÈIè@?‚Ç™ðß„@?Y/?[àY@?.÷õøo@? ˆ‹ 7@@2l‡Ñœ‰@@Cõ¯…Ô@@U' ÞEÑ@@fñ¤a@@v„ï¯ì*@@†¯ýìº@@–#þ@@¥øìKëâ@@µ˜¿øò@@ÃÙwú–a@@Ò@÷Ã#¸@@àLˆEx)@@íûœ*?Y@@ûM¨¯C5@AB%¿š4@AØŽ ±Y@A!_!(ï@A,é‚{@A8b@¾c@AC{[†û†@AN3óÈ‹¡@AX‹–¿øZ@AbÕÑ@AlBÚðà@AuHwÏ¢I@A~FK@A†„¨Pˆ-@AŽå͹½@A–3n}òÿ@AtíF:@A¤RHcÙ@AªÊŠç„¡@A°Þä–¯@A¶Œfg¥¹@A»ÕAÜvð@AÀ¸jQb@AÅ5¦îì@AÉLÅ.{Y@AÌý•º×k@AÐGî¶@AÓ+¨1õÅ@AÕ¨¢·êì@A×¾ÀмŒ@AÙmêJ»@AÚ¶ ˜¸ƒ@AÛ—Ö[¹@AÜþËlõ@AÜ#Àî@AÛÏ[d1/@AÛÒQ@AÙñ-PR@AØgz| @AÖvËc0'@AÔ6‡c˜@AÑ`× éñ@AÎ;̯;‡@Aʰ;Äl@AƾM)rÝ@AÂf.A»·@A½¨èÃ@A¸„+i{@A²ú¸oðõ@A­ ÷8Â@A¦¸*im7@AŸÿš/¢j@A˜â’Sq@A‘aa»|@A‰|]'òk@A3ܬ@Axˆ:W@Aoy×bδ@Af Õ@@A\6^Ûë{@ARÝns@AGl¸®Å:@AñE$}ž@>ÇR¹p©½@>œÂ}HâÙ@?úcbÂã@@›–éF¡@@¯[Cnw@@0l`ÜÉü@@@Ò ;+X@@Pßôm@@`”ï„*é@@oðùæ¶J@@~óO-C@@›]×Dr@@›è–©·Î@@©ÚlÆÌ5@@·pUÅv!@@Ä©ÉÈñ}@@цC˜&a@@Þ@´è’@@ê&As ?@@õèÉ2g@AL]Ń@A Pˆçã½@AôÖô º@A!8ש!2@A+U@A4ž@Ñg@A=¾ÙÇžÀ@AF}†•,@ANÙèvϺ@AVÓ¤cpª@A^jcZé@AeÑHß»@AlmŸsNc@ArÙ‚-=ª@Axá2°@A~„kç€@AƒÂðŠôd@Aˆœ…!§@Aó{¬@A‘ ÎS@A”É–5¿m@A˜ sö u@Ašë|9î@AcŽ_8ç@AŸuŽAJ@A¡!d?5™@A¢fý@ãè@A£FJ»:ž@A£¿B³HŒ@A£ÑßÀsV@A£~! ¥ò@A¢Ä Y8@A¡££õ€f@A úÄ<<@Až0 6‡H@A›Ý*G«)@A™$3xž~@A–ZÊD@A’€Ã¶´!@AŽ––)“1@AŠFþwzI@A…’-Ttå@A€xWÉ™p@Azù·)Á]@Au‰f‰@AnÏ«Ô@Ah#V—<@AaS¨„C@AY¡ªÕo@AQËäìV@AI“XÒo­@A@ø`«ç4@A7ûYxµq@A.œ¤Qw•@A$Ü¥éÓÌ@A»Æ|¾¤@A:q¸@@AY¨Á@@ú'£ê@@îx3Ã@@âyfý"@@Ö‰².@@Ébð˜Ž@@¼JN3]"@@®Õõ·ø@@¡~h$ï@@’ÙqÂl@@„R[¬É@@upÊʉl@@f5O‰Ì–@@V |æÀ‰@@F²çæ‰S@@6m'•†d@@%ÏÔïÃV@@ÛŠÉ~õ@@å·Ïx@?ãáòÔ×@?¿ö ¿-ª@?›bnŸ@?v&pe7 @?PD`¤D@?)½1þû@?’0 À†@>ÚĪ¸Ì€@>²Uòkº¼@>‰GY¨†±@>_š4‘MF@>5OØ»À@?ßüü¦@?²uêÅ—,@?Ôap¿)f@?õ aš»·@@ Æ:» @@ âò$@@*¢ïd¹@@9ã[™ ò@@HÊ•ê8@@WXÉÜÅ@@e‹<龨@@sc“Pº@@€à‹r–@@Ž FŽ®@@šÆO]úá@@§.úÆ“@@³8€%Àù@@¾å Ä´'@@Ê3A°=Ì@@Õ"°É`À@@ß²çÆä@@éãv±ªà@@ó³õ*a6@@ý#ûLx6@A3%Zfg@Aá¾ø@A-gàä@Aʳ.w@A&ŸæHƒc@A-Åi#OA@A4ˆŸß@A:çrÁ@A@ãhŽM@AF{§ƒÚ´@AK¯ñ>X;@AP€ 8‰µ@ATëÃMÛ@AXòäÃÆl@A\•DW©¯@A_Ò¹D¸Ì@Ab«NV@AeV”7@Ag,C™.–@AhÔÏI  @Ajæý‰R@Ajõ|‚N•@Akm†úµ@Akþv=@Ak,äÌúg@Ajt<Ät˜@AiV|†O@AgÒfŠán@AeéUø[²@Acšò=GT@A`çU<Ú@A]Î?¤Ý@AZPìí!@AVnkDH…@AR'C“e+@AM{¥nØ_@AHkħ"2@AB÷Ù>ö@A= Z×Ü@A6ä×> r@A0FE3ìÖ@A)D±†™!@A!àhoJ@Aºã6@Aðú5ÑÕ@A f€£P–@Az¨¤ê@@÷-Ñ(ü@@í€\¨—Ð@@ãr±™>@@Ù7½–á@@Î8]C…‚@@à ‘€n?@@·‚Gs¦÷@@«™õ,¯‡@@ŸTµ¼+@@’±ýõº@@…±•Ãwì@@xUù}D@@jžÎCïÄ@@\Œš¼Ù­@@Nè©g@@?YAŠes@@095eJ@@ ÀR•gÁ@@ï,§]@@ÆU“ô@?àŒÊ-±¾@?¾ßäË«@?œ‡.aõ@?yƒÜuÙm@?U×)n¼‹@?1‚Qê@? †“ñcØ@>æå2©¬ø@>ÀŸr Þ@>™¶˜žÌú@>r+ï?V“@>JÀštó@>!6Y2ˆ@=÷Î-ÖŠ@=ÍÉ.ï’@?%LS:µ@?G¦Í zZ@?iVÈ_¨>@?Š[áf@?ª²œ¤“@?Ê\3sã@?éVZÅÞ@@Ð6/µ@@œR £@@!¯½ñÙ@@/) ÿÍ@@@<èò”˜@@JLZÕçR@@WUHd´@@dcçý@@pS0RÛ@@|G3QÌö@@‡Ýõc/o@@“ë¾'@@ñçKfü@@¨n6ñÒ@@²‹…r’x@@¼Ij˜ø¨@@ŧ{}Œ@@Î¥hŽ¿5@@×BÁ¸Š@@ß2_Nc@@çZc€Ä&@@îÔ½ºB@@õë½m'@@ü¡Jª»O@AôagQ1@Aä½v q@Arš¹Q@AœH–ÆW@Ac5yÅ@AÆWI@A Å]ý¬=@A$`¢RÙ@A'—¿µ$@A*j’½Ëä@A,ØüIP«@A.âá}F:@A0ˆ+ÎSq@A1ÈÉà<@A2¤«@í×@A3Èý@A3.—¨@@¬&íÔf@@¡ÍgÄ@@—’œ‚7@@‹ý·Z@@€ˆü]$@@t¶ÕõŸä@@h‡ºW: @@[ü"ÐÜð@@O‹uA‘@@AÑsSO@@43ZÚ€_@@&:ÆÐàº@@è=1;I@@ ë©1N§v@>Ç’þ\×¹@>¢Ö²]«Ó@>}u‰;(A@>WpÁT-@>0É›T×@> Z ¦ç@=á™B:×o@=¹š‚Ã@=î«%üK@=f.½î›†@>º««ˆ4@>ÜÊ-!Þ!@>þ?ØJ@? 4wyÆ@??'l›¾@?^˜˜;™–@?}[›6(Ç@?›oZüP­@?¸ÒÁ uo@?Õ„½mhø@?ñ„Atæ@@h!ä§Õ@@³àÅwZ@@ ¤Ý˜×@@-:›P‰@@9tŸ @@ERrdÛ£@@PÓŸÚC@@[÷³Kÿq@@f¾?ýs®@@q&Øîes@@{1ˆ@@„ÜŽR5ã@@Ž(â-ß@@—±å>@@Ÿ¢žûeD@@§ÏSk­â@@¯›y@•µ@@·¾÷ @@¾Ö®BL@@Ĺv6x@@ËWL'@@Ðå6ÄMW@@ÖgÖ`@@@Û‡û¯û@@àEmë]N@@äŸûþSÀ@@è—vd@@@ì+²Hþ@@ï\ˆó[ã@@ò)×Í @@ô“€iÅ€@@ö™h‹Á@@ø;z22@@ùy£‹„¿@@úS× Ì©@@úÊ eÐ@@úÜ;-]@@úŠfÁNW@@ùÔy–`@@øºÀx¥Ú@@÷=À½@@õ[g“é͸·L@>Ç'ØhQ@>¤žP€ @>l‚!•d@>]”~a>@>90Ò‡³@>õÌ)3W@=î1Š0È@=ÇË¥3|@= ÅZ­I@=yéfŽ@=PÜ’,@='ü—|<Þ@<þ=aÑ@>OýdIE@>qàaO˜ý@>“¤ˆíA@>³« )}n@>ÓuÁç„@>òÉÈhss@?Uêâ§Ó@?/3ÈÎù,@?LbQ·¡@?hày®Þ¯@?„­8“©ì@?ŸÇ‹ QÕ@?º.r¡s@?Óàõ6"Ê@?ìÞøñq@@’~”Op@@ZT(88@@Æ8 ¥@@$Õj™ç@@/‡Íä ì@@9ÜÞÓa@@CÔ6 ÍF@@MmoÍ®@@V¨+ßa@@_„ úö@@h·GJ@@pÖ, @@wÛ±{@@8'(y;@@†4½0¤¯@@ŒÐ«Þ@@“ Y¾Iô@@˜äÚDíæ@@ž\ÓâqL@@£s 2ž@@¨'P«@@¬yk,œ@@°i0ˆŠ5@@³övKÚ×@@·!ŸYÑ@@¹èï·S¦@@¼MãÙò›@@¾OÙeJd@@¿îºÔ‘Í@@Á*vĈ@@Âÿ÷ß@@ÂxMU©›@@ŠYóÈß@@Â9%_ @@Á„²?@@ÀmŒ^q@@¾ò4r@@¸/jiƒ@@µ(² “@@±¿I E@@­óQ ¢‹@@©ÄôÉ ã@@¥4^æó»@@ AÀRý@@šíMQD @@•7>øŠ@@Îo:Þ@@ˆ§>OFG@@ÍÑ)íé@@z“Î2qº@@rù€>±t@@jÿ5¸ÃŸ@@b¥@÷@@Yëö)E@@PÓ¯Oýùõ—ó?@>Þÿ2Ô{@>¿XŠ‚+ð@>Ÿ2wV@>~ ”0ùÔ@>\cÒT>k@>:`È @>!yHúX@=ó‡4ïF@=ÏHqý£L@=ªf`½cT@=„â3ïcÇ@=^½ ¤«Ô@=7ø^|6@=•%„Ú@<蔲œ@<¿ø@n¨@<–ÁÚ{@=åAÕØš¨@>é½®»z@>'éÎ qž@>H@é¶i@>gíöÙ§ß@>†ïßÈ~@>¥E´T8@>ÂíùÎ48@>ßèt,U@>ü2Ò×Sü@?Í8q€À@?2¶E-–@?Lìÿ­=@?fprÝ@??¯CÁj@?—YÊ.X@?®½Ýà}@?Åk º=ü@?Û`sÞŸj@?ðFûæ^@@Yð¿A@@ tø¨ÝT@@üÀ;@@%k·™ÿ@@'ð†Njå@@0]Ì¢¬@@8jÅvM?@@@CíÄ-@@GhCBÞ;@@NWy–¹@@Tæž@&A@@[o¬†Ñ@@`ã­™];@@fQ Bi@@k]‚¿fÉ@@p­@ŠÐ@@tRjçG}@@x:Žè¢U@@{Àð]èO@@~åjL˱@@§Û®Á@@„'w˜8@@†4›MJ@@‡¡îc@@ˆÛBá€K@@‰²&@@Š&ŽÏÆ@@Š8x>Á±@@‰çá¥y§@@‰4ÎX¿ž@@ˆE¿Î@@†§SOI9@@„ÍïJ@@‚s vå@@ñ°[_@@|ðÚ@F@@yŽÖÁ'@@uÉu!Èó@@q£1s§÷@@mp-ÿÁ@@h2`‘,l@@bè5²ó@@]=&t|Â@@W1mw˜@@PÅIZØ@@IøûH ½@@BÌɲ}M@@;@ý~´¾@@3UãZ@@+ ËdÑø@@"c #ì@@[ómkW@@öä`§Ø@@49M˜­@?ø(¥P ˆ@?ã/'êÓ @?Í|ÇvfD@?·VÙ‚ç@?Ÿð®±ôø@?ˆ­/6í@?o‹5ìƒW@?VI1ÊgÕ@?êF‚„à@>ÍŒqb`@>°"í[‰‡@>’ "4¸Ò@>sH¼wBh@>SÙÍ{”@>3ÀjO¯ä@>ý«Žêý@=ñ’­9ƒt@=Ï€ŽŒ’Ñ@=¬ÈqÚ‡@=‰k|aiZ@=ejÖ'Œ@=@Ç©Ð^Ù@=ƒ$w½Y@<õžu‹,Ý@<ÏΣîK@<§ùca‚è@<€;iD«É@ #›/@>9*Ά^E@>Vž02„@>sdC'Ô@>|Ýïœ@>ªä{ó@>Åœ©´Ì@>ߣ…^$@>øøfÇ)@?š @?)‡Ó' o@?@À¯§mÚ@?WCÔ§ô‘@?ml»X@?‚%¥’'@?–‚¶>£7@?ª&Ù5Ä—@?½O„·È@?ÏA`Sù@?à¶Y¨j@?ñod¡%@@¶+Ò×á@@V QëÉ@@—÷Nc@@yô£@@û¨óE@@#Ÿ e@@(á¶:L@@.D³ Ù@@3G`K  @@7éˆûâb@@<*þ &N@@@ “ðm"@@C‹"ríì@@F©…ƒæ@@IfœÜ¯Ó@@KÂLX@@M¼z ô@@OUHJb@@PŒ–û@@QaI{ú+@@QÔÏ×C¹@@Qæ–pŇ@@Q–œC)@@Päåt¿@@OÑxZ‹@@N\`vkp@@L…¬ñÉ-@@JMpéù:@@G³ÃkÉÎ@@D¸¿nòµ@@A\ƒÐÂ*@@=Ÿ3N°@@9€ô|FÁ@@5ñÂo@@0"YOl@@*â]ˆC@@%B2²¹@@BcÚ@@âèîµòv]@>Ï(ršäÐ@>´°œ¬á@>™ˆ&Û1d@>}°oú‡@>a)=%íï@>CôÅJ€@>&¤(ºÊ@>†â¾¥@=èOŒ·DÞ@=Èn±¶µÔ@=§ådäwY@=†´¼Æ÷ð@=dÝÓ@=BaIJ[þ@=A±Bd@<û~»H’„@<×ß @<²¾—úñ@<Œp XKó@×!ßÿ*@>"¼N(íP@>=ó9*x½@>Xzï7À@>rR€O(ì@>‹yC$â@>£íŽÜ ò@>»¯Dþ£ @>Ò½Hb@>éÂÛ'@>þºâ1%T@?¨Ús'@?'ß儘ë@?;_BUò‚@?N&6*Ëñ@?`4 'íÍ@?qˆfb@?‚!©ä‚—@?’&ÿê“@?¡"ñ6Õ¾@?¯‰srJ=@?½3K\f@?Êm%bŒ@?ÖMÜGZ@?á½òò|á@?ìo>{ß@?öaS_=@?ÿ“ÍT¾:@@'±àÿ@@ÜAúR@@ Up”—@@miÁŇ@@%4bþ@@|R’Ê]@@r¬gÚ{@@-Ì^m@@<Ɔ—Ò@@j;³@@ƒo)«@@”´Š}%@@EUØ ê@@”÷†=¢@@ƒ ¦H-@@\*Í@@>8å´ú@@ I…I_@@u¤@@ €dbá´@@ *§&Ô@@tŽÐU@@^A2@?ùÏÎÔä/@?ð#]æ8°@?å·‘®‰@?ÚŒÑ ò@?ΣŽÂ@?Áü?WÞ@?´—bøe@?¦u~??@?——¯C\@?‡üÑbø@?w§5~g/@?f–èÏýC@?TÌ‘Šœ)@?BHÜ)Ú"@?/ {Rï‚@?'µ7×@?lŸéë @>ñ ¨S÷@>Úó ú5@>Ä&—l±@>¬¦"›$÷@>”r†³Øq@>{Œ¢ÿÖž@>aõ[¾`ï@>G­š2œ@>,¶K‚nè@>b‰F­@=ô¼Õºa…@=×¼Ÿ÷§@=ºÀ6¾@=›º9_~ø@=|º"šl@=]TÓý—@=<ÁEf8@=ÊR 1@<ú.3?ƒ1@<×íÈŠ›!@<µ ,ÏTÌ@<‘„}è\@ùÚcy—@>òuXJ_@>6:9Ÿ¬ø@>MÐJÆî@>d³ÑT1Á@>zãúéT»@>_úf`ì@>¥' z@>¹8aš?@>Ì“Jv¼@>ß7 Ʋ/@>ñ"ô’¶Î@?VYã1”@?Жßà@?"‘ èÙú@?1—#º{È@??âI€è8@?Mqòö.j@?ZE›zÇ©@?f\Å-ÍÎ@?q¶ùÛ@?|SÆÞ@ø@?†2Åf@?S“6Ú|@?—µÔÆzâ@?ŸY6ŸÑ¡@?¦=l]åÕ@?¬b0ñº™@?±ÇF¯tt@?¶lwZœ@?ºQ”.û@?½vuéãì@?¿ÚüÕü$@?Áʪú@?Âb¡4Ò}@?Â…¥)@?Áè¥Î@?ÀŠ bcô@?¾k}ÏÐq@?»ŒÄNÖ@?·íV8û@?³û¯Zd@?®nª3Ê@?¨•K–@?¡ð÷ïÔU@?š“-3@?’v4»5l@?‰š©¦l@?€Ëˆãh@?u¨ùÕ›~@?j“›•=@?^Áí¦s@?R1óØ›@?Dæ›A @?6ß•VÝ$@?(j÷/W@? «–#:@?ií$bÇ@>÷yËôåÐêËŸ@>Óoñâ:§@>ÀWŽ*Ó@>¬ˆ{[M:@>˜lÑ8Ç@>‚É%%‰M@>lÚjSÚ@>V8áüv@>>âËóy“@>&ÛŽòg@>#*…ž@=ôº~8aœ@=Ú¢nS0@=¿Ûã»]@=¤gËʯ@=ˆG-ñJ@=kz¾ÁÎ9@=N¹iÿˆ@=/ãï{@=¥ØÖö@<ñ¨žI˜Î@<Ñ÷ÙÃ@<°Ó¾o•Q@ «¢fö;@>!ÿØ1À@>6 O3Ñã@>JŒIލ#@>]ÑÑÚ@>pCëJÀw@>‚2Œ“\@>“!= ¸@>£|i„Åm@>³Ć@>ÂÁ×(\@>Ð8ʆÿ@>Ý®­O‚@>êiéÆ\q@>öjb@?®ˆ¸¬9@? 7 &_ @?á®ô@?jN @?'d‘ÎÔ@?.ùDU>@?5Ð6ò&€@?;é&"ÀŸ@?ACÕX@?Eà]lá@?I½¨¬*U@?LÜx*“‡@?O<_Ø6@?PÝH4O@?Q¿ ·½¸@?Qáàï&š@?QE‡d‘Ë@?Oê+ÿ”@?MϦÆ%Ç@?JöBÞŒ@?G^„/&@?Cªèp@?=ñ¬ãS@?8çºÜ–@?1Œ§ó@?*ú˜Î|µ@>îÜßÓÖq@>âe¤2}@>Õ3”F—õ@>ÇG/a¢È@>¸ ûa9@>©A„–yÁ@>™)]®=²@>ˆY•ðT@>vÑiaLø@>d’à.ƒ›@>Qž/ ¨l@>=ôÏYæ@>)•©*@>‚0êOÖ@=þ¼ù?@=èCU&“¬@=Ñùùé@=¹=¿i޽@= ²|ÒH@=‡x »ñf@=mNÃÇ-@=Rù'½Ì@=7¶~0~ˆ@=È@ô&z@<ÿ/`LÒj@<áìÑ(¼@<ÄŒKâI@<¥nŽ3z³@<†4ÖêàÂ@Lîó³@>õÞdéJ@>#èÕ€H@>4%6u°Æ@>CªirœP@>Rwܼ[Ý@>`Érä@>mé\Z Ø@>zŒds@>†u¥¤‚@>‘¤«Ù¾@>œ ÜvÃ@>¥Òf‡o¬@>®ÐXqú@>·‹½}Æ@>¾˜±h®@>Åb€ç¹@>ËoµÓLJ@>ÐÀ¡m*@>ÕSq°7”@>Ù)—O–@>ÜBbüÂÐ@>Þ¶iFÒ@>à;z€£Õ@>áŸl¥“@>á>˜XÏ@>à¢ð±¦í@>ßJ!©•V@>Ý3¼³(s@>Ú_Ö@êÜ@>ÖΊ½@>ÒúØx4@>ÍtRÛËÂ@>Ç«ÃHý@>Á&„yƒ@>¹äÕß…Ž@>±æýô£s@>©-J-˜>@>Ÿ¸í ü@>•‡§tá@>ŠœuÐèž@>~öâÍo@>r—]ÜßÇ@>e~]W4@>W¬\Ñ(@>I!à-—Ý@>9ßp^Ê@>)åœáµM@>4ûT‘â@>Î'\ÖQ@=õ±ÂŒr‘@=âàtF=D@=ÏZ顜ø@=»!ÕMx@=¦5ïryü@=—õ”­*@=zHªtˆ)@=cHÕïeï@=K™Dßø@=3:Èûq•@=.8µPS@=todv@<æK¬Œ°@<Êü²JX"@<¯@‹át@<’ÚÁøuÄ@¯a@;v¤•Ö€@;SDd4ˆ@;/Õ†û€@; É3-U@:ç id%@:ÁÜG©¸@:›ýæÕ¢X@:u†aàÿ¾@:NvÕ’ ›@:&Ð`_ܺ@;cדڕJ@;„%œ4×À@;£Ñ£™@;ÂÙj†{@;á ­çÓ@>±â7¥@>!™kíÍ@>+ùÝN2Z@>5 £·h­@>>cxÉ@>F¿Ç®æ?@>N7‚ÿ`@>TôK=@>Zõâ­Ý@>`<Àý@>dÆœÈÌ“@>h•aÔƒ@>k¨6þU@>mÿÝrê@>o™¨$æ›@>pxXóè@>pšXÝ…@>pW¹@>nª ­@>l—ÀÝå@>iÉK °@>f>ÛöàÊ@>aø•dƒ@>\öŸX«I@>W9+N(@>PÀoJ—Ó@>IŒª rG@>Až <-@>8õ™Žò@>/‘ô§îÉ@>%tþ£~s@>ž›p©@>1ŠÔÌ@>Ç-ò Æ@=õÇS@=è-Ë>Ú@=Ù +!æy@=Êz‚cªà@=ºž¿òHZ@=ª v1o @=˜Ç=m¿C@=†Ì³Âó@=t}?¬@=`½B‘ø3@=L©³[|@=7䃤~ƒ@="nlö§Ç@= H.«~@<õrŠwÍä@<ÝîJøìö@<ż<é@<¬Ý2U©D@<“RÔ3g@Ã@=ô9“p<@=øù‘@=û ôÇ«ì@=ý`?…ôF@=þ÷Ñ%B@=ÿÔšíU@=ÿö“hÚa@=ÿ]º–«Ÿ@=þ ¹"b@=ûû±mÛ³@=ù2¡@-@=õ®ÿ¤ÐG@=ñpíö¥@=ìx”o]@=æÆ"Ÿa@=àYÌéÑ@=Ù3Ñrw@=ÑTsó@=È»ûöÀ@=¿j¼´Þ@=µa ˜¶ú@=ªŸIm @=Ÿ%×l¾š@=’õ!4âE@=† —±Œ@=xo² x@=j팈+@=[͘R@=KTÛ†¤É@=:⦕†@=)¼ÃÍKå@=ãÍèÚÒ@=Xe;¶@<ò/—’h@<Þ,Ø19ò@<ÉŽ„Ê®@<´?‹9Yp@<žB×@<‡–?Š{#@.ØL7B@2s@=A~çÈ•"@=K·üƒ‹à@=U:gj@=^éÆóî@=f^¨>@=ms^búS@=ttv@=z(ËÔ@=3$µW@=ƒ¬Uò¿´@=‡l‰èåÝ@=ŠsœïÔ@=ŒÁr²U@=ŽUõ 6¦@=1첨@=RÎ’m>@=Ž»Ut-@=jÃ0Á@=‹_‘1i@=ˆ›Ù¼ J@=…öA½n@=€é_FÔ@={ú4i³©@=vR«gW@=oò¡™ÿ@=hÚP™¡[@=a üÎ7@=Xë®c@=OBn‰d<@=EKÙí…@=:ž‰”}V@=/:߈wZ@=#!DÐQ@=R%ª æ@=ÍøßNW@<ú•8I«@<ë¨dr2z@<ܽÜZ@<Ë´¢W#©@<º®Òµô@<¨÷*k_À@<–ŽHA;;@<ƒtÍè*¹@YE@;Œ>Ã9òÒ@;£î•ã@;º}·ŽD@;Ð!rÜ!@;åCPÊž@;ùÕVq@< ¹‚ü»Ñ@< ï+C†@<3u©SS·@@:àŽ`@9íhähÁ@9Ì åû1@9ª=S·á@9‡¾X‰–Ü@9d¤óK4@9@ò%$Ýu@9¦ñnë’@8÷Ä]“w5@8ÒKpñb@8¬=4¿+‘@8…š³î(e@9·XÐlº@9ÖÇÉ÷vÉ@9õ—À/‰­@:ÇÇý"@:1VùYRè@:NDok¾)@:jH¨Ç@:†6¦ì]y@:¡9¯žVô@:»—‹É‘r@:ÕOh<Îô@:î`u§sÖ@;Éè¶¹ @;Šú2¡á@;5¢çª¸@;LðÂ*À@;aÔ\ì\ý@;vìuè 2@;‹XŠªÃD@;Ÿîë¸?@;²)û=ÿÝ@;ÄŽ *iÐ@;ÖC‡H½×@;çIÑXeò@;÷ XXyö@<FŽŸ#ð@<;ëðTò@<$í“Â@<2j!‰@<>ñ@®˜\½@<«ƒ·ÇÇê@<­1€tÇ@<­ê ›y#@<® Dm§@<­uÔÈâ—@<¬)ÃüUá@<ª'Ó….@<§mô”Al@<£þ`û{>@<ŸØ‚8÷q@<šü}éæ™@<•j€b,@<"»Ñ‚@<ˆ%g®:%@<€rÄâ~¤@n4O@:•ôÈÕC@:+§(êpÀ@:CŒÔ@:YÖ~áø@:oòSÁÕ@:…f/ ÛW@:š0öÌKg@:®Qÿråq@:ÁȤZâ,@:Ô”DúŽç@:æ´Ej™@:ø(:¼¥@;ï@;».fº@;(tˆßЧ@;71öŸ¾¢@;E@‡9}¾@;RŸÂ×Ô}@;_O7qH@;kNw"ò@;v°h…@;:Ã&U@;‹' #F@;”a±ï0@;œêQâ@;¤À§@Í@;«äoB.Å@;²Uj‹‘@;¸`¤ç(@;½$ Â@;Áuyµ­@;ÅJ!ì—@;È pX‹q@;ÊEÒp„€@;ËÎ\¯Sf@;Ì£‹³l@;Ìù¯èÊ@;Ì0ƒúýç@;Êée€ô.@;Èîi‰èm@;Æ?¡*á@;ÂÝ%=Kö@;¾Çf¥@;¹ý²B@;´€¿7E‰@;®PÙ/5G@;§n2éª@;ŸØ£Å@;—Ò‘þ@;Ž–æu_@;„ë-a å@;zûTs@;oªå–@;cÀ™;}ó@;WQ-ð ¦@;J1Ó V%@;¸/´É@:iå0ó-@:ïIñ[P@9êϨC¼@9Ñ ÅâI¤@9¶¤lYÊJ@9›šhçŒc@9îŒ`ëÇ@9c¡«ÈÖ@9F´œ¹…³@9)(<<êÈ@9 ýg»ú@8ì5\¸ó@8ÌÏê3öÅ@8¬Ï )²@8Œ3OÙð`@8jý¡~¤Ë@8I.ïͳ½@8&È+à@8ÊIpý@7à6<ø®0@7¼ ÿ$t’@7—O‰(@7qþÖlŽ@7Läôl@8uP #@8”Z‹-mð@8²‰g}û¢@8Ðmœ@8íŽÕ5â@9 c'ùÞ@9%úëî×@9@,9&f@9ZŸÃ@9to¿ìó@9w&q«@9¦'v!#–@9¾ ýÍ9@9ÕMQÙÎg@9ëç»ÀLa@:Û‡ëñ|@:(LX™@:+Ì#\@:?Èy‚€@:S#g»_@:eÃðέµ@:wÂHÍG@:‰—¨I@:™½Nƒ‹à@:©¸ãw®T@:¹ѧ,[@:Ç©™RÔB@:Õ¿í“à@:âãÐ/–b@:ï{Z(¬8@:ûcóQö5@;6žÍÀ@;&ÄŒãª@;C3à@;$)^RLX@;,¡Ç^U@;4i5kµ@;;eë¯Ô@;AäR—ö@;G—†ö—@;L˜>8g@;PçO ñ@;T„+›©@;Wn´P”@;Y¦ÐlÕ@;[,lJ+@;[ÿz‡Ö-@;\ô,O@;[׿oÀ@;ZI*ä&{@;XQø)@;U¨P¦Î°@;RLK©-@;N>P´@;I}£Ïs×@;D MU'‰@;=ç2ôÊ@;7‡†E@;/Їž 0ÑÑÀEÜÎ3:˜ÀEwhßBOÐÀE“Ã~.IÀD§‚К÷ÀD<&8 ­GÀCÎn[7uÀC^JqâwÀBë«déÝRÀBv°M™ÀAþ»äÏùæÀA„L]•óÀA#s|À>ý‚ëAGÀ=ìNú€Í`À<Õ$™®‹À;·ï4]ÍÀ:”œë*^À9ké,õÀ8;iÍ?GÀ7vR`vÀ5É@gzÎyÀ4†ÊAÆ–JÀ3>! À1ï<„[À0šAýó~óÀ.~ˆf”‹À+¼Ã.3‹÷À(DNÀ&Jœÿ&À#3÷×Ú{À F“Úü(Àžé87C Àž`ü9$À ²¯ÐÀ¶À×r€^¡t¿áäàl?ïùr…ÿ# @‹OO‡æh@•"´$@ëÅ"Yn@Gª2Ín@!Ópbþ@%·Äo(·@(3®Ó‘»A@+bX¶˜~F@.Ž»w+@0ÛðÖ^Bƒ@2nn*x¡n@3þbFjÈú@5‹^‘­çÌ@7ùÿt<@@8šÑ¨•Üq@:‰K µ@;™Ë®„S@=JëSD@>…Àœxß@?óíðY‚~@@®MÓÄÚÎ@A_ÌýË>@B`9y°Ü@B¹öÒ]¤@Cbƒuž½G@Dü  µ›@DªY{ØYå@EI—ÁÜ@Eå´¨™N@F~±–&~õ@G‘\4;¾@G§Xþy-c@H7L0ÝÂ@Hü­µ†·@IMjôCŸ•@IÔ%,6ÙÞ@JW÷qùM@JØîÉÉ:L@KWúhAj@KÒ„j¸:9@LK@=‹î@LÁ[ u,÷@M4åä¸í@M¥îÅF¬@N…›%†o@N€»Ü\ò¿@Nê ±¨Qž@ORCóÇ.@O·µ[r"Õ@P ‚;APT@P> OS@@Pm¼x¼:@@Pœ^$ñ/@PÊ N=÷@PöÏÛÕ¢@Q"¬V‡ƒ´@QM«cij6@QwÒÓ‰9@Q¡)!šÀ @QÉ´ž#!@Qñ{m‚œØ@RƒˆWϹ@R>Ò»¶ò@Rdn©ƒ4]ÀF—ßff HÀF9¾ÎicÀEØWª-§HÀEu— ~ßÀEÅ•ÛÀD©ÔÔ^š€ÀD@¶3WMÚÀCÕ[ ÛßÀCg´ªëë2ÀB÷´i:/{ÀB…K°Â )ÀBlI`@ÀA™\îÉÞÀA©â}AÀ@¢w~e»À@#1á#|À?BdðùUÀ>8ÛN¸3À=)±gŸšœÀ<ÓÌľ×À:ú1f,0.À9Ù»Ã]ü„À8³gpõ.ëÀ7‡,QŸ,HÀ6UùÌÝ)À5ô )-"À3Þúœ·`[À2›"„I5þÀ1QyÅÊRMÀ0à­ß9À-ZG=Ñ!À*¤÷ìÜœÀ'å49ÚxÀ%ß¹¡Ÿ&À"F¢ÉÀÑ´-#æÕÀPÎÕAÀ%s UðÚÀ n1=j]Ñ¿üé<“›×b¿Óøx÷Ø?ó“UÀÖ$ª@;»Ë'>@+³ÐÃ~†@Yâ ²W3@ŒéW¥‹ @!á~íÀÁê@$ý(!Têò@(‡"­×@+2³YÒÿ@.JÆxà @0¯ïPÀ‚@28ŽÛ'r@3¾×¹ßü@5Bc54Œ@6ÂÏRœà¥@8?À ¶Àˆ@9¸ÞÛMd@;-Û‡—UŠ@<žlZ h@> NIN É@?qE(ì¬@@i b–œ@AÑ ïXŠ@AÃX½ggj@BlÜÃôÊ@Côª×jC@C´ð^¶’@DTþú§Ž©@Dò(_ú•@EŒBò7@F#rõâ×Ì@F·¯yol†@GHú÷¢äC@G×Z”—Ø@HbÕü¯@HërS—KÖ@Iq;Ú­D¯@Iô;÷D¨@Jt}÷xÜ#@Jò óá/X@Klø¯^Ê @KåKyo…w@L[ð–ñ@LÎ`•F+­@M??[Ñèê@M­¾ïžW@@Níõ!ñV@NƒÛúZð@Në•~þ@OQ*o Ê©@O´©¸ÔãÇ@P ¥&]‹@P:Ï©[z@Pi˜æ‡æ@P—s=–@PÄeml@Pðv¯í¬@Q«´D/Û@QF œã8š@QoŸŠaú@Q˜hìÃÙ@QÀpB*éÅ@Q纾4¿@RMöüÝ@R4/WñUÖÀF4²LÁzÀEÕ¯µ24KÀEtÃ-sËÀEß-qÄmÀD¬öUû•ÎÀDEû-ŠàÀCÜà)±+.ÀCq—¹ã’TÀCS¤±žÀB”H€CîÀB"&ì:ª.ÀA­¢xOŸÀA6®L‡«ÖÀ@½=í?+À@AEQ6À?…qøuætÀ>ƒ1&j–À={u* ¼¡Àžžrê{À1ÿŠ$´ô@À0ºû.O{À.âÞmÀ,Cÿ–2‚À)š¹LJµeÀ&çÕ®ë‚ÂÀ$+;ÖYIÀ!eNމ°úÀ,ù´V ÇÀ~ƒ×¢~bÀÀI÷Ú¾=Àæãå„‘é¿ødà™uÔ¿©w•žz?öø}]í@p]>²@ºŒ|D@Áðpïùe@ÎV=ÄY4@!îÆßRLl@$öõSÜg¯@'þßL¸Kõ@+®N º@. Œýe<@0†Ud-ØÓ@2’ꉡ@3‚»ÿ¤š”@4ýQZÚø#@6už5Î@7éyŠ[Û@9Ze ½,H@:Çy”ç¦@<0qvÐ] @=• Í\@>õæ\z@@(&’h°¯@@ÓHÃ\P@A{Úö€@B!Ͷx+@BÅôV­v@Ce›0~6h@Dc Wø@Džb†sГ@E6•q·âh@EËúöR@F^§3ë@Fî[& F<@G{]C¯v»@Hœ.îðˆ@Hsüt{@IëÓí×[@I” !hzÅ@JŒ—A@Js]—@K Î )Ž@K‚¨@„úö@KøëR@Lk PVGÞ@LÛ°b–ã@MJe¤;@M¶ëàð'@N  ½2@N‡ÀzÄg@NíhŸ²Y$@OQ ÷†Q@O²©"˜‹¾@P .Ô?S@P8°Úd@PfÎmЪ@P“.Öú"@P¿k + ž@PêÏ—èÆR@Qb@su@Q?)¯zr @Qh*èD ‚@QkÎ÷™Q@Q·ñäɇ@QÞÂ…!O@Râì-77ÀEÔ¦} ­ÀEt×-K¬ÀEËÑûºQÀD°Ô0%î«ÀDKã˱*ÀCäî£JgÀC{æŽoùôÀCÀžÉWÀB£oÕÁ‹½ÀB3çÝXã2ÀAÂކšˆÀANÙ7À@׌¡¼¬àÀ@^±>xRWÀ?ÆÊGâ¤À>Ë¡âùÀ1j×Ç¡aÝÀ0+G “&À-ÍDM7ÍÀ+:›Ø+<À(F½G˜À%ö¶þ¼ÄXÀ#GCEä”cÀ –ÉNÀBÛfÍÀ ¦~?¦Àm\„B«¡À€ô‘Š¿ô¤¿Êi?Ç«O—‹ ?ú/ æ>Ò¡@ÅebV÷@@¾"‹À¶@$mÿ²Y@ Ayîùï@!ûX[«ÆV@$ñ²œ@'æ—®ÖB@*ÛªƒW@-ÍÀÁÊ@0^ñ¾@1Õ] ù+@3IÈŽà¾×@4»Ù£öŽ@6+;îºÌV@7—ž½$ì@9µõ…@:f:dÖUB@;Çê…„˜@=%ˆ!îËž@>~Ý~GÉ@?Ó¸[»íÒ@@‘ö> Ò¡@A7©‰nþ˜@AÚåT^ ]@B{›{Ä[@CÀ]IÇl@CµJ¼#ò„@DN3¢³Mð@DävAÂ#@ExÎ nU@Fÿ\©Â´@F—E¾üÏ/@G"å^ƒûƒ@G«âüu@H2Aü¼z@H¶ËŬ@I7@Ò°_@IµðÇ$é@J2" ý@J«àj¦;@K#3k¦@K˜'âëÆ5@L ÈÛàŽv@L{"!Ò©¾@Lé?Ƭcû@MU.+¢i@M¾ùmF,›@N&®^ù3@NŒYq0¾=@Nð3i%#@OQÄ&¿žþ@O±œ¹ŽØ!@PΟdÇ@P5èó˜V`@Pc#]Ä»v@PƒËÆŸs@P»عÏ@PåÍíËÙ{@QÂûdö@Q8ô¾ž@Qah™?@Q‰#Ѳ•>@Q°+ŽÇù@QÖ„Ô\}ÈÀEu¿[¶ÀExÍ>µÿÀDµ]¾7ÀDR`lƒOÙÀCíwšˆïÀC†•m¼»ÀC¯Úë½ÀB²ºÌ1LÖÀBEªÏŸQ§ÀAÖt‹ÀZÀAe '2PÝÀ@ñi¦½s…ù6KÀ=¯ ÈL»À<Ø5@óÀ; jž‘6À9þÒcfÉ„À8ì4SdF½À7ÔŠuÞ‹À6·Ïí¶hdÀ5–88gÀ4o,lÒ<`À3CK|¨ê¡À2l “ÃQÀ0Ü›§n¸ºÀ/CØÖÌÀ,Äæ”ÔòÀ*<˜÷ç±À'«+‹ À%èfAáÀ"n!.bÀ†dï’©ãÀ! òþÀ¬ÿ‚¬VÚÀV•*À9Ö,îK¿ð 㮋ɀ?Ú4Ý Á?ý;Å£÷˜5@ Ö` ¨×@À~lË]@Í*üÌb@Fó÷Ò°@"B ë?M@$ëˆf¦Q@'Ï”Y8á@*²¬µ¬Æç@-”Ñÿ|\@09–´@äñ@1§˜«#@3¾))ç@4}´vK¼@5å,2£²Ž@7IÙ“º»@8«u¡®°@: ¼­"Í@;dp_½ªÖ@<»Vý/`@>;°DÏ@?\î›]®{@@S¢m×Õ@@öŒ@?”—@A—$;Ä/ò@B5\7ó¿@BÑ(Y-«$@Cj~ûõc¾@DX™Œ€²@D•¯­b‘@E'€•]» @E¶Év»h0@FCбË@FÍÃÐjÚ8@GUyLÙ©@GÚ®‹b~u@H]h¯?>{@HÝ­åÝÐ@I[…Jd¡Ì@IÖöÊ‘ÂÖ@JP ø@²@JÆËXÇŒ@K;AÍÅ@K­wÅÁ¨`@LxÓÖÄ_@L‹OŸÌ¡@L÷]~§@M`«qøsn@MÈGbÉ3@N-æË Õ½@N‘•Oꫵ@Nó^–™ŒE@OSN;g¦ @O±oÉÕÇý@PçZÏ Û@P4;*MA¾@P`¸ì¼#¢@PŒf'“^ò@P·HJxÑ@Pád­›sV@Q ÀTÓO@Q3a A6@Q[KOGV@Q‚„% ê@Q©lHÀEÕ.1«¦ÀDº…½“ÀDYbòÀãÀCön¤ôŒÂÀC‘™Ç€ÀC*ÙŠÝÊÀBÂ#1¤˜àÀBWlHÄ¿ÀAꩽÁ&ÀA{ÑÚ ÿnÀA ÚbRQÇÀ@—¹AÐuÀ@"f2ÉQÐÀ?U®|6ÔrÀ>b¨kÀ=i˱¯ú&ÀQÀ8JŒœÀ75TNS–¹À6ͶxŸÀ4ýuÖ›üÀ3ÚPÕ¼žÀ2²fÜ]rÀ1…À„x²ìÀ0Tn Z’hÀ.=ªñ7¦À+È')Öz…À)Jw¶À&Ä3ïè<À$5¢#NuÈÀ!Ÿà.4ÀÂã¦ËÀ¶Ö²Ôq\À^:ô&­óÀ ñ« ’…5À;ÌË’¿è\Üќ̶?ãÐÖ—…)a@Áùr½@ < IU@9Î ƒ H@Út)ì¾@~«_>f@"‘ EÇ@$æAMr;ä@'¹ºþxF¤@*ŒR÷àOß@-]_svÏ9@0‡IÇ@1|ä:î†@2àcõؼ¬@4B¡y5>ƒ@5¢Œ'Ä]l@6ÿÝù@8ZPô¯i@9±¨oá´@;¨M½Hœ@ë‹-!jÆ@@ñJí”@@¸O‡ç”^@AVV}p¾@Aò~ú¶c@B‹ŸÍí&Ý@C"Íîë`@C·ŸZAÖX@DJ‰ïÞ@DÚNBÉ@EgÀ‘o@EòúŒ,Å2@F{ÌFì@G6ãˆc¾@G†=Mãúd@Hã‘ ô@H‡.¼R@Õ@I$ÉxU„@I~̃ªŒ@I÷-oÐYŽ@JmO¶ ˜@Já< {ï­@KRû£u¿Ã@K˜ésº@L0I?˜ò@L›{z;ó@Mÿ ø£@Mlt²j¬Š@MÑûÔX@N5œØo3Ã@N—dÿÍnF@N÷^O7›Õ@OU““`›@O²ŠÞ­@Pno0Jõ@P3Ci@P^ÊÝ7&Í@P‰Ë ³E@P´‹ƒö@P݈|UÅ•@QO¼sn@Q.cA? @QUÇR£§æ@Q|P'ÜÀDÀ3®ÀC86uÊÀBÑ£pæbëÀBi(f1;òÀAþ»pNÍÀA’QÿÿšåÀA#ã«•Z=À@³g Ô“À@@ÓZó¼À?˜@ƒ³Ð?À>ª‹½?ó+À=¸y®ˆ(ôÀ<ÁüßxlÀ;Ç :è{«À:Ç”9˜HÙÀ9ÕPgÀ8»؉4cÀ7­ÞÌ‚ËÁÀ6œ lzÀ5…ɶ‘|À4jÝW¸ômÀ3K`Ý|޽À2'\æØ,DÀ0þÝSgÉÀ/£âà^¸9À-AXBThÀ*ÖH ‡ÎÀ(bç<²´oÀ%çr¹¤üÈÀ#d/„å?×À ÙjÍôAÀŽóõ§)À]u6Ù±âÀ$šezƒÀ ©ºl°¿ýþ"(Ôp—¿áüiÎ?êBÁ~²R@q˜¥•RZ@ `? ;XÚ@­*¡Àkf@.¾H>¶¡@³¤xºp@"Q'¦mT@$á<ç 2Q@'¤õÚëº@*gÜ«{\%@-)S> ”Q@/è½”M£¥@1RÁXCb’@2¯†´ø!Ú@4 fš!~â@5ck–†@6¹b‰Ï’Z@8 üšµö±@9]­Çöðr@:«=ò“;´@;õxۀЀ@=<.AxÛ:@>1ô9J@?¾[Ý­^@@|ÄÊè)@AK:3ˆk@A±µ¥‘T@BH÷?"&N@BÞê{¥@CpÙ[Ò°…@DkPuØ@D¶»yÊ@E·Dq@@E¥l1]FÇ@F,Õ ö¯!@F±òbwK˜@G4Æ4¶J"@GµS”:/@H3žóKk@H¯¬  Ž“@I)‚<@I¡&Å qŒ@J¡yö™ @J‰ùÙ™Í&@Jû8È7Ö@KjdÈÝçÔ@K׈ïyl3@LB­Ï]&‰@L«Üît[r@M ô‰@@Mx€ñ‘ˆî@MÜ ®¹r+@N=ÄHÌP@NºÕ@òª@Nû÷j®„@OX„¤Ž°@O³jæLBp@PZá`ù@P27Ed¯@P]O}íN/@P‡¨\EÂ@P±FŸ“î@PÚ.òk¢@Qeîî‡ @Q)ð Ë"@QPÑÛïÚBÀDhÇÀyùËÀD }¢PÕ•ÀC¨}£Y–yÀCE¾_žÀBá6~VîKÀBzÜÀ6fÀB¨È×UÀA¨M‡xÀA<‰ÜPÒÀ@Î+g˜»À@^—t?eÀ?Ù3üÿ_À>ñ¥ß•:À>âÃ.Y“À=r›[ž?À<“©q±À;&Èrµ¦À:){„‚Ó˜À9'ÔÊ©ðÝÀ8!Ï¿<:À7gfa¤«À6œ´É¯À4õpcŸ•À3ÝæÏZÂÀ2ÂZ{gÀ1¡ØÁþ#÷À0}j±w7;À.©˜½TÀ,PðÌÇ7À)îš]ÍÃÀ'…;Ë2ütÀ%?ùÂ&ÙÀ"›ê¢†À „¼‰pøÀ,Ä%0¡ªÀ·=vPjÀî¤fÿ½À|¶æz+'¿úçMŒy3¿Óúž]»Ë˜?ð3w‡Ùï6@Á·ñ$zº@ v‰³øòÌ@I›qÐ@~þ®÷ ô@æ‹c ,@"'÷$Ê@$Üv=GÛL@'‘0€(@*E%÷ËÓÈ@,÷ÄU JÔ@/¨yŽëVÇ@1+[XßC@2€ø| á@3ÔÏPY@@5&Ÿ®0K@6v*Šå9†@7Ã4.§F¦@9 „ ž;Ñ@:TäèÀ*¿@;™%iWw@<Úm~u@>ŽKj@?QfÌvw @@C¾À@@Ü×ñŒé@Asò þLn@B ¶úS„@B›ýËóú@C,ÛWL”µ@C»”pwßj@DH#¼C t@DÒ…XÁ4@EZ¶È3“@Eà¶ÛB1a@Fd…šÍ @Fæ$1›kå@Ge”Ö# @GâÚ´žJ@H]ùÙ™?â@HÖ÷"Æ @IMصpc@I¢áú»÷@J5^\tû<@J¦Ä#@KÄÏ Ñ&@K” Ó@KìJ|&ÊÌ@LU.5£$Ï@L¼3§Bîö@M!cå=@M„È%é#Ö@Mæi¹Ò'U@NFRZË@N¤Še¨f@OQUÛ@O\* ,˜@OµrJµö}@P¤@™>@P1Ï>q«@P\=ñ1J @P…õÕþ6@P®ù)üÆ?@P×N‚áu@PþùsïÈ,@Q%þ9ÔAÂÀD˜{x­ÀC´L©¥ÀCSlM$)ÀBð×Ç}ÜÐÀBŒ†qAš|ÀB&o¿N9‡ÀA¾‹KÕúÀATÐà1íÀ@é8‰‚žÀ@{ºrTÜÀ@ OR¾‘‡À?5à3Ïc¸À>O,\úhÀ=dvã+M¼Àé£CÏš@@ °p@@£Ó,l.°@A8­»w#Í@AË™zA @B\Œ$U=‚@Bë}OÐÉ@Cxdô‚@)@D>0ïßB@DŒcó¦@E´„Ù)z@E—LǼøÓ@F̉ä¢@Fš4=Þ¶w@G…W–aˆ@G”Â8Žñ®@Hîpùt@H‡  •@Hý#¬ñà•@Iq7k¯á@IãN.ÖÇ@JSndÍX@JÁžîqâÑ@K-ç¥MÇ@K˜Nf³Èß@LÜÕ ÷@Lgš€TÍ8@L̼¥E@M/Å 5ïÔ@M‘C*:Ä@Mñb›Ìï@NO;èÒ¥ê@N«Èc1¤r@OÀŸÎûÕ@O`-h®qõ@O¸~“dh@PCÊ0T @P1Ã%~B @P[Žפ¢@P„¨×y¬Ö@P­’Öè/@PÔÞec¯g@Pü[ްøÀCÀOþÏ 7ÀCa:ˈ–ÀCƒ$â ÀBž#µÚ ÀB:·¡Õ²ÀAÔG]ÇC\ÀAl¼AÏ*ÀAhâe‡#À@˜Eüs²“À@+L–+À?x쬮À>—x,½ö¾À=²1ÊOöÀ<É>¦¢À;Üò ÕéÀ:ë ƒ*êÀ9öçI~À8ý/‹¡÷/À8Dw¯ÉäÀ6ÿWp7ÕêÀ5úhËô#À4ñx!~rKÀ3ä‹Voz>À2Ó§ÖÓ¡ÑÀ1¾Ö-b[À0¦!qAHSÀ/.ПCÀ,Ò‘?ý{YÀ*Š‘ñ{•À(;[H(}À%å".иÿÀ#ˆs•™ŽÀ!$’3®ˆEÀu€M5À•é]Ç’À«UœêÀ kµ¹Ñ|Àl4÷(dÆ¿ò¶_¨ZL?¸ÍhÝgó?õíÌnû‘@4y zaf@}K£Õ¾@ç»ìWw@…Ú˜‚@Dã‚Îz@":iš»¯@$ÓžèÖ„@'lZh³Šw@*xÓÙN¦@,›jËê“@/0°¾ÄÏD@0áæ ºRH@2*"ÓŸÙ@3pÑG¼dÑ@4µ¸;Í/b@5ø ÚÁ­@79SŽl«@8w ,b•+@9³U×SJ@:ìG‘SQò@<"KFÍØ@=U9ð!Žã@>„“Y@?±K5A9@@m”ý@@ÿÁEX|„@A•Ã"è½@B‹>Ê,Z@B¬˜ì…úJ@C7·iØØi@CÀà¯ãÞW@DHk”¹@DÍAéÒ Ý@EPtGVÔ@EÑ¥:jþy@FPÕ?˜Ã{@FÎæ"@GI5Û%F:@GÂjŸ¢q|@H9¦v|,j@H®íSõeQ@I"CÍK¼[@I“¯ÿª@J4¯Çó©@JpÚÞ<ß@Jܨ=^³@KF£7%Í@K®Óg·t–@L@ß&·@Lyðâ+dã@LÜí¡.@M>>Gáêæ@Mêé†ì#@Mûû­×¸w@NXxʦ‹@N³j}eî}@O Ùfó@OdÌž ]3@O»M}†›@P1ä-v‹@P2 Ì/È3@P[8xÌÓ–@Pƒ»á-î%@P«™ðÍ@PÒÖ‚ç ÀCo"Õ®ñÀC4ÍËsÀB¯°> /ÀBM\šcÀAéÄÄ*»ÀA„O5Ôw¿ÀA%¡`;À@´A/À@I›I{‰µÀ?º[KiÀ>Ýä¢L6À=ýÇzPì3À=ù” ÔéÀ<2qª)©À;G'Œœ•À:X=/DÀ9e2 9,ËÀ8n|¼'$À7sñ–À–À6u–èf$À5sWƒ©MªÀ4mL5˜ŠÀ3cr›ÚäÀ2UÐ>ÍÙ’À1Dp›õ’À0/\é;‹vÀ.-J!Ð8?À+ô²bR„ëÀ)µ`†cžÀ'n«jª3úÀ%!šmQW³À"ÎpÈHÀ ts”îä³À)¼]¹_^À_MA*áòÀŠ6¢>XÀ V@!ÜžÀ…xܺ ׿îŽ<¿¹½o?Òo„âOÄY?øšÑÈû7@Y+Ж¸e@7¾ƒu õ@GIÄgTê@ZMÚéÇ@oܲŠD#@"C‚ŒÅ\@$Ïi슥t@'[*z0 :@)æJdãßt@,pP¤+;¤@.øÅŒž}@0¿™®ùC±@2“i–0@3BÐ]Â@4€ðxç •@5½èì8H]@6øÎÙ›Íg@81rC‘¬Ä@9g¥¦—»@:›>˜lþ@;Ìhúu@<ú%q¢²@>$á»E"{@?L˜pS>@@8ƒ´Ø×½@@É T½M²@AWÔ‚Ê(@AäØ œâ•@Bp Ág­@BùiÇ@C€èãÿm>@D†Yâ·è@DŠ=¢"޾@E øç¡Û@E‹ï¦yTˆ@F çï~T"@F…õj7@Gôxóq@GxR—¶Þ@Gî§…JŠ¥@Hc~@HÕ­íšO@IFg»'eS@IµL_ló@J"a@ÖýÚ@J¬0I†š@J÷3XÕ @K^ý6%I8@Kʼnmôw@L)tOb‰@LŒ/¶Ûù@LíJ!Êf@MLÊìå²{@Mª¹ÈÌW@NR-ä@Nb=ÿ·'@N»gEÅ…Š@O[&¸õÒ@Oiãšé?h@O¿Ul}_@P hH-v@P2¢˜9Ö@P[69û±w@Pƒ'Éä@PªxöÔ±ªÀCéM£_ÀBÁ,YÜ™ÀB`â*œ–žÀAÿ¡oçWÀA›Œ¤ªºàÀA6sŒ‡ßHÀ@ϲãË ÍÀ@gDp|´¤À?úDz}~?À?"Fvª=À>GX©ZäÀ=hœÏüŽÀ<†PÆ÷ÙÀ; l“$…xÀ:¶éK&À9ÉÁ1Öà¨À8ØïÑ’.ÜÀ7är&óÀ6ìFsIÁNÀ5ðlícAÍÀ4ðçJdÿÀ3í¹$z7yÀ2æèL†`À1Ü{r[§À0Î}ÎÀ/yó´ÙŽëÀ-OýùÀÀ+;^€pgÀ(çÒuQÏÀ&©îéf4wÀ$eÁ™._>À"€¤¨kÀ–ÎæEÞÓÀëmbcÝåÀ5h…"Ë.ÀuVV.—nÀ W­°r¦¿ÿfN¶¸®¿çùý6é· ?Þ&œcŸO?û*”oìä{@qOs«5@«Ÿª÷·ž@¢¶o3´@óÃu³@™Ìó±[@"LÇŸÍb@$Ëqc¯Uç@'J¹Ì@)Éjê Û¦@,GÐ@@.ÃCÓ¸²@0žÆþ”G@1ÚÀOÃYÂ@3[•‰ù@4Ndž8ÅX@5…©ÚZ<@6ºû¬¬›p@7î,“šû4@9MKÎ’@:M€ö!(š@;yU!˜«@<¢ií‹T@=Èžô¬|@>ëÒßWX@@ö+ ºô@@”hˆvgÍ@A!5$ŽcÌ@A¬Qå'¾@B5µòyS«@B½Y® D¯@CC6«¹\Ö@CÇG Ä‹@DIˆ]ƒý @DÉõ½’PW@EHšÑ4Ì@EÅN¿l=w@F@8׬@F¹Lc&@G0Цµ š@G¥õžwà1@Hîé,ë@H‹\×­àÙ@Hû`&Wk@Iiž(“@IÖŸöë!@J@ݸhÜZ@J©éùƒß@KF<¢e@Kvø£Hfî@KÛ¢±š@L=y—n×ë@LžU~SÓ@Lý¢-wì @M[f¬Qøp@M·ªøœi@Ns§@Ì@NkÊè„@NöÖR«@O=„"ù@Oohqúw@OÃ=âä@P áψM@P3u¿¤¯@P[4@@P‚ä#À0ÀBÒ”¢ÛoßÀBt¨*ñGÀBüß™ûÀA²w2Ѭ ÀAOW==%À@ê¡Q û›À@„P:¯ôœÀ@^gj†À?e‹a~¡À>PqòÀ=µˆïíÑÀ<×É ‘•‡À;÷Äa–åÀ;Ìå0ÊìÀ:+­¾À9?Ü€áŠJÀ8Q üÀ7^Ø2\µOÀ6i y¾ã2À5oµÔNÊTÀ4rÜâUëgÀ3r„ü?À2n±riã½À1gmX{äÀ0\ÁçáË7À.vå¦+À,zÐ÷¹ ¾À*Q³“DÝÀ("Dên/ÀÀ%ì¯î$Ï·À#±$^…UÀ!oÖÖBO½ÀRš’DÀ¹Á& ºÀrÏniÀk¥9Þ…Àmäóƒ¿ûçéYvŽç¿á«@ Ô}‚?ä°š`¹\4?ýžúihÃû@}´˜–Æ@ Ôƒ~H@úG}:ƒT@Üÿ9kvá@Áõ…Œd”@"T*¨>Mý@$Ç£õñß@':û“)@)­ÄDœc@,”ÞËÚê@. Mº@0SHãU@1µŒ¡¾Á/@2ê{®v\Ý@4ïøÎB@5Oº üGð@6®vê¤@7­ ”,?`@8Ùg‹—\@:Üzˆ†@;)Ú¦]õ@ŽÀnã’«@?ª£ißZ@@a½Ñ*‰@@ì™`qª‚@AuÚh`\ý@AýxU z@BƒjÌfÊ]@C«ðû @CŠ6 Bž%@D ®«{@DŠ_”6@Eb›VUC@E‚íÁÔJ.@Eüµ ºÉ,@Ft¸xŠ­J@FêøË“i@G_wt÷~œ@GÒ6‰Ôqy@HC8¶¤ —@H²2é¹£@I µ;¶@I‹ôgµ'Ç@Iö'ÜÛ}Ú@J^³ÿ*ð@JÅ›$›h@K*åÈH]Š@KŽ˜À“µ©@KðºXÎ@LQOü:·«@L°`Ø&@M ó,¹==@Mj —ã@MĶËçØ7@Nõ:“@Nuа-Üè@NÌO&¢-@O!wb˜.b@OuP¡'zó@OÇá++³@P ˜{Á^@P4¢É߸ @P\ Ìâ¦ÀB‡d¤f}ÀB(ÏÅ\²øÀAÉH îEÀAgÓýǾÝÀA ‹ NÀ@ Æ É+À@:êÇyÖÀ?¦ôÂ*"sÀ>Ôás ãÀ=ÿ’)¡½öÀ=&þ’EA–À5*û¼Û@?Lõ…XKÃ@@0î?–n·@@¹åÀi÷@AAU=œ ²@AÇ6,~i>@BK€$Ê÷Â@BÎ,ƒÝª@CO5¨Üib@CΖë˜YŒ@DLL’¦^t@DÈSÈÔ÷í@EBª’#¯Ì@E»OÀ^+n@F2Bçz|%@F§„Q×­¹@GôvÖ\@GŒöcF%ÿ@Gý*Å’¯x@Hk´Ê²ö@HØ—žù«~@ICÖàý”Ê@I­v—A9—@J{&BØn@J{éFû# @JàÅýÏy@KD‘ú¾@K¥à…nqî@L),ƒv@Ld÷Š'@LÂP‚C!@M:š þ@Mx¼:º@MÑÛ7Ê2w@N)žn½@N€ œm1@NÕ*½Ùe?@O)¸ò°@O{”‚ò,†@OÌìˆ<Ø@P‡–ØÆDÀ?æß²¤ÊÀ? Œâ*BÀ>H K'ÄÀ=t4äm À<œÚøKTÀ;Ât ®@ZÀ:ä×»bÀ:H0À9ìïbvÀ88˜oÀ7N@ÑÀ6`'Ñ¥h%À5o _¤ÌÀ4z´?í À3ƒ v¿æ˜À2ˆW I›À1ŠaÖâÀ0‰E”×>À/ Wˆé”À,ûšâ aüÀ*çù¨Ô›À(̸ÂhüªÀ&¬¢hiqçÀ$†þ/¸"ÉÀ"[ù~¡´´À +Åáì9DÀí2IòÀyYˆ£”%Àü}Êÿg±À îDÚ&œqÀÓ¥Il¿õTƒñÅL¬¿Ç4Þ¿2»i?ï?Û.óè’@@‘Fª@ v6£€]@ë<׿÷s@žÏÝt:‡@UQùc@ ³2é³@"cxÅbÈ@$À|{Ü@'gÌQ @)yÒH_J/@+Õ` €÷À@./³Qùh@0D7X±í@1o›êi·¹@2™Ú¹kÜ@3ÂÈj 9r@4ê:õµ/@6 Æ Á\@74 â{@8V"#áE@9v"¨½«€@:“î@¬7Ê@;¯e$…‘Î@<Èi±Dû@=ÞàN',@>ò¯t(‚û@@ß×lТ@@ˆýÎÌ.@A§ô2²@A’Õ£fÈ@B4:a @B–øw@C,24ÞK@C”%Ý|¾@D„Ÿ Rƒ@D‹GÈ+~@El>2³Ü@E{ðzÝ¥m@EñÓ°¾Éx@FfÁ…`z@FØ·3A6Ñ@GI¹%¹S„@G¹GÙΠ@H&åÍJ÷@H“d:d@Hý¯+tqO@If¶¨¾|@IÎ/¿â“@J4¨#K‰@J˜‡æÿ0@JûpDÅ5A@K\ÜÆ†~G@K¼Ò¦w‰Ï@LWMR»@LxpJœÿj@LÔ#Q(¢ü@M.v.âëØ@M‡nÈÛÔ@Mß!Ô¾@N5iH:@NŠvæ8 @NÞBŠb6½@O0Ò?l‘@O‚+³âô@OÒU\98@Pª‘ EþÀAõ\oÀA—¨¼“ ƒÀA8Š… À@Ø ²öŽß>‡:À=¿!çzYtÀ<ì\Ggò°À<‡¾j²ÎÀ;=ž¬Û¾dÀ:aœI¹pÂÀ9‚|´Ý$üÀ8 = £ˆXÀ7ºÛqð ÉÀ6ÒW9p?^À5æ°àÿÕ¼À4÷ê2 = À4QÂ^áÀ3 ÔPˆÀ2ú͸¹‰À1àærBÀ0Åi0‘OÀ.=f§á7µÀ,5n˺è±À*'ÀWÇô—À(|Ñi(À%ûÆ•ÆÁTÀ#ÝÈ0FàFÀ!º­WÖÀ%J­JÜ2ÀËÉ“#â½ÀiF/:/VÀþ7?øíùÀ 5‰ùwûÀ ëƒ5þl¿ò;OŬL¿{»Œí®?ò^ÎÌ&8@4WÀñÖ;@ c¤ý€(—@Md{@@ì6ôK"Œ@›¯ë‚u@ p÷M@"j«‚vþS@$½#‰»+@'~Þ±å9@)acp8ß@+²w¦áF@.b»€ÛÊ@0(f‹µPR@1N°Q)@2sä‹MW@3—Ú(L›©@4ºiJE®@5Ûkh ÷Ä@6ú»m¨?Í@85ÔìÉ @93¸¾<¨›@:M$uHî@;dYM‘ˆ@›¡™O0@?¨ôÌÄfZ@@YË?J^E@@ݹ۫6/@A`=±Çà‹@AáO%ÐÎ@B`ç„ç=@Bßÿ&&t@C[– Òß @CÖ¤JÎ¥0@DP&ªlžë@DÈ0Æé@E>€ ©/‰@E³T=‚p@F&–Ït]e@F˜Hd]‘@Giˆs©i@Gvû}òa'@GäG¢Y@HOyb­TN@H¹j6øf½@I!Õ”§¡Â@Iˆ¾è;@Iî)òÚùN@JRÂT²N@J´•©p…˜@KŸ8¤¿¥@Ku<7')î@KÓqœ^[@L0D‰°Ø£@L‹ºD·\Œ@LåØ1ÆÈO@M>£ÎÙìž@M–"®Òµ<@MìZuú¾@NAPÑb¡[@N• |4¼2@Nç3%A?@O8äµÎ¾@O‰Âßli@OØpÿ$ÀA¯ÚœRÿÀAQ¤Pa5À@òåL…·iÀ@’Å1åvÀ@1?ȆŽÀ?œ _v¼ÅÀ>Óæ(™À>IcsÀ=9Â9j8ÀGŸ¡@èß@?QN½÷?_@@,6}E¶è@@®sá"¦4@A/W!™*–@A®Ø³ò³@B,ñç’’…@B©œàë|t@C$Ô“™ýã@Cž”»Ós@DÙ×7âG@D¡$·ü@Eèv ¬•@Ev®uøl#@EèòN"$d@FY³Éü†ž@FÈóC|å@G6±šØ@G¢ð-Æ ˜@H °ÎÑêå@Hvõ¼ÞðÑ@HÞÁšÚäå@IEg­$˜@I©úvhmž@J nfÅcH@Jowêp‘@Jп„ì@K/W§2öi@K8bHm @Ké¿©à΢@LDò]LÁ@LžÕ|Ñ¢É@L÷n$¼ÑÃ@MNÁˆÈk@M¤ÔïÏý+@Mù­¯Ðæç@NMQ*6À @NŸÄÈmÚ@Nñ øº§¥@OA2+RNT@O6ϱJàÀAjN ©üÀA AÝqÉÀ@®âEG16À@O+ ”A-À?Ü0REúÀ?KŽ¥JÀ>O  xz­À=…(à1¹À<·Þ9è®À;ç»;DÞ¾À;»!æzÂÀ:>ÙêBâÀ9f^çƒÀ8Šh(uÀ7«ÓÛ‚÷ºÀ6ÊW š«À5åò\Z­8À4þ§‰‹rÀ4y€¡F¿À3'lkcÒÞÀ27…À%)ßÀ1DÌPdõ*À0OHVµNÀ.®jšÀ,¸ç:ÚÀ*¼ËQôÀ(¼Oh„T»À&¶¾>)-¼À$¬:û£VÀ"œì‘§À ˆûX€,ôÀá+¦iã9À§×Çÿ"sÀfbEÅ*ßÀ8¤´GtÀ™"„Äã¿ýÖv› ÈÍ¿èÁ)\Ÿ‹ˆ?Ô±cÛòE­?öÎ+ÀÇfI@AUP®2”@ #Åä~¼·@ {Jä@~AKa(@ø1×™Z™@ 9èlüš@"x?zÍr@$¶Íl>6…@&õA¶Š @)3KЪÜc@+p›™4ç¾@-¬áœ@C@/çÏ_¨N@1‹ÔíÒ@2,7c)›!@3FÅcK¡¹@4`ß§]u@5wúrã$@6Ž\%´óÕ@7£þ¦:Š@8¶žg¶£@9Ç"ùÜY@:Ö7Ûin@;ã4&0$è@<íþ¨ÏÕª@=ö€?¶Ïd@>ü£mƒD@@*.aÓ@@€Ào¥NQ@A 5¯]@A~ Z&±@Aú§GÑë@Buê D9"@BïÉ4Þ"Õ@Ch@g GO@CßK÷(T@DTèëÁ±V@DÉôX ï@E;Îaâ0Å@E­ Lg@Få¨GˆÅ@F‹CÏT<@Fø,¹‘\%@Gc£Ë)§M@GÍ©«êÂÆ@H6@9tò@Hi±Ñ÷=@I(°XRf@Ig€!ü%¦@IÊs@tâp@J,‹\Š@JŒ:¿è|ü@JëÖ3ëT@KH÷Éž«@K¤Ô{Â{u@Kÿ¾ápO@LYaÉãZ@L±Áô㹂@Mä<©ÉI@M^ͳ'"@M³‚îgeH@N gœŸ@NYf•Þ;@Nªž*Í@Nú¶‡ž§Á@OI´œŸ/uÀA'%-h°À@Êsâ†D¾À@lxå6À@ -ßåp˜À?Y#9üYîÀ>•?©¾Š À=Ϊž}¸À=^-Î À<9Us0À;jŠ]7ëÀÀ:˜ú:Ë<õÀ9Ä¡I.lÄÀ8í}ùiÀ8‹¶Ä;À76ÌžÝ|íÀ6W?æá!‘À5tæ¾ýŸÀ4Ãi¨^&À3§ÙJ1˜À2½,ò1D¯À1ÏÄ0}°²À0ߦêEKÀ/Ù¶J{¦GÀ-îÚ0õ£ÕÀ+þÎbtþ”À* ¬=ŸuÀ( °À&™Tº½ÎÀ$ êXôÞØÀ"¨¥°®Àïù‰ñöÀÎ$óÐnÝÀ¤0®Tf¤Àr€)q­öÀrù7"jvÀó)Ò À¿úÌõ·ùƒÀ¿ã7}ñŽ8?Þ­ZT½Ïæ?ù>…~­@9m»Çô†@ ÷€X@eâ@^óˆVê@Ã;§[Y,@*ˆB EÙ@ I¶c)R@"~¨â é4@$³Ïqa@&èݳ–Ah@)‡c ùK@+Q€–¹ø„@-„~Që@/¶5B„é"@0ó.Š>.@2 VÎK_@3 pNgC@45Xظc{@5Hï@Úè^@6[xݰÚ@7k¦¦ÚeY@8z‹8]/@9‡¤óW¬ò@:’Ù•Ϋ@;œ ­–v@<£,$q]@=¨íí à@>ªË£„@?«$¸¿¹@@T‹S6øƒ@@ÒHßHŠ@AN°rè@AÉó~«l@BCÓ÷oøÇ@B¼`8Ž»@C3’ø[µR@C©hàgW @DÞ§óÉh@DñÍ=p:@E hk~@@Eré$–$·@EáË8n*@FOF_àÓ'@F»ZÒæWj@G& ?þ´x@GRÃòÇ0@G÷8âÅ(›@H]½€‘“m@HÂâÚ’y`@I&«€Sü0@I‰M]?@Iê2a€çÊ@JI÷U_;@J¨l³=@K•#_ÙS@Kav5l¢Í@K¼tK@Lq(,µ@Lm“¹‰A@LĬ†û@M9œEG@MnÆ7¯m'@MÂ*=Èô.@Njz`&˜@Ne‹Âü8©@Nµ’ô°b@O„î²YÀ@å‰íï¹À@‰-O^ÆZÀ@+™;—sÍÀ?™އ&ÕÀ>Ù;:¿»†À>_@÷ûfÀ=Påàmì”À<ˆÉÝçWÀ;¾†’SÀ:ð—èþ ‘À: zˆ$îÀ9M«ÁÍ…\À8x)®é À7Ÿó9ÓÑÀ6Å+¤À5çi:? ¼À5”2$À4$q}‘À3>kK¥{À2VûlrŸÀ1k$,ÑÕ^À0}–ÿ}zÀ/òS/À-5¨Q˜À+Kg3ÆŸêÀ)\GæybÀ'hfa™E#À%oáq²ÃáÀ#rÚ¾xÇÀ!qvÎO¨¢À׺ cÀÄoK3:À©g|¹3À‡PmIÀ »I¿Å·ZÀ[s>äû¿÷Þ¾‡Ëš¿Û¿¶Ð§Âñ?ä'Rée.ù?û*È@(¥Ô¹aì@à×Dæ¥@²uÂhœ»@¸³¥×@[ ÀduÓ@ XñÎÀ@"„ÖÓ›¤×@$°í5âJ=@&ÜìŽvß@)Œ‹<>@+3….^y@-] ùç‘@/†cŠ|‡@0ÖÞúŠ@1髼Œb—@2ûwì²\@4 "#QR@5Œ }G@6)•Ïã˜@76"^§[¢f«qH@?X¸²A(@@)ÁžMˆ@@¥ù f’@A ûf½%­@AšÂ"4:@BGWäÐ>@BŠ…å ²@H„6Ÿ=Ô¨@Hçm³+Uƒ@IIU'è„@I©ï–øJá@J @7}l@JgJ;#E@Jĉ@K˜qgÁ„@Kyä®òb@KÒ÷þè@L*Ø<Ћ@L‰4»œ@LסFÇ@M+mt®ôß@M~©òȤ@MÐÈ }@N!Î/@Nq¾¸uh @NÀŸ]ÍÀ@¥PæÜî4À@Ia‚ €À?Øqx.ÿ5À?¦ºš9!À>\\ÅãK<À=šŽÍ{À<Ö5SÔPÌÀ<Né’¶À;EÔ]ŽOlÀ:yÄž?¿À9«)T¿À8ÙØ¼ ÈÀ8ù-ÀÑpÀ7/|ã»19À6Vd**©^À5z°0îaùÀ4œcëTzÀ3»û!¢?À2Ø þ|‰=À1ò YB‚bÀ1 a dˆÀ0z”çOÀ.aûEÉ*øÀ,‚(òJ‚¢À*”в°èÀ(´VÿF[BÀ&Æ‹ÞxÉpÀ$ÔQ],ðÀ"ÝÈ[ÿÄ"À ãih¸‚ÀÈ·€Ù/qÀÃŽ‡}õÀ·ê=ÀÞÀ£vѤ¢À ŠÔ|‚4ÀÑ­vóî¿õ UÙij.¿Ño Á·Ü¨?èÍ!)Õg?ý:ÇŽ3™@{ƪÓå@ˆ“Þ‘Ìß@Õ+Ršå@EÜ0‘×D@‰ÙƒÍ%_@ g£&·o@"ŠÌ©Ìm@$®%*–ø@&ÑgΜ í@(ôOðÀDD@+™9©+@-7ÿØÑc @/X@½4zR@0»Œæ4/ã@1Ê% Ýá@2×ÉrXÆ@3äYØzÐ@4ï¹Z6WØ@5ùÊ]Pã@7p´ÿ¬³@8 ‘L•÷@93ò‘®@:Ú­¤ï‘@;Ó9¼ @<åžÄ€„@=üðÄWE@>–?n@?íKTc®@@Q‘‚ák@@{ Ãcj¢@@ôž3B‚@Am:†Í@Aä1ù¡ŽŠ@BZ(M#&@BÎá'·½@CBWÜè[@C´‰^eåè@D%rÒŒ'.@D•õùR@Ee \'%@EpjÕ›Žk@EÜ"‘×è@FF‹ñL“G@F¯§/ [@Gt~xçß@G}õÄs@Gã*//¸@HGR]+à@H©¸nˆW@I ¶Ä’@Ik/¢]ž©@IÊçmWt@J'¤u•½@J„põép@Jß/-P-Ô@K9%)fÔÅ@K‘ë óg@K鄘€Êˆ@L?õ¹PÉ7@L•Bm³â@LénÍk@M<íŸÑ@MŽwM?‘û@Mß[ó;í@N/1IÁG@N}û®DÁçÀ@fi‚ã0À@ GmÄŒÀ?\” —˜çÀ> ·oe׌À=âmR)–€À=!°²êVÀ<^} ˜†‚À;˜ÎY)¦ÐÀ:С%ý6gÀ:ò”ŠXÀ98ÀjGï5À8i ÅÄÀ7–ËÒéÕæÀ6„CŒfÀ5ê¿ðdÈÀ5ó´/ýÀ44¦S 4À3UÛA²Ž]À2t–ñ=Z¤À1ÞÙ ˆ÷À0ª¹€Ì:[À/„]+NÁÀ-®lõ,dÀ+ÔèbEzÀ)õ¿¯lpÀ(–™YäqÀ&)¾‘?-&À$=¨?4*ÝÀ"MsºÝYpÀ YCœ”ëíÀÂyö_¼ÀËÌðyŸÀÌ™¼qøYÀÇs‹}ÉÒÀ wóNècÊÀUùÒfå¿òN["ÞA¿½ß˜rk]4?íJh"«?ÿ9fubä,@îdŸ±þÎ@#_•«û@Reœê'@ƒÇA©N@·Ñ×…þ@ uÑ &C{@"} åw@$«uÜ»¡¶°^@?°U ©±@@QoÕ7С@@É™Ê_Û÷@A@¢/U¬@A¶‚µÿMˆ@B+6¸we‹@Bž¹r[5«@CÞÛuC@C‚‡y…é@Cñô‹Îß@D`_qÐ@DÍê?€6@E:²Á„@E¤ÚÁA @FnãµÂM@Fv¿ûr Ã@FÝÎO&0ó@GCšƒý¼ë@G¨%˜:%Ó@H pÝžåc@Hm}óó¾‰@HÎNã¬@I-åxxç@IŒD|ˆ±@Iéns6çÔ@JEf4y)Ž@J .È6Ñ©@JùËaãl|@KR?\F=@K©Ž5tH@Kÿ»Šü‘e@LTËFq@L¨À©"Œ=@Lû *‹:8@MMm“—ÏÒ@Mž,ìu¸@MíâJ~ã-@N<‘Ì(ïÀ@))›,ÁÀ?œ¦ß À>ãí˜ðƒÀ>(˜ÇxFçÀ=kSS·+À<«­ ô ÖÀ;é¢5¸9À;%/*„—À:^PÞbuÔÀ9•,Ê«À8ÉJKâŸÀ7û)OÀ7*ƒkgº‹À6Wws{™WÀ5ülUšùÀ4ªSÀå–À3Ϻ À2ó AecgÀ2î¼µåtÀ12x#®~ÍÀ0N¬&&9;À.Ñ$ýíáúÀ-göúºªÀ++5¡jRÀ)Q¢2/Ú_À'sÇÒÅ8ÑÀ%‘Àˆ×ܼÀ#«©K]7À!Á¡hg6"À§• Ö;ÀÄ‘4u/ÍÀÚƒÞ(F•Àé¾Éç&Àå*ýÊ ÀêDZ7C¿ÿÊÅL°_¿ïS mÖi$?¡S¡ ¤#?ðЧo¦y‰@“s½wU@ÅÍCS@>f½â–@žL¶¨@¿˜§ ]=@â«0»Úª@ ƒ„Á×V‹@"–0³ÆÛ@$¨Ýò¼[@&»‹óüð$@(Íè0A¤R@*ß´ät´©@,ð´¿|@/«6%ì@0‡­ÿ?Ï@1ŽFQ‚^@2”¤œˆm@3˜ÃÅÚ÷@4œq?Œé@5žïh‹]Ü@6 $yPá.@7Ÿ÷–_:K@8žPßî¸@9›};¯@:–;¦ kk@;¢®'.@<‡;²A@=|òEe¹«@>p·-ùÎ @?by«e[@@)j¨Zò@@ŸÞw"#ä@A‘°Ä;û@AŠ)_ç-@Aý ][~@Boò­Ì_@Bágï²D@CQÞÉ1@C¿ám Ð-@D-zŽs'@D™ß6Ð@E ÌÈ7d@Eo,”@E×ĘÑ=@F?K¾ Þ@F¥š§Ôœó@G ±¾;@Gn‘¿K@GÑ;ºéæÅ@H2± ¦Æù@H’óZÌ[å@Hòˆ7Ñ©@IOæ¹]?ú@I¬œJŸžÞ@J'ÌÎ1@JbŒÌC@J»ËÓ\çW@KêY$&H@KjêÊË<”@KÀÐWŠS@Lžò­2¤@LiY®?^ç@L¼Yí“R@M ¢¯ ‚˜@M^8w ™U@M­É‹´M@MüYÎìsÀ?Ú4ÌýB–À?$̓ᵠÀ>m#Á”‚ŸÀ=³2ÅgýŠÀ<öö3êá(À<8jPbÀ;w‹÷À:´VQÀ9îÈ©N=À9&á awÀ8\ØŸà|À7þ‹3LÀ6Á*cn†À5ï¬}£Ì À5ü ÐíÀ4Eô.¥ÔIÀ3m˜À¬À2’ëŸ »À1µóޖߎÀ0Ö¶Ÿü7êÀ/êudì8DÀ.#Å7aÀ,WNá(\À*‡CÏ~ÏÁÀ(³:™ÝÀ&Ú¯‹þ›úÀ$þW––6À#sš’SÀ!:¨Ô>À¤åÒG)YÀΔ2JXÀñˆ@KÀ 9mÀItg¿ÀjYµ]–¿ýÀȬ}`¿ê5JoÔïÏ?ÆøÔ4$Ä$?òéëïT@‚l"Är@ –o*‹¡@Ø„ùeÃ@箘@ùløš¢:@ ÛŽéi@ Âür@"›{pÿn€@$¦\.bªO@&±*ËÛ\@(»ª:íâ~@*Å¡·|@@,ÎÖ24@.× Þ Ýa@0o×`®R@1qÑÀã‘ç@2sÉ#o!@3tÓ†ïv@4tÕRþ€o@5s¶co@6q]’Õ}@7m³cÚ@8hŸé@Þ@9b,ó e@:Yèß~¥¦@;P y¦@(ËŠáÑ@?óž‰_Ö@@í›’ŒN@@w]ë‚“@@ëÁøð @A_³Q8@AÑVîiÑ@BB{¦ƒ;–@B²ƒ1Ý(f@C!i,°z@C*~6@CûÄ…°8—@Dg5«ª@DÑzx^˜p@E:“Wá&w@E¢~Ík¦y@F À>° *Ã-À=ùb÷Â~gÀ=@nL”Ü7À<…>I+â„À;ÇÏyï ÈÀ;ßâ}À:F)øþà›À9îȻܪÀ8»kà·4À7ò i}é£À7'Œ+dÛíÀ6Z/—hvÀ5Š‹ÐyãÀ4¸¢² AGÀ3ävÝ$vrÀ3 ¼ríœÀ25eޤyÀ1Z‰mÚîßÀ0}}W&µøÀ/`¬@7=þ^y¶@84›(\f@9*Æ»–+@:pƒdK´@;…>ï7(@<ò§«%,@<ó§vx#­@=á“goÇ@>ͧñžš%í À>=ö`’†À=ˆ)нÛÐÀ<Ð5ÝÚBÀ<λºFÀ;YÅí, ¬À:›Eå·`ñÀ9Ú’£m~)À9ª“ܲýÀ8RŒ¯%‚À7‹8€".°À6Á®,˜¡À5õî}k–7À5'úæÀÙÀ4WÕ ž^À3…[ý£µÀ2±ð%çÀ1Ú[¼na?À1”3dÀ0&°ÚïG,À.“r|üàÀ,Õj—OÀ+YýØòÀ)MU§YoÀ'ƒrTà*‚À%µÇ7/¡^À#ämi½u²À"ö:çüÀ 7Ô-ÎÀ¶¿Í]ËÇÀøÙïä_+À4ËdÔ?ŒÀjÝ/m³À 6·Ð–¡‚À/Hy†{¿÷³>åo¿àt¸Q‘Ðô?Ý?PVGŒ›?öéÏG¬@H¬ÊWÎO@ "ÖyD@> “<’@siÍÉ;@@g†ùáMœ@],ÜéñÅ@ ©øÔ‡çã@"¥µ`Ò):@$¡–ƒÊ°>@&f“fÿ @(˜ïñü|7@*“ý5 °Ô@,ŽYK¥@.‡Ï¤Jø@0@(äŠk@1;ž„$@26f€»í¯@30VÌòõ˜@4)VùÆüØ@5!O¨šÎÃ@6*,åÿ@7 ДŒŠ€@8-».W @8õ-L^(@9æ»Ïc0@:ÖÆ¯ÑÁ@;Å<@%Þ@<² ÆÍgg@=%wGy@>†z|¦7Ô@?müø6°@@)Ð)"@@›«Ôä–É@A Œy"ÈÅ@A|lèäýu@AëH–ªlÊ@BYj^û@BÅá¾éû@C1˜_y7(@Cœ<„qƸ@DËÐ/Œí@DnDK‰Bó@DÕ¤b( À@E;êÞ¹ôá@E¡çL˜@F'÷òCl@Fhág×ï@FÉøÂHŽ@G*¹Nð'@GŠ_WùUò@Gèì°{ê@HFb?¿e@H¢ÁrpvÌ@Hþ ì#\©@IXCƒŽ¬î@I±j>ßñ<@J ‚P,?”@J`ŽþŸC@J¶ª¬@K ŠÇኳ@K_M@K²uã º@@Ll eÑ@LUf¦,@L¥hÐaZ¦@Lôu¼Œ°T@MB«w_À>€þ&¼À=Î;©úýÀ=cU(ÀATÙE‡ô@?&:õôÄ(@@ªTT€@@uK™Æ@@@äúl{mf@AS³NV@AÁq<ºÿ¶@B.0"ã?@B™ìXúi@C¢žœ ò@CnP ‹ËT@CÖòm!‚¦@D>‡u{‘@D¥ ‰R9°@E ƒSƒqH@EnçÖ€_Y@EÒ:h£ä@F4z°vHè@F•¨ ëBf@FõÄu”@GTÎ®× ß@G²È)P;@H±’Rµ:@HkŒs¾$f@HÆZ Úw@I :Ž« @IxÔÄò@IÐ…^<@J'0 JfŽ@J|ט±;@JÑ~8’R@K%&s€üT@KwÒð¶1@KɆpX…@LCÊõí@Lj íge@L¸çÕž$Û@MÔ”2À>µaýÿœÀ=`Ü?¹žýÀ<¬ûNt# À;÷ŽZëÀ;?_wëÀ:… ‹BÎúÀ9ÈóHlšÀ9 ÆC4â]À8J…¤}ðÀ7ˆ1¤wúÀ6ÃÈÐÖÙ6À5ýM™É’1À54ÀÐÙÑÀ4j$t~ó„À3{)—^À2ÎÈ?nVÀ1þ»/LÀ1+VXê¬cÀ0V¡“â.À.ÿïVÐ¥åÀ-N¿O¡âåÀ+™Â½ÄU+À)á ïm¯»À($ªÜ °À&d·)^|cÀ$¡F/cÅÀ"ÚoúTk™À!NK=|À…ù-u½?Àå0½yÀ>~º\V¢À’&;G=QÀÀÕN¬ŸŸÀS&€BnÀÛÔ›o£€¿ò¶ôäõ¿Í+iª”Xc?æ÷A±¶>«?úªâëËf@ó|…ç=@ —@.E8@@ ¸r Ï@ö‰9•ˆO@ÎÕ?šÃ@¨‡>ÐM5@ ÁŸ\ÔÖ@"¯M@”­²@${Hä@&ŠÜ&Ó!@(x[g·²è@*eiŽQú‘@,QÖ7Ô…D@.=qn¼“ú@0åIÊ@1»G^” @1üÁä ê@2ð5iÛ@3âi4MÙ@4ÓÞié@5ÄMóÄ=Â@6³£˜ÊP¯@7¡ËÊ‹…ž@8޳²n'…@9zI8Ñ;Ó@:d{ þ­µ@;M8¦{†@<4rQåç@=.×â&@=þ3½÷Ë@>àw0¾Óº@?ÁÐI<@@OöK‘â‘@@¾yñÑk«@A,vм@A˜µ^-¾ @Bd™îß@Bo~½¼@BØÓÉð®t@CAšc@C©En§o»@Dù$lëv@Du¦òÞùR@DÚMhÔ(@E=ëiH¦8@E €(§>@F &/&\@FbŒ.Ô½¹@FÂSf¡n@G pè7 =@G}Õ€÷Œé@GÚ1í=KÒ@H5‡5úÓ@HÖ•¾@Hé!}Yû@@IAi‰ÜŸì@I˜°ƒ$@Iîø[×@JDC&yX@J˜“Æ­²@Jë꘵A@K>L ¿ƒ @Kºš@Kà7,»T@L/Æ<ÿ'ù@L~jg}±@LÌ%eøŒ0À=¦±Áh²À<õÅ1Àœ›r1òò@?zÉí¨‘@@+¡÷ Ž@@˜ÿÀ<@AxÃÏ…@Aq Oe=-@AÛ­pŽ@BE`} õ<@B® / Ï @CéHË9À@C|¹; "@CâÒz·@DGe0‹ G@D«=̉€‡@Em+o™@Eoî'E @EÐÄZHEV@F0˜­9Ñ@Fk ªÚ@Fí;Ÿì¦@GJ ÓÎBš@G¥ÙMcß@H§åì”à@HZw­ÆÔJ@H³I了 @I ø¿|@Iaû‚ž;@I·ÞC±&@J Ê«ý@J`Á •¹@J³Åmi—m@KÙJÛQ@KVÿ5SN@K§9Lû¦@KöŠv£Í@LDõ6jÈ@L’|?C$ÇÀ=<á8DÓiÀ<Œã»´2À;ÚùhjšÀ;'ógq%À:qUoŒ?´À9¹˜SuaÀ8ÿçeàšÀ8DBCIÅðÀ7†¨d»ôÀ6Ç%ßìÀ6˜GzB]À5B$Õ‡dÀ4|¿kË.•À3µl²‡–À2ì.ðh÷:À2! É€1ÝÀ1T…Ì»¶À0…:ŒµÀ/h¸2—vöÀ-Õ¾ËwÀ,ÜÝhÿ¢À*n 5ñÖÀ(¾çE=œ¢À' Íù’¬-À%UeÜðÅÀ#›Â,žÏUÀ!ÞüˆÊÀ +qÑ]@À¸ÔNÀ—¯À-§wà ÎÀ IÌΠÀ9‘ä¦òÀ Øéݘ¶4À™ýwOèT¿ü¤o߀ªŒ¿ì¡[®WZ?¥g\ÑG£?îÒÐw°?þ3Ë£¶ @…*n¯Xü@ õ«~Mç@µ`—jÝ×@qà’Ly¤@/ÿE²¯Ï@ïe@»µl@ ×Ý ú'@"¸R·~^@$˜æÆŽ0e@&yl;^@(Y·“¹ïÍ@*9›( åÝ@,ëc7O@-÷{‰9£@/Õ! ¨™Ã@0ØØh”Q‡@1Æ€X©Ï´@2³s§R¿{@3Ÿž…õC@4ŠëÚ”ÐÜ@5uI¸˜Õô@6^¤ü!Q¹@7FëŠ1@8. æÏ/A@9õ=DiT@9ø—ew’ð@:ÛâéðÃ@;½É cÝB@<ž;ÉyN™@=}-Û¾Šœ@>Z’½Ã?Ÿ@?6^«i¦*@@CQ8Ç#@@t€1#wJ@@ßá5ŽÑ>@AJaþ2l:@A³þ‰N¤c@B³2Nå½@B„|°)|@BëX€Ho@CQBÄpŒ@C¶:€é¹Ã@D=YÜn@D}I­šžº@Dß^-_@E@yШ­@E ›Ùhfm@EÿÃÍm"@F]ñtÉ©´@F»$Ö‰¶@G^5ªW‚@Gržwû@GÌåž½ @H&4% ÷Ü@H~Œ]Ö@HÕîû±Ré@I,]lôæ@IÙDf1@IÖd;08@J**óÿ5@J|¯Å–‹@JÎrþ-I@KN+S@KoBáؽ@K¾S)­@L ‚.Ü @LYÒiØÕÀ<Õ2b«ÅôÀ<&&{ðGÀ;u:©§É¥À:Âlò¾À: »· ÅvÀ9W%¾LŽšÀ8žª1K UÀ7äH¨”KmÀ7(.‡#\À6iÔE‰‘<À5©Âí¢“¯À4çΪÀ4#ù†ŠsÀ3^Fæ”À2–·šdø‡À1ÍQÃÜr¼À1û|:¯À05DÈloÀ.̆‘Ê0ˆÀ-+d´Ù¹_À+†ÌñÄäxÀ)ÞΧdbJÀ(3z™qG@À&„âô†ÒòÀ$ÓQçÞÀ#8´¸&`À!fQ“I· ÀVûš„\`ÀÛ­[eVÀZí̃SÀÔõçî~ÀIþ =9À tŒužy¡ÀLNÂXÝ¿ú6[t8º²¿ç‰6¾M'?ÅßpU¯C?ñJ“RÀ˜?ÿä½’<Òp@EQHf8@G3ärÆ@üÏù>áB@¬Ü C»[@^uGW`”@G²)õ±@ âq3ß@"¼¢å½‹×@$–ムZ€@&q…’ö@(K.Ì•„@*$¨å©Ö=@+ý³N@!@-ÖcÀ]»@/­x“^@0Áðiéôo@1¬‹_ \C@2–yR4@3¦ÔÌ@4hçrÔ@5Ou ;Lò@65ñB¿ÍI@7d`¦@7ÿ¼ÆOFû@8âêú@Åß@9ÄßÑ×!@:¥Š?/7"@;„ÞSe@I<Ù@>ó¾Þ5{ü@?Ë >—t®@@Pñ§J‡Ó@@»?ZîÃ5@A$´è”<é@ANX4&@Aõ 9xL@B[Þ¶îN@BÁÏhœùé@C&ׂ*5N@CŠô´˜Ç¡@Cî%(@DPfµ²|@D±¸kL¨@Eâå@Eq‡ŸàòX@EЭ‹(¼@F-ŒÓ(ïÆ@FŠ"ö ’«@FåÆ5¹ÔX@G@vé)gú@Gš5›æˆÊ@Gó O¢=@HJà#Ò´D@H¡Íþ5ØŸ@H÷ÍÜì F@ILá)x @I¡ qßB…@IôHf-8`@JFŸÖ 7¢@J˜®d©o@JèŸ÷.Ј@K8LÑ15ï@K‡sòD@KÕ +³\ˆ@L"!Wƒ‘ˆÀÀ öHö¾Ào?K4¿÷Ù†î"Û¿ã)ÞåéÁ?Ò÷WÊ&&í?ó¯NÙ,6@Ľ {4^@ÅÅ‘@@!ÓNõï@B7\+Ï@æ)rqO@‹—Ó_¨@22@»õ_@ ìÓäºð6@"ÀÓ{güè@$”îÿyˆ@&hý{t”@(<Ö:áØ@*OÁ¹ˆ@+ãB+¨„à@-µ„û½é@/†ðY2-m@0«®uác@1“Qù,N²@2zO¬E<œ@3`”å¢ @4Ff+³á@5*­bq!1@6]‹<ó@6ñ‚Ó¨@7Ò±ÁŸ@8³5áâW@9’Œ`fvì@:p¦Ä(Ýy@;Mw5k$D@<(ðYÈõ@=ûb°@=Û¬'k°ô@>²×kgP@?ˆ}`,Fg@@.JÝ-¢@@—‰L9·¶@@ÿøšf@Ag’UU»@AÎTôÙA@B4<.A'v@B™E6|D2@Býmh"}@C`²k¡³Ü@CÃ5F¹/@D$‹Ÿò@D…Z¬¾¡@Dä±JÃ@EC~ž@E¡NÒ)°@Eþ3Ê»?@FZ,ÄÚôß@Fµ9¿’¶™@GZïо@Gh½É3Š@GÀÛÂZø¨@H<Äzô@Hn´¶¡üK@HÄD´R2@Iíÿ•Ó:@Il±þš|`@I¿’9SЮ@JW0ÂÍ@Jb®áUÁ@J²íj.o@KP7äIù@KPؕРó@Kžˆ¨Ðér@Këb¨üìÃÀ< ÷?M¤À;^ÔcæÄ<À:¯ê[Ž}YÀ9ÿ7¾^§œÀ9L»|Ö~DÀ8˜t䮯GÀ7âc¥·*·À7*‡Ö¸ @À6páúSŠ5À5µsà1dÀ4ø<\7úÀ49?ænñ.À3x€}9ýÀ2µÿ›µâkÀ1ñÂ!ýšÀ1+Ëu¥:ÏÀ0d 9éÖ À/5‹¿:À-Ÿ‚á‘À,2À À*i¨åIÀ(Éõ­³ÓnÀ''(±ŠâÑÀ%S†oø:À#؉àwÀ",ÝWël'À ~eÞÈ›Àšr’…éuÀ2ß ââ,ÀÆC‚IUÀTÔ¿"±ÎÀ½“ÞœEÀȹ&J}ªÀË×§l9¿õ-˜+¯¿ÝÒXnÜä?ÚÆtu‹‹Ý?ôä\‚­0©@‘Hñ5n@µF/PÙ@ÞrúèGc@…®”]K@ÜK«—@·v‡Ô[Ž@R0XÊX’@ öÞBq@"ÄåíËXP@$“‹ßŒµ@&a¬š8Š@(/´¡ú@)üˆ¯fàÒ@+ÉŽ‘[½ä@-•ì#V(½@/a{.hŠ–@0– ùÏFt@1zË }¿ç@2^íBظ;@3B]ò»^@4% %qHh@5æ¼]z@5çÝ Ö)@6ÇÞèÈs@7¦Ü£Jw"@8„Ç$›@9aµ:Úì@:=(u±¾o@;ƒð+ {@;ð•UWîk@<ÈPsáùE@=ž©º­}×@>s–:ycW@?G ¦á'µ@@ €+ckª@@tµ¢½Ù@@Ü"¾–~@ABÁu1Cç@A¨_ÚD@B ‹€ˆÅy@Bq¯äuÍÜ@BÔúáƒO@C7jÀ#@C˜ûsδË@Cù­"÷·‰@DY}›"Íj@D¸k“³c@EvOÔÀ@Esœ"–ƒ@EÏÝ_Ä–ê@F+9fR"@F…°†J@FßA‰Ñ@G7îlÈ@GµúÉaî@GæšDÓÖ@H<›#³Ž@H‘º7è@Håøî$:@I9VZ§¸ë@I‹ÖG©=…@IÝy_€Tì@J.A@äš@J~/¥¦c&@JÍF`µœ˜@K‡\0ô@Khô—ˆtA@Kµ%½H§À;ªKLœoÀ:þ˜økÀ:P7Ê«”rÀ9 “ýâŠùÀ8ï2å ¤À8< ð@“À7‡7YØ(üÀ6Ð !¯ƒÀ6FÇ1À5^3[ᘰÀ4¢f‹$¬À3äá® HÂÀ3%§Jƒ,ÞÀ2dºd™ìiÀ1¢‚·hÁÀ0Ý×±P8ŽÀ0ê†tþÜÀ. ¸J>|ÛÀ-d€k=òÀ+xæ:~÷ÚÀ)àK-/ÈÀ(D¢<[³À&¥û{4£À%h0äŽ[À#_úÙ¼ÒAÀ!¸Ç&kCÀ áûõÁ¾ÀÄÂãŽùÀf¹taóÀÙ ý šÀœTYê>À`Á÷.À€mè»îÀ˜ )¾O¿óP–C¿Õ‹†@.?á/ÈëÒ?öžµjU§@XCwÙÝV@ f#lÈãº@<7}y¢Ö@ÇL *ßy@T@5÷_@â áêƒ@qL·>Ø@!¡\:«"@"ÈÛ›À‘}@$‘/…E@&YwtnW‡@(!Ìî:H@)éM#ƒR@+°é}áí@-w1Wp@/= ¬20™@0€þÕþ•’@1bðOYþ@2DI1e¤¸@3$ø?º¦ª@4ìšë_7@4äȪâ@5Âc»h}S@6ŸÆÙmS¡@7|0WR™@8W𠳓@91Ú„Yï@: 2·@:âô£e7î@;¹«iA$@<©ú~@=c1 9@>5ê$+úø@?9¤g9@?×*ÈþD@@R»mÎ@@¹)ºŽr@AÒ'A”/@Aƒ±+M\Y@AçÈ÷@BKLG|W@B­vÉÀMˆ@Cœè±¨@Coצ³`@CÏÄ ÃAp@D.Ö2’N¬@D Á~›‡@DêfœÁR¿@EFâäSIy@E¢€ñ¦2@Eý@Uüìü@FW ×”X@F°"méB@GED6Ð@G_‰±?"ä@Gµð9ižD@H yŠ-Šp@H`&xÀ¦_@H³÷ÿ¶P@Iï<ÖÛ0@IY oß6@IªSô·@IúÄG@ç@JJ_ýÈ»Å@J™(Çb‘I@Jç j>™l@K4HÂD\`@K€£¿(­?À;J€äaß§À:ŸLÿxdÀ9òiE–œüÀ9CÔ̲£dÀ8“Žÿ4Ç–À7á— 5™EÀ7-îϾë À6x• wXÀ5Á‹DÀf&À5ÒÁ³À4NmBõIÀ3’\÷UÓ€À2Ô¤†CÊÀ2G ¦œîÀ1TH)]¥uÀ0‘«õímÀ/šî%ÓQ—À.]OfõÀ,€°ÇŸÿÀ*îõ"•À)Z7¡YpÀ'‡Góu5À&'óÏïÀ$ŠŽ0²ˆ‹À"êh†O³´À!G–:' ÀDVj’ÀôzïhmÀŸÆø²ŽÀFiÿÚ¶fÀ蕬€À û~@G‡À@°˜×§¿þÙq_A;¿ñ#„ošÊ¿Êùuãµz“?äâƒÅe&‰?øMD½Ìb@ìT>@ ú^ùÐý@‡#‰¤qS@$Ô׫>@ˆ»Ìs@ ¢KxV€@‘u¼!D@! í\w@"̵ÏV-A@$cQ H¯@&RTôß³@(wÃþc@)Ö–¡¢‘@+˜>ñøa@-YJ³T}U@/™%ïpË@0lƒUKÜã@1K¸wšü¶@2*[BÑñ@3Z Œ¥‹@3å¦ÖÈ@4Â/Ûõ;@5æ7öÕÚ@6xºßDˆ'@7RŸ9fˆ@8+…%ŽŽ@9_O}5@9Ú©î¹r@:¯º‡‘@;„#†³Ì@Èö͇k©@?–ÄÞ"îd@@1’2"ƒu@@— tÝô@@û»ó"˲@A_®«M£î@AÂÛ‘U©r@B%?³âz @B†Øf¿¶ƒ@Bç£A‘”‹@CGže\@C¦Çhd@DˆÐžø@DbìrÒ@D¿Ghmmé@E¶åU@Ev7~@?@EÐ9cïh@F)ƒéh®¡@Fõ¦wŒ¾@FÙŽ¨èl@G0O+¤‚ü@G†7”•BÄ@GÛHr„h@H/‚{¯Ž@H‚æˆ]¥­@HÕu—ˆyÍ@I'0Æ&ÄÂ@IxPðÁ@IÈ0ê~®@JwøCÂ}@JeñÈÝ@J³þšá@K ´Ù@KL—ë)À:ìŠLXÀ:BO>*v"À9–oÀØÀ8èêæ<¤À89ÀQ:jŽÀ7ˆïøÞŽÀ6Öz,!ýÀ6"_&CÀ5l¡]DÀ4µ@ä³À3ü@F@À3A¡=U·’À2…g P(À1Ç”ò÷•÷À1.cõˆÀ0G7™¥¡ùÀ/ j{JåÀ-Xí°À+öEàBôTÀ*h=³N öÀ(×MÕ6ÀvÀ'C„Åg„bÀ%¬ò}p³À$¦o­|cÀ"w³U?À Ù,@¬8ÀpHÝÏÂÀ)b„1pÀÝÐBßÙÀÁs»6‚À9eÔžéÀ Áß3èÔÀ %S}Õ ¿ü’’ iè¿îõÈs~¿¶Ž7!Ë];?è|ŠÝ»ý?ùðJÜ@Ö}üå U@ ¹J1¾•@ÐÕú©Ç@ELÒûµ=@¼ ggý@4 /2#@­0fæ@!_Ãø4%@"Ðu¿U”F@$£^¸„œ@&JÅõËd@(ºÞ:'k@)Ä_Šˆß?@+€‘˜Éez@-<.å_¶@.÷›»x.@0X’%y‰'@15útc@2AK@2ì|nŠ¿û@3Ç1xö¯Œ@4¡*äL@5zYÆÛœ@6R¯œÕr¢@7*N%z‚@8˜3Ðó%@8ÖÒji@9ªyRq†t@:}ÇœKz@;OïB}„@< å襵@<ðž`™)»@=¿T·è@>Œ3lH <@?Wü~áÑá@@1Ü‘ñY@@u°Áz]@@Ùv ,ùÅ@A<€™{s°@AžËK#Àº@BSÇ•ØZ@Bac:gî@BÁ³L Æ@C FŒ—Ö@C~®न@CÜHb¿ýn@D99 ô @D•J>û÷@Dð;Ô›M@EJ•;D¹÷@E¤±7.(@Eüш+Hè@FT³†‚ûß@F«Â ‰ #@Gþöt£ý@GWhÒlQo@G¬¦Šì@GÿÇ å{÷@HR¼»›–»@H¤â–æÌ5@Hö9›7Z–@IFÂåW£@I–®š:@IåqK—@J3™'Ö½´@J€øÉWûü@J͑ɷՇ@Ke×8 žÀ:XŽùjÀ9çŒyýÝÀ9<<¸íbæÀ8Ç•ÃO~À7á·õ®"¨À72 ÿ}„À6€Ê1Ò®nÀ5ÍífÖ‰®À5x×ÛÅóÀ4cn úÁÀ3«ÏD’º„À2òž®¾?%À27ß8›AÌÀ1{”+{À0½ÁCåUnÀ/üÕhØÅ¯À.{*P›ˆÀ,ö‹‹®…ÚÀ+oaŒhÀ)ä¡ü›À(WnðËXLÀ&Ç|;®6À%4ØFSOõÀ#Ÿ“fúÏÀ"¾ú´qòÀ mmdØÚ°À¡d2hLÀcB¿n^²À ¡Šž¥ÀÙ­GiéÏÀŽ”¬µç]À £fBÀÙu>' {¿úYOÉ ¿éålŒàlè? :áP%?ëþê´L ï?û‰ ˆ¥¿w@Ž1'$nc@ \DS¼ÐÒ@!D^/@ÖÀÙÜÌ@î™®Ò@çy @ɹ•ùÈÚ@!`±—² @"Ô¦è`@$‹ï%jG¢@&C·!X @'ûS:‚`¹@)²¢?¿}–@+iƒ'¥¦`@-Õ#>/@.Õw®0Û@0E%P*ó„@1©>æ@1ø¢Îù@2ÑU(Vú@3©ƒ§,¼!@4€ý^•õÅ@5W´C†œ@6-šSǸÿ@7¡ò]¦@7ֽ웘ð@8©á~ÏÏQ@9|Xg¯O@:MŸ¡ä@;ôÁg*@;ëÌtÅÆº@<¹f»©-¥@=…Åæ&‘@>Pà“/@?­äÊ@?ã%~1BD@@UÅ?ì@@·úYu@AKnú@A{ŠÉë @AÜ:”‘;î@B<+ÉpC—@B›[üªr@BùÈÿ*ž)@CWpÝ^ƒô@C´QÝÕœá@DjdžT@Dk¹y„ï@DÆ=¶ÕíF@EöWHˆ@Exâ¬r)@EÑ8&{Þ@F(Tª¦@@F~ÙàÈK'@FÔ‘âðU@G)|ßÒ$@G}›/4·@GÐíO!h@H#sÞ„7Ô@Hu/Ÿ"ƒ÷@HÆ!r Å5@IJVcG@Ie«g=$@I´EÛCí@JuÒp@JO,= ^@J›{  Å@Jç îéÀ:5ÞÁ‹À9˜ `àcÀ8ãÂ4ÓPÀ88\°±ã…À7‹g•ºeeÀ6Üã6rÀ6,Ð:ï7“À5{/¤·DÀ4Èά™ÛÀ4KwS.IÀ3] ½"EpÀ2¥F%$wXÀ1ëýPŽlÀ115püêÀ0tñ“ã®À/nl(PúáÀ-ðZ‹kpÀ,n×ÎüeÀ*êÎX”=‡À)d¹2ôÀ'Ú}•4ÂBÀ&NP¬,RúÀ$¿‰Ða%}À#.9ëd-À!šoN9xÀ >JìSÀ×sÄ=Ó¡À¡éþž›LÀh ‘¤Ì€À)ýÿ½pÀÏé7¯ãJÀ D8ûKhÀ±LèNu¿ø/×ó¶¿åÝ`‚ê*å?ÂíÕV4ïÜ?ïj¡Óè*?ý10o@A:[–ëù@ ûbs q@\]|õ×@¼ÔLÒ­@³–λ@»]w@å®d¬fÓ@!%&^àE¾@"׫W– R@$ŠF$,§‡@&<ÖÁà@'ï=/÷Á@)¡YˆVIA@+S Õo@-5"ƒ­@.´µ’ÁJÇ@0274uòc@1  ðz#@>ÞÊ¡œ¥É@?¥[°œ@@5LÛB^@@—?¨/ô;@@ø‚“¸÷@AY}ì#,@A¸ìƒºH@B þ(×ñ@Bvtn ›@BÔÛë/¦@C1£[@C1kØâî@Cè˜V@DC;~„/@D ?4@Dö22(RB@EN„†Óq@E¦ÆB†ê@EüÑõ_ïÄ@FRÍc*æË@F¨{ÃÁ@FülåúN@GPR^CC@G¢î¨µÆ@Gõn¤rk@HFVJ´ûú@H–â h@Hæ©y¦D‹@I5­®èÐ@Iƒï»Í”‰@IÑpÒrVJ@J2<Àª@Jj5W¿±é@Jµ{˜†áGÀ9ÝŽŒßæÀ95ì6âˆÀ8Œò·ø’éÀ7✑!€ÀÀ76ÁcQT|À6‰a©ºŠÀ5Ú~2\ö?À5*!>¨mÀ4x0óŽ}GÀ3ÄÊ‚½B¹À3çÃÀ2Y‰³é*À1¡³Â27}À0èj_ný À0-°Åþ8‚À.ãgÍ¿ðÀ-gü«ŠzæÀ+ê‘m&«À*i‡8Õ”À(æB¥SæšÀ'`]ÈŸå¡À%׿|¯ÂöÀ$L눧ûnÀ"¿| Œ²IÀ!/ªeTÛÀ; ÄÜ rÀF5ž Àå'‘Ò÷XÀ³Ù£óè‘À~†™< wÀŠ´ÙÚœCÀŠøhDÀ]Îùçh¿ö>›®”Ò¿á¢‘ˆ?мd‰Ò” ?ñ`Pvj^\?þ›o&Á¬@ïË€b¿v@ •ò»ú&v@ŸÝŠÿú@öV* €@N)‰;b@§(¶H@î€ýñÀ@!-³Noì¢@"Û#ý@$ˆ§áBrø@&6"ÝɈê@'ãuJ /@)€uꃩ@+=%ÕF@@,éGGI¼@.”Æ #ÅÖ@0€ült@0ô³FùÝ„@1É&Ùz ¸@2÷í]@3p]¥!üJ@4C-V•^@5ø+ò‰*@5æ)èsÍ@6¶Œ¥¸“à@7†L´@8T¶à ƒ÷@9"fù™@9ïËÜ~¯@:ºÃ [!‡@;…Zñ_!‹@¤Dýˆã@?höF–š@@0ƵS’@@w?np&é@@×£îŽc@A7[/vJ@A–bTÏÊ-@Aô¶»ýsb@BRUùüõ‹@B¯=ÛÍ2@C le á@CfßÎÙP#@CÁ–†•ò8@D,ŸD­@DtÈ’ë€Í@DÍA»›€ @E$ù×~&è@E{ðDˆ”Q@EÒ$ŒE9«@F'–b;çO@F|E¢T¼,@FÐ2O7Ê€@G#\«&Ý@Guıð÷¡@GÇk &ý5@HPh¨í¢@Hhu7vßÍ@H·ÚU åð@I€§¸Ú5@ITi,KDì@I¡”ú`)’@Iî@nN@J9»@Üy@J„¸TÀ‡lÀ9…ÞJÝÿ^À8ßZ-"À87ÁC³YÀ7ŽzYnÀ6㸒×NÀ67{í:ÒÀ5‰ÆˆôGÀ4Ú™9¥ÏÀ4)õ‰úú§À3wÝs†ðÀ2ÄSE‚hÀ2Y¬NíÔÀ1Xó¸hºsÀ0¡$Ûã®.À/ÏáÞW /À.Z¸eCûPÀ,âÖ¡0À+hF½jYWÀ)ëÀ1b“À(kI‹é':À&èôáº\€À%d#bÝëøÀ#Üã‘s‡À"SDз)ãÀ ÇWd—{¶ÀrXá,ÊóÀQ«ëú÷FÀ,Í¢®ÐÕÀånZßÀ×`í¤À M:ND·½Àå( û&êÀv]>K+¿ôr²´L¶¿Ü0æ ©}~?×Ô¡Ý?óåá;±æ@ †ŠQÒ@šÇ•ïj@ ,ý|ƒô@á²Gëâ@.l"¬°@|s1Dš<@˹M @wSe@!6 ß}Å5@"Þ„ËTä/@$‡é¤7O@&/™›©ï@'×øDàÅÛ@)€_ƒt›@+'Ê…!&@,Ï>K@.u VÂ@0 Â. é@0àI W¥@1²X‰èа@2ƒá-äRw@3TÖLû®@4%)ò2Q@4ôÏë$o@5ûZ(g @6‘ßôÃ`B@7_1Éz[@8+¥Bέ@8÷/+1@@9Áijv¦[@:‹[p±0›@;SéaÏÉ@<dñå°@<áÄõƸù@=§µ¼^Õ@>kæ=ÿp@?-ê¬Æw @?UpU@@Wòâ8¡!@@·|IlØ@A]ør—@At•ÕÞd@AÒè×@B.ùoî¹@B‹"÷QØ@Bæ–מޮ@CAVX”«@C›^&«üü@Cô­£&%N@DMCR³Y@D¥)CI@Dü=K~gÃ@ER FÝÔ@E¨EÕNÒ=@Eý.WG•@FQYUóD@F¤Æ½£<@F÷v£h._@GIi;s[ÿ@GšžÜû‰@Gëúꨦ@H:Õ,„¦@H‰×îŸy@HØ¢ˆˆ@I%¬—Ìë @IrþŒ@I¾Ÿê{“Ò@J …‡×@JTº Š AÀ90>»Ï£;À8ŠèÇàÀ7ä!O ©çÀ7;è‚Ê,ûÀ6’>ÙjhÀ5ç%7óÀ5:œFlµØÀ4Œ¥ÍýõìÀ3ÝC`MM/À3,wÒêŒÀ2zC'­šÀ1ƪ~BmÀ1°&ÃÀ0[W™rÀ/GI|?зÀ-Õ7•r­^À,`‚ÒœÀ*é5L8jÀ)oYîˆÈ¢À'òüv4ÜàÀ&t)t¸íîÀ$òîPÿ!BÀ#oYGömŒÀ!éyl”¬òÀ a^§<½éÀ®3i%lÀ•xF‚…Àx°¤WÛ ÀXØšc¸À3–Ê«F®À +ÓOö±ÀÀVCzhñ¿þÆ @'µ¿ñÿ*Ó¥Ì~¿Ô³UD´Í?ÞÁt[Ò¢y?ô—}°a@ÃæÁP@@?Ýhyä@ À`{ó¥ã@!îÁ³I@e%#Øš@©œ^Ķë@ïÔ½¸¬@5njV"€@!>,PC~ @"áÑW°¸"@$…‰Ð‹A@&)96šÚx@'Ìà Aq@)p ÜÚXu@+ô`ÕÆ;@,µct—^Y@.W<0ñË1@/øbõ× Ì@0Ì^;{ê•@1œä£;@2kN47L{@39÷'oç»@4ùõî@4Õk.1Ë]@5¢‘~<ì@6n@­±@797¬3æäái@>ô*Ä©¦å@?´º ó@@9SˆÞTO@@˜—¡@@öCy¬V@AS~2ƦÏ@A°@P7o@B X5¨á‹@BgðÌ9E@B€Àé¡@C–¦a…@Cuè’å?@CÎE«[@D&ƒlúÒº@D}ÀóŸË@DÔGïåöè@E*¢Q¡›@E/t?@EÓŽö‡Â7@F'5à9Ù@Fz$ zõ#@FÌYz…!}@GÖJÉË@Gnš¾4øp@G¾§4 Ç@H ü+`\j@H\š;ÛO,@Hª‚%¼v@H÷´“ —K@ID2žßi@Iý“Ÿ@IÛ:Ó§@J%{¿h»dÀ8Ü%&£¢À87Éÿ:Å~À7’Ãr».À6êÛ±_À6BI`a~À5˜P²ýƒ÷À4ìòÕÕ1êÀ4@1D#HÀ3’ É|-ìÀ2⊅‘ŸÀ21©ëK¾ôÀ1nÈY©¼À0ËÜB`õlÀ0õÛu1nÀ.Á~æø’¬À-Rz“΀-À+àçþ|aÀ*lÑ,ø€GÀ(ö@ìk—ÔÀ'}BÓéÀ&ãA–8*À$„/d :À#527—TÀ!‚otKOÀûSSÓdMÀîprqÈ~ÀÝ€yŽ#Àȧ/ÒÂ8À° âS„À“ÏWÏŠúÀ è?”Gù^À¢I¶Ë2¿ü¬&(Ãúï¿ðè’¨ìпÊćF‹“Ü?âÂK ÀÅx?ö$|¹|-@xW ôò;@âzØKÙ@PAy`¼@`¢ö¢~@šS4Ë@Õ°Ç;´p@Ѻ$ç@N¼%6ð@!FÀ4ú³@"å š¤w@$„ /{>@&#>±N@'ÁÒ­G8Ö@)`eÂt@*þÿÿØM@,œ`Mgc@.9‘Ÿ»º@/ÖÉd¯Á@0¸ì —¶@1†\Be»æ@2SOÙzÐ@3º7nÛ@3뀿`@4¶Â;…@5Hç… @6KãM@7§[ê—@7ÜWr1j°@8£·»ìó@9j4RJ¢ï@:/Ãd;´&@:ô[{.úæ@;·ó¬„|@»ªÈ%°@?yÇÈЀ@@[2³mO@@y8%aƒ@@ÖwÄ(Ò @A3IƒNU@A!æ<@Aêkë:Nó@BEt3ùø@BŸ#»™?@Bøïk”ß@CQ/kþ¯¦@C©0ºûÙ @D‚’T!ã@DW#Ó#HÇ@D­ˆ…G-@EPæ`AÜ@EVÛH$¨¾@Eª²/…1ô@EýÕC(MN@FPDMT™@F¡ÿ:™Ì@Fóws@GCYÊ0@G’øxŒäH@Gáä®J;Í@H08ü²«@H}¥¶ ðø@HÊ{ÞüD@I¡~ÌÞ@Ib{=‘Ñ@I¬ÞÏÔ@ß@Iöø‰ÁýÀ8‰…æâMÀ7æ%y=þMÀ7Ae÷úOHÀ6›GÕÉÏÀ5óËÇ©SãÀ5JòÍ À4 ¾-é†À3õ/{‚-À3HH—J$À2š ±ÌÛkÀ1ê{Of—À19šF×—uÀ0‡kÇÀå{À/§æ±HfàÀ.>i´ßW<À,ÒiZ}À+cíÿÊO À)ói£¹À(°þô\À' -„À%’ #s~HÀ$ÏÒßÉ}À"›`î(SrÀ!ÌéÖ À8Eö†4XÀ2æ.KB1À)›ß+¼ÛÀ‰âædÀ Ô‚h`2ÀïBÜjßsÀ À/k.`ÜÀŠ¿y% M¿úžŒÂ™âC¿ì8gâ‹ÙK¿¸òN[¡s?æÖí=ä?÷¨C÷Èen@(“¹ÐFé@€ê„óû®@ÜÄ81ƒ­@Þ¤ p@θ,Ëå@»‚xýÅ@3µ+2ƒã@gpòª$@!MÝ2 þâ@"è.e]6@$‚‘£–n»@&ìv[É@'·$jDÂ@)QoA=@*êÂBÙ?9@,ƒóÀ¡@.™¨‡œj@/´šM@j@0¥î%Ñáæ@1q#JÊ>O@2;à>Aî@3ÝÄ•x@3ÏÁ@©Í@4˜Í¼(ÛÇ@5a2è²R@6(å¥ vÖ@6ïÛ¦ý@7¶Àµf7@8{d`*%Í@9?äÓ$û@:~Uexù@:Æ)ë·¿?@;‡ÞÄy1@˜y}@=ÆÚ@às @>„_4Ñ{^@?@Å÷½ @?üíîi7@@[nU§s@@·‚tù²,@AZNj¢@An”lM<@AÉ.rކ@B#&0¸@B|y¥sþp@BÕ&þbr£@C-,“ªuá@C„ˆéªµi@CÛ:¯cgò@D1@½p¢@D†š÷ž@DÛEÞ…Ö@E/ChíðŠ@E‚’(5¾@EÕ1³ªãÜ@F'!ÆŽ%@Fxb:ûÁ@FÈó.çG@GÔZJÉo@GhWx?Ç@G¶‰Z(³“@H]ÑÒJ¦@HQ„G¯[@Hý]O@HéÉÌW¹Þ@I4êc\L@I`¤CQ@IÉ+®à\À88V3•˜ºÀ7•ð)O3À6ò3­·ÒÀ6M!•FÖÀ5¦ºX?RÀ4þÿݯü«À4Uò´ðÎ À3«”Ë%³À2ÿè½1½À2RîÏ¢QÀ1¤«?ÃÀ0õ!4j·À0DRô-¨ÑÀ/$ˆ°úðúÀ-½òƒ}ÌUÀ,TëÐ_vGÀ*é}ºE|®À){²\À( “væ²pÀ&™-ùV&À%$‹*ÛÀ#­¹ÞуÀ"4Ç!܇À ¹Àñ›¢àÀylW¢0 À{lÈÁ ŒÀy£Æ/PÀt3AQËšÀk>ˆ¿óÇÀ½Ô~HØÖÀž¸§ KyÀywîÃ2Ö¿øœÆO†¯S¿èw5îÞU?‡ó®nÂLG?éJ#:ôJ?ù#0µ/ @ÔÆåJ2@ ·A Ý@f ¥·þ³@Ù°iµ¦è@¬ØÞ@*Ç¿5G@TÏu”´@’þ¥‘y@!Uo¤?@"ë@}Pæ@$"ÑÒ©@&ýa@'¬µ ÓÊŸ@)B3*;š@*×\Mï-!@,lÚ·n@.LÏ×0–@/“âgÙÄÌ@0“`’‚ò@1\fé3@2$ùÏÝÁ¦@2í éÝõ@3´•Å@4{†º³k/@5AÖÚÝe@6z¸1ж@6ÌgÓ÷T@7“õwiZ@8Sõ6y@9ü¬›ß@9Ø1å‘“@:˜ùPha\@;XÒNàwŠ@<³¸ _g@<Õ•¡(/@=’pzeÇ@>N= Û@}@?ôƒýèî@?Â` ß@@=…A %@@™.“:M"@@ôAr±@AN»Y1å @A¨™í½³Z@BÛÅ'@BZ|œ²I@B²|á9¬ï@C Ú)A…@C`’õ*#L@C¶¥í"­@D ⫸X@D`ÕÎe½@D´ðÍÄi`@Eb%a¸@E[);s³G@E­EšÓUR@Eþ¶îìëÌ@FO}ß{&@FŸ—Å ðÂ@Fï;Þ©ƒ@G=ËŽ§ ½@G‹äÿ[G~@GÙSêlO@H&Å”*p@Hr4¬9ä@H½¦š9@Ipó¯´ö@IR“ùƒƒ¡@IœŽÜÌ~À7è‹VEÔåÀ7G ¨‘±À6¤ea·À6]þÑÏmÀ5[ ÙÕ4À4´lÈèβÀ4 …@Oä“À3cUû%2À2¸àý^”qÀ2 (•¾,?À1`/_¬±À0±øDù%ÀÀ0†…À.£»5–À-@êc¢ŠÀ+Ùì‚ô‹üÀ*qXÁÀ)ÊL:53À'™Ò¤W üÀ&*¥1£±ÔÀ$¹M¾):À#EØÃ¥^À!ÐSlÇSÎÀ XË“9¢|À¾Ÿ~ó#ÀÇÞL ÙQÀÍsO’²ÀϘ%›«ÀÎ%‚n½À “UÅ):Àƒ›ÖT£Àn6šE‹¿ö¦`ÚùJ¿äËb¨7‡¸?¾O—1/9ê?ìqí¶÷në?ú•™¤’²i@}v @ ³fšþ»@ì4ô@’6@&™ç’Ý@3wzSáž@SÝxB1Ü@u(y}@—(û)´@!\Õ¡Ã>/@"î@ž[{º@$¼bK@&0QpjO@'¢ƒÔW!@)3ž`ο9@*Äg…"˜@,TÆôÒ#‚@-䤎+q@/sèiHì,@0=oѾ“@1H"K!){@2—C‚:@2Ô‘£ó@3šod›@4^æ˜JØ@5#,ÒôƒŒ@5æÌ°]z@6©¼`½×@7kðè³ @8-a¿mÒÍ@8î6˜:Ý@9­ÒIÂ"X@:lÀD››â@;*ÆÄÈz @;çÝ»…†‰@<£ýo š@=_{ª}Ñ@>9Ô±Í1@>ÒHÅZÛ@?ŠDïˆæ@@ ”'“2@@{v›–7¿@@ÕÇ)¯Y@A/ƒQ-—f@Aˆ¨À-·ñ@Aá5MHª@B9&ú˜‘@B{ñ ¤@Bç2ˆm¾„@C=I; @C’¾­¡÷@C瑪ó@D;Á#‹Î1@DL,º¸@Dâ1ÿ™ry@E4qøÃ'@E† “œ“P@EÖþp‹[@F'JL’÷ì@Fvïߺ@FÅìê%—@GCXfü@Gaò—ÝQO@G®û& @Gû^Ou¯÷@HGTuØ@H’3.¥¼n@Hܦ†`ÿG@I&vçw@Io¢¯;9›À7š9ÇãÀ6ù§þ/§¨À6WïÄRâÀ5´òƒ¼ú@À5±Ûwœ À4k.ÜñõïÀ3ÄkÅ +À3h@Ñ—À2s(€c¶ÒÀ1È®+q*À1ûåÚÏ«À0pŸÃ€?À/ƒ÷,¦È­À.%hª8½ÍÀ,Ä…n»óíÀ+aUÒL À)ûâЖ'ÒÀ(”6 |TaÀ'*YÇa‰7À%¾XönÐÀ$P?-v—ÿÀ"à¬rtÙÀ!mòYêy¼Àó³‡Üš@Àº=6xOÀ…7ÓÀ$çU"‘ÌÀ.LãܹÀ4hèÓFÀ nºN<ÑÀnœ•?ÛWÀhÁëcL¤¿ôºì³©.«¿á4 ©ëý?̃ƒÌë?ï‡ê1ÔXê?ûÿÑÊ äú@!®~b@ FôE}ó@7°Üw[@MNƒzvÿ@d%œ ·`@|%ìÜ@”ǰözÚ@®5oÈÏý@!d%¥gÁ@"ñ/{;2@$~^,8­@& „ùzD@'˜Œ§æmÿ@)%]_²B|@*±ß‰þ…Ö@,=û±{ï@-ÉšŒAد@/T¥¡²S@0o‚!¯™ @14PÜ:F¥@1ø³’Ï„@2¼ŸO‚ä™@3€ Q¤½)@4Bç Ä!M@5.!^ŽÔ@5ÆÔ}™é@6‡ÐB/4@7HÖ_FÐ@8¡äÙô@8Æe]ó5V@9„Y€fþ@:AuÓ†Y’@:ý²-A‚c@;¹²æ°Þ@œ¸‹}x@?SH†Íô@@6è\3’@@^UFÓ¹@@·æ¯2@AæøfZà@AiU†H'Š@AÁ/£jiL@BsS‹k›@BoÂvæÎ@BÅ0CjKô@C¦PhN@Co‰}l@Cú³ôk@DV¹ƒy@DjR§g&F@D¼­­xª'@Eg9ƒ¸@E_~hØE@E¯ó".J@EÿÄùº#â@FNó½•=8@FXe ]@FëgÐOª€@G8­EåÚÛ@G…OóÇØ@GÑP*'Ù’@H®T“‰Á@HgjòÛ@H±†—…«¡@Hûíùu¹@ICݱž‰À7LûTMlDÀ6­€éT9UÀ6 É*€lÅÀ5jÔôä)À4Ç¥bVNGÀ4#;ËR½2À3}™ÈÖå À2ÖÁ6*JÀ2.´2™×À1…u#Í®À0Û³éRaÀ0/kÙñìeÀ/O¨2îÀ-©|ZsŒÀ,Kew“2õÀ*ëH¸•³À)ˆŽ³Ò2À(#á;¾"3À&½ˆ0±À%T4Ñ÷À#éLÛ«`À"|f¤ À! ‘RéXÀ9²©¥öÝÀT™àNeÀkò鮦¸ÀÞSÆRÀz³œÎÅÀè•ßÖMÀ P“N>RÜÀ__iVÇ¿þÑÆ)(=¢¿òÚhÏÆt¿ÛaTs'á?Ôʲ×+rÝ?ñFaÙ Iö?ýb(p—c@¬øJ¢™@ ×§{q©@w×À+“@…4Þ85Â@“ÁbK@£PyB@³´6>/g@ÄÀ{v½@!k#ºfÅ@"ô ½;3@$}`¥@&ù¸?zL@'ŽÍÝ Ý@)lò­Ïf@*ŸÀ3._@,'°øäg@-¯(ì•T@/6IÊöª@0^*<‡ý+@1 îA²4#@1ãIó5±H@2¥2¹Ð4Þ@3fž,Úš@4'‚%@4çÔiõS@5§‹f¬¸l@6f|†_@7%Y#«@7â­î²I@8Ÿšq‰Þ_@9[¾\Y1F@:qÛˆ»@:Ñ‹¾¢Ç,@;‹%š«!V@h:ÃÔ²@? ‰-Å@?ÐÑVþ®@@AņÁÁ”@@š™9‰¢@@òá+šŸ=@AJ›4¡Ö@A¡ÄÕì ­@Aø\tAÉ @BN`(¦@B£Î#y/¿@Bø¤ÿUj$@CLãM}©@C ‡Î—×™@Có‘fjmŠ@DEÿ fA@D—Ð e$@D陉Fî@E9™RH@E‰ìã(@EØè¤|p@F'¡ç1@FuºÀ”ÀÃ@FÃ5&h“™@GR¤Ñ@G\LoaBš@G§é¾ýZÊ@GòèšWÏ@H=Ip2U@H‡ Ä(õ@HÐ3-°bu@I½W*•…À7"¦ÖòeÀ6b Jn À5Âè"þÀ5!ûã°À4ÛŒ@ÊïÀ3܉¥1LÀ38ryªÑÀ2’VÜÊOâÀ1ëzˆŠ À1CsuVÈVÀ0šEÆg¼À/ßçâå[éÀ.‰}„uóÀ-/âg7ÑÀ+ÔBÃ*rÀ*wH_‰À)qFyVÀ'µ¸¡y—ŒÀ&QñX­S¾À$ì&ÆÅÀ#„aÐ+Ç À"°Šsx[À ¯“ío'ÀƒqÍŒ¡ªÀ¥'–ÑÀÃRT¿õÀÞ8L˜^ÀõêÊÎ À ‡—Hq<À 8c 4ÏÀVdÐ$¿üÜ˾)­y¿ñD'¨g¿Ô€‹êµýƒ?Û0äÓµ¦?òÀŽ~?þ¼ç¦«D@`6Aöea@ e=FFA@¶š¹ÕJÌ@»åÁöt¸@ÂU#Y…‚@ɽìüKW@ÑôɶOÎ@ÚÎJ5Í@!rìäŒÑ@"öÜ›¾à@${¸3°þ¢@&WçÆ;@'…EQàè´@) ÊÆN@*ŽÎd§@,áïó|­@-•Iy×@/&ŸÈô@0M2¾Æ=@1 öW%K^@1ÎUÚŠ`Â@2ŽFR¥ý@3M½©÷z£@4 ±ý±I@4Ëš´íg@5ˆëö*ñ@6FôÕœé@7¦cï@7¾~…¶!‰@8yœÎÕÄé@93øödÓ:@9íŠ÷Û²=@:¦KÖRº@;^1Öž›a@<8€ ~@<ËVÛåØ@=€‡£>ì@>4ĸî©@>è;¸ŽÃ@?šHX+†a@@%ƒRÚ@@}Û–(@½@@ÕlýVÓ’@A,tw—¼@A‚ïéT`Z@AØÝ\K8D@B.:ÿ"½Œ@Bƒ$ë‘.@B×@D“ð@C*äøG‹ê@C}óüÏGë@CÐl0Ó‡ç@D"L” À@Ds”FÝù@DÄBˆ¶‡ @EV¸ #Ú@EcÐPÿŠ@E²®ì­a@Fò@&©Ž@FNš‘{@F›¦i5ê®@Fè,~@G3ì[©_@G&šŸÈ=@GÉÅÁÀò@HÊUŽnc@H]4ÉSúQ@H¦£íg8@Hî=~ÝiÀ6¶‡¶mHºÀ6ü<ƒÀ…À5zBàËÏÀ4Ú\§-ÍÀ49JÐæÉ1À3—×P$áÀ2óªpæk¤À2O’%‡÷À1©po^ À1Ÿ|X_=À0Z¯q3µpÀ/cF1¼qÀ.ü€I"À,¸‡¼,“À+_ïÚ{6íÀ*=¹±À(¨wãÎz“À'I©ÊÉ£—À%èÜñò$À$†˜xÀ#!næ‚ò9À!ºåÏ&À R‰ Ké´ÀÐϾ5ÐhÀù Ã^uÀÎ:•çÀ?Ö¶"oÐÀ^}Ž¢lŒÀôR[“b´À %òàNÇÀRaº;¿úò1 È3¿îl›/¨):¿Ë‰ì¤Ý?ๅ“Ðù?ô2ȈNŒ@+ÿD:î@úk •c@ ïÒ„¦¨L@ô -ßk@ñl°Tí @ïê´Å¶Ù@ïY·Ð @ï×h”¾@ðbâÿT½@!xÔ5øJ¶@"ùšë@$zp4–jò@%û>°XÃÕ@'{ðþýQ@(üqÌS]ù@*|«×Ï=þ@+ü‰üéåf@-{÷;e5@.úÞ¿m0f@0<•ôÇ/@0ûe+=@1¹ÒóH°S@2wÕb˜cž@35b·Ú¨˜@3òq^Eá@4®÷ï÷ºß@5jí:¨úD@6&H@àN@6á=u¡€@7› ¥å †@8Te,žŒ~@9 þ×@9ÄÚ›ÈCk@:{è+½"B@;2#,8DX@;ç„›ïv@<œÀ(VW@=O %¤¬@>M¡Uî @>´Pæ& @?dÊ›Œh@@ G—ãº@@a¨„<@@¸…³R¡‚@AÜêýéî@Ad¬¸‘ë@A¹ñ=ëÓ¢@Bª—oøŠ@BbÖu–Z@B¶sMCÎX@C ¸.©@C[úox©²@C­âMn²6@Cÿ6L]O²@DOõ…Ö–@D 1ï _@DﲦtIÁ@E>¯V´k@EϬ½`@EÚâ½&AE@F(âàAó@Ft·ªÒ×@FÀ½fëÆ@G +ɶ†O@GWkîÚŒ@G¡Aˆ\‹¸@GêénË@º@H3úƒ' @H|u<œc@HÄZ$·ŠˆÀ6m!ŠÍ "À5ÐŒ@o.À52Ðw@À4“ïF>CÀ3óéþ(È—À3RÂ&<ÇÎÀ2°y¢ËYÀ2 &rKÀ1hŽ ãÍgÀ0Âïï“ÆëÀ0:wÄ’oÀ.èá=øD,À-—+E…+ãÀ,CZ%:TÀ*íu [z’À)•„c¤ú/À(;«¤èÀ&ߣ žÀ%Å1;Ñ2À$"_•N%À"Àb_„Õ¥À!\ó‡2ä…ÀïoÆé#À!¬¹úpÀP‚ÕkX!À|¸Ç´9À¤œdãqÒÀÊßâ»À Ùd_EPnÀ¦Ä:îÀSpyUs¿ù—ì-2¿êå¢jO¿¼¯¤s»y†?ãÊ™.r*?õYÐμ¥@®^Ÿ­c@‘joî@ wƒüý3@0.âzè@%ÔÈ!@‹s3»¶@+=ý @ ‹|"…í@ Á³{·@!tü¯„\@"üK"°@$y/É 0@%ö ¨ˆW@'rÎö*cQ@(ïak‹éH@*k¯}tÂ@+礻“»N@-c,×èÌÂ@.Þ3®tŸ°@0,R¦a¼‰@0é6ü¤G@1¥½BT¨@2aÛnøàp@3ˆVåJ@3Ø»ï¹@4“içgìÏ@5MŒ8Zw³@6@Fú@6À{$uo@7xQ¿½ÿ@8/ì•ö€@8æÑ¸ê˜@9œøì³ p@:R[Yï}H@;ñ½PG…@;ºµ@Öm@°å~@?0OmDê@?Þ ¡OÁï@@EûƒÚÅS@@œ&Ãól5@@ñÏÝj.@AFô¿X Å@A›“{1°È@AïªDr+¯@BC7p6h@B–9tÈY‘@Bè®é!¹¾@C:–„[´«@C‹ï>¡@CÜ·¨ßx@D,ï;q”,@D|•’@D˨VÞN@E(—àJç@EhNspê@Eµna†÷@F2µÑÔ@FNbðΨ_@F™þ·½À@Få :ì)@G/yæþr@GyWËÔou@G¢§¯gÓ@H Yëæ»o@HS~Ö[‚@H›`óºèÀ6$çwÛhÀ5‰GlXžkÀ4ìˆð¬À4Nª‡·¸À3¯°4‘FÀ3šª¤]@À2nk·¶æÐÀ1Ì%c„•À1(Éñ"\À0„[ߌ,À/½»Ø-zÀ.p¦$*~ÏÀ-!}G‚À+ÐG­ÂD>À*} [SÀ)'Ö˜í*À'Ъv2½À&w“k[›À%šˆXPÀ#¿ÉßÐιÀ"a, bXµÀ!Ì"kÎ"À=kš@DoÀuê_°—À«-äWžÀÝP|IèÀ mvÄZBÀ8¡$-JÀ ÄVcÙ>À„”BLÀYÚÚu¿÷:£]0'Ö¿çp³Ã€”¿†®þ=ôѺ?æËó¿‚?÷ˆ¿ü| @Q,-dEÈ@%RĺY@ ülBÁM°@kÅã`n@Y'ùÿ9ß@H@I‘S@89ݯª@(íŠ3ü;@ îº)@!…ò–ÞzÀ@"þìÔnè@$wô±Ž°N@%ðö32C¸@'iÝ`¹!¾@(â–K†xì@*[ «Y@+Ó-ýÚÁB@-Jå]åuQ@.ºî'ý@0dä 1@0×h72È@1’i¾ÈÜ@2LT0 âþ@3*c ®@3¿Šáµ@4xj@p)²@50ÂnÞ9è@5芲y8@6Ÿ¸üËÍ@7VGÚÖÄ@8 ,eˆ}@8Áasaû‘@9uÞÍ£´„@:)KÒÐÒ@:Ü–*¬¾@;ŽÂGÝ[Ê@<@®'ƒT@<ðœ 7þ[@= =uëïÃ@>NúG`\@>üÍXQt@?©°Ð~¥‹@@*ÐD=`£@@€KÓñØÖ@@ÕHë޵@A)Å~XÙì@A}¿£¾=@AÑ5‘¹a`@B$%Ÿ B«@BvŽB´‹!@BÈn®ü@CÃÄ>à@CjŽ*þt·@CºÌ8]=@D |û+@DYŸžŠœ@D¨3hΔ„@Dö7½P‰¡@EC¬Y0z@ENˆ)@EÜãT…{æ@F(¥¬{Yý@FsÖ÷ ÈH@F¾w)ªç:@G†OKK@GRˆïj¶@Gšò 0`@GãOzj@H+ R0@HrYg8À5ÝÑÃîZÀ5C%OjWÀ4§a*ŽèÀ4 …ã h³À3l”ãôÐëÀ2ÍÍÕÝiÀ2-xxn\À1ŒPò‹.À0ê„[˜§À0FÚ±ðD™À/E"rÚmÀ-ú„((gÀ,­àõ“ýGÀ+_?ÅZ>ÅÀ*§ÿ«ê»À(¼!Šò†ÖÀ'g´Ì±.BÀ&jª'<)À$¹Lˆ±ÖCÀ#_dMé[CÀ"¼_wä À ¦_¢¦AÀ޲÷:ÀÍk˜¯ PÀ æŽ'ÀA“HŸžÀw/BÝaÑÀ©ü†.émÀ ´'«eÀ%íLWÀe-¹MŠ¿õlÿF(I¿ä iøWÙË?¶€Ò,4Ò?é½;}½ü?ø\˜€p­µ@𳡔Û@¶>c¢ p@ ~¤âGoÿ@¤Ï7ÓÛ±@‹p·²¦é@s·ÉâÍ@[Œ¡v˜Å@D»×rg@ <)ÁÁ@!ŒNJ>‹@#€æ*@¼@$vÀ¯6ü,@%ëúR.~&@'a~% ù@(Ö ë©bý@*JÁcì‰ì@+¿!ÇÚKû@-31@.¦vÿýà@0 ÉœžÝŽ@0ÅõqIùx@1~É›ùÏ@27;‘‰^½@2ïCýã&L@3¦Ù¥;@t@4]ó÷¨®À@5Šic‘@5Ê•8`!H@6€ èlÙÇ@74æËž;ï@7éA;]¥@8œªÞ¤£¥@9O…q Aµ@:¦þþå¬@:³ÉÑT©@;c¤NÏö@@<sHS}é@<Âo®¦›@=p“¸Àh“@>ÙÜÞÕ@>Ê<Ðî³@?u·ŠÕ¦2@@" Iǹ@@dð´ I­@@¹CÛôF9@A ¢°@A`qr¬à@A³H5öúÄ@Bœµx,ÿ@BWmhÝšô@B¨¸æ Ý•@Bù}áíš@CI»*Ü\H@C™o±s¹@Cèš ^@D7:¹tûe@D…O¡ƒ?›@DÒØ’]ä·@EÕÕyK@ElDz°%å@E¸&¥ò°þ@F{@&ä@FNBš—k@F˜{(¨NŽ@Fâ&`îí•@G+CÚ”6c@GsÓ½‚[,@G»ÖD¦–ç@HK½0‚Ê@HJ4…ÒœŽÀ5—ÖW7\À4þÀÇŸtÀ4cS–/ ïÀ3Çyµ]BÀ3*È7p§À2Œ™Fjb'À1í—v öÃÀ1MŒlüÁÅÀ0¬zxhc>À0 d´Þ„À.Θ6úÚÀ-†jÔÚ__À,üÀ*ð2 ¡?VÀ)¢4Öä1À(RV°RXÀ'ŸàZÕÀ%­*â óÀ$WËÎŽbÕÀ#Á„ƽ¢À!¨z ÄÀ MŸr›^‰Àã:þ¯À(ŽÇüÀiã¿`}øÀ¨Á©0ý3ÀäÈH%Àzs\/À ©wö.ŠÀ·-K#¿þê÷Iœ¿ó¨X3Õ=¿à»®½—°?Ç«d&r}ô?ì  *ãÊ?ù±É.T©@‰)ci@DJ:|ò@ þF;/ï³@Ý`Éi,@¼¸SçÆ,@ÙÒÑ@~*=cÝÙ@_úÑKdÃ@ !*Røæã@!’‰M_ë»@#µYË0@$u’ÜòÉ @%ç‘yÕ@'X„¢Ç¡è@(ÉÅé!~¨@*:ÉLìÒf@+«|Lñå‚@-Ì… @.‹§´óSã@/úûÆ+'@0´ÛibÙ@1kã•¡_y@2"®Dcn@2ØÑψb@3Ž¥f—”@4DCe-j@4øß‹÷¶@5­5Ff®@6`û¦`º@7+Bâ˜@7Ƽªž@8x§ƒL'@9)æT‚²ç@9Úq½ìÅ'@:ŠC+·ƒe@;9TC:Å=@;çžä ã@<•(ºž=@=AÉgÝ®@=íž4Xðg@>˜–]ýL·@?B¬ñÈõo@?ëÝ:“w@@J_PTö@@¼¢9âÏ@@ðîfÖ–©@AC¤Ì•= @A•Þ HX@A瘮?$@B8ÒÁ€fe@B‰‹<±på@BÙÀ´45@C)q÷HÛZ@Cxñk°@CÇC§³¶Ú@Dbîô@7¥_¸@8UQZsß(@9û<Ì« @9³÷ê8@:b>¡Ù6@;Ë^J–7@;¼—‘­@gÒMã®ó@?‰v«Ÿö@?¸`ÏnZ@@/©øU`Á@@‚¯WÍ•’@@Õ>aåw@A'U½§¢d@Axó*,1V@AÊ16âñ@BºM~‹@BjáÓ—@Bºˆ<¿U•@C ®B¥@CXRø“I@C¦ty;ð$@Cô.ü«C@DA+P åã@D¿+\¦@DÙÍ(v@E%TÄ«ås@EpU–Ô•ø@EºÏJNš>@FÁ „œá@FN,oÔé~@F—¢æw@Fßk7úI¼@G'?@Að @Gn‹ß-ÕÖ@GµQIÁ¢@GûÅæË£À5|+f”À4w?\ŠâÀ3ÞdìdØÀ3D‡•–JÀ2©¨ˆÐÜGÀ2 ɬAÀ1pìlò RÀ0ÓjµA›À04@ÎmÕÀ/(î=´§óÀ-çr3y oÀ,¤c½8À+^ØÐÀ©À*Ç'‰wÉÀ(Îç¬âöhÀ'„AN^'PÀ&7ÜνÀ$éÀ•©|kÀ#™÷­$ ‰À"HŠÄ áuÀ õƒ¬u>ÀAÙPüæÀ• Î‘{šÀætœ¬—À4j+ ÊðÀ›þÂ>ÀÈcù›À!‰Ÿz¸À£üwðZÀ%IEÖÓc¿ûEø <›¿ð8È—»Ôš¿Ôä ÇÛ?×åüéU«Ã?ñ¦,S9?üHÎ`@¼ÆW»ö@ X&‰…Y@öe@K6ò&èG@g÷Ôë@î€Ë[&@Á_JÕqU@”á S¹¥@ 4q¹D|â@!ž¡ÖO]@#ïgG@$sHêÇ`±@%ÝœÚá\Â@'GÙ´B @(±íûmÑ@*ÈC]@+…W2;4@,­@.WN*}á@/¿”wŠ@0“¥H\ðÏ@1G0viØ@1úccþÑú@2­5ý ;à@3_ L:v @4šJUo@4Ãèñc/@5t  rh@6$œp§ÜÔ@6ÔŠÿøAC@7ƒä¬Ó¥@82¢žÛu@8à¾2÷;@9Ž0ñL@::ôšÍôw@:ç ë¾Í@;’Vªñæÿ@<<é–½Ñ@<æ¶uñ]@=¸žÀ@>7éw³/S@>ßEÖÖ#¼@?…È¥ð Ê@@¶È"© @@h<º÷@@º¾ªÕï@A €wâ"›@A\ƒ®#“@A­ÂÒÉ(@Aý 2±5¥@BL¶•О@B›Ðüo®@BêmÖkS@C8ŠìîFv@C†)Ž @CÓF»@Dã ¬ß@Dký3x#@D·”¶kN @E©ëäÃ@EM9¡A8ª@E—F;[K9@EàΈ5ÇI@F)ÒU8nÓ@FrQƒ•‡w@FºL¦É@GÁèIL`@GH³>8ïh@G 3k -@GÕ lõïÀ4Ì>u(^nÀ45XÐa˜-À3tÅ,n‰À3“¸¬ÜÀ2j·>ßéÀ1Ïá½:¸À147ç]ÖÀ0—OÁÖ<¶À/ó2…@À.µã3A@7À-v¸SÐJ;À,5·TS¶šÀ*òæ{S-ØÀ)®LyMnÇÀ(gði†«¾À'ÙÒ¨QµÀ%Ö§/ØHÀ$ŠEªSpÀ#=ˆxºšeÀ!îÛvçúÉÀ žŸâ3‘àÀ™¿Žå$ùÀóK:ר>ÀIø‡oôÂÀÞÂ;´À=À=¯´b÷À ™ã$<À§ÄrF¨À5àÈ"hK¿ù€°"˜¹&¿í˜xwò^¿Ì;¥Dš?ݨzeI?òzRPsÙ?ýŠw• ,‹@POúz@ Þ'/ºh”@n‚¼£@€OzE@Jàç(_<@ ¹6@â­ÉR´@®‘q†í@ =Îf©¯ž@!¤…‹°«@# Q*Ô‡I@$r,b,”W@%Ù3E­7@'?Á§«<¢@(¦YÐpº@* ¹Ì˜Y?@+rÐÍ’–”@,ØŽ'ý.@.=á'r1@/¢¹v|zÚ@0ƒƒ`ÐWÏ@15\våV@1æà ÇÑ<@2˜B%1@3HÇg¹K@3ùàÙ Ì@4¨ü:úò¬@5Xa&Ú@6CyÇí@6µœ7”ì@7cd‰¢Œ²@8•Érýì@8½)|vâ@9iWÝé8@:_AU_9@:¾õP$†ê@;hÕÎ(jê@<û8¯G[@<º`A3ÕR@=aÿÍøÜ°@>Ôú…’@@>®Ûf@?T ­}û¶@?øhx$0@@Móµ\a@@ŸCWULD@@ð!Q] |@A@‹í¤ˆ@Aì½M@AàºP‚{@B/úµY@B}–Ù+ñ@BË©×C‘V@CBšû@Cf]ÓÛ‘k@C²ü+5t«@CÿH‹Q=@DJ½pùvB@D•ßQ‰1@Dà€h’Hõ@E*¡1Zý½@Et@÷[(È@E½_k¿&@FüS™M¢@FN‡K @F•°ñéxá@FÜÈ¢õ7@G#^r# ô@GirµöEÑ@G¯‹íôÿÀ4Šf#ÔsÀ3ôo#MX8À3]Å5>ôÀ2Å™wu©ÓÀ2,½Ôž“À1’î¤Ô&iÀ0ø-Þ°Ô£À0\}¨“¦À/À®3ïÀ.D°ä…ĶÀ-ÑcõƒíÀ+É(ß½=À*ˆºô×¢–À)Fße‘FÀ(°Æ»À&½"9ìæÀ%uì¨Í[õÀ$-µ;}À"â®áGGÐÀ!–¸9TÑÀ I>//ÍÀô•8M yÀSÏ|çe:À°@pÚÜÊÀ þ·ŽžÀaSmÉÀµ»›NEÀ ÖyÎþÀ¯ŽgÆ ÏÀJÒ]çБ¿÷î¶©T¿éÓIʤ £¿À?¼¦hW?áÁÒ#1SÔ?óЉé¢Úþ?þÆu¿Â{{@á¬×ñu@ a§ÎÏ%â@ä¤Û©“@´éÍ·Æ@xzöÁI@<äî ¥@Ó»zq@ÇÅó,pŠ@ Fýå7Ü>@!ªDן†@# §lëÌÊ@$q7öÌÖ@%Ô}Ç×O@'7Эf@(šý€ÀØ6@)ýóæÅ—@+`£–†LÆ@,Âü^¯d@.$î*ÓÏ\@/†i¨v­@0s®–”6@1#Ý|·BC@1Ó¹ìW@2ƒ;9•…@32ZŠÓUß@3á´FÏ^@4VB\g@5=$q€@5êsH–H@6—<üÖa@7Cz’etI@7ï%Ž3Ø@8š7 œ[@9Dª§…ÈW@9îx®Ç¸…@:—›ñ¦ºÄ@;@Û¶?@;çÌ ¯¯@<ŽÎJ-M’@=5žEM@=ÚŽ:Ð@>B„à³é@?#)Ü—[@?Æ=ÇÒƒ@@4>H¹v@@„ðÖžv.@@Õ4­_@A%[³4é@Atj ä3@AÃXOnx¨@BÑÆ¯»@B_Õ#w~B@B­a1öÿ@BútÖ…8É@CG IëR@C“.éËú@CÞÓ–‡ß@D)üTv(@Dt¨z˜iI@D¾×usc@EˆÆŽðh@EQ¼í+@Ešp×€’¦@Eâ¦þŸžÆ@F*^Is±G@Fq–šh•k@F¸O噣Â@FþŠ0>#å@GDE'ð@G‰‚*ÑC8À4I„¦Œ|À3´{ľÀ3~þãdÀ2‡‘à”]ŸÀ1ïµXÒäEÀ1Vë4»fÚÀ0½5n\òÀ0"–-~ üÀ/§åÂÀ-ÕIˆUíNÀ,š¯«þ(„À+^WÆܵÀ* H/daÀ(à†îT†·À'Ÿ{ ?fÀ&\ üáœÀ%c(£˜¤À#Ñ&f\·À"‰^R}RÀ!@¯%ÂÀê¤êqÆÀRB”ó“ À·kT}#À5:Ëë«Àx´’ýÓÀÕª§¼Ê À0.ƒœÚ)À ¯›uYÌÀ¼}À¤bÀcù|ÅT¿ö¬9'µ¿æ› Ÿ—Û­¿ ¡UJÞã?ä”îÅŃ?õ „ñLÍ–?ÿü­4 ò¶@o>§»Ò@ â½ñN@,MbnN@èL!Û@¥<‚J'ä@bÿßx¯P@!wÑ.ñ@à‚ÆæÒP@ P½ãÎ@!¯ì×9Â@#ò‘êR@$p=kò@%Ð×z0@'0q“M@(×&oÈÏ@)ïtX ™@+ṄCë@,­Ð·’”@. qåy@/jž)*~y@0d$Q&Ø(@1°¬’î…@1Àìª1ä@2nÐè$úÄ@3V{Q4@3Éu$Kác@4v&ð1ƒF@5"dš"3@5Î'_ ì€@6yhžñÔÉ@7$!âD@7ÎLد`@8wã\¸È@9 ßsÏ–@9É;Lø]h@:pñH”µà@;ûòeÚ@;¾VØõí@Pu©Í°Ï@>óaF@?”æá­'^@@ôžéÀ @@k ÜÍøK@@º·e\Db@A õŒ'…g@AXĽYTò@A§#}„Ü@AõinD@BBŠ5Ì6ƒ@B®ý`@Bܸ·ŽÉ@C(9M­…Ê@CsÛ0¢ @C¿tÉq @D ¶kËwª@DSí¶ãh”@Dª½ …O@Dæìûù­^@E/´Πx@EwÿreñÓ@E¿Ïè(A@F"~Ø@FMù½‹È(@F”T«±¹@FÚ3EeY@G•—g«€@Gd{½ÌîLÀ4 “S…À3uuï]8‘À2àk¾m‘ÂÀ2Jv=S2À1³——°mÀ1Ð~9­À0ƒ#0ÅhàÀ/Ó%>¹¼À.žAbžÀ-gŸÒ'Q¤À,/EñRžäÀ*õ9<ÁÀ)¹€˜XïSÀ(|!¸íŒ–À'=#»F«0À%üÙ<‹1À$ºg¬*cÀ#v¹,ôPÀ"1гßJnÀ êäø9‰ ÀE¢£ý’À²°Ü{@xÀ ÇÒ¸?À„Á9ï®óÀéì?ÔQ]ÀL ˜&bÀYé_OÌ,À ÿ:’ƒÀͲ;²M¿ÿf;i¿ôag¨Ðàd¿ãqü ¸?®ßhœ‰‡[?ç[ñ§:a?öjwê§›@–§{èòŸ@úЖ,Y@ a~1ûš@e;8pü”@¿`øà9@Ñ-õüÂ@ˆi S@@R‚${@øËòµ§@ XÛh™ªn@!µz5в2@#2ù™Â@$nöEÕeN@%Ë´§æõr@'(^¯ mÓ@(„äñ2¬@)á8V‡¾@+=H» %@,™¼Ê0Þ@-ôeô9(û@/OTaÚLZ@0Tâ’Yp@1ÓJÆ4%@1®vu5@2ZĶàFL@3¶¯¯X)@3²E„ìVj@4]j_ì'†@5Š iG@5²[nÒBš@6\œÅ/ä@7UÇÁF@7®ÊTx@8V'¥‘!@8ý²…|q÷@9¤¡¾ü£@:JïÒvzÎ@:ð—lkû€@;•“fG,ß@<9ÞÇ%A@<ÝtÄ:Ø@=€PÁCzÃ@>"nQÉJT@>ÃÉ81¹Ø@?d]f¯!ø@@™Ýd@@Q‘)»t @@ ¥òr›@@ïP29Ù¹@A=ŽY8 v@A‹^ïÛ8@AØÀ’À¨@B%±úMí@Br1òšèS@B¾?_[¥@C Ù9Rñ¤@CTþàÍÉ@CŸ®Š¼ËŒ@Céèañ…@D3«b‰›@D|öò^Ú@DÅʇiÍ@E%«è²»@EVüûE@Eq*#c«@Eä`ôÆæV@F*×/­ùý@FpÓ¾€W@F¶V•?ém@Fû_·Åð@G?ï9;,øÀ3Ê‹·qåÀ37Y@rcûÀ2£?‡ ]À2@UÂUÀ1x\‚ÜúuÀ0á–¶ÞPÀ0IðªK~À/b٠ͺÀ.0>A[JÀ,û¦ìÀìÀ+ŇqDv¿À*À]¾ŠÀ)TX$éØ À(Tʬ ‚À&ܽ4¾ˆ˜À%ž˜‚ÜÕ”À$^î0…ºÀ#Æò˸À!Û(bä;’À —¨?ƒÀ£]šÿ8ÀÊ)ë_OÀ…”3²k]ÀòÏžMköÀ]ü™ÀÅí‹I½ýÀWöZõòíÀ  Ñ¯‚¿Àã¼…οýD»RøýÇ¿ò» UN‘&¿àVH%öm?Ãbž•AH¬@?4›4)Z[@?Ó/¡=ú©@@8}›gC„@@†ýAÍb@@Õ(=@A"éî9@AplOðá@A¼ß¯àè@B I3³Sc@BUD¾¬Ý@B ÐŠÌä@BëëÕN¶@C6”àI'@C€Ë›U@CÊŽùKŽo@DÞE @D\¸ß+z¢@D¥8j(›@Dí Öc;@E4‡PŠã@E{ŠP;ùv@EÂ@T@F+ÜUyÝ@FMʳ_@F’ñŒÌ@F× ò’†*@GÙ¦tHÙÀ3Œg‘x£oÀ2úÂ4 À2fôºÔüÀ1ÒéeÀ1=ÿa^nÀ0¨8ä]À0—–TÀ.ô;C`qÍÀ-Ú²…µâÀ,‘Ru&±³À+]gÛçpKÀ*'àÆCðÀ(ðˆÀx~À'¸"U ýÀ&}Ü㸻À%B!>æË±À$ë%À"ÆAp¨êÀ!†,-rç1À D³Âb²ªÀÁÕgùÀ{yp½G0Àð¡%ësÀcLh‹xÆÀÓW<;ÀA~®¤lãÀ Z_™Fï˜À-qS:ÜÀü_ªÏÌO¿ûޱÊgà›¿ñÆÍ;¿Ú‘T¾|ol?ÎÙ°N.p?ìÂGþùG?øí íïI^@¿E©(,[@ ™éŒ@ XK$6<@ÔÁ‡²?@|øsoòÎ@&ºÁ*Š@Ñ=€Ò¡@|dMŸ’@(gÛ–@ jÄ"Èf@!ÀI)¯Àé@#”ûäSd@$lê¶9ä@%Ã;ÑWâ@'yÆKa†@(o–¢cF@)Å‚IGï‡@+/úH›Ê@,pÔ÷iD@-Å–G¡È@/33@07,K+œz@0àüuž›Ý@1Šƒ?-"@23¹ãÖæc@2Ü™¸–@3…)±>¾@4-:Â-§é@4Ôï(8@5|3 Üà-@6#’E>@6ÉQ‚äºî@7o ÆK¸@8f±;DŠ@8¹±=…@9]E¸@.‹@:Óˆ'|‹@:£Ä (©(@;FT‘Ü @;繡z8—@<ˆµYZ5 @=)Œ€8@=Ș~·Æü@>gw“!ÈC@?š`ì1F@?¢ý);ÎÙ@@Î,¥X{@@mºE2õ@@»A@ëÑW@Aa˜_Æ@AUÙèµ@A¡h©Šæ'@AíLÀÀ,€@B8ÄîEÉ@BƒÐÚd@BÎm0uÂ@C›I°¬ç@CbY„ù@C«§á³Ä@CôƒA¨ªõ@D<íhÆÖ@D„ä÷X´‡@DÌimÂ…@Ez^B¯@EZl„ƒh@E @M/‰@EåôÅrZÅ@F+4ª‘æÊ@Foÿánü4@F´V^ê@Fø8#,ÛÀ3O Ô±c(À2½Àbþ³oÀ2+ƒO_ÚôÀ1˜k&Sp~À1yšyËÀ0o°…4º À/´#ÎfÀ.‡?ÒÀÔ À-X¹¹.]‚À,(–uÏbÎÀ*öÛO*^À)ÃßܹÀ(Ž´ùwwÀ'XT,Þ3hÀ& tþöÀ$çÀØtÀ#¬SeóÙÀ"p Fïy…À!2‹L¦¿Àç9g©þBÀfº ÊÎÀãªr†ÏŽÀ^ÜcÃsÀÖ$_Ð@˜ÀKÔ¤TåýÀ¿Aìå‰iÀ a)2<1À?O£ÈÀ– ˜tÏ¿ùà ÂË!+¿ï ,8áÞ¿Ô©I#!7?Õ[ãô- ?ïdlDXé?ú&ó¢Xí@O¿ •.F@Ž÷qðK@ Ð|Þ㲌@ 'ˆ.@¬Í3à™@Pc¥q2@ô³Ú '@™£Ñxw_@?;¡i@ ry¦¹c@!ÅŒS”È¡@#·Bf’Ì@$këÍù·@%¿Ý?›M@'9X†ì–@(e6-ÃÏ›@)¸TÔ*Ã@+ •Ó¼py@,\ÜÂÙöÐ@-®ËQÈ5@/SDzèJ@0(´Gm™@0Ðþ~ûp@1y¯sÙê@2 µyµ+s@2ÈûzÐ@3oч²Œ@4À²Ôδ@4»þr*#;@5aÎÿ¤³ï@6,j(Ïn@6¬à¿ì@7Pv³áƒ”@7ôXV¦gR@8—°_æ4$@9:y‹>ˆ9@9Ü®ºÍ3@:~Jôu¼@;Ih¿¤™@;¿¥o,Nw@<_Z‡5÷@<þdYÊDX@=œ¾¹Z²@>:e¢1Âè@>×U:³!œ@?s‰Ó‡+à@@óÙ<ü@@TÚLý@@¡Ñ ú$C@@îe(Ôzí@A:“7Ï:y@A†Zt»ºm@Aѹ› 7Ú@B¯{q@Bg:øÇ=q@B±[ ÅR¬@BûÃ/X@CDU;²?@C-©(ÍK@CÕ—QI/@D‘ŒI¿@DeÄG@D¬5v 0´@DòÞ.aˆ@E9‹ìgo@E~Û=¥®œ@EÄ/¢ê;@F ©ªL¼@FM€ÂU¦@F‘}$À·¾@FÕàØV«À3±£Ô¥À2‚8BÄz–À1ðçXŸùÀ1^Àt÷~ÁÀ0ËÅMµ]À07÷»Ù1¶À/F³„GV~À.Ûô`—À,ïj´Ù=À+Ágb>_À*‘ÖR,…}À)`½MM¦À(.!|%jÃÀ&ú À–»ÈÀ%Ä|]åÜÀ$€$Ó àÀ#U7›¢]À"X ÇÀ à;_Ú9;ÀGœ¾”ÀÌ2wŠÌàÀNIµ7m¨ÀÍô[;ÄÀKE5ÊÀÆNò`(ëÀ?%ä³êqÀ k¼wiúÀUÃÓQWÀ:Ž—ú¨¿ø8Ò=o¤¿ëé¾½x¿ÍSmÀÉzS?Ú™¥„¹ý?ðýFdpf?ûYÈm~@ÝÅÕÌO@c¡‡@ F¢ÛÕË@?Þ/Â@ÛÐv\ƒÜ@yTåÇÞ @ŽžÌ8_@¶bÞ[j@U¶³¶íó@ z·„'å@!ʸSصO@#Ð#Ï`Ã@$jñH-@%»ÓVˆ@' Ó¤!b@([åiÙø@)ªÁ¨}FW@*úD‹°°@,IO?{@-˜cɰJ@.æåg÷š@0{\FÓ@0ÁESX8@1gÊ"ƒGB@2f_€ð@2³êÑs’@3Yz-ªþŠ@3þ«]óÊö@4£x_ÁCü@5GÛL„@5ëÎ[^3@6KàäíÀ@72NSv º@7ÔÐIIÕ¯@8vÌ{Ž @9=ħ‰¾@9¹%ù¿@:YkÃÚïo@:ùèÈܬ@;˜4už@<6¦±á2†@<Ôr¬ÖYý@=q“ÝXBf@>Rx2ü@>©ÆC²Gù@?DÐË’@?ß C„„Ø@@äÀª}Œh„÷À4À·‰\À»DyÞÓ;À@Zµ™¼Àœ™ÆR&ÀBìþÐG À‚3¿ò À zn=ZâgÀn²He\!À_)»Îä¿ö—þäÔêR¿èÕ|ù³{“¿Á·^†ïN?à<œùô?òCàjLN?üˆa.Ž 4@imépÊ“@‘±2°@ ºÍÈxÿt@sFjRÁb@ RsW+@¡– Ä2Ù@9ÒËK@Ò¥“(&O@kô9óÍf@ ‚Ò9ùK@!ÏÍé €@#ßío]Ó@$iûdÓõ@%·ÙfÔ@'1+•T@(PýňS@)¸]P1"@*ê9Ì,‘@,6tölC'@-‚\ÔÆðù@.ÍäxØ@0 †ryL@0±ÏÇ@1VÝ.Êî÷@1û¡ˆØ}@2 mþ Ç@3D4B­à@3ç÷™ñù@4‹Yšz@5.T…ªÈH@5Ðâ¸öΗ@6rþ¯!°¨@7£p³å@7µÊhÈÊ@8Vo¾¹&S@8öþr)ú@9– E¨nú@:5!ÕcÏ^@:ÓŽºW{@;q`‡w'§@<”â­[ö@<«&ù7!!@=GÆ!0)@=âTkû@>|è0CâZ@?Ê…MÚ>@?¯ø­ôn@@$6°¦ç@@pÄNu@@»‘Ã^@A¯Eä{L@AQjù©W„@A›ÃžŽ£o@Aå¸Þ:@B/GѬÂ@BxoÓ^i@BÁ19üQ@C Šmes@CQzRËÞ@C™ 4C@Cà à<@D&ÍýDžº@DmZ_D@D²ì¥_=Ì@DøYtU@E=YkÉË_@Eì?ã×ì@EƳ·/c@F ɘá8]@FMÏ#{@FðCý2"À2œCOù ìÀ2 ”&)#À1~8«À0íÎI¶JÀ0\º‹“ïÀ/•¼ÄJ¦À.pw>ø„òÀ-I¨ÏV cÀ,!VÀþÚÀ*÷ƒ¼YéËÀ)Ì7l)À(Ÿu…èJYÀ'qDÁÂßÀ&AªÐ6¥À%®è¸[À#ÞTòí·ÅÀ"ª¦Š®¹ùÀ!u©û­žÀ ?fÃ$|ÀÉQ¤=ÀžWy¼”ÈÀ*ˆ³ôz+À´nC/À<÷ù6ÀÁž.µÊ\ÀŠ—TkõÀ Œøq¸¢À‹úÂ/DÈ¿ÿ–½^Íí¿ôþ(Cžþ¿åÍþ* Õi¿©.ZûÈ?â´G@ÑZ?óƒj/o—+?ý²Tô!­@òÊYâ´@ Þ4ÁX@- §-˜¨@¦”u>Ð@7~ i@É,!$Þ@[…(&\[@îoäeƒ@ÒëÉ.t@ ŠÊY¸}@!ÔÍÊÒ«@#æét@$iÔ](Š@%³&¤ úd@&ý3uJ:Ã@(G"fEé@)æ KV@*ÚsWcµ@,#»ÐØ•@-l³dz}±@.µMTg@/ý}°æ¯¨@0¢›ÍH8@1F7ƒpÙo@1é‹ñkày@2Œ“!€y/@3/G3Cg@3Ñ¢] @4sží_kO@57LEIË@5¶eü‘@6W%Ï@6÷péà‰k@7—B½Yi@86–Mßó@8ÕeýËÇ@9s­¾&8È@:h°0@:®’Q¶9'@;K&E{ñX@;ç QJÌR@<‚|_V h@=6~x/3@=·J⌠2@>Pµä³ô¡@>ét0G@?ã^B@@ n' 3@@WÀ²eë@@¢µTQã@@íLt[Ec@A7„)øX@A[7äʾ@AÊÐsRìµ@BâþyŒ@B\‘"¿4@B¤Ú›ÓM”@Bì¾L&So@C4;bQ@C{QªS@CÁþÐ-@DCÙœW%@DN¬—@D“‘É rA@DØ™Áí@E75ÖÂ6@EaiÕRÖº@E¥1]Ç€p@Eè›8@F+~gxÅ@Fn©Ê jÀ2b9SñYsÀ1ÔmL‡­eÀ1EØ1;,À0¶{™¹ºÀ0&Y@¦ çÀ/*æ’À.•·>öìÀ,âÅß8rÀ+¼{.5 À*”¹öܲAÀ)k‡Îë ·À(@éì)ÊÀ'åö¸œÙÀ%çßÇB­@3»¨»Â“@4\ECL›c@4ü€bËÿS@5œTÁB„ @6;½ xWÊ@=ŒäÝ_v@>%*s(]Ì@>¼Çds`@?S¸Ýöch@?éû;j*@@?ÅÏŠ/å@@Š3”n^T@@ÔE«#@AúnÄ^Í@AgPý*Ýý@A°H!©”@AøÞ—ó@BAxú1C@BˆåÕ !É@BÐTÁ¥Fi@C_l…UU@C^ ¥þ@C¤EôZ”@C꤬ª@D/‘Z$®f@Dtœ§:ÏÞ@D¹@¶w@@Dý{JÎøœ@EAMèD8‚@E„·ªAù@EǸVáZ@F OÃÜ@FL}Т À2(ñ*‰RüÀ1œôXž À1X9z6&À0æ“æóÀ/ág|BCuÀ.Áƒ'EÙ7À- $"‡>sÀ,}N«&PÿÀ+YBVˆðÀ*3R­ëh}À) 5øÍߢÀ'ã¶sYdÀ&¹Ù³ aÀ%Ž¥•”¯LÀ$b ;ÊJÀ#4P çÀ";µz[NÀ Ôê*°a&ÀFÅFÖOÀáY8 ÁÀyŸ©c®À¨¡CŸÞÀ£„ªY” À5DÑt`ÀÄú£-½ À ¥pR–CÀ½Ï·%ÛÀÑ)´$Y¿ûÃi»wŽ˜¿ñÝÒýO¿ßÇv…Ò”²?À”ÁëÆ?çï©Ø­R?õôèÕ?HF?ÿ÷N”¾°@þèâàÆù@ z4ů@ 7ã@ ³Ï`¾Î@3–åbê@llbž@@F£5ò@$ªb”ê@¬«ð‘@ šW0¿4¢@!Þ&bîL@#"Û’¥Q¸@$g0KŸ3@%«% X@&ïÁóþ">@(3æ‘‘ÓŽ@)wâÞò£½@*»ªÈ[ÇŽ@+ÿ2HwB¶@-Bmk¢R:@.…PS& )@/ÇÏ8bý@0„ï7óœ_@1%¹6@`à@1Æ?á’þ@2f}”tù[@3l¿Ò\@3¦ç`3U@4EI¥aÜ>@4ä,«e;î@5‚«Ãr¤Œ@6 ÁÑ,dH@6¾iÒß0—@7[žâ‚ʤ@7ø\6ªá@8”#eAÕ@90] µ@9Ë—¯ÙÙ@:fHjÞ(@;k«ù@;™ü¢p†@<2÷Ø_5Ô@<ËYhïv~@=c«\¸Õ@=úA£Â@>ÀPe‘@?&˜à @?»Å8ÂK@@("hB”6@@r oã[@@»˜ æ°@AË{|x?ž@7Ùô”…Î @8tô—Âq@9w&‚•@9©w­ŸUø@:Bò5³Öä@:Ûâ‘ iº@;tDÉ,½ @< %c×@<£OŠÅ©–@=9ðÆÊ•@=Ïõ@!È÷@>eY¤]³@>ú¿§¢\@?Ž5€ßf@@Ó{‡²ÿ@@Z6*–«Ä@@£Aw)Ún@@ëôÃî¦@A4Lã›^@A|Jª‚•õ@AÃì\Ê€p@B 0÷³ü@BR†b@B˜Ÿ'z0*@BÞÇ#´è@C$Ža¼é@Ciôƒ O@C®øÅñr½@Cóš”Pù @D7Ùf +Š@D{´Ã·Óƒ@D¿,@…¼s@E?Á(@EDî1œê€@E‡8xdì@EÉïü.@F œœ èRÀ1¸’[МÀ1-gÔ£@8À0¡Š²9À0á=À/qq'4À-òñŠó+À,ÕimƒýöÀ+¶|I,AÀ*–.ˆÁÀ)t„ê;n¹À(Q„OF6À'-1íNò7À&“5ÍÎÀ$à­Û!0ÚÀ#¸‡ÐŠKØÀ"'JEÀ!d’¼AÏ À 8ÐÛìøÀÑ;G©À»Âjhå#À]„*øÌÀý%Úk°hÀš·UÌ}åÀ6Hî(,ÀŸÖÕ_VÀ Ï` =Q—ÀûPÖIÀ#Íc¶ïÇ¿ø‘õrJ1¿í«ú +B¿ÔOþF¾¿™?ÒÎÔq³"?í¡B+[q?øS‡è¡¸@ú‰£u0@«§‹f„@ òi’ ¤@ä 6pïÁ@k¯‚Gsä@æ}%Â&@a>W¨@Üõ­rw†@Y.õ3Ç@ÕÓ€þ"H@ ©fC}D@!è“jÿ@#&°7ê:P@$ef³tèŒ@%¤†m`@&â½2/ê†@(!F<#Ö*@)_©0Éݲ@*Ú¦Åïü@+ÛÏAâjê@-{¶ ÙB@.VÔÊs¡è@1¤ lñÍ@2A–±Jy@2ÞÖ 6ñs@3{Åò&du@4aA4åõ@4´¢ðÊÞ<@5P† ´¨@5ì¼-Í@6‡8ÙÝé@7!ÇÙ»C+@7¼ Éà@8UÄd‘)@8ï æbä@9‡Ø&!å2@: 7ˆ»u@:·á²Ë@;O´(ôP@;åÁw±U¸@<{ØWãѽ@=YÎî]á@=¦BvËE @>: ~Eà@>ÎO¬§Õ×À!ñår¹ÀØÛ+Ê3ØÀƒ•x¶ì‘À, ŒFâÀÒ‰}„edÀvàÞnÀ5³†EÀ¹—ôA60À°0 ½"À é“*úÀjï1ËÀQë}[þ¿÷f¿NÑ¢¿êµó^Ø¿Íjוñê9?Ø¢€›³E?ï{ÛYϘ·?ù{$Õ7n˜@ž~¿íÞë@’õWNu@ f¥ž¨[@&Æg {@›…!@_`Ö¢@…ɼã6ñ@6l¶y´~@7€±1—§@7ž~? @87 …©`@8ÏÉKçA@9fµ`³ú7@9ýÎÅwϺ@:”e Üœû@;*te7(@;¿ù aÑr@\&°ßp@>¢øŒSÔ@?4ö«ÅË*@?ÆSªß“Ý@@+†g`–Ð@@s½è½@@»DšÔ¶O@A£Ï„í\@AI¬<Ô’o@A\Ó1s@AÖ´‘¦ç{@B²‡m“k@BbUÒ„¨@B§ž4æ@Bì‰'$ê@C1¶c“@CuH¤8ƒø@C¹V£$V@CüAŒJ$@D?£ær|Ÿ@D‚XÔ)p¢@DÄ­¦—5ß@E¢oP@EH5¨ëõè@E‰hO…­ƒ@EÊ9Ç©}NÀ1Kt)é¿À0Á[öwÀ07lË_+IÀ/Y.¼Ù—À.B#›¢µûÀ-)»ÞncrÀ,ûküpÀ*ôæbVtqÀ)Ø wAÀ(ºÐ=f`•À'›Ø šÀ&{Ÿ½J$À%Z)AÄc~À$7|{öÃèÀ#ž“Y7À!¨À Èg™à7øÀB6|˜›ÀñnSK”XÀž„“zÄéÀI‡ŒUîìÀò…ÿóÀ™DfÐÀ>²†¾Î_À Ä/t‘À «e˜…ÀFºaš¡¿ÿ8Ê”ô4¿õx·˜[•_¿çÊqNaÚ¿Â`+<ˆåœ?ÝJ]d!Û3?ðöQIöÐ?úžÛ±ï$G@%óµ.?@þ’‚ôyÓ@ Ù!ëæü@Z¼Ží@è@É·j60s@9l±kèÎ@©Ç_Aº@²CyJ÷@Œ €*2@ýã@jß@ ·ÿ+Æ+C@!ñ)ÖÜ¿@#*fÈãná@$c«$”h[@%œì ¾{c@&Ö?Æ@(8ü~@)H-bR(@*€óö4¨@+¹€ýÀF @,ñÉÈÍø@.)ø™Ò@/adBo~Ë@0LPy ]Ž@0ç·¶–ho@1‚â¹ÿUÛ@2ÌrËTs@2¸oà¡D@3RÈ‚ÚY@3ìÐ1â¾@4†ƒo² j@5Ýgª[@5¸ØñÙ@6QqJ eä@6風 ¯@7hÞÔö•@8¿‚¥’@8¯¡p#”@9F ÇW@9Ûú1;…W@:qhØ[<è@;TÍ‘ @;š¸\@<.‘’|}@<ÁÜîd@=T—û†I@=æ¼Çò©ž@>xJþŒBK@? >ÊV+ @?™•[öâ[@@¦œË@@\0 5þ@@£g¯Q}Ç@@êK¤}YÔ@A0ÚØn@Aw<„H@A¼öÒù…ç@B«SL@BG³ã÷Œ‚@BŒŒ©±J@BÑ 7ƒëÊ@C.Ö~æž@CXöÝŒeï@Cœb±<þå@CßqÃo @D"#“»¥@Ddw­ì@D¦m« P(@Dè0sª~@E)=ïÁÙ‰@Ej¦|t¾@Eª’Ø)À18ñvSšÀ0Œ¤¢þÀ0_É ™¥À.òÛ)ãC›À-Ýžm§fLÀ,Ç C§pÀ+¯*Í1ŠˆÀ*•ûàöÞÀ){„‘…5^À(_Éj‡.åÀ'BÏ1š½?À&$šæw§úÀ%1ÄÀ#ä™;DpuÀ"ÂÖý[Þ£À!ŸðñBÓñÀ {í8Œÿ…À­¤\DØÀaLÊŠ^ÀáT"uÀÂoÿKXEÀp@i3vÀµ÷>ÞÀÅ‹n¡ÁÀ Û.¯C¾À'Ó“öÍ$Àq&€>D:¿ýn’SQ¡¿óô¼7¢ý¿äê ¨Š.Ô¿­úÞW'³?á5N]ÈŒK?ò*Ü[ií?û¾G±kk@«i÷×Î@y¸Ö.1@ IëÕ ¥Å@í(` e@÷® äQÑ@b$Rs²Û@Í;€Z °@8Þù»óJ@¤ùýœžá@w¬ú¨©@ ¿!‡þï»@!õ£š]n@#,7Znë@$bÒ]§@%™jré@&Ïó¸EV@(dï4…™@)<³.-P@*rÓÈ7Õ)@+¨¼uÿH‚@,ÞbÂD V@.¼Wk³Ï@/H¾ó¹@0>°4 úô@0ØËQ9f_@1r«Ó«öþ@2 L̽@2¥©]4«‰@3>¼¶t»—@3ׂ†íb@4oôâ–5@5s–Z @5ŸÐMÓÇj@6703“î@6Î+@["¨@7d½Ã D@7úãdºa\@8˜Žˆ¿@9%×âºo@9ºží: ¢@:NétW!š@:â³Ñ(©@;uúxè@<¹øÞpö@<šîÿ³VÜ@=,–T¿ôM@=½¬ÜÌRn@>N/™\þB@>Þ¨ÚÑ@?mnF®»Ž@?ü$ËR÷@@EV, z@@‹Ù¾0‘@@ÒCu‡q@AZbx=Å@A^y«¾@A£‹¾Š@Aè¤@ÛHÉ@B-f!8j&@BqÐŒU’@Bµâ½#nü@Bù›ü5À@C<ûŸ¯@C€ o@C«­,XÂ@DûíN1@DFî›x‘¸@Dˆ†ø3@DÉÀé¼™:@E žñýœ^@EKÙ™÷½@E‹CeÕD½À0à?M>¬À0X\`Xl?À/ŸëɯÞþÀ.ÊÏXSVÀ-zY=9KGÀ,ešµ4ä»À+O“õÓ¥À*8F]TûeÀ)¸ä®I=À(ï%$ À&êíÕÐ =À%ιåá“À$±X|§ò~À#’ÎùˆxÀ"s"óß”¢À!RZ:ÌeœÀ 0zÔæ*ÖÀÿ¶QäÀÓ"_ñ À‰(5®)À=4ý –{ÀïW"TDƒÀŸˆ£wÀNêíÿvÀ õ¡¼øÊ+ÀK»kA Àž™–¯]¿ûÜ·SGºÇ¿òvIwÖg¿âZý}<‡?™Õ¾ ãkI?ã»ùTè1Â?óY{;Äæñ?üÙ‰,rûO@.íôMc‹@óìŸg@ ¹7˜6%@À^×E›@$øBIÊb@ŠBó„]½@ð*8ÇR@VšëU@½~0ü*@$Â2$1Ã@ Æ(òHtf@!ú [Bú$@#.1ƒ@$aüÈø ž@%•õ;»bÁ@&ÉàqA´@'ý³.mâ¢@)1d(ð•º@*dè׬s=@+˜7L è@,ËD­îuj@-þ§œ[ü@/0uþ³‡ž@01Bå£ÅT@0Êž;á@1b±MWFO@1û$ô{@2“(eçÃv@3*û`ê¢\@3‚w¬œ@4Y¹ @4ðšØæ‡,@5‡#CÐB@6N ÑÇö@6³÷ÙÆ®@7HyÞø¶ê@7Ýr³Ëf@8qý|¥‹±@9\6H@9™¹‹…Ì@:,ã[ÝPÆ@:¿:Ôjl@;Q¼®|V*@;ãeWæO@$¢`{€H@>³‰>7”®@?AÚV+I2@?Ï“ zñ @@.Xl­á@@t˜®…Z-@@º‰%èÓ@A(»íÕ´@AEvg–ƒú@AŠq-µÌE@AÏ Û5`@Bja6+=@BWgv,s@B› §NÔ@BÞ\ý Ot@C!T¿ïbV@Ccô8~ö›@C¦:Õ“£^@Cè(‚q‡@D)»væ¶"@Djô–j¯ð@D«ÓŽâ@DìVjê=@E,~ÌxYÉ@ElK†L…$À0«—)Ç\åÀ0$´÷×”À/:UßuªKÀ.)õV”ÝgÀ-K¼ÝWÇÀ,\®»Œ0À*ñ+ý¡kàÀ)Û½°aŽÀ(Åz4ùÀ'­9iOvvÀ&”,ŠS׉À%yôE­±À$^•®o¢éÀ#B¿ŒÀ"$zíøe¼À!Éû„¸ŸÀÌKsÜãÀŠ}2; ÀFájAUÀKAFuØÀ¹É$ªe7Àphš¹^À%7æ/Y­À°‹W×xÀ AÞXeÀr²%rÜÀÎû¥ò!©¿úP}¤*¿ðý7]f¿Þ‘¤T,h¡?»š˜XS­o?æ9v Þg´?ô„„ØÊq?ýð¿SN]Ó@°âkí@j±@x¢ú@ &›yQˆ@òêÿ5ç@Q›¾‚u@±Í³˜F@—zgI@sæ¶£ÿ@Õ§%Êé@7Åß=»@ Í7D°Ï@!þdÀN‰²@#/ÄHø¬@$a*OÓ–Ê@%’Qâ̵@&Ãã"2†â@'õ!Á·›`@)&?7ê]@*W1îÒ_@+‡îè„úŸ@,¸mcáæ8@-è£8Mõö@/†¬›ƒ—@0$ ¶áŒ@0»—úº÷@1Rñă@1ꔑKf@2€êòâ?Q@3ëÐó²@3­ÎþŸ@4CÍ»­î{@4ÙyÅd\¡@5nÎÑ B@7,š@­C2@7ÀiþuÁ(@8SÎ#¼@8æÃùÄâ@9yFº`›.@: S)kç=@:œåÅPÊ’@;-û&V2ø@;¾þPTø@‰ƒ¢XKZ@?Õ–´~„@?£’ÁZZn@@ÜT’aÐ@@]¢xcP@@£©wåª@@èCÔñGG@A-óÙš$@Aq¥ üeø@AµÛ4oPK@Aù¾‹xÙ@B=N@s^‹@B€‰Ž¬Žb@BÃo¾A††@C#÷Å@CH:!#ð@CŠ#) ´@C˨£ñÊ@D Ü)F£@DM·Cô @DŽ9‘~>Y@DÎb¹ë^¹@E2p‰ýŠ@EM¨s‚ΗÀ0w´›ÏbÀ/ãSžß”"À.Õõ³ò”‚À-ÇR§ëo›À,·mÞ`¢&À+¦JíÙûÀ*“í 0ïrÀ)€Yòâ À(k”NïÓÀ'U rïÒ-À&>ƒŸt{À%&BjÓ&À$ á×GŠ·À"òg9äóÀ!ÖסíKÀ º9 ÒÛÀ9">o¤ÀûËÛ¢;À¼{T L.À{={õGjÀ8ˆjˆÀó/r4œÀ¬z Î=[ÀȘb´¯À 3ø ÔÀœ¡0 áÀ8ÀaB>¿øÉºlÍÛ ¿ï»Ù˜d¿Ùu–\c÷?È:$‰ÐV®?è®s‡&Ž?õ«\¼á»Œ?ÿ7Ñð5@0_å1ê;@àÒÙÖÉ@ ’™³ÆÉ@#+Yöã@}›‡‚ëæ@ØÇ ,«@4‡­;@ÈY3DÎ@íwÏ)æÀ@J‚5¶CÚ@ Óê ‡Ç@"­8†Šª@#1€¶ëñÁ@$`ZÚ@×Ý@%1ãܪu@&½üÕ³Í@'쯵Wu@)C ÷½Å@*I¬o`.@+wâ7äzä@,¥ÚÐ7ðÍ@-ÓŒ¯?¸î@/î]Þ€@0û:=ê_@0­MÒã @1Cj\¶@1ÙLF?@2nïÐÞƒ@3NB®jÖ@3™e}©·@4.0l¶a@4ª˶Á‰@5VÐl,µ6@5ê0$ Û@6~ æûS@7\@7£ÆVeáŸ@86'Ì@8ÇÝšõ5W@9YCG7”5@9ê5”¥O®@:z±»ýD@; ²q+|X@;š6l6ã‹@<)9á ˜‚@<·¹Ä¨@=E³#{­@=Ó#%ƒ]@>` ÜÞ¶@>ì\4d“°@?x }ñ†@@¨ÕúL@@Fõ"JÈÈ@@‹ö¦ÿ@@Щ­ãþr@Aßx@AY%VÌöû@Aœëtb ^@Aà`—_@B#ƒî 5Ó@BfTµ#ž@B¨Ò4EGÜ@Bêû¿ïr”@C,諆¢@CnPŠúñ @C¯z¯*c @CðN©#;Ù@D0Ì:Æ{@DpòfÿxÖ@D°Ák` @Dð8Īåƒ@E/X.ëkÀ0Dkž«7À/~mä2À.rÃcûLgÀ-eÚèS2úÀ,W·Ð}FÕÀ+H]¬·ÀþÀ*7Ð>íd“À)&zýðüÀ(+†÷˜ À&ÿ»@ÛŠÀ%é뢲,¹À$ÓœúžÐ À#¼5²ÌaÀ"£ºíX‚`À!Š1þŒ3¾À o lœa¹À¨Þ®ƒYÀnôß|<ÅÀ3䈘ÀöòGŠÜÀ¸+¨é¿/ÀwžVy±ÄÀ5W¶~p4À âËŸ‘-ïÀ W® æÀÉtp´³À8;°ÉÑ¿÷HG‰|w¿ì5.IKa¿Óž˜U6@99¬%¿ß@9ɇqî@:Xîé•ð[@:çß=fž°@;vU>äÊ@<MØhD@<‘Æ Œ® @=ºör)<@=«)Éô ó@>7ÓÕ²|@>Âjyåá@?M7;Õj@?×s¯”î)@@0ŽÄa{Y@@uH¡µ:@@¹XVtİ@@ýJìT*`@A@ð×}@B *7£w@BLmÂé@BŽ‚b)§@BÐE–ŸÂ@C¶Û¶@CRÓDƒÇ@C“œ8ñˆ@CÔü o>@D0郣$@DSû˜îà@D“p­pª}@DÒÔµ’^@EXƾ˜èÀ0¸UÀáÀ/±¾þÀ.·F€²îÀ-†w.TeÀ+ù!ü˜JÇÀ*ë`WžøÀ)ÜÌ\vÀ(ÌâÙæß®À'»ÔôG ÓÀ&©¦öqZ@À%–]\X¼êÀ$üÒ°0EÀ#lŠ6ÝöÀ"V –Ø‹XÀ!>ƒ0þûeÀ %ùsÎÐÀåû qÀãë7éf À­—.jÀt\nàC¶À9ápl¬îÀýª§RGÆÀ¿Åw’¦©À 7ö- À~NH(Àùæ0ˆU¿þáàïA¶¿õËþâ·Ì¿éa|pn}@¿Ì‚ÿŒO?ÖSur•0®?í}rYð\‚?÷ìñ÷¤˜@¢ŸBÉA@*·Í”Ã3@ Ç–eİŸ@fàF¯@ƒ«ž÷@ÓÇÄiãÌ@%t‹q @vûÏĦ»@ÉVÊ•…@;dÂ@o3ã_lÞ@ áH¶ï·‚@" ;¿@#4çGµÌ@$^Ä Eíü@%ˆŸrò@&²mD-'Û@'Ü&7ôä@)ÀVLêá@*/2Ë;ì8@+XtUS·@,{Úûd@-ª@Q½"Æ@.Ò¸½Wt«@/úÜ38&f@0‘P@1%{+Ã@1¸xkVÆÚ@2K´uÛt@2Þ°_*€@3qgúX @4×(8y@4•ùÛ|20@5'Ì)`#@5¹Iëû®ƒ@6Jo‚ÅRð@6Û9E3@7k¢è쫞@7û©d.ßü@8‹HùWëø@9~1íZô@9©E¬ýP·@:7œÓ7@:Å~UDc@;Ré/¡ ¢@;ßÙ¨ƒx•@šjŽrˆ@>˜üÏ>†ï@?"ԛ͗X@?¬qú@@m„ER@@^‚™; @@¢Mí “Q@@å΀“Q†@A)aD±@Akë§ñ@A®†yxš¯@AðÓÓÏô@B2ІsÈ@Bt~Y$r=@BµÛ¸Ò@Böè"z¥@C7¢Ãó—@Cx PG£ã@C¸!4kÅ@C÷ãû@r*@D7S<&, @Dvn—µp@Dµ5¹Dú@Dó¨U˜4ÇÀ/¿.Ø9–À.¸«'÷SÀ-¯ÉêuØéÀ,¦Mì'šªÀ+›¥—YÎÀ*Ò¶fÀ)‚Ú²Á À(tÀÙšÔ˜À'e‰9ÔûÀ&U8[¬~À%CÑÍ4™]À$1[ zm•À#Ø‘KŽnÀ" O^§0UÀ óÄš9Þ€Àº{61½›À‹ÌØ.äÀZ¢^ ZÀ'î©Õ&ƒÀópÉ‚¹HÀ½5.q3¥À…H ¦[RÀK¸=JžÀ !"éò[µÀ§ÄçìÓÀ+pLý>¿ýX‡„4^À¿ôT¸µÐŒø¿æ—_8¡AI¿ÁíIX.?ÛTsì?ïØÆ=rõo?ùéóéè@¸2Û…@¥Z[8ýù@ 8º+6C'@͵÷ãÄ„@²ÝŸ!0@ýü„Äg@J}¸Úg@—‡çà@å …(Ñ:@2ðâ^è‚@,7g'£@ çÔÔøÀ1@"+¨P²W@#6‘›ŽÛ¦@$]ý±{Å@%…féØ4C@&¬ÄG~h@'Ô ÎZÃi@(û7‡„Z@*";‚Ù •@+IÙ Óp@,o«­’É@-–0¼ßÊ@.¼¡Žjú@/áÔO·cú@0ƒ›Nº €@1€²ÞÜ@1¨c„07©@2:r+–z@2ÌBV«@3]Ïð¬£p@3ïö—}F@4€rs†Ú@5Á~ÍÄ”@5¡Fâ @61#H´@6ÀÏšû‹@7P¾½—@7ß Š}£@8m”ú¹¹ú@8û¶¬p "@9‰mPDú@:µ¬jàZ@:£Œœ¡¦n@;/ï‰Ga@;»Úù9@U ‚@=\²Ý¿œ@=æ£`fåÏ@>p¸«Ž–@>øô­“Ñ@?Oè„*×@@•4ÏÄ@@H0%Þæ@@‹ˆžA•œ@@ΘäW@A]`æQQ@AS×Õ»ÿÆ@A–‡T~†@A×è§ëP @B}u*X:@BZÄ8UŽ@B›¼DÔŠå@BÜdúÇÁU@C½Ä2Ç¿@C\Æ2—5@Cœ}p’B @CÛã]¢×Ô@D÷rXj@DY¹Lºï½@D˜(–‹@DÖEøBÀ/\VDlÀ.V”q1è¿À-OôË{ À,H*&"gÀ+?9ÀÍL0À*5&“À))ô4‰ÿÀ(¦z¾ WÀ'AhÒÓcÀ&É/WÙèÀ$òB,aÍ…À#á°ë€K©À"Ð%§áiÀ!½‚Á ÍãÀ ©ïÐçºzÀ*Í*r%¿ÀÿØôÏVõÀÓ1ºâ®À¤xiÏìÀt#ẍ¸ÀB“uüÉÀm?«À²J§r…iÀ D¡òîÝÇÀÓûNÕUÀ`r?zï¿ûÔEÅeø¿òâSÈ&¿¬¿ãÖ‘ïüý¿­ì‚M1~?à"P@½ð'?ñhÉŸÙ?ú%š“»Ï@–4gX’@\X0ØÑ@ ¨\ÂPpÖ@3îž&@àx_»§n@' Ô¦ÍØ@o_Ê~Ýi@·¤<«@]úµ\@IxóYÌ™@’橜$¼@ îJc¦ì¼@"8ìÈ+Y@#861P~@$]9oËÐ@%‚9äU‰w@&§.Ìdëã@'ÌgÙ™ë@(ðÒû …é@*pÑ'24@+9à=K@,^FúÀ@-‚[rP@.¥ÁîÏ#€@/É!àŠ:ß@0veñ3@1g,{t@1˜…'ß @2)jDEõ@2ºz*ñ[@3JyÐq 4@3ÚœZûÙã@4jv<„"Ê@4ú§ú-@5‰@ÜÅ ¤@6*0J1@6¦¼¬0Ì@74òÒÓb@7ÂË ÀÉ@8PAˆÅ¡,@8ÝR»¢í@9iû{WT@9ö8žå¥@:‚¼Æ@; cÕy÷¨@;˜Kÿw§–@<"¼»ÔÈ @<¬³LVHQ@=6-äQ@=¿'_¹ù@>GŸÕ†Ï^@>Ï”–‘Ä@?W¡Ý“Í@?Ýæs ªÄ@@2 ,HÐ@@u¤P†@@·¥¨²@@ùüIOâÃ@A< ¥!Ñ<@A}ÌãÑU9@A¿E8Ós”@Bqâ±å@BAR*ó¿š@BåffÐ@BÂ*óç¤@C";÷ã@CAʵ,h@C#Ý(@T@CÀ-=2¶Å@CþæhGÕþ@D=Nûhhÿ@D{fVü°@D¹,þk¦ŽÀ.ù÷—¶€À-ö&T –„À,ñ.¾€nÀ+ëôVBÙÀ*ãÙ=üjaÀ)Û‚JošÀ(ҹøÀ'ÇŒòÕÀ&»öÆû nÀ%¯S¨%ë@À$¡§å3¯ÌÀ#’÷ù:TKÀ"ƒH‹%B"À!ržmŒ€ÏÀ `þž{ù›ÀœÜŽV*fÀuåwHÕ<ÀM"ôº~À" WyJÀöiC$³Àȉ¬öAÀ™ ÚqiÀпÎ74À jè=½/²ÀàˆµÐ÷À˜ýÚä¿úT÷”B./¿ñt¬‰mí¿áÒ/•‘n?–¦(*V’A?â’; l}ã?ò;éËrG?û2¿ÏÛÊ(@±?Ô—@•É…z¡^@ ‰Ê@˜ÏÔekW@>¿–AŒ@P¸³ßµA@“ÅPd„ý@×Sþ—d@T ‹W”@_´«…¼l@¤dýC@ ôª²&ý@"8pN-_@#9Õ3xX@$\wÈÜ6*@%¦Û)@&¡¬Dpüo@'Ä-éÐ@(摨šÌž@*Ñq£È@+*äžÉy@,LÀíTå2@-n_Ù–À@.¸s ðÑ@/°ÂzÒ¨@0hºÞë!ü@0øåax²@1ˆÛÌÜ{R@2›Η@2¨ x"Ì@37cÀ«oc@3ÆecŠŠ­@4U />e+@4ãl§ý@5q²ţ@5ÿ‚­™Â@6Œý’D¤@7¬ËÙ@7¦å–ÁØ$@83LYƒj@8¿O©ŠÆÙ@9Jíf/ä @9Ö"²²û@:`êËmŒ7@:ëDÊ@;u,\±å[@;þŸ•4›@<‡›ë^@=—I‘@=˜#,Ë™æ@>©ß:õ@>¦¯S.¯@?-1Cƒ@?³-~mø@@P÷[IÉ@@^ÆF˜ð@@ õ¶©df@@âÞ[³îõ@A$TÌu¬@Ae×Ëæß×@A¦æõÇvÚ@Aç¬ð`Ù@B(&jŒV]@BhUTV´Ê@B¨8.@BçÎb–^u@C'd[öõ@Cf±°_E@C¤¿Òh0Â@CãX) @D!-ÞCP†@D^î ‰U@Dœ^ˆ%3úÀ.˜õÒ^à²À-–ÄvÜé—À,“sÃy0À+¾Fª,À*‰|»mrÀ)‚ÞvMXÕÀ({-…:³µÀ'rm¨ìêçÀ&h¢Ì–YRÀ%]ÑïVÀ$Qü•4£À#E)ålžÀ"7]Š–À%À!(œDë [À êý0`ÉÀŒV§Àí™·× ÀÈÕFÌ"ÆÀ¢[Sô·Àz7IØSœÀPtá•øÀ% !•¹ZÀ ðЏ1îãÀ “â[VlÀ4`öæýÀÒ âÇì¿øÚz8û8¿ð ¡oYÖƒ¿Üß¿„`[|?ºîê¼5?äú4,}¸??ó]þ$ˆI?üBÒŽËÊ@•­ƒld©@ ­>¬gì@ ƒI“Z @ücE;Tü@;mc¿š$@yH!‰¶´@·±Î(H@öš>ÓŠ@5ñ+¸å@u¦4x½K@µ¨ç“ö@ úô`-õ @"*–¾^¦@#;nÉûÞì@$[¸©]Õ@%{ÿã x•@&œ<&ôq@'¼e#eïN@(ÜrxQ%@)ü\(¢È@+®ûç@,;¢ð"µu@-ZïÃöR@.yøR>•@/˜³Å¿º8@0[u%@0ê’ʧñ@1yeöÞó÷@2~*6@2–f]"«@3$‹øwP@3²p.ñ݃@4@Q|%@4Íe¿!ç"@5Zoå³ÀU@5ç*Bb-V@6s‘bS @6ÿ¡ã/Až@7‹Xs¨2P@8±Óö‘]@8¡ªÖP¢Ó@9,@_Xí‰@9¶of„ð@:@4ö{ÝÇ@:ÉŽ-m]’@;Rx=`Mè@;Úðly”@~C^Þ«[@?Û‹˜.@?ˆñ—Sg@@ÀÞ¢D@@HÅÙ%¥Õ@@І~˶g@@Ìæ%ªÐ@A 70X¸@AN%‰×µ@AŽÌ&ta=@AÏ*IØS@B?;ÞÌ@BO SôED@BŽŠð§d@BÍÀ{UºT@C ªgMnž@CKH1®Uu@C‰™aIP@Cdž|¡@DT;ªÕ@DB½"ÿÈ@D×ç°žÀ.8ü¤ª>À-8h,ù#À,6ºm-…™À+3õØÌ-À*0©nbÀ)+5DOâÀ(%@6¾š«À'B6r–;À&?"úäÀ% ;^_À$: 8ZÊÀ"ø@‘‚À!ìS‚úæÀ ßvW8ÈÀ£^,4<^À†«—ÆÄÀfêuWÂÀF!æüùÀ#ž–UgÀÿƒo¢‰ÀÙÒí~‰`À²š5ìšÀ É(šš4À¿}{ô™6Àhjf™Æ"À©®ÛEµ¿÷d«>ù0x¿íN$èíN¿×’ùµš?ÇÄ1 11?çZsð›íª?ô|lÎl–!?ýOvóêA˜@Æ»@€~ZAe@ î¨|ä°g@/Y$%@hŒîÅ¥@¡RñÙàb@Û(«o4)@yôãNþ@P6ïR¿«@‹O¥ ¡œ@Æ´ â¶m@!*ÉBŒ@"À‘Sz@#=*çØ@$Zûÿž@%xòM„±»@&–Ýìe›n@'´¶ÂÏõd@(Òt»å@@)ðÈ€’p@+ àìôn@,*½•Ä@-G¿E°¦Ó@.d~¶êÔ§@/€óB2@0NŠí3± @0Üob)@1j"6Gh>@1÷ ·B}[@2„æÊíß@3ð¾»@3žºë´(6@4+Aº£¯â@4·ŸiÒŠ@5CwÌz@5ÏÄW¿@6Zu6íÚ²@6åw%P'@7p!P °Ú@7úpŠÝ6a@8„a·QÔå@9 ñËñÅ@9—ÍS@:â×4´@:¨>À¼‚@;0,ÈLgt@;·¬AÇÓB@<>¹èÄ‹@<ÅS7¬Yô@=Ku¼ð²™@=Ñ2Óh@>VM d³B@>ÚýRâàÑ@?_-ׇuf@?âÜ‹¶BX@@3¼12\@@tV]†µ¢@@µeBà @@ö/á@A6´pØ•:@Avó‰_@A¶êÚFDK@AöšïÊêÛ@B6´Å¬:@Bu!ˆÁ*±@B³öÕ ¨¼@Bò‚ œ@ó@C0«ö @Cn¸9 Éì@C¬bCÇ®@CéÀbs‰@D&Ò8¹i,@Dc—py©À-Ú©!cÀ,Û ø7FÀ+ÚþXpÀ*ÙàÕÃÆ£À)×µ¥ì{›À(Ô€$vV¬À'ÐCÔóÎzÀ&Ëb­I×À%ÄÅ ®åCÀ$½‹‰Ê]ÍÀ#µZ@ŒÆÂÀ"¬6'³À!¢#gMƒõÀ —&â|ÀŠ~©ÄÆÀýÌH–ýÀáÌÇi;BÀÄæÖŸ©¸À¦_«œ#éÀ†BB"…áÀd™ÞäÑaÀAr@ÛSÀ 9­EÂ%XÀí§h€öFÀžë:#ì?¿þ›#æ,ož¿õój–Kµ.¿ê½Ö¦¼¿ÒVØëÛ#?Ðdü1j?é³0Òù-?õ—OUyä9?þXÅL—)t@Žàk@óâCuB@ X¯ŸJa?@_âòêL @”W¥sZ@ÈÜØ[æ@þ-0a¡ô@3õþæµ~@j'ʈ@ ³+¨Þ@׈Êý@!K Á1@""èK‰á@#>’OÖÑ_@$ZA¸G8\@%uîœñÊ@&‘‘ùˆz@'­!Aµ³@(È—.ÉJɶ¼@>²“‡ÿ€¡@?5àØóÍñ@?¸¯9=.@@~[¶ p@@^c»§Àú@@Ÿ×Ökl@@ßfÕ«~'@A‚är! @A_Z=Le–@Ažì#%ØÇ@AÞ7⣠@B<Ò'¢@B[úQPŒ@BšoɹÕ@BØœ® @C€zM×@CT³±À@C‘jèu0“@CÎp¯Æöð@D +©žü<@DG›~žÔÎÀ-|g lÀ,~¦‡KÎmÀ+€8Š ™À*€¿xhë2À)€>~ ž‚À(~¸ï,ÍÂÀ'|2EÍhÀ&x®"]÷À%t0KËZÀ$n¼¯wâéÀ#hWa2‰®À"a›Q­À!XȽt݉À O¨N…YÀ‹Oô…Ì Àu™$!ûÝÀ^6É#iÀE1¹\À*”rœX9Àk€ƒ0ÀðÀºµSÀ£=MRéÀ b$Ú»×MÀN|R•üÀ×Òbá(¿ý’tnô¿ô†˜Z…¾o¿çÕÓj×: ¿ÊUÕNFóP?Õfÿõ—Õ?쟇Z޶?ö®¾«¿XH?ÿ^ÕBŰ@ -w-‰1@d‹¯Ißø@ Áh|¢ñc@ÓmÔq@¿”½¾È@ïéiZœÆ@ Šû+•@R"³…@ƒÆ´õ@µÒ?¡i @è&YÔ @! Y‹ŠL/@"&´4fÒ@#@‰Ä@$Y‰Ãù†î@%rôмºŠ@&ŒU)£—Ü@'¥£î’|õ@(¾Ù+ ·@)×í6 Í@*ðØmI†…@, “6±»@-"`º±@.:YKÕ2´@/RU›„Œ6@05Ä*[(@0À­Ü‡s¼@1L+råVŽ@1×vì¨SÀ@2bŒ¹:*æ@2íiR²0æ@3x >xm‰@4i ãr@4Œ…^ЮN@5ZÜ7á@5Ÿæ>³h@6)$M~Á@6²ÜÁÉ=@7:«Òg‡R@7Âï"8 @8JØÐq3@8Òeñ½²l@9Y“«“ÙS@9à_4Ž@:fÅÔ¼9†@:ìÄåîN0@;rYÓøb@;÷‚íÉ@<|;QZ®@=ƒoî=@=„W-e@>µ1„‹×@>Š›0rƒy@? x@?ŽöºÃ@@4/£z@@H­ MB@@ˆåHnx@@ÈÛqvû@API‚–@AGÿí2ó³@A‡,Œ}Q”@AÆ{Êï¼@B·C½@BC¯½Ê@B)¾/(¥@B¾ø°í¥@Bü€é¬@C9¿5¿\q@CvµÛ{Êä@C³cˆ\£@CïÇÛ´‚@D+âz©À-þéé8À,#4´:“À+&bçÂqùÀ*(‹¬¹'À))²)?Þ¿À()Ù¨„m¦À')šÛ¤[À&'9•Ñ"<À%$yT,‹À$ ȵëɰÀ#+À2À"¦+];À!=›ä~À õ0–äÀ£ãÁ“ˆÀï±;yÀÜ&2jÀÆî«à ­À°3½²¹À—óþ<ƒÀ~<1‡GoÀÆ-”˜ÝöÀ Bݪ‰ÀQaŸ8ÎàÀW•Ò¦¿û¤&l\u¿óÞ‰©à¿å&)ìß;¿À{P À?Ú?›×’•È?îNó–ê?÷ÂÒöVÔM@0ÞŒªéÖ@‚““rí@Ô³Õ6°9@ (ÜH ;³@¿.ÌfîÕ@ê—ê+þ@|6F@BëÎ4J·@oÎà.m@$&ñ@ʯ@Íš¢@ø†g±@!T„'>l@"*tçRi¹@#A¡ì¯%@$XÔ¥DG@%pÒ‘¦¦@&‡)¬MÏ…@'ž>· S@(µ9©4Ã@)ÌÖ=@*âÈ2ÖÀ™@+ùLU7 @-™Ü¢]Û@.%©tñª@/;sÒ‰}!@0(xÞu+@0³µ{N@1=uËmˆ}@1Ǭ°þâ‹@2Q¯9k2o@2Ûyóöµ@3e zÂdš@3îZsj0@4wi‘NÖ@53t(@5ˆµ8mk@6ëizøÂ@6˜Ó·Ã@7 iÐD´@7§ªqxßì@8.”UÐ.ä@8µ#ÙÅÖ5@9;V1vzð@9Á(¡õ‚@:F˜Zý«@:Ë£1Mc@;PF0;Ð@;Ô_Õ°@cgoY¡@>äwìÙ{@?e°Yœ|@?æGpŒæ@@@30Ñ}Êï@@rþz[Áö@@²‹Ü´Àß@@ñØ+£à@A0â£~Áq@Aoª‰Óˆ@A®/-Q–Å@AìoåÃm@B*löE6@Bh#!¬j-@B¥”„"Œ@Bâ¿®â<}@C¤-Ø×k@C\A‹ Üu@C˜—[™é•@CÔ¥<ôÈ›@DjÔÌ‹xÀ,Â䢚AÌÀ+ȯ‚Ô-¾À*Íw| Ï«À)Ñ?‰j‹HÀ(Ô ÉbÞFÀ'ÕÜ~¡„éÀ&Ö¸º òÀ%Ö¡GoÀ$Õ›휤À#ÓªPLµÀ"ÐÑÚÿ*0À!ͦVÞãÀ È|¨VÒwÀ†„Ö½øÀy{òX’¾ÀkDè™÷À[tú(ÀJ…óºÀ72ãÿ„À"Ó›¹ýÀ ,dCúÀ ë£Sõ¦ŸÀ ºˆcòuÚÀ†Ð?Í\ÄÀP’ƒáT¿ú/ËÀ–È¿ñ¹ÅjNEü¿â~ˆVUG ¿¨&«ìÍã?ß £<Ö|}?ðI.u÷†?øÓ£•òÿÆ@°É©PC@ùdwKú@ C…òO}–@ èõuº@íù'ÛCm@Ÿ8ˆ@<˜G©Ñ @d«ó‹ëG@/[ÁLÂ@¶#-³ç@ßKÙ\jG@ cþª‹ù@!=<4ô@".)¤±­ë@#C"›kÕ1@$X ‘T%@%m2SmÀ@&‚*Ê­Ð@'–ï) Ÿ@(«·ÞÅÙ!@)Àaª‹@*ÔãQDÊ@+é7ñ @,ýV‹Å @.9'`@/$Ø'.Ý‘@0NÙ^@0¥—¿÷L@1.ìï Ϩ@1¸lÏŠv@2AÓ:½°@2ÉÀÆ äV@3RBóÈŸ@3Úˆ{¿@4bŒð@Ò@4êNT¡”@5qÉ žÄ@5øú>Ó/3@6Þ§…1å@7sa?Ž@7Œµ€jƒ@8¢(câË@8˜6Œ¹c@9oïŠ}Ø@9¢K£.¼N@:&Ç 4ˆÂ@:ªß—¨àÜ@;.’ÏXÎÉ@;±ÞF ¯_@<4¿¡½L2@<·4™ÂÖ@=9:öýÏV@=ºÐ“ùø'@>;ó] S“@>¼¡Pe^T@?<Ø~,’g@?¼—‚W>@@í‘Å¿H@@]QЏ¸Ï@@œv›/V@@Û[ø9³…@AßÞ5@AXd™ ìp@A–†sš=Î@AÔeÈ&óq@Bøx‰@BOZmŒ“@BŒn›0S¡@BÉ=üCt¤@CÈr^¿@CB oÁÌ–@C~ ¢tþ@C¹ÂHí#À@Cõ3– ¦À,g´@`amÀ+oB›JÀ*up|çg|À)zÕM½8À(B¨á1ŠÀ'‚»È9·òÀ&…D‡ÌbÀ%†ÞénוÀ$‡ r¥!À#‡[9ëAõÀ"†DVî&À!„Oo.Ö7À €¯ÏxÛÀû¸ÐZ¨pÀòÎ9²ÕÀèJN8ÃÀÜ6éöÀÎç·=À¿ˆ.z²°À¯îÀ:ÕºÀ uNßNÀêR¨°ëgÀ¾ŠN TÀK¼â¿ø¿XWdµp¿ðYŠ0å[=¿ß½nËqëý?ŸÀ˜6c”¥?á⽬^Ú?ñg†pwÞY?ùáG/ñ(@/6Œˆ¸@oaògn¢@ ± V¾kµ@ ôþ^ˆñ@6u>€@>÷m·×˜@bA,ÿíò@†ÜÇ8@ª7ŒZß@ÎÈ9Íÿù@ó©Íïçq@ g/Á&@!Ð{@"1Óï²+@#Dž¶ßÊô@$Wo3“>ä@%j=jE@&}4ªµŒ@'¶oÉk£@(¢RúñG`@)´ÐºYŽ@*Ç(˜Fçï@+ÙS†kÜu@,ëJFüP@-ý‡|@/€¯(±b@0Ù ™÷¬@0˜IïKµ†@1 ¥Ñ5R@1¨¦ÒšØP@20Œ#ûêy@2¸@8{›Îµ@8ÿÞ›T}}@9ƒÅá‡@:O_‚ñ@:Šw¥{3ü@; =2Ý%7@;W[×@<•ÃavÚ@<“$8".å@=F‡½k@=”ú•d×@>>Uy³@>•Í¡àö@?màC„@?“TSœ @@ááÕÅW@@GÜØ+ET@@†š;* £@@ÅAáÁD@AY,tÖ@AAYBtJ@AÕ­@A¼—>Qaz@AùÓà¬Ð@B6Î$íZo@Bs…›¶@B¯ùkW³@Bì)kOF@C( šœç@Cc»ß)ó@CŸžWA@CÚ9–<êrÀ, g5GX]À+Sܦ5€À*HFP_9À)%G`³À(+T9JÄÀ'0r!†õÀ&4¤tjŠÀ%7íÕëÄ›À$:RéñþdÀ#;פ¬óÀ"<}ÿ»¸-À!mæ?8Ö[@>ìk(p@?j|“!À@?è¾NÊó@@2žýG•<@@põT˜Z§@@¯ž/s@@ìêŒíw@A*‡“¤á@Agäဿå@A¥ÖàQÊ@AáàY€_†@B|Ôaø¦@BZ׺¨‡*@B–ð‡‡kè@BÒÆ¾-üs@CYé±øK@CI©œøŠ³@C„µrîÓ@C¿} ÛË`À+³÷ñÚØ2À*¾r3½™ÒÀ)ÇùZIaÀ(ÐL}wmÀ'Ø:ñŸ¿À&ÞùÒè{´À%äÒØY_jÀ$éÈ‹ñN À#íÞx âÀ"ñGœà›À!óyÆAÌÀ õßfviÀë‡>éu¢Àëhd‚”pÀ鹯ê–]Àæ„<<£%ÀáÐØ¬´ŽÀÛ¨íÂP©ÀÔ }ä½ÀË!õh¨ÊÀ­k¿À j}ÊÞÀPÇÁ/ñoÀ4¢ÛˆÊ'¿þ,HD|ù‚¿õêÄßb¿ëIÉ3ƒ†È¿Õke¶ÃH×?Ç™zÔ„ë?æŠ ÅøŽ¢?óš{ cÕÁ?ûó^`¿@'¾§µï@WSBBÑ@ ˆSÃ;È@º¦ªë;@wXÅÍ@‘n:׉ô@¬E™"®ò@Ç’X´@ãF?‚ªØ@ÿTè g@°–=õ@ %è\“@!*Œ‰xl@"9e–…P@#G‰³—ó@$V¤iÍé@%d™kuE)@&s:œÉ@'…Eòî2@(ÜÄ¥ü@)žñÙ §@*¬-Å&ã@+ºc)CŒ@,ÇÒ>÷¬…@-ÕSûÑó@.â–ü© ô@/){@0~#LZ @1S”"‘@1ŠV™Ù$@2*–u–l@2•ËñwŒW@37’6.Ê@3 jiÕDW@4%asÄ…/@4ª¶:@5.B«Y­@5²Â69ç–@66¬º%EP@6ºM0ƒ¦@7= W²×@7À¤“»õ@8CUdg†@8űçüÛi@9G·vÊ@9ÉbIèÂ?@:J±G‘¯ê@:Ë¡¦$67@;L1ùì@;Ì]jáJÑ@G"È(@>ÄÐ[Ò|@?B 6B­@?¾×aH¦å@@–ž:@@[†ˆÛ¶@@™:¬!•@@Ö²K.)Ë@Aì±nÊ @APé2iL…@A§)´UÉ@AÊ%úêúp@BeŸ#Ù@BBcáJ9Þ@B~!å<%>@B¹ž ˆ¾Û@BôÙóÀ_@C/ÒoÛJA@Cjˆ°!@C¤üX.À+[a à¨8À*gfÁ›“À)r~_%ì@À(|ªÃ”>À'…îî–q·À&ŽMÿƒX%À%•Ë5b^„À$œiîçîòÀ#¢-ªkTÀ"§ÑuŠÀ!«2¾sÍÀ ®{°ó€iÀañ²$™Àe\¢ãH&Àg@¦¥ë7Àg¦l“qAÀf–ßÈBnÀd&“aÀ`<¡Ÿ(ÑÀ[ëŒíÀ¨ûªŸÉúÀ ™bÔÄqÔÀ‡SÔ¤T@Àrã”S-r¿ü¸NÊT“®¿ô†iùû´o¿è ‰Ì¬x¿ÐX1ì?ž?РF˜ÝÀ?èÓÎV5há?ô¯E ï´?ü÷û×l#@¡í—a@ÉY+ "‘@ ò(ù@A.csÒ@£ÅÇ 06@¹öáLDÝ@Чb ÿ@çÉ›-Ф@ÿQeZ=ƒ@1sµ–j@/\­”(i@ #âö?²@!0/þ¦øß@"<ŽÒ¥"Œ@#HøÐýÍ"@$UgV}«Ž@%aÓ¿Fÿ@&n7g#ê@'z‹¬ž½_@(†Éðl((@)’ë—Žêt@*žê gþ @+ª¾¿îþ”@,¶c*è{T@-ÁÐÏÁy@.Í8r§z@/×íþAÒÛ@0qHb'û @0öqžIY@1{o’¿`@2?(TL@2„ÝO!Þ3@3 Gw]>@3y?bX@4q”¾¤@4•+¡;R@5¥ý8(@5›ÝYAÝ@6Îíà2l@6¡wÿÞB@7#Õàtç±@7¥åí¥Å@8'¥’‘rË@8©Gȧª@9*)“˜\M@9ªé PÐ@@:+NN‡uð@:«WS¾4@;+†Å’@;ªJ Ýå¡@<)002 @<§°ë–éø@=%Ê‘êX@=£{!.ü@> Àšètå@>™E:*@?R, @?•ý ¢¬Ù@@Âg«¶¡@@FL‚mÉ©@@ƒœË<î@@À°`ßÖ­@@ýˆ¶ª~c@A:$jOÐ@Av‚סɭ@A²£cô*<@Aî…{1 ›@B*(‘:R0@BeŒ!€V@B ¯¯A‚ @BÛ’ÄÖž@C4ô=fÞ@CP•Ö¸iØ@Cе Â’UÀ+8(wÀ*,Fi+¡À)Ò^D„À()‘™ ^ÝÀ'4m®"2´À&>it¢£À%GˆÃ%ÈÀ$OÍ"bÀ#W;–‚(SÀ"]×dÐbKÀ!c¤eÏlÀ h¥“àUÐÀÙ¿[ãî$Àà¬îM»áÀæ-DƒÀê¡ ”Àì¢$ dÀíÊnµ¢Àí—÷KÈÀìVdÒÀ ÒÎA»÷À Ê}ŽÍÀºÀÀÂÐÀ³4$¦°4¿ûHN±û½¿ó%⾕>Ý¿åþŸbðP ¿Æ¦ úk&?ÕflÊàF?ë2,¡ëÏ?õÁ :óHÖ?ýùÀåóÜ@ÅÂJ0r@:ožõ@ ZÑø“ë=@|Èi¨³@Ïô¬f@â ¡o!¨@ô¡WqBR@¥–X?`@ · ³@.ÊbɃ@BЩDMI@ +‰í’:;@!5ÃZ#É @"@%Û^@#JcÕàû­@$T½ò?@%_þQ'@&ie±‡@'s¥üÖ,á@(}Ðÿ-v@)‡àæ—@*‘ÌÎ,¬û@+›ÆDš«@,¥%œÄQt@-®„ú³ø@.·¨’årZ@/ÀŠ#[v@0d‘º}¨@0è·/¹Dî@1l²c»M@1ð€P™“9@2tø…Wâ@2÷ˆfF{Ã@3z¼­·G´@3ý·ì:Ç@4€wI/{@5÷ö]ú€@5…70c[ @62?I[@6ˆæuí¦k@7 Q4S¦L@7‹oæEï@8 @pÜ@8Œ¿ä#è@9 ê£ü`ó@9ŒÀYÔÊ@: =áMþ7@:‹`öHÔˆ@; 'bÝ5@;ˆŽÿ‹S@<•³ií¤@<„9tM;…@=xFêõ¢@=~P>øãf@=ú¿FÞ’@>vÄ9Ô>¥@>ò\¯àÀc@?m‡1øþÊ@?èBþ•˜@@1Eô–Ò@@n1† A¾@@ªã OÑ[@@çYÓ¡Ç@A#•3VÍ3@A_”Š$Î@A›W<Ëñ9@AÖܸ1à@B$p¯ÑÊ@BM-â ø´@B‡øaº$@B„E‡@BüÏλ_@C6Û‹Á@Cp¦×ÐB—À*¬§S)cùÀ)»½¤3’áÀ(ÉïƒZw\À'×?ÂŒ:ÆÀ&ã±Ql^ÉÀ%ïG=[ù½À$ú±zKÀ$ìöp:À# sC«À"K«x‹=À!É@»HYÀ #ñÏ©zÀRç53À]Pgby@ÀfC¥iÀmÉQ4 ~ÀsêòÅÀx®˜ïöÀ| se<À~G¨Äâ”À þ]¯!ÀRÀý¾„cÀúÅHtõÀõ†ºxñ6¿ùÜ-F—ú¿ñÉx}B¿ãcØ_|À¿¹n HHÕ?ÚЬZØ"?íTcz¿q‡?öÏß„\ ?þø¾|°,@’PJX¬©@©«™Ú?@ ÂY È ¹@ÜB—,ÒA@û§>“tø@ ²{5þ@7 +Æ@'(nSö@6zY¨$%@F b^ü@V ¢à@ 3fà7B@!;G njˆ@"Cƒ¢€h‡@#KÊÞõ7@$Tiö[X@%\_ò‹pø@&d¡$U"£@'lÓ­j„ï@(tñ>Žux@)|óŒU?@*„ÔPG) @+ŒJS–@,”@aZ«@-›o„FŒ@.¢‹hü€b@/©gVÖúg@0Wþ]Vêt@0Û"ÇÙ‹@1^ï[®@1àìß‘vÉ@2cŒ«þ1”@2åúpgD¸@3h3QM“Ù@3ê4|_]é@4kû(ç `@4턘6ó@5nÎ É@5ïÔøùEE@6p–¢½˜)@6ñ€¢—@7q@ Ñwf@7ñ"ɤ~N@8p¶Kóå@8ïø1^-H@9næ%‹Ïá@9í}ánSí@:k½+z´ø@:é¡×ß&G@;g)È´-ù@;äRî)Z@PN§þ@>˽.@?EsSÝ{@?¿bªé´4@@q›ÓJ@@Xù¼4yˆ@@•I¢ *@@Ñ^»›(V@A :AÁî¬@AHÚóõg@A„@5õZ·@A¿iwþªÛ@AúV.ä@B5Ô]Xu@Bowî«@B©¬m¯@Bã¡«ß…­@CXy¥Ú‹@CVÐ âg{À*VzVE6@À)gÝÅWÙÀ(vÑšHñ¢À'…°V‰XÀ&“´ú -åÀ% â‰0œ¸À$­<% l˜À#¸Å ÑÙEÀ"À—ðëˆÀ!Ír@Ç,QÀ Öš>rÀ¾ ¨pÀÍ`uo2¯ÀÛ>l±‚^À箕MˆÃÀò¹-s ÀÀüf©V’XÀ¿²u ~À Í&ÊßíÀ˜ïJZÀ ,S”TÄÀ3fÝSxÀ7Žô’ÜÿÀ9Íétú ¿øsЛýñX¿ðoå 0ÏM¿àÐ’¡é¿—Ñx¹&?ÞËø=×û‹?,Í>+?÷ÛØÜ¦r?ÿõ à ¢@– Ó,¥@ø!¯Š@ (Æ´Ok@\ +{@&â¶$¡!@0먮@;jì«$@FT…¤ùø@Qœa˜&Ñ@]6^i ÿ@iKWè@ :—õ’„¿@!@»{Ç£@"FïŽxÇ/@#M.Ê”`@$Sp±däÁ@%Y±fÕÍ­@&_éøÀÉ@'f9Sg–@(l*®ÜB@)r%+³Çò@*wÿ–Áì@+}³(¤©@,ƒ9ËÑÜ@-ˆv%Ú@.¨$C ?@/’ƒÝx³æ@0KZ’k@0ͳcv”‘@1O± ©Uí@1󮇓þ@2S(1i×@2Ô›Õšÿ•@3UÛÏÑC@3Öå]–ã;@4WµÅµûµ@4ØJX¢ o@5X pÚ@5صsHŸO@6X†ÏŸKâ@6Ø®|ƒ@7WTŒ¸«F@7ÖLÁ @8Tö Øó¬@8ÓPCa(ì@9QXiQ @9Ï ?r)@:Li–˜«b@:ÉnLÙð0@;FM»x9@;Âe’_hâ@<>T!«øT@<¹ân–@=5 z¿º@=¯Ô¥Ä¼@>*5¼ww@>¤/²@?¿>p€@?–ãýK”@@Î9á5}@@CówЭò@@á'µæ@@»–-Ë£Õ@@÷PÏd¨@A2TÌmŠ@@Am]´Ô@A¨*qúeò@Aâ¼ØLp@B®"@BW,€)ëë@B‘ €ail@BÊ©?å‰_@C VŸ-È@C=/c&“†À*[HñÀ)0Šz¿À($s'ÀÀ'4Þ‹ÞÀ&Dsé;HÀ%S6¤³îÀ$a)ÔÃ7ŽÀ#nP¬ŠÕFÀ"z®zùs¦À!†Fª±5À ‘ÁæC»À6hÄbá[ÀI"Á+<ÀZn˜tð—ÀjTÀxXÙÀxÝ"›²3À† Þ5°À‘öµí<Àœ—²F¬.ÀKü-ÛÀ \d.µtrÀjzQ†ÀvQa•Þ•¿þÿùN!T»¿÷ƒ.Γ¿î4zŸ  m¿Ü…í&Ÿv?«_ªÞË–?á¶yv ?ðÞj{J2T?øå •f@wZA¨¹x@}Ÿœ´° @…>—yƒ@ Ž ²‹’<@L›†aâ@Q©+!¤@WºÐÞÞ @^?“5æ~@e,,¢‡Ë@ltÓqõU@t ­Ð²µ@{êÓÕÔ€@ B(ÊÑ@!F!—øë@"JR*}2@#NdƤB@$RÌ»öëû@%W 'Õó¶@&[? ‚³%@'_gƒòì@(cz ØÇ@)gt$Óõ@*kM­-&>@+oFl@,rˆþúæº@-uÞð%L @.xý:T[@/{Þ A@0?=Ç?^ @0ÀhEÛ…@1AjêÔ½S@1ÂCŸkÜi@2BïYÃ+@2ÃkV;ÆÈ@3C´ÙMö&@3ÃÉ/óðÔ@4C¥°L@4ÃG¸ÖëÖ@5B¬³#Y[@5ÁÒße:@6@µRVùt@6¿SüŽæ@7=«£‘sÞ@7»¹åÄM@89|m'PO@8¶ðï  Î@94/6í@9°æúTªA@:-d+úÆ@:©Š«ô´@;%Xo Âå@; Ëw-AË@<áÓ˜•—@<–™ ú¯¨@=ñ ‘?ž@=ŠæEDoš@>w™½•r@>}£Zyê&@>ögèÙW4@?nô)mz@?æµ9¬™*@@/‚NÔó@@j©×â@@¥þîÅjò@@á#âSç@A×ëQÛ@AV¬sH7@A‘eC¶“@AËV$¬ò@BS,sýG@B?N@Bx›/÷ ã@B±åFzµ5@BêòÝyOç@C#Ó*À)¬gšŒäÀ(ÀŒ~æ.À'ÒЫê×ÔÀ&äÅ´ì[À%õé~´tÀ%>ûŒ<À$É8˽¶À#$‹^Í•À"2ˆ°ÙÝÛÀ!?Ä ©À LBl%{vÀ° ÂëîDÀÆ%5*K†ÀÚØ¾cm¡Àî.!™±ªÀ-Tßh ÀÞ€±½LÀ IÿC‰CÀ.x[·òçÀv䢙ÔÀ Ž”êóôÀ£Ù¿ÈìÀ¶ÿ¯ ú¿ý œ¿õ®‚hiy¿ë ¯²ÿ›¿×xÿ-¥ý ?Ày6E å¤?ä åu½×?ñô2¯ÏÛ?ùë„q<¦»@òè|„Í@ñuXû÷^@ñTI\U¨@ ònäÜ&@zWz{¾@{ÿ 0uÐ@~"ÚŸ*@€·‡üÁ…@ƒ±¢(”~@‡¤†iô@Чûw]É@ŽÏî÷@ IT‹j•æ@!Kx<Võ@"M«¶GI@#OéÀ<@$R*}¤ƒ•@%Tj·Tj@&V¡Æ8u‡@'XËâÁÕÖ@(ZâyM‰@)\ß­:ͳ@*^½¦Q “@+`v‘Ä.@,b£/ôë@-cb—a(@.d‰,^Û0@/et4Aƒ@03Â"“@0³?¿Q@@13JHÞ‹Ÿ@1³+œ{Ä@22àþÎJ@2²g»ÜY¾@31½'v›@3°Þž×2@4/É‚ì„@4®{Dí9S@5,ñZæù@5«)D8„§@6) Œ¢#@6¦ÔÈ¥Ir@7$C—̉þ@7¡j¤‘>î@8G¤¢_’@8šØY'b÷@9Žÿ%¹@9“ úËç@:ªî›V@:‰ôí¢Ê@;è†E=@;‚‚Uhl@;ùÂ9‚¹Ú@WqK’@>Ïk°ª»~@?Fÿ{Ï¿‘@?¾+.ð•@@v¬Ãy‘@@U¢LLQÛ@@—ËZB¾@@ËV…ö¶Ù@AÝÞè´Y@A@-?®ýÄ@AzDx¶¦@A´!à™¦@AíÆÍë@B'08Ui£@B`_×{°-@B™T‚„@BÒ ÐÙ5Á@C ‹`=nˆÀ)XxiíäoÀ(m—¡&ÛÔÀ'äXþqŠÀ&•aF-L¡À%¨7°È‡À$¹÷ÈãÀ#Ëæï—êÀ"ÛpÅÉx:À!ë ëg–À ùç¨qJ_À  iqŽÑÀ*ífrÝýÀD`HË£ÏÀ\té™g'Às2êv¶Àˆ¢U§UÀœÊˆäBÀ¯´]Ò_qÀÁh&À £Ü'E.À ž?Ž(Àß(•ßáÀù »˜{¿ü#¼íLÏi¿ôP^ÏÚ(Œ¿èòLnù®i¿Òxè;e Í?ÊñB;Î?æD4´¢?ð?ó1çtÁ?úï[©i¥l@m6üµ¬;@d[-‹S@ \Q¥KÈ@ U¸Z‡åj@¨â´ûæ@¥æÂÑÚ@¤&~Ø©I@¢Õ?ì ¹@¡çM²ç@¡P»€ªò@¡æâµ@ þ7¤‘ë@ P•¤F3@!PÁT™@"PüoÑ@#QA6½Ô@$Q‰êÀ-è@%QÐʈ@&R$ï¬@'RB ~H@(R`íœq@)Rg-Ø@*RN›ç=d@+R8ñ@,Q«ŠÓ­@-Q•¦ã©@.PJ†²i@/ODËð@0&ÿn¢S¹@0¦9ž®É @1%N=L Ž@1¤:—íÀ’@2"ü¸¾À@2¡Øì<í@3ó}H\/@3ž$Zq¿ë@4ãR"]@4™ã“uÄó@5lïe¡3@5”¹„þ@T@6ÆëÃ!¹@6Ž’Å.œ@7 ¼þ%2@7‡\‰zòF@8Uë¾ß^@8¯õ•@8úf­™á¨@9uyǯ>@9ð;ì÷{x@:j«$”+@:äÅP¢/@;^ˆ§µúŒ@;×ó>¹qÛ@1–­ì„@>¨Èi®â@?•LZÐ@?•ü Y_8@@ýÏ¥¦2@@@É8ÿ†F@@{_—¹oý@@µÀIa#@@ïê²0 @A)Þ!?ûð óò@æOaçý,@Õ¥ƒ¸ÿZ@ Æ> TÖD@ ¸ôUj@Õqiá½@Ïah\F«@ÉÈf z@Ä›Ï4@¿Î¡ ¸£@»WðúL@·,tlz@³?µÇŽ @ WÃöF^O@!Uü»Â_@"TD‘;ãŽ@#R•Ú ÿì@$Pê÷ó%@%O>L ƒ[@&MŠ7½SÃ@'KɰÒÏ@(IõbÁYW@)H nîô@*Eÿ®NÄè@+CÒ‘ùÆ(@,A|ùŠr@->ø)2•«@. SýëE@>‚zþÆû@>ø‚7íeÄ@?n%Œ÷Î@?ãc•kÏ@@,z¥*@@fU/1V@@ XG”ÿ@@Ú&)™@A¾?œ»™@AMý%Ù@A†JÚ ì@A¿>UA‚@A÷ùòãó{@B0}>–[¼@BhÇÉGsW@B Ù**ßk@BذþxÑãÀ(²·ž ‹À'ÊÏ«a=À&â‘5®oÀ%ø£õ`ÆÒÀ%e–o¿…À$#eKžÔ<À#7¦ÌìíÀ"K*Êi3gÀ!]ö½ZKôÀ p ßcÀâPÑaÀ$L¶Ü¿³ÀD`brÿaÀc$…XeÀ€ þzÀœÛàõ®YÀ·ÞdOÛôÀѯòñ‰UÀÔ±C³À Áb°iàÀ0¡rHoÀ[a½ºTÀ„<¡y™¿ùU•Üì‰æ¿ñŸ/sˆA6¿ãÊ43Ȳ¿Á;Ö·Ìì©?Öf ›ú¿h?껑"ð¹Á?õ%}ÕÖ?üïe„—ÿX@^9cx³ë@FzBòç@ / ¨ªD´@X]å·@P쾫¢@øt?Œ[@ï #\F¢@æ sà)@ÝjVá“@ÕÎ-@ÍÑ»R@ÅRÃ%Á*@ ^à“u®@![*Ð @"W„VÒÂY@#SçD®Ë@$PMš9ÀÛ@%L²[édJ@&IàÕS}@'E`¬³Å$@(AŸEXÐH@)=Æ3Ÿû@*9ÐNëm@+5·I·=@,1v™_@--’k;‡@.(gÚoŸ@/#ÚrD@0<‹J™I@0ŒAEu@1 À<9@1†ÉxàZú@2©Ø@2€^­\òš@2üåx%Æ@3y;¿8Ó¢@3õ_ o0@4qMKæ@4í73ðÙ@5hQÞ'@5ã¿Kñ@6^À ræ@6Ù€"‘Eï@7SýF•’@7Î4ÓVŠ}@8H%#?l9@8ÁËú ö•@9;'N€2w@9´5"`Ñ3@:,ó‚˜@:¥`‡>È(@;zTÂÎ@;•?xß@< ­\H@<ƒÂµv}@<ú}¼j_>@=pÝ$rϧ@=æß"ì0ß@>\‚/*ZÈ@>ÑÄÌÅ#ª@?F¥‹¢¼@?»#þå½@@õ7ŒŠ@@QwsñÔ'@@‹`Òû3@@Ä"©ê@@ýÌ&l ‡@A6Óß0F©@Ao¥Æ(ð@A¨AZš¡T@Aà¦!Öœ€@BÓ§-¡ô@BPÉ{æx$@Bˆ‡71u¿@BÀ vYœÀ(`Ý9G¢À'znè䞬À&“:w(ø¢À%«B‚tVgÀ$‰ÁÈzÀ#ÙfîÝÀ"îá)xBzÀ"÷7C^EÀ!X@n+uÀ ,r1Ô™À~"hÊçÀ¢ºò·ÿqÀÆ;7%-Àè)r)Àú°M˜À(’ŠtwbÀFø7ÅñtÀd3|¢”À˜q’ À 6•g"WÄÀjnq?Àœ33Çê¶¿ÿ—ìB„ë¿÷óq+Må¿ðKvh¦± ¿á?„YÕ½Õ¿® ÑøLl?ÛˆiGŠ/?ìïåú<È?ö01£ý?ýëº÷Ü(@Ôüé@µd¯ÕA]@ —rBt@y¼ÛbÀ@.Á¤¬6@! ÎJôª@ñ7܇†@(€/S+@ú¼5mÞð@î¡Öľ$@âÎÖt®@×8™„v4@ eê>ºVA@!`KêývÕ@"Z»ø^ÁŸ@#U5 V0í@$O±ÆáÀ@%J,Íbò¦@&D Á‡H@'?G"B3@(9^½[@)3œ¡'í@*-¾ÊÔQ,@+'¿2l¹ë@,!˜Ž)@-Eœv¾Q@.Á 6ÛšÆ_}@>«Z²2Iú@?yä‡WÝ@?“7Ò?Ò|@@I“è0@@<ÅNÔnt@@v|)@@¯$ƒíý¸@@èÔx3@A ´áÙ7@@AY.&@A‘r!A P@AÉ€Y;(@BXYJìŒ@B8ù³Z Ñ@Bpcþq=@B§–׬.À(«Ï×CŽÀ'*µR.c À&Dü¡ºÄÀ%^„Se8OÀ$wOJ£úÀ#_²%·À"¦¹I)*À!½]õi}…À ÓQ›ú“ÐÀÑ.*¥‰ÅÀúc2í IÀ"HíÖÛÍÀHæ% ,€ÀnAÎW,çÀ’c 7|¤ÀµQ(AÐÀלÄúÀ÷² æÀ.hp« À kD7ÍI9À¦Â×^ÀÞÃ#ÜZª¿þ+/„–A¿ö”Ì!ò”t¿íõ¿»•Q¿Ýu¶µ¢åo?Ù§fôŒg?ßâ»æ_ ?ïGhÔz^?÷8ÂbŒ?þå®ùñY:@J¡¦(Û,@#¬`ö¹4@ ýä/‡Ðs@Ù5dÛð¢@ZÆÙ’@Ij: @8}Àü$@'ôuØ8Ê@Æ.žq@çöÊÔN@øO~ç„f@èòiÜšÐ@ lã(ÐOý@!e`d"õÑ@"]ë¬Óa¢@#VƉðÞ@$Os‚f<@%G­ud¤±@&@<Žs@'8¿€·Ô¦@(114q¤@))Œ b5¤@*!Ë4´\;@+éa±0@,ádÅûc@- ®fn@.JfQ@.ø±0sï@/ïÝl\ @0se c&m@0î¹MÑu@1ièhÙ@1äð‡Ç¢z@2_Ï  / @2ÚŽH?3@3U±:8@3ÏYÚ›@4Iyä9ò@4Ãd—ƒ¢7@5=Ö’@5¶‘Ý)1@6/Ϧ3Õ†@6¨ÏRá @7!ŽÆ ûN@7š ëÿ=€@8Dº¢^,@8Š71±K©@9áZð˜Ó@9yAJ^â@9ðUaë@:gÿðF2@:Ý‘"¾£@;SµÅZ ¹@;ɇ1SrÐ@…7˜±3@>…AÙl±€@>ø ƒ¯JF@?kŸÛ­é@?Þ>ö”Ü@@(=¯!š´@@a*†ÈÂ@@™å8Šf€@@Òm3ÌÝ@A Áí¿kç@ABâáUU¬@AzÏ?¹ @A²‡}æMP@Aê 9_›@B!WSd³'@BXncL‡‰@BOúÇãÀ'¿<úyËÀ&ÛžË;#À%÷_üQ04À%e_£ßìÀ$,±›%{£À#FGkHb‹À"_)¢î©þÀ!w[+T2À ŽßóxÀKp„ĬiÀwÔ$]޳À¢ïi[õÀÌÉ–Œ•ÀõgŃRÀÒ¸<[âÀCï>Àh*MðDÀŒ%1eÈoÀ ^feÒÀ ¡Á¬RqwÀãbÂ|¥À#å «ª¿üÁ{ŒF·¿õ93r±Û¶¿ëZ®/uÅ|¿Øx"1‡Á?·IQ‚`9?â¼(ä¿?ð£.Þ>Ë?ø>âm)¶?ÿÝSú;Àp@¿/|±@í—«–m@ cÒw|aÄ@7ÊsNSS@†anŸÂ@qR÷nn@\±š;@HquZˆ@4Š$2vƒ@ ñ·Yž@ œ3ƒaâ@ú\±ÜÞ@ sË3•~Ð@!jhž¹@"a©U@#WÇ`ŠÎ^@$N~–@%E4* cA@&;âüüϤ@'2…ð1rL@()æð˜Ë@)“Ç2Ý+@*ôzrËì@+ 4îz1û@,P-Ëí@,ø@êW\@-îjk{V@.ãRQ@/Øã’%(-@0fü°xå˜@0áf¹Îö@1[«Žæ“¤@1ÕÊ·ž*‚@2OÁ1ey.@2ÉŒ£ýmý@3C*½¶Û:@3¼™3Ãýœ@45Õ‡’X@4®Þ-áhð@5'°AxYÉ@5 IÑ¿@6¨¸…5@6ÊÜŸ…I@7®*Àþ‘@7€P™iO@7÷°(_‰@8nÊàêòk@8åžÖ#@9\*$%f@9ÒjóL®x@:H_s…U¬@:¾à©©@;3\€ºÑß@;¨a¤]:½@<¦ö+š@<‘pîÆ`Ë@=wí£@=y'ãkø@=ì}À–x@>_x@5†@>Òa•"@?DY-C@?¶<Õ1@@ߊ[­E@@LptsWâ@@„Ð2Të@@¼þ4¤“w@@ôùñªk»@A,ÂåE?"@AdX釲@A›º{™ú @AÒè1ßæH@B áE“å@B@¥N½¢¹@Bw3é¶{À'o3t <ÎÀ&'PŒ’À%ª`ŽXwÀ$Æá¶¤EHÀ#â­fËMgÀ"ýÆRgáeÀ"/BÔ­×À!1ë8À JüúüÄÀÆÎ¥¼»Àö[ÆÍjÀ$§T<ÀQ·ß›À}”%\sÀ¨C í3ÀÑËšD ÝÀú5 :À!†¸4ÝÀ GÉ=ÀÚìOU À"q÷ìÈÀhðLåÍó¿û[(F¯ò¿óà±vÄ€s¿èÅÍXç¿Ó…ýmŒ]ß?Å.NMdp?äUI[Ò™þ?ñµ:Ñó.?ùB¢´|Ä@i\Aënð@2¬yºí@ý/-_ü«@ Èѳ‡$@•7 í²@±•\Úû¤@˜Ý‹x'Y@€ƒQÖ/@h¡J¾@Q îW´Ã@9¾Íœ9½@"¶QFàh@ æ’eú³@ z¢Ð•¨ª@!odÃ;[6@"d4"±š@#Y îkCæ@$Mç$‰œ@%BÀ¢–û@&7“ÆI¸@',[//Û•@(!ý6ÅO@)³3ðY@* 9Ú Ðô@*þ úWf@+ò㤖ý™@,æüî5¾n@-Úçó 2¸@.ΟÖ"ή@/ÂÂbéñ@0Z±u¬“ù@0Ô2FòÚ@1Møw”&@1ÆÈ3_·@2?Ø¥"e@2¸¿E€ý@31yER¨@3ªu˜@4"_¢ÿú@4š†²ª`@5y'Üh©@5Š4T†c@6¶‹¹g@6xüs†î¡@6ðM¼]×@7fά¦Ö&@7ÝV™¸9Š@8S›'Ž@8Éšr#“µ@9?Ržÿôè@9´ÁÝbß±@:)æfm2m@:ž¾}G ²@;HoCX@;‡‚“ÿ9É@;ûkM€*8@9ûïÏ‘3@>«Ü‚»°@?aƒ7|µ@?މ©T×Ý@?ÿS¸\@@7ß>µcç@@oäié¿@@§¸Í5¨¢@@ß[âWúã@AÍ%Yî@AN {n"@A…CcXð@A»ñ3”ï@Aò–yú"Ÿ@B)¯¶=¥@B_Dq@“cÀ'ä§ÌÀ&?Jô1«ÐÀ%]úsÙÀ${õ†wÀ#™>«|öÀ"µØ£ñÜ1À!ÑÆ(T„ÒÀ í ‰i·À §=VPóÀCAl€>tÀuóÆœxÀ§iÈéõÀ׫ùT­9ÀÀH™Ñ À4­}a– Àaz…¯V]À.uôÀo¡㮀À ÂÐ9'œ¡Àùlv¤ÂÀc+úüÀ°wvÞù¿ù÷×xžZ½¿ò‹1Ì%·¿æ6=B1<^¿Í=ùmÑ¡?ÎvVñž½ ?溻cþ?òÄÕºi*?úDðõ7l@âõËb&@¥ ï!‘A@hw̽ˆÐ@ ,è!-”ø@ò_Âý@Üe¨–BD@À nÖ<¬@¤¤!¬¥@ˆ†Êœ›@mGV†”@RR­qß0@7Ÿ,.ä@##ˆ|í@ jnG¨a@!tULƒêž@"gMJ›Îu@#ZM„«8j@$MQˆE²@%@S„øp@&3N¥0ñÒ@'&>Ú>ù@(Ó“žš@) é±kFœ@)þš–´™¤@*ñ,ªËñ@+㛡ôè@,Õá\s@-ÇùÏ*Nq@.¹àmT©@/«“$¹¸@0N‚—OzŒ@0ÇÛ”Q@1?”ÆÜÆ@1·èËR@20n€ž.@2¨¦è@3ï£J@3—™ÄG¬j@4JÆàØ@4†\í—íœ@4ýq âÐ@5tPô)<@5êö|âý@6ab´iYÔ@6×’ÁROl@7M„­Û°Ð@7Ã6ŒìÁ@88¦zF@8­Òš¸òy@9"¹N+~@9—X6tž@@: ®*(¤¢@:¹Bx{@:ówÒËÇw@;fè:¹zï@;Úân¶A@ÊýÑ3@>…í÷?z_@>ö·-Œæ¹@?g%\¤B @?×7Kp„@@#uäúˆ@@[ Ú‘lÂ@@’›ù€Øh@@ÉæºK9{@Aš½I@A7ééË­@AnŸÌ$Bò@A¥$2úª-@AÛuå.5í@B”z«)“@BGÉÀ&Ñ.€þ½.À%òáWuˆÀ%)àƒ À$1œõüÖ¼À#Pa°Ö ¼À"nz²¤¯ÜÀ!‹ê±ìøÆÀ ¨´yŽ0ÝÀ‰µÑDÍGÀÀÁä¹ Àö“;ÁdiÀ+0 .ó%À^ž²÷hÀ峯PªÀ ¸ƒ¥õÀòϸÀ!1tY³Àùg–®›À ÷Ȫ4tÀOœëÆÆkÀ¥…2Y¦¿ÿó!ŽêÔ5¿ø—žm;‹¿ñ8 –W“ò¿ã¬=¢\­¿Ã…¬X†ò?Óߨ"’'Û?èÇ2„ÁêZ?óÒ8­­?ûC>¡Õê?@[}çß×È@“Z:Ó@ÒÍólþƒ@ Óºš*@'5yX×d@Ô×gO@æâ7›_@ÇT¢×»y@¨#êæÐ@‰DÓžY@j®9ƒEw@LXÞ…@.8!"ë@ ˆ"x+w2@!y:zÙÖÚ@"j_RŒ¹@#[Œ7=€D@$L¼_°’@%=ë%¸¥@&/UƒÑ@' 0!Ñ@(=ì ¸6@)6¤¸i@)óø¼*‹@*ã×*£gò@+ÔuŠL@,ÄìIÒ[Õ@-µ6ÕÕ1@.¥P~•T@/•4¤kD@0BoWÙr8@0º%¹œR@11¹"äd@1©)e×͉@2 s›ª¬@2—•}òÉ@3;ž¨@3…X÷<ª@3ûôE8â@4r_²AõQ@4è˜=Pd)@5^›Úߊ–@5Ôh†æ»i@6IüE[@6¿U! [@74q.–_@7©N‰ÙZA@8ëWŒãž@8’EÅ%ëA@9\ V@9z,b Å@9íµ©Øò@:`ôƒ6UZ@:Óè÷Ý÷@;FÝØ)Ø@;¸ê¤!QÀ@<*ôË-@<œ­¾Útz@="×z @=&†c‹1@=ï㊆õ;@>`IÚ~r@>ÐX+ÅÊZ@?@ > Ø@?¯gÛ([@@3lNæu@@F„‰ê¬@@}¦»!ˆ°@@´™yZ@@ë\D)ŸÆ@A!îž²º@AXP@ž @AŽ€,ñ)@AÄ~ñ†Ô@AúJ©v°Ã@B/ä@µ²À&ƒ ¯iÑÀ%¥TW4ÚÀ$Æë¾©À#çÔn1iÀ#ÔGPÀ"'¨æÁ&’À!F™S—¯À dæÛCЙÀ(¥+©ÚÀ?IBû|ŒÀx5†¤''À¯óFjÀ扙6§ÀþHÆÀPWˆŸ-Àƒœ«ƒÀµÔP6ÿKÀ Î â—pNÀ .nT'aÊÀŒápÜ¡òÀér÷)ÜA¿þˆcÍo*-¿÷:Zý¤€j¿ïÑÔóâ ¿á(ch}z7¿³Å ]†é}?Øzb!|êF?êøÑ¿’{?ôÜÿ@vâ‡?ü@:Q3ðÍð@3èýç«dŽ@4^ÙZÁ:@4ÓìæÀ)@5I]4N¿@5¾ ôb%@62ÇÔ½î@6§KU@7’Éy\å@7!¤Àß@8hGQ¹ï@8vòpnWê@8ê9Û‡Ý@9]<Ïó×ç@9Ïùö¨¬@:Bnžç€×@:´š5QÊÞ@;&zÍ"@;˜Û|l@< Tß`ý@:îR¯)@>ªBŸ[®\@??jÎDã@?‡ã‚œñ@?ö-¾`g@@2ÚùÏ@@hØš@@Ÿs%Ïà/@@Õß%¼_o@A ±@.@AB(r @Ax!´ÆÂ@A­¯P‰ß@Aã);. @@Bq€QªÖÀ&5~U¾]À%Y2ªyà À$|:„û-þÀ#ž˜Og]À"ÀN‡>ýEÀ!á_½P×À!Ε ç6À !ÇRwjÀ 9ÊâÀ¾Ðä|¾RÀúÓpV;À5­á4SÀof_Û*À¨:wzÀߊàþÀéÚ½ÀKu ˜¬@À ÿÊ8ÉoÀ f¶6Ó+ÑÀ˼GagÀ.êââ¿ý ¡|ÄØ”¿õßù¢)œy¿í7ù+ă›¿ÝS$·Z}»¿dýa·mV ?Ý ³³8.?í%¸›¯†?õå¬.•~O?ý;ê7Ïð@Iv+ØC@öŒÇ¬Üÿ@ ¤»öh‘@ SòŠü½ @‚Ÿ–FQ@Z˜Tš»Þ@3ŠŸ‡/@ ݪQ®Â@戓](>@À‚j‡jû@šÂ4Šl„@u>ëÛ«Õ@OïúÐÕ@ •epa°‡@!‚ãõàí@"pnÀÙÁ@#^>ƒÀ@$K–Ûv²î@%9+{Ò/@&&¹"©³Ÿ@'<¥ûk¼@(°ûýŽ˜@(ï•z­@)ÜYæ&ü@*É…eJüR@+¶ŽlÛù@,£sáø^k@--åå œ@.|¹&Zxz@/i6RYŽ@0*˜Ø&Û@0 ‹C…¹@1]:1h3@1Œ nm@2˜yæ¸@2vý\zQû@2ì9£+e@3aK<`Ýú@3Ö0÷Õí@4JæC£™Á@4¿k¯´ÜD@53¾k;u—@5§Ü†A7@6ĉ–@6s?$În@7è!ês&@7v îd²º@7éÚ¢ú[@8[×$ßê]@8ÎQ«îz@9@‡öhŸ@9²z#ÎjÕ@:$%ýOþÉ@:•‰ëúùD@;¤b6[p@;wsÛ‹A/@;çöܾa™@Ùˆ×@>„t´M!’@>òº =«±@?`¨csŸ@?Î>šÀ±[@@½ÊW½*@@T/¹í@@ŠrÉ Wa@@ÀˆHÊ:@@öo"ñìé@A,&â4è@Aa¯!†ò@A—Tž–$@AÌ/3ø x@B&RÎr,À%è|Õ”¹À% D6AîÀ$2öpêÀ#Uå™TÙÀ"yP«µ°À!››Çq¸6À ½‡Ñ3À½«ÌoJ›Àÿö÷kìÀ?RMtxãÀ~f˜]lrÀ¼XÄP_Àù.àf½†À4ï _ ÀoŸÙ”0ÚÀ©GƒÊ,tÀÃÙpÊTAÀ 3,c²k(À •–!6}À "ý‘öéÀuâÍÎHZ¿û»Æïp¿ôˆgMŒ ž¿ê£‰ x`¿Ø_ó.òÀA?²Mï]À?àÉ ´c£û?ïNzgb?öì'ýx0?þ3Ô`Î_l@¾óê’‰@e ¸,Øÿ@ _ûÎ}e@ ´ ñ –@®éW„f‰@ƒòP‚{@Ybb@/0Èe»T@UgoÏò@ÛÇ;3ñ…@²}z@Za@‰oQ=/@`“ä/9^@ ›ñ'Þȯ@!‡¨Õ<ìõ@"slƒJÉ@#_7¸‹“@$Kûª“@%6ÒÒ þ3@&"™ÁzÔ¾@'VP¤M«@'ú´¨g@(åžqf/@)Ñ!²Ñ&@*¼‡’^|Û@+§Ío´œ@,’îKí6@-}åÃX'@.h¯}·K@/SG#¹Ÿ©@0Ô4Ò—k@0“焼(@1Ûba'ã@1}­´ JÀ@1ò\d ƺ@2fåaî‡ @2ÛF¢~/œ@3O~ Ò@3ÉÚÛÔò@47gÙûŸ@4«'f@5’×Û*#@5‘ÜFcÄ@6ïÏò'à@6wÌ_´Ôà@6êoã¿ÌÎ@7\Ø’ÏÝ@7Ï«[eí@8@òs¾9¦@8² :c/O@9$ Uëci@9•5%S#|@:‚­@:v¶†G•Ý@:ç ÀW½@;W*5å@;ÆÙ!Há@<6MÇI:û@<¥t½aàü@=LšY‹s@=‚Ô ]^@=ñ Îå·¬@>^ì Ä©a@>Ì{N,•%@?9´«¸ìó@?¦——s&Û@@ ‘|jö_@@?ªàg%‚@@u—tÝtð@@«V»´®¬@@àè;ˆÌÿ@AK§Í6@AK€ ¢9@A€…™_MÈ@Aµ[œå'e@AêÀ„X÷À%œ¢¤mVÀ$¡&dÀ#èu¼“"À# ·PXŒÀ"2WÊBïÀ!VY©«W*À y¿€ã³:À9ç3TtÀ}ƒnò‡ÀÀÇ'Æi¹ÀèÊüTÀCîß>cÀƒÝÄ»UÀ»â6*åÀ­µ2À=aÖΫuÀòk³.t7À h&¤:g“ÀÜ÷¥ÇÀN aÞË“À¾PÓ”&¿úYÀðeÛ­¿ó3‘ik£)¿è`—t‡¿ÓvìöGÆ ?Â}ŒÖî§?ãäµhV?ð¸ìúáÎ?÷ðF¬¼‚?ÿ*^FE´@3{¬•-@ÒÌ}áÿW@ s)ÝÄï@ƒa“`P@Ûd=¶ø@¬ô>/q@~éKW ü@Q:ð ·T@#àª&"@öÑë#2v@ÊlM@t•i{è@q±L o@ ¢nÞÅ«@!Œc#>Æ@"vcÝ™X@#`k™—=@$JvR,6à@%4¥ù˜Î@&ƒ3Ô2Þ@'|›eô@'òg}Ê'B@(Ü?~7,ï@)ÆB”N@*¯¥tiy@+™*Àî@,‚‹×ù›ž@-kÄrçÖö@.TÐMoÌ@/=«*Œa’@0(jƒ@0‡^Ðã@0ûuí9®¦@1olyX4À@1ã@'ȹ@2Vîòü¯¾@2ÊvÚƒô@3=ÕãB@3± ¹y@4$ˆ=BÛ@4–êK4òË@5 ’}Ps’@5|AÁµ@5îIÂq‹ó@6`U02ýZ@6Ò(Âôt]@7C¹îÙ³@7µ![Ò„g@8&Böñýr@8—%áj‘a@9ÈyJ©î@9x)$µí8@9èFRÜ@:XwïÉE@:ǰ•™N@;6ù²­ü@;¥ùß”êL@<¯5gÕC@<ƒVì1@<ñ3ìt†q@=_¬NÙî@=Ì}RsùO@>9¨¤Â´R@>¦r3bæ@?’ߣ=@?6èŽ@?ë\ä@@+JqSÑ6@@`à<=•Ï@@–I‘Àá«@@Ë…ùh®@A”ÿPªØ@A5v4!ª®@Aj)- H˜Ê@'¯1?wô@'êÚï ô@(Òô57š@)ºö¿£‡¨@*¢ÞP>jŽ@+Ц¬ ëý@,rKœ{o@-YÈïé:l@.AzEýè@/(<ž€T@0”ÑV¡†@0zú @0î,ÅB#@1aH•ÖÍ@1ÔBïƒfI@2G/»n£@2¹É`?<Î@3,Q@ZÅ@3ž¯ÔW[;@4âF¾ò«@4‚çP'@4ô¼<륄@5f`KÔ„@5×нœ2á@6I uy\v@6º{^O@7*ÞÐÓ@7›p– ˜@8 ÇP»Q@8{à¢û8î@8ëºò¦µ¼@9[T¬ætã@9ʬFÖ @:9À=£ [@:¨©ÐA@;_c+@;…W®^ûœ@;óN¡–‡@@<`úàE¯@<Î[Çô@=;nk¨ê@=¨2i[#»@>§ Êp @>€Ê»q˜@>ìœY䕌@?XÉ™7@?ÃD÷ìÎÇ@@ í‘äÍ@@LL96‹h@@_âïÆ¼@@¶Gs;¢ì@@ëw}N@A±âƒ@ASñ"ü ’@Aˆ#û‚@A¼(¦z²ñÀ%¨S˜s/À$.ö IÀ#VÀ×À"~Þ¿ÃßÏÀ!¦b‘ÃìíÀ ÍMå¨OÀçFwkÈÀ2ÊH±ÅùÀ},ƒ¬HÀÆrŒ³G9À¡ék>ßÀUÀ@ïÒÀ›ÓW.cÀàá d:À$ïi¤¤Àhº÷3ÍÀ TN©¨iÀ Ö¹ úñÀWYñþÀÖ9¡ò¿×¿þ¦Ñ|ž<)¿÷è’k¿ð‘ÒÑ2å¿ã[„º¿Ã„«‡çÜ”?Ò‘dðô^½?çxÿÌO?òÖD8ÀÛõ?ùóíAü8@‰g@á@Ÿmèt@«ƒ§Ú™q@ >Eå¤Êq@ÑùšÎ8€@3GtE;^@ýúè¥rÓ@ÉjLT@”{ø/¿(@`9R_r@,>úFŸô@ø„´5~¤@Å;š.@‘¯D#äÈ@ ¯A½sß&@!•»CÃ0@"|@©á @#bËÖAQd@$IZ¦¸‚@%/çב!·@&o¦çaÂ@&üí¿UªL@'ã]ñãÄ@(ɼ†½Ð@)°ó¼ï@*–1qJ @+|@eÓTR@,b,²l¼€@-Gò<'ÐŽ@.-Œí£ó@/ø·g6¤@/ø1i )@0n™»Mfé@0àý7·@1SAD,ƒá@1Åcë«b@27c=³ @2©=N„¤­@3ð7[¹@3Œz©üó@3ýÙUz'@4o Mé^í@4àþÏl‘@5PâXƒO¶@5Áƒ–ÄÝp@61ðûÈv@6¢(Ðeñ@7)dC@7ñ @7ñ~+fÞÖ@8`Ï!~£ˆ@8Ïâ\ÄÕ&@9>¶QEgN@9­Iz½[@:š\¹1•@:‰§‚±QÅ@:÷o€$^S@;dð𯀤@;Ò*x$¨@[Ux=´­@>ÆtJþ ì@?1A‚{³ñ@?›¼îØ@@ñtÅ€C@@7Ú‰Öª½@@l˜Ë×@@¡+Ä<¼Û@@Õ“Ëð5@A Θº<@A=Ü“TÄ@Aq¾ªV;@A¥rFy¼$¾–²>œYþ?d¹Ž?Ñ»»@½æ@Vµµ@ˆ0N@™Tû@«¦&@°~Ý@³áœ@»×@Èl[@ÏHq@ÔBƒ@ÝÙ!@ç [@ÜÈ@Ï%¥@ÂM@”`y?¼)÷¾u¥t¿b>¿Ã~À¦À ÂÀ QÀÆ À(ûTÀJhÀj3¾ÀˆLÅÀž­“À³‡LÀÎY{ÀèÖ½Á7PÁBÕÁ!ÝZÁ3º¨ÁF%¼ÁXðPÁlÍÁ€JåÁ‰FÁ’/ÄÁ˜òGÁžÛ‘Á£€Á£úÁ¤’&Á 9{Á›-UÁ“ÉÁŠ–Á€ŠYÁk!îÁT(%Á=ÀÆÁ'àÐÁë ÀüG2ÀÕ4hÀ®»Àˆ´kÀDA´¿è•¿€­?*ëR?å÷m@3#‘@mý@Žv7@žSÞ@ª‡G@³@³‘È@®<¨@¢s@—¬ @q%@„s@vóî@g#À@XÌÝ@Kœ@=§Â@4ª@4°@6ð@=ËÎ@J|Ý@]>Ž@np@€@Šz³@‹Ú@ˆfu@„nu@Ãa@€¼½@j­@ƒþ×@ˆ¤ˆ@‡%>òîD?zH4?¸Ù@ã`@6„@rk@”§Ñ@®ÒY@²êM@³Õ@²¥@±‡•@±N4@µ›@¹:@¶‚Å@Ÿ.N@ˆ®@Ze™@OðF@z?“$¾]¦¿i7D¿ÄÈù¿ä·T¿úQ…À dÀ›ÅÀ@,ÀeJ§À…‰À2À¶»cÀв_Àð ÁŽ4Á€µÁ*iÁ~.?µw@#ÓŸ@_°=@Š%à@¡Õ=@±µ¨@»˜x@Á;Þ@¸³ù@¬•q@¡b~@—0Õ@³G@„©n@wÿ;@g¦°@YF@KOÓ@@~à@:3Ô@9N¨@=¶,@Eà—@TH‘@hJµ@€YG@‰Ç(@Šk@†,Û@‚Ž@€-@{·^@zSÛ@{`G@0‹@‚í•@s×?N%•?Ÿž?ßÄ1@“@R¾±@„ò@”°ø@¥Ã@¶M»@±0W@©/@©<@¤ËÉ@£Ð@ U@€Ÿ@c6²@QM¤@*Æê@X”?¾qÊ>üž`¾V-¿b¹¿žÅ5¿È²â¿îË À.)À.5ÀXpÀ‚ØÝÀ™qÀ´šÀÒV^ÀòC9Á ”ÁÁ-ìÁ/ÀÅÁCKÁWy³ÁlÍ·Á€ñgÁ‹LçÁ•1äÁžuÁ¥ðîÁ¬¦‹Á°o´Á²pÁ²IGÁ®’@Á©E.Á¡ zÁ—ËÁ‹²ãÁ~ì©Áe®ÁKÙ|Á3ZBÁ¦ÁµÐÀã^9À¼HêÀ–­ÝÀbË•Àç¶¿ÚÀ=….? ·—@t@Zdœ@ŠÑÅ@¢!D@µÖ!@Å:¢@ä@»U0@²bÜ@¨û¥@Ÿ«+@—:ô@]d@‡†F@4Û@oŸ°@`ÓK@T Ð@JOÄ@DÊ€@D3¢@JVù@UâÅ@e|@zi@ˆ=C@‹Ü#@ˆ‚½@„µ@y—@~Åb@~»ð@€ð@zÒ@sD„@~ÿ=@|0{?Jþ?¬¸´?þ/K@drw@Š^Ý@…h=@¾@¾×@”г@ÚC@‡L#@qâµ@zlç@‡,Ü@!„@,F<@ Œ¾@'9ë@Ù7?ÞÍ8?~–?% c½izå¿"D¿„…©?°½i@"{å@h@i@’ªD@­#@Âì@Ïɤ@Ñü(@Ë­@Áä@¶~•@®ËR@¨à=@£*•@žŽº@šÁ@— ñ@’z¬@ŒÿÎ@‡í@ܵ@}@z‚²@| @‚Xú@‰aÞ@‘èR@›3þ@ŸYè@žý@œ3@š_@˜÷¡@›ß@£µÅ@Ÿ#Š@|·k@sƒ@~àÅ@|0?—Ï?¼Ø@Óè@NÚT@a~E@.…‘@L½ú@]Ñ1@Nù~@&“@®Ú?àbÀ?îÂŽ@yÝ?ø°?™?Á @³3̾”e…¿¼=¿šå¿¼¾í¿ø—KÀ*mÀKà®ÀƒµÀ¡ì(ÀÀÃ-Àá³úÁ×ÁÉÀÁ'í¡Á=¬ÁT•¸Ál4ÁãÀÁŠ’Á˜¤)Á£m*Á­O Á´þ•Á¹ÏÁ»5gÁ¸ÁþÁ²¾=Á©ªÁžÁpÕÁéÁ`‚:Á=­€Áx­ÀôW À¶ÂŸÀ~G'Àém¿\U?*”¢@ e@mk{@¤T:@Ï[5@÷I%A Ð?A—A$­‘A*6–A)ýˆA#£At‚A Ë@úCë@ã–@Òqu@ÆI@¼_ @´ö@°_õ@­ÕK@«• @¨ï@¦@¦†@¨W/@­»H@µî@¿Î«@Ë€O@ÕÑÃ@ÜÅ@ß+§@Þdf@Ý1@ܵÛ@ßO @ç‰@ë\]@¯¨•@…hC@{Žr@‚ÑÍ@„û?š¥?ËÚÜ?òKÝ?Èók?R¼á?xé?s²Å?àh½?Ò63?§WE?~`=?M¦0>|p¾Ô³u¾3©c½sÙ„=ö¤°>k±i>£Hz>åk²>PÖ2½üü.¿jD¿¤¿´De¿Õ;À %À#<’ÀW%À‹¯šÀ¬ýÀÎKbÀðè`Á ¨˜ÁveÁ4vjÁL÷Ác¦ÁzÀ-ÁˆµªÁ“ —ÁóêÁ§gúÁ®¯vÁ²+ÉÁ±‹-Á¬Ô6Á¤g°Á™-üÁŒ" Á|S$Á_ÚÁ@ÿlÁ"’xÁŽÀϘ<À™«©ÀR÷»¿üü¿JÓg>²Ii?¾Qy@+ý@vÍe@ ZÑ@Ã%@äAGAZ¬A™×A-ìA ´A"dA 1)A‚ñAš“A Ò•A›À@õ­µ@ê5@Þ{Ñ@ÒîN@È U@¿’þ@¹Ü@´"Z@±FÑ@°ç@´_ô@»²+@ÆQÅ@Ó¿U@â‹»@íNç@ñDò@ö3ù@ú»d@ýq7AaXA>{A؆@÷ˆi@¸,@cE@‰;Ð@Š3Þ@ˆî ?²Å´?± ?h½ 9S¿ŸÞg¿7ÒŒ>Ù”?qÃ?Ñ—r?óâ‰?Ü+R?¥iÍ>¢3B¿%¿³X%¿„ú3¿”b…¿b…¿J¹·¿¦g¿z)N¿oßg¿°Ä´¿³ä ¿½Óe¿ãóÔÀ [À08…ÀhúkÀ•ûÀ¸íÀÚë²ÀÿÁ¤ÁŸÂÁ)6­Á@ƒºÁXJˆÁnÊiÁÝkÁ‹Ñ×Á•=–Á½ãÁ¤Á¦dGÁ¤+`ÁØtÁ”UÁˆ¬ÅÁx6µÁ^áýÁF §Á-ËÁ8vÀþ‘kÀÑç¥À¦ê·À|¸5À5ž¿î™§¿ξá~?)$+?‹ï@u@\£C@Œ¹é@ªñJ@É%Ô@åúD@ÿ>kA 5ÀAsA[ Aõ‘A¢œA 'uAë«A·Y@ýx¥@óœ‹@ç Ù@×±@Ê7…@À@¸¹4@´"t@±Êœ@²«@·£\@À @ÌÝ@Þ e@êÜ9@ë P@ëáî@õó{@ÿ® A‚NAa·AMC@í:9@À_c@ â\@šà@œ³.@›fÞ@=7Ð@B•@,Äd?­ð¿Œp¿„Í7¼ƒÏí?^ˆw@ I?àmÉ@ Tª@À˜?ý"‚?³û>ÙLU¿f½9¿ô.€À½IÀåþÀó‚οÈNÙ¿¶è*¿µ#¿Åq‚¿îÒ§ÀÿÀB¦lÀ}Ø À ÆÀÃQ7Àè]ÁÏÂÁÝhÁ3Q¦ÁJm¸Á`ÚáÁtÜDÁƒ]Á‹mÁ’¨HÁ˜6¦Á™÷¨Á—"ÓÁ13Á†‰,Áw'‡Á`÷¡ÁKÓÁ7 æÁ#å Á?½ÀùUÀÒT‚À¬‰ÏÀˆCWÀLÕ&À½¿¾šø¿RŸ¡½ë:I>å<ô?‰ÏŽ?ëÖý@43Ì@q÷€@–žŒ@³ùf@Ð@éH4@ý«ùA¶)A ¥ÐA uïA ÓA ,çA  A>Aƒ@ú>ç@íe@Ü‘@Ë`"@½ÇL@´YÞ@®#8@«LX@©bû@ªdX@¯Ÿm@ºCŸ@Ëóˆ@Û|7@÷Ù@âj@߈@íé@øu@þ Õ@ô<@Ü/`@Ë`c@¶«†@±ú,@´Aë@²ê@ƒhR@‰*V@‡­E@6„ݾq&P¿ f >Ì´U@$| ?ápô?²ÄÏ?ÕÓÈ?¹Á?—¢Þ?@ËK>.»ï¿ý¥¿…ÂÉ¿Á5—¿îô$À^a¿óÆ@¿¶d•¿™Ç¿§Öí¿Åaí¿ùÀ"«xÀTçÀˆrÀª-ÀÍÜ­ÀôIÂÁÇDÁ$nÁ:vŒÁOìÂÁcïPÁuâÁ Á‡ŸÁŒEyÁŽ'ÅÁ‹ 9Á…TÁx-2ÁdŽBÁQЭÁ@¸!Á0b²ÁP?Á ×çÀòGÀÈuÀŸwÀsDÀ/FÀ¿ë"Û¿‘¸ ¿ÉQ½µ™%>¡P?eÕµ?·z@ #@7o@rë9@–އ@±€c@É$r@Ý­<@ðY7@þ<AÍOA )A _yA Q˜A MõA•A(@ùéT@ì0Ä@Ûît@Çß'@¸6…@­Èö@¥þ@£×@£ðw@¥™k@«B @µÜ)@¼Àv@­OÙ@áè@êu”@Þ@ãŒ2@ë…€@ðå@åý@Ï^¼@Û[Ì@ÑU@Î]‡@И@Ï/í@™¬Á@ž¸Ù@•@nÓ?ó>=Ïö? Ý@íè?λ@2€@Cš@?ð›‹?µñŒ?Z Y>‚4¬¾Nïu¿*¿YQu¿…_Ò¿‰ò–¿s ®¿{Ô忘<ï¿Áâ_À4µÀ, À`o‹À4?À±ÓuÀÖ JÀý¢Á`XÁ(1Á<0*ÁN»5Á_¯ÁmåùÁx®žÁ€wÞÁ‚Á®ÁlnÁxJ²ÁhëtÁXAçÁH«ÆÁ:ÓìÁ-ŠXÁ˜µÁ ÍßÀðPÀÂè[À“¹4ÀN–|À$‰¿‰Dá¾ìxĽ ¡Ð>@~Õ?,zW>íxå?€é°?ÕÙö@,ó4@QU@„«@ Àx@¸é9@ÊÛ@Ø©|@æÜ@óí@ý íAxeASDAµÍAàAeAo@õÓÛ@ç(;@Ü”ò@É‚\@·Ç@«ä@¤o­@¢‹—@¥N-@©ñÐ@±á @¼Ÿa@É@ÉÒœ@âž«A(y@óáM@è¡0@éû@íW’@ß”e@ÊÂd@ð°å@ñTB@ïw7@ñÌ@ðNÂ@¢ú@¥ºÿ@ U§@…7@æg?°…ø?‘,ï@ ö@<é@-&@027@$fÐ@ìÅ?îAù?±åŒ?l•? ÇÇ>‰þ==“žÜ:¾³G}¿CW¿=š¿…ÑÙ¿ºNÀ&ËÀ/dÀfAYÀ“?ÜÀ¶Û¯ÀÜODÁyöÁÜÁ' &Á7´ÌÁFòÌÁTçÝÁ`ÈÁi>âÁnÓyÁoJpÁh­Á]+ÁPÆÁD[Á8óPÁ. Á!¼Á€ÀùRÀÌÀœ%ÀXäÀ³¿lðR¾šu¾\é? Ú>¨Ï?  ?§g?aUX?àל@=ˆ…@z ¢@™u–@³Î¯@É*¾@Ù7¬@äA«@è @ñ@÷Îù@üÖ9AµAÝAAÍ@úÅð@ïhä@ßÍœ@Ô9ð@Èuƒ@º0f@®ôa@¨Œ}@§æÖ@­Õ:@¶H@Ãb@Ìè-@Üy»@ëS@ò£‡A×UA Í›ANè@õ=@òJ@á³ý@Í]ùA-A ú¡A #RAÎýA©@ž¶D@¥û@ È@?4@\ú£@"5q?þ#%@ Ç~@Ò@,ÄÕ@,ê,@$ Ë@ën?þ2`?ÏtU?¢7?z#Ç?G˜­?„>ÎŽœ>e–¾Fß¾ëPk¿WÝ¿¦‰¿ór‚À*n]ÀdTkÀ“w)À·ÐÄÀÝ3ÂÁ"Ás•Á!ÒmÁ/pšÁ<ÆÁGcÃÁPÐ9ÁW«oÁZóÁXÓªÁQöÁI=EÁAp‚Á9÷'Á1¾`Á'ÿÁ5ŠÁ`Àà1À³µŒÀ‡¹ãÀ=Yí¿ê*ý¿“„¿À­cÀ‘–¿§q¾!Úâ>W¡±>×2É?fH~?ÛÖ\@,ÜÁ@sdr@œ?@´Ç.@ɶ—@ÚËÖ@ï @ûÅAâOAUA5`@ýзA(AÀ@ÿ@øKP@ìN@ßá@Ò£@Èì·@¾çÅ@·1@²NG@´+@¼Ý@@Çáé@Ø z@æ79@óõ½A-\A¸APŸAéA4«AÎV@ý>ý@èãà@Ôí0A“ÈAWeA¤eA#eíA"•¥@—:@œ(@ž²@’í@|‚é@T¦@/;I@S@Í@"€"@ €Å@žD@ Šr?ñšµ?ËÅ®?¬¼?‘Èœ?“?j»?>ј?Ó]>mÈý½ìQ¢¿£Œ¿ÿ ¿ÓbñÀÀYâ=À=(À³²¿À×Þ¦ÀúÁ 5uÁ6ÏÁ$±©Á/;Á8ÔÁ?àYÁEJÁFó3ÁD™ÏÁ@«öÁ=´xÁ;=Á7…Á0–Á$q½ÁÍiÀÿ=ÇÀÓfÀ©.-À„AÅÀOñ×À,ÓaÀm4>À§‹#Àf çÀ1$m¿Y¬ :â¾>Ýn?—ÄH?Ô(¹@;@TÇ»@ŠU@Ÿò@¶Ï‚@È/1@Úi~@ó¨eAZ£AvfA¾Aù¢@üö@þE@úË@óád@ì¹@áLŽ@Ö•@ÎÖ@ÇÆÝ@ÆÈÛ@Ævz@ÊL]@ÔÁH@àè@î…0@þ4‚AÜñA --A )iA4`AÀUAã³AaA£]@ôw@àGÅA!‹YA/:œA1A5 ÆA4Ðç@Ë@‘M@“Ç @‰}â@wt@d r@E±@+0]@á@ÍÈ@] @Å3?ùpô?Ú?·Y¢?R¡?‹e?ˆ”y?‹÷ð?}R9?Të9?!2 >ªöW½xú¿Hο T±À‚ÖÀEÿMÀ…î§À©œ—À˼UÀêÒÅÁÓaÁ#LÁØNÁ YÁ'rZÁ.BßÁ2¯òÁ4 ÉÁ4PñÁ5« Á8GWÁ9Ñ‹Á8`¥Á2lvÁ&”’Á¡ÁÒ­ÀÔÀªeXÀŽmÕÀ„ÓÀ£ ÀêW’Àê©À‹™ØÀC b¿Àé´¾úA•>Î -?¤¨‹?ÚÒ¢@޶@/ @R„G@z‹@‘f@ìÀ@üø×AtäA ?AƒØAÄ AÊ[A¤¬A$Aª@A1A L[AÅ@í˜ÎA,ÄÀA= TA@¨’AEk•ADÏ@bÝ@…)@†to@pË~@Zz@ZYÍ@I~,@2jÌ@;+@ U@¹‘?õB™?à™R?Ë¢?­}…>çá^?2y?œ†?’Wá?‘eô?‘hò?Ñ€?tBG?¥¦=7‚=¿2h¿ÌžµÀ(MÀn;›À™g?À¹K3ÀÕØ‚ÀîTÁïÿÁÌõÁ>¿Á±¥Áô2Á )Á#IMÁ'ÈÁ.[žÁ5E@Á:YÁ;[pÁ7„¥Á-2Á!ÁqüÀá§•À¹Å À²r}ÀÁhxÁŸ¼Á$ÀêVäÀ¡®TÀN  À éú¿¢{8=’À?mJÝ?­·?Á3 ?ìd@ßU@- @IG@†@¢³C@Àý@Ø…Ÿ@éñ²@ó5D@ù@ö`µ@òE@ðt@èº@ß·w@ÚGK@Ø1@ÕëV@Ù@ÛxY@å)Ä@ñt©@ú‘AÚàA êA{:A˜AÝAPsAœA:Aç›AëA0­Aåó@ú7žA6„ŒAGö˜AL³µAR~ŸAQ´¼@i;0@q.…@q¤õ@N%@7å¤@Fù¤@D©„@4»@iË@bº?÷‘{?ådÛ?ÐFë?´6x?Œºd>¯²U=Òád?‹#R?O‚ú?’…ò?Åǽ?÷»D?þë?Ñ&l?x|€=hæÒ¿sŸÞÀDÀFG&Àƒß²À¡ÓÀ¼UnÀÒPÀâÿpÀï$ŽÀùÉmÁ¨Á KÁÁ1%ÁÛ½Á'1.Á0îRÁ8< Á<“ïÁ;êÄÁ4ŸÁ&àÁ‚“ÀúšÒÀÙuäÀêù…ÁÞYÁ,¾”Á ÿÀã @À´UØÀp™þÀ&Q¿É†¥¾x¾÷?L1Ò?¦+ˆ?Î’æ?Ãã?½¾s@ ú…@1ä@e¾›@ˆ^è@¥F0@¾ @Ñrú@Þ\9@éöy@ê_D@ë°ž@åŽ×@ß^f@×ý`@Ô5¢@Õ6]@Ö†í@Ü.@@â´m@ë9R@õ}äAnæA/UA =AОAbA¥}Af}AÓAoÈA¨AñA®¢A'žAÆA=ñâAPcˆAU×­A\²ÏA[î@Oo¶@XSm@U[”@.B:@‡@5Eß@>Að@4 ñ@ôð@ˆ¯?ô‘y?á%ß?Ë?©ú2?e/y¾{v¿vºë<»žT>H>ß?7UÑ@;¿@Iï@b3f@V• @~u? à¾,…Y¿£«ÚÀàÀSåaÀ†jxÀŸ#[À²©7ÀÀ1¹Àɪ[ÀÓ0ôÀß@-Àë¡bÀø¡„Á'1Á}OÁØçÁ(`³Á1θÁ8ÛAÁ;_Á7€…Á-DÍÁÜ•Á =AÀþÓ¤Á †*Á94Á-tÁW&ÀÙ’vÀªçÀv"yÀ.=q¿§ÿ¾1]ô?.Œ?¯Îé?á5š?Öï2?À)~@|w@0Wì@UU…@w>@‘•²@§Ó³@»@ʵ @Õ.‡@Õ(ö@ÙÎ @ÖO@Ñ@"@Έå@Î1}@Ñ'@Õ8¬@Ú…/@â7@ê#~@òK@ü¦‡A‘ÊA [Aä”A°¨AÏEAÕØAâA þA s¥A%âA 1©ARAFíAC?‰AUTåA\ØçAdXÛAcœ @7Ží@?6æ@9ï_@µ@ m®@(ÖÏ@8zh@3È=@ OÇ@ Ux?ùe>?æ-9?ÐÒ6?­y-?[ã½¾ËwK¿±HÍ¿‚®>¿;v?ƒfz@lëµ@ŽÔÌ@¥ZÌ@¬õþ@fëÒ@ vö?=Ÿ•¾çÎU¿¼BÀEÀPUâÀ~xÙÀ?jÀ›UÀ¢ÕéÀ«…—À¶á&ÀÃæÀÓ­}ÀèRÁrsÁ ±Á QÁ%%Á-Ù—Á2-Á1r˜Á+èÁ™kÁ\EÁ®ŒÁ%šÕÁ2«Áý'ÀßpÍÀÏç¡À¤À^saÀÏU¿™¾Ý¾ %õ?A¦?°(??î`^?ßNc?úÃé@²§@>Ñ‚@]8O@y^@Œ§@”y@¯“@»wT@ÁÏŠ@Á*?@½n‰@¿Ù]@À¶Z@Ôc@Ç Æ@Éõi@ÐÖ@Ö#‡@Üb»@ât\@é'@óáÕ@ü¸A²õA J¸A Ž=A IA G»AßÈAfÅAc.A˜A-AA±ŠAFFÚAXF«A_J0AdÌtAd¢@*d8@'Òh@")ã@ÉŒ@f0@!Ý@3²­@3dœ@#A÷@å5@1’?ó¯‹?áÝ?Ãe?ˆ-¿FnÀ¦å¿Ax> ?0÷¾@0É@ž¯9@ÆoØ@Ö­2@¥?é@ZQv?Û«>ËeE¿Ðß¿½]äÀ³›À<ùÀY+=Àjm”ÀwWÀƒ sÀH&ÀšŽ`À«µÀÀóuÀØûyÀòo ÁËÇÁFÛÁÒÕÁ îÁ!"Á·õÁ©»ÁiFÁ"·OÁ3BxÁB­=Àå;DÀÖ!ÀÎ:À¦N.À[S«À f\¿ž a¾í°ä>ÞqÛ?•ÈÔ?Ñ´¼?åd@b“@/ @J“¡@dÁ@{ƒ @ŠŒø@–gÅ@£¬~@«%Ö@°À@²À½@¬•ƒ@¬$“@¯º@´ö.@»@}@À¥@ÆœÜ@Ëâ1@ÒYr@Ø¡ö@ß#Û@èaN@ð™$@÷°A2Aá…AƒæAŽº@þk@ýWA9QA&¼@ÿ‰€@öüA¥;AH ½AX3‰AYQÝAXAWè¹@$wú@ PÝ@s}?ùck?þ_ë@º@/¢Å@2´˜@&ÍÐ@)@ ‘D@Ø?ù:Û?Ù÷v?˜Úm¾yÀRH¿õÔ¢¾úe½³¡f?ê×m@Â;Z@âɇ@ç°ù@Çíõ@‚Ä@ñE?—jz>Zñn¿ïb¿¨Áí¿ó±íÀÀsÀë(À(hgÀ3²\ÀDòêÀ^¸¼À€ˆFÀ”ãÄÀªè¥ÀÁë¸ÀØíÐÀî—…Á©£Á’¼Á@^Á úzÁÄ'ÁÐùÁ9Ô*ÁA «Á5ŸqÁšmÀü–àÀÏ/×ÀžrÀWÆ]¿ú‰w¿•FÖ¿Lv>9½?n`$?ÊŸï?óËÕ@ø¦@DˆÄ@VÆŸ@n(ž@~ˆå@ˆA!@“bQ@šÉ5@›˜é@ž!"@žÑU@žçi@žÝ)@¡ÂÐ@¥à@«õÓ@´Š @»­h@À×@ÇhZ@ÏT@Ö'@Ü+÷@ãÒR@èÐt@ëÑ @ïo.@ï3‡@íÕ@î¸b@ïï‹@ñãN@ó¬²@óÇ@ð³)AÁAG ºAPhïAMTALFg@/&@Ý.@ ºZ?ôÄ5?®úõ>‚†úÀ µÀG¢+¿jFd¿U@¤@ìj@ä [@¶ˆœ@˜ân@nÞË@5s©?äþ?k“+>WÈ­¾ÓÁ¿dý ¿— û¿©P¿´Eõ¿ÁGo¿Û ´ÀÒÀ%©ÀIòÀoû½À‹JmÀžréÀ°úÉÀÁê”ÀÍ«éÀÓ`%ÀÞç·ÀþåþÁA ÁCêáÁ@”Á-wÁ5Á ªÀÏòáÀ“½0À@K¸¿Ü™r¿ŒBþ¿$Äû½ªž¨?+?µÕ¸@è;@&ÔŠ@Ol@`|@n·+@w¾î@€½4@Ž]@•¹¼@•¿x@P#@%°@R@‘¿:@–%@™Œ@Ÿ*€@§l@¯@@·˜H@¾3 @Ʋ5@Î&Ó@ÏŽ•@ѯ@ÕÝX@Øp_@Ü@Ýè@Þ¤Ñ@àÌ_@äì~@æˆi@ê{ä@íò@ñ&AÃJAAvµAF"cABr`A@¹GA@U@)E@ý…@Ÿ•@ ™;@Æ@!RQ@+l'@2,T@0.M@'ÆJ@!8@M@J@ êÛ?ÕW¶?#«¿¡8À"’ Àž[À00促Aõ@ Š@9æ@/¸@6 :@Jþ@9>@ Uº?Á^B?oÛ>á ñ=W:½òØË¾D"¾R¹`¾bྫX¿! £¿‰Xü¿É¨À¬ŽÀ!qtÀ>8¯ÀZ’sÀuøàÀ…Ì~À™ãÀŸ]+ÀÐeÁ¤FÁ8š<Á>žåÁ*ÁpÀüqiÀÆc À‹¡;ÀÚ‰¿¯é¿cT®¿ÿ ½õv™>õ‰Þ?¨@@âÕ@.øm@J—Œ@cÐ@f-’@i=G@kàë@€Í @‹F‚@•Å@Œ®h@†æõ@…·†@†)Ë@ŒaÕ@’·[@š%é@ ÍK@¦´i@²ED@¹(@ÀÕ@ÅÅ­@Äï“@ÃÎÂ@ÆU@Ë?0@Ï ß@Ò¡ÿ@ÕeE@׎@Þ ž@ãS{@çµ@î)å@÷”9A #ãA;YýA<ÅIA8yAA5ícA5£@ËØ@êR@Ô)@ ²-@¶3@)"¥@-Gv@4]¶@6“¼@2^Ä@.äÕ@/¶@.d@%}•@ ÌX?¯6-;²e¿ÄÿgÀ"IÀ2/À"ŒØ¿µaT>'Ü?ÃY™@Ÿ½@6EÁ@8àV@Ƨ@G’?ÌO?Ÿ/?`?bö[?c!¸?tÒ’?„êh?„¾?Vþí>õad=|m]¾¥¿&… ¿qî—¿ð ¿ÂBø¿á»XÀ‰À(¥TÀažÁ­qÁ*n§Á"Y=Áö†Á ó&ÀÛO×À­ïnÀ{|Ç¿ñ™G¿k|ɾü¡n¾L=Šè ?&4Ö?ÃAÐ@}@>äS@S‡@fÊ„@fÅ™@dü@cß@líî@zšr@€- @‚›e@€ˆ@}FÂ@~’@„p%@ŒCƒ@–Å@ž”@¢á}@®tÏ@·8ÿ@½Õ@¾e®@»2I@¹©í@»œ@ÃÛ@Èù@ÌB0@Ï^¸@Ò.@Ø/í@ãx>@ê.k@ó4ôAXAWÚA4ì¤A3t(A.øA,yA+Ò©@1ü@iZ@¹@£™@)™4@3ˆ@2Ø5@9ŽÆ@>Í@=„[@<˜V@?u@CY@@Ϙ@2 ¹@Û©?¤`=Q \¿|3{¿¾Áø¿ÇY¿€†-=“7?©úM@ ÑÙ@0­@=E @2™9@Ž5@ }­?ÿK?퇰?é—p?óQÝ@’©@[@E0@½Ö@Ðâ?ÜýÍ?¶øu?›²t?‡Ù?nŽ»?SgÚ?AdL?!ê= H À¶RÀÎÔYÁÃÏÁÕÚÁ fÀ÷ ÀÁ×Àð…ÀCcz¿¯z¾ÜîÅ=[N>š)0>ï6÷?ƒ‚…?÷j²@1×ï@St“@bkÉ@gÅe@s8g@nŸW@naŽ@mõ@mºµ@mÞ©@o¦í@pýM@l_@n—@y`>@„4š@Žåe@™Å@ž õ@¦^Î@­•@²YÙ@´>@³Vß@³4D@µ"ý@º‘æ@Àh§@Ça@Ë»@Ð@Õ@âQJ@ïÔ@ø¿ AkLA¦åA-KA)’kA%šA"ÍÂA"¶p@m@âP@±o@eã@3Õ+@>½½@ŸfÀ‹mÀè¦wÀþ‰›Àï¬nÀÐèÀ­ÙÀrÕ}À >A¿;dŠ=ÿ?D?Ö?a%¿?ŠK¢?Å×@€x@K E@jŠ«@pͲ@h_{@x¢@}ÌÍ@}¥ž@z {@q‡[@ms@bc@d @c&t@eX¥@oÉÕ@S^@Š5—@•*¥@š2»@ŸŠ@¤ªî@§–^@ªCÄ@«ÿ™@­ß–@¯I®@³E@¹@Á ‘@Æñ¢@ÍÎò@Öŵ@⤲@ðŠP@úODA¼zA€tA$QAåâA(Av*Ax@ýs@M@öE@Ú|@>Å@Kÿr@Hñë@MäÒ@T¡à@Vö@Yóá@ac6@iÕ @me¢@g3@Trû@6^@?ñ+?„Ž?c>)?Œi°?ʤC@‡@8Nç@S|d@`ym@a j@[ãã@W ®@U@u@V‰è@]ž¥@krp@yP@Œ>†@™;Ì@¢ù0@¦dK@¤RÛ@ ­›@ŸE5@¢œO@¬MÞ@»Í.@Í0²@Õß@»‚j@7‡¿Û¡ãÀ–£ÖÀ¿}tÀ°óŸÀŸR5À‹/}ÀGL†¿Â¾-¼ÏŒp?%Ij?—õ?¾f ?çNÔ@Œ‹@8Oó@gY’@‚Vm@„,@~ÑÔ@‚r£@ˆ) @ˆZ@‡4@€Ö.@wSd@aÖõ@]0 @^Îd@dÓY@nu@xj@†±õ@Ú,@–Ÿe@š´ @÷@ž¾Ð@¡«@¤u@¦ßX@§þ@¬m@³ÝQ@ºã0@ÂÔ@Ì“¾@ØÚ@å]@ðm@ö¤­@ý1'Aß¡A½A^¦AèŒA ÿ²A 5@,W@(¦@ ý@I}@H!@XeÎ@V‹Œ@[fT@b¢§@eæû@iŠ@pþN@x¾Â@zô`@sG…@`]‘@EÄ%@%Ø@ç–?ä1ô?ä½µ@w@ÒZ@B @^•Ø@rÕ„@}”'@ª)@}u€@{¤@|sý@€$U@„ïE@C!@™a@¨Jš@¹t5@É:º@Óþå@ØËf@Ùý®@ÛÏ6@ä!U@÷ëiA EhA.ÏA±Aáû@£…2?XÁÔ¿Ú ‚ÀEÕ¬À[TÀS‹MÀ-í}¿ûX§¾þÐ¥?ÓI?™w?ܵ%@ 0&@&„=@Bÿ<@cè½@„t4@Â@’(E@ŠÐ@‘¼Á@”†í@“Š@‘¦@Š67@ƒG@l’¥@\;!@Zë=@`µ|@mT@xg@ƒT•@‹%@‘$¤@•ÜT@—D=@–Êz@—¬•@›(@ŸRÎ@¡ h@¦áE@¯(Ô@¶v @¾ÛÓ@ȹÅ@Ô@à=Ï@êë@îÐ@ð)ä@þ²§A)A  A×Å@õjR@õ®Þ@5è{@0›@&ÅÎ@!+¡@NÞa@`®í@b‚@i9Õ@qÕ"@uÒ.@yN@ û@‚l©@‚9¯@z Ô@e¾=@L;m@2+ø@®&@/Ä@5i@5ÑÅ@RÉ_@o+@‚ß$@ŠÉ@™F@‘S@‘'$@À@‘iM@“Æa@™ @¡íÍ@®“/@¿ƒü@ÓÆ%@ès‹@ùþðAA¤OA h}A×$AšàA2'…A>Ý=A;5ÆA ,Ü@Ðç;@.j?š$±;ÎG¿ ßé¿Ïâ8¿·}¾£Œå>ûym?“sü?å:^@ñe@2ùv@Xºd@y—]@г@˜9µ@¢8µ@£ŸÛ@£‡@¢}$@¢ÖS@Ÿ¦y@™ò˜@‘WÅ@‰ŸÖ@}$G@cݽ@_]¦@c-+@l•N@yÊ‹@€J@…b•@ŠŸÑ@Ãj@‘’¼@Šô@•@“äô@™®@œ6v@¢û9@«T@²>·@º)@ÃI¡@ÌÐ@Öœ*@ßùö@àÉs@Þ¡á@éwWAåß@õšY@å“t@×·ò@Ø@<Î9@5/,@+4§@'Š¥@N’‰@dE@kЮ@vG@€è@‚ù®@„+•@†-ñ@‡À@†@~¯N@h&=@Nb(@7˜ @*]é@-’Ü@@ѽ@\ŸÍ@{!¹@‹?t@•[Ì@œ•@¡‹ý@¤°@¤£Þ@¤SW@¤Á@§ ð@¬~@´p@À™·@ÑÛ @çô@ÿ A ¢ÅA´AAùµAkôA&UA4K¿A@Ù“A4tÚA,ƒ±A‹@Êòð@YC@ ¨@7¢?H&T>€ >ß9™?ŽE¹?¢‰Q?ì!'@ž%@1Ƈ@X¼¤@‚7Ú@”ðÉ@¢$„@­õù@·‰û@¹Òë@µyë@³ÒK@³œ@¬mÇ@¢t\@˜£@Œ[@‚@k•@i @lÒM@q”‡@zœ[@|¶Ù@€•µ@„âp@‰ôJ@‹ÎH@‹WÜ@‹ru@Ž1¯@”›%@™Î @¡è@©µú@¯ñ0@·×@ÀkT@ÉíH@Ï %@Ò¿§@Ð(Ü@É‘@Ðõù@ë@é@ØDŠ@È=@ºÒ½@»Mõ@A@7ÖE@0Ö@*÷U@KÃ9@e ^@sCÍ@,Ÿ@ˆý@ŠÐY@‹¢˜@Œ¤æ@ŒéJ@‰Ì‘@Š @jD»@O¯N@;AŸ@3¬i@=æç@V½U@w7@Œ†@›Q­@¦#[@­ñ@³ÆY@·pu@¸¾š@¸Ÿ@¸»}@ºn~@¾º@Åf@Ϩ@ߦ@ô5Aö‚AôNAªýA$–‘A)â5A14(A3-SA?ë@žå@‘ý@è]P@¹WŸ@zÏå@B¦z@j±à@"\Ž?Üêæ?é^¾?ý»=@}@­”@= +@V`;@y¾p@“ µ@¨é¢@¸Å6@ÂÌC@ËH¡@Î} @Ç0ó@Äv@Å@^@»[¶@®C¦@ ß:@qö@ƒØà@r¯­@p.@p›R@u P@uN•@va€@xË@~åE@ƒ©2@…åù@… [@†&ï@Š„@‘åî@˜1V@ _Ç@©CÒ@¯AÎ@¶I@¾=@ÆØÑ@Ë•®@lj«@¾„ë@³¸Ü@¸\Ù@ÏÐ;@¼ó@¬ @ž¬ñ@ŸA@@Bžî@8W@6CR@.òÃ@Kß@g.’@zcå@†Ñ™@ŽÞí@’3Æ@’Þw@“n@’BH@ás@„Xã@n—@SXô@@z@;‰@GëÍ@cá½@„F'@—ˆ×@¨YÃ@µN@¾—h@Åâ@ÊÐÂ@Í+ý@Í @Í=@ÎO?@йÎ@Õqí@ÜõŸ@èêÙ@ú”A.¤ADA.äA&A*IºA0ˆ|A!Ôò@‡q@FÑ@€€í@àØô@ÇMt@£V„@ŠTu@Ž{I@sU5@:T™@>æk@0$…@0|‡@E¤@b“F@~1@íd@¢?Ø@¹:ü@ËÝ>@× @ÝôØ@ÝJ¤@Ô–q@ÑI@Ñ0*@Ê8ë@¹¾!@¨ÄÌ@—@ª@‡²®@~G@v£'@qF}@py~@jZp@g+@i‘«@sDb@z²5@~SG@~Í’@1ø@‡Ö@ƒ @•]~@žÔ@§QA@¬„p@²³©@»&ö@ÀN@¨@» %@­ û@Ÿaé@¢˜-@¶M@¡ W@Ñ¿@ƒF‘@ƒòu@CŽM@=»T@<„@4h÷@P>v@kÎÄ@ ;@Œ+E@•ø@™x@™ÎÙ@™ˆ@—á_@’‹c@ˆü@t^$@YS.@F&L@A@¬&S@³~¬@°›ô@¤È±@æÝ@zWÕ@aúõ@QË@Yèü@fn©@™?½Ò¡?§2?ÝZ@y«É@sØð@kŽ@b\*@qlp@B±@Œˆ—@™³”@¥H@«‰b@­ 7@­D]@ª«s@¤1@™å@‹MO@yžÄ@b¶¯@[Ý@fyN@Ê@–˜Ÿ@®<$@ž@Û:•@íÀn@ýÂA…A ¸A uùA%œA»h7¿)i¿!`@@†®@ƒU@}Ò@sÅ@|7Y@…f'@à@O}@©d­@±_@´(@´+@±¯­@«mœ@ àÛ@“r@„NW@o—@et²@n[)@„gÊ@˜ ]@¯9@ÆÞÊ@Ý4É@ñAA OALÙA˜ÛACAgŠAÎòA7A£!A4ÐA|AÜnA¦YAàõA )A Ü(A£¬AmA*zA(âàA-lA˜@à_½@ØZü@Þª¾@ᮕ@ôâòAáóAnKA?ÎA%PAM€A /yA+zAêA ÿôA%{A#ð3A×Aü~A ô@þM—@ç¶÷@ãÅð@߃h@ÒKê@¿R–@¬gÒ@&Í@’V@†Ø«@wýò@b -@Pžñ@EIC@=uA@A£@IóÊ@T¨;@]~6@eͰ@jŽ@os„@|¾”@ŠM@™Tÿ@ŸÍ€@šdU@Š"E@k–E@Fw^@èc@·A?ë·9?â¾l?·h=Þ¿sOç¿îñô¿êö@dE@Œ»­@‡á@‚Žó@„¡@Š`ˆ@”v@ ôk@­’:@¶gù@º„X@»3£@¹ø@³Nl@©¯…@œŸt@ŒÚR@~ û@pBò@u÷@†+@˜m‰@®­Ó@Åîõ@Ü7ƒ@ðr0A5A A A¨*AkíA),'A+ŽÄA+< A)½ýA( ñA%ø^A#mHA A`MAq¬A)ŒA©¯AÎAZ~AXïA)?Az@ö@ÜsÕ@ïJyAZ,A …¾AØA%}ZA&fA"¼AýßAgAµ–A#GA*˜PA0lÃA2ÃA.e¦A' AªèAMMAFî@ìýÔ@ä»î@á´ë@ÕÓ@Ãó@­ÝÕ@™²Ò@×@ƒ›@o 2@Z;B@HÌ @<ä@45@4m³@; @Høò@U/@@`³@fЀ@m »@|W”@ˆRf@“@v@‘ŸR@‡gN@gé@8åÓ@wj?îœu?µ[,?‡UÚ?Z1>œ§¿ŠñàÀØrÀCƒŒÀAsœ@™ë@•ò‚@‘«­@Žy@Žü©@‘£ß@™c@¥I @±÷=@»¹X@Àé»@ÂX@Àº7@»¸ @³EÖ@¦É/@–@‡O…@|ô@{m@†æY@—£„@¬Ìp@ÃZ@Ù8@ìNþ@ýfÂAâ¥A÷ÚA(W}A9½ËA7<ÅA6öbA5³»A3ãA/‡ÞA+iA&ÕˆA![ A1uAH¥A åA§AA,SsA8A6PHA¹@ó;é@öŽ-AþEA"Ù’A,œSA=f¢AJ#†AH 5A?±kA7P¢A2d^A2ÛA5íPA;- A>«ÙA>˜XA7ú A-,~AÚÌAqAç@ó ×@å‡@ßœ—@Ös©@à›@¬€½@™‡@‰Œ@zÍ@eÜ @QÎ=@@ Á@4[³@+í @+ïï@2¼±@>Œ@M:^@[Åå@e¥@l"@|ëð@†£@ŠÐ@|D@Y, @0n@ `‹?Ý8?¤rÚ?6Ï>„*˽“-¿QsÍÀfíÀQXTÀ‡À†ñ@£î½@ŸÉ@›Ñi@›ÖX@œÅ@›Ä@ ÍE@ªù @·@ÁSÇ@Çoì@ɘh@Ș˜@Ä„…@½m @±Î×@¡—ÿ@‘ ^@…=õ@°@‡»E@–š@©“í@¿'¹@ÔÄ@æMç@ôïçAgEAFmA6PŸAA©A=ŽA>ÒA>#¶A;g®A7ZA2¶A-qÅA'ÖÛA" ºAÿªAa“A'…sA:û°AH¢oA;ÔoAbA ¬òA×çA*¸éA?‚ºANóÁA__¦AiÕ¢Ag9AYîxAN$UAG1kAEX÷AGP½AJ‡AK)KAHA>½¤A/ø½A áÍAèàAž5@õÊ›@åÌG@Û¾ü@ÕÀM@ÃT˜@ªÐ@˜P@…~@pb+@YF­@G @9º€@.ß1@(!õ@&ÙÈ@,:S@69W@F@V/s@bÜ@i³9@x?^@€ÞU@{D½@WÞ@#Š ?ó›ä?½y‘?ˆ¦Ë?9.=I£¿ á ¿€2x¿ô:‰ÀTÿ¼ÀŒTÆÀ¨FåÀ§6¨@¯Ï@¬è@©èt@ª&g@«@¨«®@ªÖé@²œE@½€%@Ǩç@ÎYý@Ñ»@Эh@Í›$@Çç@½Œå@­îr@œ“œ@ŽT•@‡>!@‰Is@” 7@¥›@¹Q€@Íœ#@ßI†@ìý@ôÈKA|üA1ŸqA? æABg1A@Á A>/BA=ToA;`A7X_A2ÓóA-ÐA(î”A&lA*FA5DAGº£APwÚABkìA.]A)é­A34ABÄjAV{AfêÀAr¹4A{µýA|§Alù™A`,?AXâeAV~PAVdÛAU£#ASŠANÀeAB£A/éþA}A‘A€@ôç•@ç'@Úùf@ÒÁ’@ÃÜA@®Î´@™yÙ@„Š@jMr@RY>@=ýä@5ÛE@/†;@)>ê@'ËÖ@)Ä@0 ;@?n@O³@YÂà@a?@hfm@g  @TÁ~@&ãT?ã_$?’°¢?>Çø>ÁqÊ<äãU¿®ª¿¦¸Î¿ñúŽÀ:{À‹5À¦“äÀ½¶’À¼±U@½‰5@¼: @º¯Ä@º¤ª@º_ @·`@·…2@¼¬w@Å»„@Ï1o@Öï@Ù(ú@Ù#Ë@ÖíY@Ò™…@ÉÍÿ@»_.@©Ñ@™Ž-@Žê@ŒfR@’ŽË@ ]@²Sï@Æ4o@جB@çȰ@èmþAõ+A ¯A1q§A<˜ÕA2sA3ziA7ÞA9µ=A8ÜzA62A2ˆ A/A-áCA2}A>‘žAL#÷ASlAOìAJ–rAJpnAOãÅAVÂ+AdsAoÓAvnA~Å„Að¢Aw²bAlªëAfñAd›äAb]A\Ú]AUº3AO5WABÞ÷A.(~Aq)A ŠæAÍ\@óÀ%@èD`@ÛŸ @Ï—ù@Âä§@³¢@¼@…Ó@hn @QŒÝ@?3¹@6¥ @3¸V@/±<@.Ùë@,E3@.+½@8S…@EgÕ@LtF@M¹@J@¥@>½z@'8?⇗?~£¤>×£Ð; Çɾš¿IL‡¿¤ÉU¿ý”@À)M)Àj3BÀžt¤Àº^ðÀÒL*ÀÑVÕ@Í…@Í3@˰@É °@Æ3€@ÅAÒ@Å£9@É">@Ð0¤@Øv@ß ­@â+õ@âA·@à›š@ÝmB@ÖP­@Éqø@¸_O@¦Ï©@™Õ@‘Þ\@’´@›»(@«½€@¿1é@Ó¶‚@ç]×@çŽWA¿ŠAœA„íAõñA}­A$xìA.)A4u°A7IQA7hgA5ÓA3íïA3°eA7š‹A@СAL%}AU$ÝAYÛ«A]"êAa9vAbÚ³Adn€AjÀ2AsÔAw1nA}ÞŽA‚qbA|™ÍAuB AqË÷AoL2Aiú¢A_ûOAT)YAK ñA>W6A+-ÆAžGA ¶õAÆ<@ôÓ@éâ@Üæ@Ï•î@ÂQç@³Ë@œÍE@ƒ“v@hŒ·@VE@F ¿@=-@:§Î@6á¸@6c=@3õ@/þã@3~-@7ÿõ@8»ô@0 S@$ƒ^@ÞÉ?ð2Ô?‚KÜ>|Rp¾|µä¿ â'¿aCÚ¿¾¿Ý¿ùñÀ(4ˆÀRÀ¨ÀˆV)À¯¶2ÀÍÀPÀæðÀå3@Þ}:@Þj5@ÜΪ@Ö¼-@ÏgM@ÐÀÀ@Óx×@× #@ÜÌÁ@ãÁP@鸞@ì‘‹@ìií@êÒû@èf2@âËw@×¼Ü@Ç·@µ 9@¥pŽ@š"ú@•’F@™Þ@§­@»@Ñ^‡@çoÄ@î”ä@üb Aý Aª÷AäA ÛÄAñjA#…—A-3åA3y+A6Â8A7ÒA7Ý–A8e½A;9„AA8ÅAIFAREAZ¤ÉAcOAi¦ÂAim…Ai®AkoçAtˆTAy¿"A}òôA{A‹A{ЛAyÜAvJAmñ’A_çêAOwÁAC×A6¸†A&â¯AÁÞA €EA?¶@÷@@ê©»@Ýž@Ï'÷@Á ¨@±¤@˜ù>@ÀR@gcE@\ħ\¾ÙÌ¿n÷µ¿—n忺¿#ÀµÀ(sðÀSTUÀ|“íÀœ²ÀÁ0²Àß^*Àù —ÀøE½@ð†·@ð']@îý…@ç›[@Û°@Ü#%@à¢×@åg[@êÞÛ@ðøU@ö>Ù@øÀ%@øÕ@õÿy@ó¬ä@ï,é@åñÂ@×|@Åsê@³†u@¥}µ@œø=@ÂÛ@¡Ö@¸0™@Ïýv@å­k@í.Â@í´7@î(’@ñ¬@û*…@ÿ¤A aAó&A%ƒÆA.R"A4ˆ‡A8UA;pA<Ô¶A??ßAC ŒAHH¶ANŒVAW§MAaã‡AhBAh9PAhÑ AkÛAt`A{xA~­A€Î©A€éA€‡=A Aye7An, A]v«AI>¿A9GúA-tˆA!FÞA»FA v£Aaù@ù6@í¾@ÝçÂ@Î/‚@¿‘Ë@¯#@•Ò½@}7n@ië@b¥ @\Së@S*]@M¹l@G!]@=E@1t@)Ž¿@%v~@Ä @ ÈÃ?Ø$?£ ?Yù.>Þ4<¾sÒå¿ú*¿Èø·¿ü[ÀyÀ3+ÀVKÕÀ€FEÀ”aòÀ°[ÀÒ˱ÀðAÁ«ÁVh@û>AÙÍA¯„@ûnd@ì«@éõw@îk@ó«@ù§B@ÿŒŽA>ZAeAÑŸAS@ÿ¬¹@ûŠ @óâ€@çN"@ÖLh@ÃM­@¯Ê¼@ªõg@£‘w@£“ƒ@µÌí@ÊÞ@Þ‡Ü@ßã´@ã;³@åK„@æÇ@ôà@õžAuA²ÇAF{A(£}A1GA7½´A<ìÒA@â%AD7ÝAGu2AJénANˆAVCA_½€Ae1…Afë=AiÓ¢Amý‰Avw—AAÞA€¦äAÌ4A‚Z|A‚0A€i‘Ax]pAjb§AX!DAB“¸A14™A&šAð}A &A Þ™AÆ=@û¿´@ï€@à…%@Ï0S@¿w`@­™–@”\Ù@~Ð{@o<@lnÝ@lq"@f#ž@]Pâ@TÉ9@Gå@9²@*ÿ­@»@í»?ßÕR?˜~?.éÝ>mñ¾f†‹¿[E§¿ÉoºÀ ïmÀ1Ù7À6óNÀ_%LÀ‚èSÀ—Õ¸À«pÀÄ3©Àä”>Áà|ÁAÁ í€@ô¯¹AõAOA‰Aè¶@û»î@üͽAðÓA)ÅAQÃA ÜŽA ~A „ôAA|6A'‚AÀ@öÜð@çßé@ÕÆö@º¿Ú@ºH@®§>@°N`@²ÀA@½¨í@ÑÑ—@ÕôR@Þ§!@ÛXz@ßý›@òZð@ð¬à@ú~=A _­AˆÀA"è+A,šØA5. A<É ACNIAHÁ(AMA¸AQ6ATvAAYгAb aAfãþAjã Ao»‡Aur•A|k@A²ÂA‚±-A‚ûïA‚Ç–Aá„A~ÈrAs#}Abr AO~lA<´ƒA,¶@yð„@iüt@Zk@JÝ=@2YW@?á?Ô}¤?y‚®>q#4¾Í Œ¿`UÀ¿®ábÀÁ}À6¾Àd ™À…\ À“‰À¢U…À³«ÀÆÊ{À×ùhÀé«àÀÿþ„ÁRöÁRÁ©9@î%r@þãÞA³çA ðQA&AÄA”A¬ArkA(CA„:A¿ËA5ÑAPA‡ÙAÓ%AÌ A þBAôò@ûJå@æžM@Üß÷@Óî´@ȺE@½Ññ@¾ è@¼(˜@ʧ@Û+W@äTÄ@îÀ½@ø>@ê°ž@ñ5@üüEA 2A‡2A"'ÎA+ÉoA5HêA>ïúAH{AQ®¢AYæ A`·&AgAAo”AuôyA{e A€8QA‚"ºAƒ%A‚ÖBA²’A·…A{ AvaÅAmmAa£­AL‹zA@â¶6@ûc @ó¬ @ùy·@ó·Û@òÕÛ@öYADiA¶•A+¥A!TA)ý~A37A<ìCAG.§AQµAZ¿3AcqAmËAu¶^A{ÃeA~HéA^"A}ÊÎAxÙ;AqpKAk2ðAfo0A_´gAVlìAK A?¨µA4×_A-/6A%AÂA.ÁA›AüA •¿A:Ó@÷`"@óï™@ëHí@ܧ½@ÈÑ@³³‚@¤ù£@›“~@–µ@”çÔ@–Žk@–·@y`@„^6@j«‰@IÚ†@%ýs?ý…?¡ ²>ó¼’¾Ê#¿žoí¿ÿ À+dÀ`žþÀ‹˜À£\ À³½ŠÀÉ £ÀÚDÀê©~À÷€ ÀýóàÀú–.ÁŽÊÁHßÁ ÏáÁ c@óUA;ÄA…A­A“±A§ÿA 2­A 8¤A!™ßA$ÂqA(ì|A- A0QâA1ï’A1CgA.OŽA)¡sA#åœA:|AGGA7×A émAäî@ú¥ë@îd@Ú Å@Ô%=@ÑC@éqÛ@ùA-@ðö€@òÅ @óõ@ó}ý@öמAšYA k[ANA)ÜA$ºüA-k;A6J¨A?Ê-AJhASÀA\AeÐAo~AtëòAu)UAs–~ApßTAmw­Agä°Ab6¹A\ñ›AVd AOuAF7^A;Å7A2ÚA)‚YA!±AYÖA¤€AøõA®@üÚ~@óŒÔ@òŒ @ìý@Þ¥@Ê6<@·Þº@ª“&@ £®@šrÛ@—§@™05@™@’ì-@‡Gl@q¥@NÎf@'íc?ù;0?š$A>í¥ ¾¡Íõ¿”ÆN¿ýèéÀ023ÀiébÀ’ûÀ©—ªÀ»°]ÀÕ“ýÀäçÞÀõå0ÁW†ÁVJÁ:=ÁUÁ »…ÁåïÁr®@ëAeÞA¬ÁAŒ£AĘA#Ÿ`A$ÞA%DdA&~ A)85A-#uA1utA5_kA8öA8¿KA7*3A3‘UA.„A(éõA#‹9ADUAÚ¾A æOA\@þÔk@ð> @æY@âb @ög-@övg@ïxK@亂@ò²@óÓí@÷çAÈXA8ŒAøÁAMA ¨ïA)2‡A1dLA9¾MAC9|ANÉAWJíA_…NAgËAl*Aj"Af€Ab©«A`ý2A^çqA[1WAU„…AOCÅAH¿gA@²)A7lšA.œA%¸µAm7A ¤A±üA 0Aÿ;@õŽT@ïwU@îüð@éû@ÝR«@ËR@»}Æ@¯A9@¥È?@ž<@™â´@™Îí@™8µ@”k@ˆ™ @v·@T/¤@-ž@…K?œŽ>ÿ\„¾)èN¿h ¿ÚéoÀ!‚ À^·ÀŽðuÀ§²À½ÀÚ¬Àê‚Àü\Á7ÈÁ ñÁR„ÁÕÁ æ%Á‚XÁŽ@ã!x@ÿ­A Ó$AJæA!ÅA&¶wA(ÔOA)ªHA*éÿA-VÑA0ñöA5=…A9…¢A= PA>ù A>×µA<´ËA8Ü A3nõA-A$àeA5FA¸ÀAYáAGbëAN^öAWmCA[_†A`m-AZÎøAT )AQóÏAPaAO’¬AMhÑAIc%AB{'A8ò¼A0µgA(UÀAÇhA¯´AÿºA |ˆA12@ùty@ë‡=@à\t@ÝÓ@Þ¨@ß™º@Ú¶M@Ì&à@¼²@¯ú>@¨Õí@£9@ ,†@Ÿ}@œ)ú@–q@Œß@€ŠÙ@`(e@>Û@6?Éþ¾?XN¹>Ž²Â¾XÐË¿X‚À¿Êô@À¸ÕÀ\³(À¯]À­·ëÀÇOýÀÝžÀòÐÁåEÁUÀý¢žÀïëéÀù>ÍÀù¥bÀø¯Å@ÓºÍ@ï¤As‚A n²ANÿA'ÉýA,Ð8A/+™A0ù?A3ZòA6ŸÁA:©þA?íACŠ‚AGFžAI³ÙAJ|ŠAIcAF¶­AA³rA;/;A4;³A-¿A'Ì:A!ÚÕA nA‘=A ƒAa¥A EA 'åA {0A A1A MA ©‰A ý_AÐA,]Aã¡A$€ïA+—A0ÁEA4TüA;AC”EAI ‚AN•,ARûA\ÄBAZØATS–AQ¸0AMvùAJýAIù:AG›±A?]íA1RA$ËAêAfÕA óÅACAš…@î2ä@âX@Ú`@ÐŽ¡@ξ@Òs@Úò@Úª’@Ìöÿ@º¬‹@­ ´@¦Þ¢@¢Î½@£ƒ@¤x@¡>e@šÄÆ@‘f@…È¢@kM@H1’@$?ëSí?…?Š>Û–õ<”Nù¾üýN¿ˆ›¿ðýÙÀ8ÄÀ€ëõÀ QÀ´Ü&ÀÌMÀÞûÀðÄ´ÀüüÀåöýÀÒ©ûÀÛ1zÀãLõÀâ\Ï@ÌKù@æU©@ü¿½A {AÃóA%­ÛA,AåA/²tA2ÖA4¸ A8ßA;ýsA@hoADùAI>ŒAL®ðANÔ!AO}üANoSAK]µAF…LA@œõA:JÛA4,A.¢A(¥´A'Ù³A)LãA Ó)A¯ïAqAç{A&A&EA,ŠA¾ÝAæ)A+íA"vCA'B+A-fUA3 ŒA7ÆaA8LUA<Ö5ACñ-AI‘+AQoNAZ…A\ÜLAYw5AUeALbAB%DA<þ)A@<•A>'A.ðþAòbA úGA A*s@÷:}@è=u@Øjn@Δo@Æ5Q@Áʘ@þÛ@Ï@Û{æ@ÜAX@͵ÿ@¹Bý@©/±@¢S”@ ¿@£{,@¥@±@¤Mk@ž±1@”Ý@ˆ/î@u@S€h@1@{È?¡ûØ?õ=}È»¾ÇBƒ¿k¦^¿Ê-ûÀ!\AÀiФÀ¿ÀžõÅÀ´  ÀÇ)^ÀÙ4NÀæ€4À΋À¸'•ÀÀZAÀͱýÀÌÅ—@Ä›@Ýöª@õ4AûA—ÊA!û‚A)¿õA.gþA1¥¯A4À9A8AÉAA+]A)yEA'\òA%J‹A#ÅÄA!¿²A"ˆõA#ÒWA#ñTA&ÀA)þßA.Ÿ'A5e6A<÷MA> kA@–TAC¤MAE½„AKàcAPŸjARÞAQƒ¥APÛAIdWA9×OA-á*A*Ã?A'ì‹A%ž2A¾aA¢·A @þ …@å‰@ÌK@¾Ë@¼ý¢@¸Ñ@º Ç@Äl@ÙKÊ@ãpÖ@à"@Τ5@¸@N@¦XE@ž9‡@¶@¢AÑ@£o@£ìí@ AÛ@–0©@ˆ…µ@vÞ@ZP£@7d<@߯?»ûò?(x5½+ö·¿'N¿‡r|¿Í®¦ÀŠÀRöÀ~»éÀŠ–%ÀšXÀ« BÀ¾yÙÀÒ¸^À½¨#À¤8^À«€;À¶¹'ÀµÜ?@¸6¢@Ó1Í@íc¥A]UAæ•AA%‚A+H~A/‹A3RyA7>nA;n]A?ÕãAD`ÊAI „AM¯AQî,AU`qAWÍAXí&AXqõAVlARððAN“ AJ AF²•ACóÿA@' A;á®A7ËÂA8ù¦A5þJA1ŒÏA.z›A+©åA, DA*ž‘A)mmA*´QA./A3¼íA;^AAFAF/·AI«AGÙAGœ1AK²AI\¥ACÌ€ADßAIRAEùÑA9]ÕA-A TAcAÒA GP@ô3Å@ún@óµõ@Õ¡ @²Ï@žñ¾@šÏº@¶B{@Ò¶§@ã|½@óX @ôÁÎ@æ¬k@͵@´{@¡Â×@š&ú@›n`@ M>@ ôý@ ŸO@[m@“øÜ@ˆ Ù@v¸R@^+}@?9K@Â/?Í)õ?$G ¾~Q­¿qà„¿¹ÎÔ¿îƒ9ÀþÀ6·%ÀKºÀZ\WÀjMbÀ„À_Àž`šÀÀš—À´ÿ À–xåÀ™™‡À¡vÂÀ ¬“@©BX@©8@ÜP@÷S€A cA‹SA A&y‰A+ÊæA0dSA4ܽA9eA=ó‡AB…AG)nAKøÎAPÁ`AU'MAXæ×A[ÁÜA]l)A]¬€A\P¢AYg‡AUŽÝAS>íAQ}APëAKÍéADè@AD±FADÂA>²yA:ËA6…ÂA4_)A1ýSA1Ü]A3"CA7/ŠA>¿BAFY:AHþ,AO‰…AQ„AKUAKÏ¥ALT,AFî=A>G&A>0ŒAB.ºA=À…A/øA!œA*ñAàÇ@øw@ØO•@Ë6@É2@²v³@³·@—Ù-@‚X@^å@¢@àN)A Å•AE£A|§@ðj®@Ì{{@¯¼@œ™_@•7e@—.°@zG@ŸP|@œU%@——»@Ž5­@ƒãm@p¥y@Z1f@D/B@$Î0?à:?¿€2¿´‚¿ðômÀtýÀ C&ÀÆ_¿ü BÀf±ÀA”ÀEAkÀ‰4ÖÀ·±mÀ«DƒÀŠ• À‹[<À£¾ÀŒòE@˜ä @±) @Éó¸@åeA¹uA.aA çAüA&t(A+ëA1A6àA:ã8A?švADBÜAI·ANASòAW®áA[Õ5A_@{Aa›üAbqíAaiõA^[ÒAXðA[/“A\÷µAYIARlALª;ANAvAK}AHÜBACh%A>QjA:çqA<}A>´uAB5MAIõlAPtAQŠ­AUÌ;AV.•AP©AJºAF%TA?¿aA8¤1A2W‚A-dA-ŽPA&’…ANMAÚ­@å99@ĸÿ@¤[›@žL@ŽBü@€$…@…@X@w.e@oe¤@š3@ÀƒÁ@õûIA$A'A-i@Ì)®@¦ù}@•å@‘ €@‘•i@˜ ¹@›#@–…ú@a!@„ê¥@vÊ[@dT@Sðd@E©è@+ýü?ìˆò?ö´¿4³¿àíÐÀ ÀUÙ¿Ç;—¿cÑò¾Q•¦¾…·Í¿s8¿þ°UÀa4 À¨•À›meÀyã Ào)À~¾À}B‹@‡³@žsI@¶íw@Òü@ïñÔAcšAÙ7AßæA‚™A%ë*A+¤zA1%A6n»A;r'A@@EAE>AJOAORÉATJAYuèA^rAbŸAdÞÛAeÜGAd†[A_ïeAcþ;Abh5A`!AZªÔAU‚ÎAVLÎASÊÃAR`ANw%AKAG îAGÍAHøAH¹÷AMÇASüAT–AUÚ‘AO‹öAQa AEúëA@þ‡A5ñíA+„ÀA#z A[A UAj@ø4§@Ýv5@§ý@†+}@l¬@^h+@Xó½@h@fq„@kñâ@‰l£@ª‡ê@Èí@Ö‡ý@Ïu@ûÃ}AùMAí˜@ÕJÆ@Ÿ×@ŠìQ@Š,½@¸M@›@’mU@º@„­@r€@` ­@R¡\@JdÛ@C‘þ@, ‚?ó15?#”ð¿NL•¿úMkÀ;¿æ’¿^%?ƒ@]‹?ËØG>ÏýпKh³À$jÀiéÀ‡–ÀS4JÀ_ÒÀg{Àf`e@g¡©@ŠI@¢k@½‘@Úó·@óQ+AvÔAJÕA DAfñA$¶ÏA*ŸˆA0\sA5Å%A:âA?æAE GAJ\çAOÇÖAU-}AZmA_bŒAc³ÉAf‘—AgÂ{Ahƒ4Ai¯Af%2Ac{A`|^A_øA^D:AZõ¬AY×YAWˆ?AUš·ARÑkAR½ APæxALÕ/AKÖZAJŸAKM¦AIƒA:Ó{AA*±A>`ÛA:´eA*ÿ·A²ÅAIAèÏ@óO@Üov@·˜ˆ@¥'h@{±5@3LÔ@!Ì×@ @­@=Ž@Uޱ@‡J@­ß@Þ1AVrA@ëóG@Ø a@íÔðA–•@å”@š³4@†@€4¥@†¡?@‰6=@ˆÁ@ƒB@pÕ@Z3@G’–@;Ä¢@?+7@;Æ4@'«U?ðLi? M¦¿Fÿk¿û©ÀCüÀ Îg¿Í¬a?¦@X¥!??êè@Q=5Œ¿ôæŽÀuHnÀ[þUÀ+ºòÀ@ø“ÀQ¶ÚÀPÎ@>e‘@i)I@‹é•@¦­Ì@Ãç™@Ü9~@ò4ËAƒ%A @AoXAQ„A"† A(ˆA.YMA3ÔîA93MA>¢øAD6!AIâôAO”mAU3KAZ¬*A_ÎÊAdçAgI4AjWôAk=¹AhöÂAeûçAd’õAef2Ad4DAa„ãAa A^`žA[’ AZSAX… ASŒIAKÖAF|A=õ½AA~A1õPA1b!A4ŒIA1õA*9®A9¢@ÿ$D@Ïž@¸×‘@²­¨@œ“'@`¸@SÉ7@g,Ò?úm?²é?¾ñÑ?ý'@=7m@…÷ÿ@³Él@âôAýªA¬\Aœ%A½@ÒŽ©@½‚<@Û¾¡@Ü^“@š™ó@rŸ¢@m32@u»[@|Ž@véÝ@f×Þ@S‡Ž@At2@1ÔF@%g¤@%*¨@$]@*}v?ÐЭ?.,¿ Kª¿ÎÉÀ 'ØÀÜóÀ(:fÀ%“åÀÓ¿)-?ÿïm?˜ ¿È‰®ÀXòšÀ?IÆÀÀÀ œEÀ }À ‚3@ÛÂ@<Œ@f…I@Œñ½@ªÎØ@Ã|P@Ùçt@ïgDAô}A {A‰‡AëÂA ­A%|A*Ö½A0 A6‹A<§NABÞ]AI¸AOmAT÷wAZƒËA_ˆAcÉ…AgZpAi‡AhÚ7Aeï=Acâ'AeþÒAfì®AeÂwAd0”Acn A`¤õA]yAUigAOºABà¢A9äÅA3ÉpA>í/A1´DA1ÁA%ê%AÆŠ@ÛSí@¢è5@v°?Éy>?”Šr?"`R>¦äY>îvÅ?ªÅ?ûv5?lä…?n®?çh]@MP@–¹S@ÈÅ@óç¥A )AcéA _A .BA Ñ¥@˸R@§æ\@²9±@ª² @–•@l³…@YÂä@_Œé@`:ÿ@U¾²@B2æ@10¸@&Aš@”„@Á@ ãˆ@#@ Î?­3K>Ñf¿ n•¿ªZ'¿åC¿üøEÀ•¿À “±¿ëV ¿ŸA>Ò÷9?W9¿†öÀ;½9À¥Q¿ÇÑ¿­|F¿¯º¿¯ì?ìù@¾@:s‡@gù4@‘¿U@ªr$@Àž@ÖKì@ë^ž@þ yATäA ážAÜ‹AÇPA¹A%á¾A,h A3AaA:jUAAŠ×AH`*ANÊ÷AT¾ìAZ3A^®žAb4ûAdL)Ad¾tAc+#A`9yA`ÿAcFvAci#Aaá2AeyTAfA`‰UAOˆóAIMA4åA‰äA#MßA6 wA(ÞæAL~@ÇÖ½?èK—?DlG?Ôûœ?¨$|?ƒâ?†À?ÕF¾øJžÀà>]Qu>ð–²?‡0ó@óí@~^’@¸ù@ê†ÎA \¨Aé5A:ÍA ¸R@᮸@ÒøÕ@íZÒ@·?@—Ä›@—ý@uÄ@Š…é@s¥@M^@J2•@E¡@3(^@ôÍ@’M@ î˜@q9@ë7@–Ò@Y?ëÛ÷?“¯7>”"Ý¿±£¿…âÉ¿ŸU¸¿–ÜÊ¿s8]¿¦%½ÛX®?P-?,ì2?`´ì¾ÚíäÀHŠÀ¹¿PV¿8D¤¿Vãò¿V »?£:$?á¹/@@>1‰@w—u@’v@§oG@¼lÓ@ÑT¥@䨻@õ„„AkáA#ìA ª AoÅAÈØAÒ’A'œA/ë”A8tÖA@„ÆAGù®AN£?ATeAYü÷Ô?ƒù—@ õä>ïí?\Ñ«>È:Ö>׳å?è—¾kß©?sç}@Í@lí@­>@ÞÆñAó•A¥A A¢|A÷n@ðÄÎ@¿Ñ”@³üÕ@¢ƒ5@£Šr@xW¹@…ÓÀ@oú@ÃT@s80@K¿"@6`@.4u@6Í@¡~?õ(Ù?þcI@¬½@ ãª@ud@†?Ô†h?s7×=ø—¤¿K¿D–s¿ çÙ¾n/É>“´?EºÍ?žËì?Ð~?ÚÂ?p_w¾×ÑÀ ¤ê¿ŸÚ)¾ª+ ¾²wå¾Ùí¾Ø°?./U?“]´?ÖØX@ìÎ@O¦±@x§@ŽÜ-@¢”@¶‡`@ÉxB@Ùý·@çG~@ñûä@ûÑiA{AãøAAbèA"˜#A-FåA7…ãA@ÌAAH´‹AO+AT\AWMÑAYYAYƒ¦AX”†AUötAT±ËAQçAIÏ/AC€-AIvþAUΤARjýA;ÐA#…”@õÐ@Í_¹@¤ºº?†_Æ?Á-1?Œb¾? û?(k!?b”Š@!|Ø>¶9X?rÙ¹@8…|?±nÞ@C•d@GĶ@v}™@®Åß@Ý;&AµåA‡ØAÿ¨AAÄ›Aªl@ßµ‡@½ „@ƒêS@‡à*@Sê´@l^@.iÞ@d g@’b˜@‹â@rî@L:Á@&WÒ@i@õ]?ê£M?ë+‡?þ@5@ m@{?ò!À?²^?µ¾H‘b¿+:ê¿(Þ¾q>‰>è ›?”³Ù?ÚvG?øò?åâ™?ñx½>ÁH“¿-«l¿¼l¿š4U½Î`N=Î’½¹½ 9÷=yð?ÕÒ?„¹³?à0¦@&CU@Kd.@m˰@‰c@›¦7@­?@¼Ø¹@É}å@ÓCL@Úë @áÓ8@êô’@øIA'`AìÍA N‰A.(8A:è€ADîúAL1œAQ~+ATv}AU~‘AU5ATAQ]zAPP–AK—îAA‰mA3øwA1kàA=…MAA>zA*5·A¸=@ÇËž@$q?ÝÆ?½—¬?Ê|ì@«?Ì×?†Ý%?ü<Ž@]?+@‡Æ@~%µ@›÷M@–#@§c•@¼¬5@ïHIAÓðA"AÐQAªA¤¦A`4@üJr@Ö T@­Ä\@ÙY@CX@R23@R×õ@\)Õ@zæ@<~@–`I@ŠU?@n; @B=‹@„¿@§`@ŒÅ?ü ¤@@«õ@ ©@ ó@KË?ÛÄI?kÕ>£¿6M¿‰¨J¿hE¾“ Ý?$»m?Ã@ ¯O@…?Àæ?l‚}¾ˆt¿J{M¿•äò¿ˆF}>mŠ >β>²¨>³}¿ïR¾z>Äc’?ˆ¦§?ñbb@7M@>F@`=Ì@5@í²@žûC@ª~@²¡@¶‡4@·œ²@¾r‹@ÊLý@ÒsAåAíNA&õA7JAC—ÆAL[õARˆAT^õAT†ARugAOîeANž;ANTAKpAARñA-/áA${xA)r A0Ü A˜?Ay™@‹¨?¿1?§ä•@I @øôb?À‚6@o÷@HÒ1@z±Õ@¡¨@¥4h@²e @³Åf@µ×@­£C@µ§€A6A`A!ö6A ¯AQ›AP™AÜ™@ÙºÅ@®'É@ŒµÍ@hÂ@Rë@cÓ$@Nòò@jSw@…æå@ÐV@‰‘H@{#K@Tÿå@+¡Ù@·Ô@ë @Z@*@'ê­@-ÃÒ@({@@þó@į?åË?”V¨; z¿‚u¨¿»é–¿¬?¿!<?Jú?ÆM3@e@=k'@JO.=Ú6G¾“Ô¯¿u$ ¿•“æ¿$Ç>Øú$?.éX?9+?9Am¿‰•&¿QЩ¾•çÄ>ªÕ¿?Åõ?ÙY¸@oô@.ëŽ@M½ @iåk@CÌ@‹Í@Ú·@Á¤@…@„ =@1ë@üÝ@æÙàA—¦A%†íA7шAB¡ALŽÄAR2¬ARó}ARˆAPk&AL;ÌAN¹†APnÝAP5õAGâA3cA( A#ÉôAhzAÛ@Ëzu?ñ—w@æ¿?å—@Ç3#@kåI?[«ý? 8h@„P„@²²9@Íã@ÒÔ@͈@Å=‹@À"«@¹]@¨U'@®B)@ïÕdA `|A³÷A ͵Av{AŽi@â ~@µP @Šú@Lµ¿@\û@yÂ@aif@fÏû@w@wM@có®@DÜÌ@%êb@ ú@`]@q@7LH@MŸ @Yˆu@W¹ @GûO@0”@í#@Nf?oy÷>ïO0>« ü?°=Z\ä?Å6?¢Y@$¿@füN>xѹ>Úšà>».¾²;¿#ì¿¿“Ý¿"f=?î¸?c$Í?„Öß?„Ó-¿±Pw¿”1g¿J·m¾­C}>§`•?mþ”?½K)?ü©r@{@3Kõ@H_$@Xþ@^H•@W·S@OU@ÏJ@0Ó7@h˜@‡‚5@šèÐ@úÊA~rA-JqAD AMKAJÜsALŠAN¸:AL%ÌAQAUô_AY»ØAU†ªAEA6É¢A1Ò½A\™A$=o@«Ga?õ,í@_>Ì@ÏÈ@”Q­@kUÀ?…5A>øKm@^_D@»zA è½A;oA äŠ@ø_®@Ø+\@Àl>@¬¨@sL”@‚mM@ˆ"É@µ'@ÃÁ#@çÜK@ü¶%@õ=@ô€m@¼d@€Òõ@g62@Žœ&@y®ð@Zû@P)=@8å@Ž?û­?ûÚ×?÷™í@ŽÑ@7j@cªE@Ò®@‡'K@‚ ’@i>×@K9?@2IÁ?›{ݾ¡h¿¬*¼¿á_û¿H‰¿cà9¾EK—>§>‘‡¦@?]Gã>9}>úE¿7Ø'¿K¡¿Š0¿…•?V?~«;?”$µ?”¿Üã¿»·í¿–|n¿XÊ ¾¸^ð>VÄF?BR?ž:Œ?ѯç?ýa@ÝÈ@ˆo@ >¹@{W@#º?‹Ô ?ö8Ô@ïl?§Á»@€ÏÅ@¦zÙ@Zþ¹@Pã]@Í›Aw™A%ˆA0§¾A7°¤AD{ÕANàlA]M$Ab0 A`Æ AWD„ANZýAWØ:AIûÓA.?-@ÏßÀ@®) @Ìâ@¼¾@™O@tªµ@XŒ’@fáÒ@–:@¡¶UA ïA‚ÝA6"›A=7èA*/@Ô~Ý@§á@s—@)oY?+õ@6ÂÃ@ƒ$V@ž&@Íó¨@ðÉA L…AY @Õ ½@™.[@;@«­@ÏÊ@iÅ@.5 @ ”“?¹¡ ?¬D?àOµ@4þ§@gàU@‡Ã/@˜€h@œ¢²@“x3@Èž@ZQ?ñŸR=ö?4¿:–¿=¿¾.Àp6Àš‡¿ä7}¿€·m>«=4?Žˆs?•ƒ>ØE$?»¦½èåî¾à>¿tk ¾Ù|q?‚,±?Æèz?Ñ9r?Ñn6ÀãM¿çÙ‰¿ÆÝ׿¤èœ¿pFD¾ÛE=¿RŽ? Þ¤?g_^?›hC?½G0?ÖQ—?Ý×/?׸?âO>‰?žzR?üÿ?­Å@ym¥@q‚ò@ ‰õ?ï€Ç@ºÆ@|¼}@­ë˜@îÕ"@ï×m@ðí®Aï¥A2×uAA¬MAO#"A^VíAj­Az€ëAaì5A;BMAòAQA&YA5SfA \jAÑ<@øwA zãAñÁA ,AÎA†Ž'>"UD@ e@ð@••¤@×¶SAÀºAùÕ@Ê„•@ž°@¾BÅ@£@Œ0V@%”O?›fã?^¬,?˜t»@»ª@Kvâ@ŽÜ{@œá@§¸9@ª@Ø®@ˆ¡@6*%?¦{­>—ùu¿æE¿*Ü$¿âN=À%…]À â%¿‚£E¾y)þ?R0!?‹;?Æ”N?[oÞ?Çå¯>ô½K½ê«¿?•g>›çM?òWn@ »@·@N’À´zÀ `Í¿ú´-¿Ý4þ¿¹P ¿}P¿þ2½Ð‡>rÖù? á?Tw\?‰Ke?›T˜?§8?¶¬C=i…?­û/@sÂ@Ê@&€!@"×½@ ÿq@"é?áu?ÔÏ%@bÏ-@ÉU¼@¼Ü÷@1´ê@•øP@m@ix@®.øA±´AVH…AeƒÔAY‘DAL?¡AB$¨A:uAG¿§AP¦‰ADA>é"AJÐA[EéAXj˜AB÷5A!:A çA ÈtA  ÑA9Á•A. e@Õ•˜@“ú[@V;C@)À*@ž|?í½?nK?ì<Ç@@QÿaAÛ}A uä@ì˜d@®°7@®¿ˆ@ü5@ª´@Ìõ@E?ì'­@  @AQ~@sþ]@˜ÖP@¨jO@°4’@¯Œè@Ÿí¨@nø€@ã?¥O>¬ ¾¦æ+¾%ÏÀ¿ŽOô¿Úxp¿’EÆ>mö0?µ;Ó@~µ@?îÏÇ@‘Ñ@}?í{%?ŽÌN> óÝ?€Rg@'Çs@C:›@CÛ½@DAKÀ2š×À&xBÀÕ,À ²Ì¿÷‡ý¿¿V¥¿†qÑ¿,M¾®xÙ»õDž>©¼¨?"x?]†ç?k?œ(Y?€&@•k@3Ìõ@@x@ð @&E@9¦@7ËE@+dÊ@‡@KÆ-@£kø@½l@¦L‡@Ã.@§)®@Z£@pqõ@¹‘3A QÆA/;A;Ò}AK¾KATµfA\üòAe¤Ag<âAgAjrÕAzCîAƒhA‰OãA_'­A/SíAz#@ä!…@ÓXHA÷CA@ü©AQˆ@ÅH@—,Z@xÞ@TD-@;€…@îá?YV?•ˆ"?Ô›û@ûÅ7@ÿh¢A#©@Ή@Œ H@]’-@¢’‚@õÎ@sF‡@PO@y4í@Œ½@›Î@¥Û@¨Áy@­\@¥-Q@’¶ê@VÓÇ?þ…¾?µû’?1Q½:Ñ=Á[þ;XQ$=¹<Ô?i1K?÷:Í@3ê~@Gó@@ê@Õ@;ú2@{Û„@jG‹@<[œ?ËW?èê@YÊ@v=@u-u@u©tÀJÁÎÀBà§À8¯³À-@À1€¿ýÜ;¿Æ­‡¿—›R¿TW´¾çf=½’ü>‡)\?o?³?“› ?i„@ä@1ÃY@4?p@3Æû@N“¨@V.@+€Ê@@@h1‰@Kqh@e–Î@±Ø3@Å7Å@ÏÓ@¸5„@­¹ú@¹’r@ªz@ÖdA„´AðÞA7*=ANæAa:¸An˜4Av!KAy¡.Ax."Aw†àAyê©Aš8ZAf,A7~‚Aú‹@å@Ã}°@ÁŸA&¬åA4í¯AŽ@Ö¡¡@®eõ@“ý´@} @_Î@Wê‹@\Ìu@y5à@¨G@×Aè¦@ù]ë@°®@iç‰@k¶)@L¨•@†àu@‚ä@–k‡@¤@±¦"@´‘ü@¨×´@¨AŠ@“-Å@™Úƒ@e`¾@! @"2?éÕe?ˆñ˜?œB©?—Þä?Âaq@4uï@{äN@{VÎ@kÌ@¦¶@ò¨@%d2@¨‘i@¸Ru@¤3+@Thh@,ç @…"@Œ6M@ŽŽ³@ŽÐìÀ`ÚÔÀZ§òÀTÀ=ÀL,¡À:Œ)ÀàµÀ=c¿ÓWß¿¡f«¿XÂ|¾å_§½³>¼žç?3ÅT?zd?¤IM@$Ô@&]Ä@u¸@ÈG@-èG@<¤ç@K“@,`@dÄ›@<©D@K±¿@“è @¾x@È"@À@¿Ù@ÊÞ@ÒËŒ@Ècö@×ÍYA4A"FA9I¡AQFÂAdÙAq¡[AwÐAuWAqA€*A–l´Aq'AHÜüA&¤•A>@ôZ«@õ3þAÂA&&AHÓÅAãÀ@ì¡ @´g{@™q¾@ˆ&&@v¨N@€$ž@‰¯u@ª¹ý@á"A^—Aô½@êåŽ@’Z @l@¦M@ž:Š@£*/@¦çz@±(É@Àóˆ@½œ@¨£Í@“pp@†>Ë@€Np@pÇ@Zéµ@A•¥@3wð@9ñ@!&O@)ƒP@<~”@ˆL@£–À@V# ?fSô?žTd?Þÿ\@—²õ@á*G@öû@á{·@šD€@_“@’.u@ž@ K@ ŠëÀwš5ÀrnÀmZ=Àfh·ÀW )À;ÿ[À @äÀ ¤¿Õt¿œ¿DF&¾™>ç=[/[?Å.?š¹"?Ógb@©Q@"Ñ*@ì\@¾@8ÿt@iÔ@Yz@haÎ@Z­@-3í@7÷—@]èï@—¨ê@°þå@ÀU€@Íš@à”Ë@êÚY@Þ—_@â¯@ù A A!Î A7ÿšALhA\²Ad¿€Ai¥A|¿çA‰ÔAŽüñA~z‹A_+ÓA@¬4A&°Aˆ A‹Aé&A!ŽA5tÊAClA @×¼Ñ@§e‡@˜EA@‰]@…¡$@‰öR@›o*@Öe@ñAø•Ak@¡¦&@‰ˆñ@®Í@°i@¶£ @·+o@¶E@ºX_@´-@¡Ðë@‚­ó@r@÷@OТ@d3„@hÞ@t ÷@eÍ@b~ˆ@oì]@€— @ŠyK@¨²u@• g@Ù?Ìc?Î=º@“è@èléA1•A Òí@þÐ@µ„@ˆ»á@¦ÿ@°Ðu@°–@°PåÀ‡}ÅÀ…•À‚èƒÀ"Àq€ÀX,fÀŸAI‘ÛAR›]AbAæA~œýAŠ#3At?RA^Å%AJqnA7?A'ÑA”ÅA AþA •œA)j‘A7›AÓª@²Ô@¢¹Õ@˜f@Žk}@…J×@~~%@­wº@ßò&ABŸA›J@Ìe†@ Îƒ@¸:@Á®K@Ķ@¿Æã@¶H@©¨”@Ÿ& @“a×@tŽû@c1Í@=5@O—R@GÚÒ@|èM@sÒÂ@‡ŒŽ@—…Z@¢Þ@±òo@Æ@nj}@H6 @‹_ú@¯·@ÆmÄ@þ# A àºA ýAÈX@Äý&@Ÿ*ý@¹é@¿C@½úx@¾$5À“{+À‘U…ÀIöÀ‹óšÀ„ˆ…Àp­ÀSGÕÀ3òëÀ5:¿ÛYH¿‹%é¾Â>J>L^6?K>?®šG?õîI@'‡’@,’Ž@<€W@ACË@Fá@YÐ<@tm@oX'@odr@ha@ß8?ç¨@#FÙ@“ú@¡va@»ìF@Ø©^@êË@òE-@òö7@ó™@÷4 A¸A åAFÃA A*}GA3¡A5ɸAL”4A~ WAOœAC´ÅA;þTA1àíA' ÒA§VA€‘A”õA’@÷"UA%ƒ5A p¸@ÃJr@¬Èµ@§ë @œà @…Î@mÎ@‘2@ÏöUAnA!@Ýþ@Ê#4@Èq@Ï~!@Ï·@Ç0Í@¼@¬ÿ4@˜¼@†Ž @h"=@hÒ%@a …@U·Ø@D/„@`u@c؉@‹j]@§Œ@»äe@Âq@Äñ7@À²@wЕ@Ù@õó´A8}AkmAròAÄGA¸Ÿ@Ët’@°Q@ÉÀ­@Φe@Ì?&@Ì[úÀŸÂÀÄBÀœ lÀ˜èBÀ6©À€ã—À`…íÀ<­ÇÀ$Ó¿Ù(±¿€\!¾…Ê>¥µº?fûå?È–@ 7@Ú@0xu@>Æ @Abç@;Ý@N‘c@eE@a]@gËù@`ÅÂ@4{z@3U@@k„P@‚Dç@’hµ@«6@¾‰^@ļm@ׇ0@Ú~E@ÙÌ6@ÛEI@ß5Ï@ç·d@õD A [A kŠAÝ2A\A%D®ANýIA%ŽA z A gA",Aø8A_€AC2A áuA—@øû—A! A!³@é;™@¿h @·¹W@¯m@¨tŒ@£u@ªj@°'ûAàW?ˆm#?Çr?æÉ$?ávÔ@®…@&r@(_Ž@.ÀN@>ô @E§¾@F÷õ@M‰R@K´à@-?@0q@ZÎE@de¢@/ë@Œ‰<@–K¹@˜ìú@ªË_@®õ@±Å@´+#@·:À@¼k"@ÅdI@ÑÅý@ߨ™@ïû‚@÷¯EA_A9\A³_ApáAïA¼™A¾qA‹ŸAÙ¢AWAAÝA )ÜAJâ@ÿÆÕAg4@Ö*Í@Æ}@À9-@».Ï@½]@¿ïk@Áƒ÷@ÕÖ4A‹A=æ@öC—@Ì8:@Ódü@Ë5*@Æðö@Á @¹$@§Ã¨@‘Æ@}Â%@€tŸ@zLÒ@†­®@™gZ@—³-@0‚Ì?gn@-Î@™D“@¼ãYA¡ùA!õôA)ßA-EA.ˆuA&ñ(A(ÿeA%A¹¬@õÔ@Áeµ@Çñ¦@ê>Õ@ìŸ.@åHt@åPPÀ¡|À¦a€À¬ÌÀ­í§Àœ¡ýÀƒ³(ÀX*¬À,PþÀoô¿®yÁ¿=/¾s]þ¾¥?1ná?ˆ¦P?”¨Ø?©¢å@C@ ´$@æö@5¥@?z@4Zo@f@$Í@,86@ÿ,@a9@>jç@:Å@CR@Jç@S‰Á@bï[@o‰§@|jî@…~-@‹¹@‰`@•»@o@§ß'@´ùÍ@Ä‘]@ÎïE@î‡%@ñ ·@á1@áâ@âšo@ã —@å@é` @ë¢e@ó"@ýóÝA yA&å@ßFA?ñ@ãœ@Ôn&@ÎÛ­@É1×@ÇŒ@ÉÒ-@ÉÓo@ÑIµ@ÈçÜA (†@üÚb@¸TQ@¼@¸Í5@»Þ@¾}@¾Ë<@»…á@¥ä7@„üî@„Å×@ƒè*@ŠâÀ@Ž3K@ܘ@¨·v@¢\@»üI@¶n¨AjA;ÆAL/VAFG4A>k(A3?EA(mA!õõAˆþAÓ–@ÜQ5@°ˆ=@Ë­@ò]à@ûqãë?QÆe?š1*?ïvŽ@ Ì@)OÎ@#Ëé?ëÊ[?ø¦ý@öÚ?ì@"@ëð@ Ï…@@^T?ÿ‚4@ r@Mì@.Ð@1Ý1@F¹@WIW@f Ý@v@ƒÑ@Ž ž@›§@ªŸ‰@¹K@Ð2¦@Ì =@Οñ@ÐKý@ÎÀÞ@ÍJì@ÏB@×_@ÚÍ¥@à›(@ëù@ò²—@ó5@ÿ@ÿ"Â@åÿù@Þ˜v@Øv7@ÒRœ@Í\Õ@Ë `@΂@Ô§W@È[@ä>A`0@¿[X@ Û»@¦Š!@²*@½!@Å Ï@ÊÊ’@ʼ>@»Q.@²ê@­.¸@Gý@q„g@á]º@çÆM@ïKuA Ÿ)A$I[A=5AR’@ÊûÜ@Æõ-@Äd%@¡@ÚÁ­@ÒœQ@Âýh@å–í@â%ã@ìÞ-@á—E@àlÕ@Þˈ@Ú’m@ÕÀœ@ÐŒ°@Ì u@ʪÖ@Ì\Ž@Âr?@ž8@å9ò@ÑžÕ@›å%@¡‹ü@±5Ý@ÀØ}@Ïs @ÛœN@åŽ@î²-@ö5Î@ÿ½A=GAÛôAÖ½Ac¥AÀåA-ì¡A:ÙHAF.ANÌAWóHAI]µA/Ñ/Aò¡AGB@àð@ëÝ>@²·Ù@‹P­@…ú¶@Åû@ô¬ŽAwµ@ù @øÙ‡À‘QHÀ•n…ÀšÂçÀ Â À—IeÀ{UÀT6uÀ=ËÀ.ÑÀ&KïÀ':eÀ0š‰À>´ûÀNÎôÀWn5ÀP“À?hPÀ0®?¿çô¥¿gg[¼[C?ˆ¨,?½@#,Ê?ñ* ?sx2?8.?ld^?€*a?G?u/+?„ÉC? Ð™?Î…@²>@$e.@D£„@bÌ@}âÕ@Še@Èw@—H @ ¿_@©Öl@´j=@¼l@Åš…@βµ@ÒÑœ@Ñtœ@ËW}@Â÷Ý@ªŽƒ@Äi@÷Î@«öm@Ñ€æ@Ãh`@ÂÄ×@Ëñ•@Ô<­@ÖÙd@Ö‚—@Ô~@Ð@ˇ¨@Éè@ÍÓ1@ÓÉï@Æm@Åw@Ó?Ý@«ô·@® ¤@ºõå@Ë—@Ü4ý@ìç@üƒàAï¦A ŒmARsA é*A+ð A/wýA1løA:"ÍAC¼AI RAKOAFkŠAG FA8òA§ŽAÆå@ÙrK@Ÿ¼@ÀŽ:@”-Õ@tÍ@}C°@¹òà@çGŽ@óßK@ö9 @õöiÀŒƒÀã²À•m7Àœ9—À™º¯ÀƒëØÀjº¥À\ ÊÀU8]ÀRPnÀT‡áÀ[oþÀd¯·Àlâ›ÀptiÀf„ôÀPaKÀ;/LÀKÀ¿Òý½¿U c¾Ï)d?'6?Z'9?Š’?]È•?Šÿ¶?•­?žá@Dv@ cÍ@@&‡@eÄ@…1 @”d|@¡k4@ª¸d@®ÖA@¯ø@°¢|@°â@¶J@½Æs@Å@Ð:Ý@ذá@Ú\v@Ó…Æ@ÇÉ1@¯@Ÿ‘.@”;–@¥)š@¿ÛP@¤‰‚@¯š@¾Tœ@Ç_@Ì­@Ï5¹@ÎËm@Ëÿá@É j@È,@ÍM-@Û]í@ß›i@ÑOÌ@Ï—a@Àç¸@Á²@Ê2’@Ùn@èÆ”@ú—‰AéÙAXAËvA±oA*¯ˆA3À”A9i,A?9pADi¢AGî$AHdmAEt AA(A5ÚÀA »½A”Ò@à.¶@º}@ŒWN@®F“@‘jw@‚^@ƒ Œ@®µÜ@Ú,Â@æÄ]@ì«î@ìaÀ…f†ÀŠ„SÀ§À˜'À››ÒÀ‰d?À~TÀqÄ¥Àk®ÅÀdbÀ\òfÀU{·ÀMƒÊÀCÊ À5\:À!MeÀ23ìÀ⿹Ëv¿ÉÍ¥¿Èá¿wZp¾V®L>‹nq>ú/ç?Ml.? ‰?¾³A?Ú£s?Ös±?ü—@"ø@Lïï@bÀ™@zÐ@€Ÿ)@‘”Å@¡ý@¦¶]@šxÉ@žY @¦¸¥@¨à @¥èW@˜ÛZ@›Ö[@­Ð½@¾°ž@ÕÔ@ÝÕ@ØÆÔ@͉à@ÁÉK@°Sñ@›=º@š„@@§n%@¢W`@­´@¶½Þ@½Ûá@Ã3§@Æ [@Åö@Ä*H@Šø@Ãzú@È¢@Ò¢Ü@Ùý.@ÚBW@ÒÍ»@ÏG%@Ϻ;@ÕÙÒ@äë@@òFk@ÿ~IAªA’}A¡AýoA(\°A0+A6²A;âòA>¬A>3A:ŒåA3ÛœA)ýôA·éAʼ@ÝçB@¹Ó @¢vÕ@O@— r@’^3@Ž5È@‰² @¤Œ/@Í™Å@ÙÞY@ß„@ß:}ÀuœÀ€eFÀ…ˆÀýÍÀ˜GcÀˆ ÓÀ~”éÀjuYÀ]üÓÀJNãÀ2£«ÀPã¿ùjð¿ÃR}¿Œ¦r¿EBv¿Ìým¿ìg׿–¾híп [²¿J7½Úõ>@ÿ¶? ó ?ƒRÑ?£Æ.?ÓƒM?ö)•?ë‘Î?âÔ‰@hU@9ï¥@4Óx@C…I@.Bª@1t@DË@U(@dÚ@UÃ@T‚Ä@W¤@k§U@\^@Xá½@€Ç @—Z@ @Ó1 @Ôp@ͯS@į@¶q†@«ñ@¥ûT@¢¨g@§5‹@­MT@±Ú @¶@¸ÿ\@¹¾Ê@¸Âg@·8©@¶§ô@¸^x@½B#@ıõ@ËÍì@КF@Љý@Ò ¤@ÔqÞ@ÚD@ß >@÷¦7@û;AãŒA ¸µA§œAmA0ûõ>è)ù?/¾E>ÇUi¾üh‚¿ÈÍ忌Ó¿{d¿CÃæ¾ß|Ë>‰Ÿ>G>èÀË>—•?Ao–?‰b ?®QÐ?‚?öG@1™@"J@ ‡¹@a—?à}6?ÀWò@|(@rX²@O|`@‡@K@'Sò@7m§@:@-@Us4@€¤@¦(ÿ@º-‰@ÀÊÓ@¿Iü@¹»3@²0•@«„@§;C@¤Ðq@§ 1@¨³5@ª }@«…@ª• @¨Û@¦-@¤²â@¤åÕ@§N¼@«ìï@²i„@¹ré@¿Á@Å,@Ê9t@Ï×á@ÖÃ`@Ô&d@è[@íáÄ@õ>$@ÿ—ÂAÚ¯A KA,]AFAuYAA =AuA ’@ò.=@Õž)@·º@šˆæ@‚@_Öõ@P…È@:Y?@Cß^@tÉî@‰x@ˆ™ý@” ñ@¶yl@À–@Ä&S@ÃáÀJ*¥ÀO%NÀOmÀiS;Àw/RÀ_ ÊÀP‹À¬¿ì/„¿å®¾Þ%>I)L? ?Jc…?^þî?4¸?Ÿz?y)¿2çÙÀÊÒÀØUÀ ¿ö>¿ªŠ)¿ÿÞD¿âôò¿Á E¿ f‰=°Ùâ? ¸?vz…?Ý]a@)n?ë²§?Ŷ&?¿«Ñ?Öö´?¹P?½Š@6z½@;þc@z@-q?üªÂ?æq¹@Á1@'&@R€ @ÜN@”“W@Mâ@ŸC3@žñ5@Å@›ì!@›Å@›@›šž@›–4@šýF@™Ij@–# @’²@ެ<@E@ŽQG@‘m†@–è@›ÕŽ@¢“ @©Ö@±tã@¹í@À8b@ÈZ.@Òˆ«@Õ­a@×YÕ@Ýw\@äI—@ëî@òi@ù,@þw•@ÿÀõ@úÕâ@ï @Ý`@Çç…@¯ë@—cû@€ë3@[÷@9r@=@6?òo?ò~›@A)×@jÃ}@s D@ˆm¨@§^@­æc@¯5.@®þqÀ3ÓlÀ/±†À-éÏÀDŸÛÀMfÀB¢ÇÀGË5ÀêZ¿¹¿@"¾s50<ú G;Ãbt½¡ `>’I?,ÿ˜?…@Í?}çþ¿*Óž¿à‰ÀsQÀ>êÊÀ+8=ÀÚ ÀU °À?|ÉÀãm¿¹)¿W‰õ¾ŽÊÔ=ß”c?qr?ƒz ?"Yç>HZÇ>ϽÔ?w‘ä?ž±?#3u?ÂFk@4À@HH?°[Õ?›²s?ó3?J«í? kO?ó»¾@&Î@H!@Wú@auÄ@jN@rÅ@zI%@€‰@ƒgØ@„øY@…L@ƒ±b@€©â@xŸÇ@o@gcÍ@d¹ë@gZ @m@u§>@~ÑÙ@… –@Œ€@‰*å@k•-@H¹•@)ñ@ ÈÅ?å6)?·-,?¦Y5?mò?R­´@ î€@:˃@He@m@”0 @š^@šû½@šÒŽÀ!hÀ/®À œ¾À9%À!ÞÀ+£)ÀTîÀi¿ðË࿺G¿Šv;¿˜Å¿x´¾ìå0>w`µ>÷Vw?MÍ‚?Š,í>É)½)é÷¿éÉÀlÓ¿´Å¿ªvº¿ãå.¿ö‚2¿í~¿´"Õ¿|MÙ¿ …1¿…ý¾ÌV¾M‰î¾y.¾Ø¤í¾¬xͼý\>š‘>äß[¾î³€¾ö§Í?0-?+ù]?=•Ÿ;'ÃĽ¸â1=0îí>¶›û?|D?¯Ÿ¥?Εé?ìÙ@’@@)Ô¥@9A @E8<@L|Z@NìÚ@LãM@GIŽ@?9Ã@6>@.ï@*C\@+}@0¥@5=T@:­”@ByÀ@Q‚´@c^Õ@uÚ¢@„)P@Š\…@Ž5ß@ô(@“‹t@–5ë@˜íy@œ+@ŸÅ@Ÿï@œÆ5@”ðÖ@ˆÒ%@s[)@Rp§@2T‡@u?ö;?¿HF?ˆ—U?:îê? «t>ØþU>SÌ+>ž'?Áùv@\•@æ @J$8@‚S·@‡¯@‡›ƒ@‡~üÀ $¿Ûdº¿Í’¿ßÕÖ¿âÎÀ)ËÀXuwÀEbÀF6†À3ÞGÀ•q¿¨¥ù¿qÞµ¾˜ËÆ>]eÓ>½Ä>9±?ê@%? S#>µP¿i§¾ÍEL>×D@?Ô>˜ï–<½ß2¾2¡¾És¾¿#¿&3„¿Q¾À;˾b¾A¡I¾Æ}¿$í¿?ý¾Î‡§>¿Ò-?,ÒÄ?y?Ó>Ô}>̶P½þi²¿WP߿׼¿{tI¿%+̾¬F*½Q+l>{Ry?„¹?q¹?¨œ®?Ôi·?÷R‰@,Á@ ÅF@ šÍ@ Ø?@=¿?úv ?éi’?Þ°ô?ݺØ?â(¾?æ¾P?íÐà?ý—»@Êa@(›A@7ŽW@H¨@U½@\;@a:,@c¢Õ@fµõ@kp‚@qoÐ@vm@uÒ7@mþ@\È@E»@)ß@ Óœ?Þ9B?£¡•?Uè>Í­»‹ô{¾G¡]¾RS¾Qmt¾È³m>¸J?ö ?ô«É@‹:@,¾ø@dv$@m@j²N@j‘ ¿×•½¿¸çÜ¿£«¿ž­¿w:I¿´¦eÀ,aPÀpÖ‹ÀSqºÀ"Ü¿×âÚ¿tÅ¿…^%¿‘ªu>\@>Š&{?•,@ Ñd?㦋?Mb„?Nÿ?­ªê?å?½@áp@ ž@l??ö$‡?¼/ø?R]g>•Éì?|Š?.Ü~>¢ °¾9ˆ¿“¥¿€•s¿ÖŽ¿˜íÔ¿<& ¾§¨ç¾u˜À¾½'E¿y*¿c¥¿¸©¿üçÞÀGÖÀŽ•¿û…=¿â³¹¿¼çÞ¿–ùå¿WB ¾â‰5¼ŒMí>Âù?Œmƒ?)?ù?ªù?ñ¢)?ï<"@×­@FÄŽ@M{%@Hÿë@HõŸ¿µ¦ó¿¡g™¿’A뿃¾¾LP‡¾˜Œ=¿¯ôÞÀq„…À6µÞÀ 9<ÀE¿[°à?<ÛܽšÞn?.~ê?ªB%?Ù®@|_?Ò ´?ÑV©?ÿõÀ@@(Ó~@L· @_p–@m¢½@QUþ@4)ø@Wý@U±?Ð*d?2×>3ˆ2¿C+™¿¹œ¿æL ¿ì¢'ÀØ¿ô~i¿Ë4u¿¯–6¿¸v¸¿É‰é¿ä¿ÿWÀüèÀG?ÀQ†ÀGŸMÀ? †À45ÃÀ%AÔÀÏ\¿ï‰Å¿¸οVp¿3€¾BÞ=–µ3>uì™>¦5>®Â1>Ÿ±E>`·>m>˜Õ>°¤0?D?=H ?•É®?`v?kl”?èd@ Ñ@,ø?@;Óü@3¹@.PÖ@&@¥@#‚@%ý@#Õ @;I@É‘?ÕHä?‘#?XE½ØB¿7Å ¿’m¿±$Y¿´ÿ¿‡×’¿<ãÔ¿AFÆ>&?qw?‚Ü”?¾ªŽ?ïzd?ÕA0?ø©I@*†Ã@/Óå@)^F@)jÉ¿ ¢±¿”Ç€¿ˆÔí¿b?\>Ôgª?(Z`¾Adì¿ë’­¿sÛ¿Œvp¿6-´?tÒI¾"$¾+/>…CÈ?µØÕ?̦?'ê_?à[?«Í?Ù„+?Ñé?ÖÀ¥@›³@!ŠX@Ê?í6Ý?Ç&™?¦Â?y“R? B½€br¿jc9¿ë‘gÀõËÀ'”}À-ÔìÀ8CÀ6Æ-À)Œ¥ÀêÀLÉÀ¿µÀ%}ÂÀ+©À9š3ÀvÁKÀ™Â½Àš¢çÀ’2`À 4À…­ÀwÚíÀaÜzÀKÈÀ!`¿û˜ž¿½+ ¿†ð¿Cy ¿iL¾øÙ‡¾ÊìÔ¾—8…¾A€õ½µêù=à&É?÷¯>Éç:?¼ù?¹ÚÝ?äù-@p@! @3Ãì@> °@-Ó@"§”@A™@*»@p‘?Ø×h?Ÿ5Ç?*Qµ;V°¿㿙ɴ¿óãMÀ ¿¤À;À£ÀÆG¿Ïn ¿›Ô¾Ò|U¾‘Fz¾¨2?•á?ºt¦?Ðÿ`?«1ö?È\@'e@Ï@ ã@ ù³¿™Ýh¿–Ni¿‘c¿ZâŸ?=”µ?•K¤? 2¾Ô,õ¿Ý ¿tx…¾ç»?!Æà¾¥d'¿1I¿Š°®¿u(K¿Ùm¿ŽÈì¿)ãL¿tÿ¿ Ðå¿=¿#‡¾‡ÿ&¾½§¿ÈÇ¿?Nο_ÿ¿o%¿Š›|¿¤Om¿Þ&µÀ ÷ÝÀQý Àe<]Àc)-ÀlMµÀtäàÀo(°Àa[dÀUúùÀPƒ0ÀS†±ÀZxòÀc2ÀÎÀ aPÀÈòÀØ¡“ÀÎÕÀÂýñÀ¹‘•À¯ ”À¯0À¥ø%À‹&tÀgYÙÀ7GÀ1x¿ã>Å¿»=§¿œåõ¿~¨2¿?‹€¿桾„ú¥>ñÃ?!¿°?Iº¾?Ç9K@’å@&TU@,ÆŽ@.¨@1¤´@(…@X©@í?çMG?¼E?zªY>l@¿Þ'¿©X—¿ê]GÀùbÀ.³ŽÀG`àÀPÙÑÀLyÀ#=5Àø}À ¹ù¿^Œ¾˜¿H ¿a?…÷S?”âc? }º?oûg?™x?êxM?ïä‚?â$?â^¿œ•¿¢­ ¿¨ªN¿h¡Õ?U??˜çð>÷˜¿{NBÀ s´¿ÉÑ¿šýÀ®ÀPK"ÀTFÀuC}ÀYÏÀCÐÀ9jéÀGÛÀP`À;Ê|À: À;2åÀ:-PÀ9<ÀExÀJ–ôÀMD¬ÀD¯µÀEÅ£ÀSFÀnÀ‹ÏÀž ’ÀœïÀ”‰-À—µÀ–å$À‘ 3Àˆï]À„Ù’À…týÀˆµ%ÀŽ"ÕÀ—™ƒÀ«ÉÀÌ®4Àó›BÁ5eÀú™`ÀëŸÕÀé%ÄÀçv]Àê’‹ÀÚ¡ÀÇ=À¬½¾ÀŒ™ÝÀ`£œÀ3¨-Àµ¿ïù¿¾p¿ŠŽ¿(ãǾZ;À>­û¥?‚“?ÃpÄ?éÑb?ù¦í?ú¢?ø;`?ñè§?è›?ÎÞ×?¬3Þ?€ßÞ?.D >™%Ö¾–o6¿ÌŽ¿ö5kÀsªÀ-q'À?+2ÀP…ÀXî²ÀhqÀMsÜÀå¿Þ±Ù¿öà‚¿èú ¿Z ­¿¿|„Þ>˜¢›?1ß?KáÌ>êZ×?LeX?¶A?¹Õ ?­U-?­›.¿¨—¦¿´èO¿Â®ý¿~0"?d—›?—~z>.Ôã¿Ä¿À˜•ÀjÖ¥À•ƒUÀ®b[À®;qÀ§Ñ¿À¥ßLÀ›Í$À’§À“­“ÀŸŒ]À§'þÀ£.À¢3ýÀ¥Ë6À¨²/Àª¤IÀ­býÀ¬˜ÔÀ«–¦À§KAÀ¦c=À®6¯À¹FÍÀÇ!cÀÑ%ÀÅàµÀ·óÁÀµŽÅÀ¯ÚÀ§þ/À¢)cÀ¢J*À§}ðÀ®éÀ¶ó9ÀÄöLÀØ4wÀô ‰Á =Á*TÁ±–ÁwõÁçbÁR Á- ÁÝ Àû÷Àà$íÀÀÏÇÀ IÀ€QÀJØŒÀ¬ ¿ö…k¿­d›¿Dtz¾C¤Š>¸×J?b÷š?s‘î?:Y”>Ùøî>Tx1= Ê‰½vcõ¾EÖl¾´|–¿ÛI¿CY|¿y© ¿§ä/¿õŸ]À$TtÀ?=`ÀN,eÀ[`.ÀY#¡ÀNóÀDʵÀ@Ñ\À((kÀ pÚ¿à¿ÊäÍÀ1¿ósD¿9åe¿LÎå¿'o5¼TŠó>U'½ªli>ÅUB?…"?‡Å?ysW?z"¿¼®¿Ç[p¿ÕH‹¿ˆ,±?W?¨pE>¸ï@¿‘’À9·OÀŽN«ÀªÎeÀ¾È•ÀÈ´%ÀËUÀǸ‘ÀÂ8õÀÀôõÀÊ À×)CÀâ¡ÀäWÀããµÀè!ÄÀíÀ¹Àï×ÀñZÀñÊ$ÀïúkÀìï§Àì¤ÀðÄTÀöÀ[ÀûTpÀùURÀèÜÀÙÞPÀДÀÈfEÀÃà ÀÄ@,ÀÊA¥ÀÓ"ÀÝšÀåXäÀñåÀÿðMÁ /NÁí ÁÇ"Á×Á'YÁmÁc•Á´tÁ½‚Á ˆÁ„úÀôf‚ÀÔgˆÀ¯’eÀ‹¼sÀ_õÀ-F3¿þØÅ¿¥¿L€¿¬¿ìj¿ƒ ¿½„NÀéùÀÉéÀ-hOÀ7ÇiÀ=äžÀDŽ=ÀJú¬ÀJ‡ÀP!ÀXí9Ào7ôÀ‚ÒÜÀ„kÀ‚²dÀx;À\»À8À¼–À áÀÀFſ뎿Ìë•¿îaNÀª¬Àób¿¦tÚ¿§0ñ¿VC–¾úWÙ¿%3Ö;ÛÚn?/??3TÖ?‡>?Fö¿ÍL2¿Ø K¿àG¿‹eÖ?Žó£?Ìy.?fȾrÀ µÍÀusµÀ©¿rÀÍœ³Àß‹eÀä¼àÀâ•‹Àá¯íÀæ¸wÀóI"ÁX Á ´TÁÓ¬Á^ÑÁFÕÁ‚ðÁt5Á ÿÁ>ÁõÝÁ˜åÁ TÁK…ÁPìÁáÁ Ô³ÁxÀø½ ÀðíÀë­}Àì~ÔÀñMÀù”@Á[SÁµ}ÁŒÁ ä:Á€oÁ$/Á”cÁ'X#Á)’7Á'×ëÁ(FãÁ/pdÁ2bèÁ,w½Á&ëÁdÁèÒÁÇ-ÀàXþÀ½œ À¡&ÔÀ‡ÜHÀbßÀ>Ò/À&2ŽÀ%rÀBz´Àia©À‰ÀŸ{åÀ¬¦¶À³×›À·p¤À¸vÞÀ¹%"À·mEÀ°œ1ÀªœÀ¤ýÝÀ¥¡YÀ§85ÀžÂWÀømÀx@NÀM(À!K¢¿þ>•¿ÓÉ@¿á,ä¿î§¿ÒfÙ¿Äl¿¯I‡ÀxÀ34éÀ)ïÃÀ ¿Ïe¿µ¿™Žb¾´Ð–>£‚Ä>¯Œ±>xb'>{Ž…¿Ùq¥¿ã¶½¿èX´¿’Õ•?–c`?ûmÂ?×Ér?TÊu¿:-½À(ªtÀ•±ÀÊîãÀç¸TÀò&yÀôŠiÀøŽÅÁ¿Á …ÁKÁlÁ#¢¿Á)6”Á,IôÁ.däÁ/Á‰Á0ziÁ1dÁ1J Á/ÁÅÁ-ÅôÁ*÷%Á(tÁ#0 Á]Á;€ÁamÁ š–Á~ÀÁû;Á–ÁtÁ°ÁçÁ£Á‚Á¬{Á!N%Á*}íÁ4©éÁ9hwÁ8ÒXÁ8‹áÁ<ýÁBPžÁAÆÁ:ãâÁ2¥ Á't&Á,2Á ñ3Á;¼Àéd­ÀÕ—ÕÀÄø¢ÀºxÀ±söÀ²"þÀ¾{‚ÀÏÊÀã€kÀòêÀúλÀþóMÀÿy.ÀüÓÛÀ÷v Àï*µÀ㎀ÀÔ̆ÀÄ¥ À¹‹À°0À ØfÀ‹¥ýÀdyÀ-‘¿õâ ¿¯ÐÏ¿’I­¿›òÆ¿´HŠ¿²Ty¿›8²¿yg¿šìŸ¿ÿ=âÀ"›‰À ûõ¿óŸ¿Üá ¿Ñ±“¿&’ <³G!=ñé[>+>!¶”¿ßùm¿éÒ¿í¿.¿ Ñ´?{¢G@F@“]?ì I?$¿£.^ÀdâDÀ³ÓÀÚãÆÀ솹Àô‹KÀý=ôÁóíÁ ÂÁéÁ!¿‰Á+üïÁ3«‹Á8½$Á< HÁ>gÁ@&Á@ùÝÁ@q\Á>_×Á;2KÁ7hâÁ3 ¾Á-×ÊÁ( Á#<¸Á ÓƒÁ!4°Á"_^Á"zÁKÁÁÁhéÁQKÁ5òÁÌÏÁ!ˆÁ(õ¨Á2²‘Á<ÄÁD;µÁE~ÁE2[ÁFûÈÁJòaÁNœÁMü5ÁHâ«ÁC‹Á=R˜Á6$zÁ-nÁ$ÁˆéÁuÁ Á "ÁõÁfÁŸšÁ8ÃÁÁ;Áo×Á߃Á™UÁYÌÁ5ÙÀüÑ)À绩ÀÑ“AÀ¼xzÀ¨ÐœÀ”AtÀweNÀAÀ L¿¿§Ô ¿6û¿+Y¿ À¿0Q¿(Rù¾¾¥½ú½ÌI¢¾¾¤¿Pi ¿Ža5¿¢ÄŠ¿Àý…¿Õq¿;9½qèy<ø!Y=«Xw=²=ý¿ã¾ ¿êï’¿ð›b¿·Œ²>¹>?»Ü›?ÿje?ôßi?ˆ ˆ¿ GÒÀ(ûÀ’t­À½NŸÀÔ®ÚÀá±ÎÀí"þÀû´ÁBÁÛÁ]Á%’½Á.8-Á4vÏÁ8ÆÐÁ;áÁ>fuÁ@!oÁ@QÁ=òÍÁ:g]Á6RÄÁ2¶Á-2ÃÁ'è.Á#jŠÁ ̹Á »Á_ŠÁ™ÕÁ›ßÁõÁ ¤¥Á dÃÁ Ó Á`tÁ8Á"Á-ôÁ:öDÁF`mÁK„·ÁMLlÁN/ÓÁNòÅÁP*xÁP’VÁO½TÁOÞbÁPVñÁPD=ÁO#cÁJâÅÁC<|Á<ÞyÁ7ôÁ4 MÁ1ÑAÁ/ÆøÁ-FòÁ*^5Á&Û¸Á"VÁñ¦ÁHÁAwÁ ÊkÁ Àö÷PÀßÊæÀÇ8ÀÀ®SÀ—O‚À€ŒÀR‘&À#²7¿è[¿ŒÐµ¿fþ5ýJ¼‰ik=¼’>Œ¢’?à…?et·?ˆ(?…ñ?CÀÎ>»Å‚½Èxœ¿0fN¿›Ñ¿'矽Øß‚½ F ¼C“e¼k¿âÔ׿êI׿ïÕE¿Õ·œ¿Fn`¾ q³>x >¹–¾^Ñ:¿¡‘À)³¿ÀúäÀ íEÀ¶ÞÀÅ$ëÀÑlÒÀÞ÷’ÀîVDÀÿôDÁ ,¹Áò$Áu2Á)µÁ"ýçÁ%ØÁ(¶rÁ+Á+¯mÁ*C­Á&ÕµÁ"^QÁ+ÏÁ-VÁ^Á ˆÁaºÁfýÁ°EÁ·ˆÀûpMÀòpÀë «ÀéP5ÀîŒ×ÀúBõÁzúÁCÁûeÁ)0·Á6!Á>È%ÁC’7ÁEͦÁEÞòÁEîÁDaùÁD;OÁEQ¿ÁFëýÁHÏãÁJ5ÁH¾žÁDc¶Á>ÃZÁ9‰Á4U¥Á/ŒòÁ)²Á"b†Á¦ÂÁµÁ LtÁMUÁkÈÀ÷-=Àê…àÀÛ™æÀÊL³À·ðÀ¤)ñÀ‘îuÀ€lÒÀ^2eÀ:EÐÀpx¿å§Â¿¢Ÿ&¿Q¾¾èÖ¾#»Î=ùIí>ÓóÔ?;?‚¶Ù?ÎM?¨µ¯?šEÔ?j»ç>û'G½lc¿#ÆÅ¾ý|G¾­Æ½Ûc ¾•N¾ÖÜ¿×覿ـ¿á&Õ¿ç:¿èl•¿õ;§ÀýIÀšºÀ(ŒÀCÞ[Àc#ÅÀpÀîŒÀŸ–ÝÀ®0›À¼ðÀÉîuÀ×eÀå[ôÀò¼YÀþÖ‹Á!¾ÁuÁ¶ŠÁÆ5Á ¼ùÁ ¾nÁOÁsñÁ ýÁ¸IÁT0ÀùÀë`ÀÝ;^ÀÐå*ÀÆ—À¿úRÀÁc}ÀÄñ÷ÀÈ—ÀÊ¢QÀι¥ÀÖWdÀßÂÀê|›Àùd'ÁÁ ˆoÁbKÁJêÁ$7ÅÁ(¸ÏÁ+i Á*Ó2Á(gÐÁ&HÁ$ÔïÁ#U(Á!u Á¦!ÁX€ÁæäÁ—ÚÁ lÁTÁ§Àù'ÀîH®ÀãÃÐÀÙzãÀËKÀ¼z˜À­‹ÕÀŸŠÀÀ“5À†³Às_=ÀXû'ÀDqÀ3ñ]À$„YÀÄ›Àt¯¿ßÀä¿»—R¿˜úN¿zëW¿Y|8¿8;οÍå¾Ù)¾žß÷¾@žÝ½¡Ñ–;Ü=eý=Uòr;ªœ^½®¦ð¾r«ù¾¨m¾Tʶ¾Q­¾k(¾jI ¿ÉDZ¿ÆH¿Çµ5¿Èϳ¿×ÿL¿óøµÀ W˜ÀºóÀ6ôpÀMÖëÀc/ûÀyÀˆÀ˜YDÀ¨@cÀ·¶“ÀÆ•ßÀÔçÍÀã ÿÀðx7Àüå4Á;ÁióÁ‰;Á÷Á˜DÁ Û¹Á ½ Á]Á …¢ÁÌÁ½4ÀöÇ÷ÀèIÀÙŸOÀÌGAÀ¿ÓCÀ´÷gÀ²‰çÀ²k-À³AÀ³zÊÀ³åøÀ¶GMÀ¹HÂÀ¼ê`ÀÇÂeÀÕ‹4Àã:HÀñ;.Àÿ{Á bÁ dzÁ ­¶ÁMˆÁ3[ÁbÝÁöôÁP]ÁÒ‡Á@³ÁÉ·Á ÞÔÁÁægÀú<9ÀñµkÀé®ÀâÀÛJ¾ÀÔÇlÀÅö·ÀµÁÆÀ¥ŽdÀ–H]À‰duÀzÄÀbQIÀI„®À5®ïÀ(=ÀZ À ß¹¿û>¿Øüü¿¶~Ž¿½”¿_¤¿CØ2¿.?k¿f¿×¾ù-°¾àøõ¾ÆÃ¡¾¬,`¾ã¾{€¤¾k–ý¾k#’¾ ~¾”†³¾•2m¾—$Ͼ¡©€¾¡•¿¸Ò¿°+‘¿©Ãž¿§'4À¿Ïže¿ì°Àž»ÀïÀ/ÁdÀG½±ÀaãeÀ€LÀ•|BÀ¦jþÀ¶ÙîÀÆÖ1ÀÖ]£ÀåqÀô9ÁÁÁt§Á:ÃÁ’vÁÑoÁ .Á ù6Á¥ÕÁê3ÁZÃÁ óhÁ+>ÀüržÀí|ÍÀÞFmÀÏwPÀÀõCÀ³“À«ÉÀ¥ûÀ ûŽÀœIÀ—+HÀ“ øÀ\ÀŒHëÀ“Ü£À -£À¬€7À¸½ÊÀÄÝâÀÏ5eÀد¡Àán—Àè“ÞÀî¢>ÀõrÀûógÁô#ÁòÞÁ¿=Á®"Áµ¶Á%ÀýfeÀõ—¢Àî¬çÀèê;Àä3GÀàgÀݼÀÐ=¶À¿èzÀ¯~€ÀŸj}À‘‡^À…ÀqwÀWOÀ@5ÿÀ3‘¨À$ßEÀ‰À…ð¿ÖþÝ¿­ß ¿†ýW¿G¬¿!­¿ c¨¾ö³r¾ÕÌ;¿¬ü¾®Â8¾ $¾”9¾Šwƒ¾…£ç¾‡)Þ¾g}¾›„¾­ …¾ÃÞ¿tU¿ ¾ÿ¿ ª¿¤[ý¿˜–”¿Ž‰¿‹Ob¿—rÕ¿§ï"¿¼ÃÄ¿Õí¶¿óxMÀ —UÀq…À27ÚÀL³ÍÀn…uÀŠB<ÀŸA5À¶fÀΜ Àè´òÀøXÝÁ»kÁ[%ÁJèÁ BÁ ÊÍÁŒþÁ4½ÁÈ;ÁJŒÁÁ­ÎÁ 7˜Á´wÀóÙ>Àã§]ÀÓIÞÀÂé“À²¶æÀ¦àÀ›™mÀÊ_À†0AÀvò°ÀauÀLÁÀ6¤ÀAI*ÀX¿ÜÀoµ€À‚õPÀ[£À–é-ÀŸííÀ¨evÀ±á"À½àôÀÉýËÀÖDíÀáZ]ÀꉛÀóA0Àü1²Á¥Àý¼$ÀöÀ§Àðh®Àë ÀçÙ%ÀæGÝÀ圄Àåç.Àܹ›ÀËÓÝÀ» ÀªmÀ›‘ÍÀ‹¬åÀv(RÀVñ}À9ˆ,À)HÏÀ¿À ¿ðïb¿ÊfQ¿¡5¿u¿.‰%¾õO‰¾Ò µ¾±Ó¾“¢¾sº-¾Vet¾Lfþ¾L4¾¾Vpš¾dú.¾tSr¾á¾çwI¿}¿E”’¿fnÅ¿ƒŒ¿‚úºcf-python-1.3.2/test/run_tests.py0000644000175000017500000000237612752572327017227 0ustar daviddavid00000000000000import unittest import os import netCDF4 import numpy import datetime import platform import psutil import sys import cf if platform.python_version() < '2.7.0': raise ValueError( "Bad python version for unit tests. Requires python <= 2.7.0. Got %s." % platform.python_version()) # Build the test suite from the tests found in the test files. testsuite_setup = unittest.TestSuite() testsuite_setup.addTests(unittest.TestLoader().discover('test', pattern='test_create_field.py')) testsuite = unittest.TestSuite() testsuite.addTests(unittest.TestLoader().discover('test', pattern='test_*.py')) # Run the test suite. def run_test_suite_setup(verbosity=2): runner = unittest.TextTestRunner(verbosity=verbosity) runner.run(testsuite_setup) # Run the test suite. def run_test_suite(verbosity=2): runner = unittest.TextTestRunner(verbosity=verbosity) runner.run(testsuite) if __name__ == '__main__': original_chunksize = cf.CHUNKSIZE() print '--------------------' print 'CF-PYTHON TEST SUITE' print '--------------------' print 'Run date:', datetime.datetime.now() cf.ENVIRONMENT() print '' cf.CHUNKSIZE(original_chunksize) run_test_suite_setup() run_test_suite() cf.CHUNKSIZE(original_chunksize) cf-python-1.3.2/test/file5.nc0000644000175000017500000000236412752572327016152 0ustar daviddavid00000000000000CDF time bounds2latlon  ConventionsCF-1.5  time_bounds „time unitsdays since 1900-1-1 long_nametimecalendar gregorian climatology time_boundsP$ lat_boundstlat units degrees_north long_namelatitude climatology lat_bounds„ lon_boundsŒlon units degrees_east long_name longitude climatology lon_boundsœpre  _FillValueGžunitsmm missing_valueGž cell_methodstime: mean lat: lon: meanP¤@Üè@Ý;€@ÝC@@Ý–À@Ýž€@Ýò@ÝùÀ@ÞM€@ÞU@@Þ¨À@Þ°€@ß@ß À@ß_@@ßg@ߺÀ@߀@à @àà@à8 @ÝÀ@Ým@ÝÈ@@Þ# @Þ@ÞÚ@@ß5€@ßà@ßì@@à#ÀÀVp@VpÀfx@fx@N¼ù a~@MÑk _@Nð½äÇ@NNž"Ÿ—ä@M¦usU@MRV©)ýé@Lª­±3aY@NvhEmØh@NN&ïÙCz@N5d«ë“cf-python-1.3.2/test/wgdos_packed.pp0000600000175000017500000003221012603546021017563 0ustar daviddavid00000000000000· ¸ zÐÞ I`€f' Á´B¹B ÀpÀp@€Î€?x3Ý öÿÿÿI`€séB@håB' ¡Gl™Èj,õóŽ^ ý¦¿8c&"¦Åû„qʨâe/„UrÏèk¥âSéáœg7Ø3{¥]½¸â:%Ù—ôòæùåüÿÚzñpÔ×ü³C÷>§ªMQ¾ÈcfÍÔ~Ú ãd¥Lfð¸ a)_6„€wÊ+MñM€›P­”KÊLôLóNW ’Dá×ÛDxoi,–þɬ? ’ ¾ÀæB*Ø·lg[3ùy%šz¡C¨ /9t!vŠ>"nhH+Ê‹v'¡ÒgÏ©Ak˜¯v¨x±ZšëݰÆÇäùt}'Ÿ–HúYÞ„¾`Ø ÆQyº£ÙœæDU•^;KQõ§òÈÌt“ˆÆ‹qf PŠûæðÀ„ ¦®©'L ŒªB‰  °•Ytó³Ì2OûQŠ B`L Úµo±¸(ØÔe=f·ÝB0Ý‹°€a@yÔ[#QEh°d»g i±V a]XÀZ$?°LÿJCÊOhLII0LúK†KöIòMyE}N—B-D|HLB‡KãGgMIMuOåNcHL-D@FÎ@ÊBT=þ>•9};C6¤7¶0×3ö+.E(‚)+m(Ð/a0á0û,Í2Ã3h4¤2›5=7ã13¬S$:ªIƒG®j´ Ed"®<‰@L B(®W0Š0Å)77n,Ë%„f€äB0ì±H°Á°î°¼‡¸ø±6º®ªÆ±ð‰ê¤–›’î8.lƒ;4999-1t:)2$32œ2Õ*Ö*:–38Ú4N0P/£4œ2/9ß6,.ˆ7*ž,P%|*ãf!»ª¸D â(ßÄ2†)3!Z2À,x24V/®.ÒW/7+ r -/%E;X=ì ½ á ø•0æ>¬[˜ðåB0q¢Ú¡ÿ»t§ù¸§¼]³£µÁ¤b±¯–ž–#=Òm{=:r8Œ:/Ñ71Ó458-Ñ3l3 G&5@"È!Ä/Ç+0¶.™-Q1‘&Ã,ÖV"öTÀjÿ_ ‡ · öÍ6 eR æ ä[ !)¤Ñ)”'L*U+<(Ø%FA)/Ñe¶\gFÉ*Ò)!ã$îµ Iñ’àÖ'4½ ¸Uˆ R™€%åB01¯¶¨vÄìÃ¥Ã1ÆŸº"¼4³¥fcHi>X1d‹G[M$G(FkF˜Fö@yFÎK;H0Ta¢”HtÄ'j!x5ö8‚2=3–1|2.L3.+:,¸*@+½,™*ÿ(+*({'óÌïÁ~̆î$Ô#e%b%Û(“%,È'™9ñ8‡¨XPæ`*Qžà~ŸŠ£X) 3H/Ž)Æ—#¦-wñ:ì@e3l¢Œ•€ŸáB0BƾÅÏÍÌÜÙöÒ!ÌÛÑœŸº­iJkfËjšX=_­_ªXÓ;7^>W1aW5†3-"/…$”(è+(Ãu¼:¯æC AÒE2FÎCeDÙFÛC`CƒE)D/CŠO6EßNXMá|xG2IèL·EJM >‰>gCmC>!¡F„"§ ®8×%î3-0"ÎG[&}#:µ'øMNV=§hh+¿¸SSš!CGq0éA™Tô8 ZßWßx?_n·Ô«ÀˆäB0®´ª±@Ñ¿ÈïÎо_fѾ[*o9oD_ü`{T²WðY{Sb6r?Ø6}90b3ð*M.«"í(Ôã[ ² OÈ_Bà¶åþLø–JOEQKt[_Y]~SùzlÈAÚ$¾w¨Só`dÌWM\$$ûXâ!$­#²$Ì*ðM$ 9Á¯#Ìó7ß2öcÙD·¦`cwa,fCØ9\';C9P¿ˆ~hÓª+£K¼b·€¬åB0tȽ«΢̤d$]PSnYAMtJlûBtuj?Í9MHŽCu=E;¹;É9v:#2›%Ã#°øiŠ u,°ßÕÌ Ã!Ù4 ($ó(# +)žû=¤+˜¤bLoóLÈMqGLJd=‘E]=å;8.W7;$Z(‡ · b#Ä Ô$);p{*2FˆMå*$´»ŸÒaŠ[¸:£D7;¯B¯¡ü¢VºF¡?ÕÓáÊHÔ4åB0úÎÈaÏ+ÕösppcH««ShOMNâPÕJáFçB¯AÅHºEÎC™FÁEžDnEG=eCà0n6•$D*½€ï 0 ç$8å‘’Ž#-b<™*„>¯F§¶¬¢ ¼fºG·B}‚x¢e>mƒmÿla¯b¼Rÿ_ÕH›M5A¢(Ì+Ú.(à"ö.Ž9Ó7W'uN3s&Œ¹Ø©PX¹$BRYÆg¨‚×$Ñz¥ÚÛ*‘ͰÙ"åB0¨ÓÅÒT‚gu׺4sÚ_6t^§dxWâWQlT›KvMºMjN'L“MïMMâLfO1N‚O}A"IK5³:Ã+ê"« Š øïá­€#12B‚/&¶Ê¨ÚÀ£´i¿Ž‰÷—í†N„oÆxŽeôdè_¹fZeTOIuY¿2);,¾P°R;VïYr8ql•&¢;¡{¤I£§”¥ÿª*¨¾«²«„†»©ˆq}|‚g:h÷RcZ%A¼I.¢4ñ9Z0üН…eO’@_>Eª‹¼G(™ð’” çœ+¨Î£FªEªV¹E±±¼Ã¼Š¼€²ïB0üª¥†Gm˜ocbÔm;^[•[4a[SŸUD MC;Õ;Á090G6|20;À7ëKÐ@ó?IÞF¼8™›AAðEÄŠ,FÏMáAéIOG4Z£O ’¶š—ö¥T¢ì¬‹ª–´Q®¹UºÌŠŠÀ óB0owév5_°euNtYwTïN-]!]ïX7\dIûOADùId@j?Æ>½Bv@T2q1½=õù"ø/m3ÆŸ+q ÉŒX~ iC€e€Ž„ׇe†à‰¨ˆ_ˆ‹97Ž]‘T#”š’*™ –zžª›ñ¡šŸkiQ¡P;dcAöFí1&7Ú=Ê4N7¡:Hq:ð@©9F+B0[R‘†”„Þ’𮕤砅©>¥®.®2¦Ì©€WòB00„N€ÅN*oPùW\ÃTebMmwlgaíi…RÔT OöMPMìPtJ,N )pE'° '¥ 0/¨! («2?NõÑãŒ}iû‚~„ð……ŠMˆ»Œ4‹ÄiŽf’‘£•”›˜ô–LŸšÉ¡_Ÿˆ¦Â¤ž‰Ý¥~gVy6Qš\P?œA,HÏB(Œ·DÎMv>@LŒG‰"N•nÌŽ¶šŽ|›¡“í¢%žØ¯ûªâ®Û«(´)²°²‹öB0Wj}|uMÙTJzD+]{T.™A–çh¹™æ•Ãj|OËQKÇMòPzS?JYæ1Û9g$Ž"á Î%ó$•#^*‡ß%&Ç oÊpã.ñuÃuKwEvU|Ìyó}ï|ñ€î΄ς=‡C†"Š›ˆUOŒ÷’‘â—-–4y꘾U-hšCã<šJ±@LA-=§ƒÝCCÕ†–:?K€ Cƒe†}‹… ˜‘ҜЕG¥œ¦O¢¢ú¥Ã£Ã¢Ü¥€ÕûB0+”lcŸMz“^IO“ VW5‹Íˆe]@Ž‚‡:C³EL‚FÑC?ªK5é4š2#G&w%ÂÕŸ¹\…#bü`Â^ìaãac:djnemžlÆo9nÎtÃq¯vvQyÒw”~¸{O›†ô„)`œ†l?qCK'2¯AE5 >"==*GS:>HJÕLGÿOÄMÚ§Ç£š¦Š§ˆ¤Ÿ¤«þžLš>š[ž4$šÏ›g™‡™“›Xš·kv€åùB0¼tùt²¥Òul¥—¤†©Ò§J®Æ«´zšv1Yƒhªcc^{WlbZ8¾:ä(» ‰p‹ ê9“'SPÔM¸VéUg”t‹;š†Ž‚JîUÿ …¥›Ÿ¡¢™œL•`…?’½äC“Ée•I“b—:—°™ —¹›¾›˜šŸg¯lLR>\BXÜW˜]çY_¸`É\\×µí´é®J¯z¨!«C§ß¦Ë¨§U©¼ªC§Â§î¦¸¦~©Ý¦œ€$«ÀpûB0‘xmo7| €B£›£ ¥Ì£ªÄ§q¸sdpqìbqVÈ]˜arßE@¹n¯ q*Χ'¤SkPYhVp˜êc …˜Ê¢¢¥¢£„§£Ô£Qߟ—DšŒ“+”6•7”ø‘l”¾“œ‘c—U–Z˜ï—.šî—Ç™´šd—J—ír”‰[ûnY`Ø]®e2b—gÃf­®jÚ¯´²§ãªe¦Â¥\¦±¤3¨Ž§¥§z¨Ó¥k¦á¤¥­§>¥Òj5xKûB0•€Â~›z#€‡Q€Nˆà†'€¼‰êyOvø´óz’V ZÆn¦r—„ãc›j©ái Gq!›_m—däa/¢ki ¬³¤Æªð¬§C©÷¤o¤š¡œ¢.Ÿ  3žž+ž@ž´œSqžž·ŸþžŸ"  ÜždžÿŸ<œšœ2ž3›‡iŠ|/kzjÂq[kãmêp]¸‚s¶¬<°6«©«†ª«<­«b®H®Q­®«G¬Ò¨º©áª–©€þwHC-ÍËÜlÅ¢R`\Lan¸MGåÎêXÕºj•té8R3¤»eñuZW¦Î–ŠmØŸØGÔÉB—A¯‹Rv4;­õñjÚ5L¨ TȦÊP±ŒªIQiæô뤅҅ŒÂHt, Òöè_?Û¡儾móñéÂL‚æÚ=©šã½¹¶qÉÔºQ]ÎîjláÞûeή6wÍ· Ü.õ’s¸]xo lõ¸ ‹ÝËâ¥ïQ;(¶×› _C-¼‘xXcI±´OG D¯ö4’®f#ÛÁmgIßžV±jãdB*Ú5ê,S‘CI8S…ÐR4ݣ܅cF>DSŠˆ8D+b6ñ±ŠTÅn2Žg¼øc"Aë„füêoýW?ÿßÿù„}}ËÃí±rÇ$;#böÈw@õ*–ä½¢DNëNRP?Ëù=ê¥[3#š3Läv9ÓÅÉìÉd¥(ÁPh”/¾ªêµ(È©s•C-¸ƒàPãzÙ‰‹Ä„=°–yQZoÄߣÙéššbÊŽe( ;.J¶"^ÑÈSp]eHyðà›@½ÆÆŸ„èõÿàuÐ6…ÎBþf ×4H*”}_vy¿=ãÚEðÎZç­8Þ«Ø–n^<;¦ ‡ Zf ³5=Ýúi²›ü⌠mŠ—Eõ>b4§V9¤{»eQ² ’ÜÈä=š"°Ød?ˆà§ùÖ}ŠÇóïIq)E,¦¤d¿C-”z¤K“véÍÈz$`1z”* c¸C”‚É„«lÂrØ0Dò)ðëe"AsФWî‡RwhzÄx 0‘Ê4.þO>bßíù¨|ÌÕ+ñÕÂNwöµaAºPeô|ÒTÒ: ¼QÁ¦~yý³Ü°óRQ$Zh¶‚™=ÌgÄí.×â¨ÒZè`B;)4m©þ’€»C-qä~iôö»æÙëðxú0œF6#ꩼ¨a±±/ƒ¶BcýÁPëó¿‰ kðâzÕÕÓÝqű-Ø÷Í×d]C¦š5_¬Í³‰äÃw. ùËØ`c‚ñŽdFÄ?R2/ÙzG`dÉçq :žKqÈ(SÁ®áåéL|õ,³V_ëã^ê¬ÀÑÆ’çöo#@À5‚ñECèqÊ¡e#<.^÷ØZr''ŸÝö‹!æ1Ù×DôC-é˜6DT}bHR i,A %;tÂß|b˜»{ÇÙOÎôdÜ3€ÄJ¹•ï­tÖÔ§W?ÒAÏL–Eæ<,Í)Q„¸Ò$Õqˆg”5Å]иl¦6«RÂLBf›2kÎŒi†32Y¼ËËÄÕë,®–k°{˜Þ¶Â]0¤RjU·«fµ½ÐEs›É¦)¨¬æÓ› Ì“ÄÝò8ζ{C}Y­´iµëŸÅÑŒD¦.°gØw¾T_Ž}URŒ8ö¹1Ÿ˜µÁîb5¬*k’|IE#5u‡3Nú€ @zq+RÎÍõΟDij2»ôb¸ž*be¤‰5ˆ$–ü¶C-AžjSi2XâŒR³S}-O–žÙŸ¤bDÒ~ƒÃ{ìáý­ö¦¦2ûg¾N` »ò}aÊ x¥mSCÝç…¡Jºô«¡—å’šÉ=ÚÅ£9‡²»‘›%îàlr¶+°=Ù r&S1ÍØ¢Âèa< ‡}\¬Aö2ØYÉ>eµä “ª†L7'@+E—Bn5„êÔéoƒû7Ò‚± ŽƒÓ2Èpeùã’„±ŠƒUL©ÚÔh÷C-L[Ô0BrÁ—ŠM;!¾šb±ùà–OKR—¼ËÄXö-úE娨tqèÏux~8ä’Qüˆ7æõ"cÂØ‘B#)~H£ëV¡ˆ2-g4¼RB=º:Í”‚ŠÔÑ4‰€E#ú q‡Gô#ÝNªxÂ;jÚ9ïmÇÃ3°œ’NÐxØ:CªäK3¦=(ÚÂŒ`OJã\9Þæö]g$ÁÎÌÆÈãäÁϧx¦<ÆÇÙíØ†fhÓ)@ Ô/C*á„ø#Fɺ××l†2ÀÜêGŒM™Zb3cÕôuM<‘0$ãÙ¨Ü …9CžOP®_¬qã:Êšµ·í¯Ïiz¬BqP‹é–÷*mRekL´´ÕG3HNÛâ·<Ð2ºËË)Ó̪¸+ ‘ †RÒ§<'sˆË‘‚ôè éÄŇ&£ìM]2ÆÓœe¥DE“ã¢Ð 4%±ŠÉb‹”|%·H#28+C*±yh!ò„E"’>Y}€QÅÞ½¨=öâÊëRqr€% ‚ÈÄa1Xì4 Â@s°"$µ[ïÒqÁ‚¦"‡’Ny?¢©?á’òd¸µF¤ÏÜcîˆ=*½ w­Á}àà!°G#\d7ÞDEÑ1Vœâaã J¤<Ó$ÛôT"×µ(a¨!eÏ72ÁV(” ‹ÄC®À$Dœ X†dp C*³“Ð-B N Uà$¦Æ_æ_ë`?Ú[Lmм,“GáîÐPTp¸@C€E«!ÑX` ,ZˆÂȹ²AW¥“vÆ+)aJdûÒZä$ ™C1B2­Ì%‹‰HHâzä!ÕW…Š‘1eÐ^F'Y$¤ sƒFà/Z</no6”ší‘$<©&Ñfô¸¸Äý;G@ž4H“AÐC*eî@O5–ö yÚ¡ª³D¥^…ØP­k‚o¶EmYYLÆ“3þ D-¿Œ‰K¢žš$&d ÝÏ@3>wNFñªA‘ömòšKȦ–iBÇž¡vf¤qyPV(Ä.I}E¢‘ÎÚÃñà;Í»ÌSCÔÌ46TNNAɸ€/[ÌŽÐr¹üF‰‘¯ †³•¡JkÕ¶£3ÿ46M‘£êÌ04?žŽ1SàËC*2]T4‚DŒS¦¤è*ñ ‹¿±m¥Ä&?úÉ>㳑>Ó ¨Ò¼´L"– lyLĬÄá‘Kô!|QzÓ¥=PßPÒëWÁLég‰æD‚q{BÓñ¡ƒí´Ô0WHr³€\!„ŠF¥ñj@DG‰ÏqkÄØG‰h^¼/ (õOqH&»Ki™¡P¼ÙDÉBƒðt’ƹ˜›C*rª˜*#ßI°ÒˆtˆJ¹ÀFvX0«…ÁÁ±KHA‰¿ºSí$<6]ŽÌg“صÈ/äþŠÕ"Ÿ¸*1wŠecTñämi¯TÐEmÓùhnÉfhã·¦œpž& ÕÙOgO ô×p;zâË3ò¶//‹»Ô0ÓLŽóBÃ(\G:£Zñ†¿ü2šÇoµàP|ÂÍ<Ã)¶ÌIx{C*"«|.!Ô ¥é¡w$Ü Æ1J?ô•áÀTð¤3©c®ƒý€7÷ McÕÃl0…H sóÙ¤599MeÍ”ñ%lWX¸Eh¢€qDua×ÎnOª‰µƒAÑW¨VR§$CH|¶ÎóÃÃê :8zo„ããh<÷β#öBôPl\ŽÊ|Ì/yˆÐ›€B”øĈY1:¤&Úä gs`bC*‘„ ÕWz1ahTNF…X1mJ¸0ŒÁÑÀ¼4ÆA‰ÉSâ0 :NL4#Þ·0ÃÂËɲ³Ãø0=P”hÔ é­LÀÒU3åBˆiZRRËDd&‘H[«¾õZEiN”Óô40åL)QoD‘D?€ÏõðƒõÔÉ@!ÐÑD\UqÌñÚágH4؇*õÐL¤´Ä‡ï|Žô&ß_É;rðRC' Ïl±l2ƒe'¸Ò9*‡WX( tbPUü°ZùÍd”ïz«Û嵺‰4qTozQ#ÆÈêm´Üàz6ÿd‚RÚ“nå‹×l\†fK•¸‚Ñ £›EY˜8ñ,îâb$ŽìÏñ­<Æ{|ÀyûžKû;Ìš…[OL ù|0ÒR¥‡¾ºQ-r—ôÄb£=4 3C' P«É-ä„b§ïDŸâ!?Þ³z|á Û)5é†CPÉd< õÐ- m¼ÉÃQ¤lÔÚÊT5ÔŸúTÐ6Ï$.Y¹³à›†PÌIͧÀ î1kq , ÉÝfþËjy™/ ¢uÉÐh% FênŪ$JN[rVVÌ„¬•Óû;‡$”/[¾<Ÿ‡w¶¸Üy§+Õs÷¤ê¼“ ¥Æú¤Ž<8C' ê‘:%U”Ê,qu+âÒ]¸×fÅ-›òSÚj‹Ø*óùêQò!Ľ@jV z:NØæÂNI4µ bvºì¨[#VPPL¤)åGEªQŒÑW!Žâ˜;5wzí¬Ý¬ù*bô˜FÓý”¥= P(‘kt1$° ~H$á9ÄE* Òñ£$åì¶r—ƒN½øC' Ù ajgâ>ð –?Ä„Løçà!ÊGS}Fp‰,ÔìŠÑb`rÁ1²oâi’‹v«§âˆ Ì>o‹^u—œo†Ë:µ´Íµmåo×êKzú{î¯,U¨ýóTRJS¢–ĺ®ú ´8»k%vÃRY´¥´+Kr{­˜»î»ÅvŽ «¾¢[N ¬]s‹Û-¸åH{iEh;ö8øC' ÓIrOEŸnǧÍ18í«þÐhYªw£hqì{ªÜ„,‹P©à e§»c^ s=OzN dƒVíD©•ïŠbEçÃU9J;,Ô™¢Ó !ŒÉ@Șp±NïC¡ÊãJ¹2B""ždJhŸ° ~@_”ˆvñâ .F¤@ÙÁW€zÈ•“R?Jä±|´à6÷ãÊ”i÷C' J@!/ÕÂU…ÇT™l¹';ÂîŽ@¬ –2){BkT‘% ËÀF'ü@$ÐGp áR  4À x åM:¯Õ*ñÓ†ù.áäÞâ¯Ön îyžg‹°W¶Þ~®¶íÝåÃ|Hgíðîâý:Å“vO÷ðBòP- PºÀHBgy#ÄQÓ)ž’à:¢t”wHfâ ðïC$ NÎEn6[õD ƒYSY]ã"Ò#EEÎÐo Ür%)ÂÞò!–$¸R/b&[²Ø± s.ñAfqB+‚&Å"ubH|‹ª³—ÁÅh(튇¶“ šÖcI7õebM{ Çf'w*X(|<ÿ•gª0š†5¼3:T3íÂyLXÖ^Çm–%eGvÙ07C*L ÃÂÄàp2DçÂqðH|'qÁbMŠz‚‹ÊŠ··•mW‘ûßvü3áSq‚µ}8¼®L}"140½@GγYƼ ïp |÷ŸÅǘ°Bì\{ÅźpQVü_Çq³¼<($sÎýô1i| 7OËË3ÜÝ,2ã[Ì3µ¢=7WøAg_*Ì#KÇʼn1€DLÅü°ð7,/¸ƒð#¬€ªúB-~QC¨ªD]£j/õŽƒûTK¾Iõà.$Ì¢Læt€K5‘/ lÖ•& Ix'Ja”ئ%´Ï’ÄJ7LºØg‰ ÃC?µ°®|cj,ejuó¦¥Seª:RU©YU£ªNT¯ªUWý£"U€j†TN*Q™¨ÊE £ªu†©:U_§QߨúI¥ÉcçR‘«ÔDµ­ÞWu§ºVT’êMS{©âV%©bq³Š_Ô‡ªøB-äJEB¾øeµ¦IMž#È Až`BŠÉ¯CæB@#¥‰ªX¤… f"4)¤¨ApƒŒaÍ…ò„ 6‡7¼7T– ýÙÍ´j™ÂTA9UñTЯ…Ü<ëú_{Y|+ö ¯wWÏêa_§7Õ}‘ŽJu§º9ÕsêvXMäbé-Â'm%ä–@,òB-Ø^ Añçp†LCÖƒ0 ˜§ -øfÆýá030“‰¿øhæ £c•( m9Ü$£éØj¨š$"†ˆØ5f’9é|‹…Â?r=³Ý¡”:z·Nó˜ûÚ jïˆ÷¾|5ŽpÊ8r«;ܹ_mÇ?ÒÖ©NÈ»c&*}’Êð|ge£S—šJÎì†I»l jV|õ [áô¸k'Òêþ<Ÿ¢úr}–j‹ÉËITež­e·’'B×@‹ñB-U¨H^rÀñ‡ªåA ^ 4ÀÔBÑt“ è…9£¬{0 Pí7DûÍé€ä˜"UÎñ§Ã²{Z@ñB-õ¸d£4"F †² ‘W0t'vp'0; p=°<° †‚Bê'rU¼ˆWØÐ¯!dH([ö'áШËPÖ£µË…¾âúj}Ü¥´A8Ú†ì6e/´:z­Ãé³uí˜ÅÏ·f!û²«º^„.JJç²6ôJ®,çrç±wšê“ù¬óÅ¿w›EÝÕî¶6/­z-WàóšSå¶YìjRàͬW„³RZ@NóB-À‰¸I’™ïÑdË¥wJ*¾» t6Â?a¶)ƒ8À=àƒ¬Aͼuk2ȼÕ`ê ûC$DXRnQ¤Œÿ…ô/Í—<m”nåtŠ<¢«mz&5œB6ôŠÀX«ã^¿°;5±Î0³ûi;Hq¥ ôœˆ$y*Š (?X·$Ë'Ü"e ÙëU¬ÐÖŒ‰PÓÈ)üÇ!¥ÿŽˆ%Q“×A“êê5G¦ÖS@öB*uœ™lMDUÞò“u7ãŽJé¢Ív@#=ØÅ†±À;äûÁ¡àìäÁ%€!@BÅÊÀá<:bÎ:Ú¤ô$šŠ ‘BûŒ:U̧cò˜P+<“LžLEYÍe§W›œ¤Ìùwœ©X‡DZu[4aN´M䜮zQV÷+ýÁG÷ÙÏ­žû;÷¾²¹{m¸eª¶îÒ“âhŸs(@º¥vÀ¶†€"ûB qQ˜x3cf-python-1.3.2/test/test_create_field.py0000644000175000017500000001265612745346617020653 0ustar daviddavid00000000000000import cf import numpy import os import unittest class create_fieldTest(unittest.TestCase): filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test_file.nc') chunk_sizes = (17, 34, 300, 100000)[::-1] def test_create_field(self): # Dimension coordinates dim1 = cf.Coordinate(data=cf.Data(numpy.arange(10.), 'degrees')) dim1.standard_name = 'grid_latitude' dim0 = cf.Coordinate(data=cf.Data(numpy.arange(9.) + 20, 'degrees')) dim0.standard_name = 'grid_longitude' dim0.Data[-1] += 5 bounds = cf.Data(numpy.array([dim0.Data.array-0.5, dim0.Data.array+0.5]).transpose((1,0))) bounds[-2,1] = 30 bounds[-1,:] = [30, 36] dim0.insert_bounds(cf.CoordinateBounds(data=bounds)) dim2 = cf.Coordinate(data=cf.Data(1.5), bounds=cf.Data([1, 2.])) dim2.standard_name = 'atmosphere_hybrid_height_coordinate' # Auxiliary coordinates aux0 = cf.Coordinate(data=cf.Data(10., 'm')) aux0.id = 'atmosphere_hybrid_height_coordinate_ak' aux0.insert_bounds(cf.Data([5, 15.], aux0.Units)) aux1 = cf.Coordinate(data=cf.Data(20.)) aux1.id = 'atmosphere_hybrid_height_coordinate_bk' aux1.insert_bounds(cf.Data([14, 26.])) aux2 = cf.Coordinate( data=cf.Data(numpy.arange(-45, 45, dtype='int32').reshape(10, 9), units='degree_N')) aux2.standard_name = 'latitude' aux3 = cf.Coordinate( data=cf.Data(numpy.arange(60, 150, dtype='int32').reshape(9, 10), units='degreesE')) aux3.standard_name = 'longitude' aux4 = cf.AuxiliaryCoordinate( data=cf.Data(['alpha','beta','gamma','delta','epsilon', 'zeta','eta','theta','iota','kappa'])) aux4.standard_name = 'greek_letters' aux4.subspace[0] = cf.masked # Cell measures cm0 = cf.CellMeasure( data=cf.Data(1+numpy.arange(90.).reshape(9, 10)*1234, 'km 2')) cm0.measure = 'area' # Coordinate references coordref0 = cf.CoordinateReference(name='rotated_latitude_longitude', grid_north_pole_latitude=38.0, grid_north_pole_longitude=190.0) # Data data = cf.Data(numpy.arange(90.).reshape(10, 9), 'm s-1') # Domain domain = cf.Domain(dim=(dim0, dim1, dim2), aux=[aux0, aux1, aux2, aux3, aux4], measure={'cm0': cm0}, ref=(coordref0,), assign_axes={'aux0': ['dim2'], 'aux1': ['dim2']}, ) properties = {'standard_name': 'eastward_wind'} f = cf.Field(properties=properties, domain=domain, data=data, axes=['grid_latitude', 'grid_longitude'] ) orog = f.copy() orog.standard_name = 'surface_altitude' orog.insert_data(cf.Data(f.array*2, 'm')) orog.squeeze() orog.remove_axes('dim2') orog.transpose([1, 0]) coordref1 = cf.CoordinateReference(name='atmosphere_hybrid_height_coordinate', a='aux0', b='aux1', orog=orog, coord_terms=('a', 'b')) f.domain.insert_ref(coordref1) # Ancillary variables tmp = f.copy() tmp.remove_items(role='r') tmp.remove_item('aux0') tmp.remove_item('atmosphere_hybrid_height_coordinate_bk') f.ancillary_variables = cf.FieldList() g = tmp.copy() g.transpose([1,0]) g.standard_name = 'ancillary0' g *= 0.01 g.remove_axes(g.axes().difference(g.data_axes())) f.ancillary_variables.append(g) g = tmp.copy() g.standard_name = 'ancillary1' g *= 0.01 g.remove_axes(g.axes().difference(g.data_axes())) f.ancillary_variables.append(g) g = tmp.copy() g = g.subspace[0] g.squeeze() g.standard_name = 'ancillary2' g *= 0.001 g.remove_axes(g.axes().difference(g.data_axes())) f.ancillary_variables.append(g) g = tmp.copy() g = g.subspace[..., 0] g.squeeze() g.standard_name = 'ancillary3' g *= 0.001 g.remove_axes(g.axes().difference(g.data_axes())) f.ancillary_variables.append(g) f.flag_values = [1,2,4] f.flag_meanings = ['a', 'bb', 'ccc'] f.cell_methods = cf.CellMethods('grid_longitude: mean grid_latitude: max') # Write the file, and read it in cf.write(f, self.filename) g = cf.read(self.filename, squeeze=True)[0] self.assertTrue(g.equals(f, traceback=True), "Field not equal to itself read back in") x = g.dump(complete=True, display=False) x = f.dump(complete=True, display=False) # print x # print f.domain._axes #--- End: def #--- End: class if __name__ == "__main__": print 'cf-python version:', cf.__version__ print 'cf-python path:' , os.path.abspath(cf.__file__) print '' unittest.main(verbosity=2) cf-python-1.3.2/test/Datetime.py0000600000175000017500000001004012272671075016705 0ustar daviddavid00000000000000import cf import datetime import numpy import os import time def test(): start_time = time.time() print '----------------------------------------------------------' print 'cf.Datetime' print '----------------------------------------------------------' # ---------------------------------------------------------------- # cf.Datetime # ---------------------------------------------------------------- d = cf.Datetime(2003, 2, 30) d = cf.Datetime(2003, 2, 30, 0) d = cf.Datetime(2003, 2, 30, 0, 0) d = cf.Datetime(2003, 2, 30, 0, 0, 0) d = cf.Datetime(2003, 4, 5, 12, 30, 15) d = cf.Datetime(year=2003, month=4, day=5, hour=12, minute=30, second=15) assert((d.year, d.month, d.day, d.hour, d.minute, d.second) == (2003, 4, 5, 12, 30, 15)) assert(d.timetuple() == (2003, 4, 5, 12, 30, 15, -1, 1, -1)) assert((d == d) == True) assert((d > d) == False) assert((d >= d) == True) assert((d < d) == False) assert((d <= d) == True) assert((d != d) == False) e = cf.Datetime(2003, 4, 5, 12, 30, 16) assert((d == e) == False) assert((d > e) == False) assert((d >= e) == False) assert((d < e) == True) assert((d <= e) == True) assert((d != e) == True) e = cf.Datetime(2003, 4, 5, 12, 30, 14) assert((d == e) == False) assert((d > e) == True) assert((d >= e) == True) assert((d < e) == False) assert((d <= e) == False) assert((d != e) == True) d.utcnow() cf.Datetime.utcnow() print "cf.Datatime passed" # ---------------------------------------------------------------- # cf.dt # ---------------------------------------------------------------- assert(cf.dt('2001-2-3') == cf.Datetime(2001, 2, 3)) assert(cf.dt('2001-2-3 0:0:0') == cf.Datetime(2001, 2, 3)) assert(cf.dt('2001-2-3 12:30:15') == cf.Datetime(2001, 2, 3, 12, 30, 15)) assert(cf.dt(2001, 2, 3) == cf.Datetime(2001, 2, 3)) assert(cf.dt(2001, 2, 3, 12, 30, 15) == cf.Datetime(2001, 2, 3, 12, 30, 15)) print "cf.dt passed" # ---------------------------------------------------------------- # cf.cfdatetime.rt2dt # ---------------------------------------------------------------- assert(cf.cfdatetime.rt2dt(1, cf.Units('days since 2004-2-28')) == numpy.array(datetime.datetime(2004, 2, 29))) assert((cf.cfdatetime.rt2dt([1, 3], cf.Units('days since 2004-2-28')) == numpy.array([datetime.datetime(2004, 2, 29), datetime.datetime(2004, 3, 2)])).all()) assert((cf.cfdatetime.rt2dt([1, 3], cf.Units('days since 2004-2-28', '360_day')) == numpy.array([cf.Datetime(2004, 2, 29), cf.Datetime(2004, 3, 1)])).all()) print "cf.cfdatetime.rt2dt passed" # ---------------------------------------------------------------- # cf.cfdatetime.dt2rt # ---------------------------------------------------------------- units = cf.Units('days since 2004-2-28') assert(cf.cfdatetime.dt2rt(datetime.datetime(2004, 2, 29), None, units) == numpy.array(1.0)) assert((cf.cfdatetime.dt2rt([datetime.datetime(2004, 2, 29), datetime.datetime(2004, 3, 2)], None, units) == numpy.array([1., 3.])).all()) units = cf.Units('days since 2004-2-28', '360_day') assert((cf.cfdatetime.dt2rt([cf.Datetime(2004, 2, 29), cf.Datetime(2004, 3, 1)], None, units) == numpy.array([1., 3.])).all()) units = cf.Units('seconds since 2004-2-28') assert(cf.cfdatetime.dt2rt(datetime.datetime(2004, 2, 29), None, units) == numpy.array(86400.0)) print "cf.cfdatetime.dt2rt passed" time_elapsed = (time.time() - start_time)/60.0 print print '---------------------------------------------------------------------------' print 'All cf.Datetime tests passed for cf version', cf.__version__ print 'Running from', os.path.abspath(cf.__file__) print 'Time elapsed: %f minutes' % time_elapsed print '---------------------------------------------------------------------------' print #--- End: def if __name__ == "__main__": test() cf-python-1.3.2/test/PP.py0000600000175000017500000000351312343555751015500 0ustar daviddavid00000000000000import cf import numpy import os import tempfile import time def test(chunk_sizes=(17, 34, 60, 300, 100000)): start_time = time.time() print '----------------------------------------------------------' print 'WGDOS packed PP data' print '----------------------------------------------------------' tmpfile = tempfile.mktemp('.test_cf-python') print 'tmpfile =', tmpfile original_chunksize = cf.CHUNKSIZE() filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), "wgdos_packed.pp") cf.CHUNKSIZE(10000000) f = cf.read(filename)[0] assert f.data.min() > 221.71, "Bad unpacking of WGDOS packed data" assert f.data.max() < 310.45, "Bad unpacking of WGDOS packed data" array = f.array for chunksize in chunk_sizes[::-1]: cf.CHUNKSIZE(chunksize) f = cf.read(filename)[0] print 'pmshape =',f.data._pmshape, 'chunksize =', chunksize for fmt in ('CFA4', 'NETCDF4'): cf.write(f, tmpfile, fmt=fmt) assert f.equals(cf.read(tmpfile)[0], traceback=True), \ 'Bad writing/reading. format='+fmt #--- End: for assert (f.array == array).all(), "Bad unpacking of WGDOS packed data" #--- End: for # Reset chunk size cf.CHUNKSIZE(original_chunksize) # Remove temporary file os.remove(tmpfile) time_elapsed = (time.time() - start_time)/60.0 print print '---------------------------------------------------------------------------' print 'All cf.pp tests passed for cf version', cf.__version__ print 'Running from', os.path.abspath(cf.__file__) print 'Time elapsed: %f minutes' % time_elapsed print '---------------------------------------------------------------------------' print #--- End: def if __name__ == "__main__": test() cf-python-1.3.2/test/file8.nc0000644000175000017500000016777412752572327016176 0ustar daviddavid00000000000000CDF timebounds2latIlon`  ConventionsCF-1.5  time_bndstime  long_nametime standard_nametimeunitsdays since 0000-1-1calendarnoleapbounds time_bndsaxisTlat_bndslat units degrees_north long_namelatitude standard_namelatitudeboundslat_bndsaxisYH ¬lon_bnds ôlon units degrees_east long_name longitude standard_name longitudeboundslon_bndsaxisXôheight unitsmpositiveup standard_nameheightaxisZ long_nameheightôtas  _FillValueD¯€ standard_nameair_temperature cell_methods time: mean (interval: 1.0 month)unitsK missing_value`­xì coordinatesheightÛüAPA@AÈÀV€ÀV0ÀV0ÀUÀUÀTðÀTðÀTPÀTPÀS°ÀS°ÀSÀSÀRpÀRpÀQÐÀQÐÀQ0ÀQ0ÀPÀPÀOàÀOàÀN ÀN ÀM`ÀM`ÀL ÀL ÀJàÀJàÀI ÀI ÀH`ÀH`ÀG ÀG ÀEàÀEàÀD ÀD ÀC`ÀC`ÀB ÀB À@àÀ@àÀ?@À?@À<ÀÀ<ÀÀ:@À:@À7ÀÀ7ÀÀ5@À5@À2ÀÀ2ÀÀ0@À0@À+€À+€À&€À&€À!€À!€ÀÀÀÀ¿ô¿ô?ô?ô@@@@@!€@!€@&€@&€@+€@+€@0@@0@@2À@2À@5@@5@@7À@7À@:@@:@@<À@<À@?@@?@@@à@@à@B @B @C`@C`@D @D @Eà@Eà@G @G @H`@H`@I @I @Jà@Jà@L @L @M`@M`@N @N @Oà@Oà@P@P@Q0@Q0@QÐ@QÐ@Rp@Rp@S@S@S°@S°@TP@TP@Tð@Tð@U@U@V0@V0@V€ÀV€ÀUàÀU@ÀT ÀTÀS`ÀRÀÀR ÀQ€ÀPàÀP@ÀO@ÀNÀLÀÀK€ÀJ@ÀIÀGÀÀF€ÀE@ÀDÀBÀÀA€À@@À>À;€À9À6€À4À1€À.À)À$ÀÀÀ@@@@$@)@.@1€@4@6€@9@;€@>@@@@A€@BÀ@D@E@@F€@GÀ@I@J@@K€@LÀ@N@O@@P@@Pà@Q€@R @RÀ@S`@T@T @U@@Uà@V€¿þ?þ?þ@€@€@"À@"À@*@@*@@0à@0à@4 @4 @8`@8`@< @< @?à@?à@AÐ@AÐ@C°@C°@E@E@Gp@Gp@IP@IP@K0@K0@M@M@Nð@Nð@Ph@Ph@QX@QX@RH@RH@S8@S8@T(@T(@U@U@V@V@Vø@Vø@Wè@Wè@XØ@XØ@YÈ@YÈ@Z¸@Z¸@[¨@[¨@\˜@\˜@]ˆ@]ˆ@^x@^x@_h@_h@`,@`,@`¤@`¤@a@a@a”@a”@b @b @b„@b„@bü@bü@ct@ct@cì@cì@dd@dd@dÜ@dÜ@eT@eT@eÌ@eÌ@fD@fD@f¼@f¼@g4@g4@g¬@g¬@h$@h$@hœ@hœ@i@i@iŒ@iŒ@j@j@j|@j|@jô@jô@kl@kl@kä@kä@l\@l\@lÔ@lÔ@mL@mL@mÄ@mÄ@n<@n<@n´@n´@o,@o,@o¤@o¤@p@p@pJ@pJ@p†@p†@pÂ@pÂ@pþ@pþ@q:@q:@qv@qv@q²@q²@qî@qî@r*@r*@rf@rf@r¢@r¢@rÞ@rÞ@s@s@sV@sV@s’@s’@sÎ@sÎ@t @t @tF@tF@t‚@t‚@t¾@t¾@tú@tú@u6@u6@ur@ur@u®@u®@uê@uê@v&@v&@vb@@@&€@.@2À@6€@:@@>@@à@BÀ@D @F€@H`@J@@L @N@Oà@Pà@QÐ@RÀ@S°@T @U@V€@Wp@X`@YP@Z@@[0@\ @]@^@^ð@_à@`h@`à@aX@aÐ@bH@bÀ@c8@c°@d(@d @e@e@f@f€@fø@gp@gè@h`@hØ@iP@iÈ@j@@j¸@k0@k¨@l @l˜@m@mˆ@n@nx@nð@oh@oà@p,@ph@p¤@pà@q@qX@q”@qÐ@r @rH@r„@rÀ@rü@s8@st@s°@sì@t(@td@t @tÜ@u@uT@u@uÌ@v@vD@@mYm¶Ûn@m†ä@m|n¤@mq.ü@meÅØ@m[#l@mPDt@mE´@m;-@m1À€@m(Uø@m! œ@mCü@mx@mU@m ¹@m&\@m$@lÿM$@lý•P@lüç@@lý](@lþÝ @m P@mž<@m 4Ä@mŠÌ@m@m#‡\@m+Ò@m5¤¼@m@ @mJ† @mW x@mcd@mo´@m|j@@mŠÕÐ@m–ãÀ@m¡œ@m¯„@m»}Ä@mÉ0°@mÖ44@máÎü@mí‘<@mø_8@n7 @n óü@nа@nÜ@nL@nE¬@n"N(@n$­Ì@n&¥ó4@mW"p33@mewògæg@msŒ1fg@m‚Á­¶9š@m“‰üÆg@m¡ïKë†g@m¯g«ŸÓ2@m¿`€} Í@mÍãS@ìÍ@mÝà˜4g@mí,Q-ìÍ@mú£ÂŠŒÍ@nvmõ¬Í@nMЬÎ@nö2³LÎ@n*q=Цg@n3™°×Ó3@n:|›3@n@ Šk@nE#k¸`@nHÂlÉ@nK€! ù™@nMå¨À@nN'—`@nNg¡0Ù™@nMÆ.ó9š@nLuÄkyš@nIŸ7 @nFwÛfg@nB¹…fg@n>²?$ó3@n9Ñe¥À@n4Ýùû€@n.´Ø¿LÍ@n(OnûFf@n"ݦf@n­Þ~ Î@nDè0 @nv’l@nwØK€@n9]œ€@nHàr`@n:¸`¹™@n ‚#)ìÎ@n ™Sk Î@n –œ4@n Uwì,Ì@n™ Ì@nÇé³s4@ní73@nÔC)³3@mþ=ü¹ Í@múðKÙš@mø:îùš@mó‡Â9@mí( $4@måýíh34@mÝeó¾ù™@mÓÊV9š@mÊ•þ†š@m¿ O @@m³y@@m©\ iÀ@n-¶Ûn@nlÈ@måõì@mÆl”@m¥]l@mˆ{ @mj¡Œ@mLt@m2 @m5À@lû·„@læv€@lÒÐ@lÁr@l¶=l@l­FÔ@l¦€|@lŸk @lšœ@l—ª,@l–ýü@l—íd@l›T|@l CL@l§rÈ@l°ÛÌ@l»I¤@lÉÖ(@lÜ*@lîÝ$@mop@m:D@m9-´@mX Ø@myð`@m›!T@mÁK¬@méV@nÜ@n7s„@n_«|@nƒP@@n©ãü@nϱ@nï…D@o³ @o2¼@oO.<@ojØ´@oƒ{@o—¢à@o«V°@oº‘ @oÃý@oÊZ`@oÌM<@oÉáÜ@oÃÑl@oºn@o¯2@ožô@oŒ×´@o{„x@og¥˜@oS@ü@o>þD@o'|@oÿ|@nü€@n韬@nÚ@nÏ¿X@nÇ+Œ@nÁ,\@n½·„@nºŸ´@n¸ª„@n·Â|@nºÄ@nÁEÀ@nÄoè@nÇäì@nÉ]X@nÈfÈ@nÆÌL@nÇã|@nÈz€@nÅD,@n¾ZŒ@n³ü@n¥¼@n”4¤@nƒÄ@ncß(@nK¨`@n7:8@ni¥JÆÒI@n@?¸[¬@nx€`@m鑱bD@mº®;„@m‘aQoœ@mi ±D@mB*—›t@m!j % @m‹­è@lᑞ@ @lΌѸ@l¹C²ÃÜ@l©³ˆT@l¥Õ @l¡< ¡l@lŸÎkT@lV‚Ä”@l¼8@lœôp„@l›z¿A¤@l™7Ï«ô@l–óûK@l˜ªÆH@lž &Þ¼@l¤ß2°@l­EVp@l¹¶9 ¼@lË)¥ „@lÝ©@lùJãX,@m OîÌ@m;9à·x@með @m”'k„@m¿V Òð@móâGÿ€@n+Wó¼”@n]cèÙ”@n–r²Ã¨@nϱ*¬@o¸ÿ—È@o8Â÷Ò@onDq°@o  0à@oÔnÌ@p™ï©L@phŒ²@p0è—#&@pC=Ÿ¬ò@pR CŸ@p_¤Iµ @phÖðV@pmŸåiÀ@poÁ9R°@pm×®ì¾@pia;q@pa„Scž@pVíR­Š@pKT‡œº@p=P‚¸H@p.£(>@p!~©„È@pjѰ@p¿c°@oõÒu<@oÞŽ£‘˜@oËñ”]ø@o·úü†¸@ož9Ð|@oŠ4OŒ`@o|"ûjd@ot(kÌ4@om‡C,@oi(6¤(@oeÑø@oaq¶8@o]yA@o[Ÿ×P@o]5>6ì@o`¾˜«@oeý;«`@okBç½D@ooÔh¸´@owPGh@o}ã:0p@o‚<‘×´@o|°ÞÇ`@oph¢ H@og¤1|P@oSOoÐ@o4Z;+x@o‡.0@nåIÌÙ¨@nºþJÙ|@n”¾ld@n_‹À”35@n,e³™¸Í@mû¥ =¤Í@mÆþÿÒx@m™$Rjf@mphÂ^f@mG¸a:¹›@m&ò˜ñš@m 1š9š@lö¨`Ík3@lçÎÎP@lß¿.X@lÜÁéU¼@lßDwÅIš@läø²äuš@lë-cE›@lôÅàœÌ@l÷YÚ¿tÍ@lö^2ŠÏ4@lõ"žë3@lð2ÍÃ3@lç ÁtÍ@lÛïÝEÇ3@lÑÑQ3@lÆvŸ>”Í@l¿ž»s¼@lÄfíøø@lÑ=kþ<@lã±mg4@løÂ¶ƒ3@m!9îg@m;Ïð& š@m]¿b*Uš@m„Ý‘iš@m®V¯£3@mÖL62¿3@n Êæq›@nE=nµš@n{™ÜâYš@n·*%IÉ›@nõžÌ@o.ëšñä@onì8ª@o¯q¬Èð@oéeµ¬”@p_gw®@p19Ú@pK’Ï¡\@pd"[_Î@pxpúø@p‡ú?`@p‘>M+5š@p•k“bD@p•b`Ø@p‚ž×4@p‡½â¹š@p}[yš@pn@'”Fg@p]q˜ÀÍ@pM+•ttÍ@p:¼ûhá›@p&úWÖf@p|hAJf@p7‡4@p ~ 5Å™@pÒš@p*Þn@p"mÛš@oõ›,Àÿ3@oçQÆÔ@oØ‘<‰1š@oÊ Y@oºn€‚HÎ@o¬¡kUš@ožgÆé™@o“=ð¢§4@oŒÓŠï3@oŒpU33@o‘Æ·ÏÀ@ošÐј«4@o¦Ñ©C[3@o²av Žg@o¿@Nf@oÉJ©2Âf@oÞ åg@pŠ¿†²Í@p64ÀÌ@pË:h@oò~±KôÍ@oÓd«½øÍ@o«EZ‘Òg@o}‡àÍ@oN‘Ýv`Ì@oºo´õ›@nÕ2w>f@nŸñˆf@nmÇÖí·@n-"¢ÿ€@mó7‚]à@m¼IKFP@m# ô@mk´Y± @mGäÔ­@@m*ëé0@mkcbp@mjª`@lúuQ}ð@lø(Á0@lû~¨@@mÜJÐ@mõ°kp@m ¤¶ùP@m7}ÂÔ@@mPÖÀ¥à@mc³e½ð@mm÷ò9à@mnH{¨@mbE´­à@mL<°@m2Ƈ(€@m©|6@mîMIÀ@máûÐ`@m œÖ@mb4Ð@m1º)Š€@mOÖt¬0@mnÓ{ž`@mˆ;öªp@mžˆ£b@@m¼8 @mÚy!4€@n[ÏÐ@n0âu€@n^FôqP@nšcšÄ@nÚ JÖ @oï­ªf@ngÙ±Lnf@nœzŽ.g@nד´x!™@o”rº™™@o_“-ˆ@oµáí×ng@p C{G4@p3‘S! @p_|Ef@p„ùŸîf@p¥éê¨è@p¼¸Õf¼Í@pÉ´OŒÍ@pÌëqáäÍ@pË-põ>f@pÆÊKÑžf@p¾¥dù!š@p³‚_øH@p¨XJ@p™=7–f@pŠ» 8@p~Œ8:@po±Wž¶g@pd@À˜¤Í@p^»pÂDÌ@p_ÊÀÔLÍ@pc ‚‹Í@peHÑ„Í@pcjÝÊ“3@p^ÚòCöf@pXGxM¦f@pLÐÞf@p?[ó׌Í@p6Øy%ÔÍ@p.nVltÍ@p$ä5IÉš@p­bveš@pƒÈzf@pTŠj@oüJfà@oøf¢ÄÍ@p¥ž0@p,ù© @p)]±?Úf@pF¼ ®f@p`()â&f@pv_Tä[3@p…k®‹,Í@p‹\£$Í@pŠ…ÌÌ@p€ÃBs3@po÷ LK3@pRÐA­–f@p/Ï;Ì@p ]œÍ@oÄ=‰´Î@oqO‰×‰™@o.ãaš@o¸õ $:@oŽ*„ÉüÌ@ogúùÇÍ@oHùüJZf@o8Pd@o,øUÔ@o&{j#ì@o!N½0@oÇt@nÿ“=ã0Í@nÐS)º‰š@n“8É{Éš@nCÍ0£Âg@müŠ ìÍ@mÕ&}Í@mУÍ@n‘ª8Ì@nL–ÅãÜÍ@nš0P¡XÍ@nØñÒÔ@nöeØÈD@nï ßM™@n¼[UÙH@nx+ »|@n0Æû"dÌ@nÜfà@mó¸@møÆÐÚfe@n f(µp@n%[@:Ø@n;3M‰Ï3@nG¿‘ùw3@nO–Qžç3@nNþTñ™@nKi“IÛ3@nS&ì73@nq·Ê3@nžÕ<íš@nÊ<¶×mš@nþ”êÅÿ4@o4·LG4@oiŒõàó4@o¬%D(Yš@oü ­Ü|@p%(³Zì@pRaú¯3@p|¨Pöf@pž‘6Zf@p¼Ý‘¡š@pÑ…Ö¢T@pÛyË7Ð@pÞö_~2g@pßdFK‡3@pß@~¹Ï3@pÝkšÝÜ@pÚâSþXÌ@p×öÀXÌ@pÐÏôÅ\@pÇñyé?3@pÀ ß+4@pµý KUš@p®ªÓ!3@p©š7‹4@p©õô¨Ì@p®ÃDúa™@pµ-* ¥š@pµ­ãI‹3@p°|bƒ @p¨N­˜T@pš:¬ôÍ@pÿ„£½š@p‡2kýš@p‚Ø g@p}RGW3@pyNgçO4@pplvöt@p]kƒpL@pNçíä@pD³Û‹3@pCj¿DÍ@pNl£¤Í@p[‹…~@pv–ñÙ}™@ppŽäõš@pžy(J¬Í@p§ɤuš@p©; 1Aš@p§úfô@p¤S³~Öf@pœzq%Æf@p‹~äÍ@psÄ0*f@pYóì›¶f@p6Þ[M.f@p¼‘qPÍ@oïFN š@pW$ñ’I@pNUP1 @pD! @p>‹«ƒ“3@p=Zô@@p>ôtà@pEX{#3@pI+T#3@pJ˜°«C3@p?J¹Ø @p!kÎö°@o틪€@ov¯}“†f@nÿ ìµÌÍ@n­Ÿ1ÌÍ@nŽrVÆe@n»ÀµÕÓ4@o ãÓqó4@oo½!ýyš@oÀb=CÌÍ@oå<Í,Í@oÞµù\Ó5@o¤#w³3@o[ˆ¯]Ó3@oùˆyš@näÄ‘'Ó3@nÔãâó3@nØ&h¹Fg@nç<é˜,Í@nù®¢‹ŒÍ@oX&„¦f@o—ÅW,Í@o »4ƒ Í@oé”™™@nüV‡Ò Í@oe²D¬Í@oÝö¬@oFAE†f@otÖV ff@o©PýïÌÌ@oÙµdpf@pWG±Ã3@pàM·Ff@p8eY¹š@pU¶Ãܹš@p{RÔÙ™@pŸMç­™š@p¹Ü‚™š@pÒæBf@pãW?lš@pê”OyYš@pípïC“3@pîßHÀÌÌ@pðx—œŒÌ@pñþ­Æ3@pô3f?f@põOÉäæf@pòJÓSÙ™@p튀öÌÍ@pèûLùìÌ@pãf~³4@pß%ÂLÍ@pÛ±·b Ì@pÜNKÑFf@pá}AÊff@p鿚^ff@pîØ‹]¬Ì@píVȦf@pçÇff@pÝ~‘R™@pÔE€ @pЯä€@pÎíšDÆf@pÐ?ÕÌÍ@pÑ&JcŒÌ@pÌ×ÙìÍ@pº+D—¬Í@pª. LÍ@p™9“¨33@péÔeLÌ@p;À-ŒÌ@p•ÏtàY™@p¨ÑT¶yš@p¶Ò,ðš@p½hVyLÍ@p¼ºnÙš@p¹+yB9š@pµÍkî@pµ°šÇff@p¶Y•æf@p² C @p¨9J#ó3@pŸÎŒV“3@p‘+Ôæf@p{Á33@pe•5ƒ³3@p»zþð_@p¸U 3¦g@p³kŽûf@p´e°o#2@p¸ÜPÌf@p¾ö`@p_¼7–@pZ²Œÿ€@pB‹ã3@p)ʸòS4@pØ=¿oÿ@p('9ó4@pïΈ#4@oÿ}Å 33@p"ZAš@pÀ]Kš@p§Iš@p%¼ƒyš@p»X 1š@oÿ}YüÍ@oìÅJvÀ@oæréF°@oí'WK£3@pã³Xš@p"çQš@p(¿”(|Ì@p<ÝÊ¿33@pL2)wC3@p[Á¨ –g@pmj£“#3@p€ùVƒ3@pœŒñÌÌ@p·í$™Í@pϨýÄ\Í@pæFk¶†g@pöYÛ,Í@pük2ÐlÍ@pÿwÚ¾3@pÿõ-Þ @pÿ?°@pÿ>-ÒS3@qûÐ@pÿš¯§@püMOóff@pú:9ÏÖg@pøª»Zöf@p÷’tÓ\Í@põ× Ž`@póè¿4 @pó>Û›æf@pöl¿Øã3@püb³3Ã3@qº…¼P@q òŸNP@q ç#¾€@q’_0@pþùÉ_c3@pûèÆœ#3@pý]v0@qàµWùš@qŽÔŒš@qÑ,SÆf@pü;àÜÍ@pîݺsÌÍ@pÞ~e«0@pÑš¶˜9š@pÍì8š@pч’ÎüÍ@pסöjÐ@pܤхÐ@pÚ× vg@pÔ¥‚æYš@pÎbÚª©š@pÉm•\f@pÉfbff@p˲zA¦f@p̰d®À@pÊSïFg@pËM·—&f@pÏÞñšÿ@pÊh m@pÀ€UÐ@pûSíÖQ@púC'Öp@pöiHqp@pø/ót4@pÿ~%¡@@qA“Ò@qç˜ñ 3@qŒÆä¡š@q°§o±š@qƒ5ãÌ@q?P¢`@püoE2X@pÛjÕ|ng@p°ŸçYš@p‰r¾¡š@pi†¬ÃÁš@pg•‡NÈ@pxö×@p–œ„˜@p¤!‰Þf@p²²mí~f@p­µüÏÿ@pŸþzf@p›ÁãVf@p™‡MÖf@p˜¯ló`@p–w¹@p‘u(Îg@pŽß¹py™@p‰)Kùš@pm¹EôÍ@p* H€@p‘X6Lp@p‰¡2@p|@PŸáš@pné¡sAš@p`F¨éÛ3@pYjVf@pcfø^f@pjšÜiY™@pwÖÛœÍ@pfPÄÌ@p‡Ç=Ç@p“|Æ¿¡™@p£Â49š@p»­|+@pÏè…Ã3@pã—¡•s3@púéRNÓ4@q ö`m˜@qÑ;-¸@q?ÓÞFg@q{h˜8@qèkí¨@q†üÎf@qi8‡È@qº¨ôx@q¼8Cög@q ­4^ff@q ɹÖf@q &_ð¤Ì@q òë3@q I >K3@q œ)¨@q Û¬Î[3@q ÒØÃ3@qXuªÐ@qxIdy™@q_À-Q™@qyþa™@qp‘Áé™@q¹8¢yš@qéÚ1¬Í@q»¿k @qQø¤x@qëã#3@qJñ3@q4 O[4@q?$å@qH&<Í@q*9áÌ@q j c¸@pÿ e\TÍ@pýÁ¿BÍ@pøÙ. @pòb 6.g@pí9™á–f@pèøl)3@påñÂO,Ì@pã&ìÕÜÌ@pÞZ9Ùš@pÙñ•,>f@pÚZMGÆf@páæP Æg@pìŒÝð@pöçôî@q ɤ·]B@q U2,œÍ@q 4”fØÍ@q O°ô±™@q Ü8P3@qo¶~ƒ3@qác: š@qiƒ­`Í@q#ÐÍ@q*$ÒŠäÍ@q/Õ›=Mš@q1ñ¾‚Eš@q-,pda™@q!(ã·ë3@q³9o3@qÚ–h™@pö‹â˜@póV.Èx@pô(Úe@põâÂðÐÍ@pó”"ØÍ@pìãb;¼@pé¤X®f@pì»ñóÆf@pôAÇ ÿ3@pùZѯ4@pùÛ0t@põ1šµ™@pðXC¾G3@pí‰K73@pí‰X¯êf@põœ¤%4@pýâ[®À@pü½¦f@píßh3@pÙ\— '3@pÁƒ×ƒ3@p±wž>g@p´3\ƒþf@pÀɼæÂf@pÝçÝåšf@pëêà$Åš@pú+¯-¬Ì@qš­q”Ì@qï\#„Í@q)~ â3@q2¶>3@q6yì?I™@q85ÑfY™@q9\Õ©™@q8u#Ž73@q8ÆL“3@q6¥w×3@q5T\Ò¨Ì@q6†i’Œ@q8#³ï¬@q6ª&ãÿ@q6ཆW3@q6l>A{3@q5 û赚@q4ÅÉÍ@q4Œ£DøÍ@q3k,*L@q/¯§ôT@q-fÁ­@q,>Ec@q*Gw9?3@q' ¡^s3@q#1¬fH@q!v'¤@q#Y1œ„@q)º»$<Í@q1E–ôÍ@q3ûÈÍ@q-ĉ]êf@q%‡Ý‚¸@q)•Ú@q+Æ@â‚f@qž·Om™@q6$á™@q?®™@q ä/š@q EéÑš@qŠ»4@pÿ£÷gí™@pøéøT5™@pï7Ð[4@pçÕ̵™@pç¨)õ™@pëÁïD;ÿ@pôSC±™@qïË‚q™@qˆûm¶Û@q8ô@qÎX@q=ø@q\`@qª\@q@q <`@q%x$@q,q¨@q6Ô@q=â8@qD6L@qG3@qG-(@qE½p@qD€Ä@qBƒŒ@q<€@q1@q&[X@qäÀ@q ¬@q¼@q%°Œ@q+ùl@q.&ˆ@q/Ü@q2ø @q6¸ð@q9ëü@q<‡Ü@q=" @q;þ€@q8d@q.Ãð@q!I @q÷P@qó@@qV0@q”@qÜ@qúP@q^Œ@q$ (@q'Õ0@q(X°@q-|@q;Ì@qH7˜@qQòˆ@qVz@qXE˜@q[­@qY/H@qW9ü@qN<ä@qSÁ$@q^ר@qaõÜ@qd'(@qb«4@q`áÈ@q`Ñð@q`áP@qce°@q[Ì@qN¼€@qF{L@q>‚@q? è@q@º€@q@ø@q<ü @q=Øü@qEZ8@qMÈP@qQT˜@qQ—`@qH@qDµÔ@qAHè@q7¯°@q/¢¬@q(À@q"/@qE¬@qÀ@qˆ4@qK`@q ˆX@q @q´ @q÷¸@q ì¤@qƬ@q%½,Ù[ã@q)-ªŒ†Í@q,9ÐÍ@q,F£³š@q*{ܦBÍ@q*8Ü)"Í@q+(<o3@q-Áª”Í@q.Vy¿|Í@q0Î&Hg@q69>U…š@q<¼}‹ûš@qDÓDÍ@qNAë¿™@qJ&) @qG¶Âer@qF)8ff@qH–ìÆûš@qMó#š@qMøÖSÔ@qN?µ2Í@qZŠr·>Í@qU¥;ƒš@qK ëš@qKº5‡Mš@qS¡WiFf@qZ’ŽdÎÍ@qg`êRÍ@qrÄNÂ@qw·~,g@qzOÌ­Òf@qzʉûY4@qsøXæÈÍ@qlÌ×m¾Í@qow=)4@qxM¹ý3@qÛ܈Ñ3@qnŽ…4@q„^ãôîÍ@qˆY*lÄÍ@q…[GÙ4@q‚ª²Cš@q‰o™'Qš@q‚÷‚@qtñ&—4@qpz#“K3@qh.ͱ™@qf´df@qbe-I>f@q`âá|îÍ@q[CE®&g@q]Y%f@qc?Z…¨@qj»µ…_3@qp·—sQ3@qt¤ué4@qfL³f@qbï`úlf@qc´ ù½š@qZ»î—]š@qQ[âЫš@qK'Ýcš@qAíøHþ@q5OÝ@q+¿nSš@q(a|ð&@q(IMÌ@q'Qš0Í@q%ûp. @q$þ—˜@q*Y¨kéš@q+ºýåN@q)š0@q6ïC>vÜ@q7æ¦È@q9f¢ìˆ@q9 3¬±š@q7õåT@q7âðw@q7ÄåÈ@q7Þu6Áš@q8{í®±š@q;p½˜@qB¬€c3@qKµ›ƒ3@qS±ó`¼Î@qZž Ã+3@q`=¬$ 3@qcg {4@qcßÊMC3@qc¢S3@qeˆh„Î@qgœ|×q™@qeñ! 9š@q],mÁ9š@qRÐÔÍ@qT–î,Í@q\ É›@qdе„ŒÍ@qh=üÍ@qlH)l€@qqz1nîf@qq”T6f@qmŒ/̳4@qh»yHk3@qgmªRƒ3@qcþ lˆ@qc‰"šÑš@qdT) š@qd1Ê6«4@qagäaH@q\Ä÷òX@q]•ÑÓ4@qfÒŠ&f@qkÐoÓ¾f@qp1ò|Î@qpâQäÍ@q|©=ƒ”Ì@q»³K˜@qt†» yš@qm³w0!š@ql”]–g@quÛ¹Ø3@qèPy3@qŠv%}Î@q’@WÛ3@q—[n 3@q™±ó¨@q•LÃQÁš@q‘$õpáš@q’dš@q—ó@«)š@qœ³• š@q–.§ã4@q›ÂüÉš@q ‹ê™š@q Œë\äÎ@qŸ½*š¶f@q¢–…Y^f@q ?w¬Î@q˜üÈç¸@q”S›cð@qŒµŽG`@q‰ƒ–3Í@q…»t*ÜÌ@q~@Ì'ù›@q|0âzáš@q}Ûq’Aš@qÒÀnh@q‰ûd“3@q’0Àó3@q•*®¿aš@q™·Þf@q‹dæ.îf@q‡3’?üÎ@qx ÆQ”Ì@qm¬Ÿ!ìÍ@qd4§7^g@qZdXò6f@qQaó–f@qCãàò@@q@eœÌ@q@£dÑ„Í@qE¢òv @qFü²qc3@qH€‹3@qHØœ~g@qDdjrè@q<†óî¨@qT]Œ©@qPŸþ“f@qNeqÝVf@qKHdÌp@qKJ3PÉš@qK–Ï­yš@qIòØ×™š@qH·2°@qINÊà@qNJ/ø¶g@qVƒwü3@q\ޤÈó3@q^ççÖf@q`‡,Iš@qd~d噚@qhyW †f@qj  33@qjš”ȳ3@qkN“Ác3@qn¶aP@qpŠ– @qr'â Í@qs—8´)š@qu@J*éš@qy)2 öf@q€C³3@q‚@»c3@qˆZ8,Í@q‰àÎlYš@q‰Åž[‰š@q‰Û$m¦f@q†Þrç3@q…fÁ@q›¸ãýc3@qž‹@Ô–f@q¢G³Çvf@q¯ß©!ó3@q«•Ò¢ŒÍ@q« ÕFÍ@qÃ4<Í@qŸŽe @qƒwµ `@q{M/ë#3@qsÈ,ˆf@qlOxÐ&f@q`s—±6g@q]缦³3@q_ÃèµC3@qe6÷öf@qdØ6>,Í@qh@ðJ|Í@qcÂ×I™@q[8.À6f@qW ‹Ãf@q~»îêI@qy½dí˜@qt÷ŽP@qn€ÊUÐ@qlª;Ø@@qkw%ÆØ@qh>êQ(@qdßÕVp@qcøfp@qbÅwIX@qd¦žÙX@qdÓjÏ(@qcÇ×Gà@qc)‘BÐ@qdé¾­€@qiÁW2¸@qn²ü¶X@qp²3@qq$s(¸@qt-¦@@qyeP«@q‚^±ˆ@qŽ@9— @q’ 1@q”š€à@q—"@q™î{Ž8@q¢APx@q¤¸ h¸@q¦îb¦(@q©d*ê(@q¨ 2[¨@q¦Èï)0@q¤Òæ0@q¡»Ø@@qœºÈ@qšÊ@qJ¬º(@q àÃÐ@qžèÇ”@q iº@q¢ƒæìx@q©.oôH@q«Ž&è@q®#c5`@q¯í‘!8@q±pð@q³R7Ìø@q¸[­H@q¾d‹fð@qÀpåë@qÄïOÅ@qËBæ(€@qÊ&¬tà@qÊ‹>RÐ@qÉ|æj@qÉ ¶0@qËJqÚ @qËi2ÎÈ@qɲ÷³h@qÇý"E@qÇ¢½ÿ¸@qÅ*x@q£Ü@¸@qÂXœ8@qÂÎ¥ï(@qÁì @q¼À"V@q¸8öGp@qµ‡r© @qµ”Á…P@q³'Ô¸@q°ÙÞP@q±v‚€@qµÝþK˜@q³&N˜@qª® ÞÀ@q¨0§à@qÃ{b@qÊ”Šì€@q½ÆðX@q¬¯T  @q¡ÛêµP@qŸ±õ¸@q—`h@q’û*à@q'# (@q‡‹™@q€‘•Þð@q€³Î@q…‡ÝzØ@q…­°@q‡}†œ@q2@qzVÈ@q|)è h@q¨@ÛѾ¡@q¤óðcš@q ¢Y{š@q›á£šå3@q–/YÈœÍ@q‘;ßy2Í@qÑÏ^^g@qŠv+²@q†D¦×Ø@q|C‡Æ™@quC–î[3@qp‡3íÑ3@qpYŠíÉ3@qpï¡ÂÍ@qoua(2Í@qrf¼º‘3@qwC(„@qx½‰@q|^çkû3@q­Ðô3@q‹õc’C3@q˜ÍÀŠÍ@q¤@Ðf@q¨Ácg(f@q¬'`iÒÍ@q®ú™3@q³:,Oƒ3@q»%òŒ`Ì@q¿8ñûÌÍ@qÂáó‚–Í@qÅG,ªÍ@qÃ‘Žˆ+3@qÂ#3þ­3@qÂuNsôÍ@qÀêñ¡Aš@q¼™Pªš@q»Úœq4@q½ú=¹3@qÁÁ°?3@qÀý€'™@q¿žM8I3@q¾ ÊÒ4@q½ÉhVg@q¾Ò8mš@q¾UΡš@q½¶2¯^f@qÆ›}Þ1š@qÔ"7 š@qßuÉÜÌ@qáë*ÐìÍ@q⥺ê¨Í@qä;Æ*å4@qæ Ô_š@qå¶³Q#š@qããã¬3@qà3zÂ@qÞðœ@qáPn®@qâ63ÐÍ@qಃ-þÍ@qÝù>4@qÚ¯v£ Í@qÖ>ÌÍ@qÒ<žÌ@qÒ"”##š@qÒkàOkš@qЖœÖ@qÍØcUCš@qÊ“socš@qÇò5Üf@qÇýwË“3@qÇÎA;3@qÇ´Kä/™@qÈÁ–+š@qÏ€B4ãš@qÌv'÷ŽÍ@q·¬åm4@q¯˜¦"4@qÓ}q)4@qé‹«„~Í@qÑÞÈŒÍ@qÅv4Í@qÁÊkB@qÇ71ɦ@q»RUaê@qºr÷ $Í@q·Uy~Í@q°Bc¸Í@q©ee²´g@q©ŠŒZ|f@qªj@q©ìlÀÍ@q¨8O—¤Í@q Ãà¶,Í@qŸEFù¦Í@q¤r™SBÍ@qÌ ›n@qÊŽ(üÌ@qÇ¢aÊLÌ@qÆÇ…>9š@q¾@ûÏš@q¶ø˜áš@q´ ìÙˆ@q±¼!NœÍ@qªîYLÍ@qž^GÌìÌ@q”e: Nf@qÄc•îf@q“†Çë3@q”cÕºÆf@q‘…9öf@q’m\Í@q”ãïó3@q’YÒ Û4@qšœ€À@q¢ ¤#3@q®µ3iû3@q¹óž»°@q½¥&K3@q¿6 5Ã4@qÁÿßðDÍ@qÇ›éÄÍ@qÍjwÔÔÍ@qÒ4Ù @qÕalîã3@qØlѧã3@qÚ.é€@qØ´¿Ë4@q×?÷£4@q×ô¼Rf@qÖîšÔÍ@qÒÉ@ŒüÍ@qÒÜÞJà@qÕ§‹fg@q×Í|+.g@qÛ…†¯{3@qÜPœÍf@q× ›þf@qÓ$ »)š@qÑ•ž¤dÌ@qÏ?6¬äÌ@q͘XÌ@qÛý²;3@qï-ôã3@qûžxW¬Ì@qý×Xñš@qýìyš@qýkû3@qþ2û—f@qýíÂü®f@qûÈK¹™@q÷r·®`@qõÅœvh@qøzo%ˆ@qú<¾žf@q÷¸Î>f@qò}—wÍ@qí—Fáš@qè‚UÁš@qä¾h¡ùš@qäŇ3@qä<á¿Û3@qâå·C÷ÿ@qãf>ˆ,Í@qâ ³à Í@qÝ¡ö°îf@qÜuSGôÌ@qàFëßäÌ@qä4* ™™@qâºæz3@q躴ã4@qç™ó]Ã4@qË-ô»3@q¼›O ƒ3@qã¡l] @r)MÞf@qó€ªMf@qð¸ë~g@qóˆÁþTÍ@qù]`ÔœÍ@qâç“äð@qã ýdöf@qß4tnf@qÙój€@q×^ÈAôÍ@q×Ü-ÜDÍ@qÔ:5¼‘š@qÐöZâs3@qÎ¥Ó£3@qÍç=ÄÍ@qÉý;#Aš@qÌÊx'¡š@qðH,ž-@qîlx~g@qî–ý.f@qí½¤aš@qæ Í@qá"DÍ@qÝðž Úg@qÚïÇø@qÓû#)Ü@qËÉ ¿œ@qÆ ›‰™@qÈ•™éÁš@qË`ò€Zf@qÊ Œô@qÉbÐ\È@qËsŒ£œ@qËGD©y™@qÄ%=tUš@qÍp%N3@qÒ`.Èœ@qÙh¹‘”@qÝ{]<@qÛ¹:Áæf@qÚè f@qÚL´>O4@qàž¯3@qæf•&74@qèË#¯¡™@q餠N˜@qëCl„@qìlñ«3@qì*•`æg@qìLJ"f@qëì Ô¨Í@qçÙØïÛ3@qäkÐg4@qæ/6¦Ög@qémÑÏõ™@qîN`|Åš@qøK½|Î@qûù_g@qòs‡¶f@qìÜä§f@qêHÓ3@qæ ™íÛ4@q⨠ˆúf@qí¢í@r¯‹›x@r³‰òf@rˆEHÍ@r'@úØÍ@rsãTVf@r»EËh@r%fÞ,@rŠ%<€@r ¹ønû4@r ™dk4@r “ØÓÐÌ@rÅØ@r b-,ˆ@rª“ãH@rƒ UL@qýl.ƒl@qúW)ÄÐ@qùÁãZš@qøÔUåš@qö‡™6àÍ@qøóž¼5™@qù)6¼5š@qôD,'âg@qñì8¿3@qø›9{4@qý¡µòg@qú61üÍ@qýÔ¤;Ì@r¶gg@qãuyÿ3@q͹_«4@qñ¢@Í{4@rÕ@r½¸Xmš@r!@§Ï3@r%a{™@r&„™-š@r í£|Eš@rz7´Í@r#ó­ÀÍ@r±8@rJýG4@rC3_4@qýk#ù˜@qør‰&2g@qø6h‡fg@qý`å°Úf@qök‹ýš@qôsÅA‰š@r’‰0Ê@r+{~f@r:5žf@rçÍÅXÌ@ršÐ±úf@rËê.f@r¹âšf@rßf3@r =òñ—3@r’ÉÓ š@rsÔý;3@rÑ;v{3@r‘*Jf@qþqéq¬Ì@qÿY¢w˜Í@r¹7:u™@qÿ8ƒP@qúýz„@qùì”Öf@qöxÏ`Í@qõ4O&˜Í@qõë£Æš@qõÄvƒ 3@qõ~Ë'›3@qõ³¶*îf@qú¯9ÀÍ@qþÙvØÍ@rq£â3@r5ý š@rÆ™©š@r¸i/3@rQuÆf@rBÁ°šf@qÿÔEå^g@qú ö~g@qø›^Ög@qüzn73@rA¶`™™@r ×3ºYš@r—9Â1™@r $qµ™@r}ñS9™@r KÑÂzg@rﯮÔ@rƒf„@qü[·²g@r_Õ™@r8³„m™@r$õAì´@r$ó6™@r$/ÖÈ š@r"ÀÒBg@r GQžzg@r¯¢bòg@r½Ê\G3@r Ä*f@r&Ãîf@rIq`@rsìÇþf@rSôñf@rg@rÈ @r9òä@rÚº×I›@rf¸3@r á,‡3@r :õááš@r (•™@r Hóæš@r ,‹îx@r ë€Æ—3@r ¥¨åË3@rö¹*ó2@r ˘¦Ff@r,}Ãf@r•¬nE™@qú3g?qš@qÜÕA—õš@qüf’f@r8¤m?4@r?Ú‰ÍÇ4@r;Áng¡š@r9îV@r52Û¼Ø@r.ÿŠèg@r)î²xDÍ@r$Ùp¾Í@r û6 Q™@r]‚N™@rÉ'j™@r9ó3@rùþüÍ@r‡¦døÍ@r†]Ý”Í@rj(@r“$&x@r3U:@r8<Ò@r8C`@r8½¹<šÍ@r=‘>á#3@rGxa3@rI 5„¸@rALå ñš@r: GMš@r/¤³Ì@r!´ºØ@rO@@rXL3,@r˜À½ß3@rj°üu3@rC¸ú@rÜóBÌ@r ˨ÐÌ@r t‚©èÌ@r Z.~@r ì¬9 @r „>®@r‡üÊ–Í@rsrRžÍ@rµþµ\@rÊ3¶f@rÚ—¹8f@rŒí”Í@r ªäïæf@r"g"üPf@r!$‹gÅ3@r €òÌ@r0Ô¬Ì@rö;¾f@r1¥S@r’Él@rÆo%™@r/SÌk3@r8q÷cq3@rCò›ýzÌ@rNeoÐ!3@r<õ•3@r.±û2­3@r#Œ‚xNÌ@r±ÎªÌ@r\ÇBO3@r†Eç™3@r)îŒq3@r3žx©¨f@r6†P@r4¨7€@r3Jv®Í@r2Tý´Í@r2O&ªÍ@r1e|©t@r1‚¿¡²f@r1|m´ºf@r1eS(%™@r2 ëÍ@r2ÂгŽÍ@r2Ð$f@r/~;‰,Í@r)ø‚YÍ@r%¼zÌ@r"õh u3@r!C_^3@r ë`Î@r ·"±xÌ@r BœV Ì@r$ˆcé÷4@r# NÐ5š@rÛ<Ùš@r Žmÿ@r~j`f@r ñèâ8f@r&ò xM3@r Ê:õ4Í@qåÇ\Í@r ·wúÌ@rFVa3@r_\c—3@r_ŠM.?š@rM¶hì>Ì@r?h+¢Ì@r<|Š#Q3@r9;€Q&Í@r3£@ÀÍ@r1R=ÒªÌ@r,lƉ“3@r*% ¡3@r,¶9u3@r+b@5™™@r,³ ³™@r0Uû‹g@r-꣈á3@r.õu3@rL;m¶Û@rL™è@rJÈ @rG@rLóT@r_Qp@rbÔT@rc< @raç@rX¼@rEÜ$@r?¸@r>œ@r7Z@r4Ä @r/d€@r&¸L@r" L@r!zð@r& ¼@r,Nì@r/а@r3V@r9ZD@r;îˆ@r<(@r9e¸@r:/è@r>êÌ@rAïœ@rM‹@r\D@r[(H@rN>@r>+Ð@r>²@rV÷@@rjat@r{òh@rÒ @r€Ôä@rv ¸@r\X@rEȤ@r<¡ @r6ÞÈ@r1p„@r8Ü\@rE”@rH–,@rI0d@rH@@rFÛt@rFj¸@rD@rEt @rHàœ@rIoT@rHÝ|@rHÖt@rFÚÌ@rC¤@r=¼è@r; @r; @@r7µ@r9@r97@r6$@r:Ï(@r8ËŒ@r0!X@r6=¼@r7!@@r/šˆ@r4˜@r›ø@qüÝÀ@r9°@rWu0@rs^X@r‚Ð@rrÀ@rX¨@rNÏT@rIê@rCÆd@rEä@rEŒ@rEâÐ@rKô@rGè @rI)°@rN2Ä@rJ¬@rK_d@rXc…}@rS,@rT¯ÍÀ@rRz ÁJh@ra“B0Ì@rr2Õ¨Ì@rfJ©èÎ@rRrÌrf@rbèZzf@rqYÚèºg@rgZ®ê¬Í@rbߊ/DÍ@raÚ ãÙ›@rY|·”™@rV%)$¡š@rSz·ýYš@rNæˆéÀÌ@rK@ÍR<Ì@rEÅí¦h@rIŠ Nå™@rN¯­ š@rN‘+¾g@rS.óé‡3@rW.-s3@rZÂVá"h@r\¹r(Í@rZKýPôÍ@rZê„lÎ@r\sZ¯jf@r`àjf@roÛüf¦g@r‹¥Ø™À@r‰ë, @r€Èï4@ry £[øÌ@r|DULÌ@rŽóè%‹4@r©û˜pºf@r°ÆCf@r¬÷7NdÎ@rŸ²À˜ƒ3@r‰Š ×3@rsÒ4p`Î@r_ )åºf@rR§0t.f@rM5Z/4Î@rKÔæ$@rPø ú0@rYxhؘ@r\wDÂ#3@r_ÚU»3@r]Df–g@rX.Í/~f@rWÄ\vf@rW«ŸQš@rX ¼Jf@rZ·Ÿ®f@rZkOüÎ@rZŽëÍ@rZ2A¨Í@rWAš @rVì²Bªf@rUuéQ~f@rSà‰Ñš@rR3 A+3@rL]%ë3@rLç…›@rNùÀh@rLk÷|@rLeSü¯4@rHᥨÍ@rCÕ-ª`Ì@rLö}@Í@rGçã¼Í@r;LæxÍ@rEC[Xvg@r<™>ƒ+3@rC wÇ3@r8êG@rrÆhæõš@rŽj€áš@r™_(ذ@rßï~8Ì@ruúÝSìÌ@riiYF§4@raÌïÕÅš@r\x)•…š@rañ˜ÄÍ@rbæO€ôÌ@rcŸ±vøÌ@ri-Ó@Î@rd W™š@ra÷ˆýš@rc§u†g@ram§§3@r`‚L¼×3@rc:Ç!¸@r_Ö!š@r`€VU+š@rd.mÒ+›@rvÇÆÃ<@r‰Lþm`@rr†¾’€h@rPj™3š@r[„ÍóUš@r€¶£¿"@r‡EEÍ3@r†X¬Gý3@r…Gí¬×š@r{mGà:@rv`±:@rr ŽaÉ4@roƒÐ4 Í@rokͦÍ@ri&Ü–Î@rj”ð@rkÂøèj@rg÷QÎlÎ@rmOÉ8hf@roº…Nf@rr ôÕ4@rvŒVÌ@rrès8Í@rq²/;¿4@rs><:¤f@runŸ"f@rŠÂFQb@r®ÔxÆ”Ì@r¥[MF¢Í@rž«ë²¦Í@r–UD¦f@rœª¾ñ|f@r¿~|SÌ@r̼pš@rÍÌä—»š@rȆ¬œ—5@r«¦­Ûêf@r’ŠT f@r~CX·4@rq‚Ø3@rf[P²™3@reЍ!›@rkÂ’@rnë·@rr¶nbÖ@rsjüÁš@ru8Í¡—š@rtG‡ ›@ro«Ì<Ç3@rp 4Ä+3@rpê”#c4@ro¼©ß:f@ro@åèf@rnG™›@rnÇyÇk3@rnäõ¹3@rkçŽ@rmãÏ­,@rnG—8@rj¹?–Jh@ri$ë®—š@rbÑ‘š@r]ý°gø@r`…{Tí3@r_K4Ìm3@r_¨oŒ@r\æãÐvÍ@rYðáØ Í@r[Jbœx@rRBGa™@rI´m~!š@rWDì€#5@rT@t{%3@r3>d„Ë3@rEo³?"Î@r‰q²f$f@r§äŽÝ8f@r¦“¼Î@r–í 3Ë3@r€;ØM3@r}/9h@r}Í;¢$@r{=½ÿ,@r€Tòßþ@r}~u;3@r{‹ÙË3@r}H0òàh@rw*Yš¸@rs¾ág@ro1™hh@rnÁ4é×3@rok8 3@roMæ<ú@roK92¤Í@ro¯ëËvÍ@ry"»ó3™@ršÄcŠf@rž“è¶f@rŠŒ¡FŸ3@rq †£š@rvHL²sš@r–¤rŸ3@r †>wš@r£ž»ÿ‰š@r©O»1§š@r•%²Yš@rxïªÓš@rˆç‘2@r¿Í,tÍ@r„©œæVÍ@r‚6æð¸Í@r„ÖP•3@r†…ÿá3@r‚$jI‡3@r…Ä Õ2Í@r„*U:vÍ@r„šíPf@r‰Öåu?3@rƒ”Ÿ¸Ý3@rSTfÍ@rÜÓ£ÞÍ@r…d™ætÍ@r£KTKâf@rÐèný3@rÁÙ“{3@r³ï†þï4@r±Æ•%Ç3@r¿V@¯3@rÚ`Eq'š@rÛÓË-3@rä kZI3@rÙ¸ðd­™@r¾›½!É3@rŸÀ->¡3@rІPf@r†T))"@r¼U‚Þ@rƒ–‘x?4@rŽ8“Ëš@rãp]š@rQ##ß3@rŽ+\,ŒÍ@rŽ Ó‡ Í@r‚\×™@r‹Ôÿf«3@rŒq„Ñ)3@rŠ¥ê@@r‡–ÖÎg@r†tÔØÂf@r†"Ýõš@r‡°‰FÍ@r†7^Í@r€DÍÚg@rOº @r‚ gÄ$@r}¡Ýk™@r|ÇŒ@rxƒbã>@rro@rr½17äf@rs\…å¦f@rqûžž~g@roÿ¼*Õš@rmŒåÞEš@rg˜‘Í@r_’ZPvf@r[˜j¹Æf@raŠ&©ÈÍ@rfì—çŒf@rJIõÀ`f@r=mä,¨f@r‘Dãgš@rÆêv}š@r²ï·‘š@r‹Ä#øHg@r{k™½f@r…PÁé/™@r”392 Í@r—ÒÿÒâÍ@r›˜˜qŽÍ@r”‰Š"$Í@r„& Í@rŽûŠ2Í@rˆ/y­=š@rƒyŠ5š@r{RÈå*Í@rz7Elš@rzm/=š@rxÔÊ­·@r|heâü@rzÒ+D@ro€é¸@r»kûü,@r¯nëÊà@r¥¹Ét„@r¢þ„ @r¬V€õD@r´´sd@r·Xï×ø@r½Î Ì@r¿²…e,@r¤_|3h@rª«@r›µ% è@r“wœ4@r˜’Ô@r™&ø±è@r›j [ô@rÿÎ5@r™Ž#¦@ršY-<@r•Ò\ò0@r•êl@rœ‡š8@r”Š:Ël@r‘,I4@rñé`t@r—©Æ@rÄó¢¡\@ró6Tì@rç{[oh@r×~˜à@rÍò¿¤$@rÚ]Vh@rëi†(<@rð·é-@røѹL@r粡|@rÎGòt@r­¥BÒ„@rÿ•´@ržBÔ1´@rš«7¶@rŸÙnx@rªVz´@r«ÞÉÚ@r«Œ[Ž0@rª ‰5H@r§/@r¥ |x@r¥ê7@r¤z1¿ @rŸ¹Ù4¼@r’½X@rœØø‰Ð@rž/Jô@r¢L0Ä,@r PóL@r˜ÙJð@r–·¨ôà@r–'Dzø@r“~N:@@r“È[G¬@r^T@rŠß©°D@rŠàeÀ@rŠHcC¨@r….…@ð@r¼@r~›Ö|@rtÇÃl@roh¶Œ@rlþ±ç\@rha,ó0@rxÛÂk,@ra[›d@r+·(@r…a “l@rØPÐ<@r³<è@rìn±ä@r€½Ø[Ø@rް¦¬@r¨rtƒü@r¯1îD@r²cœ@r©ØÚH@r£eÙàè@r¡<µM¬@r˜º“ÜÈ@r’Ý@OP@r‰¢Ð@r…²¯ß4@r‚ ÿ@r‚3çæg@r† bV©š@r‚ÑFyš@r¡êÛË4@rÔ?Þ?À@r¿™K3h@rÃGÓ²™@rÏnþè@rÜJq²¸@rÎûšb34@rÊf-g@rÖ¸ìŸff@rÊ$…ѤÍ@rª«lyš@r¥Óoyš@r¯-‚– š@r©—,¹Ã3@r°«‘+4@r±0ŒÍ@r¯õß}¨@r±ƒŠ(@r¬E7Qè@rªÈš¶f@r§r>f@r§Ì÷åÍ@r¬ÃÐ!ø@r¥Š"@r£ˆÑv´Í@r£ˆ‚ô)š@r«JAiš@rÛâš@s«®¥–f@s ¼¨Îf@rý]w¢«3@rïìâXÛ3@rø&~¯û3@s›†C4@sÙ•ø0@s v.(@rîIŽÞf@rÏ2C3@r¸œÕ3@r²•óW>g@r³$ùqöf@r°õÄvf@r´›IÅTÎ@r½M[š@r¿V$Ñš@rÁÁ»r´Ì@rÂ:ŸPLÌ@r½ãn9|Ì@r¹ºØ š@r¹¨–f@r·´À6æf@r´¾^®f@r´iBj‹3@r±L]Ó3@r³ ë®f@r»m¿Fã3@r»Íð»3@rµzÂÎg@r²6#˜9š@r°=v Iš@r¯©!<¨@r°å|w@@r«>s4@r§‚ñ¹š@r¦ý¶‰lÍ@r¢Ët»ÜÍ@ršBËLtÌ@r‘Ä ]¾g@rŽ`z•Þf@rƒö‰tñš@r€F¼@r~³ Ì @rt“Áû3@rˆñ4“Í@rnƒ3ËÍ@rŠ]Þf@rsoŽf@rØZÌnf@rÏ1#~f@rªy½ó3@r•v¯c3@r™ØÄÙÜÍ@r»mHÙÍ@rÃ@rÂq«ôÝ@rÀüÏ@rÈ?×Ý’@rÈ @rÄ a¶@rÃíUD”@r½¯Í6@r»Ͳ @rºÙ~Þ@r»){§F@r»ä jÅ@rµÅ¦¢¤@rµ •Îx@r¶µ[Ï@r¿(5‚@ráq]@sà.ôh@sû4ŒU@sˆ—߸@s ìľ³@s¤§ú@s(‘ôÓø@s'†‡®@s2V±Z@rêl›l@rÇ-*¡@rÃhÉ„@rÂÏQ@rÂÀŠð@rÁµí´@rÃy¯.¤@rÌ2Û @rÑ>œíð@rÕs‹V¨@rÕ×.á¦@rÑá(4@rÍ© €@rÌùðm@rʈ+“v@rÊy€•@rÌtx‘@rÆbÄi@rƦ¢!C@rÑI•T@rÔZM›Ò@rÐ1±¢@rΈf@rª†f@r½ÃT. @rÔ´ÄÌ@rÎ >?”Ì@ré©Oš@r콑È@rãË_Ø@rìsE34@ræŒ[+3@rôjÊš«3@rè)müìÌ@rÇ€ÄÏ@rÈî-Ð@rÖ®xî€@rÔñŠFTÍ@rÛ!hÛÄÍ@rÜ6ZÈ™š@rÙeOžf@rÙ %bÖf@rÒÉuÛ4@rÏ%vg@rÑ-iŽžf@rφlïþg@rËî#ðQ™@rÆÖžã™@rÄœaVg@rÅÈ<©¨@rÑK™dˆ@r깡ùIš@s‡ðÖQš@s˜º±š@s“b~–f@s x%³3@s*$Õó3@s9ȃQX@sHŠ9™@s}ü¬é™@ráAçÈ@rÈgÁÕQ™@rÑÎ15y™@rÎüœ ¬Í@rÏC·18@rÐÞùÈ@rÒ/Zߦg@rÛ©1X„Í@rãð„<Í@rè“´ØË3@ræWÿ f@rã¡Þf@râK1dÌ@rásvà@rÞxG\H@rÞ\ÇÀ@ràs+eÃ3@rÚø ¸»3@rÛ!%[2@râ÷-kã3@ræ.K3@rá©ç†g@rá¦Y—Û3@rá»ô‹3@ráåó†33@rç„Í@rà'Þ(<Í@rÚg°@rÔvuþf@rÈdý$þf@rÂç Ó3@r´dVœ¼Í@r¬‘ö¼Í@r§‘'Vg@ržO”Uû3@ržÓçº3@r˜qìÖg@ruãZ(\Í@rGFÉ:lÍ@r9€9å{3@r¥‹tïüÍ@ràá™”Í@rÚhЦf@rß5wçîg@rÆõoåf@r´’;— 3@rÎgÁ4@rÜS˜Q“3@râ¤þn1˜@rÝâ‚K3@rÏŠey;3@rÇ:ý€@r½*Ú¹3@r·hÍŸ{3@r­î±{š@r¥°ÛlK3@r¢À#3@r°ºl0Pé@r±Ã]NÌ@r±·CªÌ@r´çbh@r¼Z;‘úg@r¾’*ªgîf@s öTÍ@s¿ÂLUÍ@rÛÑ)¢,@r؈Júf@rï#Í)f@rñl$äã4@rôµ/êš@rô—E²š@rû}G˜(g@rþžÑÈaÍ@rûbJÒÍ@rý9 J@rüÞ »@rÿf‚ @rþ0å²g@rûyëãf@rúÄËËf@r÷°àÍ@r÷¨7ó3@rúÛÃ%Ç3@rþ³cŽZ@s¬Ž‹Í@s mìÍ@sÑYy™@sï^•Žš@sGE¬š@s´pCg@s=¯ºÍ@rþ¹ÑgÍ@rôr_§"š@rð¥f@rèC$5f@râ¨H*Mg@rÚ-ùÈÍ@rÏ-¨Í@r¾kcqš@r·ÔtùÍ@r®Ñ™äçÍ@r‘ë·†@r—ÔÛÔ;Í@rÒ‘îSøÍ@s&‡ˆuÈš@s“ðf@rðœs§,f@s ÇWµÓf@s, QÚ5Í@s!ÀƒƒäÍ@sn4ºÍ@s _OKÐÍ@rûŒMÍ@ràTœâš@ràvûf@råö\iZf@rêÖ˜Ø}g@rï 1÷û@réS0ð¿@rä?Ø>Ì@rßrdUá@rÛáG¼ƒ@rïc œ"I@råäå@râl2 Â@ràÓ5š[@r¾èx@r·íî­@r½ÃWt3@r²¿ß2@rª•Šƒ@r¯Ø‚Á@rÅ ®l?@ræ05bà@réx“²–@rîUØ2@rõê÷Î@róšA]@rõHQo@røDL^¶@rÿ¢zIn@s ô%t@s*Âþ@s#u÷~@s”1Ýì@sÌ©@síîÀH@rûÅ£ãê@rø£‘@røfþÝ­@rôŸU@rç¨Zû@rôÙîàR@røš®E-@rñ7@»Ð@ríD¼µ\@rî3H?@rð2mC}@rí—±µ@rüI²ÙF@röâšel@rÙߨ–f´@s \"Eu3@sï—g@sðÜF@s*й€@sü"Ú"f@sætå—´@síŒrÔ³@rû' æ€@rù]fàZf@rûî„×nf@s}"F¥@sòÙÊ|f@rú˜µ0+æ@ró–³Ug@ró“£úž@rñÚƒÒÞ@rÛwoc³@rÙÀ­Ÿ 4@rÝ+7Ñ´@rçO\–w´@røã¡#;³@rûÈ53@rþ]@“€@s‰+ ú4@sÄ)QÉ3@sQ[—س@sî)š@sx#ÿ+š@söÚ‹æ@s·³4´4@såQªÍ³@rÿ7`l€@rýŸžwU´@rø±¥ 43@rôà 6L@rôÇ Ææ@rñm{Àþf@rðODc]´@rërÛ‚4@râ“(F4@rá%œÊ4@ráéñˆ8š@rà¡3Üš@rà/Áj@3@ràö¾@rÞ|LJzš@rÜT«ê:@rÕ܈Íöf@rÕ}¯™f@rØ'>›´@rÖ?:YÍ@rÚm3"¤M@rÕÑ-¤òæ@rØæÇ醀@rÍñßW6€@r«• ˜Ö@rÌ‹µˆæ@rô…á÷æ@rô‹ã U@rÿ<†ÍSM@s ¥ÄM@s.YãÙš@s;tûi´@s&`ä´@sj&Oš@s·5=æ@rî¦8‘æ@rÍ qõäæ@rÛõiÊÕM@räš×XXM@rã»~òÍ@r蛣~áf@rä+S”æ@rä@¬a-g@rè(Ì@rëjݺæ@rñxÇ6cf@róG¯àÝà@réC~ßì @rÏóò(ëL@rÂ_nfÌ @r‚ÿ@r¿fmèÂ@r£8éØ@rŒM%h~š@r‡‡lÀ°y@r·'v`@rä1a›F @réQñ×¢ @ræ’u®Ë@rêFGýÍ@rôHZœí-@rÿ˜Wr›í@sväµí@sÿö%°@s vWœ#S@sݲDåS@s àgܱà@sBà@sœÉ0*À@sêÎ Ç@s‚Ç`ù@r÷hú@rïmY…P`@rüzùX"-@so!„@sâD$èÌ@rö´ê®öà@røjê$_À@r÷i  Õæ@røŒ”`€F@rò5©ÏÐÆ@rÚc;Kô@rÔGØîZ@râZ™ÃqÚ@rû¬DJi&@s`dáÍ@rýºŸjÒŒ@rþTމ¹@rûÑC³@rú Y@r½ÿZ@r£ú~@rŠ^@r†¬@r±0Ä@rߪN@ré.@rêXd@ríW0@rñD>@røÒ8@rþZ@sfH@sÕð@s®@sÏÖ@sêê@s¯²@sëð@sRô@rí €@rä²t@rþ @s0@rê¥|@rßô@ríö¦@rô ¼@røS@rúaŒ@rô”@rñsœ@rùG4@sõ @s+®@sÙÎ@sçú@rø·Ü@rõ$@rô]¶@róŒN@rñÕü@r웘@réÐþ@rä³Ú@rà 2@rßÈx@rÞr¢@rÚŸ@rÙ<¢@rØiN@rÖnr@rÕ3$@rÑÅ®@rÌhJ@rÇïÖ@rÄä0@rÁAÜ@r¿7:@r¼àÔ@r·_¾@r³¿J@r¸È´@r¿iî@rÇ^p@rÜŠH@rà·Ê@rÞx˜@rÞ).@r¶h–@rÀlP@räx@råÔh@rì >@s\Ü@s%…@s$@rø1@räÏZ@r×G:@rÊhÐ@rÅn@rÔ0J@rÛ¥ú@rݪ$@rá¦Z@ræm @réþ@rêû(@rï±Ö@r×6§Ì;Š@ráÅ6,YZ@rÑy^Þ˜Ú@r±1Ç5˜º@r¬Ó4ÐÇ@r¶(ª¼&@r¶´¶bëy@r¤‰>Þe@@r™µ8¸Ê @r›Ž®Å @r¨Úó×As@rͳH‚Ÿ³@rá¼Hõšm@rë”,·ù@rð¡Hy@ríí¸I @rô x1Æ@rþ¾Ž"†Æ@s ŠgA«ú@s{”Ežº@sF‚çæZ@sœ¯Y@s tiNÀ@s-,•»`@s ]¥O¤@rúÇ}ñq€@rüÌ…Äc@rýds˜eM@s üü™M@s ø!¬g@sÛÏ€ùç@s Îç86æ@s WG1îè@s s¢Ý°M@s¯Ñ ]Í@sjr„Pš@s ´VeÊ€@s zz5~@sÛff¸³@súH¹Í@rÿC¹°–L@rû†²ä³´@røä¾êB€@rõ§û€@rù{¡ @rø—AM@rõ¢8M@rô¼m€´@rðZDzf@rî, ‚f@rí®mÑš@rëØgR³@rç‚nIt´@räµ7ÿR@råMìQ'ç@rç!—§­æ@rá. +$ç@rÞc¿>Æg@râú Xpç@rÞ½Â)¹g@rÝ€öpZ@ràÜ%ºB@râ÷*0ÚL@rã›#׿@réÜé„Nf@rð.1ý2@rõq{¹§@rûî¦Å:@rÏò¯Üf@r¯M,µFg@räÏì;f@rð®Aª«@råRWQ@rõÍe¿Ó€@rùZÒ„ g@ræi-P˜Í@rÛÙà¹âÌ@r߯¶ ™æ@rêäý@ríóåÉ€@rîE©ãæ@ròÙ(~@ròæJ@rõKéƒzš@ròÑOм@rèäÛíš@rÕŽX˪g@rºoT™@rÀ•Z%@rÒ½šà@@rÕ~\£+@rÊ$à€C@rÇÈ¡@rÒ®˜ëz@rÉÜùã@rÅefß—@r¼úFd~@rÕíô7¾@rµTœ¶ž@rd¾ƒ@rжÔ@rÓk.7»@râÝJ~Ø@rê¹Áç¹@rïãj«@r÷ùL)@rü·µá@rý7BÌ…@sììp@rø‰#@rîVå¦@s¤I¯@s €8@>@s£Ô}x@s Ê~t@rüÆ0šƒ@rë e@r÷ ö3Õ@rö±•@ròæ\÷@rðoòmY@rþä·I”@rëY™¶@ròþóÖ@s P—æî@s ä?^X@s ÃVýÜ@s ø^1@s M1Ð%@sˆr©@s³hï@s ù!E¦@s ÇaŠ¥@s óŠÀ@s _*Æp@s »|—@s òÅÍ@sD @sË2‚@s@Ô›~@s¡ƒ¾Y@s[ªÁY@sEל~@rþ«¿ˆþ@rüä¶u@rúÙÌÆ@rùÞtVI@rùõÎþ|@r÷cU“@r÷]C¡I@rôÆÈJ@rôø0K@róÐ,‰@rï£S±²@róûDN@röxåÃ@r÷;úÅC@ró0Ïð‰@rð¥¢U@rñL'@röwãŽ:@sò$ H@sC/%Ð@rú8¦2@råRKã„@rÀøÙòÓ@rðÜ™ûº@s¾L”@rýt&ž\@rê¾s @rßy,Ý«@rÛÀ€] @rãàG'&@réÝšä„@rñŒ @ró²ºFô@rñís@rô?Úõí@rñ”ˈ"@rîGš5@ríw凣@rØBÊU @rÀyEHU@rºÙ˜áP@rÂMlm/@rçfõ™š@ràúü­4@rÓV”Ë¿4@rÕ(á€@rã ÄŒ˜f@rÙ-ƒSf@rÍÁY?g@r¶ÓŒ ¹@rÛ¶³³@r³‚ç¼ó™@rQûˆˆÉ3@r^ƒÖ—3@rÓžA3@rÝÓ?VК@rî]¿š@rôJ2ge@rõW§…¬g@rø±æh§g@sÌY…ef@sÐuXÍ@rõ±¾ÉÍ@räÊY&@s}p×I3@s Y|Þ3@s Ïøí4@s G†ƒÍ@rüR“2Í@rñæE…øÌ@råä‘p@ræA[@rù¹IHÓg@s·_éëg@s·ûfug@rèžÌ?óš@rñ«@ó_f@s ú£Œf@s µ]hÓÌ@s qQI™š@sÌ/ê)š@sϽð5Í@s ü *šÌ@s ¢-ÎÌ@s…§¥5Í@sÞLüäf@sß-f@sÑÊ7@sÞ,ŠÁÍ@sâ= Í@sàJ24@s »=³Î4@s ÁVª4@sNM¨3@sÿ^w<@s_+A@rùÕÞDÍ@rùÉ·$Ì@røzõU³Ì@r÷ÌÛZ›g@rú›%š@rú‰Dßš@rý?lÆÍ@rù¢üéï™@rùïß™@rþC>'Cf@rùÉíž3@rüL#Rz@sVhË!4@sÏ^Ao@rù¿¹K@rö¶18û@rúä0òÄf@såMqžf@s,3ÿ4@sÔVªš@sh)¥¼š@rü{•E¢Í@rêi¯ùž@rêf"Ϭ@rý9Aîf@ròä›Îêš@rá=Q8‚š@rÛþIª6š@ræc…YÍ@ríÁ—~ÑÍ@rì ÈŽ×4@rïj„"\3@rïm2×B3@rèô%™@rèëAeJf@räÛŠ¶¶f@rá?€¦ê@rëw«ç83@rÞŠs^3@rÉ.ó)Í@rÖÎç†f@rÝ4šïÛf@rå|À@rÎzˆ@r¼j<@r´xd@r¬Åì@r°¨ˆ@rí<@rtÞ”@rÃS¨@rÎÀø@r€n˜@r“”@rÂcŒ@rÔVÜ@ròÈ@rùÀä@rû¨T@s}@sÄ@s-,@ræšD@r×ö”@rü @sH@s NL@s§Ð@rÿ…@rÔ²À@rµ¨p@rÂ@rð:@s+°@rú(¨@rñ±¨@rúÅð@s¿€@s Dä@s*˜@s N,@s U¤@s©(@s]”@s¹@@rýQ¨@rù ø@rû(@rû©H@ródô@rô¯x@s¼@rÿ`@r÷ 0@rõb@rö””@rï—@rîˆ@rî6”@rìBÄ@rîÞÌ@rî>Ì@ró£”@röW4@rö¾@rùšØ@rö¼8@rú¾<@rÿO€@rÿºÄ@sš0@sNÄ@sÛ,@rú£à@rîžT@r躈@ré0Ð@rô0<@rðÓÐ@rè|@rãå¬@rá‡@rä®\@ròü@rôC°@ríUx@rêxà@rêœ@råíP@rÛ|p@rØŒh@rÕ,€@r×@rà8 @rÝãT@rДd@rرà@ràéÜ@rº"ü–¾+@r¤ŽÄÕŒÍ@r‘ŽLY(Í@rƒ‘á¾Á4@r{rCîfg@rlÔƒRÄf@rKŠðëq™@rB‚ò‘š@r€nžÆš@r»i µˆ@r³ó?Æg@r®µfÍ@s^M*D@sãT ñ3@rÝvL5Q3@r¬(¾½´@rˆ3în@r¦Ê;„@râzþÊA3@rõŠ84Gš@rç0]“Cš@ræ¿þ·3@rû¦HÍ@s2ºÍ@sÃŽÐ.g@s|Ø Ì@rÿv–ˆ@rÿz$uíš@rÿî3…¶@rü [WÚ@røâ™‘š@ró»%u¦f@ròˆÊòÀf@róQL0c3@rð£lÍ@rïiͬÍ@róøÂôVÍ@rôÉÕ§Íš@ròaÌKš@r:Í@rꨇ ¥3@rìu_3@rçê“îÍ@r樕Dª@rçi¶Šæ@r廿Y7™@rçaðyš@rçeõ‹š@rí^¦žg@rôW! „@rô Ê¢¾@rðÞü÷@rò¥!H/4@rú$^<ç3@rüHêþf@s!ÿÙ Í@sIÇ…´Í@rý—Ežòf@rì” '3@rጫ»3@rÐõŒ¥’Í@rʆxÊCš@ràl’´Oš@ró>!V@rñ½«p´@rêˆY©0@r쳯ÜÍ@rñ™ñüf@rò[bAf@rôÙ<ü@rëÃôLªÍ@rãè¥õüÍ@rä¶æe…™@rß•nGs4@rØŽ.ÛÓ4@rÐaTn@rÍ/!…Íš@rËn¯…š@rϺw5Ú@râ9ˆ¼ZÍ@rç°kHðÍ@rÞHÎîÈg@r¼:e½3@r«U5•Ù3@r‡m‰¨;@rlãü@rXýϧð@rS=õ£4@rP.Ý1Ð@rDѰ@r.ÖXÇq›@r-ÑÜéš@rU>»ÏQš@r‘X»ŒÍ@r® ÜÁš@r˜”z™š@rO¢[½ñš@re÷‘×ÌÍ@rª\ˆ£´Ì@rÖQGìaš@rë=€¥3@róTPc3@rø£²^^h@rø5ZLÖf@rÚQÛæf@rȧÖh@rÛOûS3@rñVÆþû3@rýõ)¬Í@rÙu‘ø@r¯&§Žð@r„" ›@r}—hÜÍ@r™L¡­„Í@rÒ˜‰·À@rä8 ¯#3@rÛ|59+3@rÞЯ>g@rõý$!š@rýøöš@rÿ51#à@s˜ 0¶f@rûëž4f@rûi#É›@røÛ Ê®f@ròoNÓ>f@rîKÿÐ@réQýé8@rè#g[x@rè²ñÙš@ræ¦,{<Í@ré³Ì@rí–d‹5@réñhÆÙ™@rç/ù¶áš@ræð 1–g@rã癘Vf@räV›ß†f@rßý×]Ng@rÜš{3@ráÞå)C3@rà݆9›@râÃÔ$©™@räì†ÿáš@ræøÞˆc4@rè Óük3@rè˜gûs3@rê ®Q”Î@rñ¥~Ù™@röFh· š@rü7É}h@s ïܽf@rï&šfžf@r¯]NjK4@r¢ŒäȰ@r½á¹ ¸@rÃd~g@rÏÒÌ2H@rëŠsØ@rí8þÑ›@räpTžÌÍ@ràè3»ÌÌ@ræ ‚Éš@rìËÀî¤Í@rîÃvôÍ@rçò–öÓ4@rß‚ |Ø@rÜÀ  @rÛECÛ4@rÑûn³3@rÍZš¾;3@rÇc,Î@r¿ªÊKf@r¼Tl£¾f@rÂÄÂ`P@rÔóáš@rÑ&ü½‘š@r³ D‰þg@r‰$=Vvf@r2;†f@rjí{Dm·@r;Œí±Â@r"6Õk®@r,ŠÃ@r.„½Ì@r%òT±@r"_‡¸@r.D„îº@rC~@rsŠ\¼&@r£~¨‚¹@rq”ȪÉ@r(JŒ­@r@J_½C@r‹Ì¢²@rÂÍj!@ráW†#F@rê.5 …@r샿 3@rÙ©v,û@rÁõÚÏ¿@r¯G‹@r·šy’@rÈÝ]sE@rá0ìѦ@rÈ5§#!@r“}ªDÚ@ra UÉæ@ra=ÿ§D@rÅ­¶@r°õ€pd@rÊ»{@rÎZ¢¯Õ@rÖÖA{v@ré4 IÂ@rñüÙß@röÄDÛ@rùç’\@rù·h˜4@röš@rí¤t»’@ræÿõî@r㾪@rßõ @rÛ¥¸Õð@rÚê 14@rÛ¡Æ 8@rÜðgôþ@rß­¢¬@rßrƒõG@rܵ»E@rÛòDà"@rÛ(¥ýÔ@rÚsšà@rÓ~¢ìo@rÎ;1Ås@rÖåŸN’@rÖ#ßC@rÖ)‰D@rØ&Â@rÖ˜ÿ÷@rÔЩ@rØoÒÖ¾@rÞÚ*2ò@r垪h„@rê(ë%¢@rúØ@rü—ß»¸@r¶Ö¹G–@rcíµ@rw«Wß²@r²–x•ƒ@rÄî½@r×·un:@ræÃõÞ«@rÝSr®@rØMȲ@rÔË×.B@r壈@rì€èZN@rçü$”a@rßÊÃZå@rÚþô¯1@r׋–ÐÆ@rÏðÔ3@rƺŒÎ¯@rĽyÿà@r¾o™§@r±ý×.Þ@r«"èÙ@r°ÑrË@rºÈ;yP@r¤Õ7šÃ@r‹Z1vÂ@rr}ì¼ê@rw«U“K@rXÊ™·@r0|{ó3@qùéLæs3@qþ†ü‚æg@r Ú`"Í@r ØÀK|Ì@r`©vë3@r@”%Y™@r-‹Éš@rSéøO¶f@r}þIkéš@r=9QãÁš@r hô‚#4@rBm©¾f@r†‚g¨f@r¦Í\C4@rÃ"0>4Í@r×*µ0TÍ@rÇåx1Nf@r Ëºë¾f@r•Wm–f@ržÜß“3@r¨žÆ—Iš@r¬Úl9š@r»î§åØ@r­ØS¨œÍ@rhFºÔÍ@r5µzˆ @r1ÎQ­Û3@rJÆ[£3@rs4q@@r›¼fgˆ@r´Ñµ@@rÊJ0 X@rØÿTîf@ráÌø"žf@réz`¯Îf@rìzÌæ¼Ì@rï[ ¯ÌÌ@rëÌ#Þš@rà^cÓ–f@rÙL”†f@rÔcØX@rÐr÷9š@rÌêv51š@rË%ש6g@rÎêAî¾f@rÐÜ~f@rÑeÇÛ¼Ì@rÕŽÔÌ@rÒZióôÌ@rÏ34Ì@rÏ=ʘ<Í@rÌ(%lÍ@rÅM¼âžf@rÁ|ᜠ@rÅ‹6°@rÄ Þ°@rÁ~ªþf@rÀ!L Îf@r¾3;†g@rÀJ:Sã3@rÄò´/ë3@rʰ•8@rÎߌwf@r×ÁÊDÎf@râ‘°^g@rÐsâš@ryõB¼š@r=/4X³3@rz^ìe¾f@r»ºqižf@rÆŠÐŒ„Î@rÍ9t™™@rόə@rÌ…t&€@rÖ—›òÈ@rÙíý7x@räÿU 34@rèB$ß–f@râ²™†f@rÜW^{ø@rØdÂ,Í@rÐë(/ÜÍ@rÆÒà„Æf@rÀ€Ähš@r½(tÈéš@rµzƒ3@r¬Dùw„Í@r£¨-åœÍ@r¡I0^ 2@r¡©x¨ë3@rƒ1Æ¿Ó4@rhœ"€@r`:@g0@rl±³0@rBÞÉåi%@rºE@qóTŒ@qꀻü@qúÔËQ@rS¦ì@r¡VŒ@r å2S$@rãé$@r'e¨@r3þÙö@qûý“1Ì@qö7‰*@rK¹P{”@rxnŽð¸@rk¯ì ¤@ryK޾Ä@r‹Ñ€á”@r€J#l@ra½õ[¼@roR¦Ø@rŽ Oä€@r¹tª¸@re^rôT@rf‚œf€@rV®„|@rÉÂõ`@qû‡B@qô±B2€@r`÷D@r-?` @r\_Wè@r†7[|À@r°pçnð@rÇ ¤ax@rÏ#I˜@rØÈ«"¬@rÛÛ^ßD@rßK’@rÝ¿Zµ°@rÓCE8@rÊ}Ç à@rÀe£ÆD@r»ÒÞSÔ@r»µ›@r¸@œ@r¼Ú‹kˆ@rÁ Ý@rÂÀÄ™Ð@rÈ>qäD@rǶØAT@rÅ`¥È@rÃv£h@r½=Jf<@r¸”*0@rµú¿™X@r²  nD@r¯?Ë¢ @rªSÐ@r¤J›Bˆ@r£‘Öè<@r©v.øŒ@r¬g¬@r¯oé@r·ÑÃ"@r¼|É8@rº'ž,ô@r•ZÁÔ¬@rC5uLl@r.{a÷@r€WŠT@r¸5ÔÈ€@r¼DÄ@r»”£$¸@r·—I@rÁ¿Nîð@rÓËmÄx@rÚ…ÖÔH@rÝ»…l@rÝ’2@rÙ2z<@rÖ ´‘ô@rѯxòd@rȸͷh@rÀ »8`@r» „,@r´[ç8@r¬Ùò™p@rªD»0@r¢lüCD@r˜ü ÎŒ@r”žŽŽä@ryjD.˜@rS¶ý‰@rE‘³Td@rF6±$@r"ž;Úh;@r¸[+"Í@qÿ|»Í@qöªÄ.@r:Îw‡3@rÊæ€‰3@rƒ×30f@rM4ÀÎ@rA‰|†@rÅí©™@qå×ß&àf@qÄÊ›pŒf@qñPÏS™@r;7l1*@r9jH¾@r l):ðÌ@ræžPf@r·Wä²f@r%z渿3@r3w©1Åš@rKé™,™š@rJ‚Êg@rid7”@qÃñóÎ@qÇ#8Ïöf@qÆ'¿—(Í@qµ3®Í@q²Î>†2@qµKGÎ@qÃQ®¾@qï­GLÌ@rÖ[Ñþf@rL)Zlf@r_Êú™3@r±—EcWš@r·ç؃š@rçxgÄf@rÉ>ñ™@rÍ8Ê—µš@rÌ{Ï/õ4@rÃTs*Öf@r»B8ªüf@r­\d|ö@r¥È<þ@r§:†Ê@r¢˜ã&ºÍ@r¤Ö|ŠÌ@r¬F+dÌ@r°îãN 3@r·›9‹2Í@r»Wé^Í@r¼† ´Zf@r¹uÒ‡3@r±†…òñ4@r®‹mBÌ@rªPE3@r¢»îÛ3@rœ(’DÌ@r”*XÏÊg@r‹*À¿g@rŠ2NI™@rõƒ>~f@r¶–›Jf@r˜†ÔŠÇ2@r§¹èÚ@r›j…þ9š@r‡ÐÛk4@rR„Œ˜üf@ry¿(f@rx¢R3@rfj›ûÒ@r’94@rœõ½Ùa3@r£âZ$Ì@r¡Ýâ„JÌ@r¸¿×4@rÅ‘$@Ì@rÇ¡pLØÍ@rÌÍt³3@r΀2ç…3@rËr_â3@rÊ Ýÿ‚Ì@rÆ _ &f@r¿[vàf@r¸€¶wE™@r°õK Ì@r¨€‚3ÒÍ@r£ägc™@r£PQÍ@rœÂÅ#ŠÍ@r’àÖš@r7®Vrf@r}LóöÒf@rPŸíhñš@r*ý›š@rÈáSIš@qþÅ·ILÍ@rõ³(^@qþ‹EQ @r vx1™@r? •î@rª-c$@r > ¥ÿ@r+©¡û™@r-¤¥ùí™@rñg@â@qÆqª(Í@qµV.Ï8Ì@që;ås4@rÄÌ@…™@qÎ\>‘‘š@qIG¥ë4@q£ëÊþú@q¤qô @qÊœQj@réŠ#š@r-I^ùš@q¯STz8f@q4¸ }xf@pþ¤f@qWÜ3D@q.N *@qByÚ&.@qd “ŒË3@qwœY/¨Í@qŒ„^òÌ@q»NIÝf@qã$¨ußš@rICáyš@rtìNÌ@r’{O|Í@r’]éÜ´Í@rŸtž Êf@rª’M«3@r´Ñ9A73@rµ×â @r«ê³?Î@r§‡³‰®@r{èc§š@r’ÎËÚšÍ@r’xô¤Í@r‡qa³3@r‹;!˜@r’Lý@r›3oË™@r¤1³µš@r« -‰Ÿš@r°¢*—4@r®ÔePÌ@r¨°k}€Ì@r£Ž7ÓzÍ@rœ0AMš@r“‰ôEš@r‹^Ï=W™@r€18À–g@rvB¬Êvf@rqÙê­´Í@rol£@g@ruŽL f@r‰DêXƒ™@r’{ËÜA3@rqjÆB‘4@rEÅcÒÍ@rÆH)žÍ@qÜÖʰˆÌ@qõ (åƒ3@r-œ*:šÍ@rQIÆÍ@rk^éà @ry €•@r}Ī4t@rŸ„³Co3@r­ 3>\f@r­™(%hf@r¶ÝZNªf@r½ :)‘š@r»ŽR÷+š@r¹û‹Í@r¶òZærg@r³a1M¬f@r¬Ë–ú<Í@r¢œc f@r2†c~f@ršºØº8Í@r–/Y<Í@rcÅœÍ@r‹‰{LJf@rŠWE,E3@r.y‹3@r\´Û ™@rÜSœ˜Í@qý©ü" Ì@qï?U¯„@që™iQ‰š@qó×C0 š@r1púAš@r8p+IðÍ@r<½V¬„Í@r6 4Òf@rBÏÏSà@rJ-ÚÌ@r%óó‰pÍ@qß…S?3@qÃ÷RÛ3@qÇ¥ÌÏÃ3@q¨3(wL@qwèï´@qY;˜Í@qY}„_ÐÍ@qWx²¾8Í@qhh\qš@q‘c¿0Òf@qx,‰˜šf@qÅm™@p…êHEš@pU¯±…š@p{=Ff@p¸°ÖÌ@p䑀ܔÌ@q£í33@q8è§ÇW3@q[Z–/3@q–¬í˜\@qÅq¡’ôÍ@qüÍ„ Í@rQÁ´8°Í@rc>)È"f@rW¯ô þf@r_ˆ Ù 4@rp¹¼«ÜÍ@rŠâIŒDÍ@r“CöüÍ@r‹Ûtà†f@rŠNPÒf@rˆ½gM™@r~“’—#3@r{t‰{3@ryHïxÍ@rtàèÍ@rx)bL Í@r‚ñ­xÈÍ@rŽU´Š~f@r—Vâpîf@rœè>ú`Í@rŸßîÅ*g@rŸÇôŽg@r–cuM™@r‹&«3@r…¤U|[3@r|MM_›3@rm·pPBf@rdðŸ öf@r[å<4™@rRCÏvà@r_/á{ô@rx$oaÏ3@rcºÀÍ@r(”04Í@qól$L\Î@q¼¾¨Í@q¥‹·Œ¬Í@q 5ìÍ@qëháDÍ@r<ìpˆÍ@r2ÚBg@r=:¾Óë4@rHƒñG4@rl>¼ À@r“êL Í@r›ŒD\´Í@r¦Nùº33@rª Å@@r¨Qªeè@r¥¹é`Ì@r¢Ã±y™@r¡Ç<¥™@rO`Ì“3@r–½cYDÍ@r–ÎãStÍ@r”°~±¸@r‹ø™òf@rˆ  f@r† g2@r‚^)Ùúf@r…Ãò‘’f@rw‹£l@r2oN×3@rÿT¾?3@r¥à@rœ@r0X@r#sü@rPXl@rT>x@rFû˜@r8°ˆ@r/¢¸@rôè@qφœ@q§è@qˆl@qc”@qRIŒ@qO58@qQÆä@q?GX@q%µ¨@q 2À@pÞÑl@p¾°@pšúd@p|®L@p(@pšýô@p»ôP@pö<@qD@q; @qy @q¬!H@qçY\@r*<@r)E€@r&Yœ@r$ D@r$^d@rH¦\@rk¼ @rjn$@rfì¸@rh™L@rajˆ@r_…°@rbpT@r_Çô@r_–€@rgnt@rrþ|@r|fL@rƒä,@r‹%d@r:´@rˆ—D@r~JØ@rz<@rp™@ra—à@rZêX@rMZì@r@0@rQ1L@rXì¼@r9p@qÒ[D@q Jð@qt5,@qmþd@qL€@q¸˜@qÔ±p@qîå¤@qñ¹È@qÿJÔ@r1´œ@rmêÐ@r‹cl@r“T˜@r‚ì@rŽˆH@r‹»D@r†ûh@r‡ƒ0@r‰æÐ@rŠØ˜@r§0@rŒ¯ @r†¼@r…Æ@r€Ð,@rw›x@r}›@@r}cð@rLP€@r$ ü@r.Ëávg@r''kÍq3@r*=F#í3@r#éݯ4@rN^¿¹š@r"t4/©š@r ñw ³4@qûhÐn@qˤ9y„@q™Á°’Y4@qqOÁ*Ì@q^Jè>Ì@qDÐêr@qIÿH•š@qUò¥Ð¿š@qO@þˆÎ@qT¼W`Ì@qTéµq¨Ì@q8éšÍ@pÃøÌÑàÍ@p›F=€Í@pдî„S4@qÖ&Œf@pÿp†f@pßü ^g@pÛUë¦Í@pã:‡NÍ@pú¼ßôÞ@qÈÀˆÍ@q*aq Í@qI"ì‘Í4@qx\bë¢@q¨Ü@N@qÑMŸ8Jg@qÚ›’ëÍ@rÆÅ9¶Í@r²N ¤@qïµâGé™@r¿ÖTïš@r;Xo½°g@rEV%¶¤f@rAöžDf@rC:eß Î@r>Xñ4Í@r‹`A3@rÌXR[4@q®2G„Äf@qo!?Â2f@qSCÁ<4@q=ò¾½š@qA¹ÁîUš@qk.JƒÍ@qåz’f@qœö/Œ2f@q®B,ñg@qµgÑàs™@q¼ ’—š@qß7rG4@r$×4–Ì@rX—>ÉäÌ@rjГ4@rgÕ,2É™@rg5Rš@rf…kªO›@rbmH¾ š@rc?v‡³š@rm{Ÿ`°g@rv­N˜Ù3@r{e 3@ry v†@rul@Ôf@ru˜láÞf@rnô;î¦@rg‡W…N@rnyÍ@rg dÛ÷4@r/xK‚f@rqà`f@qýøöÌu@r2y¯4@rfÑ„3@r ïÝRf@qö¢Ù$73@q᢯3@qËÔ:š@qÁþ~!h@q¦n H@q};±™@qa›°W3@qO7ÿÂ;4@q:À=lYš@qBz6{yš@qQeÜ(‘š@qSxÍ1Zg@qQçyæ{3@qN™[+4@q+-õ3@pÎËÅ-š@p£A£eš@pÂ+B 8@pñ Ô@p÷®ý%X@pø¶úâˆÍ@púPiæf@p÷“¬Úf@qÌ ÈÜ@q´qFš@qÂ2Õ¥š@q ¼Å»{4@q- %½øÍ@q_ô.ùèÍ@qxYibf@q‡—Žf@q±8Êf@qåíýp@qЦ‹¾Éš@qÌŽÄš@rq“00Í@r9Ü©qš@r£íÏ-š@rã‘ó4@rÍá÷3@rî|þó3@r8B$à@r!\ÛV;4@r#çTÍC3@r&µWËÜ@r+s¯ÒˆÍ@r5æGøÄÍ@r?¥Á^„Í@rCaaâÝš@rDÜQ­¡š@rH’§®Ì@rMbáL@rNc¤ü@rJíãûvf@rFÆ9Í@rCn (PÍ@r7ÚjëÍ@r/iMWË4@r(šfÙ[3@qÖ¶Ã š@qnÅ<0<Í@q:ÃæÄpÍ@q+¼ï¥ÜÍ@q#‘-Aš@q0™À@q[/^Ýš@qm_ê‘ f@qm*÷h*f@qzf¡÷š@qˆµH•Ýš@q‹Ï¢÷9š@qš~j9@qÃåÊíš@qõ)»áš@r .ýÅH@r-3xY,@r2¶˜Õø@r9W‘Júg@r9GÅ_œÍ@r7,ü“tÍ@rAm?N@rX¬‘Z5š@ri7%eš@rhÎö„êf@rd—w4@rc9EUŸ3@r]à_ëÈÌ@rZ¹±¢û3@r_Q{´Û4@rKó-“Fg@r Ã:ÀŸ4@qꢤ9g3@qÍ xaýB@qÖ™;ⵚ@qÖ'Äéš@qÎû¨À½š@qÄ•¸eþf@q²å—ÑÆf@qS¿Z1™@qšv†Jf@q’e±¿Öf@q}‚L${4@qkÚw ,@q_ôEÈ@qHðà@q:˜{3@q@-<{§3@q@è+Īg@q?Ž#Ü0Í@q<ÕWýlÍ@q+ª&¸ng@pè »ãDÍ@p»óA$HÍ@p²^ÿ4@p¬f´ôÍš@p¶Sœ\Éš@pÜ5¿Kš@pç@6 ¥š@pÞr@®µš@pè Žf@púQ€Çîg@pù­³O:f@pê41Eff@p÷AŽ:£4@qÎG£»3@q!×Luš@q$‚Y×%š@qN`zRÝš@qz–áßZg@q‡ÝZ“ñš@q’]áš@q· ±l"g@q݃Èl@qçÙÞf¤@qîubcÎ@qïêš@q󚛕š@qúã"¼Âg@rKú§ð@rÃ’µˆ@r F†¤Î@r Žc@ØÍ@r± XÍ@rˆ¡»ÀÍ@rWÒÉ\@rÔ§Œ@r=l‹!š@r cà¬rf@r#!‡hf@r%€™FpÍ@r$ˆûTùš@r"“Maš@r&WJýš@r[š+…š@rJX š@q¼d¦Íš@q\^Û„È@q*ÊÈÝÄ@qRÉ vg@q4Õÿ4@q%ÈÅ Ÿ4@qA/é5-š@qI¶Ð#Zf@qC…ÆSf@qFÝ꜌@qR[“|ì@qXÖÒ(¬@q`~ T“4@qxÃ\É)š@qœõ4Ùš@qÁà(78@qÙ¶-Iš@qì|Ú‰š@qþáÓ?4@r JRÛˆ@r }v¹@rÖ^ø@r;C×*š@rQú2î!š@rTĨh4@rRä²,33@rS¨ül3@rPòã ¤@rMví²HÍ@rOF»¬Í@r@¿LAš@r: @Í@qÝþ=ê\Í@q¸x¨ê@qŸ.lx@q‹íw@q‰âsïùš@q’ßP†f@qŠÝ¨Zþf@qyHF[&f@qww9 “3@q{N–s3@qvt ög@qgŽaÓÛ3@qXô.+3@qAB$™©š@q-n%(nf@q%ëÉ>f@q%¯ô¦Ff@qxH€@q•¸1ˆ@q ÷x.®g@pô&ÔTÍ@pÛØbÑtÍ@p¾,Â’éš@p˜:S“3@p”ûóC4@p©½XAìÍ@p¥¯Y£4@pš…`@qÁŽÐ,Ì@qÁEdNf@qÆd…%¦f@qÐÎBg@q×*K5–f@qÜ\ã²Öf@qãE¶ ±™@qåÀêPÞf@qè¦Í9.f@qï9§Â4@qõ®ŽI!š@qøD`åÑš@q÷ž |™@q÷]*øš@qú Kö)š@qûÖt³3@qøo‰ë;3@qöhp:»3@qù!ï¦,Ì@r u@qô¾Ë`P@qªád>f@qSÞ®8@q#UÅ)À@qkó3@q uï-{3@q;£Z[3@q$ÓG¼†g@q'˜AØ@q ¬@@q´±…x@qב@q#H•è@q.¡Ï¬+3@q9«äRœÍ@qHôú‚üÍ@qdýÝ)£2@q‹"Ó˜8@q¦ñG)¨@qÃól”Í@qÑ|ꂎf@qز߸~f@që¡ãy£3@rLÓ}tÍ@r(?%Í@r6aœ:3@r:Á•¦Í@r=UÍ@r=-œî–f@r7÷Ö1¹š@r7.I1š@r6ˆlÉš@ráÉNéš@qìC:øùš@q¸ò_ u@q‘5‡¢)3@qoHÁù»3@qb6aÖ@qmd~8¹3@qiÜ g4@qZ•këè@qRÛ³eÑš@qXN†Îš@qX‹4¼V@qKñÝÍ@q=fêÅ–Í@q(×ÜÞ@qã†øf@qy|f@q K —(f@qß3@pñ\C!3@påÊ‚¯•3@påä ”Jf@pàwå°Øf@p˲Ü=@p ó„*@p‰L?‚b@px!HÚ¾Í@pkê(Í@phFnÍ@p‡Å˜ÙÕ3@p«€Üªí3@p½#öç4@pÆO¡¿™@pÉDp¥¶f@pÃÂ2$ðf@pÄÇÛld@pÁÎ-)t@pº²‘+˜@pÂ0;Roš@p饒âf@qÖæyf@qZ.4f@q~¡¡okš@q»ÏI«š@q’föŽøÌ@q’ ¾Zf@q™Z–ìf@q¥DpÒ#š@q«§,wD@q°¯‰¨$@qº7Ì·.g@qÃÌI9À@qÆ‘!¢Ä@qÆÓîɯ™@qÉ@Ûe\Í@qÌ}z©rÍ@qÏ—ÄU@qÑ[ ™ñ3@qÓE™m3@qÑÏI>~g@qÍ…ø­†f@qÍ)Ž^f@q× bó\Í@qÞŸÅÞf@qÈ0@pîo<â@pùf8ê4@p÷^¿´¤f@p÷ÉYÄf@qƒÂ›4@qDwµ3@qhÙÁpw3@q…ÜÙ@q–à@%^f@q£‰­Ff@q·¥~Ò3@q×;¨`@qû Oæ~@r†«NÍ@rþÊm·3@r"ƒk«4@r!ÄÜŸ‚@rí—jÞ@r]ÑŠ@rš/µS4@rÊ´{š@qévÆ’%š@q¶tŽ›­·@q™¶ @q}\k8@qcâÆŽØ@qa^jÀ@qZv½¦Ð@qHÐüCh@q8áD6 @q7é ¶x@q6݆û @q.U ½@q"FºD0@q‘2à@q—Ùý¸@pû³Eè@pòÖU)ø@pëp7z@pÝæÀp@pÏtZ1€@pÌ—™Í(@pÌ-¯õ@pǪ5UP@pªÝ¿­@pŽ—ð@pp’Rˆ@phÏZI˜@poœZ @pˆÅ‘Ë@pš¡’Ð@pžÁJºð@p£!.8@p BôtH@pšq°@pœ¸ @pžMlà@pMùY@pŒÌY†@p¬È)à@pèd¶ø@q.CÅå¸@qQ‰Ýÿ`@qY(ヨ@qW˜@q],ùëH@qmµã˜@q}“¸@q…ó?Ì(@q‹4Ñ`@q•µÖø @q¤‹¡-ˆ@qª‘ìÓ¨@q§MÈØ@q£èïÑ0@q¥¥žúX@q¨Ý/´È@q­ŒœÕ @q°C]ã@q®ë€@q«ìîâh@q®ÖkØ@q·\«“@q­xL¸@qŒ¥L@q1=›ê¨@pîåö$0@pÚ Ö¤P@pæŠî€@pîF/±@@pê+Ù@pÞhõ¨@pÒû§’˜@pÌ¢ À@p½>ø³È@p¸8‡@p¾ãµŸ°@pÃ)½°@pºLª¿¨@pµE³@pʯüÜ@pù'³!X@q ÍËUè@q@ÑyU@q^ùð!°@qv¶öj @qš`Q¶ø@qÁ¦ˆ§@qÝ qå(@qò–àÉÈ@râ7X@rÁŠ ¸@r®‰U@qùU×°@qõåÓ`@qðûÝ@qâP±d¨@qËóQ@qªP ff@q¨ ûäÌÍ@q©lÌ@qv5Þ™£3@qgºäQÜÌ@q\ ¢Ì@qE‘ò:)š@q.0éÇÀ@q#/ P@q &“ˆc3@qãmnÉ™@qKeù™@púg‹Ý@@pï]D¶f@pæÄ'/Æf@pÜúN_ÿ@pÖcO™š@pÒ¢mÑyš@pÈÐ¥£ð@p½ò–öf@p¹få“6f@p¹+,£3@p°¢YÙæf@p¡ŽÀ¦f@p’XCvg@p‘)À‘6f@pšhFf@p cYP€@p•«BNC3@p…¶íÚã3@pzC¸ó@poßû“3@phÁÑ3@pkµ; Ì@po_’¥ÜÌ@pd;U1Ì@pcØç g@p‰/Xc3@pÅöYôÓ3@q Ð.2™@q)Ô©y @q%y‚ @q1°ç6g@q%]Ä`@q>û<ÀÐ@qV-B‚)š@qddIº“3@qkI 3@qsä1 Í@q“ëIš@qŒ:lÉyš@qŒû‡­€@q‰C¬B‰™@q‰ØÑ’9™@q‡„|å€@qŒ$ÏKÜÍ@q‘àVbÌÌ@q’Iã3@q’œq½Æf@q”Üvf@q-+6‰š@qdmI>‰™@q#yI™@pÔVa‰š@p«Ê»·Ó3@p³%F^3@pˈ5†f@pÒH~@pÄó2PÀ@p°ÒvÓlÌ@p¡^äï<Í@p ¬Ó·<Ì@pš…7f@p•?ÂÑÜÍ@p“ð:ÄÜÌ@p’¯3¶Ð@pI:TüÍ@p‰åLÌ@p‘ Nžp@p¬Ðt$&f@pιÉ6f@püÓC÷ÜÍ@q2û¸üFf@qbd…Îf@q–ô³¬ @q¸Æ?&œÍ@qËòÒ¼Ì@qÙïv ã3@qàbEÐ@qßygà@qÛúêæC3@qÙñs¼C3@q׬Ã3@qÂ_…9Vf@q°U•~¶f@q¥ü›s†f@qJ´Ãh:@q¤èI™™@q‡¤ ®±™@qo³4ß@qbjÄš@qZŸºÁùš@qBí·¶¼Í@q$Û¨@qßtV@q ×'‰†g@qBúÕ|Í@pöݼÍ@pã»jžTÍ@pØV2ÜH@pÑ2(1°@pÉÔgÄìÍ@pÉ,Ëé™@pÍ š±™@pÉý‹¨@p¾ê¢Ìƒ3@p· j³4@p³. }dÍ@p´ Twþg@p° e3îf@pª{ E3@p¬ð¦u$Í@p®°7§¬Ì@p¦û–@p"67‰™@pq³€ëQ™@p]ü2{3@pMíoš@pE qš@pA,É® Í@pD Ét»3@pB/ìÌ“3@pJ㜖f@ptÈÐ0 @p®5J*`@pëÉB¨@qön@@pþrG%@pí †e¼Í@pój c3@q –dûó3@q'±p¥à@q9IØîg@qAp¯2>f@qG^‘™@qSþîΔÍ@qbø(ÜÍ@qlºÌiã3@qm>æFg@qm9d8Îf@qeõU'Í@qf/ €@qmû€p@qr˪x¤Í@qt?{šA™@qlJÛÕ¹š@qM‹±_ÿ@qP¾ÔÑš@p¿$, š@p“(1`@p’}¹—3@p§W5ê{3@p¶Ýçàƒ3@p­i—*@p“Ë1Å(@pyüÎ &f@po+ÅÂ@pr5=Íh@pqˆêùš@pjLùË3@pdù•73@pe,1ÖTÍ@ph8¬”Ùš@phCrƒ9š@pg?xõ‰š@poÒÔh@pŒÆuØp@pÌZ AÇÿ@qüŠÑ€@qa—Ý@qŠºqØ™@qž©„Ræf@q¬^{f~f@q´#¶Õg@qºhÈUš@qºµ ÙÁš@q¶®« 4@qº¡UÉš@q¼ÀÁÏ9š@qª˜û”(@q˜q]ªÞf@qµÒff@q˜Úãר;@q‡lèV@qb[³nÒ@qGâ.ü²g@q>q¬Îk3@qD ¹?3@q6qVéý5@q eÕo3@pþÿ G3@põÝ~И@pðqL%ýš@på¢gš@pÕ„\2Í@pÈTXã4@p¿’î˜@p½BAþI3@p¿ @šf@pÆeˆ€f@pÇ‘}‰Å3@pÁ FÆVf@p¹üª}Üf@p¸BŸÀÍ@p·[È ÜÍ@p³UÍìlÍ@p«Š9/z@p¨kÒ4@p¦Øé:Í4@pš {Žô@p…¨EŸ3@piä)!3@pU»ÝL·š@pKD®›åš@pDÿqÀš@p=‰Ÿ·Åš@p9Dnåvg@p8°š;&g@p>L’Ú@p[¢ Hg@p”g@p«üvWDf@pÅt;>Ì@pÌ–$Í@pÉ#ð@+š@pÆÚ>'Ó3@p×ç*?3@pçYõñš@p÷»«¿²g@q4*íPg@q`klHf@q$:ø3€g@q/_ ¹\g@q6žú@q7ÆPP‰4@q1Ø(ØÏ4@q'…í ö@q$5þtß4@q)ˆXœ¯4@q7…GE´Í@q7 À†4f@qýÞ èf@pÜÇ8.@p–Šâ‡Åš@pq½ÉGš@py`Ku!3@p#8uzÍ@pœõžžLÍ@p•W°Š@pxD?V>Ì@pWBŒkˆÍ@pAøi.@p?ƒÆhòf@pA­X\f@p;‡³š@p.êâC!3@p(Õ—±4@p0RÝ`A™@p9´‡@p;?ŽÛ@p8¸e‹3@pC襸?™@pc0RÉš@p·àÌ»Ì@qjœÁJ@qAIJ¦Ô@qK%ŽÝnÍ@qPÓØš@qnSëóš@q¸˜&Î@q“=žŽÌ@q•KèBê@q•ÿ¶€e@q(?ð'š@q£ìöçš@q¥ùÕ¤yš@q—ÀZ?Ó™@q†P,[™@qs¯@q\`œ@q3hT@qžp@q È<@q¹t@qÿl@qô@pðu`@pçÞP@pâ È@pÜ@pϹœ@p¬@p»¹@p·ðÜ@p¶U8@p¶)@p·@„@p³Ï0@p°Á @p²2x@p°8Ä@p©H¬@p›àà@p¬¨@p…m¸@p€p@pwI @pkº°@p`N @pY @pV³@pSĸ@pMáÐ@pC<ø@p3Nä@p$(¤@p(~@p3±è@p?Þè@pT:Œ@pt€è@pv”@ptïT@p~Þx@p‘¥ @p¹1°@pæ+@pÿ>T@q©@@pìÆÈ@pÖ?¤@p½¨@p¨ep@p ›L@p¥n@p©ãÔ@p c@pÃH@pOÄ”@p6˜@p8G€@pOl@pg1D@pf€ð@pR¥\@p3ŠÐ@p`@pþh@p±È@oôªD@oÛ¡œ@oÈϨ@o˯ @oá(@oèEL@oâˆd@oò$@p`<@pIò\@p•Ш@pÄÍà@pÁ2À@pÁn€@pÎP@qÝ @qCžˆ@qc¬@qrh@qxüL@q~f<@q‚±t@q„­,@qt„@q~Êô@q9èe¹š@q4| ½ð@qS P@q—Y¬Î@pö†ÿ»3@pôv|Ç3@péµþŒ@Î@pعp]xÌ@pÉuy–(Ì@p¿ßÄÔ(Í@p¾sLü­š@pÁ#´O1š@p¿F¸˜Zg@p¹“§3@p³ýiõC3@p®ƒãî¨Î@p®lMH@p®¯ `@p­ I›@p«\­Lÿ3@pªv-ØÓ3@p©‘ÑœdÍ@p¥ eQ3@p™‰'ow3@p‡àõü@pud¾“Êf@pi‘¹D>f@p_Ýl+ÐÎ@p[Ž Í@pYðeÐÍ@pWlÌ4@pVø"ûÔÍ@pV_ OÍ@pS²1øw4@pHðcܵš@p6<ç`ýš@pÙÀœ!š@p~œC®@o÷òm0@oÿ-HÓÐÍ@p )ú…ã3@paá3@p$ˆDó¦h@p +;Í@pgì«ÐÍ@p 3¢’¸@p#]#/öf@pT. ¾†f@p‘q|Žñš@pÆ*¹—3@pÁ‰í÷3@p©€”E›@pƒ~-³)š@pb….eš@pG‡¥™Ï4@p6XïÛP@p/“JÏœ@p(ÒÆÓ•š@p!ˆÇññš@pÜXnyš@pYÈš@pµm @pä€@p¤“4@p†ª¸33@p©›3@p¦Ü±¿š@oÜÚ˜ˆ\Ì@o»B% Ì@ošîz«k3@oyFàêf@o^ý 5Ff@oQGlàÍ@o]: 0½™@os45®š@o|¯–c£4@oh€É¤@oUÚ«‡l@on×n‚9š@oɰ`­™@pþr-ÄÍ@pRf»…Œ@pSдðŠf@p3ðYæf@píjÊ@p2djB{3@p[à‚I‹3@pÁ·å¤@púlz~{3@qò·g3@q%ßÙ4@qe¹ÄÜ@q#±4H@q@Õ Âg@q7Kyš@q+ë¦dmš@q…c+ Í@q€ïÌá™@q‰FÑš@q ß Qš@pöº%ÄÌ@pܵZáÍ@p¾ÐDçîg@p¥µÚ~f@p•öŽp¶f@p‡€KX@p“æ>&f@p›*¡xžf@p¡0#¬ôÎ@p¡—ûßáš@pžÕ"‰š@pœ{¨ï1›@p›ž¹Ñà@pœœpÈ@p›ƒ \Î@p˜qnU£3@p•7wS3@p‘?vU4@pŠX/žf@p~ôdî†f@pk²,¾A›@pYË)™@pL‰lቚ@pB~Ë4@p<'0^æf@p9ጀÞf@p:Õ|¯g@p=üÍ@p<8a}Í@p5¶Pkp@p*’Ê„þf@pí¬ Ff@pð•)©›@pÎ2|’f@pb³&f@p¼44@pж#3@p$“™C3@p"psÄIš@p¸5Ò 3@oíWT“ff@oÀ\‰›@o½²MŒ™š@oñ}{}yš@p)šô†ð@pU&ùY š@pa±³‘š@pN–‘Q„Î@pB}ëàìÍ@p,®í ÌÍ@pzÎÿ;4@p ™“ø@pžj @o÷lÖBÑ›@oîT%%p@oä˜vlÀ@oÞO;wvh@oß}c­+2@oåŽeÛ3@oçšã5@oÜ·ÿ Ì@oÅ©^£4Ì@oŸ;è/³5@ovªB„f@oU+¥iVf@o0rf†±›@o ïμ{2@nù‚¹¤{3@nû„»1h@olîÊ4Ì@o*•”ù”Í@oDrT@nÿÑýŒ‰š@nøÏŸ£)š@o#¢Só3@o‘yštÌ@oæñßôÍ@pµÄfÅ›@p|zf@oÁ„8Ì@oxÝ¡†¼Ï@o~€í0ˆ@oÁØ8@p i·ð@p5Å¡Í@pu¥îάÌ@p”t¤Þ¸@p¦øaT“3@p».³S3@pÉ?ebñš@pËpÒòÀ@pÝUØ­¨@pǽúx¯@pìÍ@q ¢4ŒÍ@q û·Ô Í@pôB(4yš@pÚ…èñ)š@pµ˜ëáÍ@p–{oš@pƒEÿ)š@pzUz @p{Ä„€@pƒ­˜ð@pŠÉ˜¼Í@p§³©š@p‹'ùõùš@p‡ î-6f@p‚JDØœÍ@p}@Øâ\Í@pw¦ëhó3@prö9ðg@pn…¿†f@pjÃøc“4@pfX¼:Éš@p^M"öš@pQ_Ým6f@pD(g<@p:.@p0Á@_ó3@p+—ßIš@p)uùš@p)}VYà@p*ÑYóS3@p'L²T3@p jg°vf@pÙù…iš@p—€©š@pÔ`WS3@pç€@pp%Ð@pC¬ÅÖg@p(‘‹I#3@p+¤(US3@p$"¿ëÆg@pÔPߦf@oëª9¯ìÌ@o³˜%}|Í@o“ìŽÆg@o—-G¦f@o¹áο“3@oçÓs`@p²2ÏØ@oôåv™s3@pf…bˆ@pvÒƒH@où*OC6f@oé]Õ~@oÚ/¸`@oΤ• ¼Ì@oÇV`c4@oÄkuÃ3@oÄÔ»“4@oćeiöf@o¾J[þ&f@o¯á'À@o“#DÐ@@orqdãÀ@oN‡œÈ‰š@o(w”·lÎ@o³ç@¬Í@nä—F¬ð@nÄÝB÷¶f@n·‹Ÿ7æf@nºµˆ|ÜÍ@nǃBE³3@nÈÀC4@n´£ˆ,Î@n ÎQ×€@n©ü³«À@nèõÃø@oT©/£3@o‰®œ££4@oƈ¤iš@oŸ¯q¬Í@oV]­}ìÍ@o Xk 9š@nðâN³3@o -‡é³4@oN7Á…@@o‡ŒŒéš@oÝ„:9š@p±¤Í@púK˜ìÍ@p7HÓ¿4Í@pZ¼¿ff@pLáÄ@Æf@pQbÖ}LÍ@pJ¿¾ä@p9Ø]à@p?Î>tÌ@pL‡={4@pYUÈ—“4@pUß§ @pBfÇíŸ3@p3”¼+3@p(©tܸÍ@p*¹Èš@p#|Gè™™@oH Pof@o4îPúÖf@o*ÏÛ3@o ³˜+4@o\&;4@o)Í3W4@oH•xÏ4@od,rc4@ojõÀšf@oióð@oa©å讀@oUš’ÀÐÎ@oB”#à@o*äÀúx@o;6%7Ô@o2\) š@o%e™W¡š@o •|Í@nìµÂˆÍ@nΣO4Í@n¯Øéóì@n’9–G*f@nw¼ ~Âf@n\ºç¢4@nIPÿ‚;4@n<Ö_ÍW3@n/ðRÍš@n"“§Œ¨@n,?ì@n‡°ÖYš@n—YLEš@n‰Šâš@n3—`:þg@n?O–Ó<Í@npȹ©°Í@nxw½™@n‘yõ§²g@nƒUAóêg@n[éóçf@nDÐ^¼÷4@nPè.¿33@nl9G°ä@nˆ¸ë@n™’Ç74@n§fÛ¶ºf@n˜n·#4@n¹ÍNK4@o =Gš@ox¦ú éš@oôD äš@oζ¢m·@pŒèÐÍ@pB»m¿LÍ@pbWĆ’f@pkðôÍ@pUc$­DÍ@p9ÉŒOÛ3@p"ŽRd‡4@p QX%{4@p²ù7ºf@oùP²0Aš@oû­Ù¹š@p ¿h¤@p ¼ô@p%¯ƒÉˆ@p/² _°Í@p,×¹r4@p$ºÌÓ4@p oûc4@pã_¼š@oüúk3@oñ‹I3@oïÐ.d!š@oö™Bw¡š@p sFMðÎ@p1dEìÍ@prÖŠÔÍ@p,Tl¦f@p¥ÅMß3@p³¼²3@oó‚“®g@oá*¸¶ó3@oÏWlÎ+3@oÈ@‘¤DÌ@oÃ`L“Öf@o®;ƒkÎf@o¾ø !TÌ@o³C #4@oŸ¼I4@o‡Z•¶$Í@ojkÖQš@od€¹áš@o+’öC+4@oDpJŽf@onôFf@o!ò@†f@nýMÐA&f@nöKæf@nò}‘”s3@nóDxÛvg@nõ>ZDžg@nùZ& ff@oøµ9™@o A‘™@oèÛ#3@nÿòdy~f@nõ¨hÆf@néZ0gÿ@nߨc„Îf@nØÃ]@®f@nÒ¼ã3@nÉNØÅ;4@nÁùÒ û4@nµÛÚ%„Ì@nŸ+ÌôÌ@n‡­æÆŒÌ@nmhƒ’Ð@nSEƒ_{4@n<&Ç«4@n$P¿%‹3@nˆ$ç«3@nˆnC3@mù#B,Í@m퓃†f@mã÷p*&f@màPtÄÍ@mßH›\Ì@mÖcŒÌ@mßÊ'%0@mëùÛƒ3@n«ŸmÃ3@nJõSDÍ@n5ýdäÍ@njÔÍ@n ˆÔžÈ@n bï“îf@nìЪ¶f@n!e·¬Í@n-äç­;4@n)òV{4@n%”ë×ÄÎ@n!•¢8û3@n*t¶R+3@no¥&ãFh@nÉÎÇW›3@o5må=“3@nìP:Õ¶Û@o?‡%”@o…Klf@o»P°J@oÐ3`PÀ@oÐ%L×°@oÉjÆl°@o¦ +W @oo]‡€@oeZvp@oi Î0Ð@ow)Ûp@oÊ«º @o§XB`@o½2 ¾@oé;må@oðІ.ð@oêí&–à@oÙ¥Ôû€@o©çIó @ox–Ù@@o”J½à@o.Ötà@oœuJà@o¹Ôa@oÎ-1Ô @oÍmaL @oÈ\à@o¸Àë @o¢î˜P@o‘tb„0@owÞF=@oWqr0@oJЯ¶€@oB­)`@o;í‘ö@oM›÷ýÀ@oF•„œ@o<Øtp@o,±r‹p@o GÒ=@@oÆW­P@nñ¬‰‰@nèù®@nãËcà@nÞu¥z0@nÜä#‹ @nÛÑHö`@nذ@nÒœvC0@nÌ¥ú\Ð@nÆõÇð@nÂb•@n¾Héx°@n´ìÄ‘@@n©1‰Ð@nžþàÓ@n“I–JP@n‰V¨Ù@@n‚%Õ;Ð@n~.¤žp@ny³…à@nq•n"À@nq2Äõ`@ne%ëq@nTÁJ­0@nDŸÖ@n+ú•1À@n’ä:€@n}Q@@mó)øÞ@mæ)bbÐ@mÚd⟰@mѼ{ñ @mÇ :r°@m½ë‰@mÁEHp@mÇø½`@mÍ`F @mÓ‘B™@m؄Ű @mÖÍmR`@mÛXy9@@mä—›Éà@mèZ§À@míê /€@mîöäŠ`@mè8X@mã$¿O`@mÕ2J¿@m˃íÇ@mÊÄÑ: @mÖ½©:P@n,pX@nA¬î]p@n†]P°@n7hópv@n\ Ú/2@n‰M¢"32@n¾ÜçFg@nؼ, @n豨Î<@nöÈ«‚LÍ@o—âÌÔ@nèlþåÌ@nßî-‰š@nïåÅŠe™@oªØøy™@o?'ibf@o-»#9µš@o>k6€š@oL ö1f@oVjÉñš@oZÙ€Mš@oXv†>g@oTWr—ã4@oP–Ô›4@oLhp]™@oINæt}š@oGŸ;:Íš@oMÉJf@oxB)=š@on¥q!š@ogß!–PÌ@oM²ÏZf@o(mÊf@oYŒØÍ@o쯫3@oŒwó3@nùâºÖ™@nï“€âÁš@næC"Náš@nÛ°ÔŽ²e@nÖ&Ýff@nÔ^5€f@nÑk,§L@nÊÙ|‚®f@nź&ff@nÆ7Les3@nÇB Hå™@nÆ—Æ]m™@nƶ±ñoÿ@nÄô°£êf@n¿´ˆl"f@n·´K›8Í@n¬áˆð„Í@n¡$Z”Í@n”ßQò²g@nˆÏ²ŠH@n~9¹,p@nq°²:Íš@ne€‰|Ì@n^!ôœÌ@nXQ²˜Ì@nQP"£4@nJZ2àç4@nFLþàØ@nE`ÌÂf@nBS,âf@nd@mͳ H@mÉû=ÿô@mÈCØtÐ@mÇÛñ@mÇÐÙÀ@mÅéœa,@mÁtnF@m¼LµUp@m¸HLÑL@m´ç4Lˆ@mµt•#@m¸ ðT@mŸ P@@m¦™è @mº¾QÔ@m¸'rI$’@mÅ œ@mФ@mÛÙà@mçA\@mòzô@mÿÙ@n ìè@nÀ”@n(Õ@n6·Ð@nC_¨@nP{ @n\rL@ne´@nmì@nsFø@ny×Ô@n‚g4@n‹ˆ@n‘í8@n™ @n [ð@n¥\¤@n©„@nª¼ü@n«Bø@n«*d@n©Žd@n¥ñÜ@n£(Ð@n¡^Ð@nžoà@nš¸@n•5T@n‘P@nŽ.d@n‹Øœ@nˆæ@n…·”@nƒ P@n€¿ô@n~,`@n{ñ@nzV@nyd@nv¿ì@nrpà@nk Ô@nc^t@n[àà@nU:d@nOÐ8@nKe @nFkX@nAƒ@n<ìø@n7Ôœ@n3;0@n/fÌ@n*úÄ@n&5ˆ@n!žˆ@nÅ@n¢h@n²€@n æÈ@nì@mÿs@møh€@mñÐ@mêX<@mã8¸@m܇h@mÖÄÌ@mÏÑd@mÈH @mÁ‰h@mº@m°þ@m¥dX@m˜™P@m[@mŠ›ð@m‰«Ì@m‹ˆx@m³ð@mÙ@m‘St@m’mT@m’Ê$@m“•ˆ@m”`¼@m–<@m›J°@m¦ià@mÙùŠü ê@mßÙ+%ÌÍ@måc––,Í@mêÇ,Is4@mðn3F†f@mõG6Õ†g@múã* s4@n¶O–s4@n÷ Â4@n bâyš@nS$&yš@nƒ$ðÙš@nÀÊ Ó3@n!ÏÒÆf@n%ûÐÆg@n)Õ‡ÌLÍ@n-mìÍ@n0Ð\ë,Í@n4ãiÝ Î@n9"@4&g@n<ÈÑ Æg@n@U¾a @nC}jXó4@nFÙÛ³4@nHMâÓ4@nJUÛs4@nKzscÓ4@nLÇ_1Ó4@nMoáìÓ4@nMÚÞ³4@nNqkP¬Î@nNãš7š@nN圹yš@nNZºHy™@nMºc¢¦g@nM2Ó´æf@nL‹¯p¬Î@nKæYš@nKC,ãš@nJadš†g@nI|¿Ià@nHÖ&Þ @nH+Ò 34@nGŒ°A,Í@nF÷,=,Í@nFV. ³4@nD÷ÁILÍ@nCÛèlÍ@nA‰Ø! Î@n>¸ä”S3@n<‹(Ú34@n:N²÷3@n8 `M34@n6@']3@n3ø^Fg@n1’nÍ@n/ äý @n,!Åãà@n)?Kš@n&¨®qš@n#ȸñ`@n ¾íÑlÍ@nëŽ4ÌÍ@n®|@n~8@n@P@nAÄ @nC58@nD˜@nDëL@nEÚL@nF†€@nFÔÜ@nF­”@nFzÜ@nFP @nEãà@nEj@nE0@nD]@nC¦Œ@nC*¸@nB²@nB<¨@nAÁœ@nA0t@n?ë|@n?"´@n=T\@n;˜@n9]À@n7“à@n5£x@n4H@n2t@n/ô¨@n-£œ@n*ò@n(< @n%ż@n# ð@n 1@n‹ˆ@nxH@n1ð@nô@n: @n {@n 3@n{<@n¹@mýx@mù‡`@mõtœ@mñÙà@míí@méûÈ@mæ;<@mâ4à@mÞM¼@mÚæ|@m×Þœ@mÕ”è@mÔ T@mÒûÄ@mÒ5`@mѰà@mÑ8„@mзè@mÐ!\@mÏø@mÐ*$@mÏíp@mÐó¨@mÓÒT@mØå cf-python-1.3.2/test/create_field.py0000600000175000017500000001205212706103452017553 0ustar daviddavid00000000000000import cf import numpy import os def test(): print '----------------------------------------------------------' print 'Create a field' print '----------------------------------------------------------' # Dimension coordinates dim0 = cf.Coordinate(data=cf.Data(numpy.arange(10.), 'degrees')) dim0.standard_name = 'grid_latitude' dim1 = cf.Coordinate(data=cf.Data(numpy.arange(9.) + 20, 'degrees')) dim1.standard_name = 'grid_longitude' dim1.Data[-1] += 5 bounds = cf.Data(numpy.array([dim1.Data.array-0.5, dim1.Data.array+0.5]).transpose((1,0))) bounds[-2,1] = 30 bounds[-1,:] = [30, 36] dim1.insert_bounds(cf.Bounds(data=bounds)) dim2 = cf.Coordinate(data=cf.Data(1.5), bounds=cf.Data([1, 2.])) dim2.standard_name = 'atmosphere_hybrid_height_coordinate' # Auxiliary coordinates aux0 = cf.Coordinate(data=cf.Data(10., 'm')) aux0.id = 'atmosphere_hybrid_height_coordinate_ak' aux0.insert_bounds(cf.Data([5, 15.], aux0.Units)) aux1 = cf.Coordinate(data=cf.Data(20.)) aux1.id = 'atmosphere_hybrid_height_coordinate_bk' aux1.insert_bounds(cf.Data([14, 26.])) aux2 = cf.Coordinate( data=cf.Data(numpy.arange(-45, 45, dtype='int32').reshape(10, 9), units='degree_N')) aux2.standard_name = 'latitude' aux3 = cf.Coordinate( data=cf.Data(numpy.arange(60, 150, dtype='int32').reshape(9, 10), units='degreesE')) aux3.standard_name = 'longitude' aux4 = cf.AuxiliaryCoordinate( data=cf.Data(['alpha','beta','gamma','delta','epsilon', 'zeta','eta','theta','iota','kappa'])) aux4.standard_name = 'greek_letters' aux4.subspace[0] = cf.masked # Cell measures cm0 = cf.CellMeasure( data=cf.Data(1+numpy.arange(90.).reshape(9, 10)*1234, 'km 2')) cm0.measure = 'area' # Transforms trans0 = cf.Transform(name='rotated_latitude_longitude', grid_north_pole_latitude=38.0, grid_north_pole_longitude=190.0) # Data data = cf.Data(numpy.arange(90.).reshape(10, 9), 'm s-1') # Domain domain = cf.Domain(dim=(dim0, dim1, dim2), aux=[aux0, aux1, aux2, aux3, aux4], cm={'cm0': cm0}, trans=(trans0,), assign_axes={'aux0': ['dim2'], 'aux1': ['dim2'], 'aux4': ['dim0'], 'aux3': ['dim1', 'dim0'], 'cm0' : ['dim1', 'dim0']}, ) properties = {'standard_name': 'eastward_wind'} f = cf.Field(properties=properties, domain=domain, data=data) orog = f.copy() orog.standard_name = 'surface_altitude' orog.insert_data(cf.Data(f.array*2, 'm')) orog.squeeze() orog.remove_axes('dim2') orog.transpose([1, 0]) t = cf.Transform(name='atmosphere_hybrid_height_coordinate', a='aux0', b='aux1', orog=orog, coord_terms=('a', 'b')) f.domain.insert_transform(t) # Ancillary variables tmp = f.copy() tmp.remove_items(role='t') tmp.remove_item('aux0') tmp.remove_item('atmosphere_hybrid_height_coordinate_bk') f.ancillary_variables = cf.AncillaryVariables() g = tmp.copy() g.transpose([1,0]) g.standard_name = 'ancillary0' g *= 0.01 g.remove_axes(g.axes().difference(g.data_axes())) f.ancillary_variables.append(g) g = tmp.copy() g.standard_name = 'ancillary1' g *= 0.01 g.remove_axes(g.axes().difference(g.data_axes())) f.ancillary_variables.append(g) g = tmp.copy() g = g.subspace[0] g.squeeze() g.standard_name = 'ancillary2' g *= 0.001 g.remove_axes(g.axes().difference(g.data_axes())) f.ancillary_variables.append(g) g = tmp.copy() g = g.subspace[..., 0] g.squeeze() g.standard_name = 'ancillary3' g *= 0.001 g.remove_axes(g.axes().difference(g.data_axes())) f.ancillary_variables.append(g) f.flag_values = [1,2,4] f.flag_meanings = ['a', 'bb', 'ccc'] f.dump(complete=True) print f print repr(f) # Write the file, and read it in filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test_file.nc') cf.write(f, filename) g = cf.read(filename, squeeze=True)[0] print 'G DUMP ========================================' g.dump(complete=True) assert g.equals(f, traceback=True), "Field not equal to itself read back in" return f print print '---------------------------------------------------------------------------' print 'All field creation tests passed for cf version', cf.__version__ print 'Running from', os.path.abspath(cf.__file__) print '---------------------------------------------------------------------------' print #--- End: def if __name__ == "__main__": test() cf-python-1.3.2/test/Field.py0000600000175000017500000001165512426367464016216 0ustar daviddavid00000000000000import tempfile import os import sys import itertools from operator import mul import numpy import time import cf def test(chunk_sizes=(17, 34, 300, 100000)): start_time = time.time() print '----------------------------------------------------------' print 'cf.Field' print '----------------------------------------------------------' original_chunksize = cf.CHUNKSIZE() filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), "test_file.nc") for chunksize in chunk_sizes[::-1]: cf.CHUNKSIZE(chunksize) f = cf.read(filename)[0] h = f.copy() h.transpose((1, 2, 0), i=True) h.transpose((2, 0, 1), i=True) h.transpose(('grid_longitude', 'atmos', 'grid_latitude'), i=True) h.transpose(('atmos', 'grid_latitude', 'grid_longitude'), i=True) assert(cf.equals(f, h, traceback=True)) print "cf.Field.tranpose passed", "pmshape =", f.Data._pmshape h.flip((1, 0), i=True) h.flip((1, 0), i=True) h.flip(0, i=True) h.flip(1, i=True) h.flip([0, 1], i=True) assert(cf.equals(f, h, traceback=True)) print "cf.Field.flip passed", "pmshape =", f.Data._pmshape # squeeze=True # # w = f.cm('area').copy() # w /= 10000. # w.transpose(i=True) # w = w.array # w = w.reshape(f.array.shape) # # w=None # x=None # # filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), # "test_file.nc") # f = cf.read(filename, squeeze=squeeze)[0] # # h = 'mean' #for axis in [None] + range(f.ndim): # b = numpy.average(f.array, axis=axis, weights=w) # e = f.collapse('mean', axes=axis, weights=x) # assert e.shape == b.shape, "%s, axis=%s, %s, %s" % (h, axis, e.shape, a.shape) # assert e.allclose(b, rtol=1e-05, atol=1e-08) , "%s, axis=%s, \ne=%s, \nb=%s, \ne-b=%s" % (h, axis, e.array, b, e.array-b)rt# # #--- End: for # Match f = cf.read(filename)[0] f.long_name = 'qwerty' # print f all_kwargs = ( {'inverse': False}, {'inverse': False, 'match': 'eastward_wind'}, {'inverse': False, 'match': {'long_name': 'qwerty'}}, {'inverse': False, 'match': {None: 'east'}}, {'inverse': False, 'match': 'east'}, {'inverse': False, 'match': {None: 'east.*'}, 'regex': True}, {'inverse': False, 'match': 'east.*', 'regex': True}, {'inverse': False, 'match': cf.eq('east.*', regex=True)}, {'inverse': False, 'match': {None: cf.eq('east.*', regex=True)}}, {'inverse': False, 'match': {None: 'east', 'long_name': 'qwe'}}, {'inverse': False, 'match': {None: 'east', 'long_name': 'qwe'}, 'match_all': False}, {'inverse': False, 'match': {None: 'east', 'long_name': 'asd'}, 'match_all': False}, # {'inverse': True, 'match': {None: 'east', 'long_name': 'asd'},}, ) for kwargs in all_kwargs: # print kwargs assert f.match(**kwargs), "f.match(**%s) failed" % kwargs kwargs['inverse'] = not kwargs['inverse'] assert not f.match(**kwargs), "f.match(**%s) failed" % kwargs #--- End: for print "cf.Field.match passed", "pmshape =", f.Data._pmshape # axes_combinations = [axes # for n in range(1, f.ndim+1) # for axes in itertools.permutations(range(f.ndim), n)] # # data_axes = f.data_axes() # # d = f.data.copy() # # for h in ('sum', 'min', 'max', 'mean', 'sd', 'var', 'mid_range', 'range'): # for axes in axes_combinations: # b = getattr(d, h)(axes=axes, squeeze=True) # axes2 = [data_axes[i] for i in axes] # e = f.collapse(h, axes=axes2).data # assert e.allclose(b, rtol=1e-05, atol=1e-08), \ # "%s, axis=%s, unweighted, unmasked \ne=%s, \nb=%s, \ne-b=%s" % \ # (h, axes, e.array, b, e.array-b) # #--- End: for # print "cf.Field.collapse '%s' unweighted, unmasked passed" % \ # h, "pmshape =", f.Data._pmshape # #--- End: for #--- End: for # Reset chunk size cf.CHUNKSIZE(original_chunksize) time_elapsed = (time.time() - start_time)/60.0 print print '---------------------------------------------------------------------------' print 'All cf.Field tests passed for cf version', cf.__version__ print 'Running from', os.path.abspath(cf.__file__) print 'Time elapsed: %f minutes' % time_elapsed print '---------------------------------------------------------------------------' print #--- End: def if __name__ == "__main__": test() cf-python-1.3.2/test/file2.nc0000644000175000017500000010120012752572327016134 0ustar daviddavid00000000000000CDF timebounds2latIlon`  ConventionsCF-1.5 cmor_version?u  time_bndstime  long_nametime standard_nametimeunitsdays since 1860-1-1calendar360_daybounds time_bndsaxisTlat_bnds lat units degrees_north long_namelatitude standard_namelatitudeboundslat_bndsaxisYH °lon_bnds ølon units degrees_east long_name longitude standard_name longitudeboundslon_bndsaxisXøheight unitsm long_nameheight standard_nameheightpositiveupaxisZøtas  _FillValue`­xì standard_nameair_temperature cell_methods time: mean coordinatesheightunitsK missing_value`­xìm€@>@.ÀV€ÀV0ÀV0ÀUÀUÀTðÀTðÀTPÀTPÀS°ÀS°ÀSÀSÀRpÀRpÀQÐÀQÐÀQ0ÀQ0ÀPÀPÀOàÀOàÀN ÀN ÀM`ÀM`ÀL ÀL ÀJàÀJàÀI ÀI ÀH`ÀH`ÀG ÀG ÀEàÀEàÀD ÀD ÀC`ÀC`ÀB ÀB À@àÀ@àÀ?@À?@À<ÀÀ<ÀÀ:@À:@À7ÀÀ7ÀÀ5@À5@À2ÀÀ2ÀÀ0@À0@À+€À+€À&€À&€À!€À!€ÀÀÀÀ¿ô¿ô?ô?ô@@@@@!€@!€@&€@&€@+€@+€@0@@0@@2À@2À@5@@5@@7À@7À@:@@:@@<À@<À@?@@?@@@à@@à@B @B @C`@C`@D @D @Eà@Eà@G @G @H`@H`@I @I @Jà@Jà@L @L @M`@M`@N @N @Oà@Oà@P@P@Q0@Q0@QÐ@QÐ@Rp@Rp@S@S@S°@S°@TP@TP@Tð@Tð@U@U@V0@V0@V€ÀV€ÀUàÀU@ÀT ÀTÀS`ÀRÀÀR ÀQ€ÀPàÀP@ÀO@ÀNÀLÀÀK€ÀJ@ÀIÀGÀÀF€ÀE@ÀDÀBÀÀA€À@@À>À;€À9À6€À4À1€À.À)À$ÀÀÀ@@@@$@)@.@1€@4@6€@9@;€@>@@@@A€@BÀ@D@E@@F€@GÀ@I@J@@K€@LÀ@N@O@@P@@Pà@Q€@R @RÀ@S`@T@T @U@@Uà@V€¿þ?þ?þ@€@€@"À@"À@*@@*@@0à@0à@4 @4 @8`@8`@< @< @?à@?à@AÐ@AÐ@C°@C°@E@E@Gp@Gp@IP@IP@K0@K0@M@M@Nð@Nð@Ph@Ph@QX@QX@RH@RH@S8@S8@T(@T(@U@U@V@V@Vø@Vø@Wè@Wè@XØ@XØ@YÈ@YÈ@Z¸@Z¸@[¨@[¨@\˜@\˜@]ˆ@]ˆ@^x@^x@_h@_h@`,@`,@`¤@`¤@a@a@a”@a”@b @b @b„@b„@bü@bü@ct@ct@cì@cì@dd@dd@dÜ@dÜ@eT@eT@eÌ@eÌ@fD@fD@f¼@f¼@g4@g4@g¬@g¬@h$@h$@hœ@hœ@i@i@iŒ@iŒ@j@j@j|@j|@jô@jô@kl@kl@kä@kä@l\@l\@lÔ@lÔ@mL@mL@mÄ@mÄ@n<@n<@n´@n´@o,@o,@o¤@o¤@p@p@pJ@pJ@p†@p†@pÂ@pÂ@pþ@pþ@q:@q:@qv@qv@q²@q²@qî@qî@r*@r*@rf@rf@r¢@r¢@rÞ@rÞ@s@s@sV@sV@s’@s’@sÎ@sÎ@t @t @tF@tF@t‚@t‚@t¾@t¾@tú@tú@u6@u6@ur@ur@u®@u®@uê@uê@v&@v&@vb@@@&€@.@2À@6€@:@@>@@à@BÀ@D @F€@H`@J@@L @N@Oà@Pà@QÐ@RÀ@S°@T @U@V€@Wp@X`@YP@Z@@[0@\ @]@^@^ð@_à@`h@`à@aX@aÐ@bH@bÀ@c8@c°@d(@d @e@e@f@f€@fø@gp@gè@h`@hØ@iP@iÈ@j@@j¸@k0@k¨@l @l˜@m@mˆ@n@nx@nð@oh@oà@p,@ph@p¤@pà@q@qX@q”@qÐ@r @rH@r„@rÀ@rü@s8@st@s°@sì@t(@td@t @tÜ@u@uT@u@uÌ@v@vD@Cu÷ CxV CxBTCx2àCwÓøCw~pCw„CvwCvbCuúHCuoXCtå”CtmXCt XCs×tCtHCs£,CrÈ”CqÜÀCqS¼Cpý CpÂlCpÄ€CpvHCp&tCoÖˆCo‰€CohØCovøCoŒ€CoWpCo4Cq;4Cq7üCq´ Cr‡PCsIœCsÁ¼Ct4xCtiðCtCu_Cv„0Cw\ CwŸxCw¥ôCwù,CxéÌCzÀC~DCŠÀCƒQXC„ÊhC„Ç`C„pC„jÈC„l¸C„¯˜C…˜C…QÀC…“8C…žèC…•(C…chC…\°C„ÈCƒ¨xC‚ɨCÄC`C*C·hC‚lhC‚Ú(C‚ÝðC‚»ÐC‚sC‚¸C‚!0C‚£8Cƒ0 Cƒõ`C…¸C…‚ÀC…ÚC…Å0C…”ðC‡ºC‡ÅàC‡ËC‡ÖXC‡Ê0C‡¿øC‡Í˜C‡­CƒÚ€C‚O@C€,HC|™ CyÒ`Cx CwC‡T0C‡4PC‡JØC‡ˆÐC‡¯C‡›ÈC‡¦`Cˆ3HCˆb°Cˆ›8Cˆ¸8Cˆ¯€CˆÊC‰ ðC‰ C‰XC‰¸C‰C‰ Cˆô˜CˆóÈCˆøðC‰pC‰ ¸C‰0ØC‰IC‰@ØC‰.øC‰)ÈC‰7C‰IøC‰9°C‰FC‰eàC‰èC‰ŸPC‰ C‰J°C†pC…ù˜C‡ŸC‡‹xC‡”CˆPC‡³xC‡ C‡ØC‡…PC‡Ñ`CˆC‡µ8C‡ßC‡ 0C‡ÞhC‡ËÐCˆ$XC‰C‰C‰hC‰!hC‰(HC‰)C‰*ØC‰DðC‰ˆC‰>ØC‰ZÀC‰D¸C‡¾¸C‡”àC‡ŠàC‡sàC‡j°C‡Y¸C‡d°C‡spC‡PC‡‰C‡{ÈC‡k8C‡kˆC‡i0C‡qXC‡r@C‡ƒˆC‡‰˜C‡€ˆC‡pC‡†èC‡‹ C‡8C‡ˆXC‡{¨C‡y°C‡oxC‡wðC‡†ÐC‡ŽÈC‡š€C‡¥ C‡°ÀCˆ8Cˆ¢CˆôˆC‰XC‰(øC‰IÀC‰CC‰FHC‰?èC‰1¸C‰)C‰°C‰ C‰ ÀCˆý@Cˆõ C‰ HC‰'ØC‰2ÈC‰5˜C‰NàC‰SC‰[ðC‰cC‰o0C‰’C‰±ðC‰µèC‰¸PC‰ÑpC‰Æ¸C‰µÈC‰ŸC‰Œ8C†ÏC‡¢ C‡¥Cˆ ¸Cˆh Cˆv°CˆƒÐCˆ–°Cˆ·¸CˆÂÈCˆåPCˆèC‰C‰C‰ HCˆý°C‰C‰]HC‰MˆC‰-pC‰5C‰@èC‰3C‰*ˆC‰3¨C‰2pC‰E C‰epC‰{C‰k@C‰-àCˆþ Cˆã¨Cˆû¨C‰BhC‰<àC‰1`C‰ @C‰'àCˆtèC‡§C‡•0C‡©Cˆƒ€Cˆw Cˆ…°CˆÌCˆÌðCˆ®˜Cˆs8CˆYPCˆrˆCˆ`¸C‡áXC‡ÎhC‡Ñ`Cˆ C‰ ˜C‰K`C‰NC‰AÐC‰dÀC‰ZhC‰wHC‰“xC‰‹èC‰C‰| C‰|C‰‹xC‰™C‰œ`C‰•pC‰”àC‰„C‰vC‰exC‰s˜C‰s€C‰w@C‰}¨C‰€C‰ŠPC‰Œ€C‰š¨C‰±C‰ÅÀC‰äÀC‰ùàC‰øˆCŠ CŠ0xCŠ;XCŠ0ÈCŠ C‰Â€Cˆ{`C‡ÒXC‡ý@Cˆ0CˆéØC‰DC‰a¨C‰q0C‰pC‰&ØC‰jhC‰pðC‰`xC‰Y8C‰a C‰`¸C‰a C‰~€C‰p¨C‰I˜C‰"HC‰)ÀC‰-ˆC‰˜C‰ˆC‰'xC‰>ÈC‰O`C‰]ÀC‰c@C‰n°C‰‚C‰ C‰‹HC‰ŽpC‰HC‰˜C‰K8C‰+ØCˆûàC‡ÝCˆCˆNpCˆÐC‰ `C‰!àC‰8ðC‰MÐC‰YC‰\C‰kpC‰mXC‰Q C‰U0C‰møC‰r C‰{C‰˜(C‰¸XC‰º C‰¹0C‰Å8C‰¯XC‰ÝPC‰×ØC‰ÎØC‰ÌøC‰ÎØC‰É¨C‰ÙC‰ÖC‰ÒÈC‰ÍøC‰ÎC‰ËˆC‰ìðC‰ÖÈC‰ÅðC‰Æ°C‰×HC‰éØC‰ààC‰éèC‰ø C‰ýCŠ(CŠPCŠ'`CŠ5CŠ-CŠ;XCŠR`CŠhpCŠv¨CŠ” CŠ™0CŠ}0CŠ8ðC‰ÒøC‰é0CŠHCŠ+èCŠ CŠHCŠ*pCŠCŠCŠ C‰ÖC‰ÄÐC‰½€C‰¦°C‰C‰œˆC‰‹¨C‰uˆC‰lØC‰—àC‰ ÐC‰“ðC‰ƒØC‰„øC‰š°C‰ÃC‰ÐˆC‰Á@C‰¾C‰½C‰ÎxC‰á€C‰ôPC‰é@C‰¦ðC‰mèC‰C¸C‰NC‰ÈC‰&øCˆÖ0CˆÚðCˆÓÐCˆî(Cˆú C‰.(C‰@ˆC‰QàC‰lðC‰~C‰| C‰€(C‰ŽHC‰‘C‰­HC‰Ç°C‰ñðCŠ,ÀCŠPÐCŠHCŠ;HCŠB8CŠECŠFCŠQðCŠQCŠ_CŠ}xCŠ^CŠ90CŠ*ÀCŠ CŠàCŠˆCŠ]ÈCŠ@ˆCŠ-˜CŠk8CŠ„èCŠo(CŠxèCŠ0CŠzØCŠnÀCŠt˜CŠzèCŠt€CŠu CŠCŠž0CŠØ€CŠøÀC‹Z0C‹žXC‹‚C‹ C‹0C‹ ¸C‹$˜C‹HpC‹ˆCŠªhCŠ~`CŠŒ8CŠŠ0CŠ{àCŠY€CŠ8ˆCŠ*ØCŠHC‰Ñ`C‰ÿPC‰é€C‰×HC‰ëxCŠ hCŠCŠ€CŠ0C‰ô8C‰þCŠ)xCŠ88CŠ*(CŠ,èCŠ!CŠ(CŠ@CŠ>@CŠ$PCŠhC‰ÛèC‰ˆ(C‰ÔˆC‰Ñ8C‰Ö˜C‰Ö(C‰þ0C‰Ì`CŠC‰¸C‰âØC‰ßèC‰Ç¨C‰ÒpC‰òxC‰ó8CЏCŠ;`CŠpCŠxCŠ&¨CŠ PCŠ… CЍ¸C‹ðC‹HCŠÛ8CŠºpCŠÁ8CŠÍÀCŠÅ˜CŠå¸C‹€C‹°C‹ àCŠþ0CŠÊ(CŠC‹˜C‹ hC‹èC‹ C‹dC‹^hC‹/èC‹)xC‹C‹HC‹ C‹ C‹ PC‹ C‹&HC‹8C‹FC‹pÀC‹º°CŒ¨C‹Ú˜CŒ @CŒXC‹ÛÈC‹ºHC‹¥C‹øC‹#¸CŠà¸CŠøC‹'0C‹"¸C‹CŠÛhCаCŠ•ÈCŠX@CŠ$XCŠ—CŠ–(CŠ´CŠ»HCŠ»8CŠÀ CŠ´˜CŠ”8CŠxPCŠt(CŠHCŠœðCŠ­€CŠÀPCŠÀðCж¨CгCŠ›˜CŠ•@CŠ}àCŠi CŠøCг@Cо(CЬÐCŠž¨CйàCŠÙÀCŠ÷àCŠÍCŠù CжHCмHCŠ´ÐCŠÇ8CŠ÷8C‹-C‹+ÀC‹`C‹L¸C‹˜8C‹kðC‹ºpC‹­`CŒCŒ\€CŒ C‹g@C‹G C‹pXC‹g8C‹~ˆC‹ÎàCŒ˜C‹úpC‹åC‹ÓÀC‹®0C‹ØèCŒpCŒ%¨CŒAˆCŒ[CŒ(øCŒ ÈCŒ  C‹ô¸C‹âxC‹ÄÈC‹¬XC‹«ØC‹«àC‹·¨C‹ÄC‹ÖÐCŒ àCŒ6ØC‹ëCÀCŒé¨CŒš˜CŒˆ°CŒ.¨C‹»ÐC‹ŠC‹_èC‹KpC‹TxC‹{ØC‹‡øC‹½ÈC‹{ˆC‹<ÐCŠûÐCŠž˜CŠ¡C‹‚ˆC‹¦@C‹»˜C‹° C‹Ž°C‹ixC‹NPC‹#8C‹(PC‹øC‹¨C‹'XC‹N°C‹`xC‹PHC‹C C‹4ÐC‹ XC‹Z€C‹)°C‹< CŒ pCŒ‘ CŒ[ CŒ& CŒ €CŒxCŒ˜CŒ pC‹ø`C‹ß°C‹¿èC‹ò0C‹êøC‹üèCŒmCŒqCŒlCŒyPCŒ’xCŒhCŒfØCŒpCŒˆCŒÈ CŒãHCŒzXCŒxCŒèCŒ?€CŒyàCŒ†øCŒ±ˆC CŒëxCŒÑøCŒÀCŒ¯CŒÊàCC)ÐC0ÐC@CŒóèCŒõ¨CŒãHCŒ·àCŒ—ˆCŒxCŒY0CŒLèCŒFCŒF¸CŒV CŒs8CŒƒàCŒŒÀC‹”8CŽ ÀCÓhCL0CŒÒCŒS CŒ+ CŒ0C‹Ô C‹ÄC‹¾hC‹öhC‹ñ˜CŒ.CŒ,C‹ýøC‹ÛèC‹‚èC‹¡¸CŒÞCŒÚ CŒ¶€CŒžÀCŒo@CŒ;pCŒC‹é@CŒCŒøC‹éC‹ý(CŒ CŒ#àC‹þ°C‹ò8C‹ø¨C‹ãˆCŒ7ÈCŒpCŒíC1ðCI@CC#°CÈCŒö˜CŒôhCŒÖÐCŒ½8CŒ¸0CŒÏhC CˆC*pCX(C30CDàC>€CEøCW0CH0C\èCehCžØCøCXÈCŒúCCC ˜CùCºpCÓHCŽ ¨CóÐCËC¸(C·èCÒ°CöÐCìØCâCˈCÉ8CÆèC¹C‡0CbPCQèC(°CèCŒõhCŒà˜CŒõøCŒò`CŒõˆCŒôxCŠé CíPCŽðhCçxCØCøC8HC(CŒîXCŒ‘CŒ{ÀCŒ‰hCŒƒÐCŒ¾ðC!pC! C èCøC€CŽÐCîÀC¼ C@CZÈC0°CxCŒÎCŒèÈCŒºèCŒ»8CŒ÷ÐCŒópC8CŒîèCŒðXCŒü@CŒë@CxCàCŽˆCŽCލCŽ `CŽCð¸CÖøCÇðCÆhCÎCÐøCà CñHCù˜CŽpCŽØCŽCŽCŽ/¸CŽœøCŽÕ@CŽHCŽx CŽtðCŽy`CÈ`CÛ¸Cþ8Cv8C?€C¶øCKèC„hC(xC8CŽá CŽÙ˜CŽÝ CŽÝ˜CŽèCŽÔPCŽÌ CŽ¥ˆCŽ“°CŽ~hCŽp€CŽ[àCŽ4ÀCŽ&CøpCɸC¬àCèC€CaàCèC“øCŒ¸CêÈC™@CŽÀ¨CŽP CŽt`CŽ‹HCŽrÀCé0C‚¨C‘CzhCWC¿¨CŽkXCŽbCŽxPCކˆCŽX C6˜C€CŽÓ°CŽŸ0CŽrèCŽC CŽhCÌèCåC¥¨CœPCŽ( CŽcðCŽƒ°CŽ«¸CŽŒCŽwàCŽjØCŽ¡ÈCŽ· CIpC,ÀC CðCCÐCŽððCŽÖ¨CŽØ8CŽÖ`CŽÆCŽÁ@CŽÆàCŽäxCŽäxCŽòˆCØC#C3ØC˜HCíÀCÖC¸C˜C¼ CpCrèC‘ºøC‘©¨C‘9 CŒ(CcÈCKxCî0CÕhC±XCÂPCËCÎøCÇC© C‹CwèCyCg CMˆC+ChCŽúCŽÝxC޹ CŽŒHCŽLxCŽ€CŽ(CŽN@CŽ`ÀCŒ¿øCŒ C‘7CϸC¢€Cñ8CõCHøCˆC CŽºpCŽÁÐCðCˆèCà€C›HCÄ€C©¸C~xCVˆCC°ChCȘC‰ÐCkøC• CSèCDðCŽìhC€C° CäC#€C\ CøCå(Cý°CDpCSðC‹8CJ C@àCˆC¸CíøCÈPC°C±xC¯ÐC¨pC¨€CÀ8CÎ`CØCåhC÷àCÿ@C(CzpCû8C‘„ØC‘àC¼pCÆÀC‘ C‘‡ÀC‘a C’=˜C‘­˜C‘E0C‘ pCÞ(C­¨CŸ8C© CÈÀCö€CûCÉàC¤ C–ðC|@C„C}CZ°C6àCÈCÀCÒÈCCd`C,@C¸CŽæC!CFÐC·àC‘òC“úÀC‘)0C’ZÀC’8ÀC‘%€CÁC”Cp(Ck@C˜¸CÓÀCùCΠCÃðCÑ`C±XCŽ(C‘[(C‘jàC‘3 CþÐC‘CHC‘âðC’\C’€C’¶hC’ C‘ÚC’¨C‘í(C‘â@C‘ÐÈC‘—ÐC‘• C‘«ÐC‘¨¨C‘ C‘‹ðC‘_hC‘W(C‘CÝÀC¾XC¥0C’ðC‘(CÈCšPCÀÀCå¸CÌhC´ØC¼pCѰC‘˜C’ö˜C‘tC’1pC“!˜C’m¨C‘áC‘åC‘ï¨C’°C’g°C’SC’8øC’ ˆC‘ï C‘¸àC‘…øC‘ˆˆC‘«`C‘È(C’/ C’+C’ØC‘âxC‘ÑpC‘Â@C‘¹ C‘¡C‘~èC‘W0C‘?àC‘¨Cå`C±XCdC CùhC»xC˜C"ÀCY0C“TˆC•?hC”½PC“1PC’áXC’d€C’XC‘«PC‘‚¨C‘‹øC‘˜øC‘ÀÈC‘é@C‘öhC‘óðC‘ÅPC‘¦8C‘ˆxC’ÀC’&€C‘þÈC’HC’$pC‘íC’éC“ÑèC”(C”PC“–C’ùC’ºhC’¦°C’ ˆC’ÈC’ŸpC’›0C’‹C’jxC’9èC’C’ `C‘ÚØC‘§C‘|8C‘R@C‘.ðC‘#`C‘1¸C‘:€C‘pC‘’ÈC‘¨C‘yˆC‘ØC‘ϨC”¤C•3C“N8C‘zÈC”¨C“eC’ÿ¨C“C“øC’×ÈC’ÿ C’͸C’ßC’ÂpC’ŒC’_XC’DhC’p˜C’·hC’ÜHC“ hC“ ¸C’þàC’÷ C’æØC’ÙàC’ËPC’Ä(C’®°C’„C’f8C’<˜C’HC‘µxC‘g˜C‘ CÀ(C€øCÖ¸C&HC’*C”¢pC–ÅpC–~ˆC•8C“Ë(C“`C’²C’zC’t°C’ƒC’”C’¼€C’ö8C“ðC’ã0C’£ C’gHC’6°C’p0C’EÈC‘ñHC’PC‘ÁèC“ôPCÑ8CüàC”°(C”PC“ïC“—C“ˆHC“—0C“£@C“›@C“‰€C“nxC“L(C“ÐC’äÐC’²C’™ÐC’iàC’%¸C‘ì C‘ÊðC‘Œ¸C‘¹øC’€C’HC”yÀC“*àC’°C‘ü¸C’>¨C•C•C”ÉXC“øC’6ÀC”kXC“ãC“ÞHC“éC“µPC“{¸C“r0C“P¨C“` C“?PC“€C“øC“˜C“JàC“vÐC“¥ C“¯˜C“¯ˆC“±ÀC“ÀðC“¹€C“·øC“µpC“´°C“¡@C“pC“EØC“pC’åXC’•0C’1 C‘É(C‘gØC‘;pC‘\ÈCøC“=C•óˆC–áC—•hC•—xC”µ¸C”kxC“×°C“l8C“mÈC“txC“lxC“‚C“¥0C“ŸC“p@C“*xC’ÞPC’¡˜C’§0C’zHC’d8C’ã`C’œðC•%€C’µ0C×hC‘VxC•iC” pC”Ÿ˜C”Ž(C”_ØC”\`C”JÈC”HC“çøC“³ÀC“}ÈC“J C“¨C’ÝC’ªC’‹8C’ØC’µxC’3PC’tC’ûÀC“žÀC•àxC’ HC’ƒC’”(C”Ô˜C–VÀC•`(C”²èC•DC“)¸C”ß8C”QpC”mØC”Y C”ÈC“êðC“ÕPC“ÐC“æ0C“·¸C“¡ C“±C“á0C“öxC“ýC”$XC”1˜C”9 C”HC”WC”RC”KhC”GèC”= C”# C“ùˆC“θC“—¸C“O0C“`C’¬C’DhC‘ÝøC‘ŽHC‘&ÐCE€C“ZøC”ÛØC˜l°C˜80C–UàC”§ÐC•pC”ÓC”JC”+C”¸C“ð0C“ë(C“ê8C“ÈC“HC“KC’÷¸C’ÊØC’Â`C’œ¸C’²˜C’°0C‘‹PC”«C“9ðC’d@C‘j(C•ÝØC•Ä€C•·¨C•ŠØC•@C”ÎxC”žPC”T¨C”ˆC“ÑC“›ÐC“gxC“3ØC“`C’ëHC’òèC“XC“pC’áˆC“(`C“Ó C”™øC–r8C“›øC”rpC•WˆC•Ì(C–€PC–g¸C–$ÐC–ÐC“÷ C•6pC”ÇÀC”ÖˆC”¾@C”HC”v°C”hpC”mXC”fÈC”AC”FC”[(C”v`C”rC”s@C”‹@C”› C”§¨C”«ˆC”«C”hC”ŽðC”zC”YÀC”,C”PC“ß(C“³xC“rC“+C’Ü€C’‚¨C’ C‘¢C‘OC‘$PC’èCèØC—‚˜C—¥pC–’ÀC“ÚC“ü°C•}(C”þxC”¸°C”C”2ÀC“ÿˆC“ÞÈC“¥øC“l¨C“8XC’óÈC’݈C’ÙHC’ÆC“0hC’ò C“ÐC”bÈC”&PC“%C’‰ˆC”ýC–?ÐC–D C•x@C•C•C”ÖC”„`C”5¸C“ñ@C“ºC“’xC“vØC“xèC“[XC“y¸C“¥@C“Œ C“ƒàC“ÎàC”oC•;ØC–å€C”ªàC–ŠˆC—3C•Ö0C•ÊC–†0C–eèC•2C”€ÐC• C•DPC•CðC•$øC•hC”ÿ¨C”ÿ¸C”÷C”ÒHC”¼ÀC”˰C”Ú@C”æ°C”ÜèC”Ý€C”ßHC”î¨C”ý0C”ëXC”Ò@C”¶ C”’ÐC”_hC”%C“ïØC“ÌÈC“´ÈC“–pC“_PC“èC’Ð@C’tC’ C‘£˜C‘sàC‘ïC“€CŒPÐC”«ÐC–”C–zHC”VðC”>(C•ã0C•UpC”ë€C”˜C”&pC“ãˆC“² C“|ˆC“P˜C“"C’óøC’å€C“)C“Z C“x¨C“bxC–.ðC’âˆC“ëØC“tC“à C•@C–ž¨C–‹øC“³C•¨¨C•XðC•"C”ÙC”ŒHC”BXC”ðC“â¨C“àxC“ð˜C“΀C“ðØC” ðC“õxC”C”LhC”ö8C•ÛˆC—` C–møC—˜hC–ƒðC•HC•¨C•–èC•¥HC–C•¨ÀC•ûðC•¢àC•‹˜C•eC•RÐC•M C•Z8C•V˜C•AC•9ÀC•8C•>øC•DàC•;¨C•:ÀC•AxC•F C•RPC•.0C”þ@C”Á C”ƒØC”5ÐC“æC“¢8C“yhC“ZPC“>ðC“ÈC’ÛPC’“ØC’;C‘ÛÐC‘¾øC‘æpC’¤¨C’²ÈCŒ¾èC“PÐC–%hC•ÚØC•’€C” C“H€C•ƒ€C• `C”’ÈC”hC“ÚC“¬`C“xC“W@C“%PC“°C“ ¸C“†˜C“ÎèC“Þ˜C“™¨C“>ØC“w C”u0C“¬ C“ `C”öØC–»hC–t@C–âØC•(C•Z C•aØC•àC”ÆxC”hC”eÈC”X¨C”rC”yøC”~¨C”C”„ˆC”r8C”àC”Ê`C•^XC–6HC—UpC—o`C–“`C•À¸C•¥0C•ïpC•¢èC•M`C”³¸C–K¨C–(¨C•÷8C•Û€C•¸`C•­˜C•¯ÈC•¸8C•±PC•œÀC•ŽÈC•}C•†XC•¨C•°XC•»@C•©˜C•™ˆC•›(C•_C•0C”Ä@C”r C”C“¸¸C“hpC“+@C’üÀC’Ö@C’±€C’†¸C’= C‘ùÀC‘èHC’9C’¥8C’ÙèC’hàCŒ›ˆC’ÐC•ñˆC–^HC•yC”,8C“ C” ÀC•EPC”»€C”VˆC”HC“Ù`C“®ðC“`C“^`C“FC“\C“ÙC”"xC”P¨C”+C’÷(C“ªˆC“ã0C“ÎC“5¨C”ÉC–LÈC–QØC–²C• C•wC•‘ˆC•JXC• C”Ý8C”È C”Ô°C•PC•FC•C˜C•EàC•;XC•ˆC•1€C•iC•ÞXC–t C—€C—R¨C•ûC”ó8C•ŽÐC•ÓèC–1ðC•™C–ŠhC–^8C–fC–rC–[°C–3XC–€C•ü C•ߘC•˰C•ÂpC•Ø C•êC•ë°C•áxC•þ(C– ÀC•ï€C•ÊC•«àC•ˆ C•6èC”Ù0C”h°C“ëˆC“…ÈC“3èC’ôC’ÃxC’ C’j˜C’JÐC’0C’C’S¨C’ª(C’¡èC‘U¨C’¨ˆCÆxC“ñ@C•þ0C–¡hC”v°C“ï(C“ˆC”`C•SC•$C”ÊxC”sC”/àC“ñÈC“LjC“¥C“™`C“§C”]ˆC”­pC• ˜C•$@C’àC“ ØC“±ðC“kÀC”HC”ZˆC”ŽxC–4C–£8C•=`C•œC•žC•khC•AC•1ˆC•S@C•ŽHC•²PC•ÍhC•æÐC•òPC•ç8C•˘C•æC–èC–lÈC–¨èC–ö C—èC—5 C•ª@C•Ó€C–!€C—EðC–!8C–œXC–°ÐC–»àC–ÀC–¡ˆC–sC–N˜C–4(C–ˆC–ÐC–pC–LC–yàC–kàC–C0C–7¨C–18C–€C•ü@C•ØxC•¸C•wPC•ˆC”˜ˆC”&C“¾hC“ZXC“¸C’¿ C’~øC’GC’%hC’5øC’sˆC’Ò8C“RxC“‹0C’èÀCŒA€C’Š@C•ÂC•fHC•h(C”Ç(C“½hC“±8C“oPC•tøC•€ C•8C”Á€C”tC”9(C”0C“ÿ C“øðC”!€C•àC•M0C•Ã@C•ßXC’¶¨C’éC“KC’ÜxC’è@C” 0C”†øC–XC–4C•Õ8C•ÈC•¾ˆC•©ÐC•»ˆC•ϘC•÷ÈC–ðC–(ðC–H0C–b¸C–lXC–føC–_ÈC–uÈC– C–ÎøC–ë0C—èC—C—øC—èC— ¸C–s C—IÐC–õC–÷`C–û C–àèC–ÕhC–·pC–ŸˆC–àC–hC–|C–nPC–x0C–“øC–¢€C–ŒhC–m8C–bÈC–WC–KÀC–1ÐC– XC•ñðC•ɸC•{hC• C”£8C”*ˆC“¸pC“XØC“ (C’âC’¹C’µˆC’ì¨C“KØC“«(C”0hC”@¨C8C’| C•¥°C•ȸC•mÐC•,øC•7PC”à€C“¿èC“qhC•K0C•¨XC•i¸C•C”Ö¨C”œ(C”xÐC”uC”™xC”ÙpC•ª@C– C–sC–ƒ0C”BxC“~¸C“¶hC“;€C’Ð0C’šhC•%PC–ˆC–M˜C–C–C– C–°C–&ðC–9(C–CPC–I C–Z˜C–fˆC–làC–}`C–ŒØC–™pC–”@C–­àC–ÏPC–áC–íÐC–õ€C—HC—C—XC—3 C—"ÀC—EÈC—$ C—ÈC–æ(C–ÕÀC–ÉÐC–ÀÐC–¾ˆC–µÈC–¨`C–¥ØC–°C–µ C–¬¸C–œØC–’ C–ðC–èC–o¸C–]ˆC–?XC–ØC•êC•C•3 C”ÃàC”]ÈC” èC“Ë0C“¡XC“‘C“ƒpC“Ž C“¿ÐC” àC”†ÐC”˨C”KhC’'xC•Ò°C–4˜C•ã°C•¯øC•7XC•4@C•w(C”WðC”^PC–€C•¿øC•—xC•c˜C•5˜C•C•hC•1øC•W C•w`C–U˜C–¢àC–Ù8C–ÉÈC”™ˆC”OèC”V€C”1ØC“C’½àC•»ÐC•áPC–k˜C–5 C–`C– C–xC–3hC–?ÈC–BÐC–MPC–f°C–iHC–ehC–k C–sˆC–o¸C–p¨C–ž0C–¸xC–ÎC–ä8C—hC— C—¨C—.XC—-ÐC—88C–[xC”4C–ù¨C–ùC–ñèC–ë€C–á˜C–Õ`C–ƘC–¹àC–¼0C–·ˆC–³@C–°`C–§HC––C–XC–vðC–k°C–SC–.PC•÷8C•° C•i@C•ÐC”Ó@C”¥ÐC”x C”OPC”.¨C”)xC”* C”>àC”nC”·PC•0¨C•AHC‘„ C•OXC–>ÈC–j0C–sØC–0C•[xC•>@C•2ØC”îpC”ì¸C•yðC•ºPC•ôàC•ÓÀC•Ê`C•¼ðC•¼PC•Ì`C•öHC–˜C–—˜C–µ`C–ÄPC–ÆÐC• xC•,°C•,`C”˨C“5HC’Â`C”ÌÈC•Š(C–[HC–GàC–HC•ñ°C–`C– C–-ÈC–9HC–A¸C–KˆC–FC–GXC–U°C–i¸C–xHC–½xC•ŒpC–þ(C—€C—C—OhC—2¨C—øC—)C—°C”ûÈC“ÎØC–ÁàC–æØC–Ü(C–ΠC–ÀøC–«ˆC–ž¸C–øC–xC–~ðC–làC–_ðC–KøC–)C–C•ïC•âØC•ÛøC•Ì0C•²ÈC•“ C•aˆC•:xC•ÈC”å`C”ä@C”ÞˆC”ÏpC”ÂHC”͈C”ÛàC”î C•˜C•c¸C•½PC•¤ÐC“ C–Z°C–¸C–‘ØC–mðC–ÀC•ÀpC•oC•UÐC•ahC”߸C–ZˆC–C–2øC–#¨C–,PC–+C–6@C–:èC–Z€C–nXC––èC–¥ðC–±C•`C”çC•¸hC•gøC”£8C‘ÇhC“0C”ŸHC•¢ˆC–#`C–C–'C–pC–XC–˜C–+C–>C–F8C–HàC–J¨C–LpC–c8C–‹ C–¨C•WpC–=¸C—ÈC–4ÀC–XøC”cC—*pC—ˆC—)ÀC—JÈC•¬ÀC–ʘC–•PC–\€C–6hC–#(C–0C– ¸C–pC–ðC•ÙÐC•Õ`C•µpC•¨xC•”C•lˆC•HxC•*PC”öC”Ù¸C”ÃhC”²XC”»xC”¢°C”–ˆC”ˆC”ƒ¨C”˜ØC”|8C”¡ÐC”­¨C”ÕèC”ý°C•ˆC•Q˜C•wøC•ªHC•§C“.°C–> C– C–tàC–XPC•â@C•üC–z C•ÀPC• C–X@C–S`C–@C–4ˆC–9èC–3ØC–=ÀC–MXC–\C–o¸C–‚øC–·ØC–ÄÀC–­C•@C•,ÈC•¾C•ÆèC”ùPC’ÖpC’êC”!ˆC—0€C•ÿøC•¼C•ÚØC– hC– HC–*ˆC–A¸C–PC–QC–SC–e¨C–wC–¤PC–ÏÐC–½pC•TÀC–ШC–ÊÈC•F˜C•À˜C–úÀC–ò`C— øC—xC— xC–âˆC–šØC–S C–C•ü(C•ì€C•ÖXC•É(C•³xC•­¨C•°C•{¨C•IøC•=àC•C”û@C”äÀC”˸C”¬XC”ƒhC”~øC”P(C”b C”BC”;`C”$C”"XC“ý˜C” HC”<C”kÐC”„C”áÈC•ÈC•``C•‚C•¨ˆC•·èC’«pC•ã€C–>øC–0 C•æàC–øC—`C–b˜C– C–`C–PC–pC–øC–8C–*8C–7(C–J€C–cXC–o°C–‹0C–›ðC–ïXC–õ(C–ΰC”þðC”ñpC•—øC•xèC”êØC“ˆpC“‰`C–CpC–ðøC– C•¬ÀC•¤C•âC•ø˜C–¸C–pC–#0C–`C–èC–!C–CÐC–†hC–ϰC–ÅXC•¡ÀC–xàC–™8C•³ C”½PC–øC–ù`C–í€C–öC–îC–Ø8C–ÉÀC–§0C–ƒÀC–[ÐC–KpC–8C–)ÈC– ¨C•ø(C•ã¸C•ÚHC•¿ðC•¢ÈC•€àC•Œ°C•–C•…øC•i(C•HèC•>xC•1øC•4HC• C•°C• ¨C•#hC•XC•/(C•XxC•kXC•†C•¨0C•´(C•Ö8C•ذC•ÙÐC•÷8C– àC’îÐC•¡hC•üC• C—bC–{ÐC•»@C•ýC•ïXC•îC•ùèC–C–-hC–PÀC–e˜C–ƒ@C–£C–·ØC–ÜPC–å C—)ØC—<ØC•âèC“ðèC”^ÀC”ùC”ŒèC“ïHC•ˆC•Ó°C’ ÀC•¸C•ÀC•œ¸C•v°C•Á`C•ë(C– C–@C–`C•çàC•Ý`C•èÈC–ÀC–W0C––XC–¬8C”y˜C–iÐC–¯èC— C•PC—hC–õ`C–Á˜C–áhC–çàC–ÚPC–Î C–¿ÀC–µ¨C–¨¸C–Ÿ€C–C–} C–epC–X¸C–H0C–9C–)°C– €C•þ˜C–C•÷°C•ñÀC•ñðC•ëC•ÕÀC•ØèC•ç˜C•ØXC•ËC•ÄC•¸¸C•·€C•ÆèC•ÜpC•êHC•ùÈC–ØC–ˆC–˜C–€C•ípC– C–‹C‘) C•ÎHC•Ú8C”ÿC”¸C•Ç`C•­ C•èC•Î(C•ÐØC•ôøC–C–.€C–\èC–|`C–£C–ÎðC—XC•ØÈC–(˜C•.˜C”˜ C”?8C’÷C”ÓC•6ÈC“AhC“ûC–¬C•éXCX@C’B¸C“"ðC”ØC•9øC•^C•“¨C•¼8C•Þ¨C•ÙðC•ÐpC•»˜C•ÑC–8C–/PC–TØC–e˜C–7C–j°C–¨xC–ÀÐC–ò°C–üàC”©@C–¨C–¯ C–¤èC–˜C–8C–‚pC–tC–j(C–cèC–VhC–?¸C–)àC–"hC–pC–ˆC•þhC•ühC•øàC•ø(C•ôC•òÐC•ïC•ðèC•è`C•ÞÈC•æ0C•êC•éÈC•çxC•æ8C•óxC– C–¨C– ÈC•öˆC•êàC•ëPC•û(C•òðC•ÕàC•Ö C•!°C“ßC”UxC—ÊC–.ˆC•†xC•¼XC•׈C•׸C•ƒpC•tXC•ލC•¥`C•Ï8C•øXC•þÀC–?°C–Ð C•RÈC”¸èC•*0C”=C“pˆC’‹C”I C–¸C– C•JHC•’ÈC–€pC•C‘7ØC‘‹C‘s€C‘8XC”º¸C”çØC”ÿ°C•8èC•ØC•ÈPC•â8C’ž C•˜C•ÃàC•íXC–ðC–(àC”΀C•B˜C–ƒXC–…ÈC–•ðC–˜C• ¸C–Z¸C–[ˆC–LC–?C–. C–øC•ó(C•ÜpC•ÇpC•¸XC•˜øC•~ C•qXC•hC•RhC•H C•J0C•PˆC•X€C•O8C•Q(C•TØC•WPC•Y`C•V8C•k(C•C•ލC•–PC•¨¸C•½ÈC•éC•ïHC•ÑøC•œ0C•{@C•‰ÐC•Ì(C–ˆC– PC“/èC•ÉC–C•¨ÈC–‰HC–`C•~HC• C•‰@C•^ C•;ðC•ÈC•pC•@C•#°C•L€C•S@C•˜€C–wHC“áC“óˆC”;èC•_ˆC”¿èC”ÖpC•®PC–n8C•ã0C””€C”qhC•~øC–ŽC‘ëàCªˆC˜C”(C”pC”`C”bÈC”©HC•)0C•¢xC– C‘ŽÀC•?HC•lXC•ˆC•¨ C•u˜C“øàC”˜C”ÈC–.XC–5øC–C”Ê0C–øC–  C– @C– C•üØC•ê¸C•ɘC•©C•}ÈC•RPC•#hC•HC”ðèC”Û8C”ȨC”¼ðC”¾8C”µðC”»ØC”ºPC”°°C”›¸C”˜HC”¢ C”žC”¹¨C”áÐC• €C•(0C•HC•kpC••XC•ºxC•´ÐC•cÐC• C”úPC•FxC– pC”K`C•œC”ÚøC”~ØC”5ÀC”ÙC•SèC•U(C•axC•0èC•XC•¸C”ê¸C”ÁC”¥˜C”¨C”¾C”ÓðC”ø¨C•çàC”Y¨C”ëÐC•RÈC•?ˆC”ù C”€C”c@C” ØC”hC“K¨C’ØàC”GxC•°C’àXC•iCŽw C¦@C”Œ@C“ð¸C“Ö¨C”)ØC”¶¸C•DÀC‘Â(C“:ÐC•'0C•ÈC•7ˆC•@C”¸ÐC’ž8C’ë¸C’ò`C•ž C•«ØC“´HC•“ÐC•§(C•C•”ˆC•™ C•£(C•¯8C• ØC•èC•N˜C•ðC”ÒèC”¤C”€(C”aPC”ZC”RC”9¨C”ðC”,`C”%ÐC”ˆC” C” `C”C”$xC”BøC”bØC”~C”˜C”žàC”¥XC”ÓhC•7PC•ލC•rC”ò˜C”–(C”8˜C‘ÃàC’åÀC•Œ¨C•‰ˆC•k¨C•h˜C•spC•mHC•F@C•(C”çXC”ŰC”°XC”¥XC”’C”sPC”S C”AèC”EPC”n˜C•¯C•ÈHC•3@C•KèC“C“YC’€HC’,€C’¼˜C“^`C’#¸C’‡¸C“¡C” HC“[C–$ÀCŽ4@CMxC0C“Ò¸C“whC“ØøC”lC•0C‘™ÀC‘å(C‘K8C• C•°C”Ë8CRCòðCæ8C”XC”ÛèC•¸C•`C”ÉPC”›ÐC”ƒèC”šèC”¾¸C”Ö€C”ôC•(C•/ÐC•'C•°C”ÇC”‰0C”RðC” @C“ô(C“Ó°C“µC“’ÈC“…C“mC“\ C“_C“OxC“GÈC“f(C““˜C“°C“¬ C“·PC“¨PC“—˜C“·ÀC”HèC•˜C•ohCãÀCzCà€C“VèC•7PC•J(C•XÀC•}ÐC•„@C•SC•=HC•C”éhC”ÀØC”0C”\C”OðC”KàC”5ðC”(C” hC” 8C“ïˆC”=ðC”RðC“´ðC“€øC’àC‘sC‘8`C‘6˜C‘`CMÀCÆøC‘`C’gÀC’PCŒ£CáhCŠ_˜C‰OxCŠJ¨CŠ.8C‰ß@Cˆ; CŒz(C‹cøC~ÉpC{Ü\C}o$C€VÐCw…øC€™HCƒ‘@C‡F0CˆHCˆšCˆÓˆC‰àCŒtC‹ÓCŒÿhC;pCðCŽøCŽšHCHC|¨C¾Cù C¸C5xCH`C?PC*CCõ¨CÓÀC¸(C¤ÈC¡C²ÈCÇCÄèCÆCÍCãCÏ`CܰCÒxC‡ÀC‹âØC‹ÃðCˆàPCˆÞ8C‰6øC‰dC‰ °C‰øC‰ŠxC‰_°CŽ ˆC6 CáPC‘HC‘ØC‘HC‘[ØC‘p0C‘‰C‘¥HC‘ÇpC‘â0C‘æC‘ÜpC‘Ï@C‘½xC‘±¸C‘ÃC‘´xC1øC‹rHC‹fÈCŠÃðC‹ØCxCØCøCxCHC€˜C¬hC‹#hCŒ4ØCŠŸHC‡ýHC‰¤°CŠ( C‰ÊCˆÀXC††€C†õÐC¿lCv[ìC{épC}[øCuË„Cv8HCG0CƒXC…öÀC‡hC‡E C‡{8CŠ@CŠ\¨C‰18CŠ™ˆC†}0C…`@CŒÐC+(C«PCŽ CŽøCŽÉ¸CŽë˜CŽÿ8C% C=ðC9XC*0CàCŽ÷hCŽßØCŽÉCŽÃ@CŽÜèC@C@CÈC3CB`CEPCLØCXpCŠñ CŠB8Cˆ§C† 0C‡“XCˆ<Cˆ C‡áøC‡ÞÐC‡¬C‡røC‡[8CŽ?8CË@C;CrC½Cç€CÒXC؈Cú€C‘ˆC‘EC‘_èC‘iˆC‘]8C‘U˜C‘:ÐC‘PCþ€C`CŒ¯CŽœxC1°C1ÀCXCC'ÐCK8CŽùØC‰ÿC‰ ðC‰S`C‰C‡Cˆ5¨Cš˜C‰WÐC‰–XC‰£¸C‰™àC‚h(C{xÔC†$°C‡hCƒ¶HC|† Cƒœ8C|Q CŽX°CŽoXCŽœCަ€CŽ¿0CެàCŽ­Cˆª¸C…Ð C„ÃÐC„nØCƒ§øC‡Ï˜C†ùÐC†H˜C†(ˆC†@@C†]XC‡/ÐCŒÄØCŽ¡C= CÊpCÐC=ÈCV€CSC^ˆClC|¨CÆÐCÞ CæCÑ0C XCFàCê@C‹ØC‹’@CˆçCŽc(CŽ*°C±øCŽ`CŽ)¸C†ôˆCŠZ€C‰‹˜Cˆ#C…J¸C„V€C†ìC‰J€CÁ8CˆqCˆ°Cˆ8Cˆ;CƒÑðC›€C€bpCƒÈC…RPC…3¨C‚»ÐCM˜C„ˆCƒèCƒ¸C‚?ØCƒ­`CT CvüC}ÛpC…pC‡E¸CˆY€Cƒ5ˆC‡NHCŠ$XCŠÔˆCŠë8CŠïC‹;xC‹ÊPCŒ%CŒ^`CŒ“ CŒª¨CŒÐCŒ‘CŒ¡ðCŒ¾8CŒßxC*ÈCo`C¦(CÂðCüÀCŽ CŽ5ðCŽ7ÐC‹hðC†ãC„x˜C„CƒICƒOØC†oØC„°ÐC„[€C„=ØC„æàC…P`C„è¸C…ápC‹}ÐCŒ¯ˆC®hCŽNˆCާØCŽæHCŽÿàCk€CmCŽXCCSøCf˜C/pChC¬hC^˜CŠ·0CŠ<°C‰wC°ÐC èC†‘hCŒ§ÐC‚òxC‡ÈC…ÛCŒIÀCŒà¸Cg€CˆíÈC„¹¸CŒ£ CˆI°C†è8C†w C†¢HC‡ƒèC…1¸C‚í¸C€µ˜C‚¸pC|õtC‚€hC‚õÀC€ÒèC‚ÐC€ø8C C€øC|J¬C§ŒCwE,C{jLCpÞ\C„É`C†ýøC‚¾0C†ÖC‡L(C‰%¸C‰f C‰­xCŠ8øCŠÁCŠ»¸CŠÌàC‹ €C‹<àC‹QC‹…hC‹«0C‹×ÀCŒ°CŒA¸CŒ‘ CŒÖC€C< C€CŽˆC³èCŠ+8C†ØC„î Cƒ7ÐC‚‘xC‚ÐÈCƒ0˜Cƒ[ÈCƒ}pCƒT`C„^`C„ŽøC„SÈC…xC„ö CŠtøC‹˜CŒa8CŒ›XCŒuèCŒ¿ÈCœØCÌhCŽ(¸C°C¦CÆCkèCd CDHC!èC‰y CŠ@C‰A¨C‡„˜C…°C†C…o˜C…øC…Cƒ¤àCа0C‹©¸CŒgˆCˆ—CˆâC‹ ðC†¤èC…‡`C„áC„" C…A€C„| C…dCƒàC€ÜÐC‚$€C}ÆÐC|¯`Cw®hCSXCL CŒOØCŒ%øC…r(C„­xC‚}hCËPC8CÿÀCwÔC C€¤C€Ü CXC€ŒC‚àCBØC‚\àC‚¸C‚PðC„i˜C…ÃC‰pC‰º0CŠqxC‹:C‹Í@CŒW CŒë Cm¨CxÈCšØCŽG Cõ˜CŒØ¨CŒTøCˆr¸CŠúHC…* C„°C„ pC‚ÛˆC‚D¸Cû C øC€CqDC~¢(C~Ó¼C~ú¤C~0C€ðC~ƒC~˜CèCøøC€ C€€C€€C€ÄhC€S˜C~Ú`C|UðC}Á C{ÈôCx\œCuC$Crw@CpßDCp™Cow°Co©Cu[ŒCt'C„«xC…VC†)C†¦èC‡†xCˆ8CˆèCˆ‘0C‰U(C‰ëØCŠ@`CŠ’hCŠ•¸C…2C…,ˆCƒCƒ ¨C‚pC‚•°C¢8C€IxC}ôèC{œìCy0CxrøC{ULCyýìC}ÛèCƒyÈCuݘC|¨4C~w”C³CIPC%€C€ðC€C¸C~VÌC~@dC€<ðC€G€C~ÎDC{ C|4$C{€¨CyH¨CvÓ¼CuqÜCsó´Crç°CxôCx·ôCnÆCoÈPCp7€CpžØCp›ˆCpšœCp•,CqÜCr-°CsmxClÑÀCo9ÀCpÂäCqÙ|CyHC~ ôCp œCo€ìCo¡Cl|Ch¤CeÊ8Ce:°Cd²CcÞpCe×PCjn,CnX¤CpúLCzLCwŸÄCw×|Cy‡xC~æ¸C…\HC…x`C„ÏðC„ïxC„•ÈC„KC„OCƒ@PCzÍlCqbôCp> x print ' >',x,':', y[1].datum(-1) y = gl >= x print ' >=',x,':', y[1].datum(-1) y = gl < x print ' <',x,':', y[1].datum(-1) y = gl <= x print ' <=',x,':', y[1].datum(-1) y = gl == x print ' ==',x,':', y[1].datum(-1) y = gl != int(x) print ' !=',int(x),':', y[1].datum(-1) y = abs(gl) print 'abs',' :', y[1].datum(-1) y = -gl print ' -',' :', y[1].datum(-1) y = +gl print ' +',' :', y[1].datum(-1) #y = ~gl #print ' ~',' :', y[1].datum(-1) gl.dtype = int y = gl & x print ' &',int(x),':', y[1].datum(-1) y = gl | x print ' |',int(x),':', y[1].datum(-1) y = gl ^ x print ' ^',int(x),':', y[1].datum(-1) y = gl << x print ' <<',int(x),':', y[1].datum(-1) y = gl >> x print ' >>',int(x),':', y[1].datum(-1) y = x & gl print int(x),' &',':', y[1].datum(-1) y = x | gl print int(x),' |',':', y[1].datum(-1) y = x ^ gl print int(x),' ^',':', y[1].datum(-1) y = x << gl print int(x),' <<',':', y[1].datum(-1) y = x >> gl print int(x),' >>',':', y[1].datum(-1) y = gl.copy() y &= x print ' &=',int(x),':', y[1].datum(-1) y = gl.copy() y |= x print ' |=',int(x),':', y[1].datum(-1) y = gl.copy() y ^= x print ' ^=',int(x),':', y[1].datum(-1) #sys.exit(0) print '\n--------------------------------------------------------------------' print "TEST: tranpose, flip, expand_dims, squeeze and remove_axes:" h = g.copy() h.transpose((1, 0), i=True) h.transpose((1, 0), i=True) h.transpose(('grid_longitude', 'grid_latitude'), i=True) h.transpose(('grid_latitude', 'grid_longitude'), i=True) assert(cf.equals(g, h, traceback=True)) print "Tranpose of field passed" h.flip((1, 0), i=True) h.flip((1, 0), i=True) h.flip(0, i=True) h.flip(1, i=True) h.flip([0, 1], i=True) assert(cf.equals(g, h, traceback=True)) print "Flipping field axes passed" #axisA = h.expand_dims() #axisB = h.expand_dims() #h.remove_axes([axisA, axisB]) #assert(cf.equals(g, h, traceback=True)) #print "Field expand_dims, squeeze and remove_axes passed" print '\n--------------------------------------------------------------------' print "TEST: Access the field's data as a numpy array:" print g.array print '\n--------------------------------------------------------------------' print "TEST: Access the field's coordinates' data arrays:" print 'grid_latitude :', g.item('lat').array print 'grid_longitude:', g.item('lon').array print '\n--------------------------------------------------------------------' print 'TEST: Subspace the field (1):' print g.subspace[..., 2:5].array print '\n--------------------------------------------------------------------' print 'TEST: Subspace the field (2):' print g.subspace[9::-4, ...].array print '\n--------------------------------------------------------------------' print 'TEST: Subspace the field (3):' h = g.subspace[(slice(None, None, -1),) * g.ndim] print '\n\n\n\@AND BACK\n\n\n\n' h.dump(complete=1) h = h.subspace[(slice(None, None, -1),) * h.ndim] print g print h g.dump(complete=1) assert(g.equals(h, traceback=True)) print '\n--------------------------------------------------------------------' print 'TEST: Indices for a subspace defined by coordinates:' print f.indices() print f.indices(grid_lat=cf.lt(5), grid_lon=27) print f.indices('exact', grid_latitude=cf.lt(5), grid_longitude=27, atmosphere_hybrid_height_coordinate=1.5) print '\n--------------------------------------------------------------------' print 'TEST: Subspace the field:' print g.subspace(grid_latitude=cf.lt(5), grid_longitude=27, atmosphere_hybrid_height_coordinate=1.5) print '\n--------------------------------------------------------------------' print 'TEST: Create list of fields:' fl = cf.FieldList([g, g, g, g]) print '\n--------------------------------------------------------------------' print 'TEST: Write a list of fields to disk:' cf.write((f, fl), tmpfile) cf.write(fl, tmpfile) print '\n--------------------------------------------------------------------' print 'TEST: Read a list of fields from disk:' fl = cf.read(tmpfile, squeeze=True) try: fl.delattr('history') except AttributeError: pass print repr(fl) print '\n--------------------------------------------------------------------' print 'TEST: Print all fields in the list:' print fl print '\n--------------------------------------------------------------------' print 'TEST: Print the last field in the list:' print fl[-1] print '\n--------------------------------------------------------------------' print 'TEST: Print the data of the last field in the list:' print fl[-1].array print '\n--------------------------------------------------------------------' print 'TEST: Modify the last field in the list:' fl[-1] *= -1 print fl[-1].array print '\n--------------------------------------------------------------------' print 'TEST: Changing units\n:' fl[-1].units = 'mm.s-1' print fl[-1].array print '\n--------------------------------------------------------------------' print 'TEST: Combine fields not in place:' g = fl[-1] - fl[-1] print g.array print '\n--------------------------------------------------------------------' print 'TEST: Combine field with a size 1 Data object:' g += cf.Data([[[[[1.5]]]]], 'cm.s-1') print g.array g.dump() print '\n--------------------------------------------------------------------' print "TEST: Setting data array elements to a scalar with subspace[]:" g.subspace[...] = 0 print g g.subspace[3:7, 2:5] = -1 print g.array,'\n' g.subspace[6:2:-1, 4:1:-1] = numpy.array(-1) print g.array,'\n' g.subspace[[0, 3, 8], [1, 7, 8]] = numpy.array([[[[-2]]]]) print g.array,'\n' g.subspace[[8, 3, 0], [8, 7, 1]] = cf.Data(-3, None) print g.array,'\n' g.subspace[[7, 4, 1], slice(6, 8)] = [-4] print g.array print '\n--------------------------------------------------------------------' print "TEST: Setting of (un)masked elements with setdata():" g.subspace[::2, 1::2] = numpy.ma.masked print g.array,'\n' g.Data.to_memory(1) print g.Data.partitions[0][1].subarray g.setdata(99, None) print g.array,'\n' g.Data.to_memory(1) print g.Data.partitions[0][1].subarray g.setdata(2, None, g.mask) # Softern? print g.array,'\n' g.Data.to_memory(1) print g.Data.partitions[0][1].subarray print '\n--------------' g.subspace[slice(None, None, 2), slice(1, None, 2)] = cf.masked print g.array,'\n' g.Data.to_memory(1) print g.Data.partitions[0][1].subarray g.setdata([[-1]], None, g.mask) print g.array,'\n' g.Data.to_memory(1) print g.Data.partitions[0][1].subarray g.setdata(cf.Data(0, None), None) print g.array,'\n' g.Data.to_memory(1) print g.Data.partitions[0][1].subarray h = g.subspace[:3, :4] h.setdata(-1, None) h.subspace[0, 2] = 2 h.dump() print h.array h.transpose([1, 0], i=True) print h.array h.flip([1, 0], i=True) print h.array, h.shape print h print g.subspace[slice(None, 3), slice(None, 4)], g.subspace[slice(None, 3), slice(None, 4)].shape print 'AA', g.shape, g.subspace[slice(None, 3), slice(None, 4)].shape g.subspace[slice(None, 3), slice(None, 4)] = h h = g.subspace[:3, :4] h.subspace[...] = -1 h.subspace[0, 2] = 2 g.subspace[slice(None, 3), slice(None, 4)] = h print g.array print '\n--------------------------------------------------------------------' print "TEST: Make sure all partitions' data are in temporary files:" g.Data.to_disk() print g.Data.partitions #sys.exit(0) print '\n--------------------------------------------------------------------' print "TEST: Push partitions' data from temporary files into memory:" g.Data.to_memory(regardless=True) print g.Data.partitions print '\n--------------------------------------------------------------------' print g.Data.partitions print "TEST: Push partitions' data from memory to temporary files:" g.Data.to_disk() print g.Data.partitions print '\n--------------------------------------------------------------------' print "TEST: Iterate through array values:" for x in f.Data.flat(): print x, print print '\n--------------------------------------------------------------------' print 'TEST: Reset chunk size:' cf.CHUNKSIZE(original_chunksize) print 'CHUNKSIZE reset to',cf.CHUNKSIZE() print '\n--------------------------------------------------------------------' print 'TEST: Move Data partitions to disk:' f.Data.to_disk() print f.Data.dumpd() print '\n--------------------------------------------------------------------' print 'TEST: Create a CFA file ('+tmpfile2+'):' cf.write(f, tmpfile2, fmt='CFA4') cf.write(f, tmpfile2, fmt='CFA3') print 'OK' print '\n--------------------------------------------------------------------' print 'TEST: Read the CFA file ('+tmpfile2+'):' n = cf.read(tmpfile2, squeeze=True)[0] print repr(n) if not cf.equals(f, n, traceback=True): raise RuntimeError("Field is not equal to itself read back in from CFA file") print 'OK' cf.CHUNKSIZE(original_chunksize) print f f.transpose(i=True) f.flip(i=True) print f.Data.dumpd() cf.write(f, 'delme.nc') print f f = cf.read('delme.nc')[0] print f print '########################################' print f.Data.dumpd() cf.write(f, 'delme.nca', fmt='CFA4') g = cf.read('delme.nca')[0] print g f.aux('aux0').id = 'atmosphere_hybrid_height_coordinate_ak' f.aux('aux1').id = 'atmosphere_hybrid_height_coordinate_bk' b = f.subspace[:,0:6,:] c = f.subspace[:,6:,:] print '-----------------------' print f print b print c d = cf.aggregate([b, c], info=1)[0] print d print '\n--------------------------------------------------------------------' print "TEST: Remove temporary files:" cf.data.partition._remove_temporary_files() cf.CHUNKSIZE(original_chunksize) f.dump(complete=1) cf-python-1.3.2/test/test_Field.py0000644000175000017500000004366212770450215017255 0ustar daviddavid00000000000000import os import numpy import cf import unittest import inspect import datetime class FieldTest(unittest.TestCase): def setUp(self): self.filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test_file.nc') self.filename2 = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test_file2.nc') self.chunk_sizes = (17, 34, 300, 100000)[::-1] self.original_chunksize = cf.CHUNKSIZE() self.f = cf.read(self.filename)[0] self.test_only = () # self.test_only = ('test_Field_transpose','test_Field_squeeze',) # self.test_only = ('test_Field_collapse',) # self.test_only = ('test_Field_match','test_Field_items',) # self.test_only = ('test_Field_items',) # self.test_only = ('test_Field_axes','test_Field_data_axes',) # self.test_only = ('test_Field_where',) # self.test_only = ('test_Field_anchor',) # self.test_only = ('test_Field_period',) # self.test_only = ('test_FieldList_argless_methods',) def test_Field_anchor(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return dimarray = self.f.dim('grid_lon').array for chunksize in self.chunk_sizes: f = cf.read(self.filename)[0] for period in (dimarray.min()-5, dimarray.min()): anchors = numpy.arange(dimarray.min()-3*period, dimarray.max()+3*period, 0.5) f.cyclic('grid_lon', period=period) # Increasing dimension coordinate for anchor in anchors: g = f.anchor('grid_lon', anchor) x0 = g.coord('grid_lon').datum(-1) - period x1 = g.coord('grid_lon').datum(0) self.assertTrue( x0 < anchor <= x1, 'INCREASING period=%s, x0=%s, anchor=%s, x1=%s' % \ (period, x0, anchor, x1)) #--- End: for # Decreasing dimension coordinate flipped_f = f.flip('grid_lon') for anchor in anchors: g = flipped_f.anchor('grid_lon', anchor) x1 = g.coord('grid_lon').datum(-1) + period x0 = g.coord('grid_lon').datum(0) self.assertTrue( x1 > anchor >= x0, 'DECREASING period=%s, x0=%s, anchor=%s, x1=%s' % \ (period, x1, anchor, x0)) #--- End: for #--- End: for #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Field_axes(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return f = self.f self.assertTrue(f.axes() == set(['dim0', 'dim1', 'dim2'])) for i in range(f.ndim): self.assertTrue(f.axes(i) == set([f.data_axes()[i]])) self.assertTrue(f.axes(slice(0,3)) == set(f.data_axes())) #--- End: def def test_Field_data_axes(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return self.assertTrue(self.f.copy().data_axes() == ['dim0', 'dim1', 'dim2']) f = cf.Field(data=cf.Data(9)) self.assertTrue(f.data_axes() == []) del f.Data self.assertTrue(f.data_axes() == None) #--- End: def def test_Field_equals(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) f = cf.read(self.filename)[0] g = f.copy() self.assertTrue(f.equals(g, traceback=True)) self.assertFalse(f.equals(g+1, traceback=False)) #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def # def test_Field_indices(self): # if self.test_only and inspect.stack()[0][3] not in self.test_only: # return # # for chunksize in self.chunk_sizes: # f = cf.read(self.filename)[0] # # # # cf.CHUNKSIZE(self.original_chunksize) # #--- End: def def test_Field_items(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return f = cf.read(self.filename)[0] self.assertTrue(set(f.items()) == set(['aux0','aux1','aux2','aux3','aux4','dim0','dim1','dim2','msr0','ref0','ref1'])) self.assertTrue(set(f.items(inverse=True)) == set([])) self.assertTrue(set(f.items(ndim=1)) == set(['aux0','aux1','aux4', 'dim0','dim1','dim2'])) self.assertTrue(set(f.items(ndim=1, inverse=True)) == set(['aux2','aux3','msr0','ref0','ref1'])) self.assertTrue(set(f.items(ndim=2)) == set(['aux2','aux3','msr0'])) self.assertTrue(set(f.items(ndim=2, inverse=True)) == set(['aux0','aux1','aux4','dim0','dim1','dim2', 'ref0', 'ref1'])) self.assertTrue(set(f.items(ndim=cf.ge(3))) == set([])) self.assertTrue(set(f.items(ndim=cf.ge(3), inverse=True)) == set(['aux0','aux1','aux2','aux3','aux4','dim0','dim1','dim2','msr0','ref0','ref1'])) self.assertTrue(set(f.items(role='d')) == set(['dim0','dim1','dim2'])) self.assertTrue(set(f.items(role='da')) == set(['aux0','aux1','aux2','aux3','aux4','dim0','dim1','dim2'])) self.assertTrue(set(f.items(role='dam')) == set(['aux0','aux1','aux2','aux3','aux4','dim0','dim1','dim2','msr0'])) self.assertTrue(set(f.items(role='damr')) == set(['aux0','aux1','aux2','aux3','aux4','dim0','dim1','dim2','msr0','ref0','ref1'])) self.assertTrue(set(f.items(axes='Y')) == set(['aux2','aux3','aux4','dim1','msr0'])) self.assertTrue(set(f.items(axes='Y', inverse=True)) == set(['aux0','aux1','dim0','dim2','ref0','ref1'])) self.assertTrue(set(f.items('X')) == set(['dim2'])) self.assertTrue(set(f.items(['X', 'Y', {'standard_name': 'longitude', 'units': 'radians'}])) == set(['aux3','dim1','dim2'])) self.assertTrue(set(f.items(['X', 'Y', {'standard_name': 'longitude', 'units': 'K'}])) == set(['dim1','dim2'])) self.assertTrue(set(f.items(axes='X', ndim=2)) == set(['aux2','aux3','msr0'])) self.assertTrue(set(f.items(axes='X', ndim=2, match_and=False)) == set(['aux2','aux3','dim2','msr0'])) self.assertTrue(set(f.items('longitude', axes='X', ndim=2)) == set(['aux3'])) self.assertTrue(set(f.items('grid_longitude', axes='X', ndim=2)) == set([])) self.assertTrue(set(f.items('grid_longitude', axes='X', ndim=2, match_and=False)) == set(['aux2','aux3','dim2','msr0'])) self.assertTrue(set(f.items('atmosphere_hybrid_height_coordinate')) == set(['dim0','ref0'])) self.assertTrue(set(f.items(axes='X')) == set(['dim2','aux2','aux3','msr0'])) self.assertTrue(set(f.items(axes='Y')) == set(['dim1','aux2','aux3','aux4','msr0'])) self.assertTrue(set(f.items(axes='Z')) == set(['dim0','aux0','aux1'])) self.assertTrue(set(f.items(axes=['X','Y'])) == set(['dim1','dim2','aux2','aux3','aux4','msr0'])) self.assertTrue(set(f.items(axes=['X','Z'])) == set(['dim0','dim2','aux0','aux1','aux2','aux3','msr0'])) self.assertTrue(set(f.items(axes=['Z','Y'])) == set(['dim0','dim1','aux0','aux1','aux2','aux3','aux4','msr0'])) self.assertTrue(set(f.items(axes_all='X')) == set(['dim2'])) self.assertTrue(set(f.items(axes_all='Y')) == set(['dim1','aux4'])) self.assertTrue(set(f.items(axes_all='Z')) == set(['dim0','aux0','aux1'])) self.assertTrue(set(f.items(axes_all=['X','Y'])) == set(['aux2','aux3','msr0'])) self.assertTrue(set(f.items(axes_all=['X','Z'])) == set([])) self.assertTrue(set(f.items(axes_all=['Z','Y'])) == set([])) self.assertTrue(set(f.items(axes_subset='X')) == set(['dim2','aux2','aux3','msr0'])) self.assertTrue(set(f.items(axes_subset='Y')) == set(['dim1','aux2','aux3','aux4','msr0'])) self.assertTrue(set(f.items(axes_subset='Z')) == set(['dim0','aux0','aux1'])) self.assertTrue(set(f.items(axes_subset=['X','Y'])) == set(['aux2','aux3','msr0'])) self.assertTrue(set(f.items(axes_subset=['X','Z'])) == set([])) self.assertTrue(set(f.items(axes_subset=['Z','Y'])) == set([])) self.assertTrue(set(f.items(axes_superset='X')) == set(['dim2'])) self.assertTrue(set(f.items(axes_superset='Y')) == set(['dim1','aux4'])) self.assertTrue(set(f.items(axes_superset='Z')) == set(['dim0','aux0','aux1'])) self.assertTrue(set(f.items(axes_superset=['X','Y'])) == set(['dim1','dim2','aux2','aux3','aux4','msr0'])) self.assertTrue(set(f.items(axes_superset=['X','Z'])) == set(['dim0','dim2','aux0','aux1'])) self.assertTrue(set(f.items(axes_superset=['Z','Y'])) == set(['dim0','dim1','aux0','aux1','aux4'])) #--- End: def def test_Field_match(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return f = cf.read(self.filename)[0] f.long_name = 'qwerty' f.ncvar = 'tas' all_kwargs = ( {'inverse': False}, {'inverse': False, 'select': None}, {'inverse': False, 'select': {}}, {'inverse': False, 'select': []}, {'inverse': False, 'select': [None]}, {'inverse': False, 'select': [{}]}, {'inverse': False, 'select': [None, {}]}, {'inverse': False, 'select': 'eastward_wind'}, {'inverse': False, 'select': 'eastward_wind', 'exact': True}, {'inverse': False, 'select': 'eastward_'}, {'inverse': False, 'select': 'e.*_wind$'}, {'inverse': False, 'select': 'standard_name:eastward_wind'}, {'inverse': False, 'select': 'standard_name:eastward_wind', 'exact': True}, {'inverse': False, 'select': 'standard_name:eastward_'}, {'inverse': False, 'select': {'standard_name': 'eastward_wind'}}, {'inverse': False, 'select': {'standard_name': 'eastward_'}}, {'inverse': False, 'select': cf.eq('.*_wind', exact=False)}, {'inverse': False, 'select': 'long_name:qwerty'}, {'inverse': False, 'select': 'long_name:qwerty', 'exact': True}, {'inverse': False, 'select': 'long_name:qwe'}, {'inverse': False, 'select': {'long_name': 'qwerty'}}, {'inverse': False, 'select': {'long_name': 'qwe'}}, {'inverse': False, 'select': {'long_name': cf.eq('qwerty')}}, {'inverse': False, 'select': {'long_name': cf.eq('qwe', exact=False)}}, {'inverse': False, 'select': 'ncvar%tas'}, {'inverse': False, 'select': 'ncvar%tas', 'exact': True}, {'inverse': False, 'select': 'ncvar%ta'}, {'inverse': False, 'select': {None: 'ncvar%.*as$'}}, {'inverse': False, 'select': {None: 'ncvar%tas$'}}, {'inverse': False, 'select': {None: 'ncvar%tas'}}, {'inverse': False, 'select': {None: 'ncvar%ta'}}, # {'inverse': False, 'select': 'eastward_wind', 'ndim': cf.wi(1, 3)}, {'inverse': False, 'select': 'BBB', 'ndim': cf.wi(1, 3), 'match_and': False}, {'inverse': False, 'select': ['BBB', 'east'], 'ndim': cf.wi(1, 3), 'match_and': True}, {'inverse': False, 'ndim': cf.wi(1, 3)}, ) for kwargs in all_kwargs: self.assertTrue(f.match(**kwargs), 'f.match(**%s) failed' % kwargs) kwargs['inverse'] = not kwargs['inverse'] self.assertFalse(f.match(**kwargs), 'f.match(**%s) failed' % kwargs) #--- End: for #--- End: def def test_Field_period(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return f = cf.read(self.filename) f.dim('X').period(None) f.cyclic('X', False) self.assertTrue(f.period('X') is None) f.cyclic('X', period=360) self.assertTrue(f.period('X') == cf.Data(360, 'degrees')) f.cyclic('X', False) self.assertTrue(f.period('X') == cf.Data(360, 'degrees')) f[0].dim('X').period(None) self.assertTrue(f.period('X') is None) #--- End: def def test_Field_squeeze(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return f0 = cf.read(self.filename) for f in (f0, cf.FieldList(f0)): f.squeeze(i=True) g = f.copy() h = f.copy() i = h.squeeze(i=True) self.assertTrue(f.equals(g)) self.assertTrue(h is i) #--- End: for #--- End: def def test_Field_transpose(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return f = cf.read(self.filename)[0] self.assertTrue(f is f.transpose([0, 1, 2], i=True)) self.assertTrue(f.equals(f.transpose([0, 1, 2]))) for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) f = cf.read(self.filename)[0] h = f.transpose((1, 2, 0)) h.transpose((2, 0, 1), i=True) h.transpose(('grid_longitude', 'atmos', 'grid_latitude'), i=True) h.varray h.transpose(('atmos', 'grid_latitude', 'grid_longitude'), i=True) self.assertTrue(cf.equals(f, h, traceback=True)) # print 'pmshape =', f.Data._pmshape #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Field_collapse(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: f = cf.read(self.filename2)[0] g = f.collapse('mean') self.assertTrue(g.cell_methods.equals(cf.CellMethods('time: maximum time: latitude: longitude: mean'), traceback=True)) g = f.collapse('mean', axes=['T', 'X']) self.assertTrue(g.cell_methods.equals(cf.CellMethods('time: maximum time: longitude: mean'), traceback=True)) g = f.collapse('mean', axes=[0, 2]) self.assertTrue(g.cell_methods.equals(cf.CellMethods('time: maximum time: longitude: mean'), traceback=True)) g = f.collapse('T: mean within years time: minimum over years', within_years=cf.M(), weights=None) self.assertTrue(g.cell_methods.equals(cf.CellMethods('time: maximum time: mean within years time: minimum over years'), traceback=True)) for m in range(1, 13): a = numpy.empty((5, 4, 5)) for i, year in enumerate(f.subspace(T=cf.month(m)).coord('T').year.unique()): q = cf.month(m) & cf.year(year) x = f.subspace(T=q) x.data.mean(axes=0, i=True) a[i] = x.array #--- End: for a = a.min(axis=0) self.assertTrue(numpy.allclose(a, g.array[m % 12])) #--- End: for g = f.collapse('T: mean', group=360) for group in (cf.M(12), cf.M(12, month=12), cf.M(12, day=16), cf.M(12, year=1999, month=11, day=27)): g = f.collapse('T: mean', group=group) bound = g.coord('T').bounds.dtarray[0, 1] self.assertTrue(bound.month == group.month, "group=%s" % group) self.assertTrue(bound.day == group.day , "group=%s" % group) #--- End: for for group in (cf.D(30), cf.D(30, month=12), cf.D(30, day=16), cf.D(30, year=1999, month=11, day=27)): g = f.collapse('T: mean', group=group) bound = g.coord('T').bounds.dtarray[0, 1] self.assertTrue(bound.day == group.day, "group=%s" % group) #--- End: for #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Field_where(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return f = cf.read(self.filename)[0] a = f.array for chunksize in self.chunk_sizes: f = cf.read(self.filename)[0] for condition in (True, 1, [[[True]]], [[[[[456]]]]]): g = f.where(condition, -9) self.assertTrue(g[0].min() == -9) self.assertTrue(g[0].max() == -9) g = f.where(cf.le(34), 34) self.assertTrue(g[0].min() == 34) self.assertTrue(g[0].max() == 89) g = f.where(cf.le(34), cf.masked) self.assertTrue(g[0].min() == 35) self.assertTrue(g[0].max() == 89) g = f.where(cf.le(34), cf.masked, 45) self.assertTrue(g[0].min() == 45) self.assertTrue(g[0].max() == 45) #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Field_mask_invalid(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return f = cf.read(self.filename)[0] g = f.mask_invalid() g = cf.FieldList(f).mask_invalid() g = f.mask_invalid(i=True) g = cf.FieldList(f).mask_invalid(i=True) #--- End: def #--- End: class if __name__ == '__main__': # print 'cf-python version:' , cf.__version__ # print 'cf-python path:' , os.path.abspath(cf.__file__) print 'Run date:', datetime.datetime.now() cf.ENVIRONMENT() print'' unittest.main(verbosity=2) cf-python-1.3.2/test/file1.nc0000644000175000017500000021344412752572327016151 0ustar daviddavid00000000000000CDF timebounds2lat@lon€  ConventionsCF-1.5  time_bndstime  long_nametime standard_nametimeunitsdays since 0000-1-1calendarnoleapbounds time_bndsaxisTlat_bndslat units degrees_north long_namelatitude standard_namelatitudeboundslat_bndsaxisY lon_bnds lon units degrees_east long_name longitude standard_name longitudeboundslon_bndsaxisXheight unitsmpositiveup standard_nameheight long_nameheightaxisZtas  _FillValueD¯€ standard_nameair_temperature cell_methods time: mean (interval: 1.0 month)unitsK missing_value`­xì coordinatesheight$APA@AÈÀV€ÀUž»ÀUž»ÀTí ÀTí ÀT:Õ ÀT:Õ ÀSˆf€ÀSˆf€ÀRÕæÀÀRÕæÀÀR#^`ÀR#^`ÀQpÑÀQpÑÀP¾@€ÀP¾@€ÀP ­ÀÀP ­ÀÀN²3@ÀN²3@ÀMM ÀMM ÀKçÜ€ÀKçÜ€ÀJ‚¯ÀJ‚¯ÀI€€ÀI€€ÀG¸Q`ÀG¸Q`ÀFS!€ÀFS!€ÀDíñ@ÀDíñ@ÀCˆÀ@ÀCˆÀ@ÀB# ÀB# À@¾]ÀÀ@¾]ÀÀ>²WÀÀ>²WÀÀ;çóÀÀ;çóÀÀ9€À9€À6S+À6S+À3ˆÆ À3ˆÆ À0¾aÀ0¾aÀ+ç÷€À+ç÷€À&S,ÀÀ&S,ÀÀ ¾aÀÀ ¾aÀÀS-@ÀS-@ÀS-`ÀS-`@S-`@S-`@S-@@S-@@ ¾aÀ@ ¾aÀ@&S,À@&S,À@+ç÷€@+ç÷€@0¾a@0¾a@3ˆÆ @3ˆÆ @6S+@6S+@9€@9€@;çóÀ@;çóÀ@>²WÀ@>²WÀ@@¾]À@@¾]À@B# @B# @CˆÀ@@CˆÀ@@Díñ@@Díñ@@FS!€@FS!€@G¸Q`@G¸Q`@I€€@I€€@J‚¯@J‚¯@KçÜ€@KçÜ€@MM @MM @N²3@@N²3@@P ­À@P ­À@P¾@€@P¾@€@QpÑ@QpÑ@R#^`@R#^`@RÕæÀ@RÕæÀ@Sˆf€@Sˆf€@T:Õ @T:Õ @Tí @Tí @Už»@Už»@V€ÀU÷H€ÀUF-€ÀT”ÀÀSᣀÀS/)`ÀR|¤ ÀQÊ ÀQ‰`ÀPd÷€ÀOdÈÀMÿž`ÀLšràÀK5FÀIÐÀHjé ÀG¹ ÀE ‰€ÀD;XàÀBÖ'ÀÀApö€À@ ÄàÀ=M%àÀ:‚ÁÀÀ7¸]`À4íø À2#“ À.²\àÀ)’@À#ˆÇ@Àçø`À¾b¿öS-`?öS-`@¾b@çø`@#ˆÇ@@)’@@.²\à@2#“ @4íø @7¸]`@:‚ÁÀ@=M%à@@ Äà@Apö€@BÖ'À@D;Xà@E ‰€@G¹ @Hjé @IÐ@K5F@Lšrà@Mÿž`@OdÈ@Pd÷€@Q‰`@QÊ @R|¤ @S/)`@Sᣀ@T”À@UF-€@U÷H€¿ö€?ö€?ö€@à@à@ @ @#°@#°@)P@)P@.ð@.ð@2H@2H@5@5@7è@7è@:¸@:¸@=ˆ@=ˆ@@,@@,@A”@A”@Bü@Bü@Dd@Dd@EÌ@EÌ@G4@G4@Hœ@Hœ@J@J@Kl@Kl@LÔ@LÔ@N<@N<@O¤@O¤@P†@P†@Q:@Q:@Qî@Qî@R¢@R¢@SV@SV@T @T @T¾@T¾@Ur@Ur@V&@V&@VÚ@VÚ@WŽ@WŽ@XB@XB@Xö@Xö@Yª@Yª@Z^@Z^@[@[@[Æ@[Æ@\z@\z@].@].@]â@]â@^–@^–@_J@_J@_þ@_þ@`Y@`Y@`³@`³@a @a @ag@ag@aÁ@aÁ@b@b@bu@bu@bÏ@bÏ@c)@c)@cƒ@cƒ@cÝ@cÝ@d7@d7@d‘@d‘@dë@dë@eE@eE@eŸ@eŸ@eù@eù@fS@fS@f­@f­@g@g@ga@ga@g»@g»@h@h@ho@ho@hÉ@hÉ@i#@i#@i}@i}@i×@i×@j1@j1@j‹@j‹@jå@jå@k?@k?@k™@k™@kó@kó@lM@lM@l§@l§@m@m@m[@m[@mµ@mµ@n@n@ni@ni@nÃ@nÃ@o@o@ow@ow@oÑ@oÑ@p€@p€@pB€@pB€@po€@po€@pœ€@pœ€@pÉ€@pÉ€@pö€@pö€@q#€@q#€@qP€@qP€@q}€@q}€@qª€@qª€@q×€@q×€@r€@r€@r1€@r1€@r^€@r^€@r‹€@r‹€@r¸€@r¸€@rå€@rå€@s€@s€@s?€@s?€@sl€@sl€@s™€@s™€@sÆ€@sÆ€@só€@só€@t €@t €@tM€@tM€@tz€@tz€@t§€@t§€@tÔ€@tÔ€@u€@u€@u.€@u.€@u[€@u[€@uˆ€@uˆ€@uµ€@uµ€@uâ€@uâ€@v€@v€@v<€@v<€@vi€@€@€@ à@&€@, @0à@3°@6€@9P@< @>ð@@à@BH@C°@E@F€@Gè@IP@J¸@L @Mˆ@Nð@P,@Pà@Q”@RH@Rü@S°@Td@U@UÌ@V€@W4@Wè@Xœ@YP@Z@Z¸@[l@\ @\Ô@]ˆ@^<@^ð@_¤@`,@`†@`à@a:@a”@aî@bH@b¢@bü@cV@c°@d @dd@d¾@e@er@eÌ@f&@f€@fÚ@g4@gŽ@gè@hB@hœ@hö@iP@iª@j@j^@j¸@k@kl@kÆ@l @lz@lÔ@m.@mˆ@mâ@n<@n–@nð@oJ@o¤@oþ@p,@pY@p†@p³@pà@q @q:@qg@q”@qÁ@qî@r@rH@ru@r¢@rÏ@rü@s)@sV@sƒ@s°@sÝ@t @t7@td@t‘@t¾@të@u@uE@ur@uŸ@uÌ@uù@v&@vS@@mh€@mˆÿ@mI`@my…@mq&`@mi  @m`Oà@mXÀ@mPT`@mH  @m@€@m87€@m1Ü€@m*¡€@m$‚À@mô @m! @mb@m³@@m é`@m Å@@m?`@mR@mP @lÿ5 @lýÙÀ@lý#@@lüÃ@@lýU @lþ$@@m@@mÀ@m€@@m ` @mA@mƒà@m @m!@m'” @m.^ @m5Ÿ@@m= @@mE9@@mM´ @mW€@m_ú @mi @mr‘@@m|B @m‡1@mè€@mšz€@m¡' @m«{€@mµ0à@m¿E€@mÉB @mÒ°@@mÜ @måA€@míœ @mõŸ @müóà@nÅÀ@n ý@nì @n= @nö@n\ @nAÀ@n öà@n# @n$ÁÀ@n%ÇÀ@n&þ @n'öà@n(˜@@n(Ê@@n(Ï€@n(L@n' À@n%u @n#ã@n"zÀ@n ¨@@nB@@n¦ @nÒ@@n~@n` @n}`@n q @n‹à@n¥À@nŽ @n%`@ni€@n)€@mÿZ @mþN @mü¸`@mû\`@mú‰ @mùçÀ@møÝÀ@m÷HÀ@mõ­à@môn`@mó4 @mñí€@mïy`@mì  @méë€@mç€@mä”à@mâÀ@mÞ_À@mÙØ @mÔÆà@mÎæ€@mÉ5à@m±€@m¼@À@mµÔà@m®[@@m¦¾ @mŸÅà@m˜`@n§`@n œ@móÈÀ@mݪ @mÆŽ`@m®cÀ@m–Rà@m€,À@mj¯à@mTÀ`@m>Ÿ`@m*•`@m# @mEà@lðÊ@@làD@@lÑæà@lÅ9@l»&`@l³K@@l­ @l¨á @l¢‰@@lŒ @l™ê @l—ô@l—/ @l–à€@l—À @lš à@l{€@l¡î`@l§Aà@l® @lµoÀ@l¾Ì`@lÉ…à@lÖÁ @lå-`@lô­@m.`@m¸@@m+½ @mA=À@mWØ`@mpÀ@mŠuÀ@m¥!à@mÁ0 @mÞÀ@mü @n!€@n7q@@nTÓ @nq¾À@nÚÀ@n©ë`@nÅÀà@nàA`@nø®@oÝ€@o)º@oAn @oWn@ok€@o}< @oã@@o|@@o«¤@o·a@@o¿â@@oÆs€@oÊ€@oÌ®€@oË« @oÈÏ€@oÄ À@o½i`@oµuÀ@o«oà@oŸ à@o‘á`@o„r@@ov)@og¬@oXûÀ@oI´`@o8‘@o'1`@o @oÒ@@nö¼@@nép`@nÝžà@nÔAà@nÍ  @nÇà@nÂF€@n¿V @n¼¾À@nº…€@n¹à@n·ê@@n·ª @n¹X @nÀÀ@nÂÀ@nÅ@nÈ @nÉ @nÉ à@nÇ÷ @nƘÀ@nÆÖÀ@nÉ£`@nÇÈ`@nÅ– @nÀÔ@@nº:`@n°=@n¥¬@@n™Ç`@nŠêÀ@nx¬`@nc] @nR @n@é @n1jà@noÙ @nNd@@n+Ä @n À@mê`@mÇ¡@@m¦%@@m…/@mi)`@mLÀ@m1! @m~ @mU@@l稠@lÖ"@lÈ—À@l¸T @l«ß`@l¤ê @l¤–@l «@@lŸ€@lž@lœÔ€@l@@@lœ=@@l›Û@@l›bÀ@l™?À@l—@l–‘€@l™² @lÉ@@l¢{€@l¨CÀ@l¯Ûà@l¸à @lÆ1@lÒœ @lãžÀ@løóÀ@m7 @m)X @mF@meé@@mˆÀ@m©q @mÍŠ@@mô’`@nà@nE @nn @n˜!À@nÂÍ@@nꯀ@oçÀ@o;b @oaø @o‹] @o±§@@o×z@@oþÖ @p„€@p$)@@p3d @p@ûÀ@pM_€@pXÍ@@pb@@pi©à@pnTÀ@pqR`@prŸ€@pqm @pnŠ€@pj1 @pd€@p\o@@pS¼ @pI´@p?f@p4¡€@p)Æ@px @p.@p å@@p³@oñÝ€@oáy`@oÔÑà@oÆqÀ@o´Ù€@o °@o’9@@o…€@@o{› @ow€@@or-à@onB @ok(@ohÛ@oev`@oc @o_à@o]Æ@o_À@oaÈ`@od¼ @ohò @olÒ€@opŸ @otK€@ozé@@o~Ë @o…SÀ@o…Ý`@o €@otv@orià@of{@oWQ`@oA» @o%îÀ@oÉà@nçf @nÈ5à@nªq@nŠ|@@nc÷@@n8º€@nM€@mé`@mÀ½à@mŸx`@m€Ì€@m^~@mB @m*—@@mâà@mà@lô¾@@lê @läC€@lár@láÖÀ@lånÀ@lêó@lñÀ@lö @lþ@à@mŠ`@mÎ @mÖ @mÀ@mƒ@lúå@ló4€@lé߀@làÊ`@lÖÏ€@lÌc`@lÄ @lÃ"€@lÊÞ`@lÔY€@lâ @lð– @m_@@m@m7R`@mQqà@mmŠ @m‰NÀ@m¦î @mÄ@mæ¥@nM @n7á`@ne‰@@nÛ@@n»”`@néÀ`@où@@oFå @ovÀ@@o¦ÓÀ@oÖþ@@pÅ@@p‹@@p/,`@pEû€@pZ( @pkøÀ@pzÊ`@p‰/`@p’í @p˜Ì @p›Ÿ @pœ)à@pšc@@p•]@pŽT`@p†F@@p{Ú@poñ€@pc'`@pU© @pHÀ@p:hà@p)ÔÀ@pÀ@pþ€@p4@@p :@p Ä`@p ^à@pR@@p­ @p:€@oúâ @oò' @oè@oÝW@@oа`@oÄE @oºôÀ@o­ @o¡Ê€@o™``@o“ÀÀ@o‘¦€@o”`@o™y@o e@@o©e @oµª @o½X€@oÆí€@oÒ£`@oØÁ @oêóÀ@p¨@p¬`@pj€@pÖ@@pÅ`@oõ£`@oØRà@o¸`@o•é @op2`@oHÀ @o-@@nê‡@@n¼b @n| @n{)À@nBF @n [ @máR@@m¹zà@mš @m|E @maò`@mI @m4E`@m"o @m‰€@m Ýà@m;@lÿn€@lÿ0à@mo`@m œ @m@@m ƒ`@m-û@@m?¬ @mY© @msi @mƒ®€@môà@m“e`@m“¡@m‡ˆà@mv@m_@mF› @m1À@m ž`@m@@m§à@mo@m&!@@m7 @mJUÀ@ma>`@mv @mŠßÀ@mš=à@m¤E€@m·£`@mÌìÀ@mãÀ@mþ÷ @n›@@n @n}s€@nÂ]À@o€@oE€@onª€@o|¨`@oxv@oLº@@oƒ@nÐ5 @n–š @njÁ@nRé @nMÁà@nSŸÀ@na€@nt(À@n…FÀ@næ@@n“ €@n—ôà@nœºÀ@nœ' @n–k @n•³ @n •`@n¸hà@nÜb@@og`@o(‚À@oRÁ@@ov@@o" @o²@@oí‘ @pÒ`@p-UÀ@pIÞ @pjÉ@p‹; @pŸ§€@p·o€@pÊU@@pØ`@pàM€@päü€@pæËÀ@pè @pêŽ@@pìü`@pîƒ`@pð†@pò À@pòg@pîþ`@péì@päö€@pߌ€@pØ¢@@pÕà@pÐpÀ@pΠ@pÐ%€@pÓ¹À@pÛoÀ@pâm€@pã @pßÏ€@pÚ `@pÒÀ@pÇ’@@p¿2`@p¹×@@pµP`@p³¡À@p²Ú`@p³6@@p±é @p®ê`@p™®@@pŒ€@p'@puq€@plÎ@@pmv€@pwJ @pxÕ @pŒÀ@pœïÀ@p©° @p°ø`@p³3@p²à@p±:@p¯s @p®Â@@p®ÃÀ@p¬( @p¤S€@p™À@pï@@p€¼@@pj· @pV!à@p@yÀ@p/Ä@p£@@p Žà@p›ó@p˜[`@pšE @pœnÀ@pžŠ @p¤`@p®´ @p´I@@pµ7À@pÀ—`@p¶V`@p£¹À@p…>à@p\F @p*é@@oñ`@owÀ@oI‘`@o)%@@o=¸`@or> @o»æ @pÌÀ@p'Õ@p;-@pH @p?Qà@p,w@p  @oñ€@oÈu@o«n@@oš|À@o—M@@o™`@o&À@o©O @o°å`@o³\à@o«™`@o°Ù`@o±­€@o¡Ï@@o”Á @oŽzà@o•Ü€@o¥@`@oÀª @oâx @pm@@pÇ @p%´@@p4 @pBP€@pN£ @p^@pjŸ@@p~$À@p“§À@p©pÀ@p¿ @pÑi @pàÜÀ@pìí`@pó”@pörÀ@p÷^À@p÷É@@p÷à@pöÏÀ@pöÜ @pø+€@pù¾ @pùÌ`@p÷B€@pö- @pôš @pófÀ@pò±@@pñ% @pïV€@píÀ @pí” @pïÉ`@pô<`@púÑ @q;À@qN€@q‚À@qr @pýDÀ@pøB€@pôñ@@pô–à@pö·à@pùá@pýtà@pþÑ€@pûý€@pôâÀ@pëz @pܱ @pÍUÀ@p¿ã @p»N`@pµ´@@p¼Á @pÆÄà@pÎß@pÒ{à@pÐîà@p̶À@pÇX`@pÂ3 @p¾lÀ@p¾µ`@pÁÊà@pÅ"@@pÇ?`@pÅÀ€@pÂ×@@pÈ) @pÊ€ @p¼@p³£à@p¦y @pøp@pø[ @pôß@@pñVà@pô<@@pùÒà@qÖ€@qÓ`@q@q'€@q@€@q_à@q÷`@q O@pþó€@péAÀ@pËDà@p§úÀ@pÖ@pbd@pG@€@pF?€@pR`@pg(À@p{Ö€@p‡@pž4@@pªM€@p¡À@p•G`@pŠm @pŒ €@p†¡@p…‘@@p„T@pm @p|c@p~Ù@put @pu@p{F @pyœ @p|Sà@pzç @prÚ`@ph`@paMÀ@pU,À@pM@pEoà@pM `@pW.€@pX_€@pd @po@pr…@p{, @p‚Ì`@pXÀ@pøà@p³7 @pÁw`@pÑó @pâ†À@pôç@q@q 8à@qCà@q @q@q`@qx @q„@@q, @q @q d€@qìà@qÀ@qá`@qH @qÖ€@qU`@q–@qý`@q$`@q @q À@qŸ @q$@qY @qÅ@@q­ @qlÀ@q^à@q…@@q lÀ@q €@q a@@q$`@qš@q¿À@qò€@q²À@q vÀ@q©@qj`@pÿ³à@qšÀ@q­ @pøü@@pú¶À@p÷é@@pô<`@pîí@pê @pæ"@pã€@pá@@pàjÀ@pÞ @pÛ?€@p×ïà@pÖ…à@pØÈÀ@pà%€@pçÈ @pðá`@p÷À@q  @q &`@q¹À@q @q q`@q  @q9À@q\ @qå€@q¿`@q»€@q$í€@q*`@q.`À@q1DÀ@q12 @q,C @q#}À@q(@q ¶à@pýL @pó”À@pîóÀ@pîSà@pï´@@pñÌ€@pó @pîø€@péŸ@pæH @pçK€@pë<à@pñ@@põð @pöçà@põ:@pñÆà@píÅÀ@péêà@pçÀÀ@pèNÀ@pí×€@p÷(@@pûÑ@@pù(@@pîŸ@@pß•À@pÍc @p»S @p¬‘ @p©%à@p±5 @p¼À@pÂ/€@pÃx @pÂÜ@@pÄ3`@pÉ  @pÒÛ @pݶ@@pè0€@pó•à@pý¸`@q œ€@qH @q$P@q-/@@q3`@q4¦@@q5v@@q7¢€@q7„ @q6Pà@q6uÀ@q5å`@q4Ñ`@q37`@q3× @q4ƒ@@q6GÀ@q3v @q4R @q4 @q3¹ @q23€@q2S€@q1ÁÀ@q1´`@q1H@@q.• @q,ˆ@@q+€À@q+G@q)÷ @q'u@@q$U@@q!<@@qàÀ@q¬`@q"ÿ @q'â@@q.5 @q2Â`@q1áÀ@q+¾@q$† @q!“`@q+Æ @q- À@qÄÀ@q]`@q@qØà@q ÓÀ@q “@q( @q–à@q2`@pû1`@põ@pí]€@pæË€@päÝà@pæ‡@@péø @pî“à@pún`@q3€@q.@@q©`@q(@@q2@qo`@q!€@q¾€@q7à@q$`@qÂ`@q"²`@q'"@q,'@q3@@q:0 @q@à@qDcÀ@qGB@qG€@qG7À@qE¶ @qDo@qDž`@qA@@@q<Æ€@q6@@q*À@q$€@q°`@qé@@qB`@q¿À@q%Í@@q*õ @q-«@@q.p€@q.¨@@q1¤à@q5.à@q7¥`@q9ç€@q @q®€@qKà@q|À@qš @qû@@q'i€@q'æ @q'Ø@@q).À@q/{ @q<]@@qDµ`@qN @qTFà@qV¹@@qW2@@qZ€@q\¤ @qXD€@q[: @qPŽ@@qLØà@qS<à@q]Ã@q`¤À@qbÀ @qdy@qc£ @qa@q`Ç@@q`÷ @q_ú€@qbb@qd€@q\9`@qO, @qN @qA÷€@q=ê @q>œ@q?ËÀ@qAIÀ@q@O @q=c@@qÄ @qE>à@qL“à@qOÊ`@qRA @qRÁÀ@qIï`@qFCà@qCÇ@qB`@q:l@q3 €@q-Š`@q'Þ`@q#Ý`@qaÀ@q @qà@q; @q^@q @q €@qäÀ@qµÀ@qLÀ@qôÀ@q´€@q ôà@qwÀ@q&‚ @q)#À@q,m€@q.(€@q-´@@q+ç`@q+T€@q+SÀ@q,à@q-s@@q.ŸÀ@q/`@q0ØÀ@q4€@q9" @q>È@qDÜ @qJø€@qQ1€@qVõ€@q[…à@q]í@@q]¸ @q^à@q^È@@q]! @qXS€@qO{ @qDè @q:— @q8žÀ@q< @q@ë @qD~ @qFð @qI" @qO@qVÔ @q\/@@q\NÀ@q[Ô`@qXÚÀ@qU¿@qS–€@qRÈà@qSH@qSñ`@qS(€@qQ,À@qN~`@qKVà@qJZ€@qH¹ @qI @@qP0€@qR>@qR @@qM„@@qX€@qa}`@qXÃÀ@qN,@@qKªÀ@qNÙ`@qUµÀ@qWò @qbÀ@ql¾à@qu<@qx=à@qzi@@q}W @q}»€@qwˆ€@qrÜ`@ql> @qpû€@qwŒà@q}Ö@@q„@q‚ªà@q† @q‡`@q @q‡ã@@q€à@q‹T`@qŒ"`@q†'à@qw„à@qw @qpÂ@qiã@qj]À@qeQ€@qd @qcÅ@@q\ù`@q]`@q`o @qdÛ @qkw`@qn` @quI@@qy`@qjøà@qc‚@@qe£@@qfÉÀ@q`›À@qVÕ@qQy€@qNY@@qGA @q>b @q2I @q,’@q)¬€@q)d€@q)…@@q(¥à@q)`€@q%Ú`@q'»à@q-/ @q-É @q-ü @q(´@q:[@@q:N @q;‘À@q<%à@q;‚ @q:³ @q:ZÀ@q:®@@q:6@q: @q9ï€@q:à€@q=X @qB1@qJ‡`@qQŠ@qVð@q[¤@q`w @qd€@qe‹€@qec @qdÅ@@qe!@qfì @qi” @qkM @qi>@@qbÿ@qWj@@qVàÀ@q[ý @qa¸À@qi6 @qoM @qnÞ`@qr5à@qwx @quw @qv`@qqZ@@qlrà@ql5@@qk @qg5À@qf¦à@qgl`@qh7@@qh[`@qg¸@@qbH @q_š @qaD@qh`@qsE @qpN€@qx @qt¿ @q{ä@q‡•@q‰V @q€ý@@qv @@qsš@qp @qxÐ@qÂ`@q‡ã@qZ @q”ú@@q›Œ@qž@@q z @qœÀ@q™T@q—ó`@q˜ÖÀ@qœ@q¢= @q¢- @q˜BÀ@qä@q¢4€@q¦ñ@@q¥Ô@q¤Ü@@q¦}`@q§þ@@q¦O @q £@qŸRà@q™@q“o`@q‘½@qŽ€@q‹¿@@qƒ @@q‚€ @qƒE€@q„ÿà@q†f€@q@q•Ÿ@@qšÚ`@q›ºÀ@q›´ @q• @q’¼À@qÆ @q€õÀ@qxà@qpà@qià@q`çà@q\G @qSàà@qG¼à@qCè€@qG}@@qDià@qLŽ`@qNW`@qLG€@qPä`@qNý€@qL@@qDt @q=Ø @q_à@@qZA@qXŽà@qTv @qQ[@qQ¯À@qRû@@qR_@qPa€@qN¤à@qN6 @qP`@qTØà@q[õ€@q`P€@qcJ @qbB`@q`äÀ@qcL@@qfh @qiá@qltÀ@qm“à@qlƒ @qlïÀ@qnfà@qq‡€@qs)`@qx¥`@q~T`@q€Ø@q€2@@q‚ à@q‰A @q‡‰ @q‹¾@q‘œÀ@q’Š@qy€@q’²`@q”nà@q’% @q‘, @q @q‹0@qˆ@ @qƒãÀ@q€¡À@qÀ@q‚à@qƒè`@q…@qŸÀ@q†Z @q‰ˆ`@q. @q›^ @qœ¶@@qŸ¤à@q¤¢`@q¦ÒÀ@q¥Å`@q¡Œ @qœ>`@q˜@q¡A@q§Š`@q¦ï @q«¥`@q¸ @q»†`@q¶m@@q»`@q»³@qº=€@q»šÀ@q½äà@q½{@@q½à@qº³ @q¸—€@q»n`@qº  @q¹É@@q¹s @q¸¤ @q¸Ö`@q¹[@q¸ŠÀ@q¶ @q±ëÀ@q®`@q« À@q«€@q©ž€@q¦ÏÀ@q¤# @q£¤À@q¥[À@q¦ƒ@q£µ @q¥@@q£Xà@q§Òà@q»´€@q³¥ @q²T @q¶! @q£Ià@q—.€@q à@q‡3 @q‚â`@q~N@@qxÞ@@qrË@qiPÀ@qfå@qiüÀ@qjã@@qp±@qlÀ @qq7€@qsg@ql.`@qd;€@q_þ€@q`Ó @q•,@@q¹@@qŽkÀ@q‡Ñ@@qÈ`@q¸ @q}Ž @q|@@qxµ @qu@qs€@qq€@qk—`@qj#@@qhwà@qe @qdÓ`@qdW@@qcµ€@qeEà@qi²à@qn‚ @qr\`@qrD@@qsÞ @qv`@qyk@q€í@qˆf€@q• @qžsÀ@qž @@q¡€@q¢Ó`@q y`@q§` @q®Ç @q±€@q²ð @q¶ð @q¸s@q·¹À@q¶Î @q¶t@@q¶w@qµç @q±ê@@q­`@q¬< @q­@@q³Ç @q´©@q²À@q²5à@q® @q²3À@q³@@q´Ï@qµ_@q¶U@q¶I`@q·Ã`@q½À`@qÄL€@qͱ€@qÑm€@qÏÙ @qÓ €@qÕ @q׃@q×@@qÖ @qÕ±@@qÔ& @qÒ À@qÓÀ@qÔåÀ@qÕ|€@qÔ|@qÒÆà@qÒ9À@qÑ2`@qÏÀ@qË8@@qȶ @qÈ‘€@qɦà@qÉT @qÇC`@qÿ@@qÀ. @q½€@q¼= @q½$ @q¼Ç`@q¹Ð€@q·­À@q¸€@q¾¿€@qÁï @q¾;€@q´ À@q¦Ž`@q¬kà@qË2à@qãÿ @qË< @q¿²€@q±â@@q©›`@q®&€@q®Á @q¤{€@q¢q @q¢ì @q @q›%`@q” @q. @q‘À@q•]@q“÷@q•ø @q•Öà@q‹Éà@qŠOà@qŠ)À@q’:€@q¾ À@q¼ð @qºå@@q¶M @q¹-€@q³(à@qª9`@q¦š @q¥ @q¤à@q Ê`@q™Îà@qu`@q…hà@q|Û@qz‡`@q}@qX`@q~”€@qy\@q{½@@q¢`@q~Ã`@q€w @q…§@@qŠ¿À@qã€@q¡d€@qª¢à@q¯õ@q²<@@qµ© @q¸m @q»ô`@q¿›À@qÅ;@qÉ›€@qÌà @qÏó@@qÒ¸ @qÓ«À@qÒ `@qÏ<@@qΠ@@qÏí @qϹ`@qÌö€@qÊú`@qÊÞ€@qÍ8 @qÎìà@qÏC@qÐ`@qÑ5@@qÍžà@qËçà@qȯ@qÈ`@qÇZ @qÆÙ @qÄ @@qÍ΀@qߘ@qíxà@qô¸`@qô–à@qôó€@qõA @qóÕà@qö"À@qöà@qöÑ @qóÕÀ@qï¬@@qì@qì‘@@qï/ @qñ}à@qðÍ @qîlà@qêô@@qç¡@qãQ @qÞ× @qÛÁ @qÛÙ€@qÜÖ@qÛù @qÚô@qÚº @qÙñ @q×%à@qÔUÀ@qÓª @qÔÆà@qÖµ€@qÙ×`@qÖL`@qÛî@qâ €@qßx @qÉK€@q³Ô@@q¶…à@qÝð @r^à@qía€@qÙÀ`@qÙ\`@qØ’@@qÝÑ@qå#@@qÏÚÀ@qÖc`@qÑÔ`@qÍ® @qǯ@q·€@qÅ}à@qÅ× @qÁ€@qÀi€@q¾"à@q»\ @q¶à@qµV @q¸. @q¾€@qæÄ@@qä@qä¦`@qâ«@@qáÀ@qÚp@@qÓÒà@qÐd€@qÎuÀ@qÍò`@qÉG @q @q»tà@qµB @q³óà@q¸| @qºÆà@qºP@qºh @q¸3à@qº @q¿@q´B@q²¾ @qÁÀ@qÆ@@qÊ'À@qÕÅ @qÖBà@qÕG @qÓ&À@qÒ`@qÒ.@q׿@q݃À@qá`@qáÎ @qâ@qã`@qå5@qæŠ @qæ@À@qå·€@qætÀ@qæà@qäç@qàXÀ@qÞÂà@qàU`@qãŽà@qãu @qé| @qïÅ @q÷€@qêÄ @qéÀ@q亠@qã!€@qáx @qÛ¯@@qÛÀ@qßÃ@@qòâ`@rž€@r §@@r À€@r š@r j @r |@@r Û`@r  @r q@@r o€@ru @rY`@r‡€@r /@@r À@rúà@r•@@qÿ¨ @qüj€@qø×À@qõs @qóÆà@qô €@qó¿@@qñ‰À@qðq`@qò§`@qôƒà@qòý @qís @qéè€@qíÊ`@qõy @qù À@qõR€@qô¶ @qû`@qýU @qè[`@qɰÀ@qÈô @qî%`@rV @r ) @rw @r`@rd @r"·€@r!õ€@qø´ @qþ¼ @qù`@qý#€@qù¼€@qúC @qúH @qöá@qõ¹`@qò@qìx`@qð°à@q÷`@qìø@qìŸ @qéø`@rB@r … @rP@@r`@r/à@r< @r. @rc@r bÀ@r €@r€@r_`@qþjÀ@qúø€@qüÜ @r§ @rxà@qû @qúb @qýB @r½ @qÿö @q÷é @qø¼ @q÷’ @qõ à@qñ¢@qò™€@qòï @qòk @qñÞÀ@qñ@qðìÀ@qôŒÀ@qø~ @qü­`@qþÛ€@qÿ¤@ru @r‡à@qÿÔ @qÿU @qþÛ`@qþj@qü÷à@q÷ù`@qó‹à@qô„@q÷˜à@qûœ@@qü  @r >@róà@rö @rþÀ@r ÷`@r™`@rèà@rF@qþaà@qö’`@qüÀ@r æ @r!@r#,à@r"´ @r"!À@r! À@r z€@r~À@rPÀ@r”@@r€@r¬ @r @rô@rl€@rÊà@rÁ`@r@rmÀ@r<@@rE @rà@r ½`@r @@r  @r G@r¨@r û@r ò @r PÀ@rç@r„€@r’€@r €@rŠ€@r @rŒ @rß@rD@@rH@@qáÂÀ@qØà@qø£ @r+p @rI~`@r2Ä@r7@@r7Öà@r3€@r4: @r,jà@r)¾à@r$\à@r!» @r‡@@r$À@r¦ @rô`@rà@r0`@rgà@r¼`@r@rÚ`@rà@r; @r2`@r73@r8Ýà@r7‘À@r8X @r; @rA_@rJ  @rJ: @rCRÀ@r<é@@r7½@@r/È`@r#@rà@r| @rj€@r¾@rW€@r`@rX@@r@r «€@r | @r Q€@r C @r£ @r @r ùÀ@r õ @r @r1€@r €@r•@r§À@r–`@r( @r2 @r"5À@r!ó€@r r@r † @r¬à@r‘ @r| @rL€@rm@@rÁà@rP€@r,i@@r2j @r:Ù@rAÖ`@rT$`@rCN @r7a@@r.?à@r$› @r  @rQ @rýÀ@rã`@r $ @r/‰ @r3› @r63 @r5$À@r3ÿ`@r3@@r1ø@r2R`@r1ñ@@r1 À@r1:À@r1a @r1 À@r1€@r1e @r2jà@r2‘à@r1é€@r0½ @r,Ô€@r'æ@@r$@r# @r" À@r cÀ@r ? @r ÛÀ@r¾@r -`@r$Ý@@r$å @rT@rûÀ@r ç`@r €@rÈ @r"”@@r)«À@rÀà@q@qÞã @reÀ@r9n@rZ£`@raÕ @r`³À@rS€@rCš @r;õ€@r<†@@r;#@@r5Ž€@r21à@r1p@r-æ@@r):`@r*2@r,Û@@r+ €@r*€@r-¼`@r0¡@@r.| @r,`@r0'à@rKù@@rL¶ @rLjà@rIÌÀ@rF&À@rIŠÀ@rR¡ @rfî @rb<@@rbK@rdÎ@r`)@@rYè @rJxà@r>,@@r?@r>Ä @r8Œ @r5[à@r4ià@r/¶€@r(s @r#Ö@@r û @r!# @r$ @r)l@@r. @r/}@@r1[à@r6¡ @r:ü@@r;õà@r<´À@r:Ø€@r8‡@@r9Ø @r=ä@@r@ `@rB¸À@rM&À@rZ·@r^:`@rYP @rO`@r>ž@r=m€@r?tà@rXDÀ@rf¨ @rp•€@r‚ÃÀ@rÿ`@rÕ@r‚`@rn“ @r[Øà@rJ’`@r=ÍÀ@r;ì @r6å @r1§à@r1@@r=‡ @rEº @rH@@@rI%`@rI7@rHS @rF×À@rFá @rF#`@rDU @rDS @rGTÀ@rIÎ @rI}à@rH¹@@rIà@rH®@rFë€@rD£`@r@nÀ@r<@r:®à@r<0@r9&@r6× @r93@@r:€@r7·@r52`@r;}@r @r† @r“Ðà@r¯H@rµ€@r¸@@r² @r©)@@r™˜ @rƒ‘À@rwà@rg= @rY‰ @rR©@@rO  @rN;@rP€@rV`@r\‚€@r]æ€@r`M @rbV€@r_Ð@rZâ€@rY @rYô`@rYú`@rY`@r[© @r]À@r\Yà@r[´à@r\Ôà@r[¹ @rYK@rY.@@rYbÀ@rW@@rVŽà@rVl@rRiÀ@rL @rN@@rQÝ @rP÷`@rM&à@rNÓ@rM˜@rF@rF3 @rP`@rN¯`@r?[à@r:µÀ@rH¨à@rK#@@r-r@@rF @r;@@rlM @r†@r˜y€@r€@r™–€@r‰à@rp, @rl¿€@rg `@r_’`@r_? @reÚ`@rg‰à@rd‚@@rh®`@rm÷à@ri@à@rd&à@reQ@@rfœ @rdd @rcž @rb @rfÊ@@raJÀ@rc:`@rd @rh(@rqª @rí`@r@rvê@@rU™ @rH @rd+€@r‡§@rý @ròÀ@r @r&@r†^`@ràà@r}Ñ@ryTà@rvlà@ry$€@rwÖ@@rq& @rq?`@ruZ€@rqµ @rm! @rqßà@rv­`@ru!€@rw9À@r|œà@r{š @ruià@rwF@@ry³ @rw!@@r{ãÀ@rŽB @r¸£ @r´ê@r¦à@r§  @r}À@r›\ @r¨å @rÏD€@rÖáà@rÐÀ@rÖŽ`@rÑ_€@r¸ @rœpÀ@r§ @r @@ryœÀ@ro°€@rhŠÀ@rk5 @rqá@ru @rwš @ryš@rxm`@ry]€@r{¬@rz™€@rv1@ruà@rw4 @rw²€@rv?`@ru à@rtà@rréà@rsVÀ@ruQ@@rs’ @roÛ @rr @rv‘`@rsÊ`@roòà@roê @rm0@@re´À@ra@rd~€@reCà@rcOÀ@rcÚ€@rc>`@r`@r_Bà@r_€@rY-`@rMÊ`@rMGÀ@r\Ó@rdi€@rHª @r0.€@rC À@r}‡à@r¬ @r¯Š€@r© @r¡"@@rˆ› @r~G@@rÍ@r†@ @r‚Ðà@rƒ_`@r‰ `@r†šÀ@r€  @r@@r‚ôà@r}à@ryF`@rw0`@rq*€@roá@@rtô€@rq¿€@rsÜà@ru  @rwœÀ@rt«à@r}à@r¥â€@r±°€@rŸ @r•ÿ`@r…@r{Ý @rŠHà@r¢à@r©m@@r©2@@r°å @r»ÝÀ@r¡@r˜€€@r—Ò@r³@r†À@rˆ|à@rŒm@r‰ò @r‹ºà@r‘àÀ@r€@r‹K @rŽº@@rj @r‰3 @rŠw`@r‘µà@r5à@r†C@r†&@rˆ!`@rƒÑ @rŠ @r¨Ý @rß'€@rÜ @@rÂs @r¹×À@r»ç€@r½‹ @rÖØà@rå‰`@r×ç@rìV€@rëåÀ@rßµ @rÏ­@@r¸´À@r™þ@@rê`@rÚ@@rŒË @rˆ €@r+à@ršf@ržØÀ@rì€@rœ+À@r™Ï@@r—Ö`@r—à @r—` @r–¼ @r—¤€@r—±à@r”q@@r‘ @rã @rpà@r•À@r‘CÀ@r’`à@r• @r‡Ž`@r‡à@rŠ @r‡ùà@rƒÚ@@rƒË@@rƒóÀ@r~²`@ry†À@rxçà@r{m @r{@ryFÀ@rwb @rv£€@rs @rj×à@reYÀ@rdnÀ@raÏ @rcE@rn+`@rlfà@rCŸ @r+Ì @ruê`@rÁù€@rÛÍ @r¹€@rŽh`@rvÓ`@rx°`@r†j`@r™2`@r “à@r£k@r¦Òà@r )€@r—pà@r–Ø @r–O @r# @r‹òà@r‡Å @r|€@r|å @r5à@r|s @r{ú @rÀ`@r‘`@r}{`@r“* @rʵÀ@rÇÚ @r¬ØÀ@r³³`@r¹iÀ@rÇ‘@@rÐu`@rÄtÀ@rÃÿà@rÁK @rз@@rÈ‹@r²m@r›YÀ@r¦|À@r§6à@rœí€@rŸR@@r¦ À@r¥C@@r¤Œ @r©Ø @r¨í`@r£è @r¤u@@r¢­@r›Ê@ržà@r¦} @r£Ã`@r™í @r™þ @r› `@r—;@@r¦¦ @rÛ@sà@s @röœ @rðyà@rÞ¯@@rØ«€@rëê€@róv@rù4@@s”€@rþ=`@rîÖ€@rÞž@rà @r«ž€@r©K`@r«Ûà@rª`@r§Và@r¬Õ @rµm`@r·yÀ@r¶üÀ@r¸‚`@r¹À@r¶— @r²NÀ@r°"`@r°µÀ@r°Ù`@r®À@r¨` @r¨ @r§éà@r§Î @r©³`@r¯< @r±Œ @r¬}@r¦L€@r¢Ó@@r¢©€@r o€@rŸ¸@@r¡Ç @rŸ¿€@r› @r˜l@r˜ô€@r™ À@r•x`@rŽøà@r‰j€@r‰€@r…ŒÀ@rz…À@rvt€@rz¶à@rrS`@rgû€@rzð @rŽŠ€@rXj @r @rRý @r¼m @rðª`@rÊ£@r¢b`@rŒý€@r…À@r’ø @r±z @rµ @r¼Á@r½é€@r¸`@r®Î@r¬ñ€@r«Ó @r£S`@r•`@r™ @r‘`@rŒ@À@rб @rð@@rˆ#À@r¸`@r‰. @r‡ @r©­à@rí @rÐN€@rÇß@rÙ¢@@rßV`@rðÁ@rð/À@rÙ @rÎW@@rÛŸÀ@rìÊ`@rÍà@rµ8À@r›•@r³l€@r½Ÿ`@r·U@r¼I@rÄÑ @rÁ`@r»ú@r½B @r»ñ@@rµï`@r³ë@@r´I@@r±Æ`@r³Z€@r·ì`@r³÷€@r­³@r°( @r±Šà@r¯C@r¾F @rÜÅ @s9À@s1 @sì @sp @s †`@s0À@s— @s@@s-yà@s&Žà@sš @rëŒ @rÎK @r½£€@r¾M`@r¾ @r½õ @r½Bà@r»Ò @r½« @rÅ^@rÈüÀ@rÊÞ`@rÎZ@@rÐq@@rÎ: @rÉ>€@rÅqà@rÆ@@rÄn @rÂL@r à@rÆ'@@rÁ™à@r¼¾ @r½Ü`@rÈC€@rÎÀ@rÍJ€@rÈÒ€@rÆú @rÆ7à@rÂÏ @rÄ `@rÇ– @rÃ7€@r»€À@rº×€@r»]à@r¶m @r°_@r©}@@rŸE@r™Ià@r—ÈÀ@rŽïà@r‰4`@rŽy@rˆÐ@r|Ëà@r¸ @r˜~à@rY#À@rò€@r?É`@r±6@råР@rÔÿ@@rÅô@@rµ¦ @rž­ @r›7@r¿ÊÀ@rÒ–€@rÍç`@rÑÃÀ@rÌ^À@r¿ïà@rº­ @r¸$à@r®º @r¨ @r¤«€@r2@r–© @r“ `@rо @rœ¦@rž°@@r™è`@r—½ @rÁ@rå£@rÆ™à@r×@rïéà@rø… @rèø@@rçâ@ríì@ræ”`@ràº@rþà@ræà@rÈì @r¹ `@rÉ_ @rÓo @r΀@rÑ @rÚ*@rØÀ@rÔW @rÕ@rÓÖ @rÍ*à@rÉ•à@rÌ8@@rÌå @r˃@rÉr`@rÅà@rÀšà@r¿Ô @rÀ“@rÃõ@@rÓ @réJ€@rûé`@s =@@sëà@s`à@s( @si @s:X@@sE¥ @s!ë€@sIÀ@sùÀ@ràÈ @r€@rÉãÀ@rÐŒ @rË›@@rÊæ@@rÍC@rÍ`@r͘@@rÕŽ€@r܉ @rãAÀ@råØ@rä”`@ráœ@rà`@rÞ6@@rÞ @rÜuà@rÙÌ@rÛU @rßÝ@rÚÔ€@rÕ~à@rÖ~ @rÞE @rãà@râçà@rÞÉ @rß[@@rà:@rÝ @rÞƒ@räõ @r☀@rØî`@rÖñ@@rÕa @rÉË€@rÂP`@rÀ:`@rµRà@r©‹@@r©&À@r¤Ë`@r›§@@r< @rž…@r‘d€@rƒ« @rn¸ @r3Ò`@rÓÀ@rlù`@rÌú@rá‡À@rÔœ`@rÞÞÀ@rÕY @rµûà@rªg @rÃ@@rÛÁÀ@rÚÊ@@râ @rß¹@rÑ= @rÈ„ @rÄB@r»ìÀ@r¶ @r²Ã`@rª{`@r¢íÀ@r¡`@rž7@@r®Ï`@r°‰€@r¯@@r®ç€@r°^à@rÃÛà@rµ†à@rÈ… @rÚ„À@rÖŠ`@rÈ2à@rч@rï­à@rìÌ @róà@rý÷ @rôñ`@rÝÎ`@rÓw @rá @ríK`@rí@rë5@ríë@@ríî`@rìÆ @rìà @rì¢@rç÷À@räà@rä:@rã=À@rà"À@rÝg @rÛbÀ@rØ`@rÔh@rÓ¸@rÙ> @råÓ @ròý`@rûI`@s{`@s½`@rú!€@rþÏ @sº @s6_À@s!0@s, @s‘`@rñ= @rØÍ€@rΛ@rà `@rá¬@@rÙ" @rÜ`@rß‘@@rÞ€À@rà @@rçö @rìóà@ró\@@röe@rógÀ@rïÃà@rð– @rò0à@ròU€@rðÖÀ@rëW@rèÀ@rêÄ@@rê€@rè~@réõ@rëþà@rñGà@rñÏ@@rêJ @rè`@rì;€@rì±à@rìN€@rò…À@rôwÀ@rëa`@rçú@ræ¿`@rÛ"`@rÒr @rѹ€@rÇ–`@rº-@r¹®@@r¶‘à@r©€@r¢ÖÀ@r¡ @r×`@rlª€@rE À@r7€@rjè @rã^ @sn€@rêo`@rãêà@rï @rîW`@rÑ: @rÉÑ @rÏ•`@râÈ@@rà@@réR @rë6à@rã @rÛö@@rÕ¥@@rÍ5 @rǸ€@rÃÉà@r»oà@r´F`@r±¢@@r¯šÀ@rØÀ@rÃÝ @rÄA@rÈÑ`@rÈ @r«{À@r˜)@r¢u @r¾4`@rÈ´€@rÉ÷À@rÍÒ€@rÅø€@rÓeà@rß+`@røÀ@rò`@rìr@râ@@rïÊ @rûZ @sà@rüÌ@rùuà@rùíÀ@rú‰€@rùk @rû0@@rý| @rú`@rôÏ`@rïb@rìX€@rë5@réû€@rèÆ`@rè²@ré@@réd @rïcÀ@røÚà@rüN€@s<à@sà@sXÀ@rä¦ @rù7à@s6à@s¡€@rùß@@sC`@rýn@@rÑ*À@rÑœ@@rçt@@rìà@rå|`@réÊ€@r샠@rêí@rñµ @rö €@ró¡€@rö? @rù¯@@rö@@rõR@rö« @r÷]À@r÷¯`@röp`@rñN@@rìG@rë2`@rîu`@rò à@ró7`@róAà@rû±à@sÐÀ@rý‚@rõo@@rùr @rü=@rùŠà@rü‘`@rüÞ`@ró< @rï_`@rñ–à@rëg @ráÞ@@rÝÅ@rÕ™@rËR`@rÆÓà@r½`€@r®ŸÀ@r¥Ø@rCÀ@r„jÀ@rlž @rdéà@r‰º@@rþAÀ@sP‰À@s4Ì @ríº@rý˜ @s §À@s '@@s*À@rò®À@rôU€@rîX @rã`@räà@ræj€@rç_€@rçm€@rä<À@ràc`@rÛŠ€@rÕeÀ@rÎ÷@rÉy @rµ@@rÁ` @râ‹ @rÜ[€@rÔ¦ @rÜí€@rÞmà@r·I @r ª @r¨°`@r·˜À@r¸O @r³ØÀ@rÀ_ @r°€@r¼¼ @rÔ- @rò @rïêÀ@rì» @rô@r÷;à@r÷\@@rø<€@rö¤ @röh€@rû„À@rþ¢à@rþ°@s4@s @s#€@rÿª`@rúcÀ@röÌ@rôÃà@rða@@rî @rñm`@ró8 @rïr @rò‘ @røçà@rê® @rèî@@rî @rö}€@rõ| @rû†à@røoà@rôÀà@s¡@s!H @s`@r×@@rÏ& @rè  @ró“`@rñà@rôÏ@rõÀ@rôÑ@rü8€@s´@rü @rú²@rýê`@rüå`@rý@s @rþpÀ@rûÇà@rûa€@rù»@@r÷ë @r÷n @rù @rüx @rÿ@@rÿ @sD€@s ý€@s œ @s4@@s¥À@s/@@s€@s À@sÍ@rû `@róë@@ròFÀ@rì“@@ræl@rã+ @rÝd @rÕ£à@rËŽ@@r¼ó€@r·0`@r·ÒÀ@rª? @r> @rˆ@@r­u`@ríÞ@@s2@@s&£à@r÷4@rëF @s’@@s0\À@s(à@s‚`@s(@@s¤ @sšÀ@rõÑ @rÜä @rÞS @rãkÀ@rçg@@rêÒ @rðN€@rî€@rç`@räÛ@@râË@@rÜ=€@rÝ,€@ròï€@rë8€@ràaÀ@ræ`@råã€@rÇÔ @r·± @r½DÀ@rÀá`@r¶à @rª@r¦ @@r¯à@r¸¬ @rÙo€@rí@rç=€@ré¬@rõŽ€@rö @rò9À@róá @rö~ @rùÕÀ@s @s. @s˜@@s'@@sjÀ@s‰@s 1`@sÜ @si @rþG@@rû´à@rùM @rù¶à@rùÛ@rí>@rᇠ@rö @rþù`@rôê @rðs@rëA€@rê³À@rï|à@ríñ@@réI@rùÀ@rùf @rî `@rÔ¾`@rá^@@róÜà@rûÀ@rûa@@rþ@@rÿá@sÙ`@sø€@s @sÝ@@s À@s¦ @sU @s À@s ’@sˆ@@sà@sfà@sg`@svÀ@s“@sc@@rýeÀ@rþ~@rü7@@r÷H @rõÛ€@rõ»`@rõf€@r÷@@r÷à@rõ] @r÷@røV@rô9€@rîò@rç¤ @rá6À@rá`À@râE@@rÞÀ@rÙþÀ@rÓÀ@rÇ;À@rÊY @rÔx@rºØ`@r¡—À@rªn@@rÜåà@rüÏ @sÀ@@rû±@rïØ€@rý„ @s" @sN1@s(ü€@s&½ @s,8 @s@s,€@rú½€@rÕ @rßœ @ré? @rë/ @rëv@róf@ròrÀ@rë%à@rì[ @ríT @rè©€@rì% @rñå€@rð @rí²À@rçôÀ@rÙ!`@rÓÓ@r»q @rÁúà@r¾Nà@r©Ì @r”Î`@rùà@r–?@@r´@rÕî@ríˆà@rå @râS`@réQ@@rìN`@rô© @rÿˆ@s˜ @sB@@s˜`@sl @s e`@s ýà@sÙ€@s'à@s @sE @sz`@sV@@sª@@s6à@rû4 @r÷à@sJà@s“€@s? @s `@s7 @rø“`@röf@@rô® @rø¡ @rï¼ @rÑÏ@rÌü@rÐc @rØv@rë÷À@s“€@røå€@rýñà@rÿb@sY€@sR€@s.`@s€@s0@sF @s† @sm@@sà@sÇ@@rÿ• @rû8 @rûÀ @rù|@róÀ@rïæà@rñ à@rîô€@rëC@rë§@@ré @rߘ@@rØÈ`@rÙu @rÚÝà@rÚ à@r×r@@rØ4`@rÙ­`@r×À@rÕR€@rÖQ @rÑÆà@rͳ€@rÓA@@rÕjÀ@rÑÊ @r×’à@rÞé@@rÙ¶ @rÚ@rà¸@@rÈ9À@r¦h@@r¾¹€@rò_À@r÷ôà@rìÂ@rû @s â@s„€@s4‡ @s@$ @s-´€@s!E€@sö@@s æà@rõÏ@rÞ'`@rÂB`@rÓ¥à@râ»À@râN @rßrà@rå{@@rã¨@@rÞ €@rá @råÆ@@rèDà@rí¥@rñ€@ró& @rúUÀ@rÞ- @rÈ+À@r¼Å`@r½é @rÈ5`@rß @r­0 @r”C @ro @rvT @rœ3 @rÔ@rí]@@rì `@ræ@@rç¿ @rêâ@@ró¯ @rýÐÀ@s€@sY@sq@@s ø€@s Ù`@sP@@sÀ@sÈ @sý @s ð@sQÀ@s"À@sù @rå»`@råy@@r÷À@@s÷ @rý@rú‰À@rço @rðU@@røÀ@røà@r÷w@rþQà@rê@rÜëà@rÖ˜ @rÚl@róü @sÿÀ@s ¶ @s* @rýVÀ@rþ‹ @rùÀ@rô@@rõq@@rõu@rõ~à@röÀ€@róú@@rî…@@rí.@@rë×`@räÇ @rßì€@ráa`@râi€@rÝ•@@rØå @rÙkà@rÚL @r×Ý @rÖ± @rÖ"@@rÒÝà@rΜà@rËÉ€@rÈ€@rÂü@r¿l`@r¿3@@r¾d`@rºz`@r·›€@r·£à@rµS @r³Þà@r¹Ô@r½@@r¿2À@rÏ€@rá @rÞ¹@@rÙÓà@rà˜€@rÏ€@r¬8`@r¼á @rêVà@róq`@ré€@ró; @s1à@s"­@s9a@@s'€@s@sŽ@rö¼ @rär€@rÌx`@r¾e @r¹a @rÈÀ@rÖ @rÕå`@rÕ2à@rÙm`@rÜ;À@ràÛ`@råÀ@rèx @rðq€@rõ`@rá… @rçX@@ròx @rͳ@@r³æ@r­l@@r´¢@r¼÷ @r¼›€@r¬8À@r–›`@r†Ï@@rØÀ@r¢‹€@rÉ®`@ræ€@ræ `@rëàÀ@rñš @rð˜€@rî  @rð£à@rö1 @rÿÎ`@s Œ€@sR @s@@s\À@sA€@sôÀ@sW @s`@stà@sõ @s™@rÝî@@rß0@@róÄ`@sÆÀ@róà@rÛ‚À@rÎkÀ@rÝè`@rìÀ@rï† @r÷W@@rõf€@s M @s Y@s ¨à@s @@sOà@s [@s -€@sî @s†à@sY€@rý.€@rõB@@rõb€@ró>À@rñR@@rðÏ@@rí\@@réó @rèb€@rä’@ràkà@rßoà@rÞ@rÝU`@rÝš@@rÛØ€@rØã@@rØs`@r×ÍÀ@rÕåÀ@rÕÀ@rÕbà@rÒ@@rÌäÀ@rÉ—€@rÉÒ @rÈ‹À@rÂúà@rÀ¬€@rÂå`@r¿ú€@r¶ñÀ@r±€@r´¡ @r½.@@rÁí@rÃz`@rÓÄ @rå`€@rãïà@rÛE`@rék@@rå @r¶,@@r§1`@rÆv @rä @rà§`@rØt @rèÿ@s + @sã`@sÄ€@rò`@rØ« @rÒ`@rÒZ€@rÔX€@rÏ9À@r;@@r×Û@rßs€@râr`@råà@rçø @rê< @rïÓ€@ríD`@ré @rìà@@rëŸ@@rÂ@@rÕš@rÌQ @rºÖ€@r¦ËÀ@r¤+ @r­€@r²à@r±¡`@r§© @r¡ €@r¶—€@r±j€@r—ƒà@r¡î€@rħ @rÛv`@râÚÀ@rï„À@rði@rëM`@rñ„€@rþz`@sp@sª€@s Pà@s š`@s ¼ @sv @s | @s [À@sHà@sO @s‘ @röj@rß± @rÚÎà@rí" @süà@rüëà@rà—À@rÓ½`@rßm @s S`@s´ @rþ9à@sè @s ®@@s b@@sÆÀ@sð @sû€@s{ @s ¯À@s %@sþ@@s4à@s `@sQ`@sPÀ@s‡€@rþ#à@rý!à@rú· @røÀ@rõù@rðù @rñ&à@rö8 @rôÆ€@rð‰@rñ6à@rñk@rìÍ@ré™ @réLÀ@réEÀ@rè  @r䜠@ràX@@rÝö€@rÞz@râ{@rââ@rÚ…€@rÖ„@@rÜ~ @rÞf @rÖ6@@rÓ)`@r×Yà@rÜ@rÞó€@rÞE@rà½à@réK @ré•@@rë] @rýA @rüú @rÇóà@r ¢@@r½°à@rô”€@rß³@rÓ6€@rêEà@sž€@s<@@rò1à@rÞé@rÖ[`@rÛº @räÀ@rì"€@rëG@rë @rñ?@ròJ`@ròÄ @r÷Ì`@rö¸€@rñ>à@rî@`@rá0€@r¸ø@rÁO @rÁí`@rÎU @rÓP€@rÓXà@rÁÃ`@rÃ\@@rÓ– @rÈ,À@rÆ@rĵ`@r¹Ã @rÄ`@rÞ¶@@r»à@rmä@@r_7`@r§§€@r×Í`@rãµ@rã±@ríò`@rîE @rô]€@rÿY@rüdà@rûrÀ@sßÀ@sü@rî_ @rîS@@rüU@s  @sÛ@@s°À@sí@se @r÷ÖÀ@råÀ@r÷7 @rþ@@rö¡@@rñvÀ@rí @rë`@s À@rçµ@rçá€@sc`@s \à@s '€@s H`@s Ç @s "à@s á`@s!À@sÏ`@s6`@sß`@sI€@s^ @sj€@sÓ @sJ@s =@@so @sÛ€@sTà@s× @s%€@sîÀ@si@@sÿ`@s~ @rÿm@rý°`@rüÙ€@rú8 @rúÀ@rú¶À@rø1à@rõà @röj`@rõà@rñ×À@róú`@ròY @ríI€@rî­à@ró'@@rôL@rõÅ@rõ @rðH @r@rð"@rîìÀ@r÷]€@s°€@s_ @rñÕ@rüó`@rã¶ @rµæ€@r¿× @sÀ@s!@@s /`@réŸ@rìõ@@rßp@rØN @rÜ®@@rå_ @ré@rïà@rõà@rô€@ròâ @rö3 @rö@ròUÀ@rðf€@rïŽ`@rê¾à@rË_`@r¾Õ@@r³›€@r¹ª€@r¿Ùà@rç¸ @råü€@rÚm€@rÐj`@rÔ @réá€@rÞƒà@rØT@rÓ®à@r±F€@rÆv@réá @r¸¹ @rUö @rFÛ @r£sÀ@rÛ)@@rÛ…`@râ•`@rõ7à@rô€@róV @rø@@røq@@s @s¡@@sk€@rç" @rßôà@rýž@s 0À@s @s S @slà@s À@róÄÀ@rô+@@rêä@@râ:À@rêf`@rû @s¶@sŠ @s”€@rägà@råP@@sa`@s† @s l@@s q @s `@sƒ@@s* @s’@s €@s %`@sÆÀ@sÄ@s€@s«`@sÛÀ@s Ž`@s<@@rþtÀ@rÿ; @s 7`@s žà@sx€@s @s @sa @rÿ” @rùq`@rùdà@rûˆ @r÷>à@r÷ã @rû.à@rúÇ€@rû @rþÖ @rû­@röŽ @rú¢ @rÿ© @rú×À@røSà@rþÅ@s`@s[@rþVÀ@rö]`@rõ•@røº`@rý%@@sÓ@@sr @s U @sL€@sG @rþV@ríú@rãÚ@@rîw @sqà@rú@rè· @rÜà@rÙÁ@@râwà@r딀@rï @rì@rî``@rñ« @rî¡À@rè•€@rék@@ré«€@râá€@rà @ré`@rð @rÔÀ@rÅ@rÓ`À@rÜWÀ@rÝ‚@ré @rÍ_€@rÐR@@r°x @r¶—@r«À€@r®y @r±÷à@r’s`@rf½À@rŒj @räEà@r×O@@r…æ`@rwQ @r£¤À@rÆ9À@rÊ @råaÀ@rùµ@rùÔ@rùZ @rÿ€@sá @sù@@sÍ@sx @rÔ®À@rÓU@@r÷`@s¤`@s" @s€@s¶À@sä@@róL@rÔ°€@r¶'@r´Õ€@rÊ @ró8 @sq@s €@röÀ@rð/`@rök@@sÀ@s -À@s D@sa`@s $ @s Í€@s Í @s à@sV @saÀ@s< @rþü€@rúŠ@@rù@rúÿ€@rýÇ@@rø"@rð @ró±@rþÈ @s>@@rý@@röy€@rôe@@r÷À@röNà@rîÐ@rí‰`@rð? @rìþ@@r뻀@rî²à@rï(@rí²à@rô€@r÷BÀ@rôΠ@r÷ç`@rú\ @röà@rö¯à@rý-@@rÿÖ`@rþH€@s#à@s`@s€`@s _€@sþ @rò  @rî¸À@réý€@ræ @@rêºÀ@rö@@ròG @rîh @rä-€@räD€@rádà@ráÁ`@ræoÀ@ró>À@rö? @rðõ @rë(à@rêj @rê!`@réÚ@rã’€@rÚ™à@rصÀ@rØG€@rÓO€@rÔõÀ@rçÖ€@rÓ…€@rä @rÍ`@rÒa@@rã8@@r߇ @r¹ `@r¥Ý@r˜À@r‡Sà@r~W`@r|™`@rmå€@rb˜ @rD«`@r,¨€@r[à@rd`@rÁ `@r¹å @r¶/ @r­  @r2@r–· @r²À@r惠@rî–€@r÷Í @s3à@s€€@sÍ@s  à@rêÀ@rÏ€@rÒ#@@rêÀ @sÏ@sq`@sYÀ@sÀ@rñD`@rÌÃ@r§ @rg€@rŒþ @r²gà@råO@r÷Ý@@rîsà@rà%À@rãæ@rö¸À@s?€@sÀ@sñ€@sà@s`@rü1À@rþŠà@s°`@rýPÀ@rúB€@røSà@róåÀ@rñ1€@ròUà@ròü€@rðÇ`@ríÍ @rïÑ@@rô^À@rõ; @rñc€@rñ/ @rîKÀ@réÀ@rê½ @rì@ræÍ @rå @rç}@@rægÀ@r一@ræ†À@rçà@ræ¥à@rì´ @ró§€@rõ @róÀ@rï¬ @rï¬ @rö¢ @rü)@@rûà@sË@sÇ @s @rü,À@rë @@rètÀ@rÙÚ@@rÎ<@rÃp@@rÏ7`@ré‚@@rôT @rô À@rí%@réR`@rí? @ró@@ró `@róá@röM€@rï @rä6À@râd€@rå €@rá@@rÚÀà@rÕX`@rÎñà@rÌ,@@rÌ0À@rÉ™€@r͇`@rÝÔà@rê@rç­`@rãT€@rÀO`@r®À@r¢€@r~áÀ@rgMÀ@rT @rG%@rH¾@rG·À@rDÄ @r6€@r(` @r!ù@@r6åà@rXÇ€@r‡ï`@r«/€@r«í @rƒ @r7 @r=¹@r~; @r²qà@rÒ¬à@rßý@ròò@@rí{ @rô¡€@sÏà@rä^À@rÔƒ`@rÁ( @rÐ!@@rÝ) @rõ÷à@s“ @rØ À@r¾G@@r• @rxSà@rr[ @r„U@r¡„à@rÓB @râÒ€@rÛøà@r×>à@rÙæ€@rîÿÀ@rûA @rûÑà@rý¢@sr@@rým@rúà@rúð`@rù€€@róx@rîH`@rëÒ @rè @rå9À@ræ @@ræ˜@@räg€@räz@réaà@rìí@réN @rä‹€@rä΀@rå»`@râc`@r⟀@râ…à@rÞÐà@rÖ? @rßkà@ráe @rßc @rຠ@rã‘€@rå`@rå¸@@räô€@rå<@ræ2 @rè @rî @rõ! @rõv@rúæà@s D @sÇ @rÎ@@r˜€@r„…À@r¥ª@r¿> @rÀ @rÆ`@råO @róõ @rë4@råí@@rÙ-€@ráªà@rä0 @ræÛ@ròœ€@rê€@räР@rÞ=`@rÚ`@rÛÜÀ@rÙû @rÐÔ @rË”À@rÊy @rÅÄ @r¾F€@r¹Æà@r¸A@@r¾¸@rÍ[ @rØÇ`@rÃ\à@r©Ó€@r‚’@rta @rváà@rj›@@r7ÈÀ@rDà@r j€@r ½À@r)A`@rì@@rR€@r³@@r,1 @r7&@rCžà@rg÷@@r£Å @r™R`@rAƒÀ@rÄ`@rIÀ@raïÀ@r•NÀ@r¾t€@rØûÀ@rèAÀ@rçl@rìà@rÓ¸à@rÀ @r±+à@r¢… @r¦à@r°€@r½ @rÙþÀ@rÏ@rµ- @rr×@@rQ;€@rN¡€@rc.à@r„é@r£í@r½f @rƶ`@rË#À@rÓâ@@ràž @rêÙÀ@rï; @róÍà@rö‚à@rø÷€@rùà@rô}À@rì@rä§À@rá¨`@rà``@rÝ€@rØÁ @rÖ @rÕn€@r×B @rØ1 @rØ@@rÙûà@rÜK@rÚÝ@@r׿ @rתà@r×ü@rׇ @rÖE@rÎþ@rÄŽ`@rÐd@rÓª@rÑ¥À@rÐ8 @rÑã @rÒç @rÏÄ€@rÌ›`@rί @rÔ}@rÚƒÀ@r߸@@ráí@@ræìà@rúò @sï`@rÔ`@r‚BÀ@r>ý@rTéà@r’Ç`@rÃn @rÄà@rÑC€@ré´@rß_ @rÕ× @rÓØ€@rÓß@rÎD @rèî @rîx`@rê¼ @râ=€@rÝ,`@rÛÀ@rØÓà@rÔ€@r˹ @rð@rÁâ€@rÁôà@r»9@@r°u @r§ À@r¢ó@r§é@r´î€@r¨«À@r†Sà@r€‡à@rh#€@rv¢`@ry@@rXÀ@r%N @qøâ@@qàñà@qã€@qûë€@r1 @rÌ @rw`@rï @r}€@r&@ @r?' @rsuà@rKrà@rÆ`@qðà@r+-à@rÖ@rç @r•×`@rŸÆ`@rÆ™@@rÍ @r°ñ @r‡èà@rr©@@rÑÀ@rš(@r©ƒ@@r¤ @r¤@@r¨³`@r¯l€@r{Üà@r1< @r2`@rËà@r @r0þ@rM©À@rtÚ @r‘Ï@@r°â @rú`@rÎ*`@rÔà@rÛÚ @râ¡`@rãJ@råÄà@ré{@@rævà@rܤà@rÔ³à@rÐ@rËD@rÈŽ€@rÇi @rÄ€@rÂià@rÆÕ@@rÊåà@rÉ¢`@rÊE @rÏÙ @rÐcÀ@rËœ@@rÈý @rÉÁ€@rÇ$`@rÂd@@r¾@@r»Ä€@r»ì @r»Á`@r¹ã @r¶ãÀ@r´K`@r± @r°OÀ@r´·@r¹>@r»Ø@@r½— @r¿œ @rÄÂà@rÓ @rÑdÀ@rʈÀ@r‘ @r=Y@r(öà@rh.`@rµ]@rÌD @rÆc @rÇ7à@r¼«`@rÁ‘@@r« @rÔ«`@rßM@@râ>À@rä  @rå¡À@râõ@@rÝ @rÛm @rÙY@rÓ @rÉŸ€@r˜À@r¿À@r½à@r·z€@r±4À@r­v@@r¨„@rŸz€@ršr @rž @rŠ"€@rkµ @rVh`@rPi@@r_¾`@rfC@r3¾@@r(€@r ˆà@qõwà@qíf @qó @qþk€@rÒà@rX`@räÀ@r•€@r å@@rc@r3À@qã @qÃZ@qì @r9©@rld€@r^`@r2‚À@r5¯€@r?À@@r@lÀ@rJ´`@r7Í @rF· @rnK`@rˆ0à@rg`@r)X€@r¤@@r²à@re€@qî»@qÛ(@@qÏä@qÎ6`@qÉ @qáB @r @r%À @rEü@rq`@rœ`@rºo @r¾)à@rÆ€`@rÎx@rу`@rÒB @rÖ.À@rÕ €@rÍà @rÆä`@r¾€@r²@à@r«ì`@r®Ö`@r®½€@r©á`@r¬ @r³ê@r·z@@r¸w€@r½k€@rÁ:@rÀ§ @rÀ¨ @r¿“à@r¸à€@r²@@r±­@@r± @r«t`@r¥9@@r¢Î@ržß @r–ßÀ@r‘r @r’Û€@r™@@r›%à@r™Ö€@r‡@@r§Ï @r³KÀ@r Ì@@r¢`@rŠe€@rB´@r³À@r!Óà@rf²@@r›¼@@r³5à@r®`@r±@@r´l@r©Ñ`@r¿)À@rËù@rÑ: @rÓZà@rÖDÀ@rÖIÀ@rÓ€@rÐÀ@rÐ à@rÍ€@rÇz@rÀã @r¼g€@r¹" @r²È`@rªQÀ@r¦z@r¨©@r§¿@@ržaà@r”÷à@r“- @r­`@roáÀ@rKˆ`@rÀ@p¦/`@pˆLÀ@puµ @p}+à@p”ƒ`@p¥Ê@@pÉ@À@pú|@@q¿ @q"" @qK" @q{nà@qœÉ @qų`@qû‰À@r1~ @r+ó`@r$Î`@r'FÀ@r#Ÿ`@r#O @r&"€@r][à@rmâà@rm3à@reÏ@@rg˜@ri¥@rcT`@r^: @r`L @rcÀ@r`Å€@r^!`@r`v`@rg3 @roÊ€@rxU @r~×@rƒÞÀ@r‰à@rŽ›@@rš`@rˆéà@r¤€@r| À@rxÝ @rqEÀ@rdH`@r]`@rY™ @rMºÀ@r>ÝÀ@rC<@@rY‘ @r`Á@@r)M@@qîmÀ@qÁƒ`@q Ê€@q| @qg@@qr#à@qŽ¥à@q°\à@qÅ @qÞ @qñJÀ@qñX@qò\À@r à@r1 @r`V@r„€@r}`@r”E@r‘‰`@rŽÍ€@rŽ^À@r‹ö`@r‡µ @r…Åà@rˆŽ`@rŠ@@rŠR @r‹·à@rŽÐ`@rK@r†æ@r„Ê @r†\à@rW @rxÀ@rvÉ@r³@r‚È @rX¸À@r7¢À@rK @rÍÀ@r#5@@r.æÀ@r(à@r#³@@r!À@rüà@r&  @rT@@r ! @qܪ@@q¿ À@q˜>À@qs« @qjŽÀ@qU›à@q?ù @qEm @qPØ @qY @qMp@qPUà@q\(€@qPô€@q!á @pÜö @p˜.à@p›ê€@pÑÒ`@qzÀ@q “€@pùé @pÞà@pÚH`@pßà@pæw@@pû‰À@q ŸÀ@qç@q2Á@@qF·à@qi«`@qK@@q·`@qÔà@qÒþ@qäðà@r  @r[@qï©@@qî6 @r!: @r=À@rF«À@rB@rAEà@rC¤`@r?V@@r;¥€@rA`@r?yà@rCç€@rIE€@rQ>@rYœÀ@ra3`@rf@@rk€@rok @ro™ @rmj@@rnaÀ@rm•€@reC@r[ˆÀ@rUk @rQ% @rD­ @r7΀@r:’@@r@—@@rË@@qÈŠ @qB@qcªà@qRqÀ@q@Ú`@q7zÀ@qG @qkÅ`@qˆ~€@q•¢@@q [@q®¥@q´€@qµãà@q¾˜ @qÛ“à@r=@@rHQ`@rapÀ@rkó€@rg,@@rg¶`@rf2`@rf˜€@rc à@r`J @rd^€@rmb@rt£à@ryw€@r{ÆÀ@rxò@@ru3@@ruJÀ@ru|€@rnóà@rfÒÀ@rh8à@rqG@rl€@r9¤@@rà@r±À@qöÁà@r V@@r)`@rT @r P@qø¡ @qã²à@qÑcÀ@qÀýà@q¾i€@q² `@q—  @qwÞ`@qc«à@qXS @qFm€@q6Á`@q<ÿ@qHÌ€@qU|@@qTj @qP¶à@qRÅÀ@qJ`@q4|À@päù @p®[@pž£@@p¾¨à@péŠ@@põÆ @pö¬€@püV @q  @púì @pú7`@qÎÀ@qÿ@@q» @qè@qå @qéà@q>Þ @qbò`@qlY @qo @qƒ@@qбà@qã‰`@q×Ù@@q¸Ì @qÉ@qÿ7 @r Z€@rÉ€@rfÀ@rb @rñà@r@@r£`@rQà@ræ`@rÙ @r › @r"zÀ@r#ö`@r+*À@r4»À@r;M`@r=Ú€@r>Xà@r?5@@rBÑ @rGAÀ@rJ @rIÏ€@rG#€@rDA@@rCÉ@r?£à@r5«@r.C @r-§ @r à@qÎÉ`@qy¡@qDnà@q(ÿ @q&dà@q!h`@qÈ@q95À@q[S @qj@@qfS @qfBÀ@qrÖ @q€<`@q…²à@q„b @qŽì€@q¦á@qÍÎÀ@qõlà@r‰ @r"› @r(8 @r,Úà@r3†à@r4w@r1t@@r0ià@r9ìà@rLc€@ra@ri¬à@rf‹@rbÔ@ra  @r`<@r[N@@rW= @r[Ÿ@r^"à@rMà@r @qê@@qà`@q¾ @qÁî @qÁ© @q¾¾ @q»Ã@q¸¥@q²‰@qŸÝà@qgÀ@qÿ`@q”Xà@q‰ž @q.À@qrZ`@qk³@q`´ @qLã@@q8= @q9;`@q;Ñ@q:hÀ@q;“@@q6ÊÀ@q7Ì`@q0€@q°`@pÓ3@pºà@p¯Å@p—"@@p—hÀ@p§æ @pÕü€@p㌠@pÙx€@pÒüà@pÝö@pëÍ@pùp @pëà@pÞÿ @pç@píQÀ@q 5À@q I`@q<`@q-`@q9[`@q\1€@qm¯`@qxÑ@qˆ¥ @qŸá @qÉŒ€@qÓb`@qÞ@qâH @qáƒà@qã® @qéªà@qño @qö$€@qø‘À@qþ€@r¨ @qÿ¯@r@@r ``@r‰`@rŽ@@r÷@r%€@rš @r<@@r@r5à@r @ròÀ@rm€@rJ@r‚À@rÛà@r|@@rÄ @q¶· @qkÍ @q:§À@qåà@qb€@q ¿à@qñ`@q)Ä@@q:Û`@qAz @q<Õ @q5 @@q89@@q>oÀ@qJh @qJÏ€@qP(à@q\>`@qt) @q‚À@q§²À@qº!À@q˃À@qßÿ€@qî_`@qû@qüõ€@qüÁ @ré @r*¨@rAlÀ@rQD`@rNÚ @rN*€@rM£ @rPŸ€@rM¦@@rJ@rI>À@rK¹ @rB‹ @r  @qïà@qÐ|€@q¹KÀ@q— à@qxÌ@qh»@@qlÀ@q}và@qa`@qwa @qj}À@qh @qkã @qsà@qrÇ`@qi} @qWä @qNê @q9ÏÀ@q,w`@qG€@q¯@qÖ@q1@@q ¾À@pø@pøÊà@púI @pðL @påx @pÈ—@@p¡4@@pŠ¿@@p­à@p”½@p)à@pw€@pz’@p•<@@p´(`@pÊ*à@pÕŸ€@pÖe@pÙ@pÞÍ@@pÑx@pÜ:€@pÔ@@pÏî€@pÓÀ@páðÀ@q‚@@q*Ä @qLVà@qx†€@q”'à@q¤A`@q­€@q°.à@q­ú`@q¯ã€@q¶2@@q¿(@@qÄS @qÆÇ @qÌÛ @qÒ×À@qÖÉ@q×à@qØ” @qÜŒ@qáñÀ@qæôà@qèÀ@qçß@@qç'à@qè+@@që`@qêý`@qç @qâ’ @qãv@@qè¼`@qó7`@qõˆ€@qâР@q¢þ@@qbßÀ@q1U€@q° @q€@q ú @q •@qø@q `@qµ`@q€@qõ @pýî@@pûåÀ@qÚ @q‰ @q À@q ¿à@q!ôà@q*#À@q=ô€@qaf@q€€ @q‘œ€@q¯s @q³„ @qÄ@qÄ‘€@q×r@qÚU @r"À@rø @r)X@r0 @r/×à@r5€€@r4] @r0€@r*ˆÀ@r-!€@r41@@r.ÝÀ@rcÀ@qàæà@q¿š @q¢s@qÍ@@qdñ@qT¨ @q\$@@q_§à@qVáà@qJ߀@q?~`@q<^à@qE£€@qBoÀ@q9+ @q/Rà@q'@qÀ@qØ`@qlà@qá€@pý6 @püT @pífà@pßC€@pÒR`@pÖZ@@p×w@pز @pÓ`@p²xà@p•“À@p{X@p\… @pV( @pSO@p[1 @p{½À@p–Ô`@p¥À@p®H @p¸® @p¹€@p¸ À@p¯– @p±;`@p¶ @p¬ç @p¡>`@p ¼`@p¯@@pÝ“`@q  @qC¥@q_‰@qo±à@qw @qxg`@qv1@q{ À@q… `@qŽÐ @q“€`@q•é @q›`@q£°€@q¯eÀ@q·† @q¶8 @q²¹ @q°î`@q±m€@qµ?@@q¹ÝÀ@q¼T`@q¾¬`@q¾ž @q»= @q¸óÀ@q¶à@q»€@qÇ(€@qÎE`@qÅá@q™Ñ@q``@q&³À@pùö@pí@@pö8€@pù@@@pû\ @p÷Ë@@pñ @pê$@pè•@@pÛx€@pÊî @pŲ@@pËc@@pÖÏ`@pÜ$`@pÕ À@pË=`@pÍÊ @pæl @qïà@q7é @qTL@@qc! @qpó @q£€@qˆ5@q›6 @q¹# @q×—@@që…€@qûÒ€@r Íà@rvà@r¡@rí€@r Àà@rµÀ@rˆ @r xÀ@r ‹ @qêŠ@q×à@q¯¥ @q¬¬ @qÖ`@qˆx@@qt~À@qj `@qb@qV™À@qE·à@q4Ð @q*• @q(à@q&ñ€@q'À@qóà@qé@@q“ @pøÓ`@põ9À@péÇÀ@pâU@pÜ@@pØ…@pÑ¢à@pÈ  @p¿¹`@pº À@pº²@p½I`@pµc@@p¥Ö@@p”vÀ@p‡@@pà@p‹g@@p•>à@pžg@p™Ò€@p’q @pŠ&@@p…ñ@@p~­À@pxt @pvS@@p}à@pt€@p}ü@piÇ @pj@@p\€@pªå @pàa€@qç@q0ÊÀ@q:s @q,–@@q'2À@q-l@@qDÕ @qV'`@qdÚ @qnÀ@qt£à@qyé @qù`@qŒù@@q–@@qš³ @q–À@q´À@qÅ @q‘A@q¿ @q”ÇÀ@qš1@@qœ@@qšx`@q™å @q›¸`@q¡$ @q¤# @qœ@@qj¼À@q0v€@pêDÀ@p»à@p®,à@p¼íà@pÑÔ@pß @pÙö€@pÐÊ`@pÃ@@p²ó@p°õ @p¯Và@p¦Õ@@p¢=€@p¢6À@p¢x @p¡Íà@p›Ù@@p“µ€@p’§€@pj @p· À@pÔ`@pïêà@q£À@q1¤@@qL±à@qmà@q˜õ @q¶®`@qȬ@qØ÷ @qæÀ@qíü @qé˜@qëª@@qèƒ @qæP @qáD@@qàe @qʧ`@q¿2@@q±õ@@q¬ÅÀ@q™ö @q´dà@qšH @qˆ#À@qv¸ @qkk@qf €@qZŒà@qEl@q.§à@q_`@qXÀ@q™à@q ø€@qÏ@@pôú`@påÏ@@pÝ™@pØlÀ@pÒù€@pËÝÀ@pÉJÀ@p΀@pÏ8 @pËà@pÀø@p¹Ä@@p´A @p±ƒ @p³:@p³L@p­ã@p¨Ø @p­f @p­ýÀ@p± @pªÀ@pŠÀ@p’@@plÀ@p^¶à@pR<€@pH¾ @pD@pA4 @pF À@pF• @pC`@pJÝ @pg~`@p—8 @pÉH@@pû²@q‡@qÈ @q×€@pñ`@pöQ`@q¬€@q!¿`@q4ƒ€@qC`@qJ˜€@qM¼€@qQ€@qXû @qev@@qr`@qxÀ@qw—@qv[@qyt @qp‹ @qo– @qv¥€@q}@€@q}H`@q@@qy@@qyÚ @qgSà@q2õ @pô©À@p¸$à@p”«@@pŒzà@pœa @p°H@@p¾ú@p¾³€@p¬K@@p˜Z @p„2 @pw|À@pz#€@p|p @p{ï€@pwS @ps@@po“À@poHÀ@pq6€@pqƒ`@pps`@poä@pr@p‚² @p y@@pÏ @qþ@@qCF @qzç`@q—´€@qª$à@q³à@q»2`@q½þ€@qÁ@@qþ@qÁD@q¼(à@q¿Á@qÁ¶€@qÁ«€@q©±€@q?@q`@q‘: @qœ@@q•·€@qvÔ@@qZÏ@qJ¹À@q=¾À@qGóà@qEùÀ@q9ö @q¡€@qæ @pú„à@pö`@pôà@pìÅ`@páEÀ@pÕ« @pË¿À@pð @p¼ @p½ó€@p¼} @pĽ @pÉà@pÉ? @pÄC @p¾" @p¸n@p¸À@p·º€@p·ðà@p±•À@p¬-€@p©à@pªà@p¨MÀ@p›²`@pÀ@pvÊ@pa÷ @pTU@pL•@@pF€@pB(@p;ä@@p7—@p8™€@p7®@@p<­@@pRŸ@psúÀ@p’·à@pµp@pÉ-@@pÕ±`@pÒJÀ@pÎú@pÇ¡ @pÓ€@pä¿`@pí¹à@pø^ @qÒà@qe€@qñ@q"Ã@@q,ä@q5]à@q;ªà@q>Ñ@qÀ@pT·€@pn?à@p¸h€@q~À@q; @qRÉà@qTM @qQú€@qdÜ€@q~Ö @q„0 @q•€@q˜>à@q—@@q—€@qœúÀ@q¢Ÿ@q§U€@q¨Ú @q¤" @q†Ü`@q†¾ @qu€@qk*@qC» @q)œÀ@q`@q <€@q± @q‹@@qwÀ@q ¡ @pöê€@pì•€@pç±@pä7@pÞkÀ@pÚ½À@pϾ`@pĘà@p½»@pº…€@p·Ê€@p¶B`@p¶t @pµûÀ@p·Á@@pµ€à@p°ü`@p°ž`@p²`@p±™ @p­í€@p¦`@p›ÙÀ@p‘m @p‡kà@p„; @p€(à@pzò @pq. @phu @p_ó€@pZFà@pWà@pV€@pSÚ @pP†€@pIz@p?~À@p3€À@p%óà@p!+@@p,ãÀ@p3l@p<#€@pF@@p\¶ @pwÇ @px£`@pqÙ@@pvÉ`@p~O@pŠP`@pÞ`@pÉ–à@pçÀ@pý3@@q¦ @q« @pëªà@p݉à@pÊ@@pµS€@p§— @p J@@p¡"`@p¨à@pª» @p¦º@p•Ò@pr‡@@pMê@p8!`@p4 @p:Ó @pOD @pdô€@pjëà@pcÚ`@pS|€@pí @p¶ @p™À@p½@p@ÅÀ@p\@pÂÈ@pâU @q¾€@qä @q¹À@q7à@qDà@q -À@qB€@q9HÀ@q'k @q&  @pñÖ`@q ÿ@@q@@qÄÀ@qb @pýê`@pé‰`@pÍÕ`@p¶$@@p¡€@p’à@p‡À@p…;@pˆnÀ@p @p— À@p›`€@p @p›SÀ@pš€@p˜Ë@@p—Üà@p—¨à@p˜‘ @p—?@p•ÌÀ@p’”`@p¡à@pŒˆ @p‡Q @p€á@pu8À@peíÀ@pW£@pLw @pClà@p< @p6À`@p4æ€@p2Ì@@p4ì@@p7c@@p7öÀ@p6@@p/§@p'– @pÇ @p‹@@p eÀ@p`@pñÀ@p €@pq @pR@p%q€@p)XÀ@p$6À@psÀ@oÿà@@oÕ @@o¯Zà@oœž@@o¯Ï@@oßÅÀ@pS@p7ËÀ@pHõ€@pQÅÀ@p8î @p;ýÀ@p+Ú @pþ@pÜ€@pd@@p@oì« @oçÈ @oã€@oÚO@@o×<À@oÕ @o×L@@oÝ×à@oÝJ€@oÙA@oÎÓ@oÁØÀ@o¦Yà@oŠ8À@omV@oQÜ @o7]`@o¡@o@@nêž@@nã@né @o  @oe`@o`à@o ó@@nðØ@@nâ¯@@néÉ@@o À@obp€@oÄ@@oãþ @pv@@p'@@oÅÝ @oŒï`@oMo@@oG¢ @ocú€@o®šà@p@oöÞà@p*¦@@pkqà@pz1à@pˆm@@p›«À@p­ @p±» @p±L€@p½yà@p×Ò€@p®‰@pÕÏà@pôA @q @q…@pøÕ@@pês@pÒvà@p´£@@p›¬à@pˆH@@pzË@puà@pt*@@pxŠ @p€`@p„1À@pˆ @p†²`@pƒØ`@pÙ @p{} @pvP@@poÞ`@pj¦€@pf¹@pbå@p_=@@p] @p[s€@pW_@@pP´@pI @p@Õ`@p9 @p2<@@p+¶À@p'ñ@p&R€@p$Û€@p$ˆ@@p&‰@@p$@p+À@pD@p¯@p¼ @pí @pÀ@pÆÀ@pØ @pW@@p%@@p*ø @p.#€@p,–€@p%n@@p“@@p’ @oÝ @o²ý@@o“Û`@o‚Î @oß @oŠÉ€@o¢ `@oºð @oÏxÀ@oµ\@@oêUÀ@oî' @oíS@@oèö @oàï`@oÖ6@oË®à@oÄ@@@o¾ @o¼7@@o¼Y @o¾O@@o½ûà@o¸l @o­À@o êà@oˆ @oj3@@oNèà@o6Æ @oÎ`@nÿ»@@nç@@n΀@n¶(@n¥é @n£Ê`@n¦™ @n¬# @n¬Ø`@n¢‘À@n’@n‚‰ @n‚: @nš @nÔzÀ@o!§€@os @odM @oµ=`@o•j @oW©€@o$2€@nî @nÉë€@nÄùà@nØ®@@oÀ@o8°€@okàÀ@ožÀ@oÎK @o­A`@oïÅà@põ@p7À@pV`@psÓ @pò@pjÀ@pކÀ@p«Ë@@pÇ»€@pãÍ @pù¿ @pèŽ@@pÔ @p¾ú @p§»@p‘õ€@p€$ @p\É€@pRú@pR-€@pWœà@p^2à@pbMà@pn½`@pkØà@pg @pLÊà@p;À€@p.h@@pCå@@p:Ì @p5%@p1 @p.¥@@p/c @p1'€@p2ÄÀ@p3u`@p3„@p3À@p1µ@@p/S@p+p`@p'ÎÀ@p$û@@p"ä@@p YÀ@pK€@p/@@p] @pð@@ps @p\à@p À@pò@@p1@@p ý@@p 7À@pV@@pÙ@@p¾À@oó`@oãà@oÐÔ @oaË @o¢øÀ@oˆm @oo¦@o^`@oRã @oQ)€@o šà@o.Ìà@oCm @oY÷@@o™@@o¤ @o©Zà@oª> @o¦ç@@oŸ$@o•*`@oaÀ@oTeà@oPf@o1@oué@@oiô@@oVÑ @o>ã€@o%Š@@o šÀ@nò±À@nÛA @nü€@n­à@n•ÿà@nH @nl²@@nd@€@n[ô`@nSi @nIÙ @n>c @n3©€@n.{€@n-®@@n>¿ @n[ß`@n– @ntS`@nžì`@nºîÀ@nþÕ@n⊠@nÕz @n¾þ@n”EÀ@ntÀ@nj @nw½ @n˜† @n´D @nÇ3À@nãü @nýÀ@nÈ¥ @nõ¹ @o$û @ohi @o¾s€@p†@@p@ó@pW`@p>û @pd€@p€ü€@pšW@@p§À@p™' @pqà@pWÞÀ@pG²À@p:ð @p.Ñ€@p%@@p'À@p´ @pj@pîÀ@p$œÀ@pBZ@pE€@pDó @p@»@@p9”@p0F€@p9€@pìÀ@p `@pò€@p ‹€@p PÀ@pºà@pÊÀ@p À@pb@@p º`@p! @@p @p€@pûÀ@p|€@p •@@p@@p¬€@p^€@pé@oÿ@oý€@oÏ0`@oñ @oãT@@oÑ`@o½þ@oª[à@o™’à@o‰ë@@o~½à@o>ì @o0B@o&Ý @o @@o„ @o£@@o;@@nýÚ @nûÛ@nþhÀ@o`@o @o @@o“à@o €@o%`@o(@o'ÄÀ@o!` @o(@@oìÀ@o Š`@oä€@nþf`@nù0 @nñ€À@nç}`@nè€@nÓë`@nÀ @n©n@@n•I€@n€h@@nmU`@nXÅ @nF˜€@n3º @n*ž@n@n$€@n ¢À@mþïà@møƒ @mðzà@mòª`@mû¹ @m׋ @mÝV@mäþ€@mò@@m÷çÀ@nJ†À@n?‘ @n=€@nA @n4Š @n@@n @@n$‹€@n0ä€@n;­À@nN¼ @nVp@@nS@@nSZÀ@n_" @n9$ @nkFà@nžvà@nädÀ@o>W@@o¬·@oí @ojH€@o° @oäÙ @pó @p ëà@p *@p¤@@p4`@oö&À@oš`@o’C`@o‹`à@o‰€@o® @o”`@o®k @oÁð€@oÖ–à@oç6 @pÀ@pQ€@p ’À@pkÀ@p‰@@oÆ1@o¸ @o®V@@o§A€@o£èÀ@o£n`@o¤À@oßë@@oåEà@oç@ @oæ¸ @o⊠@oÚæ @oÑnÀ@oÂÖà@o´;@@oª!@@ovbÀ@ol @obÄ@@o]<@@oYü@oT @ow@om²€@odNà@oYå@oO)@@oÍ@o6Z@o*É@@nùk@nó™@@nîMÀ@néMà@nä’€@nãà@nãâà@nãNÀ@ná @nÞŒ`@nÛ:À@n×ú`@nÕž`@nÔ)`@nÓ€@nÑ À@nÉ¢ @nÁ|`@n¹`@n¯†€@n¤÷@@nÀ@n–À@n‘\@@nX@@nŒà@n…à@n|T @nƒ3@@ny @nlr @n\¡à@nKÞ @n9­@n( @n!à@nÄ€@mùkÀ@mî¿`@mäé @mÛó€@mÖL@@mÎp€@mÅOÀ@m¼éà@mÂ# @mÊF`@mÐA`@mÕJÀ@mÛÉ @mà8`@mâS @mÞ~À@má4À@mäû@më6 @mìÀ@mñß`@mù>@mõ«@@mðè@@mðÊ`@mì`@m׸@mЩ@mÚyÀ@mºÛ @mìD@@n¬@nK @n‚÷€@nÅèÀ@nBÀ@na*À@nƒ*€@n¯‡à@nÜ9 @nîÇ@@nýƒ@or @oY@@oŸ@@o‹ @nçQ @nï†@nú @oíà@o[À@o)Îà@o9_`@oH6€@oUP @o_‚@of¤à@ok>À@olJ@oi*@oe€@o`à`@o]:€@oY À@oU³@@oS+ @oQ@@oP×À@o‡Z`@o‚ðà@o~ @oyZ€@oq{ @o7y€@o-€@o&@@oô@@o‰`@oÞà@o~€@nøz@nðã€@nèÆà@nߨ@nÚõ @nÙb€@nØ3@@nÖ @nЪ @nÊA @nÇÆ@@nÉ£À@nË @nÊÀÀ@nÊ" @nÊË`@nÊz@nÇW@@nœ`@n¼ê @nµ‚`@n¬k @n¢ð @nš€@nâ@nˆ<À@nã @nvbà@nkÀ@ndm @n`n@@n\µà@nW£ @nQš @nLŸ€@nJ&`@nJz@nI+ @nE¯à@nA?@n:r @n1ƒÀ@n&º @n/Ô€@n"`@n)@nœÀ@mü‰`@mðu @måe`@mÚÃ@mÔWÀ@mÎh€@mÊ1@m¼á`@m·÷À@mµà @m´~À@m¶E@m´ü @m±Û@@m»£ @m½ú @m¼ÏÀ@m¼‘€@mÓ¦@@mÙì @mÛ”€@mÙ˜à@mÙF€@mÔØ@mÌ)à@m‚À@m·”€@m´“€@m´¾À@mº¡ @mÆrÀ@mÑï@@m½»à@mØNÀ@mûH€@nªà@mÑîà@máb @mñ…@@nÌ @n`@nA@n+³ @n7æà@nD`@nP–@@n]€À@nj&`@nw­à@n† @n”@@n¢ @n®]@@n¹&`@nÃ`@nË·À@nÓLÀ@nÚüà@náÙ€@nçZ @nëÂ`@nïÔ`@nòÂÀ@nõä @nù @nüÓ@@o¢À@oòÀ@oÀ@o3x@@nÿÖà@nûÐ`@n÷Î@nów@@nîÀ@néô @nä¡@nÞÐÀ@nØý @nÓs @nÎ!À@nɾ@@nÄ»@nÀ @n¼þ @n» @@n¹– @n· @nµ¾À@nµ @n³qà@n±t@n°@n¯·`@n®à@n­l @n­ @nªt€@n¥!à@nž‹ @n— @nŽDÀ@n„šÀ@nz@nrõ @nl€@nd(€@n[‘`@nSŸ@nMEà@nHs€@nCM`@n<•@@n63`@n1{`@n-Ú @n*²à@n( @n%® @n"…€@nfà@n½€@nƒ @n Ç€@n@à@n‚À@m÷>@mî3`@måaà@mÝ`@móÀ@mí|À@mé?€@må» @máw@@mÝå€@mØ— @mÒ¡`@mÑ=@@mÑÚÀ@mÑé€@mѵ€@mÐ@ @mÏœ€@mΠ@mË—€@mÊ.`@mÈï`@mÉ @mÉ À@mÈ·@mÅãà@mÂo`@m¾u`@mºÐÀ@m·á@@mµ!À@mµ– @m¶æ`@mº¼`@mš<@@m¡v@m¯¹€@mÀí @m¶’`@mÁ¥à@mʺ€@mÓY @mÛê@mãùà@m츀@mõï @mÿÈ€@n &@@n8@n¬ @n(Ú @n2Ý@n=$€@nGÀ@nP…À@nYÀ@na)à@nh0@nm6À@nq~à@nv? @n|@@n‚f€@nˆÒ`@nޏ @n“Ùà@n˜ùà@nžã@@n¢ÏÀ@n¦ä`@n©0@@nªv@@n«2à@n«L @n«?€@nª‰€@n§ëà@n¤Â@@n£@@n¢À@n "@@nk@@nšà@n–“@@n’î @n @nŽ@nŒ·€@nŠe @nˆ @n…­ @nƒ­À@nÿ@@n€`@n~'@n|x @n{@@nyçÀ@ny.@nwÏ`@ntû€@npê€@njñ`@neËà@n_RÀ@nYÏÀ@nU'`@nQ @nM¯`@nJ@@nFhà@nBà@@n?=@n;‰À@n7Ê@@n4] @n1W @n.=@n+@@n'‘ @n#ñ`@n 9 @nÎ @nà@n0 @n3 @n @@n @n³@@mýÀ@møoà@mó%@mí¬€@mèXà@mã0à@mÞG @mÙœ`@mÕ@@mÏß@@mÊ?`@mÅ`@m¿t @mº( @m´à@m«Å @m¡`@m˜V@@m‘4 @mŒG @m‰› @m‰~`@mŠÌ€@mŒÁÀ@mŽE@@mòà@mÑÀ@m’+ @m’”À@m’¿€@m“?`@m”% @m”„€@m•ç€@m˜è`@mŸCà@mª³à@mÜÓ€@màß`@måc@mè×€@mì= @mð@móˆ@möÇÀ@múa @mþ @n¡ @n1 @n 7@@n < @nöÀ@nS@@n @n² @nÍà@n “à@n#@n%w@n'Π@n*^ @n-@n/Ã@@n2›@@n5à@n7_€@n9` @n;;`@n=%€@n>zÀ@n?ëÀ@n@÷ @nB?@nCB@@nCÝ@@nD{€@nE.`@nEâ`@nFUÀ@nF×À@nFÓ @nF® @nF„À@nFj`@nF@`@nEä`@nE„`@nE>@@nDßÀ@nD_@nCÏ@nCc @nCà@nB°@@nBe @nAø`@nA À@nAH`@n@0 @n?x@@n>ï`@n=X @n;ŸÀ@n9ú@n9@n7˜€@n6 @n4õ@@n3˜€@n2à@n0à@n.Ú @n,é@n*ò@@n(ú@@n&ÿ@@n%  @n#@@n þ`@nÛ@nÂ@@nyÀ@n%€@nœ@nõÀ@n; @n u€@n Û@n5€@n|@n¼`@n @mûùÀ@mùž@mö@@mó à@mðÈà@míì@më`@mè# @må€@mâ2@mßd€@mÜ} @mÙò€@m×ÑÀ@mÖà@mÔº @mÓÃÀ@mÒô @mÒ^ @mÑð @mÑŠ @mÑ;@mÐ×€@mЃ@@mÏæ @mÏl@@mР@mÐI@m϶€@mÐï`@mÒJ€@mÖ_`@mÚi`cf-python-1.3.2/test/Comparison.py0000600000175000017500000001620412272671127017271 0ustar daviddavid00000000000000import cf import datetime import numpy import os import time def test(): start_time = time.time() print '----------------------------------------------------------' print 'cf.Comparison' print '----------------------------------------------------------' chunksize = cf.CHUNKSIZE() cf.CHUNKSIZE(17) # ---------------------------------------------------------------- # cf.eq # cf.ne # cf.ge # cf.gt # cf.le # cf.lt # cf.wi # cf.wo # cf.set # ---------------------------------------------------------------- d = cf.Data([[1., 5.], [6, 2]], 'days since 2000-12-29 21:57:57') assert((d==cf.eq(cf.dt('2001-01-03 21:57:57'))).equals(cf.Data([[False, True], [False, False]]))) assert((d==cf.ne(cf.dt('2001-01-03 21:57:57'))).equals(cf.Data([[True, False], [True, True]]))) assert((d==cf.ge(cf.dt('2001-01-03 21:57:57'))).equals(cf.Data([[False, True], [True, False]]))) assert((d==cf.gt(cf.dt('2001-01-03 21:57:57'))).equals(cf.Data([[False, False], [True, False]]))) assert((d==cf.le(cf.dt('2001-01-03 21:57:57'))).equals(cf.Data([[True, True], [False, True]]))) assert((d==cf.lt(cf.dt('2001-01-03 21:57:57'))).equals(cf.Data([[True, False], [False, True]]))) assert((d==cf.wi(cf.dt('2000-12-31 21:57:57 21:57:57'), cf.dt('2001-01-03 21:57:57'))).equals(cf.Data([[False, True], [False, True]]))) assert((d==cf.wo(cf.dt('2000-12-31 21:57:57 21:57:57'), cf.dt('2001-01-03 21:57:57'))).equals(cf.Data([[True, False], [True, False]]))) assert((d==cf.set([cf.dt('2000-12-31 21:57:57 21:57:57'), cf.dt('2001-01-03 21:57:57')])).equals(cf.Data([[False, True], [False, True]]))) print 'cf.eq passed' print 'cf.ne passed' print 'cf.ge passed' print 'cf.gt passed' print 'cf.le passed' print 'cf.lt passed' print 'cf.wi passed' print 'cf.wo passed' print 'cf.set passed' # ---------------------------------------------------------------- # cf.year # cf.month # cf.day # cf.hour # cf.minute # cf.second # ---------------------------------------------------------------- d = cf.Data([[1., 5.], [6, 2]], 'days since 2000-12-29 21:57:57') assert((d==cf.year(2000)).equals(cf.Data([[True, False], [False, True]]))) assert((d==cf.month(12)).equals(cf.Data([[True, False], [False, True]]))) assert((d==cf.day(3)).equals(cf.Data([[False, True], [False, False]]))) d = cf.Data([[1., 5], [6, 2]], 'hours since 2000-12-29 21:57:57') assert((d==cf.hour(2)).equals(cf.Data([[False, True], [False, False]]))) d = cf.Data([[1., 5], [6, 2]], 'minutes since 2000-12-29 21:57:57') assert((d==cf.minute(2)).equals(cf.Data([[False, True], [False, False]]))) d = cf.Data([[1., 5], [6, 2]], 'seconds since 2000-12-29 21:57:57') assert((d==cf.second(2)).equals(cf.Data([[False, True], [False, False]]))) d = cf.Data([[1., 5.], [6, 2]], 'days since 2000-12-29 21:57:57') assert((d==cf.year(cf.ne(-1))).equals(cf.Data([[True, True], [True, True]]))) assert((d==cf.month(cf.ne(-1))).equals(cf.Data([[True, True], [True, True]]))) assert((d==cf.day(cf.ne(-1))).equals(cf.Data([[True, True], [True, True]]))) d = cf.Data([[1., 5], [6, 2]], 'hours since 2000-12-29 21:57:57') assert((d==cf.hour(cf.ne(-1))).equals(cf.Data([[True, True], [True, True]]))) d = cf.Data([[1., 5], [6, 2]], 'minutes since 2000-12-29 21:57:57') assert((d==cf.minute(cf.ne(-1))).equals(cf.Data([[True, True], [True, True]]))) d = cf.Data([[1., 5], [6, 2]], 'seconds since 2000-12-29 21:57:57') assert((d==cf.second(cf.ne(-1))).equals(cf.Data([[True, True], [True, True]]))) print 'cf.year passed' print 'cf.month passed' print 'cf.day passed' print 'cf.hour passed' print 'cf.minute passed' print 'cf.second passed' # ---------------------------------------------------------------- # cf.dteq # cf.dtne # cf.dtge # cf.dtgt # cf.dtle # cf.dtlt # ---------------------------------------------------------------- d = cf.Data([[1., 5.], [6, 2]], 'days since 2000-12-29 21:57:57') assert((d==cf.dteq('2001-01-03 21:57:57')).equals(cf.Data([[False, True], [False, False]]))) assert((d==cf.dtne('2001-01-03 21:57:57')).equals(cf.Data([[True, False], [True, True]]))) assert((d==cf.dtge('2001-01-03 21:57:57')).equals(cf.Data([[False, True], [True, False]]))) assert((d==cf.dtgt('2001-01-03 21:57:57')).equals(cf.Data([[False, False], [True, False]]))) assert((d==cf.dtle('2001-01-03 21:57:57')).equals(cf.Data([[True, True], [False, True]]))) assert((d==cf.dtlt('2001-01-03 21:57:57')).equals(cf.Data([[True, False], [False, True]]))) assert((d==cf.dteq(2001, 1, 3, 21, 57, 57)).equals(cf.Data([[False, True], [False, False]]))) assert((d==cf.dtne(2001, 1, 3, 21, 57, 57)).equals(cf.Data([[True, False], [True, True]]))) assert((d==cf.dtge(2001, 1, 3, 21, 57, 57)).equals(cf.Data([[False, True], [True, False]]))) assert((d==cf.dtgt(2001, 1, 3, 21, 57, 57)).equals(cf.Data([[False, False], [True, False]]))) assert((d==cf.dtle(2001, 1, 3, 21, 57, 57)).equals(cf.Data([[True, True], [False, True]]))) assert((d==cf.dtlt(2001, 1, 3, 21, 57, 57)).equals(cf.Data([[True, False], [False, True]]))) d = cf.dt(2002, 6, 16) assert(not (d == cf.dteq(1990, 1, 1))) assert(d == cf.dteq(2002, 6, 16)) assert(not(d == cf.dteq('2100-1-1'))) assert(not (d == cf.dteq('2001-1-1') & cf.dteq(2010, 12, 31))) d = cf.dt(2002, 6, 16) assert(d == cf.dtge(1990, 1, 1)) assert(d == cf.dtge(2002, 6, 16)) assert(not (d == cf.dtge('2100-1-1'))) assert(not (d == cf.dtge('2001-1-1') & cf.dtge(2010, 12, 31))) d = cf.dt(2002, 6, 16) assert(d == cf.dtgt(1990, 1, 1)) assert(not (d == cf.dtgt(2002, 6, 16))) assert(not (d == cf.dtgt('2100-1-1'))) assert(d == cf.dtgt('2001-1-1') & cf.dtle(2010, 12, 31)) d = cf.dt(2002, 6, 16) assert(d == cf.dtne(1990, 1, 1)) assert(not (d == cf.dtne(2002, 6, 16))) assert(d == cf.dtne('2100-1-1')) assert(d == cf.dtne('2001-1-1') & cf.dtne(2010, 12, 31)) d = cf.dt(2002, 6, 16) assert(not (d == cf.dtle(1990, 1, 1))) assert(d == cf.dtle(2002, 6, 16)) assert(d == cf.dtle('2100-1-1')) assert(not (d == cf.dtle('2001-1-1') & cf.dtle(2010, 12, 31))) d = cf.dt(2002, 6, 16) assert(not (d == cf.dtlt(1990, 1, 1))) assert(not (d == cf.dtlt(2002, 6, 16))) assert(d == cf.dtlt('2100-1-1')) assert(not (d == cf.dtlt('2001-1-1') & cf.dtlt(2010, 12, 31))) print 'cf.dteq passed' print 'cf.dtne passed' print 'cf.dtge passed' print 'cf.dtgt passed' print 'cf.dtle passed' print 'cf.dtlt passed' cf.CHUNKSIZE(chunksize) time_elapsed = (time.time() - start_time)/60.0 print print '---------------------------------------------------------------------------' print 'All cf.Comparison tests passed for cf version', cf.__version__ print 'Running from', os.path.abspath(cf.__file__) print 'Time elapsed: %f minutes' % time_elapsed print '---------------------------------------------------------------------------' print #--- End: def if __name__ == "__main__": test() cf-python-1.3.2/test/test_Data.py0000644000175000017500000015130212761345321017073 0ustar daviddavid00000000000000import cf import numpy import os import itertools import time from operator import mul import unittest import inspect def reshape_array(a, axes): new_order = [i for i in range(a.ndim) if i not in axes] new_order.extend(axes) b = numpy.transpose(a, new_order) new_shape = b.shape[:b.ndim-len(axes)] new_shape += (reduce(mul, b.shape[b.ndim-len(axes):]),) b = b.reshape(new_shape) return b #--- End: def class DataTest(unittest.TestCase): filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test_file.nc') chunk_sizes = (17, 34, 300, 100000)[::-1] original_chunksize = cf.CHUNKSIZE() test_only = () # test_only = ('NOTHING!!!!!') # test_only = ['test_Data__asdatetime__asreftime__isdatetime'] # test_only = ('test_Data__collapse_UNWEIGHTED_MASKED',) # test_only = ('test_Data__collapse_UNWEIGHTED_UNMASKED',) # test_only = ('test_Data__collapse_WEIGHTED_UNMASKED',) # test_only = ('test_Data__collapse_WEIGHTED_MASKED',) # test_only = ('test_Data_any',) # test_only = ('test_Data_mean',) # test_only = ('test_Data_sums_of_weights',) # test_only = ('test_Data_sample_size','test_Data_sd_var') # test_only = ('test_Data_sd_var',) # test_only = ('test_Data___setitem__',) # test_only = ('test_Data_ceil', 'test_Data_floor', 'test_Data_trunc', 'test_Data_rint') # test_only = ('test_Data_array', 'test_Data_varray', 'test_Data_dtarray',) # test_only = ('test_dumpd_loadd',) # test_only = ('test_Data_year_month_day_hour_minute_second',) # test_only = ('test_Data_BINARY_AND_UNARY_OPERATORS',) # test_only = ('test_Data_clip',) # Variables for _collapse a = numpy.arange(-100, 200., dtype=float).reshape(3, 4, 5, 5) w = numpy.arange(1, 301., dtype=float).reshape(a.shape) w[-1, -1, ...] = w[-1, -1, ...]*2 w /= w.min() ones = numpy.ones(a.shape, dtype=float) ma = numpy.ma.arange(-100, 200., dtype=float).reshape(3, 4, 5, 5) ma[0, :, 2, 3] = numpy.ma.masked ma[1, 2, 3, :] = numpy.ma.masked ma[0, 3, :, 3] = numpy.ma.masked ma[:, 1, 4, 4] = numpy.ma.masked mw = numpy.ma.array(w) mones = numpy.ma.array(ones, mask=ma.mask) axes_combinations = [axes for n in range(1, a.ndim+1) for axes in itertools.permutations(range(a.ndim), n)] def test_Data___contains__(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data([[0.0, 1, 2], [3, 4, 5]], units='m') self.assertTrue(4 in d) self.assertFalse(40 in d) self.assertTrue(cf.Data(3) in d) self.assertTrue(cf.Data([[[[3]]]]) in d) value = d[1, 2] value.Units *= 2 value.squeeze(0) self.assertTrue(value in d) self.assertTrue(numpy.array([[[2]]]) in d) # print "pmshape =", d._pmshape cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data___setitem__(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) for hardmask in (False, True): a = numpy.ma.arange(3000).reshape(50, 60) if hardmask: a.harden_mask() else: a.soften_mask() d = cf.Data(a.filled(), 'm') d.hardmask = hardmask for n, (j, i) in enumerate(((34, 23), (0, 0), (-1, -1), (slice(40, 50), slice(58, 60)), (Ellipsis, slice(None)), (slice(None), Ellipsis), )): n = -n-1 for dvalue, avalue in ((n, n), (cf.masked, numpy.ma.masked), (n, n)): message = "cf.Data[%s, %s]=%s failed" % (j, i, dvalue) d[j, i] = dvalue a[j, i] = avalue self.assertTrue((d.array == a).all() in (True, numpy.ma.masked), message) self.assertTrue((d.mask.array == numpy.ma.getmaskarray(a)).all(), message) #--- End: for a = numpy.ma.arange(3000).reshape(50, 60) if hardmask: a.harden_mask() else: a.soften_mask() d = cf.Data(a.filled(), 'm') d.hardmask = hardmask (j, i) = (slice(0, 2), slice(0, 3)) array = numpy.array([[1, 2, 6],[3, 4, 5]])*-1 for dvalue in (array, numpy.ma.masked_where(array < -2, array), array): message = 'cf.Data[%s, %s]=%s failed' % (j, i, dvalue) d[j, i] = dvalue a[j, i] = dvalue self.assertTrue((d.array == a).all() in (True, numpy.ma.masked), message) self.assertTrue((d.mask.array == numpy.ma.getmaskarray(a)).all(), message) #--- End: for # print 'hardmask =',hardmask,', pmshape =', d._pmshape #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_all(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data(numpy.array([[0] * 1000])) self.assertTrue(not d.all()) d[-1,-1] = 1 self.assertFalse(d.all()) d[...] = 1 self.assertTrue(d.all()) d[...] = cf.masked self.assertTrue(d.all()) cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_any(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data(numpy.array([[0] * 1000])) self.assertFalse(d.any()) d[-1,-1] = 1 self.assertTrue(d.any()) d[...] = 1 self.assertTrue(d.any()) d[...] = cf.masked self.assertFalse(d.any()) cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_array(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return # Scalar numeric array d = cf.Data(9, 'km') a = d.array self.assertTrue(a.shape == ()) self.assertTrue(a == numpy.array(9)) d[...] = cf.masked a = d.array self.assertTrue(a.shape == ()) self.assertTrue(a[()] is numpy.ma.masked) # Non-scalar numeric array b = numpy.arange(10*15*19).reshape(10, 1, 15, 19) for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data(b, 'km') a = d.array a[0,0,0,0] = -999 a2 = d.array self.assertTrue(a2[0,0,0,0] == 0) self.assertTrue(a2.shape == b.shape) self.assertTrue((a2 == b).all()) self.assertFalse((a2 == a).all()) d = cf.Data([['2000-12-3 12:00']], 'days since 2000-12-01', dt=True) a = d.array self.assertTrue((a == numpy.array([[2.5]])).all()) cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_clip(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return c0 = -53.234 c1 = 34.345456567 a = self.a + 0.34567 ac = numpy.clip(a, c0, c1) for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data(a, 'km') e = d.clip(c0, c1) self.assertTrue((e.array == ac).all()) e = d.clip(c0*1000, c1*1000, units='m') self.assertTrue((e.array == ac).all()) d.clip(c0*100, c1*100, units='10m', i=True) self.assertTrue(d.allclose(ac, rtol=1e-05, atol=1e-08)) #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_dtarray(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return # Scalar array for d in [cf.Data(11292.5, 'days since 1970-1-1'), cf.Data('2000-12-1 12:00', dt=True)]: a = d.dtarray self.assertTrue(a.shape == ()) self.assertTrue(a == numpy.array(cf.dt('2000-12-1 12:00'))) a = d.array self.assertTrue(a.shape == ()) self.assertTrue(a == 11292.5) a = d.dtarray a = d.array self.assertTrue(a.shape == ()) self.assertTrue(a == 11292.5) # Non-scalar array for d in [cf.Data([[11292.5, 11293.5]], 'days since 1970-1-1'), cf.Data([['2000-12-1 12:00', '2000-12-2 12:00']], dt=True)]: a = d.dtarray a = d.array self.assertTrue((a == [[11292.5, 11293.5]]).all()) a = d.dtarray a = d.array self.assertTrue((a == [[11292.5, 11293.5]]).all()) a = d.dtarray self.assertTrue((a == numpy.array([[cf.dt('2000-12-1 12:00'), cf.dt('2000-12-2 12:00')]])).all()) #--- End: def def test_Data__asdatetime__asreftime__isdatetime(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data([[1.93, 5.17]], 'days since 2000-12-29') self.assertTrue(d.dtype == numpy.dtype(float)) self.assertFalse(d._isdatetime()) d._asreftime(i=True) self.assertTrue(d.dtype == numpy.dtype(float)) self.assertFalse(d._isdatetime()) d._asdatetime(i=True) self.assertTrue(d.dtype == numpy.dtype(object)) self.assertTrue(d._isdatetime()) d._asdatetime(i=True) self.assertTrue(d.dtype == numpy.dtype(object)) self.assertTrue(d._isdatetime()) d._asreftime(i=True) self.assertTrue(d.dtype == numpy.dtype(float)) self.assertFalse(d._isdatetime()) # print "pmshape =", d._pmshape cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_ceil(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for x in (1, -1): a = 0.9 * x * self.a c = numpy.ceil(a) for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data(a) d.ceil(i=True) self.assertTrue(d.shape == c.shape) self.assertTrue((d.array == c).all()) #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_floor(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for x in (1, -1): a = 0.9 * x * self.a c = numpy.floor(a) for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data(a) d.floor(i=True) self.assertTrue(d.shape == c.shape) self.assertTrue((d.array == c).all()) #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_trunc(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for x in (1, -1): a = 0.9 * x * self.a c = numpy.trunc(a) for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data(a) d.trunc(i=True) self.assertTrue(d.shape == c.shape) self.assertTrue((d.array == c).all()) #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_rint(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for x in (1, -1): a = 0.9 * x * self.a c = numpy.rint(a) for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data(a) d.rint(i=True) self.assertTrue(d.shape == c.shape) self.assertTrue((d.array == c).all()) #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_round(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for decimals in range(-8, 8): a = self.a + 0.34567 c = numpy.round(a, decimals=decimals) for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data(a) d.round(decimals=decimals, i=True) self.assertTrue(d.shape == c.shape) self.assertTrue((d.array == c).all()) #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_datum(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data(5, 'metre') self.assertTrue(d.datum() == 5) self.assertTrue(d.datum(0) == 5) self.assertTrue(d.datum(-1) == 5) for d in [cf.Data([4, 5, 6, 1, 2, 3], 'metre'), cf.Data([[4, 5, 6], [1, 2, 3]], 'metre')]: self.assertTrue(d.datum(0) == 4) self.assertTrue(d.datum(-1) == 3) for index in d.ndindex(): self.assertTrue(d.datum(index) == d.array[index].item()) self.assertTrue(d.datum(*index) == d.array[index].item()) #--- End: for d = cf.Data(5, 'metre') d[()] = cf.masked self.assertTrue(d.datum() is cf.masked) self.assertTrue(d.datum(0) is cf.masked) self.assertTrue(d.datum(-1) is cf.masked) d = cf.Data([[5]], 'metre') d[0, 0] = cf.masked self.assertTrue(d.datum() is cf.masked) self.assertTrue(d.datum(0) is cf.masked) self.assertTrue(d.datum(-1) is cf.masked) self.assertTrue(d.datum(0, 0) is cf.masked) self.assertTrue(d.datum(-1, 0) is cf.masked) self.assertTrue(d.datum([0, 0]) is cf.masked) self.assertTrue(d.datum([0, -1]) is cf.masked) self.assertTrue(d.datum(-1, -1) is cf.masked) #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_flip(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) array = numpy.arange(24000).reshape(120, 200) d = cf.Data(array.copy(), 'metre') for axes, indices in zip( (0, 1, [0, 1]), ((slice(None, None, -1), slice(None)), (slice(None) , slice(None, None, -1)), (slice(None, None, -1), slice(None, None, -1))) ): array = array[indices] d.flip(axes, i=True) #--- End: for self.assertTrue((d.array == array).all()) # print 'mshape =', d._pmshape #--- End: def cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_max(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data([[4, 5, 6], [1, 2, 3]], 'metre') self.assertTrue(d.max() == cf.Data(6, 'metre')) self.assertTrue(d.max().datum() == 6) d[0, 2] = cf.masked self.assertTrue(d.max() == 5) self.assertTrue(d.max().datum() == 5) self.assertTrue(d.max() == cf.Data(0.005, 'km')) # print 'pmshape =', d._pmshape #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_min(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data([[4, 5, 6], [1, 2, 3]], 'metre') self.assertTrue(d.min() == cf.Data(1, 'metre')) self.assertTrue(d.min().datum() == 1) d[1, 0] = cf.masked self.assertTrue(d.min() == 2) self.assertTrue(d.min().datum() == 2) self.assertTrue(d.min() == cf.Data(0.002, 'km')) # print 'pmshape =', d._pmshape cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_ndindex(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) for d in (cf.Data(5, 'metre'), cf.Data([4, 5, 6, 1, 2, 3], 'metre'), cf.Data([[4, 5, 6], [1, 2, 3]], 'metre') ): for i, j in zip(d.ndindex(), numpy.ndindex(d.shape)): self.assertTrue(i == j) #--- End: for # print 'pmshape =', d._pmshape cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_roll(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) a = numpy.arange(10*15*19).reshape(10, 1, 15, 19) d = cf.Data(a) pmshape = d._pmshape e = d.roll(0, 4) e.roll(2, 120, i=True) e.roll(3, -77, i=True) a = numpy.roll(a, 4, 0) a = numpy.roll(a, 120, 2) a = numpy.roll(a, -77, 3) self.assertTrue(e.shape == a.shape) self.assertTrue((a == e.array).all()) f = e.roll(3, 77) f.roll(2, -120, i=True) f.roll(0, -4, i=True) self.assertTrue(f.shape == d.shape) self.assertTrue(f.equals(d)) # print 'pmshape =', pmshape #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_sample_size(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data([[4, 5, 6], [1, 2, 3]], 'metre') self.assertTrue(d.sample_size() == 6) d[1, 0] = cf.masked self.assertTrue(d.sample_size() == cf.Data(50, '0.1')) cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_swapaxes(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) a = numpy.arange(10*15*19).reshape(10, 1, 15, 19) d = cf.Data(a.copy()) for i in range(-a.ndim, a.ndim): for j in range(-a.ndim, a.ndim): b = numpy.swapaxes(a.copy(), i, j) e = d.swapaxes(i, j) message = 'cf.Data.swapaxes(%d, %d) failed' % (i, j) self.assertTrue(b.shape == e.shape, message) self.assertTrue((b == e.array).all(), message) #--- End: for #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_transpose(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) a = numpy.arange(10*15*19).reshape(10, 1, 15, 19) d = cf.Data(a.copy()) for indices in (range(a.ndim), range(-a.ndim, 0)): for axes in itertools.permutations(indices): a = numpy.transpose(a, axes) d.transpose(axes, i=True) message = 'cf.Data.transpose(%s) failed: d.shape=%s, a.shape=%s' % \ (axes, d.shape, a.shape) self.assertTrue(d.shape == a.shape, message) self.assertTrue((d.array == a).all(), message) #--- End: for #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_unique(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data([[4, 2, 1], [1, 2, 3]], 'metre') self.assertTrue((d.unique() == cf.Data([1, 2, 3, 4], 'metre')).all()) d[1, -1] = cf.masked self.assertTrue((d.unique() == cf.Data([1, 2, 4], 'metre')).all()) cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_varray(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return # Scalar array d = cf.Data(9, 'km') d.hardmask = False a = d.varray self.assertTrue(a.shape == ()) self.assertTrue(a == numpy.array(9)) d[...] = cf.masked a = d.varray self.assertTrue(a.shape == ()) self.assertTrue(a[()] is numpy.ma.masked) a[()] = 18 self.assertTrue(a == numpy.array(18)) b = numpy.arange(10*15*19).reshape(10, 1, 15, 19) for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data(b, 'km') e = d.copy() v = e.varray v[0,0,0,0] = -999 v = e.varray self.assertTrue(v[0,0,0,0] == -999) self.assertTrue(v.shape == b.shape) self.assertFalse((v == b).all()) v[0, 0, 0, 0] = 0 self.assertTrue((v == b).all()) cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_year_month_day_hour_minute_second(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return d = cf.Data([[1.901, 5.101]], 'days since 2000-12-29') self.assertTrue(d.year.equals(cf.Data([[2000, 2001]]))) self.assertTrue(d.month.equals(cf.Data([[12, 1]]))) self.assertTrue(d.day.equals(cf.Data([[30, 3]]))) self.assertTrue(d.hour.equals(cf.Data([[21, 2]]))) self.assertTrue(d.minute.equals(cf.Data([[37, 25]]))) self.assertTrue(d.second.equals(cf.Data([[26, 26]]))) d = cf.Data([[1.901, 5.101]], cf.Units('days since 2000-12-29', '360_day')) self.assertTrue(d.year.equals(cf.Data([[2000, 2001]]))) self.assertTrue(d.month.equals(cf.Data([[12, 1]]))) self.assertTrue(d.day.equals(cf.Data([[30, 4]]))) self.assertTrue(d.hour.equals(cf.Data([[21, 2]]))) self.assertTrue(d.minute.equals(cf.Data([[37, 25]]))) self.assertTrue(d.second.equals(cf.Data([[26, 26]]))) cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_BINARY_AND_UNARY_OPERATORS(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) array=numpy.arange(3*4*5).reshape(3, 4, 5) + 1 arrays = (numpy.arange(3*4*5).reshape(3, 4, 5) + 1.0, numpy.arange(3*4*5).reshape(3, 4, 5) + 1) for a0 in arrays: for a1 in arrays[::-1]: d = cf.Data(a0[(slice(None, None, -1),)*a0.ndim], 'metre') d.flip(i=True) x = cf.Data(a1, 'metre') self.assertTrue((d + x).equals(cf.Data(a0 + a1, 'm' ), traceback=1)), '%s+%s' % (repr(d), x) self.assertTrue((d * x).equals(cf.Data(a0 * a1, 'm2'), traceback=1)), '%s*%s' % (repr(d), x) self.assertTrue((d / x).equals(cf.Data(a0 / a1, '1' ), traceback=1)), '%s/%s' % (repr(d), x) self.assertTrue((d - x).equals(cf.Data(a0 - a1, 'm' ), traceback=1)), '%s-%s' % (repr(d), x) self.assertTrue((d // x).equals(cf.Data(a0 // a1, '1' ), traceback=1)), '%s//%s' % (repr(d), x) self.assertTrue(d.__truediv__(x).equals(cf.Data(array.__truediv__(array), '1'), traceback=1)), '%s.__truediv__(%s)' % (d, x) self.assertTrue(d.__rtruediv__(x).equals(cf.Data(array.__rtruediv__(array), '1'), traceback=1)) , '%s.__rtruediv__(%s)' % (d, x) try: d ** x except: pass else: self.assertTrue((d**x).all(), '%s**%s' % (d, repr(x))) # print '%s {+, -, *, /, //, **, __truediv__, __rtruediv__} %s passed' % (d, x), "pmshape =", d._pmshape #--- End: for #--- End: for for a0 in arrays: d = cf.Data(a0, 'metre') for x in (2, 2.0): self.assertTrue((d + x).equals(cf.Data(a0 + x, 'm' ), traceback=1)), '%s+%s' % (repr(d), x) self.assertTrue((d * x).equals(cf.Data(a0 * x, 'm' ), traceback=1)), '%s*%s' % (repr(d), x) self.assertTrue((d / x).equals(cf.Data(a0 / x, 'm' ), traceback=1)), '%s/%s' % (repr(d), x) self.assertTrue((d - x).equals(cf.Data(a0 - x, 'm' ), traceback=1)), '%s-%s' % (repr(d), x) self.assertTrue((d // x).equals(cf.Data(a0 // x, 'm' ), traceback=1)), '%s//%s' % (repr(d), x) self.assertTrue((d ** x).equals(cf.Data(a0 ** x, 'm2'), traceback=1)), '%s**%s' % (repr(d), x) self.assertTrue(d.__truediv__(x).equals(cf.Data(a0.__truediv__(x), 'm'), traceback=1)), '%s.__truediv__(%s)' % (d, x) self.assertTrue(d.__rtruediv__(x).equals(cf.Data(a0.__rtruediv__(x), 'm-1'), traceback=1)) , '%s.__rtruediv__(%s)' % (d, x) # print '%s {+, -, *, /, //, **, __truediv__, __rtruediv__} %s passed' % (d, x), "pmshape =", d._pmshape self.assertTrue((x + d).equals(cf.Data(x + a0, 'm' ), traceback=1)), '%s+%s' % (x, repr(d)) self.assertTrue((x * d).equals(cf.Data(x * a0, 'm' ), traceback=1)), '%s*%s' % (x, repr(d)) self.assertTrue((x / d).equals(cf.Data(x / a0, 'm-1'), traceback=1)), '%s/%s' % (x, repr(d)) self.assertTrue((x - d).equals(cf.Data(x - a0, 'm' ), traceback=1)), '%s-%s' % (x, repr(d)) self.assertTrue((x // d).equals(cf.Data(x // a0, 'm-1'), traceback=1)), '%s//%s' % (x, repr(d)) try: x ** d except: pass else: self.assertTrue((x**d).all(), '%s**%s' % (x, repr(d))) # print '%s {+, -, *, /, //, **} %s passed' % (x, repr(d)), "pmshape =", d._pmshape a = a0.copy() try: a += x except TypeError: pass else: e = d.copy() e += x self.assertTrue(e.equals(cf.Data(a, 'm'), traceback=1)), '%s+=%s' % (repr(d), x) a = a0.copy() try: a *= x except TypeError: pass else: e = d.copy() e *= x self.assertTrue(e.equals(cf.Data(a, 'm'), traceback=1)), '%s*=%s' % (repr(d), x) a = a0.copy() try: a /= x except TypeError: pass else: e = d.copy() e /= x self.assertTrue(e.equals(cf.Data(a, 'm'), traceback=1)), '%s/=%s' % (repr(d), x) a = a0.copy() try: a -= x except TypeError: pass else: e = d.copy() e -= x self.assertTrue(e.equals(cf.Data(a, 'm'), traceback=1)), '%s-=%s' % (repr(d), x) a = a0.copy() try: a //= x except TypeError: pass else: e = d.copy() e //= x self.assertTrue(e.equals(cf.Data(a, 'm'), traceback=1)), '%s//=%s' % (repr(d), x) a = a0.copy() try: a **= x except TypeError: pass else: e = d.copy() e **= x self.assertTrue(e.equals(cf.Data(a, 'm2'), traceback=1)), '%s**=%s' % (repr(d), x) a = a0.copy() try: a.__itruediv__(x) except TypeError: pass else: e = d.copy() e.__itruediv__(x) self.assertTrue(e.equals(cf.Data(a, 'm'), traceback=1)), '%s.__itruediv__(%s)' % (d, x) # print '%s {+=, -=, *=, /=, //=, **=, __itruediv__} %s passed' % (repr(d), x), "pmshape =", d._pmshape #--- End: for for x in (cf.Data(2, 'metre'), cf.Data(2.0, 'metre')): self.assertTrue((d + x).equals(cf.Data(a0 + x.datum(), 'm' ), traceback=1)) self.assertTrue((d * x).equals(cf.Data(a0 * x.datum(), 'm2'), traceback=1)) self.assertTrue((d / x).equals(cf.Data(a0 / x.datum(), '1' ), traceback=1)) self.assertTrue((d - x).equals(cf.Data(a0 - x.datum(), 'm' ), traceback=1)) self.assertTrue((d // x).equals(cf.Data(a0 // x.datum(), '1' ), traceback=1)) try: d ** x except: pass else: self.assertTrue((x**d).all(), '%s**%s' % (x, repr(d))) self.assertTrue(d.__truediv__(x).equals(cf.Data(a0.__truediv__(x.datum()), ''), traceback=1)) # print '%s {+, -, *, /, //, **, __truediv__} %s passed' % (repr(d), repr(x)), "pmshape =", d._pmshape #--- End: for #--- End: for #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_BROADCASTING(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return A = [numpy.array(3), numpy.array( [3]), numpy.array( [3]).reshape(1, 1), numpy.array( [3]).reshape(1, 1, 1), numpy.arange( 5).reshape(5, 1), numpy.arange( 5).reshape(1, 5), numpy.arange( 5).reshape(1, 5, 1), numpy.arange( 5).reshape(5, 1, 1), numpy.arange( 5).reshape(1, 1, 5), numpy.arange( 25).reshape(1, 5, 5), numpy.arange( 25).reshape(5, 1, 5), numpy.arange( 25).reshape(5, 5, 1), numpy.arange(125).reshape(5, 5, 5), ] for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) for a in A: for b in A: d = cf.Data(a) e = cf.Data(b) ab = a*b de = d*e self.assertTrue(de.shape == ab.shape) self.assertTrue((de.array == ab).all()) #--- End: for #--- End: for #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data__collapse_SHAPE(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return a = numpy.arange(-100, 200., dtype=float).reshape(3, 4, 5, 5) ones = numpy.ones(a.shape, dtype=float) for h in ('sample_size', 'sum', 'min', 'max', 'mean', 'var', 'sd', 'mid_range', 'range'): for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data(a[(slice(None, None, -1),) * a.ndim].copy()) d.flip(i=True) x = cf.Data(self.w.copy()) shape = list(d.shape) for axes in self.axes_combinations: e = getattr(d, h)(axes=axes, squeeze=False) shape = list(d.shape) for i in axes: shape[i] = 1 shape = tuple(shape) self.assertTrue( e.shape == shape, "%s, axes=%s, not squeezed bad shape: %s != %s" % \ (h, axes, e.shape, shape)) #--- End: for for axes in self.axes_combinations: e = getattr(d, h)(axes=axes, squeeze=True) shape = list(d.shape) for i in sorted(axes, reverse=True): shape.pop(i) shape = tuple(shape) assert e.shape == shape, \ "%s, axes=%s, squeezed bad shape: %s != %s" % \ (h, axis, e.shape, shape) #--- End: for e = getattr(d, h)(squeeze=True) shape = () self.assertTrue( e.shape == shape, "%s, axes=%s, squeezed bad shape: %s != %s" % \ (h, None, e.shape, shape)) e = getattr(d, h)(squeeze=False) shape = (1,) * d.ndim self.assertTrue( e.shape == shape, "%s, axes=%s, not squeezed bad shape: %s != %s" % \ (h, None, e.shape, shape)) # print 'h=', h, 'pmshape =', d._pmshape #--- End: for #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_max_min_sum(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) # unweighted, unmasked d = cf.Data(self.a) for np, h in zip((numpy.sum, numpy.amin, numpy.amax), ( 'sum', 'min', 'max')): for axes in self.axes_combinations: b = reshape_array(self.a, axes) b = np(b, axis=-1) e = getattr(d, h)(axes=axes, squeeze=True) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08), "%s, axis=%s, unweighted, unmasked \ne=%s, \nb=%s, \ne-b=%s" % (h, axes, e.array, b, e.array-b)) #--- End: for # unweighted, masked d = cf.Data(self.ma) for np, h in zip((numpy.ma.sum, numpy.ma.amin, numpy.ma.amax), ( 'sum', 'min', 'max')): for axes in self.axes_combinations: b = reshape_array(self.ma, axes) b = np(b, axis=-1) b = numpy.ma.asanyarray(b) e = getattr(d, h)(axes=axes, squeeze=True) self.assertTrue( (e.mask.array == b.mask).all(), "%s, axis=%s, \ne.mask=%s, \nb.mask=%s, \ne.mask==b.mask=%s" % (h, axes, e.mask.array, b.mask, e.mask.array==b.mask)) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08), "%s, axis=%s, unweighted, masked \ne=%s, \nb=%s, \ne-b=%s" % (h, axes, e.array, b, e.array-b)) #--- End: for #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: for def test_Data_sum_of_weights_sum_of_weights2(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) # unweighted, masked d = cf.Data(self.ma) for a, h in zip((self.mones , self.mones), ('sum_of_weights', 'sum_of_weights2')): for axes in self.axes_combinations: b = reshape_array(a, axes) b = numpy.ma.asanyarray(b.sum(axis=-1)) e = getattr(d, h)(axes=axes, squeeze=True) self.assertTrue( (e.mask.array == b.mask).all(), "%s, axis=%s, \ne.mask=%s, \nb.mask=%s, \ne.mask==b.mask=%s" % (h, axes, e.mask.array, b.mask, e.mask.array==b.mask)) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08), "%s, axis=%s, \ne=%s, \nb=%s, \ne-b=%s" % (h, axes, e.array, b, e.array-b)) #--- End: for # print "pmshape =", d._pmshape #--- End: for # unweighted, masked d = cf.Data(self.a) for h in ('sum_of_weights', 'sum_of_weights2'): for axes in self.axes_combinations: b = reshape_array(self.ones, axes) b = b.sum(axis=-1) e = getattr(d, h)(axes=axes, squeeze=True) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08), "%s, axis=%s, \ne=%s, \nb=%s, \ne-b=%s" % \ (h, axes, e.array, b, e.array-b)) #--- End: for # weighted, masked d = cf.Data(self.ma) x = cf.Data(self.w) for a, h in zip((self.mw , self.mw*self.mw), ('sum_of_weights', 'sum_of_weights2')): for axes in self.axes_combinations: a = a.copy() a.mask = self.ma.mask b = reshape_array(a, axes) b = numpy.ma.asanyarray(b.sum(axis=-1)) e = getattr(d, h)(axes=axes, weights=x, squeeze=True) self.assertTrue( (e.mask.array == b.mask).all(), "%s, axis=%s, \ne.mask=%s, \nb.mask=%s, \ne.mask==b.mask=%s" % (h, axes, e.mask.array, b.mask, e.mask.array==b.mask)) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08), "%s, axis=%s, \ne=%s, \nb=%s, \ne-b=%s" % (h, axes, e.array, b, e.array-b)) #--- End: for # weighted, unmasked d = cf.Data(self.a) for a, h in zip((self.w , self.w*self.w), ('sum_of_weights', 'sum_of_weights2')): for axes in self.axes_combinations: b = reshape_array(a, axes) b = b.sum(axis=-1) e = getattr(d, h)(axes=axes, weights=x, squeeze=True) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08), "%s, axis=%s, \ne=%s, \nb=%s, \ne-b=%s" % (h, axes, e.array, b, e.array-b)) #--- End: for #--- End: for cf.CHUNKSIZE(self.original_chunksize) #---End: def def test_Data_mean(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) # unweighted, unmasked d = cf.Data(self.a) for axes in self.axes_combinations: b = reshape_array(self.a, axes) b = numpy.mean(b, axis=-1) e = d.mean(axes=axes, squeeze=True) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08), "axis=%s, unweighted, unmasked \ne=%s, \nb=%s, \ne-b=%s" % (axes, e.array, b, e.array-b)) #--- End: for # weighted, unmasked x = cf.Data(self.w) for axes in self.axes_combinations: b = reshape_array(self.a, axes) v = reshape_array(self.w, axes) b = numpy.average(b, axis=-1, weights=v) e = d.mean(axes=axes, weights=x, squeeze=True) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08), "axis=%s, \ne=%s, \nb=%s, \ne-b=%s" % (axes, e.array, b, e.array-b)) #--- End: for # unweighted, masked d = cf.Data(self.ma) for axes in self.axes_combinations: b = reshape_array(self.ma, axes) b = numpy.ma.average(b, axis=-1) b = numpy.ma.asanyarray(b) e = d.mean(axes=axes, squeeze=True) self.assertTrue( (e.mask.array == b.mask).all(), "axis=%s, \ne.mask=%s, \nb.mask=%s, \ne.mask==b.mask=%s" % (axes, e.mask.array, b.mask, e.mask.array==b.mask)) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08), "axis=%s, \ne=%s, \nb=%s, \ne-b=%s" % (axes, e.array, b, e.array-b)) #--- End: for # weighted, masked for axes in self.axes_combinations: b = reshape_array(self.ma, axes) v = reshape_array(self.mw, axes) b = numpy.ma.average(b, axis=-1, weights=v) b = numpy.ma.asanyarray(b) e = d.mean(axes=axes, weights=x, squeeze=True) self.assertTrue( (e.mask.array == b.mask).all(), "axis=%s, \ne.mask=%s, \nb.mask=%s, \ne.mask==b.mask=%s" % (axes, e.mask.array, b.mask, e.mask.array==b.mask)) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08), "axis=%s, \ne=%s, \nb=%s, \ne-b=%s" % (axes, e.array, b, e.array-b)) #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_sample_size(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) # unmasked d = cf.Data(self.a) for axes in self.axes_combinations: b = reshape_array(self.ones, axes) b = b.sum(axis=-1) e = d.sample_size(axes=axes, squeeze=True) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08), "axis=%s, \ne=%s, \nb=%s, \ne-b=%s" % \ (axes, e.array, b, e.array-b)) #--- End: for # masked d = cf.Data(self.ma) for axes in self.axes_combinations: b = reshape_array(self.mones, axes) b = b.sum(axis=-1) e = d.sample_size(axes=axes, squeeze=True) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08), "axis=%s, \ne=%s, \nb=%s, \ne-b=%s" % \ (axes, e.array, b, e.array-b)) #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_sd_var(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return ddofs=(0, 1, 2) f = 2 for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) # unweighted, unmasked d = cf.Data(self.a, units='K') for np, h in zip((numpy.var, numpy.std), ('var' , 'sd')): for ddof in ddofs: for axes in self.axes_combinations: b = reshape_array(self.a, axes) b = np(b, axis=-1, ddof=ddof) e = getattr(d, h)(axes=axes, squeeze=True, ddof=ddof) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08), "%s, axis=%s, unweighted, unmasked \ne=%s, \nb=%s, \ne-b=%s" % (h, axes, e.array, b, e.array-b)) #--- End: for # unweighted, masked d = cf.Data(self.a, units='K') x = cf.Data(self.w) for h in ('var', 'sd'): for axes in self.axes_combinations: for ddof in ddofs: e = getattr(d, h)(axes=axes, squeeze=True, ddof=ddof) b = reshape_array(self.a, axes) not_enough_data = numpy.ma.count(b, axis=-1) <= ddof avg = numpy.ma.average(b, axis=-1) if numpy.ndim(avg) < b.ndim: avg = numpy.ma.expand_dims(avg, -1) b, sv = numpy.ma.average((b-avg)**2, axis=-1, returned=True) b = numpy.ma.where(not_enough_data, numpy.ma.masked, b) b *= sv/(sv-ddof) if h == 'sd': b **= 0.5 b = numpy.ma.asanyarray(b) e = getattr(d, h)(axes=axes, squeeze=True, ddof=ddof) self.assertTrue( (e.mask.array == b.mask).all(), "%s, axes=%s, ddof=%s, \ne.mask=%s, \nb.mask=%s, \ne.mask==b.mask=%s" % (h, axes, ddof, e.mask.array, b.mask, e.mask.array==b.mask)) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08), "%s, axes=%s, ddof=%s, \ne=%s, \nb=%s, \ne-b=%s" % (h, axes, ddof, e.array, b, e.array-b)) #--- End: for # weighted, unmasked f= 2 d = cf.Data(self.a, units='K') x = cf.Data(self.w) for h in ('var', 'sd'): for axes in self.axes_combinations: for ddof in ddofs: b = reshape_array(self.a, axes) v = reshape_array(self.w, axes) avg = numpy.average(b, axis=-1, weights=v) if numpy.ndim(avg) < b.ndim: avg = numpy.expand_dims(avg, -1) b, sv = numpy.average((b-avg)**2, axis=-1, weights=v, returned=True) b *= f*sv/(f*sv-ddof) if h == 'sd': b **= 0.5 e = getattr(d, h)(axes=axes, weights=x, squeeze=True, ddof=ddof, a=f) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08) , "%s, axis=%s, ddof=%s, \ne=%s, \nb=%s, \ne-b=%s" % \ (h, axes, ddof, e.array, b, e.array-b)) #--- End: for # weighted, masked f = 2 d = cf.Data(self.ma, units='K') x = cf.Data(self.w) for h in ('var', 'sd'): for axes in self.axes_combinations: for ddof in ddofs: b = reshape_array(self.ma, axes) v = reshape_array(self.mw, axes) not_enough_data = numpy.ma.count(b, axis=-1) <= ddof avg = numpy.ma.average(b, axis=-1, weights=v) if numpy.ndim(avg) < b.ndim: avg = numpy.ma.expand_dims(avg, -1) b, sv = numpy.ma.average((b-avg)**2, axis=-1, weights=v, returned=True) b = numpy.ma.where(not_enough_data, numpy.ma.masked, b) b *= f*sv/(f*sv-ddof) if h == 'sd': b **= 0.5 b = numpy.ma.asanyarray(b) e = getattr(d, h)(axes=axes, weights=x, squeeze=True, ddof=ddof, a=f) if h == 'sd': self.assertTrue(e.Units == d.Units) else: self.assertTrue(e.Units == d.Units**2) self.assertTrue( (e.mask.array == b.mask).all(), "%s, axis=%s, \ne.mask=%s, \nb.mask=%s, \ne.mask==b.mask=%s" % (h, axes, e.mask.array, b.mask, e.mask.array==b.mask)) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08), "%s, axis=%s, ddof=%s, \ne=%s, \nb=%s, \ne-b=%s" % (h, axes, ddof, e.array, b, e.array-b)) #--- End: for #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_dumpd_loadd(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.read(self.filename)[0].data dumpd = d.dumpd() self.assertTrue(d.equals(cf.Data(loadd=d.dumpd()), traceback=True)) self.assertTrue(d.equals(cf.Data(loadd=d.dumpd()), traceback=True)) d.to_disk() self.assertTrue(d.equals(cf.Data(loadd=d.dumpd()), traceback=True)) #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def #--- End: class if __name__ == "__main__": print 'cf-python version:' , cf.__version__ print 'cf-python path:' , os.path.abspath(cf.__file__) print '' unittest.main(verbosity=2) cf-python-1.3.2/test/new_STASH_to_CF.txt0000644000175000017500000000021612714305151020147 0ustar daviddavid000000000000001!24!SURFACE TEMPERATURE AFTER TIMESTEP !Pa!!!NEW_NAME!! 1!25!BOUNDARY LAYER DEPTH AFTER TIMESTEP !m!!!atmosphere_boundary_layer_thickness!! cf-python-1.3.2/test/file7.nc0000644000175000017500000000534012752572327016151 0ustar daviddavid00000000000000CDF timexlatbounds2lon  ConventionsCF-1.5 time unitsdays since 1900-1-1 long_nametimecalendar gregorianÀ0 lat_boundsðlat units degrees_north long_namelatitude climatology lat_bounds lon_boundslon units degrees_east long_name longitude climatology lon_boundspre  _FillValueGžunitsmm missing_valueGž cell_methodstime: mean lat: lon: meanÀ @Üè@Üï€@ÜöÀ@Üþ€@Ý@Ý À@Ý@@Ý@Ý$À@Ý,@@Ý4@Ý;€@ÝC@@ÝJÀ@ÝR@ÝYÀ@Ýa@@Ýi@Ýp€@Ýx@@Ý€@݇€@Ý@@Ý–À@Ýž€@ݦ@Ý­@@ݵ@ݼ€@ÝÄ@@ÝËÀ@ÝÓ€@ÝÛ@@ÝâÀ@Ýê€@Ýò@ÝùÀ@Þ@@ÞÀ@Þ€@Þ@ÞÀ@Þ'@@Þ/@Þ6À@Þ>@@ÞF@ÞM€@ÞU@@Þ\À@Þd@ÞkÀ@Þs@@Þ{@Þ‚€@ÞŠ@@Þ’@Þ™€@Þ¡@@Þ¨À@Þ°€@Þ¸@Þ¿@@ÞÇ@Þ΀@ÞÖ@@ÞÝÀ@Þå€@Þí@@ÞôÀ@Þü€@ß@ß À@ß@@߀@ß"@@ß)À@ß1€@ß9@ß@À@ßH€@ßP@ßWÀ@ß_@@ßg@ßn€@ßv@ß}À@ß…@@ß@ß”€@ßœ@@ߤ@ß«€@ß³@@ߺÀ@߀@ßÊ@ßÑ@@ßÙ@ßà€@ßè@@ßïÀ@ß÷€@ßÿ@@à`@à@@à @àà@à @à@@à @àà@à!À@à%€@à)`@à-@@à1@à4à@à8 ÀVp@VpÀfx@fxGžGžGžGžGžGž@N³ñ„[ª¶@NŸó&ô1@N‹ôÉŒ·J@Nx›‡îŦ@Nd*‡Kð@NQCèéZJ@N=E‹à”@N)ìIãîì@N8$…T@N9ƨ ž@Mïà… ö@MÛâ'¢ >@MÓˆä +ú@M×åïþlr@MÜBûð¬ì@Mà{ÿ>5¤@MäÙ 0v@Mé}þÖ@Míop?P@Mñ¨½È@Mõ½f˜þ@Mú$XÙw@MþS'¦b/@N°3˜¢©@NÃ3ê™È@Nð…—@NB¬Pqe@NNÍÌ D@N މþ÷@N&š«zò@N,Úg­|Â@N2æ‰)¡@N8òª¤°@N?2fלO@NE>ˆS6/@NK~D†!þ@NGò·ñà¼@N9°aaý@N+n Hã=@N¡t0ìµ@N_\mö@N’‡Dwn@MóP0oø®@M僚X&@MØ,Äü“Ø@MÉên(@M¼Ø@M­Û;ŸÐ@M£E=ζ@Mœ@5~F@M”ùk--Ø@MŽÏ@M†èÇûÉ`@MýùÒµW@MxØ$Êdè@MqíV¡PÞ@Mk=Wy<@MdºO(Í@M],ì&Â@MVÄT@MKè`‡¢T@M=«Öü"@M/m±&Uò@M!¥ðîÿo@Mh™>Y>@M Ùº@L÷cV\ˆ@Lé›Á@LÜI˜`ÿ1@LÎ @°Xþ@LÀD€yz@L²(È\J@L¼I­™b@LãG£î•{@M EšÊ‘’@M0‘ò ¨@MVÿˆÎ¾@M|»õ}Ô@M£¹vÑyì@MÉumøò@Mï1e j@N/[üf*@N;ëS#ÞF@NbéIÿÚX@NtÏpö"Y@Nqed‚¡@NmûW<âé@Nj­|VÜý@NgCoz=F@Ncõ””7Z@N`‹‡·—¢@N]=¬Ñ‘¶@NZ â%–@NV¡÷…ß@NSTô@NOêBà<@NM3ÓJâï@NKÆzâ@NHÿ0BÔ@NFö<5@NDÛê±% @NBÒö¤ŸR@N@¸¥ 7D@N>¯±±Š@N<¸#@N:Èú¦@N8”Ôî Z@N6zƒi¸MGžGžGžGžGžGžcf-python-1.3.2/test/test_aggregate.py0000600000175000017500000000526012603546021020134 0ustar daviddavid00000000000000import cf import os import unittest class aggregateTest(unittest.TestCase): filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test_file.nc') chunk_sizes = (17, 34, 300, 100000)[::-1] original_chunksize = cf.CHUNKSIZE() def test_aggregate(self): for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) f = cf.read(self.filename, squeeze=True)[0] f.aux('aux0').id = 'atmosphere_hybrid_height_coordinate_ak' f.aux('aux1').id = 'atmosphere_hybrid_height_coordinate_bk' g = cf.FieldList(f.subspace[0]) g.append(f.subspace[1:3]) g.append(f.subspace[3]) g[-1].flip(0, i=True) g.append(f.subspace[4:7]) g[-1].flip(0, i=True) g.extend([f.subspace[i] for i in range(7, f.shape[0])]) g0 = g.copy() self.assertTrue(g.equals(g0, traceback=True), "g != itself") h = cf.aggregate(g, info=1) self.assertTrue(h[0].shape == (10, 9), 'h[0].shape is '+repr(h[0].shape)) self.assertTrue(h[0].equals(f, traceback=True), 'asdasds') self.assertTrue(g.equals(g0, traceback=True), 'g != itself after aggregation') i = cf.aggregate(g, info=1) self.assertTrue(i.equals(h, traceback=True), 'The second aggregation != the first') self.assertTrue(g.equals(g0, traceback=True), 'g != itself after the second aggregation') i = cf.aggregate(g, info=1, axes='grid_latitude') self.assertTrue(i.equals(h, traceback=True), 'The third aggregation != the first') self.assertTrue(g.equals(g0, traceback=True), 'g !=itself after the third aggregation') self.assertTrue(i[0].shape == (10,9), 'i[0].shape is '+repr(i[0].shape)) i = cf.aggregate(g, info=1, axes='grid_latitude', donotchecknonaggregatingaxes=1) self.assertTrue(i.equals(h, traceback=True), 'The fourth aggregation != the first') self.assertTrue(g.equals(g0, traceback=True), 'g != itself after the fourth aggregation') self.assertTrue(i[0].shape == (10,9), 'i[0].shape is '+repr(i[0].shape)) #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def #--- End: class if __name__ == '__main__': print 'cf-python version:', cf.__version__ print 'cf-python path:' , os.path.abspath(cf.__file__) print '' unittest.main(verbosity=2) cf-python-1.3.2/test/test_Datetime.py0000600000175000017500000000742612603546021017750 0ustar daviddavid00000000000000import cf import datetime import numpy import os import time import unittest class DatetimeTest(unittest.TestCase): filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test_file.nc') chunk_sizes = (17, 34, 300, 100000)[::-1] def test_Datetime(self): d = cf.Datetime(2003, 2, 30) d = cf.Datetime(2003, 2, 30, 0) d = cf.Datetime(2003, 2, 30, 0, 0) d = cf.Datetime(2003, 2, 30, 0, 0, 0) d = cf.Datetime(2003, 4, 5, 12, 30, 15) d = cf.Datetime(year=2003, month=4, day=5, hour=12, minute=30, second=15) assert((d.year, d.month, d.day, d.hour, d.minute, d.second) == (2003, 4, 5, 12, 30, 15)) assert(d.timetuple() == (2003, 4, 5, 12, 30, 15, -1, 1, -1)) assert((d == d) == True) assert((d > d) == False) assert((d >= d) == True) assert((d < d) == False) assert((d <= d) == True) assert((d != d) == False) e = cf.Datetime(2003, 4, 5, 12, 30, 16) assert((d == e) == False) assert((d > e) == False) assert((d >= e) == False) assert((d < e) == True) assert((d <= e) == True) assert((d != e) == True) e = cf.Datetime(2003, 4, 5, 12, 30, 14) assert((d == e) == False) assert((d > e) == True) assert((d >= e) == True) assert((d < e) == False) assert((d <= e) == False) assert((d != e) == True) d.utcnow() cf.Datetime.utcnow() #--- End: def # def test_Datetime_dt_cm_cy(self): # self.assertTrue(cf.dt('2001-2-3') == cf.Datetime(2001, 2, 3)) # self.assertTrue(cf.dt('2001-2-3 0:0:0') == cf.Datetime(2001, 2, 3)) # self.assertTrue(cf.dt('2001-2-3 12:30:15') == cf.Datetime(2001, 2, 3, 12, 30, 15)) # self.assertTrue(cf.dt(2001, 2, 3) == cf.Datetime(2001, 2, 3)) # self.assertTrue(cf.dt(2001, 2, 3, 12, 30, 15) == cf.Datetime(2001, 2, 3, 12, 30, 15)) # # self.assertTrue(cf.cm().months == 1) # self.assertTrue(cf.cm(3).months == 3) # # self.assertTrue(cf.cy().years == 1) # self.assertTrue(cf.cy(3).years == 3) # #--- End: def def test_Datetime_rt2dt(self): self.assertTrue( cf.cfdatetime.rt2dt(1, cf.Units('days since 2004-2-28')) == numpy.array(datetime.datetime(2004, 2, 29))) self.assertTrue( (cf.cfdatetime.rt2dt([1, 3], cf.Units('days since 2004-2-28')) == numpy.array([datetime.datetime(2004, 2, 29), datetime.datetime(2004, 3, 2)])).all()) self.assertTrue( (cf.cfdatetime.rt2dt([1, 3], cf.Units('days since 2004-2-28', '360_day')) == numpy.array([cf.Datetime(2004, 2, 29), cf.Datetime(2004, 3, 1)])).all()) #--- End: def def test_Datetime_dt2rt(self): units = cf.Units('days since 2004-2-28') self.assertTrue( cf.cfdatetime.dt2rt(datetime.datetime(2004, 2, 29), None, units) == numpy.array(1.0)) self.assertTrue( (cf.cfdatetime.dt2rt([datetime.datetime(2004, 2, 29), datetime.datetime(2004, 3, 2)], None, units) == numpy.array([1., 3.])).all()) units = cf.Units('days since 2004-2-28', '360_day') self.assertTrue((cf.cfdatetime.dt2rt([cf.Datetime(2004, 2, 29), cf.Datetime(2004, 3, 1)], None, units) == numpy.array([1., 3.])).all()) units = cf.Units('seconds since 2004-2-28') self.assertTrue( cf.cfdatetime.dt2rt(datetime.datetime(2004, 2, 29), None, units) == numpy.array(86400.0)) #--- End: def #--- End: class #--- End: class if __name__ == "__main__": print 'cf-python version:', cf.__version__ print 'cf-python path:' , os.path.abspath(cf.__file__) print'' unittest.main(verbosity=2) cf-python-1.3.2/test/test_CoordinateReference.py0000644000175000017500000000404512745346617022144 0ustar daviddavid00000000000000import cf import numpy import os import unittest class CoordinateReferenceTest(unittest.TestCase): filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test_file.nc') chunk_sizes = (17, 34, 300, 100000)[::-1] def test_CoordinateReference_equals(self): f = cf.read(self.filename)[0] t = cf.CoordinateReference(name='atmosphere_hybrid_height_coordinate', a='aux0', b='aux1', orog=f, coord_terms=('a', 'b')) # print t.dump(complete=True) # print t # t.inspect() # print self.assertTrue(t.equals(t.copy(), traceback=True)) # Create a rotated_latitude_longitude grid mapping coordinate # reference t = cf.CoordinateReference(name='rotated_latitude_longitude', grid_north_pole_latitude=38.0, grid_north_pole_longitude=190.0) # print t.dump(complete=True) # print t # t.inspect() # print self.assertTrue(t.equals(t.copy(), traceback=True)) #--- End: def def test_Field_ref_refs(self): f = cf.read(self.filename)[0] self.assertTrue(f.ref('BLAH') is None) self.assertTrue(f.ref('atmos', key=True) == 'ref0') self.assertTrue(f.ref('atmos', key=True, inverse=True) == 'ref1') self.assertTrue(set(f.refs()) == set(['ref0', 'ref1'])) self.assertTrue(set(f.refs('BLAH')) == set()) self.assertTrue(set(f.refs('rot')) == set(['ref1'])) self.assertTrue(set(f.refs('rot', inverse=True)) == set(['ref0'])) self.assertTrue(set(f.refs('atmosphere_hybrid_height_coordinate', exact=True)) == set(['ref0'])) #--- End: def #--- End: class if __name__ == '__main__': print 'cf-python version:', cf.__version__ print 'cf-python path:' , os.path.abspath(cf.__file__) print '' unittest.main(verbosity=2) cf-python-1.3.2/test/Transform.py0000600000175000017500000000304012357200172017114 0ustar daviddavid00000000000000import cf import numpy import os import time def test(): start_time = time.time() print '----------------------------------------------------------' print 'cf.Transform' print '----------------------------------------------------------' filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), "test_file.nc") f = cf.read(filename)[0] t = cf.Transform(name='atmosphere_hybrid_height_coordinate', a='aux0', b='aux1', orog=f, coord_terms=('a', 'b')) print t.dump(complete=True) print t t.inspect() print assert t.equals(t.copy(), traceback=True), "Transform not equal to itself" # Create a rotated_latitude_longitude grid mapping transform t = cf.Transform(name='rotated_latitude_longitude', grid_north_pole_latitude=38.0, grid_north_pole_longitude=190.0) print t.dump(complete=True) print t t.inspect() print assert t.equals(t.copy(), traceback=True), "Transform not equal to itself" time_elapsed = (time.time() - start_time)/60.0 print print '---------------------------------------------------------------------------' print 'All cf.Transform tests passed for cf version', cf.__version__ print 'Running from', os.path.abspath(cf.__file__) print 'Time elapsed: %f minutes' % time_elapsed print '---------------------------------------------------------------------------' print #--- End: def if __name__ == "__main__": test() cf-python-1.3.2/test/test_Query.py0000644000175000017500000002760512752572327017347 0ustar daviddavid00000000000000import cf import datetime import numpy import os import unittest class QueryTest(unittest.TestCase): filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test_file.nc') chunk_sizes = (17, 34, 300, 100000)[::-1] original_chunksize = cf.CHUNKSIZE() def test_Query_contain(self): for chunksize in self.chunk_sizes: f = cf.read(self.filename)[0] c = f.dim('X') self.assertTrue(((cf.contain(21.1)==c).array == numpy.array([0,1,0,0,0,0,0,0,0], bool)).all()) self.assertTrue(((cf.contain(999)==c).array == numpy.array([0,0,0,0,0,0,0,0,0], bool)).all()) #--- End: def def test_Query_datetime1(self): for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data([[1., 5.], [6, 2]], 'days since 2000-12-29 21:57:57') self.assertTrue((d==cf.eq(cf.dt('2001-01-03 21:57:57'))).equals(cf.Data([[False, True], [False, False]]))) self.assertTrue((d==cf.ne(cf.dt('2001-01-03 21:57:57'))).equals(cf.Data([[True, False], [True, True]]))) self.assertTrue((d==cf.ge(cf.dt('2001-01-03 21:57:57'))).equals(cf.Data([[False, True], [True, False]]))) self.assertTrue((d==cf.gt(cf.dt('2001-01-03 21:57:57'))).equals(cf.Data([[False, False], [True, False]]))) self.assertTrue((d==cf.le(cf.dt('2001-01-03 21:57:57'))).equals(cf.Data([[True, True], [False, True]]))) self.assertTrue((d==cf.lt(cf.dt('2001-01-03 21:57:57'))).equals(cf.Data([[True, False], [False, True]]))) self.assertTrue((d==cf.wi(cf.dt('2000-12-31 21:57:57 21:57:57'), cf.dt('2001-01-03 21:57:57'))).equals(cf.Data([[False, True], [False, True]]))) self.assertTrue((d==cf.wo(cf.dt('2000-12-31 21:57:57 21:57:57'), cf.dt('2001-01-03 21:57:57'))).equals(cf.Data([[True, False], [True, False]]))) self.assertTrue((d==cf.set([cf.dt('2000-12-31 21:57:57 21:57:57'), cf.dt('2001-01-03 21:57:57')])).equals(cf.Data([[False, True], [False, True]]))) cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Query_year_month_day_hour_minute_second(self): for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data([[1., 5.], [6, 2]], 'days since 2000-12-29 21:57:57') self.assertTrue((d==cf.year(2000)).equals(cf.Data([[True, False], [False, True]]))) self.assertTrue((d==cf.month(12)).equals(cf.Data([[True, False], [False, True]]))) self.assertTrue((d==cf.day(3)).equals(cf.Data([[False, True], [False, False]]))) d = cf.Data([[1., 5], [6, 2]], 'hours since 2000-12-29 21:57:57') self.assertTrue((d==cf.hour(2)).equals(cf.Data([[False, True], [False, False]]))) d = cf.Data([[1., 5], [6, 2]], 'minutes since 2000-12-29 21:57:57') self.assertTrue((d==cf.minute(2)).equals(cf.Data([[False, True], [False, False]]))) d = cf.Data([[1., 5], [6, 2]], 'seconds since 2000-12-29 21:57:57') self.assertTrue((d==cf.second(2)).equals(cf.Data([[False, True], [False, False]]))) d = cf.Data([[1., 5.], [6, 2]], 'days since 2000-12-29 21:57:57') self.assertTrue((d==cf.year(cf.ne(-1))).equals(cf.Data([[True, True], [True, True]]))) self.assertTrue((d==cf.month(cf.ne(-1))).equals(cf.Data([[True, True], [True, True]]))) self.assertTrue((d==cf.day(cf.ne(-1))).equals(cf.Data([[True, True], [True, True]]))) d = cf.Data([[1., 5], [6, 2]], 'hours since 2000-12-29 21:57:57') self.assertTrue((d==cf.hour(cf.ne(-1))).equals(cf.Data([[True, True], [True, True]]))) d = cf.Data([[1., 5], [6, 2]], 'minutes since 2000-12-29 21:57:57') self.assertTrue((d==cf.minute(cf.ne(-1))).equals(cf.Data([[True, True], [True, True]]))) d = cf.Data([[1., 5], [6, 2]], 'seconds since 2000-12-29 21:57:57') self.assertTrue((d==cf.second(cf.ne(-1))).equals(cf.Data([[True, True], [True, True]]))) #--- End: def cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Query_dteq_dtne_dtge_dtgt_dtle_dtlt(self): for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data([[1., 5.], [6, 2]], 'days since 2000-12-29 21:57:57') self.assertTrue((d==cf.dteq('2001-01-03 21:57:57')).equals(cf.Data([[False, True], [False, False]]))) self.assertTrue((d==cf.dtne('2001-01-03 21:57:57')).equals(cf.Data([[True, False], [True, True]]))) self.assertTrue((d==cf.dtge('2001-01-03 21:57:57')).equals(cf.Data([[False, True], [True, False]]))) self.assertTrue((d==cf.dtgt('2001-01-03 21:57:57')).equals(cf.Data([[False, False], [True, False]]))) self.assertTrue((d==cf.dtle('2001-01-03 21:57:57')).equals(cf.Data([[True, True], [False, True]]))) self.assertTrue((d==cf.dtlt('2001-01-03 21:57:57')).equals(cf.Data([[True, False], [False, True]]))) self.assertTrue((d==cf.dteq(2001, 1, 3, 21, 57, 57)).equals(cf.Data([[False, True], [False, False]]))) self.assertTrue((d==cf.dtne(2001, 1, 3, 21, 57, 57)).equals(cf.Data([[True, False], [True, True]]))) self.assertTrue((d==cf.dtge(2001, 1, 3, 21, 57, 57)).equals(cf.Data([[False, True], [True, False]]))) self.assertTrue((d==cf.dtgt(2001, 1, 3, 21, 57, 57)).equals(cf.Data([[False, False], [True, False]]))) self.assertTrue((d==cf.dtle(2001, 1, 3, 21, 57, 57)).equals(cf.Data([[True, True], [False, True]]))) self.assertTrue((d==cf.dtlt(2001, 1, 3, 21, 57, 57)).equals(cf.Data([[True, False], [False, True]]))) d = cf.dt(2002, 6, 16) self.assertTrue(not (d == cf.dteq(1990, 1, 1))) self.assertTrue(d == cf.dteq(2002, 6, 16)) self.assertTrue(not(d == cf.dteq('2100-1-1'))) self.assertTrue(not (d == cf.dteq('2001-1-1') & cf.dteq(2010, 12, 31))) d = cf.dt(2002, 6, 16) self.assertTrue(d == cf.dtge(1990, 1, 1)) self.assertTrue(d == cf.dtge(2002, 6, 16)) self.assertTrue(not (d == cf.dtge('2100-1-1'))) self.assertTrue(not (d == cf.dtge('2001-1-1') & cf.dtge(2010, 12, 31))) d = cf.dt(2002, 6, 16) self.assertTrue(d == cf.dtgt(1990, 1, 1)) self.assertTrue(not (d == cf.dtgt(2002, 6, 16))) self.assertTrue(not (d == cf.dtgt('2100-1-1'))) self.assertTrue(d == cf.dtgt('2001-1-1') & cf.dtle(2010, 12, 31)) d = cf.dt(2002, 6, 16) self.assertTrue(d == cf.dtne(1990, 1, 1)) self.assertTrue(not (d == cf.dtne(2002, 6, 16))) self.assertTrue(d == cf.dtne('2100-1-1')) self.assertTrue(d == cf.dtne('2001-1-1') & cf.dtne(2010, 12, 31)) d = cf.dt(2002, 6, 16) self.assertTrue(not (d == cf.dtle(1990, 1, 1))) self.assertTrue(d == cf.dtle(2002, 6, 16)) self.assertTrue(d == cf.dtle('2100-1-1')) self.assertTrue(not (d == cf.dtle('2001-1-1') & cf.dtle(2010, 12, 31))) d = cf.dt(2002, 6, 16) self.assertTrue(not (d == cf.dtlt(1990, 1, 1))) self.assertTrue(not (d == cf.dtlt(2002, 6, 16))) self.assertTrue(d == cf.dtlt('2100-1-1')) self.assertTrue(not (d == cf.dtlt('2001-1-1') & cf.dtlt(2010, 12, 31))) #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Query_evaluate(self): for x in (5, cf.Data(5, 'kg m-2'), cf.Data([5], 'kg m-2 s-1')): self.assertTrue(x == cf.eq(5)) self.assertTrue(x == cf.lt(8)) self.assertTrue(x == cf.le(8)) self.assertTrue(x == cf.gt(3)) self.assertTrue(x == cf.ge(3)) self.assertTrue(x == cf.wi(3, 8)) self.assertTrue(x == cf.wo(8, 11)) self.assertTrue(x == cf.set([3, 5, 8])) self.assertTrue(cf.eq(5) == x) self.assertTrue(cf.lt(8) == x) self.assertTrue(cf.le(8) == x) self.assertTrue(cf.gt(3) == x) self.assertTrue(cf.ge(3) == x) self.assertTrue(cf.wi(3, 8) == x) self.assertTrue(cf.wo(8, 11) == x) self.assertTrue(cf.set([3, 5, 8]) == x) self.assertFalse(x == cf.eq(8)) self.assertFalse(x == cf.lt(3)) self.assertFalse(x == cf.le(3)) self.assertFalse(x == cf.gt(8)) self.assertFalse(x == cf.ge(8)) self.assertFalse(x == cf.wi(8, 11)) self.assertFalse(x == cf.wo(3, 8)) self.assertFalse(x == cf.set([3, 8, 11])) self.assertFalse(x == cf.eq(8) == x) self.assertFalse(x == cf.lt(3) == x) self.assertFalse(x == cf.le(3) == x) self.assertFalse(x == cf.gt(8) == x) self.assertFalse(x == cf.ge(8) == x) self.assertFalse(x == cf.wi(8, 11) == x) self.assertFalse(x == cf.wo(3, 8) == x) self.assertFalse(x == cf.set([3, 8, 11]) == x) #--- End: for c = cf.wi(2, 4) d = cf.wi(6, 8) e = d | c self.assertTrue(c.evaluate(3)) self.assertFalse(c.evaluate(5)) self.assertTrue(e.evaluate(3)) self.assertTrue(e.evaluate(7)) self.assertFalse(e.evaluate(5)) self.assertTrue(3 == c) self.assertFalse(5 == c) self.assertTrue(c == 3) self.assertFalse(c == 5) self.assertTrue(3 == e) self.assertTrue(7 == e) self.assertFalse(5 == e) self.assertTrue(e == 3) self.assertTrue(e == 7) self.assertFalse(e == 5) x = 'qwerty' self.assertTrue(x == cf.eq('qwerty')) self.assertTrue(x == cf.eq('qwerty' , exact=False)) self.assertTrue(x == cf.eq('^qwerty$', exact=False)) self.assertTrue(x == cf.eq('qwe' , exact=False)) self.assertTrue(x == cf.eq('qwe.*' , exact=False)) self.assertTrue(x == cf.eq('.*qwe' , exact=False)) self.assertTrue(x == cf.eq('.*rty' , exact=False)) self.assertTrue(x == cf.eq('.*rty$' , exact=False)) self.assertTrue(x == cf.eq('^.*rty$' , exact=False)) self.assertTrue(x == cf.eq('qwerty')) self.assertTrue(x == cf.eq('qwerty')) self.assertTrue(x != cf.eq('QWERTY')) self.assertTrue(x != cf.eq('QWERTY' , exact=False)) self.assertTrue(x != cf.eq('^QWERTY$', exact=False)) self.assertTrue(x != cf.eq('QWE' , exact=False)) self.assertTrue(x != cf.eq('QWE.*' , exact=False)) self.assertTrue(x != cf.eq('.*QWE' , exact=False)) self.assertTrue(x != cf.eq('.*RTY' , exact=False)) self.assertTrue(x != cf.eq('rty$' , exact=False)) self.assertTrue(x != cf.eq('.*RTY$' , exact=False)) self.assertTrue(x != cf.eq('^.*RTY$' , exact=False)) # self.assertTrue(x == cf.set([5, 'qwerty'])) # self.assertTrue(x == cf.set([5, 'qwerty'] , exact=False)) # self.assertTrue(x == cf.set([5, '^qwerty$'], exact=False)) # self.assertTrue(x == cf.set([5, 'qwe'] , exact=False)) # self.assertTrue(x == cf.set([5, 'qwe.*'] , exact=False)) # self.assertTrue(x == cf.set([5, '.*qwe'] , exact=False)) # self.assertTrue(x == cf.set([5, '.*rty'] , exact=False)) # self.assertTrue(x == cf.set([5, '.*rty$'] , exact=False)) # self.assertTrue(x == cf.set([5, '^.*rty$'] , exact=False)) #--- End: def #--- End: class if __name__ == '__main__': print 'cf-python version:' , cf.__version__ print 'cf-python path:' , os.path.abspath(cf.__file__) print '' unittest.main(verbosity=2) cf-python-1.3.2/test/Coordinate.py0000600000175000017500000000640412404307361017240 0ustar daviddavid00000000000000import tempfile import os import sys import itertools from operator import mul import numpy import time import cf def test(chunk_sizes=(17, 34, 300, 100000)): start_time = time.time() print '----------------------------------------------------------' print 'cf.Coordinate' print '----------------------------------------------------------' original_chunksize = cf.CHUNKSIZE() for chunksize in chunk_sizes[::-1]: cf.CHUNKSIZE(chunksize) a = numpy.arange(89.5, -90, -1) b = numpy.empty(a.shape+(2,)) b[:,0] = a+0.5 b[:,1] = a-0.5 c = cf.Coordinate(data=cf.Data(a), bounds=cf.Data(b)) assert(c.equals(c.squeeze(), traceback=True)) print "cf.Coordinate.squeeze passed", "pmshape =", c.Data._pmshape assert(c.equals(c.transpose(), traceback=True)) print "cf.Coordinate.transpose passed", "pmshape =", c.Data._pmshape d1 = c.flip() d1.flip(i=True) assert(c.equals(d1, traceback=True)) print "cf.Coordinate.flip passed", "pmshape =", c.Data._pmshape # ------------------------------------------------------------ # cf.DimensionCoordinate.roll # ------------------------------------------------------------ modulus = 10 for a in (numpy.arange(modulus), numpy.arange(modulus)[::-1]): c = cf.DimensionCoordinate(data=cf.Data(a, 'km')) c.cyclic(cf.Data(1000*modulus, 'm')) pmshape = c.Data._pmshape for offset in (-16, -10, -6, 0, 6, 10, 16, 20): d = c + offset for shift in range(offset-21, offset+22): if d.direction(): centre = (d.datum(-1)//modulus)*modulus a0 = d.datum(0) - (shift % modulus) if a0 <= centre - modulus: a0 += modulus a1 = a0 + modulus step = 1 else: centre = (d.datum(0)//modulus)*modulus a0 = d.datum(0) + (shift % modulus) if a0 >= centre + modulus: a0 -= modulus a1 = a0 - modulus step = -1 e = d.roll(0, shift).array b = numpy.arange(a0, a1, step) # print e, '\n', b, '\n' assert (e == b).all(), '%s, shift=%s (%s), %s, %s' % (d.array, shift, shift%modulus, e, b) #--- End: for #--- End: for #--- End: for print "cf.DimensionCoordinate.roll passed", "pmshape =", pmshape #--- End: for # Reset chunk size cf.CHUNKSIZE(original_chunksize) time_elapsed = (time.time() - start_time)/60.0 print print '---------------------------------------------------------------------------' print 'All cf.Coordinate tests passed for cf version', cf.__version__ print 'Running from', os.path.abspath(cf.__file__) print 'Time elapsed: %f minutes' % time_elapsed print '---------------------------------------------------------------------------' print #--- End: def if __name__ == "__main__": test() cf-python-1.3.2/test/test_Coordinate.py0000644000175000017500000000267212763331675020327 0ustar daviddavid00000000000000import cf import datetime import numpy import os import time import unittest class CoordinateTest(unittest.TestCase): filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test_file.nc') chunk_sizes = (17, 34, 300, 100000)[::-1] def test_convert_reference_time(self): c = cf.DimensionCoordinate(data=cf.Data([1, 3], 'months since 2000-1-1'), bounds=cf.Data([[0, 2], [2, 4]])) self.assertTrue((c.dtarray == numpy.array([datetime.datetime(2000, 1, 31, 10, 29, 3, 831197), datetime.datetime(2000, 4, 1, 7, 27, 11, 493645)])).all()) c.convert_reference_time(calendar_months=True, i=True) self.assertTrue((c.dtarray == numpy.array([datetime.datetime(2000, 2, 1, 0, 0), datetime.datetime(2000, 4, 1, 0, 0)])).all()) self.assertTrue((c.bounds.dtarray == numpy.array([[datetime.datetime(2000, 1, 1, 0, 0), datetime.datetime(2000, 3, 1, 0, 0)], [datetime.datetime(2000, 3, 1, 0, 0), datetime.datetime(2000, 5, 1, 0, 0)]])).all()) #--- End: def #--- End: class if __name__ == "__main__": print cf.ENVIRONMENT() print '' unittest.main(verbosity=2) cf-python-1.3.2/test/Units.py0000600000175000017500000001245712274460112016257 0ustar daviddavid00000000000000import cf import math import os import time def test(): start_time = time.time() print '----------------------------------------------------------' print 'cf.Units' print '----------------------------------------------------------' # ---------------------------------------------------------------- # cf.Units.equals # ---------------------------------------------------------------- assert cf.Units('m')==cf.Units('m') assert cf.Units('m')==cf.Units('metres') assert cf.Units('m')==cf.Units('meTRES') assert cf.Units('days since 2000-1-1')==cf.Units('d since 2000-1-1 0:0') assert cf.Units('days since 2000-1-1')!=cf.Units('h since 1234-1-1 0:0') assert cf.Units('days since 2000-1-1')==cf.Units('d since 2000-1-1 0:0', calendar='gregorian') assert cf.Units('days since 2000-1-1')==cf.Units('d since 2000-1-1 0:0', calendar='standard') assert cf.Units(calendar='noleap')==cf.Units(calendar='noleap') assert cf.Units(calendar='noleap')==cf.Units(calendar='365_day') assert cf.Units(calendar='nOLEAP')==cf.Units(calendar='365_dAY') assert cf.Units('days since 2000-1-1', calendar='all_leap')==cf.Units('d since 2000-1-1 0:0', calendar='366_day') assert cf.Units('days since 2000-1-1', calendar='all_leap')!=cf.Units('h since 2000-1-1 0:0', calendar='366_day') print "cf.Units.equals passed" # ---------------------------------------------------------------- # cf.Units.equivalent # ---------------------------------------------------------------- assert cf.Units('m').equivalent(cf.Units('m')) assert cf.Units('meter').equivalent(cf.Units('km')) assert cf.Units('metre').equivalent(cf.Units('mile')) assert cf.Units('s').equivalent(cf.Units('h')) assert cf.Units('s').equivalent(cf.Units('day')) assert cf.Units('second').equivalent(cf.Units('month')) assert cf.Units(calendar='noleap').equivalent(cf.Units(calendar='noleap')) assert cf.Units(calendar='noleap').equivalent(cf.Units(calendar='365_day')) assert cf.Units(calendar='nOLEAP').equivalent(cf.Units(calendar='365_dAY')) assert cf.Units('days since 2000-1-1').equivalent(cf.Units('d since 2000-1-1 0:0')) assert cf.Units('days since 2000-1-1').equivalent(cf.Units('h since 1234-1-1 0:0')) assert cf.Units('days since 2000-1-1').equivalent(cf.Units('d since 2000-1-1 0:0', calendar='gregorian')) assert cf.Units('days since 2000-1-1').equivalent(cf.Units('h since 1234-1-1 0:0', calendar='standard')) assert cf.Units('days since 2000-1-1', calendar='all_leap').equivalent(cf.Units('d since 2000-1-1 0:0', calendar='366_day')) assert cf.Units('days since 2000-1-1', calendar='all_leap').equivalent(cf.Units('h since 1234-1-1 0:0', calendar='366_day')) print "cf.Units.equivalent passed" # ---------------------------------------------------------------- # cf.Units arithmetic # ---------------------------------------------------------------- assert (cf.Units('m')*2) ==cf.Units('2m') assert (cf.Units('m')/2) ==cf.Units('0.5m') assert (cf.Units('m')//2) ==cf.Units('0.5m') assert (cf.Units('m')+2) ==cf.Units('m @ -2') assert (cf.Units('m')-2) ==cf.Units('m @ 2') assert (cf.Units('m')**2) ==cf.Units('m2') assert (cf.Units('m')**-2) ==cf.Units('m-2') assert (cf.Units('m2')**0.5)==cf.Units('m') u = cf.Units('m') v = u u *= 2 assert u==cf.Units('2m') assert u!=v u = cf.Units('m') v = u u /= 2 assert u==cf.Units('0.5m') assert u!=v u = cf.Units('m') v = u u //= 2 assert u==cf.Units('0.5m') assert u!=v u = cf.Units('m') v = u u += 2 assert u==cf.Units('m @ -2') assert u!=v u = cf.Units('m') v = u u -= 2 assert u==cf.Units('m @ 2') assert u!=v u = cf.Units('m') v = u u **= 2 assert u==cf.Units('m2') assert u!=v assert (2*cf.Units('m')) ==cf.Units('2m') assert (2/cf.Units('m')) ==cf.Units('2 m-1') assert (2//cf.Units('m'))==cf.Units('2 m-1') assert (2+cf.Units('m')) ==cf.Units('m @ -2') assert (2-cf.Units('m')) ==cf.Units('-1 m @ -2') assert (cf.Units('m')*cf.Units('2m')) ==cf.Units('2 m2') assert (cf.Units('m')/cf.Units('2m')) ==cf.Units('0.5') assert (cf.Units('m')//cf.Units('2m'))==cf.Units('0.5') u = cf.Units('m') v = u u *= u assert u==cf.Units('m2') assert u!=v u = cf.Units('m') v = u u /= u assert u==cf.Units('1') assert u!=v u = cf.Units('m') v = u u //= u assert u==cf.Units('1') assert u!=v assert cf.Units('m').log(10) ==cf.Units('lg(re 1 m)') assert cf.Units('m').log(2) ==cf.Units('lb(re 1 m)') assert cf.Units('m').log(math.e)==cf.Units('ln(re 1 m)') assert cf.Units('m').log(1.5) ==cf.Units('2.46630346237643 ln(re 1 m)') print "cf.Units arithmetic passed" time_elapsed = (time.time() - start_time)/60.0 print print '---------------------------------------------------------------------------' print 'All cf.Units tests passed for cf version', cf.__version__ print 'Running from', os.path.abspath(cf.__file__) print 'Time elapsed: %f minutes' % time_elapsed print '---------------------------------------------------------------------------' print #--- End: def if __name__ == "__main__": test() cf-python-1.3.2/test/test_CellMethods.py0000644000175000017500000001161212745346617020437 0ustar daviddavid00000000000000import cf import os import unittest class CellMethodsTest(unittest.TestCase): filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test_file.nc') chunk_sizes = (17, 34, 300, 100000)[::-1] original_chunksize = cf.CHUNKSIZE() strings = ('t: mean', 'time: point', 'time: maximum', 'time: sum', 'lon: maximum time: mean', 'time: mean lon: maximum', 'lat: lon: standard_deviation', 'lon: standard_deviation lat: standard_deviation', 'time: standard_deviation (interval: 1 day)', 'area: mean', 'lon: lat: mean', 'time: variance (interval: 1 hr comment: sampled instantaneously)', 'time: mean', 'time: mean time: maximum', 'time: mean within years time: maximum over years', 'time: mean within days time: maximum within years time: variance over years', 'time: standard_deviation (interval: 1 day)', 'time: standard_deviation (interval: 1 year)', 'time: standard_deviation (interval: 30 year)', 'time: standard_deviation (interval: 1.0 year)', 'time: standard_deviation (interval: 30.0 year)', 'lat: lon: standard_deviation (interval: 10 km)', 'lat: lon: standard_deviation (interval: 10 km interval: 10 km)', 'lat: lon: standard_deviation (interval: 0.1 degree_N interval: 0.2 degree_E)', 'lat: lon: standard_deviation (interval: 0.123 degree_N interval: 0.234 degree_E)', 'time: variance (interval: 1 hr comment: sampled instantaneously)', 'area: mean where land', 'area: mean where land_sea', 'area: mean where sea_ice over sea', 'area: mean where sea_ice over sea', 'time: minimum within years time: mean over years', 'time: sum within years time: mean over years', 'time: mean within days time: mean over days', 'time: minimum within days time: sum over days', 'time: minimum within days time: maximum over days', 'time: mean within days', 'time: sum within days time: maximum over days', ) def test_CellMethods___str__(self): for s in self.strings: cm = cf.CellMethods(s) self.assertTrue(str(cm) == s, '%r != %r' % (s, str(cm))) #--- End: def def test_CellMethods_equals(self): for s in self.strings: cm0 = cf.CellMethods(s) cm1 = cf.CellMethods(s) self.assertTrue(cm0.equals(cm1, traceback=True), '%r != %r' % (cm0, cm1)) #--- End: for #--- End: def def test_CellMethods_equivalent(self): for s in self.strings: cm0 = cf.CellMethods(s) cm1 = cf.CellMethods(s) self.assertTrue(cm0.equivalent(cm1), '%r not equivalent to %r' % (cm0, cm1)) #--- End: for # Intervals for s0, s1 in ( ['lat: lon: mean (interval: 10 km)', 'lat: lon: mean (interval: 10 km)'], ['lat: lon: mean (interval: 10 km)', 'lat: lon: mean (interval: 10 km interval: 10 km)'], ['lat: lon: mean (interval: 10 km interval: 10 km)', 'lat: lon: mean (interval: 10 km interval: 10 km)'], ['lat: lon: mean (interval: 20 km interval: 10 km)', 'lat: lon: mean (interval: 20 km interval: 10 km)'], ['lat: lon: mean (interval: 20 km interval: 10 km)', 'lat: lon: mean (interval: 20000 m interval: 10000 m)'], ['lat: lon: mean (interval: 10 km)', 'lon: lat: mean (interval: 10 km)'], ['lat: lon: mean (interval: 10 km)', 'lon: lat: mean (interval: 10 km interval: 10 km)'], ['lat: lon: mean (interval: 10 km interval: 10 km)', 'lon: lat: mean (interval: 10 km interval: 10 km)'], ['lat: lon: mean (interval: 20 km interval: 10 km)', 'lon: lat: mean (interval: 10 km interval: 20 km)'], ['lat: lon: mean (interval: 20 km interval: 10 km)', 'lon: lat: mean (interval: 10000 m interval: 20000 m)'], ): cm0 = cf.CellMethods(s0) cm1 = cf.CellMethods(s1) self.assertTrue(cm0.equivalent(cm1, traceback=True), '%r not equivalent to %r' % (cm0, cm1)) #--- End: for #--- End: def #--- End: class if __name__ == '__main__': print 'cf-python version:', cf.__version__ print 'cf-python path:' , os.path.abspath(cf.__file__) print '' unittest.main(verbosity=2) cf-python-1.3.2/test/wgdos_packed_0.pp0000600000175000017500000003221012247102503017777 0ustar daviddavid00000000000000zÐÞ I`€f' Á´B¹B ÀpÀp@€Î€?x3Ý öÿÿÿI`€séB@håB' ¡Gl™Èj,õóŽ^ ý¦¿8c&"¦Åû„qʨâe/„UrÏèk¥âSéáœg7Ø3{¥]½¸â:%Ù—ôòæùåüÿÚzñpÔ×ü³C÷>§ªMQ¾ÈcfÍÔ~Ú ãd¥Lfð¸ a)_6„€wÊ+MñM€›P­”KÊLôLóNW ’Dá×ÛDxoi,–þɬ? ’ ¾ÀæB*Ø·lg[3ùy%šz¡C¨ /9t!vŠ>"nhH+Ê‹v'¡ÒgÏ©Ak˜¯v¨x±ZšëݰÆÇäùt}'Ÿ–HúYÞ„¾`Ø ÆQyº£ÙœæDU•^;KQõ§òÈÌt“ˆÆ‹qf PŠûæðÀ„ ¦®©'L ŒªB‰  °•Ytó³Ì2OûQŠ B`L Úµo±¸(ØÔe=f·ÝB0Ý‹°€a@yÔ[#QEh°d»g i±V a]XÀZ$?°LÿJCÊOhLII0LúK†KöIòMyE}N—B-D|HLB‡KãGgMIMuOåNcHL-D@FÎ@ÊBT=þ>•9};C6¤7¶0×3ö+.E(‚)+m(Ð/a0á0û,Í2Ã3h4¤2›5=7ã13¬S$:ªIƒG®j´ Ed"®<‰@L B(®W0Š0Å)77n,Ë%„f€äB0ì±H°Á°î°¼‡¸ø±6º®ªÆ±ð‰ê¤–›’î8.lƒ;4999-1t:)2$32œ2Õ*Ö*:–38Ú4N0P/£4œ2/9ß6,.ˆ7*ž,P%|*ãf!»ª¸D â(ßÄ2†)3!Z2À,x24V/®.ÒW/7+ r -/%E;X=ì ½ á ø•0æ>¬[˜ðåB0q¢Ú¡ÿ»t§ù¸§¼]³£µÁ¤b±¯–ž–#=Òm{=:r8Œ:/Ñ71Ó458-Ñ3l3 G&5@"È!Ä/Ç+0¶.™-Q1‘&Ã,ÖV"öTÀjÿ_ ‡ · öÍ6 eR æ ä[ !)¤Ñ)”'L*U+<(Ø%FA)/Ñe¶\gFÉ*Ò)!ã$îµ Iñ’àÖ'4½ ¸Uˆ R™€%åB01¯¶¨vÄìÃ¥Ã1ÆŸº"¼4³¥fcHi>X1d‹G[M$G(FkF˜Fö@yFÎK;H0Ta¢”HtÄ'j!x5ö8‚2=3–1|2.L3.+:,¸*@+½,™*ÿ(+*({'óÌïÁ~̆î$Ô#e%b%Û(“%,È'™9ñ8‡¨XPæ`*Qžà~ŸŠ£X) 3H/Ž)Æ—#¦-wñ:ì@e3l¢Œ•€ŸáB0BƾÅÏÍÌÜÙöÒ!ÌÛÑœŸº­iJkfËjšX=_­_ªXÓ;7^>W1aW5†3-"/…$”(è+(Ãu¼:¯æC AÒE2FÎCeDÙFÛC`CƒE)D/CŠO6EßNXMá|xG2IèL·EJM >‰>gCmC>!¡F„"§ ®8×%î3-0"ÎG[&}#:µ'øMNV=§hh+¿¸SSš!CGq0éA™Tô8 ZßWßx?_n·Ô«ÀˆäB0®´ª±@Ñ¿ÈïÎо_fѾ[*o9oD_ü`{T²WðY{Sb6r?Ø6}90b3ð*M.«"í(Ôã[ ² OÈ_Bà¶åþLø–JOEQKt[_Y]~SùzlÈAÚ$¾w¨Só`dÌWM\$$ûXâ!$­#²$Ì*ðM$ 9Á¯#Ìó7ß2öcÙD·¦`cwa,fCØ9\';C9P¿ˆ~hÓª+£K¼b·€¬åB0tȽ«΢̤d$]PSnYAMtJlûBtuj?Í9MHŽCu=E;¹;É9v:#2›%Ã#°øiŠ u,°ßÕÌ Ã!Ù4 ($ó(# +)žû=¤+˜¤bLoóLÈMqGLJd=‘E]=å;8.W7;$Z(‡ · b#Ä Ô$);p{*2FˆMå*$´»ŸÒaŠ[¸:£D7;¯B¯¡ü¢VºF¡?ÕÓáÊHÔ4åB0úÎÈaÏ+ÕösppcH««ShOMNâPÕJáFçB¯AÅHºEÎC™FÁEžDnEG=eCà0n6•$D*½€ï 0 ç$8å‘’Ž#-b<™*„>¯F§¶¬¢ ¼fºG·B}‚x¢e>mƒmÿla¯b¼Rÿ_ÕH›M5A¢(Ì+Ú.(à"ö.Ž9Ó7W'uN3s&Œ¹Ø©PX¹$BRYÆg¨‚×$Ñz¥ÚÛ*‘ͰÙ"åB0¨ÓÅÒT‚gu׺4sÚ_6t^§dxWâWQlT›KvMºMjN'L“MïMMâLfO1N‚O}A"IK5³:Ã+ê"« Š øïá­€#12B‚/&¶Ê¨ÚÀ£´i¿Ž‰÷—í†N„oÆxŽeôdè_¹fZeTOIuY¿2);,¾P°R;VïYr8ql•&¢;¡{¤I£§”¥ÿª*¨¾«²«„†»©ˆq}|‚g:h÷RcZ%A¼I.¢4ñ9Z0üН…eO’@_>Eª‹¼G(™ð’” çœ+¨Î£FªEªV¹E±±¼Ã¼Š¼€²ïB0üª¥†Gm˜ocbÔm;^[•[4a[SŸUD MC;Õ;Á090G6|20;À7ëKÐ@ó?IÞF¼8™›AAðEÄŠ,FÏMáAéIOG4Z£O ’¶š—ö¥T¢ì¬‹ª–´Q®¹UºÌŠŠÀ óB0owév5_°euNtYwTïN-]!]ïX7\dIûOADùId@j?Æ>½Bv@T2q1½=õù"ø/m3ÆŸ+q ÉŒX~ iC€e€Ž„ׇe†à‰¨ˆ_ˆ‹97Ž]‘T#”š’*™ –zžª›ñ¡šŸkiQ¡P;dcAöFí1&7Ú=Ê4N7¡:Hq:ð@©9F+B0[R‘†”„Þ’𮕤砅©>¥®.®2¦Ì©€WòB00„N€ÅN*oPùW\ÃTebMmwlgaíi…RÔT OöMPMìPtJ,N )pE'° '¥ 0/¨! («2?NõÑãŒ}iû‚~„ð……ŠMˆ»Œ4‹ÄiŽf’‘£•”›˜ô–LŸšÉ¡_Ÿˆ¦Â¤ž‰Ý¥~gVy6Qš\P?œA,HÏB(Œ·DÎMv>@LŒG‰"N•nÌŽ¶šŽ|›¡“í¢%žØ¯ûªâ®Û«(´)²°²‹öB0Wj}|uMÙTJzD+]{T.™A–çh¹™æ•Ãj|OËQKÇMòPzS?JYæ1Û9g$Ž"á Î%ó$•#^*‡ß%&Ç oÊpã.ñuÃuKwEvU|Ìyó}ï|ñ€î΄ς=‡C†"Š›ˆUOŒ÷’‘â—-–4y꘾U-hšCã<šJ±@LA-=§ƒÝCCÕ†–:?K€ Cƒe†}‹… ˜‘ҜЕG¥œ¦O¢¢ú¥Ã£Ã¢Ü¥€ÕûB0+”lcŸMz“^IO“ VW5‹Íˆe]@Ž‚‡:C³EL‚FÑC?ªK5é4š2#G&w%ÂÕŸ¹\…#bü`Â^ìaãac:djnemžlÆo9nÎtÃq¯vvQyÒw”~¸{O›†ô„)`œ†l?qCK'2¯AE5 >"==*GS:>HJÕLGÿOÄMÚ§Ç£š¦Š§ˆ¤Ÿ¤«þžLš>š[ž4$šÏ›g™‡™“›Xš·kv€åùB0¼tùt²¥Òul¥—¤†©Ò§J®Æ«´zšv1Yƒhªcc^{WlbZ8¾:ä(» ‰p‹ ê9“'SPÔM¸VéUg”t‹;š†Ž‚JîUÿ …¥›Ÿ¡¢™œL•`…?’½äC“Ée•I“b—:—°™ —¹›¾›˜šŸg¯lLR>\BXÜW˜]çY_¸`É\\×µí´é®J¯z¨!«C§ß¦Ë¨§U©¼ªC§Â§î¦¸¦~©Ý¦œ€$«ÀpûB0‘xmo7| €B£›£ ¥Ì£ªÄ§q¸sdpqìbqVÈ]˜arßE@¹n¯ q*Χ'¤SkPYhVp˜êc …˜Ê¢¢¥¢£„§£Ô£Qߟ—DšŒ“+”6•7”ø‘l”¾“œ‘c—U–Z˜ï—.šî—Ç™´šd—J—ír”‰[ûnY`Ø]®e2b—gÃf­®jÚ¯´²§ãªe¦Â¥\¦±¤3¨Ž§¥§z¨Ó¥k¦á¤¥­§>¥Òj5xKûB0•€Â~›z#€‡Q€Nˆà†'€¼‰êyOvø´óz’V ZÆn¦r—„ãc›j©ái Gq!›_m—däa/¢ki ¬³¤Æªð¬§C©÷¤o¤š¡œ¢.Ÿ  3žž+ž@ž´œSqžž·ŸþžŸ"  ÜždžÿŸ<œšœ2ž3›‡iŠ|/kzjÂq[kãmêp]¸‚s¶¬<°6«©«†ª«<­«b®H®Q­®«G¬Ò¨º©áª–©€þwHC-ÍËÜlÅ¢R`\Lan¸MGåÎêXÕºj•té8R3¤»eñuZW¦Î–ŠmØŸØGÔÉB—A¯‹Rv4;­õñjÚ5L¨ TȦÊP±ŒªIQiæô뤅҅ŒÂHt, Òöè_?Û¡儾móñéÂL‚æÚ=©šã½¹¶qÉÔºQ]ÎîjláÞûeή6wÍ· Ü.õ’s¸]xo lõ¸ ‹ÝËâ¥ïQ;(¶×› _C-¼‘xXcI±´OG D¯ö4’®f#ÛÁmgIßžV±jãdB*Ú5ê,S‘CI8S…ÐR4ݣ܅cF>DSŠˆ8D+b6ñ±ŠTÅn2Žg¼øc"Aë„füêoýW?ÿßÿù„}}ËÃí±rÇ$;#böÈw@õ*–ä½¢DNëNRP?Ëù=ê¥[3#š3Läv9ÓÅÉìÉd¥(ÁPh”/¾ªêµ(È©s•C-¸ƒàPãzÙ‰‹Ä„=°–yQZoÄߣÙéššbÊŽe( ;.J¶"^ÑÈSp]eHyðà›@½ÆÆŸ„èõÿàuÐ6…ÎBþf ×4H*”}_vy¿=ãÚEðÎZç­8Þ«Ø–n^<;¦ ‡ Zf ³5=Ýúi²›ü⌠mŠ—Eõ>b4§V9¤{»eQ² ’ÜÈä=š"°Ød?ˆà§ùÖ}ŠÇóïIq)E,¦¤d¿C-”z¤K“véÍÈz$`1z”* c¸C”‚É„«lÂrØ0Dò)ðëe"AsФWî‡RwhzÄx 0‘Ê4.þO>bßíù¨|ÌÕ+ñÕÂNwöµaAºPeô|ÒTÒ: ¼QÁ¦~yý³Ü°óRQ$Zh¶‚™=ÌgÄí.×â¨ÒZè`B;)4m©þ’€»C-qä~iôö»æÙëðxú0œF6#ꩼ¨a±±/ƒ¶BcýÁPëó¿‰ kðâzÕÕÓÝqű-Ø÷Í×d]C¦š5_¬Í³‰äÃw. ùËØ`c‚ñŽdFÄ?R2/ÙzG`dÉçq :žKqÈ(SÁ®áåéL|õ,³V_ëã^ê¬ÀÑÆ’çöo#@À5‚ñECèqÊ¡e#<.^÷ØZr''ŸÝö‹!æ1Ù×DôC-é˜6DT}bHR i,A %;tÂß|b˜»{ÇÙOÎôdÜ3€ÄJ¹•ï­tÖÔ§W?ÒAÏL–Eæ<,Í)Q„¸Ò$Õqˆg”5Å]иl¦6«RÂLBf›2kÎŒi†32Y¼ËËÄÕë,®–k°{˜Þ¶Â]0¤RjU·«fµ½ÐEs›É¦)¨¬æÓ› Ì“ÄÝò8ζ{C}Y­´iµëŸÅÑŒD¦.°gØw¾T_Ž}URŒ8ö¹1Ÿ˜µÁîb5¬*k’|IE#5u‡3Nú€ @zq+RÎÍõΟDij2»ôb¸ž*be¤‰5ˆ$–ü¶C-AžjSi2XâŒR³S}-O–žÙŸ¤bDÒ~ƒÃ{ìáý­ö¦¦2ûg¾N` »ò}aÊ x¥mSCÝç…¡Jºô«¡—å’šÉ=ÚÅ£9‡²»‘›%îàlr¶+°=Ù r&S1ÍØ¢Âèa< ‡}\¬Aö2ØYÉ>eµä “ª†L7'@+E—Bn5„êÔéoƒû7Ò‚± ŽƒÓ2Èpeùã’„±ŠƒUL©ÚÔh÷C-L[Ô0BrÁ—ŠM;!¾šb±ùà–OKR—¼ËÄXö-úE娨tqèÏux~8ä’Qüˆ7æõ"cÂØ‘B#)~H£ëV¡ˆ2-g4¼RB=º:Í”‚ŠÔÑ4‰€E#ú q‡Gô#ÝNªxÂ;jÚ9ïmÇÃ3°œ’NÐxØ:CªäK3¦=(ÚÂŒ`OJã\9Þæö]g$ÁÎÌÆÈãäÁϧx¦<ÆÇÙíØ†fhÓ)@ Ô/C*á„ø#Fɺ××l†2ÀÜêGŒM™Zb3cÕôuM<‘0$ãÙ¨Ü …9CžOP®_¬qã:Êšµ·í¯Ïiz¬BqP‹é–÷*mRekL´´ÕG3HNÛâ·<Ð2ºËË)Ó̪¸+ ‘ †RÒ§<'sˆË‘‚ôè éÄŇ&£ìM]2ÆÓœe¥DE“ã¢Ð 4%±ŠÉb‹”|%·H#28+C*±yh!ò„E"’>Y}€QÅÞ½¨=öâÊëRqr€% ‚ÈÄa1Xì4 Â@s°"$µ[ïÒqÁ‚¦"‡’Ny?¢©?á’òd¸µF¤ÏÜcîˆ=*½ w­Á}àà!°G#\d7ÞDEÑ1Vœâaã J¤<Ó$ÛôT"×µ(a¨!eÏ72ÁV(” ‹ÄC®À$Dœ X†dp C*³“Ð-B N Uà$¦Æ_æ_ë`?Ú[Lmм,“GáîÐPTp¸@C€E«!ÑX` ,ZˆÂȹ²AW¥“vÆ+)aJdûÒZä$ ™C1B2­Ì%‹‰HHâzä!ÕW…Š‘1eÐ^F'Y$¤ sƒFà/Z</no6”ší‘$<©&Ñfô¸¸Äý;G@ž4H“AÐC*eî@O5–ö yÚ¡ª³D¥^…ØP­k‚o¶EmYYLÆ“3þ D-¿Œ‰K¢žš$&d ÝÏ@3>wNFñªA‘ömòšKȦ–iBÇž¡vf¤qyPV(Ä.I}E¢‘ÎÚÃñà;Í»ÌSCÔÌ46TNNAɸ€/[ÌŽÐr¹üF‰‘¯ †³•¡JkÕ¶£3ÿ46M‘£êÌ04?žŽ1SàËC*2]T4‚DŒS¦¤è*ñ ‹¿±m¥Ä&?úÉ>㳑>Ó ¨Ò¼´L"– lyLĬÄá‘Kô!|QzÓ¥=PßPÒëWÁLég‰æD‚q{BÓñ¡ƒí´Ô0WHr³€\!„ŠF¥ñj@DG‰ÏqkÄØG‰h^¼/ (õOqH&»Ki™¡P¼ÙDÉBƒðt’ƹ˜›C*rª˜*#ßI°ÒˆtˆJ¹ÀFvX0«…ÁÁ±KHA‰¿ºSí$<6]ŽÌg“صÈ/äþŠÕ"Ÿ¸*1wŠecTñämi¯TÐEmÓùhnÉfhã·¦œpž& ÕÙOgO ô×p;zâË3ò¶//‹»Ô0ÓLŽóBÃ(\G:£Zñ†¿ü2šÇoµàP|ÂÍ<Ã)¶ÌIx{C*"«|.!Ô ¥é¡w$Ü Æ1J?ô•áÀTð¤3©c®ƒý€7÷ McÕÃl0…H sóÙ¤599MeÍ”ñ%lWX¸Eh¢€qDua×ÎnOª‰µƒAÑW¨VR§$CH|¶ÎóÃÃê :8zo„ããh<÷β#öBôPl\ŽÊ|Ì/yˆÐ›€B”øĈY1:¤&Úä gs`bC*‘„ ÕWz1ahTNF…X1mJ¸0ŒÁÑÀ¼4ÆA‰ÉSâ0 :NL4#Þ·0ÃÂËɲ³Ãø0=P”hÔ é­LÀÒU3åBˆiZRRËDd&‘H[«¾õZEiN”Óô40åL)QoD‘D?€ÏõðƒõÔÉ@!ÐÑD\UqÌñÚágH4؇*õÐL¤´Ä‡ï|Žô&ß_É;rðRC' Ïl±l2ƒe'¸Ò9*‡WX( tbPUü°ZùÍd”ïz«Û嵺‰4qTozQ#ÆÈêm´Üàz6ÿd‚RÚ“nå‹×l\†fK•¸‚Ñ £›EY˜8ñ,îâb$ŽìÏñ­<Æ{|ÀyûžKû;Ìš…[OL ù|0ÒR¥‡¾ºQ-r—ôÄb£=4 3C' P«É-ä„b§ïDŸâ!?Þ³z|á Û)5é†CPÉd< õÐ- m¼ÉÃQ¤lÔÚÊT5ÔŸúTÐ6Ï$.Y¹³à›†PÌIͧÀ î1kq , ÉÝfþËjy™/ ¢uÉÐh% FênŪ$JN[rVVÌ„¬•Óû;‡$”/[¾<Ÿ‡w¶¸Üy§+Õs÷¤ê¼“ ¥Æú¤Ž<8C' ê‘:%U”Ê,qu+âÒ]¸×fÅ-›òSÚj‹Ø*óùêQò!Ľ@jV z:NØæÂNI4µ bvºì¨[#VPPL¤)åGEªQŒÑW!Žâ˜;5wzí¬Ý¬ù*bô˜FÓý”¥= P(‘kt1$° ~H$á9ÄE* Òñ£$åì¶r—ƒN½øC' Ù ajgâ>ð –?Ä„Løçà!ÊGS}Fp‰,ÔìŠÑb`rÁ1²oâi’‹v«§âˆ Ì>o‹^u—œo†Ë:µ´Íµmåo×êKzú{î¯,U¨ýóTRJS¢–ĺ®ú ´8»k%vÃRY´¥´+Kr{­˜»î»ÅvŽ «¾¢[N ¬]s‹Û-¸åH{iEh;ö8øC' ÓIrOEŸnǧÍ18í«þÐhYªw£hqì{ªÜ„,‹P©à e§»c^ s=OzN dƒVíD©•ïŠbEçÃU9J;,Ô™¢Ó !ŒÉ@Șp±NïC¡ÊãJ¹2B""ždJhŸ° ~@_”ˆvñâ .F¤@ÙÁW€zÈ•“R?Jä±|´à6÷ãÊ”i÷C' J@!/ÕÂU…ÇT™l¹';ÂîŽ@¬ –2){BkT‘% ËÀF'ü@$ÐGp áR  4À x åM:¯Õ*ñÓ†ù.áäÞâ¯Ön îyžg‹°W¶Þ~®¶íÝåÃ|Hgíðîâý:Å“vO÷ðBòP- PºÀHBgy#ÄQÓ)ž’à:¢t”wHfâ ðïC$ NÎEn6[õD ƒYSY]ã"Ò#EEÎÐo Ür%)ÂÞò!–$¸R/b&[²Ø± s.ñAfqB+‚&Å"ubH|‹ª³—ÁÅh(튇¶“ šÖcI7õebM{ Çf'w*X(|<ÿ•gª0š†5¼3:T3íÂyLXÖ^Çm–%eGvÙ07C*L ÃÂÄàp2DçÂqðH|'qÁbMŠz‚‹ÊŠ··•mW‘ûßvü3áSq‚µ}8¼®L}"140½@GγYƼ ïp |÷ŸÅǘ°Bì\{ÅźpQVü_Çq³¼<($sÎýô1i| 7OËË3ÜÝ,2ã[Ì3µ¢=7WøAg_*Ì#KÇʼn1€DLÅü°ð7,/¸ƒð#¬€ªúB-~QC¨ªD]£j/õŽƒûTK¾Iõà.$Ì¢Læt€K5‘/ lÖ•& Ix'Ja”ئ%´Ï’ÄJ7LºØg‰ ÃC?µ°®|cj,ejuó¦¥Seª:RU©YU£ªNT¯ªUWý£"U€j†TN*Q™¨ÊE £ªu†©:U_§QߨúI¥ÉcçR‘«ÔDµ­ÞWu§ºVT’êMS{©âV%©bq³Š_Ô‡ªøB-äJEB¾øeµ¦IMž#È Až`BŠÉ¯CæB@#¥‰ªX¤… f"4)¤¨ApƒŒaÍ…ò„ 6‡7¼7T– ýÙÍ´j™ÂTA9UñTЯ…Ü<ëú_{Y|+ö ¯wWÏêa_§7Õ}‘ŽJu§º9ÕsêvXMäbé-Â'm%ä–@,òB-Ø^ Añçp†LCÖƒ0 ˜§ -øfÆýá030“‰¿øhæ £c•( m9Ü$£éØj¨š$"†ˆØ5f’9é|‹…Â?r=³Ý¡”:z·Nó˜ûÚ jïˆ÷¾|5ŽpÊ8r«;ܹ_mÇ?ÒÖ©NÈ»c&*}’Êð|ge£S—šJÎì†I»l jV|õ [áô¸k'Òêþ<Ÿ¢úr}–j‹ÉËITež­e·’'B×@‹ñB-U¨H^rÀñ‡ªåA ^ 4ÀÔBÑt“ è…9£¬{0 Pí7DûÍé€ä˜"UÎñ§Ã²{Z@ñB-õ¸d£4"F †² ‘W0t'vp'0; p=°<° †‚Bê'rU¼ˆWØÐ¯!dH([ö'áШËPÖ£µË…¾âúj}Ü¥´A8Ú†ì6e/´:z­Ãé³uí˜ÅÏ·f!û²«º^„.JJç²6ôJ®,çrç±wšê“ù¬óÅ¿w›EÝÕî¶6/­z-WàóšSå¶YìjRàͬW„³RZ@NóB-À‰¸I’™ïÑdË¥wJ*¾» t6Â?a¶)ƒ8À=àƒ¬Aͼuk2ȼÕ`ê ûC$DXRnQ¤Œÿ…ô/Í—<m”nåtŠ<¢«mz&5œB6ôŠÀX«ã^¿°;5±Î0³ûi;Hq¥ ôœˆ$y*Š (?X·$Ë'Ü"e ÙëU¬ÐÖŒ‰PÓÈ)üÇ!¥ÿŽˆ%Q“×A“êê5G¦ÖS@öB*uœ™lMDUÞò“u7ãŽJé¢Ív@#=ØÅ†±À;äûÁ¡àìäÁ%€!@BÅÊÀá<:bÎ:Ú¤ô$šŠ ‘BûŒ:U̧cò˜P+<“LžLEYÍe§W›œ¤Ìùwœ©X‡DZu[4aN´M䜮zQV÷+ýÁG÷ÙÏ­žû;÷¾²¹{m¸eª¶îÒ“âhŸs(@º¥vÀ¶†€"ûB qQ˜x3cf-python-1.3.2/test/test_read_write.py0000644000175000017500000002352012765460072020354 0ustar daviddavid00000000000000import tempfile import cf import os import unittest import atexit import numpy import inspect tmpfile = tempfile.mktemp('.cf-python_test') tmpfiles = [tmpfile] def _remove_tmpfiles(): ''' ''' for f in tmpfiles: try: os.remove(f) except OSError: pass #--- End: def atexit.register(_remove_tmpfiles) class read_writeTest(unittest.TestCase): filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test_file.nc') chunk_sizes = (17, 34, 300, 100000)[::-1] original_chunksize = cf.CHUNKSIZE() test_only = [] # test_only = ['NOTHING!!!!!'] # test_only = ['test_write_reference_datetime'] # test_only = ['test_write_HDF_chunks'] test_only = ['test_read_write_unlimited'] def test_read_select(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return # select on field list f = cf.read(self.filename, select='eastward_wind') g = cf.read(self.filename) self.assertTrue(f.equals(g, traceback=True), 'Bad read with select keyword') #--- End: def def test_read_top_level(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return # Test top_level keyword of cf.read filename = self.filename self.assertTrue(len(cf.read(filename)) == 1) self.assertTrue(len(cf.read(filename, top_level=['dimension'])) == 6) self.assertTrue(len(cf.read(filename, top_level=['auxiliary'])) == 11) self.assertTrue(len(cf.read(filename, top_level='measure')) == 4) self.assertTrue(len(cf.read(filename, top_level=['ancillary'])) == 5) self.assertTrue(len(cf.read(filename, top_level='reference')) == 2) self.assertTrue(len(cf.read(filename, top_level='field')) == 6) self.assertTrue(len(cf.read(filename, top_level=['ancillary', 'auxiliary'])) == 15) self.assertTrue(len(cf.read(filename, top_level=['reference', 'auxiliary'])) == 12) self.assertTrue(len(cf.read(filename, top_level=['field', 'auxiliary'])) == 16) self.assertTrue(len(cf.read(filename, top_level=['field', 'measure', 'auxiliary'])) == 19) self.assertTrue(len(cf.read(filename, top_level='coordinate')) == 16) self.assertTrue(len(cf.read(filename, top_level='all')) == 24) self.assertTrue(len(cf.read(filename, top_level=('field', 'measure', 'coordinate'))) == 24) #--- End: def def test_read_write_format(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) f = cf.read(self.filename)[0] for fmt in ('NETCDF3_CLASSIC', 'NETCDF3_64BIT', 'NETCDF4', 'NETCDF4_CLASSIC', 'CFA3', 'CFA4'): cf.write(f, tmpfile, fmt=fmt) g = cf.read(tmpfile)[0] self.assertTrue(f.equals(g, traceback=True), 'Bad read/write of format: {0}'.format(fmt)) #--- End: for #--- End: def def test_read_write_netCDF4_compress_shuffle(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) f = cf.read(self.filename)[0] for fmt in ('NETCDF4', 'NETCDF4_CLASSIC', 'CFA4'): for no_shuffle in (True, False): for compress in range(10): cf.write(f, tmpfile, fmt=fmt, compress=compress, no_shuffle=no_shuffle) g = cf.read(tmpfile)[0] self.assertTrue( f.equals(g, traceback=True), 'Bad read/write with lossless compression: {0}, {1}, {2}'.format(fmt, compress, no_shuffle)) #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_write_datatype(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) f = cf.read(self.filename)[0] self.assertTrue(f.dtype == numpy.dtype(float)) cf.write(f, tmpfile, fmt='NETCDF4', datatype={numpy.dtype(float): numpy.dtype('float32')}) g = cf.read(tmpfile) self.assertTrue(g.dtype == numpy.dtype('float32'), 'datatype read in is '+str(g.dtype)) #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_write_reference_datetime(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for reference_datetime in ('1751-2-3', '1492-12-30'): for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) f = cf.read(self.filename)[0] t = cf.DimensionCoordinate(data=cf.Data(123, 'days since 1750-1-1')) t.standard_name = 'time' dim = f.insert_axis(1) f.insert_dim(t, key=dim) cf.write(f, tmpfile, fmt='NETCDF4', reference_datetime=reference_datetime) g = cf.read(tmpfile) t = g.dim('T') self.assertTrue(t.Units == cf.Units('days since '+reference_datetime), 'Units written were '+repr(t.Units.reftime)+' not '+repr(reference_datetime)) #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_write_HDF_chunks(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: for fmt in ('NETCDF3_CLASSIC', 'NETCDF4'): cf.CHUNKSIZE(chunksize) f = cf.read(self.filename)[0] f.HDF_chunks({'T': 10000, 1: 3, 'grid_lat': 222, 45:45}) cf.write(f, tmpfile, fmt=fmt, HDF_chunksizes={'X': 6}) #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_read_write_unlimited(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return f = cf.read(self.filename)[0] fmt = 'NETCDF4' for axis in ('atmosphere_hybrid_height_coordinate', 'X', 'Y'): org = f.unlimited({axis: True}) cf.write(f, tmpfile, fmt=fmt) f.unlimited(org) g = cf.read(tmpfile) self.assertTrue(g.unlimited()[g.axis(axis)] is True, 'Failed with axis={}, fmt={}'.format(axis, fmt)) fmt = 'NETCDF3_CLASSIC' for axis in ('atmosphere_hybrid_height_coordinate',): org = f.unlimited({axis: True}) cf.write(f, tmpfile, fmt=fmt) f.unlimited(org) g = cf.read(tmpfile) self.assertTrue(g.unlimited()[g.axis(axis)] is True, 'Failed with axis={}, fmt={}'.format(axis, fmt)) fmt = 'NETCDF4' org = f.unlimited({'Y': True, 'X': True}) cf.write(f, tmpfile, fmt=fmt) f.unlimited(org) g = cf.read(tmpfile) self.assertTrue(g.unlimited()[g.axis('X')] is True, 'Failed with axis={}, fmt={}'.format('X', fmt)) self.assertTrue(g.unlimited()[g.axis('Y')] is True, 'Failed with axis={}, fmt={}'.format('Y', fmt)) fmt = 'NETCDF4' org = f.unlimited({'X': False}) cf.write(f, tmpfile, fmt=fmt, unlimited=['X']) f.unlimited(org) g = cf.read(tmpfile) self.assertTrue(not g.unlimited()[g.axis('X')], 'Failed with axis={}, fmt={}'.format('X', fmt)) fmt = 'NETCDF4' org = f.unlimited({'X': True}) cf.write(f, tmpfile, fmt=fmt, unlimited=['X']) f.unlimited(org) g = cf.read(tmpfile) self.assertTrue(g.unlimited()[g.axis('X')] is True, 'Failed with axis={}, fmt={}'.format('X', fmt)) fmt = 'NETCDF4' org = f.unlimited({'Y': True}) cf.write(f, tmpfile, fmt=fmt, unlimited=['X']) f.unlimited(org) g = cf.read(tmpfile) self.assertTrue(g.unlimited()[g.axis('X')] is True, 'Failed with axis={}, fmt={}'.format('X', fmt)) self.assertTrue(g.unlimited()[g.axis('Y')] is True, 'Failed with axis={}, fmt={}'.format('Y', fmt)) fmt = 'NETCDF4' org = f.unlimited({('X', 'Y'): True}) cf.write(f, tmpfile, fmt=fmt) f.unlimited(org) g = cf.read(tmpfile) self.assertTrue(g.unlimited()[g.axis('X')] is True, 'Failed with axis={}, fmt={}'.format('X', fmt)) self.assertTrue(g.unlimited()[g.axis('Y')] is True, 'Failed with axis={}, fmt={}'.format('Y', fmt)) fmt = 'NETCDF4' org = f.unlimited({('X', 'Y'): True}) f.unlimited(None) cf.write(f, tmpfile, fmt=fmt) f.unlimited(org) g = cf.read(tmpfile) self.assertTrue(not g.unlimited()[g.axis('X')], 'Failed with axis={}, fmt={}'.format('X', fmt)) self.assertTrue(not g.unlimited()[g.axis('Y')], 'Failed with axis={}, fmt={}'.format('Y', fmt)) #--- End: def #--- End: class if __name__ == "__main__": print 'cf-python version:', cf.__version__ print 'cf-python path:' , os.path.abspath(cf.__file__) print '' unittest.main(verbosity=2) cf-python-1.3.2/test/xtest_Transform.py0000600000175000017500000000247612461722740020365 0ustar daviddavid00000000000000import cf import numpy import os import unittest class TransformTest(unittest.TestCase): filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test_file.nc') chunk_sizes = (17, 34, 300, 100000)[::-1] def test_Transform_equals(self): f = cf.read(self.filename)[0] t = cf.Transform(name='atmosphere_hybrid_height_coordinate', a='aux0', b='aux1', orog=f, coord_terms=('a', 'b')) # print t.dump(complete=True) # print t # t.inspect() # print self.assertTrue(t.equals(t.copy(), traceback=True)) # Create a rotated_latitude_longitude grid mapping transform t = cf.Transform(name='rotated_latitude_longitude', grid_north_pole_latitude=38.0, grid_north_pole_longitude=190.0) # print t.dump(complete=True) # print t # t.inspect() # print self.assertTrue(t.equals(t.copy(), traceback=True)) #--- End: def #--- End: class if __name__ == '__main__': print 'cf-python version:', cf.__version__ print 'cf-python path:' , os.path.abspath(cf.__file__) print '' unittest.main(verbosity=2) cf-python-1.3.2/test/test_general.py0000644000175000017500000003664012770450215017645 0ustar daviddavid00000000000000import tempfile import os import sys import numpy import cf import unittest import atexit ''' Tests for the cf package. ''' tmpfile = tempfile.mktemp('.nc') tmpfile2 = tempfile.mktemp('.nca') tmpfiles = [tmpfile, tmpfile2] def _remove_tmpfiles(): ''' ''' for f in tmpfiles: try: os.remove(f) except OSError: pass #--- End: def atexit.register(_remove_tmpfiles) class generalTest(unittest.TestCase): def setUp(self): filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test_file.nc') self.f = cf.read(filename)[0] def test_GENERAL(self): # Save original chunksize original_chunksize = cf.CHUNKSIZE() cf.CHUNKSIZE(60) # print "TEST: Create a field:" # # Dimension coordinates # dim0 = cf.Coordinate(data=cf.Data(numpy.arange(10.), 'degrees')) # dim0.standard_name = 'grid_latitude' # # dim1 = cf.Coordinate(data=cf.Data(numpy.arange(9.) + 20, 'degrees')) # dim1.standard_name = 'grid_longitude' # dim1.Data[-1] += 5 # bounds = cf.Data(numpy.array([dim1.Data.array-0.5, dim1.Data.array+0.5]).transpose((1,0))) # bounds[-2,1] = 30 # bounds[-1,:] = [30, 36] # dim1.insert_bounds(cf.CoordinateBounds(data=bounds)) # # dim2 = cf.Coordinate(data=cf.Data(1.5), bounds=cf.Data([1, 2.])) # dim2.standard_name = 'atmosphere_hybrid_height_coordinate' # # # Auxiliary coordinates # aux0 = cf.Coordinate(data=cf.Data(10., 'm')) # aux0.id = 'atmosphere_hybrid_height_coordinate_ak' # aux0.insert_bounds(cf.Data([5, 15.], aux0.Units)) # # aux1 = cf.Coordinate(data=cf.Data(20.)) # aux1.id = 'atmosphere_hybrid_height_coordinate_bk' # aux1.insert_bounds(cf.Data([14, 26.])) # # aux2 = cf.Coordinate(data=cf.Data(numpy.arange(-45, 45, dtype='int32').reshape(10, 9), # units='degree_N')) # aux2.standard_name = 'latitude' # # aux3 = cf.Coordinate( # data=cf.Data(numpy.arange(60, 150, dtype='int32').reshape(9, 10), # units='degreesE')) # aux3.standard_name = 'longitude' # # # Cell measures # cm0 = cf.CellMeasure(data=cf.Data(1+numpy.arange(90.).reshape(9, 10)*1234, 'km 2')) # cm0.measure = 'area' # # # Transforms # trans0 = cf.Transform(name='rotated_latitude_longitude', # grid_north_pole_latitude=38.0, # grid_north_pole_longitude=190.0) # # # Data # data = cf.Data(numpy.arange(90.).reshape(10, 9), 'm s-1') # # # Domain # domain = cf.Domain(dim=(dim0, dim1, dim2), # aux=[aux0, aux1, aux2, aux3], # cm={'cm0': cm0}, # trans=(trans0,), # assign_axes={'aux0': ['dim2'], # 'aux1': ['dim2'], # 'aux3': ['dim1', 'dim0'], # 'cm0' : ['dim1', 'dim0']}) # # properties = {'standard_name': 'eastward_wind'} # # f = cf.Field(properties=properties, domain=domain, data=data) # orog = f.copy() # orog.standard_name = 'surface_altitude' # orog.insert_data(cf.Data(f.array*2, 'm')) # #orog.Data = cf.Data(f.array*2, 'm') # orog.squeeze() # #orog.domain.squeeze('dim2') # orog.remove_axes('dim2') # orog.transpose([1, 0], i=True) # #orog.finalize() # t = cf.Transform(name='atmosphere_hybrid_height_coordinate', # a='aux0', b='aux1', orog=orog, # coord_terms=('a', 'b')) # # self.assertTrue(t.equals(t, traceback=True)) # # #if not t.equals(t, traceback=True): # # raise RuntimeError("Transform is not equal to itself") # #else: # # # print '\nTransform is equal to itself' # # f.domain.insert_transform(t) # rt = f.item('atmosphere_hybrid_height_coordinate', role='t') ## f.dump(complete=1) # # # Ancillary variables # tmp = f.copy() # #del tmp.item('atmosphere_hybrid_height_coordinate', exact=True).transforms # tmp.remove_items(role='t') #transforms() # tmp.remove_item('aux0') #aux('aux0') # tmp.remove_item('atmosphere_hybrid_height_coordinate_bk') # # f.ancillary_variables = cf.AncillaryVariables() # # # print 'ANCILLARY 0' # g = tmp.copy() # g.transpose([1,0], i=True) # g.standard_name = 'ancillary0' # g *= 0.01 # g.remove_axes(g.axes().difference(g.data_axes())) # f.ancillary_variables.append(g) # # print g # # # print 'ANCILLARY 1' # g = tmp.copy() # #g.domain.squeeze('dim2') # # print g # #g.remove_axes('dim2') # g.standard_name = 'ancillary1' # g *= 0.01 # # print g # g.remove_axes(g.axes().difference(g.data_axes())) # g.remove_item('atmosphere_hybrid_height_coordinate', role='t') # f.ancillary_variables.append(g) # ## g.dump(complete=1) # #sys.exit(0) # # # print 'ANCILLARY 2' # g = tmp.copy() # # print g # # print g.domain.dimension_sizes, g.domain.dimensions # g = g.subspace[0] # # print g.domain.dimension_sizes, g.domain.dimensions # # print g.items() # g.squeeze(i=True) # # print g.domain.dimension_sizes, g.domain.dimensions ## print # g.standard_name = 'ancillary2' # g *= 0.001 # g.remove_axes(g.axes().difference(g.data_axes())) # f.ancillary_variables.append(g) ## ## # print 'ANCILLARY 3' # g = tmp.copy() # g = g.subspace[..., 0] # g.squeeze(i=True) # g.standard_name = 'ancillary3' # g *= 0.001 # g.remove_axes(g.axes().difference(g.data_axes())) # f.ancillary_variables.append(g) # # f.flag_values = [1,2,4] # f.flag_meanings = ['a', 'bb', 'ccc'] # ## f.dump(complete=1) ## # print 'TEST: # Print a dump of the field:' ## # print repr(f) ## ## f.dump() ## ## # print 'TEST: # Print CF properties:' ## # print f.properties # ## # print "TEST: Shape of the partition array:" ## # print '(pndim, psize, pshape) =', (f.Data.partitions.ndim, ## f.Data.partitions.size, ## f.Data.partitions.shape) # pndim, psize, pshape =(f.Data.partitions.ndim, # f.Data.partitions.size, # f.Data.partitions.shape) # # f.cell_methods = cf.CellMethods('grid_longitude: mean grid_latitude: max') # print f # ## # print 'TEST: Write the field to disk:' ## # print 'tmpfile=', tmpfile ## f.dump(complete=1) ## f.dump() ## # print f # cf.write(f, tmpfile) ## # print 'tmpfile=', tmpfile ## f.dump(complete=1) ## # print 'tmpfile=', tmpfile ## ## # print 'TEST: Read the field from disk:' ## # print f ## g = cf.read(tmpfile, squeeze=True)[0] g = self.f.squeeze() # # print g # # print 'tmpfile=', tmpfile # try: # del g.history # except AttributeError: # pass # # g.dump() # # # print '\nComparison (set)' f = self.f.copy() c = cf.set([0,3,4,5]) # # print c a = (f == c) # # print repr(a) # # print a.array # # # print "TEST: Check the equality function:" # self.assertTrue(cf.equals(g, g.copy(), traceback=True)) # # print "Field is equal to a copy of itself" # # # print f # # print g # # print 'tmpfile=', tmpfile # # print f.ancillary_variables[1] # # print g.ancillary_variables[1] # f.dump(complete=1) # self.assertTrue(cf.equals(f, g, traceback=True)) # # print "Field is equal to itself read back in" # +, -, *, /, ** h = g.copy() h **= 2 h **= 0.5 h *= 10 h /= 10. h += 100 h -= 100 h = h ** 3 h = h ** (1/3.) h = h * 1000 h = h / 1000. h = h + 10000 h = h - 10000 h.standard_name = g.standard_name self.assertTrue(cf.equals(g, h, traceback=True)) # Operators on a field list h = g.copy() h.override_units('m') gl = cf.FieldList([h.copy(), h.copy()]) gl += 2 x = 2 #.0 y = gl + x y = gl * x y = gl - x y = gl / x y = gl // x y = gl ** int(x) y = x + gl y = x * gl y = x - gl y = x / gl y = x // gl #y = x ** gl y = gl.copy() y += x y = gl.copy() y *= x y = gl.copy() y -= x y = gl.copy() y /= x y = gl.copy() y //= x y = gl.copy() y **= int(x) y = gl.__truediv__(x) y = gl.__rtruediv__(x) y = gl.copy() y.__itruediv__(x) y = gl > x y = gl >= x y = gl < x y = gl <= x y = gl == x y = gl != int(x) y = abs(gl) y = -gl y = +gl #y = ~gl for _f in gl: _f.dtype = int y = gl & x y = gl | x y = gl ^ x y = gl << x y = gl >> x y = x & gl y = x | gl y = x ^ gl y = x << gl y = x >> gl y = gl.copy() y &= x y = gl.copy() y |= x y = gl.copy() y ^= x # tranpose, flip, expand_dims, squeeze and remove_axes h = g.copy() h.transpose((1, 0), i=True) h.transpose((1, 0), i=True) h.transpose(('grid_longitude', 'grid_latitude'), i=True) h.transpose(('grid_latitude', 'grid_longitude'), i=True) self.assertTrue(cf.equals(g, h, traceback=True)) h.flip((1, 0), i=True) h.flip((1, 0), i=True) h.flip(0, i=True) h.flip(1, i=True) h.flip([0, 1], i=True) self.assertTrue(cf.equals(g, h, traceback=True)) #axisA = h.expand_dims() #axisB = h.expand_dims() #h.remove_axes([axisA, axisB]) #self.assertTrue(cf.equals(g, h, traceback=True)) ## print "Field expand_dims, squeeze and remove_axes passed" # Access the field's data as a numpy array a = g.array a = g.item('lat').array a = g.item('lon').array # Subspace the field g.subspace[..., 2:5].array g.subspace[9::-4, ...].array h = g.subspace[(slice(None, None, -1),) * g.ndim] h = h.subspace[(slice(None, None, -1),) * h.ndim] self.assertTrue(g.equals(h, traceback=True)) # Indices for a subspace defined by coordinates f.indices() f.indices(grid_lat=cf.lt(5), grid_lon=27) f.indices('exact', grid_latitude=cf.lt(5), grid_longitude=27, atmosphere_hybrid_height_coordinate=1.5) # Subspace the field g.subspace(grid_latitude=cf.lt(5), grid_longitude=27, atmosphere_hybrid_height_coordinate=1.5) # Create list of fields fl = cf.FieldList([g, g, g, g]) # Write a list of fields to disk cf.write((f, fl), tmpfile) cf.write(fl, tmpfile) # Read a list of fields from disk fl = cf.read(tmpfile, squeeze=True) try: fl.delattr('history') except AttributeError: pass # Access the last field in the list x = fl[-1] # Access the data of the last field in the list x = fl[-1].array # Modify the last field in the list fl[-1] *= -1 x = fl[-1].array # Changing units fl[-1].units = 'mm.s-1' x = fl[-1].array # Combine fields not in place g = fl[-1] - fl[-1] x = g.array # Combine field with a size 1 Data object g += cf.Data([[[[[1.5]]]]], 'cm.s-1') x = g.array # Setting data array elements to a scalar with subspace[] g.subspace[...] = 0 g.subspace[3:7, 2:5] = -1 g.subspace[6:2:-1, 4:1:-1] = numpy.array(-1) g.subspace[[0, 3, 8], [1, 7, 8]] = numpy.array([[[[-2]]]]) g.subspace[[8, 3, 0], [8, 7, 1]] = cf.Data(-3, None) g.subspace[[7, 4, 1], slice(6, 8)] = [-4] # Setting of (un)masked elements with where() g.subspace[::2, 1::2] = numpy.ma.masked g.Data.to_memory(1) g.where(True, 99) g.Data.to_memory(1) g.where(g.mask, 2) g.Data.to_memory(1) g.subspace[slice(None, None, 2), slice(1, None, 2)] = cf.masked g.Data.to_memory(1) g.where(g.mask, [[-1]]) g.Data.to_memory(1) g.where(True, cf.Data(0, None)) g.Data.to_memory(1) h = g.subspace[:3, :4] h.where(True, -1) h.subspace[0, 2] = 2 h.transpose([1, 0], i=True) h.flip([1, 0], i=True) g.subspace[slice(None, 3), slice(None, 4)] = h h = g.subspace[:3, :4] h.subspace[...] = -1 h.subspace[0, 2] = 2 g.subspace[slice(None, 3), slice(None, 4)] = h # Make sure all partitions' data are in temporary files g.Data.to_disk() # Push partitions' data from temporary files into memory g.Data.to_memory(regardless=True) g.Data.to_disk() # Iterate through array values for x in f.Data.flat(): pass # Reset chunk size cf.CHUNKSIZE(original_chunksize) # Move Data partitions to disk f.Data.to_disk() cf.CHUNKSIZE(original_chunksize) f.transpose(i=True) f.flip(i=True) cf.write(f, 'delme.nc') f = cf.read('delme.nc')[0] cf.write(f, 'delme.nca', fmt='CFA4') g = cf.read('delme.nca')[0] f.aux('aux0').id = 'atmosphere_hybrid_height_coordinate_ak' f.aux('aux1').id = 'atmosphere_hybrid_height_coordinate_bk' b = f.subspace[:,0:6,:] c = f.subspace[:,6:,:] # print f # print b # print c d = cf.aggregate([b, c], info=1)[0] # Remove temporary files cf.data.partition._remove_temporary_files() cf.CHUNKSIZE(original_chunksize) #--- End: def #--- End: class if __name__ == "__main__": print 'cf-python version:', cf.__version__ print 'cf-python path:' , os.path.abspath(cf.__file__) print '' unittest.main(verbosity=2) cf-python-1.3.2/test/Data.py0000600000175000017500000011334412426372213016026 0ustar daviddavid00000000000000import cf import numpy import os import itertools import time from operator import mul def test(chunk_sizes=(17, 34, 60, 300, 1000000)): start_time = time.time() print '----------------------------------------------------------' print 'cf.Data' print '----------------------------------------------------------' original_chunksize = cf.CHUNKSIZE() for chunksize in chunk_sizes[::-1]: cf.CHUNKSIZE(chunksize) # ---------------------------------------------------------------- # cf.Data.all # cf.Data.any # ---------------------------------------------------------------- d = cf.Data(numpy.array([[0] * 1000])) assert(not d.any()) assert(not d.all()) d[-1,-1] = 1 assert(d.any()) assert(not d.all()) d[...] = 1 assert(d.any()) assert(d.all()) d[...] = cf.masked assert(not d.any()) assert(d.all()) print 'cf.Data.all passed', "pmshape =", d._pmshape print 'cf.Data.any passed', "pmshape =", d._pmshape # -------------------------------------------------------------------- # cf.Data.array # cf.Data.varray # -------------------------------------------------------------------- d = cf.Data(numpy.arange(10*15*19).reshape(10, 1, 15, 19), 'km') a = d.array a[0,0,0,0] = -999 assert(d.array[0,0,0,0] == 0) print "cf.Data.array passed", "pmshape =", d._pmshape e = d.copy() v = e.varray v[0,0,0,0] = -999 assert(e.array[0,0,0,0] == -999) print "cf.Data.varray passed", "pmshape =", d._pmshape # ---------------------------------------------------------------- # cf.Data.asdatetime # cf.Data.asreftime # ---------------------------------------------------------------- d = cf.Data([[1.93, 5.17]], 'days since 2000-12-29') assert(d.dtype == numpy.dtype(float)) assert(d._isdt == False) d.asreftime(i=True) assert(d.dtype == numpy.dtype(float)) assert(d._isdt == False) d.asdatetime(i=True) assert(d.dtype == numpy.dtype(object)) assert(d._isdt == True) d.asdatetime(i=True) assert(d.dtype == numpy.dtype(object)) assert(d._isdt == True) d.asreftime(i=True) assert(d.dtype == numpy.dtype(float)) assert(d._isdt == False) print "cf.Data.asdatetime passed", "pmshape =", d._pmshape print "cf.Data.asreftime passed", "pmshape =", d._pmshape # -------------------------------------------------------------------- # cf.Data.datum # -------------------------------------------------------------------- d = cf.Data(5, 'metre') assert (d.datum() == 5), "d.datum()=%s" % d.datum() assert (d.datum(0) == 5), "d.datum(0)=%s" % d.datum() assert (d.datum(-1) == 5), "d.datum(-1)=%s" % d.datum() for d in [cf.Data([4, 5, 6, 1, 2, 3], 'metre'), cf.Data([[4, 5, 6], [1, 2, 3]], 'metre')]: assert (d.datum(0) == 4), "d.datum(0)=%s" % d.datum() assert (d.datum(-1) == 3), "d.datum(-1)=%s" % d.datum() for index in d.ndindex(): assert (d.datum(index) == d.array[index].item()), \ "d.datum(%s)=%s" % (index, d.datum()) assert (d.datum(*index) == d.array[index].item()), \ "d.datum(%s)=%s" % (index, d.datum()) #--- End: for d = cf.Data(5, 'metre') d[()] = cf.masked assert (d.datum() is cf.masked), "d.datum()=%s" % d.datum() assert (d.datum(0) is cf.masked), "d.datum(0)=%s" % d.datum() assert (d.datum(-1) is cf.masked), "d.datum(-1)=%s" % d.datum() d = cf.Data([[5]], 'metre') d[0, 0] = cf.masked assert (d.datum() is cf.masked), "d.datum()=%s" % d.datum() assert (d.datum(0) is cf.masked), "d.datum(0)=%s" % d.datum() assert (d.datum(-1) is cf.masked), "d.datum(-1)=%s" % d.datum() assert (d.datum(0, 0) is cf.masked), "d.datum(0, 0)=%s" % d.datum() assert (d.datum(-1, 0) is cf.masked), "d.datum(-1, 0)=%s" % d.datum() assert (d.datum([0, 0]) is cf.masked), "d.datum([0, 0])=%s" % d.datum() assert (d.datum([0, -1]) is cf.masked), "d.datum([0, -1])=%s" % d.datum() assert (d.datum(-1, -1) is cf.masked), "d.datum(-1, -1)=%s" % d.datum() print "cf.Data.datum passed", "pmshape =", d._pmshape # -------------------------------------------------------------------- # cf.Data.flip # -------------------------------------------------------------------- array = numpy.arange(24000).reshape(120, 200) d = cf.Data(array.copy(), 'metre') for axes, indices in zip((0, 1, [0, 1]), ((slice(None, None, -1), slice(None)), (slice(None) , slice(None, None, -1)), (slice(None, None, -1), slice(None, None, -1))) ): array = array[indices] d.flip(axes, i=True) #--- End: for assert(d.array == array).all(), "cf.Data.flip failed" print "cf.Data.flip passed", "pmshape =", d._pmshape # ---------------------------------------------------------------- # cf.Data.sample_size # ---------------------------------------------------------------- d = cf.Data([[4, 5, 6], [1, 2, 3]], 'metre') assert(d.sample_size() == 6) d[1, 0] = cf.masked assert(d.sample_size() == cf.Data(50, '0.1')) print "cf.Data.sample_size passed", "pmshape =", d._pmshape # ---------------------------------------------------------------- # cf.Data.min # ---------------------------------------------------------------- d = cf.Data([[4, 5, 6], [1, 2, 3]], 'metre') assert(d.min() == cf.Data(1, 'metre')) assert(d.min().datum() == 1) d[1, 0] = cf.masked assert(d.min() == 2) assert(d.min().datum() == 2) assert(d.min() == cf.Data(0.002, 'km')) print "cf.Data.min passed", "pmshape =", d._pmshape # ---------------------------------------------------------------- # cf.Data.max # ---------------------------------------------------------------- d = cf.Data([[4, 5, 6], [1, 2, 3]], 'metre') assert(d.max() == cf.Data(6, 'metre')) assert(d.max().datum() == 6) d[0, 2] = cf.masked assert(d.max() == 5) assert(d.max().datum() == 5) assert(d.max() == cf.Data(0.005, 'km')) print "cf.Data.max passed", "pmshape =", d._pmshape # -------------------------------------------------------------------- # cf.Data.ndindex # -------------------------------------------------------------------- for d in (cf.Data(5, 'metre'), cf.Data([4, 5, 6, 1, 2, 3], 'metre'), cf.Data([[4, 5, 6], [1, 2, 3]], 'metre') ): for i, j in zip(d.ndindex(), numpy.ndindex(d.shape)): assert(i == j) #--- End: for print "cf.Data.ndindex passed", "pmshape =", d._pmshape # ---------------------------------------------------------------- # cf.Data.roll # ---------------------------------------------------------------- a = numpy.arange(10*15*19).reshape(10, 1, 15, 19) d = cf.Data(a) pmshape = d._pmshape e = d.roll(0, 4) e.roll(2, 120, i=True) e.roll(3, -77, i=True) a = numpy.roll(a, 4, 0) a = numpy.roll(a, 120, 2) a = numpy.roll(a, -77, 3) assert e.shape == a.shape assert (a == e.array).all() f = e.roll(3, 77) f.roll(2, -120, i=True) f.roll(0, -4, i=True) assert f.shape == d.shape assert f.equals(d) print "cf.Data.roll passed", "pmshape =", pmshape # ---------------------------------------------------------------- # cf.Data.swapaxes # ---------------------------------------------------------------- a = numpy.arange(10*15*19).reshape(10, 1, 15, 19) d = cf.Data(a.copy()) for i in range(-a.ndim, a.ndim): for j in range(-a.ndim, a.ndim): b = numpy.swapaxes(a.copy(), i, j) e = d.swapaxes(i, j) message = "cf.Data.swapaxes(%d, %d) failed" % (i, j) assert (b.shape == e.shape), message assert ((b == e.array).all()), message #--- End: for #--- End: for print "cf.Data.swapaxes passed", "pmshape =", d._pmshape # ---------------------------------------------------------------- # cf.Data.transpose # ---------------------------------------------------------------- a = numpy.arange(10*15*19).reshape(10, 1, 15, 19) d = cf.Data(a.copy()) for indices in (range(a.ndim), range(-a.ndim, 0)): for axes in itertools.permutations(indices): a = numpy.transpose(a, axes) d.transpose(axes, i=True) message = 'cf.Data.transpose(%s) failed: d.shape=%s, a.shape=%s' % \ (axes, d.shape, a.shape) assert d.shape == a.shape, message assert (d.array == a).all(), message #--- End: for #--- End: for print "cf.Data.transpose passed", "pmshape =", d._pmshape # ---------------------------------------------------------------- # cf.Data.unique # ---------------------------------------------------------------- d = cf.Data([[4, 2, 1], [1, 2, 3]], 'metre') assert((d.unique == cf.Data([1, 2, 3, 4], 'metre')).all()) d[1, -1] = cf.masked assert((d.unique == cf.Data([1, 2, 4], 'metre')).all()) print "cf.Data.unique passed", "pmshape =", d._pmshape # ---------------------------------------------------------------- # Broadcasting # ---------------------------------------------------------------- A = [numpy.array(3), numpy.array( [3]), numpy.array( [3]).reshape(1, 1), numpy.array( [3]).reshape(1, 1, 1), numpy.arange( 5).reshape(5, 1), numpy.arange( 5).reshape(1, 5), numpy.arange( 5).reshape(1, 5, 1), numpy.arange( 5).reshape(5, 1, 1), numpy.arange( 5).reshape(1, 1, 5), numpy.arange( 25).reshape(1, 5, 5), numpy.arange( 25).reshape(5, 1, 5), numpy.arange( 25).reshape(5, 5, 1), numpy.arange(125).reshape(5, 5, 5), ] for a in A: for b in A: d = cf.Data(a) e = cf.Data(b) ab = a*b de = d*e message = 'cf.Data broadcasting failed: de.shape='+repr(de.shape)+ \ ',ab.shape='+repr(ab.shape) assert de.shape == ab.shape, message assert (de.array == ab).all(), message #--- End: for #--- End: for print "cf.Data broadcasting passed" # ---------------------------------------------------------------- # __contains__ # ---------------------------------------------------------------- d = cf.Data([[0.0, 1, 2], [3, 4, 5]], units='m') x = 4 in d assert(x) x = 40 in d assert(not x) x = cf.Data(3) in d assert(x) x = cf.Data([[[[3]]]]) in d assert(x) value = d[1, 2] value.Units *= 2 value.squeeze(0) x = value in d assert(x) x = numpy.array([[[2]]]) in d assert(x) print "cf.Data.__contains__ passed", "pmshape =", d._pmshape # ---------------------------------------------------------------- # cf.Data.year # cf.Data.month # cf.Data.day # cf.Data.hour # cf.Data.minute # cf.Data.second # ---------------------------------------------------------------- d = cf.Data([[1.93, 5.17]], 'days since 2000-12-29') assert(d.year.equals(cf.Data([[2000, 2001]]))) assert(d.month.equals(cf.Data([[12, 1]]))) assert(d.day.equals(cf.Data([[30, 3]]))) assert(d.hour.equals(cf.Data([[22, 4]]))) assert(d.minute.equals(cf.Data([[19, 4]]))) assert(d.second.equals(cf.Data([[12, 48]]))) d = cf.Data([[1.93, 5.17]], cf.Units('days since 2000-12-29', '360_day')) assert(d.year.equals(cf.Data([[2000, 2001]]))) assert(d.month.equals(cf.Data([[12, 1]]))) assert(d.day.equals(cf.Data([[30, 4]]))) assert(d.hour.equals(cf.Data([[22, 4]]))) assert(d.minute.equals(cf.Data([[19, 4]]))) assert(d.second.equals(cf.Data([[12, 48]]))) print 'cf.Data.year passed' , "pmshape =", d._pmshape print 'cf.Data.month passed' , "pmshape =", d._pmshape print 'cf.Data.day passed' , "pmshape =", d._pmshape print 'cf.Data.hour passed' , "pmshape =", d._pmshape print 'cf.Data.minute passed', "pmshape =", d._pmshape print 'cf.Data.second passed', "pmshape =", d._pmshape # ---------------------------------------------------------------- # Binary and unary operators # ---------------------------------------------------------------- array=numpy.arange(3*4*5).reshape(3, 4, 5) + 1 arrays = (numpy.arange(3*4*5).reshape(3, 4, 5) + 1.0, numpy.arange(3*4*5).reshape(3, 4, 5) + 1) for a0 in arrays: for a1 in arrays[::-1]: d = cf.Data(a0[(slice(None, None, -1),)*a0.ndim], 'metre') d.flip(i=True) x = cf.Data(a1, 'metre') assert((d + x).equals(cf.Data(a0 + a1, 'm' ), traceback=1)), '%s+%s' % (repr(d), x) assert((d * x).equals(cf.Data(a0 * a1, 'm2'), traceback=1)), '%s*%s' % (repr(d), x) assert((d / x).equals(cf.Data(a0 / a1, '1' ), traceback=1)), '%s/%s' % (repr(d), x) assert((d - x).equals(cf.Data(a0 - a1, 'm' ), traceback=1)), '%s-%s' % (repr(d), x) assert((d // x).equals(cf.Data(a0 // a1, '1' ), traceback=1)), '%s//%s' % (repr(d), x) assert(d.__truediv__(x).equals(cf.Data(array.__truediv__(array), '1'), traceback=1)), '%s.__truediv__(%s)' % (d, x) assert(d.__rtruediv__(x).equals(cf.Data(array.__rtruediv__(array), '1'), traceback=1)) , '%s.__rtruediv__(%s)' % (d, x) try: d ** x except: pass else: assert (d**x).all(), '%s**%s' % (d, repr(x)) print '%s {+, -, *, /, //, **, __truediv__, __rtruediv__} %s passed' % (d, x), "pmshape =", d._pmshape #--- End: for #--- End: for for a0 in arrays: d = cf.Data(a0, 'metre') for x in (2, 2.0): assert((d + x).equals(cf.Data(a0 + x, 'm' ), traceback=1)), '%s+%s' % (repr(d), x) assert((d * x).equals(cf.Data(a0 * x, 'm' ), traceback=1)), '%s*%s' % (repr(d), x) assert((d / x).equals(cf.Data(a0 / x, 'm' ), traceback=1)), '%s/%s' % (repr(d), x) assert((d - x).equals(cf.Data(a0 - x, 'm' ), traceback=1)), '%s-%s' % (repr(d), x) assert((d // x).equals(cf.Data(a0 // x, 'm' ), traceback=1)), '%s//%s' % (repr(d), x) assert((d ** x).equals(cf.Data(a0 ** x, 'm2'), traceback=1)), '%s**%s' % (repr(d), x) assert(d.__truediv__(x).equals(cf.Data(a0.__truediv__(x), 'm'), traceback=1)), '%s.__truediv__(%s)' % (d, x) assert(d.__rtruediv__(x).equals(cf.Data(a0.__rtruediv__(x), 'm-1'), traceback=1)) , '%s.__rtruediv__(%s)' % (d, x) print '%s {+, -, *, /, //, **, __truediv__, __rtruediv__} %s passed' % (d, x), "pmshape =", d._pmshape assert((x + d).equals(cf.Data(x + a0, 'm' ), traceback=1)), '%s+%s' % (x, repr(d)) assert((x * d).equals(cf.Data(x * a0, 'm' ), traceback=1)), '%s*%s' % (x, repr(d)) assert((x / d).equals(cf.Data(x / a0, 'm-1'), traceback=1)), '%s/%s' % (x, repr(d)) assert((x - d).equals(cf.Data(x - a0, 'm' ), traceback=1)), '%s-%s' % (x, repr(d)) assert((x // d).equals(cf.Data(x // a0, 'm-1'), traceback=1)), '%s//%s' % (x, repr(d)) try: x ** d except: pass else: assert (x**d).all(), '%s**%s' % (x, repr(d)) print '%s {+, -, *, /, //, **} %s passed' % (x, repr(d)), "pmshape =", d._pmshape e = d.copy() a = a0.copy() e += x a += x assert(e.equals(cf.Data(a, 'm'), traceback=1)), '%s+=%s' % (repr(d), x) e = d.copy() a = a0.copy() e *= x a *= x assert(e.equals(cf.Data(a, 'm'), traceback=1)), '%s*=%s' % (repr(d), x) e = d.copy() a = a0.copy() e /= x a /= x assert(e.equals(cf.Data(a, 'm'), traceback=1)), '%s/=%s' % (repr(d), x) e = d.copy() a = a0.copy() e -= x a -= x assert(e.equals(cf.Data(a, 'm'), traceback=1)), '%s-=%s' % (repr(d), x) e = d.copy() a = a0.copy() e //= x a //= x assert(e.equals(cf.Data(a, 'm'), traceback=1)), '%s//=%s' % (repr(d), x) e = d.copy() a = a0.copy() e **= x a **= x assert(e.equals(cf.Data(a, 'm2'), traceback=1)), '%s**=%s' % (repr(d), x) e = d.copy() a = a0.copy() e.__itruediv__(x) a.__itruediv__(x) assert(e.equals(cf.Data(a, 'm'), traceback=1)), '%s.__itruediv__(%s)' % (d, x) print '%s {+=, -=, *=, /=, //=, **=, __itruediv__} %s passed' % (repr(d), x), "pmshape =", d._pmshape #--- End: for for x in (cf.Data(2, 'metre'), cf.Data(2.0, 'metre')): assert((d + x).equals(cf.Data(a0 + x.datum(), 'm' ), traceback=1)) assert((d * x).equals(cf.Data(a0 * x.datum(), 'm2'), traceback=1)) assert((d / x).equals(cf.Data(a0 / x.datum(), '1' ), traceback=1)) assert((d - x).equals(cf.Data(a0 - x.datum(), 'm' ), traceback=1)) assert((d // x).equals(cf.Data(a0 // x.datum(), '1' ), traceback=1)) try: d ** x except: pass else: assert (x**d).all(), '%s**%s' % (x, repr(d)) assert(d.__truediv__(x).equals(cf.Data(a0.__truediv__(x.datum()), ''), traceback=1)) print '%s {+, -, *, /, //, **, __truediv__} %s passed' % \ (repr(d), repr(x)), "pmshape =", d._pmshape #--- End: for #--- End: for # ---------------------------------------------------------------- # cf.Data.__setitem__ # ---------------------------------------------------------------- for hardmask in (False, True): a = numpy.ma.arange(3000).reshape(50, 60) if hardmask: a.harden_mask() else: a.soften_mask() d = cf.Data(a.filled(), 'm') d.hardmask = hardmask for n, (j, i) in enumerate(((34, 23), (0, 0), (-1, -1), (slice(40, 50), slice(58, 60)), (Ellipsis, Ellipsis), )): n = -n-1 for dvalue, avalue in ((n, n), (cf.masked, numpy.ma.masked), (n, n)): message = "cf.Data[%s, %s]=%s failed" % (j, i, dvalue) d[j, i] = dvalue a[j, i] = avalue assert (d.array == a).all() in (True, numpy.ma.masked), message assert (d.mask.array == numpy.ma.getmaskarray(a)).all(), message #--- End: for a = numpy.ma.arange(3000).reshape(50, 60) if hardmask: a.harden_mask() else: a.soften_mask() d = cf.Data(a.filled(), 'm') d.hardmask = hardmask (j, i) = (slice(0, 2), slice(0, 3)) array = numpy.array([[1, 2, 6],[3, 4, 5]])*-1 for dvalue in (array, numpy.ma.masked_where(array < -2, array), array): message = "cf.Data[%s, %s]=%s failed" % (j, i, dvalue) d[j, i] = dvalue a[j, i] = dvalue assert (d.array == a).all() in (True, numpy.ma.masked), message assert (d.mask.array == numpy.ma.getmaskarray(a)).all(), message #--- End: for print 'cf.Data.__setitem__ passed: hardmask =',hardmask,', pmshape =', d._pmshape #--- End: for # ---------------------------------------------------------------- # cf.Data._collapse SHAPE # ---------------------------------------------------------------- a = numpy.arange(-100, 200., dtype=float).reshape(3, 4, 5, 5) ones = numpy.ones(a.shape, dtype=float) w = numpy.arange(1, 301., dtype=float).reshape(a.shape) w[-1, -1, ...] = w[-1, -1, ...]*2 w /= w.min() d = cf.Data(a[(slice(None, None, -1),) * a.ndim].copy()) d.flip(i=True) x = cf.Data(w.copy()) axes_combinations = [axes for n in range(1, a.ndim+1) for axes in itertools.permutations(range(a.ndim), n)] shape = list(d.shape) def reshape_a(a, axes): new_order = [i for i in range(a.ndim) if i not in axes] new_order.extend(axes) b = numpy.transpose(a, new_order) new_shape = b.shape[:b.ndim-len(axes)] new_shape += (reduce(mul, b.shape[b.ndim-len(axes):]),) b = b.reshape(new_shape) return b #--- End: def for h in ('sample_size', 'sum', 'min', 'max', 'mean', 'var', 'sd', 'mid_range', 'range'): for axes in axes_combinations: e = getattr(d, h)(axes=axes, squeeze=False) shape = list(d.shape) for i in axes: shape[i] = 1 shape = tuple(shape) assert e.shape == shape, \ "%s, axes=%s, not squeezed bad shape: %s != %s" % \ (h, axis, e.shape, shape) #--- End: for for axes in axes_combinations: e = getattr(d, h)(axes=axes, squeeze=True) shape = list(d.shape) for i in sorted(axes, reverse=True): shape.pop(i) shape = tuple(shape) assert e.shape == shape, \ "%s, axes=%s, squeezed bad shape: %s != %s" % \ (h, axis, e.shape, shape) #--- End: for e = getattr(d, h)(squeeze=True) shape = () assert e.shape == shape, \ "%s, axes=%s, squeezed bad shape: %s != %s" % \ (h, None, e.shape, shape) e = getattr(d, h)(squeeze=False) shape = (1,) * d.ndim assert e.shape == shape, \ "%s, axes=%s, not squeezed bad shape: %s != %s" % \ (h, None, e.shape, shape) print 'cf.Data.%s shape passed' % h, "pmshape =", d._pmshape #--- End: for # ---------------------------------------------------------------- # cf.Data._collapse UNWEIGHTED UNMASKED # ---------------------------------------------------------------- for h in ('sample_size', 'sum_of_weights', 'sum_of_weights2'): for axes in axes_combinations: b = reshape_a(ones, axes) b = b.sum(axis=-1) e = getattr(d, h)(axes=axes, squeeze=True) assert e.allclose(b, rtol=1e-05, atol=1e-08) , \ "%s, axis=%s, \ne=%s, \nb=%s, \ne-b=%s" % \ (h, axes, e.array, b, e.array-b) #--- End: for print 'cf.Data.%s unweighted, unmasked passed' % \ h, "pmshape =", d._pmshape #--- End: for for np, h in zip((numpy.sum, numpy.amin, numpy.amax, numpy.mean), ( 'sum', 'min', 'max', 'mean')): for axes in axes_combinations: b = reshape_a(a, axes) b = np(b, axis=-1) e = getattr(d, h)(axes=axes, squeeze=True) assert e.allclose(b, rtol=1e-05, atol=1e-08), \ "%s, axis=%s, unweighted, unmasked \ne=%s, \nb=%s, \ne-b=%s" % \ (h, axes, e.array, b, e.array-b) #--- End: for print 'cf.Data.%s unweighted, unmasked passed' % \ h, "pmshape =", d._pmshape #--- End: for ddofs=(0, 1, 2) for np, h in zip((numpy.var, numpy.std), ('var' , 'sd')): for ddof in ddofs: for axes in axes_combinations: b = reshape_a(a, axes) b = np(b, axis=-1, ddof=ddof) e = getattr(d, h)(axes=axes, squeeze=True, ddof=ddof) assert e.allclose(b, rtol=1e-05, atol=1e-08), \ "%s, axis=%s, unweighted, unmasked \ne=%s, \nb=%s, \ne-b=%s" % \ (h, axes, e.array, b, e.array-b) #--- End: for #--- End: for print 'cf.Data.%s unweighted, unmasked passed' % h, \ "pmshape =", d._pmshape #--- End: for # ---------------------------------------------------------------- # cf.Data._collapse WEIGHTED UNMASKED # ---------------------------------------------------------------- for c, h in zip((w , w*w), ('sum_of_weights', 'sum_of_weights2')): for axes in axes_combinations: b = reshape_a(c, axes) b = b.sum(axis=-1) e = getattr(d, h)(axes=axes, weights=x, squeeze=True) assert e.allclose(b, rtol=1e-05, atol=1e-08) , \ "%s, axis=%s, \ne=%s, \nb=%s, \ne-b=%s" % \ (h, axes, e.array, b, e.array-b) #--- End: for print 'cf.Data.%s weighted, unmasked passed' % h, \ "pmshape =", d._pmshape #--- End: for h = 'mean' for axes in axes_combinations: b = reshape_a(a, axes) v = reshape_a(w, axes) b = numpy.average(b, axis=-1, weights=v) e = getattr(d, h)(axes=axes, weights=x, squeeze=True) assert e.allclose(b, rtol=1e-05, atol=1e-08) , \ "%s, axis=%s, \ne=%s, \nb=%s, \ne-b=%s" % \ (h, axes, e.array, b, e.array-b) #--- End: for print 'cf.Data.%s weighted, unmasked passed' % h, \ "pmshape =", d._pmshape ddofs = (0, 1, 2) f= 2 for h in ('var', 'sd'): for axes in axes_combinations: for ddof in ddofs: b = reshape_a(a, axes) v = reshape_a(w, axes) avg = numpy.average(b, axis=-1, weights=v) if numpy.ndim(avg) < b.ndim: avg = numpy.expand_dims(avg, -1) b, sv = numpy.average((b-avg)**2, axis=-1, weights=v, returned=True) b *= f*sv/(f*sv-ddof) if h == 'sd': b **= 0.5 e = getattr(d, h)(axes=axes, weights=x, squeeze=True, ddof=ddof, a=f) assert e.allclose(b, rtol=1e-05, atol=1e-08) , \ "%s, axis=%s, ddof=%s, \ne=%s, \nb=%s, \ne-b=%s" % \ (h, axes, ddof, e.array, b, e.array-b) #--- End: for #--- End: for print 'cf.Data.%s weighted, unmasked passed' % h, \ "pmshape =", d._pmshape #--- End: for # ---------------------------------------------------------------- # cf.Data._collapse UNWEIGHTED MASKED # ---------------------------------------------------------------- a = numpy.ma.arange(-100, 200., dtype=float).reshape(3, 4, 5, 5) a[0, :, 2, 3] = numpy.ma.masked a[1, 2, 3, :] = numpy.ma.masked a[0, 3, :, 3] = numpy.ma.masked a[:, 1, 4, 4] = numpy.ma.masked ones = numpy.ma.array(ones) d = cf.Data(a.copy()) for c, h in zip((ones , ones), ('sum_of_weights', 'sum_of_weights2')): for axes in axes_combinations: c = c.copy() c.mask = a.mask b = reshape_a(c, axes) b = numpy.ma.asanyarray(b.sum(axis=-1)) e = getattr(d, h)(axes=axes, squeeze=True) assert (e.mask.array == b.mask).all(), \ "%s, axis=%s, \ne.mask=%s, \nb.mask=%s, \ne.mask==b.mask=%s" % \ (h, axes, e.mask.array, b.mask, e.mask.array==b.mask) assert e.allclose(b, rtol=1e-05, atol=1e-08) , \ "%s, axis=%s, \ne=%s, \nb=%s, \ne-b=%s" % \ (h, axes, e.array, b, e.array-b) #--- End: for print 'cf.Data.%s unweighted, masked passed' % h, \ "pmshape =", d._pmshape #--- End: for for np, h in zip((numpy.ma.sum, numpy.ma.amin, numpy.ma.amax), ( 'sum', 'min', 'max')): for axes in axes_combinations: b = reshape_a(a, axes) b = np(b, axis=-1) b = numpy.ma.asanyarray(b) e = getattr(d, h)(axes=axes, squeeze=True) assert (e.mask.array == b.mask).all(), \ "%s, axis=%s, \ne.mask=%s, \nb.mask=%s, \ne.mask==b.mask=%s" % \ (h, axes, e.mask.array, b.mask, e.mask.array==b.mask) assert e.allclose(b, rtol=1e-05, atol=1e-08), \ "%s, axis=%s, unweighted, unmasked \ne=%s, \nb=%s, \ne-b=%s" % \ (h, axes, e.array, b, e.array-b) #--- End: for print 'cf.Data.%s unweighted, masked passed' % \ h, "pmshape =", d._pmshape #--- End: for h = 'mean' for axes in axes_combinations: b = reshape_a(a, axes) b = numpy.ma.average(b, axis=-1) b = numpy.ma.asanyarray(b) e = getattr(d, h)(axes=axes, squeeze=True) assert (e.mask.array == b.mask).all(), \ "%s, axis=%s, \ne.mask=%s, \nb.mask=%s, \ne.mask==b.mask=%s" % \ (h, axes, e.mask.array, b.mask, e.mask.array==b.mask) assert e.allclose(b, rtol=1e-05, atol=1e-08), \ "%s, axis=%s, \ne=%s, \nb=%s, \ne-b=%s" % \ (h, axes, e.array, b, e.array-b) #--- End: for print 'cf.Data.%s unweighted, masked passed' % h, \ "pmshape =", d._pmshape ddofs = (0, 1, 2) f = 2 for h in ('var', 'sd'): for axes in axes_combinations: for ddof in ddofs: e = getattr(d, h)(axes=axes, squeeze=True, ddof=ddof) b = reshape_a(a, axes) not_enough_data = numpy.ma.count(b, axis=-1) <= ddof avg = numpy.ma.average(b, axis=-1) if numpy.ndim(avg) < b.ndim: avg = numpy.ma.expand_dims(avg, -1) b, sv = numpy.ma.average((b-avg)**2, axis=-1, returned=True) b = numpy.ma.where(not_enough_data, numpy.ma.masked, b) b *= sv/(sv-ddof) if h == 'sd': b **= 0.5 b = numpy.ma.asanyarray(b) e = getattr(d, h)(axes=axes, squeeze=True, ddof=ddof) assert (e.mask.array == b.mask).all(), \ "%s, axis=%s, ddof=%s, \ne.mask=%s, \nb.mask=%s, \ne.mask==b.mask=%s" % \ (h, axes, e.mask.array, b.mask, e.mask.array==b.mask) assert e.allclose(b, rtol=1e-05, atol=1e-08) , \ "%s, axis=%s, ddof=%s, \ne=%s, \nb=%s, \ne-b=%s" % \ (h, axes, ddof, e.array, b, e.array-b) #--- End: for #--- End: for print 'cf.Data.%s unweighted, masked passed' % h, \ "pmshape =", d._pmshape #--- End: for # ---------------------------------------------------------------- # cf.Data._collapse WEIGHTED MASKED # ---------------------------------------------------------------- w = numpy.ma.array(w) for c, h in zip((w , w*w), ('sum_of_weights', 'sum_of_weights2')): for axes in axes_combinations: c = c.copy() c.mask = a.mask b = reshape_a(c, axes) b = numpy.ma.asanyarray(b.sum(axis=-1)) e = getattr(d, h)(axes=axes, weights=x, squeeze=True) assert (e.mask.array == b.mask).all(), \ "%s, axis=%s, \ne.mask=%s, \nb.mask=%s, \ne.mask==b.mask=%s" % \ (h, axes, e.mask.array, b.mask, e.mask.array==b.mask) assert e.allclose(b, rtol=1e-05, atol=1e-08) , \ "%s, axis=%s, \ne=%s, \nb=%s, \ne-b=%s" % \ (h, axes, e.array, b, e.array-b) #--- End: for print 'cf.Data.%s weighted, masked passed' % h, \ "pmshape =", d._pmshape #--- End: for h = 'mean' for axes in axes_combinations: b = reshape_a(a, axes) v = reshape_a(w, axes) b = numpy.ma.average(b, axis=-1, weights=v) b = numpy.ma.asanyarray(b) e = getattr(d, h)(axes=axes, weights=x, squeeze=True) assert (e.mask.array == b.mask).all(), \ "%s, axis=%s, \ne.mask=%s, \nb.mask=%s, \ne.mask==b.mask=%s" % \ (h, axes, e.mask.array, b.mask, e.mask.array==b.mask) assert e.allclose(b, rtol=1e-05, atol=1e-08), \ "%s, axis=%s, \ne=%s, \nb=%s, \ne-b=%s" % \ (h, axes, e.array, b, e.array-b) #--- End: for print 'cf.Data.%s weighted, masked passed' % h, "pmshape =", d._pmshape ddofs = (0, 1, 2) f = 2 for h in ('var', 'sd'): for axes in axes_combinations: for ddof in ddofs: b = reshape_a(a, axes) v = reshape_a(w, axes) not_enough_data = numpy.ma.count(b, axis=-1) <= ddof avg = numpy.ma.average(b, axis=-1, weights=v) if numpy.ndim(avg) < b.ndim: avg = numpy.ma.expand_dims(avg, -1) b, sv = numpy.ma.average((b-avg)**2, axis=-1, weights=v, returned=True) b = numpy.ma.where(not_enough_data, numpy.ma.masked, b) b *= f*sv/(f*sv-ddof) if h == 'sd': b **= 0.5 b = numpy.ma.asanyarray(b) e = getattr(d, h)(axes=axes, weights=x, squeeze=True, ddof=ddof, a=f) assert (e.mask.array == b.mask).all(), \ "%s, axis=%s, \ne.mask=%s, \nb.mask=%s, \ne.mask==b.mask=%s" % \ (h, axes, e.mask.array, b.mask, e.mask.array==b.mask) assert e.allclose(b, rtol=1e-05, atol=1e-08) , \ "%s, axis=%s, ddof=%s, \ne=%s, \nb=%s, \ne-b=%s" % \ (h, axes, ddof, e.array, b, e.array-b) #--- End: for #--- End: for print 'cf.Data.%s weighted, masked passed' % h, \ "pmshape =", d._pmshape #--- End: for print '' print 'cf.Data with chunk size %d passed' % chunksize print '' #--- End: for cf.CHUNKSIZE(original_chunksize) time_elapsed = (time.time() - start_time)/60.0 print print '---------------------------------------------------------------------------' print 'All cf.Data tests passed for cf version', cf.__version__ print 'Running from', os.path.abspath(cf.__file__) print 'Time elapsed: %f minutes' % time_elapsed print '---------------------------------------------------------------------------' print #--- End: def if __name__ == "__main__": test() cf-python-1.3.2/test/test_examples.py0000644000175000017500000002470712745346617020063 0ustar daviddavid00000000000000import cf import numpy import os import unittest class ExamplesTest(unittest.TestCase): def test_example1(self): f = cf.Field() print_f = str(f) self.assertTrue( print_f == ' field summary\n--------------\n\n') #--- End: def def test_example2(self): f = cf.Field(properties={'standard_name': 'air_temperature', 'long_name': 'temperature of air'}) print_f = str(f) self.assertTrue( print_f == 'air_temperature field summary\n-----------------------------\n\n') #--- End: def def test_example3(self): data = cf.Data(numpy.arange(90.).reshape(10, 9), 'm s-1') properties = {'standard_name': 'eastward_wind'} dim0 = cf.DimensionCoordinate(data=cf.Data(range(10), 'degrees_north'), properties={'standard_name': 'latitude'}) dim1 = cf.DimensionCoordinate(data=cf.Data(range(9), 'degrees_east')) dim1.standard_name = 'longitude' domain = cf.Domain(dim=[dim0, dim1]) f = cf.Field(properties=properties, data=data, domain=domain) print_f = str(f) self.assertTrue( print_f == '''eastward_wind field summary --------------------------- Data : eastward_wind(latitude(10), longitude(9)) m s-1 Axes : longitude(9) = [0, ..., 8] degrees_east : latitude(10) = [0, ..., 9] degrees_north ''') aux = cf.AuxiliaryCoordinate(data=cf.Data(['alpha','beta','gamma','delta','epsilon', 'zeta','eta','theta','iota','kappa'])) aux.long_name = 'extra' f.insert_aux(aux, axes=['dim0']) f.cell_methods = cf.CellMethods('latitude: point') f.long_name = 'wind' print_f = str(f) self.assertTrue( print_f == '''eastward_wind field summary --------------------------- Data : eastward_wind(latitude(10), longitude(9)) m s-1 Cell methods : latitude: point Axes : longitude(9) = [0, ..., 8] degrees_east : latitude(10) = [0, ..., 9] degrees_north Aux coords : long_name:extra(latitude(10)) = [alpha, ..., kappa] ''') f.remove_item({'long_name': 'extra'}) del f.cell_methods print_f = str(f) self.assertTrue( print_f == '''eastward_wind field summary --------------------------- Data : eastward_wind(latitude(10), longitude(9)) m s-1 Axes : longitude(9) = [0, ..., 8] degrees_east : latitude(10) = [0, ..., 9] degrees_north ''') #--- End: def def test_example4(self): #--------------------------------------------------------------------- # 1. CREATE the field's domain items #--------------------------------------------------------------------- # Create a grid_latitude dimension coordinate Y = cf.DimensionCoordinate(properties={'standard_name': 'grid_latitude'}, data=cf.Data(numpy.arange(10.), 'degrees')) # Create a grid_longitude dimension coordinate X = cf.DimensionCoordinate(data=cf.Data(numpy.arange(9.), 'degrees')) X.standard_name = 'grid_longitude' # Create a time dimension coordinate (with bounds) bounds = cf.CoordinateBounds( data=cf.Data([0.5, 1.5], cf.Units('days since 2000-1-1', calendar='noleap'))) T = cf.DimensionCoordinate(properties=dict(standard_name='time'), data=cf.Data(1, cf.Units('days since 2000-1-1', calendar='noleap')), bounds=bounds) # Create a longitude auxiliary coordinate lat = cf.AuxiliaryCoordinate(data=cf.Data(numpy.arange(90).reshape(10, 9), 'degrees_north')) lat.standard_name = 'latitude' # Create a latitude auxiliary coordinate lon = cf.AuxiliaryCoordinate(properties=dict(standard_name='longitude'), data=cf.Data(numpy.arange(1, 91).reshape(9, 10), 'degrees_east')) # Create a rotated_latitude_longitude grid mapping coordinate reference grid_mapping = cf.CoordinateReference('rotated_latitude_longitude', grid_north_pole_latitude=38.0, grid_north_pole_longitude=190.0) # -------------------------------------------------------------------- # 2. Create the field's domain from the previously created items # -------------------------------------------------------------------- domain = cf.Domain(dim=[T, Y, X], aux=[lat, lon], ref=grid_mapping) #--------------------------------------------------------------------- # 3. Create the field #--------------------------------------------------------------------- # Create CF properties properties = {'standard_name': 'eastward_wind', 'long_name' : 'East Wind', 'cell_methods' : cf.CellMethods('latitude: point')} # Create the field's data array data = cf.Data(numpy.arange(90.).reshape(9, 10), 'm s-1') # Finally, create the field f = cf.Field(properties=properties, domain=domain, data=data) print_f = str(f) self.assertTrue( print_f == '''eastward_wind field summary --------------------------- Data : eastward_wind(grid_longitude(9), grid_latitude(10)) m s-1 Cell methods : latitude: point Axes : time(1) = [2000-01-02 00:00:00] noleap : grid_longitude(9) = [0.0, ..., 8.0] degrees : grid_latitude(10) = [0.0, ..., 9.0] degrees Aux coords : latitude(grid_latitude(10), grid_longitude(9)) = [[0, ..., 89]] degrees_north : longitude(grid_longitude(9), grid_latitude(10)) = [[1, ..., 90]] degrees_east Coord refs : ''') #--- End: def def test_example5(self): import cf import numpy #--------------------------------------------------------------------- # 1. CREATE the field's domain items #--------------------------------------------------------------------- # Create a grid_latitude dimension coordinate Y = cf.DimensionCoordinate(properties={'standard_name': 'grid_latitude'}, data=cf.Data(numpy.arange(10.), 'degrees')) # Create a grid_longitude dimension coordinate X = cf.DimensionCoordinate(data=cf.Data(numpy.arange(10.), 'degrees')) X.standard_name = 'grid_longitude' # Create a time dimension coordinate (with bounds) bounds = cf.CoordinateBounds( data=cf.Data([0.5, 1.5], cf.Units('days since 2000-1-1', calendar='noleap'))) T = cf.DimensionCoordinate(properties=dict(standard_name='time'), data=cf.Data(1, cf.Units('days since 2000-1-1', calendar='noleap')), bounds=bounds) # Create a longitude auxiliary coordinate lat = cf.AuxiliaryCoordinate(data=cf.Data(numpy.arange(100).reshape(10, 10), 'degrees_north')) lat.standard_name = 'latitude' # Create a latitude auxiliary coordinate lon = cf.AuxiliaryCoordinate(properties=dict(standard_name='longitude'), data=cf.Data(numpy.arange(1, 101).reshape(10, 10), 'degrees_east')) # Create a rotated_latitude_longitude grid mapping coordinate reference grid_mapping = cf.CoordinateReference('rotated_latitude_longitude', grid_north_pole_latitude=38.0, grid_north_pole_longitude=190.0) # -------------------------------------------------------------------- # 2. Create the field's domain from the previously created items # -------------------------------------------------------------------- domain = cf.Domain(dim=[T, Y, X], aux={'aux0': lat, 'aux1': lon}, ref=grid_mapping, assign_axes={'aux0': ['grid_latitude', 'grid_longitude'], 'aux1': ['grid_longitude', 'grid_latitude']}) #--------------------------------------------------------------------- # 3. Create the field #--------------------------------------------------------------------- # Create CF properties properties = {'standard_name': 'eastward_wind', 'long_name' : 'East Wind', 'cell_methods' : cf.CellMethods('latitude: point')} # Create the field's data array data = cf.Data(numpy.arange(100.).reshape(10, 10), 'm s-1') # Finally, create the field f = cf.Field(properties=properties, domain=domain, data=data, axes=['grid_latitude', 'grid_longitude']) print_f = str(f) self.assertTrue( print_f == '''eastward_wind field summary --------------------------- Data : eastward_wind(grid_latitude(10), grid_longitude(10)) m s-1 Cell methods : latitude: point Axes : time(1) = [2000-01-02 00:00:00] noleap : grid_longitude(10) = [0.0, ..., 9.0] degrees : grid_latitude(10) = [0.0, ..., 9.0] degrees Aux coords : latitude(grid_latitude(10), grid_longitude(10)) = [[0, ..., 99]] degrees_north : longitude(grid_longitude(10), grid_latitude(10)) = [[1, ..., 100]] degrees_east Coord refs : ''') #--- End: def #--- End: class if __name__ == '__main__': print 'cf-python version:' , cf.__version__ print 'cf-python path:' , os.path.abspath(cf.__file__) print '' unittest.main(verbosity=2) cf-python-1.3.2/test/test_Regrid.py0000644000175000017500000001440712770450215017441 0ustar daviddavid00000000000000# -*- coding: utf-8 -*- import os import numpy import cf import unittest import inspect class RegridTest(unittest.TestCase): filename1 = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'file1.nc') filename2 = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'file2.nc') filename3 = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'file3.nc') filename4 = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'file4.nc') filename5 = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test_file3.nc') filename6 = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test_file2.nc') filename7 = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'file5.nc') filename8 = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'file6.nc') filename9 = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'file7.nc') filename10 = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'file8.nc') chunk_sizes = (300, 10000, 100000)[::-1] original_chunksize = cf.CHUNKSIZE() test_only = () # test_only = ('NOTHING!!!!!',) # test_only = ('test_Field_regrids',) # test_only = ('test_Field_regridc',) # test_only('test_Field_section',) # test_only('test_Data_section',) @unittest.skipUnless(cf._found_ESMF, "Requires esmf package.") def test_Field_regrids(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return original_atol = cf.ATOL(1e-12) for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) f1 = cf.read(self.filename1) f2 = cf.read(self.filename2) f3 = cf.read(self.filename3) self.assertTrue(f3.equals(f1.regrids(f2), traceback=True), 'destination = global Field, CHUNKSIZE = %s' % chunksize) self.assertTrue(f3.equals(f1.regrids(f2, method='conservative'), traceback=True), 'destination = global Field, CHUNKSIZE = %s' % chunksize) dst = {'longitude': f2.dim('X'), 'latitude': f2.dim('Y')} self.assertTrue(f3.equals(f1.regrids(dst, dst_cyclic=True), traceback=True), 'destination = global dict, CHUNKSIZE = %s' % chunksize) self.assertTrue(f3.equals(f1.regrids(dst, method='conservative', dst_cyclic=True), traceback=True), 'destination = global dict, CHUNKSIZE = %s' % chunksize) f4 = cf.read(self.filename4) f5 = cf.read(self.filename5) self.assertTrue(f4.equals(f1.regrids(f5), traceback=True), 'destination = regional Field, CHUNKSIZE = %s' % chunksize) self.assertTrue(f4.equals(f1.regrids(f5, method='bilinear'), traceback=True), 'destination = regional Field, CHUNKSIZE = %s' % chunksize) #--- End: for cf.CHUNKSIZE(self.original_chunksize) cf.ATOL(original_atol) #--- End: def @unittest.skipUnless(cf._found_ESMF, "Requires esmf package.") def test_Field_regridc(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return original_atol = cf.ATOL(1e-12) for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) f1 = cf.read(self.filename7) f2 = cf.read(self.filename8) f3 = cf.read(self.filename9) self.assertTrue(f3.equals(f1.regridc(f2, axes='T', method='bilinear'), traceback=True), 'destination = time series, CHUNKSIZE = %s' % chunksize) f4 = cf.read(self.filename1) f5 = cf.read(self.filename2) f6 = cf.read(self.filename10) self.assertTrue(f6.equals(f4.regridc(f5, axes=('X', 'Y')), traceback=True), 'destination = global Field, CHUNKSIZE = %s' % chunksize) self.assertTrue(f6.equals(f4.regridc(f5, axes=('X', 'Y'), method='conservative'), traceback=True), 'destination = global Field, CHUNKSIZE = %s' % chunksize) dst = {'X': f5.dim('X'), 'Y': f5.dim('Y')} self.assertTrue(f6.equals(f4.regridc(dst, axes=('X', 'Y')), traceback=True), 'destination = global dict, CHUNKSIZE = %s' % chunksize) self.assertTrue(f6.equals(f4.regridc(dst, axes=('X', 'Y'), method='conservative'), traceback=True), 'destination = global dict, CHUNKSIZE = %s' % chunksize) #--- End: for cf.CHUNKSIZE(self.original_chunksize) cf.ATOL(original_atol) #--- End: def def test_Field_section(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) f = cf.read(self.filename6) self.assertTrue(len(f.section(('X','Y'))) == 1800, 'CHUNKSIZE = %s' % chunksize) #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def def test_Data_section(self): if self.test_only and inspect.stack()[0][3] not in self.test_only: return for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) f = cf.read(self.filename6) self.assertTrue(list(sorted(f.Data.section((1,2)).keys())) == [(x, None, None) for x in range(1800)]) #--- End: for cf.CHUNKSIZE(self.original_chunksize) #--- End: def #--- End: class if __name__ == "__main__": print 'cf-python version:' , cf.__version__ print 'cf-python path:' , os.path.abspath(cf.__file__) print '' unittest.main(verbosity=2) cf-python-1.3.2/test/example3.py0000600000175000017500000000155512231473433016673 0ustar daviddavid00000000000000import cf import numpy data = cf.Data(numpy.arange(90.).reshape(10, 9), 'm s-1') properties = {'standard_name': 'eastward_wind'} dim0 = cf.DimensionCoordinate(data=cf.Data(range(10), 'degrees_north'), properties={'standard_name': 'latitude'}) dim1 = cf.DimensionCoordinate(data=cf.Data(range(9), 'degrees_east')) dim1.standard_name = 'longitude' domain = cf.Domain(dim=[dim0, dim1]) f = cf.Field(properties=properties, data=data, domain=domain) aux = cf.AuxiliaryCoordinate(data=cf.Data(['alpha','beta','gamma','delta','epsilon', 'zeta','eta','theta','iota','kappa'])) aux.long_name = 'extra' print f.items() f.insert_aux(aux) f.cell_methods = cf.CellMethods('latitude: point') f.long_name = 'wind' print f print repr(f.remove_item({'long_name': 'extra'})) del f.cell_methods print f cf-python-1.3.2/test/Data2.py0000600000175000017500000013203212426411743016105 0ustar daviddavid00000000000000import cf import numpy import os import itertools import time from operator import mul import unittest import inspect def reshape_array(a, axes): new_order = [i for i in range(a.ndim) if i not in axes] new_order.extend(axes) b = numpy.transpose(a, new_order) new_shape = b.shape[:b.ndim-len(axes)] new_shape += (reduce(mul, b.shape[b.ndim-len(axes):]),) b = b.reshape(new_shape) return b #--- End: def class DataTest(unittest.TestCase): print '\nRunning tests on cf.Data' print 'cf version', cf.__version__, 'running from', os.path.abspath(cf.__file__), '\n' filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test_file.nc') chunk_sizes = (17, 34, 300, 100000)[::-1] do_test = () # do_test = ('test_Data__collapse_UNWEIGHTED_MASKED',) # do_test = ('test_Data__collapse_UNWEIGHTED_UNMASKED',) # do_test = ('test_Data__collapse_WEIGHTED_UNMASKED',) # do_test = ('test_Data__collapse_WEIGHTED_MASKED',) # Variables for _collapse a = numpy.arange(-100, 200., dtype=float).reshape(3, 4, 5, 5) ma = numpy.ma.arange(-100, 200., dtype=float).reshape(3, 4, 5, 5) ma[0, :, 2, 3] = numpy.ma.masked ma[1, 2, 3, :] = numpy.ma.masked ma[0, 3, :, 3] = numpy.ma.masked ma[:, 1, 4, 4] = numpy.ma.masked w = numpy.arange(1, 301., dtype=float).reshape(a.shape) w[-1, -1, ...] = w[-1, -1, ...]*2 w /= w.min() axes_combinations = [axes for n in range(1, a.ndim+1) for axes in itertools.permutations(range(a.ndim), n)] def test_Data___contains__(self): '''cf.Data.__contains__''' if self.do_test and inspect.stack()[0][3] not in self.do_test: return print for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data([[0.0, 1, 2], [3, 4, 5]], units='m') self.assertTrue(4 in d) self.assertFalse(40 in d) self.assertTrue(cf.Data(3) in d) self.assertTrue(cf.Data([[[[3]]]]) in d) value = d[1, 2] value.Units *= 2 value.squeeze(0) self.assertTrue(value in d) self.assertTrue(numpy.array([[[2]]]) in d) print "cf.Data.__contains__ passed", "pmshape =", d._pmshape #--- End: def def test_Data___setitem__(self): '''cf.Data.__setitem__''' if self.do_test and inspect.stack()[0][3] not in self.do_test: return print for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) for hardmask in (False, True): a = numpy.ma.arange(3000).reshape(50, 60) if hardmask: a.harden_mask() else: a.soften_mask() d = cf.Data(a.filled(), 'm') d.hardmask = hardmask for n, (j, i) in enumerate(((34, 23), (0, 0), (-1, -1), (slice(40, 50), slice(58, 60)), (Ellipsis, Ellipsis), )): n = -n-1 for dvalue, avalue in ((n, n), (cf.masked, numpy.ma.masked), (n, n)): message = "cf.Data[%s, %s]=%s failed" % (j, i, dvalue) d[j, i] = dvalue a[j, i] = avalue self.assertTrue((d.array == a).all() in (True, numpy.ma.masked), message) self.assertTrue((d.mask.array == numpy.ma.getmaskarray(a)).all(), message) #--- End: for a = numpy.ma.arange(3000).reshape(50, 60) if hardmask: a.harden_mask() else: a.soften_mask() d = cf.Data(a.filled(), 'm') d.hardmask = hardmask (j, i) = (slice(0, 2), slice(0, 3)) array = numpy.array([[1, 2, 6],[3, 4, 5]])*-1 for dvalue in (array, numpy.ma.masked_where(array < -2, array), array): message = "cf.Data[%s, %s]=%s failed" % (j, i, dvalue) d[j, i] = dvalue a[j, i] = dvalue self.assertTrue((d.array == a).all() in (True, numpy.ma.masked), message) self.assertTrue((d.mask.array == numpy.ma.getmaskarray(a)).all(), message) #--- End: for print 'cf.Data.__setitem__ passed: hardmask =',hardmask,', pmshape =', d._pmshape #--- End: for #--- End: def def test_Data_all(self): '''cf.Data.all''' if self.do_test and inspect.stack()[0][3] not in self.do_test: return print for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data(numpy.array([[0] * 1000])) self.assertTrue(not d.all()) d[-1,-1] = 1 self.assertFalse(d.all()) d[...] = 1 self.assertTrue(d.all()) d[...] = cf.masked self.assertTrue(d.all()) print 'cf.Data.all passed', "pmshape =", d._pmshape #--- End: def def test_Data_any(self): '''cf.Data.any''' if self.do_test and inspect.stack()[0][3] not in self.do_test: return print for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data(numpy.array([[0] * 1000])) self.assertFalse(d.any()) d[-1,-1] = 1 self.assertTrue(d.any()) d[...] = 1 self.assertTrue(d.any()) d[...] = cf.masked self.assertFalse(d.any()) print 'cf.Data.any passed', "pmshape =", d._pmshape #--- End: def def test_Data_array(self): '''cf.Data.array''' if self.do_test and inspect.stack()[0][3] not in self.do_test: return print for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data(numpy.arange(10*15*19).reshape(10, 1, 15, 19), 'km') a = d.array a[0,0,0,0] = -999 self.assertTrue(d.array[0,0,0,0] == 0) print "cf.Data.array passed", "pmshape =", d._pmshape #--- End: def def test_Data_asdatetime_asreftime(self): '''cf.Data.asdatetime, cf.Data.asdatetime''' if self.do_test and inspect.stack()[0][3] not in self.do_test: return print for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data([[1.93, 5.17]], 'days since 2000-12-29') self.assertTrue(d.dtype == numpy.dtype(float)) self.assertFalse(d._isdt) d.asreftime(i=True) self.assertTrue(d.dtype == numpy.dtype(float)) self.assertFalse(d._isdt) d.asdatetime(i=True) self.assertTrue(d.dtype == numpy.dtype(object)) self.assertTrue(d._isdt) d.asdatetime(i=True) self.assertTrue(d.dtype == numpy.dtype(object)) self.assertTrue(d._isdt) d.asreftime(i=True) self.assertTrue(d.dtype == numpy.dtype(float)) self.assertFalse(d._isdt) print "cf.Data.asdatetime passed", "pmshape =", d._pmshape print "cf.Data.asreftime passed", "pmshape =", d._pmshape #--- End: def def test_Data_datum(self): '''cf.Data.datum''' if self.do_test and inspect.stack()[0][3] not in self.do_test: return print for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data(5, 'metre') self.assertTrue(d.datum() == 5) self.assertTrue(d.datum(0) == 5) self.assertTrue(d.datum(-1) == 5) for d in [cf.Data([4, 5, 6, 1, 2, 3], 'metre'), cf.Data([[4, 5, 6], [1, 2, 3]], 'metre')]: self.assertTrue(d.datum(0) == 4) self.assertTrue(d.datum(-1) == 3) for index in d.ndindex(): self.assertTrue(d.datum(index) == d.array[index].item()) self.assertTrue(d.datum(*index) == d.array[index].item()) #--- End: for d = cf.Data(5, 'metre') d[()] = cf.masked self.assertTrue(d.datum() is cf.masked) self.assertTrue(d.datum(0) is cf.masked) self.assertTrue(d.datum(-1) is cf.masked) d = cf.Data([[5]], 'metre') d[0, 0] = cf.masked self.assertTrue(d.datum() is cf.masked) self.assertTrue(d.datum(0) is cf.masked) self.assertTrue(d.datum(-1) is cf.masked) self.assertTrue(d.datum(0, 0) is cf.masked) self.assertTrue(d.datum(-1, 0) is cf.masked) self.assertTrue(d.datum([0, 0]) is cf.masked) self.assertTrue(d.datum([0, -1]) is cf.masked) self.assertTrue(d.datum(-1, -1) is cf.masked) print "cf.Data.datum passed", "pmshape =", d._pmshape #--- End: def def test_Data_flip(self): '''cf.Data.flip''' if self.do_test and inspect.stack()[0][3] not in self.do_test: return print for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) array = numpy.arange(24000).reshape(120, 200) d = cf.Data(array.copy(), 'metre') for axes, indices in zip( (0, 1, [0, 1]), ((slice(None, None, -1), slice(None)), (slice(None) , slice(None, None, -1)), (slice(None, None, -1), slice(None, None, -1))) ): array = array[indices] d.flip(axes, i=True) #--- End: for self.assertTrue((d.array == array).all()) print "cf.Data.flip passed", "pmshape =", d._pmshape #--- End: def def test_Data_max(self): '''cf.Data.max''' if self.do_test and inspect.stack()[0][3] not in self.do_test: return print for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data([[4, 5, 6], [1, 2, 3]], 'metre') self.assertTrue(d.max() == cf.Data(6, 'metre')) self.assertTrue(d.max().datum() == 6) d[0, 2] = cf.masked self.assertTrue(d.max() == 5) self.assertTrue(d.max().datum() == 5) self.assertTrue(d.max() == cf.Data(0.005, 'km')) print "cf.Data.max passed", "pmshape =", d._pmshape #--- End: def def test_Data_min(self): '''cf.Data.min''' if self.do_test and inspect.stack()[0][3] not in self.do_test: return print for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data([[4, 5, 6], [1, 2, 3]], 'metre') self.assertTrue(d.min() == cf.Data(1, 'metre')) self.assertTrue(d.min().datum() == 1) d[1, 0] = cf.masked self.assertTrue(d.min() == 2) self.assertTrue(d.min().datum() == 2) self.assertTrue(d.min() == cf.Data(0.002, 'km')) print "cf.Data.min passed", "pmshape =", d._pmshape #--- End: def def test_Data_ndindex(self): '''cf.Data.ndindex''' if self.do_test and inspect.stack()[0][3] not in self.do_test: return print for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) for d in (cf.Data(5, 'metre'), cf.Data([4, 5, 6, 1, 2, 3], 'metre'), cf.Data([[4, 5, 6], [1, 2, 3]], 'metre') ): for i, j in zip(d.ndindex(), numpy.ndindex(d.shape)): self.assertTrue(i == j) #--- End: for print "cf.Data.ndindex passed", "pmshape =", d._pmshape #--- End: def def test_Data_roll(self): '''cf.Data.roll''' if self.do_test and inspect.stack()[0][3] not in self.do_test: return print for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) a = numpy.arange(10*15*19).reshape(10, 1, 15, 19) d = cf.Data(a) pmshape = d._pmshape e = d.roll(0, 4) e.roll(2, 120, i=True) e.roll(3, -77, i=True) a = numpy.roll(a, 4, 0) a = numpy.roll(a, 120, 2) a = numpy.roll(a, -77, 3) self.assertTrue(e.shape == a.shape) self.assertTrue((a == e.array).all()) f = e.roll(3, 77) f.roll(2, -120, i=True) f.roll(0, -4, i=True) self.assertTrue(f.shape == d.shape) self.assertTrue(f.equals(d)) print "cf.Data.roll passed", "pmshape =", pmshape #--- End: def def test_Data_sample_size(self): '''cf.Data.sample_size''' if self.do_test and inspect.stack()[0][3] not in self.do_test: return print for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data([[4, 5, 6], [1, 2, 3]], 'metre') self.assertTrue(d.sample_size() == 6) d[1, 0] = cf.masked self.assertTrue(d.sample_size() == cf.Data(50, '0.1')) print "cf.Data.sample_size passed", "pmshape =", d._pmshape #--- End: def def test_Data_swapaxes(self): '''cf.cf.Data.swapaxes''' if self.do_test and inspect.stack()[0][3] not in self.do_test: return print for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) a = numpy.arange(10*15*19).reshape(10, 1, 15, 19) d = cf.Data(a.copy()) for i in range(-a.ndim, a.ndim): for j in range(-a.ndim, a.ndim): b = numpy.swapaxes(a.copy(), i, j) e = d.swapaxes(i, j) message = "cf.Data.swapaxes(%d, %d) failed" % (i, j) self.assertTrue(b.shape == e.shape, message) self.assertTrue((b == e.array).all(), message) #--- End: for #--- End: for print "cf.Data.swapaxes passed", "pmshape =", d._pmshape #--- End: def def test_Data_transpose(self): '''cf.cf.Data.transpose''' if self.do_test and inspect.stack()[0][3] not in self.do_test: return print for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) a = numpy.arange(10*15*19).reshape(10, 1, 15, 19) d = cf.Data(a.copy()) for indices in (range(a.ndim), range(-a.ndim, 0)): for axes in itertools.permutations(indices): a = numpy.transpose(a, axes) d.transpose(axes, i=True) message = 'cf.Data.transpose(%s) failed: d.shape=%s, a.shape=%s' % \ (axes, d.shape, a.shape) self.assertTrue(d.shape == a.shape, message) self.assertTrue((d.array == a).all(), message) #--- End: for #--- End: for print "cf.Data.transpose passed", "pmshape =", d._pmshape #--- End: def def test_Data_unique(self): '''cf.Data.unique''' if self.do_test and inspect.stack()[0][3] not in self.do_test: return print for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data([[4, 2, 1], [1, 2, 3]], 'metre') self.assertTrue((d.unique == cf.Data([1, 2, 3, 4], 'metre')).all()) d[1, -1] = cf.masked self.assertTrue((d.unique == cf.Data([1, 2, 4], 'metre')).all()) print "cf.Data.unique passed", "pmshape =", d._pmshape #--- End: def def test_Data_varray(self): '''cf.Data.varray''' if self.do_test and inspect.stack()[0][3] not in self.do_test: return print for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data(numpy.arange(10*15*19).reshape(10, 1, 15, 19), 'km') e = d.copy() v = e.varray v[0,0,0,0] = -999 self.assertTrue(e.array[0,0,0,0] == -999) print "cf.Data.varray passed", "pmshape =", d._pmshape #--- End: def def test_Data_year_month_day_hour_minute_second(self): '''cf.Data.year, cf.Data.month, cf.Data.day, cf.Data.hour, cf.Data.minute, cf.Data.second''' if self.do_test and inspect.stack()[0][3] not in self.do_test: return print d = cf.Data([[1.93, 5.17]], 'days since 2000-12-29') self.assertTrue(d.year.equals(cf.Data([[2000, 2001]]))) self.assertTrue(d.month.equals(cf.Data([[12, 1]]))) self.assertTrue(d.day.equals(cf.Data([[30, 3]]))) self.assertTrue(d.hour.equals(cf.Data([[22, 4]]))) self.assertTrue(d.minute.equals(cf.Data([[19, 4]]))) self.assertTrue(d.second.equals(cf.Data([[12, 48]]))) d = cf.Data([[1.93, 5.17]], cf.Units('days since 2000-12-29', '360_day')) self.assertTrue(d.year.equals(cf.Data([[2000, 2001]]))) self.assertTrue(d.month.equals(cf.Data([[12, 1]]))) self.assertTrue(d.day.equals(cf.Data([[30, 4]]))) self.assertTrue(d.hour.equals(cf.Data([[22, 4]]))) self.assertTrue(d.minute.equals(cf.Data([[19, 4]]))) self.assertTrue(d.second.equals(cf.Data([[12, 48]]))) print 'cf.Data.year passed' , "pmshape =", d._pmshape print 'cf.Data.month passed' , "pmshape =", d._pmshape print 'cf.Data.day passed' , "pmshape =", d._pmshape print 'cf.Data.hour passed' , "pmshape =", d._pmshape print 'cf.Data.minute passed', "pmshape =", d._pmshape print 'cf.Data.second passed', "pmshape =", d._pmshape #--- End: def def test_Data_BINARY_AND_UNARY_OPERATORS(self): '''BINARY AND UNARY OPERATORS''' if self.do_test and inspect.stack()[0][3] not in self.do_test: return print for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) array=numpy.arange(3*4*5).reshape(3, 4, 5) + 1 arrays = (numpy.arange(3*4*5).reshape(3, 4, 5) + 1.0, numpy.arange(3*4*5).reshape(3, 4, 5) + 1) for a0 in arrays: for a1 in arrays[::-1]: d = cf.Data(a0[(slice(None, None, -1),)*a0.ndim], 'metre') d.flip(i=True) x = cf.Data(a1, 'metre') self.assertTrue((d + x).equals(cf.Data(a0 + a1, 'm' ), traceback=1)), '%s+%s' % (repr(d), x) self.assertTrue((d * x).equals(cf.Data(a0 * a1, 'm2'), traceback=1)), '%s*%s' % (repr(d), x) self.assertTrue((d / x).equals(cf.Data(a0 / a1, '1' ), traceback=1)), '%s/%s' % (repr(d), x) self.assertTrue((d - x).equals(cf.Data(a0 - a1, 'm' ), traceback=1)), '%s-%s' % (repr(d), x) self.assertTrue((d // x).equals(cf.Data(a0 // a1, '1' ), traceback=1)), '%s//%s' % (repr(d), x) self.assertTrue(d.__truediv__(x).equals(cf.Data(array.__truediv__(array), '1'), traceback=1)), '%s.__truediv__(%s)' % (d, x) self.assertTrue(d.__rtruediv__(x).equals(cf.Data(array.__rtruediv__(array), '1'), traceback=1)) , '%s.__rtruediv__(%s)' % (d, x) try: d ** x except: pass else: self.assertTrue((d**x).all(), '%s**%s' % (d, repr(x))) print '%s {+, -, *, /, //, **, __truediv__, __rtruediv__} %s passed' % (d, x), \ "pmshape =", d._pmshape #--- End: for #--- End: for for a0 in arrays: d = cf.Data(a0, 'metre') for x in (2, 2.0): self.assertTrue((d + x).equals(cf.Data(a0 + x, 'm' ), traceback=1)), '%s+%s' % (repr(d), x) self.assertTrue((d * x).equals(cf.Data(a0 * x, 'm' ), traceback=1)), '%s*%s' % (repr(d), x) self.assertTrue((d / x).equals(cf.Data(a0 / x, 'm' ), traceback=1)), '%s/%s' % (repr(d), x) self.assertTrue((d - x).equals(cf.Data(a0 - x, 'm' ), traceback=1)), '%s-%s' % (repr(d), x) self.assertTrue((d // x).equals(cf.Data(a0 // x, 'm' ), traceback=1)), '%s//%s' % (repr(d), x) self.assertTrue((d ** x).equals(cf.Data(a0 ** x, 'm2'), traceback=1)), '%s**%s' % (repr(d), x) self.assertTrue(d.__truediv__(x).equals(cf.Data(a0.__truediv__(x), 'm'), traceback=1)), '%s.__truediv__(%s)' % (d, x) self.assertTrue(d.__rtruediv__(x).equals(cf.Data(a0.__rtruediv__(x), 'm-1'), traceback=1)) , '%s.__rtruediv__(%s)' % (d, x) print '%s {+, -, *, /, //, **, __truediv__, __rtruediv__} %s passed' % (d, x), \ "pmshape =", d._pmshape self.assertTrue((x + d).equals(cf.Data(x + a0, 'm' ), traceback=1)), '%s+%s' % (x, repr(d)) self.assertTrue((x * d).equals(cf.Data(x * a0, 'm' ), traceback=1)), '%s*%s' % (x, repr(d)) self.assertTrue((x / d).equals(cf.Data(x / a0, 'm-1'), traceback=1)), '%s/%s' % (x, repr(d)) self.assertTrue((x - d).equals(cf.Data(x - a0, 'm' ), traceback=1)), '%s-%s' % (x, repr(d)) self.assertTrue((x // d).equals(cf.Data(x // a0, 'm-1'), traceback=1)), '%s//%s' % (x, repr(d)) try: x ** d except: pass else: self.assertTrue((x**d).all(), '%s**%s' % (x, repr(d))) print '%s {+, -, *, /, //, **} %s passed' % (x, repr(d)), \ "pmshape =", d._pmshape e = d.copy() a = a0.copy() e += x a += x self.assertTrue(e.equals(cf.Data(a, 'm'), traceback=1)), '%s+=%s' % (repr(d), x) e = d.copy() a = a0.copy() e *= x a *= x self.assertTrue(e.equals(cf.Data(a, 'm'), traceback=1)), '%s*=%s' % (repr(d), x) e = d.copy() a = a0.copy() e /= x a /= x self.assertTrue(e.equals(cf.Data(a, 'm'), traceback=1)), '%s/=%s' % (repr(d), x) e = d.copy() a = a0.copy() e -= x a -= x self.assertTrue(e.equals(cf.Data(a, 'm'), traceback=1)), '%s-=%s' % (repr(d), x) e = d.copy() a = a0.copy() e //= x a //= x self.assertTrue(e.equals(cf.Data(a, 'm'), traceback=1)), '%s//=%s' % (repr(d), x) e = d.copy() a = a0.copy() e **= x a **= x self.assertTrue(e.equals(cf.Data(a, 'm2'), traceback=1)), '%s**=%s' % (repr(d), x) e = d.copy() a = a0.copy() e.__itruediv__(x) a.__itruediv__(x) self.assertTrue(e.equals(cf.Data(a, 'm'), traceback=1)), '%s.__itruediv__(%s)' % (d, x) print '%s {+=, -=, *=, /=, //=, **=, __itruediv__} %s passed' % (repr(d), x), \ "pmshape =", d._pmshape #--- End: for for x in (cf.Data(2, 'metre'), cf.Data(2.0, 'metre')): self.assertTrue((d + x).equals(cf.Data(a0 + x.datum(), 'm' ), traceback=1)) self.assertTrue((d * x).equals(cf.Data(a0 * x.datum(), 'm2'), traceback=1)) self.assertTrue((d / x).equals(cf.Data(a0 / x.datum(), '1' ), traceback=1)) self.assertTrue((d - x).equals(cf.Data(a0 - x.datum(), 'm' ), traceback=1)) self.assertTrue((d // x).equals(cf.Data(a0 // x.datum(), '1' ), traceback=1)) try: d ** x except: pass else: self.assertTrue((x**d).all(), '%s**%s' % (x, repr(d))) self.assertTrue(d.__truediv__(x).equals(cf.Data(a0.__truediv__(x.datum()), ''), traceback=1)) print '%s {+, -, *, /, //, **, __truediv__} %s passed' % (repr(d), repr(x)), \ "pmshape =", d._pmshape #--- End: for #--- End: for #--- End: def def test_Data_BROADCASTING(self): '''BROADCASTING''' if self.do_test and inspect.stack()[0][3] not in self.do_test: return print A = [numpy.array(3), numpy.array( [3]), numpy.array( [3]).reshape(1, 1), numpy.array( [3]).reshape(1, 1, 1), numpy.arange( 5).reshape(5, 1), numpy.arange( 5).reshape(1, 5), numpy.arange( 5).reshape(1, 5, 1), numpy.arange( 5).reshape(5, 1, 1), numpy.arange( 5).reshape(1, 1, 5), numpy.arange( 25).reshape(1, 5, 5), numpy.arange( 25).reshape(5, 1, 5), numpy.arange( 25).reshape(5, 5, 1), numpy.arange(125).reshape(5, 5, 5), ] for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) for a in A: for b in A: d = cf.Data(a) e = cf.Data(b) ab = a*b de = d*e self.assertTrue(de.shape == ab.shape) self.assertTrue((de.array == ab).all()) #--- End: for #--- End: for print "cf.Data BROADCASTING passed" #--- End: for #--- End: def def test_Data__collapse_SHAPE(self): '''cf.Data._collapse SHAPE''' if self.do_test and inspect.stack()[0][3] not in self.do_test: return print a = numpy.arange(-100, 200., dtype=float).reshape(3, 4, 5, 5) ones = numpy.ones(a.shape, dtype=float) for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data(a[(slice(None, None, -1),) * a.ndim].copy()) d.flip(i=True) x = cf.Data(self.w.copy()) shape = list(d.shape) for h in ('sample_size', 'sum', 'min', 'max', 'mean', 'var', 'sd', 'mid_range', 'range'): for axes in self.axes_combinations: e = getattr(d, h)(axes=axes, squeeze=False) shape = list(d.shape) for i in axes: shape[i] = 1 shape = tuple(shape) self.assertTrue( e.shape == shape, "%s, axes=%s, not squeezed bad shape: %s != %s" % \ (h, axes, e.shape, shape)) #--- End: for for axes in self.axes_combinations: e = getattr(d, h)(axes=axes, squeeze=True) shape = list(d.shape) for i in sorted(axes, reverse=True): shape.pop(i) shape = tuple(shape) assert e.shape == shape, \ "%s, axes=%s, squeezed bad shape: %s != %s" % \ (h, axis, e.shape, shape) #--- End: for e = getattr(d, h)(squeeze=True) shape = () self.assertTrue( e.shape == shape, "%s, axes=%s, squeezed bad shape: %s != %s" % \ (h, None, e.shape, shape)) e = getattr(d, h)(squeeze=False) shape = (1,) * d.ndim self.assertTrue( e.shape == shape, "%s, axes=%s, not squeezed bad shape: %s != %s" % \ (h, None, e.shape, shape)) print 'cf.Data.%s SHAPE passed' % h, "pmshape =", d._pmshape #--- End: for #--- End: def def test_Data__collapse_UNWEIGHTED_MASKED(self): '''cf.Data._collapse UNWEIGHTED MASKED''' if self.do_test and inspect.stack()[0][3] not in self.do_test: return print a = numpy.ma.arange(-100, 200., dtype=float).reshape(3, 4, 5, 5) a[0, :, 2, 3] = numpy.ma.masked a[1, 2, 3, :] = numpy.ma.masked a[0, 3, :, 3] = numpy.ma.masked a[:, 1, 4, 4] = numpy.ma.masked ones = numpy.ones(a.shape, dtype=float) ones = numpy.ma.array(ones) for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data(self.ma.copy()) for c, h in zip((ones , ones), ('sum_of_weights', 'sum_of_weights2')): for axes in self.axes_combinations: c = c.copy() c.mask = self.ma.mask b = reshape_array(c, axes) b = numpy.ma.asanyarray(b.sum(axis=-1)) e = getattr(d, h)(axes=axes, squeeze=True) self.assertTrue( (e.mask.array == b.mask).all(), "%s, axis=%s, \ne.mask=%s, \nb.mask=%s, \ne.mask==b.mask=%s" % (h, axes, e.mask.array, b.mask, e.mask.array==b.mask)) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08), "%s, axis=%s, \ne=%s, \nb=%s, \ne-b=%s" % (h, axes, e.array, b, e.array-b)) #--- End: for print 'cf.Data.%s UNWEIGHTED, MASKED passed' % h, \ "pmshape =", d._pmshape #--- End: for for np, h in zip((numpy.ma.sum, numpy.ma.amin, numpy.ma.amax), ( 'sum', 'min', 'max')): for axes in self.axes_combinations: b = reshape_array(self.ma, axes) b = np(b, axis=-1) b = numpy.ma.asanyarray(b) e = getattr(d, h)(axes=axes, squeeze=True) self.assertTrue( (e.mask.array == b.mask).all(), "%s, axis=%s, \ne.mask=%s, \nb.mask=%s, \ne.mask==b.mask=%s" % (h, axes, e.mask.array, b.mask, e.mask.array==b.mask)) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08), "%s, axis=%s, unweighted, unmasked \ne=%s, \nb=%s, \ne-b=%s" % (h, axes, e.array, b, e.array-b)) #--- End: for print 'cf.Data.%s UNWEIGHTED, MASKED passed' % \ h, "pmshape =", d._pmshape #--- End: for h = 'mean' for axes in self.axes_combinations: b = reshape_array(self.ma, axes) b = numpy.ma.average(b, axis=-1) b = numpy.ma.asanyarray(b) e = getattr(d, h)(axes=axes, squeeze=True) self.assertTrue( (e.mask.array == b.mask).all(), "%s, axis=%s, \ne.mask=%s, \nb.mask=%s, \ne.mask==b.mask=%s" % (h, axes, e.mask.array, b.mask, e.mask.array==b.mask)) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08), "%s, axis=%s, \ne=%s, \nb=%s, \ne-b=%s" % (h, axes, e.array, b, e.array-b)) #--- End: for print 'cf.Data.%s UNWEIGHTED, MASKED passed' % h, \ "pmshape =", d._pmshape ddofs = (0, 1, 2) f = 2 for h in ('var', 'sd'): for axes in self.axes_combinations: for ddof in ddofs: e = getattr(d, h)(axes=axes, squeeze=True, ddof=ddof) b = reshape_array(a, axes) not_enough_data = numpy.ma.count(b, axis=-1) <= ddof avg = numpy.ma.average(b, axis=-1) if numpy.ndim(avg) < b.ndim: avg = numpy.ma.expand_dims(avg, -1) b, sv = numpy.ma.average((b-avg)**2, axis=-1, returned=True) b = numpy.ma.where(not_enough_data, numpy.ma.masked, b) b *= sv/(sv-ddof) if h == 'sd': b **= 0.5 b = numpy.ma.asanyarray(b) e = getattr(d, h)(axes=axes, squeeze=True, ddof=ddof) self.assertTrue( (e.mask.array == b.mask).all(), "%s, axes=%s, ddof=%s, \ne.mask=%s, \nb.mask=%s, \ne.mask==b.mask=%s" % (h, axes, ddof, e.mask.array, b.mask, e.mask.array==b.mask)) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08), "%s, axes=%s, ddof=%s, \ne=%s, \nb=%s, \ne-b=%s" % (h, axes, ddof, e.array, b, e.array-b)) #--- End: for #--- End: for print 'cf.Data.%s UNWEIGHTED, MASKED passed' % h, \ "pmshape =", d._pmshape #--- End: for #--- End: def def test_Data__collapse_UNWEIGHTED_UNMASKED(self): '''cf.Data._collapse UNWEIGHTED UNMASKED''' if self.do_test and inspect.stack()[0][3] not in self.do_test: return print a = numpy.arange(-100, 200., dtype=float).reshape(3, 4, 5, 5) ones = numpy.ones(a.shape, dtype=float) for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data(a[(slice(None, None, -1),) * a.ndim].copy()) d.flip(i=True) for h in ('sample_size', 'sum_of_weights', 'sum_of_weights2'): for axes in self.axes_combinations: b = reshape_array(ones, axes) b = b.sum(axis=-1) e = getattr(d, h)(axes=axes, squeeze=True) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08), "%s, axis=%s, \ne=%s, \nb=%s, \ne-b=%s" % \ (h, axes, e.array, b, e.array-b)) #--- End: for print 'cf.Data.%s UNWEIGHTED, UNMASKED passed' % h, \ "pmshape =", d._pmshape #--- End: for for np, h in zip((numpy.sum, numpy.amin, numpy.amax, numpy.mean), ( 'sum', 'min', 'max', 'mean')): for axes in self.axes_combinations: b = reshape_array(a, axes) b = np(b, axis=-1) e = getattr(d, h)(axes=axes, squeeze=True) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08), "%s, axis=%s, unweighted, unmasked \ne=%s, \nb=%s, \ne-b=%s" % (h, axes, e.array, b, e.array-b)) #--- End: for print 'cf.Data.%s UNWEIGHTED, UNMASKED passed' % h, \ "pmshape =", d._pmshape #--- End: for ddofs=(0, 1, 2) for np, h in zip((numpy.var, numpy.std), ('var' , 'sd')): for ddof in ddofs: for axes in self.axes_combinations: b = reshape_array(a, axes) b = np(b, axis=-1, ddof=ddof) e = getattr(d, h)(axes=axes, squeeze=True, ddof=ddof) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08), "%s, axis=%s, unweighted, unmasked \ne=%s, \nb=%s, \ne-b=%s" % (h, axes, e.array, b, e.array-b)) #--- End: for #--- End: for print 'cf.Data.%s UNWEIGHTED, UNMASKED passed' % h, \ "pmshape =", d._pmshape #--- End: for #--- End: def def test_Data__collapse_WEIGHTED_MASKED(self): '''cf.Data._collapse WEIGHTED MASKED''' if self.do_test and inspect.stack()[0][3] not in self.do_test: return print mw = numpy.ma.array(self.w) for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data(self.ma.copy()) x = cf.Data(self.w.copy()) for c, h in zip((mw , mw*mw), ('sum_of_weights', 'sum_of_weights2')): for axes in self.axes_combinations: c = c.copy() c.mask = self.ma.mask b = reshape_array(c, axes) b = numpy.ma.asanyarray(b.sum(axis=-1)) e = getattr(d, h)(axes=axes, weights=x, squeeze=True) self.assertTrue( (e.mask.array == b.mask).all(), "%s, axis=%s, \ne.mask=%s, \nb.mask=%s, \ne.mask==b.mask=%s" % (h, axes, e.mask.array, b.mask, e.mask.array==b.mask)) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08), "%s, axis=%s, \ne=%s, \nb=%s, \ne-b=%s" % (h, axes, e.array, b, e.array-b)) #--- End: for print 'cf.Data.%s WEIGHTED, MASKED passed' % h, \ "pmshape =", d._pmshape #--- End: for h = 'mean' for axes in self.axes_combinations: b = reshape_array(self.ma, axes) v = reshape_array(mw, axes) b = numpy.ma.average(b, axis=-1, weights=v) b = numpy.ma.asanyarray(b) e = getattr(d, h)(axes=axes, weights=x, squeeze=True) self.assertTrue( (e.mask.array == b.mask).all(), "%s, axis=%s, \ne.mask=%s, \nb.mask=%s, \ne.mask==b.mask=%s" % (h, axes, e.mask.array, b.mask, e.mask.array==b.mask)) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08), "%s, axis=%s, \ne=%s, \nb=%s, \ne-b=%s" % (h, axes, e.array, b, e.array-b)) #--- End: for print 'cf.Data.%s WEIGHTED, MASKED passed' % h, \ "pmshape =", d._pmshape ddofs = (0, 1, 2) f = 2 for h in ('var', 'sd'): for axes in self.axes_combinations: for ddof in ddofs: b = reshape_array(self.ma, axes) v = reshape_array(mw, axes) not_enough_data = numpy.ma.count(b, axis=-1) <= ddof avg = numpy.ma.average(b, axis=-1, weights=v) if numpy.ndim(avg) < b.ndim: avg = numpy.ma.expand_dims(avg, -1) b, sv = numpy.ma.average((b-avg)**2, axis=-1, weights=v, returned=True) b = numpy.ma.where(not_enough_data, numpy.ma.masked, b) b *= f*sv/(f*sv-ddof) if h == 'sd': b **= 0.5 b = numpy.ma.asanyarray(b) e = getattr(d, h)(axes=axes, weights=x, squeeze=True, ddof=ddof, a=f) self.assertTrue( (e.mask.array == b.mask).all(), "%s, axis=%s, \ne.mask=%s, \nb.mask=%s, \ne.mask==b.mask=%s" % (h, axes, e.mask.array, b.mask, e.mask.array==b.mask)) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08), "%s, axis=%s, ddof=%s, \ne=%s, \nb=%s, \ne-b=%s" % (h, axes, ddof, e.array, b, e.array-b)) #--- End: for #--- End: for print 'cf.Data.%s WEIGHTED, MASKED passed' % h, \ "pmshape =", d._pmshape #--- End: for #--- End: def def test_Data__collapse_WEIGHTED_UNMASKED(self): '''cf.Data._collapse WEIGHTED UNMASKED''' if self.do_test and inspect.stack()[0][3] not in self.do_test: return print a = numpy.arange(-100, 200., dtype=float).reshape(3, 4, 5, 5) for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) d = cf.Data(a[(slice(None, None, -1),) * a.ndim].copy()) d.flip(i=True) x = cf.Data(self.w.copy()) for c, h in zip((self.w , self.w*self.w), ('sum_of_weights', 'sum_of_weights2')): for axes in self.axes_combinations: b = reshape_array(c, axes) b = b.sum(axis=-1) e = getattr(d, h)(axes=axes, weights=x, squeeze=True) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08), "%s, axis=%s, \ne=%s, \nb=%s, \ne-b=%s" % (h, axes, e.array, b, e.array-b)) #--- End: for print 'cf.Data.%s WEIGHTED, UNMASKED passed' % h, \ "pmshape =", d._pmshape #--- End: for h = 'mean' for axes in self.axes_combinations: b = reshape_array(a, axes) v = reshape_array(self.w, axes) b = numpy.average(b, axis=-1, weights=v) e = getattr(d, h)(axes=axes, weights=x, squeeze=True) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08), "%s, axis=%s, \ne=%s, \nb=%s, \ne-b=%s" % (h, axes, e.array, b, e.array-b)) #--- End: for print 'cf.Data.%s WEIGHTED, UNMASKED passed' % h, \ "pmshape =", d._pmshape ddofs = (0, 1, 2) f= 2 for h in ('var', 'sd'): for axes in self.axes_combinations: for ddof in ddofs: b = reshape_array(a, axes) v = reshape_array(self.w, axes) avg = numpy.average(b, axis=-1, weights=v) if numpy.ndim(avg) < b.ndim: avg = numpy.expand_dims(avg, -1) b, sv = numpy.average((b-avg)**2, axis=-1, weights=v, returned=True) b *= f*sv/(f*sv-ddof) if h == 'sd': b **= 0.5 e = getattr(d, h)(axes=axes, weights=x, squeeze=True, ddof=ddof, a=f) self.assertTrue( e.allclose(b, rtol=1e-05, atol=1e-08) , "%s, axis=%s, ddof=%s, \ne=%s, \nb=%s, \ne-b=%s" % \ (h, axes, ddof, e.array, b, e.array-b)) #--- End: for #--- End: for print 'cf.Data.%s WEIGHTED, UNMASKED passed' % h, \ "pmshape =", d._pmshape #--- End: for #--- End: def #--- End: class if __name__ == "__main__": original_chunksize = cf.CHUNKSIZE() unittest.main() cf.CHUNKSIZE(original_chunksize) cf-python-1.3.2/test/test_pp.py0000644000175000017500000000345212745346617016656 0ustar daviddavid00000000000000import cf import numpy import os import tempfile import time import unittest import atexit tmpfile = tempfile.mktemp('.cf-python_test') tmpfiles = [tmpfile] def _remove_tmpfiles(): ''' ''' for f in tmpfiles: try: os.remove(f) except OSError: pass #--- End: def atexit.register(_remove_tmpfiles) class ppTest(unittest.TestCase): ppfilename = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'wgdos_packed.pp') chunk_sizes = (17, 34, 300, 100000)[::-1] original_chunksize = cf.CHUNKSIZE() def test_PP_WGDOS_UNPACKING(self): # print 'skipping WGDOS unpacking !!!!!!! ... ' # return cf.CHUNKSIZE(10000000) f = cf.read(self.ppfilename)[0] self.assertTrue(f.data.min() > 221.71, 'Bad unpacking of WGDOS packed data') self.assertTrue(f.data.max() < 310.45, 'Bad unpacking of WGDOS packed data') array = f.array for chunksize in self.chunk_sizes: cf.CHUNKSIZE(chunksize) f = cf.read(self.ppfilename)[0] for fmt in ('CFA4', 'NETCDF4'): cf.write(f, tmpfile, fmt=fmt) g = cf.read(tmpfile)[0] self.assertTrue((f.array == array).all(), 'Bad unpacking of WGDOS packed data') self.assertTrue(f.equals(g, traceback=True), 'Bad writing/reading. format='+fmt) #--- End: for original_chunksize = cf.CHUNKSIZE() #--- End: def #--- End: class if __name__ == '__main__': print 'cf-python version:', cf.__version__ print 'cf-python path:' , os.path.abspath(cf.__file__) print '' unittest.main(verbosity=2) cf-python-1.3.2/test/xtest_CellMethods.py0000600000175000017500000000522512465226316020612 0ustar daviddavid00000000000000import cf import os import unittest class CellMethodsTest(unittest.TestCase): filename = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'test_file.nc') chunk_sizes = (17, 34, 300, 100000)[::-1] original_chunksize = cf.CHUNKSIZE() def test_CellMethods___str__(self): for s in ("t: mean", "time: point", "time: maximum", "time: sum", "lon: maximum time: mean" "time: mean lon: maximum", "lat: lon: standard_deviation", "lon: standard_deviation lat: standard_deviation", "time: standard_deviation (interval: 1 day)", "area: mean", "lon: lat: mean", "lat: lon: standard_deviation (interval: 0.1 degree_N interval: 0.2 degree_E)", "time: variance (interval: 1 hr comment: sampled instantaneously)", 'time: mean', 'time: mean time: maximum', 'time: mean within years time: maximum over years', 'time: mean within days time: maximum within years time: variance over years', "time: standard_deviation (interval: 1 day)", "time: standard_deviation (interval: 1 year)", "lat: lon: standard_deviation (interval: 10 km)", "lat: lon: standard_deviation (interval: 0.1 degree_N interval: 0.2 degree_E)", "lat: mean (area-weighted) or lat: mean (interval: 1 degree_north comment: area-weighted)", "time: variance (interval: 1 hr comment: sampled instantaneously)", "area: mean where land", "area: mean where land_sea", "area: mean where sea_ice over sea", "area: mean where sea_ice over sea", "time: minimum within years time: mean over years", "time: sum within years time: mean over years", "time: mean within days time: mean over days", "time: minimum within days time: sum over days", "time: minimum within days time: maximum over days", "time: mean within days", "time: sum within days time: maximum over days" ): cm = cf.CellMethods(s) self.assertTrue(str(cm) == s, 'Problem with input string: %r' % s) #--- End: def #--- End: class if __name__ == '__main__': print 'cf-python version:', cf.__version__ print 'cf-python path:' , os.path.abspath(cf.__file__) print '' unittest.main(verbosity=2) cf-python-1.3.2/test/test.py0000600000175000017500000000133312350773240016127 0ustar daviddavid00000000000000import cf import os import time import test1 import Units import Data import Datetime import Comparison import Collapse import PP import Transform import create_field import Aggregate start_time = time.time() create_field.test() Datetime.test() Comparison.test() Transform.test() Aggregate.test() Units.test() PP.test() Collapse.test() Data.test() time_elapsed = (time.time() - start_time)/60.0 print print '---------------------------------------------------------------------------' print 'All tests passed for cf version', cf.__version__ print 'Running from', os.path.abspath(cf.__file__) print 'Time elapsed: %f minutes' % time_elapsed print '---------------------------------------------------------------------------' cf-python-1.3.2/setup.py0000755000175000017500000001316512765460072015360 0ustar daviddavid00000000000000from distutils.core import setup, Extension from distutils.command.build import build import os import fnmatch import sys import imp import re import subprocess def find_package_data_files(directory): for root, dirs, files in os.walk(directory): for basename in files: if fnmatch.fnmatch(basename, '*'): filename = os.path.join(root, basename) # if filename.find('/.svn') > -1: # continue yield filename.replace('cf/', '', 1) ## Check that the dependencies are met #for _module in ('netCDF4', 'numpy'): # try: # imp.find_module(_module) # except ImportError as error: # raise ImportError("Missing dependency. cf requires package %s. %s" % # (_module, error)) ##--- End: for # def _read(fname): """Returns content of a file. """ fpath = os.path.dirname(__file__) fpath = os.path.join(fpath, fname) with open(fpath, 'r') as file_: return file_.read() def _get_version(): """Returns library version by inspecting __init__.py file. """ return re.search(r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]', _read("cf/__init__.py"), re.MULTILINE).group(1) version = _get_version() packages = ['cf'] etc_files = [f for f in find_package_data_files('cf/etc')] umread_files = [f for f in find_package_data_files('cf/um/umread/c-lib')] package_data = etc_files + umread_files class build_umread(build): ''' Adpated from https://github.com/Turbo87/py-xcsoar/blob/master/setup.py ''' def run(self): # Run original build code build.run(self) # Build umread print 'Running build_umread' build_dir = os.path.join(os.path.abspath(self.build_lib), 'cf/um/umread/c-lib') cmd = ['make', '-C', build_dir] rc = subprocess.call(cmd) def compile(): print '*' * 80 print 'Running:', ' '.join(cmd), '\n' rc = subprocess.call(cmd) print '\n', '-' * 80 if not rc: print 'SUCCESSFULLY BUILT UM read C library' else: print 'WARNING: Errors during build of UM read C library will cause failures with UKMO PP and UM format files' print 'HOWEVER: This will not affect any other cf-python functionality' #--- End: if print '-' * 80, '\n' print '*' * 80 print print "cf build successful" print #--- End: def self.execute(compile, [], 'compiling umread') #--- End: class #with open('README.md') as ldfile: # long_description = ldfile.read() long_description = """Home page ========= * `cf-python `_ Documentation ============= * `Online documentation for the latest stable release `_ Dependencies ============ * The package runs on Linux and Mac OS operating systems. * Requires a python version from 2.6 up to, but not including, 3.0. * See the `README.md `_ file for further dependencies Visualisation ============= * The `cfplot package `_ at version 1.9.10 or newer provides metadata-aware visualisation for cf-python fields. This is not a dependency for cf-python. Command line utilities ====================== * The `cfdump` tool generates text representations on standard output of the CF fields contained in the input files. * The `cfa` tool creates and writes to disk the CF fields contained in the input files. * During installation these scripts will be copied automatically to a location given by the ``PATH`` environment variable. Code license ============ * `MIT License `_""" setup(name = "cf-python", long_description = long_description, version = version, description = "Python interface to the CF data model", author = "David Hassell", maintainer = "David Hassell", maintainer_email = "d.c.hassell at reading.ac.uk", author_email = "d.c.hassell at reading.ac.uk", url = "http://cfpython.bitbucket.org/", download_url = "https://bitbucket.org/cfpython/cf-python/downloads", platforms = ["Linux", "MacOS"], keywords = ['cf','netcdf','data','science', 'oceanography','meteorology','climate'], classifiers = ["Development Status :: 5 - Production/Stable", "Intended Audience :: Science/Research", "License :: OSI Approved :: MIT License", "Topic :: Scientific/Engineering :: Mathematics", "Topic :: Scientific/Engineering :: Physics", "Topic :: Scientific/Engineering :: Atmospheric Science", "Topic :: Utilities", "Operating System :: POSIX :: Linux", "Operating System :: MacOS" ], packages = ['cf', 'cf.um', 'cf.um.umread', 'cf.data', 'cf.netcdf'], package_data = {'cf': package_data}, scripts = ['scripts/cfa', 'scripts/cfdump'], requires = ['netCDF4 (>=1.1.1)', 'numpy (>=1.7)', 'matplotlib (>=1.4.2)', 'psutil (>=0.6.0)', ], cmdclass = {'build': build_umread}, #https://docs.python.org/2/distutils/apiref.html ) cf-python-1.3.2/scripts/0000755000175000017500000000000012770523316015321 5ustar daviddavid00000000000000cf-python-1.3.2/scripts/man1/0000755000175000017500000000000012770523316016155 5ustar daviddavid00000000000000cf-python-1.3.2/scripts/man1/cfdump.10000600000175000017500000002217012247657405017515 0ustar daviddavid00000000000000.TH "CFDUMP" "1" "Version 0.9.8" "06 December 2013" "cfdump" . . . .SH NAME cfdump \- view CF fields . . . .SH SYNOPSIS cfdump [\-a options] [\-c] [\-h] [\-l] [\-r options] [\-s] [FILE] ... . . . .SH DESCRIPTION The cfdump tool generates text representations on standard output of the CF fields contained in the input files. .PP The input files are treated as a single CF dataset following the aggregation rules currently documented in CF ticket #78. .PP By default a summary of each CF field is output, but short one\-line summaries and long or complete dumps are optionally available (see the .ft B \-s \-l \-c .ft P options). .PP Accepts CF\-netCDF and CFA\-netCDF files (or URLs if DAP access is enabled) and Met Office (UK) PP format files as input. Multiple input files in a mixture of formats may be given and normal UNIX file globbing rules apply. For example: .PP .RS .nf cfdump file1.nc file2.nc cfdump file[1\-9].nc cfdump data1/*.nc data2/*.nc cfdump data[12]/*.nc cfdump ../test*.pp cfdump file.nca cfdump file.nca file?.nc cfdump http://test.opendap.org/dap/coads_climatology.nc cfdump http://test.opendap.org/dap/coads_climatology.nc file*.nc .fi .RE .PP In the output, each component of a field is assigned one of the following roles as defined by the CF data model: .PP .RS .nf Field Dimension Dimension coordinate Auxiliary coordinate Cell measure Transform .fi .RE .PP A field and its components are identified, where appropriate, by their standard names if available, or their long names. If neither is present then a netCDF variable name is used. Long names and netCDF variable names are preceded by 'long_name:' and 'ncvar:' respectively. Dimension identities are inferred from the coordinates which span them. .PP Each data array of a field and its components is described by its dimensionality, units and (depending on the length of dump requested) its first and last values. For long and complete dumps, arrays containing coordinate bounds are given in the same way and included as part of their coordinates' descriptions. . . . .SH EXAMPLES . . In these examples, a complete dataset has been split across two files (file1.nc and file2.nc). These may be passed to cfdump which will return a description of the recombined, aggregated field. .PP The short, one\-line output gives the identity of the field (air_temperature), the identities and sizes of its data array dimensions (time, latitude and longitude with sizes 1200, 64 and 128 respectively) and the units of the field's data array (K): .PP .nf $ cfdump \-s file1.nc file2.nc .fi .PP The default summary gives the same information as the the one\-line output, along with short descriptions of the field's other components: .PP .nf $ cfdump file[12].nc air_temperature field summary ----------------------------- Data : air_temperature(time(1200), latitude(64), longitude(128)) K Cell methods : time: mean (interval: 1.0 month) Dimensions : time(12) = [ 450\-11\-16 00:00:00, ..., 550\-10\-16 12:00:00] noleap calendar : latitude(64) = [\-87.8638000488, ..., 87.8638000488] degrees_north : longitude(128) = [0.0, ..., 357.1875] degrees_east : height(1) = [2.0] m .fi .PP This shows that the aggregated field has a cell method and four dimension coordinates, one of which (height) is a coordinate for a size 1 dimension that is not a dimension of the field's data array. The units and first and last values of the coordinates' data arrays are given and relative time values are translated into strings. .PP The long dump includes each component's properties, as well as the first and last values of the field's data array: .PP .nf $ cfdump \-l file[1\-2].nc ====================== Field: air_temperature ====================== Dimensions height(1) latitude(64) longitude(128) time(12) Data(time(12), latitude(64), longitude(128)) = [[[236.512756348, ..., 256.93371582]]] K cell_methods = time: mean (interval: 1.0 month) experiment_id = 'pre\-industrial control experiment' long_name = 'air_temperature' missing_value = 1e+20 standard_name = 'air_temperature' Dimension coordinate: time Data(time(12)) = [ 450\-11\-16 00:00:00, ..., 550\-10\-16 12:00:00] noleap calendar Bounds(time(12), 2) = [[ 450\-11\-01 00:00:00, ..., 550\-11\-01 00:00:00]] noleap calendar axis = 'T' standard_name = 'time' Dimension coordinate: latitude Data(latitude(64)) = [\-87.8638000488, ..., 87.8638000488] degrees_north Bounds(latitude(64), 2) = [[\-90.0, ..., 90.0]] degrees_north axis = 'Y' standard_name = 'latitude' Dimension coordinate: longitude Data(longitude(128)) = [0.0, ..., 357.1875] degrees_east Bounds(longitude(128), 2) = [[\-1.40625, ..., 358.59375]] degrees_east axis = 'X' standard_name = 'longitude' Dimension coordinate: height Data(height(1)) = [2.0] m axis = 'Z' positive = 'up' standard_name = 'height' .fi .PP In this case, the complete dump output by the .ft B \-c .ft P option would be the same as the long dump, since there are no fields contained in transforms nor ancillary variables. . . . .SH OPTIONS . . .TP .B \-a options, \-\-aggregate=options Configure the field aggregation process with the following options: .RS .TP .B 0 Do not aggregate fields. By default fields are aggregated if possible. . .TP .B contiguous Requires that aggregated fields have adjacent dimension coordinate cells which partially overlap or share common boundary values. Ignored if the dimension coordinates do not have bounds. .TP .B no_overlap Requires that aggregated fields have adjacent dimension coordinate cells which do not overlap (but they may share common boundary values). Ignored if the dimension coordinates do not have bounds. .TP .B equal_all Requires that aggregated fields have the same set of non\-standard CF properties (including long_name), with the same values. .TP .B exist_all Requires that aggregated fields have the same set of non\-standard CF properties (including long_name), but not requiring the values to be the same. .TP .B dimension=properties Create new dimensions for each input field which has one or more of the given properties. For each CF property in the colon (:) separated list of property names, if an input field has the property then, prior to aggregation, a new dimension is created with an auxiliary coordinate whose datum is the property's value and the property itself is deleted from that field. .TP .B no_strict_units Assume that fields or their components (such as coordinates) with the same identity but missing units all have equivalent (but unspecified) units, so that aggregation may occur. This is the default for input PP files, but not for other formats. .TP .B messages Print messages giving reasons why particular fields have not been aggregated. .TP Multiple options are separated by commas. For example: .PP .RS .nf \-a 0 \-a exist_all \-a contiguous,no_overlap,equal_all \-a messages,dimension=ensemble_member \-a dimension=ensemble_member:model,no_strict_units .fi .RE .RE . . .TP .B \-c, \-\-complete Output a complete dump. A field is described without abbreviation with the exception of data arrays, which are abbreviated to their first and last values. Fields contained in transforms and ancillary variables are given as long dumps (see the .ft B \-l .ft P option). . . .TP .B \-h, \-\-help Display the man page. . . .TP .B \-l, \-\-long Output a long dump. Differs from the complete dump (see the .ft B \-c .ft P option) only in that fields contained in transforms and ancillary variables are given as one\-line summaries (see the \-s option) rather than as long dumps. . . .TP .B \-r options, \-\-read=options Configure the file reading process with the following options: .RS .TP .B ignore_ioerror Ignore, without failing, any file which causes an I/O error whilst being read, as would be the case for an empty file, unknown file format, etc. By default, an error occurs and the return code is non\-zero. .TP .B umversion=version For PP format files only, the Unified Model (UM) version to be used when decoding the PP header. Valid versions are, for example, 4.2, 6.6.3 and 8.2. The default version is 4.5. The version is ignored if it can be inferred from the PP headers, which will generally be the case for files created at versions 5.3 and later. Note that the PP header can not encode tertiary version elements (such as the 3 in 6.6.3), so it may be necessary to provide a UM version in such cases. .PP .RS Ignored for files of any other format. .RE .TP Multiple options are separated by commas. For example: .PP .RS .nf \-r ignore_ioerror \-r umversion=5.1 \-r umversion=6.6.3,ignore_ioerror .fi .RE .RE . . .TP .B \-s, \-\-short Output a short, one\-line summary for each field. Each field is described by its identity, dimensionality and units. . . . .SH SEE ALSO ncdump(1), cfa(1) . . . .SH BUGS Reports of bugs are welcome at .ft I cfpython.bitbucket.org .ft P . . . .SH LICENSE Open Source Initiative MIT License . . .SH AUTHOR David Hassell cf-python-1.3.2/scripts/man1/cfa.10000600000175000017500000001516712247657377017010 0ustar daviddavid00000000000000.TH "CFA" "1" "Version 0.9.8" "06 December 2013" "cfa" . . . .SH NAME cfa \- create aggregated CF datasets . . . .SH SYNOPSIS cfa [\-a options] [\-d dir] [\-f format] [\-h] [\-o file] [\-r options] [\-v] [\-w options] [FILE] ... . . . .SH DESCRIPTION The cfa tool creates and writes to disk the CF fields contained in the input files. .PP The input files are treated as a single CF dataset following the aggregation rules currently documented in CF ticket #78 and written to a single file (see the .ft B \-o .ft P option), or each input file is aggregated separately and written to its own output file (see the .ft B \-d .ft P option). .PP . Accepts CF\-netCDF and CFA\-netCDF files (or URLs if DAP access is enabled) and Met Office (UK) PP format files as input. Multiple input files in a mixture of formats may be given and normal UNIX file globbing rules apply. For example: .PP .RS .nf cfa \-o out.nc file1.nc file2.nc cfa \-o out.nc file[1\-9].nc cfa \-f NETCDF3_CLASSIC \-o out.nc data1/*.nc data2/*.nc cfa \-f CFA \-o out.nca data[12]/*.nc cfa \-o out.nc test?a.pp cfa \-f CFA \-o out.nca test?a.pp fileb.nca cfa \-d /data/archive ../test*.pp cfa \-o out.nc file.nca cfa \-o out.nc file.nca file?.nc cfa \-o out.nc http://test.opendap.org/dap/coads_climatology.nc cfa \-o out.nc http://test.opendap.org/dap/coads_climatology.nc file*.nc .fi .RE .PP The output file, or files, are in CF\-netCDF or CFA\-netCDF format (see the .ft B \-f .ft P option). . . . .SH OPTIONS . . .TP .B \-a options, \-\-aggregate=options Configure the field aggregation process with the following options: .RS .TP .B 0 Do not aggregate fields. By default fields are aggregated if possible. . .TP .B contiguous Requires that aggregated fields have adjacent dimension coordinate cells which partially overlap or share common boundary values. Ignored if the dimension coordinates do not have bounds. .TP .B no_overlap Requires that aggregated fields have adjacent dimension coordinate cells which do not overlap (but they may share common boundary values). Ignored if the dimension coordinates do not have bounds. .TP .B equal_all Requires that aggregated fields have the same set of non\-standard CF properties (including long_name), with the same values. .TP .B exist_all Requires that aggregated fields have the same set of non\-standard CF properties (including long_name), but not requiring the values to be the same. .TP .B dimension=properties Create new dimensions for each input field which has one or more of the given properties. For each CF property in the colon (:) separated list of property names, if an input field has the property then, prior to aggregation, a new dimension is created with an auxiliary coordinate whose datum is the property's value and the property itself is deleted from that field. .TP .B no_strict_units Assume that fields or their components (such as coordinates) with the same identity but missing units all have equivalent (but unspecified) units, so that aggregation may occur. This is the default for input PP files, but not for other formats. .TP .B messages Print messages giving reasons why particular fields have not been aggregated. .TP Multiple options are separated by commas. For example: .PP .RS .nf \-a 0 \-a exist_all \-a contiguous,no_overlap,equal_all \-a messages,dimension=ensemble_member \-a dimension=ensemble_member:model,no_strict_units .fi .RE .RE . . .TP .B \-d dir, \-\-directory=dir Set the directory for the output files. In this case there will one output file per input file and there will be no inter\-file aggregation, but the contents of each file will be aggregated independently of the others. Output file names will be the same as their input counterparts, but with the suffix .nc or .nca for CF\-netCDF and CFA\-netCDF output formats respectively. . . .TP .B \-f format, \-\-format=format Set the format of the output file(s). Valid choices are NETCDF4, NETCDF4_CLASSIC, NETCDF3_64BIT and NETCDF3_CLASSIC for outputting CF\-netCDF files in those netCDF formats; or CFA for outputting CFA\-netCDF files (in NETCDF3_CLASSIC format). Note that the NETCDF3 and NETCDF4_CLASSIC formats may be slower than any of the other options. .PP .RS By default, NETCDF3_CLASSIC is assumed. .RE . . . .TP .B \-h, \-\-help Display the man page. . . .. .TP .B \-o outfile, \-\-outfile=file Set the output netCDF file name. In this case the CF fields from all input files are written to this file. . . .TP .B \-r options, \-\-read=options Configure the file reading process with the following options: .RS .TP .B ignore_ioerror Ignore, without failing, any file which causes an I/O error whilst being read, as would be the case for an empty file, unknown file format, etc. By default, an error occurs and the return code is non\-zero. .TP .B umversion=version . For PP format files only, the Unified Model (UM) version to be used when decoding the PP header. Valid versions are, for example, 4.2, 6.6.3 and 8.2. The default version is 4.5. The version is ignored if it can be inferred from the PP headers, which will generally be the case for files created at versions 5.3 and later. Note that the PP header can not encode tertiary version elements (such as the 3 in 6.6.3), so it may be necessary to provide a UM version in such cases. .PP .RS Ignored for input files of any other format. .RE .TP Multiple options are separated by commas. For example: .PP .RS .nf \-r ignore_ioerror \-r umversion=5.1 \-r umversion=6.6.3,ignore_ioerror .fi .RE .RE . . .TP .B \-v, \-\-verbose Display a one\-line summary of each output CF field. . . .TP .B \-w options, \-\-write=options .RS Configure the file writing process with the following options: .TP .B overwrite Allow pre\-existing output files to be overwritten. .TP .B base, base=value For output CFA\-netCDF files only. File names referenced by an output CFA\-netCDF file have relative, as opposed to absolute, paths or URL bases. This may be useful when relocating a CFA\-netCDF file together with the datasets referenced by it. .PP .RS If set with no value then file names are given relative to the directory or URL base containing the output CFA\-netCDF file. If set with a value then file names are given relative to the directory or URL base described by the value. By default, file names within CFA\-netCDF files are stored with absolute paths. .PP .RE .RS Ignored for output files of any other format. .RE .TP Multiple options are separated by commas. For example: .PP .RS .nf \-w overwrite \-w base=/data/archive \-w base=../archive,overwrite \-w base=$HOME \-w base .fi .RE .RE . . . .SH SEE ALSO cfdump(1) . . . .SH BUGS Reports of bugs are welcome at .ft I cfpython.bitbucket.org .ft P . . . .SH LICENSE Open Source Initiative MIT License . . . .SH AUTHOR David Hassell cf-python-1.3.2/scripts/cfa0000755000175000017500000010473512764320014016003 0ustar daviddavid00000000000000#!/usr/bin/python2 #-*-python-*- if __name__ == '__main__': from getopt import getopt, GetoptError import sys import os import cf from re import sub as re_sub def print_help(version, date): import subprocess manpage = '''\ .TH "CFA" "1" "{0}" "{1}" "cfa" . . . .SH NAME cfa \- create aggregated CF datasets . . . .SH SYNOPSIS . cfa [\-d dir] [\-f format] [\-h] [\-i] [\-n] [\-o file] [\-u] [\-v] [\-x] [OPTIONS] INPUTS . . .SH DESCRIPTION . . The cfa tool creates and writes to disk the CF fields contained in files contained in the .ft B INPUTS .ft P (which may include directories if the .ft B \-\-recursive .ft P option is set). Accepts CF\-netCDF and CFA\-netCDF files (or URLs if DAP access is enabled), Met Office (UK) PP files and Met Office (UK) fields files as input. Multiple input files in a mixture of formats may be given and normal UNIX file globbing rules apply. Output files are in CF\-netCDF or CFA\-netCDF format (see the .ft B \-f .ft P option). Both output types are available in netCDF3 and netCDF4 formats. Note that the netCDF3 formats are generally slower to write than the netCDF4 formats, by several orders of magnitude if files with many data variables are involved. However, not all software can read netCDF4, so it is advisable to check before writing in this format. By default the contents of each input file is aggregated (i.e. combined) into as few multi\-dimensional CF fields as possible. Unaggregatable fields in the input files may be omitted from the output (see the .ft B \-x .ft P option). Information on which fields are unaggregatable, and why, may be displayed (see the .ft B \-\-info .ft P option). All aggregation may be turned off with the .ft B \-n .ft P option, in which case all input fields are output without modification. See the AGGREGATION section for details on the aggregation process and unaggregatable fields. By default one output file is created per input file. In this case there is no inter\-file aggregation and the contents of each file is aggregated independently of the others. Output file names are created by removing the suffix \.pp, \.nc or \.nca, if there is one, from each input file name and then adding a new suffix of \.nc or \.nca for CF\-netCDF and CFA\-netCDF output formats respectively. If the .ft B \-d .ft P option is set then all output files will be written to the specified directory, otherwise each output file will be written to the same directory as its input file. Alternatively, all of the input files may be treated collectively as a single CF dataset and written to a single output file (see the .ft B \-o .ft P option). In this case aggregation is attempted within and between the input files. An error occurs if an output file has the same full name as any of the input files or any other output file. . . . . .SH AGGREGATION . . . Aggregation of input fields into as few multi\-dimensional CF fields as possible is carried out according to the aggregation rules documented in CF ticket #78 (http://kitt.llnl.gov/trac/ticket/78). For each input field, the aggregation process creates a .ft I structural signature .ft P which is essentially a subset of the metadata of the field, including coordinate metadata and other domain information, but which contains no data values. The structural signature accounts for the following standard CF properties: .RS add_offset, calendar, cell_methods, _FillValue, flag_masks, flag_meanings, flag_values, missing_value, scale_factor, standard_error_multiplier, standard_name, units, valid_max, valid_min, valid_range .RE Aggregation is then attempted on each group of fields with the same, well defined structural signature, and will succeed where the coordinate data values imply a safe combination into a single dataset. Not all fields are aggregatable. Unaggregatable fields are those without a well defined structural signature; or those with the same structural signature when at least two of them 1) can't be unambiguously distinguished by coordinates or other domain information or 2) contain coordinate reference fields or ancillary variable fields which themselves can't be unambiguously aggregated. . . . .SH EXAMPLES . . Create a new netCDF3 classic file containing the aggregatable fields in all of the input files: .RS cfa \-o newfile.nc *.nc .RE Create, in an existing directory and overwriting any exisiting files, new netCDF3 classic files containing the aggregatable fields in each input file: .RS cfa \-d directory \-\-overwrite *.pp .RE Create a new netCDF4 file containing all fields in all of the input files: .RS cfa \-f NETCDF4 \-o newfile.nc *.nc .RE Create a new CFA-netCDF4 file containing all fields in all of the input files and allow long names or netCDF variable names to identify fields and their components: .RS cfa \-i \-f CFA4 \-o newfile.nc *.nc .RE . . . .SH OPTIONS . . . .TP .B \-\-axis=property Aggregation configuration: Create a new axis for each input field which has given property. If an input field has the property then, prior to aggregation, a new axis is created with an auxiliary coordinate whose data array is the property's value. This allows for the possibility of aggregation along the new axis. The property itself is deleted from that field. No axis is created for input fields which do not have the specified property. Multiple axes may be created by specifying more than one .ft B \-\-axis .ft P option. For example, if you wish to aggregate an ensemble of model experiments that are distinguished by the source property, you can use .ft B \-\-axis=source .ft P to create an ensemble axis which has an auxiliary coordinate variable containing the source property values. . . .TP .B \-\-cfa_base=[value] For output CFA\-netCDF files only. File names referenced by an output CFA\-netCDF file have relative, as opposed to absolute, paths or URL bases. This may be useful when relocating a CFA\-netCDF file together with the datasets referenced by it. .PP .RS If set with no value (\-\-cfa_base=) or the value is empty then file names are given relative to the directory or URL base containing the output CFA\-netCDF file. If set with a non\-empty value then file names are given relative to the directory or URL base described by the value. .PP By default, file names within CFA\-netCDF files are stored with absolute paths. Ignored for output files of any other format. .RE .RE . . .TP .B \-\-compress=N Regulate the speed and efficiency of compression. Must be an integer between 0 and 9. By default N is 0, meaning no compression; 1 is the fastest, but has the lowest compression ratio; 9 is the slowest but best compression ratio. . . .TP .B \-\-contiguous Aggregation configuration: Requires that aggregated fields have adjacent dimension coordinate cells which partially overlap or share common boundary values. Ignored if the dimension coordinates do not have bounds. . . .TP .B \-d dir, \-\-directory=dir Specify the output directory for all output files. . . .TP .B \-\-double Write 32-bit floats as 64-bit floats and 32-bit integers as 64-bit integers. By default, input data types are preserved. . . .TP .B \-\-equal=property Aggregation configuration: Require that an input field may only be aggregated with other fields if they all have the given CF property (standard or non-standard) with equal values. Ignored for any input field which does not have this property, or if the property is already accounted for in the structural signature. Supersedes the behaviour for the given property that may be implied by the .ft B \-\-exist_all .ft P option. Multiple properties may be set by specifying more than one .ft B \-\-equal .ft P option. . . .TP .B \-\-equal_all Aggregation configuration: Require that an input field may only be aggregated with other fields that have the same set of CF properties (excluding those already accounted for in the structural signature) with equal sets of values. The behaviour for individual properties may be overridden by the .ft B \-\-exist \-\-ignore .ft P options. For example, to insist that a group of aggregated input fields must all have the same CF properties (other than those accounted for in the structural signature) with matching values, but allowing the long_name properties have unequal values, you can use .ft B \-\-equal_all \-\-exist=long_name .ft P . . .TP .B \-\-exist=property Aggregation configuration: Require that an input field may only be aggregated with other fields if they all have the given CF property (standard or non-standard), but not requiring the values to be the same. Ignored for any input field which does not have this property, or if the property is already accounted for in the structural signature. Supersedes the behaviour for the given property that may be implied by the .ft B \-\-equal_all .ft P option. Multiple properties may be set by specifying more than one .ft B \-\-exist .ft P option. . . .TP .B \-\-exist_all Aggregation configuration: Require that an input field may only be aggregated with other fields that have the same set of CF properties (excluding those already accounted for in the structural signature), but not requiring the values to be the same. The behaviour for individual properties may be overridden by the .ft B \-\-equal \-\-ignore .ft P options. For example, to insist that a group of aggregated input fields must all have the same CF properties (other than those accounted for in the structural signature), regardless of their values, but also insisting that the long_name properties have equal values, you can use .ft B \-\-exist_all \-\-equal=long_name .ft P . . .TP .B \-f format, \-\-format=format Set the format of the output file(s). Valid choices are NETCDF3_CLASSIC, NETCDF3_64BIT, NETCDF4, NETCDF4_CLASSIC and NETCDF3_64BIT for outputting CF\-netCDF files in those netCDF formats and CFA3 or CFA4 for outputting CFA\-netCDF files in NETCDF3_CLASSIC or NETCDF4 formats respectively. By default, NETCDF3_CLASSIC is assumed. .PP .RS Note that the netCDF3 formats are generally slower to write than the netCDF4 formats, by several orders of magnitude if files with many data variables are involved. However, not all software can read netCDF4, so it is advisable to check before writing in this format. .RE . . .TP .B \-h, \-\-help Display this man page. . . .TP .B \-i, \-\-relaxed_identities Aggregation configuration: In the absence of standard names, allow fields and their components (such as coordinates) to be identified by their long_name CF properties or else their netCDF file variable names. . . .TP .B \-\-ignore=property Aggregation configuration: An input field may be aggregated with other fields regardless of whether or not they have the given CF property (standard or non-standard) and regardless of its values. Ignored for any input field which does not have this property, or if the property is already accounted for in the structural signature. This is the default behaviour in the absence of all the .ft B \-\-exist \-\-equal \-\-exist_all \-\-equal_all .ft P options and supersedes the behaviour for the given property that may be implied if any of these options are set. Multiple properties may be set by specifying more than one .ft B \-\-ignore .ft P option. For example, to insist that a group of aggregated input fields must all have the same CF properties (other than those accounted for in the structural signature) with the same values, but with no restrictions on the existence or values of the long_name property you can use .ft B \-\-equal_all \-\-ignore=long_name .ft P . . .TP .B \-\-fletcher32 Activate the Fletcher-32 HDF5 checksum algorithm to detect compression errors. Ignored if there is no compression (see the .ft B \-\-compress .ft P option). . . .TP .B \-\-follow_symlinks In combination with .ft B \-\-recursive .ft P also search for files in directories which resolve to symbolic links. Files specified by the .ft B INPUTS .ft P which are symbolic links are always followed. Note that setting .ft B \-\-recursive --follow_symlinks .ft P can lead to infinite recursion if a directory which resolves to a symbolic link points to a parent directory of itself. . . .TP .B \-\-ignore_read_error Ignore, without failing, any input file which causes an error whilst being read, as would be the case for an empty file, unknown file format, etc. By default an error occurs in this case. . . .TP .B \-\-info=N Aggregation configuration: Print information about the aggregation process. If N is 0 then no information is displayed. If N is 1 or more then display information on which fields are unaggregatable, and why. If N is 2 or more then display the field structural signatures and, when there is more than one field with the same structural signature, their canonical first and last coordinate values. If N is 3 or more then display the field complete aggregation metadata. By default N is 0. . . .TP .B \-\-least_sig_digit=N Truncate the input field data arrays. For a positive integer N the precision that is retained in the compressed data is '10 to the power -N'. For example, if N is 2 then a precision of 0.01 is retained. In conjunction with compression this produces 'lossy', but significantly more efficient compression (see the .ft B \-\-compress .ft P option). . . .TP .B \-\-ncvar_identities Aggregation configuration: Force fields and their components (such as coordinates) to be identified by their netCDF file variable names. . . .TP .B \-n, \-\-no_aggregation Aggregation configuration: Do not aggregate fields. Writes the input fields as they exist in the input files. . . .TP .B \-\-no_overlap Aggregation configuration: Requires that aggregated fields have adjacent dimension coordinate cells which do not overlap (but they may share common boundary values). Ignored if the dimension coordinates do not have bounds. . . .TP .B \-\-no_shuffle Turn off the HDF5 shuffle filter, which de-interlaces a block of data before compression by reordering the bytes by storing the first byte of all of a variable's values in the chunk contiguously, followed by all the second bytes, and so on. By default the filter is applied because if the data array values are not all wildly different, using the filter can make the data more easily compressible. Ignored if there is no compression (see the .ft B \-\-compress .ft P option). . . .TP .B \-o file, \-\-outfile=file Treat all input files collectively as a single CF dataset. In this case aggregation is attempted within and between the input files and all outputs are written to the specified file. . . .TP .B \-\-overwrite Allow pre\-existing output files to be overwritten. . . .TP .B \-\-promote=component Promote field components to independent top-level fields. If component is ancillary then ancillary data fields are promoted. If component is auxiliary then auxiliary coordinate variables are promoted. If component is measure then cell meausure variables are promoted. If component is reference then fields pointed to from formula_terms attributes are promoted. If component is field then all component fields are promoted. Multiple conponent types may be promoted by specifying more than one .ft B \-\-promote .ft P option. For example, promote to ancillary data field and cell measure variables to independent, top-level fields you can use .ft B \-\-promote=ancillary --promote=measure .ft P . . .TP .B \-\-recursive Allow directories to be specified by the .ft B INPUTS .ft P and recursively search the directories for actual files to read. Set the .ft B \-\-ignore_read_error .ft P option to bypass any unreadable files and the .ft B \-\-follow_symlinks .ft P option to allow directories to be symbolic links. . . .TP .B \-\-reference_datetime=datetime Set the reference date-time of time coordinate units to an ISO 8601-like date-time. Changing the reference date-time does not change the absolute date-times of the coordinates. Ignored for non-reference date-time coordinates. Some examples of valid date-times: 1830-12-1, "1830-12-09 2:34:45Z". . . .TP .B \-\-respect_valid Aggregation configuration: Take into account the CF properties valid_max, valid_min and valid_range during aggregation. By default they are ignored for the purposes of aggregation and deleted from any aggregated output CF fields. . . .TP .B \-\-shared_nc_domain Aggregation configuration: Match axes between a field and its contained ancillary variable and coordinate reference fields via their netCDF dimension names and not via their domains. . . .TP .B \-\-single Write 64-bit floats as 32-bit floats and 64-bit integers as 32-bit integers. By default, input data types are preserved. . . .TP .B \-\-squeeze Remove size 1 axes from the output field data arrays. If a size one axis has any one dimensional coordinates then these are converted to CF scalar coordinates. . . .TP .B \-u, \-\-relaxed_units Aggregation configuration: Assume that fields or their components (such as coordinates) with the same standard name (or other identifiers, see the .ft B \-i .ft P option) but missing units all have equivalent (but unspecified) units, so that aggregation may occur. This is the default for Met Office (UK) PP files and Met Office (UK) fields files, but not for other formats. . . .TP .B \-\-unsqueeze Include size 1 axes in the output field data arrays. If a size one axis has any CF scalar coordinates then these are converted to one dimensional coordinates. . . .TP .B \-\-um_version=version For Met Office (UK) PP files and Met Office (UK) fields files only, the Unified Model (UM) version to be used when decoding the header. Valid versions are, for example, 4.2, 6.6.3 and 8.2. The default version is 4.5. In general, the given version is ignored if it can be inferred from the header (which is usually the case for files created by the UM at versions 5.3 and later). The exception to this is when the given version has a third element (such as the 3 in 6.6.3), in which case any version in the header is ignored. This option is ignored for input files which are not Met Office (UK) PP files or Met Office (UK) fields files. . . .TP .B \-\-unlimited=axis Create an unlimited dimension (a dimension that can be appended to). A dimension is identified by either a standard name; one of T, Z, Y, X denoting time, height or horixontal axes (as defined by the CF conventions); or the value of an arbitrary CF property preceeded by the property name and a colon. For example: Multiple unlimited axes may be defined by specifying more than one .ft B \-\-unlimited .ft P option. Note, however, that only netCDF4 formats support multiple unlimited dimensions. For example, to set the time and Z dimensions to be unlimited you could use .ft B \-\-unlimited=time \-\-unlimited=Z .ft P An example of defining an axis by an arbitrary CF property could be .ft B \-\-unlimited=long_name:pseudo_level .ft P . . .TP .B \-v, \-\-verbose Display a one\-line summary of each output CF field. . . .TP .B \-x, \-\-exclude Aggregation configuration: Omit unaggregatable fields from the output. Ignored if the .ft B \-n .ft P option is set. See the AGGREGATION section for the definition of an unaggregatable field. . . . .SH SEE ALSO cfdump(1) . . . .SH LIBRARY cf\-python library version {0} at {2} . . . .SH BUGS Reports of bugs are welcome at http://cfpython.bitbucket.org/ . . . .SH LICENSE Open Source Initiative MIT License . . . .SH AUTHOR David Hassell '''.format(version, date, os.path.dirname(os.path.abspath(cf.__file__))) p = subprocess.Popen(['man', '-r', ' Manual page cfa(1)\ ?ltline\ %lt?L/%L.:', '-l', '-'], stdin=subprocess.PIPE) p.communicate(manpage) #---- End: def def _check_overwrite(outfile, files, overwrite): ''' ''' if not os.path.isfile(outfile): return if not overwrite: print( "{0} ERROR: Can't overwrite output file {1} unless --overwrite is set".format( iam, outfile)) sys.exit(2) if not os.access(outfile, os.W_OK): print( "{0} ERROR: Can't overwrite output file {1} without permission".format(iam, outfile)) sys.exit(2) if set((outfile,)).intersection(files): print( "{0} ERROR: Can't overwrite input file {1}".format(iam, outfile)) sys.exit(2) # Remove the pre-existing output file os.remove(outfile) #--- End: def iam = os.path.basename(sys.argv[0]) usage = "USAGE: {0} [-d dir] [-f format] [-h] [-i] [-n] [-o file] [-u] [-v] [-x] [OPTIONS] INPUTS".format(iam) short_description = '''\ The cfa tool creates and writes to disk the CF fields contained in the input files. By default each input file is treated as a single CF dataset following the aggregation rules currently documented in CF ticket #78. Accepts CF-netCDF and CFA-netCDF files (or URLs if DAP access is enabled), Met Office (UK) PP files and Met Office (UK) fields files as input. Outputs CF-netCDF or CFA-netCDF format files. ''' short_help = '''\ {0} [-d dir] Directory for output files [-f format] Set the output file format [-h] Display the full man page [-i] Configure field aggregation [-n] Do not aggregate fields [-o file] Output all fields to a single file [-u] Configure field aggregation [-v] Display a summary of each output field [-x] Do not output unaggregatable fields [--ignore_read_error] Ignore bad input files [--recursive] Recursively search input directories for files [--follow_symlinks] Allow input directories which are symbolic links [--squeeze] Remove size 1 axes from output field data arrays [--unsqueeze] Include size 1 axes in output field data arrays [--promote] Promote components to top-level fields [--um_version] UM version for decoding PP and fields files [--reference_datetime] Override coordinate reference date-times [--overwrite] Overwrite pre-existing output files [--unlimited=axis Create an unlimited dimension [--cfa_base=[value]] Configure CFA-netCDF output files [--single] Write out as single precision [--double] Write out as double precision [--compress=N] Compress the output data [--least_sig_digit=N] Truncate output data arrays [--no_shuffle] Turn off the HDF5 shuffle filter [--fletcher32] Turn on the Fletcher32 HDF5 checksum algorithm [--info=N] Display information about field aggregation [--axis=property] Configure field aggregation [--equal=property] Configure field aggregation [--ignore=property] Configure field aggregation [--exist=property] Configure field aggregation [--equal_all] Configure field aggregation [--exist_all] Configure field aggregation [--contiguous] Configure field aggregation [--ncvar_identitites] Configure field aggregation [--no_overlap] Configure field aggregation [--respect_valid] Configure field aggregation [--shared_nc_domain] Configure field aggregation INPUTS Input files and directories Using cf-python library version {1} at {2}'''.format( usage, cf.__version__, os.path.dirname(os.path.abspath(cf.__file__))) # -------------------------------------------------------------------- # Parse command line options # -------------------------------------------------------------------- try: opts, infiles = getopt(sys.argv[1:], "ad:ef:hino:r:uvx:", longopts=['axis=', 'cfa_base=', 'compress=', 'contiguous', 'directory=', 'double', 'equal=', 'equal_all', 'exclude=', 'exist=', 'exist_all', 'fletcher32', 'follow_symlinks', 'format=', 'help', 'ignore=', 'ignore_read_error', 'info=', 'least_sig_digit=', 'ncvar_identities', 'no_aggregation', 'no_overlap', 'no_shuffle', 'outfile=', 'overwrite', 'promote=', 'recursive', 'reference_datetime=', 'relaxed_identities', 'relaxed_units', 'respect_valid', 'single', 'shared_nc_domain', 'squeeze', 'unlimited=', 'um_version=', 'unsqueeze', 'verbose', # Deprecated options 'all', 'aggregate=', 'read=', 'write=', ]) except GetoptError, err: # print help information and exit: print "{0} ERROR: {1}".format(iam, str(err)) print short_help sys.exit(2) if not (infiles or opts): print short_description, '\n', short_help sys.exit(0) #--- End: if # Defaults fmt = 'NETCDF3_CLASSIC' one_to_one = True exclude = False # By default unaggregatable fields are output no_aggregation = False # By default fields are aggregated overwrite = False # By default existing output files are not overwritten directory = None outfile = None info = 0 # By default no info is printed to STDOUT axes = [] equal = [] exist = [] ignore = [] promote = [] unlimited = [] aggregate_options = {} read_options = {} write_options = {} for option, arg in opts: if option in ('-h', '--help'): print_help(cf.__version__, cf.__date__) sys.exit(0) elif option in ('-o', '--outfile'): outfile = arg one_to_one = False elif option in ('-f', '--format'): fmt = arg elif option in ('-d', '--directory'): directory = arg elif option == '--axis': axes.append(arg) elif option == '--overwrite': overwrite = True elif option == '--info': info = int(arg) elif option in ('-x', '--exclude'): exclude = True elif option == '--contiguous': aggregate_options['contiguous'] = True elif option == '--equal': equal.append(arg) elif option == '--exist': exist.append(arg) elif option == '--ignore': ignore.append(arg) elif option == '--promote': promote.append(arg) elif option == '--equal_all': aggregate_options['equal_all'] = True elif option == '--exist_all': aggregate_options['exist_all'] = True elif option == '--no_overlap': aggregate_options['no_overlap'] = True elif option in ('-i', '--relaxed_identities'): aggregate_options['relaxed_identities'] = True elif option in ('-u', '--relaxed_units'): aggregate_options['relaxed_units'] = True elif option == '--respect_valid': aggregate_options['respect_valid'] = True elif option == '--ncvar_identities': aggregate_options['ncvar_identities'] = True elif option == '--shared_nc_domain': aggregate_options['shared_nc_domain'] = True elif option == '--unsqueeze': read_options['unsqueeze'] = True elif option == '--recursive': read_options['recursive'] = True elif option == '--follow_symlinks': read_options['follow_symlinks'] = True elif option in ('-n', '--no_aggregation'): no_aggregation = True elif option == '--squeeze': read_options['squeeze'] = True elif option == '--um_version': read_options['umversion'] = arg elif option == '--ignore_read_error': read_options['ignore_read_error'] = True elif option == '--reference_datetime': write_options['reference_datetime'] = arg elif option == '--compress': write_options['compress'] = int(arg) elif option == '--no_shuffle': write_options['no_shuffle'] = True elif option == '--fletcher32': write_options['fletcher32'] = True elif option == '--least_sig_digit': write_options['least_significant_digit'] = int(arg) elif option == '--single': write_options['single'] = True elif option == '--double': write_options['double'] = True elif option == '--cfa_base': write_options['cfa_options'] = {'base': arg} elif option == '--unlimited': unlimited.append(arg) elif option in ('-v', '--verbose'): write_options['verbose'] = True elif option in ('-a', '--all'): print( "{0} ERROR: The {1} option has been deprecated and is now the default behaviour. See the -x option.".format( iam, option)) sys.exit(2) elif option in ('-r', '-w', '--aggregate', '--read', '--write'): print( "{0} ERROR: The {1} option has been deprecated. See {0} -h.".format(iam, option)) sys.exit(2) else: print usage assert False, "Unknown option: "+option #--- End: for if promote: read_options['promote'] = promote if no_aggregation: read_options['aggregate'] = False else: aggregate_options['info'] = info aggregate_options['exclude'] = exclude if axes: aggregate_options['dimension'] = axes if equal: aggregate_options['equal'] = equal if exist: aggregate_options['exist'] = exist if ignore: aggregate_options['ignore'] = ignore if aggregate_options: read_options['aggregate'] = aggregate_options read_options['aggregate'] = aggregate_options #--- End: if write_options['fmt'] = fmt if unlimited: write_options['unlimited'] = unlimited if fmt == 'CFA': print iam,\ "ERROR: '-f CFA' has beed replaced by '-f CFA3' or '-f CFA4' \ for netCDF3 classic and netCDF4 CFA output formats respectively" sys.exit(2) if not infiles: print iam, "ERROR: Must provide at least one input file" print short_help sys.exit(2) if outfile is not None and directory is not None: print iam, "ERROR: Can't set the -o option and the -d option" sys.exit(2) if directory is not None: # Check that the directory is ok and replace it with its # absolute, normalised path. if (not os.path.isdir(directory) or not os.access(directory, os.W_OK)): print( "{0} ERROR: Can't write to output directory {1}".format(iam, directory)) sys.exit(2) #--- End: if directory = cf.abspath(directory) #--- End: if # Replace the input files with their absolute, normalised paths # and recursively scan input directories recursive = read_options.get('recursive', False) follow_symlinks = read_options.get('follow_symlinks', False) if follow_symlinks and not recursive: print( "{0} ERROR: Can't set --follow_symlinks without setting --recursive".format(iam)) sys.exit(2) infiles2 = [] for x in (cf.abspath(f) for f in infiles): if not os.path.isdir(x): infiles2.append(x) elif not recursive: print( "{0} ERROR: Can't read directory {1} unless --recursive is set".format(iam, x)) sys.exit(2) else: # Recursively walk through directories for path, subdirs, filenames in os.walk(x, followlinks=follow_symlinks): infiles2.extend([os.path.join(path, f) for f in filenames]) #--- End: for infiles = infiles2 # Initialise the set of all input and output files files = set(infiles) if outfile is not None: outfile = cf.abspath(outfile) infiles = (infiles,) status = 0 if not one_to_one: _check_overwrite(outfile, infiles[0], overwrite) for infile in infiles: # ------------------------------------------------------------ # Find the output file name, if required, and check that it # can be created. # ------------------------------------------------------------ if one_to_one: outfile = re_sub('(\.pp|\.nc|\.nca)$', '.nc', infile) if fmt in ('CFA3', 'CFA4'): outfile += 'a' if directory is not None: outfile = cf.pathjoin(directory, os.path.basename(outfile)) _check_overwrite(outfile, files, overwrite) files.add(outfile) #--- End: if # -------------------------------------------------------------------- # Read # -------------------------------------------------------------------- try: f = cf.read(infile, **read_options) except Exception as error: print iam, "ERROR reading file:", error sys.exit(1) else: status |= cf.aggregate.status # ------------------------------------------------------------ # Write # ------------------------------------------------------------ if one_to_one and write_options.get('verbose', False) and f: print '\nOUTPUT FILE:', outfile try: cf.write(f, outfile, **write_options) except Exception as error: print iam, "ERROR writing file:", error sys.exit(1) #--- End: for cf-python-1.3.2/scripts/cfdump0000755000175000017500000007277712752572327016557 0ustar daviddavid00000000000000#!/usr/bin/python2 #-*-python-*- if __name__ == '__main__': import getopt import sys import os import cf def print_help(version, date): import subprocess manpage = '''\ .TH "CFDUMP" "1" "%s" "%s" "cfdump" . . . .SH NAME cfdump \- view CF fields . . . .SH SYNOPSIS . cfdump [\-1] [\-c] [\-h] [\-i] [\-l] [\-n] [\-s] [\-u] [\-x] [OPTIONS] INPUTS . . . .SH DESCRIPTION . . . The cfdump tool generates text representations on standard output of the CF fields contained in the .ft B INPUTS .ft P (which may include directories if the .ft B \-\-recursive .ft P option is set). Accepts CF\-netCDF and CFA\-netCDF files (or URLs if DAP access is enabled), Met Office (UK) PP files and Met Office (UK) fields files as input. Multiple input files in a mixture of formats may be given and normal UNIX file globbing rules apply. By default the contents of each input file is aggregated (i.e. combined) into as few multi\-dimensional CF fields as possible. Unaggregatable fields in the input files may be omitted from the output (see the .ft B \-x .ft P option). Information on which fields are unaggregatable, and why, may be displayed (see the .ft B \-\-info .ft P option). All aggregation may be turned off with the .ft B \-n .ft P option, in which case all input fields are output without modification. See the AGGREGATION section for details on the aggregation process and unaggregatable fields. By default each input file is treated separately. In this case there is no inter\-file aggregation, but the contents of each file is aggregated independently of the others. Alternatively, all of the input files may be treated collectively as a single CF dataset (see the .ft B \-1 .ft P option). In this case aggregation is attempted within and between the input files. In the displayed output, each component of a field is assigned one of the following roles as defined by the CF data model: .PP .RS .nf Field Axis Cell method Dimension coordinate Auxiliary coordinate Cell measure Coordinate reference .fi .RE .PP A field and its components are identified, where appropriate, by their standard names if available, or their long names. If neither is present then a netCDF variable name is used. Long names and netCDF variable names are preceded by long_name: and ncvar: respectively. Axis identities are inferred from the coordinates which span them. .PP Each data array of a field and its components is described by its dimensionality, units and (depending on the extent of the output requested) its first and last values. For longer and complete outputs, arrays containing coordinate bounds are given in the same way and included as part of their coordinates' descriptions. . . . .SH AGGREGATION . . . Aggregation of input fields into as few multi\-dimensional CF fields as possible is carried out according to the aggregation rules documented in CF ticket #78 (http://kitt.llnl.gov/trac/ticket/78). For each input field, the aggregation process creates a .ft I structural signature .ft P which is essentially a subset of the metadata of the field, including coordinate metadata and other domain information, but which contains no data values. The structural signature accounts for the following standard CF properties: .RS add_offset, calendar, cell_methods, _FillValue, flag_masks, flag_meanings, flag_values, missing_value, scale_factor, standard_error_multiplier, standard_name, units, valid_max, valid_min, valid_range .RE Aggregation is then attempted on each group of fields with the same, well defined structural signature, and will succeed where the coordinate data values imply a safe combination into a single dataset. Not all fields are aggregatable. Unaggregatable fields are those without a well defined structural signature; or those with the same structural signature when at least two of them 1) can't be unambiguously distinguished by coordinates or other domain information or 2) contain coordinate reference fields or ancillary variable fields which themselves can't be unambiguously aggregated. . . . .SH EXAMPLES . . . In these examples, a complete dataset has been split across two files (file1.nc and file2.nc). These may be passed to cfdump which can return a description of the recombined, aggregated field. The .ft B \-1 .ft P option is necessary here so that the two input files are treated as parts of the same dataset. The .ft B \-s .ft P option displays the short, one\-line output, which gives the identity of the field (air_temperature), the identities and sizes of its data array dimensions (time, latitude and longitude with sizes 1200, 64 and 128 respectively) and the units of the field's data array (K): .nf $ cfdump \-1s file1.nc file2.nc .fi .PP The default summary gives the same information as the the one\-line output, along with short descriptions of the field's other components: .PP .nf $ cfdump \-1 file[12].nc air_temperature field summary ----------------------------- Data : air_temperature(time(1200), latitude(64), longitude(128)) K Cell methods : time: mean (interval: 1.0 month) Axes : time(12) = [ 450\-11\-16 00:00:00, ..., 550\-10\-16 12:00:00] noleap calendar : latitude(64) = [\-87.8638000488, ..., 87.8638000488] degrees_north : longitude(128) = [0.0, ..., 357.1875] degrees_east : height(1) = [2.0] m .fi This shows that the aggregated field has a cell method and four dimension coordinates, one of which (height) is a coordinate for a size 1 dimension that is not a dimension of the field's data array. The units and first and last values of the coordinates' data arrays are given and relative time values are translated into strings. The .ft B \-l .ft P option displays the long output, which includes each component's properties, as well as the first and last values of the field's data array: .nf $ cfdump \-1l file[1\-2].nc ====================== Field: air_temperature ====================== Axes height(1) latitude(64) longitude(128) time(12) Data(time(12), latitude(64), longitude(128)) = [[[236.512756348, ..., 256.93371582]]] K cell_methods = time: mean (interval: 1.0 month) experiment_id = 'pre\-industrial control experiment' long_name = 'air_temperature' missing_value = 1e+20 standard_name = 'air_temperature' Dimension coordinate: time Data(time(12)) = [ 450\-11\-16 00:00:00, ..., 550\-10\-16 12:00:00] noleap calendar Bounds(time(12), 2) = [[ 450\-11\-01 00:00:00, ..., 550\-11\-01 00:00:00]] noleap calendar axis = 'T' standard_name = 'time' Dimension coordinate: latitude Data(latitude(64)) = [\-87.8638000488, ..., 87.8638000488] degrees_north Bounds(latitude(64), 2) = [[\-90.0, ..., 90.0]] degrees_north axis = 'Y' standard_name = 'latitude' Dimension coordinate: longitude Data(longitude(128)) = [0.0, ..., 357.1875] degrees_east Bounds(longitude(128), 2) = [[\-1.40625, ..., 358.59375]] degrees_east axis = 'X' standard_name = 'longitude' Dimension coordinate: height Data(height(1)) = [2.0] m axis = 'Z' positive = 'up' standard_name = 'height' .fi .PP In this case, the complete output using the .ft B \-c .ft P option would be the same as the long output, since there are no fields contained in coordinate references nor ancillary variables. . . . .SH OPTIONS . . . .TP .B \-1, \-\-one Treat all input files collectively as a single CF dataset. In this case aggregation is attempted within and between the input files. . . .TP .B \-\-axis=property Aggregation configuration: Create a new axis for each input field which has given property. If an input field has the property then, prior to aggregation, a new axis is created with an auxiliary coordinate whose data array is the property's value. This allows for the possibility of aggregation along the new axis. The property itself is deleted from that field. No axis is created for input fields which do not have the specified property. Multiple axes may be created by specifying more than one .ft B \-\-axis .ft P option. For example, if you wish to aggregate an ensemble of model experiments that are distinguished by the source property, you can use .ft B \-\-axis=source .ft P to create an ensemble axis which has an auxiliary coordinate variable containing the source property values. . . .TP .B \-c, \-\-complete Display complete outputs. Fields are described without abbreviation with the exception of data arrays, which are abbreviated to their first and last values. Fields contained in transforms and ancillary variables are given as long outputs (see the .ft B \-l .ft P option). . . .TP .B \-\-contiguous Aggregation configuration: Requires that aggregated fields have adjacent dimension coordinate cells which partially overlap or share common boundary values. Ignored if the dimension coordinates do not have bounds. . . .TP .B \-\-equal=property Aggregation configuration: Require that an input field may only be aggregated with other fields if they all have the given CF property (standard or non-standard) with equal values. Ignored for any input field which does not have this property, or if the property is already accounted for in the structural signature. Supersedes the behaviour for the given property that may be implied by the .ft B \-\-exist_all .ft P option. Multiple properties may be set by specifying more than one .ft B \-\-equal .ft P option. . . .TP .B \-\-equal_all Aggregation configuration: Require that an input field may only be aggregated with other fields that have the same set of CF properties (excluding those already accounted for in the structural signature) with equal sets of values. The behaviour for individual properties may be overridden by the .ft B \-\-exist \-\-ignore .ft P options. For example, to insist that a group of aggregated input fields must all have the same CF properties (other than those accounted for in the structural signature) with matching values, but allowing the long_name properties have unequal values, you can use .ft B \-\-equal_all \-\-exist=long_name .ft P . . .TP .B \-\-exist=property Aggregation configuration: Require that an input field may only be aggregated with other fields if they all have the given CF property (standard or non-standard), but not requiring the values to be the same. Ignored for any input field which does not have this property, or if the property is already accounted for in the structural signature. Supersedes the behaviour for the given property that may be implied by the .ft B \-\-equal_all .ft P option. Multiple properties may be set by specifying more than one .ft B \-\-exist .ft P option. . . .TP .B \-\-exist_all Aggregation configuration: Require that an input field may only be aggregated with other fields that have the same set of CF properties (excluding those already accounted for in the structural signature), but not requiring the values to be the same. The behaviour for individual properties may be overridden by the .ft B \-\-equal \-\-ignore .ft P options. For example, to insist that a group of aggregated input fields must all have the same CF properties (other than those accounted for in the structural signature), regardless of their values, but also insisting that the long_name properties have equal values, you can use .ft B \-\-exist_all \-\-equal=long_name .ft P . . .TP .B \-\-follow_symlinks In combination with .ft B \-\-recursive .ft P also search for files in directories which resolve to symbolic links. Files specified by the .ft B INPUTS .ft P which are symbolic links are always followed. Note that setting .ft B \-\-recursive --follow_symlinks .ft P can lead to infinite recursion if a directory which resolves to a symbolic link points to a parent directory of itself. . . .TP .B \-h, \-\-help Display this man page. . . .TP .B \-i, \-\-relaxed_identities Aggregation configuration: In the absence of standard names, allow fields and their components (such as coordinates) to be identified by their long_name CF properties or else their netCDF file variable names. . . .TP .B \-\-ignore=property Aggregation configuration: An input field may be aggregated with other fields regardless of whether or not they have the given CF property (standard or non-standard) and regardless of its values. Ignored for any input field which does not have this property, or if the property is already accounted for in the structural signature. This is the default behaviour in the absence of all the .ft B \-\-exist \-\-equal \-\-exist_all \-\-equal_all .ft P options and supersedes the behaviour for the given property that may be implied if any of these options are set. Multiple properties may be set by specifying more than one .ft B \-\-ignore .ft P option. For example, to insist that a group of aggregated input fields must all have the same CF properties (other than those accounted for in the structural signature) with the same values, but with no restrictions on the existence or values of the long_name property you can use .ft B \-\-equal_all \-\-ignore=long_name .ft P . . .TP .B \-\-ignore_read_error Ignore, without failing, any file which causes an error whilst being read, as would be the case for an empty file, unknown file format, etc. By default, an error occurs and the return code is non\-zero. . . .TP .B \-\-info=N Print information about the aggregation process. If N is 0 then no information is displayed. If N is 1 or more then display information on which fields are unaggregatable, and why. If N is 2 or more then display the field structural signatures and, when there is more than one field with the same structural signature, their canonical first and last coordinate values. If N is 3 or more then display the field complete aggregation metadata. By default N is 1. . . .TP .B \-l, \-\-long Display long outputs. Differs from the complete output (see the .ft B \-c .ft P option) only in that fields contained in transforms and ancillary variables are given as one\-line summaries (see the .ft B \-s .ft P option) rather than as long outputs. . . .TP .B \-\-ncvar_identities Aggregation configuration: Force fields and their components (such as coordinates) to be identified by their netCDF file variable names. . . .TP .B \-n, \-\-no_aggregation Aggregation configuration: Do not aggregate fields. Displays the input fields as they exist in the input files. . . .TP .B \-\-no_overlap Aggregation configuration: Requires that aggregated fields have adjacent dimension coordinate cells which do not overlap (but they may share common boundary values). Ignored if the dimension coordinates do not have bounds. . . .TP .B \-\-promote=component Promote field components to independent top-level fields. If component is ancillary then ancillary data fields are promoted. If component is auxiliary then auxiliary coordinate variables are promoted. If component is measure then cell meausure variables are promoted. If component is reference then fields pointed to from formula_terms attributes are promoted. If component is field then all component fields are promoted. Multiple conponent types may be promoted by specifying more than one .ft B \-\-promote .ft P option. For example, promote ancillary data field and cell measure variables to independent, top-level fields you can use .ft B \-\-promote=ancillary --promote=measure .ft P . . .TP .B \-\-respect_valid Aggregation configuration: Take into account the CF properties valid_max, valid_min and valid_range during aggregation. By default they are ignored for the purposes of aggregation and deleted from any aggregated output CF fields. . . .TP .B \-s, \-\-short Display short outputs. Fields are described by a short, one\-line summaries. . . .TP .B \-\-shared_nc_domain Aggregation configuration: Match axes between a field and its contained ancillary variable and coordinate reference fields via their netCDF dimension names and not via their domains. . . .TP .B \-\-squeeze Remove size 1 axes from the displayed field data arrays. If a size one axis has any one dimensional coordinates then these are converted to CF scalar coordinates. . . .TP .B \-\-recursive Allow directories to be specified by the .ft B INPUTS .ft P and recursively search the directories for actual files to read. Set the .ft B \-\-ignore_read_error .ft P option to bypass any unreadable files and the .ft B \-\-follow_symlinks .ft P option to allow directories to be symbolic links. . . .TP .B \-u, \-\-relaxed_units Aggregation configuration: Assume that fields or their components (such as coordinates) with the same standard name (or other identifiers, see the .ft B \-i .ft P option) but missing units all have equivalent (but unspecified) units, so that aggregation may occur. This is the default for Met Office (UK) PP files and Met Office (UK) fields files, but not for other formats. . . .TP .B \-\-unsqueeze Include size 1 axes in the displayed field data arrays. If a size one axis has any CF scalar coordinates then these are converted to one dimensional coordinates. . . .TP .B \-\-um_version=version For Met Office (UK) PP files and Met Office (UK) fields files only, the Unified Model (UM) version to be used when decoding the header. Valid versions are, for example, 4.2, 6.6.3 and 8.2. The default version is 4.5. In general, the given version is ignored if it can be inferred from the header (which is usually the case for files created by the UM at versions 5.3 and later). The exception to this is when the given version has a third element (such as the 3 in 6.6.3), in which case any version in the header is ignored. This option is ignored for input files which are not Met Office (UK) PP files or Met Office (UK) fields files. . . .TP .B \-x, \-\-exclude Aggregation configuration: Omit unaggregatable fields from the output. Ignored if the .ft B \-n .ft P option is set. See the AGGREGATION section for the definition of an unaggregatable field. . . . .SH SEE ALSO cfa(1), ncdump(1) . . . .SH LIBRARY cf\-python library version %s at %s . . . .SH BUGS Reports of bugs are welcome at http://cfpython.bitbucket.org . . . .SH LICENSE Open Source Initiative MIT License . . .SH AUTHOR David Hassell ''' % (version, date, version, os.path.dirname(os.path.abspath(cf.__file__))) # p = subprocess.Popen(['groffer', '-a', '--', '-'], stdin=subprocess.PIPE) p = subprocess.Popen(['man', '-r', ' Manual page cfdump(1)\ ?ltline\ %lt?L/%L.:', '-l', '-'], stdin=subprocess.PIPE) # p = subprocess.Popen(['groff', '-Tascii', '-mandoc', '-'], stdin=subprocess.PIPE) # p = subprocess.Popen(['groffer', '-a', '--', '-'], stdin=subprocess.PIPE) p.communicate(manpage) #---- End: def iam = os.path.basename(sys.argv[0]) usage = "USAGE: {0} [-1] [-c] [-h] [-i] [-l] [-n] [-s] [-u] [-x] [OPTIONS] FILES".format(iam) short_description = '''\ The cfdump tool generates text representations on standard output of the CF fields contained in the input files. By default each input file is treated as a single CF dataset following the aggregation rules currently documented in CF ticket #78. By default a summary of each CF field is output, but short one-line summaries, longer and complete outputs are optionally available. Accepts CF-netCDF and CFA-netCDF files (or URLs if DAP access is enabled), Met Office (UK) PP files and Met Office (UK) fields files as input. ''' short_help = '''\ {0} [-1] Treat all input files together as a single CF dataset [-c] Display complete outputs [-h] Display the full man page [-i] Configure field aggregation [-l] Display long outputs [-n] Do not aggregate fields [-s] Display short, one-line field summaries [-u] Configure field aggregation [-x] Do not output unaggregatable fields [--ignore_read_error] Ignore bad input files [--recursive] Recursively search input directories for files [--follow_symlinks] Allow input directories which are symbolic links [--squeeze] Remove size 1 axes from the output field data arrays [--unsqueeze] Include size 1 axes in the output field data arrays [--um_version] UM version for decoding PP and fields files [--info=N] Display information about field aggregation [--axis=property] Configure field aggregation [--equal=property] Configure field aggregation [--exist=property] Configure field aggregation [--ignore=property] Configure field aggregation [--equal_all] Configure field aggregation [--exist_all] Configure field aggregation [--contiguous] Configure field aggregation [--ncvar_identitites] Configure field aggregation [--no_overlap] Configure field aggregation [--respect_valid] Configure field aggregation [--shared_nc_domain] Configure field aggregation INPUTS Input files and directories Using cf-python library version {1} at {2}'''.format( usage, cf.__version__, os.path.dirname(os.path.abspath(cf.__file__))) # -------------------------------------------------------------------- # Parse command line options # -------------------------------------------------------------------- try: opts, infiles = getopt.getopt(sys.argv[1:], "1achilnr:suxw:", longopts=['complete', 'contiguous', 'equal=', 'equal_all', 'exist=', 'exist_all', 'follow_symlinks', 'help', 'ignore=', 'ignore_read_error', 'info=', 'long', 'no_aggregation', 'no_overlap', 'one', 'promote=', 'recursive', 'relaxed_identities', 'ncvar_identities', 'relaxed_units', 'respect_valid', 'shared_nc_domain', 'short', 'squeeze', 'um_version=', 'unsqueeze', 'all', 'aggregate=', 'read=', 'write=', ]) except getopt.GetoptError, err: # Print help information and exit: print "%s ERROR: Incorrect usage" % iam print short_help sys.exit(2) #--- End: try if not (infiles or opts): print short_description, '\n', short_help sys.exit(0) #--- End: if # Defaults short_output = False long_output = False complete_output = False no_aggregation = False # user_info = False one_to_one = True exclude = False # By default unaggregatable fields are output info = 0 # By default no info is printed to STDOUT axes = [] equal = [] exist = [] ignore = [] promote = [] aggregate_options = {} read_options = {} for option, arg in opts: if option in ('-h', '--help'): print_help(cf.__version__, cf.__date__) sys.exit(0) elif option in ('-s', '--short'): short_output = True elif option in ('-l', '--long'): long_output = True elif option in ('-c', '--complete'): complete_output = True long_output = True elif option in ('-1', '--one'): one_to_one = False elif option in ('-n', '--no_aggregation'): no_aggregation = True elif option in ('-a', '--all'): exclude = False elif option == '--info': # user_info = True info = int(arg) elif option in ('-x', '--exclude'): exclude = True elif option == '--axis': axes.append(arg) elif option == '--equal': equal.append(arg) elif option == '--exist': exist.append(arg) elif option == '--ignore': ignore.append(arg) elif option == '--promote': promote.append(arg) elif option == '--contiguous': aggregate_options['contiguous'] = True elif option == '--equal_all': aggregate_options['equal_all'] = True elif option == '--exist_all': aggregate_options['exist_all'] = True elif option == '--no_overlap': aggregate_options['no_overlap'] = True elif option in ('-i', '--relaxed_identities'): aggregate_options['relaxed_identities'] = True elif option in ('-u', '--relaxed_units'): aggregate_options['relaxed_units'] = True elif option == '--respect_valid': aggregate_options['respect_valid'] = True elif option == '--ncvar_identities': aggregate_options['ncvar_identities'] = True elif option == '--shared_nc_domain': aggregate_options['shared_nc_domain'] = True elif option == '--recursive': read_options['recursive'] = True elif option == '--follow_symlinks': read_options['follow_symlinks'] = True elif option == '--squeeze': read_options['squeeze'] = True elif option == '--um_version': read_options['umversion'] = arg elif option == '--unsqueeze': read_options['unsqueeze'] = True elif option == '--ignore_read_error': read_options['ignore_read_error'] = True elif option in ('-a', '--all'): print( "%s ERROR: The %s option has been deprecated and is now the default behaviour. See the -x option." % (iam, option)) sys.exit(2) elif option in ('-r', '-w', '--aggregate', '--read', '--write'): print( "%s ERROR: Option %s has been replaced. See %s -h" % (iam, option, iam)) sys.exit(2) else: print short_help assert False, "Unhandled option: "+option #--- End: for if not infiles: print iam, "ERROR: Must provide at least one input file" print short_help sys.exit(2) #--- End: if if promote: read_options['promote'] = promote if no_aggregation: read_options['aggregate'] = False else: aggregate_options['info'] = info aggregate_options['exclude'] = exclude if axes: aggregate_options['dimension'] = axes if equal: aggregate_options['equal'] = equal if exist: aggregate_options['exist'] = exist if ignore: aggregate_options['ignore'] = ignore read_options['aggregate'] = aggregate_options #--- End: if status = 0 # Replace the input files with their absolute, normalised paths # and recursively scan input directories recursive = read_options.get('recursive', False) follow_symlinks = read_options.get('follow_symlinks', False) if follow_symlinks and not recursive: print ( "{0} ERROR: Can't set --follow_symlinks without setting --recursive".format(iam)) sys.exit(2) infiles2 = [] for x in (cf.abspath(f) for f in infiles): if not os.path.isdir(x): infiles2.append(x) elif not recursive: print( "{0} ERROR: Can't read directory {1} unless --recursive is set".format(iam, x)) sys.exit(2) else: # Recursively walk through directories for path, subdirs, filenames in os.walk(x, followlinks=follow_symlinks): infiles2.extend([os.path.join(path, f) for f in filenames]) #--- End: for infiles = infiles2 if len(infiles) == 1: # Only one input is equivalent to using the --one option one_to_one = False if not one_to_one: infiles = (infiles,) # ---------------------------------------------------------------- # Read the input files # ---------------------------------------------------------------- for infile in infiles: if one_to_one: print '\nFILE:', infile,'\n' try: f = cf.read(infile, **read_options) except Exception as error: print '{0} ERROR reading file: {1}'.format(iam, error) sys.exit(1) status |= cf.aggregate.status # ---------------------------------------------------------------- # Print the field descriptions # ---------------------------------------------------------------- if short_output: for g in f: print repr(g) elif not long_output: print f else: f.dump(complete=complete_output) if not one_to_one: break #--- End: for cf-python-1.3.2/MANIFEST.in0000644000175000017500000000131212750136261015362 0ustar daviddavid00000000000000include MANIFEST.in include Changelog.md include README.md recursive-include cf * recursive-include test * recursive-include docs/_build * recursive-include docs/_sources * recursive-include docs/_static * recursive-include docs/_templates * recursive-include docs/_themes * recursive-include docs/build * recursive-include docs/source * prune docs/build/.doctrees recursive-exclude docs/build *.doctree recursive-exclude docs/source/generated *.rst recursive-exclude docs/source/classes/generated *.rst recursive-include scripts/man1 * recursive-exclude * *~ *.gz *.pyc recursive-exclude * *.o *.so .nfs* recursive-exclude test *.nc recursive-exclude cf *.a recursive-include test test_file[23].nc file[1-9].nc