reproject-0.3.2/0000755000077000000240000000000013173066302013430 5ustar tomstaff00000000000000reproject-0.3.2/ah_bootstrap.py0000644000077000000240000010650213173065713016500 0ustar tomstaff00000000000000""" This bootstrap module contains code for ensuring that the astropy_helpers package will be importable by the time the setup.py script runs. It also includes some workarounds to ensure that a recent-enough version of setuptools is being used for the installation. This module should be the first thing imported in the setup.py of distributions that make use of the utilities in astropy_helpers. If the distribution ships with its own copy of astropy_helpers, this module will first attempt to import from the shipped copy. However, it will also check PyPI to see if there are any bug-fix releases on top of the current version that may be useful to get past platform-specific bugs that have been fixed. When running setup.py, use the ``--offline`` command-line option to disable the auto-upgrade checks. When this module is imported or otherwise executed it automatically calls a main function that attempts to read the project's setup.cfg file, which it checks for a configuration section called ``[ah_bootstrap]`` the presences of that section, and options therein, determine the next step taken: If it contains an option called ``auto_use`` with a value of ``True``, it will automatically call the main function of this module called `use_astropy_helpers` (see that function's docstring for full details). Otherwise no further action is taken (however, ``ah_bootstrap.use_astropy_helpers`` may be called manually from within the setup.py script). Additional options in the ``[ah_boostrap]`` section of setup.cfg have the same names as the arguments to `use_astropy_helpers`, and can be used to configure the bootstrap script when ``auto_use = True``. See https://github.com/astropy/astropy-helpers for more details, and for the latest version of this module. """ import contextlib import errno import imp import io import locale import os import re import subprocess as sp import sys try: from ConfigParser import ConfigParser, RawConfigParser except ImportError: from configparser import ConfigParser, RawConfigParser if sys.version_info[0] < 3: _str_types = (str, unicode) _text_type = unicode PY3 = False else: _str_types = (str, bytes) _text_type = str PY3 = True # What follows are several import statements meant to deal with install-time # issues with either missing or misbehaving pacakges (including making sure # setuptools itself is installed): # Some pre-setuptools checks to ensure that either distribute or setuptools >= # 0.7 is used (over pre-distribute setuptools) if it is available on the path; # otherwise the latest setuptools will be downloaded and bootstrapped with # ``ez_setup.py``. This used to be included in a separate file called # setuptools_bootstrap.py; but it was combined into ah_bootstrap.py try: import pkg_resources _setuptools_req = pkg_resources.Requirement.parse('setuptools>=0.7') # This may raise a DistributionNotFound in which case no version of # setuptools or distribute is properly installed _setuptools = pkg_resources.get_distribution('setuptools') if _setuptools not in _setuptools_req: # Older version of setuptools; check if we have distribute; again if # this results in DistributionNotFound we want to give up _distribute = pkg_resources.get_distribution('distribute') if _setuptools != _distribute: # It's possible on some pathological systems to have an old version # of setuptools and distribute on sys.path simultaneously; make # sure distribute is the one that's used sys.path.insert(1, _distribute.location) _distribute.activate() imp.reload(pkg_resources) except: # There are several types of exceptions that can occur here; if all else # fails bootstrap and use the bootstrapped version from ez_setup import use_setuptools use_setuptools() # Note: The following import is required as a workaround to # https://github.com/astropy/astropy-helpers/issues/89; if we don't import this # module now, it will get cleaned up after `run_setup` is called, but that will # later cause the TemporaryDirectory class defined in it to stop working when # used later on by setuptools try: import setuptools.py31compat except ImportError: pass # matplotlib can cause problems if it is imported from within a call of # run_setup(), because in some circumstances it will try to write to the user's # home directory, resulting in a SandboxViolation. See # https://github.com/matplotlib/matplotlib/pull/4165 # Making sure matplotlib, if it is available, is imported early in the setup # process can mitigate this (note importing matplotlib.pyplot has the same # issue) try: import matplotlib matplotlib.use('Agg') import matplotlib.pyplot except: # Ignore if this fails for *any* reason* pass # End compatibility imports... # In case it didn't successfully import before the ez_setup checks import pkg_resources from setuptools import Distribution from setuptools.package_index import PackageIndex from setuptools.sandbox import run_setup from distutils import log from distutils.debug import DEBUG # TODO: Maybe enable checking for a specific version of astropy_helpers? DIST_NAME = 'astropy-helpers' PACKAGE_NAME = 'astropy_helpers' # Defaults for other options DOWNLOAD_IF_NEEDED = True INDEX_URL = 'https://pypi.python.org/simple' USE_GIT = True OFFLINE = False AUTO_UPGRADE = True # A list of all the configuration options and their required types CFG_OPTIONS = [ ('auto_use', bool), ('path', str), ('download_if_needed', bool), ('index_url', str), ('use_git', bool), ('offline', bool), ('auto_upgrade', bool) ] class _Bootstrapper(object): """ Bootstrapper implementation. See ``use_astropy_helpers`` for parameter documentation. """ def __init__(self, path=None, index_url=None, use_git=None, offline=None, download_if_needed=None, auto_upgrade=None): if path is None: path = PACKAGE_NAME if not (isinstance(path, _str_types) or path is False): raise TypeError('path must be a string or False') if PY3 and not isinstance(path, _text_type): fs_encoding = sys.getfilesystemencoding() path = path.decode(fs_encoding) # path to unicode self.path = path # Set other option attributes, using defaults where necessary self.index_url = index_url if index_url is not None else INDEX_URL self.offline = offline if offline is not None else OFFLINE # If offline=True, override download and auto-upgrade if self.offline: download_if_needed = False auto_upgrade = False self.download = (download_if_needed if download_if_needed is not None else DOWNLOAD_IF_NEEDED) self.auto_upgrade = (auto_upgrade if auto_upgrade is not None else AUTO_UPGRADE) # If this is a release then the .git directory will not exist so we # should not use git. git_dir_exists = os.path.exists(os.path.join(os.path.dirname(__file__), '.git')) if use_git is None and not git_dir_exists: use_git = False self.use_git = use_git if use_git is not None else USE_GIT # Declared as False by default--later we check if astropy-helpers can be # upgraded from PyPI, but only if not using a source distribution (as in # the case of import from a git submodule) self.is_submodule = False @classmethod def main(cls, argv=None): if argv is None: argv = sys.argv config = cls.parse_config() config.update(cls.parse_command_line(argv)) auto_use = config.pop('auto_use', False) bootstrapper = cls(**config) if auto_use: # Run the bootstrapper, otherwise the setup.py is using the old # use_astropy_helpers() interface, in which case it will run the # bootstrapper manually after reconfiguring it. bootstrapper.run() return bootstrapper @classmethod def parse_config(cls): if not os.path.exists('setup.cfg'): return {} cfg = ConfigParser() try: cfg.read('setup.cfg') except Exception as e: if DEBUG: raise log.error( "Error reading setup.cfg: {0!r}\n{1} will not be " "automatically bootstrapped and package installation may fail." "\n{2}".format(e, PACKAGE_NAME, _err_help_msg)) return {} if not cfg.has_section('ah_bootstrap'): return {} config = {} for option, type_ in CFG_OPTIONS: if not cfg.has_option('ah_bootstrap', option): continue if type_ is bool: value = cfg.getboolean('ah_bootstrap', option) else: value = cfg.get('ah_bootstrap', option) config[option] = value return config @classmethod def parse_command_line(cls, argv=None): if argv is None: argv = sys.argv config = {} # For now we just pop recognized ah_bootstrap options out of the # arg list. This is imperfect; in the unlikely case that a setup.py # custom command or even custom Distribution class defines an argument # of the same name then we will break that. However there's a catch22 # here that we can't just do full argument parsing right here, because # we don't yet know *how* to parse all possible command-line arguments. if '--no-git' in argv: config['use_git'] = False argv.remove('--no-git') if '--offline' in argv: config['offline'] = True argv.remove('--offline') return config def run(self): strategies = ['local_directory', 'local_file', 'index'] dist = None # First, remove any previously imported versions of astropy_helpers; # this is necessary for nested installs where one package's installer # is installing another package via setuptools.sandbox.run_setup, as in # the case of setup_requires for key in list(sys.modules): try: if key == PACKAGE_NAME or key.startswith(PACKAGE_NAME + '.'): del sys.modules[key] except AttributeError: # Sometimes mysterious non-string things can turn up in # sys.modules continue # Check to see if the path is a submodule self.is_submodule = self._check_submodule() for strategy in strategies: method = getattr(self, 'get_{0}_dist'.format(strategy)) dist = method() if dist is not None: break else: raise _AHBootstrapSystemExit( "No source found for the {0!r} package; {0} must be " "available and importable as a prerequisite to building " "or installing this package.".format(PACKAGE_NAME)) # This is a bit hacky, but if astropy_helpers was loaded from a # directory/submodule its Distribution object gets a "precedence" of # "DEVELOP_DIST". However, in other cases it gets a precedence of # "EGG_DIST". However, when activing the distribution it will only be # placed early on sys.path if it is treated as an EGG_DIST, so always # do that dist = dist.clone(precedence=pkg_resources.EGG_DIST) # Otherwise we found a version of astropy-helpers, so we're done # Just active the found distribution on sys.path--if we did a # download this usually happens automatically but it doesn't hurt to # do it again # Note: Adding the dist to the global working set also activates it # (makes it importable on sys.path) by default. try: pkg_resources.working_set.add(dist, replace=True) except TypeError: # Some (much) older versions of setuptools do not have the # replace=True option here. These versions are old enough that all # bets may be off anyways, but it's easy enough to work around just # in case... if dist.key in pkg_resources.working_set.by_key: del pkg_resources.working_set.by_key[dist.key] pkg_resources.working_set.add(dist) @property def config(self): """ A `dict` containing the options this `_Bootstrapper` was configured with. """ return dict((optname, getattr(self, optname)) for optname, _ in CFG_OPTIONS if hasattr(self, optname)) def get_local_directory_dist(self): """ Handle importing a vendored package from a subdirectory of the source distribution. """ if not os.path.isdir(self.path): return log.info('Attempting to import astropy_helpers from {0} {1!r}'.format( 'submodule' if self.is_submodule else 'directory', self.path)) dist = self._directory_import() if dist is None: log.warn( 'The requested path {0!r} for importing {1} does not ' 'exist, or does not contain a copy of the {1} ' 'package.'.format(self.path, PACKAGE_NAME)) elif self.auto_upgrade and not self.is_submodule: # A version of astropy-helpers was found on the available path, but # check to see if a bugfix release is available on PyPI upgrade = self._do_upgrade(dist) if upgrade is not None: dist = upgrade return dist def get_local_file_dist(self): """ Handle importing from a source archive; this also uses setup_requires but points easy_install directly to the source archive. """ if not os.path.isfile(self.path): return log.info('Attempting to unpack and import astropy_helpers from ' '{0!r}'.format(self.path)) try: dist = self._do_download(find_links=[self.path]) except Exception as e: if DEBUG: raise log.warn( 'Failed to import {0} from the specified archive {1!r}: ' '{2}'.format(PACKAGE_NAME, self.path, str(e))) dist = None if dist is not None and self.auto_upgrade: # A version of astropy-helpers was found on the available path, but # check to see if a bugfix release is available on PyPI upgrade = self._do_upgrade(dist) if upgrade is not None: dist = upgrade return dist def get_index_dist(self): if not self.download: log.warn('Downloading {0!r} disabled.'.format(DIST_NAME)) return None log.warn( "Downloading {0!r}; run setup.py with the --offline option to " "force offline installation.".format(DIST_NAME)) try: dist = self._do_download() except Exception as e: if DEBUG: raise log.warn( 'Failed to download and/or install {0!r} from {1!r}:\n' '{2}'.format(DIST_NAME, self.index_url, str(e))) dist = None # No need to run auto-upgrade here since we've already presumably # gotten the most up-to-date version from the package index return dist def _directory_import(self): """ Import astropy_helpers from the given path, which will be added to sys.path. Must return True if the import succeeded, and False otherwise. """ # Return True on success, False on failure but download is allowed, and # otherwise raise SystemExit path = os.path.abspath(self.path) # Use an empty WorkingSet rather than the man # pkg_resources.working_set, since on older versions of setuptools this # will invoke a VersionConflict when trying to install an upgrade ws = pkg_resources.WorkingSet([]) ws.add_entry(path) dist = ws.by_key.get(DIST_NAME) if dist is None: # We didn't find an egg-info/dist-info in the given path, but if a # setup.py exists we can generate it setup_py = os.path.join(path, 'setup.py') if os.path.isfile(setup_py): with _silence(): run_setup(os.path.join(path, 'setup.py'), ['egg_info']) for dist in pkg_resources.find_distributions(path, True): # There should be only one... return dist return dist def _do_download(self, version='', find_links=None): if find_links: allow_hosts = '' index_url = None else: allow_hosts = None index_url = self.index_url # Annoyingly, setuptools will not handle other arguments to # Distribution (such as options) before handling setup_requires, so it # is not straightforward to programmatically augment the arguments which # are passed to easy_install class _Distribution(Distribution): def get_option_dict(self, command_name): opts = Distribution.get_option_dict(self, command_name) if command_name == 'easy_install': if find_links is not None: opts['find_links'] = ('setup script', find_links) if index_url is not None: opts['index_url'] = ('setup script', index_url) if allow_hosts is not None: opts['allow_hosts'] = ('setup script', allow_hosts) return opts if version: req = '{0}=={1}'.format(DIST_NAME, version) else: req = DIST_NAME attrs = {'setup_requires': [req]} try: if DEBUG: _Distribution(attrs=attrs) else: with _silence(): _Distribution(attrs=attrs) # If the setup_requires succeeded it will have added the new dist to # the main working_set return pkg_resources.working_set.by_key.get(DIST_NAME) except Exception as e: if DEBUG: raise msg = 'Error retrieving {0} from {1}:\n{2}' if find_links: source = find_links[0] elif index_url != INDEX_URL: source = index_url else: source = 'PyPI' raise Exception(msg.format(DIST_NAME, source, repr(e))) def _do_upgrade(self, dist): # Build up a requirement for a higher bugfix release but a lower minor # release (so API compatibility is guaranteed) next_version = _next_version(dist.parsed_version) req = pkg_resources.Requirement.parse( '{0}>{1},<{2}'.format(DIST_NAME, dist.version, next_version)) package_index = PackageIndex(index_url=self.index_url) upgrade = package_index.obtain(req) if upgrade is not None: return self._do_download(version=upgrade.version) def _check_submodule(self): """ Check if the given path is a git submodule. See the docstrings for ``_check_submodule_using_git`` and ``_check_submodule_no_git`` for further details. """ if (self.path is None or (os.path.exists(self.path) and not os.path.isdir(self.path))): return False if self.use_git: return self._check_submodule_using_git() else: return self._check_submodule_no_git() def _check_submodule_using_git(self): """ Check if the given path is a git submodule. If so, attempt to initialize and/or update the submodule if needed. This function makes calls to the ``git`` command in subprocesses. The ``_check_submodule_no_git`` option uses pure Python to check if the given path looks like a git submodule, but it cannot perform updates. """ cmd = ['git', 'submodule', 'status', '--', self.path] try: log.info('Running `{0}`; use the --no-git option to disable git ' 'commands'.format(' '.join(cmd))) returncode, stdout, stderr = run_cmd(cmd) except _CommandNotFound: # The git command simply wasn't found; this is most likely the # case on user systems that don't have git and are simply # trying to install the package from PyPI or a source # distribution. Silently ignore this case and simply don't try # to use submodules return False stderr = stderr.strip() if returncode != 0 and stderr: # Unfortunately the return code alone cannot be relied on, as # earlier versions of git returned 0 even if the requested submodule # does not exist # This is a warning that occurs in perl (from running git submodule) # which only occurs with a malformatted locale setting which can # happen sometimes on OSX. See again # https://github.com/astropy/astropy/issues/2749 perl_warning = ('perl: warning: Falling back to the standard locale ' '("C").') if not stderr.strip().endswith(perl_warning): # Some other unknown error condition occurred log.warn('git submodule command failed ' 'unexpectedly:\n{0}'.format(stderr)) return False # Output of `git submodule status` is as follows: # # 1: Status indicator: '-' for submodule is uninitialized, '+' if # submodule is initialized but is not at the commit currently indicated # in .gitmodules (and thus needs to be updated), or 'U' if the # submodule is in an unstable state (i.e. has merge conflicts) # # 2. SHA-1 hash of the current commit of the submodule (we don't really # need this information but it's useful for checking that the output is # correct) # # 3. The output of `git describe` for the submodule's current commit # hash (this includes for example what branches the commit is on) but # only if the submodule is initialized. We ignore this information for # now _git_submodule_status_re = re.compile( '^(?P[+-U ])(?P[0-9a-f]{40}) ' '(?P\S+)( .*)?$') # The stdout should only contain one line--the status of the # requested submodule m = _git_submodule_status_re.match(stdout) if m: # Yes, the path *is* a git submodule self._update_submodule(m.group('submodule'), m.group('status')) return True else: log.warn( 'Unexpected output from `git submodule status`:\n{0}\n' 'Will attempt import from {1!r} regardless.'.format( stdout, self.path)) return False def _check_submodule_no_git(self): """ Like ``_check_submodule_using_git``, but simply parses the .gitmodules file to determine if the supplied path is a git submodule, and does not exec any subprocesses. This can only determine if a path is a submodule--it does not perform updates, etc. This function may need to be updated if the format of the .gitmodules file is changed between git versions. """ gitmodules_path = os.path.abspath('.gitmodules') if not os.path.isfile(gitmodules_path): return False # This is a minimal reader for gitconfig-style files. It handles a few of # the quirks that make gitconfig files incompatible with ConfigParser-style # files, but does not support the full gitconfig syntax (just enough # needed to read a .gitmodules file). gitmodules_fileobj = io.StringIO() # Must use io.open for cross-Python-compatible behavior wrt unicode with io.open(gitmodules_path) as f: for line in f: # gitconfig files are more flexible with leading whitespace; just # go ahead and remove it line = line.lstrip() # comments can start with either # or ; if line and line[0] in (':', ';'): continue gitmodules_fileobj.write(line) gitmodules_fileobj.seek(0) cfg = RawConfigParser() try: cfg.readfp(gitmodules_fileobj) except Exception as exc: log.warn('Malformatted .gitmodules file: {0}\n' '{1} cannot be assumed to be a git submodule.'.format( exc, self.path)) return False for section in cfg.sections(): if not cfg.has_option(section, 'path'): continue submodule_path = cfg.get(section, 'path').rstrip(os.sep) if submodule_path == self.path.rstrip(os.sep): return True return False def _update_submodule(self, submodule, status): if status == ' ': # The submodule is up to date; no action necessary return elif status == '-': if self.offline: raise _AHBootstrapSystemExit( "Cannot initialize the {0} submodule in --offline mode; " "this requires being able to clone the submodule from an " "online repository.".format(submodule)) cmd = ['update', '--init'] action = 'Initializing' elif status == '+': cmd = ['update'] action = 'Updating' if self.offline: cmd.append('--no-fetch') elif status == 'U': raise _AHBoostrapSystemExit( 'Error: Submodule {0} contains unresolved merge conflicts. ' 'Please complete or abandon any changes in the submodule so that ' 'it is in a usable state, then try again.'.format(submodule)) else: log.warn('Unknown status {0!r} for git submodule {1!r}. Will ' 'attempt to use the submodule as-is, but try to ensure ' 'that the submodule is in a clean state and contains no ' 'conflicts or errors.\n{2}'.format(status, submodule, _err_help_msg)) return err_msg = None cmd = ['git', 'submodule'] + cmd + ['--', submodule] log.warn('{0} {1} submodule with: `{2}`'.format( action, submodule, ' '.join(cmd))) try: log.info('Running `{0}`; use the --no-git option to disable git ' 'commands'.format(' '.join(cmd))) returncode, stdout, stderr = run_cmd(cmd) except OSError as e: err_msg = str(e) else: if returncode != 0: err_msg = stderr if err_msg is not None: log.warn('An unexpected error occurred updating the git submodule ' '{0!r}:\n{1}\n{2}'.format(submodule, err_msg, _err_help_msg)) class _CommandNotFound(OSError): """ An exception raised when a command run with run_cmd is not found on the system. """ def run_cmd(cmd): """ Run a command in a subprocess, given as a list of command-line arguments. Returns a ``(returncode, stdout, stderr)`` tuple. """ try: p = sp.Popen(cmd, stdout=sp.PIPE, stderr=sp.PIPE) # XXX: May block if either stdout or stderr fill their buffers; # however for the commands this is currently used for that is # unlikely (they should have very brief output) stdout, stderr = p.communicate() except OSError as e: if DEBUG: raise if e.errno == errno.ENOENT: msg = 'Command not found: `{0}`'.format(' '.join(cmd)) raise _CommandNotFound(msg, cmd) else: raise _AHBoostrapSystemExit( 'An unexpected error occurred when running the ' '`{0}` command:\n{1}'.format(' '.join(cmd), str(e))) # Can fail of the default locale is not configured properly. See # https://github.com/astropy/astropy/issues/2749. For the purposes under # consideration 'latin1' is an acceptable fallback. try: stdio_encoding = locale.getdefaultlocale()[1] or 'latin1' except ValueError: # Due to an OSX oddity locale.getdefaultlocale() can also crash # depending on the user's locale/language settings. See: # http://bugs.python.org/issue18378 stdio_encoding = 'latin1' # Unlikely to fail at this point but even then let's be flexible if not isinstance(stdout, _text_type): stdout = stdout.decode(stdio_encoding, 'replace') if not isinstance(stderr, _text_type): stderr = stderr.decode(stdio_encoding, 'replace') return (p.returncode, stdout, stderr) def _next_version(version): """ Given a parsed version from pkg_resources.parse_version, returns a new version string with the next minor version. Examples ======== >>> _next_version(pkg_resources.parse_version('1.2.3')) '1.3.0' """ if hasattr(version, 'base_version'): # New version parsing from setuptools >= 8.0 if version.base_version: parts = version.base_version.split('.') else: parts = [] else: parts = [] for part in version: if part.startswith('*'): break parts.append(part) parts = [int(p) for p in parts] if len(parts) < 3: parts += [0] * (3 - len(parts)) major, minor, micro = parts[:3] return '{0}.{1}.{2}'.format(major, minor + 1, 0) class _DummyFile(object): """A noop writeable object.""" errors = '' # Required for Python 3.x encoding = 'utf-8' def write(self, s): pass def flush(self): pass @contextlib.contextmanager def _silence(): """A context manager that silences sys.stdout and sys.stderr.""" old_stdout = sys.stdout old_stderr = sys.stderr sys.stdout = _DummyFile() sys.stderr = _DummyFile() exception_occurred = False try: yield except: exception_occurred = True # Go ahead and clean up so that exception handling can work normally sys.stdout = old_stdout sys.stderr = old_stderr raise if not exception_occurred: sys.stdout = old_stdout sys.stderr = old_stderr _err_help_msg = """ If the problem persists consider installing astropy_helpers manually using pip (`pip install astropy_helpers`) or by manually downloading the source archive, extracting it, and installing by running `python setup.py install` from the root of the extracted source code. """ class _AHBootstrapSystemExit(SystemExit): def __init__(self, *args): if not args: msg = 'An unknown problem occurred bootstrapping astropy_helpers.' else: msg = args[0] msg += '\n' + _err_help_msg super(_AHBootstrapSystemExit, self).__init__(msg, *args[1:]) if sys.version_info[:2] < (2, 7): # In Python 2.6 the distutils log does not log warnings, errors, etc. to # stderr so we have to wrap it to ensure consistency at least in this # module import distutils class log(object): def __getattr__(self, attr): return getattr(distutils.log, attr) def warn(self, msg, *args): self._log_to_stderr(distutils.log.WARN, msg, *args) def error(self, msg): self._log_to_stderr(distutils.log.ERROR, msg, *args) def fatal(self, msg): self._log_to_stderr(distutils.log.FATAL, msg, *args) def log(self, level, msg, *args): if level in (distutils.log.WARN, distutils.log.ERROR, distutils.log.FATAL): self._log_to_stderr(level, msg, *args) else: distutils.log.log(level, msg, *args) def _log_to_stderr(self, level, msg, *args): # This is the only truly 'public' way to get the current threshold # of the log current_threshold = distutils.log.set_threshold(distutils.log.WARN) distutils.log.set_threshold(current_threshold) if level >= current_threshold: if args: msg = msg % args sys.stderr.write('%s\n' % msg) sys.stderr.flush() log = log() BOOTSTRAPPER = _Bootstrapper.main() def use_astropy_helpers(**kwargs): """ Ensure that the `astropy_helpers` module is available and is importable. This supports automatic submodule initialization if astropy_helpers is included in a project as a git submodule, or will download it from PyPI if necessary. Parameters ---------- path : str or None, optional A filesystem path relative to the root of the project's source code that should be added to `sys.path` so that `astropy_helpers` can be imported from that path. If the path is a git submodule it will automatically be initialized and/or updated. The path may also be to a ``.tar.gz`` archive of the astropy_helpers source distribution. In this case the archive is automatically unpacked and made temporarily available on `sys.path` as a ``.egg`` archive. If `None` skip straight to downloading. download_if_needed : bool, optional If the provided filesystem path is not found an attempt will be made to download astropy_helpers from PyPI. It will then be made temporarily available on `sys.path` as a ``.egg`` archive (using the ``setup_requires`` feature of setuptools. If the ``--offline`` option is given at the command line the value of this argument is overridden to `False`. index_url : str, optional If provided, use a different URL for the Python package index than the main PyPI server. use_git : bool, optional If `False` no git commands will be used--this effectively disables support for git submodules. If the ``--no-git`` option is given at the command line the value of this argument is overridden to `False`. auto_upgrade : bool, optional By default, when installing a package from a non-development source distribution ah_boostrap will try to automatically check for patch releases to astropy-helpers on PyPI and use the patched version over any bundled versions. Setting this to `False` will disable that functionality. If the ``--offline`` option is given at the command line the value of this argument is overridden to `False`. offline : bool, optional If `False` disable all actions that require an internet connection, including downloading packages from the package index and fetching updates to any git submodule. Defaults to `True`. """ global BOOTSTRAPPER config = BOOTSTRAPPER.config config.update(**kwargs) # Create a new bootstrapper with the updated configuration and run it BOOTSTRAPPER = _Bootstrapper(**config) BOOTSTRAPPER.run() reproject-0.3.2/astropy_helpers/0000755000077000000240000000000013173066302016653 5ustar tomstaff00000000000000reproject-0.3.2/astropy_helpers/ah_bootstrap.py0000644000077000000240000010650213173066253021723 0ustar tomstaff00000000000000""" This bootstrap module contains code for ensuring that the astropy_helpers package will be importable by the time the setup.py script runs. It also includes some workarounds to ensure that a recent-enough version of setuptools is being used for the installation. This module should be the first thing imported in the setup.py of distributions that make use of the utilities in astropy_helpers. If the distribution ships with its own copy of astropy_helpers, this module will first attempt to import from the shipped copy. However, it will also check PyPI to see if there are any bug-fix releases on top of the current version that may be useful to get past platform-specific bugs that have been fixed. When running setup.py, use the ``--offline`` command-line option to disable the auto-upgrade checks. When this module is imported or otherwise executed it automatically calls a main function that attempts to read the project's setup.cfg file, which it checks for a configuration section called ``[ah_bootstrap]`` the presences of that section, and options therein, determine the next step taken: If it contains an option called ``auto_use`` with a value of ``True``, it will automatically call the main function of this module called `use_astropy_helpers` (see that function's docstring for full details). Otherwise no further action is taken (however, ``ah_bootstrap.use_astropy_helpers`` may be called manually from within the setup.py script). Additional options in the ``[ah_boostrap]`` section of setup.cfg have the same names as the arguments to `use_astropy_helpers`, and can be used to configure the bootstrap script when ``auto_use = True``. See https://github.com/astropy/astropy-helpers for more details, and for the latest version of this module. """ import contextlib import errno import imp import io import locale import os import re import subprocess as sp import sys try: from ConfigParser import ConfigParser, RawConfigParser except ImportError: from configparser import ConfigParser, RawConfigParser if sys.version_info[0] < 3: _str_types = (str, unicode) _text_type = unicode PY3 = False else: _str_types = (str, bytes) _text_type = str PY3 = True # What follows are several import statements meant to deal with install-time # issues with either missing or misbehaving pacakges (including making sure # setuptools itself is installed): # Some pre-setuptools checks to ensure that either distribute or setuptools >= # 0.7 is used (over pre-distribute setuptools) if it is available on the path; # otherwise the latest setuptools will be downloaded and bootstrapped with # ``ez_setup.py``. This used to be included in a separate file called # setuptools_bootstrap.py; but it was combined into ah_bootstrap.py try: import pkg_resources _setuptools_req = pkg_resources.Requirement.parse('setuptools>=0.7') # This may raise a DistributionNotFound in which case no version of # setuptools or distribute is properly installed _setuptools = pkg_resources.get_distribution('setuptools') if _setuptools not in _setuptools_req: # Older version of setuptools; check if we have distribute; again if # this results in DistributionNotFound we want to give up _distribute = pkg_resources.get_distribution('distribute') if _setuptools != _distribute: # It's possible on some pathological systems to have an old version # of setuptools and distribute on sys.path simultaneously; make # sure distribute is the one that's used sys.path.insert(1, _distribute.location) _distribute.activate() imp.reload(pkg_resources) except: # There are several types of exceptions that can occur here; if all else # fails bootstrap and use the bootstrapped version from ez_setup import use_setuptools use_setuptools() # Note: The following import is required as a workaround to # https://github.com/astropy/astropy-helpers/issues/89; if we don't import this # module now, it will get cleaned up after `run_setup` is called, but that will # later cause the TemporaryDirectory class defined in it to stop working when # used later on by setuptools try: import setuptools.py31compat except ImportError: pass # matplotlib can cause problems if it is imported from within a call of # run_setup(), because in some circumstances it will try to write to the user's # home directory, resulting in a SandboxViolation. See # https://github.com/matplotlib/matplotlib/pull/4165 # Making sure matplotlib, if it is available, is imported early in the setup # process can mitigate this (note importing matplotlib.pyplot has the same # issue) try: import matplotlib matplotlib.use('Agg') import matplotlib.pyplot except: # Ignore if this fails for *any* reason* pass # End compatibility imports... # In case it didn't successfully import before the ez_setup checks import pkg_resources from setuptools import Distribution from setuptools.package_index import PackageIndex from setuptools.sandbox import run_setup from distutils import log from distutils.debug import DEBUG # TODO: Maybe enable checking for a specific version of astropy_helpers? DIST_NAME = 'astropy-helpers' PACKAGE_NAME = 'astropy_helpers' # Defaults for other options DOWNLOAD_IF_NEEDED = True INDEX_URL = 'https://pypi.python.org/simple' USE_GIT = True OFFLINE = False AUTO_UPGRADE = True # A list of all the configuration options and their required types CFG_OPTIONS = [ ('auto_use', bool), ('path', str), ('download_if_needed', bool), ('index_url', str), ('use_git', bool), ('offline', bool), ('auto_upgrade', bool) ] class _Bootstrapper(object): """ Bootstrapper implementation. See ``use_astropy_helpers`` for parameter documentation. """ def __init__(self, path=None, index_url=None, use_git=None, offline=None, download_if_needed=None, auto_upgrade=None): if path is None: path = PACKAGE_NAME if not (isinstance(path, _str_types) or path is False): raise TypeError('path must be a string or False') if PY3 and not isinstance(path, _text_type): fs_encoding = sys.getfilesystemencoding() path = path.decode(fs_encoding) # path to unicode self.path = path # Set other option attributes, using defaults where necessary self.index_url = index_url if index_url is not None else INDEX_URL self.offline = offline if offline is not None else OFFLINE # If offline=True, override download and auto-upgrade if self.offline: download_if_needed = False auto_upgrade = False self.download = (download_if_needed if download_if_needed is not None else DOWNLOAD_IF_NEEDED) self.auto_upgrade = (auto_upgrade if auto_upgrade is not None else AUTO_UPGRADE) # If this is a release then the .git directory will not exist so we # should not use git. git_dir_exists = os.path.exists(os.path.join(os.path.dirname(__file__), '.git')) if use_git is None and not git_dir_exists: use_git = False self.use_git = use_git if use_git is not None else USE_GIT # Declared as False by default--later we check if astropy-helpers can be # upgraded from PyPI, but only if not using a source distribution (as in # the case of import from a git submodule) self.is_submodule = False @classmethod def main(cls, argv=None): if argv is None: argv = sys.argv config = cls.parse_config() config.update(cls.parse_command_line(argv)) auto_use = config.pop('auto_use', False) bootstrapper = cls(**config) if auto_use: # Run the bootstrapper, otherwise the setup.py is using the old # use_astropy_helpers() interface, in which case it will run the # bootstrapper manually after reconfiguring it. bootstrapper.run() return bootstrapper @classmethod def parse_config(cls): if not os.path.exists('setup.cfg'): return {} cfg = ConfigParser() try: cfg.read('setup.cfg') except Exception as e: if DEBUG: raise log.error( "Error reading setup.cfg: {0!r}\n{1} will not be " "automatically bootstrapped and package installation may fail." "\n{2}".format(e, PACKAGE_NAME, _err_help_msg)) return {} if not cfg.has_section('ah_bootstrap'): return {} config = {} for option, type_ in CFG_OPTIONS: if not cfg.has_option('ah_bootstrap', option): continue if type_ is bool: value = cfg.getboolean('ah_bootstrap', option) else: value = cfg.get('ah_bootstrap', option) config[option] = value return config @classmethod def parse_command_line(cls, argv=None): if argv is None: argv = sys.argv config = {} # For now we just pop recognized ah_bootstrap options out of the # arg list. This is imperfect; in the unlikely case that a setup.py # custom command or even custom Distribution class defines an argument # of the same name then we will break that. However there's a catch22 # here that we can't just do full argument parsing right here, because # we don't yet know *how* to parse all possible command-line arguments. if '--no-git' in argv: config['use_git'] = False argv.remove('--no-git') if '--offline' in argv: config['offline'] = True argv.remove('--offline') return config def run(self): strategies = ['local_directory', 'local_file', 'index'] dist = None # First, remove any previously imported versions of astropy_helpers; # this is necessary for nested installs where one package's installer # is installing another package via setuptools.sandbox.run_setup, as in # the case of setup_requires for key in list(sys.modules): try: if key == PACKAGE_NAME or key.startswith(PACKAGE_NAME + '.'): del sys.modules[key] except AttributeError: # Sometimes mysterious non-string things can turn up in # sys.modules continue # Check to see if the path is a submodule self.is_submodule = self._check_submodule() for strategy in strategies: method = getattr(self, 'get_{0}_dist'.format(strategy)) dist = method() if dist is not None: break else: raise _AHBootstrapSystemExit( "No source found for the {0!r} package; {0} must be " "available and importable as a prerequisite to building " "or installing this package.".format(PACKAGE_NAME)) # This is a bit hacky, but if astropy_helpers was loaded from a # directory/submodule its Distribution object gets a "precedence" of # "DEVELOP_DIST". However, in other cases it gets a precedence of # "EGG_DIST". However, when activing the distribution it will only be # placed early on sys.path if it is treated as an EGG_DIST, so always # do that dist = dist.clone(precedence=pkg_resources.EGG_DIST) # Otherwise we found a version of astropy-helpers, so we're done # Just active the found distribution on sys.path--if we did a # download this usually happens automatically but it doesn't hurt to # do it again # Note: Adding the dist to the global working set also activates it # (makes it importable on sys.path) by default. try: pkg_resources.working_set.add(dist, replace=True) except TypeError: # Some (much) older versions of setuptools do not have the # replace=True option here. These versions are old enough that all # bets may be off anyways, but it's easy enough to work around just # in case... if dist.key in pkg_resources.working_set.by_key: del pkg_resources.working_set.by_key[dist.key] pkg_resources.working_set.add(dist) @property def config(self): """ A `dict` containing the options this `_Bootstrapper` was configured with. """ return dict((optname, getattr(self, optname)) for optname, _ in CFG_OPTIONS if hasattr(self, optname)) def get_local_directory_dist(self): """ Handle importing a vendored package from a subdirectory of the source distribution. """ if not os.path.isdir(self.path): return log.info('Attempting to import astropy_helpers from {0} {1!r}'.format( 'submodule' if self.is_submodule else 'directory', self.path)) dist = self._directory_import() if dist is None: log.warn( 'The requested path {0!r} for importing {1} does not ' 'exist, or does not contain a copy of the {1} ' 'package.'.format(self.path, PACKAGE_NAME)) elif self.auto_upgrade and not self.is_submodule: # A version of astropy-helpers was found on the available path, but # check to see if a bugfix release is available on PyPI upgrade = self._do_upgrade(dist) if upgrade is not None: dist = upgrade return dist def get_local_file_dist(self): """ Handle importing from a source archive; this also uses setup_requires but points easy_install directly to the source archive. """ if not os.path.isfile(self.path): return log.info('Attempting to unpack and import astropy_helpers from ' '{0!r}'.format(self.path)) try: dist = self._do_download(find_links=[self.path]) except Exception as e: if DEBUG: raise log.warn( 'Failed to import {0} from the specified archive {1!r}: ' '{2}'.format(PACKAGE_NAME, self.path, str(e))) dist = None if dist is not None and self.auto_upgrade: # A version of astropy-helpers was found on the available path, but # check to see if a bugfix release is available on PyPI upgrade = self._do_upgrade(dist) if upgrade is not None: dist = upgrade return dist def get_index_dist(self): if not self.download: log.warn('Downloading {0!r} disabled.'.format(DIST_NAME)) return None log.warn( "Downloading {0!r}; run setup.py with the --offline option to " "force offline installation.".format(DIST_NAME)) try: dist = self._do_download() except Exception as e: if DEBUG: raise log.warn( 'Failed to download and/or install {0!r} from {1!r}:\n' '{2}'.format(DIST_NAME, self.index_url, str(e))) dist = None # No need to run auto-upgrade here since we've already presumably # gotten the most up-to-date version from the package index return dist def _directory_import(self): """ Import astropy_helpers from the given path, which will be added to sys.path. Must return True if the import succeeded, and False otherwise. """ # Return True on success, False on failure but download is allowed, and # otherwise raise SystemExit path = os.path.abspath(self.path) # Use an empty WorkingSet rather than the man # pkg_resources.working_set, since on older versions of setuptools this # will invoke a VersionConflict when trying to install an upgrade ws = pkg_resources.WorkingSet([]) ws.add_entry(path) dist = ws.by_key.get(DIST_NAME) if dist is None: # We didn't find an egg-info/dist-info in the given path, but if a # setup.py exists we can generate it setup_py = os.path.join(path, 'setup.py') if os.path.isfile(setup_py): with _silence(): run_setup(os.path.join(path, 'setup.py'), ['egg_info']) for dist in pkg_resources.find_distributions(path, True): # There should be only one... return dist return dist def _do_download(self, version='', find_links=None): if find_links: allow_hosts = '' index_url = None else: allow_hosts = None index_url = self.index_url # Annoyingly, setuptools will not handle other arguments to # Distribution (such as options) before handling setup_requires, so it # is not straightforward to programmatically augment the arguments which # are passed to easy_install class _Distribution(Distribution): def get_option_dict(self, command_name): opts = Distribution.get_option_dict(self, command_name) if command_name == 'easy_install': if find_links is not None: opts['find_links'] = ('setup script', find_links) if index_url is not None: opts['index_url'] = ('setup script', index_url) if allow_hosts is not None: opts['allow_hosts'] = ('setup script', allow_hosts) return opts if version: req = '{0}=={1}'.format(DIST_NAME, version) else: req = DIST_NAME attrs = {'setup_requires': [req]} try: if DEBUG: _Distribution(attrs=attrs) else: with _silence(): _Distribution(attrs=attrs) # If the setup_requires succeeded it will have added the new dist to # the main working_set return pkg_resources.working_set.by_key.get(DIST_NAME) except Exception as e: if DEBUG: raise msg = 'Error retrieving {0} from {1}:\n{2}' if find_links: source = find_links[0] elif index_url != INDEX_URL: source = index_url else: source = 'PyPI' raise Exception(msg.format(DIST_NAME, source, repr(e))) def _do_upgrade(self, dist): # Build up a requirement for a higher bugfix release but a lower minor # release (so API compatibility is guaranteed) next_version = _next_version(dist.parsed_version) req = pkg_resources.Requirement.parse( '{0}>{1},<{2}'.format(DIST_NAME, dist.version, next_version)) package_index = PackageIndex(index_url=self.index_url) upgrade = package_index.obtain(req) if upgrade is not None: return self._do_download(version=upgrade.version) def _check_submodule(self): """ Check if the given path is a git submodule. See the docstrings for ``_check_submodule_using_git`` and ``_check_submodule_no_git`` for further details. """ if (self.path is None or (os.path.exists(self.path) and not os.path.isdir(self.path))): return False if self.use_git: return self._check_submodule_using_git() else: return self._check_submodule_no_git() def _check_submodule_using_git(self): """ Check if the given path is a git submodule. If so, attempt to initialize and/or update the submodule if needed. This function makes calls to the ``git`` command in subprocesses. The ``_check_submodule_no_git`` option uses pure Python to check if the given path looks like a git submodule, but it cannot perform updates. """ cmd = ['git', 'submodule', 'status', '--', self.path] try: log.info('Running `{0}`; use the --no-git option to disable git ' 'commands'.format(' '.join(cmd))) returncode, stdout, stderr = run_cmd(cmd) except _CommandNotFound: # The git command simply wasn't found; this is most likely the # case on user systems that don't have git and are simply # trying to install the package from PyPI or a source # distribution. Silently ignore this case and simply don't try # to use submodules return False stderr = stderr.strip() if returncode != 0 and stderr: # Unfortunately the return code alone cannot be relied on, as # earlier versions of git returned 0 even if the requested submodule # does not exist # This is a warning that occurs in perl (from running git submodule) # which only occurs with a malformatted locale setting which can # happen sometimes on OSX. See again # https://github.com/astropy/astropy/issues/2749 perl_warning = ('perl: warning: Falling back to the standard locale ' '("C").') if not stderr.strip().endswith(perl_warning): # Some other unknown error condition occurred log.warn('git submodule command failed ' 'unexpectedly:\n{0}'.format(stderr)) return False # Output of `git submodule status` is as follows: # # 1: Status indicator: '-' for submodule is uninitialized, '+' if # submodule is initialized but is not at the commit currently indicated # in .gitmodules (and thus needs to be updated), or 'U' if the # submodule is in an unstable state (i.e. has merge conflicts) # # 2. SHA-1 hash of the current commit of the submodule (we don't really # need this information but it's useful for checking that the output is # correct) # # 3. The output of `git describe` for the submodule's current commit # hash (this includes for example what branches the commit is on) but # only if the submodule is initialized. We ignore this information for # now _git_submodule_status_re = re.compile( '^(?P[+-U ])(?P[0-9a-f]{40}) ' '(?P\S+)( .*)?$') # The stdout should only contain one line--the status of the # requested submodule m = _git_submodule_status_re.match(stdout) if m: # Yes, the path *is* a git submodule self._update_submodule(m.group('submodule'), m.group('status')) return True else: log.warn( 'Unexpected output from `git submodule status`:\n{0}\n' 'Will attempt import from {1!r} regardless.'.format( stdout, self.path)) return False def _check_submodule_no_git(self): """ Like ``_check_submodule_using_git``, but simply parses the .gitmodules file to determine if the supplied path is a git submodule, and does not exec any subprocesses. This can only determine if a path is a submodule--it does not perform updates, etc. This function may need to be updated if the format of the .gitmodules file is changed between git versions. """ gitmodules_path = os.path.abspath('.gitmodules') if not os.path.isfile(gitmodules_path): return False # This is a minimal reader for gitconfig-style files. It handles a few of # the quirks that make gitconfig files incompatible with ConfigParser-style # files, but does not support the full gitconfig syntax (just enough # needed to read a .gitmodules file). gitmodules_fileobj = io.StringIO() # Must use io.open for cross-Python-compatible behavior wrt unicode with io.open(gitmodules_path) as f: for line in f: # gitconfig files are more flexible with leading whitespace; just # go ahead and remove it line = line.lstrip() # comments can start with either # or ; if line and line[0] in (':', ';'): continue gitmodules_fileobj.write(line) gitmodules_fileobj.seek(0) cfg = RawConfigParser() try: cfg.readfp(gitmodules_fileobj) except Exception as exc: log.warn('Malformatted .gitmodules file: {0}\n' '{1} cannot be assumed to be a git submodule.'.format( exc, self.path)) return False for section in cfg.sections(): if not cfg.has_option(section, 'path'): continue submodule_path = cfg.get(section, 'path').rstrip(os.sep) if submodule_path == self.path.rstrip(os.sep): return True return False def _update_submodule(self, submodule, status): if status == ' ': # The submodule is up to date; no action necessary return elif status == '-': if self.offline: raise _AHBootstrapSystemExit( "Cannot initialize the {0} submodule in --offline mode; " "this requires being able to clone the submodule from an " "online repository.".format(submodule)) cmd = ['update', '--init'] action = 'Initializing' elif status == '+': cmd = ['update'] action = 'Updating' if self.offline: cmd.append('--no-fetch') elif status == 'U': raise _AHBoostrapSystemExit( 'Error: Submodule {0} contains unresolved merge conflicts. ' 'Please complete or abandon any changes in the submodule so that ' 'it is in a usable state, then try again.'.format(submodule)) else: log.warn('Unknown status {0!r} for git submodule {1!r}. Will ' 'attempt to use the submodule as-is, but try to ensure ' 'that the submodule is in a clean state and contains no ' 'conflicts or errors.\n{2}'.format(status, submodule, _err_help_msg)) return err_msg = None cmd = ['git', 'submodule'] + cmd + ['--', submodule] log.warn('{0} {1} submodule with: `{2}`'.format( action, submodule, ' '.join(cmd))) try: log.info('Running `{0}`; use the --no-git option to disable git ' 'commands'.format(' '.join(cmd))) returncode, stdout, stderr = run_cmd(cmd) except OSError as e: err_msg = str(e) else: if returncode != 0: err_msg = stderr if err_msg is not None: log.warn('An unexpected error occurred updating the git submodule ' '{0!r}:\n{1}\n{2}'.format(submodule, err_msg, _err_help_msg)) class _CommandNotFound(OSError): """ An exception raised when a command run with run_cmd is not found on the system. """ def run_cmd(cmd): """ Run a command in a subprocess, given as a list of command-line arguments. Returns a ``(returncode, stdout, stderr)`` tuple. """ try: p = sp.Popen(cmd, stdout=sp.PIPE, stderr=sp.PIPE) # XXX: May block if either stdout or stderr fill their buffers; # however for the commands this is currently used for that is # unlikely (they should have very brief output) stdout, stderr = p.communicate() except OSError as e: if DEBUG: raise if e.errno == errno.ENOENT: msg = 'Command not found: `{0}`'.format(' '.join(cmd)) raise _CommandNotFound(msg, cmd) else: raise _AHBoostrapSystemExit( 'An unexpected error occurred when running the ' '`{0}` command:\n{1}'.format(' '.join(cmd), str(e))) # Can fail of the default locale is not configured properly. See # https://github.com/astropy/astropy/issues/2749. For the purposes under # consideration 'latin1' is an acceptable fallback. try: stdio_encoding = locale.getdefaultlocale()[1] or 'latin1' except ValueError: # Due to an OSX oddity locale.getdefaultlocale() can also crash # depending on the user's locale/language settings. See: # http://bugs.python.org/issue18378 stdio_encoding = 'latin1' # Unlikely to fail at this point but even then let's be flexible if not isinstance(stdout, _text_type): stdout = stdout.decode(stdio_encoding, 'replace') if not isinstance(stderr, _text_type): stderr = stderr.decode(stdio_encoding, 'replace') return (p.returncode, stdout, stderr) def _next_version(version): """ Given a parsed version from pkg_resources.parse_version, returns a new version string with the next minor version. Examples ======== >>> _next_version(pkg_resources.parse_version('1.2.3')) '1.3.0' """ if hasattr(version, 'base_version'): # New version parsing from setuptools >= 8.0 if version.base_version: parts = version.base_version.split('.') else: parts = [] else: parts = [] for part in version: if part.startswith('*'): break parts.append(part) parts = [int(p) for p in parts] if len(parts) < 3: parts += [0] * (3 - len(parts)) major, minor, micro = parts[:3] return '{0}.{1}.{2}'.format(major, minor + 1, 0) class _DummyFile(object): """A noop writeable object.""" errors = '' # Required for Python 3.x encoding = 'utf-8' def write(self, s): pass def flush(self): pass @contextlib.contextmanager def _silence(): """A context manager that silences sys.stdout and sys.stderr.""" old_stdout = sys.stdout old_stderr = sys.stderr sys.stdout = _DummyFile() sys.stderr = _DummyFile() exception_occurred = False try: yield except: exception_occurred = True # Go ahead and clean up so that exception handling can work normally sys.stdout = old_stdout sys.stderr = old_stderr raise if not exception_occurred: sys.stdout = old_stdout sys.stderr = old_stderr _err_help_msg = """ If the problem persists consider installing astropy_helpers manually using pip (`pip install astropy_helpers`) or by manually downloading the source archive, extracting it, and installing by running `python setup.py install` from the root of the extracted source code. """ class _AHBootstrapSystemExit(SystemExit): def __init__(self, *args): if not args: msg = 'An unknown problem occurred bootstrapping astropy_helpers.' else: msg = args[0] msg += '\n' + _err_help_msg super(_AHBootstrapSystemExit, self).__init__(msg, *args[1:]) if sys.version_info[:2] < (2, 7): # In Python 2.6 the distutils log does not log warnings, errors, etc. to # stderr so we have to wrap it to ensure consistency at least in this # module import distutils class log(object): def __getattr__(self, attr): return getattr(distutils.log, attr) def warn(self, msg, *args): self._log_to_stderr(distutils.log.WARN, msg, *args) def error(self, msg): self._log_to_stderr(distutils.log.ERROR, msg, *args) def fatal(self, msg): self._log_to_stderr(distutils.log.FATAL, msg, *args) def log(self, level, msg, *args): if level in (distutils.log.WARN, distutils.log.ERROR, distutils.log.FATAL): self._log_to_stderr(level, msg, *args) else: distutils.log.log(level, msg, *args) def _log_to_stderr(self, level, msg, *args): # This is the only truly 'public' way to get the current threshold # of the log current_threshold = distutils.log.set_threshold(distutils.log.WARN) distutils.log.set_threshold(current_threshold) if level >= current_threshold: if args: msg = msg % args sys.stderr.write('%s\n' % msg) sys.stderr.flush() log = log() BOOTSTRAPPER = _Bootstrapper.main() def use_astropy_helpers(**kwargs): """ Ensure that the `astropy_helpers` module is available and is importable. This supports automatic submodule initialization if astropy_helpers is included in a project as a git submodule, or will download it from PyPI if necessary. Parameters ---------- path : str or None, optional A filesystem path relative to the root of the project's source code that should be added to `sys.path` so that `astropy_helpers` can be imported from that path. If the path is a git submodule it will automatically be initialized and/or updated. The path may also be to a ``.tar.gz`` archive of the astropy_helpers source distribution. In this case the archive is automatically unpacked and made temporarily available on `sys.path` as a ``.egg`` archive. If `None` skip straight to downloading. download_if_needed : bool, optional If the provided filesystem path is not found an attempt will be made to download astropy_helpers from PyPI. It will then be made temporarily available on `sys.path` as a ``.egg`` archive (using the ``setup_requires`` feature of setuptools. If the ``--offline`` option is given at the command line the value of this argument is overridden to `False`. index_url : str, optional If provided, use a different URL for the Python package index than the main PyPI server. use_git : bool, optional If `False` no git commands will be used--this effectively disables support for git submodules. If the ``--no-git`` option is given at the command line the value of this argument is overridden to `False`. auto_upgrade : bool, optional By default, when installing a package from a non-development source distribution ah_boostrap will try to automatically check for patch releases to astropy-helpers on PyPI and use the patched version over any bundled versions. Setting this to `False` will disable that functionality. If the ``--offline`` option is given at the command line the value of this argument is overridden to `False`. offline : bool, optional If `False` disable all actions that require an internet connection, including downloading packages from the package index and fetching updates to any git submodule. Defaults to `True`. """ global BOOTSTRAPPER config = BOOTSTRAPPER.config config.update(**kwargs) # Create a new bootstrapper with the updated configuration and run it BOOTSTRAPPER = _Bootstrapper(**config) BOOTSTRAPPER.run() reproject-0.3.2/astropy_helpers/astropy_helpers/0000755000077000000240000000000013173066302022076 5ustar tomstaff00000000000000reproject-0.3.2/astropy_helpers/astropy_helpers/__init__.py0000644000077000000240000000345412660615525024224 0ustar tomstaff00000000000000try: from .version import version as __version__ from .version import githash as __githash__ except ImportError: __version__ = '' __githash__ = '' # If we've made it as far as importing astropy_helpers, we don't need # ah_bootstrap in sys.modules anymore. Getting rid of it is actually necessary # if the package we're installing has a setup_requires of another package that # uses astropy_helpers (and possibly a different version at that) # See https://github.com/astropy/astropy/issues/3541 import sys if 'ah_bootstrap' in sys.modules: del sys.modules['ah_bootstrap'] # Note, this is repeated from ah_bootstrap.py, but is here too in case this # astropy-helpers was upgraded to from an older version that did not have this # check in its ah_bootstrap. # matplotlib can cause problems if it is imported from within a call of # run_setup(), because in some circumstances it will try to write to the user's # home directory, resulting in a SandboxViolation. See # https://github.com/matplotlib/matplotlib/pull/4165 # Making sure matplotlib, if it is available, is imported early in the setup # process can mitigate this (note importing matplotlib.pyplot has the same # issue) try: import matplotlib matplotlib.use('Agg') import matplotlib.pyplot except: # Ignore if this fails for *any* reason* pass import os # Ensure that all module-level code in astropy or other packages know that # we're in setup mode: if ('__main__' in sys.modules and hasattr(sys.modules['__main__'], '__file__')): filename = os.path.basename(sys.modules['__main__'].__file__) if filename.rstrip('co') == 'setup.py': if sys.version_info[0] >= 3: import builtins else: import __builtin__ as builtins builtins._ASTROPY_SETUP_ = True del filename reproject-0.3.2/astropy_helpers/astropy_helpers/commands/0000755000077000000240000000000013173066302023677 5ustar tomstaff00000000000000reproject-0.3.2/astropy_helpers/astropy_helpers/commands/__init__.py0000644000077000000240000000000012521647746026013 0ustar tomstaff00000000000000reproject-0.3.2/astropy_helpers/astropy_helpers/commands/_dummy.py0000644000077000000240000000557412660615525025565 0ustar tomstaff00000000000000""" Provides a base class for a 'dummy' setup.py command that has no functionality (probably due to a missing requirement). This dummy command can raise an exception when it is run, explaining to the user what dependencies must be met to use this command. The reason this is at all tricky is that we want the command to be able to provide this message even when the user passes arguments to the command. If we don't know ahead of time what arguments the command can take, this is difficult, because distutils does not allow unknown arguments to be passed to a setup.py command. This hacks around that restriction to provide a useful error message even when a user passes arguments to the dummy implementation of a command. Use this like: try: from some_dependency import SetupCommand except ImportError: from ._dummy import _DummyCommand class SetupCommand(_DummyCommand): description = \ 'Implementation of SetupCommand from some_dependency; ' 'some_dependency must be installed to run this command' # This is the message that will be raised when a user tries to # run this command--define it as a class attribute. error_msg = \ "The 'setup_command' command requires the some_dependency " "package to be installed and importable." """ import sys from setuptools import Command from distutils.errors import DistutilsArgError from textwrap import dedent class _DummyCommandMeta(type): """ Causes an exception to be raised on accessing attributes of a command class so that if ``./setup.py command_name`` is run with additional command-line options we can provide a useful error message instead of the default that tells users the options are unrecognized. """ def __init__(cls, name, bases, members): if bases == (Command, object): # This is the _DummyCommand base class, presumably return if not hasattr(cls, 'description'): raise TypeError( "_DummyCommand subclass must have a 'description' " "attribute.") if not hasattr(cls, 'error_msg'): raise TypeError( "_DummyCommand subclass must have an 'error_msg' " "attribute.") def __getattribute__(cls, attr): if attr in ('description', 'error_msg'): # Allow cls.description to work so that `./setup.py # --help-commands` still works return super(_DummyCommandMeta, cls).__getattribute__(attr) raise DistutilsArgError(cls.error_msg) if sys.version_info[0] < 3: exec(dedent(""" class _DummyCommand(Command, object): __metaclass__ = _DummyCommandMeta """)) else: exec(dedent(""" class _DummyCommand(Command, object, metaclass=_DummyCommandMeta): pass """)) reproject-0.3.2/astropy_helpers/astropy_helpers/commands/_test_compat.py0000644000077000000240000002666513173066253026756 0ustar tomstaff00000000000000""" Old implementation of ``./setup.py test`` command. This has been moved to astropy.tests as of Astropy v1.1.0, but a copy of the implementation is kept here for backwards compatibility. """ from __future__ import absolute_import, unicode_literals import inspect import os import shutil import subprocess import sys import tempfile from setuptools import Command from ..compat import _fix_user_options PY3 = sys.version_info[0] == 3 class AstropyTest(Command, object): description = 'Run the tests for this package' user_options = [ ('package=', 'P', "The name of a specific package to test, e.g. 'io.fits' or 'utils'. " "If nothing is specified, all default tests are run."), ('test-path=', 't', 'Specify a test location by path. If a relative path to a .py file, ' 'it is relative to the built package, so e.g., a leading "astropy/" ' 'is necessary. If a relative path to a .rst file, it is relative to ' 'the directory *below* the --docs-path directory, so a leading ' '"docs/" is usually necessary. May also be an absolute path.'), ('verbose-results', 'V', 'Turn on verbose output from pytest.'), ('plugins=', 'p', 'Plugins to enable when running pytest.'), ('pastebin=', 'b', "Enable pytest pastebin output. Either 'all' or 'failed'."), ('args=', 'a', 'Additional arguments to be passed to pytest.'), ('remote-data', 'R', 'Run tests that download remote data.'), ('pep8', '8', 'Enable PEP8 checking and disable regular tests. ' 'Requires the pytest-pep8 plugin.'), ('pdb', 'd', 'Start the interactive Python debugger on errors.'), ('coverage', 'c', 'Create a coverage report. Requires the coverage package.'), ('open-files', 'o', 'Fail if any tests leave files open. Requires the ' 'psutil package.'), ('parallel=', 'j', 'Run the tests in parallel on the specified number of ' 'CPUs. If negative, all the cores on the machine will be ' 'used. Requires the pytest-xdist plugin.'), ('docs-path=', None, 'The path to the documentation .rst files. If not provided, and ' 'the current directory contains a directory called "docs", that ' 'will be used.'), ('skip-docs', None, "Don't test the documentation .rst files."), ('repeat=', None, 'How many times to repeat each test (can be used to check for ' 'sporadic failures).'), ('temp-root=', None, 'The root directory in which to create the temporary testing files. ' 'If unspecified the system default is used (e.g. /tmp) as explained ' 'in the documentation for tempfile.mkstemp.') ] user_options = _fix_user_options(user_options) package_name = '' def initialize_options(self): self.package = None self.test_path = None self.verbose_results = False self.plugins = None self.pastebin = None self.args = None self.remote_data = False self.pep8 = False self.pdb = False self.coverage = False self.open_files = False self.parallel = 0 self.docs_path = None self.skip_docs = False self.repeat = None self.temp_root = None def finalize_options(self): # Normally we would validate the options here, but that's handled in # run_tests pass # Most of the test runner arguments have the same name as attributes on # this command class, with one exception (for now) _test_runner_arg_attr_map = { 'verbose': 'verbose_results' } def generate_testing_command(self): """ Build a Python script to run the tests. """ cmd_pre = '' # Commands to run before the test function cmd_post = '' # Commands to run after the test function if self.coverage: pre, post = self._generate_coverage_commands() cmd_pre += pre cmd_post += post def get_attr(arg): attr = self._test_runner_arg_attr_map.get(arg, arg) return getattr(self, attr) test_args = filter(lambda arg: hasattr(self, arg), self._get_test_runner_args()) test_args = ', '.join('{0}={1!r}'.format(arg, get_attr(arg)) for arg in test_args) if PY3: set_flag = "import builtins; builtins._ASTROPY_TEST_ = True" else: set_flag = "import __builtin__; __builtin__._ASTROPY_TEST_ = True" cmd = ('{cmd_pre}{0}; import {1.package_name}, sys; result = ' '{1.package_name}.test({test_args}); {cmd_post}' 'sys.exit(result)') return cmd.format(set_flag, self, cmd_pre=cmd_pre, cmd_post=cmd_post, test_args=test_args) def _validate_required_deps(self): """ This method checks that any required modules are installed before running the tests. """ try: import astropy except ImportError: raise ImportError( "The 'test' command requires the astropy package to be " "installed and importable.") def run(self): """ Run the tests! """ # Ensure there is a doc path if self.docs_path is None: if os.path.exists('docs'): self.docs_path = os.path.abspath('docs') # Build a testing install of the package self._build_temp_install() # Ensure all required packages are installed self._validate_required_deps() # Run everything in a try: finally: so that the tmp dir gets deleted. try: # Construct this modules testing command cmd = self.generate_testing_command() # Run the tests in a subprocess--this is necessary since # new extension modules may have appeared, and this is the # easiest way to set up a new environment # On Python 3.x prior to 3.3, the creation of .pyc files # is not atomic. py.test jumps through some hoops to make # this work by parsing import statements and carefully # importing files atomically. However, it can't detect # when __import__ is used, so its carefulness still fails. # The solution here (admittedly a bit of a hack), is to # turn off the generation of .pyc files altogether by # passing the `-B` switch to `python`. This does mean # that each core will have to compile .py file to bytecode # itself, rather than getting lucky and borrowing the work # already done by another core. Compilation is an # insignificant fraction of total testing time, though, so # it's probably not worth worrying about. retcode = subprocess.call([sys.executable, '-B', '-c', cmd], cwd=self.testing_path, close_fds=False) finally: # Remove temporary directory shutil.rmtree(self.tmp_dir) raise SystemExit(retcode) def _build_temp_install(self): """ Build the package and copy the build to a temporary directory for the purposes of testing this avoids creating pyc and __pycache__ directories inside the build directory """ self.reinitialize_command('build', inplace=True) self.run_command('build') build_cmd = self.get_finalized_command('build') new_path = os.path.abspath(build_cmd.build_lib) # On OSX the default path for temp files is under /var, but in most # cases on OSX /var is actually a symlink to /private/var; ensure we # dereference that link, because py.test is very sensitive to relative # paths... tmp_dir = tempfile.mkdtemp(prefix=self.package_name + '-test-', dir=self.temp_root) self.tmp_dir = os.path.realpath(tmp_dir) self.testing_path = os.path.join(self.tmp_dir, os.path.basename(new_path)) shutil.copytree(new_path, self.testing_path) new_docs_path = os.path.join(self.tmp_dir, os.path.basename(self.docs_path)) shutil.copytree(self.docs_path, new_docs_path) self.docs_path = new_docs_path shutil.copy('setup.cfg', self.tmp_dir) def _generate_coverage_commands(self): """ This method creates the post and pre commands if coverage is to be generated """ if self.parallel != 0: raise ValueError( "--coverage can not be used with --parallel") try: import coverage except ImportError: raise ImportError( "--coverage requires that the coverage package is " "installed.") # Don't use get_pkg_data_filename here, because it # requires importing astropy.config and thus screwing # up coverage results for those packages. coveragerc = os.path.join( self.testing_path, self.package_name, 'tests', 'coveragerc') # We create a coveragerc that is specific to the version # of Python we're running, so that we can mark branches # as being specifically for Python 2 or Python 3 with open(coveragerc, 'r') as fd: coveragerc_content = fd.read() if PY3: ignore_python_version = '2' else: ignore_python_version = '3' coveragerc_content = coveragerc_content.replace( "{ignore_python_version}", ignore_python_version).replace( "{packagename}", self.package_name) tmp_coveragerc = os.path.join(self.tmp_dir, 'coveragerc') with open(tmp_coveragerc, 'wb') as tmp: tmp.write(coveragerc_content.encode('utf-8')) cmd_pre = ( 'import coverage; ' 'cov = coverage.coverage(data_file="{0}", config_file="{1}"); ' 'cov.start();'.format( os.path.abspath(".coverage"), tmp_coveragerc)) cmd_post = ( 'cov.stop(); ' 'from astropy.tests.helper import _save_coverage; ' '_save_coverage(cov, result, "{0}", "{1}");'.format( os.path.abspath('.'), self.testing_path)) return cmd_pre, cmd_post def _get_test_runner_args(self): """ A hack to determine what arguments are supported by the package's test() function. In the future there should be a more straightforward API to determine this (really it should be determined by the ``TestRunner`` class for whatever version of Astropy is in use). """ if PY3: import builtins builtins._ASTROPY_TEST_ = True else: import __builtin__ __builtin__._ASTROPY_TEST_ = True try: pkg = __import__(self.package_name) if not hasattr(pkg, 'test'): raise ImportError( 'package {0} does not have a {0}.test() function as ' 'required by the Astropy test runner'.format(package_name)) argspec = inspect.getargspec(pkg.test) return argspec.args finally: if PY3: del builtins._ASTROPY_TEST_ else: del __builtin__._ASTROPY_TEST_ reproject-0.3.2/astropy_helpers/astropy_helpers/commands/build_ext.py0000644000077000000240000004566513173066253026255 0ustar tomstaff00000000000000import errno import os import re import shlex import shutil import subprocess import sys import textwrap from distutils import log, ccompiler, sysconfig from distutils.cmd import Command from distutils.core import Extension from distutils.ccompiler import get_default_compiler from setuptools.command.build_ext import build_ext as SetuptoolsBuildExt from ..utils import get_numpy_include_path, invalidate_caches, classproperty from ..version_helpers import get_pkg_version_module def should_build_with_cython(package, release=None): """Returns the previously used Cython version (or 'unknown' if not previously built) if Cython should be used to build extension modules from pyx files. If the ``release`` parameter is not specified an attempt is made to determine the release flag from `astropy.version`. """ try: version_module = __import__(package + '.cython_version', fromlist=['release', 'cython_version']) except ImportError: version_module = None if release is None and version_module is not None: try: release = version_module.release except AttributeError: pass try: cython_version = version_module.cython_version except AttributeError: cython_version = 'unknown' # Only build with Cython if, of course, Cython is installed, we're in a # development version (i.e. not release) or the Cython-generated source # files haven't been created yet (cython_version == 'unknown'). The latter # case can happen even when release is True if checking out a release tag # from the repository have_cython = False try: import Cython have_cython = True except ImportError: pass if have_cython and (not release or cython_version == 'unknown'): return cython_version else: return False _compiler_versions = {} def get_compiler_version(compiler): if compiler in _compiler_versions: return _compiler_versions[compiler] # Different flags to try to get the compiler version # TODO: It might be worth making this configurable to support # arbitrary odd compilers; though all bets may be off in such # cases anyway flags = ['--version', '--Version', '-version', '-Version', '-v', '-V'] def try_get_version(flag): process = subprocess.Popen( shlex.split(compiler, posix=('win' not in sys.platform)) + [flag], stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = process.communicate() if process.returncode != 0: return 'unknown' output = stdout.strip().decode('latin-1') # Safest bet if not output: # Some compilers return their version info on stderr output = stderr.strip().decode('latin-1') if not output: output = 'unknown' return output for flag in flags: version = try_get_version(flag) if version != 'unknown': break # Cache results to speed up future calls _compiler_versions[compiler] = version return version # TODO: I think this can be reworked without having to create the class # programmatically. def generate_build_ext_command(packagename, release): """ Creates a custom 'build_ext' command that allows for manipulating some of the C extension options at build time. We use a function to build the class since the base class for build_ext may be different depending on certain build-time parameters (for example, we may use Cython's build_ext instead of the default version in distutils). Uses the default distutils.command.build_ext by default. """ class build_ext(SetuptoolsBuildExt, object): package_name = packagename is_release = release _user_options = SetuptoolsBuildExt.user_options[:] _boolean_options = SetuptoolsBuildExt.boolean_options[:] _help_options = SetuptoolsBuildExt.help_options[:] force_rebuild = False _broken_compiler_mapping = [ ('i686-apple-darwin[0-9]*-llvm-gcc-4.2', 'clang') ] # Warning: Spaghetti code ahead. # During setup.py, the setup_helpers module needs the ability to add # items to a command's user_options list. At this stage we don't know # whether or not we can build with Cython, and so don't know for sure # what base class will be used for build_ext; nevertheless we want to # be able to provide a list to add options into. # # Later, once setup() has been called we should have all build # dependencies included via setup_requires available. distutils needs # to be able to access the user_options as a *class* attribute before # the class has been initialized, but we do need to be able to # enumerate the options for the correct base class at that point @classproperty def user_options(cls): from distutils import core if core._setup_distribution is None: # We haven't gotten into setup() yet, and the Distribution has # not yet been initialized return cls._user_options return cls._final_class.user_options @classproperty def boolean_options(cls): # Similar to user_options above from distutils import core if core._setup_distribution is None: # We haven't gotten into setup() yet, and the Distribution has # not yet been initialized return cls._boolean_options return cls._final_class.boolean_options @classproperty def help_options(cls): # Similar to user_options above from distutils import core if core._setup_distribution is None: # We haven't gotten into setup() yet, and the Distribution has # not yet been initialized return cls._help_options return cls._final_class.help_options @classproperty(lazy=True) def _final_class(cls): """ Late determination of what the build_ext base class should be, depending on whether or not Cython is available. """ uses_cython = should_build_with_cython(cls.package_name, cls.is_release) if uses_cython: # We need to decide late on whether or not to use Cython's # build_ext (since Cython may not be available earlier in the # setup.py if it was brought in via setup_requires) from Cython.Distutils import build_ext as base_cls else: base_cls = SetuptoolsBuildExt # Create and return an instance of a new class based on this class # using one of the above possible base classes def merge_options(attr): base = getattr(base_cls, attr) ours = getattr(cls, '_' + attr) all_base = set(opt[0] for opt in base) return base + [opt for opt in ours if opt[0] not in all_base] boolean_options = (base_cls.boolean_options + [opt for opt in cls._boolean_options if opt not in base_cls.boolean_options]) members = dict(cls.__dict__) members.update({ 'user_options': merge_options('user_options'), 'help_options': merge_options('help_options'), 'boolean_options': boolean_options, 'uses_cython': uses_cython, }) # Update the base class for the original build_ext command build_ext.__bases__ = (base_cls, object) # Create a new class for the existing class, but now with the # appropriate base class depending on whether or not to use Cython. # Ensure that object is one of the bases to make a new-style class. return type(cls.__name__, (build_ext,), members) def __new__(cls, *args, **kwargs): # By the time the command is actually instantialized, the # Distribution instance for the build has been instantiated, which # means setup_requires has been processed--now we can determine # what base class we can use for the actual build, and return an # instance of a build_ext command that uses that base class (right # now the options being Cython.Distutils.build_ext, or the stock # setuptools build_ext) new_cls = super(build_ext, cls._final_class).__new__( cls._final_class) # Since the new cls is not a subclass of the original cls, we must # manually call its __init__ new_cls.__init__(*args, **kwargs) return new_cls def finalize_options(self): # Add a copy of the _compiler.so module as well, but only if there # are in fact C modules to compile (otherwise there's no reason to # include a record of the compiler used) # Note, self.extensions may not be set yet, but # self.distribution.ext_modules is where any extension modules # passed to setup() can be found self._adjust_compiler() extensions = self.distribution.ext_modules if extensions: src_path = os.path.relpath( os.path.join(os.path.dirname(__file__), 'src')) shutil.copy2(os.path.join(src_path, 'compiler.c'), os.path.join(self.package_name, '_compiler.c')) ext = Extension(self.package_name + '._compiler', [os.path.join(self.package_name, '_compiler.c')]) extensions.insert(0, ext) super(build_ext, self).finalize_options() # Generate if self.uses_cython: try: from Cython import __version__ as cython_version except ImportError: # This shouldn't happen if we made it this far cython_version = None if (cython_version is not None and cython_version != self.uses_cython): self.force_rebuild = True # Update the used cython version self.uses_cython = cython_version # Regardless of the value of the '--force' option, force a rebuild # if the debug flag changed from the last build if self.force_rebuild: self.force = True def run(self): # For extensions that require 'numpy' in their include dirs, # replace 'numpy' with the actual paths np_include = get_numpy_include_path() for extension in self.extensions: if 'numpy' in extension.include_dirs: idx = extension.include_dirs.index('numpy') extension.include_dirs.insert(idx, np_include) extension.include_dirs.remove('numpy') self._check_cython_sources(extension) super(build_ext, self).run() # Update cython_version.py if building with Cython try: cython_version = get_pkg_version_module( packagename, fromlist=['cython_version'])[0] except (AttributeError, ImportError): cython_version = 'unknown' if self.uses_cython and self.uses_cython != cython_version: package_dir = os.path.relpath(packagename) cython_py = os.path.join(package_dir, 'cython_version.py') with open(cython_py, 'w') as f: f.write('# Generated file; do not modify\n') f.write('cython_version = {0!r}\n'.format(self.uses_cython)) if os.path.isdir(self.build_lib): # The build/lib directory may not exist if the build_py # command was not previously run, which may sometimes be # the case self.copy_file(cython_py, os.path.join(self.build_lib, cython_py), preserve_mode=False) invalidate_caches() def _adjust_compiler(self): """ This function detects broken compilers and switches to another. If the environment variable CC is explicitly set, or a compiler is specified on the commandline, no override is performed -- the purpose here is to only override a default compiler. The specific compilers with problems are: * The default compiler in XCode-4.2, llvm-gcc-4.2, segfaults when compiling wcslib. The set of broken compilers can be updated by changing the compiler_mapping variable. It is a list of 2-tuples where the first in the pair is a regular expression matching the version of the broken compiler, and the second is the compiler to change to. """ if 'CC' in os.environ: # Check that CC is not set to llvm-gcc-4.2 c_compiler = os.environ['CC'] try: version = get_compiler_version(c_compiler) except OSError: msg = textwrap.dedent( """ The C compiler set by the CC environment variable: {compiler:s} cannot be found or executed. """.format(compiler=c_compiler)) log.warn(msg) sys.exit(1) for broken, fixed in self._broken_compiler_mapping: if re.match(broken, version): msg = textwrap.dedent( """Compiler specified by CC environment variable ({compiler:s}:{version:s}) will fail to compile {pkg:s}. Please set CC={fixed:s} and try again. You can do this, for example, by running: CC={fixed:s} python setup.py where is the command you ran. """.format(compiler=c_compiler, version=version, pkg=self.package_name, fixed=fixed)) log.warn(msg) sys.exit(1) # If C compiler is set via CC, and isn't broken, we are good to go. We # should definitely not try accessing the compiler specified by # ``sysconfig.get_config_var('CC')`` lower down, because this may fail # if the compiler used to compile Python is missing (and maybe this is # why the user is setting CC). For example, the official Python 2.7.3 # MacOS X binary was compiled with gcc-4.2, which is no longer available # in XCode 4. return if self.compiler is not None: # At this point, self.compiler will be set only if a compiler # was specified in the command-line or via setup.cfg, in which # case we don't do anything return compiler_type = ccompiler.get_default_compiler() if compiler_type == 'unix': # We have to get the compiler this way, as this is the one that is # used if os.environ['CC'] is not set. It is actually read in from # the Python Makefile. Note that this is not necessarily the same # compiler as returned by ccompiler.new_compiler() c_compiler = sysconfig.get_config_var('CC') try: version = get_compiler_version(c_compiler) except OSError: msg = textwrap.dedent( """ The C compiler used to compile Python {compiler:s}, and which is normally used to compile C extensions, is not available. You can explicitly specify which compiler to use by setting the CC environment variable, for example: CC=gcc python setup.py or if you are using MacOS X, you can try: CC=clang python setup.py """.format(compiler=c_compiler)) log.warn(msg) sys.exit(1) for broken, fixed in self._broken_compiler_mapping: if re.match(broken, version): os.environ['CC'] = fixed break def _check_cython_sources(self, extension): """ Where relevant, make sure that the .c files associated with .pyx modules are present (if building without Cython installed). """ # Determine the compiler we'll be using if self.compiler is None: compiler = get_default_compiler() else: compiler = self.compiler # Replace .pyx with C-equivalents, unless c files are missing for jdx, src in enumerate(extension.sources): base, ext = os.path.splitext(src) pyxfn = base + '.pyx' cfn = base + '.c' cppfn = base + '.cpp' if not os.path.isfile(pyxfn): continue if self.uses_cython: extension.sources[jdx] = pyxfn else: if os.path.isfile(cfn): extension.sources[jdx] = cfn elif os.path.isfile(cppfn): extension.sources[jdx] = cppfn else: msg = ( 'Could not find C/C++ file {0}.(c/cpp) for Cython ' 'file {1} when building extension {2}. Cython ' 'must be installed to build from a git ' 'checkout.'.format(base, pyxfn, extension.name)) raise IOError(errno.ENOENT, msg, cfn) # Current versions of Cython use deprecated Numpy API features # the use of which produces a few warnings when compiling. # These additional flags should squelch those warnings. # TODO: Feel free to remove this if/when a Cython update # removes use of the deprecated Numpy API if compiler == 'unix': extension.extra_compile_args.extend([ '-Wp,-w', '-Wno-unused-function']) return build_ext reproject-0.3.2/astropy_helpers/astropy_helpers/commands/build_py.py0000644000077000000240000000265612521647746026106 0ustar tomstaff00000000000000from setuptools.command.build_py import build_py as SetuptoolsBuildPy from ..utils import _get_platlib_dir class AstropyBuildPy(SetuptoolsBuildPy): user_options = SetuptoolsBuildPy.user_options[:] boolean_options = SetuptoolsBuildPy.boolean_options[:] def finalize_options(self): # Update build_lib settings from the build command to always put # build files in platform-specific subdirectories of build/, even # for projects with only pure-Python source (this is desirable # specifically for support of multiple Python version). build_cmd = self.get_finalized_command('build') platlib_dir = _get_platlib_dir(build_cmd) build_cmd.build_purelib = platlib_dir build_cmd.build_lib = platlib_dir self.build_lib = platlib_dir SetuptoolsBuildPy.finalize_options(self) def run_2to3(self, files, doctests=False): # Filter the files to exclude things that shouldn't be 2to3'd skip_2to3 = self.distribution.skip_2to3 filtered_files = [] for filename in files: for package in skip_2to3: if filename[len(self.build_lib) + 1:].startswith(package): break else: filtered_files.append(filename) SetuptoolsBuildPy.run_2to3(self, filtered_files, doctests) def run(self): # first run the normal build_py SetuptoolsBuildPy.run(self) reproject-0.3.2/astropy_helpers/astropy_helpers/commands/build_sphinx.py0000644000077000000240000002277513173066253026763 0ustar tomstaff00000000000000from __future__ import print_function import inspect import os import pkgutil import re import shutil import subprocess import sys import textwrap from distutils import log from distutils.cmd import DistutilsOptionError import sphinx from sphinx.setup_command import BuildDoc as SphinxBuildDoc from ..utils import minversion PY3 = sys.version_info[0] >= 3 class AstropyBuildSphinx(SphinxBuildDoc): """ A version of the ``build_sphinx`` command that uses the version of Astropy that is built by the setup ``build`` command, rather than whatever is installed on the system. To build docs against the installed version, run ``make html`` in the ``astropy/docs`` directory. This also automatically creates the docs/_static directories--this is needed because GitHub won't create the _static dir because it has no tracked files. """ description = 'Build Sphinx documentation for Astropy environment' user_options = SphinxBuildDoc.user_options[:] user_options.append( ('warnings-returncode', 'w', 'Parses the sphinx output and sets the return code to 1 if there ' 'are any warnings. Note that this will cause the sphinx log to ' 'only update when it completes, rather than continuously as is ' 'normally the case.')) user_options.append( ('clean-docs', 'l', 'Completely clean previous builds, including ' 'automodapi-generated files before building new ones')) user_options.append( ('no-intersphinx', 'n', 'Skip intersphinx, even if conf.py says to use it')) user_options.append( ('open-docs-in-browser', 'o', 'Open the docs in a browser (using the webbrowser module) if the ' 'build finishes successfully.')) boolean_options = SphinxBuildDoc.boolean_options[:] boolean_options.append('warnings-returncode') boolean_options.append('clean-docs') boolean_options.append('no-intersphinx') boolean_options.append('open-docs-in-browser') _self_iden_rex = re.compile(r"self\.([^\d\W][\w]+)", re.UNICODE) def initialize_options(self): SphinxBuildDoc.initialize_options(self) self.clean_docs = False self.no_intersphinx = False self.open_docs_in_browser = False self.warnings_returncode = False def finalize_options(self): # Clear out previous sphinx builds, if requested if self.clean_docs: dirstorm = [os.path.join(self.source_dir, 'api'), os.path.join(self.source_dir, 'generated')] if self.build_dir is None: dirstorm.append('docs/_build') else: dirstorm.append(self.build_dir) for d in dirstorm: if os.path.isdir(d): log.info('Cleaning directory ' + d) shutil.rmtree(d) else: log.info('Not cleaning directory ' + d + ' because ' 'not present or not a directory') SphinxBuildDoc.finalize_options(self) def run(self): # TODO: Break this method up into a few more subroutines and # document them better import webbrowser if PY3: from urllib.request import pathname2url else: from urllib import pathname2url # This is used at the very end of `run` to decide if sys.exit should # be called. If it's None, it won't be. retcode = None # If possible, create the _static dir if self.build_dir is not None: # the _static dir should be in the same place as the _build dir # for Astropy basedir, subdir = os.path.split(self.build_dir) if subdir == '': # the path has a trailing /... basedir, subdir = os.path.split(basedir) staticdir = os.path.join(basedir, '_static') if os.path.isfile(staticdir): raise DistutilsOptionError( 'Attempted to build_sphinx in a location where' + staticdir + 'is a file. Must be a directory.') self.mkpath(staticdir) # Now make sure Astropy is built and determine where it was built build_cmd = self.reinitialize_command('build') build_cmd.inplace = 0 self.run_command('build') build_cmd = self.get_finalized_command('build') build_cmd_path = os.path.abspath(build_cmd.build_lib) ah_importer = pkgutil.get_importer('astropy_helpers') ah_path = os.path.abspath(ah_importer.path) # Now generate the source for and spawn a new process that runs the # command. This is needed to get the correct imports for the built # version runlines, runlineno = inspect.getsourcelines(SphinxBuildDoc.run) subproccode = textwrap.dedent(""" from sphinx.setup_command import * os.chdir({srcdir!r}) sys.path.insert(0, {build_cmd_path!r}) sys.path.insert(0, {ah_path!r}) """).format(build_cmd_path=build_cmd_path, ah_path=ah_path, srcdir=self.source_dir) # runlines[1:] removes 'def run(self)' on the first line subproccode += textwrap.dedent(''.join(runlines[1:])) # All "self.foo" in the subprocess code needs to be replaced by the # values taken from the current self in *this* process subproccode = self._self_iden_rex.split(subproccode) for i in range(1, len(subproccode), 2): iden = subproccode[i] val = getattr(self, iden) if iden.endswith('_dir'): # Directories should be absolute, because the `chdir` call # in the new process moves to a different directory subproccode[i] = repr(os.path.abspath(val)) else: subproccode[i] = repr(val) subproccode = ''.join(subproccode) # This is a quick gross hack, but it ensures that the code grabbed from # SphinxBuildDoc.run will work in Python 2 if it uses the print # function if minversion(sphinx, '1.3'): subproccode = 'from __future__ import print_function' + subproccode if self.no_intersphinx: # the confoverrides variable in sphinx.setup_command.BuildDoc can # be used to override the conf.py ... but this could well break # if future versions of sphinx change the internals of BuildDoc, # so remain vigilant! subproccode = subproccode.replace( 'confoverrides = {}', 'confoverrides = {\'intersphinx_mapping\':{}}') log.debug('Starting subprocess of {0} with python code:\n{1}\n' '[CODE END])'.format(sys.executable, subproccode)) # To return the number of warnings, we need to capture stdout. This # prevents a continuous updating at the terminal, but there's no # apparent way around this. if self.warnings_returncode: proc = subprocess.Popen([sys.executable, '-c', subproccode], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) retcode = 1 with proc.stdout: for line in iter(proc.stdout.readline, b''): line = line.strip(b'\n') print(line.decode('utf-8')) if 'build succeeded.' == line.decode('utf-8'): retcode = 0 # Poll to set proc.retcode proc.wait() if retcode != 0: if os.environ.get('TRAVIS', None) == 'true': # this means we are in the travis build, so customize # the message appropriately. msg = ('The build_sphinx travis build FAILED ' 'because sphinx issued documentation ' 'warnings (scroll up to see the warnings).') else: # standard failure message msg = ('build_sphinx returning a non-zero exit ' 'code because sphinx issued documentation ' 'warnings.') log.warn(msg) else: proc = subprocess.Popen([sys.executable], stdin=subprocess.PIPE) proc.communicate(subproccode.encode('utf-8')) if proc.returncode == 0: if self.open_docs_in_browser: if self.builder == 'html': absdir = os.path.abspath(self.builder_target_dir) index_path = os.path.join(absdir, 'index.html') fileurl = 'file://' + pathname2url(index_path) webbrowser.open(fileurl) else: log.warn('open-docs-in-browser option was given, but ' 'the builder is not html! Ignoring.') else: log.warn('Sphinx Documentation subprocess failed with return ' 'code ' + str(proc.returncode)) retcode = proc.returncode if retcode is not None: # this is potentially dangerous in that there might be something # after the call to `setup` in `setup.py`, and exiting here will # prevent that from running. But there's no other apparent way # to signal what the return code should be. sys.exit(retcode) class AstropyBuildDocs(AstropyBuildSphinx): description = 'alias to the build_sphinx command' reproject-0.3.2/astropy_helpers/astropy_helpers/commands/install.py0000644000077000000240000000074612521647746025743 0ustar tomstaff00000000000000from setuptools.command.install import install as SetuptoolsInstall from ..utils import _get_platlib_dir class AstropyInstall(SetuptoolsInstall): user_options = SetuptoolsInstall.user_options[:] boolean_options = SetuptoolsInstall.boolean_options[:] def finalize_options(self): build_cmd = self.get_finalized_command('build') platlib_dir = _get_platlib_dir(build_cmd) self.build_lib = platlib_dir SetuptoolsInstall.finalize_options(self) reproject-0.3.2/astropy_helpers/astropy_helpers/commands/install_lib.py0000644000077000000240000000100012521647746026551 0ustar tomstaff00000000000000from setuptools.command.install_lib import install_lib as SetuptoolsInstallLib from ..utils import _get_platlib_dir class AstropyInstallLib(SetuptoolsInstallLib): user_options = SetuptoolsInstallLib.user_options[:] boolean_options = SetuptoolsInstallLib.boolean_options[:] def finalize_options(self): build_cmd = self.get_finalized_command('build') platlib_dir = _get_platlib_dir(build_cmd) self.build_dir = platlib_dir SetuptoolsInstallLib.finalize_options(self) reproject-0.3.2/astropy_helpers/astropy_helpers/commands/register.py0000644000077000000240000000454712521647746026124 0ustar tomstaff00000000000000from setuptools.command.register import register as SetuptoolsRegister class AstropyRegister(SetuptoolsRegister): """Extends the built in 'register' command to support a ``--hidden`` option to make the registered version hidden on PyPI by default. The result of this is that when a version is registered as "hidden" it can still be downloaded from PyPI, but it does not show up in the list of actively supported versions under http://pypi.python.org/pypi/astropy, and is not set as the most recent version. Although this can always be set through the web interface it may be more convenient to be able to specify via the 'register' command. Hidden may also be considered a safer default when running the 'register' command, though this command uses distutils' normal behavior if the ``--hidden`` option is omitted. """ user_options = SetuptoolsRegister.user_options + [ ('hidden', None, 'mark this release as hidden on PyPI by default') ] boolean_options = SetuptoolsRegister.boolean_options + ['hidden'] def initialize_options(self): SetuptoolsRegister.initialize_options(self) self.hidden = False def build_post_data(self, action): data = SetuptoolsRegister.build_post_data(self, action) if action == 'submit' and self.hidden: data['_pypi_hidden'] = '1' return data def _set_config(self): # The original register command is buggy--if you use .pypirc with a # server-login section *at all* the repository you specify with the -r # option will be overwritten with either the repository in .pypirc or # with the default, # If you do not have a .pypirc using the -r option will just crash. # Way to go distutils # If we don't set self.repository back to a default value _set_config # can crash if there was a user-supplied value for this option; don't # worry, we'll get the real value back afterwards self.repository = 'pypi' SetuptoolsRegister._set_config(self) options = self.distribution.get_option_dict('register') if 'repository' in options: source, value = options['repository'] # Really anything that came from setup.cfg or the command line # should override whatever was in .pypirc self.repository = value reproject-0.3.2/astropy_helpers/astropy_helpers/commands/setup_package.py0000644000077000000240000000017012735026632027067 0ustar tomstaff00000000000000from os.path import join def get_package_data(): return {'astropy_helpers.commands': [join('src', 'compiler.c')]} reproject-0.3.2/astropy_helpers/astropy_helpers/commands/src/0000755000077000000240000000000013173066302024466 5ustar tomstaff00000000000000reproject-0.3.2/astropy_helpers/astropy_helpers/commands/src/compiler.c0000644000077000000240000000573112521647746026467 0ustar tomstaff00000000000000#include /*************************************************************************** * Macros for determining the compiler version. * * These are borrowed from boost, and majorly abridged to include only * the compilers we care about. ***************************************************************************/ #ifndef PY3K #if PY_MAJOR_VERSION >= 3 #define PY3K 1 #else #define PY3K 0 #endif #endif #define STRINGIZE(X) DO_STRINGIZE(X) #define DO_STRINGIZE(X) #X #if defined __clang__ /* Clang C++ emulates GCC, so it has to appear early. */ # define COMPILER "Clang version " __clang_version__ #elif defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || defined(__ECC) /* Intel */ # if defined(__INTEL_COMPILER) # define INTEL_VERSION __INTEL_COMPILER # elif defined(__ICL) # define INTEL_VERSION __ICL # elif defined(__ICC) # define INTEL_VERSION __ICC # elif defined(__ECC) # define INTEL_VERSION __ECC # endif # define COMPILER "Intel C compiler version " STRINGIZE(INTEL_VERSION) #elif defined(__GNUC__) /* gcc */ # define COMPILER "GCC version " __VERSION__ #elif defined(__SUNPRO_CC) /* Sun Workshop Compiler */ # define COMPILER "Sun compiler version " STRINGIZE(__SUNPRO_CC) #elif defined(_MSC_VER) /* Microsoft Visual C/C++ Must be last since other compilers define _MSC_VER for compatibility as well */ # if _MSC_VER < 1200 # define COMPILER_VERSION 5.0 # elif _MSC_VER < 1300 # define COMPILER_VERSION 6.0 # elif _MSC_VER == 1300 # define COMPILER_VERSION 7.0 # elif _MSC_VER == 1310 # define COMPILER_VERSION 7.1 # elif _MSC_VER == 1400 # define COMPILER_VERSION 8.0 # elif _MSC_VER == 1500 # define COMPILER_VERSION 9.0 # elif _MSC_VER == 1600 # define COMPILER_VERSION 10.0 # else # define COMPILER_VERSION _MSC_VER # endif # define COMPILER "Microsoft Visual C++ version " STRINGIZE(COMPILER_VERSION) #else /* Fallback */ # define COMPILER "Unknown compiler" #endif /*************************************************************************** * Module-level ***************************************************************************/ struct module_state { /* The Sun compiler can't handle empty structs */ #if defined(__SUNPRO_C) || defined(_MSC_VER) int _dummy; #endif }; #if PY3K static struct PyModuleDef moduledef = { PyModuleDef_HEAD_INIT, "_compiler", NULL, sizeof(struct module_state), NULL, NULL, NULL, NULL, NULL }; #define INITERROR return NULL PyMODINIT_FUNC PyInit__compiler(void) #else #define INITERROR return PyMODINIT_FUNC init_compiler(void) #endif { PyObject* m; #if PY3K m = PyModule_Create(&moduledef); #else m = Py_InitModule3("_compiler", NULL, NULL); #endif if (m == NULL) INITERROR; PyModule_AddStringConstant(m, "compiler", COMPILER); #if PY3K return m; #endif } reproject-0.3.2/astropy_helpers/astropy_helpers/commands/test.py0000644000077000000240000000251413173066253025237 0ustar tomstaff00000000000000""" Different implementations of the ``./setup.py test`` command depending on what's locally available. If Astropy v1.1.0.dev or later is available it should be possible to import AstropyTest from ``astropy.tests.command``. If ``astropy`` can be imported but not ``astropy.tests.command`` (i.e. an older version of Astropy), we can use the backwards-compat implementation of the command. If Astropy can't be imported at all then there is a skeleton implementation that allows users to at least discover the ``./setup.py test`` command and learn that they need Astropy to run it. """ # Previously these except statements caught only ImportErrors, but there are # some other obscure exceptional conditions that can occur when importing # astropy.tests (at least on older versions) that can cause these imports to # fail try: import astropy try: from astropy.tests.command import AstropyTest except Exception: from ._test_compat import AstropyTest except Exception: # No astropy at all--provide the dummy implementation from ._dummy import _DummyCommand class AstropyTest(_DummyCommand): command_name = 'test' description = 'Run the tests for this package' error_msg = ( "The 'test' command requires the astropy package to be " "installed and importable.") reproject-0.3.2/astropy_helpers/astropy_helpers/compat/0000755000077000000240000000000013173066302023361 5ustar tomstaff00000000000000reproject-0.3.2/astropy_helpers/astropy_helpers/compat/__init__.py0000644000077000000240000000056012361520666025501 0ustar tomstaff00000000000000def _fix_user_options(options): """ This is for Python 2.x and 3.x compatibility. distutils expects Command options to all be byte strings on Python 2 and Unicode strings on Python 3. """ def to_str_or_none(x): if x is None: return None return str(x) return [tuple(to_str_or_none(x) for x in y) for y in options] reproject-0.3.2/astropy_helpers/astropy_helpers/compat/_subprocess_py2/0000755000077000000240000000000013173066302026502 5ustar tomstaff00000000000000reproject-0.3.2/astropy_helpers/astropy_helpers/compat/_subprocess_py2/__init__.py0000644000077000000240000000243213173066253030621 0ustar tomstaff00000000000000from __future__ import absolute_import from subprocess import * def check_output(*popenargs, **kwargs): r"""Run command with arguments and return its output as a byte string. If the exit code was non-zero it raises a CalledProcessError. The CalledProcessError object will have the return code in the returncode attribute and output in the output attribute. The arguments are the same as for the Popen constructor. Example:: >>> check_output(["ls", "-l", "/dev/null"]) 'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n' The stdout argument is not allowed as it is used internally. To capture standard error in the result, use stderr=STDOUT.:: >>> check_output(["/bin/sh", "-c", ... "ls -l non_existent_file ; exit 0"], ... stderr=STDOUT) 'ls: non_existent_file: No such file or directory\n' """ if 'stdout' in kwargs: raise ValueError('stdout argument not allowed, it will be overridden.') process = Popen(stdout=PIPE, *popenargs, **kwargs) output, unused_err = process.communicate() retcode = process.poll() if retcode: cmd = kwargs.get("args") if cmd is None: cmd = popenargs[0] raise CalledProcessError(retcode, cmd) return output reproject-0.3.2/astropy_helpers/astropy_helpers/compat/subprocess.py0000644000077000000240000000104713173066253026132 0ustar tomstaff00000000000000""" A replacement wrapper around the subprocess module that adds check_output (which was only added to Python in 2.7. Instead of importing subprocess, other modules should use this as follows:: from astropy.utils.compat import subprocess This module is safe to import from anywhere within astropy. """ from __future__ import absolute_import, print_function import subprocess from subprocess import * # python2.7 and later provide a check_output method if not hasattr(subprocess, 'check_output'): from ._subprocess_py2 import check_output reproject-0.3.2/astropy_helpers/astropy_helpers/distutils_helpers.py0000644000077000000240000001735513173066253026236 0ustar tomstaff00000000000000""" This module contains various utilities for introspecting the distutils module and the setup process. Some of these utilities require the `astropy_helpers.setup_helpers.register_commands` function to be called first, as it will affect introspection of setuptools command-line arguments. Other utilities in this module do not have that restriction. """ import os import sys from distutils import ccompiler from distutils.dist import Distribution from distutils.errors import DistutilsError from .utils import silence # This function, and any functions that call it, require the setup in # `astropy_helpers.setup_helpers.register_commands` to be run first. def get_dummy_distribution(): """ Returns a distutils Distribution object used to instrument the setup environment before calling the actual setup() function. """ from .setup_helpers import _module_state if _module_state['registered_commands'] is None: raise RuntimeError( 'astropy_helpers.setup_helpers.register_commands() must be ' 'called before using ' 'astropy_helpers.setup_helpers.get_dummy_distribution()') # Pre-parse the Distutils command-line options and config files to if # the option is set. dist = Distribution({'script_name': os.path.basename(sys.argv[0]), 'script_args': sys.argv[1:]}) dist.cmdclass.update(_module_state['registered_commands']) with silence(): try: dist.parse_config_files() dist.parse_command_line() except (DistutilsError, AttributeError, SystemExit): # Let distutils handle DistutilsErrors itself AttributeErrors can # get raise for ./setup.py --help SystemExit can be raised if a # display option was used, for example pass return dist def get_distutils_option(option, commands): """ Returns the value of the given distutils option. Parameters ---------- option : str The name of the option commands : list of str The list of commands on which this option is available Returns ------- val : str or None the value of the given distutils option. If the option is not set, returns None. """ dist = get_dummy_distribution() for cmd in commands: cmd_opts = dist.command_options.get(cmd) if cmd_opts is not None and option in cmd_opts: return cmd_opts[option][1] else: return None def get_distutils_build_option(option): """ Returns the value of the given distutils build option. Parameters ---------- option : str The name of the option Returns ------- val : str or None The value of the given distutils build option. If the option is not set, returns None. """ return get_distutils_option(option, ['build', 'build_ext', 'build_clib']) def get_distutils_install_option(option): """ Returns the value of the given distutils install option. Parameters ---------- option : str The name of the option Returns ------- val : str or None The value of the given distutils build option. If the option is not set, returns None. """ return get_distutils_option(option, ['install']) def get_distutils_build_or_install_option(option): """ Returns the value of the given distutils build or install option. Parameters ---------- option : str The name of the option Returns ------- val : str or None The value of the given distutils build or install option. If the option is not set, returns None. """ return get_distutils_option(option, ['build', 'build_ext', 'build_clib', 'install']) def get_compiler_option(): """ Determines the compiler that will be used to build extension modules. Returns ------- compiler : str The compiler option specified for the build, build_ext, or build_clib command; or the default compiler for the platform if none was specified. """ compiler = get_distutils_build_option('compiler') if compiler is None: return ccompiler.get_default_compiler() return compiler def add_command_option(command, name, doc, is_bool=False): """ Add a custom option to a setup command. Issues a warning if the option already exists on that command. Parameters ---------- command : str The name of the command as given on the command line name : str The name of the build option doc : str A short description of the option, for the `--help` message is_bool : bool, optional When `True`, the option is a boolean option and doesn't require an associated value. """ dist = get_dummy_distribution() cmdcls = dist.get_command_class(command) if (hasattr(cmdcls, '_astropy_helpers_options') and name in cmdcls._astropy_helpers_options): return attr = name.replace('-', '_') if hasattr(cmdcls, attr): raise RuntimeError( '{0!r} already has a {1!r} class attribute, barring {2!r} from ' 'being usable as a custom option name.'.format(cmdcls, attr, name)) for idx, cmd in enumerate(cmdcls.user_options): if cmd[0] == name: log.warn('Overriding existing {0!r} option ' '{1!r}'.format(command, name)) del cmdcls.user_options[idx] if name in cmdcls.boolean_options: cmdcls.boolean_options.remove(name) break cmdcls.user_options.append((name, None, doc)) if is_bool: cmdcls.boolean_options.append(name) # Distutils' command parsing requires that a command object have an # attribute with the same name as the option (with '-' replaced with '_') # in order for that option to be recognized as valid setattr(cmdcls, attr, None) # This caches the options added through add_command_option so that if it is # run multiple times in the same interpreter repeated adds are ignored # (this way we can still raise a RuntimeError if a custom option overrides # a built-in option) if not hasattr(cmdcls, '_astropy_helpers_options'): cmdcls._astropy_helpers_options = set([name]) else: cmdcls._astropy_helpers_options.add(name) def get_distutils_display_options(): """ Returns a set of all the distutils display options in their long and short forms. These are the setup.py arguments such as --name or --version which print the project's metadata and then exit. Returns ------- opts : set The long and short form display option arguments, including the - or -- """ short_display_opts = set('-' + o[1] for o in Distribution.display_options if o[1]) long_display_opts = set('--' + o[0] for o in Distribution.display_options) # Include -h and --help which are not explicitly listed in # Distribution.display_options (as they are handled by optparse) short_display_opts.add('-h') long_display_opts.add('--help') # This isn't the greatest approach to hardcode these commands. # However, there doesn't seem to be a good way to determine # whether build *will be* run as part of the command at this # phase. display_commands = set([ 'clean', 'register', 'setopt', 'saveopts', 'egg_info', 'alias']) return short_display_opts.union(long_display_opts.union(display_commands)) def is_distutils_display_option(): """ Returns True if sys.argv contains any of the distutils display options such as --version or --name. """ display_options = get_distutils_display_options() return bool(set(sys.argv[1:]).intersection(display_options)) reproject-0.3.2/astropy_helpers/astropy_helpers/git_helpers.py0000644000077000000240000001373012735026632024766 0ustar tomstaff00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ Utilities for retrieving revision information from a project's git repository. """ # Do not remove the following comment; it is used by # astropy_helpers.version_helpers to determine the beginning of the code in # this module # BEGIN import locale import os import subprocess import warnings def _decode_stdio(stream): try: stdio_encoding = locale.getdefaultlocale()[1] or 'utf-8' except ValueError: stdio_encoding = 'utf-8' try: text = stream.decode(stdio_encoding) except UnicodeDecodeError: # Final fallback text = stream.decode('latin1') return text def update_git_devstr(version, path=None): """ Updates the git revision string if and only if the path is being imported directly from a git working copy. This ensures that the revision number in the version string is accurate. """ try: # Quick way to determine if we're in git or not - returns '' if not devstr = get_git_devstr(sha=True, show_warning=False, path=path) except OSError: return version if not devstr: # Probably not in git so just pass silently return version if 'dev' in version: # update to the current git revision version_base = version.split('.dev', 1)[0] devstr = get_git_devstr(sha=False, show_warning=False, path=path) return version_base + '.dev' + devstr else: # otherwise it's already the true/release version return version def get_git_devstr(sha=False, show_warning=True, path=None): """ Determines the number of revisions in this repository. Parameters ---------- sha : bool If True, the full SHA1 hash will be returned. Otherwise, the total count of commits in the repository will be used as a "revision number". show_warning : bool If True, issue a warning if git returns an error code, otherwise errors pass silently. path : str or None If a string, specifies the directory to look in to find the git repository. If `None`, the current working directory is used, and must be the root of the git repository. If given a filename it uses the directory containing that file. Returns ------- devversion : str Either a string with the revision number (if `sha` is False), the SHA1 hash of the current commit (if `sha` is True), or an empty string if git version info could not be identified. """ if path is None: path = os.getcwd() if not _get_repo_path(path, levels=0): return '' if not os.path.isdir(path): path = os.path.abspath(os.path.dirname(path)) if sha: # Faster for getting just the hash of HEAD cmd = ['rev-parse', 'HEAD'] else: cmd = ['rev-list', '--count', 'HEAD'] def run_git(cmd): try: p = subprocess.Popen(['git'] + cmd, cwd=path, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) stdout, stderr = p.communicate() except OSError as e: if show_warning: warnings.warn('Error running git: ' + str(e)) return (None, b'', b'') if p.returncode == 128: if show_warning: warnings.warn('No git repository present at {0!r}! Using ' 'default dev version.'.format(path)) return (p.returncode, b'', b'') if p.returncode == 129: if show_warning: warnings.warn('Your git looks old (does it support {0}?); ' 'consider upgrading to v1.7.2 or ' 'later.'.format(cmd[0])) return (p.returncode, stdout, stderr) elif p.returncode != 0: if show_warning: warnings.warn('Git failed while determining revision ' 'count: {0}'.format(_decode_stdio(stderr))) return (p.returncode, stdout, stderr) return p.returncode, stdout, stderr returncode, stdout, stderr = run_git(cmd) if not sha and returncode == 129: # git returns 129 if a command option failed to parse; in # particular this could happen in git versions older than 1.7.2 # where the --count option is not supported # Also use --abbrev-commit and --abbrev=0 to display the minimum # number of characters needed per-commit (rather than the full hash) cmd = ['rev-list', '--abbrev-commit', '--abbrev=0', 'HEAD'] returncode, stdout, stderr = run_git(cmd) # Fall back on the old method of getting all revisions and counting # the lines if returncode == 0: return str(stdout.count(b'\n')) else: return '' elif sha: return _decode_stdio(stdout)[:40] else: return _decode_stdio(stdout).strip() def _get_repo_path(pathname, levels=None): """ Given a file or directory name, determine the root of the git repository this path is under. If given, this won't look any higher than ``levels`` (that is, if ``levels=0`` then the given path must be the root of the git repository and is returned if so. Returns `None` if the given path could not be determined to belong to a git repo. """ if os.path.isfile(pathname): current_dir = os.path.abspath(os.path.dirname(pathname)) elif os.path.isdir(pathname): current_dir = os.path.abspath(pathname) else: return None current_level = 0 while levels is None or current_level <= levels: if os.path.exists(os.path.join(current_dir, '.git')): return current_dir current_level += 1 if current_dir == os.path.dirname(current_dir): break current_dir = os.path.dirname(current_dir) return None reproject-0.3.2/astropy_helpers/astropy_helpers/setup_helpers.py0000644000077000000240000006272613173066253025354 0ustar tomstaff00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ This module contains a number of utilities for use during setup/build/packaging that are useful to astropy as a whole. """ from __future__ import absolute_import, print_function import collections import os import re import subprocess import sys import traceback import warnings from distutils import log from distutils.dist import Distribution from distutils.errors import DistutilsOptionError, DistutilsModuleError from distutils.core import Extension from distutils.core import Command from distutils.command.sdist import sdist as DistutilsSdist from setuptools import find_packages as _find_packages from .distutils_helpers import * from .version_helpers import get_pkg_version_module from .utils import (walk_skip_hidden, import_file, extends_doc, resolve_name, AstropyDeprecationWarning) from .commands.build_ext import generate_build_ext_command from .commands.build_py import AstropyBuildPy from .commands.install import AstropyInstall from .commands.install_lib import AstropyInstallLib from .commands.register import AstropyRegister from .commands.test import AstropyTest # These imports are not used in this module, but are included for backwards # compat with older versions of this module from .utils import get_numpy_include_path, write_if_different from .commands.build_ext import should_build_with_cython, get_compiler_version _module_state = { 'registered_commands': None, 'have_sphinx': False, 'package_cache': None, } try: import sphinx _module_state['have_sphinx'] = True except ValueError as e: # This can occur deep in the bowels of Sphinx's imports by way of docutils # and an occurrence of this bug: http://bugs.python.org/issue18378 # In this case sphinx is effectively unusable if 'unknown locale' in e.args[0]: log.warn( "Possible misconfiguration of one of the environment variables " "LC_ALL, LC_CTYPES, LANG, or LANGUAGE. For an example of how to " "configure your system's language environment on OSX see " "http://blog.remibergsma.com/2012/07/10/" "setting-locales-correctly-on-mac-osx-terminal-application/") except ImportError: pass except SyntaxError: # occurs if markupsafe is recent version, which doesn't support Python 3.2 pass PY3 = sys.version_info[0] >= 3 # This adds a new keyword to the setup() function Distribution.skip_2to3 = [] def adjust_compiler(package): """ This function detects broken compilers and switches to another. If the environment variable CC is explicitly set, or a compiler is specified on the commandline, no override is performed -- the purpose here is to only override a default compiler. The specific compilers with problems are: * The default compiler in XCode-4.2, llvm-gcc-4.2, segfaults when compiling wcslib. The set of broken compilers can be updated by changing the compiler_mapping variable. It is a list of 2-tuples where the first in the pair is a regular expression matching the version of the broken compiler, and the second is the compiler to change to. """ warnings.warn( 'Direct use of the adjust_compiler function in setup.py is ' 'deprecated and can be removed from your setup.py. This ' 'functionality is now incorporated directly into the build_ext ' 'command.', AstropyDeprecationWarning) def get_debug_option(packagename): """ Determines if the build is in debug mode. Returns ------- debug : bool True if the current build was started with the debug option, False otherwise. """ try: current_debug = get_pkg_version_module(packagename, fromlist=['debug'])[0] except (ImportError, AttributeError): current_debug = None # Only modify the debug flag if one of the build commands was explicitly # run (i.e. not as a sub-command of something else) dist = get_dummy_distribution() if any(cmd in dist.commands for cmd in ['build', 'build_ext']): debug = bool(get_distutils_build_option('debug')) else: debug = bool(current_debug) if current_debug is not None and current_debug != debug: build_ext_cmd = dist.get_command_class('build_ext') build_ext_cmd.force_rebuild = True return debug def register_commands(package, version, release, srcdir='.'): if _module_state['registered_commands'] is not None: return _module_state['registered_commands'] if _module_state['have_sphinx']: from .commands.build_sphinx import AstropyBuildSphinx, AstropyBuildDocs else: AstropyBuildSphinx = AstropyBuildDocs = FakeBuildSphinx _module_state['registered_commands'] = registered_commands = { 'test': generate_test_command(package), # Use distutils' sdist because it respects package_data. # setuptools/distributes sdist requires duplication of information in # MANIFEST.in 'sdist': DistutilsSdist, # The exact form of the build_ext command depends on whether or not # we're building a release version 'build_ext': generate_build_ext_command(package, release), # We have a custom build_py to generate the default configuration file 'build_py': AstropyBuildPy, # Since install can (in some circumstances) be run without # first building, we also need to override install and # install_lib. See #2223 'install': AstropyInstall, 'install_lib': AstropyInstallLib, 'register': AstropyRegister, 'build_sphinx': AstropyBuildSphinx, 'build_docs': AstropyBuildDocs } # Need to override the __name__ here so that the commandline options are # presented as being related to the "build" command, for example; normally # this wouldn't be necessary since commands also have a command_name # attribute, but there is a bug in distutils' help display code that it # uses __name__ instead of command_name. Yay distutils! for name, cls in registered_commands.items(): cls.__name__ = name # Add a few custom options; more of these can be added by specific packages # later for option in [ ('use-system-libraries', "Use system libraries whenever possible", True)]: add_command_option('build', *option) add_command_option('install', *option) add_command_hooks(registered_commands, srcdir=srcdir) return registered_commands def add_command_hooks(commands, srcdir='.'): """ Look through setup_package.py modules for functions with names like ``pre__hook`` and ``post__hook`` where ```` is the name of a ``setup.py`` command (e.g. build_ext). If either hook is present this adds a wrapped version of that command to the passed in ``commands`` `dict`. ``commands`` may be pre-populated with other custom distutils command classes that should be wrapped if there are hooks for them (e.g. `AstropyBuildPy`). """ hook_re = re.compile(r'^(pre|post)_(.+)_hook$') # Distutils commands have a method of the same name, but it is not a # *classmethod* (which probably didn't exist when distutils was first # written) def get_command_name(cmdcls): if hasattr(cmdcls, 'command_name'): return cmdcls.command_name else: return cmdcls.__name__ packages = filter_packages(find_packages(srcdir)) dist = get_dummy_distribution() hooks = collections.defaultdict(dict) for setuppkg in iter_setup_packages(srcdir, packages): for name, obj in vars(setuppkg).items(): match = hook_re.match(name) if not match: continue hook_type = match.group(1) cmd_name = match.group(2) if hook_type not in hooks[cmd_name]: hooks[cmd_name][hook_type] = [] hooks[cmd_name][hook_type].append((setuppkg.__name__, obj)) for cmd_name, cmd_hooks in hooks.items(): commands[cmd_name] = generate_hooked_command( cmd_name, dist.get_command_class(cmd_name), cmd_hooks) def generate_hooked_command(cmd_name, cmd_cls, hooks): """ Returns a generated subclass of ``cmd_cls`` that runs the pre- and post-command hooks for that command before and after the ``cmd_cls.run`` method. """ def run(self, orig_run=cmd_cls.run): self.run_command_hooks('pre_hooks') orig_run(self) self.run_command_hooks('post_hooks') return type(cmd_name, (cmd_cls, object), {'run': run, 'run_command_hooks': run_command_hooks, 'pre_hooks': hooks.get('pre', []), 'post_hooks': hooks.get('post', [])}) def run_command_hooks(cmd_obj, hook_kind): """Run hooks registered for that command and phase. *cmd_obj* is a finalized command object; *hook_kind* is either 'pre_hook' or 'post_hook'. """ hooks = getattr(cmd_obj, hook_kind, None) if not hooks: return for modname, hook in hooks: if isinstance(hook, str): try: hook_obj = resolve_name(hook) except ImportError as exc: raise DistutilsModuleError( 'cannot find hook {0}: {1}'.format(hook, exc)) else: hook_obj = hook if not callable(hook_obj): raise DistutilsOptionError('hook {0!r} is not callable' % hook) log.info('running {0} from {1} for {2} command'.format( hook_kind.rstrip('s'), modname, cmd_obj.get_command_name())) try: hook_obj(cmd_obj) except Exception: log.error('{0} command hook {1} raised an exception: %s\n'.format( hook_obj.__name__, cmd_obj.get_command_name())) log.error(traceback.format_exc()) sys.exit(1) def generate_test_command(package_name): """ Creates a custom 'test' command for the given package which sets the command's ``package_name`` class attribute to the name of the package being tested. """ return type(package_name.title() + 'Test', (AstropyTest,), {'package_name': package_name}) def update_package_files(srcdir, extensions, package_data, packagenames, package_dirs): """ This function is deprecated and maintained for backward compatibility with affiliated packages. Affiliated packages should update their setup.py to use `get_package_info` instead. """ info = get_package_info(srcdir) extensions.extend(info['ext_modules']) package_data.update(info['package_data']) packagenames = list(set(packagenames + info['packages'])) package_dirs.update(info['package_dir']) def get_package_info(srcdir='.', exclude=()): """ Collates all of the information for building all subpackages subpackages and returns a dictionary of keyword arguments that can be passed directly to `distutils.setup`. The purpose of this function is to allow subpackages to update the arguments to the package's ``setup()`` function in its setup.py script, rather than having to specify all extensions/package data directly in the ``setup.py``. See Astropy's own ``setup.py`` for example usage and the Astropy development docs for more details. This function obtains that information by iterating through all packages in ``srcdir`` and locating a ``setup_package.py`` module. This module can contain the following functions: ``get_extensions()``, ``get_package_data()``, ``get_build_options()``, ``get_external_libraries()``, and ``requires_2to3()``. Each of those functions take no arguments. - ``get_extensions`` returns a list of `distutils.extension.Extension` objects. - ``get_package_data()`` returns a dict formatted as required by the ``package_data`` argument to ``setup()``. - ``get_build_options()`` returns a list of tuples describing the extra build options to add. - ``get_external_libraries()`` returns a list of libraries that can optionally be built using external dependencies. - ``get_entry_points()`` returns a dict formatted as required by the ``entry_points`` argument to ``setup()``. - ``requires_2to3()`` should return `True` when the source code requires `2to3` processing to run on Python 3.x. If ``requires_2to3()`` is missing, it is assumed to return `True`. """ ext_modules = [] packages = [] package_data = {} package_dir = {} skip_2to3 = [] # Use the find_packages tool to locate all packages and modules packages = filter_packages(find_packages(srcdir, exclude=exclude)) # For each of the setup_package.py modules, extract any # information that is needed to install them. The build options # are extracted first, so that their values will be available in # subsequent calls to `get_extensions`, etc. for setuppkg in iter_setup_packages(srcdir, packages): if hasattr(setuppkg, 'get_build_options'): options = setuppkg.get_build_options() for option in options: add_command_option('build', *option) if hasattr(setuppkg, 'get_external_libraries'): libraries = setuppkg.get_external_libraries() for library in libraries: add_external_library(library) if hasattr(setuppkg, 'requires_2to3'): requires_2to3 = setuppkg.requires_2to3() else: requires_2to3 = True if not requires_2to3: skip_2to3.append( os.path.dirname(setuppkg.__file__)) for setuppkg in iter_setup_packages(srcdir, packages): # get_extensions must include any Cython extensions by their .pyx # filename. if hasattr(setuppkg, 'get_extensions'): ext_modules.extend(setuppkg.get_extensions()) if hasattr(setuppkg, 'get_package_data'): package_data.update(setuppkg.get_package_data()) # Locate any .pyx files not already specified, and add their extensions in. # The default include dirs include numpy to facilitate numerical work. ext_modules.extend(get_cython_extensions(srcdir, packages, ext_modules, ['numpy'])) # Now remove extensions that have the special name 'skip_cython', as they # exist Only to indicate that the cython extensions shouldn't be built for i, ext in reversed(list(enumerate(ext_modules))): if ext.name == 'skip_cython': del ext_modules[i] # On Microsoft compilers, we need to pass the '/MANIFEST' # commandline argument. This was the default on MSVC 9.0, but is # now required on MSVC 10.0, but it doesn't seem to hurt to add # it unconditionally. if get_compiler_option() == 'msvc': for ext in ext_modules: ext.extra_link_args.append('/MANIFEST') return { 'ext_modules': ext_modules, 'packages': packages, 'package_dir': package_dir, 'package_data': package_data, 'skip_2to3': skip_2to3 } def iter_setup_packages(srcdir, packages): """ A generator that finds and imports all of the ``setup_package.py`` modules in the source packages. Returns ------- modgen : generator A generator that yields (modname, mod), where `mod` is the module and `modname` is the module name for the ``setup_package.py`` modules. """ for packagename in packages: package_parts = packagename.split('.') package_path = os.path.join(srcdir, *package_parts) setup_package = os.path.relpath( os.path.join(package_path, 'setup_package.py')) if os.path.isfile(setup_package): module = import_file(setup_package, name=packagename + '.setup_package') yield module def iter_pyx_files(package_dir, package_name): """ A generator that yields Cython source files (ending in '.pyx') in the source packages. Returns ------- pyxgen : generator A generator that yields (extmod, fullfn) where `extmod` is the full name of the module that the .pyx file would live in based on the source directory structure, and `fullfn` is the path to the .pyx file. """ for dirpath, dirnames, filenames in walk_skip_hidden(package_dir): for fn in filenames: if fn.endswith('.pyx'): fullfn = os.path.relpath(os.path.join(dirpath, fn)) # Package must match file name extmod = '.'.join([package_name, fn[:-4]]) yield (extmod, fullfn) break # Don't recurse into subdirectories def get_cython_extensions(srcdir, packages, prevextensions=tuple(), extincludedirs=None): """ Looks for Cython files and generates Extensions if needed. Parameters ---------- srcdir : str Path to the root of the source directory to search. prevextensions : list of `~distutils.core.Extension` objects The extensions that are already defined. Any .pyx files already here will be ignored. extincludedirs : list of str or None Directories to include as the `include_dirs` argument to the generated `~distutils.core.Extension` objects. Returns ------- exts : list of `~distutils.core.Extension` objects The new extensions that are needed to compile all .pyx files (does not include any already in `prevextensions`). """ # Vanilla setuptools and old versions of distribute include Cython files # as .c files in the sources, not .pyx, so we cannot simply look for # existing .pyx sources in the previous sources, but we should also check # for .c files with the same remaining filename. So we look for .pyx and # .c files, and we strip the extension. prevsourcepaths = [] ext_modules = [] for ext in prevextensions: for s in ext.sources: if s.endswith(('.pyx', '.c', '.cpp')): sourcepath = os.path.realpath(os.path.splitext(s)[0]) prevsourcepaths.append(sourcepath) for package_name in packages: package_parts = package_name.split('.') package_path = os.path.join(srcdir, *package_parts) for extmod, pyxfn in iter_pyx_files(package_path, package_name): sourcepath = os.path.realpath(os.path.splitext(pyxfn)[0]) if sourcepath not in prevsourcepaths: ext_modules.append(Extension(extmod, [pyxfn], include_dirs=extincludedirs)) return ext_modules class DistutilsExtensionArgs(collections.defaultdict): """ A special dictionary whose default values are the empty list. This is useful for building up a set of arguments for `distutils.Extension` without worrying whether the entry is already present. """ def __init__(self, *args, **kwargs): def default_factory(): return [] super(DistutilsExtensionArgs, self).__init__( default_factory, *args, **kwargs) def update(self, other): for key, val in other.items(): self[key].extend(val) def pkg_config(packages, default_libraries, executable='pkg-config'): """ Uses pkg-config to update a set of distutils Extension arguments to include the flags necessary to link against the given packages. If the pkg-config lookup fails, default_libraries is applied to libraries. Parameters ---------- packages : list of str A list of pkg-config packages to look up. default_libraries : list of str A list of library names to use if the pkg-config lookup fails. Returns ------- config : dict A dictionary containing keyword arguments to `distutils.Extension`. These entries include: - ``include_dirs``: A list of include directories - ``library_dirs``: A list of library directories - ``libraries``: A list of libraries - ``define_macros``: A list of macro defines - ``undef_macros``: A list of macros to undefine - ``extra_compile_args``: A list of extra arguments to pass to the compiler """ flag_map = {'-I': 'include_dirs', '-L': 'library_dirs', '-l': 'libraries', '-D': 'define_macros', '-U': 'undef_macros'} command = "{0} --libs --cflags {1}".format(executable, ' '.join(packages)), result = DistutilsExtensionArgs() try: pipe = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE) output = pipe.communicate()[0].strip() except subprocess.CalledProcessError as e: lines = [ ("{0} failed. This may cause the build to fail below." .format(executable)), " command: {0}".format(e.cmd), " returncode: {0}".format(e.returncode), " output: {0}".format(e.output) ] log.warn('\n'.join(lines)) result['libraries'].extend(default_libraries) else: if pipe.returncode != 0: lines = [ "pkg-config could not lookup up package(s) {0}.".format( ", ".join(packages)), "This may cause the build to fail below." ] log.warn('\n'.join(lines)) result['libraries'].extend(default_libraries) else: for token in output.split(): # It's not clear what encoding the output of # pkg-config will come to us in. It will probably be # some combination of pure ASCII (for the compiler # flags) and the filesystem encoding (for any argument # that includes directories or filenames), but this is # just conjecture, as the pkg-config documentation # doesn't seem to address it. arg = token[:2].decode('ascii') value = token[2:].decode(sys.getfilesystemencoding()) if arg in flag_map: if arg == '-D': value = tuple(value.split('=', 1)) result[flag_map[arg]].append(value) else: result['extra_compile_args'].append(value) return result def add_external_library(library): """ Add a build option for selecting the internal or system copy of a library. Parameters ---------- library : str The name of the library. If the library is `foo`, the build option will be called `--use-system-foo`. """ for command in ['build', 'build_ext', 'install']: add_command_option(command, str('use-system-' + library), 'Use the system {0} library'.format(library), is_bool=True) def use_system_library(library): """ Returns `True` if the build configuration indicates that the given library should use the system copy of the library rather than the internal one. For the given library `foo`, this will be `True` if `--use-system-foo` or `--use-system-libraries` was provided at the commandline or in `setup.cfg`. Parameters ---------- library : str The name of the library Returns ------- use_system : bool `True` if the build should use the system copy of the library. """ return ( get_distutils_build_or_install_option('use_system_{0}'.format(library)) or get_distutils_build_or_install_option('use_system_libraries')) @extends_doc(_find_packages) def find_packages(where='.', exclude=(), invalidate_cache=False): """ This version of ``find_packages`` caches previous results to speed up subsequent calls. Use ``invalide_cache=True`` to ignore cached results from previous ``find_packages`` calls, and repeat the package search. """ if not invalidate_cache and _module_state['package_cache'] is not None: return _module_state['package_cache'] packages = _find_packages(where=where, exclude=exclude) _module_state['package_cache'] = packages return packages def filter_packages(packagenames): """ Removes some packages from the package list that shouldn't be installed on the current version of Python. """ if PY3: exclude = '_py2' else: exclude = '_py3' return [x for x in packagenames if not x.endswith(exclude)] class FakeBuildSphinx(Command): """ A dummy build_sphinx command that is called if Sphinx is not installed and displays a relevant error message """ # user options inherited from sphinx.setup_command.BuildDoc user_options = [ ('fresh-env', 'E', ''), ('all-files', 'a', ''), ('source-dir=', 's', ''), ('build-dir=', None, ''), ('config-dir=', 'c', ''), ('builder=', 'b', ''), ('project=', None, ''), ('version=', None, ''), ('release=', None, ''), ('today=', None, ''), ('link-index', 'i', '')] # user options appended in astropy.setup_helpers.AstropyBuildSphinx user_options.append(('warnings-returncode', 'w', '')) user_options.append(('clean-docs', 'l', '')) user_options.append(('no-intersphinx', 'n', '')) user_options.append(('open-docs-in-browser', 'o', '')) def initialize_options(self): try: raise RuntimeError("Sphinx must be installed for build_sphinx") except: log.error('error: Sphinx must be installed for build_sphinx') sys.exit(1) reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/0000755000077000000240000000000013173066302023407 5ustar tomstaff00000000000000reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/__init__.py0000644000077000000240000000041413173066253025524 0ustar tomstaff00000000000000""" This package contains utilities and extensions for the Astropy sphinx documentation. In particular, the `astropy.sphinx.conf` should be imported by the sphinx ``conf.py`` file for affiliated packages that wish to make use of the Astropy documentation format. """ reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/conf.py0000644000077000000240000002731513173066253024723 0ustar tomstaff00000000000000# -*- coding: utf-8 -*- # Licensed under a 3-clause BSD style license - see LICENSE.rst # # Astropy shared Sphinx settings. These settings are shared between # astropy itself and affiliated packages. # # Note that not all possible configuration values are present in this file. # # All configuration values have a default; values that are commented out # serve to show the default. import os import sys import warnings from os import path import sphinx from distutils.version import LooseVersion # -- General configuration ---------------------------------------------------- # The version check in Sphinx itself can only compare the major and # minor parts of the version number, not the micro. To do a more # specific version check, call check_sphinx_version("x.y.z.") from # your project's conf.py needs_sphinx = '1.3' on_rtd = os.environ.get('READTHEDOCS', None) == 'True' def check_sphinx_version(expected_version): sphinx_version = LooseVersion(sphinx.__version__) expected_version = LooseVersion(expected_version) if sphinx_version < expected_version: raise RuntimeError( "At least Sphinx version {0} is required to build this " "documentation. Found {1}.".format( expected_version, sphinx_version)) # Configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = { 'python': ('http://docs.python.org/3/', None), 'pythonloc': ('http://docs.python.org/', path.abspath(path.join(path.dirname(__file__), 'local/python3_local_links.inv'))), 'numpy': ('http://docs.scipy.org/doc/numpy/', None), 'scipy': ('http://docs.scipy.org/doc/scipy/reference/', None), 'matplotlib': ('http://matplotlib.org/', None), 'astropy': ('http://docs.astropy.org/en/stable/', None), 'h5py': ('http://docs.h5py.org/en/latest/', None)} if sys.version_info[0] == 2: intersphinx_mapping['python'] = ('http://docs.python.org/2/', None) intersphinx_mapping['pythonloc'] = ( 'http://docs.python.org/', path.abspath(path.join(path.dirname(__file__), 'local/python2_local_links.inv'))) # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ['_build'] # Add any paths that contain templates here, relative to this directory. # templates_path = ['_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' # The reST default role (used for this markup: `text`) to use for all # documents. Set to the "smart" one. default_role = 'obj' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # This is added to the end of RST files - a good place to put substitutions to # be used globally. rst_epilog = """ .. _Astropy: http://astropy.org """ # A list of warning types to suppress arbitrary warning messages. We mean to # override directives in astropy_helpers.sphinx.ext.autodoc_enhancements, # thus need to ignore those warning. This can be removed once the patch gets # released in upstream Sphinx (https://github.com/sphinx-doc/sphinx/pull/1843). # Suppress the warnings requires Sphinx v1.4.2 suppress_warnings = ['app.add_directive', ] # -- Project information ------------------------------------------------------ # 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' # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # 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' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # -- Settings for extensions and extension options ---------------------------- # 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.intersphinx', 'sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.inheritance_diagram', 'sphinx.ext.viewcode', 'astropy_helpers.sphinx.ext.numpydoc', 'astropy_helpers.sphinx.ext.astropyautosummary', 'astropy_helpers.sphinx.ext.autodoc_enhancements', 'astropy_helpers.sphinx.ext.automodsumm', 'astropy_helpers.sphinx.ext.automodapi', 'astropy_helpers.sphinx.ext.tocdepthfix', 'astropy_helpers.sphinx.ext.doctest', 'astropy_helpers.sphinx.ext.changelog_links', 'astropy_helpers.sphinx.ext.smart_resolver'] if on_rtd: extensions.append('sphinx.ext.mathjax') elif LooseVersion(sphinx.__version__) < LooseVersion('1.4'): extensions.append('sphinx.ext.pngmath') else: extensions.append('sphinx.ext.imgmath') # Above, we use a patched version of viewcode rather than 'sphinx.ext.viewcode' # This can be changed to the sphinx version once the following issue is fixed # in sphinx: # https://bitbucket.org/birkenfeld/sphinx/issue/623/ # extension-viewcode-fails-with-function try: import matplotlib.sphinxext.plot_directive extensions += [matplotlib.sphinxext.plot_directive.__name__] # AttributeError is checked here in case matplotlib is installed but # Sphinx isn't. Note that this module is imported by the config file # generator, even if we're not building the docs. except (ImportError, AttributeError): warnings.warn( "matplotlib's plot_directive could not be imported. " + "Inline plots will not be included in the output") # Don't show summaries of the members in each class along with the # class' docstring numpydoc_show_class_members = False autosummary_generate = True automodapi_toctreedirnm = 'api' # Class documentation should contain *both* the class docstring and # the __init__ docstring autoclass_content = "both" # Render inheritance diagrams in SVG graphviz_output_format = "svg" graphviz_dot_args = [ '-Nfontsize=10', '-Nfontname=Helvetica Neue, Helvetica, Arial, sans-serif', '-Efontsize=10', '-Efontname=Helvetica Neue, Helvetica, Arial, sans-serif', '-Gfontsize=10', '-Gfontname=Helvetica Neue, Helvetica, Arial, sans-serif' ] # -- Options for HTML output ------------------------------------------------- # Add any paths that contain custom themes here, relative to this directory. html_theme_path = [path.abspath(path.join(path.dirname(__file__), 'themes'))] # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'bootstrap-astropy' # Custom sidebar templates, maps document names to template names. html_sidebars = { '**': ['localtoc.html'], 'search': [], 'genindex': [], 'py-modindex': [], } # 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. # included in the bootstrap-astropy theme html_favicon = path.join(html_theme_path[0], html_theme, 'static', 'astropy_logo.ico') # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. html_last_updated_fmt = '%d %b %Y' # 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 = {} # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # 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 = 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 # -- Options for LaTeX output ------------------------------------------------ # The paper size ('letter' or 'a4'). #latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). #latex_font_size = '10pt' # 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 = False # Additional stuff for the LaTeX preamble. latex_preamble = r""" % Use a more modern-looking monospace font \usepackage{inconsolata} % The enumitem package provides unlimited nesting of lists and enums. % Sphinx may use this in the future, in which case this can be removed. % See https://bitbucket.org/birkenfeld/sphinx/issue/777/latex-output-too-deeply-nested \usepackage{enumitem} \setlistdepth{15} % In the parameters section, place a newline after the Parameters % header. (This is stolen directly from Numpy's conf.py, since it % affects Numpy-style docstrings). \usepackage{expdlist} \let\latexdescription=\description \def\description{\latexdescription{}{} \breaklabel} % Support the superscript Unicode numbers used by the "unicode" units % formatter \DeclareUnicodeCharacter{2070}{\ensuremath{^0}} \DeclareUnicodeCharacter{00B9}{\ensuremath{^1}} \DeclareUnicodeCharacter{00B2}{\ensuremath{^2}} \DeclareUnicodeCharacter{00B3}{\ensuremath{^3}} \DeclareUnicodeCharacter{2074}{\ensuremath{^4}} \DeclareUnicodeCharacter{2075}{\ensuremath{^5}} \DeclareUnicodeCharacter{2076}{\ensuremath{^6}} \DeclareUnicodeCharacter{2077}{\ensuremath{^7}} \DeclareUnicodeCharacter{2078}{\ensuremath{^8}} \DeclareUnicodeCharacter{2079}{\ensuremath{^9}} \DeclareUnicodeCharacter{207B}{\ensuremath{^-}} \DeclareUnicodeCharacter{00B0}{\ensuremath{^{\circ}}} \DeclareUnicodeCharacter{2032}{\ensuremath{^{\prime}}} \DeclareUnicodeCharacter{2033}{\ensuremath{^{\prime\prime}}} % Make the "warning" and "notes" sections use a sans-serif font to % make them stand out more. \renewenvironment{notice}[2]{ \def\py@noticetype{#1} \csname py@noticestart@#1\endcsname \textsf{\textbf{#2}} }{\csname py@noticeend@\py@noticetype\endcsname} """ # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # -- Options for the linkcheck builder ---------------------------------------- # A timeout value, in seconds, for the linkcheck builder linkcheck_timeout = 60 reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/0000755000077000000240000000000013173066302024207 5ustar tomstaff00000000000000reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/__init__.py0000644000077000000240000000013613173066253026325 0ustar tomstaff00000000000000from __future__ import division, absolute_import, print_function from .numpydoc import setup reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/astropyautosummary.py0000644000077000000240000001065713173066253030607 0ustar tomstaff00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ This sphinx extension builds off of `sphinx.ext.autosummary` to clean up some issues it presents in the Astropy docs. The main issue this fixes is the summary tables getting cut off before the end of the sentence in some cases. Note: Sphinx 1.2 appears to have fixed the the main issues in the stock autosummary extension that are addressed by this extension. So use of this extension with newer versions of Sphinx is deprecated. """ import re from distutils.version import LooseVersion import sphinx from sphinx.ext.autosummary import Autosummary from ...utils import deprecated # used in AstropyAutosummary.get_items _itemsummrex = re.compile(r'^([A-Z].*?\.(?:\s|$))') @deprecated('1.0', message='AstropyAutosummary is only needed when used ' 'with Sphinx versions less than 1.2') class AstropyAutosummary(Autosummary): def get_items(self, names): """Try to import the given names, and return a list of ``[(name, signature, summary_string, real_name), ...]``. """ from sphinx.ext.autosummary import (get_import_prefixes_from_env, import_by_name, get_documenter, mangle_signature) env = self.state.document.settings.env prefixes = get_import_prefixes_from_env(env) items = [] max_item_chars = 50 for name in names: display_name = name if name.startswith('~'): name = name[1:] display_name = name.split('.')[-1] try: import_by_name_values = import_by_name(name, prefixes=prefixes) except ImportError: self.warn('[astropyautosummary] failed to import %s' % name) items.append((name, '', '', name)) continue # to accommodate Sphinx v1.2.2 and v1.2.3 if len(import_by_name_values) == 3: real_name, obj, parent = import_by_name_values elif len(import_by_name_values) == 4: real_name, obj, parent, module_name = import_by_name_values # NB. using real_name here is important, since Documenters # handle module prefixes slightly differently documenter = get_documenter(obj, parent)(self, real_name) if not documenter.parse_name(): self.warn('[astropyautosummary] failed to parse name %s' % real_name) items.append((display_name, '', '', real_name)) continue if not documenter.import_object(): self.warn('[astropyautosummary] failed to import object %s' % real_name) items.append((display_name, '', '', real_name)) continue # -- Grab the signature sig = documenter.format_signature() if not sig: sig = '' else: max_chars = max(10, max_item_chars - len(display_name)) sig = mangle_signature(sig, max_chars=max_chars) sig = sig.replace('*', r'\*') # -- Grab the summary doc = list(documenter.process_doc(documenter.get_doc())) while doc and not doc[0].strip(): doc.pop(0) m = _itemsummrex.search(" ".join(doc).strip()) if m: summary = m.group(1).strip() elif doc: summary = doc[0].strip() else: summary = '' items.append((display_name, sig, summary, real_name)) return items def setup(app): # need autosummary, of course app.setup_extension('sphinx.ext.autosummary') # Don't make the replacement if Sphinx is at least 1.2 if LooseVersion(sphinx.__version__) < LooseVersion('1.2.0'): # this replaces the default autosummary with the astropy one app.add_directive('autosummary', AstropyAutosummary) elif LooseVersion(sphinx.__version__) < LooseVersion('1.3.2'): # Patch Autosummary again, but to work around an upstream bug; see # https://github.com/astropy/astropy-helpers/issues/172 class PatchedAutosummary(Autosummary): def get_items(self, names): self.genopt['imported-members'] = True return Autosummary.get_items(self, names) app.add_directive('autosummary', PatchedAutosummary) reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/autodoc_enhancements.py0000644000077000000240000001130213173066253030751 0ustar tomstaff00000000000000""" Miscellaneous enhancements to help autodoc along. """ import inspect import sys import types from sphinx.ext.autodoc import AttributeDocumenter, ModuleDocumenter from sphinx.util.inspect import isdescriptor if sys.version_info[0] == 3: class_types = (type,) else: class_types = (type, types.ClassType) MethodDescriptorType = type(type.__subclasses__) # See # https://github.com/astropy/astropy-helpers/issues/116#issuecomment-71254836 # for further background on this. def type_object_attrgetter(obj, attr, *defargs): """ This implements an improved attrgetter for type objects (i.e. classes) that can handle class attributes that are implemented as properties on a metaclass. Normally `getattr` on a class with a `property` (say, "foo"), would return the `property` object itself. However, if the class has a metaclass which *also* defines a `property` named "foo", ``getattr(cls, 'foo')`` will find the "foo" property on the metaclass and resolve it. For the purposes of autodoc we just want to document the "foo" property defined on the class, not on the metaclass. For example:: >>> class Meta(type): ... @property ... def foo(cls): ... return 'foo' ... >>> class MyClass(metaclass=Meta): ... @property ... def foo(self): ... \"\"\"Docstring for MyClass.foo property.\"\"\" ... return 'myfoo' ... >>> getattr(MyClass, 'foo') 'foo' >>> type_object_attrgetter(MyClass, 'foo') >>> type_object_attrgetter(MyClass, 'foo').__doc__ 'Docstring for MyClass.foo property.' The last line of the example shows the desired behavior for the purposes of autodoc. """ for base in obj.__mro__: if attr in base.__dict__: if isinstance(base.__dict__[attr], property): # Note, this should only be used for properties--for any other # type of descriptor (classmethod, for example) this can mess # up existing expectations of what getattr(cls, ...) returns return base.__dict__[attr] break return getattr(obj, attr, *defargs) # Provided to work around a bug in Sphinx # See https://github.com/sphinx-doc/sphinx/pull/1843 class AttributeDocumenter(AttributeDocumenter): @classmethod def can_document_member(cls, member, membername, isattr, parent): non_attr_types = cls.method_types + class_types + \ (MethodDescriptorType,) isdatadesc = isdescriptor(member) and not \ isinstance(member, non_attr_types) and not \ type(member).__name__ == "instancemethod" # That last condition addresses an obscure case of C-defined # methods using a deprecated type in Python 3, that is not otherwise # exported anywhere by Python return isdatadesc or (not isinstance(parent, ModuleDocumenter) and not inspect.isroutine(member) and not isinstance(member, class_types)) def setup(app): # Must have the autodoc extension set up first so we can override it app.setup_extension('sphinx.ext.autodoc') # Need to import this too since it re-registers all the documenter types # =_= import sphinx.ext.autosummary.generate app.add_autodoc_attrgetter(type, type_object_attrgetter) if sphinx.version_info < (1,4,2): # this is a really ugly hack to supress a warning that sphinx 1.4 # generates when overriding an existing directive (which is *desired* # behavior here). As of sphinx v1.4.2, this has been fixed: # https://github.com/sphinx-doc/sphinx/issues/2451 # But we leave it in for 1.4.0/1.4.1 . But if the "needs_sphinx" is # eventually updated to >= 1.4.2, this should be removed entirely (in # favor of the line in the "else" clause) _oldwarn = app._warning _oldwarncount = app._warncount try: try: # *this* is in a try/finally because we don't want to force six as # a real dependency. In sphinx 1.4, six is a prerequisite, so # there's no issue. But in older sphinxes this may not be true... # but the inderlying warning is absent anyway so we let it slide. from six import StringIO app._warning = StringIO() except ImportError: pass app.add_autodocumenter(AttributeDocumenter) finally: app._warning = _oldwarn app._warncount = _oldwarncount else: app.add_autodocumenter(AttributeDocumenter) reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/automodapi.py0000644000077000000240000003406213173066253026735 0ustar tomstaff00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ This sphinx extension adds a tools to simplify generating the API documentation for Astropy packages and affiliated packages. .. _automodapi: ======================== automodapi directive ======================== This directive takes a single argument that must be a module or package. It will produce a block of documentation that includes the docstring for the package, an :ref:`automodsumm` directive, and an :ref:`automod-diagram` if there are any classes in the module. If only the main docstring of the module/package is desired in the documentation, use `automodule`_ instead of `automodapi`_. It accepts the following options: * ``:no-inheritance-diagram:`` If present, the inheritance diagram will not be shown even if the module/package has classes. * ``:skip: str`` This option results in the specified object being skipped, that is the object will *not* be included in the generated documentation. This option may appear any number of times to skip multiple objects. * ``:no-main-docstr:`` If present, the docstring for the module/package will not be generated. The function and class tables will still be used, however. * ``:headings: str`` Specifies the characters (in one string) used as the heading levels used for the generated section. This must have at least 2 characters (any after 2 will be ignored). This also *must* match the rest of the documentation on this page for sphinx to be happy. Defaults to "-^", which matches the convention used for Python's documentation, assuming the automodapi call is inside a top-level section (which usually uses '='). * ``:no-heading:`` If specified do not create a top level heading for the section. That is, do not create a title heading with text like "packagename Package". The actual docstring for the package/module will still be shown, though, unless ``:no-main-docstr:`` is given. * ``:allowed-package-names: str`` Specifies the packages that functions/classes documented here are allowed to be from, as comma-separated list of package names. If not given, only objects that are actually in a subpackage of the package currently being documented are included. * ``:inherited-members:`` / ``:no-inherited-members:`` The global sphinx configuration option ``automodsumm_inherited_members`` decides if members that a class inherits from a base class are included in the generated documentation. The option ``:inherited-members:`` or ``:no-inherited-members:`` allows the user to overrride the global setting. This extension also adds two sphinx configuration options: * ``automodapi_toctreedirnm`` This must be a string that specifies the name of the directory the automodsumm generated documentation ends up in. This directory path should be relative to the documentation root (e.g., same place as ``index.rst``). Defaults to ``'api'``. * ``automodapi_writereprocessed`` Should be a bool, and if `True`, will cause `automodapi`_ to write files with any `automodapi`_ sections replaced with the content Sphinx processes after `automodapi`_ has run. The output files are not actually used by sphinx, so this option is only for figuring out the cause of sphinx warnings or other debugging. Defaults to `False`. * ``automodsumm_inherited_members`` Should be a bool and if ``True`` members that a class inherits from a base class are included in the generated documentation. Defaults to ``False``. .. _automodule: http://sphinx-doc.org/latest/ext/autodoc.html?highlight=automodule#directive-automodule """ # Implementation note: # The 'automodapi' directive is not actually implemented as a docutils # directive. Instead, this extension searches for the 'automodapi' text in # all sphinx documents, and replaces it where necessary from a template built # into this extension. This is necessary because automodsumm (and autosummary) # use the "builder-inited" event, which comes before the directives are # actually built. import inspect import os import re import sys from .utils import find_mod_objs if sys.version_info[0] == 3: text_type = str else: text_type = unicode automod_templ_modheader = """ {modname} {pkgormod} {modhds}{pkgormodhds} {automoduleline} """ automod_templ_classes = """ Classes {clshds} .. automodsumm:: {modname} :classes-only: {clsfuncoptions} """ automod_templ_funcs = """ Functions {funchds} .. automodsumm:: {modname} :functions-only: {clsfuncoptions} """ automod_templ_inh = """ Class Inheritance Diagram {clsinhsechds} .. automod-diagram:: {modname} :private-bases: :parts: 1 {allowedpkgnms} """ _automodapirex = re.compile(r'^(?:\s*\.\.\s+automodapi::\s*)([A-Za-z0-9_.]+)' r'\s*$((?:\n\s+:[a-zA-Z_\-]+:.*$)*)', flags=re.MULTILINE) # the last group of the above regex is intended to go into finall with the below _automodapiargsrex = re.compile(r':([a-zA-Z_\-]+):(.*)$', flags=re.MULTILINE) def automodapi_replace(sourcestr, app, dotoctree=True, docname=None, warnings=True): """ Replaces `sourcestr`'s entries of ".. automdapi::" with the automodapi template form based on provided options. This is used with the sphinx event 'source-read' to replace `automodapi`_ entries before sphinx actually processes them, as automodsumm needs the code to be present to generate stub documentation. Parameters ---------- sourcestr : str The string with sphinx source to be checked for automodapi replacement. app : `sphinx.application.Application` The sphinx application. dotoctree : bool If `True`, a ":toctree:" option will be added in the ".. automodsumm::" sections of the template, pointing to the appropriate "generated" directory based on the Astropy convention (e.g. in ``docs/api``) docname : str The name of the file for this `sourcestr` (if known - if not, it can be `None`). If not provided and `dotoctree` is `True`, the generated files may end up in the wrong place. warnings : bool If `False`, all warnings that would normally be issued are silenced. Returns ------- newstr :str The string with automodapi entries replaced with the correct sphinx markup. """ spl = _automodapirex.split(sourcestr) if len(spl) > 1: # automodsumm is in this document if dotoctree: toctreestr = ':toctree: ' dirnm = app.config.automodapi_toctreedirnm if not dirnm.endswith("/"): dirnm += "/" if docname is not None: toctreestr += '../' * docname.count('/') + dirnm else: toctreestr += dirnm else: toctreestr = '' newstrs = [spl[0]] for grp in range(len(spl) // 3): modnm = spl[grp * 3 + 1] # find where this is in the document for warnings if docname is None: location = None else: location = (docname, spl[0].count('\n')) # initialize default options toskip = [] inhdiag = maindocstr = top_head = True hds = '-^' allowedpkgnms = [] # look for actual options unknownops = [] inherited_members = None for opname, args in _automodapiargsrex.findall(spl[grp * 3 + 2]): if opname == 'skip': toskip.append(args.strip()) elif opname == 'no-inheritance-diagram': inhdiag = False elif opname == 'no-main-docstr': maindocstr = False elif opname == 'headings': hds = args elif opname == 'no-heading': top_head = False elif opname == 'allowed-package-names': allowedpkgnms.append(args.strip()) elif opname == 'inherited-members': inherited_members = True elif opname == 'no-inherited-members': inherited_members = False else: unknownops.append(opname) # join all the allowedpkgnms if len(allowedpkgnms) == 0: allowedpkgnms = '' onlylocals = True else: allowedpkgnms = ':allowed-package-names: ' + ','.join(allowedpkgnms) onlylocals = allowedpkgnms # get the two heading chars if len(hds) < 2: msg = 'Not enough headings (got {0}, need 2), using default -^' if warnings: app.warn(msg.format(len(hds)), location) hds = '-^' h1, h2 = hds.lstrip()[:2] # tell sphinx that the remaining args are invalid. if len(unknownops) > 0 and app is not None: opsstrs = ','.join(unknownops) msg = 'Found additional options ' + opsstrs + ' in automodapi.' if warnings: app.warn(msg, location) ispkg, hascls, hasfuncs = _mod_info(modnm, toskip, onlylocals=onlylocals) # add automodule directive only if no-main-docstr isn't present if maindocstr: automodline = '.. automodule:: {modname}'.format(modname=modnm) else: automodline = '' if top_head: newstrs.append(automod_templ_modheader.format( modname=modnm, modhds=h1 * len(modnm), pkgormod='Package' if ispkg else 'Module', pkgormodhds=h1 * (8 if ispkg else 7), automoduleline=automodline)) else: newstrs.append(automod_templ_modheader.format( modname='', modhds='', pkgormod='', pkgormodhds='', automoduleline=automodline)) # construct the options for the class/function sections # start out indented at 4 spaces, but need to keep the indentation. clsfuncoptions = [] if toctreestr: clsfuncoptions.append(toctreestr) if toskip: clsfuncoptions.append(':skip: ' + ','.join(toskip)) if allowedpkgnms: clsfuncoptions.append(allowedpkgnms) if hascls: # This makes no sense unless there are classes. if inherited_members is True: clsfuncoptions.append(':inherited-members:') if inherited_members is False: clsfuncoptions.append(':no-inherited-members:') clsfuncoptionstr = '\n '.join(clsfuncoptions) if hasfuncs: newstrs.append(automod_templ_funcs.format( modname=modnm, funchds=h2 * 9, clsfuncoptions=clsfuncoptionstr)) if hascls: newstrs.append(automod_templ_classes.format( modname=modnm, clshds=h2 * 7, clsfuncoptions=clsfuncoptionstr)) if inhdiag and hascls: # add inheritance diagram if any classes are in the module newstrs.append(automod_templ_inh.format( modname=modnm, clsinhsechds=h2 * 25, allowedpkgnms=allowedpkgnms)) newstrs.append(spl[grp * 3 + 3]) newsourcestr = ''.join(newstrs) if app.config.automodapi_writereprocessed: # sometimes they are unicode, sometimes not, depending on how # sphinx has processed things if isinstance(newsourcestr, text_type): ustr = newsourcestr else: ustr = newsourcestr.decode(app.config.source_encoding) if docname is None: with open(os.path.join(app.srcdir, 'unknown.automodapi'), 'a') as f: f.write('\n**NEW DOC**\n\n') f.write(ustr) else: env = app.builder.env # Determine the filename associated with this doc (specifically # the extension) filename = docname + os.path.splitext(env.doc2path(docname))[1] filename += '.automodapi' with open(os.path.join(app.srcdir, filename), 'w') as f: f.write(ustr) return newsourcestr else: return sourcestr def _mod_info(modname, toskip=[], onlylocals=True): """ Determines if a module is a module or a package and whether or not it has classes or functions. """ hascls = hasfunc = False for localnm, fqnm, obj in zip(*find_mod_objs(modname, onlylocals=onlylocals)): if localnm not in toskip: hascls = hascls or inspect.isclass(obj) hasfunc = hasfunc or inspect.isroutine(obj) if hascls and hasfunc: break # find_mod_objs has already imported modname # TODO: There is probably a cleaner way to do this, though this is pretty # reliable for all Python versions for most cases that we care about. pkg = sys.modules[modname] ispkg = (hasattr(pkg, '__file__') and isinstance(pkg.__file__, str) and os.path.split(pkg.__file__)[1].startswith('__init__.py')) return ispkg, hascls, hasfunc def process_automodapi(app, docname, source): source[0] = automodapi_replace(source[0], app, True, docname) def setup(app): # need automodsumm for automodapi app.setup_extension('astropy_helpers.sphinx.ext.automodsumm') app.connect('source-read', process_automodapi) app.add_config_value('automodapi_toctreedirnm', 'api', True) app.add_config_value('automodapi_writereprocessed', False, True) reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/automodsumm.py0000644000077000000240000006067413173066253027155 0ustar tomstaff00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ This sphinx extension adds two directives for summarizing the public members of a module or package. These directives are primarily for use with the `automodapi`_ extension, but can be used independently. .. _automodsumm: ======================= automodsumm directive ======================= This directive will produce an "autosummary"-style table for public attributes of a specified module. See the `sphinx.ext.autosummary`_ extension for details on this process. The main difference from the `autosummary`_ directive is that `autosummary`_ requires manually inputting all attributes that appear in the table, while this captures the entries automatically. This directive requires a single argument that must be a module or package. It also accepts any options supported by the `autosummary`_ directive- see `sphinx.ext.autosummary`_ for details. It also accepts some additional options: * ``:classes-only:`` If present, the autosummary table will only contain entries for classes. This cannot be used at the same time with ``:functions-only:`` . * ``:functions-only:`` If present, the autosummary table will only contain entries for functions. This cannot be used at the same time with ``:classes-only:`` . * ``:skip: obj1, [obj2, obj3, ...]`` If present, specifies that the listed objects should be skipped and not have their documentation generated, nor be included in the summary table. * ``:allowed-package-names: pkgormod1, [pkgormod2, pkgormod3, ...]`` Specifies the packages that functions/classes documented here are allowed to be from, as comma-separated list of package names. If not given, only objects that are actually in a subpackage of the package currently being documented are included. * ``:inherited-members:`` or ``:no-inherited-members:`` The global sphinx configuration option ``automodsumm_inherited_members`` decides if members that a class inherits from a base class are included in the generated documentation. The flags ``:inherited-members:`` or ``:no-inherited-members:`` allows overrriding this global setting. This extension also adds two sphinx configuration options: * ``automodsumm_writereprocessed`` Should be a bool, and if ``True``, will cause `automodsumm`_ to write files with any ``automodsumm`` sections replaced with the content Sphinx processes after ``automodsumm`` has run. The output files are not actually used by sphinx, so this option is only for figuring out the cause of sphinx warnings or other debugging. Defaults to ``False``. * ``automodsumm_inherited_members`` Should be a bool and if ``True``, will cause `automodsumm`_ to document class members that are inherited from a base class. This value can be overriden for any particular automodsumm directive by including the ``:inherited-members:`` or ``:no-inherited-members:`` options. Defaults to ``False``. .. _sphinx.ext.autosummary: http://sphinx-doc.org/latest/ext/autosummary.html .. _autosummary: http://sphinx-doc.org/latest/ext/autosummary.html#directive-autosummary .. _automod-diagram: =========================== automod-diagram directive =========================== This directive will produce an inheritance diagram like that of the `sphinx.ext.inheritance_diagram`_ extension. This directive requires a single argument that must be a module or package. It accepts no options. .. note:: Like 'inheritance-diagram', 'automod-diagram' requires `graphviz `_ to generate the inheritance diagram. .. _sphinx.ext.inheritance_diagram: http://sphinx-doc.org/latest/ext/inheritance.html """ import inspect import os import re from distutils.version import LooseVersion import sphinx from sphinx.ext.autosummary import Autosummary from sphinx.ext.inheritance_diagram import InheritanceDiagram from docutils.parsers.rst.directives import flag from .utils import find_mod_objs from .astropyautosummary import AstropyAutosummary # Don't use AstropyAutosummary with newer versions of Sphinx # See https://github.com/astropy/astropy-helpers/pull/129 if LooseVersion(sphinx.__version__) < LooseVersion('1.2.0'): BaseAutosummary = AstropyAutosummary else: BaseAutosummary = Autosummary def _str_list_converter(argument): """ A directive option conversion function that converts the option into a list of strings. Used for 'skip' option. """ if argument is None: return [] else: return [s.strip() for s in argument.split(',')] class Automodsumm(BaseAutosummary): required_arguments = 1 optional_arguments = 0 final_argument_whitespace = False has_content = False option_spec = dict(Autosummary.option_spec) option_spec['functions-only'] = flag option_spec['classes-only'] = flag option_spec['skip'] = _str_list_converter option_spec['allowed-package-names'] = _str_list_converter option_spec['inherited-members'] = flag option_spec['no-inherited-members'] = flag def run(self): env = self.state.document.settings.env modname = self.arguments[0] self.warnings = [] nodelist = [] try: localnames, fqns, objs = find_mod_objs(modname) except ImportError: self.warnings = [] self.warn("Couldn't import module " + modname) return self.warnings try: # set self.content to trick the Autosummary internals. # Be sure to respect functions-only and classes-only. funconly = 'functions-only' in self.options clsonly = 'classes-only' in self.options skipnames = [] if 'skip' in self.options: option_skipnames = set(self.options['skip']) for lnm in localnames: if lnm in option_skipnames: option_skipnames.remove(lnm) skipnames.append(lnm) if len(option_skipnames) > 0: self.warn('Tried to skip objects {objs} in module {mod}, ' 'but they were not present. Ignoring.' .format(objs=option_skipnames, mod=modname)) if funconly and not clsonly: cont = [] for nm, obj in zip(localnames, objs): if nm not in skipnames and inspect.isroutine(obj): cont.append(nm) elif clsonly: cont = [] for nm, obj in zip(localnames, objs): if nm not in skipnames and inspect.isclass(obj): cont.append(nm) else: if clsonly and funconly: self.warning('functions-only and classes-only both ' 'defined. Skipping.') cont = [nm for nm in localnames if nm not in skipnames] self.content = cont # for some reason, even though ``currentmodule`` is substituted in, # sphinx doesn't necessarily recognize this fact. So we just force # it internally, and that seems to fix things env.temp_data['py:module'] = modname # can't use super because Sphinx/docutils has trouble return # super(Autosummary,self).run() nodelist.extend(Autosummary.run(self)) return self.warnings + nodelist finally: # has_content = False for the Automodsumm self.content = [] def get_items(self, names): self.genopt['imported-members'] = True return Autosummary.get_items(self, names) # <-------------------automod-diagram stuff-----------------------------------> class Automoddiagram(InheritanceDiagram): option_spec = dict(InheritanceDiagram.option_spec) option_spec['allowed-package-names'] = _str_list_converter def run(self): try: ols = self.options.get('allowed-package-names', []) ols = True if len(ols) == 0 else ols # if none are given, assume only local nms, objs = find_mod_objs(self.arguments[0], onlylocals=ols)[1:] except ImportError: self.warnings = [] self.warn("Couldn't import module " + self.arguments[0]) return self.warnings clsnms = [] for n, o in zip(nms, objs): if inspect.isclass(o): clsnms.append(n) oldargs = self.arguments try: if len(clsnms) > 0: self.arguments = [' '.join(clsnms)] return InheritanceDiagram.run(self) finally: self.arguments = oldargs # <---------------------automodsumm generation stuff--------------------------> def process_automodsumm_generation(app): env = app.builder.env filestosearch = [] for docname in env.found_docs: filename = env.doc2path(docname) if os.path.isfile(filename): filestosearch.append(docname + os.path.splitext(filename)[1]) liness = [] for sfn in filestosearch: lines = automodsumm_to_autosummary_lines(sfn, app) liness.append(lines) if app.config.automodsumm_writereprocessed: if lines: # empty list means no automodsumm entry is in the file outfn = os.path.join(app.srcdir, sfn) + '.automodsumm' with open(outfn, 'w') as f: for l in lines: f.write(l) f.write('\n') for sfn, lines in zip(filestosearch, liness): suffix = os.path.splitext(sfn)[1] if len(lines) > 0: generate_automodsumm_docs( lines, sfn, builder=app.builder, warn=app.warn, info=app.info, suffix=suffix, base_path=app.srcdir, inherited_members=app.config.automodsumm_inherited_members) # _automodsummrex = re.compile(r'^(\s*)\.\. automodsumm::\s*([A-Za-z0-9_.]+)\s*' # r'\n\1(\s*)(\S|$)', re.MULTILINE) _lineendrex = r'(?:\n|$)' _hdrex = r'^\n?(\s*)\.\. automodsumm::\s*(\S+)\s*' + _lineendrex _oprex1 = r'(?:\1(\s+)\S.*' + _lineendrex + ')' _oprex2 = r'(?:\1\4\S.*' + _lineendrex + ')' _automodsummrex = re.compile(_hdrex + '(' + _oprex1 + '?' + _oprex2 + '*)', re.MULTILINE) def automodsumm_to_autosummary_lines(fn, app): """ Generates lines from a file with an "automodsumm" entry suitable for feeding into "autosummary". Searches the provided file for `automodsumm` directives and returns a list of lines specifying the `autosummary` commands for the modules requested. This does *not* return the whole file contents - just an autosummary section in place of any :automodsumm: entries. Note that any options given for `automodsumm` are also included in the generated `autosummary` section. Parameters ---------- fn : str The name of the file to search for `automodsumm` entries. app : sphinx.application.Application The sphinx Application object Return ------ lines : list of str Lines for all `automodsumm` entries with the entries replaced by `autosummary` and the module's members added. """ fullfn = os.path.join(app.builder.env.srcdir, fn) with open(fullfn) as fr: if 'astropy_helpers.sphinx.ext.automodapi' in app._extensions: from astropy_helpers.sphinx.ext.automodapi import automodapi_replace # Must do the automodapi on the source to get the automodsumm # that might be in there docname = os.path.splitext(fn)[0] filestr = automodapi_replace(fr.read(), app, True, docname, False) else: filestr = fr.read() spl = _automodsummrex.split(filestr) # 0th entry is the stuff before the first automodsumm line indent1s = spl[1::5] mods = spl[2::5] opssecs = spl[3::5] indent2s = spl[4::5] remainders = spl[5::5] # only grab automodsumm sections and convert them to autosummary with the # entries for all the public objects newlines = [] # loop over all automodsumms in this document for i, (i1, i2, modnm, ops, rem) in enumerate(zip(indent1s, indent2s, mods, opssecs, remainders)): allindent = i1 + ('' if i2 is None else i2) # filter out functions-only and classes-only options if present oplines = ops.split('\n') toskip = [] allowedpkgnms = [] funcsonly = clssonly = False for i, ln in reversed(list(enumerate(oplines))): if ':functions-only:' in ln: funcsonly = True del oplines[i] if ':classes-only:' in ln: clssonly = True del oplines[i] if ':skip:' in ln: toskip.extend(_str_list_converter(ln.replace(':skip:', ''))) del oplines[i] if ':allowed-package-names:' in ln: allowedpkgnms.extend(_str_list_converter(ln.replace(':allowed-package-names:', ''))) del oplines[i] if funcsonly and clssonly: msg = ('Defined both functions-only and classes-only options. ' 'Skipping this directive.') lnnum = sum([spl[j].count('\n') for j in range(i * 5 + 1)]) app.warn('[automodsumm]' + msg, (fn, lnnum)) continue # Use the currentmodule directive so we can just put the local names # in the autosummary table. Note that this doesn't always seem to # actually "take" in Sphinx's eyes, so in `Automodsumm.run`, we have to # force it internally, as well. newlines.extend([i1 + '.. currentmodule:: ' + modnm, '', '.. autosummary::']) newlines.extend(oplines) ols = True if len(allowedpkgnms) == 0 else allowedpkgnms for nm, fqn, obj in zip(*find_mod_objs(modnm, onlylocals=ols)): if nm in toskip: continue if funcsonly and not inspect.isroutine(obj): continue if clssonly and not inspect.isclass(obj): continue newlines.append(allindent + nm) # add one newline at the end of the autosummary block newlines.append('') return newlines def generate_automodsumm_docs(lines, srcfn, suffix='.rst', warn=None, info=None, base_path=None, builder=None, template_dir=None, inherited_members=False): """ This function is adapted from `sphinx.ext.autosummary.generate.generate_autosummmary_docs` to generate source for the automodsumm directives that should be autosummarized. Unlike generate_autosummary_docs, this function is called one file at a time. """ from sphinx.jinja2glue import BuiltinTemplateLoader from sphinx.ext.autosummary import import_by_name, get_documenter from sphinx.ext.autosummary.generate import (_simple_info, _simple_warn) from sphinx.util.osutil import ensuredir from sphinx.util.inspect import safe_getattr from jinja2 import FileSystemLoader, TemplateNotFound from jinja2.sandbox import SandboxedEnvironment from .utils import find_autosummary_in_lines_for_automodsumm as find_autosummary_in_lines if info is None: info = _simple_info if warn is None: warn = _simple_warn # info('[automodsumm] generating automodsumm for: ' + srcfn) # Create our own templating environment - here we use Astropy's # templates rather than the default autosummary templates, in order to # allow docstrings to be shown for methods. template_dirs = [os.path.join(os.path.dirname(__file__), 'templates'), os.path.join(base_path, '_templates')] if builder is not None: # allow the user to override the templates template_loader = BuiltinTemplateLoader() template_loader.init(builder, dirs=template_dirs) else: if template_dir: template_dirs.insert(0, template_dir) template_loader = FileSystemLoader(template_dirs) template_env = SandboxedEnvironment(loader=template_loader) # read # items = find_autosummary_in_files(sources) items = find_autosummary_in_lines(lines, filename=srcfn) if len(items) > 0: msg = '[automodsumm] {1}: found {0} automodsumm entries to generate' info(msg.format(len(items), srcfn)) # gennms = [item[0] for item in items] # if len(gennms) > 20: # gennms = gennms[:10] + ['...'] + gennms[-10:] # info('[automodsumm] generating autosummary for: ' + ', '.join(gennms)) # remove possible duplicates items = dict([(item, True) for item in items]).keys() # keep track of new files new_files = [] # write for name, path, template_name, inherited_mem in sorted(items): if path is None: # The corresponding autosummary:: directive did not have # a :toctree: option continue path = os.path.abspath(path) ensuredir(path) try: import_by_name_values = import_by_name(name) except ImportError as e: warn('[automodsumm] failed to import %r: %s' % (name, e)) continue # if block to accommodate Sphinx's v1.2.2 and v1.2.3 respectively if len(import_by_name_values) == 3: name, obj, parent = import_by_name_values elif len(import_by_name_values) == 4: name, obj, parent, module_name = import_by_name_values fn = os.path.join(path, name + suffix) # skip it if it exists if os.path.isfile(fn): continue new_files.append(fn) f = open(fn, 'w') try: doc = get_documenter(obj, parent) if template_name is not None: template = template_env.get_template(template_name) else: tmplstr = 'autosummary/%s.rst' try: template = template_env.get_template(tmplstr % doc.objtype) except TemplateNotFound: template = template_env.get_template(tmplstr % 'base') def get_members_mod(obj, typ, include_public=[]): """ typ = None -> all """ items = [] for name in dir(obj): try: documenter = get_documenter(safe_getattr(obj, name), obj) except AttributeError: continue if typ is None or documenter.objtype == typ: items.append(name) public = [x for x in items if x in include_public or not x.startswith('_')] return public, items def get_members_class(obj, typ, include_public=[], include_base=False): """ typ = None -> all include_base -> include attrs that are from a base class """ items = [] # using dir gets all of the attributes, including the elements # from the base class, otherwise use __slots__ or __dict__ if include_base: names = dir(obj) else: if hasattr(obj, '__slots__'): names = tuple(getattr(obj, '__slots__')) else: names = getattr(obj, '__dict__').keys() for name in names: try: documenter = get_documenter(safe_getattr(obj, name), obj) except AttributeError: continue if typ is None or documenter.objtype == typ: items.append(name) public = [x for x in items if x in include_public or not x.startswith('_')] return public, items ns = {} if doc.objtype == 'module': ns['members'] = get_members_mod(obj, None) ns['functions'], ns['all_functions'] = \ get_members_mod(obj, 'function') ns['classes'], ns['all_classes'] = \ get_members_mod(obj, 'class') ns['exceptions'], ns['all_exceptions'] = \ get_members_mod(obj, 'exception') elif doc.objtype == 'class': if inherited_mem is not None: # option set in this specifc directive include_base = inherited_mem else: # use default value include_base = inherited_members api_class_methods = ['__init__', '__call__'] ns['members'] = get_members_class(obj, None, include_base=include_base) ns['methods'], ns['all_methods'] = \ get_members_class(obj, 'method', api_class_methods, include_base=include_base) ns['attributes'], ns['all_attributes'] = \ get_members_class(obj, 'attribute', include_base=include_base) ns['methods'].sort() ns['attributes'].sort() parts = name.split('.') if doc.objtype in ('method', 'attribute'): mod_name = '.'.join(parts[:-2]) cls_name = parts[-2] obj_name = '.'.join(parts[-2:]) ns['class'] = cls_name else: mod_name, obj_name = '.'.join(parts[:-1]), parts[-1] ns['fullname'] = name ns['module'] = mod_name ns['objname'] = obj_name ns['name'] = parts[-1] ns['objtype'] = doc.objtype ns['underline'] = len(name) * '=' # We now check whether a file for reference footnotes exists for # the module being documented. We first check if the # current module is a file or a directory, as this will give a # different path for the reference file. For example, if # documenting astropy.wcs then the reference file is at # ../wcs/references.txt, while if we are documenting # astropy.config.logging_helper (which is at # astropy/config/logging_helper.py) then the reference file is set # to ../config/references.txt if '.' in mod_name: mod_name_dir = mod_name.replace('.', '/').split('/', 1)[1] else: mod_name_dir = mod_name if not os.path.isdir(os.path.join(base_path, mod_name_dir)) \ and os.path.isdir(os.path.join(base_path, mod_name_dir.rsplit('/', 1)[0])): mod_name_dir = mod_name_dir.rsplit('/', 1)[0] # We then have to check whether it exists, and if so, we pass it # to the template. if os.path.exists(os.path.join(base_path, mod_name_dir, 'references.txt')): # An important subtlety here is that the path we pass in has # to be relative to the file being generated, so we have to # figure out the right number of '..'s ndirsback = path.replace(base_path, '').count('/') ref_file_rel_segments = ['..'] * ndirsback ref_file_rel_segments.append(mod_name_dir) ref_file_rel_segments.append('references.txt') ns['referencefile'] = os.path.join(*ref_file_rel_segments) rendered = template.render(**ns) f.write(rendered) finally: f.close() def setup(app): # need our autosummary and autodoc fixes app.setup_extension('astropy_helpers.sphinx.ext.astropyautosummary') app.setup_extension('astropy_helpers.sphinx.ext.autodoc_enhancements') # need inheritance-diagram for automod-diagram app.setup_extension('sphinx.ext.inheritance_diagram') app.add_directive('automod-diagram', Automoddiagram) app.add_directive('automodsumm', Automodsumm) app.connect('builder-inited', process_automodsumm_generation) app.add_config_value('automodsumm_writereprocessed', False, True) app.add_config_value('automodsumm_inherited_members', False, 'env') reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/changelog_links.py0000644000077000000240000000542012412303325027703 0ustar tomstaff00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ This sphinx extension makes the issue numbers in the changelog into links to GitHub issues. """ from __future__ import print_function import re from docutils.nodes import Text, reference BLOCK_PATTERN = re.compile('\[#.+\]', flags=re.DOTALL) ISSUE_PATTERN = re.compile('#[0-9]+') def process_changelog_links(app, doctree, docname): for rex in app.changelog_links_rexes: if rex.match(docname): break else: # if the doc doesn't match any of the changelog regexes, don't process return app.info('[changelog_links] Adding changelog links to "{0}"'.format(docname)) for item in doctree.traverse(): if not isinstance(item, Text): continue # We build a new list of items to replace the current item. If # a link is found, we need to use a 'reference' item. children = [] # First cycle through blocks of issues (delimited by []) then # iterate inside each one to find the individual issues. prev_block_end = 0 for block in BLOCK_PATTERN.finditer(item): block_start, block_end = block.start(), block.end() children.append(Text(item[prev_block_end:block_start])) block = item[block_start:block_end] prev_end = 0 for m in ISSUE_PATTERN.finditer(block): start, end = m.start(), m.end() children.append(Text(block[prev_end:start])) issue_number = block[start:end] refuri = app.config.github_issues_url + issue_number[1:] children.append(reference(text=issue_number, name=issue_number, refuri=refuri)) prev_end = end prev_block_end = block_end # If no issues were found, this adds the whole item, # otherwise it adds the remaining text. children.append(Text(block[prev_end:block_end])) # If no blocks were found, this adds the whole item, otherwise # it adds the remaining text. children.append(Text(item[prev_block_end:])) # Replace item by the new list of items we have generated, # which may contain links. item.parent.replace(item, children) def setup_patterns_rexes(app): app.changelog_links_rexes = [re.compile(pat) for pat in app.config.changelog_links_docpattern] def setup(app): app.connect('doctree-resolved', process_changelog_links) app.connect('builder-inited', setup_patterns_rexes) app.add_config_value('github_issues_url', None, True) app.add_config_value('changelog_links_docpattern', ['.*changelog.*', 'whatsnew/.*'], True) reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/comment_eater.py0000644000077000000240000001245113173066253027413 0ustar tomstaff00000000000000from __future__ import division, absolute_import, print_function import sys if sys.version_info[0] >= 3: from io import StringIO else: from io import StringIO import compiler import inspect import textwrap import tokenize from .compiler_unparse import unparse class Comment(object): """ A comment block. """ is_comment = True def __init__(self, start_lineno, end_lineno, text): # int : The first line number in the block. 1-indexed. self.start_lineno = start_lineno # int : The last line number. Inclusive! self.end_lineno = end_lineno # str : The text block including '#' character but not any leading spaces. self.text = text def add(self, string, start, end, line): """ Add a new comment line. """ self.start_lineno = min(self.start_lineno, start[0]) self.end_lineno = max(self.end_lineno, end[0]) self.text += string def __repr__(self): return '%s(%r, %r, %r)' % (self.__class__.__name__, self.start_lineno, self.end_lineno, self.text) class NonComment(object): """ A non-comment block of code. """ is_comment = False def __init__(self, start_lineno, end_lineno): self.start_lineno = start_lineno self.end_lineno = end_lineno def add(self, string, start, end, line): """ Add lines to the block. """ if string.strip(): # Only add if not entirely whitespace. self.start_lineno = min(self.start_lineno, start[0]) self.end_lineno = max(self.end_lineno, end[0]) def __repr__(self): return '%s(%r, %r)' % (self.__class__.__name__, self.start_lineno, self.end_lineno) class CommentBlocker(object): """ Pull out contiguous comment blocks. """ def __init__(self): # Start with a dummy. self.current_block = NonComment(0, 0) # All of the blocks seen so far. self.blocks = [] # The index mapping lines of code to their associated comment blocks. self.index = {} def process_file(self, file): """ Process a file object. """ if sys.version_info[0] >= 3: nxt = file.__next__ else: nxt = file.next for token in tokenize.generate_tokens(nxt): self.process_token(*token) self.make_index() def process_token(self, kind, string, start, end, line): """ Process a single token. """ if self.current_block.is_comment: if kind == tokenize.COMMENT: self.current_block.add(string, start, end, line) else: self.new_noncomment(start[0], end[0]) else: if kind == tokenize.COMMENT: self.new_comment(string, start, end, line) else: self.current_block.add(string, start, end, line) def new_noncomment(self, start_lineno, end_lineno): """ We are transitioning from a noncomment to a comment. """ block = NonComment(start_lineno, end_lineno) self.blocks.append(block) self.current_block = block def new_comment(self, string, start, end, line): """ Possibly add a new comment. Only adds a new comment if this comment is the only thing on the line. Otherwise, it extends the noncomment block. """ prefix = line[:start[1]] if prefix.strip(): # Oops! Trailing comment, not a comment block. self.current_block.add(string, start, end, line) else: # A comment block. block = Comment(start[0], end[0], string) self.blocks.append(block) self.current_block = block def make_index(self): """ Make the index mapping lines of actual code to their associated prefix comments. """ for prev, block in zip(self.blocks[:-1], self.blocks[1:]): if not block.is_comment: self.index[block.start_lineno] = prev def search_for_comment(self, lineno, default=None): """ Find the comment block just before the given line number. Returns None (or the specified default) if there is no such block. """ if not self.index: self.make_index() block = self.index.get(lineno, None) text = getattr(block, 'text', default) return text def strip_comment_marker(text): """ Strip # markers at the front of a block of comment text. """ lines = [] for line in text.splitlines(): lines.append(line.lstrip('#')) text = textwrap.dedent('\n'.join(lines)) return text def get_class_traits(klass): """ Yield all of the documentation for trait definitions on a class object. """ # FIXME: gracefully handle errors here or in the caller? source = inspect.getsource(klass) cb = CommentBlocker() cb.process_file(StringIO(source)) mod_ast = compiler.parse(source) class_ast = mod_ast.node.nodes[0] for node in class_ast.code.nodes: # FIXME: handle other kinds of assignments? if isinstance(node, compiler.ast.Assign): name = node.nodes[0].name rhs = unparse(node.expr).strip() doc = strip_comment_marker(cb.search_for_comment(node.lineno, default='')) yield name, rhs, doc reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/compiler_unparse.py0000644000077000000240000006024413173066253030143 0ustar tomstaff00000000000000""" Turn compiler.ast structures back into executable python code. The unparse method takes a compiler.ast tree and transforms it back into valid python code. It is incomplete and currently only works for import statements, function calls, function definitions, assignments, and basic expressions. Inspired by python-2.5-svn/Demo/parser/unparse.py fixme: We may want to move to using _ast trees because the compiler for them is about 6 times faster than compiler.compile. """ from __future__ import division, absolute_import, print_function import sys from compiler.ast import Const, Name, Tuple, Div, Mul, Sub, Add if sys.version_info[0] >= 3: from io import StringIO else: from StringIO import StringIO def unparse(ast, single_line_functions=False): s = StringIO() UnparseCompilerAst(ast, s, single_line_functions) return s.getvalue().lstrip() op_precedence = { 'compiler.ast.Power':3, 'compiler.ast.Mul':2, 'compiler.ast.Div':2, 'compiler.ast.Add':1, 'compiler.ast.Sub':1 } class UnparseCompilerAst: """ Methods in this class recursively traverse an AST and output source code for the abstract syntax; original formatting is disregarged. """ ######################################################################### # object interface. ######################################################################### def __init__(self, tree, file = sys.stdout, single_line_functions=False): """ Unparser(tree, file=sys.stdout) -> None. Print the source for tree to file. """ self.f = file self._single_func = single_line_functions self._do_indent = True self._indent = 0 self._dispatch(tree) self._write("\n") self.f.flush() ######################################################################### # Unparser private interface. ######################################################################### ### format, output, and dispatch methods ################################ def _fill(self, text = ""): "Indent a piece of text, according to the current indentation level" if self._do_indent: self._write("\n"+" "*self._indent + text) else: self._write(text) def _write(self, text): "Append a piece of text to the current line." self.f.write(text) def _enter(self): "Print ':', and increase the indentation." self._write(": ") self._indent += 1 def _leave(self): "Decrease the indentation level." self._indent -= 1 def _dispatch(self, tree): "_dispatcher function, _dispatching tree type T to method _T." if isinstance(tree, list): for t in tree: self._dispatch(t) return meth = getattr(self, "_"+tree.__class__.__name__) if tree.__class__.__name__ == 'NoneType' and not self._do_indent: return meth(tree) ######################################################################### # compiler.ast unparsing methods. # # There should be one method per concrete grammar type. They are # organized in alphabetical order. ######################################################################### def _Add(self, t): self.__binary_op(t, '+') def _And(self, t): self._write(" (") for i, node in enumerate(t.nodes): self._dispatch(node) if i != len(t.nodes)-1: self._write(") and (") self._write(")") def _AssAttr(self, t): """ Handle assigning an attribute of an object """ self._dispatch(t.expr) self._write('.'+t.attrname) def _Assign(self, t): """ Expression Assignment such as "a = 1". This only handles assignment in expressions. Keyword assignment is handled separately. """ self._fill() for target in t.nodes: self._dispatch(target) self._write(" = ") self._dispatch(t.expr) if not self._do_indent: self._write('; ') def _AssName(self, t): """ Name on left hand side of expression. Treat just like a name on the right side of an expression. """ self._Name(t) def _AssTuple(self, t): """ Tuple on left hand side of an expression. """ # _write each elements, separated by a comma. for element in t.nodes[:-1]: self._dispatch(element) self._write(", ") # Handle the last one without writing comma last_element = t.nodes[-1] self._dispatch(last_element) def _AugAssign(self, t): """ +=,-=,*=,/=,**=, etc. operations """ self._fill() self._dispatch(t.node) self._write(' '+t.op+' ') self._dispatch(t.expr) if not self._do_indent: self._write(';') def _Bitand(self, t): """ Bit and operation. """ for i, node in enumerate(t.nodes): self._write("(") self._dispatch(node) self._write(")") if i != len(t.nodes)-1: self._write(" & ") def _Bitor(self, t): """ Bit or operation """ for i, node in enumerate(t.nodes): self._write("(") self._dispatch(node) self._write(")") if i != len(t.nodes)-1: self._write(" | ") def _CallFunc(self, t): """ Function call. """ self._dispatch(t.node) self._write("(") comma = False for e in t.args: if comma: self._write(", ") else: comma = True self._dispatch(e) if t.star_args: if comma: self._write(", ") else: comma = True self._write("*") self._dispatch(t.star_args) if t.dstar_args: if comma: self._write(", ") else: comma = True self._write("**") self._dispatch(t.dstar_args) self._write(")") def _Compare(self, t): self._dispatch(t.expr) for op, expr in t.ops: self._write(" " + op + " ") self._dispatch(expr) def _Const(self, t): """ A constant value such as an integer value, 3, or a string, "hello". """ self._dispatch(t.value) def _Decorators(self, t): """ Handle function decorators (eg. @has_units) """ for node in t.nodes: self._dispatch(node) def _Dict(self, t): self._write("{") for i, (k, v) in enumerate(t.items): self._dispatch(k) self._write(": ") self._dispatch(v) if i < len(t.items)-1: self._write(", ") self._write("}") def _Discard(self, t): """ Node for when return value is ignored such as in "foo(a)". """ self._fill() self._dispatch(t.expr) def _Div(self, t): self.__binary_op(t, '/') def _Ellipsis(self, t): self._write("...") def _From(self, t): """ Handle "from xyz import foo, bar as baz". """ # fixme: Are From and ImportFrom handled differently? self._fill("from ") self._write(t.modname) self._write(" import ") for i, (name,asname) in enumerate(t.names): if i != 0: self._write(", ") self._write(name) if asname is not None: self._write(" as "+asname) def _Function(self, t): """ Handle function definitions """ if t.decorators is not None: self._fill("@") self._dispatch(t.decorators) self._fill("def "+t.name + "(") defaults = [None] * (len(t.argnames) - len(t.defaults)) + list(t.defaults) for i, arg in enumerate(zip(t.argnames, defaults)): self._write(arg[0]) if arg[1] is not None: self._write('=') self._dispatch(arg[1]) if i < len(t.argnames)-1: self._write(', ') self._write(")") if self._single_func: self._do_indent = False self._enter() self._dispatch(t.code) self._leave() self._do_indent = True def _Getattr(self, t): """ Handle getting an attribute of an object """ if isinstance(t.expr, (Div, Mul, Sub, Add)): self._write('(') self._dispatch(t.expr) self._write(')') else: self._dispatch(t.expr) self._write('.'+t.attrname) def _If(self, t): self._fill() for i, (compare,code) in enumerate(t.tests): if i == 0: self._write("if ") else: self._write("elif ") self._dispatch(compare) self._enter() self._fill() self._dispatch(code) self._leave() self._write("\n") if t.else_ is not None: self._write("else") self._enter() self._fill() self._dispatch(t.else_) self._leave() self._write("\n") def _IfExp(self, t): self._dispatch(t.then) self._write(" if ") self._dispatch(t.test) if t.else_ is not None: self._write(" else (") self._dispatch(t.else_) self._write(")") def _Import(self, t): """ Handle "import xyz.foo". """ self._fill("import ") for i, (name,asname) in enumerate(t.names): if i != 0: self._write(", ") self._write(name) if asname is not None: self._write(" as "+asname) def _Keyword(self, t): """ Keyword value assignment within function calls and definitions. """ self._write(t.name) self._write("=") self._dispatch(t.expr) def _List(self, t): self._write("[") for i,node in enumerate(t.nodes): self._dispatch(node) if i < len(t.nodes)-1: self._write(", ") self._write("]") def _Module(self, t): if t.doc is not None: self._dispatch(t.doc) self._dispatch(t.node) def _Mul(self, t): self.__binary_op(t, '*') def _Name(self, t): self._write(t.name) def _NoneType(self, t): self._write("None") def _Not(self, t): self._write('not (') self._dispatch(t.expr) self._write(')') def _Or(self, t): self._write(" (") for i, node in enumerate(t.nodes): self._dispatch(node) if i != len(t.nodes)-1: self._write(") or (") self._write(")") def _Pass(self, t): self._write("pass\n") def _Printnl(self, t): self._fill("print ") if t.dest: self._write(">> ") self._dispatch(t.dest) self._write(", ") comma = False for node in t.nodes: if comma: self._write(', ') else: comma = True self._dispatch(node) def _Power(self, t): self.__binary_op(t, '**') def _Return(self, t): self._fill("return ") if t.value: if isinstance(t.value, Tuple): text = ', '.join([ name.name for name in t.value.asList() ]) self._write(text) else: self._dispatch(t.value) if not self._do_indent: self._write('; ') def _Slice(self, t): self._dispatch(t.expr) self._write("[") if t.lower: self._dispatch(t.lower) self._write(":") if t.upper: self._dispatch(t.upper) #if t.step: # self._write(":") # self._dispatch(t.step) self._write("]") def _Sliceobj(self, t): for i, node in enumerate(t.nodes): if i != 0: self._write(":") if not (isinstance(node, Const) and node.value is None): self._dispatch(node) def _Stmt(self, tree): for node in tree.nodes: self._dispatch(node) def _Sub(self, t): self.__binary_op(t, '-') def _Subscript(self, t): self._dispatch(t.expr) self._write("[") for i, value in enumerate(t.subs): if i != 0: self._write(",") self._dispatch(value) self._write("]") def _TryExcept(self, t): self._fill("try") self._enter() self._dispatch(t.body) self._leave() for handler in t.handlers: self._fill('except ') self._dispatch(handler[0]) if handler[1] is not None: self._write(', ') self._dispatch(handler[1]) self._enter() self._dispatch(handler[2]) self._leave() if t.else_: self._fill("else") self._enter() self._dispatch(t.else_) self._leave() def _Tuple(self, t): if not t.nodes: # Empty tuple. self._write("()") else: self._write("(") # _write each elements, separated by a comma. for element in t.nodes[:-1]: self._dispatch(element) self._write(", ") # Handle the last one without writing comma last_element = t.nodes[-1] self._dispatch(last_element) self._write(")") def _UnaryAdd(self, t): self._write("+") self._dispatch(t.expr) def _UnarySub(self, t): self._write("-") self._dispatch(t.expr) def _With(self, t): self._fill('with ') self._dispatch(t.expr) if t.vars: self._write(' as ') self._dispatch(t.vars.name) self._enter() self._dispatch(t.body) self._leave() self._write('\n') def _int(self, t): self._write(repr(t)) def __binary_op(self, t, symbol): # Check if parenthesis are needed on left side and then dispatch has_paren = False left_class = str(t.left.__class__) if (left_class in op_precedence.keys() and op_precedence[left_class] < op_precedence[str(t.__class__)]): has_paren = True if has_paren: self._write('(') self._dispatch(t.left) if has_paren: self._write(')') # Write the appropriate symbol for operator self._write(symbol) # Check if parenthesis are needed on the right side and then dispatch has_paren = False right_class = str(t.right.__class__) if (right_class in op_precedence.keys() and op_precedence[right_class] < op_precedence[str(t.__class__)]): has_paren = True if has_paren: self._write('(') self._dispatch(t.right) if has_paren: self._write(')') def _float(self, t): # if t is 0.1, str(t)->'0.1' while repr(t)->'0.1000000000001' # We prefer str here. self._write(str(t)) def _str(self, t): self._write(repr(t)) def _tuple(self, t): self._write(str(t)) ######################################################################### # These are the methods from the _ast modules unparse. # # As our needs to handle more advanced code increase, we may want to # modify some of the methods below so that they work for compiler.ast. ######################################################################### # # stmt # def _Expr(self, tree): # self._fill() # self._dispatch(tree.value) # # def _Import(self, t): # self._fill("import ") # first = True # for a in t.names: # if first: # first = False # else: # self._write(", ") # self._write(a.name) # if a.asname: # self._write(" as "+a.asname) # ## def _ImportFrom(self, t): ## self._fill("from ") ## self._write(t.module) ## self._write(" import ") ## for i, a in enumerate(t.names): ## if i == 0: ## self._write(", ") ## self._write(a.name) ## if a.asname: ## self._write(" as "+a.asname) ## # XXX(jpe) what is level for? ## # # def _Break(self, t): # self._fill("break") # # def _Continue(self, t): # self._fill("continue") # # def _Delete(self, t): # self._fill("del ") # self._dispatch(t.targets) # # def _Assert(self, t): # self._fill("assert ") # self._dispatch(t.test) # if t.msg: # self._write(", ") # self._dispatch(t.msg) # # def _Exec(self, t): # self._fill("exec ") # self._dispatch(t.body) # if t.globals: # self._write(" in ") # self._dispatch(t.globals) # if t.locals: # self._write(", ") # self._dispatch(t.locals) # # def _Print(self, t): # self._fill("print ") # do_comma = False # if t.dest: # self._write(">>") # self._dispatch(t.dest) # do_comma = True # for e in t.values: # if do_comma:self._write(", ") # else:do_comma=True # self._dispatch(e) # if not t.nl: # self._write(",") # # def _Global(self, t): # self._fill("global") # for i, n in enumerate(t.names): # if i != 0: # self._write(",") # self._write(" " + n) # # def _Yield(self, t): # self._fill("yield") # if t.value: # self._write(" (") # self._dispatch(t.value) # self._write(")") # # def _Raise(self, t): # self._fill('raise ') # if t.type: # self._dispatch(t.type) # if t.inst: # self._write(", ") # self._dispatch(t.inst) # if t.tback: # self._write(", ") # self._dispatch(t.tback) # # # def _TryFinally(self, t): # self._fill("try") # self._enter() # self._dispatch(t.body) # self._leave() # # self._fill("finally") # self._enter() # self._dispatch(t.finalbody) # self._leave() # # def _excepthandler(self, t): # self._fill("except ") # if t.type: # self._dispatch(t.type) # if t.name: # self._write(", ") # self._dispatch(t.name) # self._enter() # self._dispatch(t.body) # self._leave() # # def _ClassDef(self, t): # self._write("\n") # self._fill("class "+t.name) # if t.bases: # self._write("(") # for a in t.bases: # self._dispatch(a) # self._write(", ") # self._write(")") # self._enter() # self._dispatch(t.body) # self._leave() # # def _FunctionDef(self, t): # self._write("\n") # for deco in t.decorators: # self._fill("@") # self._dispatch(deco) # self._fill("def "+t.name + "(") # self._dispatch(t.args) # self._write(")") # self._enter() # self._dispatch(t.body) # self._leave() # # def _For(self, t): # self._fill("for ") # self._dispatch(t.target) # self._write(" in ") # self._dispatch(t.iter) # self._enter() # self._dispatch(t.body) # self._leave() # if t.orelse: # self._fill("else") # self._enter() # self._dispatch(t.orelse) # self._leave # # def _While(self, t): # self._fill("while ") # self._dispatch(t.test) # self._enter() # self._dispatch(t.body) # self._leave() # if t.orelse: # self._fill("else") # self._enter() # self._dispatch(t.orelse) # self._leave # # # expr # def _Str(self, tree): # self._write(repr(tree.s)) ## # def _Repr(self, t): # self._write("`") # self._dispatch(t.value) # self._write("`") # # def _Num(self, t): # self._write(repr(t.n)) # # def _ListComp(self, t): # self._write("[") # self._dispatch(t.elt) # for gen in t.generators: # self._dispatch(gen) # self._write("]") # # def _GeneratorExp(self, t): # self._write("(") # self._dispatch(t.elt) # for gen in t.generators: # self._dispatch(gen) # self._write(")") # # def _comprehension(self, t): # self._write(" for ") # self._dispatch(t.target) # self._write(" in ") # self._dispatch(t.iter) # for if_clause in t.ifs: # self._write(" if ") # self._dispatch(if_clause) # # def _IfExp(self, t): # self._dispatch(t.body) # self._write(" if ") # self._dispatch(t.test) # if t.orelse: # self._write(" else ") # self._dispatch(t.orelse) # # unop = {"Invert":"~", "Not": "not", "UAdd":"+", "USub":"-"} # def _UnaryOp(self, t): # self._write(self.unop[t.op.__class__.__name__]) # self._write("(") # self._dispatch(t.operand) # self._write(")") # # binop = { "Add":"+", "Sub":"-", "Mult":"*", "Div":"/", "Mod":"%", # "LShift":">>", "RShift":"<<", "BitOr":"|", "BitXor":"^", "BitAnd":"&", # "FloorDiv":"//", "Pow": "**"} # def _BinOp(self, t): # self._write("(") # self._dispatch(t.left) # self._write(")" + self.binop[t.op.__class__.__name__] + "(") # self._dispatch(t.right) # self._write(")") # # boolops = {_ast.And: 'and', _ast.Or: 'or'} # def _BoolOp(self, t): # self._write("(") # self._dispatch(t.values[0]) # for v in t.values[1:]: # self._write(" %s " % self.boolops[t.op.__class__]) # self._dispatch(v) # self._write(")") # # def _Attribute(self,t): # self._dispatch(t.value) # self._write(".") # self._write(t.attr) # ## def _Call(self, t): ## self._dispatch(t.func) ## self._write("(") ## comma = False ## for e in t.args: ## if comma: self._write(", ") ## else: comma = True ## self._dispatch(e) ## for e in t.keywords: ## if comma: self._write(", ") ## else: comma = True ## self._dispatch(e) ## if t.starargs: ## if comma: self._write(", ") ## else: comma = True ## self._write("*") ## self._dispatch(t.starargs) ## if t.kwargs: ## if comma: self._write(", ") ## else: comma = True ## self._write("**") ## self._dispatch(t.kwargs) ## self._write(")") # # # slice # def _Index(self, t): # self._dispatch(t.value) # # def _ExtSlice(self, t): # for i, d in enumerate(t.dims): # if i != 0: # self._write(': ') # self._dispatch(d) # # # others # def _arguments(self, t): # first = True # nonDef = len(t.args)-len(t.defaults) # for a in t.args[0:nonDef]: # if first:first = False # else: self._write(", ") # self._dispatch(a) # for a,d in zip(t.args[nonDef:], t.defaults): # if first:first = False # else: self._write(", ") # self._dispatch(a), # self._write("=") # self._dispatch(d) # if t.vararg: # if first:first = False # else: self._write(", ") # self._write("*"+t.vararg) # if t.kwarg: # if first:first = False # else: self._write(", ") # self._write("**"+t.kwarg) # ## def _keyword(self, t): ## self._write(t.arg) ## self._write("=") ## self._dispatch(t.value) # # def _Lambda(self, t): # self._write("lambda ") # self._dispatch(t.args) # self._write(": ") # self._dispatch(t.body) reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/docscrape.py0000644000077000000240000003771313173066253026544 0ustar tomstaff00000000000000"""Extract reference documentation from the NumPy source tree. """ from __future__ import division, absolute_import, print_function import inspect import textwrap import re import pydoc from warnings import warn import collections import sys class Reader(object): """A line-based string reader. """ def __init__(self, data): """ Parameters ---------- data : str String with lines separated by '\n'. """ if isinstance(data,list): self._str = data else: self._str = data.split('\n') # store string as list of lines self.reset() def __getitem__(self, n): return self._str[n] def reset(self): self._l = 0 # current line nr def read(self): if not self.eof(): out = self[self._l] self._l += 1 return out else: return '' def seek_next_non_empty_line(self): for l in self[self._l:]: if l.strip(): break else: self._l += 1 def eof(self): return self._l >= len(self._str) def read_to_condition(self, condition_func): start = self._l for line in self[start:]: if condition_func(line): return self[start:self._l] self._l += 1 if self.eof(): return self[start:self._l+1] return [] def read_to_next_empty_line(self): self.seek_next_non_empty_line() def is_empty(line): return not line.strip() return self.read_to_condition(is_empty) def read_to_next_unindented_line(self): def is_unindented(line): return (line.strip() and (len(line.lstrip()) == len(line))) return self.read_to_condition(is_unindented) def peek(self,n=0): if self._l + n < len(self._str): return self[self._l + n] else: return '' def is_empty(self): return not ''.join(self._str).strip() class NumpyDocString(object): def __init__(self, docstring, config={}): docstring = textwrap.dedent(docstring).split('\n') self._doc = Reader(docstring) self._parsed_data = { 'Signature': '', 'Summary': [''], 'Extended Summary': [], 'Parameters': [], 'Returns': [], 'Raises': [], 'Warns': [], 'Other Parameters': [], 'Attributes': [], 'Methods': [], 'See Also': [], 'Notes': [], 'Warnings': [], 'References': '', 'Examples': '', 'index': {} } self._parse() def __getitem__(self,key): return self._parsed_data[key] def __setitem__(self,key,val): if key not in self._parsed_data: warn("Unknown section %s" % key) else: self._parsed_data[key] = val def _is_at_section(self): self._doc.seek_next_non_empty_line() if self._doc.eof(): return False l1 = self._doc.peek().strip() # e.g. Parameters if l1.startswith('.. index::'): return True l2 = self._doc.peek(1).strip() # ---------- or ========== return l2.startswith('-'*len(l1)) or l2.startswith('='*len(l1)) def _strip(self,doc): i = 0 j = 0 for i,line in enumerate(doc): if line.strip(): break for j,line in enumerate(doc[::-1]): if line.strip(): break return doc[i:len(doc)-j] def _read_to_next_section(self): section = self._doc.read_to_next_empty_line() while not self._is_at_section() and not self._doc.eof(): if not self._doc.peek(-1).strip(): # previous line was empty section += [''] section += self._doc.read_to_next_empty_line() return section def _read_sections(self): while not self._doc.eof(): data = self._read_to_next_section() name = data[0].strip() if name.startswith('..'): # index section yield name, data[1:] elif len(data) < 2: yield StopIteration else: yield name, self._strip(data[2:]) def _parse_param_list(self,content): r = Reader(content) params = [] while not r.eof(): header = r.read().strip() if ' : ' in header: arg_name, arg_type = header.split(' : ')[:2] else: arg_name, arg_type = header, '' desc = r.read_to_next_unindented_line() desc = dedent_lines(desc) params.append((arg_name,arg_type,desc)) return params _name_rgx = re.compile(r"^\s*(:(?P\w+):`(?P[a-zA-Z0-9_.-]+)`|" r" (?P[a-zA-Z0-9_.-]+))\s*", re.X) def _parse_see_also(self, content): """ func_name : Descriptive text continued text another_func_name : Descriptive text func_name1, func_name2, :meth:`func_name`, func_name3 """ items = [] def parse_item_name(text): """Match ':role:`name`' or 'name'""" m = self._name_rgx.match(text) if m: g = m.groups() if g[1] is None: return g[3], None else: return g[2], g[1] raise ValueError("%s is not a item name" % text) def push_item(name, rest): if not name: return name, role = parse_item_name(name) items.append((name, list(rest), role)) del rest[:] current_func = None rest = [] for line in content: if not line.strip(): continue m = self._name_rgx.match(line) if m and line[m.end():].strip().startswith(':'): push_item(current_func, rest) current_func, line = line[:m.end()], line[m.end():] rest = [line.split(':', 1)[1].strip()] if not rest[0]: rest = [] elif not line.startswith(' '): push_item(current_func, rest) current_func = None if ',' in line: for func in line.split(','): if func.strip(): push_item(func, []) elif line.strip(): current_func = line elif current_func is not None: rest.append(line.strip()) push_item(current_func, rest) return items def _parse_index(self, section, content): """ .. index: default :refguide: something, else, and more """ def strip_each_in(lst): return [s.strip() for s in lst] out = {} section = section.split('::') if len(section) > 1: out['default'] = strip_each_in(section[1].split(','))[0] for line in content: line = line.split(':') if len(line) > 2: out[line[1]] = strip_each_in(line[2].split(',')) return out def _parse_summary(self): """Grab signature (if given) and summary""" if self._is_at_section(): return # If several signatures present, take the last one while True: summary = self._doc.read_to_next_empty_line() summary_str = " ".join([s.strip() for s in summary]).strip() if re.compile('^([\w., ]+=)?\s*[\w\.]+\(.*\)$').match(summary_str): self['Signature'] = summary_str if not self._is_at_section(): continue break if summary is not None: self['Summary'] = summary if not self._is_at_section(): self['Extended Summary'] = self._read_to_next_section() def _parse(self): self._doc.reset() self._parse_summary() for (section,content) in self._read_sections(): if not section.startswith('..'): section = ' '.join([s.capitalize() for s in section.split(' ')]) if section in ('Parameters', 'Returns', 'Raises', 'Warns', 'Other Parameters', 'Attributes', 'Methods'): self[section] = self._parse_param_list(content) elif section.startswith('.. index::'): self['index'] = self._parse_index(section, content) elif section == 'See Also': self['See Also'] = self._parse_see_also(content) else: self[section] = content # string conversion routines def _str_header(self, name, symbol='-'): return [name, len(name)*symbol] def _str_indent(self, doc, indent=4): out = [] for line in doc: out += [' '*indent + line] return out def _str_signature(self): if self['Signature']: return [self['Signature'].replace('*','\*')] + [''] else: return [''] def _str_summary(self): if self['Summary']: return self['Summary'] + [''] else: return [] def _str_extended_summary(self): if self['Extended Summary']: return self['Extended Summary'] + [''] else: return [] def _str_param_list(self, name): out = [] if self[name]: out += self._str_header(name) for param,param_type,desc in self[name]: if param_type: out += ['%s : %s' % (param, param_type)] else: out += [param] out += self._str_indent(desc) out += [''] return out def _str_section(self, name): out = [] if self[name]: out += self._str_header(name) out += self[name] out += [''] return out def _str_see_also(self, func_role): if not self['See Also']: return [] out = [] out += self._str_header("See Also") last_had_desc = True for func, desc, role in self['See Also']: if role: link = ':%s:`%s`' % (role, func) elif func_role: link = ':%s:`%s`' % (func_role, func) else: link = "`%s`_" % func if desc or last_had_desc: out += [''] out += [link] else: out[-1] += ", %s" % link if desc: out += self._str_indent([' '.join(desc)]) last_had_desc = True else: last_had_desc = False out += [''] return out def _str_index(self): idx = self['index'] out = [] out += ['.. index:: %s' % idx.get('default','')] for section, references in idx.items(): if section == 'default': continue out += [' :%s: %s' % (section, ', '.join(references))] return out def __str__(self, func_role=''): out = [] out += self._str_signature() out += self._str_summary() out += self._str_extended_summary() for param_list in ('Parameters', 'Returns', 'Other Parameters', 'Raises', 'Warns'): out += self._str_param_list(param_list) out += self._str_section('Warnings') out += self._str_see_also(func_role) for s in ('Notes','References','Examples'): out += self._str_section(s) for param_list in ('Attributes', 'Methods'): out += self._str_param_list(param_list) out += self._str_index() return '\n'.join(out) def indent(str,indent=4): indent_str = ' '*indent if str is None: return indent_str lines = str.split('\n') return '\n'.join(indent_str + l for l in lines) def dedent_lines(lines): """Deindent a list of lines maximally""" return textwrap.dedent("\n".join(lines)).split("\n") def header(text, style='-'): return text + '\n' + style*len(text) + '\n' class FunctionDoc(NumpyDocString): def __init__(self, func, role='func', doc=None, config={}): self._f = func self._role = role # e.g. "func" or "meth" if doc is None: if func is None: raise ValueError("No function or docstring given") doc = inspect.getdoc(func) or '' NumpyDocString.__init__(self, doc) if not self['Signature'] and func is not None: func, func_name = self.get_func() try: # try to read signature if sys.version_info[0] >= 3: argspec = inspect.getfullargspec(func) else: argspec = inspect.getargspec(func) argspec = inspect.formatargspec(*argspec) argspec = argspec.replace('*','\*') signature = '%s%s' % (func_name, argspec) except TypeError as e: signature = '%s()' % func_name self['Signature'] = signature def get_func(self): func_name = getattr(self._f, '__name__', self.__class__.__name__) if inspect.isclass(self._f): func = getattr(self._f, '__call__', self._f.__init__) else: func = self._f return func, func_name def __str__(self): out = '' func, func_name = self.get_func() signature = self['Signature'].replace('*', '\*') roles = {'func': 'function', 'meth': 'method'} if self._role: if self._role not in roles: print("Warning: invalid role %s" % self._role) out += '.. %s:: %s\n \n\n' % (roles.get(self._role,''), func_name) out += super(FunctionDoc, self).__str__(func_role=self._role) return out class ClassDoc(NumpyDocString): extra_public_methods = ['__call__'] def __init__(self, cls, doc=None, modulename='', func_doc=FunctionDoc, config={}): if not inspect.isclass(cls) and cls is not None: raise ValueError("Expected a class or None, but got %r" % cls) self._cls = cls if modulename and not modulename.endswith('.'): modulename += '.' self._mod = modulename if doc is None: if cls is None: raise ValueError("No class or documentation string given") doc = pydoc.getdoc(cls) NumpyDocString.__init__(self, doc) if config.get('show_class_members', True): def splitlines_x(s): if not s: return [] else: return s.splitlines() for field, items in [('Methods', self.methods), ('Attributes', self.properties)]: if not self[field]: doc_list = [] for name in sorted(items): try: doc_item = pydoc.getdoc(getattr(self._cls, name)) doc_list.append((name, '', splitlines_x(doc_item))) except AttributeError: pass # method doesn't exist self[field] = doc_list @property def methods(self): if self._cls is None: return [] return [name for name,func in inspect.getmembers(self._cls) if ((not name.startswith('_') or name in self.extra_public_methods) and isinstance(func, collections.Callable))] @property def properties(self): if self._cls is None: return [] return [name for name,func in inspect.getmembers(self._cls) if not name.startswith('_') and (func is None or isinstance(func, property) or inspect.isgetsetdescriptor(func))] reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/docscrape_sphinx.py0000644000077000000240000002233513173066253030127 0ustar tomstaff00000000000000from __future__ import division, absolute_import, print_function import sys, re, inspect, textwrap, pydoc import sphinx import collections from .docscrape import NumpyDocString, FunctionDoc, ClassDoc if sys.version_info[0] >= 3: sixu = lambda s: s else: sixu = lambda s: unicode(s, 'unicode_escape') class SphinxDocString(NumpyDocString): def __init__(self, docstring, config={}): NumpyDocString.__init__(self, docstring, config=config) self.load_config(config) def load_config(self, config): self.use_plots = config.get('use_plots', False) self.class_members_toctree = config.get('class_members_toctree', True) # string conversion routines def _str_header(self, name, symbol='`'): return ['.. rubric:: ' + name, ''] def _str_field_list(self, name): return [':' + name + ':'] def _str_indent(self, doc, indent=4): out = [] for line in doc: out += [' '*indent + line] return out def _str_signature(self): return [''] if self['Signature']: return ['``%s``' % self['Signature']] + [''] else: return [''] def _str_summary(self): return self['Summary'] + [''] def _str_extended_summary(self): return self['Extended Summary'] + [''] def _str_returns(self): out = [] if self['Returns']: out += self._str_field_list('Returns') out += [''] for param, param_type, desc in self['Returns']: if param_type: out += self._str_indent(['**%s** : %s' % (param.strip(), param_type)]) else: out += self._str_indent([param.strip()]) if desc: out += [''] out += self._str_indent(desc, 8) out += [''] return out def _str_param_list(self, name): out = [] if self[name]: out += self._str_field_list(name) out += [''] for param, param_type, desc in self[name]: if param_type: out += self._str_indent(['**%s** : %s' % (param.strip(), param_type)]) else: out += self._str_indent(['**%s**' % param.strip()]) if desc: out += [''] out += self._str_indent(desc, 8) out += [''] return out @property def _obj(self): if hasattr(self, '_cls'): return self._cls elif hasattr(self, '_f'): return self._f return None def _str_member_list(self, name): """ Generate a member listing, autosummary:: table where possible, and a table where not. """ out = [] if self[name]: out += ['.. rubric:: %s' % name, ''] prefix = getattr(self, '_name', '') if prefix: prefix = '~%s.' % prefix autosum = [] others = [] for param, param_type, desc in self[name]: param = param.strip() # Check if the referenced member can have a docstring or not param_obj = getattr(self._obj, param, None) if not (callable(param_obj) or isinstance(param_obj, property) or inspect.isgetsetdescriptor(param_obj)): param_obj = None if param_obj and (pydoc.getdoc(param_obj) or not desc): # Referenced object has a docstring autosum += [" %s%s" % (prefix, param)] else: others.append((param, param_type, desc)) if autosum: out += ['.. autosummary::'] if self.class_members_toctree: out += [' :toctree:'] out += [''] + autosum if others: maxlen_0 = max(3, max([len(x[0]) for x in others])) hdr = sixu("=")*maxlen_0 + sixu(" ") + sixu("=")*10 fmt = sixu('%%%ds %%s ') % (maxlen_0,) out += ['', hdr] for param, param_type, desc in others: desc = sixu(" ").join(x.strip() for x in desc).strip() if param_type: desc = "(%s) %s" % (param_type, desc) out += [fmt % (param.strip(), desc)] out += [hdr] out += [''] return out def _str_section(self, name): out = [] if self[name]: out += self._str_header(name) out += [''] content = textwrap.dedent("\n".join(self[name])).split("\n") out += content out += [''] return out def _str_see_also(self, func_role): out = [] if self['See Also']: see_also = super(SphinxDocString, self)._str_see_also(func_role) out = ['.. seealso::', ''] out += self._str_indent(see_also[2:]) return out def _str_warnings(self): out = [] if self['Warnings']: out = ['.. warning::', ''] out += self._str_indent(self['Warnings']) return out def _str_index(self): idx = self['index'] out = [] if len(idx) == 0: return out out += ['.. index:: %s' % idx.get('default','')] for section, references in idx.items(): if section == 'default': continue elif section == 'refguide': out += [' single: %s' % (', '.join(references))] else: out += [' %s: %s' % (section, ','.join(references))] return out def _str_references(self): out = [] if self['References']: out += self._str_header('References') if isinstance(self['References'], str): self['References'] = [self['References']] out.extend(self['References']) out += [''] # Latex collects all references to a separate bibliography, # so we need to insert links to it if sphinx.__version__ >= "0.6": out += ['.. only:: latex',''] else: out += ['.. latexonly::',''] items = [] for line in self['References']: m = re.match(r'.. \[([a-z0-9._-]+)\]', line, re.I) if m: items.append(m.group(1)) out += [' ' + ", ".join(["[%s]_" % item for item in items]), ''] return out def _str_examples(self): examples_str = "\n".join(self['Examples']) if (self.use_plots and 'import matplotlib' in examples_str and 'plot::' not in examples_str): out = [] out += self._str_header('Examples') out += ['.. plot::', ''] out += self._str_indent(self['Examples']) out += [''] return out else: return self._str_section('Examples') def __str__(self, indent=0, func_role="obj"): out = [] out += self._str_signature() out += self._str_index() + [''] out += self._str_summary() out += self._str_extended_summary() out += self._str_param_list('Parameters') out += self._str_returns() for param_list in ('Other Parameters', 'Raises', 'Warns'): out += self._str_param_list(param_list) out += self._str_warnings() out += self._str_see_also(func_role) out += self._str_section('Notes') out += self._str_references() out += self._str_examples() for param_list in ('Attributes', 'Methods'): out += self._str_member_list(param_list) out = self._str_indent(out,indent) return '\n'.join(out) class SphinxFunctionDoc(SphinxDocString, FunctionDoc): def __init__(self, obj, doc=None, config={}): self.load_config(config) FunctionDoc.__init__(self, obj, doc=doc, config=config) class SphinxClassDoc(SphinxDocString, ClassDoc): def __init__(self, obj, doc=None, func_doc=None, config={}): self.load_config(config) ClassDoc.__init__(self, obj, doc=doc, func_doc=None, config=config) class SphinxObjDoc(SphinxDocString): def __init__(self, obj, doc=None, config={}): self._f = obj self.load_config(config) SphinxDocString.__init__(self, doc, config=config) def get_doc_object(obj, what=None, doc=None, config={}): if what is None: if inspect.isclass(obj): what = 'class' elif inspect.ismodule(obj): what = 'module' elif isinstance(obj, collections.Callable): what = 'function' else: what = 'object' if what == 'class': return SphinxClassDoc(obj, func_doc=SphinxFunctionDoc, doc=doc, config=config) elif what in ('function', 'method'): return SphinxFunctionDoc(obj, doc=doc, config=config) else: if doc is None: doc = pydoc.getdoc(obj) return SphinxObjDoc(obj, doc, config=config) reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/doctest.py0000644000077000000240000000243613173066253026240 0ustar tomstaff00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ This is a set of three directives that allow us to insert metadata about doctests into the .rst files so the testing framework knows which tests to skip. This is quite different from the doctest extension in Sphinx itself, which actually does something. For astropy, all of the testing is centrally managed from py.test and Sphinx is not used for running tests. """ import re from docutils.nodes import literal_block from sphinx.util.compat import Directive class DoctestSkipDirective(Directive): has_content = True def run(self): # Check if there is any valid argument, and skip it. Currently only # 'win32' is supported in astropy.tests.pytest_plugins. if re.match('win32', self.content[0]): self.content = self.content[2:] code = '\n'.join(self.content) return [literal_block(code, code)] class DoctestRequiresDirective(DoctestSkipDirective): # This is silly, but we really support an unbounded number of # optional arguments optional_arguments = 64 def setup(app): app.add_directive('doctest-requires', DoctestRequiresDirective) app.add_directive('doctest-skip', DoctestSkipDirective) app.add_directive('doctest-skip-all', DoctestSkipDirective) reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/edit_on_github.py0000644000077000000240000001341213173066253027552 0ustar tomstaff00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ This extension makes it easy to edit documentation on github. It adds links associated with each docstring that go to the corresponding view source page on Github. From there, the user can push the "Edit" button, edit the docstring, and submit a pull request. It has the following configuration options (to be set in the project's ``conf.py``): * ``edit_on_github_project`` The name of the github project, in the form "username/projectname". * ``edit_on_github_branch`` The name of the branch to edit. If this is a released version, this should be a git tag referring to that version. For a dev version, it often makes sense for it to be "master". It may also be a git hash. * ``edit_on_github_source_root`` The location within the source tree of the root of the Python package. Defaults to "lib". * ``edit_on_github_doc_root`` The location within the source tree of the root of the documentation source. Defaults to "doc", but it may make sense to set it to "doc/source" if the project uses a separate source directory. * ``edit_on_github_docstring_message`` The phrase displayed in the links to edit a docstring. Defaults to "[edit on github]". * ``edit_on_github_page_message`` The phrase displayed in the links to edit a RST page. Defaults to "[edit this page on github]". * ``edit_on_github_help_message`` The phrase displayed as a tooltip on the edit links. Defaults to "Push the Edit button on the next page" * ``edit_on_github_skip_regex`` When the path to the .rst file matches this regular expression, no "edit this page on github" link will be added. Defaults to ``"_.*"``. """ import inspect import os import re import sys from docutils import nodes from sphinx import addnodes def import_object(modname, name): """ Import the object given by *modname* and *name* and return it. If not found, or the import fails, returns None. """ try: __import__(modname) mod = sys.modules[modname] obj = mod for part in name.split('.'): obj = getattr(obj, part) return obj except: return None def get_url_base(app): return 'http://github.com/%s/tree/%s/' % ( app.config.edit_on_github_project, app.config.edit_on_github_branch) def doctree_read(app, doctree): # Get the configuration parameters if app.config.edit_on_github_project == 'REQUIRED': raise ValueError( "The edit_on_github_project configuration variable must be " "provided in the conf.py") source_root = app.config.edit_on_github_source_root url = get_url_base(app) docstring_message = app.config.edit_on_github_docstring_message # Handle the docstring-editing links for objnode in doctree.traverse(addnodes.desc): if objnode.get('domain') != 'py': continue names = set() for signode in objnode: if not isinstance(signode, addnodes.desc_signature): continue modname = signode.get('module') if not modname: continue fullname = signode.get('fullname') if fullname in names: # only one link per name, please continue names.add(fullname) obj = import_object(modname, fullname) anchor = None if obj is not None: try: lines, lineno = inspect.getsourcelines(obj) except: pass else: anchor = '#L%d' % lineno if anchor: real_modname = inspect.getmodule(obj).__name__ path = '%s%s%s.py%s' % ( url, source_root, real_modname.replace('.', '/'), anchor) onlynode = addnodes.only(expr='html') onlynode += nodes.reference( reftitle=app.config.edit_on_github_help_message, refuri=path) onlynode[0] += nodes.inline( '', '', nodes.raw('', ' ', format='html'), nodes.Text(docstring_message), classes=['edit-on-github', 'viewcode-link']) signode += onlynode def html_page_context(app, pagename, templatename, context, doctree): if (templatename == 'page.html' and not re.match(app.config.edit_on_github_skip_regex, pagename)): doc_root = app.config.edit_on_github_doc_root if doc_root != '' and not doc_root.endswith('/'): doc_root += '/' doc_path = os.path.relpath(doctree.get('source'), app.builder.srcdir) url = get_url_base(app) page_message = app.config.edit_on_github_page_message context['edit_on_github'] = url + doc_root + doc_path context['edit_on_github_page_message'] = ( app.config.edit_on_github_page_message) def setup(app): app.add_config_value('edit_on_github_project', 'REQUIRED', True) app.add_config_value('edit_on_github_branch', 'master', True) app.add_config_value('edit_on_github_source_root', 'lib', True) app.add_config_value('edit_on_github_doc_root', 'doc', True) app.add_config_value('edit_on_github_docstring_message', '[edit on github]', True) app.add_config_value('edit_on_github_page_message', 'Edit This Page on Github', True) app.add_config_value('edit_on_github_help_message', 'Push the Edit button on the next page', True) app.add_config_value('edit_on_github_skip_regex', '_.*', True) app.connect('doctree-read', doctree_read) app.connect('html-page-context', html_page_context) reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/numpydoc.py0000644000077000000240000001441413173066253026430 0ustar tomstaff00000000000000""" ======== numpydoc ======== Sphinx extension that handles docstrings in the Numpy standard format. [1] It will: - Convert Parameters etc. sections to field lists. - Convert See Also section to a See also entry. - Renumber references. - Extract the signature from the docstring, if it can't be determined otherwise. .. [1] https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt """ from __future__ import division, absolute_import, print_function import os, sys, re, pydoc import sphinx import inspect import collections if sphinx.__version__ < '1.0.1': raise RuntimeError("Sphinx 1.0.1 or newer is required") from .docscrape_sphinx import get_doc_object, SphinxDocString from sphinx.util.compat import Directive if sys.version_info[0] >= 3: sixu = lambda s: s else: sixu = lambda s: unicode(s, 'unicode_escape') def mangle_docstrings(app, what, name, obj, options, lines, reference_offset=[0]): cfg = dict(use_plots=app.config.numpydoc_use_plots, show_class_members=app.config.numpydoc_show_class_members, class_members_toctree=app.config.numpydoc_class_members_toctree, ) if what == 'module': # Strip top title title_re = re.compile(sixu('^\\s*[#*=]{4,}\\n[a-z0-9 -]+\\n[#*=]{4,}\\s*'), re.I|re.S) lines[:] = title_re.sub(sixu(''), sixu("\n").join(lines)).split(sixu("\n")) else: doc = get_doc_object(obj, what, sixu("\n").join(lines), config=cfg) if sys.version_info[0] >= 3: doc = str(doc) else: doc = unicode(doc) lines[:] = doc.split(sixu("\n")) if app.config.numpydoc_edit_link and hasattr(obj, '__name__') and \ obj.__name__: if hasattr(obj, '__module__'): v = dict(full_name=sixu("%s.%s") % (obj.__module__, obj.__name__)) else: v = dict(full_name=obj.__name__) lines += [sixu(''), sixu('.. htmlonly::'), sixu('')] lines += [sixu(' %s') % x for x in (app.config.numpydoc_edit_link % v).split("\n")] # replace reference numbers so that there are no duplicates references = [] for line in lines: line = line.strip() m = re.match(sixu('^.. \\[([a-z0-9_.-])\\]'), line, re.I) if m: references.append(m.group(1)) # start renaming from the longest string, to avoid overwriting parts references.sort(key=lambda x: -len(x)) if references: for i, line in enumerate(lines): for r in references: if re.match(sixu('^\\d+$'), r): new_r = sixu("R%d") % (reference_offset[0] + int(r)) else: new_r = sixu("%s%d") % (r, reference_offset[0]) lines[i] = lines[i].replace(sixu('[%s]_') % r, sixu('[%s]_') % new_r) lines[i] = lines[i].replace(sixu('.. [%s]') % r, sixu('.. [%s]') % new_r) reference_offset[0] += len(references) def mangle_signature(app, what, name, obj, options, sig, retann): # Do not try to inspect classes that don't define `__init__` if (inspect.isclass(obj) and (not hasattr(obj, '__init__') or 'initializes x; see ' in pydoc.getdoc(obj.__init__))): return '', '' if not (isinstance(obj, collections.Callable) or hasattr(obj, '__argspec_is_invalid_')): return if not hasattr(obj, '__doc__'): return doc = SphinxDocString(pydoc.getdoc(obj)) if doc['Signature']: sig = re.sub(sixu("^[^(]*"), sixu(""), doc['Signature']) return sig, sixu('') def setup(app, get_doc_object_=get_doc_object): if not hasattr(app, 'add_config_value'): return # probably called by nose, better bail out global get_doc_object get_doc_object = get_doc_object_ app.connect('autodoc-process-docstring', mangle_docstrings) app.connect('autodoc-process-signature', mangle_signature) app.add_config_value('numpydoc_edit_link', None, False) app.add_config_value('numpydoc_use_plots', None, False) app.add_config_value('numpydoc_show_class_members', True, True) app.add_config_value('numpydoc_class_members_toctree', True, True) # Extra mangling domains app.add_domain(NumpyPythonDomain) app.add_domain(NumpyCDomain) #------------------------------------------------------------------------------ # Docstring-mangling domains #------------------------------------------------------------------------------ from docutils.statemachine import ViewList from sphinx.domains.c import CDomain from sphinx.domains.python import PythonDomain class ManglingDomainBase(object): directive_mangling_map = {} def __init__(self, *a, **kw): super(ManglingDomainBase, self).__init__(*a, **kw) self.wrap_mangling_directives() def wrap_mangling_directives(self): for name, objtype in list(self.directive_mangling_map.items()): self.directives[name] = wrap_mangling_directive( self.directives[name], objtype) class NumpyPythonDomain(ManglingDomainBase, PythonDomain): name = 'np' directive_mangling_map = { 'function': 'function', 'class': 'class', 'exception': 'class', 'method': 'function', 'classmethod': 'function', 'staticmethod': 'function', 'attribute': 'attribute', } indices = [] class NumpyCDomain(ManglingDomainBase, CDomain): name = 'np-c' directive_mangling_map = { 'function': 'function', 'member': 'attribute', 'macro': 'function', 'type': 'class', 'var': 'object', } def wrap_mangling_directive(base_directive, objtype): class directive(base_directive): def run(self): env = self.state.document.settings.env name = None if self.arguments: m = re.match(r'^(.*\s+)?(.*?)(\(.*)?', self.arguments[0]) name = m.group(2).strip() if not name: name = self.arguments[0] lines = list(self.content) mangle_docstrings(env.app, objtype, name, None, None, lines) self.content = ViewList(lines, self.content.parent) return base_directive.run(self) return directive reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/phantom_import.py0000644000077000000240000001333613173066253027634 0ustar tomstaff00000000000000""" ============== phantom_import ============== Sphinx extension to make directives from ``sphinx.ext.autodoc`` and similar extensions to use docstrings loaded from an XML file. This extension loads an XML file in the Pydocweb format [1] and creates a dummy module that contains the specified docstrings. This can be used to get the current docstrings from a Pydocweb instance without needing to rebuild the documented module. .. [1] http://code.google.com/p/pydocweb """ from __future__ import division, absolute_import, print_function import imp, sys, compiler, types, os, inspect, re def setup(app): app.connect('builder-inited', initialize) app.add_config_value('phantom_import_file', None, True) def initialize(app): fn = app.config.phantom_import_file if (fn and os.path.isfile(fn)): print("[numpydoc] Phantom importing modules from", fn, "...") import_phantom_module(fn) #------------------------------------------------------------------------------ # Creating 'phantom' modules from an XML description #------------------------------------------------------------------------------ def import_phantom_module(xml_file): """ Insert a fake Python module to sys.modules, based on a XML file. The XML file is expected to conform to Pydocweb DTD. The fake module will contain dummy objects, which guarantee the following: - Docstrings are correct. - Class inheritance relationships are correct (if present in XML). - Function argspec is *NOT* correct (even if present in XML). Instead, the function signature is prepended to the function docstring. - Class attributes are *NOT* correct; instead, they are dummy objects. Parameters ---------- xml_file : str Name of an XML file to read """ import lxml.etree as etree object_cache = {} tree = etree.parse(xml_file) root = tree.getroot() # Sort items so that # - Base classes come before classes inherited from them # - Modules come before their contents all_nodes = dict([(n.attrib['id'], n) for n in root]) def _get_bases(node, recurse=False): bases = [x.attrib['ref'] for x in node.findall('base')] if recurse: j = 0 while True: try: b = bases[j] except IndexError: break if b in all_nodes: bases.extend(_get_bases(all_nodes[b])) j += 1 return bases type_index = ['module', 'class', 'callable', 'object'] def base_cmp(a, b): x = cmp(type_index.index(a.tag), type_index.index(b.tag)) if x != 0: return x if a.tag == 'class' and b.tag == 'class': a_bases = _get_bases(a, recurse=True) b_bases = _get_bases(b, recurse=True) x = cmp(len(a_bases), len(b_bases)) if x != 0: return x if a.attrib['id'] in b_bases: return -1 if b.attrib['id'] in a_bases: return 1 return cmp(a.attrib['id'].count('.'), b.attrib['id'].count('.')) nodes = root.getchildren() nodes.sort(base_cmp) # Create phantom items for node in nodes: name = node.attrib['id'] doc = (node.text or '').decode('string-escape') + "\n" if doc == "\n": doc = "" # create parent, if missing parent = name while True: parent = '.'.join(parent.split('.')[:-1]) if not parent: break if parent in object_cache: break obj = imp.new_module(parent) object_cache[parent] = obj sys.modules[parent] = obj # create object if node.tag == 'module': obj = imp.new_module(name) obj.__doc__ = doc sys.modules[name] = obj elif node.tag == 'class': bases = [object_cache[b] for b in _get_bases(node) if b in object_cache] bases.append(object) init = lambda self: None init.__doc__ = doc obj = type(name, tuple(bases), {'__doc__': doc, '__init__': init}) obj.__name__ = name.split('.')[-1] elif node.tag == 'callable': funcname = node.attrib['id'].split('.')[-1] argspec = node.attrib.get('argspec') if argspec: argspec = re.sub('^[^(]*', '', argspec) doc = "%s%s\n\n%s" % (funcname, argspec, doc) obj = lambda: 0 obj.__argspec_is_invalid_ = True if sys.version_info[0] >= 3: obj.__name__ = funcname else: obj.func_name = funcname obj.__name__ = name obj.__doc__ = doc if inspect.isclass(object_cache[parent]): obj.__objclass__ = object_cache[parent] else: class Dummy(object): pass obj = Dummy() obj.__name__ = name obj.__doc__ = doc if inspect.isclass(object_cache[parent]): obj.__get__ = lambda: None object_cache[name] = obj if parent: if inspect.ismodule(object_cache[parent]): obj.__module__ = parent setattr(object_cache[parent], name.split('.')[-1], obj) # Populate items for node in root: obj = object_cache.get(node.attrib['id']) if obj is None: continue for ref in node.findall('ref'): if node.tag == 'class': if ref.attrib['ref'].startswith(node.attrib['id'] + '.'): setattr(obj, ref.attrib['name'], object_cache.get(ref.attrib['ref'])) else: setattr(obj, ref.attrib['name'], object_cache.get(ref.attrib['ref'])) reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/smart_resolver.py0000644000077000000240000000720013173066253027634 0ustar tomstaff00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ The classes in the astropy docs are documented by their API location, which is not necessarily where they are defined in the source. This causes a problem when certain automated features of the doc build, such as the inheritance diagrams or the `Bases` list of a class reference a class by its canonical location rather than its "user" location. In the `autodoc-process-docstring` event, a mapping from the actual name to the API name is maintained. Later, in the `missing-reference` event, unresolved references are looked up in this dictionary and corrected if possible. """ from docutils.nodes import literal, reference def process_docstring(app, what, name, obj, options, lines): if isinstance(obj, type): env = app.env if not hasattr(env, 'class_name_mapping'): env.class_name_mapping = {} mapping = env.class_name_mapping mapping[obj.__module__ + '.' + obj.__name__] = name def missing_reference_handler(app, env, node, contnode): if not hasattr(env, 'class_name_mapping'): env.class_name_mapping = {} mapping = env.class_name_mapping reftype = node['reftype'] reftarget = node['reftarget'] if reftype in ('obj', 'class', 'exc', 'meth'): reftarget = node['reftarget'] suffix = '' if reftarget not in mapping: if '.' in reftarget: front, suffix = reftarget.rsplit('.', 1) else: suffix = reftarget if suffix.startswith('_') and not suffix.startswith('__'): # If this is a reference to a hidden class or method, # we can't link to it, but we don't want to have a # nitpick warning. return node[0].deepcopy() if reftype in ('obj', 'meth') and '.' in reftarget: if front in mapping: reftarget = front suffix = '.' + suffix if (reftype in ('class', ) and '.' in reftarget and reftarget not in mapping): if '.' in front: reftarget, _ = front.rsplit('.', 1) suffix = '.' + suffix reftarget = reftarget + suffix prefix = reftarget.rsplit('.')[0] inventory = env.intersphinx_named_inventory if (reftarget not in mapping and prefix in inventory): if reftarget in inventory[prefix]['py:class']: newtarget = inventory[prefix]['py:class'][reftarget][2] if not node['refexplicit'] and \ '~' not in node.rawsource: contnode = literal(text=reftarget) newnode = reference('', '', internal=True) newnode['reftitle'] = reftarget newnode['refuri'] = newtarget newnode.append(contnode) return newnode if reftarget in mapping: newtarget = mapping[reftarget] + suffix if not node['refexplicit'] and '~' not in node.rawsource: contnode = literal(text=newtarget) newnode = env.domains['py'].resolve_xref( env, node['refdoc'], app.builder, 'class', newtarget, node, contnode) if newnode is not None: newnode['reftitle'] = reftarget return newnode def setup(app): app.connect('autodoc-process-docstring', process_docstring) app.connect('missing-reference', missing_reference_handler) reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/templates/0000755000077000000240000000000013173066302026205 5ustar tomstaff00000000000000reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/templates/autosummary_core/0000755000077000000240000000000013173066302031603 5ustar tomstaff00000000000000reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/templates/autosummary_core/base.rst0000644000077000000240000000025213173066253033253 0ustar tomstaff00000000000000{% if referencefile %} .. include:: {{ referencefile }} {% endif %} {{ objname }} {{ underline }} .. currentmodule:: {{ module }} .. auto{{ objtype }}:: {{ objname }} reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/templates/autosummary_core/class.rst0000644000077000000240000000221113173066253033443 0ustar tomstaff00000000000000{% if referencefile %} .. include:: {{ referencefile }} {% endif %} {{ objname }} {{ underline }} .. currentmodule:: {{ module }} .. autoclass:: {{ objname }} :show-inheritance: {% if '__init__' in methods %} {% set caught_result = methods.remove('__init__') %} {% endif %} {% block attributes_summary %} {% if attributes %} .. rubric:: Attributes Summary .. autosummary:: {% for item in attributes %} ~{{ name }}.{{ item }} {%- endfor %} {% endif %} {% endblock %} {% block methods_summary %} {% if methods %} .. rubric:: Methods Summary .. autosummary:: {% for item in methods %} ~{{ name }}.{{ item }} {%- endfor %} {% endif %} {% endblock %} {% block attributes_documentation %} {% if attributes %} .. rubric:: Attributes Documentation {% for item in attributes %} .. autoattribute:: {{ item }} {%- endfor %} {% endif %} {% endblock %} {% block methods_documentation %} {% if methods %} .. rubric:: Methods Documentation {% for item in methods %} .. automethod:: {{ item }} {%- endfor %} {% endif %} {% endblock %} reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/templates/autosummary_core/module.rst0000644000077000000240000000127713173066253033636 0ustar tomstaff00000000000000{% if referencefile %} .. include:: {{ referencefile }} {% endif %} {{ objname }} {{ underline }} .. automodule:: {{ fullname }} {% block functions %} {% if functions %} .. rubric:: Functions .. autosummary:: {% for item in functions %} {{ item }} {%- endfor %} {% endif %} {% endblock %} {% block classes %} {% if classes %} .. rubric:: Classes .. autosummary:: {% for item in classes %} {{ item }} {%- endfor %} {% endif %} {% endblock %} {% block exceptions %} {% if exceptions %} .. rubric:: Exceptions .. autosummary:: {% for item in exceptions %} {{ item }} {%- endfor %} {% endif %} {% endblock %} reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/tests/0000755000077000000240000000000013173066302025351 5ustar tomstaff00000000000000reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/tests/__init__.py0000644000077000000240000000343113173066253027470 0ustar tomstaff00000000000000import os import subprocess as sp import sys from textwrap import dedent import pytest @pytest.fixture def cython_testpackage(tmpdir, request): """ Creates a trivial Cython package for use with tests. """ test_pkg = tmpdir.mkdir('test_pkg') test_pkg.mkdir('apyhtest_eva').ensure('__init__.py') test_pkg.join('apyhtest_eva').join('unit02.pyx').write(dedent("""\ def pilot(): \"\"\"Returns the pilot of Eva Unit-02.\"\"\" return True """)) import astropy_helpers test_pkg.join('setup.py').write(dedent("""\ import sys sys.path.insert(0, {0!r}) from os.path import join from setuptools import setup, Extension from astropy_helpers.setup_helpers import register_commands NAME = 'apyhtest_eva' VERSION = 0.1 RELEASE = True cmdclassd = register_commands(NAME, VERSION, RELEASE) setup( name=NAME, version=VERSION, cmdclass=cmdclassd, ext_modules=[Extension('apyhtest_eva.unit02', [join('apyhtest_eva', 'unit02.pyx')])] ) """.format(os.path.dirname(astropy_helpers.__path__[0])))) test_pkg.chdir() # Build the Cython module in a subprocess; otherwise strange things can # happen with Cython's global module state sp.call([sys.executable, 'setup.py', 'build_ext', '--inplace']) sys.path.insert(0, str(test_pkg)) import apyhtest_eva.unit02 def cleanup(test_pkg=test_pkg): for modname in ['apyhtest_eva', 'apyhtest_eva.unit02']: try: del sys.modules[modname] except KeyError: pass sys.path.remove(str(test_pkg)) request.addfinalizer(cleanup) return test_pkg reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/tests/test_autodoc_enhancements.py0000644000077000000240000000324313173066253033157 0ustar tomstaff00000000000000import sys from textwrap import dedent import pytest from ..autodoc_enhancements import type_object_attrgetter # Define test classes outside the class; otherwise there is flakiness with the # details of how exec works on different Python versions class Meta(type): @property def foo(cls): return 'foo' if sys.version_info[0] < 3: exec(dedent(""" class MyClass(object): __metaclass__ = Meta @property def foo(self): \"\"\"Docstring for MyClass.foo property.\"\"\" return 'myfoo' """)) else: exec(dedent(""" class MyClass(metaclass=Meta): @property def foo(self): \"\"\"Docstring for MyClass.foo property.\"\"\" return 'myfoo' """)) def test_type_attrgetter(): """ This test essentially reproduces the docstring for `type_object_attrgetter`. Sphinx itself tests the custom attrgetter feature; see: https://bitbucket.org/birkenfeld/sphinx/src/40bd03003ac6fe274ccf3c80d7727509e00a69ea/tests/test_autodoc.py?at=default#cl-502 so rather than a full end-to-end functional test it's simple enough to just test that this function does what it needs to do. """ assert getattr(MyClass, 'foo') == 'foo' obj = type_object_attrgetter(MyClass, 'foo') assert isinstance(obj, property) assert obj.__doc__ == 'Docstring for MyClass.foo property.' with pytest.raises(AttributeError): type_object_attrgetter(MyClass, 'susy') assert type_object_attrgetter(MyClass, 'susy', 'default') == 'default' assert type_object_attrgetter(MyClass, '__dict__') == MyClass.__dict__ reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/tests/test_automodapi.py0000644000077000000240000001620113173066253031131 0ustar tomstaff00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst import os import sys import pytest from . import * from ....utils import iteritems pytest.importorskip('sphinx') # skips these tests if sphinx not present class FakeConfig(object): """ Mocks up a sphinx configuration setting construct for automodapi tests """ def __init__(self, **kwargs): for k, v in iteritems(kwargs): setattr(self, k, v) class FakeApp(object): """ Mocks up a `sphinx.application.Application` object for automodapi tests """ # Some default config values _defaults = { 'automodapi_toctreedirnm': 'api', 'automodapi_writereprocessed': False } def __init__(self, **configs): config = self._defaults.copy() config.update(configs) self.config = FakeConfig(**config) self.info = [] self.warnings = [] def info(self, msg, loc): self.info.append((msg, loc)) def warn(self, msg, loc): self.warnings.append((msg, loc)) am_replacer_str = """ This comes before .. automodapi:: astropy_helpers.sphinx.ext.tests.test_automodapi {options} This comes after """ am_replacer_basic_expected = """ This comes before astropy_helpers.sphinx.ext.tests.test_automodapi Module ------------------------------------------------------- .. automodule:: astropy_helpers.sphinx.ext.tests.test_automodapi Functions ^^^^^^^^^ .. automodsumm:: astropy_helpers.sphinx.ext.tests.test_automodapi :functions-only: :toctree: api/ Classes ^^^^^^^ .. automodsumm:: astropy_helpers.sphinx.ext.tests.test_automodapi :classes-only: :toctree: api/ Class Inheritance Diagram ^^^^^^^^^^^^^^^^^^^^^^^^^ .. automod-diagram:: astropy_helpers.sphinx.ext.tests.test_automodapi :private-bases: :parts: 1 {empty} This comes after """.format(empty='') # the .format is necessary for editors that remove empty-line whitespace def test_am_replacer_basic(): """ Tests replacing an ".. automodapi::" with the automodapi no-option template """ from ..automodapi import automodapi_replace fakeapp = FakeApp() result = automodapi_replace(am_replacer_str.format(options=''), fakeapp) assert result == am_replacer_basic_expected am_replacer_noinh_expected = """ This comes before astropy_helpers.sphinx.ext.tests.test_automodapi Module ------------------------------------------------------- .. automodule:: astropy_helpers.sphinx.ext.tests.test_automodapi Functions ^^^^^^^^^ .. automodsumm:: astropy_helpers.sphinx.ext.tests.test_automodapi :functions-only: :toctree: api/ Classes ^^^^^^^ .. automodsumm:: astropy_helpers.sphinx.ext.tests.test_automodapi :classes-only: :toctree: api/ This comes after """.format(empty='') def test_am_replacer_noinh(): """ Tests replacing an ".. automodapi::" with no-inheritance-diagram option """ from ..automodapi import automodapi_replace fakeapp = FakeApp() ops = ['', ':no-inheritance-diagram:'] ostr = '\n '.join(ops) result = automodapi_replace(am_replacer_str.format(options=ostr), fakeapp) assert result == am_replacer_noinh_expected am_replacer_titleandhdrs_expected = """ This comes before astropy_helpers.sphinx.ext.tests.test_automodapi Module &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .. automodule:: astropy_helpers.sphinx.ext.tests.test_automodapi Functions ********* .. automodsumm:: astropy_helpers.sphinx.ext.tests.test_automodapi :functions-only: :toctree: api/ Classes ******* .. automodsumm:: astropy_helpers.sphinx.ext.tests.test_automodapi :classes-only: :toctree: api/ Class Inheritance Diagram ************************* .. automod-diagram:: astropy_helpers.sphinx.ext.tests.test_automodapi :private-bases: :parts: 1 {empty} This comes after """.format(empty='') def test_am_replacer_titleandhdrs(): """ Tests replacing an ".. automodapi::" entry with title-setting and header character options. """ from ..automodapi import automodapi_replace fakeapp = FakeApp() ops = ['', ':title: A new title', ':headings: &*'] ostr = '\n '.join(ops) result = automodapi_replace(am_replacer_str.format(options=ostr), fakeapp) assert result == am_replacer_titleandhdrs_expected am_replacer_nomain_str = """ This comes before .. automodapi:: astropy_helpers.sphinx.ext.automodapi :no-main-docstr: This comes after """ am_replacer_nomain_expected = """ This comes before astropy_helpers.sphinx.ext.automodapi Module -------------------------------------------- Functions ^^^^^^^^^ .. automodsumm:: astropy_helpers.sphinx.ext.automodapi :functions-only: :toctree: api/ This comes after """.format(empty='') def test_am_replacer_nomain(): """ Tests replacing an ".. automodapi::" with "no-main-docstring" . """ from ..automodapi import automodapi_replace fakeapp = FakeApp() result = automodapi_replace(am_replacer_nomain_str, fakeapp) assert result == am_replacer_nomain_expected am_replacer_skip_str = """ This comes before .. automodapi:: astropy_helpers.sphinx.ext.automodapi :skip: something1 :skip: something2 This comes after """ am_replacer_skip_expected = """ This comes before astropy_helpers.sphinx.ext.automodapi Module -------------------------------------------- .. automodule:: astropy_helpers.sphinx.ext.automodapi Functions ^^^^^^^^^ .. automodsumm:: astropy_helpers.sphinx.ext.automodapi :functions-only: :toctree: api/ :skip: something1,something2 This comes after """.format(empty='') def test_am_replacer_skip(): """ Tests using the ":skip: option in an ".. automodapi::" . """ from ..automodapi import automodapi_replace fakeapp = FakeApp() result = automodapi_replace(am_replacer_skip_str, fakeapp) assert result == am_replacer_skip_expected am_replacer_invalidop_str = """ This comes before .. automodapi:: astropy_helpers.sphinx.ext.automodapi :invalid-option: This comes after """ def test_am_replacer_invalidop(): """ Tests that a sphinx warning is produced with an invalid option. """ from ..automodapi import automodapi_replace fakeapp = FakeApp() automodapi_replace(am_replacer_invalidop_str, fakeapp) expected_warnings = [('Found additional options invalid-option in ' 'automodapi.', None)] assert fakeapp.warnings == expected_warnings am_replacer_cython_str = """ This comes before .. automodapi:: apyhtest_eva.unit02 {options} This comes after """ am_replacer_cython_expected = """ This comes before apyhtest_eva.unit02 Module -------------------------- .. automodule:: apyhtest_eva.unit02 Functions ^^^^^^^^^ .. automodsumm:: apyhtest_eva.unit02 :functions-only: :toctree: api/ This comes after """.format(empty='') def test_am_replacer_cython(cython_testpackage): """ Tests replacing an ".. automodapi::" for a Cython module. """ from ..automodapi import automodapi_replace fakeapp = FakeApp() result = automodapi_replace(am_replacer_cython_str.format(options=''), fakeapp) assert result == am_replacer_cython_expected reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/tests/test_automodsumm.py0000644000077000000240000000460213173066253031343 0ustar tomstaff00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst import sys import pytest from . import * from ....utils import iteritems pytest.importorskip('sphinx') # skips these tests if sphinx not present class FakeEnv(object): """ Mocks up a sphinx env setting construct for automodapi tests """ def __init__(self, **kwargs): for k, v in iteritems(kwargs): setattr(self, k, v) class FakeBuilder(object): """ Mocks up a sphinx builder setting construct for automodapi tests """ def __init__(self, **kwargs): self.env = FakeEnv(**kwargs) class FakeApp(object): """ Mocks up a `sphinx.application.Application` object for automodapi tests """ def __init__(self, srcdir, automodapipresent=True): self.builder = FakeBuilder(srcdir=srcdir) self.info = [] self.warnings = [] self._extensions = [] if automodapipresent: self._extensions.append('astropy_helpers.sphinx.ext.automodapi') def info(self, msg, loc): self.info.append((msg, loc)) def warn(self, msg, loc): self.warnings.append((msg, loc)) ams_to_asmry_str = """ Before .. automodsumm:: astropy_helpers.sphinx.ext.automodsumm :p: And After """ ams_to_asmry_expected = """\ .. currentmodule:: astropy_helpers.sphinx.ext.automodsumm .. autosummary:: :p: Automoddiagram Automodsumm automodsumm_to_autosummary_lines generate_automodsumm_docs process_automodsumm_generation setup """ def test_ams_to_asmry(tmpdir): from ..automodsumm import automodsumm_to_autosummary_lines fi = tmpdir.join('automodsumm.rst') fi.write(ams_to_asmry_str) fakeapp = FakeApp(srcdir='') resultlines = automodsumm_to_autosummary_lines(str(fi), fakeapp) assert '\n'.join(resultlines) == ams_to_asmry_expected ams_cython_str = """ Before .. automodsumm:: apyhtest_eva.unit02 :functions-only: :p: And After """ ams_cython_expected = """\ .. currentmodule:: apyhtest_eva.unit02 .. autosummary:: :p: pilot """ def test_ams_cython(tmpdir, cython_testpackage): from ..automodsumm import automodsumm_to_autosummary_lines fi = tmpdir.join('automodsumm.rst') fi.write(ams_cython_str) fakeapp = FakeApp(srcdir='') resultlines = automodsumm_to_autosummary_lines(str(fi), fakeapp) assert '\n'.join(resultlines) == ams_cython_expected reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/tests/test_docscrape.py0000644000077000000240000004335113173066253030740 0ustar tomstaff00000000000000# -*- encoding:utf-8 -*- from __future__ import division, absolute_import, print_function import sys import textwrap from ..docscrape import NumpyDocString, FunctionDoc, ClassDoc from ..docscrape_sphinx import SphinxDocString, SphinxClassDoc if sys.version_info[0] >= 3: sixu = lambda s: s else: sixu = lambda s: unicode(s, 'unicode_escape') doc_txt = '''\ numpy.multivariate_normal(mean, cov, shape=None, spam=None) Draw values from a multivariate normal distribution with specified mean and covariance. The multivariate normal or Gaussian distribution is a generalisation of the one-dimensional normal distribution to higher dimensions. Parameters ---------- mean : (N,) ndarray Mean of the N-dimensional distribution. .. math:: (1+2+3)/3 cov : (N, N) ndarray Covariance matrix of the distribution. shape : tuple of ints Given a shape of, for example, (m,n,k), m*n*k samples are generated, and packed in an m-by-n-by-k arrangement. Because each sample is N-dimensional, the output shape is (m,n,k,N). Returns ------- out : ndarray The drawn samples, arranged according to `shape`. If the shape given is (m,n,...), then the shape of `out` is is (m,n,...,N). In other words, each entry ``out[i,j,...,:]`` is an N-dimensional value drawn from the distribution. list of str This is not a real return value. It exists to test anonymous return values. Other Parameters ---------------- spam : parrot A parrot off its mortal coil. Raises ------ RuntimeError Some error Warns ----- RuntimeWarning Some warning Warnings -------- Certain warnings apply. Notes ----- Instead of specifying the full covariance matrix, popular approximations include: - Spherical covariance (`cov` is a multiple of the identity matrix) - Diagonal covariance (`cov` has non-negative elements only on the diagonal) This geometrical property can be seen in two dimensions by plotting generated data-points: >>> mean = [0,0] >>> cov = [[1,0],[0,100]] # diagonal covariance, points lie on x or y-axis >>> x,y = multivariate_normal(mean,cov,5000).T >>> plt.plot(x,y,'x'); plt.axis('equal'); plt.show() Note that the covariance matrix must be symmetric and non-negative definite. References ---------- .. [1] A. Papoulis, "Probability, Random Variables, and Stochastic Processes," 3rd ed., McGraw-Hill Companies, 1991 .. [2] R.O. Duda, P.E. Hart, and D.G. Stork, "Pattern Classification," 2nd ed., Wiley, 2001. See Also -------- some, other, funcs otherfunc : relationship Examples -------- >>> mean = (1,2) >>> cov = [[1,0],[1,0]] >>> x = multivariate_normal(mean,cov,(3,3)) >>> print x.shape (3, 3, 2) The following is probably true, given that 0.6 is roughly twice the standard deviation: >>> print list( (x[0,0,:] - mean) < 0.6 ) [True, True] .. index:: random :refguide: random;distributions, random;gauss ''' doc = NumpyDocString(doc_txt) def test_signature(): assert doc['Signature'].startswith('numpy.multivariate_normal(') assert doc['Signature'].endswith('spam=None)') def test_summary(): assert doc['Summary'][0].startswith('Draw values') assert doc['Summary'][-1].endswith('covariance.') def test_extended_summary(): assert doc['Extended Summary'][0].startswith('The multivariate normal') def test_parameters(): assert len(doc['Parameters']) == 3 assert [n for n, _, _ in doc['Parameters']] == ['mean', 'cov', 'shape'] arg, arg_type, desc = doc['Parameters'][1] assert arg_type == '(N, N) ndarray' assert desc[0].startswith('Covariance matrix') assert doc['Parameters'][0][-1][-2] == ' (1+2+3)/3' def test_other_parameters(): assert len(doc['Other Parameters']) == 1 assert [n for n, _, _ in doc['Other Parameters']] == ['spam'] arg, arg_type, desc = doc['Other Parameters'][0] assert arg_type == 'parrot' assert desc[0].startswith('A parrot off its mortal coil') def test_returns(): assert len(doc['Returns']) == 2 arg, arg_type, desc = doc['Returns'][0] assert arg == 'out' assert arg_type == 'ndarray' assert desc[0].startswith('The drawn samples') assert desc[-1].endswith('distribution.') arg, arg_type, desc = doc['Returns'][1] assert arg == 'list of str' assert arg_type == '' assert desc[0].startswith('This is not a real') assert desc[-1].endswith('anonymous return values.') def test_notes(): assert doc['Notes'][0].startswith('Instead') assert doc['Notes'][-1].endswith('definite.') assert len(doc['Notes']) == 17 def test_references(): assert doc['References'][0].startswith('..') assert doc['References'][-1].endswith('2001.') def test_examples(): assert doc['Examples'][0].startswith('>>>') assert doc['Examples'][-1].endswith('True]') def test_index(): assert doc['index']['default'] == 'random' assert len(doc['index']) == 2 assert len(doc['index']['refguide']) == 2 def non_blank_line_by_line_compare(a, b): a = textwrap.dedent(a) b = textwrap.dedent(b) a = [l.rstrip() for l in a.split('\n') if l.strip()] b = [l.rstrip() for l in b.split('\n') if l.strip()] for n, line in enumerate(a): if not line == b[n]: raise AssertionError("Lines %s of a and b differ: " "\n>>> %s\n<<< %s\n" % (n, line, b[n])) def test_str(): non_blank_line_by_line_compare(str(doc), """numpy.multivariate_normal(mean, cov, shape=None, spam=None) Draw values from a multivariate normal distribution with specified mean and covariance. The multivariate normal or Gaussian distribution is a generalisation of the one-dimensional normal distribution to higher dimensions. Parameters ---------- mean : (N,) ndarray Mean of the N-dimensional distribution. .. math:: (1+2+3)/3 cov : (N, N) ndarray Covariance matrix of the distribution. shape : tuple of ints Given a shape of, for example, (m,n,k), m*n*k samples are generated, and packed in an m-by-n-by-k arrangement. Because each sample is N-dimensional, the output shape is (m,n,k,N). Returns ------- out : ndarray The drawn samples, arranged according to `shape`. If the shape given is (m,n,...), then the shape of `out` is is (m,n,...,N). In other words, each entry ``out[i,j,...,:]`` is an N-dimensional value drawn from the distribution. list of str This is not a real return value. It exists to test anonymous return values. Other Parameters ---------------- spam : parrot A parrot off its mortal coil. Raises ------ RuntimeError Some error Warns ----- RuntimeWarning Some warning Warnings -------- Certain warnings apply. See Also -------- `some`_, `other`_, `funcs`_ `otherfunc`_ relationship Notes ----- Instead of specifying the full covariance matrix, popular approximations include: - Spherical covariance (`cov` is a multiple of the identity matrix) - Diagonal covariance (`cov` has non-negative elements only on the diagonal) This geometrical property can be seen in two dimensions by plotting generated data-points: >>> mean = [0,0] >>> cov = [[1,0],[0,100]] # diagonal covariance, points lie on x or y-axis >>> x,y = multivariate_normal(mean,cov,5000).T >>> plt.plot(x,y,'x'); plt.axis('equal'); plt.show() Note that the covariance matrix must be symmetric and non-negative definite. References ---------- .. [1] A. Papoulis, "Probability, Random Variables, and Stochastic Processes," 3rd ed., McGraw-Hill Companies, 1991 .. [2] R.O. Duda, P.E. Hart, and D.G. Stork, "Pattern Classification," 2nd ed., Wiley, 2001. Examples -------- >>> mean = (1,2) >>> cov = [[1,0],[1,0]] >>> x = multivariate_normal(mean,cov,(3,3)) >>> print x.shape (3, 3, 2) The following is probably true, given that 0.6 is roughly twice the standard deviation: >>> print list( (x[0,0,:] - mean) < 0.6 ) [True, True] .. index:: random :refguide: random;distributions, random;gauss""") def test_sphinx_str(): sphinx_doc = SphinxDocString(doc_txt) non_blank_line_by_line_compare(str(sphinx_doc), """ .. index:: random single: random;distributions, random;gauss Draw values from a multivariate normal distribution with specified mean and covariance. The multivariate normal or Gaussian distribution is a generalisation of the one-dimensional normal distribution to higher dimensions. :Parameters: **mean** : (N,) ndarray Mean of the N-dimensional distribution. .. math:: (1+2+3)/3 **cov** : (N, N) ndarray Covariance matrix of the distribution. **shape** : tuple of ints Given a shape of, for example, (m,n,k), m*n*k samples are generated, and packed in an m-by-n-by-k arrangement. Because each sample is N-dimensional, the output shape is (m,n,k,N). :Returns: **out** : ndarray The drawn samples, arranged according to `shape`. If the shape given is (m,n,...), then the shape of `out` is is (m,n,...,N). In other words, each entry ``out[i,j,...,:]`` is an N-dimensional value drawn from the distribution. list of str This is not a real return value. It exists to test anonymous return values. :Other Parameters: **spam** : parrot A parrot off its mortal coil. :Raises: **RuntimeError** Some error :Warns: **RuntimeWarning** Some warning .. warning:: Certain warnings apply. .. seealso:: :obj:`some`, :obj:`other`, :obj:`funcs` :obj:`otherfunc` relationship .. rubric:: Notes Instead of specifying the full covariance matrix, popular approximations include: - Spherical covariance (`cov` is a multiple of the identity matrix) - Diagonal covariance (`cov` has non-negative elements only on the diagonal) This geometrical property can be seen in two dimensions by plotting generated data-points: >>> mean = [0,0] >>> cov = [[1,0],[0,100]] # diagonal covariance, points lie on x or y-axis >>> x,y = multivariate_normal(mean,cov,5000).T >>> plt.plot(x,y,'x'); plt.axis('equal'); plt.show() Note that the covariance matrix must be symmetric and non-negative definite. .. rubric:: References .. [1] A. Papoulis, "Probability, Random Variables, and Stochastic Processes," 3rd ed., McGraw-Hill Companies, 1991 .. [2] R.O. Duda, P.E. Hart, and D.G. Stork, "Pattern Classification," 2nd ed., Wiley, 2001. .. only:: latex [1]_, [2]_ .. rubric:: Examples >>> mean = (1,2) >>> cov = [[1,0],[1,0]] >>> x = multivariate_normal(mean,cov,(3,3)) >>> print x.shape (3, 3, 2) The following is probably true, given that 0.6 is roughly twice the standard deviation: >>> print list( (x[0,0,:] - mean) < 0.6 ) [True, True] """) doc2 = NumpyDocString(""" Returns array of indices of the maximum values of along the given axis. Parameters ---------- a : {array_like} Array to look in. axis : {None, integer} If None, the index is into the flattened array, otherwise along the specified axis""") def test_parameters_without_extended_description(): assert len(doc2['Parameters']) == 2 doc3 = NumpyDocString(""" my_signature(*params, **kwds) Return this and that. """) def test_escape_stars(): signature = str(doc3).split('\n')[0] signature == 'my_signature(\*params, \*\*kwds)' doc4 = NumpyDocString( """a.conj() Return an array with all complex-valued elements conjugated.""") def test_empty_extended_summary(): assert doc4['Extended Summary'] == [] doc5 = NumpyDocString( """ a.something() Raises ------ LinAlgException If array is singular. Warns ----- SomeWarning If needed """) def test_raises(): assert len(doc5['Raises']) == 1 name, _, desc = doc5['Raises'][0] assert name == 'LinAlgException' assert desc == ['If array is singular.'] def test_warns(): assert len(doc5['Warns']) == 1 name, _, desc = doc5['Warns'][0] assert name == 'SomeWarning' assert desc == ['If needed'] def test_see_also(): doc6 = NumpyDocString( """ z(x,theta) See Also -------- func_a, func_b, func_c func_d : some equivalent func foo.func_e : some other func over multiple lines func_f, func_g, :meth:`func_h`, func_j, func_k :obj:`baz.obj_q` :class:`class_j`: fubar foobar """) assert len(doc6['See Also']) == 12 for func, desc, role in doc6['See Also']: if func in ('func_a', 'func_b', 'func_c', 'func_f', 'func_g', 'func_h', 'func_j', 'func_k', 'baz.obj_q'): assert(not desc) else: assert(desc) if func == 'func_h': assert role == 'meth' elif func == 'baz.obj_q': assert role == 'obj' elif func == 'class_j': assert role == 'class' else: assert role is None if func == 'func_d': assert desc == ['some equivalent func'] elif func == 'foo.func_e': assert desc == ['some other func over', 'multiple lines'] elif func == 'class_j': assert desc == ['fubar', 'foobar'] def test_see_also_print(): class Dummy(object): """ See Also -------- func_a, func_b func_c : some relationship goes here func_d """ pass obj = Dummy() s = str(FunctionDoc(obj, role='func')) assert(':func:`func_a`, :func:`func_b`' in s) assert(' some relationship' in s) assert(':func:`func_d`' in s) doc7 = NumpyDocString(""" Doc starts on second line. """) def test_empty_first_line(): assert doc7['Summary'][0].startswith('Doc starts') def test_no_summary(): str(SphinxDocString(""" Parameters ----------""")) def test_unicode(): doc = SphinxDocString(""" öäöäöäöäöåååå öäöäöäööäååå Parameters ---------- ååå : äää ööö Returns ------- ååå : ööö äää """) assert isinstance(doc['Summary'][0], str) assert doc['Summary'][0] == 'öäöäöäöäöåååå' def test_plot_examples(): cfg = dict(use_plots=True) doc = SphinxDocString(""" Examples -------- >>> import matplotlib.pyplot as plt >>> plt.plot([1,2,3],[4,5,6]) >>> plt.show() """, config=cfg) assert 'plot::' in str(doc), str(doc) doc = SphinxDocString(""" Examples -------- .. plot:: import matplotlib.pyplot as plt plt.plot([1,2,3],[4,5,6]) plt.show() """, config=cfg) assert str(doc).count('plot::') == 1, str(doc) def test_class_members(): class Dummy(object): """ Dummy class. """ def spam(self, a, b): """Spam\n\nSpam spam.""" pass def ham(self, c, d): """Cheese\n\nNo cheese.""" pass @property def spammity(self): """Spammity index""" return 0.95 class Ignorable(object): """local class, to be ignored""" pass for cls in (ClassDoc, SphinxClassDoc): doc = cls(Dummy, config=dict(show_class_members=False)) assert 'Methods' not in str(doc), (cls, str(doc)) assert 'spam' not in str(doc), (cls, str(doc)) assert 'ham' not in str(doc), (cls, str(doc)) assert 'spammity' not in str(doc), (cls, str(doc)) assert 'Spammity index' not in str(doc), (cls, str(doc)) doc = cls(Dummy, config=dict(show_class_members=True)) assert 'Methods' in str(doc), (cls, str(doc)) assert 'spam' in str(doc), (cls, str(doc)) assert 'ham' in str(doc), (cls, str(doc)) assert 'spammity' in str(doc), (cls, str(doc)) if cls is SphinxClassDoc: assert '.. autosummary::' in str(doc), str(doc) else: assert 'Spammity index' in str(doc), str(doc) def test_duplicate_signature(): # Duplicate function signatures occur e.g. in ufuncs, when the # automatic mechanism adds one, and a more detailed comes from the # docstring itself. doc = NumpyDocString( """ z(x1, x2) z(a, theta) """) assert doc['Signature'].strip() == 'z(a, theta)' class_doc_txt = """ Foo Parameters ---------- f : callable ``f(t, y, *f_args)`` Aaa. jac : callable ``jac(t, y, *jac_args)`` Bbb. Attributes ---------- t : float Current time. y : ndarray Current variable values. Methods ------- a b c Examples -------- For usage examples, see `ode`. """ def test_class_members_doc(): doc = ClassDoc(None, class_doc_txt) non_blank_line_by_line_compare(str(doc), """ Foo Parameters ---------- f : callable ``f(t, y, *f_args)`` Aaa. jac : callable ``jac(t, y, *jac_args)`` Bbb. Examples -------- For usage examples, see `ode`. Attributes ---------- t : float Current time. y : ndarray Current variable values. Methods ------- a b c .. index:: """) def test_class_members_doc_sphinx(): doc = SphinxClassDoc(None, class_doc_txt) non_blank_line_by_line_compare(str(doc), """ Foo :Parameters: **f** : callable ``f(t, y, *f_args)`` Aaa. **jac** : callable ``jac(t, y, *jac_args)`` Bbb. .. rubric:: Examples For usage examples, see `ode`. .. rubric:: Attributes === ========== t (float) Current time. y (ndarray) Current variable values. === ========== .. rubric:: Methods === ========== a b c === ========== """) reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/tests/test_utils.py0000644000077000000240000000174413173066253030135 0ustar tomstaff00000000000000# namedtuple is needed for find_mod_objs so it can have a non-local module import sys from collections import namedtuple import pytest from ..utils import find_mod_objs PY3 = sys.version_info[0] >= 3 pytestmark = pytest.mark.skipif("PY3") def test_find_mod_objs(): lnms, fqns, objs = find_mod_objs('astropy_helpers') # this import is after the above call intentionally to make sure # find_mod_objs properly imports astropy on its own import astropy_helpers # just check for astropy.test ... other things might be added, so we # shouldn't check that it's the only thing assert lnms == [] lnms, fqns, objs = find_mod_objs( 'astropy_helpers.sphinx.ext.tests.test_utils', onlylocals=False) assert namedtuple in objs lnms, fqns, objs = find_mod_objs( 'astropy_helpers.sphinx.ext.tests.test_utils', onlylocals=True) assert 'namedtuple' not in lnms assert 'collections.namedtuple' not in fqns assert namedtuple not in objs reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/tocdepthfix.py0000644000077000000240000000124512361517711027107 0ustar tomstaff00000000000000from sphinx import addnodes def fix_toc_entries(app, doctree): # Get the docname; I don't know why this isn't just passed in to the # callback # This seems a bit unreliable as it's undocumented, but it's not "private" # either: docname = app.builder.env.temp_data['docname'] if app.builder.env.metadata[docname].get('tocdepth', 0) != 0: # We need to reprocess any TOC nodes in the doctree and make sure all # the files listed in any TOCs are noted for treenode in doctree.traverse(addnodes.toctree): app.builder.env.note_toctree(docname, treenode) def setup(app): app.connect('doctree-read', fix_toc_entries) reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/traitsdoc.py0000644000077000000240000001026113173066253026562 0ustar tomstaff00000000000000""" ========= traitsdoc ========= Sphinx extension that handles docstrings in the Numpy standard format, [1] and support Traits [2]. This extension can be used as a replacement for ``numpydoc`` when support for Traits is required. .. [1] http://projects.scipy.org/numpy/wiki/CodingStyleGuidelines#docstring-standard .. [2] http://code.enthought.com/projects/traits/ """ from __future__ import division, absolute_import, print_function import inspect import os import pydoc import collections from . import docscrape from . import docscrape_sphinx from .docscrape_sphinx import SphinxClassDoc, SphinxFunctionDoc, SphinxDocString from . import numpydoc from . import comment_eater class SphinxTraitsDoc(SphinxClassDoc): def __init__(self, cls, modulename='', func_doc=SphinxFunctionDoc): if not inspect.isclass(cls): raise ValueError("Initialise using a class. Got %r" % cls) self._cls = cls if modulename and not modulename.endswith('.'): modulename += '.' self._mod = modulename self._name = cls.__name__ self._func_doc = func_doc docstring = pydoc.getdoc(cls) docstring = docstring.split('\n') # De-indent paragraph try: indent = min(len(s) - len(s.lstrip()) for s in docstring if s.strip()) except ValueError: indent = 0 for n,line in enumerate(docstring): docstring[n] = docstring[n][indent:] self._doc = docscrape.Reader(docstring) self._parsed_data = { 'Signature': '', 'Summary': '', 'Description': [], 'Extended Summary': [], 'Parameters': [], 'Returns': [], 'Raises': [], 'Warns': [], 'Other Parameters': [], 'Traits': [], 'Methods': [], 'See Also': [], 'Notes': [], 'References': '', 'Example': '', 'Examples': '', 'index': {} } self._parse() def _str_summary(self): return self['Summary'] + [''] def _str_extended_summary(self): return self['Description'] + self['Extended Summary'] + [''] def __str__(self, indent=0, func_role="func"): out = [] out += self._str_signature() out += self._str_index() + [''] out += self._str_summary() out += self._str_extended_summary() for param_list in ('Parameters', 'Traits', 'Methods', 'Returns','Raises'): out += self._str_param_list(param_list) out += self._str_see_also("obj") out += self._str_section('Notes') out += self._str_references() out += self._str_section('Example') out += self._str_section('Examples') out = self._str_indent(out,indent) return '\n'.join(out) def looks_like_issubclass(obj, classname): """ Return True if the object has a class or superclass with the given class name. Ignores old-style classes. """ t = obj if t.__name__ == classname: return True for klass in t.__mro__: if klass.__name__ == classname: return True return False def get_doc_object(obj, what=None, config=None): if what is None: if inspect.isclass(obj): what = 'class' elif inspect.ismodule(obj): what = 'module' elif isinstance(obj, collections.Callable): what = 'function' else: what = 'object' if what == 'class': doc = SphinxTraitsDoc(obj, '', func_doc=SphinxFunctionDoc, config=config) if looks_like_issubclass(obj, 'HasTraits'): for name, trait, comment in comment_eater.get_class_traits(obj): # Exclude private traits. if not name.startswith('_'): doc['Traits'].append((name, trait, comment.splitlines())) return doc elif what in ('function', 'method'): return SphinxFunctionDoc(obj, '', config=config) else: return SphinxDocString(pydoc.getdoc(obj), config=config) def setup(app): # init numpydoc numpydoc.setup(app, get_doc_object) reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/ext/utils.py0000644000077000000240000001404313173066253025730 0ustar tomstaff00000000000000import inspect import sys import re import os from warnings import warn from sphinx.ext.autosummary.generate import find_autosummary_in_docstring def find_mod_objs(modname, onlylocals=False): """ Returns all the public attributes of a module referenced by name. .. note:: The returned list *not* include subpackages or modules of `modname`,nor does it include private attributes (those that beginwith '_' or are not in `__all__`). Parameters ---------- modname : str The name of the module to search. onlylocals : bool If True, only attributes that are either members of `modname` OR one of its modules or subpackages will be included. Returns ------- localnames : list of str A list of the names of the attributes as they are named in the module `modname` . fqnames : list of str A list of the full qualified names of the attributes (e.g., ``astropy.utils.misc.find_mod_objs``). For attributes that are simple variables, this is based on the local name, but for functions or classes it can be different if they are actually defined elsewhere and just referenced in `modname`. objs : list of objects A list of the actual attributes themselves (in the same order as the other arguments) """ __import__(modname) mod = sys.modules[modname] if hasattr(mod, '__all__'): pkgitems = [(k, mod.__dict__[k]) for k in mod.__all__] else: pkgitems = [(k, mod.__dict__[k]) for k in dir(mod) if k[0] != '_'] # filter out modules and pull the names and objs out ismodule = inspect.ismodule localnames = [k for k, v in pkgitems if not ismodule(v)] objs = [v for k, v in pkgitems if not ismodule(v)] # fully qualified names can be determined from the object's module fqnames = [] for obj, lnm in zip(objs, localnames): if hasattr(obj, '__module__') and hasattr(obj, '__name__'): fqnames.append(obj.__module__ + '.' + obj.__name__) else: fqnames.append(modname + '.' + lnm) if onlylocals: valids = [fqn.startswith(modname) for fqn in fqnames] localnames = [e for i, e in enumerate(localnames) if valids[i]] fqnames = [e for i, e in enumerate(fqnames) if valids[i]] objs = [e for i, e in enumerate(objs) if valids[i]] return localnames, fqnames, objs def find_autosummary_in_lines_for_automodsumm(lines, module=None, filename=None): """Find out what items appear in autosummary:: directives in the given lines. Returns a list of (name, toctree, template, inherited_members) where *name* is a name of an object and *toctree* the :toctree: path of the corresponding autosummary directive (relative to the root of the file name), *template* the value of the :template: option, and *inherited_members* is the value of the :inherited-members: option. *toctree*, *template*, and *inherited_members* are ``None`` if the directive does not have the corresponding options set. .. note:: This is a slightly modified version of ``sphinx.ext.autosummary.generate.find_autosummary_in_lines`` which recognizes the ``inherited-members`` option. """ autosummary_re = re.compile(r'^(\s*)\.\.\s+autosummary::\s*') automodule_re = re.compile( r'^\s*\.\.\s+automodule::\s*([A-Za-z0-9_.]+)\s*$') module_re = re.compile( r'^\s*\.\.\s+(current)?module::\s*([a-zA-Z0-9_.]+)\s*$') autosummary_item_re = re.compile(r'^\s+(~?[_a-zA-Z][a-zA-Z0-9_.]*)\s*.*?') toctree_arg_re = re.compile(r'^\s+:toctree:\s*(.*?)\s*$') template_arg_re = re.compile(r'^\s+:template:\s*(.*?)\s*$') inherited_members_arg_re = re.compile(r'^\s+:inherited-members:\s*$') no_inherited_members_arg_re = re.compile(r'^\s+:no-inherited-members:\s*$') documented = [] toctree = None template = None inherited_members = None current_module = module in_autosummary = False base_indent = "" for line in lines: if in_autosummary: m = toctree_arg_re.match(line) if m: toctree = m.group(1) if filename: toctree = os.path.join(os.path.dirname(filename), toctree) continue m = template_arg_re.match(line) if m: template = m.group(1).strip() continue m = inherited_members_arg_re.match(line) if m: inherited_members = True continue m = no_inherited_members_arg_re.match(line) if m: inherited_members = False continue if line.strip().startswith(':'): warn(line) continue # skip options m = autosummary_item_re.match(line) if m: name = m.group(1).strip() if name.startswith('~'): name = name[1:] if current_module and \ not name.startswith(current_module + '.'): name = "%s.%s" % (current_module, name) documented.append((name, toctree, template, inherited_members)) continue if not line.strip() or line.startswith(base_indent + " "): continue in_autosummary = False m = autosummary_re.match(line) if m: in_autosummary = True base_indent = m.group(1) toctree = None template = None continue m = automodule_re.search(line) if m: current_module = m.group(1).strip() # recurse into the automodule docstring documented.extend(find_autosummary_in_docstring( current_module, filename=filename)) continue m = module_re.match(line) if m: current_module = m.group(2) continue return documented reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/local/0000755000077000000240000000000013173066302024501 5ustar tomstaff00000000000000reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/local/python2_local_links.inv0000644000077000000240000000072713173066253031207 0ustar tomstaff00000000000000# Sphinx inventory version 2 # Project: Python # Version: 2.7 and 3.5 # The remainder of this file should be compressed using zlib. xœ¥’AOƒ0†ïý_²‹ÚEc²»&‹‡ÍHvgåCjJ‹_Ûüõpu$/^Þçù ížëR™”9¢ñ–Z8"9e $l;²¯(ýv­/­‰É~x»†DÜAfrX‰Û§%a•)“#-À—ÊA¡4‚+mÐ9¤­jBç0‡à”yw­"ÒuoOØ&ÒÍ=‘¥­±‘XûîSø $ËØ¥ŒÚå9v¢ô•^Œ Î6ÛÙøöÄ>b;>#œí3p.?‚8KÛz¶à‹áçu\5ºe©ªÐÙ¸š6Ž1έG×áE0ò7}J?á¡ÍY Ým-á[@çE|´5šiÍ~ïšpp&­‘(WQâ‰ý½óK9÷]~¡ß˜ö\œ‘–„Y¾³Vß7(ƒVõó.89‹ÿPTable of Contents {{ toctree(maxdepth=-1, titles_only=true) }} reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/layout.html0000644000077000000240000000655112660615525032631 0ustar tomstaff00000000000000{% extends "basic/layout.html" %} {# Collapsible sidebar script from default/layout.html in Sphinx #} {% set script_files = script_files + ['_static/sidebar.js'] %} {# Add the google webfonts needed for the logo #} {% block extrahead %} {% if not embedded %}{% endif %} {% endblock %} {% block header %}
{{ theme_logotext1 }}{{ theme_logotext2 }}{{ theme_logotext3 }}
  • Index
  • Modules
  • {% block sidebarsearch %} {% include "searchbox.html" %} {% endblock %}
{% endblock %} {% block relbar1 %} {% endblock %} {# Silence the bottom relbar. #} {% block relbar2 %}{% endblock %} {%- block footer %}

{%- if edit_on_github %} {{ edit_on_github_page_message }}   {%- endif %} {%- if show_source and has_source and sourcename %} {{ _('Page Source') }} {%- endif %}   Back to Top

{%- if show_copyright %} {%- if hasdoc('copyright') %} {% trans path=pathto('copyright'), copyright=copyright|e %}© Copyright {{ copyright }}.{% endtrans %}
{%- else %} {% trans copyright=copyright|e %}© Copyright {{ copyright }}.{% endtrans %}
{%- endif %} {%- endif %} {%- if show_sphinx %} {% trans sphinx_version=sphinx_version|e %}Created using Sphinx {{ sphinx_version }}.{% endtrans %}   {%- endif %} {%- if last_updated %} {% trans last_updated=last_updated|e %}Last built {{ last_updated }}.{% endtrans %}
{%- endif %}

{%- endblock %} reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/localtoc.html0000644000077000000240000000004212361517711033075 0ustar tomstaff00000000000000

Page Contents

{{ toc }} reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/searchbox.html0000644000077000000240000000042012361517711033253 0ustar tomstaff00000000000000{%- if pagename != "search" %}
{%- endif %} reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/static/0000755000077000000240000000000013173066302031677 5ustar tomstaff00000000000000././@LongLink0000000000000000000000000000015300000000000011214 Lustar 00000000000000reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/static/astropy_linkout.svgreproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/static/astropy_linko0000644000077000000240000001212112521647746034531 0ustar tomstaff00000000000000 ././@LongLink0000000000000000000000000000015600000000000011217 Lustar 00000000000000reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/static/astropy_linkout_20.pngreproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/static/astropy_linko0000644000077000000240000000327512361517711034531 0ustar tomstaff00000000000000‰PNG  IHDR[â8A bKGDÿÿÿ ½§“ oFFsvek pHYs × ×B(›x vpAg\@0¢Ð¬IDATXÃå˜iŒ_SÆϘÚ+Új‹fF« BH‘XbOÐέ†ª}‰-Z¤Abû¢$¤Öi…V#¸T•ZCÕ– µIi™ÚU”d¦ª÷ý›;·÷?™)Ó*OrsïyÏsÏûžçžóžs®è!ج’ôLOùÙ`[À–=é`œ3|¼±;»1`{ÛͶﱽÔv]mú«ßØÞX°=˜l¦y’Zjs„á@30ŒlÈ<,éÝ’ÆöÆ @+ð60SÒ϶ûÇG½í‰ñü¡¤mo œ¬‘t—íþÀ%À `¶¤4üÔ pÐX<,’Ô1¦„:`•R~qÂPà` ð.°0kœÐ¨WJéŒs¶@R>)é÷ÎÀ´Ntž$éS`6p6pTØím¢5…—ÿÆHš“s8˜Éã{à@`»¿ ÷J:×v=ð%``/à9`çàœ/iší~À\`ÿbŸ{ƒçœH7KBäÝ€§"Æ“o€f¥´:¡/°hRÊʱ' J™\"ö`ànàÜ*ý[!©ÍöåÀ”ˆÿ `'I­ØÆö¶µ}Ÿí ¶o´Ý9÷#Ûg›Ùþ6ì l²}’í—m¿h[¶›lO·ýeð~ŽòtÛgE;õnÇÛkmϳ=Ëö^ÑÎKQ¿&âš~*¸² Ò NøÑ §ìµNxÊ ×æl30¡L-'ÌwÂ~¥uö ÛOÒ lOŒ˜Ïm)†ÙÞ©`»"×±ÁakÈÙšs\"5äߟ[m,ˆÝfû˜Bý±¹ú 9{ígÃþ[Œþ¼Ø“ªØà„'(Ê8á}'ëðú;aqÑ^{N•:l_q-ãÔHZ"éëx©.„Ü5ÇkŠû×ÀOñ|[ì86—„¤_Y?Ü-éé‚í¸¸ÿB6m‰8×wDqkÚ×… ÚÊ(eY´5$ʯwdz"ðD%¿—iZMh²´1/éѪbÛîmûZÛŸ‘åÒ¸0Çë] ŒV’-Ž_Ù¾9öÕ냲…ª1îK%­)Ôå®AÝðÓBûº08­À9•lî *±íN¶à'’ž M/ÎØÛÛo×;·GcJ=IÏÛ€€þÀeÀ›¶û®§àÕ:T6’܆ò}ÖæÊ³€£œP à„F 7°¸“6J}Kú h,ÌÐa¡S‡ÎŒŠV`¤¤‹%½üXU é[I—»WEÀÿˆÔ°<îM¶‹;¤Á¹çeÝh³1ÏWÊjà% 2úF3;I!±ËF6’Z ¦âÇ¥†ÈcÀrIKªtªÝ›=¢"€¤VIS€rªà·¸°½Y7Å®ï·ÎÈù8/ŠmÀü®4æ„}Õdg‡<¦çÄóhàÁ.4§.p*Úv»ø*žw·}=YJ9ÖÝÙ¼,²=øì”…9ú;À @_`†í¹ÀÊ.þ'IÉöê#{lï |Hv868·Hú¦ðÞÞNRòûï-ÈRãÍ%£öM Þ ûµJÿšQÕÐVCvNé öŒ¶¸&ìk"À“ÉrrÉv$Ä•Ç:ŽŒidi¥8%®WiµU!i­íÑÀcáçÒ\õÀý¹XóÌsÂL²…w7`2°¸o?)8áNàqàÖ.ŠØd{rxS˜yÙ¾ÓÞ¸˜,¡¯î—ôží1À²³ýòàöŽúß‘”æåOtÁ\ V $MSë©A{UÒGeÑFºj&;öö#›IIZg‹dK| ó€=ÉÆJYTM'lE¶»¤”–ÎÔ‹³Äé]ü(¯Hú üMq¨¹h=ÞÛÏ ¯lˆkþ~›<&wmGÿk±pYº™½!üõäÿì%âÿÈ#ÀædëÀX¥·h=…ÿ’ØSß»À3p5™Ø‹óÛĞƟ ½§pÅ%tEXtdate:create2012-10-18T20:57:33+02:00¢p_f%tEXtdate:modify2012-10-18T20:57:33+02:00Ó-çÚtEXtSoftwarewww.inkscape.org›î<IEND®B`‚././@LongLink0000000000000000000000000000015000000000000011211 Lustar 00000000000000reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/static/astropy_logo.icoreproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/static/astropy_logo.0000644000077000000240000010033412521647746034437 0ustar tomstaff00000000000000@@ (@F  (n@ ( –P (¾Y(@€ ÿÿ ÿ* ÿVýy ý›¬±ûÕúûüí÷ùüìýýýíýýýí§ªû× ü«ý‹ýoüKÿ ÿ ÿÿîûHýýÌúìýó ûøûü°µÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˜Ÿÿÿûþ ûúûöýòúéûÇýÿIóÿ¿ÿ!ýyûÏüðüúÿÿÿÿÿÿ ÿÿ>KÿÿÏÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡ÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿûúÿðûÚü—û?ã ÿÿý|ûÚýöÿÿÿÿÿÿþÿýÿýÿLYþÿÌÏÿÿûüÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿerþÿýÿýÿýÿýÿýÿþÿÿÿÿÿÿÿüûûíú½ÿZÿÿüJûÇýöÿÿÿÿþÿýÿýÿýÿ*<þÿ™¡ÿÿêíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉÎÿÿ3Eýÿ ýÿýÿýÿýÿýÿýÿýÿýÿþÿÿÿÿÿÿÿÿðûÄüXÿÿü•üêÿÿÿÿþÿýÿýÿýÿ1ýÿ“þÿäèÿÿûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrþÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿÿÿÿÿÿÿüïù´ÿ=ÿø$û®ýúÿÿÿÿýÿýÿýÿýÿ.Cþÿ·¿ÿÿùúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”Ÿþÿ*ýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿÿÿÿÿÿÿúâû†ÿÿ3üÃüþÿÿýÿýÿýÿýÿýÿ^pþÿÓÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷øÿÿ…“þÿ+ýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿÿÿÿÿýöü¸ÿ7 ÿ(øÃ!ÿÿ ÿÿ ýÿ ýÿ ýÿýÿýÿsƒþÿåéÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÅÍþÿPfýÿ %ýÿýÿýÿ ýÿ ýÿ ýÿ ýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿýÿþÿÿÿ ÿÿûÙ ÿi#ÿ úº#ÿÿ"ÿÿ"ýÿ"ýÿ"ýÿ ýÿ ýÿy‹ÿÿîðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâåþÿu‡ýÿ =ýÿýÿýÿ!ýÿ"ýÿ"ýÿ"ýÿ"ýÿ"ýÿ"ýÿ"ýÿ"ýÿ"ýÿ"ýÿ"ýÿ"ýÿ"ýÿ"ýÿ"ýÿ"ýÿ"ýÿ"ýÿ"ýÿ!ýÿ!ÿÿ!ÿÿ ûìýƒÿÿ$ý›$ýÿ$ÿÿ$ýÿ$ýÿ$ýÿ"ýÿýÿmþÿëîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýÿÿ¦²þÿ8Týÿ%ýÿýÿ!ýÿ$ýÿ$ýÿ$ýÿ$ýÿ$ýÿ#ýÿ#ýÿ#ýÿ"ýÿ"ýÿ"ýÿ"ýÿ#ýÿ#ýÿ#ýÿ$ýÿ$ýÿ$ýÿ$ýÿ$ýÿ$ýÿ#ýÿ#ýÿ$þÿ$ÿÿ#üõ!ü’'ÿ &ÿj'ûñ(ÿÿ&ýÿ&ýÿ&ýÿ&ýÿ!ýÿNiþÿÞãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçëþÿmƒýÿ5ýÿ ýÿ ýÿ%ýÿ&ýÿ&ýÿ&ýÿ%ýÿ%ýÿ$ýÿ#ýÿ#ýÿ"ýÿ"ýÿ"ýÿ"ýÿ"ýÿ"ýÿ#ýÿ#ýÿ$ýÿ$ýÿ%ýÿ&ýÿ&ýÿ&ýÿ&ýÿ&ýÿ&ýÿ&þÿ&ÿÿ%ýø&üš3ÿ)ÿ%(ûØ*ÿÿ)ýÿ)ýÿ)ýÿ(ýÿ%ýÿ'IþÿÇÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÙßþÿUqýÿ'ýÿ!ýÿ'ýÿ)ýÿ(ýÿ(ýÿ(ýÿ'ýÿ&ýÿ#ýÿ(ýÿ"DþÿPkþÿp†þÿ‡™þÿ’£þÿ‘¢þÿ„˜þÿm„þÿNjþÿ!Cþÿ&ýÿ"ýÿ%ýÿ&ýÿ'ýÿ(ýÿ(ýÿ(ýÿ(ýÿ(ýÿ(ýÿ(ÿÿ&üú'ü˜9ÿ ÿ+ý”*þÿ+ÿÿ*þÿ+þÿ+þÿ)þÿ*þÿ®ÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàåÿÿQoþÿ%þÿ%þÿ+þÿ+þÿ+þÿ+þÿ*þÿ'þÿ$þÿ"Gþÿt‹ÿÿ¶ÂÿÿÔÛÿÿäèÿÿïñÿÿöøÿÿúûÿÿúûÿÿö÷ÿÿîñÿÿãèÿÿÔÛÿÿ¹Åÿÿ}’ÿÿ/Rþÿ'þÿ&þÿ)þÿ)þÿ*þÿ*þÿ*þÿ*þÿ*þÿ*ÿÿ'ûù'ý‰Uª+ÿ;-üæ.ÿÿ-þÿ-þÿ-þÿ,þÿ)þÿVtÿÿêîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíñÿÿ]zþÿ(þÿ'þÿ-þÿ-þÿ-þÿ-þÿ,þÿ$þÿFþÿ‰ÿÿÒÚÿÿðóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóõÿÿ×Þÿÿ£³ÿÿ?`ÿÿ)þÿ)þÿ,þÿ,þÿ,þÿ,þÿ,þÿ,þÿ.ÿÿ,üñ.ýt@ÿ/ý™/þÿ0ÿÿ0þÿ0þÿ0þÿ-þÿ :þÿ¿Ìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿz“þÿ1þÿ(þÿ0þÿ/þÿ.þÿ/þÿ,þÿ+þÿZwÿÿÇÑÿÿøúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜâÿÿ”§ÿÿ#Lþÿ'þÿ.þÿ/þÿ/þÿ/þÿ/þÿ/þÿ0ÿÿ.üâ-ÿI0ÿ%0ýá2ÿÿ1þÿ1þÿ1þÿ0þÿ/þÿbÿÿðóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯¿þÿHþÿ)þÿ1þÿ2þÿ2þÿ1þÿ.þÿ8þÿx’ÿÿæëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýÿÿÄÏÿÿTsÿÿ+þÿ/þÿ1þÿ0þÿ0þÿ0þÿ1ÿÿ1ÿÿ/üÈ2ÿ$@¿3ýn3üø5ÿÿ3þÿ3þÿ3þÿ1þÿ8þÿÀÌÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿëïÿÿEkþÿ,þÿ2þÿ4þÿ3þÿ4þÿ1þÿ8þÿ€šÿÿñôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôöÿÿÕÞÿÿËÕÿÿËÖÿÿ×ßÿÿõöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâçÿÿqÿÿ1þÿ0þÿ3þÿ2þÿ2þÿ2þÿ3ÿÿ2þÿ0üŸ@ÿã 2ü¶6üþ6ÿÿ6þÿ6þÿ5þÿ5þÿDlþÿèíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”«þÿ @þÿ/þÿ6þÿ5þÿ5þÿ4þÿ0þÿt‘ÿÿñôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäéÿÿ—­þÿ\~þÿ?eþÿ1\þÿ,Xþÿ,Xþÿ2]þÿ?fþÿZ}þÿ§þÿÖßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïòÿÿu’ÿÿ3þÿ3þÿ5þÿ5þÿ5þÿ5þÿ6ÿÿ4üð4ÿX8ÿ 5ûå:ÿÿ8þÿ8þÿ8þÿ7þÿ7þÿ–®ÿÿûüÿÿÿÿÿÿÿÿÿÿÿÿÿÿðôÿÿ@jþÿ0þÿ8þÿ8þÿ8þÿ8þÿ.þÿRxÿÿæëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñóÿÿާþÿ:eþÿEþÿ1þÿ*þÿ-þÿ.þÿ.þÿ-þÿ*þÿ0þÿCþÿ3]þÿj‹þÿËÖþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíòÿÿlŒÿÿ1þÿ6þÿ8þÿ7þÿ7þÿ8þÿ8ÿÿ5ýÌ5ÿ:ÿO9üô<ÿÿ:þÿ:þÿ:þÿ8þÿ BþÿÏÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®ÁþÿMþÿ3þÿ;þÿ:þÿ;þÿ7þÿOþÿ»ËÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕÞþÿ^„þÿ@þÿ/þÿ4þÿ9þÿ:þÿ:þÿ:þÿ9þÿ9þÿ9þÿ8þÿ4þÿ.þÿ6þÿ/]þÿ‹¥þÿóõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàçÿÿMuÿÿ3þÿ9þÿ9þÿ9þÿ9þÿ;ÿÿ8ûý8ÿÿ<ÿ{;ü÷=ÿÿ<þÿ<þÿ<þÿ;þÿ9hþÿæìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿcˆþÿ<þÿ:þÿ<þÿ<þÿ<þÿ2þÿx™ÿÿõøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒÝþÿOyþÿ6þÿ5þÿ<þÿ=þÿ<þÿ<þÿ<þÿ<þÿ<þÿ<þÿ<þÿ<þÿ<þÿ<þÿ9þÿ2þÿ Aþÿf‹þÿàçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÅÓÿÿ!Sþÿ9þÿ;þÿ;þÿ;þÿ<þÿ=ÿÿ9üÝ;ÿ'=ý¢?ûý@ÿÿ?þÿ?þÿ=þÿ?þÿkÿÿðôÿÿÿÿÿÿÿÿÿÿÿÿÿÿñôÿÿ7gþÿ5þÿ>þÿ>þÿ>þÿ;þÿMþÿ¾Îÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêïÿÿc‰þÿ8þÿ9þÿ?þÿ>þÿ>þÿ>þÿ>þÿ>þÿ>þÿ>þÿ>þÿ>þÿ>þÿ>þÿ>þÿ?þÿ>þÿ7þÿ:þÿ[„þÿàèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýÿÿ‘¬ÿÿ=þÿ<þÿ>þÿ>þÿ>þÿ@ÿÿ>üþ>ýˆÿAþ¿BÿÿBÿÿAþÿAþÿ?þÿBþÿ•°ÿÿúüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉ×ÿÿ#[þÿ9þÿAþÿAþÿAþÿ:þÿUÿÿäëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”°þÿ Fþÿ9þÿAþÿ@þÿ@þÿ@þÿ>þÿ:þÿ6þÿ5þÿ5þÿ7þÿ;þÿ?þÿ@þÿ@þÿ@þÿ@þÿAþÿ;þÿ=þÿeþÿñõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãëÿÿ>oþÿ>þÿ@þÿ@þÿ@þÿAþÿBÿÿ?üÝ<ÿBûÒDÿÿCÿÿCþÿCþÿAþÿDþÿ³Çÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢ºþÿTþÿ>þÿCþÿCþÿCþÿ9þÿŒ«ÿÿûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿâêÿÿEvþÿ7þÿCþÿCþÿCþÿ>þÿ4þÿDþÿBsþÿs˜þÿƒ£ÿÿ„£ÿÿjÿÿ0fþÿ>þÿ:þÿBþÿBþÿBþÿBþÿCþÿ;þÿ Fþÿˆ¦þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýÿÿ§¾ÿÿCþÿ@þÿBþÿBþÿBþÿDÿÿBûúBýhUÿEûãGÿÿEþÿEþÿEþÿBþÿFþÿÈÖÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‡¨þÿOþÿAþÿEþÿEþÿDþÿ@þÿ®Äÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©ÁþÿYþÿ?þÿFþÿCþÿ9þÿ&aþÿ¡ÿÿ¨ÀÿÿÔàÿÿöùÿÿÿÿÿÿÿÿÿÿïóÿÿÈÖÿÿ—³ÿÿ?rÿÿ?þÿBþÿEþÿEþÿEþÿEþÿ=þÿ$_þÿÇÖþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâêÿÿ4kþÿCþÿDþÿDþÿDþÿDÿÿEýþBüÄ@ÿ FúêJÿÿHþÿHþÿHþÿEþÿIþÿÕáÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿxžþÿMþÿDþÿGþÿGþÿFþÿ Oþÿ¾Ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‚¥þÿIþÿEþÿ?þÿHþÿ_Šÿÿ¿ÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒßÿÿbŽÿÿHþÿEþÿGþÿGþÿGþÿEþÿEþÿ\‰þÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿùûÿÿ‰ªÿÿEþÿEþÿGþÿGþÿGþÿIÿÿDûñJÿ4IûåLÿÿJþÿJþÿJþÿGþÿLþÿÙäÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿtœþÿNþÿGþÿJþÿJþÿHþÿZþÿÃÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿp™þÿBþÿ=þÿ ]ÿÿЬÿÿêðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèïÿÿ]ŒÿÿBþÿIþÿIþÿIþÿJþÿAþÿ `þÿÆ×þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËÚÿÿ PþÿGþÿIþÿIþÿIþÿKÿÿHüùJÿxLúàNÿÿLÿÿLþÿLþÿIþÿNþÿÖãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ{¢þÿ RþÿIþÿLþÿLþÿJþÿ\þÿÃÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrœþÿ;þÿ.hÿÿ¬ÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËÛÿÿ+iÿÿGþÿKþÿKþÿKþÿHþÿNþÿo™þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçîÿÿ5pþÿJþÿKþÿKþÿKþÿKÿÿKüþLü¿OûÓPÿÿNÿÿNþÿNþÿLþÿOþÿÈÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°þÿYþÿJþÿNþÿNþÿMþÿRþÿ¼Ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€¦þÿ5nÿÿ®ÈÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøûÿÿŠ®ÿÿFþÿMþÿNþÿNþÿNþÿFþÿ9uþÿô÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿðõÿÿnšÿÿMþÿKþÿMþÿMþÿMþÿOÿÿLûéPüºQþÿQÿÿQþÿQþÿOþÿRþÿ±Éÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬ÆÿÿbþÿJþÿPþÿPþÿPþÿHþÿ¨ÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºÏÿÿ¹ÐÿÿüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀÕÿÿ\þÿNþÿPþÿPþÿPþÿIþÿ!gþÿÈÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýÿÿ™¹ÿÿPþÿNþÿPþÿPþÿPþÿRÿÿPüïRýŸQüüTÿÿSþÿSþÿQþÿTþÿ‘µÿÿùûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚæÿÿ'mþÿJþÿSþÿSþÿSþÿJþÿ}§ÿÿõøÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ùÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûüÿÿüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿØäÿÿAÿÿNþÿRþÿRþÿRþÿMþÿ`þÿ›¼þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºÐÿÿTþÿPþÿRþÿRþÿRþÿTÿÿPüíVÿ}UüøVÿÿUþÿUþÿSþÿTþÿf™ÿÿïôÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýÿÿF„þÿOþÿTþÿUþÿUþÿQþÿ9{ÿÿØåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑàÿÿœ½ÿÿéðÿÿÿÿÿÿÿÿÿÿÿÿÿÿæîÿÿ_“ÿÿNþÿTþÿTþÿTþÿPþÿ Zþÿ~¨þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑàÿÿVþÿQþÿTþÿTþÿTþÿVÿÿRüíVÿPWüóYÿÿWþÿWþÿVþÿUþÿ0wþÿåîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆ±þÿ _þÿSþÿWþÿWþÿVþÿXþÿ¡ÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçïÿÿSÿÿ:}þÿÖäÿÿÿÿÿÿÿÿÿÿÿÿÿÿìóÿÿjÿÿPþÿVþÿVþÿVþÿTþÿYþÿjœþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛçÿÿ ]þÿSþÿVþÿVþÿVþÿXÿÿVüíZÿ"Xúì\ÿÿYþÿYþÿYþÿWþÿ^þÿÃÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜéÿÿ-vþÿQþÿYþÿYþÿYþÿRþÿ;€ÿÿÙæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßêÿÿb™ÿÿQþÿ9þÿÛèÿÿÿÿÿÿÿÿÿÿÿÿÿÿëòÿÿhœÿÿSþÿYþÿYþÿYþÿWþÿZþÿb™þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞéÿÿeþÿWþÿXþÿXþÿXþÿ[ÿÿXüífÿ XüÇ]ýþ\ÿÿ\þÿ\þÿZþÿZþÿ~¬ÿÿ÷úÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿzªþÿ^þÿWþÿ\þÿ[þÿ[þÿWþÿd›ÿÿêòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿×ÿÿOÿÿXþÿKþÿNŽþÿó÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿáìÿÿV’ÿÿVþÿ[þÿ[þÿ[þÿYþÿ\þÿeœþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝéÿÿ dþÿYþÿ[þÿ[þÿ[þÿ^ÿÿ[üífÿ_ý„]üù_ÿÿ^þÿ^þÿ]þÿ\þÿ*xþÿÜèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàëÿÿ<„þÿXþÿ]þÿ^þÿ^þÿ\þÿ_þÿdÿÿÓäÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑâÿÿ‡³ÿÿ)wÿÿTþÿ[þÿYþÿt§þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒâÿÿ4þÿYþÿ]þÿ]þÿ]þÿZþÿaþÿr¥þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÙçÿÿ`þÿZþÿ]þÿ]þÿ]þÿ`ÿÿ]üíÿbÿ<`ûñcÿÿ`þÿ`þÿ`þÿ^þÿ]þÿ˜¿ÿÿûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ®ÌþÿoþÿYþÿ`þÿ`þÿ`þÿ]þÿ[þÿBˆÿÿ—¾ÿÿÏáÿÿøúÿÿÿÿÿÿüýÿÿäîÿÿ´Ðÿÿ‹·ÿÿ?‡ÿÿZþÿYþÿ`þÿWþÿ"vþÿ½Õþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹Óÿÿeþÿ]þÿ_þÿ_þÿ_þÿ\þÿhþÿеþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈÜÿÿ`þÿ\þÿ_þÿ_þÿ_þÿbÿÿ]üímíbýÌdýþbþÿbþÿbþÿbþÿaþÿ/€þÿÚèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‘»þÿiþÿ[þÿaþÿbþÿbþÿaþÿZþÿ_þÿ;†þÿr¨ÿÿ°ÿÿy¬ÿÿW—þÿoþÿWþÿ[þÿaþÿbþÿ_þÿ]þÿp§þÿøûÿÿÿÿÿÿÿÿÿÿÿÿÿÿùûÿÿ‰·ÿÿYþÿaþÿbþÿbþÿbþÿ]þÿrþÿ¬Ìþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿ­Ìÿÿbþÿ_þÿaþÿaþÿaþÿdÿÿ_üíUªeýwdüùgÿÿeþÿeþÿeþÿdþÿ`þÿy®ÿÿùûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿÿºþÿoþÿ\þÿbþÿdþÿdþÿdþÿcþÿ_þÿZþÿYþÿZþÿ\þÿaþÿdþÿdþÿdþÿaþÿ]þÿGþÿÔäþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØçÿÿ9‡ÿÿ_þÿdþÿdþÿdþÿdþÿ\þÿ(|þÿÜêÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ûÿÿ‰·ÿÿeþÿbþÿdþÿdþÿdþÿgÿÿdüígÿ%füâjÿÿgþÿgþÿgþÿgþÿeþÿpþÿ°Ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ Æþÿ3…þÿcþÿ_þÿfþÿgþÿgþÿgþÿfþÿfþÿfþÿfþÿfþÿfþÿfþÿ_þÿcþÿG‘þÿÆÝþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýÿÿ˜Áÿÿcþÿeþÿfþÿfþÿfþÿeþÿ`þÿGþÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿìôÿÿZ›þÿeþÿeþÿfþÿfþÿfþÿiÿÿfüíÿiý—hýýkÿÿiþÿiþÿiþÿhþÿeþÿ5‡þÿÍáÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËáþÿg¥þÿ'}þÿeþÿ`þÿdþÿfþÿgþÿhþÿhþÿgþÿeþÿaþÿbþÿwþÿj§þÿØèþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐäÿÿ5‡ÿÿcþÿhþÿhþÿhþÿhþÿdþÿ pþÿ‰¹þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàíÿÿ&þÿfþÿgþÿhþÿhþÿhþÿkÿÿhüíjÿ0kúánÿÿkþÿkþÿkþÿkþÿjþÿeþÿN˜ÿÿ×éÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹Öþÿi¨þÿ=þÿ|þÿ qþÿhþÿdþÿfþÿlþÿvþÿ0…þÿXžþÿ«Îþÿüýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïöÿÿd¦ÿÿdþÿjþÿkþÿkþÿkþÿkþÿdþÿ*„þÿØéÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿ¼ØÿÿkþÿhþÿjþÿjþÿjþÿjþÿmÿÿküínýmüþpÿÿnþÿnþÿnþÿnþÿmþÿgþÿSœÿÿÑåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáîÿÿ«Ïþÿ‡ºþÿmªþÿ_¤þÿe§þÿx±þÿ˜ÃþÿÊáÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòøÿÿ|µÿÿnþÿkþÿmþÿmþÿmþÿmþÿjþÿmþÿl«þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôùÿÿq®ÿÿlþÿlþÿmþÿmþÿmþÿmþÿpÿÿküïuÿ%mýÔrÿÿpþÿpþÿpþÿpþÿpþÿoþÿiþÿD•ÿÿ·×ÿÿûýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìôÿÿ~·ÿÿ tþÿkþÿoþÿoþÿnþÿjþÿkþÿiþÿ.‰þÿÒåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÙêÿÿ#‚þÿmþÿnþÿoþÿoþÿoþÿoþÿrÿÿoüérÿgpûôuÿÿqþÿrþÿrþÿrþÿrþÿqþÿlþÿþÿÁÿÿáîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕèÿÿj¬ÿÿsþÿoþÿqþÿqþÿpþÿsþÿ~þÿtþÿtþÿ¿þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýÿÿ•ÄÿÿnþÿoþÿqþÿqþÿqþÿqþÿqÿÿrýþnüÂ`ÿtü«vÿÿuÿÿtþÿtþÿtþÿtþÿtþÿtþÿqþÿsþÿR ÿÿ²Õÿÿãðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâïÿÿ§Ïÿÿ:“ÿÿoþÿrþÿtþÿtþÿtþÿmþÿ%ˆþÿ—Æþÿn°þÿb©þÿóøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜìÿÿ0þÿrþÿrþÿsþÿsþÿsþÿsþÿuÿÿsüúrýyxÿ1výÓzÿÿwþÿwþÿwþÿwþÿwþÿwþÿvþÿuþÿpþÿ {þÿW¤ÿÿ©ÒÿÿÑæÿÿëôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿð÷ÿÿÔèÿÿ«ÑÿÿT¢ÿÿxþÿqþÿuþÿuþÿuþÿvþÿsþÿ vþÿp²þÿÿÿÿÿï÷ÿÿåñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýÿÿ‰Àÿÿsþÿuþÿvþÿvþÿvþÿvþÿvþÿyÿÿuüéwÿ/xÿ[wûê|ÿÿyþÿxþÿxþÿxþÿxþÿyþÿyþÿxþÿwþÿtþÿvþÿ+þÿh°ÿÿ›Êÿÿ¼ÜÿÿÊãÿÿÒçÿÿÔèÿÿÒèÿÿÍåÿÿÃàÿÿ§Ñÿÿt¶ÿÿ2“þÿwþÿsþÿwþÿxþÿxþÿxþÿxþÿxþÿqþÿ7”þÿÙëÿÿÿÿÿÿÿÿÿÿýÿÿÿýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃßÿÿ…þÿvþÿxþÿxþÿwþÿwþÿwþÿyÿÿxÿÿwüª’ÿ|û„xûù~ÿÿ{þÿzþÿzþÿzþÿzþÿzþÿzþÿzþÿzþÿzþÿxþÿwþÿuþÿxþÿ…þÿ)þÿ-’þÿ)þÿŠþÿ|þÿuþÿwþÿxþÿzþÿzþÿzþÿ{þÿ{þÿ{þÿ{þÿvþÿ €þÿ‰ÁþÿþþÿÿÿÿÿÿÿÿÿÿþþÿÿúüÿÿþÿÿÿÿÿÿÿÝíÿÿO¤ÿÿvþÿyþÿyþÿyþÿyþÿyþÿzþÿ|ÿÿwûï|ÿHÿŽÿ {ü—~ýú€ÿÿ}þÿ}þÿ}þÿ}þÿ|þÿ|þÿ|þÿ|þÿ|þÿ|þÿ|þÿ|þÿ{þÿ{þÿ{þÿzþÿ{þÿ{þÿ{þÿ|þÿ|þÿ|þÿ|þÿ|þÿ|þÿ|þÿ|þÿ|þÿ|þÿwþÿP¥þÿôùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿýþÿÿõúÿÿ†Áÿÿyþÿ{þÿ}þÿ|þÿ|þÿ|þÿ|þÿ}ÿÿ}ÿÿzû«’ÿ€ÿ€ý¢‚ýýƒÿÿ€þÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿþÿ~þÿ~þÿ~þÿ~þÿ~þÿ~þÿ~þÿ~þÿ~þÿ~þÿ~þÿ~þÿ~þÿ~þÿ~þÿyþÿ!þÿ«ÕþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëõÿÿÀþÿ„þÿ}þÿ~þÿ~þÿ~þÿ~þÿþÿ‚ÿÿ~ûä}ÿ7„ÿú¨ƒüû…ÿÿ‚ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿ}ÿÿb±ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþÿÿ¿ßÿÿ/˜ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿ€ÿÿƒÿÿ€ýùý€ÿ€ÿüž…üù‡ÿÿ„ÿÿƒÿÿƒÿÿƒÿÿƒÿÿƒÿÿƒÿÿƒÿÿƒÿÿƒÿÿƒÿÿƒÿÿƒÿÿƒÿÿƒÿÿƒÿÿƒÿÿƒÿÿƒÿÿƒÿÿƒÿÿƒÿÿƒÿÿƒÿÿ‚ÿÿ„ÿÿn¹ÿÿúýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòùÿÿÇäÿÿšÎÿÿ; ÿÿƒÿÿƒÿÿƒÿÿƒÿÿ‚ÿÿ…ÿÿ…ÿÿ€ü²ˆÿ’ÿ…ý’„üòŠÿÿ‡ÿÿ…ÿÿ…ÿÿ…ÿÿ…ÿÿ…ÿÿ…ÿÿ…ÿÿ…ÿÿ…ÿÿ…ÿÿ…ÿÿ…ÿÿ…ÿÿ…ÿÿ…ÿÿ…ÿÿ…ÿÿ…ÿÿ…ÿÿƒÿÿ‚ÿÿÿÿ€ÿÿ‚ÿÿ]±ÿÿåóÿÿùýÿÿÿÿÿÿÿÿÿÿàðÿÿ¼àÿÿƒÄÿÿ“ÿÿƒÿÿ„ÿÿ…ÿÿ…ÿÿ…ÿÿ…ÿÿ†ÿÿˆÿÿ‚ýÌ‚ÿ+€ÿ‰ýu‰üáŒÿÿŠÿÿ‡ÿÿ‡ÿÿ‡ÿÿ‡ÿÿ‡ÿÿ‡ÿÿ‡ÿÿ‡ÿÿ‡ÿÿ‡ÿÿ‡ÿÿ‡ÿÿ‡ÿÿ‡ÿÿ‡ÿÿ‡ÿÿ‡ÿÿ‰ÿÿ‘ÿÿ•ÿÿ •ÿÿ%–ÿÿg¸ÿÿËçÿÿ³Ûÿÿ¬ØÿÿÕëÿÿ©ÖÿÿL«ÿÿ‰ÿÿ…ÿÿ†ÿÿ†ÿÿ‡ÿÿ‡ÿÿ‡ÿÿ‡ÿÿ‰ÿÿŒÿÿ†ýÔ‡ÿ@‹üMˆüÈüûŽÿÿ‹ÿÿŠÿÿŠÿÿŠÿÿŠÿÿŠÿÿŠÿÿŠÿÿŠÿÿŠÿÿŠÿÿ‰ÿÿ‰ÿÿ‰ÿÿ‰ÿÿ†ÿÿ•ÿÿxÁÿÿ«Øÿÿ¦ÖÿÿÓêÿÿëöÿÿs¾ÿÿ‰ÿÿ’ÿÿ&›ÿÿˆÿÿˆÿÿˆÿÿˆÿÿ‰ÿÿ‰ÿÿ‰ÿÿ‰ÿÿ‰ÿÿ‹ÿÿŽÿÿ‰ýÔˆÿGŠÿ#Šý™‹üìÿÿÿÿÿÿŒÿÿŒÿÿŒÿÿŒÿÿŒÿÿŒÿÿŒÿÿŒÿÿŒÿÿŒÿÿŒÿÿŒÿÿŠÿÿ•ÿÿV³ÿÿsÀÿÿ]¶ÿÿµÝÿÿ´Ýÿÿ‰ÿÿŠÿÿ‹ÿÿŠÿÿŠÿÿ‹ÿÿ‹ÿÿ‹ÿÿ‹ÿÿ‹ÿÿ‹ÿÿŒÿÿÿÿýþ‰üÆŒÿ<€ÿÿTŽüÇýó‘ÿÿ‘ÿÿÿÿŽÿÿŽÿÿŽÿÿŽÿÿŽÿÿŽÿÿŽÿÿŽÿÿŽÿÿŽÿÿŽÿÿŽÿÿÿÿÿÿ”ÿÿ‘Îÿÿ–Ñÿÿ†ÿÿŽÿÿŽÿÿŽÿÿŽÿÿŽÿÿŽÿÿŽÿÿŽÿÿŽÿÿÿÿ’ÿÿŽýóŽþ­Šÿ%ŒÿÿqŒýÔýõ“ÿÿ”ÿÿ‘ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹ÿÿžÿÿ’ÐÿÿsÁÿÿ‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ’ÿÿ”ÿÿ’ýûüÜýs€ê €ÿ™ÿ”ÿw‘ýÒ“ÿð“ÿÿ—ÿÿ–ÿÿ”ÿÿ“ÿÿ“ÿÿ’ÿÿ’ÿÿ’ÿÿ’ÿÿ’ÿÿ’ÿÿÿÿœÿÿP´ÿÿ7ªÿÿÿÿ’ÿÿ’ÿÿ’ÿÿ’ÿÿ“ÿÿ•ÿÿ–ÿÿ”ýûüç‘ýœ•ÿ0€ÿªÿ”ÿ˜ÿW“þµ”üè–ýô”ýþ™ÿÿ™ÿÿ˜ÿÿ—ÿÿ–ÿÿ–ÿÿ–ÿÿ•ÿÿ•ÿÿ•ÿÿ–ÿÿ–ÿÿ–ÿÿ—ÿÿ˜ÿÿ™ÿÿ˜ÿÿ”þÿ•ýó’úâ“ýš”ÿ7™ÿÿÿŽÿ šÿ&—ýi˜ü¯–üà˜ýï•ýõ•ýú–ýþ™ÿÿšÿÿ›ÿÿœÿÿ›ÿÿ™ÿÿ™ÿÿ˜ÿÿ—ýû•ý÷™ÿð—úâ—þ°–ÿd‘ÿªÿªÿ™æ ™ÿ›ÿ8™ÿi—ýŽšþ«—üÇ—ûØ—üá—üê•ýè˜ûÚ™ýΘþ¹™ý˜›ÿu˜ÿE›ÿ™ÿ €ÿ( @ ÿüdýŸüÁþþÿÿÿÿÿÿ¢¦ûíþº ýšüW ÿÿ,þ«úûýÿýÿuþÿÿÿÿÿÿÿÿÿ‰þÿýÿýÿýÿúüüÀüJÿÿý‡úûýÿýÿ>Pýÿ½Ãþÿÿÿÿÿÿÿÿÿúúÿÿ&:ýÿýÿýÿýÿýÿýÿýÿýÍüKÿ þºýÿýÿýÿbsþÿýýÿÿÿÿÿÿÿÿÿÿúûÿÿ\nþÿýÿýÿýÿýÿýÿýÿýÿýÿýÿý¦ ÿ+ÿþ»!ýÿ!ýÿ!ýÿŠ™þÿÿÿÿÿÿÿÿÿôöÿÿÈÏÿÿ0Jýÿ ýÿ ýÿ ýÿ ýÿ ýÿ ýÿ ýÿ ýÿ ýÿ ýÿ ýÿüÛÿ+%ý‹%ýÿ%ýÿ%ýÿp…þÿÿÿÿÿÿÿÿÿúûÿÿs‡þÿ(ýÿ%ýÿ%ýÿ%ýÿ%ýÿ%ýÿ%ýÿ%ýÿ%ýÿ%ýÿ%ýÿ%ýÿ$ýÿ$ýÿ$úí"ÿ5+ÿ0*úý*ýÿ*ýÿ>^ýÿüüÿÿÿÿÿÿõ÷ÿÿ@_ýÿ)ýÿ)ýÿ)ýÿ)ýÿ$Gýÿyþÿ¥³þÿ»Æþÿ¯¼þÿ¢þÿPlþÿ 1ýÿ)ýÿ)ýÿ)ýÿ)ýÿ)úð'ÿ..þ¶.þÿ.þÿ0þÿÌÕÿÿÿÿÿÿþþÿÿXvþÿ.þÿ.þÿ.þÿCþÿ²Àÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêîÿÿ{’þÿ3þÿ-þÿ-þÿ-þÿ*üÞ$ÿ3ÿ#3ûþ3þÿ3þÿXyþÿÿÿÿÿÿÿÿÿ¤¶ÿÿ2þÿ2þÿ2þÿ8_þÿìðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍ×ÿÿ#Nþÿ2þÿ2þÿ2þÿ2ýž7ÿt7þÿ7þÿ7þÿ·ÇÿÿÿÿÿÿúûÿÿOþÿ7þÿ7þÿOþÿèíÿÿÿÿÿÿÿÿÿÿÓÜÿÿ`‚þÿKþÿ6þÿ =þÿ;eþÿ§ÿÿóöÿÿÿÿÿÿÿÿÿÿàçÿÿJþÿ6þÿ6þÿ6þÿ7ÿO:þ³<þÿ;þÿIþÿúûÿÿÿÿÿÿ¸Èÿÿ;þÿ;þÿ;þÿ¯Âÿÿÿÿÿÿÿÿÿÿ¡·ÿÿ@þÿ;þÿ;þÿ;þÿ;þÿ;þÿ;þÿPþÿÀÏÿÿÿÿÿÿÿÿÿÿÎÙÿÿ@þÿ;þÿ:þÿ:üÛUÿ@üÞ@þÿ@þÿCrþÿÿÿÿÿÿÿÿÿjþÿ@þÿ@þÿ(^þÿýýÿÿÿÿÿÿÇÕÿÿCþÿ?þÿ?þÿ?þÿ?þÿ?þÿ?þÿ?þÿ?þÿ FþÿÅÓÿÿÿÿÿÿÿÿÿÿs–þÿ?þÿ?þÿ?þÿAÿSAûõDþÿDþÿgþÿÿÿÿÿÿÿÿÿAtþÿDþÿDþÿj’þÿÿÿÿÿÿÿÿÿM|þÿDþÿDþÿ7lþÿ­ÂþÿÑÝÿÿÂÒÿÿHyþÿDþÿDþÿDþÿTþÿðôÿÿÿÿÿÿîòÿÿNþÿCþÿCþÿDüÈIûøIþÿIþÿ|¡þÿÿÿÿÿÿÿÿÿ)fþÿIþÿIþÿ°ÿÿÿÿÿÿÿÿÿÿWþÿ Qþÿ¥¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆªÿÿHþÿHþÿHþÿxžþÿÿÿÿÿÿÿÿÿ\ŠþÿHþÿHþÿHþÿFÿ!MûçMþÿMþÿošþÿÿÿÿÿÿÿÿÿ6sþÿMþÿMþÿ‰­ÿÿÿÿÿÿÿÿÿÿ#eþÿÁÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþÿÿ8sþÿLþÿLþÿ^þÿýþÿÿÿÿÿÿªÃÿÿLþÿLþÿLþÿMÿcRýÓRþÿRþÿ\þÿÿÿÿÿÿÿÿÿYŽþÿQþÿQþÿh˜þÿÿÿÿÿÿÿÿÿËÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿþþÿÿÿÿÿÿœ»ÿÿQþÿQþÿQþÿÏÞÿÿÿÿÿÿÛæÿÿQþÿQþÿQþÿOý§Vþ®VþÿVþÿ"mþÿÿÿÿÿÿÿÿÿž¿ÿÿVþÿVþÿcþÿöùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³ÿÿãìÿÿÿÿÿÿÂÖÿÿUþÿUþÿUþÿ­ÈÿÿÿÿÿÿöùÿÿUþÿUþÿUþÿSýÏ\ÿl[þÿ[þÿZþÿÜèÿÿÿÿÿÿó÷ÿÿjþÿZþÿZþÿz©þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ’¹ÿÿ[þÿçïÿÿÿÿÿÿ»ÓÿÿZþÿZþÿZþÿŸÁÿÿÿÿÿÿþþÿÿ]þÿYþÿYþÿWúàaÿ*_þÿ_þÿ_þÿr§þÿÿÿÿÿÿÿÿÿžÂÿÿ_þÿ_þÿ_þÿ€¯þÿýþÿÿÿÿÿÿÿÿÿÿßëÿÿG‹þÿ^þÿ*yþÿÿÿÿÿÿÿÿÿ—½ÿÿ^þÿ^þÿ^þÿ²Îÿÿÿÿÿÿðöÿÿ^þÿ^þÿ^þÿ[ûòÿaýÔcþÿcþÿhþÿáíÿÿÿÿÿÿÿÿÿÿn¦þÿcþÿcþÿcþÿeþÿ({þÿlþÿcþÿcþÿdþÿ±ÏÿÿÿÿÿÿÿÿÿÿA‹þÿcþÿcþÿcþÿÛéÿÿÿÿÿÿÖæÿÿbþÿbþÿbþÿ_ûóiÿ_hþÿhþÿhþÿH“þÿüýÿÿÿÿÿÿÿÿÿÿ•Àÿÿqþÿhþÿgþÿgþÿgþÿgþÿ mþÿŸÆÿÿÿÿÿÿÿÿÿÿÌáÿÿhþÿgþÿgþÿ zþÿÿÿÿÿÿÿÿÿšÃÿÿgþÿgþÿgþÿgüÜfÿkúálþÿlþÿlþÿj©þÿþþÿÿÿÿÿÿÿÿÿÿíõÿÿ“ÁÿÿQ›þÿ8ŒþÿG•þÿ€¶þÿâîÿÿÿÿÿÿÿÿÿÿîõÿÿ#€þÿlþÿlþÿkþÿ‡¹ÿÿÿÿÿÿÿÿÿÿVþÿkþÿkþÿkþÿiþ³pÿ]qþÿqþÿqþÿqþÿNœþÿð÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàîÿÿ7þÿpþÿpþÿpþÿ~þÿñ÷ÿÿÿÿÿÿåðÿÿtþÿpþÿpþÿpþÿoÿwtþ­uþÿuþÿuþÿuþÿ€þÿŽÂÿÿñ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñ÷ÿÿ“Åÿÿ~þÿuþÿtþÿ yþÿÇàÿÿÉáÿÿÿÿÿÿÿÿÿÿs³þÿtþÿtþÿtþÿtûþvÿ'yÿ{ûçyþÿyþÿyþÿyþÿyþÿ|þÿ@›þÿl²þÿ€¼þÿq´þÿJ þÿ þÿyþÿyþÿyþÿyþÿŽÃþÿÿÿÿÿêôÿÿÿÿÿÿÌäÿÿ|þÿyþÿyþÿyþÿwþ¼}ÿ5~ûô~þÿ~þÿ~þÿ~þÿ~þÿ~þÿ~þÿ~þÿ~þÿ~þÿ}þÿ}þÿ}þÿ}þÿ"ŽþÿäñÿÿÿÿÿÿÿÿÿÿèóÿÿP¥þÿ}þÿ}þÿ}þÿ}þÿ{ÿ<ƒÿD‚üó‚ÿÿ‚ÿÿ‚ÿÿ‚ÿÿ‚ÿÿ‚ÿÿ‚ÿÿ‚ÿÿ‚ÿÿ‚ÿÿ‚ÿÿ‚ÿÿ‚ÿÿŸÐÿÿÿÿÿÿÿÿÿÿýþÿÿÑéÿÿsºÿÿ‚ÿÿ‚ÿÿÿÿý–‰ÿ6…üå‡ÿÿ‡ÿÿ‡ÿÿ‡ÿÿ‡ÿÿ†ÿÿ†ÿÿ†ÿÿ†ÿÿ†ÿÿ†ÿÿŠÿÿœÐÿÿÓêÿÿ¼ßÿÿi¸ÿÿˆÿÿ†ÿÿ†ÿÿ†ÿÿ‡üÇŽÿ ÿ‹þ»‹ÿÿ‹ÿÿ‹ÿÿ‹ÿÿ‹ÿÿ‹ÿÿ‹ÿÿ‹ÿÿ%œÿÿ‘ÍÿÿÊæÿÿ3¢ÿÿŽÿÿ‹ÿÿ‹ÿÿ‹ÿÿŠÿÿŠÿÿŠüÇŽÿÿÿ‘ÿaŽüÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹ÌÿÿÿÿÿÿÿÿÿÿÿÿŒüþý˜Žÿ €ÿ”ÿ_’ýÔ”ÿÿ”ÿÿ”ÿÿ”ÿÿ”ÿÿ”ÿÿ$£ÿÿ”ÿÿ“ÿÿ“ÿÿ“ÿÿ“þ½“ÿ;•ÿ$—ÿl˜þ°™ýÑ•üæ˜üû˜üé™ýÑ–þ²˜ÿwšÿ&(0 ÿù\ýš&2üÅùùýîÜÞûì$1üÉý¢ÿeÿ1ÿýiýÐÿÿ9Eÿÿ²¸ÿÿÿÿÿÿ¸¿ÿÿ ÿÿÿÿÿÿüðý ûBÿýÿÿÿÿl{ÿÿìïÿÿÿÿÿÿÚÞÿÿ;Oýÿýÿýÿþÿÿÿÿÿüîûÿÿ "ýŸÿÿ ÿÿƒ“þÿÿÿÿÿÿÿÿÿ¡®þÿ)Cýÿýÿýÿýÿýÿýÿýÿ!ÿÿ"ÿÿ þ¾ø&&ýk'üý ÿÿg~ýÿüüÿÿñóÿÿgþÿ#ýÿýÿ#ýÿ-MýÿTnýÿ[týÿGcýÿ<ýÿýÿ!ÿÿ'ÿÿ'ýÐ&ÿ(1ÿ+ûÙ'ÿÿ&Nþÿèìÿÿÿÿÿÿeþÿþÿ!þÿ5Xþÿ­»þÿéíÿÿÿÿÿÿÿÿÿÿþþÿÿÙàÿÿŽ¡þÿEþÿ$ÿÿ.ÿÿ*üÄÿ3ÿd4ÿÿ1ÿÿˆ þÿÿÿÿÿ£µÿÿ1þÿ&þÿMpþÿçìÿÿÿÿÿÿïóÿÿÇÒÿÿÀÌÿÿÒÜÿÿÿÿÿÿÿÿÿÿÓÜÿÿ@eþÿ*ÿÿ5ÿÿ1ýŒÿ8ý¨7ÿÿFþÿÝåÿÿøúÿÿ;gþÿ&þÿ(Xþÿâêÿÿÿÿÿÿ¤¹ÿÿ4\þÿ2þÿ)þÿ @þÿMsþÿ»Ëþÿÿÿÿÿáèÿÿ1^þÿ1ÿÿ8ýó8ÿD>ûÕ;ÿÿ8iþÿÿÿÿÿÈÖÿÿKþÿ2þÿŒ¨þÿÿÿÿÿ¯Ãÿÿ;þÿ,þÿCþÿ Gþÿ9þÿ,þÿFþÿ¬Àÿÿÿÿÿÿ·ÉÿÿEþÿ=ÿÿ>ú¨UÕBúê@ÿÿ[‡þÿÿÿÿÿ¢»ÿÿ>þÿOþÿÅÕÿÿþþÿÿ3jþÿ@þÿ^‰þÿ»ÍþÿÓßÿÿ…¦þÿSþÿ7þÿWþÿÙãÿÿÿÿÿÿOþÿ=ÿÿDüòCú5KùæFÿÿbþÿÿÿÿÿ›¸ÿÿ@þÿ]þÿ×âÿÿõ÷ÿÿ+iþÿš¸ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¢¾ÿÿJþÿ@þÿo™þÿÿÿÿÿžºÿÿKÿÿLÿÿIýpQýÔNÿÿP‡þÿÿÿÿÿ±ÊÿÿPþÿ WþÿÀÓþÿüýÿÿÁÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿó÷ÿÿ?|ÿÿ?þÿ3sþÿùûÿÿ×äÿÿ YþÿOÿÿPþ­Vþ±Uÿÿ#nþÿøúÿÿäíÿÿ"nþÿFþÿv¦þÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¦Äÿÿ¾Ôÿÿÿÿÿÿc—ÿÿDþÿ"mþÿâìÿÿôøÿÿbþÿTÿÿQýÑ]ýv_ÿÿ_ÿÿ¶Ñþÿÿÿÿÿ~­ÿÿQþÿdþÿ©Éþÿÿÿÿÿÿÿÿÿûüÿÿ”»þÿeþÿµÐÿÿÿÿÿÿU’ÿÿLþÿ"rþÿàëÿÿôøÿÿhþÿZÿÿYúâaû:büö^ÿÿGþÿÿÿÿÿôøÿÿO”þÿUþÿdþÿFŽþÿR•þÿ1þÿVþÿBŠþÿøûÿÿåïÿÿ!vþÿUþÿ0€þÿúüÿÿÛéÿÿ jþÿaÿÿ_úèqÿ fü¬mÿÿgþÿ½þÿÿÿÿÿñ÷ÿÿw®ÿÿvþÿbþÿ`þÿhþÿQ—þÿßìÿÿÿÿÿÿ‚µÿÿaþÿaþÿb¢þÿÿÿÿÿ¦ÊÿÿjþÿhÿÿgýÔnûHoýômÿÿtþÿ’Âþÿÿÿÿÿÿÿÿÿàîÿÿ«Ïÿÿ¡ÉÿÿÆßÿÿÿÿÿÿÿÿÿÿ¥Ìþÿ rþÿdþÿrþÿÇßÿÿÿÿÿÿ]£þÿhþÿqÿÿmý©ªÿrý“zÿÿqÿÿtþÿX¤þÿÇàÿÿüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿàîÿÿt´ÿÿ xþÿjþÿQžþÿ±ÓÿÿÿÿÿÿÏåÿÿþÿnÿÿyÿÿtýgózüÈ‚ÿÿwÿÿuþÿ ~þÿ3•þÿ^¬þÿe¯þÿFŸþÿ…þÿvþÿqþÿ‰þÿÙëþÿÿÿÿÿóùÿÿV§ÿÿrþÿÿÿwüÞxÿ ‚ù+ûÕˆÿÿ€ÿÿ}þÿ|þÿ{þÿ{þÿ|þÿ|þÿ|þÿ|ÿÿ„ÂÿÿÿÿÿÿÿÿÿÿÍæÿÿ'’þÿ}ÿÿ„ÿÿ~ýs…ÿ,‡üÄÿÿŠÿÿ†ÿÿ†ÿÿ…ÿÿ…ÿÿ…ÿÿ ‰ÿÿ“ÿÿ§ÖÿÿÑéÿÿ‘Ëÿÿ6ŸÿÿŽÿÿŒÿÿ„ý¨™ÿ ÿŠý™ýô•ÿÿŽÿÿŒÿÿ‹ÿÿŒÿÿ>¨ÿÿžÓÿÿ4£ÿÿ ÿÿ‹ÿÿŒÿÿŽÿÿŠý¦ŒÿüL’ý¨’üøšÿÿ—ÿÿ–ÿÿ”ÿÿ;°ÿÿ™ÿÿ“ÿÿ—ÿÿ”ýÙŽýsŽÿ ™ÿ”ÿ9™ÿq–þ²—ýÓ–üç•üä—ýΕý©™ÿf•ÿ$(  ÿÿÿ* ýmîïý“cmýƒüU#ÿÿÿÿ1ÿ üª üû‘šþÿþþþþ4Eüþüÿüîý• ÿÿ1ÿúá6ýÿßãýýô÷ýüG\üûûûûý ûþüÿ ûí'ûHUÿ'þ¶+ýÿÝâýøÆÒýþ#ýÿ!üþl„üþ§³ýþœªýýKiüú!üþ$üý0üPUÿAÿC$ýÿvýýöùýþ 3üþ DþÿåëþÿúûÿÿÁÎþÿÏÙýþÿÿÿÿÅÐýü;þÿ-üñ>ÿ%>ýˆ4ýÿ×àýü”ªýþ$ýÿÏÚþÿÉ×þÿ4ýÿ"ýÿ"ýÿ RýþáêþÿÄÒýú6ýÿ;ý¨Aý¨Jþÿ÷ùýüRýþTþÿÿÿÿÿ0aþÿIxþÿ¼Îþÿœ¸þÿ Býÿ UýþþþþþW‚þÿ7üöUÿ-Mý RþÿôøýüXˆýþ_þÿöøþÿ´Ëþÿÿÿÿÿûüþÿÿÿÿÿœ»þÿ5ýÿ¾Ïýþ°ÉýüAýÿ Tÿt\ÿtOýÿÈÚýü­ÈýþCýÿ»Òþÿÿÿÿÿÿÿÿÿ¶Ïþÿ¡ÂþÿÐàþÿBýÿ—·ýþÏßýüNýÿYý lÿ-XüöNþÿþþþþKŒýþWýÿWšþÿGþÿ\ýÿÔãþÿ¢ÆþÿIýÿ­Êýþ¿ÖýüVýÿdý¨mý¨dýÿ‰ºýúÿÿÿÿ¡Æýþ@ŽþÿN–þÿÔåþÿíõþÿuþÿdýÿïöýþy°ýü_ýÿoýˆuÿ%uýñmýÿQ¡ýüÕéþÿúýýþùýþÿ´Øþÿþÿ{þÿºÙýþêóýþ}üýqýÿvÿCUÿ|ÿP€ýývýþvýú ‚ýýýþtýþoýþ¬Ôþÿþþþþ¼ýøtþÿ€þ¶Uÿ‡ÿHˆþí‰ÿÿ…þþ…þý ŒþûN©þû–ÎýüZ²ýý‹ÿÿ…þá„ÿªÿŠÿý”ýî‘þÿýþ:ªýþ þÿ†þúþª“ÿÿÿ€ÿÿÿ—ÿ–ÿU—ÿ€ÿˆ™ÿl¤ÿ*ÿÿÿ././@LongLink0000000000000000000000000000015000000000000011211 Lustar 00000000000000reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/static/astropy_logo.svgreproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/static/astropy_logo.0000644000077000000240000001103212521647746034433 0ustar tomstaff00000000000000 ././@LongLink0000000000000000000000000000015300000000000011214 Lustar 00000000000000reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/static/astropy_logo_32.pngreproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/static/astropy_logo_0000644000077000000240000000353412361517711034512 0ustar tomstaff00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsÓÇòŽtEXtSoftwarewww.inkscape.org›î<ÙIDATX…Å—PT×Ç?÷ñc‘P° ˆ „FƒUBìȘ&Ådi”I# ±ÒÄJhC2æÇŒ5ÑÔtw:íÛª5ÑÒSÒÆª©é„Ú¡%¨ZÉF2Vk­JFŒ`ÁŠ(JdÙ÷öÝþqaß., É?½3gæ½sÏïýžûΞº®óÿ\Ñ_ÄÉ•ìÎ#šÅHŠl ø2pèZ€Ý8ØãéÔ¯KL”Wš;†AC°È‹h4¥z>ÕÀ$?ñôé—#¹hJ~‹»œ›´`;&y˜#D²ËÂß b0¨Â¤Åu‹»2RìqKàJr'âã7˜<6.´;`Îã2Ò‹@‹†Ž&°Ìa‹$`›+Æâ1ôWB]Ç, w.rÆM¶|»r€Þh?G6B—m"ù‘GêÕïKàƒ…“œ0º#Ñ&¢: WBÅaˆË°mL6¸pÏ€+àΔƒx¥Áti@D1Çä;«áz§ v³ú7zCýrׇóE9ÎÐäš ‹,“é_Gÿ±hbÞˆy•ˆ;¾Ñ Ðñ!,e÷ÙUÄ—¦AÚlˆO†„©ˆ€-^;V€¬…~ï;MçÅðKxUZùK%:Lü剜"¸ë9äžáT½rÝë†3WCúWaá8úè9ô³`p4XW·;KšxBjó«ËwÙÉ¥„Ö÷á“ýÐÚׇ.WêLDå_e5Êw`ÎDîzFíG;ßz9ì¾?@ÈghI^Ž ÄâUˆ¥›Ô³áƒÆMÈl…+çíãÇÄs%bñZˆK„»Ÿ‚Ão@ûÅ`ó!8¹ò—À¬o‚)Ô!ÔÊpu¹4W›;Uü0ˆ0×i'÷Ý@V— ë\Ð}>üÖßôÁž Èu Àôƒˆï¾ ¦übdëÇ‘‰Yáþ>rµ¡z—c0iØI,\1D‹‰ÜX §)‡Ìùׇˆ×üˆ__…Šm cáB3ì߬|f̃¹ÙI.œ²KŸ;ò“NÖ¤AqÐ!~*Üùr8Þg)ã¬BÄß…¬;!*â'#î©DÔôÁürdÓN;Ql’ à|(€Ùá Xôj®€[Ã`aPy÷ã* ÷ר—¦Ô¥h¹bâO½¶Î 9el¢­ïë 0HÆi¦a29HáReÜÝ 5*Ã@ä)}豄 ¢cU5ö»aÙIr mý0›Jú€nARÂPÊør‡j­&5â“+Þðçõ£AL:éµKðAƒÍ\îÿ´ž eà'_Œ໩âlg'ò›Èm/!7|ü¾p7z‘¯T@ß5å—0 KÕÞ¹Àg†öƒ ú@/fHN|ׯ@b bÁÃÈú8X‹lü,yf} ºÚ ®ú•ˆU; )U1·o»bSµ j€~Ú¦‚aS2!&A”8¼/‡‚û ¿Ž7ªhu¯Ž.@ùó0¿D=¿_oo nIøý/© Ió”è70è¦FÞ§¬&%ÀýÁ¶,Ô*}t â—ƒ{Ë#ÿ$'Ï@ütbÅËʾç?ÈuO„Ú j&Á¡DèºÎK î-T㎉E4| )épá,ò;·Ûí³ôˆµ¿…¨!ÊÎ7ÿ¼Èö3ˆiÙ0ý6X°“Ô¾¹ò8önðôB°ÚSjOEÑšÅNi 0ýÈÚ-ˆg<0c&”T@Ãe]· ùßKˆ» .²ó ;©Þzäæç¡³-Tû³™R[åt:iºÝy±è„·‹,, å4âÑçÝEBÛY8{Z5˜öðîFô÷A¬¦¤ƒÐK]àä?‘úÓð»upíjèLñ©,ñ<«÷…" ^?aReÁ ÀAO/¬YŽØü–±áHKCî}K7ÿÙ¼V='N†´ èhß@$.:4Á}žr½säFp"jÊw^ùÆqo?%Š…føä$¢äâþ2HÍ€÷€°O6àƒžËà75E)iנس\o™FÌ„ë*õj¬þ”î{YU†¬¢üI´¿…ܹ㠦!bò¦¦Qà©Ð[Ç¢&âX¾¶Æ])àWHTÿ]º í…ŸAÖ­Ê`Їu×W ëâXq;¤dÍúgõÚ± "20¼Ö¯Ð·k·að:µobÝ3¹u‹2pÄ!}rô¸nÒ,TjÝäN$9Là¿¡k“{rÀâAMP*a¦Öri.©išÜ[ï—ËÊÎ h“Ш™ì÷¼¨7O$éç0 Ë•Lg§$3ó3Çãÿ¼ G®ÿ.Á½8<ßÇIEND®B`‚././@LongLink0000000000000000000000000000015500000000000011216 Lustar 00000000000000reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/static/bootstrap-astropy.cssreproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/static/bootstrap-ast0000644000077000000240000002744312723540274034443 0ustar tomstaff00000000000000/*! * Bootstrap v1.4.0 * * Copyright 2011 Twitter, Inc * Licensed under the Apache License v2.0 * http://www.apache.org/licenses/LICENSE-2.0 * * Heavily modified by Kyle Barbary for the AstroPy Project for use with Sphinx. */ @import url("basic.css"); body { background-color: #ffffff; margin: 0; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px; font-weight: normal; line-height: 18px; color: #404040; } /* Hyperlinks ----------------------------------------------------------------*/ a { color: #0069d6; text-decoration: none; line-height: inherit; font-weight: inherit; } a:hover { color: #00438a; text-decoration: underline; } /* Typography ----------------------------------------------------------------*/ h1,h2,h3,h4,h5,h6 { color: #404040; margin: 0.7em 0 0 0; line-height: 1.5em; } h1 { font-size: 24px; margin: 0; } h2 { font-size: 21px; line-height: 1.2em; margin: 1em 0 0.5em 0; border-bottom: 1px solid #404040; } h3 { font-size: 18px; } h4 { font-size: 16px; } h5 { font-size: 14px; } h6 { font-size: 13px; text-transform: uppercase; } p { font-size: 13px; font-weight: normal; line-height: 18px; margin-top: 0px; margin-bottom: 9px; } ul, ol { margin-left: 0; padding: 0 0 0 25px; } ul ul, ul ol, ol ol, ol ul { margin-bottom: 0; } ul { list-style: disc; } ol { list-style: decimal; } li { line-height: 18px; color: #404040; } ul.unstyled { list-style: none; margin-left: 0; } dl { margin-bottom: 18px; } dl dt, dl dd { line-height: 18px; } dl dd { margin-left: 9px; } hr { margin: 20px 0 19px; border: 0; border-bottom: 1px solid #eee; } strong { font-style: inherit; font-weight: bold; } em { font-style: italic; font-weight: inherit; line-height: inherit; } .muted { color: #bfbfbf; } address { display: block; line-height: 18px; margin-bottom: 18px; } code, pre { padding: 0 3px 2px; font-family: monospace; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } tt { font-family: monospace; } code { padding: 1px 3px; } pre { display: block; padding: 8.5px; margin: 0 0 18px; line-height: 18px; border: 1px solid #ddd; border: 1px solid rgba(0, 0, 0, 0.12); -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; white-space: pre; word-wrap: break-word; } img { margin: 9px 0; } /* format inline code with a rounded box */ tt, code { margin: 0 2px; padding: 0 5px; border: 1px solid #ddd; border: 1px solid rgba(0, 0, 0, 0.12); border-radius: 3px; } code.xref, a code { margin: 0; padding: 0 1px 0 1px; background-color: none; border: none; } /* all code has same box background color, even in headers */ h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt, h1 code, h2 code, h3 code, h4 code, h5 code, h6 code, pre, code, tt { background-color: #f8f8f8; } /* override box for links & other sphinx-specifc stuff */ tt.xref, a tt, tt.descname, tt.descclassname { padding: 0 1px 0 1px; border: none; } /* override box for related bar at the top of the page */ .related tt { border: none; padding: 0 1px 0 1px; background-color: transparent; font-weight: bold; } th { background-color: #dddddd; } .viewcode-back { font-family: sans-serif; } div.viewcode-block:target { background-color: #f4debf; border-top: 1px solid #ac9; border-bottom: 1px solid #ac9; } table.docutils { border-spacing: 5px; border-collapse: separate; } /* Topbar --------------------------------------------------------------------*/ div.topbar { height: 40px; position: absolute; top: 0; left: 0; right: 0; z-index: 10000; padding: 0px 10px; background-color: #222; background-color: #222222; background-repeat: repeat-x; background-image: -khtml-gradient(linear, left top, left bottom, from(#333333), to(#222222)); background-image: -moz-linear-gradient(top, #333333, #222222); background-image: -ms-linear-gradient(top, #333333, #222222); background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #333333), color-stop(100%, #222222)); background-image: -webkit-linear-gradient(top, #333333, #222222); background-image: -o-linear-gradient(top, #333333, #222222); background-image: linear-gradient(top, #333333, #222222); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); overflow: auto; } div.topbar a.brand { font-family: 'Source Sans Pro', sans-serif; font-size: 26px; color: #ffffff; font-weight: 600; text-decoration: none; float: left; display: block; height: 32px; padding: 8px 12px 0px 45px; margin-left: -10px; background: transparent url("astropy_logo_32.png") no-repeat 10px 4px; background-image: url("astropy_logo.svg"), none; background-size: 32px 32px; } #logotext1 { } #logotext2 { font-weight:200; color: #ff5000; } #logotext3 { font-weight:200; } div.topbar .brand:hover, div.topbar ul li a.homelink:hover { background-color: #333; background-color: rgba(255, 255, 255, 0.05); } div.topbar ul { font-size: 110%; list-style: none; margin: 0; padding: 0 0 0 10px; float: right; color: #bfbfbf; text-align: center; text-decoration: none; height: 100%; } div.topbar ul li { float: left; display: inline; height: 30px; margin: 5px; padding: 0px; } div.topbar ul li a { color: #bfbfbf; text-decoration: none; padding: 5px; display: block; height: auto; text-align: center; vertical-align: middle; border-radius: 4px; } div.topbar ul li a:hover { color: #ffffff; text-decoration: none; } div.topbar ul li a.homelink { width: 112px; display: block; height: 20px; padding: 5px 0px; background: transparent url("astropy_linkout_20.png") no-repeat 10px 5px; background-image: url("astropy_linkout.svg"), none; background-size: 91px 20px; } div.topbar form { text-align: left; margin: 0 0 0 5px; position: relative; filter: alpha(opacity=100); -khtml-opacity: 1; -moz-opacity: 1; opacity: 1; } div.topbar input { background-color: #444; background-color: rgba(255, 255, 255, 0.3); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: normal; font-weight: 13px; line-height: 1; padding: 4px 9px; color: #ffffff; color: rgba(255, 255, 255, 0.75); border: 1px solid #111; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25); -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25); -webkit-transition: none; -moz-transition: none; -ms-transition: none; -o-transition: none; transition: none; } div.topbar input:-moz-placeholder { color: #e6e6e6; } div.topbar input::-webkit-input-placeholder { color: #e6e6e6; } div.topbar input:hover { background-color: #bfbfbf; background-color: rgba(255, 255, 255, 0.5); color: #ffffff; } div.topbar input:focus, div.topbar input.focused { outline: 0; background-color: #ffffff; color: #404040; text-shadow: 0 1px 0 #ffffff; border: 0; padding: 5px 10px; -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); } /* Relation bar (breadcrumbs, prev, next) ------------------------------------*/ div.related { height: 21px; width: auto; margin: 0 10px; position: absolute; top: 42px; clear: both; left: 0; right: 0; z-index: 10000; font-size: 100%; vertical-align: middle; background-color: #fff; border-bottom: 1px solid #bbb; } div.related ul { padding: 0; margin: 0; } /* Footer --------------------------------------------------------------------*/ footer { display: block; margin: 10px 10px 0px; padding: 10px 0 0 0; border-top: 1px solid #bbb; } .pull-right { float: right; width: 30em; text-align: right; } /* Sphinx sidebar ------------------------------------------------------------*/ div.sphinxsidebar { font-size: inherit; border-radius: 3px; background-color: #eee; border: 1px solid #bbb; word-wrap: break-word; /* overflow-wrap is the canonical name for word-wrap in the CSS3 text draft. We include it here mainly for future-proofing. */ overflow-wrap: break-word; } div.sphinxsidebarwrapper { padding: 0px 0px 0px 5px; } div.sphinxsidebar h3 { font-family: 'Trebuchet MS', sans-serif; font-size: 1.4em; font-weight: normal; margin: 5px 0px 0px 5px; padding: 0; line-height: 1.6em; } div.sphinxsidebar h4 { font-family: 'Trebuchet MS', sans-serif; font-size: 1.3em; font-weight: normal; margin: 5px 0 0 0; padding: 0; } div.sphinxsidebar p { } div.sphinxsidebar p.topless { margin: 5px 10px 10px 10px; } div.sphinxsidebar ul { margin: 0px 0px 0px 5px; padding: 0; } div.sphinxsidebar ul ul { margin-left: 15px; list-style-type: disc; } /* If showing the global TOC (toctree), color the current page differently */ div.sphinxsidebar a.current { color: #404040; } div.sphinxsidebar a.current:hover { color: #404040; } /* document, documentwrapper, body, bodywrapper ----------------------------- */ div.document { margin-top: 72px; margin-left: 10px; margin-right: 10px; } div.documentwrapper { float: left; width: 100%; } div.body { background-color: #ffffff; padding: 0 0 0px 20px; } div.bodywrapper { margin: 0 0 0 230px; max-width: 55em; } /* Header links ------------------------------------------------------------- */ a.headerlink { font-size: 0.8em; padding: 0 4px 0 4px; text-decoration: none; } a.headerlink:hover { background-color: #0069d6; color: white; text-docoration: none; } /* Admonitions and warnings ------------------------------------------------- */ /* Shared by admonitions and warnings */ div.admonition, div.warning { padding: 0px; border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px; } div.admonition p, div.warning p { margin: 0.5em 1em 0.5em 1em; padding: 0; } div.admonition pre, div.warning pre { margin: 0.4em 1em 0.4em 1em; } div.admonition p.admonition-title, div.warning p.admonition-title { margin: 0; padding: 0.1em 0 0.1em 0.5em; color: white; font-weight: bold; font-size: 1.1em; } div.admonition ul, div.admonition ol, div.warning ul, div.warning ol { margin: 0.1em 0.5em 0.5em 3em; padding: 0; } /* Admonitions only */ div.admonition { border: 1px solid #609060; background-color: #e9ffe9; } div.admonition p.admonition-title { background-color: #70A070; } /* Warnings only */ div.warning { border: 1px solid #900000; background-color: #ffe9e9; } div.warning p.admonition-title { background-color: #b04040; } /* Figures ------------------------------------------------------------------ */ .figure.align-center { clear: none; } /* This is a div for containing multiple figures side-by-side, for use with * .. container:: figures */ div.figures { border: 1px solid #CCCCCC; background-color: #F8F8F8; margin: 1em; text-align: center; } div.figures .figure { clear: none; float: none; display: inline-block; border: none; margin-left: 0.5em; margin-right: 0.5em; } .field-list th { white-space: nowrap; } table.field-list { border-spacing: 0px; margin-left: 1px; border-left: 5px solid rgb(238, 238, 238) !important; } table.field-list th.field-name { display: inline-block; padding: 1px 8px 1px 5px; white-space: nowrap; background-color: rgb(238, 238, 238); border-radius: 0 3px 3px 0; -webkit-border-radius: 0 3px 3px 0; } reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/static/copybutton.js0000644000077000000240000000467713173066253034466 0ustar tomstaff00000000000000$(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', 'border-radius': '0 3px 0 0' } // 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); }); }); reproject-0.3.2/astropy_helpers/astropy_helpers/sphinx/themes/bootstrap-astropy/static/sidebar.js0000644000077000000240000001155312361517711033656 0ustar tomstaff00000000000000/* * sidebar.js * ~~~~~~~~~~ * * This script makes the Sphinx sidebar collapsible. * * .sphinxsidebar contains .sphinxsidebarwrapper. This script adds * in .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton * used to collapse and expand the sidebar. * * When the sidebar is collapsed the .sphinxsidebarwrapper is hidden * and the width of the sidebar and the margin-left of the document * are decreased. When the sidebar is expanded the opposite happens. * This script saves a per-browser/per-session cookie used to * remember the position of the sidebar among the pages. * Once the browser is closed the cookie is deleted and the position * reset to the default (expanded). * * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ $(function() { // global elements used by the functions. // the 'sidebarbutton' element is defined as global after its // creation, in the add_sidebar_button function var bodywrapper = $('.bodywrapper'); var sidebar = $('.sphinxsidebar'); var sidebarwrapper = $('.sphinxsidebarwrapper'); // for some reason, the document has no sidebar; do not run into errors if (!sidebar.length) return; // original margin-left of the bodywrapper and width of the sidebar // with the sidebar expanded var bw_margin_expanded = bodywrapper.css('margin-left'); var ssb_width_expanded = sidebar.width(); // margin-left of the bodywrapper and width of the sidebar // with the sidebar collapsed var bw_margin_collapsed = 12; var ssb_width_collapsed = 12; // custom colors var dark_color = '#404040'; var light_color = '#505050'; function sidebar_is_collapsed() { return sidebarwrapper.is(':not(:visible)'); } function toggle_sidebar() { if (sidebar_is_collapsed()) expand_sidebar(); else collapse_sidebar(); } function collapse_sidebar() { sidebarwrapper.hide(); sidebar.css('width', ssb_width_collapsed); bodywrapper.css('margin-left', bw_margin_collapsed); sidebarbutton.css({ 'margin-left': '-1px', 'height': bodywrapper.height(), 'border-radius': '3px' }); sidebarbutton.find('span').text('»'); sidebarbutton.attr('title', _('Expand sidebar')); document.cookie = 'sidebar=collapsed'; } function expand_sidebar() { bodywrapper.css('margin-left', bw_margin_expanded); sidebar.css('width', ssb_width_expanded); sidebarwrapper.show(); sidebarbutton.css({ 'margin-left': ssb_width_expanded - 12, 'height': bodywrapper.height(), 'border-radius': '0px 3px 3px 0px' }); sidebarbutton.find('span').text('«'); sidebarbutton.attr('title', _('Collapse sidebar')); document.cookie = 'sidebar=expanded'; } function add_sidebar_button() { sidebarwrapper.css({ 'float': 'left', 'margin-right': '0', 'width': ssb_width_expanded - 18 }); // create the button sidebar.append('
«
'); var sidebarbutton = $('#sidebarbutton'); // find the height of the viewport to center the '<<' in the page var viewport_height; if (window.innerHeight) viewport_height = window.innerHeight; else viewport_height = $(window).height(); var sidebar_offset = sidebar.offset().top; var sidebar_height = Math.max(bodywrapper.height(), sidebar.height()); sidebarbutton.find('span').css({ 'font-family': '"Lucida Grande",Arial,sans-serif', 'display': 'block', 'top': Math.min(viewport_height/2, sidebar_height/2 + sidebar_offset) - 10, 'width': 12, 'position': 'fixed', 'text-align': 'center' }); sidebarbutton.click(toggle_sidebar); sidebarbutton.attr('title', _('Collapse sidebar')); sidebarbutton.css({ 'color': '#FFFFFF', 'background-color': light_color, 'border': '1px solid ' + light_color, 'border-radius': '0px 3px 3px 0px', 'font-size': '1.2em', 'cursor': 'pointer', 'height': sidebar_height, 'padding-top': '1px', 'margin': '-1px', 'margin-left': ssb_width_expanded - 12 }); sidebarbutton.hover( function () { $(this).css('background-color', dark_color); }, function () { $(this).css('background-color', light_color); } ); } function set_position_from_cookie() { if (!document.cookie) return; var items = document.cookie.split(';'); for(var k=0; k= (3, 3): from importlib import invalidate_caches else: invalidate_caches = lambda: None # Python 2/3 compatibility if sys.version_info[0] < 3: string_types = (str, unicode) else: string_types = (str,) # Note: The following Warning subclasses are simply copies of the Warnings in # Astropy of the same names. class AstropyWarning(Warning): """ The base warning class from which all Astropy warnings should inherit. Any warning inheriting from this class is handled by the Astropy logger. """ class AstropyDeprecationWarning(AstropyWarning): """ A warning class to indicate a deprecated feature. """ class AstropyPendingDeprecationWarning(PendingDeprecationWarning, AstropyWarning): """ A warning class to indicate a soon-to-be deprecated feature. """ def _get_platlib_dir(cmd): """ Given a build command, return the name of the appropriate platform-specific build subdirectory directory (e.g. build/lib.linux-x86_64-2.7) """ plat_specifier = '.{0}-{1}'.format(cmd.plat_name, sys.version[0:3]) return os.path.join(cmd.build_base, 'lib' + plat_specifier) def get_numpy_include_path(): """ Gets the path to the numpy headers. """ # We need to go through this nonsense in case setuptools # downloaded and installed Numpy for us as part of the build or # install, since Numpy may still think it's in "setup mode", when # in fact we're ready to use it to build astropy now. if sys.version_info[0] >= 3: import builtins if hasattr(builtins, '__NUMPY_SETUP__'): del builtins.__NUMPY_SETUP__ import imp import numpy imp.reload(numpy) else: import __builtin__ if hasattr(__builtin__, '__NUMPY_SETUP__'): del __builtin__.__NUMPY_SETUP__ import numpy reload(numpy) try: numpy_include = numpy.get_include() except AttributeError: numpy_include = numpy.get_numpy_include() return numpy_include class _DummyFile(object): """A noop writeable object.""" errors = '' # Required for Python 3.x def write(self, s): pass def flush(self): pass @contextlib.contextmanager def silence(): """A context manager that silences sys.stdout and sys.stderr.""" old_stdout = sys.stdout old_stderr = sys.stderr sys.stdout = _DummyFile() sys.stderr = _DummyFile() exception_occurred = False try: yield except: exception_occurred = True # Go ahead and clean up so that exception handling can work normally sys.stdout = old_stdout sys.stderr = old_stderr raise if not exception_occurred: sys.stdout = old_stdout sys.stderr = old_stderr if sys.platform == 'win32': import ctypes def _has_hidden_attribute(filepath): """ Returns True if the given filepath has the hidden attribute on MS-Windows. Based on a post here: http://stackoverflow.com/questions/284115/cross-platform-hidden-file-detection """ if isinstance(filepath, bytes): filepath = filepath.decode(sys.getfilesystemencoding()) try: attrs = ctypes.windll.kernel32.GetFileAttributesW(filepath) assert attrs != -1 result = bool(attrs & 2) except (AttributeError, AssertionError): result = False return result else: def _has_hidden_attribute(filepath): return False def is_path_hidden(filepath): """ Determines if a given file or directory is hidden. Parameters ---------- filepath : str The path to a file or directory Returns ------- hidden : bool Returns `True` if the file is hidden """ name = os.path.basename(os.path.abspath(filepath)) if isinstance(name, bytes): is_dotted = name.startswith(b'.') else: is_dotted = name.startswith('.') return is_dotted or _has_hidden_attribute(filepath) def walk_skip_hidden(top, onerror=None, followlinks=False): """ A wrapper for `os.walk` that skips hidden files and directories. This function does not have the parameter `topdown` from `os.walk`: the directories must always be recursed top-down when using this function. See also -------- os.walk : For a description of the parameters """ for root, dirs, files in os.walk( top, topdown=True, onerror=onerror, followlinks=followlinks): # These lists must be updated in-place so os.walk will skip # hidden directories dirs[:] = [d for d in dirs if not is_path_hidden(d)] files[:] = [f for f in files if not is_path_hidden(f)] yield root, dirs, files def write_if_different(filename, data): """Write `data` to `filename`, if the content of the file is different. Parameters ---------- filename : str The file name to be written to. data : bytes The data to be written to `filename`. """ assert isinstance(data, bytes) if os.path.exists(filename): with open(filename, 'rb') as fd: original_data = fd.read() else: original_data = None if original_data != data: with open(filename, 'wb') as fd: fd.write(data) def import_file(filename, name=None): """ Imports a module from a single file as if it doesn't belong to a particular package. The returned module will have the optional ``name`` if given, or else a name generated from the filename. """ # Specifying a traditional dot-separated fully qualified name here # results in a number of "Parent module 'astropy' not found while # handling absolute import" warnings. Using the same name, the # namespaces of the modules get merged together. So, this # generates an underscore-separated name which is more likely to # be unique, and it doesn't really matter because the name isn't # used directly here anyway. mode = 'U' if sys.version_info[0] < 3 else 'r' if name is None: basename = os.path.splitext(filename)[0] name = '_'.join(os.path.relpath(basename).split(os.sep)[1:]) if import_machinery: loader = import_machinery.SourceFileLoader(name, filename) mod = loader.load_module() else: with open(filename, mode) as fd: mod = imp.load_module(name, fd, filename, ('.py', mode, 1)) return mod def resolve_name(name): """Resolve a name like ``module.object`` to an object and return it. Raise `ImportError` if the module or name is not found. """ parts = name.split('.') cursor = len(parts) - 1 module_name = parts[:cursor] attr_name = parts[-1] while cursor > 0: try: ret = __import__('.'.join(module_name), fromlist=[attr_name]) break except ImportError: if cursor == 0: raise cursor -= 1 module_name = parts[:cursor] attr_name = parts[cursor] ret = '' for part in parts[cursor:]: try: ret = getattr(ret, part) except AttributeError: raise ImportError(name) return ret if sys.version_info[0] >= 3: def iteritems(dictionary): return dictionary.items() else: def iteritems(dictionary): return dictionary.iteritems() def extends_doc(extended_func): """ A function decorator for use when wrapping an existing function but adding additional functionality. This copies the docstring from the original function, and appends to it (along with a newline) the docstring of the wrapper function. Example ------- >>> def foo(): ... '''Hello.''' ... >>> @extends_doc(foo) ... def bar(): ... '''Goodbye.''' ... >>> print(bar.__doc__) Hello. Goodbye. """ def decorator(func): if not (extended_func.__doc__ is None or func.__doc__ is None): func.__doc__ = '\n\n'.join([extended_func.__doc__.rstrip('\n'), func.__doc__.lstrip('\n')]) return func return decorator # Duplicated from astropy.utils.decorators.deprecated # When fixing issues in this function fix them in astropy first, then # port the fixes over to astropy-helpers def deprecated(since, message='', name='', alternative='', pending=False, obj_type=None): """ Used to mark a function or class as deprecated. To mark an attribute as deprecated, use `deprecated_attribute`. Parameters ------------ since : str The release at which this API became deprecated. This is required. message : str, optional Override the default deprecation message. The format specifier ``func`` may be used for the name of the function, and ``alternative`` may be used in the deprecation message to insert the name of an alternative to the deprecated function. ``obj_type`` may be used to insert a friendly name for the type of object being deprecated. name : str, optional The name of the deprecated function or class; if not provided the name is automatically determined from the passed in function or class, though this is useful in the case of renamed functions, where the new function is just assigned to the name of the deprecated function. For example:: def new_function(): ... oldFunction = new_function alternative : str, optional An alternative function or class name that the user may use in place of the deprecated object. The deprecation warning will tell the user about this alternative if provided. pending : bool, optional If True, uses a AstropyPendingDeprecationWarning instead of a AstropyDeprecationWarning. obj_type : str, optional The type of this object, if the automatically determined one needs to be overridden. """ method_types = (classmethod, staticmethod, types.MethodType) def deprecate_doc(old_doc, message): """ Returns a given docstring with a deprecation message prepended to it. """ if not old_doc: old_doc = '' old_doc = textwrap.dedent(old_doc).strip('\n') new_doc = (('\n.. deprecated:: %(since)s' '\n %(message)s\n\n' % {'since': since, 'message': message.strip()}) + old_doc) if not old_doc: # This is to prevent a spurious 'unexpected unindent' warning from # docutils when the original docstring was blank. new_doc += r'\ ' return new_doc def get_function(func): """ Given a function or classmethod (or other function wrapper type), get the function object. """ if isinstance(func, method_types): try: func = func.__func__ except AttributeError: # classmethods in Python2.6 and below lack the __func__ # attribute so we need to hack around to get it method = func.__get__(None, object) if isinstance(method, types.FunctionType): # For staticmethods anyways the wrapped object is just a # plain function (not a bound method or anything like that) func = method elif hasattr(method, '__func__'): func = method.__func__ elif hasattr(method, 'im_func'): func = method.im_func else: # Nothing we can do really... just return the original # classmethod, etc. return func return func def deprecate_function(func, message): """ Returns a wrapped function that displays an ``AstropyDeprecationWarning`` when it is called. """ if isinstance(func, method_types): func_wrapper = type(func) else: func_wrapper = lambda f: f func = get_function(func) def deprecated_func(*args, **kwargs): if pending: category = AstropyPendingDeprecationWarning else: category = AstropyDeprecationWarning warnings.warn(message, category, stacklevel=2) return func(*args, **kwargs) # If this is an extension function, we can't call # functools.wraps on it, but we normally don't care. # This crazy way to get the type of a wrapper descriptor is # straight out of the Python 3.3 inspect module docs. if type(func) != type(str.__dict__['__add__']): deprecated_func = functools.wraps(func)(deprecated_func) deprecated_func.__doc__ = deprecate_doc( deprecated_func.__doc__, message) return func_wrapper(deprecated_func) def deprecate_class(cls, message): """ Returns a wrapper class with the docstrings updated and an __init__ function that will raise an ``AstropyDeprectationWarning`` warning when called. """ # Creates a new class with the same name and bases as the # original class, but updates the dictionary with a new # docstring and a wrapped __init__ method. __module__ needs # to be manually copied over, since otherwise it will be set # to *this* module (astropy.utils.misc). # This approach seems to make Sphinx happy (the new class # looks enough like the original class), and works with # extension classes (which functools.wraps does not, since # it tries to modify the original class). # We need to add a custom pickler or you'll get # Can't pickle : it's not found as ... # errors. Picklability is required for any class that is # documented by Sphinx. members = cls.__dict__.copy() members.update({ '__doc__': deprecate_doc(cls.__doc__, message), '__init__': deprecate_function(get_function(cls.__init__), message), }) return type(cls.__name__, cls.__bases__, members) def deprecate(obj, message=message, name=name, alternative=alternative, pending=pending): if obj_type is None: if isinstance(obj, type): obj_type_name = 'class' elif inspect.isfunction(obj): obj_type_name = 'function' elif inspect.ismethod(obj) or isinstance(obj, method_types): obj_type_name = 'method' else: obj_type_name = 'object' else: obj_type_name = obj_type if not name: name = get_function(obj).__name__ altmessage = '' if not message or type(message) == type(deprecate): if pending: message = ('The %(func)s %(obj_type)s will be deprecated in a ' 'future version.') else: message = ('The %(func)s %(obj_type)s is deprecated and may ' 'be removed in a future version.') if alternative: altmessage = '\n Use %s instead.' % alternative message = ((message % { 'func': name, 'name': name, 'alternative': alternative, 'obj_type': obj_type_name}) + altmessage) if isinstance(obj, type): return deprecate_class(obj, message) else: return deprecate_function(obj, message) if type(message) == type(deprecate): return deprecate(message) return deprecate def deprecated_attribute(name, since, message=None, alternative=None, pending=False): """ Used to mark a public attribute as deprecated. This creates a property that will warn when the given attribute name is accessed. To prevent the warning (i.e. for internal code), use the private name for the attribute by prepending an underscore (i.e. ``self._name``). Parameters ---------- name : str The name of the deprecated attribute. since : str The release at which this API became deprecated. This is required. message : str, optional Override the default deprecation message. The format specifier ``name`` may be used for the name of the attribute, and ``alternative`` may be used in the deprecation message to insert the name of an alternative to the deprecated function. alternative : str, optional An alternative attribute that the user may use in place of the deprecated attribute. The deprecation warning will tell the user about this alternative if provided. pending : bool, optional If True, uses a AstropyPendingDeprecationWarning instead of a AstropyDeprecationWarning. Examples -------- :: class MyClass: # Mark the old_name as deprecated old_name = misc.deprecated_attribute('old_name', '0.1') def method(self): self._old_name = 42 """ private_name = '_' + name @deprecated(since, name=name, obj_type='attribute') def get(self): return getattr(self, private_name) @deprecated(since, name=name, obj_type='attribute') def set(self, val): setattr(self, private_name, val) @deprecated(since, name=name, obj_type='attribute') def delete(self): delattr(self, private_name) return property(get, set, delete) def minversion(module, version, inclusive=True, version_path='__version__'): """ Returns `True` if the specified Python module satisfies a minimum version requirement, and `False` if not. By default this uses `pkg_resources.parse_version` to do the version comparison if available. Otherwise it falls back on `distutils.version.LooseVersion`. Parameters ---------- module : module or `str` An imported module of which to check the version, or the name of that module (in which case an import of that module is attempted-- if this fails `False` is returned). version : `str` The version as a string that this module must have at a minimum (e.g. ``'0.12'``). inclusive : `bool` The specified version meets the requirement inclusively (i.e. ``>=``) as opposed to strictly greater than (default: `True`). version_path : `str` A dotted attribute path to follow in the module for the version. Defaults to just ``'__version__'``, which should work for most Python modules. Examples -------- >>> import astropy >>> minversion(astropy, '0.4.4') True """ if isinstance(module, types.ModuleType): module_name = module.__name__ elif isinstance(module, string_types): module_name = module try: module = resolve_name(module_name) except ImportError: return False else: raise ValueError('module argument must be an actual imported ' 'module, or the import name of the module; ' 'got {0!r}'.format(module)) if '.' not in version_path: have_version = getattr(module, version_path) else: have_version = resolve_name('.'.join([module.__name__, version_path])) try: from pkg_resources import parse_version except ImportError: from distutils.version import LooseVersion as parse_version if inclusive: return parse_version(have_version) >= parse_version(version) else: return parse_version(have_version) > parse_version(version) # Copy of the classproperty decorator from astropy.utils.decorators class classproperty(property): """ Similar to `property`, but allows class-level properties. That is, a property whose getter is like a `classmethod`. The wrapped method may explicitly use the `classmethod` decorator (which must become before this decorator), or the `classmethod` may be omitted (it is implicit through use of this decorator). .. note:: classproperty only works for *read-only* properties. It does not currently allow writeable/deleteable properties, due to subtleties of how Python descriptors work. In order to implement such properties on a class a metaclass for that class must be implemented. Parameters ---------- fget : callable The function that computes the value of this property (in particular, the function when this is used as a decorator) a la `property`. doc : str, optional The docstring for the property--by default inherited from the getter function. lazy : bool, optional If True, caches the value returned by the first call to the getter function, so that it is only called once (used for lazy evaluation of an attribute). This is analogous to `lazyproperty`. The ``lazy`` argument can also be used when `classproperty` is used as a decorator (see the third example below). When used in the decorator syntax this *must* be passed in as a keyword argument. Examples -------- :: >>> class Foo(object): ... _bar_internal = 1 ... @classproperty ... def bar(cls): ... return cls._bar_internal + 1 ... >>> Foo.bar 2 >>> foo_instance = Foo() >>> foo_instance.bar 2 >>> foo_instance._bar_internal = 2 >>> foo_instance.bar # Ignores instance attributes 2 As previously noted, a `classproperty` is limited to implementing read-only attributes:: >>> class Foo(object): ... _bar_internal = 1 ... @classproperty ... def bar(cls): ... return cls._bar_internal ... @bar.setter ... def bar(cls, value): ... cls._bar_internal = value ... Traceback (most recent call last): ... NotImplementedError: classproperty can only be read-only; use a metaclass to implement modifiable class-level properties When the ``lazy`` option is used, the getter is only called once:: >>> class Foo(object): ... @classproperty(lazy=True) ... def bar(cls): ... print("Performing complicated calculation") ... return 1 ... >>> Foo.bar Performing complicated calculation 1 >>> Foo.bar 1 If a subclass inherits a lazy `classproperty` the property is still re-evaluated for the subclass:: >>> class FooSub(Foo): ... pass ... >>> FooSub.bar Performing complicated calculation 1 >>> FooSub.bar 1 """ def __new__(cls, fget=None, doc=None, lazy=False): if fget is None: # Being used as a decorator--return a wrapper that implements # decorator syntax def wrapper(func): return cls(func, lazy=lazy) return wrapper return super(classproperty, cls).__new__(cls) def __init__(self, fget, doc=None, lazy=False): self._lazy = lazy if lazy: self._cache = {} fget = self._wrap_fget(fget) super(classproperty, self).__init__(fget=fget, doc=doc) # There is a buglet in Python where self.__doc__ doesn't # get set properly on instances of property subclasses if # the doc argument was used rather than taking the docstring # from fget if doc is not None: self.__doc__ = doc def __get__(self, obj, objtype=None): if self._lazy and objtype in self._cache: return self._cache[objtype] if objtype is not None: # The base property.__get__ will just return self here; # instead we pass objtype through to the original wrapped # function (which takes the class as its sole argument) val = self.fget.__wrapped__(objtype) else: val = super(classproperty, self).__get__(obj, objtype=objtype) if self._lazy: if objtype is None: objtype = obj.__class__ self._cache[objtype] = val return val def getter(self, fget): return super(classproperty, self).getter(self._wrap_fget(fget)) def setter(self, fset): raise NotImplementedError( "classproperty can only be read-only; use a metaclass to " "implement modifiable class-level properties") def deleter(self, fdel): raise NotImplementedError( "classproperty can only be read-only; use a metaclass to " "implement modifiable class-level properties") @staticmethod def _wrap_fget(orig_fget): if isinstance(orig_fget, classmethod): orig_fget = orig_fget.__func__ # Using stock functools.wraps instead of the fancier version # found later in this module, which is overkill for this purpose @functools.wraps(orig_fget) def fget(obj): return orig_fget(obj.__class__) # Set the __wrapped__ attribute manually for support on Python 2 fget.__wrapped__ = orig_fget return fget def find_data_files(package, pattern): """ Include files matching ``pattern`` inside ``package``. Parameters ---------- package : str The package inside which to look for data files pattern : str Pattern (glob-style) to match for the data files (e.g. ``*.dat``). This supports the Python 3.5 ``**``recursive syntax. For example, ``**/*.fits`` matches all files ending with ``.fits`` recursively. Only one instance of ``**`` can be included in the pattern. """ if sys.version_info[:2] >= (3, 5): return glob.glob(os.path.join(package, pattern), recursive=True) else: if '**' in pattern: start, end = pattern.split('**') if end.startswith(('/', os.sep)): end = end[1:] matches = glob.glob(os.path.join(package, start, end)) for root, dirs, files in os.walk(os.path.join(package, start)): for dirname in dirs: matches += glob.glob(os.path.join(root, dirname, end)) return matches else: return glob.glob(os.path.join(package, pattern)) reproject-0.3.2/astropy_helpers/astropy_helpers/version.py0000644000077000000240000000702612361522227024143 0ustar tomstaff00000000000000# Autogenerated by Astropy-affiliated package astropy_helpers's setup.py on 2014-07-16 18:13:11.197794 import os import subprocess import warnings def update_git_devstr(version, path=None): """ Updates the git revision string if and only if the path is being imported directly from a git working copy. This ensures that the revision number in the version string is accurate. """ try: # Quick way to determine if we're in git or not - returns '' if not devstr = get_git_devstr(sha=True, show_warning=False, path=path) except OSError: return version if not devstr: # Probably not in git so just pass silently return version if 'dev' in version: # update to the current git revision version_base = version.split('.dev', 1)[0] devstr = get_git_devstr(sha=False, show_warning=False, path=path) return version_base + '.dev' + devstr else: #otherwise it's already the true/release version return version def get_git_devstr(sha=False, show_warning=True, path=None): """ Determines the number of revisions in this repository. Parameters ---------- sha : bool If True, the full SHA1 hash will be returned. Otherwise, the total count of commits in the repository will be used as a "revision number". show_warning : bool If True, issue a warning if git returns an error code, otherwise errors pass silently. path : str or None If a string, specifies the directory to look in to find the git repository. If `None`, the current working directory is used. If given a filename it uses the directory containing that file. Returns ------- devversion : str Either a string with the revsion number (if `sha` is False), the SHA1 hash of the current commit (if `sha` is True), or an empty string if git version info could not be identified. """ if path is None: path = os.getcwd() if not os.path.isdir(path): path = os.path.abspath(os.path.dirname(path)) if not os.path.exists(os.path.join(path, '.git')): return '' if sha: cmd = ['rev-parse'] # Faster for getting just the hash of HEAD else: cmd = ['rev-list', '--count'] try: p = subprocess.Popen(['git'] + cmd + ['HEAD'], cwd=path, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) stdout, stderr = p.communicate() except OSError as e: if show_warning: warnings.warn('Error running git: ' + str(e)) return '' if p.returncode == 128: if show_warning: warnings.warn('No git repository present at {0!r}! Using default ' 'dev version.'.format(path)) return '' elif p.returncode != 0: if show_warning: warnings.warn('Git failed while determining revision ' 'count: ' + stderr) return '' if sha: return stdout.decode('utf-8')[:40] else: return stdout.decode('utf-8').strip() _last_generated_version = '0.4' version = update_git_devstr(_last_generated_version) githash = get_git_devstr(sha=True, show_warning=False) major = 0 minor = 4 bugfix = 0 release = True debug = False try: from ._compiler import compiler except ImportError: compiler = "unknown" try: from .cython_version import cython_version except ImportError: cython_version = "unknown" reproject-0.3.2/astropy_helpers/astropy_helpers/version_helpers.py0000644000077000000240000002264713173066253025677 0ustar tomstaff00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ Utilities for generating the version string for Astropy (or an affiliated package) and the version.py module, which contains version info for the package. Within the generated astropy.version module, the `major`, `minor`, and `bugfix` variables hold the respective parts of the version number (bugfix is '0' if absent). The `release` variable is True if this is a release, and False if this is a development version of astropy. For the actual version string, use:: from astropy.version import version or:: from astropy import __version__ """ from __future__ import division import datetime import imp import os import pkgutil import sys from distutils import log import pkg_resources from . import git_helpers from .distutils_helpers import is_distutils_display_option from .utils import invalidate_caches PY3 = sys.version_info[0] == 3 def _version_split(version): """ Split a version string into major, minor, and bugfix numbers. If any of those numbers are missing the default is zero. Any pre/post release modifiers are ignored. Examples ======== >>> _version_split('1.2.3') (1, 2, 3) >>> _version_split('1.2') (1, 2, 0) >>> _version_split('1.2rc1') (1, 2, 0) >>> _version_split('1') (1, 0, 0) >>> _version_split('') (0, 0, 0) """ parsed_version = pkg_resources.parse_version(version) if hasattr(parsed_version, 'base_version'): # New version parsing for setuptools >= 8.0 if parsed_version.base_version: parts = [int(part) for part in parsed_version.base_version.split('.')] else: parts = [] else: parts = [] for part in parsed_version: if part.startswith('*'): # Ignore any .dev, a, b, rc, etc. break parts.append(int(part)) if len(parts) < 3: parts += [0] * (3 - len(parts)) # In principle a version could have more parts (like 1.2.3.4) but we only # support .. return tuple(parts[:3]) # This is used by setup.py to create a new version.py - see that file for # details. Note that the imports have to be absolute, since this is also used # by affiliated packages. _FROZEN_VERSION_PY_TEMPLATE = """ # Autogenerated by {packagetitle}'s setup.py on {timestamp!s} from __future__ import unicode_literals import datetime {header} major = {major} minor = {minor} bugfix = {bugfix} release = {rel} timestamp = {timestamp!r} debug = {debug} try: from ._compiler import compiler except ImportError: compiler = "unknown" try: from .cython_version import cython_version except ImportError: cython_version = "unknown" """[1:] _FROZEN_VERSION_PY_WITH_GIT_HEADER = """ {git_helpers} _packagename = "{packagename}" _last_generated_version = "{verstr}" _last_githash = "{githash}" # Determine where the source code for this module # lives. If __file__ is not a filesystem path then # it is assumed not to live in a git repo at all. if _get_repo_path(__file__, levels=len(_packagename.split('.'))): version = update_git_devstr(_last_generated_version, path=__file__) githash = get_git_devstr(sha=True, show_warning=False, path=__file__) or _last_githash else: # The file does not appear to live in a git repo so don't bother # invoking git version = _last_generated_version githash = _last_githash """[1:] _FROZEN_VERSION_PY_STATIC_HEADER = """ version = "{verstr}" githash = "{githash}" """[1:] def _get_version_py_str(packagename, version, githash, release, debug, uses_git=True): timestamp = datetime.datetime.now() major, minor, bugfix = _version_split(version) if packagename.lower() == 'astropy': packagetitle = 'Astropy' else: packagetitle = 'Astropy-affiliated package ' + packagename header = '' if uses_git: header = _generate_git_header(packagename, version, githash) elif not githash: # _generate_git_header will already generate a new git has for us, but # for creating a new version.py for a release (even if uses_git=False) # we still need to get the githash to include in the version.py # See https://github.com/astropy/astropy-helpers/issues/141 githash = git_helpers.get_git_devstr(sha=True, show_warning=True) if not header: # If _generate_git_header fails it returns an empty string header = _FROZEN_VERSION_PY_STATIC_HEADER.format(verstr=version, githash=githash) return _FROZEN_VERSION_PY_TEMPLATE.format(packagetitle=packagetitle, timestamp=timestamp, header=header, major=major, minor=minor, bugfix=bugfix, rel=release, debug=debug) def _generate_git_header(packagename, version, githash): """ Generates a header to the version.py module that includes utilities for probing the git repository for updates (to the current git hash, etc.) These utilities should only be available in development versions, and not in release builds. If this fails for any reason an empty string is returned. """ loader = pkgutil.get_loader(git_helpers) source = loader.get_source(git_helpers.__name__) or '' source_lines = source.splitlines() if not source_lines: log.warn('Cannot get source code for astropy_helpers.git_helpers; ' 'git support disabled.') return '' idx = 0 for idx, line in enumerate(source_lines): if line.startswith('# BEGIN'): break git_helpers_py = '\n'.join(source_lines[idx + 1:]) if PY3: verstr = version else: # In Python 2 don't pass in a unicode string; otherwise verstr will # be represented with u'' syntax which breaks on Python 3.x with x # < 3. This is only an issue when developing on multiple Python # versions at once verstr = version.encode('utf8') new_githash = git_helpers.get_git_devstr(sha=True, show_warning=False) if new_githash: githash = new_githash return _FROZEN_VERSION_PY_WITH_GIT_HEADER.format( git_helpers=git_helpers_py, packagename=packagename, verstr=verstr, githash=githash) def generate_version_py(packagename, version, release=None, debug=None, uses_git=True): """Regenerate the version.py module if necessary.""" try: version_module = get_pkg_version_module(packagename) try: last_generated_version = version_module._last_generated_version except AttributeError: last_generated_version = version_module.version try: last_githash = version_module._last_githash except AttributeError: last_githash = version_module.githash current_release = version_module.release current_debug = version_module.debug except ImportError: version_module = None last_generated_version = None last_githash = None current_release = None current_debug = None if release is None: # Keep whatever the current value is, if it exists release = bool(current_release) if debug is None: # Likewise, keep whatever the current value is, if it exists debug = bool(current_debug) version_py = os.path.join(packagename, 'version.py') if (last_generated_version != version or current_release != release or current_debug != debug): if '-q' not in sys.argv and '--quiet' not in sys.argv: log.set_threshold(log.INFO) if is_distutils_display_option(): # Always silence unnecessary log messages when display options are # being used log.set_threshold(log.WARN) log.info('Freezing version number to {0}'.format(version_py)) with open(version_py, 'w') as f: # This overwrites the actual version.py f.write(_get_version_py_str(packagename, version, last_githash, release, debug, uses_git=uses_git)) invalidate_caches() if version_module: imp.reload(version_module) def get_pkg_version_module(packagename, fromlist=None): """Returns the package's .version module generated by `astropy_helpers.version_helpers.generate_version_py`. Raises an ImportError if the version module is not found. If ``fromlist`` is an iterable, return a tuple of the members of the version module corresponding to the member names given in ``fromlist``. Raises an `AttributeError` if any of these module members are not found. """ if not fromlist: # Due to a historical quirk of Python's import implementation, # __import__ will not return submodules of a package if 'fromlist' is # empty. # TODO: For Python 3.1 and up it may be preferable to use importlib # instead of the __import__ builtin return __import__(packagename + '.version', fromlist=['']) else: mod = __import__(packagename + '.version', fromlist=fromlist) return tuple(getattr(mod, member) for member in fromlist) reproject-0.3.2/astropy_helpers/astropy_helpers.egg-info/0000755000077000000240000000000013173066302023570 5ustar tomstaff00000000000000reproject-0.3.2/astropy_helpers/astropy_helpers.egg-info/dependency_links.txt0000644000077000000240000000000112361522331027633 0ustar tomstaff00000000000000 reproject-0.3.2/astropy_helpers/astropy_helpers.egg-info/not-zip-safe0000644000077000000240000000000112361522331026013 0ustar tomstaff00000000000000 reproject-0.3.2/astropy_helpers/astropy_helpers.egg-info/PKG-INFO0000644000077000000240000000474212361522331024671 0ustar tomstaff00000000000000Metadata-Version: 1.1 Name: astropy-helpers Version: 0.4 Summary: Utilities for building and installing Astropy, Astropy affiliated packages, and their respective documentation. Home-page: http://astropy.org Author: The Astropy Developers Author-email: astropy.team@gmail.com License: BSD Download-URL: http://pypi.python.org/packages/source/a/astropy-helpers/astropy-helpers-0.4.tar.gz Description: astropy-helpers =============== This project provides a Python package, ``astropy_helpers``, which includes many build, installation, and documentation-related tools used by the Astropy project, but packaged separately for use by other projects that wish to leverage this work. The motivation behind this package and details of its implementation are in the accepted `Astropy Proposal for Enhancement (APE) 4 `_. ``astropy_helpers`` includes a special "bootstrap" module called ``ah_bootstrap.py`` which is intended to be used by a project's setup.py in order to ensure that the ``astropy_helpers`` package is available for build/installation. This is similar to the ``ez_setup.py`` module that is shipped with some projects to bootstrap `setuptools `_. As described in APE4, the version numbers for ``astropy_helpers`` follow the corresponding major/minor version of the `astropy core package `_, but with an independent sequence of micro (bugfix) version numbers. Hence, the initial release is 0.4, in parallel with Astropy v0.4, which will be the first version of Astropy to use ``astropy-helpers``. For examples of how to implement ``astropy-helpers`` in a project, see the ``setup.py`` and ``setup.cfg`` files of the `Affiliated package template `_. Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Topic :: Software Development :: Build Tools Classifier: Topic :: Software Development :: Libraries :: Python Modules Classifier: Topic :: System :: Archiving :: Packaging reproject-0.3.2/astropy_helpers/astropy_helpers.egg-info/SOURCES.txt0000644000077000000240000000532212361522331025453 0ustar tomstaff00000000000000CHANGES.rst LICENSE.rst MANIFEST.in README.rst ah_bootstrap.py ez_setup.py setup.cfg setup.py astropy_helpers/__init__.py astropy_helpers/git_helpers.py astropy_helpers/setup_helpers.py astropy_helpers/test_helpers.py astropy_helpers/utils.py astropy_helpers/version.py astropy_helpers/version_helpers.py astropy_helpers.egg-info/PKG-INFO astropy_helpers.egg-info/SOURCES.txt astropy_helpers.egg-info/dependency_links.txt astropy_helpers.egg-info/not-zip-safe astropy_helpers.egg-info/top_level.txt astropy_helpers/compat/__init__.py astropy_helpers/compat/subprocess.py astropy_helpers/sphinx/__init__.py astropy_helpers/sphinx/conf.py astropy_helpers/sphinx/setup_package.py astropy_helpers/sphinx/ext/__init__.py astropy_helpers/sphinx/ext/astropyautosummary.py astropy_helpers/sphinx/ext/automodapi.py astropy_helpers/sphinx/ext/automodsumm.py astropy_helpers/sphinx/ext/changelog_links.py astropy_helpers/sphinx/ext/comment_eater.py astropy_helpers/sphinx/ext/compiler_unparse.py astropy_helpers/sphinx/ext/docscrape.py astropy_helpers/sphinx/ext/docscrape_sphinx.py astropy_helpers/sphinx/ext/doctest.py astropy_helpers/sphinx/ext/edit_on_github.py astropy_helpers/sphinx/ext/numpydoc.py astropy_helpers/sphinx/ext/phantom_import.py astropy_helpers/sphinx/ext/smart_resolver.py astropy_helpers/sphinx/ext/tocdepthfix.py astropy_helpers/sphinx/ext/traitsdoc.py astropy_helpers/sphinx/ext/utils.py astropy_helpers/sphinx/ext/viewcode.py astropy_helpers/sphinx/ext/templates/autosummary_core/base.rst astropy_helpers/sphinx/ext/templates/autosummary_core/class.rst astropy_helpers/sphinx/ext/templates/autosummary_core/module.rst astropy_helpers/sphinx/ext/tests/__init__.py astropy_helpers/sphinx/ext/tests/test_automodapi.py astropy_helpers/sphinx/ext/tests/test_automodsumm.py astropy_helpers/sphinx/ext/tests/test_docscrape.py astropy_helpers/sphinx/ext/tests/test_utils.py astropy_helpers/sphinx/local/python3links.inv astropy_helpers/sphinx/themes/bootstrap-astropy/globaltoc.html astropy_helpers/sphinx/themes/bootstrap-astropy/layout.html astropy_helpers/sphinx/themes/bootstrap-astropy/localtoc.html astropy_helpers/sphinx/themes/bootstrap-astropy/searchbox.html astropy_helpers/sphinx/themes/bootstrap-astropy/theme.conf astropy_helpers/sphinx/themes/bootstrap-astropy/static/astropy_linkout_20.png astropy_helpers/sphinx/themes/bootstrap-astropy/static/astropy_logo.ico astropy_helpers/sphinx/themes/bootstrap-astropy/static/astropy_logo_32.png astropy_helpers/sphinx/themes/bootstrap-astropy/static/bootstrap-astropy.css astropy_helpers/sphinx/themes/bootstrap-astropy/static/copybutton.js astropy_helpers/sphinx/themes/bootstrap-astropy/static/sidebar.js astropy_helpers/src/__init__.py astropy_helpers/src/compiler.c astropy_helpers/src/setup_package.pyreproject-0.3.2/astropy_helpers/astropy_helpers.egg-info/top_level.txt0000644000077000000240000000002012361522331026307 0ustar tomstaff00000000000000astropy_helpers reproject-0.3.2/astropy_helpers/CHANGES.rst0000644000077000000240000003232613173066253020470 0ustar tomstaff00000000000000astropy-helpers Changelog ========================= 1.2 (2016-06-19) ---------------- - Added sphinx configuration value ``automodsumm_inherited_members``. If ``True`` this will include members that are inherited from a base class in the generated API docs. Defaults to ``False`` which matches the previous behavior. [#215] - Fixed ``build_sphinx`` to recognize builds that succeeded but have output *after* the "build succeeded." statement. This only applies when ``--warnings-returncode`` is given (which is primarily relevant for Travis documentation builds). [#223] - Fixed ``build_sphinx`` the sphinx extensions to not output a spurious warning for sphinx versions > 1.4. [#229] - Add Python version dependent local sphinx inventories that contain otherwise missing references. [#216] - ``astropy_helpers`` now require Sphinx 1.3 or later. [#226] 1.1.2 (2016-03-9) ----------------- - The CSS for the sphinx documentation was altered to prevent some text overflow problems. [#217] 1.1.1 (2015-12-23) ------------------ - Fixed crash in build with ``AttributeError: cython_create_listing`` with older versions of setuptools. [#209] 1.1 (2015-12-10) ---------------- - The original ``AstropyTest`` class in ``astropy_helpers``, which implements the ``setup.py test`` command, is deprecated in favor of moving the implementation of that command closer to the actual Astropy test runner in ``astropy.tests``. Now a dummy ``test`` command is provided solely for informing users that they need ``astropy`` installed to run the tests (however, the previous, now deprecated implementation is still provided and continues to work with older versions of Astropy). See the related issue for more details. [#184] - Added a useful new utility function to ``astropy_helpers.utils`` called ``find_data_files``. This is similar to the ``find_packages`` function in setuptools in that it can be used to search a package for data files (matching a pattern) that can be passed to the ``package_data`` argument for ``setup()``. See the docstring to ``astropy_helpers.utils.find_data_files`` for more details. [#42] - The ``astropy_helpers`` module now sets the global ``_ASTROPY_SETUP_`` flag upon import (from within a ``setup.py``) script, so it's not necessary to have this in the ``setup.py`` script explicitly. If in doubt though, there's no harm in setting it twice. Putting it in ``astropy_helpers`` just ensures that any other imports that occur during build will have this flag set. [#191] - It is now possible to use Cython as a ``setup_requires`` build requirement, and still build Cython extensions even if Cython wasn't available at the beginning of the build processes (that is, is automatically downloaded via setuptools' processing of ``setup_requires``). [#185] - Moves the ``adjust_compiler`` check into the ``build_ext`` command itself, so it's only used when actually building extension modules. This also deprecates the stand-alone ``adjust_compiler`` function. [#76] - When running the ``build_sphinx`` / ``build_docs`` command with the ``-w`` option, the output from Sphinx is streamed as it runs instead of silently buffering until the doc build is complete. [#197] 1.0.7 (2016-06-09) ------------------ - Fix missing import in ``astropy_helpers/utils.py``. [#196] 1.0.6 (2015-12-04) ------------------ - Fixed bug where running ``./setup.py build_sphinx`` could return successfully even when the build was not successful (and should have returned a non-zero error code). [#199] 1.0.5 (2015-10-02) ------------------ - Fixed a regression in the ``./setup.py test`` command that was introduced in v1.0.4. 1.0.4 (2015-10-02) ------------------ - Fixed issue with the sphinx documentation css where the line numbers for code blocks were not aligned with the code. [#179] - Fixed crash that could occur when trying to build Cython extension modules when Cython isn't installed. Normally this still results in a failed build, but was supposed to provide a useful error message rather than crash outright (this was a regression introduced in v1.0.3). [#181] - Fixed a crash that could occur on Python 3 when a working C compiler isn't found. [#182] - Quieted warnings about deprecated Numpy API in Cython extensions, when building Cython extensions against Numpy >= 1.7. [#183] - Improved support for py.test >= 2.7--running the ``./setup.py test`` command now copies all doc pages into the temporary test directory as well, so that all test files have a "common root directory". [#189] 1.0.3 (2015-07-22) ------------------ - Added workaround for sphinx-doc/sphinx#1843, a but in Sphinx which prevented descriptor classes with a custom metaclass from being documented correctly. [#158] - Added an alias for the ``./setup.py build_sphinx`` command as ``./setup.py build_docs`` which, to a new contributor, should hopefully be less cryptic. [#161] - The fonts in graphviz diagrams now match the font of the HTML content. [#169] - When the documentation is built on readthedocs.org, MathJax will be used for math rendering. When built elsewhere, the "pngmath" extension is still used for math rendering. [#170] - Fix crash when importing astropy_helpers when running with ``python -OO`` [#171] - The ``build`` and ``build_ext`` stages now correctly recognize the presence of C++ files in Cython extensions (previously only vanilla C worked). [#173] 1.0.2 (2015-04-02) ------------------ - Various fixes enabling the astropy-helpers Sphinx build command and Sphinx extensions to work with Sphinx 1.3. [#148] - More improvement to the ability to handle multiple versions of astropy-helpers being imported in the same Python interpreter session in the (somewhat rare) case of nested installs. [#147] - To better support high resolution displays, use SVG for the astropy logo and linkout image, falling back to PNGs for browsers that support it. [#150, #151] - Improve ``setup_helpers.get_compiler_version`` to work with more compilers, and to return more info. This will help fix builds of Astropy on less common compilers, like Sun C. [#153] 1.0.1 (2015-03-04) ------------------ - Released in concert with v0.4.8 to address the same issues. 0.4.8 (2015-03-04) ------------------ - Improved the ``ah_bootstrap`` script's ability to override existing installations of astropy-helpers with new versions in the context of installing multiple packages simultaneously within the same Python interpreter (e.g. when one package has in its ``setup_requires`` another package that uses a different version of astropy-helpers. [#144] - Added a workaround to an issue in matplotlib that can, in rare cases, lead to a crash when installing packages that import matplotlib at build time. [#144] 1.0 (2015-02-17) ---------------- - Added new pre-/post-command hook points for ``setup.py`` commands. Now any package can define code to run before and/or after any ``setup.py`` command without having to manually subclass that command by adding ``pre__hook`` and ``post__hook`` callables to the package's ``setup_package.py`` module. See the PR for more details. [#112] - The following objects in the ``astropy_helpers.setup_helpers`` module have been relocated: - ``get_dummy_distribution``, ``get_distutils_*``, ``get_compiler_option``, ``add_command_option``, ``is_distutils_display_option`` -> ``astropy_helpers.distutils_helpers`` - ``should_build_with_cython``, ``generate_build_ext_command`` -> ``astropy_helpers.commands.build_ext`` - ``AstropyBuildPy`` -> ``astropy_helpers.commands.build_py`` - ``AstropyBuildSphinx`` -> ``astropy_helpers.commands.build_sphinx`` - ``AstropyInstall`` -> ``astropy_helpers.commands.install`` - ``AstropyInstallLib`` -> ``astropy_helpers.commands.install_lib`` - ``AstropyRegister`` -> ``astropy_helpers.commands.register`` - ``get_pkg_version_module`` -> ``astropy_helpers.version_helpers`` - ``write_if_different``, ``import_file``, ``get_numpy_include_path`` -> ``astropy_helpers.utils`` All of these are "soft" deprecations in the sense that they are still importable from ``astropy_helpers.setup_helpers`` for now, and there is no (easy) way to produce deprecation warnings when importing these objects from ``setup_helpers`` rather than directly from the modules they are defined in. But please consider updating any imports to these objects. [#110] - Use of the ``astropy.sphinx.ext.astropyautosummary`` extension is deprecated for use with Sphinx < 1.2. Instead it should suffice to remove this extension for the ``extensions`` list in your ``conf.py`` and add the stock ``sphinx.ext.autosummary`` instead. [#131] 0.4.7 (2015-02-17) ------------------ - Fixed incorrect/missing git hash being added to the generated ``version.py`` when creating a release. [#141] 0.4.6 (2015-02-16) ------------------ - Fixed problems related to the automatically generated _compiler module not being created properly. [#139] 0.4.5 (2015-02-11) ------------------ - Fixed an issue where ah_bootstrap.py could blow up when astropy_helper's version number is 1.0. - Added a workaround for documentation of properties in the rare case where the class's metaclass has a property of the same name. [#130] - Fixed an issue on Python 3 where importing a package using astropy-helper's generated version.py module would crash when the current working directory is an empty git repository. [#114] - Fixed an issue where the "revision count" appended to .dev versions by the generated version.py did not accurately reflect the revision count for the package it belongs to, and could be invalid if the current working directory is an unrelated git repository. [#107] - Likewise, fixed a confusing warning message that could occur in the same circumstances as the above issue. [#121] 0.4.4 (2014-12-31) ------------------ - More improvements for building the documentation using Python 3.x. [#100] - Additional minor fixes to Python 3 support. [#115] - Updates to support new test features in Astropy [#92, #106] 0.4.3 (2014-10-22) ------------------ - The generated ``version.py`` file now preserves the git hash of installed copies of the package as well as when building a source distribution. That is, the git hash of the changeset that was installed/released is preserved. [#87] - In smart resolver add resolution for class links when they exist in the intersphinx inventory, but not the mapping of the current package (e.g. when an affiliated package uses an astropy core class of which "actual" and "documented" location differs) [#88] - Fixed a bug that could occur when running ``setup.py`` for the first time in a repository that uses astropy-helpers as a submodule: ``AttributeError: 'NoneType' object has no attribute 'mkdtemp'`` [#89] - Fixed a bug where optional arguments to the ``doctest-skip`` Sphinx directive were sometimes being left in the generated documentation output. [#90] - Improved support for building the documentation using Python 3.x. [#96] - Avoid error message if .git directory is not present. [#91] 0.4.2 (2014-08-09) ------------------ - Fixed some CSS issues in generated API docs. [#69] - Fixed the warning message that could be displayed when generating a version number with some older versions of git. [#77] - Fixed automodsumm to work with new versions of Sphinx (>= 1.2.2). [#80] 0.4.1 (2014-08-08) ------------------ - Fixed git revision count on systems with git versions older than v1.7.2. [#70] - Fixed display of warning text when running a git command fails (previously the output of stderr was not being decoded properly). [#70] - The ``--offline`` flag to ``setup.py`` understood by ``ah_bootstrap.py`` now also prevents git from going online to fetch submodule updates. [#67] - The Sphinx extension for converting issue numbers to links in the changelog now supports working on arbitrary pages via a new ``conf.py`` setting: ``changelog_links_docpattern``. By default it affects the ``changelog`` and ``whatsnew`` pages in one's Sphinx docs. [#61] - Fixed crash that could result from users with missing/misconfigured locale settings. [#58] - The font used for code examples in the docs is now the system-defined ``monospace`` font, rather than ``Minaco``, which is not available on all platforms. [#50] 0.4 (2014-07-15) ---------------- - Initial release of astropy-helpers. See `APE4 `_ for details of the motivation and design of this package. - The ``astropy_helpers`` package replaces the following modules in the ``astropy`` package: - ``astropy.setup_helpers`` -> ``astropy_helpers.setup_helpers`` - ``astropy.version_helpers`` -> ``astropy_helpers.version_helpers`` - ``astropy.sphinx`` - > ``astropy_helpers.sphinx`` These modules should be considered deprecated in ``astropy``, and any new, non-critical changes to those modules will be made in ``astropy_helpers`` instead. Affiliated packages wishing to make use those modules (as in the Astropy package-template) should use the versions from ``astropy_helpers`` instead, and include the ``ah_bootstrap.py`` script in their project, for bootstrapping the ``astropy_helpers`` package in their setup.py script. reproject-0.3.2/astropy_helpers/ez_setup.py0000644000077000000240000002757313173066253021106 0ustar tomstaff00000000000000#!python """Bootstrap setuptools installation If you want to use setuptools in your package's setup.py, just include this file in the same directory with it, and add this to the top of your setup.py:: from ez_setup import use_setuptools use_setuptools() If you want to require a specific version of setuptools, set a download mirror, or use an alternate download directory, you can do so by supplying the appropriate options to ``use_setuptools()``. This file can also be run as a script to install or upgrade setuptools. """ import os import shutil import sys import tempfile import tarfile import optparse import subprocess import platform from distutils import log try: from site import USER_SITE except ImportError: USER_SITE = None DEFAULT_VERSION = "1.4.2" DEFAULT_URL = "https://pypi.python.org/packages/source/s/setuptools/" def _python_cmd(*args): args = (sys.executable,) + args return subprocess.call(args) == 0 def _check_call_py24(cmd, *args, **kwargs): res = subprocess.call(cmd, *args, **kwargs) class CalledProcessError(Exception): pass if not res == 0: msg = "Command '%s' return non-zero exit status %d" % (cmd, res) raise CalledProcessError(msg) vars(subprocess).setdefault('check_call', _check_call_py24) def _install(tarball, install_args=()): # extracting the tarball tmpdir = tempfile.mkdtemp() log.warn('Extracting in %s', tmpdir) old_wd = os.getcwd() try: os.chdir(tmpdir) tar = tarfile.open(tarball) _extractall(tar) tar.close() # going in the directory subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0]) os.chdir(subdir) log.warn('Now working in %s', subdir) # installing log.warn('Installing Setuptools') if not _python_cmd('setup.py', 'install', *install_args): log.warn('Something went wrong during the installation.') log.warn('See the error message above.') # exitcode will be 2 return 2 finally: os.chdir(old_wd) shutil.rmtree(tmpdir) def _build_egg(egg, tarball, to_dir): # extracting the tarball tmpdir = tempfile.mkdtemp() log.warn('Extracting in %s', tmpdir) old_wd = os.getcwd() try: os.chdir(tmpdir) tar = tarfile.open(tarball) _extractall(tar) tar.close() # going in the directory subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0]) os.chdir(subdir) log.warn('Now working in %s', subdir) # building an egg log.warn('Building a Setuptools egg in %s', to_dir) _python_cmd('setup.py', '-q', 'bdist_egg', '--dist-dir', to_dir) finally: os.chdir(old_wd) shutil.rmtree(tmpdir) # returning the result log.warn(egg) if not os.path.exists(egg): raise IOError('Could not build the egg.') def _do_download(version, download_base, to_dir, download_delay): egg = os.path.join(to_dir, 'setuptools-%s-py%d.%d.egg' % (version, sys.version_info[0], sys.version_info[1])) if not os.path.exists(egg): tarball = download_setuptools(version, download_base, to_dir, download_delay) _build_egg(egg, tarball, to_dir) sys.path.insert(0, egg) # Remove previously-imported pkg_resources if present (see # https://bitbucket.org/pypa/setuptools/pull-request/7/ for details). if 'pkg_resources' in sys.modules: del sys.modules['pkg_resources'] import setuptools setuptools.bootstrap_install_from = egg def use_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, download_delay=15): # making sure we use the absolute path to_dir = os.path.abspath(to_dir) was_imported = 'pkg_resources' in sys.modules or \ 'setuptools' in sys.modules try: import pkg_resources except ImportError: return _do_download(version, download_base, to_dir, download_delay) try: pkg_resources.require("setuptools>=" + version) return except pkg_resources.VersionConflict: e = sys.exc_info()[1] if was_imported: sys.stderr.write( "The required version of setuptools (>=%s) is not available,\n" "and can't be installed while this script is running. Please\n" "install a more recent version first, using\n" "'easy_install -U setuptools'." "\n\n(Currently using %r)\n" % (version, e.args[0])) sys.exit(2) else: del pkg_resources, sys.modules['pkg_resources'] # reload ok return _do_download(version, download_base, to_dir, download_delay) except pkg_resources.DistributionNotFound: return _do_download(version, download_base, to_dir, download_delay) def _clean_check(cmd, target): """ Run the command to download target. If the command fails, clean up before re-raising the error. """ try: subprocess.check_call(cmd) except subprocess.CalledProcessError: if os.access(target, os.F_OK): os.unlink(target) raise def download_file_powershell(url, target): """ Download the file at url to target using Powershell (which will validate trust). Raise an exception if the command cannot complete. """ target = os.path.abspath(target) cmd = [ 'powershell', '-Command', "(new-object System.Net.WebClient).DownloadFile(%(url)r, %(target)r)" % vars(), ] _clean_check(cmd, target) def has_powershell(): if platform.system() != 'Windows': return False cmd = ['powershell', '-Command', 'echo test'] devnull = open(os.path.devnull, 'wb') try: try: subprocess.check_call(cmd, stdout=devnull, stderr=devnull) except: return False finally: devnull.close() return True download_file_powershell.viable = has_powershell def download_file_curl(url, target): cmd = ['curl', url, '--silent', '--output', target] _clean_check(cmd, target) def has_curl(): cmd = ['curl', '--version'] devnull = open(os.path.devnull, 'wb') try: try: subprocess.check_call(cmd, stdout=devnull, stderr=devnull) except: return False finally: devnull.close() return True download_file_curl.viable = has_curl def download_file_wget(url, target): cmd = ['wget', url, '--quiet', '--output-document', target] _clean_check(cmd, target) def has_wget(): cmd = ['wget', '--version'] devnull = open(os.path.devnull, 'wb') try: try: subprocess.check_call(cmd, stdout=devnull, stderr=devnull) except: return False finally: devnull.close() return True download_file_wget.viable = has_wget def download_file_insecure(url, target): """ Use Python to download the file, even though it cannot authenticate the connection. """ try: from urllib.request import urlopen except ImportError: from urllib2 import urlopen src = dst = None try: src = urlopen(url) # Read/write all in one block, so we don't create a corrupt file # if the download is interrupted. data = src.read() dst = open(target, "wb") dst.write(data) finally: if src: src.close() if dst: dst.close() download_file_insecure.viable = lambda: True def get_best_downloader(): downloaders = [ download_file_powershell, download_file_curl, download_file_wget, download_file_insecure, ] for dl in downloaders: if dl.viable(): return dl def download_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, delay=15, downloader_factory=get_best_downloader): """Download setuptools from a specified location and return its filename `version` should be a valid setuptools version number that is available as an egg for download under the `download_base` URL (which should end with a '/'). `to_dir` is the directory where the egg will be downloaded. `delay` is the number of seconds to pause before an actual download attempt. ``downloader_factory`` should be a function taking no arguments and returning a function for downloading a URL to a target. """ # making sure we use the absolute path to_dir = os.path.abspath(to_dir) tgz_name = "setuptools-%s.tar.gz" % version url = download_base + tgz_name saveto = os.path.join(to_dir, tgz_name) if not os.path.exists(saveto): # Avoid repeated downloads log.warn("Downloading %s", url) downloader = downloader_factory() downloader(url, saveto) return os.path.realpath(saveto) def _extractall(self, path=".", members=None): """Extract all members from the archive to the current working directory and set owner, modification time and permissions on directories afterwards. `path' specifies a different directory to extract to. `members' is optional and must be a subset of the list returned by getmembers(). """ import copy import operator from tarfile import ExtractError directories = [] if members is None: members = self for tarinfo in members: if tarinfo.isdir(): # Extract directories with a safe mode. directories.append(tarinfo) tarinfo = copy.copy(tarinfo) tarinfo.mode = 448 # decimal for oct 0700 self.extract(tarinfo, path) # Reverse sort directories. if sys.version_info < (2, 4): def sorter(dir1, dir2): return cmp(dir1.name, dir2.name) directories.sort(sorter) directories.reverse() else: directories.sort(key=operator.attrgetter('name'), reverse=True) # Set correct owner, mtime and filemode on directories. for tarinfo in directories: dirpath = os.path.join(path, tarinfo.name) try: self.chown(tarinfo, dirpath) self.utime(tarinfo, dirpath) self.chmod(tarinfo, dirpath) except ExtractError: e = sys.exc_info()[1] if self.errorlevel > 1: raise else: self._dbg(1, "tarfile: %s" % e) def _build_install_args(options): """ Build the arguments to 'python setup.py install' on the setuptools package """ install_args = [] if options.user_install: if sys.version_info < (2, 6): log.warn("--user requires Python 2.6 or later") raise SystemExit(1) install_args.append('--user') return install_args def _parse_args(): """ Parse the command line for options """ parser = optparse.OptionParser() parser.add_option( '--user', dest='user_install', action='store_true', default=False, help='install in user site package (requires Python 2.6 or later)') parser.add_option( '--download-base', dest='download_base', metavar="URL", default=DEFAULT_URL, help='alternative URL from where to download the setuptools package') parser.add_option( '--insecure', dest='downloader_factory', action='store_const', const=lambda: download_file_insecure, default=get_best_downloader, help='Use internal, non-validating downloader' ) options, args = parser.parse_args() # positional arguments are ignored return options def main(version=DEFAULT_VERSION): """Install or upgrade setuptools and EasyInstall""" options = _parse_args() tarball = download_setuptools(download_base=options.download_base, downloader_factory=options.downloader_factory) return _install(tarball, _build_install_args(options)) if __name__ == '__main__': sys.exit(main()) reproject-0.3.2/astropy_helpers/LICENSE.rst0000644000077000000240000000272312361520666020501 0ustar tomstaff00000000000000Copyright (c) 2014, Astropy Developers All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the Astropy Team nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. reproject-0.3.2/astropy_helpers/licenses/0000755000077000000240000000000013173066302020460 5ustar tomstaff00000000000000reproject-0.3.2/astropy_helpers/licenses/LICENSE_COPYBUTTON.rst0000644000077000000240000000471112361520666024073 0ustar tomstaff00000000000000Copyright 2014 Python Software Foundation License: PSF PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 -------------------------------------------- . 1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and the Individual or Organization ("Licensee") accessing and otherwise using this software ("Python") in source or binary form and its associated documentation. . 2. Subject to the terms and conditions of this License Agreement, PSF hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version, provided, however, that PSF's License Agreement and PSF's notice of copyright, i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Python Software Foundation; All Rights Reserved" are retained in Python alone or in any derivative version prepared by Licensee. . 3. In the event Licensee prepares a derivative work that is based on or incorporates Python or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to Python. . 4. PSF is making Python available to Licensee on an "AS IS" basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. . 5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. . 6. This License Agreement will automatically terminate upon a material breach of its terms and conditions. . 7. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between PSF and Licensee. This License Agreement does not grant permission to use PSF trademarks or trade name in a trademark sense to endorse or promote products or services of Licensee, or any third party. . 8. By copying, installing or otherwise using Python, Licensee agrees to be bound by the terms and conditions of this License Agreement. reproject-0.3.2/astropy_helpers/licenses/LICENSE_NUMPYDOC.rst0000644000077000000240000001350712361520666023626 0ustar tomstaff00000000000000------------------------------------------------------------------------------- The files - numpydoc.py - docscrape.py - docscrape_sphinx.py - phantom_import.py have the following license: Copyright (C) 2008 Stefan van der Walt , Pauli Virtanen Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------------- The files - compiler_unparse.py - comment_eater.py - traitsdoc.py have the following license: This software is OSI Certified Open Source Software. OSI Certified is a certification mark of the Open Source Initiative. Copyright (c) 2006, Enthought, Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Enthought, Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------------------------------------------------------------------- The file - plot_directive.py originates from Matplotlib (http://matplotlib.sf.net/) which has the following license: Copyright (c) 2002-2008 John D. Hunter; All Rights Reserved. 1. This LICENSE AGREEMENT is between John D. Hunter (“JDHâ€), and the Individual or Organization (“Licenseeâ€) accessing and otherwise using matplotlib software in source or binary form and its associated documentation. 2. Subject to the terms and conditions of this License Agreement, JDH hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use matplotlib 0.98.3 alone or in any derivative version, provided, however, that JDH’s License Agreement and JDH’s notice of copyright, i.e., “Copyright (c) 2002-2008 John D. Hunter; All Rights Reserved†are retained in matplotlib 0.98.3 alone or in any derivative version prepared by Licensee. 3. In the event Licensee prepares a derivative work that is based on or incorporates matplotlib 0.98.3 or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to matplotlib 0.98.3. 4. JDH is making matplotlib 0.98.3 available to Licensee on an “AS IS†basis. JDH MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, JDH MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF MATPLOTLIB 0.98.3 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. 5. JDH SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF MATPLOTLIB 0.98.3 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING MATPLOTLIB 0.98.3, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. 6. This License Agreement will automatically terminate upon a material breach of its terms and conditions. 7. Nothing in this License Agreement shall be deemed to create any relationship of agency, partnership, or joint venture between JDH and Licensee. This License Agreement does not grant permission to use JDH trademarks or trade name in a trademark sense to endorse or promote products or services of Licensee, or any third party. 8. By copying, installing or otherwise using matplotlib 0.98.3, Licensee agrees to be bound by the terms and conditions of this License Agreement. reproject-0.3.2/astropy_helpers/README.rst0000644000077000000240000000323113173066253020346 0ustar tomstaff00000000000000astropy-helpers =============== This project provides a Python package, ``astropy_helpers``, which includes many build, installation, and documentation-related tools used by the Astropy project, but packaged separately for use by other projects that wish to leverage this work. The motivation behind this package and details of its implementation are in the accepted `Astropy Proposal for Enhancement (APE) 4 `_. ``astropy_helpers`` includes a special "bootstrap" module called ``ah_bootstrap.py`` which is intended to be used by a project's setup.py in order to ensure that the ``astropy_helpers`` package is available for build/installation. This is similar to the ``ez_setup.py`` module that is shipped with some projects to bootstrap `setuptools `_. As described in APE4, the version numbers for ``astropy_helpers`` follow the corresponding major/minor version of the `astropy core package `_, but with an independent sequence of micro (bugfix) version numbers. Hence, the initial release is 0.4, in parallel with Astropy v0.4, which will be the first version of Astropy to use ``astropy-helpers``. For examples of how to implement ``astropy-helpers`` in a project, see the ``setup.py`` and ``setup.cfg`` files of the `Affiliated package template `_. .. image:: https://travis-ci.org/astropy/astropy-helpers.svg :target: https://travis-ci.org/astropy/astropy-helpers .. image:: https://coveralls.io/repos/astropy/astropy-helpers/badge.svg :target: https://coveralls.io/r/astropy/astropy-helpers reproject-0.3.2/CHANGES.md0000644000077000000240000000210213173066217015022 0ustar tomstaff000000000000000.3.2 (2017-10-22) ------------------ - Fix a regression that caused certain all-sky images (e.g. the Mellinger Milky Way Panorama, http://www.milkywaysky.com) to be reprojected to all NaNs when the output WCS was in Mollweide coordinates. [#124] 0.3.1 (2016-07-07) ------------------ - Include missing license file in tarball. - Updated documentation to remove warnings about early versions. 0.3 (2016-07-06) ---------------- - Allow users to pass a ``field=`` option to ``reproject_from_healpix`` to access different fields in a HEALPIX file. [#86] - Significant improvements to performance when the input data is a large memory-mapped array. [#105] - Significant refactoring of interpolating reprojection to improve support for n-dimensional arrays, optionally including two celestial axes (in which case the coordinate transformation is taken into account). [#96, #102] 0.2 (2015-10-29) ---------------- - Fixed a bug that caused reprojection by interpolation to be truncated for rectangular output images. 0.1 (2015-05-08) ---------------- - Initial Release. reproject-0.3.2/docs/0000755000077000000240000000000013173066302014360 5ustar tomstaff00000000000000reproject-0.3.2/docs/_templates/0000755000077000000240000000000013173066302016515 5ustar tomstaff00000000000000reproject-0.3.2/docs/_templates/autosummary/0000755000077000000240000000000013173066302021103 5ustar tomstaff00000000000000reproject-0.3.2/docs/_templates/autosummary/base.rst0000644000077000000240000000037212516667577022576 0ustar tomstaff00000000000000{% extends "autosummary_core/base.rst" %} {# The template this is inherited from is in astropy/sphinx/ext/templates/autosummary_core. If you want to modify this template, it is strongly recommended that you still inherit from the astropy template. #}reproject-0.3.2/docs/_templates/autosummary/class.rst0000644000077000000240000000037312516667577022772 0ustar tomstaff00000000000000{% extends "autosummary_core/class.rst" %} {# The template this is inherited from is in astropy/sphinx/ext/templates/autosummary_core. If you want to modify this template, it is strongly recommended that you still inherit from the astropy template. #}reproject-0.3.2/docs/_templates/autosummary/module.rst0000644000077000000240000000037412516667577023153 0ustar tomstaff00000000000000{% extends "autosummary_core/module.rst" %} {# The template this is inherited from is in astropy/sphinx/ext/templates/autosummary_core. If you want to modify this template, it is strongly recommended that you still inherit from the astropy template. #}reproject-0.3.2/docs/celestial.rst0000644000077000000240000001543612737420303017070 0ustar tomstaff00000000000000********************************** Regular celestial images and cubes ********************************** One of the most common types of data to reproject are celestial images or n-dimensional data (such as spectral cubes) where two of the axes are celestial. There are several existing algorithms that can be used to reproject such data: * **Interpolation** (such as nearest-neighbor, bilinear, biquadratic interpolation and so on). This is the fastest algorithm and is suited to common use cases, but it is important to note that it is not flux conserving, and will not return optimal results if the input and output pixel sizes are very different. * **Drizzling**, which consists of determining the exact overlap fraction of pixels, and optionally allows pixels to be rescaled before reprojection. A description of the algorithm can be found in `Fruchter and Hook (2002) `__. This method is more accurate than interpolation but is only suitable for images where the field of view is small so that pixels are well approximated by rectangles in world coordinates. This is slower but more accurate than interpolation for small fields of view. * Computing the **exact overlap** of pixels on the sky by treating them as **four-sided spherical polygons** on the sky and computing spherical polygon intersection. This is essentially an exact form of drizzling, and should be appropriate for any field of view. However, this comes at a significant performance cost. This is the algorithm used by the `Montage `_ package, and we have implemented it here using the same core algorithm. Currently, this package implements interpolation and spherical polygon intersection. .. note:: The reprojection/resampling is always done assuming that the image is in **surface brightness units**. For example, if you have an image with a constant value of 1, reprojecting the image to an image with twice as high resolution will result in an image where all pixels are all 1. This limitation is due to the interpolation algorithms (the fact that interpolation can be used implicitly assumes that the pixel values can be interpolated which is only the case with surface brightness units). If you have an image in flux units, first convert it to surface brightness, then use the functions described below. In future, we will provide a convenience function to return the area of all the pixels to make it easier. .. _interpolation: Interpolation ============= Reprojection using interpolation can be done using the high-level :func:`~reproject.reproject_interp` function:: >>> from reproject import reproject_interp This function takes two main arguments. The first argument is the image to reproject, together with WCS information about the image. This can be either: * The name of a FITS file * An :class:`~astropy.io.fits.HDUList` object * An image HDU object such as a :class:`~astropy.io.fits.PrimaryHDU`, :class:`~astropy.io.fits.ImageHDU`, or :class:`~astropy.io.fits.CompImageHDU` instance * A tuple where the first element is a :class:`~numpy.ndarray` and the second element is either a :class:`~astropy.wcs.WCS` or a :class:`~astropy.io.fits.Header` object In the case of a FITS file or an :class:`~astropy.io.fits.HDUList` object, if there is more than one Header-Data Unit (HDU), the ``hdu_in`` argument is also required and should be set to the ID or the name of the HDU to use. The second argument is the WCS information for the output image, which should be specified either as a :class:`~astropy.wcs.WCS` or a :class:`~astropy.io.fits.Header` instance. If this is specified as a :class:`~astropy.wcs.WCS` instance, the ``shape_out`` argument to :func:`~reproject.reproject_interp` should also be specified, and be given the shape of the output image using the Numpy ``(ny, nx)`` convention (this is because :class:`~astropy.wcs.WCS`, unlike :class:`~astropy.io.fits.Header`, does not contain information about image size). As an example, we start off by opening a FITS file using Astropy:: >>> from astropy.io import fits >>> hdu = fits.open('http://data.astropy.org/galactic_center/gc_msx_e.fits')[0] # doctest: +REMOTE_DATA Downloading http://data.astropy.org/galactic_center/gc_msx_e.fits [Done] The image is currently using a Plate Carée projection:: >>> hdu.header['CTYPE1'] # doctest: +REMOTE_DATA 'GLON-CAR' We can create a new header using a Gnomonic projection:: >>> new_header = hdu.header.copy() # doctest: +REMOTE_DATA >>> new_header['CTYPE1'] = 'GLON-TAN' # doctest: +REMOTE_DATA >>> new_header['CTYPE2'] = 'GLAT-TAN' # doctest: +REMOTE_DATA And finally we can call the :func:`~reproject.reproject_interp` function to reproject the image:: >>> from reproject import reproject_interp >>> new_image, footprint = reproject_interp(hdu, new_header) # doctest: +REMOTE_DATA The :func:`~reproject.reproject_interp` function returns two arrays - the first is the reprojected input image, and the second is a 'footprint' array which shows the fraction of overlap of the input image on the output image grid. This footprint is 0 for output pixels that fall outside the input image, 1 for output pixels that fall inside the input image. For more information about footprint arrays, see the :doc:`footprints` section. We can then easily write out the reprojected image to a new FITS file:: >>> fits.writeto('reprojected_image.fits', new_image, new_header) # doctest: +REMOTE_DATA The order of the interpolation can be controlled by setting the ``order=`` argument to either an integer or a string giving the order of the interpolation. Supported strings include: * ``'nearest-neighbor'``: zeroth order interpolation * ``'bilinear'``: fisst order interpolation * ``'biquadratic'``: second order interpolation * ``'bicubic'``: third order interpolation Drizzling ========= Support for the drizzle algorithm will be implemented in future versions. Spherical Polygon Intersection ============================== Exact reprojection using the spherical polygon intersection can be done using the high-level :func:`~reproject.reproject_exact` function:: >>> from reproject import reproject_exact The two first arguments, the input data and the output projection, should be specified as for the :func:`~reproject.reproject_interp` function described in `Interpolation`_. In addition, an optional ``parallel=`` option can be used to control whether to parallelize the reprojection, and if so how many cores to use (see :func:`~reproject.reproject_exact` for more details). For this algorithm, the footprint array returned gives the exact fractional overlap of new pixels with the original image (see :doc:`footprints` for more details). reproject-0.3.2/docs/conf.py0000644000077000000240000001422112737263231015664 0ustar tomstaff00000000000000# -*- coding: utf-8 -*- # Licensed under a 3-clause BSD style license - see LICENSE.rst # # Astropy documentation build configuration file. # # 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 file. # # All configuration values have a default. Some values are defined in # the global Astropy configuration which is loaded here before anything else. # See astropy.sphinx.conf for which values are set there. # 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('..')) # IMPORTANT: the above commented section was generated by sphinx-quickstart, but # is *NOT* appropriate for astropy or Astropy affiliated packages. It is left # commented out with this explanation to make it clear why this should not be # done. If the sys.path entry above is added, when the astropy.sphinx.conf # import occurs, it will import the *source* version of astropy instead of the # version installed (if invoked as "make html" or directly with sphinx), or the # version in the build directory (if "python setup.py build_sphinx" is used). # Thus, any C-extensions that are needed to build the documentation will *not* # be accessible, and the documentation will not build correctly. import datetime import os import sys try: import astropy_helpers except ImportError: # Building from inside the docs/ directory? if os.path.basename(os.getcwd()) == 'docs': a_h_path = os.path.abspath(os.path.join('..', 'astropy_helpers')) if os.path.isdir(a_h_path): sys.path.insert(1, a_h_path) # Load all of the global Astropy configuration from astropy_helpers.sphinx.conf import * # Get configuration information from setup.cfg try: from ConfigParser import ConfigParser except ImportError: from configparser import ConfigParser conf = ConfigParser() conf.read([os.path.join(os.path.dirname(__file__), '..', 'setup.cfg')]) setup_cfg = dict(conf.items('metadata')) # -- General configuration ---------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. #needs_sphinx = '1.1' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns.append('_templates') # This is added to the end of RST files - a good place to put substitutions to # be used globally. rst_epilog += """ """ # -- Project information ------------------------------------------------------ # This does not *have* to match the package name, but typically does project = setup_cfg['package_name'] author = setup_cfg['author'] copyright = '{0}, {1}'.format( datetime.datetime.now().year, setup_cfg['author']) # 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. __import__(setup_cfg['package_name']) package = sys.modules[setup_cfg['package_name']] # The short X.Y version. version = package.__version__.split('-', 1)[0] # The full version, including alpha/beta/rc tags. release = package.__version__ # -- Options for HTML output --------------------------------------------------- # A NOTE ON HTML THEMES # The global astropy configuration uses a custom theme, 'bootstrap-astropy', # which is installed along with astropy. A different theme can be used or # the options for this theme can be modified by overriding some of the # variables set in the global configuration. The variables set in the # global configuration are listed below, commented out. html_theme_options = { 'logotext1': 're', # white, semi-bold 'logotext2': 'project', # orange, light 'logotext3': ':docs' # white, light } # Add any paths that contain custom themes here, relative to this directory. # To use a different custom theme, add the directory containing the theme. #html_theme_path = [] # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. To override the custom theme, set this to the # name of a builtin theme or the name of a custom theme in html_theme_path. #html_theme = None # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # 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 = '' # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '' # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". html_title = '{0} v{1}'.format(project, release) # Output file base name for HTML help builder. htmlhelp_basename = project + 'doc' # -- Options for LaTeX output -------------------------------------------------- # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [('index', project + '.tex', project + u' Documentation', author, 'manual')] # -- Options for manual page output -------------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [('index', project.lower(), project + u' Documentation', [author], 1)] ## -- Options for the edit_on_github extension ---------------------------------------- if eval(setup_cfg.get('edit_on_github')): extensions += ['astropy_helpers.sphinx.ext.edit_on_github'] versionmod = __import__(setup_cfg['package_name'] + '.version') edit_on_github_project = setup_cfg['github_project'] if versionmod.version.release: edit_on_github_branch = "v" + versionmod.version.version else: edit_on_github_branch = "master" edit_on_github_source_root = "" edit_on_github_doc_root = "docs" nitpicky = True reproject-0.3.2/docs/footprints.rst0000644000077000000240000000447212724021736017333 0ustar tomstaff00000000000000**************** Footprint arrays **************** As described for example in :doc:`celestial`, all reprojection functions in this package return a data array (the reprojected values) and a footprint array, which shows which pixels in the new reprojected data fell inside the original image. For interpolation-based algorithms, the footprint array can either take a value of 0 or 1, but for the 'exact' algorithm based on spherical polygon intersection, and in future for the drizzle algorithm, we can actually find out what fraction of the new pixels overlapped with the original image. To demonstrate this, we take the same example as in the :ref:`quickstart` guide, but this time we reproject the array using both the interpolation and 'exact' algorithms, and look closely at what is happening near the boundaries. We start off again by reading in the data:: from astropy.io import fits from astropy.utils.data import get_pkg_data_filename hdu1 = fits.open(get_pkg_data_filename('galactic_center/gc_2mass_k.fits'))[0] hdu2 = fits.open(get_pkg_data_filename('galactic_center/gc_msx_e.fits'))[0] As before, we now reproject the MSX image to be in the same projection as the 2MASS image, but we do this with two algorithms:: from reproject import reproject_interp, reproject_exact array_interp, footprint_interp = reproject_interp(hdu2, hdu1.header) array_exact, footprint_exact = reproject_exact(hdu2, hdu1.header) Finally, we can visualize the footprint, zooming in to one of the edges:: import matplotlib.pyplot as plt ax1 = plt.subplot(1,2,1) ax1.imshow(footprint_interp, origin='lower', vmin=0, vmax=1.5, interpolation='nearest') ax1.set_xlim(90, 105) ax1.set_ylim(90, 105) ax1.set_title('Footprint (interpolation)') ax2 = plt.subplot(1,2,2) ax2.imshow(footprint_exact, origin='lower', vmin=0, vmax=1.5, interpolation='nearest') ax2.set_xlim(90, 105) ax2.set_ylim(90, 105) ax2.set_title('Footprint (exact)') .. image:: images/footprints-3.png :align: center :width: 80% As you can see, the footprint for the exact mode correctly shows that some of the new pixels had a fractional overlap with the original image. Note however that this comes at a computational cost, since the exact mode can be significantly slower than interpolation. reproject-0.3.2/docs/healpix.rst0000644000077000000240000001162013173065713016551 0ustar tomstaff00000000000000************** HEALPIX images ************** .. note:: Because the functions presented below use healpy, which is licensed under the GPLv2, any package using these funtions has to (for now) abide with the GPLv2 rather than the BSD license. Images can also be stored using the HEALPIX representation, and the *reproject* package includes two functions, :func:`~reproject.reproject_from_healpix` and :func:`~reproject.reproject_to_healpix`, which can be used to reproject from/to HEALPIX representations (these functions are wrappers around functionality provided by the `healpy `_ package). These functions do the reprojection using interpolation (and the order can be specified using the ``order`` argument). The functions can be imported with:: from reproject import reproject_from_healpix, reproject_to_healpix The :func:`~reproject.reproject_from_healpix` function takes either a filename, a FITS Table HDU object, or a tuple containing a 1-D array and a coordinate frame given as an Astropy :class:`~astropy.coordinates.BaseCoordinateFrame` instance or a string. The target projection should be given either as a WCS object (which required you to also specify the output shape using ``shape_out``) or as a FITS :class:`~astropy.io.fits.Header` object. To demonstrate these functions, we can download an example HEALPIX map which is a posterior probability distribution map from the `LIGO project `_:: from astropy.utils.data import get_pkg_data_filename filename_ligo = get_pkg_data_filename('allsky/ligo_simulated.fits.gz') We can then read in this dataset using Astropy (note that we access HDU 1 because HEALPIX data is stored as a binary table which cannot be in HDU 0):: from astropy.io import fits hdu_ligo = fits.open(filename_ligo)[1] We now define a header using the `Mollweide `_ projection:: target_header = fits.Header.fromstring(""" NAXIS = 2 NAXIS1 = 1000 NAXIS2 = 800 CTYPE1 = 'RA---MOL' CRPIX1 = 500 CRVAL1 = 180.0 CDELT1 = -0.4 CUNIT1 = 'deg ' CTYPE2 = 'DEC--MOL' CRPIX2 = 400 CRVAL2 = 0.0 CDELT2 = 0.4 CUNIT2 = 'deg ' COORDSYS= 'icrs ' """, sep='\n') All of the following are examples of valid ways of reprojecting the HEALPIX LIGO data onto the Mollweide projection: * With an input filename and a target header:: array, footprint = reproject_from_healpix(filename_ligo, target_header) * With an input filename and a target wcs and shape:: from astropy.wcs import WCS target_wcs = WCS(target_header) array, footprint = reproject_from_healpix(filename_ligo, target_wcs, shape_out=(240,480)) * With an input array (and associated coordinate system as a string) and a target header:: data = hdu_ligo.data['PROB'] array, footprint = reproject_from_healpix((data, 'icrs'), target_header, nested=True) Note that in this case we have to be careful to specify whether the pixels are in nested (``nested=True``) or ring (``nested=False``) order. * With an input array (and associated coordinate system) and a target header:: from astropy.coordinates import FK5 array, footprint = reproject_from_healpix((data, FK5(equinox='J2010')), target_header, nested=True) The resulting map is the following:: from astropy.wcs import WCS import matplotlib.pyplot as plt ax = plt.subplot(1,1,1, projection=WCS(target_header)) ax.imshow(array, vmin=0, vmax=1.e-8) ax.coords.grid(color='white') ax.coords.frame.set_color('none') .. image:: images/healpix-9.png :align: center :width: 80% On the other hand, the :func:`~reproject.reproject_to_healpix` function takes input data in the same form as :func:`~reproject.reproject_interp` (see :ref:`interpolation`) for the first argument, and a coordinate frame as the second argument, either as a string or as a :class:`~astropy.coordinates.BaseCoordinateFrame` instance e.g.:: array, footprint = reproject_to_healpix((array, target_header), 'galactic') The array returned is a 1-D array which can be stored in a HEALPIX file using ``healpy.write_map``:: from healpy import write_map write_map('healpix_map.fits', array) .. note:: When converting to a HEALPIX array, it is important to be aware that the order of the array matters (nested or ring). The :func:`~reproject.reproject_to_healpix` function takes a ``nested`` argument, and the ``write_map`` function from healpy takes a ``nest`` argument. Both default to `False`, so the above example works as expected. reproject-0.3.2/docs/images/0000755000077000000240000000000013173066302015625 5ustar tomstaff00000000000000reproject-0.3.2/docs/images/footprints-3.png0000644000077000000240000002421512724021736020711 0ustar tomstaff00000000000000‰PNG  IHDR—Lž}—àsBIT|dˆ pHYs M MÒέN IDATxœíÝ{”duuèñïž ˜yHP "ÄŒÆ ‘1V"f#1Ñ{I$1^¹&<|†H5â5ˆ@$¢Æ¸ôR€A¢&@¸ “yÀàLÏ@ã̾œÓRÔTwWOýº«ºúûYë¬ê:çW¿³ëÔé]»Î32I’$©„Eý@’$IÃÃâR’$IÅX\J’$©‹KI’$cq)I’¤b,.%I’TŒÅ¥$I’б¸,$"NŒˆÍ“ ¯˜…ùgFDÌBßÏ©ã>a.⊈½"b}DØ2ø§­˜ÿòˆ8+"šékçZËr~ãV¼öÔˆ8ªÃø³"bs™;Îw$"cgkÒ\2wo}\r÷ šê{!"¾ŸèG\ÃÌâ²¼À/· ÿ: ó9 8(ž €û©âþÊV¼ö0fן_ÍÌ[[ƽxÛVÌ'à `à‹Ë[s'ƒS-ŠKà|ªÏnVdæ8ðàìˆØv¶æ#õ¹»LîDS}/œ¼9"öŸÛ†Û’~0„nÍÌ;çp~ÅTý‹uIf>üK¯Ýu9Ͻ€c_oŸ™wÌÅü»êèÉå²±TŸ…lñ3ó>à¾YžïÅÀ‡€××KÃÀÜ]w×å<;æî×)gÞßÞœ4÷! '·\ΡˆØ&"ÞwGĆˆ¸+"ÞKÚÚ=#".Žˆ‡"b<"þ_D×2ý,ª_a'váÔÓ&v‹¼-"þ:"VÕ»-¾Ïn›ÏÝñ™ˆ8)"î6¯î´»6"VFÄ#âÀˆ¸¡îó?"â÷»‰k oÌ̧ìoß-^ï²Ù¯‰ˆsëeóPÿò‰÷L|9œß²kë„–~ŽŽˆoÕñ?ÏšáréfÙvõY·‹ˆ—DÄõ²~,"DÄHk|À^Àq-ïñ‰Ϡ}™GÄh½Ìî¯×§;"âÔ¶6Ó.ß ™¹ø2ð{S½iX˜»;꘻ëþ¦Ì³õ²Û/n·CD|?"nŒˆÅõ¸ióaËëª_;k"âÛu>{Ó|/—ÇFÄŽÓ¼gu+3 À‰Àf`_ª-ÂÃâ–6—³€WRí‚x¸´¥ÍÀ«€“pIÝ÷[ê6{PíþÜ  üðKõ´çÔãï¾üfÛýÀ÷©~ÝNÌë.à^à;T¿@ Ø»¥ZÚ®Öÿ¼8¸´nwØtqM±Ü¾ ü}‡ñÿ\Ûòü°ºß;ÖËïà1`eÝf[àuu»÷OÌصžþÖzÚÀo¿]¿Ÿ;g°\ºY¶Ý|Ö–ó1T»i^¼œêЀ€¿kis`=ϯ¶¼ÇŸ­§lji»¸XüQËGêù~`&Ë·íóùŸõû[Öïÿ=‡^ÌÝSÆ5År›,wO›gÅÀõòÚ¡%ÎGg·ô5m>¬ÛýA=ÏÏS.ôëÀiu›ò{¡~ýþõô#ú½>ËÐ÷†ehIPíÃõõô_¨ŸŸÑöº?­Ç¿ ~~JýüжvW×I+êçgÕíµµ›H.·µY=þ¤–qwS»MÒG{‚Ú üj˸m‡óZÆuŒk’e¶ˆ*AŸÑaÚut../jk÷1àñ±ŸÔÖnGª{A‡÷ºxû –Ë”ËvŸõ˹­}P}Élvj™vpq‡×œlny~d§yP}‘Œ»Ìdù¶Œyûúàà0ÌÝL×$ˬcîffyöÙTÅäJàwêy;Å<;æC`®˜âµËå¤)ú~8³ßëã° î/ïuÀ‹[†7×ã­/ikIÛôC{3óú¶v—O~¾Ë8®h}’™ÿLõK÷à¶vßÊÌuÙçúÌüzKŸOPýò|Öä/™Ò.TÉ⑼¦ý@õÛ€í"b·i^w0° ¸,"–L TËäû<¹ü'Lµ\&[¶'ÒtûYo¡Þ…ýñªâï ªãƒjËÊLJ•T/k)ÕLûÉ?Ý.߇ëÇÝ·"&i™»»7Yîî:ÏfæSmå<¸øtf^ÞÚÙ4ùðyu³—Qm5þäV¾²ª0Wc>+ÆzÊ»-;¾sýø@ÛøUmÓwîÐàÁ¶vÓYÕaÜ€g¶<ÏIæ5™G;Œ{Øâø—Y´ºíù†úqº&Š£k&™Þš$§[.“-Û=ê¿»ý¬;¹ˆj·ÕéÀ­Àzà¥ÀÇí¦xÝdvVgæOÚÆO¶>míò•æ;swïf’g¡:´g5ÕÙÜîÐ~ª|8û.õã½[òOÍÆÙû –ÅåÜ™øÒ~O\ OþRZÝòØi U{»étúö3À-mãfrœÒÿ|?áÉä0›&’ÚÛ;Lk{>Õr™nÙvûY?E}úoQíšùXËøNËtV;GÄ’¶s¦ëS»]ëǧl%Íæî-M–»gšg?Nµ‹ýNà“qHfn‚åɽ({RÛ9cT®ù¬w‹Ï‰]¯o?q&áu-{FÄËÚÚ½êíÄ?ÏÄ¥í'™ßŠú€ˆ8„jËÚ7gõSu“̦‹ëÉÎ27ÿôR4n¹œ#Y]KëêcP¾Iu|ÊŸ—eæÄ¯¼•ÀÛ/DÄŸR]³ð8ª3¯>6žüUøŽˆ¸’ê áÖŒˆˆó¨vUü9Õ16­×%œé¯ÙÉÚ·ŽŸ.®vW'GD´¼·­ª$þð;ñ]ª³ïÌÌÕñNàãñtàJªÏ÷~ø§Ìü».ç;å²ÍÌÛºü¬Ÿ"3×DÄ·¨–Ýõû8‰§î›ðïÀË#âˆú=?TÃÔîÿßþ¶~ßÿ¼šêx²fæÖn¹üàÛ™Ù¾%B*æîIm‘»3s¬›<? |‚êÄŸÏÔËì숸*3¯ë6ÖóüßÀÇ"â ªãËǨ®ªñxfžËß u7¿BU€¶/«­Õï3Іe ú5µ Ø{Š6ÛPý2»›êx—»€÷ÒrÉ‹ºÝîT‰ä!ªƒ˜oÞÐÖf0ñO³‰úò3Õ÷Â×épÉ5‡­&. !ÑrÁØ“3óÂþFÓz«À¶™yL¿c™Ê|\¶³!"Þ¼ Ø/37L×^Òôæc~™/¹{*ñóT?^”™·õ;žaá1—ïq`¿ÑÔêƒìß ¼ËÂRZð†!w¿ø”…eYs©¾ËÌ{¨vµjÀeæ8[m0JZHºÙr¹88µ}BD,šÀ À.@89":µ=XZ?¨ÛIÒ,3JZ0¦-.3óªÌ¼¸«Ãä£ë>NÏÌ ™yppJk£ˆØxð–ÞC–¤ùÅ<*i!éõ˜Ë[2ss˸›€½#bG€ˆàBà}™ùÃç'IÃÆ<*i¨ôZ\ŽkÚÆ=Ú2 àm@fæ=ÎK’†‘yTÒPéõök€=ÚÆíT?®ˆçür[›˜¬Ãf³ÉøøxaIR¥ù 4WÕO–ŒÓh6i4}©yTÒÀ›I.íµ¸¼8."gæ¦zÜK€d溈XAu€úÍÕ^Ÿú|D|63ßÚÞa£Ñ`dd„7öš$Ac÷j`é Va æQIóÀLri7—"Z#À¶õ¨‘ˆ©ú° xO=îÀ;€×m/~xa=Xÿ=à´™½-IšŸÌ£’’n¶\ž@u 9T—¾XWÿ}Xf^ ª$ø°øDf~ 3oí¬þåýpfþ¸÷ð%i^0JZ0¦-.3s%°rŠéßív†™é]$-(æQI ‰ J’$IÅX\J’$©‹KI’$Ó륈4KâŠr}åŠr}IÒlz `_§_[®¯šG¥®¹åR’$IÅX\J’$©‹KI’$cq)I’¤b,.%I’TŒÅ¥$I’б¸”$IR1—’$I*ÆâR’$IÅX\J’$©‹KI’$cq)I’¤b,.%I’TŒÅ¥$I’б¸”$IR1—’$I*ÆâR’$IÅX\J’$©˜%ý@’¤Ùðñ‚}½éºr}xX¹¾¤Aä–KI’$cq)I’¤b,.%I’TŒÅ¥$I’Š™¶¸Œˆ×GÄ ±&"6GÄ¢¶éDÄõ±."3Û¦Ÿß©_D\{–~#’4ÈÌ¥’Šn¶\®ÎNmŸË€&p° ÐNŽˆÖ¶›7ÖÓŸ$ðåÞ–¤yÇ\*iA˜¶¸ÌÌ«2órஓ®û8=37dæmÀ9À)-¯wfþ[fþ$3×ÔÓ_Ë˼I|æRI E¯Ç\Ü’™›[ÆÝì;NòšWw×ÉQ’d.•4Dz½ˆú(ОØm™¶®uBD¼8ƒêWº$©b.•44z-.×{´Û©~\Û:2"Ž>—™WMÖa³Ùd||¼Ç°$©Ò|š«ê'KÆi4›4¾ÆÔAÑ\j•TÚLri¯Åå­Àq±837Õã^ü 3úK;"Ž£º׊̼fª###lܸ±ÇÐ$ »WKG`ð K(œKÍ£’J›I.íæRD‹"bض5#À€MÀ{êq/ÞAË-]#âàcÀÓ–’4¬Ì¥’ŠnNè9x ¸’êÒëêç/¯Q7€CG€«€ 2ó#-¯ÿ`àʈk)ø>$iЙK%-ÓîÏÌ•ÀÊ)¦—*!N6Ý»IZðÌ¥’ “•$I’б¸”$IR1—’$I*ÆâR’$IÅôzKÍqE™~rE™~$i.lš¾I×Þöp¹¾nÜ<}›n-r‘«¥$I’б¸”$IR1—’$I*ÆâR’$IÅX\J’$©‹KI’$cq)I’¤b,.%I’TŒÅ¥$I’б¸”$IR1—’$I*ÆâR’$IÅX\J’$©‹KI’$cq)I’¤b,.%I’TŒÅ¥$I’б¸”$IR1Kú€$Iƒî[ûúÔÊõõ–åú’JqË¥$I’б¸”$IR1—’$I*ÆâR’$IÅL[\FÄë#ↈX›#bQÛô"âúˆX÷EÄ™úxO=m]D|="ö/ù&$i™G%-$Ýl¹\ œ œÚ>!"–Mà` œ§¶´y'ð&àUÀ®À@3"vè9zIšÌ£’Œi‹Ë̼*3/îê0ùèºÓ3sCfÞœœÒÒæçdæí™9œlÕsô’4˜G%-$½sy pKfnnw°wDìËgÿ21137·õ8oIæQIC¥×‹¨kÚÆ=Ú2mqý÷;´YÖã¼%i˜G% •^‹Ë5Àmãvª×òdR|Z[›{;uØl6ï1,Iª4„æªúÉ’qÍ&F£¯1µ1Jx3É¥½—·ÇEÄâz7 ÀK€dæ:€ˆ¸ø%àÛõó%T»>Ý©ÃF£ÁÈÈ7nì14I‚ÆîÕÀÒ¬ÂÌ£’æ™äÒn.E´("F€mëQ#1|ؼ§÷àÀÇ[ºø?ÀŸDÄþ±x°øâLߘ$ÍGæQI I7[.O.¬ÿN`]ý÷a™y}D4¨’à#T»p>‘™™xqfþe}©k¨ŽúWà72ó±BïA’yTÒ‚™ÙïZkFGGëw,j“+úÔ£¥ËàâµË©Š¸adpŸ,Ø×[ÌËê‡ir©·”$IR1—’$I*ÆâR’$IÅX\J’$©˜^¯s©$®(×—'IZ¨N+Ø×Q”ég×g”éG·\J’$© ‹KI’$cq)I’¤b,.%I’TŒÅ¥$I’б¸”$IR1—’$I*ÆâR’$IÅX\J’$©‹KI’$cq)I’¤b,.%I’TŒÅ¥$I’б¸”$IR1—’$I*ÆâR’$IÅX\J’$©‹KI’$³¤ßhaŠ+Êõ•+Êõ%I³muÁ¾þ×eú¹Ð<ª‚Ür)I’¤b,.%I’TŒÅ¥$I’б¸”$IR1EŠËˆØ)"΋ˆ{#b,"®ŠˆýZ¦·FÄšºÍ‡#bÛó–¤a`•4,Jm¹\ ìì Ü\ÛGÄÏŸ>™Ë— àÌBó–¤a°ó¨¤!Ðó¥ˆ"bààÌ\]; 8xð°.3?™÷DÄWƒz·$ ó¨¤aRjËeÔCk¿A•ø®6EÄ"bqD<8ø|¡yKÒ00J =o¹ÌÌõq ðÞˆ8XœM•G3óGñfààÓÀâúñ¢Ný5›MÆÇÇ{ K’h>ÍUõ“%ã4šMF_cjg•4èf’K#3{žaD<88œ*é¬þê÷%ÀQ™ùˆØ½ž¾.3§­«Q`Íèè(ccc=Ç¥…Á;ô¨kK—ÁÅk–kûÍS˜Gµ5ÞT¨ïУ™&—¹ýcf>œ8ñ<"vÞ | 8¸13¿Q·}0"Χ:8]’„yTÒð(u)¢}ëDHDì\ |-3¯þxyD•§'7•˜·$ ó¨¤aQꄞC€›#b=p-p3p @f~šjWϧ5ÀwÇã Í[’†yTÒP(µ[ü"&9°¼ž~6ÕÁ钤̣’†…·”$IR1—’$I*ÆâR’$IÅX\J’$©˜"'ôH’¤¹7é`3ôæ,ÔpÈo•ëKó“[.%I’TŒÅ¥$I’б¸”$IR1—’$I*ÆâR’$IÅX\J’$©‹KI’$cq)I’¤b,.%I’TŒÅ¥$I’б¸”$IR1—’$I*ÆâR’$IÅX\J’$©‹KI’$cq)I’¤b,.%I’TÌ’~ õ*®(×W®(×—$Ío}¢\_·l,××6Û”ëKsÇ-—’$I*ÆâR’$IÅX\J’$©‹KI’$S¤¸Œˆ"⼈¸7"Æ"⪈دeúvñÁˆ¸;"ÖÕ¿[bÞ’4 Ì£’†E©³ÅWÛ볫#b¿Ì|ø°ðŠÌ¼3"vv.4oI+1J=—±ppHf®®Çœ«€W{eæÃõãýÎ[’†yTÒ0)uÌeÔCk¿¼ˆ*!Þœ÷GÄ=qaDìRhÞ’4 Ì£’†BÏÅef®®Þ»Õ¿À?D•G]çSíîy.ðb`Oà3½Î[’†yTÒ0)uÌåñÀ9ÀÍÀbà|àª]6Û ¼«>nèñˆ8¸1"F2s¼µ£f³ÉøøSFIÒVk>ÍUõ“%ã4šMF_cš„yTÒÀšI.Ì,@DìÜ  <ø4°¬NŠDÄÁÀ ­ãj£ÀšÑÑQÆÆÆŠÇ%MÇÛ?¹¥ËàâµËµ}ŽfJæQÍ¥_(Ø×-¯-×—·PÓäÒR—"Ú·N„DÄ>À¥À×2óZà‹ÀýÀëKiìœ|¥-!JÒ‚e•4,JÐspsD¬®¥Ú­s @f>ü:°?Õîïÿ ¼±Ð¼%i˜G% …"Ç\fæEÀESLÿ>ðªó’¤ad•4,¼ý£$I’б¸”$IR1—’$I*ÆâR’$IÅ”ºˆº$Iš§n+Ø×ǾT®¯?öÚÃó’[.%I’TŒÅ¥$I’б¸”$IR1—’$I*ÆâR’$IÅX\J’$©‹KI’$cq)I’¤b,.%I’TŒÅ¥$I’б¸”$IR1—’$I*ÆâR’$IÅX\J’$©‹KI’$cq)I’¤b,.%I’TŒÅ¥$I’ŠYÒï¤AW”ë+W”ëK’æ‹3 öõÛÿU®¯=÷)×—¦æ–KI’$cq)I’¤b,.%I’TŒÅ¥$I’Š)R\FÄNq^DÜcqUDìסÝ/FÄÆˆ¸¡Ä|%iX˜G% ‹R[.W{»·WGÄö "b¤nw…æ+IÃb%æQIC çâ2"vŽÎÊÌÕ™¹8 x𺖦®¾D¯ó•¤aa•4LJm¹ žšèÕψˆC©ç»1!JR'æQIC¡ç‹¨gæúˆ¸xoD¬ΦJ~£±#ð)àM™91uNl6›Œ÷–$Ð|š«ê'KÆi4›4¾ÆÔÎ<*iÐÍ$—Ffï‡íDÄÓs€ÃÅÀùÀ àKÀÎÀ†Ì|{Ýö,àðÌ|y‡®F5£££Œõ—ÔOÞ¡g-]¯X¬ís4Oaհر`_ß;°\_Þ¡§ iri‘Û?fæCÀ‰Ï#b7àÀ×€ €§EÄêÉÛÛDÄCÀK3óÎ1HÒ|f•4,Š—±/ðãÌüQDì|øZf~-"~™êW8T»xþøà(`UÇ%i1J¥Nè9¸9"Ö×7ÇdæªÌ¼¿î£Ú|º¡~¾©Ðü%i¾3J E޹,Èc…44<ær ð1—™GÕWs¹L“K½ý£$I’б¸”$IR1—’$I*ÆâR’$IŹ‘¤-ÅeúñÄ Ióɺ‚}ýÑ­åúúœ'ôÌ·\J’$©‹KI’$cq)I’¤b,.%I’TŒÅ¥$I’б¸”$IR1—’$I*ÆâR’$IÅX\J’$©‹KI’$cq)I’¤b,.%I’TŒÅ¥$I’б¸”$IR1—’$I*ÆâR’$IÅX\J’$©‹KI’$³¤ßH’$urEÁ¾š;k¬(××0rË¥$I’б¸”$IR1—’$I*¦Hq;EÄyqoDŒEÄU±_=í¥ñåˆx "ÖDÄw"âÄó•¤ab.•4 Jm¹\ ìì Ü\Û;Ÿ^™Ë?>¯-4oI+1—Jšçz>[<"vŽÉÌÕõ¸Ó€S€×eæe­í3󺈸ø5àK½Î_’†¹TÒ°(µå2꡵ßÚ¢aÄ(ðRà–Bó–¤aa.•4ïõ\\fæzàཱ[ýëûCT q´µmDl \|¸¤×yKÒ°0—J¥.¢~>^(,I ]óAh®ªŸ,§ÑlÒh4úÓŠäRó¨¤Òf’K#3‹»wGfæµ±ðª¹"3Ÿ˜ä¥£ÀšÑÑQÆÆÆŠÇ%ÍGé ÊYº .^ °XÛçh¦µ•¹Ô<*upeÁ¾üz¦É¥¥.E´o‰ˆ}€K¯ÕÉpwàëÀ=ÀÑS–’´ ™K% ƒR'ôÜëk©véSOû}à¨Î‚|´¾vÛXD|¥Ð¼%iX˜K%Í{³²[¼îΑڸ[¼ y¶[|+™G¥Ü-^Ð\ì—$I’ÀâR’$IY\J’$©‹KI’$cq)I’¤bJÝ¡GÒ,‰+Êõå™ç’ªS öõÝÇËõ5²´\_ƒÂ-—’$I*ÆâR’$IÅX\J’$©‹KI’$cq)I’¤b,.%I’TŒÅ¥$I’б¸”$IR1—’$I*ÆâR’$IÅX\J’$©‹KI’$cq)I’¤b,.%I’TŒÅ¥$I’б¸”$IR1—’$I*ÆâR’$IÅ,éw’$I³í¿ öuöWÊõuÖŠr} ·\J’$©‹KI’jÎúÍ#IDAT$cq)I’¤bŠ—±SDœ÷FÄXD\ûµL? "®ˆuq_DœYb¾’4,Ì£’†E©-—+½€€]Û«#biD,šÀ À.@89"NíÔQ³Ù,’¤­Ñ|°ßt6¨q´ó¨4JžÎvÝÆÔM^.¥T~Ÿ&—–Úry<Õ.š›ÅÀùÀÀÃÀ°g[ûêǵmã—í²Ë.{ì±?Ñh4h4…ÂÜ:Íf³ï1t2ˆq bL`\3Ñh6aÀb‚­«Ùl>e7q£ZæËØ2ÿô›y´Œ«{ƒ f\/À˜ ·ü>“\™¹ÕAN&"vîޤJˆçÏÌÌMõô·§dæóÚ_ <+”$U–÷å“_AæQInÒ\Z¤¸Œˆ}gæ"bàÀxf¾¦>ËñûÀ…Àûç_þ:3?ÒóÌ%i˜G% ‹R—":¸9"Ö×RíÖ9 3Ǩ.›q(ðpp Q’žÂ<*i(ÌÊnqI’$-LÞþQ’$IÅô¥¸ÔÛœMWD¼4"¾DÄšˆøNDœØÏ˜ÚÚýbDlŒˆf;¦n⊈í"âƒqwý9Þ¿Ûç˜ŽŽˆ[ëÏïÞˆøpDl[8†×GÄ õ<6GÄ¢¶éÓ®ÛñžzÚºˆøzDìßï¸"âìz_÷GÄeÑ~öòœÆÔÖö‹u‡÷Ó|b-S[»ŸG»ŒkVs©ytîbjk[,ökËåJ ÝælŽâÚØøð‚Ì\ü!ðшxmc "Fêv×1wgÀN×Ä»>ü"ðŠÌÜx1ðí>Å´}DüðYàõç÷2ªu«ôîjà\`‹õµ›u;"Þ ¼ xUýnšQÝÁ¥oq›7ÖÓŸOµž}¹Ï1M´='¯·ŽóY‰y´DL€y´Ë¸æ*—šGç.¦‰¶eóhfÎéìüxi˸í€À¨ü*`QËô?þ«ŸqMòš/éwLÀ_MõÏ}Ã|†‡»ÐzµXÝöš¿¾:KñF•HZ×ãi×mà.àZž/®_s|?ãêÐÏu?ËûÕ%zþxVÝÇ+æjëç`-“y´ë¸æ,—šGç&¦ÙÈ£ýÚr9ÕmÎ^È·9ëS\mÑ0bx)pK?cŠˆC©îIüî¶v³mªÏð•Tÿܧ՛þ #b—>Åtp=°)"Þ‹#â¹T×üü,ÇÔê@¦X·#b9ðlà_&&fuMÃ[é°ÎU\“¼æUÀÝ™Ù~ט9‹)"‚êÒ<ïËÌÎRƒÌ[qÌ4.ªÝ϶žKµ+gOà3ýŠ)3¼ø[`øOà›ÀE³SÓ­ÛëÙ;´™Í{ùÍè."^ œ¼µÏ1½ È̼`ãHæÑr1™Gg×äRóhÙ˜f%ökËåñTWu¿™jÅ\Í“·9[ <­­ýd·9›Ë¸¨ÑùG`à5m¿æ2¦GxrWÄ7f9†™Ä5ñ&ð®Ì|¼NFgú¸¦9)"T_ ¯ÎÌm¨î`²+pé,ÆÓn S¯Ûëw{›™Ýuº¸~*"ޤ:ì¸Ì¼ª_1Õ[Kþ xK[›¹ÜêÔoæÑÞc2Î0®È¥æÑB1Íj-qüAcv£:¶äÀ TÇ,n™þvà?ûWý|'àŸ©’â¶}^V‡Sí2yx¨ÖOÔïÝÇÏð8ªcv–¶L?¸}ÜÇt.ðmÓ xl–æ}[ÿ2íº ÜÉSZüˆ* õ-®zÜqT[^ÙïeœlhY÷ªûø1ð·sµŽ Ò`ݪ˜Ì£3kÎr©ytvcšÍ<:g+gÛBØØ­þ{àjàËõó‰{U¾^ÜœÚç¸v¾Cu–Ü’YV?Cõ«ñ™ÀT¤»~¾¸qm_f¦:|ª3Ö¾ÔǘÞHµ•â`ª_eO§úr»¾p ‹êõöUõ?éöõóvœnÝþ„êÀêý©ÎÜûsà‡Àö}Žëª­‡ ²ª—Í3yêú¿ømài³¹ž Ê0Íúní>&óèÌâšõ\Z _™GûœGguba¼©þ ××oôlZ~ÁÖ àúzúÀýŽ‹ê ÂÍÀXÛð•~.«¶¶g–üïñ3ÜêucÀ}À'{]Y ÄtðT»(¤:ÞëY…c8±^O6›Zþ>´ÛuxO=m=ÕeQöïw\uÛ Öÿ­N’%–U‡ÄÙâ]®ïæÑ.—U[ÛG»ŒkVsi‰Ü€y´¯yÔÛ?J’$©oÿ(I’¤b,.%I’TŒÅ¥$I’б¸”$IR1—’$I*ÆâR’$IÅX\J’$©‹KI’$cq)I’¤bþ?WBeïèGSIEND®B`‚reproject-0.3.2/docs/images/healpix-9.png0000644000077000000240000006163112724021736020145 0ustar tomstaff00000000000000‰PNG  IHDR:¯ÞN$iCCPICC Profile8…UßoÛT>‰oR¤? XG‡ŠÅ¯US[¹­ÆI“¥íJ¥éØ*$ä:7‰©Û鶪O{7ü@ÙH§kk?ì<Ê»øÎí¾kktüqóÝ‹mÇ6°nÆ¶ÂøØ¯±-ümR;`zŠ–¡Êðv x#=\Ó% ëoàYÐÚRÚ±£¥êùÐ#&Á?È>ÌÒ¹áЪþ¢þ©n¨_¨Ôß;j„;¦$}*}+ý(}'}/ýLŠtYº"ý$]•¾‘.9»ï½Ÿ%Ø{¯_aÝŠ]hÕkŸ5'SNÊ{äå”ü¼ü²<°¹_“§ä½ðì öÍ ý½t ³jMµ{-ñ4%ׯTÅ„«tYÛŸ“¦R6ÈÆØô#§v\œå–Šx:žŠ'H‰ï‹OÄÇâ3·ž¼ø^ø&°¦õþ“0::àm,L%È3â:qVEô t›ÐÍ]~ߢI«vÖ6ÊWÙ¯ª¯) |ʸ2]ÕG‡Í4Ïå(6w¸½Â‹£$¾ƒ"ŽèAÞû¾EvÝ mî[D‡ÿÂ;ëVh[¨}íõ¿Ú†ðN|æ3¢‹õº½âç£Hä‘S:°ßûéKâÝt·Ñx€÷UÏ'D;7ÿ®7;_"ÿÑeó?Yqxl+ pHYs M MÒέN@IDATxí]|Uö>)”P¡„Ð{i‚XQ (ÂbÂX°ì¢àZØ]·XÖµ»*úWYëÚ+*Í‚ ‚¤ Ò{ ’¼ÿù&¹//!„ä½yïMùÎ/7ÓïÜûͼ™oÎ9÷œ„€ŠPˆ D€"`‰6ÔÁ*ˆ D€"`!@bÁ"@ˆ°  Û dED€"@ˆ‰ï"@ˆ DÀ6H,lƒ’"@ˆ $¼ˆ D€Û ±° JVDˆ D€Xð D€"@lC€ÄÂ6(Y D€"@bÁ{€"@ˆ° dÛjbED€8‹/¾XöíÛW¦¶U®\Y>,999ÖqX®[·®T¨PA~úé§`]Mš4‘-[¶Xûbeùòå%))I:Üçx33fÌ8Þ&®'DÀÅX¸øâ±éÞCàí·ß>a§®¸âŠîSÒ§žzªlÞ¼YÖ­[gíÖ¸qc9çœsäÕW_ 6tèP™3gŽlß¾=¸O•*U¤S§Nòì³Ï÷{ä‘GdÖ¬YòóÏ?[ë@bºví*÷Ýw_pŸ‰'ÊÈ‘#ƒu~úéR®\9IHH°öA½£F’‡~8Hd°Ï¶mÛdåÊ•Ö> 6矾 4(Xoq3Ø^±bÅâ6q 1B IÈb„4OCòèÞ½{ð¥^”;v]U¦åJ•*Y/Ö]»vYÇU«VMn¾ùfë¥m*JOO—Hff¦YUêiŸ>}dÚ´i¥Þ;Ö«WOЯ¬¬,ë¸Þ½{[çþî»ï¬e´9%%EvîÜi-ã_jjª ?âþýû­uÕ«W—“O>¹Ð¹‡ &³gÍ–ÕkV[û´jÕJ@H&Mšd-ãÎ ‚’$6Áœ!D *XDVVê'>ùäùâ‹/‚]6_âÏ=÷\p]´fð2…)˜:ºtéb}õÿøãÑ:¥íõ‚4ôíÛW&L˜¬»}ûöù:xð`p]if ­€ ÇÈ\ ÿûßÿdÏž=ÖªSN9EªV­$(0íÜ{ï½Å’ŽPÍŒ©S"@NŒ‰Å‰1â>FÀ¨â O?ý´Ä‚0˜ó…NñlÚ´©,_¾<¸f%K–¿ìƒ\>sÊ/¿üÔbÔ¯_ßòÛ0š»ºLq®¹sçÍ0^x¡üúë¯òÃ?X§ö¤V­Z²fÍY±bE¡S·lÙ²Ð2ˆ!±à]@BÀm¨à…OÁ×u¨9 cÇŽ2sæÌ¸5©¨F V iذ¡@³±xñbë”Æ"T;­¶à¼Ð @óaäÆo”O?ýT@x pX…£+|L ¡?#@báç«ï³¾ã%ôúë¯{ýÎ;ïÈ—_~\vÚL·nݬQpŽtŠŒ;Vz衸7„Ê¿ÿý︷ èСƒÀ d‚Ñ1gœq†|ûí·òÌ3ÏXëð£húõë\æ ð"$^¼ªìS©S§ÊàÁƒ­e8ÂiÑ©2dÈk(ç²eËœÚDË14Z‚²œœli üñ°œRËz¾íQ/mÚ´\K8ŽB`bÙ´iSp¤ KCÍZ'ª“Û‰€[ ±pË•b;KDàÚk¯ níµ×‚óNžÁ×+FK8™ì8¿µ Ž­ðÓ8räȉvËöF FÙ­ F½@KâÖ«W/>|x\ÚÅ“H ±ˆA3àÙoœ)×®]+—^ziÌÎA%»}YG>D£-^¬/ih³Ã-rÝu×ÉÇtZEP2P8 C  éܹ³[ºÃvú Ÿ^x·tÔ—^zÉj.†TnذÁ-M/ÔNØÜ öv'š 5¶„…pâX”P]‰›B£÷%éžyu”ÔyDÄÀ4/.¨Î”B.ºè"ËÔ´jÕªRìíŒ]š5kfÅø0ÑNkÔ¨!ýû÷—E‹Y Ĉ p$N»">nÏ£>jõ —.]ê9$*œ TN¢GÖÐÌh· ¤Á$2ÁHÈ?a9‚``1p€\äj”D40rÃKÝ| paˆ«!è3ŽÍŸ?_þøÇ?bQÎ=÷\k­µÀD XÄtž²˜3òbòRluïBP3F|ðAOõ+VW¤|þ‰@ @2 •´$*Å8*©œO5vë<¶#$–!yñ=uÅ ¦¨Ý»wË÷ß‚=½Cqa&4Ã’1$Z1ÄÝ0Ž£Îî[ç5H,¼vEÜŸñãÇËäÉ“­~ðÁnixMÃÈ>ÈÃîèQFKÒ€‚å Ö|‚¤ê´’‹€N¡ÕÈÒ9Äç< Sì’qTK-l^U ÖAÃa¶ëì1â•뇀^ ¶Æ·$--M0âÈ„L7Dþ¸‚Ø„‰…M@²šÂàk –Øå½.xß~ûí–†ÂË}…ßîè—Eñ2 ¬€ L±­†Îa¾¦þGº1˜G ­0äd¤¢‚þ«˜’*™•ôèÜIN®&¿î\'›öå r¯‚|à8£é€I#tâM›d« ˜XÓ¦M­¡¯¦b8€"Ü9’ÏA`>¡» ±° IÖc!мysk Õl´_@„<öÀ¼ƒXÑC.@ P ÉÀz LA jëV h%jé´«–ö'U“.å$õÙ$©JMI¬¬F”ÀQÉ-_[ä×ŲLÕÙGʽgö’´æíZPŸñÙÐYÏ Â˜ƒü›*ASʸqãH2<õ£ßA‹ècìÙ3¬_¿^^~ùe+º “#XFã`”œåxà9ª/)JÞË8@€µ™šu˜F"¨$„š ,WÕÿÕtZW§­µ<2¤’Tž°OלX6«“ðüCÞúîmùhmNP{ÓÊ€¬8nJèvâ¿"‡âž^°`µƒ 8†L¸·Ýv[ñq-8$dž«EÞôð!¨Y³&} Ž…Ç÷kðâ7‚?¤4£5òö,ûc&¹€ÿ¦­”rÜT)I®Û¾[+U.[¥G3eØ]eöë% Îú?H4ÊV‘û÷Fð.˜IBƒÍíÝ»×ê|8(D $̦}¸Íç öÆÎ#áRµjÕ|K*‡ý÷³„’‡’p¡@ õa(iÿp¶aØ©ñ“ÈÔyŒY­g½?3[F6ËÀÒÊVm¹Jòæœåòõ²¥2ùÙg剺ÉêÇ‘§}A¿¼*##£luºtoh#CI´O>ù¤Ô©SÇzày@!ÇC€‹ã!ããõ~ø¡ÕûK.¹ÄÇ(Ûu/Ä¡8¶W¥[cÅ Í»òaþð`s¤q~4û˜e³=VSs~è)R¬’ _h[[^4P4†EY%°ñ{Ùöáƒ2æ•òÅ‚yrP£^&$&J¦CC„—µ‘îçÏ9sæXpáü ²‘’ä)~G€ÄÂïw@Hÿag…Ã¥¦²É—³ 4БɲnÝ:_ö?´ÓæµÜº];ùYýâEBÛt¼y´fLëéܧ]3¤íüMÇÛ½Të7j2±‡Úu—×t`+œGé}ÑýÔSe–¦°w2¥ê\˜;!|nn® ".¤E‹rèÐ!ùõ×_쑇yšB¼r%ÃèÇôéÓeôèÑ‚°Á V¸c’Š ¡öݶm[Á ι""*^ô0“ ÀO¢ç‚ÍrCýd ¬ûJm3¥ Ÿ¥‡Hý¶må¹À™yÃH¹¼f’4IÊ‘êG²¤œFò4£UBv÷Å,F”R#ª)RÇãY‚‚g ÅPcá³kŽ\ß|ó 6Ìg=/]wöÙK@K×kìUW»ùÒÓ÷ÈéWåHj©Ó ~Xü²Prïê'Ý&í’‡²OÉK¶Þ7Y99:—çWVÅ;,§vš¼ù曂è H¸‡x/ˆ…Bñ6$Þ¾¾ÁÞqÆdÖ¬YÁuœ)Œ@ëÖ­áßÿý¸D/·&‚C'P«^õJRaÏ÷Á9{Р`ßÊ:“;~˜|7n‚<² [¶Ö¯'ÝûÿF^Ñè²ÔÆ„R€ü/k#Ë~ÿûßËСC 6rÎSXxêrî ’y!Îý÷ß_x—ˆ@˜Œ1BšÝí‚ÑtUÝýë_åâŽí¥J·îy+Ëð?°s•¬;§‡<»xŸ,P}Å’ü¶¶… †S†j=¹+"€Bƒ1cÆ « ©ÿûߥ­š™N9åOöÙ¯"±ðà•Gnˆ‰ªçÁ.ÚÖ%h(V¬X!Gèéo¦n©Î(xù7J©$I:¤‰Î.ÍH–:[s¥ïﯓº[?–„Ž %áœ[%¡Åo$°àß"Íûè8׃’}ßy’<âϲí¦{åãÅY2_kZ«E{JŽdñòåràh–E, ½ÁÀ¹ ~uøÌë}Áÿ{î¹Ç"ª2‡á¬×^{mÁFι ×^ºÂ ¿ñÆlÞ{ï½Â¸t\àOÑ·o_ùüóÏ»7ø U…)Q=ÓuDÉ~¥XFTÏ:ßPpmÓ)–§œ7«ëòV]âp@KÍfMå Ž˜X£#ŠŽèZ C,Ì<µ JˆÀTÒ¥Këw9X‡6S܉‰…;¯›e§\®_Døâ¦"`? À…È HZÁ<ÈH¶ƒt`h+Öc_h#*Xkó¶L +ŽC`_¤è4o­ÿþÃ$‚‘iÐyä‘G¬8ˆJqnêžkl)¡T!)õLófÍ¥W¯^¥ÞŸ;F>~óò7¤ýÆ<|'éš ̃ ’HÃn-XíF‹ $¥V•!—_aå7A 8’bŠe„$GYAñ« à–!À9ˆ¨Ï»^xÁ¯°¸®ßÔX¸ä’M™2E>úè#yþùç]Òbg6³V­ZÖØû¬¬ðâ8³W±k•ÛG…Ä ) Le÷Ö­:—§í™ÈûªËKT wež†#o Òâg ˜+1šéì!ÈSô—¿üE~÷»ßYËüçLH,œy]‚­zøá‡-Ïi ÑbÍ ,œ!®B¦ˆÑF€p„&OKÑ%ìbq Ÿh@Cbb´'~& ƒ5ªyK Ù€ 1"ÅyÐâ¼kbµèŠ+®°ÉÜ{ï½–ÉÌÝH ð''#83f̳hMáøÔNÃ/Á—fQ56–±Þö/ê0…zCÚà¼8¿ !;v¬`jÄiíÃð6„6â´ö9?¶/ïΉä÷QN  iR¿3Î?ßòÏ@zö úû½fÌh‹h€l@›qõ%ƒ¥{Ûv–ShU]n©¿Óô÷ŠmæIà—ßoèý‡8<³30‡CƒqÍ5×ÈêÕ«ŠS ÆÂ)WBÛÈtxéÖ”Íûðsò0ûPÌ« /×¥š+„>}`u0ÇaD ˆ4˜VVzù*Z šöÌÒ^€”V-¾ÏAN°ìw3‰B`}µjÕJžòí·ß –k×®m-ó_| ±ˆî…κjÕ*¹ð åçŸ.´ž DÀi@£5±HvS§µÑí©É€ #K°œ¦¤¢’£ ÄçL${µ€T€dÀL‚yȆߣGÚÓ &øޏõŸ¦¸A/òÔSOIÏž=¥eË–$6^CÈ`ŠýTØ‹)b6@K R€&pÞÄ“ýZc‡ÄÒ€‰Ƽ&:×Té²¶ÖÑÍF–b¢³¾dgF°;„åG"´‡zÈ×xÄ«óÔXÄy8a‰=àóA“RôðeÍö!p¼{Oh1 ´Š’ˆš™(ˆ™òâñ pô4fj/ •æÍ›[þU·Ýv›•xþ”è#@b}ŒƒgøÏþ#¯½öšL:5¸Ž3D€ã!€× ´0‡@+ˆŸ04Ñùª:‘€id“Nwéq3 ù ÁPTàô^¿~}+6Fzzº•“ä“O>ÉÛÈÿQC€¦¨A[PñäÉ“-g"¤*'©(ÀÅÎ9¤h†Ÿ %º}ݳù«vŒp>|x¡NÃ$þÐHü¢Äa‹–ÅZ6jÁ¼±ŒîZNÖÒ\×dè&t „į’£©ìMÀ­mÛ¶Y&gdzÆ3yçÎ~…%êý¦Æ"ŠcŒu›6m\f:ŠðØZu•*U,Û*c}Ø ë1•aè1ìØ”è ššjp+©vc"y€ƒgs-Í´`Dc•ŽÍZÖhÉÔ“‰qò¤‰D,çÎ-[¶4øñB¶Þ’î—xl#±ˆêpÊD”̯¿þ: µ³J"@üŽ´(0‘`I]¥­•XÀ¹3]—ZÉÒj©DÃ8ˆ‚d`(*> $#D0BŠ=X؃£UËöíÛ-lc•¬ªêÕ«gc7QøJØ•›ˆ€«¨\¹²ôîÝ[&MšTb»A. ¥ÀÈ”&ºÔAÉE;-ȸzP Ò¹¯´J®5êÃVA,Ì0Uõ­ÀáÖ7m‚—ŠX„À½jU„%£„‹‰E¸È…÷ñÇËÓO?m%Ì YÍÙ(#иqcÝø(±A‘WçΛ“ùü,ô´bÅŠR¡‚ ü*j)¡€i¤¥–NZªiÁÐÕŸµÌÖ²]Ën-ƃڋˆ;tè`i0©—þp¸”uŽÄ¢¬ˆ…ì¿oß>éÔ©“¬[·.d-g‰€w@Ì…iÓ¦y·ƒè†§b4I^¼ ‘sT‹ÑPÉÖ¯WB1SË"õºØ£S UEì šGhŠêÖ­+ZÁ½~î¹çZóüWzH,JU¡=ï¸ãyýõ×éÈV•è/ÀŠÈz$sÑÇšgpIÕ¿üòK©íE‚–jZÿâd%½µ`I®ŠyZ~вP—à‹rA‚¡ ‘-ZX‰Î6nÜXd KB€ÃMKB§˜mH׋:4é_ @Q^Õ¾}{ÉÍÅ÷…øŒt M:Xš^ƒ$ÀÔ±G †¥~¥â%õ¬øP ^‘Ðb\ªåu騭„#U×›œ%0­P4ÓlnÀ"uˆâ‰ [ , ,¥@€‹R€„] :t¨,\¸°”Gp7"à=Ž%Ò{=õV@ ÅÀÔ.ZNW2qŠ–Tµü˜™§¹˜£12vj¡ÿEñ×?%%E~üñGiÒ¤‰•eµø½¸–‹RÜ&ŸIE)Àâ.žF`ôèÑžîŸW;‡ [ˆÈ‰à³T{ñoÕ\¼¬e^f®œT%A.VÍÅ•J4zjÁU\‹° ߃ ²|. Azî¹ç oäRj,‚P;óÒK/É]wÝ%{ö@¡H‰ 6”^½zÉ›o¾¯&ð¼ùPcß[þE\pADA@àÈ òÐZ‰ÄiùŒ†© ²v;2GÉF‘ Fh’øöÞygñÅåüóϷ†;¯uñk‰Åq°¿è¢‹„1åNŒW#qlœŒªcày:G"`¹ƒi$™Rác1DIÆÙ•T‰­Kä{%ßhAàk3<¾”<Nü/¿ü²ìÞdƒ‰…A"úé§Ÿ2çDL¸Hˆ€7€“&ü/ Á@‚3ø^ tIÓØ»ó´pü\¡š ˜Q\Ë8†ê¬ï©À ]‘+®¸Bh’’´8(” T8ènèÞ½»ƒZæı 8sBÜ…HÁ±@öjA‚³‰êwñ¦–ÿìÎQ¯‹é—–(Ãt®Ÿ’ $8C~œfh;ü.†T$6C&Õ¥K—ú½S(ò‡?üAN:é$áXeçÜ åË—| Pœ…‚ÂQœÀŽ;Ñgí |w#‹*L Ÿj§cCfìΕêÜyE…$¹J_íµ¤+á@Ž˜R8,UAȘj;wî,ø êØ±£YíË©¯M!‹-²Â¶‚XPˆ D ,À<’¦¥…‰J$úè´fR‚ìÌ Èd%yùGr­‘&Ðx˜ì©Ä¯De¾êª«d̘1+}2çkmV·nÝ$'‡‘ò}r¯³›D€”<Q¶i9 ”a—‹%j&¹&'I:ÕJáG’$u®&üÝZ h:Zø4UòÑRß~ûm rçwšÕ¾˜úÒ;1FT8ïÿío+ÈZJq&5jÔpfÃ|Þ*h]Ë•ƒžÁ>IaX§”¡¿ÿ©´á­¹²y¿’ŒúIrER¢\®´"C‰ŸÁï‚æ‘ü‘gdÉ’%–©½fÍše É^P‹;ç|E,¾ùæéß¿¿LŸ>ÝWË­ž2eJ0…±ºëº.>ÜumöCƒO!ñA.js'"rþGÉÅJ2¾Ú˜#mÒe ‹‘Zƒ¤©ø^à¥Bß AåÈ„%+ýÃi§&3f̰–½þÏ7>ï½÷ž\yå•’`µ"@ˆ(  òp–Ò8r^Z[Â×Hù?çå"Y«äiÙADàwˆŸ”<®¾új™0a‚4kÖÌÒdx—¤¿ªx¹ƒˆšùüC<ŒÉ«œ{¥ÓÒÒäða¸QˆÔT¤S_‡(øŽÁ‡ßߘ‚@lÕi¢ÚJr5‚VÏv‰rjN¢%X¦“Õ^àû"Ë*¦~ À‡íöíÛ­œSYYYÖ(/ââi.\… °üQœŒÆâÃ{ú…^pr3Ù6"àxæ»iÓ¦Öh·h6Ú ÇÓõ\5|\«¥ÛI ²KIÆ’y¹Hä¦ j/„|i×®EþÞ}÷]Á诉g‰Åe—]&sçΕµk×zíš±?D n ˆ…À‰É0uƒ–U;ñäšlY6/WZ÷I”‹¦äù`(¹@8pøf 2#É…‚/ãÆ“-[¶X×Ì ‘:=a Ùºu«ddd˜kÄ) QB aƲaÆ(ÕÎjÝŽ´(HÃ~‘‰+«ªSç‹,ß, þ›-Ïï;*È–ºG 40‹ÐïBA("Åø¯ý«ÈZ÷,º^c1oÞ‚_>Œ×³Õ,òç92íê¿J`þk’Üãr©7a“Ü6´£QM’:jA¬ ø\¨¶ƒ’ò^µlÙRYÚéâš8A_(D€"à^0¼q.h¹[›šv$žû7 h‘%‡‡T“ç?Ê–«Ã篪°ÀUë"ïz«Æ×ú8»öÚkå•W^É[éÀÿŽ×X|óÍ7–G3I…ï6Éw W…D‚:çb­j.îW÷Î)·¾$•Ÿ«z¢¼T|¿üþÕÛäæ|ÍE5%ŒsQ€¶Ñø¾úê«2|øð‚ ›s4±øé§Ÿ¤W¯^ÔT8ì¦)ksÎ>ûl˳¹¬Çqç!жm[ç5Š-*,ÓþÑØA´öjAr²þ¼U¶];XŽ.ûJÉE²$]ó¤Œüâò{%ùfpH0„ÉÍÍ•»îº+dƒfê ²zõê@ÕªUé¼ã¦“N:‰×Ñ×Q[¼ŽÀ@Éa@MËŽ¸–’¦åbuèüîôú…^GY³Þ¼(ÉSu:5Ö:ó;lÔ¨Q#F4Bg!Üœ°àÈQ!Ó§O‚g@ä´à†"Ä‚÷ï¯Ü†\œ¦bYÿ#«æßGžº&ðaÛF¦:äÃV9ZäØ{ôèÑAÌœ0ã8SHvv¶ V:l¹ƒÖßN ë[5‚+zôè!®6¸ ç±cÇJ¨ç3¶c?#8¾hö8œ'ÔvŒDK#FŒ0‡XS,c½¶Ï !Öu"~bÝw¼ÿòî þ>øû(íóù$}>ïS¸V«YäÎÙ™²û=ÍPÈs×,?êU¹hʹ«c{颴0J¤ ŸÏÁ› ï·SN9E&Ož,#GŽ ®ûŒØMhôÅOmEˆºKo×âѸqã@ófÍ]Û~7c­¶+)çõtño2ô¾@\™ÐåxÎ+aèðÒ@=ÕLœ«š‹Ÿ~^èk!ptÒ³É'µ´ÒíéùûRsQðn¸ä’K¬kY´8.8Ê¢Ž(޹Ñãù#óʹõ«•~2y ™{’Ä¿àan0qëT5 Ž{ÞÂÔ@ZšG$ðë©5C{‚¯ÇÜïž ¼ > ðË€ …ä¢ðýX­ZµÀ–-[‚˜ÅkÆ1Ä(ný²Ý…onâA~¬ŠgŽ ;‹BñHáLñˆä:ÚÍI=ƒb³¾+ŸX²R<óÉùò`ó*ºEÕO.«ž(iªÙ€†Cý-¬Q#Á|:søða«çx·"Bg\$–,¦è¹þûßÿ’e’ióà=À{€÷@±÷œ3+ki¯š‹NnPôØvCÏÀª¹¨›¿²¢ê‹”E1hÑ¢EÜ‚gÅMc1uêTÑ!2q!S<) D€8h-ðýÜ"ÎÛ$«ºeH`ÍŒ`Ãk¿8[þrUS¤º èÒ”XPk‘Îdåʕҹsç ^1›9†Æh…v¬Òƒ¤§§*W®ÌkëÁk‹ß¬±ßò÷ë­çbÎ8ùšbäG5-W©vbáoN+ô–ÊÙ²6ðnj­Àêoa¨U‘"…ïÏI“&Â,Ú 1×Xh‡¤wïÞzS¼ˆ®-®1Å›hè`ovÌç½rú3#>>ýcûqÿßÉ®;ú¯Xb&òÛ¹ÿ–¿tI–JùIËt«’ J> ­[·Æ ˜7=tèûbvyy""`/—oœÃì­™µ’Q€©£†¡¦¤Èø½{$¡ÖäIöÜwå½Ó®’¿çd˯úÁ3 ÈE¬ ª¹ˆ 1×Xp´@L®+OB¢‚IET`e¥¥@Z ø[ìRÒðµ~ ¾S¾²¾}"xdrKeè;×É¥ª«@ºu¼Ü hGp7_ÎL™2Et°DÌ> bJ,yä_^T¿t:4ù›_úÌ~¯  ©ÔEÓp;¾;YÚÂMJ.îWÄûgþ¹P{“‡[†*¹¨®äƒÞiÙ°aƒ…S:Ó4Sbq÷ÝwÇ KÑö5õ·lÙÒÑ^ÇŠ4Û!åË—'†bèôû‘7½ûœ(W®œ«~¿ýQKËŸ41ٞɯ˜WMÞôè‘ÀGMêºêH†j%,súo+í6lX@ÓgÆ* K1IB¶páBAôø '? žÃ»/5^[^Û²Þjâ jc žu_åä@ààö‚Wdnn ÷—™¿+éh¤Û«è~Ø¿¬çðÚþ.®æ®ÀÀ °ŠÂ\LL!]ºt¨`(D€"@ì@Μ(žõîÁù ïyJÀT$¡ÑrÅÓ÷YŽœUÕ,¢$Ä÷þp¾ÎÎΖO>ùD¾ýö[ ªhü‹:±¸üòË£ÑnÖé Rtè×СCÔ"6%ZÔ¨Q#ZU³^ ‘‘!çœsŽZRº&˜ÈœÈ)r߬ù’;ñúB6ÿýŸäµ–å, 8qr”Hü˜u\ávìØ!kÖ¬qU‡ µÀH‘íJ.üö 9ðj.‚’ -¾ß(¿©&µUkde Îûì@Tf`EÐ Ô2nܸ¨ÔU Íï{›–^5b@ xðà=å{Nš ÔŸbrër=³¦òÈzh¨åoÑ4ßßB‰¯‡bpî¹çÂÉ®…¨FÞ„º…u¢CY+ D€ -†–¶ÓÐXSN©"Õ?Z ÍóvÈ:(¿ž^SnšwTfK®dêZFå̃FÉDÞŒÿ£f yúé§I*l¼PN­ Au:uêäÔæ±]D€”ªU«JëÖ­ËxTüw‡¿E®–Ÿõÿð9dͨÁÒ(©ÏL•ÑÍR¬ÀY:JÄ2‰ÀïÂÏ‚HØPØ-Q#YY°zQ¼Ž@•*U$)Éï?O¯_å‚þ ò°.XÍ9!päÈiÐ@ƒN¹Pò/5h%þï½%’ýÑHíy¦œ=°ª\¨{¤©¿4HVægAÀ»fÍšY#ElÅÁ.›JÑz´‘´aÞ»ÚµkÇkê±kêµgµ~æX±ëÃôÆ…_MG~9¯bàäüëêÈéëûY? ­þ«…¡0N.EEcѹsg[É+#DÀ,]ºÔ a+ˆÀqÀ(¼-—«Öbܶ ²áT"µ?oïäŠRñ‚¿Ècu“%Uõ0øy„HNÐ5j”5µë_Tˆ…]c=ÎG 5U}±)D€x $ts&j8f‚0,Pr1黲ƧÁë“~ëÝÒ½oyé¤Ä)Øñô»1×ns¶íÄbÑ¢E‚Bñ>xøŒ1Âûeƒ4lØ08Ïï"žž.¿ùÍo\ÝÁ}Úú£ZžÒ,¨¯Ý|&*ۙߟ)÷ç©rOÇò¡¨ªkýîkqï½÷ b[Ø&šRŽ9\æk›ûÏëïå{@‰$ß|ƹ怅ŠÜ-I¯ºäfßY+žxZs‰ ˆ¦WwMŸ¢ñ|Q'|«ÿ‹/âÉŒí í4…"0~üxöŒÝò"ÐXà%÷šfùïüyrè½ÛƒÝlñî$éÞ*ÑŠ{_ Däô«IäÀA\옱•XÜpà v´‰u¨#à×HÔå ˆ€Ã€¿‚LU¥Äç—ýŸ6ÿ˜×Šդݭ#dRŠj Al ¿KÇŽmÀVbaK‹X‰kpkâ1’ ×ÜblhÐpÏ’––ÇØwjŒ Y¯ŽœÓ´|yWÖ¢ÚÈǤ»Æël­Ä‘;ý*tتU+[ºo+±˜5k–-b%î@à‡~pGCó[ Bu§ßµ"¹htÖ=w»lÙ21ÃÝÕò­ŀJ˜Diù@M"[?þVr¿¼?o§ò•¤÷ÏïJ“Š ÒXŸ x6øuø)’ÏíÝ»WÞ{ï½ûl½"à<ðbntj+"»>6lˆ¬Mâ„LÐZ ½úÃ[öJæmýƒ-i׬‘\¢®›õTggÒ«ûU&Mšq×Íó6⊻"b]UAíÚµ¥zõêŽo3HÈŠj)(D€”-Z”aoçï UÄ%Ërrå«5[%0óQ«Ñõ®ë'çÕHTΩ¡æ?>/ðLGºHÅ6biCx¼»@â;nÀhö:”T`‚<8(eG@s…”ý áZzôèáÚ¶×pøZ`„ÈF} üß‚ý²ú÷WŒLIìû7iÚ:Az*©ÈÔm!âÇg’‡fdd]™ÖÙB,¾ûî;AF<Š˜3gŽ8Y-nHnð¢¤Ä‚mÛ¶ ï@åJÞzë-W¶»¤F#½:4˜K•@<ºê¨d?s¶6|/ÕŸ"MÔ½»‘~~€€¨O†ï$33SfΜ)7ÝtSD}·…XÀ{øÐ!X¯(D þ@… ò€›Û¨3Íîǯ;¯Èĉí¬Žu˜#bpP0‰Ì>%“Çü ¹+¾”¤VçÊж RW·eXÔ£àùóFÆù„‘Ž 1ÏÛ8wƒ§'ö `ˆ´˜Ç—‰ÑXMÉ…=X³"àVrµáøÞ¡e¦Æ¶XóÄ3’˜»U*7+/gZŸ$be>ukÿ"iwJJŠ”/YD[ˆÅçŸI?x¬ °;Í®]€4€PàÆ©@Ü #†X˜eN‰( /¼Pêׯ_òN.ÜŠçÊAÕZLVb±ð³rpâ©T+WM! ÒVKÑç‡ »V“á°‹„dË—/ëxd ±ˆTmvëy`ÜpªíD75H87C*Ì4o-ÿ—1cÆ”õîïb`oßµk—‹{pü¦GÎ=ºËëJ3²]G¥S¥"UóŸF züš¼µE‘É_|!ð Wl!វǹíÛ·;®ñ¡›‡Ž›Û¬Ãƒ¶UšA„ä•W^‰àhê6‰ÑËþsx&ì×ÏŽÍ:}ê‡Y7/ ‰ú5r†>=༩YOíùúÖzü$$~ºÚî«ñ§€†ÂøW ±¤š j+€FdâÕ¯×ÈPáÑnEÏh.6èSb¹>!æoΕ];a"i®ÏldzÅoZ írDBb|þ<¸B… ‚„5N˜?`©¬Ð <@,P¨­P(D  ¤¦¦Ú–˜ª §Ù®x&€XÀ‘s¶>%–)•X£¥‰>= ­€Ö/ɼOñ‰ 2$¢ž’XDŸ?NJJC°n¥>9ÖjA0-ªqãÆrÞyçÅüØ ©€-¹V«i1ë¡ÊÄvf±Ql’ŠAÛ(~BàÎ;ïôEwÍóÓ…J,vjYw¼ÑŠúíd‡¤J¤b OH,ÂÃÍ×G!ùØ”)SâŽn^èM@*@(êèßVøúØ¥|aà!¢A±Ñ£GÛSkq O>ù¤kÚICñœÍxõ«>C Ù0:£ÁˆäYÐtâ9½,æè<È–ºœœ9zÜ=ö‚7Æ•#h ¾ZéÏ_i:¯ˆú³Çƒ¶RìK±Pˆ½5³6'"Q<'ö©4m2†^ YÑÀG ž/xaâ¹ãu™={¶Œ92ìnFL,Â>3t-š³téÒ¸´?j¨*A.ଠME‹J ¸M^9 S’ ! €xQÕÁU9rDæÏŸïàF§ix~€Pàyƒ YøŒ2RhC½.›7o–pÍ À†ÄÂëwˆÇú›'¤¡’ Âj¬óéÖ‘mú8¨ ?|Yäw=f“¹sçÆì\<ˆ0©Bóiô²øÁóļ0ùá¢`” §vá&"p,ñÈ€/üÀ«éO?ø:­«dÜpØÄ> üá+"!)))Å3ˆðôq=Ü h.Œ_ž?x¶xý£¥cÇŽaOb|þ=øúë¯içñcÆB¶dëÏ1üvþø±oÑ’ç¹­3*^ÿáçõ2öÿC‡Çþì>öÑGYïö6Nh,:iiªÑQÖkÔÅ2]M±áÇÛ\#«s2ÈrùÍ7ß8¹‰QkH, xö`^šü±ö4|‰8ŽNýÊ+¯Èu×]~+x$8flyšþ´»j9[Þ]t È4ý†˜¨å€þüá¸Ibq0¹™R!Ó*È„qܹ0$ÃËZÑêÕ«ËîÝ»K…Qq;ù|×o®sÆ RYÛœª¥–þÔk©S3ÁJoü½þÔñÀp0?¨)µ›"@b€€ „ež- ^&€ÔŽ“$1¸9½xŠ¢aÛ£ÕG ܤȳ‡ì¥'é4MRä°«À8s¤4Æ”šŠh]ÖëW(Éïbž+øhAÁóÈËäâÖ[o-”^#œëo ±€ÝªŠˆe ܤøRɨ­¥.µé˜ »ÇÊB¯m3¼ÔË?xífÜ%V„2îe,–/_N$% sô'Ž:"nbj~ü:K!D BàÄW·n]Y¿~}„5ñp· ЫW/éܹsÄÍ¥Æ"býYAbbbDÙïN„4 ˜B1‡x§ÕÓé-*HÎ~‘ÕJ&p š šA„HÆ cpžÂ T©RE:tèà„¦8¢ øp1Å ŠB#vîÜ)Ž3…Ä:cpe•¥DàÀòᇖrï²ïRß ¨Ô0¼ôTÕV¤6I”„ä—u‹X,VRípÞ¤Ä~ýúÅæDFgâiˆp+¶‹o¼Ñ­8°ÝC䄾 ’Ú¢¢$´ÉÀ¼ ²zw@~Ô­{µ˜ÔÆk>›Cˆp't’<øàƒ¶´ÙVbѽ{w[ÅJÜ‚çÔ®Èö HÜ€‘`,]§=Tw‘V[u«É†e¹²L ÅV-‹Bˆ@”5jT”jfµND I“&2pà@[šf+±@‹¦L™bKÃX‰ó˜>}ºÀ×ÂN³&HEU-¸9›èR¿v‰R¥u# ¬_&?-ϱ†˜ÂiÛáLE‰#FŒˆÝÉx¦¸"ðÖ[oÅõühQb,üpˆ1àq<ÝöíÛãxvž:ÖÜtÓM’œŒ§oäb;±¨S§Ž Pˆ@Y0&h-Ô£BiiS7Qj¶//¿È¦å™2C‰´  8†;6lØ»“ñLD€D””©Y³¦üîw¿³í\¶ ´ì_ÿú—m dEÎFàŒ3ΰ­ bŠ¡¦uó‰E“¦W³a=Ù·2[–­È#Yº]CYXÄ‚¦‚BlF gÏžR¡BÔQ¼Ž@»víäŽ;î°µ›Q!gu– ±ï#€h«v©Ï }€"MIEöR/ŠŠÕ”fT¬,{6‘ùºYLwZ{Ñ¿"w×ñ@=öç©8r„bb|ìϸhÑ"éÚµ«­'Ž ±@ 9ôÔÖëäØÊfΜ)ÙÙÈÔ™§ÍšJ*à[‘¬ÓÎMt4Hz9 ¬^*;Ö–ªËÀhh6Í”{Ú¶mû“òŒ1Gà믿Žù9yÂø €ÃóÎ;ÏÖ“Ûã©QL“Î<óLA¬ù£Gl¹x¸ª `¹0ƒ (bWTÁHÖêÙ²çGM¾3W~QR 9ÑJ(a!0qâİŽãAD€8êÕ«ÛnA/£¦±€j¥iÓ¦ÎC’-²HcY@[HE-Ù:‡!¦§ë­Y§ŽÒ\M‹¾>[Öèú}ºû‚ªÒiSA ( G¾òåáíDñ2 W]u•Üwß}¶w3jÄ-ýùçŸmo0+t—]v™$%…ÿª‡–‹ %t¹v %ˆå½é¨|·:Wf*±ÀvivƒN› …D¡C‡2SupuZ•{öì‘h )Ž*±—^z©Óðd{lFà™gž‘œœð^õ ¦@cH›m•\Ô¯Ÿ ‰EÖÿ˜++”T ZF¦NqÃB»A‰cÆŒ‰Ï‰yÖ˜!ðüóÏÓq3fhÇ÷Do¿ývTubñÎ;ïD¥á¬Ô€ŽÀÑÓt¥ ÕUçÍüÓ•‹×ç 1ݤÞÊ3,3HxF¦DŒÀ+¯¼q¬€ø"P£F ã}´$êÄ ¿å–[¢Õ~ÖërLÜŠ:J(rUÑI§Í«$H…Ê ²wu@– È,Ýb\€I*â{Áwí‚1ŠBˆ€[HKK³|+Z´hµ.Ä„X<÷ÜsÒ²e˨u‚Ç믿^*W®\¦†À‚axàgQ_IÌé rt_@¨L—êVøU@cA!D zÜ~ûíÑ«œ5;Ý»wËSO=ÕÔ1!@ó£>r¨lDtxÿý÷ËÏÄD"E †6Wúr‡tõ+’¹ºu‰–òºÑ6±?%¾ôèÑ#¾ àÙ£ŠÀ›o¾ÕúYyüˆ…!fÄûºuëTÙ‚¨ ã²Dê3¤Ú ŠÆJ°î¤ÕVèŠ5«ò\4MÂ1ÄŠÊe+s¥©©©e>†¸;v¸§±li™¨X±¢4lØP P¦ãÂÙ9! ÎáƒÐ"€á¥¸`<Ñl r¶EÉ´OZ¢$+ÃøaG@ÞUïÍ_tûr5…ÀT­…"@ÊŽ@—.]ä»ï¾‹IŒ’˜i, Ï>û¬™åÔc4oÞ\š7k~Â^m†—‚ÕÖVB§Ì ‹jˆlTR±^·lÑu bA!D z\pÁÑ«œ5ÇÜÜ܈⠕¥1'7Üpƒ•¢µ,ä¾î@À ¶RJ…”!••6@{ XX—¥6:ýI‰ÌpØD• ã­ 8@ N¥xDÚ\¿~½÷:Æèß¿¿w‰nà%K–;Ëï °oß>Y½zu‰y€ v´U´ À&̰ÞÕHX ÐPlÌ×V0Ç¢‚á=z´CZÂf؉@VV–,^¼ØÎ*Y—C8ûì³åå—_–‡~8f-йÆ=ËÈÈ /¼0f䉜…H$UuÐF€\`DÈÄ%H6róÖ1v…‚àyâ‰'Ò6ƒÒ ¿ÆÓO?½4»Ú¶OÌ7C[Þ±cGj/BñÈ|§NdÑ¢EÅö ÅB©¥d¢žd2=G7áÈù½ 8­ë{©IDATk~­¤‰ÇH, ˆøÐƒý}Û¶mQ:«U«Vh’c-qÑX˜NRõfðÖ´Q£FÇí1˜Ø°Ø×UbÈšÛ•T@ƒ±R§š@,øDfÍš L!ï!0räȸt*®Ä=þ÷¿ÿ—Žó¤ÑC`Ò¤IÅVmˆ¦I:R‘®S¬ƒV¼z¡ê)༉utØT&}úôqX‹ØœH˜5k–¤ÓˆtÏ Ð¡C¹çž{ä‘G‰KŸâN,†~\µy\áI£†€¹Ù ­ÈQ­†™bDL ‡uÁ° ‡tŠ9 Šsˆ‡ZÕ9½gKˆ€;@’±‡z(n5Ïú¸5'nÚ´©4nÜ8®màÉíE76ì{Å ÈBŠRDÝÄÐVlÕ²WËB¥Øn¬‚ÔZ(’¹sç:¨5lJ¤ #Å{\{íµÏ`”Ž x­[·NjÕªå½+ìÓU©REé͈1ƒà†ƒ&ËiZ°ŒxH6¶J –Mì “ÑTWQˆ°Ä$9çœsl®•ÕÅîÝ»ËÇ,°ÄSâ:*¤hÇ·lÙ"­[·Ž‹kѶpÙ^0  4-•BÔÕ)r„`ÛÏJ*–iÅNB‹Ab¡ 8L ‰bêt‡]6‡(ø@ÿúë¯ }ÐÅ Gh,Lçß á­)´˜> 5óÍ ˜‚@`|ÒA* ÍÀ0SL)ÎC Þ_BÎC„-"Î@ ½vº#HÐp”ÆÂ\„ýF¤0ŠûHKK“}»w[¦h&0„¢­–4-Ð^Àôñ½Ò /Ý¡”¤‚ƒß ˆÖïRãää€ÚSÜŒ@… ¬ÌÒG•äd~0¾=r”ÆÂ@ñÒK/É£>*ƒ6«¬é˜1cªX#=zôÐáo°Ž;VBó`;ö3‚ãQO¨àõÔS:;œŽó˜Ø €GL ¸Ù¿F§åÕô‘§©©0æúW(—ñãÇ;¼…l^q\qÅ…âû·×9fÍšÉÞ½{¥zõêÎl`1­r•EÑö_~ùåVp¢ë¹_ŒD¹A•TÀwŽ›ë "›´€tÀ¿ …"@D e:ùä“eúô鮃Õ ƒòÛo¿-£G6‹œ: ÜT( y낾 fh©1ƒT(X"@ˆ@>­Zµ’·ÞzË•x¸šXq:t:ᄀ€€P `TL"Ɖd"½~}ýO-…‚‹þ1ÂE­eS1Š€q+Üw4nÜX¾ÿþ{©S§Žû¯-v=±êpè¼å–[\y¼Ôhˆ<-EÞ…eŠÊºÉǰŒèšÐN´èÔIÒ4¸ 5 †‹dÊ”).j-›zÁHv6½—Ür'tïÞ]¦ûÇtK“‹m§«},Šö(33SÚ·o/ëÖ­+º‰Ë1@ÄLš „ð†?2˜"7|-°}·–íj A8oøVÀßä‚CA "àk>üðC¹øâ‹]'4æ* vúÚµk e@5Û8>F[)ÈE² ø2WÖ‚õádcð± …‚@!DÀ÷`(ð¤I“OùX×ó…  .%z€0€¡Âì´0}´Òim-0…ìѲWIÅr-Èß 8rBsA×2Bˆ€oHJJ’Î;[#?`$ö–xRcz‰ºté"@ÀSj¦ÐþÅ{Þ LÍR8jÖRBQ_K-pÞÄ6ü|@"`…):K!D€øaÆɲeËdÞ¼yâER‹èyEèŠ#›6m²Ôï¡ë9_v@$@Ì0R£x…Æ¢…ê/Ú)¨§¥±–¥ëuý ÕOlÔùÝ¥€#Ïtè¬X±¢¬‡rÿ!дiSY³fMŒÎ¿Óx^c -œ:çÌ™ºŠóa"2Ó¦¸‰T ‰æºÔHçZki¢¥¥ä ñ€&)Ó×"S§æxµäÛo¿5³œ:1cÆ8´elòI¬^½š@8æÍ›Ë¸qã|A*¿¯4æ~Cœ „ǘaJx@3"§L ‰®Zzè|‹º‡2åËò¥j+fjY¡Ú øZÀ ‚a§Š;¨Q£†ìÚµËe+‰€8çœsæ?%Îô%±0÷Ú£>*÷Þ{¯ääðÕf09Ñ„¤ÀøV@ëRQWÉD7k¨Ó¡Õ¥Ã)º¶¡Hæò€l^+ò³åzä%pÚD< ”âí‡ÚQÜ\Gˆ€A€¿ƒ„ó¦§~ô(\Õý%x'øVþð‡?Xána›¤” Ü4ÐVÀ¬G#] ˜?nè”$Í{§HÂyª·èy¶Tj”"GrÖhŒ1Ç¢”âCÏ=÷Üâ6q !T®\YF²†³N@àæ›o–©S§ú’T_k,BoÀ¹sç TV N)h)P0DÔDÒÄè$;W)Õ•“¤Ëð–’x÷Ë»{È®U’=y¼|ýâFùrO@&¨Ñ™M¡©€Žˆ: ÁeÒ£GÁo…Bˆ@ñ &ÅäÉ“‹ß蓵¾ÖX„^c<0áØ‰(h”c0¦h ¥€_`!fEg%­TÿÐâ ]Òèq 55‚E[w_©®ŒÝ²K¹ÚA%0 @ÛR:)îB 5z*  ¡¤¤¤3‚tûT‹»£C‡V´«¯¾Z6TJÜ, ˆI­ÈE¦†6J.î—")—_&‰½ÿ¬yÒÓt˜È~É=|HÖ.HÝYY¤ûÑíbYÀ ­Å‰ä¬³Î:Ñ.ÜC¦M›óñTÇCAÿšâ þö·¿Yyª”BbQì=ðÚk¯Éúõë¡q!ÍKbzc¦ FŠ®3>˜BS2rSFE%Ø¿§®Q!éw—råuryF’ÀÆ9’تŸ,Û…z42š"P†¥‚P€\”Fv«Æƒ_É¥AŠûø $\Ü¿¿ŸºìȾâ<ð×cõ‚KDEÇÌá‡ûꫯ³ÞÍ+ðR7Â3dZ  ¬3˸IP̶*:Ÿ­{Á RC竃0ü°L¶Õ¥< ,ýF²ß¸C2eÊR«F‘_ó§fŸÒL/^,ûöí+Í®Ü'ðáKq Æ|)HQÜ¥iÓ¦òä“OZänàÀQ<“;«&±8ÁuÃøc„‡Š«zud½p†r€—=HH‚Ñ0˜mŵÛŒ ˜7B‰¶£³ÎÜ ¦N3E¶R¿U ²—n™+§J`öS’ûþu²ÿÓIòíÝÓd鮼H››•TàXh*p\8—Z8¨Ù{ â¿P⃴§åËã×N‰'xÌž=[n¿ýöx6ÃÑçæ¨2\ž7Jƒ Êp„ý»¼Ø kp&Œš!€ébˆŽÅK=ôÅnêÃþf=4s|ÞR^ØÄÚ Xx›ê´»ž­³N;·H”ŒŽI²b~Y¸þ€,Ö6ê>ŒÙ£ä"Ü17x¨þå/Ø2wÄ‚3.ÿ3!.°['2dˆ ©"£kÆþÀô4hÐ AZÄ>¢”Œ‰EÉø»a¿øâ AˆðX^þ ÐNથ€¢#^î5“eÏ]¥ÒÎ_dé† òæͲçèkôˆ‚!˜%fÞ ,b©):k‘C,Ð ˜Ešé²p  ´÷g=~?iÙ§õÔ‚ãý.F;M!DÀµÜvÛmòÌ3ϸ¶ý±n8‰Eˆ/Y²Ä2‘Ø%Òˆ¢ScêÀ‹ ÛD‚¯6µ*Ëã *JÃ…ÛéÉÆ{o•¿>ÿžÌÎÚ/ÙIåeëýúŠÏ# xɃ¨à¥õXF ³¶CÌ>h”²pâDôMijÀ A…Ùu"Ù˜!^ŠuŒ]¡ Pˆp<íÚµ³†NŸ>ÝñmuZñ¬§„‰†§~òÉ'‚á©v ^ä Lñ"ÇÔ¬3‰»ªê–~•et§öRÿÛ•ºÇ±RÿÏÉK{¶Ë¼ËwóçË'o¼)7UN–‹µ¶Úz<|# y€à< (y†‹<‚õfS´„äÚ˜8Vëø¨¯Êßë ™€ùà Ó]¶@å•W†}< >}ú„0,3­Zµ’nݺ•ù8*T_|QH*ÂÑ‹ðp+ö(DîüꫯŠÝVÖ•æl4x1cÞ俍¯KW*Aqk/©ýì´2U¿g껲ò¡äÉ3åû}¹…|Œ†ÂThȆÑX`Šv@ÐF h/B§h+êÀ4‚c0µS5jd ¶³NÖubyóÄÙ¹|º¶nÝêÛÐÐvby¢ºàœß²eKË—‚~'B«äí$%ãSæ­[¶l‘SO=UAÕ1à ¼Ä±ɾ4¾¥¼kUIzx©:<Ô+óérvm‘-[wË•í:¨Æ!oôÑL€@@3­¦8/¶›6élÐŒºÍøY Þ…Y})D€§"€´óˆ Y®œÑã:µ¥ÎoÞW@X×µk×Ê7ß|#wÜqGÄ5ãEn^ö˜âö/JæhðÜ~ùìú1º¦ì’T#Cêk¯/¾&whùI ¼Ä ™PRm¦M¦= |e¦X6B0MÁð».]ºDó¬›Ä´´4iÞ¬yLÏéÇ“DÀÁ­RøH*침±°ÇkAxðíÛ·Ë‘#xýÚ#гHkÕ¼Ü2Y²HÒÚ´ ëÝk%wLoéôÊ/–¯Ä%-0a€T8]úöíketz;½Ð¾5jÈ®]»¼ÐÇöá”SN‘eË–10\¯LL🀠Å~¨±°Ócjܰaƒ•˜æ’K.9f[¸+  €S$$RãÅ+JÿN]åóvá}½'¤5•¤çæÉƒç°4ñá–›é‰)±A`øðá±9‘Ï‚dˆŒ6kÿ §oÄ£˜4i’à™LRa?ÆÁUD‰!;vì\xá…PØVT{@Ñ_Í=èV.1ðü?\4?¬ž­¿©w {ùÄ€jDšÉÔ¶vÚÙçãÕ¥N®jïñúÁõîºï"½^jþT«V÷n”ž7š´- „"¬ç!*;4…è!‚ØuëÖ•={öØ~z˜I3¹|9ùWV²ôþ©Ôê}NÎÛ»Ÿ"SçÍÓá£Ë™ÓîQehL™v½ì²Ë¬!À™™áÆø,Óé¸3°‹/¾Xf̘AM…-hæU‚ì¯úJ´ÌÐððZBI¡²½* Û!-[…HCXшêf|0àÙ¾q¹ø”žò»a§IҀߕª‘\t‰ ÿäCË1Ó>ïRš;"@ÂF~mãÆÕ‡] ‹ð±³ýÈÖ­[[y¢‘ ¨ gE6ÒŒŠ‰ò/ þR»I+iS;YÛœZl_²¾ù@6^3Lº­;dùs¸\Ô«WO6mÚTl߸2<,'N ï`UÞŸ…àˆx¡qãÆR«V-¹óÎ;šKJü ±ˆöÅžùÿûŸäææÊYgUìv»Vb)ò|4¨ZN:Ôi*§6¨ ·]–.‰7M+tŠ=³fK¯ÓO—JK0B$ÚÃG <Âx×ïÞ½[V¬XaM<Ü €áyK—jÜJD@-íµ×Êk¯½&ÙÙn14FÔå¨ íD¯^½¬á£Q=+/$¥‚)>;a|5F<,Z´(ª €É6˜L0½RzIÝëK×´\ùóô-R1+Gv*±€ÆÂ ÃOµ™"@<ŽüR ¡x饗<ÞSv¯ìþž<"èPՀƯ·¼Æ5_C@C+=È5¶@@3®—õ6 ¨Ê: _—Áujs Œ1"¸Œ}°Œõ˜GÁþ8óJ2¬é]ZoM­£N°çÅùÍ1:„+0vìØ¦f],ÚgÎ…~£ÿfùxíÓÀeÚµk[û9±}NÇí+üû0÷[iï?à§ZŠ€q´~?Ñþý†Ó>sŒ“À°ÿþñxóœe@€ ý5¹E0öúƒ>Ûo¿Ý-MvL;«T©"gžy¦|öÙgŽi“§8܇”²#мysQ‚!?ýôSÙöùÉÉÉòæ›oZf#& tþÍ@báükTl ý°wïÞQ7“{r®ô-ªå’ñãÇû¶ÿìxì@R0„7W …5Â#vgæ™"E€Ä"Rã|¼ñ¿èܹsœ[â®Óc†ú"ž…D ÓÕñyùòå²sçÎh“õ^sÍ5òüC*W®låððd'=Ü)  ¸N:Y­Wó—é~ùEyâ ºxñb+á‰Å‰±âá#€QI$'Æ9h´Iïºë®À=5޾<‘5ªD ]Ý¿dñh"@ˆ€Í¨3ºås‚˜/¼ð‚͵³ºx"à–ƒãå—_–Q£F ²RDä‚BN„œ Û¶m{¢Ý|µÏ’wß}×q…ç ž5$¾º„ ]ïRõéÜ![¶l)ÕþÜÉ?0Wˆ®ui{ªmé.½ôRiÔ¨Qiã~F€ _Üp»¶yófAyÿý÷­‚@\~ áMMMõ3Á¾óë\ä†n8üúU ÙìÖ­[ðù0þ|‹XTøõŽ8¶ßÔX‹ ×[o½UV®\)3fÌ =ù8q5ð"TuÚi§Y]›2eŠ»È>Ùˆ‰…`ú¥* c…|ýõׂ ƒ~’””¹úê«-¿:ëùãÊwíÚÕò»Á—¹ß¤I“&²dÉ+}°üvõÃï/‰EøØñÈ|¾ýö[ùüóÏ­¥|Ðó¸Ô¬Y“Ñ=• :è§ë=tèP>|¸E&î¼óÎ8GÊ€‰EÀ⮥Gqþ_|ñEëéòª Iò´|ùå—^íb¡~išpyüñÇ ­óÚB½zõ,йsçz­k…ú“žž.p¼DÐ3„Ó¦» ±° IÖs\¦Njm{òÉ'=™¶¼uëÖòóÏ?·ÿ^Ú€œȬëeA0˜û¼ 17&L˜`űAÀª:uêxùR²oqB€Ä"NÀûý´ƒ ² X°`ŒÊ+xà °M›62sæL¯tÉóýÀðjøÌž=Ûs}}à,1`ÀéÛ·¯çúÇ9 g^ß´ tŒ RŸ_…+V¬ðBW|ј> p»†ŽÅˆ%àncÇŽµ®‚½Qˆ@¬ ±ˆ5â<ß øä“OdÙ²eÖ~p ýꫯNxŒSw€é`àÀòꫯ:µ‰ejW=Äí¾íÛ·—ZµjY£šÊÔy‡íÜ´iSyâ‰'‚f¸»ï¾Ûa-dsüЉ…_¯¼ û=yòd+šŽÈÏàAúz3D× í-©}úô‘iÓ¦•´‹ã·!ØÙÁƒ]‹Ã<á÷qÞyçÉÆåí·ßv<Æl ¿ ±ð÷õwmï‘HmÑ¢EÁö÷ìÙ38ïä™J•*É]wÝ%°}ggg;¹©ži^ÈÛ¶m7Å¡€ÒsÏ=gù1â©gnG_t„Ä—Ù_D+#›6m’éÓ§›EGN€ iì¡…¡DŽLð—Ø±cGä•E©øC \pÁÖàð‹ùN:E錬–ÄäØŠg"±Aàõ×_/öDxÑÀûß"gBóoINN¤•v±@f\'`VÒ5C|'‘ Œ‚Æ“^½zɧŸ~ZRó¹¸j,\ Ùp˜3gŽ`¸k¨ÜrË-¡‹q™2dˆ¥Á0¬qiÄqNŠÑ=ôÐq¶Æ~5H’ÄÁ‰~ñäÓøë_ÿ*™™™mäæ›oŽw³x~"SH,b 7Oæ6ºwï^¨É[·n• 6Zí˜JáÓ &xk,222,“Áøñ㣠{±õŸþùÖˆ’¥K—ZÛ¿ÿþûb÷ãJ"àgH,ü|õÙ÷2#€¨“p |Á¿ñÆ¡«lŸ}¡ƒdÀ!ñ­·Þ²ýÜJÂFàxf•wß}7â°Ø°Ûoß¾=ضË/¿ÜÊW²eË–à:7ÎÀñö³Ï> ö $ f…HýO@ÌþùÏÊòå˃°tëÖͺÆ Dߤ"`$öàÈZˆ€- pÓ‰dçÎÇì‚C‡YS$FÃ×÷ÿû_kÿðE©B$q,Ê•+'ð‰0mDl†~ýúI¨YC+¡!(N ¹@?1Å~¡$ 9?øàA¦]’„âÐã:";H,b‡5ÏDlAà?ÿùO™êæ$++KFŽ)/¼ðBpTGÿþý­—ó?ü`Õâ—òªU«‚õãKfcz0‘7ñ‚Ç:c"!ª–ZMÖý²Î <…º¯ãé§Ÿjg¤àwÞ±êóÍ7­óh˜b8®qãÆb|°#’¼Áþ8?…g#@báìëÃÖ"@ˆpÞÈúä*ÈÙX"@ˆ ÞE€Ä»ז=#D€"sH,b9OHˆ DÀ»Xx÷Ú²gD€"@bމEÌ!ç ‰ D€x ï^[öŒ"@ˆ@Ì ±ˆ9äá[ñë±½5Þ˜b í@"¦˜JÐÿú€O+€ïÜáœs%ÊïÞWâúûöðùU§ù9ç2Ày@7ðç\²D™¿~<|xpyøùÔH¹ww]Àßo>lJ‚úTc‚nNÞµœz1ÅSL£¤Áž£@ž£žÏ𫀫»÷gßš€ã#åþ6Ôû÷¢v/Ž>ä½ïÝýáï·´XRô*Åç˜bÚçT±¯SLƒÐÛ½÷;"ßÿàœÛ \ ,Cx”nÎqÎU{ï»"×ßü¸`~Þ Ôü+"„üº¨Ì%À Þû‹"×îþ³HHùàQïý»¢ã~8ˆ03(9çê[ÃÓ½÷÷We$íÇSL1• €÷ÿ¤‚òäÝ=GÃõ¿þÕ{i¤ßÿ}æyï·9ç>\ëœ;Ç{ÿ3çÜ\àóÀxïïÙsSÚ/èAï}~_"¦˜Ê¡ØbÓ~IEBÒ#á}j‰ß~h¤  Ü9wppÝ]}xøðJø^Lã€-ƒŒÓ•ÛVF¹!É97ø-08­ ¡@isî.ç\§sîçÜ¢ÎιJçÜ¿8çV:çÚs›œs¿tÎÍ+ê_Íö'8çþ×9×\£¾UlîwÎâœûuès«sî›À .1ÅÓ~M×3œs'G®`…Ÿ•­R”÷lÄ{pðoι ÀBÝKKTŒ¦9q1mwÎmwÎý›s®*Z <÷ Ï­mιß9çN(*£®@g†6¶…×uι†¢²Íι…öZœs×#sL1½¦( bz-Ñ)áýÙ¿u!\Qóìû{K5望 ¼øIø»8Ó9WüÐø€sî’Rþ·EåNsÎ}É9·h¤V‚@ÍÀÀ,àÍÞûGP÷FàvÄœÿ#à‰hþÀ^|8¸¨î/öý t°ßE´ƒŸÒsiààHà¯mâ,à³#sL1Å´ÿÐ:ÄÊYüýÐ-è½ß¬.qÎ}Ä•Sô yV..öÞwŽ`|ÿ¬BžIÿ\„<›¢4 ø&ðDѳ±8^¢½o9àÏ/ –‘o•ùâ>ú)Äí´øöÆ Páœ+~ÅVÞ˜öOòÞǯøµß¿‡ýVà7E×—yàMˆ¿?0Á;3C™Õ½4\Ÿ¾¾¤¨Üà‰ð[± üX^T®ø}¤\+bš?·Ì9æ#¯e#àÍçCK‹®_ø 7 R/üIï>¹~AhïsEåož|¿(”;>rÍO!¶ïë}¿âWüþ¹çþ2<;ÓÀ$ÖëÍÑgm¤Þ ˆp Ï­ À‹‡èëŠPö§£ß¿]ÿtxæÏ¤^q™~øfäºÎå¿‹ÊèŽ|_ÊWTî–pýÃŒ[ŸÍ¥^ÿº¯×=~ůR¯ØbÓ~O!÷& ‹üi•$ïý]ÀFÄGöLD~ýMxÂ{¿*Ôù“àNä½_ X,¾ ü ÑXýÆ9÷™H¹mÞûS㟀{€·?qÎ]]ætïB¡¯*aÒ q*Q·x®?j…‘6ÎsÎ=èœkAþP;B™¹%Ú+޵x ˆjOÖ¾÷ŸÇ<ÄÓk•~†(VÞü°É{ÿ»R½X4ç!É®^BžŸ÷;ç^\b§Þ‡¸}̕A¥žq šé-Á¥r;"Ôd‘ç[¹Ï¸JçÜÄðýDDÉQìFõãŽûย×WGØFL1튃˜ök n7#Zÿ·zï_¦Êÿ <ïnòÞ·—*äœ;ñáÿ•s®Q_¡¯%Å.CÞû¼÷þïý?zï—#šµ•ÀçŠ]¼÷xï/÷ÞŸ LG‚ñ.tÎ-dxºqZ€u‘߲ї{uª¼b__ý>-ÌùLäíiÄt~<ò‡º ¢ŠigÑ÷^ÆL)Ñg©qÄSL¯ ÏÌ‘çèû€ÿ¦|Ö{ÿïý'¼÷'#Ï®ÍHv¢búЀ¸æLD¬#¡ážqÇ Úü]H¹gÜ”ÿŒ#Rv Ðâ½Ï•Û:Âq?꽬èµa„mÄÓ^¡X0ˆi¿%ç\ Ñ^¼Í{ÿtÕ~,Bþx~8D9µ |ùsÐ×߇ëïªïý&$x®˜=D¹6Ìuþ0c×:¿ÎA¬·8çªÃOŧâ<Ø“‹¾kÜÀÆð~>°Ú{ÿAïýmÞûG€' 匫m*Ñg´ß˜bŠéµI?ÞŽdEê9ú* Öë ι&½îœ[\|Ö{ÿ$åó_9çNAóÃ=ãÞ(NÞå½ÿ¥÷þaïý£Àø‘Ì!B›€qîÕi¬ãg\L¯[Šƒ˜öKrrX×ÿ"¾ ïŒº« EÞûç‘ C?~3HÛiDcþ@h?ú:qz_¤ü”Aº;,¼o.³Ü¦ræà½ÿ5äOnvÎU•Ð8uU;¯èûùHîñ•á{5bÒûýsàÀAÑŒaÝÎ#>W!¦˜^Ëtâ¦óÞûRÉÔµq0¥ÂaHBˆ¶P6|xÈ{¯Á½W"ÖËÿ J r¨Ô3.h’†êð=:Î7•Ù~1ý‰S8§D¿1Åôº¤øƒ˜öWúò0þ2Ðíœ[ùíeïýÆÒÕÀ{ÿwô}¢Aú®÷þÅ?:ç¾|×9·Ì{7ð”sîÄDýPX$>‚d4R“ðmιõÀ/‘Ì$.áãÀ½÷÷ 3®âyÜütÿ¸Á9w–÷>;D• 09\íCH±ºSÝ œåä„ç_#V‡¿E‚¤Gp-rÝ/œsŸF\’.F2Å11Åô%/9÷‡;­½xÉ9÷cÄ]rb}<9æJï}_(ûEœ¿3ÒG¿sîBà~Ärûù2†vºsࢱ\×zï_¿ß |¸Æ9w WðYÄ¢0âg’÷þ·Î¹{ïëÇàψÄm•IKœsÅçä¼÷tL1Å´§)¶Ä´¿Ò DëüDk}}¨¨ìHµÓ@|P:Èïÿ‡«;ѧÿEÄ ñcD“Óú}Ñ’]†¿@‚ ¿Žõ“÷þ'ˆ¯ìiÀõƒëi¤g!Y4nBþÔ¿ä½ÿR¤Ü÷Ãÿ ^V„ñµñj–âé€SOßþrÄÂòïÀ5À ˆ‹@l1ˆ)¦×•sÏFË´!`þ $ö·ˆ²à àÃÞûOA!žëcÀ?»ƒ`ü-à2çÜp®–I,1y¶~ɼöבönGÜA—"ñb Ïè5%æ7Ø|‹¯¿ yž_<ûØIÎÑ–¹—Wÿ• èŽ)¦}MN’ˆÄSL1ÅSL1ÅSL2Ń˜bŠ)¦˜bŠ)¦˜bŠ) bŠ)¦˜bŠ)¦˜bŠ)¦X0ˆ)¦˜bŠ)¦˜bŠ)¦˜ˆ³ÅSL1Å´вeË\ccãÜyóæu¤Råf¯Œ)¦˜b*ŸzzzX³fMmkk못ï¾;²-A±`0´lÙ27ë‘G®¨q.›p’­1Çä‘$ÈyäÈØ^ œÓ’?MËë *z´l? í® /ÛO.ÔéGNÕZÊz`*vÊ‹ ýô„ÏšN¦"\ï ßÇcG?&Â÷|Úr’†§#Ôɇq&ûæ}ˇÏI¬|’éktÞ  I¬¯Tê8$¨ÃrgVaÇPÖ"é~*‘tAÊÃdøÜêÌY²„—~€¾œð¨"ðª2”Ï…qf‹ø0I§“¦ÕÁÎvá]%0.ðÕGæÐùž ýx 1­yI¦Ý^š£.æ˜OA[Ÿ”W>ó%QÄçCëà¥NHçmÞÙÐfk«2Ì+æ«}»ðÒý¨{R÷RtT†¾'!4Tþê’o.8~ø{©£Éû#ë¥{¡¨M@K^ÚM„6ußté$LŸ1•-k_¡ÕK›º×^ŽŒ'í÷­áû´É“X»YA͇ñŒ <ÍÓ+áÅ^ã“ò`’Zå°&xl»Ý§Ê;݃Iäd¥M>¥€Éu°µ]ÊêZ“‚GûŒ/¹À—ThW÷²®—ò¤?´}T…ºuÞóòøñ¯Ÿ5ëÆ×ëŸÙìÙ³þà?X9|ɘbŠ)¦Ý£³Î:ë0àù}=Žý‘bÁ` ¨±±qî5—íëqÄÜqÇî·Ñ>|‘½Nûá˜þýWcÜ`ën<£Û‡aÐpü-÷æºttpÖÑG¿nÿÌ[@ºâS¬bú¯>i+¦˜/CÑë7ªäRíH¹Z­·àÜsù»Ÿþ”yóæS X0š={vÀ_óµ˜6:…h•Tc©šàÅ'4ñЃÛqˆ&±Ñ2ª¶5ʪ–¼‡|µJL¶„ïª>x"Œ%ÝDIL›®XÕ +µ,X@ëöí,Þº•D«¾*”Óà”¨e@5èÅí®ë5Õˆ¦mðšð¹Ѩj;)ÌÒCNÓiÁ4ºÚ×ًক־Ž-‹h„»üë¬ Ê»\è7 °bkÿ{¦wwæ§ÚÝ>äô®6d:+À.jù£šæ|ûìöþ¾ŒÛÿñJ:ûD½3ÌMµójñQ‹I¶TÃ_”µÝ«ÚІò ƒi«Õ¢ý«6>ºf¼ûlnøù Ú¨sl my Ùc ê`u»€¸]aœõ8²¾’Çvõr^ü¬Íö¼Z;vo¨õ¬&\ï ã]˜€?…R-³\UDê&C[GVÂ3Á2 óÕººÿ•¯Máúæ7¼Ç﹇cÀÛÏ_ÄM?^9`/× ÷åxĪUÆ:©6÷Ï}èzeßr ÜÏÙÈ:õ„ÏMÕ°­Kú‡X±>}ÝÇøÒû¾ÉwáuýgVUUÀìÙ³I¯Y3dÙ(0(õ}$u÷í©>æÎ›Gúù½#î >¦o½£¿Ç—áæý}¸SІãI´~9eÇ‚ÇCµ3{f¤÷e”/u—ÛvÔÂ].éA&¸)ÆîŠƒS|<¤hiÄÕ T“0@Y‰œÊR LæT°xúÁ퇹DßSÀÙ§Hôˆ˜‚Åz¬d¶v†ÏM˜ËÇš0†šPGËWb¶9´_^i¬6Õ×S›ÉÐ|í27 ˜¯õ2˜«Rñ« Ùlu¡ïªÀ» Ec¾O ßã«AÀTmhgVdì\i®#Q~Ôc@.…nuåJ…rõ¡)‘Ïýìòžê0Ÿºðžc›”–6=phd~ á÷ À’ 03üvb“?åÅTàúO^IWŸŒ§˜u˜«SEdÝ2Àɧ.¥:•¢™ëA¡¯mÝÒwEh#x¢@TÇ–f„¶´¼®wð¶E°­³»àú£‚\gè/œvÞyÔ…:›Ú¥-=m"²ßΜ õ7ìꥸµÍæ­ërhൠ(U‘1¹Ð_ðL^æ?1Œ)…ÜC‡×Ø>?zœÔK†ß[z¥Ýcd/×cûÞ‡qô"BÍÁ3gÊV†voÿñJ2áZ&Œdé:ç€% ÐÖ ³dOLÄΊPW‘\XO}è΄ëz?7¥MyÙKÿü¾o2;#u„?³ågœ1l™rOª*§n)Š*oFC¥úpƒ¼FB§ŸuÖ^;R|,…‚¡æZê·¨­>ó¥¸Îpsê÷‘PÏðuŠµÞ»KCµsúYg [8'¤ ÕÆ`û~´÷ðÞÚÿ2Å‚ÁR óãîÄ´€ª•~%|Þ¼Ü/€ ¬ õ&½÷¿ø½ù:×"ÂF=:j€Ó&JÛªÍ"`­!ô­Ü~LS«7¥ŽµÑhW8ZÔÏ¿ý¡È­[‡>£iÕ£V†¨F6‡ÅGh<ƒR_øÞú¬KJ_jùO*µ‡¶v àMëW…ë›1-ø®p]5×Â÷jL»? Óz«ß?biÀ4ó‡ßsÙžžšé\{³¦ÞêDà¨Á4ýïqô«·  T~d1+òZyF¸V‡¬g>Œûþ»î£·¯n̪ óˆòðwjÉÈb~î[1Ë ªÅþÃJxò¶Ûða.+hêÖÿôz6c ºÙ7‡„±ôwí«Ygh[ãd´ŸðúY,8Z÷"ØŸP[àK3pô>@W¤|-²ß9á„‚0¤Ö²béQaC÷³Þ[yd?¶ìèföAi¶o[Z9@@;èØ½ÜßX˜r‹/z”ÒçþN£ÕØ—âS©²‹Ë,W.˜Í•Óö`ÚòÑ€Ür-P‹K\ÓúQ*vëjO+‡²ïy?H½Ñìç‘ðͽÇ48Hÿ7{œ¢ ËcšZ0AµÎŽ€¥Uæ7~4æb¡€[½jeÛ·!úmðø  cùþ»a¢™O¢ã˜‡½QÁÒ;**˜œH° 82ÔË…1)XR°ýƴݤÑM5XÕÚgq©8®/î2×’h{ýa¾*HL cìÃñN>W†¶Vb>íù dOhoð‘ÿù0Y ÆIŸóR0£¹™Y‰]‘1ª5¨óUòA}õ}X‹]€V?*^Èš¶]ù k à¹250«‘yèú5bV.´l78³@µ3A®;´?ð¶çE8Ò¹5q"SÃ\oøÚ×h&XêªÙ‰=ÐÕR‘žß*Ÿ7bn7K«¤oÅãSpѳji¦ "}øÜlïád|BîŸ$ð@·ð}Й—²­]G’Õ}‹ðù½[Àºµ »`EXxí» ØÒ+ãirމ‘¹u^5&ਓO¦»gû€q)i£¸÷Úk9&ôÝß|™º÷^–e‚_à™ ÉªPØùr€ëîé.X/bzmОCiÑcžö„%¨¸ýÑ”͸Êq+S<ž¡´áÆ]Ž‹ÒHÀýHîRBÓkI ÞW cH]À[gÈŸøÔð]5ê_¹$¨ËÑo{L“ÿ8b H0ÐíÀ! ®.ò]Úëݱ£ ‰M!àQË)èP«…CÇ10`8 âÝ9çpȱÇâ@Ch£:|V°\ÜŸ5aH…Œâ6¢‚Ž+©À³3Ì»É ðÕÒ°$%븓@—-µòÔ!`:ž¨;#ã>ñã/Œ# 4„N§5túWw±FD@="cc×Ô¯OöÀ»O”6{O¿ÿŒÕÕÔžQágî+¾$ä¹ÿ8„'¯¢)`jBæ¤q%ÿòÕg µIÁ¯ºM˜Q€¯ÁËç]uUA`OS´Ó˜‡•÷Þ[øÔ*ÓÚ70íãØ=£û[Ó“>‡YCÔÂsëŸlép½s?ª@,ª˜ÆÀûæõNË>úѲÊFËZŠÆ(¥­«q¼åÒKG"÷g4Ö|ÙÛs-ÿPŠÁ,»ÓŸöYj?D˽åÒKým´Tj¿e +eÙ /J +C HåXTbz5Å‚ÁR¸oÝ«¥`Íf“Æ‚K ª ¾Ëª±Ô|ôÜÚhLÕÇ\5Þ*l(àr˜ÿv;梢ã€CÓ¦ oE@ž &*À$€‡ö3^yôÑîH:¾h–!Í„£7i*¼S®=¹R|Ïœ.ËX{Ç`®3Q× Í¨ã€ú$6C¿'·`1 ¦[ØNp3@s~z¿eRŠ0žCˆz‡ë;ë¨KAg.Ä¢`q Ç BX4vÅkòÒ^;0¯ÎúRËØ#}R®.²^ýÀ;æÊš<ð¹ÏQW[Á¬š•À./ëû"ƒ¢ÙÅ’aìYà¤OuO§±Àü ‘::G½§+~NÂö¼òB`ÂŶH=õë_—UnOkÇŠÆrœOÞtÓµ´ïi´|)å~²ò¦›öú^(güciá-¿Û3{š_åjóËù­°/쿞û#Å‚Á’j6¢ÑV×uéÀï[?ò‘‡M)hPàÐŒk®áLÛž–6Y†\ê[Íh£ï„ßÎû§OˆÛQÖ4ý9i&•]˜ÐàûûéÊç ný˜¸¦™TMj4•¦Z:r•5øPç•^Xݨwu˜¾7\ëA€£Z4ŠÓžª@Ui§1|? _=ÐñÖ_øzlW Ä]I5»*Dx€i@ðG¯<‹jg–“FÄM&æ¶=tìÂx¦…6ÔÅH‘kCù&-›‘k“Ct¶ bዺy 7uA ®Úên$ƒM+fÓ,Ã@·5uIÓÀæÉX†#Õî÷‡v7ožc‡ÔMÇ‚ÈUÓÀo¥P>OÆŽé)éïÅœjµ 8,ž¦†Z0Àr0£Ú€=Ò·Æ)LÊ_ÿ„ì-u5ÓØ› d&€ÚjîAÖ&|ã*™Ë¦övrýtö8rØÞx½w_ í=íýsÿå_¨ÂÜ‹ŽÂ„‹º›õ„W6ðp+Ƚ#”ùû»î’è”ô£ñ(m"Ué®õÛ:´“{  ¶.c±^ƒ¹ƒD?o„/Ãõ?pZ.•²$ §Õ«¾KQñž©ÅiwÆ1œ%Aû(§ïÁ„ƒrúŽid cL_ `I](¨+ÊÝßû^ÁÝD7o(+€Žm…ÓR\ܽÝR[f0@©}©ßv+¢µTëð“/~~ฉҟ¦Õqg°-…åyW­h>:^ÕÌFÏMPPVtttЋ€gMGÙ©« >úª õúÃõLH©D´éúû\`|R¬ D+¾¡Ë|ñ=â*µ¨~j 9$Hµ2Ò¦>d”øöe7‘óòûŒÐ§j›«“ºmX «ž ¬ñ*Pt3êd|=ÀŽ¹Þ¨+ðE«uÜýaÞysUQ«ÆL@T6a{,õìc o ã¨þfž”UAà׫͵m=vöÁ1I êV‹–î±j *iik×ENs^æØÊ/˜a)jkEsÓŒOŠà6ÕÃú.©×Yi>pªðog·¹fŽÅ–¬81Éø0ÖÙ˜€œ ßUX×ÀëhZT5Ðý»3—+—ƒÌ*ˆE…í7/?˜O}q“&f¸ùã/ÜßMÀ£¡Ý>ÄýMMUªóã n]¡l põ©§Ò lé³ÀþZâƒb*±«ÀþI» ÌÔåd¨v†j¸þ‡kw´î.åÖ¬ìîò­œºåÜ+QEÛP.9#¹ïÊìM’¨ë IDATÅeÊSì>´û cHúç]Þ «\Zô¡§ ~2¦áUßõÎH[ªQvÀ±ØlÅb 46A5Ç ,Èõ†~Ü*ííBØöB!в˜°t)ã9¤ÐoøàtÓô®ë9Qᤳ<Êï@À–CÀÎÖH9Í´£nS½ˆ&9 ÌD„€zÌ•d=З“v4S“‚.ÃPÀüT¿Å'¨æ}c› GÑØ‰yïy©ººBzÏThÿvqír‘¶”ß ‘þÔ…dSÐ^7`ÖÍ ä#ïÑô² 0¬V]G¶Ú‡º¦iÚRuÙŽ £œ¬®dêšôç-¨ ¡ýÀI]„RÙW ›©ÓtëÚ÷ës  )tÏùÖ7 g¨ Ô}%ýf:Ì÷‰UYZs²뱘 ®Ú€ŸÜ%Ÿ5i-©’v|¾óþ-¡5ØÖ?‚U˜À¥Y‹|àÉ¢³Ï.ÄLsÐ{ Ìò¡.h¿¾c=ÿõÕ»XØÛ¶v“Gî]ìéYXŒÐQ3'qÁ æçá!‡ :&‡ÜÝØÙ]áûF¬?·ƒY^¢b-òXðjOŠÝi{æ 'ŒåPök*Å£ÁÀáÞäËþ6‹yTŠ7cu”jk,ø3˜P0”p cG±`0†¤šÓ,šiaû»úÿg é!Ó¦±Þ„¼¨ËˆjÕÜ¿Ùa ´?QòV,ö@µ£˜œ±v·8é/ƒT:‚|K Él¶à;? ø¯ 6_M™©i6õ¦M`>ù*d¨‡D¥q * M@ÀàF,Xw——ºMó;s¬Çc‡—©Åe>&xé¹ L™lBˆGÜA°ì>]ÐïšZž¦&›-Hƨñ ÆØwa®Z.|V@¾Ë4¤kÆ™G?f]Ib̺™HûQעŲô€½: ÖÁ²o|…Ü+ nZIÄ·]>­§–¦×Hý¨_¼Z<~üÑ 8Y¹hï—µU‹“ÆÖ(ß}V ÌÕi\¸žgày ô¯zC»]¡-éPá6œ\onDùH¹(¿Öù¾>v~dÅo˜R8_€Ðî™—|„¾À“,°¶£—§·Ëï+Ž0‹QP‘½œn{i ?~ЬX{ý5`‚¤Ædd±sPô`µ&š¼hÑ ¿•Ò6ú¢ß£Ñh5Kµ1VîƒÑPmO=òÈÝèytTΜÇÂ2Pü½¸Í¡Æ0õÈ#wkM†›c)× rµæ#W¹mŒ¤ÍÝÝ3Ñÿv¥(Š­ ƒñ'Ú^”׃Y ø¥îýÁÖ.FG±`0†Ô,Â4Ì-Á%åð¹æŽ“Á\::ÍYù®ÙwT3¬ÐE®g-c% ô¥Ún‡B?êrQ ø ßÐ- ºØê 8©;“ åW>ó [7lÀ#n/‡¶Ô÷_3+)èR©WhDúnÄ\ƒ÷^L»­ãÏ>ë9k¢€Àäý½'­žÞÙlî1Ó bó©ÍfP Õš÷å³x- e¼õ Þqz®>;Ã\–`®):»_¶@p†Ôíf20+iq$}@¿{µÕHýø¾ú€´• miÀ«]«P¡‡ƒ©õBƒ^ÿ/èG4ÈÜvxøå?|ºn5î2–²tÕ@¸ ¢ÚV6ÌQÏ—ƒ)+íÙ@ÑÆ«eJç9ËÎäa£øñMí¤1! ÀTÀJ$áˆE¶ßa}U›¯̪tÏ.øëó,£”ÞSª±×ó9žúÕ¯ðÇËÞ¿½gS!ͬîíŸ~ý{ÔŸ9¦í©¸óI8fœkUÞâ{’ÈþQ¬ ‰ ñ@uÂxê#k«–¯ D¸w@_âÀùk{èškF\§\—ƒ±äâ¾X‘?^}õ>èÕhOÌyw@¯®õý{/CgwÆ®åGÚÆHû(µgÊâäåR9s)G€Ð2Å÷yT0ˆiì( ÆRˆow7æV®2M¹¿v„÷hîy=ˆKA…j\Õ5Go„þÈo ^Ú± ÝmÀÛ—V~óZß[Þf:Õh‚€hMªežãÕÁÀZO5óú›‚ýèácÇjYw*0­·Z1¢1:Çhðê-[í«vÀŸùÙBvSèãÉÓj¯íéj*À¨ÛRÈ7Èû}kd>êtÿwc!k“žñ[ÌÕJµ¹ xUûÞêL í¼˜³¾3@Î[,Fxßa2þjdïè ™A,IIJ B„Z—Ô=LùÕÊtb™tM^®±4‘lOÝv ^±@ª{N-uR«M{¸ö4æ6§\…X!Ñ}´³"é_³úô`@Ü#‚Ž¥2¯´9éý¤®rÑtªIJV\q½ì½Ïú°@å͘ð©ñ¿¾G„>µ¢Ôf‘ûâ]°* ÍUL <ê^j‘ò3k¬=µˆÍK?ŽŸeû'‹œ#¡–¡Æq•4fìwÆtNÙüîèc Nk½»Zíh¥´ÙcE£`#ÑŒŽìg¬AX) P9ë8–wÄPm–{}¨rƒ­ÍHÚ(.S œGÊ“áÊ–³ÎC«‹O1ß‹…€rÖz¸µ‹iä´Ïç\³sîZç܋ιvçÜZçÜWœsé¢rŸ ev9çžsÎ}¸è÷ÓBÝι÷F®/qÎ=ìœÛê®vÎ}Î9—ˆ”©tÎ}Ç9·-”¹Ù97=òû黆›ËÄŠWŸFuÃQ€©i{#u,‚iÂUs¨}u±©H¸‚ÖUs¤kŽuõ±¾ó¾®Bæ"8¯ 7_eƒèÏÕFÝÔ5)]WG&“)€Qm_ç¥éWÕ*ÍŠ£'ë‰Â÷¼`ó[ñ¶fÚm©úÃ+ÀF爹˨{K  ~ýÙË ©3_D@å“ýby¨Á4â[¿3ˆæX·°±2 X8Û²L;ôPH¥ Ùoj0MvKè³6)ç ¤Š$®, ®KÍ¡~&ðV}ô5`¸¸æ9äÚBߪuîNo²›fÒÏÊô ”ÁöMÉT¬ë”uØÊ(øŒžN=iîÜ‚¥Â!Y->Ûy‡4,z®€fÊ„¶+œð 6\×þ4³àuP¸¾%¼«‹˜õLõÄÀwµöèý V’è˜+5Ö{+¸Tg2«‹ºUUãÆ;«jøû€y‹KÐ=ÙXÓ@8!ð}]èã™Nlõ<‰5y¨¬¨ ¨0iì·n`gK/]½Â³èŸ\>”;Î1ˆi÷h,4Îà 1½¾iojà<‹_t½¸l¹íÇ4<ísÁùx³÷¾x pp¥pÎ]ü=p¦÷¾ø0ðMçÜòH;ß–#™¿àœS<»8Ç{?!Ô}ð×À…‘ºß–"©ÒÕ å—ιÝÛûnBÍ ªœ8LcÛiøk1Ÿk=S@A‘Þ”›|Þ4ß³*Ì-Gý­ÕÊuMØ… =p+Ì=õÔ‚à0 óWábβeÌ;ꨂöÞcÁÑ œb – êÖ1‘Öƒ2ÛnÙF#•/š"R]=¦ÕÂq‘vÕ¼ ,ݮͪ”àb,n6©.6íÈ5uåÚYNväá‘5¦aÞ L{Ó›H×ÔЀ¸›ôDxRÖb{¶†ó\NÒW:$#ÍÓ›-VH5èÚ!`8ø£Â¢jö“À¥?úo*;·›;k*TT Ûj H"is'bª4¦‚\ ¸uÀQgŸM*ð,¨X×úÉ[©G‚kuoUgî2}@•‡Wj ŸNbP÷°Jä~Pá>è£Ö¢*DÈŠZC4}ªΖ|žŠ p‰H{)à‚œQÐæ÷b._§æ3L }©ÕC÷ûü„ñ8œ½\x¸jÇ6Óf¹Óù© ¤sªÌõóüZèk˜2¶vgz©;˜”6ËZÕ¸q±‚VüÓ?íë!Œ˜Æ|”ógsæW¾²ÛýÖ²²'4õCÑpñ(¿Þ>_Êi{´ãI½Ñ¶1W¥â2ƒí™¡¨\m}9ã ¿ÊÝc¥,Cõ #£}.xï×zï¯ðÞ¯ ß_þ 85RìHà^ïýӡ̆£Šš‹zP¸Pv»÷~@èç ŠDç\pðÞû—½÷íÀ? bNÒaRÆÞÊ!àB]9T#ùd|žˆ€¨KŽj?Óˆv·s!¨Å@ŸæÚW@¶°JÚXÛoÀ-I¡ßºHýf,~ ~{ôÆ u6†ruž ¬¹ùf^¾ÿ~òX`$‘vkàM»fnQmíz>Ô×öK_ æJ¥ZgQYä·fàåxË·¯Y„¶a¹ÝóÀ†^xï}÷‘Û&íµa@ïÍ͉‚…EÝV”*,u!࿸ÿûß§«µ•]@«“òÈÝë>Ì’ ¾÷Ñ@\m_Aæñ˜†^7àT̤ñ¯¿ç/©­µÌ4*¼©‹×¤°öƒ k¢‚!˜ö\óæk¼Å.L бh øW^YpÒ1&€™u5T†¹ô"¡ï‡Ûeü5˜+Õ¦NÈf%õçK˜õLJ5™Žs¡ûäüÅr½;26ÍÚ¤™µª°xµåCÕÀ¤„e¹š†¬íußüY!5¬Ãüûo¼ä\ rUiZ¿³2/{­ÉHõwÀ¢…fÁɳ—«u²‡õ¿™@»7÷ªæ¤­ùE§[ Ê/ëµ hÍÚšŸ˜má¤éÓ8PèÞï~w_a¿¥»¿õ­A;Áþ' Å—rÛØßi´ÂÈîðf$4V|É> Óð´ÏƒA譈˵Ò/“œsG9çι· ÿÓ·FÊüð+ààÓÞûžÈo8çÖ!XãQàJïý-á§yxHËzïw ãèðýZïý›†´=Å7zXMXþyÓš–RW%€ZÀ¥.#•˜kË#=N¢ÚÖ˜‹ŽúÒO­ì5þA“‚ôæ$cZƒeGi LÛªZÌæð®‚T«]•Æ濨FÜ4žÌ[; ¨Õ•HSœîÀ²<- îýÀ›f𛆯 äï-]ZÈF£nD„ß~»-O72– ]rÆ!à\C§`)As@›x˜œÃRSŽÇâ;Th¤*,i x0”›®U#@Q…”è¹ [:d<ÝÀÌJ¹Þœ< Võ×a’°ž·Íw¯Ê*ÔèúiJÌ<"¬ª¦[×AÇïÃ:®kï,(êr•Ž”WµþD­NÑ N^‡ Nú» ?¸áa;Í[y§¶qa »LT­À”f³’€[òv(ßFàcÙÌ´´Ý/yºJ½Ü{²…û±6iû@ï—B½ÇŸ–2z¿'ÃxæÖonS™PO?ÚBŠ× à·J›³fdh‹ŒI-X  ' ÷lPÑýõOÛ¶•]v4Ê}"†Ó—ˆÚ·l¾Ð^¢½ÍÇ¡úkß²¥$ÿŠy=Ú½½>R«I)—}펦»\­þžØ3Q…_):…Ô×íw‚sî Ágõš÷þàjÔ÷¿FÀÿS‘2·yïçzïgzï\Ü®÷~‚sÞ‰¸~RWàÖ¢*-‘߆¤sÎ9ç(€û€;ÚóÏgÜòåÔ!îõS¦°üòËÑd¦€_ÌA‹\,&ÏŸÏ;.¹¤vpÚe—‘œ3‡®0ði'žÈ1^X"­Î¸â ª&NÄ#šÓ£W¬`î¹ç@M}&Ãq_ø¯¤Ó…¬@ÇŸ>S—//ø¼>e ç\~9ÞÓ/ ƒO¸øb¦-^ŒC@çŒùóYö‰O\7€S/»ŒIsæ@ÝaK–pÒEщ€Ø]98õŠ+ØÁxDHh–}ò“Lœ3‡p0pèNdöENW® üknnæ…uÝTSW¬à˜sÏå9$ØýÞL†Î+¿Áã©8Ê ˜^ËZÂ= œ^Ï ¬xÍ÷Ä\Gã¾³7h¤ÂÈž¦=ÝÇþÂ÷‘œ÷{÷1âœû à?ÂW,ðÞ«[Ï—€÷oñÞ¯ŽÔ¹Xœç½Ñ9·¸øª÷þ{£Ãw€ƒ¼÷ïpÎ <LñÞo‰”yø¶÷þ߆kﳟýì´/ùˎDz¨LG@ŽnnÕ²*è¯ÁrЫEAÝ)¢>ýª‰UÒk hÉ êÆüõÁüÁüö=à¦Laç¦Mà¤>W3)¨9ükUáK–ÐÕÕŦ'Ÿ,d2š€€~ÍÛÍf=µxæR”Œ”)ÖL«Ïws]»ÚÛ%€5ŒWc!Tû?8ûhøÕãâ;?ñ?¯ŸÛÿxõÛÏa1)Ä¥c5æ~“”Óy8àø˜§®¿žöÖÖB®~uÁÊ`Ö“#M™$›»s…6ÀŒ„dœQISù¬})¨N…ÏÚGÔK…$LwÐãÅ·ÿqı î>®ì²íX\‰’ƨô`{LÇ;IC›ŽÿÄ'xèk_+XtÏj†ª™ˆKR* >+ü®ÅÜ•tmu½õ|Œ>ì :å…ÞÊ÷F„_ÑX0kšj×4÷ÿ¶P§! ;r–æÖ!÷„ ØÖoçŠÔci`5˜ž*~Ìðà5×V|øtî¼úÖ¹º `ÅNå¶kïb^àÃ;ž6׿šÐÇÇß?¿rãá•¶—u4ÀX¯9àЉðüVù¼¸=ÌQÓ–v#§Ï|æ3Ó/¿üò×¥ù@Ÿ£_Ó›Xç@yþÍ~{­P)ìa§Æs·ß>¦mîK*g<å¬s1_†[óÁŒ¡,9»»F3×Ñ–‰Òî왑ô5–@¾ØBS|½kË`tø{ÞÃ…?úÑëúYº»´×-ÞûÿõÞ×…W½÷~ƒúðgÀ¢BA ³€ë¼÷/†6V7…룡4‚ARàw#.à8çš0V6-N é)¯`A¢ Ö£`KÁÎLÂNáU¼eŠÔUðÙš—ë öÆažµ˜ûQ–g¿;"¨ Nx!0Ã!€SAþ¶W^¡cëÖBlo½àË £.Ý §*èèC1zJov'‡–övÒU&à4†ö³@cM8d¬ ~ú¸¼q¹˜Ö,î";BFÄÍDçÙæºo™À[M7š Ÿ5ûËÆÛo§©³“ã0ÁJã,*±L?O[»s,}ë)¤1wµyáÑâ V®ÇÀp:ôS¼?ä¾Ò³4]¥j¢§½ðø‰À로žñh¿|ïÀ2õ¨£m©`§qÓä}MX³6àù›o.3L܃üRX{ò0©ÖÖ¨ªÂ2G)øÕ÷³§™?ÿŢÔydïg±Øœè„9©€¬ç0xD˜Ýž“±ª0¬®= fÙ™½ÈÙð½;p0 ÔlyLrpÛÕ·âô¬ ×C×ÞE ZR§f`¥ bÝt¬_OëæÍ…ÀàñNÊ(0Ö“†£7¯Î«7 „U0š„ßâo½m§ðè-ã*€¦Lè§½j+Å·¾'ÌgRè£Ø²÷èÁV;B_ê¯Ù™4°¶3ðVÏ(pášò£÷¥—x±¯'"í)ÿv…þ;°ÌFüÍï §&·‡6çÕý&œ´Dx¬mõ×m° s=$-‡€õYØ º=\?¦FÚQkSw¤¼ŽË!`[÷†ž¡q*-ÀÖ® z°8ŽñÀ†çž£`ÂWåZKZûáÙá_ ÐÙoñ&À©“,†âîâ(úvÀ‡§zñ’˜æ¿ 8s† c¿ä­R7…ì ¸Vë¡ü3«­NøtµÔõn½§°?ßzɇ9½BôËUXb€à«*I ©ò¨ vÒ˜bÓ@ud›:$\›6¾¢pa%ðáyÒ¾<ïÚó×¢‚šZ%zò†ÊÒ¬–ò­.Uo4ÀfO€‘ú»—¢Ç¯¿~·ÆP®æw_Æh÷?Ü;†çK¹¼.P. ZKÜÁúìw7D™Á€³ò¦©áx¿·¨˜÷cqïÄT>ísÁQ´ÿ9òß¹:œeÐîœÛ)ó1DaúGç\;t|#ð¥2ÚŸ\(ú6ÿxo$ø$ Ñ}ˆ…`#¢$>s¤Qí¨žv[¹®n1 „íEÀJÔÔè± PôKQ/cÕ´ªK„j‰»ÂKU›_‹ , `J¥€0KÑ J‡üZì²\ziÁ" óQDÝ¡4=êFLËëC;Û#}¨%áˆÏžZà—›úÉ~Ô¦å]ÛÌ¿¤~ij ž;n/`­˜=çàÂ^ê–¢–eGÏ(hí³á}n‘.[³† '×ÛC[9àø¹$ÃØ5㔺ñ41Ð ¤®R)`%âúц¹ŒÖLÓÔö`ùþu­`V›“"”¨{Lx2F¡–µäèxÕIƒÆÓ¡n6ŒYÝjúúä·.LPSá¤ÛËšÍH³-OÁg>‡¸Ëå€FM ܹEúè©K0µÚoICÚÛ[=8|ʲ&&…yõ·® )H+Äêã¯ýÆÜ{¶aV6"´Ý³«…N3xUφ²=Üùõ«¹¥_,)©~sÿKÛzzI„þtÝûBý‰˜³.ð°1ð씩²gú€ ;ûé }Wÿý¼YàÔŠ2³Â2\ùH»1í=Ú×þÓûÚÂQ® Ξèc¤`¼Ü¾ÆŠ§åôYÎúŽt<ƒ¹? Ö~9m”ª·¯÷^”¢Àh„µR´?Ío¥}.xïï½Oxï«#.FuáÌ-Óæ½ÿ°÷~zøm¦÷þï}ßPm‡ºÿá½?,Ô›à½_꽿¡¨LÖ{ÿ·Þû¦PîLïý¨|ÏTs¹ó½Vª\µƒ=‘ëzB° šç_'¸ Zõ Ûê©[Ç‚’£'ä6…2uØÙ ÛzÍ•(šnSO^NššÈ_pWê~òÕ¯4¡30€¯‚ˆZE¢}MÆ ,¬6!( üèóŸ/hïUØ5¡BµÈ„:­¡Ï혟øá¡gW¯—½{?Éò÷øºÂU _^È{ÆWΞÍN@î‘G’¨ª" üaUkáLÕÚê:nC€Ü˜Ç¾±ª¨ËT‰Xø«Yê!¤7¬—¶{p(»+gëN,ÿ¾Z9º«Œž¦T:á“ú÷G­ »°µwˆð’¦/Þt•Hü„ÇOdVî”1¾ÚØæÜ“5³ËŠõHkžM]Ò×fäÔ੘[U7–Òõwwo0žé ¿ì'V£¢²„Cív_é=•@öžžrpÒö¸Z²òÀ¤Y³hÂuž°}½G£± À{æVÂ\ì&…þNi0îžW,o˜ÛhÂ`¢…ØT&À†~áOcè·Ù« %ÓéaËìΟûH´ÇcAÚ_TÓ[•ê¿¢²²ÄÕ±¥¡@åpšÜá¨\p;œÖ¼0*_Šy=[F*ð ¥í •c¥ÌBV<çâ2ƒí™ÑZCÊ.ÆJÈ( bÚó´Ïƒ×鉿 Ús00¡¹èD¥°”‘ÑÞZ0-µ‚=ØIûP0Zê9 *ÑC»–`Àö¨J Á•ªUoÄN~…pÊñ‚L›;·à^’C€Ìœð}ÆëÌ2¢zåMïv 2i‡Q=Óen ÄT{< ;'!‡¸t(8Õ˜‰)AzR‹ExÀ'6š ôR˜_g¿µal3„¼-ô«ZòžÀ‡CçÍ#¦Ó*¨;`éÔ±#.Ôûm‡À¦k¾62¯®°.+Ã÷qaÜG+e£Ïé)º…öÔ šë¦SÝ€¥µí}%ïåð¹²—tMÃ´ê¦æ‘`>º`aZ…høÕ%Í…~õ0µè™y/e§V[€ºjÁU°8V’+¡^qãØßWì IDAT1wÙ‚Y©V‡ßÚ¼fbB˜µ« èÉÛ!wj¡É#BƒºÖ=•3¡Žþ‹¿`;ærðTÞ¬mzŸ©5«³Îý|U?SÂoÝÀöàj¥§ƒ ·†T¸X<‘zò¾àþuÈD¹‡T0éàÀ¡Ó?÷¹=ÞÇÞÅ€f°ÏåÐh«K ï+Ò¾•/»+0îÉò#¡±ÁÑ=3Ú6wgÏî.iƒY˜b=Å‚ÁR „Ô_* €˜^úà¡)D¨¦p¦ÕÏbþã@r˜–QâJ!àì÷˜Ïó“½6^Í/ß„ùÃk& µø«x pjï¸æfª€MõüÕ·/ã‰æ¯šÔª?”ö=9;ÕUA teÚ]uqr@íN™ ØÌÁ¥_<¢« w/ð@«´uÊ4™wmX“­Xv¢­yi[ƒZ5G¾º~=výõt·µÉ˜z¬ÎzÅüËûmtزÅêΪ@83”©þ¢Yæ&àõ>j~õÊ?Bq΄Í$¤¢®‘šÔRØ™ 5Àñ§˜ÀGhÿED8ssˆöû¡ï}¯°ö]aíÔ Ñ©u½5ûTKø<Yß]vnB ²¯ÖoA"¼®cèBö¸¢¦g-âÂØóÀ‚GMh»*ôÕƒ¸ÿ$BÝ“Ã?H3ü¯{pmV˜Ëo.¿¼0àõs%pæÁ¯æ—~Ùá]­`OæLˆQ~V(¯™¨ÔBñ Ÿ Ä^Øjîcúœ8Pè¶/|áU׆ÒVŽTk] FðJõ9’q ü†jãæOºìñì.k‰‹ZôZ¹4–žR`0Ê—¡¬ Åmô·Re‡û},Öewø¦¼)ÇÒ3”e`¬„•‘´-;œ`àKüVŠö¤@÷z¡X0CR@¯XSPæ±ì4§M•².ü–A@“8j ²j=Cì&ë˜ÑD]+ˆæ{\ø½;IµsóQ ¯¾ëÂOý®Š´¯.'=@ÚYüBå¶mrRò´Y|ïï®,¸BUº‡]%wkñóÞ9ÀÖ™C4û¸´ ꎢî;ðËgᤠt×é‰Gb:‘ÌJ‡;©[<´Qê¶s§Èõ©ßü©Ö†èiÕšÉFO!VaLã-Ò˜Å`3&`hÜÀ†~³ø(¨»y›¥¬A4ÁÊåEc˜ëì0ïMÞx0³ ©PP‹Oëax„rµŠ…¤†¢àX}â+¨Í×ýªÙ¤T;")ãjë—q«o| æâÕ„X²ÀA!&z虦emG¬GjíÚx¿¨©à¯ÁÄùÀ øž†Xk’Àãm¾ ‰ÏbB ¹À³Þ„­îH›.Ìa"H(hÏ`Ù—À, =À¯Ö_4(Ø>¨+Ôü&‹eÑû³/”Ww=½‡—Nµqë˜fG×›L`Œ 4õgËµŽ…ÑÒHëŽEŸCÑPíö÷ö–¼¾7Ü,JÅ=I#™Ó`| –²â '0–Ë`×|Ñïåºß G£ìƒñf°q÷·»4š}2RªøžÜ‚òDÒÿÍ' ²q§P=¹µÑ:ƒeÀéÄ‚/ÕÒ ÀÃ#OÝ}j¦™ 曾³4``SÝŽ¢íޝ÷ ¬Õ`@ ´¿ûH¨ðÒþô´9€íO<1Àç9ï¸iºÔTX<ñˆš÷†º'©–|-°)Ä µÙJHˉw²öz?éU«a~½ÀñSì °,GYàÃse<Í@»-¼TPMDÚN…ÏÓ·š.X»Z°3|VÞ£.wê&Ý3 ÓðÀ+–Ù‹Pç9àá]Þˆ¹§us`e%ŠŠµžÅ×ö4 Öçë„ ¦^ ®ÃYv§Ý( å¾2•+Œd,å´5Zp\<¿ý]8(¶$Àëã~Ü— cH• ÚŽö¯®?`)UÛœE@Z æ;¯¦QjP T‹¸[èwÕʶ €1šu¦È&ô`îJݘ›‹”}²v)O:I4Ø!X­ ;1pZ…hŒP-D#w 8jÁ|&1ÔéxÕE¦9\{, ;CÔõ®0¾]À1óSÔ×%Ü*˜Û´f €Ýt[7mXo±ŽÔ`–uéx>'ŸSÀ›Ó0ýþÃj*ä³O Úìpâs…ªÅÎK¨®ùúÏ '1Þ_ ë{Ö’LAÀSˊõ{ï¾› –‘Gµßjñq˜¶: Ô%MØS@ªî1©0=­OcZóÑósÚÞ—ùË…kêª=ÿ@ÆyÌDfHç‘ýP‘4aäwOv2;(L-Wº—Ú[À®ÁÈëz!çe~[½Å6Ìž%N9º†šfW³*=°IÚj%Ä·ž&€ÿXeY¼ªBùÓ>ö±ÂÞ'ôñìp¶’~Ö·¾Åc)RÕÊ6kÙ; óW [Ù§z¯ÖÏe¥ÍU˜`XÏÀsrÀáS§Ò\ é„ùHê#Î>{Ÿö?”›Å`€°7± £Ï;oµls+vÙ)—†rC)Uv$m çtÔyç•{ñœ†s*媲»4 /W¨P¥÷L¹m Wn¤|¥Ä÷rûêÞ+J¹åš¾Þé@ú¿Ùã4ã˜ù…?{u;PͼOÕ j™Ìý%i+Lª“Ϫ}Œæÿ×ϪõVW•ª’æžÑ‹€Å]½ùø×  >ö @êÃgãsϱíùç YŠ¢™`¢–µx¨Eâ…Èœô?þ̳…S‰ ¼ g{4×ë— {/&¼<ÿl¾=G/¢½jÖHŒ‚fBRëÃìÄÛºXßfkÒú˜š”Ï5Àï³ðĵ×òÂ+-Á'šíæÞMÂ{='@35c@R³Qµ‡/˜Äà÷tstSª ªÏÂ0¾Ã:nC@®ºi|ŽwIРçs>Õö¯Gö‚ „ЬÆdµ\èÃYã0rÀýßþvaýõ íµfðÑs0v+· Ϫ0`«ëÌ™@¬yí¿Þɵ&pkl‹¶Ñù\ ¤pV­];à?ÈÔ œ× mÂÜ«€“'›èØ*›ãÓ¿ûÝ€Ó¸{‘ÜÅ*¼iüÂK‘6Õ-K÷ü-¿üeáÀ¨àІ NGcB—ÇÜÏ¢çLhýG^y…õrá ˜ w Pw[Ûð…† Ý惸rÌHûé8»[[G]wwú-§Ír®¶­áÊ*_Æ¢ý±ŽÃñe¤{l¸¾JµQoF³'vWøŠ †ÌcÁ`l( Æ6<ö,Ó07!š4êNá1M»‚>L£Üln·Œ4‡kzªl/pFÍÀZÁƒðµ 88g‹©†5Èð¢à[}¡{5O=EvÇzvì(øž÷GúxSƒt3õ"À´ ËT¤àVý¥OÏ ªýN@€âzDXRPVY[v„ëš“^ƒT5HWsò+?“‘>ß2 ÖuÂéÕ–JUO$><Ä}T…ò-;vЙˑÄÜ‹ºÂÜ4³Qº2A7ðçáÁÚ{ê™-lë÷Ðö>º!¢#ÌAOèS>&œ¹³¨¦Ÿ=pŸ‡å!RVç®ùò5.%ƒ ”zFX« » §W~óf*‘}£Z{—jΕbšqµh€=x;‹C-¯¶µy÷NäØñèC]…Of[#c÷À.K“ƳŠPöå©7³º¥+‘Ö½g³Õ{¨ÇøºiåÊBZ`ƜŬ z~ˆÞDx£qBQáùºé=öÔc몵 ,3Ñ¢·­(ܧÕX€òd_}ç…σi¯£×ŠAMô:EuFB£ÑžtŒ¤iïU¨TMy¾Î4Óºîu‘2z²¶êsÕ=Lµüš·  *±LN/„ò @*%¼i ãSëVUX']ÿ)X,Ëx$hÝcg?$€æ„\[r0ÌMˆUI¥$pR îÍÙ÷ñ˜E‰0®zÌMMˆS!`ù±b«Ò6܃ð[ƒÂó‘kêz§Â—nͦ'?†¹íiü†CÜšTè!Ì·ÖÙ3`ðè-·2\ið½Þ›1œF+(ZÅ=mÙ¶ŠAr„‚RŸÇ¢ír(µåÓPBAÌÇá)þ¿cR@ÙeUÑ–4˜T]45i†š{œšME5Ãê+}Tø]sÜ{,à,ØÑa§ÂÎwƒž-€÷À¢Ì@w…n jêTfLŸ^°täkV[ºM XíÇÒª*˜¬Ä@¢j]U㪂À Ýæk®véùÅùãÁ´²šâR]=vt@WÖ4ì öÔB¢. íX¦!…j½Q=ýä“É×Ô0 ýˆUC-aŽ:6Õ8giÐV9x9oBÛ¸P^_jAI«½ éákGÝ`|Öqj«Õa,³ì °žh—¹F…43”ν¥W~;æ´Ó¬­ZJò¡ŽžÇ ®qI‰Ó}òy{è_ô PW †ËoC‚Öxn ×wå¥ßÖËy óç¿¿O²iàòL8V—&ÍŒ¥÷’ XxTZÕûì £.*äVDúX„ݯ àUàÐØŠ̪G˜³òC³ŒiF§¨àÜîmipÿç?–*ŒEüÉ•¨®¹yXM})Íh©2¥´þ¥„…Áú+e©JóX Ç„ÔMšTr\ƒÑPevG{=\Ý¡¬Ão¸õ,þÍõ“&•µ&Cw¤u†*«×³j Fà ²ƒµ3”Т{f4Zób`=ÔŒ5U›Åc>P„þÝ¡X0CR­®º­ÁÜ!¢‡’iÆõ?VÍR“Bˆ›^ìôÛ?bùï5Ãúe«æUµéxúl¸tÁµ}H¬ê–1j––ƒ€Y“&Ñ2e DÊ*€×1ªæt;fYP€]dͰâÚÍÀ¾}¨;¾Âf}ƒ–™•–ÏzV‚f RД&LœXЈOC´êýˆ{Ò„0·àÈy™Âat©Ð^;"\Õ͵µT$ìÄÀót,+Žú£«À£™ T8ؘ—L;ÑØ4×ÿŽ0†CÃéϪ¥;%[­Niàá6âzØ—K%™œ´x•Û€­7Ò¥?ŽiŸ5ý©Z¤”ÿãÆQ‹!qTƒ¥5ÍÇ“Ó"ÜDÿ,4+“òT…Å—°ØåE’´“}5i¨q¶ŸÔZýk cÕXMQªBk7rÏè>mİ{DÇZØ[K—„Íh²þ<毮E[xÿ¤€C‘5w‘9×Gx¬®}3Q ~X-),¬Z>ý;ghŒËBKÿê¯öZ_¯5íá²~t_aÄ´'x\ òN„/£é{OÔÉý[¬ÙÎR1ܵ=µgŠ×`oZ“FÚÎPoL¯¦X0CÒÌ*Ô¨ ­6c™_$.ž,7¯º{ÌÅ|Á=˜¶ *[ø-”Ò¶ o^hše0¥7D¦±¯ÆüíC@U;îZ€Õ?ÎË?\`­ŒÔk õv„vXZÅÚ¤ŒuG˜ƒù*`Rßpõ]WÀßÙoe‡ë€!%S5ðT0Òyu/oÙRçºPïà´icõÝçŸï.œ@ÂRoö…r-wÜFw{{áp±yˆpÕØ«…'æ¶´Ù4¼ª×ôª1R×.ä 0ͤû@µÞ*ìô„¾ÿ?{o%ÙUùþnDäFRϘ$ƒöª€~'^my2)µÆua ½=ºNÔ/­K‚UþÖ5³ÀÝwÜáó6L™Š«[¯Ç)m›Ú’2ýP¸Oe‹«…ë™W¦()îåu­0ÕÛjžÄ½I¸î’6÷ºœ+òåßý݆-ÎåRÉ*ZÉsPI*Yv«YXkµQmLÕ¤Ñ{L¨^à¬ÒˆµºÖûùöUþW­íjVóx®?ÿ›¿Ùר‘qÌ÷šF%n³Ö¾ªµïcp[m¼å8.pÖ(8®ö¬4Sj†ÔZƒ%ÁÂeI1h¢¬Â©CÚ¬`r­ø²ÚÞwÔ)`é6sèé¢ÔryVsÑgãÉVÀë³Ùƒ°÷$$¸¢°¬«#=Ë1Àz„ÒJÄâ‡÷æ (]Ùi€n÷vÄ1ÚLÇçÜâ­t”³x|€â,ÀÁ™RqÆÀy±m4C^Ì@¤@_ÌüÍw>µŠ7£¯çª­fÉó1¦ù*ÍFú¨uÎ’R°89—oš.± ïe9 ýàW¿ùMŠ8`ìÀ< ïÚð€SUEN0@85Ïà€m§ äÃXz(M›ZvMd m¡²êо €: œš³Ï0ncP“´ °U„b'òÀ…½½YegqÝ 󘧢±çQZõY`Wãºñõ¯g/äµ7œ«€Y¢1 ø+ ©ÀõxÔÞ,^…XÁ¹í@k[ÝI’ŽÆ¡ƒÏýé?0¸?Ëðàqð ðu@GÁª6ãVì-]£yn¾ð…/°ï¤V­Ëêœ+N¹0ÞõxÜD>jG÷-jÕÓ˜¢)tÛs¸Ò×ÍqKkk¦Hj-àå—_œyÀâLMò<|ÆÅ„(°Ük‘à‡ÖûúŽáŠéÞ±Òýx]Òp ,W ÏèŒïýápÞIW>5G¢òL„ö›BxÕxDë­h|žÃý¯õ.­yß×qMyKúÂñ“e=õx#­í†K.ÉžÓ‘pŸ§0ï…âf–¤>¨d­vM=+u%ëk£R>–Zm4Ú~-+öb¤Ú½6b½®'µ<+ÎO5™Ï¸ªy꣑kªI-AµkË×¢Ú”ïïJžƒF÷}y;xÈâ>êA©'x'âyÔïO±ìøÙÛK]–ƒ&Š‚ZÁÒC ÀüÉë^G£–`¥À»ì¼i Ì.ÃE'¦8\€FSöYŽÄùºv/àt(ô©BUÇJ¯¨âh¢;Ì`Ô•0è-×_ÏÕo}k6Fv‘Ä^û #<ɪß¼u+,›ÎÒm}–y÷œì ý?…Åd´lܘÅ[Äó–wÞ}wvL_Jš/>¾Š~Îp›Æ3ÝtWâ : q^ýK¿DïªU™gAýíŽæKÁ¾RZpÀ¬û…ãE÷1åMœú<À¥Ê ­ÕQàDÑ®›Â=×÷ç¹$ïÓà ^˜ƒáÿ£ÑX[1p­=4þ—‡ámùHüåñÈ…§ŸÈ\…OG}%à½ðòêt…5m ×ÍÌÂÙ˜{ž¶Ò}©«pa\)æÍŠk„ôDÿÆÐþ´ö 4W|OÇ"EQÏÏýöo—ì§8;—ª—OcÀ^Þ9}6Lë¡’ÔHB; ô_}y*DÿŽ<þ8g±Ñ=)èû¦íœ3rí{ß[ñx3¬×ÍçSI{Õ­·>½?ÿRI™K€ëÎâ¼,F:2_kx<7 U*õ÷b³Ê¿XÆùB%Å ‰¢Ì3²Œ«(•€¸µZRij×BˆÇó(Å"¥AjœÆPcøÖ¤s¤»€ÖB>uñµ`´1ªºûÆÏ‡î¿ŸÝßþ¶ãÑ|çhêwâØ1ºðZ€oìCDnØ;4A7N-JðY ¦Ù¿ŸDâ¶DÉPnw¥vÅšE’•X_b+ò¾Ð×8Æ ×ºÌí¼{þäO8}ìX–FUªÊ %ú&œ¶² ´[óþ¤ûè Ÿõ„v.Í{‡Ã¸2¡ê¸“x¦#Y¦[púwgæxd®´°\7ÆíWß…0>Y¦æÁ=QÿæJk³S$>ÿ@hãÉиÌ|¯ÔgˆÄ”»ã¸"0Ž)akúJ`T|nªôËZYš®0@,Ê™¨jZÓ9Ü£ @ÿ¦8‹¤¹\Þbck×5³Ö·ªZ§ÀþûÏ2…iÿh¬òD¼á]ïÈä8¶G:<]áØJÓKA8 lʹÒ5ƒÇU¤áÜàŠŽÏÙÉ9#Gy¤¢4–ùX+y*Ye›ëÑ™C“8üÐCM÷T³¦Çó´X©¶^•ú«5¾jí~衊ǧF¬ÓÕÚ®fM_ŒÇ©RÕ<•ÆŸ«¹©ðë³QB£ÏN¹Gê¹…®Á¹,KŠAE @yËul Àúñʤ¼åÊ¡žFmàü áÜvô*ݧ”ÇÂu£Àôì\F‘ÑC.ëy°®ÃÀ¯,µ¢ätã㌈ìa׈Š!š…8úm8à[Ή3ðŒ 4­êH20'°¾·Èªy3bO€ –ýçoß‘Y¼¥€Éص ¥”1ñèe½UðëLóÔÌ ÓišneÙQi˜c¥—Tv F»ZÝCnZi@W±Î9å&ÅëtáT'eR U­VÑ3UXNÃ5Û±ì9 –r©J»ª!Ò,ðO9H.ÅIƒ¡ëq…Tc˜Á€w/ðþW9Ø¿_{§£Kµ„vvG†ì˜‚¢µîòŒHÁâùÝSxþxxí^ÖåûS{As0‡ˆË¢/P}b¦ôžôõ|}d^*}Ö{qZ€©ølä-eJÊ¢èL¢%¸GCûEûh/p¸èÏ„¼‚R>EíÒ=*îE â¹ ûï¿^ç7Óƒ°ñ\x2ž¹ï> ù`g>À¸Y}•÷Y«øšø:]³/ÌK#mUû¬Ñõ{®Áíbûx&š›…úfÊÙ~FžooâKE–ƒ&J'F“À3Ò€=|í-Bé-EgPì¬ÁÊ$Àçÿ¿ RÆðAYrfc« š©ºªÏ ðý Ϥ¢4¢ÜÄY{FqšPÔTüJq²L·ð·yëÕRG½½r«í±‰”Ñ0GSa,;£v—ãÊ”(6uR~í5¿À2¼f ¦0 X*6AÊ‚('Ë ÆOµ{p€¨Ô¦yà+Ñ\¤Ü)-i¬ðô…{•r·}§æ<0y"ÌWgâÖ÷ÑÓ×–õ)¯ˆª2ký6öyLG£¥LGsr/ž JcÀê ¤æKjµ¥ùIBßýí>/ÓXƬò‡€?ú®G}¨6Â0¶Oöàt&ñèŸÁ3!ÉÛu&ü¯=§ùÖ¬@O÷Ž9í®|­´NJGª¸‰\ÔV\pMÏ‹žÓBÔfŠ=_±5ÿÛø¾:§¡=qR体R!åX ½*Uwc^Œ8ø^AýZ{ydÎ5)·b׳îײ&—·Ùhßg45Ó"_«jýÖ:§Òù•,Íõ®©¶~Õ®­4÷åJAyßŲójµ5Ÿ¹®uµöG3öO#mT³ö—ÏS½}Vï9«æI(_ïÚZÞ¢fÈ| 8… LA™Àyöà…äˆÌ`@út˜Á¦M IDATÿQL¡Ë¯ÖØS;ÿð¡!††¦²Â\Ê’Ô äòp< h\ú8ž$™÷§/v§û—õZÔ®ý”‚YýÅ+n¹…-À“¥Ô¡ãØ^^ƒ%?3ä@V«ëÂ=È!Ú\¸f Ï8NšÞ¼£ßî9‰Žkmõc£×ÓZ7¢L[Úó –b¬=[2ç°š ðÆv8@jpš[¦ì(;QOÔ·æGãyçÊÒ¦"'1…SŽ´Nã1)º·W·¸B¨ý?†BŠIüáØÙ;ëňŠ$o‰hMãxÚÔ3˜âs(ÌaSâ/‰ÍmðÊn¸÷`¶.Rlz0ÊŠÆ;34ssW\àMž Ñg4O„cýp~«'PÌÛ9O…ñ>ÚR%ãWôyµ^Â}Ì·µx0æ|¸G€‹_û  ¬Çµ –ãžy¢f€•ßg¢º ¬ÊªÞ76Ì3¸õ^€ÿLø|S0”1é²pN.±¹ù6Ô-ÅLñ(÷žšËh]R¾|çL©§F%œ·6ÜÃ?MÃæ¨YÿãàîmËm®6†9nÇž¡•¸·à{˜"ùÕIXoþõ-Z™Öiø¿~ó7²ší¸§CûìsÇ®'‹ÿã¸bÔŽãÏL<ý¯3îmˆ`¥*¥è\Ë~臲ÿË•ºr)·BײÖ:^MªY©ëYÝk)z *õ{ÅÍ77äˆû«6Žò÷ž[‡ëYÕ«ÉB,âÅ×]qóÍ÷@µ6kõYïx½¶«õ_i¯ž-‰ûº<š›ò±–_Óh»•Ž×{&ªyšæ›á©Y“%Å ‰’‚cÝÏ—ÿéûÙ¿()*+õf ´ˆqë0p’Ǭ‹ÊŠóÒŒ)`©‡²?\¯”©}+Ãß Á=ÄŠg íÙ½›Áà™) Ì•XrûÚúyEhK±Êóž ÷!0*€4óü ¯ ,>…+ëq¯AOqš§Ô’šÇ3=Ä-Ç=À3Spߨ-‹G¯^ðû»ßeÕè(Q–:ëWÙ½½,±v…9í€èp˜»N`bÜ%ÅMæcE˜‡ÀCpë§?–ѼdgÁISzÂx/,Øý¬ ç=üÍïe'Ís'/¢ÏÔÿéYëWŸ·âqú"ý濜̓ °ÊŠ, 6„>æ°Ã¡ïi hÏ7´ûXÕÇdÔ†€¸À¡”áýž0¾íy;oSb¯À+V¯Î¬¬ÖÄsíK j6 ˜¢1€´aÌâÞ†óûw…㣨$ݸ÷CÖ%ÍÛ,γ cxU€nÌY߇y d©íî)@k!Ä„~?þî÷s¶yàG?ñ –‡±×ms;ìO]‰QêÒ4Œ¯¬¢WkÚO®PÈÆóÇÁ­ÀSx|@ •ƒ‡Ó ´$pðÄ «kgHR¿gÍÝpzƃò"%ƒ$Nó:Ž{L”ÑgSpZ£q)\²Ê·äJAš¬Ö е|93…B¦[ÚE1y(5¥`SXŸ¼ÝSÀ“v¾8õÀø,œšµ~:±½¡ûMlü_ûw?ép;G631ç`[iSµ7d1Wü,ÑN¹gi 8><•)qV!o¯_³Š8X¿ÖJS° ÆU^ýx ŠÀƒE›bhk{˜ç#áõU6®÷\ «Ú\AœÅÇàÔ)­K‚1k­õe/eøÑ»îÊ ¨©ÆDþ? Ü5jJØÆælMÛ€Ù$)Q¶¥À*{–ÚÃk‚ho(P¾ØÖkŸ‰Þ”`sÒ<üÀ^zñlGç…¾‡589åæÓÀýC®<žÆ•·sEÎ&% 8”Ó,êI5*EZãÿz×̧ï…ÎK=ªËÙº¶Z[åÇÛF,it^#Çãvë­ßb½(õ®oõ®©7Oõ<>•Ϋ7ÈÙxÆãgú¹ô½ÔdI1h²(o| D=P”6̬ì(¨y<[àèÁ‚˜ú#À)K¸@ôtxÝ\pÚxNþiìø¸Btø‰¿ú+Ú€‹wìàe7ßÌ[¯1@­Ì=PÊmüªp/˜çbè(0˜;‘Z;â­ËÒ¯ÞK×ÀLÞºÌ lµ`À÷“Ó@_Ñ‹Ž$eéêŸø V¬`yâÔ'Õž˜Äi+0/ÌX˜»å8]Fu!žpÉ‘0¾ãø™LCºÔ¢Í¯¬æâ¸ƒƒZHQqÒÐï 6oRü«¢îÎЯÖouøìÒÄÀ÷ö÷ÿJ¶Z€ï³¹<Šò*>æ×ú&One?ƒ)§»Â§0oÊ·&lþ>ó=xÕjó ®ƒÓ‰Vâ);»ðêÍý¸‡(Ç Èzï‰uÝ%Ð'„‚¼µg§ýã?¦\ÒÐ~KtoúÑÑœ±ÀrÑæö {Ÿ]x\öâ(^|í¾ïSü¹ÔºK™ 犼þýïÖ±…X,~ëÉ|ÀÆbÁa%yãm·Õ¼ölÜs­yŸoÿx$]ýÿÆÛnkX hÔ6˜kÉBAóBöM­kn,››ùŽëŰ˕ý%Y¸,)M\†Œ ¼¾ò'nÌ~äs¸¥º ¯Ú:ÜÐ피'˜¥\8ˆ“+Wº×aœõL4Ÿ¨-CxK)Í€Tþò=ïa%ðä}÷±ûÎ;ùúý6Ž a¬ã–ëË€ËûÌò0Ÿ3TŽOÌÒŽ}>Ž[›{ÂZ£cO…þVø›Sv};¬®¿| ­x^ÿY<7¾‚š[poÃUÀ®ý6o›0 &×0ðªw¼ƒ+p¯…¨8÷ÜqÇe(µq „¹S&¥f?Þ/Ç­é*®5ú%L XU‡ç€5¡òïJ‹a=…ÉÅ4§xì@ pEõ‘ÇbÏPµ%xiTI»Ã8®}$(lwýÆod z6¬ÑT·[»íš]ùº,X ¤ö0V)~ÿ“áï‹ûíœkC?O‡ùïŽOË 6caîT+¢-ì ÅG(ÎEÙ’S ªÇ¸`øé78HJÅ>ô!Š­|&¡ŸÎžElow…öÛÃß1<@c¡t»³a}{0…¬øù_x[¦ôMàž=µ­=ß³Àe±†ÿ—ǾøÅy[ðçcõ¯F ªÕF£}, ÎÌ?|ç èáÙ2ªR£ k>óØ(°.·àWj#Áæ¥Òº6ÚGÜv£R>®j H­kêI%ÏJ£{Qç•ÏM5 Q#û°šÇ¨/J¥¶ÊßÏgTê#Þ ¹¿%1YR š(¢àÈÚ‚ ÄÝó¿þ…Vàæµ:Âç#ÈH}pÔ^eïÀ ¤­Ç\-Àîãê–ãVrÑ,”¡FŠ\aQ›ŽpíÐ97Gëìlf] ì€ïv,Nâñ!³œwa î`Ñ€P/^TjnWZVQ“Z€Ÿ{ãЈ[ÙUp¬7Üÿ>òt6Ÿmxöðbq}x!±ÝOY¿SØÂ\øÖg?›Å(س÷FLâuêc©ÌKƒ¡¿NÜ«£9SL†0Ñ|:€©)8¯×ÆE˜?)<àÖåq<åm'†_Óî´5ÝÓ)üæã ¨& ¥VÏËBû®%ó™ë…öÛ((¯u¬ZåsS¯íÅÎÝ|¨WIÙky; é»Z{å}.IuYR š( TUJPYêWbÖFYaç€;8è)D׋’"P9†ƒœ èË‹ ÅAÙfb”s¿0ãaò@ÈBó—UtIé*ÅëHiMÛ±ô›=x µ5X©üïëÃyo{ÿûùí?¿9ÞëC{Àg¾í€Y€J,pŒ2,);RÏ ¤ëF¢¶dÍUúSÑ¢N`]­¼;¸Å{W¾:_~9Y%ÜBלæE´63áõõ[\9’°oØ«÷Êâ-Ï„æOYœD3Quìû'½NkÕ·ú<‰)ÓyßK}¸B–RJÁ‘2w÷¾äñµ–y ÜóÑphr«6nÌbg¤À%x°²Ò‡æ4>[ðŠ~'%N_ö9àáüq,6fSÁ•gB_¯l·cE|oÌbÏÀXhO•¥7Gs,@¯X“5áüvlm'°gã(nÝW,ĺK¶s{~”BXJÂ$®àè|)\Ú—Ú7šeU’gè\¢U’j a!VáZm×§ó¯±e·ÜÒ›T8Þ(`¯+Y×¢\UKù±ÅX¾é¡–ãFæ¡ZŸ‹ñø,f¼µÆU­¿…ôSÏ SéÜFÛ®Öf=ïQ³%nW,‹òÏ—¤¶,)M”ÁŒƒm¶ÊŠ{߸»ð‚^ 0ú_€±O¹²J )ºFŠ+Ê–òîW8ÒC,N³¨'ãÀXxŠNçŸÏ¯xEVUö*:O ž>Ԟ‹ª ï¿ññÿÊÇÿýFé°ÌD-ÀªVϾ3„Ó1DQ¦!¥gáài£ m~ÏŽÓ…ÑLÀ°,ò„¶ö†ÿåI¹ò]ïbÝòåY Wá QG˜ßÿý¨gQêÓn<%édË8N{¹ûi»ŸÉpl÷i>5iyXB_*Œ·ñ(„õê§Ôc5 üâ-ÁC0gãTüE‚S]T—↟û¹lßéËSY€¤hiã|ûà~Žíߟ]§v5oâØkJÑìÁöŠègË¢q¥xªNYÔõE? smHÊäw& ԯŕé6ìX;¥ ø`Ç;ßÉ®˜é¥¼•—M{P)Lk’gßi…èÂ{Å$ñX)™å홈3Fñ=‘†k&¢9ä\×\ó|!“ ý@cØ´cÇ‚Ûh& j6^¨¨ÍÍa^^l–âçbL›±g 9cl¶¢‘óÛÆ¹,KŠAEÖT…"°,ç?ìñËñ¼õ`À`®ìɊ܃çiWûCXðªDfÑ–` °µŸº×•ã^Ì¿¢Ï²‰Ò6=Íèøxºî‡5üøGÿ ³ÆŠ¦3…p&¶<%ÃÅ”#i¨—0RGƒÓÜ*` ¥Uœ¥ì¨¶`àjOÙ¹¶Ï¨C_Å,Ú ÔžÁSNÆÔ©¸=õ™wîdvb"[“GqEП‡–Ô©YG€Bbë¨Ú FéÂîQ™©J•]J–íiÜkÔÆ»,ŒW`^JP ð•÷HJeOo+N©úÛ¿sïÒœö’àÊœè;ƒYá aì¢.ˆ6Ó\§~L€t|–¿¸êͨV¿Gp¥5Œ«s²Ê‹ª!åçž>”po§pêîOs'«é ®|Ľ‡C›JÛJ}NU$K€M÷Õæp4›KmeA>…¸ƒá^/À)LûÂõ[±€Ú)Ú|M…o„pn_˜—n¼.‚@§,ôs@_–·X,Eax2£~-Odžeã­Àen]iÃ:ØÚ]§©ÆiOËîO±M”<+vÜ[îQ48àX)|Z/¹KÀ³ðÉãSž–tv/ÀšvkWY~R`OêJ¯îe¯ úEçk/Úë@h?NÙû?ÿó'é¦4@¾?g^:„KA#ÌÃjüÇhåªBF%šÃ¤øØ×f²LN `—Òù†;çMçÅ.œ·£÷ÜýQ+W òÔŸ‹jÖâzRÉÂ=_©dÝœ¯E¹Qk~-Ëw-©fݯf _Œ—¦Rßåïº^óO5 ¸¤`­æýh´rD%w1^‡jÒèzV»¶–ÂXk«µU¯íJÞšò½Qk «ÉB®9×eI1h¢œFROo)«¿¬Ô¢ˆ€Wç}Åz¿^rå¡õH€'N[ªT@J9èNí¸‚¡•QP ^€T9ÔR´çÚÛyº·7ÒË1ð}¤è9ø'0$À(ðߎíãÀºÄ«‹Ö"…)®¼+ µ÷>Ì?z±]»çÝËã¢WYo㹉‹¢IYØŠ½3âx+“SïæÍÌ´´eõ Æ[^¹ŽÍÑüï^µÆøíªáбië FNÚý´æàKó7ŒWï¹ià_‚+ðlD±§©X„á±Rìz0àÇ(½i+ªž*s§äÈ›0ŽcûQqtÃÀEf¯Öwz%gõÒ>T`½ö ”]ǵZ0eJ4³a`º­%«TÜÆvi«« eÅ?ˆw&ôyØ?i÷°ßGûÇ<­+¸²­LR„ñ ”Oߘ3ÅkrÙ2öáÁìçü‹Q`ÿràdðþÅÊÒåÛ¶ÑÖæð¦ ÖÏÎÁÙÌ#$º‘Rȶ¿ûÈ÷3XŠíÁoŽØø¿º×æEUÍ¿;lûä\—¤ìµRÍêù\I%ëý|¥Ú=,äÞ£¬¼Ø¤ÚÜ?ß{¢š4c< YÇ—âÚ/ImYR š(]¸•ø ¸ |Í`U_5émÀw9ˆÑ±ž÷HcV@¦—¼ãÀkò®TˆËSzBÄÀ n ·žÏ†k6oßÎÖ7¿9Ã'qE絘õ[!e”‘Âq&Œ¯ 8š:jçݯÀùØò*Lau:púWžðÂ`R¸W!¦½e»ß—,±íÀù¡U…=HVð¼þ¼öµtö÷³2ÏÿtïaqºO yJòÀ£EÛ3ã5©[_)AòtìÚÅP˜³ðµƒ6n)¬J+%_ÁݼüåY6«4ÜÇ$æMYärNÛêíŸ+ò–~ðYqí‹jVÏJVÅr™¡Q‹n¥ëjõ_iœå㪔IE׿ýöÛ+ö[M)¨ö^Çæã%i”SÉz¼¨–…½ü¼¾ýöš{ ÞxÊ¥‘=QiÔkCÇÝO•ÚlÔr®Ï~8ì™ZzI=ïM#ëXo|Õ>›²¤¬œ]YR š(³Xnõ,•¢‚ B`pÊé ±µ[u6‡G¼&‚^2ªp”¬ÂW´Ã·æì˜,¦†sÀGNŸÎ¬µ ^]Y€UÔˆ§Ýô{|Çþþï³*Äð½ÀCáÿŒ&¢Ï¤p€M˵(qzÏ@ø|£­£´Bm4— ž2Rž“à²Õf¡]†S1tŸÛYJoYæJJÇ J7½²iÜ×ßÿË¿dhp0³²ç¿p^‹SAΞÜÀïçÿÉI[ç¶Üú:x°èi_Û£û¹t™ÝÏZ D*N ¯‘ÇM̶—„Ï[r6ÀË¢ûø-à©qc@ZiY{ñ dÜðµ?øƒ,®%Ÿ$YºUðý¶ }7l]„À{xÜî­#\£˜…ᨭ˜ž6‰)BGf=&%.L¦ÀóbSØ=ëq"{RË–%ENk,/„b:>ÿ«¿ سºª×æ]`>Á³BIQ;®›ógê‹Â)°²NÍãŠÌ1,c–”#ÅÊœÖvÂ/þ‡«3/Ê Ízy6åÛög@eËmñYg¿pd1Z3–o~ìc hý…!óQÌæ+Ï×¼Ôû á¹½»¹©µgŸ‹{Xú/,YR š(*v¥|ïàüæ"ÆçžÀÀ 2›,Ç‹C¥XØà‚öÒ‚QJãy0[è'­­.Üò§uüвeYúÅàä¬[ß4ư ç` ÄôãY…¤¨ˆË&|¶µÇé-«C¯ ÷pâ4´%–éHY˜øToáé0Gö¸â£üý²œªWçÛ²Ô—ò¬äð€P)<9,0uK ›ÇbdÅUÎy0pÙŠY†7„c¹p\ô®g°’ý3Î_ßæ½øÂ§¾Â#¡Í©"üÓ7]‘Ú­Ëèi§øÈ›ôNÁêú NŠ+?ÆR(ÚØNcžˆÊ•e[ ]c•õ_9ùE5Kð¼þ¢¤‘¦Yì…Ö&æûëÜ7¾÷½ „qñ”«±¢¨Z ¸cKéj|µG×­Å‹ˆ­ìõûJñ}Ñ‹ÓËüÀk ȃ¡}ÇòèÞV‡sÆGm.Ö¥ˆ†'ÅJ)[× Ø±þâj áþ®Áéj·Ó \µ~=9ÌW:ß‹{èôœ.vÂû/î¥9Wdôøñº–ÆZÖÙjÖåj§–¸Ò¹XžkYa«y#’²÷•îqdp°äœzã^ˆ¥¾\ʽñ_µ{ªÖF¹'(þ¼šw ë¸æ¥^ÿõÞWê¿Ú½6 ˜c¯%•<*•Æï™Zã¨ä)hÄUÏËPOâ}_«¯ZòBPÀ^J²¤4Qúq>x *O Ý“8ï_–[mì–pþÁIÞ•e3‡S„6tíþdEp‘E '¡Y IDATx%ðº‹Ý+„æ=”fzI‹SúÄ^L!9?Œg?pψµuÉÖ.ºB› âN¤nÝÀÁŠ`É*„k._éÞ qÜå I-þþ®ÌŠ/—âŠL𺠥ï•YG ,æéwâ™r怵­>æ-Àk¯và:‘z<Å0Ð}<º7U®=ŽÓVŽ›ÏgšRuey„f€Ó³n¡.7ü»›U°îÁ ­¥Ñü 8Æ2Æ—` …¨2ïyßû(o^æ”4µ×ƒ+ 3Àdâs'åRi5 ÀÝŸü$§ñ¸‘8Ũډ+z—+¥mažFÍÀ²W†„óۣöò,è^z[ M\!\{"üuã£4̇(¥Slf3E§åñ¸“Ï–5æjËê?b>>˜µyès%ð;½–ùèСlŒ¢é9ÏÊ•„¹XŽk>Ï%*Q=i¦•¶-`Ô¢Ž<m=àèlÜùJ3ú­×F3ïíl¬M­6_,øË8Ï5YR š(gpЉ8äJ“)+éù8 í ç(¸Wˆ†1 2Œ[ІÓ|øè™ESJÀ$žîQ YUU;ðjÆ÷>aýt„qÌ[ (/Â<ëB;O¯ØÂÖoÌ(J§1:ȡ炆g€Ç÷Œñ jžVæÝšp³ŒÁ)57PZ1Y€ý‰ã÷0Ž㞠ǎ̃§­ÍpϘp§¨|ç ƒ=eY‰Ó’Šxu^p£¬÷¿%·f Óá^î{ÀÖâú¼×‡ØWÆrÀæ\ KåŒRF ûÅ׫jç×v…5>+ûÃz‰š# úw>õ÷ú’ÂqS$†ð,?Ze9R°í0ûªqíÿ!ó̯ýµ_c Ï–“ ©{oŠÀêÄ•‘qJ ‰’ï y<À=±eKã è>2âçm í]Ðj÷½—Òg©803©·+Ù¢µDÇrø>I€ {àŠ÷¾—‰h®E‘ê ×øÎ_`yø¿=úü©Á ¦pÏNæÒ|FmÄÀ¤@¼ø½kÏ‚éãùJÜS eè\‘‹Þð†g«dµ–T²V7j ®$õÀw=Ëw=F=+{­þ·ßtSU¯Cµñ–¿odþjI#ÊA£Þ‘jíÏôj^•Fï·–pI­=¼PI+ü•·{ñM7U}F½·jÏN#Þµj}4¢˜Íg|KÒ»ŸU¹Rëøã ô&vO?ñão¡³Î¦x †iÌC¡ŒB ^,ªWF) ´V°ªoÀS¾ÊÑlm-UÚ€u9øæÝw3zút–~Skòàœµyq—ó6Œ:Ö)&{‹ÁB^„G€ò¦H}änˆ;ÃÖ‡ñ_¾µ4¨7Ž÷^^¡™‰ Và5æ€ »`ý »ç)<5¬â ÖA@Ýæne‡+[uÝ»²"ZàñÏž)܃2‰+›ÃM­¿exUãÚæ^ ¸+.@Vùáý Ü˲<ì…åxq6íkpØ“Óþ,¨n€<àô§8ØLHWÛ ŠïV´Àé|ê©Ì»öŠž­k8Üÿ½ùެ r1qÏHÜ·ÒÀâJ‹ò¸F…”È<æYøèg&iÇ÷¶ê–L§žåK±4犴÷õÕ?)’fÒÎv¿å×Ï·Žþþú'5ÐïbÇÑH»Õd1JH5iŸÇ¼4 /¦¯fÍyµ¶c©´g泪)õ”‚%yñÊ’bÐDmA©A»0«u;UéTÀ`$;Œqí÷`#’T²¨?Êë/ ›â\yQÎc.õºÄóÐ+°wÕë8®Ü¤§NqbÏ:rγW,„hCÊ,#‹LÏè ·h÷Ó…ŸÃ)¤)ôàsûåÌbºdÉ#8…c6jw,‹‚hà²p,(;«sžYG\Æ9àéib£á¾»Â8OîßOë”±å¥`ií^× ŽŠP‹Ñ[Î`VèyU';ÝJþ<¨\sWë= ܽÇã-~dÅ2Þv!üǛܽ®·‡„jaœòˆ$Àãcðð §È ?1`s¨Œ:Ê¥ø‹ö~yXY¨{€‘;éÁ•‘MáóÌ“1Ú› s:ÆôÝ]þE"ÅG™„¤Ð‰£3Çæx4ÿ„óT¹y+N§}(ÁS­ê|°@^yÐDç*%PB€3À©»vï=÷d‰î?á?jz¤`¤ÀÛ:àMW8=MÏr/þ¼J1PºÜYL!êǼrš—-@w.Ä¥Ó0§gXÝ×÷<74‘Š<ü™ÏTý¬ ¯e…­g¹L+œ[Oæk^(P*¿ö¿û»õ1ÊT#mU²T7"¬O5oLùyñ_ù¼TóŠT»¯j}Î÷œj×=×Rinæ»VPÝËPÍ ´Ø½¾$/ YR š(ËÃΖG@–Çn  „¥8V^óåSÖœŒÊλxË[6gŠ@'¢ÙôDí+ï¼²åãi)%!öZ¨)'¥5MŠ^±6¶®ëK@AËYà*®x´a o³|*8Un|6/7ð;‚Ñc¤Áã ¶wÚ<]½Ñ ½|™ÉõcÔíwðÞÕŸ*Y|¥@1¨¸϶$`}hïð8Šk:-øXÜü/}wœöqW&˜3€+>‡WwžÖ¶9-ås'Ns×nø£¯úZ®]ÑÍ LiÏ:4€Yð_ š­ c_üó)ó •+'ðô±+q€ßîM<|ô *OðX8#Œæ5 çÅûJT)í=µ§ý©€dm«ÐÜdÔÆ™ðÿ“Àú¼+€ú’R³.›Á< j[Šît4NpÅBEÕNãt(påTŠÂF|=V¹9øß[»›VÛÜÉsW(ŋȩèÛ Lù'ô} SŠÀ‚’õL†Œ»LgÎÀ7Q½$@}`SîÉœOgS[ˆ…µ‘{môÜF¥YÖìF¨"qŸõú_ ­d>óXM«½¥ ÐbÖy!òR™Û²,)M”C©ƒYú hèÇ),1eb‹ n} §K´cÀ$¾ÿåg²üóÊáž„ëàuôÀ‰ž"CL_ÒÃ¥L2¢*Èú~E ä»»éX·®$PV–}Ñ“h* ñyὂZ¯ìv)ëu]—ÇNºâ$jËl»Ý—Š<=>n}?Œ:ÇNÛ¼^$‰YµåÉèî¶l3ân‹Ž%|X×és?…¥]Ùe人²tŸò\¬¾>èñ¹eWó²?ŒgS„~uzœßv;W4×uÂÉ)–‡ûnÒœÕ<°çé#¤øÞYgu:Ó{&|åÃëiœ¶£¹ÌWl|7]lVë ñøˆ_ûܧX{íµ™7AÔ–ö)®j½µ§æÂ8UwA2Ž{ ¤dÍý‰{»¤´)ÈYÊ‚Ösd§ã`À\qPºRYë¬qÍaSxÆ­矟)yÜ»1‡yw†0ÏÅ8ðõ)W¸öº×D´+)ìRn¦po_Û§¢Aáq!ª,­4¦¢?ˆÚ9W$ßÚZõ³…Zê«Y¢+)±eµšå¹Ñ~«}VÞfù9åãÑ5…¶6Ê¥+v-Ê|¥Ü:ÜÈ=U“…Xàãkõ×ÒÖV÷þªYÌQ$kõ_éxyŸxaªy8æ»ßÊßkÏTj«‘öËŸ‡jc¨¥8U[çZ zµç¯ÖùKÒYR š(?ó‰fVÒl£*ý¦2·L×uxºJ+˯ëÅÂ-ž'ðŒ01h‹‹^ÅhӨݹè¼ò ÇIÔ_7TïžµkÙ´cGöÀå€î¼Y¼Áƒ~;q+ü^ ä(•è·CºH‹z´çËýÛ·d÷›““v”Ë,ý©@ï)B†ŸÔ^§B_«ó¦,ÆÀ—Š¡IÆŽÛ}Æòйu+¥§¬Í¹à‚óò´ãé]'qªÏîpìà×[;ùì>xrÔ¼"§€É9x`ÜñÎp/£ÀÊ¢šŸÄ”Õþ^JäÜŒÕVœßæI{M :œ YŽî~îÃ}oÚfóõG?ò“L;Þør ðmŠ™*Ê™¬ú¢ºˆÊ#îüPxÃ:¥8ÕÞ&¼^°¼=âÝkï+«•<J»:^GðgGYŸô7Œ+¿šŨHY"påOýT¦<ÚTQ9Áï mG}êž”Q¨õ%E%ö´Lbè]˜¢qUH=¤gq¸4ÄŒ´DíË»x®È[?ô¡]WÏÊ\ <Ô3ñÿ1ø©‘J–Óx,Õ”•®RଈŒ+åm•¿Ö’Åö_í>«~«§À4ÚçB>oÄ r6$ÞC 67ñUR\æÛv£Ç«I#ûµž²QOÁ_ˆ$Iòî$IîI’d(I’b’$¹²Ï‹I’Œ'I2ý]}~w’$ÿG†ò¼Ê’bÐDùŸ?ó+tbW«Rœ&ó¾ ýá/Å ŒÅ©!eíÚP A+q ¥,þ+¾‚[$õ¹(3h\ß½›ÁÏ|&£°,Ã@­²èŒc@W|ÿv<÷ü8(Ü\Ô¨aŒ{Â5Š;8²óé,ã‹<Šy#kõ]fÇ´y ïœóµ˜Ê¥àÜ >Š×Vxô³Ÿeêøñ,ßœ,:Ý&ì?0GÝë`e«ý?üÔÕ… ˜Ëš,ÊL9¸|Es?fO1ð+Åç©qoKüžwbž%ÈÆÁ±ª“ ˺ê ̿ˬçÛgnÿÓ̺={m¿÷5æ,^#í/Íxý[»ü‹]Ê‹öÃ}'f)b{IÖt‰kxkǽ@lßkœZϘÆSÄö™<'ç¯òg(®]¡ë¿üû¿Ÿ¿Ë;# ˜¦<ˆ×;ˆ=ª­¹VÍ )R"”0`,ô½a™m‹‰éwçŠÌMO7|¿•Àk-ªH½¶*I9•b¾ JùñzVÒZ–ÒÙ©©Š×Ô껚òPk^ª¡|±ÈWºrïK#ÖãZR>/ó‘x}kÓè=ÎÌWšëZkVilµ¼eses3Ÿ}\M*Yëkµ÷™6ð7Ÿ¶›ùݘ¦éWÓ4ý[ T“—ü×ñ’bÐD™Á@¦vÍH86Žç“ý&Źú²ð*›‹ªüÊBÚŽT¾ñg6ÿ¢)ÐJ =Í–“RàVUΊ7$ p=¬í´ÜU7üò/gé\åÉ[‡[÷ß0àó¨*ÜZ§Ãa<ÏDó¦ |=Ÿ18é¯ ®hK}‹Xv-í«4´±…sG®|ç;ÅÑ‚´æ±Ô²vWX,©óY=oC<†zm¼ì–[ †ªyU>í¾JA|Î|î1®¾å–y\1?iÄ^í³zRÏkRioÌw~®ºå–g]ߨÂÔL©õüÍWëñX„܈ýÌ®~ øÃ$Iþýó3”³'KŠAåáýp&õ ‡§. PjmÿýÏ@¸81àðL8f-•å}):XˆSš¶bÀð(À¥|B¿ý¸¥¼=:ˆˆ2 ŒòÿþÝw²c¡§çàAœ&1•ÂEýn™—…Vt ÖÆ_r¢±œ>æàþLøLUe‰–5¸"Ï‚3Qžþì¯í\¼Îàt ÍážWášÆ»qåEköا?Íã{vÑš¦t…¹]4.)/û¸õÕú[›OH1%BS)#0¯BxdÔÚù³¯[<ÄãS6Þ! hvà…À6µX{ណãñZ?Ý÷^Ìkõæ7­fW†¾‡× hÁö×LXƒ–0ÏßùøÇ¹+Zeñ­àGà§.±v{ð\ýàùúcŠQðÙÿø9‚Ó¯äñiÅ×\)p;C_—…ãG{O؆ðT²Iôy‚Sr”¡I1 ðºeÁ»–Úz­Ofëuâ_þ%›)‘'ðÎÇNÙ>’WNϘÌSѵú±Òw€¼JU«½§ç¿ØÞQZÀlã ¶pîÈÄÐPÓ¬°/6OK½ñNœ9Sò¾o>×/F)8›R>/Ï…,ÆTK’²×ÅJ¥¹i´íçŠÂSOšµÏÝFšÞ•¦éTš¦³iš~ øà=‹lö'KŠA“% Çx}»ýÈÇÀ}{øËa Uàî±ÔÀO—O©%[ ªÑ*-£bÔ7”¦’PVvå­ j ã•b xscc´9Ève 8–E5N7%æí·d ÷ž(Ó‹¼ ãÎÇž çŸ÷%n÷2¼¢îl˜Ÿ-˜20…Œæ€KÛZ²ÌGmØx&¹§1ਸ)BihGu’Ó§ùçfÅÌÓÀ“GlNĬôšt…¢óÑEÛŒ[™—…5™´Ï{1,+»€Ÿ¼;гÈO̘B“®\Uj}–å=Åöœ¨-û¾6˜ï ÇOã)J{WâÁìÝÀàÑ£™GC©Oų¿<´; |úqÓ0>Û‹+™ãx:ϸ–í8¾å‰Hµ‡p ¾ÖhS”‡p:‘öË»l_h¯Ä4º9í©5Ýs7ðÐ#d3p¯…–Sx–#ͽ…Ú<¦G¸øó·"ü  ®ØÌ»&\—¢/áëû|¯¾ÔeË–-·ã|Û6VÞvß>ãm·±jÛ¶ìý¦;¸îÖ[_—¾ývzV¯ÎÎÙ~ÓM™Å4ÁÒZ¾ãÿ˜B[[vÍÕ·ÜÂö›nÊ®é]½úYYn®»õV6íØ‘½_µm7Þv[‰±ãÆÛncå¶mÙ±Í;vðê[o-WoÆ—ßtSfí.Ÿ$ßί~•ž0¾äTߣñ%aþV—Íß«ÂüIÞ~ûít¯^µ½½l|… ã»ê–[ØvÓMÙ5=«WgÙ“tß×Ýz+›£ w_,7ÖXßx|åëû²[naçW¿ Æ—`^–mÑúöÔXßx|7FãÓúÆãÓúÆ€ó‡o¿ÞÕ«³9çOã{g…õÕü¥@w4’WW_ùü•?›Ãüin4¾xÿÕ_Š­ïö²ù+_<)°²lþ*Oû/ÞÇŸÚÑø4Ÿù:χÆW¾¾ën½•Ý;vðià÷¾ô%–¤¶$iúb³©¼ðä·~ë·ÖøÃ>ø+”Zey]ŽÝ ˆÁkÄôY•½Fô¿8³ŠjuàÙtž µ¥Àå ‰U–År,ºå}—uLyјÒ¥´¬Ù°ž¾îžÚ¹3ËN£¾¤œHùVcS_¯€osk'N—}+Þbìå-ˆ• X)Ï{ §‚´`@íp¿½xZÍ$jg †•ñ§ؘƒExó/¾‰Ï|ükmf÷F(}¨ÒnŠ>ÓÓjÔ‡,ÞE`Ç2¸ë´½—RôŽ7'|ö+i¶µnšŸ¶ÐÆJ\Á)†6Ï—mëc÷®¡lv†þ×àüqÝE»Ù‹g˜Êc”¬ÑphXç‰ÉOpðM´¶R€Àã;tÿZyT´Ï¬äõLÙ›duO(ÝGúæcÖþ¿n|û„}v>æˆclð—E} `Ïh;qõ† ¤ÝÝ<ºs' ¦Ü Ÿ+™€”éØÕ³¬²xÏCR„;€×À}§`C™µ{ÓýêYžþàøÀ†ßÿýßWœúKJô=úâñ±¦’T¢àT»¦Ü™FÇÓ*ç4*Í´×úE®wo•('•hCói»üóZm•·ÑÈxŸ ËsµñTÚµöI­¶%Õ®ŸÔ›ëùìûZm/¤ZëUé9Xè8+õµØçಟüInýÔ§*~—†ô¤­Àk/ãvÐ)à*‚Ã?{ð¿€¥izÇ"†ô‚“%AE@XÖjõm›ì‡þ4VÅV@A\r`) ÓˆíÇóÇ‹Æ þty&¸%<~ðDIÈaJ¬ *”à»)ÎKHz{Yµ}{fáÍá¸ãà!vïÜ™YyH Ä ØlïôûS\Â4ð¿Oyö%¢!ìI¼ô<ŸËC¡=ÅOÈ !‹½h)áœvÌ;3îó4Úee—忈Yu` ò}ï„‹vì íïgoÑÚü»ŒBrůjµ±¨~¡'Ó9ïò¶ ‡1¿v“]óÀhÈn®íþé+i¦\i}•nT–­8}ç(¦|>ºk(S D=S֣ɼWrnÃöœ(0JÉyÍÛßʱĮY…Ó«b„s¾rÊÆ°{Öã5äј.osåü\‘ž•+K@m-ðX ”%eÕ$Îi”n0ðܨT»×øbk~¥k+]SkLµÎ©pëÇFæ¢]o=R(ñ"42žFï¹Zñ_ù\WÚ“ÎG¥>ª}^Þ~¥ñ@õ¹YŒI¸Úþªw¬Ú8«ÍOµ}}ÍÙÿûJþrèFá{×c9:þ s\þø—šRçÖïÍYmvYظùÕ}N‰A¾@¹,¤*Î%P¨b_ Æçx.zU MSž-FÁÇqõÕalW÷b JYrðP+ôô°â‚ 2j”Ò<¶`@Z}¤x`­”) °æŠW²rÍšŒ÷­q ¶„y€Ÿ¾wÀ½$Êg¿Wl”c^ÖYe™9€§¾œ÷y êó0NÏRžáÐæ£À¿~–wu±6ŸÏÆ*‡¶®N›‡§m>¯¡ûëZŠvü5‰Ëš¾·ÏÎé›±{Yú–5½Ò¬6Ê0”í í\6à©,å5’å3N¹R-ŒÂœ×HEÔ­• ÞÝG7¶ïDñ‘rÛ†W•/´'ª‘èBÚúŸ6à­ÝÃY-Œ¸öAÛSÊ€¥½Þƒ+¼ÚÃ9`$üg@æMÙþŸK¡ôyi cmÁ=E]kÏc¯8½þÕ¯f S"$3ÀýcppÖÆzǃ¶ßrÀñi÷ (Íðõy¼…~´´H§Ü¤ IDAT¿ s׆)còn¨óË–›R0„×yPf¥Ç¦\™>WäÕï{0ÿÿù¯fËÙ°|—·ùú÷¿¿i㨧0Ô:g>ó×è¹µÎ«×Æë˜—fK-°ßÌýµ+yBå=ÓŒñ-f¿W»öù~†Ó4ýdš¦¹ð—^¿•¦éÒ4½$Ô.X–¦éUišþÅYÆó.KŠAEžúQ/b §Ê2§>Tèž2²/„$9Äqà9Úc-\ÖzÅ9HÙèÂ@³@䪜µ/08KTiöÐ!žøâiÇŠžÂ½ „û*½áÀHt½>À=÷ÞËØÑ£Y ÑCâ,4¢›(Gxó› јZÂ|N†cšÇ®p‚»;ñԥʉ¿¶ËçOų ¼Wä¾?|ã=y2+¶ +1 wxÜÚø±‹ŽÕ‡SÃ&­¡êõf;¶S&N‡1¯»Â=œ ík͵†á©d‡û›9ecPÆ&yòÀé•ã ®üa^˜•¡Ýcá³ýô§9ÚùîZ'ëÔIyÇ Q;ò¦H!–ð¹stâÁÏ}8MM\ÿÏ6$P¯½¬Àó¸°šb¤ÈË"åWŠç²vk;~N8@x<¼ÿöwó«: öLè>sÀE-ÖO+°¦#Ç*Üû÷õ'ý<K1šÃ)Gí¸r-úàž“ÏûwæÐçpEŸ[ÛúÒ’/ÿîïÎË:ŸSÏÒZ©­JVÌzRɪ¿P)ï»Ö8Ê œÕ²º6:•ÆQIjY{kµY«¯J–÷JýÖSbÎv3hüÞ«Yµ+Ýc#ž‹Zÿ7ÒV¥¢xõ®­åPòÇ÷Yk¿ÕÛ_Õú®´§ëÉYô(œ²¤4Q”RRµ ×;¦”eP`¢‹-Àï¥iI°£,‹q­‚JŠBBi‚8^A!UâU0è¡¢.eZ]'ªR qóUÔ5ŽÓ®¤¬‹Î²iR€ô`Ïà€;‰úQ¡²p×ÁÒÊÇÓ¸u¿+~%/‰¨*Cáóîð^Á£cþE6ŽsøS`gxí*8ÿû¢ýäò9¦1 õfèµcq"ŸzÂæeSΔ¦wmwºÒä´Y忳×Ú c»åßßõ§fèPJÑ9€ækq¯i!OO7#†OÍfóªõWÅbÅ$È›¢~äʇùÖF ^ž'eZ^‡)UÖôe~ó¯üJ–ýifžÀ”àæ“Ï_EéTO?"Š+¸ªÇ½qZ;~ðº¹èotÒ ø%¸HצÑõ`k­Ô»¢Ï)kÖá~¶§EŽaJR‚+Á£¸Çc"´Ý ¬ÌyPºj>(›ØDÂÃ=†ÕÕï¡!¿nIš/õ,ãÍì§ }³¥Y^—³=?ðÂsõ”•FÁêBûm„NTMsí|¥‘6¢t/ö¼%™¿,)MYáçp07ƒŸÕ¸U{}ø|.üWÓþC’dµr ܽ1(˜Åf9d–ï|K7NC ÿ„óSZI9 }/ãøÔƒ¥\ú8ç<”rÇ[Ý8]¨ÚÑXŽQJUéÁ@wœýHó*eEÙœ€»6Œc½‰Ñ~´~Š%¹ó¿ÝEŠg­º4my÷X<†{šŸpSìöâq'[Bt¦²ÿôŽà ~]—YÀSœ ¥ÊÏÊ¥ZyàdkkÖw?¥»ªep ·î‹Ògå™Å•¼Ï|ô£Ù>T6$ÑÍö…ëT1X?´'xvÜÁtø»kÄ ­_p¯˜Tµ/eZÅÚôY,½¡ýÍØi´?yÇÇ2%4®…0Š+ _Ÿ,­-/”RýnLJö68Y„W¯wz“hr 0šúsЋ+gà¸8QÀ¹$µ€j#ÖêJÌj×6hÄÆ›zæFÚjÄZ] œÅÖþZm7r|>RÍâ\Mžoå šÅ;V kÍ}¹¤¼jöÅx^j£¼ÿFÚ\ˆ4r*(]KJÁÙ•%Å ‰"jCâN§8È;K `(­SovYþ°)@<†óÐeÉWªnÛŠWèUÕØ±¤4K‚'ÅEO¢±O…>z6oæå?÷s1k¯,»Ó8(’B[Ф¬Œ4qP²ªÌŠR”`AŸÛÃ}‹¯®Œ1ñƒ@a³¤k¾ a¼qªPY¦ì䥘ž¸çž’´©]x•Ù‹ënHÁ]Η’¦ >š WƒïY­·×a¬˜@2kýˆÈR¯âx§×´z͆X´?Oi±ÈSŸøEà–_~SÖ^œWt¯ÃÓ3Ù±iŒ‚&/Ò~|Ÿ‹¶7îI5ŽàÏGKXÅÈHZ ܰÒiÊ|@{©ËÑGÉÀj-ÐQÍP.õ”‚F€q3€`£mÔ߇zh^}U³7"ÕÖ å –w¢‘¶jYÂ+I£óROâýPÍP¤±y­´•<( Ïî#þ¼¼Íj×–—~衪ë8ïG¥9©ç)¨t~µ¹«öYùüÔó~éš%Y¸,)Meæ‰ÓrÖààSJBY3Á€ÃJ ¤]‡Ç}”Q¼ÊkÜfHµØ‹H0N‰øðRº1‹±2ÉÒ{ª:k Ð63ñS§²6ÕòÜΫ¹*p8›ˆ^EÅuYyò•¶t6:wxûµkèÀS• ˜ÍW+B\€Ÿ/ÚfíªH—xøÝ`Êp¤/™à=ï]I;ptf†«ZS6c–ßW`@³ódÌ`AÁ[1E`®` ׬ƒqÇR_— p¥èfõýæ ÛJÓpZ=ÅèãÇa¢èÁß B~÷Åöù©iÇÐúLÌÁêQkg$ôù­©cIÂ;/vOÔäädFokÅ3iŽŠxµiý¼¶ø>ø×ÄSª¾x í,¶'ã†maŽ¥ǵ2)½¡½Shÿ¯Å\¶—DÅ“£ä—çàÄÁƒä?ú“¯•ìåN|ݤJQ€ñòp?+¢ñÏ-ûLè«/š'Åzè9‰ë’Îß8^ZÐOAÐçŠì¿ÿþ_Û(ð,¿¦À{¡È¾ûî{^ú]ˆ¢Þµ oÕ®y®ç¥Ö=5”ç#ÎSµv+ÍÍÙôð̧í´Êk¹TS¨–äìÈ’bÐD]fûñ—õ2æP‹^³*ºN–ÙxtΗ(!„özÃyc³ŽÚpn³D@F@_ïřȓEXÿ<Þà¼B±¬ÜÊ}/@þ˺«{ˆ3ÄÄJ‹¬ú}xPgKY®_áÊR þù{GIð4£àž§UWyJÖnà÷[?òN00+`§qLaó,%cøä'gE¶NyšÓ=8·_Öø¤Ëâ'Ž…¾‡µXƽ¯ËP.9߯³›Rëø!\Y¹{—íy}ú§ P‹+SŠ¿ø›'¤ö…þS\SVžÆŠª©ÞÃ* MSxÂéXmÀOÿáïft,ÎÓZæÂœ+U¬*ik½tyœ &-O¨=¹0æÃø~Pຸ=X ®< IÔžÁ¥dªíÍøÆÆY#. ä½ÝáOõ ž(šç úYž”Zãý¯,bÚC ¨VšÖnüùzlÚúë ÇDW¶´ŸRÜ;(ÏZyºÖs)]i,IÙ_­s«4bá>ÒXœ·¡ÚœÕ›ËF= ÎI-O%+pù_%Ëñó!•¬úµÆ6@U­u¥–G¡Öü5êý¨Öÿ|ž½òë+y–äù•%Å ‰"Þ}øN`?èëÂS0‡ÓeÃ5©£áÑ+”áH·ïÿîl½b]–Ñf §D(0Q®¬Ê1_[í3àœqÂg{1ðÒÒ×Çù;v”¤0UD'ö&ÄàE`'ųÂt†÷Çq «ÜøÀ='ìUJI8_Á¡¢M)×þ0ðùû „*®£ ³âöã1dšß÷|ô£$ØIA·bØú†70¾b¯o!£ É?îëô˜õ± ¤-Øž·6ß½Ù^/cùÁ^xJ/zAŸƒCÝç8¶gÚZí^w…y‘Ñ×x Wð,&@^’v DƆπ<)e½aü×Ür _¾íƒYq½ÓQ¿Ö³Šì­Å+kojE#Jp ¿¥Ã•ÖØ".ÏSìiŠ=Nÿ?{ï.ÉUÞùª»oÎîä iFi$¤QF@ƒH»clÆ€m,`- ?KüX[6i ²ñ.6¬YÀL%”0Ò( ir¸š;wnÝ]ûÇ9ßzO—:Þ¹£0wÞçé§»«êäSUß7‹ièÃòZè3eÚ‹1 ù6wŒÙÃú¨7ñ+d2{ÑE‰#ýPlLÎBa¦EÒ(ˆáÍá–&¦|º/Å@uDæÐ/§oåtÙÕnŸËÇFmˆyOŒAÿºu KçÔ×j¯Ø©FÕ€W=cÕ5ý'œPãÊòeµÌ\‚òzëª5/á¹ÙÌK£T¤ÜµÐáÅáÜÔb®«]×螨VÇQðÿ즣ŒÁ’@eú ðcq)Ç>ê¿Có I[%ýU¸Q’žÿrøÅ.ŽÃ$ad0©«À”J B?IÐeÿ,“™‚ô¹\ŽbWWòR+ß’ÚƒúøêQí+‘–$ÈÊ {ÎRËòZÞø÷O+άJ DŽR&ªÓ_߆Ÿ38à;ԳߟS˜ÌÐézøFSZ<Ï™‘2ù<oüŽÏY$3ÚL*¬(E·a Ø@¾Wpãû_O¸¾<€¾jGRÿÛÚ8 ~Nú€Sü´E×¹°&zrÌà€úzϡ輢)yVSΰòhö}žÀLnb?_]@ad˜}XT'ù^(üdôÐã²ÚW$¡œF¢˜ºvxlÂÌ£d’$'Ôr- æUZ™±×çu‘…¹•„˜•0yZp!Nƒ2Qt{´9“añòåÉý¤q¬lrûNL¡ò„}ÍàÀ|<±}OrNia ±«»h÷Ò‚‹\a¦cCX”/ÝkŠþõLIKŸ ÚðÒ—Ö5ÞJš‚*1 sÉ4Ô#Å-J—=õå/ŸU=õH‹+£ÜÿFÇTkŽ¥t}³—4ÕÒ˜ÔÚoåú–>V/Y©Fçþ4?7õhB*×çFµ8•ê¨vM¹ýUéÿ¡Ü[G©2e æšÁm– 4‘dTjG™øÌ+‘“LsÀn˜û1i¢@XVäP)éæ ëÖ$v÷ªG6áª[Ì‚þïöïßÏÎïÿ)/‚ÿ@ ³(i¿$Òkg»®¾N·íqÿ'q@òÆ·½,<§âÀ‹Ñéôee” Ú¹SX™-uú³…¿^![×a`,¶ßw£CCüí~›¼™aÝ1áÖRaE=ZC)tÐ÷« ¸d™1Š˜£42šöó7ŠË¾<éû: üxöÌ'ÀvÇŒ=8{ƒµ÷uȼçlOÈüE{I>+bˆ¤¸ï;7% ´ËF0p.ÆR’ì.L "&ÿ½/è›æ¶Ç_·…*EÍ*uÄXÔ µ§µcÙhWìÎc‰Ï丫ÈK2yºìý'$ë…|ž»ÿùŸ“>j®vÎÀ’nÏ­\–K˜T1¼2…’ô_fƒšã•]¦ÑÁ0æÃ2ãÒûÌÙ\ÇaN‹ùB·ÜpC¢ ©œÉA£’Ûôs¬Í;J3??¸þúÃÚF=LV8‡õ޹\ÝÖQŽTǯ¿¾!ðÝÕ¡éóÅ2ׯ©kÓ4×ý éûÁž©¥h¤Þ¹ rë_O;•‰ù$@9œ4ïƒ(оEQ1Š¢Ë‚cÅ(ŠÆ£( >‚ó7GQôÛõÔß‹EK‘ÌlG€D‘Kï¿58>ˆÙÿ‡ZÅwëØ”Ö¡Ôýø£[ó$0{æ3+“"Eöqß'%cÊ×ÊDH~º)e†Ÿ,âLn¤¹c–Ä äƒëå ¦ lè0M#"©k_0þ 0X0ÿIýÕ÷ÐYúW˜ISèΠ ?T/Ƙ‘¸m®ýô¹Ðÿ^î¿ïØm€Y|;W¬70¼Ý×){û)ƒ¨Øø"Íë pŠ Â÷£¼pÓ2g’”Íàö¦œ‡û|ÿ4Ïý‘%–Süýð!;…i^´/‡ðy°=cŒ„¢Jéœß³ÀƒXDžµþ÷×»¶ÄɼMæ4øëaáWå8­{Bm+·ƒ¨ 8±>úɇJ4X²åמ”sq ìtÌÚþÝù’º|0F|?›pÌÎ –tï‰Çœ… ¸Ê+ljîçÜ~‰1í‘Æ!©ùô«GÊXo=!Õ½õ´Q ¦Û˜kfáébkI«ë9V­îFŽ×Cá^ 5šÏÕb ªÑádÂú«i‡Âòå›FûP­\Øv¹ûç(=s4¯ƒ(ŠÞ„½kÓ{ð7â8î >›ƒsu=ã›p EfP¦Rà}p( £²ƒÙnK²,©¸¤Îɲy ™Á²¥ªÝVßÙíG8`،ݔ#Ayi3Ô—\Ñë“^…‰£”I¹%{×aÖZIQÃp§Êl«DXês7ö`ÍJºý÷­c–ÄJ¶Üàìø‹¸Ð¥KÚYšðóÜŒ19²†±äÅ´ú:ó ÐÔÜLðü‹ONŽù뀓ŸÒe™„{ç?q—oë o[޾ò èöß‹€o=âúzùÅËÉ 25%AÇ3;Í÷_í‡ðÝ{v'&Z“¾? á)”1à7ue7m\Ì@ …þþ+rÐk>õ©à‹(5‡ÛL©3»œéå š›i…k´ÛÏý?=b @3ƈNb{í Æˆe±ìË¢ »ÍÙ¹ÓÜ€-c–ÿc“ÈÏDînˆ0fÌdhsОÄÂÌvbûX÷öcAù=˜Ö`g:¤õ\€1¦{üÄ”š¿uaѓژ?¤{;Ô–¤L= ªQ¯ôº–4:-‘}®0ti°Øè+Í[ºÎrõŽyjT{p¸4>R5 ^SkLµÖ¯^&”Ä×ËL¤Ë”k¿ÜñjíÔ³'Ÿ+÷ÚÓMQEÑó¢(:¾Þ2ó†1ˆ¢h%ðQà­•.9Ô6ª 8[qdIœŽ%ÃrE2-d#æœÚ:¦r’8†N¡ŠRs‹v$iŒ!2£mô‚åË9ã]ï¢Ó×'3‡'qÁLwÀì×Ó/uõA¦Eêó æŒ+3Ž•Œ+|ˆa1à- 4abä#™üŒaÒû0y^8/Æ1F㔚,ÅÀÍÃ¥÷…æ_Ìmèà< ôµ·såµ×–øÍôù>´O­WŒÛKº[ýç/võ®À¨Pó–²±9l~÷òžd¯ÊWAL5XˆWå#™/tÑ{ÞSÖ„ª0Ôˆ– =b%ºìOþdÎë¬WSÕ×à™œ·KËÌK£ÌÁ³…µ¯éò/¬°gUûs”žÝEÑ¥Q=ŒK¹s °%Š¢‡£(º¤VÙyÁDQ_>Çñö —ýSEOFQtOEo OÄq|IÇÿX«1EœyФˆ9Ì!S/I`eò:«‚ëŽ iB©¼~Ò64åÕI·Ã0¢øßûƒ:Å íÚÅ?õ)À¨ý݃9pàµÝMÁoXõq&ø?ì˯ÄÂc æKsN_nRb=¼~øùÏ“õíî¸ý¶b±âÇeQDÆøHÒ+* ÿÙêÛ~ñ…/pð‰'XŒ9@‹qmëC-òBh½¤­‘©Žæ[&Sr–~‘ïÛιùá}ô§-2 ¬P¢ßÚC3~üE`od7÷ý”FÕ)ø9ÃIªÅpüßk®áq_¾ ó9‰1°/³ϼs)К脑ƒ´Oµ×§±ü¡3q›Ÿ¿¥Mîx+Ή;Â4?wù:γÛ‹šWi=ÄŠ&13¸ƒ|ÿºë’{SZƒu}0»ÿÇD.B‘˜tÝ?cÀ—n2é¿4†Š†Õ ô-ëO îðãüÒ÷&fR˜6N$³¸BP×| ÍßþvÍk*šrRÇZ̰ü3 "k™]DÀ/¿ñ†ë­Žë™—zÛ8”:…~õoßH_+õ·V¿Ë][îs8Ö­FöH¦(ŠN¾ Ü \Ž3¬x!ðSà?¢(:µZùyÁïâ8Ž¿Páüe8ÁêRàÃÀõQ½½ÞÊ7nÜØp7pW&CôÒ—²³©)‘n¿`ãFzN>™}x©kg'§¿êUIöá"°þ/ ýúlô,]ÊiW]•€œ"pêUWѹzu$<^ö²gä Þòº-Jì·WŸ}6'_qEjF³Y.ÿ£?"×֖ܘ']~9ë/º(ý}}œÿc¢éi†3ÿëeíYg%þ}Çà ßó"Ì–ü‚w¾“…'žÈù¾žgœÁÙ^ª¯º_ò‘г|y„¹ì2ÎyÝëxÂ÷eE.ÇË>ùI¢ŽŽ„9óU¯bßéWÐu-ZÄË®»Ž!hÚ œzõÕ,»à‚ĬcÕºuœpÍ5‰YÔpæûÞÇ¢“O&ƒzm›6qÁ;ÞAŒ^W^{--+Vã@Þ’Ë.ãÂ׿>Il6šËqé'?IÜÑAe•§œÂ¹oxKpÀ»<ïÝ獵¿Ÿ_Ïê³Ïæ¸ /Lü3¢l–KÞóŸhM­–‹^@Ïyç% d{w7g]}5kß\àúwÜ _ÈÒO4FyÉÎzÅ+’LÒ…Ýû8ýÅ/&»|yÂxw­^ÍÊ‹.J̆ Àú¿˜¦înv·»;Žý§Æ½ÌxôѲÇ'¸|®HJ÷=ôЬÊé)=/´Òòn¦¥Þùm¤µêL›U¢}=ô¬_ÿÃѿ碶héàsqÿNÇßãø¡8ŽÇñïŸóç+RÇÏ•Gâì(Š¢ãpj”óâ8ÞæÅqüƒ eþ ¸"ŽãçÕÓÆ¿þë¿nxõ«_ý«sqáϸøbo¹……33µëÖ1=3Ó[pSk+ËN;?ûY"…îY·ŽÑƒpÒÓŽzW­bï–- ¨_qì±ìÛ·ÉÑQgÂÑÕE[OC>skX°f £»w35íäÀ-ÝÝds9¦)â3/[ÆÐÞ½‹Ž iëê".™sŒK&CKo/Óƒƒ‰¯Cs{;…|žÂô´6Ù,Ý--,ç _oÜÒÂÔÌ q±èÌe2¢L†8Ÿ7A6Ët¡PÆR¾²—„þœEкz·Ü»3a d&¥ ±¤mÈbf0£˜©’ÀX/–¡6Ô²¨/º>Âz™Ÿ4áœle£«§÷á¤úPê,ø¹ióßíx¬h¹ :‚všqö³Î^Ïíw=BLi/Ù¤ãûä±B IDAT$þ'gáÁ‚eÜnÃüvcÎÔ2kiÅ´±ïÏdpM/ÎŒæQLƒ!¦SŒdr#I9ÛW™)Ä)Xb¸ˆ¢ˆB'×f2wŸ‹ìÂÙüg››ÉMM%íN67‹Dù¼ìÙ,¹ÖV&ÆÆ’¤tÍ]]ÌLNÒ23ã¥[Zhiiafx8Ù=‹3ràÙ|Þ9÷vv2ÙÔDtࣾ¿}kÖв};CÅ"#8F´P,2í³€çššX¸v-{y$ñ éZ½šÌè(SƒƒLô¬ZÅȃ&‚þ hß¹“íCCÌí‹ÓÕßϮ͛i÷ëzܰóþûÙ66Æ“@ïÚµtwt°yófî>ô¡­üË¿üËôáxÅÇ>ö±ïÀ4'siû] Ô’ZN©æ\Õ«z*ÍUTåÜs…Â1V|:¦ç¥ö‘LEqð]KSS°×*“n§Úñô¹J4›2µêªdzWí^I÷!=Ærc®ÆÄ4rTº¶RýåÖê”׿ž·ýïÿ}D?K£(Ú\ÇñeέnãxEúœh>h žßEÑ@Eþø¿FQô¹¹hà¾ûîxpF±HôÃÒ療èØù([·ONòøÏ~–˜jLƒ>ÊØÀ@²‘ cc z¦@´ó±Ç˜òLÀôÈ;v$€± lÝÊøôtâ¤:6<ÌÈà`¾t8¸{7Íjybd„ɱ±ä®Xd|p\O'\q…kk|œÈ3}@¶P`f|œc_r9K𑉦¦XT,&š¦b‘…€ÉÄf¦P ÂIye&fÿ.÷= wÞ»“nÁ"á­Â¨ò("Ž"?éSÄÙvknzäfO~ÙËèô’ÝfœÏC—TLÒ ù9Öl&Jb ZqŽÃÈò“ØLáxLƒ’6öS+IœN3ø™Í$’ÇÜÌìšœúfœ)Œ˜€Yë›Æ'_¨ûñoxë[ù5~VŽÚ2 ™ÍŸ˜³0Œ§ÖÌths¦ÍÄqRO?P(‰‹ÅÄç£ÇÌLM%€zhšž&療,0Y(°xl,éGÈŒ™I|qš¦¦˜.y™_Ï0:3ÚsÏe,X¿É­[9X,&ùN\ÛK~p0i§03ÞGIöU8¸m›1@4:ÊödÔ!ìÞ¼™'††§û©voÞœ„ ο¾í6&ÇÆXl–?ñ‹6oæRæ­Ù´éY#å;Ü`ºÑúל{îSŽÕ#=˜‚(ø¦ô¼H¨¡0Ý¡)kXW½¿Þso„f[G¹=#šË}‘î_ ÏUû”y®ïûC `›þ„¦CžYè©Vx>0ÿ‚‹¸ÑN÷Çß\EÑQmŠ¢¨9Š¢\E—ï¾ÒhC8 ã@¸â± XaÈÏlpM1ø–)ÄLð?ôWöå•$·a •-u„¡Ýô»d:€b¡ÀäÈHR×)­¥öô3ÀO¾ó½$ÑX燠¤]à‘Ж°“®Ë$Js¥ÈG’Ø+D¦6Õ¿&\ü¸(0ÚáòA“-=~UIˆX1 JD—Î|œv?òÃ##ÉËd0ETZÖæÆ¼mÚr(+o'±…af'®ZÈ*˜ž¶ASKsâ“pë¯ÝµÒ N—ÆõoÃIö÷bûcsžÂ1,#³÷ÃÍÕ1X„]¿üeâ?1Œ…âÔ øy“ÿˆ× ˜Sµö¬¢)¿ål=€9?N©Ã¸LùîŒc{¹ ·öºo´6…ªÙ×wÁYg%õ)߀˜»ÐR(Ђ1‡#þ³,rÇî½ûÑ’lÆŠÔ‡×Àc·¤•’”R>EÒ6©>e?Í5çš÷˜/Î| ¥§V5-KiÒˆV÷T9q8MTw#àeÅÆ‡©7Ï Jƒ{}VlÜXv¤á¬¤!¨dnRKƒj-*ÕQi]˵Ÿ¾¶’ ZëP®ô1í™jýI©Íæ^¨·Ÿ³©CTi æ1 bà'úEQ>U¤#ž1ˆãx"Žã]ÁGª£'ã8>€{ï~‡ÿ€ëkâ8þT£me°L´¡Ó¥$´r:ˆ’ÔYñíCó“0^¿F˜Í8õ¡ÉGIæ‚§2 ;ú?‚·}M޲ó¶Û8 ¾wOšÔw!ðŽ÷ÿ INYŠø‹X˜V™´Ô÷ûoIä‹ÀÚ`œ¿ÂBFf°0«K±xþ21Êb1óÞž´?éÛV_#à5KáE¯»8É>;ìÙ²…™‘z}}ÊІ3'Š^Ý3 ô®ZÅnóäýÛqsu¼oGοcÀO¿¹Ÿ½À¹ —,îšš¦s€¾¨ßÍÍp°f Ù´D|öû6bÑrb,[¥mÓ”ÇkE5züŽ;ÃöYŒib,›4;Ê*2Z¯V,,¨êkòcSèÜ0,e§QQhV1žb¢ñõÄ´ A]Z“ ?þiàž»ï.¹ÿ¦°,É…©)¶üç>%òÓlx_,ªV¸ÏöcÎÓ/9ÆùÔv›;=•ÅØˆ!!ø?ƒÛ+a9çëñë`ló~vãÏhûÏf€qÛßÿýSŽÍÖÜJãÔ=ûls5ÀMpLß·§æ%žIPQkŽªi$抪õ¡Fb6í”Û3ÏïO+= \ä…ÝÙÔ¹ ªÎJ¹j'TŠã8üþ𭹪[ÀK7¦^þJC= ÅX±),CnÒ¿àœÂ!î 4j‘® ™ÅÞC<” ~õbÒfEõ90cRîíØƒµà¯Åò1üc0$ 8WLû0ƒHÃhJObæ4š·À’t} Œ ûãOb »Æq yÜ?æ_ ±Là@t—Tê›{ û•›s€ÕÀXØÑKÃwÜ8Äôì¥3±}{bw¯°˜¸Û1€(@>˜wkõ­Û†èÄÜ.è–ìLsL$À^Ú£NM«­»üù!Lãšm·û±ïÇ’•EXW´¢¼ÿ¯µ ™Q T‡É˲a ä³¢ñh¿iÈüKLHhž„_ %‹qžbœô=Æä<¦A“ Ì·@ûAýÕü¼(Œg§±ÑþýUd®£lÔb,šB&CSOO2>•‘¿ÇŸ.ì>’6PëjX¦{‚qôbþqP¦›R `È(·SšÉ\ÌÂ|§Ùš1Êù#…ÒÀ,Üs¡&¶(Ÿ ‰ï¡¼°|9¿tÿBf§^ÍJ#}¬tm#ûªœÐ¡ÍÅž}&vzÂü¹ŸFú*pqð¹\'â8~EÇ7V+|”1˜c’„_@0Âb¨‡RÒÐ)J¦¡éQòä³8@±‹ÒDaPš»@æ;à(tÄ•„W6÷ã8à”þñ{w³ È÷ö²éMoJrœŠ³I—$únÐ\9¦ ðeq O'É• ·$7aÒ·'§ ÌÏà@lä¿ï3&a'°pÙ2ýµ[½j¥€âý¸Øú,ïæa9&áõýùÕŽ±ø]ÖåÚ+gžw¹E‹¸²ž·ÆZò/9Í„»Gl‹8@|ò±«à/µö°ïÓ>Œ1ø¿uož<ðð8I”š®þ~ù2OLºëe‚¥ÄtÒ´èe©$vbVå«0*£—åAà´«®bÇ8 ø ļ0kf5Ò¦„b9—{kß+ÃoøbV'Á*'„˜7—éW3n‹ù”F¡œ œ€i!öbšå2ØØÓÃEï|gbj¤yl~OãöSx/…æT¡´æ\ѨdÞæ‘Ðþh Ž‚zºZìzE› #ªétÅŸýYÉÿJ’Æôñ48¬6ª×^}¦%ç•€ìo|üã ×UŽ)€R#½‹*1ÕÀ÷lûq(åÓLÁ•ÿøSŽÁ¡µÕè52åöo½m×Òz„Ÿ—UØ3åÖTý¯´Öµ4Õú›þ”»æ(Í Åqœãø'Áç–FÊe æ˜"“T·èB©®@D&øßŠInTOsp4 Šž"& ¼‘óÁ·l˜GS}pšÀ$©Š€#S= föïç®ÿþßyÅo_@g ¿Ë×ÕŽ69œ_ãíÊš©ÐC~\CA»bÖûzdþ¤= +ùö$©•{ÇîÝ4cZ1L«ûzOm%ɱĸºÛK^º Ñ€›GLº½ù_¿ÊĶm|w~²Õ$ÛE /2ÀZÀ…/ˆîñó¨d[÷?æüÄ Š)øƒ¿ùSšüõ’Ö/ǘ=Ù²}ûöqó[«´£Ø ]Yñ×ôc&42O{ ¿zv™ 5?ºî:`!TUê¿¥'¿ùÍɺiïèš5ËlOhj­$‘ïÀ˜5Eß`û ø«>ù&„‰Öû9FJká@ùA]2Ç[æµ8À÷>þqVa@  >€ýÖ ’ Ö¡oÃJ_hºC ¥qI# 5Ÿ Êê»Ø;å®ëÇ’äÍ'ºõ³Ÿ=l a.%Ö‡RÇlëùñ 7̪\ÆâÔ±ÐäFTp¨šƒj H½euÝzà U™‚z™’¹ÁõÐÓ ŒoösS•»®V¿™§z§£thEÑÙQÝEÑw£(Zímˆ¢è”zÊe æB3!Ir14Ã(à€ Ìrdׯë$ñ×[Òt+ 2Qò`”„4Ú 3)ëá)û÷ÐŽZ&—¼ù’DR/{g…tüú?ÜÆ\ì+I\åà)áÌ&ž(X›9ؘžÄø˜‰ú*SeMVt—Щ5”lH-'WÍÃ/&Móðˆ?7ÔóÍo²'ñWxÓ,ð{χÁ‚+·s U·E±9Œf°(D2ÓÅ2K{4´Q¾ü‡Å4ŽašÄ1û±ÈN`6ðÒ(ä°< Ú_9,ôétP¿ÚÞ¼áŸcËï õ½Ý«Æ1-È?ÿbv¤éQD§ŸzÇÐ>J5D3À½»KÍèÂhPZ¯IL»JÚC°†DÕGåÅ`«ìÞ`~ä7¡½÷(¦ÑЃnÜ—‰q¨qÌ,I`S¾À¾ûå³cÚZýœ=àÏG8fBíäq¾Z}tÿiHPþð*Çk£’ŒCÌ•[itT—c™ äƒíëô‹Cû0Ì{'fµ×Ͻünt}¨eÈa÷ö î/åÄtÿß”é ÆÜíÇ·GCa€œÞáöóm”Þã:KçPÀ,ö}½áë67ÓÀt>ÏA\$¬£Ô¥ÁV%jŒÌ†f~'…@MB†Ð¬ðPê¬ÄLèw¥úk¯ÔVè7W©ÍFæ|®Àæ\2‘Õæ¬8Ÿ«ö+Qµ¹*ÇìT+;&½‘2Ïô=÷ ЉÀÛwçûc?ÅY„פ£ŒÁÒ.”€†>ÝøP…§>Ðd§œŽX"@j$qBÔér¾œl°›‚kU×4f¢²ËÃÐÒÙÉš×½Žcƒ6Wús£ÀOv‘ƒÂLÁÊ[Ä"íÇ9Mwøv‡üõú=‰«Ê ˆ7`RÖ,Î^\s7´Ó€áÎLh»çeÜu‹p`m)fgaΰ0³‘ Î~Áÿ…EkÖ$qÌôJZ™?ümqÀú ¥1õeǾ-ïú§¨Aú^€iCd§þOü}~“þšPÒºã”F¥ £ùLû1‰aéòõuùöµk¥¥R¸Ïþñ'æ^Ú_a(Û0r@_ÑÓ~)k³€ÿ˜ï›´%픂ó1¦@š±¼_¯P¨2Ú‘¯{›oogÊ&@/MÄ $Žå2ÛË/òmþþ®® »9㕯L4 ìŠdFõꞟuuNÝýÎQÁ¯Í“¾oc~Üš³‡F]?ÚpŒr(ù”ƒò~ŒQÐ^zŒùõb;þÒK+ž«$i¬&å¬T.,_/Í<ÏCpâå—×¾¨ xµyk´ÎJLAº½rå*¯Ô–î›pÂå—WtF®—æjªÕ¦JÒþÙî—rŒBzÏ„íUêg¥5L¯¤õ¨‡Â¶*Õ54›½pÐÐÇñFF#5é(c0‡ÔŠ“Êñ0Üørö”3nhÆ#ð+û÷0A”lµeÛ,0ÕîËIâ(#Iq’$MV¤—,𻟾.aHdf3ˆ`¦§Ùöàƒl úºpi6ñ}xó$Tι2»P }i,ºp@RÑqZp¸ c¨Ähh\ã¾ïÍ­®ß½839…q W7~+ðÝÇ,Y•@®œ·ÕGÍŸÖB‘œFn½•dÜ‘¤üMÀ'þÁê]ÕlöâZ̪#ç~ƒå!(u+@w7gü=ì¯[€ Ó:ˆiäã±§Ø´ÑÉ·Õ¦ÖUö÷ŠÞ£o1º®lÿæ73™LpM\'¦àÉ8¦§µPNÙù÷ú~¬¦ÔùY/ô;1SÛŠ9ë¦}pô Ò¼)·„ú§{c Lj1Öþ³ôC?ÿŸ»Íµ±u|†Üî­‰¶"ƒ3“ƨôiøfÁÕŸ:³¦q*÷’SŸ¥•™ös2cl4¯ºÏµ6 Ûæû˜Oê¶žªI9jäeÿLƒ‚¹àm½½µ/ª³?áïCéS9`_©þZë0[×êç¥R_f3ÆJ}©ÖÇFCméy£šôuåöL­zÂ>ÕÛf#×?Ýt¸¾g1}øoþ·äˆÄ=Ô¤ùô¾9ìF‡PŒp€NÒŒ,ù–b·KzžÁ¹%¾ì*ÌY!B%!V´dŽÍ–JzŽTɽ>Y%üã;?@ œí¹ õKö¦½ÓÓìýùÏi^µÉ·ÇöXƒ- Å(FHTvcáC“ ů?€Ibî`Úõ_ý|ý;'-¦œª#ÌÔHl–a˜³~-†0ÀØŒ…,•´wØÐìælpÇv?ð@‰©Ë~à”Õ«ß…¿,[¦ÝØÖáÌ>ôäœ[Ìûþ-pã û6vÚ1å,؇ÑV(Õ8e¦SÀ$åwÜ?’0Rz ÈÄH ØþÐoïðÈ–-±\b@ ÔG¥3·ÄicZqáke¾3[»=£:ä† ù1Hº/&d5Ž!ó©¬Å2S ÍÝ:pë½aù¢ÄÜJ9 ÖD€¿Ã—Ý31ÁÝ·ßS5HY«£Ôwh64 ì,”>@Å ´DQâ‹3³$›øD„&Oz>è;Ô’¨ õû$æÝÿõ¯Ïi}³*‡$ªãC­û¾¯~u–%Ë·_mnê¢å®©&E®ªë]«4àÿÕW¿ZUš=Ûù®§Oi¡@X¶ÒÿPSPo™ÙR¥=Sϸj­U-æ©–©Qªw-ç’ñ}ŽÒû€÷GQtèößﮩ§ðQÆ`I@%Q’ ÈlD #Œ·®²J¨´—–üJ&+ú>üº`ñç3˜Í¿€…4 ê§êlnž4çM]/€ßŒ“ºí¦¦€Ì‰'&„,ŽiÆ9ÂâËîÂ|äaau®Wÿ’\€1>²e—Ö@céêŸÆE9Zìûÿ(¥vò‰Š–¤]2£X‘G§á’~7FehÖxº€ÁmÛ°VÀb9~Ëö1};Æ”${ÝX3~N'ý¼Ý3j­ázËtH€y¥êa°¨Uú/S²mÁy••4J}[Va¦4]8f§cP›qû°Ã_SðkTîÃÌ ˜êù+&1b­X”¡iè%ènÿíÁ„e†%ߘ^HÄùÊ‹žLö²Æ«¼ÓN^¿(aÎÔ^¨ Ràcálµîbº4wM¾?Sqœì‰"°{o!©k»ÿ^E%ådÎêyUGÎQú(Õ²\_«rÀ­‘²^(€©ZÝsYW=ý, çðJ£†ù3šäByPX©å$óõj:ê¥J y®Ö^ á‹Fë¬çúCe¸ÒæJi¦ñP™U]7Ïé/ßÞ¼x#°>ŽãÕSø(c0‡”ǃ~ ôƒ™ðôaRbI·ev"›Ã¤™'ö‘Hp·]9TVçÇ1ç_=(•'1Ø$R±ÜU؃v hÎåè>î¸Ätoÿ±-[ñu( ð æ}ÿ×7ÙXÚüµ'v›¹ŒÚ;ߣoõu{ÞÌ…˜Ýµ€¹ú7Œg 2ÅÇ‹ÿø‰€m–sáÍŸÿ|2¿ŠÓ¯yñó èMöÁ“N¢½§'‘Ãþ·4†Ò j¼b>†b÷:C"Ù$¦aÑš øóó…rÍͳiÐ5t8¥Ã\KKí‹ÊÔ=—}ËÕªëp0=Ú2;ÍQKK cÕ×­^Æ¥Mdz‰$ìðÛ3ª£ÍCÉûs’â8þbðùRÇßöþuÑQÆ`Ži'ñhÁ$¸c<5Q‘Ìe2„&T4ž‡˜T]!eï,É€“‡“‚*3¬À¡$,ê[+°8gÚ‚˜d82--¬»â À$ßg´™&œYÆþ·BZÏXhRpf!;@·ÓNÜ?áêÝŒCÑ]djR^~:D‘kw5f!‰§øñ'>A7pp¢ÜÜøÖ·&ZeÞ•oÌ[ŽËÀT䳯]K[ggÂH…s-éøÖ½ÓIä=,%Åÿù”;¶¢šZ¹X…ó73:"gý< L*FÖ_'Æbcüfüÿi?'ƒCrÓB)¤¨ìÕcJ3‹¡Y}ÆIä¤0WF?¶‡´÷¦pŒ!\XÎi ðK ßbbò˜6F‰Ú´ßÂ6ÅøJC°88¯äobˆ&b{˜‰ic¦9¿Ìëfpö·§^yeÒÞ² íÄOÃG Ò½{b»Í¯4RË(Õ8„5 ]^'M†ÆaÚ²W.4¦#hvÄÓ‹?ò‘Š@¬`R/ˆ›ËºfC!ø¬%U?Ip–6ª6–rRìJÿËõ«Qð_¬}ÉS(œ£0¸G¸âã/9Öhý•€ô•£¹Þ#³•Èë“ÖÌ&)^µ6ÒÿgÃľÍWF&Š¢µõ|*•¯›1ˆ¢hyE7FQô@Eۃ϶ڥçE˜]·lúCçDqó1NÀ4’¤Ïçtƒ¯¢4zK+îÁ$õí”J&3À±-¥JÙ¡Oç-IÖ0fÒ²˜ã¶Ï|&1c)7MX"²1Ìd© g>š«€Ö¦ÒþL`@WÚ€Ö–-q: P~³·Ï_û94ùIYÖcÀPÒø œÄ\ý<ˆË(]Ä1\¸Ü¬ì6iµ€çæ"LÇ®íßù];w’Án…Ö” S p`ÿt"µ/`æ?/ºrqò Ü7 ' ïÀiDðåÖeÍ$IÎÏ¡ô_/81za~i—B»tùcHB>”#¸ Øê%Òlûÿƒã)M–ñs©:š€µ¸èTûýÝéùk´ÖbZKþ öb6,°Y6ø(QŸ$êøþ‰±\¹5×c2¯EÜ}9„ùëœæÏõïÛÇO?ÿùä¾Ú鯕&¤ x²X©ª@— IDATÊL<0îê}Xö`ŒC8†qc FIf[͘ÆEû(þe¿…hÕüϺé/þâ™îÂa§LÖ #àÛü`Cí”c *IÇ«õóP5 é>ªJš9øö?Xr¼‘6Ò Áï´æàpS#íT2“’—úþ­÷L-ªwÿTšÿ§Kó2_™O¿ÆY6×ú”¥\¥eèFÜûëSX˜÷óo$É»$ÂPêh)鿘ƒ8èÛ{^Œpó#S”YøAÁ1^-ÀÌ0t6G OÇ cÑ ¬¾âRþБ5öc–ÂNk!&iË $ëƒXB¸,9©É×÷`Á¤B¸ÊgbÄס(FÂ9 ,öã€l6˜Ïµ¸qŠѵb`4ÙàkOLú5ÔC[׫?ëpf38g…/#E™™ÏÌÂm·ÞŠ fþÔíçj1)(¶ šyŽ|eÔ¾âf,ëq«ÿ~Ô?}ŠÀ_OŽó7­íIöëP /(™݇ëãvŒU¶ç.Ü~ïÁÌ¿äŸ"†W‰ø4¶V?>Í{¸N‹ü¸toJh pµJtjZ0_Š‹26(?=]QC’q•siŠy*ð{:( .ë‘BW¢üÔTÂ8†u‰ÊÍG% ~׺&]w¥ÿåúU¼–ëW£®çLj^ʵ[‰Êõg®$ãPzÖ¢r×*h~Ǹ=s¸ûTíšzç¬Ññ×¢§ëþ~–ÒúC)܈)ÑyÀ•q&ŽãƒÏ?JŽ$HmÁ¤£1žRÒàe”:'c`SÀ@f=’ª*̦ìë¸åFÒóþ[ªMÙnŸ¾Ðœ¡õ=œ{ZÛfிþ\^'€…Mî÷é˜ôVá0å¤*-ÃkÿôOYÝæ¤ýqd‘i²ÀC˜¿Á°Ÿ“þŒcHư ¾£þº˜ Å00íÚXÛáÿ/pà®ËLܼöµqçï­~>~P0ÛöWǤg Zýœ÷‡œ±Êe9ûÌÓ ¼viü’Èäp’ó!¿vÇâ"‰¸“4{‘¯Gs&NL¤$Ã!SXôó#p(ûz9©Ç˜F¡gŽ$ó11™*«=¡¶~ë( ó©~hï‚ù-(®¿ß­˜6kÆ÷©=»|2›#8ŒœGÉÇÔ^hŸaÊ3¸õÔ¸"?×Ú‡øòŸjkg{0wr°^€½œ”¬N÷—êW=ýS&ÆRŒjSP‡˜÷“²¥!j£ ®ýñ”†UÖãPÝ/s*½eÒ×ü?JÏ=*'>À’–ü§ë¬Wš[Ž9Ðs-̱#sÎô'Ôêé^hD#1W ­#0—¦-OÀœ †C‚GiÙ犉©fBõtÓáfÎŽŠãø±z>•Ê7Â('ÔQª@Øé&V’|ýÏà@•À¢C ˬcgj ð$À,@*ÉïA_¯€úLs!Ó9…þr¿9§†ª×¯übÆ…ÞråÏÉAG[—þÞ»˜Â™‹ÈRÑdŽÁò#ÿóWÅ>Kmì@å(&‰U¢0Ùµ7Ä{!.w·Ì(Ä8hþd‚ñð˜SEõysî¼é«?I˜‹U‘9k~ĤɌJ‘mš±Zwm‡ÖßùO˜6™´HÒ«$pçnŒx^ÿ‚ >¬¢"EÀêœ% A·SiõrVöG}_zqi Cµ1”Þ¤bÌdz¥óà+×]Çy¯|eRöò},aF`Z%°ÓõY³ÓcÆŠN2O-Ài½dFwõÁý ÈFEc×Zi¿tb „ÊoÆüDÅ¥s‘óå%ÙWNŒ•8æpÈ-YÂÙ¯{]Òö^,»w:ñ`è'!ÿ¨ŸÔI\(R/à˜a‚~+,«îÝ¡ >™257eÉFQrŸ¿zð—Éæm¼êªŠçÊIŸëÛO7©ˆÓÒúj><úk_[r¼Rݵæ$ÍL¤‡LAS™îÝ™HG׫ÄUclê¡48Œ¯}mÃ&J‡bÒÒ¡2{åê8Ô>…c;Ãï™Ùô'|n§Ï7ZG={²Þ:RuŠ¢èì(Šn¢è»Q­öÇ6DQtJ=åa ®>EÑÊ(Š2ág6?)˲[¸ê s¡d6 >±YàØcœÉ†¤¬¡TWÀþJ¥Z™ ûsŠh"æ@f¡óf!8—6çadzš[oº‰NL»J<Á^Š#ð¹¾:ƒ:eÆ¡>Jмc6"œd[`¿/˜Û°)ëÀ}hÞ!ŸŽØ—]lzß;yÓU9–à€­L}` S3–Äê¬v8ae }Àæ¯âO$æ6‹#sR>àËLܳyß`èÁ³óØÜLçí!­p¢z™–SÇ $jm:q¦7J¥¯8†Ju)üªö–Ž…Ñ|›u ¸ýßþ-¦·ÿÝß•˜°ˆq9€%ÔËà9¥ R>æà[L ~žî²c»Þ³0ap#\Ú…ìÌíË”KfxºN!^µ¦Êó ¶dNÔœâ×ä¡ Ÿ£ÃÃ<þ³Ÿ%ýP¿þeþ¤0§Òj®åÑÇíùó—•Þ³ª#Ô8ilÚ–§ 3S Í‡;Å—¹û#¿ñ” G2Ṁ`èl…ÑØI\å¬+Ig¥¡!s8 ¬ˆ.’Ì …ÑŠF¨,µP\íÏ?Œ% ‹}ÚqúszÜC^N¼2£PÝ U­|ò3æos1°mԤ߭À)K-Þû°0÷cŒC¯ïãnÌlê‘qX äflïÞĺ' V$1*]=MÜ´ ¾y«u§ø1õùÏ ÖCÏrs0–óòbàwÿÏÿLæW ÒæZ0®xÂÏÖ[I¶äƒ!i°´7ÚòX ü*8>ˆ1”…Zc9€W¿÷u cÑÓ˜ö§ _jôÛp¹ô°ÖØ´^ ¹yùñfS/OÀ¿c:K6™ÉM)*Œ˜Ô‰esÞƒ™f%¦K`¦^ÜšË/dÚÏÑ>ÜÞcýŸìÛUT,1‰òAPnEC âŠQùmh E,bX›ïËr_×._.Ìd¼Âk\K)D2ÒþÁ×%M„î)°$‡û9JG:…’üz¥ìõÖ—®7SæSNK çžr´ûOæ·$æ üˆIHkÒm–cžíà­žþ=ã8’í»çbõx.ì¯9¢ Ùç.èõÇB…|Uª›1ˆãøæJŸ†»|„Ò ?W꬚ÇÙa+ì¥ÂJ.»ä%€™QÌ`YqtœYQË gÇbð_ŒIH„‡ÎÇA¶òŠ}/À"󜟄æl–å›6% ±jÍÀ¶IWffW¯¬Íàœ@µ¢ýbëÇÜ e§€L†Æüµ ×)ÇÕGíc¦1ɧ¾î7’ÌÈœtõ¸õ+عoŠóV»öš€Ž6wNÒç± •l81ã@ëç_}56mbÑ¢E‰¦¥g†"ûpqÙ¾‡N¤Í¸5^…cº¦p@Q ÈpÜá'4%êÁÂÈÎøyÖºE8&ª|ö¯¿’¼Ä÷`{gÒ×}öÏu**€¬4Eßö °àòËøÎÃð‚…æË1†1ŸÊ1ùs÷Ücû.Ì@*Ó0ÙÒk¬ *ðûy“D*ÜèÃ~®Ïn2m“À·îVö„4rÈÎúñí²o«|(ttп~}ö7Ô3Ô¡±IÓ °lbÞBг»ó~4×b4Âhbøï5 Ì/L3$ÿ„ùB]‹'¿+½Ä'j´îJRãFn%ÖѵdIùÂ5ڬƔs03ëyÒ†{gtŸP{Оúè>N3áó²š&!MÕÖ%œ—ju 0LkÊÑÓÅä”Ó²T¢Z{æpÑlÖ1¼f®41‡C£ó OÿÍÿLü °¥žÂ ùDQtFEŸ¢èÛQ}&Š¢3)¤Ón\öU™üÈÖûIû:î¿ïÖ$;ê±9¾ÁâÈ dIŠ(ÉmSð[C&ºŠ˜° (ͬ+[çðÙ™“ɰú´Óˆp jaÖÂ’>‰eWnÆ2 ç€õ˜§v$ؼ(æýf§½“²‹áñ¼÷ ¦R l pÛW¾EJóΑyb‡Ë?°o¯;vØ2á«)#´÷?4}º£èÚofÚÛiÉå’¤iyà‰AËà¼2cÒ]i5z(53yî¿öíd5w[Mò,»ÿqß7½ ÅjÁ1 ê£Ú[óp欌oCÌŠìâµ·:q «Â×¶,XÝïî·vez22… m c_ÿÌ&ïÿ‹1ÚŒûµK­²YÞte ”䀇flŸ…%`ƒÒ~š‹Ó1-Ãn/‰™c†b ³»›§žZ’EZ^}ëÁ1²Ò$5á4^bˆŠ¸õ Í‹8­B!8.-…2›‡LA—P Kkp|P?ÇéyïxÇ3Ý…†©P¬·|=@ò¢÷¼§î>¥ëM3¡éPµï´iPÈ0(:\'Oe”W'dÊi²çBsÐè¼JkhâÔÿ§«éö^ð,˜›ÙÐ\2W1sËl<è}Àû£(:tûï÷â|…kRÝï›(Š^ ܳ8Ø‚{ïÝEÑ• wù¥"–ÍVÒdI¬”}uÇžá$ûìî¼-8 f†U¸ÂnlCKÚ¸³Ÿ3[ s% `@H Xv×'E¥ëAõsf†Ÿ~éKpøí…R'JI7×·;¦h‘ÿßrÉ…ôcüßΪ6cÎðcjÅb¾Oøzw¼æ5Î<&ÿßÿ2f( â²DÓ‘ÇIŒ•hmû„û½cÊõu¥ŸÏމÉ㘊,pb¶Ô–^°¡[na|Ï&}ß`â.`OÑá(ŠeŸÁ9†+Ô1¾¾ž!Ìñ:´ñ“'$µ§cYŒ)P¶än¯HíŸ ÊäüïÐ HÑm$áÂ4@›ÿùŸÆ!d2er$|i‡2Áoõ¸oÇáœo_RƯì±û£ÓŸkÂ%cÜäGÐÜí÷wÂÚ`ÞTÏJàvŒ1—DvO,Ä"F íÞÍ/ÿíßf© ø“ËÍ ¨Ç8))Ÿ˜}iì4.%)Ó9i2Ä‚éqÃ|ZëÈç]]­X0iÒÂÄ1G:Ýtíµ5¯ ÁÂ\¿ì"s `jÕÓH‚³r‚)H ¿Å„ï–0BWóMë>]©ÿz¦¶¤êl„)¨gnÃy™kX®Oµ´Cå|7Uš¿¹NpÒl渞¹¨´f3—ó)øKà÷€÷oÞ¬ãøGõnDõQàMq¿"Žã÷Çqü à·€¿h°ÃG,饞ÁFIÅhCK*ÿƒ1 Ë.¼+kf 혣nø ~ £©‡¹Î¥ÄAÌDa$(Sî Ðd>/k>§úvÞþžßJ@´bÁçq Ô"œ4¸üç¿ÿ”˜sµlÞwO¸±d}ßÇpÒûUÀ9ínä¤zó×¾–Ø•‡ŒC0°e7/èkKTÖrr=‡Æí½¼Zp`·g·î/£ xõXd!­ÓfZ¢XþqpÍr ¹ÙÁNœ–à"¯ÁUt¦aLs 0¤!è“ÔÉä¤ Ö¡”Z¡O¥ ˆƒúä1‰…³ ¥å2‘ C}ÊŒL¦\Ù`œb,ä#¡9V»=˜¿ƒlöe3ß„3]“ùÌ(.óŠœä•¸ëf¦µó×#ñâ`N ÀÎQxÅ%ÆtËÌh0.1'Ó˜O„Û{J(°£s“À ß3‰g¨}›Âù†Hš†™ #^̘ÝPé–st„™JEÁ¼¶a‰ïæ#…L_è³Rîºgš*ŽÙ‚‘FÆT XWÓ„’û´ƒpºßÚÿzÊDVÚNùT…Éá'í¨œŽhöåÙ°–i*gB”f\ê-Ò\ïåÙ–-Ç„Õó™+ªT×<ñsNq1ø|)Žão{ƒº¨Æ`=.2QHÿ†ËMu”°¥²¶ÊüEÀ`9ðá|%ü’$ H½øÏÿ<‘8O „á$‡£8ЬŸYœÖ@¹ä°( n(éÉÀ†3ÎHà2å‘'Šþ#¾_·øÊFqê¡,𹾜˜:äq€ .XÛËq`´ˆ‹æ#0ß…ü0’M¨ß1n™O`’¦þ¬%E~r`‚qÿ_ñáoóeÎXšIuù±Ê‡ãì z’¡œäÆ‚zöMÍÍ<™ÉЙHƒ# ±µùñŽL›9Õ^ßöìµÈ=òwоD[“ЄEZXi|¤Ý(½ôdÿ‚¢]I#$dõ;|ðê¸Ø©Í mq–ìú/&E!PcsÒÔÙE}Ê`{º)XcùH«±Ôñs'àüz©=1•7aš0õñod>1n­×-ƒžv÷»+²hQj_š‡KÞúfÆq÷U触eZÝdù-ôÙŠIüµ‡Ä$ÊAfK:®ºó˜9Üq¾_ÃþÜ2ŒQ—³¾³%Éo$ЂÈJ ¤ Òˆs½õ•»¾Vå¤ÐiZIz^N’ZIú–+çø›f ©b ”»&ÌŽžÖ6¤—C?1éFaŸê¡zæg®¨’A­¶*íJ{¸‘~Ï…¼Þ=v8„j•ÙÞSGÉ(Š¢þ(Šþ(Š¢OûïºMa öb¾ƒ¢ Ø;~Þ“LKBL9 ¶áLdþæ²×•HidJ’þïŸÿ9fV¡0‰r`Œp“=ƒe±m ™r¨m@”Ñ"&å5çrXN™Øä±dbz™,ǘŠÈ÷]Ñ‘Ä -òc˜*¸ãgåL’½shØ’U Ü»§ÈZîô忣·ßv01§ÒÜ Ð©ç¿éM,<áöûc=Àúc`­/#‰¶¤ÈYܹ!,Šü ô2èùWCÇVIÌe"¥ø$öå2Ã@ÁÌw¢ Œ"‰)i ÆŸ úš-5¯øøÇð¥uèÆEmÊøö”hN ^f2Òˆ,ÄLµ¦0gîEþX3p‰¿f)ÎÉ<Ô¦ˆùÊ—­‚×®0€¯5ÓKe x`7 »ß{c×?iÏ6õþøó7’:Ž9†Wà sÕéû™±y•–D}Æ÷í²NÓ,ÉWD¦ebvdZ¨òM¸¼~^bÙ•‹A]ZÍõ|¡sßüæ°†åÃô*Ñ\µW DÅ©ïZtÞÛÞV±þZí—cÒ`<Ô‰1PLr uÎZï¨aÌv ¯,•ž3Ò,„!NÓÚ ÙJÏ÷óòt€ÆÐV£Ã ô«1–á¹ Êì™jí†u¤ÕÓc™‹{¤Ö˜ëï£dEÑ\4õßÂÉßlŽ¢è¤ª=5Â|øfEèÊ(Šþø¦?~”<õaRåa,޼°q HÒãÐAW/ÁÌA"œ„º )ã¤Å»qcIV% k’ð K¢Ù¬Yâ~«ŸYó‘F ö|áÓãë“qê“dê¡.­€L4ÔÖó1H µÌaßÿ½¾?²Ëß…™Ýq ×À¢ ‹1_2ËлxÍKVrÇ.']W„žÕQ©¶ ÝÏ÷¦%îEÖÜqã lÙÂŒ¯ë p×ãfÞ!óœn_Ïð;ö%‘~ˆb ô™ò1C¸ç ìAŒ‚’J†‚£Ðœ(tHóö+œ‡jãæ¥ÞëÃ6ÊÝ[õÞoÕ®«%Y¯´~‡"/§•ˆ€~ÏT*SŽ)…Nêáú„õÏö^I3£õôï(ÕMןŽãxcǯŽãø4àsÀuõnä™ûIào€wáLŠ~ø[àõ÷È¥ æ()ÉŸ>Зuàa¥jåÐaa'wS*QÙ"”ÚSwa’>ªöÀàI’â´›÷Z&á• Œ|{÷nÛ›„[\{HÜ;hmÅ8Ûþà”‘XÀwŸO3&ù<à;¤(ÎFIœ{ù(:Q¿ÿÈDj Ƙ¬)ù•V_þÎ6,†ñØ@ýãþ÷f’•îßëÆ?Ìäó4Å1]”&ˆ{øÍ·\L„s(>¥ÃÂÁ~¸¯?1éÃÌWŽÞÿàƒŒ`Œ›´9r^åû¡lÆZ#­Cg®3ŽÙ´Ë¾] §˜K™ï„YrÅhtã|;´/ ““%ÉÍ”‰[Òjõ}'UŸÀ™ZM/_ã~‡Ñ—"ÌÖ~™ÿ?ê×(G©¼Ü?ì@…œåŸ£ÈCÒ<=ôÀHâ¥T##MIÈ Ç8¦ ½§=Éy¡òƒSSL $/@ÍS˜IùîIsBW9µöÎYbæm!s×îǦ@b(¤‘qs®Û|¡­÷Ü“ìKI©ÓZ›ÃEÏ&¬Ò8·Þygò»ø,FC uYH÷˜ƒ´´9­YH›û„k$faÓ¼æSõi\bæÓ¡QÃHµ”ÓǶ¥æ¥ÜïjÇÒýläºz©‘2³Ýå˜Æ­wÞY³žj R¸VYžºž‡ãž¬ÔŸôº¥Št–ñXôWÀÙõ®›1ˆã¸Çñ'ã8>!ŽãŽ8ŽOŒãøÿã¸X»ôü¡Bð­‡f¿?6Q0SÈÙÆnÁ…"–±6‡‚’Ä*—L.ÈŠXZ;%Þ³»n¥TJb‡)ݘ;ÆÛ,㌘ƤÆ÷øzôàØ„I®µ"Œ”¤È82•Òµ™BœdÔ•6áÄŒ“\ïÆ€Aw¬ ¼eUâ\ÞîÆ6 Ü7gu¸>È\C}ÂL¯$½Z‚ö »Ù…ÙVàÓ_¸™c3°# w¹ñü5]¸jxÕF—XmøêI'%a+»ºMú"FA =™ëHý.©rÁY IåðÒ*(Ñ™æRÀYŽàÊU!‰¶×V̦ Ë¿æË s)ðºê%+‚ÿæ##Çôaó,튘8FDfO’4öø5{9©/Ý8'oí+%I$ÁØýlj°¼ú.§çܺ·áLŽ´§ÎðõõûëŬh.4ºÇî„[|ÿH`æ ùñçq&Dº×UŸî_1ÌÊeq¸¥æÏ6J3zN òl•P-† m2JåÓŒÀ^Ú%ÔØT‡Ò*Èï@L"’…u=ó²<•9û“6_)gÒR‰I¨5Wå(]W¹²écP#`¶ƒW/Íöþ(7ÎP«œÖìJ[³éOاgó=û,!AÇÆ°WoUªú¾‰¢( ~g*}îòJz¨É|g‘ÿ=ˆIø2>4a?4¤@K“ ̓œD¥PøÄ"p'¥ê>…æÔµ—`Yae¢ÓŒE”y‹,Óâû´âòË“—4˜$µ€ËX, Î)à¸(ÇÐ nc»k·3§P=Ö/ñ}zÜ—}¬hES’&¤+ç$×Ëü¸²Àt~4î€ý8°ü³1¼~G+޽ìý¥–?ÿù,Z¾<É}p8Á÷á$`g ¹‚7EÁL ”¸ øÆý.—AçL-†opØÆ£ý µ (‹ÛCYÜ>‘6JRq0ÕÙùŽøsaøÌ0Z‘€µLžô°_óÚ×&Î qã IDAT¶“X2´Ð±Œ)ìç?·ƒ^J#'… >Æ—Jý"ÎÉeØåûúüUÆÈ(¬èv̱[s&³<°û®cn5VíËðXèÄÚº`ËN;ûóæ/q·¯¯;ãŒ438d%Æl4á¬VÌ ØÞÖ<íÃ4_ÒX€™×…Ë®Üd° ¥æcó…¯[”J?ç €”3:\à¦`WÌ1¢¥'œPÖ7 \]!°Ó3&ÌNJêÓy ºq÷ÓBÜ3hÜ.içátB‰²„M¡†BפµiZŽA¼>KN8á)eÊ•©ó“îG¹¶•j1u³­§õŸpBŲÕ(4+ ÐÃû¥ž½]OË+woÎÅ=;O˜Špr­ÎĽÒjR-P?üÎWøÌ”)7/I¡eg¿wCÉÜ ã’ûpLREÚ‘IFh ¢¤aûp G‰´Ñ§14´ªÇ1¦ Å×+3ÝüÌ=À¢ÞÞ„±©êJÌ¥~â¯]ˆ%ÃjŪmã®\Æ4Dþ÷cØfôy¯(øq*9œò Ø•wó$@œÅÂ>Nà4ŠËýñ±['9og0æFö僣£´ödçâU˜þa`:6¦@æ+ù¾I¢¬ˆ2ObñûîäX­ùÎS™G a/æä¬°­}~’CéZ:dgçášê%-3¶qàäfÓ@Œcš(Ilµ'ul¿àëÅ€z¨©PT#9Ê´H~)-À-ùbâ$ýËí®e‘[÷?»çæ„që Ú _è§µçÔ_i‚’ñG£ÛÚJ×Â…d(•êÇÀTÑ}‹é{K(ÆI&WºÏ´¿UÈ”ë<‰Ò—®î›"ð­{l¯ÈÇh¾ÙÙnxéK“ßsÉÔS>ÝN­vk¯&i®PÒuªì)/yEÀ\©}]«HA¡}.8žd6Ž\»YX”…þœKnÙ—uÌr{­Qy°?Úã¡ð#ÔP¤™‚rÌA%ðœnKóÒsf $T ûY±˜ Õb …9¨D§¾üåU˦)¾µ†a„ª´f©Vë_x®Ú}u¸ú#„^ƒ“¯†ô„?^“r5·ÉË.­¿Oó“›E¹ 8p(§b½ð•ÔL ²€3'ØX,:÷\»óNbÜÃ[]RpI ¥r×ï¤ØÇñŽô5Q­¬§£ód#ã€à£e— æ(*MCç컘¼óN 8 U.Y _ßã€Õ z¯øzíùÓàB _¿Ã›^¦$’b ø†Rõ8 3†™ðÊ…ÕzÀÊcf.uÇ úsû±¸ø!08Ø>íúðãqwn«¿Vš“}~Îîñv4‹€;gJý¦Šê•P®xð[7Oθö¶ëp,÷‡¾þ!>sÕÇX“íE[³Å½½L ±Ï¯Ã$Ž-{ÙŒâÌ´æ9‡Óª<‰sæÖZH3£}R ®@•$\y($©W¿ô²“FDæ3õêåÜN©‰Q90RIz©ß°¼jœ Ðjß¿VàùÝðƒa·g¤ýÊP^ãö…öãðÈnk÷ÞawÍ*?‡` k(õß‹ie49Kº/ͲJGÀ9Káþ=¥‰Ï42ûSD*(03'@&ÍE–W#‡1´$„} Ÿs!­œ/Tx(ÇÔ[÷3¹³‘*«\š1ÐóIZ„ =í­ÐÕ ]  £Úº ?ÓS02#`dÄ1£/Âd¦‹PˆK£éymg#{WäãRíYZ‚OÕxœWYQ-ð®ò¡‰£ú'S+%ùÔ}^­ÙP%æ =ÆjRñ´©G¹ë±U:_ŽÊ1é>Õšƒ°Žôž ÇY‹áK÷w.ƒùÀ\DQt&.ëñRJ·Ëó£(:ˆâ8¾¸RùFü¨pü ÔqD“ïBÌ)R›\ÀLa3I §1[åœÉ6_FªÞ]ÀÙW_Í7öXÙ ü 3)ÊàlD3Á±ôM.©dÓ:è¿ú«°Š´´$ Fq×õ@^ë¯Y¬i‡©ÈT°zæý¸:qH™šñcÚïëÞéç­?2é«L\ÇÂl.Á@Ù¦qYä¯ïõmï÷å¦?}9¬ZµAûŠÄÔôv›ä½8Ð×GÜÒÂ~ßæÇ¯ú}­ðpÑ@tÇŒ‡†èð}_Ž1\š‡0ñOøpT„)½@ejc6åH#àˆÁQbþ[)ÕÀ„¾)øùÁÏWÈøE@_‰ýo%iUÈDÈ„Lš(EzRÛÛ|û#À†mn”•xcÆï›q ¢î¡%¸ì‰ªki0ræÞ=Ävs׌[ó.“àwÈF (ͳpïÇtü?öÞ;ÜΫ¾óý¬½÷9ûô&uÉÆ¶\äŠÀ°!HweRî½ÎDé Ã3(3$`‚RIHi¤Þ i8¤¡ƒqÇŒ-[]–ŽÚ9:½í²æßúîµö«½O‘í$¯çyŸ]Þw•wÕﯧ’–<‘xH |S;Ôo2ü—ר 6gS !7»Š!©aºF«D©àóié´\ð¼\é@³gšŸFõ7âbg¯f÷kKÊYÏêÊ7úíüŸv¹ßè½/´îå´íI„uõ0º*ÀçÃ÷¦i%„ÁysùyÃãúÔlZ7Tó("Ð'N»¸—uso @Ý>` DúãRÏþùÿ°”L O *mdëÃ}‰m5X"Rà=Ñõ¤8È'ÃçþùŸ¯8B?_Ÿô‘¤@—‡út€­Jú^j4šR‹°LƒäiÜSw˜çUâ{¤êš‰­‘ä»ÀðËßüæM9dçšÚ¤ÿ4Ÿ!Ú„¨º/¹À±æQ+pOÕ€úv"!ÑüwXŸ åÏÕ’Ô':Ìåm ¢0ET†xh® ¿µ&‹À-Û·só]wÕ »øç±ñ„èbUv)¡àÂóÛ¢7¦tëÌ®ûT÷ZÄl1ôD5;BY÷sºã'òY+k¹ÄÁJA_#‚¹Ùï )»Q~Çž=M‰,·½°Î>›‚g€ª‡JÊ &%¨T¡êÀ ß}лÖl…õWÁæË`ËzX߫۠¯`6 ÚSlÒSo)@wѤ©Kî|¦MYûËNŒ°X7V×Ë÷ì©Ûó²†ÑY›„F6"’Ú±wä@e<[i±ùäf÷S)íãfå¾rÏžeµ++mɬ+Iéóˆ½\æ~6ïsE<ÄÝ7HÚì½ÿNïý;Ò XðÞ¿Ý{ÿöÅ2/ec€sîÏÂ×¢sîO‰ÌD‡©z?ñ _à¢I8:|ªöÝc‹wŽè%åÊ (Ò±¸‘ŸµÿÜz0@|(RYšÁ€J‘ó[Â8ÙëœõQUG\KG½Á²Oê•:Œ{=ð·o{[¨[`Ìav,”¿sât`ºÝšê‡6`¦bå­k#%8Qµ{]˜ZT¸ÌÁµkàÞS¦.¢ö©_ Þ8ÌÀý—¬ƒÑa{V†®£ÕäàZ0Û‡ÇCÞõ›€c0ö—Ή*´å`²ju­í„sÓðàl0P.Wkï‘Ø(c*dë›6­†Ù³6žøK@Yê52Еþ9É’ÜH÷Uúð)àÖ¦› úÝÊ•#ˆsfø‡·½ ˆzûÕ̧$L©ÁsºikóOU˜RÛŠòÒ¥ƒ¾;J’Óüò§akÎT¿$ØÒ“%¸©Ó\Åj,e·â±yRÂëÓῌP8Ú&?ùÄT¨ÙàˆN]¹.¶Í„¾“”`"<÷Øh4æOûBL’q>G=á8J\ƒfÊ­Õë.•ôØ?ýÓyÿ©OW’š‰F åBR–¨È‚õfϧ¿³À«×6´_»ûî†ÄLôfÁ˜ÊJç&ÔöeŒ(¨zÈOC¡rycÀä +@.>[ì^(vBW¿Ù!¸ p³/C®¥‰éBÎÊ.,œoï ¦R–1¡õÒ…1a6m„­×Ãѧ`ÿWáèÝw×™jª?;‡RAm›Ã¢Ê{`ÊG·ÉÙ9“MæÚJæÕR’¡ô{–°Yªž¯Ü}÷ŠÚѨ7š«+IËúÏ%GÿB™YZV/IPos˜ÅŸ>°â¦]¤išè–R@Sé.§¢5m8 6ŸÜkq0ä Äà8‚(–ziI#:ˆF˳aøÏAŽ6ébkópI¨6Ò…¹¹š:ð5´·ŠqzljâÄUBÝRÝ‘|qí‹=TŠLºßò£ÀÃþS&Òm÷f3ð¥pOÀLeχò?9Áæ,Ð^€eÓw—¡öê÷,ðý¿ùmT~ìÃÓÇ‚1]ÕÚ³½ _Áˆ#Ó1ƒtÇ{×#¥( ŒÏ ÑCÒ à3Ùy"øL$ð©ßå¿^AƒrI^-ZCSaˆpÊ©K B0Ðé€ÕíŽ3³qŸÈêÑfNz0ä’çÓƒ#±ê «¬Yì`%ÎKqáExŠh9ZyËÀá’ý>1 }EPu%RcD/_yâá.W¡²oðÀD¹L¾\®z©¾¥ý¡þnIÊ[ÞEªwO½ÿD(K„ˆêл«_D¬‹ ë'º$–”îRIgöﯳ1JçÝ´C=ÛžåŒSè-uR§÷ÏîÛ·(áшž2R‰UZFȇ›® ósÐ2…äóÐÒjW^,ù`@VõàrÐÞÕ28g„„Ç‚HkÃÅçÄùN÷ŠTR–îIŽè9iulÞ³§i6±o­z; «#‡oï¢ä Œfjz¾Nš§>Ñ”îo%lÝ—}”–Y:eÇq9ó´_Iyéþ›}.ýïô¾}ËhMãv,ößJËLÁc£¶ÿ{¤gÂøFJÞû&ÿ÷,'ÿ’„÷þ.çÜ“Þû½+jÝ%–pÀäÕD›pº!¥‡\ åd,¬Gä¤ô sÓÍ]€d,)»‚©NŒmRàÕI â¤I0GÕN9ãb<þOƒC $CTíÑûËo½¸È>ùŒwT.1¶×Ûÿ_IÚÛŽ&MÕä=[U½0>ÊpýM0ô|a:Ö¡þùð}˜ƒDÕ”Õ!–în ^Ždh½.´ûl(§P²¼;ò°¿b*Q­¾ä£wGT±’MEÑã¸v:oåG^‡¸uˆy¢înލóžO>{ˆÀ"arj®|Íýð‡kÒ¡”H9lŽú•ä¹FÄBÊ•LwI˜4Þ©ú”<Øüè#‰‹[úïQ5N _„ÀDº©Ñ"D•*©` „òt/‡Í½Qê %I1«µä‰†øá¿a<Î$ï¼@$4$qÓ˜«ÏElˆ€Ÿ åŠðæÒJ+ ˆ†F ‰Ï-'ÏR)Ë\ HL×V3B¡‡µQÒ<ÏIïR «óEFÈ: |ÅÔ‰Jó°0g@>_€œïM²P Éå’I:{¡¥…¢Ý«”íYpµ¿Z±@]e¦æô}ÿ½Ò¿w}_Ï䜻«Ù=ïýÃ3ßã½ÿ‹FÏ,›õ¢O}‡qÙåÅG›qލ.£wœmÔkBY­˜Þj'0þ<1]Ï¥•Øøx¨S°ÃÀ‹_ó^°u«ÙOLF¯±Çl¤’r£ƒã+óÁ*<$=#¡o¯ uÉ-­ôîóIÿ´‰+IäÕI†|2,N¥R²Åq¶æ‹¢ZKr C? {øù¸ÆÁöÀí?ðuÜÍK}OS£]\?¥|ò]eM9„R¨`ós+ˆO½N©ìSăyŠz·½3ÀË0C|¯^õ±ìAJ˜ Ùлa/¿í6ÊÄ5FRžoÁÆpH°©ìéÐþ*Ñë–Æd](Wc?DTJ üTZ¦ øýïy-Ub ‹K%m~á ¿.õ¦L˜”“¼’üÍžw™+ Hañº´F7íØQûݬì”(Oó‹0ê T‚%±L ö|²Ø=f˜\^€¹˜„ùiS+jï/нµ›¾Ë»XW §ÇÜŸ¦ž X%åÀ(ä ÕY\„Î<ôµÁÚÕ°aÐlz]<_dÛ³œ›€ãGàÜhˆL¾cm9Çê}l¾e+[^v_òbV Ö ”S{ƒÔ®@ß!2!R7¬YнÔç¨ãfWúìbR lJ ¼TMªQ[¶†9ã2÷ýnt=“”J¨*Éõõé+!°¿ÁÓ»ÿÕäRjjg°lÂÀ9×îœÛëœ{Ð9wÄ9w,\G/°á]’Ž<ÄÉ×Nôè#°­ÍF€η=8J\ü!›ƒ|Ý%÷ú0°¡ F¿´éÜœKþSÔ_=¯¤2ni·ò;€…ññ:[q'ŠÀKœmLÓD½é4¢méW†ï2ó\5É›=0To*"Î'÷È¥ˆa#”ކ¾8GœS7‰G¥ìŠ¡EŽHHiÜ:‰ªqéA$ô)ÞÓë*uÒ­Y’ttcsK’~"‘ "G¶:¥ð]Põéf¢ô(pí’ïyàˆ‡_ÿée“l-GábI뮿¾ö= R<÷g `DˆÌ‚§l›”V6–ñiò™kí7Ö­O•—%4\òL5ùð'ÒÃO9ô.oœÿ–"‚=A.Ld_…ù˜ž€Ù)“¸<´®*ÒvÍzoÙÈúëÚX³Z[cۤ♯šD‚"”ÝQ„Á~¸æj¸q;lí‡Át»(QSÀÅããðÈA84jûnÿ7Òš/_¿¶¿®Ý‰»ìNZ»×Õ¢‡§Ä€\i¿IÒ^Iú"ËÉo˜5©±÷R€»‘Ä"[f3pž]͈Kl¸ñÆE‰€fu>Sâ ;w³××+] „÷~³÷~S£+yæêfùW¢ºú‹XÔ´¿Àðɯ`ëô÷/°í]Jõ£µàÎ*á^%yF›‘6 åÓb,=©T€Ã‘ÈÀQœø“X4UÕ#@“ŠN!º±'‚ª³øÒ¬ml³ÀW>úQ<¶¡Kbót¯·ü«‰Õ…ð{{.öÇ>àöœåËݲ–Ãû xu”ã†í‰v©}‚^yY$(òÀUÁNDÙ:àúU6E¤äŠvØ?MôÒ$=÷iìpÙØeå}ê)Î}ñ8"׺l.ØoEÑ-a^sth¥nØ6·ÃK¢[PÈéPw‘<îI¬ÞÞ»¨B¢ n²7‘‰ÜÏV"Vr5n©o:ß”Ý{oí{Ö~ JÍ´tn¦3Rà¡K60% 0§‘¹€šÛXï¶Ð’mÁúYï}]GTw+%uµ„ÿÚÃUÆNœàîû¦¸)iŸ¸ŒZ?RzÿuDB Q….]OylŽA«ûˆ.K1*tÚoUêÇ(µ+¹Ò}ü ðÌÁ~£ÔŒ+[Š[aC›Eùm§1ÀkVN–Ðn¬–‹ò¥„À?ðÚœl²RæRö^#Îm%ùOè,&Á‚ÙÌÍÀÌ$LÁô8L‡X#0=¤3P^ð¸|‰Ö:¯ÝHÏÕëé[ÓJw§9rhÏCg‹¹+u˜ýBkу|Îb' ^ÖÍà‹_Äš—½‚µ— 2Ø =…èäA’½‰89csÖæCü«:m½=øÎ^Nžfþñ}”ÇÆkk)•vKŠÑš\©‘öb\øÅ@~*qjü—Ü+ó˹_üÀ…›®”8x.Öìó铳4èœ[ÑЬ„0ø6àÞû_Jáó;€—¬¤Â‹=ɲCÍ'¿ÕÙèÚ8´™È×}jÔšKò¦Ò™øRT‹®ð} ÑOºÚ#p›n„g“ö¨-ª[` â¥u”hd\Ä8¿'«ÆMçþžªµC@µãÞ…ògˆ.4'ˆ\­ütŽŸ=dm]žýZÅž=Þwx`þSŸ•»87U«\TWÇl ÂLÅñ8Ú"ôàpÙT†Cû5Ö³¡¼±0 ÀC³ðÙQ¸¼-ú¨×=q’g0€/NuêI¨B}ôhà*e:<§üâ¾¥.:uOêLâVJ÷TDÊ•!ºÊ™Lòu…>Լл·‡f¢ZÕÖÐo˜P_øýý/¶:waS;Ó:½au”ò¥ëQ뮌5³Dõ#€-D)PxYgÔVHWZóPûÄ\’¯›H^JX`¬ä”[ ˆiïíråšX×jýߚɷ kD4k‡æÂRăÊÍûjæJÏšô™l»Sé™ÿ$éš^€É …±³pîœ9#Ãpî$Œ†ñ301 Sç`â,Lš£|ò8®2MîêítÜt=k¶v°ºº ÐY€®v‹¤œ+˜4¢ØaÆÍ¹<ôÁšíƒ´½ò{)¼ú‡éßþVAoÑÖ•ˆf0’z ¯6õCwT§Æ™ýø_3ñ—¿Æô¡¯ÕÖ—‚ÖäSÎ+äš4—ôGv<²©QªL5SYjÄdÉ–›­c±9܈8\*ÏR)Kô,§œ,Ñ|¡u?ŸžyrÎåsïÁ Ó)`Ü9÷sιüY•}ÞûþtÎå½÷·¯¬Éo’ªLv1hÓiÆÙÑ¡ŸÝ8¤r |ÒC–󬮞@{ʉƀlUõ; ,9" ‚¢³sø_ÿófæ1Лëé劻>ƒ¨ç0bEk3U_L—‰@RäcGŒ ]Þp÷jžˆ.ËG5›§ˆÀ9õç¬@c;ÉPõ0êíù†þu˜Z‰ŒK»k7n ·«‹ÞÐΗì™ù÷c«M¶Òß—A¬Ôæ€ÏÏÙ;ÉÃÆDý?„q»elÏÜ¡,LNžw¾6R)ÊÆ=Èãìþ×|g/ íÉ¥zRõ¥åËIKµg¹)•|¤Ò¥æ·Ò³µN#ÆžIY—±òàÛ»ÈY@¶ IDAT°ÐJwß ,+HÌJΜaçÜÆðýð2çÜuDUÙK>Í`«¢”J—_* J©ÁDÕq7)X‹R›˜Td<Ñmgj ¹íú¡ZÙÚxÚˆÞk\R‡8âyàMEGî§»¿£æj1Ua’õ9¢' }BTš¡>º®tÅõž[ˆ.Wå‚R‡^Oxÿß|ãn†Bÿ W¢:ˆˆ#µm2´ù0Q…Çcª:1BGj<‰ù>ê]¸ößz¥uë˜ÄÛe{ϳq ƒi äé'r³Ú‰q Ä•:—gˆDÅ01p—{&åÁÕFä ¨¶%*²m(&ý"µ*Íô êLîA7¼éMl ÷;BY•äÙ”(tIy©ŠD€LR¯¸”N˘!ÚY(`™$:LU·â<Œ/DCnq¥ ‘JUfÃýëˆÀ~Ê[m¼þz®ø–o¡‡h’‚ã"ÎòÑ3•ÿA ì¦>W(©T‰°‘µñô‰Ô6N9¿E¢¤ŠI9äZï-cä¯Èq|¿# }­C¥‡H‰»³©ÿð‡éÅ _¿ÚÖKäÞ¯í8Ú"W¦„6÷ÝÜIuFÚ¢}„ÞWÀÚ?VïÁ(G”8"PÙˆÌ*‘ ÿ«¯;Ãýk0BhšHH䓲 >ö‹¿XÿTõGÏÜS?‹ƒŸº”S­€¯ÂBÙœFÌWJ™©ý#ø<œ…ñR<[Õ]û–Þ¡ìûí÷3×S¢ãSrž‘Ç16 ó¥ú¾I *íoÚÇR†EzV¦gi6¥`:u«ÿúòf¯R­ÀBÅö¸2Çý™¦´îtï¾çýï¯Û·—ª/ ¤›Kµã™ÊÿLû&Ûöeéνø>`'ÆW|ðQçÜ6Œ/ôÀV "üðŠï;€÷ß‚Å\Ý ü³sîïýÓιðÀØbÃðà½À›CõÏÖtØê©%ïýƒÎ¹MMž¯KË–„ʾÿÖoÂDÏ'Îçâ¤¢Ü Ðîâ#}åv¢šÂlRV¸½2DU9)X;N½^º€U¶î”ƒ ¶a¥Ü`I^³5n©ìx \*l‘ ªE&Õ£‰WjDuž¨S/µ‰õ@!Ç6"AQò â©…„h Þ‹Ò 5Úp·``NíûÒþ*S™ºc ¶Yå)"1Ó ‡y#èûÿiàÅo¸®æQê±ðžn}%cÞËG|äÐËÏöÚÕõ>Â1hÜ<ÑX"‡)œ Þ˜®h5w–¥ðì#¡ŒÓ¡qŸ5®=Dé'!"À¤^¥h¿²Ñ؉;­òòÉéœÒ»ˆë(¢*5XΖ©$0.BŇq‘Ç$I DÍ9ðg‰R„Ñ>BúüЉ þ-¢_ÏEÕ­I{\ø¯›(a8œ¼›lò˜ËÐTõ‚ð9PºŒù•Wî{æc¿ hÝî#ª*oÙG‚¯J ¨æ±1NmƒžOÏMÒj檲Q:Èíf i©ÿ²e¤*.Y ,ÀI¹áZ‹Ùge¦+kÀœ¶IeŠ©3Ÿ\ÚCÓ~ªx(°_š˜gáÐ¥Cç(.S1¯CÎQP ÓJA‚P­&ÀÝg}¾bef ÙöiOW`tÞ3<:ËÓÓœ.1U…’¯—ä2ùS¢)% Z’k)Cyl^E ÎYs Q†ùSÉš£ž°ÉqËM‹Ü´ý2ª–ûÝÅìÒÿ4îÙ1Î2‘ÒïÆ&[îRïñ\üj˲‰ çz1þâýµüÞW°ãø&ïý~L{fæ™ó'’ì7¦ùBz“,€9¾;è½OùƒbÓçªP×÷yïß½Ìæ.–Þ¯2“´ øåd^6aàœëvνÓ9÷ÏιÏ%×gWÐØ‹:e7w%Ý1 ¸@ý¦æ°ˆ¹§1P [䨸……|ܼTFV2! ®g^ˆÍº‘ªmVŠÄ+P“ê Ëˆ7OôýªÝ»9Šq7¥#®j³ ˜e š3Pw-KçúJ`kžöŒ¤ÝÔûuÄUDõŽi"ðý£‡-¯ÜJî å©«˜!Œ\³Ž…¶Üƒ—¯ Üw"ÝúØÝÀ ßöm<öd‰jx¯Ë^ô"z©’µÁYjMcÀ 7H?ûS¹‹H88 KLD™8êçŒl í–Ú“ÔäîUªFòÒ %wM‘s%%9FœŸþ7 ÄyûÊ·¾õ¼ÃêUeÒ9žz’;Áê7bõo.Œ“êŸv¶YyR—“„D‡Yª¿Ÿ }*=–´]’Ô ¢ÚQ ¸i ­F¸M†1Ú~ÕUl¼ýv^qU$ÐsظkÌ$…SùçÂD-æ’µúc›W„ÿÕO·&åiíÌa'I™‹Ac“®ñçâ°üœ®zå+¿.õ¦{òJ‰‚,Gv)ðæ<›½RÂ@߯޹ó&Nœ tå`î¡û™ÀÀÿéQX×ÅîHh=ùˆÕ/Cë ¡½ybP´\øþ¢1 v&©„ÏÔ]í]ßRß§ái?)ÆÃö 6'äñéúp_j:â˜+„ˆ±à‘Ñx?ö‘Ôqœ¤’¥6i¾Ir$à! ë’ç5ŽYP-Ђ©OÌÙ¡*;1"wRÆðj£ÄþÃD•ù4ð¦íÑCÔÉrýóåÑ9rÄyÒœ˜`üôi}2º­bkf6)_FêÉ»öT£[R%c’z¿ç[‡ŽH „I%B%U(„öHÂq©¤ŽÞÞg(4’î_h¹šg}¡*b²·>Í»ØïFmK‰Þ޾¾†UIgA–O ¤’´,8N9Ø@bÖÅp æËæ‚›Ó‘S0>åy¨”¨V!W@¹ s%“¤j­©+æ”7Rë©}}}u’¬²Úš•À8Ϋ´_RPÜŒ8‘êì(¶Ç§„ÖLøÛ×f9h?ÛIekïîë«I'Í·F ¹Ù¼h¶¦–C/Õæ¥ñg²¬ ÿDøìËü?Ü[,o6_ª¾Óì~ZÂ`'ðrïýïý;“ë]ÏUã¾QSžÜ¥Ö³>|¶¹ƒR‰ ò7UÚ઎Ö¥§=˜”-0Q%]С¼R.q=« M±:ÛZY•´©8~ß}@T{§÷Éùz×q ð$0©…^ å<¶œÏNÐ?päxÕ›ß\3•>¯Ú=Aÿ©.ù‘JÜÌõže (zŒÛ¼•{B œŸ6µîzoÞ¤Ž•£w S'†ajŠ"p¸ £•¨s?ÌÎÀm]‘Sä±Mÿµ¯»¦Ö®>"ˆ*F»‡ÎšÊXÑØ<ÆZj`øëXÅ¡(7„>š ï$ÀüÄqk›@ê>Ì.bKx¾™¢N¹@]ê=ýÄuvåí%‚YI,4ï4¿S._ö Õ|&|ž&ô2V·tžËÀaÄV3ÞnOî+U?¶Nþ᫱ý"´RÎijˆ¦NžäÌþý5IšêßîKr§q½&<Óö§B¾"±=O½®ûŽöЦ­¶ÉfHAÛTŸú_cz)¸~»üòËÛ~æïÿžû·mcÕž=<ÜÕž=¬Ù¶­ö{ËŽܾ{w]oØ»—î¡!Àúùê;¹y×®ÚýB±È·½ï}´‹µùyÓ®]lÛ¹³öL÷Я߻·®Ü—ìÞÍ–;j¿×lÛÆ{öaà`­ƒWüÔÖmÛVûÍ;v°c÷î:@òš½{骭+vîäúLûÞð¾÷Q(kïpî]\$_ýЇèâu{÷Ö­³»w³qÇŽ˜ïÙ¶ïÙSGD¼xÏú·m«í³kwìà†Ý»ë8À;öî¥=ôŸ6ìÜÉÖ]»jÄ/¹õ}ï˵sbó®] íÜI¹j„ÁBç]?²—‰X˜3 AËëwS¸n¹¼IÚ®ÚÆº·ìa¾d*HàÚÐ>1-ÖïØÁõ»w׽áÿ”.ß¹“kvíâ«ú'‹ìxßû¨‹µsèŠ]»ØÆ7Æ÷ŽÐºnÚ½›õa|=пm·îÙS'Mxéž= †ù§ñ}Qè?9·¸eï^Ú††jgÓàÎ îÚU# ÊÅ"¯yßûÈ%c½°ù7æ_šî íS{×…ñ=ü¡ÕˆÕ×&ëàª;¹)Ì?Í¿o íÓ^xC¦}=CC¼!iŸno°>^Ú§ù¿Ôúõ˜×­´}éúuÄõ[Húïæ]»¸:ÓÙö­Û½›};vð—À»ÿå_h–¼÷ã˜vé‹jù+`j@_jšÑÒ#i¾nKò=\æœÈÜŸž\¢ì×ä–k"àœ;\í½Ÿ_òáK,ýÌÏü̆÷¼ç=Oÿ ì+‰û!Ï;òUqS¯‰‰Ô w¦N#CV$©¥Ï·¹¼éZ¦n¥ÛÜá39Ï\%7q Uf R®ÀŒ¦Î%£pߊ©§ÈûÀ·Þ[6âê‹Ã/.rS¹8~‹>Ž‘çã¡¿°•šöÁk%rp½Rꃡ|E›Þ ì'+‡ºO‡¶]—3¯S×98îmžù¶CæIf*ô9j1&CÝ'‰:ì3P m#ú»WDé QÚ#€}%fÑ?ÐÁÌè âØJâ"D¹0Ng‰\iYͽÐëàœ7àû4‘(Ûò®Æâ¤20P€\ÙÞ/ëö6ˉ‘Mƒ Žôý¤cÆ]ŸÆ¸®'ˆ^¬ÚˆDñ¦vèŸ5ÏB">5æ“<ª¯xãðÁO[›RN¨ûŽ<<ÖËb 2=£÷Þÿ*b”l’÷V¹sD×»¹Ð§'ˆ„‘î€VÓ~àFøƒG£úS%)Wízàï?ýÓ?½ñç~îçŽs&í£?JÜG«Käi”4ÖY®—£~o^iÒ¸hÿìĽµ­°¾Õ g/Øþ“­ó™2q\}æÒ©Ô€y²íK¹àYÉBZ¶óBò=U›IU\Ò²Óïi]ÊßE9. £ ºúÀ{‹Œ\©Däù9#J¾^5)½²êNYÇ´Òvä©ï‹ôÒž˜u u–2'²•Jæ%©I}(í'•‘¾WZvÊDKßg±”îiÒûŠi“J¯ddJŸ—»õ_#U»ì;4’f-öšïi¿eç}³ý Y]$Û¿û»ùþ¿ü˦{©sî¿?¼sp÷à{mÞû™ìóI¾o~óJt?ðÀÏ×xï‡èÃ`~M~;R>|Ò{ÿæÆ¥~}ÒJ$?ì]nä´K1¥‹EÔÝÓQç©@F´ÙMÖu©;Âç±$Ÿ8íDŸõòô£¼c•λ“¼sÀ˜7¢ÀA»8œZˆͳD£ÎUÛ¶ÕSÓ—„âi¢j‘¢…f§ý_õ‹µoËÚx'0ÛhÃV¦Ôo¤¶ôb0éì lKÕèD(o°W¢¿`ßÏ9û¾‰°-W^IûÀG|4‚m:Y{Ýuž1€Ø tU¬Œ)¢ºVkKÝ¡]û‰±Z0ÜúZ¾óó`—ÍÅQÇèLm>i.ÉK“tVÛˆD¦8êrËê€ou$rë=Š7¾èEœÁÀºÇ «Uçx9z)ñD[‚¬ŸëQg^14æéÁ­qÜG´Y9Iœƒk‰‘‡æ¡ä«áþöUF ‰q "Ü…ñøÌ§£¤g-õÆÖUà ôöôгj§‰*Wê_Ù1HÚ#"Rs¾;Œa[1ÊŠSÎþÓ!-Bmh›2ëaS |àÑØf©Š`W[ŸTRkkëyÀ6 r—ºà|à—UG¹”ªµhóÐQ„ÖBc=îå´7û¬R–X(IG#à›>Ÿ¹ôØÓrR1Ft¥Q‚µÞufˆÉR¤«æ hz Î…‘Ó0zÆÇ`zfçM}¨äëzúNÙw÷™çÈ|Ï‹u>½0õŽ©ý@!¹t&W3WÚgÀt¶ÒÿËÔ»ZmdËAƒß‹¥¥@½$ŒµXÅb¡z!s_ý—^ËÃdþÏÞ_ª=K=Û¬\XTËãý/þ ;²_¼v1¢ äûàg0—þc˜ËÓ×{ï‡û#1%‡‡€Oo]aŸó´Âàí˜ö”sîXr}ŽÚö —RŽ”ôŸo›°¹¤ÿÅá†6‰@D—k‰C­²¾ëû‡jàF›yêQ(]¸›éÂêIލë‘[-bB*Feà†7¾ÚQLžG´“h\¦œå=N4ü]þ~:ÿÏ[ßÊ|xfðw´[Y?þ¦~¾êê"J¤ó­wÕ-®R#æ1.º@f# $‰ÓmÝ€Iއöõ.Dؾy3]½½T0©Â*,8VõÌ~챇¿„¹ ÍårôW¶›w¤Õ¥pOSoD¾“œï7@Tš íh›Ð¬wñ½5÷N¢±¸±ë{âO·T½<«¡Ô¾õ7ßL 3Ú$Æáhv”G6dÆDsP*O V§ Gªlz¦5”Gè§Ó¡L¹é}U¸7±61N¿Q™ }v<”!—y lÎxØÐRål5O/F³"œž&nFƒØaøµP÷ "HÕA•îmØ8Oúh`ÛN”²”‰±ªD:'L­¨o 1öz^¶ .6|ù÷~¯Æ™Vÿ)ØïÜWZWa*eI™Ž¨Ž¦ R‘›"nqÅ+DÉU5¼«"Pkn‹xù7  HêBè‹;¶Áßî‹Ñ{1I‹ÊøÈí²:ôàƒ8"g´„­—Ib±žð>ÝD—©óÀ+‡àÓ§¢Š\VÃgêU€9õáYí)A ÔI vw©¤Ï½ë]´9ŸÍÔG²ß³)UE€åƒ‚Å’¹].ce˜(׃ÜlÛÇÊÇõco{Ûy奟ÊK‰€, ku殹-9ûÝä\(Óƒ¯BÞ·¹•Àí'ªù¥`Tc–÷à*àƒañà}=·<]ãjw# ý?û]¿?úEÿ§óEõ´¹@hWëÕS⦚äÏ‚×f©ñ ²RéEúüJ¸ÙË™+ÙýF̤}ÛÛjûK.s¯QÙuÓ¨ßÓy'‰‹Þy9ïÔˆÐhð³i¹kø™ä½’snI-Lï}SÁÀ² ïý—û쥚Äĸ–Gˆ Hœóp?%¤3~kq+h—€Í,¼ ö„çXlQ§€©…&™£ˆ¸iLŠqsEûF€Á¬žî }1 œ‰œyÎyÌuæçÃsâìC}taÍY 7…÷>ÞOFÇòÐ#Î[Jpô« 9¢{ÙQâN‰ÔоJÅŽÓ@~àãû¬=“¡\Isº¨—ŠùÐöbÃÓ¡}"ÖfˆÄ‹ê—š’Øiîü}êÔùœ~¨.ù½ [' ‚'é‹TŒäŽVùòÀ᳗͛˜L¶sa¡ÆÀPÒ˜è{š² ¸1rt— Èš ï‹–ºHªºÒ¨͸˜@R£¶8 xhÌúëØ©hƒqsÁ'nþL¥¨+é›o~)üë‚]CÙê¾~5<6ÿÿwÖÔPÖàøt0äÖìÐ=Þi€D ï5ÆP}"u!õ냡φö>I$(ŠDU®šÙÿ>â—[@XkèÏÁh5e O¾Cœ‹Ub@®Ö/šß"~&±±WP3liƒCsQ=*%hZÃï1iKW&ª&qÉ…:¤Ž%âG.z¥ªs9ðDxOI}dï3òË~"‹õFÿ)Á,ÉBgò¾©MAö°<ò×ÿmq×÷‚P"7¯8-ecð•äûþ&×SRñŘÄ-U4W,yÍId;Qç<l-ØóÒ—þ¶Œn{0 2‡q£û1y`Ê]¢ÔsäF"÷ 5@’{FxBÜÔ´À»×îÙS¦­X¼ÅV‡L©ÿœÅ8²âžè å¨-’ˆˆ{*®Äô’ˆU“÷#0§6‹ [ ºbÍëòQiÑ£'­ ŒE½å!à…ßõ]ô\}Ô–$£|·òµÿÈl %áéÍÃÃg-ÞÂ?ðÞZ{gËÖ¦¾Ðg'ʦ®³¼h³µó›¯‡+ 1&BŽhp-N»8Ô7\³Äú#IŸ„ñ“„J*[Éùk±¹–¾ã=難ú窱?SÏ:éþäw[26kˆÉ'õKýH­02 E®–«]°>yøÁz…j¢Z—¤)`K ïû³åjêP3D=ïylM,_ éò7½©"³6TKš¥F ~¹Ò‚fÏyb¤î lìÅ!^.a烠Fugos™Ú\¤`9%R¢  èr0X€-põF¸þZ¸öV¸êe¶¼²‡µ¯ÞÈÀ7o§÷›¶Ñ{ëjz®l§kµ£³:º¡½Ë®Bk܇/ ½4nê¬ZŽ@dJT¤*7Y5¼Fý”®!ÍkwíjH4¥lï¡ê¡£6l‚+^ØÎµ¯äÚo]ÃÕߺšËoè`c'¬nµµ§½w1 MvÜRÕ¡ìœhDä¤y³Ï-‡‹¾X[tݸkWm?Ó%æZ'Ñ^¤Q Žf„lúžr“ž_§R¡¥Þ';fêÏÞOçøJÆçybyi)U¢ë’ïM%Ï'K¢±¡8‚mD ¤Î–ªNSÏÈa~ô¥V°&ü//°âhzßß„©ëä‰j>ñ·bÎsSN’¸§©jG*N§¤úôøÝw×TNt_î*«˜:ËÃDOI}'75dçX‘ŸSÄ "×>ôŸ¢þž%‚«´­"¸%õ EŽèk(Ô{¦b¿ûC?å¡\…. ¨QÿùŸ977‡'Æá–¿-ÀªøZÉÀ£6Þs• NV†¿ÛýVº0‚á†uðä°W'!ârÈsâ¨ýwÏW Þñb¸ÿÞèÖôÕ›áG­înŒèzàPœ/ò¢ÃYc+ÏNÈ.ŒÃád¼Î†ç»€/üÆoÔˆZ²Yâf,@p%ÆýžÆ¤DcDÏP’U‰î?åÎ¢Ô =@g‰ÜŸ£e¸>Ÿ©D¨\D–0 ñeâÁšúµ—>{7pEV üH¬›HµÇ÷í«ü›[à‘’8Åørø>C”¤õêý&CÛåfµŸèùHåCôÞ"µmZèš°}¡~Ù4¤})ÃÜ&‘Ѫìf±x“¡$ÑéÉ[té¯×6xõ]jã0€ã#¥hhíCùó¡¾ÿûîäÏÿǧxÍíð÷÷ÀCÃC`«€y—ç0Õ&Ùq|æ^«ïÿý½wò¡|'ÿvÔúçÖV;_²åd¹èò¾Ó—‡ÁvǺí= ݺ†–õWRÜl¢€Þµ0t t¯…|FŸ‚B‘Êp…ù…3ÌŒ—˜ý½ïcêvúNjGÖ@z±úÓ:{ÏìXfó+ ôgçJö~jÛ¦÷YlM]ÂDÂ3zí¥l þër*ðÞÿÑ3iÄÅ”Ä)LE\Zl-QnÒÂy¸j†ÂGˆ†´=¡Œu«aþ¬é"Ëwÿ#S%’ºÔEú1и>Ü9åVÊeêÉjäØKOVÀ]‹y‚·çJVN'Ü„²®ÁôÎÄÁžIêP½õ57óðG¿DU=¡íÒ­O°¤†_˜ 1óÍ—Ãß´vÏtA”ZŒíNa\¯oÆ Š¸Û‡IªDƒnÚ™¤-D.{>”;Ž^mlsÀßüOqãjøè=æ £(vvÑ:5Åë~v'ö®Õ@îBhׯÍ_Þá¯~ðubö'ËVgZLj„¡ RÃé¤þÐU„lOì'Icz–!¸ýÊ—qÏç?_Ñ’Ðôûx´&m*„üý¡ÍâÂË]ñšp¿Ÿ¨¶F’§ ˜©Æy"‚Z’©Þ‰h“Mª6mÔsÙÈM¯¼7¥kL’.Ùˆ (c1pNWê9þ2bÁž‚˜n¿ƒ)oÿ)š6εD®ÿïÿÕ]¡ÎÁPÆ‘mïðúwý7~ë¿Jg.çÀ¾X’$t’„¦Üè”PÈêP7JÏ%0hB²¿S°ÞP­¦e¦ÜX%§šl>uµBO—§»·B{w‰…Ùi¦OŒSÍWÈõµÒÖ2BÁYKÊ'Ÿf~ÿY¦N31\enæ&!Ÿ‡–(•⾞žcü-¦Ü`­—”“J€H~g9Î$÷}æ{–0Kû3í+Í_ºÈ]v=¹Ë¶‘¦–!hñUZ[Gë£Ðyò§ÏW‡i\³í\ijÄEo”–ª{©:R;‚´ÿR[ˆfíhôî‹ÄÙ<ž[nj$…IÛŸî×Ù¶9.l­}ƒ§V Ý9×ê½_±òRªDogysðyÂÜYc^GÔ§žÃ‚w=MâíÀ£ØÆÓ ô÷ÂØ¸1¢ÿõù³ö{ˆÞ|õy®~õ«ùêÇ?^Ó­•ûZGòSÝ‚fR[“Gºóؼ%ÚJä0"Jv ^ãÔÛ”ÆGý$B·=3û¾+àƒûíYE‚V #Í'¹2#{``hˆö\ŽÉáẃQmËׇB †Ë–ºž¥ù†Oâ,+ÍaÜBMÈ2lzžŸ ×ëëû™–ÑØ1GäŒ^A}*‰`ç1°YÅ<­"ªð@´„rfB»çCþ¡o¢šŒÔ#ÊáÝ râÓ¤…Øç¢¢¢±ÓD¨{;Ñ›ÔÛ¼ö…ûäâ´ß4žÁC=»*ô©Œ£¾\‚›»ìÿÕáÿ‘äõ@µ½RK ‰/õ[>ÞaˆèåFÑp¥fuSÜÜkï{ÛuðÐ ˜|û[j‘™o°z'€Íýñݶ9Ñßý-Qz3Žv2B–t¢Ü¿UzĹOÇUý!‚Oÿi,/aÓªUöþØXçƒ$ ªÓ'e èö¶F"äIbÔå &ÁÒØ¥\ÃôÀѼ/‡¾M7}yUqvºßÙí"ôÎ" uØÝL<\d_n߸‘Á-[è&‚Oq£¬)ËMª'JäLë]À̉Æ4(œì dK0T,Öúº‚¹’ÜH”æ]*é²ûaz §ÓŒ½åU§YÝg®4-œ4ך„ •.¤å¦ßs™ë™r|wüäOÖêË–Ÿªå‰}ÖÞÅv(—Û?Ëð“cÝwš£û†9öÕ#œüÜWùÔCLÝû0“>Á™'OrêÄg¦ªŒÌ[Ôó‰LÌY¼†IBD]¢ÑiºVÓö¦„]–#ÝèýÓì÷ÄÞ’ôKZVÚW`ÆÇÕÑ£ø/ß ¿¥äÄyöý³‡žbìÌM׫H5»²õ5z§Fï׈C¿GþBæÍËCßdÛ”ºRͪ‚¥) ¼Øbhu`û[%.ÊËΓFWjÔM’w¹Àÿ"Þ üPø|GøïðSËɼ(a&ç\Ñ9ךù¯Õ9÷Œ˜YιAçÜŸ8ç:ç&s‡œs{Óºœ¥·:çž Ï|Ù9÷úL9;CÞãιïÍÜ»Ã9÷°sn:ÔóC Þí·œsgœsι8ç6&÷ïrÎ}jÉw¡~rW1qe@ÜšO1¼ûÕ­qC&K".ôn!Ôñ™ÿý¿éýº†²‡Â3Wm ú€+z]Í+À™›òp!ޏtîÏ%s`uKT ‚z×õDÉú½;´£—z7{ª_ëcUÒ’T0C|O’uÿøÐC¾÷^ÆC¿¤j,EàÅD€¥5 •¼ÔŽAê[2"%i]6~é!)ûˆ æåáTð7®wžó1vêáébO§Þûn¡¯Z ‘ÞÍ;<Ì‚®¥R´7KÍÀi³2³ ‡­%Åp ©[û{ê®4ëÊs¹DÝR…>—8kT~.Ü,U¡|ü1ü'~¾ô7¦'¥tü~øâû™xàAN<“gÎ÷.ÔÔ/ö>Ù´QЈ0h4o`yõüSè›fíXq°œä°¹˜zQ!Ÿ®·,±¬½<Û7KZi½Ï§óÒjïý¿‹)e€)f\¾œÌË& €ÁÎÉ4½øÇ”Ñ(uaÌóWyï»o^übòÌ›¾›sïþÎ9wsòÌo¯Æ˜ƒïÁâœÛüðû®¸ øçÜ·%yx)p ¦Æ> üƒs‹ ¿ØÁåˆjžh<Ü—‹`Uç ÔŒËÄ h`›®Üa*ß¼<º']\Uˆ†Œ"„Ëw®Š©ñ®6ðrxá”ë#àóðtÙÝ,‘s©²µq¶Á¦$ žHg åÒt:<Óƒ‘±jKJh¨æB½Y”"H(Û(6ò¼ç1px}p ;;U‚Ž„þßœ´eÎéA¨7&uı>\µÿ}«áèG‡™­À­·À@W+‚q_z>v¯åÛ@·™Rôh3’”½%ôí$vMÑéöWˆ„Þ p¦R©-êÑ+csÎ@õx(ë²ð~ò@ä€Á›kRç’·'O”\ ‡ÿׄ²NŒûÐÕÜ-‹«¡Ý“aÜÛ]$ô†K–o(´U‡J•Ÿ`5–1©”¸órCZÀ$4rë{2Üÿ/×Z™Ša‘B1ru«9¬ù#"»ìwÑöEÿÍ`1Ú‰j@ãDB­€ˆ>ù]Jê€8'õÿ£Ä5'‰ÌIâüQs)¤±œ™‚ј®ZÿÏb{Ëõ^Ñ 9@Ë©¬?`B{¥<|é³!«^“%JVJØdó¨\%ÍŸ,w¾R†…y‡ãg­_§Êæ€azÁ3>Yf¶š'¿~¾+V³qkÕ«!W°õ:Œyó†7ámë’ËÒ,ÐM ƒF\Þ”hÊ^8Ⱥ ^]*Û×Ù¼"Ld›7åáôÙY>xŠƒÿðEžþ½?àÔ~“Ñ?ùM†ÿúŸ8ø/Opô±†Ça|¾ž ÉŽÁb×r$ ƒlZμ¸P ¿X¾ÅÞ«Q#F¼ .$Wj³œ:–" »IÒ²ýz‰ûsë½÷â‚•Ë2W[ ap#ðÅÌ÷``ú‚“÷þ÷þç½÷‡Âï˜ÍÂÉcÿøïýãÞÒ_÷?œ).Ë4#žðÞÿŽ÷¾ì½ÿl(ÿÇœsmá™·{ïyï'·`L¼ÛÕL–±þÒ(­ÒíO9y,8D.ãjŒƒ/ܶº¶Ù®Ç™ô¯+ÀïÖ€¡ŽýåX¦’â$TóÐÕÖÆå"'›.¢ Î Ô+š¸À«ˆÄ’‡ <ëýåƒ~2´Q±ôœt«åµIÀKÉS¯"U õKåFh¤».uRSé y‡\<4/Ûâ‰óûºŸø ³¥hi¡’ÏÓ ¼{Õ*ò¡ÏÔWÛZl\ Z9`k«4/´21 -­0?—­] èàºuÆmÇ© Œ‘ak.¼ãƤŸ'Âó-@gºVG€¤>’]CJDÉàµ8^…r‹½ƒìOz€ïùµ_ƒP×ð ´‹´å㸈x•.±ˆ[¬c¨ïgC¾^ ƒÍllD¯¯ùÔnǦY¢ÛOA)ñ!ýý"0í"¤¹õW_«mZƒ×Õ¬zò‘‘ÔcUR.zÅåöL/¶^Á$;Úh”¿î{båW}óËkR"h\æO\ãZG󘇢¥ŒÁ.¦tjŽžá1S]™ÂÖê¶WjœmÊÍœÒrÔ!–“Òr ؼí Ú™5$§l›ý^ν§ÄA(—`nÎNÀÓ0¾Pÿd¦ ÝoØÊЋ6rÍ E6o0i¼ocŒ– ¢ú›ìyÜ¥¤=id‰‚4à™3¢©3 õwKr53îVŸÔÞ3¼Ç‰QøÚ£ðµ¿~˜ƒïþž~×Osú—~š#ôa¾ö‘Ó||†á 6¥÷kDød €Fœ÷gJ, x¬ðÙå>߈(ÈJP ŽeêFZ‘äg¨·#“·µX›²Ï§DcVŠv‰Ò¯¿/æyøüc ³/™VBT9ßkžÎ·g;½sŸ¦l=yꉒǤ÷oK"¾Ý„iz“,€©u·§ÏxïG0­››Ãï?ñÞ¿r©F‰ lÒ*€ئªæÿsý¤söüfàÎw¼µ†1°Þ‰÷7lª«<‘ƒê1°‘0™å OAenŽýÇ#/ýv¹wœß–àµïy„²t0€Ì‘ÑYê‰P¾TF WX½ÀÈ<1B¯Úžnè)è ñ ‘»Ó„ß]—m­ ò²T&󱜔ãü*§ý×énÞµ‹u7ÜP‹B«CEö ûJ ¥Šå0@°u+tvÃêŽÊÓpûPš„ò4\} Œ Ãßsk0ú ¯´I&Ï+ ÄËÙþìN•ákÇ#˜ì œ ®• cw8ü×Êž/E0°&|þÙ›ßŒÃæMxÝÞ½ìh‰vmXWÈÕ8´ÒUkéßËU®u{mÐzÃóVÏDÂPeH¢SÆæ¼\ÖJ‚¡9ý–» ÌÕ«ZYoÏ)òø†¤-Z+² yŒHÈŒVàò;ïäÊW¼¢v9áûçF®ýY¢Nر}{ ò!‘øøä¿}¶&E[E<Ĥªäˆ„¸ˆù”óUÅTÖÔžK!½à®»p¡£$A×Wv&ÍÀC3àßÜ,•–«nT¥ž³œ•L4;ˆƒ¥€Ñm»w×òf%Uêß±¦Š9Ó&5¨„‡Ô>íså9üä ò3§hÉ•ÈÀ¹ÌÓ¾O¯4°™|9Ó–,LeRÍlI>u^ З’²S¨ý¥ÜúEuHý/e,͇w®šÍĹÙ§''™à؉ NÎ11We¦ì)…‚R€“öqÚïËåp/u¿Ñs‹ÍÁÿÃÞ{‡IvÝuÞŸ[U]ãL§ÉI3#²,ɲ¤±,lGÁ.{× KÚeyw_^Û˜×Æ ³Àš%ú]À  &Ù2–“¬h…ÑŒ43’Ïgö •C<®jn&—s²Äèjh ±­­ìÖœê˕oЕ--»º(á¤ÛE iõj¢l¶üàìì»›,ðµßø ²Yú69Ó´,èo¤½«‹i¼snS}[¶”%:›6‘íèàüvtv²õ’-¬Àº•;vÐÞÒ·ÜBWg#}}¬ÜdfpmÀ†ë¯'—Ï—í¶W¯[Giýzq!\ã|žukiñ×€-Û¶1°j ¸ ÐØÞÎàõ×—µ(SÀª«¯æ+Ë&Jã+WÒyÍ5<õçÎ »\ˆÎ•¯|%î™…Î5k¸lÇŽ2à-›o»|ñYˆ§€Á-\ÿo·ð­™ÝÊ IDAT§`Õx3—ü`+½ß÷z¶n‡ÌC×^¹ƒÃÓk¹y¬ËBWG×¾c'C8`{°éºëhëu®²Ý@_o/m×^KŒßÕ7ÝD¡£ƒ ¸ÍºnÍÖ\vYÙ×ä°uçN®»þúr¶Â‰M›èÚ´‰n¿–³ù<ëo¾™=ï}/{f|Ø×mÛ(ö­ât¡ä4Imm ^{­3;ֵõ—]F{OOÙw¦³»›®K/¥gÌ8 t_q­­eI`¾·—s6°3‰Z}Åd˜Þ¼©õ4 ”ÁV!—£ûvŠÀ¯ªÀÐ40@ÜÕUÎöÜÒØHãºue Ö ÐØÒÂ^âÙÜLwooùÅÕ L>̱={Ê{àšÞ&ºÛÚØŽ½ ;;ÉDQ9Çx>Oä÷ãºUƒ.L>O#pÛ:wMO•MŠÝH$H‘½:.Í™s¿^fGp¢‡qØo²|ÊðîÝemaH ÂïI .T’‚jظ¦]þ?_ÑþãCКþI`\­¾ZDbh×®TC)åï>QÞ4LŒÂÜl¥DU|˜š™ xêœ=BT˜)×/bÎ}è”ïsÁ±¤P´IË+É¿H‚Þó!éH# ÀÙ]»*æª GÐ¥¡‰Á¦=8›GàÔt¥Ï„„^Iøjï°Ô¼õ|4GóÚj{>Åǃ¹‰80§õ;­ÌÚE  ’4&‰a=ä`1%mþ–))ç¸%ø´Çqüªzó‘-„¼øÕ(Š>EѯDQôyœºâ½ émEoóÄãÞÑ7tòý%àÇÛâ8>\öqà÷¿Ä™Þ¾ø3œo¾2†PQQxu‚¿]5ΩY.¹ä’p“ùŠ;yë;ÞQ¾A²À÷ÿê¯ÒÒÕÅ$°ØöÖ·2ðÖ;9€{P]ÒÛÉ¿ökѾ¾ím¬¾õÖ²IIËš5¼ñ¿ÿ·òFσo;ÝÛ¶± @ÎmÙµwÝÅJ,ŠÌ•o{+ûûY‹Ww_v¯òR9ßúC?D©¹¹l–Òwùå ^~9ÀðÐQS—½á e“ã@óÚËi[·ÎB-vt°úúë+ˆmºì2:{z(áƒ]]Ì^²•\Æ oÛ6¢–vÝ?ã34÷ôнÊêHJÜ·y3Ù¬› ¡§‡ÖînÆüœ7e³”úW0y©kW­Î´nˆr9ZW®,›"Å@¾£ƒuù|ù%Дϓmk#S(+•èÅŠÙ¬“Ä!ŸÏÓÔÜ\a•mkãt‘¦ pp(Ï“7²åßÜž|¦U tt¶±þ_¿ŽÞWoá ««‘õ}9Ñ"\ÚšáÈ‘:qdrhmj¢%—cMä’oÍård[Z˜ÁÙá€æ¶6rÙ,»qÄ`*Ÿ‡–", L¾»›Ç÷ìá1¼snK í­­q´)“a ¯“ÓÓŒÅnnÖuu‘om-?¸‹ùoڶ檫xÕÏþ¬f“<ðßÿ~úׯ?OUûr.…ý±q3¬^Íy“l× ’Ñz€A²þz%À8¡»Àqè©fkŸF$Òúuäá‡Ï3µ‰ãÔï2W.Âé9÷ü’¶± ·e82ûŸ„'‚'vÁ#pnî|`—¦•H·($ÉAH*4g3h×÷¤³r²„µYàèÃûyli„ÛàÊë`ó gVÙJeä>õSíË.ÍT¦ðN–ÅHþká…æ´}¦ÏᇮëšùA­¶µzç$‹ë½ë)iÄ&9ŽpŸ¥·—{‰ãø@ð9è} ˆ¢èÖz®â¸þ)‹¢hή#pg÷ÿô"ú¬7~ç<üÚ0ãrk¾Çñûç9ïýÀq_üöëÀåq¿Îûœ~8Žã¿óÇ•'ë5qc¾¾¼ï}ï[ýáøÈãÃÃQ¿]n=¸Àõ¿$ª3˜¹Í –mUÒ3IDCÇÑF`çvøâ>“F^Ž…CÅ·Õ‚2S)àÓ„¯_ɤæpöè²c'C0ÐÏÍŸ¥ tàìÂàÍ[à Ï»~ôúãz0«8h+”lµã€¤æS¶ï3Á9šïVLÝ£kÂ0²X"°1,$©hÝ1ÿxÂ$XŠÞ#3š­¾þS˜?Ã:,âTìϽ¶fšà{÷€®ÕÄüoþúæŸaû*èÜ6Èáoçø˜kûLr%7ã˜-½"DÉ1X/Ci>4ò höc[ƒ#p"¨}¾ÞIãðçç€ÿþSÍüñM±.C;_ŽðÚS ¥© ÒG}ÚýZj B‰ÞZŒÄ¬ÍÁ±‚Û›{ýu[ø"kõs()_ætÚ…eŒ±èÂÝÀ˜#¶2«?¹È%µ‹q{R ë´ouÿõøºdc bK~'?™š…{W>`ÎÉàD8Ïúþta$[y ŠÁµ2µÓÞœ~xï{ß»æCú‚½¬Šž£Ó 7í€ãðÀ^š4¿‚ùL€j™D„¿×[ª™k$?! ŸE!ˆ¹K“¦—8_"¶¯:BŸ® „ÏÌ$ÙP`ˆdŸ•'Dvp÷–rÔˆDWÈÉñ‡cM’–Ðt%|?êܘJ­Dœ¸FZ™©† Ý/]mpë`M¼ð¼ø-gJ:’¨3 0õQôL˜ÂŸÞoÕü æ+ÕΩ˜ç# ©3MÛ´XМv$MèDšµ§:OáÚ'ï…°¾$™ ¯ ï¸ìG~„ÿð§ú²~–FQ”¾ÅÂéú]¼onÇŸªvýB4ÄqütÇÿ9Žã7ù¿KA rÀ§W;ÓHAE}QmñaKWDQô«¸wø¯×Ñħ€íQý´¯ºgõ[~LÓ8§ŒFQ´6Š¢\”¢=õ‚d‘m?œÏ\E ¤Ús ÕCG¾n h–0‡Ô•XÁ_ûÀ>S{và€—®/b¡;§ü…ÿÂà ŸT- MQ¥‰®k.¹ãŽòK+ïû»oÎþà–´E7¡†Éì© ø»çÍ9é0¶4¼.ùB•ó³êiÁ[9‡^›¯”tøzeo.àÜŽ½PÏùz:½=}!¨`ï†WrÓ¦õå^zÏú¶øz[0GÛÓ~nåÜ <>m%ˆÿfˆc¢«ßN>†ç†àÙ‡“kvu á* ÷I{9‹ÀIŠ–Áâˆ+±›¢µ4d]væVx†©Xú—­M¤ §AøøïMqf &ßtCÀ›»]Ý-8P.ŸŽ<Лws­DzÒ €‘ʸ ÖàDÁÕù¤?>œ¯ähá‹X€Zç Œƒ…ëÅ·¿ÖÏAF¤åï]þ¡…^=›6Ñé5_í¸ý ŒÄøz&Û®°è]!9˜ø¾[ZË$IûZë(³¾gqOé.,Á`~7 ÆJ¹ÚüZ,—22°…GŸ‡½G`l¶zB³j% @/DR™úÒ$­Õ¤âÉÿ“¤`¡ lå¶mí…} %ù¡_€Ìgt_…9?B“-…>‹{öÔŠ(£¶—ô;HFó K(¹¡gצø´::ý¼€‰xa?x 3ÐÖm æsP«ß"BaBÓµ´¹O®A=’øzöTÚµióQKN+ŸÖFZ?ê)iÄ8IC¡^(¸Kö5íúZ{F%͇§Ö|VÛC/ãò'Àçp<É>„»åõÕ² bEÑÍQýÿQ}ÁÿmE·,¦×A¹ø78³så)¢(4ãYüNp¨÷ëÍqŸW[¢x¢ñFà'qãSÀÏÇqü·Áiÿ ø.ÜùQzËb”ܠг®¿€ÓzÌñ4 q8… ‡ãggš!˜ÈØ^ÚI.• Y° &ýþö—þ/œqRå‹°)vç)¹¸D ´vw—Ç3‹³ãÚ„Ùn‚=$%éQ(OÕ•ÇÀ£æà@mOpž—ÂHÒŽè¦.qÆæÍOÏÚX#,jÆ„Ÿ§F`.rüÿDÈø597ç^†0 ¦ÏcàŠ~6ú>¬Â$næJJUhô@4rýÜ€Û<§·\ ™Jïx>¶Ž>L[tÆ>²FÁÐàÆØÜåêí¯ïÏMXŽ…üákéóß·ã^à›»!y›Ù¹"3À;®vRxÍlÎÙýNTF{Z•smMmcî–»ØHÙÜ~ös1;ëÈÄnNEjeº ®òK„$OOZ ½„×øß{ý÷ÿ=òã µQ³~í®Å^Ø,Áž¤£,ªQί‡ÂŸ*ÂQ hë줽½8@t Ѧ®|·Ýꇈo ¸ï~'н·‹<&r¡=,]ìçQ®b?våF˜À’ .‡Òuû›Ø}ž‚ñBmgã°Ô+KQêr!¨FÒˆA-€ŽcÛw¦’•$à•F@¤@Ä@ûOuK1ê?@Oö!Y’„$ô ¨tKœO&fƒkUÒÌF’óºùÎ;Ëï–é98v퇉i—Á¸!kÚ$‰KšAi~Âþ¤‘4böR–4éù|%.¿óÎó~[lÛáÿµú‘¦A¨vM=cI#Háï %Ë ¼XÇñÚðLß«–º‰AE?üƒÿ÷Õþoøàbz­ÇñWã8ÎÄqÜÇq{ðéÎy2ŽãKýï+â8~[Çu«€|×ú66Åqü»‰ã³^²Ò·ñ–…ÔŸVô ‰0 ¢$9ÿý~3‹c-Ú¸÷c`4ÆIØOayJ¦Z–‚´6ðºŸÿù²“q·?g'µ|Þ÷u¿?÷(æÌ…ïÛÓþçäpÙ'½<Œegx×u’¬‹(衤W1•I¤¾)áP]MA=YÿÿhÉ9djnûpæ=‘Í×Õk­o±ûm<6s¡!,¹Ö!?7Z‹s{öð¥Ï=Âhä^Ò0(1X«gfÆ÷#6sŸ)ÞSOÁ#gáƒë¸÷K;øæ|™xf20Y€§Ï@W^Ñç&óµ¿ýÎá3f·›éÎc80¹:‚û>óxYá°{‡a"¶p¹mÀï=›Z]ßJÀÑ‚ûÞŒ‹(% ÿBÁ]7Ø »ï¹‡) %²uØ\ÕWf`eäæâ[ÀŽæÊ½+Ò$38íõ¹à¯^¤ Mš æUÌGq ~ÜŸ?\>hZ˜¾]˜ÉQÓž ëÓîûÓîçDÑÂr´8ôÄ =ý4ÏcûpŸ¯ó-o¾„È_;Žþë°ýÙèÏUî ð‚G!ãT†øÂ´/fÒªt`D#e'ý>aY.åkŸøD9‹|5Gã´’&Ñ _ŒtN4ª„$¸LžöOÏÍdÛ_ûøÇS¯SIÚv ,‡¶ü %9ŽiB»}TwÚ¸Ó€_XÒÆœ$JiæTÉõ‘ä9ÔÒ…Úõó¡¼b^ϧŠpèƒSs•cM3ãJ:V8Ÿè,ÔtHsu¡%)QOÓXTëÓ—üÜ„uÍG ÃõÍCÉxm5²ÎY™MëwZ’Ä0ԮϷI â2)Ù8ŽÏ.öâ…h ~xcÇ?™à>\±ØÆ_Ž%ùÔ’ÀìˆE( Â}Møêöç ~ðÚêÏÑ3LþÊÇòýP"1IGVà˜Ô8Æ9nÎàˆÊðÎW9MA'fö¡q´ãÙu˜„)òmw` Hí*ªÑJ?ŽÁqa.oÆl´“uNúk[pR­6|8›-ò/ZNûiÀr(Ô«ê?Lelî[·ÿ€Óê¨ÿ²‡×‹5ÂÀ§Öø°¯G¸¦p¤êôW¿ÂW?úQž›k̤é@Nœ„çFáÏ~äéÖFpzÜÍ“ÂW¶gb“²ú~+¡RäÏ]ãçe L¸èF=þš.?_…Ø"÷Äø$dSnn6ÇüâŽàéÁIx¶y¯YjŽO¹½ã$ÞÊ SýÞ¬Ÿ€üLš^Ài2. nšœŸçrÖâãf{ÿðšvÓ„€ ™ä)ܬ’1 èiÙ‰Ùòp"ë ð¹/˜¿åR$åNFúY9X*)îBæ=l3 ôÖú¤£$9P© “×JH" & ¸œmÏaf…!(NÁiã ÛK¯ö©EªÛð‹Ðä(¬CËᛂ£“Î;|ÞWÓè$É@!q~°]L¹V­ù­·ÝZÒó(å¼4éZ_ªƒj{‰*¿%ûþÕWÛ7µîýÅ ¾ K2Ç—ÊOÖsñBˆÁš›û9–WîšEâð»$ÝR*[o+–üC`T7\ À)Ö¹Ì0qNží‘sÎ µ=8op9ËJ‚û•¢%ÁêÁX½Eqî‹!8Ŷollä×pßG0©«ü(”¬ë)l3É:s®/%Ü~‘ ·÷ ¸ìŽÔÉ9Z~1"šN#ºÁïÆµ4XMÀÓ±i)÷Ÿ ÎàžqËÍÀ÷î°õ—LÖ÷_`@@ì^<d¢¨LªîÁrSh¿JûÖlèÊÚ7t™éXG6JÀe7ßÌó¾ŸÝØËuŸÐ°)[‹ˆ²¤qÒæõb9*”ôiõ2zÊÖ’¤Ãü ( (,D%Ë|ý¨fnRkLõHLÃß«rÚïjGÀMAšÎ¤éJ5©5М$aŸ«¢jD¤=¬' (&AiH‚$L M‚tnIK¶aŸªí·je)€hµý–4²Q8VÓö¤iÒÎO[7í­¤é\Ú>_ˆ.mìáú%÷j­{4M+õr,‰ýáïVÏõ !‡¢(Jf9¾gYp±`D@ß5¹¥à¯¤—Ê+[gi"0”Xf Y “ƒÇŸ6PÝ‹™)˜Ù ¬lq׫¾3¸tÎYpâh,ãîiœ„;‹e+žÞôÑc‘ƒd#-¿‰fR¢qLàˆE•Q‰ô° ¥ï`RïRP‡O˜\ë¶µ¦Xᯠúñ†–%I~{ÈˉYYxK˜ãô$NÂ_>°ÿa®xÝëèß¾½Å¢ xî ;wgÚñ"Дo xÞæûÞ¹9?‡Ï#“Ð9²r}?|ã°3éÙäçï!¾ÌRf²fN#’4ÓúŒF•{b¦¥8áû² ·¿DFJ¸ÈÎ;ßùãeËœ¯ë•ï|'OÜ>‘cu6gÅ&Mïñó؉E†’¤_š½@†q„ORq­ëqŒÆ~ ÊÝãLìç_÷•¥]›þñi#³~|ݾÝ}ŒE3Q>‚xÅ[ßÊ–;ØÐmi±F|›ç€C§bоÎéQW¿œìõÒ9úo”ÛÆ^ª1ŽÁ9ãÕ®_ˆê×€¿‰¢èÃ@.Š¢·ïþ¿ÅvþåX’ÀVà-,Ò ÌçÉ^_æF’$Î×màÑ'ÊYcŸóöÚà~Í8`5›·\ɹ§ž*K„J8ðð»^öÓí8S¤=˜Gð…÷¼°°‰[ûàÙ“®Ž¤4E oÒ÷¡“°ËÏ@™‚óÀ«o¹‰ý÷?XÎGp H%ÙÕͼÒûú‹î¼aŒ˜H«°3÷Ÿð1­}ßç|Nø1õû9>K%éÀ£nà“—Þȱ’E’ÑùEßÇíþïГqêê³XÆß&`$¶µ`Î ~Ážr¤duF"Ÿ†‘#…¢#=m{éÙ{ŠÃP,ù¾b·n'±Pr’8?i¦dv6†I¿ÿè×ÿw™0 P<ôž÷TìÍ1\£ë0Ý€I¯ný“n.ÃEã¾_Jâc¤VóØ…g‘‚•¦4YÜ8‡ƒv´X~$àöïxëc—dP¤[íüÆ4»ï¹‡¹R‰07l»å+“Á| ¤U{øZl±àåÛ€#ÚÒ∅46CÀñb¥ùŸîue Ïãú0Ee¨Óe¤0à™¿ÿûó~ µ±ÕJòxšdy±% 0×S¯ˆ}ò¼4à^«mµµïsŸK51 œ¯½%öó¤jæ%a?CS¥¸ÊyêK18®±d¨¬«Z{I©uXÂv÷~îsój—’×ÌWjIß³—æ[ã…ô¥Ö±äÚïñ{Fí„{¤Ú.IÚö'É\²ÿZßjëT€«ý4ýÇLv—ѶÈ}ïðõçýïGJfÖ¥œж“Å«C¾_“~ÁÖcÒ79É}Ÿ ˜Ë1àŽÿñoËD¡=‚ü¬9Hïès u (ì=ÅQ?çZ7Ô"ÐÑß7h@ûæ²ï¦;ÊF¤8´4[}q0‡ç€[šÜX”b¶äú4#/íXLÿæ™Jó¦°¾Á€±^*2©’ý~Œ‹â•*ç9*M£JXìq0Ó‘h­e¿?ÿ8pI§sLVèÔ¬‹4EÇ1Pžú7Ò27Çõ™Š±ð¸ºo敇@Ú¹3þxK0Ÿ}þûN›·ªµ©ì$­…¤›ò³XïÇ"?‰Î_D&EÚÏË¡œ|þùEº¥’æ.$Û­õ©&‰®·œÞ¿¿ü=Íÿ Ù“}¨·?ÕÖ¢žñÎç·PÍ|EB•4÷8Q×éýû«Ž/m\ikRm­j­ÑB÷Ùb>iíÌ·oBbufÿþªÎ»¥”kÓæ šÆ¥Ú>ƒóç°ž2ßÞ›ïºjÀ?ìÓr qß—öÁbÎÇñת]¿¨D›qïµÏïîˆãø7. ï/Ë&H)R¹¡Û±‡Z<ã×JuÀ$‘œÔVæ/ò?P‚*9FÊ4)vÅèÈ| ¼ $5û+Kµ:pRPE·‘4YþYÐÙŠÅ_W=Š2$À¤þÉô¢ xçO¯£§5кÇqGQNúúdNSò×å|]Lòy˜¾Qò&EýæÌ-ÍÀU9WŸ"A=W†6,FýOÿågÊc—c«ÚDÞô»$ÚJ–Ö‹eÑTE¦ßúþ˜}þ÷ƒ3p¶—\ Ïfà¾ãn®×âL•¦0À©p¶à'îÿ*Ócðùã癳FDµOv?ýtYú]Ät M@ßäû)Ð~|Ú­ï¦9Å™Än]:Ž×»&aóÍ[=e©æ4­®jçkÃ\¡4?éS’œÔŠÌTmnó©5öZm@º‰Á1ª{¹–(жFQ´3Š¢ÛüçÕÀ~ý_ëÚºˆAE K¸ø`oE¹À¾¿,Kxã…Œ<¹ÚÌ"¥àZ-J(%9 ìh³¨+ŠŠò¡þ’·_Û ¯{ Y»1¦êS.„Aû-˜v`ˆÊK3ÀuwÝE¸¦Ù=Fq êtP‡Ì/ôÐQù&=Ímÿé÷Ù’©|èw`}¼K8&sžÐ]~2µˆp ùm°µ îr¿ÝØáÎëž/8· 愈5‘—Leæþú÷X½uk9l«$ÔÿŸòspó`¥ÊUºY,ÙU›¿FÚ‹°aæbèn…çöBoÉ¢8âäå+@מɫà3·¼šKIŒF Çb,²œŸÇRdÑyNøkŸÅÌ‹.ý‰ŸàYÿ[ŒEÒ^ˆ|=Ã@SÁ}¿ôúëÙ˜7©º4>«}¿¤)èöõÉ\îÌ10ܧ'±L¬"½MØ>é[ÛA?×`þ.Û1-Z 3qŠp޼ºÏníUôoÜØ‹S„¦„Û#§p{æ¾c® ÍØ_+Ý£òk.Ä1 IDAT’ãy+pËJè.9ó¶ .¢Q g²wÛöÊu+ùkEhöõ‹Ä-—²îºë*^ò‹ÒÉëô{ø—*ÿ‡e¡à/l? RæG=`Í7¦^¯gP&å8Ü.„¤•ù€Ü|u…ߣÄwY™F†¤ ¼>|—®NÌK=}_(˜¯Þ´v–ºTÓÕjÝ7¦^SkŒá¹iD žRm½Zêûói –¢ßM%Š¢Oà ÚW€ûüç˸Wšþ¯Zæ%Q½øY\˜£ö8Žpøå§€Ÿ‰¢èÍÐÿ—] Yx6å¸$‹ºáÂÍ­Pì\ày@=qÎ+[>øªà÷Ÿäë_ü2‡Š–$­ˆû¾3í9‚勹¿”z÷øúÇGG)NUƶVÈOIþEX4®#83 |þú×ñdɤÇàjÇÙÕËLDà߇÷/GfRΙr(Y•¾9¹iûÿ4f¸£~|û±ôöX }™ ÍÏ?t˜™³g¹ g¦"{—Nß÷^àžã–1SÒ}½Èƃ>k¼cþ¼‡Ox`9é€mèkwwòU[8?­$Az-`™$imè3pÕUåkJ)×&MnBÿ†ÅÌ_xmòSKÚž6ÞP€’\¤¶ I æÄýW]U—ÙÏ|·ÖX’çÍH¢ë)õìÕ°m}×ܤ™FÕ"iu.t<:ÕHv=ÇçÛ›/óòÃÀåØm¤Ï¦ˆ«ZêÑüðsqÿAÇSqOÅqüÀ»ÿ°ø¾¿¼Ê ö‚‡óí÷º’ÎX¡ã¨Ì+d¦"Û{mh…7UÝ2™'¥Â:4ùdp`Kô7n¶pGqàG!ÝÀ®ÍÝðü?ýS¹Ýœ_Ħœi|›0›zõs.ºÍ#3Ô$õ/à$ï ‘* óÚÈð46™#¶4 ŠN$ó'ÕûœŸ»¼ûÌ×)?IÙ%žæ?W_?p€³§OóŒŸåbÈSýigþÔ؞Üc%iÏâŽ+šŽL’¦€Ó±Óå€ÒÊV_yÖ“™’Ãi¸Œq@zÿãx‡ó1¼z³eÏíó}?î ASSTÖ’ˆ¸žÃ™è´5ÃÐCÑÞàH†üRNã£\Eö2qèV´»º7åÍæIß—ÌQü6` ¾ˆù¦äýqäV_çY?Æý~λ0§àÓTú¡œÆí‰Óþø¦¨2dp«o`êðnŽV®²™¢'å}?‡½ZC9<4Vi…ÀÝÿºoóÀW‹FÛ:]ýŒ¹:f n­ú#[³9 Ÿ±ü "¯XF:ð‡?õ©E_[MJY ,(T[’¤Ô=øS¯tkû¢Ûãþ<‘®»ܵûFÝ\MáöØzy™ˆa$cŽÝ%óñþæ2y›©\È |>0›öÛBÛªeÚþ_„7Ù—Zm&Aò{¨!Hs­×,¤ U‹T+I€Zm=¤ÖGÚÄj¹’ë! µŽÕ³fõ¬ÕR’ƒÅ€^ÍerÞ#e¯5¯ÕŽ'Ë|óR­ŽùÖn¡ý\å£U~ÿp=×C :â8>•vÀÿÞ‘vl¹mºPs  "Ó„‹Náã›cêSIÐçp¦%ªc­¯cšü>†›Yœ9C7œäsЈ™Kœõuæ}=rìÔù›ÛaCÙn{ë¥-å¨82ÏѸT§²ÿùWì.Çf%Óµcjï¼ïËŒïãPPß,`þí3Î¥~Ðg5›Ö7Gôd\›}XÂ5剶å+,”«æLù”å¹ G:Zéëë,›(ýÀÜnðõÊVýž}®îW®·µ$[~ª(¾àÏ9™Òd1r7 Dë^¤ Ñþâ á"Ð‡Ž¬ûþè(lºu'?ÿÊò7õ:Ó$‘ i¡Îù9nzZ¡wëVnm¶äsEà¦hmu×Èùù8 K{¡¿Ýk®Ùü*º|“À¥~~Û¨4qó­@¹¢C­Áikäœü?4B7å?“XD¤Nß¿•ÁüŸÆ²ÕTfe–d¾hki¡'Ÿ/ïi7t^³ïè¨?Ö™qçíÅr„|ö·G»p¥é“àOTj šqÉ_†u h*¹û±‡Ê rêïeù–ùÌ RÒÂR·ù€H= \ý©FH9–v3¢zÎ_N%ŽãWùýcõ\_1˜ïœº#½Ü‹@UrÁ9" 2!Ú¼n-?3|¢,i8’„T×½Üqé*:±¤Ž+sî&U”"`½ã½w—µcÓþX®ºƒööÃwß]6Ezfï$E,± ÕV·¹kÑH’aE”™Á4’ꊠDþøZÌ\d{9òíµã× °ý¿¾—,pËZØ?S,¹s´üÎ`>±q…aD§p@MÙ1OW¿ò*úúÖ²Ò÷é‹[D&ùE(3nØw®jiaÛvðe£ÈI +Û˜ÉÐèÛ€•¦¦'Ÿ)›d xŸõýkÇ$È«0Ðyj²E3 Ê}íkåŸ× ”íøŸò‘Ô¹¬Öç´’l¿ })4K]Ô×7}äü1J –ŠdÍW×|s¼P°\JE—FQt_EcÕœÕ*õäÍiŒ¢èƒÕÚÇpì²/’pŸ&ˆ0ˆ44àÀÓ¾^䗻ʠ¼€Eð׃꡽.4Šn¤Kp„á(ðúnøÚ°™_¨ÊòáO”¸§ý÷,“å$ð÷‰gƒ8àªã @ã9X™…E×n7æ0©è8þ\Ùüwó4ˆÅýŸÆ™i<ç¯@•|ðõ~Ø%Œr’åYL"«¸õ’´g‚c"Sš½X$¦ƒpè¸ûŸûü=LmÞdjuó3¸&‚}±ë×à™ÉIâ}®m9 bڀ͙ˆ=% Úåû·X[,ñ˜ïg3>A]?2²ÓêçL`s…ŸÏ+3ð­’Û2Ë*œ8ÍRµÓ·£}ÜŸ…Ù"þÂgy|ÊÌò²þ<·É /Ó8’p’ó£pp{Iõ7àöŒ±~ì5ðЗ)‡«pùVÇîþÅŸÿùí~Ïáö‚̘–Cyàw~§ê±¥”ÚÖª7«ó £ý¬³Ÿï»®×{ã¡O|¢ÜÞB®—8|ÁüÀ,­a;Éÿë%Y`¤% ÂëéWòøŸøDê9ißZâÄßjmÌWªiJ^ª=­6¾š27ÿR%I€ Þ“÷Ô|ûc—ßÇ&¼÷úYP©‡<ÜZåX<°ÐF_®Eæ rpmÁÅš×ê´øï¡iϦm)A˜ùT¿+ÂÍJ_Ç^Lrzï°ûÞ‚¦J&v'amIJIà¿ì„?|& vޤ»²ã–¹S/líÆ@’²Ü*K뤗\7㤛b‹£ˆŽ@^rRN¢¿ÝTF=Šp;\Î¥C%g6´kV·Ã©qKjVÀü!&s5ŽÌÈñUó«¨Dk;àÙãðöðÙ§a¼èÎý·áÓ͉Z/° Yx¦èÖfé¨É¯ÏˆÿtãÈÄ®B±¬šÃ‚€a¿Ð3¾Î¶L(W˜Z‘%é"—àÚ6x|¢Ø­Ç‰YÓèÌø>½0i¾+y,™–¤q³ÀµÀÓT‚]Õ!rÖ\²v±ìÊ“˜ù×9¿^ª#ƒó•y#h‘¿ææ›q#sY\®„#;.ûiV´sìÄx´Ksr(è¯H`èŒÜ|fb*º5ž²¨Tí~½Úq{²hÍÂXÑÕq8ˆ™…IóWÚ›\D¬3þz •Yà/;ÂÛä¯ï†cÓš\åç^𣠿³œˆÁø©S©Ò¦ }Ù/¨‡çÕCÒ®¯ÕfÚXôhršãCC&ªÕÚN`ÒW“Š×*I3¤ùÚ«v}xLQ¼”kF¥–”?$`!`ªÚŸZ¿Õ[–’\hê©+œ§±ÄÜüK—ä¾^ÈÜ„×VÛ·Ëœ¨\¼&Žã™yÏL)óšÅq|[ǯ©ò¹-Žã×,¦á—cÑ]àMf;E*¥ÖÓÁ52Í ¢ŸóoÕ)3ˆãþwùÈ쨄……,à@ºT°Ê`Ÿýš#ÒÈ䨈lÔÑÜÒâ@ÞSèS¿å`;Œ…È%Ń16`‰œÄ¼Ë×»î‹9—¹6ô/˜ÆªõóÓ³¡•FàØ¸ÙÎOùò eiüDkžBI´æèÀ˜^ŸÚò ¬o…:h~ Zƒ,p¶hNq/b@»3÷ ß–H–´&" ³©6MÁü ­7V™ÖȾ_óÛŒ%˽;Ö“]Ÿ¶6™¹Ï¿y{˜³¸ÆÝŽ‹¥õÉù~ì÷ýèÅÆ¨º‚ßž8â~SèWId*¤uü¼œÂöt˜uù‡ßñ½ä0ç^ùf¬æ ¦1Êøu×÷ àÅãÜüæ×²­½½œ›BQ‚äëÒƒà9àdìrGÌùóÎ`dnΟnÞeÊ6Utí5ë;‡+í¥hÚ­»BìÊKûxʸÿ5ŸcA=Ò4Éa[Ï„nìÞ]N%ͼd)ê¬ÐãÄ9 +Õ€pµ6“%®ò!åû|õ$M~ЉO=&5óõ1­¤Í[ò7=k¾éyV ²¿ÕLyj†zú6Ǥü_Ϙ¿Ýå;Õ˜†•¼~5üõ§O–Æc/Õaœé‘$ú1°ó]ï*Gêìö~Y7öü~™ÃâôË/Es²Kr¶9g6ûYŒ7M ÖîŸüŸ{ÈùñÈ”¬ '™—¨C’Ni–$aoŽ}áŸ94>NŒiè"?¾0ç€ÚnzrF̶ìÜɆM›ÈúùHWXR…ÈýXeîwüú°°©"P½¸{ `¬äö¡ˆ]ìë–9Ö%]öìгDÚƒeò2`ëí·×K]ê™i%MòY‹T¤õ|6ßqGM›ÑKA Âvj•4RærHjBAG²ŸiεöÂ%wÜ1¯&h!¤ yí|çÍWþ%Aýö;îxÉÛ¸³ ùêYèšÕ*ß©äê%(¿üQE¯Š¢hCø©çâ‹Ä` K8™m˜9X’/9熪â0äbøp ‡’ ìH²,5ìÎ,ã¹Sð®óuʤE1ëwúº×âL7‡¶ƒçüñ9àÔ®]eGÞ93 jŒ*5%?ãX[…[’ +’ìïÏ9Â8Nª«øü§æÈÑ^viÀœzg×o´Ð›Ï|mgo¸s28†LgÎâµ ~Lýþ7º»'sè ¾ß;ÚÌ’Ãiî•×ß×|Ä"Í3%gF"ß™J5Çb/UwóµΙÞä“CÎV¿„ ƒ©O³@S{_øÐ‡NœÓ¾ÈÇ"ƒ… :òpùv#À`M#¼ûm šÃù?(ê’ü+dR'<€‘‚;`fhˆáqG5ä¤9‚9Ïgp:Y96+Ì+~>äÐ)MSh*%gé¦`݇ý¼MbÄr«¿¾:b{"œ& \¥©³ó_TJ[ ¸ÏwMˆCPœV×|õ%ûQ»ºêª#Ùn’,F3R«¤;mì¡ãp2ühš– Tå{²þ&?/j+Yªý–\·´Oòú¥&©/Žö±¹ká‚ã…ì¥ îµöôRΞÕË üð:à~„?ó–‹Ä`‰‹n(ÙÅÀ¼lšô &‰î Γý¾Â êZ>ÔäC I²œj%­lÀ¼‡|½9óaP» ¾Ž~‰ÉÏ=ü0àL}Æq`±“²_Ó³1ܘ7ÉüLR/§â)Ì6<n½!ã€'³8€¼¶%0qŠ#©4Šï/;mÉ8h>a[C˜4 hëº^—Xì?GÒ{€ýߣ86Æ$Î éÍï|'íþØJ*˜…!W{©ÔžèJÂû±dmJò6Žsh=;]žµˆN²G±HGy`n|ŽmÁ|Œús3 ®a\‘̉ØöNäÇÓ‡#a#ûö•5G­X2·pYz~äGœ]5M ˜éNX¹ù:3 ì3²Ùœ±`Ú‘Šg|¿cL%­|ØØä4'÷ïgâÔ©ŠÄerºÎâ´$‡0ÿ™hõ“ªùïÁȽ4ÃÁÚ‹8츼©¼'òÀc±«o&¸NNÓ!yZ.e×ßüÍKª!¨UjI•ë-IIyXoZ;õôEïŽÝñåÿâ#ðí á'IÒÆRMKFÒÆöÿ©¿ø‹r;ÕJ-ÂP‹¼”å¥lCóõ„Ÿ›…”¤ö«ž¶.´¤­óBû1_ÑÞ\å`K•ϼe™ÌÑ·¯H !Iº±"¡R’;æÏ‘„[> ’ôˤH7ˆNñæÏá…Â% @‹0qXY‚¿Q°‡/þ¸Àj3^Rçç}=2ãÀ׳ï¤kç ŸPì,,d¸r{OÙ©SÄ¢|ù‘R9锤à—ÏLÚËb ³3Ÿnôß•Oagæã€ÿ ?Gã‰ÒOø9Ýì;e&K1fã^~åõÿSè½÷þÏrn…¾ÔNb‚Îad €#H¡zŽhÈ):‹Ù›K“Ô#G—áÈ‚@¦Ìa䟠<C80Þéûû¾»àøœÙô+Ìê9*3hKs³‘ÊìØŠ,$ Èå¾OÍÂcú§ôcZª À;ÿ ÀíFf•ÈMÑŒäÿr¬`NÔJî& Ð΋” âL±Vc’tÕ'ÿÐEeb¦P²;ÛMÐå¯=0md\~@Ê¢¬¾(á^„›Kµ!‚•óc¡õë«{VNæ"tŠ¢tðÌžiºüøóY×Wü5s˜&LýhÀ«‹åÛWê•:׺~1’Ôä5Éïi>%ÒÛIô$à] Nj’õë7›6®´q$É)×Vû-ô,¤¤‘Z$d¡%J|ÿnÑþ¥ò¥îH’I8ý/¤½Ò¼g}÷—8ŽTûÔsýEb°„%ôAÐw0°,KI õ»~+àF fg,?=|+104ƒ—¸ŽתÄ(Œ¤¤–Ïb€gpÛ¶2ØÁÌ+2G0Ó9hÁ€èƒûÎ2ArÞ¼Ä×'MEX÷ŠÕμ'ofQpT=èp,øy; ܺÖ+9Ÿ ü+ÚQ§KSV\™xä0S™¶iêë+ǼŸÃ^Xý~ît½æøL°žyL²/àaµÁ×þhÄ‘ÙÛ65;mFXÑâÆÛãûqEƒ«ÿ„Ÿç!¿î§}›Oœká•[£²¶f'ñVL}E”Rr·§€‘»vû 7¦™Šüq4/؃U&bdz®¾YàÁFd¤1Óß æ£ [EÂÒ~üê4¬È•#‰ 7౞€û°ïK§Ÿ›"ÐIÌæf3Sx|Ü´1·âV{_ ­­åù#•Šf¥kuKû6Æ­Íœ?çˆ?®} ŒÙÀ@ƒ;çËTú¤ÌÍ7E‚™¹ÝÚ·Üyg9ÂÒr)¹üwFìz5Õ@ëb5µêË66žªkij‘‚´ãõ=ª‘Žd]ÕÈNHÒ´ÕJiÊ5ž·ëBˆÜbHÝwjI››ùJšÄþ¥"5i„V¿/õ,bEÑÛ¢(º7Š¢g¢(úbE?R﵉Á—ða)éI¸±­D€|3§ˆÕ¡è&ƒ˜”V¦G–5V¦!Ô!Õ_9p†> Šj#öUþ ;î¼³¬©P’«Iè)úk¸f0 ¬Â’ª™l¦œäì0š´„v}ÓErÿÖ¬[W7[T¥Qÿ‘Á8f‹­±eqìû_´ð™Šú2çÿ—ƒk E®ÎLpý8ü®Z³†K7öpF4犾4‚ERˆXÙŒkîBGUÝðÓ·;Ï“¶àš#˜æèè\¹ã£“nÌ£¾(ë­Œ`ö¶AgÞûÞ˜ägcz€•Måp€]Xä$9¿þן¿„^à`ìIÏ5×ðž'¤'è»t5® ßס¢Í±"`ÉTJc±TÂ=‘©«1Çå éÕJZI:73S!1O’ƒjÿ«þj$ Kºô?¤™¥õ·ÀNëkÚµµæ)ìwÍÌT¼G“ýYhIÓ^|§•Z’ðXaf¦nP²¤­Iòüï6"õÝÒÏ ,íÀc‰ßŽç-‰Á–3Áíš•ÜKÀ#L´%é¡À•šrFͳ;7¼§p€W¦J¦6e‚‘ÅeUmθk.T¦ ŠK_®ñý|Þ·ûëDh;1i§ЯÙÌ.V`&@m8;÷Ë;í’ǻͷ»¥Á…&0ÛlIKXøÎ߇Á`J8p•Ãȃʤ?·œ;‹EÅHmðcš:+# Én\ÚÙ°OWb»Ô­8›ÿ(øMã–6çE_O!ŸeŽñs¹Æ÷ñ,Ρº 3sÉùÿ3±kSRõ/ís*ùL/\fìQà{6ZnˆFœa—ÕWká¢õŒ©o˜6«sLÏ}3n>n}ëåÌø><áÏË–l¼2ƒ“M½ÈØ&5—¦EmÉ`f ®þõ÷_ÎϾÙõ© Ëß1 œò™‘_˜µ6µFW·ZÝ’ðOù7'û|=T&¾Ãÿá¦9Ñá ýcdj'¢+"~Ο&Æ´wˆX†ÄP¦hÌm4RçÓ|™–…¼èC°K0ÒHÆbJœÓœsÃöêÑ$¨Fj‘¥°ýùˆÁ|¤ Ð µzê›æø¼Ðò ç[‡ä÷äµiÿ×KÒêHöëbùŽ) üûÄo?柷\$KX$ñV¨NE:™Ã"½„Ž/z€6bRÍ$¹°,`Ñ~,fp n¸²Å‚”–”i0\ªŒÕКuàQ‰'0€Ô Üðîwsªäµ!Xt”£˜cn!¸~ÄGÒkêxfÔÆ'Iú~ßNqÎ…Ò,àœ>5–.üi߯ã~Ü™(âºWw;žç0ßùrÀHU£ïÓ]·fÊýÒÚŒøùêÃ÷Ñwà e€]ÄÙƒ 7ú>5c¡Gùêš‚õŠý±Î¦Q™-VD:Š3yÊø±ŸÀ› yÒÔÞn™z•wœ$º ¸´Õµ3‚› -ûõƒ•¶Žx´aŽã·øÃõÊwe #OíY×Ͻ8ÿû?¿‡i¿&;ݹc˜ý쥡(*?°ÍûW×tºþË@€d£ïÃAà¯þfÿó –±X·C Ô*\î E[º xbÂB®6áöd .j“² _úÖ·ÒàÍ´BMÐ ðÙ§-#rØÞáöÃ¥æ3a&T*rp>è?kÛ!ÑU‚άÝò óCÒ Y> Ë¥\õýß,^Y ¤Ô\ªI¿“¥VŸªÛ ‘ªêÚ+ﺫj½ImAZÔ¢4éš™P’¤‘mÕ"$ % óA‚+L ªãZ奖z/Eýóøjǯ¹ë®šç¦ýžöÚ½‘Ön­y¯çœ‹eIJðÛQ}3Š¢ÏFQôMà·€Ž(ŠþØ>]íâ‹Ä` ‹ìç–õ@±x÷•&1ÜÎç‚Iä%éÎC9„¦~S[yà©ÉÊ,Ä’ÆÊ?A€E„bç(Y(ÚÃÿ›L)JìýüçxËÚ†òf³mǯ·Ã€·lÿe{- )Ò¤¾7äàöÁ•tàÀÖóþüugÛ-i¾$µj¯Õ?Ç재 †® ç"Œgÿ_/ÑüüÿÛOf>Ô }éKävïf WS鍿›Ðo“T枈ƒõ ç+œ8q¦¼îg1ÿ™£¨iLJ²Í¹óûݼôû1öd]ÛÏø¹~r¿Æ[DÚ‚¢o³ÛŸ/»÷9àÑßþ_å¤ZòõY’ìä§Š¦qºÂ·µkÆ­Á(–©:ƒEDZíÇ÷7û= Ê;s¥s@cÎü r8âqÅJ3ekÉç(a¹&D0õ;ÚÕÅ0˜u}߃W/f.¦ýÙŠåÖ8³kÙÓ§ÊÎóêsäÇ'’GÇ\[ûG]}Àkš Éiy#€sç®"N[£û]ÉÐú}{"žs¡ÏÐ˽LŽ.èüÅ’€zë})c=à( ðOŒÔ<^POÓ¤„Öj«–¦`>-@½Z‚ùæhjd$ÕñZýŸ¯Žz~ Û«u¬ÖX«Õ½”€9Ù~¸gê)ói$’çV«£Zß.–oK™>“]Žû¿ŸÆr›†nuç•‹Ä` ‹bÁ˾Y`»‰J§a=˜ÁL0%ñ?‡=Ä'°‡nsÈ•/‚"À(T©a ÐÜÜ\–ËÙöŽîû~ÜŽéÁœd_ÀÊl Ç÷íçžçÊÒ°!ovõ1Ðxë;Ê{™ h.ú€›_·‰vŒ€3øÒñÓL᤽±ûé’9Žâû7‹#,’êÊ Hà\æ2ÿ‘/‡"1É^{g›ÿ¦×^Zž§o|lˆN__wƒ¿:>ÎèÔWg8“D_You­À¶Ö,ÂL­äC"À/ ZÄugbJêb`GÞ™ù|Ÿ[¹9W÷“§Ý±CÀ5‹&9SFäŽh­š`KέG7&µîow߇&à¦nLgŽž(Ï}¿¾Ç ‹ÜÔäÛ:liwÚ(iF2X í`Sg+g1ûù `dúü¢MÌtIŽÞ{N»VýÀÔln?OòCi•€A)ºyºîÒKiÅ´2wÙ–¦éôáÃtŸ§Äù6ýZ刉öÛiàŸ§Ì¤k#¥õí~­žB¡€|D2šq¤8Æ"|íõåRž½ï¾ò÷zǽTÈÅÂj¥^éi­ö’ oÿ½÷V•Â×úÔkV”Ö§j$ ü?y.)ëc=ó¬võÌØï½å aÝ‹%õ˜ZÇê%áñzÉÁBIå¾{ïçìùÛ¨¥]X(^̽t±,¬ÄqücU>?ê??ÇñV»þ"1X¢¨+Úô2Å5‹1“‰N’ªA¶’&† §0b,‚K.¨'/ ŽÑÔ«p¦&_<è@È*,$¨È„ú¢s›0Ÿ‘˜®Y#:à~÷ÿc¦;í8¸§åØûåÊ ^Ie¿ßŽ…è/árfª#À)3EmZ‰i_BÓž?'í1üù?ï-“¬b÷·;‚±BÄvÞ¶vØSªª ¾ù,üã ôk eš"Òûµ‰Õ‘ßÑà<ý…Y¸´Ý9óNùkVùO;Þ>ÄnÜïxijp ³ÅŸwdÎùtù¶d›?6‘qd"‚Ã/dËN³ÚƒSþú“˜ÖA~ÊnÓã*ÂèRÊ ùzNŒNñsq¸¥Å­Ó±¢9ðjN·ùö¦q¤@s¬<òYX…Ì-úÿ'«:á€4ãÈMwÖÚÞ¾¾LØbàhÉ] ÔojtmãçHà\ÎÒE,÷„LÇB3$å2P(Õ¬Ÿßœ¹W p×JWçï0†ù¨ï`~$˵,D\ðóbÌRÀ´-Tj¡æ3ݨ§_ú¾PR bš–q¸š´ÄïiuÖÄ ]‡j@:­?zgèÙ®(u¡F­ö«ÕÖVrnjÿzêLÖõÕUO“Ç¿f;M„¾sJE™(Š^EÑEQtmEu/ÏEb°„E>Rý‡/s…k”#ƒ™tbÑPDd ߆RçüïŠÏšÐ¨®G4&0[ø[7ª[oá¸?_ n“¿×úãks®½4n¼± •—`FD²¸ú[rFHÆ|ßOù>¯\Q(GêòŸc˜ä}xÛp6õ’ÀŠuù98…}åphÆÖLpžÎ íhUßff¤±Ÿ¢JqÌ^`ÓŽË8ѵ–Õ¾}X4©ÎŒ“ÆàÍZ˜.ëqõË L/¨IÌqW‘|ÎÅF6`H/¼ÝãN÷§µ]¹Úå^hʹ¹zü„ë× ðG_t Và\ó1ä#ÛÍþ÷&àt©äòQÄp¦X$¬¾ã ˜D]¾-þšî \1hZ¬)`Å-·”öŽú9Z‹™Ääýw™+iocÒœž%e_ÑÝMgέ³2lg±}*p%“££~®··¸:*ôñQÛGÝÀ kàlÑçß~ú0}~/ nÞL©½S8³#i%NÍXô£ã±þ¢S/n¯L¬«È³4½X"¼a?'û'Üß?>íöŸµL½ä¤½ú,‡ÒÞÛ[þ.ༀùRI$kIPCP¦ç»||$¨ö²]9hëï?ô‡À²P/RiC çdHªàäÓÚ^ pžÔT;_ý•v:ßß_!`¨‡DÕêK=c¨gŒÕŽ_ÑÐùõ´ýýçíÝ—¢$µË¿\‰¢¨ x¸øS\nØûüïó–‹Ä`‰‹ZÊxªÿ‡í+V”% e8(RƒÊG@’nοÑH6ôÙà\•<„†*Ö/„/ýþrO™í8à@Þ ßŸãžq( JÿUW1€ù2Èÿ f*svöÜ8äL9lèps°÷¤™;áÀ{ì¯mñuoƤªaüÿ9`2gæSç(æ„+çí}½»¶=Šˆ1'P­È”lÉgqÒì~__{³».ÛÔÄ\>ÏUý}lϺ¹Y節Õa6èg°ü'Ϻ¾Œcd/T·ŽbÑq£¾çPÃEfR.°ˆDÓÀž£Þ´«àŽú¶å”ª=Xâ¬`.¶½$@ õÉaÚ”i ¹§§Ø(tæßç³%xü¸«ï?þÝ÷ßÏ o øÞVW—¤èQ0¾•A?q¦K\WæxÁ‡*õcWô¦8€]ˆ\ûç|{ãÀáIóáÑZ÷úÿÇ€ûÀ;ï°{r‹bué ;¸®·›qÜ:K{µ_}Â̳ô=ò}¿¾ÜË=ü`ùûRI/„$ëI«7 ̔ٽ‹€•ö²]ˆ”àïɪÂzjÕ›$i¦Ea󑃴1§E.ªö©g¼ÕÖ,I ŠÀ?øÄoµ$ïõ®=@¿ÖØ[–šè“Ü3KE°¿ÀþBîeVÞ¼'Žã"@ÇÀÞPÏʼnÁeköß×µ:ö$í'Ƭ‹/i`è˜(à&龤Ü%Ìž2ŒšòÚž¨\§¢Ê”p'ÄT‚~™$Ýý W÷7OXÒ/™Ù4_ü•_¡k³‘3MzO ³KÄ&Ы| M8§ËqÜ ²GW•× Â´%ˆý&Õ–M¿’“)ìðÊsD> œŒÍŽûÀ9Œ,*~ž^@6gk- OŒ9­öf-RO¡[;¹Lf ¼ãñ¤¯oxê,ö¶ø?ö3YS26ÅÿŸÄÕ›Ã>IÇ•‡¢„ÓÉ„*ONÙƒ~Gâ€ÝX”¡!ÌÏB&N2+àLnfq&PW4[˜Ð.¯þÖD¦\c˜ÆE@ønµÄ`—¬ï¢xqÂÍG±äÚ—ðÙ{ó8¹ÎòÎ÷{jé}Q«Õ­Õ’lm¶dKÞea0ƒ lÇ' ˆqîd×wÀ„dbðnœ¹¾™{IÈÌdn’!$’a l ^°ñ"¯’ekß[êVïKuûÇóþê9U®ê®^$ËV¿ŸOª«Î9ïyÏ{ÞSõû=Ïïyž¶–¶ÿð9–„ëžúÚîqfÔ“ÈkЂ•fà™£' ñ'°õ.]&±^dͯÃâ?Úq7ˆ×_Á?¿ÍƒÏ ñ.ùb¯ Ö±ˆC„)Ô\)×\›~›.€˜Š•; ˜Ò@]ÊÒA×F.k,ÓLÚDàªç)wl%o@i+¦Éÿ“éNS%ï'꫉©&®a¢kÊ|WÓ×TÎ]©MDºÊþJc<[€ºÚ™"gÛuŸEmAÇÇK>SrÆIÛ1˜Å&Њºüó80<ŽË`dÁÕ—Ý8.£HJ…2@ccºà)lH“NÆ &«}=á¼È÷“l©ø“ÇŠ³´äq­tgâ}Æ:C*¶¾í:1PÓÆyó•.AQ A7¬e9KfƘ¥Y?œ1^•7…[™‡sñÄ È–~]@êPø¶L+W¯.Tý}ç5Ùƒce7’æ^–àËëaÿx–‘tš…x0¹<@Ç€ŸHm ç<;iëŽæì³Ëb–kÁ®qÏ¯ß ÌïµÿOƒ£^+Bó×€×ø«o{m‡žÐGK 8ñJãÁÂýy+ó«Bq/%浦¶–°÷þˆ|*“Ò$²SáÖn­ß`E <5dã? ô‡ HªÉpm§oî_ó?ø±ËÃöîµT{+WØ>-5¶6£p̓À‰Þ^R+Wò".Eë¯}ÀKãní—¥± ÇQp³Èç)<È9Æeu $VÍ‹£Àûyì‚<:#a'ºíœ+ÂqoÎ:(— µbkY&­‘É£¸Ga®Y›› x+×O¥¾RXö³º´U¯M¹‡·Ú>&kS%Õæ‰<$yÊ“ü+%É ËõU‰LDÊ]ÛTç¹Úýg‹”k“‘‚Ò1L¶ß™lå¼CsVý3Þº£(, Š¢4pw0i›#³Ø´ø;ñ¢DõØ‚¬ƒŠ?è×k=Œy*ÑW²šcïÀx¡R .YÌC©B3P—ew_\\Ñ5Æ„eU^Æ!Ôúz×Ýw3ŒÉfŽãò¥(œïdèûÇü\ŒdI«­2» GcßÞúOê^à[ðzᕺ2®IY”ævíâêX|^ŠûÞμ·ìÊb.ë3À §`å»ßͺ͛9ŠWÄÍóšàÂ6÷ôâ}Ä'y‹HŠ,À²´gÂ1ZcÀ“±kÿÏ˸g"Â2߈ ¬¥X6´ö[ˆÂù{pZw¸·x…iý ÿûŸ}aLþ£º ò"m¹ûnÆ€ qM½Èä 8‰êƳÉ{Ñ 5"ÔŽ©Ï³G ÷³×—ðLL’~epý¿²<õÏí Áæc6¶(|ÞŽ÷ì)Œd¥ë꜀‹8†¹ZR oüài_¹²àµkˆ“æ<̯q/…dCµAöõ³ã6Ϫa °3ÆW‡ÉärÀCc¶­9Ü›¤$b q^Å‹\Ðîß"ÞçBÛüÁNºÇ™hSµBÇ@.†îq8–3/ÑloÙ¶­ìùfòW‰°ÌàM‚ÕJÉ gF*ÍKµm¶Aýt@útæ;éa©ÔJ禹›èo®½&ÛÀ[Ãÿ²Ã¾øwÕl?YÁ€ Á‹ÿð ?ƒ¥ 6޳bÎÇS0ÎÝ)'-F"A1žÂOÁÁ ìUÌÃ8P®®]ëi27q °òfdl¶~ey ýmýŸŸáùýy€þAŸ'Âý¹¢ÑÎ%OÅ£_ÿ:»~¸è¾Ž'úáån—Œ‰P´‡q~øç/(òÉú Ä¥‹ÊíÀòú, ©£X>ÿÖDÿª¬<ŽYÜ•Žty-,zþ¡TA¹½áÚG€ŸûÈê‚Eúž+Þ[ø6ÔÙX |óÎ;‹@´ä<šcUŠÖÁ¼ãµ;4·½xúREx@¯rý¥½Â6Å8 bë°›“~à`ìq›ëaIÚÆq_iÃÓ×þxØÖ}7Wî…xè[߂Ç ñ"ýx6­†0þ£N‚›Âœœ^¡}ãþŒküº'ªo±$Œi<±ÈµˆÊ(Ff.h·cjŽ&SKcÏû¹Ò?ýtÕûNŲ[éýlô_ú~‹G:6nÈÀ>Óvè©§*Ž¡š¿‰ÚLA¹}ËÌRR g¹Ô£2ÕV:/g)¨XWZ›ÕŒ©Zàžœ›éÌñLÉÁ¹xUÚ6à[áÿ_ÞlŠãxw5σYnÊ(³8­ÅÇ0®Ž)®œ[ç†0à¾lž“¸+Vé<“µ”Ó¹=oŸ¿0æNú0+¦¬ð?jÊö"PÕÑúÓ‚%úè yÆ€–, Ö@cƒõ«,K1nE lÞÒæE³Æ)–Otá1 1ž&æèOwÚçÉÂe U£SÀWñÀjÉvÒÀgßÿû4á MóDølØãŽq.G*Ÿ/È¡. íkýQ¬ƒ,ê’è|å«/´ÿI  ìTª û‡{òÒУù<1^Lì ž^0Yø+Æ"èk­á‰vŽ•5.õÑýLºî¿ò§»¨ÅˆÏu7\ÏP*e’&àà°Åì.d qÒ—úøº´ø1n6ò²ažg’Å;ש9ëà ïå€ÝWÖøu)%©öÕ\‰p´àEô†€û‡àĸÍÁœtu‡1ÔcÄe,ñ¹‚ÖO„ÿ‡Ž£{d¤@²8©UlážÖaëZÄ:…IEºpÒ»2ãdª!ܳ“„¼p]DYaD¯{>öœðb|?ÃâgεÖ}?ûÙ+>+Aq™Ï*µ™X>§r\ò䢈1Ìr«×lè/ ì÷ÿE°T,gxò¨]·ŠÁ$öKÎKÆ4ˆUå ×Cv ¼ÖaÖÿdæ›aà­×xU‚¥x*ÛÆ0½1ô¥+œëÀ¨Ç bÖèt˜Ã|¸†c¡¿oýóýŒæó\îÓ pA›eðQ± ­a½6à?rµaü ±ÏŽÛÝcke è>ˆ×ïØÏak²ø“ïÃ㣩B€y-îMèÀˆ”Ryj+&&ùŒÕ…kTÜŽˆÛ0ð2î­ËâiyÇ€_¸ÚúMc¤Ar°î0íØ¼®YËÖ®-d€R*Ú0’³óÜôŽ›höæl›RÀ6âr,©óü)–@’5½*žFõ/J3ÆÌµ™·©þj·'‰Á0võÝ–Ç“µrûÌÆ˜´ÎÔãPé\IbPÚª‘œ‰6›@õL“‚ÙÚÕƒ©Ž­\ßsíìnsÄ`›À¿,£x¾õÏü“´v>¼Â>ë¿D%'PSþ÷f,)d÷€K3–¦ÜÂ߃[djtóKcú€1`´öío碔{3j€+2n_S粟‰1¨m Ø—w]w= ÝŒÄ>œÔ„9;…kO#àŠZñÉX®dÜÃ*XŒcFÔ^ Q IDATÂ\a$IU‚Ì0? Ëßp9­kÖ˜E÷ÞˆX©Âµ@·ˆBÒ2xœâÊÈg ®¥WjRìûö¹Tד8YR\ˆÈDM¸§W§ ø·ËÒLE¼Ú1¢RƒðÓ÷oh°ñ½ØmﯾåRÀ•)åJ«\üŠ•™®k]ÊÆÒî™dfÊ´“ƬâÒûk„,I×]_GÇxža\JPæp0ü©À¬è꿯B¬y©¸$ã„V…ñä©ZÛdsû—?…e—_NÔÒRXÿòÂÕ¿{£‘èSðò‹; ××Ro÷PÏ1À?}矊ÖËúùîý’¬hUx#îI+r²8)SZ×s©u¬^=é>ú® œmUÚ*YÌK­æW©u¬[7)X¯ÜOöùdÙªÙo²ë‹J¶%÷-w]•ú+—×b+ÿL‰™Zçºu“îS©ÿrÞ‚tÉÿÉ÷3%7¥ûΉW§ÍƒYlšLY!ÁÀ² # ø*Õ¨ÿl¯çm¨W`n2{‹ÜÓIÏ„ªÎJžôLôæ]Žn –EZ¸x%›hÄÁsSk+ÏçÝ*^<š³m#ÀóÃz°8…&,#‡ª½ê¡VÑ+Ëò~(qÍàÄéÍó]‹-àŸž±yÛ˜óSÔUX¬˽?ŠY‹çS\ɼ–â õaNíÿùO\A÷ÉAòÃÃ…Àñö_ôp²ô7;óŽ·ß?\¨q¸í_Ò›Èâr X.‚Ö‚§9Õ>§ðøq¬àž<1i J™çªKi…{¹°³“Æšš¢çOު羱q`ï0ıרØ9ä¤P²5Å ˆØ=wÒÖM'k´6•9J¯Ea[:\Ÿ¼Šóõœ[_ÔÞõ®W{3nåÈÁl׋ßûÞ²çšèüS!“í;•ó”k•À}µÞ”¸äU­Ü¼¼[5djªmºsSÎc$•ÈBµÙ«Êo®í\ú½9í-ÂÀ™Œf ŒEؽ‚ ÁåI`.­u·’Ža Ü"Û”8Gðw m’Õ` EhtÞ!œñçË:­ÿñplý¼ ÿÍß6 3¬d‘—EyO¹: Çc\S.mº€µÀžþ1p´ ¼>xÒþŸÜ|—0OOç`Þ3ÂHæ‘Æj«î·ä+­xæ ÅWç ûûÿí“<–ƒü /гÁ¢;ˆk÷Ô(¶r^Š}n‚ cšÆ/oƒ¼£x®¼à¦4û"uG0r0´FF¬ s¹þb›ŸC?—lÙÂW-xa>pß]OGNXDHv|ç;Ô/±{´4œ¿÷òô`•ˆ›°u§ÌI’r‰ cnºÇ|­|÷c„Fφd`_ükXS£!½jk«ÕQ§KL–¦|Fa OâžàŠyî ’Ü¬>ó–5@wæÉØþï0ÖÕUðJ- c:óHa“œMÕŽÃ9—àYŒò ?æLu=äIÔ½×ó“ óJ8Šš‡ãŸÅãÎ…vÿ}÷þŸÈ*&¬‰“²J »\ÕZì'Ç?á UYÓ«é«”¸”#0ù2û”÷d–âJç¬äA(w_ÕgéµFÀ¿ð…× °œh^§Ó~ð…/LºOµÀ½’§ ÒßLÇÿZõþ¼ÖÛ1˜Å¶f šU±1YyeuÖ2ŽFRÒ͈æÈ-ùêC§úq¹Àü¥ó àDÖGIŽ%Þ œlû‡ ƒ?yÌ3³œ:e¾†à  +dbѹÔz­¬¹òlŒãŽ$Cq葼Cb&=é ûu…¹ûòÃîa‘4gibž¼²ØUåfVINDF$]Q!«< VšõOÚƒµ~\Î% KK⾤BŸÊæÊX‡>ýµâ,Âä%ƒX€¯ª¯óÕî<*9àü% Ôa±õa{øá3î¡ZÐÑÁž‡*XÚ×5Áƒ¿õ;´ãiC•Q*æ³Ø~Èו¾Øü)î¶n%/jÁ%N§€KZÜ;2†ySÔOb>œ å±çbxvÔ ×ÁS¾>~ëz¯gÑ?14¥<4lï±1¶à2­`Ǿ~²)'0"]"HÌËt#kñgæ(Ç!®c#LŠU“èSYÃ$#Ò½W¬îqFB²ÀG>ñžBÌÖ³²8éçÚ™ “Y¿+YÕ«±¸Ou‰™ƒ‰¬þÕJ…ª!¥ï“}Ï¿žZ9bpºÚDd¬t? •BÒËdEû$)(G`j×4GÎ|›#³ØŽáPŠ÷-wð¥€W¼!-èÊLA>”tÝÕ}±UêX×,ž×>Œì)€ð@Τ•r“ä€?ßûhÀICõ 7Ī­-ÈD tm'F¼ÊóÅyÜc< ’>“·@ÊyœÔ(N"Æå+Òš¯Äc:SvM+÷Š–U 3ÌÉ •JsÑ®Y‚úQ’„çPs3Í ÅI‡®{^8öÿà÷ AÁ²ªç1°,b¡¾dðh/<¦±ˆPíHŒg.19Œ§/­?4X°Ú4g „ªJsoøüÈñã–馚j`_?ì‰í~ ý(¦E©Péì,duÒ—÷B%31©¾C6œ³Xrû?ÝkûeÂ=?Ž3Í‹ˆð0-‚8\µ(HÄ"Ïï‡ õ6Ï—]h ýü¼KÑä=PìHcèç—ß½p²1œ·ýE 루ðc&“dA/áµ&Dzj1%Oáž5+œ'Ó›Ê3°:qbà©0™û¯÷|al½+3—äjU•«<Ú™òT3ŽÒ÷Õ€ìrÖñjÚL¯y²qUs\¥~ª9_¾äu:c©vŒ¯å–¼Ï•®k6æL£”ÀU{œHA ö})<¢ïõ$Hz*‘ƒÉÈæ\;³mŽÌb“Õt“JÄÀ?î3y‚@•@zcxß<·Ç³Hé†8'>—¥Sš@È)Ü‚Ÿ`"ï¸æ¢ЉqzŒã8XOÙ4¼ûî»Y³ÔÇ¥ªÌŸú(¯€ŒñâP݉cl%בLˆÄ5«¿x…Žž 3y)es׌gð‘|J€ýd8ÇÆÛ–Gkä–oyMDêV]wK6m¢#J„y½®Óö©¾ÿü^`Ê"Ñ|Š¥]šO½——¨ÔJ}™ô$å10Ø>SµhÕ[ˆÃ˜ºrvÜ<«’Ær„ÞQ'‹:o°u>´D¾ßü[¿U˜ûžpà±Jù«2NþT¢;çÞ-‘Òd=€a[6eûÍ6.t‚vö\´cÕ­Ûñ؈Ñb ¾Áúûö FjvbaC8G8_ìëRð§ßè*ÕO¬çtËÇ?NÛÒ¥…˜™Å‘K66:qK’¼cxefÍÇÒ,ì ¹ŠßöŽ·Š¢‡£(ˆ¢h™¾WFQ”¢¨?Š¢¾ð×EQsbŸ=Q]wú¯ÔÛ1˜ÅÖŒ?8/áy÷_ăPÒ‚ûH‘âA¥Ikm’U'3™$-Ó+0"iƒ¤<3£À·~žU*BÕƒ=Ъœ´t‡¸óN^8èD ÐIœKéN5iÙs‰1H3-σ°¾p$/’÷Bõ°$%J‡Ç ø'Î#à_‹¬Å¡ß—ލU\@{­U[Î`þ ìÉúqà›ßdÿCȘæö‰cNĺ€ËBÚ¨tè{.µQŠÏõ8¡+MÍ*yH2ý¦Z*ÜÍ—H`;ÍxJU³#‰¾3‰cÀÉbpa«gÆyø$´§íüËŸ|êS)Y+Ðré a<²`?Ÿó¬YŠU×YÂõ ýÕck½ 8‘Z~þ¨§bݬ Ò¹^\‚–‰Ì3ðÐ _;Šó8ɇ£û_ƒß7ï¸ë.j±bnœ¤ÿøé>|¸°¾Ä6Æ&à…_›Úÿ*¼˜[ökžsoÏýßùn‘\®ÇÈañ'Â8ObϪD‹¬Žc„X^.Íû¹Ðžùæ7+n› €0U <`=™×`ºÖÞg¾öµ ç`:Vø™X '³üOfgËc6/¯‡V­‡`*ä°ÜÜLeîKI~·“ÕjðLzü"µ+ÊÍJ A%ñ*µ¿Ä ɘãw!ðÿ%¶ÿ p*Žã6à'ÀÇÛŸ>7É96ÆqÜþZâ8îKl›mn?i›#³ØNàÖn=4Ò¯Ë*¬m²*‹w…mŠPêÍdIÙrœÇ¡ÿý€Öb2=`:V)C„d •î^ÖßXÁÆááø—%údè[…Ф³OztÎNL«¼ÖdÓg1ƒÑ棩!SÐÏ뺕ÕIÁÆ’iIB¥8‚> Lê H„+ ôŒØxúpë°‚G†¹•Ö;Y¦ó0NÞ‹gFœäå°oÝ›¥óÌB¾ÓÔƒgƒ’Ìi·8'ë¨É £ëÏbøxÎHhža¨³Öû_Ù5éËZ_êY`Ï)ׇö/ç¬ÿð¼û5aÛ‹yá”äM° Ù›Z+ÙÿÃþª¿¡±‰((mk”vùO ðL Í-¶ä¥XXoÛ/cTÊÕ><¨7æBµäEêþéw~‡_ø£?â{ý.ÞРッ´åm†EŒ+šmÝž‡e®R0´çã%ίªÑªÀ\‹Ç¤Äøó1ŒÝGͧˆµR '×ù¹Ôºvízµ‡ðŠ6ð:Ó_óràíèŽUº3‰$fìÏt¿c;vLëøÙ %g¢•‚â©€äj禴•ÞÇ$)Oüɸ—”'U".•Æ]ißÒ¿3Ý¢(ZlnãødÇ'€Û÷DQ´¬x×H“ÂrŠãø«qÿ=G&<Õ,}FmŽÌbS…ÛqŒÈÒ,+;¸†_ƒüµ’’}õ%ÆœKì§WYŽÁuô²"ïOì'p¡JYÇηÆïÇ@ÐG®i£+†Çñba œ^ëÆu}Š{˜mÀ«Ë{"¥¬JIoˆ¢Ò™Fƒ9á™”äEAP ‚¾”bŒÊ׆}ô-KFc迳gpIÇqœ¶ãfä¡hOÜí†Ðg[M¦ ÖQ›— [—.Hd,S‰sêz(GñT©ép‡"·2§€çG¬ÿå@m WP"9Šêah­æ€E .mÂêÈB.p*¹—H˜tôºî«k­ïû÷¸ç&\ú·²×â²²«ÿ÷Û ñ:WW/¤³ö?&ÑÅHV„ÇÈë5î«H]c˜“ù õ_þÍßd¸4q ]§<=y­)àÉ>xóö½÷¾O²BEQUunÀˆ|tãÓ4"Ða¤ ¹MÏWLqJc8ûË™j3r:n:¿ÀÓµl'™ ¸©Æº^i<3»Ó±&—‹˜,ž`*–êÙïÉßÐÓÑÿl·É€q5ó8ÝVNö%B ä É߈Ò1é{2)†âõ1Q; îÍ¥ÀHÇOëƒ8Ž·c—}iøè/°¯óCÀ•ÀNã<DQt<Š¢‰¢è}É qŸÇñ¦5úi¶9b0‹-)ËIV"°Ôë œ 8–>ÒB—ùI}¢Ò¤*+ŒÄ~Ãø0 x,œó(®ãïxÃX~É%…`é6<•¨@¬ä Spr4W°z7‡yÞ=è$mÿðxa¬JëªùjƈV'A&Ž‘üG^”Y*W[_Çõɢ=ˆIkvãT™‹êjáü:ؘ²ó¾kk;«žA;öù)àGyÏ(¥À²ya<ò`Œâ–÷󞨖„€nF,[ñ`]eØYûþÿyoQ †¼@‡ÇŠÓØ~hµ×Æä<#’ œ‰œ=±Ë¯DðÂà¶ëo¸ýÍÍ…çV™—[ñ±ÿTXçò”€{Åšú¬ƒz=ÏZóz¶;÷t¶~D¤ÓxšRYÞ¤çÖõò+®8m}¿šf¹Ù8+6o*Eõ?ÙuNW3îÉÈJ5ý%ʽҼTÏdã;ítX¼Ëy&ëwÅæÍÓ&³åþJI‚B©<¸Ô³P‰ÀN6Ž|ûžÆÖ‚+U“­'l#ŽãÑ8Žoã¸3Žã÷ÄqÜ[fÿJí8°X‰©‘¿|%Š¢­3öÌÚ¹ô{sÚ[P²Äƒ?81žÝ ¨½«½XÓŸ 4N'þÇE%¯ÚGª¬Ï‰ýêjj ’_º" :ïXâxÕ\è=uŠ· lÄ-Ù-À²:¿Î“a({ÎñЯÀ{܌˖TÔ©!ü¯}†íJ#*ªàiÉ\t=š‡[W˜éFÌs  : q’"2 P¦BXã0|ì=Ø ýhŽšÂç 0½üÛ³n Ïï\èó•Kœ/©ËÔ|­×÷î¥):š› µ´O]8ß¾1•"—Z7M@ª>[ˆ™ˆUq·cá¾ôŒÀËð++2ðÔYâõö<ý4 "òJÍ*4‚{MtnàNüÉ’cߦyŒœÔ`÷»%åV,Å[(ÈYD:éMû¯»¼žAmâó,^8ï.qnăàE6Õo=Лˑ‰c6ÕºT.U)–wkysЦ”ƒwyÿä Åê5®¡!qN¨:œŒ®Lõø<œßä}&ׇ¼cªyðzo\pA=ÀŸ¼ü2®[Ç‚;îàѰ-n¸ã®[WC+6oæ Û¶õñswßMóÂ……÷Þt—Ýr „c2µµ¼ïÞ{ÉÔº@ë²[ná›n*¼o^¸Ÿ»ûî¢~ß°m[øì\·îAo½ãŽ¢*³+6ofKÉøÞU2¾u7ÝÄ¥a|„ñ½w‚ñ-Ý´©ìø¶lÛÆò\¸n7TŸ~–‡ñ%×Dã‹tm-ï¹÷^Òµµ…ã.½åÖ•Ìß»ã‹ãÓûŽ2ó÷–;î £dþJïo¥ñ-Ù´©hþ4¾8Ì_¹ñ%¯»Üý-¿ÊÜßJëOkTëOï³Ó\[¶mcåæÍ…~4¾$騴þ47ÍŸZº¶–w—¹¿koº©0ŸM rÓÝw~ÏrÀÆmÛèܼ¹@Ú×­ãÚ;î(ŠG¸îŽ;XÆË6ofó$÷wÍM7±ñ–[ çžÎóK¶mcçæÍüp×·¿M¥EÑ/'ƒ€ÃÔ¶–ÙuîøŸv‹ãx ŽãGâ8ÎÅq<Çñ__þÍLûžI‹âølu ½vÚ§?ý饟ûÜçüv?º¾¸Ãe3D+ ßŒ­ªdÈÏp£”›ìÁ[ŠAÒ&ѯ2€ƒ:I‹d­mÇ+ ‹Õ+Y ®××gp ©íPoZßÝk–ÑŽxyÔ®±E$®M)ÕÐµÈ îdUUåß1¼rÒ¡¹“,¦¸è oàñ,È„†±Œ:Ïå¼îæNUkpë­<%)àB, TRUÖÍ&Æ x yY†±ø…ÃSyL€7nÛÆ¾ô¥Âµ(&b 1gצ-(\lóõWòÜý±jüôYÎ"3 ^QÈᯠÉù]½šAÛ݈¾Ã6V­7½÷½<òµ¯,æ$®Y±’RɻԂƒÑ0žóáÈI—ÿÔ‡ë»ö|xtw1Á•§ ¼~„À¶$UJ, ¿æ©=ô Y˜‚ƒùâ@6‘öÎpÏ×´Áîn_š5ƒÄËbÞŒx*a=¯É‚nŠ/ çQ]ˆV ²L[M¸‡@®wÝËPÍù£(ú pWÇçU±ïjã8þåjú>mÎc0‹-éfû¯!Þ§×9\ -Í1øƒ$R Ë,x0g2}W’èÁÑâ—>{ üí+_*|¦ ÐdÁS’£Åxf•Æðª4‹ò‚ ÿ¸×Ó9>3êའäŒ)ŽÇ‹l%e’¼à«’îp5—’ÜÞKrAd×ýìƒæe¸ñx6ç}¥ÐlĻο'!Ó~_2¸Ìàη¹LŠðÚæ¶  Ê“/ùŒdQ+Ö®å©/}©`AW<²îëOÆÝûž¸ÿ1Ž>kçߌWI:j˜¬÷åNˆ”jµ8°kWA3 ì†u™bÍ¿|íkb“IŒAs¨ú‹ð4¹Ç×ÓôôzòÕ;÷˜µ.\ïrì:e)Ï+k|N%£9SêÚ!àu&ö<…­•óÂñGò'¢õ¬û¨¤Ïv»$P’7Ådè\"sdœ¼HöÕ ¼ùòö"i’ˆ°ŠÇiMŽæ­À™¾ˆ“©„c<¦HÀ;׊ګ(3(j¥@g:ÇL¥r`¿i‰™¼ß‰Ž™–W9iMéµLeÊí[I¾sºˆ¥Î•”Î&ÛLæ²ôþͤŸ‰Zé|U#S¦2Bx¦Ò˜gKR5Õ&Ò2Õ¹‹ãx/ð-à¢(j¢hp/ðõjHAEé(ŠTæ(ŠjÃ{mcE…ýj¢(º¸ø«)uVÛ1˜Å–LÛ%09€g ^Kq„2’_©EIì“ü’“TC¥á¼Ä¾#8¸©Ç€—€N?, [¨_€[©›.ä cਗ~Èú­‚bµÊi€¬óÔ➕ޒkVòÞ‘0OÒ´G8™:ŠvjÉ·”`_ —„¹¯ÅuæßxÙ­±5x…ß>¼[mg' ÚÚ8‚ç—¿¸zÇý¾d1¢"/Ç~ÏÆ¼·K¦¤ m«`n‘Ÿ°kçNŽã{ÂxÎK;AÓ½–÷AäFõÆ€Þ·½¥ kè±ý„÷çã„j³¨KzÓ¹vm!ƒV ìÌ9 •œhœ¶Ó¾þT‹Asy4ì/Mý¢0#XWpºÖH«dÜç çZ¾´¦0w;G¡£ ~î_o¢='‹d?¶Ï66ØZí}5a^‹–0žÅ@[k+£©ëž`U‹/|ÿûV,šOLqÚY‘3ëиƒû¤çGkb³Úç1˾úÊ©&¯n}ÅzßóÃ}U…îhè-Z#Çúá›ýÃcÅÒ€•‘ÏM6²¾vúzSêRUèŽ0ÿð–Ûncþüù…ÌWÉš=a[Wù<ˆìIJ¤Nyµt­w¢ìVòÒ$ä(öŒH•ÂkH¤€KÏ¡ÒÇïøÌgÎ/@¥6)¨†8”#“]³´Ó³°K÷Ÿˆ̆a6îi¥>J5å•HÁDÖëJ^†rûV3¾jûžJ«f­”ûŸ»ûuµä Ò1¥­tŒ“]ÿl…Ɉà´úŒãî8Ž9ŽãyáïWª 0Žãø÷â8N…¿tâu_Øþßâ8^ÇqSÇíq¿!Žã¯Î°gÔæˆÁ,¶qà™^³DFxQ£¤•x“ð€[_ÄÙÄ{É~´¸¬Goö)©ïÛMqà³\|#hOºÔò€ZúèÀÁ)á˜o|êS áÅĤ—Nf"Ræ•E5YŽcÒaIqtŒ¬Ûª–˜Æ½m—[È0Æ¥k“×AÁ¦u¸dKÚ~ͽZ/Å‘eþ©±¾~y-t8PRõûøC|ì1FÇá6ßó)Ö‘÷†sž ×ö2°²Î‰H2•›¼>1úÒx}‡A JÁå \9ˆî Ç4c¤£ׯg€…‘×ÍÈ¿ÿEÄEÕ}×…>$i ÕÚ®ÿa} IDAT Ü—ƒíŸÿ<-ÀÁ#'iÆkܼ䕩bµvEnr‰íš{­d¶ ~Ú?}ÎúÃò¶N²@× bÉl$)ª^Žm[ ÐÛÜ $îE¶–’™Ãbà[÷ÜÃÉ®®‚¼Hž6Iæj€ï½ìì«ÉðD”õ…ºcÀ‰±Ö¹¼KJh­l[µ8QhVª<ðÔ9Túø_¾øÅ3jU<–ð‰@÷t¬¿?ºï¾ªØl‚ù‰@vµõ=Ñöä{xå¼EÀ÷ÝWXN¾¯Ôg5c™¨MgÞ§B<&Û¿t^¸ï¾²}L4–jÛdÞ–äxÎD+GÆfã98×Ú1˜Å&«æQlAÖ+1 y‘¨ôx¥_H²”‚þdF É~Ô’„ÈD„ÇL‰ã”ÅæPãñðšÏ0øn>rYm!˜Yr¦56žùÀ5›àåÑ1" ØœúPúN§4Ê@f¦ãÄþ‡1­,Eép¡c€“Ö[Ymä=h } Ü-'{Žä,Uå(\þ®wñ¿v:qÇÓE^LqÞþ%-Åig/ ã½2rIÐîa—)%ã$JV7 ×¶ÈäáéÁAvÅ6FÚæ1Ò…kÜ%KÙS(þ¶¸þøúws~ÚŽmKì¿=ô¡ìE—.1¢±#°É`rÓQ¬ïv<{ÓWÙ˜2¸”F_¼yŠƒËå¥Ïä£xÍÉÜ3@âZSX<Ä °& k–ØöÔñª>,“ãñ á„<€? ¬lõó.ÀÓÌêÞKj1¢Ñ€?’WɲaÏ€Ò©Öç×Ûš‹p~¤RØ}—Ôo”bïKžŠWkó\úQë;~|ò­p=Smª¤ Z0Z®õ=Ztìdc™-ÒSÚÿé&S!T6/Õ^kTWCÒN÷zš©7b²6Õ¹™I+wüÙôýu¶ŒãlosÄ`–›,£’0ìųXjq¦1€¦VjÍ׫ê›ßþö‚Å>GþÇWV°N%úHZî¥WÃNäìÀž2D5ak¸—‰I"–,¢&iU:±Mq%#É“KIé†Â\gRv_„c_ƒÇÙÿ±û²8Ìû|ŠI¤R‡*Ó’2@Õb^„<°<âNyðû1ºkW19’j)W° íÁîãa®$öAž²âhzEø%ÙÛK‘.KÌA2Sø³Ÿ$•s­ø~¦Þ…é;™%r"YŠŽ/ݯ’<£ô³×2À©†(T{ìT­Áå@)à>žª™\óD}Us\%oÉLǯLœRî|Éþ'W\á³™‹3é}|½´9b0‹mM­š¶Kš< 7ƒHà;ŽAˆ€W>d5À¾ûÝ‚4§?öŒ8à–Þäqz˜ºS‰}ë1P”‚’•^Û{Ë;áªmÛX…ëÕÇ1`IØ?ïwB]8a+P{ÚpY…ÒW¦€5»ˆƒæ¡Í ‰kQÕ\ɤ$óIãÒža ,Î;/rÉ‘4í5àk×WŽ_ø–·°ìª« ¸Ë€5¸ ‡S§ dâšÈúXŽ]‹ÔÔ㲓>–¸EX…Ã0ЬøŠÝáó®Ð׎DßÉØ…Rì2›Z<;Ócáu¸ÉÖ_óð0†¹[† 5.Zþþðän÷6) ¾Ϩ$iš¤jpý ›wy'´ÞV‡í’àœ c?…Ç}¨÷៸¼ÙÁö`øÆuK8¿äQ f~×Û[ ûÍVÕ˜—IÕ®»òЖ6ÏØˆ}é/üõ»µ_Å’F5éZèwR¤ûp4Óæ}m£]Oc¸®°±-SðLèùlĽO…s*–CÞpIâkNµ­}ë[_í!TÝ&»/å@Y9Ð?Ñûäç†|ò¯õ6ïA¥cc(Êc_é|Õôy:d5„g*}U š×M27Sí¯Ü1jy Jã'«ë×Ãz­µ9b0‹mLj/þc@w¿FY0À€ó‰W‘†tb?dßdeT;&3©€ƒ‰äƒ§sc–ZY!3x‰ìó:`b8¹íÛy×óK*´#Œ·)ŸÇ­®Çp¿V?Lûp0™våü‹cð–E.ÏÄÀ“<0ò(Dás’ê ýÖaY™TTj4öÚçGÒ—ã©.»Ãy$;´õîçð®]…{q‹ Ùê óV<ÃÕ!§¤2 ½%*Îåœö ¸w$â|b‡0’á…át¿e•Iî6à­õ¶Sʼ5«`žÅlDÀÑ>›»Cá|«½ã–éGû=þoðóËŠåg²rëü=èžOq•ˇöºv.‘Ù…é`i»ÿ(Œ…yÞÿ_Nøšz®ÏöÂÀòš ¿ýû)H©:;mL"Ÿ›WÀß~÷T¡2ö1`Opá\³Æ3ÿœ·µ3ó˜¼{ÅAŽÙ6áÁÁZ++ÛlM ŒXŸÒýkN€e×]Çšf›Ç=6Ç"§Ïwç Ò§äóz —Œ)®Gmqx­¡X^x.´úÖrõ„Š[)¨H‚”³ÅB8ЊJ^+µRÙKݼy¯ø|®Aý¼y“ï”hQ™?˜¾uºXOfŸÉ§Ú×Ds3јË]ÓDÄ- þËyt&#ÑÛæÚ™msÄ`[ òt7\^[° +Зð¾ YQbŠþæ:Ï¢"Ý´À_¥T ;)1ªÁóËǵÌc˜Eü¼Ø€Jðž 󉇦Ãu«\6Ñ ¬IùX–¥ {zQUšsiíeq]•v@()JðÀëO9öåPPkXÞà^”_šþÖK/á‚’—$æòżË1vbÀ«¸ f]ÆöøÏv‘íî.‹J”ÅÈS#c T’ðšÀ÷b»ÞùM5°œÁn-®OgÙ­—Õ„ì6a»HE6\×Qà…!Ûv(ób»w×-€ÆŒIÔDüZëìØ=xªÌ—ðôµuXÜAÿ /ð¿x@íyuî%ÊcR#IŸº)–š).¢óvè^)]«Räîà_2¤x%ç÷_o}è~+¸yÈæ¸ï3ZèoÇ1ësqéG{m< ÎNJÒ~Ñk€KÊÆ€ÿö2>:J=æÅÈb^šË3pÙ[6°«ÛÀ*\¯RÚFx`óöýˆûÜ»"‹²3à’4‘^Åuh â÷"pà^‡séÇò©¿ÿû)í6ÏÍDc«Ü%Aëó7s„ L{âoþ¦ªýJ­ÛåˆÁt[5÷™ƒj>/מœdn¦J’ÛJ÷+=v²þçÚÙÙæˆÁ,6RÊbb9ðÏPyA%éßO`òUúU5×dÆŸxh؃>“Ò IÀX”ئ\úqâØc%û„1À$9Ìúþá5“Ãó½KžóÔ>¯Ð<Ÿ7Жöå]br)_ ìCòšÄ<0îï“Y{ “_Ô ¦Ua³—ýÚô™2Ð<ñäÓ¼Ûþ+12ÔƒYÐP%9RÈAÜ+s,â””Î,ìÆÏc`ú‚0Ö…á\ñl3ãý£¬Åz7ÅzqÅ:(£‚o3ÀÆû>IsäUŠemÖX%ƒR€õ±0Ow™•{‰bkÃ.É c˜æä½[ÿûÂç pÉÐp**þ,Ö§ˆšbh”ªs$ŒmAØ_EÙ”~VkZ2(yuކ÷Ë€¾gìšDDW†{1þ|P\ \ºý=£°¡~õç71Ʋ4ô‘|^”­©Ï(‡9Haë!y_²À9xì‡Ï¤YžrXý*;Yܧ ÏN$ÂvðÊš"®]á‹(ŽÙ8N±Dð\o•,SJgª•³øN$ªd®$¿8Ý k¶û?÷¨Úù…bÀ:符U:çTú(·F’¯ïtÌ}µk¹\;ÝD¡¡9Û¾Îæ6G f±Á‹)õc`;Ââ†0à& œ(p Ž¥U—üFVK-pm×gÊX$ £À•ÀY+\°Ûˆgö‘ pø‹?ë+èÅ;Ö­cqØ'3Õ8N2Id„ëVjI¥.M…ëÐOœ[b!•ÿÂ0¿Jã© bYm—„×ei›à'š< Xyåiˆðl2c°¯Y¾œšÅ‹_:„UëíÅ+û*˜7‹KHÖ6隇ëõ¼*‰ˆÒ­|ü~µý÷Ûþu±ƒÂ8qÜ›/‚em.R­ÈÇKÇÝr̓߹7Iäñ{ÏÚØ®oƒ%W_M*±,Œíä`LXŸvr©/Ö.'ÙËœucëKs›ÌÓ¯µ6ˆ×Ÿèººl½ÁÚâyðoß ­c'¹¼¦†à¼ÎùEÕ—›€ƒÃðç_}Š uÜuð Ò­Ö_+h/X^Ü-,\¾œ|:]¨Þ<÷"dªâ¬"…‡Â:P±@¤±uudk@÷YsS‡yOàd*lœïcÔ½í cÁ¸ ]L.´LMÍä;½FÚTHK9«péûl­QÍ9ËkqËÔÖN¾S¢Í9€Éïëd¤`ªä`*矛©®¿ÉZ%9Ñds:›s?×NO›#³Ø€ñ MYTc P+e¨l=§ü BR$Yëý'KŽëødšMÉ–då܇“„ œÈš¯œüà@K’#y36¾÷½ƒD•ÞR[Py*Žãò Y¬UìK`GòeR!'àùx Ì _ÂsËGaNähMÙøR˜'â\F2\›u÷ß겎…Ë—ÐYëÖì,вx1íÉ—dQÊî$úð[¿±¦PÜL?MJ=ù ís2ÛŒ×ZPUèöp\ð‡¿ùG’Ô6+²ªéªÂqøÚó°§ÛÆÕƒ“*zË;lŒz?ŒÄNÎ œŠ„ý¸–^v#c1‡€‹j}l·¹™‡Ïs*\W 0/0Ôl¸¾Åáúëë\#&Â+ÒR‹W¿~/·ØÛù-hÏÁ¾ÑQº€ÇN,î+°µ¬ŠÇO s÷ÒËè>åñ ª!QNdÓÀ…?ÿódêꊊ¢Á(ŠúÛï¢èW';O2‡ý&ÜZ™LÃ)‹­ Š4ÍWLVÊ•u^úkýÉšKü/9Š…¬ãx:Çä¾Ca»únÃÌ(ð½/|,Ò†ý;q“n¨EŸIáÀZàh9ž¾rîáQPš³,Àª/£%Yg²:î@ÞÒÂj>ŠçóoOÁƒcÐz¿ýß“ýû2ìq‰Ï°ï‘G8´}{¨-Ve\–µ2mÀ0üîÿû"ýáZ”õ>4FiÄë±,8—7d ´¯§8ø™p cÀyã~¯›0¬Îx6(€tΫ·÷)<ÝêðÒK äCkIÂqOD7~GGþäO èæ«ï ³ö¿¼*Æ×ô0ãÀåX Ç8Ð;ìû&‰ŸHÌ< ›ö¢fŸÚó\a=ˆìž2©tºZK{ àÍRA;ɾT‘; Ç|f×C€{P´øÏÿ™[/`AÃ+‰·Rʶ‡~ÞùÛ¿MæQ?2"º]ÀÛ–Ú½ûÒl[žéKž‚7Î÷¢wýa{=NúúCm¸—i ÏRt.´ïüÇÿ8¥ýÏæûÙ#1ðŸúÔ,õ6q{­I.f2/Õܣɀ<¼rΦzßO—ÔåÛanª¹ÆjöK¶‰H%¯gós:׊Û9A 0à~k‚}~.ŽãæÄß³‰mU­ëùÂ-÷ÒcSü ÈÃ5ѲJ dK“ÝŽ×Ha$AÙSdíñˆqé„,"ƒ¸\Õk•.RÒ¤ÇqÙÈ– ÜrËÖ…ñ7ã2Œ]žrE*\K&¹‘fœ°í@8&“? c—|Jñ ßÞ1ð–eAdÛ’Zü ¬íÌ;iê ןÃ*gË—†ëZ¸‹€K #XË[0@zÑB«í°$\û‹ãvÑ /5f´{Ì K#° ë$aàOßÏY?GðÊÀò (Ó”<=ãá¾+‡ÿ‘œõß¶èß];!ÇòØìòÉB'.b0Vº‚ˆ†sOŽ9ùTôÓcîmRºXIeä úIâšæa¤ªÏTþäýÉ»”꾕ë )bõ#¥X˜Å8y“ÄKR2­{y#Âö[® Aóíð;«·¤vò²iüÿãaØ5èIôLÉ«!"ðwŸÿ|áÙ¹†ˆý÷í8ÕÔÇ ²ýä¤]׿Z÷ÖbÏÉî}P»¾Î%)Qnttòα¦ßÜÈÈií¯5R6/µÙÝ•,óÉ÷“y!*m«Ör?¯Âds3Ý6¨†0L‡,Lõ˜922½vNƒ8Žÿ)Žã¿Æ¦Tj3þÞ¼6€™2’H$²ÌB”Ç­ö²–/ÁÀ†€î~Üb­cú0«»bdá@²V+Û ¸~Z`ª'``X‹Fà¹|çïžåeàûÃPJJd¡˜ÐôâúZzãL'Ë"bzàø<{ñ|öúl¦pÜ{a¨Kp«¸æEש£µ˜µyðÄA¸öCâÄÑ£<<7c#ð¶õÃü~ï¨KÜ-õàÚú{øÉSäEáij sÚ5ær-èêZ“÷\ÄEë&ÆÒ‰.ÀÓ³öa¤*­ÁÐßÿ¿~Ê&·ÒýUí…Aœ .üž(:úí ÿ÷v>TU±Y^ pÒ)9˜/.ÅQ Ê‘0æ\^§X‘p>ý¸Ý°Âú9‘˜+=çaÏ•¤^ª><‚y±´¯¼"Üÿð˜í÷Ãv욬gÒz_˜r€¯ z=ƒã!ÒúU,A“¶% ì „ýb¬Ú´ˆ¨îµ¾2A=2bÏ¥Æ\~áZNàY™Tn®•o¯E ;•Vj}M¶éÊNæÚôZ))˜Î¼OÇ2_îøJï'Ú¯š1Oçš&üú¦µjÇ7G ¦ßÎ bPeûË(Šº¢(úYENnˆãø-qÿùdôÇ®gÖ|„‹ f=MÊ„êñÔµØñi   $­…­ •,äPèWXËrMè'KpœŒZï}+ŽaKÅ9€÷w|òzsðÁ ðÕûî+ä‰À±2먒ìð¦Åözùbàò<ÚeçÞ¾ÚªK.B ýùn±}Ïå5oÇ"L*4/ô£ ¸9`C³²ó³.…Z€i*U˜]y óþìÏhÃR®Ž‹·nåå®AËÔfÇ]Ôî„¥®ÁR¦ \K.ÓwïLs˜ðFÜûRS[Ãb\V¾äi‘çãLB%Ù‰‚¹³‡9PŒÂ(È€" ”‹€ÖÇ^}ø†f¸WÞ(@wý|÷b ãé:“ë iå0’ o¡PêÄIòœþy¯#âÕŠ¯h§6Vq¹Ð‡²U‰d¯Z¼f‚<#ò˜ Þ&Ì ð†Oü6 Ú› énÁ׊<=º‡Yl])‹”¼Êx´4qüp˜÷V<ö"‡üñÄ«¼o RO’&°up.µïÿ”™,¼–e ¥@ëÒ[nyŵ̔¼–çGí²[n™pûl\£æ8•ø›êœW’•;ÏTú®D"`Ó-·”%3Íé´j%Y3iÓ!3%rçb›#ÖnÀpÅ"àÓÀ¢(ú·Síä`É'>ÁÎ5k8ˆ-ε[¶°åÃ.¥“À{†ŽŽ0Zµu+n¾¹ +Ê44ðî{ï%ΚŠ{¸âÖ[Y{ãtc@nÑ’%¼ó®»XŠ‘„>àÒÛnã¼+¯,d%jY¿žëo¿½èxë'>Á¢Õ«º‡`Ë–-üú¶²É,®5÷Üǯé xðï¾Æú­[y좛 ÕW54ðþ{ïe$›¥‰—„ñ5ÛCÃ’%tþÆ]d0ÐÔÆ·ðÊ+Éߨ=ë×ó¦Ûo/d¦©~ᓟdÍš5ËôÅ[¶pøò¼]ÀÖÏž\‡U‚.Þº•‹o¾™}6W{² ¼çÞ{¹2›å’·-ã°úÖ[Y}ã,®i2/áwÝU˜›1 ó£·±ôÊ+yþÇ?æmý(ïózVÿÚí,†Oعßô‰OðlÛjž´ñulÙ¦¸àenºçjÚ: VãÍ[·²úæ›e¸¿—Ü{/£Ùl!¦àM·ÞÊ’o,H¾>pÙÞÆ'+ù5¿ñœwå• …÷‹Ö¯gÝí·âDú€ë?ñ :V¯f>F;¶láÊ_ÿõ°^d—tÈàŠ­[Yùó7óÐýu@Kc#o½÷^ê²Y^:i|U¸¿òø4/YÂÛ0þÀu·ÝÆùW^I&µY¼~=o¸ývrá¾åÃúK­^] i ¶lኸPœ­øíoÝK¾£ƒ1à¡дu+›o¾¹P ¡¡Áîïh6ËFD®¸õVλñF^êµµ_·d ï¸ë®B,E¸è¶Û˜æoP¿~=5óÚ9Ñ=È Ì|ý'>Aëš5îQز…¿þëÔ‡ípÝ=÷P×ÑQˆí¹jëV®¹ùf²„`ã†þÕþ!-Ùl!éu·ÞÊŠo,È‚Z–,áú»î*ázàòÛlýcDïèúõ¬¹ýv~ƹӆOšÕþ^M@PN^BÉûJ²Šr`¨§çç˜)è}=¦ró’l3½ÆJVïé´R¹ÐTe5Õî§ó”››r×1Ûä0yMådW“ûõ@X_«-Šãsgê£(ºø‰ã¸¢l7Š¢ÏoãøÚjúýô§?½ôsŸûÜ͸Ícîÿ%¸ŒEúè¥õ°{(gÂ,»IyEÒ%—j#‹Ý™–§à¥¼õýŽ‹áûϸLEV ©’[i4•g³|J® k©ŽÆO%…HʘšÂx·¼íìþÞO8€ë¼3ðê çÝÔ/tCkî·}Ö7ÁŽ~×¶ï ûvâÅ$ Q™÷L4a€0Â@•¬ÚÍmÄ-·„mCážt…cÚ›€~ Àµ©¢!Ø-À%‹ëùÑá¡BZÌÁ0'×tÀ?‡µW­âÀ£/Cåõ˜Î×Üô‹oä»_ù‰ÉH2ð|Îǯ@WyÎÔK0•¾*²~§ÒÊýå)N¸QÍøfc<—üÒ/±íË_~]—δÍy f±]lÄ2Ï,Ÿ)øPi._2€±³üGÀ§Þæ…’TxIÐpl¯É¢dûßDk=èR€CÇKê!«®ªÑJ²¡XTâØ<žb2´ª@ç7b`UR’Ÿ~ï'¯¼ïy Ì\®óñnE{û@¸ßõïû1`µ/ÂFض(œ»>qM’]- û ã¤þ°mžÁFzø,ÐÙ¶-Mï·{Ðy4z†Ê:#P"P¡W^æpV#n;ž†tÅ€ZÒißϵceI³º«Ö€€¾€} ¬Ü´É!cÛ&φÀ£Î—ÂiG¢XØ×?þÛYÇÒ%™ijÃH„ä:—j+¬Ø¼™ ž G©IÌÑÅáó"ëÿÔ°ߎGÒÚ—Ï’ZCÙ~L¾´üW~…yØqOæ­ßn` ®ŽCµ<ž7‹n/ðô!¨¯I³8r„HÉÑœßOUÐMÛÁúf;g˜×—wòâK¢5æä fÕÏã¾õášÛø›Ã¶‹ê =ëó1,ʸ×G^‚'óF6¶Yaÿ®HGP›Òž–ÌŸ_ÈZ4ìµ¾nº–D^LM|ÏãVà®äEjxjYÉÏäùP@~\ŠÍ+]¯Ã8ðÝÏ}Ž.;’ÇkmèCR©OÞö÷ôã¤MAý"éãa¼¹Dÿ+·l¡'•*È€´¯‚Áû€¡Þ\!°ÿHè÷ÄÀPÁ³ÐÆ¥˜yaDFYº”0 ùÙ?c#x/àϵŒêZôâr°yœ;íÚÛn«¸íõúÃ^ •JBÞü±™MЪ[å$T§³©y)%;¥)9§Ú*­ç©ÊŠÊ5çº}¬*²19­4žräo"¢XÍ+²v¾ ôÇãÒ÷Ÿ4P5Cÿ¸»õÆœý‹¿ 'ô݈KŠŽlßÎþ^(ñQà¼FÈçÆé‹í}ÈgŒõâ?'q‚vu=ìê À·Ö®çéÇÓæNë„0†KÛ ü^|©YL•6O8Çe^]#phÌÎÝîñ³9¸·l+ߨÑ@wsTH¡ÚÛÆR¾>ò•¯ŤH¾öÏÿÇb·êÛßKÍ$‹ˆ–wDl\DH–ù¬m ×'édg혇IkAïé°¿ú‰qÏZ²ÆBO•z_Û5À£üÇŒ¬ù²Ú_Ž;„Ç4(Îàx8_GØ_ù*¾&¤giîõyð§N(DÈà݃ Voαg¿ÿûe?/Õw¿ÞZ5€íL8+צjÉžIÿÕ¶31/¥àv¢<ýSé³´Íæo& œM¶ÆÊ{"RPÚ_9¢PnÿJóTn Ó™×ëwÄ™jç18SM‰ó1i¿ÎîZ[Ýx-YTÁã„þ+ÏÂò𺦹™?øúKE^ Ç*ž ‹‚ R®·ŽK/2ˆIãznÉmdÁïÃd$ù_JÅX‹,°*íÃyÌr~¯A04î˜=ÀÒM›8ì;è$EãÅ QH¶2ŽiÜçŒÙ8qùÑ>`U›¸ùó½õ?};ëqB²—ËH>¢ëXj/<¸ÇSŸvÕ3@¬š õxZÊÅÀ£C6ö§€##N“úvÅ•äýÝvÞO/*@–Å< ¬ÇAjÙ|Ê‹óxØ¿‹wi ÷¢;Ìûñ¾˜<¶•¨¥Æëb¬¬7ò„$æ;ƼšGÅÈHÎ#=}=f™PVV*ÕôH~Ñ'½\ƒØ¹Ç1dM„{¬¼FŒôàEå…Q±§Mi{ÓÀUu^›AÏ•$\’¨}áȳ<æc(Ìá(^½XEÞ¢0ÏZÿòÆ5àEÖûs œk$œã¢ð~e8¾÷–,®ª·±¿È™±¸¾ÚL,³Óm¯9S$¨°$Vs|µç-m¯gÒ7Y›O$1«¦MvLµ–þÒ1MglÓY/S]Wgú;âõØæˆÁ,¶a`6à2†ã#Nô@ d¤€›ÚHˆÌKOØw_øo__Aƒ¬³F˜åòWW¹¼f8˜‡å­¾¿Šv‰œ¤1Ë;¸E»bí|„ò˜î_\æ…­Æ00><9âà*×+p¨sÈ’\œÚþó±x€u±'Ô¤àú´[k¦àâóŒÈòªx Y]_è×tÒHQ/žåGsדñL?y S—L†xª+ì|üg°xED„ü:èÕÕ¤YÎ]‡A]—rçKC¿àÀ8 ó¾¯ Æ¥])¯+9ÐV;CDC÷S’œgq¢$/‘€wK8ÿ0ppÔú««­åÄü¥äS^@î8F´FºÂûw^á `S‹[û»ðy&œ¯›âìCÖ’ÒɺÞö—äÀHÈ^©y$c@\ý’w £±Í‘ÉäÛ‡½þ†޼Q ÃûÏ,ÚPðŽ(^¤X5TÓB*½ü÷€ˆï c>˜¸Iüö»†ìœªJ>WäÌÚ«ñƒÿjÕ3A ^í}'ëçlx³9®$à.×J?ŸmrP ¨WýƒéŽa²cf:×gë::›Û1˜Å&P p¬|0éÀŠXIæ!ÐõÞš³«Ôzï«ðQr ÝÀ4‡p]2À—_rp)íúîSÖzq9øQÖ™>àÆ»ï.VjÌ`ÀF2˜<ð?ØyTU9Ÿx•ÕX}ÉcdÑ jÆ$?C8üÛg<.c0?÷äá<üõ~è̺_üœ(HVµ3W…‚Y‡€Õ!Õf®¸h͆·ÞĪ7¿™a\ïþüŠ7óÔËfqÀ u]¿6Í/ÌÉüÈ]2n£×·ë>-ÄÀüÒ¿‡{p‰ ص=!=­$OÉô¤Í¡ßS‰{2€{¤¤µ—lhuÚSlê˽Øz÷ÝÄ2?ïÞŒv\âžÝªoþ¥ ›vôÚ8<.F3¾î#l½¿cyg‘TNÒ9ͳ@öH¸^¥_]ª«ƒ9_²Ò+ÆD„LÞ9p”À½âß÷»¿K>Š8‰§„OѪx…ü9•·G-¦Ø a£1àü%Íĸç£/Ì6Æ´a™KýñìZ1Fêê)ÎÖõzo›?øÁ)Y­_ëm2Km”]»mÛ¬ÍG9WNþ3¨šèU;Ö™zÞ°m[•{ž]m*’™é>[ÂÜLtKû.w®jHD¹v&yé:žHÚ4×*·9b0‹M)ñÊÀ({pBŽ%p–\bx! ²løl°dVÕá«›Šž@¹²¨Œa2ž58Hi û&u×’9éýﻯg? ¶UAX€ŽÐ×I\–‘ǃœE–t}1ŒúØN%ΣœóQœÂU5ÆÖ”ß7fç½8“$,òà Çm?ᲘcǬÏ}¸lixæûßçÐý÷ã¹ìcŒLŒoj6à¯LCì‚î#vΰ'†ŽöP0—¡È+" .ÏÌ‹ƒöZóÿ³÷æarõ½÷§zöMí–%ï;^äÛ`6ã•°ß›¼—$,7!!á Ü$p Ü„@ˆI€ç!$¼pB.„rpl6ƒÁØà y·åU¶$kfѬÝõþQõí_u»·™é‘Fšó}ž~fºÏ9uêTÕ9çûÛ“k×úPñ7Y•”i§sK!¤ÈÕkœ[€ má¼PÇmyva¬k2Üø¡ñú ƒÑÏ+B­õ$ëÓÝ?¸¯Dì“ù‘–•k œ¾í¹]%±,>ä.–Æ ¨®C ðdü"×$ ârJû­4¥h{°à^‡ íw}ñ‹ë}±†Ü㵜ÿªþ‚r­Å)‚µA5)tß<·=ûüpq­KHÞ…¹€Ç¶ÚØi~&Ü»í±?ŠX ØñàƒÀ ™hÔãùûï?h.F œØÖÛg.窅m÷ßß„V>Êç²á`¦x¾Á±©$ÔÊ]÷j†æ  šˆ¾œ¸ti‘Œ 3×ZŠI‘b¥ÔÂ,»A™^ h*¥¥áêÇ\AÆDé'#¦ý—†ÕHˆÜU±ñxNjIÚÓ±­±­É;‹Ä?%'+n¥sA¸ÎpL¯¹ÂÈuE™Œäꤌ, ê§*Üvª1ë˜N,sùëÞPÌÓMb•€ÕCpב°¶<îלÐ~Û‰iÕ{é©ZÉÉIZóùb é[5¿ù pÛ0ä[B›+î1,%åàé½aþ÷—-3?õ£:CŸbŸUNŸ4*Šå1?vi¹sÀe—ŸÏrLh¹#—Ý„@wÜ:­"˜p±¸úï* ¥Ëâbkçî¶š¶5Îë:Lèëña›´ý㱆µV•«+7Nˆ}Ð=râ*4ÿÒ°wcn;mI{ªv,áBkOntC”º(-ÇÆßøž÷”¤ñݾe Û1ᢃÃ#7£{1¡B®\rnͫܢ´¦õ¿*Š«ªû°«¿ ±¥oŒà>µ³NH°[ xöÞŽÞ¨ó᎙\˳wÞ9Ÿ]ªk\+¡Ú>•4Ëéï ÕHh%T—™$c&k¦š RÍ}¨–á`Þ§•úr$=#62Á ‰h/Àãû÷]cøøØö@•’ÔˆÖV8©¿ÕÈ[¼›@"DxVpj0¨øW'ˆÈ½5§"Xi:É!,~Aš{0x T¤ UÖ'iåB¤bc»FÂù%h, É14´]çÑ ­œóÏL†l;SûØñóŠ‚Ö À…=–ê2Ç¿re(âõÜhØo&ÀM´¼«vBúÙ½ÀŸ3×–GƃFzµsº›@lpΊð÷õ§ÛxÏì ã°8¥ÚZZJ2ðx,€v:î×Jp5’F_.0JUûøÍ?g;fY#«ÀO±ÌBªž+¡í àûÿ§­ìgð|œ|i¦5Ç­ kÍc$µ‹ðœVVF¢‘xü±”dU V ûÏâ~kGv—ºDõcî:“„ú`îH 2Ö¼Kÿ ‹‹Ðxä€7®°@€ÿÌg$ÀŒÅöàýtÜÞƒÅܼª%Ì—²9,ó“Îu ú²hÝ>DÌä²·!žCÖ7)RAÅ,&ÔÓL¬þb – í« smc¡¡’ÛÖ¡@¥{©š[Qù¾•„‚òã«#ÃÂE&4„Œ>ʦ’[RÑ"ù*« ëPüûìtÐ*Ðóu—œ@<È=G‚ªµvÈ‹´ºÓÀ—ö DÉua€0ÑÒ:–»~ˆˆ©ÖF*OºújöÈŒKÂÁ@ƒ‘œQ¬ 1ñÜ:—RJŽa•^‚_í+ˆXZâ[1áDšÛ»·Ùù6ŽšU`Kóªñ¸eÜ=ú¸óã–¾‡@x_zñÙ¸3Î`WÜÖU¶ßðHÁÚîŽ:ÆÃÿÿù˜¢©lL÷Ã`>ÏŒÊ}DqÝíáXpË×~ –Ýç ¬`ž¬ Û­:0˜IY®(Íí¿e`°8ÝÀ…¿ôKE¡µ xhgóS; §z×® î=ÞôŠç€°ö™£¦ šæ8—ü‰NSà{rC.»æš¢ÕL™Î8æšÃÝXŸ” µ ø½aNäÚ$W+¹×­{õ«Yûþ<æÆt"VW£ÜœÿoÆ„ Φ¦“ã÷`Y½À*oŸŽYöPjÑÓº—{ž¬…R*,¬:ù䊿×ÒNJLaeõi§•œs¶H i5w‘t{£˜i¿*ivki©uL94.³íÇÁF½ë©´ÿl?kN;­êx–ÿ­¦uWü]­q­Ôæ|ÏA¥µZm=eh‹é}3ï'dO9#cÒ€ÈÝvL#½ƒ@vb~ÿ­øïÞñ ãR³®%øÚ§ä£+†%Ÿú•À-·Žr¦U—{’bÀÚ0¦]¡ù•v¹séRÚb¥õ•ËŒ¬²DtcViu­r 9:iG7l pT‡iP:þŽ •²²Å"ýñÜy‚v=uÍÐÓ–\‹×œ'À¥Xé*,]äó{ÇȳÓ\ËU†d?Êš F?µ,8òWšÍ­ÍïpÔ2sJ5ëÇ'&MÀ‘p8M úû€×ö†c”__®1wN2®kLÓâªß"Í€±\¹VõħÃÃE×%U^ë`ÓLåáÉí{Š™ÖQZˆ¯ƒMGs[À4ïú¾s ký/ CñZ.h±u©uúƒë¯/Æ]ŒÅã&âùzb{¨e1Åâ{öÆöµÝ'm¯Y·ŽAÂúÖ|¶îÁ’¾)~g+b§àç©8ÏpõÛ`ü®ýò„Ú%š‹ápÍu×3Q©ªyè¡´"ù‘Ž3_÷ºªÛª{ÈÁ"g]sÍA:S)æãúš9‡g¢q™ Ó¹Ž}ùš)'îifC½ƒkÝgµæ­ëd¶ë¢Þ¹3á qd‚A¡8¥"T¥_‘‚Éäiÿ;° 6=X+eT™öä¡Ð*×—»0Òï1¡ãiÌ¿_¾ý |©Q ªrå+ RZîݱ¯ýëÝeƒ *²Ò–‚i}=¦–fx?Tm£ÔòÐÇmó„¹YM&à©ØN'°?o þÔué¢c`‰‹îZΪ/wÐÙ®¯·Õ\| æóûdkn6?ù$<óLqÜ”Ë0ŽS+!ËÔ›Þû®¢OÿàEçô3Ǽ‹@NwaY}”±*{Èc5 ±ÏŠ·PÜ fÉòtÓˆ "ÖžŴã²Dä“ÏÙ×^˺\˜ÉNàÆm00ÖÊãßýn±¾ÄpÁåǰÝÛðÀ`I=LiŒß~nøÛ?duSAï’–à^"±HíÒØ·V,ëR—f!¡< ÀÒLFwãì(8¯#\ˆ¾¬, .·Ü¼—¬0áöå«ÌÊ´bÏ<î¨â|IpQQ< HiöKàºÙS$ɲ¸IøðWœU˜•Ec¤u!÷5ŧL,O©P&¸ 8®MÞFª-+ˆ²H¥ekR;PÕŒ²0É}J5&´}Á•­#9N÷C:.û±µ®yÎPŠ…ò¢/wmj&!­åºÑìsÍ3Ñ"/4kÏB‡/û;SÔ#ÖŠ}Ô{ªÜb’öF…ñr®R_* å³µrh MÄÌ7Ø;‡ífËa¨}rªHžïÙÜ'äFà°ÜíK1—ŽpÙʰ-Õ˜ËZÐI ØÒ6*W»ˆ¤ö—kŽHŠ2Ëè·ôF,­EâFFu¼2©‚sor. +©ûFz>‘Dõ«-i{ xxÂbV´u}W G},Ðç oyô†Ø‹ýÓVkóŠ®3Ä:½Ë»héí¥³'ì/ùV,Çþ4°iÌ4ÛMózg~ó·)¹\|æ¾pìÆ¼iõ™ Ôhб÷žÝX¼†úÐùîç’> c« –Š\ü_såñ6NXߊdxõêþ¸s¿YÝútLœß>à–ÝáÿU7) <»£H¬9Í, ­ñøtŽ ØXh½€­E ºÆ'°œþº‘~ u©ÐÜUäV¥f ¹cÀ.Ÿ+Éöôßßÿ^^¹i½OaB¹j‹h|$8HЉûIËßN4ÓX‡„õ¡í‹Vì9jÌÒZ‹õHH¹OóÁBy¿ÒÿËÉzJÚgCà«ÿZç™+ªµÕLµú®Ê÷jÇΤåŸ#ÕÈs£häq˜kkKÙ¾•„ƒBíÎM=ag®ó»ÖÆ|" šˆv•€ -¦ˆ²\0ó]¸-oAÄ©…`Ó··í J_:—ŠIé|ʺ""¾2Ҭ@Ž Á¹[–´ýƼ(¤¾ˆÒØû<ßY=”ò2M™žS•cÓ¶%ä,ïŒ"o–ŠÝ“p† Sšåætá%¹c± Õœ‡½cŒíå”öpŽ£c{%ã6HÈ3<0ƺ—¼„ã.º¨hAYKiö 5’,ëÉY½aN·xK“š'ájÁ'åÌWpªbIRòùQçŠn1O¹~=¬i }ÛÐgÀ‘8[0¿‡R‹bT_AqÃÀËßû^ÖÆó߃­µ­¡_Ûâo;°²JÈ•G‚ñ²y×\%¿Y9–$íh ÀŠÛ¹éŤÊÓ²†©zðLhRPržûöâëÞø©O1н{üSÅ¢viegGX㺿\oÝ›ÞSág8™‡ ™ºž§°bf© ´¾Œ“ÅàÒ÷¼ç¿Õ"Ûµö›oÔ#n•ú0—~]öþ÷¿à|³%@õ\;f‹™^_3ÈÛåeã²1k³Öo—¾ÿýU׈©•;ÝVë³%ì•Úϰ° M„|¼å×/b4{÷»W÷á‘Û…4“"© ˆ‚A=̈„H[©Ì3Æ€×wɰ¦Óñ¦?ú#~ë¬@TÚÄ£‡Rÿ½X&¥}ñ7ÜðÁµûJ©´šÒd+½©È½b(N^fq$ש‡‘Ba>׌ÇC»J“©ÏÞ\~DÜÂÈ×é„Bpª"«¾ß5 »&áŠö@œGâXªÀšŠÀ•{À¦þUq¼¶Åk×ôIB{Âý#öÐ\JÈ\slìßr,P:O ÖŠäB5޹™`©? ’«t¥LÚù Àí6?|Í™²Üz€_¹(ôM)d÷´µ±&n—`òƒ~(}`+`9Mg›ým˜ ZšEJýMÝ`ä.–fêQ öpòw8é¿ÌS«Ç4óÒB®.Žm&}–EȈ¸¬.ÎÅw>üá!ó Ÿ¼{’~/ÅîãiL°ÓXÇö‡’ëÛGi Ÿ„%Ž…R‹¢ ëT{‹íÅùÈ·¾Uò½švü`jÑ+¡šå ­ølûõÐõ××íÇL0Ë@5!§‘ñN-õPíZj­ƒ+ŒËBÂL×äLÆ©q×ßaÍTŠö_1br‰­ÔN=K@£ý­u ÍD¥±Î,# šŒeX@¬ÇÜ F€¿úìî"Iê#…câ~½W  HÖÂÙVPfJ®~÷-ýE-«4ò7€ÇÆarܳñ/>Î m‰4‰h§™e¤½ëZÆÇY¿8˃Ulj˽¿xbŸ¹ •C™qZ 9÷;€‹V…¾¬Å„œnÌê"±×ò8nÊEÿ¢å°ËZð ÁÝH׳´ î™ Û:€¦å•å xz¿iÜOZæp ðæ«N,ºx‰(+˜:O°DœÿîßÁ„†q,«È´„«¡ØGYú1Ò|"¦‰WºR¹›Hè!Òm˜%¦=ŽÝK-¨[Ò¿ÜÆBþ¤ãSS,k³9—KŽŠÞ)Î@AÁ"Ųz©™¬9"ÂéÜilUKA‚F!Ù§ÒƒZ®orSK¨å¦3Iéyž##SŒ‡„V÷UfqYŠ-¦…ÒØÅKè¾H3v©â·ó¥ñ8í£{cXáL Ñþ`Jƒ4p_1²ìèþVºÜÅô Þóä“_êµp°,¢œð¸ä÷r4ÚoìÜ´iÎn‡ ¸µÌ»6mª¿Ó!F³æªV;•HýÎdlÊפ=Ëó”¶ßŒµÖ KC†ƒ‹Åô¾™w(ûŽ4Äž@P”«þ$àEñwù€?¿ £vwXªB ºYå64AÈŠ#òð±ä@ü}9ðŽ_qE¡b'°ÕËã¾Ó´a1 "¥©ËJ>žÇŸü=«‰ —pê#¯›ÿÜ?þ²ô, IDATcº ˆ´v>¿S‰LIû:<¼;ôa ¦¹€@¤dMQàòÒä@g+<1Îw¦ Úà´N@xzÌR^N›ÆÃï'`.[ÓÀO››Ôc–+ÿ+7=]LÝ*ËIž@¦ÛâœÞôÙ¿-ú¤·Èto2꯴ÍÝ„ÀÔ½Xѯ'ã¶,‹æNÙ¥&sæ’’>àwGÁæò‹áÝ·ÞR\CÊíŸ'¤O™Ð¦>+U+ÖK£ «8Ýû– S²x$ÇAi`°úª¸“Ô_5ÜÓõI»Äþ륿¥Ñ¿|I3£ Ž`µ ”)HZ| ©„Òúr§Ò9åú¤ûCÖOP (Ö¥ ØëMÐ×½«û ,ÀX¿÷ï»Ü\%´cëq± ’¦¯–&û` ¤jdÊ•m×oô¿–vx¾P®å.¿–™ŒùBÚf:g¬±JmW:OùïåVËôY\‰À7Òç™\×|¬ÝZmnôB@&4r¥{R€M‚@Ÿ!jŠ ‹d´Ç÷Å4š`(@QÕh©Œ)cäÇH•|ü¿õ¯¾¨É•VòN,CŽÈÜÊœùgç€ó „û¨õë9û¬3¹¤ºÞüfZ÷ÿu U¯>Þ PÉ""ÒvÓŸý;’1¢Tãýí s“:'‡¦å•öu³*¬k)M‹ªâ_9¹:óõ¯-V~ÈÙZ¿Â,,×\lî+ª8=Ç.½/~1«/¸ èC.!`y[è“„¢¢‹ Dû%g-e%¦]>¹ÝÜ£r7'Ï{V­wÓƒ‘]ŠǢ‡pž1 ³`dRkNã¦àê¯Ý {éeÅuvblgiα=žKk¤¼ì73¸®ùRí^J¤½—V_°'XLT?@m¦.nʶT T[N<~$9ŒTç⼦çšß¬¸^/pË¥ßÍQJÌû +†ιöZV;¸ÀÖ¹^”r%šŠc¯qPedÍ$KÖ4ëPJ’ô½+ûÉ›Ãyç"bVÇ^ppð\‚f‚z}iÔíI˜‰ pÜÅ7Ü×Ù¢Yã}0ÉØÁ—fb>Éjy»õÆÆ5ðÿL´þÕ•ƒ!Èfh2Á ‰ðXVi%‘"Si¦0×3ã~Ë€û’±+`Ĭ39V”­ùÐFo¼Ø:-žëîo~»èâ³¶+Ó <²×ÜGn¸VE÷eZ¹ŸtÆëܳ};S;vkˆXÞ¡€`‘n}(ŒÕª8.£.Éáxm›cßë qƒ”¦i• ‰ê ,6; – 1‚Ë ±ÿ²ì(K•q[±‚lÒâ·ÅöŽ ¾Hh¥nv<ø`‘pCX'¯\¿¬Hh‰û®¦4Æ#u’+›¾kß4[P«Î¬5£c$¬Ä¬=Š‹;Ö2J­0î§±8¾“Xˆã±{HY›:ã˜L~zš>ìs‹ýèÇb2$<‰0É…(M¯«q“ФÊÝ“qœÀ„ÅdHèP\PjySÿt_ -"•×Ú³Ï.þ¿…ƒj˜‰@b&ÚÎu6Ì¥‹ó†zıœ º ÇÌ—L;ŽÁÑql*­Éj¿•ÿ_ÍQëüÕ,óFî³Ãá²P MÆFšÀˆ¿'V5.Â:ˆ…–‘åûƒSEÿd÷¦ÙlDžä&ÒC  ®"Š!Y‚>·I˜èLjû³?ûYQÈԸ߾u_‰?üÁ’õÊK:‹±*²VtåLð”•fG<‡Ö¸ˆ´Ü}R¿zÅ;(½§Ã‚eYë#Ez%<ïŒßã÷¬âtGÒþ™X5ì^àn 3žGq-ÉX)Û‘¿b-tïéw /¾heQ€ÃRÅB¸ÏÀî£~,­¬24‘´Y`q=¨ïúÒ—a`¦˜ëõÜñ…/4¥³A#–˜;ù›Í¼k\‡5Ó,rÜ(ÑþÙ¾PâÎÛ’|Ò$ÕPÏâUÞý¶Pæb¡ôãpÂbzßÌ;¤U•¿¿\ADhÇ)%Ê`®)"N jU#˜¯¾´¼Ê€²s¿I«°¶ŠÒR¶`V†s±€ÒNB•d¹ì%À©m («ŽÇ‚LÓ 1©ÿé½”fQqX U]·„¤ÔKÒJ¾=áç䣺ŠÄïX, œ½a5­q? L…k‘›Æˆ±ÒÁ*ï½ú½+Ž q^Ú ýg‡¾øEžÅȳ¬ŠÓ¦ùÐ×eZés:lŒÈ; <2n1(àT…ZY”d½˜.û-%¯ê‹„D¹àˆlëÚ•?_׺ pä¢$«Ü|äú"w4Y $0L7Ý1^Ló©u÷lÁÎ¥uï0-µ--|šÝGä[Ù›Æ kCãT T«~þQáXïË9ÆHçZü¥÷E³ðA°Ø‡­»ñ:t¨¨˜Î—f"’û™Üý”IÊaV `ã]{Šó$Cb_Ót¤…8>;°z ²ðœ„¹0éü‹GÊK}¡”¹hrëY ê5*”çù†žA©P j§|¿jVòã2«ÑÜ M„ÜvDö‚~û°âFåyËÛ“cE:/?z '`yáEêSën8ÝàgÝ-¡µ±JÔ¬±­Ÿc~ö"ÊÓÂ-’ë‘`O­ I-×`Á•)ÉIûŸºNA ë"MÚ_Çêú÷`‚‚È®‹ãw€@´Ý1ÆÝÜ= S­ÀC÷ïb<Žu{¼¦æVø)k’|Ë劈ZNqнr%~åÊ¢ŽÃ‚ŸuŒ um­ÀÎ1#×'IßG ~ë°`òN‰‰–«™Òªÿp"6ïÂ\м*°Yí|rœ´Øýò?ˆ‘K¹÷ŒÇ±ÔZ®¸ìÔ’`a¹âˆ°J8]çGé@ePUk­[iØ ”f¦Jë@©;›ˆ A`SÛz™©·íx¡õ¤Õ[šWâuÒ¹¢…bYÒ7Gˆ©é[¾œããõ¯ÃîµÕ˜%J ­ÿ¬>‚„ˆÂ<ë>{¤édÓ8 Åè#Wº|<Ïsؽ‘Æc,&¸²¿µ0?è´ýCE^*ûPXJfâòÔH[@÷@µë] .AÕ´í¸êÌäåmÍemUêS­þª9lDˆÉP™`ÐD¨H™R‘BТ«AêÂ!‘dá¾çw²#" Ò„¦Ä.Y~û90šûî;P* (pS®H"¤ÒÜB !Ê·.­i;pé{ÞC+pâéá:äMì÷$¦U–P r¯Bo"z©+‰‚.%\´ÆëM+%Ë‚Ò Ü| Ô7ûê“JƒL'ß°˜à Äîä¤ïr£I­!÷yXvê©{ê©tQZäj29V7Ž®e$ù.r½´Óæ{s Á\†¤W›iªÍÝÀq±_š{YR$ØÉÂ!¡N¤˜xNY’–bBåVJÍþ"Þ… ¯e«=ÑE°êä°´¡½X5í>Ì«XÙ Ç.±yí&Ä[¤2YËdÒu"œ"+Æ¥‡Òô¨©?*(È"±;i#u_ê&¸µýÂý[1·'i÷w&Ça…Ù†0·@‘ûBòýyÌZ£àhõ,Lyñ)%‚„u¼[ª½põŸü ðBÒ8á`&D`¾ˆx­vëm«†×_wÝœú4¤ã7B5×±œ©p/—…N+]c³…áµecS¾ö=×L€…2 ¡‡2Á ‰XÓ4´iÉn¬ ™|ïåû=EM]mŽ©Fjgª­žIÿÒ}ËÇe¡»0¹ ÿ×Òr×#åµÈú?ó™’ãËŸ»åÇ.d’_õ®e!¯‰…„L0h"Ö_pƒ”f‡QEÛM'û·Ü9R÷‰”€ gšxiuCSv®õ˜Æ3Õ`ß;<] :0Â--ç#˜+G'VpKÖù—Kc-ò+r*K„iEeéÃ\h”ɨ»Í\j¦1눟\B$ðHãzþ1A œž:¾5Ř ¶Ÿàг ïZÕK'p¯ç|ñ2ÓæO`î<ĶEÀçQêT}ôPšœ.ާ\pN¿É*ÑÇuxr¿e ÒüJºm·¹Si|—c‚ÃÖÀæR4XcΕrâK˜ÑoŠ5PÆ&b[kc?×…¶Çâµ+mëVà»7î)ºIhíKÎ¥~å –£´(_J¤Òß4VB:÷©µ¨Ÿ@Þ{±€xÙ“FÈöÖc”Ç*^waq!"ÿ{ ?¡u¬Œí˜°$AI®§ôJÕIÚÇ,0|Rå€ÜSkι¯<“Å‚áÝ»_ð[#D/ݧ!˜O7™´™ö±Qí«0¼sç ÎT»ÝCMö!¤¶1—q9T¨$”£žpPϢ㱱©$‰BAµ1É„‚Æ‘ MÄn{´è‹žjç¥íSÀ«üô•ËFÚ ¹êEÚó>üÿû?û½Ò!"(M¯*ÊED>×"39Iž$¼!ÌMAç•›‹‚ž¥O *Þ¤`f]§È¾´Ñ²D¤Ö¹'­ŽÇ M‚´#ý"DÄvF0®t“Ol ßÏMÆý™i#TòÅ_<Ǥ+ !ûwp¸ ÍÑ<ºÏ4È"ó ô>©Ý²7=ŒVeŽš^¿.ÌÅp1Áíg8ƒjã!Ye†Z†=¨DÞ—`¾*ö%a€RL¤¹›0§=XNiÇ—ai;e]˜Æ¾'WÅ8"L#˜V~ Kµ*O¸sÙÚ‚YgÔÿæB—¦é• KH÷I…Ô%À)˜`¡ZÔZ¾ÐÖÙRòâ“¿ ³‚üùoÚ(íišYIÂezÿJ˜êŽíJÐÓ¸Éâ¥ý$dzJ…ŸT°Û… ·Œ%ŒaÁÒ+]‹­?~˜Å‚zZÒFÜ êi_µÏ|“…z®DÍ:µ±*×ÖÏæ|•¬2õÈb-+Jù÷Zm•Ïu½ý4j ¨w,Ô?®\ P¬Yún¯5/‡j¬9o­u?ßÊ€#™`ÐDÈ@dEä®ÓbŠ„ˆh>L T+“ãžÇˆ¢ }ò%¯*VM5œ’¿:~A!—¶þ‘x>Yv`¾ý"æi†‚ŽØÏW¿óLayõE.Uk ­l,ØM ]ŠÐy "•ˆ­H®r¾+ÓÆJBRKì· ¶IËÜû³#n=-¨·£SVA7¬zñ…EÁª'žïTLKü%—°â¢— ®ˆ¶®Cn!ßÞf¤ô‚õ§‹ LS*¨M´Í@†1‹€„¦ýÉõH`95«±8^ZgÉ~]Xª[‘ê,³ŽæÔÇóh-þpÈÆïï{_±Øš|éÓ@^оåkTñ!z§BbjUÞ%s! ƒ,„:YI†€G17­d=‰ ÙàÜ ¥žøë»ìœÛãõþõÿ¶t¤CÀYo{+0ak/–.´‹y×½'W­tý+mi:nºöÔš&ô¥ëA1?ÊÎÔ¬ì}ÛÃâÁ)—]ÌN£Õ‰@%Á`>1BÁéW]5û5ÕÜ^9f¶çj‡z\fƒ¹ïZÖƒrœvÕU/8×B 2Zd‚A!×i¸7¥'Lµëä-"fe®h³ß¥}ÞKðóÖï«DGº$´†Hqê® ¿ö•XõÜr-è‰+àÙûï§Ÿ@hV¬Z…^þ¦7•½Š8©¸[úÀ‘`#—þ\©»?Ù,Uš^—Ÿ’*KC;æ·¶çC¥é±Ks|ûOïb K­*â¥ñxì1}ôÑ¢ ¥þ•?XsÀ†%}Å€Ý%aìs / Wæª1,¥­ÜŒDPÔú­%ùÒOÄße]QP°RÎjmIÓ½hi-µ`øØæðÐ 7çAñ$Kâ¶öØG¹àÓkÚmiÈÁ,I6U>bƒÜ½ ÌãjÌuGî1*r&!v! ®?º¸®Ôç4cSªe×÷‰8žZCšc¹éÈ=ª3iWÙ›òÀæÛn+VaN]ŸDηa–;Å 뱕°fµnFâØ+8:uÒuîÇ^²øâ\È¥ëSLQ¥±G:øÆ7J¾Ïæ¥ÞÈ1µö™‹p0ŸØøõ¯Ïój#uUM35«í™î«¿‡z\ *­Áû›f ©0ns3Ù/ fŽL0h".]F ±Qåaý¦ Ä>‰íNëD_Ώåñ¢Æ±7þ•–RÙpÖÇ¿÷ Yà¥*Ëue¥…ÕDøßxU[‘´¥A´Š)Pé鄾 T áœò–8 jV°©´ñ°j¸"<­˜K‘â/z Ú\ò:™ex6a–, S²¿xÝ#¯8¾'ì³ Kµ©kMµÐiÜ„,,ý9 Èí Q`BTÒû·c*wçÃÜžŒ½Hå^¤Àà^,XY–ùÏç ÖŽ̺ðÊUa|'â\HsÝ’´#¡Ïaq*`&—,‘s¹Ë(žEB–•aîÓŒS@$H*l'V]جW/k‰BVlK„XkL}íÆ4ÿ7ÜrkÑ­JŸàìSŽ/é4–bPR Œ„J äš/¹NÉZpFKØ–ZëÀ\Ìt.C“Û”#¤q Ì»´™ºR×¹æŠ$ˆüKSö1Í_juTp¾b73jïÔ¢P-¨²ÕÈJ£¿ÖözÖˆFIR¥¾5rÎFµ¿©€Ú(y’K ,Ÿ© ?–ŽG%KE-Ë…ŽK]`¡±±m† ˜¢|íÌäüõÖE£m5²ž4'ÍD¹Õ¨ÖuTû~°çëpF&4·î+ hÆåî²4~&Ä8<5\'Z±@Qi*í¢¹µÈC“'uí'!B=¼åZrÿMS%9ù'“ýDÞ»€'N; 0­lXßfD,Íè~LàÉ|Ó®ëÆÔ‹[D1%|Ê‚sÿ>{:þÊ_ûµ"AÓX+á†FNóÀ£¡/ÏSƒ Ãs.ùÛÛè[·ŽþõëÙS0×’1ÂüLÜK !W-Êüå]ÀsÉXˆ wÄãO–êlå¢#w¤ïsÞ¥³MƒysXæi`…3¡!%¢SÀÖ„uØF :÷ñ]„mŠ3KÚœÚaZíQJ]ŽäFU~šç[†^fõK.PZ#Þ„ÁBìG°oø`.5å/ÇTÒÅ4ÿÇ'ã¤ó.žÌCß 'ïÅÏtîÏr Üpl§f8µ€ŸùÐ_ͧîE‘}AU®¼-ëŒ,WÄëV¢€Ô]i1 µ½qûH-âX åšÌzûÌ3éW#çR-å«iæÔJ矩¶^÷p­ã惄U [+ŒËÁÀB½/Sâ¬5SN¦çÓÊU齑òÙ`ÐDˆ {©éÆü¥sø@ÜWTG1·ƒ½”;JCë’öûâ÷˜eL‹›>¨Ê5) Ø|#“Òj…‘óVdëÌk®)¶!aç±)#“ÒÌËz0€¹PµÆq8;ú£Ÿ„¹I€ŽÿǾayñ•Fm¹xüm_þrÑ"q‚3r(¢¦¬1º™½õBK5Þê4꫾իé;ê¨â±ÒÞ*Øõð­Ï™?½ú¦q¿õ®{‰ã¡*¿)ùTŽÿ ÌÍ&õÁ×<È EÅÆ“ß[’ýÒJÏyà_ªý×9»€[wš`2lè ç\{þùEK˜«€Š{M›&Bl‚ȬÎ'ë“üý—Äã%\(«‘¬ )±—…ª3ÙÖÇg ˜Ø±«h«« óª:µ,mË͋ׄ}¶a/¦î8†²²½ô-o)Þ Z'cÀšœ“ÆHH¨ÛŒ ˜"õºçlÜ=&¨“ì“\ë¾TÿeAÒýÝÎÂ% ó«?üá†ö› á(×Ö× ê‘åjÛji(+µYë\•®ï ×]×°E R?+;S †î…4ãZ¥¾7‚´/ö£Ò¿.)âÕlZmœö=9S‚ŽM5 ÁLÛ¬'–g;ªt®J}¨Õf#Zÿj÷Q¹%i1=Gç‚L0h"”êRšØ»ŒdƒiSå»-R¼#«ã$þø”^0­wê:BÜ®ýD.À´îò™nÇ|Ó >i¡IŽ›nÿÄ'ŠŠÎ!­¯H±­UXüUñ÷ýÀý#aûfÌG\é*+ë¯*Àº8n©Ro<Ÿp6{#äê“ðJJ éÄc¾}ãF¿çž"yO³ „‡À“sŸÙ÷Äê>h\4F"‰rýáÜ‘\cšï_}"ŽRÉJÀÑ1•õDÇé|²0µÖÜ>‚F\ËÆñp·}þóE!MëVc æ³#ó W…e .ô´Î:iG‡±‡Ž²I‹¯±IÇa2öu/¶–G  Ô¢$’-!u3ð@Lm.¡CkÊc.h?ùØÇXiñ• hwÁ4þš‹q‚ë•د4¾c ØàíŨ`cÅ&¤Âxj—õHØü¦ÊÅ€ï}ä# ï;‚_o ˉC#B=Ì•8—ã†~p¶]i $èþÏ×Þ}ÞP>~7V¹µ¨ÖÈlæòp¿÷ªÍ|á`[j=Rd‹Æ‘ MDšŠ± xl¬Ô|)Fð”IÇc¤Gd"<–x¥ÚûeÇi•—]„³ Í]ÿ¶\,†(%²Ó2£vd‘z”ÉkÚá²ã¶AaÛÏ/R™öYÚS¥ÞÜŒ½\t¾½XP¶È¾Ç2+¥®r»‘«•ÜIrÀmɬŠ}R¿D»±x¹á¤þééØê¼û0¢§ Û£’¹Ð 3%ùº>¹]¥Ú”tŒô*èÉÅd›—T³®ú| 4m¦4Ý©u#}¡‹”Š\ƒUÖžHÚIÒøê²(HÀRÛi¶© àqJ­ »“1KI¾æVZ| ²š³ÔÑDi}ÕŽÜsZËÚL ¾ŽÏak6—|´NÒ¹—óLrÞþd»Öΰ1þ&!¦s„Zt?h\SkƒÚ¾ü‘Å‚©ÉɺûÔÒìW²T"hgJ ëiT窞˜Y´I3Éú®ç¸ •Јť™BW:.å󪸈4]òL‘ ñ•úQO~°ÉrŠ™®™FÐȵÔ¯F¬eB£÷g½~eÂAcȃ&B/v¹=ˆ‚圗ϱêhÁ+—¼ˆ4Ñy‚ŸvJEÔRÓ]ùï`DþŠÖ Œþµ8iÿ!«Œ']ʵ/+ eçÐ|“l—ÆYâé9RsJxåBt iKq" –`ºó±Z+Ê”¤stÆvONK®SÚí£1WœˆÒojIPKç‡ø*4zàÊãK…¡T¯{†J IDAT)}[ëail_U¾¡4KVXîì<íÀ…”ÎyêΣßòÉñx„>`uk+ Z–ð&!T÷’ +æL±)º­{ 8²Z€ fßÿ¿ÿ— X mc&ûÎå$u¦íÍ·¶ºœ(5B¬Êß;µö›K_æzŒ”oKspl'¬ï„žÜüXw«ÂlPo¾jÝ‹‹q¼'d‚A!‚!Wi9=pêI'æ"«‚Î'ø«ç ÚúõÂÞ™´½{ ¥)GSm«ÜV¤qTñ¦MH95Óy_toé®^a.>"u"•—¿ÿýE­·ªëvM#F憰`I…Žj· ØÁmf0jN=èÉJ‚‘ú¾+þµ&kAm\²Âfß!· ÔO\Ýç®5þ)—^Ê©W]U¼9¤_¿ï®8Í®³?Ž„ DÚ.¤VˆÔm JýØÁ„ÄÔ ±ÓÀ÷æ@$9 LWLÆ^ÌZµ ‹£ÐZ™N¾ ¼îÏÿ¼(Xt4üR*‰ ¨&„„a¹ÃˆäjýÉB£s‚¹"hª1ìó¥1 ?%<½"~Ù{ßË4V9ädAHco–¦§‹ãTIðK…¹ÅéþÒ=ªñLƒÎS9­Ï!¦c1aõ×ÎúØ™ýùÔ VTæ*œ÷æ7ϵ[/ÀL-s=®Ö±©&YhDØ+Ýs]ÀÊV8­Nî¾{7ÏÕrj¾Ë÷™«5¤PÿæcͤÖãÙ[ ͼÓyZsq¸! šˆ^Ì@fKiLw?õT1·º‚'Ê×Üq+; Q㸢‡±Ó\‹hnÃ4³P* è¯ÜJ¤&¸JÈw{E ÜW0&¹ÿ<½×®AĬ˜Áèúë‹7YFvvbØÓc_¥ÙÕ5®¶O†¾€¹4½×û¢•¢ Ój\Ðm¾ÿr©Ò˜N¿ÿ†ðÿÎ乆ˆØÝ½×R¬Ž$û(WãýÉ<Ý·=¤Í›ïº‹Ço¿½8G"¾{1²ûÝMF€÷c¾õªE ùH³½&Wú"Ñ_µCr¬â :“ã5Žvb¾¾ªF\û¡ Ö4hY—þB¨«ñ£¿ùHŽUߤù—%æœø»„ÀÔß8ŸWÞ]G꺔]kœ5.ÏÞy'9gU•%¨ü•b¥]«Uà Ä:u{‹£xúæ›YÛbÅáRKñÿ4xü,>(G©°Gr- –$ë ØÚH ö¥–µ«ûn–^v1`lÿþ3KA%¢Þ¬ö«Ó,²8688Ç6*O#„±Ò¸H1–‡qœ€ÉÂì…™fà`7=Ïá¾fjݯ•ƳÒ>‡j¾Wd‚A¡Üë» „¬8mm佘ËGêF²ø‹K.-æ›Ý;ZÌ\$-£4Ð""!iRíáø›—Èß40’7!%‘aÁ½ÄcvÅónÚTtQŒí´c®O-„”¤©VTE™¶céOŸÁ|°ÿ½Ï±/#ןàÅÀ®8HÊÄ£±`òùÌåGnG™SÕç¸ÿ‚ûÐI K ŸHŸÜæxüôäFG‹šfiƕⴅ@Ô$`-¿k~•¢3 †öÀ· ö¿H_êÛžja*‘Çñ¯*‹HŠ|K KI¨\~T{Bõ Rw½@vì( ÃvàÚóLàœ&Tc–Eà­WZ†# òéÕZW&#¹.¥.FéI`•‹Í¸‡³¢$1€Í»ê{HXîÁ\™t¿,‹nÛcßUÌNcÓl{ðAvå͈dìÓ}S ]{ò}%&¼‰Ôë^”UPH…Ä4fCsŸZ!R€#Ü{‹ßrKÕm•ˆc=Âíª|jµÙÈyÅ\‚rRóØM7Í¡'sG³´¯•,µÚ­§ùÕ¸¤š|¹£îÏÃÖQx~4 ©ëíLÐ, t¥óÖëO#}­f…iæš©g-©µoµkLŸuåc\í~¯t|º-æ†L0h"¦ u%FZîßnhR"“"ý®ÜõýÀñX<‚ˆÜg˜+Ÿn¥Ò$þÖKiÕ”XêÆSNö~,æQÀGþã‹n,ÀÑ˺øååFxÒØ‰®øQ`µÜFÔ¹ÉäØ-#VTL×ßÜG Z“}•½EýK‹µ9ŒŒCÐ÷'ã2MЪ?‰iáe!+Gl-ÁHçATpøLÐR¦bDzÛ ‚WæÆTnºNú[Ü+è·4|8iCãš>,uSKð‘ûŠæG±©åJkKÌ}˜%æÛ­’5˜/ý%„5ñÏß7—¡)J 穽=˜¯}Ž l•çAO_² ´?3áÌï^뤅Ð?]Ÿ„ž½ :ÎÅkJ3ülKú$Jã¦yXŠ ú(íkAX‘@$k™ª=Ëeˆ¤]­ƒvg÷G*N&çѽžZEj‘ˆZ¨Dö+ý6[ÒPMÀ¨$hÔúä*s(1“±n¶öµ™cP©_zVï÷áS~OÎõ<Íê#Âm#m”ïÛì56_m×âDõ°Pî£# ™`ÐDȽB†pi×UiUOä5õåO]) ѧ1-»ÌñQ=)‚ Á?Üa•`•ºRÿ§ '-PSLé‚võÓÿåíÅè±_Ìî}c|}À\I$äÈÊñ«gÿèÔ}äÊSJdJšy‘(=¤åÞ#jeeJ³+iŒS+%È.î×ßfäpy2-XŠLi¬ë–ëÙŽ¥#íVx"kO=07”PvSJØPjÑ~*f–f J‰`Ú>É÷ô%!¢«,N`)ge5Èa–“V’Ôê yO]wÒ D"+§_yeqýÉ•I7‡ÕØÈ'ŸÞ¤ÿ§$c-¯ÊÉZgêÇö临ƒ ¿\”ô[+Vçb)aíObÅçR!LBƒ„Õ.èÀêœzÞyŘ„ôþ#žk$Ù– OÒŒZ`ëTýû]j‘È­ÞlYuÊû KN%e‘Œ¾U«fL \•ÿ+í3r;á ’@0SRÓ·fͬú=ߨ6ÕPIÛ<—yé­0.%VÌRÞ á¦–¶¼Vû©ò§ž…`6r¥û Ùk¦ü^jtÿz×^K8¨vL=a*f‡L0h2”þ²óÓW®üÌÈ- /ù¿‡°ðÓJÅ*xLóù츥’”ÌVŒx¥fR ”ýíÆ´ù­@‡‡µ€©úíq6°. #+cTÅVY¾üPèoZà;O˜fWŸ4 Ó:JƒtÕ…;¨š°#¾ÕXZNí¯¶R †¦¬]¹¿ˆ¤M3»¿½ìš¢ÐÕ÷ïloÇwt”s uÓÀ™˜ßy>ö3GiÎú´ð–‚~åj"ízó‰têšÒZòï—{®IãTý –B5õß_ nê„6í×»bEñZ%þŽu†Êȃ&BšúVHJYbD‚wcde8þß\s²iØ¥%#7B@´c$9 ¬T:PG ¬"›k0rÚŽùcwcYmÆ€­Fºp÷¾ÀÞñ@ˆb½¨"ÙkOŽ—›‘Y¤%•_»nXU£íÖ„$]ƒHºRhÄÿG’ñ‘&\D8GãöããoÊ#V#aUÜWZi />ö{|°(X‰|OÇÏ3±ª] ,9r9êÁN¥íM³ÑÈrÖcÐ>:§H{¹ÀfòISÚj^4v`ä,pZ‚KJÐužG¿öµ’l8N‹±©^‚Èt«…¡>·`Ö b{Zÿi€rw<6ê4›0K™}XYºRR×ý6ÿ:¯îµ§'ÂZÛA©ðü£Ï~’>M%SË@Kk©Àa®drj'dŠ"ŽGšjw2Sõ-ܵ.$¨§®Hi „Å€ï~ô£5·W"|ê¡Ò>³!f39Wz_§î†Õúq¨ œÍõÆ£ykd<5.õ„‚™ÅjÊ|¢D¶¼ß8k–e!ñ…ЇÃ™`ÐDä± (Ó4JÛ¯ ÕQJÓf_}Òü–•ò±8Ë;¦õ=@iÄ­ñQ¦•V,˜XmèïHü´/í½•@Â^¾4ôe%¤¿"œóÂS[Š1#ñz†“>ê!íñ™-FHå‚#òy +Jñ ²ŠHÐJ]…¤Îa‡ÛFG²ÿ*,Qª ~ÓDŸßZª­]Ž“ÆÜa.=ªjÝA Ûʧ/M¯æ¦³®¤Y—ÔŸ´O)9O}Ý%(¦dÞ'ûL2)¹8©ËŒæ7% K‘™ºGi¹§é7Y­rÉ÷ËÿðYí¬¯­I;òãOÓ§êÚT¡l}ŒRú¢M‰‘¸¬ÝX†-gµ'· Å¡¤Ù tì$VÙXs qÑX òí—¥i80m‚¡²C¥žÚÙ“ŒŸ2BMç¸Ö®kVJ ÕoY§ÔŸ¹úEN¨GÆ«i¡ËƒøËáËöOÿ¯§½o”ìWHʵ™êo+áž”Ûa¹ëçL4ÍójçŸ+ñŸ-曤§c_é÷Jë°Ú÷rmùlÏ]O¸™íXÏFžIÛ)jY~šÕÙ®Õ ™`ÐD(w¼ˆÜë»,ȶ@pu˜"IiÜEP¯$—1,vŒðš¤õÀ1KŒtÉÏY®PzS(+Š*ÿ.MÎqUKØ®‚b­ƒáoàܱž~Nˆ…x|/Üÿxž}ɹ¥‰V0³2·ä >à石‚}æjFJãä í/ˆö$á»|ýEt¡4…d¥d:Íʳ/9¦“`iåå7^¬zËýþiÓŒ,:ÛZ[ÙÕÚZŒï_çñX:UÏ«1P!±±}¹SMg%í‘k= E2EÚ§“|þÁæ7OÈ$r‘f´I­ iÿå&&¡AVíÀ¾ŽŽ¢«‘‹û¥>¹cÀCŸú›}i°l.Ùg³xiÞTß -¦>úä{9q’p¦µU^†YaRâ®k]B)‘Žù§}ë#ÌÝvL׋£`J å)e¨ÜŒÀ”tS+€æ·xÐÛ=/AIîr– „ûTÉ”~8íÃbA-‚ЈŠÒ1éú*?¾Ñ>5²O-¡ |?) ôYhÉÂÁ ޤëoæ¹ëå¡k¡Yã4—µ±ÐÖÔBF&4"'¯„êú1#È÷Ç¿C”Vî~@xI¨ˆ•´É}˜Ö¹¸ûüiEå ¥ÚRi«¼¹+î£,>=ÀOòp†3‹ÆÝ""w nàÿüÏØ’Ë1LvcÚý£±B\)©ºâ„ @´Çþþûƽ|ê=ß+’ûàŸŸ´âO²4ìÅ®^šW¯ÇôcdPþ)JµÕ£±mˉHW¸ù[@vGÕ½H©\8AˆY ûŠW°þê«!Ù'%"…ÒÜkŸ<ÁÝJî4©„´®²=‡Y$dAIk¤Ûmq.dqI3ïÈç= €Vߤ-WjY åi;óÀóÀk¯»®DÛÿ¿âšW…8efêLæ" èiVJUG˜gY8Zñ"üêWš4O ËêûÃX%p«¿“„9>™Ò¬W;¹¾éº‡€ËþôOÙšÌÉ5(“RO<>Ð:–0,!@Õ¥I®1%†_ÍS¦¤©ØÏìå×›ŒÝB~é7kÞö¶ªÛj4WcŸZ–Jß+µK…íÕú¨5\óUþÑÜkÝÔ»¾uï|çA'εÜiæênSIK\M»^Ió,h\æ•Æ»’æ¾’v¿³µüTãzmiûÑï|gÅ}kY#š%„Tj¯Ú<ÍÆ2VKP¾}!XÝd‚Aq,4<¾×‚†åß.ð†…EºŠ ­&Õu˜FWÁ½X:Dùy‹”ä± Ä4M¢4–"dÒdJK-Íóò“;™6y#ÖJª6N[_úëÏ’/#Jevi'TÆ=œ×⊤®Ü¾9H‘¶L[ÛÇb"öeY¼¶Nà à”žR‚xÓV«¡ÐGÈ|ã€ÅöŽÿ«Ï{1­»È`xŠà_>0m‚¾eáÙ¯çÎÿ˜ßý.-ÀÊ¥KKâ R!@.'jCdþÍg– ,"ˆo9ê…ß”‹8Ëí¨%Ž,"ÂÇa7nZçÀ'Ç*`XÚñ4‹N?píe=ÅLFý±ŸÿÐ‡Š¤VB À-×ÿQÌ^‚IJæ%œHóYÞ/‘ AXÔƒ\í¥”®AÝ?W·YìËa휙Œ»Ú—Ûœú* Ó̺щ#¼ñþ°Úéý³èl³uŸ®KxÈÜî”\@󙯉h}ž\+qß½Øý9Ž òÄëÔ¸,¦”¥?‰ñ= Á‡êÂÁL¿W"hÉ둬TxUP÷G-ÜzÿýÅÿ…´Þ9km¯FìgJ+!—ùÆÁ"—ͲR¤cSmÌ«­ÑZ8œ-j# šˆç0R!Â#?iöÿí‘°ÏVb†›>x~:|Wæet‘»FšÑ$¹4(Œ¤°TŸ`æé<ËM©k÷8­À;®=¡ø ™"ËÕiã>ܹ“!¨2ÍO/c°1ïéÅHa‡7 ®°¦Å2Í( ¯¾> <*}!˵EA©cÀ£Aa 𠥤x"žgFŒ¬»¦'G7ð†;ØpzgI{ŸÏs ŸÇƒû÷—hòÊI½¬-„ïðÕ‡mÌO_fäùË;¾«â¾²HÀ('5+ãXÉ׿3n{6Ù·3Ù_–†4ÐY%ØÚn¼e´¨ÕWíÔø8J5„Œ+rœjÁõ‘ÛPªÍ×:ÐÚK3¥ët9vï(øvœ ¹ÿÖ”­ùf?û w<µ£{Mc0„Ç˵k4nß¶eKñ:%XÈ’1 ¸8xØuF†¬°{C­RQXÝiýOÇ L€L­¹äØ—ªHÉ"ÀÆ{ï­«ÝK×B¥ÿë‘üF4ŒÕŽ™ ñ/×(—ÿ^ɺP ÷Þyg=^x=sE#Â@¹V¶ž–¸1­f9¨¤L)ß7—ù$¤•ú)ÔZ{µÚ«tms¹†ò󕯙òó4r®jû4ÃúQ©_µŽ­¶VjíŸ )3ÃbRDÍÆÇƒ~tº­qçèÄ^øm˜æ>­lª¸€û'Àµ"±‹@6”}GþÞûâ±'aé(S²œ’iÓÂV²4H#= Ü?-íðµomc´½½xl/A“^,h5=¶·¶Ò‰¥H]Õ£è:„i¼t>¹Z´;Øã¡¿%ì§›ZDLÎ`Ùs.½¸‡ïß9ZԞʗ<bb_ûÚþNŒTÊ—ü˜Ø™·¾ MA¡nÜ“íalŸ}º€ko/jžÝôt¨ÐZz{¤~Áýáh TiΗÇù|$¦EZ‚‘ô¬à˜Ú= ؈YcX}fî)„ö(ÍËFÚð+W%½êá_¾îÀÒ¶ÓÓ¡ZwkkÑ 7&Å9´ÆëÔ:••¤%#—e½J…ª¡¤šwCCt}J*k’Ö•µFÕŽÚк—€!áD‚ÇÖHh×íZ[K2A)5lï Ü /m…{¦M@¡±KÙ»:ΕRÙ*âŽBX{ݱ¿µž‡eëˆ×tëx¸r=kŽDèÚóSÍP.<éSN²Rí{5ÒY:®Ü%¨VÛ•Ú¨·_%a¡Rÿ46J‘Ku”+é;ƦÂÛâH~–ÎÎûL–š+6lØpü<ðÌ¡îG† Žl\sÍ5§ó›ßÜt¨û1Èž£2d8X8’Ÿ¥sEf1hxàgÏ9çœ^óš×LµµµÕ? C† f€©©)6mÚÔ;88øø¡îË|!{ŽfÈa¾±ž¥sEf1È!C† 2dÈ!C|œ!C† 2dÈ!C†L0È!C† 2dÈ!™`!C† 2dÈ!C2Á C† 2dÈ!C† d‚A† 2dÈ!C† ȃÃι¿pÎ=àœÛïœ{Þ9÷UçÜú²}:œs×9ç6;çFâß_+Ûç¥Î¹[œsCι}ιÛs.Ùþ?s»s:çΫҗO;ç ιÿ^öûfçܘsn8ù¼6Ùþ%ç܇›3"Á9÷açܓιAçÜ€sî6çÜeûœãœûq³må}tÎÝêœ{ëÁì÷\àœû•xûã<åʶœsÊæéÌdûau½)œs‰s8âœûQÙuQó¼PPgÌ+>OœsïtÎ=ŸAƒÎ¹{œs¿RÖî±Î¹ã³j·sîoœsmÉöƒþ ¼·Æ>¯/›§‡“m‡Ûõàœ{ðvà*BíÛï9çºÐy>ä¨1æ=už'7¯ðÞ/#ÿKà«Î¹Sb»9àFB‘ì£ ÏµWŸLÚ8œçjQÞ£à¾k¾‹Ôš÷/ÇçÆæaàûιn8bßáæ™`pÃ{ÿAïýFïý´÷~?á¹Á9·À9w9pðïýÓñ˜=Þû´°Ç'€¿÷ÞÅ{?î½/xïïN¶»øÉ-”=âCù À;¨^yÝUù½x)\o³à½<Ž„k*;±þÿÂõþ±÷~Â{ÿalß}0ûÙLxïoòÞÿ+P«²l½y:ñ;À'½÷{ïÇ?Ús|ÄÍóAµ1¿6n¯ø<ñÞoöÞï‰_u_ºW_œü¾÷~Ä{ÿ\lû7œsíÉùK¢²ˆïÑFpDÞÇ ¼‹„Šóˆ×ê½ðÞOÖoJŽ=¢ÞáæYåã# W›“Í•„—Ìœsÿ ˜~¼Ï{¿7j^ Ü᜻8 Ø \ç½ÿïýι6´ o/;积{ïî\ÕgÇuιOÏÿø´÷~:¶_ÞÞAsîuÀW€¥ÀsÀk½÷Sqó¹ÀϽ÷…ä{€s½‘”¼úàöø à+Ñ-ãYàsÞû¿×†Ãñz£€|p—~óÞçs÷ç^v‹qžç uÆü\ïýWj=Oœsg?ú€Aàïý®¸ù\àiïý@rÈ=@7p*ðСzžDQ÷h#8Òïã ï¢_HÞEBÕyLj¿‹ßϾz¤¾Ã3Ì2ÁàAôKü‚öDXIp1º™@úû /¯–"¿¼Ø\|Í9÷*ïýϼ÷üE…s¾¸ˆ`Ò¯†·÷c!ä+sïfy©M÷þ[À2çÜ2à£À·œsgyïG€%˜–RØÿ.F^O.îòòŸs­ÞûÏÚnÍ KâßÁ²ß÷ÅmŽÅ7Ïózc^õy·=H¸/»÷ßtÎã½ß¯ÔnzÞ#Gâ=ÚŽèû¸Â»èÛÉ»jÌ»÷~Ô9÷à£Î¹_F ÷–#¹'ŽÄwx†ùCæJtÀ9÷zB,Á[¼÷7%›†&¾ÿ齋š·?®vÎuÃq¿/yïïnDß~ˆ™!«sðyàeÚ•ƒ÷þÇÞûÑØöíÀ‡’àçC ïý>à÷BÒ•ñç! ¿l×eɶ#ÞûF3ü´÷þ;?Ô3O³„æªÒ\±çù  Ú˜/gcê½?à½ÿ8ACùKIÛ‹v¾ŽÐ{´,Šû¸Ê»¨‘yÿUÂ}r/ð!Vå1B,NU)ïð ÍG&æpν… Áÿ’÷þú²Í÷òBß?sÑåè©JÍV8®~Œß‰ÙvÇŸvÎ}»ö¡ ÎO¶%~¤¡ÙœçœkIö¹x*ÑâdXàˆë{3A#€s®•`bÿ9pÙ<75Æü\Â}5S´c Œû€œsË“í€ÇËÌpd`‘ÝÇåðÞïöÞ¿Í{Œ÷þhàÿN x Ô‘ôÏÐLxï³Ïaú!W /«²½›à³øi ƒ`þûp}²Ïïü7Å7L†Ö9w;!3ˆ>ëâ¹þX÷9™0ØÛ~ AùÔ!·÷«ãÿ«WOÝñ·^‚æc±ïgÇk{ó9\s.^ËU„·îø]¾¨Ä9mûìÞ}¨ûÝ„ëþC‚_î™@ðq`K¼þ¾#mž§֘×9î·ÄDn‰ëðè¸Ý÷ÿïÑ ¿:Ô×ܤq[”÷è\×Ôá|7ð.ª;ï„øµq2ð}à†Î}ؾóÏ<¯ËCÝì3‡É / ‚F-ý¼,Ùç4BÀa`[|ðô—µóø@"m½a–ýy†`–Ô÷ Úey$ž«åÛ À‚Vf !æâ„²}9JœþäPÏ÷¯ùmq½¾ªúûJB|É#qì‹söÎCÝç&^ûG⎷g©ó¼P>µÆ¼Æ1ïÇÑû&°¡lŸc )K‡ ® ´êëmÒ˜-Ú{t®kêp½ë½‹™wB0ñ–xíÏb Úg; iö ¿IDATÙŸÃâž}æ÷ãâägÈ!C† 2dÈa#‹1È!C† 2dÈ!C&dÈ!C† 2dÈ! 2dÈ!C† 2dÈ@&dÈ!C† 2dÈL0È!C† 2dÈ!™`!C† 2dÈ!C2Á C† 2dÈ!C† d‚A† 2dÈ!C† ȃ 2dÈ!C† 2 Ž08ç>çœûß3Øÿmι-óÙ§…çÜ+œsÃÎ9w¨û’!C†C çÜñι‚sîÄy<Ç[œsÍWûó™¾gfÐîιB³ÛÍa&ȃ ‡ œs·:ç&"‰Ýïœ{Ä9÷ÿ¦ûxïßå½ÿÍ&Ÿw³sî î›sÎ=íœuÎõ7³óïýmÞû>ï½?Ô}É!Ãìáœ;Û9÷UçÜ6ç܈sn‹sîι·Â>Ýêœû³ô7ïý?{ïOŸC›çÜesïÝìPþž™É;"C†…ŽL0Èp8ÁIìRàÃÀgœsW„ó6ªMÿ`%°xû¼õ(C† 8ç^ Üì^æ½ïNþxÓ!ìÚbP8Ìä‘!ÂF&d8lá½ÿ7`/°A¿9ç¾äœûròýçÜ ÃoFmÓ±i[ιw:çžqÎ :ç¾îœë‹¿8øl´TÃwÄÏלsk“í5Ÿ•qŸ×:çŠ}¾Ù9÷çÜ3em|9þ_ñQþ.Š¿•XOœs8çîŒÇÝ œSáz~Ý9w_ׇœs¿<›qÉ¡Qd‚A†Ã À9×êœûoÀ2àÎd»œs­ÀÀ&` pð^¨Á: 8 8=~ÎþÀ{ÿ ÀsÀïFKÅÙU;ˆúÕÀ—€/'9ç®LvyÐ -WÄcÏn&ÇÄ>ý)PpÎ9àñØsµÀƒÀι–¤ýkÛ€U áœs¯ªwî øÀï¿ ,>\ïœ;¯l¿7ënàºjc“!C†ùƒsîTàdà+ ìî ÷ê1„gÅw€o8çVÍfçÜÂsçàÂ3ùÝÀ˜÷þ·ã6Yz—T9ÇG€woûœü¸k)A|ÞLžœFxgü§•ž•—Æ6N"û–¾7Šï™ïÏ ß5éûi ðÝøYü:A±T<ư?Þá½ï~ ø‚sîe3› E&d8œà€?tÎíÆ€ÿ¼Ý{ÿ“²}dÒ} pðÞûqïýóÀÇ’íÂ4ð~ïý„÷~ðMà¢Yôï·€ÍÑgÿyà„Š0¬ÎpÎå¼÷[¼÷Æmï~à½ÿ\ìë”÷þÇÞûIà<àà·½÷ƒÞû)àCÀ ÀÅIû?ñÞÝü ¸/¹ŽZç.Ç;OxïïóÞ¼÷ÿJ ï,Ûï¼÷ÃÞû!à«ÌnÌ2dÈ0wˆÔoÓ.Ä싟1çÜ+¼÷{ïoŽÏ»)ïýGd´âýÛÀþ¿<ï½ÿ_Þû‘øü¹×{¿·‘ŽGÅÇïÿÓ{O<ç¾ø ›)."¿ŸMû ÏÖó'ûUzV^·ý?ÀFïý?ÅçßÀ?QúÞp¼ð=ò‚K«³Ï€<ð§q\þªì˜ß>æ½ÿ9€÷þvàëÀÛêœ;C†Y# 2NðÀ'½÷ËZ©þ—s®»Â~ë€ïýh²íÙ íîñÞç“™tÌ9×A°F¤¦ãÞàœ[¿¸ ø{`O4wŸ·O°lTÂ)@+°U/z`á:Iö{¾ì¸Ñä:j»ë§Ê~{Š`.O‘žoÆcöÿ·w¡]VqÇßK—ùgm­(Ô2¢VDLÂb‘y¢FuUп ëˆ#/ì´´¨¼ðªuÑeut—­Ñ,¶p™lý´¾]|ÏÖ³Çߟ©-›û¼àÁíù=&ûžçœó=ç1³ÍÏåßÉxß”XÙtðÏhëe%½æeZá8°¸¸Ñ§Qþ `ïi\{9šÙ,þŒdÌÿubGDŒãL_­bå2r ªQ½ÑN£ƒªåÀpmчïke®* ¼q`#9jl6#Ü0°Y)"Ž“ÌÕ\Ôjýè–´¸²ïòS8Ýt–»›¬à6•<ÛƒÀàr$ˆ8ÏEÄ*r$ã8Ùx€¬z›{ø艈®Ê¶¨ôæC›ÉomÎ]7L¦%T]É©UŽf6Ã"b/°¸¯ÁÇõ¸0±Ìæêˆè,‡ß”›nùäl3íâçaàÍãßɺTYNR7Ù‘T}ØoÕ“?‰õDýûú£{ülðT-«|=¬¨¥8­¬•?ÀžLù·å’¶JZ¬œH¼ZÒ…åóQZ<ô—ó×Êd\Iê–Ôßæ~H:¯º‘ó͆ȉÀK$uo__´8VµÞxX%éÿn"Ó¥¢V¾ªQñ%p«¤ÞÏŸ`êƒÿdÇÑI’®6ÕŽ±½|¾ºüvHºQÒ -îÅì´¸a`³I£¡ÙwÈ^•§êe"â8™Çy-¹„ßÇÀ`)w¬Å1ëû¶ÊPîžúEIê#sý·EÄ¡Êö™Âs9Ùm%9©mœì-ºx°\ë·ä„à{É‘ŽQàY`^Dü¬%Óu>W®ì±ØP¹Îf÷1¡é¹” +Ó÷ÉUŸ6wNä¹6(ßìüfö‰ˆOÈ8t °›ì±þŽì ¹¿ìƒÌçï#cÁê/y¬þ-·,‡€[È…#;Èô%€W€^Ic’Æšœc Ùñ0HŽF| ÜÜæ–?"câÄ6‘2º®œ{™â4X_IÙió#b?pðt¹çmä*s4*_4ª#ÉFÆnr´¢øtò™ît{Ù“ ¬7«Çˆ×ÈE(v’±xx‰\ìÁlF(üN#›C$ÝA.é·°ma33›ó$mzË Dfg5ØYMR¿¤«Ëðt/Ù³3ØîçÌÌln’´NROI‹º|Y¥ë ›Î=Ó`6Ã.Þ%WÐ#çl>£WdffÿgýdúÐùä FÏGÄtÞa6ë9•ÈÌÌÌÌÌœJdfffffn˜™™™™n˜™™™™n˜™™™™n˜™™™™n˜™™™™n˜™™™™ð7ÞþÊÃuûIEND®B`‚reproject-0.3.2/docs/images/index-4.png0000644000077000000240000016252012724021736017614 0ustar tomstaff00000000000000‰PNG  IHDRûbhXsBIT|dˆ pHYs M MÒέN IDATxœìw˜ŵ·ß³QZI«œ#Ê €@"ÊH"ƒL¼&lƒ1øbÀL6`LÆ\‚1Ñ&Ø|6Øä 09Š$!„$$”Ó*l¬ïêž­éížé™™žÝ©÷yæÙíî §ó¯ªO¥‹Åb±X,‹¥õQµ‹Åb±X,‹%;X±o±X,‹Åb±´R¬Ø·X,‹Åb±XZ)Vì[,‹Åb±X,­+ö-‹Åb±X,–VŠû‹Åb±X,K+ÅŠ}‹Åb±X,‹¥•bÅ~ž "?‘ãW-"óEär)‰Ú¾DˆÈ¹?KeŸ'"Ge¡Ü%"ò@’4ƒŒóñSŸííDd‹³ýj϶ýEäùVD¶‹È2y^DN4Òœåä=Чì[Ed‡ˆŒ aßiáö:û8ö\‘$ÍϵîýU&Èëîó)™·ÞRˆxž½Ã|¶ïolŸj¬ù±ˆ| "ëE¤JDŠÈc"2ÑH÷„ˆ¬‘žžr‹EäCç9_¾Á™Úçæ`Ü¿û%Iwe‚{|V’¼î>ȬõùˆŒ‘™"²ÉÙÏ#3\~GçøËd¹Fù¯‹Èkùf—%˜¼‘ʱÀr p4p%и8B›’1Øœ¥²ÏÞþ•ár•ó Ãà‡ÀŸ=ëŒò‘ïÿžþX ¦‡(¥î‘÷ŠÈÎJ©*'ÿdàlà ¥ÔÜû’O„µçÀ‡>ë«äYL¾NÕ(‹% ›Ñ÷ùåžõ§¢Ÿ퉿¶oB_÷8yjÀQÀ4^ÛgsÿC?3\.ÆS”RՙܑwÖÿ/p»Rê7F¯ÿgÞçJ©5"òKà!9V)õ¤ˆ GwäÜ­”z3{»”¼¯”jHž¬¥ÔZ`m–ìÉFÿUJ½”åz2úî‘r¥TµRê«æ•ƒ,¡±n<ùÏ'@éꮑ ¹^D;î>‹Däbóc|j=ZDt>3o‘¿ŠH³'Ý5"r‘ˆ,ªm'‹ÈgŽ+ÊyXDzyò7q‰‘Däo"²ÚqGùÄéñÆ“n7ù—ˆ¬‘m"ò•ˆ\ä– N2>ÿÞïÉûogß¶‰È["²Oç:6nw>›ï›Ê Þ£…€[f?` ð°OúÎÀ¿‚”Rʳ¼øp–cûåÀ0à´°- \Dn‘U"²UDþ#"Í"òç³ñjÑ®G³ÄÇÆ9ÆW‹È9ÎõµÙùd;Ú“®Ø¹fV:u¾&"cBÚ›6ÒèÆsª±îAÑnREä]ã::ÌÙ~¡ˆ|#"k­›§Ì³|ëDdƒóÿ¡>u‘çœý]%"7ŠÈâãnà¬7ï›ûD¤s¶Ž‹%#< ôn<Î3ü9E´ëÓ6yCD†‰Hù‹s'"§ÓÊÉ[."·ˆÈÎñ[é¼;FøÔ=Môûj»ˆ,‘ÓœgÌbOº¤ïaŸ²§ˆH0ÝÔà,»Û6žaîój¸O9¿‘yN½+Däéàl¸†–Æwç)Îö×EäM™!"³E¿ŸçŠÈqž:\7¬1"ò¢ˆl7ÊxÍH›ôšJf—%Ë(¥ì/~è^£`°gýhñ]ê,—o¢{=ξ‡îõßÜhä›â”·ýb9ý9y30ÓSGÚuè¿è—Û@à gÛ£ÀÁÀièÔ< ‘1p¿±ÜX |œˆv_ù úSîFº=€mÀ§h!=Å©ógûX´ÛÆsNÚ=€œmãÑŸ‚ß@»;< ìÆuœæìƒ{ þX†þtz’s2ÈÉ{pð•±í"`±qü®2¶ý¨®v$I=ÅÀÇÀ7@ p]ÈkƵo©³ï‡8×Ñ ç•i/vÎÿÀèF ð3Ÿka1ðÅX÷ ° ˜ãìÿAÎu±¸ø·sl~ì¤{ÂSæÀOã2ÝÉÓd¤)söo)ÚÕã´üÆ9Œ´×9Çöαùúþz(ŠúYcM®©9ç{ðp±íà!`'Íƶ¯ÑϹŸ™ç?A=ýÑÏ_÷>98Eû¾1î·KÐï…Ç—9ù÷Kb÷•Nº2Ÿû<Ù3ÑÝgó¾Z샷#Ñ.0ߢß3Ï9Çf*p•“÷,#o¥slNöC»ž¾„v±ìi¤í¯ÿu|îÔ»ÈHê=ì³_€=ÑïÑÿà¼×œm£Ÿ%/¢Ÿ½' Ÿ»«>Fpöïv眜‡v3{Ýc^|ßIs ïήNþ×€•À´‹Ú!Ž-õh—2ïù[ˆ~ßMqÏ9ð:†Ž Ä5•À®nQ? á¹ö眈ƇÛpçAÒø Úô#Ýtûxò_ì<¤º9ËîÍ÷œ'݉4}i¹b¿ÜXWì<^õäßÛIÿ cW컽V=y_>1–ß@?DÛ$8.‹‡}Ö¿Šw¦ -¾þe,/ó9Ç;ûVìÿØÉùß}0Ï®6ŽŸ)ö»£_ Îo#ÚEà¸uDã ½<‘]>öÍö¬ß˵; _‘sýí6fnk@7LaïŽM˜ì,wFûÕÿŸ'ïoHMìûý>¹Ï^±wO Y h_i1Öß„â¾bÃ86/Oë݆ïîžôŸbˆ}Ǿ:àÒ€s2#̹µ¿Üý0:ZÐ ÂõhaÒýüj\³æssOôóɽv—£åÄu]ë¤ýGöyï·‹kmX@¾bçZþ ¸ÕXïîËžôwÛåéNºã=éž#5±ï÷»=ä>›b Z\w0ÖýÂIw¯'ÿÇx:µ<Û‹€ tãë—~.<(¥Ö(¥öG÷Z\ŽîšÖ³<íØÃYžŒnÈz]˜R½Ï÷¤é}~CŠe¸¼«”Úb,»÷ù‹žtóh|^ "Ç‹Èû"²ýü¯BºöÞçÏ™ï$¥Ôwèg¿IªïᄈH;`ú«cÌ­Gé1boÓø¾ä”ÿWOO8ûöù²T㥜:ŸD¿³¼¤#Ù5e‰;@7ÿø>Z¨õ@ô<í?ÿ±³½Ú߯Ö'¯ºzÖÅù”*¥jœ‡]_Oº•žå.ëÝ2ù÷@¿ôNM`cúEµy×{–ÝF ëì{\:Sa¾R*a¾Øh.8×9ÀOºçoén ÎFv^Š8W#|½ñß?ï1p_j }Ò*ï+K¢”Ú""O¡Eù <>ékÐBóEÐj´›ÄÍè1&:¢ÝkžB÷òÿ"ó¼×š»Üש{<º“åyô}½ݱs÷®I˜û|ƒÏs(Õûüc•âÝÁ÷³ßúØ>‹ÈèFʃh—̵NyÏlzá¿«Ñ_~\’½‡S½Ï;£; ‚Þ·îØß÷²ñN [¯ß;cP&"Ý•Ræ˜3?›‚HvMY"Šýüc¶r¢ñˆÈL´¿à#"²‹óÐ]‹þt|\@þo<ËÞÁ´eèË·žtʳìÞ´½iJ/üC&º¬E»è\°}%úÚk@÷¾§ÊF'ïŸè]7êðÆ·.º5Mž”¿£ýJj/i”R›Dä´KÀ(´¢‹Þ<­”ú«èAÉÿE‡å :~^zù¬ë ¸Bz2úe±ÓëSwi*û``W34hOŸ´¹"Ýè£ýyWJ­ˆ¦{ÚLV¢Ï›ï>»Èé4 ævKþò0Zü •ŒJ©"òwà<é¦tTDd :òÖùJ©Eäàw"ò¨RêÝÅ÷Âÿ~sŸåÇ EîѦ@ÁïZLÆJ ³ˆ{”÷yºüX ”Šun8Ï?oçØJü÷¯'ñïÈTßÃÉØà”ï÷,ïEãûØ|/Ç®çÖ•¦b;ˆ wFGèCþ…v¶¤uãÉcœ^£_£{Ý‡Ô èÏ“[•R³|~^1q¼gù8ôyOö‚ù ÝÒ{Ù‰È^háøz‚¼/»_ØX£”Ú†Žrs²x"Jx¨F»ŒÄPJmE»ÆŒEhR‡“t9Ú7Òër ºw>%”R›Ð½qO“àS¶ˆø5 ±§Øì)¹ ýYöçNo÷WˆÈЦkF€‘½Ñ½}î9v_‘¦3zZ:òÏу£½Ç5%a”aÒ}!ù›áè±)&ï$~²$A_KfÝ/¡¢®ýTE€%÷¼Œv‹¸[Ìsá¸mx…¢ËHôÀÄMNÚ¶èñ1(¥nsÒ\nðß—B£Ûû,ÿúZ{ßY® qÞ×Î𸳤À;èçä±>õ¶4*hëÿ‡4Õ@ï‡:ç ˆ=ϽσTßà qÞiÇ‹HÌ&ÑQÕö¢ñ}ûºAç=ÿƒî@sÓ¹=êmñ§¿QšDG.:ŽÆk)[$³Ë’%lÏ~ž£”úˆ|\*:ìÙßЃÈ^‘›Ð« IâàûJ©íF£E‡«|í›ø{à5¥ÔkIêm‘Ë{Dä§Þ¾NþùÀý ²_ŽöQ~CDþ„îåèŒvGÚI)åÎøzºû]g_¾E*ÝM)uŽ“æK`_ÑaWkÁt>úëÁ‹"òôä+ÝÐQzŠ”R¿uöáwèª{ †¢]Y6“Fo°Rêêä©xAD–¢£ÀÌG?Øö~ ¼ãŒ{@txÇÐqÌÀ…èsy/:BL2:O‰È=èÏË×:õº_=ÞFïï¢g·m\Š8[mJ©"r p‰Žíe´ß°ŸKP"F‹È6ŸõŸ;ÁTH·gÿe´ÐXDnF÷˜]‰¾fM!ð ú¼üSD.A÷ìŽC(8"K)µHD®G‡X¾Fw …Á4à>¥ÔëiÚjÉŽËɉI’u–ˆÈãh7°åèžÕ ¿]¯”r]<®BŸÿXèaÇíâtt#òô5—ŒCDäô5ëŽzH)åN0÷)¥ÖÛŸpÞk³ÐïÆŸ%°9Ì>$#™]–l‘Ψ^ûËü} OèMgÛtgÛÙÎr9Úïp.ZH¬C·È/lj¢Bãèøï ›Ñ{ºxÊ‹&ãÙv:âÈôCá!ŒPeNšÅÀ_<ëú¢{³–£[ó+Ð~­'zÒE‹â èÿKàׯvW0mÅA݃öú²Ý‹ÿžvèÐhKÐaÑ>@÷”ÄE Ø÷A„ˆà=~è¸'Ð/Ç­Î~ÍF¿HÚ9i: åkeá”{ZûêѸoBû•nE‡QèIû=´[Ï6t8·³k¨>Ùµ€œ"ô f¥SæLôK'L4žý ŽÒQ:5Á91my=à,áy ºÏÐ=Zsëã çü=€}ÃI7ý2Þæ\s·Ð¨ƒ'íÉh!W…‹÷%:T^ŸDÇÆþrÿó»&|ÒLqÒà,—¢;+^D?wªÑ=ùo§ùvGûu_PîMÎu7*„}û Ÿo[ÐÏâ;ðDîrîëEÎ5ú>º³à5šFN‰í‹O=fœnè5›ÑÏèу—ëIçŠ÷ùæçÄzóaOº }‰{& …éÕè†ÏV瘌Åç=€n”‚~§,D»mþ=öÀL—ô=œ`ÿšDãqÖ„þ¢²Æ(nM¢-¡Ãm~å\wß:×B{Ošè¯G5ÏLtïÿèqb_8¶ÏÅ-ÎÙ·z|Â7óš2íªÇx–Û_ö~â|K+Ãñ LSJÍÌr]ëÑ=–©Lc±´xDä`„RjXÔ¶X,–Ìã8XüG)õÓ¨íi."ò:ZÀÛÈ`„u㱤èYUEÒ~/bs,–¬""ç£{꠿̇¾þÏL”Ïb±´œ@ ï ¿F÷A»FuD¯j-4Ç%ÊÒ±b¿u“íÏ6× #½ÜLj±x-––Èôçóè‹_¡Ý¬ˆÔ*‹Å’IÊѳ`÷D»š¼þB>;a®–ƒÂFØ)8¬Åb±X,‹ÅÒJ±=û`Ê”)Ò©S§á#FŒ¨*-M7t¹%S|óÄ»tܱ£CÔvX2˶’’}N:)S“pµ(vìØÁÂ… Ûoܸqþ믿Þ*{h¦L™"_}õÕKJJ¶‘d-qón0&åX]––À««á†yÉÓµF:vì¸jèС«Zó³Ô+ö3@§N†?ýôÓ_Em‡ÅÒêùý Rf̘1h•¯éN: _µjÕCQÛaÑŸÎÜæKž³|ùræÌ™ÓªŸ¥~X±Ÿ†Z°lÙ2*+[OWÈÝwßMuu5çž{nÔ¦$å’aè]ê,îþl?žÅ³g³sMMòÄ­ˆê=ö`Î0>jC’pæM-ïž{ªŠ_ýêW-7“lÞ¼™þýû3bĈª¨mÉîs´µÑ¾}{:vìÈ·ßz'-Ï?¾˜*’§ ýUi¨©æÌ.ße¦À cز|1ç HuªÜÓñéÌ•5xð`-Z”¹³ÄqÇÇ?þñVý,õÊý Цž¶²²²U‰ýAƒ±víÚ¼Þ§û~÷;¾¸òJŠÐ£ªÂ’èÛ]·¡CùvÞ<ʈ}ÓÉÀ[VÐ6ñY— $dvÝ•y|@Y@&Q~û¼ï׿æü{îÉXyãÇçÃ?ÌëëÜ¥5» ºÏÑÖF¯^½=zt^‹ýs‡Â­c3[f×î=©Ý¾•ÊÒÂû½z EmXEeiþ‹ý£ú¿2tYüñ\wÝu™),‹¸ÏÐÖü,õÊ}K ‹-¢&{·Ï-.††ÆI ]ÆÛ7‘ð~õïOš?¬Ø5…v*yÂÖ“Lȧâùüô}÷Qœ$M>88.¹÷^È ØóÍ7©¨ÈPw¦ÅâaáÂ…,\¸0j3©=J²0DbÅèFe¾ì|fÞ̧) WÔ–$矓AžÌLY-Aè2Vì[Ùwß}©¯¯ÚŒ&\qÀl|íµ&ëSy_)'½ŸXi¾„í7 a{ã½ù‚ê C_ô´¸A¤*ôSÙ‡T¹`Ð n\²$#eM™2…òòT¾ Y,-ŸëwߌÈ^ùûwË^Ùù̔£ùÆ»Ã?ŠÚ K¶±bßÈÞ{ïµ q<ùç?óæg4»œd=í}<Ë™­aÊós Êã6‚ò‹çÿ rúùäñ+ÛKP™©6ZR¡æ›oxçµ×Øë{ßkvYS¦Li¾AK ¡WXyxöëÙ§{öëÈGökaûý£ApÞg°©6jK,Ù¤%5@-Ê¢… 9W$-¡¯Œ_2\Q{àÅSѹs¨òÅç—.¦~åø•FŒ«€ÿ½yýõ¾uúýT~*ÛšËãÅÒ-–Ì0tèPŽ?þø¨Í þ˜Ü}&£÷ËQeyÄ¡ç@—LÎ.ŸLk~\pAó ±d +ö-yKmm-Wx · Öì²üDkx}óÿþíFÄo/y²ü~ù­ ÂOØgS<ÏüãnÏ}/WydÔ&X, Y±bo¾ùf¤6Lè êX(Êåô³gÂÂrXažð߇aÓª¨­H‰ÚÁ´žÍ+ãÙgŸÍŒ1–¬`Ýx,yÉwÝÅ;?ÿy³ËIäÞâ¯îòöË3}ýéÇuoI¡'LŸL‰ðªµk³^G¦YóŸÿ°aÃ:‡üc±äšmÛ¶±m[t‘YÔ±U\ÿÑh²ÂÖà÷G>óò¾Í¬;wîÜÌcÉ8Vì[òŠ%‹qË!Í*#ȵ%]Áš®ßy2?û°dz¼€Yn:ã–6osýú¯èÒ…ÛU¾6G,–hˆLä[Z,ÿo2ónÔVX²uã±ä æ+ô‹HíB êuëW?â€(mÛ6¶ÜœXùÉêóºæxÓgCšãÌòGrHFë [F:Q~¼üùŠ+R,ÅbÉ :ubôèÑ9«oÁÁy"ôû‚žƒ£¶"÷ŒÜÚvˆÚŠ´8ºC &Nœ˜9C,ÇŠ}Kä 0 ëõœ5X‹ü¡í³^U8ŠŠõ¯Ð(kÒr¥UCš ÅÝwß=³†X2Šuã±DÊymÚ ª«›ˆ¸b´Àw/Ðz´Øo ûÌ}ñŤi’ u÷QŸÌÞTéÌ›(¿¹îÓ'›:læ£sLMçuèÀ­[¶äÔ‹%+V¬`ÅŠY­cÛQÐ6ßtõÒÙQ[ Ÿ¿µÍB€_ƒ[¤–ï®»îÊŠ=–ÌÐr›Ÿ–Í¿ü%爠ª«}·û lõºó$´ Ço[˜žùTñ«£¹½Þ©æÏeðl“l¿ªªøô#;;Œ¥p¸zŒîÍÏ;¡oiÑܼ[ÔX2Mäb_Dº‹ÈC"²HD¶ˆÈbùƒˆ”yÒ]ê¤Ù,"_‰Èží:y¿‘“õ“DäCYçä] "Wˆ4~g‘r¹SDÖ8iþ#"ýŒí?‘¦S¶ZRfýúõœ#‚[o L㞘Zt¾rþúõ’7W8ûQÖ®]Ì']—™ŸòÃŒêÍï>Qž0”UT¤˜#÷$;ß÷[¿QKÐ¥L‹üKGEmIJÊ ¤4j+rOY[ðqmi¬ÈÕ| y„£ ŠÈFY/"oŠÈ4Oš]Eä ©rôæží¯‹È©¹µ<9‘‹} =ð0U)Õ˜Äfø‘Ós€#”R•ÀÀ­"2Ý(çN`:0øˆ”;ëÇ*¥º:y~œn佨ôÖÿ?ÇmKÚ\2i¿ëÚH,F]Q¯Ð‚¿¨sÖ›‚?QaÅ®_Où”sÏ¥¢K—¹39hÖ܇ ¡éÏþaW_‘ÉÁ‚&Ëw_|qk³X3xð`~ö³Ÿe¬¼&º–0½Ä®Óõ`ÕBãೡc3ƒÖç½ÛÀž)¼¯¹æšì“;&(¥:=€ψH;é¼¼ tN‘óŒ2²=%NZD.ö•R‹•R×*¥;Ë_÷ß3’í¼¥”šã¤y˜ŒõçzzÄôŠRj­RêC¼7Ëum€—)¥–)¥¶çc€½\3ÉÓ×RxôöÛ9W„ª÷ß§Áø[‡>øÙö×w/Ž—¯»Ž­ëÖe¹¶äv¸„±ïÅ'•†ÁÓ^ªÎdø…>ÍåÍóåµ×²Åúî[ò„¥K—òøã7»œ]:êÞü Ì€Q¹à“ç`ÎëQ[‘{ž½6~µá½&)¿óÎ;³gHŽPJÍWJ¹3j£eÇ* ÆYw4Zc^¦”ªVJÍþœscS$r±ÀAÀ,cùßÀ^"2VDŠœÏ*C€ç4¿žÞ.VJí0 ‘o€íÀÇÀõJ©çœM#€¶@lª?¥Ô:` ú+J©‡”R)\ö€E r~—.¼î¹±u~"4ˆÏ/Eà‰›ìª¡imÉZ{Q·ýfõM4À׆ººÀ|©õñ¸¤²2b ,M]]›Œ¹Óá)ðùôd©ò ¥ô¯Ð¨¯‹Ú‚ŒòÑÔpéV®\™]Cr„ˆ&"Ðzñ<àP¥T­³y,;S ð IDAT0K)eŠ„€Á"Ò@)õ=¥ÔÃ95:y'öEä2tOþ¥î:¥ÔËÀ½h¡^ <‹ô³4/(¥†+¥)¥št£(¥¢]†¾vó™álrUwÚ» ƶ„qÄî½öZ®¼òJyäfÍš•,[«¥¦¦†+§Nå¶aÃ8ô7¿¡C±mc9„qÇ[.mÛ–ïßtÅeC4ÆÿàŒ˜Þøf«ìÝ›Ã<Ÿ÷>óLî±Gl¹ç¨QpÁqi¦]t݇ ‹-š4‰É§Ÿ—æÈk¯¥Ò°oÔÁ3î¸ãb×¾Ç>`ß¿ÿ}ûþã¾ö]xaRûŽ¸îº¸ãçÚçRÚ¶-GÝ|sìø¹ö 8~î«wŸ3ÏdÀ{Ä–{ÅÔtì»öÚ8ûFûœß£ŒãGû\öñ¿^£F1õ׿Njß^?ýilù“?¤¥2sæL.»ì2®¹æ^~ùen¼ñƨMÊ:ãÆëd.ï¾ûî̘1#.Í%—\B¥Ñ;ðÀ9øàƒcË•••üÞs/žtÒIì·ß~±åp…g^†sÎ9‡±c?ïºë®œktR\vÙe 4(¶¼ß~ûqê©ñ®¹7Ýt:5îÆ‘G·;väæ›oŽËsÊ)§0eÊ”ØòÀcöÞ[÷æïûÃ_À cÔäÀ]áÐxû8ö2èÑh£÷ƒ)×áSo‚vÆaÞýH˜hãŠJÆdÿS`ôþËÝÂqžy-ñ³ïœ4ì»9Bû.ÏÀñë¨÷!™}Ç^ŸæÐsrt~ì3%Þ>ãøMè »íÖh_6ïï³îÄOdŸ}ÝÁúõëǯ=ï‚ÿøÇqsYŒ9’SN9%.ÍgœAïÞ½ùâ‹/H„RêY¥Tg´›Î€g]!Ö„Þ–ûc[Þ"*Ç-o9 ¸ÛYTÀh¥”ëRs5p 0M)µÀÈs p0p¼Rj‘ˆì<Ü ”º' îú+¥Ž‘Ý€O€ÞJ©UFšyÀJ©?%+ïþûïzÚi§-¸âŠ+¨¨¨ ¼¼œI“&±çž{¦jZ‹ço·ÞÊ¿üe¨´~~ãùÀÎGÉ‚™3©®ªŠ­óÎ6+ø»«dšT&ïJ”>LÈÎ 'œÀÇ=Koî_KíŸk©3ë¾ûõÖ[(¥¨¨¨`Íš5\uÕU\rÉ%ý®¹æšo£¶/Üxãýë_/q—+**(--ëïÒ¥ 7n¤ÁùúV^®‡fUQ½Ú´iÃŽv‹ŠŠPJ‘ëw‹;©Ö;3R¾¼˜«9  õµ°lNÔ–ä–ñ‡ÁWoÁ¶æ}ÍÉ7¤idæ8¦M›Æ+¯4?쨈ÄÝ«ÅÅ:ÔT}}= ïçòòr¶oßKÓ¾}{ª««©­ÕðeeeTTT°qccnÏž=Ù°a£Fâ³Ï> õ,u\¿7§*¥þ%"·£”RiöÞ*•RUEENÎãì+¥þüÍ\çÐ?¡Øî«”ZêÉ6¸O)µÈ)ã yÚYŸ²ØGÏÓä:õÎC®ÙÝŠCDº;¡IY´hÑv€óÏ??®×©˜7w.w‘ÙP£¦jõjêëãÄnËO¶HwB+? öª5kšU>rßUWqúå—'O˜gLž<™É“'Ç–7oÞÌU­|â°7Æù?lÛ¶­Išõë×Ç-Wû„î5…>kDEQQeeeÉ:´x‘ï²}34ÔGmEî©Z ­Ë•àÀžðÒªàíÝ»wÏH=ÞF¹+ò]â„>@UU¼Æ®©©¡¦¦&nݪUÚø1cÆðÙgŸ…5§Øù¹|œ("ÅJ)×°‰À×ù,ô!ÜxD¤ø+°?°ŸÐíu¢ˆ pòŒŽtÖ'+ÿ('TR©ˆ”‰ÈÑÀ‰8 Ç·ÿà*é/"•èè<³•Rog`[=—O˜À=£G§$~óYL.yï=j‡Iºvª€_¢ô&©6$Ò™sÀ[ß<Ÿ^™¨F¦gª!õ¹Ç]ÃbÉ5ëׯçõ×_OšnZV$ôV-‚5ßDmEî™ÿ.ìØµçÅ}oÌù*Ü’‘sE¤‡ówàÿ€ïW þ üw"ÒÆñ2ù:d^¹ØG‡¼< ,pbío‘ÍFšó€Ï€wDd z`îSÀÕ!Êï üNs%úÄœl Ð}çmt«í[ 3pD³öªø÷Ãs‘ÛgÍJÚÛmŠÆ|ú^’Í”6²p–ÉÂUf"$f";òíœdÒž‹'LÈ`iKféÕF‹ü—÷KžÖb‰’;¼ñ[Ó€ÏE¤ $¦-Ú­|€Ó{°°x íu(ÍbI ?cÐ×wCkêÉ÷RQ©£ñl/°0¸{hWžV•àì¡ðë/`‡wViiiÌg¾¥¢”JÚÉ«”ú-ö[ùгoiA2îøãiÛ±c$u}ýHôe$•¯K‘™wŸ³ÎÊÈ׃æ’AÁ×öí›ÁÒ,–ðôéÓ‡3Ï<3nÝ=Z¹Ð2QÒ-4öþA|DœVÆö£ü×_wÝu¹5Ä’‘÷ì[Z_ϟϬ#(Cf=ʹ=Ãm²^Xo$óo¾ñßÛoO¸=ls:ц’¹Ø¤2IV*Ñ‚xî²Ëâ–SùzIaž­¯?·ýâœ{ÇY*ÝbñgùòåÜîŒ+Ï¥—^êŸØ’Øž}KRþ±ë®|9b =ÉÁ6çoM{ˆÃø¥·W?ÜýM%fº šdÇ1ì µaܪEñiŽýùÖ˜ûúOI£èZ,Y¡¾¾žgö. ¡oiÕ|à3Ũ×MÍ’_X±o äék¯e¦I(êÐ"¿Ý£¿ÝY—ŠxOWæK¡%F¦ 30:Qô tÏW¾œ3“óÚ·OžÈbÉ S(;‡õŽÚ‹%s<²Gò4–üÁŠ}K-XÀÕ•t}ì1:ß™ò’F/wpj=Zô×ÑØã]„†Ùº¨r%'œx"m;µ,ŸËæF í³ï%LÈÐ|õA4lÝÊÿûË_¢6ÃR ,<^9¸#Œ?4jSrϰ=aÈîQ[‘{ö9QÏTÛÊ9y@üò±Ç¶öA(-+ö-1jjj¸cÿýyaøpj¶l¡¶ªŠvm¶RÙU :·¿Áù¿-úÝ€+öÝÿ³A.¢ý|ûé§±8ûùF¢Ð¦‰Ò„9.K?ü0uƒZ ÿ=ýô¨M°´r.¡{ó‡´CO°´e]Ô&åžµKaÝò¨­È=K?‡ÚÉÓµªnüëÖÖ7·@kŠ} OÞp”—SöÆ´A¾Ý¼x1k?^Ìæõ°íÂãöè×/ôœŸé¦“‰‹Ë¯ç8Ó.'^¾ûòKê|f挒DññEîñ+#¨¬¥%£.r25àÂ]vÉ@)KäPcZWZ€'-a\'-òoÙ-IŠŽz¢¥B£çè5$j+rÏèý¡¬"j+rÊ vpï•¿ŠÚ Kì¤ZÄš5køCÆ&×Ǿí²ó©3&u Ú?Þoú"):¢Eß6'”½½É&ðj<ôP3KH?wœtv²‰´Ì± ÞògÞtSÞôà犵Ï?Omm-¥¥…ÕgIŸ6ÅÁ³ˆú²e]AL´Ô„ùïFmA4Ì,Ìh_ßí¢¨M°$ÀöìWq×ôèѤ÷½ØîÙ_ ¬qþ¯¦1ÚN“f=º!°ƒF—ž ¢ÍÁϯ<]ñÛRÈå„]дQàçן¨ŽÖÔ(øUYYÔ&XZHQè[,ÄÛß‹ÚK¶g¿•óá;ïð×½÷öÝæ Kw°­+¨ýçVt#Àœ57Œ{ˆ·qQä³ÎDî$­Ihš„™üÊæÌLÔˆjé³§Ê× 0dذ¨Í°ä)CÛƒ£¶ÂbÉoöê •¥°¹6jK,^lÏ~+æ7ƒû }¯Ÿ·¢±ß §Ùô;–“'ÇfÌ5{ûÍtAe{)òüM•\;»×gЮ[·4jÊ=éF×ñæ˜þÛ߯5Þ’M¦ÕZ˜|úéÜ6|xÔfXò”¦6Sè·íûœ1{Z £öÕ¿Bã ŸĤZM˜ªç/Ù4#b;,¾X±ß ¹û’K8W„êÅ‹cëLq6ný¦•+Ù°lYœøkðüÂ’é -ÑŸjáËçžcǦM)æÊ éð°“l}ò„ª§µñÝœ9œ#­õ›‘%Nè¯àNèÜÌ‚j«aÉg±©E±l¶þŸ<Õ8ÁÔ²9±ÿßäí°øbÝxZ‹¿þšÛÆŒAy&„òF° +Ò·¬Zû?Ì€X¿4aÝvÒ![ÒlãòüžõÑëÊ”("OÐ:¿rÖ,\ŸÏDç91ù2cñ»:ÐȆz‚¬ŒPWK¿ÈPa-ˆª Q[ «—DmA4²î¡_lÏ~+ ¶¶–K'OæÖ¡C…~6Iæ·ïw‘…¹ðZÃPÙ ÑWšTIä²f n&êÎ$͵Óöî6Ù]÷ægLè[,Š:6j ,&Vì·pþrõÕ\PVÆ–÷Þk²Í¯=h¶[w›—Š.]¨ìÕ+-»¼õPìüÂ\t®íENž\Šý~ãÆQV]œälövûÍSàÖ·Ó^{%uùIô• jÒ½>º{æ64dë[”%_Ù£‹'?”…‹K OŽ éÖº ˆÚŠÜ3x”`„¯ÞMØ®“üÁŠýÊ'~ÈymÛòùå—ûn÷Þdf m^‰Óeà@zŒå[~2¿}o®h7…{P¿9·ó+GÇú/õ¤É]¤$`Ý\lb«dQüFaKî ºAvMr–IÒ-¯9vŒ=昸åóŠ‹›Qš¥%Ñ©æïÅJJÛÀè)Y¬ Oiß:tÚŠÜÓ{XÁÍ  ÀžÇ4YÕ`{÷óë³ß¨®®æŠñãÙþå— Ó%›X)ÈÿÚܶü“O’Ú&»Y—_# Áøß\ïŠ{wî4ξWW¼Î~ꩬ3haÚùÚ'Ë÷î}÷¥eK&}ïÓ-Ç ›*/_w]“u½ùfN>ÿü4­±´픃ŠvTÁ+÷æ ¢¶ìÝÏ RúéÒÿöDùªÖ®M:°ÛýëýJ“,P:ö¦’§9rü»¹sn¿:ĽhÉ?VžB ¡¡0'ZªÙ®…FÕz}Π剟£?µãd"Êý<âösÎá\ê×®Mš6Ó’ טDþÜ&™úf½ -ø«Úö$£¹B3ì±Îæã=ìyÈeýÉÒ…z ƒßÀà¨XóÌ3,œ??B ,©pÉ(݋ػMÔ–X,“{'DmAábÅ~°dñbÎ-*âë;îH˜.WÎîEѾGº cÝ¿/ÍÁ¯9[¸=÷C÷Ý—òÊxŸËD3Íæ‚ds‚"çx_"ûGrH¨Pž~ÛM¶•©s—-Á?`âĤin1"Kµ[2Iý1p͘¨­ðPT ÃöŒÚŠÜÓk(ô)Àûf—©…9©ÖÐäÏQ€¹8Œ#°b?Bêëë¹xÂ=×㜊HËÞ¨;m;u¢CïÞ±ëD‚®íb“Ë—E ~Íé .*-E¤1·×%ŒKO&H÷œ§B´¬]»4kÌ,¹îŰûî¡ÒÝúóŸgÙKºÌÜ_÷æEù (ˆ¢"è]€3èë_¡QÖ$/Ä,38\·ýÈpxnâ_X ¬Øˆ{/¿œóKJØ:kVÔ¦þÂpõüù|ýæ›q‚߯ñ‘,BN®IGì»û0æL¶oÚø»&ùÍ7É©¹î/éº:}úä“qË~išCÐqL4x8¨Á›ÉWé[wÝ•4‹ïº eëægÖ"ÿ{Ý“§ŒºZx㑨­È=+æÁòæÏ Óâøø¨­ŽÚŠÜóÒÝ¡“þgï,ÚañÅFãÉ1½û.=àÔŽi¢” dvFÔdä²®°„i(ø¹õ„ýŸlŸ³Î2Õô™<'é6Ò®“ ÜúÎ-*âv+ø#gt¥|Û¥½%,–ÖÀkûÃ÷þµ…ƒíÙÏUUU\4f ìµWJB?È';›$r×I—D‚/“ûå=N~3ó&`\”WT E‰o oOsªó d“°×Š÷ø—UT$Lß»ƒzåsᢖiøÃ¢6¡`iS¬Eþœ­ÐÏ{JÊ Ów½<ñsÔ¢™Òvïµ…ƒû9àÞË/çâØþeð'M?ר½þúÇøü ¶œ 7Ž †‹w[s~^[M!ïnóúø›LþÙÏÒšT+J7¦ h=‰ŠÞ<‡]}uÚõ'j` nΗžûî¹&p›ß>}rÉ%Ù3Æȯ‡Ãö£tìüEq œ|µZFí »N‹ÚŠÜóý‹ M~ŒÊ)i\ãNÍ‚_¬O™;{6wï² \({E~:bÇo£t(rÊZõå—¬]° ¶.Ûøõº›û”l°²)æ›ãŽôÆm·¡ZPœädÇ#Ùž¸ùŸ¾ðÂŒÛÐÜ´þ€ã°¼yçqu…3ñËîݹeÍš,Yd1Ù¡…G𨯃gn‰ÚŠÜ3{fÔDÓWés^h¼pgò4><¶'œð~†m±4ÁŠý,qá°aìX¸0íü^W‡TÜ2šƒÙ3^_]M}uuÖ…¾ݦ˜xÁå.×£#þ@Sñê× 0ËNÙ½ }“æ6öêâ_PÍÙ™‘‰Fp26¯\ûß;88ˆ0saXšÏìaLeòtyÏ–uQ[{ ulK! }€ +“§ñáý­ØÏÖ'Ã<õðÜ+Ò,¡%™r 3ÖÀø‚õíœ_¹óë´w~•@üÝn¼ £ [üÖ'²?-áÆqg>"Sã@R9¶Í§µk›Yÿ9…^/Gœ4@GÙiBßb±$Dµ­Ÿ– YZ vëÆk§žšñr³))ùQWöîMŸqã’ŠÆt1ÃW¶¡QÜ—e@Ðè ô:ÓØ8h›Š€êwyðÁ´íÒ%.Ÿ)Œó-̨Iؾ4¿^û 'œÐ¤¬då¥âžæ­/lDžl÷Žœ>=tÚí«Ì)kŽ€¿îµDƵ¹§ÿ46j+rϤc s`ò®áŸ£–ÜcÅ~Qµµ‘Õí `/©Šµ¸P’ÅÅ—•ù¦K¥L?Ìøô®½ûñÓ†¥èô/ÖÂ_Hîwf ó ¸Aé]¶®]K½s.5,²EйL”ÞKØÁ°fÞª ù û ¾Î™Û´ënħߗÛ»ŸyÊZÛ[I)=ÑR¡±} ìØµ¹góZPùÚ”E:tmVvÛ»Ÿ]ZÛcµEÓÜЖ~—T¥ˆÙã»qùr–½ÿ~ÆÅ®9Ö¥Øì qpmP l­‡ÍÎvÓ/=‘«HsÆ8,ûè#ª·l‰mo µéæÞT©ë aÇ»Î=^ó^y%¥z›{M4w.€Lññc5+¿ü–¤¼ÿϨ-È=k—Âw_GmEîùò¿…é·ÿöãÍ. þìaèæ€°3¢6kpe’ºÃ–Ÿ-Ùâ ‹éWO b^€-ÀR´xÞÔÒTxy–õ`7×%%h-¿ýiÎ`ÒTû„Õ•h°rsô&óÉOF¾ýT£YYo±X,––†íÙ€|õû5/A»ñ””—û¦M4×+Š‹ŒtÞ¯æÿ hÁ_ƒîÕ¯68¿jg¹Á'Ÿ×u'U_~/í{ô ¸´4i:sßòoCËÄìýïØ§OZåû}Y0}í3‘§9’dyÜk— }±½û–„bÜõ¶ ¢cÔVäžN½ô8B£$üs4¶w?;X±Ÿ¼‚#[!Õv0¤IÏQ£≾e†Ygb þD6¹"±ÎùÕ¢…þv…¾éÔ«ä¯o¦ ¤;ϘAû=’ìQbrÝ ó‹DÇØï ‹ûœuV³{æS™8+ î½’n9aòyýõMê4ÿá=¾‹¿.@—K8þ'ý ëZ,w…a{FmEî9à'PêßIÖª9éúäi,‘aÝx""Ûý®0ròwsæ°jîÜÐùÈ#¯øò'÷ƒ®à3]nù¯»õ¾÷ç?§YSvq]–šëŽ”æ¹Ë.KÙ¦0çÄÛÀJ”.Ó…0<{é¥Mê4P8W/· Êí…[Ü’˜¿þ&j rÏWoGmA4üóQ[ enfqu,È“+΂íÙ·øÆJÑP_ßìò¼_5J_ÛM²è2‰bé‡ùzo=©ŽyÈa{›ýj ø¹ÛdÊå&ÈÞd¾þ©î_&ÎIͶmMÖ%;A³9ßzöÙ°ÈÒê(Ä›–¢f{F‹;e`F‹+x¬Ø·¤„ŸL˜žfA‡Ô,EÇÔ/§Qð'¸›.‰.îã—,,e:8Ó7–Û?€næ~ùѧºaÄy6ýì]Ò97©6SÙEwÞIMMMVY,‹Å塉Q[к°b¿’MGÓϽcŸ> 2¥IÝ~ßϦ"ÏÿEhÁ_LS±ŸLðû ê-Jò3…|¢/Þå]9†={ÆÕ•N¯w>Ý\aÄí>gªœdÛ‚¾„9†fš0na©”~ì±MG„ù³ ˃Ú-Ì>MÇ>µzv#÷ŽÚŠÜ3õôŒ VmQLÊüÈÚºc2^dÁ’Oz¤ È„PÏ–;‰÷b¨«®fÛ† iÕWäù M£æÓ8hÄtéñFðñk¤rẢ?Lt¾›=›êªªÀí©\»þ„½¾üöc釆.?‘[YGX‚é î :ü¨qÎuº®_~f™aÒ†Eí»w•.•¾NÁÏ IDAT}Q@íªUüçÑGS´ÈÒ*éÒ7j rO‡®z‚©B£ïH rR­ÊäÏÑt9°'ìZ€ó³e+ö[0é>NLáíâçc_Ù·/£?<0XqÔ¨‚{óM‘ï Ï™hÖÚT™÷ û°Ç´íÔ©É—¿}ñ ¿íÉÒá~Íð;‰òøÕ”ÖÜ>úÐC–™L؇©3QùÞ2ƒðÞ‰®‡d×Ä¿úU`>oþ FLй}ù¤“’Ôn)¦ÿ,j rO÷AÐgDÔVäžÝ„¢â¨­È=G4}Žf’ϦgµøVû9$“î ™è70O¾Ÿ ϺE‹øð¡‡’Öä*áëÍïöÞ²LûÌ^{oÏ}*Ñ^ÙáÖýÙã³eåÊ8;5:¸t¤’Ö{ḻ éž÷DÇÆ-sæ7&´Ë-']Rm¤rN›c׿/ºÈÌØ?;.žhcÈkVÈR,‹ÅâÇ©¡sYÔV´L¬ØÏ"ÞÞï(ðÆO–&]’‰{ó¯_½ íËß`üuËu…¿wR)?‹D¸‚][¼ Ó.?wœDÇ)È7?•óTFÇ(‚Ž¿_½‰„²ë9W×xsêIÕ*ÝqÞ|÷M˜F)‹Åb1YdÔ´L¬Ø/@ŠÊÞ½ÙåûßÌk CWDù2áŠü:E¾Ÿ¸÷sÛÁg›¯ˆ÷³ÍûÊ)tì×ÏwŽ€Deù5ÂF¼ º€jô±iNäf?áêýŠ0=D¸Ho<ÿ§êkŸ*f=É$Þº}ËaÒO~’Ržduq駦˜ÃÒj8èçQ[{†î»N‹ÚŠÜs䯡¸$yºÖÆÔÓsVÕå£rVU«ÁŠýVŽ_xX‘R½e «çÎõu…ðŠFïÿÞÞq¿2\[güïþÌþD¾ÿ‰„~º._¿ò ÛÖ¬ñõÓüaÖûÙç-ßÛˆ©A‹ýÚ呪¸þìÿH¹³‘—)!ŸˆTçú¥÷ºy ðÝ—_†²¯¹,øáœÔcÉC¼µ¹gÅ<s¾ÐøàŸ…9©Ö²99«êwcrVU«ÁŠýVŽŸo|=³èêyóšló ý òý\a\ah zSì{{öƒ¾×Oß›.Q¯|P9.[V¬ ¾º:nÿüöÃÜw¿ÿÍô~ÙäµÏolB2‚n"a¼zá„¶¥Bªî2âù?Lþ ¿}¿ÿ½ib¾•bÉ{ï…´4¸®°œSˆ!ù,z°j¡±mlYµ¹ç»¯Ae2G aþ»9­®î˜œV×â)ÀoM…C*-9¯ Nª*o]~3ÞzË­÷üo [oÚ üD8Ñ8¯¸ úb‘¬,? çîsƒÏö ÄAç,ÕóáçV“h¸×ždõ}²%Ð&Iý‰òÕŸÈ­Ìb±X,-ŸbÛo’¶g¿•’ê‰õE¥mÛÒu§bËÞžT³w;‘‹)èÜ{¯ÛŽ·7?Q”Ó5ÉïË‚·~o„<ËÞ^ùÞ»ìBÛÊÊ&1öÍýsËtCcz£ y:A_9‚–ƒHGôûùØû1x¯½|ë óuů>3­7M²òƒÒ{{ý“}µHv\E„nC†$± ù˜vØÞý¤ßè¨-È=]ú@’§km ŸLANªÕ{XΫTÇæ¼Ê‹û­¯è J“Hüx×WtêÄ I“’ S?wSŒ¹BÞë“ïõÅOä®b–d¯·~?¡$Äݘö%@§þýiÓ¶mœˆ7/ÎßRâž[¶[Ž'߯Qà{?Ù+"[7¬½F7$é¸â¸¤2€Ö»-¬o~*ëü®ÿâ’v5¡{Óeë•}g໥•3î¨-È= c¨­È=…:ƒîžÑøÕÜg…ºñ´Âø7‡Ùnº>l^¹’Y=æ+0Œôæ24†‰ôs£ðöÄz‰zyýfü5mpËñºpø 7Wˆ{{ÞXôÜs1ÑnÖiî³+æÍ/^L7³¡bî£7”h”¼{ß}¾ëSu‡ 벓*î¹õºT5çµZW[ËÌ›nŠ•äÆÕ\¼û¼úé§3Xº%ïùÏMQ[{–çfà{ÞñÚQ[ O]Iµ§í§à˜T±=û­€æ¸ìøõ^šëÌžì ^îDõx{õUÀúÏzS@{Å´Ÿ«ŒŸ«ŠŸk‘Ùó^LÓÞùãgÎ^ëNnåþJ¿%F9EF¹fzo™¦ýa"™4wN„0$¿‘®NÖ˜K4 Ö$Ù8Œd¸ƒ\RâGª_A.0 …Ò-‹ÅâÇÂüp–*'öEä_"Ò "Su "²MD¶¿1Æö×EäÔh,ÆôGO5Ÿù7ˆL  j^Ÿü è;~~ù¦»Œ)܃„³‹Ÿo¿)¾Íuæÿ®˜/ʶ@…ó¹³Þlx ¦ð/ñÔáu/ŠŠD®S~„uÇ1×…Ù¿ /AéôEÂÏç?„)Ë<5Ë–e°v‹Åb)L†´ËN¹"Ò]D‘EŽ.\,"‘2OºK4›Eä+9óý@'ï·"rr@]3-úˆgýƒ"Rëѧ×Û$"¯%Û—‚û"r Z«AÓwóáJ©ÆÏ ›j'_NhŽ8LæšQtèÕ‹‰?þ1à¯ß[^Ps¢¶æÏï õz›BÜìQwÿ÷–áõÑwóúÃÝÎ<“ÊÁƒãöÉ+ôÛÒ(öÍŸÙ‹ï ýr{þ½_¼ Óöd\&o^f\}ÊyÌ¿.¦+•w{:‚¿9ø¹‹™”¶iÃ~gŸºŒæÞs^Î-±ž”ÁÑGmAî¹7Lœµ¹ç¤k ÓgÿÈ "­¾æè¬Ûø ˜ª”êLb/K988B)U œÜ*"Órî¦ã€ß‰H¹Y‰ˆtnÞÆ¿Ïë1>M>¦‡‚û"Ò¸øiP’šÓl2el"aµmýzæ¿ürÒÞw¿h3ͱÁ/ ¥)´L‘ï Çýëu×(6þš¡@Mw`Σ²yéÒXÃÆuïq¹±\êYïün]¦Ûù¿÷‹D”á«ücÒV­wŒ…?×oÚLíg;Í´¦=.õµµ|õÒK°&=T}=Ï<þxdõ[rÄ;ODmAîYô1|þrÔVäžÿÜDAÆÙŸõl¤Õ—Á”î™-S)µX)u­Rj±³ü5p?ð=#ÙnÀ[n±Rê `0ÖS\¢Wý=À-ÀBŸmÉ^™¡:£ B싈 OÐÕJ© o瑵"ò±ÓR‹¡”úžRêá ò;uêTðð° woV5ÚŠ.]hÛ©Sl¹¸´”®ƒǗѯ_\š²víè1|x\šž#GÒ¶cG½O@»®]é1rdã~'N¤¼]ã7­NýûÓcĈÆ4EE ;àŠJKcyzŽE·¡C뮨`øAQ_SæåËQ@ÿ‰é@ÛnÝ6mZÜ8têT:ôê[î

àɓ{‹ŠòÉ”–—Çì0i}Æ‹‰æŠÊJÆþð‡qByèôét92vWTöîÍ®Çwlv>úhº á݆ cøá‡Çö `×SO¥¸´”†º:zÏNïåÅÅŒ9ë,Ú´iîöÛþ“&ÅÒTtìÈØŸý,îÜ 9ôPzí¼sLèwéÛ—q'çÚ³ÛñÇÓeРرè9b»ÌˆïÛãÇ?¦]·n€n˜ô?žáSci³÷™gRÚ¦MlÝà}öaà{Ä–ÛTV2é´Óbû­€‘DûîOÊÊÞ½wÜqquï2cû÷-w2„Q—füÿüÆùí½óÎìd„ô”¢"&œp%åå±ýì?a}vÙ%–¦¼}{v;º±›F€&O¦ëN;ÅÎS»nÝ>ujÜnð¾ûÒ¡GcôŽ}ú0`âĸ4C÷ߟòöícûݱo_ŠŠ‹ëaȾûRäô¸ Ðu§âö»¤¼œþãÇÇÙ×m§h×µkl]Y»vtŠ®ËÀ”÷f›öí©ìÝ›—N8/3gÎä²Ë.ãø×]w7ÜpC“4­:\;®œ×­èÎ7_ËÛ´‡JÏÛ¼ç`()m\®ìŸAÀ]â{Z»ŒOSÖ7žOú‰¯«}ì û1|´o¼ÖéÚvŸf·¡¼BO´Ðg„¶Ç¥¤T÷~5^ƒ Ù]Gtq©èØ´‡|çïҵìÒÆŸfâŒøýì3v> >Í~?„ŠÊÆåÁ`„‚·´¦žoߘ)ñûÙ¾ Lñx¹N8º €êmz¹Û˜ÿƹ+-×u›ÇoÔ¾0h·Æåöu]&»¨¯m—.}›› ‡C§žË½†è²Mö8Jß7æ> 24hI©>¦}ƒvƒ^z€¶š^7ƒÇCçÞ˺Æ×ú˜Ç¦SÏøëÚ-§ÔèäîÜ[ßG.EÅúº0ïßN½ô5Û‡2}þ€×œK£{÷îTTTÄ’”——ÓÕy>ñÅ4“ƒ€YÆò¿½Dd¬ˆ‰È4`ð¼‘æÀ3h‰x±Rj‡»ÁqëéÜ¿¨WÀáŽ>]("w9_ôF¥RJà“/Ž‚ûÀY€RJù‡©À  p)pƒˆœ¶ð±cÇv- Ë‹‹9줓(/o¼€ûî¶[\XÃ²Š FNŸWF¯Ñ£©ìÝxó´éÐÞ;ï—¦Û!”µ×7”Ê;tˆËÚõ¦¨¤$&zËÚ¶ÿ ãç‹HL(—ˆP&Ò8@)jkã\jwì ¡¶6VF}m-;6mŠëñ¯Z·Žšê꘸ªÙº•­«WÇÕ½aÉêœÙi¶­[Ç–•+ëRŠÕ³g£êêbWýæeËØºreLÜ«;X3kVL\¬›7­«VÅòÔlÚÄÊ?ŽÛ‡³fQ½~}¬Ñ°}Õ*¾û쳸(;+Þz‹ÚªªXo~ÕâÅlš3§±'¿¡Õ/½DQMMlÝÖ¹sÙ2~¬É^·mKŒÞbÖÌšÅö¥KczëÖ­cåoÄ ¥ÀòwÞaëêÕ±›rÓ·ß²ìÃãîþ¯_›7ÇŽñúÅ‹Y9{vl»jh`þ+¯PWS[·fþ|Ö~ýul¹vûv¾~ã¸/+çÌaÓÊ•±4Õ›6±l–ù<ƒïfÏfÛÆqçnÍ‚qiVΙCíŽØsŒ­kÖ°ùÛo(Åêùó©¯oœRmëºulÛ°!¶ÜPWÇ&#¶oÜHÝöí±åúÚZª·l‰KS»cª¡!¶¬”jÒÃVTR‚/Ž’²2JŒ†"´ëÖ¢¢¢ØqoÛ¹3m:6¾´ŠKKãÇ] Šûm:t ïn»Å¥é¿ûî´ëÖ-vÜ;öíËN{î À%“&Å¥mÛ¶-••• 0€!C†Pl4HZ+C‡íP^ Å0vÚ‘´ïnˆÕ;éæ&»Lƒ²Æ—:ÝÅ •â-:ÄxÕué«.¥åÐm`|¹í»èF€KIi¼((m_®HS÷úºøåº¨k|þ¡lÝ@\ÇܶM°£Ê(£Ö÷Àú°£ñúgG¬^Ÿfåüør¶¬kšfñ,¨i¼_Y·,>M}Ì{”áÀ¹b¬]Ú¸\½¾z;¾Ü%ŸÂÆïŒº×‚÷ãÓ|õT­¯{qü3‡Ï_†šmÆ>-€å†‡m}-|ú4S4.ýV5>ïØ¾f¿_î¢`ÊÆåÍkšÎ;ïxûÖ ß|Ÿfî›ñö­ù¾kœ‰œú:˜ÿNüñ[µHŸ?—ší°ÄSëÂaÇ–ø}X³¤±1°m3lZŸfà h0®Áê­ñ×Rúz3¯¿ºšø Gzþö~î4Þí© l p›êSÌÍS\ZJ¯Ñ£ùö³Ï|Óø´a÷-蘜üÖ[ì±·ÿ#góæÍtìØ‘K.¹¤ß5×\ó­o¢ŽûÝ4*K“§oQŒØK‹ÇB¢Ç -ð–ÍIš´U1îø$ø9Új:~µŒ|æmñßvâ‰'òè£ú>KEä$àngQ£•RËmW§Ó”R Œ<×Ç+¥‰È.ÀSÀ J©{Ù)"//*¥nq–Š•R?Lg°®”Z”ÎK!ôìï t>‘ÿÏÞ›ÇKV”÷ÿïêî»ÏÜ™¹30;ÃÀ0Ì 0#Ã¢ì › ‚Š ‹»Æø%¨1bЀ1bHbbbòUc‰kШ‰¨ F@dgXfXf†;ë;wïúýQ]·«ëÖÙºO÷¹·»Þ¯×yÝîÓuªžsz¹ŸzÎó<õ’â¥Òþo !>rÜ´&I̳+ ´uc °•pjƘƒòzöY‰ªZ¼Ú‰µqmv%ñÚ ¦86KdêM{óµ`ÆxîÓ…-òõ$¨ hkk#WòÐÙƒ&(_ÇÎÒ¦vÛׂlÒc˜ñýú¼\ÉÅAÔ#g£½'¼¤A5n»ê’ W€b\ª=V'ÚÚ&=ðö$6ne ¨ü…(;47|rŒ#<3’¥k³¶ ñˆ\exM«ÐÑݦ±ÃÜ2äÑs£Û¸R~ÕH‚í•R>'Ÿ.N1…~‰ ¯H)Ÿ*õñ ð_¥ýQœ|ÄЦoBlBD¹<É€Vû7+Q·^6PNšø}àj!ÄÑBˆc„íBˆ‚âà½Àdcn8Ik¬›v}l/*fi%JèCY´kodܽ›¾õ­H¯²-º5æ'1(‰WXÍdÚ‚ñW‹â(¯=aÆkvvŒ=±Ð‚ûÅ;î`¸¿Ê]ó‚¶M þY¥­“r)Ns|sìÉø‚kñG½ÏµŠ}[Ô àþo|£Æ^§Þõˆ"ÈKn.\]ǹڄÙ3º?¿¼ñÆI[\_o.Ûª!lòó—Vž„§IøÉ³¶ ñl{jjxJ+p×7³¶ þwzùNÿ%…¹‡¢Üœœª£C,î.+yÜB¬.(íb°ž²6½ô2)嘢CñF!ÄœRߣB†îqL:Biúi·”r2÷•bvû¥”»„'Ÿ–£ôܳÀÕRÊi´­QÔ23Ó¢¶ %öûP¢r0ˆ =1½r:RdjU—Qûì;f‰L»ª‹) me m[ü›{ôä"o½nŸ›ëº´9¡Xã“°·tü°q¬¶ÇìßôäKç0F¥` QÉQ[8KGy£í럦¶í±ÇŒÛW¶UT+[¿ñ ¶mÛÆÂ… £{<ÇÉ»WÂÿöG· á$àRÔ¿ó'Œ|/Y*³ ð>àÓÀ/J¢|ð TõÇP¤”/˜Ï…ûQa”µÙðÃÏem“Ϭ‡ëÏÚŠìñžý&Å|cM1[Dy÷‡PÞüqÜB@‹õÏã$à´Èµ«ú˜žs;yÖÕ‡)–ÍUt{PÞôÙÀàTòñÜÒón¨XÀÊœ€h&Ëe‹^vSìw[G›ZG¤³:»`vÌš ‹W‚ŪM—Ñžli‘.aJž€+8êÚ¦ð¡K›$w\¡gaaWQÇ»Ž3í(NL0°}{ègÎ&ªÏ°¶I¸²­ÙêO¶0;²¶ ñ8Ö¹h ìµZ…]/F·Éˆ=qêâ49^ìÏPÂií6¦Ð·=Þf=÷¸¡Q¸B?ìê2.¡•Ük†ÓhñÝJ8ž ̰¤–tÁŠ9°ªG•=%¼;­>ôc—ÝöØÚ›ßUòæ·wª¿mjý®yÐÖ«öÏš³;Ëvôû0AYðëk ' f(“Y¾3H؆ÝQIÓCÖWœÏaP®œZ€]¸0ªâM2ÌcÓ ÔÖñqî¾ãŽ”Fòx<žÖ¤· N˜Ý®™ñb`/°d†o„c‹[ü›¥%Í…žôXm]]¬:ãŒPÛÂ<¬¶Ðwí³½ìvˆŽY_Wš ÌmƒEÂâƒ`éJ8d=w®ÚŽØ+fÃb”‡¿›©e.Í0 ågžI÷¢ESÆ”Äþ,µ˜f×lèèTB?Ÿ9t@®]=Jôëd[SàN}å)çØ•‡âˆW×µ3¯u޹ôÒÀ×¢ÞçZ‰ÏQãTkC{w7+O<ÑYÅ©’5Áþê©©äfy²fãùY[Ðx«ŽÏÚŠÆsòeY[ Æ*¶Ó‘_„K™¦Ç‹ý„-ú£°=úÒz¬û  !hëìt¾n umñi |;|EÛ'éRשïæ´Ãœ`þb˜{ô-†…k£º(œy$ËO‚5ÇÁ¡‹á@Ô¡‡²à×›öªîØÁÄÈHÅu2ãêóèé…YsÔ‘míªpÏD)ËYt¨†…B9)Æåú}0':™Ø¬0d_S“á(Žë•”}/½ݨŽÅöÇIÀ­öµ\>O×ܹ±×¸îNTs—Ã…ÝÇg¯¼2…^=™ÒÞ•µgdöïÉڊƳw{ÖdC-ˆäo6dmAvx±Ÿ"¦xË’ °»MÔÄatÿ~ùÁÔe¿íMP¬¹y=ì³½9±ï:˜ãÙ¯µ¡¼ûݳUÜü¾Ý0TªyYú‡TlÍ gÓ{lŽC7*Á?µÎ€Žã7WæÍ;Ñ]»&½òvR1(ß5Km…våÙ×É%o¡½,âí°ÑÒ¦ï,èv$«Êc^ˆ^Q8ŒÇn½5áÕ缪 ¡ zͼ–f›áþþ÷ý„õ•–°Ã“ÿ÷ ÉS7Zq¡¥/À emEãy q¿£ÓŠŸOËuH+xßaY[¾OФéÝ‹"J,Ù‚?­ ˆKèÛD%˜Ú¯™5òíëg¯C`ò”Ï©MÀà^èß ãfµÁέлEyûvÝ ç|&ÆéÊ߯*!÷ÃÖçÔ‡•µù‹ÖØz|]v³ƒbÆÇ`V‡*%Ë©ò›RBqrÐs JÖ/'K¢ÊžêÉ€žpØk ÄÅõÞÔ²èV„}öì÷¶‚úˆJ–­6Ï –ckù]øèË_^ÃÑÇã¸f-ü{ÖFd€û)3kØb#®ðBÐÖÕŨ±Ð’? Jµ½ú0Õ«oë ƒKâÔ}Œý&ÆÊ ƒuÜ ³wÃ’~è™;ʬC~¯x?ôFgçpXa! }+Æ”à¥\–´}ÁƘ™Ý“a69…áýj­˜ÎîÒ9æÕV,B®bŽšlt¶©ŽÍë£KQŽÕÇÇ,%ª÷7b9gÉö¼ðBtÃ:– «±'I&°^z!ù|Ý*…„¡GM¡OftöÀð`ÖV4–ÎU‡xpwÖ–4–¾%ê®F«QhS^°iÎwdrÓãÃxfê2ªâ IDATQ+¹áªxçøŽÙ³9ãƒtöeŸ+žß¶Ç§®½ùvÕ ‰*: ”¢Ö©ÞZ!xë^xþ `?¬:ÎþœxíGÏfÕѰh,hS¡@”EöAçŸOײe“ç¤gÄcÀð8Œ©ÿÛCûT•5‘+Ù/ÔÆ°Wý¯›Õ]>'óË6†º›0„š¨˜ÂÞ®Pd^×õM+Iö¤Ë/O¡—JjµË51ŒjŸdÌÙ‹qúûÞÙ®Þ“­¬Cÿý¹ ë`ëVîø‡pö³ïñÄæ¦«²¶ ñ¦Â|ÆGËɽ¦è”«ÿP3ge_¿¤ ·ö*è®ÊtÂeS”vµw}n’殸®k_œï©ÝÖnWKò°Çãñxly‰â°J¸mïT¡8]BMV¿öµÌ=è TzôÍP¡1`Tª ÂÐ>%î;{Ê!=ãcjUÇšõóµøo/mZð›çhNxÌkôÜETXûµ“CböÍ Aµ$æMôù‰ê+¨—È–@÷¼y¬>óÌXý¦…ó-H+.´´lyFÖV4žVÙ?áw²¶ÀBÏþVüÿ©†àTfES¼hï­é‡xB)ˆÉXçb‘AÇBK.Ok˜u%ÜjOµ)nÇqŸ£y¬îÏ Ù¥\:spÌ‘°âìX¾}?ØÌ}·+QßÑËÛÅœ…».%Ó¢l;º¡»”-;öÈ#LìÞ]qMo»é/ ªðtÍRá@s`bH…ó'`|bê9i¯~eA®Ûè1‚<Ài{ãÍ5 ¶üêW¡mÒ ­;Qº/òAqýf»b±ÈØþêo?Ç9—¬'ížiÀžmY[Ðxölƒá}ÑíšMîßѦgh k 6ÆþrÓ»¯û3côí²¢æµÔwBlv5‚;NÜ{œIgÚ·ø¢r:‚žWæckŸ+Þ¿Ú1Ì6q®kÜþ<Çã‰K±ÿʺYᙾI0ÛÛU\ÌÖ8‚H f„Ì^´ˆ½/¾x\RO«µfø‘éÕwÙbŠÛ|©í•“ò´¿0=ª:ø»¶Á³/Áó”s&€‰¢JœUå3eöíA‰ó"´­XAÇŽ íÛ79É0=ýZèç(ÅûwC×l`^ í‚1F†JqûƹåÇ›½’¯-öÍdåZ„`”·~áºul{øáXc4*¹7LØ»ž›ŸÉ(û$Phk£½§‡ý»§.üçø0’^#/ò›˜¾¥°óù¬­h,³æA{wë÷²uðÜÃY[Ñxz€½SÃ~=ÓƒØúRJy[ÐVGûf$ÕþÓ6=¼I ²C‹H;ÉÕng÷#|{;Ç¿óUXT)Ѓ6ðj&äš¶˜ûô~-œÇP^s½úí8j­}Àcûá®ßÂ}/ÁS(¾>N j„û;açVصÆUÛ®),XPO¯¯ý@w»òìÏ]¬m‡CNƒ…/ƒAØ»CMô¸vøNg©3ÿ Hå¤Ç¾–6I&ZæÄ/°­;ï¼XýÖ’R-®ñ\×%jBcÛÞ»t)/¹dJ¿iï°;¦Mžàì÷dmAãé[ª„o«qôyY[ ¯ý@ÖxBH´¨–âhà÷ƒ€g/H)難a3SVKROyRQâòÆy ÇGF¸õŸ<>H€™á9.[íŲìI€i—ÙÎ~nDZ•úÞKY`k!­Cs´whPyõFÇÕ$A?øíoOÚiß=iz€Ùí0»¯„žã»àô«U£»ÿ‘=Ïî—`¿¬ü<èjAº `NÌ\0MÒœfì¿~î ºýúë+Ž‘뉶-ìüL{\v%ñÈï|æ~þùÏÇ>6m¼7¿E¸ùÚ¬-h<›«¶Vã»×G·iF¾ú§Y[à !É¢Z¯îK€;…ç×ɶGB(©·ÖöÔÆÁRf?&aw\ûÃ^Ó‹Ž¿¦G;IŸæ¦KbîG‰öaã±~Mß Øì*Âà8 —¼ù¥B<Œ›ŽÍo£,Ò;€¡„þ¢0ïp`Õñ°w lúä£[Ùñ<ȉòÄÊÕw:€Ù¨ ƒ]{ß i º ÊÔÞ\TË\X+,¿Âœ˜Éõz¾ƒŽuÙ’$é;®]Õ|OÓº›áŽÇãñxMÏþÇ·J)oÖ;„¿ | ø~Ú†ÍT’z]m’ÄÚÇmãÂöð×*dt¶Ç5¨­k`¾f“éq·ãÙÍÍŒy—(1/P!@”ëÞýŒRN …r"­ú ½MÅé÷ÌE)ö§/þ††˜Ø cc*Ñ7oØQf³ôtÈÁľJñm‡ñ˜ë Ô‚)îóLîfîCqB‹âö¾ºî2Å­zS/¢¾'IìiT®ƒÇãñx<š$9¡‡Q®È£ù°:=sšƒ4„sZqÃacD‘Ëç9á=ñcMòŒÒm¿°jÛ$8ƒÂ8̾&PûQÊ+åºîf¬¸øbzV­ªx´àoG•éÌTÌ?ÛÆ`Ó^xlŒ]j5Þ¶v%î»JÇÌúôÍW%?‡ËɸæyÛço_×ó8h¡Ÿ3þÚwt^yõÕÎc]?õ 牂㊽7 «8d~†0wÉŽ8?úæd½âø=-¹WdmAãY±ŽyMÖV4ž×»G›ž3/k :8ÈÎgž mg‚éñ„òÄÝY[Ðx¶? »Ü•Üšš;mŸh‹°å¡¬-ð„Dìø®âSÀ&`ð'ÀçêaØL&Mï]œ’œI…¾„”’çî+ç_Û1ÜqÇ©^ë)cQ9)°Ñ C‹`{±ó®DÿØHéxQø…B)þ~L«m£ìÙ×[ÑøkÚãúqÂ]ô9­¿úõ8w Æ6nôÓÈÏyœ±¢<ùÕVë±ûštDçcö=ÇÓh’ÔÙ/J)¯—R.¥ì‘R®‘R~FJ™Ô±ÜÔ˜"«–Ul«9ÖŽ‹·m0…^ÑhãBï_¸Î]'Ùõ¦Ç2¶ˆ òºšc}ÈÌó8{d 6-Þµ¸ÖÇä€ùëÖÑÝ×7y×@Ç÷Eؽv¿¤jéïßû÷¨ž‘aå¹Qb¿½ :ºTÈ©°!”pÎS9‰0ÈÌj©l÷ï…‘ý0<¤¼ý£Ã06Åq%îÛ: ߦ<ÿc*v_ˆJ»ø®ÅÅÌp ô¤˜çncOìtnƒ;Òñú£aá^®6Q×%èÚõ.ZÄ!'äœTÄÍ Ûçî‰}¼÷ü7!ÎÍÚ‚ÆÓÕ semEãYº6k ²áåem'„¨0ž½¨²àP Yv ™.Ý’$ µHÒoÏb=Bn¿¡¥eß °ŸÛ%1ƒò ’Ú©û ßõšþ«CsÌXxýuÕŸáÖ['5'NãÆ±ãÐ> ¥oÅØ¨ú[hSBb\mã#jñ®B;ôÌQ‹ƒ e¹_{A-{BVK9W3ÊœÙÉÀEàî/|aʱvBn­Ÿ±¸qîa±öqˆkgÿSOÑÿÔSα“ô†ç8ÚÓ|¯£]·>Ùšñë?ùbÖdÃwþ:k T~Ôg>„Çãñx<õ$I¼ýÃûHÃO™œµÙ¯™ÅÄG‰×.xÖ‡?؇´þjŠÆ_3ÄžLÄÿA"Ó%’LqêŠå7ŸkÛÌÄØ à°·¿¹ëÖULô9hÿåXv½ ûŒm'°µ¢n÷"à”«á-ßGÌW}uP^­7,L+gý­5aTZ›æ5Ÿüääëà~_]˰- açSË9‡wÀªUuá…SÆo´è®æzyfoþmZÙ'^œµçÍŸÌÚ‚l¸àO²¶ÀB’Ò›Sþ_úäÜÆ“†·ÑŒÙŽz}óͱú Чw lamQç` x»„¤=Lõ^ÛvÙ¡3:1Wïü›ßdbx¸¢Z]JTOô3ö~œr}9£{ ý¶?‡k~öîTǶ¡&m–Ý:I ló®FÒ»Fq?#?ùô§§ù°¾âôÔ‡+,(;KIìض±áá†$‡U‡ jë'MÂ/âýŽ6› /<–µç–OgmA6Ü÷ßY[à !Rì !¾RzØ!„¸‘²ÞÀ¡À£õ3ÏS¤ß$«Ó&À-äƒú5=©AÕtìvi„i„‡yC{ù‹Æ~ÓΡµŒ™(+}è~e{ý‹¨’•ýcðàm°àñßÐÙýÆÇJ‰º¥~;(‡:åQÂ_÷3nômÛ™¶ìïŸ|\ï›v<»Þçš4֓ᆳðOÜð:{¢ê°uSÖ4žñQµµ{û£Û4#Ï=’µžâxö'¬ÇfHöO©ƒ]-M±Ùq‰ëÑ´½±vh„ù8lQ+S<ë¶IB?L/»nTñÇ~nOBìð — f ~-ø%JˆÛw&ÌP ¢Ñæ9`ß~xáI˜“ƒîvØ7¡&Ú»ßt¡¾£¨ áÒ¦'®x{µx…ëNâðQɸqÅqÐñæõð”W3)©öNœÇãñx<Õ†#¥|»”òíÀŸK)ßQzþ)å;¥”‘R>[3[¸¢ Ö8ª°«VžtÒäã ›¢Äˆ+ÜL¬5Ç9WØŽÙ¿-ðL¯|ž©ãØí{, N);izÖÍP³b½`Õ8J¼ï*m/á¹a%æõb]%ò{€Å6tÃazNË>Óv{­¬9ï¼L¼Èay(aö¤qÎÝ}},8ôÐXmíëlžë!Ê},“Њ -õ-…ƒ_–µgãùÑmš‘CÍÚOIVÐýËzÒê„%åÆ9¶V‚V³=pÍšÀc‚D¼Kø…ÝØ<î5ü¦@Òñø¦MA¢lÒÆBr¹)v»Æ0CwtØ+1x•´»•¸»UÑGO$p`V¯ã~Ž8\‰pO„\ç`‡Ã$¥£»;Qû¸7ÌnÞᩦÏ8‰»a×¢{Þ<æ¯\{¼$}Ç9>¨O/ò›ŒV\h)—ƒ|’´À&¡½+k °rcÖVxBˆýMBt×ç`DAH)ªƒmMKP8‰IÜDÌ´“íþîþ¢{Ûî ]—X¶E«™€ª›û’ÚlbzÃsVû ðŸíwÝ{\3lǵ(–™ còmñ^fózaáA°o 쬼f¢Œy­Ò|ïóÍoVu\T¨i§kBâ ߉"Î¹Ç ³éß´i2/%ªŸZìuçi!Zq¡¥þ-jk5îªîwtF#%Üê#º§3IœÂŸ~ø*°¸‰ðÿê`WÓb{!]o@Th‰“i’¤?Wµ[ÐØ6šMϬ¹Š­íñµ òr À°»Úæ*~>OeILÝÆÄG y½éRžféQÃo–êÔñøE”×Çxô—ðëÛááíªMØuHê-Žó¾ÆýA¨&¡:èóa‡>ÅñÖÛ}†½n’trd&(Eõ#[Tßamêäñx<žÖ"‰Øp¡”òo€±ÒßßN¨‹eMˆ²38ÂЮ§o$ÂÌðSÜ[ðë0œ°——ÞåI¶ëÄÛáGyTeœÎÎNÚ …Š÷Ë–ú¯¯/ç¦àÇø«_Ó"_·6Kx|(æÙ•¬äQÕ}éºöæ±ã¥ý›n¼‘q)“@]—ðwM(ÌÕpuØPªòNåÍŸÒ££ð¬T«ðj›¥Õ—U­8Àw¯º*v[“jÆ òlÛ±øq=àÕž÷¶ÇcÇ3ÏTytpî@5öú˜þ&æ;-¸ªê3÷ó¿ÉÚŠÆsÓ‡²¶ ñLŒû˜ýiN±3p:pª¶þPzéóé›ÕÜÅ_OOž)rÍ…–’`zÃÍ~M¡l {W{Œ×Ìcmìj.f¶3“[µè×ÇNÅbEóî‚ö²‡ û"S'æ9é¾ À"`Qº»@¡w>,9 æû÷@÷mpÏp¹â‹4D¢Šãª¢5«ôVkKÌ èz064ÄØÐPM}¸ÂsjíÇÓd ìÈÚ‚Æ#¥ÚZ‰ñè6͆”°{kÖVxBˆ-ö¥”×ÿYñ0øŸzÖ̸<û3Å«%ÄôëAýškA«°ps_Þ:Öå võ‚#˜:~Þz½@9a7Èk”`Úf ýùÀš°îŸ¹.ȯ\G½d‘žír\çý¼x N—»rÇãñ˜T]¢]Jy§”ò‡R¶âÔ½v¼ÓYc¾¡ëη@ˆ)|“~ l¹+á¦†ÓØ^|;Á¦ ~W‰Lýx •(;ÿ”Sh[¾|ÒãoVæ±ãþ][ÔùP«åv} ¡ó‚ãhûýkÈ_ü~8ü48ôlxí?ÃבŸ«Ú&ñ”W#:pÌ¥—:ûIú¹ŒkkP²µ‹z é¹K—²híÔèþGÍ“*­¸ÐÒ+`ÍIÑíš“/ËÚ‚Æ“/À§gm…'„$uögŽf/I)å©iÖ ¸êÎOô݇¶®x „˜a;fR« WHŽÎazÖíã°öÛBßnoï3kÔ›ã›ýîÛµ‹ýÃÃ¥/¥õØœ$è~£¢>/íÙoŠã@ß*8ã/àß_·ý·ê©³þýÝ<üµên˜§9­»Bû^zɹ?Ißqcìƒ> á(tvÒ>kVM}T{ýîÕL¹Óç‰I+.´4:ƒ»³¶¢ñìÝžµGä`V_ÖVxBH³ÿEàeÀw€ýÆ~ÿ?©F¦k…ž"ÉZŠ#ô5¶˜1}Í„\WŽ+|ÇUw?¨<¥)øÍ¾ôûðâo[Ño‘ÊòŸvøÆó°¼ }>: )ìé‡ÑïüíÝÆÐý/òÜo¡ýÎoÑ5ë[<þ<9 *óDõ S'AIãæ¿õÖ)¯k¿ÕÄèÛï¿ù¸VÁ×®þM›ŽEµ‚¿ìëêºÎq®E”Ð÷4­¸ÐÒžíjk5˜ú;ÚôŒÂÝßÊÚ OIÄþ9À)¥ÏÂh!‚Vø ÃŽƒ#(4N²²™”«ÿ†-¶eÚåZ…Ö`vØW ‹3wåH`xa Ü íí/"'`Ïì•å·Qå8'ýÚcèq’Ník– S…¾ýØî'¨ hW ®˜ÿ¸DÙéÃul’ókë½'ÇãI“$:nWió´==5_­pq‰ª°¾t­™H«÷‡‰?ó.€âÝ}}áKfÈŽ)¨íZúºmà×b_÷7ì^ƒ-ƒðô0l‘°@•ÜÜ[ú¤íÆz\M‚«z—,‰í•ŽÓwÐ{•ÈlÛw»ÿXÇæräòùòóñ½÷TMgm¿£3’ö®Ö íè[’µÙPhËÚOIÄþ_)„ÈG¶ô4 ç|ê!qDÏžD|EçêÇÒíÆs—·Ùô®Û ¢:–~ÕYg1åJgòo©‚?Ž'ݾë WÒD û¨™ô*Ix„²7ßµøXÎzlÖï7ÇJ’°{âå—O>N+´,Hä'¡Úãìñ]¬<ñD޼à‚Ôû­6Q:é8žÂÅ-¸ÐÒÂCà¨3³¶¢ñœsyt›f£k6¼á#Y[á !IÏ5¨²àW”ÓÒH)åAéšå™.|'`¡¥¸qÕ®¶âç"hbaÖ¢w dó5-Ôõì5úB<öŸÿ9i·)¦õƒšñÒ¦ÑÂ[O4tÉMSô ã5}LÔµ KÞu‰~“•ž}ûºêsÓvš;9Î5Žû>˜çtLÒÛÆjlqvîz!±¨þ£Æs–|’æT›ŒV\hÉÓZŒgm'„$‹j}¹Žv4-iyøÒ&i<·«¹{óK IDAT}Ð~;I6JØ@¥@ j¯=֦൫ãØÞvÓ¾<ÐV:fã•cºNî=ÓŠ --:^vnÖV4žVŒÙïènÍ…ãfQžý)/ õd@I9ª¡å©6F¹VLaiÚR«Û¶Ån«=í®°Û»~µvÚ¢ßôþ›e=åSàÚl$°ëñÇÞ½{Jl}иvA!Kí¥MŸ»½‚¯ù\‹ys"bß)Г•.`~©ÍvT’¯¾`Æù Xm÷æ_ýÊÑ">QNû=N:IÛ6è»àbbl ‘«|Ç’ØäºûBäÃsZ˜=ñG›†Pœ®«ÈÔ‘MµýŽÎH¤„áÁ¬­ð„%ö0{~¤-ú£Ä|’øâ8<þãñë훂’{[ƒÄPÎúÕ^ gÛÓ^D‰þ¼ÕV÷]ö<ý´óº™Â9è_˜éí×ÇäPÞö.£m‡šcÚ¬ím3ú-¢*õ`½Þp>qÑ×pó=÷L9—$qóa¸xP;»_—  ñ ›˜Ùìxúé û 3ŠsŒ÷ö·8þ8k ÏàîÖ\AwÓ=ÑmšÑ!xøö¬­ð„*ö¥”›ÇÏÔÝš&¢Þ·ó“zD%6¢î.„Ùa.tÕÖÓöÔ›ûíɇëX×õ4“`Í<¼qŒy'C?7Ãuò(¡ß]Úò(Á®WÅÕ Á†mú¯¾…Ò1c”Kvš¡Q#@é¸*s¢kW‡;ª¯8ùf»¸Ÿ Ïx’ÉJµž÷$¹Iñw<ÇS+¡b_ñ.bü¯‘R~)5‹”E¿¹—™ätLÌ2¡?½>½ê $Uý<Èž4Hòxâ§?|œ¦-®ÏO5cx¯~“ÐjB`ë“jk5ZQðîíoÍóžAÄɹ@Ñ!„h·öµ !:j1@q€âß„O !„O !þÒK(>(„x¢Ôæ!Ä«­~Î)û¼âÍÖk§ !îB –Æùǹ}Nñ’b¯â»BˆeÆëoBü”Øb²šä¾0²ô>Ökl-€ã7YØ|lŠg³L§ýška*òÒ·Ý0²[5ÌS¹–@ üyÀG+8õŽcéßþ+ßµœåk`ÉârÉÏå:ù® E:dÇ5i’ÆëºMТZöõ0Ñ™Ø?U`ç#˜ûÓ¼U õ¶ÁüŒL‡óõx<ÏT„+iÉ}BˆÛ…G¯­Bü¬ôÚóBˆZÇÞ&„x[ã­'Éÿ÷¯°ö|¯FfgJ)gg¯>i´yðÿ ¢">|Kq´ÑæsÀÙÀÑÀÇô$D±øoàÿ¡¢/ÞüµâuƱ7'¥ÀNà!DÕÿ“³ã2`ËÂûqPX‰öˆë…¬Ì×\«¥Å›-¢í‰A0° 6?»÷–ûÕ[{öçµÁIo¥ß~ÿ—pê5ðÍÌýÓ³úDXØ£bù;©\̾“`zÿ]ÂØU¾¦^ÿ¸Ÿ{]$D‘¤zM’cìãjùÜÇ™|T3A º ',·y<OcB|xp°ø?à„ÝBˆÙÀÿw *^Ÿ üžâ}FÓòg;‰nÚÜiíûJ W”òi)å_I)Ÿ.=ß„Ê8Ãhv ðORÊG¤âfà—€½z…­‹@‰ûG¥”ÿ$¥—Rþ¬Ôÿ!:Km®‘Rn‘RŒ*;z¢6“ß¼jD‹½_F´©¦ß(N¾â çþ8Õ^Ì1]ím›ì8s[ ÅXflº+d(LìO«/¼GQ±¯ˆJ~Döî„]EUÓÞéå©_~t¼öMpÀÚJÎýÇȪõ*ÌGÇæë»„~Z“º³®¾º¦ãÓôXÇí«Öó>è˜cX¾qêOXÜ>“~&½G¿E9×ý;ÚÔ,9^ñƬ­h<¯¯íwtF2k¼ü Y[‘WŸ–R>$¥Få®¶o(m9”^‘Rþø4%=9I"öÍ‚#½˜hÚœ Ügí³ÇÉS9Ñø#Ô]†»€—Þ$€—¡&&÷ îŽr²N¶‘RîžÑm¤”ÿ&¥|e5'â2ªï©%N¿QøìÝw'híÓ|ìòDkA$x ù|¥àÍåÈå+?Š…M¦Û´µµ‘/Ê^Ø\ŽBWWÅ5(tu! …r¨N¡@¡»›ÍwÞÉ®gŸ¥fÍBäó“öíiogK±›£êöÏ0ÐÑÛK®tH¢³“ÎùpÒŸ¸/Ê>@ßaÝÌžÓ19(æóz{'Ëkü¬Yˆ¶¶Ék—+hïé©èª£dŸn“oo§­««â3Ñ1kæMª|{;ùörDž‚¶®.îÿú×'ß›\[¢P¨hcËç±o~‰\®ÂóôÇ!©xŽÚÕÇÞmÛؾ=ÑXö÷'(¿$N•=ŽŸ 4)OÔö;Zöé\®rŸ·Òö í•mò(´U¶éè®|ÞÖ¡Ž3ûíœ;¶À£w¨}í]•ýäòªIç¬J{ mÐYù{Gw¯:slÛžî9•çÐÞ¥ÚMŽSý˜8í³ÆîèVû5ù´wNíç®oT¶±¯_¡òw”\®òœô¾™ÄØHSäg!æ+¨ÔƒÀý(=¸¸OJiú%ïBÌ*µ?CJyc㬎G’OÔƒ¨[&oHÏB\ƒº fìþpE)VªMñ&àxÊ«û"¥ü¡”rµ”ò`)å׌cgöÊ»Pá@ÃÚ„rØa‡uƒzÇGN=•ùo{ϯ¿þ†èš;wòù‘\ÀQ^8ù¼kÎ^à }÷Ö·²ê´Ó&Ÿ÷­XÁy­ ã´+¯dé† “Bbé† œþÞ÷V´yÕµ×ÒwðÁ“ÏWz*Ç¿ímâ#̾-÷Þhß!§6Ùϼ+8×Jæ=õÊ+Y²aÃäóÅë×sÊ{ß[!¸Ï¼æzW¬˜ •9äÔS9ö­o5ÖÈ~Ø]Z9øø×ÃAëËm§¿½rìSÞ®,?_¶Ž·¼Ågý¾:Í¡ÇÁú³ËÏó8ÿJh3Dø‘¯¬|ïºç«,Gìñ¯›jßï¬lsÚÛ`‘ñ›¾üH8ñ’Ê6¯y? ”Ÿ¯9Ž-ÿ¯§Ð¿ûç•ïï±ÂQg•Ÿ÷.€‹?^Ù¯ëýµ?¯ý@ðçOS¯ÏßÉ—A‡19rÙg?V7Õ¾K¯Kýûû“íðµ¿ÇÛNàcÁ§n}¢ô`/°Çñšyì´DHÏÏ+„8ø1p+ðÊ#~6p–”òÿb¨„úçKO%°NJù\éµ£&gI)Ÿ0ŽÉ£Äÿ›PqR?Bi¯C¤”'EŒ÷-`»”òŒ}—/¥œ/„ØüX,¥Üf´y¬Ôæ¢ÎéÏþìÏ–~âŸxî8ʉ–‹KÛdÆcIõ¼ Ï~\Ïa=±´rÅÝ»f—a!AZ`ÍJÍ1rûm\áEf)LWÿú΂~µÿI/p•:P·ˆæG ëz º¸m¸b·þÓnžGÝ!0=ú6úîÇå\;"nõ(’®¾„9nœ÷"¨BOœýa}‡}7ìׂîÀUíw1èN™|½xòÄtøð‘|dÙu×]×”ÛõïèG×Bw^]“€ægm™Ç㙩ܹ~þR9¢`hÙþ⇿qþ––<û»€¤”wûÿø-êgi”òUÆk'?z¥”ûpJUÛ³/¥¼8Ø ¬+ý=6‰Ð/õóU)åìÒÖ+¥|®TmçsÀÅÀ)¦Ð/3!¥üXÉs?_Jy *¦>Îä÷—ì69Žr˜Ðc¨Ðëãõ‹BˆÀJÔ$ 6cK[¯%*A ’z±hݺèF‚l“ŠÉ ä^ݯ™Èj‡AD…-%°`õjz8`Êø:”g¾3fc‡#mÝ ÅoÄéŽìEäTeþqÜâOoa‰·&iÜô]yâ‰Ñª ìóYÍw!*¬&Ék=óçÓ=o^`iÌ ±j §sa»8¦´éß”VáWÃUkàƒkšHè/?"ºM³1«¯Ò“Û*^ŸßÑiM[,XžµNN˜¯~K®Zº>pfðwQJ¹ÂmêÁ*„ç>Já<%´æ8`ÓtúP#”þPJùêÒ߇j5 t!oNN•Rnv´9P±ª4)˜/„¸èþ&Æ_Ö!þ T*ôTT8ÒçJç4 ü+ðBˆåBˆ^Tužß&Èž#ЉFRM2ãZ#\&Œ ¡cï·?pqĘÐ×b¿ÍØ „ -¢ƒÆ™½h½å;ræ5ÓáFÚÃn'çQ+ØŽáÉ}ùÖÔ~üaúØWÑ—¿`—µ“qÍëàz\ «œØ¹pÙæaÚ¯=ìI„~œë±ä¨£8°Êeö™ô»÷}H2y:gÏ dùY[Ðx:gÁ¼%Ñ횥-8Áé™§Â¥šƒþDq„¢ ø8êßú·KÛªâc§â(à”ôät&jÝ „'¡*×,–R¾F±è–Rþ¼N.E9KŸ0þ¤”R+®%ÀËP¡Ò?N’Rî")åf!Äù¨‰Á ¨;ä*¥üŽÑìK¯ýqðZRÀNTŒ[Å&Iè@ªdÄ]h)iRe5{^-ô (‘o–°Ô‰¯qƲ¯÷Ó?ûYh;ôG÷oVíÙ<ýä.¸ˆeÇBçúCàäwÁ–_3ôÕoðâ“°Êð×Ê·Aß ýÐÏ…ã˜$ïý]_øBÌ–ñp…DUÂÎ縰öOÜv[h¿vˆM-ß%×±I&/žÌ÷nˆnÓlôoV[«ñ“/fmAãÙ½nû·¬­H)ågJ%6oEÅáÿ x•”r?€â\”¸ßìEUŠüÛ¬ìKl±/„¸øà?Q^xPÑT=¥“RÞNÄ)åý@ÕÓåÒwÂ¥”£¨ÒI©•OŠãéKú½Z¡ÕgžC[ˆU­˜qõ¯íÎSZì %ž‡Jû´×<Ì{jÚf‹è0d—ãÙ[²eÏ“°m Ìû¿§hÿ×Phƒ/ÀS»U` -öM/¾i›m¿ýž™÷Í•uíI@iÍ$Õ°ó©å3éʉGŸ–ÐŽâ%ô½Gßãñx”ò£ÀG^{8µ±ÕNÏþ5ÀùRÊÿBèâ¹G…ã1°=¶õ&ëС´Åо~¦‡=o<×"7ÇÔž.¡éïAí5Zj[ôøf˜®›¿¿ôú“#0{‹ºû ½þ#¨[Y£”W൅¾Ë³©)jõ]3a7Oå‚(Aë›Õ|v\‚?ìZ»Ú…õ‘Ô–F´‹{~š$Bß{û=ÇS Ibö—9bØÇH ÔŠ¸B3¢ó‚F7G NŸgøÃ±ÇMºÐV5ml1,Qby¤´™ñîA±×ö>[huñÅ,Þ¸Ñã/›<«CzFK6í¶£ª«lE…ïì§œäkzõÐZ”«³ô\¯´k®B åE¹âpÁ'+Ë ¦y'©ÖØó¸±ùög#ŠÃN?åÇSµ]QöhÂì 2C±<3œ7Äÿm–­›Z^³°Ë¶¶}K+Kdz¦I„ú3BˆRJs±«À¦”mj Ò ‰°‰ ‘ˆ®I@˜ øõÍ7GôLMQ&Ž÷W‡ÏLXû c ø$žÛG¾÷=&ÆÆ¦Ø_dêDÊü:¹VP.ÑIi߈qŒöäÛá;æ9¸ÐýÎF•÷G•íÔc˜žx×Ý ÷ÖÿøÓŸ=>Q±ùiyªƒBcâô¯ÝöÈ#LŒ…†mÑg-!@Þkß"ü¢úßÑËÖ'ÔÂZ­Æ-éüŽÎ(öí„Ç~‘µž’ˆý€o !>„o®þ¼†y¦%kñ׿©ö¹\PHFµK}¬üZ<ë¿PÿÔ‡)æM?:8Û=ÐÇ}¦Ø×%;í±í…Á-µÐ7óöSNJÖ!<ö9™Ïƒ<ÈÚþ¡þþTc×ã⊯¯Å›t®>÷nÛæØ›ü˜ß?טöD"lŒ¬Ãï¯UhÖrç&ÉÝ© ÉAœ˜÷z‹éZïløðÇãñ¤Aì˜}!Ä¡(§â×€÷çH)?[/ÃZ amX5õ  "éBKICfª9Î<ÆLHÕa4vXŒ3Å¢ ˜³lY mA“ShRŽË¥²n¾¾Ô¯F‹}-ø'Œ~ ¨/e/jiéY(¯¿k­¨/»^S¡‘"Ó>ç8ŸפÅõʼn“ï[±‚ÙcÔp{‚<úК -Í]«ìõ,[€çgmAãéš KÏÚ O±Ä¾â:ÔJ³ÿ¼ø'à!Ä_ÖѶ¦G‹±<åË LA&bâ&Bº&.®M^ñ4©à¯uc‹æZûÍ ˆÜÔwþþö{ådá!Ê ¸ãT&ÛÏ£âôóT®%`’GÅï/C-ù|Jü·Sž˜ÇèÇ®÷¼½»;Ä’ú`ç?Øݨåý5›wÐAÌ*­–\Oìï[ÜIhÅ…–kÁúí]Y[ÐxºzaÉꬭð„ùM,-Hu%ðûÀH)‡J«Š] üâRÊïÕÙΦ%ol:ìÃô…\D…êhâÄj‡q׫[ ¤V“4œ¤–|›çî½wÒ† \¶#ŒçftªÕAµó5® s¿ûí”Kiê69  ˜‹üíí02 ƒ”'vþ€ndò›o~³Â®,bÆÃÈ£lŠú̸öoºãŽšlK‹¬®·§A´êBK»·fmEã¹ë›ÑmšÏ«Í3m‰3í~7ð!)å—ô)åð%!Dð.À‹ý*щ—¦×v˜ðø{SF…ù$™L'\/޵&{¬ X~ûºÅÛÛ“³(Û\×Lò5WÖvéª;ƒÀĨZþY‹y;ñ£?{ra3’D] ¼ö~MÐ{æyÄí3h’^KN‹ÇãñxIijtè„Îâ{ããìKø#t.øÔ§"ZÛ“41¶ÚqÒKæ5:òu¯céÑGO¾VŧZa¯m´ÛØè„Þ±Ò¦WÜ/=F­È»µ`× (±¯ótŸf¬~Ðõ9ïºëœû“þZ'aÕÞmŠSÁÇÕfýë^Dz‹jÅ9¿¤“g¿ß´âBKKVÃ)oÊÚŠÆsÉdz¶ ñ,> N{kÖVxBˆÆõ¿>+çß´%I؉^AU G»¤Øaq¼‘a±î?þdíÿ¤’\ZÆpå4Ľ»bþýÍ׿²òʹÔ2Çr‰@WøF]úyÑñºÞ7aìס:z¥^Ý·ž4˜k˜öJ£mï]u.’|ã¾Ça¡0Òñz˜Gܼ&I'ÿô§ŒŽN±-*¿Âõ :'WxV^ð7!­¸ÐÒsÀ emEã¹éCY[Ðxú7ÃÀެ­ð„Gìw!þ"à5Êô8ˆÓ+˜ºÒiÐpy=ÃDIqDÑàŽÚ¿Àûæ8µŽ-‹n_¾K¨Ù-MOz”è“F[×X®Çæ>³–¾™ãáÊ!0ï$¸(Œ‡¶IF¤ÑŸý IT®IQ†ö왲/‰ç¾šœ€8‚ßÓd´âBK¿¥MÍÄxt›fclDmžiK±'pJÀkðk$×@RaáòzÆéw:ˆ ÓkÝh{ªpØa0®j6Aá7a˜ßN ÷] ³­öòçý¶·>Ì®,âÂ*]WžgªÍqsI¦›`žN¶x<Çc‚#¥<]JyFÀvº”òŒF:“HëP‚aX¨BT8‰k˜½ëÎOo3A4+\×Ç^˜kÅ+^Aß¡‡NôúØ jÏIº#à²7ÈN;9ÛôìÛ!aa«ôêçÇ\ziÓ«F'üêÉR­>¿4&,KŽ<’ÞÅ‹Sè©’j]9ž&¡Zê[G¶ <8ù²¬-h<½ÀÁ²¶ÂB ®xQ_¦›‡/*ö9ÊÞ¶®ôª)¸<ØYa{†Má9¸{7£û÷;q=OÊaÆçyøãöe ø¸=Ö¾—œyø‘Ç&ùÌko¾Î)H*j«ÁAàŽY³ˆ<>N ×\wçt›™t÷ÂS­X•flöíÌڊƳw{Ö4ž¶µ°–gÚâÅ~ˆšG´T›”¬Z æBKi`—vt%=6Jà ²í>šèX×ó¨cí„\({¼Íx}=$îð!{¢%ð]vë1ž¸õÖŠp¥8$y¯ÌDc—-Q¤š¦ûzú®»ªî#î÷Øuœm‡§ÉiÅ…–v´fÒæ·fmAãÙñœÚ<Ó–éâhm Îú׃Ÿ¶ •Ž¿I<§Yˆ3¼Ä¶?MÂJ[š¶ØÏã^Ãjlvc†éدëð'×_I'…qÊ¯æŒ ëqqÚØ¥HÃHš¬ö~Å9ç °»­=IL2Aû~µrÎ7ÿ2k <§¹ðb?EÎyÃÈÏ™Ú&È›œI’}ƒŽ·ûhïé©Ú—8m$Õ„¶H kÞ¼Šón„è2=óAbµV;\"ÕdÎ’%€J Õ ½å)'Cðû)b´IB/¾ës'wE¹BœÂ>rLXÿ.\cFݰïvµß}vŽF·›QtVÿ;:cië€ÞY[Ñxú–dmAãÉåÔ"jži‹û)ó7»w§Zú2QÞÅ$ÃæÕ¯~Aò$ÌZ?I<Ç6ºý!§œÂ‡ئ^̼»áª¬Sˆ8wNN¼üòÉ ?TåœöÒß(1!ªÇäøØË.cÉúõû þç0,6¿Z{[Uä›Ì¿%k Ræàæ§ IDATâ\hiþrxÙyY[Ñxι ïZ™µ)qSõ¿£3–­Oª­ÕøÚ5Y[Ðx6?Ï=œµž¼g¿\uã¡¡iz(“x{«·8^¿BÂb¡“W„jfÊ2/fhO”g?꜒¾÷º½®ž6†=I«§ØÊyqÅ܇ÅòŽ2a‰ý4Ê‚º¨5™·Õø½{¡Ø,3§V\hÉÓ:'`¼Ùbïš /öëÄß–DÐÿªjþ‰MâÜöŸŽ¢ÁŽvU” »â w‰ËtüQ Àq'CI*çĹ4 #ÀSWx¿Q×4i©S“ c¢î˜T[Ëî?É÷t:~gM¾‹Øx<OÚx±_'r¹«VS«ŠT“[MÌvØ—-öóc.«o^T­)è]¯Õ:¶K ®:ýtqD½SËû_OGçI—_>9Îhi› ¼ˆ˜þlÙ%AIÒëa9é¤ÉÄä¨ïfZïYš€VàÑèe¦?­ϼ`9{AÖV4žVŒÙ?`¬:.k+õÄ“«jaá .’ŒV~P3°m[ÌÞ’S@ þµ`_¯O=U·óºC¡Ñ×>è‹ç½SÓD¿ç[~õ«Éÿ’xB¿ÞÕü<ÛŸí8Y³«íØÐÅññ)á?q&ÖAå¤úV.³‡µÿ“µ)°§~¿£Ó–ÁÝ­ǽéWY[Ðx&ÆÔ"jži‹ûufù;ÞQÓñA^A;‘³^<þã§ÖW˜½f]÷8I¬õd×æÍ ö÷×ÔG’ª@qßGW}{ÒT6R{àÃÆÚrÏ=SÄuÐ8&Ó!$ÊÄàam¶ÜwÛÝ+^M\ßÉ´>“Í¢ž6Ÿ*k jäÁô~Gg C­™ »éž¬-h<;_€gÈÚ O^ì×™~éKSö¹’“Pª>À´×žfHÍL;/›´Ãtfl|Ð$•ïñãÜ]Ÿ­ZƒëM5aqv۠܈¸•­Â¾ÏökiÜ‘kE.¿/k <gæâÅ~xÍ·¿úÏ>Žà[K?nöqABcÎÒ¥ zs÷Ÿäµ,Ä£mÇœ%Kèî뫪¯ û“žW‘dw\ÇšÄ9~áºuÎýY‡˜¸’VƒbáƒÂ¤‚&Ýsæoo¯hkY-QŸ}¾“Œó~žµ5ÐWÛï茤³<8k+Ï2÷ïhSÓÞ ]³³¶Â‚û àœ×½Ž|„xŒ+Ô]uç¤÷¼§¦ã£ìÍê6îµk™»lYêcÖº0Ô¶PSXḛ́îüóÇty¿ë91s‰î$ù+q'Ç.ºˆ¾+*ÆL‚k¢åÁ3á÷“€©üp+ôÏÔ°à³kû‘Ìš‡“µçè\Hì £`ýÙY[á Á/ªÕ nرƒ÷Šèá¶È:dçû×^›zŸ¶ÐÖÕ\â$F¦…4Æ5E« ^ž‚ë=Òûã”q¬v’“Öõqûg>3i¿}µŒ›ô}Mš–v£¹Ëffƒx-®ÍQÞþFåâÌTø.È7fmEÜœþïè´§³ÚZï^ŸµçÉ_©Í3mñžý²ô-o ¬ØQ«°ªuRG`ÔSˆ7úƒXmyŨZõq…Z˜WÜž<Ĺ6q¯ŸÙ_È—¶°äèFN41VÜ1¢*'y²áïZ0çÓãñxjÁ‹ýrÕ7:÷‡‰Šjb{§» ª¥ßhfИq…xq¿TqúŠ.cŠ÷°±M1Ÿ7¶Bi3+"™Â'QÔr'£̉tÐ÷§ÖïˆkŒ4¾wÞ«ÍûîÏÚÇã™Yx±ß`.»ýöXíªý§ŸvÒßÉW\Qñ<­‰„+ù4‹ä\×ù¬9÷\–kꪭn÷<Â*°$MÈë/¨ú¥­ xåÕW×µìiÜúÿQwâÆÈÇùñêWÓ»xqŒ–Ñ}jÁ_í5òyâ³þGY[s¯ˆnÓlx0œò¦¬­h<¯¿:k ϲupø‰Y[á Á‹ýóŠSO¥mÑ" ¾(7=ˆq©¦$¡‹gï¾{²¿Va˽÷ò’± ZQ¥/ã%øã¾‡f»0᫽ô ÇØÚ€ß~ýëÇ'¡–»=ª&6>(®ç3Ï0:8»_Ý®–p§ JBžø<¸îÝ•µ xâî¬-h<»·Áo’µçίgmAãÙ·v½µž¼ØÏ€ë_|ˆ—Èi œjÊjÖ–{ï­è«Y ÂÎc°¿Ÿ¡½{CO3ž;®˜¯µà%î»vÊÞþÝOVCWó^›?(Õæ¡„5¡1?£Aß!“zˆá÷:Ìî°2 v®‰[ZòV娙´NÕS÷fmAã‚]/fmEãiÅ…Ävo…íÏdm…'/ö3â˜O~²ª8ü aàK÷Å'ΤEÇÊ'ñÔ§)Úì¤_—§:(„(J êp“ ʱúvßÕàú1qyùÃ~t‚Î3i˜N'_¼ÖwÁŸ&^üÇç²t˜{<OR¼ØÏˆ·]uU¢öQ±ÂõbñGÔ±÷lˆSó9$Qwœ>«ÁôT§ùE•À80 Œ—œxbhKNâÕýšu3Á×ÜS¨Ç™ÔFƒÉ¼åËiëìœrœ]©Zâ~.„µyâñ[àù¡¬­ˆÁòæû¤{tdÖV4žVŒ]ï™ ½ ²¶Â‚ûò™ÑÑÐ׫ ݉›—5çž›boÓ‡0ýì¤kîÜØ}¥Š´âm-±ï.L;‡=À0°n]â»®¾í»fÕ]æ3I||µ6Ä©’³êôÓéîë«Û]™8m½¸¯eÿµ1xÙ«²¶ ñ´wÁüåY[Ñx–®ÍڂƳx5´>k+7æx®ü€$T+Æ“|΂>—qÞï þã†yªç†èâYÇÓ²x±? xÿ¦M‰™ébÁ´¿‘ÙˆÉBÑÚÒ$¨z¹/¬jK’pSx›¡4¥¿açVÍÄB£ÏÑuýÒøŠò¦Û“ù8í‚òª™úê<Õ#¾‘µÇ3=ñb°òC(,\»}T’4ÅÂÙþpн¥‡)XÓN`=ê 9䤓œc¦MœÉCT›¸kWŸ×|ò“1z*t=ìP™"êÎÁ„cÜ´ˆº®ÏˆŽ{Ë[˜]úîEM¨•$?Ó'òYòô`Öð†éù;ZWçüAÖV4ž7'ûm {9¬=%k+âæ¯\9iKX‚iV˜Â9Èkm’£\ã¾%ú T þµç7å8³’Žøºn~[MÑŸ®þâÞÓ¢{É‘GÒÞÕY3((iÅOc˜vɺk¦æ5=³ú`õ Y[Ñx6žŸµ§o‰Ú<Ó/ö§#¥=aªGеc=@eÏmAĵõY ¤ðXV3=j_­ˆ|‘ËM‹/GÒxpûô€”§ÞœÌ´uwŽ?aí›Î•f¢ÂgÌ×­[7¹‚®«Ÿ O|Ð~/ø§ƒQ·¼ɒó¶ ñ…¶¬­h<í]Y[Ðxæ-Q›gÚât§!74Ä•Bľݯã©;€ùÀ(ðjѤZkÂßõÅôÑI Ek_Z}×Ê <Ððp‹ ÄØjtry»u¼¼^L«ò„P¿¿ùæ76Q‚qÊ^ú餣ìp{¿þÏÿŒ=ÎtKž÷„3ëÛÓ(Y÷'_ÊÚ‚Æ3°þYÖV4ž»¾™µgÓ=Y[à‰`:8/=zOHvû3ô‡sˆ'Æ÷Isâz¹Óüf݉Šã:*oͰ;$E—ÀCMí»‚„>”ÞÒ[–9#Aá6aa8Aûâ2ݾKžx|陬-ðx<žìñbšrÝ/~[PåP¡;íÀ00ˆtÓÉûªIz§ÁNä # ñ™Ú;:(´µE 𜵥홶ÀÂzݵϮàc®¾«=ûÃÀ•+ç¶;Âxôñf­|{E߬¨fòW­`÷Bfò.ïpÌŽ\®5CZ:Ü¿£O–x±?9çߣkç( °ÀÀ#Àž°ƒpAÂ…–â$mWd¥áiÖ_†5¯zŸpB¢XxHGšži;1Önç*E†‚3FÙC¯9ïºëœ“ ;Á¶ÖÒ™õÄ.ûiï·9ýýï§gþüÄcL·óösܳ¶xÓ_)ñÛJ,8^ù®¬­h<—|>å΂Nâug? þû^z‰â„ x³Ë¹]ÇF‡ô¬zï{ùÔž¬ÕêÌfý26` ¾¿£Ó–V›à€ZL¬Õ€áÁ¬­ˆäúÇáò_gmE6x±?XyÅ‘mLÑßì?¯iܱ¨&!6¨qaXÓ?A¥ø4žˆ8“ ×BÛ£'zŒ0±œôÄu7¢ž$æ¶MI+ï¸Þ‡ZÏï¯÷ïçþöokìÅð¿ïñ´$CÐõmø“²¶$;¼ØŸ¼ïsŸËlìuç·Æ!æaéÆu[_ÀÄô"›a5öʳ¶·^'Úº^Ó¸ú3q ø¥°1sœp°¸?"f;»‚PV °‡žrJEý8öÄõºzOµçuá÷¾ÇßIIWW &8Ö‰/?ýY­®û²s!—ÆÊ'3ˆÞ*–»Õ8ù²¬-hÛ’Â@“j #F¢ÿI'±na~ÿ[-y p„‰Âl¸âøßx×/[–´¼—dÊ^²­‚ŽÛg‹o;sm²ØøÉ°m·­–=õTëº?†¿wlªˆ ü"ØÎîì…óŒz|¶yç¯Mû˜lˆz?5ÆqÙK/±Ûî»g©F%Œ+߆›öÍs£¯=”ç €†ºòœ´¹ô©ÔeJ…ãÿö˜²67ÆmIa¡=ûEÄU“bÆ?A6›¢/[±ñíh6A·£mD‰Æ”ιøýòÃŽõ÷X{“t3™ γ’DÑïÙTnHe%_^¸[V¬P¡Ÿ'~ò~Ü(Š’mv¶À¡Ï8“ñUè·§ÿ¿5_}:¿A£kºvÍk{6©BjfÚk^áû쯧sÏžtêÖ-ðØT.%Ù˜<Ö^P$"ï|2üfýaD{ Ô.£n%Ð 'a[Ð0`º.6^»ö½õ'ÿJ—t|ãýöVVWG:&®DCfÍâ§MM}â‰9¨]IFu¾,Ë1ÑRU ô·ù§Ï ¸-È?•±æ‘˜÷tþ3¼²16 ûEÆä£Ž¢v¿ý²RWs #AH®¾¨íÂOC'NdЄ ¡vøýÏ“ÕÛQ‘˜êxÆÜ°žz¿ šü;iöì„c<¡ŸM_?;bT¶"GÙîMQÊÚ{ÕU¡/vAÇdCô× ÌmÍÍ\~×]Y¨MÉ„&?Íç4¨S5eæ·ßs<3n+òϱ³S—)5ž {MÊ{³Ëë¿ür޲•²û"rºˆÖþE"2+ÿ–sÓ?²ã¥7ô!+ÑR©æ÷îmÿÉ'Yñâ‹‘êò'ݲ±…t¶Ü†üØç`·áoËïfäÖðøÕW·;ÆËß°‹ä‚S}—ì—or±Å·#"º#/ OÝtSèdlñýÍ”“zˆ[>ù„Šr˦Z€\º$Ý{-ìÚ‘Ç € ŸÀSÿ·ùçž«S—)5ÞX¾’×&~F=–Û6D¤¿ˆüˆ|äêÂ"òc©±Êˆˆ\."ºe–ŠÈ ¾zŽu]#"_·¶‘‡Dd¥«CÛ¥œ‘»D¤Ñ§Oo²öŸ%"Ϧ:—rù³¸¸$I™1Ý­å]k_®Fò3æÈ<õ ¶4W‚t|Èí,´þ„J™âÏlu$ ‚@%{ù€ö‰Ã¢É€#ÄwÒ–¬-èGÎKŒ¿í „aQëLvŽéи#?¬÷´i,0†i_þr^ÚS¢±ç£yj¨¥Ìãþ)¥MScÞ’‰=¸ÆéÍ}S^šëüp´1¦;0 8˜k•¹¸ø2иø³ˆìo•ù9p °?pˆtr··_>!ø_¢îöéÓ+Ó=‘²ˆÆcŒy@D¦&)W¨ïŒ8yÖ,ž=묤e¼.™î;LÔ2v”™tãÂ'½™VG:.'™´iû¿wä<ünH©æO¤CP¦Zÿdì(måòZfï÷uÕ_пÿ¸ÍQXÝ·Š¢D¥÷Cù|kŒYÜd­/‘;³­b§wcÞs×ï‘o³ó¬rþ¾@Œ1k;D$¬G Jtê”ÿ Ë¥g? ‘õ"ò†ˆœkï0ÆiŒù]\†…±ÀtLêDÉzà×òŸ ÄëÉ»mgÔÞ¨=ÆÃ¿ô%†p@„Ó§£â4(Á–Àɽ(Ìß~1òŽùÒìÙíF!’%î²Éæy¥zrUD,…}gÎŒ4I7Æÿç²ÀúŽÜŸ‡F&ž ÕR—+%z€CO‹ÛŠüSŽ>û#„ÃsVýyo8¿Ó‰²3xÓ·Í/§*[D|xxø1&!eœèêÓe"r‡ˆôkÝiÌÿcŽJU‰Š}‡£aÀnÀUÀÍ"rAº•ÜtÓMÜ{ï½Ì;—E‹e×ÂÄJ4ñ¬³lMÞ8f ‡ûÛ@›0:êòËé7rdk™a“&qè·ÚÜÄ8é'?¡›+P¶~þ9ãfÌ`¿ÓÚÚ5µµœ2~‚H:ðŒ33mZëzÏAƒ8Þ7¹÷°Ù³Ùó ƒZ×w7Ž#/»,A„så•ô=:Á¾Iç&¼{qÒܹtµÔÞ3f0ÁgßÉóæµ³o´Ï¾öíqÐAl\µŠ-kÖ°Û¸qL½ì²„2G_qýFJ°ïPŸ}'Z×ÏoŸ$±/êõóîx}G¸öy×s¨{m·Ï>oݳoõk¯й¶–™óæQU]ÝúbpP€}A×/èþÚL»â úû®Ÿw½‹“|×/èû7sþ|¤ººUìG¹~“/¸ Á¾cÇ2vútŒõÒ|äw¿Kß#Z×÷<ø`:óÌvçPÛ§OëúÈ)S;}zëzum- ŒáÜk¯%Sžyæn¹åî¾ûn®»î:n¾ùæŒë*F¦NʸqãZ× À×|§žz*#­gÙèÑ£ùêW¿šPæüóÏgw+¤é!‡ÂÉ'ŸœPæê«¯¦¥s÷¶ ûçd¼õ¨í gܘhà”¯ÃØÃÚÖû…Ó|¾ÚÇ_ Ã܉þuë`Ï}áø‹ËüëµÎ±㎀#¾™XfÖ|ǃgÂA–;X×^0k^â1Sg9uy §]ÓÞ¾¡ãÛÖ‡Mhoßi×$Ú·ÏÔûæÛ·c|üvû¦¤°ï¢ööÍøNrû¯_ˆ}‘íóßßûŽ¿–¿–¦}™Þß×o˜h"ãë—¾ڞpÜh¶”øagÀØÉmëýö€¿›XïQçÀ+Sýà±0å E>9ì|½¸;ÿ½ÂY?à€˜1cFB™9sæÐÕŠx衇2qâÄÖõ®]»2kV۔˷ß~›L‘« 8:Ñã/À/"Õ"r&pÐúP1Æ8#?6;¡q'sþw,w·Õ}‘PdëÖ­ /êË—/OX÷D~kµ­B`Ÿ}öaÉ’àP\Ƙ?´·‰ã>q;ÎÛÃ1ûŽi®sï˜7qÜvrIZ²¦,ÜxD¤BD:ãè€Î"ÒÙ ™´¿ˆ("5"R%"ÇwÇgqzÔÖ¦—°%L}szœ‰I)¿…éD\É´}{Òg:â°ûÀtí×/t¶²úväXï¶×óÞL[üzÿKí×ïe±õÞö+ÝÇ£PK[¯¿çZ“JÚø3òvôå*×!K=’Ýç(t>œ«¾ø"«B_)AzíæŒ”5]`·‘©Ë•CÆ¥.SjtéÞá9)|÷[B¿‘*àÀÀ¿ÐwË ‘Q®žì+"ó€>ÀmÛèìêÓ  Ú]¯v÷u‘ÓD¤§»> øðº=º…²û8C/ 8!Ž ° ¨¿6뀛+1·Çcjf$›¬$úüÃÄÙäóÏOÛ–Ž~©²)ð2 §ÙôhúOœl4ÖÞ— þã’%Å "(ª[ÐäZoTÝJew IDAT¡‰¶øùÍÀ°ã±_E[<üL"ñä¹Á¾þÙ©9ââ‹©¨Ê`€³ªŠS{Œ›?úH'à–9›¬{ø™Ð9¾lä±PÛFML]®ÔØFê2¥Æþ32~ÉÙ° ,„_,Èèj“3€€G«ˆÔYe :àœ¹Ÿ“1Qƒƒ6¸ËœÈ< Àÿs÷U‰È6`°H;ízY¸ñcîîJR$×Ã-yÇøAnQÅÒ£×\“ºP@ÛÙcÙúñ§óòðÑ /$¬G9—L\KÂÜcÒ©'È=Êv½ñ„½?úŽÐæªÓ‚ó xñÖ[éDâ(A&øC¡f#K.„Ïûèú‰EaØùçsé/™º R”|° öJžT9}ÎK]¦ÔØü9¼ð¿q[‘Êñ^¿ô§ŒûÖëpçÊìš’MŒ1Ï‘B>cÞöNV&Åñ¡õc€)aûÓ¡,Ä~¹°À˜ÖɺA>ëQDxG…zÔvÒ­3U}aî:!Hç< %î»}ý½xûÞ¶ œ½÷Bà z¯'m®@Xu$Ã~™:ÿ C„F½Fþ°¢Ù&ê÷Ô³·ÓˆÜøÞ{ÔÔÔ$-¯7cw}÷EÉ /m€ÉÏÆmEyQ.nìåD¯ÝœXêåÆ)WÆmAþù—£`àˆ¤E,sæÄ¬Ò¬Õ± n<%È‚–.®Hþ—ª'ÖcÕ+¯$Ýo·R.,q©ùtÉhiÉŠ;S”rè²’+láßðù­ûîKx°_âlqê%häÀ.×÷$èž|öÎ;„å™ßÔDee™EPQZéùPÝyV¾Õ>¤g©³m#¼õDÜV䟿ß·ùgã'а%twåÐRH¡ ÑžýDD¨ÝwßÀ8ìé²úèãÙÞdÐtÛÉU ü¨n~{6nlKÝ&ìG“éyøChfrŸÂzºý×ÂsÙ±ýò½û¶ÞÇÜÓi‡Ô z³)[=ðÅ>›•/¿Ü®ì¡?û ŒQ¡¯pí»YªèãwÊOì7í‚%™ÿ-9k#ç9*>ý¶nh·ùØçÞ|úñ£b¿Dù‰›D"Ê„Üt¶G)ב0¹þQÊDmÛËBDœ?¨(—lÿ÷¨÷ÞvËñ&øVáÄ ‹©_("‚CœQ5p ŒáŒï|'¤„Rn\ÿ^Ü(JñqçJGäÿíó”E•<¡b¿„™zgpÖåt^vßgŸ”eƒ&ÿfò"Ÿíêv½þžè°žiú J¯!CBë³ÏÍßÛímƒèçáOH•аzý×<™˜·¿'̇ùæ)Ø÷ÖßÃï þ0›s +üsUìëÒôhf½ü2ó֮ͧYJ‘Ðí/Y¨d·QPUf“»;w…aûÅmEþ“ûù^GŸA­y$,tBj*…E¡ü?VrÀ)gŸMe¯^ Û‚ü–ƒ2yiìôé)Û JÞ”ÏQ»l» uíÛ—Ú¾}“–ñ|Û½úüu¦+ø½:£Ó‘‰¼ö}²E?ÀnãÆ%”õßWû¥¦’¶žýd6Â&Ù(ÃQóæ±À˜X†É”HÔ7Áu°’±‡Açlï/pª:Aÿ¡q[‘gr½xÙk³– Bî‡ueæ­V,èÝgþ¦M\dEIW(>;~ÆmÛñ×Ó%1ë“ÕiOŽýäÍ7#Õ•J”{¾ðQhñýÍ´žTõ'ãå_ÿºÝ1vR.;zçïåeÃþŽâo¿Óðá\ùÆôîÝ;{”âbΛ0;y°‘ä,º+[¦Û6ÂkÅmEþyæ7q[W|—Üÿ@Üf()(„Ž7%ÇŒ¿îº´ÂcÆF3›.<~wÛ¥$ÊäÚ(qýƒÊø]]¢*ŒdºBÙ_6hÔ&ì~/î—ˆË#ìºÅ-ôm¤ºšÓž|’›?úH…¾’£‹ÛE)>Øæøå_²$nK”(¨Ø/ν暴Êg«G=ªÿyXŒöt„¿g³íCoOš$Ê;&L°‡ ý°‰ªÉ^²<›’½d"”£†üŒrZ|Ÿ½^}o šÌ[(9üŒºè"~ºk‡sLܦ(EÈòú¸-P”ÂàÀ§œLÓJñ b¿L¸¡®.p{˜@õ8æ?ȸ͎ôèfÚÓ$t£ÚáýÆLŸÎ^Gݺ-лއíמêX¿È·_4rE²y'ÎxŒ'ò=¡ïÏhkŸkØ‹Pœt;–¹Û·ó b¶D)väþ <ê[Ðs@Vm)xzï'^·ùçëÁÏÑRàžÕÎoàM_dê¯|å+ ><£”H¨Ï~™Ð½{w†œu«ïº+a{ªpÿ¸÷Þ\š•€_4›€Ïad³7yåâÅ­öØqƒ_ùG!*¬²ööt“le› mÏÞrKh]a¶û_P¢„öÌ'ßzã Æp@Üf(%ÄÑ‹áé)i´ôI¨ÏÝQ’lùž ŽWÒü5ü9ZÌÔ>Û›ƒ÷½úê«lܸ1¿)iw§›’G.ÿío“îšë—/Ï1!íÙdòåì¨X qûv·o-ã²þžü 9ék‘Výúõ­û£N¼õþv:ãDè)„Þý!³f±ÀúJÖyæ‹ Z¿ÚI2UN´4'ͪZ²Ô­Û‚¬rõ»No~˜ÐX½z5õõêçVÈhÏ~™1çÝwùE@ìü\ùY‡Eä KÄä/k÷®ç£§Øî¹oñm+íOyÇ6ûÊäó:Ú–ÿmìs­ - gá£Þ1¹š°[е+·mÛ–£ÅAîsZÜV(JîØ¸ úþ5n+”l¡=ûeÆX+–ºG2¡?bòäÜãÒQQšÌþL„e¿½ö¢›lÉ#™ÿ½Ý³_Eû—€T6Õ—k‚®ùÞ3fD²Ãúž ßé.;}Adcô%¨Ž)¿ý­ }¥0:¾üâìwéãÒõw*8>n :ÌÙ¯§'ôÇŒC÷îÝsgÒaTì—!?3Ñåõ€1c:ÔVØÌ2™E™DçÔ!-CÃpVVRQYÙ~{’c¼ý•ÖbûñGýþ$W™õ:ùïAumm»¹6ö5³÷·8bß~ñ «§£{ümt7ŽÆpÊYgu VEI´&ëö5seJa"•Õq[‘jºÄmAƼ½Åù^ßµ2½ãöÚk/ûŽºñ(@¸Øþûwæ5”bº‰¸ü¶Ù‰ ÂðGÀñóù{ïµö~aìï¹¶}ö½ãšÝÏÍV™dI½ráâõz`ÉD΄ä*d¿Ü$qï Å?¹9Êõ˜ýÎ;Œ pKS”|°²†ÕF(øzúC4ÔÁÛOÇmEþy¹8Luú3ìʰ§iáÂ…Ù5FÉ:Ú³_¦x½ûQ„|&"4Èï=Jù°öÒéÝ÷Úô—Mg²lб©êðzœý½ûA“výdKèg+ν]O²Ñ»¼·-U„§ c+¬mQÎaÌWp›1*ô•XþhÜ(JÇñ˜Ó›Ÿ©ÐWŠíÙ/c.]¶ŒŸŽ•°Í/²‚zY£ŠI¯‡½ÅZB˜+‰?fª¶“՗̦ʚ§wzWbô ÿˆAÐ 7QUh;÷fÚzÁs9I7H$Ùvýjjkilh}1ñO°õ¿ù³ì&;OhUH>!ØæG[·Ò­[™ù?+K߿†/ÇmERQÕagCÜ–ä—NµEsÎçPŠíÙ/c†Ùú9LΜ;7£Þb¶ÚdǧÓÓ®ÐOæ–öå9u*#§N =Î/†í6ªÝÅýAö$ó‰Ï¦ÛTT¡pü 7n÷&§Ê.l»áDÍ‹ô2a¯ÛûO_´ˆƨÐW Š»`G*¿µés ÿмØS0ôèÓ/ŒÛŠüsúâ¶ %rv…þyçÇž{ •¬£=ûeÎ-;wò½NZ×íh€§­DK™ŠÐd"3U$¿ôêJ6âhgûØGåÿý-©mAÛ«høU´ù¬Û½×as ²ÕÓo'ý u²Ûáøë÷¿XZÓ{K–¥Ø_&ÊÄëd0ú²Ë¸ðÖ[#”V”xèò`ŠPœÏÿv–YòÍŸÃÃóâ¶"ÿüá?â¶ ”^Á–Æì×ûÀPWW—ýŠ•¬¡=ûeNMM Ö,z¿+…—h)ø'ÁBÇ…p&/(Æg ¨Ë¿xBØ[¼È4éDÕñ»¾d#>¾GÐh=êb»æ´45µk?èØ W¯ Ì¹=.ãÇsc}½ }¥(¸ñÿ’ìlØÍMy³¥`h)CGð¼Ï?zÏéÉÏ…Ðذa9ª\É Ú³¯ðÓº:.’6 Õw:*aõÙ@£úâ{øýÇí·Vÿ¿—Lßhm»Ã&«ú£ïTº›ˆî·nû¯ç;q_ûÄþ›*šßm(Óó9wÉö?>ã%ÿ\õüplÜV(J"ê—¯€öì+.û^sMº'Þö>>; BRõï„ùõ®ÛeƒŽëè—z÷}÷e÷ñãÛE²ýõm·˜kÙ…Ó³ßHÛÄÜ0_üd1í3!j´¡°yœqFºÝ[Ÿl s"ɶ°òÃ.¼ÛŒQ¡¯%}Â"lŽžÝúäՖةힷùç°¯Åmç¿‘?¡?qâDzô葟ƔŒP±¯ðï×]¸½¦Kn„ØÚ¿ø±£¿xBÕs›IE&=Ë;·ne×Ö­‘ÊQïõæïÂI.ÕâÚçMl ŠSŸm‚æ'$ó³÷³mݺÀ:½ˆBÍ´úÐÞ­ÉOØËŒmSÕÀÜf ß~{K¥0Ù´ ~³2`Gu'¨ˆòÄ*!š› ®ý3¥ä©û"Öæÿo«#òµ"möêÕ‹Ê€D”Já b_iežjÒoKèx‚0ïh“,Ò‹W®è„ñ¦ÊW6¨=“^ó+W²iÅŠ„ãýQx ÑõÆúž¿¾‡_ðgÓ=*ÿ\t܃>xê©À¹©æøCp¦:G}'=ü0·¬]ÁBE)|Î}=`ã?—ŸðÝÙ¾·ùgéS±5}â‹°÷ùo÷‰'ž`Ó¦MùoX‰ŒŠ}¥•êêjö<眬Öõ ÔÃï])@ ÐGð§ã:’~÷dn'^¯¹¿÷Üîe¯¦-‚P>|ò=»ü¢=Uûö¾¨¶zÂÝ?‡Â#Y2´‡ÎmÆpÔ 'DhIQЇq1.¥|yú §7ÿ‘Ïâ¶D)TTì+ |ï7¿iXi€ê®]S“LFñÕ÷°£ÛØ"ÑžêÙÖˆÓ›î{žóNÝ»ÓÙõ?ô^8‚¢·ñ-Í–­žŒ¿ž|Æ« ›Ùô4¨]Yû¥Á%ð×…'™ÐÿîªU\·xqd»¥˜xo+¼`2«é\~n<•UÐk`ÜVäŸ>ƒR—É"r?L‹ùQZ]]H®Ç­•Ž b_iÇùK—¶~>áGO’, ePf^³]v;P4àˆèl‡ê¼ÿþ 9è À}am¹ø4;pl Æ–0›™v“gÏný6™8(ë­íÏïõòÛ=ýöyþæ7¹ÍöÐ,J‰sø"keÊ7a·QaEK“®½`ÒWã¶"ÿ;;u™,ð»U…iç’K.aàÀ2|±+"4ô¦ÒŽqûîK¯#Ž`ósϵ&ZJEh*ãô¶´…aPÏ1´%«òcûŠûÃY¦ËGV³ «™pw¿Ð·{ìÃzïãú^»A‘€½úêHÙ‡Ãâìûýõý#sw¦&}ƒ¥H9õïðçIÀ3¿Sf1çëÖÃcÿ·ùçž«sÞD¡ˆ|Ÿýìgì²æü)…‡öì+\¿h‘ãBÓÔÖ'&ăÂQ‘ÌíÅvs±ýàÃÚ¬¶=þm™Òâûœê_¶íÃïO`UÕA[²MØKUA–“EP8ó¥—¸ÍúJÙñà÷CK3˜¸^ï•RAî/<¡°sçNŒ~¿ ûJ('?òH¨ÀÏ~7ës²c µhÎFü}ÿyG¹¶È·…¾™ÇO>"õD%ê½öŸzçæ¿g{]qóá I“²iž¢…(Δâ¢PE¾R<¨ØWB9òøã9döìv=åÙ¥A½ÊqwIU.ê ú dÏCmwl” ºÉð^l‚FFâòß·9ÌõÙb‡ç—ï‰};Á˜n¨¯ç‚›nÊ•ŠR|<Þçè38n3òKmO8ü̸­È?YôÙß°«8DþqÇG·nÝâ6CI‚Š}%)_ÿÅ/rZ€Îd­ß?ÜÞ–N=[Ö¬aãÇ·³Ë®7ìÅÁ?!ÕÞîEÊd´ |üÚk­Ÿíóó¿ìù#%ÙÑwÎyë-æCmmm-U”ââ?^ÞM;ã6#¿4oÅmEþYþZê2)08"¿_XF棡¡––2›“Rd¨ØWR2|vbOEG„iXÏ}G°?Ö}P¸Hy{n€Ÿ­k×R÷é§ eüþ÷¶vaÛýuAá¸íx¬~=(PAц¼sùýïs«1üË„ ¹3PQŠ”¥K—2ãÑõ© –;aõ»q[‘–'Ž¦â”— ¢zóm/^LCCCÜf(IÐhYù°„QA“nÓ j·QR¦P0Àèï}[Q¡¯(Yà¤ã¶@‰‹kÞuzóKEè+Åöì+IY¼x1•••Lžì Ç^rûí\ôóŸ·ö §Ó“ž a±íƒD¸íC´Ýûœl?€—ôrHD3Í àC! ë¯Á±£Ý9WT° ¹9ÿå‰_|‘ÆÆF¦N·)Jñðgq[{¯sžq‡õÛ’üñÂ:çÿÁ”€sn2Pý@ÞMR@{ö•lݺ•—^z)aÛW[¶ŒßÖ×—UöÛÕ«WkÈ8%ç¬X±"pû7_ƒo ͳ1y¢¥©‰ºµ«¡wÜ–ä—Í/ãíA0þoq[’?^O‘Q‰ûY`ÇŽ€ãPjìÚµ‹ÆÆÆvçVQQAí”)l^¼8»¢Ê³(rýe½þ oþT6Ü’ Iäƒs®‚ó0À˜óΣÿ€455•ä÷8Œbùízöyö–"¥|nÉÿ7xajÜVdŸÍÎ3¦®1nKòǶFøÉpU&./d¹=oĘBð°.n&L˜0léÒ¥Á]7Š¢(YbæÌ™cÿò—¿¼·¹@Ÿ£Š¢ä‹R~–¡=ûY`éÒ¥«Æ?ü¸ãŽk ryQEé¼ÿþûÝ6oÞüAܶä }Ž*Š’kÊáY„öì+Š¢(Š¢(J‰¢3ÓEQEQ¥DQ±¯(Š¢(Š¢(%ŠŠ}EQEQE)QTì+Š¢(Š¢(J‰¢b_QEQEQJûŠ¢(Š¢(ŠR¢¨Ø/bDä'"²TD¶ˆÈ§"ò¿"2ÄW¦“ˆüXDVŠÈ6÷ï7|e&‰È3"R'"›DäEkÿˆÈ:y[Dö±å6i‘où¶¯‘í"²ÕZŽ·öß%"×fçŠDCD®‘e"²YD6ŠÈó"2ÍWf¼ˆ,v¯Ù¿"²HDfåÓîŽ "§»ç¹Å½O¾ý-"Òà»OûXû‹ê|mDä:÷n‘ç|çUR÷YÉ }–¦O9>GAŸ¥ú,-NTì7-À, /°7`€…¾2÷Gcº¯x;Edð(p'0À­ëã&`‘QÀ¿ÀÙÀOýFˆÈTàHà3×\hŒén-úöç›»1½pÎùAàaé "Ý'€çq®Çtà\¹ÄªÃ홲¸¸$I™}÷ÉNú^lç €ˆ\œ  ô^ž‘Ú½ÏJfè³4}Êñ9 ú,Õgi¢b¿ˆ1ÆüÀócL“1f p 0ADzˆÈÑÀ4àLcÌGî1ë1v減_cþ`ŒÙaŒi1Ƽfíw©*ñýXÝù¯€s€]!¦JÈöÖS‰r¾ÙÂó{½À9§àsÚì?ç|¯6Æì4Ƽƒsm¿O;³‰1æIc̽ÀŠ$ÅRݧbdp‹1æ]cÌàj ç—Ü}V2CŸ¥éSŽÏQÐg©>K‹“ª¸ P²Ê±ÀJë| Îé ùÐ<\nŒÙ "µÀ$à%y ¬~lŒù3€1æC¹x§·él_›·2ƼiVûù±ˆÜ | ü¸ÍÓäÖï¯//ˆÈ À€žÀÇÀñƘFw÷~À›Æ˜ë×"ÒͳÍsd~-Î ‘j`p‡1æ×ÞŽb<_W¨ ^õ¶cšEä-`œÈåxŸ•Ôè³4ú EŸ¥ås¯‹íÙ/\_Ék€ ¬Íýp†¤kpþù ~ïîïƒóø&Î[ûàFàn9Ô«ÄócÌ cÌÆ˜¥V›Ç‡×%1m0èïÚ6¸!ó3ÍƘGŒ1½q†ˆH7ww`‹ïMÖ¾Räh÷‚Ý€«€›E䂤G>Þ½ÚìÛ¾ÉÝWŽ÷YI>K££ÏÑ@ôYÚ¶Ï>V‰û%€ˆœˆãOz¦1æIkWΰîc¶c¾Àù'6]D:[ÝrwcÞp‡žNNÑfoà—À9VOø†/1‹1õnÝ/× “Úâij ¸çŸõ1îæ: —¯hok_ÉaŒyÖ~m2Æ<†ãO\0÷)C¼{t/ë(Ãû¬$GŸ¥™¡ÏÑ6ôYš°Ï>V‰ûEŽˆœ‰3Œú¯Æ˜‡|»ß ½§¸ÛÄ¢^TmÀq~&»¹Ñ%Ö{·‰È£É-8ÆJwÙæ®ÿØ_D*­2Ë1Ûü+…‰ûý^‰Óc €ˆTá ;¿ ¼…ÞgÅEŸ¥FŸ£%Š>KKcŒ.EºàL~ÙLÙ_‹ãGyÐ g¨õ à!«ÌE8þ£p^þ¾ lNÑv 0ÈZ»m]ôuËŒ:»uŠóñÖ˜¯ÛÅÀ÷sœIqËZw[7ŸØ\Û÷uÏí’¸ïyιÂ=—cq&ÒÕºë‚óÀ>н§Un™ À·ã¶; çý=¿Ù}€.ÀMÀj÷ü»—Ú}Ö%ãï‰>KÓ¿fe÷uÏKŸ¥ú,-º%vtéÀÍs4;q†íe²Uf ð¤»}û@îå«ç ÷‡Y‡3©æ¤ íY3í­ŒóÆ_‡ãÏ÷O·­Ê˜¯ÛB`-NÔj¿Ûá¾2û‹z÷ø5qßïžóYî÷¥h¶þNNtïÍV?Ë·€óâ¶9‹ç~{ëEÀ>¥zŸuÉø;¢ÏÒôm,»ç¨{Nú,ÕgiÑ-âÞ$EQEQEQJ õÙWEQEQ”Ež¢(Š¢(Š¢”(*öEQEQ¥DQ±¯(Š¢(Š¢(%ŠŠ}EQEQE)QTì+Š¢(Š¢(J‰¢b_QEQEQJûŠ¢(Š¢(ŠR¢¨ØWEQEQ”EžRRˆÈ"òßi”?KDVçÒ¦BGD‘­""qÛ¢(Š¢(JvQ±¯ "²HDvºÂt‹ˆüSD¾c—1ÆÌ6Æü{–Û])"çD,[!"‰H½ˆôʦ¹Âó¼1¦»1ÆÄm‹¢(Š¢(ÙEžRL`®+L{× DdZÚÚë=è|œ3‹EQEQ" b_)ZŒ1Ü­dUžIDAT÷€ Þ6¹KD~o­‘g­‘€‘ÙÓ®KDΑ"²YDþ$"ÝÝí{·»# o§0kpp'p¯^"rˆ¬síy_D¾bíŸ$"ϸû7¸Ÿ;[ÇÞáŽ2¬‘GDd¸ï¼ï‘ÿr÷¯‘룴-"SÝkRá®WˆÈån™Í"òšˆgÕå•ÿŠˆ| "u"ò¤ˆ JqmEQEÉ3*ö•bCD¤JD¾ô^±öwADª€‡÷À4ào¿ÅnÀ`¬»ì\`Œ™| \èŽ(ìj˜#¾§w¿FŠÈ1V‘ËnÀ0wdbðO÷Ø}€§q^öpmúO Åõ¥Ð=v?`wàmàa©´ê?xèœ \!"G¤j;€K‹€ú·‰Èþ¾r'C€ZàÇa×FQEQ”xP±¯|OD6Ûßgc^ð•ñ\nF—cvc>n ½KNð}cÌNcÌZà/À!Øw>°Òõÿx ˜míß ôö‘ cÌjcÌ{î¾ÙÀSƘ;\[1‹1»€ý/c6cÉVý/cþd^Þ²Î#YÛ~În6ƼeŒi1ÆÜ <æn·¹Ò³ÕSü/™]3EQEQrˆŠ}¥˜0À-ƘÞ8=ú¿®‘Ú€rƒÆ˜zkߪ€z×cš­õ {:†‰H'œQƒß[›ÿ8ID»ë·O¿Ö»îB#Ý}ÃpF ‚ TŸˆÈ&÷eg=Îyîa•ûÔw\½uÉÚö3XîÛ¶ÇÉÆn/ík¦(Š¢(JîQ±¯%ƘmÀ…8"øûö.ëó ˆt³¶ Í ¹–eþgbîÅ"ò™ˆ|,*qzü1Æl7Æ\kŒÙgÄ¡ ç…`%Ž+Qk]@?cLokéêöºCŠIÄ)Úö³åÛ6’à%EQEQ ûJ1a»èຸ\\*"}ʼŒÓ#}³ˆtq'þ ƒv×âøò'cðˆ[n‚»ì ÌÎuç|YDöqçlvîñwLjÈù®­Õ"r„ˆÔàøá¿üRDúˆHow‚lë¼ý´nKѶŸ_ã¸KMpíþ*N”¡_§¸Š¢(Š¢*ö•b¢uò­ÅïÏhëÝo-cŒiNö>þüÑ-·#Iþm×3]š·üF‰Èßùc¾°–ÏqÜgzáLž†3ÑvNhÎþÀ·\[ßÅ™4{ΈÄZà* ÂÓƒã*óŠˆÔáøãÏ´ì ;жÊÎ~ÜíèràcÌ›!åÃÚWEQ%fDóè(儈œ ÜmŒé’²°¢(Š¢(J‘£=ûJI#"‡ŠÈ^â0§—þ©ŽSEQE)ªâ6@QrÌîÀÝÀ`#Ž_ýå±Z¤(Š¢(Š’'ÔGQEQEQJuãQEQEQ”Ež¢(Š¢(Š¢”(*öEQEQ¥DQ±¯(Š¢(Š¢(%ŠŠ}EQEQE)QTì+Š¢(Š¢(J‰òÿÄu¯nÂÂIEND®B`‚reproject-0.3.2/docs/index.rst0000644000077000000240000001144713173065713016235 0ustar tomstaff00000000000000******************************* Image reprojection (resampling) ******************************* Introduction ============ The *reproject* package implements image reprojection (resampling) methods for astronomical images and more generally n-dimensional data. These assume that the WCS information contained in the data are correct. This package does **not** do image registration, which is the process of aligning images where one or more images may have incorrect or missing WCS. Requirements ============ This package has the following hard dependencies: * `Numpy `__ 1.7 or later * `Astropy `__ 1.0 or later * `Scipy `__ 0.9 or later and the following optional dependencies: * `healpy `_ 1.8 or later for HEALPIX image reprojection Installation ============ To install the *reproject* package, simply do:: pip install reproject .. _quickstart: Quick start =========== A common use case is that you have two FITS images, and want to reproject one to the same header as the other. This can easily be done with the *reproject* package, and we demonstrate this in the following example. We start off by downloading two example images from `http://data.astropy.org `_, namely a 2MASS K-band image and an MSX band E image of the Galactic center:: from astropy.io import fits from astropy.utils.data import get_pkg_data_filename hdu1 = fits.open(get_pkg_data_filename('galactic_center/gc_2mass_k.fits'))[0] hdu2 = fits.open(get_pkg_data_filename('galactic_center/gc_msx_e.fits'))[0] We can examine the two images (this makes use of the `wcsaxes `_ package behind the scenes):: from astropy.wcs import WCS import matplotlib.pyplot as plt ax1 = plt.subplot(1,2,1, projection=WCS(hdu1.header)) ax1.imshow(hdu1.data, origin='lower', vmin=-100., vmax=2000.) ax1.coords.grid(color='white') ax1.coords['ra'].set_axislabel('Right Ascension') ax1.coords['dec'].set_axislabel('Declination') ax1.set_title('2MASS K-band') ax2 = plt.subplot(1,2,2, projection=WCS(hdu2.header)) ax2.imshow(hdu2.data, origin='lower', vmin=-2.e-4, vmax=5.e-4) ax2.coords.grid(color='white') ax2.coords['glon'].set_axislabel('Galactic Longitude') ax2.coords['glat'].set_axislabel('Galactic Latitude') ax2.coords['glat'].set_axislabel_position('r') ax2.coords['glat'].set_ticklabel_position('r') ax2.set_title('MSX band E') .. image:: images/index-2.png :align: center :width: 80% We now reproject the MSX image to be in the same projection as the 2MASS image:: from reproject import reproject_interp array, footprint = reproject_interp(hdu2, hdu1.header) The :func:`~reproject.reproject_interp` function above returns the reprojected array as well as an array that provides information on the footprint of the first image in the new reprojected image plane (essentially which pixels in the new image had a corresponding pixel in the old image). We can now visualize the reprojected data and footprint:: from astropy.wcs import WCS import matplotlib.pyplot as plt ax1 = plt.subplot(1,2,1, projection=WCS(hdu1.header)) ax1.imshow(array, origin='lower', vmin=-2.e-4, vmax=5.e-4) ax1.coords.grid(color='white') ax1.coords['ra'].set_axislabel('Right Ascension') ax1.coords['dec'].set_axislabel('Declination') ax1.set_title('Reprojected MSX band E image') ax2 = plt.subplot(1,2,2, projection=WCS(hdu1.header)) ax2.imshow(footprint, origin='lower', vmin=0, vmax=1.5) ax2.coords.grid(color='white') ax1.coords['ra'].set_axislabel('Right Ascension') ax1.coords['dec'].set_axislabel('Declination') ax2.coords['dec'].set_axislabel_position('r') ax2.coords['dec'].set_ticklabel_position('r') ax2.set_title('MSX band E image footprint') .. image:: images/index-4.png :align: center :width: 80% We can then write out the image to a new FITS file. Note that, as for plotting, we can use the header from the 2MASS image since both images are now in the same projection:: fits.writeto('msx_on_2mass_header.fits', array, hdu1.header, clobber=True) The *reproject* package supports a number of different algorithms for reprojection (interpolation, flux-conserving reprojection, etc.) and different types of data (images, spectral cubes, HEALPIX images, etc.). For more information, we encourage you to read the full documentation below! Documentation ============= The reproject package consists of a few high-level functions to do reprojection using different algorithms, which depend on the type of data that you want to reproject. .. toctree:: :maxdepth: 2 celestial healpix noncelestial footprints Reference/API ============= .. automodapi:: reproject :no-inheritance-diagram: reproject-0.3.2/docs/make.bat0000644000077000000240000001064112516667577016014 0ustar tomstaff00000000000000@ECHO OFF REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set BUILDDIR=_build set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. dirhtml to make HTML files named index.html in directories echo. singlehtml to make a single large HTML file echo. pickle to make pickle files echo. json to make JSON files echo. htmlhelp to make HTML files and a HTML help project echo. qthelp to make HTML files and a qthelp project echo. devhelp to make HTML files and a Devhelp project echo. epub to make an epub echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter echo. text to make text files echo. man to make manual pages echo. changes to make an overview over all changed/added/deprecated items echo. linkcheck to check all external links for integrity echo. doctest to run all doctests embedded in the documentation if enabled goto end ) if "%1" == "clean" ( for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i del /q /s %BUILDDIR%\* goto end ) if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/html. goto end ) if "%1" == "dirhtml" ( %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. goto end ) if "%1" == "singlehtml" ( %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. goto end ) if "%1" == "pickle" ( %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the pickle files. goto end ) if "%1" == "json" ( %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the JSON files. goto end ) if "%1" == "htmlhelp" ( %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run HTML Help Workshop with the ^ .hhp project file in %BUILDDIR%/htmlhelp. goto end ) if "%1" == "qthelp" ( %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run "qcollectiongenerator" with the ^ .qhcp project file in %BUILDDIR%/qthelp, like this: echo.^> qcollectiongenerator %BUILDDIR%\qthelp\Astropy.qhcp echo.To view the help file: echo.^> assistant -collectionFile %BUILDDIR%\qthelp\Astropy.ghc goto end ) if "%1" == "devhelp" ( %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp if errorlevel 1 exit /b 1 echo. echo.Build finished. goto end ) if "%1" == "epub" ( %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub if errorlevel 1 exit /b 1 echo. echo.Build finished. The epub file is in %BUILDDIR%/epub. goto end ) if "%1" == "latex" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex if errorlevel 1 exit /b 1 echo. echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. goto end ) if "%1" == "text" ( %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text if errorlevel 1 exit /b 1 echo. echo.Build finished. The text files are in %BUILDDIR%/text. goto end ) if "%1" == "man" ( %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man if errorlevel 1 exit /b 1 echo. echo.Build finished. The manual pages are in %BUILDDIR%/man. goto end ) if "%1" == "changes" ( %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes if errorlevel 1 exit /b 1 echo. echo.The overview file is in %BUILDDIR%/changes. goto end ) if "%1" == "linkcheck" ( %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck if errorlevel 1 exit /b 1 echo. echo.Link check complete; look for any errors in the above output ^ or in %BUILDDIR%/linkcheck/output.txt. goto end ) if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest if errorlevel 1 exit /b 1 echo. echo.Testing of doctests in the sources finished, look at the ^ results in %BUILDDIR%/doctest/output.txt. goto end ) :end reproject-0.3.2/docs/Makefile0000644000077000000240000001074512737263231016034 0ustar tomstaff00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest #This is needed with git because git doesn't create a dir if it's empty $(shell [ -d "_static" ] || mkdir -p _static) help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " text to make text files" @echo " man to make manual pages" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" clean: -rm -rf $(BUILDDIR) -rm -rf api -rm -rf generated html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Astropy.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Astropy.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/Astropy" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Astropy" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." make -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: @echo "Run 'python setup.py test' in the root directory to run doctests " \ @echo "in the documentation." reproject-0.3.2/docs/noncelestial.rst0000644000077000000240000000025312737420245017577 0ustar tomstaff00000000000000************************* Non-celestial images/data ************************* Non-celestial images/data are not currently supported but will be added in future releases. reproject-0.3.2/docs/reproject_interpolate_example.py0000644000077000000240000000227712724021736023063 0ustar tomstaff00000000000000"""Example how to reproject by interpolation. """ import numpy as np from reproject.interpolation import reproject_celestial_slices from astropy.io import fits from astropy.wcs import WCS from wcsaxes import datasets # Test 2d interpolation, different frame, different projection hdu = datasets.msx_hdu() hdu.data[100:200, 100:200] = np.inf wcs_in = WCS(hdu.header) wcs_out = wcs_in.deepcopy() wcs_out.wcs.ctype = ['RA---TAN', 'DEC--TAN'] wcs_out.wcs.crval = [266.44707, -28.937888] array_out = reproject_celestial_slices(hdu.data, wcs_in, wcs_out, hdu.data.shape) fits.writeto('test_2d.fits', array_out, header=wcs_out.to_header(), clobber=True) # Test 3d slice-by-slice interpolation, different frame, different projection hdu = datasets.l1448_co_hdu() wcs_in = WCS(hdu.header) wcs_in.wcs.equinox = 2000. wcs_out = wcs_in.deepcopy() wcs_out.wcs.ctype = ['GLON-SIN', 'GLAT-SIN', wcs_in.wcs.ctype[2]] wcs_out.wcs.crval = [158.0501, -21.530282, wcs_in.wcs.crval[2]] wcs_out.wcs.crpix = [50., 50., wcs_in.wcs.crpix[2]] array_out = reproject_celestial_slices(hdu.data, wcs_in, wcs_out, hdu.data.shape) fits.writeto('test_3d.fits', array_out, header=wcs_out.to_header(), clobber=True) reproject-0.3.2/ez_setup.py0000644000077000000240000003014113173065713015644 0ustar tomstaff00000000000000#!/usr/bin/env python """ Setuptools bootstrapping installer. Maintained at https://github.com/pypa/setuptools/tree/bootstrap. Run this script to install or upgrade setuptools. """ import os import shutil import sys import tempfile import zipfile import optparse import subprocess import platform import textwrap import contextlib import json import codecs from distutils import log try: from urllib.request import urlopen from urllib.parse import urljoin except ImportError: from urllib2 import urlopen from urlparse import urljoin try: from site import USER_SITE except ImportError: USER_SITE = None LATEST = object() DEFAULT_VERSION = LATEST DEFAULT_URL = "https://pypi.io/packages/source/s/setuptools/" DEFAULT_SAVE_DIR = os.curdir def _python_cmd(*args): """ Execute a command. Return True if the command succeeded. """ args = (sys.executable,) + args return subprocess.call(args) == 0 def _install(archive_filename, install_args=()): """Install Setuptools.""" with archive_context(archive_filename): # installing log.warn('Installing Setuptools') if not _python_cmd('setup.py', 'install', *install_args): log.warn('Something went wrong during the installation.') log.warn('See the error message above.') # exitcode will be 2 return 2 def _build_egg(egg, archive_filename, to_dir): """Build Setuptools egg.""" with archive_context(archive_filename): # building an egg log.warn('Building a Setuptools egg in %s', to_dir) _python_cmd('setup.py', '-q', 'bdist_egg', '--dist-dir', to_dir) # returning the result log.warn(egg) if not os.path.exists(egg): raise IOError('Could not build the egg.') class ContextualZipFile(zipfile.ZipFile): """Supplement ZipFile class to support context manager for Python 2.6.""" def __enter__(self): return self def __exit__(self, type, value, traceback): self.close() def __new__(cls, *args, **kwargs): """Construct a ZipFile or ContextualZipFile as appropriate.""" if hasattr(zipfile.ZipFile, '__exit__'): return zipfile.ZipFile(*args, **kwargs) return super(ContextualZipFile, cls).__new__(cls) @contextlib.contextmanager def archive_context(filename): """ Unzip filename to a temporary directory, set to the cwd. The unzipped target is cleaned up after. """ tmpdir = tempfile.mkdtemp() log.warn('Extracting in %s', tmpdir) old_wd = os.getcwd() try: os.chdir(tmpdir) with ContextualZipFile(filename) as archive: archive.extractall() # going in the directory subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0]) os.chdir(subdir) log.warn('Now working in %s', subdir) yield finally: os.chdir(old_wd) shutil.rmtree(tmpdir) def _do_download(version, download_base, to_dir, download_delay): """Download Setuptools.""" egg = os.path.join(to_dir, 'setuptools-%s-py%d.%d.egg' % (version, sys.version_info[0], sys.version_info[1])) if not os.path.exists(egg): archive = download_setuptools(version, download_base, to_dir, download_delay) _build_egg(egg, archive, to_dir) sys.path.insert(0, egg) # Remove previously-imported pkg_resources if present (see # https://bitbucket.org/pypa/setuptools/pull-request/7/ for details). if 'pkg_resources' in sys.modules: _unload_pkg_resources() import setuptools setuptools.bootstrap_install_from = egg def use_setuptools( version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=DEFAULT_SAVE_DIR, download_delay=15): """ Ensure that a setuptools version is installed. Return None. Raise SystemExit if the requested version or later cannot be installed. """ version = _resolve_version(version) to_dir = os.path.abspath(to_dir) # prior to importing, capture the module state for # representative modules. rep_modules = 'pkg_resources', 'setuptools' imported = set(sys.modules).intersection(rep_modules) try: import pkg_resources pkg_resources.require("setuptools>=" + version) # a suitable version is already installed return except ImportError: # pkg_resources not available; setuptools is not installed; download pass except pkg_resources.DistributionNotFound: # no version of setuptools was found; allow download pass except pkg_resources.VersionConflict as VC_err: if imported: _conflict_bail(VC_err, version) # otherwise, unload pkg_resources to allow the downloaded version to # take precedence. del pkg_resources _unload_pkg_resources() return _do_download(version, download_base, to_dir, download_delay) def _conflict_bail(VC_err, version): """ Setuptools was imported prior to invocation, so it is unsafe to unload it. Bail out. """ conflict_tmpl = textwrap.dedent(""" The required version of setuptools (>={version}) is not available, and can't be installed while this script is running. Please install a more recent version first, using 'easy_install -U setuptools'. (Currently using {VC_err.args[0]!r}) """) msg = conflict_tmpl.format(**locals()) sys.stderr.write(msg) sys.exit(2) def _unload_pkg_resources(): sys.meta_path = [ importer for importer in sys.meta_path if importer.__class__.__module__ != 'pkg_resources.extern' ] del_modules = [ name for name in sys.modules if name.startswith('pkg_resources') ] for mod_name in del_modules: del sys.modules[mod_name] def _clean_check(cmd, target): """ Run the command to download target. If the command fails, clean up before re-raising the error. """ try: subprocess.check_call(cmd) except subprocess.CalledProcessError: if os.access(target, os.F_OK): os.unlink(target) raise def download_file_powershell(url, target): """ Download the file at url to target using Powershell. Powershell will validate trust. Raise an exception if the command cannot complete. """ target = os.path.abspath(target) ps_cmd = ( "[System.Net.WebRequest]::DefaultWebProxy.Credentials = " "[System.Net.CredentialCache]::DefaultCredentials; " '(new-object System.Net.WebClient).DownloadFile("%(url)s", "%(target)s")' % locals() ) cmd = [ 'powershell', '-Command', ps_cmd, ] _clean_check(cmd, target) def has_powershell(): """Determine if Powershell is available.""" if platform.system() != 'Windows': return False cmd = ['powershell', '-Command', 'echo test'] with open(os.path.devnull, 'wb') as devnull: try: subprocess.check_call(cmd, stdout=devnull, stderr=devnull) except Exception: return False return True download_file_powershell.viable = has_powershell def download_file_curl(url, target): cmd = ['curl', url, '--location', '--silent', '--output', target] _clean_check(cmd, target) def has_curl(): cmd = ['curl', '--version'] with open(os.path.devnull, 'wb') as devnull: try: subprocess.check_call(cmd, stdout=devnull, stderr=devnull) except Exception: return False return True download_file_curl.viable = has_curl def download_file_wget(url, target): cmd = ['wget', url, '--quiet', '--output-document', target] _clean_check(cmd, target) def has_wget(): cmd = ['wget', '--version'] with open(os.path.devnull, 'wb') as devnull: try: subprocess.check_call(cmd, stdout=devnull, stderr=devnull) except Exception: return False return True download_file_wget.viable = has_wget def download_file_insecure(url, target): """Use Python to download the file, without connection authentication.""" src = urlopen(url) try: # Read all the data in one block. data = src.read() finally: src.close() # Write all the data in one block to avoid creating a partial file. with open(target, "wb") as dst: dst.write(data) download_file_insecure.viable = lambda: True def get_best_downloader(): downloaders = ( download_file_powershell, download_file_curl, download_file_wget, download_file_insecure, ) viable_downloaders = (dl for dl in downloaders if dl.viable()) return next(viable_downloaders, None) def download_setuptools( version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=DEFAULT_SAVE_DIR, delay=15, downloader_factory=get_best_downloader): """ Download setuptools from a specified location and return its filename. `version` should be a valid setuptools version number that is available as an sdist for download under the `download_base` URL (which should end with a '/'). `to_dir` is the directory where the egg will be downloaded. `delay` is the number of seconds to pause before an actual download attempt. ``downloader_factory`` should be a function taking no arguments and returning a function for downloading a URL to a target. """ version = _resolve_version(version) # making sure we use the absolute path to_dir = os.path.abspath(to_dir) zip_name = "setuptools-%s.zip" % version url = download_base + zip_name saveto = os.path.join(to_dir, zip_name) if not os.path.exists(saveto): # Avoid repeated downloads log.warn("Downloading %s", url) downloader = downloader_factory() downloader(url, saveto) return os.path.realpath(saveto) def _resolve_version(version): """ Resolve LATEST version """ if version is not LATEST: return version meta_url = urljoin(DEFAULT_URL, '/pypi/setuptools/json') resp = urlopen(meta_url) with contextlib.closing(resp): try: charset = resp.info().get_content_charset() except Exception: # Python 2 compat; assume UTF-8 charset = 'UTF-8' reader = codecs.getreader(charset) doc = json.load(reader(resp)) return str(doc['info']['version']) def _build_install_args(options): """ Build the arguments to 'python setup.py install' on the setuptools package. Returns list of command line arguments. """ return ['--user'] if options.user_install else [] def _parse_args(): """Parse the command line for options.""" parser = optparse.OptionParser() parser.add_option( '--user', dest='user_install', action='store_true', default=False, help='install in user site package') parser.add_option( '--download-base', dest='download_base', metavar="URL", default=DEFAULT_URL, help='alternative URL from where to download the setuptools package') parser.add_option( '--insecure', dest='downloader_factory', action='store_const', const=lambda: download_file_insecure, default=get_best_downloader, help='Use internal, non-validating downloader' ) parser.add_option( '--version', help="Specify which version to download", default=DEFAULT_VERSION, ) parser.add_option( '--to-dir', help="Directory to save (and re-use) package", default=DEFAULT_SAVE_DIR, ) options, args = parser.parse_args() # positional arguments are ignored return options def _download_args(options): """Return args for download_setuptools function from cmdline args.""" return dict( version=options.version, download_base=options.download_base, downloader_factory=options.downloader_factory, to_dir=options.to_dir, ) def main(): """Install or upgrade setuptools and EasyInstall.""" options = _parse_args() archive = download_setuptools(**_download_args(options)) return _install(archive, _build_install_args(options)) if __name__ == '__main__': sys.exit(main()) reproject-0.3.2/LICENSE.md0000644000077000000240000000273412737421446015053 0ustar tomstaff00000000000000Copyright (c) 2011-16, Thomas P. Robitaille All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the Astropy project nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. reproject-0.3.2/PKG-INFO0000644000077000000240000000061213173066302014524 0ustar tomstaff00000000000000Metadata-Version: 1.0 Name: reproject Version: 0.3.2 Summary: Reproject astronomical images Home-page: http://reproject.readthedocs.io Author: Thomas Robitaille, Christoph Deil, Adam Ginsburg Author-email: thomas.robitaille@gmail.com License: BSD Description-Content-Type: UNKNOWN Description: Astropy affiliated package for image reprojection (resampling). Platform: UNKNOWN reproject-0.3.2/README.md0000644000077000000240000000352513173065713014721 0ustar tomstaff00000000000000[![Build Status](https://travis-ci.org/astrofrog/reproject.svg?branch=master)](https://travis-ci.org/astrofrog/reproject) [![Build status](https://ci.appveyor.com/api/projects/status/0ifg4xonlyrc6eu4/branch/master?svg=true)](https://ci.appveyor.com/project/Astropy/reproject/branch/master) [![Coverage Status](https://coveralls.io/repos/astrofrog/reproject/badge.svg?branch=master)](https://coveralls.io/r/astrofrog/reproject?branch=master) [![asv](http://img.shields.io/badge/benchmarked%20by-asv-green.svg?style=flat)](http://astrofrog.github.io/reproject-benchmarks/) ![Powered by Astropy Badge](http://img.shields.io/badge/powered%20by-AstroPy-orange.svg?style=flat) About ===== The 'reproject' package is a Python package to reproject astronomical images using various techniques via a uniform interface. By *reprojection*, we mean the re-gridding of images from one world coordinate system to another (for example changing the pixel resolution, orientation, coordinate system). Currently, we have implemented reprojection of celestial images by interpolation (like [SWARP](http://www.astromatic.net/software/swarp)), as well as by finding the exact overlap between pixels on the celestial sphere (like [Montage](http://montage.ipac.caltech.edu/index.html)). It can also reproject to/from HEALPIX projections by relying on the [healpy](https://github.com/healpy/healpy) package. For more information, including on how to install the package, see http://reproject.readthedocs.io ![screenshot](docs/images/index-4.png) Note on license =============== The code in this package is released under the BSD license. However, the functions relating to HEALPIX rely on the [healpy](https://github.com/healpy/healpy) package, which is GPLv2, so if you use these functions in your code, you are indirectly using healpy and therefore will need to abide with the GPLv2 license. reproject-0.3.2/reproject/0000755000077000000240000000000013173066302015425 5ustar tomstaff00000000000000reproject-0.3.2/reproject/__init__.py0000644000077000000240000000116212724021736017541 0ustar tomstaff00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ Astropy affiliated package for image reprojection (resampling). """ # Affiliated packages may add whatever they like to this file, but # should keep this content at the top. # ---------------------------------------------------------------------------- from ._astropy_init import * # ---------------------------------------------------------------------------- if not _ASTROPY_SETUP_: from .interpolation import reproject_interp from .spherical_intersect import reproject_exact from .healpix import reproject_from_healpix, reproject_to_healpix reproject-0.3.2/reproject/_astropy_init.py0000644000077000000240000001223112724021736020664 0ustar tomstaff00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst __all__ = ['__version__', '__githash__', 'test'] # this indicates whether or not we are in the package's setup.py try: _ASTROPY_SETUP_ except NameError: from sys import version_info if version_info[0] >= 3: import builtins else: import __builtin__ as builtins builtins._ASTROPY_SETUP_ = False try: from .version import version as __version__ except ImportError: __version__ = '' try: from .version import githash as __githash__ except ImportError: __githash__ = '' # set up the test command def _get_test_runner(): import os from astropy.tests.helper import TestRunner return TestRunner(os.path.dirname(__file__)) def test(package=None, test_path=None, args=None, plugins=None, verbose=False, pastebin=None, remote_data=False, pep8=False, pdb=False, coverage=False, open_files=False, **kwargs): """ Run the tests using `py.test `__. A proper set of arguments is constructed and passed to `pytest.main`_. .. _py.test: http://pytest.org/latest/ .. _pytest.main: http://pytest.org/latest/builtin.html#pytest.main Parameters ---------- package : str, optional The name of a specific package to test, e.g. 'io.fits' or 'utils'. If nothing is specified all default tests are run. test_path : str, optional Specify location to test by path. May be a single file or directory. Must be specified absolutely or relative to the calling directory. args : str, optional Additional arguments to be passed to pytest.main_ in the ``args`` keyword argument. plugins : list, optional Plugins to be passed to pytest.main_ in the ``plugins`` keyword argument. verbose : bool, optional Convenience option to turn on verbose output from py.test_. Passing True is the same as specifying ``'-v'`` in ``args``. pastebin : {'failed','all',None}, optional Convenience option for turning on py.test_ pastebin output. Set to ``'failed'`` to upload info for failed tests, or ``'all'`` to upload info for all tests. remote_data : bool, optional Controls whether to run tests marked with @remote_data. These tests use online data and are not run by default. Set to True to run these tests. pep8 : bool, optional Turn on PEP8 checking via the `pytest-pep8 plugin `_ and disable normal tests. Same as specifying ``'--pep8 -k pep8'`` in ``args``. pdb : bool, optional Turn on PDB post-mortem analysis for failing tests. Same as specifying ``'--pdb'`` in ``args``. coverage : bool, optional Generate a test coverage report. The result will be placed in the directory htmlcov. open_files : bool, optional Fail when any tests leave files open. Off by default, because this adds extra run time to the test suite. Requires the `psutil `_ package. parallel : int, optional When provided, run the tests in parallel on the specified number of CPUs. If parallel is negative, it will use the all the cores on the machine. Requires the `pytest-xdist `_ plugin installed. Only available when using Astropy 0.3 or later. kwargs Any additional keywords passed into this function will be passed on to the astropy test runner. This allows use of test-related functionality implemented in later versions of astropy without explicitly updating the package template. """ test_runner = _get_test_runner() return test_runner.run_tests( package=package, test_path=test_path, args=args, plugins=plugins, verbose=verbose, pastebin=pastebin, remote_data=remote_data, pep8=pep8, pdb=pdb, coverage=coverage, open_files=open_files, **kwargs) if not _ASTROPY_SETUP_: import os from warnings import warn from astropy import config # add these here so we only need to cleanup the namespace at the end config_dir = None if not os.environ.get('ASTROPY_SKIP_CONFIG_UPDATE', False): config_dir = os.path.dirname(__file__) config_template = os.path.join(config_dir, __package__ + ".cfg") if os.path.isfile(config_template): try: config.configuration.update_default_config( __package__, config_dir, version=__version__) except TypeError as orig_error: try: config.configuration.update_default_config( __package__, config_dir) except config.configuration.ConfigurationDefaultMissingError as e: wmsg = (e.args[0] + " Cannot install default profile. If you are " "importing from source, this is expected.") warn(config.configuration.ConfigurationDefaultMissingWarning(wmsg)) del e except: raise orig_error reproject-0.3.2/reproject/_compiler.c0000644000077000000240000000573112521647746017565 0ustar tomstaff00000000000000#include /*************************************************************************** * Macros for determining the compiler version. * * These are borrowed from boost, and majorly abridged to include only * the compilers we care about. ***************************************************************************/ #ifndef PY3K #if PY_MAJOR_VERSION >= 3 #define PY3K 1 #else #define PY3K 0 #endif #endif #define STRINGIZE(X) DO_STRINGIZE(X) #define DO_STRINGIZE(X) #X #if defined __clang__ /* Clang C++ emulates GCC, so it has to appear early. */ # define COMPILER "Clang version " __clang_version__ #elif defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || defined(__ECC) /* Intel */ # if defined(__INTEL_COMPILER) # define INTEL_VERSION __INTEL_COMPILER # elif defined(__ICL) # define INTEL_VERSION __ICL # elif defined(__ICC) # define INTEL_VERSION __ICC # elif defined(__ECC) # define INTEL_VERSION __ECC # endif # define COMPILER "Intel C compiler version " STRINGIZE(INTEL_VERSION) #elif defined(__GNUC__) /* gcc */ # define COMPILER "GCC version " __VERSION__ #elif defined(__SUNPRO_CC) /* Sun Workshop Compiler */ # define COMPILER "Sun compiler version " STRINGIZE(__SUNPRO_CC) #elif defined(_MSC_VER) /* Microsoft Visual C/C++ Must be last since other compilers define _MSC_VER for compatibility as well */ # if _MSC_VER < 1200 # define COMPILER_VERSION 5.0 # elif _MSC_VER < 1300 # define COMPILER_VERSION 6.0 # elif _MSC_VER == 1300 # define COMPILER_VERSION 7.0 # elif _MSC_VER == 1310 # define COMPILER_VERSION 7.1 # elif _MSC_VER == 1400 # define COMPILER_VERSION 8.0 # elif _MSC_VER == 1500 # define COMPILER_VERSION 9.0 # elif _MSC_VER == 1600 # define COMPILER_VERSION 10.0 # else # define COMPILER_VERSION _MSC_VER # endif # define COMPILER "Microsoft Visual C++ version " STRINGIZE(COMPILER_VERSION) #else /* Fallback */ # define COMPILER "Unknown compiler" #endif /*************************************************************************** * Module-level ***************************************************************************/ struct module_state { /* The Sun compiler can't handle empty structs */ #if defined(__SUNPRO_C) || defined(_MSC_VER) int _dummy; #endif }; #if PY3K static struct PyModuleDef moduledef = { PyModuleDef_HEAD_INIT, "_compiler", NULL, sizeof(struct module_state), NULL, NULL, NULL, NULL, NULL }; #define INITERROR return NULL PyMODINIT_FUNC PyInit__compiler(void) #else #define INITERROR return PyMODINIT_FUNC init_compiler(void) #endif { PyObject* m; #if PY3K m = PyModule_Create(&moduledef); #else m = Py_InitModule3("_compiler", NULL, NULL); #endif if (m == NULL) INITERROR; PyModule_AddStringConstant(m, "compiler", COMPILER); #if PY3K return m; #endif } reproject-0.3.2/reproject/array_utils.py0000644000077000000240000000705413173065713020350 0ustar tomstaff00000000000000import numpy as np from functools import reduce def iterate_over_celestial_slices(array_in, array_out, wcs): """ Given two arrays with the same number of dimensions, iterate over the celestial slices in each. The index of the celestial axes should match between the two arrays and will be taken from ``wcs``. The iterator returns views, so these can be used to modify the original arrays. Parameters ---------- array_in : `~numpy.ndarray` The input array for the reprojection array_out : `~numpy.ndarray` The output array for the reprojection wcs : `~astropy.wcs.WCS` The WCS for the input array (only used to identify the celestial axes). Returns ------- slice_in : `~numpy.ndarray` A view to a celestial slice in ``array_in`` slice_out : `~numpy.ndarray` A view to the corresponding slice in ``array_out`` """ # First put lng/lat as first two dimensions in WCS/last two in Numpy if wcs.wcs.lng == 0 and wcs.wcs.lat == 1: array_in_view = array_in array_out_view = array_out elif wcs.wcs.lng == 1 and wcs.wcs.lat == 0: array_in_view = array_in.swapaxes(-1, -2) array_out_view = array_out.swapaxes(-1, -2) else: array_in_view = array_in.swapaxes(-2, -1 - wcs.wcs.lat).swapaxes(-1, -1 - wcs.wcs.lng) array_out_view = array_out.swapaxes(-2, -1 - wcs.wcs.lat).swapaxes(-1, -1 - wcs.wcs.lng) # Flatten remaining dimensions to make it easier to loop over from operator import mul nx_in = array_in_view.shape[-1] ny_in = array_in_view.shape[-2] n_remaining_in = reduce(mul, array_in_view.shape, 1) // nx_in // ny_in nx_out = array_out_view.shape[-1] ny_out = array_out_view.shape[-2] n_remaining_out = reduce(mul, array_out_view.shape, 1) // nx_out // ny_out if n_remaining_in != n_remaining_out: raise ValueError("Number of non-celestial elements should match") array_in_view = array_in_view.reshape(n_remaining_in, ny_in, nx_in) array_out_view = array_out_view.reshape(n_remaining_out, ny_out, nx_out) for slice_index in range(n_remaining_in): yield array_in_view[slice_index], array_out_view[slice_index] def pad_edge_1(array): try: return np.pad(array, 1, mode='edge') except: # numpy < 1.7 workaround pragma: no cover new_array = np.zeros((array.shape[0] + 2, array.shape[1] + 2), dtype=array.dtype) new_array[1:-1, 1:-1] = array new_array[0, 1:-1] = new_array[1, 1:-1] new_array[-1, 1:-1] = new_array[-2, 1:-1] new_array[:, 0] = new_array[:, 1] new_array[:, -1] = new_array[:, -2] return new_array def map_coordinates(image, coords, **kwargs): # In the built-in scipy map_coordinates, the values are defined at the # center of the pixels. This means that map_coordinates does not # correctly treat pixels that are in the outer half of the outer pixels. # We solve this by extending the array, updating the pixel coordinates, # then getting rid of values that were sampled in the range -1 to -0.5 # and n to n - 0.5. from scipy.ndimage import map_coordinates as scipy_map_coordinates image = pad_edge_1(image) values = scipy_map_coordinates(image, coords + 1, **kwargs) reset = np.zeros(coords.shape[1], dtype=bool) for i in range(coords.shape[0]): reset |= (coords[i] < -0.5) reset |= (coords[i] > image.shape[i] - 0.5) values[reset] = kwargs.get('cval', 0.) return values reproject-0.3.2/reproject/conftest.py0000644000077000000240000000262113173065713017632 0ustar tomstaff00000000000000# this contains imports plugins that configure py.test for astropy tests. # by importing them here in conftest.py they are discoverable by py.test # no matter how it is invoked within the source tree. from astropy.tests.pytest_plugins import * # Uncomment the following line to treat all DeprecationWarnings as # exceptions enable_deprecations_as_exceptions() # Uncomment and customize the following lines to add/remove entries from # the list of packages for which version numbers are displayed when running # the tests. Making it pass for KeyError is essential in some cases when # the package uses other astropy affiliated packages. try: PYTEST_HEADER_MODULES['Astropy'] = 'astropy' PYTEST_HEADER_MODULES['Healpy'] = 'healpy' del PYTEST_HEADER_MODULES['h5py'] del PYTEST_HEADER_MODULES['Matplotlib'] except (NameError, KeyError): # NameError is needed to support Astropy < 1.0 pass # Uncomment the following lines to display the version number of the # package rather than the version number of Astropy in the top line when # running the tests. import os # This is to figure out the affiliated package version, rather than # using Astropy's try: from .version import version except ImportError: version = 'dev' try: packagename = os.path.basename(os.path.dirname(__file__)) TESTED_VERSIONS[packagename] = version except NameError: # Needed to support Astropy <= 1.0.0 pass reproject-0.3.2/reproject/cython_version.py0000644000077000000240000000007213173066302021047 0ustar tomstaff00000000000000# Generated file; do not modify cython_version = '0.26.1' reproject-0.3.2/reproject/healpix/0000755000077000000240000000000013173066302017057 5ustar tomstaff00000000000000reproject-0.3.2/reproject/healpix/__init__.py0000644000077000000240000000003212724021736021166 0ustar tomstaff00000000000000from .high_level import * reproject-0.3.2/reproject/healpix/core.py0000644000077000000240000001463613173065713020400 0ustar tomstaff00000000000000""" HEALPIX (Hierarchical Equal-Area and Isolatitude Pixelization) utility functions. These are convenience functions that are thin wrappers around `healpy` (http://code.google.com/p/healpy/) functionality. See https://github.com/healpy/healpy/issues/129 and https://github.com/gammapy/gammapy/blob/master/gammapy/image/healpix.py """ from __future__ import print_function, division import numpy as np from astropy import units as u from astropy.extern import six from ..wcs_utils import convert_world_coordinates from .utils import parse_coord_system __all__ = ['healpix_to_image', 'image_to_healpix'] ORDER = {} ORDER['nearest-neighbor'] = 0 ORDER['bilinear'] = 1 ORDER['biquadratic'] = 2 ORDER['bicubic'] = 3 def healpix_to_image(healpix_data, coord_system_in, wcs_out, shape_out, order='bilinear', nested=False): """ Convert image in HEALPIX format to a normal FITS projection image (e.g. CAR or AIT). .. note:: This function uses healpy, which is licensed under the GPLv2, so any package using this funtions has to (for now) abide with the GPLv2 rather than the BSD license. Parameters ---------- healpix_data : `numpy.ndarray` HEALPIX data array coord_system_in : str or `~astropy.coordinates.BaseCoordinateFrame` The coordinate system for the input HEALPIX data, as an Astropy coordinate frame or corresponding string alias (e.g. ``'icrs'`` or ``'galactic'``) wcs_out : `~astropy.wcs.WCS` The WCS of the output array shape_out : tuple The shape of the output array order : int or str, optional The order of the interpolation (if ``mode`` is set to ``'interpolation'``). This can be either one of the following strings: * 'nearest-neighbor' * 'bilinear' or an integer. A value of ``0`` indicates nearest neighbor interpolation. nested : bool The order of the healpix_data, either nested or ring. Stored in FITS headers in the ORDERING keyword. Returns ------- reprojected_data : `numpy.ndarray` HEALPIX image resampled onto the reference image footprint : `~numpy.ndarray` Footprint of the input array in the output array. Values of 0 indicate no coverage or valid values in the input image, while values of 1 indicate valid values. """ import healpy as hp healpix_data = np.asarray(healpix_data, dtype=float) # Look up lon, lat of pixels in reference system yinds, xinds = np.indices(shape_out) lon_out, lat_out = wcs_out.wcs_pix2world(xinds, yinds, 0) # Convert between celestial coordinates coord_system_in = parse_coord_system(coord_system_in) with np.errstate(invalid='ignore'): lon_in, lat_in = convert_world_coordinates(lon_out, lat_out, wcs_out, (coord_system_in, u.deg, u.deg)) # Convert from lon, lat in degrees to colatitude theta, longitude phi, # in radians theta = np.radians(90. - lat_in) phi = np.radians(lon_in) # hp.ang2pix() raises an exception for invalid values of theta, so only # process values for which WCS projection gives non-nan value good = np.isfinite(theta) data = np.empty(theta.shape, healpix_data.dtype) data[~good] = np.nan if isinstance(order, six.string_types): order = ORDER[order] if order == 1: data[good] = hp.get_interp_val(healpix_data, theta[good], phi[good], nested) elif order == 0: npix = len(healpix_data) nside = hp.npix2nside(npix) ipix = hp.ang2pix(nside, theta[good], phi[good], nested) data[good] = healpix_data[ipix] else: raise ValueError("Only nearest-neighbor and bilinear interpolation are supported") footprint = good.astype(int) return data, footprint def image_to_healpix(data, wcs_in, coord_system_out, nside, order='bilinear', nested=False): """ Convert image in a normal WCS projection to HEALPIX format. .. note:: This function uses healpy, which is licensed under the GPLv2, so any package using this funtions has to (for now) abide with the GPLv2 rather than the BSD license. Parameters ---------- data : `numpy.ndarray` Input data array to reproject wcs_in : `~astropy.wcs.WCS` The WCS of the input array coord_system_out : str or `~astropy.coordinates.BaseCoordinateFrame` The target coordinate system for the HEALPIX projection, as an Astropy coordinate frame or corresponding string alias (e.g. ``'icrs'`` or ``'galactic'``) order : int or str, optional The order of the interpolation (if ``mode`` is set to ``'interpolation'``). This can be either one of the following strings: * 'nearest-neighbor' * 'bilinear' * 'biquadratic' * 'bicubic' or an integer. A value of ``0`` indicates nearest neighbor interpolation. nested : bool The order of the healpix_data, either nested or ring. Stored in FITS headers in the ORDERING keyword. Returns ------- reprojected_data : `numpy.ndarray` A HEALPIX array of values footprint : `~numpy.ndarray` Footprint of the input array in the output array. Values of 0 indicate no coverage or valid values in the input image, while values of 1 indicate valid values. """ import healpy as hp from scipy.ndimage import map_coordinates npix = hp.nside2npix(nside) # Look up lon, lat of pixels in output system and convert colatitude theta # and longitude phi to longitude and latitude. theta, phi = hp.pix2ang(nside, np.arange(npix), nested) lon_out = np.degrees(phi) lat_out = 90. - np.degrees(theta) # Convert between celestial coordinates coord_system_out = parse_coord_system(coord_system_out) with np.errstate(invalid='ignore'): lon_in, lat_in = convert_world_coordinates(lon_out, lat_out, (coord_system_out, u.deg, u.deg), wcs_in) # Look up pixels in input system yinds, xinds = wcs_in.wcs_world2pix(lon_in, lat_in, 0) # Interpolate if isinstance(order, six.string_types): order = ORDER[order] healpix_data = map_coordinates(data, [xinds, yinds], order=order, mode='constant', cval=np.nan) return healpix_data, (~np.isnan(healpix_data)).astype(float) reproject-0.3.2/reproject/healpix/high_level.py0000644000077000000240000001254513173065713021553 0ustar tomstaff00000000000000from .core import healpix_to_image, image_to_healpix from .utils import parse_input_healpix_data, parse_coord_system from ..utils import parse_input_data, parse_output_projection __all__ = ['reproject_from_healpix', 'reproject_to_healpix'] def reproject_from_healpix(input_data, output_projection, shape_out=None, hdu_in=None, order='bilinear', nested=False, field=0): """ Reproject data from a HEALPIX projection to a standard projection. .. note:: This function uses healpy, which is licensed under the GPLv2, so any package using this funtions has to (for now) abide with the GPLv2 rather than the BSD license. Parameters ---------- input_data : str or `~astropy.io.fits.TableHDU` or `~astropy.io.fits.BinTableHDU` or tuple The input data to reproject. This can be: * The name of a HEALPIX FITS file * A `~astropy.io.fits.TableHDU` or `~astropy.io.fits.BinTableHDU` instance * A tuple where the first element is a `~numpy.ndarray` and the second element is a `~astropy.coordinates.BaseCoordinateFrame` instance or a string alias for a coordinate frame. output_projection : `~astropy.wcs.WCS` or `~astropy.io.fits.Header` The output projection, which can be either a `~astropy.wcs.WCS` or a `~astropy.io.fits.Header` instance. shape_out : tuple, optional If ``output_projection`` is a `~astropy.wcs.WCS` instance, the shape of the output data should be specified separately. hdu_in : int or str, optional If ``input_data`` is a FITS file, specifies the HDU to use. order : int or str, optional The order of the interpolation (if ``mode`` is set to ``'interpolation'``). This can be either one of the following strings: * 'nearest-neighbor' * 'bilinear' or an integer. A value of ``0`` indicates nearest neighbor interpolation. nested : bool, optional The order of the healpix_data, either nested (True) or ring (False) field : int, optional The column to read from the HEALPIX FITS file. If the fits file is a partial-sky file, field=0 corresponds to the first column after the pixel index column. Returns ------- array_new : `~numpy.ndarray` The reprojected array footprint : `~numpy.ndarray` Footprint of the input array in the output array. Values of 0 indicate no coverage or valid values in the input image, while values of 1 indicate valid values. """ array_in, coord_system_in = parse_input_healpix_data(input_data, hdu_in=hdu_in, field=field) wcs_out, shape_out = parse_output_projection(output_projection, shape_out=shape_out) return healpix_to_image(array_in, coord_system_in, wcs_out, shape_out, order=order, nested=nested) def reproject_to_healpix(input_data, coord_system_out, hdu_in=None, order='bilinear', nested=False, nside=128): """ Reproject data from a standard projection to a HEALPIX projection. .. note:: This function uses healpy, which is licensed under the GPLv2, so any package using this funtions has to (for now) abide with the GPLv2 rather than the BSD license. Parameters ---------- input_data : str or `~astropy.io.fits.HDUList` or `~astropy.io.fits.PrimaryHDU` or `~astropy.io.fits.ImageHDU` or tuple The input data to reproject. This can be: * The name of a FITS file * An `~astropy.io.fits.HDUList` object * An image HDU object such as a `~astropy.io.fits.PrimaryHDU` or `~astropy.io.fits.ImageHDU` instance * A tuple where the first element is a `~numpy.ndarray` and the second element is either a `~astropy.wcs.WCS` or a `~astropy.io.fits.Header` object coord_system_out : `~astropy.coordinates.BaseCoordinateFrame` or str The output coordinate system for the HEALPIX projection hdu_in : int or str, optional If ``input_data`` is a FITS file or an `~astropy.io.fits.HDUList` instance, specifies the HDU to use. order : int or str, optional The order of the interpolation (if ``mode`` is set to ``'interpolation'``). This can be either one of the following strings: * 'nearest-neighbor' * 'bilinear' * 'biquadratic' * 'bicubic' or an integer. A value of ``0`` indicates nearest neighbor interpolation. nested : bool The order of the healpix_data, either nested (True) or ring (False) nside : int, optional The resolution of the HEALPIX projection. Returns ------- array_new : `~numpy.ndarray` The reprojected array footprint : `~numpy.ndarray` Footprint of the input array in the output array. Values of 0 indicate no coverage or valid values in the input image, while values of 1 indicate valid values. """ array_in, wcs_in = parse_input_data(input_data, hdu_in=hdu_in) coord_system_out = parse_coord_system(coord_system_out) if wcs_in.has_celestial and wcs_in.naxis == 2: return image_to_healpix(array_in, wcs_in, coord_system_out, nside=nside, order=order, nested=nested) else: raise NotImplementedError("Only data with a 2-d celestial WCS can be reprojected to a HEALPIX projection") reproject-0.3.2/reproject/healpix/tests/0000755000077000000240000000000013173066302020221 5ustar tomstaff00000000000000reproject-0.3.2/reproject/healpix/tests/__init__.py0000644000077000000240000000000012724021736022323 0ustar tomstaff00000000000000reproject-0.3.2/reproject/healpix/tests/data/0000755000077000000240000000000013173066302021132 5ustar tomstaff00000000000000reproject-0.3.2/reproject/healpix/tests/data/bayestar.fits.gz0000644000077000000240000031103012724021736024253 0ustar tomstaff00000000000000‹ ¶ëSÿ12157.toa_phoa_snr.fitsìØw”TUº7~rìnè¦É©Éˆ€t¬E%Ž(  f   0 c‚1"Žs@1‹1Ì‘ÁˆYAÅì/8wî¯ö½3ï½ïªµ~ìóyÖú¬>««Ï·ö9{?»OÕÈ!{:¨¨¨oÑ¿¨QE;Ÿ6uâ´éGÏ(š9­hðQ#‹fÌ;uÂØéŠþeõ2jø1ÿ&/½-oìôécgM;slÑÌYÇTýµO¿1CFý›¼^Ûò¦wô¸ÊéEÓ&þ3yòÑ•SgLž6uÆ¿Ì4fÔ }þÛëý®?”RJ)¥TbjûãäÈ!Ãöé[Ô¥ÿ}Fõë?tP—Œ—w*7yêØé³ŠfŽ7¥²¨òÄ™ÿx8ý·yÿ¿>?—ü¿??ÿ‘Wü¯òÊzõ®Ø–7¥rê3'mÏûϤ¢âÿa|%ÿ*¯´Wªäßä•üû¼á†í·Ï¨ÿÕç…#¦O;cÆN{tåÌÊéÿúzÿôË+þïy3þ‡ù5xÈ ¡Gþoòþ±d&N®œ2áß§ŽuÀðAÌG—á#†õßþ«.Ù¬çQƒ‡ØûyŽJÊe·ß>CFý#ï˜É'ö(Î6o[sl¿âíy{ ê7t{¯„ýöÏßn{·Ê)“gŒùë¶¢¢a#1dŸ?mËÛgÐÈQƒý—¼áÛsЦMŸP9}òÔ#ŠfŒŸTyte÷¢ÊÉ3'm›¦í§n{±èŸç ¶-qä#·å øŒ0oÐø)“™9y|÷¢?2vü¶£í稜R9cæä±SŠºV{ÜØ™Ó¦o;ÞáŸW÷é·÷×ûϽ#Ì›ºmõþ±Z&Mžñ¿Øl¶mVýëý ¼x{¿¨œ1mÊqܵÿlíùÿ¼¯ÿ¥1rûŽõoûmðäé3fþc6Š:uíU4nìŒÊ ;ü»ùÚï¸ÿ:¾Òâ²òTIj[Þбÿ/qECö8fä€=öÞvÿ¶Ó1dÀQáý2uBå‰Ûf¶OÑ?_ß>ƒÆüÇñ[/ý÷4àý Ëøi“§Ž?¬òøÊ©3ûd6yBŸâ’âòT—méûM|ìq•E“'l{aò¶Vž^4q[úsõÇoßÈQ#öÛ{Ðöõ\Ü}hñ[/C¦Î˜9ý¸m;ßÌÛÎ;³hæôÉGQ9½rBfÌÖÀ~£õÖûú+éUÜ«G¯Þ=z¥Fõêݧ¤wŸ²TÏâ²âtiÅ#5`û‘ÿX;Û~Œ›Q9ýøÿÖ.{ï9p{Ü?棼¼¬¬¢giïòŠtÙ¶ÕÒ«t[ÎÑÓ&l¿° E{7eòØ©ÿSæöñý±þ¶¯¬G¯tâÒQŽûô*îSZò_6qò¶u<~zå¿ïâ#õ5lÄö¼qcgm롱Ó›2müØ)“Oª<ìY™±=tøôiGl[Ìÿ¸ƒþóþýñÿ_ضÛù£ß¶ïÇ½Š‹{V”•—–—÷.í®(ßÞÇm›Ém-7yjÑŒÊñÓ¦nÛ›ÿãjÿ9”cþã½|?¤ÔÿPy-¾ˆ\•/~â–;¾êE@ävÜÿ rïwZÄ-¯Ê^WqËm¸Ûk@äÚ•wâ–sÀ×ß‘ëtÉ@Üê¾ào@äÊZÄ-'ÿ«±@ä:æ âV¿kµõ@äv^PÄ-¯t߃€ÈrûŸ€¸åŽœö<¹óžxˆ[ÞuËo"÷ÀQm€¸åÞ™:ˆÜš’J n9{~=ˆÜô?¿Ä­þ!»ÿDî„AOqË9gì]@ä.êø9·ú'ß܈܌¥Ÿq«7àÛ3€Èõݽ·ºÍßD®ó“ó€¸ÕëóÁ r{_w1·ºÝ÷{ˆ\ï—OâVû™Ë€È½ÿäÝ@ÜjÚ©¹ÊAu€¸Õþî¤ù@ÜêTÛ°ˆ[­?2 ˆÜ…£q«7i÷u@äNHÕâVwÈ­€È ;`+·zSæ?DnŸöâVw·{ï"ײeG nuêTD®NÙ³@Üj]rÜ@äÎ=°?·Úß¾4 ˆÜÃ7ž Ä­ÖÄ›‘ë¼÷Ý@ÜÔÞ: ˆÜ²Ž‹€¸å~\}·¼??ø' n Þøj¹’ÏfqËÛZm:¹vžâ–³ìÑq@Ür÷ž Ä­þ…9K€¸å4xàx n¹ï¹ˆÜEtâ–sóã'‘[¹æ- n ¶–ïÄ­áeVqËëóâ rŸžÄ-¿$ÿ r9+âÖàü+v"÷倸å\pã!@Ür[\¶ˆ[ý²Sw"÷ÝyçqË›Û`¹›ZîÄ-wÂkבkyá, nõ†\?ˆÜ’™Ïq«³¥Í‡@ÜêvÜz·úƒ«]D¿q«»d׫€¸Õ;ìÑ߀¸Õþó5€ÈÍÚóR n5W-Y DîÎëÎâV§S·!@ä¾¾ýk nµ >ˆ[íW?Ä­^û_¿"÷—)Ïq«[¿x·:›'¿ Ä-§ÝO€¸Õ/w·zWt·:çý¶·Ú/ßp<¹NwßÄ­Ö™9q«Ùm·ù@Üê<5¶/·šO?>ˆ[í*‹®âV£Få‰@än?` ¹¥›Ûq«öÑùW‘Û¸b·¯ÖDîë£&q«ž×{ ¹v¥€¸Um?ú| rýˆ[•â/Ú‘ëyøž@ܪ:h¹C¦¬âV¥äýº@ä*f} Ä­Æ·O\ DîÍ~‡q«Þîúý€ÈÕmw!··ìô¹Cß Ä­Ú3Í‘›²Ë—@ܪŽÙÚˆ\é›=€¸U)¯:ˆ\ûE €È½¸×i@ä.ùò r-™D®eëg€È5¹kg r ,"·S×}€È5«3ˆ\ƒ[±›Vˆ\þ–C€Èµð*·ª úâVeÍ×q«Y{ý@Üjôíh nU/îü<·jçT¬âVgÇ%‡q«7`ñý@ܪä~ü¹¼j‘ëy\G rGžq¹Fé1@äÚ•þÄ­jçîâV­Û–{€¸U¿ë´»€¸ÕÜ¡Ýç@ÜrîY;ˆ[ƒa'ÜÄ­v½ëÇq«{ö%@Üò·~p'·Âˇ Ä­úg"wÿÀ€¸UkøÛ nU—¦úq«QtâB n5›~Zˆ[µjãŸâV½^ÿ÷€¸U¹p‡< r'þõ1 r;ݹˆÜ£ç-"7î¡@ܪZÞˆÜÌÛq«²xç¹@Üjvž[ˆ[õºöâVce·q«º²ì n5oZˆ[õ§Ä­Æƒq«¾¼Ê#@änÝRˆ[®ëŸâV½të$ nµ;~x·—tâVóÜ÷N"Wü×Ï€¸ÕmzfS nUÆœ\Ä­êeÕžâV}ÇÔ @Üj\÷i nÕß›t·š]4ˆ[­Ãÿˆ[Ý»RU€¸åLY;ˆ[ƒ=Ö]Ä­Qñ¾õd*¼t¯§dj±d}O ™ZUù,H¦Æ[¿\ $SÓC¯˜$Sëk–ÉÔføÊ#€dÊŸð¹†/}t<·fOï:H¦¥ó6ÉÔö°Ýd*3éH ™Z.zér ™Z·ëðLívúLí[l$Sõµß âVçé7â–{íË­€¸Õ;ý›9@Üj?Üãw nyÏœ¾ ˆ[Á5›qkÒ¸Íj nù[vÛ ˆ[áOÃûÉÔøü¿l’©É³} €djþÍ‚_€djsþÛ/ÉÔöŠï;ÉÔ~ã„ïdêpïM€dj{úåwÉÔêùƒ«ÉÔñÜÁÉÔiÆc€dj¼ë”O€¸>öíb ™šÖúv=L­ïxü] ™Ú,myPå-×ÉÔnsþK@2už;bL]Æï–$SÛy×$S‡â³®’©S3{ÉÔùªvçÉÔpö@äž*¾ˆ[þMS_"wàÁ뀸5\òé)@äΩº/·ü]Þ› D®]‡-@Ü :åŽâ–¿²²·‚I'ö"WýûÖ@Üò_z ¹«Ž©DîË4»6ŸÄ­á±£Ÿ"7næY@ÜòÛí\ D®Ó={qk8ð/ï‘kT¾ ·üv“¾"×ôீÈÝ4á rwMDî—:×q+È÷,·üÇt"÷îiK€¸t¿h¹‰æ‘?ð r5/ýˆ\§>?qË_=³+¹oDî§-‘»wë±@äžzü( nv¸é; nùO¼{·ÂO·| Ä­ÑaG=Ä-äÌ·€Èk½¹§¼ˆ[ÃsnâV_·ˆ\Iú* rUêíDn§›~"wt¿‡€È-º¹S~8ˆÜ=—qË_Xt·‚êuâ–_8}"¹sÄ­`ßnû‘» ç nù¿¼·ˆ[A×[&qkðØ³£€ÈMí·üœËV‘Ë{ ·ßr*·†¦Ìâ–äÎ@Ü Þ9²¹ú»Ï"7è³@än®Dný¦@äV¸ˆ[aI‡ n«Ï"×¥s n=¼7·fÍûï$SóE]€djÒ®ù.@25Û÷Åö@25¾k}' nMGÎxH¦æ¾$S³E{œ$SóWw} H¦'×j $Ô9·­ªðê!@2µª·bG ™ZNM·’©ùný’©u÷y­€„šY¾H¦;wøH¦Vkw?H¦æGÏ> H¦–OMºH¦o6™$SÛ¿}Þ H¦fG9H¦ÖUï$S“²¾Ó€¸5Ûog n ÷YÚˆ[“â“n’©éáïv’©É©›6ÉÔà“K€djÑì¡ @25/üÓP ™šÌosLõ?l4H¦¦SÇ¿$Së®ÆÉ”[uiw ™Z¾=¥&LuÖ/+âV¿Æúš@Ü Þ9üT r—½2ˆÜÂwŸâ–hë< n ïn>ˆ[Î~ÜDn÷@ärQˆ[A«c €¸5Üã nùCF4â–³ÿÐM@Üê5~ó ny;¾Óˆ[½Úm>â–;û½_€¸5ªúëµ@Ürî›ò*·†‡þÚˆ[^ñò€¸Õ\xÂb nµJöü ·×·¨ĭνMž"w蛀¸å,ŸÄ­f^e ˆ[ýc,âV'wý@Ürû­_Ä-çÊ ÏâÖhZÁÝ@ÜßqC n…?Ìüˆ[ãç¿ì Dn@Ù!@Ü úm·†ot·ÂŽË7q+¨1¤·ÆÃ<ˆ\ëœM@Ü »ý4¹}6”‘þê¹@Ü n]“Ä­°Åòê@Ü ~™™Ä­á°¯‡‘[¶õ( n .˜r>¹·jÄ-¿÷¬@äN|ü; n ‡nmDnâ£Ã€¸5]}·¼{÷»ˆ[ƒ[ŸÄ-çõ¿ýÄ-ï§ ·qk×ér n9oØ ˆ[nµMq+øäã| nšŽš Ä-¿û±ã€È]¹õ nZ6 ˆ[ÁÜõ÷qËÿöéw€ÈU}ˆ[ƒ«¼ˆÜw­~â–÷û?qËm³öA n †{ ·¼ÏnÄ-§`Ñl nõ{4(â–_oÎe@Ür_}æv n Ï鲈[Þ†qs€¸Õ°ËO@äZ _Ä­þ쎅@Üj­zh6·¼ÖçWâ–[¾ù% nõZßÝ ˆ[Ÿ+Vq«רþ@ÜêvèØˆ[í÷k4"WR£ˆ[îµNâV÷‚VïqkPã‘ @Üj¿yëP nuOM_Ä-gôïÀ¸Õ©ìø·úÍÛˆ[îï Ä­ö«‡lâ–sÞÊ–@Üêö¿ú. nµžûq ·úÕÕâV㡯>âV÷¶šµ€¸Õ<çðM@ÜrªÎ~ˆ[Íáu>â–ûʽ·qk°zS n _<~L­.»õM ™ κüQ ™ÚyÙ` ™òþé} n¾ùLm¿©¨$Sã.Ý›ÉÔn§Ý’©Æ¼‹Úqk0wÙÛ@Üêºñ n ö®{·‚s= Ä­É­†ÉÔ~÷¥µdjº©à~ ™:tÚò3L=OíÄ­E‡'ÚÉÔáã‡ÉÔêÊ¥§ÉÔñÏGt’©^³zÓ€ÈÕix·Zw2ˆ[헜ĭæ;W}Ä­ÖwïâVwõƒ?q«U¥s{ n5/«ö·ê‹žyˆ[íÉyçq«sIï?q«UÚ¦·z[Nì DnÔ¨3€¸ÕoU” Ä-÷¸Ë€¸å¬yk4·úÕkqkX}Ÿ5@Ü êû·6ëî? H¦Ž_$SÑI;$S§âó.’©Éï_tªîæ]€d*¼æ·Í@2µüî/ÉTôE'dê4tÈ]@2U»y-LºÝr%L¹“_^ Ä­áÍ'ŒâVoÖâÖè¼õ€¸5®}øz nmª]|7LŸØú#Lí&uLŸ=H¦Âë{÷’©õòµÉÔlÎËßÉÔvÀ_ €„:©ÁH ™ºœþÓ* ™Šª¼ý5L/šêÆg’©¨WÎÙ@2íPVå! ™Ú¿øpL-þ:î ™šŒ÷3L­¾_þ9LÍ&.X $ÓŽ«Ní$S§Óó’©gŸa­dêÚ~×Ë€dj{æûãdjqî¬r ™Ú÷8ò8 ™Z­~¢L ¿ˆ[ƒ| ˆ[“Ú‡Îâ–?í™e@ÜŠÇ]»2Éz^ôB£$+9¹áÑI¶ÓíWÝšdÝž½þ ™JÏ©?:Éz=UØ-ÉÊæ<m’¿>ûà$ë1æñr ™:~ûÄ“@2µÝ¥÷Å@2u¹j÷]€dj·aÚs@2•?ÿàMÙ(»òÎzÙ¨(™_6Ê›|V’ }–%YÅ¥wËFù…½“Нú’•ª¯ÍËFé·«Ç%Y¯ÑÇML²Ï)O²â±¿¼d=-Þ9ÉR%ý&f£bì1‹³‘š÷âÅ>ã ,}sàð¢W2U<|ìÄl”ýpøä$K­ìðDà쪩À;·U \µêï†-ÉÊ÷ž ,­}V¦t­«2¥ÖôÛ50³wµ@³#÷ Ì+èÓªc¦ŠÛ/ÊFyA«;³Q1¿f—l”_PòN6J&íß:ÉzÕ=©~’•ÎÜ÷Ì$+®Aq’uëÓº7L¯>ÿ\ ™º?SPH¦.Úu3L-ød ™š¶¾ü^ ™Z}|Lu ™šW[=H¦F/ ý ˆ[ÛâKgÉÔâ‡×GÉÔî÷6ÉÔºú¼Õ@25=öä@2.Üs LÍ{^$S“œ.7É”×¾ÓI@äzür ·;¿3ˆ[ÞÑ«f‘ë_ø¹6 çqË}mÕŽ@Üræß½ ˆ[ëî Ä-oݼ/€¸ìzì=@ÜÜ0 6·ÜG¯ëÄ-'ç•­@Ür·üÒˆ[N#·qKì¿"Sê“7OÉ”nõÍû*uûdJÝzÇíÃK‡?yiàì²þ™ÒkìÈiô{ Gů¦íŸÉ”zû³KW7¿1°yÀŸKÇ­ÈTñeÁ)Y©öó¨l¤JÛ´ÎFÅÄß?ÈFºd·]EkÊW-H— =!]¾òÐtéò±é®L Ôüð½L©5çtÍ”Îß''Sê“u2¥Ë[vN—Í›‘.}ciºìÉÓ=Ͻ>PòÔw¡ÜŽ–³vÏ”Úzݳ™Ò«¨ú/™Rï¹!зõE¿ Œ¡q¦ŠÇ«NÏFjå#ósú¾xç³7×>;Ф²<eg•d%u{?ŸdåÏ=64e7LÝ1颷³QÞþ×»²QZí²$K÷l8"PÚì”@— ßðZ Ûy¿š4Þ5ÐóKm;5´}} ÇÃ+6ïèr^ý@¯{wt¹_ WýÂÀŽ#_Ï”Úü\IàókgJ×\uV¦Ô‹', œüöà@Û-þÚm`ÀNÇeJ7¼kz¦Ôg£nΔnQrq ÊާfJ-ùýÐÀ‘×ÕI²’{v®’d½ÎÞ¥c’uÙàf ™R·÷¹1ðQÛÚ¿^v_àÙOÊ”®¿ôŽ@ÛM·eJm}a¯Lé¦Í 2¥N÷xàîçÞ Œx~ÿÀ›¾|òËÝ™Ò9žœ)µæÑ™ÒUwèVûý@—y¯:}}i`‡¼foÞ¨²nm íyOê¼5Ðö²:®95M÷( t¼lE¨þ®ÂÞË;δ<èðL©ý^œ1©,³ÛŠÀ7 ,];/ðEëi«×ö ¼Üfj ÊÁ?g圮êÿX`ìc­×÷z+S:÷àÛmÞꨖ¾#д z ÓÊCEµ´ÿlY CÕc3¥¾:ÿøLéÜÏdJ½ú·+3¥«½2$ÐzùóÅšœú§@ÑWÓ2¥V_ñY`^Í/ï_51pkç*Îï^—•Ÿ®þ-ðØÏë3¥k]˜)õÆss>¼=P²ï'k}íÙ™*,ÿ4å{튇*·d£|ÕGçd#Ýàª{3¥¾^ób¦tÓ-U/½0Sêþן œ¾÷5ã \6°F¦t«s»ê×Xh{Wn à¥†™Rö-ÜÑóîÀ/ÏÍ ,°iÕ½[ù6ðÖè9F×ÊʼÙ/?ºCàø6»=¹s¦tÑÄf×o ´¹­2Ъ"/Pëäþ™Rëv\0>+uÚ>žTv³²Q1còÓÙ(»òºUIVÜëîáI¶S½±»&YI /L²^µ«ÏN²Ž‡Ï^ $SÛ®Ë÷’©KõóÞ’©ÝE=¿’©eΘs€dj:ÿµdjõë³Ã€dj^ú§Á@2ípJë| ™:^SH¦ß<ö ™:ÿõ:@2µ­¾ã ™Z|¹y5LíJè$S«[+/’©|à-ß%YÅ#SÎÎFjŸf.þå«ÀWž˜Õ>/SÅa雳‘j1á’l”]ܲz’UT©|6+Ozd6Êçݳk6*¦5)©•Mº6®Ú'°xI:ðÖ!¥™Òu—îhôÖ¦@•—_ äm¼'Sê’Z+ÓÇNÝ8p[³+_yy¦t¼÷2¥Þ<ÿëÀÖ&¥™ÒΨ3¿f ÑgrïŸ)õÅôkømĵ__š)¿ÓÀ@ƒ­9‹¿4Ñ?Pã‚73¥>L½)]÷¼.™R›K;F.¸dá†@Ïßr§¼Ð-ðø[«_ž}eà¶¼×o¤—Ú6h•KÞZXñ÷©SÏ®XXXtËSWŠægJW}j@ Îî§gJ}EßLé½)uIÎÁG?î8嵓·Ž( |øó -ïxñ¨éo}Ÿ©"o¯‡³òÒüû²Q~ÝÅf£âÔ‰÷d#µÿaõó½(y²Gàäšy°fà½Á»n^°"ð°+íÌÉʼ·êÔ60ë¸^›ÎÜ!0÷‘½ïþ/>®x.ðô·Ëço|+°g·»×>Ú;0¥Ï½™Ê—¿Z”²›KöËFÅN£^ÌFy#Gg£´ù…IVqé_f£üöÃÍFÅוçf¥¨[q6Êúýúi’•v¨x,ÉÊr¬N²’ 7tI²Ò+˯I²ò’S²QQ°`M6ÊÖôIg£|á°k³QñÊÌ™ÙHü­{à¢Â»Ňœ8þw3Uœ>åÄl¤Š.Ùš²ë‹vM²ŠÂ­ûfååÅ»e£üÖ†+³QqúIçe£øåoK²ÒNß}œdÅ5†Ÿd%—ÞZ’•Õ;ê’$+ï=õìlT4>å×l”½2é¬l”ßúRi6J/kú[’•ÝpÊè$KÝ_12ðÆš;7Ž<]uYàë·üpí˜ÀÃë¾9oÿÀÍšîùvz`ÆÂ÷׎œx¥éÀ§ÏìxüÝ‹ëž|!ðUê¶À«Ã‡6²,°~ÙüÀ]·Î̹è³Àc¿ÿ¸âõÝÏ}&°á᳟¿º1ðé¯#/6 ,´à]•Ì ›ºcàÜË=«Ý˜öÙÑ;XÓü†ÀUƒŸ <:}ï@ëdeînçn;ý‰ÀQK:.ÿ~bàƒÓ>=tzàõ¿÷ |øóÑõ»· <õ×÷/ü0°ö·©U«XWï´ÀƒOÕ ¼Te¯Àûmº^_sc`Ý–é·ÛÜ蹬~6*þrÛ¾ÙH1¹G ÏÜÍKÚŸ8pøòLï,y8åc^û$ÉR7åOœôÕ˜À=ܸàú¼@»ƒzeeù ×ÔYXõà{%¹Ec+«ºOº=0wÏŽ!_î‘©bvEA6ÊçßÔ1Ïu™ž•:ÌÊÚ×f#µÇÍgO]èúÕ.‰?nÌTqêç ²‘jvÚ5Y¹eÜi'*çþ:îºÀ½ï<xmêªÀ[kw<ûÆ×¾, œ1njàÆº½c_ÿ[`Þåw}tc`Í=«w,oxòì‹3Uvy2+«×uÉFù-×7ÌFÅ [.ÎFj÷×ÌÞý¶@û:Ñ6pÍÉøluàüûP `¿³rÂÁå+VL ìÜÆÀÜ©kkÇ/<ØðÜÀË·/ <>çÞÀå]~L*}!°ðÎWg¶ú!ðòô뫪¿XóäYçvÞ;p÷Ÿ*OxøÈ×sF ñnÏg£â¨×wËFê°ágÚþ9'pÊwú<±%SŲ±ßf#õÌÛ9çò¾,oÔ6ðÌy_VÜÕ"°øò·O¼ðuàÞ±CwošXñùË·ü=ðÀÙ'n99ðÐÄS+ö¸%°lüÕó^YØÿ¾¡+†ý˜~ðz‡g妪=çŒÞXräCù{åöµ<ÐhÞWIÏÿ=Ðýò£3õl2vL]7]ØH¦^÷ïöt’õœuÉíIVüÌù·&ÙN'Þ/Évì5q3L.ø%Lmæ.š$S§¯ZÖ’©èâ»O’©dË ³“¬×“M²².£I²âë&ìšd=ޏòo@2•÷9/ÉJÞ}òÁ$«8è¢G³Q~ú–ݳQqÇæ­Ù(ßtçül”5m· Ézõ;£_’õX6ou’Ïù°o’õüÛËc’¬k‹Ç·ÉÔþá^ßÉÔm¯3€dêø·«’©°|À§@Ü.¿q(·¦³wªpqá@25ûþû3€djüÌÈ@2Ô,~ ˆ[Þìu?q˹­÷J n ŠÞlÄ-·Ãîßqk1£×‰@25­ž7H¦–[æN’©YÉ›÷ÉÔhßç{qk}Õ}€dj~܉ëdj{Ú¬q@2µxàÖ/€d*\Ó÷A n n~p(·ÜáÍâÖ`}·ë€¸ålx ·¼vÝ7‘{ C ·úsÞ Ä-'ïµ§€¸å?;éÿ°?—Y‡·±1:lcÁX²¸ïsÇîÑÝÒHª”" "ˆ”twww‡H‹ Ý! ÝH‰ ‚¨ð°·àEç.{ ˆ½ÝØ[ÖømÝ€½e^—w°¹ZG¢€½7þì`o™ú%LöäÞÜØ[¦ˆq €½ùßÿØ[¦Ãc{óó{Ø›@“"ÀÞ2u›WØ›Ÿ¯vf`oþcRw{ *´Ø›_¦å?{ :µà,°7¿‹®‡ÀÞŒ®NÊ\·ævTæ,<;M™+Ot1ežØʼÁ™ê*sÏ8A™gRÉPeŽå%®Ðäºi”2OTxQe®?g+sOM ,½øO>+|yãûZá=»¬ŽéKWd·Â÷ãg¬ÈÈøp°ÉEw˜„éjRïƒîÿË×mÂu+2²çíj…wÁ§³•ùr¬ÚjÉŽº~V¤/,”Ç _[ÿ>VdL½:ÕdÍÏL†EÜ7™ß)§ÉŽ_CLv—no²ñÖo&ÛÿÛmÒ~aU“ Ÿ›Ô¸¶Ãd`ù&Ë–ýa²ùêl“™»ï™¬NÍl²9ùžÉ¼Áÿ˜|ç_ßdÙˆç&ƒþžgR5íŽÉ¸–ÇMZv_i²åüj“ÕÿŘlÚd²nåc“a‘&_wÌf2ë&#ÆU7IݹԤյm&y÷3©äYj2ú»6& Z~nÒË÷©Éä×ÕMžWµ¤éýÅ&Ãú/3)ÝìªIçg‘&kýn²®[¨É’NÝMV·ò™,¹‘Ódâ¡)&Ë›•1™ñ:ÒdVöy&K× 3Wô„ÉÜe&Ëóö3™{zœÉ’_MŠÿ_Þ€ò£•¥»ª±Â—ùéJ+¼Gw¬³"}¶{†žÑ½)óΜçVæ[ÿÛk+2RÚ|a…¯é²–üQÛÏŠŒí{™LÞpÑäÓ!MFT:i2oê,“ù{&™Lûå„Éœ³‹MªÙlÒcß+G‰&Íý†™Œ­SÄdúÀú&ƒZö6™ú¿|~®hK–ÌmeEú”2Ϭð}P¡¯Qeî[Ò!Çß&Þ·4©×½´IÏ?§þ/ßíÛ{­ÈÈ8ø¥I‹ÆM¢÷¯6©zýÿ•:îÎIšŒä¯w)sÝ> Ìé¾ð­2W¾M=•%7l @“ãÛAóhòLê.íï¡ÊÜc×¾UæòÙneéó=Sæ›±¸¿y~®l…¯ôý––œ~¿× u”¥ßîã°Â7¦Öt+Ò‡”éb…Ï‘Ç×Å÷•yrl»§Ì•õXš2÷à„`ežg'›(K/ûç8ež^‹VæöÑNe¾÷«Ê[Rëê+2m²[á[<¬µéÉ%'(Ëè’{»‰¯k6“A§5©]ã›ÿå{š–hEÆèCMÚÜŠ4™ôA^“^µÆ™©ú¥¾r¶Y‘ÞîÂ+|Óß°"ýBÅãV¸O­Ì_pG™7g½fÊ\}F%(˘vf¶ÉК̸;Òdôæ_Lš^Ú`’Xõ/“NEû™”Úg2£W>“ñwê›LqÉdâ¾æ&}GV0©óª¯ÉД&­"ÿü_¾+#êYâþx‡ù–Í·Â7¦ßu+2&ôØc2±ÌA“‘ö5×ñÉÈàLºXh2jãf“>=ö™|“4ÆddÏs&Ò³˜ ZTÙdT¡/MU 2^¯³Éà-»Lª¸Ê™„N_kÒ¨Ìï&Éÿø¾#ÝVZ‘Ñf~˜I©‰íL:ïlaRsH“ – V¤nyV™ûðÐß”ùâ/ ²"½þ„¿­ð ¸]ÊŠôÝŽ…Vx3ßVYêü ?hJx{³2MF¶W”¥EwØ¡ÌÕ«TUeŽ ×*+Vß]€¦Œ†+:˜|1ê[“2uçš|2¢‡É ÝL½4éñº¡Iÿé†IÚü––|ôĤGÓC&õ_Ž1ùüâ—&=ââLß]jòÕüQ&­’_›Ä¿mIÏÐÆ&m_=6éºs‡IûÌýM>hxÒ$iMºIíLÒ{/5ÉÔ®·%e¿¹cÒdÕ8“äOsšT<íù¾ÈjEFáÇñ–´½pÂäóæñ&Íîì5i] ŤéëÏMÊývÀ¤ùÊn&Õæ¿0ù ÷D“¦£Š›”*ÕɤvÂ)“¦—šÔò˜4ÜaR{ø÷ÿË·uÛ_–„u¹jÉ‹#^KÚ¿ßnEzΞIÊ2B†õ²Â·¬ô+2’_ük…ïR£ß-Éñl•é¥ü¯XákßÞŠôÅ•Ï[áë÷ÃQKžÖN±$:ìŠ%«‹ß³"#­þ\K>è›`6ý“ò«î˜TÛÏ$Û¦µ–x~ØkRvó“øZKL¼Ý^ý¯ô} ;Yáû4©°ém*δ—§ÖyK~rЊŒÐõ¬ðÍøµ…%TþÜŠŒrkG˜۶ߤüŠW&Î_«›dšlIÙy•M<Ÿg6)±e€‰7Ï)“‚ ½­ðMùó %~ŧ[òC~–”©øÈŠ #8Ê’"=OYY»“%Eþ*h…ïAÍþ– þu³%–Zá[Qv‡îCýÊŒìý•yýzKs ñ²ÔJ›hòþ3º€2÷¡]Ë”¥?û½%1½­ð%¶ûËŠôáί­ðüVÇ¥Ì(ôÏLeiÍ[+sÌ÷N™cC²¤âï;Д:ûÑ9š>ùå[š’ÛìÙ@“Qø]ne®ýU )s¹³T™ñW‘ãÊ<¡÷¤ÝÙyL™»}aižö­(sL== €&×êÔÊÜOë¼Rfœ)8V™»FHIeqË“hJòVÜ@SÑw§ ДP¨Ùç4¥vyV€&絃g”¹Æzï*s\Hh§ÌXœçˆ²äðóKhr$Dß )=1Ç9e¾2*X²óû–ø?\cÉðÚXáýÊ¿€²ô…·Xáó–ÎnEz… –<ʨdEFàµtK ½}o…ï™=Vd÷ÌeI¶ðVøþÈŠŒ¬[â¬ðÝXrÐ’%ÉnKîÍyaI‡Äâ–l¯rΊ ÿ/_Yá{ì ²äAb¬%òDZá¹üÉŸÊÒó´þI™§éó”yÛܪÌÕs‘%cÿ|jEúéð1VøjìÏoÉþ°l–\q´dî/Í,Ù· ŠéCÒC­ðe˵͊ô¢ßö²dëš+|]§NµdIûï-I]mÉ-YÒ¦Ý"+ÒOV=o…o¯ÿX’wÿ+¼ó=Ræ[ue«%ýªY²ÛoI÷.+¬Hßü$Ù’€O-ù;ãsKê Þi…{–5ÊŒÔÅ%•y.DwVæÿ—¿2ßê•,÷ó\Kö•=aÉœ¾-‰Í=ÆŠô™sZá«v«¡ég—XâÛ{À’…?F[²`xKæ•zlÉç±G-É\(Ê’>‹úZsèO+¼+}ªÌ½í×ÊÒ+V<®Ì³ÑYO™ûì”UÊ<§WæŽO¿­ÌS5n¬2ïëK·”¥?of…¯ú„¶V¤/x¿Ç _Þç±Vxë÷8¡,½^|+KN¬ñXüíPKÆDí²ÂÕð³†ÊÜ«7Rf´|sN™ëm‰ež½u&)óþÔw»2Ojõ«Ê¼¥{çUæþíhK&½*mI“kK,”¹ž%/–µ$c[.KzmbIå?wZ’{²%M&X‘þꛓVøœá,i;½¬%ÕÞfßV–”~ÒŠôKé ,©3{ª%ï›Îµd䋃Vx»»)óåzø¥髊N°ÂWèãéV¤ þË ïÛÅ•¥¯sz­ð—^`Ez—ûÖ-¿Ä _J©Þ–¸†ýkIvß6K"º·"Ýw.XÚåfN+|[¬H_}Å’Ë+­ð…úºY‘~9º¶¾¼×Ò¬H¿“ë•%5Û¼Qæ Ú;ÑŠôÛ‰™,yòËK~î2Ã’Ó:ZR:ß,K–;cICgg+búŒo@S„«âJšb”] @Sä?§¼4ì:¬ °·ø?Z× ©H–"Óh*V=ósšb‹ý·€¦ðÙuoÐT0Ó¶ÿhмXh%M¡/w/ )O´û&°·Ù"¦{Ë5³°·•gö–ºõŸ4%.wyh2ì| ,íA|Ê\³ÏdWæüü·kÊR¼y@Slp•þ4Em ¸ @SâÕ+õhŠ/ò <MîÕ?ïRfl¬SS™gä–EÊ\û;6Wæ8ôÕxš¼ÑFUeîùþ••y'=|¥Ìómñ7Ê\cæžSft.7K™{Gèe®Åƒ+Kóá3šŠùcMN¯#CYÚ“ß2)3ºt{¥ÌYp{e©õÏ5 ©ðõ'¥h Kú·+ME»7>@Sô¾uh*øm‡Oh Ô¬M‘Ƈh ¿ßh&M 'ª¦Ð{¡à(šŠ}òõšúõ_ @SLBŽÇ4E¹€¦Ø ›> )¦œg4QT»@Sìã‘ËhŠ^Z-+M1ër­ )qß¼j4¥œL™@S|ÓïÐTÌÝ´"M‘·Ë_ )zâßM…ßU¸@Säø½h*z¸wYšzWž@S‘°´Ž4ÅŽYÝ €&gÍ&³•¹rõΦ̽?C™ØÌ­Ì=²¿W™gå¬&Ê\+û^QæÉ¦,Íù*€&cÉæ¡ÊÜíÇ)sôÜSæ*{½ƒ2ﺰ(eéO °dõ7–»¶Æ’A¿ýk…7"|ˆ²ô€*¥ ¼dÉÁŒ0K–ÝyeÉú/×Y²xÝ8KZÏúÓ’Ù•nZÒ·û#K†ôŸiÉ´…/-©¾²³%ŸÌ˜kɸ‚¥-ùúÊ)K>{YÁ’wx­ð úâ¾2o¿ò+so¨ÌSë·=ʼgvD)KÏ>è–2Ï©‘Û”yŸ+Kn}n4MŽQÅ÷Д8÷á@šŠügMÆû9}•¹¶·üV™ã»›#•9çÕ Ræþ$e‚´»Ï¶(3:] ÌU¨úse){†T )íc¿ïh Oô> ©ð˜cCh =rv Ma? º@Sä‚ð64Åœ> @SäÒÌ£h*âÊ] €¦BûbžÐT¸Üߚžtœ @Säîô‹4E5U€¦"_._@Sô›'‡ˆòn¿@S\åò5hJ(·;'ME—ý3 €¦Ø«” )qgÀš’¦ý@Sl“¡ÏhŠ+²c ME’¦? )&ñX"M‘ŸûÐÞãó}4M^1€¦" ÃvÐìÞ @SÁ¸~›hJ/ÔI™wàöÊÒK®¯Ì{ãïÙÊ<›k^Tæ>þK€2o“Éó•yÖ5h¬,=¤L²2ïŸ#²Iûæï…Ò¦SQÚ’ôi®{¤M˜÷‰´êåPæ:Ða¹2cánÊÜÞŸ“–åƒÛÊœ-æåPæÈ¶ý2W΀eFÀ¯_+ó,ûo‘´ Š ”y³%íPæ™Þð¾2wy¿¯”¹ú]V™'׺ϔ¹ûUPæ©5bš´Ê*s-ò+sçó·2ÏYÿfÒÌûI™»ýgÕ¤­¸¼G™cv­<4ýóz¥[ÓA™#÷ì¤õíÕA™çâñÃÒ–×]¯Ì}þè{i_ŸRæiüæe}'펧§´='*sÌ·AZý7«•9N÷§Ì³úGe®‘Í‘¶hrkeÎîÆIÛô2FYZáëUhJP4 €&cNýËÊœ›Ï5Pæ:9kŽ´˜”9önT–öãÙSÊŒÞÛ{*sîú~ˆ²Ä_ÝhŠþMicö„Дò]ÁpšÜCNÝÔf™´±#¤•¼:\™kÄw©Ò²´Û.í÷áK›7ñ#ik/ç”¶róqeο¯Qf$fž¥Ì5+ûiC§•Wf4¨ôJZ¿Ü¿J3²«´ÿ¾Sæª[e‘´2+sNN}'­ð¾“ÊŒƒgH›ôÛe®–i}¤•oÛF™1é—ÒÒ–7¬¤Ì•òEº´¨B•?pJ»þÝ-eŪ?_@Ô³é}hŠ[3 €(Ÿÿ$š’'$ )¥^Ó74Å–x]€¨±áMh*0 Þy`s5þ­ì-µFãÛ4¥?}€¦¸£î!4%¬8ž€&G–äD­ô€¦¤Ñ~ÝhJŽª² €¦ˆqÿv )ºÅã(š ª@SèúùÿÐTÔ£>Mqû‚Bh*œ6b#M‘Î'ДuE“UÀ޲̹ÙØÜ%Z{ N®»Ø[–•O{Ëšr÷°·àlÿö–eá]€½…¼+ÙØ[ÞäÀÞ"./î@SáÇïÐ]¾ó@š"ØQ €¦ð”._ÐöŽU4E|×Ê€¨¤šQ4åè]±7°·,]O'{ ½Ôô!Qy/'ÐU€¨Iß¿ ©à„>9hÊÉÓ€¦È¸,ˆJ]_€¦à,=›{󛨨[öÏû†{Ë2/é°·Ì¡Í.{ .[µ<°·ÌƒŽ4ö–{ì±`oÙ¿ïp Ø[Þ}·{Ëõíu`o!{Æ´ö–ÃóáN`oùŽ,ª @SÝo¯Uÿâš"r'¸h {±"€¦Ú )êõ½éDýÔ`)M¡Îh*Ú!eM…ŸhJŠÿâ6M±­î )fhÿz4%¤N )©ïšŠdi¼ €¦è¯OДòt Mñ+Þ¯ É±uei]·½Tft8PDZ£ÚÍ”9Œ|HËòc€2£Ù˜O¤uìTC™«p±’ÒbV÷–©ÊyiE‚®Kó¾Ì&­IÆ%iÕ·×—6èÙdeigóï“6åY„2£or-ißT9§,­DÊBe©ÇŽRfti:IZÈÞÊ\ÃVU”¶ìûÒV Ï-íFÃ~ÒŽ¾Z(íÉÔ‹ÊÜùN×V~¨WYÔž¼]hŠ<€¦8oÒbšbk}þ €¦"±«Ðsú—4šb?~½€¦¸îåoÐäˆë@SêÖãkhrû( -`úUi½G+m^™«Ê\r<’¶¾ç!eîïË–vþüTeɳfGÐT¬Öù¶4¹>ø-C™±þþ}eî‹{<Ò¶î©Ìy|Ë6eŽC†+sw½ÓN™ëúä5Ê ÿ–I«t5N™£Úæ3ÒVý®Ì˜~j›´{Ë—)sæ©»YZŸ]E•¥ôýâ(M©>N É•Ò¯´þÃþRæ¼ò¢œ2£ÌÉÁÊ\Û‹6Qæè~Q™±äZ²2W–ØNÊÒú=. @“£ÒüZ4%\ÝW€¦¤ ÙŸÐ=¶v<M1Ÿ]¨@S±›Ÿ|@Sò­u·hŠÍý "MqãÃÐäö¹KëSè½2×G÷îK[³f³2÷Š„Ò~¾š¨Ìõß-§2·/Ëeέ…'+3Â~¥Ì‘ilº´½'•ƒFÏ—öSÊ[î\RæÌ=Õ§Ìø8RZØ\Ÿ2w¿•=¥­SY™'ÚÝGZölG”¹Ï–k$íE£æÊ\‰ñU¥ *­ÌÙ*z¢´µE‚”¹v_y£Ìà~¯Ìùþ‹ÊŒWÊRf?º@Sj|ñË4Å_KÝ @Sbö©ÙhJÝrw3Mi-Žß ))ßá54 ˜ €¦Ø%UÎð )aèO^šŠ%Ö\ @Stàîó4…ÿÙwMÉ‘ž )>ô°MÅÎìË )eÓâÅ492·ý^YÚÍ\Ê\O¿Sf 9QL™#χ›¥M®_T™ÑjÝui£~:ªÌ1ᧈTú e©:žSfÚ8_Úˆ>•9»ì­«Ì˜tò°´»ƒ‹+sëyDÚÑåÊÜÓ3ý(í«¨ežóÅ)‹9—?€¦Ä7§Ð7$µM©õ÷e ©È§kД–gG.šÛ­ )­a£‚ÊŒ²J(sæü@™kÓã!ÊŠuoÜ €&ÇÖü_ÐäZŸûeŽž}Ê< koQæ:5º¢2gÍïÆ*smÿ÷˜´B«Ê)søõ¾2£h%ÊR³;:+s·©¢Ì1åÝeÆ¢‘(so9û¡´à¤œÊ<¥&e’6Ë?ÊŒ=*óF'*sWþ÷„2O¶º¤}è¸(mú§Ò*Ô½¦ÌýØîÒê-o,í¯·‡¥]?PZÀ­›ÒüޤI[Õ8´ ŽÒŸÝV¥`†2chÞÒ67Û Ì]ûÌi£š)3îLjªÌôd§2wÌœ–ÒzµË)mÁÉÒÎ}ZEÚïûò(óL^¹JZ¸o´kº+s—9~DÚ§c¾QæÊÛ¾—´ð^eîyo›K»·ë’2W©’9¤ ¼ªÌ‘µÝm¢æÌ@S±cÞ¹4%Þ~€&çêöKÛqj‡²´gUJ+s¸cf)s~Ûï¹´UG•9†\<(mGÑkÊR’BBˆÚÔeMÞ*¹•yæ7\"íÒÃÂÒ¾(®ÌÝjÆ/ÊN™;)~›´í o”3ž¶QæªZi˜2Oé¿:HÛ¶†2×ëÝ¿+sOÌ÷•²”ÒДzªY-šÇ< @SÒÓüÇhr”èq€&£¼§’2W¦ôgÊíßÎWæŒõMQ–ܲˆ€¦”›MöÐTdòwDÅ ¾9€¦¨A•*ÐÒ/€¦¢ :@SlúŒ0š¢×¹@S‘êÃæÐqª°€¨·Ñ h*ì¥5MáK¢WЙ#æ&QQ )<¡{Maóûÿ@S\t¥{4ÅÍ@S‘§+~ )fRæ.4%Té–@Sâä^mh*ZéñešbCNÐYµÞ¢ÆÏª @SXDù,4…n[×€¦È'¡ëhŠjë @Sè¸Ïª5cw+š¼£/I«Ó5EÚÚK;Ü®µ´àº“”yæ?ùH™w_ÛÒæ,øWZl¶|Ò†nt(ó„ÍsI›[ÍPæýþ«uÒ½»(-oÓIÒ¾vuQæI^×D™{sl¬2oýÔ@ežW§›+s»ÇOTæZ^û¼2Oÿë•”¹_žÿU™÷÷ï"¤jvYÚ®ï¥ý‘#@Ú¤G¥¥t,©,=èìxeÞç÷~TæZûsº2wýží”9V­ÌX2ú”2÷£ßK*óôX¬ÌõñáÖÊÜ9Z^U–ÖhM7š?@“çé³Þʼ r*s/>ÝX™'íveÞå¿”•vçA‚2φN=•y‹äHPæò»ÓFÚêE{•9þKï­Ì¹«öteîšq›¥Ý¨œW™1üéKe®ô)K¤÷¿¡Ì¨»þeî–sß(sè˜O™sy÷æÒ"¯ÞPæ {ðL™ñéÃÊ<›ödH‹ÝõJ™wƒãi ßÖRæ¿x¹2×££qÊ<×¶“VóäXeŽ3·&KÛ'›2ç†a^i1÷>WæX”s2M®´MŸ+3¾r¬Ì½¦ŒWZfã2ç–g-¤ÅF^Pæ*Wñ”2cÐÞ¼ÊÒÒÞ(ó¾ôu”64âž´]UNHÛÖî™´O¿^$íú>´‹å*ó|öCÚåQÊ\7®ý«ÌÝ·[.eÞ ÿwÒF¸¶(óV>/mÐÐÓÒ^œ¹#­Åâõʼ˳-“Ö`ÊeîKŽJ˽é²2ÏÝòiÒUþT™wÙŒÝÒ–t.¢ÌssÎ eÞ¤±¥¤ šU_ZâòüÒžpJk”Ø]Y± Д<®ØCšâJfî @Sü°3ChJÍ[ñMisâOД跻<MI³b[УÛïD½¼Ø€¦Ðû9¾ )ìË©…hŠ)T¯MEí>@Sx©‡ÐT¸Cm7MΗÓ{+3V‡/R–¶à‡½Ê½ÖåRæj”eª´?s'*s–úÕ«ÌÈ|ò­²d÷þ#4¥\q| @“{Ø¥óÊ<‡*3ÖÿÑV™«ö®ñÊ<]ªN•¶½y%e®ûß5TæîüQveiSN Éù"¹ž2cÊßIÊÒ†_è¡ÌQÛÿeq‘·WÐÿ<ßuš"®ÔÜ@SÔØ„4%®Ë™ @S±‘¿m ©ÈàÛh*:.6?M[fÉ ì-zëwÀÞrüqq°·,ö–§XD+`o¹>^SØ[–A£f{ NìÙ ØÜ¹ñ€½e®tØÝÖM7€½eª~~ °¹5·{ó»óU*°¹âMÒ€ÍùWhì-׌E•€½å^p?°· Þ1ÀÞ¿»›ì-oÏÇw€½…Ì­3Ø[àÇÀÞ‚Æt© ìÍ/¸À;`s~» Ù ì.°6°»†þÀîÞnvÐØ]`S`oi×¾:@Sjµ²÷hr\nÝ\Ú–ÝIÊœ[¿j&-æPEeŽY·¢hJ+Û€¦ÄOkü @SÚâ;4¥\¬ðM®j=(3ÿvZ™{KÇÛÒ²G¬Pæü6=TZäí¹Ê\åC(3¾¾éUæÙq©¾4Wù`eÞÔü÷”yî;ö)sϪ1X™ëÅäÊ<ƒ¿ Ræ~?q2ÇéˆqÒæÞœ¡Ì¹ºÝYi…:\Pæèðíš\Iëü•Ÿ ߦÌÝæŸe®ßµR朻±±´\[)s» eFɾó”Å5íU€¦˜äÎyh*öõÃ’4%Ìì@Sä‹}µh ÿ±ÈO4Åú¯0MEêôú€¦´´a…hJI컀&ǹeDå‘€¦¤…LjŠß•y/M©Së? )¹íhò<ño(íE¾fÊÜW>X¥Ì“rm¢´C¤è?NZËs ¥µë²R™«ØÃÒ¾Ûû±2gö Ǥ}[&—2wJ¡@ic>üY™Ñø‡?¥=s¿U托rR™{Ñ„óÊ<n‡J þåCeî»_)s ”Y™{Yï¶ÒÜÙ;JÛöÉii?Ü}­ÌÕnPi{sgUæ^º=XZWg}e®wÑ㕹ƒënV–Ò~é74¥ @SÜØ®]hJXö< €&ǤÌ!4#3ç•v7àKeŽœÍ”93ÝøBYÒë«Д<óeišŒcÍK+T1I™ëÛÉù¥%娤ÌÙûÜbeŽ¿^mSfL:ØF™ó¯ø…ÊÜ¡3—(sméÙVÚ‹âk¤í¬»UZúµ•?ïÈ¥Ì5¤UCiÎÕã”96ÅД¶êhNšŒF“+sþ´)]™ñkƒ/¥M¹“_™³i‚[™ãn\ˆ2#µ—G™óÀŠ©Ê\¡}ßHKìsC™sÔëo¤=þò2WTÅÒ²Ô<­ÌˆY7PZ¹€KÊRËœ@SÚüuKh2îf» mOL9iu¿?&­Å¤ÍûEZ{ÿ'Òºo¹$mІfÊãɹ©üAe†ÉÊ] ]‘ö·³¸²Bû ©ÀG+†Ð™¼6€¦ðäK•h Éä ì­èêKehŠ^6 €¦ÄKJП/ü>M;Π)ì¿+h*šT3€¦è&}«ДûÍ«üÀÞr,Ùû°·B=/­ ©€ûf[š"Ö´Ý@S¡kPT™³o¡ŠÊŒ¸Žë¥µ\U_™óa™ÍÊŒþ'H+Unˆ²´–+Rh*Ö}MŽžßhJ‰½ž@SÔ¯Î24…e< @SLÒw]h*V}<Mù®­ö;¸àDš"‹—o@Süîj·hŠî¹4€¦#»{‹h’cMQk#×Д?eã\š L~º€¦˜¬[¦Ð;t\ešBJÐ~v^gš‚ï¿Øì-GÑQ€½Å_þ#M‰7›l )rþ‡h*Ò§[ šŠÝmU€¦”7ÏêÐ[gÉeš’6&î )ßݯ{‹ZòðMñùß^þ£~4Åôè @“_Þx'°·€å[÷{óó+z Ø\¾;€½eÛÛî-°·‚5Â> )*aíW4åwt¬ @SáFgºÐ”¹vÖ±ÀÞò¯Z ìͱ³ØzeÎïù”¥ýÒ`†2gÚ¡mÊŒ›ÝÒ$—ñ´›´ñß\R–æÛz€&ç¶™=•ómWæôä Ì(s­€4ÿ?ß+s9*+3ê½^ªÌ9&®Ž²ÔwµJÐdLü=‡4¿i¤­Jº%íÃê•9:Wû€¦”,«¶Ð䘹9P™óUí;ÊÒî­OTæý°¦²¤vДváß®4ËŸ”6§Ê'ÒÆv>-íà…õÊœ?r+sŒ¹I™Qü÷•9C•õf|)íÚq‡´Ü…Jûår_i“ÂB”9' ]¡Ì8Qq‡´€€…Êä~@SÌ·¿¹h*öjßjšbß]ø€¦ÂFu ©Àœ.ShŠ=<€¦BF )åÀ…hJ þ€¦´+. ))kßÂ4EÏ] €¦°²?/ )fQ•z4Žûý1Mñ/= )u@ýdšbg®«@SJÀ¡49w$¿Vfì3V™³õº,ÊŒ%¹)sÔ™®Ìhšç¸2Wè¦ÊŒÃ(sN›«ÌØh¢2Çô ‡”åKœU披qC™ñ[‡*Ê\±Cü¤Å|§,fúÌ24ë¸õgšŠ$E. )Éùo MŽ˜§ã•Ù¶nP–¶êÍEeνoû*s…w˜-­v®$iÙ6‘öÕ”'ʾ5h2~ß°P™kL‹ eÆÑß¿VæšÚ©Š2Ǥö h*v({šœ¯?Ù¥ÌÑì7ÊŒš“Õ9þˆ¿¨,¥y‰Q4ÅÎöK )2oÙZ4Å÷r‡Ðõ²D}šŒù}Þ)s6Û™ªÌxœµ†2çöV/”¥~{åM®ÄPiFþ}×”¹ÚîÙ¤Ìh;a‹²´ )a4%F¾@S‘gOД4{ælšŠ6žU€¦Ìßänì-àßæ×€½en·j'°·Lž!÷€½ù¥›lÎïu°9ßÀæüÃz{Ë<»M`o™Ú•Ø[¶geÊ{ zùþ_`oþ¾š{ó Š<lnƇM€Íùÿ½ Øœ_Ο€Ýù?v—ã'`wþ;€ÝùvçŸ ìÎo5°½ÓÀv°Ø]¡€Ýe vç÷°½;Àî²|ì.G`oÁ½ë×ö´·Ü1`oYœ8ì-ÓÈøúÀÞ–ÿÐØ›_æZþÀÞüOœ©ìÍ/ìïSÀÞrù°2°· á‘ÁÀÞr=•ì-[µ¯N{ Ès¯/°7¿œ{w{Ë|î³îÀÞ2Õ ì ìÍÏ/)°»À¿€Ý=ºì.c4°»À£Àîrv×v>°¹LcO›óKŸì.û`oþÏbn›{Wv°7?¿šù€Íöì-àÛqù€½vú°7?¿àþÀæÊ~lÎ/p°¹€¼¥€½e:¹Ø\žì#ó{Ë4úß[ÀÞrf¿yØ›Ÿ_¦ÙÀæ2í| lÎ/|°9ÿÛ¯€½M8Ö Ø[¢€½•ÌUØ[¾Ø³{‹ºš± €¦Äe1÷hŠt”/@SÂãV/hJ›rãMÆ¢ù;”¹f,TfôvUPæšzí½²´Y/§Ðd”~Ð[™kìœ@eFÁ7Ë•¹|°KYáô–hŠŸ÷äMaŽ]ÍhŠ=YÒ€¦´¥í§Ðdä?¿J™«uHeFµ•-”¹ªÆ¯W––gPšŒù®)s•*°@™qûÉ9e®O^•6óâ"eÆúR)Ê\û"ç+3Þ·?¡Ì±­q2M®‡Ý?V¼qYeîÀ2畹†wTæ|÷ôŠ2Gûnµ”¥'ÞPæ8´KY±'¯GÐûó€14¥„þ@S¼ãqVšÜyî.Sæú¶ûbeîÐ7µ”¹ž_«Ì]hš2gØþÜÊŒƒÒ•9?û¾2wDØ§Ò …”’~÷¹´â«?WæÊ~g­2çÒïï)sU.UZ™ó^ŽŸ”¥j?€¦„öu¿ )õ¿£khJü¦_š ÍS€¦˜míãh ]³ï7š¢VË@SÊ©Uhrùm­)mã¢^ÊŒ[é+•¹ Ls*KŽr É˜Qå°2wó~ÊŒèÊÜ}^Ç(‹(X%€¦"a4E¹£ÇÐç_¿2MI ¶ß É9¾ç eîæF(s\k¾I™;ÔySYbȃ)49ŠVæÚÖHYÚWG÷*s9¾ì¡Ì]è—+ÒšœýRZøæÒºŸv*s,]R™Qøiwe®m¹þSf4èvH™»ÄÚ–Ò†~|[Ú„ù¥ó·2×óÜK•ã&Sæ.8áŠ2c—ßveißô )éóe×hrÔZÒ€¦bî°Y4¹_œ?-mZŸIÊ<žÊÅ•¹W=Ø)-ãt²2ãUåÓÊÜMÇŒU折9W™çÃRg”¹ï~á§ÌSåòziÆ«·ÊܽvœUæªÒ!D™{´Ÿ4×—]ó*sÿ¾9MÅžMì@“óòÇM•9âJ,Pfd:}C™ãã%•%-’€&?ÿÉ〽ù‡î öæw®Ri`oAk›wöxpÊE`o9çß,ì-ÇîåÅ€½h’s*°7¿ƒ€Íæ­ö°·àQ®{Ë1*ã>°·,“/8€½å™ºØ[HýãM€½E¶¨Ý€¦ØêC.Ð6dé,𢝠@Td|Ù•4%ÔØU€¦°ë±YhŠÛQ*€¦äÝhrÌtœ )m`—‹49JO9 @SÁ'åþ )&Ì“€¦è¦³ïГPÁ€¦ÔüC—ÐäŠk:J™1eÉgÊ\­ýê)s®¡,iwX8MÆØ‘þÊQæ.í¼©ÌS¥Ùeî/¿Wfô¹qJ™3×Ú•ƒüS”9ÃN)K¹?d?MF߇‡”9£URfôVZ™3âF3e©Eòþ@SÑ¥W¼4»Yu:M‘Ë{ДðòHMšR´ø€¦´ßfôSæÚ–³¥²´É1iÊŒ£Ã*(sL:ÓE™+æì^e©-\‡•ŽNû•¹Æj©ÌXx¸·2÷«ù£”yfz–*K*ñ€¦”ç\šæ^@SZ¦„^4¥–ùu-M®AëF(ólîpA™±øÖeîé:J 9A™glÿ÷ÊŒ¨¸ZÊÜÇ:*ófɧÌS»Ü:i-¿Û/í÷€iï*—6̧­n|AeÞÂÕK)ó„Ÿü@™»ÿƒEÊ<™úG+s7 óH[ž~R™çÞ¥ÑÊÜÃkWæi¿¡ª´N¿­Væ.ìî¯Ì3òŸ¹ÊÜA›(3&”_®ÌR²¢2ãû>o•9Ã_ÏW–šRµMÆ™ÏÒ•9?É›G™±àæ|eÎAý¶+Kù¯U^š¼îIʪ!¶æ™)ŸakÙtÌR py„­Åæ);[zó«@ØZvìò¸S~ÂÖâ’ ó€À]7¢'¸WŸî²s¿÷Ñ'€À:éz p}î>\Óß:akþó+€À]ýÞ, l-ç6?ܺ‚y@ØZ¼øè/@ØZ6Îy[«¦×Ž×¾²[Ë~+{;vå¾@ØšuÛ l-š=akÞç»" pí'´ÂÖb߃.wÁN€°5ßõÏb p'¼p¶s†5W÷øÙ@àÚíý8¶æÓjª€À]QÒ\ýœÍ@Øšm Ä©Wƒ½ZqêÙ°êH N¥%_ÍâÔ{îSGqÚyÙ–m@œºçm¨âÔ»þÐR N½êV=Ä©buÓ©QÛÿ™cVùäΗDmöãE1+ÿàŒ?£¶ïoKcV¹û1[bVñÏwícVÕ¨¬eÌ*·Î9&fU$ÿDm§ƒŠcVùN½C£vÿòá1«j0}kÌ*×]ûlÌÊ^ý¡CÔîØ,f³ëWF­MéÀ˜•Õ9¸cÌúޱꎘ•_ºw÷˜•mÝÿœ˜U^1ðá¨íV÷¢¨=µWƒ¨Ý3ø÷¨Õ}rÌ*æ\23f•W?2*jÇ|õ{̪.yïç¨M>¯Ì*·Îù&fU ~{3ëݨݞ¹;fU;ìrnÔZ÷½5f•ßÕ"jK¯œ³ŠŠŠaQ»þŸ>1«ü´ææ˜U5í|yÌ*~ÿeJÌ*÷hÝ>f}÷\º$f}¾yðÿbVvÜ‘OǬïoërcÖ烟—qªh»Ã‡1+¿ø±]cVÙuãÁ1«ø`Ú¥1+[Ø‹Quמ1«8ó‚‰1+ßòÂÖ˜•þpäm@¤Æv؈Sß7Þ¬ŠÚ‰7}³ò½ÊYÙ’¿ŸˆYßFŬϜÖ7Ǭ,ÿ™M1ë{Ó÷ïÆ¬rÆù¯Fí¨Mk¢öÃë £öÔo»E­Ï÷ÏĬâÏf‹bVyãßÇFmâUŬj‡æ ¢Öãññ1«\p⸨}3íܘUué1.jÍ7^µN«NÚÈOÚǬâ¶{D­Ï)ÓcVY¹(/jõWœ³òÛîµF'-‹YÅò¢íQ;páø˜U~8zVÔní:4fU‡ÿwSÔ¸ð®˜UzfNÔro¸0fU}^³ÊºŸ³’»øˆSñ9ŸÄ©S×E'qê°müž@œŠžÝö©ßÄ©dõ•çq*Þã•¿€8íÔqü N?ð N=®]8ˆS÷—·LâÔ颖qêØì…•@œvº÷ÿîâÔ%ùóB N…=†oâTÐkùf NEçW—q*œýôQ@œò«§? „­äŽzGq*ú£y+ Nn8ë; N6©Ä©ð§†q*ø¨ä N%ûÏâT4éÑú@œz?ô˯@œz-¯ìÄ©Ï{7âTºi|§ž½;-â´sÿ'q*ÝmÓ@œz÷­¬Ä©ì°5“bÖ÷ù»êĬü£º‡FmЛ/Ŭï¨zÝbÖçóš÷bVvó‰CcÖ÷Ÿ‚Á1«xvz“¨6m§˜UÞ=óĨíñý}1«¨÷ö昕ŸvñÏ1«øaÅ7Q»ò¨õyüƒã€Hívf7 NeÏþtMÔÚW³Šü«&ǬüêŠ_bÖ÷ò©G­ÅòÆ1+ûvȆ¨e¾³~_ÿ2§.{ÿ8ˆSÏÙKNâ´ó¤u³8u:·Ý< Nf¯_ Äi§»ˆS—Ž­âTºø×¿8õ>ga3 N}¾øã RW|q$§ž‹§Ìâ´ó-žâTº.ï< N½§4ˆSÓ–lÂÖdE×=€°5»êJ lMž}y ¶ÆOý9¸Öç¶W“û8¶FMîý[‹;; [³ŽMÂÖzeÛ @ØZ¬˜Ù[ã:\„­áöºakúYîb l{ÞÒ[£C¦NÂÖpéÄ«€ÀÕ?» [ƒÒœ€°5ìyJ¶ïnJ€°Õ¿îŽ)@àŠ»¯ÂÖ`¯F{a«Ÿóí£@جùd4¶z›Ÿ ®ã‰€°Õ=sÉT pû=™a«sdó9@ØÚMì“„­ÍˆÿÛ„-ÿÎêÕ@œòÚc§Â>wÄ)ÿÏ[3@œr[Ýt4¶–MKßÂÖôþNÝ€°µYóê#@ØZîzã+@ØŠ×ìr§Â‡K:qêT°© §ÍšNâT°ëAu8å}Þ³ §âÒkvâTð]éH N;ÝQïF Nÿ³© §ž3V¶â´s½:qÚáòúÇqj?æ›S€8íTté÷@œ:7úm2§ÜK×>„-§ïoa+:óȱ@œ /îÄ©ã“Ï¿ Ä©äêG¾â”7í’½€°5Z|ÄZ l êŒx [Ó§æoÂÖèÀŸNÂV÷Î1Wa«3ìÎý€°Õߥñ< lu~»õ+ l-]½[Óµ;ö–³úþÕ@ØZÕ;£%¶FUÍêa«? âB lÍ’'‡ak\ÿŒ&@ØZ¿}o+ l­¶¾{2¶œãWî„­íâKþÂÖì±%'ÛRÚ[Ûvß·ÂÖê–ŽK€°å,~å( líÞ¬2¶œ+v=[»Ež–׷ùM@àýý¸'ö¹[þêeq*hÚ÷ R vþ ˆÔüÉqjþÑûak¸fð^@ØZ]þM{ l-Ÿëy¶z¯^|.¶ú»^÷2¶ºõ>[âoGak{äË?U}¶ü÷g·"ÕáÌ N?ýr8©µ½ÇqÊ»æôC€°µøúã?€°Õ™öVc l¹å„­åÅ÷í „-¯É^Ç;üû€°åW>ó>¸ŽÄ© ÇÐs€HÕ¿í RÜ[Ä)oí…ûaËÿ´ú3 Nÿí³ˆTþÈ H-±©+íDê½ECHm^ý§Â=·Ï"µã”[Hùú]@¤–œ²ˆSQ£}fqÊ»Í| lùÏNèÄ©`÷»qÊydW RolîÄ)÷êÖaË»®Á lÏ~2 ˆSauÙu@œ FŸu#©§ònâT¸àÓ±@œŠô|ˆSa¯+ Rs,â”ÙˆÖ@Ø .?c©ß6œÄ)ÿ›·ßâT0½r4§ÂýöüˆÔþœDêÀ{‘úᨿH-šÿ ©Ò3âT4¢O5©ÃÏùˆSásëzq*êÛ;ˆÔÞƒ"uÇeבZ¼å! NŽ˜Dª¸h©7:îÄ©àòm7qÊ_¹_; NE£Ö/"µËµs8åÍü¸=§Üï®ø ˆSáocï"µç”ž@œŠ?ød N%;u½ ˆÔÜ#Ë8µï6m1§’’—^âT|ÃÏ8µßåË8•|5éu NEl:ˆÔ²Š‹8þqÚg@œŠ&üø)§âþm®âTÒ²qW NÅ9ÿ6"µùƒ€8Nþáh NEÍ®þˆSaÑ;‘ZöÍY@œŠýû NÅ3| ˆSÑ~»^Ä©¸ñ¤5@œJ>oø,§ö÷xˆSɃOôâÔ~Ì×o‘z C>© ?îDjÁ‘³H]:ú/ N%£Jî"õåUe@œŠï¿5ˆSÉ€6qj_6è^ R;~ü§’Yço"uI—b Nõ뎿[½C?Ü„­Î‰Ÿ¯ÂÖp‡ÂÖ`Á[›€°5ŸõÒP l-¿%[›s¶MÂÖøž¯J€°µºí‹@Øræu„-¯õÆÍ@ØÚ÷Õx líþ:ê\ ly­|Ü•WakÝìœ @ØÚÜüR l9¿µÙ„­íYï „-§i«£€°µù£z¶¶}öé„-ç³)¿aË­[ô2¶vËzaËkÑ}¶Ü}_z[»Æ'=„­íÌ®Çakwr·I@ØÚ®mw?¶¼‡–Oâ”ÿîg½€8¶üõO R‡tjÄ©`êQ7‘º¦÷·@œ 'üDªKák@œŠÞøù4 R{u{ˆSIIõ@ NÅu§q*üqÄP R'n~ˆSÑŒU_q*ü§äp NûöøˆTµSH-jþ ©n“ÿâ”Þæ»€°¼Qp©Ý7Ä©ðÒÿ"ÕyT+ Nùï É‘üÞþ@œ ^l9ˆÔ.þâTòò;q*þèë—€8•l;þw R¹/uâTÜâÓ NE3;}Ä©¸:¯ˆSÑŠ§þâT²´´3§âßß] Ä©¤c£¦@œŠçœ\ˆÔÎ fq*Zxå` NÅ^ÝÄ©hÖ†é@¤ÊŸÜ Dªnù R—œu&©ƒËoâTxï÷‘*?x(§¢ÜÏwâT¸èÌV@œŠNû¹©=«F‘êsç‹@œ ÿ8àU NE-ׯâT¸²Óy@¤þ»ö! RÓ×Ä)¯úäó€°åvV_ lyÏð4¶Ü×*÷ÂÖîøßÂÖöõ†akwÓ¬/€°µ]²èd l÷·}ˆÔèå;q*ÜuÙ@¤­;ˆSþ—Û€H lr$§‚[‡ï Dªùg{q*œ>ðK R£<ˆÔ„QÇ‘vèÕ@œ ~ùp9©szˆÔÖßû‘ºñï¹@œò¾úy¶Ü««ÂVÐ~n[ Nùÿ{1§‚ã^¾ ˆT³ó®â”ßú®@ØÚwø£@Ør/ªø[»~s;aËÑz¶¼‡û [þЇFq*ØïçÝ8åßqïŽ@œ ŠÖôâ”7§Ã™@Øòk ïÂÖ®¸Á[@à¾ýâ lmoz\»‚Ý6aË=oñ›@àþûþ_@ØÚí5©¸1Ës€°|˜Ü Ä©pôõ÷q*8÷ü³H=5òm N…/>±ˆSÑQ?Ä©pÇvy@¤n›w§ü«¾„­àà)ã€H=3g NùÓÞ܈Ôg÷ŸÄ©¸î —H}ÒA@œŠv<ï RWô§âûÿDjÑÎ÷q*z¸ÃY@¤ý7ˆSaùKC€H]}Ó‰@œ v]3ˆÔü·q*\}ÓE@¤ÖŽ<ˆSÁÇ}Ä©°é•Û€8å~|ç$ lymø[»+_: [nûSÖaËxäi@Ø Z½:ˆTÍ£y@œòûßò%©q»Ü Ä)wÉãõ€°åÕ_Ú[Î&ûàÆ^@ØÚ¸çzÌÂÖúƒWò€À=vËÍ@ØZm˜q¸'o›„­õÜ{{[´â" l­Ÿî©WÿÂÖ¶Sɯ@à–üô0¶œ‚m­€À]=&[»Òº—»þš“€°å|½a2¶¶..ÂÖ¦îC[€À}]/ l­[-z ÜAåÿakóàÈU@ØrêÝs ¶ÖsÎnnu^¶âã^¿ ˆT‹æ€8ݲ˓@¤&79ˆÔã?-"5}iG R‡¯}ˆÔ¨î8®¹ü RÏ\±ˆTþ/÷‘jÝw(©7.œDêƒ:£€Hå·iDª´þã@œŠòz= Ä©ðªEûq*j0¶§ÂÓçÜDªwËí@¤òþ] Ä©àÃ+HÍýç N…+æ^ D꤭÷‘úêÙ@¤†÷Ä©àïš‘:þ¸8æUÄ©`ÆKsHn°ˆTòé-@œò§Þ DjÂÂb N®þˆÔ¹-_â”Æè¯H=Q¹ˆSÞ蛀À]>¢¶‚Ç:æ‘ú÷«€Hu/}ˆÔ”o·‘úá£+H]úÜr R0ˆÔn«7qÊïqÇu@àÖwDj{é@¤†¿û ©k;ˆSaÞ­gq*øå§“€H]ÛòX Rã'^DjqÍé@¤.ö©75"•<ú)§üËÎ)7cÎ@Ø Žû·©·L"ÕéëÎ@œò×,| ˆÔ ³·×¨×€À 8Ü5…E@Øòvþ¾¶ü¯¯"5éÞ Rsæ,"U=u8§¼Ž'®Wyå³@èZ½„­ÝÛÝ €°å¶Z¿\ÃEu€ÀÕ›|!¶¶7\ÒÜ–;þ–;ïÁ¾@ØòÎyì líZ÷-÷q›€°åS~¸'Ÿì„­MÙ­ €À½³ÓJ l9 \ „­íáo7ÂÖfZ÷Õ@àÖw?[ÞCglwÔ‹·a˽½á¡@à—nÂÖƒ€°µqËÞ@Ør[6;[ÎüÂ]€°µëxßµ@ັ¶œ«Ü„­íˆžË€°µ»aÉ­@Ør~÷¶¶—Ý1[ÎÆ Fa«Ûç ^@à.ÚZ ®já>@à^žþ9¸ÕÏ ÷Öüí@ØêÍûöm p¿ý[ݳ,ÂV¯óšþ@àš,[îâK[a«?}Õ" l J?Þ\›µ€°5W¾3¶º ޽ÜĪ+€°Õ{âße@àNŸÙ[Ý[JÎÂVoY—I@à&ïµ[ýÒ®×akÐéÚn@Øê?uÍ, l oûµ;¸¡¾„­þ ïmÂÖ É¿[ßl*¶†õ&•a«÷Ö†€°Õ/ýà< p­™„­Aæš“€ÀíÑb¶Fû º [ƒYÓª€°5Z5ák l [û=¸}îÎÂÖ¨æŽm@à¦Ïz[Ã?:[£emz»jÓ@ p.» [ã¦akôèž÷akRPµ#¸ÒQ£€°5*ïQ®øÅ?€°5¾ïØ€ÀôÂz lM>­š„­éœW+ýt_ lÍ®žÙ[Óê†'akòÀ{ak6§G!¸f#¿ÂÖð̦ak~ÏýOakXÖ¿#¶f¦åaË­_¶[Éȱ5@œ:íðd§âe§>Äi‡‹žœ Ä©íõûÜ„­è‡¡]8u\ñîf N…ÿþõ§o½» ˆSà o „­É‚ÓÇakT·M# lMvËÝ[›aÃÆa+ø¤Á8 NíWOlÄ)áqwq*¹lÇÅ@œZ^zù ly#šâTœ÷íJ Ní^>þX N…³ï½ ˆÓNßÄ©Wý÷âÔuZÉ N=–Ä©ïÝóYEõ»ßƬoÓSWƬü®sÖŬ*sZ÷˜UŸðëˆÚ¨Éï}pmTWvþªV¾Ü°°6*_ü鞘UËm³>‡ÎŸ³òæO.‰Yé]÷‹YÙQï}³Ê=î.ˆYÕÆǬbõà˜U]²á˜u¹ôìË8í<á¡?€8u>çŸ-@œºïüð“@œJ·•Ä©b§ö‹YUÛ+&ƬüÒýÞŽYåõŸ³ÞGT?Ä©ì¥9ÍbVÙtâ½1+kùjŸ˜UŒÿéĘռ<õ±ÚÈŒíÙ"åÖµëRßš6{ÑÔl5sçæÕF¦Çôa)Ó¾¸<%ïǯS&œðgʇg<˜-i:~E¶Ì+=vÉ–Ôû|dʯ~Òû¸×SJŽy>¥W^Ù2.x/å÷³ÏK¹·õÜ”¯k>Ë–ä—î²óW¥´|UÊNwÿ˜­fâÔ³j#Ó~QÇÚ¨)ÛïäZùáÑ¢ÚÈÌ[‘¶vèÃ)³[™òâº/²%M—þž²ã¤e)õ.Ú˜Ò~ï±Ù2çýçÏ”‡XŸrô/¦,Úxmʯ§~Ÿ-É?ì…l™?\–-iý߯)½›/Hé8-?¥ÏÅw¦t=à´”F·e˼3ù¤lI«¥EÙ2wÜž-éûsEJû§”í»{J鯥äþS¶Ì¯ßï–-épùù)õ_Ý’-sÓ^û¦Œüá”Å/>rÌ»ßf«yá’Ëj#óH‹gR.ª³"å•_g¦Ì^Ö#¥ñ¥ój#é;§^JÙíÿ¦”>Ô*¥bÙa)]›•ÒbR£”Ïæ¦ä>87¥ç“¤TÞrlJ·Gú¥Tî_“Ògv³”ö–§Tì÷bJ—;Ï–Y·÷”…ǯHÙºù†”å Ö§Œ½{ç”z÷½•rú[¤–|˜-©;¨g¶Ìsã÷Ï–4;âÞl™?!劲oRÊÚvM™[ü}ÊwvËVSÛ¦Zyðº¿k£úù#ÔFÍe[O«ÌÈkM¹ñµñ)}—¼š2cè+)kÞ-Í–4w}¶Ì3×gKê\0 [¦èþ'RN[·9¥á²)c~;;åº#S~hsYÊmŸšòéØÛ²U_÷ñ²Ú¨qúµQ}äQ¯×FMN‡j#ÓtyïZ™=lߔ׺‘rÁScRùè„l5¯}¹62ã^?"eñ³SRvýö¯”{nÌ–ìø@QJùû}RJß7¥o÷Á)ÕIŸÿÍÒ¤ú¡“ªÌ Im¤To¼2©>ý®¤ú铚#¿Mú5%%÷—3Szí]˜ÒrÊà”n‡¶N©ÞkJRó縤jÆ”$³ËqIåò“ÒNkŸd’×’Š&}“š×'™Iß$Uu&I×Ç“êW†$íú¬Ê–ùfÉ lIÉe×gËüÛ´_ÊÒæ#RƯy?eõÇŸ¥Lí˜lI—þÓRšÜ4%¥g§&)9ÞÍ–yç°½R®ß|wʦÑ÷¥,î~i¶¤áñ7¦t·:[fÛŒmÙ’¢óI©øf\JrÙâ$3|U’Ì90INüßNWsoJ2âפ_2<ÉÜUšô[ö[æ«]þÉ–ä¼Õ4[æÝãÎÈ–4=oZJÏ}nJ©ùOï¤ß[$Շܙô»ñǤëžÏ§T®x9éWüу“$wqRÖêä”âGV¤Ô\ð¿(³=IrÖ$ïK:oY’-óç‰Å)õg¶¤qé{Ù2oŒ»0[Òoß+’ênS’þ™+“L÷š¤ç¾¥ôîñ$YócÒÿ·Iÿ§$e6Li³é¢l™ ›7fKŠKË–ù}ÙÊlÕï^Þ²6ªæmÔì0ü÷Ú¨®»mymT\·:7f5»o©ê1™k£æžEcj£zÉÝj£òÂégƬô!oqªÙrÛѵÒàü7k#ÓeêùµQ3êæšÚ¨Ú¿Ñ˜˜e.øýë”N}ç¥\óæ+)ýïß#[Í žZ™;ïœrpI»”‡þ¼>eê©»e«YûñÒڨ$få}î½>f¥5ü%fÕÃòcÖgã'§Å¬úØo‰YÍõŸ-¨L¯QƒS.ÝgiJ»óR&¾rJ¶š»ÔÔF&ÿÙçj£ºÎÜ«bVSøs»Zù¤(SÕò\mÔÜ:ì¾ÚÈ<=ºm¶¤ÎÝçfËü÷ ³R¾Ÿõo¶¤Ãî#S*þÿO8KÞø{RJožž-3ï£ö)·:8åÊöR^øT¶¤Å[Ϧt¿hKJýû&¦tû\JÿW?JtÝœôßµ:ðÜŽI楓²õ¯$ýfNL*—7IúuO2°á¸$éø~2à«ó’þ¿æ%5U/&ë”$ÇÎL:¿}ZJ£¾íSzÞvLJ›Q¹)5ÿž ˜ðERuÕ;IÿY·&hšôï?"¸½8ðà±Iۧ’~ûŽJúÞ~w’y¨k2ðÛc“o¿ ü¿]’AWµLÊOø9¥è§™)ÉŸÿIÊoª“ôß00©ºî±¤ó¯fËœ¾lTÊŠ oO9`Jqʪ³S~éþu¶¤pà>Ù2ŸåÏÍ–´>òîl™šWÖ§\µ´EJû7OK™ºïß)¯Î¯Ÿ-iøMÏl™‡{vJù£]£lIYÿoRÌ,ôeϤÿ1''ƒÖ~’ô¬vJòâüdÐø©IÍåÉÀkþNž´5É ú_îõ³“~³k’^í/J|ÈùÉ€K–'ƒW=’ *ú7©¨˜ÒyÑ)USïOØ6)¥2é·ªER<úó”ŠÃS/û&¼çKÉàaã’!‡%ý;žTLü_Ïv~8©¾lM2hb‡dÈ9ÿ‹{½— 9st2è©‹“dÏíÉà?öKú¯ü£jÎçǬzþ÷×FÍ#:ÔFõ±~Y5Å'¿]Uç³ê£vx'f™Ž ª•;wn“òÅ”ê”Ù߯MyãènÙj6¼tjmdνz\Ê#{ÕI9ä­u)wýçûlIN—[Rz½w[JãÃ~Hé:`RJÿ[’!õoI’‹ÎIï<7òâÉÀ'Z&C{ÍLÛ!©)œ ܘ“Tî{2 s~2´Ë”dÈÜû“!ÿ=':á«ÌŸû˜-)¹ùÈl™/û¾-iÛáñ”ÊykR¿¶4úê½É  ¾L†®¾9éýGÔ/<— ž›ô[t{2äÀ=k¼ÿ]mdúÿðkÊ5Ÿ–²CÑØ”óY—­æÐ%ç×F¦ãÜ kåÍ+^Ë–4©35[æ‘/û§üùý®Ù’ÚMNÉì8'ôwuR5à}P}MÒ¾ÃÌ”²?NOú7ؘ”ñi’™45s×£§¦|¹kaÊ5§žòfáºlIÛ=禔N¸"¥ñû3Rv*íš-óꔼ”«^î’òÙìe) ï¹'¥pÝ¿µòë/_¥¬üïÇÙ’†wŸ-óòÝפœ±µUJÁ€á)3ßZ“RQ8?[MÍw¿ÔFuÁ«×FÍÌ©§ÕFõÅe[j#i“7![fýÈS³%Åí†dËü:ô ”ÛšW§ìÛý‡”ç¯J™Í–4jrh¶ÌËc§eKoëšô;á‹dhen2à£qIïç¤ ÝÞ.ôuãdØa “!3ç$™Î‡$¥ÍoMúm›•”ý01É©S¶Ìú×gKJ.|9[æ÷ú•)§½ûlJîÔ“R®üs|JÙ_²Õ\~ñ¦ÚÈÜÖô±”}Α²rÂä”Ó{­æõŸï«dØns’¡Oÿß­P™ »li2pÒîIÕ´Éà©×%™UÏ$Cž/O†}¸g2ø°»’a«ê%C “þ³Çý¯îwÍöÏ“¼’ÒhÛµ)¥¿]šÒ¶GUÊÀég'Ã:ôrb2´ðÝdx²dHÃÉðÝ6'Cç%™9?$ƒç/Hª.Þ;xÿgÉð¼!ɰ'¾H†MÚ˜ Ÿøn’Œ-OúŒÞ+Ðý餢úŒ¤ý믦 ºvrRýüɫʒä·“nwLÈ–yåƒRfåoLÙPgxÊÂ;ÎHÉôB­l;÷¿)]22[ÒdÂqÙ2¯Ÿ¹$åÿN<%¥àê•)WgöM©ú¼a¶êÖw‹YEÙçcbVSž{MmTçœ9¾6jfí¹ª6ª/Óº6* 8 f;øä N;ý”߈S§®ïâÔõŽÿäqê¹lê@œú.»%få+o‰YŸ3;UĬlû’z1ë‘¿á\ N}¦ÝZˆSÇu^âÔe÷ÛOâÔáì·qÚqÓ–-@œºß8ô9 N½ï~ðe NÝv¸ê; N=W4 ˆSå]7¬YÕ½³Ê¼wÞˆYÕŒ6çŬ&¯ls­¬ŸüYmT¿úÆeµQs˨sk#sΊ÷RVýúEÊAæ¥Üyè)Û~¬Î–”|ôa¶Ì•fKr–vÉ–ÉpRÊÕ+z§Ï•rÖ¾Jy=ou¶¤ÑºŸ²ešquÊï‡ÍV=kÕ;µQ³÷¤‹j£z·¯û×FMÓ7ZÖF¦pêuµ²ð†×S>[ðTÊÌeÍS^žùK¶šwNÿ®62§V”²üžº)£oÞ’2ÿ¼’lÿ×¹~̪r¯Ý=fåŽ[³ÊëOX³êþó/YÍUƒ/«Lïã§Ì8ûø”ÖëMÿݯÙjú·êT™w«ªgOè³êŸ>©6jž8òÇÚ¨^X:£6j¦N¸¤6’ò¶§&ýÇ^ž”îþu’¹öÀdè¾§&ÃoÛž ^}`2üðC“Òîÿ]»ŠŠê{ߊ4ˆˆ¨(&ÍÌsè°ý*vwv(*&"""X¨ €¶¨Ø¢ ˆ &baüøÿ¯f_ÏÝœçâ³f­s±çÌÞïž÷Ùg6ô/ð9·vAð™P ¾u’à~ö"üZô—õØø] OµøM€oh¤Ѱ¿ø]à¼wl‚¿ ”cžÀ+3.Êá±ë,n¬8,ì·Žhµà/”µ·Âoµ-üºÃ÷øUøW}¯ƒ5¡l¶>áÎpk[>cúÀßì*¼bÎÁ/ξãl üò¼àí↚Y T)_™íR«}U)ÿù.ˆë¬+èýò‡ =5_0/ÒIšõ"0üïªÀQÛNPûüUÊÛͲ‘G Þx{ *7R…ê^÷­Zå ª˜Ý4¶Hx /ï‘URvÁ§Meø·ŸßÍàï4~} Øº^ŸÁ¹N Üÿõ­¨­Oð7ï ß5£á?¦•²Ôu¬*˜û«Jù¨ÜOªêÔ8¥é ¼ÿM¿Ëx–EÃoÉ$´*¸-€oçUÀ’`xo~ ·’8NéÏÕºp•úÂzùDwÊR`g_øŽPÂ}³+Z´ ÐÊš®Jyºü½*­¦Jy¿ä·*ømtWýUðo³>-ÏÁéâÿtsøžn ËzðË)ƒ‡G œÝ6Á+á…Ú0oî£JY2ÙJ=pTžß[•"·ýBu¸>+;¤eýôÅêPxìMW‡‹t»ºœ)—ÜY‡½lZ™)ð©¹A•"êï u(÷_m/±l»à|Ïüû†OY;´š˜/¨6o¹@y¬*Zý® ·§áèv/ ¤çã > EL+xõ5‡¿[Cøy‡Ão½%ü+€SÉm¸ß›»‡QÀàŠ>ï0x'†ßxÎØ×Ú ðÞž¬ðA“Šü¤Ê×÷'ÜׂßðaðüW1NER¡´1B°÷Õg[p°`]‚­ h°‹*˜¾x JycX Uг¡JY¯ÿiÁìä­ú=ÖuŸk!øæ¸WƒG‚‚Ûîª`g±[à9ÿ üêÅÃíª |N‡Mj±@¹k:¼òÂEç<‚âà÷K·"s,‡¿^SøÎ[©{ìÛ…G“zpîV³"›¶‚ßÄ·ð]’ ¿{:ðZ°Š·9Û¥"dž⑎ÀÙÇNPueA‹øVïëàw(žÓáû{|·Ÿ‡Çé1ðð^Å#àîÓ >g6-ƒáõ=~kfUdãnðsÚßÝæÊG™‹ÛN6|Ýl.8²ó› åàùê€n|¹*evJ¢*˜î2S¥|¾&I^4X`ã—`×÷XAODUŠž7«ÃUÖCŠÄ ñêpÝ{d‰:PÿÕ9UÊò„ûªÐ¬a_¡óLUÊ´…ñ‚9Ÿ n› "gŒU‡9‚:5ž Ü.‚cä4x¶ „khhf©Jù¶ómÁ>ɪ }þœ*eÖÑ‚Jí Ô¡0]:CÊÁwºç –רt\¦J1k@©:Ê–_“3çÊݪʙƒEË7ræÔ­N{9séûxšœ¹ö©æª…um/u¸ÖÚÜ@-9ÁÖêp~ç×VÎ\õ¶Ê™½bE]9s\WR,gv]73‡ôUƒäÌyÄÚ5ræq`œœ9e¹4—3—úÉ™â{«^êP†5³\ÜôM0nÐ$ÁÁÙª»ÌR‡²íVATðA£µK®{«B¥˜¥ëø×ª”ï·Ù«B툗]›à‘”‡½ñß‚o‡ ðkùÞw‚á×´ì{ <ï\€ïº6pïº>¦(ïþ²VƒCZª”'wØ ~®¦ M‡; ÐÁ^éWár¥‹®¢Þ•ç[†ªç«Ciœ®EåHCµÜü eÜ)-Á³cu«¿\ù~Aª;m´ì6[P¹LÔ°›™*å”ùå‚äÍóò7¶ü‚ $ÛEê40W¥¼¿³*š x{L¢á“Ô îz Å»¦ß°ð¯\N*·œ.HÏ^® †~©RÞ)+Ì¿øM`ù(T°!m»ÀË=NêL«Jù>êŒ*4l“.¨\é·*å~E¨`Äk¥àü AÈý_ª\÷ök©EðÀIêp µTЦEÖêP6sT°ìhu~ûO‚}¼§ŠÊ-Û öù)xvø¸@{Ä\µD„Ž\ ®"˜RxLpøËXU®ž—–È™bï¿u(;¬®-Øbi!h²¢H°t››*E@Ä?u(-7 Rê«%pÚ_*¨–|FТáçöðÆ&¸·×ÅCð4»e÷'ð²éâ/H~“ày2Švàa™ ¯È.p?ð ^ãüàñ/•;,XlS¥ü`:Pj¥yœ®Cz¿v·¯Aé0žûÆT|_ux €çãÛh=±®Àm¤#sqi6ýÓf‘f3XÑû.i¸/>DDDDDDD¤Ù Ç®²#"""""""ÍfÔ¶Å\"""""""ÒlUcï~$"""""""Íf´Ó»i¶ªÕßä‘f«÷ªq É“õÌ‚ÆD$OOû‘£ÏÒûræê_#_Šz­Õáò§ûWu¸ž'©C9>ç¥`i®Àþ`ÁFÛC‚âc-U¡ÆüEª”7*_P…*6]T)­×·ÌŸm&¨ä¾^г{]AÊbOû­;îrïÿU…æoŠ%pÓŠ‚‹ÿ.àJX;¾8ý´H+·ÂuÖDHWÝ¡tÈBKC 49¸ Ì<Ü] Ç©ž‚Ú6×-ï˜ ê¬4Ê9,P<{ œX—PþÑ…âg1ÓOCy²2œß-óB#²À®Áý¡jÅr]EéœTu(ƒ/œž²K0ôæ‚=ßæ¨RlýPJ·æcAnsýTÁä»×?‚¹¯Ž*å“òšª`¼ªŸ uS¢Í—Š5)„Ëš(v½„Íí[ç1T)/öþ¬ ZÕCU),Šþ¤ ·¾ Z?_%¨¶4PÐÔ¹*çÛ1ëäÌåQÿ‹ræÜ=ꓜ¹ô;¾\ÎnýÕ¡49tO®OfÔT‡"Åõ®:”u\ßÝY°@9WplN¹*TnßG`ù ©*å‡êaªPãGº*eϘe‚í#· Zw8&X1qànǯª kÜC•2ýínÁ—Ï©ª\W¬ß¤Å€soÕáÚH×]ŠJîÞêP64[­–ذ6‚¼6™‚ðn]™WªRÜÔ?¬åØoŸ ö|­lkSrTµ¨±ÆŸˆäÉ.4p™œ9äøÍ“³Ö!¿äÌþIM9kfnÚ‰ˆä©µË[g"’'§ÃË.ə󧲫ræøoî}9s^Tô@Î\õ.;È™bᩪêP:Û×R‡¢NÝ3jy]è«—–­äÌõPH®:k÷tV‡k—¾zêP´0¿­ÇÆË»Ê™SQ3;9sðÔ;%gN£6È™K¥3Ïä̵Iñ9s^û蜹Ÿ‹’³:‘ÇG‘f³ û<…ˆä©Ñ¦>D$O–O·Y‘<5¬¹6Šˆä©¦ûÑDDDDDDD¤Ùê5«³‰ˆä©ÁúOæD$Ou.Œ#"y²2>Ø‘ˆä©i¿ó­‰HžZV{[•ˆäÉ&ûÛ>"’§fö¼""y²ïTôYÎÇׯ"gvÝÚ”3‡ð>årælPv^Î\ô3ÒåÌi°ß'9sÞ,g­ êIDòä¸åÓM9s¶hf"géÕµäÌié«rÖ¸·ñ"’'[âÞD$O K‚]‰HžšŒÜøˆä©å¥ænD$Oö×äÊ™cÚ»,9³»=y§œ9¼|¿_Κo|äCDòd7ña+"’'½UßÖ‘†Ëyýˆˆˆˆˆˆˆ4›þÇw툈ˆˆˆˆˆH³Ôj§CDDDDDDDšMïj“5DDDDDDD¤áÖ·³ """""""Íf ¿º i6ýk~îDDDDDDD¤Ù ê-'""""""" 7à{i6£ˆÎ'ˆˆˆˆˆˆˆHÃ0!"""""""ÍfØïZ#"""""""Òp¶£mˆˆˆˆˆˆˆH³ÅùADDDDDDDnô«?DDDDDDD¤Ùôÿî<@DDDDDDDšÍ¨¶Ó"""""""Òlú;š‘f3òˆ©LDDDDDDD.kUC"""""""Òp »‘f3Ž]KDDDDDDD.¥…>i6ƒ³—¯‘f3|u¿i6#ɃˆˆˆˆˆˆˆH³žîEDDDDDDDšÍø•V i6“u^‘f3>äwžˆˆˆˆˆˆˆ4[U›e/‰ˆˆˆˆˆˆH³ŸŠ¯JDDDDDDDî§m i6“Üþ­ˆˆˆˆˆˆˆH³U­3–ˆˆˆˆˆˆˆ4›q޾i¸mÚ‘f3ù—¦ """"""" w_q†ˆˆˆˆˆˆˆ4[Õ'Ë”DDDDDDD¤Ùª5Uˆˆˆˆˆˆˆ4Üg=o"""""""ÒlÕ ¤&DDDDDDD¤ÙªÕþ¯ i¶ªofL'"""""""ÍV]{å """""""ÒlÕ2W÷%"""""""ÍfÜõƒi6£§?þ#"""""""ÍfÕ¨œˆˆˆˆˆˆˆ4\Ó6;‰ˆˆˆˆˆˆH³»Ö?HDDDDDDDš­jÕ§yDDDDDDD¤ÙŒwøÎ'"""""""Ífâ7­+i¶ª»Z‘†ë|ë6i¶jk”‘†3é"i6“Âr%i¸¡I͈ˆˆˆˆˆˆH³UkVŸˆˆˆˆˆˆˆ4[ÕìziDDDDDDD¤ÙŒì·f‘†›@DDDDDDDšÍø¿SˆˆˆˆˆˆˆHÃ-ÿú„ˆˆˆˆˆˆˆ4\‹™VDDDDDDD¤ÙLò\‘†3,}JDDDDDDDš­ªíèFDDDDDDD¤ÙL–mëHDDDDDDD.éX>i¶ª¡ #"""""""ÒpçÍ&""""""" g»ú%i¸gåCˆˆˆˆˆˆˆH³Uó™|†ˆˆˆˆˆˆˆ4܃â DDDDDDD¤Ùj˜Œ˜EDDDDDDDšÍ,7®ŒˆäÉr‘;ÉTΩ‡ˆHž,^Ù¿ "yª>xÕ-"""""""Òlu¦8”‘f³+\@Dòd£ý¡?ÉSƒÆÅD$OöÞGDòd»¶$›ˆä©•ŸÑw"’§&/>&"yjQÍô&ÉSýÓÍ‘<5±sÉ“å÷9D$OÖ¶iwˆHžlBí$"yjViÛx"’§Æn¿¶‘<5õlчˆä©ºWͳDDDDDDD¤ÙjÖIDDDDDDDš­zJ¶1i6Ó™9ÎDDDDDDD¤ÙꯘFDòdõsî"’§ºùÚ£‰HžêŸªÛ–ˆä©‘‰Õ["’'›»•D$OÖê>#"yj¼¤¦É“ùù'‰Hž,w̵%"y2;îð“ˆä©^ìžr"’§9—Ö‘<5j=ü ɓձ%æD$O µí-ˆHžªU|’ˆˆˆˆˆˆˆ4ÜÀ‚ýDDDDDDD¤Ùªžò&"""""""ÍV-nÉU"""""""ÒlÕ»LÔr5°»:«‚÷¨Ã¾ùãšræ€_²¶ò|=9sìX¶OÖôоÊZ„ÕeY»îsCΜT»‡ÇñzÈT”|m€Ÿ+o tE9þ¸7–´Ûü‘tž{8=ÑXΜOäµ—µ¹ä̵ËÂͲVÙµ¥¬­ÛW‘ZFi¡¥¶Ádu¸~2Ø©Åzûsj9n>MÊJ«2¾ kz_/Ø6°ªÀfìxµ uL;½“àØòs‚~¯«C—]ä5ÔV…Z3vôÝ ,vׇ“ó@H§† —a"šùσ¯OWtÈh‚‘]0PÚ9?ÿbɽ¬sxàrþo©:\W¼WËÎU›Ô¡<J-®#««åñ/Ou(+훩s‰‚ð9Y‚MZÖ‚{¦ ª³_U‡²N µ4_§–YãìGÿZ N™  ÓÚO•²Ï›‚˜ÀW‚Ä!©‚³/ žëبB½©Ï6z÷ÎgxÇ ׯÜCc”¿;µV…V¶UΧº¼|€qï‚1Ù­Bv†¡Íèx ͘†Qã¿céç\,z±ký2ùl8v·›‹#°qèDeuF‚÷Fì¹w ©£;áDN)®ÔtT6¨¹@0>ÚO°øÔÁ‰.y‚}— Þw'ø73VZ|£JyñÊ~U0pŽ˜Î±Ø®[ßÖ£Ð.û†߈úVãàºë(ÜgÜEàî‹h‚‰~˜‘va.ÑXØ ó&ØcÉœåXgw«3[cǃØ5º’ówÂ:QGàš» M´Ñg‚üoÂZœq £oÂÒûX`x® rê<Ä®ŒÅÄÃ\o.º%ak­@l<<{ŽÖ@¢²â̇èAv8¸½ŽäMÄ9‹e8]09wOàö÷xVWÁëîaSÿ ØÚ̉sm¹ ©Ÿ ½ð®fà Ç>œÞ“€³^ÃpÛÝ9'Ç£À¶9žÎŒCÉÚX\ja‚ûÅÉÈÛ=¯;×ÀË›ð%$eûNKZG<ðn•~„‡£¼Õ©Ò¯’vÑ)Iwi¶¤×õŽd8ù5Ž K»Áè3“µÆØ×ÞX7!)/uü‚ÚÍDØþ±X|;ÎaëõHj³ÛÕÃé Û±ai&âîÎFBýrœˆÕEJó¸°ÿ3.¿_{]q9Wÿe ç•) :.Dþºkxcñ ï"kãÇ@ Älj€ä†å8ú ç}⑵ù,n혻MŠñ¼éT\Ì´Æý¥»ñ Y E¾=ñ²óE|Îx‡Ò‘¾ø›Ñ…·"ðáÎ||jŠòÒÞøå!U±Jª\ù‰¤[\†?Sõ¤ÊaߥÊßÞKz*Iz­3%ƒà4É`Ò`ɰÞÜ ‹Ç‹ˆ}(š€Ò×ñøÜ¯þ¬kˆÇ›J:gWà›×Ië–¹¤ðEÒ5Y!U™ÕCÒ/™(xì”Œê —*ø'éý+é/»+i¯‘ ¯´”ŒÛ­—Œ›[IF%/%#ËôŠÏÉhë&ÉðH˜d4p±d0v‚¤?v¶¤s£·¤ÚC2˜üB29#^µ– ÿµ‘ŒZN‘ ÷V\·– ž ›KƒŸIzn1’¾Ó~Iço©ògüÕÝ$|j)éõn+é:Ö´ÿ~“*OòÇïD=ül›‰÷+ûJZÁ;Pv/_ú%ãåÕƒxxyÏMqÿÈ3\œPUqáb¼:”ºÏrþSuC½ vÎÙ%pœòI°Øí¬`y© ;ØVplÊÁ·ZcTÁ ceņH8Άۈ“襷J~u± +ÓRŸvJjÖŸ)¨´µ– ÕX#߸/\жiñ²i,z-.īƘ÷;«îýƒM‡RÒô$ªÞBÿ9ž˜ùö:¤`䇪˜2jB¬ÞcÉêiXÛ&›øaÏÒ:²˧$"lpléü ëëÔCl#m$¬ Äñ§¯°sšæWGŠA œòÆiŸz¸>hîÌMÄÓëÕOC¯©‚Ùׂ¦ÅÃîíRÐ{À y¦hq#þý¢KKŒYŽAò17¯3–Y‡#Òæ¦)¢°²SVþ…íE'µnö*7bÊœ\Û oÜÀ˜Î0ÕÎ!Ÿ/a™²"§{#jìGìm›UÛûc{ûØetɶ‹±¿ý+œì“Œ,ÜüÝ ±6Cq¤ú9ï`…KM?!ëóGÜš?÷×ÿÄK¤àZKäO=†BÓaøÐ̯ïd¢¬<?‹{H•=ƪ}‹±íu&víx‡ä®÷4+5Cùõ3nv8‰ãÚ%¸˜Ø×ZMA¾çlÜ{š‡}ÃñzJ9ʦõDöœH<ìß¿¾àÝI‰ÒÀKø÷’ö†?øtf~Ÿ ´ædJUþk&U^í/鉔 l}%£üN(°¼rñù¼3þJøyû»TiøI§Ÿ¤ß5DÒºî#U9ä!éUo-®œ$,3—Œ[õ“Œ¯9H&Wu$Ý×—$ÃY’Ñ }ÉD9R2Ž3“L¦K&7|%K=Éd«Ždrj“d2¿«dT˜)oŒ’ ms$íQ’N©+¼’ú¢Ï†ÃÑÕ ‹V=Äô*ýòô%"šb‡õuGÜÅÆÚ®Ø7‰ÇëbwÙ%ù!!íö\N¹ŠMž“÷Æ I žWˆ£Óq¶[+\ Z†Ü°¦Èz2 7G>B®ù)¼H‚6ãðÖe>y5Bùä¡Hp ™+ºâ’¡îÉÂÀkxî‚çÇJð1z ò‹âu¤3Jê—âWÃj(3‰“´ úK•ÚI’îšxsw/Ê^?D¹Ãi©Ò†_’–ï0I'¹©¤»»¡d°¯›¤sðŸ¤xN2¸ÑJ2úP1Wï¬$ã~u$ã'S%ã-ñ¸zæ«ðâÖ=|ÒY€7'‚Pf½ ¿ K•ª_DÙ‡#’VíR¥¥%Ý! %¾Ã%½¸5’<%ßãñÏôªT9±¯T%»™¤¿ÔGÒÍ=(éÿ©S1ÇŽ’áám’Á³’‘ÎÉ(ª¿ddXI2ª”$m(>ö˜Š76ã±v[|®È/ƒæáIV/ܼû÷¿—áÒÍ&ÈÔÉGzãYQeÜ [EN—Â… M‘ÚˇÂ|ãù'ü‘ݱõŠùÄ[E#,1Ëíš`üÄÈÞ9éûçØ¼8ÄUäù$«Eضr 6Öxàj6ˆVÎDD–6VF`Ú«4,¼£…aé üÔ¹X5¼æž‚Ia#Ð3iÿŒ6G[B:"¡Qz Z˜Ù ´º RžãÂ×ÁÈ^‚‡¿âÞægx1ËÅÛþ¡L+º"k®Á»Å1øØx5ÊÏáDztIûÃa©rÇO’Þ)ø¬Üƒ?Á§$­ s¤*c $½=’~Ûó’A÷—’±A ¤,Ú'I†EC$ãBSÉ8ôYE=LBÖIƹ£ñ÷˜ž¤³$Wª²¡IÅž˜*éoì"Íœ.=™#™Ôù'|­ÈSJÆm]%ã³’düû‚d<ç—dT"Ä4”LL²%“îï$㲊Z›SQ—ð— r:IúI’Nô]Épk‰¤7±¢k÷”´ûVä£*ÃPn°ßë$áMlšd4ø¸dâÞF2Y4[2‰s’L®GWŒÙH2z+üJ’Lü%£Ôu’á=I/$CÒ¿õ^ÒIÍ—*þůrmÉH눤—²VÒmóDÒž#UöºƒòÙøÞ`<Þì‰ZIø²S‰å«QXÑ[^n¹ûCÎàfÁ dFß’tt“´Û'ãï“©ø²ô5¾ÝX‰7^“ñrÒlܯö%õv pÍäï“p5vnæ–!sL2´b‘hÿ ùíëãjÿŠ5|<)Þ†H/ڄĮшۺ|ŽàÐþ0ì¬ô[V¯Aè¨ÉˆÈì„íWbZéôúZU2*5é%ö¼+é ‘ôïJ:‰ZRåæÙ(éRqÏ$ímÝñïWK|µ{ŠïŸ:âí9Š"œñ`ø üS” Ô(%Šñ4l^ÕýŒûg¾âÖƒdõü„Gekpíû\n8ÇÛ|ÁI¿ÆHj¯D¼Ç{lœŽOC.àùñ¤®9ntÛ‡;÷šâ\¿,œŽ›€ëÞ û~¤kwGÊÌ׈ëÔ Ož!*¯Ö|ÃÒç‹qdpì Ø€í+ <)Ö®Eùó13+}v]CH§Ÿ˜øëF†-Gû>áÐààâŒ2¤ìÿ‹Ã“š`gD ÄÝ ÂÉk _bÁ ¯Ø:Áa•{`EãË×µ¦'ŽFoÛèÒi—>Ær—§ó;ƒ‡ÿ„ßÌçhU6_`ùô†*嫞Tah§ið¿6îûòÑȤ?ªö0h;Œ‹Cî åŸ1×›‡ÉYسu:6.*Æš¤P,Z»É醨µ¾:¶Í~‹ð+Ö]±ÁÒͳ1{¼7bÅçטح†MG»¶Öp,ól)ž€Ð?iX>/cÿÙ`Ææ]ü3]>UÓ¿m|ÅþÍàVu1N8€jZŸ ¢­T)ßÇ>Ün)Ø´\WFîÎ#ÀçÙU4«8§×ùÙMPåL+UÊ ÓrO µ{tŒ=tí·Ç öOÜ,˜0UÐcì:AuHUŠ{ïç«Z&}U)Óò‚¸Ñ}#¶ l»Q‡â§éµôê?C-›ÞìQ‡ëßMµÕ²?«‰ZtMœÔaß¿›œ9Vqï gW¾Õ‘3'»‘n²æýK!gÎßËZÍ÷e-ì¶‹œ9™„]•3g³ßá²f¸ø»¬íå!k;Ú÷•3—þ!³e­[ÀR9sÕßX¢–ûN7ÕrÎÔPŠtÔá<¹ý&9s ;QÖ†4Þ+g®V¶ßÕò¹Çcµ”Z9¨Cq¨¼µ:\ké>TËㆫÕò&¨DŠ=5¾¨ek«[j)i=K•RÑÏBàU‚ˆYZ omµþ:›º ¢>ž¬_6Xp·§‡ oúU0›¥J±iu(õr®ï zø¢3÷ ŒëMô¶BÐoÐxAlÌÁ®êÑ‚"»»‚×S&«BC?oUÊmGíOG ž¿ý® õc; ,ò=ÎÝ}Ñ-»/’†a²o,lгß8ü—ÛÓvwÂT“ÉX™0¡s[bK\;4¸!VBoë®T ȶ>ܾFË;ès³3fÞ®Ž™fÿ!ܳáÛB±-­3´š#¬õ(„]pÇÖw³±5ð)>G’4=÷aÛ°HŠ·FÒçMÈ(n‹Œ7pµæ\u™Œ‡SZ¸ÖÝ\¤–’[Ôòr®‡:‰Ϫåïru(Mº¸ ú{Gˆô: vO«$0ê/è{"EØ5G°Kj%ˆM+xSÃ]PÜ6C¬/>U¥Øµã…:”º­ zftsy"ØÞp*Åᆰ”v† üÌ­¦› 6oö<îðSûz½*Ô9`©J¹³Ê2ÁËOsÏ«‚åýDAó™iÑôÒF¯vK1íÎo([GÏ•Ñcì|LNo©ƒô±rY(Bb=¥ ……N7‹ûtO‹®Ïûcüû8[†ÎÏ_ ã©==s>Æ^ÌÄòX¦Ü…ÈU 1ñõyï‹ÀŠ­:ØXÍ ›ìkcO²â–úãèêh¬¸»Ý'bW¡‡oÅàˆÌq8ýÍ W_8(w¿+x“d+*lª : ÕµxÔ|‹¾Ý¢oôqÌÚ¹Ñ7£úÆ`VÌÌ:¹«ªìEøçplûx š ƒÏf¢ì÷C¼à¯kuQ²?\ÃÏÝP^ñ[~íµÇÏwFøîW ?Ûáûól|{™…cÃñuß”êõÇûqí1â1Bç"´óklÑ2Ä–Lì[P ‡p¼ô367ÓÇÞË.ˆ¿|)­‘ú'†õÂù6¸Õß'n߯¥À'¸8æ2îDÏÅÝ+úœÃ“–.(>ô·Cz  Òn<º¼¯ZôCQPG|Y‰÷­Sñim Žewǹê‰Èº‚œ‹Ëq³î äÏ»†<Ë<¿×ÝÃÛ:…3Lð´l;ŠŸ]@Ñà…x{0/nïÂÛìcxÓ¿ö÷ÄGë |Jº‹öð!×ïí§âÃÑ“xï<oŸ4Æû~ÖxÝâŠR7¡ðñT¼Î‹Á§ZÁ(¹›ˆÒÀÕøzÈ ßæü@™a*J+ðùÛE”nÙŠ/›ãS®/¾ôݯêxŸì†Wwþ¢lè$|oŠ·çá‘%Þ¦ÆâÙü(<ç‚{m­P<ÞOêÄã9e¸õùî¬?‹‹^.8½)¯ñ±w¼kÖoöNÃóóð²íä¿qBÞ˜ÙÈyqÏ:íÆƒÒóÈ]£‹kE¸>+ ™.)8ýÒ‡'áæðª8WÃY[Jq¤Ôdž‡!îr(vø‰õg"yë+Äš½CÌ #¬-·Cdƒ'Xj‘‚%ú0ôÀuç#ã6Ê™‹ïßF²&Eõ”µã_¿«Ãuqù µôéÓHŠæ êpyþt¸:\, UK”¶—:ޝPKˆÎ[µ/T¥t;~Qà´~Ÿ ,쬠I‹ójY~#Opnv± cÆ3UÐ9•¦JÑÉ|–:”5®U‡â×òu({ÜÜ*ˆ)ø-ˆj¿PðH7N0Y;Fpä[œ ±ÖoA©ëiÁߨª`wd”À6£«À?e.†LMÁ€n¿0»à…²¸{'U°žxU`~?[à|$ ݺmGÇ«‹0jh(Ü sÐÇt$zžš„É÷¢0cL;„Úh#ø‚-6Öš…ñ¶ÎXÞû<–äMÁZ㑈Üü1saÇg$é¸Ún–3…¡­¥Znß´VË~3Cu(딽LÔY0Ð;@³^•ë¡[¿Õ¡Xùò€ZzÆ¥©CY·]†:eÏZªRvÔMàò»­ bÝÁ¶Ä©‚§o nm¬¦ 5ÎúªR.Ù;NÕ¯» Ùúº |^´*è·4l¶ Rò8ßüƒ®vOÐâg® Ý—Fš‰þ¾ÔôºÒ¥oÁêÑE‚e}ògSZ nÌ4U…•’Ún‚F‹tà~e;å™è1ºD™òp›*hnW¥üÜw°*4É™(°?¬-肌áˆa… ±00¾‡b1°cãJ0-Y³#"6vBÆ¿À†óÑRÙmÃ'øD¸aè2,ˆÙŒÙÓÿ!ìê6.߇év30ñî¬øo VÖ†O×`}Qˆéö«§a[§ؼã öd@ÂÔ¥86Ï ÉÅn8¹Ú»kžÄ¡¶ÚØ¿aŽÏ‹Gºa>Îi¿AfÌ?\J:…¥Á¶X뵫û]ÃÖ­‡±cþlì»ó {+7Ä‘Vs•X„8›Ø¥ÈÄþ]3ph²'Ò¶Bê²dœ^t Çyà´ýdþ‡sŽ÷pa¦?²‡OÀåQ ¸Z3™…pqÀõŠóz \ÚäŠ+ýgàJº.w釋ƒ^¢ÞžEi>ÎFg;/Œ:cVfµÐvx#xG˜ ßšÞrÐó†ù ¨f ¬T®Å„ÌT,®%Ýú!"|&ÖÅ>D´ÛÎ[ïÃÿ›È²4Dfß­H·ì‰³¥ö8ñ§3Ö Í;iÉk‘¼a6’&`oæ œzU„Ì™'q:Íg¬["3HSµóuN´/Á©Sÿ÷Jéå=p¼ùs?3 É“qøÇv$ìÑljË×<2 Éí%$(‚°·|¶¿º‡7a]×H˜R;¾^GôBKD¾(G¤™)VøÌ@°ïLÕ¬\“YUpëB »$Fª†7˜Þ´ŠnˆöS³ÑV+Ãù ™öIøM2‡÷‰+p0 ƒ7§bAõHÌùÞ«–ÀànŒ Ñ»AðxVéýuôž:õG¦B‘÷ÎIËÐ-9=­½1ùÆJLh:+üŽ£ï®*˜™æ„é½^"Tï*Ânêc˽…ˆú‰øÄDZ³Å&S;l¨Ý±Ê—²G>Âáݧp*ü#Fü~‡%EEX\Ùk*Æ_×,1“lý*2ë ¦vt¬¨ç-EHpûÍF!ÝæN /Æ?ê€S“Ï!ãîr\>ŽìÞ?q/zîüÉÀãvž¸TÅ·»ÕÇ͵•ñðU:òw ó­¯Qøñ ^ŽÝ‰„ÕºÆÇ¬‘:ç&}DNÖ\{þ÷{zãÌúÚÈþÖ—õÁíU÷qwædäŸè‡EV(8kñÄÃmó†yx~e^nñÅ £/xÞ´ ƒòðlÁ5¾†ÂïðôDØã'mqÿr :7nƒ1ƒn`ĬúX‚ëXÖ®*"u×cMÑD•°@iŽÕ©t[ž|Äö–Ÿ‘X·.öfÁ±ì<Äl„ƒ!FØß·&Ò:WBÆ G\ü¸çïÇ"'²¢^MWàìÌŠº¾ì]qm©/îº8á6B›†¨¥»°g\Äþ(Çaý%82­N·¾…Œ‡qáo4¬3CÚôÑHýóYÃà܉ \ý+÷ªá¦Ö_\VÞÅMÇ äXEãNñÜ»>nlC®Õ9äÆtÄ­Ÿ ¸7æ%î$vÆÝ=‰¸o€»}qûåWäÌ››âarÅõ›Èo£‡Çºð¤×<<Θ†ÇnàáÜxTïòæÔB^x?ä—ÄC³:ÈÍk‡Ûóë¢ ;ò·¼G^àiÜÝd†{Ip½í\ë¿ YŸGàNðx\óÙ»¹® ²Ü^#¥é ‹_†½þÃÃ:CqÇ:ÜÚ7gLÁ­™Cqåf®TY‹3ýsp#h.ûÕÄ¥å_qºS Nߨ£SGãhCSÄŠ3Ÿ†à˜ã}½f‚øS«ÿë6g$`sô „æ#~õNlŽl‡ÍVõ'B?V®èûC´îút^‰‚xyû?¼p›‚â¨wxÓÄoZàÝu—ìBQ¥‹(Nœ‹¢FUðJÏEsâùü¦xfÕù¡mñfT^µ‹Æ‹‚|XíÄ“9óq_a…»ïâʦGxt#w•áöb\ê9—'6@Æè?Hž‹ý– ¼ˆÒAá¥xt©b.~ ¯skܨ‡›mq¡k.rß9↛=rÜ‚pnEœöÇÏ.ÂñÊͰ¯a.vX‰´©¹8±n5ç\F’O*¶7_†m³Ï"üÿ÷2lÍ‚­¯®ƒð™—0«²fz×CŸ:K‘}K§úáä¬v‡šÍÁΊ¾}z"¾—à€Ñ)ì¸öÛ?ÕÆêî a¾óÒƒ1·s5ô_›‰5%ZXd½¶cPÛsü<>O?Â{ÜF4ž2î[ë¾'<ʵÑÐÐo[]°jG;ÌуYŸ2ÐwÙ1ô Úí¿pwì ÓÑ'½ÜB=àVå¬öuF•#ãº)·T)Ó,“Ç'ýLJª gS:!µ×_¤„šfHˆŒÇ–üØ2ûÂz`oü l±ÕÂæ×-Zöa–>˜ñÂ3NmD ~Âbw"(n=‚ìï!зÙ@JliÚeX¹-E`Í*Cš¼Vý\QÅG)}®'aF¡‡;!°¢¯J±½!•%Áêßq^tƒÛø ¸kÍ€uó®Ð½?NPåÚ´GÞï)(xÚ×j `×\)¼ƒkŠëÈõ×f7Âuu]ä7_޼\3\u/G¡ÑFÄLÂõiÈÝмõ+q1§.6úsN ‘ãvÙÓšãB‚Îþ·®ª÷ŠCÒ¢©Hê½±v#7órWû!G?—×_Â×_ÈúÙYýï#5)—–˜"sç dÜóÆ™×ë‘:t «jSâõÄ>³Mo"ɨ'’Ôâ»c b—$#tù)„fWÀ·ÞrĦ„!¬åR„yöÂ6óZ𠜃õjm±aÚ,L3Ù…sùôHŠªDìàˆÓ!±ßrñ3¼75Cì°ù<¡V!ði»ÞùºXz«·´Ç„Ócáݽ=V˜`eNÆŸ‡qËÐù´ºDøà#œ{¡ë¶èŸÓ²O¨9a…ŒOp9Ö¼ÁÚÔO˜Ü¡_TC÷gKѳ»,¶–aÊîoèuæ1úŒvGëðèw2S¦öõ eŠ,Sk™Ëæ2nþ)Ãk$ž•ªúרaŸ–c÷ì?ð›m‚8ùØ]r áÓoc{î)lo|›}kÂuÞ"Ìq‹m;±ñþdlZpÎ[Vaú¥³èWk ú?I†U›æ˜5í$¾Åà’ΰé°Mo¹Ëìð¾·Ñ§áÞ¯&滃Ë4= «™‡Ã’aØ S£0êð{Œ1ž€NAWa”;YF¯ñeŠý{ÊãY“-øxj >6[ÍúàÇüI}áO¼w.Á·?‘øÑARŸzORïš/i]ú-i¥¸IÚÉó$õÅ;%­] %­i7¥jC$í ×$í“%mÝþ’VÞ,è®ÏÃZØrº&‚©!(÷â¤íˆ0§¢Î ¤Àì/à †ÎTý¿Ó›®áÊиR®‰;§Úâd¤:.íÇå­ÝQ”ŽÛñ,? ϯ Ì×wçðüö}¼°°DÙ] ,³?öŽÅÅE’Z~_œ¹ÛW—%áê͸;j î6ÑÁ‹1¯ñbö”ÒÆÝ%µðb¼^Xe¡¬V<ÊæÚà{ïgøvÔr›£ìzÕó,jã{ævI­ýIÍ#MÒˆX%i˜–49áodKI=ÊLRo|RRwl,i¨ÿ”Ô>FJjF£ñã÷a”Ù¾Ä=U޼‘Ô;=”Ô'5‘´ŒžJš7ÆIÕ4HêµúKš«zJšõöIš/HZk'HZ:¥’æ` I½[ÕžºHÕ–YIZ™%ÍúÍ$Íòµ’ºNþ–¿Eeëz’FkWüÎ«ŽŸûcð©ësT$ÝÂëÁåx¼÷jô‘4‡Œ”4¶LÔϽÁŸ,wImdS|_—ÊÑð~Ž~=Y‰/Ö±ø\7¥I±x[ÝÎᡃü‹ðñzS<«šµK†öÀÍ™Qdµ—~uGvãSHÎsFÁ‘ãÈìí…tï©8Úæ/?lATµ§ØÛw ¶ ­@iõߨ(^ˆ¯­žHjS½ñ÷VIkðIËû‡T}édI-ý¤u|nÕ™r’ªÛ¿–ªOn/Õˆ/’jô ”ª?º]uOsI§{w©Æ¯ç’Ž¡BÒ‰«#Õˆ%U/&U3>&Õð,—´¿î’´ëJ¦IZZ+ñ×§ ¿rŠQî›$iÿ*‘ªçKÕû–´ç–ª·Y%UÓ—´Œ#$µÿjHÕ"KšFí%¦çðK·þøy bîh”ïÆ ªóT?4Qé„·]Ïâƒs4žÜ?ƒâùu‘oÚ ¥ú¾¸¯½EÇ–à²Î älKCªöcœœ«‰ØžÏ$m»±’Æòªo©eT}ÁÏðáîI¼câ¦ÍP‘l‚W… ð|´n»9à^¿ã¸:7 —\à ßvxò>7|OãÚ²õU³D2&"Qs öÅîÿ‚p:*ñKÔ°”v*<<¨<À5üœCâFn dnKFZº=ŽuFâŽ>ˆuáËÁgÝ<xd 6Ö€ûÀPl)Xˆ…ö1{¹3 ÕÁöþîXâ‚=—bÌ„hL­‡îí{ñÇa8ï ÚÏï«Lñ§qKeø€×à]Íáxô6%åëqsÎtth€ŒžóðàS®Õ¬ÀÕïÃqæöBœû»G,ÃpàKÕœTpv»àøÓL[SCô}êü«ò€ܰvàUìþóÞ¿FcKI ,l¼ Ëë¨côƒ\ ³û›Àu8™m‹Øâ—Ø÷ln,E`fÜ_„kíTL7;ÔbCìk¬^ú ã®lĤTt»>¬Œa¤6s¦Ç€áèØ­®¹ þ¡‘25fÿP¦Hï}F6åîÇÔï©pºŽ.3¯ÁLOWF÷‰¿2Å}ïG2oGËìý[&ØêˆÌ€™v2¹;§Èøìð‘Ù<2G¦ÕÇBeOÆFªƒŽá›ÆTöê†_ïžâ÷sIÍÍ ýñ÷v~¾X‹?Aóð{˜-~•&âÏô›ø9ÀðÿõŸ·–Ô¢—âOØ>ü*O@eç"|×;ˆ²ŠcøPò Ï-kâËÔxw'oŠñ¸ð,J¾ÎÆíFŸPx{0²û6ÆÏù.¨ü¢†¯C·ããë(OÙ„Ò'ºxY±NÛヹ^4þŽg=OàNqÜËÚ†<ßÈ ;‹³%Ú(N»‚‚ƒ#ï¿ç_|BVÍ18>¼‰–íy¥7Òîšà¨î41Ý„ðÂqØ›Ñ~­à;(+‹öãå쫸wé!îÌ<Ž+¿f"w.ξ¼†3“úàÀç߸ô'ßá„$b,×#nó%=Å®™¿à–ì‰ÃnͰ;ú BõVakŸ|x§Ë6¬ÃÂìD ‹ˆƒÇûÉp¸ ³t’ÑϹmó$™è·Z°óÄŽ–¶Øhu›ƒïaºVOLVT¢{¬½Nûc1¶Ÿ°c6 Ã:˘å˜)S¼™.󸥗Lpé~e(ªq WÎ9âÒç–8­°DªÚqê· ÜLÚ·NzLB\ÑDÄöz… Ãމ-£¯Ãã‰.G× ìÏ-x{ù`kIs,v Ʋ0ÚÐ#Úœ…íãëX0o†ÎÛ†A=`U17,•Ù•äwÏÛpëÓ3ó*1Ç\6y£ß¨-h}a6fÄvFÇEèåÑ }梎ñ]™úë=•)®Ôk-“n+³9b’2èZR¦(ê+“¤!ãýCWfÇ—Ó2ÂWÈØRWæP<á2…Eò7U8¬ÒÝ  t<¢.£^-D™¢âí™õÉ_S"³(j»Ì”[ßdêI}d"JËdFj_‘髱O™Ãwã!2¯ôT’úÔQ%:®Æª°/™±O%{öS…ƒO›DUا9½PÉþ±·Taw¥ãV•¨•Ä‹ ·Â$ayý…Xß»&-0ƒã¾þ€Ë*̷ꈡm5ѯZÕlž‰&-:ËW S¦xsý£Ìí3³dï…+ƒÎÆReЬ׷dŽ[Ý–Yvþ…L›!ýT»TGƹ“—Ì úÛe´uÎ*sH}•¨¿Ò‰ª°Øý *:Æ}Uá0áü•´=P[ö+FmR…]fI Èì{E×YÇœ˜h¡Y.Ÿ#2›õ§÷‹ÌnôÞÞ"³Ý]6ZhÆs7‰¬CëvƒEfí;º‰ 5çLS¦Ho*“špYfEÊ}£‹*iZ© ‡Q¹»T2íJ–*ìýKj«Äcð!UØ…ŽuU…Ã`ÃCª°_«V¡’¥g—«ÂΣÃ$UtÜö§µÐ’Ž™MÖ•öB ì¦#²öÎ÷YGO³i"³9’*2ÛÎóŠDf3}¸©È:,øYdí»‰¬ƒ$í™õÕNŽ"³ Ï\MDbj}öš-‰©ÝŠ¿ŽD$&ËvÕ¾‘˜ì{oj,´ Nªp¨gÔ_%óKë«äYúF•të7F%i1^ªP4š9T%ŠØŸ2ëvw ýk,“;»¾2‡·~÷”)LÆ8È ºW ãõq¬Ì$¿52»¦‘IÙ–!óN#A&¾l™ÌÃc”AËy†Œå¶62u5ÉØfFÉØ›´ÂÀs.pJ¹‚%}úcêO¬Ìo÷ì¯Ø±ßÅÁ»G¡*jÓOªDç—‡L§¬<™&WdöôY(³¶öc™ý#Éäêú*ƒú2geŠf¥2ƒ:v’qYæÀÐ#2Á2‡ØÈÜQo£ Ú•) §öV­·2Æ I2m»Zâu35¼O´Æ§´¨È\‰ûg›¢¤ù4¼Ê†·ï€—VsðºÄýð1eÊr{àÓ¸Wøb~Ÿ?–áÓ𠔥wGyG]¼×é¬ð¶](s:b™ÌÃÖG”¡Þ ÅçaÊ Ÿ5_Îè°ÔÝÚô†ãú~è{Z“:îÁü÷p³˜V§ceºUѳ0á¾–7_‰‘œàrr ÖÜÉ€÷ÔÝpuñÁö)]w1MÀ9jÖÀ“ÑØUÛ>;üâü QÆH°«‰ð–8pw’6ŽGzÜw¤ü½‹¬ÂSÈðw¦ÎCëí]ѵÂCt†ó¢}íµóŒŸ`݇^ðÞá€å';`‹æfl?¼ áÓ̱s©"~}ÁÝ œ8p›/Ͷ‹;ôÐû“ú&±uzâèòR¤:wÃáõ[q*-6!oã\¸ŽüìÜ™X%Ý33ü ’Ì~#µÁ%\ò\´Ät\MŸÂñf(µ×u'ã~x-<]7ï–_À £³ø°´_š–â—Ý!ÜnÞ ½ºâU·x||ý¥f ¬ä*-zâWž¾N3Ưó’Zá*I#¦ž¤–â.i˜—4=:Kš § `–7">™#Þ¡ N|¨‰#~w‘ª5 Y3êáú8¤µë„ßÝ(\µ^WâÎ@/VøU0OÒœ®)©m¿„?+ákÓuø~q ÊÊÚàݘ(Y\)iû7”´Ü*%Í=/$5rI}ý1ülu•½Cð¾Æ%ü 9‡OEþxÿqž¶ôÄ«+CñàxnÏOÁ•ª\Z^ŽWŠÞ(‰[‚ÛÓ†àAÈ4\·ë†+k‚qÖº3òï¿C¦»7RgÆÿÛH~sq~ ¢ðœ2‘¤žsa{qñÖEãrÌmÜø¬‹û+ÏãYßHÜ3½€§{àõ(Ÿš‡7û¾¢|¾*ûKøÐƴƳˆÎxs/åµ´ð&v:ÊúÝÇ—3Cð-·/¾¯†«ãù*üù2¿Fâ—¯~ÿÒÀϾÇQ¹ä~ÍÜ$©Mþ$©/¿Ñs%5Ÿñ’ú®Iíê;Icÿ2I£ý IcjUŒfKj¹ ü®±?fáó­ ImÂ1üÙZlßâ»ùFüˆ>/–}ð)°%Þ¹‰¯“ð±ÇU¼íš‡÷_x9Ç=N¡èÑän©‹ŠY½ñõM~´¯:¯#PyU _Cå³A¨õ?«»¡²êÛýú¡ åzøl^³*..x]q%ñ®¨sGÙ‰Ûø8Ô¥_Óðvq<¯†’Õ¯p÷çU¼8ŽâÞ7q×y*òÇ/Âͯj¸úy!.œ€Ó‡rñ¡w:^?GI´„;1÷ñðó¾þ‰¼·ÞÈŒ¯ÄëÃpiý_œ?ÖÉÛŽ#5-G³½?ô0ÂõþâŠ"iµgád͵8Ô£.’‚[!öo+D,ÄÎ ›°ïìGçÖÇŽªDì¾(¾Ê±iv*–Œ‡ 7sð·õ|›ÒßáíK”éOÀËðƒ(™¿ Eíâå½µx¾·ãÖáªb8®«áÂ’)87E±Qñ°‰- ²Â‘ÓË iÏ÷#ûa_œy‰¤·9'“Œpð&°¯Íy½ÕzÂñ{xÝ¿ˆµÿÍBÖwHÑAÂÙ‰ˆr´Eü=ìN¾Š]s°eü~„¾‡!_°8ÌcÖ%Œ{Žžað»­×iFXѤ!&LǼ§[áØeúíz›wÎèXÿ°LµÍdŽ´rBä©+m´¾93±kiml]éŒM—50·l<ìÓ°äÅg̘´ CVæaÂúKè;¬!/Ôa–z«³¢0=dFã ºû ÛFãdš—¶W¦(¿}QÌ 5e4ìF)S<Ôõ”9p¯‡LN®ŽLøÛE2›žYËtÏ/’¹ûTRíï~2æ ±ÊYn¡ƒ1"+3ÊŸÂìúK™v-ÕÑ¥ãF Û{S+Ü1¼"ÓÏ|ÂJS¸ÿŒÅò´Þp{忎3Ü]‘Zƒà:«~݃g·–Xµé8<²«c{å„úÅaÇt{„u>„ýkpä¯5öYáHÝœ¬ªÉé3vb{W[„øÝCôc=Ê]Œ¨º8(!ÙÆ©ewp"Ëç®ßÅźÈ;øÙMÊ‘³j, ß¡¨ä.†dºar\k,ÝœW-,:]„MyçàÓ­vfÕo±cŠ©>ñ»a¯qÄÚOÁ1ë0œœ| ^ã/Á· vÿ˜ˆ}¹MêßQFq¨ù&$^NÇ‘ì–HNsy5}Î<í‚óÝfàr5uäÄè#ÉqN_­ê%ß ÁõZ8¿¾.3Â5½î¸ar×o‡ã–¾îw©‰‡ŽóqÇá îéEqë<Ì®zF뛸ö=·´ pû\m$ Ca÷l Tàö‰bÜ»T÷ú„ãu6î®›;QÙ¸õf)n¥þAAõ"œ,KÅù˜Ÿ¸rÿ% :­ÆåÞÈY‡"ÿgx ÜíSÅ7fây¿H¼ š§úšxQ¯^¯*ÃëGq+ðî->ƒÇÉ=ñÔ±7ŠÄà±KUo6϶¾ÅË=•xyñ,Jß~Ç˰§xøÏôã™Ö+<ê_ïZ¾Å»§3ðqø0¼_² ïÚ–âM{¼±ÖÇ‹}Uýél¼{¯òð¤ÌÏR;¡¸Ú&ÜÒy¥U¹*%åxüîîµwÀC«a¸½D7ü qÕÚ·§ÔFÞ›û¸¼§ÒžjâÂM[¤v=ƒä‹_ppA1ž,uÓñ´í|<\‰GÉuð°ÆC<¸Û wêMÅã…q?6 w7–àÆUWÜzâŒü.îÈŽ, _Üí÷7=«b5¦9WûãÚ£½¸¼x .x…álr#\º?é÷/á̆ÿ¸( '§ôA‚ÇjÄhbol5\{x«ö;þ '¯æãÜ…ïHö쇄:M°¿å+$G\Û»ˆøöÞþ)™Þð‘&a³qCüuQƒtfz;l:#Øû8¶Ý¾Ïéû°:° ¶o„õ)[±à NW[`îÞš+Cÿsµà”‡øö½‘³'Ï/ÃÙÒ™HžãÓ3"ú9.lrÂ…Äæ¸lnˆkíß"?®Wý!çó^\¯³ùóÖãœkΧèââD\ne‹ÌŠã¸Ðë2.»×Æ¥·7‘;r/r’¶!ïÊgä(ôqÕà.Å4Ä¥KÈòª@aJ ›®À­šÁ¸áT„‚…V¸v%×RÆàªíbܰ×G^HSä¬óD¶uO\¶|€L­ªZÓÝ)UñÈéÜï>Ä…ÒÕH+kŠŒSyHý¸§fAbU“Úg0’5C‘ðz(bÏãð¤«Øï⽎ X ûÚá‚nÕúçWÕäºû‘™xçW.Áùç‰8ûç".8:á|r¤–ã´šR7&!ÅÈI%=qxxœ[iŽÓú8µxŽªš7ç<űÿ~áHL:âªzýcKq Ô 1Ób±·­3öuJFxÿNÊ‹íÝ[àDÈS$\í‡6"Zꌸðõˆ4EØH  ~‡ð^ݱó÷9lë{î—ÞÀ'ñÜ}ÀªÜÛ˜=³B6îÁŽÓfðîêW¨akiGl6ªƒeÁ•p®Ý+üafè8Œ]ò ý«?˜:Žè§• tR M“EÈ3§ʪâ~‡²ç#18Ú Eô‹Ç}™‚˜ùkÞ~ MjÀçH$ÞXÁëøg¸N؈%²é‹à+-°ãqU½~©¿?/àÙë 6èWü‚]ØÔ% ×ÿÆ”‚žzu.&õj‚Áñ^èº!VßÓàÞ× ËïŽÀÌo‹0ºÎ|LOùŒÝuÐóMuØDzÂJ÷˜L½Fî2–O†ËÔLñú‡žLÚÊ/ʰvh,æ®4Àí®xËã›bÀàíè4Ìm]‡ÃüùX™š¾ûeÌ´^ËèäU(S¼°Õ’9[¦#óò@™³¥{dB—Ë,ëã*róŽÌòíV2Ýã–Ê4Mþ© ÅcRp릮½€‹iÈõw@æ©ö8;jCŽâ¼‹/N¸— az[ìS7ÇÁùvˆèSŒà£›áëu§–ŽÄ‘ ˆM^€ÝWÒ±Ûâó;¾~…§Ó 첯7±ù7ŒÑÇúeç1G}8ÆÛ/Eß±{aUל­c °ÆõÜ‹·b™å^8㆕UÂÅõ9#‚ÐoÑtìÞ ­N[ËL^u³íÐ9« ­ÏûÁ¨s…ŒöŸzÊEþÎÊ°í‡ Ü"“±ªîÌhÕ KMÖcrf ×KCWMŒ^´=n:ÃöOC˜TƒæóªËØžð“iÔx‰2Å×ò2ïU*ƒÚÖnÊ×jï‘9ª.ãn¶\&úÎ5™ÍRe)úË´HÎP†zµ5•)ž&“9—Z$°ãžLÒŠ2Þs4e¦8DËX6~'cä¬ ‡£Ö½T¡¨;¼–*"ûÏU‰tcŽ*ì/,ÕT…âã˜D™ŒÓ¹2{¾ɬ*¶– Ëœ/³|T’L}eš ?'SÍå„*Â6V…B³­¡*Â×è¨ÄêÂ+UØg]ŒU…ƒuéUا=뢒Á»·¨Â.ÿÅs•.¯/2©fÝÁRMx©fS}©Æd?©Æ½Í’v˜½TmÇjIý\ºT=è…¤Õõ€¤qp ~žz…¿·êáËg”y›ày“k’æÐøcª‹:Kð±éQTÔ†Ò=ðô](nß1ÀëŒAxøþ!ŠŽ6Ä•È?¸>j>2Q©ömq8ñ*mVãm—4¼ˆ©†;ßñÈÌ»j]„«‘«úÜ 7¢!«´ çŒoTÍÿ6H.CÌß(D¨;&ÿ@f^’M#q¤î"ìÜ 1›ï Ø@ÚÛàêàá:ðj¸®ý=0çÂ%¬x±  ÷bX€úóð°å6ä?9Š+-Û#µN2M›"¹uK~Ü{óuqüÙ&Äì|ˆ½ÃžcG¯™Þà¯kàšò.ÁvˆµzYãá_Ënçðþ†u­‹± ©-ë Àj'7LY a¤C.:-9¶VÊxYfbeàÌ5™ŠáS/aR÷Rôùo%0ðL¾4€Å_µ5·d=¢LñÜlžL–}„ŒÿzOeˆkò !Íÿa±p}¿^þ±rìHÌu¿‹a…XU>“ bD»OP\Qƒ…¯©ÌÄú!èµé>d¡åG}4¸n Lñ{ŸšLÚòÊÐpS¤2ŃâÏ2éÍœe¼ÿ<”‰.y.3oº¡LßšQ25÷ ”)®¹@&&f¹Œoó2™m‹e ]BUápëëW• ¬(T¦‡Á U¯Ðu[,c  §­&SmÂzeм 2å6#eNçgÊìî¿_fÖû8™#¸%³ÙÂ_fôσ2º{÷+sør H ß”ê2#R?Ê´žñF™C¥a¬ÌU«;*Y»,[ö•FýUáa³X%Í‹lTaæ­µJ,‡é©Â.§û"‘)š­}© ‡íãRTÒ­ÞsUØï·úO%í}º‹ÌÎmï ‘ulô¸·Ð¾4Ñ™íÞº¹"³ÙóÀRdl,™ÃˆŸÙª°¿mðQ%K—MQ…Ýkƒ¡* Óï"²Ž{]g‹Ìv‘‹ŽÈ:n=f-2Û%z"³éò»¯È:˜¶$2›¡=C£3ù"³~7»–Ȭ®¯ š«z.‰ ‡šoFLÿcˆ²P lå^DE"äøkìÜYß;hüÛŠçbKB>þëùž>±aÅ;,‰iá…h4>#?ÃcÃx¬+ðƒû£±vèW,Èü…)/°ðóoL=2£zh Ï°®™‹>ú‘p(êŠÖÏð䮄ég®aô«åèÛµ?Fý0BŸ#¡0ø…ÖÁ+`j:TF§Ü\ÆÔ8A¦f‰¤Lñª×P™Œ±:Ê0ÿx}Lé1#‡ÏBŸ†Ç0²ÎôióŠnÐæQLK2dj{^‘1ï½X¦îÅ eŠMŸÈ\-ÏyãñL&Û«“LD‘³ŒÛø52ûƒÉlÿŸŒcjo™v©-e^,U—I[úŸLhiœÌêfSdÂ{›Èl(È–é7¯¥Œáê®2Ú7kªÂ!¦ÔGŠúæ«ÂáäüÑ*鯳CöÌsU¡¨(L“)XsSæàÈøÍœ)“8ï“LàÊ™2óR"dz–þ’1zÞV7¶V…bÍž2û¸ËùMÑ(x®Ì¡²÷x•l4E%V ƒTâ|é‚Jêh[¨ÂÞ÷Ç•÷¸©?ÓDæ`1Wö…ÝT2ö|Uؽñ[%)z3EÖ1(;Ed¶!‹š‹¬ãõø?"³}Ÿš+2›"ëpôÈb‘9Ä>9­’IyZª°¸kJ¼wµV…CÃ:!ª°O_§’Ö.;Ua—ÿÝI%S–‹¬ãâŸDfwù÷o¡é©U™môùQ"³y¾ÓAd¶µ òEfÓÎR]díó,Ÿ‹Ìú{q¡=ÈnKDb²™ÒÄId&NwY{}—Ã"³6[¸\dVõ´‰HL함‘˜ÚAD‚ú>ÛƒˆÄÔÆtF jlú"“e\ÙL"“­4i–È:ìW»"²ö§N™µîí "³Räd‘˜Úê¾?ODbj­=Ì“ˆÄÔvï‹ D$(+³b"“å ݾD$¨Ñ³–‘˜,ºêh‘˜Ì^ìHDb27«-‰©eÙ4 "“ÙÙ'ˆHLæ5m‡‘˜Œë¾P‘ ÜžW‘˜ÚÜYð˜ˆ5øÏ9"“åè…§‰HPíö!"1µžø²?‰©Õ«’YD$¨£/›‘˜,¢†¼$"1™ÏYjCD‚Šp $"1™Ôͱ#"AEe.'"1™ok?ˆ¥Ñ#ˆÄdÚ´±  ªÍÁD$&‡óŠT¡~}LTcWÿéCenm\&cr©­Œ«Í5™YÚÈõ6’Éœ8UªuT¦øÞ·¶2X{¡LñêZŽ2ÙM•iä¶XÆê^ ú­-D÷»)ÿ|:¹ÔÇèÄ mVŠÙ{±ÐE îËr±Yë7¶8Œ©S±V/Ëô—Âsv¼Jö pÝè"<ÃÆã@r(‡mð7 ®Ó#ÎÁüºcàüy6D¡¾ &å7À˜¨ÝXdÙ + Ä–ˆp×~‹íý>ÃõÉLø(O›@™û týnDWLAÄÃáˆûøé«žX¡‹KÝrb­Â¡žˆÿûG²+öt³‘yÖNWæšKe¨›ÚJFo·¦ŒC—| [†þŠTL]c ËeõÑC=ÈLjý·0¾)ÿ2ÆÜë°é€64̳e¬ëÄÉ;Èt]Š‘i51¨E)¦éˆM1­|œ&|Å’ˆXcõ[›èÂÝÅ~aO0÷·)6Mi†Õù~ز4>õÚcW׃Øñ,!ßavQ]üwé4VÏ;‰­­×Àçü1é·D@Ê@ìþjwÏ.ØÞù|¿"pY*BÎ;#2i ö¤ªa‡ˆhêXÇÁØ·Ã là×$¬éŠÃ{NâÈÁ~ˆMÿ‚ƒ±vˆ÷/ÆÁøÞ8ì„CSšã Ó&ÄÅU" þ!„tBð¦,ìÍ8¨-¯;¥ûë>Dœuì~䈨(D4tÆ>‡Qˆéµ±»"FÏûtCüÖ8€Aˆû^±3Ž"®a&¢÷ŽFôškŸ±1Au-• êÑ~„ßÛ„ðCíhøy]áû·)v$×Fx=7„ä•a_£@ÄÿF‚w2eÅ#Ém">½Gü+Ä|3À‘YmqôÏn$¿ï„¤3qâÌI$—·ÆéFù8YK§['àLÖIœ.Õ© É8qoNn˜“Û~#¥—’VàD‹^8Öi8Ž–˜ã@GCLIƱE§‘P;‰àø“ $?}‹ã Þ"iñj}ù‰{âÎáX×l$Î艄¥päzÕ~k­ÄñÙÅ8ºfþôÇNKq ëvDVLGÔä)N©‰–êˆ:Û Ñµ»#´]BVÖÁ¶cá—6nƳâuDz]pÌÓñ¿6#þæ1Dhé!Âkvy¨á€~1"k´F¤[#™ÖF ã4xÍúï5³±öÎpìLžƒ-×`ë˜ÇXQèˆe30.!†§£û›X=, “«=ÄÔüåèÝm¶_• ú°>¾ÅðxŠMš»±Á%3âÏ`ÖŽ3œ¸›oèc®ÇpÌwo‡QµçcØítØsöÍ…ÑgmtØùPF]£©Œöïteг/[*ÃQ5iæ…Ãýƒï–‡øk=l¢7k"lýÄWŸˆïˆ>8 »wuÂîz>ðO€#}±uÈ#„Þ‡í±ãÒ x¤çÂ}i+,òÎÇÒ WŒÓ–QX±V'vÃÔù0IkzýmŒ~Áù°*[Žp­Ïعí2vM™ ïs¿àåƒu§‹°ñL(f÷»Ÿçw±yÜt¸æXc¡ÑF¸¤(0òP}Œ™]{œÆŒ;éÔå†~(€ýJ@/v·ŒéľÊï?V†1£¶£‹f t_]‹Ì8@¦±£±2Eáõn2—˸¯/“ñ«%Ó¡ìÌãŒ@™ï)2ûÞ&ÉŒLì¥Ì¡ìõDU ­Ÿ9z­~‡Nw1òjk8íh‚%­´1w^ þÓš‹¿ÿ`ÚOŒÏ˜E &X5{<‡m…kDSø}ƒ[–¶-Û¯·Mà¿ó>Ë ¡a±÷L2¶÷؉ £®Øó¡)š°×5°ç DD&cöáXr2VÔ½÷³êØê˜‚Gb–bW«,l®5^wúÁsÂ/ø5Ž‚¿u‚2ob—ñb„tm… ¿S°{ç)„v)Cxר«þ{­*±Gó,v»ç ldÕ™M:ƒ0‡k­X‚°‚ú>î†à•ƒPXQ5cߺvˆ:9Ñó¾cßîª<Ë‘¹§þò¢šDdý到9ƒðu³ªjörEpà:ì8žŠð+4ÓAÏa»züt6ý*¯yø«aùÝåØþâ(<mÇVýX7â;V~Á´“1sñD ”ðC|þ3‚sáÿg?ügoWÿVðžÔ›mÇ#`M|œÌáÛ¹ܾTTí{',îe o0y6ºÜÁ\ýÿ0ÿLkŒY—‡‘ ]ÑÉdº->ƒV£ïÃióôʪþMÖ CÏFh¶(RÆû~Õ;'5„ß²^Ø~ Ajg²S AYþUër…ÝPìº\†€èBìºAÎUýKnkm’ƒ‘Èì&WO™í·ÒÖB«Ð^$´šÃ& m¸y‘Ùü÷k…ÐŒC–‹¬ƒÎ˜í"ƒ÷™RxîÏÞñ_õ:XŸƒù&>X4Ï“F{csµXºÒ+º€ó“³˜Ö±5†|=‰‘Ž‹Ðu¸+Ƹ‚ÞOç`ÀZ+t Ñ…^q= µeŠïN*Ü1fã;Nÿ¡ßɹè`ê)3¸S(¢’ÐÅ#–žËÑ ²§Lõ–M”)²¢zÈÜ~UMfׂå2/‡Ô“‰Ìÿ+“à(3ÏñˆL :*±uí¡ ‡Åûæ©ú}=”)ÞôZ!ó÷¿™S 2dbδ•q½]fÕ_w½_Ãerœ•ñ}&³÷î>™ác”9¼+Þ®’ƒSBTaîøkU8Ôs[­ ûêK7¨dÈóµ"ëhòå·ÐÙ™ŠÌÆÇ×Fd Óöƪpp:òY%û UaÂg *ì¨9‰ÌÞ¡M‘Ùžì¶Ud6o=z‹¬}¦v¥È:Ô|“ 2«Œ!Î"³‰^*²{_ÎZSsM‘YŸ6/™ÕYãùD$¦v&K@Db²üD$&óÂÔL"“i›ˉHLæ=7$"1™œu@Db2nU§#‰ÉȹÎ"SÇ”7"ëPÚ«µÈlÌ×Y{ §¿"kí½ŽˆÄdu"LjˆÄÔÊÜs ÊòX]"“éêCˈHL&õ?î$"1ªuùADbj]9¼ ‰ÉäÛŽD$&‹÷ ‰HLFÇž#"1ôYXJDbÒÕw\ID‚š±â‰©IëÁúD$¦–ýëO#"1ê/ØEDbÒkÒ`0‰I·ñ¡t"“¾ÛÆŸD$&½¶·³ˆHLÍ¢g<&"15Íï|šˆÄÔȨ}ýÛê_þ<žˆˆˆˆˆˆˆþm&î?¦‘˜ m›~$"1Ç:o'"16NKDb2¼f‘  s‰HL-‚R.‘ vúµ#"1µtpr$"1¸ýGD‚:h]FDbÒ7÷Ó#"1µ(­{ˆÄÔÜmó9"S‹SG7‘˜tó{‘˜ O÷êADb2ºRÙžˆÄ¤w±ä‰É@õV"SËóoß‘˜Œ™‘˜ ê,!"1¸ïODbÒÕ(ÞFDbj1Ïä%‰©Ù¢&9D$¨ç߈HLzE‡‘˜ Ú,¸FDbÒõ_áLDbÒC}"S‹‘ñˆHLº—÷?!"15õñö&"AùÙ&‘˜t}ÛLDbjžàSHDbjzÐ'”ˆõjCs"Sý¼nÑDDDDDDDôokh:ð$ýÛš}òýAD‚jÒ~ ªíƒ"ÔÌH"UȼiD$&ÝEr‰HLÍf·ö$"AÝ¿ø„ˆÄÔxeÈ"""""""ú·5ÓI1!"Aþ­ODbjb¼ =‰©é¶äêD$¦Ž+ûûŠÌ6Çõ“ÈlÚM¿!²Û.w™­Í0#‘ÙÄõú$²ö?ìç mñÏë"³7ä%‰©]ñÑD$&›V]DÖáDÂ$‘Y¾m/4·Ü¿"ë0Ìi©ÈÚ È™u£ÎDfuħ©ÈÚ6ïîEDbj³ìÈO"“å–§‰HL­ÆO¶&"1YlÞ=–ˆÄdÖoz"S«šq‰HP›‹N‘˜Ì\“û‘˜Ìåš‘˜¬‡ Ö&"1YíOÙGDbjc6ç ªU‹uD$&«Zw:‘˜Ú­ï~ŠˆÄÔ¦•Ç}"Së?&ID$&ËZˆHPavND$&‹^!m‰HP/¿„‘˜,o/.'"AK»DDbje=&”ˆÕ,ã‰ÉüÞ{5"“i·D"“ÙÛ«ˆHL&[‡ô$"AÅß""1™:¬)#"1µìè—EDb2îô3™ˆÄdz}ög"“ñÇE "“ÉA¿t"“±ó="“‘‹¶ êL@w"”â[/"“á˜ñ7ˆHLf’“%‰É\ÃÓ”ˆÄd²pNm"“iûvD$&óq³Ö‘ ì]‘˜Lゾ‘ Ü»µ!"1k'·'"A½^ôŠˆÄd9ê%‰©¥ÿ‚åD$&“Þ¿m‰HPÕnž#"1µü˜µˆµKg‰©í{ÓwD$¨¥çô‰HL­=Ó:‘˜,/liNDbj[§ü‰©M¡…‰©UÁÒ‹D$&‹äfD$&ËýV‘˜Z¹é»‘˜,üÏ×%"1™‡d‘˜,&<úHDb2¯î "“Y§üGD$&“ðêD$¦6w¬Æ‘˜ÚwŽ&"1™ŸîãLD‚Êþ®GDbj{ôS*‰©»å"“ŵ‰ˆHL–Ín'"1™îŒœKDb2‰..%"1µ|2H›ˆÄdôk–‰Étúƒ…D$&3¿/ljHL-¯{˜‘˜Œ_æo%"1™ù×-#"1™Ž;ä@Db29tÒˆÄdÜ1` *~]‰Éh×J"”ÅX]"“~¢™1‰ÉXkÃB"“Q§6‡‰HP³ê´%"18}Õ""1éç ÝDDbj1~×R"TðÔÍD$&]?ã`"“Ááè›D$¨ƒCž‘˜ôm—‘˜ô§æm&"1F}ò%"1…ç­ "1˜½»ID‚*šaDDbj‘õ`!‰IÏ·Ü”ˆÄÔ¢Ë;"T–ç}"“¾Ñ€d"Ôöí³ˆHLz Gõ%"AµìýŠˆÄd¼Lÿ+‰©å‰tM"“ÑÆ–D$¨ŒMD$*=Ï¥D$&ƒa›»‘˜ oÞD$&ƒÀY ˆHL†‹-¦‘˜Œf^ "1D5‰É0úèz"“ÑÙωHPCë½!"1þuK'"A-%"1è%Ö!"16ÜœˆÄ¤Ÿ“6ˆˆÄdÜ %‰Ép:²ˆHL)ý-ˆHPwj¤‘ ôÇ_!"1é™ÞYADbÒß6s)‰I×wÖ"“žÕ¡D$&ƒÕuˆHP›Ö¼!"1é»ÏÚ@Db2è8%›ˆÄÔ|ÅÏ?D$&ÝÊ› "S³?‘˜t—q%"1é…þJ#"1éwÚLDbÒ«ÿŸ‰Iÿ¨zm"Ô 7o"“Á€yk‰HP8w›ˆ5ú\  *à³+‰IÿÚ÷SD$&ƒíM{‘˜ô/µ'"1liAD‚Ê|ADb2ÔÙ“GD‚*0ýIDb2È ‹$"AÕ¾‘NDb2¼kQIDb2(n§ND‚ú±ý)‰IoÿšD$&ýñ]‰HL-mJDbÒµìÖƒˆ8w jÔè^D$¨ËÙñD$&½?Ëû‘˜tCçŸ'"1éu>ӈĤ{¯I  ê„K ê’ãk"TE“¿D$¨©.‰HL-tŒ·‘ Z6[@DbÒ½Õ~- jŽK êÍL#"ÔäGûˆHLÍ7_lNDbj¦×ÊŒˆÄ¤Ûmh‰©y“¸ "TõØáD$¦&wÎl'"15rîþ•ˆˆˆˆˆˆˆþmzõ#ˆHL-vœ8EDbÒ ©=”ˆeï4—ˆÄÔ¢¹w‰©yÂW"S‹jõÿ‘˜š7LDbÒ·IìCDbÒ37²&"1é[ª5 "1éÞª@Dbjr`^"""""""ú·5Z6cýÛjkBDDDDDDDÿ¶Z‹¢»Ñ¿M§OéY"""""""ú·™TüÝNDbÒ×ly—ˆÄdTºì0‰I·å„J"SÃó.Ñ¿Í;ˆHLMY†‘˜ôjß!"15NdHDbª×X±•ˆˆˆˆˆˆˆþmu×fÑ¿­–ÎÂqDDDDDDDôo«9là """""""ú·Õx¸gýÛšÖÔ[MDDDDDDDÿ¶: M㉈ˆˆˆˆˆèßÖäÛ¸õDDDDDDDôo«37€ˆˆˆˆˆˆˆþm:}­OÑ¿­†qòj"""""""ú·éصÛNDDDDDDDÿ¶ê‰ˆˆˆˆˆˆèßV«žÆ*"""""""ú·Õ¾Ðm,ýÛtVös$""""""¢[­°l?"""""""ú·ÕÛÖˆˆˆˆˆˆˆþmz]XADDDDDDDÿ¶º{Ï"""""""¢[C—ˆˆˆˆˆˆˆèßV£8Ó•ˆˆˆˆˆˆˆþmµ4 Ñ¿­FñÀõDDDDDDDôo«µâåW"""""""ú·Õ51ÛDDDDDDDDÿ¶† Vô"¢ÿ±ßñBÏû€ÏlŸU§Ó9§)JD{|ËE*´Ì¸ä§„THVâÆ¥ÒД"Ý‹¤Ì+{‡2¯ìy(${Óï_çïóßûó<¯×£ªª{Ió3PUUUco2¯ësªªªjìUŒœ ¦¹É㻿¡¦¹úÔEÿSÓ\>䥽Õ4m»ûUUU5öæCŽ)VÓÜ´ôÃ#Õ4·øçÖ†jš+ZÜÙFMsɰ‚7TUUÕØë_÷þUUU5öz×}ü•ªªª{Ã&o–©ªªª±7hÖùZUUU5ö–?Ž^£¦¹ÙÜW/PÓÜúÁAÕ4W úa‚𿲝ΫªªªÆ¾Ó«_Ÿ¨¦¹ù¨ŽÏ©iÞ¥ýŠMjš[®ù÷‰jš›;eºªªª{QÏÍ©ªªª±7|°ýÙªªªjì%ýò³ªªª{ÑÅwSUUUc¯ÿé~UUUÕØMÛ|¼ªªª{ÃæsÞUUUUc/êßí UUU5ö’O'RUUUcoòû]£TUUÕØKKGPUUUco2»Ùoªªªjì:OX¦ªªªÆ^ôðú–ªªªjð»M¾RUUU½¸Þ7cUUUÕØKnîs¡ªªª{㮯ܥªªªÆ^üë‰Ç«ªªª±—ö_Q¦ªªªÆ^ñôŸ×ªi®üxæÉjš+ö›½·šæÊKzþŸšæênWÓÜbÛÊjš«ï®úDMs‹{Ï}VMsÓ7rKÕ4W6üßéjš›Žÿýj5ÍÍ.ïßZMsõ.ßܬ¦¹E³«×ªi®º~Ê*5ÍÍ'ݶCMs«y¿ÎVÓÜú²û*Õ4·:áÕjš[ÿ£üz5Ñkꜥ¦¹Õ’¯«Ô4·^þÄyjš[-X¿BMsË;ç½®¦¹ÕÓ—7RÓÜâÕçZ©inùäù_¨in]z_¹šæV×—ª‰.;~›šæ–'îÑ_MsÓ«Û«inöüÍÕ4Wìþô»jš+ûïÚCMsÕWLUÓÜ|žCÕ4Wý¾d˜šæê_ÎúPMsÅu_½¯¦¹rÁ¼ jš+Þ/k ¦¹rÎ óÕ4Wm™‚šæêÑ­.UÓ\5õÌ–j¢O¾†šæWW½ô‹gÕ47oßþ5ÑŸ0DMs‹×wlW}è9?«‰®÷®šææ³V|¨¦¹zèƒóÕ476ã25ÍU+ÎÿIMsõöS7«inþXáj¢Ë{,W=õ©SÕ4W¿uhG5Í-ò*^TÓÜìË ;¨inþÕø{Õ47[±Ç#jš‹¯ú}¦ªªª{‹/¾¡¦¹júÒ†jš›¿<ú`5ÍUë줦¹âÉ­ÃÔ47¾i`?5Í•£>>WMsŲQÓÜ`qûkTUUÕØëÏžÓEUUU½xï¾+TUUÕØë}Þg™ªªª{óû.¹UMsõ¢¡'¨in>æ³gÕD7-ÎÔ47ûuù!jš+ªîz^MsÕ9ÃSÓ\ÑvÛÔ4W_ò•j¢¯_¢¦¹ê_ËZ«i®ÞwïCÕDgçç«i®l4âv5ÍÕû]?^MsUù·cÔ47¹u—_UUUÕØ‹×í¤ªªªÆÞ¤hûUUU5ö¢¥ÿ®ªªªÆ^ñZáÛjš+;Þ\OMsż«Õ47›óÆ05Í•«n«&z÷¾?«in¶ð®r5Ñu룦¹é¶nUUUUƒoûìUUU5öªêCUÓ\=mö5Í•s›OUÓ\õË ÿªinÞzr5ÍÕ7üV©&úö/¿U}ü›Ï«inöÎújš«û|¹šæfU¾TÓ\yUñ@5ÍÕ»}»JMtÕ‡¨i®ZðTO5ÑKh¡¦¹É²õ?«ªªªÁ·¨>ZUUU½ô“ýÞPUUUc/+óUUU5öŠ%ïlQUUUc¯Ü0y–šæª¯ŽPÓÜìëù«i®<²íÍjšËO+[¥ªªªÆ^ñÕ~-Õ47›Ù¶§šæ¦¯9CMsÅŒqUjš+ßxõ5ÍUÍξHMsåU;RÓÜli¯§Ô4W]7ñ 5ÑûÕÙ ¦¹rÊâáj¢×Žª§&úâ—ŽVÓ\Q¶ï¯jš+‡´‹šæ¦³NX¦¦¹bü˃UUUÕØ›-ÿc šæòSFÍSÓÜì—{òÔ47ýdËx5Íŧ´™¦ªªªÆÞ쬋6©i®8bÉkj¢»?3PMsÓ×þÕZMsã·[~ªªªªÆ^Ùäƒb5ÍM/ÿf‘šæfkæQÓÜtùòÕ47Ýx®ªªª{Å€-STUUÕØKgÜÙ[UUU½ÉÃ÷QUUUcoübþUUU5ö’ò%óTUUÕà‡Ì>CUUU½ðøÂ᪪ªj쳦þ¦ªªªÆž¿å‚¶ªªªjì…Óî^­ªªªÆ^0ð UUU5öÂóÚ©ªªªÁ î±\UUU ~s÷cUUUÕàO;ø>UUU5ö¼c*ßQUUUc/Ìi3JUUU½`y6DUUU þ¹ž÷©ªªªÁWœÚNUUU=ÿ««ªªªÁ7>²HUUU½àÞª«TUUÕØó>:w˜ªªª{þåGž¦ªªªÆ^xÚû©ªªª±ç÷{wUUU5ö‚¿]ÝWUUU½nqÉiªªªjðÏ}󅪪ª{¾Ï.SUUUc/(_u€ªªª{aYÑ,UUU5öº}º¿¡ªªªÆ^8wçEªªªjìu—Uí¥ªªªÆ^gJÇ¿«ªªªÁ/빯ªªª{þO÷=¬ªªª¿÷ÿWUUUcÏû÷Èfªªªj칋Ç®ªªªÆž×~s/UUU5ö‚çî~JUUU=·pv;UUU5ö‚ŠÑsUUUÕØsß1VUUU=§ßA TUUÕàË?«ªªª_oí(UUU5ø¥O¾¢ªªªÆžßçÔ7UUUÕØs›µIUUU=ïöU﫪ªª±ç¿ù÷AªªªjìuÖµûHUUU=ÿª‡»©ªªª±×Ùc×=TUUÕØëýw䧪ªªjðÍ·]«ªªªÆ^¿øÝUUUÕØŒºb’ªªª{Á±SUUUUc¯ÓtIUUU5ö‚kÎü@UUU½Î{Þ©ªªªÆ^¿É§‹UUUÕØvº«¯ªªª{ýÃ>~[UUU½á½ž¨ªªªÆ^Øë²ËTUUÕØëœÔàzUUU5öº·ïz™ªªª{›Ÿß®ªªªÆ^wæÂ‹TUUÕØëm8s¬ªªª{‰-RUUUc¯ûúY+TUUÕØë/o‡ªªª{ÃòM©ªªª±×ûþ‘|UUU5ö†õ_½PUUU½Ñn? ªªª¿yÛ3ªªªjìEuæÜ¢ªªªÆ^|Wv–ªªª{ƒ]ΣªªªÆÞpZËcUUUÕØëÿý¸sUUUÕØ|µ×gªªªjì~9gŒªªª{ñ¼Û¶ªªªª±7ZVoªªª{I§íUUUÕØ‹Žý鿪ªªjìÅeCKTUUÕØK‹»^­ªªªÆ^Öæ‚ñªªªjìE­zœ ªªªÆ^’ðŠªªª{Ù⾩ªªªÁùaªªªª{½)'nUUUUcopÕ^ªªªjìõïÜ…ªªª{ƒ ê®WUUUco´zôNªªªjìÅ×ÿ½ªªª{£6RUUUc/¾ò²Åªªªjì ßg_UUU5øƒ¯¿YUUU½Ñúí=TUUÕà7]Y¨ªªª?ãñûTUUÕØ‹OXÑIUUU½Ñ+›{«ªªª±·Þí~UUU5öÒ…Ÿ¨ªªªÆÞx×¼|UUU5öÒG,SUUUcoܦïkªªªjìMfÎªªÆ^>ùû.ªªªjìMVõøTUUU½iÉÚ«TUUÕØKwûcµªªª{Ùšy—¨ªªª±—Ü´%GUUU½¬rÂ,UUU5ö&Ýfªªªª±—OZÓOUUU½ñáãWUUUcorÁœ¾ÑUUU5ö¢ G/TUUUc/@UUU ~ƈͪªªjðÏ^qžªªª|£%ªªªªÁ_>´ªªªü ·ç¨ªªªÁßrÍyªªªjð¿=ºZUUU½¤ËUG«ªªª±yu®ªªª{ÉÑo\¢ªªª¿Û;©ªªª±—þóþªªªjì%Ǿ°‡ªªª{iã“rUUUÕØË¦·ªTUUUco|IÿѪªªjì¥ßWÏTUUUco\8ô^UUU5ö’Uשªªª±—žÞîhUUU5ö’7~ýFUUU½ô„>G¨ªªª±—PpŽªªª{ã=>{[UUU½¬|Ý‹ªªªjðÿ;pwUUU5öâC/®¯ªªª¿dû-ªªªjðÃ6ªªªªÑOÛéUUU5øÏ7þ ªªªÆ^²ëĉªªªjìÅ‹þïRUUU5ø×ïxMUUU ¾cù{ªªªjðEå÷©ªªª±­™×DUUUþúTUUÕØ‹;5™¦ªªª?ãØºªªªjìEëû/RUUUƒÿx몪ªjì%‹:\©ªªªÆ^Úî’1ªªªjì%ƒ7OVUUUƒ¿ý¡UUUÕØKŸ¼à,UUU5ö²þ<®ªªªÆ^Z¾¸HUUU þ‚¿ß§ªªªÆ^ü`§TUUÕØKÊ—V¨ªªª±·íú¾ªªªüüEÏ«ªªª±—Lû~7UUU5ø'»´VUUUc/~iÿ_UUUÕ࿜ü…ªªª{áÀʪªªjìŸüq­ªªªüÀ»©ªªªÁo-í¤ªªªÆžßçº|UUU5ø7ÛüªªªªßfÛ=ªªªj𫺶VUUUcÏ;þ³×UUUÕà´,SUUUcÏ_öüHUUU5øO&^ ªªªÅcªªªª±çιPUUU=ï¾®UUUÕØsç h¥ªªªÆž¿næÃªªªjð-&½®ªªªÆž;òþ;TUUÕà­ÈSUUUcÏëqеªªªjì¹#†¥ªªªÆžóæsEªªªjð—<ùˆªªª{î‹ëoVUUUcÏùlì&UUU5øáã7ªªªªÁïwöùªªªjð{l¹SUUU ~—{ÚªªªªÁWoú\UUU ¾´Û媪ªjìGþÐDUUU ~è^«ªªªÁ?tG¦ªªªÆžÿÉ åªªªjì¹gü²ZUUU=¯Î)UUUÕØs¦ï¶QUUU=·üŠTUUÕØ ë̾\UUU=ÿº³«ªªª±óÛ ªªªjìùã_ÿVUUU=÷ò¹/«ªªª±ç{îoªªªjìy·O­ªªªÆž³ç檪ªjð-¦>­ªªª_¾ûUUU5ø½^½^UUU ¾üãÓTUUÕàK¿¦ªªªFÿY©ªªª|³GŽPUUUƒo¾é^UUU5ø^¯<¥ªªªßöÜKTUUÕà»Ží®ªªª¿ÏÐãTUUÕàw߸³ªªª|ϽڪªªªÁŸû­ªªªüéÿþªªªü»ïMWUUUƒ_ûd+UUU5ø#+'ªªªªÁ¸íUUU5ø/4QUUUƒ¿~\{UUU5ø}^®ªªªFÌUUU5ø6û䫪ªªÁW?ø›ªªª|ñ»ªªªªÑoÿ§ªªª|å¶ÙªªªjðU/\¤ªªª_²þƒUUUÕà[}r”ªªª|Ù;g¨ªªªÁ—Þ{ªªª|«Á{«ªªªÁWö>CUUU þo§äªªªªÑg«ªªªÁOÙë>UUU5øs›}¢ªªªßuÂÁªªªjð»<ÿ¹ªªªü1ßQUUUƒß§õDUUU5ø²·ZªªªªÁwï³DUUU ¾é“#UUUÕàw)WUUUcÏÝu˪ªªjìy/|QUUU ¾Sñ£ªªªjìù]–߬ªªªÆžÓòÕÓUUUÕØsÇ}X¤ªªªÆžÓyŸAªªªjìyå婪ªª±çúã`UUU5ö‚q·=¢ªªª?oåsªªªjì…«ëMVUUU£Ï®ªªªÆžêñ©ªªª±×ÙsÄ:UUU5öü6ªª?f^UUU5öœ®·SUUUcÏô¼UUUÕØsÚ»£ªªª{›_]¦ªªªÆžÓ¿ú©ªªª±×=®áUUU5ö‚ú+sUUUÕà;59FUUU=çÒC¾RUUUc/XYñ®ªªª{né¾ÝTUUÕØsl=_UUU ~òù½TUUÕà/<àSUUU5øßÇT¨ªªªÁßsRgUUU5øw ªªªÆž;bîUUU5øËº]UUU ¾îßïPUUUƒ¿ªó»ªªªjðËŽ›«ªªªÆž×÷”ÇUUUÕàœ~Ÿªªªü m³TUUÕà7ôZ¨ªªªÆžß´l£ªªª{½÷NTUUUc/8cŸUUU5öú»=T©ªªªÆ^Xø¯}UUUÕà;Üp¤ªªª{îôEŪªªjì…}>FUUU=ÿ ?Wªªªª±78ëÅ÷TUUÕØ 7N ªªªÆÞ(ç”UUUÕØë^öâEªªªjð»-§ªªªÆ^烒«ªªª±×+Z2MUUU½þèkUUUÕØó:ô¾[UUU þ§G׫ªªªÁ_µìaUUU5öü™E‹UUUÕ௪ªªªªÿÎOTUUÕØ Ï»NUUU þúÿ|¦ªªªÆž·fà4UUU5öü§Ë~SUUUc¯›õþZUUU=ÿˆF©ªªª±Üÿ]ªªªjì…­Û¡ªªªÆ^0kâɪªªjðŸmo£ªªªÆž[0v°ªªª{ÎÖsnQUUUcϽaÝ UUU5ø)'?©ªªªÆžsÛþ§¨ªªªÁŸõ¯‹TUUÕØsÛ¬©ªªªÆž³±ÿ$UUU5ö¼ýG¨ªªªÁ—´AUUU=¿n‡jUUU5ö¼ëzJUUU=÷–ƒ®UUUUƒ¸ôªªªjìym_yAUUU=÷îçŸUUUUcÏ9ü?UUUÕØó¾<©Žªªª{ÎÂm7¨ªªª±ç?ýjUUU5öÂëÞ¹[UUU½Î/|¤ªªª¿zÓûªªªjìõñYUUU5öÜzóÇ©ªªª±<¾WOUUU5öÜI¿ß ªªªÆ^§²i•ªªª{Ý?ÊNWUUUc¯¿à“-ªªªjðCÊNWUUUcopGŸ&ªªªjìùëvZªªªª¿×¬_TUUÕØ ޽òUUU5öüëì­ªªªÆž·låkªªªjðeOVUUUƒÿßIÏ«ªªªÁ÷yüGUUU5ö‚5ú¨ªªª±çoºlŒªªª{Áy¾UUUUcÏŸ|ç窪ªjìy_çܤªªªß÷Ë#TUUÕà/÷±ªªª{á{óQUUUcÏë}îcªªªjìuŸØ°QUUU½`içaªªªjìõï¹þUUU5ö·lx^UUU½Q£~TUUÕà{QGUUU½hâß>TUUUc¯»}wUUU5ø†¿LZ¨ªªª¿`‹ªªªjìÅGŽj¬ªªªÆ^ô]ŸqªªªjìÅ«—ŒTUUUc/¹¼ã骪ªjðoíøMUUU½°å3Uªªªjìuvºžªªª{þ-oªªÆ^ðtõMªªªjðß5]¬ªªªÆžÿÈ•_ªªªª±º{…ªªª{Á VUUUc/l²y…ªªªüÕェªªªÆ^𑨪ªªÁ÷Σªªª?ø²2UUU5öÂíKŸQUUUc/3º¡ªªª{þ’Õg©ªªª±Ôm|œªªªý©¿©ªªª±ö¿îUUU5øW¿¹\UUU=ÿeÝUUUÕà—–Ü®ªªªÆ^øçN¯«ªªª±×i4¬Ÿªªª{áuÏ£ªªªÆžyiµªªª{Á9uG¨ªªªÁ¯ëÜOUUU=ï™üóTUUÕØó˺/WUUUc/XrÕÁªªªjð_¿q€ªªª|ÞcUUUÕØó6Ÿ4UUUU=¿÷„«UUUÕØóöoö¥ªªª{ÁôW«ªªª±çïÝ2_UUU ¾Wƒ}UUUÕà/ëÔMUUU=ï² ïªªªªÁ|¾ªªª|á—ß©ªªªÁ·ûb•ªªªü°Óÿ¡ªªª¿èØ«ªªª±ç¾4òYUUU5øG7®ªªªÆž·¤CCUUU5øÿ®û^UUU ¾ùέUUUÕØs§îQ¬ªªªÆž_µ¹¿ªªªü¯¼¥ªªªÆž»â¢/UUUÕØó¦ïx@UUU ¾r§‡TUUÕØs_{žªªªü¸ÓªTUUÕØs>¹å@UUU5ø/G4RUUUcÏ}æÏªªªjì9ï}–ªªª{îÖ—©ªªª±ç¿>òUUU5ö:û4ýEUUU ~ùÓ_¨ªªª±×ýõ±BUUU5öú7ír´ªªª{Ñø“g«ªªª±7ht¥ªªª|Qù… TUUÕØó×ï}¤ªªª{ᩪªª±×9{㪪ªjìõ[Ÿõºªªª{Ý_§.UUUUcoø^“ßUUUÕØ‹zÔ롪ªªÆÞøéÒñªªªjìe‹|EUUU½bоKTUUÕØËú´õû:5Ñãîú6寚¿-é¹E+SÞ5wåü¤ŸWpÊ»½¿k¿¤/{ïì”w¿é?SÞåÄwf§¼[—'¥¼ëÊ9û¥¼{Â#’>sû‡)ïÑ­ãÁIoûÛåIÿbeý”n[>FUUU½~û_ÎRUUUc/˜ÖóUUU5öº?ÿ}€ªªª{Ñ»Ï=£ªªªÆ^^Ñvªªª{ÑÎ nUUUUcozæÝUUUÕØów ¡ªªªÆ^÷µç—©ªªª±L:ãUUU5öúåÃ?SUUUc/ñáÿTUUÕØËGm½AMsÕ%MÞQÓÜta×Ájš«ÿxãojšK÷ÿ-GUUU½âÓ;׫inqÑŸ÷¨i®ìöÖ\5Í-·\·¯šæêV#G«inõVý–jš›¿YMs›Ý*>PÓ¼s‹ïVÓ¼k›ÛïUÓ¼ËËÇþ[Món§x¾šæSÖ-RÓ¼Ó©ê©in¹èã+Õ4ï\ÿåUjšÛߨtºšæ=rzÍQÓÜ᥉O¨iî4¹õgjš;®›s’šæN.Ý#å]sOm•ò.;mòn»ôMÊ;-ëöššæ®£OKy÷Ž·÷Oy·iOÞ˜òuÛÎOy·'.Jyü“îJy÷ÕyÿIy%}z$ýÞé祿çÑίÍ^­¿jU›=·¯ü½6{ýçÞµÙ³äÚÃjõî®kuöµOÔf¯þŒ®ÕYcÊjõ§ýÞÿëÞƒ?ÿ®Æ.‡t¨qîÚƒk,Z{g­N*9¾ÆûZ6¬qżÃjüâµëþºÇÈÉw¤¼ç^WÍJyßJ~MyÏ+Ÿ\›½†¾üX­î\«¾9¤V~¿®V_¬~©V7{³6{×é5°Æ£?\VcŸ[›×¸hýM5fM¿©ñÒofÖx~ýwj|èä}kÜôˆ¿ÎʶϮ±`T;ŸýÙ_÷¾é—Õ5~õ÷5¾zFß¿ÎÊî? Æ6§¿^cß±[²Cßú<´­$õÓ…Ùî[˲~|‘õ)}";$÷“쨼Ù„ÁyÙ˜ñOgç-лôÖ͵:¥tzŽ=»ÆW´«ñó÷VÕØ³SÝ ÙRã™ó†×øŸQ›j|iþ7Ÿ°é¯{ï(Ûø×Ù®ÿ}·Æü‰…5îÙ÷È[ÞзÆ^Ÿ|” ¾1Øsl6b§Òì€_®ËŽ=«GvÄÉ·e'—=œñ¿Û³iOý˜]°çUÙ¬iOgÇ·[“MºqY6áÛ-Ù…ßæd7<.›;æ©lvåÙ‚ã²öŸŸžý­Éì¬ûw#²A~Vï‰ì¤[³‘»ŽÈÎ(™“õ»ó‰ìÈfeþmŸ¾0ËÆsTö§NÈÎ:íÐlZá§Ù¹Ë¾È.þ¸I6õÌÛ²Ùÿø9›{ÁæìÒCwÍæoj›-ÚgG6ã°ÿfs;î—Í18›·u¯laDZ٢6f /–-üõ¨Î\Ÿò®‹”ò.S¶ý#åÝ®Y\˜òîg~Ê{Ütõ¨¤w?ìÜ”÷ì×uŸ”w½´Që”w¿d̰”w[°û])ï1°é=I³ÓÕ)ïyqÕÆÚìUý]ïÚìùêÄ)µÙkÖ¡uk³gƒ“þ]«—¿ÿ{­¶î¦ZýrÕiµÙ«ËÚÚýdPN­.ùÇ£µÙ;ÿ½k<¨^÷Û¯˜Pã?_yå¯{v½ºs­nèõ}­.~vVmöÚk§±µ:gkçZýcl›¿î=ìø;kì8xD3·ט;üüZ=aâòoý°ªÆÅù5oúù¡¿î•sA¿Z]óîeµ:nÏÖfïê+W×jË’wkœ¼v×n}K×Þ;ºÆuãæÖ¸ã„5þ¯úؿΚÕï¯{Ï|OÔý¨Æ›ž}¸Æ­ï¬ý묰Ʉwß§¢Æª+O¯±óŽúÙ~‹.ÍúœòB6¤Yeïkï{£Æß}¬Æõ74üë¬ÞÐ'jlö^E]†µÍ>¼ ûÛEc³CÇÞšui¹´ÆA½6eÿw`¿lø~Of'uú¡÷7Ÿíó×Yë»ÿYcÉ’E5îZý@Öwù–¬Û°-Ùþ‡Ü‘õ^Û.ÚzHÖÿÓ³#gOÎFž17;íë…ÙØ+ÞÎÎ9ñðì )Yv\Þ-ÙQ{÷ÎÆÝM¼¤:;Ì윶«³‹Þ86;zêYÙ)Ý‘¸ÛÅÙ¤&fçwþ,›1jX6m¯Û²Yo¯Ë&å¥:zíT›-RÍQ=Æ«6‘eÔ_õ½Uý¯Uíÿ¨ð*}Uù7Uȉ‰ªq““ªr«.ªú²nªøêÇ*ßãBßÉçÔß‘õU×›GT›i¾ªåµ¤ªÖŠwª^ËjªüÓXÕîy3ÕðÜ=Õäñ/U½äOU9¬ RÒª#Ö¨B‡«àr„¤ë icž[™÷'§³2âK®ÖaµRoô:¤¿&lLe§bµL¿SX¸ð+­°­O~áKê”Âé9~V*IºÁVæ¿þI¬T–棄ÏB™àÆ*rU¹p}Õ Eüù›*Ó¹ƒ*Ú¼ªôl±ŠŒ¸¬š>Û«ê7ΧZï©’¾!VÞ%d=žDé•A…Ÿ-­Šf¨«*V?©ÊTì jö-§*•›¤ê¹SM"·«¶U«ég«¿’ÿ§jÔÚ­u§ê4.¥šny Z-έþêÛSµ¾]Cµ›´ÒŒ8ÐF˜S¦Ð?¦½ó¹ºpµXN+å]а2¿-Ýd¥²¾ÈjeÎwï'\ovJØ5×[øîžÇJy·©%ø?í dye A;S©âŸ2+Wü~á?|](ýû‰ªö°—Šð~ªju¨‚WPµÏW »wWu«WV {ŒU3^W5—îTUzdTµŠLPõ²U *eWuÏeSu¶TM‚j¨Æ©Fùû©ú-ê©ú…Š«Q¥U¤‘WE¼;ªêýœ©j•­¡jíË ªú7P•#—«R#.ª2 <•Ñ;jîw[u¸ÓQµIÛRu>‘Auor\õލ¯z$¢zÎM¥þÚ{Fý]iŒê˜dœú»ùWÕ½TWÕ­ûGÕ5Ñ>ÕéE¨êýW[Õ}Dzÿwu¨êÔ8Ju¬ûÿ½]Cµ|á¦ê¶¯£:=ΤZ_¯Úú¯W3Q z­U•;RÕsû©’×ú©Žß‹«.ÉÛ«Žcß«ŽõÛ¨Ní ÕÎ7§j×ç™jž²¥j¿×[µûÿηʯZ&9¦ZÔhûÿL TC浪Úï!ªiÍÁ*rH!U§W~‘%V•Íé§B®œTæ‚k*߬-ªòÁBªxÎzªt£Sªð®Æ*«[5!òw:UÆg›ªÐúŠr |£r¬ý *Xðœbe~™¼UØQO8îýN7iº•J}ï•yëc9áÃ*?aóôç‚*…jM:]nÒÝ:k¥Zª¹ªÑ’ܪñºWªvÀHUó¢—*Wb…Š8ØMy0IÕMVDU¾úQUë[[…ï{¬‚;ü¢O ‰îü#¤ª?ÆÊ¼u9·•*Ÿò±R‰ÂT±¯STÀ•¢*s÷ÞBÞK‡’›¬Ì™2 [ÿù(œ¬™Y˜tÉ_8°S÷ïaáò·BÍûŸ¬Œ7çŠë0 &n¤ÃèXþŽì «œ)¯OÕòœ)ÇBœÉ/ûëžœ©ïÐcœ)ðØ™N\iYO' :7{Ÿ“…]–ÀÉÓúp¦ÂǺ¶r²Ðôu+:Yðº­ÁNz­ÇA'˵xÙ ÎTÀsùhΔ§z£hÎTpãá÷œ) oX'+ì6Ñ×É“]^æd…϶ñr²QóW;YØè~Óœ,TÅp2Wšy‰,ðÚ¾äN<ëww' šïZèd!¾lv²Ðg“«:™+Ý·]Z.ú­¥þõÞ: Ÿ=[u„x±ÍÉ\sßåÒaTí©ÃuéG;Æølµt„v)|ØÉÂ^7¾êhù_÷p2WÊ'´¬¬5OK½o_´ü̸RKôGoF)÷':\ÿM8«Ã˜÷VËû-)u˜5¾•¢r6†ú »º/J,Ôœ7VÈ¿70øþaþöíÂÕÓ­„˜%„wrYåÝÐòïã½ZæÝm­ÃôX±H¨ò×^!÷Ú©B¯ÜB ¬ÂÜKO…Ù{Û*Õ.5Ûh¥¼|»Y™o÷ÄY)ß©O¬ÌYKNñþ6Î>+<ÏñÖJ%Z×XÈž`´ªÍmÁϬnv.h¶“¹¢_„ë0JGÞ×ázÝG‡1½QI®6%+:™:`«–ë~µŒ*¤ÃÌTº“ãùÉœ:ÌòŸ ÓJ-:Voé%|9BË„Ú ×V¢­®W.'œÈ‘ÒJ¹ÍbeÞi¥’­{%dJùQðÿ*ä\0T÷ÙÊüúè‘•ò.xöª(d>:YÈ·{»yL(²Nð/2ËÊ4úÜFÍw õ‡üæ»ov¹zoæâÛµRn[™+6þ[N˜6u¥p8¶§ðpð1+•ÄõÉÊü¼¸¨•J¹x‚”+…còL!mÜy!×+!ÿ×tB¾>í¥t³„lMK ™ê¥r½-d‰ r„7•'|¥2–/x=Ý`e^g¥’OÊge~m4ÖJezßF(8óP,oUþDUj]UñTyå¥*’÷· )?C•hT_•­æ¯*Ç{ª î«*g穤¶ ~m\B†,¹…àvgãGGUzkCUôi¨*›#¿Šˆ]¦ªϧ*K¡*ï{«J|ϤÊ-ùÿOÁ>ª|¡Žªb¹ëªâ?‘Ê]•ß}BU;Ö@ÕÚ}EÕH^ZÕʾ_ÕiºDÕšç«"¯…ªêþáªFÙxU³ÇKU½KUUm_¤ª^®Žªxv«ª´»µ*3­±ªÖw‘*ï: "*W%UQA™û ¥+ý«\ÙÆ*5û¾ò/öQe¼O¨:¥¼ªìñTUÚRV•oíRå*©bÓŽ¨’‰ÚªÐÕTùûcU©§¯TxÐ2UduU°r£·â !qÄ=Á§Ý+óé¡qV*÷à!D}VÅ +×ÊHU"Ïå?2FPå晴¥ë¨¢>oUÉþ§TxÏÿT¹£¹Uø¥Kªl—ªÜó~=ìÿî«Ùï¨ðˆå*<`*um*™ò©*ñ:L™+Ï©"®>*xHûP(–ø‰*q©†*–»„*^=B…Ôn«Ìø©*ôú.e^œ©Š¶›¬Š|ήԵ¿”qÑW•³IÍ¤Š¶š©\ÝÛ(ÿ*>Bpâ BÖï…b[~ªýó•k@U¨ô@•ez!oý¿…¤C[X™¿ë{ q†pãxjaq÷©VÊ÷U´•ù~d+•0欕ŸîÓÂ[Ú¾º0;å¡r‰½V*ÕÆËVæ½Å¡Â×R‡…]§ Kç5ž m÷ZÈ{o…p>ánaVâ÷ÂÚ·™„W¯¹t1u6ëp]:ßH‡²ó›W`¿K:ÌqWÞ ®žBƒJk„$77ZÓßM×òÔc—–ÔCë;tÍÉTØÌíÊôT*lÌzåêæ¯B‹MB¶Ô †ôò†½RTn ¤1ÑÊüñò¤•ò_XLÈö¨¢ûç!õÿoV^ ƒ¬Ì[ "G ûŽf?|.¬¿vJ82¨·0yRK!àD –!U…¶­Â…±;º Æ›åVÆÙíwt¨Œ•³ Ïe¼“~±2_öº"\òIX\ÆOˆ9”UÙ¤ðg^&!¾ÅoáqÁ1ÂÖˆÂüÛ-„z÷† ÃZü%„o²z¤Ãhõi¢–C‹”×ÛÄßuý[ÒáëöI˯÷Iu„½tß©#´fùûN6=:ÒÉ‚cÓG;™kÈùö:ŒìÊépí)™T‡ÑöLj-ýþÖaæêYEè\±‰P²b¼0vÞ`Á³Ñ'-MúŽæ/òÖ¯`exÔ¢eÙ]7-%:Òò ÎPf²õ—…ªÚ¹Æå:4) Ly+4OXrÐÎ…\еþ(Œü0C¨û©œ0sìIaK³fÂúÁ¡ ­„—-³ +Ç ×6Üv š*<ÿöÕJ%øöAðM¿HHÒì£nZ +ótՄ·'Ó…[gÛY©×ÞWöé¾Rõï%¤mMÈr~‘¹g}!Ó–a‚ïÊÁB*÷VVæ÷§­”G«rVæ½J]­Tº7„äþ³…To Ú³2?n›#6U¸µö/aÃ_«…Wõ[©Ä“£¬ÌoµN[©¤z ©K]–ÎTRŒ’(,¸çp’Eµ(&$ËTMð®ÙFðØ×GðºÞÜÊü1ô’•ò:‘ÒÊ|7xˆðçTYáf®o‘ž3„YóZ ë]{Ý^)"îJ¸>声!÷"avŽ>B7žÂÐßi„`ÓÊU¢Œ3}£!:Œ{Ct˜wõÚ#å z¿Þ!t¿ØOXžâƒ0¶x”°-ÇáÜ÷F§›ÿ ·~÷~¶é&Ì^›O8YGX~3Rˆ7 O_¸¬”[ËvVæ»æ»¬”{Z7+ãý?³t˜åïlÆ•[&45A˜=æ°Å«“–Þ¯ÇËz¦Æ–ð68!líY[¸Ñã–›å­ð`c„ð9ûw+åö÷s+ó[Â0áç+©¡ï„ç+ò —«OÞ¨&| T—˜GÂçÂÛêM¬”Ç7Áë{]Á3ýOÁ£ž§àSr+óž¬Âדg…kÇÝ­T¢‚[£‡‚û‹]Væ§¾ „g7<…#ÆzáZt€°yöáp·÷œU±ÂÆž_„æ ¹çMÖ2?]N¡yÿ†Âèý%„ÓîY·¦¥ÓaþØþTxÚ&ðo³äµOí„£«ã…… »Û:­Æ?J+< i _²D¸>÷¦síݨšÐíÇûÆ1`sgO%6Wëba`s3t67/ûL`sM“¼67üäO`sù¼6š.°¹A1~Àæüöô6×Úô6×òxC`s^©»› ÷jìÍí®zlîCžmÀææL^ lnÛ¶¤Àæ†ôô6wIö– ¸Ì%`ono:gö–`ÐýÀÞܦÅ-6×gÊ1`sþÍl®ç‰`oîî[¿{K°ºu`oîI:¶ö–àhÜp`oî9²g6WÓÃØ\ÖÃ÷€ÍEdjl.ÝäÀÞÜ ûìÍ=ãñ†ÀÞÜÿ¼ìÍ=ï´®Àæ*.ó6g†×6Ù3°¹\Ÿó{s»»ê:°7÷Ê?›Ëµé°7·þ‰€Íõj0ØÜÐ|áÀæúWßìÍÝÛœì-Á¥ü]€½¹§X¼Ø[‚óÙ{s›Sä-°¹ «ª›{éûØÜÉGk€½¹ûL_ì-Áß:ÀÞÜÏö–`áœMÀÞ<òEuö–´läx`o+šçö–,u¶ÂÀÞ|R&iì-cÓŠ]8Söà{ÿp¦LU}+p¦õžàLiTù`o™SÍ{ À™rVX1€3e^u¸ gÊ•2ÃbÎäéÙc(°·dó3¾öæéº•Ø[²©v{óMâwØ[–<p¦\«wìàLY¦—ŸÀ™rû~À™|§—¾ì-ËóUß8Sî)g²p¦¬¹|2p¦Ü§æ]àLyc•àLþ~Zp¦|ÿå= À™:? àL…«tJîd!ç?q²Â?ÒMu²ÐqŸÚ8™ËãÅe'3R•Ò³é–ðWQZ^y×ö>çx®ýµfkÉ3±––Íë0†é­Ãô-zG‡±²äfª^™„j-¾ 9ÊlZ„¶ ž–³±“…yÏÙêd!™ÜO8YؘeÌÕôÄ.Fž/]t¸f¼sÓaÔÙ¸HË…ïu˜…×=zúoÂGµFüë#¸¨¥Ö²2¤Te…ÖWj ³.ßµrœ9K‡1fÆ8®ÏW«è0VgÈ©ÃÌRs§–^Ï› ‹²F\½/¬¸!øÖž.D.é"äœÕNh™ê§0áË_Âúk·…±„mYù} ÏÀ™ûMÀ™òï;×€3L\ÒÇÉ ¯ çdot²`o¿‡N2ßèìda¯¦4w²PïÇCœÌUrJi'32û½Ðrfâ-¥çÐò±ÚmfP¦ÄB·º—…â§2 C+ Qé»»&Ì¢ß~ögK$T]IóÐShâ&L¾üSXÖE8x.¯°áŸSÂáù‡­ŒNê0SÄ5ÔaLÎúK‡™gFœ–¶Û3³:þz¼#DE¥¶Þè/å/ìô(›uSzâ·]o¼0&íaå¼Âžc5„c×n û·]Ž5¨nÚkÁz's%ùœIË뉫µˆ˜¥ÃðÞxQGèшïNæª:ö™Ã/¸°WϦueºtÒ²j]7fú°šBݱBÎð,B‹í_¬Œ¸CIu˜…ª•:½/¸*gú\x'Lr¿&¬kXQ˜¾d«°iN”ûñ_áhm¡©„ÃMk sž7¶Õh ,¸6KˆõUˆ›)òœ-ÄýØ'(2Ìʸsý?f©³…a«–ïöF¯ÿaeü×üœ³V“e„ž…Æóó Sþ»"D·»/ì.ú[X1·‹°·Ï!îq)aoÒ\B\ÝÙÂÎ)¾ÂšöžÂþRÂú›ï„ ; ‡š¶=É,L'lÎÙWȬ^ —Ý3‡ =²/f¶^-ìÍ2^XRè“p´Ò!!üÊaTƒÃB½ü£…©Nëê·âßv¬$\É“^¸QJx—·“ðÀü"¼]ñRøwòláqš‡Â«ôµ„M® OÜò ¯“ žN,<9Xxx­ŽpfÄ¿ÂÍÔžÂ{ÁBÇ‹›…¨2G…¡#¥ƒŸ ^nnö›${™C¸ýf0þËOaãhaæÝGÂΩ£…³Ã² wt.N­+Üͳ@xòïIáAxáQ½|ÂÍ3…s>…ÍÇÛ ‡ý~ KÇtî¥Ù#\è&ܬÓA8^o®³à‡0³)¬‰&ŒŽ$œüòCXéVAسãº0«w9a.„Öl*4¹ÿ\Èp)©°.¨µ0jè:!jï$¡ãöHÁçdÆÚk-u¸n©ÃhQp¿×°twt˜×ª7I# (´X éie\¼ZR‡Y8EÆŒêOµ¤*é£ÃåÛ¯¯–˜¹±:ÂÖÜ×a.ªùVˆõù ¬Ê×_8Ú®£pÕc³pëOuáÚíÂÊÞ¦⥄S=¦ 1=Çñù7 ×3.WùO¸z*‹PT¸ñKØ7 p:×aKºµÂ‚˜¼B·m]„)—Ÿ õ'6â2¾V´ vµé Ì[’XQ¦ºPêó ¡sÍœBÁ´Ó„}Û}„ó#Þ ‡ž.Œü-\öx"ϘM8÷«»[\:æaŒ ÂIö¹ •…S_^ 1Gþަï+l¸•]ØhD “Þ–º) Y_(6]˼Â߄β “7-êßè,x×’h[BFĆZŽÜ=¥ÅãxaËŽ q2cŠû®-S×é0*¿é¬ÃÕ®Úg¡×š¶r´??38Yáéã,äs³‰N´2ó,'+¸³Ú Î|7åG' lžÄÉ m4ÂÉRûôv2¿¸[8“yêùáÌÏ×Â鳄“åîFn–¯»"ìl"D58(œPV8²'@8Uî¨;ÁWØtá°0Ýs™°êkeaìůÂÈ&儲Ú =6ö‚ó/´2âGÕa6ïØMÈ+TKSIH¹>µ•±ðA!扂ó…ÝWC…£eó Ûv-¬ ^-Ìy!t_%Z}LØP­˜°@Ea喢”¢…Æ3Î c>—ªlÿ*¤íàÒat9ÔXËÇ‹~ZBûÑ’²™›—ï—ÄZN¹ÍÓvðì¡^3*;Yؽþ^Nð&—“™»žù ‹¿m¶{ óŠ×†Œ­!ß¹_èºÎG\UEØøú¦0}JmaÍæªÂ„?…–/ 9ÇjߊÒ6mke/<]Kâ~s´,MžE‡+¾Ò8æòæ¿…Q‹J ‹SÎ=‹r®?­eÞÙ«B÷ #…™+ mo ’Ç6ÐaŒŒX«Ãµ0n¶£~/®¥æë«rf„“·;TÖÉBôéád…W½øéd*Xp¦¼I__àL…òº¯àL¹¶¿­ À™ tZ6€3–ÎÖÍÉ‚[\q²À+š9YðÚØNVàsý"œ)ðr¥þNüvš§“¥líçd!YÝ}œ,ÌçÌP'sMY”M‡Ñìéw®1…tƒR6ÕV-]*'sí[°B‡1iU×¥«n:Œ¨?§u˜ÉZöÓÒfB7afI©Kþ:ÂÜ]„ŒEŽiéÝ9«õu¬0¸æ(aq—¦wDžعÑÂÖu…ƒE7 ºeÖG6öÍÙ)¬¾GØ‘¾…ppê agèPáàқž)c„å±i„]mN Ñ©ùú×2¢ýuaiôlaô—qŠ™e„ç µŒ¯¹YX]±‚0©¯KX{ø°;ñSáàÀ$žE…ƒy/ 1y_ G ÛîF ó3ý%ìýÔIˆÝPBØŸiŒ›þº°%:§0ûÞFaSÏ+ÂŒëµ­ÂÆ˜ÃœÌõâz9Æšã§´¸%ùKK̶$:ÂVêêdFÒAmµÄ m§Å×m¯–3ŸÛé0³\Þ!4©ÝTÈyg¬ÐÊë²0µãPaƒç+aF¡f¦ ù…|ë2 u  ¹ {ÿ'ÌÚûCØüß^an¦cÂÖmqÂß9R÷eÒ‹ÑÂþ¸_†ׄi…u]Ú“ÿb£Ý„ý©–K¶öµ/¬Y|_˜˜f°°êûaÜ×(!hPœÐ½Pu!tС÷øCÂüªM„íåj "‡ ;¶ÿ%˜¡‰…þÓ+ E— ù'v&<",¾#ìRo…ƒ§W{&U®.ì Û.¬a c3¿VË,ŒÞR8t¸³°g_O!Î+ìi2^Xî—Y•°¬b)adê®V#'ÏàLA¦×$' ßqÃÉ‚mìd!-j¼r²‚SvÔàLA} Æ8YH/W°“ذÕÉBüuØÉÂ^zìdF–—µ\y¢%wZnçýª#ì²[9'3òïý¢åÁâ›Zü®Ôò¤øf‰}…aÕ‡ ¥'t†_,$D·o(ì®—OX?OØÓ,R(›4±0²À`¡|‘&¨ú×…å)¾ {kVœö)+Äm\)ìÉaiÐ^aøšfÂáuÂî?C„#†Ÿ°§à\!úë[axÝ5Bô÷ÌÂð²…ˆô…ÑMæ W–ƨÔÂÊB¥…ý)ß «¼\Âþ›u„JLaÌËñBå3;„±½ aÕ±ÆÂ9ÒêÖ™…؈‘‘ø8aÏà«Âѽ„=ßw KC› û–®š# ¿[D8–7›°wq}áØÓœÂ¾N…eµZ #Æ–…„‘=ý¬ÂníàdFàÐZž~ ÐxÈ[ËÓ3þ:ÂnÍzïdF@¹rZ飥`6-÷ß^ÖaVisP{Õ%TÙÐ_ç=]Xý`©ûú‰°¦ôáà˜¡Êò츬e…*• ãÖ k&òY)¬Y²A84ÝŽÇ´ö·¨-œ˜Ñ@80(µ°"²€0jþRaå²VÂèŸ}…“ ±ê §ºÝå"¬Î¿IõDXóp»0¾W^¡òâ¹ÂØÃY„J+ÚcëÝÖ,úWˆsë"¬à/Ä5(TlœAs8“PáÈ(aLÂÙšÐ!nmaõ‰ÅBÜ݆Â鮹…¸µs„3½F GjÖÖ{!LÛFØðj–0ùòqáìzÂ1_!~ü$áø‡BÂfã0­Aaë¦RÂLßT”¥o„ÆÅ2ãÏ%"Kö²2¾„ÝÖaŽ.ÜMˆxqYv¾ŒPªä/+ãÆ×AZB Õá*­ÃHçL‡+Cù :ÌþÍ"³ÄF¡ûê BУŸVF\Ž:ÌŽƒw ­ŸTrgÜielòÊ©Å-×NaßÇ_ÖáºçVNGØÅ˯u„VK“ÒÉ ']2ÇÉB>¥[ådAø8™Ùô^~!kt¡A§ÅB†ý‹¬Œ%ɇè0 ßܩع¸™WÑTÌ,°û¤cb™?:Ì<[Öë0FϾ¢Ã•Í?ÈÉBÖ¨õNä_M9YȘ#wœ,(¡g2'+µ±6gÊ™¡c}Δÿæ–)œ)Gûëí8“™sYVƈŠ)u˜9ºÐa ÏÞX‡Ë·ñk'3s&‰Òa ÿTP‡™»áKƨ-ét¸Ò?˜éd!}{er²À× ;:YÈgNøi¸£™~ Æøª­t˜‰’é0¦^8®Ãå׿¿“™µÓÒ\Ÿ+ÔïwSH?­ª•1¯Öf“jÝ…Ì›ö -gÍr„Ý·2–}œ£ÃU®¿¿“…L~ÌÉ‚¼§7v²­û*9YPØÌÝN–דϜ)G­'8SD+^p¦ OàLž5ë,ö–<ë’h`ožµ#ª{Kž³ÿ`o¾‡Ck{ËZôT%ΔûÁ†Ñœ)k`ùœ)÷ÑT)8“ïâJ€½eõ,|€3å5p)gʲÓÇ€3åNé;€3yÖ-ØØ[òS“{óL½?°·äm®öæ;'ù `oYz&9À™r¬´€3e ôxÀ™r>¸^€3ùNÿì-‹ÛÓÉœ)g…/w8SæÍß²p¦;¾àLçVh À™‚†Ÿ½ëd!=Jw² íÓ:YHÓ‰¬`_¯‚œ)¨ÎWo' )µp¶“àd!Y'q²° » '3òvL¨åV›eZ²W/¯åJÙy:¬{âdFúo3µœÙÚDKʅ˵Äý“R‡Yîîrat¦_B™K„Q^É…Õ†‡÷#¥°jÐe!îg¡tðMaÄéñB‰Î¯…á­ª +£:q÷ú +&ç⢠çfìN>Ë,œŸ“^8ý®«°£Æ*aŽÇqaW†2Â|?áÂÔ B|ârÂÅ«…óÛ {=Ò Goø\¢S­жˆ†.^ ˜) ƒr–×n(Ä",}5B8´¥“:°’ЯÖw!huy¡Wàj!ºNnáà×Â≯„ƒ)û —jí.Ö©$\ö9, K%*ñ@X~&µpdD˜°zÛ"árÌ,áêš±ÂW¼pý¤¿püVWaýÑ5Âér§…Í¿¬ÂV¼úãd†g|Zv¾›¢Ãõ½mÆúüýt„8éd®'Aët‹cïëp]غF‡1ýí.f¡9­…®»Æ ~U½…Žïê §ï|J&DµY.ì_,ä:›Ph{£”-SS¡ED)„}éγ»®öTÿO¸2ù‰pó¦¿pew)áÖÕ.BüžTÂŽÆ»…‹!‹…Ý7› W6‡ wbB„+]ò ÷ºn®¬o!è±C¸‘åŠp8×a!c±QB£“¯ß°`¡Îõ«ÂŒÕÄ]„© 1n¦PмªeÒ$Â¶Þ „ñÙî ›WÕ.¿ž,ÜÿUF¸œ?ð°^FáÖ°„ÂñG¿…»ñS„3[*—2­õ¨ \88Ux\é’ðà×&á°Â¯RÂÕêÕ­ fÞù€3%ù{¢“ürÑÉO×ÉádÁÛc69Yù“–p¦ÀIû¯9YðÀ´Yœ,°HÕ¤Nœ¯®›“…5:ÝÈÉ\ûk…ë0F}ü©Ãµ¦K F·Ô u„å»ùÜÉ\³#Wê0ê¿£Ã5²äeFÉö/t˜ÙÒ—Ð2zZ¸°aF'aø•öÂÚ"Ó…Ô£öhxÛMX¹°ºÐóP3a龄ó>½„ÇW® ñ)g O’Íž=>%ü“j¥ðrÂ,áîÁ0áôöÂã§3„?ç›^¿ß*<ªy@x—"½ðl_g!ÑŽñZ:5M/,ŠÊ+´Ú$Ì/rÕÊx·×M‡Ùð~waÖâŠBÍ› „©gfGŸ7uY!Äõ))<ô®%¼¿¹Kxõéµð¡ò|á݇ÞÂU…û*VØÓÿ‡pçÕiácý¯ÒšÇÒ·âÂ×ä—¬B?6íçd®6§+é0ü*Óá*¿¿‡#õÆm:B׎¿àd®]rhù1:PKÊ÷µ\¯^Z‡q­}fĦ„ã}„’Ž £g5µ2Ü*©ÃteÚ( +VV(tn¬+üÜœVX÷è”p%S&ae›÷Âù›…›k¿¯MþMÝJ¹•Jie¬êš]‡™kÀ¡cS_!c™¦BsŸH+cZ©:Ì‚‹üµ,Y#œÉúZ˜?¯žpìUáíƒKVÊ-~­•ù:ÉN+åîjeÎløA8Tá£0éõ_Â^sˆð|ò^+åîae>îòÝJ¹mð¶2ÿª>AÈ›ç‹Ðeà¡àð¶VÆæ‡‘:Ì^™ …«îeŒñÑVÆÁ‹t¸H®#ìÚ$o®Ÿê Ž°‹6ë0‡7Z*”(º_]ï´P®ÕV+ãâ‚:Ìñ Uy “¿>êäLje<ý^A‹÷Œ¼:\ÉÑaä(ºK‡+W½c:B^Îót² _Ë;Yhžíœ,hÿ¸NfΈz&4ÙwB˜Ûã?¡íÕVÆŸSu˜ ‡ ]» –îÍ$ôŸ”QHVI‡a¬=£ÃU2ø™#rJ?®Gè0Wç>(Œð 6ìš$Œ]VEÈuU˶îe„É]3»«¼föû!W¨§ÃèÓ@‡kôMS‡1)Ñ ®è‘!:B{-¬àd…3„nt²ÐØqO¬ðÈ–Cœ¬Àäðùœ)gþ 8SÁ7Gp¦œŸïuàLfløyaþ%ÂѪí„è"/…¶ñi„l~Ý_TòÇüN·©.¬zñA¸0¼’°ñäCaÈâãBè_-„ÑŸ %·°2–þ¬Ã·<ãÀÁë:\/üÔa^‹ v\x%Ü^é-ìû,LzúL¨|½‹0+ûZ¡þ¢çÂÃ9„#¥b…çm‚„Ó³û žÚf~!,oxBèYËÍʸ3|¥–Çê0ÝeÕavï¤#,SÔW'+üo¼N6|~' î8bŽ“™oݪ ?¤>6Ë-ܬœLX_ó„0<{_aû€]¸wÛ…o]¿÷§~ùÍžíî(ì;ŸA˜žîŽp´ìGaþ´“BºŸƒuu›Ôaý;@‡1bÞÊm_e+óí¶,V*Áê+ós—_ÂÙø³Â²ú—…«ÍçëÛ´R‰jµ2ܪo¥<6·Ü>µ²2ï¼Ü+ìØ4SxÚ<“[p¨Ð¥oB!G†$—„€é7­Œ%ñ¥t˜c<Š»_¦Ýª)T鲯Ê8R¬Ž°»5ö8Yð»Á]ÌÞs¡“… y·ÏÉ ÕÈr€3åúô¸+gòŸð~gÊãögÊÿáE!Îð,E7'+|áëY' û¢›“î÷å§“åÏqd#g l¶üg mYµ´“¹Ê^v²Ð#ß;™ËË¿„“ýÊWÑa¦ëªÅ¨]k¬3¡¯–1 •°ýXahc†ïC…{&Þ.þ©¶@øµo­ÐýÊaå½ B› 3„Å# WêwþÛë/Ä_j)|y‘ÈÊ)RS˃­‡µ¤u{¨åPòY:Ìz‡¼…9ï•êN¦†eŽŸ¼(|¨tD8á.¼¾L(ž9•0¶Yf!(w?aÈ×Ò®Fï…§1Âfß,½‹Í­BÖW‹w²°]ÉÊ:YHÙ2•œ,¬Ó•ZNæúš]é0–Θ¢Ãu¦U¤cL¿r:Ì\ÃZ ]]Ý…tá—„æ3 «F† 7Ÿ ‹ö&.¤«!äI´PˬÓq‰m„‰'^ ±¡?­\«Š•Ôa4£Ã5Ö}¡#ìq3é‚=ZFù&ìX5Wè¹tŸ°îÜ'+ãYÂ[:Ì–Æ ÑGg 5ã: s–„[ùßX€3´¾¸€3å«u7€3ùKÀ™‚/í/ëda©º?s²àú9Yèê)‹œÌÕ(ác†O¿¡:\A>)µ¼uK‡qà[féD+…I}Æ A„-KXQÕ®é0sôì*t{™VH}â¸Ðtâ'+Wµs‡Ìèûâof–i%tåË,ÑòûiZ…Ï¿jêd¡fNV¸d³/N²Ø6's¹ýWÑÉŒÌ{}´œ­½N‡ëSó:Œ¥*ê[Ô«¹“¹bïÒa ê’T‡kVôiFÙfu(ÏO…„‡ƒ…Ľÿ<«'±2ß®Ï%œ8sRø²ïµpqän+•ø‚)xM¹+$>"$xÞÊü=¸…p+|±•JðÆ´2ˆ¢Uß8"¬.t)ûÒÊxsó»sSÓQÂÐ {„ÝgW ãÇÌRU¨C%n’_Hž¼†à9ú–à­ê žÍÖX™oGì±RIƾ°2¿ÞJe¥<Êù Þ߯ gäRTø[HÞôÁ­û7!ÅÕQB¢Ãi­Ì#=. 37ŽΕ%,.{T,Ø^ËÍì;„µ¥þýº/ì˜y@èé›Kȱ¹§0òX!Øk—•‘6é .×u¥6wÓá2z¹t„&OêdFï‹Ct¸ú5‹Óa,ü¯ÃµæX ¡‹Ò®w2åÞò¹"Ëb+óWû1VÊ»Ïs!ÕãÚ‚×…S‚ϰH!ù´-Væ×LK¬TòZíÌwO3[©¤›r i¢› )?Õ|‹w|Þþme¾=œS8*|¯)œõð¦Lz'”Y¿K˜3•PwÑ}+å~*Ÿ•yýû7+å¹-§•ùèË aå’ ¡Ãý®ÂÖ‹­…¡]7 ÏþYk¥¼&´2ï%ëa¥<|«ý#¤íQHHs¾›¾g+óꔃV*Áæ¦Væ™Ác„_·ZY)Ÿ§… Ïê ©Ów2Í*$«3ÙÊ|wß×J¥Œleþ˜$Ä6 &æL#œ)¼M˜›ûƒ•J3ú¹pð!Ýg7ÁëÓ +óFÐcaùŽ“RU„-G••q¢Z®Ç«^è0~T¤%SÐ"aÁ9™™5‹£ú–hf›B}ŸbW…O¾ ¹ô°2ÆY§#ìDêLNð9íEΔwKÕôœ©ðŸˆŒN»Ïl' ÞQÂÉ=>ù:™ß°­i8“yèÃKás­7ÂÎd …W·ßX©·_ ™Ü/ ÉS}2Fu´2×=QƒY_„%‹æ×¢’[)¯ÝÍ… ¼…D'' éΗ2Þ(¤Èf YÂÊ >ÏÎY™JbKF ’ÞÎ&ýn¥²¾("¤/9NÈöÁ2§|*xÄN·2ÿñT²­¬Ìçy ³jeÎx?Æg÷ú&¶Rn%g ¾ü­Ì/‘׬Tê–¬ÌA% Û.¦Ú]y&¬ê0Oxìm¥¼wÏ´2ï•~n¥’ôï"d¯MÈV9Xº[ZÈqû­ºþl+ó‹+•nR;Áýç&!ëΕB®=M„Ìçª ¹/=2—J-xm ²7ª-¤ÌpÛÊ?æ‡`<¼&Ì©øF¨²¼›•1M‡¹|ýN¡•×aë¢Ñ€T­Œ×Còêp5JÒÈÉÌC‰Ç 㯽ÎÅïæ¶Û/dhŸYËs{„•k ¯'vŒ)/´ž¾[H¹v”08Í!w _+#Üë§—ÿµó:ŒÑéu¸†o¬Ã¬0Oˆr ”ìÒL˜¼÷áÒºÍV*Ñ‚Væ±ùG„ßÅž …¶Å Ãcþ2¥í)tμDØ]´“ð¡ÐEaÝî“°V*£_]!OöUBÚÞBîy›„\§~ i³eò-dZõUHóYÈU´¯üÏ"!‡GZÁ¯Ù!{Ôl!ÛÓBîû¬ÌÜa9´,*%]ï%Lý|W8Õ¤ºà^w‹–‘îs„½ª ]< "wZ©Ä›‡Y~¶Üw‡ý~ ùÇ\üZÇJû* S̶2¿ÔÞo¥|gV¶2Ÿ—þa¥RV+(äs»-º,än8Cð:geþxXD8ò´•ò¨ºÑʼ¼êaRq‚jÞKˆZJ¨±æo+•¼ã#+óÑÒBV*MáVæÇÕ¿„µgî í_ ö,Û*ŒH5×ÊØñq³×ÁSufþÖ’Æ`sIÛ+`s /6ç=º.°¹àêÛ€½¹Ï> Ø\þ9€½%\V0Ø[¢]·Û›Ë{k%°·Ä÷-öæu¾ÑO`oɳý—Ø[ê [{skUÞØ[²ù—{so±¬°·”§ö–®k™ÀÞ2ºý›€3eXZ€3e¬1¤gJ¿£eFΔ.üm`oé[÷àLé^׺À¡–ü\ À¡*}½ À™RçÛÛØ[š¨äµ€½¥Jý%Ø[šÇ+{K7æL4°7ߎž}€Í½( ìͧïÆp`oÉû^öæ½hÉ^`oI½<÷›KÔ¶<°7ïE÷r{K^¾°7ï {Kýí×4`o).=LìÍ'ëx`o¾ÓÞö–66o`o¾ ~e6·ü@O`oé‚Ç?6—pÇZ`o©‡¯]ì-Íñ‰€ÍMN9Ø\²GÁÀÞ|Ž”«ì-Õì¨5ÀÞR×Í;Ø[J×§:ÀÞ|Cî-öæóêS`oió ì-ͱ¥€½¥N1 °·”îžs€½¥þùî °·TQµ€½%ŽÜZØ[’ ‹›{K~+=°·ä‰¢Ë{óì—±/°·$Uúõø_»õÕƒ÷Çq\öJFJKSÕ§>ëJE$2‹ì™™=“–4DˆD’”²³÷^ÙÂ_²Êæ÷ý³û÷=ç÷‡÷ëyÎã¿{νÜ·z:ðwÓÓþn5n8­€¿›næÛ{ðw«eäÔþnzy-BàïÖðÞ¢Bø»5~=<þn¾_‹àïfd8ó'ðd|nŽ5ðdÒ,¢)ðdÖÛððT÷©ç]ø»Õ·©×þnºK#þn ZNh·†ºÔ€¿›þ‡žºð— vþnK*9O?›éO†fIîÀS“àaÀ“~AƒÀÔY·ZÀS“kµGOF‚Ò€'ýkzO-gžŒ¼< <'úïžL›OMžÌjν<5=b;x2/7óžÌž¦MžšNص x²8»x²lùx2ðïà<ævžLj”eS¾UŠ€'£f;^OÆ ;ßžLnŒžLÿNžšn8_˜Z»x4ðdirá60åk— <™×jdðd»¦¶ðdûx²¿ÚÏx²»|Bx²ß=Ìxj•Ùà:ðäðÔÒx²>³q:ðÔl…Eðd7$$xjñ%cðÔ\s½:ðd—8¥ðÔÒtM,0õu\Oà©U³«Û€'«ïõ€'ÇÜu]€©MF¯8sª4í9k…S9S4Ø÷‚3‡£¾‡€'G§AÀ“Sç¨7¬­ë=œ3E¯)y¬-u3§r½'œ)\ ËX»3ã;gÎŽ:ñœµŠÈo<9Ú%ߦBòfsæÔèÒÖÒ 9S˜o­É™Ó«ùœ) ~Ú°¶úØΜë{œàÌqÂ6+Ö^ÿÍ™S¬ëÖ~NÌg-Àý8kÎq¦ndÂZþô)¬%4>ÊZ©{5ΜÇ&´aíDü\Ö\­c-±îNÎ\zí©Ì™²N˜;gŠ• †pæÜ8ù kQUÚ±öÕÿk1Õ±öΣˆ3—¨kúœ)Û¸¾æÌ%Ä¡˜3eÓïå¬íK|™jçΔ?U;8Sµ±bíyVSênsÝ¥l®#Cc±{º õþ ¶24-âêKI)û-C[Óൠ—…v=8SºTZÊ™ªæ¾_¬í=Ú“3eéUœ©ퟱvoùêV÷¤dj£dhjùÈPǵ¼"åéÕ—24#>ÙI98÷µ Õý2Ô=ß—rpï »F+d¨wŸK‘¡1]¿LÊòèÛRþtŸ+eÕ»2´5.N•b6¦žÀolª êßS‚­‹“Q# ¶<,¸ýË¿"ª–°¢"­Ñ®g¯R• Bw˜`ÓáXÁ¼/ñ‚uû^ .µû&øé¿Ypc¸[ETyY¶ÀÊd™ÀnåÒ>˜I]†çSàjd–ë#°î³œœz’g»gP8Š¼ã½¨oÄA iMsþØÒ¨ôº4cÇŠVì¤DE’&úÈo)Oí—¡Õ÷K Ö{%ÝóYZ²J0üØ5AbL'Aaû Á3íüŠ4e1ã+Қąz¥¥ "Þwt¼XU0éõ&AÆÜU‚ãçãù5÷®ïɬˆj¬»"0o½º"íOmEÔhÇgÕr׎:ô¤nåÙÔ&ùyív£À)Ù42ïŠö䉖‚÷O—TD†›? ”z­õ]/ ZÙ ´P§?¨ÿœW4ºþ) ø|‘†ÖiAÓ§µ¡…í—Pû°4êCÃú^£Ð7Q¼nß5šÂmkÓ¢¬…qÖ›âÝ ”çe´V;…–þ‰¤´ÆÆ´±ÎÊéRBsS)*AEI»ÐŠƒ½)>î*-SÄÑZ딩S“ÖïØLY‡õ(ÿAíÎw§\›´ýêڷ͇ Ï ‡|[j³ï>ù5(¤ _ò¾—F½Ê›Ð˜&ãi:u¢‰ŸŽÒ¼E+)¶Z%M3¥¨ý).a8¥ÌžE«u¾Ñ7 iBêI  §˜¹'höÝùá•N vËhép{Z2¢6­8¹˜Ö}ýJý†ÒêµÎ´®ømþ¤O9ž´jÄyZgp€²Ý )÷¼š6:Rvú}Ú¾ü(íJlM»wþ¡‚éÐêtÄ[—ö?ϧBUÉ×£#tƒr{u |~´gÏ*¨SvŒ½L;Ï]§‚%5© kG*Ü2Ÿ »héÐÛêTxëhšJû?h•µ´gá$…Q÷¯¬…š³ö5æ5gÎm}8SlJ[ÂÚ[“9sÞÑÒž3—®†‡Xkøók{Ëœ)ó åLåVׄ3ePQk%åã8Sz÷äLÝ6hgΞc¬ÐñäÌåíéBΔ3ÍÍ8séu­ŒµŠ8S>Š.ãLåôá"kݞ鱶ퟜ©5¾k¥„Mê&CÓ°f‘”ž=d¨w™¼’òmi¸ ÍÒå¤œÞ CÝpÀÖª8t‘bûFÊ‘aפüì~_†¦åâ()£¼îÉÐV¹«brM†feû¡RŠÔKehM 6 Gü#˜–b!ˆº6WÐ~n° çÞë‚ä%Å‚´#+R[\þšÃ)3¿ÈÐÔÙ[J`—D)´¾›”e dh«ƒ¤˜Æï´yAñs³ =Á´"Í‹a2´­:Ü—2&û• Þ¼’ ðI™ 8QG°éù#Á±›ž‚ŸŸ"*"½ÌΩÏhÞÉÐþ›(%«ÈWJùc})ÃÚ”KÙôêƒ ­Ó7)‡‚¾-V zœd,ˆ85i è1Å[<&_}8\0cçAò‘]‚ãÛF´<šÜHðÛÀ¼"²8{Kà<¢¹ ^XÙÆ_Å'ÒþhM¯“ÿ«äî^›¼ ŽQ_ßh»\»¹ùÁá³ßÜ­*¢ÚÞ¥io=Ë”:¥WD†“Ϭ÷î´ª²E`ït”Y‡¨CJy÷nK]C¨gÇ:4´¯¼=™úÎìLêÔ£±›Óø¢¤9Ü\G+¨kÜ,êÑjuXH^¯QomUê·e! ú1Œ†yU¥I-«Ñäû%4âŸ,õ4B‹Ò”W´Ë*ýlÿ7AðræûŠ¨Æ„i¯¾ ”îV™V/(Þ;ì=× Z‘vQu9íK}¬›QÏ~åI¡1á4ïþiS¾ˆ¦–ÚR¤×7Šm·†:fêQ·äLâØ†BÎGQ?ÍX:«=M{hLaó)Ì¿/EίC Eö´äìrZôº˜âŸ´¡O;Ziw™tû ,68¿CmÖ§î†fÔïO)uº³„ºúoŽ.2ì)5½Eæ{¨í·Iä·´Œúü~@ý’?ÒvE4eÛ?4Ç̓Æô5§I§ûÒ‚?(¢ts«EÓÆÚRÄ·dŠy<æ=ûD ÏfR\·_”HƔܻ-sµ§´éhM«rJII£ÔÁv´ÖW‡Ö^›NÑŠRŠmZ’×ÒÒ9å—؆<§e×siùÆ#´rusZ彚֞J µ­êЪÑMiU¥ƒ´¦–!¥¨I‹Î´¢„Ç«(µéAZís†–†•ÒŠÔñ”~c:e8Qfheõ)£mÕÛQÞ”Ê^T“rªùS¾ÍSÊ7[CiFWhÍÏë”ù~>m ‹¦uîhýScÊ~޲6<§œË{)çõpÊVD¹\)'p9miD9ßÖQöÀO´kDÚÕîíõ¬F»Ã‹igP6m?݇v6ÐRÞ3Ú“p–vzÔ¥ÃRî¾G”7ض”5§ÍËNцêÉ”7€¶î*¤­ý/ÒfEewÛLG9ц¥[hmòkjT‹Ö;Fk¬ÛQÊ!”æÐ‰–û:RÒºWkñ”2ž¥ J)Ëm(mjGtS†ûÊÌVRFÌLÚÜ?„6~¿A›h(e¤|¢ G)}¿’ÖFºÓªjZ÷,ŠÒu (ýy"­¾8—Vg줕—ÇÓÊ.Oiù˜”öî4­81‘–w¹AInßi©w{JˆlC±?ZQdü$Z_ï+­(¥•­ïÒÒôá´¢S Jþ Cñ;SôÍ”¨Š¢˜¯‹ia‚?ÍxÑ”Â7-¥éKNÒØC³i`AOŠéBQ;ûÓ‚¢N4­ód ;ñž¦V›Hcj›Ð€»h̃¶4Ðc ù¿Ì"ÏA×Éÿö1òÜÚ‰È1‹Z žNžQ®Ô5ï$¿hI#U£¨×ÐF÷œÆÝêG¡úÒŒÙN4o Eí@‹&ž¡p—}ÑùÅþžEqËh¨q%õ#šf\¯Ks-®ÐxË»49NKaëý)¼y&E~ø—¢íGP\ Å•˜Sô§ÕÓ]ŸâÖÓâR/Jü¼‘’^-¢åœhùÁ@Jü›’¡åµïÑÒ§Ch¥ÁZ±ý>­ôÑPJáyZ~«/-MŠ¡¥gã)iN.%=Ë¥Ä/;iIç$Jò¾L ëþ;;O›Püs{ZloEIÏýÿ;ï5(îþzŠ)ÿH±ñ~õþEÜ4¢°Ê…4MI3ÍîÐBƒË´0}+Íöð¥9Yiá1GZîL1îƒ)úôнµ‹ý÷–D½õ¦ÈÝÞÝœ"ƒbh®ïš«IáOƒhÁ«j4gìšõÉŒÂT^4§¼EXm¥p·t ¶’æû¡ùfh–2˜föjD“K(ö”Å<§óEq)ˆ"—~£ð¸S´À=‹f~=D ›$Ñ\£ó4½Îpw»MÉ[B!:3iØÌÔÿÏQš›àCÓRÏÑdã54ºì MðžM#shpÚWêgÔ–†Zï¦þÍf“ÿ¼ÿÞ½ßyäßø yW©Lí–#UÇJ”²ü -ù5š’5~w0‡õu)¶Ä•bj^¢…¶ýiÑ"CŠÔ‚æýîB¡‡nÓ\û¡4ylo@ÌÏPÔ,ZðàÍnÿ„&Uñ§™­Ò„°Ý4bó% j€F.[DAûþ·ÿ.S§›æäÿz4yµîDmÊN“¢÷gíšAæÿøo_ZR§õÉÿáSê4nµžóŽÿ[_sëY‚‘--ýõ¡iÄÇnÿš] ÏH¡ÀíÙÿÍûœ¼–Ä’ÿ!yÝÒ#בÈeŒ1µ<0Z`ø)VàXŸÀ¤û~AµøØŠ´¯º¯ªˆtb"+Ò>î³K°¯ÿyÁš°å‚c¶å‚MU‚HMAð¸zi^L–¡µX#%D¿P¸A°wò-Áù}©‚•ƒ; ròf ßÉ”ù¾ß8k× f›¯ć‡:ÇW Ó(Xã>K°õÇkÁ!gÁe· Š¨ªÇne¿Š´·” Þ¿»Pég¬—.T™ã'¨w¦‡Àqg'AËc×I1v+¹/¬KNkÉÈ~°ÀÊÿ*ã8ÑPCò ZE«,¤¶¹ÅäÖ‘|mkS×¢ÚÔeˆuûüŒ‚ÂhàÁqäÿ}L¼Nƒ‚bið û4Fu™ÆõèG}·ü¡Aÿ¦à­¥4Úe œ­¤•'*¦ámôiÈìDîbGƒ«¤Ÿ× œ¾… ÚßžFwçP·âiä7Ùƒ< “çŸò‹L~–©Ôò×4rì`AmìkSÛ]Ia6™œ—º“«egrYŸ:MnFÆ nž3È·¬=y~ó$Ï&zÔ¥õIòiÒ›úÔ£> Þ4àŸ ÜâI½Û·¦€¹-©oy.õºó‚‚=s)0ã1ͬI}’ßPŸÕ¨§k õ $ß’ÅÔÃû#ùå<¢ýÒ©Ûü½ä›»†|zPç^väùäuK8H>«üÉKÕÚ÷Î'ÑoÈ­ZµéI¤R6×Î ª!ˆ¯\SP8´•àœñ(ÁªN«Yêq‚ÛM%¶2Â*¢êN§æO¦ ¬ÇÛ ê„î襘 š%oØœ¬H»3þ‹àpÍm‚wÅ_ŠÎŒÎ\ÒUðû”GE¤S^KÐ0ÉX ?X+hvê§ÀFçž ±Þt~ŽŸÀÒr¸ÀÌk‚Àe½-)}f“ëðÑÔöÕR&´%åäêÔ¶nj}ùu¼ô•:X¢N©™Ôñp¹›Ô"׃õÉ}ùrµxE._ª“‹ÕSúo0iºÏ"çomê^&m£³DcÏ‘jÖ&RÄŸxæ¦ö2¨½â3µíüŽ\c~™Î$z)~„’"y¿ÀfþyÀbÕ»&‚&ƒ¿ꎹ,pÉ4¿(°d%0_?P`9õ—Àx´“À ü¶@Wá)hÒ)^ »,NPéxIEÚ7ÆNQ¿Š´†<Ü<>Ep,c}E4ãÖšfîM3­Ñ”³mhòíº4¡VmšðÉ€Æä ¢)ÛÓøovâ0‘†›æÐ¨“JâÞ•œ?J½}ÒiÌÑ4¢Öa^³!ëêÓ ÷zE}ÏÕ£¾=)pZ- ˜²˜º­_@=¥®ÞCÉóç,rk8†4ïQðÍÃÔçÚDêÖš¼îýwÇn÷%¯¹½ÈMLê oRX·4 û$pÞñ[`é}O {àKEÚŸ•M+¢^EÅäwf uYsˆ<În Ÿ•ç©£{{r½Ô Éefoõð\‹“Z`“ÔR ¿ó³ zÊAAƒ¹ù‚Ê ®V¤}ø Up¢ÙÁ?ÿê .=Ý-Øú´`E?Q­m+*Ò~ÜX$8·ÅYßì”àFösÁþ•+¶½„ $ÔX!˜8é± Íàa“M‚Ɔ]¥dÔ%ˆkÿV0`Lª mü ÁÄŸõ~V–sË·‚êÛ'W¤¹¼e›”¤ù›d¡áFA­*Ò~‘,¸ë“+ø~æ½àéÃ7‚ce6‚ÜÙ½{¿› 2Ôn‚…aÕC»¶$Äz f7xl],°;-¸0쇠 ÔO°òîqALmÁFƒ¥‚¥= Æ,ô°ø*hVâ+CóÅuž m•@šƒÑ¥tê²VJõ=«¥D/õ“â¾0T†zOž·”ÐO#e$¥•À_î¾ÅIàÉÒÿžšÔÞÛ ˜ 9Ux2¼ëðÔdݨSÀ“QÔõOÀ“ñ¼ovÀ“Q‡¦®ÀTQÀ“‰¶Z]`êÜ&càÉpîé*ÀT\ézà©I¦û|`ê@üràÉpöºjÀ”Æï(ðÔdûC`*.äàÉØ2GLõß´x2u>çLÍ}Q x2Ð ˜êñ&x2]V²˜Jò¾ <™¤%®žL“ÅOMÛfLžÌƒ—žÌú†}žšVë~x²ðø·ðd©ã£L%»­ž¬V<<5›Wš <ÙF›.ž¬§T=<Ùý´žšûnŸL•ô<<5žå Lçîž,#véS·÷žÌ¸ž¦L¾¬ž¬ôr|€)‹ÓÁÀ“Íê;·€©?ÍvOvªS± ¼€§f-'Sí›OvëƒnS¾gOw²·Sû¿OM´ÕkO†gf;OÆ·ÀßÍØàwðd´Cs x2¹º+0eÜøðdd¿ô0ðÔdQuðd’šL™t´žôG­;·F•­nÀßͰÀçðdpo÷dàÉxTê]àÉ(acàÉ vàCà©qÊÏÀS“åÅöÀ“aþ‰Làɼ挣ÀSÓãou€'+ÃUÍ€'ËÎÓ€§¦ÃRÖOf÷jWž,×ÿ>L¹Tù <5ÓT‰¦>Žžì–J¦Æm> <ٜ٘_à<Ùµ¬rxj^ìn <™µz[ x2ñíðd±.Ëx2/©|x2 ¿;x2žÿ|&ðd^Ég!ðdVbsx²~Û¥ ˜ò~ì <5Ÿú¸.ðdûO{ðdÿ² x²ÌÜä<Ùª#¼€§fò—O-+*OöêU€§Vš`êÊó^À“ýö^ÿO-kt¶žÌƒ€©pûÀ“ããÏ)ÀT†ek_Rræôg´–3EKY¬MWÞfmslgÎkžÕàÌ¥±Ç%ί{•sæÜêÁcÎ\,`íýæPΜèÙGÖ"µáLѯ4–µ(Çœ9å½¼ÊZqIgŠŒ¶=Y;¾qgÎQû°võQ7Δî™N¬ÅŸãÌÅÒ>šµqÇ~p¦<4º!k¥z¿8kéãLy¼Ôžî\î<9Úô¦ZúÄ:S®‹€'Ç^µ_S#×5žUª_c­±Úšµ7 8sÖ=9‘3…M‹ï¬9ØÊ™³Ý%/Ö<£{qæ²17’µ;á8SÕû\›5‹Zœ)«_Éšù–Fœ©4µU¬y6¹Ï™B{jk®Æ8sxf k“[^çLázùkmêéqæ<ç² ks«Ys¦T%ÜgÍ£ /g*¿:嬼°äLéûõk]/MáLÕûFk½Œ_p¦ôM`mۜ휩ofm×)wÖ*u»ÉšC´>k_Z?æLm§å-`ùH)ÑF ë»zRüï‡ËPg—·’ríò!š…=JIÿ4Oʧþ¶2´m“2üüDÁôñUGþ#Øfd!ˆÈ:-ˆKž$Ø}$^PHú‡ K¤˜ú¼4_ÚK0ºE¢`ª©…`éå‚UÇGÃ÷ N¬\#H¿R.È7UpzÎ<ÁY'Š4:—œ¤˜ Y#åPà1)÷}Ki»8AJÐ8{)ßûü–¡­S7FŠË¬rë7ÁüçÇ‘Ž#^1ëÝGl,r:'ˆ›1V°Ù¸`Ëí3‚³‡»‰´i‚­Ù†‚Ü%q‚ÓÛž NjÎú<ÓAb{‚¤'—Ãþ<ŒÎ/XR³\‘&ÈMwl½÷RpìU±àУ7‚œ>¯ÙÖz‚ý.ž‚]ßõ*R ˜æÃZT¿ëœ©‡ÔùÈš}¢JŠ[V©”—®y24•ŽÊP­î¹™µüœ©2}¥ŒÑ› CSQ )M%2Ôó‡$J‰ ß Cc¿‰õ‘[Ræ| %¡|¶ ­¡eu)OŽËЬÕ{+%g×yÚæ¾JiÕ¶XÊ8¯LÁ„«[KÕ‚äÔ:‚I½Nˆî$u:*Hý$ØÔ£§ ãs{A^÷K‚ì.ïéM㫞f 6èL¬Ž)LšxS0Ñfš ®åÁ¢ùz‚ñµ† Æ* ¢fT,´¥ô-HžS°ü}_A¢ïgAÜŒ§‚讂˜-½á{V¤Ù;⢔#gºÊÐ:”“Ógµ Í© k)çîm–¡µß|]Šm»'RFn{!ºl§`žõÁ´UkË& ú=ÿG0þh”`ĶC‚ðZ›3f|LSŒŽ±Œ»ßS04ÀG0À!^à¯Ìh-èv G0pêaAïæöï£ RºÞ8/ðŒKô}Û^ÐmŸ£À3û¨ uâÇ‘#‚6º ŽoF lŠê îVV 56­ˆª¤6TíZ½"í³Ìý‚Ûâ*¢ªæuUšn4òˆÔÿØHÐdycA#ÇÝ˵¾6èÒqAõ›ùiÿi*êŸZé R‘ö×[ÁK‹¶‚’ì9‚/' ÞçYVDÕbÆ *­*5ëP‘öcìCAyJŽàͨ‚’twÁ­=Ÿ*¢† u*… ª\ׯH[Ö¤kETùÃÓŠ´eY®‚§¥Q‚«ýSæ œ›¹Kw©¦`m€­`ߌo‚Í õ Ê‚¹7®ž/(¸™1Ipt¶`{ÈÁ)EwAïKAFûž‚eU R‹ ±f÷CŠU‚Î34ãÁ£“JZ!0÷š%xR¿†àþô÷‚Î<69-¸õ{‰àÊÑ­Ï7Çï<º)¸a œùºQP!8ãYEp0R!È›— Èx_Ep¶\Wp<률h‹`ÿ©‚ßZ vÕü,È"Èjt\°ý“ž`S¶Jòî­`qÔAÚÞ}‚d‡%‚°õ!vû[êܬW¢ö„ž$H,è X¸{” èçbwåÑó‚£24¿úÉÐN(Ë6Œ(O{ ¬ÔÕÖÞóehÎtø-eí÷TÚ…M£#ï¹´£& ,_˜ç?“¡)p”ãVOJYø)…ÿHñî¾VJà “¤Ô=+C}èÖ*)–ù¿e¨n}~"ååk3Î4I³¥^(C}s)«{“¡±}ØE†úWás)C&Ï–b½ç½ U¿y8S^>T›3mNéÁ†¢÷‚5Ç –U)HKë XY[û"Rn¼NmøG0óÇcA?+}×`3ÁÈ3÷½×Ô¨‹_ lãâ‹“] Ï÷Lî}I0¤Í@Áô°š‚Q¯Îz¼ž ðóAÐ|ÆH)º6RªÅéÈÐܽSUʬºR<û?“²cX‰”ä O)Æ?ªËPÞÑM†¶ÿ3Aש‘õþ«»;SE«Éм ,‘rÚo© mC/­ ͯ.6R6{]“?q“”p)îsûÊP}å&e¥ñ4SßÚ2Ô ÇI™ä%ÅÍÄDJ»š]8S]Ý7”3e÷9 9s¹«NâL5¾ËqÖjÝ1áÌeÂ͉¬ÕʬęêXì4Ö®Œ5âL½Ìá—”ÕoÓdhÜʺJñ²n%C¹ XÊ–ÝÝdh|[fIñ«UO†ªxØdÖžœXÆ™:oh¹”3ËÐøÒmy{êoÆÉ9m!CÓe™¥¯JÞR.„ÛH9±P†ÖbÒ)F+æÈМ5è+åD–® mƒßIRj•^ÒÖo·@õ¡@àÚ÷ˆ@åq\Ðrx +g9õ“H12NJýj.R*¥çÉД¬Ÿ%åð¹-R ®L“¡ÕÉ*”¡ù˜“%%ÿO})›S»IyêµEʵ`WÚ*¡WehJçÛH9o1YÊîhw)w_–rÊ⎔õËM¤$Õº-CõŒŠY{ôr gêMÏKÉ«¿N†¦}“KRZ‘¡Þr\)eãÀ_24έ¥Øk Cugò-Ö.^Á™:½A-)©µªÉИ?]*Åà@ ê¤Ðt)13»ËÐèNÏ“RUûNJú5))¤™%JÙ½!GJüËÏR"ëHÉúóRJš›‹”Ý–FR2¯·“Öýž”áÃJI1s‘ód”®Åk¥PÚR¦Ÿl#ed¥¥$2•œ-¥w‰RŠ×‚p)¡c–I´­Ÿ”™•=¤ Ý¿WŠíð")Ç+Kéž;PŠÛºïRj™—¡þ>ú½ MqÝR Š•2®ö)^;GJÉ<­'%áì,)Í7ô’¢{õ¡ õÕ3>Rrû­–bðý€ Õû+e¨,ús¦™ö¢º”Þ;ŽÊP¿?|AÊE#š6ênR¬N—¡ÎŸºLÊŠÓi2T¢Y‹_ñ”3å¦:¡¬ù¾šÌ™ó¦¨Öü4áL©ó1Ž3—œ9s®zßš3Eþ”Óœiê?#Cý#®TÊBÍ&)C›XKyýZÊÉÓR:õk,Å¡m  U§¢.¬éµ>Ιzðû﬩?,âLyË£;kYUÓ9sYÒ™5‹c8SŒ{p“5«oK8s~±Á”µœË*ΜJæa-sÐJÎZÚø˜SUÄO޽šçSÍŒ&Oö§ì¦æožîxŽ¦Æ¿ðž*#ÖZäÌyòn?Ö‚Æs¦°ðÅZ£œ9{ÆkÍÓp¦ôê«ÇZkÏ©œ©ºë¼fÍëò>Δ¶§¼Y«?Ñ‚3UÛXs´Rp¦¨V{%gNoºÏâ̹vöb·_àÌé¼ýxÖ¶æL±kÌoÖ’<:ræòÞâ>kG &r¦jªÃZÝàÖœ¹,QD±ÖÓ£gÊö±vngömWzO-JïžZ=þÖ ˜òIÓžZÌ\ðx²{ib<µ<]טåQxrZd›Éš¿ëyÎ#ýê±ÖfÛBΜ NÌàÌñâÜîœ) •pæô9­+g. šqæ|d^H)wò—RÒ;UÊÀ€–RºÕ%åz• RŽDÈPei°¶*l gêvÊP)?gKÙÙ·”L“CRz®Ì™Fûè£ûê—¤øM ’â¶\ŽéççRêgHQTò—b•Ú_ŠÓÀûR,wùÊP?_Õ]Êõ‹dhOÞ/¥ö„Ã2ÔESÍ¥ì™QG†¦šAˆ õçY$Ccà6LJíâêÇV5¥\l\&CS©o-ê·ª24•"¾ÉP—ší”²ÅÞSJzÏyR>>,åŠÑ)Ë ¿H‰o=K†*áúÖ"œjs¦nu¶-kuG9p¦ bmIKÖž9ífmߨ}œ© = ¥ä¤íRl9]Ê9ÿ5RV×i'%>FOÊ ])[Ë>J9žª•²×a±”È̱RæäÕ’’³ç³”õõ†I™ÒGÊpŸl)ó+¯”2ü“”t»”%]¥Œxþ›µFÕ¤Ä~”h`.Å‹›”‘VÞÅZ¥9SFmÀÚຜ©žŒýÂÚ¹d=Δow°ær£gÎz.¬õè¥Ï™Ó„ßÙ¬)39sv|Óœ5£Âœ9ÕÙ°ž3ǧr¦:>ƒµü¨Vœ)íZ³f7þ7gªìÃYË|Þš3e«McYÓø·æÌ¹^îYÖêÖãÌñèÍÖòüîræÜ`œ–5sƒ6œ9fYÁZ^øOÎT¾5o³¦ýšµÔ\ÖÂÜ®±fvókUWemÀ.¬y_Ä™ºM|[ַаæWþ’5 ;È™êõõ_¬íõÛÊ™Úêk/Öê5&Δ7û±–Yçg*g{;ÖÌ'¥s¦ûyk¦££9SÕZÄ™ò]Ížœ©êofmàÀHÖ>¥kR;²¦\vе&½±¶ù߬E/Ëe-cÜIÖÖ;ìæLÙÉ ;ký’•œ©ÖÍžÏZúÖlΔwa-*ÅŽ3gÍìV¬7åÌñØWÖ^ ¶âÌ9úe"k[cFpæÔ ÿÖ:lLæLµ¶éJÖÒZ_ãL™r˵ì“ý8S¥LÛÏZâè#œ){Ú³v«Ž!gΓ]9siرgN1Á¯Y;™ÙKgSÖæôæLÑx÷)ÖÆÎšÇY%„B!„þýR)M.!Àreproject-0.3.2/reproject/healpix/tests/data/reference_result.fits0000644000077000000240000020700012724021736025357 0ustar tomstaff00000000000000SIMPLE = T / conforms to FITS standard BITPIX = -64 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 128 NAXIS2 = 64 CDELT1 = -2.8125 CDELT2 = 2.8125 CRVAL2 = 0.0 CRPIX1 = 64 CRPIX2 = 32 CRVAL1 = 180.0 CUNIT1 = 'deg ' CTYPE2 = 'DEC--CAR' CTYPE1 = 'RA---CAR' CUNIT2 = 'deg ' END 8£vUÀ8£vUÀ8£vUÀ8£vUÀ8£vUÀ8£vUÀ8£vUÀ8£vUÀ8£vUÀ8£vUÀ8£vUÀ8£vUÀ8£vUÀ8£vUÀ8£vUÀ8£vUÀ8£vUÀ8£vUÀ8£vUÀ8£vUÀ8£vUÀ8£vUÀ8£vUÀ8£vUÀ8£vUÀ8£vUÀ8£vUÀ8£vUÀ8£vUÀ8£vUÀ8£vUÀ8£—œp8£¸ã 8£¸ã 8£¸ã 8£¸ã 8£¸ã 8£¸ã 8£¸ã 8£¸ã 8£¸ã 8£¸ã 8£¸ã 8£¸ã 8£¸ã 8£¸ã 8£¸ã 8£¸ã 8£¸ã 8£¸ã 8£¸ã 8£¸ã 8£¸ã 8£¸ã 8£¸ã 8£¸ã 8£¸ã 8£¸ã 8£¸ãÿÿÿ8£¸ã 8£¸ã 8£¸ã 8£¸ã 8¦€8¨ƒà8¨ƒà8¨ƒà8¨ƒà8¨ƒà8¨ƒà8¨ƒà8¨ƒà8¨ƒßÿÿÿ8¨ƒà8¨ƒà8¨ƒà8¨ƒà8¨ƒà8¨ƒà8¨ƒà8¨ƒà8¨ƒà8¨ƒà8¨ƒà8¨ƒà8¨ƒà8¨ƒà8¨ƒà8¨ƒà8¨ƒà8¨ƒà8¨ƒà8¨ƒà8¨ƒà8¨ƒà8ªQåÿÿþ8¬ ª`8¬ ª`8¬ ª`8¬ ª`8¬ ª`8¬ ª_ÿÿÿ8¬ ª`8¬ ª`8¬ ª`8¬ ª`8¬ ª`8¬ ª`8¬ ª`8¬ ª`8¬ ª`8¬ ª`8¬ ª`8¬ ª`8¬ ª`8¬ ª_ÿÿÿ8¬ ª`8¬ ª`8¬ ª`8¬ ª`8¬ ª`8¬ ª_ÿÿÿ8¬ ª`8¬ ª`8¬ ª`8¬ ª`8¬ ª`8§Ë€8Âÿà8Âÿà8Âÿà8Âÿà8Âÿà8Âÿà8Âÿà8Âÿà8Âÿà8Âÿà8Âÿà8Âÿà8Âÿà8Âÿà8ÂbK )ß8£vUÀ8rÁ{Ø^—8i@?ÿÿÿ8i@@8i@@8i@@8i@@8i@@8i@@8i@@8i@@8i@@8i@?ÿÿÿ8i@@8i@@8i@@8µ½*ÿÿƒ8ÅXÁ8ÅXÁ8ÅXÁ8ÅXÁ8ÅXÁ8ÅXÀÿÿÿÿ8ÅXÁ8ÅXÁ8ÅXÀÿÿÿÿ8ÅXÁ8ÅXÁ8ÅXÁ8ÅXÁ8ÅXÁ8Ä¢™·]Úp8£¸ã 8{ˆI6D8u`8u_ÿÿÿ8u`8u`8u`8u`8u`8u`8u`8u`8u`8u`8u`8u_ÿÿÿ8ó:Kÿÿø8œŸ³€8œŸ³€8œŸ³€8œŸ³€8œŸ³€8œŸ³€8œŸ³ÿÿÿ8œŸ³€8œŸ³ÿÿÿ8œŸ³€8œŸ³€8œŸ³€8œŸ³€8œŸ³€8‚àdO8¨ƒà8‹¸?‹÷n8ˆˆ…ÿÿÿ8ˆˆ…ÿÿÿ8ˆˆ… 8ˆˆ… 8ˆˆ… 8ˆˆ… 8ˆˆ… 8ˆˆ… 8ˆˆ… 8ˆˆ…ÿÿÿ8ˆˆ… 8ˆˆ… 8ˆˆ… 8ˆˆ… 8aïÿÿþ8Ð`8Ð`8Ð`8Ð`8Ð`8Ð`8Ð`8Ð`8Ð`8Ð`8Ð`8Ð`8Ð`8Ð`8’…Åøm”˜8¬ ª`8‚Æñóuh18}„?ÿÿÿ8}„@8}„@8}„@8}„@8}„@8}„@8}„@8}„@8}„@8}„@8}„@8}„@8}„@8³ç“8QÁQ8QÁQ8QÁQ8QÁQ8QÁQ8QÁQ8QÁQ8QÁQ8QÁQ8ÀÙ›ÈÀ8¾¬n†Ú8Žß©À8Žß©¿ÿÿÿ8Žß©À8Žß©À8Žß©À8Žß©À8Žß©À8Žß©À8Žß©À8w·¥Ä&¹8£èüÏÎ-8ÔV¬€8ÔV¬€8ÔV¬€8ÔV¬€8ÔV¬€8ÔV¬€8ÔV¬€8ÔV¬€8ÔV¬€8Æ<פ›8žb²@8žb²@8žb²@8žb²@8žb²?ÿÿÿ8žb²@8žb²?ÿÿÿ8žb²@8žb²@8ÃYkJg8ÁnÛ«Ó²8˜ÃT 8˜ÃT 8˜ÃT 8˜ÃT 8˜ÃT 8˜ÃT 8˜ÃT 8˜ÃT 8˜ÃT 8‚èìUÍ?œ8ÄÁÖp-F8¢|´`8¢|´`8¢|´`8¢|´`8¢|´`8¢|´`8¢|´`8¢|´`8¢|´`8“ïôeÿÿÖ8g4`8g4`8g4`8g4`8g4`8g4`8g4`8g4`8g4`8™²)xyIª8œ»¥i×— 8"À8"À8"À8"À8"À8"À8"À8"À8"À8Ä?a8`d8…ñ ¬Á'8L<úÀ8L<úÀ8L<úÀ8L<úÀ8L<úÀ8L<úÀ8L<úÀ8L<úÀ8L<úÀ8zMo«ÿÿ½8ˆ‰ 8ˆ‰ 8ˆ‰ 8ˆ‰ 8ˆ‰ 8ˆ‰ 8ˆ‰ 8ˆ‰ 8ˆ‰ 8K¶j9çj8›#I”áè8°6u`8°6u`8°6u`8°6u`8°6u`8°6u`8°6u`8°6u`8°6u`8“UBé8€@¶ŒÚ²Ä8©×8©×8©×8©×8©×8©×8©×8©×8©×8â 8h:ÊÀ8h:ÊÀ8h:ÊÀ8h:ÊÀ8h:ÊÀ8h:ÊÀ8aT r¢ê8QÁQ8³Ã¿ÿÿÿ8³ÃÀ8³ÃÀ8³ÃÀ8³Ã¿ÿÿÿ8³ÃÀ8³Ã¿ÿÿÿ8Žß©À8ÓûAÀ8ÓûAÀ8ÓûAÀ8ÓûAÀ8ÓûAÀ8ÓûAÀ8ÓûAÀ8ÔV¬€8Äã‡þòßó8¢éå 8¢éå 8¢éå 8¢éå 8¢éå 8¢éå 8•äEP 8wÒý€8wÒý€8wÒý€8wÒý€8wÒý€8wÒý€8ð%Ty8Ö8žb²@8ªBÀ8ªBÀ8ªBÀ8ªBÀ8ªBÀ8ªBÀ8ªBÀ8˜ÃT 8³[º€8³[º€8³[º€8³[º€8³[ºÿÿÿ8³[ºÿÿÿ8³[º€8¢|´_ÿÿÿ8ž¿öØN`ù8™ª¨À8™ª¨À8™ª¨À8™ª¨À8™ª¨À8™ª¨À85ØH8{?ÿÿÿ8{?ÿÿÿ8{@8{@8{@8{@8t/é§â8g4`8d¶€8d¶€8d¶€8d¶€8d¶€8d¶€8d¶€8"À8Hc¢ 8Hc¢ 8Hc¢ 8Hc¢ 8Hc¢ 8Hc¢ 8Hc¢ 8L<ú¿ÿÿÿ8h3m÷"Mq8s‹ 8s‹ 8s‹ 8s‹ 8s‹ 8s‹ 8 ³è¹ÿÿõ8¯ 8¯ 8¯ 8¯ 8¯ 8¯ 8£Ôõp…Á 8ˆ‰ 8‰&“ 8‰&“ 8‰&“ 8‰&“ 8‰&“ 8‰&“ 8‰&“ 8°6u`8KC`8KC`8KC`8KC`8KC_ÿÿÿ8KC`8KC`8©×8˜L°ózZ³8  À8  À8  À8  À8  À8  À8‘‡¸l8këç 8këç 8këç 8këç 8këç 8h:ÊÀ8e9´ 8e9´ÿÿÿ8e9´ 8e9´ 8e9´ 8¦V†[f˜8³ÃÀ8h#€8h#€8h#€8h#€8h#€8ÓûAÀ8ÆGÈ «dà8uPø 8uPø 8uPø 8uPøŸÿÿÿ8uPø 8¢éå 8|¢>8|¢>8|¢>8|¢>8|¢>83jßÿÿº8€âKà8€âKà8€âKßÿÿÿ8€âKà8€âKà8wÒý€8…‘ß8…‘Þÿÿÿÿ8…‘ß8…‘ß8…‘ß8 ½ _…w¶8ªBÀ8‰2"ÿÿÿ8‰2" 8‰2"ÿÿÿ8‰2" 8‰2"ÿÿÿ8³[º€8§ÞWk×\­8†à1 8†à1 8†à1 8†à1 8†à1 8™ª¨À8€^ÌÀ8€^ÌÀ8€^ÌÀ8€^ÌÀ8€^ÌÀ8{×(L8vð· 8vð· 8vð· 8vð· 8vð· 8{?ÿÿÿ8u&#à8u&#à8u&#à8u&#à8u&#à8nëÚãì8d¶€8r¸`8r¸`8r¸`8r¸`8r¸`8Hc¢ 8m ýÂ?8|Ï€8|Ï€8|Ï€8|Ï€8|Ï€8s‹ 8о¢`8о¢`8о¢`8о¢`8о¢`8’B'ÿÿð8–Ã3 8–Ã3 8–Ã3 8–Ã3 8–Ã3 8¯ 8œ¦k€8œ¦k€8œ¦k€8œ¦k€8œ¦k€8“Îý·ôŒ°8‰&“Ÿÿÿÿ8™f·8™f·8™f·8™f·8™f·8KC`8‚Ÿ—Þ,Ä8“§ @8“§ @8“§ @8“§ @8“§ @8  À8~÷ 8~÷ 8~÷ 8~÷ 8~÷ 8vv…¸8]—`8]—`8]—`8]—`8këç 8ƒj `8ƒj `8ƒj `8ƒj `8e9´ 8f³ƒÜFà8¸Ï`8¸Ï`8¸Ï`8¸Ï`8h#€8ëÖ 8ëÖ 8ëÖ 8ëÖ 8{á½ø­8uPø 9~zŸÿÿÿ9~z 9~z 9~z 8|¢>8Þ¢ûÀ8Þ¢ûÀ8Þ¢ûÀ8Þ¢ûÀ8Ï*g»U8€í`8€í`8€í`8€í`8€âKà8¨TÀ8¨T¿ÿÿÿ8¨TÀ8¨TÀ8…‘ß8…üwÿ$.8½òØà8½òØà8½òØßÿÿÿ8½òØà8‰2" 8ŒŒ`8ŒŒ`8ŒŒ`8ŒŒ`8†âöøj+ú8†à1 8\¬¯ÿÿÿÿ8\¬°8\¬°8\¬°8€^ÌÀ8fí“@8fí“@8fí“@8fí“@8e>8cŽšÀ8cŽšÀ8cŽšÀ8cŽšÀ8vð· 8+·68+·5ÿÿÿÿ8+·68+·68u&#à8uPÜ*80˱À80˱À80˱À80˱À8r¸`8W%`8W%`8W%`8W%`8|‚©íó“‚8|Ï€8‰giÀ8‰giÀ8‰giÀ8‰giÀ8о¢`8—–8—–8—–8—–8‰Zõ—ÿÿ¾8\Né€8\Né€8\Né€8\Né€8–Ã3 8rŠ­ 8rŠ­ 8rŠ­ 8rŠ­ 8œ¦kÿÿÿ8œ'O© 8‚Íd 8‚Íd 8‚Íd 8‚Íd 8™f·8}Ñ©À8}Ñ©À8}Ñ©À8}Ñ©À8“¡|:Ý 8“§ @8g«m8g«m8g«m8g«m8~÷ 8Së¢à8Së¢à8Së¢à8Së¢à8X 8;dj@8;dj@8;dj@8]—`8ƒŒe€8ƒŒe€8ƒŒe€8ƒŒe€8ƒj `8Õ6e8Õ6e8Õ6e8¼§þŸ Œ.8¸Ï`8ÝeÇÀ8ÝeÇÀ8ÝeÇÀ8ëÖ 8éPÛqÇ8„‘Sà8„‘Sà8„‘Sà9~z 8Ý÷X 8Ý÷X 8Ý÷X 8Ý÷X 8Þ¢ûÀ9±| 9±| 9±| 8ó¾ö#0Ô8zó`8zó`8zó`8€í`8ºž2€8ºž2€8ºž2€8ºž2€8¨TÀ8´n 8´n 8´n 8½QZ†MУ8½òØà8run@8run@8run@8ŒŒ`8ŒÍë½oc8H“@8H“?ÿÿÿ8H“@8\¬°8H¢ý€8H¢ý€8H¢ý€8H¢ý€8fí“?ÿÿÿ8R9;€8R9;€8R9;€8M~@L8F‰³€8F‰³€8F‰³€8cŽšÀ8!”`@8!”`@8!”`@8!”`@8+·689Ø´À89Ø´À89Ø´À81`š—[æ80˱À81hcÀ81hcÀ81hcÀ8W%`8UÊ^¬×¬8.5`8.5`8.5`8‰giÀ8|ŒB€8|ŒB€8|ŒB€8|ŒB€8—–8 Ðò€8 Ðò€8 Ðò€8’V¦Ô 8h[E@8h[E?ÿÿÿ8h[E@8\Né€8­®ÿÿÿ8­® 8­® 8­® 8rŠ­ 8ÇY8ÇY8ÇY8”Ã% Öøl8‚Íd 8bJ¡ 8bJ¡ 8bJ¡ 8}Ñ©¿ÿÿþ8|~z~GR8DܦÀ8DܦÀ8DܦÀ8g«m82LŠ@82LŠ@82LŠ@82LŠ@8Së¢à8"V À8"V À8"V À82G¸P8SÖ8SÖ8;dj@8;dj@8e^w`8e^w`8ƒŒe€8ƒŒe€8©ë~à8©ë~à8µÙ OE›Û8Õ6e8_~`8_~`8_~`8ÝeÇÀ8áfš 8áfš 8áfš 8„‘Sà9NÖE*{ä9°@9°@8Ý÷X 8Ý÷X 8žû£€8žû£€9±| 9±| 8üHïÀ8üHïÀ8ì[±µàÀ8rÁõà8rÁõà8zó`8zó`8¿Ä:À8¿Ä:À8ºž2€8ºž2€8r‚@8r‚@8‹ý>é]‹Î8´n 8Ž ë 8Ž ë 8Ž ë 8run@8g£ `8g£ `8g£ `8H“@8rú'è8fÁGà8fÁGà8H¢ý€8H¢ýÿÿÿ8K¹‡ 8K¹‡ 8R9;€8R9;€8@½ž`8@½ž`87ˆ9ÿÿš8+*jà8+*jà8F‰³€8F‰³€8a 8a 8!”`@8!”`@8ìÚ`8ìÚ`8#Ã$Ž^Ó89Ø´À8Ú2€8Ú2€8Ú2€81hcÀ8@ÍH€8@ÍHÿÿÿ8@ÍH€8.5`8´ù]¸G~8E9@8E9@8|ŒB€8|ŒBÿÿÿ8ti 8ti 8 Ðò€8 Ðò€8«_y 8«_y 8 ¢%¸8‡“G@8‡“G@8h[E@8h[E@8áÁí 8áÁí 8­® 8­® 8‚•(À8‚•(À8Ÿ<-;Ì#»8ÇY8¢!°À8¢!°À8¢!°À8bJ¡ 8™vx€8™vx€8™vx€8DܦÀ8(ñºçœ­ö8 °ä 8 °ä 82LŠ@82LŠ@8c@8c@8"V À8"V À7äâf7äâf7ùŒo€7¹Œp7¹Œp8SÖ8-w@@8-w@@8e^w`8e^w`8[ëÎ`8[ëÎ`8©ë~à8©ë~à8€eÓ 8€eÓ 8_~`9Xä¨ÿ9iÑ@9ÜW§À8áfšÿÿÿ8ƒÔ`8ƒÔ`9°?ÿÿÿ9°@9Í 9Í 8žû£€8žû£€8 £û`8 £û`8üHïÀ8ê6'À8ê6'À8Úk¿ÿüX8z˯€8z˯€8rÁõà8Á‰ˆ8Á‰ˆ8¿Ä:À8¿Ä:À8Xào8Xào8r‚@8r‚@8–åè8–åè8Ž ë 8Uv¥â#'*8Re`8RÉ"ÌE¼8g£ `8r%Æ@8r%Æ@8fÁGßÿÿÿ8fÁGà8Iïÿÿÿ8Iï 8K¹‡ 8K¹‡ 8D½u 8D½u 8@½ž_ÿÿÿ82» 82» 8)¢°Z8›°@8›°@8+*jà8wÀ8wÀ8a 8a 7ötX€7ötX€8ìÚ`8ìÚ`8\ÞÀ8\ÞÀ8Ú2€7í?!¯ô7ì€Æ7õVѬÇ3…8@ÍH€8"’¾ 8"’¾ 8E9@8E9@82‘Z82‘Z8tiÿÿÿ8tiÿÿÿ8mÞ@8mÞ@8«_y 8µ` `8µ` _ÿÿÿ8°d‘·ÿÿÑ8¦Ò2 8¦Ò2 8‡“G@8ù~=`8ù~=`8áÁí 8áÁí 8±Dr8±Dr8‚•(À8‚•(¿ÿÿÿ8ç&zà8ç&zà8¢!°À8|£à‘dÈ€8{ Èÿÿÿÿ8|“W©f8™vx€8‚Ì@8‚Ì@8 °ä 8 °äŸÿÿÿ8Øz@8Øz@8c@8c@7Ñ\¼7Ñ\¼7äâf7£07£07±ŒD7«1P7¹Œp7¹Œp7â6›7â6›8-w@@8"è$ 8"è$ 8[ëÎ`8[ëÎ`8“ŒÈà8€eÓ 8€eÓ 9,¨@9,¨@9iÑ@8´ÑD@8´ÑD@8ƒÔ`8ƒÔ`96sÀ 9Í 9Í 8Ó|M 8Ó|M 8 £û`91SËà91SËà8ê6'À8ê6'À8è;bà8Þ,¨¦8Ç¿ 8z˯€8z˯€8Ó¸Ý`8Ó¸Ý`8Á‰ˆ8b&s 8b&s 8Xào8Xào8’s)À8–åè8–åè8Z6þ€8Z6þ€8Re`8Cdcà8Cdcà8r%Æ@8r%Æ@8R “à8Iï 8Iïÿÿÿ89ë¹89ë¹8D½u 89™ `89™ `82» 82» 8*Z&8"£+ð«8ØcÀ8›°@8›°@8F€8F€8wÀ7òZ7òZ7ötX€7ötX€7êÓê8\ÞÀ8\ÞÀ7ä*C7ä*C7ì€Æ7ýêP€7ýêP€8"’¾ 8"’¾ 8þÀ82‘Z82‘Z8UïL8UïKÿÿÿÿ8mÞ@8ml<@8ml<@8µ` `8µ` `8Å«6à8É&E€ 8Ì¡T 8¦Ò2 8¦Ò2 8õäò 8õäò 8ù~=`8ó'`8ó'`8±Dr8±Dr8ÏEjÀ8ç&zà8ç&zà8Öä¼@8Öä¼@8{ É8s7¦@8s7¦@8‚Ì@8‚Ì@8g-{8Øz@8Øz@8a´À8a´À7Ñ\¼7²E87²E87£07£07¾€7¡Px7»í7«1P7«1P7ÔÐp7â6›7â6šÿÿÿÿ8%É8"è$ 8"è$ 8›‚ÿÿÿ8“ŒÈà8“ŒÈßÿÿÿ93VÀ9,¨@9,¨@8ét8`8´ÑD@8´ÑD@9&±Z@96sÀ 96sÀ 9<µ 8Ó|M 8Ó|M 8Ï.à91SËà91SËà9€”@8è;bà8è;bà8ú…ó 9&Lê:P94¤‹8Ç¿ 8Ç¿ 8ÿX 8Ó¸Ý`8Ó¸Ý`8x§ª 8b&sŸÿÿÿ8b&s 8žèÀ8’s)À8’s)À8c<¨@8Z6þ€8Z6þ€80À8Cdcà8Cdcà8C7€8R “à8R “à87ùJ?ÿÿÿ89ë¹89ë¹83ò`89™ `89™ `82|-ßÿÿÿ8*Z&8*Z&8&bÀ€8 OÈØ58y¢`8ØcÀ8ØcÀ8ë€8F€8F€7ð€7òZ7òZ7à2”7êÓê7êÓê7àëL7ä*C7ä*C7äãm7ýêP€7ýêP€7ûib8þÀ8þÀ7öò…8UïL8UïL8l‘a@8mlèÀ9…>èÀ9a:À9a:À9S)FÀ9L}ÿÿÿ9L} 9KÒ®€9KÒ®€9b¥ç®ßF@9"|Ò@9) :Óc‚8ζÿÿÿ8ζ 8œÃ`@8œÃ`?ÿÿÿ8µÕ½_ÿÿÿ8t¨`8t¨`8QVÍ€8QVÍ€8Ÿô 8hUÕÿÿÿ8hUÕ 8EMÀ8EMÀ:¬e9|%ÿÿÿ9|% 8,N€8,N€9ë_ÿÿÿ9ë_€:aícw 9ƒßB 9ƒßB 9³³÷@9³³÷@9A×`9A×`9n³`9n³`:YÖæ : íÙÀ: íÙÀ: : 9²Pg9²Pg:½L‘€:½L‘ÿÿÿ;!úkΦQ:É`:É`:X&†@:X&†@:§8À:§8À;8–ÿÿ:Éò_ÿÿÿ:Éò`:'#­@:'#­@9{¢€9{¢€:VFÑ4ïÈ&9¦€9¦€9$ß.@9$ß.@8&¹ 8&¹ 88ÿÈ`88ÿÈ`8=!R 8‹@8‹@8Ñ´ 8Ñ´ 8VA@8VA@8!. 8!. 8gD4ƒ 8(! €8(! €8*¤à8*¤à8#¸\8#¸\8 U(ïÿÿˆ8õÀ8õÀ8×_8×_7éÍ7éÍ7àÍ&@xQ77ߊð7ߊð7á¯Ì7á¯Ì7ï>Hÿÿÿÿ7ï>I7úÿÿÿÿ7úÿÿÿÿ8 çí@8â¼€8â¼€8 žÍ€8 žÍ€8‘¹€8‘¹€8éýÀ8éýÀ8!ûk㣋8”âÛ€8”âÛ€8ŽÁà8ŽÁà9%7ƒ9%7ƒ9½®ÿ€9p#«€9p#«€9*Ëîà9*Ëîà9œ½¸ßÿÿÿ9œ½¸à9ÔA+×1Ne9 Ñ59 Ñ59S)FÀ9S)FÀ96(´`96(´`9eÖG@9eÖG@9vÜ,`9*<{@9*<{@8ã;ú 8ã;ú 8µÕ½`8µÕ½`8§ÔÆ€8§ÔÆ€8áò¾”mö8Ÿô 8Ÿô 8ø‹4@8ø‹4@:¥ :¥ :¾#ÿ€:ÍèIà:ÍèIà9ù_× 9ù_ןÿÿÿ:$×K :$×K : SŒ`: SŒ`9³»ä`9³»ä`9@Œ¨ 9@Œ¨ 9Ú\Aÿÿÿÿ9Ú\Aÿÿÿÿ:YÖæ :YÖæ :YÖæ :[é@ÿÿÿÿ:[éA:%mÄ :%mÄ :™'Á ;ALŸÿÿÿ;YOd`;d°cÀ;Pr ;)b·À:ýMø :éÇÕ@;gåÿÿÿÿ;œ]¨û—"û;•Í- ð;‹ý$D9ŒÝ;PÙãÀ:Òcm :Òcm :2Ïÿÿÿ:2Ïÿÿÿ:X ÿÿÿÿ:X ÿÿÿÿ9»™xà9»™xà8ÿ È`8ÿ È`8é+ 8é+ 8=!Rÿÿÿ8=!Rÿÿÿ8=!Rÿÿÿ8G 8G 8œË8œË84`84`8Ç@8Ç?ÿÿÿ8% ¡ÿÿÿ8% ¡€8(ãLÀ8(ãLÀ8$² à8$² à8 U(ð¢8ðˆ8ð‡ÿÿÿÿ8$1€8$1€7ì£77ì£77àê‰7àê‰7áÛp7áÛoÿÿÿÿ7îäW7îäW7þ5ÿÿÿ7þ5€8 çí@8 çí?ÿÿÿ8 çí?ÿÿÿ8Œ¥à8Œ¥à8Œ‚À8Œ‚À8 êÖ8 êÖ8"æ@8"æ@8¥J 8¥J 8 ³Çà8 ³Çà9NYÛ 9NYÛ 9½®ÿë9Ÿ.¬€9Ÿ.¬€9]Ç|ßÿÿÿ9]Ç|ßÿÿÿ9«žúÿÿÿ9«žú 9ÖG@9ÖG@9•l 9•l 9O€ø 9O€ø 9x'Çà9x'Çßÿÿÿ9vÜ,`9vÜ,`9vÜ,_ÿÿÿ9=Ù®ßÿÿÿ9=Ù®ßÿÿÿ9_ã`9_ã_ÿÿÿ8àIÀ8àIÀ8ãÈ `8ãÈ `8÷ˆ~_ÿÿÿ8÷ˆ~_ÿÿÿ9#ï9#ï:]£À:]£¿ÿÿÿ:¾#ÿ€;#Þ»ò÷Ïæ:ÌhìOWGz:È=Ë€:$´FÓ²¨:sAŠ`:$×K :>ÅÀ: SŒ`9ˆ«9³»ä`9¶Ó€9@Œ¨ :C¯ÙŸÿÿÿ9Ú\B:’Ï`:YÖæ :ž*A :[éA:,zà:%mÄ :š_ê?ÿÿÿ;+‹s@;„î‘à;ª¢ÿ ;©¶šÀ;’¸” ;|w«Œ9ér;u±=ªÖ;ˆÏ?ƒ>å;Öırü<,<‹6ÐE‚€9•l 9ŒQÁ€9O€ø 9iÔ4À9x'Çà9˜½æ€9vÜ,`9…º¬à9=Ù®à9Yzd`9_ã`9+¨l`8àIÀ9dà8ãÈ `9œ‹@8÷ˆ~`9B®‚à9d³õÜ9¦·aÀ:UÎë_B :jŒ¸ ;©»÷:öŒ# :ì0 À:È=Ë€:ÐÙt:sAŠ`:|”— :>ÅÀ:053à9ˆ«:?²9¶Ó€:€_£À:C¯Ù :·Ä¨À:’Ï`:Ñó]à:ž*A :¼€À:,zà:Ê&@;QÊÀ;¼SN ;þéÀ€9Òò2@9ŒQÁ€9˜79iÔ4À9šrà 9˜½æ€9¯·@9…º¬à9“¢„`9Yzd`9qMÀ9+¨l`9TYàÀ9dà9JisÀ9œ‹@9Vb_`9B®‚à9’‰@ 9¦·aÀ:ý€:jŒ¸ :–=@:²DÎ`:É>ûÀ:@οÿÿÿ:ÐÙsÿÿÿÿ:(f :|”— :xÐ@à:053à:q¡ñ :?²:”w®`:€_£¿ÿÿÿ:Æ1<Ÿÿÿÿ:·Ä¨À:Û„Ÿÿÿÿ:Ñó]à:ûšßà; Þ/à;$¶=ÿÿÿ;i`x`;ÔYa€<%pœ <\»£_ÿÿÿ<¨¹¿ÿÿÿ< ~µà<Á{`<æ»I@= ŽýÀ=(Õ«¿ÿÿÿ=>jg@=HÕ2À=JÀÅ€=B”8€=.¹Lßÿÿÿ= •`<ÛÛÅ¿ÿÿÿ<©âX@<™=ßÿÿÿO`:@οÿÿÿ:Nõ¨ :(f :Xh‰à:xÐ@à:a|f :q¡ñ :†[óÀ:”w®`:Àv• :Æ1< :ï˜à`; xÁÀ;(#Ç€;O¿%;sQÓ;Ÿ÷Ò ;á"bÀ<)eà·€>)>µ>8-F>C"Z>H÷ >Ė@>95Ðßÿÿÿ> 4ñ€=¸Ÿ–à=vñ, =-¬o`<Ô‚°@O`:rÊe_ÿÿÿ:Nõ¨ :³U:Xh‰à:*¤¯à:a|f :]~„€:†[óÀ:¤ØÏà:Àv• :ïSà ;Q’€;D5F;yT£@;ªïÿ;ëÒlÀ<2Ó<…´Ñ@<æÚ`À=>ô,à=„º5 =¼D"à=ÿõà>"x€>? @>\€€>yv-`>“Æ/>©²à>Ÿ|´@>£Äþà>¡À>–Þžßÿÿÿ>tá >’g&€>€äQ€>Sr@ =ÎÃüà=bø <ãýŽ``:¤ØÏà:Û;m};Mªi ;œÀ;ÐÏ)`< )€7À>'f)>aoçà>–Ø @>·-ÄÀ>ñêÀ?ôˆ?ûŒ?ª½g9Õì?!æó­rÙ? v&ÿ}?³ÿaÔ@Ö?ò²·tj ?=;zä,1?¿ôäi€8?ögo›½>ó–Ì>ÆÍ >¡ðXà>zÎWà>Œ=U¸^<·Ó¨`< ÜÇ@;b@:g¶ :$û€9s#=@9bà8Æ»b 8Ê ”@8ZE à8Yãü`8!ÓÓ 8"R3 8TÉ 8u8BœÀ83Ìp€8:Ÿà8^Ê¿8S}z 8pwÀ8DZg@8PP¡€8A`8ZR 8EïÙÀ8f´À8EÁ×à8i©À8,ü! 8B‚˜7÷Ÿ$8¶ÿ€8 §ŸÀ8HN€8$+ 85 ³€8BœY 8T*ø€8`å@8vä2À8{~í€8”6¼à8‰1t8—76@8xÂ?`8j”KÀ8çþ9{Tj 9]¥¡9Ó#Õÿÿÿ:B}Áà:¥árßÿÿÿ:yàm€:tø@:1(Ž@:¡ ¬@:ŽÞ†:¡õÓ :u&œÀ:bÆP :5±pÿÿÿÿ:# À9ô½9å;ä 9Æ2À€9Ù¯9Ћ< 9ßwõ`9Ò‰d 9Õo9ÉQ 9Êa 9À©ä€9Å¥à9À™‘ 9Éjº9Éñ 9Ж 9àÇ 9ÌŒ€9ç¢'À9úsz :'ÆTÀ:I!òÀ:Pi¹ :uÍÓà:J :( 9ð1+ 9澊€9à Òà:!ÏGà:?÷à:x´>`:ÃI6:ùE ;BßÞ ;‘èùà;â'™ <:ÑJà<“{À<üŠY`=V €=šª€=Ü’ >%À1€>oãŸÿÿÿ>§ko >ç>×F¾žr?ÑqÝ,I?Wùè.?¾eÐvï(>ãªíxºØ>ÆžãŽæ+>˜<2€>€4à>qŸÅ >s(Å >òt€>˜°Ÿ`>ÈѨ"nþ>äù‹]  æ>þÅ µKÍ&?|†ÐÃü>ðéI¥ØQ>¿o/¡ˈ>qŒ€=­œH <þˆ# ¥Àà>^î@>–xÇà>è‹À? ø?˜á>>ø$ÞÀ>½Ä¹`>’Žb>MÍ! >5@=Ã:«@=Ñjdà=³x.à=Ù'J€> Y€>*±À=×» =¸ Œ`=àK?à>7Âô>”{€>Æ95>ö³`>ñ^Ìà>§ÑÈ>!¤ü@=-tQÀ@: ßš@:×Öà:·©ò€:»ê :«Í:ØÌj€:ÆxZÀ:µús€:Ž•¨:o‘ @:JM€:0CÃ: _ :L  9뙥€9õ"Và9æ+9ëñ9Ý“@ 9ÝY^ 9Ò}õ9Ð$3`9É™U9Åb› 9ȱËÀ9½›é9Ãe½`9¯±j€9·Ï 9üۀ9Ø à9ñ`@: j:##ß:š2:;w° :£©€:ÉÀ:¯6`9ó´à: åÕ:³J`:`DZà:Œóù@:öé ;chDÀ;Ìr³à<>&.À<¦ÀpÀ=_TÀ=i%À=Ä‹  >!¸­à>}áÿ >ÀEø>öAà>ãèÏ >®^lÀ>mýÞ@>Õà=Ä®`=° 9`=s¼¸`= ÉР<Ç¡ `=€¾À=bn·@=‚¾ =`Ïg`=j@<åáÀ<ä°ª@=>éå@=¹Ó}=ô£r€>zˬ@>Æo/À>õä.à>Ó_ù@>C "@=J1²À@:ÚÑá€:óŽ:à:ÛÆ¼:»êÿÿÿ:ñ+E :ïÕbà:Øm$à:µús€:‘Ê{à:o‘ @:QL:0CÃ:ƒP :L  : ä«9õ"Và9úÿ^ 9ëñ9äíÍÀ9ÝY^ 9Ò qà9Ð$3`9Á¢—9Åb› 9µ±b`9½›é9¥c@9¯±j€9³€. 9üۀ9ÖH 9ñ`@:rÊ :##ß9ìès@:j€9ôXª`·: >¶€:)då`:1Aš:rÔà:mùŠ :ÍB@:õø”`;p;.à;ü€[@<}©^ <ûgãÿ÷á=X÷V =Ä£. >ƒc >i€>œg_ÿû]>×ÙU >Ûaš€>©X@>$ï­ =‚JÔ =ÜB€=Þ €=+|Èà=õ(€<¬î& <0\ž€;§1  ;—JÀ<Ë*€;ìa· ;O¿` uc;"•WÀ:cåó :¥)c€:]íXà;$ ^à3n;§ÑàU`>ä4C >él—à>šÀ4=êžá =CvÜÀ¥ 9Œš¸À9u÷àf8®Ÿ° 8¦CÀ8e¤’ 8 ¾À8rº½ 8›áO8¨Y@8×Iu_ÿüø8á&Oà9æ„ 8× =8Ö`8«N€8Ѽǀ8Ðq–à8ù½ßÿüÅ8ñ~Ò9ýhÀ9 YÙ91¼8ÿ¢-à9)B-à8ã 8øY9@8Fîø8’Åé€8G8>À8G]Š€8^ 8R,ü`8nÖ=@8K[? 8`,ñ@8 8n7êëL8:à9@:†;MÀ:²K ;Óž€; ÿ€;›¥ ; Éñ_ÿÿQ;ÛÊ :ø³:ÐÈÁà:²`Žà:]€:o‹—@:g3C :@©vÀ:Eœû@:(ÀŽ :"–ùÀ;: G*€:± €9òà9é<®Àh9ÚÖ 9Ћ€à9ÅÂp 9¸¨R´9µ´> 9¢»Jà9¡*•€9.ä 9¤DŒ€9«M“ 9½Ð?9ÂNÆÀ9à1Ø 9Ý1f€:)m9ìès@9Ó•r 9ôXª_ÿÿÿ: L¶@:)då`:eÄ€:rÔà:Éxiÿÿÿ:ÍB@;.ý¡ ;¼„—@¡S>dØÈà>˜%ø`>ÎØ§?ÿÿÿ>ÁÙy>`>Q`=ɉ`À=NUŸ`<áTÆ`<ˆÌ(€<»= <Ô œÀ<±…ë@R8 >åP, >í]ê >‹YK@=Ñ—šÀ=]%`<<:è;€Ñ :’>¥ :€f€9u÷à9D"€8¦CÀ8¯ë 8 ¾À8 M¦ 8›áO8Æ%& 8×Iu`9©)€9æ„ 9Æ“`8Ö`8×V€8Ѽǀ8ùD±À8ù½à9"ˆÀ€9ýhÀ9FCp`91¼9V"`9)B-à9U9€8øY9@96”9 8’Åé€8ýå\ 8G]Š€8»±—À8R,ü`8“ÚÀ8K[? 8£öªà8 8n8õå 8:à9°U©À:†;MÀ:ñ3;+[€;4ý¶À;4PÒ`;*|Ë¿ÿÿÿ;SÕ :ñ|À:ÐÈÁà:¶×|à:]€:áí :g3C :c@š:Eœû@:<å@:"–ùÀ:oŽ@:± €9õ÷—`9é<®À9×eÙ 9Ћ€à9¼}(à9¸¨R9£Ä9¢»Jà9•“`9.ä 9Ÿ×Î@9«M“ 9¯"ýÀ9ÂNÆÀ9ÀÛŒ`9Ý1f€9΢Ýà9µ”`9Ó•r 9á´€: L¶@:B‹LÀ:eÄ€:º/`:Éxi€;ú  ;k©OŸÿÿÿ<ð(À<¬u =/€=‰B€=ñÔ`>R& >‘ºwà>Á[u@>¢àV`><ÔC€=¡zæ`=DãO@=@‚`<­Ùd n“ˆÀ>ïÓØ¿ÿÿ¿>æ£U >l)ˆ=ËÔz<番à<“ ;hê¦À:€f€:R‰õ9D"€9ÎJ 8¯ë 8À"À8 M¦ 8ÃXÿ@8Æ%& 8õ¬e9©)€92RÖ`9Æ“`9%»Ê8×V€8òHÃ@8ùD±À9!€ 9"ˆÀ€9K~ô`9FCp`9q©và9V"`9ˆ9U9€9†ý`À96”9 9.‘À8ýå\ 9q­™À8»±—À9q™8“ÚÀ9‹“" 8£öªà9Óüv`8õå :3cª€9°U©À:±{c€;(r3@;W‹ €;YÃÉ ;GB`;->;À;> :ðfi€:ÖvÈÀ:¶×|à:²C®€:áí :}| :c@š:Rùÿ :<å@:(WX :oŽ@:’A 9õ÷—`9â’ÂÀ9×eÙ 9ÄF;À9¼}(à9¨Îþ@9£Ä9â 9•“`9Ï}`9Ÿ×Î@9›[ƒÀ9¯"ýÀ9©Ýê€9ÀÛŒ`9´`“`9΢Ýà9µ”`9´à#`9á´ÿÿÿ:£œ@:B‹LÀ:”öÀ:º/`;¯| ;2+* ;¼p D?޹¹pÀ>Šè«‰L4…>±{Ó„?Û>“ãF]rt%>"8óûJ=}¤}€=?ÄV =­þ <ÜÞ³<‡+%<'_v`;í Ð@<,~£`<.CžÀ;êR;zÕ`:üŸ5 :þQ@:Üïƒ:Di6À:‡Ôÿÿÿ9aàNÀ9a-ªà9“Ž@9IÏš 9(¥×9­¤tà9­à:¿ ï`;7K­€<>»í@=iãš>š½[Çkk‰>ûò<†v>ÔoiSGv>[…ÃÀºÅF=‡†‚à<­Z‡à;ðï;>€:R‰õ:(* 9ÎJ 9¢ˆ€8À"À8תŠ@8ÃXÿ@8íxÛà8õ¬e9& ­92RÖ`9QÑb9%»Ê9ÓÕÿÿÿ8òHÃ@9hG`9!€ 9K9d@9K~ô`9vê 9q©và9—”¡À9ˆ9­Çœ 9†ý`À9¾g,à9.‘À9Ê«Â@9q­™À9áOM 9q™:_-@9‹“" :Lœìà9Óüv`:¡ü :3cª€:¶ÖN ; nå@;cy ;„Ð4à;| ¸`;]9Êà;7_‹ ;NÀ:û' :ã:eà:ÆÃ€:²C®€:”ùà:}| :bè¼€:Rùÿ :4C® :(WX :Š×:’A 9ð>… 9â’ÂÀ9Ñ’€9ÄF;À9³Ak9¨Îþ?ÿÿÿ9’hÅ@9â 9…Ô«9Ï}`9‰-r€9›[ƒÀ9’H  9©Ýê€9›ò9´`“`9žTä9Œ+à 9´à#`9܆5€:£œ@:`Ó×:”öÀ:ãÌ@;!m ;[ l<ÔÎ@<Ä Ÿßÿÿÿ=O(®¿ÿÿÿ=±ÜÀ>-œ >ƒîÀ>¡Â§>k`=ÕÐ?€=a¾<`=pÃ= (΀<âø <ªì¯ ˜â#@?\8y">·Ü>4[ =5‡è Â@:_-@:kï`:Lœìà:¿v˜à:¡ü :ï ò¿ÿÿÿ; $¿ÿÿÿ;9Þn;|í¹ ;–#¢À;Šà;i#u_ÿÿÿ;@íº`;÷½ßÿÿÿ:øú :ѽ €:ÆÃ€:•Úß`:”ùà:i­¥ :bè¼€::òÅ`:4C® :U´ÿÿÿ:ŠÖÿÿÿÿ9øfà9ð>… 9Ùè¿@9Ñ’€9»¢ó`9³Ak9˜÷^€9’hÅ@9>Ä9…Ô«9~v6€9‰-r€9€,±à9’H  9‚i×€9›ò9ƒa€9žTä9Œ+à 9¢KM 9܆5ÿÿÿ:#ו :`Ó×:ÂÛßÀ;Œ @;6tú€;¢Ò”@q÷ƒ >Òu€>u«=è4’=ZåªÀ<Ö}ä€<Ë[Ýà<²ø’ <’ÞÑÔÍ@>þ­ýÀ>œ_=¿#l@<å÷à<*×ç ;pÄ4à:¨Ál9°±à9y˜ 9ð… 9ÍÙ 8÷m9«nÀ94i`9AHü 9RE#9xd 9b¦O€9g“à`9‰"@988ù9DìÄ€9lÜ¿ 9t«ÿ9™¡@9Ÿ$ýÀ9Áóí9ºËE€9ÛÐFà9Õrk 9û?ÿ`9ò…mà:!!Ëà: :N׉À:>Â?ÿÿÿ:€#9 :kï`:¼fq :¿v˜ßÿÿÿ:ê>à;c€;(È;F@0`;y>%;©Ÿ`;†µ`;g½ ;@'¹ ;ór :ëì:ѽ €:›tm :•Úß`:j–B :i­¥ :;í^`::òÅ`:¤à:U´€9úùBÀ9øfà9ÝŽÝ`9Ùè¿@9Á2,9»¢ó`9 â9à9˜÷^€9|óý 9>Ä9qÚ±€9~v6€9q#d€9€,±à9p&Æ€9‚i×€9jY¦9ƒa€9fîü 9jª `9ÌѲ:¿ü¶9Üœ^ :v41kÃýo:†0à:ñô·ßýò;-æWÿý;¤–Ø?ý¤Zµh›ÿýd>Vê?ÿÿb>u§mô¶>§mÀ¹=€fºvtæ<É¿¢ýözA˜¿Íüö>ü5ŒÀ>Ú„èx>u©ÍE=¾ˆ½S؇=Ýà¢Þ/[¨9a«_ÿþe9oŠÉÀ9ˆ"óøL9”1šÀ9…ýE!9\º¥€9^ë_ÿÿÀ9`Ë 9…Vóÿþ9“DH€9²d pÀ9¿÷À9Øk„7ÿþ9äl£`9ô+œÇÿþÙ9þ çà:Gwûÿþ¤:¶:9ª¾¡:EÉç@:h¾ 'ÿýÅ:vc@:”EçÿþJ:¡„ñ€:Áÿ8€˜:Ï4 :àÌÓÿÿ;Ç?Oÿþp;% ð’;?Tµ€›;U%÷/ÿþÝ;aŸOÿÿÁ;^#KŸÿÿ˜;J~¯ÿÿX;+Xj";æ;<µ:Úý;ÿÿ:°Zà:¡1ë–½:qY `:c å9ÿÿQ:;M :0­m@;:4ó€:À@ª9÷s39î‡m˜˜9ÜPê`9Ó V9Æc`9¹TÀ9§6…€9›Œ@¯9X'9vχÇÿÿô9e݃ 9càÿÿþ9`b= 9^©àßÿÿþ9\G€9YŽ_ßÿÿþ9Vx@9R‰ðÿÿü9M Ïà9`ö ¬9Uï€9–¥t9ç@ À:7rP :¥îæ:÷À’@;88;¿,é`<£Ìý =`&— =¾ Óà>ëxà>pï¹`>{ÆÒÿÿÿÿ>¡r€=Z¢Ø`<¸‰<<ÙÐà;ÔQ`;‹ù;X[m ;1¤2À;%È;IO© ;Îh ;£‹;²>p ;ªw– ;±Òã@;•À!€;_ÿÝà;«`:ºà":M2B`:MŽˆ@9ÄDà9ãn*€9nœÞÀ9<¬ 9<È"@9cq;€9Båó€9wdÎ`9¦¼© 9÷Ÿ?:«P@;RŒK`¡ãÈ ?²iQ×>§S >°y`=W i <”Ñû`;Þj§;¾‘ :¯î€9Ô:}à9h¥O 9sÇèÀ9MeÀ9nQ 9eó9 9Šuà9–…A9³‚Ü`9œ €9•ÈX`9WªRÀ9| `9‰½¢à9²Ä_`9º¦×À9Ý.n@9âªh€:0ë :'$ :†4À:‰#à:4mÙ€:<þà:QdŒ€:`íx@:m„Í :Š :‹nÅà:¦­€:¸Šx :èd;~5;+3à;.`€;1œP`;7žU€;.! €;q ;1_ :áÙm@:Ç‹Î:•7€@:ƒÛà:U>Và:D~ :"ÿ!à:…2@9ôÖp9óUe 9ÔãO 9×óí 9À_@9ÃK’`9¬`1à9¬vŠ9ļ@9Š ïÀ9hŸC@9c! 9Iű9Rlq`9:ßî@9HÂW@9-(C@9A)ó 9ø«€95޾@9d‰@9>= 9Uï€9”wk`9ç@ À:TéÉ :¥îæ;(\@;IY_`<Õ <ù=­ =–Þž =à) >Söi@>„e,>RØb`=²§vÀ=à<€Ì]`<6˜@;ºÌCà;ƒé`;XP»@;A$1€;8ø”à;67 ;;"²€;b “À;˜ÊÆ ;¹s3à;Ú`;ÑPà;–Îù;Dž4À:òˆCà:³D¡À:MŽˆ@:qf9`9ãn*€9üÎÉ9<¬ 9¨FZà9cq;€9…í“9wdÎ`9°x&@9÷Ÿ?:TŽÔ ; Ó9¿ÿÿÿ;ð| `=GÒÀ>,SØ >ðÜ„.ˆÀb>éà áuG>lqñÀ=ÅãÀ<å§³ <4m» ;sºï`:Ò6ÌÀ9Ô:}à9Â; 9sÇèÀ9…N£À9nQ 9~›À9Šuà9°SI 9³‚Ü`9Ä\€9•ÈX`9†£µ 9| `9¤È“À9²Ä_`9ÔF€9Ý.n@9÷ñ‹:0ë :|ï€:†4À:+K›`:4mÙ€:D¡¬`:QdŒ€:[ußÿÿÿ:m„Í :l¾þ :‹nÅà:™†ià:¸Šx :õâX ;ÎÀ;!»ûà; y`;"¥và;)$ü€;Ïñ€;åè:速à:Ìt`: u…À:•7€@:e 0À:U>Và:1Ê‚ :"ÿ!à:6Ý 9ôÖp9Ø9ÔãO 9¼·à9À_@9¥jÖÀ9¬`1à9‹=¾@9ļ@9lØÏ€9hŸC?ÿÿÿ9E7¸ 9Iű9/d€9:ßî@9Ü®€9-(C@9 ‡vÀ9ø«€8÷ì< 9d‰@9y'€9CÁ6à9”wk`9ö‚\?ÿÿÿ:TéÉ :ưw@;ø+à;t@Kà)M‚tøÿ>~ üWê±n>|¥Å¶ZÆÈ1¿=kf¸`<Èns@”ŒxÌÓr?“ßeÜ~Ð>§ÌO X…>7¼ˆ+|¬Æ=B1È`<‚Ø@;Ñ>-à:Ò6ÌÀ:gv] 9Â; 9»&¶ 9…N£À9¡^|9~›À9µV{@9°SI 9ÑÁ`9Ä\€9ÁÜ 9†£µ 9“ˆ/`9¤È“À9Ézÿÿÿ9ÔF€9ò‚=À9÷ñ‹:À* :|ï€:'›íÀ:+K›_ÿÿÿ:8, @:D¡¬`:M :[uà:Yªh@:l¾þ :rñœ :™†ià:ܦ_ ;Ûª`;gœ ;{¬ ;¿à;RR ;sQ@; w€:çqÝÀ:Í4@:©üÀ: u…À:r’ €:e 0À:=N :1Ê‚ : 2e`:6Ý 9áÔÙ€9Ø9À s€9¼·à9¢ú€9¥jÖÀ9„²zÀ9‹=¾@9jñ»€9lØÏ€9F“`9E7¸ 9#C®`9/d€9 kd€9Ü®€8÷sú¿ÿÿÿ9 ‡vÀ8áïaÀ8÷ì<ÿÿÿ8æÂ—€9y'€9CÁ6à9–qa`9ö‚\@:mEÂÀ:ưw@;@¯À;¼Ê€<¾ûù =…æ``=ךì€>QV=@>˜Ìì >QâN =Ç.|€=‚y <ƒè|€< “@;¡„;à;TCõ :Ëá :ãdäÿÿÿ:lgþÀ:º÷1À:nLQà:òÃà:µ H€;:’ ;€BÙÀ;Ѹ´`;â€;¸o}`;€“M;_.\ ;=Œ@;9±€:Ú »@:–KÀ:pâÿ`: Ë 9ôÇ/À9·¸£ 9Á,À9¥.Òà9ÄD¯@9ëKWÀ:-ø×`:ÀëÐà;VÜÉ<<ù@=GC§ >!q¦ >ìy‚ŸÿÿÞ>ä"ñ€>oÜÚà=¦F`<Ë8e <"qòÀ;eÒ :gv] :!¬nÀ9»&¶ 9ÄìÄ@9¡^|9Äñœ€9µV{@9Õ¯Nà9ÑÁ`9àk×`9ÁÜ 9¨N) 9“ˆ/`9»ÿfà9Éz 9ìí¸ 9ò‚=À:*øÀ:À* :$$À:'›íÀ:52«@:8, @:@~ƒ :M :Lh“:Yªh?ÿÿÿ:U4Í€:rñœ :¼þg :á|  :þ›6@;+QÀ;³®À:ó_¸@:ÿ–! ;EÇ€:÷cÂÀ:צà:±Å :©üÀ:€´À:r’ €:DC :=N :¨÷: 2e_ÿÿÿ9êæ? 9áÔÙ€9Æj+`9À s€9¤&¤€9¢ú€9‚=Œ 9„²zÀ9fƒ«@9jñ»€9H~0`9F“_ÿÿÿ9 ¯w`9#C®`9 À9 kd€8äUA 8÷súÀ8Ë/ 8áïaÀ8Á}€8æÂ—€8þ±9<”à9–qa`:μ¿ÿÿÿ:mEÂÀ:Ôf·¿ÿÿÿ;-·@`<bs`= »±à=´þ¿€>ýgÀ>~yË@>Žæ- >Q9 ={êø@<È­æ <2Í ;¨Ê@;3¯ž :f¬?¿ÿÿÿ:Ëá 9žš¸:lgþÀ9Uäòà:nLQà9mÔ' :µ H€9Ó? :ôe—À;YÚà;¬eˆ@;šßýà;w¬I@;Iwq€;-70€;5Q@:ñ:é€:½´U@:pâÿ`:F:V?ÿÿÿ9ôÇ/¿ÿÿÿ9ßLl 9Á,À9Å¿.9ÄD¯@9ç{Pà:-ø×`:z žà; Y `;æ2¯À<èçÞ`=Ιà>¤(Æ`?·¹`>¸RÀ>Jÿ`=´œ 8mB@>ܘ >e¼$=ÚÉcÀ= «x $åN<³Ÿÿû>ô” >Ím>P<½  0=xÅ'@<¬’šÿÿÿÿ<;ïÿÿÿ;\¥ü`:ÍæŸÿÿÿ: Ñz:Âxÿÿÿ9Ü?kà-9úüò`9è ׿ÿÿÿ: —¿ÿÿÿ9뛵`9ôp@9ׇ 9ºyó@9¬E¶9Ù#w9äÑ# :‘;À: Nÿÿÿ:$¶)@:$'f`:4l” :3nÀ:<~p:=g¿ÿÿÿ:>‰à:@²¿ :9„ÿÿÿÿ:D§^à:e4~@:‘̆ :ÁôˆÀ:áO‘@:ìŸÅ¿ÿÿ,:ç[À:ÐòW :ÐÏF :Ò :è·Ü@:Ûä_ÿÿÿ:Å4R_ÿÿÿ:“v¥à:€N/à:]´^ÿÿÿÿ:R°„à:,F0À: U9÷¢ 9òO €9Ó÷µ€9Ï• 9±xYßÿÿÿ9ªmù`Q9‰]­€9„Éà9gs& 9e[ 9G\0à9G¨ÿÿÿ9$Ør?ÿÿÿ9#5 8øÞÆ 8ø „À8ÍZ$?ÿÿÿ8Õ3Ï_ÿÿÿ8¥MÂà8µQÀ8…¢*`8 o&8‰ É 8¿ö$à8åS$ÿÿÿ95äÀ9¨’Ù@:yw :» :ý…¨à;ñl`=@À=»Ž¹ÿÿÿ=ö}«À>~ü@>†à?À=þR¯=kÀ<"ê`;.Rbà9ÒÔ`9Ë•J 8äîŒ98uQöà8ÈzÀ8iu@8Ö¶À8Ï¡í90ñ&9G2ÿÿÿÿ9ǧT`:uDŸ@:ÄE•€;G``;Gçª;ú˜à;L;€;E>U ;!È€:Ò{}:cƒK:"›:ˆ:à9Ä%ž`9ÃÂà9’Và9º˜å`9·“ä 9Ûr`9ô(`à:GÎ6ÿÿÿ:†¨|à;&hèÀ;àek<Ò‹¡=ÂÌ*?ÿÿÿ>·ºd>ö¦Ê`>Mr`>¦-_ÿÿÿ=AâYà<ÕÓÀ<÷@;aŽ :uàÌ€:N¹¦`:™!€:;=—:%^Ý@:QÇÉ :"L€:i`9ãÝ¢ 9¿$ 9Èzc`9÷Ù*€:f§€:"ë€:$-:8e:5í `:A¬Y :?!Ÿÿÿÿ:B!&`:>ÿÜ :8˜ `:6_î :*n›:8[Ëà:kíw@:œÿÝ`:µ´$à:Ò±‹ :È S`:É©9ÿÿÿ:¦qX`:¥Å`:£Í:Ư@:¶Îßÿÿÿ:¯W~€:{e3:aåå :4´à:7÷ä`:D¶€:³À9àÿï 9ÖÍcà9¹¦LŸÿÿÿ9µÆð`9Ì5à9ŽP9à9nè¸`9k¨ 9M`9I³ò 9':.ßÿÿÿ9%Šº`8þOR@8üv8̨¡ 8Ê…ã8•‹-€8šœÇ8cDö€8rtNà8CÍ`8b=w@8]7¨à8š{‰€8Ôë»98œÀ9¨’Ù@:%þÊà:» ;.‹Ê <@ÞÎ =C'ËÀ=Óßÿÿÿ>(îœÀ> >Pšú`={%Ë€<ƒ¼4À;m)¦@9óÜ¢9ÒÔ_ÿÿÿ8·&‘@8äîŒ8N¥€8uQöà7ü+š€8iu@8_‹[ 8Ï¡í8Ìõ 9G39Ø©e¿ÿÿÿ:uDŸ?ÿÿÿ:a½ý;"žL€;4 Ò :òÆØ€;yë;2×C€;.пÿÿÿ:Ò{}:¢5ÿÿÿ:"›9ÖÄf@9Ä%ž`9pû, 9’Và9š_à9·“ä 9¿ß%9ô(`à:´I€:†¨|à:ïÇi€;”ì² _Ô/¿ÿÿÿ>øö@>§FÀ><ºñ=‘œY€<Ç¥Jàà9':.à9\—à8þOR@8Ð+¯ 8̨¡ 8–žcà8•‹-€8\q“`8cDö€8.•/8CÍ`8*7ç8]7¨à8€Ø8Ôë»98œÀ9´Ñßà:%þÊà:°0‰ ;q×<à<‹Ä@=z¨>€=ÙÑ€>S 0 >}`*`=þJ<õ¥@;ÑdÜÀ:.\?ÿÿÿ9óÜ¢8–œfà8·&‘@7ÌWø8N¥€7¤ 7ü+šÿÿÿ7öè΀8_‹[ 8fp\€8Ìõ 8Ó,A€9Ø©eÀ9²Ú*`:a½ý:󿨀;ËÁ:Í :°ÌS;{áÀ; ¤TÀ:ÝÈ# :¢5 :9- @9ÖÄf@9Ú˜€9pû, 9.j9š_à9…­_à9¿ß%9ÏÛ~À:´I€:@¦::¸Êc@;Nf<6à=Xà>0H >ÙLTüß$þ>Ý v¦ >bÅ =ÖP€=í€Ã 9Kb€9\—à8ÑÊõ8Ð+¯ 8š`ˆ€8–žcà8]×è 8\q“`8$Jñ€8.•/8‚ä€8*7ç84j‘ 8€Ø8ÊÞN9;%€9´Ñßà:7Õ÷À:°0‰ ;¾  <Òï€=¥°ƒ`=óuêÀ>c’Y€>Ebà€=mo £kú>쀽`>}¹Šà>Áà=LW· <”¤å@< %ã@;µ0'€;C˜Û`:š/C :x[›€:¸‹G@:¢NS`:Àÿ*:Q ¡`:m 9ë”Ï :-Gb@:!ÖÅ :H½ :AhÀ:Tž`À:LÜ‘:U … :M¨7 :Ož«€:Eô@:@aÀ:4„ :"ŽLÀ:á•€:ëk`:h¿wà:„—½À:¨f‹ :£¡à:ªË :… ¸ :Ûõ€:Pó)À:l“GÀ:¡K :”å¼€:vÒÂ`:cÕ² :1³Òà:äî`9æ]À9úÝŒ€9ßàN@9Ð6èà9¨Ç19—wŒ@9qÁ–€9nv9IË* 9M’Và9'öUà9)ë?à9™ 9Kb€8Òn°@8ÑÊõ8­m8š`ˆ€8aÇ?À8]×è 8$ß_8$Jñ€7øõ€8‚ä€8hÔ@84j‘ 8h`ó`8ÊÞN9;%€9ÀNa :7Õ÷À:üïX€< Îß`=ùB_ÿÿÿ=ÂÂ`>+4 >Tvàà=Ò€<Ôà ;Šá•À:“iÐ8±M¨€8‘EÞ€7„À@7•óà7A47d»7[¤7žà 7¡—€7ûo/8&Ëk8m¡à8¾_ÿ€9]§¨8ï )@9ÍD :[C¼À:º³Ãà:tŠgÀ:LQ@:–&à:È}@:˜:÷@:ˆ2à:"Ás 9ÖäÉ@9g¦Ò€9$7~ 8ÌX¯…À>âÄÏ>¤áš >5%˜`=½§ <Âë,À<)hû ;Ð;®;ƒ°‰ ;{ˆ:»Yþà:¸‹G@:ñŽ`:Àÿ*:u) :m :[ME@:-Gb@:Xë\€:H½ :[½ê@:Tž`À:[L :U … :V$–€:Ož«€:J%IÀ:@aÀ:0Öê:"ŽLÀ: ýª:ëk`:@‰ À:„—½À:Šq@:£¡à:‰Ü†€:… ¸ :\Ü¢ :Pó)À:3ƒ`:¡K :rµ3 :vÒÂ`:HÅV@:1³Òà9ÿæªÀ9æ]À9Ä<™@9ßàN@9»Í[ 9¨Ç19öÎÀ9qÁ–€9I4à9IË* 9#cd€9'öUà8þ: à9™ 8ÑKH@8Òn°@8ž8R 8­m8d7à8aÇ?À8(«n`8$ß_7÷0%7øõ€7æ¯;8hÔ@8Ó¼à8h`ó`8Æ@ 9Gè 9ÀNa :€`#;EZè`)*) >#_=RþG€ÿrà>Â8R@>É8B`>ZU=ÄÃü`<øˆà<5Ôà;¼( ;€!NÀ;fÅ‘ÿÿÿ:»Yþà:ö^MÀ;! Ñ ;(JÀ:u) :µû¤Ÿÿÿÿ:[ME@:†DfÀ:Xë\€:Y :[½ê@:RÚJ:[LŸÿÿÿ:T›ØÀ:V$–€:Q¥Ì€:J%IÀ:?;û`:0Öê:í`: ýª9ñ­‘€:@‰ À:Tù¡À:Šq@:ƒW `:‰Ü†€:bê‘:\Ü¢ :%Ž,@:3ƒ`:>L@:rµ3 :PÔS€:HÅV@:Èy9ÿæªÀ9ÇYêÿÿÿÿ9Ä<™@9±ñ¤à9»Í[ 9”¸9öÎÀ9Un˜À9I4à9ÃÜ@9#cd€8÷4P 8þ: à8ÌÔbŸÿÿÿ8ÑKH@8šè+à8ž8R 8d4  8d7à8+­˜ 8(«n`7ùp€7÷0%7à™«7æ¯;7÷”(€8Ó¼à8gfOà8Æ@ 9Gè 9ÿb`:€`"ÿÿÿÿ;— <¢C\ =€RËÀ=ëÆ@>aZÿÿÿ=³µ”@<¹T¸ ;Z€9„QÀ8ü¾À7á%/7ŸUà7A`73`7 7.€7+7Y¤7or7Äw7¯› 8ÊŠà8T·Ë@8·çù 8päª 98yx€9Ä ˆ€:YÀk 9éPî9â’q`9AÌ”:$`:ÃÀ:Fhãà9ÐǸÀ9§0ô`9^èÿÿÿÿ8ñü¤à8„ú“8ÓüG`9’“@9j¤Å@9v Íà9ª pà9œœ 9û¥Sà:æ[à:ÍЇ ;S)ûà”ð _ÿÿÿ>ÐÊ>wéÒ=éJó =&K@ã€9ñ­‘€9êà{`:Tù¡À:_.À:ƒW `:cc;:bê‘:3_ðÀ:%Ž,@9ó‹V`:>L@:<É€:PÔS€:&B3:Èy9Ýà9ÇYë9‘´K 9±ñ¤à9˜9»9”¸9hÀRà9Un˜À9$Ÿñ 9ÃÜ@8ð< €8÷4P 8Äɶ8ÌÔb 8”Åý€8šè+à8a$1À8d4  8+ãà8+­˜ 7û<õ€7ùp€7Þð67à™«7èC7÷”(€83'ª8gfOà8àna9”Wë`9ÿb`:îšõ`;êïHÀ<éܵ =­¾Å€>¦/=öÿÿÿ=U:×@>ÂYð,x¹>•ƒ#À>V0`=L:1 ã€9ÖJ²à9êà{`9üC¯à:_.À:Q¶`:cc:ÿÿÿÿ:>8»@:3_ðÀ9þCŸ`9ó‹V`9ß½^à:<É€:!—ëÀ:&B39ñ“€9Ýà9£RÛ`9‘´K 9f¥à9˜9»9sÿ 9hÀRà95gÓ€9$Ÿñ 8ï)R 8ð< €8¸õx 8Äɶ8‹ÚÊà8”Åý€8XÃ`8a$1À8&zåÀ8+ãà7ú€Ä7û<õ€7ÞÞ7Þð67áþ]7èC8½¼@83'ª8 û« 8àna9”Wë`:‡§^¤ô—Š;iÉø;eÈ õ =×%5 =äø;Ô\øŸÿÿÿ:\nïÀ9Wìÿ@8T¶¸?ÿÿÿ7â ¸7qf€7Mð7" 7À7 7À75¸7P7gû7t 7É07éùÍ89yé8Aõ7Âñ?8°£ à9BYø àe$9°y¤À9 Ÿ$®9B°290cÂ+È09MÙ, 9oj/óøKÍ9Á <€9Y±” 9898ɘãÀ8–ÜCÀ8AçW 8¢~Uà8ô: 9Fþâ9A&ê 9b®á@94Êõ9C’€9ˆ”! :#Òê ;{½g€<¤È=‘J >1Sz >¢ ­`>™÷À>óO?ÿÿÿ=b£½óA¾<§ÊüGܱ€<–>ÓÝ¢;Ælñ‡Î;­}xc Ø;4°Àçÿþ­;«÷,=;€Á/Wh;uhtOdÓ;B‹zþ\8»@9úl}ZÊÊÊ9þCŸ`9àéa:h9ß½^à:•Ö¶ÿÿå:!—ëÀ9úIÓÛ€->9ñ“€9ЗcŸ½9£RÛ`9~Qq€9f¥ßÿÿÿ9D_]€9sÿ 9K÷Ÿ 95gÓÿÿÿ9¥I 8ï)R 8µÓð€8¸õx 8~ÐŒ`8‹ÚÊà8M‡`8XÃ`8éoà8&zåÀ7ñTR7ú€Ä7ÛËÂ7ÞÞ7êCÓ7áþ]81¤ŽÉ§V8½¼@8Ç¥&ÿ8 û« 9„X WV@9åòƒ€9åòƒ€;!c¹€<% =#.2À=×~ >à=¦Ö¼`<¢ø ;H o`9Wìÿ@9Wìÿ@7â ¸7â ¸7Mð7Mð7Mð7À7À7À7À7P7P7t 7t 7éùÍ7éùÍ8B@8B@9Hî¹`9Hî¹`99%F(@$8ÛFd 8ÛFd 8ü­B 8ü­B 9Y±” 9Y±” 8ɘãÀ8ɘãÀ8AçW 8AçW 8ô: 8ô: 9A&ê 9A&ê 94Êõ94Êõ94Êõ9ˆ”! 9ˆ”! ;%À WsúK„ƒ>}Y‡Ô€µ>ž°Á@>\}¶`=w°H€<Ç÷a ‚ >à¨,¸p=a =è7_ÿÿÿ;ÄÕn :eÍI?ÿÿÿ8É¡1`8É¡1_ÿÿþ7±òWÿÿÿÿ7±òX7Mïÿÿÿÿÿ7Bÿÿÿÿÿ7B7@7@7P¨7P¨7Cä7Cä7rF‰œ)û7à7à7Ûv7Ûv8Ú,Žÿÿÿ8Ú,Ž 99%F(?ýX8p4@8p4@8¬«à8¬«à8êÌ—¿ÿÿþ8êÌ—À8Çlo†þA8odÒ 8odÒ 8D|, 8D|, 9$¶Î 9$¶Îÿÿÿ9[îÿÿÿ9[î€94Êõ9‡,9‡,: + ;¦Ø A | >Šeù™ý>M ˆà=Ó)ÿÿÿÿ=›@ 2î|p> Î@=Ê%@<¡îoØF;j¹í :tÀ´`:tÀ´`8y˜G€8y˜G€7±ºÃè•7°‰à7…[‹†ì¥›7<È7<È7XŠ7XŠ7P¨7C 7C 7{Äÿÿÿÿ7{Ä€7à7z΀7z΀8ià€8ià€8Êm^]38 E;8 E;8c‘Š@8c‘Š@8êÌ—À8¦V+8¦V+8 Jä8 Jä8D|, 8Õ‚88Õ‚89ú¹ 9ú¹ 9ÈÍš Wb8åIô@9;*Þcö°:ŸÇJ@:ŸÇJ@;Ú0öà<$Á@<Ïo•`=†lŸ¶¤.>J;>jß  >)‰°~ô¾=ÏNÍ =)Õ€<•O€< c7; æW`;nûŸÿÿé9`› Ÿÿÿÿ9`›  8´Žõ 8´Žõ 9–mš`9Æ7´@9Æ7´@9 Ð]à9 Ð]à9Å{H@9¯Ûÿ 9¯Ûÿ 9/§À9/§¿ÿÿÿ9.[«DL~X8úôé€9Üõ$æÚì9¾Ûð`9¾Ûð`9 ]ñÀ9 ]ñÀ9›ü€9„>ü€9Q-™@9m;À9m;À8ú4.À8ú4.À9µ 8äs—@8äs—@8„€8„€8saÅ£’ 86†ç 8Aºný 8Å!À8Å!À7ëÉ7ëÉ7êºcÿÿÿÿ7ã8X7ã8Wÿÿÿÿ8  ¥€8  ¥€7÷:’8uïõà8uïõà9Hu6 9Hu6 :3;–—Vº:³M²`;xyõ¥=äH<Ú =x~ƒ`=ªˆT@>È^–™\>AÔ=`N=-VºÀ<³à:tÀ´`:pâ@9÷Áû{ç»À8q?›ÿÿÿÿ8q?œ7°‰à7½Ï`7½Ï`7c?Ûb”ì<7j”7X‰ÿÿÿÿÿ7Zp7Zoÿÿÿÿÿ7C 7‰g@7†…G“ù7WÄ7WÃÿÿÿÿÿ7z΀8=¤<8=¤<8ZU¢lH7Ï—ì7Ï—ì8c‘Š@8xÑXÀ8xÑXÀ8‹ø÷ =3‰8mó‰À8 Jä7û&‚ÿÿÿÿ7û&ƒ8Õ‚89%|~9!ú¸ªWSß8áOþ 8áOþ 8åIô@:%TÆà:%TÆà;a.]~$6Ë;›-à<'æq <±º|€=±W¢€=÷W@>G[p >5 µžå,ð=j =QÄâà<†À2:¯Ê`:¯Ê`:´vbn†08ÆIQ 8ÆIQ 8´Žõ 8”@8”@9®!B¤j ´9• a€9 Ð]à8¡Ì¦à8¡Ì¦à9¯Ûÿ 9Šÿª9‚‹Ù k°9 ¤€9 ¤€8úôé€8úk½À8úk½À9©¡±g‹˜»9‘x#`9 ]ñÀ9CJ 9CJ 9Hgžßÿÿÿ9oÄ‚€9½RT” 9¦¾yÿÿÿÿ9¦¾z9ñ€@9C¶9C¶9”Ëí‡ÿþ÷9bŒP?ÿÿÿ9bŒP@9„>ü€9Skoà9Skoà9?·² %8ä¶@8ú4.À8Ða’ 8Ða’ 8äs—@8¢üà84Õ%¡8@Ly`8@Ly`86†ç 8%/€8%/€8søu;¹7÷×L€7ëÉ7ð™ý€7ð™ý€7ã8X8$Ô6`8!HO˜iX8¥$=ÿÿÿ8¥$= 8uïõßÿÿþ9–9ÈÀ9–9ÈÀ: íàpêm?:í18 ;ó)€=/C`=8¡b=Ò à>"¦Ð ¥°¤>!>E}—=µ =ÿ„ ;Ûf÷?ÿÿÿ;¦"qæ{©±:pâ@9¡{û 9¡Kî•5¸8q?œ8±Ù-`7½Ï`7®pA}m4E7®07j”7©Ð7©Ïÿÿÿÿ7Zp7¼^X7¼^X7‰g@7‚„À7‚„À7WÄ8?Ç× 8=¤<8-ãk×ÿûC7Ï—ì7¯¬°8xÑXÀ8¢ ·8¢ ·8mó‰À81E—`81E—`7û&‚ÿÿÿÿ8á‹@8á‹@9%|~9î  9½:}¹Wþ8áOþ 9O:%TÆßÿÿÿ;-ÉÔ6G„";Em®ßÿÿÿ;·×`<0Ï|œM½ŸŸÀ>+Ÿ¯ÌØÞÒ> ãŽ1mêC=‰*Ü <™P?ÿÿÿ"Áÿ»‚ø>.à=²[Ú€=²†ÖŒ{<ÝL;f«üÀ;f«üÀ9¡{û 9ùžcÀ9ùžcÀ8±Ù-`8§AÇ@8§AÇ@7®08#ã 8#ã 7©Ð8(g€8(g€7¼^X7Áê7Áê7‚„À8VQ‚@8VQ‚@8?Ç× 8/×­÷ÿýÎ7¯¬¯ÿÿÿÿ7½-ð7½-ð8¢ ·8¹³Ú8¹³Ú81E—`8ÄêÀ8ÄêÀ8á‹@9lÏB€9lÏB€9î  9 ÙÅ9 ÙÅ9O;ëà;ëà;… CÀ< Ô€< Ô€=&ß`=ÌÈ¥½x> 8d>#ßc=Ñ=.tt>¶=ÁKÀ<ÔÙAÿÿÿÿ;ê˜í4W;ƒ;‘Ÿ`:©?ˆ`:™?ˆk!mŠ9BÙ`9¨;´ÿÿÿ9¨;´€9»©9“QÐ`9“QÐ`9n35 9€/Ù 9€/Ù 8°Ìà8ªÀ8ªÀ9qò€9`u€9`u€8Ù^Ë8—œ`8—œ_ÿÿÿ9(S•à9A 9A 9CMà8Õ˨€8Õ˨€8Ø÷À9$d„à9$d„à9uì(@8ü‚`8ü‚`9Øà9C!À:9j 8¸¸ @8¸¸ @9Œ' 8àà8àà8¥Gò@8e%8e%8¤Ñ€8‰tßÿÿÿ8‰tà8aH[à8+Æ£À8+Æ£¿ÿÿÿ8®8.™ä@8.™ä?ÿÿÿ8‘u82ÀY 82ÀY 8Çÿÿÿÿ8efù€8efù€8E_Ö 90µ¦@90µ¦@8áT @:?ü5À:?ü5¿ÿÿþ9éîõ€;Tž=Yîõ€;ÞG* <ã£zà<ã£zà=º…c =à %í͇ø>6ÝO¦cM>1s@€>ß =´m@=´m@EI€>*æúà>)êÿÿÿ>˜9¿9eÖ=¤"}K¦=CÈ·@dV7` >6N4 >C €>'b³À>=z =yµè =yµè ;øˆáÀ;ôT¬Új8;‚È à; G¬®Ò^”:Dz `:D31­îy9³»çà8˜’Z 8˜’Z 9—t§9—t§8µkM 8µkM 8‚(ì€8‚(ì€8ð2`8ð2`8ñÛ€8i`8i`8}ŵٿûÝ8¦<à8¦<ßÿÿÿ8çÈÈ8à ;8à ;8Ðê@8Ðê@9…€9…€:8:89w:à9w:à:{[ :zè~hãÓj;¥•§€;²ýà¶cn<}H =rz >BYÉ >/žÀ=û>à=‘Ë…€=x¬í'08à<Ûx @<˜£;¯Údà;U°óÂV¦:mâV:mâV:îÛ`9ùç@9ùç@:7>ü:7>ü9ºVU€9ºVU€9ñ{ 9ñ{ 8’ä@8’ä@9 ÝÙÿÿÿ95Ш½¢95@ à94ø˜I'28ÞDÖ@8»S|`8»S|`99þÀ99þÀ8ú0À8ú0À8uÙ 8uÙ 8²ÀZ€8²ÀZ€8í!Ñ@8æ@‚€8æ@‚€8Ö‚µ;ÿÿ08€Œ¯8€Œ¯8kN\`8´íÁ@8´íÁ@8ž¨È 8ž¨È 88&Ÿ 88&Ÿ 8…¸ 8…¸ 8tÿÀ`8tÿÀ`8fí8ž…“V€8'q8Yô·Ã+n8¼qðà8{í`8{í`8Ì €8Ì €8‹8 8‹8 9érÀ9érÀ9™É€9™É€:f*!`:’éî :’éî <úÒéî <¥ÝA <¥ÝA =‚í =‚í =ôwœ€>(‡g€>Jú@>CK¢ oOÅ>GéK£n>>•l§ö=Aˆ”‘öĉ= Vûà<€ƒ <€*(€;ÆCñ`;¤§Ôà9³»çà9³»çà9³»çà:ªá²`:z–µÍ«Q9—t§9—t§9:…À9:…À8‚(ì€8‚(ì€9‘ü 9‘ü 8ñÛ€8ñÛ€8ìô?€R8çÈÈ8çÈÇÿÿÿÿ9ñy"€9ñy"€8Ðê@8Ðê@9†j— 9†j— :8:8:j ‰Þá.:—±Là:{[ :{[ :{[ >:ão|¯Õ>Uð3`h>M¼F\¼>+|œ =Ès©€=Ès©€=;ë¶ÿÿÿ=;ë¶€<,š‰À<,š‰¿ÿÿÿ;á´ø‹ÿP;ÍRÈÀ;ÍRÈÀ:~ x@:~ x@:7>ü:7>ü:Pȸ :Pȸ 9ñ{ 9ñ{ 9ð‰é¿˜9é¡6`9 ÝÙ€9 ÝÙ€9 ÝÙ€9®¥· 8ÞDÖ@8ÞDÖ@8ÞDÖ@8ÀÄ@96Þ_b99þÀ99þÀ8ÆcÁ8ÆcÁ8uÙ 8uÙÿÿÿ9g0 9g0 8í!Ñ@8í!Ñ@8Ý=œ`Q8kN\`8kN\`8w @8w @8ž¨È 8ž¨È 8—&E@8—&E@8…¸ 8…¸ 8¶²†=­ü!8äœNà8fí8fí8fí8yÞH 8¼qðßÿÿÿ8¼qðà8¼qðà95æàÿÿÿ92Ë^ùA8Ì €8Ì €:,™Là:,™Lßÿÿÿ9érÀ9érÀ:¿ýv€:¿ýv€;€ ;€ Mø >62Ï+†>>Bìöâ>Qs_ >^yÀ>Cûà=Ä@ã`=‚%÷A™=MçZ@¼À_=Oî €<É7C`<—f ;;¤a:Ýgÿ€:Û¼ï;Ò¥:ªá²`:ªá²`:ªá²`:på• 9:†åÄÞ9:…À9:…À9:…À:Š9K9‘ü 9‘ü 9‘ü 9á½>rÿF9ñy"€9ñy"€9ñy"€:Xô€9†j— 9†j— 9†j— 9†j— ;>à:—±Lßÿÿÿ:—±Là:—±Là;ßÝgDyù;à—z`V·°à>`C >FÁ`>RÓè@>dL"iì–=ˆ™€=s=€=\œ<‘£/À<‰kRqÞ#’ó`>He 2>N×ÿÿÿÿ>f@>bÐE`>bÇ$Eë(=ÒåÙßÿÿÿ=Ç’Y=¯íº ý=¯íºŸÿÿÿ=‚pt`<#&b@<#&b@<$È ;ë<€Ye >WÆÏÞÊ„¦>WÑN >^ «@>7{?>1å‹ÎÐOÝ=õd =–|v =„§=„§<ára@<»…—ÿÿÿ<«µÄ!À6WŸÿ¯8±[ï@8±[ï@8±[ï@8±[ï@9"ðbà8¦28¦28¦28¦28÷%¿ 8÷JËÖ ‘9º× 9º× 9º× 9º× 9Pà9³Ú# 9³Ú# 9³Ú# 9³Ú# :?¸i" Ã:?Çé`:nÀ:nÀ:nÀ:nÀ;uà;Frà;Frà< @;ëýÅ€<üÔ¢Ÿq`==±í =I¶Oåˆ$=Qd =Ëç@=ñÔaàö¾>°p€>3•5–&…>4Ç@@>_ (>lK¯éÆt>rOG`>?ËßõUÎ>:}èÀ>P*€>D þ¯pž©>pà =c#@=c#@=|ËÎßÿÿÿ=pŸŸ+CñÂ=;èÒ =+ÛÎo5B<ÞXé@;´¯ ;´¯Ÿÿÿÿ=#€Ï1à>v®<¾¯Ù>9¦à>'W4¿'>1Ž˜à>D3Kà>BZ¤Ñ¨ûã>QÅÇ >P¿Mk5>I¹ü@>+5À>£R¡‰#=Á,ü =«Ù\ =«Ù\ = S»€=ø§Ò‘D~=XÕ?ÿÿÿ<òg0É<|· <ˆ*_s«Â<,äà;“V ;“V ;Ûv¯@:Kg¹@:Kg¹@:Kg¹@:Kg¹@:Kg¹@:Ñ{FXˆ†‰:ß½E@:iÙ :iÙ :iÙ :iÙ :iÙ :®ì :õKx^GÄ9­:5 9­:5 9­:5 9­:5 9­:5 9O%?€9c„ 9c„ 9c„ 9c„ 9c„ 9T³Î=9"ðbà9"ðbà9"ðbà9"ðbà9"ðbà9ØÐà8÷%¿ 8÷%¿ 8÷%¿ 8÷%¿ 8÷%¿ :E·­×8M:S½è`9Pà9Pà9Pà9Pà9Pà:žê :‘:šä;:?Çé`:?Çé`:?Çé`:?Çé`:?Çé`;Ñ›:;¤${@;¤${@TÊb²ž>;Ù ><š½æHê>A`>p)‘‚€lÈ>m嫟ÿÿÿ>`A2#>\’4à>|zŽ >ÈP >6Á«à>ˆ =¹^F†m9Þ>1± à>$µÛ2,>Íx@=Ú;¹8Ž€=‡½5`=zã„Nt@=Ö¢n=Ö¢mÿÿÿÿ=ׇiê[ß¶=éV‘_ÿÿÿ=Ö³òrŸÁ<>9±(@>sé¶`>‚ˆ¡à>r4õ>oõNÿÿÿ>cU¢ÃùMX>SŸK@>LÉ„VSÇx>#G&€>"VIRqõ”=õ)x@=èXPó¿Âì=ÓS=ÓS=Q6ú =Q6ú =9&“`=9&“`=). úÀ<Úk<Úk<¦1r <¦1r <E-_ÿÿþ<E-_ÿÿÿ<Á¯Þã%<@˜`:Á>g€:Á>g€;/4ÙtÊ;~Q7€:“¿~`:“¿~`:“¿~`: ì :®ì :®ì :®ì :®ì :®ì :®ì :®ì :qda@:_FŸ½,9O%?€9O%?€9O%?€9O%?€9O%?€9O%?€9Èß°¿ÿì9ØÐà9ØÐà9ØÐà9ØÐà9ØÐà9ØÐßÿÿÿ:°Â{¾â¯:£Ù:S½è`:S½è`:S½è`:S½è`:S½è`:S½è`:S½è`:§Íœà:±‘?à:±‘?à:±‘?à;>?ÿÿÿ:õoßåËí#:Ù'B@:Ù'B@;ðõÀ;ñÀuºpˆ;ó„À;ó„ÀЇ€>‚åÛú«ë>1 ´ ìíÃ>OœÔ>K&_ÿÿÿ>]Jµ4«S>`oƒà>m}õ >|šñ >zŽúGœ>mÈÀ>P©P >ú""r>…  Ì!X‡>v-:€>R¨-@>B—Ìý$><`>€>qoŸà>qoŸà>C™-@>ĉ€>G.ËÿÿG>Vz €>gr`>@å >@å >aIõÀ>¯Ïà>9ô„RÔÙÇ>HŸ™`>ƒàäßÿÿÿ>ƒÀÁ'4“´>€zص…Ä>b*¶ >eÐGÀ>b„ChÎ>aĺÀ>avà>jÉ1_ÿÿÿ>f˜T'OøÞ>@‚à>8EÛ`>Ðgð—Ÿ=øíÔ2’†V=õ™=×[€=ÓogÓì1=ÐZ¸€=v ¶¿ÿÿÿ=e‚€}=e‚€=e‚€=e‚€=U]ÿÌ<©‰5à<©‰5à<©‰5à<©‰5à<¥TÓ@<T¹À<T¹À<T¹À<T¹À;Ö."tÏ;¹¤ŒÃ+?ß: ì : ì : ì : ì : ì : ì : ìŸÿÿÿ: ì : ì :–ý›Ä~±:’>B°Iåâ:qda@:qda@:qda@:qda@:qda@:qda@:qda@:qda@:qda@:³.ü ÿÿÊ:£Ù:£Ù:£Ù:£Ù:£Ù:£Ù:£Ù:£Ù:£Ù:£íHìÆ6:œõO˜ |¸:§Íœà:§Íœà:§Íœà:§Íœà:§Íœà:§Íœà:§Íœà:§Íœà:§Íœà;ÁÈ¿¬0Æ;ÄliGùµ;™k€ ;™k€ ;™k€ ;™k€ <®zË<‘HÒÿÿÿ<‘HÒ <‘HÒ <‘HÒ =l°cH€=…hÇà=…hÇà=…hÇà=…hÇà=…hÇà=…hÇà=ƒ B5L=¬ =ë¢"=ë¢"=ì›-éê=ðvà>Ûó >Ûó >ˆ/k„>›Ã >D(ÂTVr >E½À>E½À>4A¿à>S6Lç°ã>W f@>W f@>Tòà >a÷e™pN>eôX@>eôX@>b'å ß>m ,¶éÍ>y\ÞÀ>y\ÞÀ>q9«ø0>b,ò`>b,ò`>WÅúz¯>WR)½—v>j5q€>j5q€>bDíLç#Â>Máj@>Yš­`>Yš­`>U!ç¦jçù>3á†>4ÑÀ>4ÑÀ>3þÂÄ—U=ý¼`> j(éæ> ïïÀ> ïïÀ=Ö0=Õ :°–€=ÔÖ€=ÔÖ€=k§v`=x1èÉoɧ=ÑC_ÿÿÿ=ÑC`=ÑC_ÿÿÿ=ÑC`=ÑC`=ÑC`=oѤßû<˜_þÀ<˜_þÀ<˜_þÀ<˜_þÀ<˜_þÀ<˜_þÀ<“ýÿá}þ:<ŒÈ <,Íqßÿÿÿ<,Íqßÿÿÿ<,Íqà<,Íqßÿÿÿ<,Íqà<,Íqà<+£‡zè";ïAê`;ÀÄœB¸A;·¹ÑÀ;·¹ÑÀ;·¹ÑÀ;·¹ÑÀ;·¹ÑÀ;·¹ÑÀ;èr‚@;Ô¸ hážÁ;ú> ;ú> ;ú> ;ú> ;ú> ;ú> ;” :àÞ; :àÞ; :àÞ; :àÞ; :àÞ; :àÞ; ;ÃÙ`\¹;Öƒs;µ¸À;µ¸À;µ¸À;µ¸À;µ¸À;µ¸À;À¨Tt i,;ò <= ^U<<>b:<>b:<>b:<>b:<>b:<>b:<ìgá€<àò¸ôr<Ñ L@<Ñ L@<Ñ L@<Ñ L@<Ñ L@<Ñ L@=ujé)ˆ=ƒ*VÀ=ƒ*VÀ=ƒ*VÀ=ƒ*VÀ=ƒ*VÀ=ƒ*VÀ=ƒ*VÀ=ƒ*VÀ=ƒ*VÀ=ƒ*VÀ=ƒ*VÀ=ƒ*VÀ=ƒ*VÀ=ƒ*VÀ=„•škʧ=Œ®F€=Ô ›üB(›=×i*€=×i*€=×i*€=×i*€=×i*€=×6Ô-œå=ǧ”1lç=Ý»Ÿ|Š…Š=æ‚Ãze¶=ç1 =ç1 =ç1 =ç1 =ç1 =ìt90=ðñ  =ðñ  =ðñ  =ðñ  =ðñ  =ð’èðþ‚=æ0 ?ÃnÔ=ÑZÉ泇=Ü0Aæy¬ì=Ü`Øà=Ü`Øà=Ü`Øà=Ü`Øà=Ü`Øà=ØDÑ1¦ ™=ŠP0`=‡–5å¦z=úñßÿÿÿ=úñà=úñà=úñà=úñà=úñà=úñà=úñà=úñà=úñà=úñà=úñà=úñà=úñà=pˆloÿö<ðøà<ðøà<ðøà<ðøà<ðøà<ðøà<ðøà<ðøà<ðøà<ðøà<ðøà<ðøà<ðøà<ðøà<ìÎ{ý%à–<Òi‡<¥úðT'-"<= <= <= <= <= <= <= <= <= <= <= <= <= <= WCS->HEALPix conversion for a random map, with a WCS projection large enough to store each HEALPix pixel""" import healpy as hp npix = hp.nside2npix(nside) healpix_data = np.random.uniform(size=npix).astype(dtype) reference_header = get_reference_header(oversample=2, nside=nside) wcs_out = WCS(reference_header) shape_out = reference_header['NAXIS2'], reference_header['NAXIS1'] image_data, footprint = reproject_from_healpix( (healpix_data, healpix_system), wcs_out, shape_out=shape_out, order='nearest-neighbor', nested=nested) healpix_data_2, footprint = reproject_to_healpix( (image_data, wcs_out), healpix_system, nside=nside, order='nearest-neighbor', nested=nested) np.testing.assert_array_equal(healpix_data, healpix_data_2) @pytest.mark.skipif('not HAS_HEALPY') def test_reproject_file(): reference_header = get_reference_header(oversample=2, nside=8) data, footprint = reproject_from_healpix(os.path.join(DATA, 'bayestar.fits.gz'), reference_header) reference_result = fits.getdata(os.path.join(DATA, 'reference_result.fits')) np.testing.assert_allclose(data, reference_result) @pytest.mark.skipif('not HAS_HEALPY') def test_reproject_invalid_order(): reference_header = get_reference_header(oversample=2, nside=8) with pytest.raises(ValueError) as exc: reproject_from_healpix(os.path.join(DATA, 'bayestar.fits.gz'), reference_header, order='bicubic') assert exc.value.args[0] == "Only nearest-neighbor and bilinear interpolation are supported" reproject-0.3.2/reproject/healpix/tests/test_utils.py0000644000077000000240000000342413173065713023002 0ustar tomstaff00000000000000import numpy as np from astropy.tests.helper import pytest from astropy.coordinates import FK5, Galactic, ICRS from astropy.io import fits try: import healpy HAS_HEALPY = True except: HAS_HEALPY = False from ..utils import parse_coord_system, parse_input_healpix_data def test_parse_coord_system(): frame = parse_coord_system(Galactic()) assert isinstance(frame, Galactic) frame = parse_coord_system('fk5') assert isinstance(frame, FK5) with pytest.raises(ValueError) as exc: frame = parse_coord_system('e') assert exc.value.args[0] == "Ecliptic coordinate frame not yet supported" frame = parse_coord_system('g') assert isinstance(frame, Galactic) with pytest.raises(ValueError) as exc: frame = parse_coord_system('spam') assert exc.value.args[0] == "Could not determine frame for system=spam" @pytest.mark.skipif('not HAS_HEALPY') def test_parse_input_healpix_data(tmpdir): data = np.arange(3072) col = fits.Column(array=data, name='flux', format="E") hdu = fits.BinTableHDU.from_columns([col]) hdu.header['NSIDE'] = 512 hdu.header['COORDSYS'] = "G" # As HDU array, coordinate_system = parse_input_healpix_data(hdu) np.testing.assert_allclose(array, data) # As filename filename = tmpdir.join('test.fits').strpath hdu.writeto(filename) array, coordinate_system = parse_input_healpix_data(filename) np.testing.assert_allclose(array, data) # As array array, coordinate_system = parse_input_healpix_data((data, "galactic")) np.testing.assert_allclose(array, data) # Invalid with pytest.raises(TypeError) as exc: parse_input_healpix_data(data) assert exc.value.args[0] == "input_data should either be an HDU object or a tuple of (array, frame)" reproject-0.3.2/reproject/healpix/utils.py0000644000077000000240000000412513173065713020600 0ustar tomstaff00000000000000import tempfile import numpy as np from astropy.io.fits import TableHDU, BinTableHDU from astropy.extern import six from astropy.coordinates import BaseCoordinateFrame, frame_transform_graph, Galactic, ICRS FRAMES = { 'g': Galactic(), 'c': ICRS() } def parse_coord_system(system): if isinstance(system, BaseCoordinateFrame): return system elif isinstance(system, six.string_types): system = system.lower() if system == 'e': raise ValueError("Ecliptic coordinate frame not yet supported") elif system in FRAMES: return FRAMES[system] else: system_new = frame_transform_graph.lookup_name(system) if system_new is None: raise ValueError("Could not determine frame for system={0}".format(system)) else: return system_new() def parse_input_healpix_data(input_data, field=0, hdu_in=None): """ Parse input HEALPIX data to return a Numpy array and coordinate frame object. """ if isinstance(input_data, (TableHDU, BinTableHDU)): # TODO: for now we have to write out to a temporary file. A pull # request to healpy has been merged to allow ``read_map`` to take # HDUList objects and HDUs, but we have to wait for a stable release # before we can use that: # # https://github.com/healpy/healpy/pull/249 filename = tempfile.mktemp() input_data.writeto(filename) input_data = filename if isinstance(input_data, six.string_types): from healpy import read_map array_in, header = read_map(input_data, verbose=False, h=True, field=field, hdu=1 if hdu_in is None else hdu_in) coordinate_system_in = parse_coord_system(dict(header)['COORDSYS']) elif isinstance(input_data, tuple) and isinstance(input_data[0], np.ndarray): array_in = input_data[0] coordinate_system_in = parse_coord_system(input_data[1]) else: raise TypeError("input_data should either be an HDU object or a tuple of (array, frame)") return array_in, coordinate_system_in reproject-0.3.2/reproject/interpolation/0000755000077000000240000000000013173066302020314 5ustar tomstaff00000000000000reproject-0.3.2/reproject/interpolation/__init__.py0000644000077000000240000000022712724021736022431 0ustar tomstaff00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ Routines to carry out reprojection by interpolation. """ from .high_level import * reproject-0.3.2/reproject/interpolation/core_celestial.py0000644000077000000240000001336513173065737023666 0ustar tomstaff00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst from __future__ import absolute_import, division, print_function import numpy as np from ..wcs_utils import convert_world_coordinates from ..array_utils import iterate_over_celestial_slices, map_coordinates def _reproject_celestial(array, wcs_in, wcs_out, shape_out, order=1): """ Reproject data with celestial axes to a new projection using interpolation, assuming that the non-celestial axes match exactly and thus don't need to be reprojected. This is a therefore a special case where we can reproject all the celestial slices in the same way. The input and output WCS and shape have to satisfy a number of conditions: - The number of dimensions in each WCS should match - The output shape should match the dimensionality of the WCS - The input and output WCS should both have celestial components - The input and output WCS should have the same set and ordering of axis_types """ # Make sure image is floating point array = np.asarray(array, dtype=float) # Check dimensionality of WCS and shape_out if wcs_in.wcs.naxis != wcs_out.wcs.naxis: raise ValueError("Number of dimensions between input and output WCS should match") elif len(shape_out) != wcs_out.wcs.naxis: raise ValueError("Length of shape_out should match number of dimensions in wcs_out") # Check whether celestial components are present if not wcs_in.has_celestial: raise ValueError("Input WCS does not have celestial components") elif not wcs_out.has_celestial: raise ValueError("Input WCS has celestial components but output WCS does not") if tuple(wcs_in.wcs.axis_types) != tuple(wcs_out.wcs.axis_types): raise ValueError("axis_types should match between the input and output WCS") if tuple(wcs_in.wcs.cunit) != tuple(wcs_out.wcs.cunit): raise ValueError("units should match between the input and output WCS") # We create an output array with the required shape, then create an array # that is in order of [rest, lat, lon] where rest is the flattened # remainder of the array. We then operate on the view, but this will change # the original array with the correct shape. array_new = np.zeros(shape_out) xp_in = yp_in = None subset = None # Loop over slices and interpolate for slice_in, slice_out in iterate_over_celestial_slices(array, array_new, wcs_in): if xp_in is None: # Get position of output pixel centers in input image xp_in, yp_in = _get_input_pixels_celestial(wcs_in.celestial, wcs_out.celestial, slice_out.shape) coordinates = np.array([yp_in.ravel(), xp_in.ravel()]) # Now map_coordinates is actually inefficient in that if we # pass it a large array, it will be much slower than a small # array, even if we only need to reproject part of the image. # So here we can instead check what the bounding box of the # requested coordinates are. We allow for a 1-pixel padding # because map_coordinates needs this jmin, imin = np.floor(np.nanmin(coordinates, axis=1)).astype(int) - 1 jmax, imax = np.ceil(np.nanmax(coordinates, axis=1)).astype(int) + 1 ny, nx = slice_in.shape # Check first if we are completely outside the image. If this is # the case, we should just give up and return an array full of # NaN values if imin >= nx or imax < 0 or jmin >= ny or jmax < 0: return array_new * np.nan, array_new.astype(float) # Now, we check whether there is any point in defining a subset if imin > 0 or imax < nx - 1 or jmin > 0 or jmax < ny - 1: subset = (slice(max(jmin, 0), min(jmax, ny - 1)), slice(max(imin, 0), min(imax, nx - 1))) if imin > 0: coordinates[1] -= imin if jmin > 0: coordinates[0] -= jmin # If possible, only consider a subset of the array for reprojection. # We have already adjusted the coordinates above. if subset is not None: slice_in = slice_in[subset] # Make sure image is floating point. We do this only now because # we want to avoid converting the whole input array if possible slice_in = np.asarray(slice_in, dtype=float) slice_out[:, :] = map_coordinates(slice_in, coordinates, order=order, cval=np.nan, mode='constant' ).reshape(slice_out.shape) return array_new, (~np.isnan(array_new)).astype(float) def _get_input_pixels_celestial(wcs_in, wcs_out, shape_out): """ Get the pixel coordinates of the pixels in an array of shape ``shape_out`` in the input WCS. """ # TODO: for now assuming that coordinates are spherical, not # necessarily the case. Also assuming something about the order of the # arguments. # Generate pixel coordinates of output image xp_out, yp_out = np.indices(shape_out, dtype=float)[::-1] # Convert output pixel coordinates to pixel coordinates in original image # (using pixel centers). xw_out, yw_out = wcs_out.wcs_pix2world(xp_out, yp_out, 0) xw_in, yw_in = convert_world_coordinates(xw_out, yw_out, wcs_out, wcs_in) xp_in, yp_in = wcs_in.wcs_world2pix(xw_in, yw_in, 0) return xp_in, yp_in reproject-0.3.2/reproject/interpolation/core_full.py0000644000077000000240000001331112737263231022644 0ustar tomstaff00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst from __future__ import absolute_import, division, print_function import numpy as np from ..wcs_utils import convert_world_coordinates from ..array_utils import map_coordinates def _reproject_full(array, wcs_in, wcs_out, shape_out, order=1): """ Reproject n-dimensional data to a new projection using interpolation. The input and output WCS and shape have to satisfy a number of conditions: - The number of dimensions in each WCS should match - The output shape should match the dimensionality of the WCS - The input and output WCS should have the same set of axis_types, although the order can be different as long as the axis_types are unique. """ # Make sure image is floating point array = np.asarray(array, dtype=float) # Check dimensionality of WCS and shape_out if wcs_in.wcs.naxis != wcs_out.wcs.naxis: raise ValueError("Number of dimensions between input and output WCS should match") elif len(shape_out) != wcs_out.wcs.naxis: raise ValueError("Length of shape_out should match number of dimensions in wcs_out") # Check whether celestial components are present if wcs_in.has_celestial and wcs_out.has_celestial: has_celestial = True elif wcs_in.has_celestial: raise ValueError("Input WCS has celestial components but output WCS does not") elif wcs_out.has_celestial: raise ValueError("Output WCS has celestial components but input WCS does not") else: has_celestial = False # Check whether a spectral component is present, and if so, check that # the CTYPEs match. if wcs_in.wcs.spec >= 0 and wcs_out.wcs.spec >= 0: if wcs_in.wcs.ctype[wcs_in.wcs.spec] != wcs_out.wcs.ctype[wcs_out.wcs.spec]: raise ValueError("The input ({0}) and output ({1}) spectral " "coordinate types are not equivalent." .format(wcs_in.wcs.ctype[wcs_in.wcs.spec], wcs_out.wcs.ctype[wcs_out.wcs.spec])) elif wcs_in.wcs.spec >= 0: raise ValueError("Input WCS has a spectral component but output WCS does not") elif wcs_out.wcs.spec >= 0: raise ValueError("Output WCS has a spectral component but input WCS does not") # We need to make sure that either the axis types match exactly, or that # they are shuffled but otherwise they are unique and there is a one-to-one # mapping from the input to the output WCS. if tuple(wcs_in.wcs.axis_types) == tuple(wcs_out.wcs.axis_types): needs_reorder = False else: if sorted(wcs_in.wcs.axis_types) == sorted(wcs_in.wcs.axis_types): if len(set(wcs_in.wcs.axis_types)) < wcs_in.wcs.naxis or \ len(set(wcs_out.wcs.axis_types)) < wcs_out.wcs.naxis: raise ValueError("axis_types contains non-unique elements, and " "input order does not match output order") else: needs_reorder = True else: raise ValueError("axis_types do not map from input WCS to output WCS") # Determine mapping from output to input WCS if needs_reorder: axis_types_in = tuple(wcs_in.wcs.axis_types) axis_types_out = tuple(wcs_out.wcs.axis_types) indices_out = [axis_types_out.index(axis_type) for axis_type in axis_types_in] else: indices_out = list(range(wcs_out.wcs.naxis)) # Check that the units match for index_in, index_out in enumerate(indices_out): unit_in = wcs_in.wcs.cunit[index_in] unit_out = wcs_out.wcs.cunit[index_out] if unit_in != unit_out: raise ValueError("Units differ between input ({0}) and output " "({1}) WCS".format(unit_in, unit_out)) # Generate pixel coordinates of output image. This is reversed because # numpy and wcs index in opposite directions. pixel_out = np.indices(shape_out, dtype=float)[::-1] # Reshape array so that it has dimensions (npix, ndim) # pixel_out = pixel_out.transpose().reshape((-1, wcs_out.wcs.naxis)) pixel_out = pixel_out.reshape((wcs_out.wcs.naxis, -1)).transpose() # Convert output pixel coordinates to pixel coordinates in original image # (using pixel centers). world_out = wcs_out.wcs_pix2world(pixel_out, 0) if needs_reorder: # We start off by creating an empty array of input world coordinates, and # we then populate it index by index world_in = np.zeros_like(world_out) axis_types_in = list(wcs_in.wcs.axis_types) axis_types_out = list(wcs_out.wcs.axis_types) for index_in, axis_type in enumerate(axis_types_in): index_out = axis_types_out.index(axis_type) world_in[:, index_in] = world_out[:, index_out] else: world_in = world_out if has_celestial: # Now we extract the longitude and latitude from the world_out array, and # convert these, before converting back to pixel coordinates. lon_out, lat_out = world_out[:, wcs_out.wcs.lng], world_out[:, wcs_out.wcs.lat] # We convert these coordinates between frames lon_in, lat_in = convert_world_coordinates(lon_out, lat_out, wcs_out, wcs_in) world_in[:, wcs_in.wcs.lng] = lon_in world_in[:, wcs_in.wcs.lat] = lat_in pixel_in = wcs_in.wcs_world2pix(world_in, 0) coordinates = pixel_in.transpose()[::-1] array_new = map_coordinates(array, coordinates, order=order, cval=np.nan, mode='constant' ).reshape(shape_out) return array_new, (~np.isnan(array_new)).astype(float) reproject-0.3.2/reproject/interpolation/high_level.py0000644000077000000240000000743013173065713023005 0ustar tomstaff00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst from __future__ import (absolute_import, division, print_function, unicode_literals) from astropy.extern import six from ..utils import parse_input_data, parse_output_projection from .core_celestial import _reproject_celestial from .core_full import _reproject_full __all__ = ['reproject_interp'] ORDER = {} ORDER['nearest-neighbor'] = 0 ORDER['bilinear'] = 1 ORDER['biquadratic'] = 2 ORDER['bicubic'] = 3 def reproject_interp(input_data, output_projection, shape_out=None, hdu_in=0, order='bilinear', independent_celestial_slices=False): """ Reproject data to a new projection using interpolation (this is typically the fastest way to reproject an image). Parameters ---------- input_data : str or `~astropy.io.fits.HDUList` or `~astropy.io.fits.PrimaryHDU` or `~astropy.io.fits.ImageHDU` or tuple The input data to reproject. This can be: * The name of a FITS file * An `~astropy.io.fits.HDUList` object * An image HDU object such as a `~astropy.io.fits.PrimaryHDU`, `~astropy.io.fits.ImageHDU`, or `~astropy.io.fits.CompImageHDU` instance * A tuple where the first element is a `~numpy.ndarray` and the second element is either a `~astropy.wcs.WCS` or a `~astropy.io.fits.Header` object output_projection : `~astropy.wcs.WCS` or `~astropy.io.fits.Header` The output projection, which can be either a `~astropy.wcs.WCS` or a `~astropy.io.fits.Header` instance. shape_out : tuple, optional If ``output_projection`` is a `~astropy.wcs.WCS` instance, the shape of the output data should be specified separately. hdu_in : int or str, optional If ``input_data`` is a FITS file or an `~astropy.io.fits.HDUList` instance, specifies the HDU to use. order : int or str, optional The order of the interpolation (if ``mode`` is set to ``'interpolation'``). This can be either one of the following strings: * 'nearest-neighbor' * 'bilinear' * 'biquadratic' * 'bicubic' or an integer. A value of ``0`` indicates nearest neighbor interpolation. independent_celestial_slices : bool, optional This can be set to ``True`` for n-dimensional input in the following case (all conditions have to be fulfilled): * The number of pixels in each non-celestial dimension is the same between the input and target header. * The WCS coordinates along the non-celestial dimensions are the same between the input and target WCS. * The celestial WCS component is independent from other WCS coordinates. In this special case, we can make things a little faster by reprojecting each celestial slice independently using the same transformation. Returns ------- array_new : `~numpy.ndarray` The reprojected array footprint : `~numpy.ndarray` Footprint of the input array in the output array. Values of 0 indicate no coverage or valid values in the input image, while values of 1 indicate valid values. """ array_in, wcs_in = parse_input_data(input_data, hdu_in=hdu_in) wcs_out, shape_out = parse_output_projection(output_projection, shape_out=shape_out) if isinstance(order, six.string_types): order = ORDER[order] if (wcs_in.is_celestial and wcs_in.naxis == 2) or independent_celestial_slices: return _reproject_celestial(array_in, wcs_in, wcs_out, shape_out=shape_out, order=order) else: return _reproject_full(array_in, wcs_in, wcs_out, shape_out=shape_out, order=order) reproject-0.3.2/reproject/interpolation/tests/0000755000077000000240000000000013173066302021456 5ustar tomstaff00000000000000reproject-0.3.2/reproject/interpolation/tests/__init__.py0000644000077000000240000000000012521755577023574 0ustar tomstaff00000000000000reproject-0.3.2/reproject/interpolation/tests/baseline/0000755000077000000240000000000013173066302023240 5ustar tomstaff00000000000000reproject-0.3.2/reproject/interpolation/tests/baseline/test_reproject_celestial_2d_gal2equ.fits0000644000077000000240000011660013173065713033226 0ustar tomstaff00000000000000SIMPLE = T / conforms to FITS standard BITPIX = -64 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 43 NAXIS2 = 43 EXTEND = T COMMENT FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H CRPIX1 = 20 CRVAL1 = 266.39311 CDELT1 = -0.002 CTYPE1 = 'RA---TAN' CRPIX2 = 21.5 CRVAL2 = -28.939779 CDELT2 = 0.002 CTYPE2 = 'DEC--TAN' CROTA2 = 0.000000000 LONPOLE = 0.000000000 END øøøøøøøøøø>ÞH¯Næ/ê>ߊ~Mã¶a>à'JÇÕM>ÜDÒKW X>ÕÙ«êÓÎY>ÓvÓ'ì?t>ÚÖ«KäãJ>׈eäT >ÒÀŒÛö7›>Õ~.øñ>ÕØp“ÓP>ÓÌK3ËUâ>Ô:´î }>Ø sÜ©@n>Ù>åÝ“¬Œ>×·É˲ýq>×/g²»>Ó'¨ò‹>Ò"3؃Lz>Ôï:™x;ì>Ým ÔÉÅÂOÉô>ØÑ­õ8>×T€, >Ø|-Ù|[6>ÙsM®æ4„>×yC'‡õM>Öv‹¬U†§>Ú­ê7xV>ØÆ)`1š>Õ¥†Q…}>Ùi{(ØÍ¬>ÔÌ1´N>Ó'R °>ØÅ)nXÊï>ÜÔRÃ*EÂ>ÞŽG :8>Öfg•ÚI>Ѷ½`0*>Ó0,™ö–h>ÏfbÔï° >Ðb-{Z)@>×9áølÂ>ÒZÃö’ò>ÚDl%c‰Møøøøøøøøøøøøøøøøøøø>Õ ãЂóˆ>ÕD„õ·>Ó8üõ`I>Öü4ÒÞ¡Ï>Ü¢ñá³>Úì '$k”>×]¶`Ì%>Ôý Ëè>Õ1‘ñ Õ8>ÕÊúöÿÜ>ØQÈ’AJ>Ø|09%¿>Õnlµ§%Z>Ý—RÁJª„>Û˜çlö!™>Ù¨1Œ´>ØüDðJÌ>Ùó0 Áe>ÚõÌ(ýC>Ø ”Q°C>ÔÐ bŒó=>ÓJâ&‘í¨>ÖMÒ˜ 8ª>Ùâvç >Û5æ°¡’>Ü¥S…@xføøøøøøøøøøøøøøøø>Þr Jxnû>ÛàÞ«ù8…°>Õ]ùÜ>ï|>ÛêÂÐÎ]û>ÞæŸçëý(>ÜÊÆjè‘>Û!Ñ“š¾>Ù~=Zý5>ÔóÈË…\>Ùâþ_lÎÅ>×&Ô“v>Õ:/Uo*t>Ös sæ>ÙI>²d^K>ÙƒT>Ø/,ˆÇ>ØÃ ™‹ß‡>Ú tÖ˜>ÛIŽ2ÚF>Úr{­þ›C>Ó¯Bê Ø®>ÓJŒ{šN>Ø¿ºîGã>Ø·Á€U?>Ü7­1Ú‹Ç>ÜýÉ]ˆÖJ>àÍ‚Ù͸øøøøøøøøøøøøøø>ÝI½oúÍ>Ýh¢|>ÝWuÛ+ï>ØÀ±¯yil>×"·}·ƒ>× ÇÖb>ÞNÚÉÏš>߇ã6Ñ’ÿ>Û£Þ,ÍA>Ù÷K$ºK½>Ù7ùfæ,Œ>Ù¤öSµ…n>ÕèÛlY>ÓºdNØÌ,>Ö-Fž>Ú§²¥ðÒ³>݆Eã>Ùl+LÁ>Õ#ä^2¿Ð>Ø’Q`þ“>Û¦ þG™¸>Ü9"ž+O¶>Ðp¤Ëc>؇÷W½|>ß¡±;®>Úì+k´‰:>ÝpÞ9è@>ßÚ/HC}ñ>ãØ<êÒ˜>ÞË(L"ì>Ý/;'±$køøøøøøøøøøøø>ÝÕéœm­>ÜZòÄ:EŒ>܆ͭ_˜N>ÛŸYçlO>Ù'fg8à>Úe](–Ý>Û§Ùn›ß:>Ûx»ïÞXÖ>×ÿ½éã\>ÛK2À»0>ÝC¤5‰Þö>Út䋪ì>Ö»èդƢ>Õ³ü¨ó¨}>Ó4{' |Ð>×>ˆÔ>ت:794¶>ØM‚ôÑhH>ÙóŒÝŒÂ>ÙŸŸ¹2Ù>ØX%Œ|>Ù~øsê>Ù§äd.<>ܼ2o7 È>à&röi¼>ÚÕfGýMÜ>Ýoè>ãs520ËJ>âǵ;.J>ß7Ô`PX|>ÜO·¡ >ÝÖti;Õ>ÚuV“Ñøøøøøøøøø>Ú=©ñ‰;‹>Þ×[–ÛÁ®>Þ-Dðö¸>ÙR+Ô…>ܪ¸„Ÿ|>ÛJ«½>ÞÌ7\Ñü}>Ý’tO®ð>Û´’Úh¯L>Ø–ð%-^¦>ßh¼Ÿn>Û¢‡“¹Yã>Üð&É>Úu¥"àÄ>×,L9‚q>Ó¿gú•«Ç>Õ;š) >Ø\Y׿Gè>Ö;µÕ½Ç>Û¶$GË Š>Ùõ ¸.Â6>Ôi ‚ND>ØÅsË÷X>à2×? c>à;̘£Ö>߯ÅKÚˆ>߆Ä0ÛK>â‚Êõ@üÔ>âð™>DØš>á±l߆B¬>ÛÅŸñƯ¨>ÜÜ!;Ù >Û]¸\'Û>ÙÜÌ¿ùêW>ÝšµëœÄ¼øøøøøøø>×™Ów`nÎ>×qWîX—>ßr½ZhL>ßf½–‘ü>Ý‚¨ûM´>ßiQn$.>à ·>úÍ>ã–ëgÎ+>ßžÄ÷Ú>Ü,É ÖŸ->Þ¹”h;Žü>ß;8óñô>ÜBtìïø>ßF7hXï>ÙHÔ;³ó>Ùáà—p V>ÛbÕ(+ýˆ>ØP ñKz>Øúµð”Â>ÝÜȰð>ẹÐþ~>à÷§h>ÖÈõ‚Fb>ÝÇq+T!D>á%Åó€A½>â}Oò÷K4>ã|þnÈ>ä}J¯Ž>è×CµU‹Þ>å$8‡tî†>ᘚAs&>áó5K}>àYN³rÈù>Ü8—ÃÈv>Ø£ÈXÁ>ÝÙ¢îÚ>á|rYÕœ>âÖÜöœêtøøøøø>Ý¥„ý Š>܉oà•~>Þšz;¸:>ÝqQ¥„c >ÜÛ.‡F">ÝsÖÖŽZù>âHrŠØIÍ>âôþ"­¶ï>Þ¡-˜|$$>Ýì°ïe>á2'÷¢9ú>ât¿0sµ>àËßýäH>Ü“Ÿ¥>Ú#ãf>ÛŽ_ñwR3>ßÐÕrž,>ߺ ¾C¥ó>ßQQ„þ± >á|2úe¬Ð>ßÂÎÒøJ>ÙkRPúÅ>ÚVšñÏV>á%¿4>á)ŽEïÇO>áyé\9ØÎ>ä‡Á’Pl>åËm5xU>èS&ƒ2t>å°'ÏÝ3r>àÁôc?6>å_OóÒ‰@>ãÊf¤H>Ý Î†¾£>ÜVûóÛO>ÝÚ†òD?Š>ߦa¶>â1cÏÞœøøøø>ã¾Ó­$¸>ãc‚n¨FJ>áè:­¢˜L>ÝsÞA|Ý_‹>àÒ²±|1ï>à= yP¼Æ>àå É“^>àâÞÚ?Ø>ÞÌëÍaÀ>ß y‹.‘_>ä!Á%XÆ—>äƒôkFRÉ>âæs^‰’>ã&EÜK´Ç>à=z€rHj>Þ’eE}¡>â^Ô‚­>ä¥ Ù#¤>ãÍñ>áîS«çlû>Ý×âþñëÈ>ÛoÞî<ð>â2XÅaK¶>á!ÑDïD>ß©I Dòè>à£S)Gl>â°Ô¿­lL>ãaáCÓRì>åW»TuÉ/>ä±2çí>æMÍR¬í>äÏ•g(Q'>á¼Uó±.>ÝÖì¥s¦>á)ŒD³ >ÞOµÏwo>áá7À†«>á;Ìîëjžøøøø>à]²ÑÍ>ãé}E >ãK5Q%æ>ßG-ª…ÿº>Þ{Y.>â£3I—>âxÃ7‚p¼>áúN|å%i>àÉgë>ã—‘Ð,>ä³;Xá^×>æ9¾lF>ã1™¬ßuý>åe¸- ý>ãIS¢?>áDüÛ½>á2À%Fio>ã_e2ùÇ“>ådcöª >älÖ…òýí>ãÝ%D¡áÐ>âŸ(û->ã\–+>ã´Ò/,CZ>àõ{ßO¥.>ØaBY†>ॽ˜I=^>áö“}tQ³>â¹¢|Þç>å{º>äîž‘¶ãÆ>åˆ:è%#S>â‡ùQ:>Ú.Q€”ýÌ>ÜwCI±>Ýù_„§™>à$õ¿b>Ủm\š>àJ@¤=Œøøø>ã?(ï½tT>ãN™œ•>ææmÙ Žì>䟫|©>âJk6O<>âVÖ~l¡>ãËmª„Wà>ää`ÚçÝÃ>æø?ùC~>ã…%H|'Î>ç+Y›ç–>åʦú„’©>ãà€2Ý\j>âËpR¯‡k>äE^¨öP<>âsÅ2±ƒ>à߀ªú¯ã>㉋¸ã¸>å ØP7ÝÜ>給’0]>èßÕ®§íù>êFÊy([h>çÁú½„®>毻 ]>ãV£§% æ>à9PŸ;>>Ý—9†2>áC‹««µF>â 7ãN’3>âf©ð‘‡>âá½”ª>âWqUáJ+[œ©ó>á@"0Ž>ÝeHÈ„ÑÍ>Ú¥°Ü¡p·Zè>ßU—ÍÙÖ>àaìw¦S^>ÞQ¯?7šøø>æå±jfŒ>åég&ãò7>çÈC3-f0>èZªŠ÷!g>å“ùX4†>åq, $N;>æt¶ L4ƒ>çªPzû>çÀ¸olä >é¼,L¼{>èDŽ}†ª>å˜MˆAâ>æ Á¿F7h>åÃôׂ>å£ !aÝ>æzÉÇ#"Q>ä ]„]†>æ§ÞÖºà>èµ–P,°>ë ê=¤§>ï·eô:§T>ðbÁnËý>ñl}I:>íÂäLF>éXw·ÿ4>åä( Ž!í>âb›Z„í>ày?RÉWh>ä%äÔ$Þ>àýY!˜!‚>ã6†öˆÙ™>ä”ùù:v>ãtÕBâ@p>⦠„>àåù…ý‹>ß _u•>Ú ¡ì©Ôø>áQL&ñT>áFþU /È>á}Ъ>á½»†ñí¹øø>æ t÷^>çˬS{ƒ>èiÔ¦–ú.>çt FÎ>ã p2塼>ä}‘–¢>æ4þ¬6>çU×Äïò>ê4/2Ê©>ê¥3L¬F>ë|ÃXOh>ëŠxäâÇ>ìÆà5”>èq²Qëã>ë¹úìÓ>ëÿõ-¦ùŽ>èƒÞøõ4>ë\ ¤0>ïAOWÑCÎ>ñæxÓÿ>ò¤å£œ«>òݺÂfÁÔ>óô;L *D>ò¡}Câz>îÞC FÅ%>êÕ°5Œ¼>âÞizrüÙ>äâŒÚm >ç=4æUm>ãÎA¯•ib>æ·7!;³>è¡= ›ðž>èÉ öì>æ!%Àƒ>ãï:­ÂÉ>à2z¯µZÜ>áÅ&¹e>åïõœW>âQœçïí>àÄÙ–`Ë'>áBì ˜õ<ø>å>Oè.>åÃö‘ó'b>çf ¢)>è ygØËp>èŒ*­ë‰5>ç™ÝuQ>èóÏ[ÂY¾>é~»‚*B\>ìrLȇÀž>𧾟J–>ís¸ùšÚ>ïðøgPÜ2>ò‘Bö`¹ù>ó u>>ñ¶Ì°ùŒ8>ò‰…‹¼H@>ó@3òÈ‘<>ï8ªA»p>ð±ºì/"V>óS#,°Õ>ô ®À¡Ü>ôWmš?Þ>õå\ÍËz>÷´”3ü’>õ%yLØŒ>òYx¨ù :>îÇòÆ^Â>çd?šP–>èm‰Óå´ >ç§_èµµ>ãµ~3ûj´>ä-h bZÌ>èdºçK>æí««,c>äm¨?ù.¦>â)ͪ‹jÌ>âÚ™ïÂ>ã ,Bnf×>ãûç>á^œžÊL²>á¨Ç¸É >áÓ€òø>äüýbsC>ç@å*²r>èsÄ•Gi}>èÚ¸è¹æ>ékØ5£yx>ì}›Ø—Ê’>ìËGšó¿Y>í«}*éŽÉ>ð6Å«OÖ>ò(ö7$÷>ò<¬ñ}½>ón®…h>øŒ¹HåÄ>ûÆ(dº§š>ý`dèâè>ý£èV-a>ûÒé©e·$>ö­É &—>õ÷ r±F>÷D ¼fˆ>ôÉw"Í«>õä2Tf›Ø>ú‰ŸÇEÐj>ûŸO¨r5;>øÄ­å‘u²>õK`¡,€ª>ñœ—$Ú>ìTGNd>é`à V¥>æŠÑb¶ƒ>çaIKèô>çìªvp7/>æ Ø×íÒs>åÒØˆ¡B>âH¥YÒÎÚ>â}4ŸU†>â$ˆéá‹Æ^‹>ß%T_Ç(+>ßr•ãëBq>ãwîuºê>âÊûÓ {%>äWò LL>匭\ÔxH>ê¾oµDèP>ì­ë¨³âÒ³È>î(=Bà³>îÁbé¼ù$>î(µµOï>ïXÉíbký>ñOWˆ”è>õ ðÈžÆq>ù Msª—k>ÿ|Ä-xgW?ª¡âê ?!ëc¢w? %¶xÛð?¶¼ 5p^?\/w[§n?ZwÇç>üýÉŠ©¶¾>ù4Cñ±Ôv>÷M&ª_(Æ>ù}åTÉ}x?‘"[~°Y?³ß~ q?¥Ú5•ú4>ÿ¹iΪl>ù^»®Â>ó_ð­â„>ì·aÒx$õ>è+•æ>ì`¥È`>èbÙÀ >ä[‚‚·/V>äFÜXßxŸ>ä>‘¥Øò€>å!eÓí’>è ö–Aê>æ «³¦>ã¶ Õä€>áùdIÉÎk>â–ð,‡->áˆ7Ä>æM=$WtÂ>癑§j>ê C\V+’>ëÉ/›âÆ >íuL  z)>ï ‘ï•>ïƒ`úR¶Á>ð†V¡´ì>ñxÙÝD>óÆøÒŠhV>úYââ/†?ý×¼4~™? YL­€?¯›êÊÐô?ˆuÙx?øŸÉz´Þ?±©ñŒ?äñt“/? ˜Ž#ÇR?!ÉÈXsŸ>þŠÎFx1>ûßt^Â}D?•‡#öM?(  þŸ? ²»•b?t`¼çB? „K •k&?ea›§›­>üR…F^{Ö>ó-Òô¯ ÷>ð#ÛÅ©>>.>è²ï[r¡¸>æ*ZFv²>å/ì?ÁU>æh=iGÊV>ëJ¬ú%³Ý>éÞäÔ½ B>æ©3!›ä>äÑ|Í¡¹D>âú´ÃS">àšQÀ…öŽ>Þœqã­Ì¢>êÑš³Íy>éÃÏn>èÞâGâé¾>ëÁr7€õ´>íU˜S|Ê>ïøÐÄî¤À>ñ‘’¥N|>óû‘KÛª>ö…d@>øgÊ»-RÁ? ßÁY? %énK+?«¨‹õ?ÓÀÍ…?"Clß¹?$íDZ’z?"[.MY\?ÕÁÚŽ}?cdfQ`?—FdÔ¤?üiý\²i?Çêü¶¹?bÍa­çn? …ÒA?‹‚ áC?XÈIáÆ~?B`âFb×?6Öˆ„;é?¤QöÁI´>öЖjNÌó>ò/ˆÓ")>ížðÙÿíÍ>è<ÿ›õ%>çàÆä¥ò;>æIÀù‰½¿>èö†“>ëƒþ¢&+>èÌFê­‚>äl®ñÀÙ„>侪PM>äŒôŠlª>ã,eT÷{>ã3/ óÎØ>êðH®¾>é@BB¡»>ê¥bd¾¸>íÄ Ó:c€>ïËñ)4+ñü>ñªÆ’#8>ôúõøת>öÅ<ÍvŠ>ü”'I ?/†tKG?B£7†çE?_CQ\=?#0ŠJ"â?+¹˜áÉ{?.«“cæ?*ç™PUB?"¹òÒXD?)ÓOÅod? ßÅSQ?¿Ë¬AÄ’?ÌॵÀT?€O©ò¸å?J.CÚŒ?ãÕÉ(ÕÔ?"KyQá? $‡61C?èÃúl’~?üЍÐà³>ùuWÚŒ>ò¡X"oÏ>ìv—»ä>é1ø½s2>ëjòÁHAù>è&H'¤>ëFUd;±Á>ç0¿!uxk>äöBÉÕ]¼>æà§,²æ>çÒÜzö>åØ"X.]>ãùÆù Bä>èP´9ä _>ë\dkóMÿ>é’TFH>êÃûB(>ðP–3¼¬>ñ&)‘,>ñ‹a“aÂú>ñ€­LOÌ>òuîŸÌ7>ö™‹÷cI>ýEsR÷öÕ?¿}¾½®?Ad@ðÒÚ?쬂?%á©´?-ÒƸ^?1?Ø*Ýð?/&!½ËÊ?%ì®èÁ? .ÍÒO?Á›5_^8?|±¾róõ?èÆ`¥Î?ø=2רç?yÍI°wØ?C ƒx h? ÅǸ&’]?ÕÞ¢-Vï?;ò%?+‰¬1>ûÂõx³ä>ð‡,ÙS”>è\P®pŒ>êDÄöÒ®>ëü ×ÚÊ>ì^C=¹¹‘>ë'Y´NÔ>ç0Îfx>ã­ëµ£ž>â‹âw*ž>è³6òV>åßozó®>äÞ{äxv>çCŽnQ>ê¸^Ô€n€>é $±à'>êµÙÐà>ð ÃF$ô¤>ð·Å#Ôƒ>ðÝŸãž<>ñ)¸®þ¥F>ï!-€¢>>÷;|Ï©­>ÿŠzÀ°-?'Ûs,Ô?XH_†u?MÂ^ ei?#¬T·ÔV)?*—»ý´—@?.GðsGÈ|?+±½™¾¢?$m¶Ÿ+¶r?ºŽÀΚ|?ÓŽE€È?zŠÔ ˜0?CC@Æl†?Hø­¤s? *¡ÂÁ¡d?aH[ü¼?šXó‹ñ?±­]b„A?/Äÿmn$?>½—t1>ûCÞ{Ì>ô]6T¾È[>íĬº0>ë;Ò‚nã<>ì' Ãbúê>ìÑÆ\¡ûh>ì‹,ªåÀ¨>ézæiòu²>åË8!I#¾>æõð‡„>éoµj˜f>èx“Ó!{¤>ãg…ŽÇl>çsp=-Ô>ë)g›H>èéÀÎàH–>ê']–Ìò>íeH£þ>ïJ3k"Z>ðÍŠZÅ)þ>ñ|lëD—`>òˆY|Ý»>÷4¿vøð>þÒ7B% 8?[[±Ñ? zÄ8ná?Y„Îáõ?\‘,¬,G?#cçÑ &]?&v–)?$ÓhÞP’?òX¯4z?"ûȸë“? Þ68:?£‹°`¾?ïTzÔ ?7Öu /?¿âÈX?…µ…Ð ? ²7㈹? Hw¶?Ö?ý8­á;û?yy K¢b>ù1î:]¹ž>óÔ³j%î¿>ñiëýéç‹>ï“0ßso>ðÍä§äð>ïËúÜgX>í82ÿêƒ>êÇc!ØŒ>å)¦×‹ú”>çàßö'²È>èvõ åÆß>çÁ½ØMϲ>æ˜FÛü¨²>ç^ h]ðŒ>ì&Bïâw>èyÿÇ>ëï´{ÜzÑ>í;8 |>í£DRü—>﹡ܮ>ñAÓzzáZ>òäAwÖ 0>öÀù%¢§>üÀR!Ì?ô EŒÖh?è'\Õù‰?Ħ¹rœ?z&¢nu?<¢Ð@Ý?m;¢‡s?ü!®>L?/U?DåŽ?@nýD£j? …WÓ¶5?Xä­?½æ«Zÿ­‹ò~ö>ÿ‘ö'Œ®?Uf™ˆ´r?NÉmÀà<>ý1èˆÖ>úáO“*Ô{>ø)qõކ>ôýó8±¸>ó%!…¡’3>ò_wÚ›>ów)Í/ˆ>ðc©¼Ü>>ì£Pê¡<˜>ëäÿ ­wÒ>éÍåN*>ç×/ã9½>än€/‹>å©íÚ‚†>å"¥Ó‰î>å÷¾ ¯™>똷‰õÔ>êê?ß’ÏŽ>íK”í,Ÿð>î›ðÕ26>îÍÒªN¨o>ðKàìZO>ñD¸Ûì©>óÄ¢½½u<>öPlÝ}L>úKYÔë© >þ¡ü›y½D?äS6Êãñ? å\jWL?ecš3?÷ÃáóUÖ?S¬„ÆU?i†)f?•?ºþOܬ? ×»ŠÁhâ?¤ ý €?ˆ!Ûæî?Aãp@Ó?Û³9÷>ü„®r¦”>û£”ÓÉ»>úó'­“Bƒ>ù®w¿Sëp>ø2û7þê8>øGôŽ&>ø@.Wíëº>õ†QͳŠ>òóê; Þ¼>òÀÞL ¿z>ñ7æç¶eÚ>îB)RcÀ>ï¤w1af>îÐíWõ%´>ê³ MÐEÈ>êb/æ“r>ç¯ËÃ>é#In)>é×¹öŸH>ç™A4»73>ëlATûû>ìäAXL>ˆm>ñ*³çv¬e>ñ¡û¬š¹î>ñS«Ld>ñ5lûXˆ>ô øÜzL>õ¦åàÙ÷‡>öÏœ Cý>ùûYà¦??äºS´^?ª¬5À?¢úU]ó¸? ¡3€ûÚ? ZÝ#ÿá? ¯uúÈé? «I‘ª?`¦V[?©‘—Iy?$Tòdê?ŠïQ&v>ý£¯‘‚>ûp !ò{>ùŸLßäp¯>øƒM@ñ>÷€Òt5cX>öI6– ™>õÊð!ˆðå>øE‡i³e¼>÷%@ò…¶>ö?ívR,¸>òÛ¹]— >ðé t¨>í°Å;ÝÚ>ò´µ¿ò>ñÏeða>í6 z6@>í­‹n2±F>îþRe©>í~S~ç>í!†°ÊRÒ>ìˆ r³Ç>íÂ`}¼,ø>î”ýÌ›×ä>ïà`šx«º>òð˜Òw>ñ²|yè>ñ‡\ ‡ å>ó@›ÖãÞ>óajÌòƒ¯>ôC·¡ † >ô1³¿8ðµ>õânßÑüt>üs©~i ì?V¥À·?xLÊHp?Q…-i¦?¯±¾øãî?S£ø?Ê®ûï ?ëZ(áJ«?¨ gg€>ÿõ.x'Ùû>þBZZ8n>ûþЄ>úu²î¥=>ø”Ê<¾;w>÷®q,Ìþñ>ö·ERÍq>õ§ *)_>ôåÒIR'>öì„ø§[v¨cn>ødƒ–V>ò‚Èyþ>ídx·h¤>íNŒ™Ð>ðF¼¨Ix >ïñèw®">îBŠ(Ñó>íú|äÖ„Î>îé^¥PªT>ïGÉ´(&>ïµ»~?V>íy{}Æ4¢>ð´Õ:Ú.L>ïÔ‹¿-É>ðÞ/s>ò›z0m¸ >ó‰÷ã5P>õ¿6$Æ >öç'HyV>ôLèIo9½>óvÚWWÅ>ô{&Ü3>ö–/û^J>øö¼µf©~>ýø0eet?9ÁIÇL\>ÿÛßRBž?ŽMÌ<¨?ºƒWóŒs>ÿ×Ü!$È&>þ&5Ä)Ð2>üÐ×­ Ñ>ü—22ý2>ü-¥Jsœp>úVƒ›DèŽ>ù] ëb2>øÆKÄ´©>öž±”ÿ Ç>ô&¶á=Ó>óÑ6G)">òç¤nÕÑ>ôíÔ¨úß_>÷:{Ÿ”>ôçÝÁxL>ï¨ÚeïÏ>ìILâ>ïg°é-¼>ïïû‚˜h>îüc±‚Ë>ðZ¢rˆ>ñj£tlíß>ðJÖ1Ê>ð·ª Å>ñ~Ñ`]>ðÁ4ÉLl>ðvœ§ˆD´>îÇ6ÕE¢>îâY ü>ñ £™@X>óÿN ©1>÷òHúuø>÷À×›6>õ*fž >óš¿éeÚ„>ôÂÑ[ß(>öfcRõ–>øÇvìþŒ®>ûÂD`ÁIÈ>ü(ý_:0>ûm­€F0>ûQÆ‘mÌG>ûÂ*j±>ûj½Q4+>ú €l>ù<¡ÊPÂ>ú›Bz©Âî>ùÌãÓ­;ç>ùYBoÊ+æ>ø‹«¶>ø+Ävðmy>öøøÚ5Ìœ>öÁoÑø>óÏ6¼%íO>ó+X£¸Ž>ôSn vû>õìŽø²·ô>ótÕ'ü9Ó>﹋6>ïY6Óaòþ>ïo&[µ{¸>ðI'€°§>ð>»VkEÁ>ð¾½²õ§C>ð×hßᕈ>ñÀY©>ðŸí H>ðÄ“µ²“*>ò‚ßÚ›>ð›åÞïß>ð),$ŸÁc>íŠàAçèš>ï´¹ŽZ!{>òÞD¤‡¦>ôÜ .0Åh>öRûÌÎa>ôÆx%¥Sä>ôÂïˆX>õÙ}\ðV>÷Æ}›d·>÷Í©¿w¶->ö 6ðâ-Ê>÷ò(Ÿó¤>ù=‹Â©>ø›S9ðo>ù^Âzzš>ø˜ñ -Û>øùŸ“R”>øÁm D>÷è·®ìã>öÓs™XD>÷¶Úµa™„>÷’[ÿ">÷š Ÿ.>ö·Ì6}=>õ„¾…»±:>ô@ùwM?6>ô€øË/àš>ôɗŘV>ôã!{Ô!>ò;9ª4Á>ð¯5yz&>ðÎD=ê-\>ð¯Y(ÆÑî>ñwÛV׳>ðב-EÖ>òV*÷ª{ü>ñûºW?•l>ñ²½L” 1>ñ’#D ¯>òM¥äsù§>ó8‘ŒÄˆ+>ðûâ £¢¤>ñ`È«r\>ð!±ûH¤²>ñÖÂ6>ó.ÊóLó+>óõbßÎ>ô #iµòI>òÖ¾êY(¼>ô+Éà”‘b>öRæéF>ù -(G>÷˜:Ôèj˜>õ –8îÈ6>õÍ›iRg>öR㱺Ñ>ö*ê«íë>õ ÕC^\>ö{ÙZ As>÷# ú§>÷ÕgÇùEì>õæ˜9O…Û>öUW«KQ>ö—¿Ï¢0>õÄîÕ¿`>õº¦Ûœ>õBlËG¤>óèüÙ >ó¸W~°#>õjý†Y#>ôOQ\Ý>ò–yB¯Â¶>ñ¸ö4£©H>ñ­Sþ(V>ðgäûÓV>ñZræpç´>òÐC(À>ò®´.»Ôd>ó$™­CÈ>ófŽ‚>òÁs&Ľ¬>ò j ³X€>ñïývÃrø>òÐ_ŽPz>ó˜ÇªÍrh>ñP^4QT>óXè&>ò•¼îÛþv>ò©hîXÉx>ó wEå>*>ñ©JÝá>òz^SÓ4>ôRpSîŽö>÷ð袄>øiÐ|È>÷ù·rÅâ>ö ŒK’‘@>öùl«3>ö¡dYl>ô¯TÌ$á>ö@+qJcò>÷™Ó£‰>õï$н‹>öîÚª\>øq Í(^>øK@P¤Þ>ôœzÊ×>ô„I~Ͳ>ô& };yÚ>ó.qR~O>ô‹:˨ºÇ>öÀ̲~jÚ>ô¾…ÉÛ!>ñ³êêã[>ò…GðA>ò¢ÓVÁE<>ò-95@Iò>ò« +‚!ž>ô)CVã.>>ô—\é£ä>ô·šiÀ~>õ=úó >ôÛ[s®Æ>ó‚äºxŠ>óyò#g¢4ø>óÞq9éÃ>óKFì)ª>ófØ Ç±8>óˆÂ.€>òϺ[+M.>òñ÷^‡?¸>ó6‡[< ÿ>ñ©ï>º>ñMð­üZ>ò<–%»”>ô-Âl5`>÷"}+ê>ø#4ÚBœz>ø¿‹¨ÒC/>÷geL¥øR>öTËPªô>õ7°Âà¦>ö8à4÷‰>öñæÖÞš>õ6+^&¨>øN¥T”B>ùƒ—^ *ý>÷†£¶¥>õ $o«“>ót„ kÎ>ó#çbÓC>ôfÜÒˆ‰6>ø»Dz†¢>ö•]™o>óâpTðI>ógÈZWM†>óïÏ€™8>òç«5>òDMQ\òj>ößäá,C >õĨ’å>õcÑ~/*>õú?ºþƒœ>öPrtqEš>ô¸iþ¸É>óÍ5Ù–U˜øøøø>ô£ôþ'óD>óU"•¶>òþJ´µé>òÃkóh^(>òÍ#£0>󺻩C‰E>òÙ”Þ…³ý>ñÇùòIýk>òL yÈè>ô5$iÚ]>ö}©A#8Î>÷½tæÿ˜>÷9¥’>÷”åáñ>öÈ.ˆ;7 >ö³söK>õ–oFy/E>õ˜3­?I>÷ÄÚûÈô>ø;ÌO²ˆ>ö”»MhSý>ôn¯”ÊÒ>ó}œ8o5>óž¯,ñâÌ>ö[Õ¨}r>÷ýÓ^ñ# >õÚA|hu¨>ô–ר>ôë9ªÍ¤¼>ô¸öRxg>ó×0z¶É>õšÉHTV|>÷˜ìÛ#±>õ?÷Ë:Ú>õš> $>ø[ù&Dˆ>ùvPíw)>ø§oøÀ£>ö—Yï!Úøøøøøø>òíÿÉ”Á>òŽ›©H>ñòÝècr¢>ó·}zT§>óþyÌ5 >óPñ":\>ò:÷ç2ØŸ>ó‚íQ2>õpÁ/ñÀ>õ¥%çp>öTÆ3m:¤>ö"܆ÇÓ>÷ž},.>÷Pr1CÓ$>ök€1ôcÅ>÷\e3wnG>÷ËØÑ4«>÷—Œþ¨«p>öö$a`>õžp’¾·>ôv{Îl§>ôX7Q|Æ>öÑߜ׮„>ö0Y¼¶…>õ8áœÞ>ôÆTÿƒM>ôGʉ0,V>ôv  #Ô>ô<¿Z"S>÷2©ÉÑOŠ>öpòŠ„r|>õþÖÁÑK>ùA¨W+¯Ÿ>þAž¹^2?Ë„)Õu¨? cD=bøøøøøøøø>ñä^Š<8†>ò.÷¯êÅ>ô&ÆŒ øÌ>õ\Aô®Dk>õÃ,àˆº>ô2cš ^>ô­½¼>ô”Yº*…>ô³±ßS+˜>õ›Å‹sS>öUù~P„>ø[ íW>÷OD£}.¨>÷ji­ˆ»>÷ªá¥ààž>÷ \W„å¨>÷ lsL >ö PøØvû>÷ü yšb>øƒ´˜€>öÜa“ù˜>õöZŠŒ´k>õÅIΧ=ƒ>õâWޱ¤">õ˜*ŒzGU>ó>L*Ø–>ôyBm‰–>öÚ#½ûØË>÷»Gõu^ü>øk1:|μ>ù~LŽÁø‚>þõ+ù :? š¢b·­?¹}”H…øøøøøøøøøøø>õÔt±0>ô-h=óñ÷>ô*‡Šb®µ>õD¶ãu >ô©“yøAT>óa±¦ƒ-Œ>ó„ëïŠ>õŸÂ?”>÷p9œ>öê¡•¢`>÷Šô>öÏôøX¸>÷­’€ÌH >÷Òè¶Ó°,>ø–˜4Íš>úAD·P;2>û--+Ç>ús/œ æV>ù(¦ÜÐ4>öýQÝp*>ôŒ©#Qvö>õUä7fœ>õºé._ÿ>ôí+ÙúV>ö•0g÷s>ù˜Ö=,þ>ù’sØÛ>ú/È <>þáõüÌÐ?¾,ŒÉó?¶´lðH÷? í‹&tøøøøøøøøøøøøø>ôè¨>ø£A·ˆUê>ôsŒ¿±ÜH>ôÒó‘o@>ôðƒ@6D>õùËë‘yî>÷öW>sVt>öõ`‹fÆ>ø´ˆP£uú>÷j.úõÊà>÷Hã7*A„>øÕŽTB‰ >úMB®À &>û€¦„‰‚>þM+¹pr>ý¬ Ükâ >ú5¹—ŽD>ö­ã5If>õfÿ/Ý>õè+K…Íü>õ22É >õ”®Ðy¯©>ø¼—QV¢>øŽ©Àæø>ùQ>1˜*>ûùxÁ'Ü?Ï!Üâ?ÖÒó .? K!•l—£øøøøøøøøøøøøøøø>öÛzÿÌ«>ô á±b©F>ôý›pá¿>÷ö¯Ú´>÷óÃ:{Ú>÷Á½‡ZI >ùScÖŠ>ù¤Šùåºe>ønɼa¤Ž>÷!îÏ5óæ>øÕ$¢ƒ>ú°>LB˜>ýWZ¨)>ÿЙ7ú‰©>ÿ>NXÚDp>û'šÅhe>÷NÐðe¯8>öå}*LÁ>öÿ÷ÐÅ >ø—¡>÷k!ºä‰v>÷Òüz–>ø¿c’à:b>ùž ™­(>üz'¹I²Å?Ü+fô²š?äQñØ%©? Hp¸fý_øøøøøøøøøøøøøøøøø>÷PK·°›Ò>øâq’ò¸¾>ùDçŠÄS>ù·ü«ðw>úŠ”ƒ,à >úª˜á«<>ù@Å‚gÉ>ùeÄÕ3k>ød¶Ó¬R~>÷³Ë$Ëë>ýé`ð»"?äê‚âÍf>þŸv˜ä˜R>ûÙŒ`Úê<>ú6¡­Œè>ù®ò Y®->ø3ÙGÓ8>ùðm³ÄŒô>ù`О|>øô?'üÓV>øêºð¥ŸŒ>ù©yÀBýù>ü—­#ßæ›?R×ãQé¢?Ç·G9@øøøøøøøøøøøøøøøøøøøøø>ùÃhÏ_½®>ûr·¡I¿>úê6¥¶Ê->úµAoÔ.P>ú>_»UE>úQ¸öºÆ>ùŒíÖ=ÆQ>ù•zkt1>þ ·¬m$o>þ›†Dþ6>ý ’æ-|T>ü‹ØºËœ¨>ûéI@åd>ú^¿â ³Ô>úåŸF«Þ“>ýŽÄz>ß©>üªT”V›>úç¨ÌÆ>>ù˸…>ù¿eÅ iš>þᦺa>}?,®ïìÕøøøøøøøøøøøøøøøøøøøøøø>û¯«k·ò›>ú¿7˜‹>ú¢Æÿ‘ÜK>ýñi¤‚>ücÃLÇŒ8>üu§Òw>þ^u>7ªƒ?sM\ëÆ„>þÇæR¿&^>ýSi­‡->ÿåf,flT>þ½™¾]2ô>ýò­-Jã?>ÿ ‘®ÂõŸ?ÞþµRüÆ>ÿ#‰„›nì>ývWÚ:‘>ûxlEÚÉ>üe–Ÿ3Ü>ÿ +»Øœ”?mµè$šøøøøøøøøøøøøøøøøøøøøøøøø>þ ÈÞï?ÃÒÖ ¹'>ÿêqô%•þ>þŽc«?¯öËK §?C¼¬r?~û¥[»?W#?% ?øã’å,?Úð·V‰ ?3Ôs!%ë?ªéÇÓ0È?Ø ¾aÑÊ?B?V Q`?ˆ0ª.Æ?8ɬÁ¾>ÿ+é¥á2?%t(`øøøøøøøøXTENSION= 'IMAGE ' / Image extension BITPIX = -64 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 43 NAXIS2 = 43 PCOUNT = 0 / number of parameters GCOUNT = 1 / number of groups COMMENT FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H CRPIX1 = 20 CRVAL1 = 266.39311 CDELT1 = -0.002 CTYPE1 = 'RA---TAN' CRPIX2 = 21.5 CRVAL2 = -28.939779 CDELT2 = 0.002 CTYPE2 = 'DEC--TAN' CROTA2 = 0.000000000 LONPOLE = 0.000000000 EXTNAME = 'FOOTPRINT' / extension name END ?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ðreproject-0.3.2/reproject/interpolation/tests/baseline/test_reproject_celestial_3d_equ2gal.fits0000644000077000000240000002640013173065713033225 0ustar tomstaff00000000000000SIMPLE = T / conforms to FITS standard BITPIX = -64 / array data type NAXIS = 3 / number of array dimensions NAXIS1 = 10 NAXIS2 = 9 NAXIS3 = 4 EXTEND = T WCSAXES = 3 / Number of coordinate axes CRPIX1 = 6 / Pixel coordinate of reference point CRPIX2 = 5 / Pixel coordinate of reference point CRPIX3 = 2 / Pixel coordinate of reference point CDELT1 = -0.006 / [deg] Coordinate increment at reference point CDELT2 = 0.006 / [deg] Coordinate increment at reference point CDELT3 = 75 / [m s-1] Coordinate increment at reference pointCUNIT1 = 'deg' / Units of coordinate increment and value CUNIT2 = 'deg' / Units of coordinate increment and value CUNIT3 = 'm s-1' / Units of coordinate increment and value CTYPE1 = 'GLON-SIN' / Right ascension, Sanson-Flamsteed projection CTYPE2 = 'GLAT-SIN' / Declination, Sanson-Flamsteed projection CTYPE3 = 'VOPT' / Optical velocity (linear) CRVAL1 = 163.16724 / [deg] Coordinate value at reference point CRVAL2 = -15.777405 / [deg] Coordinate value at reference point CRVAL3 = 44 / [m s-1] Coordinate value at reference point LONPOLE = 0.0 / [deg] Native longitude of celestial pole LATPOLE = 90.0 / [deg] Native latitude of celestial pole EQUINOX = 2000.0 / [yr] Equinox of equatorial coordinates SPECSYS = 'LSRK' / Reference frame of spectral coordinates HISTORY File modified by user 'tom' with fv on 2016-07-06T09:29:37 END øøøøøø?×®ŸMg†øøøøøøø?Þ&â}ÍdP?Ü<Æ~S¢é?Ú%Þ¨ü;0?ÛJ͸‡øøøøø?⃠&è ý?à¹á-)Ë?Ýy¦?ç?Ü)¯xªLv?Þ™ž±Ãq×?às@òYýøøø?âQGH.þ?ãð=sWË?áá6Åüa¤?ß³ž$Ķ?ݲ¡)Ìx ?ß?aʺ?à»iáC-?á,-z™½¤ø?ÛÚç¢ñ?à0ŽE@ÇÜ?á3Žç‘?áðÞ¨Y‚?à®h¤?߇…0tb?߉9w†ê?à›ŸyÚøø?ÛÚç¢ñ?ÚsH(ZÝ?Ü“Øw`¿?ßW"ÀÛ§?á4¦=W~?àD?ÞóªóÖÀÈøøøø?Ù‰œç€c~?Ùe>$KYÔ?Ý Sm$?à­×'Dü?àç°¼Vqøøøøøø?Ú9†Õ=Hí?Ü…Àwá›r?àP>^—¤øøøøøøøø?ÞÅB²Îøøøøøøøøøøø?ÙXWH]äùøøøøøøø?à¾fŸœÈ ?Þ6E"Ž ?Ü yåAp]?ÝFwoö÷øøøøø?äêÆ™Ý¦?â¿ìû~?à8«rˆŽ?Þx»Q$®›?àU×ã0î?à9þ-ñù|øøø?äaÂHÇ‹ê?æÇVà³—?ãa©rÛ¡=?àµFH=˜Ê?ßIÅá~½?ßH{q¼;?Þíí²x£)?Ý~G¿+áø?ÜZí.,»?áY°i[YH?â‘õnIÈË?âc©k‘ç ?ࡨæúq?à ÙÎTE@?ß<0É[öÄ?Ý’wÒ©½Ýøø?ÜZí.,¼?Ü£ÿª/Á?ÞCý¿Rdj?ßxv’¢¬!?áSšÛ±Í•?àòQr¦ N?àC °Ÿ2éøøøø?Ûμƒ'¾?Ûçȃ`HT?ßë]}Jl?á…*üô«?âJÖ.K`øøøøøø?Ý„{#$ÜÞ?àU·VßhJ?âD÷ÆPÕ&øøøøøøøø?áʉ †ÓBøøøøøøøøøøø?Ü}©È°Zªøøøøøøø?ä5sºŠÅ,?áD×Ìð7?Þ„ »A¸6?ÝÀ6€ÇÂøøøøø?ðõ U³y.?ê›Æ<Å?âæBf%!¼?à#M–÷h?Þ–€N@?Ünj\"øøø?ðÛ yúl?ô*/2Gd.?ìR=œÂß1?ãœôçÑÉ?ßqÀÙk‘O?ÜÆ›÷km™?Ú#”¢U?×ø¾¢™6Pø?âpŸ‘À?êO^¾§?ëäS]G5$?è4„^ŽM?á±¹ª—È€?ßÛŠeÓÚ?Ý%­Ë~$?Ùo¢ZRFøøø?âpŸ‘À?á­Ý Y?âL{®yºã?à‰´+£tL?á,ÛMóÒ?à­ì®b›Š?ßlÐp-6øøøø?ßœ‘Ôœ?Ü«lœòö?Þ³íÐÞÑ?à¤[Çìw¥?á4ð®G³6øøøøøø?ÝÂ`HË?àq„à¸LÄ?á„s‡^øøøøøøøø?âr¦°a.øøøøøøøøøøø?ÜÑé¦YhØøøøøøøø?ç«Yzù€ê?âi«L%X?Þ [s³[ü?Ú »ôë÷Qøøøøø?úˆÝ8d9?ò™°ósø?å;}“"P?Þü°æ“d?Ø’j·$w„?Õ‹o]µÛEøøø?úúÊüÀŽ>@µ†TyˆV?ôÝoð¥?çgš™=§?Þ9ý‡ˆ\û>úÕ4›nÿ>þ<—kÖY?³”ã¯K? ˜ @bFÔ?#cÚ W›˜? Ð\ àL/?¶ys¬Â?© K)d?È},ý2?Õ !òzö?Ù ½øÕ?ñdPý§˜?ï5Aºô ?1W4µkÿ?0 Tºzì?&‡#om¬?G 4ú?`ªQßP?·A;ÝóO?Êf8  ?[³¨m ‰?¾š‡:ƒ?¢Xm³÷?/[÷pü?-¼í†¾?%Á„˜õ4ƒ?: ³ýì?R ë:vã?êÂì!Ї?Eç¹m?1<8ú¬? Hƒõ`?®¾]œöÝ?Pv¢õ.L?ÃÈæ^ë¨?5\ñ?âše÷$?*‚OªÖ]?| ÿµ¹? h>'²¡?3B¹*þ?º‡~'w?„·¹˜&>ü¶¯r?@>üÌF? TÓ@j? ­jùe`? ±mâxl?ßhÓ”².?p×|2×l?¾]H#®? '€>þ"ÝZ>ûà×ñøãÚ>úCg)·øÒXTENSION= 'IMAGE ' / Image extension BITPIX = -64 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 10 NAXIS2 = 9 PCOUNT = 0 / number of parameters GCOUNT = 1 / number of groups COMMENT FITS (Flexible Image Transport System) format is defined in 'AstronomyCOMMENT and Astrophysics', volume 376, page 359; bibcode: 2001A&A...376..359H CRPIX1 = 5.1 CRVAL1 = 266.39311 CDELT1 = -0.002 CTYPE1 = 'RA---TAN' CRPIX2 = 4.7 CRVAL2 = -28.939779 CDELT2 = 0.002 CTYPE2 = 'DEC--TAN' CROTA2 = 0.000000000 LONPOLE = 0.000000000 EXTNAME = 'FOOTPRINT' / extension name END ?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ð?ðreproject-0.3.2/reproject/interpolation/tests/test_core.py0000644000077000000240000003533413173065737024042 0ustar tomstaff00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst from __future__ import (absolute_import, division, print_function, unicode_literals) import os import itertools import numpy as np from distutils.version import LooseVersion from astropy.io import fits from astropy.wcs import WCS from astropy.utils.data import get_pkg_data_filename from astropy.tests.helper import pytest from ...array_utils import map_coordinates from ..core_celestial import _reproject_celestial from ..core_full import _reproject_full from ..high_level import reproject_interp # TODO: add reference comparisons DATA = os.path.join(os.path.dirname(__file__), '..', '..', 'tests', 'data') def array_footprint_to_hdulist(array, footprint, header): hdulist = fits.HDUList() hdulist.append(fits.PrimaryHDU(array, header)) hdulist.append(fits.ImageHDU(footprint, header, name='footprint')) return hdulist @pytest.mark.fits_compare() def test_reproject_celestial_2d_gal2equ(): """ Test reprojection of a 2D celestial image, which includes a coordinate system conversion. """ hdu_in = fits.open(os.path.join(DATA, 'galactic_2d.fits'))[0] header_out = hdu_in.header.copy() header_out['CTYPE1'] = 'RA---TAN' header_out['CTYPE2'] = 'DEC--TAN' header_out['CRVAL1'] = 266.39311 header_out['CRVAL2'] = -28.939779 array_out, footprint_out = reproject_interp(hdu_in, header_out) return array_footprint_to_hdulist(array_out, footprint_out, header_out) # Note that we can't use independent_celestial_slices=True and reorder the # axes, hence why we need to prepare the combinations in this way. AXIS_ORDER = list(itertools.permutations((0, 1, 2))) COMBINATIONS = [(True, (0, 1, 2))] for axis_order in AXIS_ORDER: COMBINATIONS.append((False, axis_order)) @pytest.mark.fits_compare(single_reference=True) @pytest.mark.parametrize(('indep_slices', 'axis_order'), tuple(COMBINATIONS)) def test_reproject_celestial_3d_equ2gal(indep_slices, axis_order): """ Test reprojection of a 3D cube with celestial components, which includes a coordinate system conversion (the original header is in equatorial coordinates). We test using both the 'fast' method which assumes celestial slices are independent, and the 'full' method. We also scramble the input dimensions of the data and header to make sure that the reprojection can deal with this. """ # Read in the input cube hdu_in = fits.open(os.path.join(DATA, 'equatorial_3d.fits'))[0] # Define the output header - this should be the same for all versions of # this test to make sure we can use a single reference file. header_out = hdu_in.header.copy() header_out['NAXIS1'] = 10 header_out['NAXIS2'] = 9 header_out['CTYPE1'] = 'GLON-SIN' header_out['CTYPE2'] = 'GLAT-SIN' header_out['CRVAL1'] = 163.16724 header_out['CRVAL2'] = -15.777405 header_out['CRPIX1'] = 6 header_out['CRPIX2'] = 5 # We now scramble the input axes if axis_order != (0, 1, 2): wcs_in = WCS(hdu_in.header) wcs_in = wcs_in.sub((3 - np.array(axis_order)[::-1]).tolist()) hdu_in.header = wcs_in.to_header() hdu_in.data = np.transpose(hdu_in.data, axis_order) array_out, footprint_out = reproject_interp(hdu_in, header_out, independent_celestial_slices=indep_slices) return array_footprint_to_hdulist(array_out, footprint_out, header_out) @pytest.mark.fits_compare() def test_small_cutout(): """ Test reprojection of a cutout from a larger image (makes sure that the pre-reprojection cropping works) """ hdu_in = fits.open(os.path.join(DATA, 'galactic_2d.fits'))[0] header_out = hdu_in.header.copy() header_out['NAXIS1'] = 10 header_out['NAXIS2'] = 9 header_out['CTYPE1'] = 'RA---TAN' header_out['CTYPE2'] = 'DEC--TAN' header_out['CRVAL1'] = 266.39311 header_out['CRVAL2'] = -28.939779 header_out['CRPIX1'] = 5.1 header_out['CRPIX2'] = 4.7 array_out, footprint_out = reproject_interp(hdu_in, header_out) return array_footprint_to_hdulist(array_out, footprint_out, header_out) def test_mwpan_car_to_mol(): """ Test reprojection of the Mellinger Milky Way Panorama from CAR to MOL, which was returning all NaNs due to a regression that was introduced in reproject 0.3 (https://github.com/astrofrog/reproject/pull/124). """ hdu_in = fits.Header.fromtextfile(os.path.join(DATA, 'mwpan2_RGB_3600.hdr')) wcs_in = WCS(hdu_in, naxis=2) data_in = np.ones((hdu_in['NAXIS2'], hdu_in['NAXIS1']), dtype=np.float) header_out = fits.Header() header_out['NAXIS'] = 2 header_out['NAXIS1'] = 360 header_out['NAXIS2'] = 180 header_out['CRPIX1'] = 180 header_out['CRPIX2'] = 90 header_out['CRVAL1'] = 0 header_out['CRVAL2'] = 0 header_out['CDELT1'] = -2 * np.sqrt(2) / np.pi header_out['CDELT2'] = 2 * np.sqrt(2) / np.pi header_out['CTYPE1'] = 'GLON-MOL' header_out['CTYPE2'] = 'GLAT-MOL' header_out['RADESYS'] = 'ICRS' array_out, footprint_out = reproject_interp((data_in, wcs_in), header_out) assert np.isfinite(array_out).any() def test_small_cutout_outside(): """ Test reprojection of a cutout from a larger image - in this case the cutout is completely outside the region of the input image so we should take a shortcut that returns arrays of NaNs. """ hdu_in = fits.open(os.path.join(DATA, 'galactic_2d.fits'))[0] header_out = hdu_in.header.copy() header_out['NAXIS1'] = 10 header_out['NAXIS2'] = 9 header_out['CTYPE1'] = 'RA---TAN' header_out['CTYPE2'] = 'DEC--TAN' header_out['CRVAL1'] = 216.39311 header_out['CRVAL2'] = -21.939779 header_out['CRPIX1'] = 5.1 header_out['CRPIX2'] = 4.7 array_out, footprint_out = reproject_interp(hdu_in, header_out) assert np.all(np.isnan(array_out)) assert np.all(footprint_out == 0) def test_celestial_mismatch_2d(): """ Make sure an error is raised if the input image has celestial WCS information and the output does not (and vice-versa). This example will use the _reproject_celestial route. """ hdu_in = fits.open(os.path.join(DATA, 'galactic_2d.fits'))[0] header_out = hdu_in.header.copy() header_out['CTYPE1'] = 'APPLES' header_out['CTYPE2'] = 'ORANGES' data = hdu_in.data wcs1 = WCS(hdu_in.header) wcs2 = WCS(header_out) with pytest.raises(ValueError) as exc: array_out, footprint_out = reproject_interp((data, wcs1), wcs2, shape_out=(2, 2)) assert exc.value.args[0] == "Input WCS has celestial components but output WCS does not" def test_celestial_mismatch_3d(): """ Make sure an error is raised if the input image has celestial WCS information and the output does not (and vice-versa). This example will use the _reproject_full route. """ hdu_in = fits.open(os.path.join(DATA, 'equatorial_3d.fits'))[0] header_out = hdu_in.header.copy() header_out['CTYPE1'] = 'APPLES' header_out['CTYPE2'] = 'ORANGES' header_out['CTYPE3'] = 'BANANAS' data = hdu_in.data wcs1 = WCS(hdu_in.header) wcs2 = WCS(header_out) with pytest.raises(ValueError) as exc: array_out, footprint_out = reproject_interp((data, wcs1), wcs2, shape_out=(1, 2, 3)) assert exc.value.args[0] == "Input WCS has celestial components but output WCS does not" with pytest.raises(ValueError) as exc: array_out, footprint_out = reproject_interp((data, wcs2), wcs1, shape_out=(1, 2, 3)) assert exc.value.args[0] == "Output WCS has celestial components but input WCS does not" def test_spectral_mismatch_3d(): """ Make sure an error is raised if there are mismatches between the presence or type of spectral axis. """ hdu_in = fits.open(os.path.join(DATA, 'equatorial_3d.fits'))[0] header_out = hdu_in.header.copy() header_out['CTYPE3'] = 'FREQ' header_out['CUNIT3'] = 'Hz' data = hdu_in.data wcs1 = WCS(hdu_in.header) wcs2 = WCS(header_out) with pytest.raises(ValueError) as exc: array_out, footprint_out = reproject_interp((data, wcs1), wcs2, shape_out=(1, 2, 3)) assert exc.value.args[0] == "The input (VOPT) and output (FREQ) spectral coordinate types are not equivalent." header_out['CTYPE3'] = 'BANANAS' wcs2 = WCS(header_out) with pytest.raises(ValueError) as exc: array_out, footprint_out = reproject_interp((data, wcs1), wcs2, shape_out=(1, 2, 3)) assert exc.value.args[0] == "Input WCS has a spectral component but output WCS does not" with pytest.raises(ValueError) as exc: array_out, footprint_out = reproject_interp((data, wcs2), wcs1, shape_out=(1, 2, 3)) assert exc.value.args[0] == "Output WCS has a spectral component but input WCS does not" def test_naxis_mismatch(): """ Make sure an error is raised if the input and output WCS have a different number of dimensions. """ data = np.ones((3, 2, 2)) wcs_in = WCS(naxis=3) wcs_out = WCS(naxis=2) with pytest.raises(ValueError) as exc: array_out, footprint_out = reproject_interp((data, wcs_in), wcs_out, shape_out=(1, 2)) assert exc.value.args[0] == "Number of dimensions between input and output WCS should match" def test_slice_reprojection(): """ Test case where only the slices change and the celestial projection doesn't """ inp_cube = np.arange(3, dtype='float').repeat(4 * 5).reshape(3, 4, 5) header_in = fits.Header.fromtextfile(get_pkg_data_filename('../../tests/data/cube.hdr')) header_in['NAXIS1'] = 5 header_in['NAXIS2'] = 4 header_in['NAXIS3'] = 3 header_out = header_in.copy() header_out['NAXIS3'] = 2 header_out['CRPIX3'] -= 0.5 wcs_in = WCS(header_in) wcs_out = WCS(header_out) out_cube, out_cube_valid = _reproject_full(inp_cube, wcs_in, wcs_out, (2, 4, 5)) # we expect to be projecting from # inp_cube = np.arange(3, dtype='float').repeat(4*5).reshape(3,4,5) # to # inp_cube_interp = (inp_cube[:-1]+inp_cube[1:])/2. # which is confirmed by # map_coordinates(inp_cube.astype('float'), new_coords, order=1, cval=np.nan, mode='constant') # np.testing.assert_allclose(inp_cube_interp, map_coordinates(inp_cube.astype('float'), new_coords, order=1, cval=np.nan, mode='constant')) assert out_cube.shape == (2, 4, 5) assert out_cube_valid.sum() == 40. # We only check that the *valid* pixels are equal # but it's still nice to check that the "valid" array works as a mask np.testing.assert_allclose(out_cube[out_cube_valid.astype('bool')], ((inp_cube[:-1] + inp_cube[1:]) / 2.)[out_cube_valid.astype('bool')]) # Actually, I fixed it, so now we can test all np.testing.assert_allclose(out_cube, ((inp_cube[:-1] + inp_cube[1:]) / 2.)) def test_4d_fails(): header_in = fits.Header.fromtextfile(get_pkg_data_filename('../../tests/data/cube.hdr')) header_in['NAXIS'] = 4 header_out = header_in.copy() w_in = WCS(header_in) w_out = WCS(header_out) array_in = np.zeros((2, 3, 4, 5)) with pytest.raises(ValueError) as ex: x_out, y_out, z_out = reproject_interp((array_in, w_in), w_out, shape_out=[2, 4, 5, 6]) assert str(ex.value) == "Length of shape_out should match number of dimensions in wcs_out" def test_inequal_wcs_dims(): inp_cube = np.arange(3, dtype='float').repeat(4 * 5).reshape(3, 4, 5) header_in = fits.Header.fromtextfile(get_pkg_data_filename('../../tests/data/cube.hdr')) header_out = header_in.copy() header_out['CTYPE3'] = 'VRAD' header_out['CUNIT3'] = 'm/s' header_in['CTYPE3'] = 'STOKES' header_in['CUNIT3'] = '' wcs_out = WCS(header_out) with pytest.raises(ValueError) as ex: out_cube, out_cube_valid = reproject_interp((inp_cube, header_in), wcs_out, shape_out=(2, 4, 5)) assert str(ex.value) == "Output WCS has a spectral component but input WCS does not" def test_different_wcs_types(): inp_cube = np.arange(3, dtype='float').repeat(4 * 5).reshape(3, 4, 5) header_in = fits.Header.fromtextfile(get_pkg_data_filename('../../tests/data/cube.hdr')) header_out = header_in.copy() header_out['CTYPE3'] = 'VRAD' header_out['CUNIT3'] = 'm/s' header_in['CTYPE3'] = 'VELO' header_in['CUNIT3'] = 'm/s' wcs_in = WCS(header_in) wcs_out = WCS(header_out) with pytest.raises(ValueError) as ex: out_cube, out_cube_valid = reproject_interp((inp_cube, header_in), wcs_out, shape_out=(2, 4, 5)) assert str(ex.value) == ("The input (VELO) and output (VRAD) spectral " "coordinate types are not equivalent.") # TODO: add a test to check the units are the same. def test_reproject_3d_celestial_correctness_ra2gal(): inp_cube = np.arange(3, dtype='float').repeat(7 * 8).reshape(3, 7, 8) header_in = fits.Header.fromtextfile(get_pkg_data_filename('../../tests/data/cube.hdr')) header_in['NAXIS1'] = 8 header_in['NAXIS2'] = 7 header_in['NAXIS3'] = 3 header_out = header_in.copy() header_out['CTYPE1'] = 'GLON-TAN' header_out['CTYPE2'] = 'GLAT-TAN' header_out['CRVAL1'] = 158.5644791 header_out['CRVAL2'] = -21.59589875 # make the cube a cutout approximately in the center of the other one, but smaller header_out['NAXIS1'] = 4 header_out['CRPIX1'] = 2 header_out['NAXIS2'] = 3 header_out['CRPIX2'] = 1.5 header_out['NAXIS3'] = 2 header_out['CRPIX3'] -= 0.5 wcs_in = WCS(header_in) wcs_out = WCS(header_out) out_cube, out_cube_valid = reproject_interp((inp_cube, wcs_in), wcs_out, shape_out=(2, 3, 4)) assert out_cube.shape == (2, 3, 4) assert out_cube_valid.sum() == out_cube.size # only compare the spectral axis np.testing.assert_allclose(out_cube[:, 0, 0], ((inp_cube[:-1] + inp_cube[1:]) / 2.)[:, 0, 0]) def test_reproject_celestial_3d(): """ Test both full_reproject and slicewise reprojection. We use a case where the non-celestial slices are the same and therefore where both algorithms can work. """ header_in = fits.Header.fromtextfile(get_pkg_data_filename('../../tests/data/cube.hdr')) array_in = np.ones((3, 200, 180)) # TODO: here we can check that if we change the order of the dimensions in # the WCS, things still work properly wcs_in = WCS(header_in) wcs_out = wcs_in.deepcopy() wcs_out.wcs.ctype = ['GLON-SIN', 'GLAT-SIN', wcs_in.wcs.ctype[2]] wcs_out.wcs.crval = [158.0501, -21.530282, wcs_in.wcs.crval[2]] wcs_out.wcs.crpix = [50., 50., wcs_in.wcs.crpix[2] + 0.5] out_full, foot_full = _reproject_full(array_in, wcs_in, wcs_out, (3, 160, 170)) out_celestial, foot_celestial = _reproject_celestial(array_in, wcs_in, wcs_out, (3, 160, 170)) np.testing.assert_allclose(out_full, out_celestial) np.testing.assert_allclose(foot_full, foot_celestial) reproject-0.3.2/reproject/setup_package.py0000644000077000000240000000027013173065713020616 0ustar tomstaff00000000000000def get_package_data(): return { _ASTROPY_PACKAGE_NAME_ + '.tests': ['coveragerc', 'data/*'], _ASTROPY_PACKAGE_NAME_ + '.interpolation.tests': ['baseline/*'] } reproject-0.3.2/reproject/spherical_intersect/0000755000077000000240000000000013173066302021457 5ustar tomstaff00000000000000reproject-0.3.2/reproject/spherical_intersect/__init__.py0000644000077000000240000000021312724021736023567 0ustar tomstaff00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ Routines to compute pixel overlap areas. """ from .high_level import * reproject-0.3.2/reproject/spherical_intersect/_overlap.c0000644000077000000240000130665513173066300023450 0ustar tomstaff00000000000000/* Generated by Cython 0.26.1 */ #define PY_SSIZE_T_CLEAN #include "Python.h" #ifndef Py_PYTHON_H #error Python headers needed to compile C extensions, please install development version of Python. #elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03020000) #error Cython requires Python 2.6+ or Python 3.2+. #else #define CYTHON_ABI "0_26_1" #include #ifndef offsetof #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) #endif #if !defined(WIN32) && !defined(MS_WINDOWS) #ifndef __stdcall #define __stdcall #endif #ifndef __cdecl #define __cdecl #endif #ifndef __fastcall #define __fastcall #endif #endif #ifndef DL_IMPORT #define DL_IMPORT(t) t #endif #ifndef DL_EXPORT #define DL_EXPORT(t) t #endif #define __PYX_COMMA , #ifndef HAVE_LONG_LONG #if PY_VERSION_HEX >= 0x03030000 || (PY_MAJOR_VERSION == 2 && PY_VERSION_HEX >= 0x02070000) #define HAVE_LONG_LONG #endif #endif #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif #ifndef Py_HUGE_VAL #define Py_HUGE_VAL HUGE_VAL #endif #ifdef PYPY_VERSION #define CYTHON_COMPILING_IN_PYPY 1 #define CYTHON_COMPILING_IN_PYSTON 0 #define CYTHON_COMPILING_IN_CPYTHON 0 #undef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 0 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #undef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #undef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 1 #undef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 0 #undef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 0 #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #elif defined(PYSTON_VERSION) #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_PYSTON 1 #define CYTHON_COMPILING_IN_CPYTHON 0 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #else #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_PYSTON 0 #define CYTHON_COMPILING_IN_CPYTHON 1 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #if PY_VERSION_HEX < 0x02070000 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #elif !defined(CYTHON_USE_PYTYPE_LOOKUP) #define CYTHON_USE_PYTYPE_LOOKUP 1 #endif #if PY_MAJOR_VERSION < 3 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #if PY_VERSION_HEX < 0x02070000 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #elif !defined(CYTHON_USE_PYLONG_INTERNALS) #define CYTHON_USE_PYLONG_INTERNALS 1 #endif #ifndef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 1 #endif #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #if PY_VERSION_HEX < 0x030300F0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #elif !defined(CYTHON_USE_UNICODE_WRITER) #define CYTHON_USE_UNICODE_WRITER 1 #endif #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #ifndef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 1 #endif #ifndef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 1 #endif #endif #if !defined(CYTHON_FAST_PYCCALL) #define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) #endif #if CYTHON_USE_PYLONG_INTERNALS #include "longintrepr.h" #undef SHIFT #undef BASE #undef MASK #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) #define Py_OptimizeFlag 0 #endif #define __PYX_BUILD_PY_SSIZE_T "n" #define CYTHON_FORMAT_SSIZE_T "z" #if PY_MAJOR_VERSION < 3 #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #define __Pyx_DefaultClassType PyClass_Type #else #define __Pyx_BUILTIN_MODULE_NAME "builtins" #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #define __Pyx_DefaultClassType PyType_Type #endif #ifndef Py_TPFLAGS_CHECKTYPES #define Py_TPFLAGS_CHECKTYPES 0 #endif #ifndef Py_TPFLAGS_HAVE_INDEX #define Py_TPFLAGS_HAVE_INDEX 0 #endif #ifndef Py_TPFLAGS_HAVE_NEWBUFFER #define Py_TPFLAGS_HAVE_NEWBUFFER 0 #endif #ifndef Py_TPFLAGS_HAVE_FINALIZE #define Py_TPFLAGS_HAVE_FINALIZE 0 #endif #if PY_VERSION_HEX < 0x030700A0 || !defined(METH_FASTCALL) #ifndef METH_FASTCALL #define METH_FASTCALL 0x80 #endif typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject **args, Py_ssize_t nargs); typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames); #else #define __Pyx_PyCFunctionFast _PyCFunctionFast #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords #endif #if CYTHON_FAST_PYCCALL #define __Pyx_PyFastCFunction_Check(func)\ ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS))))) #else #define __Pyx_PyFastCFunction_Check(func) 0 #endif #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) #define CYTHON_PEP393_ENABLED 1 #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ 0 : _PyUnicode_Ready((PyObject *)(op))) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) #else #define CYTHON_PEP393_ENABLED 0 #define PyUnicode_1BYTE_KIND 1 #define PyUnicode_2BYTE_KIND 2 #define PyUnicode_4BYTE_KIND 4 #define __Pyx_PyUnicode_READY(op) (0) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111) #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch) #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) #endif #if CYTHON_COMPILING_IN_PYPY #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) #else #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) #define PyObject_Malloc(s) PyMem_Malloc(s) #define PyObject_Free(p) PyMem_Free(p) #define PyObject_Realloc(p) PyMem_Realloc(p) #endif #if CYTHON_COMPILING_IN_PYSTON #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno) #else #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) #endif #define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) #define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) #else #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) #endif #if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) #define PyObject_ASCII(o) PyObject_Repr(o) #endif #if PY_MAJOR_VERSION >= 3 #define PyBaseString_Type PyUnicode_Type #define PyStringObject PyUnicodeObject #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) #else #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) #endif #ifndef PySet_CheckExact #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) #endif #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) #define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) #if PY_MAJOR_VERSION >= 3 #define PyIntObject PyLongObject #define PyInt_Type PyLong_Type #define PyInt_Check(op) PyLong_Check(op) #define PyInt_CheckExact(op) PyLong_CheckExact(op) #define PyInt_FromString PyLong_FromString #define PyInt_FromUnicode PyLong_FromUnicode #define PyInt_FromLong PyLong_FromLong #define PyInt_FromSize_t PyLong_FromSize_t #define PyInt_FromSsize_t PyLong_FromSsize_t #define PyInt_AsLong PyLong_AsLong #define PyInt_AS_LONG PyLong_AS_LONG #define PyInt_AsSsize_t PyLong_AsSsize_t #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask #define PyNumber_Int PyNumber_Long #endif #if PY_MAJOR_VERSION >= 3 #define PyBoolObject PyLongObject #endif #if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY #ifndef PyUnicode_InternFromString #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) #endif #endif #if PY_VERSION_HEX < 0x030200A4 typedef long Py_hash_t; #define __Pyx_PyInt_FromHash_t PyInt_FromLong #define __Pyx_PyInt_AsHash_t PyInt_AsLong #else #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func)) #else #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) #endif #ifndef __has_attribute #define __has_attribute(x) 0 #endif #ifndef __has_cpp_attribute #define __has_cpp_attribute(x) 0 #endif #if CYTHON_USE_ASYNC_SLOTS #if PY_VERSION_HEX >= 0x030500B1 #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) #else typedef struct { unaryfunc am_await; unaryfunc am_aiter; unaryfunc am_anext; } __Pyx_PyAsyncMethodsStruct; #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) #endif #else #define __Pyx_PyType_AsAsync(obj) NULL #endif #ifndef CYTHON_RESTRICT #if defined(__GNUC__) #define CYTHON_RESTRICT __restrict__ #elif defined(_MSC_VER) && _MSC_VER >= 1400 #define CYTHON_RESTRICT __restrict #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_RESTRICT restrict #else #define CYTHON_RESTRICT #endif #endif #ifndef CYTHON_UNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif # elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif #endif #ifndef CYTHON_MAYBE_UNUSED_VAR # if defined(__cplusplus) template void CYTHON_MAYBE_UNUSED_VAR( const T& ) { } # else # define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x) # endif #endif #ifndef CYTHON_NCP_UNUSED # if CYTHON_COMPILING_IN_CPYTHON # define CYTHON_NCP_UNUSED # else # define CYTHON_NCP_UNUSED CYTHON_UNUSED # endif #endif #define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) #ifdef _MSC_VER #ifndef _MSC_STDINT_H_ #if _MSC_VER < 1300 typedef unsigned char uint8_t; typedef unsigned int uint32_t; #else typedef unsigned __int8 uint8_t; typedef unsigned __int32 uint32_t; #endif #endif #else #include #endif #ifndef CYTHON_FALLTHROUGH #ifdef __cplusplus #if __has_cpp_attribute(fallthrough) #define CYTHON_FALLTHROUGH [[fallthrough]] #elif __has_cpp_attribute(clang::fallthrough) #define CYTHON_FALLTHROUGH [[clang::fallthrough]] #endif #endif #ifndef CYTHON_FALLTHROUGH #if __has_attribute(fallthrough) || (defined(__GNUC__) && defined(__attribute__)) #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) #else #define CYTHON_FALLTHROUGH #endif #endif #endif #ifndef CYTHON_INLINE #if defined(__clang__) #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) #elif defined(__GNUC__) #define CYTHON_INLINE __inline__ #elif defined(_MSC_VER) #define CYTHON_INLINE __inline #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_INLINE inline #else #define CYTHON_INLINE #endif #endif #if defined(WIN32) || defined(MS_WINDOWS) #define _USE_MATH_DEFINES #endif #include #ifdef NAN #define __PYX_NAN() ((float) NAN) #else static CYTHON_INLINE float __PYX_NAN() { float value; memset(&value, 0xFF, sizeof(value)); return value; } #endif #if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) #define __Pyx_truncl trunc #else #define __Pyx_truncl truncl #endif #define __PYX_ERR(f_index, lineno, Ln_error) \ { \ __pyx_filename = __pyx_f[f_index]; __pyx_lineno = lineno; __pyx_clineno = __LINE__; goto Ln_error; \ } #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) #else #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) #endif #ifndef __PYX_EXTERN_C #ifdef __cplusplus #define __PYX_EXTERN_C extern "C" #else #define __PYX_EXTERN_C extern #endif #endif #define __PYX_HAVE__reproject__spherical_intersect___overlap #define __PYX_HAVE_API__reproject__spherical_intersect___overlap #include #include #include #include "numpy/arrayobject.h" #include "numpy/ufuncobject.h" #include "overlapArea.h" #include "reproject_slice_c.h" #ifdef _OPENMP #include #endif /* _OPENMP */ #ifdef PYREX_WITHOUT_ASSERTIONS #define CYTHON_WITHOUT_ASSERTIONS #endif typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; #define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT 0 #define __PYX_DEFAULT_STRING_ENCODING "" #define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString #define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #define __Pyx_uchar_cast(c) ((unsigned char)c) #define __Pyx_long_cast(x) ((long)x) #define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ (sizeof(type) < sizeof(Py_ssize_t)) ||\ (sizeof(type) > sizeof(Py_ssize_t) &&\ likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX) &&\ (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ v == (type)PY_SSIZE_T_MIN))) ||\ (sizeof(type) == sizeof(Py_ssize_t) &&\ (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX))) ) #if defined (__cplusplus) && __cplusplus >= 201103L #include #define __Pyx_sst_abs(value) std::abs(value) #elif SIZEOF_INT >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) abs(value) #elif SIZEOF_LONG >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) labs(value) #elif defined (_MSC_VER) && defined (_M_X64) #define __Pyx_sst_abs(value) _abs64(value) #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define __Pyx_sst_abs(value) llabs(value) #elif defined (__GNUC__) #define __Pyx_sst_abs(value) __builtin_llabs(value) #else #define __Pyx_sst_abs(value) ((value<0) ? -value : value) #endif static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); #define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) #define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) #define __Pyx_PyBytes_FromString PyBytes_FromString #define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); #if PY_MAJOR_VERSION < 3 #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #else #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize #endif #define __Pyx_PyObject_AsWritableString(s) ((char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) #define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) #define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) #define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) #define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) #if PY_MAJOR_VERSION < 3 static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { const Py_UNICODE *u_end = u; while (*u_end++) ; return (size_t)(u_end - u - 1); } #else #define __Pyx_Py_UNICODE_strlen Py_UNICODE_strlen #endif #define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) #define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) #define __Pyx_PyBool_FromLong(b) ((b) ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False)) static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); #if CYTHON_ASSUME_SAFE_MACROS #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) #else #define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) #endif #define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) #else #define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) #endif #define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII static int __Pyx_sys_getdefaultencoding_not_ascii; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; PyObject* ascii_chars_u = NULL; PyObject* ascii_chars_b = NULL; const char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; if (strcmp(default_encoding_c, "ascii") == 0) { __Pyx_sys_getdefaultencoding_not_ascii = 0; } else { char ascii_chars[128]; int c; for (c = 0; c < 128; c++) { ascii_chars[c] = c; } __Pyx_sys_getdefaultencoding_not_ascii = 1; ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); if (!ascii_chars_u) goto bad; ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { PyErr_Format( PyExc_ValueError, "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", default_encoding_c); goto bad; } Py_DECREF(ascii_chars_u); Py_DECREF(ascii_chars_b); } Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); Py_XDECREF(ascii_chars_u); Py_XDECREF(ascii_chars_b); return -1; } #endif #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) #else #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT static char* __PYX_DEFAULT_STRING_ENCODING; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c)); if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); return -1; } #endif #endif /* Test for GCC > 2.95 */ #if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else /* !__GNUC__ or GCC < 2.95 */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ */ static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } static PyObject *__pyx_m; static PyObject *__pyx_d; static PyObject *__pyx_b; static PyObject *__pyx_cython_runtime; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; static PyObject *__pyx_empty_unicode; static int __pyx_lineno; static int __pyx_clineno = 0; static const char * __pyx_cfilenm= __FILE__; static const char *__pyx_filename; /* Header.proto */ #if !defined(CYTHON_CCOMPLEX) #if defined(__cplusplus) #define CYTHON_CCOMPLEX 1 #elif defined(_Complex_I) #define CYTHON_CCOMPLEX 1 #else #define CYTHON_CCOMPLEX 0 #endif #endif #if CYTHON_CCOMPLEX #ifdef __cplusplus #include #else #include #endif #endif #if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__) #undef _Complex_I #define _Complex_I 1.0fj #endif static const char *__pyx_f[] = { "reproject/spherical_intersect/_overlap.pyx", "__init__.pxd", "type.pxd", }; /* BufferFormatStructs.proto */ #define IS_UNSIGNED(type) (((type) -1) > 0) struct __Pyx_StructField_; #define __PYX_BUF_FLAGS_PACKED_STRUCT (1 << 0) typedef struct { const char* name; struct __Pyx_StructField_* fields; size_t size; size_t arraysize[8]; int ndim; char typegroup; char is_unsigned; int flags; } __Pyx_TypeInfo; typedef struct __Pyx_StructField_ { __Pyx_TypeInfo* type; const char* name; size_t offset; } __Pyx_StructField; typedef struct { __Pyx_StructField* field; size_t parent_offset; } __Pyx_BufFmt_StackElem; typedef struct { __Pyx_StructField root; __Pyx_BufFmt_StackElem* head; size_t fmt_offset; size_t new_count, enc_count; size_t struct_alignment; int is_complex; char enc_type; char new_packmode; char enc_packmode; char is_valid_array; } __Pyx_BufFmt_Context; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":725 * # in Cython to enable them only on the right systems. * * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t */ typedef npy_int8 __pyx_t_5numpy_int8_t; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":726 * * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< * ctypedef npy_int32 int32_t * ctypedef npy_int64 int64_t */ typedef npy_int16 __pyx_t_5numpy_int16_t; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":727 * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< * ctypedef npy_int64 int64_t * #ctypedef npy_int96 int96_t */ typedef npy_int32 __pyx_t_5numpy_int32_t; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":728 * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< * #ctypedef npy_int96 int96_t * #ctypedef npy_int128 int128_t */ typedef npy_int64 __pyx_t_5numpy_int64_t; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":732 * #ctypedef npy_int128 int128_t * * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t */ typedef npy_uint8 __pyx_t_5numpy_uint8_t; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":733 * * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< * ctypedef npy_uint32 uint32_t * ctypedef npy_uint64 uint64_t */ typedef npy_uint16 __pyx_t_5numpy_uint16_t; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":734 * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< * ctypedef npy_uint64 uint64_t * #ctypedef npy_uint96 uint96_t */ typedef npy_uint32 __pyx_t_5numpy_uint32_t; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":735 * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< * #ctypedef npy_uint96 uint96_t * #ctypedef npy_uint128 uint128_t */ typedef npy_uint64 __pyx_t_5numpy_uint64_t; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":739 * #ctypedef npy_uint128 uint128_t * * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< * ctypedef npy_float64 float64_t * #ctypedef npy_float80 float80_t */ typedef npy_float32 __pyx_t_5numpy_float32_t; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":740 * * ctypedef npy_float32 float32_t * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< * #ctypedef npy_float80 float80_t * #ctypedef npy_float128 float128_t */ typedef npy_float64 __pyx_t_5numpy_float64_t; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":749 * # The int types are mapped a bit surprising -- * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t # <<<<<<<<<<<<<< * ctypedef npy_longlong long_t * ctypedef npy_longlong longlong_t */ typedef npy_long __pyx_t_5numpy_int_t; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":750 * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t * ctypedef npy_longlong long_t # <<<<<<<<<<<<<< * ctypedef npy_longlong longlong_t * */ typedef npy_longlong __pyx_t_5numpy_long_t; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":751 * ctypedef npy_long int_t * ctypedef npy_longlong long_t * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< * * ctypedef npy_ulong uint_t */ typedef npy_longlong __pyx_t_5numpy_longlong_t; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":753 * ctypedef npy_longlong longlong_t * * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< * ctypedef npy_ulonglong ulong_t * ctypedef npy_ulonglong ulonglong_t */ typedef npy_ulong __pyx_t_5numpy_uint_t; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":754 * * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t # <<<<<<<<<<<<<< * ctypedef npy_ulonglong ulonglong_t * */ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":755 * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< * * ctypedef npy_intp intp_t */ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":757 * ctypedef npy_ulonglong ulonglong_t * * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< * ctypedef npy_uintp uintp_t * */ typedef npy_intp __pyx_t_5numpy_intp_t; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":758 * * ctypedef npy_intp intp_t * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< * * ctypedef npy_double float_t */ typedef npy_uintp __pyx_t_5numpy_uintp_t; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":760 * ctypedef npy_uintp uintp_t * * ctypedef npy_double float_t # <<<<<<<<<<<<<< * ctypedef npy_double double_t * ctypedef npy_longdouble longdouble_t */ typedef npy_double __pyx_t_5numpy_float_t; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":761 * * ctypedef npy_double float_t * ctypedef npy_double double_t # <<<<<<<<<<<<<< * ctypedef npy_longdouble longdouble_t * */ typedef npy_double __pyx_t_5numpy_double_t; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":762 * ctypedef npy_double float_t * ctypedef npy_double double_t * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< * * ctypedef npy_cfloat cfloat_t */ typedef npy_longdouble __pyx_t_5numpy_longdouble_t; /* "reproject/spherical_intersect/_overlap.pyx":5 * import cython * * ctypedef np.double_t DOUBLE_T # <<<<<<<<<<<<<< * * cdef extern from "overlapArea.h": */ typedef __pyx_t_5numpy_double_t __pyx_t_9reproject_19spherical_intersect_8_overlap_DOUBLE_T; /* Declarations.proto */ #if CYTHON_CCOMPLEX #ifdef __cplusplus typedef ::std::complex< float > __pyx_t_float_complex; #else typedef float _Complex __pyx_t_float_complex; #endif #else typedef struct { float real, imag; } __pyx_t_float_complex; #endif static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float); /* Declarations.proto */ #if CYTHON_CCOMPLEX #ifdef __cplusplus typedef ::std::complex< double > __pyx_t_double_complex; #else typedef double _Complex __pyx_t_double_complex; #endif #else typedef struct { double real, imag; } __pyx_t_double_complex; #endif static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); /*--- Type declarations ---*/ /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":764 * ctypedef npy_longdouble longdouble_t * * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< * ctypedef npy_cdouble cdouble_t * ctypedef npy_clongdouble clongdouble_t */ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":765 * * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< * ctypedef npy_clongdouble clongdouble_t * */ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":766 * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< * * ctypedef npy_cdouble complex_t */ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":768 * ctypedef npy_clongdouble clongdouble_t * * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew1(a): */ typedef npy_cdouble __pyx_t_5numpy_complex_t; /* --- Runtime support code (head) --- */ /* Refnanny.proto */ #ifndef CYTHON_REFNANNY #define CYTHON_REFNANNY 0 #endif #if CYTHON_REFNANNY typedef struct { void (*INCREF)(void*, PyObject*, int); void (*DECREF)(void*, PyObject*, int); void (*GOTREF)(void*, PyObject*, int); void (*GIVEREF)(void*, PyObject*, int); void* (*SetupContext)(const char*, int, const char*); void (*FinishContext)(void**); } __Pyx_RefNannyAPIStruct; static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; #ifdef WITH_THREAD #define __Pyx_RefNannySetupContext(name, acquire_gil)\ if (acquire_gil) {\ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ PyGILState_Release(__pyx_gilstate_save);\ } else {\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ } #else #define __Pyx_RefNannySetupContext(name, acquire_gil)\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) #endif #define __Pyx_RefNannyFinishContext()\ __Pyx_RefNanny->FinishContext(&__pyx_refnanny) #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) #else #define __Pyx_RefNannyDeclarations #define __Pyx_RefNannySetupContext(name, acquire_gil) #define __Pyx_RefNannyFinishContext() #define __Pyx_INCREF(r) Py_INCREF(r) #define __Pyx_DECREF(r) Py_DECREF(r) #define __Pyx_GOTREF(r) #define __Pyx_GIVEREF(r) #define __Pyx_XINCREF(r) Py_XINCREF(r) #define __Pyx_XDECREF(r) Py_XDECREF(r) #define __Pyx_XGOTREF(r) #define __Pyx_XGIVEREF(r) #endif #define __Pyx_XDECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_XDECREF(tmp);\ } while (0) #define __Pyx_DECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_DECREF(tmp);\ } while (0) #define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) #define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) /* PyObjectGetAttrStr.proto */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { PyTypeObject* tp = Py_TYPE(obj); if (likely(tp->tp_getattro)) return tp->tp_getattro(obj, attr_name); #if PY_MAJOR_VERSION < 3 if (likely(tp->tp_getattr)) return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); #endif return PyObject_GetAttr(obj, attr_name); } #else #define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) #endif /* GetBuiltinName.proto */ static PyObject *__Pyx_GetBuiltinName(PyObject *name); /* RaiseArgTupleInvalid.proto */ static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /* RaiseDoubleKeywords.proto */ static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /* ParseKeywords.proto */ static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ const char* function_name); /* ArgTypeTest.proto */ static CYTHON_INLINE int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, const char *name, int exact); /* IsLittleEndian.proto */ static CYTHON_INLINE int __Pyx_Is_Little_Endian(void); /* BufferFormatCheck.proto */ static CYTHON_INLINE int __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack); static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info); static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts); static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, __Pyx_BufFmt_StackElem* stack, __Pyx_TypeInfo* type); /* GetModuleGlobalName.proto */ static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name); /* PyObjectCall.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); #else #define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) #endif /* ExtTypeTest.proto */ static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /* BufferIndexError.proto */ static void __Pyx_RaiseBufferIndexError(int axis); #define __Pyx_BufPtrCContig2d(type, buf, i0, s0, i1, s1) ((type)((char*)buf + i0 * s0) + i1) #define __Pyx_BufPtrCContig1d(type, buf, i0, s0) ((type)buf + i0) /* PyThreadStateGet.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; #define __Pyx_PyThreadState_assign __pyx_tstate = PyThreadState_GET(); #else #define __Pyx_PyThreadState_declare #define __Pyx_PyThreadState_assign #endif /* PyErrFetchRestore.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) #define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #else #define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) #endif #define __Pyx_BufPtrStrided2d(type, buf, i0, s0, i1, s1) (type)((char*)buf + i0 * s0 + i1 * s1) #define __Pyx_BufPtrStrided1d(type, buf, i0, s0) (type)((char*)buf + i0 * s0) /* RaiseException.proto */ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); /* DictGetItem.proto */ #if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { PyObject *value; value = PyDict_GetItemWithError(d, key); if (unlikely(!value)) { if (!PyErr_Occurred()) { PyObject* args = PyTuple_Pack(1, key); if (likely(args)) PyErr_SetObject(PyExc_KeyError, args); Py_XDECREF(args); } return NULL; } Py_INCREF(value); return value; } #else #define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key) #endif /* RaiseTooManyValuesToUnpack.proto */ static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); /* RaiseNeedMoreValuesToUnpack.proto */ static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); /* RaiseNoneIterError.proto */ static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); /* SaveResetException.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); #else #define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) #define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) #endif /* PyErrExceptionMatches.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); #else #define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) #endif /* GetException.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #else static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); #endif /* Import.proto */ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); /* CLineInTraceback.proto */ static int __Pyx_CLineForTraceback(int c_line); /* CodeObjectCache.proto */ typedef struct { PyCodeObject* code_object; int code_line; } __Pyx_CodeObjectCacheEntry; struct __Pyx_CodeObjectCache { int count; int max_count; __Pyx_CodeObjectCacheEntry* entries; }; static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); static PyCodeObject *__pyx_find_code_object(int code_line); static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); /* AddTraceback.proto */ static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename); /* BufferStructDeclare.proto */ typedef struct { Py_ssize_t shape, strides, suboffsets; } __Pyx_Buf_DimInfo; typedef struct { size_t refcount; Py_buffer pybuffer; } __Pyx_Buffer; typedef struct { __Pyx_Buffer *rcbuffer; char *data; __Pyx_Buf_DimInfo diminfo[8]; } __Pyx_LocalBuf_ND; #if PY_MAJOR_VERSION < 3 static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags); static void __Pyx_ReleaseBuffer(Py_buffer *view); #else #define __Pyx_GetBuffer PyObject_GetBuffer #define __Pyx_ReleaseBuffer PyBuffer_Release #endif /* None.proto */ static Py_ssize_t __Pyx_zeros[] = {0, 0, 0, 0, 0, 0, 0, 0}; static Py_ssize_t __Pyx_minusones[] = {-1, -1, -1, -1, -1, -1, -1, -1}; /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); /* RealImag.proto */ #if CYTHON_CCOMPLEX #ifdef __cplusplus #define __Pyx_CREAL(z) ((z).real()) #define __Pyx_CIMAG(z) ((z).imag()) #else #define __Pyx_CREAL(z) (__real__(z)) #define __Pyx_CIMAG(z) (__imag__(z)) #endif #else #define __Pyx_CREAL(z) ((z).real) #define __Pyx_CIMAG(z) ((z).imag) #endif #if defined(__cplusplus) && CYTHON_CCOMPLEX\ && (defined(_WIN32) || defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 5 || __GNUC__ == 4 && __GNUC_MINOR__ >= 4 )) || __cplusplus >= 201103) #define __Pyx_SET_CREAL(z,x) ((z).real(x)) #define __Pyx_SET_CIMAG(z,y) ((z).imag(y)) #else #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x) #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y) #endif /* Arithmetic.proto */ #if CYTHON_CCOMPLEX #define __Pyx_c_eq_float(a, b) ((a)==(b)) #define __Pyx_c_sum_float(a, b) ((a)+(b)) #define __Pyx_c_diff_float(a, b) ((a)-(b)) #define __Pyx_c_prod_float(a, b) ((a)*(b)) #define __Pyx_c_quot_float(a, b) ((a)/(b)) #define __Pyx_c_neg_float(a) (-(a)) #ifdef __cplusplus #define __Pyx_c_is_zero_float(z) ((z)==(float)0) #define __Pyx_c_conj_float(z) (::std::conj(z)) #if 1 #define __Pyx_c_abs_float(z) (::std::abs(z)) #define __Pyx_c_pow_float(a, b) (::std::pow(a, b)) #endif #else #define __Pyx_c_is_zero_float(z) ((z)==0) #define __Pyx_c_conj_float(z) (conjf(z)) #if 1 #define __Pyx_c_abs_float(z) (cabsf(z)) #define __Pyx_c_pow_float(a, b) (cpowf(a, b)) #endif #endif #else static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex); static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex); #if 1 static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex, __pyx_t_float_complex); #endif #endif /* Arithmetic.proto */ #if CYTHON_CCOMPLEX #define __Pyx_c_eq_double(a, b) ((a)==(b)) #define __Pyx_c_sum_double(a, b) ((a)+(b)) #define __Pyx_c_diff_double(a, b) ((a)-(b)) #define __Pyx_c_prod_double(a, b) ((a)*(b)) #define __Pyx_c_quot_double(a, b) ((a)/(b)) #define __Pyx_c_neg_double(a) (-(a)) #ifdef __cplusplus #define __Pyx_c_is_zero_double(z) ((z)==(double)0) #define __Pyx_c_conj_double(z) (::std::conj(z)) #if 1 #define __Pyx_c_abs_double(z) (::std::abs(z)) #define __Pyx_c_pow_double(a, b) (::std::pow(a, b)) #endif #else #define __Pyx_c_is_zero_double(z) ((z)==0) #define __Pyx_c_conj_double(z) (conj(z)) #if 1 #define __Pyx_c_abs_double(z) (cabs(z)) #define __Pyx_c_pow_double(a, b) (cpow(a, b)) #endif #endif #else static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex); static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex); #if 1 static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex, __pyx_t_double_complex); #endif #endif /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY_TYPES value); /* CIntFromPy.proto */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); /* CIntFromPy.proto */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); /* CheckBinaryVersion.proto */ static int __Pyx_check_binary_version(void); /* PyIdentifierFromString.proto */ #if !defined(__Pyx_PyIdentifier_FromString) #if PY_MAJOR_VERSION < 3 #define __Pyx_PyIdentifier_FromString(s) PyString_FromString(s) #else #define __Pyx_PyIdentifier_FromString(s) PyUnicode_FromString(s) #endif #endif /* ModuleImport.proto */ static PyObject *__Pyx_ImportModule(const char *name); /* TypeImport.proto */ static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, size_t size, int strict); /* InitStrings.proto */ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /* Module declarations from 'cpython.buffer' */ /* Module declarations from 'libc.string' */ /* Module declarations from 'libc.stdio' */ /* Module declarations from '__builtin__' */ /* Module declarations from 'cpython.type' */ static PyTypeObject *__pyx_ptype_7cpython_4type_type = 0; /* Module declarations from 'cpython' */ /* Module declarations from 'cpython.object' */ /* Module declarations from 'cpython.ref' */ /* Module declarations from 'libc.stdlib' */ /* Module declarations from 'numpy' */ /* Module declarations from 'numpy' */ static PyTypeObject *__pyx_ptype_5numpy_dtype = 0; static PyTypeObject *__pyx_ptype_5numpy_flatiter = 0; static PyTypeObject *__pyx_ptype_5numpy_broadcast = 0; static PyTypeObject *__pyx_ptype_5numpy_ndarray = 0; static PyTypeObject *__pyx_ptype_5numpy_ufunc = 0; static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/ /* Module declarations from 'cython' */ /* Module declarations from 'reproject.spherical_intersect._overlap' */ static __Pyx_TypeInfo __Pyx_TypeInfo_double = { "double", NULL, sizeof(double), { 0 }, 0, 'R', 0, 0 }; #define __Pyx_MODULE_NAME "reproject.spherical_intersect._overlap" int __pyx_module_is_main_reproject__spherical_intersect___overlap = 0; /* Implementation of 'reproject.spherical_intersect._overlap' */ static PyObject *__pyx_builtin_range; static PyObject *__pyx_builtin_ValueError; static PyObject *__pyx_builtin_RuntimeError; static PyObject *__pyx_builtin_ImportError; static const char __pyx_k_i[] = "i"; static const char __pyx_k_n[] = "n"; static const char __pyx_k_np[] = "np"; static const char __pyx_k_endx[] = "endx"; static const char __pyx_k_endy[] = "endy"; static const char __pyx_k_ilat[] = "ilat"; static const char __pyx_k_ilon[] = "ilon"; static const char __pyx_k_main[] = "__main__"; static const char __pyx_k_olat[] = "olat"; static const char __pyx_k_olon[] = "olon"; static const char __pyx_k_test[] = "__test__"; static const char __pyx_k_array[] = "array"; static const char __pyx_k_dtype[] = "dtype"; static const char __pyx_k_empty[] = "empty"; static const char __pyx_k_numpy[] = "numpy"; static const char __pyx_k_range[] = "range"; static const char __pyx_k_xw_in[] = "xw_in"; static const char __pyx_k_yw_in[] = "yw_in"; static const char __pyx_k_zeros[] = "zeros"; static const char __pyx_k_col_in[] = "col_in"; static const char __pyx_k_double[] = "double"; static const char __pyx_k_import[] = "__import__"; static const char __pyx_k_nx_out[] = "nx_out"; static const char __pyx_k_ny_out[] = "ny_out"; static const char __pyx_k_startx[] = "startx"; static const char __pyx_k_starty[] = "starty"; static const char __pyx_k_xw_out[] = "xw_out"; static const char __pyx_k_yw_out[] = "yw_out"; static const char __pyx_k_col_new[] = "col_new"; static const char __pyx_k_col_out[] = "col_out"; static const char __pyx_k_overlap[] = "overlap"; static const char __pyx_k_weights[] = "weights"; static const char __pyx_k_original[] = "original"; static const char __pyx_k_xp_inout[] = "xp_inout"; static const char __pyx_k_yp_inout[] = "yp_inout"; static const char __pyx_k_array_new[] = "array_new"; static const char __pyx_k_col_array[] = "col_array"; static const char __pyx_k_shape_out[] = "shape_out"; static const char __pyx_k_ValueError[] = "ValueError"; static const char __pyx_k_area_ratio[] = "area_ratio"; static const char __pyx_k_ImportError[] = "ImportError"; static const char __pyx_k_RuntimeError[] = "RuntimeError"; static const char __pyx_k_compute_overlap[] = "_compute_overlap"; static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; static const char __pyx_k_reproject_slice_cython[] = "_reproject_slice_cython"; static const char __pyx_k_ndarray_is_not_C_contiguous[] = "ndarray is not C contiguous"; static const char __pyx_k_numpy_core_multiarray_failed_to[] = "numpy.core.multiarray failed to import"; static const char __pyx_k_unknown_dtype_code_in_numpy_pxd[] = "unknown dtype code in numpy.pxd (%d)"; static const char __pyx_k_Format_string_allocated_too_shor[] = "Format string allocated too short, see comment in numpy.pxd"; static const char __pyx_k_Non_native_byte_order_not_suppor[] = "Non-native byte order not supported"; static const char __pyx_k_ndarray_is_not_Fortran_contiguou[] = "ndarray is not Fortran contiguous"; static const char __pyx_k_numpy_core_umath_failed_to_impor[] = "numpy.core.umath failed to import"; static const char __pyx_k_reproject_spherical_intersect__o[] = "reproject/spherical_intersect/_overlap.pyx"; static const char __pyx_k_Format_string_allocated_too_shor_2[] = "Format string allocated too short."; static const char __pyx_k_reproject_spherical_intersect__o_2[] = "reproject.spherical_intersect._overlap"; static PyObject *__pyx_kp_u_Format_string_allocated_too_shor; static PyObject *__pyx_kp_u_Format_string_allocated_too_shor_2; static PyObject *__pyx_n_s_ImportError; static PyObject *__pyx_kp_u_Non_native_byte_order_not_suppor; static PyObject *__pyx_n_s_RuntimeError; static PyObject *__pyx_n_s_ValueError; static PyObject *__pyx_n_s_area_ratio; static PyObject *__pyx_n_s_array; static PyObject *__pyx_n_s_array_new; static PyObject *__pyx_n_s_cline_in_traceback; static PyObject *__pyx_n_s_col_array; static PyObject *__pyx_n_s_col_in; static PyObject *__pyx_n_s_col_new; static PyObject *__pyx_n_s_col_out; static PyObject *__pyx_n_s_compute_overlap; static PyObject *__pyx_n_s_double; static PyObject *__pyx_n_s_dtype; static PyObject *__pyx_n_s_empty; static PyObject *__pyx_n_s_endx; static PyObject *__pyx_n_s_endy; static PyObject *__pyx_n_s_i; static PyObject *__pyx_n_s_ilat; static PyObject *__pyx_n_s_ilon; static PyObject *__pyx_n_s_import; static PyObject *__pyx_n_s_main; static PyObject *__pyx_n_s_n; static PyObject *__pyx_kp_u_ndarray_is_not_C_contiguous; static PyObject *__pyx_kp_u_ndarray_is_not_Fortran_contiguou; static PyObject *__pyx_n_s_np; static PyObject *__pyx_n_s_numpy; static PyObject *__pyx_kp_s_numpy_core_multiarray_failed_to; static PyObject *__pyx_kp_s_numpy_core_umath_failed_to_impor; static PyObject *__pyx_n_s_nx_out; static PyObject *__pyx_n_s_ny_out; static PyObject *__pyx_n_s_olat; static PyObject *__pyx_n_s_olon; static PyObject *__pyx_n_s_original; static PyObject *__pyx_n_s_overlap; static PyObject *__pyx_n_s_range; static PyObject *__pyx_n_s_reproject_slice_cython; static PyObject *__pyx_kp_s_reproject_spherical_intersect__o; static PyObject *__pyx_n_s_reproject_spherical_intersect__o_2; static PyObject *__pyx_n_s_shape_out; static PyObject *__pyx_n_s_startx; static PyObject *__pyx_n_s_starty; static PyObject *__pyx_n_s_test; static PyObject *__pyx_kp_u_unknown_dtype_code_in_numpy_pxd; static PyObject *__pyx_n_s_weights; static PyObject *__pyx_n_s_xp_inout; static PyObject *__pyx_n_s_xw_in; static PyObject *__pyx_n_s_xw_out; static PyObject *__pyx_n_s_yp_inout; static PyObject *__pyx_n_s_yw_in; static PyObject *__pyx_n_s_yw_out; static PyObject *__pyx_n_s_zeros; static PyObject *__pyx_pf_9reproject_19spherical_intersect_8_overlap__reproject_slice_cython(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_startx, int __pyx_v_endx, int __pyx_v_starty, int __pyx_v_endy, int __pyx_v_nx_out, int __pyx_v_ny_out, PyArrayObject *__pyx_v_xp_inout, PyArrayObject *__pyx_v_yp_inout, PyArrayObject *__pyx_v_xw_in, PyArrayObject *__pyx_v_yw_in, PyArrayObject *__pyx_v_xw_out, PyArrayObject *__pyx_v_yw_out, PyArrayObject *__pyx_v_array, PyObject *__pyx_v_shape_out); /* proto */ static PyObject *__pyx_pf_9reproject_19spherical_intersect_8_overlap_2_compute_overlap(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_ilon, PyArrayObject *__pyx_v_ilat, PyArrayObject *__pyx_v_olon, PyArrayObject *__pyx_v_olat); /* proto */ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info); /* proto */ static PyObject *__pyx_int_1; static PyObject *__pyx_tuple_; static PyObject *__pyx_tuple__2; static PyObject *__pyx_tuple__3; static PyObject *__pyx_tuple__4; static PyObject *__pyx_tuple__5; static PyObject *__pyx_tuple__6; static PyObject *__pyx_tuple__7; static PyObject *__pyx_tuple__8; static PyObject *__pyx_tuple__9; static PyObject *__pyx_tuple__10; static PyObject *__pyx_tuple__11; static PyObject *__pyx_tuple__12; static PyObject *__pyx_tuple__13; static PyObject *__pyx_tuple__15; static PyObject *__pyx_codeobj__14; static PyObject *__pyx_codeobj__16; /* "reproject/spherical_intersect/_overlap.pyx":19 * # @cython.wraparound(False) * # @cython.boundscheck(False) * def _reproject_slice_cython(int startx, int endx, int starty, int endy, int nx_out, int ny_out, # <<<<<<<<<<<<<< * np.ndarray[double, ndim=2, mode = "c"] xp_inout, * np.ndarray[double, ndim=2, mode = "c"] yp_inout, */ /* Python wrapper */ static PyObject *__pyx_pw_9reproject_19spherical_intersect_8_overlap_1_reproject_slice_cython(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyMethodDef __pyx_mdef_9reproject_19spherical_intersect_8_overlap_1_reproject_slice_cython = {"_reproject_slice_cython", (PyCFunction)__pyx_pw_9reproject_19spherical_intersect_8_overlap_1_reproject_slice_cython, METH_VARARGS|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_9reproject_19spherical_intersect_8_overlap_1_reproject_slice_cython(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { int __pyx_v_startx; int __pyx_v_endx; int __pyx_v_starty; int __pyx_v_endy; int __pyx_v_nx_out; int __pyx_v_ny_out; PyArrayObject *__pyx_v_xp_inout = 0; PyArrayObject *__pyx_v_yp_inout = 0; PyArrayObject *__pyx_v_xw_in = 0; PyArrayObject *__pyx_v_yw_in = 0; PyArrayObject *__pyx_v_xw_out = 0; PyArrayObject *__pyx_v_yw_out = 0; PyArrayObject *__pyx_v_array = 0; PyObject *__pyx_v_shape_out = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_reproject_slice_cython (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_startx,&__pyx_n_s_endx,&__pyx_n_s_starty,&__pyx_n_s_endy,&__pyx_n_s_nx_out,&__pyx_n_s_ny_out,&__pyx_n_s_xp_inout,&__pyx_n_s_yp_inout,&__pyx_n_s_xw_in,&__pyx_n_s_yw_in,&__pyx_n_s_xw_out,&__pyx_n_s_yw_out,&__pyx_n_s_array,&__pyx_n_s_shape_out,0}; PyObject* values[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13); CYTHON_FALLTHROUGH; case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12); CYTHON_FALLTHROUGH; case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11); CYTHON_FALLTHROUGH; case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10); CYTHON_FALLTHROUGH; case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9); CYTHON_FALLTHROUGH; case 9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8); CYTHON_FALLTHROUGH; case 8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7); CYTHON_FALLTHROUGH; case 7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6); CYTHON_FALLTHROUGH; case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); CYTHON_FALLTHROUGH; case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_startx)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_endx)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("_reproject_slice_cython", 1, 14, 14, 1); __PYX_ERR(0, 19, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_starty)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("_reproject_slice_cython", 1, 14, 14, 2); __PYX_ERR(0, 19, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_endy)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("_reproject_slice_cython", 1, 14, 14, 3); __PYX_ERR(0, 19, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 4: if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_nx_out)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("_reproject_slice_cython", 1, 14, 14, 4); __PYX_ERR(0, 19, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 5: if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_ny_out)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("_reproject_slice_cython", 1, 14, 14, 5); __PYX_ERR(0, 19, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 6: if (likely((values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_xp_inout)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("_reproject_slice_cython", 1, 14, 14, 6); __PYX_ERR(0, 19, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 7: if (likely((values[7] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_yp_inout)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("_reproject_slice_cython", 1, 14, 14, 7); __PYX_ERR(0, 19, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 8: if (likely((values[8] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_xw_in)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("_reproject_slice_cython", 1, 14, 14, 8); __PYX_ERR(0, 19, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 9: if (likely((values[9] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_yw_in)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("_reproject_slice_cython", 1, 14, 14, 9); __PYX_ERR(0, 19, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 10: if (likely((values[10] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_xw_out)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("_reproject_slice_cython", 1, 14, 14, 10); __PYX_ERR(0, 19, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 11: if (likely((values[11] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_yw_out)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("_reproject_slice_cython", 1, 14, 14, 11); __PYX_ERR(0, 19, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 12: if (likely((values[12] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_array)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("_reproject_slice_cython", 1, 14, 14, 12); __PYX_ERR(0, 19, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 13: if (likely((values[13] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_shape_out)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("_reproject_slice_cython", 1, 14, 14, 13); __PYX_ERR(0, 19, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_reproject_slice_cython") < 0)) __PYX_ERR(0, 19, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 14) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[2] = PyTuple_GET_ITEM(__pyx_args, 2); values[3] = PyTuple_GET_ITEM(__pyx_args, 3); values[4] = PyTuple_GET_ITEM(__pyx_args, 4); values[5] = PyTuple_GET_ITEM(__pyx_args, 5); values[6] = PyTuple_GET_ITEM(__pyx_args, 6); values[7] = PyTuple_GET_ITEM(__pyx_args, 7); values[8] = PyTuple_GET_ITEM(__pyx_args, 8); values[9] = PyTuple_GET_ITEM(__pyx_args, 9); values[10] = PyTuple_GET_ITEM(__pyx_args, 10); values[11] = PyTuple_GET_ITEM(__pyx_args, 11); values[12] = PyTuple_GET_ITEM(__pyx_args, 12); values[13] = PyTuple_GET_ITEM(__pyx_args, 13); } __pyx_v_startx = __Pyx_PyInt_As_int(values[0]); if (unlikely((__pyx_v_startx == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 19, __pyx_L3_error) __pyx_v_endx = __Pyx_PyInt_As_int(values[1]); if (unlikely((__pyx_v_endx == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 19, __pyx_L3_error) __pyx_v_starty = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_starty == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 19, __pyx_L3_error) __pyx_v_endy = __Pyx_PyInt_As_int(values[3]); if (unlikely((__pyx_v_endy == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 19, __pyx_L3_error) __pyx_v_nx_out = __Pyx_PyInt_As_int(values[4]); if (unlikely((__pyx_v_nx_out == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 19, __pyx_L3_error) __pyx_v_ny_out = __Pyx_PyInt_As_int(values[5]); if (unlikely((__pyx_v_ny_out == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 19, __pyx_L3_error) __pyx_v_xp_inout = ((PyArrayObject *)values[6]); __pyx_v_yp_inout = ((PyArrayObject *)values[7]); __pyx_v_xw_in = ((PyArrayObject *)values[8]); __pyx_v_yw_in = ((PyArrayObject *)values[9]); __pyx_v_xw_out = ((PyArrayObject *)values[10]); __pyx_v_yw_out = ((PyArrayObject *)values[11]); __pyx_v_array = ((PyArrayObject *)values[12]); __pyx_v_shape_out = values[13]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("_reproject_slice_cython", 1, 14, 14, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 19, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("reproject.spherical_intersect._overlap._reproject_slice_cython", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_xp_inout), __pyx_ptype_5numpy_ndarray, 1, "xp_inout", 0))) __PYX_ERR(0, 20, __pyx_L1_error) if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_yp_inout), __pyx_ptype_5numpy_ndarray, 1, "yp_inout", 0))) __PYX_ERR(0, 21, __pyx_L1_error) if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_xw_in), __pyx_ptype_5numpy_ndarray, 1, "xw_in", 0))) __PYX_ERR(0, 22, __pyx_L1_error) if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_yw_in), __pyx_ptype_5numpy_ndarray, 1, "yw_in", 0))) __PYX_ERR(0, 23, __pyx_L1_error) if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_xw_out), __pyx_ptype_5numpy_ndarray, 1, "xw_out", 0))) __PYX_ERR(0, 24, __pyx_L1_error) if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_yw_out), __pyx_ptype_5numpy_ndarray, 1, "yw_out", 0))) __PYX_ERR(0, 25, __pyx_L1_error) if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_array), __pyx_ptype_5numpy_ndarray, 1, "array", 0))) __PYX_ERR(0, 26, __pyx_L1_error) __pyx_r = __pyx_pf_9reproject_19spherical_intersect_8_overlap__reproject_slice_cython(__pyx_self, __pyx_v_startx, __pyx_v_endx, __pyx_v_starty, __pyx_v_endy, __pyx_v_nx_out, __pyx_v_ny_out, __pyx_v_xp_inout, __pyx_v_yp_inout, __pyx_v_xw_in, __pyx_v_yw_in, __pyx_v_xw_out, __pyx_v_yw_out, __pyx_v_array, __pyx_v_shape_out); /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __pyx_r = NULL; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_9reproject_19spherical_intersect_8_overlap__reproject_slice_cython(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_startx, int __pyx_v_endx, int __pyx_v_starty, int __pyx_v_endy, int __pyx_v_nx_out, int __pyx_v_ny_out, PyArrayObject *__pyx_v_xp_inout, PyArrayObject *__pyx_v_yp_inout, PyArrayObject *__pyx_v_xw_in, PyArrayObject *__pyx_v_yw_in, PyArrayObject *__pyx_v_xw_out, PyArrayObject *__pyx_v_yw_out, PyArrayObject *__pyx_v_array, PyObject *__pyx_v_shape_out) { PyArrayObject *__pyx_v_array_new = 0; PyArrayObject *__pyx_v_weights = 0; PyArrayObject *__pyx_v_overlap = 0; PyArrayObject *__pyx_v_area_ratio = 0; PyArrayObject *__pyx_v_original = 0; int __pyx_v_col_in; int __pyx_v_col_out; int __pyx_v_col_array; int __pyx_v_col_new; __Pyx_LocalBuf_ND __pyx_pybuffernd_area_ratio; __Pyx_Buffer __pyx_pybuffer_area_ratio; __Pyx_LocalBuf_ND __pyx_pybuffernd_array; __Pyx_Buffer __pyx_pybuffer_array; __Pyx_LocalBuf_ND __pyx_pybuffernd_array_new; __Pyx_Buffer __pyx_pybuffer_array_new; __Pyx_LocalBuf_ND __pyx_pybuffernd_original; __Pyx_Buffer __pyx_pybuffer_original; __Pyx_LocalBuf_ND __pyx_pybuffernd_overlap; __Pyx_Buffer __pyx_pybuffer_overlap; __Pyx_LocalBuf_ND __pyx_pybuffernd_weights; __Pyx_Buffer __pyx_pybuffer_weights; __Pyx_LocalBuf_ND __pyx_pybuffernd_xp_inout; __Pyx_Buffer __pyx_pybuffer_xp_inout; __Pyx_LocalBuf_ND __pyx_pybuffernd_xw_in; __Pyx_Buffer __pyx_pybuffer_xw_in; __Pyx_LocalBuf_ND __pyx_pybuffernd_xw_out; __Pyx_Buffer __pyx_pybuffer_xw_out; __Pyx_LocalBuf_ND __pyx_pybuffernd_yp_inout; __Pyx_Buffer __pyx_pybuffer_yp_inout; __Pyx_LocalBuf_ND __pyx_pybuffernd_yw_in; __Pyx_Buffer __pyx_pybuffer_yw_in; __Pyx_LocalBuf_ND __pyx_pybuffernd_yw_out; __Pyx_Buffer __pyx_pybuffer_yw_out; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyArrayObject *__pyx_t_6 = NULL; PyArrayObject *__pyx_t_7 = NULL; PyArrayObject *__pyx_t_8 = NULL; PyArrayObject *__pyx_t_9 = NULL; PyArrayObject *__pyx_t_10 = NULL; Py_ssize_t __pyx_t_11; Py_ssize_t __pyx_t_12; int __pyx_t_13; Py_ssize_t __pyx_t_14; Py_ssize_t __pyx_t_15; Py_ssize_t __pyx_t_16; Py_ssize_t __pyx_t_17; Py_ssize_t __pyx_t_18; Py_ssize_t __pyx_t_19; Py_ssize_t __pyx_t_20; Py_ssize_t __pyx_t_21; Py_ssize_t __pyx_t_22; Py_ssize_t __pyx_t_23; Py_ssize_t __pyx_t_24; Py_ssize_t __pyx_t_25; Py_ssize_t __pyx_t_26; Py_ssize_t __pyx_t_27; Py_ssize_t __pyx_t_28; Py_ssize_t __pyx_t_29; Py_ssize_t __pyx_t_30; Py_ssize_t __pyx_t_31; Py_ssize_t __pyx_t_32; __Pyx_RefNannySetupContext("_reproject_slice_cython", 0); __pyx_pybuffer_array_new.pybuffer.buf = NULL; __pyx_pybuffer_array_new.refcount = 0; __pyx_pybuffernd_array_new.data = NULL; __pyx_pybuffernd_array_new.rcbuffer = &__pyx_pybuffer_array_new; __pyx_pybuffer_weights.pybuffer.buf = NULL; __pyx_pybuffer_weights.refcount = 0; __pyx_pybuffernd_weights.data = NULL; __pyx_pybuffernd_weights.rcbuffer = &__pyx_pybuffer_weights; __pyx_pybuffer_overlap.pybuffer.buf = NULL; __pyx_pybuffer_overlap.refcount = 0; __pyx_pybuffernd_overlap.data = NULL; __pyx_pybuffernd_overlap.rcbuffer = &__pyx_pybuffer_overlap; __pyx_pybuffer_area_ratio.pybuffer.buf = NULL; __pyx_pybuffer_area_ratio.refcount = 0; __pyx_pybuffernd_area_ratio.data = NULL; __pyx_pybuffernd_area_ratio.rcbuffer = &__pyx_pybuffer_area_ratio; __pyx_pybuffer_original.pybuffer.buf = NULL; __pyx_pybuffer_original.refcount = 0; __pyx_pybuffernd_original.data = NULL; __pyx_pybuffernd_original.rcbuffer = &__pyx_pybuffer_original; __pyx_pybuffer_xp_inout.pybuffer.buf = NULL; __pyx_pybuffer_xp_inout.refcount = 0; __pyx_pybuffernd_xp_inout.data = NULL; __pyx_pybuffernd_xp_inout.rcbuffer = &__pyx_pybuffer_xp_inout; __pyx_pybuffer_yp_inout.pybuffer.buf = NULL; __pyx_pybuffer_yp_inout.refcount = 0; __pyx_pybuffernd_yp_inout.data = NULL; __pyx_pybuffernd_yp_inout.rcbuffer = &__pyx_pybuffer_yp_inout; __pyx_pybuffer_xw_in.pybuffer.buf = NULL; __pyx_pybuffer_xw_in.refcount = 0; __pyx_pybuffernd_xw_in.data = NULL; __pyx_pybuffernd_xw_in.rcbuffer = &__pyx_pybuffer_xw_in; __pyx_pybuffer_yw_in.pybuffer.buf = NULL; __pyx_pybuffer_yw_in.refcount = 0; __pyx_pybuffernd_yw_in.data = NULL; __pyx_pybuffernd_yw_in.rcbuffer = &__pyx_pybuffer_yw_in; __pyx_pybuffer_xw_out.pybuffer.buf = NULL; __pyx_pybuffer_xw_out.refcount = 0; __pyx_pybuffernd_xw_out.data = NULL; __pyx_pybuffernd_xw_out.rcbuffer = &__pyx_pybuffer_xw_out; __pyx_pybuffer_yw_out.pybuffer.buf = NULL; __pyx_pybuffer_yw_out.refcount = 0; __pyx_pybuffernd_yw_out.data = NULL; __pyx_pybuffernd_yw_out.rcbuffer = &__pyx_pybuffer_yw_out; __pyx_pybuffer_array.pybuffer.buf = NULL; __pyx_pybuffer_array.refcount = 0; __pyx_pybuffernd_array.data = NULL; __pyx_pybuffernd_array.rcbuffer = &__pyx_pybuffer_array; { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_xp_inout.rcbuffer->pybuffer, (PyObject*)__pyx_v_xp_inout, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 19, __pyx_L1_error) } __pyx_pybuffernd_xp_inout.diminfo[0].strides = __pyx_pybuffernd_xp_inout.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_xp_inout.diminfo[0].shape = __pyx_pybuffernd_xp_inout.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_xp_inout.diminfo[1].strides = __pyx_pybuffernd_xp_inout.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_xp_inout.diminfo[1].shape = __pyx_pybuffernd_xp_inout.rcbuffer->pybuffer.shape[1]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_yp_inout.rcbuffer->pybuffer, (PyObject*)__pyx_v_yp_inout, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 19, __pyx_L1_error) } __pyx_pybuffernd_yp_inout.diminfo[0].strides = __pyx_pybuffernd_yp_inout.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_yp_inout.diminfo[0].shape = __pyx_pybuffernd_yp_inout.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_yp_inout.diminfo[1].strides = __pyx_pybuffernd_yp_inout.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_yp_inout.diminfo[1].shape = __pyx_pybuffernd_yp_inout.rcbuffer->pybuffer.shape[1]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_xw_in.rcbuffer->pybuffer, (PyObject*)__pyx_v_xw_in, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 19, __pyx_L1_error) } __pyx_pybuffernd_xw_in.diminfo[0].strides = __pyx_pybuffernd_xw_in.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_xw_in.diminfo[0].shape = __pyx_pybuffernd_xw_in.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_xw_in.diminfo[1].strides = __pyx_pybuffernd_xw_in.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_xw_in.diminfo[1].shape = __pyx_pybuffernd_xw_in.rcbuffer->pybuffer.shape[1]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_yw_in.rcbuffer->pybuffer, (PyObject*)__pyx_v_yw_in, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 19, __pyx_L1_error) } __pyx_pybuffernd_yw_in.diminfo[0].strides = __pyx_pybuffernd_yw_in.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_yw_in.diminfo[0].shape = __pyx_pybuffernd_yw_in.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_yw_in.diminfo[1].strides = __pyx_pybuffernd_yw_in.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_yw_in.diminfo[1].shape = __pyx_pybuffernd_yw_in.rcbuffer->pybuffer.shape[1]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_xw_out.rcbuffer->pybuffer, (PyObject*)__pyx_v_xw_out, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 19, __pyx_L1_error) } __pyx_pybuffernd_xw_out.diminfo[0].strides = __pyx_pybuffernd_xw_out.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_xw_out.diminfo[0].shape = __pyx_pybuffernd_xw_out.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_xw_out.diminfo[1].strides = __pyx_pybuffernd_xw_out.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_xw_out.diminfo[1].shape = __pyx_pybuffernd_xw_out.rcbuffer->pybuffer.shape[1]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_yw_out.rcbuffer->pybuffer, (PyObject*)__pyx_v_yw_out, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 19, __pyx_L1_error) } __pyx_pybuffernd_yw_out.diminfo[0].strides = __pyx_pybuffernd_yw_out.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_yw_out.diminfo[0].shape = __pyx_pybuffernd_yw_out.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_yw_out.diminfo[1].strides = __pyx_pybuffernd_yw_out.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_yw_out.diminfo[1].shape = __pyx_pybuffernd_yw_out.rcbuffer->pybuffer.shape[1]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_array.rcbuffer->pybuffer, (PyObject*)__pyx_v_array, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 19, __pyx_L1_error) } __pyx_pybuffernd_array.diminfo[0].strides = __pyx_pybuffernd_array.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_array.diminfo[0].shape = __pyx_pybuffernd_array.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_array.diminfo[1].strides = __pyx_pybuffernd_array.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_array.diminfo[1].shape = __pyx_pybuffernd_array.rcbuffer->pybuffer.shape[1]; /* "reproject/spherical_intersect/_overlap.pyx":30 * * # Create the array_new and weights objects, plus the objects needed in the loop. * cdef np.ndarray[double, ndim = 2, mode = "c"] array_new = np.zeros(shape_out, dtype = np.double) # <<<<<<<<<<<<<< * cdef np.ndarray[double, ndim = 2, mode = "c"] weights = np.zeros(shape_out, dtype = np.double) * # Arrays used in loop iterations. */ __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 30, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_zeros); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 30, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 30, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_v_shape_out); __Pyx_GIVEREF(__pyx_v_shape_out); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_shape_out); __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 30, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 30, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_double); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 30, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_5) < 0) __PYX_ERR(0, 30, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 30, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 30, __pyx_L1_error) __pyx_t_6 = ((PyArrayObject *)__pyx_t_5); { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_array_new.rcbuffer->pybuffer, (PyObject*)__pyx_t_6, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) { __pyx_v_array_new = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_array_new.rcbuffer->pybuffer.buf = NULL; __PYX_ERR(0, 30, __pyx_L1_error) } else {__pyx_pybuffernd_array_new.diminfo[0].strides = __pyx_pybuffernd_array_new.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_array_new.diminfo[0].shape = __pyx_pybuffernd_array_new.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_array_new.diminfo[1].strides = __pyx_pybuffernd_array_new.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_array_new.diminfo[1].shape = __pyx_pybuffernd_array_new.rcbuffer->pybuffer.shape[1]; } } __pyx_t_6 = 0; __pyx_v_array_new = ((PyArrayObject *)__pyx_t_5); __pyx_t_5 = 0; /* "reproject/spherical_intersect/_overlap.pyx":31 * # Create the array_new and weights objects, plus the objects needed in the loop. * cdef np.ndarray[double, ndim = 2, mode = "c"] array_new = np.zeros(shape_out, dtype = np.double) * cdef np.ndarray[double, ndim = 2, mode = "c"] weights = np.zeros(shape_out, dtype = np.double) # <<<<<<<<<<<<<< * # Arrays used in loop iterations. * cdef np.ndarray[double, ndim = 1, mode = "c"] overlap = np.zeros((1), dtype = np.double) */ __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 31, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_zeros); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 31, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 31, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_INCREF(__pyx_v_shape_out); __Pyx_GIVEREF(__pyx_v_shape_out); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_shape_out); __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 31, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 31, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_double); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 31, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_4) < 0) __PYX_ERR(0, 31, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 31, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 31, __pyx_L1_error) __pyx_t_7 = ((PyArrayObject *)__pyx_t_4); { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_weights.rcbuffer->pybuffer, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) { __pyx_v_weights = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_weights.rcbuffer->pybuffer.buf = NULL; __PYX_ERR(0, 31, __pyx_L1_error) } else {__pyx_pybuffernd_weights.diminfo[0].strides = __pyx_pybuffernd_weights.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_weights.diminfo[0].shape = __pyx_pybuffernd_weights.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_weights.diminfo[1].strides = __pyx_pybuffernd_weights.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_weights.diminfo[1].shape = __pyx_pybuffernd_weights.rcbuffer->pybuffer.shape[1]; } } __pyx_t_7 = 0; __pyx_v_weights = ((PyArrayObject *)__pyx_t_4); __pyx_t_4 = 0; /* "reproject/spherical_intersect/_overlap.pyx":33 * cdef np.ndarray[double, ndim = 2, mode = "c"] weights = np.zeros(shape_out, dtype = np.double) * # Arrays used in loop iterations. * cdef np.ndarray[double, ndim = 1, mode = "c"] overlap = np.zeros((1), dtype = np.double) # <<<<<<<<<<<<<< * cdef np.ndarray[double, ndim = 1, mode = "c"] area_ratio = np.zeros((1), dtype = np.double) * cdef np.ndarray[double, ndim = 1, mode = "c"] original = np.zeros((1), dtype = np.double) */ __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 33, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_zeros); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 33, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 33, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 33, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_double); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 33, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_3) < 0) __PYX_ERR(0, 33, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple_, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 33, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 33, __pyx_L1_error) __pyx_t_8 = ((PyArrayObject *)__pyx_t_3); { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_overlap.rcbuffer->pybuffer, (PyObject*)__pyx_t_8, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) { __pyx_v_overlap = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_overlap.rcbuffer->pybuffer.buf = NULL; __PYX_ERR(0, 33, __pyx_L1_error) } else {__pyx_pybuffernd_overlap.diminfo[0].strides = __pyx_pybuffernd_overlap.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_overlap.diminfo[0].shape = __pyx_pybuffernd_overlap.rcbuffer->pybuffer.shape[0]; } } __pyx_t_8 = 0; __pyx_v_overlap = ((PyArrayObject *)__pyx_t_3); __pyx_t_3 = 0; /* "reproject/spherical_intersect/_overlap.pyx":34 * # Arrays used in loop iterations. * cdef np.ndarray[double, ndim = 1, mode = "c"] overlap = np.zeros((1), dtype = np.double) * cdef np.ndarray[double, ndim = 1, mode = "c"] area_ratio = np.zeros((1), dtype = np.double) # <<<<<<<<<<<<<< * cdef np.ndarray[double, ndim = 1, mode = "c"] original = np.zeros((1), dtype = np.double) * */ __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 34, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_zeros); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 34, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 34, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 34, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_double); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 34, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_5) < 0) __PYX_ERR(0, 34, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_tuple__2, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 34, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 34, __pyx_L1_error) __pyx_t_9 = ((PyArrayObject *)__pyx_t_5); { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_area_ratio.rcbuffer->pybuffer, (PyObject*)__pyx_t_9, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) { __pyx_v_area_ratio = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_area_ratio.rcbuffer->pybuffer.buf = NULL; __PYX_ERR(0, 34, __pyx_L1_error) } else {__pyx_pybuffernd_area_ratio.diminfo[0].strides = __pyx_pybuffernd_area_ratio.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_area_ratio.diminfo[0].shape = __pyx_pybuffernd_area_ratio.rcbuffer->pybuffer.shape[0]; } } __pyx_t_9 = 0; __pyx_v_area_ratio = ((PyArrayObject *)__pyx_t_5); __pyx_t_5 = 0; /* "reproject/spherical_intersect/_overlap.pyx":35 * cdef np.ndarray[double, ndim = 1, mode = "c"] overlap = np.zeros((1), dtype = np.double) * cdef np.ndarray[double, ndim = 1, mode = "c"] area_ratio = np.zeros((1), dtype = np.double) * cdef np.ndarray[double, ndim = 1, mode = "c"] original = np.zeros((1), dtype = np.double) # <<<<<<<<<<<<<< * * # We need the y size of these 2-dimensional arrays in order to access the elements correctly */ __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 35, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_zeros); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 35, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 35, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 35, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_double); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 35, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_tuple__3, __pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 35, __pyx_L1_error) __pyx_t_10 = ((PyArrayObject *)__pyx_t_1); { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_original.rcbuffer->pybuffer, (PyObject*)__pyx_t_10, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) { __pyx_v_original = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_original.rcbuffer->pybuffer.buf = NULL; __PYX_ERR(0, 35, __pyx_L1_error) } else {__pyx_pybuffernd_original.diminfo[0].strides = __pyx_pybuffernd_original.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_original.diminfo[0].shape = __pyx_pybuffernd_original.rcbuffer->pybuffer.shape[0]; } } __pyx_t_10 = 0; __pyx_v_original = ((PyArrayObject *)__pyx_t_1); __pyx_t_1 = 0; /* "reproject/spherical_intersect/_overlap.pyx":39 * # We need the y size of these 2-dimensional arrays in order to access the elements correctly * # from raw C. * cdef int col_in = xw_in.shape[1] # <<<<<<<<<<<<<< * cdef int col_out = xw_out.shape[1] * cdef int col_array = array.shape[1] */ __pyx_v_col_in = (__pyx_v_xw_in->dimensions[1]); /* "reproject/spherical_intersect/_overlap.pyx":40 * # from raw C. * cdef int col_in = xw_in.shape[1] * cdef int col_out = xw_out.shape[1] # <<<<<<<<<<<<<< * cdef int col_array = array.shape[1] * cdef int col_new = array_new.shape[1] */ __pyx_v_col_out = (__pyx_v_xw_out->dimensions[1]); /* "reproject/spherical_intersect/_overlap.pyx":41 * cdef int col_in = xw_in.shape[1] * cdef int col_out = xw_out.shape[1] * cdef int col_array = array.shape[1] # <<<<<<<<<<<<<< * cdef int col_new = array_new.shape[1] * */ __pyx_v_col_array = (__pyx_v_array->dimensions[1]); /* "reproject/spherical_intersect/_overlap.pyx":42 * cdef int col_out = xw_out.shape[1] * cdef int col_array = array.shape[1] * cdef int col_new = array_new.shape[1] # <<<<<<<<<<<<<< * * # Call the C function now. */ __pyx_v_col_new = (__pyx_v_array_new->dimensions[1]); /* "reproject/spherical_intersect/_overlap.pyx":46 * # Call the C function now. * _reproject_slice_c(startx,endx,starty,endy,nx_out,ny_out, * &xp_inout[0,0],&yp_inout[0,0], # <<<<<<<<<<<<<< * &xw_in[0,0],&yw_in[0,0],&xw_out[0,0],&yw_out[0,0],&array[0,0], * &array_new[0,0],&weights[0,0], */ __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_13 = -1; if (__pyx_t_11 < 0) { __pyx_t_11 += __pyx_pybuffernd_xp_inout.diminfo[0].shape; if (unlikely(__pyx_t_11 < 0)) __pyx_t_13 = 0; } else if (unlikely(__pyx_t_11 >= __pyx_pybuffernd_xp_inout.diminfo[0].shape)) __pyx_t_13 = 0; if (__pyx_t_12 < 0) { __pyx_t_12 += __pyx_pybuffernd_xp_inout.diminfo[1].shape; if (unlikely(__pyx_t_12 < 0)) __pyx_t_13 = 1; } else if (unlikely(__pyx_t_12 >= __pyx_pybuffernd_xp_inout.diminfo[1].shape)) __pyx_t_13 = 1; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 46, __pyx_L1_error) } __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_13 = -1; if (__pyx_t_14 < 0) { __pyx_t_14 += __pyx_pybuffernd_yp_inout.diminfo[0].shape; if (unlikely(__pyx_t_14 < 0)) __pyx_t_13 = 0; } else if (unlikely(__pyx_t_14 >= __pyx_pybuffernd_yp_inout.diminfo[0].shape)) __pyx_t_13 = 0; if (__pyx_t_15 < 0) { __pyx_t_15 += __pyx_pybuffernd_yp_inout.diminfo[1].shape; if (unlikely(__pyx_t_15 < 0)) __pyx_t_13 = 1; } else if (unlikely(__pyx_t_15 >= __pyx_pybuffernd_yp_inout.diminfo[1].shape)) __pyx_t_13 = 1; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 46, __pyx_L1_error) } /* "reproject/spherical_intersect/_overlap.pyx":47 * _reproject_slice_c(startx,endx,starty,endy,nx_out,ny_out, * &xp_inout[0,0],&yp_inout[0,0], * &xw_in[0,0],&yw_in[0,0],&xw_out[0,0],&yw_out[0,0],&array[0,0], # <<<<<<<<<<<<<< * &array_new[0,0],&weights[0,0], * &overlap[0],&area_ratio[0],&original[0],col_in,col_out,col_array,col_new) */ __pyx_t_16 = 0; __pyx_t_17 = 0; __pyx_t_13 = -1; if (__pyx_t_16 < 0) { __pyx_t_16 += __pyx_pybuffernd_xw_in.diminfo[0].shape; if (unlikely(__pyx_t_16 < 0)) __pyx_t_13 = 0; } else if (unlikely(__pyx_t_16 >= __pyx_pybuffernd_xw_in.diminfo[0].shape)) __pyx_t_13 = 0; if (__pyx_t_17 < 0) { __pyx_t_17 += __pyx_pybuffernd_xw_in.diminfo[1].shape; if (unlikely(__pyx_t_17 < 0)) __pyx_t_13 = 1; } else if (unlikely(__pyx_t_17 >= __pyx_pybuffernd_xw_in.diminfo[1].shape)) __pyx_t_13 = 1; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 47, __pyx_L1_error) } __pyx_t_18 = 0; __pyx_t_19 = 0; __pyx_t_13 = -1; if (__pyx_t_18 < 0) { __pyx_t_18 += __pyx_pybuffernd_yw_in.diminfo[0].shape; if (unlikely(__pyx_t_18 < 0)) __pyx_t_13 = 0; } else if (unlikely(__pyx_t_18 >= __pyx_pybuffernd_yw_in.diminfo[0].shape)) __pyx_t_13 = 0; if (__pyx_t_19 < 0) { __pyx_t_19 += __pyx_pybuffernd_yw_in.diminfo[1].shape; if (unlikely(__pyx_t_19 < 0)) __pyx_t_13 = 1; } else if (unlikely(__pyx_t_19 >= __pyx_pybuffernd_yw_in.diminfo[1].shape)) __pyx_t_13 = 1; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 47, __pyx_L1_error) } __pyx_t_20 = 0; __pyx_t_21 = 0; __pyx_t_13 = -1; if (__pyx_t_20 < 0) { __pyx_t_20 += __pyx_pybuffernd_xw_out.diminfo[0].shape; if (unlikely(__pyx_t_20 < 0)) __pyx_t_13 = 0; } else if (unlikely(__pyx_t_20 >= __pyx_pybuffernd_xw_out.diminfo[0].shape)) __pyx_t_13 = 0; if (__pyx_t_21 < 0) { __pyx_t_21 += __pyx_pybuffernd_xw_out.diminfo[1].shape; if (unlikely(__pyx_t_21 < 0)) __pyx_t_13 = 1; } else if (unlikely(__pyx_t_21 >= __pyx_pybuffernd_xw_out.diminfo[1].shape)) __pyx_t_13 = 1; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 47, __pyx_L1_error) } __pyx_t_22 = 0; __pyx_t_23 = 0; __pyx_t_13 = -1; if (__pyx_t_22 < 0) { __pyx_t_22 += __pyx_pybuffernd_yw_out.diminfo[0].shape; if (unlikely(__pyx_t_22 < 0)) __pyx_t_13 = 0; } else if (unlikely(__pyx_t_22 >= __pyx_pybuffernd_yw_out.diminfo[0].shape)) __pyx_t_13 = 0; if (__pyx_t_23 < 0) { __pyx_t_23 += __pyx_pybuffernd_yw_out.diminfo[1].shape; if (unlikely(__pyx_t_23 < 0)) __pyx_t_13 = 1; } else if (unlikely(__pyx_t_23 >= __pyx_pybuffernd_yw_out.diminfo[1].shape)) __pyx_t_13 = 1; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 47, __pyx_L1_error) } __pyx_t_24 = 0; __pyx_t_25 = 0; __pyx_t_13 = -1; if (__pyx_t_24 < 0) { __pyx_t_24 += __pyx_pybuffernd_array.diminfo[0].shape; if (unlikely(__pyx_t_24 < 0)) __pyx_t_13 = 0; } else if (unlikely(__pyx_t_24 >= __pyx_pybuffernd_array.diminfo[0].shape)) __pyx_t_13 = 0; if (__pyx_t_25 < 0) { __pyx_t_25 += __pyx_pybuffernd_array.diminfo[1].shape; if (unlikely(__pyx_t_25 < 0)) __pyx_t_13 = 1; } else if (unlikely(__pyx_t_25 >= __pyx_pybuffernd_array.diminfo[1].shape)) __pyx_t_13 = 1; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 47, __pyx_L1_error) } /* "reproject/spherical_intersect/_overlap.pyx":48 * &xp_inout[0,0],&yp_inout[0,0], * &xw_in[0,0],&yw_in[0,0],&xw_out[0,0],&yw_out[0,0],&array[0,0], * &array_new[0,0],&weights[0,0], # <<<<<<<<<<<<<< * &overlap[0],&area_ratio[0],&original[0],col_in,col_out,col_array,col_new) * */ __pyx_t_26 = 0; __pyx_t_27 = 0; __pyx_t_13 = -1; if (__pyx_t_26 < 0) { __pyx_t_26 += __pyx_pybuffernd_array_new.diminfo[0].shape; if (unlikely(__pyx_t_26 < 0)) __pyx_t_13 = 0; } else if (unlikely(__pyx_t_26 >= __pyx_pybuffernd_array_new.diminfo[0].shape)) __pyx_t_13 = 0; if (__pyx_t_27 < 0) { __pyx_t_27 += __pyx_pybuffernd_array_new.diminfo[1].shape; if (unlikely(__pyx_t_27 < 0)) __pyx_t_13 = 1; } else if (unlikely(__pyx_t_27 >= __pyx_pybuffernd_array_new.diminfo[1].shape)) __pyx_t_13 = 1; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 48, __pyx_L1_error) } __pyx_t_28 = 0; __pyx_t_29 = 0; __pyx_t_13 = -1; if (__pyx_t_28 < 0) { __pyx_t_28 += __pyx_pybuffernd_weights.diminfo[0].shape; if (unlikely(__pyx_t_28 < 0)) __pyx_t_13 = 0; } else if (unlikely(__pyx_t_28 >= __pyx_pybuffernd_weights.diminfo[0].shape)) __pyx_t_13 = 0; if (__pyx_t_29 < 0) { __pyx_t_29 += __pyx_pybuffernd_weights.diminfo[1].shape; if (unlikely(__pyx_t_29 < 0)) __pyx_t_13 = 1; } else if (unlikely(__pyx_t_29 >= __pyx_pybuffernd_weights.diminfo[1].shape)) __pyx_t_13 = 1; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 48, __pyx_L1_error) } /* "reproject/spherical_intersect/_overlap.pyx":49 * &xw_in[0,0],&yw_in[0,0],&xw_out[0,0],&yw_out[0,0],&array[0,0], * &array_new[0,0],&weights[0,0], * &overlap[0],&area_ratio[0],&original[0],col_in,col_out,col_array,col_new) # <<<<<<<<<<<<<< * * return array_new,weights */ __pyx_t_30 = 0; __pyx_t_13 = -1; if (__pyx_t_30 < 0) { __pyx_t_30 += __pyx_pybuffernd_overlap.diminfo[0].shape; if (unlikely(__pyx_t_30 < 0)) __pyx_t_13 = 0; } else if (unlikely(__pyx_t_30 >= __pyx_pybuffernd_overlap.diminfo[0].shape)) __pyx_t_13 = 0; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 49, __pyx_L1_error) } __pyx_t_31 = 0; __pyx_t_13 = -1; if (__pyx_t_31 < 0) { __pyx_t_31 += __pyx_pybuffernd_area_ratio.diminfo[0].shape; if (unlikely(__pyx_t_31 < 0)) __pyx_t_13 = 0; } else if (unlikely(__pyx_t_31 >= __pyx_pybuffernd_area_ratio.diminfo[0].shape)) __pyx_t_13 = 0; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 49, __pyx_L1_error) } __pyx_t_32 = 0; __pyx_t_13 = -1; if (__pyx_t_32 < 0) { __pyx_t_32 += __pyx_pybuffernd_original.diminfo[0].shape; if (unlikely(__pyx_t_32 < 0)) __pyx_t_13 = 0; } else if (unlikely(__pyx_t_32 >= __pyx_pybuffernd_original.diminfo[0].shape)) __pyx_t_13 = 0; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 49, __pyx_L1_error) } /* "reproject/spherical_intersect/_overlap.pyx":45 * * # Call the C function now. * _reproject_slice_c(startx,endx,starty,endy,nx_out,ny_out, # <<<<<<<<<<<<<< * &xp_inout[0,0],&yp_inout[0,0], * &xw_in[0,0],&yw_in[0,0],&xw_out[0,0],&yw_out[0,0],&array[0,0], */ _reproject_slice_c(__pyx_v_startx, __pyx_v_endx, __pyx_v_starty, __pyx_v_endy, __pyx_v_nx_out, __pyx_v_ny_out, (&(*__Pyx_BufPtrCContig2d(double *, __pyx_pybuffernd_xp_inout.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_xp_inout.diminfo[0].strides, __pyx_t_12, __pyx_pybuffernd_xp_inout.diminfo[1].strides))), (&(*__Pyx_BufPtrCContig2d(double *, __pyx_pybuffernd_yp_inout.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_yp_inout.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_yp_inout.diminfo[1].strides))), (&(*__Pyx_BufPtrCContig2d(double *, __pyx_pybuffernd_xw_in.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_xw_in.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_xw_in.diminfo[1].strides))), (&(*__Pyx_BufPtrCContig2d(double *, __pyx_pybuffernd_yw_in.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_yw_in.diminfo[0].strides, __pyx_t_19, __pyx_pybuffernd_yw_in.diminfo[1].strides))), (&(*__Pyx_BufPtrCContig2d(double *, __pyx_pybuffernd_xw_out.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_xw_out.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_xw_out.diminfo[1].strides))), (&(*__Pyx_BufPtrCContig2d(double *, __pyx_pybuffernd_yw_out.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_yw_out.diminfo[0].strides, __pyx_t_23, __pyx_pybuffernd_yw_out.diminfo[1].strides))), (&(*__Pyx_BufPtrCContig2d(double *, __pyx_pybuffernd_array.rcbuffer->pybuffer.buf, __pyx_t_24, __pyx_pybuffernd_array.diminfo[0].strides, __pyx_t_25, __pyx_pybuffernd_array.diminfo[1].strides))), (&(*__Pyx_BufPtrCContig2d(double *, __pyx_pybuffernd_array_new.rcbuffer->pybuffer.buf, __pyx_t_26, __pyx_pybuffernd_array_new.diminfo[0].strides, __pyx_t_27, __pyx_pybuffernd_array_new.diminfo[1].strides))), (&(*__Pyx_BufPtrCContig2d(double *, __pyx_pybuffernd_weights.rcbuffer->pybuffer.buf, __pyx_t_28, __pyx_pybuffernd_weights.diminfo[0].strides, __pyx_t_29, __pyx_pybuffernd_weights.diminfo[1].strides))), (&(*__Pyx_BufPtrCContig1d(double *, __pyx_pybuffernd_overlap.rcbuffer->pybuffer.buf, __pyx_t_30, __pyx_pybuffernd_overlap.diminfo[0].strides))), (&(*__Pyx_BufPtrCContig1d(double *, __pyx_pybuffernd_area_ratio.rcbuffer->pybuffer.buf, __pyx_t_31, __pyx_pybuffernd_area_ratio.diminfo[0].strides))), (&(*__Pyx_BufPtrCContig1d(double *, __pyx_pybuffernd_original.rcbuffer->pybuffer.buf, __pyx_t_32, __pyx_pybuffernd_original.diminfo[0].strides))), __pyx_v_col_in, __pyx_v_col_out, __pyx_v_col_array, __pyx_v_col_new); /* "reproject/spherical_intersect/_overlap.pyx":51 * &overlap[0],&area_ratio[0],&original[0],col_in,col_out,col_array,col_new) * * return array_new,weights # <<<<<<<<<<<<<< * * # @cython.wraparound(False) */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 51, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(((PyObject *)__pyx_v_array_new)); __Pyx_GIVEREF(((PyObject *)__pyx_v_array_new)); PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_array_new)); __Pyx_INCREF(((PyObject *)__pyx_v_weights)); __Pyx_GIVEREF(((PyObject *)__pyx_v_weights)); PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_v_weights)); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* "reproject/spherical_intersect/_overlap.pyx":19 * # @cython.wraparound(False) * # @cython.boundscheck(False) * def _reproject_slice_cython(int startx, int endx, int starty, int endy, int nx_out, int ny_out, # <<<<<<<<<<<<<< * np.ndarray[double, ndim=2, mode = "c"] xp_inout, * np.ndarray[double, ndim=2, mode = "c"] yp_inout, */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_area_ratio.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_array.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_array_new.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_original.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_overlap.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_weights.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_xp_inout.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_xw_in.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_xw_out.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_yp_inout.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_yw_in.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_yw_out.rcbuffer->pybuffer); __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} __Pyx_AddTraceback("reproject.spherical_intersect._overlap._reproject_slice_cython", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; goto __pyx_L2; __pyx_L0:; __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_area_ratio.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_array.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_array_new.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_original.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_overlap.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_weights.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_xp_inout.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_xw_in.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_xw_out.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_yp_inout.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_yw_in.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_yw_out.rcbuffer->pybuffer); __pyx_L2:; __Pyx_XDECREF((PyObject *)__pyx_v_array_new); __Pyx_XDECREF((PyObject *)__pyx_v_weights); __Pyx_XDECREF((PyObject *)__pyx_v_overlap); __Pyx_XDECREF((PyObject *)__pyx_v_area_ratio); __Pyx_XDECREF((PyObject *)__pyx_v_original); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "reproject/spherical_intersect/_overlap.pyx":55 * # @cython.wraparound(False) * # @cython.boundscheck(False) * def _compute_overlap(np.ndarray[double, ndim=2] ilon, # <<<<<<<<<<<<<< * np.ndarray[double, ndim=2] ilat, * np.ndarray[double, ndim=2] olon, */ /* Python wrapper */ static PyObject *__pyx_pw_9reproject_19spherical_intersect_8_overlap_3_compute_overlap(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyMethodDef __pyx_mdef_9reproject_19spherical_intersect_8_overlap_3_compute_overlap = {"_compute_overlap", (PyCFunction)__pyx_pw_9reproject_19spherical_intersect_8_overlap_3_compute_overlap, METH_VARARGS|METH_KEYWORDS, 0}; static PyObject *__pyx_pw_9reproject_19spherical_intersect_8_overlap_3_compute_overlap(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyArrayObject *__pyx_v_ilon = 0; PyArrayObject *__pyx_v_ilat = 0; PyArrayObject *__pyx_v_olon = 0; PyArrayObject *__pyx_v_olat = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("_compute_overlap (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_ilon,&__pyx_n_s_ilat,&__pyx_n_s_olon,&__pyx_n_s_olat,0}; PyObject* values[4] = {0,0,0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_ilon)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_ilat)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("_compute_overlap", 1, 4, 4, 1); __PYX_ERR(0, 55, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_olon)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("_compute_overlap", 1, 4, 4, 2); __PYX_ERR(0, 55, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_olat)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("_compute_overlap", 1, 4, 4, 3); __PYX_ERR(0, 55, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_compute_overlap") < 0)) __PYX_ERR(0, 55, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 4) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[2] = PyTuple_GET_ITEM(__pyx_args, 2); values[3] = PyTuple_GET_ITEM(__pyx_args, 3); } __pyx_v_ilon = ((PyArrayObject *)values[0]); __pyx_v_ilat = ((PyArrayObject *)values[1]); __pyx_v_olon = ((PyArrayObject *)values[2]); __pyx_v_olat = ((PyArrayObject *)values[3]); } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("_compute_overlap", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 55, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("reproject.spherical_intersect._overlap._compute_overlap", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_ilon), __pyx_ptype_5numpy_ndarray, 1, "ilon", 0))) __PYX_ERR(0, 55, __pyx_L1_error) if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_ilat), __pyx_ptype_5numpy_ndarray, 1, "ilat", 0))) __PYX_ERR(0, 56, __pyx_L1_error) if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_olon), __pyx_ptype_5numpy_ndarray, 1, "olon", 0))) __PYX_ERR(0, 57, __pyx_L1_error) if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_olat), __pyx_ptype_5numpy_ndarray, 1, "olat", 0))) __PYX_ERR(0, 58, __pyx_L1_error) __pyx_r = __pyx_pf_9reproject_19spherical_intersect_8_overlap_2_compute_overlap(__pyx_self, __pyx_v_ilon, __pyx_v_ilat, __pyx_v_olon, __pyx_v_olat); /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __pyx_r = NULL; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_9reproject_19spherical_intersect_8_overlap_2_compute_overlap(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_ilon, PyArrayObject *__pyx_v_ilat, PyArrayObject *__pyx_v_olon, PyArrayObject *__pyx_v_olat) { int __pyx_v_i; int __pyx_v_n; PyArrayObject *__pyx_v_overlap = 0; PyArrayObject *__pyx_v_area_ratio = 0; __Pyx_LocalBuf_ND __pyx_pybuffernd_area_ratio; __Pyx_Buffer __pyx_pybuffer_area_ratio; __Pyx_LocalBuf_ND __pyx_pybuffernd_ilat; __Pyx_Buffer __pyx_pybuffer_ilat; __Pyx_LocalBuf_ND __pyx_pybuffernd_ilon; __Pyx_Buffer __pyx_pybuffer_ilon; __Pyx_LocalBuf_ND __pyx_pybuffernd_olat; __Pyx_Buffer __pyx_pybuffer_olat; __Pyx_LocalBuf_ND __pyx_pybuffernd_olon; __Pyx_Buffer __pyx_pybuffer_olon; __Pyx_LocalBuf_ND __pyx_pybuffernd_overlap; __Pyx_Buffer __pyx_pybuffer_overlap; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyArrayObject *__pyx_t_6 = NULL; PyArrayObject *__pyx_t_7 = NULL; int __pyx_t_8; int __pyx_t_9; Py_ssize_t __pyx_t_10; Py_ssize_t __pyx_t_11; int __pyx_t_12; Py_ssize_t __pyx_t_13; Py_ssize_t __pyx_t_14; Py_ssize_t __pyx_t_15; Py_ssize_t __pyx_t_16; Py_ssize_t __pyx_t_17; Py_ssize_t __pyx_t_18; Py_ssize_t __pyx_t_19; Py_ssize_t __pyx_t_20; __Pyx_RefNannySetupContext("_compute_overlap", 0); __pyx_pybuffer_overlap.pybuffer.buf = NULL; __pyx_pybuffer_overlap.refcount = 0; __pyx_pybuffernd_overlap.data = NULL; __pyx_pybuffernd_overlap.rcbuffer = &__pyx_pybuffer_overlap; __pyx_pybuffer_area_ratio.pybuffer.buf = NULL; __pyx_pybuffer_area_ratio.refcount = 0; __pyx_pybuffernd_area_ratio.data = NULL; __pyx_pybuffernd_area_ratio.rcbuffer = &__pyx_pybuffer_area_ratio; __pyx_pybuffer_ilon.pybuffer.buf = NULL; __pyx_pybuffer_ilon.refcount = 0; __pyx_pybuffernd_ilon.data = NULL; __pyx_pybuffernd_ilon.rcbuffer = &__pyx_pybuffer_ilon; __pyx_pybuffer_ilat.pybuffer.buf = NULL; __pyx_pybuffer_ilat.refcount = 0; __pyx_pybuffernd_ilat.data = NULL; __pyx_pybuffernd_ilat.rcbuffer = &__pyx_pybuffer_ilat; __pyx_pybuffer_olon.pybuffer.buf = NULL; __pyx_pybuffer_olon.refcount = 0; __pyx_pybuffernd_olon.data = NULL; __pyx_pybuffernd_olon.rcbuffer = &__pyx_pybuffer_olon; __pyx_pybuffer_olat.pybuffer.buf = NULL; __pyx_pybuffer_olat.refcount = 0; __pyx_pybuffernd_olat.data = NULL; __pyx_pybuffernd_olat.rcbuffer = &__pyx_pybuffer_olat; { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_ilon.rcbuffer->pybuffer, (PyObject*)__pyx_v_ilon, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 55, __pyx_L1_error) } __pyx_pybuffernd_ilon.diminfo[0].strides = __pyx_pybuffernd_ilon.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_ilon.diminfo[0].shape = __pyx_pybuffernd_ilon.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_ilon.diminfo[1].strides = __pyx_pybuffernd_ilon.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_ilon.diminfo[1].shape = __pyx_pybuffernd_ilon.rcbuffer->pybuffer.shape[1]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_ilat.rcbuffer->pybuffer, (PyObject*)__pyx_v_ilat, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 55, __pyx_L1_error) } __pyx_pybuffernd_ilat.diminfo[0].strides = __pyx_pybuffernd_ilat.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_ilat.diminfo[0].shape = __pyx_pybuffernd_ilat.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_ilat.diminfo[1].strides = __pyx_pybuffernd_ilat.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_ilat.diminfo[1].shape = __pyx_pybuffernd_ilat.rcbuffer->pybuffer.shape[1]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_olon.rcbuffer->pybuffer, (PyObject*)__pyx_v_olon, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 55, __pyx_L1_error) } __pyx_pybuffernd_olon.diminfo[0].strides = __pyx_pybuffernd_olon.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_olon.diminfo[0].shape = __pyx_pybuffernd_olon.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_olon.diminfo[1].strides = __pyx_pybuffernd_olon.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_olon.diminfo[1].shape = __pyx_pybuffernd_olon.rcbuffer->pybuffer.shape[1]; { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_olat.rcbuffer->pybuffer, (PyObject*)__pyx_v_olat, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) __PYX_ERR(0, 55, __pyx_L1_error) } __pyx_pybuffernd_olat.diminfo[0].strides = __pyx_pybuffernd_olat.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_olat.diminfo[0].shape = __pyx_pybuffernd_olat.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_olat.diminfo[1].strides = __pyx_pybuffernd_olat.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_olat.diminfo[1].shape = __pyx_pybuffernd_olat.rcbuffer->pybuffer.shape[1]; /* "reproject/spherical_intersect/_overlap.pyx":60 * np.ndarray[double, ndim=2] olat): * cdef int i * cdef int n = ilon.shape[0] # <<<<<<<<<<<<<< * * cdef np.ndarray[double, ndim = 1] overlap = np.empty(n, dtype=np.double) */ __pyx_v_n = (__pyx_v_ilon->dimensions[0]); /* "reproject/spherical_intersect/_overlap.pyx":62 * cdef int n = ilon.shape[0] * * cdef np.ndarray[double, ndim = 1] overlap = np.empty(n, dtype=np.double) # <<<<<<<<<<<<<< * cdef np.ndarray[double, ndim = 1] area_ratio = np.empty(n, dtype=np.double) * */ __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 62, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 62, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 62, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 62, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 62, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 62, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_double); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 62, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_5) < 0) __PYX_ERR(0, 62, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 62, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 62, __pyx_L1_error) __pyx_t_6 = ((PyArrayObject *)__pyx_t_5); { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_overlap.rcbuffer->pybuffer, (PyObject*)__pyx_t_6, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 0, __pyx_stack) == -1)) { __pyx_v_overlap = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_overlap.rcbuffer->pybuffer.buf = NULL; __PYX_ERR(0, 62, __pyx_L1_error) } else {__pyx_pybuffernd_overlap.diminfo[0].strides = __pyx_pybuffernd_overlap.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_overlap.diminfo[0].shape = __pyx_pybuffernd_overlap.rcbuffer->pybuffer.shape[0]; } } __pyx_t_6 = 0; __pyx_v_overlap = ((PyArrayObject *)__pyx_t_5); __pyx_t_5 = 0; /* "reproject/spherical_intersect/_overlap.pyx":63 * * cdef np.ndarray[double, ndim = 1] overlap = np.empty(n, dtype=np.double) * cdef np.ndarray[double, ndim = 1] area_ratio = np.empty(n, dtype=np.double) # <<<<<<<<<<<<<< * * for i in range(n): */ __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 63, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_empty); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 63, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 63, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 63, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 63, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 63, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_double); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 63, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_dtype, __pyx_t_4) < 0) __PYX_ERR(0, 63, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, __pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 63, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (!(likely(((__pyx_t_4) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_4, __pyx_ptype_5numpy_ndarray))))) __PYX_ERR(0, 63, __pyx_L1_error) __pyx_t_7 = ((PyArrayObject *)__pyx_t_4); { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_area_ratio.rcbuffer->pybuffer, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_double, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) { __pyx_v_area_ratio = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_area_ratio.rcbuffer->pybuffer.buf = NULL; __PYX_ERR(0, 63, __pyx_L1_error) } else {__pyx_pybuffernd_area_ratio.diminfo[0].strides = __pyx_pybuffernd_area_ratio.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_area_ratio.diminfo[0].shape = __pyx_pybuffernd_area_ratio.rcbuffer->pybuffer.shape[0]; } } __pyx_t_7 = 0; __pyx_v_area_ratio = ((PyArrayObject *)__pyx_t_4); __pyx_t_4 = 0; /* "reproject/spherical_intersect/_overlap.pyx":65 * cdef np.ndarray[double, ndim = 1] area_ratio = np.empty(n, dtype=np.double) * * for i in range(n): # <<<<<<<<<<<<<< * overlap[i] = computeOverlap(& ilon[i, 0], & ilat[i, 0], & olon[i, 0], & olat[i, 0], * 0, 1, & area_ratio[i]) */ __pyx_t_8 = __pyx_v_n; for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) { __pyx_v_i = __pyx_t_9; /* "reproject/spherical_intersect/_overlap.pyx":66 * * for i in range(n): * overlap[i] = computeOverlap(& ilon[i, 0], & ilat[i, 0], & olon[i, 0], & olat[i, 0], # <<<<<<<<<<<<<< * 0, 1, & area_ratio[i]) * */ __pyx_t_10 = __pyx_v_i; __pyx_t_11 = 0; __pyx_t_12 = -1; if (__pyx_t_10 < 0) { __pyx_t_10 += __pyx_pybuffernd_ilon.diminfo[0].shape; if (unlikely(__pyx_t_10 < 0)) __pyx_t_12 = 0; } else if (unlikely(__pyx_t_10 >= __pyx_pybuffernd_ilon.diminfo[0].shape)) __pyx_t_12 = 0; if (__pyx_t_11 < 0) { __pyx_t_11 += __pyx_pybuffernd_ilon.diminfo[1].shape; if (unlikely(__pyx_t_11 < 0)) __pyx_t_12 = 1; } else if (unlikely(__pyx_t_11 >= __pyx_pybuffernd_ilon.diminfo[1].shape)) __pyx_t_12 = 1; if (unlikely(__pyx_t_12 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_12); __PYX_ERR(0, 66, __pyx_L1_error) } __pyx_t_13 = __pyx_v_i; __pyx_t_14 = 0; __pyx_t_12 = -1; if (__pyx_t_13 < 0) { __pyx_t_13 += __pyx_pybuffernd_ilat.diminfo[0].shape; if (unlikely(__pyx_t_13 < 0)) __pyx_t_12 = 0; } else if (unlikely(__pyx_t_13 >= __pyx_pybuffernd_ilat.diminfo[0].shape)) __pyx_t_12 = 0; if (__pyx_t_14 < 0) { __pyx_t_14 += __pyx_pybuffernd_ilat.diminfo[1].shape; if (unlikely(__pyx_t_14 < 0)) __pyx_t_12 = 1; } else if (unlikely(__pyx_t_14 >= __pyx_pybuffernd_ilat.diminfo[1].shape)) __pyx_t_12 = 1; if (unlikely(__pyx_t_12 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_12); __PYX_ERR(0, 66, __pyx_L1_error) } __pyx_t_15 = __pyx_v_i; __pyx_t_16 = 0; __pyx_t_12 = -1; if (__pyx_t_15 < 0) { __pyx_t_15 += __pyx_pybuffernd_olon.diminfo[0].shape; if (unlikely(__pyx_t_15 < 0)) __pyx_t_12 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_pybuffernd_olon.diminfo[0].shape)) __pyx_t_12 = 0; if (__pyx_t_16 < 0) { __pyx_t_16 += __pyx_pybuffernd_olon.diminfo[1].shape; if (unlikely(__pyx_t_16 < 0)) __pyx_t_12 = 1; } else if (unlikely(__pyx_t_16 >= __pyx_pybuffernd_olon.diminfo[1].shape)) __pyx_t_12 = 1; if (unlikely(__pyx_t_12 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_12); __PYX_ERR(0, 66, __pyx_L1_error) } __pyx_t_17 = __pyx_v_i; __pyx_t_18 = 0; __pyx_t_12 = -1; if (__pyx_t_17 < 0) { __pyx_t_17 += __pyx_pybuffernd_olat.diminfo[0].shape; if (unlikely(__pyx_t_17 < 0)) __pyx_t_12 = 0; } else if (unlikely(__pyx_t_17 >= __pyx_pybuffernd_olat.diminfo[0].shape)) __pyx_t_12 = 0; if (__pyx_t_18 < 0) { __pyx_t_18 += __pyx_pybuffernd_olat.diminfo[1].shape; if (unlikely(__pyx_t_18 < 0)) __pyx_t_12 = 1; } else if (unlikely(__pyx_t_18 >= __pyx_pybuffernd_olat.diminfo[1].shape)) __pyx_t_12 = 1; if (unlikely(__pyx_t_12 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_12); __PYX_ERR(0, 66, __pyx_L1_error) } /* "reproject/spherical_intersect/_overlap.pyx":67 * for i in range(n): * overlap[i] = computeOverlap(& ilon[i, 0], & ilat[i, 0], & olon[i, 0], & olat[i, 0], * 0, 1, & area_ratio[i]) # <<<<<<<<<<<<<< * * return overlap, area_ratio */ __pyx_t_19 = __pyx_v_i; __pyx_t_12 = -1; if (__pyx_t_19 < 0) { __pyx_t_19 += __pyx_pybuffernd_area_ratio.diminfo[0].shape; if (unlikely(__pyx_t_19 < 0)) __pyx_t_12 = 0; } else if (unlikely(__pyx_t_19 >= __pyx_pybuffernd_area_ratio.diminfo[0].shape)) __pyx_t_12 = 0; if (unlikely(__pyx_t_12 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_12); __PYX_ERR(0, 67, __pyx_L1_error) } /* "reproject/spherical_intersect/_overlap.pyx":66 * * for i in range(n): * overlap[i] = computeOverlap(& ilon[i, 0], & ilat[i, 0], & olon[i, 0], & olat[i, 0], # <<<<<<<<<<<<<< * 0, 1, & area_ratio[i]) * */ __pyx_t_20 = __pyx_v_i; __pyx_t_12 = -1; if (__pyx_t_20 < 0) { __pyx_t_20 += __pyx_pybuffernd_overlap.diminfo[0].shape; if (unlikely(__pyx_t_20 < 0)) __pyx_t_12 = 0; } else if (unlikely(__pyx_t_20 >= __pyx_pybuffernd_overlap.diminfo[0].shape)) __pyx_t_12 = 0; if (unlikely(__pyx_t_12 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_12); __PYX_ERR(0, 66, __pyx_L1_error) } *__Pyx_BufPtrStrided1d(double *, __pyx_pybuffernd_overlap.rcbuffer->pybuffer.buf, __pyx_t_20, __pyx_pybuffernd_overlap.diminfo[0].strides) = computeOverlap((&(*__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_ilon.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_ilon.diminfo[0].strides, __pyx_t_11, __pyx_pybuffernd_ilon.diminfo[1].strides))), (&(*__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_ilat.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_ilat.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_ilat.diminfo[1].strides))), (&(*__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_olon.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_olon.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_olon.diminfo[1].strides))), (&(*__Pyx_BufPtrStrided2d(double *, __pyx_pybuffernd_olat.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_olat.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_olat.diminfo[1].strides))), 0, 1.0, (&(*__Pyx_BufPtrStrided1d(double *, __pyx_pybuffernd_area_ratio.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_area_ratio.diminfo[0].strides)))); } /* "reproject/spherical_intersect/_overlap.pyx":69 * 0, 1, & area_ratio[i]) * * return overlap, area_ratio # <<<<<<<<<<<<<< */ __Pyx_XDECREF(__pyx_r); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 69, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_INCREF(((PyObject *)__pyx_v_overlap)); __Pyx_GIVEREF(((PyObject *)__pyx_v_overlap)); PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_overlap)); __Pyx_INCREF(((PyObject *)__pyx_v_area_ratio)); __Pyx_GIVEREF(((PyObject *)__pyx_v_area_ratio)); PyTuple_SET_ITEM(__pyx_t_4, 1, ((PyObject *)__pyx_v_area_ratio)); __pyx_r = __pyx_t_4; __pyx_t_4 = 0; goto __pyx_L0; /* "reproject/spherical_intersect/_overlap.pyx":55 * # @cython.wraparound(False) * # @cython.boundscheck(False) * def _compute_overlap(np.ndarray[double, ndim=2] ilon, # <<<<<<<<<<<<<< * np.ndarray[double, ndim=2] ilat, * np.ndarray[double, ndim=2] olon, */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_area_ratio.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_ilat.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_ilon.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_olat.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_olon.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_overlap.rcbuffer->pybuffer); __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} __Pyx_AddTraceback("reproject.spherical_intersect._overlap._compute_overlap", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; goto __pyx_L2; __pyx_L0:; __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_area_ratio.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_ilat.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_ilon.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_olat.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_olon.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_overlap.rcbuffer->pybuffer); __pyx_L2:; __Pyx_XDECREF((PyObject *)__pyx_v_overlap); __Pyx_XDECREF((PyObject *)__pyx_v_area_ratio); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":197 * # experimental exception made for __getbuffer__ and __releasebuffer__ * # -- the details of this may change. * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< * # This implementation of getbuffer is geared towards Cython * # requirements, and does not yet fullfill the PEP. */ /* Python wrapper */ static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); __pyx_r = __pyx_pf_5numpy_7ndarray___getbuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { int __pyx_v_copy_shape; int __pyx_v_i; int __pyx_v_ndim; int __pyx_v_endian_detector; int __pyx_v_little_endian; int __pyx_v_t; char *__pyx_v_f; PyArray_Descr *__pyx_v_descr = 0; int __pyx_v_offset; int __pyx_v_hasfields; int __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; int __pyx_t_4; int __pyx_t_5; PyObject *__pyx_t_6 = NULL; char *__pyx_t_7; __Pyx_RefNannySetupContext("__getbuffer__", 0); if (__pyx_v_info != NULL) { __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); __Pyx_GIVEREF(__pyx_v_info->obj); } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":203 * # of flags * * if info == NULL: return # <<<<<<<<<<<<<< * * cdef int copy_shape, i, ndim */ __pyx_t_1 = ((__pyx_v_info == NULL) != 0); if (__pyx_t_1) { __pyx_r = 0; goto __pyx_L0; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":206 * * cdef int copy_shape, i, ndim * cdef int endian_detector = 1 # <<<<<<<<<<<<<< * cdef bint little_endian = ((&endian_detector)[0] != 0) * */ __pyx_v_endian_detector = 1; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":207 * cdef int copy_shape, i, ndim * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< * * ndim = PyArray_NDIM(self) */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":209 * cdef bint little_endian = ((&endian_detector)[0] != 0) * * ndim = PyArray_NDIM(self) # <<<<<<<<<<<<<< * * if sizeof(npy_intp) != sizeof(Py_ssize_t): */ __pyx_v_ndim = PyArray_NDIM(__pyx_v_self); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":211 * ndim = PyArray_NDIM(self) * * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< * copy_shape = 1 * else: */ __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); if (__pyx_t_1) { /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":212 * * if sizeof(npy_intp) != sizeof(Py_ssize_t): * copy_shape = 1 # <<<<<<<<<<<<<< * else: * copy_shape = 0 */ __pyx_v_copy_shape = 1; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":211 * ndim = PyArray_NDIM(self) * * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< * copy_shape = 1 * else: */ goto __pyx_L4; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":214 * copy_shape = 1 * else: * copy_shape = 0 # <<<<<<<<<<<<<< * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) */ /*else*/ { __pyx_v_copy_shape = 0; } __pyx_L4:; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":216 * copy_shape = 0 * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") */ __pyx_t_2 = (((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS) != 0); if (__pyx_t_2) { } else { __pyx_t_1 = __pyx_t_2; goto __pyx_L6_bool_binop_done; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":217 * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): # <<<<<<<<<<<<<< * raise ValueError(u"ndarray is not C contiguous") * */ __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_C_CONTIGUOUS) != 0)) != 0); __pyx_t_1 = __pyx_t_2; __pyx_L6_bool_binop_done:; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":216 * copy_shape = 0 * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") */ if (__pyx_t_1) { /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":218 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) */ __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 218, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 218, __pyx_L1_error) /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":216 * copy_shape = 0 * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") */ } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":220 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") */ __pyx_t_2 = (((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS) != 0); if (__pyx_t_2) { } else { __pyx_t_1 = __pyx_t_2; goto __pyx_L9_bool_binop_done; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":221 * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): # <<<<<<<<<<<<<< * raise ValueError(u"ndarray is not Fortran contiguous") * */ __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_F_CONTIGUOUS) != 0)) != 0); __pyx_t_1 = __pyx_t_2; __pyx_L9_bool_binop_done:; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":220 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") */ if (__pyx_t_1) { /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":222 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< * * info.buf = PyArray_DATA(self) */ __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 222, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 222, __pyx_L1_error) /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":220 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") */ } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":224 * raise ValueError(u"ndarray is not Fortran contiguous") * * info.buf = PyArray_DATA(self) # <<<<<<<<<<<<<< * info.ndim = ndim * if copy_shape: */ __pyx_v_info->buf = PyArray_DATA(__pyx_v_self); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":225 * * info.buf = PyArray_DATA(self) * info.ndim = ndim # <<<<<<<<<<<<<< * if copy_shape: * # Allocate new buffer for strides and shape info. */ __pyx_v_info->ndim = __pyx_v_ndim; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":226 * info.buf = PyArray_DATA(self) * info.ndim = ndim * if copy_shape: # <<<<<<<<<<<<<< * # Allocate new buffer for strides and shape info. * # This is allocated as one block, strides first. */ __pyx_t_1 = (__pyx_v_copy_shape != 0); if (__pyx_t_1) { /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":229 * # Allocate new buffer for strides and shape info. * # This is allocated as one block, strides first. * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) # <<<<<<<<<<<<<< * info.shape = info.strides + ndim * for i in range(ndim): */ __pyx_v_info->strides = ((Py_ssize_t *)malloc((((sizeof(Py_ssize_t)) * ((size_t)__pyx_v_ndim)) * 2))); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":230 * # This is allocated as one block, strides first. * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) * info.shape = info.strides + ndim # <<<<<<<<<<<<<< * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] */ __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":231 * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) * info.shape = info.strides + ndim * for i in range(ndim): # <<<<<<<<<<<<<< * info.strides[i] = PyArray_STRIDES(self)[i] * info.shape[i] = PyArray_DIMS(self)[i] */ __pyx_t_4 = __pyx_v_ndim; for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { __pyx_v_i = __pyx_t_5; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":232 * info.shape = info.strides + ndim * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] # <<<<<<<<<<<<<< * info.shape[i] = PyArray_DIMS(self)[i] * else: */ (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(__pyx_v_self)[__pyx_v_i]); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":233 * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] * info.shape[i] = PyArray_DIMS(self)[i] # <<<<<<<<<<<<<< * else: * info.strides = PyArray_STRIDES(self) */ (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(__pyx_v_self)[__pyx_v_i]); } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":226 * info.buf = PyArray_DATA(self) * info.ndim = ndim * if copy_shape: # <<<<<<<<<<<<<< * # Allocate new buffer for strides and shape info. * # This is allocated as one block, strides first. */ goto __pyx_L11; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":235 * info.shape[i] = PyArray_DIMS(self)[i] * else: * info.strides = PyArray_STRIDES(self) # <<<<<<<<<<<<<< * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL */ /*else*/ { __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(__pyx_v_self)); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":236 * else: * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) # <<<<<<<<<<<<<< * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) */ __pyx_v_info->shape = ((Py_ssize_t *)PyArray_DIMS(__pyx_v_self)); } __pyx_L11:; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":237 * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL # <<<<<<<<<<<<<< * info.itemsize = PyArray_ITEMSIZE(self) * info.readonly = not PyArray_ISWRITEABLE(self) */ __pyx_v_info->suboffsets = NULL; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":238 * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) # <<<<<<<<<<<<<< * info.readonly = not PyArray_ISWRITEABLE(self) * */ __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":239 * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) * info.readonly = not PyArray_ISWRITEABLE(self) # <<<<<<<<<<<<<< * * cdef int t */ __pyx_v_info->readonly = (!(PyArray_ISWRITEABLE(__pyx_v_self) != 0)); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":242 * * cdef int t * cdef char* f = NULL # <<<<<<<<<<<<<< * cdef dtype descr = self.descr * cdef int offset */ __pyx_v_f = NULL; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":243 * cdef int t * cdef char* f = NULL * cdef dtype descr = self.descr # <<<<<<<<<<<<<< * cdef int offset * */ __pyx_t_3 = ((PyObject *)__pyx_v_self->descr); __Pyx_INCREF(__pyx_t_3); __pyx_v_descr = ((PyArray_Descr *)__pyx_t_3); __pyx_t_3 = 0; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":246 * cdef int offset * * cdef bint hasfields = PyDataType_HASFIELDS(descr) # <<<<<<<<<<<<<< * * if not hasfields and not copy_shape: */ __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":248 * cdef bint hasfields = PyDataType_HASFIELDS(descr) * * if not hasfields and not copy_shape: # <<<<<<<<<<<<<< * # do not call releasebuffer * info.obj = None */ __pyx_t_2 = ((!(__pyx_v_hasfields != 0)) != 0); if (__pyx_t_2) { } else { __pyx_t_1 = __pyx_t_2; goto __pyx_L15_bool_binop_done; } __pyx_t_2 = ((!(__pyx_v_copy_shape != 0)) != 0); __pyx_t_1 = __pyx_t_2; __pyx_L15_bool_binop_done:; if (__pyx_t_1) { /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":250 * if not hasfields and not copy_shape: * # do not call releasebuffer * info.obj = None # <<<<<<<<<<<<<< * else: * # need to call releasebuffer */ __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); __Pyx_GOTREF(__pyx_v_info->obj); __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = Py_None; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":248 * cdef bint hasfields = PyDataType_HASFIELDS(descr) * * if not hasfields and not copy_shape: # <<<<<<<<<<<<<< * # do not call releasebuffer * info.obj = None */ goto __pyx_L14; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":253 * else: * # need to call releasebuffer * info.obj = self # <<<<<<<<<<<<<< * * if not hasfields: */ /*else*/ { __Pyx_INCREF(((PyObject *)__pyx_v_self)); __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); __Pyx_GOTREF(__pyx_v_info->obj); __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = ((PyObject *)__pyx_v_self); } __pyx_L14:; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":255 * info.obj = self * * if not hasfields: # <<<<<<<<<<<<<< * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or */ __pyx_t_1 = ((!(__pyx_v_hasfields != 0)) != 0); if (__pyx_t_1) { /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":256 * * if not hasfields: * t = descr.type_num # <<<<<<<<<<<<<< * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): */ __pyx_t_4 = __pyx_v_descr->type_num; __pyx_v_t = __pyx_t_4; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":257 * if not hasfields: * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") */ __pyx_t_2 = ((__pyx_v_descr->byteorder == '>') != 0); if (!__pyx_t_2) { goto __pyx_L20_next_or; } else { } __pyx_t_2 = (__pyx_v_little_endian != 0); if (!__pyx_t_2) { } else { __pyx_t_1 = __pyx_t_2; goto __pyx_L19_bool_binop_done; } __pyx_L20_next_or:; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":258 * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" */ __pyx_t_2 = ((__pyx_v_descr->byteorder == '<') != 0); if (__pyx_t_2) { } else { __pyx_t_1 = __pyx_t_2; goto __pyx_L19_bool_binop_done; } __pyx_t_2 = ((!(__pyx_v_little_endian != 0)) != 0); __pyx_t_1 = __pyx_t_2; __pyx_L19_bool_binop_done:; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":257 * if not hasfields: * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") */ if (__pyx_t_1) { /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" */ __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 259, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 259, __pyx_L1_error) /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":257 * if not hasfields: * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") */ } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":260 * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" # <<<<<<<<<<<<<< * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" */ switch (__pyx_v_t) { case NPY_BYTE: __pyx_v_f = ((char *)"b"); break; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":261 * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" # <<<<<<<<<<<<<< * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" */ case NPY_UBYTE: __pyx_v_f = ((char *)"B"); break; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":262 * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" # <<<<<<<<<<<<<< * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" */ case NPY_SHORT: __pyx_v_f = ((char *)"h"); break; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":263 * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" # <<<<<<<<<<<<<< * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" */ case NPY_USHORT: __pyx_v_f = ((char *)"H"); break; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":264 * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" # <<<<<<<<<<<<<< * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" */ case NPY_INT: __pyx_v_f = ((char *)"i"); break; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":265 * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" # <<<<<<<<<<<<<< * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" */ case NPY_UINT: __pyx_v_f = ((char *)"I"); break; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":266 * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" # <<<<<<<<<<<<<< * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" */ case NPY_LONG: __pyx_v_f = ((char *)"l"); break; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":267 * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" # <<<<<<<<<<<<<< * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" */ case NPY_ULONG: __pyx_v_f = ((char *)"L"); break; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":268 * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" # <<<<<<<<<<<<<< * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" */ case NPY_LONGLONG: __pyx_v_f = ((char *)"q"); break; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":269 * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" # <<<<<<<<<<<<<< * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" */ case NPY_ULONGLONG: __pyx_v_f = ((char *)"Q"); break; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":270 * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" # <<<<<<<<<<<<<< * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" */ case NPY_FLOAT: __pyx_v_f = ((char *)"f"); break; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":271 * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" # <<<<<<<<<<<<<< * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" */ case NPY_DOUBLE: __pyx_v_f = ((char *)"d"); break; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":272 * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" # <<<<<<<<<<<<<< * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" */ case NPY_LONGDOUBLE: __pyx_v_f = ((char *)"g"); break; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":273 * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" # <<<<<<<<<<<<<< * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" */ case NPY_CFLOAT: __pyx_v_f = ((char *)"Zf"); break; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":274 * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" # <<<<<<<<<<<<<< * elif t == NPY_CLONGDOUBLE: f = "Zg" * elif t == NPY_OBJECT: f = "O" */ case NPY_CDOUBLE: __pyx_v_f = ((char *)"Zd"); break; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":275 * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" # <<<<<<<<<<<<<< * elif t == NPY_OBJECT: f = "O" * else: */ case NPY_CLONGDOUBLE: __pyx_v_f = ((char *)"Zg"); break; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":276 * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" * elif t == NPY_OBJECT: f = "O" # <<<<<<<<<<<<<< * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) */ case NPY_OBJECT: __pyx_v_f = ((char *)"O"); break; default: /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":278 * elif t == NPY_OBJECT: f = "O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< * info.format = f * return */ __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_t); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 278, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_6 = PyUnicode_Format(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_t_3); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 278, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 278, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_6); __pyx_t_6 = 0; __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 278, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_Raise(__pyx_t_6, 0, 0, 0); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __PYX_ERR(1, 278, __pyx_L1_error) break; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":279 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f # <<<<<<<<<<<<<< * return * else: */ __pyx_v_info->format = __pyx_v_f; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":280 * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f * return # <<<<<<<<<<<<<< * else: * info.format = stdlib.malloc(_buffer_format_string_len) */ __pyx_r = 0; goto __pyx_L0; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":255 * info.obj = self * * if not hasfields: # <<<<<<<<<<<<<< * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or */ } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":282 * return * else: * info.format = stdlib.malloc(_buffer_format_string_len) # <<<<<<<<<<<<<< * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 */ /*else*/ { __pyx_v_info->format = ((char *)malloc(0xFF)); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":283 * else: * info.format = stdlib.malloc(_buffer_format_string_len) * info.format[0] = c'^' # Native data types, manual alignment # <<<<<<<<<<<<<< * offset = 0 * f = _util_dtypestring(descr, info.format + 1, */ (__pyx_v_info->format[0]) = '^'; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":284 * info.format = stdlib.malloc(_buffer_format_string_len) * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 # <<<<<<<<<<<<<< * f = _util_dtypestring(descr, info.format + 1, * info.format + _buffer_format_string_len, */ __pyx_v_offset = 0; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":285 * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 * f = _util_dtypestring(descr, info.format + 1, # <<<<<<<<<<<<<< * info.format + _buffer_format_string_len, * &offset) */ __pyx_t_7 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 0xFF), (&__pyx_v_offset)); if (unlikely(__pyx_t_7 == NULL)) __PYX_ERR(1, 285, __pyx_L1_error) __pyx_v_f = __pyx_t_7; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":288 * info.format + _buffer_format_string_len, * &offset) * f[0] = c'\0' # Terminate format string # <<<<<<<<<<<<<< * * def __releasebuffer__(ndarray self, Py_buffer* info): */ (__pyx_v_f[0]) = '\x00'; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":197 * # experimental exception made for __getbuffer__ and __releasebuffer__ * # -- the details of this may change. * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< * # This implementation of getbuffer is geared towards Cython * # requirements, and does not yet fullfill the PEP. */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_6); __Pyx_AddTraceback("numpy.ndarray.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; if (__pyx_v_info != NULL && __pyx_v_info->obj != NULL) { __Pyx_GOTREF(__pyx_v_info->obj); __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = NULL; } goto __pyx_L2; __pyx_L0:; if (__pyx_v_info != NULL && __pyx_v_info->obj == Py_None) { __Pyx_GOTREF(Py_None); __Pyx_DECREF(Py_None); __pyx_v_info->obj = NULL; } __pyx_L2:; __Pyx_XDECREF((PyObject *)__pyx_v_descr); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":290 * f[0] = c'\0' # Terminate format string * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< * if PyArray_HASFIELDS(self): * stdlib.free(info.format) */ /* Python wrapper */ static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/ static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__releasebuffer__ (wrapper)", 0); __pyx_pf_5numpy_7ndarray_2__releasebuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info)); /* function exit code */ __Pyx_RefNannyFinishContext(); } static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info) { __Pyx_RefNannyDeclarations int __pyx_t_1; __Pyx_RefNannySetupContext("__releasebuffer__", 0); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":291 * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< * stdlib.free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): */ __pyx_t_1 = (PyArray_HASFIELDS(__pyx_v_self) != 0); if (__pyx_t_1) { /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":292 * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): * stdlib.free(info.format) # <<<<<<<<<<<<<< * if sizeof(npy_intp) != sizeof(Py_ssize_t): * stdlib.free(info.strides) */ free(__pyx_v_info->format); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":291 * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< * stdlib.free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): */ } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":293 * if PyArray_HASFIELDS(self): * stdlib.free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< * stdlib.free(info.strides) * # info.shape was stored after info.strides in the same block */ __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); if (__pyx_t_1) { /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":294 * stdlib.free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): * stdlib.free(info.strides) # <<<<<<<<<<<<<< * # info.shape was stored after info.strides in the same block * */ free(__pyx_v_info->strides); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":293 * if PyArray_HASFIELDS(self): * stdlib.free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< * stdlib.free(info.strides) * # info.shape was stored after info.strides in the same block */ } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":290 * f[0] = c'\0' # Terminate format string * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< * if PyArray_HASFIELDS(self): * stdlib.free(info.format) */ /* function exit code */ __Pyx_RefNannyFinishContext(); } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":770 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(1, a) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":771 * * cdef inline object PyArray_MultiIterNew1(a): * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew2(a, b): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 771, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":770 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(1, a) * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":773 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(2, a, b) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":774 * * cdef inline object PyArray_MultiIterNew2(a, b): * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew3(a, b, c): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 774, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":773 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(2, a, b) * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":776 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(3, a, b, c) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":777 * * cdef inline object PyArray_MultiIterNew3(a, b, c): * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 777, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":776 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(3, a, b, c) * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":779 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(4, a, b, c, d) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":780 * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 780, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":779 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(4, a, b, c, d) * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":782 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(5, a, b, c, d, e) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":783 * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 783, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":782 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(5, a, b, c, d, e) * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":785 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< * # Recursive utility function used in __getbuffer__ to get format * # string. The new location in the format string is returned. */ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) { PyArray_Descr *__pyx_v_child = 0; int __pyx_v_endian_detector; int __pyx_v_little_endian; PyObject *__pyx_v_fields = 0; PyObject *__pyx_v_childname = NULL; PyObject *__pyx_v_new_offset = NULL; PyObject *__pyx_v_t = NULL; char *__pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; Py_ssize_t __pyx_t_2; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; int __pyx_t_6; int __pyx_t_7; long __pyx_t_8; char *__pyx_t_9; __Pyx_RefNannySetupContext("_util_dtypestring", 0); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":790 * * cdef dtype child * cdef int endian_detector = 1 # <<<<<<<<<<<<<< * cdef bint little_endian = ((&endian_detector)[0] != 0) * cdef tuple fields */ __pyx_v_endian_detector = 1; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":791 * cdef dtype child * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< * cdef tuple fields * */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":794 * cdef tuple fields * * for childname in descr.names: # <<<<<<<<<<<<<< * fields = descr.fields[childname] * child, new_offset = fields */ if (unlikely(__pyx_v_descr->names == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); __PYX_ERR(1, 794, __pyx_L1_error) } __pyx_t_1 = __pyx_v_descr->names; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; for (;;) { if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break; #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(1, 794, __pyx_L1_error) #else __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 794, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); #endif __Pyx_XDECREF_SET(__pyx_v_childname, __pyx_t_3); __pyx_t_3 = 0; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":795 * * for childname in descr.names: * fields = descr.fields[childname] # <<<<<<<<<<<<<< * child, new_offset = fields * */ if (unlikely(__pyx_v_descr->fields == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); __PYX_ERR(1, 795, __pyx_L1_error) } __pyx_t_3 = __Pyx_PyDict_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 795, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_t_3)->tp_name), 0))) __PYX_ERR(1, 795, __pyx_L1_error) __Pyx_XDECREF_SET(__pyx_v_fields, ((PyObject*)__pyx_t_3)); __pyx_t_3 = 0; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":796 * for childname in descr.names: * fields = descr.fields[childname] * child, new_offset = fields # <<<<<<<<<<<<<< * * if (end - f) - (new_offset - offset[0]) < 15: */ if (likely(__pyx_v_fields != Py_None)) { PyObject* sequence = __pyx_v_fields; #if !CYTHON_COMPILING_IN_PYPY Py_ssize_t size = Py_SIZE(sequence); #else Py_ssize_t size = PySequence_Size(sequence); #endif if (unlikely(size != 2)) { if (size > 2) __Pyx_RaiseTooManyValuesError(2); else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); __PYX_ERR(1, 796, __pyx_L1_error) } #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(__pyx_t_4); #else __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 796, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 796, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); #endif } else { __Pyx_RaiseNoneNotIterableError(); __PYX_ERR(1, 796, __pyx_L1_error) } if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) __PYX_ERR(1, 796, __pyx_L1_error) __Pyx_XDECREF_SET(__pyx_v_child, ((PyArray_Descr *)__pyx_t_3)); __pyx_t_3 = 0; __Pyx_XDECREF_SET(__pyx_v_new_offset, __pyx_t_4); __pyx_t_4 = 0; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":798 * child, new_offset = fields * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * */ __pyx_t_4 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 798, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 798, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 798, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = ((((__pyx_v_end - __pyx_v_f) - ((int)__pyx_t_5)) < 15) != 0); if (__pyx_t_6) { /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":799 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< * * if ((child.byteorder == c'>' and little_endian) or */ __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 799, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 799, __pyx_L1_error) /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":798 * child, new_offset = fields * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * */ } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":801 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") */ __pyx_t_7 = ((__pyx_v_child->byteorder == '>') != 0); if (!__pyx_t_7) { goto __pyx_L8_next_or; } else { } __pyx_t_7 = (__pyx_v_little_endian != 0); if (!__pyx_t_7) { } else { __pyx_t_6 = __pyx_t_7; goto __pyx_L7_bool_binop_done; } __pyx_L8_next_or:; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":802 * * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< * raise ValueError(u"Non-native byte order not supported") * # One could encode it in the format string and have Cython */ __pyx_t_7 = ((__pyx_v_child->byteorder == '<') != 0); if (__pyx_t_7) { } else { __pyx_t_6 = __pyx_t_7; goto __pyx_L7_bool_binop_done; } __pyx_t_7 = ((!(__pyx_v_little_endian != 0)) != 0); __pyx_t_6 = __pyx_t_7; __pyx_L7_bool_binop_done:; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":801 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") */ if (__pyx_t_6) { /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":803 * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< * # One could encode it in the format string and have Cython * # complain instead, BUT: < and > in format strings also imply */ __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 803, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 803, __pyx_L1_error) /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":801 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") */ } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":813 * * # Output padding bytes * while offset[0] < new_offset: # <<<<<<<<<<<<<< * f[0] = 120 # "x"; pad byte * f += 1 */ while (1) { __pyx_t_3 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 813, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_v_new_offset, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 813, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 813, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (!__pyx_t_6) break; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":814 * # Output padding bytes * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte # <<<<<<<<<<<<<< * f += 1 * offset[0] += 1 */ (__pyx_v_f[0]) = 0x78; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":815 * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte * f += 1 # <<<<<<<<<<<<<< * offset[0] += 1 * */ __pyx_v_f = (__pyx_v_f + 1); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":816 * f[0] = 120 # "x"; pad byte * f += 1 * offset[0] += 1 # <<<<<<<<<<<<<< * * offset[0] += child.itemsize */ __pyx_t_8 = 0; (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + 1); } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":818 * offset[0] += 1 * * offset[0] += child.itemsize # <<<<<<<<<<<<<< * * if not PyDataType_HASFIELDS(child): */ __pyx_t_8 = 0; (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + __pyx_v_child->elsize); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":820 * offset[0] += child.itemsize * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< * t = child.type_num * if end - f < 5: */ __pyx_t_6 = ((!(PyDataType_HASFIELDS(__pyx_v_child) != 0)) != 0); if (__pyx_t_6) { /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":821 * * if not PyDataType_HASFIELDS(child): * t = child.type_num # <<<<<<<<<<<<<< * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") */ __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_child->type_num); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 821, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_4); __pyx_t_4 = 0; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":822 * if not PyDataType_HASFIELDS(child): * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< * raise RuntimeError(u"Format string allocated too short.") * */ __pyx_t_6 = (((__pyx_v_end - __pyx_v_f) < 5) != 0); if (__pyx_t_6) { /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":823 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< * * # Until ticket #99 is fixed, use integers to avoid warnings */ __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 823, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_Raise(__pyx_t_4, 0, 0, 0); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __PYX_ERR(1, 823, __pyx_L1_error) /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":822 * if not PyDataType_HASFIELDS(child): * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< * raise RuntimeError(u"Format string allocated too short.") * */ } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":826 * * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" # <<<<<<<<<<<<<< * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" */ __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_BYTE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 826, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 826, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 826, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 98; goto __pyx_L15; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":827 * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" # <<<<<<<<<<<<<< * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" */ __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_UBYTE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 827, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 827, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 827, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 66; goto __pyx_L15; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":828 * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" # <<<<<<<<<<<<<< * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" */ __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_SHORT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 828, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 828, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 828, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 0x68; goto __pyx_L15; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":829 * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" # <<<<<<<<<<<<<< * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" */ __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_USHORT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 829, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 829, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 829, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 72; goto __pyx_L15; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":830 * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" # <<<<<<<<<<<<<< * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" */ __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_INT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 830, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 830, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 830, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 0x69; goto __pyx_L15; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":831 * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" # <<<<<<<<<<<<<< * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" */ __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_UINT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 831, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 831, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 831, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 73; goto __pyx_L15; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":832 * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" # <<<<<<<<<<<<<< * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" */ __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONG); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 832, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 832, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 832, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 0x6C; goto __pyx_L15; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":833 * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" # <<<<<<<<<<<<<< * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" */ __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_ULONG); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 833, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 833, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 833, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 76; goto __pyx_L15; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":834 * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" # <<<<<<<<<<<<<< * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" */ __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONGLONG); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 834, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 834, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 834, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 0x71; goto __pyx_L15; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":835 * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" # <<<<<<<<<<<<<< * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" */ __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_ULONGLONG); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 835, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 835, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 835, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 81; goto __pyx_L15; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":836 * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" # <<<<<<<<<<<<<< * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" */ __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_FLOAT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 836, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 836, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 836, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 0x66; goto __pyx_L15; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":837 * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" # <<<<<<<<<<<<<< * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf */ __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_DOUBLE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 837, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 837, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 837, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 0x64; goto __pyx_L15; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":838 * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" # <<<<<<<<<<<<<< * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd */ __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 838, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 838, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 838, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 0x67; goto __pyx_L15; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":839 * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf # <<<<<<<<<<<<<< * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg */ __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CFLOAT); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 839, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 839, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 839, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 90; (__pyx_v_f[1]) = 0x66; __pyx_v_f = (__pyx_v_f + 1); goto __pyx_L15; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":840 * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd # <<<<<<<<<<<<<< * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg * elif t == NPY_OBJECT: f[0] = 79 #"O" */ __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CDOUBLE); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 840, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 840, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 840, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 90; (__pyx_v_f[1]) = 0x64; __pyx_v_f = (__pyx_v_f + 1); goto __pyx_L15; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":841 * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg # <<<<<<<<<<<<<< * elif t == NPY_OBJECT: f[0] = 79 #"O" * else: */ __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 841, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 841, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 841, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 90; (__pyx_v_f[1]) = 0x67; __pyx_v_f = (__pyx_v_f + 1); goto __pyx_L15; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":842 * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg * elif t == NPY_OBJECT: f[0] = 79 #"O" # <<<<<<<<<<<<<< * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) */ __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_OBJECT); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 842, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 842, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(1, 842, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 79; goto __pyx_L15; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":844 * elif t == NPY_OBJECT: f[0] = 79 #"O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< * f += 1 * else: */ /*else*/ { __pyx_t_3 = PyUnicode_Format(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_v_t); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 844, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 844, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 844, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __PYX_ERR(1, 844, __pyx_L1_error) } __pyx_L15:; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":845 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * f += 1 # <<<<<<<<<<<<<< * else: * # Cython ignores struct boundary information ("T{...}"), */ __pyx_v_f = (__pyx_v_f + 1); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":820 * offset[0] += child.itemsize * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< * t = child.type_num * if end - f < 5: */ goto __pyx_L13; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":849 * # Cython ignores struct boundary information ("T{...}"), * # so don't output it * f = _util_dtypestring(child, f, end, offset) # <<<<<<<<<<<<<< * return f * */ /*else*/ { __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_9 == NULL)) __PYX_ERR(1, 849, __pyx_L1_error) __pyx_v_f = __pyx_t_9; } __pyx_L13:; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":794 * cdef tuple fields * * for childname in descr.names: # <<<<<<<<<<<<<< * fields = descr.fields[childname] * child, new_offset = fields */ } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":850 * # so don't output it * f = _util_dtypestring(child, f, end, offset) * return f # <<<<<<<<<<<<<< * * */ __pyx_r = __pyx_v_f; goto __pyx_L0; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":785 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< * # Recursive utility function used in __getbuffer__ to get format * # string. The new location in the format string is returned. */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_AddTraceback("numpy._util_dtypestring", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_child); __Pyx_XDECREF(__pyx_v_fields); __Pyx_XDECREF(__pyx_v_childname); __Pyx_XDECREF(__pyx_v_new_offset); __Pyx_XDECREF(__pyx_v_t); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":966 * * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< * cdef PyObject* baseptr * if base is None: */ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) { PyObject *__pyx_v_baseptr; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; __Pyx_RefNannySetupContext("set_array_base", 0); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":968 * cdef inline void set_array_base(ndarray arr, object base): * cdef PyObject* baseptr * if base is None: # <<<<<<<<<<<<<< * baseptr = NULL * else: */ __pyx_t_1 = (__pyx_v_base == Py_None); __pyx_t_2 = (__pyx_t_1 != 0); if (__pyx_t_2) { /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":969 * cdef PyObject* baseptr * if base is None: * baseptr = NULL # <<<<<<<<<<<<<< * else: * Py_INCREF(base) # important to do this before decref below! */ __pyx_v_baseptr = NULL; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":968 * cdef inline void set_array_base(ndarray arr, object base): * cdef PyObject* baseptr * if base is None: # <<<<<<<<<<<<<< * baseptr = NULL * else: */ goto __pyx_L3; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":971 * baseptr = NULL * else: * Py_INCREF(base) # important to do this before decref below! # <<<<<<<<<<<<<< * baseptr = base * Py_XDECREF(arr.base) */ /*else*/ { Py_INCREF(__pyx_v_base); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":972 * else: * Py_INCREF(base) # important to do this before decref below! * baseptr = base # <<<<<<<<<<<<<< * Py_XDECREF(arr.base) * arr.base = baseptr */ __pyx_v_baseptr = ((PyObject *)__pyx_v_base); } __pyx_L3:; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":973 * Py_INCREF(base) # important to do this before decref below! * baseptr = base * Py_XDECREF(arr.base) # <<<<<<<<<<<<<< * arr.base = baseptr * */ Py_XDECREF(__pyx_v_arr->base); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":974 * baseptr = base * Py_XDECREF(arr.base) * arr.base = baseptr # <<<<<<<<<<<<<< * * cdef inline object get_array_base(ndarray arr): */ __pyx_v_arr->base = __pyx_v_baseptr; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":966 * * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< * cdef PyObject* baseptr * if base is None: */ /* function exit code */ __Pyx_RefNannyFinishContext(); } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":976 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< * if arr.base is NULL: * return None */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; __Pyx_RefNannySetupContext("get_array_base", 0); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< * return None * else: */ __pyx_t_1 = ((__pyx_v_arr->base == NULL) != 0); if (__pyx_t_1) { /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":978 * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: * return None # <<<<<<<<<<<<<< * else: * return arr.base */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(Py_None); __pyx_r = Py_None; goto __pyx_L0; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":977 * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< * return None * else: */ } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":980 * return None * else: * return arr.base # <<<<<<<<<<<<<< * * */ /*else*/ { __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(((PyObject *)__pyx_v_arr->base)); __pyx_r = ((PyObject *)__pyx_v_arr->base); goto __pyx_L0; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":976 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< * if arr.base is NULL: * return None */ /* function exit code */ __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":985 * # Versions of the import_* functions which are more suitable for * # Cython code. * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< * try: * _import_array() */ static CYTHON_INLINE int __pyx_f_5numpy_import_array(void) { int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; int __pyx_t_4; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_array", 0); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":986 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< * _import_array() * except Exception: */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); __Pyx_XGOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":987 * cdef inline int import_array() except -1: * try: * _import_array() # <<<<<<<<<<<<<< * except Exception: * raise ImportError("numpy.core.multiarray failed to import") */ __pyx_t_4 = _import_array(); if (unlikely(__pyx_t_4 == -1)) __PYX_ERR(1, 987, __pyx_L3_error) /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":986 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< * _import_array() * except Exception: */ } __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; goto __pyx_L8_try_end; __pyx_L3_error:; __Pyx_PyThreadState_assign /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":988 * try: * _import_array() * except Exception: # <<<<<<<<<<<<<< * raise ImportError("numpy.core.multiarray failed to import") * */ __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); if (__pyx_t_4) { __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 988, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":989 * _import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< * * cdef inline int import_umath() except -1: */ __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 989, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_Raise(__pyx_t_8, 0, 0, 0); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __PYX_ERR(1, 989, __pyx_L5_except_error) } goto __pyx_L5_except_error; __pyx_L5_except_error:; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":986 * # Cython code. * cdef inline int import_array() except -1: * try: # <<<<<<<<<<<<<< * _import_array() * except Exception: */ __Pyx_PyThreadState_assign __Pyx_XGIVEREF(__pyx_t_1); __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); goto __pyx_L1_error; __pyx_L8_try_end:; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":985 * # Versions of the import_* functions which are more suitable for * # Cython code. * cdef inline int import_array() except -1: # <<<<<<<<<<<<<< * try: * _import_array() */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_AddTraceback("numpy.import_array", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":991 * raise ImportError("numpy.core.multiarray failed to import") * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< * try: * _import_umath() */ static CYTHON_INLINE int __pyx_f_5numpy_import_umath(void) { int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; int __pyx_t_4; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_umath", 0); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":992 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() * except Exception: */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); __Pyx_XGOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":993 * cdef inline int import_umath() except -1: * try: * _import_umath() # <<<<<<<<<<<<<< * except Exception: * raise ImportError("numpy.core.umath failed to import") */ __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == -1)) __PYX_ERR(1, 993, __pyx_L3_error) /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":992 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() * except Exception: */ } __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; goto __pyx_L8_try_end; __pyx_L3_error:; __Pyx_PyThreadState_assign /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":994 * try: * _import_umath() * except Exception: # <<<<<<<<<<<<<< * raise ImportError("numpy.core.umath failed to import") * */ __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); if (__pyx_t_4) { __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 994, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":995 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< * * cdef inline int import_ufunc() except -1: */ __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 995, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_Raise(__pyx_t_8, 0, 0, 0); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __PYX_ERR(1, 995, __pyx_L5_except_error) } goto __pyx_L5_except_error; __pyx_L5_except_error:; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":992 * * cdef inline int import_umath() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() * except Exception: */ __Pyx_PyThreadState_assign __Pyx_XGIVEREF(__pyx_t_1); __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); goto __pyx_L1_error; __pyx_L8_try_end:; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":991 * raise ImportError("numpy.core.multiarray failed to import") * * cdef inline int import_umath() except -1: # <<<<<<<<<<<<<< * try: * _import_umath() */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_AddTraceback("numpy.import_umath", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< * try: * _import_umath() */ static CYTHON_INLINE int __pyx_f_5numpy_import_ufunc(void) { int __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; int __pyx_t_4; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; __Pyx_RefNannySetupContext("import_ufunc", 0); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":998 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() * except Exception: */ { __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); __Pyx_XGOTREF(__pyx_t_1); __Pyx_XGOTREF(__pyx_t_2); __Pyx_XGOTREF(__pyx_t_3); /*try:*/ { /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":999 * cdef inline int import_ufunc() except -1: * try: * _import_umath() # <<<<<<<<<<<<<< * except Exception: * raise ImportError("numpy.core.umath failed to import") */ __pyx_t_4 = _import_umath(); if (unlikely(__pyx_t_4 == -1)) __PYX_ERR(1, 999, __pyx_L3_error) /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":998 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() * except Exception: */ } __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; goto __pyx_L8_try_end; __pyx_L3_error:; __Pyx_PyThreadState_assign /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1000 * try: * _import_umath() * except Exception: # <<<<<<<<<<<<<< * raise ImportError("numpy.core.umath failed to import") */ __pyx_t_4 = __Pyx_PyErr_ExceptionMatches(((PyObject *)(&((PyTypeObject*)PyExc_Exception)[0]))); if (__pyx_t_4) { __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(1, 1000, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GOTREF(__pyx_t_6); __Pyx_GOTREF(__pyx_t_7); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1001 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< */ __pyx_t_8 = __Pyx_PyObject_Call(__pyx_builtin_ImportError, __pyx_tuple__12, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 1001, __pyx_L5_except_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_Raise(__pyx_t_8, 0, 0, 0); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __PYX_ERR(1, 1001, __pyx_L5_except_error) } goto __pyx_L5_except_error; __pyx_L5_except_error:; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":998 * * cdef inline int import_ufunc() except -1: * try: # <<<<<<<<<<<<<< * _import_umath() * except Exception: */ __Pyx_PyThreadState_assign __Pyx_XGIVEREF(__pyx_t_1); __Pyx_XGIVEREF(__pyx_t_2); __Pyx_XGIVEREF(__pyx_t_3); __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); goto __pyx_L1_error; __pyx_L8_try_end:; } /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< * try: * _import_umath() */ /* function exit code */ __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_AddTraceback("numpy.import_ufunc", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyMethodDef __pyx_methods[] = { {0, 0, 0, 0} }; #if PY_MAJOR_VERSION >= 3 static struct PyModuleDef __pyx_moduledef = { #if PY_VERSION_HEX < 0x03020000 { PyObject_HEAD_INIT(NULL) NULL, 0, NULL }, #else PyModuleDef_HEAD_INIT, #endif "_overlap", 0, /* m_doc */ -1, /* m_size */ __pyx_methods /* m_methods */, NULL, /* m_reload */ NULL, /* m_traverse */ NULL, /* m_clear */ NULL /* m_free */ }; #endif static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_kp_u_Format_string_allocated_too_shor, __pyx_k_Format_string_allocated_too_shor, sizeof(__pyx_k_Format_string_allocated_too_shor), 0, 1, 0, 0}, {&__pyx_kp_u_Format_string_allocated_too_shor_2, __pyx_k_Format_string_allocated_too_shor_2, sizeof(__pyx_k_Format_string_allocated_too_shor_2), 0, 1, 0, 0}, {&__pyx_n_s_ImportError, __pyx_k_ImportError, sizeof(__pyx_k_ImportError), 0, 0, 1, 1}, {&__pyx_kp_u_Non_native_byte_order_not_suppor, __pyx_k_Non_native_byte_order_not_suppor, sizeof(__pyx_k_Non_native_byte_order_not_suppor), 0, 1, 0, 0}, {&__pyx_n_s_RuntimeError, __pyx_k_RuntimeError, sizeof(__pyx_k_RuntimeError), 0, 0, 1, 1}, {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1}, {&__pyx_n_s_area_ratio, __pyx_k_area_ratio, sizeof(__pyx_k_area_ratio), 0, 0, 1, 1}, {&__pyx_n_s_array, __pyx_k_array, sizeof(__pyx_k_array), 0, 0, 1, 1}, {&__pyx_n_s_array_new, __pyx_k_array_new, sizeof(__pyx_k_array_new), 0, 0, 1, 1}, {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, {&__pyx_n_s_col_array, __pyx_k_col_array, sizeof(__pyx_k_col_array), 0, 0, 1, 1}, {&__pyx_n_s_col_in, __pyx_k_col_in, sizeof(__pyx_k_col_in), 0, 0, 1, 1}, {&__pyx_n_s_col_new, __pyx_k_col_new, sizeof(__pyx_k_col_new), 0, 0, 1, 1}, {&__pyx_n_s_col_out, __pyx_k_col_out, sizeof(__pyx_k_col_out), 0, 0, 1, 1}, {&__pyx_n_s_compute_overlap, __pyx_k_compute_overlap, sizeof(__pyx_k_compute_overlap), 0, 0, 1, 1}, {&__pyx_n_s_double, __pyx_k_double, sizeof(__pyx_k_double), 0, 0, 1, 1}, {&__pyx_n_s_dtype, __pyx_k_dtype, sizeof(__pyx_k_dtype), 0, 0, 1, 1}, {&__pyx_n_s_empty, __pyx_k_empty, sizeof(__pyx_k_empty), 0, 0, 1, 1}, {&__pyx_n_s_endx, __pyx_k_endx, sizeof(__pyx_k_endx), 0, 0, 1, 1}, {&__pyx_n_s_endy, __pyx_k_endy, sizeof(__pyx_k_endy), 0, 0, 1, 1}, {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1}, {&__pyx_n_s_ilat, __pyx_k_ilat, sizeof(__pyx_k_ilat), 0, 0, 1, 1}, {&__pyx_n_s_ilon, __pyx_k_ilon, sizeof(__pyx_k_ilon), 0, 0, 1, 1}, {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, {&__pyx_n_s_n, __pyx_k_n, sizeof(__pyx_k_n), 0, 0, 1, 1}, {&__pyx_kp_u_ndarray_is_not_C_contiguous, __pyx_k_ndarray_is_not_C_contiguous, sizeof(__pyx_k_ndarray_is_not_C_contiguous), 0, 1, 0, 0}, {&__pyx_kp_u_ndarray_is_not_Fortran_contiguou, __pyx_k_ndarray_is_not_Fortran_contiguou, sizeof(__pyx_k_ndarray_is_not_Fortran_contiguou), 0, 1, 0, 0}, {&__pyx_n_s_np, __pyx_k_np, sizeof(__pyx_k_np), 0, 0, 1, 1}, {&__pyx_n_s_numpy, __pyx_k_numpy, sizeof(__pyx_k_numpy), 0, 0, 1, 1}, {&__pyx_kp_s_numpy_core_multiarray_failed_to, __pyx_k_numpy_core_multiarray_failed_to, sizeof(__pyx_k_numpy_core_multiarray_failed_to), 0, 0, 1, 0}, {&__pyx_kp_s_numpy_core_umath_failed_to_impor, __pyx_k_numpy_core_umath_failed_to_impor, sizeof(__pyx_k_numpy_core_umath_failed_to_impor), 0, 0, 1, 0}, {&__pyx_n_s_nx_out, __pyx_k_nx_out, sizeof(__pyx_k_nx_out), 0, 0, 1, 1}, {&__pyx_n_s_ny_out, __pyx_k_ny_out, sizeof(__pyx_k_ny_out), 0, 0, 1, 1}, {&__pyx_n_s_olat, __pyx_k_olat, sizeof(__pyx_k_olat), 0, 0, 1, 1}, {&__pyx_n_s_olon, __pyx_k_olon, sizeof(__pyx_k_olon), 0, 0, 1, 1}, {&__pyx_n_s_original, __pyx_k_original, sizeof(__pyx_k_original), 0, 0, 1, 1}, {&__pyx_n_s_overlap, __pyx_k_overlap, sizeof(__pyx_k_overlap), 0, 0, 1, 1}, {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, {&__pyx_n_s_reproject_slice_cython, __pyx_k_reproject_slice_cython, sizeof(__pyx_k_reproject_slice_cython), 0, 0, 1, 1}, {&__pyx_kp_s_reproject_spherical_intersect__o, __pyx_k_reproject_spherical_intersect__o, sizeof(__pyx_k_reproject_spherical_intersect__o), 0, 0, 1, 0}, {&__pyx_n_s_reproject_spherical_intersect__o_2, __pyx_k_reproject_spherical_intersect__o_2, sizeof(__pyx_k_reproject_spherical_intersect__o_2), 0, 0, 1, 1}, {&__pyx_n_s_shape_out, __pyx_k_shape_out, sizeof(__pyx_k_shape_out), 0, 0, 1, 1}, {&__pyx_n_s_startx, __pyx_k_startx, sizeof(__pyx_k_startx), 0, 0, 1, 1}, {&__pyx_n_s_starty, __pyx_k_starty, sizeof(__pyx_k_starty), 0, 0, 1, 1}, {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, {&__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_k_unknown_dtype_code_in_numpy_pxd, sizeof(__pyx_k_unknown_dtype_code_in_numpy_pxd), 0, 1, 0, 0}, {&__pyx_n_s_weights, __pyx_k_weights, sizeof(__pyx_k_weights), 0, 0, 1, 1}, {&__pyx_n_s_xp_inout, __pyx_k_xp_inout, sizeof(__pyx_k_xp_inout), 0, 0, 1, 1}, {&__pyx_n_s_xw_in, __pyx_k_xw_in, sizeof(__pyx_k_xw_in), 0, 0, 1, 1}, {&__pyx_n_s_xw_out, __pyx_k_xw_out, sizeof(__pyx_k_xw_out), 0, 0, 1, 1}, {&__pyx_n_s_yp_inout, __pyx_k_yp_inout, sizeof(__pyx_k_yp_inout), 0, 0, 1, 1}, {&__pyx_n_s_yw_in, __pyx_k_yw_in, sizeof(__pyx_k_yw_in), 0, 0, 1, 1}, {&__pyx_n_s_yw_out, __pyx_k_yw_out, sizeof(__pyx_k_yw_out), 0, 0, 1, 1}, {&__pyx_n_s_zeros, __pyx_k_zeros, sizeof(__pyx_k_zeros), 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0} }; static int __Pyx_InitCachedBuiltins(void) { __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 65, __pyx_L1_error) __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(1, 218, __pyx_L1_error) __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) __PYX_ERR(1, 799, __pyx_L1_error) __pyx_builtin_ImportError = __Pyx_GetBuiltinName(__pyx_n_s_ImportError); if (!__pyx_builtin_ImportError) __PYX_ERR(1, 989, __pyx_L1_error) return 0; __pyx_L1_error:; return -1; } static int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); /* "reproject/spherical_intersect/_overlap.pyx":33 * cdef np.ndarray[double, ndim = 2, mode = "c"] weights = np.zeros(shape_out, dtype = np.double) * # Arrays used in loop iterations. * cdef np.ndarray[double, ndim = 1, mode = "c"] overlap = np.zeros((1), dtype = np.double) # <<<<<<<<<<<<<< * cdef np.ndarray[double, ndim = 1, mode = "c"] area_ratio = np.zeros((1), dtype = np.double) * cdef np.ndarray[double, ndim = 1, mode = "c"] original = np.zeros((1), dtype = np.double) */ __pyx_tuple_ = PyTuple_Pack(1, __pyx_int_1); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 33, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple_); __Pyx_GIVEREF(__pyx_tuple_); /* "reproject/spherical_intersect/_overlap.pyx":34 * # Arrays used in loop iterations. * cdef np.ndarray[double, ndim = 1, mode = "c"] overlap = np.zeros((1), dtype = np.double) * cdef np.ndarray[double, ndim = 1, mode = "c"] area_ratio = np.zeros((1), dtype = np.double) # <<<<<<<<<<<<<< * cdef np.ndarray[double, ndim = 1, mode = "c"] original = np.zeros((1), dtype = np.double) * */ __pyx_tuple__2 = PyTuple_Pack(1, __pyx_int_1); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(0, 34, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__2); __Pyx_GIVEREF(__pyx_tuple__2); /* "reproject/spherical_intersect/_overlap.pyx":35 * cdef np.ndarray[double, ndim = 1, mode = "c"] overlap = np.zeros((1), dtype = np.double) * cdef np.ndarray[double, ndim = 1, mode = "c"] area_ratio = np.zeros((1), dtype = np.double) * cdef np.ndarray[double, ndim = 1, mode = "c"] original = np.zeros((1), dtype = np.double) # <<<<<<<<<<<<<< * * # We need the y size of these 2-dimensional arrays in order to access the elements correctly */ __pyx_tuple__3 = PyTuple_Pack(1, __pyx_int_1); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 35, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__3); __Pyx_GIVEREF(__pyx_tuple__3); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":218 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) */ __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_C_contiguous); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(1, 218, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__4); __Pyx_GIVEREF(__pyx_tuple__4); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":222 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< * * info.buf = PyArray_DATA(self) */ __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_Fortran_contiguou); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(1, 222, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__5); __Pyx_GIVEREF(__pyx_tuple__5); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":259 * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" */ __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(1, 259, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__6); __Pyx_GIVEREF(__pyx_tuple__6); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":799 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< * * if ((child.byteorder == c'>' and little_endian) or */ __pyx_tuple__7 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(1, 799, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__7); __Pyx_GIVEREF(__pyx_tuple__7); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":803 * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< * # One could encode it in the format string and have Cython * # complain instead, BUT: < and > in format strings also imply */ __pyx_tuple__8 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(1, 803, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__8); __Pyx_GIVEREF(__pyx_tuple__8); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":823 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< * * # Until ticket #99 is fixed, use integers to avoid warnings */ __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor_2); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(1, 823, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__9); __Pyx_GIVEREF(__pyx_tuple__9); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":989 * _import_array() * except Exception: * raise ImportError("numpy.core.multiarray failed to import") # <<<<<<<<<<<<<< * * cdef inline int import_umath() except -1: */ __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_multiarray_failed_to); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(1, 989, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__10); __Pyx_GIVEREF(__pyx_tuple__10); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":995 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< * * cdef inline int import_ufunc() except -1: */ __pyx_tuple__11 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(1, 995, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__11); __Pyx_GIVEREF(__pyx_tuple__11); /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":1001 * _import_umath() * except Exception: * raise ImportError("numpy.core.umath failed to import") # <<<<<<<<<<<<<< */ __pyx_tuple__12 = PyTuple_Pack(1, __pyx_kp_s_numpy_core_umath_failed_to_impor); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(1, 1001, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__12); __Pyx_GIVEREF(__pyx_tuple__12); /* "reproject/spherical_intersect/_overlap.pyx":19 * # @cython.wraparound(False) * # @cython.boundscheck(False) * def _reproject_slice_cython(int startx, int endx, int starty, int endy, int nx_out, int ny_out, # <<<<<<<<<<<<<< * np.ndarray[double, ndim=2, mode = "c"] xp_inout, * np.ndarray[double, ndim=2, mode = "c"] yp_inout, */ __pyx_tuple__13 = PyTuple_Pack(23, __pyx_n_s_startx, __pyx_n_s_endx, __pyx_n_s_starty, __pyx_n_s_endy, __pyx_n_s_nx_out, __pyx_n_s_ny_out, __pyx_n_s_xp_inout, __pyx_n_s_yp_inout, __pyx_n_s_xw_in, __pyx_n_s_yw_in, __pyx_n_s_xw_out, __pyx_n_s_yw_out, __pyx_n_s_array, __pyx_n_s_shape_out, __pyx_n_s_array_new, __pyx_n_s_weights, __pyx_n_s_overlap, __pyx_n_s_area_ratio, __pyx_n_s_original, __pyx_n_s_col_in, __pyx_n_s_col_out, __pyx_n_s_col_array, __pyx_n_s_col_new); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(0, 19, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__13); __Pyx_GIVEREF(__pyx_tuple__13); __pyx_codeobj__14 = (PyObject*)__Pyx_PyCode_New(14, 0, 23, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__13, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_reproject_spherical_intersect__o, __pyx_n_s_reproject_slice_cython, 19, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__14)) __PYX_ERR(0, 19, __pyx_L1_error) /* "reproject/spherical_intersect/_overlap.pyx":55 * # @cython.wraparound(False) * # @cython.boundscheck(False) * def _compute_overlap(np.ndarray[double, ndim=2] ilon, # <<<<<<<<<<<<<< * np.ndarray[double, ndim=2] ilat, * np.ndarray[double, ndim=2] olon, */ __pyx_tuple__15 = PyTuple_Pack(8, __pyx_n_s_ilon, __pyx_n_s_ilat, __pyx_n_s_olon, __pyx_n_s_olat, __pyx_n_s_i, __pyx_n_s_n, __pyx_n_s_overlap, __pyx_n_s_area_ratio); if (unlikely(!__pyx_tuple__15)) __PYX_ERR(0, 55, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__15); __Pyx_GIVEREF(__pyx_tuple__15); __pyx_codeobj__16 = (PyObject*)__Pyx_PyCode_New(4, 0, 8, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__15, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_reproject_spherical_intersect__o, __pyx_n_s_compute_overlap, 55, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__16)) __PYX_ERR(0, 55, __pyx_L1_error) __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_RefNannyFinishContext(); return -1; } static int __Pyx_InitGlobals(void) { if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error) return 0; __pyx_L1_error:; return -1; } #if PY_MAJOR_VERSION < 3 PyMODINIT_FUNC init_overlap(void); /*proto*/ PyMODINIT_FUNC init_overlap(void) #else PyMODINIT_FUNC PyInit__overlap(void); /*proto*/ PyMODINIT_FUNC PyInit__overlap(void) #endif { PyObject *__pyx_t_1 = NULL; __Pyx_RefNannyDeclarations #if CYTHON_REFNANNY __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); if (!__Pyx_RefNanny) { PyErr_Clear(); __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); if (!__Pyx_RefNanny) Py_FatalError("failed to import 'refnanny' module"); } #endif __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit__overlap(void)", 0); if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) #ifdef __Pyx_CyFunction_USED if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_FusedFunction_USED if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_Coroutine_USED if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_Generator_USED if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_StopAsyncIteration_USED if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif /*--- Library function declarations ---*/ /*--- Threads initialization code ---*/ #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS #ifdef WITH_THREAD /* Python build with threading support? */ PyEval_InitThreads(); #endif #endif /*--- Module creation code ---*/ #if PY_MAJOR_VERSION < 3 __pyx_m = Py_InitModule4("_overlap", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); #else __pyx_m = PyModule_Create(&__pyx_moduledef); #endif if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_d); __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) #if CYTHON_COMPILING_IN_PYPY Py_INCREF(__pyx_b); #endif if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); /*--- Initialize various global constants etc. ---*/ if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif if (__pyx_module_is_main_reproject__spherical_intersect___overlap) { if (PyObject_SetAttrString(__pyx_m, "__name__", __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) } #if PY_MAJOR_VERSION >= 3 { PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) if (!PyDict_GetItemString(modules, "reproject.spherical_intersect._overlap")) { if (unlikely(PyDict_SetItemString(modules, "reproject.spherical_intersect._overlap", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) } } #endif /*--- Builtin init code ---*/ if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Constants init code ---*/ if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Global init code ---*/ /*--- Variable export code ---*/ /*--- Function export code ---*/ /*--- Type init code ---*/ /*--- Type import code ---*/ __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__Pyx_BUILTIN_MODULE_NAME, "type", #if CYTHON_COMPILING_IN_PYPY sizeof(PyTypeObject), #else sizeof(PyHeapTypeObject), #endif 0); if (unlikely(!__pyx_ptype_7cpython_4type_type)) __PYX_ERR(2, 9, __pyx_L1_error) __pyx_ptype_5numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) __PYX_ERR(1, 155, __pyx_L1_error) __pyx_ptype_5numpy_flatiter = __Pyx_ImportType("numpy", "flatiter", sizeof(PyArrayIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_flatiter)) __PYX_ERR(1, 168, __pyx_L1_error) __pyx_ptype_5numpy_broadcast = __Pyx_ImportType("numpy", "broadcast", sizeof(PyArrayMultiIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_broadcast)) __PYX_ERR(1, 172, __pyx_L1_error) __pyx_ptype_5numpy_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_5numpy_ndarray)) __PYX_ERR(1, 181, __pyx_L1_error) __pyx_ptype_5numpy_ufunc = __Pyx_ImportType("numpy", "ufunc", sizeof(PyUFuncObject), 0); if (unlikely(!__pyx_ptype_5numpy_ufunc)) __PYX_ERR(1, 861, __pyx_L1_error) /*--- Variable import code ---*/ /*--- Function import code ---*/ /*--- Execution code ---*/ #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif /* "reproject/spherical_intersect/_overlap.pyx":1 * import numpy as np # <<<<<<<<<<<<<< * cimport numpy as np * import cython */ __pyx_t_1 = __Pyx_Import(__pyx_n_s_numpy, 0, -1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "reproject/spherical_intersect/_overlap.pyx":19 * # @cython.wraparound(False) * # @cython.boundscheck(False) * def _reproject_slice_cython(int startx, int endx, int starty, int endy, int nx_out, int ny_out, # <<<<<<<<<<<<<< * np.ndarray[double, ndim=2, mode = "c"] xp_inout, * np.ndarray[double, ndim=2, mode = "c"] yp_inout, */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_9reproject_19spherical_intersect_8_overlap_1_reproject_slice_cython, NULL, __pyx_n_s_reproject_spherical_intersect__o_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 19, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_reproject_slice_cython, __pyx_t_1) < 0) __PYX_ERR(0, 19, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "reproject/spherical_intersect/_overlap.pyx":55 * # @cython.wraparound(False) * # @cython.boundscheck(False) * def _compute_overlap(np.ndarray[double, ndim=2] ilon, # <<<<<<<<<<<<<< * np.ndarray[double, ndim=2] ilat, * np.ndarray[double, ndim=2] olon, */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_9reproject_19spherical_intersect_8_overlap_3_compute_overlap, NULL, __pyx_n_s_reproject_spherical_intersect__o_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 55, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_compute_overlap, __pyx_t_1) < 0) __PYX_ERR(0, 55, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "reproject/spherical_intersect/_overlap.pyx":1 * import numpy as np # <<<<<<<<<<<<<< * cimport numpy as np * import cython */ __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "../../../../miniconda3/envs/dev/lib/python3.6/site-packages/Cython/Includes/numpy/__init__.pxd":997 * raise ImportError("numpy.core.umath failed to import") * * cdef inline int import_ufunc() except -1: # <<<<<<<<<<<<<< * try: * _import_umath() */ /*--- Wrapped vars code ---*/ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); if (__pyx_m) { if (__pyx_d) { __Pyx_AddTraceback("init reproject.spherical_intersect._overlap", 0, __pyx_lineno, __pyx_filename); } Py_DECREF(__pyx_m); __pyx_m = 0; } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_ImportError, "init reproject.spherical_intersect._overlap"); } __pyx_L0:; __Pyx_RefNannyFinishContext(); #if PY_MAJOR_VERSION < 3 return; #else return __pyx_m; #endif } /* --- Runtime support code --- */ /* Refnanny */ #if CYTHON_REFNANNY static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { PyObject *m = NULL, *p = NULL; void *r = NULL; m = PyImport_ImportModule((char *)modname); if (!m) goto end; p = PyObject_GetAttrString(m, (char *)"RefNannyAPI"); if (!p) goto end; r = PyLong_AsVoidPtr(p); end: Py_XDECREF(p); Py_XDECREF(m); return (__Pyx_RefNannyAPIStruct *)r; } #endif /* GetBuiltinName */ static PyObject *__Pyx_GetBuiltinName(PyObject *name) { PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); if (unlikely(!result)) { PyErr_Format(PyExc_NameError, #if PY_MAJOR_VERSION >= 3 "name '%U' is not defined", name); #else "name '%.200s' is not defined", PyString_AS_STRING(name)); #endif } return result; } /* RaiseArgTupleInvalid */ static void __Pyx_RaiseArgtupleInvalid( const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found) { Py_ssize_t num_expected; const char *more_or_less; if (num_found < num_min) { num_expected = num_min; more_or_less = "at least"; } else { num_expected = num_max; more_or_less = "at most"; } if (exact) { more_or_less = "exactly"; } PyErr_Format(PyExc_TypeError, "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", func_name, more_or_less, num_expected, (num_expected == 1) ? "" : "s", num_found); } /* RaiseDoubleKeywords */ static void __Pyx_RaiseDoubleKeywordsError( const char* func_name, PyObject* kw_name) { PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION >= 3 "%s() got multiple values for keyword argument '%U'", func_name, kw_name); #else "%s() got multiple values for keyword argument '%s'", func_name, PyString_AsString(kw_name)); #endif } /* ParseKeywords */ static int __Pyx_ParseOptionalKeywords( PyObject *kwds, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name) { PyObject *key = 0, *value = 0; Py_ssize_t pos = 0; PyObject*** name; PyObject*** first_kw_arg = argnames + num_pos_args; while (PyDict_Next(kwds, &pos, &key, &value)) { name = first_kw_arg; while (*name && (**name != key)) name++; if (*name) { values[name-argnames] = value; continue; } name = first_kw_arg; #if PY_MAJOR_VERSION < 3 if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { while (*name) { if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) && _PyString_Eq(**name, key)) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { if ((**argname == key) || ( (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) && _PyString_Eq(**argname, key))) { goto arg_passed_twice; } argname++; } } } else #endif if (likely(PyUnicode_Check(key))) { while (*name) { int cmp = (**name == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : #endif PyUnicode_Compare(**name, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { int cmp = (**argname == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : #endif PyUnicode_Compare(**argname, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) goto arg_passed_twice; argname++; } } } else goto invalid_keyword_type; if (kwds2) { if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; } else { goto invalid_keyword; } } return 0; arg_passed_twice: __Pyx_RaiseDoubleKeywordsError(function_name, key); goto bad; invalid_keyword_type: PyErr_Format(PyExc_TypeError, "%.200s() keywords must be strings", function_name); goto bad; invalid_keyword: PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION < 3 "%.200s() got an unexpected keyword argument '%.200s'", function_name, PyString_AsString(key)); #else "%s() got an unexpected keyword argument '%U'", function_name, key); #endif bad: return -1; } /* ArgTypeTest */ static void __Pyx_RaiseArgumentTypeInvalid(const char* name, PyObject *obj, PyTypeObject *type) { PyErr_Format(PyExc_TypeError, "Argument '%.200s' has incorrect type (expected %.200s, got %.200s)", name, type->tp_name, Py_TYPE(obj)->tp_name); } static CYTHON_INLINE int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, const char *name, int exact) { if (unlikely(!type)) { PyErr_SetString(PyExc_SystemError, "Missing type object"); return 0; } if (none_allowed && obj == Py_None) return 1; else if (exact) { if (likely(Py_TYPE(obj) == type)) return 1; #if PY_MAJOR_VERSION == 2 else if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1; #endif } else { if (likely(PyObject_TypeCheck(obj, type))) return 1; } __Pyx_RaiseArgumentTypeInvalid(name, obj, type); return 0; } /* IsLittleEndian */ static CYTHON_INLINE int __Pyx_Is_Little_Endian(void) { union { uint32_t u32; uint8_t u8[4]; } S; S.u32 = 0x01020304; return S.u8[0] == 4; } /* BufferFormatCheck */ static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, __Pyx_BufFmt_StackElem* stack, __Pyx_TypeInfo* type) { stack[0].field = &ctx->root; stack[0].parent_offset = 0; ctx->root.type = type; ctx->root.name = "buffer dtype"; ctx->root.offset = 0; ctx->head = stack; ctx->head->field = &ctx->root; ctx->fmt_offset = 0; ctx->head->parent_offset = 0; ctx->new_packmode = '@'; ctx->enc_packmode = '@'; ctx->new_count = 1; ctx->enc_count = 0; ctx->enc_type = 0; ctx->is_complex = 0; ctx->is_valid_array = 0; ctx->struct_alignment = 0; while (type->typegroup == 'S') { ++ctx->head; ctx->head->field = type->fields; ctx->head->parent_offset = 0; type = type->fields->type; } } static int __Pyx_BufFmt_ParseNumber(const char** ts) { int count; const char* t = *ts; if (*t < '0' || *t > '9') { return -1; } else { count = *t++ - '0'; while (*t >= '0' && *t < '9') { count *= 10; count += *t++ - '0'; } } *ts = t; return count; } static int __Pyx_BufFmt_ExpectNumber(const char **ts) { int number = __Pyx_BufFmt_ParseNumber(ts); if (number == -1) PyErr_Format(PyExc_ValueError,\ "Does not understand character buffer dtype format string ('%c')", **ts); return number; } static void __Pyx_BufFmt_RaiseUnexpectedChar(char ch) { PyErr_Format(PyExc_ValueError, "Unexpected format string character: '%c'", ch); } static const char* __Pyx_BufFmt_DescribeTypeChar(char ch, int is_complex) { switch (ch) { case 'c': return "'char'"; case 'b': return "'signed char'"; case 'B': return "'unsigned char'"; case 'h': return "'short'"; case 'H': return "'unsigned short'"; case 'i': return "'int'"; case 'I': return "'unsigned int'"; case 'l': return "'long'"; case 'L': return "'unsigned long'"; case 'q': return "'long long'"; case 'Q': return "'unsigned long long'"; case 'f': return (is_complex ? "'complex float'" : "'float'"); case 'd': return (is_complex ? "'complex double'" : "'double'"); case 'g': return (is_complex ? "'complex long double'" : "'long double'"); case 'T': return "a struct"; case 'O': return "Python object"; case 'P': return "a pointer"; case 's': case 'p': return "a string"; case 0: return "end"; default: return "unparseable format string"; } } static size_t __Pyx_BufFmt_TypeCharToStandardSize(char ch, int is_complex) { switch (ch) { case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; case 'h': case 'H': return 2; case 'i': case 'I': case 'l': case 'L': return 4; case 'q': case 'Q': return 8; case 'f': return (is_complex ? 8 : 4); case 'd': return (is_complex ? 16 : 8); case 'g': { PyErr_SetString(PyExc_ValueError, "Python does not define a standard format string size for long double ('g').."); return 0; } case 'O': case 'P': return sizeof(void*); default: __Pyx_BufFmt_RaiseUnexpectedChar(ch); return 0; } } static size_t __Pyx_BufFmt_TypeCharToNativeSize(char ch, int is_complex) { switch (ch) { case 'c': case 'b': case 'B': case 's': case 'p': return 1; case 'h': case 'H': return sizeof(short); case 'i': case 'I': return sizeof(int); case 'l': case 'L': return sizeof(long); #ifdef HAVE_LONG_LONG case 'q': case 'Q': return sizeof(PY_LONG_LONG); #endif case 'f': return sizeof(float) * (is_complex ? 2 : 1); case 'd': return sizeof(double) * (is_complex ? 2 : 1); case 'g': return sizeof(long double) * (is_complex ? 2 : 1); case 'O': case 'P': return sizeof(void*); default: { __Pyx_BufFmt_RaiseUnexpectedChar(ch); return 0; } } } typedef struct { char c; short x; } __Pyx_st_short; typedef struct { char c; int x; } __Pyx_st_int; typedef struct { char c; long x; } __Pyx_st_long; typedef struct { char c; float x; } __Pyx_st_float; typedef struct { char c; double x; } __Pyx_st_double; typedef struct { char c; long double x; } __Pyx_st_longdouble; typedef struct { char c; void *x; } __Pyx_st_void_p; #ifdef HAVE_LONG_LONG typedef struct { char c; PY_LONG_LONG x; } __Pyx_st_longlong; #endif static size_t __Pyx_BufFmt_TypeCharToAlignment(char ch, CYTHON_UNUSED int is_complex) { switch (ch) { case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; case 'h': case 'H': return sizeof(__Pyx_st_short) - sizeof(short); case 'i': case 'I': return sizeof(__Pyx_st_int) - sizeof(int); case 'l': case 'L': return sizeof(__Pyx_st_long) - sizeof(long); #ifdef HAVE_LONG_LONG case 'q': case 'Q': return sizeof(__Pyx_st_longlong) - sizeof(PY_LONG_LONG); #endif case 'f': return sizeof(__Pyx_st_float) - sizeof(float); case 'd': return sizeof(__Pyx_st_double) - sizeof(double); case 'g': return sizeof(__Pyx_st_longdouble) - sizeof(long double); case 'P': case 'O': return sizeof(__Pyx_st_void_p) - sizeof(void*); default: __Pyx_BufFmt_RaiseUnexpectedChar(ch); return 0; } } /* These are for computing the padding at the end of the struct to align on the first member of the struct. This will probably the same as above, but we don't have any guarantees. */ typedef struct { short x; char c; } __Pyx_pad_short; typedef struct { int x; char c; } __Pyx_pad_int; typedef struct { long x; char c; } __Pyx_pad_long; typedef struct { float x; char c; } __Pyx_pad_float; typedef struct { double x; char c; } __Pyx_pad_double; typedef struct { long double x; char c; } __Pyx_pad_longdouble; typedef struct { void *x; char c; } __Pyx_pad_void_p; #ifdef HAVE_LONG_LONG typedef struct { PY_LONG_LONG x; char c; } __Pyx_pad_longlong; #endif static size_t __Pyx_BufFmt_TypeCharToPadding(char ch, CYTHON_UNUSED int is_complex) { switch (ch) { case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; case 'h': case 'H': return sizeof(__Pyx_pad_short) - sizeof(short); case 'i': case 'I': return sizeof(__Pyx_pad_int) - sizeof(int); case 'l': case 'L': return sizeof(__Pyx_pad_long) - sizeof(long); #ifdef HAVE_LONG_LONG case 'q': case 'Q': return sizeof(__Pyx_pad_longlong) - sizeof(PY_LONG_LONG); #endif case 'f': return sizeof(__Pyx_pad_float) - sizeof(float); case 'd': return sizeof(__Pyx_pad_double) - sizeof(double); case 'g': return sizeof(__Pyx_pad_longdouble) - sizeof(long double); case 'P': case 'O': return sizeof(__Pyx_pad_void_p) - sizeof(void*); default: __Pyx_BufFmt_RaiseUnexpectedChar(ch); return 0; } } static char __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) { switch (ch) { case 'c': return 'H'; case 'b': case 'h': case 'i': case 'l': case 'q': case 's': case 'p': return 'I'; case 'B': case 'H': case 'I': case 'L': case 'Q': return 'U'; case 'f': case 'd': case 'g': return (is_complex ? 'C' : 'R'); case 'O': return 'O'; case 'P': return 'P'; default: { __Pyx_BufFmt_RaiseUnexpectedChar(ch); return 0; } } } static void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) { if (ctx->head == NULL || ctx->head->field == &ctx->root) { const char* expected; const char* quote; if (ctx->head == NULL) { expected = "end"; quote = ""; } else { expected = ctx->head->field->type->name; quote = "'"; } PyErr_Format(PyExc_ValueError, "Buffer dtype mismatch, expected %s%s%s but got %s", quote, expected, quote, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex)); } else { __Pyx_StructField* field = ctx->head->field; __Pyx_StructField* parent = (ctx->head - 1)->field; PyErr_Format(PyExc_ValueError, "Buffer dtype mismatch, expected '%s' but got %s in '%s.%s'", field->type->name, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex), parent->type->name, field->name); } } static int __Pyx_BufFmt_ProcessTypeChunk(__Pyx_BufFmt_Context* ctx) { char group; size_t size, offset, arraysize = 1; if (ctx->enc_type == 0) return 0; if (ctx->head->field->type->arraysize[0]) { int i, ndim = 0; if (ctx->enc_type == 's' || ctx->enc_type == 'p') { ctx->is_valid_array = ctx->head->field->type->ndim == 1; ndim = 1; if (ctx->enc_count != ctx->head->field->type->arraysize[0]) { PyErr_Format(PyExc_ValueError, "Expected a dimension of size %zu, got %zu", ctx->head->field->type->arraysize[0], ctx->enc_count); return -1; } } if (!ctx->is_valid_array) { PyErr_Format(PyExc_ValueError, "Expected %d dimensions, got %d", ctx->head->field->type->ndim, ndim); return -1; } for (i = 0; i < ctx->head->field->type->ndim; i++) { arraysize *= ctx->head->field->type->arraysize[i]; } ctx->is_valid_array = 0; ctx->enc_count = 1; } group = __Pyx_BufFmt_TypeCharToGroup(ctx->enc_type, ctx->is_complex); do { __Pyx_StructField* field = ctx->head->field; __Pyx_TypeInfo* type = field->type; if (ctx->enc_packmode == '@' || ctx->enc_packmode == '^') { size = __Pyx_BufFmt_TypeCharToNativeSize(ctx->enc_type, ctx->is_complex); } else { size = __Pyx_BufFmt_TypeCharToStandardSize(ctx->enc_type, ctx->is_complex); } if (ctx->enc_packmode == '@') { size_t align_at = __Pyx_BufFmt_TypeCharToAlignment(ctx->enc_type, ctx->is_complex); size_t align_mod_offset; if (align_at == 0) return -1; align_mod_offset = ctx->fmt_offset % align_at; if (align_mod_offset > 0) ctx->fmt_offset += align_at - align_mod_offset; if (ctx->struct_alignment == 0) ctx->struct_alignment = __Pyx_BufFmt_TypeCharToPadding(ctx->enc_type, ctx->is_complex); } if (type->size != size || type->typegroup != group) { if (type->typegroup == 'C' && type->fields != NULL) { size_t parent_offset = ctx->head->parent_offset + field->offset; ++ctx->head; ctx->head->field = type->fields; ctx->head->parent_offset = parent_offset; continue; } if ((type->typegroup == 'H' || group == 'H') && type->size == size) { } else { __Pyx_BufFmt_RaiseExpected(ctx); return -1; } } offset = ctx->head->parent_offset + field->offset; if (ctx->fmt_offset != offset) { PyErr_Format(PyExc_ValueError, "Buffer dtype mismatch; next field is at offset %" CYTHON_FORMAT_SSIZE_T "d but %" CYTHON_FORMAT_SSIZE_T "d expected", (Py_ssize_t)ctx->fmt_offset, (Py_ssize_t)offset); return -1; } ctx->fmt_offset += size; if (arraysize) ctx->fmt_offset += (arraysize - 1) * size; --ctx->enc_count; while (1) { if (field == &ctx->root) { ctx->head = NULL; if (ctx->enc_count != 0) { __Pyx_BufFmt_RaiseExpected(ctx); return -1; } break; } ctx->head->field = ++field; if (field->type == NULL) { --ctx->head; field = ctx->head->field; continue; } else if (field->type->typegroup == 'S') { size_t parent_offset = ctx->head->parent_offset + field->offset; if (field->type->fields->type == NULL) continue; field = field->type->fields; ++ctx->head; ctx->head->field = field; ctx->head->parent_offset = parent_offset; break; } else { break; } } } while (ctx->enc_count); ctx->enc_type = 0; ctx->is_complex = 0; return 0; } static CYTHON_INLINE PyObject * __pyx_buffmt_parse_array(__Pyx_BufFmt_Context* ctx, const char** tsp) { const char *ts = *tsp; int i = 0, number; int ndim = ctx->head->field->type->ndim; ; ++ts; if (ctx->new_count != 1) { PyErr_SetString(PyExc_ValueError, "Cannot handle repeated arrays in format string"); return NULL; } if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; while (*ts && *ts != ')') { switch (*ts) { case ' ': case '\f': case '\r': case '\n': case '\t': case '\v': continue; default: break; } number = __Pyx_BufFmt_ExpectNumber(&ts); if (number == -1) return NULL; if (i < ndim && (size_t) number != ctx->head->field->type->arraysize[i]) return PyErr_Format(PyExc_ValueError, "Expected a dimension of size %zu, got %d", ctx->head->field->type->arraysize[i], number); if (*ts != ',' && *ts != ')') return PyErr_Format(PyExc_ValueError, "Expected a comma in format string, got '%c'", *ts); if (*ts == ',') ts++; i++; } if (i != ndim) return PyErr_Format(PyExc_ValueError, "Expected %d dimension(s), got %d", ctx->head->field->type->ndim, i); if (!*ts) { PyErr_SetString(PyExc_ValueError, "Unexpected end of format string, expected ')'"); return NULL; } ctx->is_valid_array = 1; ctx->new_count = 1; *tsp = ++ts; return Py_None; } static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts) { int got_Z = 0; while (1) { switch(*ts) { case 0: if (ctx->enc_type != 0 && ctx->head == NULL) { __Pyx_BufFmt_RaiseExpected(ctx); return NULL; } if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; if (ctx->head != NULL) { __Pyx_BufFmt_RaiseExpected(ctx); return NULL; } return ts; case ' ': case '\r': case '\n': ++ts; break; case '<': if (!__Pyx_Is_Little_Endian()) { PyErr_SetString(PyExc_ValueError, "Little-endian buffer not supported on big-endian compiler"); return NULL; } ctx->new_packmode = '='; ++ts; break; case '>': case '!': if (__Pyx_Is_Little_Endian()) { PyErr_SetString(PyExc_ValueError, "Big-endian buffer not supported on little-endian compiler"); return NULL; } ctx->new_packmode = '='; ++ts; break; case '=': case '@': case '^': ctx->new_packmode = *ts++; break; case 'T': { const char* ts_after_sub; size_t i, struct_count = ctx->new_count; size_t struct_alignment = ctx->struct_alignment; ctx->new_count = 1; ++ts; if (*ts != '{') { PyErr_SetString(PyExc_ValueError, "Buffer acquisition: Expected '{' after 'T'"); return NULL; } if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; ctx->enc_type = 0; ctx->enc_count = 0; ctx->struct_alignment = 0; ++ts; ts_after_sub = ts; for (i = 0; i != struct_count; ++i) { ts_after_sub = __Pyx_BufFmt_CheckString(ctx, ts); if (!ts_after_sub) return NULL; } ts = ts_after_sub; if (struct_alignment) ctx->struct_alignment = struct_alignment; } break; case '}': { size_t alignment = ctx->struct_alignment; ++ts; if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; ctx->enc_type = 0; if (alignment && ctx->fmt_offset % alignment) { ctx->fmt_offset += alignment - (ctx->fmt_offset % alignment); } } return ts; case 'x': if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; ctx->fmt_offset += ctx->new_count; ctx->new_count = 1; ctx->enc_count = 0; ctx->enc_type = 0; ctx->enc_packmode = ctx->new_packmode; ++ts; break; case 'Z': got_Z = 1; ++ts; if (*ts != 'f' && *ts != 'd' && *ts != 'g') { __Pyx_BufFmt_RaiseUnexpectedChar('Z'); return NULL; } case 'c': case 'b': case 'B': case 'h': case 'H': case 'i': case 'I': case 'l': case 'L': case 'q': case 'Q': case 'f': case 'd': case 'g': case 'O': case 'p': if (ctx->enc_type == *ts && got_Z == ctx->is_complex && ctx->enc_packmode == ctx->new_packmode) { ctx->enc_count += ctx->new_count; ctx->new_count = 1; got_Z = 0; ++ts; break; } case 's': if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; ctx->enc_count = ctx->new_count; ctx->enc_packmode = ctx->new_packmode; ctx->enc_type = *ts; ctx->is_complex = got_Z; ++ts; ctx->new_count = 1; got_Z = 0; break; case ':': ++ts; while(*ts != ':') ++ts; ++ts; break; case '(': if (!__pyx_buffmt_parse_array(ctx, &ts)) return NULL; break; default: { int number = __Pyx_BufFmt_ExpectNumber(&ts); if (number == -1) return NULL; ctx->new_count = (size_t)number; } } } } static CYTHON_INLINE void __Pyx_ZeroBuffer(Py_buffer* buf) { buf->buf = NULL; buf->obj = NULL; buf->strides = __Pyx_zeros; buf->shape = __Pyx_zeros; buf->suboffsets = __Pyx_minusones; } static CYTHON_INLINE int __Pyx_GetBufferAndValidate( Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack) { if (obj == Py_None || obj == NULL) { __Pyx_ZeroBuffer(buf); return 0; } buf->buf = NULL; if (__Pyx_GetBuffer(obj, buf, flags) == -1) goto fail; if (buf->ndim != nd) { PyErr_Format(PyExc_ValueError, "Buffer has wrong number of dimensions (expected %d, got %d)", nd, buf->ndim); goto fail; } if (!cast) { __Pyx_BufFmt_Context ctx; __Pyx_BufFmt_Init(&ctx, stack, dtype); if (!__Pyx_BufFmt_CheckString(&ctx, buf->format)) goto fail; } if ((unsigned)buf->itemsize != dtype->size) { PyErr_Format(PyExc_ValueError, "Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "d byte%s) does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "d byte%s)", buf->itemsize, (buf->itemsize > 1) ? "s" : "", dtype->name, (Py_ssize_t)dtype->size, (dtype->size > 1) ? "s" : ""); goto fail; } if (buf->suboffsets == NULL) buf->suboffsets = __Pyx_minusones; return 0; fail:; __Pyx_ZeroBuffer(buf); return -1; } static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) { if (info->buf == NULL) return; if (info->suboffsets == __Pyx_minusones) info->suboffsets = NULL; __Pyx_ReleaseBuffer(info); } /* GetModuleGlobalName */ static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name) { PyObject *result; #if !CYTHON_AVOID_BORROWED_REFS result = PyDict_GetItem(__pyx_d, name); if (likely(result)) { Py_INCREF(result); } else { #else result = PyObject_GetItem(__pyx_d, name); if (!result) { PyErr_Clear(); #endif result = __Pyx_GetBuiltinName(name); } return result; } /* PyObjectCall */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { PyObject *result; ternaryfunc call = func->ob_type->tp_call; if (unlikely(!call)) return PyObject_Call(func, arg, kw); if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) return NULL; result = (*call)(func, arg, kw); Py_LeaveRecursiveCall(); if (unlikely(!result) && unlikely(!PyErr_Occurred())) { PyErr_SetString( PyExc_SystemError, "NULL result without error in PyObject_Call"); } return result; } #endif /* ExtTypeTest */ static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { if (unlikely(!type)) { PyErr_SetString(PyExc_SystemError, "Missing type object"); return 0; } if (likely(PyObject_TypeCheck(obj, type))) return 1; PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s", Py_TYPE(obj)->tp_name, type->tp_name); return 0; } /* BufferIndexError */ static void __Pyx_RaiseBufferIndexError(int axis) { PyErr_Format(PyExc_IndexError, "Out of bounds on buffer access (axis %d)", axis); } /* PyErrFetchRestore */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; tmp_type = tstate->curexc_type; tmp_value = tstate->curexc_value; tmp_tb = tstate->curexc_traceback; tstate->curexc_type = type; tstate->curexc_value = value; tstate->curexc_traceback = tb; Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); } static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { *type = tstate->curexc_type; *value = tstate->curexc_value; *tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; } #endif /* RaiseException */ #if PY_MAJOR_VERSION < 3 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, CYTHON_UNUSED PyObject *cause) { __Pyx_PyThreadState_declare Py_XINCREF(type); if (!value || value == Py_None) value = NULL; else Py_INCREF(value); if (!tb || tb == Py_None) tb = NULL; else { Py_INCREF(tb); if (!PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto raise_error; } } if (PyType_Check(type)) { #if CYTHON_COMPILING_IN_PYPY if (!value) { Py_INCREF(Py_None); value = Py_None; } #endif PyErr_NormalizeException(&type, &value, &tb); } else { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto raise_error; } value = type; type = (PyObject*) Py_TYPE(type); Py_INCREF(type); if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto raise_error; } } __Pyx_PyThreadState_assign __Pyx_ErrRestore(type, value, tb); return; raise_error: Py_XDECREF(value); Py_XDECREF(type); Py_XDECREF(tb); return; } #else static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { PyObject* owned_instance = NULL; if (tb == Py_None) { tb = 0; } else if (tb && !PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto bad; } if (value == Py_None) value = 0; if (PyExceptionInstance_Check(type)) { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto bad; } value = type; type = (PyObject*) Py_TYPE(value); } else if (PyExceptionClass_Check(type)) { PyObject *instance_class = NULL; if (value && PyExceptionInstance_Check(value)) { instance_class = (PyObject*) Py_TYPE(value); if (instance_class != type) { int is_subclass = PyObject_IsSubclass(instance_class, type); if (!is_subclass) { instance_class = NULL; } else if (unlikely(is_subclass == -1)) { goto bad; } else { type = instance_class; } } } if (!instance_class) { PyObject *args; if (!value) args = PyTuple_New(0); else if (PyTuple_Check(value)) { Py_INCREF(value); args = value; } else args = PyTuple_Pack(1, value); if (!args) goto bad; owned_instance = PyObject_Call(type, args, NULL); Py_DECREF(args); if (!owned_instance) goto bad; value = owned_instance; if (!PyExceptionInstance_Check(value)) { PyErr_Format(PyExc_TypeError, "calling %R should have returned an instance of " "BaseException, not %R", type, Py_TYPE(value)); goto bad; } } } else { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto bad; } #if PY_VERSION_HEX >= 0x03030000 if (cause) { #else if (cause && cause != Py_None) { #endif PyObject *fixed_cause; if (cause == Py_None) { fixed_cause = NULL; } else if (PyExceptionClass_Check(cause)) { fixed_cause = PyObject_CallObject(cause, NULL); if (fixed_cause == NULL) goto bad; } else if (PyExceptionInstance_Check(cause)) { fixed_cause = cause; Py_INCREF(fixed_cause); } else { PyErr_SetString(PyExc_TypeError, "exception causes must derive from " "BaseException"); goto bad; } PyException_SetCause(value, fixed_cause); } PyErr_SetObject(type, value); if (tb) { #if CYTHON_COMPILING_IN_PYPY PyObject *tmp_type, *tmp_value, *tmp_tb; PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); Py_INCREF(tb); PyErr_Restore(tmp_type, tmp_value, tb); Py_XDECREF(tmp_tb); #else PyThreadState *tstate = PyThreadState_GET(); PyObject* tmp_tb = tstate->curexc_traceback; if (tb != tmp_tb) { Py_INCREF(tb); tstate->curexc_traceback = tb; Py_XDECREF(tmp_tb); } #endif } bad: Py_XDECREF(owned_instance); return; } #endif /* RaiseTooManyValuesToUnpack */ static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { PyErr_Format(PyExc_ValueError, "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); } /* RaiseNeedMoreValuesToUnpack */ static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { PyErr_Format(PyExc_ValueError, "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", index, (index == 1) ? "" : "s"); } /* RaiseNoneIterError */ static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); } /* SaveResetException */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { *type = tstate->exc_type; *value = tstate->exc_value; *tb = tstate->exc_traceback; Py_XINCREF(*type); Py_XINCREF(*value); Py_XINCREF(*tb); } static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = type; tstate->exc_value = value; tstate->exc_traceback = tb; Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); } #endif /* PyErrExceptionMatches */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err) { PyObject *exc_type = tstate->curexc_type; if (exc_type == err) return 1; if (unlikely(!exc_type)) return 0; return PyErr_GivenExceptionMatches(exc_type, err); } #endif /* GetException */ #if CYTHON_FAST_THREAD_STATE static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { #else static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) { #endif PyObject *local_type, *local_value, *local_tb; #if CYTHON_FAST_THREAD_STATE PyObject *tmp_type, *tmp_value, *tmp_tb; local_type = tstate->curexc_type; local_value = tstate->curexc_value; local_tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; #else PyErr_Fetch(&local_type, &local_value, &local_tb); #endif PyErr_NormalizeException(&local_type, &local_value, &local_tb); #if CYTHON_FAST_THREAD_STATE if (unlikely(tstate->curexc_type)) #else if (unlikely(PyErr_Occurred())) #endif goto bad; #if PY_MAJOR_VERSION >= 3 if (local_tb) { if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) goto bad; } #endif Py_XINCREF(local_tb); Py_XINCREF(local_type); Py_XINCREF(local_value); *type = local_type; *value = local_value; *tb = local_tb; #if CYTHON_FAST_THREAD_STATE tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = local_type; tstate->exc_value = local_value; tstate->exc_traceback = local_tb; Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); #else PyErr_SetExcInfo(local_type, local_value, local_tb); #endif return 0; bad: *type = 0; *value = 0; *tb = 0; Py_XDECREF(local_type); Py_XDECREF(local_value); Py_XDECREF(local_tb); return -1; } /* Import */ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { PyObject *empty_list = 0; PyObject *module = 0; PyObject *global_dict = 0; PyObject *empty_dict = 0; PyObject *list; #if PY_VERSION_HEX < 0x03030000 PyObject *py_import; py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); if (!py_import) goto bad; #endif if (from_list) list = from_list; else { empty_list = PyList_New(0); if (!empty_list) goto bad; list = empty_list; } global_dict = PyModule_GetDict(__pyx_m); if (!global_dict) goto bad; empty_dict = PyDict_New(); if (!empty_dict) goto bad; { #if PY_MAJOR_VERSION >= 3 if (level == -1) { if (strchr(__Pyx_MODULE_NAME, '.')) { #if PY_VERSION_HEX < 0x03030000 PyObject *py_level = PyInt_FromLong(1); if (!py_level) goto bad; module = PyObject_CallFunctionObjArgs(py_import, name, global_dict, empty_dict, list, py_level, NULL); Py_DECREF(py_level); #else module = PyImport_ImportModuleLevelObject( name, global_dict, empty_dict, list, 1); #endif if (!module) { if (!PyErr_ExceptionMatches(PyExc_ImportError)) goto bad; PyErr_Clear(); } } level = 0; } #endif if (!module) { #if PY_VERSION_HEX < 0x03030000 PyObject *py_level = PyInt_FromLong(level); if (!py_level) goto bad; module = PyObject_CallFunctionObjArgs(py_import, name, global_dict, empty_dict, list, py_level, NULL); Py_DECREF(py_level); #else module = PyImport_ImportModuleLevelObject( name, global_dict, empty_dict, list, level); #endif } } bad: #if PY_VERSION_HEX < 0x03030000 Py_XDECREF(py_import); #endif Py_XDECREF(empty_list); Py_XDECREF(empty_dict); return module; } /* CLineInTraceback */ static int __Pyx_CLineForTraceback(int c_line) { #ifdef CYTHON_CLINE_IN_TRACEBACK return ((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0; #else PyObject *use_cline; #if CYTHON_COMPILING_IN_CPYTHON PyObject **cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); if (likely(cython_runtime_dict)) { use_cline = PyDict_GetItem(*cython_runtime_dict, __pyx_n_s_cline_in_traceback); } else #endif { PyObject *ptype, *pvalue, *ptraceback; PyObject *use_cline_obj; PyErr_Fetch(&ptype, &pvalue, &ptraceback); use_cline_obj = __Pyx_PyObject_GetAttrStr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); if (use_cline_obj) { use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; Py_DECREF(use_cline_obj); } else { use_cline = NULL; } PyErr_Restore(ptype, pvalue, ptraceback); } if (!use_cline) { c_line = 0; PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); } else if (PyObject_Not(use_cline) != 0) { c_line = 0; } return c_line; #endif } /* CodeObjectCache */ static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { int start = 0, mid = 0, end = count - 1; if (end >= 0 && code_line > entries[end].code_line) { return count; } while (start < end) { mid = start + (end - start) / 2; if (code_line < entries[mid].code_line) { end = mid; } else if (code_line > entries[mid].code_line) { start = mid + 1; } else { return mid; } } if (code_line <= entries[mid].code_line) { return mid; } else { return mid + 1; } } static PyCodeObject *__pyx_find_code_object(int code_line) { PyCodeObject* code_object; int pos; if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { return NULL; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { return NULL; } code_object = __pyx_code_cache.entries[pos].code_object; Py_INCREF(code_object); return code_object; } static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { int pos, i; __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; if (unlikely(!code_line)) { return; } if (unlikely(!entries)) { entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); if (likely(entries)) { __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = 64; __pyx_code_cache.count = 1; entries[0].code_line = code_line; entries[0].code_object = code_object; Py_INCREF(code_object); } return; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { PyCodeObject* tmp = entries[pos].code_object; entries[pos].code_object = code_object; Py_DECREF(tmp); return; } if (__pyx_code_cache.count == __pyx_code_cache.max_count) { int new_max = __pyx_code_cache.max_count + 64; entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( __pyx_code_cache.entries, (size_t)new_max*sizeof(__Pyx_CodeObjectCacheEntry)); if (unlikely(!entries)) { return; } __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = new_max; } for (i=__pyx_code_cache.count; i>pos; i--) { entries[i] = entries[i-1]; } entries[pos].code_line = code_line; entries[pos].code_object = code_object; __pyx_code_cache.count++; Py_INCREF(code_object); } /* AddTraceback */ #include "compile.h" #include "frameobject.h" #include "traceback.h" static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyObject *py_srcfile = 0; PyObject *py_funcname = 0; #if PY_MAJOR_VERSION < 3 py_srcfile = PyString_FromString(filename); #else py_srcfile = PyUnicode_FromString(filename); #endif if (!py_srcfile) goto bad; if (c_line) { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #else py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #endif } else { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromString(funcname); #else py_funcname = PyUnicode_FromString(funcname); #endif } if (!py_funcname) goto bad; py_code = __Pyx_PyCode_New( 0, 0, 0, 0, 0, __pyx_empty_bytes, /*PyObject *code,*/ __pyx_empty_tuple, /*PyObject *consts,*/ __pyx_empty_tuple, /*PyObject *names,*/ __pyx_empty_tuple, /*PyObject *varnames,*/ __pyx_empty_tuple, /*PyObject *freevars,*/ __pyx_empty_tuple, /*PyObject *cellvars,*/ py_srcfile, /*PyObject *filename,*/ py_funcname, /*PyObject *name,*/ py_line, __pyx_empty_bytes /*PyObject *lnotab*/ ); Py_DECREF(py_srcfile); Py_DECREF(py_funcname); return py_code; bad: Py_XDECREF(py_srcfile); Py_XDECREF(py_funcname); return NULL; } static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyFrameObject *py_frame = 0; if (c_line) { c_line = __Pyx_CLineForTraceback(c_line); } py_code = __pyx_find_code_object(c_line ? -c_line : py_line); if (!py_code) { py_code = __Pyx_CreateCodeObjectForTraceback( funcname, c_line, py_line, filename); if (!py_code) goto bad; __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); } py_frame = PyFrame_New( PyThreadState_GET(), /*PyThreadState *tstate,*/ py_code, /*PyCodeObject *code,*/ __pyx_d, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (!py_frame) goto bad; __Pyx_PyFrame_SetLineNumber(py_frame, py_line); PyTraceBack_Here(py_frame); bad: Py_XDECREF(py_code); Py_XDECREF(py_frame); } #if PY_MAJOR_VERSION < 3 static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) { if (PyObject_CheckBuffer(obj)) return PyObject_GetBuffer(obj, view, flags); if (PyObject_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) return __pyx_pw_5numpy_7ndarray_1__getbuffer__(obj, view, flags); PyErr_Format(PyExc_TypeError, "'%.200s' does not have the buffer interface", Py_TYPE(obj)->tp_name); return -1; } static void __Pyx_ReleaseBuffer(Py_buffer *view) { PyObject *obj = view->obj; if (!obj) return; if (PyObject_CheckBuffer(obj)) { PyBuffer_Release(view); return; } if ((0)) {} else if (PyObject_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) __pyx_pw_5numpy_7ndarray_3__releasebuffer__(obj, view); view->obj = NULL; Py_DECREF(obj); } #endif /* CIntFromPyVerify */ #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) #define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) #define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ {\ func_type value = func_value;\ if (sizeof(target_type) < sizeof(func_type)) {\ if (unlikely(value != (func_type) (target_type) value)) {\ func_type zero = 0;\ if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ return (target_type) -1;\ if (is_unsigned && unlikely(value < zero))\ goto raise_neg_overflow;\ else\ goto raise_overflow;\ }\ }\ return (target_type) value;\ } /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { const int neg_one = (int) -1, const_zero = (int) 0; const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(int) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(int) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif } } else { if (sizeof(int) <= sizeof(long)) { return PyInt_FromLong((long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { return PyLong_FromLongLong((PY_LONG_LONG) value); #endif } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; return _PyLong_FromByteArray(bytes, sizeof(int), little, !is_unsigned); } } /* Declarations */ #if CYTHON_CCOMPLEX #ifdef __cplusplus static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { return ::std::complex< float >(x, y); } #else static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { return x + y*(__pyx_t_float_complex)_Complex_I; } #endif #else static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { __pyx_t_float_complex z; z.real = x; z.imag = y; return z; } #endif /* Arithmetic */ #if CYTHON_CCOMPLEX #else static CYTHON_INLINE int __Pyx_c_eq_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { return (a.real == b.real) && (a.imag == b.imag); } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sum_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; z.real = a.real + b.real; z.imag = a.imag + b.imag; return z; } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_diff_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; z.real = a.real - b.real; z.imag = a.imag - b.imag; return z; } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prod_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; z.real = a.real * b.real - a.imag * b.imag; z.imag = a.real * b.imag + a.imag * b.real; return z; } #if 1 static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { if (b.imag == 0) { return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); } else if (fabsf(b.real) >= fabsf(b.imag)) { if (b.real == 0 && b.imag == 0) { return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.imag); } else { float r = b.imag / b.real; float s = 1.0 / (b.real + b.imag * r); return __pyx_t_float_complex_from_parts( (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); } } else { float r = b.real / b.imag; float s = 1.0 / (b.imag + b.real * r); return __pyx_t_float_complex_from_parts( (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); } } #else static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quot_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { if (b.imag == 0) { return __pyx_t_float_complex_from_parts(a.real / b.real, a.imag / b.real); } else { float denom = b.real * b.real + b.imag * b.imag; return __pyx_t_float_complex_from_parts( (a.real * b.real + a.imag * b.imag) / denom, (a.imag * b.real - a.real * b.imag) / denom); } } #endif static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_neg_float(__pyx_t_float_complex a) { __pyx_t_float_complex z; z.real = -a.real; z.imag = -a.imag; return z; } static CYTHON_INLINE int __Pyx_c_is_zero_float(__pyx_t_float_complex a) { return (a.real == 0) && (a.imag == 0); } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conj_float(__pyx_t_float_complex a) { __pyx_t_float_complex z; z.real = a.real; z.imag = -a.imag; return z; } #if 1 static CYTHON_INLINE float __Pyx_c_abs_float(__pyx_t_float_complex z) { #if !defined(HAVE_HYPOT) || defined(_MSC_VER) return sqrtf(z.real*z.real + z.imag*z.imag); #else return hypotf(z.real, z.imag); #endif } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_pow_float(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; float r, lnr, theta, z_r, z_theta; if (b.imag == 0 && b.real == (int)b.real) { if (b.real < 0) { float denom = a.real * a.real + a.imag * a.imag; a.real = a.real / denom; a.imag = -a.imag / denom; b.real = -b.real; } switch ((int)b.real) { case 0: z.real = 1; z.imag = 0; return z; case 1: return a; case 2: z = __Pyx_c_prod_float(a, a); return __Pyx_c_prod_float(a, a); case 3: z = __Pyx_c_prod_float(a, a); return __Pyx_c_prod_float(z, a); case 4: z = __Pyx_c_prod_float(a, a); return __Pyx_c_prod_float(z, z); } } if (a.imag == 0) { if (a.real == 0) { return a; } else if (b.imag == 0) { z.real = powf(a.real, b.real); z.imag = 0; return z; } else if (a.real > 0) { r = a.real; theta = 0; } else { r = -a.real; theta = atan2f(0, -1); } } else { r = __Pyx_c_abs_float(a); theta = atan2f(a.imag, a.real); } lnr = logf(r); z_r = expf(lnr * b.real - theta * b.imag); z_theta = theta * b.real + lnr * b.imag; z.real = z_r * cosf(z_theta); z.imag = z_r * sinf(z_theta); return z; } #endif #endif /* Declarations */ #if CYTHON_CCOMPLEX #ifdef __cplusplus static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { return ::std::complex< double >(x, y); } #else static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { return x + y*(__pyx_t_double_complex)_Complex_I; } #endif #else static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { __pyx_t_double_complex z; z.real = x; z.imag = y; return z; } #endif /* Arithmetic */ #if CYTHON_CCOMPLEX #else static CYTHON_INLINE int __Pyx_c_eq_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { return (a.real == b.real) && (a.imag == b.imag); } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; z.real = a.real + b.real; z.imag = a.imag + b.imag; return z; } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; z.real = a.real - b.real; z.imag = a.imag - b.imag; return z; } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; z.real = a.real * b.real - a.imag * b.imag; z.imag = a.real * b.imag + a.imag * b.real; return z; } #if 1 static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { if (b.imag == 0) { return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); } else if (fabs(b.real) >= fabs(b.imag)) { if (b.real == 0 && b.imag == 0) { return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.imag); } else { double r = b.imag / b.real; double s = 1.0 / (b.real + b.imag * r); return __pyx_t_double_complex_from_parts( (a.real + a.imag * r) * s, (a.imag - a.real * r) * s); } } else { double r = b.real / b.imag; double s = 1.0 / (b.imag + b.real * r); return __pyx_t_double_complex_from_parts( (a.real * r + a.imag) * s, (a.imag * r - a.real) * s); } } #else static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { if (b.imag == 0) { return __pyx_t_double_complex_from_parts(a.real / b.real, a.imag / b.real); } else { double denom = b.real * b.real + b.imag * b.imag; return __pyx_t_double_complex_from_parts( (a.real * b.real + a.imag * b.imag) / denom, (a.imag * b.real - a.real * b.imag) / denom); } } #endif static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg_double(__pyx_t_double_complex a) { __pyx_t_double_complex z; z.real = -a.real; z.imag = -a.imag; return z; } static CYTHON_INLINE int __Pyx_c_is_zero_double(__pyx_t_double_complex a) { return (a.real == 0) && (a.imag == 0); } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj_double(__pyx_t_double_complex a) { __pyx_t_double_complex z; z.real = a.real; z.imag = -a.imag; return z; } #if 1 static CYTHON_INLINE double __Pyx_c_abs_double(__pyx_t_double_complex z) { #if !defined(HAVE_HYPOT) || defined(_MSC_VER) return sqrt(z.real*z.real + z.imag*z.imag); #else return hypot(z.real, z.imag); #endif } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow_double(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; double r, lnr, theta, z_r, z_theta; if (b.imag == 0 && b.real == (int)b.real) { if (b.real < 0) { double denom = a.real * a.real + a.imag * a.imag; a.real = a.real / denom; a.imag = -a.imag / denom; b.real = -b.real; } switch ((int)b.real) { case 0: z.real = 1; z.imag = 0; return z; case 1: return a; case 2: z = __Pyx_c_prod_double(a, a); return __Pyx_c_prod_double(a, a); case 3: z = __Pyx_c_prod_double(a, a); return __Pyx_c_prod_double(z, a); case 4: z = __Pyx_c_prod_double(a, a); return __Pyx_c_prod_double(z, z); } } if (a.imag == 0) { if (a.real == 0) { return a; } else if (b.imag == 0) { z.real = pow(a.real, b.real); z.imag = 0; return z; } else if (a.real > 0) { r = a.real; theta = 0; } else { r = -a.real; theta = atan2(0, -1); } } else { r = __Pyx_c_abs_double(a); theta = atan2(a.imag, a.real); } lnr = log(r); z_r = exp(lnr * b.real - theta * b.imag); z_theta = theta * b.real + lnr * b.imag; z.real = z_r * cos(z_theta); z.imag = z_r * sin(z_theta); return z; } #endif #endif /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY_TYPES value) { const enum NPY_TYPES neg_one = (enum NPY_TYPES) -1, const_zero = (enum NPY_TYPES) 0; const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(enum NPY_TYPES) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif } } else { if (sizeof(enum NPY_TYPES) <= sizeof(long)) { return PyInt_FromLong((long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(enum NPY_TYPES) <= sizeof(PY_LONG_LONG)) { return PyLong_FromLongLong((PY_LONG_LONG) value); #endif } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; return _PyLong_FromByteArray(bytes, sizeof(enum NPY_TYPES), little, !is_unsigned); } } /* CIntFromPy */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { const int neg_one = (int) -1, const_zero = (int) 0; const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(int) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (int) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (int) 0; case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) case 2: if (8 * sizeof(int) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 3: if (8 * sizeof(int) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 4: if (8 * sizeof(int) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; } #endif #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (int) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if (sizeof(int) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (int) 0; case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) case -2: if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 2: if (8 * sizeof(int) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -3: if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 3: if (8 * sizeof(int) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -4: if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 4: if (8 * sizeof(int) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; } #endif if (sizeof(int) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else int val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (int) -1; } } else { int val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (int) -1; val = __Pyx_PyInt_As_int(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to int"); return (int) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to int"); return (int) -1; } /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { const long neg_one = (long) -1, const_zero = (long) 0; const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(long) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(long) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif } } else { if (sizeof(long) <= sizeof(long)) { return PyInt_FromLong((long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { return PyLong_FromLongLong((PY_LONG_LONG) value); #endif } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; return _PyLong_FromByteArray(bytes, sizeof(long), little, !is_unsigned); } } /* CIntFromPy */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { const long neg_one = (long) -1, const_zero = (long) 0; const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(long) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (long) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (long) 0; case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) case 2: if (8 * sizeof(long) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 3: if (8 * sizeof(long) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 4: if (8 * sizeof(long) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; } #endif #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (long) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if (sizeof(long) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (long) 0; case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) case -2: if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 2: if (8 * sizeof(long) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -3: if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 3: if (8 * sizeof(long) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -4: if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 4: if (8 * sizeof(long) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; } #endif if (sizeof(long) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else long val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (long) -1; } } else { long val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (long) -1; val = __Pyx_PyInt_As_long(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to long"); return (long) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long) -1; } /* CheckBinaryVersion */ static int __Pyx_check_binary_version(void) { char ctversion[4], rtversion[4]; PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion()); if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) { char message[200]; PyOS_snprintf(message, sizeof(message), "compiletime version %s of module '%.100s' " "does not match runtime version %s", ctversion, __Pyx_MODULE_NAME, rtversion); return PyErr_WarnEx(NULL, message, 1); } return 0; } /* ModuleImport */ #ifndef __PYX_HAVE_RT_ImportModule #define __PYX_HAVE_RT_ImportModule static PyObject *__Pyx_ImportModule(const char *name) { PyObject *py_name = 0; PyObject *py_module = 0; py_name = __Pyx_PyIdentifier_FromString(name); if (!py_name) goto bad; py_module = PyImport_Import(py_name); Py_DECREF(py_name); return py_module; bad: Py_XDECREF(py_name); return 0; } #endif /* TypeImport */ #ifndef __PYX_HAVE_RT_ImportType #define __PYX_HAVE_RT_ImportType static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, size_t size, int strict) { PyObject *py_module = 0; PyObject *result = 0; PyObject *py_name = 0; char warning[200]; Py_ssize_t basicsize; #ifdef Py_LIMITED_API PyObject *py_basicsize; #endif py_module = __Pyx_ImportModule(module_name); if (!py_module) goto bad; py_name = __Pyx_PyIdentifier_FromString(class_name); if (!py_name) goto bad; result = PyObject_GetAttr(py_module, py_name); Py_DECREF(py_name); py_name = 0; Py_DECREF(py_module); py_module = 0; if (!result) goto bad; if (!PyType_Check(result)) { PyErr_Format(PyExc_TypeError, "%.200s.%.200s is not a type object", module_name, class_name); goto bad; } #ifndef Py_LIMITED_API basicsize = ((PyTypeObject *)result)->tp_basicsize; #else py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); if (!py_basicsize) goto bad; basicsize = PyLong_AsSsize_t(py_basicsize); Py_DECREF(py_basicsize); py_basicsize = 0; if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) goto bad; #endif if (!strict && (size_t)basicsize > size) { PyOS_snprintf(warning, sizeof(warning), "%s.%s size changed, may indicate binary incompatibility. Expected %zd, got %zd", module_name, class_name, basicsize, size); if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; } else if ((size_t)basicsize != size) { PyErr_Format(PyExc_ValueError, "%.200s.%.200s has the wrong size, try recompiling. Expected %zd, got %zd", module_name, class_name, basicsize, size); goto bad; } return (PyTypeObject *)result; bad: Py_XDECREF(py_module); Py_XDECREF(result); return NULL; } #endif /* InitStrings */ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { while (t->p) { #if PY_MAJOR_VERSION < 3 if (t->is_unicode) { *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); } else if (t->intern) { *t->p = PyString_InternFromString(t->s); } else { *t->p = PyString_FromStringAndSize(t->s, t->n - 1); } #else if (t->is_unicode | t->is_str) { if (t->intern) { *t->p = PyUnicode_InternFromString(t->s); } else if (t->encoding) { *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); } else { *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); } } else { *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); } #endif if (!*t->p) return -1; if (PyObject_Hash(*t->p) == -1) PyErr_Clear(); ++t; } return 0; } static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); } static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { Py_ssize_t ignore; return __Pyx_PyObject_AsStringAndSize(o, &ignore); } static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { #if CYTHON_COMPILING_IN_CPYTHON && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) if ( #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII __Pyx_sys_getdefaultencoding_not_ascii && #endif PyUnicode_Check(o)) { #if PY_VERSION_HEX < 0x03030000 char* defenc_c; PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); if (!defenc) return NULL; defenc_c = PyBytes_AS_STRING(defenc); #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII { char* end = defenc_c + PyBytes_GET_SIZE(defenc); char* c; for (c = defenc_c; c < end; c++) { if ((unsigned char) (*c) >= 128) { PyUnicode_AsASCIIString(o); return NULL; } } } #endif *length = PyBytes_GET_SIZE(defenc); return defenc_c; #else if (__Pyx_PyUnicode_READY(o) == -1) return NULL; #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII if (PyUnicode_IS_ASCII(o)) { *length = PyUnicode_GET_LENGTH(o); return PyUnicode_AsUTF8(o); } else { PyUnicode_AsASCIIString(o); return NULL; } #else return PyUnicode_AsUTF8AndSize(o, length); #endif #endif } else #endif #if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) if (PyByteArray_Check(o)) { *length = PyByteArray_GET_SIZE(o); return PyByteArray_AS_STRING(o); } else #endif { char* result; int r = PyBytes_AsStringAndSize(o, &result, length); if (unlikely(r < 0)) { return NULL; } else { return result; } } } static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { int is_true = x == Py_True; if (is_true | (x == Py_False) | (x == Py_None)) return is_true; else return PyObject_IsTrue(x); } static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { #if CYTHON_USE_TYPE_SLOTS PyNumberMethods *m; #endif const char *name = NULL; PyObject *res = NULL; #if PY_MAJOR_VERSION < 3 if (PyInt_Check(x) || PyLong_Check(x)) #else if (PyLong_Check(x)) #endif return __Pyx_NewRef(x); #if CYTHON_USE_TYPE_SLOTS m = Py_TYPE(x)->tp_as_number; #if PY_MAJOR_VERSION < 3 if (m && m->nb_int) { name = "int"; res = PyNumber_Int(x); } else if (m && m->nb_long) { name = "long"; res = PyNumber_Long(x); } #else if (m && m->nb_int) { name = "int"; res = PyNumber_Long(x); } #endif #else res = PyNumber_Int(x); #endif if (res) { #if PY_MAJOR_VERSION < 3 if (!PyInt_Check(res) && !PyLong_Check(res)) { #else if (!PyLong_Check(res)) { #endif PyErr_Format(PyExc_TypeError, "__%.4s__ returned non-%.4s (type %.200s)", name, name, Py_TYPE(res)->tp_name); Py_DECREF(res); return NULL; } } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "an integer is required"); } return res; } static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { Py_ssize_t ival; PyObject *x; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_CheckExact(b))) { if (sizeof(Py_ssize_t) >= sizeof(long)) return PyInt_AS_LONG(b); else return PyInt_AsSsize_t(x); } #endif if (likely(PyLong_CheckExact(b))) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)b)->ob_digit; const Py_ssize_t size = Py_SIZE(b); if (likely(__Pyx_sst_abs(size) <= 1)) { ival = likely(size) ? digits[0] : 0; if (size == -1) ival = -ival; return ival; } else { switch (size) { case 2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; } } #endif return PyLong_AsSsize_t(b); } x = PyNumber_Index(b); if (!x) return -1; ival = PyInt_AsSsize_t(x); Py_DECREF(x); return ival; } static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { return PyInt_FromSize_t(ival); } #endif /* Py_PYTHON_H */ reproject-0.3.2/reproject/spherical_intersect/core.py0000644000077000000240000001471612724021736022775 0ustar tomstaff00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst from __future__ import (absolute_import, division, print_function, unicode_literals) import signal import numpy as np from ..wcs_utils import convert_world_coordinates from ._overlap import _compute_overlap def _init_worker(): """ Function to disable ctrl+c in the worker processes. """ signal.signal(signal.SIGINT, signal.SIG_IGN) def _reproject_slice(args): from ._overlap import _reproject_slice_cython return _reproject_slice_cython(*args) def _reproject_celestial(array, wcs_in, wcs_out, shape_out, parallel=True, _legacy=False): # Check the parallel flag. if type(parallel) != bool and type(parallel) != int: raise TypeError("The 'parallel' flag must be a boolean or integral value") if type(parallel) == int: # parallel is a number of processes. if parallel <= 0: raise ValueError("The number of processors to use must be strictly positive") nproc = parallel else: # parallel is a boolean flag. nproc = None here means automatically selected # number of processes. nproc = None if parallel else 1 # Convert input array to float values. If this comes from a FITS, it might have # float32 as value type and that can break things in Cython array = np.asarray(array, dtype=float) # TODO: make this work for n-dimensional arrays if wcs_in.naxis != 2: raise NotImplementedError("Only 2-dimensional arrays can be reprojected at this time") # TODO: at the moment, we compute the coordinates of all of the corners, # but we might want to do it in steps for large images. # Start off by finding the world position of all the corners of the input # image in world coordinates ny_in, nx_in = array.shape x = np.arange(nx_in + 1.) - 0.5 y = np.arange(ny_in + 1.) - 0.5 xp_in, yp_in = np.meshgrid(x, y) xw_in, yw_in = wcs_in.wcs_pix2world(xp_in, yp_in, 0) # Now compute the world positions of all the corners in the output header ny_out, nx_out = shape_out x = np.arange(nx_out + 1.) - 0.5 y = np.arange(ny_out + 1.) - 0.5 xp_out, yp_out = np.meshgrid(x, y) xw_out, yw_out = wcs_out.wcs_pix2world(xp_out, yp_out, 0) # Convert the input world coordinates to the frame of the output world # coordinates. xw_in, yw_in = convert_world_coordinates(xw_in, yw_in, wcs_in, wcs_out) # Finally, compute the pixel positions in the *output* image of the pixels # from the *input* image. xp_inout, yp_inout = wcs_out.wcs_world2pix(xw_in, yw_in, 0) if _legacy: # Create output image array_new = np.zeros(shape_out) weights = np.zeros(shape_out) for i in range(nx_in): for j in range(ny_in): # For every input pixel we find the position in the output image in # pixel coordinates, then use the full range of overlapping output # pixels with the exact overlap function. xmin = int(min(xp_inout[j, i], xp_inout[j, i + 1], xp_inout[j + 1, i + 1], xp_inout[j + 1, i]) + 0.5) xmax = int(max(xp_inout[j, i], xp_inout[j, i + 1], xp_inout[j + 1, i + 1], xp_inout[j + 1, i]) + 0.5) ymin = int(min(yp_inout[j, i], yp_inout[j, i + 1], yp_inout[j + 1, i + 1], yp_inout[j + 1, i]) + 0.5) ymax = int(max(yp_inout[j, i], yp_inout[j, i + 1], yp_inout[j + 1, i + 1], yp_inout[j + 1, i]) + 0.5) ilon = [[xw_in[j, i], xw_in[j, i + 1], xw_in[j + 1, i + 1], xw_in[j + 1, i]][::-1]] ilat = [[yw_in[j, i], yw_in[j, i + 1], yw_in[j + 1, i + 1], yw_in[j + 1, i]][::-1]] ilon = np.radians(np.array(ilon)) ilat = np.radians(np.array(ilat)) xmin = max(0, xmin) xmax = min(nx_out - 1, xmax) ymin = max(0, ymin) ymax = min(ny_out - 1, ymax) for ii in range(xmin, xmax + 1): for jj in range(ymin, ymax + 1): olon = [[xw_out[jj, ii], xw_out[jj, ii + 1], xw_out[jj + 1, ii + 1], xw_out[jj + 1, ii]][::-1]] olat = [[yw_out[jj, ii], yw_out[jj, ii + 1], yw_out[jj + 1, ii + 1], yw_out[jj + 1, ii]][::-1]] olon = np.radians(np.array(olon)) olat = np.radians(np.array(olat)) # Figure out the fraction of the input pixel that makes it # to the output pixel at this position. overlap, _ = _compute_overlap(ilon, ilat, olon, olat) original, _ = _compute_overlap(olon, olat, olon, olat) array_new[jj, ii] += array[j, i] * overlap / original weights[jj, ii] += overlap / original array_new /= weights return array_new, weights # Put together the parameters common both to the serial and parallel implementations. The aca # function is needed to enforce that the array will be contiguous when passed to the low-level # raw C function, otherwise Cython might complain. aca = np.ascontiguousarray common_func_par = [0, ny_in, nx_out, ny_out, aca(xp_inout), aca(yp_inout), aca(xw_in), aca(yw_in), aca(xw_out), aca(yw_out), aca(array), shape_out] if nproc == 1: array_new, weights = _reproject_slice([0, nx_in] + common_func_par) with np.errstate(invalid='ignore'): array_new /= weights return array_new, weights elif (nproc is None or nproc > 1): from multiprocessing import Pool, cpu_count # If needed, establish the number of processors to use. if nproc is None: nproc = cpu_count() # Prime each process in the pool with a small function that disables # the ctrl+c signal in the child process. pool = Pool(nproc, _init_worker) inputs = [] for i in range(nproc): start = int(nx_in) // nproc * i end = int(nx_in) if i == nproc - 1 else int(nx_in) // nproc * (i + 1) inputs.append([start, end] + common_func_par) results = pool.map(_reproject_slice, inputs) pool.close() array_new, weights = zip(*results) array_new = sum(array_new) weights = sum(weights) with np.errstate(invalid='ignore'): array_new /= weights return array_new, weights reproject-0.3.2/reproject/spherical_intersect/high_level.py0000644000077000000240000000562012724021736024145 0ustar tomstaff00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst from __future__ import (absolute_import, division, print_function, unicode_literals) from ..utils import parse_input_data, parse_output_projection from .core import _reproject_celestial __all__ = ['reproject_exact'] def reproject_exact(input_data, output_projection, shape_out=None, hdu_in=None, parallel=True): """ Reproject data to a new projection using flux-conserving spherical polygon intersection (this is the slowest algorithm). Parameters ---------- input_data : str or `~astropy.io.fits.HDUList` or `~astropy.io.fits.PrimaryHDU` or `~astropy.io.fits.ImageHDU` or tuple The input data to reproject. This can be: * The name of a FITS file * An `~astropy.io.fits.HDUList` object * An image HDU object such as a `~astropy.io.fits.PrimaryHDU`, `~astropy.io.fits.ImageHDU`, or `~astropy.io.fits.CompImageHDU` instance * A tuple where the first element is a `~numpy.ndarray` and the second element is either a `~astropy.wcs.WCS` or a `~astropy.io.fits.Header` object output_projection : `~astropy.wcs.WCS` or `~astropy.io.fits.Header` The output projection, which can be either a `~astropy.wcs.WCS` or a `~astropy.io.fits.Header` instance. shape_out : tuple, optional If ``output_projection`` is a `~astropy.wcs.WCS` instance, the shape of the output data should be specified separately. hdu_in : int or str, optional If ``input_data`` is a FITS file or an `~astropy.io.fits.HDUList` instance, specifies the HDU to use. parallel : bool or int Flag for parallel implementation. If ``True``, a parallel implementation is chosen, the number of processes selected automatically to be equal to the number of logical CPUs detected on the machine. If ``False``, a serial implementation is chosen. If the flag is a positive integer ``n`` greater than one, a parallel implementation using ``n`` processes is chosen. Returns ------- array_new : `~numpy.ndarray` The reprojected array footprint : `~numpy.ndarray` Footprint of the input array in the output array. Values of 0 indicate no coverage or valid values in the input image, while values of 1 indicate valid values. Intermediate values indicate partial coverage. """ array_in, wcs_in = parse_input_data(input_data, hdu_in=hdu_in) wcs_out, shape_out = parse_output_projection(output_projection, shape_out=shape_out) if wcs_in.has_celestial and wcs_in.naxis == 2: return _reproject_celestial(array_in, wcs_in, wcs_out, shape_out=shape_out, parallel=parallel) else: raise NotImplementedError("Currently only data with a 2-d celestial WCS can be reprojected using flux-conserving algorithm") reproject-0.3.2/reproject/spherical_intersect/mNaN.h0000644000077000000240000000027212737263231022467 0ustar tomstaff00000000000000#ifndef _BSD_SOURCE #define _BSD_SOURCE #endif #include #if defined(_MSC_VER) #define mNaN(x) _isnan(x) || !_finite(x) #else #define mNaN(x) isnan(x) || !finite(x) #endif reproject-0.3.2/reproject/spherical_intersect/overlap.py0000644000077000000240000000233212724021736023504 0ustar tomstaff00000000000000from __future__ import (absolute_import, division, print_function, unicode_literals) import numpy as np from ._overlap import _compute_overlap __all__ = ['compute_overlap'] def compute_overlap(ilon, ilat, olon, olat): """Compute the overlap between two 'pixels' in spherical coordinates. Parameters ---------- ilon : np.ndarray with shape (N, 4) The longitudes (in radians) defining the four corners of the input pixel ilat : np.ndarray with shape (N, 4) The latitudes (in radians) defining the four corners of the input pixel olon : np.ndarray with shape (N, 4) The longitudes (in radians) defining the four corners of the output pixel olat : np.ndarray with shape (N, 4) The latitudes (in radians) defining the four corners of the output pixel Returns ------- overlap : np.ndarray of length N Pixel overlap solid angle in steradians area_ratio : np.ndarray of length N TODO """ ilon = np.asarray(ilon, dtype=np.float64) ilat = np.asarray(ilat, dtype=np.float64) olon = np.asarray(olon, dtype=np.float64) olat = np.asarray(olat, dtype=np.float64) return _compute_overlap(ilon, ilat, olon, olat) reproject-0.3.2/reproject/spherical_intersect/overlapArea.c0000644000077000000240000005675612737263231024114 0ustar tomstaff00000000000000/* Methods to compute pixel overlap areas on the sphere. * * Originally developed in 2003 / 2004 by John Good. */ #include #if defined(_MSC_VER) #define _USE_MATH_DEFINES #endif #include #include "mNaN.h" #include "overlapArea.h" // Constants #define FALSE 0 #define TRUE 1 #define FOREVER 1 #define COLINEAR_SEGMENTS 0 #define ENDPOINT_ONLY 1 #define NORMAL_INTERSECT 2 #define NO_INTERSECTION 3 #define CLOCKWISE 1 #define PARALLEL 0 #define COUNTERCLOCKWISE -1 #define UNKNOWN 0 #define P_IN_Q 1 #define Q_IN_P 2 const int DEBUG = 0; const double DEG_TO_RADIANS = M_PI / 180.; // sin(x) where x = 5e-4 arcsec or cos(x) when x is within 1e-5 arcsec of 90 degrees const double TOLERANCE = 4.424e-9; const int NP = 4; const int NQ = 4; typedef struct vec { double x; double y; double z; } Vec; // Function prototypes int DirectionCalculator(Vec *a, Vec *b, Vec *c); int SegSegIntersect(Vec *a, Vec *b, Vec *c, Vec *d, Vec *e, Vec *f, Vec *p, Vec *q); int Between(Vec *a, Vec *b, Vec *c); int Cross(Vec *a, Vec *b, Vec *c); double Dot(Vec *a, Vec *b); double Normalize(Vec *a); void Reverse(Vec *a); void SaveVertex(Vec *a); void SaveSharedSeg(Vec *p, Vec *q); void PrintPolygon(); void ComputeIntersection(Vec *P, Vec *Q); int UpdateInteriorFlag(Vec *p, int interiorFlag, int pEndpointFromQdir, int qEndpointFromPdir); int Advance(int i, int *i_advances, int n, int inside, Vec *v); double Girard(); void RemoveDups(); int printDir(char *point, char *vector, int dir); // Global variables // The two pixel polygons on the sky P and Q and the polygon of intersection V Vec P[8], Q[8], V[16]; int nv; /* * Sets up the polygons, runs the overlap computation, and returns the area of overlap. */ double computeOverlap(double *ilon, double *ilat, double *olon, double *olat, int energyMode, double refArea, double *areaRatio) { int i; double thisPixelArea; *areaRatio = 1.; if (energyMode) { nv = 0; for (i = 0; i < 4; ++i) SaveVertex(&P[i]); thisPixelArea = Girard(); *areaRatio = thisPixelArea / refArea; } nv = 0; if (DEBUG >= 4) { printf("Input (P):\n"); for (i = 0; i < 4; ++i) printf("%10.6f %10.6f\n", ilon[i], ilat[i]); printf("\nOutput (Q):\n"); for (i = 0; i < 4; ++i) printf("%10.6f %10.6f\n", olon[i], olat[i]); printf("\n"); fflush(stdout); } for (i = 0; i < 4; ++i) { P[i].x = cos(ilon[i]) * cos(ilat[i]); P[i].y = sin(ilon[i]) * cos(ilat[i]); P[i].z = sin(ilat[i]); } for (i = 0; i < 4; ++i) { Q[i].x = cos(olon[i]) * cos(olat[i]); Q[i].y = sin(olon[i]) * cos(olat[i]); Q[i].z = sin(olat[i]); } ComputeIntersection(P, Q); return (Girard()); } /* * Find the polygon defining the area of overlap * between the two input polygons P and Q. */ void ComputeIntersection(Vec *P, Vec *Q) { Vec Pdir, Qdir; // "Current" directed edges on P and Q Vec other; // Temporary "edge-like" variable int ip, iq; // Indices of ends of Pdir, Qdir int ip_begin, iq_begin; // Indices of beginning of Pdir, Qdir int PToQDir; // Qdir direction relative to Pdir // (e.g. CLOCKWISE) int qEndpointFromPdir; // End P vertex as viewed from beginning // of Qdir relative to Qdir int pEndpointFromQdir; // End Q vertex as viewed from beginning // of Pdir relative to Pdir Vec firstIntersection; // Point of intersection of Pdir, Qdir Vec secondIntersection; // Second point of intersection // (if there is one) int interiorFlag; // Which polygon is inside the other int contained; // Used for "completely contained" check int p_advances, q_advances; // Number of times we've advanced // P and Q indices int isFirstPoint; // Is this the first point? int intersectionCode; // SegSegIntersect() return code. // Check for Q contained in P contained = TRUE; for (ip = 0; ip < NP; ++ip) { ip_begin = (ip + NP - 1) % NP; Cross(&P[ip_begin], &P[ip], &Pdir); Normalize(&Pdir); for (iq = 0; iq < NQ; ++iq) { if (DEBUG >= 4) { printf("Q in P: Dot%d%d = %12.5e\n", ip, iq, Dot(&Pdir, &Q[iq])); fflush(stdout); } if (Dot(&Pdir, &Q[iq]) < -TOLERANCE) { contained = FALSE; break; } } if (!contained) break; } if (contained) { if (DEBUG >= 4) { printf("Q is entirely contained in P (output pixel is in input pixel)\n"); fflush(stdout); } for (iq = 0; iq < NQ; ++iq) SaveVertex(&Q[iq]); return; } // Check for P contained in Q contained = TRUE; for (iq = 0; iq < NQ; ++iq) { iq_begin = (iq + NQ - 1) % NQ; Cross(&Q[iq_begin], &Q[iq], &Qdir); Normalize(&Qdir); for (ip = 0; ip < NP; ++ip) { if (DEBUG >= 4) { printf("P in Q: Dot%d%d = %12.5e\n", iq, ip, Dot(&Qdir, &P[ip])); fflush(stdout); } if (Dot(&Qdir, &P[ip]) < -TOLERANCE) { contained = FALSE; break; } } if (!contained) break; } if (contained) { if (DEBUG >= 4) { printf("P is entirely contained in Q (input pixel is in output pixel)\n"); fflush(stdout); } nv = 0; for (ip = 0; ip < NP; ++ip) SaveVertex(&P[ip]); return; } // Then check for polygon overlap ip = 0; iq = 0; p_advances = 0; q_advances = 0; interiorFlag = UNKNOWN; isFirstPoint = TRUE; while (FOREVER) { if (p_advances >= 2 * NP) break; if (q_advances >= 2 * NQ) break; if (p_advances >= NP && q_advances >= NQ) break; if (DEBUG >= 4) { printf("-----\n"); if (interiorFlag == UNKNOWN) { printf("Before advances (UNKNOWN interiorFlag): ip=%d, iq=%d ", ip, iq); printf("(p_advances=%d, q_advances=%d)\n", p_advances, q_advances); } else if (interiorFlag == P_IN_Q) { printf("Before advances (P_IN_Q): ip=%d, iq=%d ", ip, iq); printf("(p_advances=%d, q_advances=%d)\n", p_advances, q_advances); } else if (interiorFlag == Q_IN_P) { printf("Before advances (Q_IN_P): ip=%d, iq=%d ", ip, iq); printf("(p_advances=%d, q_advances=%d)\n", p_advances, q_advances); } else printf("\nBAD INTERIOR FLAG. Shouldn't get here\n"); fflush(stdout); } // Previous point in the polygon ip_begin = (ip + NP - 1) % NP; iq_begin = (iq + NQ - 1) % NQ; // The current polygon edges are given by // the cross product of the vertex vectors Cross(&P[ip_begin], &P[ip], &Pdir); Cross(&Q[iq_begin], &Q[iq], &Qdir); PToQDir = DirectionCalculator(&P[ip], &Pdir, &Qdir); Cross(&Q[iq_begin], &P[ip], &other); pEndpointFromQdir = DirectionCalculator(&Q[iq_begin], &Qdir, &other); Cross(&P[ip_begin], &Q[iq], &other); qEndpointFromPdir = DirectionCalculator(&P[ip_begin], &Pdir, &other); if (DEBUG >= 4) { printf(" "); printDir("P", "Q", PToQDir); printDir("pEndpoint", "Q", pEndpointFromQdir); printDir("qEndpoint", "P", qEndpointFromPdir); printf("\n"); fflush(stdout); } // Find point(s) of intersection between edges intersectionCode = SegSegIntersect(&Pdir, &Qdir, &P[ip_begin], &P[ip], &Q[iq_begin], &Q[iq], &firstIntersection, &secondIntersection); if (intersectionCode == NORMAL_INTERSECT || intersectionCode == ENDPOINT_ONLY) { if (interiorFlag == UNKNOWN && isFirstPoint) { p_advances = 0; q_advances = 0; isFirstPoint = FALSE; } interiorFlag = UpdateInteriorFlag(&firstIntersection, interiorFlag, pEndpointFromQdir, qEndpointFromPdir); if (DEBUG >= 4) { if (interiorFlag == UNKNOWN) printf(" interiorFlag -> UNKNOWN\n"); else if (interiorFlag == P_IN_Q) printf(" interiorFlag -> P_IN_Q\n"); else if (interiorFlag == Q_IN_P) printf(" interiorFlag -> Q_IN_P\n"); else printf(" BAD interiorFlag. Shouldn't get here\n"); fflush(stdout); } } // Advance rules // Special case: Pdir & Qdir overlap and oppositely oriented. if ((intersectionCode == COLINEAR_SEGMENTS) && (Dot(&Pdir, &Qdir) < 0)) { if (DEBUG >= 4) { printf(" ADVANCE: Pdir and Qdir are colinear.\n"); fflush(stdout); } SaveSharedSeg(&firstIntersection, &secondIntersection); RemoveDups(); return; } // Special case: Pdir & Qdir parallel and separated. if ((PToQDir == PARALLEL) && (pEndpointFromQdir == CLOCKWISE) && (qEndpointFromPdir == CLOCKWISE)) { if (DEBUG >= 4) { printf(" ADVANCE: Pdir and Qdir are disjoint.\n"); fflush(stdout); } RemoveDups(); return; } // Special case: Pdir & Qdir colinear. else if ((PToQDir == PARALLEL) && (pEndpointFromQdir == PARALLEL) && (qEndpointFromPdir == PARALLEL)) { if (DEBUG >= 4) { printf(" ADVANCE: Pdir and Qdir are colinear.\n"); fflush(stdout); } // Advance but do not output point. if (interiorFlag == P_IN_Q) iq = Advance(iq, &q_advances, NQ, interiorFlag == Q_IN_P, &Q[iq]); else ip = Advance(ip, &p_advances, NP, interiorFlag == P_IN_Q, &P[ip]); } // Generic cases. else if (PToQDir == COUNTERCLOCKWISE || PToQDir == PARALLEL) { if (qEndpointFromPdir == COUNTERCLOCKWISE) { if (DEBUG >= 4) { printf(" ADVANCE: Generic: PToQDir is COUNTERCLOCKWISE "); printf("|| PToQDir is PARALLEL, "); printf("qEndpointFromPdir is COUNTERCLOCKWISE\n"); fflush(stdout); } ip = Advance(ip, &p_advances, NP, interiorFlag == P_IN_Q, &P[ip]); } else { if (DEBUG >= 4) { printf(" ADVANCE: Generic: PToQDir is COUNTERCLOCKWISE "); printf("|| PToQDir is PARALLEL, qEndpointFromPdir is CLOCKWISE\n"); fflush(stdout); } iq = Advance(iq, &q_advances, NQ, interiorFlag == Q_IN_P, &Q[iq]); } } else { if (pEndpointFromQdir == COUNTERCLOCKWISE) { if (DEBUG >= 4) { printf(" ADVANCE: Generic: PToQDir is CLOCKWISE, "); printf("pEndpointFromQdir is COUNTERCLOCKWISE\n"); fflush(stdout); } iq = Advance(iq, &q_advances, NQ, interiorFlag == Q_IN_P, &Q[iq]); } else { if (DEBUG >= 4) { printf(" ADVANCE: Generic: PToQDir is CLOCKWISE, "); printf("pEndpointFromQdir is CLOCKWISE\n"); fflush(stdout); } ip = Advance(ip, &p_advances, NP, interiorFlag == P_IN_Q, &P[ip]); } } if (DEBUG >= 4) { if (interiorFlag == UNKNOWN) { printf("After advances: ip=%d, iq=%d ", ip, iq); printf("(p_advances=%d, q_advances=%d) interiorFlag=UNKNOWN\n", p_advances, q_advances); } else if (interiorFlag == P_IN_Q) { printf("After advances: ip=%d, iq=%d ", ip, iq); printf("(p_advances=%d, q_advances=%d) interiorFlag=P_IN_Q\n", p_advances, q_advances); } else if (interiorFlag == Q_IN_P) { printf("After advances: ip=%d, iq=%d ", ip, iq); printf("(p_advances=%d, q_advances=%d) interiorFlag=Q_IN_P\n", p_advances, q_advances); } else printf("BAD INTERIOR FLAG. Shouldn't get here\n"); printf("-----\n\n"); fflush(stdout); } } RemoveDups(); return; } /* * Print out the second point of intersection and toggle in/out flag. */ int UpdateInteriorFlag(Vec *p, int interiorFlag, int pEndpointFromQdir, int qEndpointFromPdir) { double lon, lat; if (DEBUG >= 4) { lon = atan2(p->y, p->x) / DEG_TO_RADIANS; lat = asin(p->z) / DEG_TO_RADIANS; printf(" intersection [%13.6e,%13.6e,%13.6e] " "-> (%10.6f,%10.6f) (UpdateInteriorFlag)\n", p->x, p->y, p->z, lon, lat); fflush(stdout); } SaveVertex(p); // Update interiorFlag. if (pEndpointFromQdir == COUNTERCLOCKWISE) return P_IN_Q; else if (qEndpointFromPdir == COUNTERCLOCKWISE) return Q_IN_P; else // Keep status quo. return interiorFlag; } /* * Save the endpoints of a shared segment. */ void SaveSharedSeg(Vec *p, Vec *q) { if (DEBUG >= 4) { printf("\n SaveSharedSeg(): from " "[%13.6e,%13.6e,%13.6e]\n", p->x, p->y, p->z); printf(" SaveSharedSeg(): to " "[%13.6e,%13.6e,%13.6e]\n\n", q->x, q->y, q->z); fflush(stdout); } SaveVertex(p); SaveVertex(q); } /* * Advances and prints out an inside vertex if appropriate. */ int Advance(int ip, int *p_advances, int n, int inside, Vec *v) { double lon, lat; lon = atan2(v->y, v->x) / DEG_TO_RADIANS; lat = asin(v->z) / DEG_TO_RADIANS; if (inside) { if (DEBUG >= 4) { printf(" Advance(): inside vertex " "[%13.6e,%13.6e,%13.6e] -> (%10.6f,%10.6f)n", v->x, v->y, v->z, lon, lat); fflush(stdout); } SaveVertex(v); } (*p_advances)++; return (ip + 1) % n; } /* * Save the intersection polygon vertices */ void SaveVertex(Vec *v) { int i, i_begin; Vec Dir; if (DEBUG >= 4) printf(" SaveVertex ... "); // What with TOLERANCE and roundoff problems, we need to double-check // that the point to be save is really in or on the edge of both pixels P and Q. for (i = 0; i < NP; ++i) { i_begin = (i + NP - 1) % NP; Cross(&P[i_begin], &P[i], &Dir); Normalize(&Dir); if (Dot(&Dir, v) < -1000. * TOLERANCE) { if (DEBUG >= 4) { printf("rejected (not in P)\n"); fflush(stdout); } return; } } for (i = 0; i < NQ; ++i) { i_begin = (i + NQ - 1) % NQ; Cross(&Q[i_begin], &Q[i], &Dir); Normalize(&Dir); if (Dot(&Dir, v) < -1000. * TOLERANCE) { if (DEBUG >= 4) { printf("rejected (not in Q)\n"); fflush(stdout); } return; } } if (nv < 15) { V[nv].x = v->x; V[nv].y = v->y; V[nv].z = v->z; ++nv; } if (DEBUG >= 4) { printf("accepted (%d)\n", nv); fflush(stdout); } } /* * Print out the final intersection polygon. */ void PrintPolygon() { int i; double lon, lat; for (i = 0; i < nv; ++i) { lon = atan2(V[i].y, V[i].x) / DEG_TO_RADIANS; lat = asin(V[i].z) / DEG_TO_RADIANS; printf("[%13.6e,%13.6e,%13.6e] -> (%10.6f,%10.6f)\n", V[i].x, V[i].y, V[i].z, lon, lat); } } /* * Reads in the coordinates of the vertices of * the polygons from stdin. */ int ReadData(double *ilon, double *ilat, double *olon, double *olat) { int n; n = 0; while ((n < 4) && (scanf("%lf %lf", &ilon[n], &ilat[n]) != EOF)) ++n; n = 0; while ((n < 4) && (scanf("%lf %lf", &olon[n], &olat[n]) != EOF)) ++n; return (0); } /* * Computes whether ac is CLOCKWISE, etc. of ab. */ int DirectionCalculator(Vec *a, Vec *b, Vec *c) { Vec cross; int len; len = Cross(b, c, &cross); if (len == 0) return PARALLEL; else if (Dot(a, &cross) < 0.) return CLOCKWISE; else return COUNTERCLOCKWISE; } /* * Finds the point of intersection p between two closed segments ab and cd. * * Returns p and a char with the following meaning: * * COLINEAR_SEGMENTS: The segments colinearly overlap, sharing a point. * * ENDPOINT_ONLY: An endpoint (vertex) of one segment is on the other * segment, but COLINEAR_SEGMENTS doesn't hold. * * NORMAL_INTERSECT: The segments intersect properly (i.e., they share * a point and neither ENDPOINT_ONLY nor * COLINEAR_SEGMENTS holds). * * NO_INTERSECTION: The segments do not intersect (i.e., they share * no points). * * Note that two colinear segments that share just one point, an endpoint * of each, returns COLINEAR_SEGMENTS rather than ENDPOINT_ONLY as one * might expect. */ int SegSegIntersect(Vec *pEdge, Vec *qEdge, Vec *p0, Vec *p1, Vec *q0, Vec *q1, Vec *intersect1, Vec *intersect2) { double pDot, qDot; // Dot product [cos(length)] of the edge vertices double p0Dot, p1Dot; // Dot product from vertices to intersection double q0Dot, q1Dot; // Dot pro}duct from vertices to intersection int len; // Get the edge lengths (actually cos(length)) pDot = Dot(p0, p1); qDot = Dot(q0, q1); // Find the point of intersection len = Cross(pEdge, qEdge, intersect1); // If the two edges are colinear, check to see if they overlap if (len == 0) { if (Between(q0, p0, p1) && Between(q1, p0, p1)) { intersect1 = q0; intersect2 = q1; return COLINEAR_SEGMENTS; } if (Between(p0, q0, q1) && Between(p1, q0, q1)) { intersect1 = p0; intersect2 = p1; return COLINEAR_SEGMENTS; } if (Between(q0, p0, p1) && Between(p1, q0, q1)) { intersect1 = q0; intersect2 = p1; return COLINEAR_SEGMENTS; } if (Between(p0, q0, q1) && Between(q1, p0, p1)) { intersect1 = p0; intersect2 = q1; return COLINEAR_SEGMENTS; } if (Between(q1, p0, p1) && Between(p1, q0, q1)) { intersect1 = p0; intersect2 = p1; return COLINEAR_SEGMENTS; } if (Between(q0, p0, p1) && Between(p0, q0, q1)) { intersect1 = p0; intersect2 = q0; return COLINEAR_SEGMENTS; } return NO_INTERSECTION; } // If this is the wrong one of the two // (other side of the sky) reverse it Normalize(intersect1); if (Dot(intersect1, p0) < 0.) Reverse(intersect1); // Point has to be inside both sides to be an intersection if ((p0Dot = Dot(intersect1, p0)) < pDot) return NO_INTERSECTION; if ((p1Dot = Dot(intersect1, p1)) < pDot) return NO_INTERSECTION; if ((q0Dot = Dot(intersect1, q0)) < qDot) return NO_INTERSECTION; if ((q1Dot = Dot(intersect1, q1)) < qDot) return NO_INTERSECTION; // Otherwise, if the intersection is at an endpoint if (p0Dot == pDot) return ENDPOINT_ONLY; if (p1Dot == pDot) return ENDPOINT_ONLY; if (q0Dot == qDot) return ENDPOINT_ONLY; if (q1Dot == qDot) return ENDPOINT_ONLY; // Otherwise, it is a normal intersection return NORMAL_INTERSECT; } /* * Formats a message about relative directions. */ int printDir(char *point, char *vector, int dir) { if (dir == CLOCKWISE) printf("%s is CLOCKWISE of %s; ", point, vector); else if (dir == COUNTERCLOCKWISE) printf("%s is COUNTERCLOCKWISE of %s; ", point, vector); else if (dir == PARALLEL) printf("%s is PARALLEL to %s; ", point, vector); else printf("Bad comparison (shouldn't get this; "); return 0; } /* * Tests whether whether a point on an arc is * between two other points. */ int Between(Vec *v, Vec *a, Vec *b) { double abDot, avDot, bvDot; abDot = Dot(a, b); avDot = Dot(a, v); bvDot = Dot(b, v); if (avDot > abDot && bvDot > abDot) return TRUE; else return FALSE; } /* * Vector cross product. */ int Cross(Vec *v1, Vec *v2, Vec *v3) { v3->x = v1->y * v2->z - v2->y * v1->z; v3->y = -v1->x * v2->z + v2->x * v1->z; v3->z = v1->x * v2->y - v2->x * v1->y; if (v3->x == 0. && v3->y == 0. && v3->z == 0.) return 0; return 1; } /* * Vector dot product. */ double Dot(Vec *a, Vec *b) { double sum = 0.0; sum = a->x * b->x + a->y * b->y + a->z * b->z; return sum; } /* * Normalize the vector */ double Normalize(Vec *v) { double len; len = sqrt(v->x * v->x + v->y * v->y + v->z * v->z); if (len == 0.) len = 1.; v->x = v->x / len; v->y = v->y / len; v->z = v->z / len; return len; } /* * Reverse the vector. */ void Reverse(Vec *v) { v->x = -v->x; v->y = -v->y; v->z = -v->z; } /* * Use Girard's theorem to compute the area of a sky polygon. */ double Girard() { int i, j, ibad; double area; double lon, lat; Vec side[16]; double ang[16]; Vec tmp; double sumang, cosAng, sinAng; sumang = 0; if (nv < 3) return 0; if (DEBUG >= 4) { for (i = 0; i < nv; ++i) { lon = atan2(V[i].y, V[i].x) / DEG_TO_RADIANS; lat = asin(V[i].z) / DEG_TO_RADIANS; printf("Girard(): %3d [%13.6e,%13.6e,%13.6e] -> (%10.6f,%10.6f)\n", i, V[i].x, V[i].y, V[i].z, lon, lat); fflush(stdout); } } for (i = 0; i < nv; ++i) { Cross(&V[i], &V[(i + 1) % nv], &side[i]); Normalize(&side[i]); } for (i = 0; i < nv; ++i) { Cross(&side[i], &side[(i + 1) % nv], &tmp); sinAng = Normalize(&tmp); cosAng = -Dot(&side[i], &side[(i + 1) % nv]); // Remove center point of colinear segments ang[i] = atan2(sinAng, cosAng); if (DEBUG >= 4) { if (i == 0) printf("\n"); printf("Girard(): angle[%d] = %13.6e -> %13.6e (from %13.6e / %13.6e)\n", i, ang[i], ang[i] - M_PI / 2., sinAng, cosAng); fflush(stdout); } // Direction changes of less than a degree can be tricky if (ang[i] > M_PI - 0.0175) { ibad = (i + 1) % nv; if (DEBUG >= 4) { printf("Girard(): ---------- Corner %d bad; " "Remove point %d -------------\n", i, ibad); fflush(stdout); } --nv; for (j = ibad; j < nv; ++j) { V[j].x = V[j + 1].x; V[j].y = V[j + 1].y; V[j].z = V[j + 1].z; } return (Girard()); } sumang += ang[i]; } area = sumang - (nv - 2.) * M_PI; if (mNaN(area) || area < 0.) area = 0.; if (DEBUG >= 4) { printf("\nGirard(): area = %13.6e [%d]\n\n", area, nv); fflush(stdout); } return area; } /* * Check the vertex list for adjacent pairs of * points which are too close together for the * subsequent dot- and cross-product calculations * of Girard's theorem. */ void RemoveDups() { int i, nvnew; Vec Vnew[16]; Vec tmp; double lon, lat; double separation; if (DEBUG >= 4) { printf("RemoveDups() TOLERANCE = %13.6e [%13.6e arcsec]\n\n", TOLERANCE, TOLERANCE / DEG_TO_RADIANS * 3600.); for (i = 0; i < nv; ++i) { lon = atan2(V[i].y, V[i].x) / DEG_TO_RADIANS; lat = asin(V[i].z) / DEG_TO_RADIANS; printf("RemoveDups() orig: %3d [%13.6e,%13.6e,%13.6e] " "-> (%10.6f,%10.6f)\n", i, V[i].x, V[i].y, V[i].z, lon, lat); fflush(stdout); } printf("\n"); } Vnew[0].x = V[0].x; Vnew[0].y = V[0].y; Vnew[0].z = V[0].z; nvnew = 0; for (i = 0; i < nv; ++i) { ++nvnew; Vnew[nvnew].x = V[(i + 1) % nv].x; Vnew[nvnew].y = V[(i + 1) % nv].y; Vnew[nvnew].z = V[(i + 1) % nv].z; Cross(&V[i], &V[(i + 1) % nv], &tmp); separation = Normalize(&tmp); if (DEBUG >= 4) { printf("RemoveDups(): %3d x %3d: distance = %13.6e " "[%13.6e arcsec] (would become %d)\n", (i + 1) % nv, i, separation, separation / DEG_TO_RADIANS * 3600., nvnew); fflush(stdout); } if (separation < TOLERANCE) { --nvnew; if (DEBUG >= 4) { printf("RemoveDups(): %3d is a duplicate (nvnew -> %d)\n", i, nvnew); fflush(stdout); } } } if (DEBUG >= 4) { printf("\n"); fflush(stdout); } if (nvnew < nv) { for (i = 0; i < nvnew; ++i) { V[i].x = Vnew[i].x; V[i].y = Vnew[i].y; V[i].z = Vnew[i].z; } nv = nvnew; } } reproject-0.3.2/reproject/spherical_intersect/overlapArea.h0000644000077000000240000000031312522714336024072 0ustar tomstaff00000000000000#ifndef OVERLAP_AREA #define OVERLAP_AREA double computeOverlap(double *ilon, double *ilat, double *olon, double *olat, int energyMode, double refArea, double *areaRatio); #endif reproject-0.3.2/reproject/spherical_intersect/overlapAreaPP.c0000644000077000000240000001063512522714336024335 0ustar tomstaff00000000000000/* Methods to compute pixel overlap areas in the plane. * * Originally developed in 2003 / 2004 by John Good. */ #include double computeOverlapPP(double *ix, double *iy, double minX, double maxX, double minY, double maxY, double pixelArea); double polyArea(int npts, double *nx, double *ny); int rectClip(int n, double *x, double *y, double *nx, double *ny, double minX, double minY, double maxX, double maxY); int lineClip(int n, double *x, double *y, double *nx, double *ny, double val, int dir); int inPlane(double test, double divider, int direction); int ptInPoly(double x, double y, int n, double *xp, double *yp); // Global variables double tmpX0[100]; double tmpX1[100]; double tmpY0[100]; double tmpY1[100]; /* * Sets up the polygons, runs the overlap * computation, and returns the area of overlap. * This version works in pixel space rather than * on the celestial sphere. */ double computeOverlapPP(double *ix, double *iy, double minX, double maxX, double minY, double maxY, double pixelArea) { int npts; double area; double nx[100]; double ny[100]; double xp[4], yp[4]; // Clip the input pixel polygon with the output pixel range npts = rectClip(4, ix, iy, nx, ny, minX, minY, maxX, maxY); // If no points, it may mean that the output is // completely contained in the input if (npts < 3) { xp[0] = minX; yp[0] = minY; xp[1] = maxX; yp[1] = minY; xp[2] = maxX; yp[2] = maxY; xp[3] = minX; yp[3] = maxY; if (ptInPoly(ix[0], iy[0], 4, xp, yp)) { area = pixelArea; return area; } return 0.; } area = polyArea(npts, nx, ny) * pixelArea; return area; } int rectClip(int n, double *x, double *y, double *nx, double *ny, double minX, double minY, double maxX, double maxY) { int nCurr; nCurr = lineClip(n, x, y, tmpX0, tmpY0, minX, 1); if (nCurr > 0) { nCurr = lineClip(nCurr, tmpX0, tmpY0, tmpX1, tmpY1, maxX, 0); if (nCurr > 0) { nCurr = lineClip(nCurr, tmpY1, tmpX1, tmpY0, tmpX0, minY, 1); if (nCurr > 0) { nCurr = lineClip(nCurr, tmpY0, tmpX0, ny, nx, maxY, 0); } } } return nCurr; } int lineClip(int n, double *x, double *y, double *nx, double *ny, double val, int dir) { int i; int nout; int last; double ycross; nout = 0; last = inPlane(x[n - 1], val, dir); for (i = 0; i < n; ++i) { if (last) { if (inPlane(x[i], val, dir)) { // Both endpoints in, just add the new point nx[nout] = x[i]; ny[nout] = y[i]; ++nout; } else { // Moved out of the clip region, add the point we moved out if (i == 0) ycross = y[n - 1] + (y[0] - y[n - 1]) * (val - x[n - 1]) / (x[0] - x[n - 1]); else ycross = y[i - 1] + (y[i] - y[i - 1]) * (val - x[i - 1]) / (x[i] - x[i - 1]); nx[nout] = val; ny[nout] = ycross; ++nout; last = 0; } } else { if (inPlane(x[i], val, dir)) { // Moved into the clip region. // Add the point we moved in, and the end point. if (i == 0) ycross = y[n - 1] + (y[0] - y[n - 1]) * (val - x[n - 1]) / (x[i] - x[n - 1]); else ycross = y[i - 1] + (y[i] - y[i - 1]) * (val - x[i - 1]) / (x[i] - x[i - 1]); nx[nout] = val; ny[nout] = ycross; ++nout; nx[nout] = x[i]; ny[nout] = y[i]; ++nout; last = 1; } else { // Segment entirely clipped. } } } return nout; } int inPlane(double test, double divider, int direction) { if (direction) return test >= divider; else return test <= divider; } double polyArea(int npts, double *nx, double *ny) { int i, inext; double area; area = 0.; for (i = 0; i < npts; ++i) { inext = (i + 1) % npts; area += nx[i] * ny[inext] - nx[inext] * ny[i]; } area = fabs(area) / 2; return area; } int ptInPoly(double x, double y, int n, double *xp, double *yp) { int i, inext, count; double t; count = 0; for (i = 0; i < n; ++i) { inext = (i + 1) % n; if (((yp[i] <= y) && (yp[inext] > y)) || ((yp[i] > y) && (yp[inext] <= y))) { t = (y - yp[i]) / (yp[inext] - yp[i]); if (x < xp[i] + t * (xp[inext] - xp[i])) ++count; } } return (count & 1); } reproject-0.3.2/reproject/spherical_intersect/reproject_slice_c.c0000644000077000000240000001106612737263231025312 0ustar tomstaff00000000000000#include "overlapArea.h" #include "reproject_slice_c.h" #if defined(_MSC_VER) #define INLINE _inline #else #define INLINE inline #endif static INLINE double min_4(const double *ptr) { double retval = ptr[0]; int i; for (i = 1; i < 4; ++i) { if (ptr[i] < retval) { retval = ptr[i]; } } return retval; } static INLINE double max_4(const double *ptr) { double retval = ptr[0]; int i; for (i = 1; i < 4; ++i) { if (ptr[i] > retval) { retval = ptr[i]; } } return retval; } static INLINE double to_rad(double x) { return x * 0.017453292519943295; } // Kernel for overlap computation. static INLINE void _compute_overlap(double *overlap, double *area_ratio, double *ilon, double *ilat, double *olon, double *olat) { overlap[0] = computeOverlap(ilon,ilat,olon,olat,0,1,area_ratio); } #define GETPTR2(x,ncols,i,j) (x + (i) * (ncols) + (j)) #define GETPTRILON(x,i,j) (x + (j)) void _reproject_slice_c(int startx, int endx, int starty, int endy, int nx_out, int ny_out, double *xp_inout, double *yp_inout, double *xw_in, double *yw_in, double *xw_out, double *yw_out, double *array, double *array_new, double *weights, double *overlap, double *area_ratio, double *original, int col_in, int col_out, int col_array, int col_new) { int i, j, ii, jj, xmin, xmax, ymin, ymax; double ilon[4], ilat[4], olon[4], olat[4], minmax_x[4], minmax_y[4]; // Main loop. for (i = startx; i < endx; ++i) { for (j = starty; j < endy; ++j) { // For every input pixel we find the position in the output image in // pixel coordinates, then use the full range of overlapping output // pixels with the exact overlap function. minmax_x[0] = *GETPTR2(xp_inout,col_in,j,i); minmax_x[1] = *GETPTR2(xp_inout,col_in,j,i + 1); minmax_x[2] = *GETPTR2(xp_inout,col_in,j + 1,i + 1); minmax_x[3] = *GETPTR2(xp_inout,col_in,j + 1,i); minmax_y[0] = *GETPTR2(yp_inout,col_in,j,i); minmax_y[1] = *GETPTR2(yp_inout,col_in,j,i + 1); minmax_y[2] = *GETPTR2(yp_inout,col_in,j + 1,i + 1); minmax_y[3] = *GETPTR2(yp_inout,col_in,j + 1,i); xmin = (int)(min_4(minmax_x) + .5); xmax = (int)(max_4(minmax_x) + .5); ymin = (int)(min_4(minmax_y) + .5); ymax = (int)(max_4(minmax_y) + .5); // Fill in ilon/ilat. ilon[0] = to_rad(*GETPTR2(xw_in,col_in,j+1,i)); ilon[1] = to_rad(*GETPTR2(xw_in,col_in,j+1,i+1)); ilon[2] = to_rad(*GETPTR2(xw_in,col_in,j,i+1)); ilon[3] = to_rad(*GETPTR2(xw_in,col_in,j,i)); ilat[0] = to_rad(*GETPTR2(yw_in,col_in,j+1,i)); ilat[1] = to_rad(*GETPTR2(yw_in,col_in,j+1,i+1)); ilat[2] = to_rad(*GETPTR2(yw_in,col_in,j,i+1)); ilat[3] = to_rad(*GETPTR2(yw_in,col_in,j,i)); xmin = xmin > 0 ? xmin : 0; xmax = (nx_out-1) < xmax ? (nx_out-1) : xmax; ymin = ymin > 0 ? ymin : 0; ymax = (ny_out-1) < ymax ? (ny_out-1) : ymax; for (ii = xmin; ii < xmax + 1; ++ii) { for (jj = ymin; jj < ymax + 1; ++jj) { // Fill out olon/olat. olon[0] = to_rad(*GETPTR2(xw_out,col_out,jj+1,ii)); olon[1] = to_rad(*GETPTR2(xw_out,col_out,jj+1,ii+1)); olon[2] = to_rad(*GETPTR2(xw_out,col_out,jj,ii+1)); olon[3] = to_rad(*GETPTR2(xw_out,col_out,jj,ii)); olat[0] = to_rad(*GETPTR2(yw_out,col_out,jj+1,ii)); olat[1] = to_rad(*GETPTR2(yw_out,col_out,jj+1,ii+1)); olat[2] = to_rad(*GETPTR2(yw_out,col_out,jj,ii+1)); olat[3] = to_rad(*GETPTR2(yw_out,col_out,jj,ii)); // Compute the overlap. _compute_overlap(overlap,area_ratio,ilon,ilat,olon,olat); _compute_overlap(original,area_ratio,olon,olat,olon,olat); // Write into array_new and weights. *GETPTR2(array_new,col_new,jj,ii) += *GETPTR2(array,col_array,j,i) * (overlap[0] / original[0]); *GETPTR2(weights,col_new,jj,ii) += (overlap[0] / original[0]); } } } } } reproject-0.3.2/reproject/spherical_intersect/reproject_slice_c.h0000644000077000000240000000065312522714336025316 0ustar tomstaff00000000000000#ifndef REPROJECT_SLICE_C_H #define REPROJECT_SLICE_C_H void _reproject_slice_c(int startx, int endx, int starty, int endy, int nx_out, int ny_out, double *xp_inout, double *yp_inout, double *xw_in, double *yw_in, double *xw_out, double *yw_out, double *array, double *array_new, double *weights, double *overlap, double *area_ratio, double *original, int col_in, int col_out, int col_array, int col_new); #endif reproject-0.3.2/reproject/spherical_intersect/setup_package.py0000644000077000000240000000152412724021736024651 0ustar tomstaff00000000000000import os from distutils.core import Extension REPROJECT_ROOT = os.path.relpath(os.path.dirname(__file__)) def get_extensions(): libraries = [] sources = [] sources.append(os.path.join(REPROJECT_ROOT, "_overlap.c")) sources.append(os.path.join(REPROJECT_ROOT, "overlapArea.c")) sources.append(os.path.join(REPROJECT_ROOT, "reproject_slice_c.c")) include_dirs = ['numpy'] include_dirs.append(REPROJECT_ROOT) extension = Extension( name="reproject.spherical_intersect._overlap", sources=sources, include_dirs=include_dirs, libraries=libraries, language="c", extra_compile_args=['-O2']) return [extension] def get_package_data(): header_files = ['overlapArea.h', 'reproject_slice_c.h', 'mNaN.h'] return {'reproject.spherical_intersect': header_files} reproject-0.3.2/reproject/spherical_intersect/tests/0000755000077000000240000000000013173066302022621 5ustar tomstaff00000000000000reproject-0.3.2/reproject/spherical_intersect/tests/__init__.py0000644000077000000240000000000012521755577024737 0ustar tomstaff00000000000000reproject-0.3.2/reproject/spherical_intersect/tests/test_high_level.py0000644000077000000240000000272613173065713026354 0ustar tomstaff00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst from __future__ import (absolute_import, division, print_function, unicode_literals) import numpy as np from astropy.io import fits from astropy.wcs import WCS from astropy.utils.data import get_pkg_data_filename from astropy.tests.helper import pytest from ..high_level import reproject_exact class TestReprojectExact(object): def setup_class(self): self.header_in = fits.Header.fromtextfile(get_pkg_data_filename('../../tests/data/gc_ga.hdr')) self.header_out = fits.Header.fromtextfile(get_pkg_data_filename('../../tests/data/gc_eq.hdr')) self.header_out['NAXIS'] = 2 self.header_out['NAXIS1'] = 600 self.header_out['NAXIS2'] = 550 self.array_in = np.ones((100, 100)) self.wcs_in = WCS(self.header_in) self.wcs_out = WCS(self.header_out) def test_array_wcs(self): reproject_exact((self.array_in, self.wcs_in), self.wcs_out, shape_out=(200, 200)) def test_array_header(self): reproject_exact((self.array_in, self.header_in), self.header_out) def test_parallel_option(self): reproject_exact((self.array_in, self.header_in), self.header_out, parallel=1) with pytest.raises(ValueError) as exc: reproject_exact((self.array_in, self.header_in), self.header_out, parallel=-1) assert exc.value.args[0] == "The number of processors to use must be strictly positive" reproject-0.3.2/reproject/spherical_intersect/tests/test_overlap.py0000644000077000000240000000141512724021736025706 0ustar tomstaff00000000000000import numpy as np from ..overlap import compute_overlap def test_overlap(): EPS = np.radians(1e-2) lon, lat = np.array([[0, EPS, EPS, 0]]), np.array([[0, 0, EPS, EPS]]) overlap, area_ratio = compute_overlap(lon, lat, lon, lat) np.testing.assert_allclose(overlap, EPS ** 2, rtol=1e-6) np.testing.assert_allclose(area_ratio, 1, rtol=1e-6) def test_overlap2(): EPS = np.radians(1e-2) ilon, ilat = np.array([[0, EPS, EPS, 0]]), np.array([[0, 0, EPS, EPS]]) olon, olat = np.array([[0.5 * EPS, 1.5 * EPS, 1.5 * EPS, 0.5 * EPS]]), np.array([[0, 0, EPS, EPS]]) overlap, area_ratio = compute_overlap(ilon, ilat, olon, olat) np.testing.assert_allclose(overlap, 0.5 * EPS ** 2, rtol=1e-6) np.testing.assert_allclose(area_ratio, 1, rtol=1e-6) reproject-0.3.2/reproject/spherical_intersect/tests/test_reproject.py0000644000077000000240000001012712737263231026235 0ustar tomstaff00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst from __future__ import (absolute_import, division, print_function, unicode_literals) import numpy as np from astropy.io import fits from astropy.wcs import WCS from astropy.utils.data import get_pkg_data_filename from ..core import _reproject_celestial def test_reproject_celestial_slices_2d(): header_in = fits.Header.fromtextfile(get_pkg_data_filename('../../tests/data/gc_ga.hdr')) header_out = fits.Header.fromtextfile(get_pkg_data_filename('../../tests/data/gc_eq.hdr')) array_in = np.ones((100, 100)) wcs_in = WCS(header_in) wcs_out = WCS(header_out) _reproject_celestial(array_in, wcs_in, wcs_out, (200, 200)) DATA = np.array([[1, 2], [3, 4]], dtype=np.int64) INPUT_HDR = """ WCSAXES = 2 / Number of coordinate axes CRPIX1 = 299.628 / Pixel coordinate of reference point CRPIX2 = 299.394 / Pixel coordinate of reference point CDELT1 = -0.001666666 / [deg] Coordinate increment at reference point CDELT2 = 0.001666666 / [deg] Coordinate increment at reference point CUNIT1 = 'deg' / Units of coordinate increment and value CUNIT2 = 'deg' / Units of coordinate increment and value CTYPE1 = 'GLON-CAR' / galactic longitude, plate caree projection CTYPE2 = 'GLAT-CAR' / galactic latitude, plate caree projection CRVAL1 = 0.0 / [deg] Coordinate value at reference point CRVAL2 = 0.0 / [deg] Coordinate value at reference point LONPOLE = 0.0 / [deg] Native longitude of celestial pole LATPOLE = 90.0 / [deg] Native latitude of celestial pole """ OUTPUT_HDR = """ WCSAXES = 2 / Number of coordinate axes CRPIX1 = 2.5 / Pixel coordinate of reference point CRPIX2 = 2.5 / Pixel coordinate of reference point CDELT1 = -0.001500000 / [deg] Coordinate increment at reference point CDELT2 = 0.001500000 / [deg] Coordinate increment at reference point CUNIT1 = 'deg' / Units of coordinate increment and value CUNIT2 = 'deg' / Units of coordinate increment and value CTYPE1 = 'RA---TAN' / Right ascension, gnomonic projection CTYPE2 = 'DEC--TAN' / Declination, gnomonic projection CRVAL1 = 267.183880241 / [deg] Coordinate value at reference point CRVAL2 = -28.768527143 / [deg] Coordinate value at reference point LONPOLE = 180.0 / [deg] Native longitude of celestial pole LATPOLE = -28.768527143 / [deg] Native latitude of celestial pole EQUINOX = 2000.0 / [yr] Equinox of equatorial coordinates """ MONTAGE_REF = np.array([[np.nan, 2., 2., np.nan], [1., 1.6768244, 3.35364754, 4.], [1., 1.6461656, 3.32308315, 4.], [np.nan, 3., 3., np.nan]]) def test_reproject_celestial_consistency(): # Consistency between the different modes wcs_in = WCS(fits.Header.fromstring(INPUT_HDR, sep='\n')) wcs_out = WCS(fits.Header.fromstring(OUTPUT_HDR, sep='\n')) array1, footprint1 = _reproject_celestial(DATA, wcs_in, wcs_out, (4, 4), _legacy=True) array2, footprint2 = _reproject_celestial(DATA, wcs_in, wcs_out, (4, 4), parallel=False) array3, footprint3 = _reproject_celestial(DATA, wcs_in, wcs_out, (4, 4), parallel=True) np.testing.assert_allclose(array1, array2, rtol=1.e-5) np.testing.assert_allclose(array1, array3, rtol=1.e-5) np.testing.assert_allclose(footprint1, footprint2, rtol=3.e-5) np.testing.assert_allclose(footprint1, footprint3, rtol=3.e-5) def test_reproject_celestial_(): # Accuracy compared to Montage wcs_in = WCS(fits.Header.fromstring(INPUT_HDR, sep='\n')) wcs_out = WCS(fits.Header.fromstring(OUTPUT_HDR, sep='\n')) array, footprint = _reproject_celestial(DATA, wcs_in, wcs_out, (4, 4), parallel=False) # TODO: improve agreement with Montage - at the moment agreement is ~10% np.testing.assert_allclose(array, MONTAGE_REF, rtol=0.09) reproject-0.3.2/reproject/tests/0000755000077000000240000000000013173066302016567 5ustar tomstaff00000000000000reproject-0.3.2/reproject/tests/__init__.py0000644000077000000240000000000012521755574020702 0ustar tomstaff00000000000000reproject-0.3.2/reproject/tests/coveragerc0000644000077000000240000000140012516667577020652 0ustar tomstaff00000000000000[run] source = {packagename} omit = {packagename}/_astropy_init* {packagename}/conftest* {packagename}/cython_version* {packagename}/setup_package* {packagename}/*/setup_package* {packagename}/*/*/setup_package* {packagename}/tests/* {packagename}/*/tests/* {packagename}/*/*/tests/* {packagename}/version* [report] exclude_lines = # Have to re-enable the standard pragma pragma: no cover # Don't complain about packages we have installed except ImportError # Don't complain if tests don't hit assertions raise AssertionError raise NotImplementedError # Don't complain about script hooks def main\(.*\): # Ignore branches that don't pertain to this version of Python pragma: py{ignore_python_version}reproject-0.3.2/reproject/tests/data/0000755000077000000240000000000013173066302017500 5ustar tomstaff00000000000000reproject-0.3.2/reproject/tests/data/cube.hdr0000644000077000000240000000312412516667577021142 0ustar tomstaff00000000000000WCSAXES = 3 / Number of coordinate axes CRPIX1 = -799.0 / Pixel coordinate of reference point CRPIX2 = -4741.913 / Pixel coordinate of reference point CRPIX3 = -187.0 / Pixel coordinate of reference point CDELT1 = -0.006388889 / [deg] Coordinate increment at reference point CDELT2 = 0.006388889 / [deg] Coordinate increment at reference point CDELT3 = 66.42361 / [m s-1] Coordinate increment at reference point CUNIT1 = 'deg' / Units of coordinate increment and value CUNIT2 = 'deg' / Units of coordinate increment and value CUNIT3 = 'm s-1' / Units of coordinate increment and value CTYPE1 = 'RA---SFL' / Right ascension, Sanson-Flamsteed projection CTYPE2 = 'DEC--SFL' / Declination, Sanson-Flamsteed projection CTYPE3 = 'VOPT' / Optical velocity (linear) CRVAL1 = 57.6599999999 / [deg] Coordinate value at reference point CRVAL2 = 0.0 / [deg] Coordinate value at reference point CRVAL3 = -9959.44378305 / [m s-1] Coordinate value at reference point LONPOLE = 0.0 / [deg] Native longitude of celestial pole LATPOLE = 90.0 / [deg] Native latitude of celestial pole EQUINOX = 2000.0 / [yr] Equinox of equatorial coordinates SPECSYS = 'LSRK' / Reference frame of spectral coordinates reproject-0.3.2/reproject/tests/data/equatorial_3d.fits0000644000077000000240000001320012737263231023124 0ustar tomstaff00000000000000SIMPLE = T BITPIX = -64 / array data type NAXIS = 3 / number of array dimensions NAXIS1 = 7 NAXIS2 = 5 NAXIS3 = 4 WCSAXES = 3 / Number of coordinate axes CRPIX1 = 3 / Pixel coordinate of reference point CRPIX2 = 4 / Pixel coordinate of reference point CRPIX3 = 2 / Pixel coordinate of reference point CDELT1 = -0.006 / [deg] Coordinate increment at reference point CDELT2 = 0.006 / [deg] Coordinate increment at reference point CDELT3 = 75 / [m s-1] Coordinate increment at reference pointCUNIT1 = 'deg' / Units of coordinate increment and value CUNIT2 = 'deg' / Units of coordinate increment and value CUNIT3 = 'm s-1' / Units of coordinate increment and value CTYPE1 = 'RA---SFL' / Right ascension, Sanson-Flamsteed projection CTYPE2 = 'DEC--SFL' / Declination, Sanson-Flamsteed projection CTYPE3 = 'VOPT' / Optical velocity (linear) CRVAL1 = 60 / [deg] Coordinate value at reference point CRVAL2 = 32 / [deg] Coordinate value at reference point CRVAL3 = 44 / [m s-1] Coordinate value at reference point LONPOLE = 0.0 / [deg] Native longitude of celestial pole LATPOLE = 90.0 / [deg] Native latitude of celestial pole EQUINOX = 2000.0 / [yr] Equinox of equatorial coordinates SPECSYS = 'LSRK' / Reference frame of spectral coordinates HISTORY File modified by user 'tom' with fv on 2016-07-06T09:29:37 END ?á3)ÝðÜ’?àœª^`ð?Þû‚^¤?Þ禑µKÖ?á@Æ@Ås?à›ö<?ÞÅB²Î?àáèõMÀ?à÷—Si?ß;o?–¤?áàŠœw`^?ãû%¬ ª?á§tŠTÈÂ?ÛÚç¢ñ?ÜÕÔYIÃÐ?ÝŠÄŸûF?ß…î?á2þäü?â—ŠåÛ Ô?âg±ÿ0m¤?áʉ †ÓB?ߺO‰j?ß0’²Gù?ß{yšð'è?à©ø'|¶¶?á£Í‘ÑÆ1?à06~MLt?ÝûÚh ³¬?à—19p«?ߢ3ñÎ:?ÞÓ%Ÿ«Ôl?àjÞÑsż?á NÄ¢·ú?ݶBâ¿•ô?ÛÊ|Soû ?ÜæÛ<–?ÞyJ:Ç?ßÔjWàÒ?áÜ¿C]u„?â÷kWA1â?à+\›þ?ÛÑG{wž?ÙXWH]äú?݇Bzj?àýÐZÛ,ú?äWóN?æÕ“iMœã?ãgg±¨°¹?ÜZí.,¼?×¾H"Ï w?ÙhA oå¢?Ýîž'øñ[?àÚBmíç+?áJÔÈV0?á\½¼=T?âr¦°a.?ÚfDåaÁÞ?Ûtƒ+ñ*?Þþ '¡?à.À>t?àä„sûÛN?߈g€Ê?ÞîФ?ÝÔKc›ô?ÞGì(#Þ?ß"¢ìJª?á'+Å.*=?áù}ÇV ?ß çt Ÿ}?Ü—žˆ Ê$?ݾFŒOÁF?àyzSQ*?âtª?æÇ³}rß«?긂I.?匰¼vö?àFÕx±)D?Ü}©È°Zª?àqª.ü c?ä®3-Èø?ïÌeYïL?ôB¶Ü X?îþàà5>?âpŸ‘À?ÔÏüÒÁ=æ?Õ½u—®”?Ú†~ í‡?Ýf·®¹?Û9p÷yz?ÚƒÁŸ…¥¤?Þ\['c?Ô_†5ž?Ö×ËŒQ?Ûš4VÀãf?ßçÒÆÅ^?ÝÔcXTR?Ú›í)³9?ÙÌüx•<ã7ªŠ7þÒ72§n7¸7æ´7»‚7Jg7kŠ7¦è'7›Á>7—ãâ7öš7ŸìÄ7›%~7µƒ7äö8‰‹8M¾38o g8lÝ8K©8#îz8Œ87þ[¡8>Ñ8&+8q8ÉŸ8PÊ8&ü¤8@L8Qp8iºl8j©R6ßm=6¨ž¤6Ó+¶7.K7”p7ýI7 óu7æ”7ÄÅ7 ³·7ëî7…I7 «7¶B7)vå7LCŸ7h‘â7‰§â7„êÿ7‘H47‹J7˜š7Ÿg±7¨³7Ìåº8Ðq8bÆ8%D8%wS8ÇT8®¡7ò·æ7ùX¸7î¬7íÿ 8J$8 '‰8ÌÑ8-¹£8F¼8Xp§8i¬-8iÈ6×½6Ò^Ö6Üù=6û‚7(@¶7-¾í7w7K®6ç‰y6ëoK7³¿7tÛ7¬›7–7647_+7q"‘7‹w7ƒÓª7„7;7‘ùV7–N¢7§ß$7²J7º…å7а7åE 7ö)M8 q7ÿ-7ëRk7ÛŠ$7Í57ÆÇî7Ü<8#h8=¬8 Š80Í8E¤E8aÂf8i¬^8jÕ~6¿L6ç‚f6ëôu7› 7'cÒ7]R6Û§k6Òš;7«~73gÙ7ïû7ûž7=öÄ71K\7-fK7`R„7nÎ7zH7~ÂÁ7ˆàó7‡¥¬7—Ò7žëj7¨p¯7¬¯•7«å87«—n7¸ÝP7Ï\7Ò, 7И7˯7Ç27ÄÐ7Ýf7ú\8 ÊÎ8c‚8!À8;*B8O'u8^Y¡8h†~6ߊ!6ð¥¸7 Ip70À7¼'7`w6Õ ,6øài7F67Cey71͇7+»¬7G„75Bƒ7&w—7O‹7a¥v7zbú7t/:7´7ƒ¨p7• g7–™7¢H7©½7©}z7©±Z7±%n7ÂuL7Ép47Ãyl7Á§¯7Éæa7ÈE 7ââ57ø¼.8 ËÂ8ãê8"0¬84…8C[o8]$g8lMÔ6ð¾u6Ý»6ø¤7‚ß7Ù7ˆt6ãUŽ7b70—7D3f7Gõ7A›7dG74÷í79â†7„’7B×÷7‚Š¡7m¶]7‹`á7ƒŒE7‰S7…¡R7™¤Ý7¡)Ã7¾õ7ž7Á¶y7±K7Â,7Ì7Æ&=7·jh7Âo?7ÞHU8å•8 M¬8J8"ü_8+:‡8@yª8\¼8e*¿7%Ë7'D7ŠÇ7[N7jÔ77”©7}ü6æqþ6þ!´7*=½7R“7*7Té67Goc7#Έ7TAg7OçP7h¥~7oˆŒ7wÝž7{çÞ7†1–7‘i7‰ 7Ût7’YB7¶67Ÿ‹17§…F7¢]M7«Ÿ7­Å©7É©u7Î/;7Ô7éæ8­48±8[p8%·j8E{8UQp7V¦7 ئ7Ð7þ?7 &7 €p72°7SF7ú7F7"á 72©û7?gU7Jõ¢7DV@7;ÕW7JzÀ7XìÞ7†Â%7…7{ïQ7‚&}7|7…"Ÿ7µå7“é07”•j7žr 7¨þ%7ž¶x7˜…æ7ªä?7§6±7±[ø7·I*7Í!7Õ97òè8 ‹8 =8Ë(84/b8Fšt6ý}86ðÅ7¥É7´"7#w7 G87 í`7ƃ7JR7œ…7!]7)èè7Cø³7OF72ö7x´7VzK7d°ž7õL7—C&7mÌë7yk 7uЭ7‡×7‡ ¶7’&7›¨,7¡‹ê7©´97¤ò-7§¶7¸9Î7¨sÄ7´›7·( 7Ô`”7Ù¯7õž8Ë8i8¼8)q8?'7~7$ã7ÃÁ6è!7 ¡m7S›77¢Œ6ïQ 7< 7,¬h71õ71ø 7 ¼7%è{7N,37eî½7cÁC7`¡&7f¾^7`æ97_®Š7NüI7‚HØ7ƒë€7­?7ÜC7•%½7–¹v7¤ÁÍ7§š%7¬ïh7¥Oú7œçç7°†„7À¶™7ÙíÒ7âhý7çJR7ýÓ­8 oû8N¬82Úò7 @¬7 ;þ7®Í6õ÷é7&ü7 ij7Ù,7ÁÁ6ïœ%7ëü7FHB70s?7Pɵ7'p,7F6`7bÅI7f ®7„Ó7…æÓ7…9v7†ÿç7’$ç7“×ý7™97«K7¥[ó7–57¦+07©5á7²ß7®7°žì7±±17º÷ö7Éú7Þ‰7øep7êí7íì›7úœÓ8 T½8†Ä8$ƒÖ7}É7 ä7}_7£f6ò|å7ÁR7._Û7=ªé7“ß7é7>øÁ7vÝ7aÓ†7a÷È7]Ê=7hDy7fN7ƒ†7¤"}7˜i·7“݈7½n7ÎÜ7ºd7±ù7¦˜7¦‚P7°Çû7À7ψš7Æp7·è¨7­+I7Åûh7Ö77öÍQ8 ¯8\7úÓV8šÙ8 *ö8«8%ßm7¢6ìZy6ñÅì6ð©*6ê´?6Ûê©6ĵ¦6ã± 7¤B7Ü7aE7)>76¥«7+ùÁ7;—¹7\ ç7Oôê7qnÁ7{”ó7¸R7˜M7°æ7Åre7»â7™Ñõ7›°"7¥™7žÙ[7—Å­7¡Öÿ7¦J7}ˆ7¡„Ù7Áâ½7Õû°7ó{7ð7ô3@7Ìý7Î Ø7æ]ø7é¹p8 [x7 C46ç ,6òH(7 å·6ñÍ6Ì ½6ðÓ„6ü5K7 ò7”¾7 ©à7˜q7(”õ7+ †7I 7g7W¢7M±™7Í7¥¤D7£•‰7¹9|7ÅpH7«‰{7—$7– È7¢þ»7žªÞ7ìW7˜‘š7—cæ7™:Ã7ž¨æ7µ˜47É¿a7Þ?Ø7Öþ7܇7µj57Çà7Ó´7柴8kP6Õÿ6´ß6Åÿ“6Óä•6ûÈÃ6à y6ûÄ7¥±70ëp71÷¹78Y73Ú(7/Ó71î|76å”7=êÏ7:Î7G”7žE¨7žÚ¾7¹€‰7Ç@ó7² c7¦ÚB7«¾à7š+ž7°zñ7µ±i7©×Ú7¯A7›í]7÷Î7£W 7¯Å-7«‚»7ÁÑ7ÏGH7ÑÚÓ7Á~S7ÌÝË7ÓNÑ7ì¬j8ôÑ6Ó|t6Ía6íì­7w7Ëd7 ÞÈ7"c6ÿ,7ŽÉ7BŒÝ7H|i7/=I75)>7;#7^H·7mHE7ƒì¯7„ 77µ# 7Öuä7à{¿7ÑÜK7»´7³Úo7²÷&7¡Žñ7®%7Àù)7±«¥7¬nÇ7 qJ7¯ïG7±w=7½›7º7·$7¾éõ7½†q7´q7ÇÈ·7ƯK7ÕMp7Ôþ6ô*6ì€å6ç 7D70‰Î7E—©7-Žƒ7 ÷7ˆ7/ð†7VY 7'vs7JÂÍ7_ñŠ7ƒ&7…CZ7«7¾´ä8 C8% 8pœ7õK7΄ë7Àò#7¾ù 7½ à7Â"Q7Árú7ÄÚì7®ëÎ7¶¶r7Êj7Ë 7Âl"7ÁWa7¹/“7¿€}7ºø,7¸<¼7É7Õ+7Öôi7Ö6êøS6Ùç§6Úï«7 ‹6ñªß7Ì^7#Â75d7P(7ô±71çö7m77/º 7(Ñ/7I\ç7’ß–7¿¥é8 =Á8_Ì38ê|8pUñ8)~ª7ÿƒp7Ø÷Ë7ÇØŒ7ÀQs7Ðh7Æ&®7ÃÓÔ7½H 7±÷–7¿q¨7Ï@Û7Àç¯7´':7¼ëž7¾o7µ%Œ7űí7Ë‚}7×O7Ò ~7à;P6ä“ 7Â<7 hp7b7#Y7D;7-XN7À±7!Ç7å6ÿ§r78û«7=n—7@%7S‰7ŸF8ža8xÈ98Ës:8õí 8Õj¯8€€è8¼Ô7ßšÐ7Þb7׃7Õ¼\7ÑQŸ7Ó/\7¾}t7¬½7©õ’7¡»7©û57£#7®¢è7·LÂ7ºj7°„ñ7·¥7¹3û7ËŠæ7ÎÕ¦7 MÍ7^ 7& ´77EËo7R6m7(+û7÷±7W707²I79öÐ7=A7KÉÊ7c?Ü7³i8?8&¾8ûE9Þ8ÿ8žM58)Öj7ûIï7æ ‰7èH7êÐÑ7å7â#Ž7Ö-7Æ$·7Âv­7¸*¡7Âë¬7´[-7·mØ7¾3™7Áe/7¾$7ÄÉ÷7¼=7Áÿä7ÇÏ¡7²<6ÔRX7ß›6Û£ò7&/7!ÕN7-¸e7c 7-7bÖ6ðfW6ÿ‰ë7’73‰Ý7wü+7¦Ý48+8’6¥8ýß9×ñ8ý©¡8¡¸80M–8 Ô8‹ó8 Zá8h¤8¦87êöi7Úëü7¾Æ7½/î7¸v.7·Gu7°Ó–7®[Â7¿17²V´7¬w87°Æþ7¨žã7¼ÁÌ7ÆF^6ߤ=6â¾6ÕW 6Ú°š6ÈCM7 Îú7'‡=7ˆ6ñOÓ6»9A6éEÀ7 4)70>û7h¹7æj7®tG7úâê8Jg08§%8¾¨æ8¡ú½8Vz8O/8ÍQ8E8 “8m”8–V8ËÈ7åŠ+7Ó»Â7ÄW»7ºgh7¦}x7¤Qá7­Áý7¼a˜7³“Î7°T7Ÿÿw7™V 7£ÀG7¢Ï6ÔÁñ6á¶&6­i7 Z7¶¶7³Ù7 Nw7^ã7Ø7Ãå7Òá7 Ý78äö7jK”7–)ú7°øú7ÛÁ8r›8Uø8r}y8R8 –o8 ª:8}8-WŸ88è85¥8&±8y.8Ù7é‘È7Û¥¶7͸I7¤ÎÞ7®µr7µöž7¹¦³7¸pš7«qô7¥27›2F7šrí7 I}6×èO6¹ ÿ6ÇZ66ݽð6ÌÿÔ6íhb75ó7 Ðp7· 7l#7 +V7/à7<íÆ7hšq7¥ü7¾O†7áJ´7üß¿8478 „88·‘8#8æ81\.8X”â8x)ž8váß8^­8;ªè8!ñÂ8 D7æèº7Êsæ7¿ÒD7´7¹ˆ$7ÇZ÷7¦}7®®÷7§€,7§íŠ7©^.7È› 6|žç6ª Œ6‹¶á6zV6zM 6Âtë6Á`Š6žrþ6®V6´+·6âá 7ÚÙ7=EV7‰Üý7—mÄ7ž©Œ7³:Á7¶iÇ7ºf†7× ]8™,8]Õ81›ì8p;­8Ÿ ÿ8»x8².Y8šÓ‹8z D8@m8¹í8eØ7×Ûz7ÏòQ7«¦ð7¦|"7Ã%^7À+«7¢û{7’ü7`§7©:X7P“6ç¹ù6º:{6§âX6­Z6å.06ëW@6¹v§6–ɺ7ø6ÜåÜ6Þ 7žÝ7*‰7_)7…n­7”Tõ7Ÿ;•7žƒ7ªFJ7Æp7ÿQ€8&ÏÈ8d¿8® 8ñƒB9 t­8û–@8ÊT8š5Þ8`º<8+Á]837éjk7Ùn7¥¶7§ÿ¢7ÄÑ07¿<¾7£ðç7ˆL7–@7³'Ä7™œ6øµ67x6mÙô6Ø@6ØWÅ6Øöí6ÄÀ6Þ»%7ÀO7™ 7ý¨7» 7 7-JÕ7_÷ÿ7Ž,°7—ô7¥ÏŒ7¹»ö7Óaù8 t8S¹M8 &9M99©9Pœ*96è9 ~N8Äc°8‰šs8Hü?8…©8ã÷7êuÌ7Ä<7µÎÎ7ĬO7Ãáf7@%7Œy˜7š¦‡7¦Áh7²ác6éÒv6‘ÁÔ6†ƒI6ÌÀm6âë‚6Æ!Ä6·I"6Ñù³6­1 6ÔÛ6æó%7 ð†7/¶n7)Že7)Á7G1¹7oµ¯7‹p7—Û7¼F8Š„8eüé8Â*J9(‘H9{.9Ѝ9f——9"fÑ8ל8’[g8RkÖ8Æy7ùxj7ÑŽ@7ÃÓ7ÄÙÔ7ËSÁ7«Mà7—¹7Œdx7œÄ7 dB7˜È¦6åll6Ã#|6}ýJ6‡'6×o›6ÐîB6•š6ägv6‘_Ý6ÕÉ 6¨C\6ûvÍ7"a$75³7E´7!÷Ù7MŽ7VÃY7_?7©e8»Ä8Y2•8ºYë9(òß9|5À9‹šw9h`Q9" 8×;¿8Ö!8P8bA7è+ô7·Ig7´7¢âA7¶5Ô7§T‘7’ 7€PÄ7ŸúF7”5@7‹)ª6™OA6¹!R6ÕÍ86ª¯÷6¸ø¢6ÀP6È‹t6ñÐg6Û~Y6›S­6ÄBŸ6ú"‚6ñú¡6ñZ 74„7 7d7&f7ez(7«p7ú!8FDr8¦jr90r9RV9jŽ¿9GÑX9È8½.A8‚L.8?¿87·Jë7 ¡-7¤877Ÿºe7È…7ˆìß7”žÎ7›a7’½Z7•V6ëÍL6²QC6»h–6¦C6ûѬ6á÷6½_6Ûpê6Ód76†ø6š›©6Ï@X6ÏÀ(6ë£C7Ã7X¤7uë77ŠÄ7fk£7„ ,7¸À¢8—à8Yêö8©M8ýïç9^<9m8Ç1¼8V8MM`8ñˆ7êî‘7¾‘37¡¸'7¡ã…7–%7¤fY7©B7¡L7š±§7–»7šC|7˜6ÏØW6ʸ86¡*^6Éx¼6ÄT7ã36ñ£÷6²¼ì6®¦¸6«3t6µ¡&6Ï£ÿ6Æ{6ÀÖ7Â72™7*ËŽ7jB7Cc¶7E…(7Œ7Øn.8å8[‘¶8 ˜8»r¿8¯Qý8Ž P8Zd¿8$Ch8G7Þ1ä7¾öÄ7©‹Ø7žß@7£sê7¸;o7Àã7¢ *7“D7•x7–oŸ7– 6³òü6Àøˆ6­;h6Ïtw6 ý€6ž»Í6ž<6¶[P6žÑ6•Ì46²ƒÙ6ß„þ6þµZ6þø$7 PØ7„j7TÚ7b…7(+77Aƒ7‘Rg7¨Á7ÏÖâ8 y«8= O8`œ8S_¦86;ÿ8]'8h/7âC½7º®l7§H7¨ ˜7Ž7¢37ÍL7¿Ì¹7žÇ!7š2a7œÌ—7›vä7¥9¼6 c#6Ê‚¿6§¤e6þT6¯”Æ6—3r6ƒI6ÇÄB6¹6¸†6ÖAì6Ò°c6ιh6ÚÆ17{}71µ79š«7.¹7(=§70µ37^7‰}w7†p7¯8X7ëJ8ƒ47û#×7ú½ 7ÖHÑ7Ïö%7©`B7›Wá7’57-U7…!ÿ7‰2Ñ7”¸7§™­7’Ð57{O`7‚Fq7‰N¤7“PÔ6Á&6Ô2š6äQ´6Ïè›6Ïþf6«ö-6Ï{Ñ6Ô¼6¯tb6Ö^À6Én*6ïTÇ7c˜6þGp77Ô7ÆL7Qú7&I7G¯ä7L]7QÙ7_Hò7c<Æ7{7ªŸ7 ,o7±·î7Æ 07±ƒY7™¼™7r!õ7$Ï7ŠÜ7y2E7Š_7‘q%7‹Ü7žC57„P7hÎ7oßÔ7˜²n7¢‰c6öäÃ6¸f6»¹(6áb6¹g6¡V6¤ok6¨,º6¬jÅ6”š6±%6ÕÃL6»~¦6Ã(q6Ï6ï;6Ëm&7 Ÿ26üÏ7#>7Té`7PËÆ7‚ÊÑ7Žìš7‡;7†ÐT7‘ŒF7­,-7®ìz7ˆÓ7ˆäé7º7†˜K7f 87tù7Š27”ü7…<½7|G*7p 7ƒ_47„j7’W_7i6æì+6©}h6Ⱥ76àá 6¢³6sÉç6°J"6ØÊ]6œ›6ã®6åÎÝ6Áçt6Õ’ˆ6ï÷o6øF7ž"7yC7Æl7*î)7:‡7Aƒ–7;Áh7b6ÿ7qí7s½ 7l¨¦7’’¦7–ÃM7‡Ýõ7ŽìÐ7ƒÏ‰7}Ÿ7sÒr7gÃí7xiG7€sq7rJR72—7|°Ù7ƒþ7‡Z7‹Öf7)±17 *6ïß6ðæÂ6èD£6Žþc6½G.6ê–“6áx*6­ë6ÀÀ_6äÓ7Ê6ç¬6äìV7Ìm7,7¼6ñ7Å7€ê7>Ìð76â71g/7[¯v7kCÛ7vÂÃ7xBª7{ÐR7‰÷7†ÕU7‹y7‡B‘7`·Ž7fmr7cÔ7h2^7fú7†Š7‡X²7Š 7†/7â£7-XH7p“6Þ^’6¹À»6ʾ6šúu6S6¤ò?6˜Ã¯6´Ç6Ø ³6ï®(7"<6«×–6èÇ–6å°á6õ!Š6áa7t_7|ï7 ©™7BÆ7:&ò7"Ñ$7>DR7\ˆ7qÍ}77Ú7oa|7lfƒ7t67mJ7lÌñ7Já³7Iÿ›7@#<7Q }7YÏÛ7:…!7L¡E7e‚7d¸ž7•7Wæã7FÚ÷7„!7À7WJ6Ú V6 cQ6‚8J6«Sr6·ð6Ëÿ§6ö²B6æà¢6©CQ6Dz6¾ š7X06óFà6â‘a7<56釈7Þî7*¿ú7æ7÷Ù7Dw7C À7ZÁ¢7jôš7XO†7cFu7ZšÔ7F°¦7Eˆ7EBž7_* 7n&¦7gŠŸ7eñ7hÜÙ7jøÿ7‹ÿ7{ºØ7¸Ž 7¤S{7‚Ke7Zç7:M-7 ‹Ü6ì 6½c6²>©6õ‘ƒ6Ο(6‘¤è6ë[6Æíï6´z¾6ò“S6ÆÕ6ç¦6ù¦¾6Ê‹K6ìx7—C7(Ù7=Ñ27@&n7EŸó7;ܽ7RëD7ePý7V¨7?¹#7Dê-7Kº7bŽ67MŸ7€í7o 7o™·7hø»7ƒOß7‚0â7¯øD7 sã8̸7Ö8>7£&7ޝ7[+h7/&6ÎÖ‚6üMù7 î7™P6ó,›6ªLñ6£Õ7“Ë6é 6ã·]6Ùýé7Ÿ77 áF6ûû7 °T7*aö7'öz7L± 7Cmy7Bõ{7;Ô77[57Vl:7M$7;Žü7\In7VÔ¹7Z7.ê/7.Ý7@ |7aP«7p‹q7p¬*7tñ7:7— )8RYö8Ù«7ÇZç7ó·7\ú7"Äu6åkÈ6ø°]7m 7 26ÿPÊ6á•À6˜³”6°Ka6óö 6ê^å6ê66úÏ 6»W 6»¾ó6ôiù7&üà7l7rÓ7.tÿ71[70'Ã7* ~7'¶7@7,Ë7QT7Kˆ7Jq*7,–7$"f7:ÓC7Op87UÙµ7SzE7ZR7z^ï7h#reproject-0.3.2/reproject/tests/data/gc_eq.hdr0000644000077000000240000000215512522473423021263 0ustar tomstaff00000000000000WCSAXES = 2 / Number of coordinate axes CRPIX1 = 361.0 / Pixel coordinate of reference point CRPIX2 = 360.5 / Pixel coordinate of reference point CDELT1 = -0.001388889 / [deg] Coordinate increment at reference point CDELT2 = 0.001388889 / [deg] Coordinate increment at reference point CUNIT1 = 'deg' / Units of coordinate increment and value CUNIT2 = 'deg' / Units of coordinate increment and value CTYPE1 = 'RA---TAN' / Right ascension, gnomonic projection CTYPE2 = 'DEC--TAN' / Declination, gnomonic projection CRVAL1 = 266.4 / [deg] Coordinate value at reference point CRVAL2 = -28.93333 / [deg] Coordinate value at reference point LONPOLE = 180.0 / [deg] Native longitude of celestial pole LATPOLE = -28.93333 / [deg] Native latitude of celestial pole EQUINOX = 2000.0 / [yr] Equinox of equatorial coordinates reproject-0.3.2/reproject/tests/data/gc_ga.hdr0000644000077000000240000000203412522473423021241 0ustar tomstaff00000000000000WCSAXES = 2 / Number of coordinate axes CRPIX1 = 75.907 / Pixel coordinate of reference point CRPIX2 = 74.8485 / Pixel coordinate of reference point CDELT1 = -0.006666666828 / [deg] Coordinate increment at reference point CDELT2 = 0.006666666828 / [deg] Coordinate increment at reference point CUNIT1 = 'deg' / Units of coordinate increment and value CUNIT2 = 'deg' / Units of coordinate increment and value CTYPE1 = 'GLON-CAR' / galactic longitude, plate caree projection CTYPE2 = 'GLAT-CAR' / galactic latitude, plate caree projection CRVAL1 = 0.0 / [deg] Coordinate value at reference point CRVAL2 = 0.0 / [deg] Coordinate value at reference point LONPOLE = 0.0 / [deg] Native longitude of celestial pole LATPOLE = 90.0 / [deg] Native latitude of celestial pole reproject-0.3.2/reproject/tests/data/mwpan2_RGB_3600.hdr0000644000077000000240000016157713173065737022601 0ustar tomstaff00000000000000SIMPLE = T / Fits standard BITPIX = -32 / Bits per pixel NAXIS = 3 / Number of axes NAXIS1 = 3600 / Axis length NAXIS2 = 1800 / Axis length NAXIS3 = 3 / Axis length EXTEND = T / File may contain extensions ORIGIN = 'NOAO-IRAF FITS Image Kernel July 2003' / FITS file originator OBJECT = ' ' / Name of the object observed DATE = '2009-09-03T04:30:56' / Date FITS file was generated IRAF-TLM= '00:30:56 (03/09/2009)' / Time of last modification EQUINOX = 2.000000000E+03 / Mean equinox RADECSYS= 'ICRS ' / Astrometric system CTYPE1 = 'GLON-CAR' / WCS projection type for this axis CUNIT1 = 'deg ' / Axis unit CRPIX1 = 1800.950026799 / Reference pixel on this axis CD1_1 = -0.099999998509884 / Linear projection matrix CTYPE2 = 'GLAT-CAR' / WCS projection type for this axis CUNIT2 = 'deg ' / Axis unit CRPIX2 = 900.950013387949 / Reference pixel on this axis CD2_2 = 0.099999998509884 / Linear projection matrix SATURATE= 4.900616247E+04 / 50000 ADU in 0.5 s exposure, scaled 480x EXPTIME = 0.000000000E+00 / Maximum equivalent exposure time (s) GAIN = 1.424466208E+00 / Maximum equivalent gain (e-/ADU) COMMENT SOFTNAME= 'SWarp ' / The software that processed those data SOFTVERS= '2.17.6 ' / Version of the software SOFTDATE= '2009-06-07' / Release date of the software SOFTAUTH= 'Emmanuel BERTIN ' / Maintainer of the software SOFTINST= 'IAP http://www.iap.fr' / Institute COMMENT AUTHOR = 'axel ' / Who ran the software COMBINET= 'WEIGHTED' / COMBINE_TYPE config parameter for SWarp COMMENT COMMENT Propagated FITS keywords COMMENT COMMENT Axis-dependent config parameters RESAMPT1= 'BILINEAR' / RESAMPLING_TYPE config parameter CENTERT1= 'MANUAL ' / CENTER_TYPE config parameter PSCALET1= 'MANUAL ' / PIXELSCALE_TYPE config parameter RESAMPT2= 'BILINEAR' / RESAMPLING_TYPE config parameter CENTERT2= 'MANUAL ' / CENTER_TYPE config parameter PSCALET2= 'MANUAL ' / PIXELSCALE_TYPE config parameter COMMENT COMMENT File-dependent config parameters FILE0001= 'field00_Blue_bgsubt2.resamp.fits' / Input filename WGHT0001= 'field00_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0001= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0001= F / INTERPOLATE config flag SUBF0001= F / SUBTRACT_BACK config flag BCKT0001= 'MANUAL ' / BACK_TYPE config parameter BCKD0001= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0001= 128 / BACK_SIZE config parameter BKFS0001= 3 / BACK_FILTERSIZE config parameter FILE0002= 'field01_Blue_bgsubt2.resamp.fits' / Input filename WGHT0002= 'field01_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0002= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0002= F / INTERPOLATE config flag SUBF0002= F / SUBTRACT_BACK config flag BCKT0002= 'MANUAL ' / BACK_TYPE config parameter BCKD0002= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0002= 128 / BACK_SIZE config parameter BKFS0002= 3 / BACK_FILTERSIZE config parameter FILE0003= 'field02_Blue_bgsubt2.resamp.fits' / Input filename WGHT0003= 'field02_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0003= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0003= F / INTERPOLATE config flag SUBF0003= F / SUBTRACT_BACK config flag BCKT0003= 'MANUAL ' / BACK_TYPE config parameter BCKD0003= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0003= 128 / BACK_SIZE config parameter BKFS0003= 3 / BACK_FILTERSIZE config parameter FILE0004= 'field03_Blue_bgsubt2.resamp.fits' / Input filename WGHT0004= 'field03_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0004= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0004= F / INTERPOLATE config flag SUBF0004= F / SUBTRACT_BACK config flag BCKT0004= 'MANUAL ' / BACK_TYPE config parameter BCKD0004= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0004= 128 / BACK_SIZE config parameter BKFS0004= 3 / BACK_FILTERSIZE config parameter FILE0005= 'field04_Blue_bgsubt2.resamp.fits' / Input filename WGHT0005= 'field04_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0005= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0005= F / INTERPOLATE config flag SUBF0005= F / SUBTRACT_BACK config flag BCKT0005= 'MANUAL ' / BACK_TYPE config parameter BCKD0005= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0005= 128 / BACK_SIZE config parameter BKFS0005= 3 / BACK_FILTERSIZE config parameter FILE0006= 'field05_Blue_bgsubt2.resamp.fits' / Input filename WGHT0006= 'field05_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0006= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0006= F / INTERPOLATE config flag SUBF0006= F / SUBTRACT_BACK config flag BCKT0006= 'MANUAL ' / BACK_TYPE config parameter BCKD0006= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0006= 128 / BACK_SIZE config parameter BKFS0006= 3 / BACK_FILTERSIZE config parameter FILE0007= 'field06_Blue_bgsubt2.resamp.fits' / Input filename WGHT0007= 'field06_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0007= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0007= F / INTERPOLATE config flag SUBF0007= F / SUBTRACT_BACK config flag BCKT0007= 'MANUAL ' / BACK_TYPE config parameter BCKD0007= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0007= 128 / BACK_SIZE config parameter BKFS0007= 3 / BACK_FILTERSIZE config parameter FILE0008= 'field07_Blue_bgsubt2.resamp.fits' / Input filename WGHT0008= 'field07_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0008= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0008= F / INTERPOLATE config flag SUBF0008= F / SUBTRACT_BACK config flag BCKT0008= 'MANUAL ' / BACK_TYPE config parameter BCKD0008= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0008= 128 / BACK_SIZE config parameter BKFS0008= 3 / BACK_FILTERSIZE config parameter FILE0009= 'field08_Blue_bgsubt2.resamp.fits' / Input filename WGHT0009= 'field08_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0009= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0009= F / INTERPOLATE config flag SUBF0009= F / SUBTRACT_BACK config flag BCKT0009= 'MANUAL ' / BACK_TYPE config parameter BCKD0009= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0009= 128 / BACK_SIZE config parameter BKFS0009= 3 / BACK_FILTERSIZE config parameter FILE0010= 'field09_Blue_bgsubt2.resamp.fits' / Input filename WGHT0010= 'field09_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0010= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0010= F / INTERPOLATE config flag SUBF0010= F / SUBTRACT_BACK config flag BCKT0010= 'MANUAL ' / BACK_TYPE config parameter BCKD0010= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0010= 128 / BACK_SIZE config parameter BKFS0010= 3 / BACK_FILTERSIZE config parameter FILE0011= 'field10_Blue_bgsubt2.resamp.fits' / Input filename WGHT0011= 'field10_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0011= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0011= F / INTERPOLATE config flag SUBF0011= F / SUBTRACT_BACK config flag BCKT0011= 'MANUAL ' / BACK_TYPE config parameter BCKD0011= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0011= 128 / BACK_SIZE config parameter BKFS0011= 3 / BACK_FILTERSIZE config parameter FILE0012= 'field11_Blue_bgsubt2.resamp.fits' / Input filename WGHT0012= 'field11_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0012= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0012= F / INTERPOLATE config flag SUBF0012= F / SUBTRACT_BACK config flag BCKT0012= 'MANUAL ' / BACK_TYPE config parameter BCKD0012= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0012= 128 / BACK_SIZE config parameter BKFS0012= 3 / BACK_FILTERSIZE config parameter FILE0013= 'field12_Blue_bgsubt2.resamp.fits' / Input filename WGHT0013= 'field12_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0013= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0013= F / INTERPOLATE config flag SUBF0013= F / SUBTRACT_BACK config flag BCKT0013= 'MANUAL ' / BACK_TYPE config parameter BCKD0013= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0013= 128 / BACK_SIZE config parameter BKFS0013= 3 / BACK_FILTERSIZE config parameter FILE0014= 'field13_Blue_bgsubt2.resamp.fits' / Input filename WGHT0014= 'field13_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0014= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0014= F / INTERPOLATE config flag SUBF0014= F / SUBTRACT_BACK config flag BCKT0014= 'MANUAL ' / BACK_TYPE config parameter BCKD0014= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0014= 128 / BACK_SIZE config parameter BKFS0014= 3 / BACK_FILTERSIZE config parameter FILE0015= 'field14_Blue_bgsubt2.resamp.fits' / Input filename WGHT0015= 'field14_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0015= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0015= F / INTERPOLATE config flag SUBF0015= F / SUBTRACT_BACK config flag BCKT0015= 'MANUAL ' / BACK_TYPE config parameter BCKD0015= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0015= 128 / BACK_SIZE config parameter BKFS0015= 3 / BACK_FILTERSIZE config parameter FILE0016= 'field15_Blue_bgsubt2.resamp.fits' / Input filename WGHT0016= 'field15_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0016= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0016= F / INTERPOLATE config flag SUBF0016= F / SUBTRACT_BACK config flag BCKT0016= 'MANUAL ' / BACK_TYPE config parameter BCKD0016= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0016= 128 / BACK_SIZE config parameter BKFS0016= 3 / BACK_FILTERSIZE config parameter FILE0017= 'field16_Blue_bgsubt2.resamp.fits' / Input filename WGHT0017= 'field16_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0017= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0017= F / INTERPOLATE config flag SUBF0017= F / SUBTRACT_BACK config flag BCKT0017= 'MANUAL ' / BACK_TYPE config parameter BCKD0017= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0017= 128 / BACK_SIZE config parameter BKFS0017= 3 / BACK_FILTERSIZE config parameter FILE0018= 'field17_Blue_bgsubt2.resamp.fits' / Input filename WGHT0018= 'field17_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0018= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0018= F / INTERPOLATE config flag SUBF0018= F / SUBTRACT_BACK config flag BCKT0018= 'MANUAL ' / BACK_TYPE config parameter BCKD0018= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0018= 128 / BACK_SIZE config parameter BKFS0018= 3 / BACK_FILTERSIZE config parameter FILE0019= 'field18_Blue_bgsubt2.resamp.fits' / Input filename WGHT0019= 'field18_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0019= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0019= F / INTERPOLATE config flag SUBF0019= F / SUBTRACT_BACK config flag BCKT0019= 'MANUAL ' / BACK_TYPE config parameter BCKD0019= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0019= 128 / BACK_SIZE config parameter BKFS0019= 3 / BACK_FILTERSIZE config parameter FILE0020= 'field19_Blue_bgsubt2.resamp.fits' / Input filename WGHT0020= 'field19_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0020= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0020= F / INTERPOLATE config flag SUBF0020= F / SUBTRACT_BACK config flag BCKT0020= 'MANUAL ' / BACK_TYPE config parameter BCKD0020= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0020= 128 / BACK_SIZE config parameter BKFS0020= 3 / BACK_FILTERSIZE config parameter FILE0021= 'field20_Blue_bgsubt2.resamp.fits' / Input filename WGHT0021= 'field20_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0021= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0021= F / INTERPOLATE config flag SUBF0021= F / SUBTRACT_BACK config flag BCKT0021= 'MANUAL ' / BACK_TYPE config parameter BCKD0021= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0021= 128 / BACK_SIZE config parameter BKFS0021= 3 / BACK_FILTERSIZE config parameter FILE0022= 'field21_Blue_bgsubt2.resamp.fits' / Input filename WGHT0022= 'field21_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0022= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0022= F / INTERPOLATE config flag SUBF0022= F / SUBTRACT_BACK config flag BCKT0022= 'MANUAL ' / BACK_TYPE config parameter BCKD0022= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0022= 128 / BACK_SIZE config parameter BKFS0022= 3 / BACK_FILTERSIZE config parameter FILE0023= 'field22_Blue_bgsubt2.resamp.fits' / Input filename WGHT0023= 'field22_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0023= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0023= F / INTERPOLATE config flag SUBF0023= F / SUBTRACT_BACK config flag BCKT0023= 'MANUAL ' / BACK_TYPE config parameter BCKD0023= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0023= 128 / BACK_SIZE config parameter BKFS0023= 3 / BACK_FILTERSIZE config parameter FILE0024= 'field23_Blue_bgsubt2.resamp.fits' / Input filename WGHT0024= 'field23_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0024= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0024= F / INTERPOLATE config flag SUBF0024= F / SUBTRACT_BACK config flag BCKT0024= 'MANUAL ' / BACK_TYPE config parameter BCKD0024= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0024= 128 / BACK_SIZE config parameter BKFS0024= 3 / BACK_FILTERSIZE config parameter FILE0025= 'field24_Blue_bgsubt2.resamp.fits' / Input filename WGHT0025= 'field24_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0025= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0025= F / INTERPOLATE config flag SUBF0025= F / SUBTRACT_BACK config flag BCKT0025= 'MANUAL ' / BACK_TYPE config parameter BCKD0025= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0025= 128 / BACK_SIZE config parameter BKFS0025= 3 / BACK_FILTERSIZE config parameter FILE0026= 'field25_Blue_bgsubt2.resamp.fits' / Input filename WGHT0026= 'field25_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0026= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0026= F / INTERPOLATE config flag SUBF0026= F / SUBTRACT_BACK config flag BCKT0026= 'MANUAL ' / BACK_TYPE config parameter BCKD0026= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0026= 128 / BACK_SIZE config parameter BKFS0026= 3 / BACK_FILTERSIZE config parameter FILE0027= 'field26_Blue_bgsubt2.resamp.fits' / Input filename WGHT0027= 'field26_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0027= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0027= F / INTERPOLATE config flag SUBF0027= F / SUBTRACT_BACK config flag BCKT0027= 'MANUAL ' / BACK_TYPE config parameter BCKD0027= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0027= 128 / BACK_SIZE config parameter BKFS0027= 3 / BACK_FILTERSIZE config parameter FILE0028= 'field27_Blue_bgsubt2.resamp.fits' / Input filename WGHT0028= 'field27_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0028= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0028= F / INTERPOLATE config flag SUBF0028= F / SUBTRACT_BACK config flag BCKT0028= 'MANUAL ' / BACK_TYPE config parameter BCKD0028= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0028= 128 / BACK_SIZE config parameter BKFS0028= 3 / BACK_FILTERSIZE config parameter FILE0029= 'field28_Blue_bgsubt2.resamp.fits' / Input filename WGHT0029= 'field28_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0029= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0029= F / INTERPOLATE config flag SUBF0029= F / SUBTRACT_BACK config flag BCKT0029= 'MANUAL ' / BACK_TYPE config parameter BCKD0029= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0029= 128 / BACK_SIZE config parameter BKFS0029= 3 / BACK_FILTERSIZE config parameter FILE0030= 'field29_Blue_bgsubt2.resamp.fits' / Input filename WGHT0030= 'field29_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0030= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0030= F / INTERPOLATE config flag SUBF0030= F / SUBTRACT_BACK config flag BCKT0030= 'MANUAL ' / BACK_TYPE config parameter BCKD0030= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0030= 128 / BACK_SIZE config parameter BKFS0030= 3 / BACK_FILTERSIZE config parameter FILE0031= 'field30_Blue_bgsubt2.resamp.fits' / Input filename WGHT0031= 'field30_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0031= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0031= F / INTERPOLATE config flag SUBF0031= F / SUBTRACT_BACK config flag BCKT0031= 'MANUAL ' / BACK_TYPE config parameter BCKD0031= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0031= 128 / BACK_SIZE config parameter BKFS0031= 3 / BACK_FILTERSIZE config parameter FILE0032= 'field31_Blue_bgsubt2.resamp.fits' / Input filename WGHT0032= 'field31_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0032= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0032= F / INTERPOLATE config flag SUBF0032= F / SUBTRACT_BACK config flag BCKT0032= 'MANUAL ' / BACK_TYPE config parameter BCKD0032= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0032= 128 / BACK_SIZE config parameter BKFS0032= 3 / BACK_FILTERSIZE config parameter FILE0033= 'field32_Blue_bgsubt2.resamp.fits' / Input filename WGHT0033= 'field32_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0033= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0033= F / INTERPOLATE config flag SUBF0033= F / SUBTRACT_BACK config flag BCKT0033= 'MANUAL ' / BACK_TYPE config parameter BCKD0033= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0033= 128 / BACK_SIZE config parameter BKFS0033= 3 / BACK_FILTERSIZE config parameter FILE0034= 'field33_Blue_bgsubt2.resamp.fits' / Input filename WGHT0034= 'field33_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0034= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0034= F / INTERPOLATE config flag SUBF0034= F / SUBTRACT_BACK config flag BCKT0034= 'MANUAL ' / BACK_TYPE config parameter BCKD0034= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0034= 128 / BACK_SIZE config parameter BKFS0034= 3 / BACK_FILTERSIZE config parameter FILE0035= 'field34_Blue_bgsubt2.resamp.fits' / Input filename WGHT0035= 'field34_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0035= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0035= F / INTERPOLATE config flag SUBF0035= F / SUBTRACT_BACK config flag BCKT0035= 'MANUAL ' / BACK_TYPE config parameter BCKD0035= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0035= 128 / BACK_SIZE config parameter BKFS0035= 3 / BACK_FILTERSIZE config parameter FILE0036= 'field35_Blue_bgsubt2.resamp.fits' / Input filename WGHT0036= 'field35_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0036= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0036= F / INTERPOLATE config flag SUBF0036= F / SUBTRACT_BACK config flag BCKT0036= 'MANUAL ' / BACK_TYPE config parameter BCKD0036= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0036= 128 / BACK_SIZE config parameter BKFS0036= 3 / BACK_FILTERSIZE config parameter FILE0037= 'field36_Blue_bgsubt2.resamp.fits' / Input filename WGHT0037= 'field36_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0037= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0037= F / INTERPOLATE config flag SUBF0037= F / SUBTRACT_BACK config flag BCKT0037= 'MANUAL ' / BACK_TYPE config parameter BCKD0037= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0037= 128 / BACK_SIZE config parameter BKFS0037= 3 / BACK_FILTERSIZE config parameter FILE0038= 'field37_Blue_bgsubt2.resamp.fits' / Input filename WGHT0038= 'field37_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0038= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0038= F / INTERPOLATE config flag SUBF0038= F / SUBTRACT_BACK config flag BCKT0038= 'MANUAL ' / BACK_TYPE config parameter BCKD0038= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0038= 128 / BACK_SIZE config parameter BKFS0038= 3 / BACK_FILTERSIZE config parameter FILE0039= 'field38_Blue_bgsubt2.resamp.fits' / Input filename WGHT0039= 'field38_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0039= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0039= F / INTERPOLATE config flag SUBF0039= F / SUBTRACT_BACK config flag BCKT0039= 'MANUAL ' / BACK_TYPE config parameter BCKD0039= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0039= 128 / BACK_SIZE config parameter BKFS0039= 3 / BACK_FILTERSIZE config parameter FILE0040= 'field39_Blue_bgsubt2.resamp.fits' / Input filename WGHT0040= 'field39_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0040= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0040= F / INTERPOLATE config flag SUBF0040= F / SUBTRACT_BACK config flag BCKT0040= 'MANUAL ' / BACK_TYPE config parameter BCKD0040= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0040= 128 / BACK_SIZE config parameter BKFS0040= 3 / BACK_FILTERSIZE config parameter FILE0041= 'field40_Blue_bgsubt2.resamp.fits' / Input filename WGHT0041= 'field40_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0041= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0041= F / INTERPOLATE config flag SUBF0041= F / SUBTRACT_BACK config flag BCKT0041= 'MANUAL ' / BACK_TYPE config parameter BCKD0041= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0041= 128 / BACK_SIZE config parameter BKFS0041= 3 / BACK_FILTERSIZE config parameter FILE0042= 'field41_Blue_bgsubt2.resamp.fits' / Input filename WGHT0042= 'field41_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0042= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0042= F / INTERPOLATE config flag SUBF0042= F / SUBTRACT_BACK config flag BCKT0042= 'MANUAL ' / BACK_TYPE config parameter BCKD0042= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0042= 128 / BACK_SIZE config parameter BKFS0042= 3 / BACK_FILTERSIZE config parameter FILE0043= 'field42_Blue_bgsubt2.resamp.fits' / Input filename WGHT0043= 'field42_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0043= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0043= F / INTERPOLATE config flag SUBF0043= F / SUBTRACT_BACK config flag BCKT0043= 'MANUAL ' / BACK_TYPE config parameter BCKD0043= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0043= 128 / BACK_SIZE config parameter BKFS0043= 3 / BACK_FILTERSIZE config parameter FILE0044= 'field43_Blue_bgsubt2.resamp.fits' / Input filename WGHT0044= 'field43_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0044= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0044= F / INTERPOLATE config flag SUBF0044= F / SUBTRACT_BACK config flag BCKT0044= 'MANUAL ' / BACK_TYPE config parameter BCKD0044= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0044= 128 / BACK_SIZE config parameter BKFS0044= 3 / BACK_FILTERSIZE config parameter FILE0045= 'field44_Blue_bgsubt2.resamp.fits' / Input filename WGHT0045= 'field44_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0045= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0045= F / INTERPOLATE config flag SUBF0045= F / SUBTRACT_BACK config flag BCKT0045= 'MANUAL ' / BACK_TYPE config parameter BCKD0045= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0045= 128 / BACK_SIZE config parameter BKFS0045= 3 / BACK_FILTERSIZE config parameter FILE0046= 'field45_Blue_bgsubt2.resamp.fits' / Input filename WGHT0046= 'field45_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0046= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0046= F / INTERPOLATE config flag SUBF0046= F / SUBTRACT_BACK config flag BCKT0046= 'MANUAL ' / BACK_TYPE config parameter BCKD0046= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0046= 128 / BACK_SIZE config parameter BKFS0046= 3 / BACK_FILTERSIZE config parameter FILE0047= 'field46_Blue_bgsubt2.resamp.fits' / Input filename WGHT0047= 'field46_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0047= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0047= F / INTERPOLATE config flag SUBF0047= F / SUBTRACT_BACK config flag BCKT0047= 'MANUAL ' / BACK_TYPE config parameter BCKD0047= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0047= 128 / BACK_SIZE config parameter BKFS0047= 3 / BACK_FILTERSIZE config parameter FILE0048= 'field47_Blue_bgsubt2.resamp.fits' / Input filename WGHT0048= 'field47_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0048= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0048= F / INTERPOLATE config flag SUBF0048= F / SUBTRACT_BACK config flag BCKT0048= 'MANUAL ' / BACK_TYPE config parameter BCKD0048= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0048= 128 / BACK_SIZE config parameter BKFS0048= 3 / BACK_FILTERSIZE config parameter FILE0049= 'field48_Blue_bgsubt2.resamp.fits' / Input filename WGHT0049= 'field48_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0049= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0049= F / INTERPOLATE config flag SUBF0049= F / SUBTRACT_BACK config flag BCKT0049= 'MANUAL ' / BACK_TYPE config parameter BCKD0049= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0049= 128 / BACK_SIZE config parameter BKFS0049= 3 / BACK_FILTERSIZE config parameter FILE0050= 'field49_Blue_bgsubt2.resamp.fits' / Input filename WGHT0050= 'field49_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0050= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0050= F / INTERPOLATE config flag SUBF0050= F / SUBTRACT_BACK config flag BCKT0050= 'MANUAL ' / BACK_TYPE config parameter BCKD0050= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0050= 128 / BACK_SIZE config parameter BKFS0050= 3 / BACK_FILTERSIZE config parameter FILE0051= 'field50_Blue_bgsubt2.resamp.fits' / Input filename WGHT0051= 'field50_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0051= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0051= F / INTERPOLATE config flag SUBF0051= F / SUBTRACT_BACK config flag BCKT0051= 'MANUAL ' / BACK_TYPE config parameter BCKD0051= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0051= 128 / BACK_SIZE config parameter BKFS0051= 3 / BACK_FILTERSIZE config parameter FILE0052= 'field51_Blue_bgsubt2.resamp.fits' / Input filename WGHT0052= 'field51_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0052= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0052= F / INTERPOLATE config flag SUBF0052= F / SUBTRACT_BACK config flag BCKT0052= 'MANUAL ' / BACK_TYPE config parameter BCKD0052= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0052= 128 / BACK_SIZE config parameter BKFS0052= 3 / BACK_FILTERSIZE config parameter FILE0053= 'field52_Blue_bgsubt2.resamp.fits' / Input filename WGHT0053= 'field52_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0053= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0053= F / INTERPOLATE config flag SUBF0053= F / SUBTRACT_BACK config flag BCKT0053= 'MANUAL ' / BACK_TYPE config parameter BCKD0053= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0053= 128 / BACK_SIZE config parameter BKFS0053= 3 / BACK_FILTERSIZE config parameter FILE0054= 'field53_Blue_bgsubt2.resamp.fits' / Input filename WGHT0054= 'field53_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0054= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0054= F / INTERPOLATE config flag SUBF0054= F / SUBTRACT_BACK config flag BCKT0054= 'MANUAL ' / BACK_TYPE config parameter BCKD0054= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0054= 128 / BACK_SIZE config parameter BKFS0054= 3 / BACK_FILTERSIZE config parameter FILE0055= 'field54_Blue_bgsubt2.resamp.fits' / Input filename WGHT0055= 'field54_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0055= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0055= F / INTERPOLATE config flag SUBF0055= F / SUBTRACT_BACK config flag BCKT0055= 'MANUAL ' / BACK_TYPE config parameter BCKD0055= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0055= 128 / BACK_SIZE config parameter BKFS0055= 3 / BACK_FILTERSIZE config parameter FILE0056= 'field55_Blue_bgsubt2.resamp.fits' / Input filename WGHT0056= 'field55_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0056= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0056= F / INTERPOLATE config flag SUBF0056= F / SUBTRACT_BACK config flag BCKT0056= 'MANUAL ' / BACK_TYPE config parameter BCKD0056= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0056= 128 / BACK_SIZE config parameter BKFS0056= 3 / BACK_FILTERSIZE config parameter FILE0057= 'field56_Blue_bgsubt2.resamp.fits' / Input filename WGHT0057= 'field56_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0057= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0057= F / INTERPOLATE config flag SUBF0057= F / SUBTRACT_BACK config flag BCKT0057= 'MANUAL ' / BACK_TYPE config parameter BCKD0057= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0057= 128 / BACK_SIZE config parameter BKFS0057= 3 / BACK_FILTERSIZE config parameter FILE0058= 'field57_Blue_bgsubt2.resamp.fits' / Input filename WGHT0058= 'field57_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0058= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0058= F / INTERPOLATE config flag SUBF0058= F / SUBTRACT_BACK config flag BCKT0058= 'MANUAL ' / BACK_TYPE config parameter BCKD0058= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0058= 128 / BACK_SIZE config parameter BKFS0058= 3 / BACK_FILTERSIZE config parameter FILE0059= 'field58_Blue_bgsubt2.resamp.fits' / Input filename WGHT0059= 'field58_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0059= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0059= F / INTERPOLATE config flag SUBF0059= F / SUBTRACT_BACK config flag BCKT0059= 'MANUAL ' / BACK_TYPE config parameter BCKD0059= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0059= 128 / BACK_SIZE config parameter BKFS0059= 3 / BACK_FILTERSIZE config parameter FILE0060= 'field59_Blue_bgsubt2.resamp.fits' / Input filename WGHT0060= 'field59_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0060= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0060= F / INTERPOLATE config flag SUBF0060= F / SUBTRACT_BACK config flag BCKT0060= 'MANUAL ' / BACK_TYPE config parameter BCKD0060= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0060= 128 / BACK_SIZE config parameter BKFS0060= 3 / BACK_FILTERSIZE config parameter FILE0061= 'field60_Blue_bgsubt2.resamp.fits' / Input filename WGHT0061= 'field60_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0061= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0061= F / INTERPOLATE config flag SUBF0061= F / SUBTRACT_BACK config flag BCKT0061= 'MANUAL ' / BACK_TYPE config parameter BCKD0061= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0061= 128 / BACK_SIZE config parameter BKFS0061= 3 / BACK_FILTERSIZE config parameter FILE0062= 'field61_Blue_bgsubt2.resamp.fits' / Input filename WGHT0062= 'field61_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0062= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0062= F / INTERPOLATE config flag SUBF0062= F / SUBTRACT_BACK config flag BCKT0062= 'MANUAL ' / BACK_TYPE config parameter BCKD0062= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0062= 128 / BACK_SIZE config parameter BKFS0062= 3 / BACK_FILTERSIZE config parameter FILE0063= 'field62_Blue_bgsubt2.resamp.fits' / Input filename WGHT0063= 'field62_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0063= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0063= F / INTERPOLATE config flag SUBF0063= F / SUBTRACT_BACK config flag BCKT0063= 'MANUAL ' / BACK_TYPE config parameter BCKD0063= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0063= 128 / BACK_SIZE config parameter BKFS0063= 3 / BACK_FILTERSIZE config parameter FILE0064= 'field63_Blue_bgsubt2.resamp.fits' / Input filename WGHT0064= 'field63_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0064= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0064= F / INTERPOLATE config flag SUBF0064= F / SUBTRACT_BACK config flag BCKT0064= 'MANUAL ' / BACK_TYPE config parameter BCKD0064= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0064= 128 / BACK_SIZE config parameter BKFS0064= 3 / BACK_FILTERSIZE config parameter FILE0065= 'field64_Blue_bgsubt2.resamp.fits' / Input filename WGHT0065= 'field64_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0065= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0065= F / INTERPOLATE config flag SUBF0065= F / SUBTRACT_BACK config flag BCKT0065= 'MANUAL ' / BACK_TYPE config parameter BCKD0065= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0065= 128 / BACK_SIZE config parameter BKFS0065= 3 / BACK_FILTERSIZE config parameter FILE0066= 'field65_Blue_bgsubt2.resamp.fits' / Input filename WGHT0066= 'field65_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0066= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0066= F / INTERPOLATE config flag SUBF0066= F / SUBTRACT_BACK config flag BCKT0066= 'MANUAL ' / BACK_TYPE config parameter BCKD0066= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0066= 128 / BACK_SIZE config parameter BKFS0066= 3 / BACK_FILTERSIZE config parameter FILE0067= 'field66_Blue_bgsubt2.resamp.fits' / Input filename WGHT0067= 'field66_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0067= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0067= F / INTERPOLATE config flag SUBF0067= F / SUBTRACT_BACK config flag BCKT0067= 'MANUAL ' / BACK_TYPE config parameter BCKD0067= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0067= 128 / BACK_SIZE config parameter BKFS0067= 3 / BACK_FILTERSIZE config parameter FILE0068= 'field67_Blue_bgsubt2.resamp.fits' / Input filename WGHT0068= 'field67_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0068= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0068= F / INTERPOLATE config flag SUBF0068= F / SUBTRACT_BACK config flag BCKT0068= 'MANUAL ' / BACK_TYPE config parameter BCKD0068= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0068= 128 / BACK_SIZE config parameter BKFS0068= 3 / BACK_FILTERSIZE config parameter FILE0069= 'field68_Blue_bgsubt2.resamp.fits' / Input filename WGHT0069= 'field68_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0069= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0069= F / INTERPOLATE config flag SUBF0069= F / SUBTRACT_BACK config flag BCKT0069= 'MANUAL ' / BACK_TYPE config parameter BCKD0069= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0069= 128 / BACK_SIZE config parameter BKFS0069= 3 / BACK_FILTERSIZE config parameter FILE0070= 'field69_Blue_bgsubt2.resamp.fits' / Input filename WGHT0070= 'field69_Blue_bgsubt2.resamp.weight.fits' / Input weight-map WGTT0070= 'MAP_WEIGHT' / WEIGHT_TYPE config parameter INTF0070= F / INTERPOLATE config flag SUBF0070= F / SUBTRACT_BACK config flag BCKT0070= 'MANUAL ' / BACK_TYPE config parameter BCKD0070= 0.000000000E+00 / BACK_DEFAULT config parameter BCKS0070= 128 / BACK_SIZE config parameter BKFS0070= 3 / BACK_FILTERSIZE config parameter WCSDIM = 3 LTV1 = 0.899999976158142 LTV2 = 0.899999976158142 LTM1_1 = 0.100000001490116 LTM2_2 = 0.100000001490116 WAT0_001= 'system=image' WAT1_001= 'wtype=car axtype=glon' WAT2_001= 'wtype=car axtype=glat' CTYPE3 = 'LINEAR ' CD3_3 = 1. LTM3_3 = 1. WAT3_001= 'wtype=linear' reproject-0.3.2/reproject/tests/test_high_level.py0000644000077000000240000001071013173065713022312 0ustar tomstaff00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst from __future__ import (absolute_import, division, print_function, unicode_literals) import itertools import numpy as np from astropy.io import fits from astropy.wcs import WCS from astropy.utils.data import get_pkg_data_filename from astropy.tests.helper import pytest from .. import reproject_interp, reproject_exact # TODO: add reference comparisons ALL_MODES = ('nearest-neighbor', 'bilinear', 'biquadratic', 'bicubic', 'flux-conserving') ALL_DTYPES = [] for endian in ('<', '>'): for kind in ('u', 'i', 'f'): for size in ('1', '2', '4', '8'): if kind == 'f' and size == '1': continue ALL_DTYPES.append(np.dtype(endian + kind + size)) class TestReproject(object): def setup_method(self, method): self.header_in = fits.Header.fromtextfile(get_pkg_data_filename('data/gc_ga.hdr')) self.header_out = fits.Header.fromtextfile(get_pkg_data_filename('data/gc_eq.hdr')) self.header_out_size = self.header_out.copy() self.header_out_size['NAXIS'] = 2 self.header_out_size['NAXIS1'] = 600 self.header_out_size['NAXIS2'] = 550 self.array_in = np.ones((700, 690)) self.hdu_in = fits.ImageHDU(self.array_in, self.header_in) self.wcs_in = WCS(self.header_in) self.wcs_out = WCS(self.header_out) self.shape_out = (600, 550) def test_hdu_header(self): with pytest.raises(ValueError) as exc: reproject_interp(self.hdu_in, self.header_out) assert exc.value.args[0] == "Need to specify shape since output header does not contain complete shape information" reproject_interp(self.hdu_in, self.header_out_size) def test_hdu_wcs(self): reproject_interp(self.hdu_in, self.wcs_out, shape_out=self.shape_out) def test_array_wcs_header(self): with pytest.raises(ValueError) as exc: reproject_interp((self.array_in, self.wcs_in), self.header_out) assert exc.value.args[0] == "Need to specify shape since output header does not contain complete shape information" reproject_interp((self.array_in, self.wcs_in), self.header_out_size) def test_array_wcs_wcs(self): reproject_interp((self.array_in, self.wcs_in), self.wcs_out, shape_out=self.shape_out) def test_array_header_header(self): reproject_interp((self.array_in, self.header_in), self.header_out_size) INPUT_HDR = """ WCSAXES = 2 / Number of coordinate axes CRPIX1 = 0.5 / Pixel coordinate of reference point CRPIX2 = 0.5 / Pixel coordinate of reference point CDELT1 = -0.001666666 / [deg] Coordinate increment at reference point CDELT2 = 0.001666666 / [deg] Coordinate increment at reference point CUNIT1 = 'deg' / Units of coordinate increment and value CUNIT2 = 'deg' / Units of coordinate increment and value CTYPE1 = 'GLON-CAR' / galactic longitude, plate caree projection CTYPE2 = 'GLAT-CAR' / galactic latitude, plate caree projection CRVAL1 = 0.0 / [deg] Coordinate value at reference point CRVAL2 = 0.0 / [deg] Coordinate value at reference point LONPOLE = 0.0 / [deg] Native longitude of celestial pole LATPOLE = 90.0 / [deg] Native latitude of celestial pole """ @pytest.mark.parametrize('projection_type, dtype', itertools.product(ALL_MODES, ALL_DTYPES)) def test_surface_brightness(projection_type, dtype): header_in = fits.Header.fromstring(INPUT_HDR, sep='\n') header_in['NAXIS'] = 2 header_in['NAXIS1'] = 10 header_in['NAXIS2'] = 10 header_out = header_in.copy() header_out['CDELT1'] /= 2 header_out['CDELT2'] /= 2 header_out['NAXIS1'] *= 2 header_out['NAXIS2'] *= 2 data_in = np.ones((10, 10), dtype=dtype) if projection_type == 'flux-conserving': data_out, footprint = reproject_exact((data_in, header_in), header_out) else: data_out, footprint = reproject_interp((data_in, header_in), header_out, order=projection_type) assert data_out.shape == (20, 20) # Here we check that the values are still 1 despite the change in # resolution, which demonstrates that we are preserving surface # brightness. np.testing.assert_allclose(data_out, 1) reproject-0.3.2/reproject/tests/test_utils.py0000644000077000000240000000440113173065713021344 0ustar tomstaff00000000000000import numpy as np from astropy.tests.helper import pytest from astropy.coordinates import FK5, Galactic, ICRS from astropy.io import fits from astropy.wcs import WCS from astropy.utils.data import get_pkg_data_filename from ..utils import parse_input_data, parse_output_projection def test_parse_input_data(tmpdir): header = fits.Header.fromtextfile(get_pkg_data_filename('data/gc_ga.hdr')) data = np.arange(200).reshape((10,20)) hdu = fits.ImageHDU(data) # As HDU array, coordinate_system = parse_input_data(hdu) np.testing.assert_allclose(array, data) # As filename filename = tmpdir.join('test.fits').strpath hdu.writeto(filename) with pytest.raises(ValueError) as exc: array, coordinate_system = parse_input_data(filename) assert exc.value.args[0] == "More than one HDU is present, please specify HDU to use with ``hdu_in=`` option" array, coordinate_system = parse_input_data(filename, hdu_in=1) np.testing.assert_allclose(array, data) # As array, header array, coordinate_system = parse_input_data((data, header)) np.testing.assert_allclose(array, data) # As array, WCS wcs = WCS(hdu.header) array, coordinate_system = parse_input_data((data, wcs)) np.testing.assert_allclose(array, data) # Invalid with pytest.raises(TypeError) as exc: parse_input_data(data) assert exc.value.args[0] == "input_data should either be an HDU object or a tuple of (array, WCS) or (array, Header)" def test_parse_output_projection(tmpdir): header = fits.Header.fromtextfile(get_pkg_data_filename('data/gc_ga.hdr')) wcs = WCS(header) # As header with pytest.raises(ValueError) as exc: parse_output_projection(header) assert exc.value.args[0] == "Need to specify shape since output header does not contain complete shape information" parse_output_projection(header, shape_out=(200, 200)) header['NAXIS'] = 2 header['NAXIS1'] = 200 header['NAXIS2'] = 300 parse_output_projection(header) # As WCS with pytest.raises(ValueError) as exc: parse_output_projection(wcs) assert exc.value.args[0] == "Need to specify shape when specifying output_projection as WCS object" parse_output_projection(wcs, shape_out=(200, 200)) reproject-0.3.2/reproject/utils.py0000644000077000000240000000352513173065713017151 0ustar tomstaff00000000000000import numpy as np from astropy.io import fits from astropy.io.fits import PrimaryHDU, ImageHDU, CompImageHDU, Header, HDUList from astropy.wcs import WCS from astropy.extern import six def parse_input_data(input_data, hdu_in=None): """ Parse input data to return a Numpy array and WCS object. """ if isinstance(input_data, six.string_types): return parse_input_data(fits.open(input_data), hdu_in=hdu_in) elif isinstance(input_data, HDUList): if len(input_data) > 1 and hdu_in is None: raise ValueError("More than one HDU is present, please specify HDU to use with ``hdu_in=`` option") return parse_input_data(input_data[hdu_in]) elif isinstance(input_data, (PrimaryHDU, ImageHDU, CompImageHDU)): return input_data.data, WCS(input_data.header) elif isinstance(input_data, tuple) and isinstance(input_data[0], np.ndarray): if isinstance(input_data[1], Header): return input_data[0], WCS(input_data[1]) else: return input_data else: raise TypeError("input_data should either be an HDU object or a tuple of (array, WCS) or (array, Header)") def parse_output_projection(output_projection, shape_out=None): if isinstance(output_projection, Header): wcs_out = WCS(output_projection) try: shape_out = [output_projection['NAXIS{0}'.format(i + 1)] for i in range(output_projection['NAXIS'])][::-1] except KeyError: if shape_out is None: raise ValueError("Need to specify shape since output header does not contain complete shape information") elif isinstance(output_projection, WCS): wcs_out = output_projection if shape_out is None: raise ValueError("Need to specify shape when specifying output_projection as WCS object") return wcs_out, shape_out reproject-0.3.2/reproject/version.py0000644000077000000240000001546213173066276017506 0ustar tomstaff00000000000000# Autogenerated by Astropy-affiliated package reproject's setup.py on 2017-10-22 11:02:38.199290 from __future__ import unicode_literals import datetime import locale import os import subprocess import warnings def _decode_stdio(stream): try: stdio_encoding = locale.getdefaultlocale()[1] or 'utf-8' except ValueError: stdio_encoding = 'utf-8' try: text = stream.decode(stdio_encoding) except UnicodeDecodeError: # Final fallback text = stream.decode('latin1') return text def update_git_devstr(version, path=None): """ Updates the git revision string if and only if the path is being imported directly from a git working copy. This ensures that the revision number in the version string is accurate. """ try: # Quick way to determine if we're in git or not - returns '' if not devstr = get_git_devstr(sha=True, show_warning=False, path=path) except OSError: return version if not devstr: # Probably not in git so just pass silently return version if 'dev' in version: # update to the current git revision version_base = version.split('.dev', 1)[0] devstr = get_git_devstr(sha=False, show_warning=False, path=path) return version_base + '.dev' + devstr else: # otherwise it's already the true/release version return version def get_git_devstr(sha=False, show_warning=True, path=None): """ Determines the number of revisions in this repository. Parameters ---------- sha : bool If True, the full SHA1 hash will be returned. Otherwise, the total count of commits in the repository will be used as a "revision number". show_warning : bool If True, issue a warning if git returns an error code, otherwise errors pass silently. path : str or None If a string, specifies the directory to look in to find the git repository. If `None`, the current working directory is used, and must be the root of the git repository. If given a filename it uses the directory containing that file. Returns ------- devversion : str Either a string with the revision number (if `sha` is False), the SHA1 hash of the current commit (if `sha` is True), or an empty string if git version info could not be identified. """ if path is None: path = os.getcwd() if not _get_repo_path(path, levels=0): return '' if not os.path.isdir(path): path = os.path.abspath(os.path.dirname(path)) if sha: # Faster for getting just the hash of HEAD cmd = ['rev-parse', 'HEAD'] else: cmd = ['rev-list', '--count', 'HEAD'] def run_git(cmd): try: p = subprocess.Popen(['git'] + cmd, cwd=path, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) stdout, stderr = p.communicate() except OSError as e: if show_warning: warnings.warn('Error running git: ' + str(e)) return (None, b'', b'') if p.returncode == 128: if show_warning: warnings.warn('No git repository present at {0!r}! Using ' 'default dev version.'.format(path)) return (p.returncode, b'', b'') if p.returncode == 129: if show_warning: warnings.warn('Your git looks old (does it support {0}?); ' 'consider upgrading to v1.7.2 or ' 'later.'.format(cmd[0])) return (p.returncode, stdout, stderr) elif p.returncode != 0: if show_warning: warnings.warn('Git failed while determining revision ' 'count: {0}'.format(_decode_stdio(stderr))) return (p.returncode, stdout, stderr) return p.returncode, stdout, stderr returncode, stdout, stderr = run_git(cmd) if not sha and returncode == 129: # git returns 129 if a command option failed to parse; in # particular this could happen in git versions older than 1.7.2 # where the --count option is not supported # Also use --abbrev-commit and --abbrev=0 to display the minimum # number of characters needed per-commit (rather than the full hash) cmd = ['rev-list', '--abbrev-commit', '--abbrev=0', 'HEAD'] returncode, stdout, stderr = run_git(cmd) # Fall back on the old method of getting all revisions and counting # the lines if returncode == 0: return str(stdout.count(b'\n')) else: return '' elif sha: return _decode_stdio(stdout)[:40] else: return _decode_stdio(stdout).strip() def _get_repo_path(pathname, levels=None): """ Given a file or directory name, determine the root of the git repository this path is under. If given, this won't look any higher than ``levels`` (that is, if ``levels=0`` then the given path must be the root of the git repository and is returned if so. Returns `None` if the given path could not be determined to belong to a git repo. """ if os.path.isfile(pathname): current_dir = os.path.abspath(os.path.dirname(pathname)) elif os.path.isdir(pathname): current_dir = os.path.abspath(pathname) else: return None current_level = 0 while levels is None or current_level <= levels: if os.path.exists(os.path.join(current_dir, '.git')): return current_dir current_level += 1 if current_dir == os.path.dirname(current_dir): break current_dir = os.path.dirname(current_dir) return None _packagename = "reproject" _last_generated_version = "0.3.2" _last_githash = "691a9694cc06dd38a19f3b0facd0b1dcf2687f8e" # Determine where the source code for this module # lives. If __file__ is not a filesystem path then # it is assumed not to live in a git repo at all. if _get_repo_path(__file__, levels=len(_packagename.split('.'))): version = update_git_devstr(_last_generated_version, path=__file__) githash = get_git_devstr(sha=True, show_warning=False, path=__file__) or _last_githash else: # The file does not appear to live in a git repo so don't bother # invoking git version = _last_generated_version githash = _last_githash major = 0 minor = 3 bugfix = 2 release = True timestamp = datetime.datetime(2017, 10, 22, 11, 2, 38, 199290) debug = False try: from ._compiler import compiler except ImportError: compiler = "unknown" try: from .cython_version import cython_version except ImportError: cython_version = "unknown" reproject-0.3.2/reproject/wcs_utils.py0000644000077000000240000000414213173065713020021 0ustar tomstaff00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ WCS-related utilities """ from __future__ import (absolute_import, division, print_function, unicode_literals) from astropy import units as u from astropy.coordinates import UnitSphericalRepresentation from astropy.wcs.utils import wcs_to_celestial_frame from astropy.wcs import WCS __all__ = ['convert_world_coordinates'] def convert_world_coordinates(lon_in, lat_in, wcs_in, wcs_out): """ Convert longitude/latitude coordinates from an input frame to an output frame. Parameters ---------- lon_in, lat_in : `~numpy.ndarray` The longitude and latitude to convert wcs_in, wcs_out : tuple or `~astropy.wcs.WCS` The input and output frames, which can be passed either as a tuple of ``(frame, lon_unit, lat_unit)`` or as a `~astropy.wcs.WCS` instance. Returns ------- lon_out, lat_out : `~numpy.ndarray` The output longitude and latitude """ if isinstance(wcs_in, WCS): # Extract the celestial component of the WCS in (lon, lat) order wcs_in = wcs_in.celestial frame_in = wcs_to_celestial_frame(wcs_in) lon_in_unit = u.Unit(wcs_in.wcs.cunit[0]) lat_in_unit = u.Unit(wcs_in.wcs.cunit[1]) else: frame_in, lon_in_unit, lat_in_unit = wcs_in if isinstance(wcs_out, WCS): # Extract the celestial component of the WCS in (lon, lat) order wcs_out = wcs_out.celestial frame_out = wcs_to_celestial_frame(wcs_out) lon_out_unit = u.Unit(wcs_out.wcs.cunit[0]) lat_out_unit = u.Unit(wcs_out.wcs.cunit[1]) else: frame_out, lon_out_unit, lat_out_unit = wcs_out data = UnitSphericalRepresentation(lon_in * lon_in_unit, lat_in * lat_in_unit) coords_in = frame_in.realize_frame(data) coords_out = coords_in.transform_to(frame_out) lon_out = coords_out.represent_as('unitspherical').lon.to(lon_out_unit).value lat_out = coords_out.represent_as('unitspherical').lat.to(lat_out_unit).value return lon_out, lat_out reproject-0.3.2/setup.cfg0000644000077000000240000000112413173065713015254 0ustar tomstaff00000000000000[build_sphinx] source-dir = docs build-dir = docs/_build all_files = 1 [upload_docs] upload-dir = docs/_build/html show-response = 1 [pytest] minversion = 2.2 norecursedirs = build docs/_build doctest_plus = enabled addopts = --fits [ah_bootstrap] auto_use = True [metadata] package_name = reproject description = Reproject astronomical images long_description = author = Thomas Robitaille, Christoph Deil, Adam Ginsburg author_email = thomas.robitaille@gmail.com license = BSD url = http://reproject.readthedocs.io edit_on_github = False github_project = astrofrog/reproject [entry_points] reproject-0.3.2/setup.py0000755000077000000240000000770313173066051015155 0ustar tomstaff00000000000000#!/usr/bin/env python # Licensed under a 3-clause BSD style license - see LICENSE.rst import glob import os import sys import ah_bootstrap from setuptools import setup #A dirty hack to get around some early import/configurations ambiguities if sys.version_info[0] >= 3: import builtins else: import __builtin__ as builtins builtins._ASTROPY_SETUP_ = True from astropy_helpers.setup_helpers import (register_commands, get_debug_option, get_package_info) from astropy_helpers.git_helpers import get_git_devstr from astropy_helpers.version_helpers import generate_version_py # Get some values from the setup.cfg try: from ConfigParser import ConfigParser except ImportError: from configparser import ConfigParser conf = ConfigParser() conf.read(['setup.cfg']) metadata = dict(conf.items('metadata')) PACKAGENAME = metadata.get('package_name', 'packagename') DESCRIPTION = metadata.get('description', 'Astropy affiliated package') AUTHOR = metadata.get('author', '') AUTHOR_EMAIL = metadata.get('author_email', '') LICENSE = metadata.get('license', 'unknown') URL = metadata.get('url', 'http://astropy.org') # Get the long description from the package's docstring __import__(PACKAGENAME) package = sys.modules[PACKAGENAME] LONG_DESCRIPTION = package.__doc__ # Store the package name in a built-in variable so it's easy # to get from other parts of the setup infrastructure builtins._ASTROPY_PACKAGE_NAME_ = PACKAGENAME # VERSION should be PEP386 compatible (http://www.python.org/dev/peps/pep-0386) VERSION = '0.3.2' # Indicates if this version is a release version RELEASE = 'dev' not in VERSION if not RELEASE: VERSION += get_git_devstr(False) # Populate the dict of setup command overrides; this should be done before # invoking any other functionality from distutils since it can potentially # modify distutils' behavior. cmdclassd = register_commands(PACKAGENAME, VERSION, RELEASE) # Freeze build information in version.py generate_version_py(PACKAGENAME, VERSION, RELEASE, get_debug_option(PACKAGENAME)) # Treat everything in scripts except README.rst as a script to be installed scripts = [fname for fname in glob.glob(os.path.join('scripts', '*')) if os.path.basename(fname) != 'README.rst'] # Get configuration information from all of the various subpackages. # See the docstring for setup_helpers.update_package_files for more # details. package_info = get_package_info() # Add the project-global data package_info['package_data'].setdefault(PACKAGENAME, []) package_info['package_data'][PACKAGENAME].append('data/*') # Define entry points for command-line scripts entry_points = {'console_scripts': []} entry_point_list = conf.items('entry_points') for entry_point in entry_point_list: entry_points['console_scripts'].append('{0} = {1}'.format(entry_point[0], entry_point[1])) # Include all .c files, recursively, including those generated by # Cython, since we can not do this in MANIFEST.in with a "dynamic" # directory name. c_files = [] for root, dirs, files in os.walk(PACKAGENAME): for filename in files: if filename.endswith('.c'): c_files.append( os.path.join( os.path.relpath(root, PACKAGENAME), filename)) package_info['package_data'][PACKAGENAME].extend(c_files) # Note that requires and provides should not be included in the call to # ``setup``, since these are now deprecated. See this link for more details: # https://groups.google.com/forum/#!topic/astropy-dev/urYO8ckB2uM setup(name=PACKAGENAME, version=VERSION, description=DESCRIPTION, scripts=scripts, install_requires=['astropy'], author=AUTHOR, author_email=AUTHOR_EMAIL, license=LICENSE, url=URL, long_description=LONG_DESCRIPTION, cmdclass=cmdclassd, zip_safe=False, use_2to3=False, entry_points=entry_points, **package_info )