From 377f916fd8a2ef25748fc670e22bc22749e06cf9 Mon Sep 17 00:00:00 2001 From: Ashish Mahabal Date: Thu, 9 Apr 2026 14:04:39 -0700 Subject: [PATCH] Add alert generation code (v01.00 schema) --- alerts/roman_rapid_alerts/.gitignore | 14 + alerts/roman_rapid_alerts/README.md | 215 + alerts/roman_rapid_alerts/download_data.sh | 117 + alerts/roman_rapid_alerts/generate_alerts.py | 853 ++++ .../generate_inject_sidecar.py | 207 + .../notebooks/background.ipynb | 559 +++ alerts/roman_rapid_alerts/read_sample.py | 171 + alerts/roman_rapid_alerts/requirements.txt | 8 + .../sample/sample_alerts.avro | 3942 +++++++++++++++++ .../schema/01/00/rapid.v01_00.alert.avsc | 21 + .../01/00/rapid.v01_00.diaForcedSource.avsc | 23 + .../schema/01/00/rapid.v01_00.diaObject.avsc | 66 + .../schema/01/00/rapid.v01_00.diaSource.avsc | 77 + .../schema/01/00/rapid.v01_00.mpc_orbits.avsc | 19 + .../schema/01/00/rapid.v01_00.ssSource.avsc | 18 + 15 files changed, 6310 insertions(+) create mode 100644 alerts/roman_rapid_alerts/.gitignore create mode 100644 alerts/roman_rapid_alerts/README.md create mode 100755 alerts/roman_rapid_alerts/download_data.sh create mode 100644 alerts/roman_rapid_alerts/generate_alerts.py create mode 100644 alerts/roman_rapid_alerts/generate_inject_sidecar.py create mode 100644 alerts/roman_rapid_alerts/notebooks/background.ipynb create mode 100644 alerts/roman_rapid_alerts/read_sample.py create mode 100644 alerts/roman_rapid_alerts/requirements.txt create mode 100644 alerts/roman_rapid_alerts/sample/sample_alerts.avro create mode 100644 alerts/roman_rapid_alerts/schema/01/00/rapid.v01_00.alert.avsc create mode 100644 alerts/roman_rapid_alerts/schema/01/00/rapid.v01_00.diaForcedSource.avsc create mode 100644 alerts/roman_rapid_alerts/schema/01/00/rapid.v01_00.diaObject.avsc create mode 100644 alerts/roman_rapid_alerts/schema/01/00/rapid.v01_00.diaSource.avsc create mode 100644 alerts/roman_rapid_alerts/schema/01/00/rapid.v01_00.mpc_orbits.avsc create mode 100644 alerts/roman_rapid_alerts/schema/01/00/rapid.v01_00.ssSource.avsc diff --git a/alerts/roman_rapid_alerts/.gitignore b/alerts/roman_rapid_alerts/.gitignore new file mode 100644 index 00000000..c593b0e1 --- /dev/null +++ b/alerts/roman_rapid_alerts/.gitignore @@ -0,0 +1,14 @@ +# Downloaded pipeline data (large; fetched via download_data.sh) +data/ + +# Generated output +output/ +truth_sidecar/ + +# Provenance (generated or downloaded) +provenance/ + +# Python +__pycache__/ +*.pyc +.ipynb_checkpoints/ diff --git a/alerts/roman_rapid_alerts/README.md b/alerts/roman_rapid_alerts/README.md new file mode 100644 index 00000000..be73eaf0 --- /dev/null +++ b/alerts/roman_rapid_alerts/README.md @@ -0,0 +1,215 @@ +# RAPID Alert Generation for Roman Space Telescope + +Generate simulated transient alert packets for the Nancy Grace Roman Space +Telescope using the **RAPID** (Roman Alerts Promptly from Image Differencing) +pipeline. + +Alerts are serialized in [Apache Avro](https://avro.apache.org/) format using +the `rapid.v01_00` schema, which follows +[Rubin/LSST](https://dmtn-093.lsst.io/) naming conventions (`diaSource`, +`diaObject`, `prvDiaSources`). + +The input data comes from the **Open Universe 2024** (OU2024) Roman Time Domain +Survey simulation, processed through a ZOGY difference-imaging pipeline. + +## Repository Contents + +``` +roman_rapid_alerts/ +├── generate_alerts.py # Core alert generation script +├── generate_inject_sidecar.py # Injection catalog cross-match → sidecar +├── read_sample.py # Read and display alert packets +├── download_data.sh # Download pipeline products from S3 +├── requirements.txt # Python dependencies +├── schema/01/00/ # Avro schema files (rapid.v01_00) +│ ├── rapid.v01_00.alert.avsc +│ ├── rapid.v01_00.diaSource.avsc +│ ├── rapid.v01_00.diaObject.avsc +│ ├── rapid.v01_00.diaForcedSource.avsc +│ ├── rapid.v01_00.ssSource.avsc +│ └── rapid.v01_00.mpc_orbits.avsc +├── notebooks/ +│ └── background.ipynb # Pipeline architecture & calibration docs +└── sample/ + └── sample_alerts.avro # 10 example alerts for quick inspection +``` + +## Quick Start + +```bash +# 1. Clone the repository +git clone +cd roman_rapid_alerts + +# 2. Install dependencies +pip install -r requirements.txt + +# 3. Inspect the sample alerts +python read_sample.py +python read_sample.py --stamps # also display cutout images + +# 4. Download pipeline data from S3 (~3 GB with FITS, ~200 MB without) +bash download_data.sh # full download (FITS images for stamps) +bash download_data.sh --no-fits # catalogs only (no cutout stamps) + +# 5. Generate alerts +python generate_alerts.py +``` + +## Prerequisites + +- Python 3.10+ +- AWS CLI (`pip install awscli`) for downloading data from S3 (public bucket, + no credentials needed) + +## Data Retrieval + +All pipeline products are stored in the public S3 bucket +`s3://rapid-product-files` (us-west-2, no authentication required). + +Run `download_data.sh` to fetch the 15 jobs from the 20260227 pipeline run. +Each job directory contains: + +| File | Description | Needed for | +|------|-------------|------------| +| `diffimage_masked.txt` | SExtractor detection catalog | Alert generation | +| `diffimage_masked_psfcat.parquet` | PSF-fit quality metrics | Alert generation | +| `diffimage_masked.fits` | ZOGY difference image | Alert generation (cutouts + header) | +| `bkg_subbed_science_image.fits` | Science image | Alert generation (cutouts) | +| `awaicgen_output_mosaic_image_resampled_gainmatched.fits` | Gain-matched template | Alert generation (cutouts) | +| `Roman_TDS_index_*.txt` | OU2024 truth catalog | Only with `--include-truth` | + +Light curve HEALPix tiles (HATS format) are downloaded on-the-fly during +alert generation and cached in `data/lc_tiles/`. + +HTTPS fallback (no AWS CLI): +``` +https://rapid-product-files.s3.us-west-2.amazonaws.com/20260227/jid1061/diffimage_masked.txt +``` + +## Running the Generator + +```bash +# Generate all 15 jobs (default paths) +python generate_alerts.py + +# Custom paths +python generate_alerts.py \ + --data-dir /path/to/data/20260227 \ + --output-dir ./my_output \ + --schema-dir ./schema/01/00 + +# Process specific jobs only +python generate_alerts.py --jobs jid1061 jid1231 + +# Also generate truth sidecar (requires Roman_TDS_index_*.txt in job dirs) +python generate_alerts.py --include-truth + +# Generate inject sidecar (after alerts are generated) +python generate_inject_sidecar.py +``` + +### CLI Options (generate_alerts.py) + +| Option | Default | Description | +|--------|---------|-------------| +| `--data-dir` | `./data/20260227` | Directory with `jid*/` job folders | +| `--schema-dir` | `./schema/01/00` | Directory with `.avsc` schema files | +| `--output-dir` | `./output` | Output for `.avro` alert files | +| `--sidecar-dir` | `./truth_sidecar` | Output for `truth_labels.parquet` | +| `--lc-tile-dir` | `./data/lc_tiles` | Cache for light curve tiles | +| `--provenance-dir` | `./provenance` | Saved FITS headers (JSON) | +| `--jobs` | all `jid*` dirs | Specific job IDs to process | +| `--include-truth` | off | Enable truth catalog matching and sidecar generation | + +## Schema Overview (rapid.v01_00) + +Each alert packet contains: + +| Record | Fields | Description | +|--------|--------|-------------| +| `diaSource` | 63 | Detection: position, PSF flux (nJy), shape, flags, HEALPix | +| `diaObject` | 49 | Persistent object: per-filter flux statistics | +| `prvDiaSources` | list | Prior detections (full diaSource records, MJD < current) | +| Cutouts | 3 | 129x129 px stamps: difference, science, template (raw FITS bytes) | + +## Photometric Calibration + +Images are in **DN/s** (counts per second). Three components define the +calibration: + +| Component | Description | Range | +|-----------|-------------|-------| +| BANDZPT | Filter bandpass sensitivity | 14.6 -- 15.3 | +| ZPTMAG | Collecting area + exposure (from OU headers) | 16.5 -- 18.8 | +| EXPTIME | Exposure duration (seconds) | 102 -- 901 | + +### Conversion Formulas + +```python +# Effective zero-point for DN/s images +ZP_eff = BANDZPT + ZPTMAG - 2.5 * log10(EXPTIME) + +# Raw image flux (DN/s) → AB magnitude +mag_AB = -2.5 * log10(flux_dns) + ZP_eff + +# Alert psfFlux (already in nJy) → AB magnitude +mag_AB = -2.5 * log10(psfFlux_nJy) + 31.4 + +# Truth catalog 'mag' column → AB magnitude (BANDZPT already applied) +mag_AB = truth_mag + ZPTMAG + +# Inject catalog flux (DN) → AB magnitude +mag_AB = -2.5 * log10(flux_DN) + BANDZPT + ZPTMAG +``` + +### Per-Filter Constants + +| Band | BANDZPT | ZPTMAG | EXPTIME (s) | ZP_eff | +|------|---------|--------|-------------|--------| +| F062 | 15.297 | 16.954 | 161.0 | 26.733 | +| F087 | 14.964 | 16.455 | 101.7 | 26.400 | +| F106 | 15.024 | 17.638 | 302.275 | 26.461 | +| F129 | 15.040 | 17.638 | 302.275 | 26.477 | +| F158 | 15.074 | 17.638 | 302.275 | 26.511 | +| F184 | 14.622 | 18.824 | 901.175 | 26.057 | +| F213 | 14.579 | 18.824 | 901.175 | 26.014 | + +## Output + +After running `generate_alerts.py`: + +``` +output/ +├── jid1061_alerts.avro # ~2,500 alerts per job +├── jid1231_alerts.avro +├── ... # 15 files total +truth_sidecar/ +└── truth_labels.parquet # 38,241 rows: diaSourceId → obj_type, truth_mag +``` + +### Dataset Statistics (20260227 run) + +| Property | Value | +|----------|-------| +| Jobs | 15 (5 F184 + 10 F158) | +| Total alerts | 38,241 | +| Real (truth-matched) | 13,884 (36.3%) | +| Bogus (artifacts) | 24,357 (63.7%) | +| With light curves | ~57% | +| With cutout stamps | ~93.4% | +| Stamp size | 129 x 129 px (0.11"/px) | +| MJD range | 62022 -- 62726 (~2 yr) | +| Magnitude range | ~17 -- 31 AB | + +## Background Notebook + +See `notebooks/background.ipynb` for a detailed walkthrough of: +- Pipeline architecture (ZOGY differencing) +- FITS header metadata +- SExtractor catalog format +- PSF-fit quality metrics +- Truth catalog cross-matching +- Cutout stamp extraction +- Light curve tile structure (HATS/HEALPix) +- Avro serialization diff --git a/alerts/roman_rapid_alerts/download_data.sh b/alerts/roman_rapid_alerts/download_data.sh new file mode 100755 index 00000000..75e76dc3 --- /dev/null +++ b/alerts/roman_rapid_alerts/download_data.sh @@ -0,0 +1,117 @@ +#!/usr/bin/env bash +# +# Download RAPID pipeline products from S3 for alert generation. +# +# Prerequisites: AWS CLI (pip install awscli). No credentials needed +# (public bucket, --no-sign-request). +# +# Usage: +# bash download_data.sh # download everything +# bash download_data.sh --no-fits # skip large FITS images (catalogs only) +# +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +DATA_DIR="${SCRIPT_DIR}/data/20260227" +LC_DIR="${SCRIPT_DIR}/data/lc_tiles" +PROV_DIR="${SCRIPT_DIR}/provenance" + +S3_BUCKET="s3://rapid-product-files" +S3_OPTS="--no-sign-request --quiet" + +JOBS=( + jid1061 jid1231 jid1319 jid1456 jid14608 + jid1461 jid14613 jid14746 jid14828 jid14831 + jid86420 jid86935 jid87100 jid87210 jid87215 +) + +SKIP_FITS=false +if [[ "${1:-}" == "--no-fits" ]]; then + SKIP_FITS=true + echo "Skipping FITS image downloads (catalogs only)." +fi + +# ------------------------------------------------------------------------- +# 1. Pipeline products per job +# ------------------------------------------------------------------------- +echo "Downloading pipeline products for ${#JOBS[@]} jobs..." + +for jid in "${JOBS[@]}"; do + mkdir -p "${DATA_DIR}/${jid}" + + # Always download: SExtractor catalog, PSF-fit catalog, truth catalog, config + for f in diffimage_masked.txt diffimage_masked_psfcat.parquet; do + if [[ ! -f "${DATA_DIR}/${jid}/${f}" ]]; then + echo " ${jid}/${f}" + aws s3 cp "${S3_BUCKET}/20260227/${jid}/${f}" \ + "${DATA_DIR}/${jid}/${f}" ${S3_OPTS} || echo " WARN: ${jid}/${f} not found" + fi + done + + # Truth catalog (wildcard -- filename includes filter/pointing/SCA) + if ! ls "${DATA_DIR}/${jid}"/Roman_TDS_index_*.txt &>/dev/null; then + echo " ${jid}/Roman_TDS_index_*.txt" + aws s3 cp "${S3_BUCKET}/20260227/${jid}/" "${DATA_DIR}/${jid}/" \ + --exclude '*' --include 'Roman_TDS_index_*.txt' \ + --recursive ${S3_OPTS} || echo " WARN: truth catalog not found for ${jid}" + fi + + # Config file + if ! ls "${DATA_DIR}/${jid}"/product_config_*.ini &>/dev/null; then + echo " ${jid}/product_config_*.ini" + aws s3 cp "${S3_BUCKET}/20260227/${jid}/" "${DATA_DIR}/${jid}/" \ + --exclude '*' --include 'product_config_*.ini' \ + --recursive ${S3_OPTS} || echo " WARN: config not found for ${jid}" + fi + + # FITS images (large, ~200 MB each; needed for cutout stamps) + if [[ "${SKIP_FITS}" == false ]]; then + for f in diffimage_masked.fits bkg_subbed_science_image.fits \ + awaicgen_output_mosaic_image_resampled_gainmatched.fits; do + if [[ ! -f "${DATA_DIR}/${jid}/${f}" ]]; then + echo " ${jid}/${f}" + aws s3 cp "${S3_BUCKET}/20260227/${jid}/${f}" \ + "${DATA_DIR}/${jid}/${f}" ${S3_OPTS} & + fi + done + fi +done +wait +echo "Pipeline products done." + +# ------------------------------------------------------------------------- +# 2. Provenance: FITS headers (JSON), inject catalogs +# ------------------------------------------------------------------------- +echo "" +echo "Downloading provenance data..." + +mkdir -p "${PROV_DIR}/headers" "${PROV_DIR}/inject_catalogs" "${PROV_DIR}/truth_catalogs" + +# If provenance files are pre-packaged on S3: +aws s3 cp "${S3_BUCKET}/alerts_v100/provenance/" "${PROV_DIR}/" \ + --recursive ${S3_OPTS} 2>/dev/null || echo " Provenance not pre-packaged on S3; headers will be extracted from FITS at generation time." + +echo "Provenance done." + +# ------------------------------------------------------------------------- +# 3. Light curve HATS tiles (downloaded on-the-fly by generate_alerts.py, +# but can be pre-fetched here) +# ------------------------------------------------------------------------- +echo "" +echo "Light curve tiles will be downloaded on-the-fly by generate_alerts.py" +echo "into ${LC_DIR}/ as needed (HEALPix Norder 4/5/6 tiles, ~50-65 MB each)." +echo "" +echo "To pre-fetch all tiles, run:" +echo " aws s3 cp ${S3_BUCKET}/lightcurve_hats_catalog/dataset/ ${LC_DIR}/ --recursive ${S3_OPTS}" +echo "" + +# ------------------------------------------------------------------------- +# Summary +# ------------------------------------------------------------------------- +echo "=== Download complete ===" +echo "Data directory: ${DATA_DIR}" +echo "Jobs downloaded: ${#JOBS[@]}" +if [[ "${SKIP_FITS}" == true ]]; then + echo "Note: FITS images were skipped. Alerts will be generated without cutout stamps." + echo "Re-run without --no-fits to download FITS images." +fi diff --git a/alerts/roman_rapid_alerts/generate_alerts.py b/alerts/roman_rapid_alerts/generate_alerts.py new file mode 100644 index 00000000..dac20fe9 --- /dev/null +++ b/alerts/roman_rapid_alerts/generate_alerts.py @@ -0,0 +1,853 @@ +#!/usr/bin/env python3 +""" +Generate RAPID alert packets using the v01.00 schema (rapid.v01_00). + +For each job in the data directory, reads: + - diffimage_masked.txt SExtractor catalog + - diffimage_masked_psfcat.parquet PSF-fit catalog (sharpness, roundness, etc.) + - diffimage_masked.fits ZOGY difference image (cutoutDifference) + - bkg_subbed_science_image.fits Science image (cutoutScience) + - awaicgen_output_mosaic_image_resampled_gainmatched.fits Reference (cutoutTemplate) + +Also reads Open Universe truth catalog for the truth sidecar (separate file). + +Writes one .avro file per job to the output directory. +Writes truth_sidecar/truth_labels.parquet with ground-truth labels. + +Usage: + python generate_alerts.py + python generate_alerts.py --data-dir /path/to/data/20260227 --output-dir ./output +""" + +import argparse +import io +import os +import json +import math +import fastavro +import fastavro.schema +from astropy.io import fits +from astropy_healpix import HEALPix +from astropy.coordinates import SkyCoord, ICRS +import astropy.units as u +import healpy +import numpy as np +import pandas as pd +from scipy.spatial import cKDTree + +# --------------------------------------------------------------------------- +# Default paths (relative to this script) +# --------------------------------------------------------------------------- +SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) + +DEFAULT_SCHEMA_DIR = os.path.join(SCRIPT_DIR, 'schema', '01', '00') +DEFAULT_DATA_DIR = os.path.join(SCRIPT_DIR, 'data', '20260227') +DEFAULT_OUTPUT_DIR = os.path.join(SCRIPT_DIR, 'output') +DEFAULT_SIDECAR_DIR = os.path.join(SCRIPT_DIR, 'truth_sidecar') +DEFAULT_LC_TILE_DIR = os.path.join(SCRIPT_DIR, 'data', 'lc_tiles') +DEFAULT_PROVENANCE_DIR = os.path.join(SCRIPT_DIR, 'provenance') + +# --------------------------------------------------------------------------- +# Constants +# --------------------------------------------------------------------------- +STAMP_SIZE = 64 # cutout half-width: final stamp is 2*STAMP_SIZE+1 pixels +LC_MATCH_ARCSEC = 1.0 # lc catalog cross-match radius +LC_S3_BASE = 's3://rapid-product-files/lightcurve_hats_catalog/dataset' +MATCH_RADIUS_PX = 3.0 # truth cross-match radius in pixels + +# Schema files in dependency order +SCHEMA_FILES = [ + 'rapid.v01_00.diaSource.avsc', + 'rapid.v01_00.diaForcedSource.avsc', + 'rapid.v01_00.diaObject.avsc', + 'rapid.v01_00.ssSource.avsc', + 'rapid.v01_00.mpc_orbits.avsc', + 'rapid.v01_00.alert.avsc', +] + +ROMAN_FILTERS = ['F062', 'F087', 'F106', 'F129', 'F146', 'F158', 'F184', 'F213'] + +# fid -> filter string (confirmed from FITS headers, 20260227 run) +FID_TO_FILTER = { + 1: 'F184', 2: 'F158', 3: 'F129', 4: 'F213', 5: 'F062', 6: 'F106', 7: 'F087', +} +# Header filter name -> new schema band name +FILTER_TO_BAND = { + 'F184': 'F184', 'H158': 'F158', 'J129': 'F129', 'K213': 'F213', + 'R062': 'F062', 'Y106': 'F106', 'Z087': 'F087', +} + +# Per-filter zero-points (constant per filter in 20260227 run) +# ZPTMAG: from OpenUniverse headers, for DN (includes EXPTIME + collecting area) +FILTER_ZPTMAG = { + 'F184': 18.824126, 'F158': 17.638109, 'F129': 17.638109, + 'F213': 18.824126, 'F062': 16.954336, 'F106': 17.638109, + 'F087': 16.455405, +} + +# BANDZPT: bandpass-dependent zero-point (filter transmission sensitivity) +FILTER_BANDZPT = { + 'F184': 14.62199399091576, + 'F158': 15.074164829833911, + 'F129': 15.03962528980125, + 'F106': 15.023547191066587, + 'F087': 14.964334468671934, + 'F062': 15.296832274841094, + 'F213': 14.579315583138646, +} + +# Exposure times per filter (seconds) +FILTER_EXPTIME = { + 'F184': 901.175, 'F158': 302.275, 'F129': 302.275, + 'F213': 901.175, 'F062': 161.0, 'F106': 302.275, + 'F087': 101.7, +} + +# Effective zero-point for DN/s -> AB mag: +# ZP_eff = BANDZPT + ZPTMAG - 2.5 * log10(EXPTIME) +# Images are in DN/s, so: mag_AB = -2.5 * log10(f_DN/s) + ZP_eff +FILTER_ZP_EFF = { + band: FILTER_BANDZPT[band] + FILTER_ZPTMAG[band] - 2.5 * math.log10(FILTER_EXPTIME[band]) + for band in FILTER_BANDZPT +} + +# --------------------------------------------------------------------------- +# Module-level path variables (set by main via CLI args) +# --------------------------------------------------------------------------- +SCHEMA_DIR = DEFAULT_SCHEMA_DIR +DATA_DIR = DEFAULT_DATA_DIR +OUTPUT_DIR = DEFAULT_OUTPUT_DIR +SIDECAR_DIR = DEFAULT_SIDECAR_DIR +LC_TILE_DIR = DEFAULT_LC_TILE_DIR +PROVENANCE_DIR = DEFAULT_PROVENANCE_DIR + +# --------------------------------------------------------------------------- +# Schema loading +# --------------------------------------------------------------------------- + +def load_schema(): + paths = [os.path.join(SCHEMA_DIR, f) for f in SCHEMA_FILES] + return fastavro.schema.load_schema_ordered(paths) + +# --------------------------------------------------------------------------- +# FITS header parsing +# --------------------------------------------------------------------------- + +def parse_fits_header(path): + """Read FITS header -- supports both full FITS and partial header files.""" + if path.endswith('.fits') and os.path.getsize(path) > 36000: + try: + with fits.open(path) as hdul: + h = hdul[0].header + return {k: str(h[k]).strip() for k in h.keys() if k} + except Exception: + pass + with open(path, 'rb') as f: + data = f.read() + hdr = {} + for i in range(0, len(data), 80): + card = data[i:i+80].decode('ascii', errors='replace') + key = card[:8].strip() + if key == 'END': + break + if '=' in card: + raw = card[10:80].split('/')[0].strip().strip("'").strip() + hdr[key] = raw + return hdr + + +def hdr_float(hdr, key, default=None): + try: + return float(hdr[key]) + except (KeyError, ValueError): + return default + + +def hdr_int(hdr, key, default=None): + try: + return int(float(hdr[key])) + except (KeyError, ValueError): + return default + +# --------------------------------------------------------------------------- +# SExtractor catalog parsing +# --------------------------------------------------------------------------- + +def parse_sextractor(path): + col_map = {} + rows = [] + with open(path) as f: + for line in f: + line = line.rstrip('\n') + if line.startswith('#'): + parts = line.split() + if len(parts) >= 3: + try: + col_map[int(parts[1])] = parts[2] + except ValueError: + pass + elif line.strip(): + vals = line.split() + row = {} + for col_num, name in col_map.items(): + idx = col_num - 1 + if idx < len(vals): + try: + row[name] = float(vals[idx]) + except ValueError: + row[name] = None + rows.append(row) + return rows + +# --------------------------------------------------------------------------- +# PSF-fit parquet loading and cross-match to SExtractor +# --------------------------------------------------------------------------- + +def load_psf_catalog(job_dir): + """Load PSF-fit parquet and return (DataFrame, cKDTree on pixel coords).""" + path = os.path.join(job_dir, 'diffimage_masked_psfcat.parquet') + if not os.path.exists(path): + return None, None + df = pd.read_parquet(path) + if len(df) == 0: + return None, None + xy = np.column_stack([df['x_fit'].values, df['y_fit'].values]) + tree = cKDTree(xy) + return df, tree + + +def match_psf(xpos, ypos, psf_df, psf_tree, radius=5.0): + """Return nearest PSF-fit row within radius pixels, or None.""" + if psf_df is None or xpos is None or ypos is None: + return None + dist, idx = psf_tree.query([xpos, ypos], distance_upper_bound=radius) + if idx >= len(psf_df): + return None + return psf_df.iloc[idx] + +# --------------------------------------------------------------------------- +# Open Universe truth catalog +# --------------------------------------------------------------------------- + +def parse_truth(path): + if path is None or not os.path.exists(path): + return [] + sources = [] + with open(path) as f: + for line in f: + line = line.strip() + if not line or line.startswith('#'): + continue + parts = line.split() + if len(parts) < 9: + continue + sources.append({ + 'object_id': int(parts[0]), + 'ra': float(parts[1]), + 'dec': float(parts[2]), + 'x': float(parts[3]), + 'y': float(parts[4]), + 'realized_flux': float(parts[5]), + 'flux': float(parts[6]), + 'mag': float(parts[7]), + 'obj_type': parts[8], + }) + return sources + + +def match_truth(xpos, ypos, truth_sources): + best_dist, best = MATCH_RADIUS_PX + 1, None + for src in truth_sources: + d = math.hypot(xpos - src['x'], ypos - src['y']) + if d < best_dist: + best_dist, best = d, src + return best + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + +def mag_to_flux_njy(mag): + if mag is None or math.isnan(mag) or mag > 90.0: + return None + return 3.631e12 * 10.0 ** (-mag / 2.5) + + +def safe_float(val, limit=90.0, scale=None): + if val is None: + return None + try: + v = float(val) + if not math.isfinite(v) or v >= limit: + return None + return v * scale if scale is not None else v + except (TypeError, ValueError): + return None + +# --------------------------------------------------------------------------- +# FITS cutout extraction (raw bytes for new schema) +# --------------------------------------------------------------------------- + +def load_image(path): + if path is None or not os.path.exists(path): + return None + try: + with fits.open(path, memmap=True) as hdul: + return hdul[0].data + except Exception: + return None + + +def extract_stamp(data, xpos, ypos, size=STAMP_SIZE): + """Extract cutout and return raw FITS bytes.""" + if data is None or xpos is None or ypos is None: + return None + col = int(round(xpos)) - 1 + row = int(round(ypos)) - 1 + nrows, ncols = data.shape + r0, r1 = row - size, row + size + 1 + c0, c1 = col - size, col + size + 1 + if r0 < 0 or r1 > nrows or c0 < 0 or c1 > ncols: + return None + stamp = data[r0:r1, c0:c1].astype(np.float32) + buf = io.BytesIO() + hdu = fits.PrimaryHDU(stamp) + hdu.writeto(buf) + return buf.getvalue() + +# --------------------------------------------------------------------------- +# LC catalog tile loading and cross-match +# --------------------------------------------------------------------------- +_lc_tile_cache = {} + + +def _lc_tile_path(norder, npix): + os.makedirs(LC_TILE_DIR, exist_ok=True) + return os.path.join(LC_TILE_DIR, f'{norder}_{npix}.parquet') + + +def _download_lc_tile(norder, npix): + path = _lc_tile_path(norder, npix) + if os.path.exists(path): + return path + dir_val = (npix // 10000) * 10000 + s3_key = f'{LC_S3_BASE}/Norder={norder}/Dir={dir_val}/Npix={npix}.parquet' + import subprocess + result = subprocess.run( + ['aws', 's3', 'cp', s3_key, path, '--no-sign-request', '--quiet'], + capture_output=True) + if result.returncode != 0: + print(f' WARN: could not download lc tile Norder={norder} Npix={npix}') + return None + return path + + +def load_lc_tile(ra_deg, dec_deg): + coord = SkyCoord(ra=ra_deg*u.deg, dec=dec_deg*u.deg, frame='icrs') + for norder in [4, 5, 6]: + hp = HEALPix(nside=2**norder, order='nested', frame=ICRS()) + npix = int(hp.skycoord_to_healpix(coord)) + if (norder, npix) in _lc_tile_cache: + return _lc_tile_cache[(norder, npix)] + path = _download_lc_tile(norder, npix) + if path and os.path.exists(path): + df = pd.read_parquet(path) + if len(df) == 0: + continue + ra_r = np.deg2rad(df['meanra'].values) + dec_r = np.deg2rad(df['meandec'].values) + xyz = np.column_stack([ + np.cos(dec_r) * np.cos(ra_r), + np.cos(dec_r) * np.sin(ra_r), + np.sin(dec_r), + ]) + tree = cKDTree(xyz) + _lc_tile_cache[(norder, npix)] = (df, tree) + return df, tree + return None, None + + +def match_lc(ra_deg, dec_deg, lc_df, lc_tree): + if lc_df is None or ra_deg is None or dec_deg is None: + return None + ra_r = math.radians(ra_deg) + dec_r = math.radians(dec_deg) + xyz = [math.cos(dec_r)*math.cos(ra_r), + math.cos(dec_r)*math.sin(ra_r), + math.sin(dec_r)] + thresh = 2.0 * math.sin(math.radians(LC_MATCH_ARCSEC / 3600.0) / 2.0) + dist, idx = lc_tree.query(xyz, distance_upper_bound=thresh) + if idx >= len(lc_df): + return None + return lc_df.iloc[idx] + +# --------------------------------------------------------------------------- +# diaObject builder (new schema: per-filter stats) +# --------------------------------------------------------------------------- + +def build_dia_object(lc_row, current_mjd): + """Build diaObject with per-filter flux statistics from lc data.""" + nd = lc_row['nested_lc_data'] + mjds = [float(m) for m in nd['mjdobs']] + + obj = { + 'diaObjectId': int(lc_row['aid']), + 'ra': float(lc_row['meanra']), + 'dec': float(lc_row['meandec']), + 'raErr': None, + 'decErr': None, + 'nDiaSources': int(lc_row['nsources']), + 'firstDiaSourceMjdTai': float(min(mjds)) if mjds else None, + 'lastDiaSourceMjdTai': float(max(mjds)) if mjds else None, + 'validityStartMjdTai': float(current_mjd), + } + + # Compute per-filter flux statistics from light curve data + filter_fluxes = {} + for i in range(len(nd['fid'])): + fid = int(nd['fid'][i]) + band = FID_TO_FILTER.get(fid) + if band is None: + continue + flux = float(nd['fluxfit'][i]) + zp_eff = FILTER_ZP_EFF.get(band) + if zp_eff is not None and flux > 0: + mag = zp_eff - 2.5 * math.log10(flux) + flux_njy = mag_to_flux_njy(mag) + if flux_njy is not None: + filter_fluxes.setdefault(band, []).append(flux_njy) + + for filt in ROMAN_FILTERS: + fluxes = filter_fluxes.get(filt, []) + if fluxes: + arr = np.array(fluxes) + obj[f'{filt}PsfFluxMean'] = float(np.mean(arr)) + obj[f'{filt}PsfFluxSigma'] = float(np.std(arr)) if len(arr) > 1 else None + obj[f'{filt}PsfFluxNdata'] = len(arr) + obj[f'{filt}PsfFluxMin'] = float(np.min(arr)) + obj[f'{filt}PsfFluxMax'] = float(np.max(arr)) + else: + obj[f'{filt}PsfFluxMean'] = None + obj[f'{filt}PsfFluxSigma'] = None + obj[f'{filt}PsfFluxNdata'] = None + obj[f'{filt}PsfFluxMin'] = None + obj[f'{filt}PsfFluxMax'] = None + + return obj + +# --------------------------------------------------------------------------- +# prvDiaSource builder (new schema: full diaSource records) +# --------------------------------------------------------------------------- + +def build_prv_dia_sources(lc_row, current_expid, current_mjd): + """Build list of full diaSource dicts from lc data, excluding current_expid + and any detections at or after current_mjd (only genuinely prior observations).""" + nd = lc_row['nested_lc_data'] + ra = float(lc_row['meanra']) + dec = float(lc_row['meandec']) + prv = [] + + for i in range(len(nd['expid'])): + expid = int(nd['expid'][i]) + if expid == current_expid: + continue + if float(nd['mjdobs'][i]) >= current_mjd: + continue + + fid = int(nd['fid'][i]) + band = FID_TO_FILTER.get(fid, 'F184') + flux_dn = float(nd['fluxfit'][i]) + fluxerr_dn = float(nd['fluxerr'][i]) + zp_eff = FILTER_ZP_EFF.get(band) + + psf_flux = None + psf_flux_err = None + if zp_eff is not None and flux_dn > 0: + mag = zp_eff - 2.5 * math.log10(flux_dn) + psf_flux = mag_to_flux_njy(mag) + if fluxerr_dn > 0 and psf_flux is not None: + magerr = 2.5 / math.log(10) * (fluxerr_dn / flux_dn) + psf_flux_err = psf_flux * magerr * math.log(10) / 2.5 + + snr = (flux_dn / fluxerr_dn) if fluxerr_dn > 0 else None + sca = int(nd['sca'][i]) + + prv.append({ + 'diaSourceId': int(nd['sid'][i]), + 'visit': expid, + 'detector': sca, + 'diaObjectId': int(lc_row['aid']), + 'ssObjectId': None, + 'parentDiaSourceId': None, + 'midpointMjdTai': float(nd['mjdobs'][i]), + 'ra': ra, + 'dec': dec, + 'raErr': None, + 'decErr': None, + 'x': 0.0, + 'y': 0.0, + 'xErr': None, + 'yErr': None, + 'band': band, + 'psfFlux': float(psf_flux) if psf_flux else None, + 'psfFluxErr': float(psf_flux_err) if psf_flux_err else None, + 'snr': float(snr) if snr else None, + 'extendedness': None, + 'reliability': None, + 'flags': 0, + 'apFlux': None, 'apFluxErr': None, + 'trailFlux': None, 'trailFluxErr': None, + 'trailLength': None, 'trailAngle': None, + 'scienceFlux': None, 'scienceFluxErr': None, + 'templateFlux': None, 'templateFluxErr': None, + 'dipoleMeanFlux': None, 'dipoleFluxErr': None, + 'dipoleLength': None, 'dipoleAngle': None, + 'ixx': None, 'iyy': None, 'ixy': None, + 'ixxErr': None, 'iyyErr': None, 'ixyErr': None, + 'pixelFlags_saturated': None, 'pixelFlags_bad': None, + 'pixelFlags_edge': None, 'pixelFlags_cr': None, + 'timeProcessedMjdTai': None, 'timeWithdrawnMjdTai': None, + 'sca': sca, + 'field': 0, + 'hp6': healpy.ang2pix(64, ra, dec, nest=True, lonlat=True), + 'hp9': healpy.ang2pix(512, ra, dec, nest=True, lonlat=True), + 'pid': 0, + 'expid': expid, + 'isdiffpos': bool(nd['isdiffpos'][i]), + 'qfit': None, 'cfit': None, 'redchi': None, 'npixfit': None, + 'sharpness': None, 'roundness1': None, 'roundness2': None, + 'peak': None, + }) + + return prv if prv else None + +# --------------------------------------------------------------------------- +# Alert builder +# --------------------------------------------------------------------------- + +def build_alert(row, hdr, psf_row=None, sci_data=None, ref_data=None, + diff_data=None, truth_match=None, lc_df=None, lc_tree=None): + """Build one alert dict from a SExtractor row + header + PSF-fit row.""" + number = int(row.get('NUMBER', 0) or 0) + expid = hdr_int(hdr, 'EXPID', 0) + sca_num = hdr_int(hdr, 'SCA_NUM', 0) + field_id = hdr_int(hdr, 'FIELD', 0) + mjd = hdr_float(hdr, 'MJD-OBS', 0.0) + filt_hdr = hdr.get('FILTER', 'F184').strip() + band = FILTER_TO_BAND.get(filt_hdr, filt_hdr) + + dia_source_id = expid * 1_000_000 + number + + ra = row.get('ALPHAWIN_J2000') + dec = row.get('DELTAWIN_J2000') + xpos = row.get('XWIN_IMAGE') + ypos = row.get('YWIN_IMAGE') + flags = int(row.get('FLAGS', 0) or 0) + + ra_err = safe_float(row.get('ERRAWIN_WORLD')) + dec_err = safe_float(row.get('ERRBWIN_WORLD')) + + # Photometry: SExtractor MAG_SE + ZP_eff -> AB -> nJy + zp_eff = FILTER_ZP_EFF.get(band) + mag_se_best = safe_float(row.get('MAG_BEST')) + mag_best = (mag_se_best + zp_eff + if mag_se_best is not None and zp_eff is not None else None) + magerr_best = safe_float(row.get('MAGERR_BEST')) + psf_flux = mag_to_flux_njy(mag_best) + psf_flux_err = None + if psf_flux is not None and magerr_best is not None: + psf_flux_err = psf_flux * magerr_best * math.log(10) / 2.5 + + # Aperture photometry + mag_se_auto = safe_float(row.get('MAG_AUTO')) + mag_auto = (mag_se_auto + zp_eff + if mag_se_auto is not None and zp_eff is not None else None) + ap_flux = mag_to_flux_njy(mag_auto) + + flux_best = row.get('FLUX_BEST') + fluxerr_best = row.get('FLUXERR_BEST') + snr = (flux_best / fluxerr_best + if flux_best and fluxerr_best and fluxerr_best != 0.0 + else None) + + # HEALPix indices + ra_f = float(ra) if ra is not None else 0.0 + dec_f = float(dec) if dec is not None else 0.0 + hp6 = healpy.ang2pix(64, ra_f, dec_f, nest=True, lonlat=True) + hp9 = healpy.ang2pix(512, ra_f, dec_f, nest=True, lonlat=True) + + # PSF-fit quality metrics from parquet + sharpness = float(psf_row['sharpness']) if psf_row is not None and pd.notna(psf_row.get('sharpness')) else None + roundness1 = float(psf_row['roundness1']) if psf_row is not None and pd.notna(psf_row.get('roundness1')) else None + roundness2 = float(psf_row['roundness2']) if psf_row is not None and pd.notna(psf_row.get('roundness2')) else None + peak = float(psf_row['peak']) if psf_row is not None and pd.notna(psf_row.get('peak')) else None + qfit = float(psf_row['qfit']) if psf_row is not None and pd.notna(psf_row.get('qfit')) else None + cfit = float(psf_row['cfit']) if psf_row is not None and pd.notna(psf_row.get('cfit')) else None + redchi = float(psf_row['reduced_chi2']) if psf_row is not None and pd.notna(psf_row.get('reduced_chi2')) else None + npixfit = int(psf_row['npixfit']) if psf_row is not None and pd.notna(psf_row.get('npixfit')) else None + + # LC catalog cross-match -> diaObject + prvDiaSources + lc_match = match_lc(ra_f, dec_f, lc_df, lc_tree) + dia_object = build_dia_object(lc_match, mjd) if lc_match is not None else None + prv_dia_sources = build_prv_dia_sources(lc_match, expid, mjd) if lc_match is not None else None + resolved_object_id = int(lc_match['aid']) if lc_match is not None else None + + dia_source = { + 'diaSourceId': dia_source_id, + 'visit': expid, + 'detector': sca_num, + 'diaObjectId': resolved_object_id, + 'ssObjectId': None, + 'parentDiaSourceId': None, + 'midpointMjdTai': mjd, + 'ra': ra_f, + 'dec': dec_f, + 'raErr': ra_err, + 'decErr': dec_err, + 'x': float(xpos) if xpos is not None else 0.0, + 'y': float(ypos) if ypos is not None else 0.0, + 'xErr': None, + 'yErr': None, + 'band': band, + 'psfFlux': float(psf_flux) if psf_flux is not None else None, + 'psfFluxErr': float(psf_flux_err) if psf_flux_err is not None else None, + 'snr': float(snr) if snr is not None else None, + 'extendedness': safe_float(row.get('CLASS_STAR')), + 'reliability': None, + 'flags': flags, + 'apFlux': float(ap_flux) if ap_flux is not None else None, + 'apFluxErr': None, + 'trailFlux': None, 'trailFluxErr': None, + 'trailLength': None, 'trailAngle': None, + 'scienceFlux': None, 'scienceFluxErr': None, + 'templateFlux': None, 'templateFluxErr': None, + 'dipoleMeanFlux': None, 'dipoleFluxErr': None, + 'dipoleLength': None, 'dipoleAngle': None, + 'ixx': safe_float(row.get('X2_IMAGE'), scale=0.0121), + 'iyy': safe_float(row.get('Y2_IMAGE'), scale=0.0121), + 'ixy': safe_float(row.get('XY_IMAGE'), scale=0.0121), + 'ixxErr': safe_float(row.get('ERRX2_IMAGE'), scale=0.0121), + 'iyyErr': safe_float(row.get('ERRY2_IMAGE'), scale=0.0121), + 'ixyErr': safe_float(row.get('ERRXY_IMAGE'), scale=0.0121), + 'pixelFlags_saturated': None, + 'pixelFlags_bad': bool(flags & 0x01) if flags else None, + 'pixelFlags_edge': bool(flags & 0x04) if flags else None, + 'pixelFlags_cr': None, + 'timeProcessedMjdTai': None, + 'timeWithdrawnMjdTai': None, + 'sca': sca_num, + 'field': field_id, + 'hp6': hp6, + 'hp9': hp9, + 'pid': 0, + 'expid': expid, + 'isdiffpos': True, + 'qfit': qfit, + 'cfit': cfit, + 'redchi': redchi, + 'npixfit': npixfit, + 'sharpness': sharpness, + 'roundness1': roundness1, + 'roundness2': roundness2, + 'peak': peak, + } + + return { + 'diaSourceId': dia_source_id, + 'observation_reason': None, + 'target_name': None, + 'diaSource': dia_source, + 'prvDiaSources': prv_dia_sources, + 'prvDiaForcedSources': None, + 'diaObject': dia_object, + 'ssSource': None, + 'mpc_orbits': None, + 'cutoutDifference': extract_stamp(diff_data, xpos, ypos), + 'cutoutScience': extract_stamp(sci_data, xpos, ypos), + 'cutoutTemplate': extract_stamp(ref_data, xpos, ypos), + } + +# --------------------------------------------------------------------------- +# Per-job processing +# --------------------------------------------------------------------------- + +def process_job(jid, schema, include_truth=False): + job_dir = os.path.join(DATA_DIR, jid) + + # Try: (1) saved JSON header in provenance, (2) full FITS, (3) partial header in /tmp + json_hdr = os.path.join(PROVENANCE_DIR, 'headers', f'{jid}_header.json') + fits_path = os.path.join(job_dir, 'diffimage_masked.fits') + hdr_path_tmp = os.path.join('/tmp', f'hdr_{jid}.fits') + + if os.path.exists(json_hdr): + with open(json_hdr) as f: + hdr = {k: str(v) for k, v in json.load(f).items()} + elif os.path.exists(fits_path): + hdr = parse_fits_header(fits_path) + elif os.path.exists(hdr_path_tmp): + hdr = parse_fits_header(hdr_path_tmp) + else: + print(f' SKIP {jid}: no FITS or header file found') + return [], [] + + sex_path = os.path.join(job_dir, 'diffimage_masked.txt') + if not os.path.exists(sex_path): + print(f' SKIP {jid}: no SExtractor catalog') + return [], [] + rows = parse_sextractor(sex_path) + + # Load PSF-fit catalog + psf_df, psf_tree = load_psf_catalog(job_dir) + print(f' {jid}: PSF catalog {"loaded" if psf_df is not None else "unavailable"}' + + (f' ({len(psf_df)} sources)' if psf_df is not None else '')) + + # Truth catalog + if include_truth: + truth_files = [f for f in os.listdir(job_dir) if f.startswith('Roman_TDS_index_')] + truth_sources = parse_truth(os.path.join(job_dir, truth_files[0])) if truth_files else [] + n_transients = sum(1 for s in truth_sources if s['obj_type'] == 'transient') + print(f' {jid}: truth catalog {len(truth_sources)} sources ({n_transients} transients)' + if truth_sources else f' {jid}: no truth catalog') + else: + truth_sources = [] + + # FITS images for cutouts + sci_data = load_image(os.path.join(job_dir, 'bkg_subbed_science_image.fits')) + ref_data = load_image(os.path.join(job_dir, 'awaicgen_output_mosaic_image_resampled_gainmatched.fits')) + diff_data = load_image(os.path.join(job_dir, 'diffimage_masked.fits')) + n_images = sum(x is not None for x in [sci_data, ref_data, diff_data]) + print(f' {jid}: loaded {n_images}/3 FITS images for stamps') + + # LC tile + crval1 = hdr_float(hdr, 'CRVAL1') + crval2 = hdr_float(hdr, 'CRVAL2') + lc_df, lc_tree = load_lc_tile(crval1, crval2) + print(f' {jid}: lc tile {"loaded" if lc_df is not None else "unavailable"}' + + (f' ({len(lc_df):,} objects)' if lc_df is not None else '')) + + alerts = [] + truth_rows = [] + skipped = 0 + + for row in rows: + try: + xpos = row.get('XWIN_IMAGE') + ypos = row.get('YWIN_IMAGE') + + psf_match = match_psf(xpos, ypos, psf_df, psf_tree) + truth_match = match_truth(xpos or 0.0, ypos or 0.0, truth_sources) if truth_sources else None + + alert = build_alert(row, hdr, psf_row=psf_match, + sci_data=sci_data, ref_data=ref_data, + diff_data=diff_data, truth_match=truth_match, + lc_df=lc_df, lc_tree=lc_tree) + alerts.append(alert) + + if include_truth: + expid = hdr_int(hdr, 'EXPID', 0) + number = int(row.get('NUMBER', 0) or 0) + dia_source_id = expid * 1_000_000 + number + truth_rows.append({ + 'diaSourceId': dia_source_id, + 'obj_type': truth_match['obj_type'] if truth_match else None, + 'truth_ra': truth_match['ra'] if truth_match else None, + 'truth_dec': truth_match['dec'] if truth_match else None, + 'truth_mag': truth_match['mag'] if truth_match else None, + 'truth_object_id': truth_match['object_id'] if truth_match else None, + }) + + except Exception as e: + skipped += 1 + if skipped <= 3: + print(f' WARN row {row.get("NUMBER")}: {e}') + + # Write alerts + os.makedirs(OUTPUT_DIR, exist_ok=True) + out_path = os.path.join(OUTPUT_DIR, f'{jid}_alerts.avro') + with open(out_path, 'wb') as f: + fastavro.writer(f, schema, alerts) + + n_lc_match = sum(1 for a in alerts if a['diaObject'] is not None) + n_prv = sum(len(a['prvDiaSources']) for a in alerts if a['prvDiaSources']) + n_truth = sum(1 for t in truth_rows if t['obj_type'] is not None) + truth_str = f'{n_truth} truth-matched, ' if include_truth else '' + print(f' {jid}: {len(alerts)} alerts, {truth_str}' + f'{n_lc_match} lc matches (avg {n_prv//max(n_lc_match,1)} prvDiaSources)' + + (f', {skipped} skipped' if skipped else '') + + f' -> {os.path.basename(out_path)}') + + return alerts, truth_rows + +# --------------------------------------------------------------------------- +# Main +# --------------------------------------------------------------------------- + +def parse_args(): + p = argparse.ArgumentParser( + description='Generate RAPID alert packets (rapid.v01_00 schema)') + p.add_argument('--data-dir', default=DEFAULT_DATA_DIR, + help='Directory containing jid*/ job folders ' + '(default: %(default)s)') + p.add_argument('--schema-dir', default=DEFAULT_SCHEMA_DIR, + help='Directory containing .avsc schema files ' + '(default: %(default)s)') + p.add_argument('--output-dir', default=DEFAULT_OUTPUT_DIR, + help='Output directory for .avro alert files ' + '(default: %(default)s)') + p.add_argument('--sidecar-dir', default=DEFAULT_SIDECAR_DIR, + help='Output directory for truth sidecar ' + '(default: %(default)s)') + p.add_argument('--lc-tile-dir', default=DEFAULT_LC_TILE_DIR, + help='Cache directory for light curve HEALPix tiles ' + '(default: %(default)s)') + p.add_argument('--provenance-dir', default=DEFAULT_PROVENANCE_DIR, + help='Directory with saved FITS headers (JSON), truth and ' + 'inject catalogs (default: %(default)s)') + p.add_argument('--jobs', nargs='*', default=None, + help='Process only these job IDs (default: all jid* dirs)') + p.add_argument('--include-truth', action='store_true', + help='Enable truth catalog matching and sidecar generation ' + '(requires Roman_TDS_index_*.txt in job dirs)') + return p.parse_args() + + +if __name__ == '__main__': + args = parse_args() + + # Set module-level path variables from CLI args + SCHEMA_DIR = args.schema_dir + DATA_DIR = args.data_dir + OUTPUT_DIR = args.output_dir + SIDECAR_DIR = args.sidecar_dir + LC_TILE_DIR = args.lc_tile_dir + PROVENANCE_DIR = args.provenance_dir + + print('Loading schema...') + schema = load_schema() + + if args.jobs: + jobs = args.jobs + else: + jobs = sorted(d for d in os.listdir(DATA_DIR) if d.startswith('jid')) + print(f'Found {len(jobs)} jobs: {", ".join(jobs)}\n') + + all_truth_rows = [] + total = 0 + for jid in jobs: + alerts, truth_rows = process_job(jid, schema, include_truth=args.include_truth) + total += len(alerts) + all_truth_rows.extend(truth_rows) + + # Write truth sidecar + if not args.include_truth: + print(f'\nTruth sidecar: skipped (use --include-truth to enable)') + elif all_truth_rows: + os.makedirs(SIDECAR_DIR, exist_ok=True) + truth_df = pd.DataFrame(all_truth_rows) + sidecar_path = os.path.join(SIDECAR_DIR, 'truth_labels.parquet') + truth_df.to_parquet(sidecar_path, index=False) + n_matched = truth_df['obj_type'].notna().sum() + print(f'\nTruth sidecar: {len(truth_df)} rows ({n_matched} matched) -> {sidecar_path}') + else: + print('\nWARN: no truth rows generated') + print(f'Total: {total} alerts written to {OUTPUT_DIR}') diff --git a/alerts/roman_rapid_alerts/generate_inject_sidecar.py b/alerts/roman_rapid_alerts/generate_inject_sidecar.py new file mode 100644 index 00000000..64cf9f95 --- /dev/null +++ b/alerts/roman_rapid_alerts/generate_inject_sidecar.py @@ -0,0 +1,207 @@ +#!/usr/bin/env python3 +""" +Generate inject_sidecar.parquet by cross-matching simple-inject catalogs +against SExtractor detection catalogs. + +Each job has ~100 point sources injected into the difference image. +This script finds which injects were detected (within MATCH_RADIUS_PX pixels) +and records the matched diaSourceId, plus the OU2024 truth label at that position +(from truth_labels.parquet). + +Usage: + python generate_inject_sidecar.py + python generate_inject_sidecar.py --data-dir ./data/20260227 --inject-dir ./provenance/inject_catalogs +""" + +import argparse +import glob +import json +import math +import os +import re + +import pandas as pd + +MATCH_RADIUS_PX = 3.0 + +# Default paths relative to this script +SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) + +DEFAULT_DATA_DIR = os.path.join(SCRIPT_DIR, 'data', '20260227') +DEFAULT_INJECT_DIR = os.path.join(SCRIPT_DIR, 'provenance', 'inject_catalogs') +DEFAULT_HEADER_DIR = os.path.join(SCRIPT_DIR, 'provenance', 'headers') +DEFAULT_TRUTH_PATH = os.path.join(SCRIPT_DIR, 'truth_sidecar', 'truth_labels.parquet') +DEFAULT_OUTPUT_PATH = os.path.join(SCRIPT_DIR, 'truth_sidecar', 'inject_sidecar.parquet') + + +def parse_sextractor(path): + """Parse a SExtractor catalog file, returning list of dicts.""" + col_map = {} + rows = [] + with open(path) as f: + for line in f: + line = line.rstrip('\n') + if line.startswith('#'): + parts = line.split() + if len(parts) >= 3: + try: + col_map[int(parts[1])] = parts[2] + except ValueError: + pass + elif line.strip(): + vals = line.split() + row = {} + for col_num, name in col_map.items(): + idx = col_num - 1 + if idx < len(vals): + try: + row[name] = float(vals[idx]) + except ValueError: + row[name] = None + rows.append(row) + return rows + + +def parse_inject_catalog(path): + """Parse whitespace-separated inject catalog (xpix, ypix, flux).""" + injects = [] + with open(path) as f: + for line in f: + line = line.strip() + if not line or line.startswith('xpix'): + continue + parts = line.split() + if len(parts) >= 3: + injects.append({ + 'xpix': float(parts[0]), + 'ypix': float(parts[1]), + 'flux': float(parts[2]), + }) + return injects + + +def find_nearest_detection(xpix, ypix, detections): + """Find nearest SExtractor detection within MATCH_RADIUS_PX.""" + best_dist = MATCH_RADIUS_PX + 1 + best = None + for det in detections: + dx = xpix - det.get('XWIN_IMAGE', 0) + dy = ypix - det.get('YWIN_IMAGE', 0) + d = math.hypot(dx, dy) + if d < best_dist: + best_dist = d + best = det + if best is not None and best_dist <= MATCH_RADIUS_PX: + return best, best_dist + return None, None + + +def parse_args(): + p = argparse.ArgumentParser( + description='Generate inject sidecar by cross-matching inject catalogs ' + 'to SExtractor detections') + p.add_argument('--data-dir', default=DEFAULT_DATA_DIR, + help='Directory containing jid*/ job folders with ' + 'SExtractor catalogs (default: %(default)s)') + p.add_argument('--inject-dir', default=DEFAULT_INJECT_DIR, + help='Directory containing inject catalog files ' + '(default: %(default)s)') + p.add_argument('--header-dir', default=DEFAULT_HEADER_DIR, + help='Directory containing saved FITS header JSONs ' + '(default: %(default)s)') + p.add_argument('--truth-path', default=DEFAULT_TRUTH_PATH, + help='Path to truth_labels.parquet ' + '(default: %(default)s)') + p.add_argument('--output-path', default=DEFAULT_OUTPUT_PATH, + help='Output path for inject_sidecar.parquet ' + '(default: %(default)s)') + return p.parse_args() + + +def main(): + args = parse_args() + + # Load truth labels to look up OU2024 obj_type for matched detections + truth_df = pd.read_parquet(args.truth_path) + truth_df = truth_df.drop_duplicates(subset=['diaSourceId'], keep='first') + truth_lookup = dict(zip(truth_df['diaSourceId'], truth_df['obj_type'])) + + # Find all inject catalog files and extract jid from filename + inject_files = sorted(glob.glob(os.path.join(args.inject_dir, 'jid*_*_inject.txt'))) + print(f'Found {len(inject_files)} inject catalogs') + + all_rows = [] + + for inject_path in inject_files: + fname = os.path.basename(inject_path) + jid = re.match(r'(jid\d+)_', fname).group(1) + + header_path = os.path.join(args.header_dir, f'{jid}_header.json') + with open(header_path) as f: + hdr = json.load(f) + expid = int(hdr['EXPID']) + + sext_path = os.path.join(args.data_dir, jid, 'diffimage_masked.txt') + detections = parse_sextractor(sext_path) + + injects = parse_inject_catalog(inject_path) + + n_detected = 0 + for inject_idx, inj in enumerate(injects): + det, dist = find_nearest_detection(inj['xpix'], inj['ypix'], detections) + + if det is not None: + number = int(det.get('NUMBER', 0) or 0) + dia_source_id = expid * 1_000_000 + number + ou24_type = truth_lookup.get(dia_source_id) + n_detected += 1 + else: + dia_source_id = None + ou24_type = None + dist = None + + all_rows.append({ + 'jid': jid, + 'inject_idx': inject_idx, + 'xpix': inj['xpix'], + 'ypix': inj['ypix'], + 'flux': inj['flux'], + 'detected': det is not None, + 'diaSourceId': dia_source_id, + 'match_dist_px': dist, + 'ou24_obj_type': ou24_type, + }) + + print(f' {jid}: {len(injects)} injects, {n_detected} detected ' + f'({100*n_detected/len(injects):.0f}%)') + + inject_df = pd.DataFrame(all_rows) + inject_df['diaSourceId'] = inject_df['diaSourceId'].astype('Int64') + + os.makedirs(os.path.dirname(args.output_path), exist_ok=True) + inject_df.to_parquet(args.output_path, index=False) + print(f'\nSaved {len(inject_df)} rows to {args.output_path}') + + # Summary stats + n_total = len(inject_df) + n_det = inject_df['detected'].sum() + n_undet = n_total - n_det + det_with_ou24 = inject_df[inject_df['detected'] & inject_df['ou24_obj_type'].notna()] + det_bogus = inject_df[inject_df['detected'] & inject_df['ou24_obj_type'].isna()] + + print(f'\nSummary:') + print(f' Total injects: {n_total}') + print(f' Detected: {n_det} ({100*n_det/n_total:.1f}%)') + print(f' Undetected: {n_undet} ({100*n_undet/n_total:.1f}%)') + print(f' Detected + OU24 match: {len(det_with_ou24)} ' + f'(labeled as real by OU2024 truth)') + print(f' Detected + no OU24: {len(det_bogus)} ' + f'(mislabeled as bogus -- these should be REAL)') + + if len(det_with_ou24) > 0: + print(f'\n OU2024 type breakdown for detected injects:') + print(det_with_ou24['ou24_obj_type'].value_counts().to_string(header=False)) + + +if __name__ == '__main__': + main() diff --git a/alerts/roman_rapid_alerts/notebooks/background.ipynb b/alerts/roman_rapid_alerts/notebooks/background.ipynb new file mode 100644 index 00000000..b7f8af97 --- /dev/null +++ b/alerts/roman_rapid_alerts/notebooks/background.ipynb @@ -0,0 +1,559 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "cell-0", + "metadata": {}, + "source": "# RAPID Alert Generation — Background\n\nThis notebook explains **how** the alert dataset is produced. It documents\nthe pipeline architecture, calibration chain, and data provenance.\n\n## Pipeline Overview\n\n**RAPID** (Roman Alerts Promptly from Image Differencing) processes Roman WFI\nexposures through a difference-imaging pipeline:\n\n```\nScience image (DN/s) Template image (DN/s, gain-matched coadd)\n \\ /\n \\ /\n ZOGY subtraction\n |\n Difference image (DN/s)\n |\n ┌───────────┼────────────┐\n │ │ │\n SExtractor PSF fitting Inject catalog\n (detection) (quality) (truth sources)\n │ │ │\n └───────────┼────────────┘\n |\n Alert generation\n |\n ┌────────┼────────┐\n │ │ │\n Avro alerts Truth Provenance\n sidecar (headers, catalogs)\n```\n\nThe data comes from the **Open Universe 2024** (OU2024) Roman Time Domain Survey\nsimulation. Each job processes one SCA (Sensor Chip Assembly) detector from one visit." + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cell-1", + "metadata": {}, + "outputs": [], + "source": [ + "import glob\n", + "import io\n", + "import json\n", + "import math\n", + "import os\n", + "\n", + "import fastavro\n", + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "from astropy.io import fits\n", + "\n", + "%matplotlib inline\n", + "plt.rcParams['figure.dpi'] = 120\n", + "\n", + "DATA_ROOT = '../data/20260227'\n", + "EXAMPLE_JID = 'jid1061'" + ] + }, + { + "cell_type": "markdown", + "id": "cell-2", + "metadata": {}, + "source": [ + "## 1. FITS Headers — Exposure Metadata\n", + "\n", + "Each job's difference image FITS header contains the key metadata:\n", + "EXPID, SCA_NUM, FIELD, MJD-OBS, FILTER, ZPTMAG, EXPTIME, BUNIT.\n", + "\n", + "These are saved as JSON in `provenance/headers/` for reproducibility." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cell-3", + "metadata": {}, + "outputs": [], + "source": [ + "# Load a saved header\n", + "hdr_path = '../provenance/headers/jid1061_header.json'\n", + "with open(hdr_path) as f:\n", + " hdr = json.load(f)\n", + "\n", + "key_fields = ['FILTER', 'SCA_NUM', 'EXPID', 'FIELD', 'MJD-OBS',\n", + " 'ZPTMAG', 'EXPTIME', 'BUNIT', 'CRVAL1', 'CRVAL2']\n", + "print(f'Header for {EXAMPLE_JID}:')\n", + "for k in key_fields:\n", + " print(f' {k:12s} = {hdr.get(k, \"N/A\")}')\n", + "\n", + "print(f'\\nAll 15 jobs:')\n", + "hdr_files = sorted(glob.glob('../provenance/headers/jid*_header.json'))\n", + "print(f'{\"JID\":12s} {\"Filter\":8s} {\"SCA\":>4s} {\"MJD\":>10s} {\"ZPTMAG\":>8s} {\"EXPTIME\":>8s}')\n", + "for hf in hdr_files:\n", + " with open(hf) as f:\n", + " h = json.load(f)\n", + " jid = os.path.basename(hf).replace('_header.json', '')\n", + " print(f'{jid:12s} {h.get(\"FILTER\",\"?\"):8s} {h.get(\"SCA_NUM\",\"?\"):>4s} '\n", + " f'{h.get(\"MJD-OBS\",\"?\"):>10s} {h.get(\"ZPTMAG\",\"?\"):>8s} {h.get(\"EXPTIME\",\"?\"):>8s}')" + ] + }, + { + "cell_type": "markdown", + "id": "cell-4", + "metadata": {}, + "source": [ + "## 2. Photometric Calibration\n", + "\n", + "Converting image pixel values to physical fluxes requires three components:\n", + "\n", + "| Component | What it accounts for | Value range |\n", + "|-----------|---------------------|-------------|\n", + "| **BANDZPT** | Filter bandpass transmission (sensitivity) | 14.6 -- 15.3 |\n", + "| **ZPTMAG** | Collecting area + exposure time (from OU headers, for DN) | 16.5 -- 18.8 |\n", + "| **EXPTIME** | Exposure duration (images normalized to DN/s) | 102 -- 901 s |\n", + "\n", + "**Images are in DN/s** (counts per second). The effective zero-point for DN/s is:\n", + "\n", + "$$\\mathrm{ZP}_{\\mathrm{eff}} = \\mathrm{BANDZPT} + \\mathrm{ZPTMAG} - 2.5 \\, \\log_{10}(\\mathrm{EXPTIME})$$\n", + "\n", + "Then: $m_{\\mathrm{AB}} = -2.5 \\, \\log_{10}(f_{\\mathrm{DN/s}}) + \\mathrm{ZP}_{\\mathrm{eff}}$\n", + "\n", + "And finally to nanojansky: $f_{\\mathrm{nJy}} = 3.631 \\times 10^{12} \\times 10^{-m_{\\mathrm{AB}}/2.5}$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cell-5", + "metadata": {}, + "outputs": [], + "source": [ + "# The three calibration components\n", + "BANDZPT = {\n", + " 'F184': 14.622, 'F158': 15.074, 'F129': 15.040,\n", + " 'F106': 15.024, 'F087': 14.964, 'F062': 15.297, 'F213': 14.579,\n", + "}\n", + "ZPTMAG = {\n", + " 'F184': 18.824, 'F158': 17.638, 'F129': 17.638,\n", + " 'F213': 18.824, 'F062': 16.954, 'F106': 17.638, 'F087': 16.455,\n", + "}\n", + "EXPTIME = {\n", + " 'F184': 901.175, 'F158': 302.275, 'F129': 302.275,\n", + " 'F213': 901.175, 'F062': 161.0, 'F106': 302.275, 'F087': 101.7,\n", + "}\n", + "\n", + "print(f'{\"Band\":<6s} {\"BANDZPT\":>8s} {\"ZPTMAG\":>8s} {\"EXPTIME\":>8s} {\"ZP_eff\":>8s}')\n", + "print('-' * 46)\n", + "for band in sorted(BANDZPT):\n", + " zp_eff = BANDZPT[band] + ZPTMAG[band] - 2.5 * math.log10(EXPTIME[band])\n", + " print(f'{band:<6s} {BANDZPT[band]:8.3f} {ZPTMAG[band]:8.3f} {EXPTIME[band]:8.1f} {zp_eff:8.3f}')\n", + "\n", + "print('\\nEffective ZPs are ~26-27 AB, consistent with Roman WFI single-visit depth.')" + ] + }, + { + "cell_type": "markdown", + "id": "cell-6", + "metadata": {}, + "source": [ + "### Conversion recipes\n", + "\n", + "```python\n", + "# Alert psfFlux (already in nJy) → AB magnitude\n", + "mag_AB = -2.5 * np.log10(psfFlux_nJy) + 31.4\n", + "\n", + "# Raw image flux (DN/s) → AB magnitude\n", + "mag_AB = -2.5 * np.log10(flux_dns) + ZP_eff[band]\n", + "\n", + "# Truth catalog 'mag' column → AB magnitude (BANDZPT already applied)\n", + "mag_AB = truth_mag + ZPTMAG[band]\n", + "\n", + "# Inject catalog flux (DN) → AB magnitude\n", + "mag_AB = -2.5 * np.log10(flux_DN) + BANDZPT[band] + ZPTMAG[band]\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "cell-7", + "metadata": {}, + "source": [ + "## 3. SExtractor Catalog — Source Detection\n", + "\n", + "Each job runs SExtractor on the difference image with ZP=0, producing a\n", + "catalog (`diffimage_masked.txt`) with columns like:\n", + "NUMBER, X, Y, RA, Dec, MAG_BEST, MAG_AUTO, FLUX_BEST, FLAGS, CLASS_STAR, etc.\n", + "\n", + "The alert generator parses these comment-delimited catalogs." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cell-8", + "metadata": {}, + "outputs": [], + "source": [ + "# Parse a SExtractor catalog (same logic as generate_alerts_v100.py)\n", + "sex_path = os.path.join(DATA_ROOT, EXAMPLE_JID, 'diffimage_masked.txt')\n", + "\n", + "col_map = {}\n", + "rows = []\n", + "with open(sex_path) as f:\n", + " for line in f:\n", + " line = line.rstrip('\\n')\n", + " if line.startswith('#'):\n", + " parts = line.split()\n", + " if len(parts) >= 3:\n", + " try:\n", + " col_map[int(parts[1])] = parts[2]\n", + " except ValueError:\n", + " pass\n", + " elif line.strip():\n", + " vals = line.split()\n", + " row = {}\n", + " for col_num, name in col_map.items():\n", + " idx = col_num - 1\n", + " if idx < len(vals):\n", + " try:\n", + " row[name] = float(vals[idx])\n", + " except ValueError:\n", + " row[name] = None\n", + " rows.append(row)\n", + "\n", + "sex_df = pd.DataFrame(rows)\n", + "print(f'SExtractor catalog for {EXAMPLE_JID}: {len(sex_df)} detections')\n", + "print(f'Columns: {list(sex_df.columns)}')\n", + "print(f'\\nFirst 5 rows (key columns):')\n", + "key_cols = [c for c in ['NUMBER', 'ALPHAWIN_J2000', 'DELTAWIN_J2000',\n", + " 'XWIN_IMAGE', 'YWIN_IMAGE', 'MAG_BEST', 'MAGERR_BEST',\n", + " 'FLUX_BEST', 'FLAGS', 'CLASS_STAR'] if c in sex_df.columns]\n", + "sex_df[key_cols].head()" + ] + }, + { + "cell_type": "markdown", + "id": "cell-9", + "metadata": {}, + "source": [ + "## 4. PSF-Fit Quality Catalog\n", + "\n", + "A separate PSF-fitting step produces `diffimage_masked_psfcat.parquet` with\n", + "morphological quality metrics: `sharpness`, `roundness1`, `roundness2`, `peak`,\n", + "`qfit`, `cfit`, `redchi`, `npixfit`.\n", + "\n", + "These are matched to SExtractor detections by pixel position (within 5 px radius)\n", + "and stored in the alert's `diaSource` record. They are the primary features for\n", + "real/bogus and star/galaxy classification (Tracks 3 and 4)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cell-10", + "metadata": {}, + "outputs": [], + "source": [ + "psf_path = os.path.join(DATA_ROOT, EXAMPLE_JID, 'diffimage_masked_psfcat.parquet')\n", + "psf_df = pd.read_parquet(psf_path)\n", + "print(f'PSF-fit catalog for {EXAMPLE_JID}: {len(psf_df)} sources')\n", + "print(f'Columns: {list(psf_df.columns)}')\n", + "\n", + "# Show how matching works\n", + "from scipy.spatial import cKDTree\n", + "psf_xy = np.column_stack([psf_df['x_fit'].values, psf_df['y_fit'].values])\n", + "psf_tree = cKDTree(psf_xy)\n", + "\n", + "# Match first SExtractor source\n", + "sx, sy = sex_df.iloc[0]['XWIN_IMAGE'], sex_df.iloc[0]['YWIN_IMAGE']\n", + "dist, idx = psf_tree.query([sx, sy], distance_upper_bound=5.0)\n", + "if idx < len(psf_df):\n", + " match = psf_df.iloc[idx]\n", + " print(f'\\nSExtractor source at ({sx:.1f}, {sy:.1f}) matched to PSF source at '\n", + " f'({match[\"x_fit\"]:.1f}, {match[\"y_fit\"]:.1f}), dist={dist:.2f} px')\n", + " print(f' sharpness={match[\"sharpness\"]:.3f} roundness1={match[\"roundness1\"]:.3f} '\n", + " f'peak={match[\"peak\"]:.3f} redchi={match[\"redchi\"]:.3f}')" + ] + }, + { + "cell_type": "markdown", + "id": "cell-11", + "metadata": {}, + "source": [ + "## 5. Open Universe Truth Catalog\n", + "\n", + "The OU2024 simulation provides a truth catalog for each exposure:\n", + "`Roman_TDS_index_{FILTER}_{pointing}_{SCA}.txt`\n", + "\n", + "Columns: `object_id, ra, dec, x, y, realized_flux, flux, mag, obj_type`\n", + "\n", + "- `realized_flux` is in DN (total counts, includes noise realization)\n", + "- `flux` is the ideal model flux in DN\n", + "- `mag` has BANDZPT already applied: `mag = -2.5 * log10(flux) + BANDZPT`\n", + "- `obj_type`: `galaxy`, `star`, `transient`\n", + "\n", + "The alert generator cross-matches each SExtractor detection to the nearest\n", + "truth source within 3 pixels. Matched sources get an `obj_type` label;\n", + "unmatched detections are artifacts (labeled `None` in the truth sidecar)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cell-12", + "metadata": {}, + "outputs": [], + "source": [ + "truth_files = sorted(glob.glob(os.path.join(DATA_ROOT, EXAMPLE_JID, 'Roman_TDS_index_*.txt')))\n", + "truth_path = truth_files[0]\n", + "print(f'Truth catalog: {os.path.basename(truth_path)}')\n", + "\n", + "truth = pd.read_csv(truth_path, sep=r'\\s+', comment='#',\n", + " names=['object_id', 'ra', 'dec', 'x', 'y', 'realized_flux', 'flux', 'mag', 'obj_type'])\n", + "print(f'{len(truth)} truth sources')\n", + "print(f'\\nobj_type distribution:')\n", + "print(truth['obj_type'].value_counts())\n", + "\n", + "# Show truth → AB magnitude conversion\n", + "band = 'F184' # jid1061 is F184\n", + "truth['mag_AB'] = truth['mag'] + ZPTMAG[band]\n", + "print(f'\\nTruth AB magnitude range (via mag + ZPTMAG[{band}]):')\n", + "for otype in ['galaxy', 'star', 'transient']:\n", + " sub = truth.loc[truth['obj_type'] == otype, 'mag_AB']\n", + " print(f' {otype:12s}: {sub.min():.1f} -- {sub.max():.1f} AB (N={len(sub)})')" + ] + }, + { + "cell_type": "markdown", + "id": "cell-13", + "metadata": {}, + "source": [ + "## 6. Cutout Stamp Extraction\n", + "\n", + "Three full-frame FITS images are loaded per job:\n", + "- `diffimage_masked.fits` — ZOGY difference image\n", + "- `bkg_subbed_science_image.fits` — background-subtracted science image\n", + "- `awaicgen_output_mosaic_image_resampled_gainmatched.fits` — gain-matched template\n", + "\n", + "For each SExtractor detection at pixel (x, y), a 129x129 stamp (±64 pixels)\n", + "is extracted and serialized as raw FITS bytes in the alert packet.\n", + "Sources within 64 pixels of the image edge get no stamps (~6.5% of alerts)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cell-14", + "metadata": {}, + "outputs": [], + "source": [ + "STAMP_SIZE = 64 # half-width; stamp is 2*64+1 = 129 pixels\n", + "\n", + "# Load the three images for one job\n", + "job_dir = os.path.join(DATA_ROOT, EXAMPLE_JID)\n", + "diff_path = os.path.join(job_dir, 'diffimage_masked.fits')\n", + "sci_path = os.path.join(job_dir, 'bkg_subbed_science_image.fits')\n", + "ref_path = os.path.join(job_dir, 'awaicgen_output_mosaic_image_resampled_gainmatched.fits')\n", + "\n", + "for label, path in [('Difference', diff_path), ('Science', sci_path), ('Template', ref_path)]:\n", + " if os.path.exists(path):\n", + " with fits.open(path, memmap=True) as hdul:\n", + " data = hdul[0].data\n", + " bunit = hdul[0].header.get('BUNIT', 'N/A')\n", + " print(f'{label:12s}: {data.shape} BUNIT={bunit} '\n", + " f'median={np.nanmedian(data):.4f} std={np.nanstd(data):.4f}')\n", + " else:\n", + " print(f'{label:12s}: not found (download from S3 first)')\n", + "\n", + "# Demonstrate stamp extraction\n", + "if os.path.exists(diff_path):\n", + " with fits.open(diff_path, memmap=True) as hdul:\n", + " diff_data = hdul[0].data\n", + " xpos = int(sex_df.iloc[10]['XWIN_IMAGE'])\n", + " ypos = int(sex_df.iloc[10]['YWIN_IMAGE'])\n", + " stamp = diff_data[ypos-STAMP_SIZE:ypos+STAMP_SIZE+1,\n", + " xpos-STAMP_SIZE:xpos+STAMP_SIZE+1]\n", + " print(f'\\nStamp at ({xpos}, {ypos}): shape={stamp.shape}')\n", + "\n", + " fig, ax = plt.subplots(figsize=(4, 4))\n", + " vmin, vmax = np.nanpercentile(stamp, [5, 95])\n", + " ax.imshow(stamp, origin='lower', cmap='gray', vmin=vmin, vmax=vmax)\n", + " ax.plot(STAMP_SIZE, STAMP_SIZE, 'c+', ms=10, mew=1)\n", + " ax.set_title(f'Diff stamp at ({xpos}, {ypos})')\n", + " plt.tight_layout()\n", + " plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "cell-15", + "metadata": {}, + "source": [ + "## 7. Light Curve Tiles (HATS Catalog)\n", + "\n", + "Historical detections of each sky object are stored in a HEALPix-partitioned\n", + "parquet catalog (HATS format) on S3. The alert generator:\n", + "\n", + "1. Determines which HEALPix tile covers the job's sky position (tries Norder 4, 5, 6)\n", + "2. Downloads the tile parquet file (~50-65 MB each)\n", + "3. Builds a 3D unit-vector cKDTree on the tile's (RA, Dec) positions\n", + "4. For each SExtractor detection, finds the nearest catalog match within 1 arcsec\n", + "5. Extracts the full multi-epoch light curve from the matched row's `nested_lc_data`\n", + "\n", + "The light curve data includes per-epoch: `expid`, `mjdobs`, `fid` (filter ID),\n", + "`fluxfit` (DN/s), `fluxerr`, `sca`, `sid` (source ID).\n", + "\n", + "This becomes `prvDiaSources` in the alert — but **only epochs before the current\n", + "detection** are included (no future data leakage)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cell-16", + "metadata": {}, + "outputs": [], + "source": [ + "# Show a light curve tile structure\n", + "lc_tiles = sorted(glob.glob('../data/lc_tiles/*.parquet'))\n", + "if lc_tiles:\n", + " tile_path = lc_tiles[0]\n", + " lc_df = pd.read_parquet(tile_path)\n", + " print(f'LC tile: {os.path.basename(tile_path)}')\n", + " print(f' {len(lc_df):,} objects')\n", + " print(f' Columns: {list(lc_df.columns)}')\n", + "\n", + " # Show one object's nested light curve data\n", + " row = lc_df.iloc[0]\n", + " nd = row['nested_lc_data']\n", + " print(f'\\n Example object (aid={row[\"aid\"]}):')\n", + " print(f' meanra={row[\"meanra\"]:.5f} meandec={row[\"meandec\"]:.5f} nsources={row[\"nsources\"]}')\n", + " print(f' nested_lc_data keys: {list(nd.keys())}')\n", + " print(f' N epochs: {len(nd[\"mjdobs\"])}')\n", + "\n", + " # Filter ID → band mapping\n", + " FID_TO_FILTER = {1: 'F184', 2: 'F158', 3: 'F129', 4: 'F213',\n", + " 5: 'F062', 6: 'F106', 7: 'F087'}\n", + " from collections import Counter\n", + " fid_counts = Counter(int(f) for f in nd['fid'])\n", + " print(f' Epochs per filter: {dict((FID_TO_FILTER.get(k,k), v) for k,v in fid_counts.items())}')\n", + "else:\n", + " print('No LC tiles found in ../data/lc_tiles/ — download from S3 to explore.')" + ] + }, + { + "cell_type": "markdown", + "id": "cell-17", + "metadata": {}, + "source": [ + "## 8. Avro Schema\n", + "\n", + "Alerts are serialized in [Apache Avro](https://avro.apache.org/) format using\n", + "a 6-file schema under the `rapid.v01_00` namespace:\n", + "\n", + "| File | Record | Fields |\n", + "|------|--------|--------|\n", + "| `rapid.v01_00.diaSource.avsc` | Detection record | 63 fields (position, flux, shape, flags) |\n", + "| `rapid.v01_00.diaObject.avsc` | Persistent object | 49 fields (per-filter flux stats) |\n", + "| `rapid.v01_00.alert.avsc` | Top-level wrapper | 11 fields (source, object, history, cutouts) |\n", + "| `rapid.v01_00.diaForcedSource.avsc` | Forced photometry | Stub (not populated) |\n", + "| `rapid.v01_00.ssSource.avsc` | Solar system | Stub (not populated) |\n", + "| `rapid.v01_00.mpc_orbits.avsc` | MPC orbits | Stub (not populated) |\n", + "\n", + "The schema is LSST-compatible by design — field names match Rubin Observatory conventions\n", + "(`diaSource`, `diaObject`, `prvDiaSources`, `psfFlux`, `band`, `midpointMjdTai`)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cell-18", + "metadata": {}, + "outputs": [], + "source": "# Show the top-level alert schema\nschema_dir = '../schema/01/00'\nalert_schema_path = os.path.join(schema_dir, 'rapid.v01_00.alert.avsc')\nif os.path.exists(alert_schema_path):\n with open(alert_schema_path) as f:\n alert_schema = json.load(f)\n print(f'Schema: {alert_schema[\"namespace\"]}.{alert_schema[\"name\"]} v{alert_schema[\"version\"]}')\n print(f'\\nTop-level fields:')\n for field in alert_schema['fields']:\n ftype = field['type']\n if isinstance(ftype, list):\n ftype = ' | '.join(str(t) if isinstance(t, str) else t.get('type', str(t)) for t in ftype)\n elif isinstance(ftype, dict):\n ftype = ftype.get('type', str(ftype))\n print(f' {field[\"name\"]:25s} {str(ftype):30s} {field.get(\"doc\", \"\")}')\nelse:\n print(f'Schema not found at {schema_dir}')" + }, + { + "cell_type": "markdown", + "id": "cell-19", + "metadata": {}, + "source": [ + "## 9. Alert Assembly — Putting It All Together\n", + "\n", + "For each SExtractor detection, the alert generator:\n", + "\n", + "1. **Reads SExtractor row** → position, raw flux, flags, CLASS_STAR\n", + "2. **Matches PSF-fit catalog** (within 5 px) → sharpness, roundness, peak, qfit, redchi\n", + "3. **Computes calibrated flux**: `mag_AB = MAG_SE + ZP_eff`, then `nJy = 3.631e12 * 10^(-mag/2.5)`\n", + "4. **Matches truth catalog** (within 3 px) → obj_type, truth_mag (written to sidecar, not alert)\n", + "5. **Matches light curve tile** (within 1 arcsec on sky) → builds `prvDiaSources` and `diaObject`\n", + "6. **Extracts stamps** (±64 px) from difference, science, and template images\n", + "7. **Computes HEALPix** indices (hp6, hp9) from RA/Dec\n", + "8. **Serializes to Avro** and writes to the output file\n", + "\n", + "Key temporal rule for `prvDiaSources`: only epochs with `mjdobs < current_mjd`\n", + "and `expid != current_expid` are included — no future data leakage." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cell-20", + "metadata": {}, + "outputs": [], + "source": [ + "# Verify the generated alerts: spot-check one\n", + "with open(f'../output/{EXAMPLE_JID}_alerts.avro', 'rb') as f:\n", + " reader = fastavro.reader(f)\n", + " schema = reader.writer_schema\n", + " alerts = list(reader)\n", + "\n", + "print(f'{len(alerts)} alerts from {EXAMPLE_JID}')\n", + "\n", + "# Find an alert with all components populated\n", + "rich = next((a for a in alerts\n", + " if a['prvDiaSources'] and a['diaObject']\n", + " and a['cutoutDifference']), None)\n", + "if rich:\n", + " src = rich['diaSource']\n", + " obj = rich['diaObject']\n", + " prv = rich['prvDiaSources']\n", + " flux = src['psfFlux']\n", + " mag = -2.5 * math.log10(flux) + 31.4 if flux and flux > 0 else None\n", + "\n", + " print(f'\\nExample fully-populated alert:')\n", + " print(f' diaSourceId: {rich[\"diaSourceId\"]}')\n", + " print(f' band: {src[\"band\"]}')\n", + " print(f' psfFlux: {flux:.1f} nJy ({mag:.1f} AB)' if mag else f' psfFlux: None')\n", + " print(f' SNR: {src[\"snr\"]:.1f}')\n", + " print(f' sharpness: {src[\"sharpness\"]}')\n", + " print(f' diaObject: {obj[\"nDiaSources\"]} historical detections')\n", + " print(f' prvDiaSources: {len(prv)} prior epochs')\n", + " print(f' cutouts: diff={rich[\"cutoutDifference\"] is not None} '\n", + " f'sci={rich[\"cutoutScience\"] is not None} '\n", + " f'tpl={rich[\"cutoutTemplate\"] is not None}')" + ] + }, + { + "cell_type": "markdown", + "id": "cell-21", + "metadata": {}, + "source": [ + "## 10. Dataset Summary\n", + "\n", + "| Property | Value |\n", + "|----------|-------|\n", + "| Pipeline run | 20260227 |\n", + "| Simulation | Open Universe 2024 Roman TDS |\n", + "| Jobs | 15 (5 F184 + 10 F158) |\n", + "| Total alerts | 38,241 |\n", + "| Real (truth-matched) | 13,884 (36.3%) |\n", + "| Bogus (artifacts) | 24,357 (63.7%) |\n", + "| With light curves | ~57% |\n", + "| With cutout stamps | ~93.4% |\n", + "| Stamp size | 129 x 129 px (0.11 arcsec/px) |\n", + "| MJD range | 62022 -- 62726 (~2 years) |\n", + "| Schema | rapid.v01_00 (LSST-compatible) |\n", + "| Reference images | Gain-matched coadd templates |\n", + "| Magnitude range (diff) | ~17 -- 31 AB |" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/alerts/roman_rapid_alerts/read_sample.py b/alerts/roman_rapid_alerts/read_sample.py new file mode 100644 index 00000000..53c9fb4a --- /dev/null +++ b/alerts/roman_rapid_alerts/read_sample.py @@ -0,0 +1,171 @@ +#!/usr/bin/env python3 +""" +Read and display sample RAPID alert packets. + +Usage: + python read_sample.py # read sample/sample_alerts.avro + python read_sample.py output/jid1061_alerts.avro # read any .avro file + python read_sample.py --stamps # also display cutout stamps +""" + +import argparse +import io +import math +import os +import sys + +import fastavro +import numpy as np + +SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) +DEFAULT_PATH = os.path.join(SCRIPT_DIR, 'sample', 'sample_alerts.avro') + + +def parse_args(): + p = argparse.ArgumentParser(description='Read and display RAPID alert packets') + p.add_argument('avro_file', nargs='?', default=DEFAULT_PATH, + help='Path to .avro alert file (default: sample/sample_alerts.avro)') + p.add_argument('--stamps', action='store_true', + help='Display cutout stamps using matplotlib') + p.add_argument('-n', '--max-alerts', type=int, default=None, + help='Maximum number of alerts to display') + return p.parse_args() + + +def flux_to_mag(flux_njy): + """Convert nanojansky to AB magnitude.""" + if flux_njy is None or flux_njy <= 0: + return None + return -2.5 * math.log10(flux_njy) + 31.4 + + +def show_stamps(alert): + """Display cutout stamps for one alert.""" + from astropy.io import fits as afits + import matplotlib.pyplot as plt + + labels = ['Difference', 'Science', 'Template'] + keys = ['cutoutDifference', 'cutoutScience', 'cutoutTemplate'] + + stamps = [] + for key in keys: + raw = alert.get(key) + if raw is not None: + hdul = afits.open(io.BytesIO(raw)) + stamps.append(hdul[0].data) + else: + stamps.append(None) + + n_valid = sum(s is not None for s in stamps) + if n_valid == 0: + print(' (no cutout stamps)') + return + + fig, axes = plt.subplots(1, 3, figsize=(12, 4)) + for ax, stamp, label in zip(axes, stamps, labels): + if stamp is not None: + vmin, vmax = np.nanpercentile(stamp, [5, 95]) + ax.imshow(stamp, origin='lower', cmap='gray', vmin=vmin, vmax=vmax) + cx, cy = stamp.shape[1] // 2, stamp.shape[0] // 2 + ax.plot(cx, cy, 'c+', ms=8, mew=1) + else: + ax.text(0.5, 0.5, 'N/A', ha='center', va='center', transform=ax.transAxes) + ax.set_title(label) + src = alert['diaSource'] + fig.suptitle(f'diaSourceId={alert["diaSourceId"]} band={src["band"]}') + plt.tight_layout() + plt.show() + + +def print_alert(alert, index, show_cutouts=False): + """Print a summary of one alert.""" + src = alert['diaSource'] + obj = alert.get('diaObject') + prv = alert.get('prvDiaSources') + + flux = src.get('psfFlux') + mag = flux_to_mag(flux) + mag_str = f'{mag:.1f} AB' if mag is not None else 'N/A' + flux_str = f'{flux:.1f} nJy' if flux is not None else 'N/A' + + print(f'\n--- Alert {index} ---') + print(f' diaSourceId: {alert["diaSourceId"]}') + print(f' band: {src["band"]}') + print(f' RA, Dec: {src["ra"]:.6f}, {src["dec"]:.6f}') + print(f' MJD: {src["midpointMjdTai"]}') + print(f' psfFlux: {flux_str} ({mag_str})') + print(f' SNR: {src.get("snr", "N/A")}') + print(f' visit: {src["visit"]} detector: {src["detector"]}') + + # PSF-fit quality + sharp = src.get('sharpness') + if sharp is not None: + print(f' sharpness: {sharp:.3f} ' + f'roundness1: {src.get("roundness1", "N/A")} ' + f'peak: {src.get("peak", "N/A")}') + + # diaObject + if obj: + print(f' diaObject: id={obj["diaObjectId"]} ' + f'nDiaSources={obj["nDiaSources"]} ' + f'MJD range: {obj.get("firstDiaSourceMjdTai", "?")} -- ' + f'{obj.get("lastDiaSourceMjdTai", "?")}') + else: + print(f' diaObject: None') + + # prvDiaSources + if prv: + bands = set(p['band'] for p in prv) + print(f' prvDiaSources: {len(prv)} epochs bands: {", ".join(sorted(bands))}') + else: + print(f' prvDiaSources: None') + + # Cutouts + has_diff = alert.get('cutoutDifference') is not None + has_sci = alert.get('cutoutScience') is not None + has_tpl = alert.get('cutoutTemplate') is not None + print(f' cutouts: diff={has_diff} sci={has_sci} tpl={has_tpl}') + + if show_cutouts: + show_stamps(alert) + + +def main(): + args = parse_args() + + if not os.path.exists(args.avro_file): + print(f'Error: file not found: {args.avro_file}') + sys.exit(1) + + with open(args.avro_file, 'rb') as f: + reader = fastavro.reader(f) + schema = reader.writer_schema + alerts = list(reader) + + print(f'File: {args.avro_file}') + schema_name = schema.get('name', 'unknown') + if schema.get('namespace'): + schema_name = f'{schema["namespace"]}.{schema_name}' + print(f'Schema: {schema_name}') + print(f'Total alerts: {len(alerts)}') + + # Summary statistics + n_with_obj = sum(1 for a in alerts if a.get('diaObject')) + n_with_prv = sum(1 for a in alerts if a.get('prvDiaSources')) + n_with_stamp = sum(1 for a in alerts if a.get('cutoutDifference')) + bands = set(a['diaSource']['band'] for a in alerts) + print(f'With diaObject: {n_with_obj}/{len(alerts)}') + print(f'With prvDiaSources: {n_with_prv}/{len(alerts)}') + print(f'With cutouts: {n_with_stamp}/{len(alerts)}') + print(f'Bands: {", ".join(sorted(bands))}') + + limit = args.max_alerts or len(alerts) + for i, alert in enumerate(alerts[:limit]): + print_alert(alert, i, show_cutouts=args.stamps) + + if limit < len(alerts): + print(f'\n... ({len(alerts) - limit} more alerts not shown)') + + +if __name__ == '__main__': + main() diff --git a/alerts/roman_rapid_alerts/requirements.txt b/alerts/roman_rapid_alerts/requirements.txt new file mode 100644 index 00000000..afbde861 --- /dev/null +++ b/alerts/roman_rapid_alerts/requirements.txt @@ -0,0 +1,8 @@ +fastavro +numpy +pandas +astropy +astropy-healpix +scipy +healpy +matplotlib diff --git a/alerts/roman_rapid_alerts/sample/sample_alerts.avro b/alerts/roman_rapid_alerts/sample/sample_alerts.avro new file mode 100644 index 00000000..d22b6680 --- /dev/null +++ b/alerts/roman_rapid_alerts/sample/sample_alerts.avro @@ -0,0 +1,3942 @@ +Objavro.codecnullavro.schema{"version": "01.00", "type": "record", "doc": "RAPID alert schema: top-level alert record (LSST-compatible)", "name": "rapid.v01_00.alert", "fields": [{"doc": "Identifier for the triggering diaSource", "name": "diaSourceId", "type": "long"}, {"doc": "Reason for observation (e.g. survey, ToO)", "default": null, "name": "observation_reason", "type": ["null", "string"]}, {"doc": "Target name if targeted observation", "default": null, "name": "target_name", "type": ["null", "string"]}, {"doc": "Triggering source detection", "name": "diaSource", "type": {"version": "01.00", "type": "record", "doc": "RAPID alert schema: individual source detection on a difference image", "name": "rapid.v01_00.diaSource", "fields": [{"doc": "Unique identifier for this source detection", "name": "diaSourceId", "type": "long"}, {"doc": "Visit (exposure) identifier", "name": "visit", "type": "long"}, {"doc": "Detector (SCA) number", "name": "detector", "type": "int"}, {"doc": "Associated diaObject identifier", "default": null, "name": "diaObjectId", "type": ["null", "long"]}, {"doc": "Associated solar system object identifier (stub)", "default": null, "name": "ssObjectId", "type": ["null", "long"]}, {"doc": "Parent diaSource if deblended (stub)", "default": null, "name": "parentDiaSourceId", "type": ["null", "long"]}, {"doc": "Effective mid-observation time [TAI MJD]", "name": "midpointMjdTai", "type": "double"}, {"doc": "Right ascension; ICRS [deg]", "name": "ra", "type": "double"}, {"doc": "Declination; ICRS [deg]", "name": "dec", "type": "double"}, {"doc": "Uncertainty in ra [deg]", "default": null, "name": "raErr", "type": ["null", "float"]}, {"doc": "Uncertainty in dec [deg]", "default": null, "name": "decErr", "type": ["null", "float"]}, {"doc": "x-pixel position on detector [pixels]", "name": "x", "type": "float"}, {"doc": "y-pixel position on detector [pixels]", "name": "y", "type": "float"}, {"doc": "Uncertainty in x [pixels]", "default": null, "name": "xErr", "type": ["null", "float"]}, {"doc": "Uncertainty in y [pixels]", "default": null, "name": "yErr", "type": ["null", "float"]}, {"doc": "Filter band name (F062, F087, F106, F129, F146, F158, F184, F213)", "default": null, "name": "band", "type": ["null", "string"]}, {"doc": "Flux from PSF-fit on difference image [nJy]", "default": null, "name": "psfFlux", "type": ["null", "float"]}, {"doc": "Uncertainty in psfFlux [nJy]", "default": null, "name": "psfFluxErr", "type": ["null", "float"]}, {"doc": "Signal-to-noise ratio (psfFlux / psfFluxErr)", "default": null, "name": "snr", "type": ["null", "float"]}, {"doc": "Probability of being extended (stub)", "default": null, "name": "extendedness", "type": ["null", "float"]}, {"doc": "Reliability score (stub)", "default": null, "name": "reliability", "type": ["null", "float"]}, {"doc": "Bitmask of processing flags", "name": "flags", "type": "long"}, {"doc": "Aperture flux on difference image (stub) [nJy]", "default": null, "name": "apFlux", "type": ["null", "float"]}, {"doc": "Uncertainty in apFlux (stub) [nJy]", "default": null, "name": "apFluxErr", "type": ["null", "float"]}, {"doc": "Trail-fit flux (stub) [nJy]", "default": null, "name": "trailFlux", "type": ["null", "float"]}, {"doc": "Uncertainty in trailFlux (stub) [nJy]", "default": null, "name": "trailFluxErr", "type": ["null", "float"]}, {"doc": "Trail length (stub) [arcsec]", "default": null, "name": "trailLength", "type": ["null", "float"]}, {"doc": "Trail angle (stub) [deg]", "default": null, "name": "trailAngle", "type": ["null", "float"]}, {"doc": "Forced PSF flux on science image (stub) [nJy]", "default": null, "name": "scienceFlux", "type": ["null", "float"]}, {"doc": "Uncertainty in scienceFlux (stub) [nJy]", "default": null, "name": "scienceFluxErr", "type": ["null", "float"]}, {"doc": "Forced PSF flux on template image (stub) [nJy]", "default": null, "name": "templateFlux", "type": ["null", "float"]}, {"doc": "Uncertainty in templateFlux (stub) [nJy]", "default": null, "name": "templateFluxErr", "type": ["null", "float"]}, {"doc": "Dipole mean flux (stub) [nJy]", "default": null, "name": "dipoleMeanFlux", "type": ["null", "float"]}, {"doc": "Uncertainty in dipoleMeanFlux (stub) [nJy]", "default": null, "name": "dipoleFluxErr", "type": ["null", "float"]}, {"doc": "Dipole separation (stub) [arcsec]", "default": null, "name": "dipoleLength", "type": ["null", "float"]}, {"doc": "Dipole orientation (stub) [deg]", "default": null, "name": "dipoleAngle", "type": ["null", "float"]}, {"doc": "Adaptive second moment Ixx (stub) [arcsec^2]", "default": null, "name": "ixx", "type": ["null", "float"]}, {"doc": "Adaptive second moment Iyy (stub) [arcsec^2]", "default": null, "name": "iyy", "type": ["null", "float"]}, {"doc": "Adaptive second moment Ixy (stub) [arcsec^2]", "default": null, "name": "ixy", "type": ["null", "float"]}, {"doc": "Uncertainty in ixx (stub) [arcsec^2]", "default": null, "name": "ixxErr", "type": ["null", "float"]}, {"doc": "Uncertainty in iyy (stub) [arcsec^2]", "default": null, "name": "iyyErr", "type": ["null", "float"]}, {"doc": "Uncertainty in ixy (stub) [arcsec^2]", "default": null, "name": "ixyErr", "type": ["null", "float"]}, {"doc": "Source has saturated pixels (stub)", "default": null, "name": "pixelFlags_saturated", "type": ["null", "boolean"]}, {"doc": "Source has bad pixels (stub)", "default": null, "name": "pixelFlags_bad", "type": ["null", "boolean"]}, {"doc": "Source is near detector edge (stub)", "default": null, "name": "pixelFlags_edge", "type": ["null", "boolean"]}, {"doc": "Source has cosmic ray pixels (stub)", "default": null, "name": "pixelFlags_cr", "type": ["null", "boolean"]}, {"doc": "Time alert was processed [TAI MJD]", "default": null, "name": "timeProcessedMjdTai", "type": ["null", "double"]}, {"doc": "Time alert was withdrawn [TAI MJD]", "default": null, "name": "timeWithdrawnMjdTai", "type": ["null", "double"]}, {"doc": "Roman SCA detector number", "name": "sca", "type": "int"}, {"doc": "Roman field identifier", "name": "field", "type": "int"}, {"doc": "HEALPix index at nside=64 (order 6)", "name": "hp6", "type": "int"}, {"doc": "HEALPix index at nside=512 (order 9)", "name": "hp9", "type": "int"}, {"doc": "Processing ID for science image", "name": "pid", "type": "long"}, {"doc": "Exposure identifier", "name": "expid", "type": "int"}, {"doc": "true if source is from positive (sci minus ref) subtraction", "name": "isdiffpos", "type": "boolean"}, {"doc": "PSF-fit quality parameter", "default": null, "name": "qfit", "type": ["null", "float"]}, {"doc": "PSF-fit chi parameter", "default": null, "name": "cfit", "type": ["null", "float"]}, {"doc": "Reduced chi-square of PSF fit", "default": null, "name": "redchi", "type": ["null", "float"]}, {"doc": "Number of pixels used in PSF fit", "default": null, "name": "npixfit", "type": ["null", "int"]}, {"doc": "PSF-fit sharpness parameter", "default": null, "name": "sharpness", "type": ["null", "float"]}, {"doc": "PSF-fit roundness parameter 1", "default": null, "name": "roundness1", "type": ["null", "float"]}, {"doc": "PSF-fit roundness parameter 2", "default": null, "name": "roundness2", "type": ["null", "float"]}, {"doc": "Peak pixel value in source stamp [DN]", "default": null, "name": "peak", "type": ["null", "float"]}]}}, {"doc": "Previous detections of the same object within 12 months", "default": null, "name": "prvDiaSources", "type": ["null", {"type": "array", "items": "rapid.v01_00.diaSource"}]}, {"doc": "Forced photometry history at the object position", "default": null, "name": "prvDiaForcedSources", "type": ["null", {"type": "array", "items": {"version": "01.00", "type": "record", "doc": "RAPID alert schema: forced photometry measurement at a diaObject position", "name": "rapid.v01_00.diaForcedSource", "fields": [{"doc": "Unique identifier for this forced source measurement", "name": "diaForcedSourceId", "type": "long"}, {"doc": "Associated diaObject identifier", "name": "diaObjectId", "type": "long"}, {"doc": "Visit (exposure) identifier", "name": "visit", "type": "long"}, {"doc": "Detector (SCA) number", "name": "detector", "type": "int"}, {"doc": "Right ascension of forced measurement position; ICRS [deg]", "name": "ra", "type": "double"}, {"doc": "Declination of forced measurement position; ICRS [deg]", "name": "dec", "type": "double"}, {"doc": "Filter band name", "default": null, "name": "band", "type": ["null", "string"]}, {"doc": "Forced PSF flux on difference image [nJy]", "default": null, "name": "psfFlux", "type": ["null", "float"]}, {"doc": "Uncertainty in psfFlux [nJy]", "default": null, "name": "psfFluxErr", "type": ["null", "float"]}, {"doc": "Forced PSF flux on science image (stub) [nJy]", "default": null, "name": "scienceFlux", "type": ["null", "float"]}, {"doc": "Uncertainty in scienceFlux (stub) [nJy]", "default": null, "name": "scienceFluxErr", "type": ["null", "float"]}, {"doc": "Effective mid-observation time [TAI MJD]", "name": "midpointMjdTai", "type": "double"}, {"doc": "Time measurement was processed [TAI MJD]", "name": "timeProcessedMjdTai", "type": "double"}, {"doc": "Time measurement was withdrawn [TAI MJD]", "default": null, "name": "timeWithdrawnMjdTai", "type": ["null", "double"]}]}}]}, {"doc": "Summary object record", "default": null, "name": "diaObject", "type": ["null", {"version": "01.00", "type": "record", "doc": "RAPID alert schema: astronomical object derived from DIASources", "name": "rapid.v01_00.diaObject", "fields": [{"doc": "Unique identifier for this object", "name": "diaObjectId", "type": "long"}, {"doc": "Right ascension of object centroid; ICRS [deg]", "name": "ra", "type": "double"}, {"doc": "Declination of object centroid; ICRS [deg]", "name": "dec", "type": "double"}, {"doc": "Uncertainty in ra [deg]", "default": null, "name": "raErr", "type": ["null", "float"]}, {"doc": "Uncertainty in dec [deg]", "default": null, "name": "decErr", "type": ["null", "float"]}, {"doc": "Total number of associated DIASources", "name": "nDiaSources", "type": "int"}, {"doc": "MJD of earliest associated diaSource [TAI MJD]", "default": null, "name": "firstDiaSourceMjdTai", "type": ["null", "double"]}, {"doc": "MJD of latest associated diaSource [TAI MJD]", "default": null, "name": "lastDiaSourceMjdTai", "type": ["null", "double"]}, {"doc": "Start of validity interval for this object summary [TAI MJD]", "name": "validityStartMjdTai", "type": "double"}, {"doc": "Mean PSF flux in F062 [nJy]", "default": null, "name": "F062PsfFluxMean", "type": ["null", "float"]}, {"doc": "Std dev of PSF flux in F062 [nJy]", "default": null, "name": "F062PsfFluxSigma", "type": ["null", "float"]}, {"doc": "Number of F062 measurements", "default": null, "name": "F062PsfFluxNdata", "type": ["null", "int"]}, {"doc": "Minimum PSF flux in F062 [nJy]", "default": null, "name": "F062PsfFluxMin", "type": ["null", "float"]}, {"doc": "Maximum PSF flux in F062 [nJy]", "default": null, "name": "F062PsfFluxMax", "type": ["null", "float"]}, {"doc": "Mean PSF flux in F087 [nJy]", "default": null, "name": "F087PsfFluxMean", "type": ["null", "float"]}, {"doc": "Std dev of PSF flux in F087 [nJy]", "default": null, "name": "F087PsfFluxSigma", "type": ["null", "float"]}, {"doc": "Number of F087 measurements", "default": null, "name": "F087PsfFluxNdata", "type": ["null", "int"]}, {"doc": "Minimum PSF flux in F087 [nJy]", "default": null, "name": "F087PsfFluxMin", "type": ["null", "float"]}, {"doc": "Maximum PSF flux in F087 [nJy]", "default": null, "name": "F087PsfFluxMax", "type": ["null", "float"]}, {"doc": "Mean PSF flux in F106 [nJy]", "default": null, "name": "F106PsfFluxMean", "type": ["null", "float"]}, {"doc": "Std dev of PSF flux in F106 [nJy]", "default": null, "name": "F106PsfFluxSigma", "type": ["null", "float"]}, {"doc": "Number of F106 measurements", "default": null, "name": "F106PsfFluxNdata", "type": ["null", "int"]}, {"doc": "Minimum PSF flux in F106 [nJy]", "default": null, "name": "F106PsfFluxMin", "type": ["null", "float"]}, {"doc": "Maximum PSF flux in F106 [nJy]", "default": null, "name": "F106PsfFluxMax", "type": ["null", "float"]}, {"doc": "Mean PSF flux in F129 [nJy]", "default": null, "name": "F129PsfFluxMean", "type": ["null", "float"]}, {"doc": "Std dev of PSF flux in F129 [nJy]", "default": null, "name": "F129PsfFluxSigma", "type": ["null", "float"]}, {"doc": "Number of F129 measurements", "default": null, "name": "F129PsfFluxNdata", "type": ["null", "int"]}, {"doc": "Minimum PSF flux in F129 [nJy]", "default": null, "name": "F129PsfFluxMin", "type": ["null", "float"]}, {"doc": "Maximum PSF flux in F129 [nJy]", "default": null, "name": "F129PsfFluxMax", "type": ["null", "float"]}, {"doc": "Mean PSF flux in F146 [nJy]", "default": null, "name": "F146PsfFluxMean", "type": ["null", "float"]}, {"doc": "Std dev of PSF flux in F146 [nJy]", "default": null, "name": "F146PsfFluxSigma", "type": ["null", "float"]}, {"doc": "Number of F146 measurements", "default": null, "name": "F146PsfFluxNdata", "type": ["null", "int"]}, {"doc": "Minimum PSF flux in F146 [nJy]", "default": null, "name": "F146PsfFluxMin", "type": ["null", "float"]}, {"doc": "Maximum PSF flux in F146 [nJy]", "default": null, "name": "F146PsfFluxMax", "type": ["null", "float"]}, {"doc": "Mean PSF flux in F158 [nJy]", "default": null, "name": "F158PsfFluxMean", "type": ["null", "float"]}, {"doc": "Std dev of PSF flux in F158 [nJy]", "default": null, "name": "F158PsfFluxSigma", "type": ["null", "float"]}, {"doc": "Number of F158 measurements", "default": null, "name": "F158PsfFluxNdata", "type": ["null", "int"]}, {"doc": "Minimum PSF flux in F158 [nJy]", "default": null, "name": "F158PsfFluxMin", "type": ["null", "float"]}, {"doc": "Maximum PSF flux in F158 [nJy]", "default": null, "name": "F158PsfFluxMax", "type": ["null", "float"]}, {"doc": "Mean PSF flux in F184 [nJy]", "default": null, "name": "F184PsfFluxMean", "type": ["null", "float"]}, {"doc": "Std dev of PSF flux in F184 [nJy]", "default": null, "name": "F184PsfFluxSigma", "type": ["null", "float"]}, {"doc": "Number of F184 measurements", "default": null, "name": "F184PsfFluxNdata", "type": ["null", "int"]}, {"doc": "Minimum PSF flux in F184 [nJy]", "default": null, "name": "F184PsfFluxMin", "type": ["null", "float"]}, {"doc": "Maximum PSF flux in F184 [nJy]", "default": null, "name": "F184PsfFluxMax", "type": ["null", "float"]}, {"doc": "Mean PSF flux in F213 [nJy]", "default": null, "name": "F213PsfFluxMean", "type": ["null", "float"]}, {"doc": "Std dev of PSF flux in F213 [nJy]", "default": null, "name": "F213PsfFluxSigma", "type": ["null", "float"]}, {"doc": "Number of F213 measurements", "default": null, "name": "F213PsfFluxNdata", "type": ["null", "int"]}, {"doc": "Minimum PSF flux in F213 [nJy]", "default": null, "name": "F213PsfFluxMin", "type": ["null", "float"]}, {"doc": "Maximum PSF flux in F213 [nJy]", "default": null, "name": "F213PsfFluxMax", "type": ["null", "float"]}]}]}, {"doc": "Solar system source association (stub)", "default": null, "name": "ssSource", "type": ["null", {"version": "01.00", "type": "record", "doc": "RAPID alert schema: solar system source association (stub)", "name": "rapid.v01_00.ssSource", "fields": [{"doc": "Unique identifier for this solar system source", "name": "ssSourceId", "type": "long"}, {"doc": "Associated diaSource identifier", "name": "diaSourceId", "type": "long"}, {"doc": "Associated solar system object identifier", "default": null, "name": "ssObjectId", "type": ["null", "long"]}, {"doc": "Heliocentric x position [AU]", "default": null, "name": "heliocentricX", "type": ["null", "double"]}, {"doc": "Heliocentric y position [AU]", "default": null, "name": "heliocentricY", "type": ["null", "double"]}, {"doc": "Heliocentric z position [AU]", "default": null, "name": "heliocentricZ", "type": ["null", "double"]}, {"doc": "Phase angle [deg]", "default": null, "name": "phaseAngle", "type": ["null", "float"]}, {"doc": "Heliocentric distance [AU]", "default": null, "name": "heliocentricDist", "type": ["null", "float"]}, {"doc": "Topocentric distance [AU]", "default": null, "name": "topocentricDist", "type": ["null", "float"]}]}]}, {"doc": "MPC orbital elements (stub)", "default": null, "name": "mpc_orbits", "type": ["null", {"version": "01.00", "type": "record", "doc": "RAPID alert schema: MPC orbital elements (stub)", "name": "rapid.v01_00.mpc_orbits", "fields": [{"doc": "MPC designation or packed designation", "name": "id", "type": "string"}, {"doc": "Semi-major axis [AU]", "default": null, "name": "a", "type": ["null", "double"]}, {"doc": "Eccentricity", "default": null, "name": "e", "type": ["null", "double"]}, {"doc": "Inclination [deg]", "default": null, "name": "incl", "type": ["null", "double"]}, {"doc": "Longitude of ascending node [deg]", "default": null, "name": "Omega", "type": ["null", "double"]}, {"doc": "Argument of perihelion [deg]", "default": null, "name": "omega", "type": ["null", "double"]}, {"doc": "Mean anomaly [deg]", "default": null, "name": "M", "type": ["null", "double"]}, {"doc": "Epoch of orbital elements [MJD]", "default": null, "name": "epoch", "type": ["null", "double"]}, {"doc": "Absolute magnitude [mag]", "default": null, "name": "H", "type": ["null", "float"]}, {"doc": "Slope parameter", "default": null, "name": "G", "type": ["null", "float"]}]}]}, {"doc": "FITS cutout of difference image", "default": null, "name": "cutoutDifference", "type": ["null", "bytes"]}, {"doc": "FITS cutout of science image", "default": null, "name": "cutoutScience", "type": ["null", "bytes"]}, {"doc": "FITS cutout of template image", "default": null, "name": "cutoutTemplate", "type": ["null", "bytes"]}]}:AdYR.kĶGGЕ +`TRH@x>Z"@ޅR E7r5mm5 #E~BF184gDdB#A%?gDS =e<5763ޔЕY?M +Dct?5X?P!>!<?8  +)?F@iZ"@&\T EF087 B^BZV@ ޔ +iZ"@&\T E )?F@I {t@`TRH@ B B BC;@٭C!CssEJWEHCESIMPLE = T / conforms to FITS standard BITPIX = -32 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 129 NAXIS2 = 129 EXTEND = T END =ɨ<9!;<($x1<25ǩ=7OE= 0G<̪`'7|w<Kq`=&=g@ afU;8?<2<Lؽ +%+6<%y!ŭYA;d:<2=*Ի:gljx<ɽas:;]<,w ,u{XL;2&gwr<;O<7wӼ=<;;1* k=}ɼ]<(<߻J<2O:k:*;įhl@<uC<>d?":<GE<\<<'_<|?>;]"<Û=b"F\=O +  +6ej¼]!==7󵷼2s{<Qm:LI:DƼ +!;;մ\h=R{7i<7)p=$ <1h<WG=%|<'c.<緤=72<;pX<* [z<{(ǼGGL2<o;UG)<}C+=9ĿoN<;33;8p7<*D>ѼH\a<hۮ<wO<)Nj<79}ڻDN<׭F˽no0Ey\9< <(P=)gܦ;yiTs<;9<^1;ÿ =i޳_=K9<4;QW@O<7ֽ'8k\o;:w?=D&<=;=@:-< + ;3Vw< h:ZL;D=c<-| <3m +]<<^iӳ\<5F;WۼV;ZL_68*:;ԼĽ,s%.~;syV`=;8C؁;뼿I"ol¼'Z޼N^)f<0;=weͼN4<ڽlqL*'p<<B?;= +Bdn<΄<'P;d{;:{== 4*[<*6FLɹhȼ>M=3/;p=<;tL"/#WY<*<=fAqb <̼?o<ء 缔P0= G;<{ʻ?4 Na 0Ç<;;};*g<;;Pڠ;T0@;&$˻<2y(̼9N=O<ǼB<x;&νr <<%m4=Vp<;w7+&Q6#;Y<=4<) +=h:@} +W<<<AAB(<ֽ(3y=d[<҆;; :آjr)M=<ٻl\GO.L=(!l0Z<π;t<Jܽ G Z:%= D=-t;Lt;xP +»~5꼠;'@5E(:@<;|On^"Zv=g3M;j<q<+`պ`V:0L<{Z*<5WYY;A;=@'<=ж@G=JPUּ = + <.pb ;`=/ۦJ;Y˼[<ʜt)n<':T5=C:^I<ϨKAA=Ǽ(u:0d=*x'Y἗Al;%2;q<:-=W;iw=!;É Ѽ]#5cu<*N;*OF 0=q;Jp;a<|l*0;f$ <σr<=#[="<%;A;=L ; (:=9<N8<0w;[[;y X+MLY=5GVfB:%ռep< ǻ♻ĸE弑,<K<@B<(P<:\J$ky,-^Ol=nɘ< 9Ğk<B;f)d<ؠ!ܹc=$弅ω<Y< +:;L8;H쥼\<3R_=^1qݯ<#>[/Ռ<4i<*9Vn<؏<1<;SK{ A𼭲;Լ:]=F<7yü5^Zmc:r<,=zǻ[84=?Ǫ3;ɉp %P_Ŵ;"N;`=5'缕vŌ<|k0o= : Y=-޼9JP<%(<<~q<5<.Y;ۊ˼| wS!н $<Ⱦ<8D=;<<>;=<5/M"K<\<<%Y=:ŻJ;mmzH"=^=.>8!Z;@谻c:e_<ϼμ=%K$>A>s=k=R5 *<=+7w g;t<I/=M* !9AYռ);%=m;}F8^J[-;.1<{CR`iW<_<;N;.RbE<ȼ8Ȼ/S~)d< y< +;eb]Min<-ν k=P,:z.J;Ek=QZ8;QƽDq±$ ;y<=)<[j,d?!ܽE%MJ"O]=<;>zD;"=T98^'_av3o5<ڭ;Px<W[vE=PE{'9<#f<= ;;,c-#{הhGx<5W,a=1 e+b:=zv<轁.)<%"[<(1Ѿ;+d<&ҼʈzR }L<{E&¼O[<ȼv ,W=Ri=GJ<~YsJf)?#;V FI<<(ȽQ<+&<¼L;U<2&.+c=;(<>ػ$G<ʖu<ͼݽ+\!.K Y; :e$T<Ey<V8;ܘC`]?;:zH-B=" `[c<$68D.^Fȫ< +;7wk</Ӳ=1 +;<뼹$9ɹA!(Ko;r=4s;<<;ؿ:ټnNϼIq]pf <9W:םѷK< =b9'{=ZW<r;*8<,t։kcL<[=iuΈ<|3"="6޽ μ,fYƻ=< +<,<ͻ*̼%]9<ե\ɽ +J;8=DЎv< I{*Ժ<d<Ȳ<H<;il<8Ug@<弯k<˼ޯ#<cM=C%<#<}z'<&hgim9̼AZ%u^L8(N<]<\1 <`~a[i< +hi_< O*<2V<ņ:eH3<^y9t} μb<+Lfļ<1<_;8۾۸ +:,u:>;V<7 eT A<V?=?<;c<]=7; +<< <O; h;==<&߼Ǻ_< ;ɹA 怼6#' ;(<s;/kIV F; [*MFτɼ淸 -5<Q,<*M</R|<Y;gڼ򺁻tc  +VxֻmQ;<<<;)۹<; {=u1ἐzC= +;;U<Ǹϼ:,=Nst< "<TTͽTx:F9Z=zuzd<0;<9<͇0<*ƋӼ" <=G =d /6!B-;@=k<:z#"E!v;Ͳ;jNɼs$<)iܼ<<GG.C]ݝ<;>;wh=D>=<4|N=)u<閟<ݻ\丼v<G +<=w /;;z _< ;:-B;@H:4nS@IjN;ViɼS::v|T>;^;@=M'٘;+nLB;uuc<.T:B;;|3=<;;4Go<55伤(juήý//ma<=;/9<9ܺ7;pD<# e<Օa/*:;Z=v:_Q=df<ޏ<95ulǼ߻.g;os,=%Yp~Kտ@+<1=`;EyBU8#48=n|;{8{ccἁ ! +3 Eg <@P@`;8GH_ +J;S:j=5U <ܖZLrs/g导c>|Ҽg;U=3<-R j5T7*jS⺫%,;ߴ`at;0üFɹfq<݌q̮<<"5: +;W'vKZNVo;sG;D_<м_}]`h;ЛP<`WFWLb༁<|tݱ+KmXY<5j<8F!`;è<C}I_;^!j=!`T;uн g@'l<(3=<~lp +=%E=yn<q<==(ES=BK!y#< <=4 =ý6=p==1?w;?&*=";@᥻;숽sм ;;Jawtr8 31^l(;vͼ1TiO&dG< 9Bq54=Ÿ;zv"<] :_< =-V<#Ҽu6c%L3D9J<7D+ )L*],м鴼om :;üuk<4J;uW<;/̻;M=<$*s׽ K +\= ŸH<6 <,7t=ISZ;=I;+Y={@<-_)==Bm7=[5ͧ< ;5s<8=1q<<k:m0R=%lkzE<&oI2;=8=70k<]|k;ٽw;r@ؼ&;=ϝ< <)=9 ;ܼz&3=м&< :O = +k<4;Rp;v;Ǜp݅8샾):μ#'5 ;T#;T,<4a +L <} &;ּx`-b<"1;Z;N; +M7 +]<ݔ="ۼ4A:xL1<Ͻ<='/=bϻP %JcP<ֺf<)h'd:;P<HH9Q"G8ؼ&<<8Z'<ƪ6xq<J< D<{Լ|ۼ䞪< `=ga޼7w=ǻݜi1:}qn<軹]=<DPq_<=0m 4<4w긬Փ7+A=#Hz; < 7; Ͻl@L<ڼϡpۻrI{<|=%|R";7m ;N奺<¼5\<ƻຜbQ<;<1#.k;=u=<â<=k<{vPg<뀞=b>EIOX;[hHMP$$My7䔼JJ< 3 +mJ;><}'<}$<^-<1<'J,g-S*=|/\&@B-a=5TP< <3ֺsҼn|?oj%M &8=,* |yn<kݼ<ǽkZv6#=-/\$<ݚ<ȼ6d: <3]<MUq<3˔<{13<1=b9Q:sVc<;<9x=0zYdRu~w==UCʻW5:<c`+y8[»`o =u o; k;t[ɧU;Q!ɖhd#=8;;<케x<<HP?p<}@<}<<#[=:$;; ;TN<]C< <=&<(&I{; @6:<%3y%6<"J<><F=?Qc;מ2![XX;=J\D<鏽6/̼b; C?M<4*ӱs݀<ݎ<=;<H;&H<$ļ&c:{v<׼ <$;<;G=u&4횘Z̛q:y<3:=)n3 j<'@l+; P=?OlV!; KE;ez%Y<Vqb<}<2̪<lנ; ,=#P#B<)ռ;<,;*K=Cg<4#P=bX-8dADۼ"fM& :q輤J P<<<;;ԭ=GL=<Ϯ<{= ۗ˼<^(<2;DMҌ'<Ϙ#>፽;Ȃ<{Լ۰|-{@O<"q;Ua<ֽ1ZI%= +<̹  9ɻT<|DU:e"㺜<} ~; ҼȻ = !:TK`=⺣+<V6BcC~cSlJJ<1JR#<oJt)l[7\"Ra;xPF\ָ_Wp=k}AJl<36<-_q@ ;Oz<ɼ&t-S:t,];:&0;Ye;V<>켥2?<|$^?.<ͼI)jF`e<U;?伒<|U\a&m,;37 Q<;A=#6<L; +oDa?7; +MO;<Λ7<> a>^;Oe3Y;OquߐJ$O(<{JX?6=JVV:tٺ ]f;N?׼q);fI;M =UMV:<{<9=e[y"=߻R<<潄 +#;C<|<+n;V< f8u຦(%Y;Rȼ_TԻ =%Z=<3ܼܼE<^ݽd[m suj;\Ҽ<̰Z<< l=c<~Qy<|!'Oyn_wq7<=U=>"=+=P=k=b<=<;q;բ=B(=>QYV&-=ɛ #}>$V=}=;V=oѽ$1<3>=¼TEncͼs><{黼=S&K<{꼮<==5;MC=02;Nɻ㉻3xm>>HQ>>Ld=^=P< Ȧ?=5x<_[c:Ym§@>?%:>j>>7&=X(=b=# <"uɼ;Kn=o=;kQRߪ횽(=;+#< ]7-U߹:<<Ƅ.< z]%< wPF<j<fn<,<؞6<O(-V<"< okP?9=0ro2=F^E=R>vp?@?>S_> +=@*<=pR(;.n<=9<t= KɼE<}y=v=й i(<Τ&/=t˖<׼=<ɽ<8ۼEBZ;z; -X; ==Q`L$<9;׭D>^>?@?V?R?]>==%06= +H;$ovҥ;#׹J<z;ӹNX.5<{<<2~=#AȄ^}<;;gyd\2;ș=0ہ<S\i<3<'U;QN=`>#>N?E?"t>Ԑ>M=k=<5=Ggu=8ع;=#_]8B<˞e9;cK;}<e;@5V=1;jd<2<eDl<[ڼK<}f;$, I"6Ƽ9<<}}x^y[޽:WѤ <ŷ<9>u>}>>>2==`<$;Y>$>z==E=^#Hi; + S=>SS=<=pU=o= S=`=,"A`)C<|Ѽ< U<3<Xx8$<]U+nAP: Z<<ӁWH~<7՜nl=d<-;/ @ #+ȴ:av;4; ;%;TG1 <$^mCӼ nHcz5~M;|[;֞?X~=-=<=b +P>.KDQ>/=c='`J#J=K=s%ڿ<|Hh< <B=b7:ChЭ>|!>J>q>Р=->?;?>c=E~<"=bՐQ<=9ͨ tC=Kr;tJG:}$3ib>[.G>r?]>g>;\=>`;>=b[T(ME˼:w!حJ+$O;O"=,<4C;ۻ6);tC<c<yrAb~+d#K ^۳;s۟ɍ +m< q6㺫ؕ='UefU="|Cq; 7=b=G^; [oKF>E2>T\># =v=G=i)<ӸM̻c* +ld;<1=M<:ySVhvXd >;=9Լ&^<mx0(?8#7< <0<<%;<_vz(< D2<ͼ]M!އ;¤ ==D='ni= a.;V'k==#1dQ;PH =9X=#$<3:<r=9M2|;N<o<{.8c҇z<.;/<2<ϖ%2QfCX <a=K; T]m<=) O; ='%h;C=̽-$<};63=m̼o; +?7}; +< ]%^k[<|q=tGixRfˊ<᫖:o;9 q9=*PI< ~=TDKO;L<01;L6tRɱռCkG=>b;Rx;Qt-<ɼst1<_м8r<4P= oB$/&;\<4z(G:y<3y<6m?0=zl =, h<{;Դce.ڼ/fq[<ƑUǯ*<2 =<<yܽ([ +;Mo-};4K< {޻-i:o9<{G< Z;ϼKMɨ==YR=tй[<{Ѽ۽) (<=2̹ces$<$:6=6?"2;֐;օI;I%<J c@= f=)=BK=bD=~E8< ƽk=t<2>&>~_4=D= A;Wo<30ռ8r1=1>>7> =bqܰ:oցLV=K[<xp<껼u<9=];z%XN<僽܆*zh];b弊'=s~L=;=T`=.=Ōm<$5}i}E#<<62BZ=B>_w<1\qeV3$ 0;SVO"=,EϼA>uV<H_=5T+\μ>;R>{>t7`c⻕<G r8s;Q%s;M ;ӎw;?Yqqļ)ҧx&=5<{IS<ѧm<ّ<"ga=#P; _T7w;Y<ѻ;pƺ|<J;=Q H;__8;=YEm@xh-K(k̼3w P<z-q6^"<<3ꉻaDs=8o; H5&]Wo='\B?h_i;z)ҋ_=%<=w<5<1=(b輑=LNp:<A;9= =?-9<="<Я{g;V-=oN<)㻽;ܾN:II[;=r; =Jh wcJS8+UlܼP<4< ; 8׃=8o<$<ݼ==,Xi:^@! =}F"6<22;yڣ8N56p =Yd=9P<ƞ;b< =z3n<{8 8?<9ּ;=5 E+ʽ 9=Yby<{T<eo<%< g2S-ɸf{< g=b^ K(==;n?n}ig8;=2{0@:D;ػ19)u) -=պ$cR!ϻ!ȺT@K+&=һfp;f}5C(: :ㄻ4۵FLTʹ,ZɆ:<4`Q:޺S%T;2:0P;naD; +p|7r9;&@\:[.ko 4': k]ٻZKW:.;]\:n;<:Pֻg鸮;L;1G";!F;x +Nou;:oHfNYf:tXU$C:𻯆U.;hv;+;:N<)_)̖H#r{ùi':o;;WF?{; i07yWbW;:n"85: ;Ҏ;9:`ॻZ nۻ+~@9O\5e9jb;W; ?}@}97Ի +?Yq?\.UHH:8J8F;-;swg::_治;^u]_O˻OT;m ;;.>()=7xb:f'Ϲ:;޹!MTm"BsS;Y9D9nӺw:ǹ:f(B$26>cƹ;@C12+$Fgc:p8nɺ%;\lK-9١_S*4:kJ;oJ<;E:D<<@;S.c(:6q.;$cl{;.N;;LӸ>9J6*c F7!uvU/&:}.$XV  3ʻOٻbc.C;Ob;;j:A;7s%I<;<j+;Di: Һe̻ʠ;`Ie9::ʒi:e' +I<$ ; ;ƺ,P:q Xf\73򿺅҆6󪻇=\%k: ?<;CO,-;z:__9;F;RN˜;L;;ޝGi*;p=0;Duº,O;Լ&-7ҹ"<;:˸R;X;#>kXA";:rѻiχ|d;*@;U-:';֍?j:;;:&C:)9l»5ڻ299{d9x;V;-j;sTx-" 9Ä޹:Փ\8Yƻp~a;mVy̻v2&p3_nּԻ,;3);*p;f;!7d=4=ߵd&C;;`;`q;;u#<75;e;3;gk0:Dr;5\< A:e0s9?:xFƇo;R`ϚPu:9:*;;?;mR:=i#k&9x-0;I< =hMmT:M}pL::lO$;u(o8gcaA;9:o;;:];;ؽ^;V:ĻB ;vO;Μgs{:3 ; ;B]-;54ҍaf:$98^hM:» +n;<<*;:4:g;@{+;N9ؠ;J;!:l 8fmFg-yq;tۻ9w*!?|^9:#:];gpd\e#˼56 лfPsg$;T:U0L.";8;:_;6;;܇);Θ;; ;j;M?; ɻ NbR;M jP};UK:Ս?;z;2.IkƻΊ{)?&Pt;ck< :Uc R*:­: +:::E ṑcR"&@:]k2&9*mL;P+q;E;%gN+c; {6:zMƻ`˓ ;mh;#k; +d0Dh9*:Gǹ; 9K:W;*:Ɣ:pu<&;*;熊>+"'"=;<V;J +;-<;eºMPֻM; 9;ǹWU;x.;Z u Q4]n)o%jxElض0zsW-|7:{n:rj;5&xW7S8no{;=.:O:5\ڻл » +;c;=;,< ;n;s75;X#;ng7;,)xv;I3w:>F컉᜹L7}:;_F;ǫ!; $C0:ьoNf\0::m?Ż^>X;H9zF1Ҙ {|RF:zeϺ#:; /<c%A%;t;2 V2"UCZV+A:[;|; +f8:һHc\Ny:X;W ,9+e;X85:L;bb:1WXx`nC:<7";:S:Iʻv[:1V),;JJ3,9(9n)4ĩ;Z"nO9?$D2~•8IѺ+:m:B'S:;˼ +IûvaVmm;=2;F;wZ{8:C#-=9Y`:6e;< +9O:#P;*;՝;! :ѹ޺cU@::NGD:T.;h׸ƥ/ͼ\;F;3:6󬩻!|9D/;ZPȯfɐ<|}Re]$Wk :sd?'>9$WS:;̻[z)˴m_Mgq;@A;;` +c˻(W-:@;풻)> L;H\)z1>,X+=K;8-;TR~ȻR ;=;5F;X;`Cp 軌A;/06HȓSڌru;ra:G-86|g:;4&;K*:wOCMh: +;m;f9Z:^:8;7*GS^MIJv<;:~G;`;:Wn;;"=:E;7r9+Ɠ: 3 NFLF;i :AEOӯ:}z8VY[i2;Z:;L+; b)xw@L;l]#TμNƋM:~:%|SG7k:PK+f6 +=/%D|*W<7jAwO.b҆:; :U;;>;4:C*:;O ?VK:o?;j;V8yM$: ɺ[;'8k9Fˢ;ol:!x:^Wd#pe8g;ѻ:G0:knQ:i'`5YH:D:z;Tŷ;>8X;X:7q; :|ۥH::%;^;|:(߻W:WP;T2x:;xY"v:s;G:UK:)";H%3竻 Ϻ';ºD%%U=:`;h9;ʔ;&;oQ-A;:6P.jK9904: +;r9X:UM%A캎eEʵ:k T*f;Jb;S :%|v+~g e(m'8ѻH߻6P &|:%NFA߷׻ݸ:y'˼ +7::~4;k;!;U<к;&K;;(<A+:Y!31S<;["j<PM8mwl;:;;r41 [*/ +W̻"PRp;x8A;~;y^;uo< ;e; r:N໋ה,;;6-N:o7; f:e>~m;:l;9e@h;BsGvcN'n $: ~a>P;D2~;#[: ;;k;Π-;&;I;};6;7~9<7",'S -M(\:DnF;{W;C;::0'r"y8kVSj;!);:;67:s蔻.;B]8w1Z;;m6;}r;+z:|P /;k`:ȕ% n${::<;;miT)غ .;:)EԊi;6v:h;::T;ѰB;A,`'(.ػj"zHfw9N<80rY^p9;<8j;}lGk;<G:VV /û븣;L:,N y;R<|$r; 86: bSEt"O9;q:j溘z#= +j;cFfh;:M:A8f'9:,LWk&DļcG:zp;I6;M\;:];;"ǻOw9;`: ޳Y궻/ٻL[:9=_ɻxČ;{;--.Yx; +zgmN;(|T$;(;!:`@ż&@t:;vm:VɤAopK\;ۚ<;p;;wCe1H;`9ûH!:T;1:}/'ٱ:T;;_$5tcL;Q:(:RW-07:3o_7߻@;\s:ǧ:2 [;0ZQ.} +HѴ:-JKɻ:9ᴺ$;r;p <s;~99.*;V;ШEؗ 2;O0;3h9 :Lp::13;*3;vKӻ;Kd;i.< ; %-9>;&w;ttC;a ;8:߮ e+;4u~򗻆4B0;Do;i:;l:g׻t:=p9m:9k+Oں^;I;It:C?;;_Lc;"<Q<9yźE'Y:hy.GOIPڼy݈@0rMǡMx:_JԺivmGE#:Y +:';S9Z*}:0;^;Hܻ]yYEɷ::tQźy:8 ;UoqT; +;v; D^;%ƥ; +;>BZّm޺W3;,<ٹf;fR< e?a`?л8;q:mj;;8M:y=;];_u;c;pD;.xuP;6;KΒ|17 :֋~:(Vמ`:0;e/<:i;< ;9ReYpm07;U +;g:mNu; <9<«X;" To)fֻz5 +QXn %ƨK>0[\yJ:U >neKӍѺ&9g^:^RV͸ѼL:;T9|);q;U5^WcRR\*Ze_::dEX ${_7=Lf~:r[ jU;;bib:Iʺ9$޻)I9;_%9^K:td;GN;l;e0;`L;h _APߘ:&;]b--XB9; +` -:-<m8(S:bVF8RSUD>:s|; >:;a`9<;Ou< =;X;{ss+ѺC#LcP; V<)X; ׺:;=%v;l90m¯;;֘;5{;):=dw1wzv׻:9R6;j;=oP8]9i鱅:P|꺗}iAM(ԻYd;uԧ;ւ;o;3gaʺy:T*;A:9g;;><s;%97Ik; +};9 +;3O6ר8?O?l Ͽ;F;:VR"@:z;T;2; 1&a#Lg0Dp\xT/9iEcA<5I9n@4;6E :KP8;%;S;@;J;%H: +8/Pͻ@i(N :;>8SD[W2Ļ69±I;(;[*9Zh;*__;;:Bdz úYW{;'!E;I:39";$;;Wk;;Ov;k<><o;u*:W<O;d;;';0g;g5kٹ,ŻGZwU;IjI:>4;/:3k9kʿ;9|@;:;;#p7vp;;s<;:奻k\7|N;ڈ;<r;;仍ͼ ໻nib?ڽwP4hqڻ/oP;&>0; :P:Gģ989厺Jo:d;nhSjZ'b:$B:;WYx0;*XPԻ?лҺ:^ߺ ଺ff: ޺ J;I2:ޜ;ջ? ;:ﺾIvNֻZ ;t<\>;}g:g56&I;ZJH8-;f=;r0x24A=T,@Ժ\89;:d":pq?;b!;E;=;T): /Q8j};/A:NBoX@LAd;X\vG[ƺtj42û,iwG7K::#:ֺW: );S;ԯ~d:s);< :IXvHEs8P;9C9::$:yIWf_e9d3)ULuUKTΞ; :(:8;8퉹Q .^;[H;L;C;D0滇zA[H$V;Cw;|v:?r;?-;:;BHG{p;b^;;';q-CFA6'.S;9>:fT5s;4;~ź;չźV:!5&;):i;L>ջnv::Rh 4~$':pc򇹈Ơ9zW:Τ;;Kzܺ~9 +ߺ(l; ;hq98պn8il2-!<<=;:`g` * ;F;:?>:d};oHLZG +<;X;u$H_*ϻ~X;_<#I<,/kI>H;c;LҺ4I=;F+;;$;Z:W⺯U4: +gĕzt=Џ@pB,{{ˮ;2OY:kG G˻PӪm, 3m;Zw;*;O:bй 0 +s& 9g ;7;dN^Z)ɻn^_L"2 8r:NSR<:ENE;ջuSĻz4uQyߝ8Bh~;;d; ?;d:uS_<; ?;o=%#۠;pcy;?ĺwe$=Ҏ%(Vއ<6 R< :+;60;zA^!9ǻ^d"й  +:y'XײzzmZNC!w69;;Ͱ1c-: v:ܺ}=A7:E-btk6d;E:%ɻf;(99R;N;H:;j9`} +pNr;ֻƼ|_㖺;* +or/O}9#:Q2;!4 .BX::\/:Sd)cv<3:%<>";Ǣ:Me;`r;`ɹY:9õ9a+ 9c>ñw{;:55=廾t ph;frEl9 ';s[;0L:Ydշ8;T<5;52;;;;:c2}º[:G:wWPK)ݤ&_^:+ EYd^n"-:5};EIX;rʬ;Ļ={Ɵ)#;@;ɒ:?ݺqs ;;«;x5~c៺n1::<-<*$);cla;kQ@뻭 ; ;Lw3:嗺hd7w\;:0W!;bÊ'9@һݻ,1:\;6B:/;`;{H;0sO;;Ë:+Z:2-^nP6ϻ9;;$;r"MB:)S:T:];g;/ 8{l;Ȧ;,'< p;NQ5g=:> ;MԤYا68H: :>vf|) phZ4;-:i':P9e+d;";N;eK;#;)V';ll]o;Jl;?H;;+ N;+);$޺< +һؼ+e{\pʻ8û5\3g6:H;l8_ [׻}G?; +;^qK;TV:J\6W;q!;X;]:qh 99:ѐb<)h<] +L;W: :9xȻ{9䓻'w>^;jH99Ϻx໹qY)(|Kd?KA;,;;ϹH9;:vq;P5|:A/;;69mQ^"a9W:ew;4;K9 k];F;k2;&Bi;;^\:;\;\;`o?7̠ ;y̻8)6ޔ%fϼ&h+Pw:;9P:F#컗ʺj9o8.m ;Ӿ[8S9;=XA:Y):v;,;&C:d:@:R\;O;q;vB캞fI׻=Lbkл.B]GgԲ:2)ռ15^Լ/Kp;;x;{_)9&` ;K;k;.»;w˳;x"m;w:x +mֺ;\ Zṳ;v.9/䰻R0?tዻ <;ѵ;*:K; ;x: 䎺ᖣ/ݹ/~&Zo;bF:S!{>X :Qv:Z.;:9# 3K:J(94: i\VK֣+;B診:ϛQ;KLd;&;<;;D9>N;~cS?u;";;r:p9:2a׺&y;` ^: +ZV;˅:^;b5;+;hV9g^:I1;h"96RǺ ;;;<=:q:;Z9λIi3+:l/;;L;9)^߻p CK4/W b YVB: ȹY;Ct<%:_}p؁^;X;˱93DJ%IE19`;$b::|;ι:G;HJ<<5: ;L;к*uHf;;A ;D5:Vb;f5;KN;;?b63ӻv@Q':AĦD};5):9n;J<p"<h:ͺZ:9/ѻR)} +-L@tm;p;&;d?y;樺_kWgTca};k; ;q;F涺*ѕK8 +< y;*;Y;:;=x8f;*Cn1f:=e[;G;;nVn;"0; ; :ƻS9/=#кA;.:5CY$׻*oZ ;ܻm.ֆS;R ez;;DB[;z:ik" +,{z+: :P;H::ʹƺXCm};Y1H; +g;!G:Psֻm G<#;`ϻ X94a :;ڷ;\;~9΁;cu; :j;;&&;>'9Q> +jJ=d(5"(9ֹU^Yx:KXh:3;t;'g(;$:bPEŦ:;º":Ȼ r8 <$h/:t:9OM$O:s;;8;2y8g3dƆK S/C4L:IOXMһX6;?U;!*: P;to9*uy[:;[ƶt4tL~Ƽd֣R&'<9X;`,::auj'G:sn;ܦ; ;`; +;Rm&JE:l|:V.*:9d=;M:7ź!g;NՐ< XdL8c;:Y9Ƽ *:9 >$%m);-ȸ~>y; ;:w;Ƀs]Fϻ +TNG廿: :]{ܟIo;1 95p:Qm?; ;as;¹קǼWl#>;/'M͢3:w;wU6r\ˢ! t̺;|59M :;`:@-ȮTc8e6#3u:h;W:e904yI$9`!( :;*v];Hi_:'eLỔg^);;"=v};_:)$M:?#+;]9Һ“8kɍ;+ ;Je95? 39^ix';!9λeG,`Kϻ;hq<;(;ʔ;޻;+;z _;;];̻UI |{˜:q:A .F%YԺY.(',G;'9qhN99IǻE:hi;0L:*/;M< ~;$ȗ㧼:;t<9P<;K#;<:&'NV8p;bU;D;dU9c`f; +\tM:#yA96JV<<>{B-':d»C@9 =᧻ZvU;|O;T:-csG[9ѻU"ɼ}_4%%-`:z;S;o:B4zC;K;;,_;Ƙ:8Y'STG$tT;B8z2zS :j';>:ͺ:.;m;;V滂Q.["8;D/d;;5;s<<:U5||Ti׻[!L(::;z:::;Lj9AW;ܺ9;PӺb:5;!d;DB=;6:=2;X;H;]1.;y:;];ԲJ}m1rz9;#(擻݅ջb:džMU:ڙ;;L;D3D˻b5o;)(n;S:::7u;po;ʬ;;U~1s_h:0SԺM2#K::;;F"͹ZcrP;6^;:k;r;C#D;y[:;O$M˻, ?L;fMO:;99;;-:%ٻV]к:l;C:2@|*ԒBw;;r:Jl@; .Bp::J>%;;)Pk wY1ۻBI;cZ? _Ӻ4:z;:ރs;5;Sb;}<;;;ZͱщԹힺ0c:OJﺮ4>;K;!<_;P;^S;%?[ӕʴpvW:L"9.P;"":DT0 o:B5һP::><;i;\P:;X=4 \Z2;(;~s:A@-t;ݪ;ʡ8;o:LE<#Dj;D;_6]$;S8:;1;O;"<*%;CKv_-,\;p&:s;b;y; +*묺)޻x0m6;r74W [DC9:<;:Ѻl:@ػ1V(2L80;XH< +;;f]{oy^ ٻ +Tpb-s@CH;ˈ;::tlY`;i(:Z.rN,dT;Z;Qڻj\Ϩ/;C<$fO.@&<4:fWX J9t:00B!M+րk;l:;.T{pI!g);r9c;!j;;^J<<J<$%;R,;=;t`F;9@s;o;l;ɺ+6\D,:RZͻ ;x;P_;!I)κ`E:= ̓5;;J!D:T;`@< ;U;x9ۜuc;;&]Jd;7:3:C:qظ1Z:2V< ;Z;W+|;A0oU&;|X`;Ȫ2;|$:޻;m;?:Zicr;d;;WocԺ:,Uc;ŻU3h;0f2 ;;B)9:?-Ϟl/;;H78!KZ:|::-GŻ\X$ں!g⻚QVzs;6з Pzg,1P(:D( :'س;jX;ޓ";GgR:Z<:&:ލ:e,.b:h:|;:6;~;lR;ZP;Ԕ;7:Y{́r'4;p;: :%:dW:8ţ%"һ:! :$yAvĻ<^; +;Y;O+< e4;݌ :&:ehf ,ז]"MR_ +;t;kTjS:Ɋf;Q ;E;O4;!W:tG;jCU;P;z;b; +v|J%9b :xy9t;t9sRq4ƺJLFT:gպۭ&N黂 8%b[r h޽[;3B8ePﻊ+8g>sl;; $ID%f +%I;;)պ`S8;P󹠡9sh; H%;;;mio&ݺ&F/E@:/;u:X;zb;a ;6R;W:PpM ;K:8 :a黝W<<-U]c;f;󱻤Ӻ&:s/PaD;/;yO$;[乇<_;(غM;Y'aU^;Լ_Й]9\:s5;C:ER97j8;?}:19ܵ: :;2:,V;l\;jͻjѺh:KVX;7m `9R:y1)Z;vCi;i:A::.ֺG;#;к x/g+[+;7:{u;{c.ՠM^ջ]9<;ɻ5;;zv`;#t;;=:Qz+;;<mٹj ^;O<7;;;ʜ;ӥ;-);;J <;ҟH;曙<<' c;:<+F|ힻ#1_a;G;Ă;SUg:tʸ/Hb*d>99.;6^;8;eCPU2ʻsi};;}P(;)v<ʉ<*K<];X8H;ͺTMDλŠ0CNJ;i5`:uz;WGELZyY<״<<4<<{G<\<<<*1;;;2:9:<ޔ;}<2s;<]< + ;=d;|令@;p< +LqJ /;so;q]b<0;%:)n%Eϼ W>󢇻aF9aw:$:H;< ;%<4</;H(; +5epq{Ħ:{;`wo:޻bic;C_u;M{;QX 7E-3ؼHI%J];#L;ds?#D|A ;^=-w<ߍ9\;;H|Mr;sƺ[SA;q;3͆;I<<%ވJ7l:Ά;XrK;Z:Ļ-MP6"铻+99u:B8ޖD Of/6Ͳ;6h9Lû=ؼ +'{۴B^6<w;R:ydt;xRs;2;X;;S9:+Fƹ+9::":;d#g:?mA޺:9v7 =er$m>Y۞ 9O9o:1(;Sa::4׷;r:w;X;9gz2׻,4@ ;K[3Myv%;);E;;va<;=o={ ;=V/=8%=$<ܱ.; `;yO;EPߞ=Ȼ0:nU:;G;ߧ:W::ϻP::Q:w'7&d;U,:j<D9=$3Ÿ'Eֹ8:{yT:w#샻-\4}ûYһҟysP1K,M~9Z; :OM<.ǭ߁c:pX!_;୹o*;G!<;c[.Ya:V;{=P;cR;-9|9626;d:r2L;?`:;@. +9:,9Ύ;;•g»mR;D$4z:~`ǻ"b"Ӻud?ժ;2;#<.;t<P;IU^34ƻDR]}:ɳj໠~ѻx5/;Fk:FNm;T[;iʺ;>,S, :%:/,У滂;R:滟Ǻ;/:;Mp?:N:bƲ;ͧo;3Ny; >=Z==0;<<^Wզ6`к;yo:;G5:ql8繎'u=AV<;A0'Q2;.Ù ?dz8E +ƋZCU4|Ebkg;hj;n#l99_F;<8Eb$a#";8<:;7t'"W>U>h3>NG>@+=L0=!-<<+!<:"<@;ޫ;ǭ;E:Ad=E: ::9$;3; Z&;.<\yH( ܹ㻫'p^:1w;#00ͻs-J)_:;319*w;k;p;|vC;葺_s* N?Ի׏iU?;m;`>Ab.^ 8JQD92UY,w7;;;2ԓw:x;Q/P:Y᷻x{Q ;<::;ϻ|e9V;e;aU;<ڝ:TLۻeݺ8Rb < :CS;LdT;\;.>>ȱ>>9>L==;v;k; +X[ aػ{;;?:^EԼk< ;+L 򶉻::`'%9:d ;޻C~;";j9 cr:V:*;;q"Mnkkqv;};_Bj:;9@">;6\:}w;8; R:}wE;<.G-:oػϺ): ;c:Ԙ<;O;+;,;% ;!;c<J/>= ? ?>U>d>l,\=iX=6<;˵;t5X,:99; UM:9e;?%i"mλ<;4z.7;~;D;x{'zG:V:o;ț;% <7< <<<}>۱?+?_?1S>"> %=w><e,>?9?h>>*= +=!>l>>y>>o>#a=A*=H< < W<<5:&<<&t;;Ȍ;x%; 8ºC:Ix9흺k%ǻk":PG%lzPPDiʁ Er;2IUmukq û~i1]ݻێȼ]ʺ;f/xf9GgZ0::&8Anl; E+:;;;j;_;dwO[e"89 ;;):fv9یl"pJDBĻ;7,;8/LS;?Z5W :˰t6;*$>;CS9[l9m電4Z$x';¼$ֻW9$I;@;!;q;o;ٌ:Aﻀ_)1=Pk/;s];_"0;;k<;;g:S;K9n1J>QB>Fg.>$==c<8<44sK:98:; ];T; :NGQz9/:9Cij;<;h;<(<&x<Lx<6;7~:U;ð<\< +,<7=݄=7R=q=X=֡>%=d==cs6: iAC=W:ʨD:k}ӼJ Tt<C<;{;h#3M3@ NO !t酻9.:;3:G|evNŻEۅ».9; +");]_:un|::ջJ}:(:| ;n;I#`tL{p$ݻD<) +;T;i:E; B>;ʌ::}" ZK䑺S'#d̺#;l0;-;<к#5l:B1W([;[;P(< +|;;I;Բb;M ;< :%ۺh^'(;ﺊy';OE; Ż\4$<""<:<(;.r,;9;e(:^y:nV:Ol˻ כ[Ժf:Ȯ:;Y;غ؛5{<r:;"c;67;oI9^;:!:;>< +bX;O%Q庡9H(::|ҺAr,;Br;.; bb Ɖ:B;YAq/i-黑i;͊O:K~QF;%һ>sN)9X;<;i~?EQ8zd;r";Wc;S<g< :5VҹĸS:;J:pXpYE; :;G:ݻ7(;2;R{X;Z;B;;;vs;pP;[<4';ܣGpQ:{;~;i;7;,:9;On;.Br: ݗC9_q?:Tc;b$;;:;D^ ";B-fQ,`<&NʻQ=;Ɓ:BYyD:1Q~;),o9W$P:۷ƻܻ< ;G:ʺ{~<զ;:/; :; +b87: :;̳:$.:uIb_9;:=5-;#:;Q!XQG;,<;a^ϻ|~f(R0:RF;!;GݡTl 9:e)Gժ(~b';ո9b9k2ndb?ob;ΫJ:jM:t::(D9;+;ܦ;4 3;Oq;*;;<'9Dm/<p<<==E==\>">9>=G=5<2:q>nf>*V>A> =; ;'C;s;L^;,3;;&]<#;Q<>9;7HY;<;!y;$; R;e*{JOc,u5:;'6)9N;;}4򪚻,H38):P;0.=EX6׻`?:9Xv:2h; +#1 -;R:$+;ֻͻZXvx7:D;x(7l:rfoʂE:VL;#I H3M@9=%;$\;X;;Q9:>W:?]ͻAh; : : ,.:Gk;<{Rxa>w">_ >C>>Z=BP=K?%;{96v9ߦ?;p;z\IUܺLFʺ2;j;;;Rb9񻿰K8ͺû;#Kl;B-k-5oӺN0(:ǣ:̻s{Q!̎|99qa;biC<.W 7;f;;Ds*)9>?? +U>>=)<;<8<5t;%(:)9Y:z<*;U:w:S!; + {;U;<:;?3㺝(4B߹#9**:5*>ѹ6:(*;.0:~c -?D)ѻQ) y;!Ժ{N}uh@Gu]k۝Xk0;:!D( 4UڼYg ;KyZ:A^29;;Zߋy;:F .;]ٻtP"41Ի |8zտZ5£;O-;4$p˝8;D^Ӹbm;d%*L;h9#'d;{ڻ~ c̻?\n;$8OcwD6J60' :]dI%hm;4';9n; H;;!;;*;zi;%q>Š >>j>6=v=*M<0%YӷVo'k;:"C; +-;~4;}:Q<:!92:,B;+1:IeeF;.u;(G;@:4@&8pD;{;pU;l;%;z(a}Z <Uo<`<[=3]3=E>#+>m=>wբ>Z>j=0f=<}Y <<$<;F;O:<0\#&:B:$ӺB;9!pX;!;y[c;;:?;_;9 ;[#.:Nm";':K;uC; +?;G^giD'|:8h);In7Z$󎻞|:;l<;?A;=;Ps\:F;X[(̲ͻ?;~◻]ԯ +[lX<y:[ +;\Ax:Ϻ\F6;;5MלXȺ8;/>9[;u;߻C#껫-oG(ci;$ ;&;9_;'a1):x:9dn VuL$lr;;ZEk9d5;6;U;7:g`:o4\:;Dv>=+W=u:=jy=Vr<8;7;Ut;|d;n< <b<n<82< 2;;:;~;35'. *+j:p5r>;^r;&:hh L<[48v$:ĹHN:."(z;<@=W;}^w&j~0H:}:VUR:Cػ3^&9A;*;*R;Z;B:=:,ܺͿzUD9D&D:#;[pͻ][;$4;<'Z;(1; x;R;u;u;R;ض"<@8<: _fƼ "vĻ3׺߻jn +ϻs `):^;>;‚;;|8S 8غ;GL:;;-;z:":M2aB ;;@h9k;#;fbFqAEĺ#Li_V:]\:w(ā:Z9<:ػrj{ +}2Z9%<廡;9;߹$8@ +h:9!;la;;;$:O\<75; c&:R1; <s_ԺZCE:f`; ;_d;8;$-;:; ;=%ͺ. ;N:۹6<;e<3;.sۈ;>Ɔ;.Np9o1;n 9HSZܘ\f< ;0:}:?F;.*[:v};*):BymyS:ڎ;G)"l ;q;V;\M$5 {?9:#:躃T:"Z. $˻5滈^;#;&ǻMTL9D]h)K/u;-3>9۬;;=; ;{E;IC;ļ;t:M<`<N;j`1:n:;h;՜z;2ޕ : +9o;;9׻%޻j+yX׻dֻz+;v<y<%6Y5D : bE=##;ۦ;;%E9J;0!:`;;k<<۽Ԝ#;C;7(S;r;8g;J:舻q;n;Q;b;끓;;M:tp˺A<`;;X);9ZdFzRs;"NaS2;O;Ҡ ;kf;5n8N%\]v9^m:E;;8';jһ!';rO;SS&.{h;9#9C97)I:Tg<C=<#;'d]>;P;;;Q[8Ѽ ʻ?'a< :%LVhotVQ-;#;e@mN'›K;OE뾻v:7: ::-1wͻ0,ROw9b @Sb"Lq:>;9D:;:*0[Wr3a{;;6 /k.Z<9 +Mm.9.;A軋;W;B;Aӹ3-;;";xk;ұ:;+;#:(:4;==;ɺx8҆4[?UG;!A*:L;l67TjTȺR+E]I:$; :'//:A_};6ں +JW6&p]X欺:-ֹ_)3c:[9XYWH]F٤:@e4ûVEŪcg<:#;vV;>6,|:1.bŻXsaٻ۬ ;I;: m̹t;o_{,~;Q@M:=; (:ӻ il4;*;B;G;`h:O;;s(%ǸF9"m:; );e:~,>Bq; ;ŻCR*83`:YB1;_*9r:);Bڂ: ;: }tR\bs< +c;Բ'D{nAQ 7|;c%:,:{?:ԺE:F}UŻ!3/j?:[KϤ;P;T3 M0:E; ׻D;VY6;O{;^%˼{!I>;rȻɕ̻{`9{r&㻷o#r@9 +;;;mf:;!YY:~g:ջY;h{;-d;Cջa˻kZ$Ve ]=i;3SlZջ. {hACP9+};8@O|gpF;'dxV +ټ -߻DvK*= +Gֵ;̵Z9~6T>;yZ;Ppf;1/<a<'<:<8!<@w<2<<:<2z<*:Qû׼ r<;:f;$D;<͇<+;e/; !EN+9EG@lȆ8[0;[::f|:.9AfD8DQ;'?;6A[깫@`!һFF$9Uޞ9.5~P`;;]:\['-k%;IK6;iHZ40;j;Qr;gZǺF|}8<w;Q";;G!SD8b:3|;Jb; +;Rໟ;\3krda99 kƺG<<:S9L{YPݺ$;;*ػXE +9a;Mޥ;;h;}Zp+xAH:fӺ o:Y;Av;<a;P-r; ];9tHH@:;gd$ѻ`O;7e<|;2:Ee4(4Y Gf8y ;8:&U9zԺrD'?rR5;OI_;On;#Dդ!5Ilbmk7X;yͻh*x!~{;h 9;,<,eV::; ;\;n1$܎ *%M;M~;|:NO]V +p;Ǽ3(;$I';ҹM_GSHDoһdj;+;N;lK1׻; /<, :"ꩼ$h:v1:{%;@:l*;8~;^k& jմ6տn=;Dz,;<<`;uB<<)E̻ NZ9fZ;zD;@:.%>;vź :;Z;1;{ +<#;ۻiISߺ8CK;zi; IX~,:;};(;?r=N:+%3(9HsEVYͻldU;8: =V::^;<5ɫ;;o:Cɺ bS8#[:rǺ mH;g%Yͻ_:;8&; :;U:+[;;aْ:r:`SAu[]̼1P&.";U +:$N;g9Ynj?QjKP<' + 9HN8::ѵĺ;n\ȶ#/:J7; + :;\dK;;:PY}oٺhz:SY<]:&nu*ĻO4Йn;|NE[;6s<m=6G=YɎ=t==y=9IX<[:q:\}:ف";P;<|[:;20;!:Z;cq; j&]KtƻtۻQ;1<-4dgm ZOr!B_<;ni:;K:B;@9RN6_N`ϻy[j2;P-;:T:F;F{M);2ֽﻨOb]л*8>;9 t<_i= =wq=c> +=d= =<<8D9<8<u:,d9TH:;6;:Ѐ&tM瞧7<;X;z;BCk`&:|)#;>;i;[>f&Cn-a:HR2FH:]7Z*Ihg5;(]i9'!Y~)c)d컸빅; 23/{ ;F;;p;a;șK`fxcFo03~Ɗs 9(:dH::mdߺ쀺j-*[;k : : [;r:ooPHT~jOeDT:<;; +_:4/;eݺt*0/:!ot;~;+~;;yH} h==&<67ڭ^;ƺ6;Oƣ; aɇ:;:ń;< ;ަ;M-;X<97:l:: CN $K,F:R.ȴ]F<]!;#{r1C(%- +MŻ0; fnmM +޻>o1R_4U4;;*~;#8H<%kŀ:1Oٻa9]7 W;r:Zf:: ⺰ +%@:,:ؤqTK;MIϺ?~9 >к h8`u ;G;yA5nۻL<7ػ>2;[;WѬ?Jǹ:;z/;7g;| ;M;K-:O&`$;;ur969;'@:K<s黐<+jyG芻º =:Xo8];C(;);n;c9 2;; ;Y9<.,vj#;_(;M|;;C7`;M:PH;)#< z̺':8UG$U93̻:>!;q5鹞`9m:|bP'^(xH.0rV;gv<`Z;a..;0.@|˼<(w;.`ֻ> </;u9[ ;:V:p<x <"gZ!:29Z +:9;<`9ѺJ:^:;ePﻎ/u;%c:Y;THM2:7 +h;8EG#>TN;Wr<܁Cƻ,Yτϼ ;!;k;?:С9|d#-H;43 +@; :S:b"ћk79?<>\9Pֆ9<>;W;+;fN"1滁,ټ dK^oK: =;Z'; :#;n:F*xdMĻ`ż)?9~:кFܻ=:{-< x;f3;/;E<p%<:Ԧ;`f:ԣ;%;T;6:xA;˞<;b1:q1XuB;91j<4;F:给`xӻ4ût߹#ܻ;D=ۻYvAG%m;pN'Uf廍ԑ84l뺥=:f;0ùL;ߤ; ;; /: +Apy7;48~:yg];;q;4:DN +;:A;>*:;3{;AAq:sJ늼/0:#s:hzbX:;r1:X:*F*;;_¼s +tv'*5]:Eo;VK;k;o&aΕEm<x\;i/gYm;R;,k=:l+pS,气;6(P:f:};Ț&7y\0Ѻَ&:/:˒غ;7?- n@ 1:<::4;BBS.5/;p g;4:Y:)\@脺˅/t; Ϻ;S)f;;'i?:rn;;;`O;;‚;;s0댺|к@-mʼ0:+;*nk 8N{;A;P:,Uʵb;\:㺻:W;7:,Er< kR;o;P :3e"J9;'%:7*e:vlB8 &0\sW+;qv;;2;/uy.;:9*2;ŁI;-6~8S;M䈺(;բ:嬃λC +i48n;;"4O;ox'zERaz;}a;0X׻iD:>mO *;:ii9ӷd:rBk<" <7;9ZcRV@޼wF@;R; :69ӲL;=;,K*&:z_>Æû i%E::<@=; 9;{ɼ<zQ97;ۺ%w:o; ^G=;7<9''0N:S; ;Һߏ;e:`Xp:y:JɺQQ+hb;: :U:8;<(ظ*KBc(t|.E@g3;M`;_T9iC;_PrA:_.қ;:|b;v';|׷Z+Ud;b:yB;I:xKɻ1iNta;t_:s.<u8:n5%T}k:`:;92PyeVS3ER!KJ~_V;F;s;J:e 7{:񘐹ֻ'ػLλ θo9::e9 !kjq;.;;% !wqٹ3@;>u8;@;2;eT9;<X;ܻ(ȼ3Jֻc;Q3:;;-;;L:\;?:P9% g;:;~';L|;E;lۖ; +;"b;*|1;L:R%:c^KX:I:sTAXY:a;b;+a:OӺ54[;xݺQݺ-;D,9ƧmNK;;;lv1v_};q+U;+<"s;DF:!:!*X;/];,0A;F/<;7;zxy;;.Gqm8;8P~=;;LLjmpZETx:,*Ț߻ȻE;9J;R<;` +A[ +B{; +Og2XL:â;GWà;?:<;%X;};t;JI;;7:"_JQj<P<;2; X:dzúƭ9F::!;mL%:e;;R;ʻZY:|*;;l:?D^tˆ +Jۻn:sH;a \DŽ); Pi;C-;s?9o9 ld:E;H:Cf5@$;w5!, :1Naкc, $6hH S۪bx;DKV-u+:lRtL;Ӧ9! :q<"J:駭;;;OԺQ⻳,P X-8h;%;u;[;z;1;(v:[͇;u:3ݺhb`:K;&;i;h#-YNo~:E0;;CV&uGKJ3ڻ;D;* +W:09w<z9:iwE-;:G%7M̻ ;;=m]< |;S;;竻|һԪ;o1fX2vȻ3Ҽ3 ٺ\9$FV;;yk;&E:";f:b:mӺ:ߧaf;~;A=;:0%*;Zg9ҸKc:;- ]5zڦʻ}Թ:Qd^5;}k;x:;5G-ù1z:4<p;dSEP$9:2(Ǻ;*lNӦ:;);;..L:C9ϻ (;m;UJ;&Z;n8$;4^<^(;5-B^O;@<ݷ<1<ںlwƸ&;hP;F=ﺧ;+,J;)s[p;/݉Ϣ挻u6[;yU64:nz;쮻i9>[ԄFw_::Ua;KƼ ϻh ǽ>z:EuC;kb;7Rt3pP#:T滚k0묺?o;S;8/;;$`G;ͻԡo[4E(s;:ă; p1;)kO9o)2Ȼ8;^:٠;#{IG;)D]3V%$;͆;J˻ 4κpP:p ;);;R<TsT VtX;+9jioc:B<;TjlbC!z9 w;һ绷e;-;y GrBU꺇Gz݌eP;J@/;/;<; p⩷/t<)K<< <7;;O'=;" DU:ܲ[IT7b Ǽ|L:6xPPpʻ":`8;l8Q;J;,1;9>;4s<Ի + + ˩8;k;;K<\;y';ٝh MpvS,v;2g~[Řds +Ox-?5Rq=1B̴?  + +F@siIE"@׺QEF184Y D C֥A 7 +YOF@siIE"@׺QEF184}YCd C,a@7ނ  +`TRG@siIE"@׺QEF184Dk6 C@A ނ +siIE"@׺QEL +F@CԠ@`TRH@6.E}XED,DF6PEڙE D/fFDEOD0C*Y^ESIMPLE = T / conforms to FITS standard BITPIX = -32 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 129 NAXIS2 = 129 EXTEND = T END :ۻn=7<UX%=00}o<9da<:1::~,%;E۽(W.;)<ڏ<0e^4<(9g=_7;Տ3 +<k<<:iFyAֻ; +GWTKm [<^:BD1;^=>+;cC= 2 i:?]`{=mh&$P)ԫKd*a4->opU9EZ<$><ԽY +~=uk޼Ws<ﻖ'*{M<%;<}=: h(L/=q8;gaJ< <Ѝ<{$̕<:=>6޽<@`KI0컣Ѽy=[ǻ,=<~,cDàB<{yYެآ<?<<<ļ Ot>Io^<;r<;\;Mpvf=tN}pɂt9U8;`;KyTkj@<b(O=T ػc.%p=99r8>|x;*D!߼F-rռӼ![:ywK0<<c="-q;yLV:<#=k}<>=gp<;qc=,}<_P<#pӼ(eT ; +;Q<Ҽ-0;y8.4Avvm6D%F;P 1`K9)dS:q=Oȼ9;nM:'<<.`<:`5K-<\;Bw0;$<>d'x<=%^M,ʼm=YB7<L="Xm;(<Ȯ<'<=wB TC.;;;1<5;ݔDz <<5~r;2;6z:)t<'< R=8bP<Z30k:<'<}g(ƺ;Θe<D| <5;*;G;hS=&7,;^jv;22=%f 'j32T='_;K/<,CͽFcӄ#A<P= A㷜+;ݔ竼\T;)<Ĥ-<<< <{s=V*ϼ-xL;A$$=KI*v;M%JYx=[~!<6nļ[;Q< +ݘ:j19ȼkw!ݼu[<*x:<MLcA< l<;Wa<;G~ﳼ&B;mv{<;<:<МU9=TRG<'+;O=; 1&Sd J3f^fB+=E<<}uL={̻Ȋ3=:|ǻj<ڑcY=<˶O8=8 +1ƙU[fdͽvlV(4)'׼z=h(ݼx=55&( +: HY=3Jz;h)+Br<Ƽ)<0 ӻm;Q.K<(l"=<@=a<=S5<ˣȼOmMCͼq<<#N|<2Ǽj9 < 5 +Q 9q]+S<`<{ej< +I^=5<@<~;rH;[q;<'a<6g; Cǽ<=vJlYy,=7<J;qA-Vz<;CSB<+ ̺-:jC3U-p۞=+u4t:T8s?[%Te5(߼<-#<$bXkq潙3q4;L;z==/= 6<ګ0=OhҼcwb󢝼 &qm4W<e<p;,n<=Zr a;߽8= p3/:6=ܥ=q< =ͮ-զ=?W< +=lu]l&> >]-O~ ˼r;<@0:? e\:@>M<;'j +qCP M93=w;DGd==}\俬?L[R?n?{d=VU<=.F=< -<*Ͻ GMr=6@[Df<3>1Qca=Z2r;B<&*;.<-=9;=!8@=i;"=\ w=4AG̼Q%o<5+=Z71>KjB1A@>w>ռBA=l [=QH<<=1"=M=/*;EwcӼV<*<;ʅ<:<hA.<<P;R<@4~:& ;9bm=N1=BX;ٝ$Zz` ɼZe|Ҵz1?Ɲ?l|a˶T8 +=1Q0<]=[}껩Jt|=ļJ;㰲L罍3GN$u=,F=Z!޼i;;;W`Jy<Ͻ]7m<ӺBF8h`=ƼYu5;۶&<͟<%<;?$<`<Ŕ}<Ѽ~1=:*fi=nDF;h8⼾̞~=hf= I纣׍"u.ē<ۍ%=2<%:=,l<_Bj&}KRA<.;k<=&<Ȳ-=/WU)<|˼ռhۘ= n;e޼s< +BL;4;IXrC;H=pψ<7*0έ;b<9z?rlؼo;<+=P x"&=[5J.D.=IwZ= +<<밺;I +-׼5ݼN=-n= W;z=9Pyh;|B%V<)< +8}<<c7ټ;c7黟^(;ּ)2?;1c ;l闼/j;Q:1=5A %F/=#6h=ۼ8CH<=ʽ;4<=M<<-=":<<=:=$ZGp890F x߼4Ȼ2R'ݼqd +%Ǔ y/?O-(ا69Y (} w<,(;⩞f$ :];螋:&<Ǚop;1޼ֳ=7<ټ3u=Cm2ƼV@==@4{<-<2<9=2<#<D^ ~ =W Bb@Ɇ =Ų3;ѫDf;<̽<ŧ=<щP9w; r˻rgZ񓼽t:{•<;ނ44N| {;.CS=q;O <6e=Cqѻi= +; ޼xK<;i=z;IH<+g;7)nA;*],934Xg<6<'u<μ |!XźA6ϣ=P3Ӻ\m= vq"=RҨ׽J;?,W N<==Pq= s[<+<|=K*K|4M9=e;Ή? 9vV=A :"j>< :mrȼm.r;ʜN;T>qIl=l;sջK$%= +T<<#yzaǻ;Q?;ரS;<%U< Cһ;F7 +;F0= eB<%E|&^m.ļļpsl׼i;#̼CKjA:Ong<zֹ)xjJ߼t;Uq<  +ߐwM;W۹a ;0e1cIXCD<ػ=/@:ky}=0L&߼\ͽ5H8=mB=<ڍ oE;&z=_<۽<¼;<|CڼZ،<;輚Ac8E>P$8(ټFκPL<¼^=*<h< =0=*=x=;1H=üu;;1<&b=3 <#@='"j +A q=H==c缶C+=F yR[hlBY?&;0<4<k7< 1\{+c=Kˑ;Ļ1~E"iL=G<9&sw車,= tp;#%,`5<-|E Mf*j u=D3% %;;aC<,O {< @ +μ˽ٻ1*n<#k<}<۽t&fb̼W<Pq ʺӮ<^<7-m.(W?,=lQ)k:y; 6:4;0uRW!V=Z;=ûF5;O]<(7mU<I%V<sa=#/4܎$<_ҼS9K{=Z;F7<,j:}><Ԩ;p;<.ŮW'B [;>v$7I<< D$<=PE=}d0;ɂ;m<<<ñR`=uT7| <ꯈi< py= o`9X<'=9oj=%=0.=T{R<>נm[F=I +-Ӽ[= T"<ɼI==b=VXN7<V< +=9j< <<+>f=5;˂<޿Q<ċ=뺽9U B<ɽ/0<`ﶼDKs<<$OL) jn$ɼRK= +|;;(;!w߼$ۻܩRW]F<:_X<W q~s?<=5p1i<`xd|䍼4=;8.<7(4;ܖ<荼w<㸫C?A=(YpY]#{;pԼ9/]P<'%*ۆN}3(Z< ؼ̼q-<(c;>1}j?!=GQm<j9~=Akn&/;@\<<8J<=5]лͼ4jt4 !<ԼU=(g=%T<<$ӷ Z=:X|=h;#+ <<)Ǽ#< iR;hGK=H<ɮ<!f +V<ҘPY~=2K׈;8 ]t<;oL^\;C1<]?q<6C;\P;}㻴<4=H $;;~'=c <&;<7k +.Y'p';6<!\ =<.*v 0<[*;=<}-om;.yGν(cͼ|;R ',9~> b8=9fJ v<1e}<_L&];H<{:Y:=H-o48';;';Li ^@=+s=<];A0j!ռS<ɓ%WE +B0<ľ, # +;d\n6)=1<6~Pl<:wd]D.єU`xA8<ؽs$W:l=;M!=P;><< i<—=G@$<<?q'۽K<<_;bϼzgF.l<>Ҍif5Mf|O;/᩽Ż+=4[;O<+gG&=L<Ҽ;JY~;u$H\[=Gm<ջP:۾<}O^;ӓgKkɽ0K=K{_ =w<0^Y~^8;5Cp=Pz/l<!G<\ <;.9!)A='$;=5w|E=w!߼CMn Ta@;R;<${_8#<%=CN^ݼYہ3ԼP<=G=:S;ٳP[`#<=hǼ=H<<}2=c .4"<~<[Lm1<8<]w:=V.v_Z;;X<#<ПPCaJ<|<.x鼛B; bmӼ;7= og:kt0:j_üp*<ɼK}2CP<hֺ',<}HH<2<L<=C2<t=n<$|E ;Uc; f W-bd8<<6T-c`=# ]zȣ; :~<<| Ju'*A<*Uz'<;D5IC= Y<^9<] 3=#<\<лpLE&;-TE93<;<;a <[Ѱ ٻh<+ϼ$<`ʼ7<+<}09 <4U 5=SݦY%n34,; 'Sr s¼<{A;-byx;N)<a=쇻i&{;ž$$<)');=<2#@&iY R 9;Wm=Zh#<хw<9nX=)F=@}w<\DS<`&<&|< ׽<&;ee= 伇EaL{='r=.<<\aBI<F=1(;=K,=GL<ؼ<܆g<0ỈfL=6<:`̼hK<^'<=25: h<ʙh;<4˼ü5b<ɍ%ɽ́<Ph༐` Lϼ/}s̻՞<^=:I;K;0 c!1e <߻L AӪV=WV +<ٝ<^i}<}0z<4;;0EUIe%9 =5I<,+IR=<Լ= M=]= E=^ ;=Ą<$Q<Ȑ=u8=lf<==,l=*U^=<3;3Z=5T<_lQ8;+=g<[;;${<"l;V μ[C:);;S@:V; <<{Ʃ;S-:inK%Qμ<;;;Z1=&=?=b= M=u=1.=~9=s<%<~l +H)?<ܽ1Vt=q=PG:t<)<!;$p<D<4X<[w=Ek<|t< ǽ'w8i*J"]]F<ۜ5Ū< +$=N>#m>#d=JL=ջy>>=z'v==T1== ==C=a=Ӷ=q= Vk3{>RH>w>\>t> +9=>8>zv>$̕>;`>!a==6=lj= + <#= 3.L<`<k;J;e?=z=c!/;<{=ηu=Ն== =<X"= N;Tz%.7\ ?M<V< +c/>mv>>>y>P>(8>I+>fO>>LL=$=V=,Ί~=Z;3<1U< <"6<٣V1=GR<}5= =<<"<5g<;WR{<ԡ =hw<1:ͻ?<=ve<8.E=H<\-'=K=6F<, <=LO==ܠ=+V=?>=6>M>U>~V>W>> >I=#>_>k+>> =z=>=!=i=aq=)=z=U(=~=>=CH=,=q%<;<<:B<"=>07>N>05z>|V+>(>/? ? 9,>̐>?Ҫ>2W>>G>)>:b>m=ZB=z=`<==<O<;US<п'=Z=<2<О2mUv<3G &e8w(=9<ؾ4=p*[>KG=pKUA=?<iCYDȼip9<\;ߙ>=>dy>>?Ėl?l @y?t8?t?Q_>f?>e> +H>) =#=g=Q)=5=2==wQ<[==; %μѥ= =0<}2<ۼ%;eI:<^B;; }<|MV>06>|e>`>G?5@aA-AO@q{?_>k>n>/]>Sb=;=ZG<<=,^<==z=(/c=^Ƈ<>j>wL>y>$?b@NAA75A!u@@4v +>2G>,F>}on>> @N>3>=~60<4;<X .n<{8g:<9߿<9҉:s,<4;=7=ۉ<:=v;m<:xUf5<=o:-;jǡj k?"@;<'T輳z=(<3ۼ<'>>#>x?j%@ +ؐAXAti2BgBC@0K@?0>>>=p=kM=9r= =^=(=<==rL>)i +=ѝ>kN>>Th>mu>F">o7> I=>1S%>mb>#B>=܉<㚓=5=H =Sm==7ຎ<J0=m===+=C=:ӻܖQȟ; 9d=>sD>}L>ON>=>dz>ԇ>ҕ>>o>[_>E>oѺ=H==6=#=XA=ZQ~=nJ#>H,>>0>C>+>Dt>>ݜ>#>v=ybX=C=cr=/;f>u=EM>\>kMW==&>@q>'=NT=10=u=h=e=Y=CK=H'$٠=Qi=Qe{=ܗ=9=C =z=v=dkt=Z`u=D;ћ<е;4<Хv:6 ;m<°VK=0'=ô={<я=cu= ;=E=6= & <R<<;Km;q= 5;w;gμ(,Ƽ$U]=)=LS-m>aX<.(G7<[<Ӻ\9;r-;=5;Y{;C<H=Gr;䄽sQu<]e(M<><Ͽ:ظVPװ;m_<~;;==M1@<(=;B<$ʼ<<ݼ<z<4=Lv=1n&y[;x`<HHGܢ㺛Ϗrʻ]<76Z<<&8k;Ut;;Ѧ,92;2C<仆a;3m:0z.0]0<(2 :r9<_<<9K<ڼ=Nܼ< +f8Ol< =u<ʣ<6ϥ=ő}޻>k<㛿=<'Ֆ[3%<16=;<+^;R<;M<`CB3G:Bw$tle@;%$#0=2{<\=[?=<_<% ü;c900Oͼ<_fh86ȜtIKc{9t+Ə=-<9ejd<]R<>;ZY;kK;"#_v4"޺a_=$s=<1k|<#39_T< ˼Dw0=5=.9=[<=[缅u<;;p>00n=[ x?e<Tν ּBZ== wUSUbE".<!<*=F8><4; Ҁ< <m!=;ݬ=^ +n<8j +FN!k82 ̛Ie<?XHPW1;.6uC kEq ^?;>#l+(f<;\X鼚Kh~)ͼ#Ya==6= =_h+i,;NӼz뻍=;aǼ}Z;2ȼe<;l>0<~Gu;[-;s7~B +w<J<`mhf5==$}MQhp`Jȹ; E8D>g(> ==-i+*{ʽ"<|c1E<u <*=qi<= y<,:z +:>#J(;nĺ^=*"=bY<<,AAfc ;~Q:%<ʸ/P F=r= Uϟ}μǀzc 42<==LX<ゝ;7]1,=Yc~p06~<#H!5ۄS<ü1:{Z̓s=2߼q="Q=R|<)wIV;C:t=2s<:#2=V+=Vwy.ԊtoN<;)/ȼ#P4; +9o<]3<߼i`=Z!6=:<n:C =ќ=?=+=6e<9= = *<}ڻS<}#G;b4<<`⭤<8 C^4T=̼}|W#<$SX? z@;P&h=:3=ޖ<8:k=Qa=Zq>f>zA>X>{5=dK=^=EN=;W:]=4ܼPh__(<ۓ8"<(5*3HQ;d 3e<eSɽ9ε=z&>sS>? +>Ȗ>QX=>b=;=V==;Z =V<+>R=$y:c= o nؒs;<&H%S׵<6]8̦ r>Iio>:?I+?X?>+>`==l<=I+={=V<^$;=V2=&=Y=$= F: G<$;憼8<; p';X׽[2>x|> >O>'@>;Ö=Yf==R= ;h=Mz=H&<= ; ;? ;N9fyj <9L,:갘~o=Qm;8:}EԼX<[OF^Y# ;l;(><-<(I;^=R(u=> =]q=M=VYÎW.1~=x8Fh iXYP<ĺlǛ#pWGO:EڻX{y<#<B2=z=p +;*:<#q<`;YҼ2=,dʻVμ);YH;@\;[=n9s=I3A <瀻<(?<(1YCziD\T<лI I 8<)d\e?<;9<&8<\<Q!<%= lR<!=-2tQҼ ;=NCk=N j<;:1CXt;BG<<<ӻD<&^J=I <:9==-<^- W<:q滬;@,#<Hں=8ꋻ@4Hs;3";?;e#V[̻w ;|q<~;;.K>;|co'X:(R:W(87;;_8:5y_AJ-:{֍:<:P_:NtSdi;!qI$]";h;bdỴ ;%k=:;/;D}9ў'λxۻ!< 6dPT5?:Lw::rEv;(;J;@!p컋w;$<;D :c@;g016l][B>G#;;Edһ?P;~<\EScj?T6y:{;< <,0<@͞;p8;A:;;%f +)y;_d;v>91;:;4L;#f<j;p +:(D]7:;d5:ibf`ݨ6{ݤ;}Y< < ;eQq*|/}ܾ9 +:&;l4[azt` :=A:;`Vz-8:]:6h:p;l`;K4;+;;G9)^t9HE:CKϻ"K8JM;9Wȼ0N@fr;ZÖ<g;{YbҒk;\c<U };)u&<YC<<.k/4:|ؗu ;63;;SBb7BIuz;e; M}ϫ:n;Us;: +DR9#m8޻"V»!;T>B8a;3;;Z;;<0; ,: +m;3 ;\5<$,;W<#|;өܻi};);*{;p:i<:< +;q;y纏Y:_f>7;H';Ci;$˨ɠ :nm:;u9Q:-:2_P3];;;;<#&; w^; P?鲻{ۯW +_vȻO<0[˻& R.A&4w:':e]#;;TÒk:6;B^,2\vT軗*YP;;E,;3X#8˹s/;f?:aRЫɻ9y);e!<b6_ề9N :b/;g(;9KƼ@û\왻;'9;1\9 ݼU=F';YL!y]Q{.85;SpEQŖ;Y;j9s;EE;LJ:td%Z{ϻeV4:̜$;<3;$; ?=;ӛ:yl+;*;>;^: X;DH9`<~:Z-?:P1,̐-;6<9Z:";ߨd&$9;;=;O $$ 廀 +K:w: ;A;49;'`;@`]y;Xg;l;.%hi)…;T۱UD:;CLúy:WOԻn9j;5ɬ .-:4p[]0V99Z|;;Yv"5/KZ":99Qd*9֬ ;;XgD毻;׺Iq:q;k:9 ڻH9@e:_̻c*wvټ7=+?(;!iz;\<]<dṉF{6esY6%-";;;zMu]::$V:6hֻZ;:l;u70<nx;y;sAY:!K"c;'-^(6;ħ<(6<=/:ƺ!<:;;:ud\@?5:PU-:vkõn<,l<[;;;q;C;=:<;Ǩ;q;xyӌ:b;Q;m;JՔ;ZtK|;];&9a9wﻋĮIw:(_;0;[<~*;9fؘ#p;Ug:s9syNz3BUVh;{;;0V;׊;k;Xᇻ ;8`;&)*O<G<~»;„序;'Xº9z;rv<<*n;;<&;T82z<0;;+:yo<e<+:|9qZy͘XrLŻQF:@;9,G;0{:\:;jxRkn;-[vN:W;R;*;Y!;KI<1<&98*9,㋈%;W,Qi;˺7m=23һջoǫ< RwfJ;;˕ANϻ۹f;k;".x<,x ;y;b4=':RyP6dcdYNɻ55Nأv;)¹K I:a:Æ +?;A:ٵ5;w ]$:;;m@<;9aH;u9ݑ; ^:ד<4Z()0}'4sƼ&"1;XRYƻ + XW&83CnO;xŻC7;ؕL9Ҥ;3*9c˄;S1eN::,^;0;J:N?(<_cP:XfMR';" .;3;.bݻJ/cN!:v6;92BTIA>I:U:w:c>; ;Q:~;9q۲<8كY.D99LZUļ ۏŻD';<{;\'\/0W;n;;<emŠr;o<@8; nF;.*J;(";Ȏ%:ҼC/:ݺ3Ufj[%(d"\o"ghY仪_:g*:i,ƻi;d?'m7;6;Ƃ;;Ԧ< 8`^%Ӻ;`;)Ys뻇guG@_%;pR;%;C;hC;:ƒ;:V;F;a: +ά3劼Dμ޻;_<I=qo»/'ĺ:i [jlD:%;z^:(K0 ס"bXs:t<1Kl;'ۺfW};;|;x<:3;n,:x7;T s8w^;=MƖﻫF5ψ8g:Z<M?9:;a;?ۻ6[v;UB;*; ::"Z\Az4WV;F0;UҸ*Z;Z ;^5~gY:٢e;Bȑ^=mAaw:*s Ӳ~湆 n:-A^̹ԊջD,MػFW¼Ʈ; ;<<( DcʺZE @HW ;"<*nY<޻6$* ;mO;H;;o:̔{6";{;bA%;;/_ +(!ԗ;3s;EWs䄻u#u;䅅;zW;<4;Rܼ +};=Y;\Lx`Ԧt;z: sb;0.}JW;ZÅqñ;ʻ57+ 9X<"u(} ;(;߻;VO:C:R8=ᇼ-\kMAI~L;$ + ;:mj:!1z#KJ;x;Xa;FAe;};g;:U j/%n!;#<:2<; +hm;;z9;X;WV;;n<0E;5<m;7<#P;rV;J;ٳ:ޯ^׻au;ۺN;ߎHGsix< :$Qhrލ;1;B:}:x;9`;?lȻoq>X;'8 +&;*(4;'<axRLYׇ9,:}OlW;|.;q໗w;e`ж;; ;rλԒp|sN;p=1:F;Q:^;;0R9^6 @:c<;F :,D< z;" }:E:ԹnӻX,;8[D<;2;4o bϻzXu;m;5iW_hFI;C;J :9YE΋;};ź8՞G/a'ܐR;;h< !+;Q+EpXb&;^;;; qǻ.X%;gO:A;5;;8:dμ:u:ʺ;[;<];{7h-qлj{:kt՛*ͻC_P;P;:5r <:;":$c; a9%0;9,;K'Z:tyxIJQ;;Hk; $; dH\;=`;s2˼2`ʻr1͟)|G*xQPMKg:a<(;p&;>; +:.;T36;;62;v+*#¼6;DI<,:WX6.=4ꍺ=[ҹM;;sJ<{f;~M<Ũ:><;8Go8Y f:&ӻ rݼ&]Żҫ</96D;6C:cN<<e:5)|:;USlڌXͅW:9wfA%;;B:ڽn;ƒ;K9[Kϼƻjlf;;g<&*;@xr5k~F;2;`:; :::<K;g;/ pix;h<(<;r;?q+;#z;1K;( ;;K:ѠM@~;:d8r``\7$b 忼37WriRY4Eݺ [؜;;`A#;K:E+Ԛ^ +s}oP7}* ջ={`κr%Tl-K; :P޻P;s; 0k20Ct8|v;+;G񀺒TwqGu;;h ; d;);;p;Z:޻3׼ZQMY{B{>;6j<8N]:T?~+<$M;Ԓs<';:wg;#;W;փi{?_;Zz ;<:2;O9;:,:GG;i9_=;B;#:+꺃 ;C5;FF{;ˤ;@<+2\;/93to: , +VAĺ: +QX|KCEk;#<*;:<0;ģu:; 9bՁ Oh*<'< 5d"=$;KٻDӖ;E9*:D;$C:\L>;ں62:S~% ;<:;<A42}*b;GJ%Dz;%{`;;2B:WR;я;c/:;3<+:42C=};<< hD +g?18 ^ӺܼμpL:Rٴ;f{[Y4>x;;$_DH$Q;+dhe%;uFZZ;x8:M^꺻t:;&&R:'6;b}xIN; Ļ :ۅ`b{G޻45xOM;iQ;Iz(;kɮ;P;;:91~ɻCG9;sx;K" +;g=> Qc.T9o8++;Ln;P:ݻxn ah,_Kd:S;\Y;;Ş;7;Ed;;9;i;;ڻ&;k;7H:z;+;3;)8EY*;jɹFL;zCPu~5;p;}`3>#!ji'8`j +>+9;#t<4TV';?;h:;ĉ;9; +,ں5^z:h};`GI1蹷d5v{=Ut55;;)F:ټݹ3=:~?;U;բ:-;O;ε<%b;,/cg]:k;MP;M:Et[";%_';!<>2z<&@qoثq;{;\(;E4;;Ի%˻a;/+ ;ͻN9'::7;< $əv;j ?;f<ݩg$:Nr1;<D<U<6;;mܺ c"vw;$::úǡU9piq:'ɺ55 :fLlhFn<(<.#;;$;f';Ȼ`ŻއW:O뺇;w:n25;ʺ SûdGNS.;bH:$G:g;dh;kA;s1>`ܻOhfff;K;<; ;<;:v' <~;̴ye;-};id;^;<8S:;;;X"; -R;;΁sN9j:2e:D;ơ;@)?!FϻQ:v<[;9NT;%:d :;U;3l;Y;.G};۵;;VEk%뻴;;Q9p;O;<^t n>: \"XUE;J=`g;C;A[;Y;3<5;d;$X;;<.:kmx:߻K4P;6;}FSx~m(;{95: ;J7.:7_(T;mA;=\r1^黗VySDȻS;1 ;f:R9rMM㻲hep~Pw;; ;;ޢ<\;ߙ/شSRii;;L<#6;$1;ReI;8f;M;k;"໼E.xɯ:};a;70l774J;;*Bb:b(<@q;FJ:¼p:D;: ;? ;=;<Eg<;6:J;;c(D;}p;dk;p\;<緼Q%:C;<9g:,~bJUJ:F;k#::&::.;jm;r;揹Tmn ԼY7<7;{<;;ܑz3;=< E;-r[Ѽ,*a+nZ<$s<t< + ;< +J;;;ջN`;r=`ۣ=ڲyrc9MLmN;@D<-W;:+.:ԥn)pDN;,ZS9K6/;:(;!ae Y};*H E縻鸉-D?bA:S;3n;1r'FBC=:+9;§깽\ ?;s;ܡ;k<6<1;Gݺ--FۻMft;;W:ºp͹%&XuK7&Va&~yL 4[;;C!rt?ѻvFb;W;z'm9p";;^:R;;&L<»Mmo4+:SQ;B<Zg;Y7:;P<(;;DU< 0T9뻐m;7n;:A9,ںڸ~E@:;Q<ڑ;ԍ)#м.,9;M_;]@;;@;-<<<;D;< |<2:иax z;0;X::zҿ;q^;;А;Э /mOyy/6;79;fH晻K-%1x&]#o;HG;ٸx;#;¦;z<:Q~;$A<.V<:{+<g:\_: +<9; ;(T<9$+<ؓ}!Sx]m;T: :$;9ۻaƉd;;u;&nO9yʻ1:=;M:DŽY;l-:rҼH乻%:<(<-1S;[< R9<|WI<^;J;no; QgHex?^)<,K:hO;ΗǺs Q:g;sB+09͝9@"tP"hT5.utDGL::;S:ֻҐN K:<%ĹG;ڝ::8$;;:<#;:~;E;3<<U<0<;tΖzxO;#)餼&. n5[VN&;g;p\֢\;mH;[;Ż/m +x99~5*;R^&a:J-;=Qֺ;d̰;z,xt\+[/8(.K<_V<=i< z;u^;ރ8:rIR\;;P9:ݎ Z]fai:Wsg9/:JO&E>o: ;m;|:;V;rz<+0ϻtP;ތ;\R;;\wM?D;2ٟ;W;xZen<( r;⹌;e;=ciR:Q;d<J<<<٧ ==Ek<==&=+ʆ=8=8I=<<Mk;: 黍N q1$ik;E< ;z_:P;0v/:Ł:ƒ7.:G;6\O#9`;<), !;#9;USz;_qź;nJٛk;;=k*=} = ="=V>==宀==~3=S=c=i=F.=S=7={<= m=r={<=6<2<՘<$<];-!L>G>4e.>=I=h=m6r=j===tI= +=K=tn= ?4>#>8C>d'G>?Y>K>=d====K$=p=D=XC={?=>D= <S~>OT>i#>>@>> >NI>e>>=Y.=f=~==>=~(=jH=)86:V4}{;:Q<AP:m;%<#$;;FbVݹs$;]Q:&8;ȹB9 : ݻ-{<;5M;;kɑ;u:;iy޻:;*{b;P;17ۺ"X&>F6>>>y>!>q>qػ>976>_> &$===&=!&=·=|n=1 <^=Q= +<<١{wU:ԦUaA!)l aW1(?9ط:AMnK;W:<*<@>;k"?;X:k;޺ R9;%V0h:A; >;q=M;̑ͺn 5;hC;ܺ;:< %'==?=>T>(>]>z%>W>X>.? >>>`({>? >J^>+>a=ګ=ͬ===T^=8='=.f=Bu=&M= ~=~=z| =;=O=Y>(Q>tA>>>Ӫ?xh?}D?l?h?>x>|;[>>t>9g> ==ŝ==^=Kqa=8>=56='*=4<<<<;Z-<5x<4<6 +<<7;鞻a;\_<7j< @줈;f;g;98;[u.mG/;<.I<oRΉ:)DF r@7#,7;v;ԌLHJǻ3˻ln;Zƻ!<~>T[>>%>? Ze?dR@ @Z@#?}I?A>.>>>`i>!=珉==l ==_b=<=A[w="<[<<~w<{< 1$m;k;;bl;ݠ< +@f;oo!:bźX-P +xERĻ-yX>A>>?5d?@V,@ނ:A @@}?f> +>u>>>=}=yY==;=N+=2c=<P>>Ƕ?D=?@^@(ALXAA\@@9;?T:>{>^>[==r=7=\Y=s +==1<̷9<{I4>h,>3?L|o@0 @xABOQBMAS<-@u?!>Y>>B>z=4=4=dG=Sk=<3<|;<;K֑< +C]<;\<};\'je9i;n<2}|;fpU%Ί- @仴:75Kʻo +޹.;.j;W o~…;Ix%zNL[l+l< +=*D=;<;N<';׿:;L1<9]T' >q>m+>8?@@ANAXBMB95Ap@@?>>>J>*=bd==>"=k&=%'<><;;1o;<;ܛu<<;; zj» +d7-*gB*;t:ߦe;3<U< >M3.>xƳ>=?4@h@#A)AĿAZ@M@97 ?|>\>>z>%==P5=D==:=r=~= <@3<<[<"<_<<@<_<<==t==V==Z====+|=>Vq> >b>5?@Rn@,:@Ò@@^i??*>vI>>S>Al=>=j=}==WDz=;)==<<'A>IL>U>2w==H<<%~DVo>/>U>??U\Q??%?~?? aZ>>e,>>u>,4=-h===kX=UJ=?='=@}=v>XlQ>_>=$=Z=<컁> >ot>_>>>ׇR>w? +C<>>T> +2>O>>3>81=n=W=*==8=<=wy=Wf>>==g9"=x;suBQ(BP# $;1;v}:»ڰ::Y 9S;~;|=:0_ȻYi5_J:. 9;7B;c3rH(o6";;;:s +;s< L;( ϻϳ; +Gc:x3:*<R<<-<9;;M;HZ;SE;{CC#>~?>Y>;> +>>x>>t>>DR>]XR>$===<=t=l="g==+ _>L=>S>x|>!>-&>>t>rE9>=ޓD=ϥ=O;==L==Isa=0b==J6<|a7; ;6b7;/~<Z=<==> >j>>>m i>>m>y>:@=y=R=>a=l===$=:G="N<\<*u<#'<<1<<;>>.>8>=Ŧ={==n2O=xl=jL==t&=( =)@<<<_;<V;<$o;}~W;ѐU=y ==*='=p!==o8=>1> = x=yj=X==}x==e=\<+9 +\;BVI8w9:Tt9 ;y>=W;ʼn:l56Bɝ:Ƅ;f}jF{yQ:8=;=Ne=ƶ\=+==;=h=)n= != U=4"C=!v<<6K;HDRS|48m +;0ٺ?60;!%: ;$bOsΚ;u;:ٌ;<H; }컀Jm}[Dֻ:8A;;oQ<@s<9;t:ѣ;T+< +:Wg9:ϕ9w;*w;&BP׶Ni;Y;zc.;OD:غ3;Ǖ < jǺ}L:1;H0 ;{mA<4Ӻw6R;;_,)\<70\;;̻:zR;j;0d;ٚ;Y:;>;i?ב1;U;;tX#C:y;RW;o%u:};d\<T7ۺ,w[;": +;{W<0T<{< n<6<h;Lp<;K(:(;!;b:Y:7k;X.<;;$ՂrEQ};9 /;Z;$::8:nA9˰ԺmxHyE;Bz:l];8x"պS2;&619::;;-<94<:ޝu;),;::5;CW;];Iu:׻+:~kź9o;L;T:a</< ;̼;<2;<\;B9<8< C;;y;NJ<$<$d;;G;+ +RN:ϲz;f; #!<6G96Jt;-::`{;@;%xi;to<O;mP:9<-A< a;:Ru;;@; ;<<kܭՂLZ|:Թ"; Oc;7l;Һu];5.;ȾлOY C;(h<;@;$F!;;:1\E]m.:1,<и;dL:;nuYrŜ9*9k:s;HI; M<<;ȏ<q<<9<>?<;G;:;89Cymhy I"8mz;uQ9:Y;@Ƞ SЈ;:;(<&Օ;}: W<5);Qo;n;V:2;A :$#,ӥ;˅:g_<AT;]Һ5O:t1[Mi:)xZ:>8[8I<<@<b ,;;eػ*;X;פ1C;<?:4;P;6;#9;ۻb$%~;Q};AC:;< Y;-Y77;C<)90_;g;,;|]O;:5;B;vFc3;Ο-8;2 06SM;[L : X: $$wBkS:l:;;; ;Z*T4<%<Jw;; +겻߻;A;CF=;;K붼;)<6;vc)=uӼ8_T;;; ћ;H;B`;Q;E/t-:;<58^>:QJU;IF;6;<-;@:@<_<:E;33); (޺~ ; <8 ;9J;$4(;$<;w\;%;V;A#;͈;6; +;\r;<:g;:3;;I:} G;r-;*;M*:Ur\jֿ:Uk|s: ;޻;k+r;XM;*7P76:",;»!\e#C;g;< +<%+;<;';Ґ:a'޻\S$/@<IZ< < ;O<H껤A;;n<<*<7K ;K:(һ<O;GC;JH.==\}==HH<H=X:~zH"_,;e;LWrJ:8o {Hg;;gr<<;s;v;n#f;A<[#<;80i;0;;ak; < ;;K<T;X.ںP#W;(;T:Լ;vt;4˻׹~oZ;&::h;Y87;!;< \G;GOCO@, ;u/:|:P&Vi;ȶ< 9;D3:;Q{:P<=HY;:;Po;CG;u|:«;W;x:_ƻC$;A;M@:gܻEӈ듻?6;F<=-U=V ==S_<z;;:𺱊ɼF˺<+#<:W:^3>8a= =.a<{;㪆<o3<>v<2lQ ;;;;fٺM底^2|:Whf<;V[:6o<`L< +z0:j*;x;izA;)o :>N1`>=O<;+;z;A;,#3;/G:䬼:f3So< R#^&;:m;?;; 80:B`3:l{hʺQ8i߼:b;q;@Z:dFH);ﺉ/"k%;<'9ugH99nx;پ;?e:xZ;P;A;D:0#H<;?h;M;y +<vs<y==2 G=;Ah;f;uR=(:<(>7K<+W<"&p>JL;;lm;F;~;% ;u-ap#: [-;W;l:]|:󠤻 9IxM "=ϟ=U<|;f<;;:_;;,$n8Y ;7;،:3<6 +S[:/1<(\<g;Yv$J_M<n9j:?: +9<{< h;~t;Ym<;w9-w;;8BtżO.9>\i;:̻8B<<)X<];F}:%8r߻.w7*z;N;^';A0<;aC;(/5;Z; bλ2ŹˋLڵa;͏*:҉/Rs ڟKjѻMd*Id:u<-0< `ӻ-9:bU: ;*» 8VI;/;׼DvW4NZ;;k:XúQ׻؄**;;E< ;x<%Һ 좻c߉;| +O;|:~ F<y;Lj;+[Q仫9ֻ6:oZ{&;r< q<^|C< w;;;(;|$);;<Q;;n;eg< < ;q 9;.R/׻&;y;u#<,;h ; :7ݻbXy ɼxY:g$ݺ}ȼ1.R;_ot˙ULY()p{:4;e:~>팻rP;R:Q7،:z lUwbL9;3\;t;r;q;! &};s;ݸ9<&Ѽ5FȼQ0ܻpR1). ˜nFiyɻ;bJI@;J@!|";048>#:;La;;+9< +;MG;f>9ZۻArǻ(AD;U<5&;>:,p: +;?b<(F<;;A;@:;!;A;(u Ի:>%c;'2<;Ɓ:M;L:R¼hw {;XU;;Xs;;:r9I>I;ʺ/tmc5VW3<#ŸƙĻ!PM_{l;;@<:]2;\;&5Z;Wp;\"Ļy(cֻ/; :쀼;;ӕ<; K;`;[:(r; ^h+:;麊:m6|H;ƻ0; :"BZ<){4:޺;_:S;l?:=;:;N;%`ع;+|;y;h;z;rO;:W>~%Z-:jۻ0:hI͠~u;c<B; ܥ[0bM@~<7;xt;E;C; <\>+<<`\+$M>W4>ry^>SP>=3=h={=><)?]>ݎ>.?zq>F>Z?==+=i=<̴ev_9;B?:q:7}0㶼\ ^>{?!??[> +>Wm==6=}<<}<=z<>Ze>Yc>>O>`=nD=[= yL;3U˼6";;#v%\: Y:9asAB;ﳻ>Q:sN3 +Eu]zk |;1Ey%޻;:65怺;_;:ek]wa>/%- ;}~%:#I,<::#;>A;>)TjUw_z* +F;G<9q_` p˰;;P; ޺;9<< a x;v#:_9;q< +:o;Z<{<? Ӆ꺲pջ8:#ֻ񻡓V*;/u-5:}m;;_<<,<&6b;؊! `>.=_=mG=Q=U#!; Aͼ09U<{9ʐǼ/:X;m;>;Օ +Pw; zCAr;ֺS8$;[;c+rK⧻ ;ML~hO;FJ;ͺ w;%;>:E=;"( CJp:z3x;idJ;hz)кҨ;rj;A<ä׻DC<_ cZ}˻l"_ ::M;x;< <:G:œ;x0F:5C*~ҧl5<1<9;,;f;ٴ9a;;u;7;g<<7Yfퟻ>:!T\~:_],o;B< l:tJg) +Lp[μCN8aa9!:X;vȞ8;<:=r:=I: <<2; 9&;;̛ĺݴBe{<$/::U<+޻;]i?:&T0! |P-uu9)1ge^<:#~@<Xһ+0vY;=<x <@$9AAT\ͻ^xVP&;-o5F{[":]A0 K;h< ]; M?;G<$2;fn.s;`;9Ǝ;>/; ;b ;Q<,M@;$0;:F36ؼ_8O5;n;l;2<:5;{X;q:;<A;iБPԻL.S9z:7;mg<g<;i(9l;S2 +_6F@kBӾ_K"@JHEF184+ClA@7  +sFZF@kBӾ_K"@JHEF129B+A _@ 7  +Bf]G@kBӾ_K"@JHEF129> C.AB@ 7ނ  +`TRG@kBӾ_K"@JHEF184B!A@ ނ +kBӾ_K"@JHE_6F@CԠ@`TRH@B@,A>BECD`BIADB+CSIMPLE = T / conforms to FITS standard BITPIX = -32 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 129 NAXIS2 = 129 EXTEND = T END ;#{:}^Kb;w<=K0;==շ<2l<N;T<[=UֺVB 2e=3-Ei<%5=(T<`="0M+ss,4>ͽI<#<<{{;μ]EֽJ<3<{r\=.2CF< @;׼=!Wp<$c<6<ξ۝;;༧é<_w=Of<:ח;?z~ 9@ta;Թũy<; P!텽AJ3<)=A9SB:*Y:F<ܼ~-P;_"@P<<݀;ע:W4<0I<<=?dP5<̴)BA_~:7\Q<'<#,]0KL;aݼޘs'= <`(Ɛ6=QeX<5S<)<#;yj<'CPyVL@;PV + &;W>P<;.Y=m Pͩ:m< C,0=dh]%<LQnl: bn;м ̻ =o0<ڽ<, +;E&<|4j<9췼N6̼Js>;9 <Y>e;ļjBZދ=-nQT;:m %<-Ӝxh;d5Cټb;+X;i0J_hk;9 <<2<\1<: =\ͶMAx*,'3l`<μNüt;<1<{=k;ID<K <~ns00=! ݼ<=99;66;=+{y-1as9%4U"!~ ļYh=dBk8OgH!jK{= /<@ԽnP:)< {p1LC9(Püa 2<֢+W,Pkq0?hOі2{Hx@;7:Ou֤hvEg<=v= \< |&!@K<2;yX=;=b<<@H< lL+=zS܁<đ=-鏼(ռĶ}TbXJ=qݽؒ!QgE%tDG;)b=AzK *A6<< <9V_<8~;-;V&v;9<⼻м|Y=ZXi>f<(G0j@>bˆc;{h4SU=VU<'L$2;T;p?Ҽ(T<<4=.;_8{'L<b;#W;-P;s՜~6.ɺՙ?͍3+:HCjvQʼvvb[1T<tv^<̼ +ط= S^<?O;o<)l;:q^f/Pػ .n<<8 $i*"rSEp<8|"'.0໢xn<`o=k#=;<[=ԝ<L;;:y;)dK<ҷHP%#C< Vͼ?T6Z_a@<<N<6S,%<^L =H=:;cu<ԼH;<==I{= x<kl|к<%y <ѹ6<7aS'<c&fD9U.=mѼAr7ƞC:; +l":кT9tiZV=2=,X: +TyxBzK)o< kP}*<@]<:Jb +;o=RU;Ӆli:<Q-;>;)ֻx@95=0< +;6Wk+3 <5 <$AJp;zΗ<.[;T:XOJ :=5=-<;_ =F;h$n{};9<_:D:!<<MKv<@Y;:i=<[`뻪SQe9~k"<`'t<#< +G;b=L=!e#=+ݼs==R ==?<<=1;jɺ7;sxƽ2d<<)$ԼQS9<>1 `e=$oEpI<_jn;];1Žo;AH[F:긻`=޼VEl4aj<v<PWu<]/7B=2;3=< +=T+A<<ڲ=:=W}=ʼ.n<\<üx;$E=Q=\="_8ӟtIg=E=H<8%:=V<èm¼I-ɻ+̼-7< }01<ۘi2;gI&;ߗ<37/=Z]<9 ;D̼[ڻ;<u<<<wRI=w:,LrV5&:< +Ex<-<ۭ<8j˼yuwv{>=hhs:BW;}Hhd;k;;3>k;,;}<Ŋ9<~ ,q=gDso^ ;p;<Ù=:e_< +-ő.<4 61;;=0%l =Nġ<ǣ<޼{μt{<<<>$$7C"GhD|=];x# <;翸.6 tF=W;N<һT[<ى~<=c;z;Xq=$K]#y:<6庼$; < «=$﮻B/.'B=#{o<.< $<@<׵;ּ<BI<ZnnF\<<<&vO;[`ry< +8=ue^ݻ=.;C<8;FV;|꼰#Bۺ<=/;޽[ *(<.|<= qH<'Ļ[ NJUż{<<=iHa:Q`I;WѽMk=^B; ;+)r*:ϔ<+l~<9;F!&n0^=<cG;OfO<;<Ӏ!Q<%lpC0:pý%;ԅ: &j}ۼ/pj<& ֽ-6鞼AG~=׼j <)fk;%"u<%kB| 鼰ft;.Q|;?.м +o32HK$ͼ*=C0=PX;۽ ¼C9Ԣ2;dD< 1q=އC<1ۨ ;30<%ӭ<;Ok'dcԼe= oXAhEhab:+U<'^ +V +<_@=+Z= +;,+l<ן`=,#ļjs;Vd<4B9p3$kqf<aaVVׂ<u<<?+gn9EV<<#i<-l۵L$ABO>/<μi <<`߆qXg:sn<}|T]#< #mO_ͼ=%K?t=e0=NC=C㼺Ѕ;3żMڼ *Ͻ@~<;$u_t<ټb= (28L<C,<*lcA9;{;)<#E:Ito: ?<"?=hVc;2 T=M;|+:,xʼ}.B;g w=A ??=V=9< ʏHG=i9F\>Tx%x>UkTM:0H\%#='d;);5=]8<;.û=E_麘;%Dw}1ɷ;<<ܦDP# +==N;f==!F[<11<P<r;I;N9N|<$=nؽ%<߹څC;tsn=B;<]<$;24< : .=>90;<}[4;L:<};A=vb[4=X0<"Ƽ29)ny{|<%7";弣fF;Ae>;= +BHȼ O${< s:<k14.<<;^)!瀼*/<1;W<9ͻ< I:Qܝ}$+M;Ҭq<;7)<1%=F'(;(K`;5<x<ݲټh@޻v<Żͼ>!t<^$<*(k;]+1?<6W4d<{+T;I;<;#;q>2.N< -*s<ۀ,[;j<=;0E}I;; +#8b;Cr-̭=h}=6:Ȇ+ɶT[:6 !<޼le4bAҼvT!&<+Ƽ-6,: e/.=\ܫ<1UI:(m9č<1~";@uѼ_I5<&$j㻤Cw;ƻ֟+A<&I;\>u[b=T>溠) S!q==id{n;/P=U=cAN<<:ߋ;Cj;o˻PoƑܔMI\y=KX;Uv?60<7<(= :<'=}%<<]J;W+\;_a<4$ < >~D>rH=%W<$<# <<g;i<;s;±h .ؽ½H<` = *;€J=7c;½8Ƙf&f{e<)zؼ +:;g);Tl;=> zh}Be꽀Ql;';ok<<fv;;:==չ<ʢ1=!0;o9=<><;<=]= `t=t=y=Dy=D ={;ÛO>;Í+<<ܢ6<<<4*<݁SOe8s;p".V9֯*=w^<ю<}s#=?6<{;r|rFxR z߼<;p(Gh@_<SIʴ;'[=I= uH";\;.;)=`9`<T'?;-=2ě<` +X`:輗1>v,%D=E~<<2X<*60ne?,{<>x<<y<*<p<+<* }=E <=|, <=_dX+=~q~<kDoڻy.oܑ΄R<޼b͖>x;*~S=.GM 6Djo"<; "{O=.?̽H<=T伩Y=;˼T s(<;u;psQu1;pI ɼ@*]\vd=[͒+%]eP<)1򺫼R;\<;.=vǤ<ׁ=. < wG6=)<张Ƽ}`{ D=YV<䐼kx8sS a.ǖ@XlFea<ݥֳ7B;Br=;Çɼ <󦼄x;,ͻ̘<9/Ͻ;,Y7e=+G"?Uk,@n:".6;+*<웼>rf=eN;;sfA;4<0<`jf<<r;5= Fm=YR9< +6?='==GSMd!<3㻃w;d<<.V^= ;8TK;(B݅<9<=r0Jjx8=.!Hp9U +<$=rI<_;0CI<<<bKD<$I;ɼ T<K92<Ƽ'K<+<c;Z +6 +־K;a<*qּ<}ڼwʰ?Ge +v@=n;|+d/.JV*geɕ*/#=[S<F;pp<mA;/ü} >W >==W;(pss=7@= 9e/_yA>fW>8=ϓH8>)>#>۹==;<<=[;<(SM<\;EX*սD;r#8k< ><<`)= < N&{=w'<"\< +|<&:K$L ½⿼<<'ļN;y(;yo H;3= +F;U+^<=p;;\=%<R<+()@y[=i-\9 )r=`i? = ű;:Ke=.zw͵e+ =] <<~9Ձ/&únȼ伩C!ֻ*;)g=E'SX?/f/Q<1<?<;@V;$=vR=SF<;)`e7FII=[ݥ={{;,e~;?q/7/x +C<*B<<D<;tni=qcjC<<Tw+6;爓<<^<*;%@`6=Xmֻ͈͑6ڼ/ɼ;O=R ;;<)Ϻ@Ta:—)9 <MA8/yo(v :VQ=gx{5fO<3'lTlAop5<>xi:pԼЃa;1? <+!⼗Pf:۽=`P-=7R<4<o9OuPw:!;(Ļq*:Z=<`&x'v<ĺ6aK E<*7;twi=,0;s9<<$;jWd>=*1v:м<*dwHv{aT9,A5=) <;c;(jPa@/̼.8;<缻z=̒)?+=7Z9 fn/ڼ/<:xS_T@&лjD<.<(N) G:)ƽA<;Ck;3r<v*:y/'-<;0e: *n*vʼ c:٦wfټ@~cY;ĸN<'λV!= XUŻԦ:)eC=)=<= +(T7<ݿg8?=uU><<u1 +Q3;/ ;=Wh;9 ;vyJ<2O9c3/3} +c9ݘw뤑<U8=(s<*t H <Ѽު<*B[:-w~<7;i=<|Qdf%::]s< R<;Ëe.;,e<ݒл:ǝ~<.;&~N7%<*Lռ¼7=;<= +QS Am<**]/wqx=\&XY=.<+W;9D/=p+@ҽ*<d;-mwp<)W;萻b=<<{8w= =gx)-xK=`+'4;r9v<7< ␖:Z=p߼RDi=*#-=EgJ9[[<+n.<(@h=.)/62&j`<➽STM<ݔ;u^+:ǯSh(e蝻Ν=<`I4&ۼS@/9ķ/H;Ϸy/X-9qx?li;|9= +ݼ)D;|P;zý!흠QKS=]@q?땼0;6p>_5> eX=D<=*#V'><9:S9<^v:ȃ +A*5<?w9XzO7<`;N>$=BY=? LY=K<=<w >K>S=zQ=T暑RQü@q~R<ˤϻܢ<ˆ;Խ)༻e ;`:=h;+=.j< H;1'g<6QJ<`dؼXvAg< +Vʸּ@IT?'p(>=4<|w<=NY<S׼w:ۼ=34.5<` x< 8;4U<= +r7<_;;P=Ƭp>l>K>h==<>B߼v6V< <-y޽V':ә"xS8==i< ;;<{<什ď:̼v;Xk=@";꣼?<>Gd-v`<$;d/<=;9<];1zu;$;z <d:/I'T<=@<499@:od;ֵ̢Wܼ/=5;~9ԏ;+5<`"<<%<:ռe<]|x;Fxbݻ>=>Q"/л6^:Rն<;-=*bus=%׽!n6>+w-sC< uE5Cs=7L<&뼩J=%UlI=.iĚĻ?/i;,X̼/;t7?<*D= +<=`[̼*<*<7=>ޜ`$W;{<<μd:r<~:T}$<<<==/Uo?<<<;Á;w!=%T< ]<9׬4{8-q=Z<d=|D\<, + <<j;z =M?̽* --T5UY<)z=;|77h)t-B.<ƽ8<t=<<<;-ƨ];-5<9a+;x͔,;x< +E Ƽ-wP=R?<-ӽ;wjټAp:ŧ<=o޼?%QQ?),97< j(<>H<2_!=.g;3߼=3hԼ9h}< "<컀GDTKT*<+E=\< ;{vZurwє3Q9G[=2<*Z=*= +4;}s/ }<]A.V<ǼDI!!z۽ +n8J=Q!;6:8 L\n~y]#;K,r;ǿu<0<_Oh35,QT8;}Vu=%Ѣ7-<+¼t=%ʂ` `<<-}=uŰ<;]=j<><$ <̼̔u< += <,b:Xż[ +6̛Sh<=X +=8 <\<$;2 -&&»Ek;Aڼt8,G<_ ?`8<4-<;5; [;z]Rd=<IrKi<:qN;CzI<=e̓.Ma-Quu|ݮ<^?<--<< 2=8&D} ώwռY =/ؼ6x<<:R=W褼= +==%=n(;5Hoە:ؒi=熼=x9;<̼u<Q:i0= +{'53=% <R;3<<𼺼?1Z +W;Ŭ[;Šɷ=檛=\nǼa`<tu;Ǽμm<;}=yj=SI` B]3:ҒE=!a -/Ea=櫌=\p=N}<<6[R>Ϩ>r=e=JBütu{<>jнJ7";}K=/<,v=8<B>ú> ^= +5<񻣜_:1դ<՗<><g= D<,@6=N==.v;vRj9Hm<<h<OA(>?=.=*u <#;~e< >==8 :(<<[:̤< ʼӼu<6<;Ɲp-|v <ޙ<:?;zcFR#/͗<9dcnR;.<)O=32<¡`[2FAcffS>2<"z<Ӽ awV%x=cH=yG=Ng=g=3h=wK_=d<=8|ZYH@;膼b<@<`;vg #;| +Ҽw9ݙ.[/1<$ڽx=E +,=<7, t;==k$ⅻ:vj=sI_=F*V +캼,U</ =8(o<=3ػ}7<޴nڀ>cYμּs[<NU=sD;3_<>CQS$=*D;20Ƽ8;K;?

&`7>W<*>$>%<0> P=I=ſ={=r(=%{ + Z6d<%) <=Si<=zg<5_U< L +:Ծt =}H<KccW3¼<H>N&">/w>x0\>>Zm>C8>$=`M=i=Ij=R <ʼ͒<ᕻ:_=xy:\=<A= + +;;ݼ<:3D3\sw̺ٙm<{c+;< +/"z*q:`c|Jm]v0*^Z>'1?HdK?F>0>s>^>GR=a==.d=%}<9:̼=1;,M٫]%dJ3<2Nb`y%7;KV=?S?¦|?&?&>8>BǢ=迀=k=>y=`N=,=`<–e3<=<<< ߩ܆4lS R};Lf: =/zn|6nud`=ȼ3 ߼<ּ[=<vm[<+|= +^u<E=.]<L=wjƼq=X>(?3)?T\?(?.O>">C=Q=x=`= ;<((>ٽ&=ͻ,;/rb/+;w<ԩAVwj.;vX<Ԗ;v&;;uk=X#wz +r<»{.Px=3E<k<d;4w=<,U?< J>Ln?$?? 6?_f>߅>$>==3$v<`<\<=A;w:̨%<0<6b=9T<Է鼩:M?e?nuO??O~S>V>C*==v==7=W:9 +-9C?ﯻ<9w'YK<=m<*=)\S<b>5v?y?3^?>ƅ>*=@=<<= V=$ϻF`={`;)=t;8(z +<w<å+<̹(;W8<GJ<ּ + ;\;ǫ,*=8$t6@-<ɼ]<$zx>g>ic>>=q=f=W< <­zd2=<:꼖޼*8<Z<o< 9+#=:H<b3ABQ<+A^l<>q& 뼺=in>T>0>R->JD= ==%&;T={߸=%@z9s<<)= +5&©< =.<*=Dg=n*$<>OFj<h<ՙA1vqww<*< ?;&;`:!<_^;^<>湼.u<e#{1B7ދ<;<=զ;j<:؋X!==;v>(==\=P=7S0;x +¼?;R/<'S<Ղc": ; ;4gڼ-<,Qe<;j*kb<>ei<{.=S e=wfK==<+j="={s==<|o;N<<ޭq<Փ+0;{kMd4!W١Ǹ8 EIɳɿk;;< +7<=t"(:L=!=Ij<&K;~@:<,<,(,<<ޝý/ e:>9<Qs̻<:< N;p<獚:;>Z=%??XuУ: -0':Y&<Ӟ:ռ\bA<7PsVh=.:(d ;Ҽh=*:f.&q:𻤢===W˽:?[:8(<>)p  <4UvMH=<</:c<=* (<ǽ!<=˽j<-aA=,<-'b2vռ17*tȊ=3.<#rżR4R <Ý11a;Հ >}<*Qsm<Ֆ;T<-Dq=I=eM=~=a3b4Nh;ջ2o=^W>=b<<k;p<ҼP;|t6< +~ ]<:˼,=:줕?<^,-.Z;43꽄Quº<Ē;<3DvΘ=<;c!<+<,U R= +t<=K;'[++8=W`: '°;2(Ս<<vo<޻B;5C;Pu{f;5luch)<7:[= +,μ ;j;_\<,VLb=jA,r{\IT:<畼btB¼__㻣;5j=*iż̛1:_<<+Kbc<<=> ++Q4;}O<><Mdȋ<8V;3+=E- [. ?<ڕ?cR;ᠼ_L<H=*Hj<<j< 7<:gPD=Sټ<~<̻G=U=3\JG`%Ù3=I|;oƼ𴑼sWн!IE(:7<vl<#̈Rs,j~;Sv;؃Y=nz=i=w'==<<; ;ѽ%<<B:Gkِw,59= -;N)cE0;<;E4#4r'w;)Y;w;;ށ<;40;dA:I; +ϻK;\:q<:RJ;ݰ?;{ͻ141b;?~:T;Vػ w:Su/;v<Һ0>4O>L0<+J:7 L;;:Ur0;"; +.J;<9XQ;鼕" + ɼ(>:d圻؉W0nk9>'2:Dv:Uwv- 3O +ɻ%I;?(;Jޘp;V;<";/G1:yl;;(;<@M;1:8;X̒`Ĭ{ =_ ':˝ls*[ڻ6ǻ2{/;YZ1"RT+(Ӽ-&;D<;;׈;S;O;e<%<<<<=!Y= +7*sX;o2<Í<~<9 +G;v;<: ;HۻDo#97;9ա{ ':T:`;GO};Cy(m9i<. +;X&0zT;83;-~;=;0M9!9à:q:Bod:0;@h=:F;g:-o;Q;FS(:|;͊\<{b;<<5G< < N:AP<"&;l5; <9u<;'c;c;.y;ի;а#;H<Ww;v;B;%o':r;*:@a|_p[; <;]rf9 +;;V%=;<:K:uO;;0EFUϻ.sH}N!);h;aC<g:Ҋ}P<5F;1[;lxƺT;s5YUT<ٻys;8^0<+#;n:] +;Rq;F:292ӻՆ:9+Z7V:9sZ':;W+bT_":YM;;L:sT :$d:@;:a;; +<([<`3;@;x+;69\;<43)]>;׵3 Y8TGh_ +G(0k^z!9<9h:/;%<F8v%:۪:J;j;' ;. ;z;;x2 709C@:),@?7< +.;-;XK;z;$;:(;I8b\2o;2-ϼj0 +㻭; O9*; \;\U'.d|y;"%;y;: +g ;:;%O<;Ի5:;0n;:Ո< Gs o!^亾;F'54FX;G9-;^U%;!Pf:=&;ө<&#l;s;7f;&2<];Zoב,<"1;ݰC;m+;4;\;Gݺӽܛ8;e$=;/;17ۧ-:ڹ;5;+%+߻M*ǻt<;D;>;.I@ydۺw;^u  ܪ(5;Ts:e:;H;;܄;WTc< ;w;?Y ;;;*s<; s;K:О%T;j,:Z,;6x;tW96Q<"JJ:ۃ:.<`<\=%=Y<~K;P&0vṨՕ; G":13 +* 7 +TPWaؔh;4;A򌻴 Põ^0OR;J;;V07 W<;;G6;8߷kۻgSZ9ĺ{zC;9}; J k/\/Z;]@;Q;/< 0;x*RݹGJ;u< {~;Jr;;p#qjbֺ a{ZDT;@;(C;sue_|:0< ;;庣>;"< +K;/¹/I;w*:񺸹J(F:L;C:v;~g;ua;jd;G9:Pu;t;-beڷ:;;Y%;;;B;H:u.G=:Eʼ:A`;<~ ;է;;;;Or"_`;X;%;3;0CȽlr0;cܑOM|<iј:(qU:O;y+:C-"; Vab@m?;y;C;e;Np;1E; .;v!:@FNsi߼yO:筺yʲ?:7::{Ԯӻ;gf;2:;͗;|[h;m2<:[g6CUO:s:v;>^};׈z 劻һL~;04";hK$b W;~]O:2 4;WHgUzF8Oƹ(>I<;N,-!Ce:w; n8< ;u;Bnx ;W<x<)2;<; +Z;Ռ;b \;T= +;lm;J9oɲ*;`U;tK߼([;q=k0KU:0cLۼj<<;Du4H`Q`z;@Tn8Qٻ/rGn;z;:Ϻ0w%;0;} +;S:d;;;ҥ;>;|L<<{@ƻ><n=?-y6F +KƼ $/S9S;ff;)9;U;?l;<,<.;u;N<6,<-s;Z9)2:RU;;ڹ<(":ֺBz:&: 0Ǻݫw$g5MX:i;z;fuSKBRs#@3D:":t;b%;;;;w;k: |:= {~J :{F +,(_:l;E;/RĻǺ; ;;;;d;&2k/폼4 1y:M;;\#;N;3(Ữ38;&s=M*;>8#-w,<Z r+qr;x< N|ͻu"BugpϞ; +8;E<#< +z;ػC;azf `:" +?;;/R<!}0}+΂:;:ơ&:;kZ<(2>EU=_==;< +F<C;#ŻJ:{ʡGѻl\;̞#\ûg]:yj/7m\7,$.;;R;KEc\;9nλ"H;j ;;Ns;$sXû`7 1'e̻VK?>:n:gz@;;x>:79d:S;eb9쀤qQ;N;; < +[;fБλ0;r6>z>[==<<7;dy7J?;Z4Z +ȺOg7;i;)W9XpJ:@^;v; 1h>3U=== +[<<@XVJ8;MQ;#$P:Eڼ$G<.R;;FL3ӵ1,<<;u;;;Q&ԼỪPF8L߻:O\²97>'#Cұi[q;<< +J\:08dfa1ջ} κɪ|;Z:fB=,f<{G^'< /<Ĺ!G;hPB&⼻.;;R:Cs*T0+04>;eA<;+J,:;|;1a:K;Ω;;:05-;;psߐLÐ4[;U;<:;;t;YC<:P o:;;6:㺋`Ril~:AP[;-eʻ ;-c@:T+I돈a=;T66_?;:;:rr;C +ȺDQ +G9?郼;"\ ++(jilO'g9Rb'з?k`:;Eνx}W;|;0.;[p;08޻Q..;=?_R登VzG;\9: %FU]=;*;;&< BsowP :;=7<T;ݐ7 (m;Ѳ +ZMƩ9¦d;S:r;iso(':;O;s;zt;;;73U5(_ռ1һ3:黐C;x););ܻf] λ9<o;"e;}7<<@j;Qؓ<;SλЭ;RA$:\v;J;l79:@:8eQaHog̈;AO;#0;[@<>*<';Ɲ:,; <}<:kBF8;] +7Jջj 8;n$?KxIz2< :;Mh :;:NκF, :WkhC%ŻSK3A^:w( .S/+;S`:R:8OP]$vJ:-V;;W5vMj* =3øCMoh`֥-lW-;=2y;A77HVк[;<;Fk ˼ܔVBvaR8@iD1|?8;;ARq-B; :;G;=M<Ͻ;Џ;H9Һ@YZY?Mкla;5o;;;B:y D +_ຒ;={] 7y2;'{,;H$;;g;ӿ;(;N:Q?< < :x/9y7;QIg-w::"f.9;}~軯}\3;u;D:ʻ + sû绻)9չ&#+;3:CӻXv%;ڐ;}#ORA +U;45K;oq,+;e;%:.@ǻݺ@K;o$:;q6(]*;r;0;;b;,;{qMF6 !5w:q/*;&R:a4h: ̻d}c^V)Rͻ:;jG;VU;O<< 8<';ȅT;#f< ;ϼ8:r;·;:;q:ǎ;<"JR𨻬9")8׺ջ+ q;|I;F;‰#ayPTл +7;12;90Hպ.jr;p;T_oz0<:xb&X'׼Vn;}:};@w:;)AW;K:X'ϻu;8;D;=:ǻ;R_<1|: 쨺:>;:vw;~s;+$;$o:o;G8<;rb0s:^H:0Q;ѻ:Y;;};EE@!;fB;UV<NWj4`Gȸ3@f b '6ûغg8cc&_v9(:B;$;jɺSQO󄍺)&:Ⱥ}8fL;I5;#;(RZn/BT;<|<;;n:;:V;":DKp2!H0;]0Y;Y<,;aLf;e;d]<;Ղ#<"|<<;;);T;uY;4y냼\;Azm;")('pl-9,,9bj:ɥ;c[;Sͺ<;8<"[,<(;1l;t];Gƻ!ZRx%?;Au>=3:Ԯ:]^;t.;:[!Ũ/"3H:<;i; +uP;T`fϻR;4;j㻛Ǻ&;"_o}= 9MNk֯Kd:i4<.;iCc;EyeH=}"1d;|!;X{L9?f::>VZQ2hy;;C?`%D:փ;dd>PA:;Os:!p^"ӻT ;Y^;+o>y;vR-<G<+<E;x绮ђ:+yAf[ͻ:2<;t0r+#@stA;HGY^OkMb + :$:,WP;m;2;&\P;;;h;GDC<_: IIc}DO ;s:a1;;;k;:qfo;G ;g<;&` :b9FE)k 4:$5m!޻6#J-ՊN- ;qJ;U[;1 1؊8e);:?R%:&ǻnڻ8U:-~@(<7:NйQ(2hk 9;˓j +YJ;;}}:K# ;x767lJ:{c:d;'?;Lc;/>;Ԫ=:l;,^ <7r<):*(nҪ: +Ǹ8M⼻x t?Xܻs:Q!Q滇;}(- +9;xG~6}9YƊSBջ黢9_);,͇:':f;?;;\v׺@i)߻o==:3[;;M<0;]:s1d;G* 9غTQ[+C(QaJ킻> P'S@#DnBqM.L»п+: ;|g7X\*P9 jf@ջ7F:::GӷƻwrL+ϻ;9;;k#5/:@ :9;;K%;%4;>:ާ:nϥ; ;A;y;M̻J:< ;7j;Gc|m"ѻ5Q;;:dݻy׺u;b:+!:Kͻ);=:D%;1V<@;sy8;i2v]ͻ/fB;:]:iߺ40G#;RO0; +:+);>*:/|{ݔ:j7;d;(0ظ5:a`G;UP9g<;%F)+:-;_廙(N~ F˹";1;;i9; :7Q7z]g +ux>] ;׻:j'q= ;-ġ:ǻkG;I;I, k;]:9RBgŌ͑Wnr(;D;V;F.Ba c&_;y6:o;nC ;<ѻ)X::ƫ;f>;|::Iw=5/j};%;;h;܄;*ٸ;;9̛oyhxxwE<R< 81)\b;3{|!PR&zq3:r{L5^- m1Df:'k;;&;ˏ9W8Ipa;@#s@9;]9{;D;|5AfBZΟ;1;9/b;@駺QJ {M;\;;˟;k;h;U<w:غf;OW-8H{););6:gxG;𾸼xA3zxv+:;9;vb7:*u<ʺ9;껊?CmoIkbTHz4` +ٻػNo(:*:3G^or&a񛻌껈3޻H*bhTmЊ;9#/>BE;#<}{;ewNcT;<*-K; b;<;߃;F<:F<+9<1+;:ꤐ; +;$۸;;<f;jn¼;|;SCoP97%;&;zѻW;}STD:&qR;QVRy;1>:Oۘ8]x; Th<:?;;%O;;:3j;rq" +»k ;'%};'VҼg7#;\:e(z:;G9;/o:ZJ*: lV;WlIHXݦo`/ ^dwQ]8:8 ;J}J;);L8:FO; o<);;cmM< $9 ܄eົ5_q: h;D/;wu/g*:g9u̺'ڠh +:Ji;{9 bp8(U;a;x:;l ;T;8B;Q7;׌+;ωf:l;5;ᵻF-FA;]";Q<'+;7;^wAjCv*<u; / <:oUúb;d뻋8HMNS;395=Fd ʯ^`<xb<-:Q958ۻ[jmT1<5h,ºջ.;pK)u[;F8d'Nلuȏ:<;;9!V};`;g`;|;Oz_T:;;؂ C;r^; '99uH{ۻ6Cμ=U;@;4;$ְx;U;;1; %;Ϻd:qբ<:]%:k9NXz Y 5û6<-}׺޹bȻ;2 ;WXTdлXbxh5Ҥ:u;8s;׮:—91,=;i<T<7; Q;;,AH:\9;1;O;6;:Š;;y:L&ػY +P9ջ + |/3$X<e:Fj yD9Im-21;&#v;j;_Ѻs#87ԺDHZ,؏;`};(3/ދiNE\7h޼;;Ww$.<;^;(;;nk4ѻ; 9 +ǻT + ՟c;Tv;!DܹB;{:; ;:9)#;BI17(;Ck:@;!;; +\<6 Z^<;!9k6H:&;8;%g;;W;;F޻nN; ;%L;w|;1cڼ$2!]pr3979Sqk%~;;ȣd; ;I;<$;::^˞<e9I};0;Axe':{ +;?yS;E<n;Ÿ/&-C;;f!;; Ӻ|:4;hƻ,;;q;Nu:I;2~;F;P0;AfŲˉm;twuP˻4bħ׸M8<3yAw1;}4Wj;%\TEUO;NmлS %IܼGxom5 `?%.:S^軒y<Z;?u$ \:x9I +;; 86:G&1;(;O< +A;9O+;o +:6FtS 09;#<)O<9;< +&;%kk(%6l9B4;;x:۾;<0;RZdػ#黧S;Y;2;;*;溻뻇bʻ;G"Z(X!?[;89-P ;#g8t軂&Ԍ87z f¹blS>):>n6xZԻ bT:'w;Nr;;Fڼ:ѻί;T,; :x[mTl(?;-]l;d(dVں||[I<7<8%;x;m;;\U*:$ۻbg=9t>U :;x;k::;AvN*;j;|;%; + au;;۸W;8q`:;=dMME9Kt:}o<9; ;F=@~2>^;;::-75o׼`_ ޚٻ}d;i5;ѕ;J>:;;[f;Zhs;\; :s;+ 4ʻcl$i@d=o:)/;G;?G'1:-;}P<<إEûϣ:x;M<_dﺺ[_ ͸A-3;d-:ʷ:.j7:xztnex: +WmÖ";:91RPoSxK9DUA㺗;59;bq;;=:1:ZQ@U>kƼG*o6&;^ݻ:\a;;Oy <; ;A|:;;:;?Gn!jɚF;M; =9By .g:ǚ;½dc s|;;d:1VȼE;9*tC5:ѷ;$(U;`<#a:ۻ(#iy;As9ѰD; X:ѻeﻚ:^;s9Vxb;{%;1<% <0cE<Ȃe==eW=6<0a<^5;U;CU<8Ei.a:.+;h; 9y;$o;<+A<_G;3dk< 2/V=x=TKj=R<:氻S );i;;];ּF9Pe<o69[<_ +;HBϻ3RHʺ4X'A:2;9j|;E;.uf(O;j{;l!;r*/;4E$;T;<(2<'<< ~T;4?tV<9Żi_;;;h<< ;D!O[n>|,J>W&=J<<:~<" ;Ƿ:V;}H%;;KDuܶ%[:仆x;ʨ3r`|:"zat0;TԸ9S;Nk;B;';I;tT'`0] +:z޼Cƻ*|;e;0;<K;<.2XtlCջ:; 9;S<}%<(3 <8t$ z;k;w-;:q=Ӿ=&^Y,ԍ;6 ;a;v8<;jxI[<1ڼ:گ;FȺ[#::R;)J;P5;v4{:;;F;`N;(YZٹ;c(;w&;U;η:C׻emzۻ;դ:g<$ <3/CB ><7w6d[>G>:==Q[< ;S j-AV;BiJ;|:Yu;ƻ.绯ȻW?Ti$8RF8h,:[/?ay;v;(;@ݏ9+ٍ9׻l 29EG;'W:; ۠;#~P;9;;FDѻ273>T>f= +9=2ɿ<_j;;F;n\;l ٤*; L:;j>'7;ڻ̻HuJ@\+:9wa;<9C;;;c:Z;x;+hǻ:<%%걻P$*6$幼 _;Y;ʄ}y{uDaǻhe:5<f;R;;i<;sp:dP$qf|J/;u:H')p:S:Om(mG#Ąp;; DŹd>=a=x<@:(!:N<`v;[?d;O< =;;<;ӻR1@J;=)~G<x<}滫ΌŬ:RλڼL9;:;ѻe9g#sG9;<;YջA;n; -ˇ9з;9^<X0)Z;1j;];O ;o;ԁѻB:a;<;@L0:_':t\.㺓ɫC!&.WFI wGcX1ѵ",!IWJpn;4s;#U;oԺ}5;]<1b93Og;:`;oH< ;d8:;sg4:Z:Dzz@1 +c:;4X?-9}D;߉2:S3N=ݻ;';.f~T;N=N9;:0:y<;9;rK'gJ;e݆;&WRl;/;ӡ;;Ǜ<P;1-$gW +4BC@99l P`w<:ºɲ: +;";r9m; ;c;2;m0B;9aǼ Y;_;YsG;&5;k;-Z%tk;:;J; +;N;D:D_a8lz8(;{D:W%.:][u;,;.##g2;Az<w3QӼ/ :;A%U黶.1Z@߹zƴ4DLC:% +: ;ZP:=M 1:Z;cmQx:ЮU;u#;<<n;\Ny:0$"@HWy&P;m?b ;Ҫ;$;/~;k:鈮ȻeR;n;w>:Ѝ;aр;V/;`;<Uػ\֘=ͼ@e9j +:fbܻ';wP#g1ǎ: +:;<߲;9IE95%:׵ӗ$G:K3|: ;+; 0(uU;8<S<:Q<8@;;n;l;V;:C;ܥ;|;H;;z":;Qr;=AɃцJLvs, ;69nU1;Nk;n< +p;Fx;K?;B$;֮R;QRV;SK;<<'R< +~c<,D:;]+";3IF ;5;c޺T:J;w{RQ9 eL;=;̈́GOs:; +; â;J\g;TB;'FLڻ֛;(:;Y;H;i;:YdsJV<;͙;8N< ü;G;; ٔw6&0;:;?Y;" +:9p\;"[x's;;DR,< ;?3;if: DT[g4GĨ;{;|;sa.DOrw;<;2;Eáû5Q;R<x'r;@;<3<Q "? ;H>;zAH8M#;h :8ֻT U:蒅bo'Dw:=F;4꺝z9ֻ6IJ;c hTit['c;Q;<;E0X =HaǺE,;;;h9G:&;=Q;;=(C;EK:nME;D;D(;B<0p;(q෼;<:9<<;Š9 ;@$:S»<;5+ػ:ϑ;I: ֺ %Ļ^3,c GO` u𻀣&rL"ИE;rv:X_˺eX;-f; +'x:;;";&9;ie;dƠ;?;<};j\Z:@"f(ؘ.û7,Tkv:m;>::2}&9a;R9A;rM<#;:ȻY +|;:+; +6:iZӻT눞;|Y<4#;ݯ7;öGs D;;9XM<2YM<,<:rT\Mw<56:+9Ӽ߻»O&5[9Ah:(:-}熻܏^Pi< j;܇;c Y<:!;;܅X~뻤|D ;O; 8hB; >:lpM=:'~1B;<;@1;jH;v92f:+:Hd;U;́;~1-I;;ii;E< S;Y])D o; Y2:LJ;egX;.ͺȻ:Ҧ׈:b:,!"VF-{ػ>ڻ'%:b]󻒮W뻰v:^ۻZ;K;M,\ ˻Lѹ;:; %:k|S[;5u:H;;T3U; mI?%;>::Π6a1[*Ar9;C@C:q:[7 +}2Q!9-:JuQ9;TܻW:ߙ;VAe8@V:3;:A:a-:ܛӻ^$hλQ<jvkE <:CP̻ˤȫhv<98GQ./ V;Hu:֢:yeE;~_;<+r;s!:]Ϻ'U;;ݹC^+>+j=GwR: ;J;L#X;9.;Z8E{TAǻ%";DKQ^;<ê1'(a;&;[;2E8;:><ڈ<)#98Rӻyݻ<> x4Co; +_:ay84;g;W:f;Z-<vɻj5:r,;%%|; Y/:^; +vORl+g;5;d&_;$ݷ2+;!;; ;J;^(i-;I;k;I0׶;;j/<<7:BgxWet;;:kR<R' ٺw;֟r:|ꮻ"=tt:K%[+~;C;$q; Yp6㻳?f,?;N;;n;; ]NY $÷;b##;o+[\(s:= +; S~; ۶df~::IBz_Ժv̺tf<;߭:n;ʛ;;\$:;;;;;<+d;593o*:;ʻ:); +;u1;/,:;;@Vvl<(;2亄 XG;=;Ň9ʿAf;V:;: ++L;Ȼy;&:e;]);~R;9]; +Ƽ 429tTS^ /:t;;qʻ0rI7;I9ʠ:/bF: );Q黍4W;6f˲9;~;<:5[ls;:.H4ڨ>wH<X;d<:;K:3;At:;ü%1v;źʻy/wb;K:Q}֗9;ﱺ +{\ͩn;zzq 8|;˿ W\Ę ; 8ާQ;pV:C9p/l7n;:H;94>R8[׻H:‚ +;a;;;|7;?mV : Y&(e{ Y[9;<:<2w;9<ὺ;'-;볷;;G:?;ZM:9v;UӺ n;t;0仔;;d;AZ;"i;%;5&ػx98l4;ƨydܼ'Pc8L;(s;7;Ƕ;Q5a;XY;Q;ΜһeH^;G~V;;ԠJ;fٹ/z(`; !6|:i<k5anA:5:/:xu +^ ;AcgkC9I:wr);=_=s= =4E< <1R>?$> +pW={P<.<<R< +'<24Ⱥی;";^?;(;K'~A;;;޵\<'f;b;8t(';)yf{r;M]$m.y7AgS.%/0_i::?9h !܀;<&:K*;%;9ǻ7l:n$9]o;R< ?<[d<)<$`u<<$<<<<@< js::>=>Fl=+=*<&K;z<:8<>à>^e=U=(1k >[=bǹ;<+a]!s Rܱ:;$Ż)=;w~;52<- <_9 ;;zz:5<;:f>;̫;6l*]P5e:<d<-<;a:;.<<<=k=<=`=vf=jZ=[W=;=15=<1By;;+O&9{oغ;s8zH@9:ه<:\V$ݻ;CUi;Ku&;ҲFnk%7EŔξ;]:Hn;4{;;|; <$_=<< <;%<-;G< X;]+&<$;y:ٺ%9;; pF :HX<:Q{B;`?<C'9l]:)LI:8^g:a;K^;޽9^R;y;Է;v,:Dn]:7:NSMTJQ +c9)Y;<+S<'q=r<\:0:ܖJSr ۻeQKO;F; w 7֠: +ѻ +PC:qF;- <"ozy;;u >ַ>=R=W +x=Lf=36<\<'A<4xXU:E;p<vL<TT;z;+;i:_ +;J\:.:Ƭ;6<;>\ɼ^ür0A9ʺAc;C< +c9;ӗ<<[m)i>/K>Xu>j>B =a==:=s&<=u5(;;\; :@:_(8hLƺ-;'MVbӻB3ny%:b<@:Z}%|;K:#H5U:I;t<><*_;M8/M}ڻߨ;i;_v?;';s;`;I;|X;a<Q<<֚;c<(B,ih>C>#>L>8,>,=,=).='D=rku= =;>w>1?V?(,>y >|Z>=H==o?=dh?<:<<<6;0<=Is;C6:T:lu8< ;,;h;%b뽻;fd<6;t;Nf;;Ao ;l=;W;5 ;]n'ŻrX^l:>.y:ͺomw ܿZP1;<;<=<;U:ʄIz:S;I,S;!XG;Gg9Q:y.) P y0<C;<# VJ>_>&?G?sd?&?N>H>:=D=M=)=\rc<՟<<5o;];)[r:묎U;;a;p:;]"^;;~h<"< ;Ƒ1;U<8)'<;c;Z}:;w;:q;- Ʃ߻Iǻ-B::NqOl=7t\;;P\;;7NFj<GD%W<;D +r:rA3@::'ջdo:9Ĉ_; $;t!=;N;r$IV18B;xG ي>? ???n>^>n^r>i==q=(x<Δ#?`;o:;;;<;69=< K:Je:UR;ɑ:[R;q׻}DD`M(;<1.5^;}ۻ.;y^9iOŻ:Z4J;<8u<;j>??i??X`>f>h.>=@=5= << +;h<.^;v:gނ*;;';;,tV< F;<18 -;<)z<-;<0:a;;;<;W'ܐmk>3;6><[:!ǻWQG>Å??1? />:>F=舉== <ڃ!<ӣ<=4<`;;6;k;w/y +< :w;M9:;A_;)BI:Rw< +; +bg# EQc:C;^:4Rk Nl޻FRU<X;p:y:Mz9|: ;y;ݦ[ 2>uqD>8>>x">q%>0=9=O<<ĆU:8fv9ûMiW$_;1% N:.;Z<:;>VK>sR>bT>.<7===Bo<< <<<;F<$;R :;<<9 ;N컚\k;x;-:<^;9- >\>V= += ]=.=B\,:+;k;;:m8ݻ$^+4n.;̯<3:fęS;7>JuOJ_qt:z":/ ;:CÔ:`;7O;(9LԹ;{;i@(;ҹ-:p<'=< +%<:B<B<>= =(!=c(=eQ=#={/==j=ad=rq=.<͔qb:&;|;Pzs':^Q2;;ߊ<n;;96;MS*^;KM3 <\<%>mv;o'e|< :P;9G:$܆<M)ۼ;M깺 ;2< +\j;`;Y:~9m`%:ږ/ +l>;&t ;M<7_z9:d %]sc<9&;-};2IPܢB:3;R Ag /:';j>A; ;9<,ͺ*;p;%L9AWi<|:Lm);ȥt;9;<<5;iUK:^xz8ZES$:߽J;:;=&<7+<<{< +9;앻E,~;\;k}]3!mHq9P:[:#:<م< +]Z;\;H<|6<a;%9Ҽ'#&tT@qwf;bR:wԎt:79;a;A9Y>;ɤ;I_;=;5.N<6<4yi;:ԥ;29s%c&b,;:SQg9rSx=;^h໕@;}<>;; >;@;'qc.;~r:I޻a9:+-;8).:LY96ZĻyһ۪ݝ:;=$;!;)u1ºQ@d;;[;K(3Q,NF{c8 +I8r8ÐD;>V;iY kN7(G\_ =j "ջUl<u;;%];;9~㧻ycWC ::/:;I!8@#tҹc;M:+;_|"'cSe˻u?5rƻT4 ռNV2qR;4C;W<:;O%$hb&pnϺA;;5B;H;"o;Z<$w<%o<%LQ;؅<:};#%˺#i;<;d툻 ;Xr:򇗹gWJ:һĵ +?|3e׻ GlS_⻩-q<<((<<I.b;]@;Է::y;';t: 1+;<;r;Q<h;a󜺄;b;Y#a):d7;W:f;;V< K;,;;߿:0<; ;;l<A;ţ);e9I WqRrğ9"ۺa:z<;?I*;3;g#>9R+;rA҄+;.;,ʒ4:$i f; /_?¼ûd-*O~T:];?$V#FnjǻH'B:N*pf;f?=^c2o;4;;o_;ƇPR; ::B:rSTu:':*xp;E|8:J}v_;~;h<6;/962HvpA>rMEe;:'v.:ӬѺӏ;P:|3B:;bʜƕ:rF߻α ;;ߟ<;4W듼*ړe1>]c;k;仡5n[\7g9 :9f;t32@:۶M;;XU9 +q4ּBBS;<;[;9$;|;S;m;ҟ=:jqPꤺ!T;_K.溬*dL + o ڻK3[aW* Ѽ#<X;5Ƣ:'4;}; 0Bͻޡĩ _;i<; Oo<GA;Q;;;*6jϻ>gz:fm +KE>8k;<<l;O[ֻ:d (.^L&B;0 9;<;ٝ;sD:0;;(;ӡӻy&ںi;-F9=u:<;ibq=<";ܻGmdmB·b4iWT:K;.Y8;EZ;|]`;\\N;X#9;4;k;KS89G碻;9n:8dL;;0J(>c>;9[&;U< 5;2);Ps 9nc;r; лP%pqcۺ|;;h:;q;q9zȻ6͟-s:UHt:ߠ$k:`;^#;3d;P<<9Vj;b;啶l F^y۫9*\;: ;s;ag&%~;'λO:܎;v63;+]:nH<Ylع};"|;9?v6D:!d;%;;ÍuK|Rܺ.<+I;<";w<]o5;`»L];K"jLn<SݻV69®;%A9;8z;v6;^ 25::B 32p 껃ļZûs;ԩs{c.I9qDü޼(»{6x-H5(hyh6λ*FQ; o;ո;*hF;s:)`:Iҽ:,;L-7W+'B;Se+;[ :C :ndR7ػڻ06:7C;i1<]Bb;C;fZ-;Ye;5L/Z$.v$лŕ⻞ZM;hO۝d!պ{:u;:b5 N0q(@9]4; o7k8; ;T9:ww;R~g;;Zk<:I:'E~+e?;ޟ<^|<:;^:I!:,3R;ʀ; +~ 9b/o9͖;?&h;i|+;i;;j9;:F:Լ;4/9;)|;;:n!=Ƽ <Z=;P8 ;&޺%W;Pg;X;G; u0 =U?SuKK!ƾ;깲HX;K0;7:T:E%hp;lͼ#`< +m:bݼA;eB;{:ca\?wTǻ|an+C;~H: }:FmvU!GLp۸k:۹:I;&;9» ^fyt%=vA-X;f@;lF;i!91T m9~+nȺR:8;;솰;2;r;׶:`'O$&ЧElr ϶h:ĻݻZDD:ӃsPo 2iF#qp:|;涻!mQɻq`:4;4j6Nܣ9 J:%hϭP@ +hfbP6;̓:İA:l;:29g;H;<4[&~3KEY:-`;R,":{@g 9)~:λB;';[r:jF5(0:(ʻ̻su6:;Q :H;;':;k;:8,eu< +K;3ozﻔ¼`:[w:JFW*;g;$Ȼ$9ݿ;Ddl;041;/:3/ /:C:"fX;X츌,~ m(HgVK h; <*;T62{`2Γ2,9{|+0;*߻8S=:K툼 h,`ڻ(^$úy,ݻ=؝<;g<p;.:+k<է<7< +=%y=gf==d_=S<-<;2U;;w:养u9T;;4h;:%:ʻX&;D"< *;9pL%*8H:#1ϻJ:6 ;B;# +;AúJ:N/w; EP4ǞO4tDBF184 FBaBQx? F{ >ʤ>GT<6x65|4ЕV>t<@nG?fFZ,>}s@A + +aG"@: ?E!rhR@!rhR@`TRH@BBBSIMPLE = T / conforms to FITS standard BITPIX = -32 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 129 NAXIS2 = 129 EXTEND = T END :|C<,f뼜<Mo׫Ǻb=E} :J=Z,;e.33<c=,}<_P<lY=-M;1={}/̽;⼤*Vg`=5c޻v%g:ἦ);sdo<;v;[6;+Իʼl;Sc==<{^< F6.v;Bν Pݿ<.0<0/<(d<$I<y+<<.`<:`5K-<\;Bw0;$<>d'UŽ(~<=Qځ|TkA<~1<0C=5w?;\[ؑQż?vYo;ࢺ[j<;ؼW*3=>2<{#% ‡<1H;L="Xm;(<Ȯ<'<=wB_=alCDcP=2J5:(b<弜l=1Z=#:5@;_ TC.;;;1<5;ݔDz <<5~r;2;6z:)t<'< R=8bP<Z30t<%N8<`-< L +coE9kݺ{Լڽ&n+AüAOԠ˺{9<+U<6oj;}859x;;Ǽh;"~) +:<5Q +N5<#K^ռf<0+=g;$;a5C;5<7I=u _=C.:K^m_k<$;[ͼ!=h<<_;׈<;ܻ.;>臘E +4X?k;=ɼ;=@P{ ߼H= R-< jҼ=|rt;?<'$< +;\C; ܼt;@K<^;:,'_;K/<,CͽFcӄ#A<P= A㷜+;ݔ竼\T;)<Ĥw6:UM*^=,O<a< =KI*v;M%JY;CD⼁ZƽHA1o T@<BrU7<;ofλם=V=zMM<8:A#Uf@=>< <<}. ;?US+ =U<{aɼs=;/fT9=TRG<'+;O=; :ἼᶻH<DZ=;wUdYܼ~|<=X&kHru,=0<<J5ZY=<˶O8=8 +1ƙU[fdͽvlV(4)'׼z.K<(l"=<@=a<<<7y .1\J~Ͻx;G~;ڦa:< ;u張D%N|;Hg<̎=/=9m;rH;[q;<'a<6g; Cǽ<=vJlYy9*["$<5R<ɽF0=w'<=;ɽI:2c~@O:;S<̣~N:{**<9a'j/=S}x=:8=*eȼ>@ϯ=|< ]nB=#<<<c *X2W8 +=r<_RF:M=k<6~'< =m xT_=}=>=!8@=i;"=\ w=4AG̼Q%o<5@4~:& ;9bm=N1=BX;ٝ<ģ-s=+l6T6ZjCŎ=`Z>*u X;);!/<`R<^:χI=x<|&<>L罍3GN$u=,F=Z!޼i;;;Wb,=gi87󼜅<:A;# ; =D ټY<= ߻F<{LAŔj?V.ӕ<@{%<$p 4<dUW̞~=hf= I纣׍"u.ē<ۍ%=2<%:=,l<_Bj; ˥M;=ǻ6E9:˻N9̲<֧4i=&Eˌ%w|6B^ =r[\<;أ߼7㟻"=ӻƼbu: DR$<' +mQ;Z ,"S=h^=Awߤ<2<-Ȼ5JE!;l\ ;u|.;k<=&<Ȳ-=/WU)<|˼ռhۘ= n;e޼s< +BL;4R:<-R&=E>t=;<=====#==$<N=^<pb=n 3n;N` +=Ev\:[;0+¼{{=4-+a=|,=JQ;[<=L<5Sac2Ą;< [=$ZGp890F x߼4Ȼr??Rқ??;O?<8-=RT<`$> < )<@"<ż 5]O-(ا=pܺ)1]I;k@=)ܼٛB3=KJlG<(ko:f1YݤmVy7<#<]<;(x=[C>==O\=='ͻWX~<=2< S={nd D2#B5<>f=%,<%Yzn%dv`; d<=,t=Ų3;ѫDf;<̽<ŧ+=0uܚ:=#H=[Hx<=F<}=;"M<)G;UX`=T'O9{=5';[;ʺBNGx~Ӻ\m= <'<oY;|SJ# ;)_;:;"H<$=м-=V<(Tj;v;?,W N<==Pq= s[*ȼm.r;ʜN;T>qIl=l;$:);ni<;2"OG>sջK$%= +T<<#yzaǻ;Q?;ரS;A<ٜn; ZƧoIS> =3~d;ȗk<6i/K=Tad p޼ q=H==c缶C+=F yR[hlBY?&;0<4<k7< 1\{+c=Kˑ;Ļ1~E=3D=2˼.;B+P8< +&ge<;4ջE Mf*j u=D3% %;;aC<,O {< Ubݔ{=!@:rO<7-m <&<;hY`%< %6o<2V:?<˻&*;\&^p<;q< ;L2 <]=>,@;=5ռ\=L ;C=MN`:S5ٱXJ<]Z<ÓBJ[l/<(&RD4xEp>-ϼP؀='oV9d3Ƣ +ű h$L=Sx=Ev;rgq<=IX<<;8fzct)=-{ мϳ,hۢ<1 ;^;_=#/4=V_ba.;ZKE;n>jA=qƼC?::z<)9 dM<91(c;M0태Pfy_<<ñR`=uT;CxS=A< ss|<ơ<<^tzqcnGiufT=<O;>:<*Gcp:(<2Uנm[F<; ׻<ל=>vؼߨ\};\;72;q&#;5Y%@9 .;h"ۼ6'?s;EҚ<^.7HB`D<䣼ag<)I4Vຎ<"<`n=0"8;t㮼<ݼno¼Y=*';(Ar4*Wռ0A`=1<` ;Z<:<3/L=C<n<&ɼB)MuZ{$<>xX<0vüX }FecQoV<=[<{HK]=v< Ӻ  :c ==X`,Qȿ<G\w<<#U"o +c8:=4zG=F<?=#0;8ڼaVg=; +H=e\Zt=b;&т<;5<ⓚ;ɵr;JCs<"<1<<=9>"I;u:v;w(;s;23F;SO<3%^<ՁE<#*<߼Jݻ +w (i.~O;v<_ЮʛE<;;ѡ{;_:;н=Ү97H=9*+0=I"< K$2~Vݿ:䝼Ŧў=m;6>=<3Zd||fx_H0<3";hgZܽ;VHvs=4=Y;;]9:`"6sy1== ]V\ pݼ7򮝼\h%6CB/_ƒDrp))C=rjH<܋<_,9ݰ<-߫2)<㟚<0U껦omڄ5ُ1:KۼR<ط="<#<=U +<յkgn/=Pgk<=;p=;)$; +rY<`:нV)'ܼ"PȺ'_7x<ЧE|b޼ ==~eGd<ԼUOP<ޞK$=D=aż`<2?;x;ν?C]lKd<'N;Q=ʼZ*:6<Ͽwwq5伛8)<;8<}@ +=7liH<}8C<ېį+ͤ,׼ylm +cop)۽(v4+WV$O i#7<B½ 97=d$<v<$DT<`ujH\H;;k.-==j=.Q;].<b4b!I+=!iL< ýQm<`=="ӯ;ʽ_:<P^¼:C3= +$<;-$=<âO=Z<)bռ>U,l^;ӓgKkɽ0K=K{_ =w<0^Y~^8;5Cp=Pz/l<=V=I=1=AL=X<:<ڑ<;.9!)AD=a=Ԯ=~<ô1=5t;`= +*>t;=;,lǼڼ,Yټ-_}1=)V':;a=d=8>>NG$>=澭=ee? +6`>Q=<<e>>=Gw=>=jA=JoƢ +<ï<.3m<0=E,/=M<<m= +<<24=ST;8=\;S,Cu&=P7ӎz=8r<3= O<^< H:y;P2='=<1TlPC=/0X;ɍ;˪o:D7擺ԓ#<8<3;;AD:}57g:kt0:j_üp*<ɼK}2CP<hֺ',<}H;<)+ +¼*<.༂N=<@kD`ӻ- Ia3Z:1M:<0 .;L<%=Fw<@Z+=:!)1!ݼ}V;.μ+.=@;9!8ȽS&< "tR7==bљ,1)E$஼rуW<.Ȩ<=&a=A<∼=*M77̼ < ڬa'9V"';i<=O;Gݺͼfn'鼯;9ļLn e=Au˹Pz<[;=K,=GL<).1F<@M,zo9Eaǻɻ0<鼰q;֫b4<@B>O1=O9ؼ<=9\{;L;@;4;^ʻ`D<'`_;[< Ӽ)_t<<2ȼ;D<2<ûc§+YA<<. g,;߁C ;=:|A1Z<;P+<̼Oxm<#T=2q

=QҼN+"+ +g¤O=*ԋ nrXx1 %$mxmo<4ѼQa;;X<<95;=Q< +6:;!<ߝǿ;5(*:, s:猅=j}r:@k<|t< ǽ'w8i*J"]]F<ۜ5Ū< +y/}C<3G &e8w(=9<ؾ4=p*[>KG=pKH.&;(<.=; %μѥ= =0<}2<ۼ%;eI:<^B;; }<|M(ZS`_2aĻƽ ;=/<)Rwܙ;m;*c=&k˼:7ǃ;h<4:1Mb(젼Ԩ-==1Q;˲ɼ_0 .ͫ6<4<4 ;;:$:_=w60<4;<X .n<{8g:<9߿<9҉:s,<4=<==r:5=*Ý; =/:3|-`ˆ7MDg;*_<|==;<]j<X&='( u>:M>b=p=;=~Ag=:;UEHm2;<=G'%;g=CuO%l4;<Լ%48;e|.>>=&<٫<|[Jd<"p='IL:pN?<輶=iZ)BFP_;2,r Cq=W))x}=/k2ջৼ2>渝=X*0=m===+=C=:ӻܖQȟ; 9tnܼMMd<qk=<:Jo=&_2:#MG<0$=nJ +ռD<gǼKpsb=&NQ>]Z< <1Zw <&л+mQ=<<<NQ:8;5˻t;?]p=;̯%:=,q=^;ћ<е;4<Хv:6 ;m<°VK=0<'^]p߫=LG^ᕼ=I漓m!=?au<]e(M<><Ͽ:ظVP;=FZ==,X>GG>.>"=阀=:f=T>==kSX=;=O<A=~=9Z>[>}.>E-==?!`?ь?!?[>W<>5==7<1===qA'ǽT_<;xy[;x`<HHGܢ㺛Ϗrʻ]<76Z<<&8k;Ut;;Ѧ6D>R>!$`<1>?rL?_9??_9?.F>H>&=X=x<`o<==ǼC<:Z<"OEӒc獼(<}'=6:L3{;P;Jp_<=j= &ri> +ap==c=TF===> ?fT?,@aA5E[?֖?N? k>G==F=et=4ȋ<Ѿ me=k;=FiG<ڼ=Nܼ!E=t#=t9="&<?;??E?~??[>?E>==== S<;9= =ta=E?>F|?WL??P? q>Y>=T?='pZ=}!< qO:B{=lu<'Ֆ[3%<16=;<+^ >t$>l5>>ڐ>B= =;R̽M^;Q_/>'%>(>H >"C==);=1<6;Y>=;9B:q;X^<;q q=+HX)? +DV:!Ey<ػ2#=<.w;シ_6U=5Ӽ =5Q@l<$6D$tle@;%b!<<$#ȼ;~=L^ +<T*="]h86ȜtIKc{;o `<6<3{ +8@=} 6G;F<*'mF 5 +<1<$<4 '<1<1:]=fiL0J<,9$;<ŘB= : &{XԻW;ۗ/<<8<)PֻX;;65^i>=;<0{ NV< ҼӍ1#l+(f<;\X鼚Kh~)ͼ#Y2Ms===$N:N=gX=<|i;߼TS<=9M{޼ɼ狻Fxˆ:<Ŵo<űa= <=0=>I=<9d;&^h>`O>==ރS==bGu;[-;s7~B +w>ܩ>wy>>n=(=%<.<[;I; ;7TJex<᪻=# 6J`=-W<r&@z<{iM;:u ]ͻg:rCD7S = <3߽)ݼ:,_1==;uht_ӬD<<<ѕЙ>>h>6=)=G;+<|T;Z[g=>=';G<< `:;n BLr:V<<[^<μSZ< <]e<} (;nĺ^=*"=b> >x>;> =B=YI)<ɼ$=>tcZb:t^<{8 Uϟ}μǀzc 42<==LX<ゝ;7]1,=Yc~p06~<#H!5ۄS<ü1:{Z=Yڡ=u=ѣ=gr jջ`_<e<|75:|/m;R8;Է< ¼!]躩 t;<O?;rP;Gʼ~ <!9K;Q0;ҹ<J<%?bw=<$;=>8z5püH;;)/ȼ#P4; +9o<]3<߼i`=Z!6=:<n:y;M<>ȃ(vY<- I: G<$;憼8<; p';X׽[2=W^kI-<вѻ7;a8:}EԼX<[OF^Y# ;l;(><-<(I;^=R<(%; m==YÉ;Swn ) +;R$7ӆ- iXYP<ĺlǛ#pWGO:EڻX{y<#<B2=z=p +y<Ч-I;*:<#q<`;YҼ2=,dʻVμ);YH;@\;[ Sw=θY==kQXf0<ό $U< egX=G*Ѽf:xd;W՛=>@;W*ikļlX=lU.K<< +U=5;mnzuش;9=?̽H2e N;'y==%:F[</Ip+Ƚa<O69= =Y;ܼ;I;S<:n<> =Gj<'M;[=g-<31;1tz;T<ڼnͼ䷭M; 缉^;V7Ofv= ѼK&0>6N`?09vCؑ;2;Y{]9Erؼz76ϽH[=Y8!O<U<5=Y(< +X L;$;-$< + 5 I1}e:;mql:W.< I~=b:X;R汸7<ȼnHV< ]9eХ̽ ;N䰝;&Gds$ֲpGP:s< xfX!"T)єt;Tc[H; ƕ=I7;ݦ;T4f&oRؼ@=o;Xmw5<6<;m= <k<Ț;#*ҾF{<3;#Pe=,<k;P$;OGk4;lq<#}6 ^<<~E<ûqr +#I=5D=p$%<<5-7;ذt= koAӼ@`m`84>33LIoNƻ7=.ٻWO33V=zG<<¼#W= QD<8=5<*E=;ԔYf<ٰ<=,oW';<#IbnXm~L)7kN%J%Lup=1:F;Q:^;;0R9^6 @:c<;F :,D< z;" }:E:ԹnӻX,Q?f;Z~;r;$)v;;k: л2Vӻ.d8;"<";;@n;:9&;F!\#y9:?::—-qл?;#;t o;Y;/;u/y0ؼ';HYN;p<'<!:pɷR;Q]:ʹ;< <7 S:ev< c;t/:-;;;@<2;19]r"tn:y"j#C4@&ܦ$U< ݼ@Ǹ>1+;9;-G!;Ҿ?9KA;;;; dBg;< 49]A; .;?;;FM:F9jI;kp9wQ;<<;仒 :;v<U;nźٚ;,&:L^evwk:VxC<Ko ;btgԸ\C:;p:: ɺ\*PT< ;p(;\;;hE<|"=bd<<_f;~M<Ũ:><;8Go8Y f:&ӻ rݼ&]Żҫ</96D;6C:cN<<e:5;,<т ;4;J4Sֻx:aPDQN(yd軋p _ Y"suqƹc3;p-;85'ػ79A껛?ԻtS9R;/:U}(ۚDQfy_w:<(*;F><;[V;'<0Y+;';/x`iґ\sh :XW:8rƍ11_{˃ճÅ;^9λءx8%; M:N9{;^*;m;f:;;9MP/u;+<<'LN<=I.=7>R`>r&>(=Q= <7N;0;;m^W-;r;5;#򔻜<'< ;^k9cl,d;A^<(Cf]r;h?;<,%; +2k򻞢`u9^c;d̀; +;V);a9;N.3mݺ/;;*;uOG;m6S<a<(@<:dM;x<#g4 +l<8;+-'lN~&;Fh> >YL>dz=F%M<<9X7tY;S}<+;;W<+=;x,oR3!J ۻ|1;>DH$Q;+dhe%;uFZZ;x8:M^꺻t:;&&R:'6;b}xIN; Ļ :ۅ`b{G޻45xOM;iQ;Iz(;kɮ;P:B0'[z:PC<;ν;a; +R0ѺS>/=؄=[\^:z;+;3;)8EY*;jɹFL;zCPu~5;p;}`3>#!ji'8`j +>+9;#t<4TV';?;h:;ĉ;9;:4μ7WS9/;ZA'N9;C<8"#&߻;5<V9ԇ;M7;;>v6/e4P:`!;n ۦp`1>9ش<;E ; :T;|i;+С;ED;c;?;;L?Mb>V;g:a:;U:]<1imᱻi:B@;n83)^8:;N;<::; ;( R<z<`ܻOhfff;K;<; ;s4s=;;;^غ,<:P奼R@:;fP;;ͺJ;};< +|k;|~<#H;Va<;*):Һg| ^˙u,I;_;'g.;]3mMf`;ɸq<.l +e*Թט`Y:iAQ;nƎa֡U0 ~ռ zջy;Ca<6P<;u4c@o NVi ;73<r$:/ <4w69B[;d;,;;o}- g;6I/;bPqv];l}:=r:B9;G;`2;fP9u;{-;u +˹ỨK*aV9;+%oYFw_Vm#ޥ 87E.1X< \e;+;K?!FϻQ:v<;B:&l!?;9;F<6:R8r;;;Ɠt6l\撻m;lob5:|69:o:9&;\;R<<=;N +;;`;<';돟:o:S㻘V ;;l]`e;L;;Dz?]H{Q;<緼Q%:C;<9g:,~bJUJ:F;k#::&:̩;<#}<#;#:e\;`.;^;;[YI;F*C&5~<;M9 6 z2F.ӛ3>-9*U:I ǝ[JͺXrd;#c<MhS绣e<;NX0;k/;f;qUK;Kh:ٲ;_Uqf;<3;L 2Tkɻ<<:h; +:);#< 0<<w;%:0#;;vN ;M<-n T޺Ļ +:d^3;0a:cw!::mH;Z;6; +;,M@;<W;]N`;r=`ۣ=ڲyr/K*"ӻȼ$1:\\MD])l̻ͻ[Ȼ<7|r'FBC=:+9;§깽\ ?;s;ܡ;k<6<1;Gݺ--FۻMft;;W:ºp͹%&XuK7&Va&~yL< ];79싻»r?;D<]z; +Z;4 ;J;s:<w<TǼa,:BzeUs$;ּ"poO ;F +s]E[z9x:t `һ;Á>WC::%!:-Q;/:)ͩu;푙;w<e;i";\:':;*<; +99E:m㟹;y9P@0A9:5P^]C-:OԼ"zh;_CK?z +M]tBB:;nk:Slv&1kh.<) ;s:Q*ά~a6;"XҼ`:):r;+(b/5»Ppͼd+)ٹEs 2 |F9:m ;-&2ߺ'NAKILjwҿ;q^;;А;Э /mOyy/6;79;fH晻K-%1x&]#o;HG;ٸx;#;¦;z<:Q~;$A<.VHỳaEѼ ;x;G>;i.ú𨺻_;*/:ofG <мKΪ:w;/u;->[J I{1;熧;>8;q&R9kݻ$z<';F;ڻCL&ijp;Űo"pBjл; z?Kͼ>ͼ7z*{LA׃ $O눻n7G߻Pd:k_<m;51{A:蜺i<n:P}߹;ӏ:iW$F;/I5x9 m;㹞̊;fG<h:ڀ<2k<:.< Ȼ9rAkӌ_';Yگ9";F; rg;)QNf::Df{ںXA;;u;;; ;'.0ػr;4Ri=nQ̻;hX+9wu%wk;;:"㈻-8:Ri:,';،;eJ@pt:31;e\,ƕZB4t:DY({RF 9g޻B5U;ۨ:=;;< 9ՙA8Aɻ-;[;Î;^;F7:7: +~GA;jWH);2»꡺#;/T׻ ܺU|P,;;J;no; QgHex?^)A +$e!5)ؠ;;Scr8f%Ỉ]G:I;T;;9 ;h;`:bRmV:C;ʧq;w뻿5)7>p!;;b9ҺQzfJLɔ:G;:ĔuCa;ܿR;VN~;?^G:j0Tc/k!q=`@tDN9?%;fM09< &<;80Ѽ1Ĵ{;|%;IX; ;'(: "y9:꓃Q'c%nG998V;dr Pc9;5Fmϻ.ss?XH9;o{8vm;iZ;:F +Ի;w;z<^;^ :OW;L:X#;q;!4;Y; ػ;3:VN:;< Ż:2}{H`~Z=Hxb +G{:Ur;@:TӪa;5.;2t:S;IpUMk;: 黍N q1$ik;E< ;z_:P;0v/:Ł:ƒ7.:G;6\O#λo_ej:_;9Nej맺\;7<o#N˼1a.:m`;|߻]~::HKy򜻁+SQ >iԻd{Nn;{;Os\;O;,X;;9Q;eٻAvp]9=o;ڃ]C9;9d;_< ~1Su'y|Mr;j<=l;-E9_z;Cy:Qx=MC<<ق<a;O;E;+;X8;=T_<;≶*;_l>)86:V4}{;:Q<AP:m;%<#$;;FbVݹs$;]Q:&8;ȹB9 : ݻ-{<;5M;;kٻѼ5s:,피Hۻ9;;`;:#_:R:{G2]@ViBdPj!yerv ;E:;DO$n\^j9;}<{i;$]*OCY]%;9Y:dqż`-t{af;;$.l; Hz#m݇*Pu`ջq ;*M;r;A< v;Qa׻y}8 ;o*;O;ºB3uL:G;;L= L=i==E=7<\.;c:Xxǹ(:[q;? +=}<ˎwU:ԦUaA!)лR v.2Ma഼ Nf90$;}:k,&L}޻ň:Ȼ\"vH /rҼ_Ồ#<;A9 Y +;"&܈p*|6a!v*:*'<:_:$; _ɻ hK±;!q;p;h< +;G#<\9Pt!:};'<' <6B{;;d}.ͺ};q;r8<*G;:',D;4Y:<=Q=[=h>= p=[`OZW 9<5T;*`:/;<;0vǮ;><<^Q`:jBC׺8;yN:>=Mټ'k,lʼj£#H\2;%Y|:g:/?8V&< AN;C/;Xc:"<Y<:"fJPL7<-;ʏ;D9l;_/:!у[|;<;K֑< +C]<;\<};\'je9i;n<2}|;fpU%Ί- @仴:75Kʻo +޹.;.j;W o~…;Ix%zNL[l+lĻ>p<:@ +𺯱-%;=6': ";U>ݘ7ֺϦqy,\^ ;NVлL>$!WK;|:_9ϻ/' :Jݸ:f=;( <=;GliQ1e;Tu!:ޤR//< ;l`;0,nZ㓻:;:V;+V7Ժ¡j*>;S:0^H<ͻë=R:{:b;d:u;P};[";u3v5/: ;;4;rrSF;o¼ V:ktW;V;.<Ͳ;;ط|;q='A>IL>U>2w==H<<%~;&j<;ոŠ:90S:fۻlun;wap;f/Ժc 9;;,Bv>XlQ>_>=$=Z=<컁 +;`pܻJ *Ȼ3:rK;;?;}-a9\];;{;zݻ:KMI.; ;.E":tJ*;kdi:-8fQVK);1;n;;2].;j꺕{:MY<(B< B<=g+=Gs=>f>>==g9"=x;suBQ(BP# $;1;v}:»ڰ::Y 9S;~;|=;q<;ώVpeɼ)!cDE +)6+H<'L=w;y=5;p;i{:?Q9^:( PZF_Ot; ;L;N;d:/%ͻ:⸺&P;9:_fջߺ;T(P9ػJ4|Ļb +~;l:+c;{ԙV Z: +A3ﻇ%;<5.;V1ߺDא;j; 5;M<;";n8κA޹nU; 3X9ş;<~;;I<=X\;A<#]::;5;u+9UO;4}B;2;*2;:X<y<R;{;թ:0d<k/qL .偻2~ͻ]8R<8< <3Ģr;v՗$&;$;A;;BYH=;z;;=;1;<C9;<;ůZ:;_l;4;; ;b;J3?1&jj=Z#:t;g;7`;;9_9sXѻm滼#EۺCߖ;ъ:i;ѻ::g; ;c;: :ۇp'Cֻ׿~̻h9t%;Wֲ%,竺;y9;d;P;(滋p :;FnA ;P:VdIq68K*~:,;(';9|;%M;Ȇ3;RXE&<;`;';P;[;gJ;" ;MEGQaۻ˙:;y>:Fe!"r}q}kH97:&|X;񈻙Fo;9mF;<;IQ%ٺ\;s0:ջxu<,e<,t 9 +\;BVI8w9:Tt9 ;y>=W;ʼn:l56Bɝ:Ƅ;f}jF{yQ:ۅh:}n_:!9>;#j82:NJ091|9>:394;J;G:[e:`V; g;EOeW;N3;2V:Sx +;!;u?#:CQ05l^<R0;],:er)}N":^~̻dPY1;+X-;m:90]H +oW; +[Dj;%;2h;< K;HDRS|48m +;0ٺ?60;!%: ;$bOsΚ;u;:ٌ;<H; }컀Jm}[Dֻ:;W,<;7;IAJ;;;;~!H6: &*ou0»{7l;4;v:Y).0:;B;$Դ;[;gy$@ʻg; e;A';|Q:ܮrP;};3;is;^:߻ + +:S]D<<% D,l;c;w;#;S#Ml2Q;:?;T":7^; Z:Ǯgq@T!;>:غ3;Ǖ < jǺ}L:1;H0 ;{mA<4Ӻw6R;<v;MxE@!(8:- <A%<Ȼc;yfLj%X;;;}g<-^<4s<,Jھ;0<<;n ;^;Sg5ӹ?r;`3< ;;;;;jC;Dx9VeM;Go-B;;JM)\<70\;;̻:zR;1x;To <&R:e:e;L;7:2ۻ;<_;qq;<7P;0Q<#B;uX;jl<3;Aa;#;C;::B;E_;;)VHoջL ; U; P< a<& aztK;$Ϫ;gwOs7;;,Bxͻ k0κ&;9;Za:Fk2t:ښK7ԻC;14;u;%N q:G_94:̄f9x޻j:;-+;S;c; ȺV;3;38g]V<P;>Z;$::8:nA9˰ԺmxHyE;Bz:l];8x"պS2;&619::;;-<9+<h=nu=,=o=q=Dt|= ;@͹q{\4;);Q;Z8;;d;ɾ8P;\Uʻ0IYY:;< akhOr0;NOvH8@wX<:; +xF8R;9Z;ly"s K<@<O"?;y:ߺ6+;x;`j:!;:у<_e^;6+;I<;Na ;I; <L<䟘=C=>((>$K= =iX="[E== +jC=ظ=oK= =(==WY= nO=5K=^<=<~=:n|==Ye>%>=P==I< <h; g:9<<8=@<+ c>g/>G>w>-\=m=M<+;ݳk1%4ɻ;_Lud>o8F件O]f&|;ږR:5:;L<& ;ļq`;<mT~謻P#:;P:ͻ}<8Tw; 2;fD^7;u;l;Z^g>H?t>f>==H<保<!<;;Z*\:QLB; +HFƺ 7LYy:/;4<.s8;M; '.=E1\zw:9O0%ӓu 9廗_:F: 5;D%; J 1:(;5;1gG;π;&;+¼h𺢋;K;jq߻0F95$S!˼ud< #;et~tNҶ"snH;Nɻ;+:C"<&< !;vU:;\$f;;LIM>ܭՂLZ|:Թ"; Oc;7l;Һu];5.;ȾлOY C;(h<;@;$F!V0y:+iDb6N;X;p<:-;J" <&S<}< +v<-=v>??Y?>}>MM=K<Ǿ$<`< +J׊<;ibF[< —}/V40ۻ)Bۻh:tvY\¼Hg ;Ih^&3XڻψF;! c;5:tF9[:cp::)J; H8[8I7;2 +{7G;_bl;t:],w;A%?:A;Q <[<>F?a?Te?L>d=H=Ca;#9;ۻb$%~;Q};A>T>>ϵ>>Q>'˫=u>]B>U}>"=?=@2<2D:F;B:;`pQ>e;$<;w\;%= r*W.^<,G[;Ƽ*%1Th8~/$rGp;i<7Y<T;(һ<O;G<< C;J-\7zw;A󻈼ﻩjB:[rS7rI;ʐ<񚻁B +3y~~|&{NG<7K +;a;Q/;z<o<:0;!r9Ⱥ|ݼ &4:&I;b;4%Ǝ;;[g;ӏ95/OA;RȺ9Lx63:|"w{<zqZ:|j;*N<{3U; < ]:BR;΀<;t;+<;2<;T<#<\<)6;}o᝻M<7}<%<<h<\n;Vy*m%H<3<&n#f;A<[#<;80i;0<<*<(<;O<;e\;ž<9˝Х:BN<( +f; + + B;1<F;B;!<c;L :t0th-# ¼G :em*:T5ػiF;xX;E,XZ!< D^;:,}<V;A;:Ղ;P;Y;bl;Y:%A:+0c,:s<9QS:俱7t2;E;I9 ;ZH +g;ʽD:z:q(;ʗl;lo;G9Q<{F9.; ;<'D;D=s<û<(;<w;Bl3S/;(;ّ]:-v:.6;].n:^$y`;ໂ*+;7 +;[ͺϺ=,;T:Լ;vt;4˻׹~oZ;&::h;Y87;!;< \G;GOCO@, ;u/:|:P&Vi;ȶ< 9;D3:;Q{:P<=Hɷ> +=A==H&:=gTU]+9Σ;4;b;NּV_] ⻅f: R32uY<x;q;`q йWf<<%s9̏;2;ѻг;N;0:Y9g$&<3\7p2=ĺ=$^>]%s>|^>5==R= ;:k:Z` =mԻGݻ"Q;a;;Y5݁ 2f&Q;q_;d!' 3;s;>;ڱ"AX!T;^9:9i<;o4;n<)<=g=H=X0`>P +>>YM==S<<I;ז;ф0c;N3hո;,V:yi];y;>.u7@HI;-ͻ< X߻ +;y; ?A5@::7;X:Ru ;;e\9U:[;Yu; +;j:Ky;!29~:YdWă;;_;UR>9V==x<ޚS4;{;[:zXúQ׻؄**;;E< ;x<%Һ 좻c߉;| +O;|:~ F<y;L<2ہ< ;A`:$\AI;f.<(< B;:)uf9[/8;M1F뻄t;<-7: +-[6:'b:/ũ7;K;Lz;K-;H;ڲɻ;#i9Q]zJ;^;Y9m ;t:ʫӓ;TB:U ;R:Q7،:z lUwbL9;3\;t;r;q;! &};s;ݸ9<&Ѽ5FȼQ0ܻpR1). ˜nFiyɻ;bJI@;J@!|";048>#:;La;;+9< +;MG;e7G:%TLƻb ,;;&|;-7䀻5_b;;G 98;*p\<;9;Ϧ;۩1<#7;)p,C:Ҷ^;[t:UQ9OS:d;e:Ө8:t!;<B-2{Þ; ;I;ʺ/tmc5VW3<#Ÿa㻄u;K':;iT:@pw͈;B;R_j;;۰;S;}z*:;Z- ag;: +)̺I%p:I4,޺3m<i#< gGzE>Tһ9<@oq;99<4 J:$,9@:n":N:'T|;a<r;=lF:`|Z$̧xc^k +ĻbF;=s;|;.= b:*D"v`MT ;O+7m;<(ʱ<\;])*'';I:O;OD;&~;`;ͺtXY:Bz;9?;#; 纫ԺQ:$s;t:=n:;<8yQU;P; 6;+=;!+mV;r;ɻa߻\5dpXf<}";޺<r;;G7滤<˺ <:2S8!h9 ; <."i;*t;6BJz чXIS¼ʸV]5P Ȼ" +c s;;.W׺^;D;p^;;rdּSd;14Ȼ%;!:Hx|D; E;qP:` Լw͹#޻Hasʺ;.h]:f\;)9;s;2_w;a:[l_;V: /: s;🹤0 b~<rԻ +m:r8:0:$sԽs:$e˻/1;qo;;z;7; O仕m_?N)8uu9;v;;;;Y;;?f;5E滿c7;;<8;' +u2 gu;Ew;990#.; )hZzջO5^ļ +#IX;#hցa6:o;;)};U97D;":̹&iK߻߱ +[_::j\KP;:O;<;G@ĭ:KdպwW*r~⻗Vd 9<, ;k2;YN:՜;AtŻ;@>cȼ0:t:;d;ƀN;oi ;,h;_;:ek]wa>/%- ;}~%:#I,<::#;>A;>)TjUw_z* +F;G<9q_` p˰;;P; ޺;9<< a x;v#:_9;q<k-;!;j"; Q)-=<4.{;)p;JyO: :M8&:s;Rλpݼu6׻r%r4 < [<:٩?gѼj0ƻɽGx;%< E:$M9xu[:lԼֻu::܆PVԾU[;0`;;7{ڰ:?;;򆏻Z;+S:i/]/h컥OTݟwF[;#:5<::E=;"( CJp:z3x;idJ;hz)кҨ;rj;A<ä׻DC<_ cZ}˻l"_ ;V;*;e#ػPԻV > BF?>.@%ƻ龻?po2.2U iM2t%~/;d!<&:y& +3ϗ .<;L;U.!;߈;;C:7w߹&g`::8;a[iS$9{; Pk+h:־9{;q +;d>ѺV0): "W;b+r1GaDSW;`ߘzh,K;]d:@rc \s+8b+ǡ<@~<:8|:)ϻSi4vk;c_u*;6x;#;;9n+;\Q;Ƞ;f%;Mj ~?\j.|;YyϺIx9@Rw;?;,4 H-]ۻKO7:Ch: C&/;wi,:):D;m<kz +< 7;FŪK68CH;W;;:\_;(Х^ֺ86TV땋9M;9 uX&;su#:ȁ`nh:;;; ,[;0->Yfퟻ>:!T\~:_],o;B< l:tJg) +Lp[μCN;+<)((;Ƴ!;nϢ;b EqܼO:;R %<L;=*9<r9B;R8< +< 1;߷; +ջ<0;'޻:.;:<ŷF"; q3o\3:W8;) +,72g}B/лd.E$_yb;c;Ӆ;84l;. 9n:M8;!%{;=åĿ![/ǻM:;h;~;!;Ͷ:8;;;~(:QetI4dyKػ$^;ư;:|%;L+/; ;b ;Q<,M@;$0&V4;-8E;?K>;΀& fi:@n;,=;9A ;Z9Yc2MdK<9:[;:V]<;Nv:8뻮;hPջ_:N<d3 BP6]u/Kڬg~?=:mU:.:W _:G;aN<;Yٺܵd[;7YI:S;;UK<5h&oԻBoo&ݻݻP_5:z;[~<;hnFyżXÖ;:G^[9c.`E0(H: z;I=: :ÿR'v2].Rpf:?;#;4bN3<sRc:%;/;8)};[ 5nb;Y;J;;^<#pX^;vM;D<׼#)]?au\ E, ֹ̉&5:e`:,:qDm;\F:T$);Z<iٺH;!~;;4cU#Zw<lܻ\^9Mɻ6-Bz;"e< +&I:ġ뮺m5 n#<î< XG:Uۻ7Y;{mȸUM<`'5+e;v`{` x?<:#8i;˵ BhoS;bZ?ėwy;Q0;&[;;G;R/8U1:wo;H;Gb;!Ի~!:z:viAy+u;;AJ:л9ĻFJB;7*h:<7Q:E7)cz;:ZC;»;W,;a:; C<a;o;s-<Os ߼$Q,ޠ8;:Ub;~';:᫻GA; +0 9yߑ;e;r";J⺼)ނ;|;|Ѷ;;n;C';;x:rû2 ;ˀ9};G<<]<-:jaN]%:3W;+<:~;;+;1ֻJ;N;A< +U9R ,<3:¹4";@;M:%:U:oY-N<"W:W9kuڼ;{..P6:-<1ퟺJ;VmP9Y\8|u9NP;ѫM;;+N?Tݻ;e ;8(9pfxlŎ)Uc5u* ļ+J?;tm;.,U;;mz):v6dJ+;e<)3;k6;c#;YPI< Œ;;˼m0#)[ ;>%S}:xnA9nѐ;Nk7a:<e:d;j6d<[¥:,k"v'\׻;;F&z0廞3c F5; 1#;{f:4 K6 4*:BI;==O99Lg<\?;3s>1_;^DvH^9;;H:;ŭ:b%:S :TB:(z2x/CAƻrټ:~9-]2n.`Qݺ{ y: _;`ySr@<:7):B[;%9=< :еz9AP;;43;4|;:ɫS3"ƻgWJME;icA;@9 W'ҐՋ:9;E:lT:FֻU;;ּxw8lB*o1E?2 u8۸9#w( y#`<<@;W}W3";P:֫;:Js +9;\My@:%::'gUڻ;6< Nb?;%Q%):/>\:,h;1&;_;b;S;;iR*#P;E;2z"4g:[9Z<eN<;<qv;간<6:<|ٻ c?q:939K 'u8<f<;k;Ἳ׿ݻDo?7;_ ;͵%4?`_♻sm9zF;;g $|:>ӻg"<x;(y :e:Mt<=+:7;e<YS<do;::=ͻVjE:9;zsoU;%<;:9Vw8+sL:;fW<G;Kϻl;/X<%ߺ;(zxJb:;":^(;o< !Y.Y<<_:;;[;$;';_vT990*;;F};ռ[8;q;&^;:^;:d;;.:=޺)ֺ:6xEG:8҉p3l:)RCC %j )a:79;3d;0; t;x <1;* :7q XJT;X;$Ƽ$$Ȼm"[FØyܼAgD +x*_N %;`: :s;s:c9Tɕ+t +:n"ں!ͽY;N;+:|!ǭk(s s: ,#H;';;Tj+~;|uF:ĂVຸ@: +b9 +,Y[eͼ#=! XwCX\; U;п;@MVɎ;i3C;f9;$d9໲ .;II};t$;~3T;؃<w;;,1܎<:W +;;û1RU:8s9cD&;܃;⢻'|S'Ѻs,HU`=c;ѐ^E:N;1:LE;ޮ9B1:ԺR;9;e;;_Z;/;ԏ +%4V;~;NLt:Ր;c;GQ:+;[;ω;C:k{: 喻0&,;<C;P˼Fz_b;~k:oQ:c Q;;OP;н:h;UGֺlRr:Wػ?dk;a#o; *<2;xE9G: +/6Gvcp<"Z<M;n;!ȺZ y;e;i;tŃ}迻XU;;SeeF…߻ f;7:3A;d; ; <&:M, 5ż'|U9̕T;{;8YR-̺nF";6;H;';;ZFͻUz\;LK<=b;$`:JR;[!<\; vL|9?;:_\r )3:9c;G/G,+M,ɑ:` +vU8Ȉ޻Df;,Z<2;=D#r:,;0;U2.߉&;;5&;T8(;LuI_<3;ǻNs Tܻ0A<'%x;L8m;4;D;m\ !wYAm-$ѐt6P;R ;.-<ΦQ:/¹`:<p:A+ <#7\P;: <&h\;A92ʺm:Ƕ9peڢ6c|:b8h:K;=:`Ui-4*?1:IV;;M#:Z5i+Np:sM>~׻ 7^:-;n<`<+;WHvrmEc:B9d`"L:Gp:bRB6:H ;6<"m;y:< 9V;w;:HH(;of:O;O$;W|9g$n:@w;h9;@>ĺjP:T伻ll L:S:M;a:";I5S+0;m.;U;;ȷ;:˦˼\:@jo:,N:,<(<$_;MAY:r>SN:aiP;b [ֺ-:D;a:@ạ;<;Ź!iee6>8:oN';u:JR;ц<;/$E47޼; 9;׻Ѻ:(;B;[<#;:8?.]89tMYT;ROd;2;@; +;[;OQ;d;?r!:sL;5;Eʼ.'ػo +,BYGTs=\#[ba:_;hƒ;3:v_R;.DN/@th=,K~'RPl4X޺.Bg<Լ;><?;C IǻO^%D:v;;eP;;#<=$=!= ;k;0I9}껢NL:t;qл{ﻫ:o:M:|;P+< +v8:;Hi֧U;6;iU;[<W;@<9_;H;WO9xJ0'<14ؼ~6<;*ۻY$a 04:<<;8+Q[&H:桻(7P:X+Ȼƿ3L:o;j +;; ' 4:ػKv!]$h&,7U34EE6;;B9%RcE`:Adu;;w~t:׵; Y8g~9);<;h吻b򻬦;5";Z4;)ϸ!x\O;s;[6»VQ; +n';_;;{xa;^;4;n0<dz;ǵB7A:Lj*;d:V};;E lGUs; -:jໂ7-=:F.:~ +2ry;c:289'v +%:vBk';7ީ,mI;z <.#<;kI;tt< y:ҷ=:֒<.:R;<;E=;f;#c;Ui:99W: M;:~F;u<넻c;x<A;<=;$[לպ|5]: o;<o<;\;;<-X;Qc;8;7b";H_[;J9a;D9Di;f;:8ûFʻë5!;_&/#<6:%!;;;J)mi/9X4Á> ,:;;{W/h5=<(lǎӻ:;; fۺ#<6;c)/ga.L";LxN:ʏ;"=;xL'.T; :׺׻;/<*:2'ZBj<h<U/E8x8SP6ЕoC=ZCg?>$22?J|= +O8E"@E q@S㝕@`TRH@EB( B BBSIMPLE = T / conforms to FITS standard BITPIX = -32 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 129 NAXIS2 = 129 EXTEND = T END qx} "b:ۻn=7<UX%=00}o<9da<:1::~,%;E۽(W.;)<ڏ<0e^4<(9g=_7;Տ3 +<k<<:iFyAֻ; +GWTKm [<^:BD1;^=>+;cC= 2 i:?]`{=mh&$P)ԫKd*a4->pU9EZ<$><ԽY +~=uk޼Ws<ﻖ'*{M<%;<}=: h(L/<{;:z߼MO;H-6޽<@`KI0컣Ѽy=[ǻ,=<~,cQDàB<{yYެ?<<<ļ Ot>Io^<;r<;\;Mpvf=tN}pɂt9U8;`;KyTkj@<b(O=T ػc.%p=99r8>|x;*D!߼F-rռӼ![:ywK0<<c="-q;yLV:<#=k}<>=gp<;qc=,}<_P<#pӼ(eT ; +;Q<Ҽ-0;y8.4Avvm6D%F;P 1`K9)dS:q=Oȼ3SŻiK<<.`<:`D~:8tEY<=%^M,ʼm=YB7<L="Xm;(<Ȯ<'<=wB TC.;;;1<5;ݔDz <<5~r;2;6z:)t<'< R=8bP<Z30k:<'<}g(ƺ;Θe<D| <5;*;G;hS=&7,v;22=%f 'j32T='_;K/<,CͽFcӄ#A<P= A㷜.{6-F=;xL;A$$=KI*v;M%JYx=[~!<6nļ[;Q< +ݘ:j19ȼkw!ݼu[<*x:<MLcA< l<;Wa<;G~ﳼ&B;mv{<;<:<МUY=<˶O8=8 +1ƙU[fdͽvlV(4)'׼z=h(ݼx=55&( +: HY=3Jz;h)+Br<Ƽ)<0 ӻz+;]<8_Z+X=#9m;Q.K<(l"=<@=a<<2Ǽj9 < 5 +Q 9q]+S<`<{ej< +I^=5<@<~;rH;[q;<'a<6g; Cǽ<=vJlYy,=7<J;qA-Vz<;CSB<+ ̺-:jC3U-p۞=+u4t:T8s?[%Te5(߼<-#<0=pM$bXkq潙3q4;L;z==/= 6<ګ0=OhҼcwb󢝼 &qm4W<e<p;,n<=Zr a;߽8= p3/:6=ܥ=q< =ͮ-զ=?W< +=lu]l&> >]-O~ ˼r;<@0:? e\:@>M<;'j +qCP M93=w;DGd==}\俬?L[R?n?{d=VU<=.F=< -<*Ͻ GMr=6@[Df<3>1Qca=Z2r;B<&*;.<-=9;=!8@=i;"=\ w=4AG̼Q%o<5+=Z71>KjB1A@>w>ռBA=l [=QH<<=1"=M=/*;EwcӼV<*<;ʅ<:<hA.<<P;R<@4~:& ;9bm=N1=BX;ٝ$Zz` ɼZe|Ҵz1?Ɲ?l|a˶T8 +=1Q0<]=[}껩Jt|=ļJ;㰲L罍3GN$u=,F=Z!޼i;;;W<“ +U=3#`Jy<Ͻ]7m<ӺBF8h`=ƼYu5;۶&<͟<%<;?$<`<Ŕ}<Ѽ~1=:*fi=nDF;h8⼾̞~=hf= I纣׍"u;箽<<.;k<=&<Ȳ-=/WU)<|˼ռhۘ= n;e޼s< +BL;4;IXrC;H=pψ<7*0έ,;b<9z?rlؼo;<+=P x"&=[5J.D.=IwZ= +<<밺;I +-׼5ݼN=-n= W;z=9Pyh;|B%V<)< +8}<<c7ټ;c7黟^(;ּ)2?;1c ;l闼/j;Q:1=5A %F/=#6h=ۼ8CH<=ʽ;4<=M<<-=":<<=:=$ZGp890F x߼4Ȼ2R'ݼqd +%Ǔ y/?O-(ا69Y (} w<,(;⩞f$ :];螋:&<Ǚop;1=W Bb@Ɇ =Ų3;ѫDf;<̽<ŧ=<щP9w; r˻rgZ񓼽t:{•<;ނ44N| {;.CS=q;O <6e=Cqѻi= +; ޼xK<;i=z;IH<+g;7)nA;*],934Xg<6<'u<μ |!XźA6ϣ=P3=RҨ׽J;?,W N<==Pq= s[<+<|=K*K|4M9=e;Ή? 9vV45>Z =A :"j>< :mrȼm.r;ʜN;T>qIl=l;sջK$%= +T<<#yzaǻ;Q?;ரS;<%U< Cһ;F7 +;F0= eB<%E|&^m.ļļpsl׼i;#̼CKjA:Ong<zֹ)xjJ߼t;Uq<  +ߐwM;W۹a ;0e1cIXCD<ػ=/@:ky}=0LDq۽<¼;<|CڼZ،<;輚Ac8E>P$8(ټFκPL<¼^=*<h< =0=*=x=;1H=üu;;1<&b=3 <#@='"j +A q=H==c缶C+=F yR[hlBY?&;0<4<k7< 1\{E Mf*j u=D3% %;;aC<,O=f<׼/k.7z!힆@ +μ˽ٻ1*n<#k<}<۽t&fb̼W<Pq ʺӮ<^<7-mNpлk%<.(W?,=lQ)k:y; 6:4;0uRW!V=Z;=ûF5;O]<(7mU<I%V<sa=#/4W;<<]C<=򹞼?<-@<۴/ҼZ<®eV܎$<_ҼS9K{=Z;F7<,j:}><Ԩ;p;<.ŮW'B [;>v$7I<< D$<=PE=}d0;ɂ;m<<<(= ,"1]7| <ꯈi< py= o`9X<'=9oj=%=0.=T{R<>נm[F=I +-Ӽ[= T"<ɼI==b=VXN7<V< +=9j< >Y&ɼ<示g`7;.<<+>f=5;˂<޿Q<ċ=뺽9U B<ɽ/0<`ﶼDKs<<$OL) jn$ɼRK= +|;;(;!w߼$ۻܩRW]Fյvt<0;yxXۼ7=Wy;<;8VZ=:}'Jk*T=h="<:_X<W q~s?<=5p1i<`xd|䍼4=;8.<7(4;ܖ<荼w<㸫C?A=(YpY]#{;pԼ9/]P<'%*ۆN}3(Z< ؼ̼q-<(c;>1}j?!=GQm<j9~=Akn&/;@\<<8J<=5]лͼ4jt4 !<ԼU=(g=%T<<$ӷ Z=:X|=h;#+ <<)PY~=2K׈;8 ]t<;oL^\;C1<]?q<6C;\P;}㻴<4=H $;;~'=c <&;<7k +.Y'p';6<!\ =<.*v 0<[*;=<}-om;.yGν(cͼ|;R ',9~> b8=9fJ v<1e}<_L&];H<{:Y:=H: ׁzH<'0Aqw9x48';;';Li ^@=+s=<];A0j!ռS<ɓ%WE +B0<ľ, # +;d\n6)=1<6~Pl<:wd]D.єU`xA8<ؽs$W:l=;M!=P;><< i<—=G@$<<?q'۽K<<_;bϼzgF.l<>Ҍif5Mf|O;/᩽Ż+=4[;O<+gG&=L<Ҽ;JY~;u$H\[=Gm<ջP:۾<}OE<"=I~`݈˻ݬ < ýQm<`=="ӯε=6q<\|T@=6dy<}O;}н~\'<^;ӓgKkɽ0K=K{_ =w<0^Y~^8;5Cp=PzG婺!G<\ <;.9!)A='$;=5w|E=w!߼CMn Ta@;R1V=V:;<${_8#<%=CN^ݼYہ3ԼP<=G=:S;ٳP[`#<=hǼ=H<<}2=c .4"<~<[Lm1<8<]w:=V.v_Z;;X<#<ПPCaJ<|<.x鼛B; bmӼ;7= o̾a;l4= }0Y ;<= p7I=g:kt0:j_üp*<<< +ηu9N9H<2<L<=C2<t=n<$|E ;Uc; f W-bd8<<6T-c`=# ]zȣ; :~<<| Ju'*A<9<] 3=#<\<лpLE&;-TE93<;<;a <[Ѱ ٻh<+ϼ$<`ʼ7<+<}09 <4U 5=SݦY%n34,; 'Sr s¼<{A;-byx;N)<a=쇻i&{;ž$$<)z4u<<ӃHЏܽ"q3y  9;Wm=Zh#<хw<9nX=)F=@}w<\DS<`&<&|< ׽<&;ee= 伇EaL{='r=.<<\aBI<F=1(;=K,=GL<%ɽ́<Ph༐` Lϼ/}s̻՞<^=:I;K;0 c!1e <߻L AӪV=WV +<ٝ<^i}<}0z<4;;0EUIe%9 =5I<,+IR=<Լ= M=]= E=^ ;=Ą<$Q<Ȑ=u8=lf<==,l=*U^=<3;3Z=5T<_lQ8;+=g<[;;${<"l;V μ[C:);;S@:V; <<{Ʃ;S-:inK%Qμ<;;;Z1'<(B0o=&=?=b= M=u=1.=~9=s<%<~l +H)?<ܽ1Vt=q=PG:t<)<!;$p<D<4X<[w=Ek<|t< ǽ'w8i*J"]]F= #gNTח=ʣ<d<(t?<ýF5<<(1<=PĽ<:.L1׼h$=N>#m>#d=JL=ջy>>=z'v==T1== ==C=a=Ӷ=q= Vk3{>RH>w>\>t> +9=>8>zv>$̕>;`>!a==6=lj= + <#= 3.L<`<k;J;e?=z=c!/;<{=ηu=Ն== =<X"= N;Tz%.7\ ?M<V< +c/>mv>>>y>P>(8>I+>fO>>LL=$=V=,Ί~=Z;3<1U< <"6<٣V1=GR<}5= =<<"<5g<;WR{<ԡ =hw<1:ͻ?<=ve<8.E=H<\-'=K=6F<, <=LO==ܠ=+V=?>=6>M>U>~V>W>> >I=#>_>k+>> =z=>=!=i=aq=)=z=U(=~=>=CH=,=q%<;<<:B<"=>07>N>05z>|V+>(>/? ? 9,>̐>?Ҫ>2W>>G>)>:b>m=ZB=z=`<==<O<;US<п'=Z=<2<О2mUv<3G &e8w(xXF<Dȼip9<\;ߙ>=>dy>>?Ėl?l @y?t8?t?Q_>f?>e> +H>) =#=g=Q)=5=2==wQ<[==; %μѥ= =0<}2<ۼ%;eI:<^B;; }<|MV>06>|e>`>G?5@aA-AO@q{?_>k>n>/]>Sb=;=ZG<<=,^<==z=(/c=^Ƈ<>j>wL>y>$?b@NAA75A!u@@4v +>2G>,F>}on>> @N>3>=~60<4;<X .n<{8g=NX=`q<>>#>x?j%@ +ؐAXAti2BgBC@0K@?0>>>=p=kM=9r= =^=(=<==r/>>>>N??4@(PAAB;Bj @Ѹ!@Y?G>}q=q>L>s4=,u==9V=Nk==z +=,;^T<{V=b<޼c[7MDg;*_ qڻ<rh<8t2<ⴼϼ<~>>>6?AAAlgSA.@k@9V>x>:g>tZ>M=)=@=j_==^Ͽ; ;&y=d>===u5=>3>AC>_>p3@c=@j@@}@^!?RW>n(>>f>f>B=~8 =~=Q<+nّQ( u>:M>b=p=;=~Ag=:;UEHm2;<=G'%;g=CuO%l4;<$=>4b>oٻ>qA?I%,?e???BW>n>#>@)>. =z===C=e|.>>=&<٫<|[Jd<"p='IL:pN?<輶=97<맽<}R4!=F0鼼nG &{Ih˼1A={P:Ž4<':Ļ<^69zkxhL>)i +=ѝ>kN>>Th>mu>F">o7> I=>1S%>mb>#B>=܉<㚓=5=H =Sm==7ຎ<J0=m===+=C=:ӻܖQȟ; 9d=>sD>}L>ON>=>dz>ԇ>ҕ>>o>[_>E>oѺ=H==6=#=XA=ZQ~=nJ#>H,>>0>C>+>Dt>>ݜ>#>v=ybX=C=cr=/;f>u=EM>\>kMW==&>@q>'=NT=10=u=h=e=Y=CK=H'$٠=Qi=Qe{=ܗ=9=C =z=v=dkt=Z`u=D;ћ<е;4<Хv:6 ;m<°VK=0:=@D<= G<;'=ô={<я=cu= ;=E=6= & <R<<;Km;q= 5;w;gμ(,Ƽ$U]=)=LS-m>aX<.(G7<[<Ӻ\9;r-;=5;Y{;C<H=Gr;䄽sQu<]e(M<><Ͽ:ظVPװ;m_<~;;==M1@<(=;B<$ʼ<<ݼ<z<4=Lv=1n&y[;x`<HHGܢ㺛Ϗrʻ]<76Z=`A<<&fkL<μx,92;2C<仆a;3m:0z.0]0<(2 :9<_<<9K<ڼ=Nܼ< +f8Ol< =u<ʣ<6ϥ=ő}޻>k<㛿=<'Ֆ[3%<16=;<+^$tle@;%$#B>>JB>w>'j= =w=R5)>4>>>>iR>0=2{<\=[?=<_<% ü;c900Oͼ<_fh86=n>h5*>5??7 +>K>cv= =F=rc9t+Ə=-<9ejd??+?$? ?>=5[=ϐZ=rei< <<]R<>;ZY;kK;"#_v4"޺a_=$s=<1k|<#39_T< ˼Dw>S????W +>v>0=5=.9=[<=[缅u<;;p>00n=[ x?e<Tν ּBZ== wUSUbE".<!<*=F8><4; Ҁ< <5G>rB>|^?4>>W'D>=M=IO6L>L>1:=Ɓ=6=W,;* +=R<<@;D<<Fm!=;ݬ=^ +n<8j +FN!k82 ̛Ie<?XHPW1;.6>7=W=='=T*= @uC kEq ^?;>#l+(f<;\X鼚Kh~)ͼ#Ya==6= =_h+i,;NӼz뻍=;aǼ}Z;2ȼe<;l>0<~Gu;[-;s7~B=$}MQhp`Jȹ; E8D>g(> ==-i+*{ʽ"<|c1E<u <*=qiF ;*o=2<= y<,:z +:>#JP F=r= Uϟ}μǀzc 42<==LX<ゝ;7]1,=Yc~p06~<#H!5ۄS<ü1:{Z̓s=2߼q="Q=R|<)wIV;C:t=2s<:#2=V+=Vwy.ԊtoN<;)/ȼ#P4; +9o<]3<߼i`=Z!6=:<n:=H; C =ќ=?=+=6e<9= = *<}ڻS<}#G;b4<<`⭤<8 C^4T=̼}|W#<$SX? z@;P&h=:3=ޖ<8:k=Qa=Zq>f>zA>X>{5=dK=^=EN=;W:]=4ܼPh__(<ۓ8"<(5*3HQ;d 3e<eSɽ9ε=z&>sS>? +>Ȗ>QX=>b=;=V==;Z =V<+>R=$y:c= o nؒs;<&H%S׵<6]8̦ r>Iio>:?I+?X?>+>`==l<=I+={=V<^$;=V2=&=Y=$= F: G<$;憼8<; p';X׽[2>x|> >O>'@>;Ö=Yf==R= ;h=Mz=H&<= ; ;? ;N9fyj <9L,:갘~o=Qm;8:}EԼX<[OF^Y# ;l;(><-<(I;^=R(u=> =]q=M=VYÎW.1~=x8Fh iXYP<ĺlǛ#pWGO:EڻX{y<#<B2=z=p +;*:<#q<`;YҼ2=,dʻVμwS~:ʞ<ԟ;<4}= +Լͥ< |<<:=n9s=I3A <瀻<(?<(1YCziD\T<лI I 8<)d&t\e?<;9<&8<\<Q!<%= lR<!=-2tQҼ ;=NCk=N j<;:1CXt;BG<<<ӻD<&^J=I <:9==-<^- W<:q滬;@,#<Hں=8ꋻ@4Hs;3";?;e#V[̻w ;|q<~;;.K>;|co'X:(R:W(87;;_8:5y_AJ-:{֍:<:P_:NtSdi;!qI$]";h;bdỴ ;%k=:;/;D}9ў'λx{| +LB :ĥ縼H>:Lw::rEv;(;J;@!p컋w;$<;D :c@;g016l][B>G#;;Edһ?P;~<\EԺa66;;0;Vt:ĺj_pQ9@3/;.<;9Cy;:: ͒$;FݻD2:: m:&;OigQ7;Q3<5-7]JZ);)<(<.6;s9M;Q:$vʼ_Ko;b; N7];-i;J;_Scj?T6y:{;< <,0<@͞;p8;A:;;%f +)y;_d;v>91;:;4L;#f<j;p +:(D]7:;d5:ibf`ݨ6{ݤ;}Y< "|:;;,˼ )f;9 +:&;l4[azt` :=A:;`Vz-8:]:6h:p;l`;K4;+;;G9)^t9HE:CKϻ"K8JM;9Wȼ0N@fr;ZÖ<g;{YbҒk;\c<U };)u&<YC<<.k/4:|ؗu ;63;;SBb7BIuz;e; M}ϫ:n;Us;: +DR9#m8޻"V»!;T>B8a;3;;Z;;<0; ,: +m;3 ;\5<$,;W<#|;өܻi};);*{;p:i<:< +;q;y纏Y:_f>7;H';Ci;$˨ɠ :nm:;u9Q:-:2_P3];;;;<#&; w^; P?鲻{ۯW +_vȻO<0[˻& R.A&4w:':e]#;;TÒk:6;B^,2\vT軗*YP;;E,;3;_D;<Κ<+;]ٻGЫɻ9y);e!<b6_ề9N :b/;g(;9KƼ@û\왻;'9;1\9 ݼU=F';YL!y]Q{.85;SpEQŖ;Y;j9s;EE;LJ:td%Z{ϻeV4:̜$;<3;$; ?=;ӛ:yl+;*;>;^: X;DH9`<~:Z-?:P<y;r<Ճ;a9†\ zP:3v'J>1,̐-;6<9Z:";ߨd&$9;;=;O $$ 廀 +K:w: ;A;49;'`;@`]y;Xg;l;.%hi)…;T۱UD:;CLúy:WOԻn9j;5ɬ .-:4p[]0V99Z|;;Yv"5/KZ":99Qd*9֬ ;;XgD毻;׺Iq:q;k:9 ڻH9@e:_̻c*wvټ7=+?(;!iz;\<]<dṉF{6e5r9 I9:!::$V:6hֻZ;:l;u70<nx;y;sAY:!K"c;'-^(6;ħ<(6<=/:ƺ!<:;;:ud\@?5:PU-:vkõn<,l<[;;;q;C;=:<;Ǩ;q;xyӌ:b;Q;m;JՔ;ZtK|;];&9a23һռ&z\3F k8ŻANϻ۹f;k;".x<,x ;y;b4=':RyP6dcdYNɻ55Nأv;)¹K I:a:Æ +?;A:ٵ5;w ]$:;;m@<;9aH;u9ݑ; ^:ד<4Z()0}'4sƼ&"1;XRYƻ + XW&83CnO;xŻC7;ؕL9Ҥ;3*9c˄;S1eN::,^;0;J:N?(<_cP:XfMR';" .;3:X +}&GMYCպ9;˻2BTIA>I:U:w:c>; ;Q:~;9q۲<8كY.D99LZUļ ۏŻD';<{;\'\/0W;n;;<emŠr;o<@8; nF;.*J;(";Ȏ%:ҼC/:ݺ3Ufj[%(d"\o"ghY仪_:g*:i,ƻi;d?'m7;6;Ƃ;;Ԧ< 8`^%Ӻ;`;)Ys뻇guG@_%;pR;%;C;hC;:ƒ;:V;F;a: +ά3劼Dμ޻;_<I=qo»/'ĺ:i [jlD:%;z^:(@#NdoB;y.JEM;A<1Kl;'ۺfW};;|;x<:3;n,:x7;T s8w^;=MƖﻫF5ψ8g:Z<M?9:;a;?ۻ6[v;UB;*; ::"Z\Az4WV;F0;UҸ*Z;Z ;^5~gY:٢e;Bȑ^=mAaw:*s Ӳ~湆 n:-A^̹ԊջD,MػFW¼Ʈ; ;<<( DcʺZE @HW ;"<*nY<޻6$* ;mO;H;;o:̔{6";{;bA%;;/_ +(!ԗ;3s;EWs䄻u#u;䅅;zW;<4;Rܼ +};=Y;\Lx`Ԧt;z: sb;0.}JW;ZÅqñ;ʻ57+ 9X<"u(} ;(;߻;VO:C:R8=ᇼ-\kMAI~L;$ + ;:mj:!1z#KJ;x;Xa;FAe;};g;:U j/%n!;#<:2ɻ;D;)b;bXUnS9;X;WV;;n<0E;5<m;7<#P;rV;J;ٳ:ޯ^׻au;ۺN;ߎHGsix< :$Qhrލ;1;B:}:x;9`;?lȻoq>X;'8 +&;*(4;'<axRLYׇ9,:}OlW;|.;q໗w;e`ж;; ;rλԒp|sN;p=1:F;Q:^;;0R9^6 @:c<;F :,D< z;" } y3P⺊W;G_G]?;8[D<;2;4o bϻzXu;m;5iW_hFI;C;J :9YE΋;};ź8՞G/a'ܐR;;h< !+;Q+EpXb&;^;;; qǻ.X%;gO:A;5;;8:dμ:u:ʺ;[;<];{7hxIJQ;;Hk; $; dH\;=`;s2˼2`ʻr1͟)|G*xQPMKg:a<(;p&;>; +:.;T36;;62;v+*#¼6;DI<,:WX6.=4ꍺ=[ҹM;;sJ<{f;~M<Ũ:><;8Go8Y f:&ӻ rݼ&]9;; +;8@ ջ={`κr%Tl; պ ;Fg;, ļ0Ct8|v;+;G񀺒TwqGu;;h ; d;);;p;Z:޻3׼ZQMY{B{>;6j<8N]:T?~+<$M;Ԓs<';:wg;#;W;փi{?_;Zz ;<:2;O9;:,:GG;i9_=;B;#:+꺃 ;C5;FF{;ˤ;@<+2\;/93to: , +VAĺ: +QX|KCEk;#<*;:<0;ģu:; 9bՁ Oh*<'< 5d"=$;KٻDӖ;E9*:D;$C:\L>;ں62:S~% ;<:;<A42}*b;GJ%Dz;%{`;;2B:WR;я;c/:;3<+:42C=};<< hD +g?18 ^ӺܼμpL:Rٴ;f{[Y4>x;;$_DH$Q;+dhe%;uFZZ;x8:M^꺻t:;&&R:'6;b}xIN; Ļ :ۅ`b{G޻4+kQMA󹺆:*:9s;;:91~ɻCG9;sx;K" +;g=> Qc.T9o8++;Ln;P:ݻxn ah,_Kd:S;\Y;;Ş;7;Ed;;9;i;;ڻ&;k;7H:z;+;3;)8EY*;jɹFL;zCPu~5;p;}`3>#!ji'8`j +>+9;#G Ih*[s]ћ9ư; +,ں5^z:h};`GI1蹷d5v{=Ut55;;)F:ټݹ3=:~?;U;բ:-;O;ε<%b;,/cg]:k;MP;M:Et[";%_';!<>2z<&@qoثq;{;\(;E4;;Ի%˻a;/+ ;ͻN9'::7;< $əv;j ?;f<ݩg$:Nr1;<D<U<6;;mܺ c"vw;$::úǡU9piq:'ɺ55 :fLlhFn<(<.#;;$;f';Ȼ`ŻއW:O뺇;w:n25;ʺ SûdGNS.;bH:$G:g;dh;kA;s1>`ܻOhff; lǻ7Aul;!(h^y;;:?C:ӱ3_D1;;L:d4U;<#8;%;$;(Ļd;6:}<;; V8Qm9B;1;eo;y;@+"'1һl6;< <^Ȧ;tEMZ<#<;%:d :;U;3l;Y;.G};۵;;VEk%뻴;;Q9p;O;<^t n>: \"XUE;J=`g;C;A[;Y;3<5;d;$X;;<.:kmx:߻K4P;6;}FSx~m(;{95: ;J7.:7_(T;mA;=\r1^黗VySDȻS;1 ;f:R9rMM㷮;-;ﻋ5[k G; ;;ޢ<\;ߙ/شSRii;;L<#6;$1;ReI;8f;M;k;"໼E.xɯ:};a;70l774J;;*Bb:b(<@q;FJ:¼p:D;: ;? ;=;<Eg<;6:J;;c(D;}p;dk;p\;<緼Q%:C;<9g:,~bJUh:֌;ޭ:|k:.;jm;r;揹Tmn ԼY7<7;{<;;ܑz3;=< E;-r[Ѽ,*a+nZ<$s<t< + ;< +J;;;ջN`;r=`;\;<-W;:+.:ԥn)pDN;,ZS9K6/;:(;!ae Y};*H E縻鸉-D?bA:S;3n;1r'FBC=:+9;§깽\ ?;s;ܡ;k<6<1;Gݺ--FۻMft;;W:ºp͹%&XuK7&6:;::& jW,o:ݼ 4[;;C!rt?ѻvFb;W;z'm9p";;^:R;;&L<»Mmo4+:SQ;B<Zg;Y7:;P<(;;DU< 0T9뻐m;7n;:A9,ںڸ~E@:;Q<ڑ;ԍ)#м.,9;M_;]@;;@;-<<<;D;< |<2:иax z;0;X::zҿ;q^;;А;Э /mOyy/6;79;fH晻K-%1x&]#o;HG;ٸx;#bcػZ9[<:{+<g:\_: +<9; ;(T<9$+<ؓ}!Sx]m;T: :$;9ۻaƉd;;u;&nO9yʻ1:=;M:DŽY;l-:rҼH乻%:<(<-'jgzXrD::b;ꆢc3`E!ûJFj; WTϻ q#emF;cD=Z.;,c< :pRn:;WQ:9IWt1{;[;^Z,eV)Wc9x+<$h<;;)#;c7<2<>1S;[< R9<|WI<^ջs:/ ;Y;;<,K:hO;ΗǺs Q:g;sB+09͝9@"tP"hT5.utDGL::;S:ֻҐN K:<%ĹG;ڝ::8$;;:<#;:~;E;3<<U<0<;tΖzxO;#)餼&. n5[VN&;g;p\֢\;mH;[;Ż/m +x99~5*;R^&a:J-;=Qֻ7ܻ +Y/ :8<_V<=i< z;u^;ރ8:rIR\;;P9:ݎ Z]fai:Wsg9/:JO&E>o: ;m;|:;V;rz<+0ϻtP;ތ;\R;;\wM?D;2ٟ;W;xZen<( r;⹌;e;=ciR:Q;d<J<<<٧ ==Ek<==&=+ʆ=8=8I=<<Mk;: 黍N q1$ik;E< ;z_:P;0v/:Ł:@?9?I9,~;<7"i<9 9`;<), !;#9;USz;_qź;nJٛk;;=k*=} = ="=V>==宀==~3=S=c=i=F.=S=7={<= m=r={<=6<2<՘<$<];-!L>G>4e.>=I=h=m6r=j===tI= +=K=tn= ?4>#>8C>d'G>?Y>K>=d====K$=p=D=XC={?=>D= <S~>OT>i#>>@>> >NI>e>>=Y.=f=~==>=~(=jH=)86:V4}{;:Q<AP:m;%<#$;;FbVݹs$;]Q:&8;ȹB;q?;*u:'\lT~J 1nؼɑ;u:;iy޻:;*{b;P;17ۺ"X&>F6>>>y>!>q>qػ>976>_> &$===&=!&=·=|n=1 <^=Q= +<<١{;k"?;X:k;޺ R9;%V0h:A; >;q=M;̑ͺn 5;hC;ܺ;:< %'==?=>T>(>]>z%>W>X>.? >>>`({>? >J^>+>a=ګ=ͬ===T^=8='=.f=Bu=&M= ~=~=z| =;=O=Y>(Q>tA>>>Ӫ?xh?}D?l?h?>x>|;[>>t>9g> ==ŝ==^=Kqa=8>=56='*=4<<<<;Z-<5x<4<6 +<<7;鞻a;\_<7j< @줈;f;g;98;[u.mG/;<.I<oRΉ:)DF r@7#,7;v3:P@M⁻伻^<~>T[>>%>? Ze?dR@ @Z@#?}I?A>.>>>`i>!=珉==l ==_b=<=A[w="<[<<~w<{< 1$m;k;;bl;ݠ< +@f;oo!:bźX-P +xERĻ-yX>A>>?5d?@V,@ނ:A @@}?f> +>u>>>=}=yY==;=N+=2c=<P>>Ƕ?D=?@^@(ALXAA\@@9;?T:>{>^>[==r=7=\Y=s +==1<̷9<{I4>h,>3?L|o@0 @xABOQBMAS<-@u?!>Y>>B>z=4=4=dG=Sk=<3<|;<;K֑< +C]<;\<};\'je9i;n<2}|;fpU%Ί- @仴:75Kʻo +޹.;.j;WA{i#º3w)M;S< +=*D=;<;N<';׿:;L1<9]T' >q>m+>8?@@ANAXBMB95Ap@@?>>>J>*=bd==>"=k&=%'<><;;1o;<;ܛu<<;; zj» +d7-*gB*;t:ߦe;3<U< >M3.>xƳ>=?4@h@#A)AĿAZ@M@97 ?|>\>>z>%==P5=D==:=r=~= <@3<<[<"<_<<@<_<<==t==V==Z====+|=>Vq> >b>5?@Rn@,:@Ò@@^i??*>vI>>S>Al=>=j=}==WDz=;)==<<'A>IL>U>2w==H<<%~DVo>/>U>??U\Q??%?~?? aZ>>e,>>u>,4=-h===kX=UJ=?='=@}=v>XlQ>_>=$=Z=<컁> >ot>_>>>ׇR>w? +C<>>T> +2>O>>3>81=n=W=*==8=<=wy=Wf>>==g9"=x;suBQ(BP# $;1;v}:;{ֺ]z:u; D1;x:0_ȻYi5_J:. 9;7B;c3rH(o6";;;:s +;s< L;( ϻϳ; +Gc:x3:*<R<<-<9;;M;HZ;SE;{CC#>~?>Y>;> +>>x>>t>>DR>]XR>$===<=t=l="g==+ _>L=>S>x|>!>-&>>t>rE9>=ޓD=ϥ=O;==L==Isa=0b==J6<|a7; ;6b7;/~<Z=<==> >j>>>m i>>m>y>:@=y=R=>a=l===$=:G="N<\<*u<#'<<1<<;>>.>8>=Ŧ={==n2O=xl=jL==t&=( =)@<<<_iOςй+qY;ƕډ%8﹄x[U;3f;ݻѷ;d;b:6;<V;<$o;}~W;ѐU=y ==*='=p!==o8=>1> = x=yj=X==}x==e=\<+9 +\;BVI8w9:Tt9 ;y>=W;ʼn:l56Bɝ:Ƅ; =Ne=ƶ\=+==;=h=)n= != U=4"C=!v<<6K;HDRS|48m +;0ٺ?60;!%: ;$bOsΚ;u;:ٌ;;<6SNк:};);GՁ8A;;oQ<@s<9;t:ѣ;T+< +:Wg9:ϕ9w;*w;&BP׶Ni;Y;zc.;OD:غ3;Ǖ < jǺ}L:1;H0 ;{mA;^(;ImAo,ɻ9e;_,)\<70\;;̻:zR;j;0d;ٚ;Y:;>;i?ב1;U;;tX#C:y;RW;o%u:};d\<T7ۺ,w[;": +;{W<0T<{< n<6<h;Lp<;K(:(;!;b:Y:7k;X.<;;$ՂrEQ};9 /;Z;$::8:nA9˰ԺmxHyE;Bz:l];8x"պS2;&61[й2;$X;(.:73;<?;&;OQ<%n: ;Uh;"0;Q|:͏PPFJP;v<;H;$,}ag;w?;vTz<i;i7:E9; ;0@; ;;!::!ܺٝku;wU;;A;&Z<:i9\69v;Z<i;?;0<N<)3W<޻4<:ޝu;),;::5;CW;];Iu:׻+:~kź9o;L;T:a</< ;̼;<2;<\;B9<8< C;;y;NJ<$<$d;;G;+ +RN:ϲz;f; #!<6G96Jt;-::`{;@;%xi;to<O;mP:9<-A< a;:Ru;;@; ;<<kܭՂLZ|:Թ"; Oc;7l;Һu];5.;Ⱦ;W;˟;<82=;x<4!;hE;;:1\E]m.:1,<и;dL:;nuYrŜ9*9k:s;HI; M<<;ȏ<q<<9<>?<;G;:;89Cymhy I"8mz;uQ9:Y;@Ƞ SЈ;:;(<&Օ;}: W<5);Qo;n;V:2;A :$#,ӥ;˅:g_<AT;]Һ5O:t1[Mi;Y;|ũ;_dC;<?:4;P;6;#9;ۻb$%~;Q};AC:;< Y;-Y77;C<)90_;g;,;|]O;:5;B;vFc3;Ο-8;2 06SM;[L : X: $$wBkSw;; +겻߻;A;CF=;;K붼;)<6;vc)=uӼ8_T;;; ћ;H;B`;Q;E/t-:;<58^>:QJU;IF;6;<-;@:@<_<:E;33); (޺~ ; <8 ;9J;$4(;$<;w\;%;V;A#;͈;6; +;\r;<:g;:3;;I:} G;r-;*;M*:Ur\jֿ:Uk|s: ;޻;k+r;XM;*7P76:",;»!\e#C;g;< +<%+;<;';Ґ:a'޻\S$/@<IZ< < ;O<H껤A;;n<<*<7K ;K:(һ<O;G>E>a6j>AA> X=C=L,=^= <<<5<3U ;7)7<<a;Z%;"< +9򑻕{;9/>d>S>˝/>>h n== = =C;J>>?8-?S>P>e>H.==\78Q>?%???#D>>}==HH<H=X:~zH"_,;e;LWrJ:8o {Hg;;gr<<;s;v;n#f;A<[#<;80i;0>:>0E? y?j?y.~>m>==i=R<<-;:<-zNZ;+\ͺy< :k<0;;ak; < ;;K<T&>?>ɭ?>0`> +S>==)M<6x<<*;Ĭd< -0:>hXH>rv>Z> =hF=c= W]<ӓ<.p;X.ںP#W;(;T:Լ;vt;4˻׹~oZ;&::h;Y87;!;< \G;GOCO@, ;u/:|:P&Vi;ȶ< 9;D3:;Q{=5}=KA=4K==H=, = In<טi<8<< ;9;I;my<$t;ĭ_ۖP;jX;i@m:2;o:OaW&[Oʶ_F::$E< +Y}; vd:{<0!B<)='L==)=={s< ;;ÆI8辊j+64;d<};Gp<3'T<J;9cq< Y;:;Po;CG;u|:«;W;x:_ƻC$;A;M@:gܻEӈ듻?6;F<=-U=V ==S_<z;;:𺱊ɼF˺<+#<:W:^3X;); ufj!*2Ժ4=:4n;ĺd;M65 9&I7;d;)I;;N<>8a= =.a<{;㪆<o3<>v<2lQ ;;;;fٺM底^2|:Whf<;V[:6o<`L< +z0:j*;x;izA;)o :>N1`>=O<;+;z;A;,#3;/G:䬼:f3So< R#^&;:m;?;; 80:B`3:l{hʺQ8i߼:b;q;@Z:dFH);ﺉ/"k%;<'9ugH99nx;پ;?e:xZ;P;A;D:0#H<;?h9'&::7K<+W<"&p>JL;;lm;F;~;% ;u-ap#: [-;W;l:]|:󠤻 9IxM "=ϟ=U<|;f<;;:_;;,$n8Y ;7;،:3<6 +S[:/1<(\<g;Yv$J_M<n9j:?: +9<{< h;~t;Ym<;w9-w;;8BtżO.9>\i;:̻8B<<)X<];F}:%8r߻.w7*z;N;^';A0<;aC;(/5;Z; bλ2ŹˋLڵa;͏*:҉/Rs ڟKjѻMd*Id:u<-0< `ӻ-9:bU: ;*» 8VI;/;׼DvW4NZ;;k:XúQ׻؄**;;E< ;x<%Һ 좻c߉;| +O;|:~ Fr< q<^|C< w;;;(;|$);;<Q;;n;eg< < ;q 9;.R/׻&;y;u#<,;h ; :7ݻbXy ɼxY:g$ݺ}ȼ1.R;_ot˙ULY()p{:4;e:~>팻rP;R:Q7،:z lUwbL9;3\;t;r;q;! &};s;ݸ9<&Ѽ5FȼQ0ܻpR1). ˜nFiyɻ;bJI@;J@!|";048>#;x;893K|ڻai; *f>9ZۻArǻ(AD;U<5&;>:,p: +;?b<(F<;;A;@:;!;A;(u Ի:>%c;'2<;Ɓ:M;L:R¼hw {;XU;;Xs;;:r9I>I;ʺ/tmc5VW3<#Ÿ/;([;ʻ(ۺooo:<;Q;Zz;^i;_Ӳ9:޵涔;p;;/RP;u:ֻ~b>ƙĻ!PM_{l;;@<:]2;\;&5Z;Wp;\"Ļy(cֻ/; :쀼;;ӕ<; K;`;[:(r; ^h+:;麊:m6|H;ƻ0; :"BZ<){4:޺;_:S'lCm),A<,;9};;+|;y;h;z;rO;:W>~%Z-:jۻ0:hI͠~u;c<B; ܥ[0bM@~<7;xt;E;C; <\>+<<`\+$M>W4>ry^>SP>=3=h={=><)?]>ݎ>.?zq>F>Z?==+=i=<̴ev_9;B?:q:7}0㶼\ ^>{?!??[> +>Wm==6=}<<}<=z<>;_&'i9;QZe>Yc>>O>`=nD=[= yL;3U˼6";;#v%\: Y:9asAB;ﳻ>Q:sN3 +Eu]zk |;1Ey%޻;:65怺;_;:ek]wa>/%- ;}~%:#I,<::#;>A;>)TjUw_z* +F;G<9q_` p˰;;P; ޺;{;CȻ.Ѹ˾;0T< +:o;Z<{<? Ӆ꺲pջ8:#ֻ񻡓V*;/u-5:}m;;_<<,<&6b;؊! `>.=_=mG=Q=U#!; Aͼ09U<{9ʐǼ/:X;m;>;Օ +Pw; zCAr;ֺS8$;[;c+rK⧻ ;ML~hO;FJ;ͺ w;%;>:E=;"( CJp:z3x;idJ;hz)кҨ;rj;A<ä׹ $9نTv{rbb::M;x;< <:G:œ;x0F:5C*~ҧl5<1<9;,;f;ٴ9a;;u;7;g<<7Yfퟻ>:!T\~:_],o;B< l<޻;]i?:&T0! |P-uu9)1ge^<:#~@<Xһ+0vY;=<x <@$9AAT\ͻ^xVP&;-o5F{[":]A0 K;h< ]; M?;G<$2;fn.s;`;9Ǝ;>/;};(;G<+ ;w::}<<mG;=!:ض⻏):/9;p;<;n:׉;l9;:ZR%NMy"`zv;'<[:;-=-:)9&AY6<]<a69͛9NG6ޔЕSIMPLE = T / conforms to FITS standard BITPIX = -32 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 129 NAXIS2 = 129 EXTEND = T END Ӽ/?;IFgx&= '\=K=skx:E] 3{<ֽtgeֽq}eAk;ۅ:;Ue=h~<<;nc<='_!<^7gHB#|{ |>GOV=7=q=*jl<Լmw<=_vw4iv,w<<65l=BU;c_=5|hN9<&r;v<0`kY<GFξ<e`]N5=M'FJ>=ջܨI[=F<'w%=$;<9v{5:`л6><+D%`<<^(Ѽ<V^S>F'=,g;;8=MiM.j6<9qPv 2>E<˓ވ4LO< xRT7;J8 bigRX2̟[<kGCxkk=#?n=<< + ku{= +Yռ4< <[;<VGV=ƾ(-C(c`>C*{gFFg%A>b=6qP=v=E7=6%%pC=) d<w= =6|=Iƽ<16;fo *:Ilէekƾ2ąҼ(\plØԈT;B7=Ղ炙XZt;9=!\Q^T< U;T@{N<7h;~ #a)zf3P6>< $'栽x= +iýks=TQ-S>}{Ѿ/tH!WF;ps=z¾I50/瞾x\=j' +;=@;=2~=lK=$$1,;8:З6UV#<EȻH@Nia=<B>~=Ҿ!轨>0=BYs 1+Ӗ=²׾ =KCv2_Q55~=  ;5Ž#D2X<]%C +>E=Qa>սb<ʬU;R羺>5ӽ:=3"< Wm,=o7!PJM5x<7S;RӽWP;;._UgU=H> s0ý?է})"LOn$'5~AGս|0>/ʾE=CPuYʼ=;<24=$= R<;qUC!~ؽ +R<Ƚ +F]I\y<:\xA>r=( '޾1=E&=MֿA>%.P`OŕT<`N<@4;k<8ݼbpO.i,R<YԎ;IS!,=z;= ߿;B$A=)lZ=t)3=œ >བྷ/7Wks?@ \"? +YxtܽZ <=Js<) Qx}<[<\?<;4z=pq; ﻧ۱D@[>>|A381!>$#<ּ 7Ny y#ǒ`4=:kouy=|1<"J>s= ٻY65dg>p VNѾѪ1o=Z?>A>ɾ# =$ƽU_Pq>'=R3;=q!;s=ϟ ˠ<=)Խڈ<6;ƹpW=ekm=zA <b=7`ۀ<@q<p<~:}=h;w)=2{rrns!(2Ǭ>,,b>n׽.<3l5=4N=ͭH>D><"ڽb=qP^>0>-h 6FBV{څcXֻt<;1<=Xk9G~ڼx=^ncK;1d%& :>=2=:t򆽅>Ucހt ]=3ݼ>0n=U6<~FMHP3WeR?<:;kͻT=>.>޼ Ͻ\xw$ =~@?=(+;Aa3==&fz!=D;5^;M\K<=b5<36J=C2἞% I<}<&&<z` F<2,) _(t3;<$(%P<J] =N#fu<39<<]}0_ 3Y:x=$84o)<3Z&= 5=6;<,ǐ`jS=2=rl#g;$ c:e><8"wK'';ּF2=8< bb=ȱ ;B=^=N=~<*W=EϽ̽=+lȧ> 3h=S>iNME=9!`ؘ=N =1=lOg~Dպ؜Y&`7-:h<ӱ N#;*<ǯ`;;8<;SS<>;<:rQPF=хp=<`<.><=AѻWqZCџB?<3PuDo U^]YT<wo#uNjo7;[= +);;c<= Ӓ $Lz<<,#;.<<ڝ;eZż(6<;=c\l :=<ýdq;1 +bɼ43:<~̽,JJ@5< =k;f|<c*:+ͽ5 =VFQ=X UuR<(k=!|:je +  Nn:HSϼJ1; = lj* ;=P,ĻQ-j)=^;;wߧ<' MZ<ؐ[G [:qar#Ec,W;.~<(;Zsm;ji<U<=/=QB< ¼ h=RbEN =^;ޚ\<"]ݼu;j7dPB<37}= <_;!;9;h<#<`A}=/ȻІZ}ּ$ ȻB=L<[x*;CF<ż(= +Bv9<*P';__cc/H*-"ǚ;p-" -=:;?=pƻ 0; "g<;ӕ= P<Hg9c]^=/O<B;:UrZ= Ln<*O:a<<` =9n?<ᇷ v=& ; <ؗ +gJ <")=wX< +I :l!2< ${v˞!Z<ˎ 2M<"D=:$<.v<#<=?o`<=#<3͛:<=3`<+=\==7<񹋌n\;;,ďܖg˅NfԼBmՓ<rRz廧z=< Ǔ;ɥ=}ҼϦ>;:ټ滀<26=<Ίr%;ޣ<2ܔ*qГ Z<;.=$_/%<=V׬;cS&F<˼ULg˼#;FQ +u<}J< hc1=\)<>;>C<X;^<艃<=(;@N +/5#C<$(,i~F; ⼈$WE;ˆ;8<&=ja<+a<8:<9<z82Aë< +n; Aз<;=N)Y<\'94B<۸<);u:<[b]<=K ˪ݼ_

;R<{qo`X<o<^<fV6|v<=<̹=Vv%oz=ju +1 G=&Т= G<&½ѼhUg9v=5s1):<2 ɇq:=;sL=4V)U;59p; ~$<1K5@=+3{X>\=mlx Fi<5;M<=H;E9 +;4"<`K żZ=k=)Q ;x=d;OԽ ;)7f<$m%<̾= + <;U<aOӇ<]/9*p;p^iքA&2;! <)vɻ=0+`=-<77@)ݝj;id)<;n +=|V :;6ϼɽA=4<^ 55;P2_ +<$= `<A;D;ź=Yv<<<%x0<ߠ;x|{XԼv]j;=Ƽ9{^oce=P-;>z)ûi溰U{0Ӈ׼&*< Q]<=<,;P޻]鼙Z<<<&:Oλ/<>L;Hq<<@O==9TL<z]nB=o;-2.5?^K=<6<)ton(=[V>79U9g=8Ph<¶p-;f;1G~Ixn=_#L;;ׁ;Y;>'=di +{&8K<";< sqYf8 <"~;Z;B=&ʼkuʻ <볏ս`L9ν@;G =Rsnt"<!<`<ʼ"Lo==<ȼnq1MXƻ(GVb;S;l9=4٢<&) ڴ;Ʋ< +&<[<ފ=dSc2c a$w =hټD ,7u|(U|;*L͘Z<+;<#ǠVd9LA<+cLUE, =Z=#ˡ<1TSN\;><;T~i<,t:&úlBV<ϳ;6#j1a<)`;Kջv>`MfI\;S< Du0L<`)ix<Ί5<<8 L= u= +=1آ=0<8x.6=eż; ,>:RG=.<<닺< +=<ɼ +8+\,;< L8ν;뼈S 8A4NS4<1;Bq'->= *ƽLj);鍑&=<;x=ZSֽ ';<s-1-H=ڏi<4p=8$2$b=?Fƻc׋<2;u6<RJH<HV< LG0 +K46yAgмoc=7<= ȻY <7Č7Rjw;թ<<=J<ܰ<<J;<< +˻Q<_#?<<ۍq=XΓ߽_==p~; +,.0:VϼBi7޺Vi,(<-9< =$QQ ;QlB<<{J{pz9M;Hi[Qü6[;-(jn=Y=24J<'(ӽ%QNHT¼ƴ=<<Z7< k)V=.c(vY0y<8 +;HY2+dw<܇< <Ӿ$Ƨ;zϼp%;[)4@:au>q(<<#;^AH L8@ܐ{Dkk>}=-О`ǡCb<~<= K<[x9<^L<́):ub-q~< +;`=iKݳ4S;^<^<t;B!∹[&k^if<\T=:<= Z<9:^'<+<G8MF1<<`=F sa<6v3,Ż˫}<(bu<۔33~w +ۼ M9ks(~= 4^UEK>@R0bϋr¼Ո<ƼF꼙:62ӽ==3vy<8Y/<Fz%<A{`R,Gks<ې8<Wĸ=Wj;;wZK@N=BaսAl|dܼC=8qT+ <<؞=(\e<ӥ[;:؉=.E;뼟q(<н3/;%o=az|;?|<; n=L2ػ1;MC鼻K?N< -ljq<;?;W=0Q< E";]iZ<<~;= =5j|;2J<@=Oi< s :᧵<E'<1Z<[<'<"IIOȼ/Uc1g=kT,ܻR?:!$[F m;#9w<*iN=g'c=^<;v֕% +ü]6<&D<^|n;h=`)=#F;M0<&<ʎ<,<״y=;.3QcR;~ =5x;3N "5X;*=`=6ܼ݃*<%H<;[?<܄ +ڳ=XWq#+`Aow$&ͼ ά<6<A54Q=:<6ݼ@=JZ=3Bpe^Q< Ey[ ໇p:ß<;ռzO<ͼF }<.=_`\=c<)l>z>;>O>>f>@>>gw>>-h>NJ?9>>?+ ?&$?{/??'Q>><>ɘ>ñ>U><>j]S>>>c3=;>%>&4O=Ț=V=o=in=s1=V$=r2lg>2==N>H4.>9oY>j>1>N>>>r+?> ? ?Mp?%>?*9:?1?a?t:?8? N>v@>>8E>σ>۶>z>">>">cs>.'M>d=<> 5=m =o>)7=[s=u1=5=X=i"\=M<=)g<_= x><=c=2u=?l< =o<<]<;=;u;<)R<<`S<\=Y(<6Ia.>Za0>*>l>>ko>q/>7>>=b?>I?d?&>?Pp?B?> ?a ?c +;?/O??>>w>ķ>g>>s>vݞ>2>j_P>!>y~>׉==F==z=d=?=F<[<.c={Q &=>&><Հ>l>+>L6>">>X>? +?^C?L?,5z?N>>>ʶ>1>Q>T>`>Ax8>'>b>@=U=i= Y{==;=)y=w> +ӆ>!>:u>I>Jxl>A>}>|>>? +?? ? ?Ji?LO7?G{?du?r?M*#?gL?Zz?NM?+?# ?'d??I>f>,>>>i;j>v>R>Q`=@=<> s='==P=V==7 I<=L=* +=8p<_{ <&;=% =>ݍ=Irl<3c=[=:=)=x>:>.<=gQjƽ3{i9=C=ֽU#Gw55<2<˺ŋ<IG`Gn;8,<<߮<v<;^:<~4}nC=w=ʧ,=L>"9>)P>\>cxD> F>>Ío??lV?5 ?1Q?C7?Q[?i?r?t?\ɒ? ?k?_?f*.?B?>?&?2>v>q?>7>U^>ˊF>x>kw>]߃>T">>> 4y>@=)=؅> =C=-==}=l=#\ >뼚hl 5uļᔼG =c_>,>MQ>bT>>>>ˁj?> ? 7?,+?Iw]??n&?i?*?E?1]?c?]D??s?g +?JS?JS?+? 4>`>&y>\)>T>rRQ>Av>+>>>*'>==}=U=t={C=-=Ra=i=` +{;(N=@I;;p47eY<)CM<;<%=`+o= Ү={v=J=Q<=dG=C==x> }=:>y m>>]>R>? ԑ? @^?(?<?R?F??3?8??iw?;L?2? +???r?u?>d?!?ɞ>>)>>.>>`%>/Iz>K>5=ǫ=ɒ=~=i=RY=v[=[v==Re=ֹ<;-==D < =38<>.=ɳ!>0S>@>O>R>?v? J?#?f_?kE ?̂???n??Ѱ?4???E?:#?R?Ik?cS?]?'?a>e>T>>x>K>>+>>L==(,=A0===щ<2=_=2=Ri==`=;'<=%C);+4*>W>ݛ>q>׳>?i?Q]?5ܻ?i1?=? ?`??dZ?5f?I??掔?dn? ?H?Þ ?Ԉ?J?X?$CJ?r"? ? >>b>9>>{> ʖ>/J>!==U=@==q=@0=d8<39,=.s={V 9z=;&<6~=l=R}=Rg>.>EF>L^>{Q>>K>Q?3? D?T.?CL?l?z?A?ԃ?':?'@'L@*@4@ ?!"?G@#?g?a??s`?R?7:?`>+>>\K>4J>W*>q0t>W>?E>=ǻ=ɤ=E;C==2==G=dK=. = =DJ>"a>1s>cs>(^>IR>#B>P?>??!?N?|O?k? +[??@ F@Hz@S9E@4 @&@@@*@9@ +i?b ?:;???I12?5=? I}?O>Z>> >O6>B+>8`>20>(=<==*$=U=,=r/=Q=.<[=Mވ:K=YżfD@=>DZ>'9>v>h<>r>9>g? ?Iv ?\5??~?Z?RU@:E@h@<@P@DΚ@RB@T,@9_@+=@??2??b ?X?7K??o>Õo>W>>?>)*>#^>(x=Ǝ=;=='3={>0=6<=@0=v<=<=% ;g</u=G<1#;;=<| +ϡ> gR>:>?>V]>>?? ?$Ш?q;K??c?M?G@@(/@IG@YT@q@gu@q@xK@S9q@)@ 3?? +?R?q?jm?-Z}?>L>rH>>]>S>&1>YT=P\>W3>3\=>===+'=[tYB>Z=췤>4ۗ>C>m>>t>? ?I?H?y???V?pK@C@9ޑ@l.@@-@~@uC@h@{@M@/@5???VC?{x?U?I? D>>D>T>]5>K>>=S=E=k==d==;q<=G<|==$=Dʫ=rAW<;L.<6=)\=Q= q;-=((<@*]P<5YFX= ;[jGQ:9;.YUYA:-:b;<ڐ>:$yм44=;Ph<=4<7;2<F!.>,>y Q>g>?>>'? +??R?5?zR+?6?z?x@!@!.@P@@@R@7@@@7@S@u@%}%@:?S? z?g?tf?A?LO>,>[m>> >Q^>`>#g= += > =Tq=@%=V=d=D<|u= <=-=i%G;oҽ<=^&>/+Z>M,>cq>>3:>m> + +??B?Vϯ?2@(@ M@@ @c@@N@YAvAAN@M@&@5@?D@???k?j@?0zC?+)> >C>> +>G$>Ua>2~>0lx==Q=&=?k==q=7===5=IO]<_+<;0=*<_o8;)>B>s>Dˆ>IN> +6>o>>xV?Lj?-H?q???I}?u@R@[@ +J@ҥ@7AHA'A&AS@@@C,@*#?/?`??| +9?VBE?3Q?Q>>C>>Ņ>X/>G% >>!(=;k=k3=v=˅=`=D<]=@0C<z9c> >G>o>r>8>P>?x?F ?Ol?u4?A? ?F@@G@~@A$A#ANAp}aA:[%@X@&F@e1%@,`@ Z????Y?8np?b>+A>>+>P>ˉ>W >:=>>)k=&Y==h=o<ӟ O=/n=[y m=>S>,>LA>i>̠?DX?u?PF}?>k?$??z?d@@G@z@„AgA/AA7AtA @N_@}21@B@['?5?>!?'?j?:?&ѱ?>u>ؚ>-Q>ea>[>O=>=9lg{^=;= R`=[k<ʄ%>8@o>/* >‡>,U>v{>?o?sȇ?N?~?o?D?(?@1@@@w@OAA1:AycAoAq͸A(@{@<@D@?A?"$??vN?L?E?>>>>>65>Au={3>I=8>V=j=x=m==M)=.J==Vjͺg<H<= <;NJ l޻2j=;3h?=ڂ.>E>U̜>\> >ԡ>X?hj?H?x?_^??J?@/@R@T)@@͑AMA?Ai/AMA@I@cV@Xը@='?y?%?"?FT?U??@? Fu>Y>>j>>>U>0j>%e=>>m=9_==$=[g=1= W=Ѕ;-=D@i>(W> d4>E_>>= >}? ?E1??\}???@ @c@0@c@b@QA[AT&A1@9@=@;[@j)@ @w +?s,???v?7ܰ?(? >+>>,> >[i>[,>LV>)=M=v>=ވ=)f=?F<9:= /<ʐ<ʖ;o,`=và<Cs<=rGA<j ~$=SRv;ڎ4>{5>6/>+>7>e>TK>?{|?5i?m@H?GW?L?^@@ @3a@v@P@NA A@w4@X@@_'@,@'@ 6?x?Ah?D?P,?T? Cv?>qV>t>>Q\>-#>M=>a==i=5<9=/=(=V=7=R_!=;=Dň=HU<7=("=:S{;a $֢U=9t\=1R=:}Q{=C=V)=(j<%t=X=<ѭ=H=V=7l>aI>\>V=>Ap>u>n>t|,>>A?&?- ?'?u??.?g@@38@=Y?@y@ @@@†@7@j @R{@2d@޸@@ +*?1,??bx?M*?g>>Х>>y >mij>?.>jy>>>I=-_<7) ;_<T/=61jX=67j!Y<7=Vy<<7s<7ӣ<9=1h>C >7>B{>>C>>}>f-?W?T@?l?|??Z@@@EM@h.@e@rp@?@Xk@b#(@d@[@ ?R?f=?wI?a?aU???w>>>^>U~>K9=h=t>#R=~>b>@i>:,>M>Rdk>Ο>&>~?? ??>`?X:??l?c?@@#@<@Mo@Z +b@]@_9@^@GS@6/@?d8? ?m?}?N?ns?l?>M>o>jZJ>>S>#>==}<Ў==m=Vؽ=$ܑ=I<<(=m=>>@E>ty>>>&+>C->>?)?T?h#U? ~?L?^?#4@[@_@(D@@@A/&@Uǚ@f3@=@ ?'??A? ?u?J??e?w>ԟ>7>>p >3Ї>Q>=z=cY=o=-= =<[=|=I:1< = c(V>m>L>eL> L>1H>?D&? ?5?M&?cc?9??3?ڟ?M/@~@b@'UW@-@+O@?x?H???~N?_?Pۏ? +? >>^>T>jYO>Zq>Q[:>*=#=y&=4=?=M=_=@<== \=(;%]<觻ճ$a=IM;ڼ髞<;6\=)L=f==ʗ> ><>|n>}>>Z>ǃT??A?1L?r]K?lfN??)?(?s@@ @@y?}??N.?za???,?Uf?:?Z>*>{>_e>Y>N>Zq>,5>*1>=w==L=7_=v=m<争< EG ;rpW="<Ѹ(8Ew.ݼ⅟Fw`<<;ݘ'I<!>)y>a'>8@>+>>>>?r?$?A8?[A?~K?k??[@R@$#??R>?߼{?>=?0k??h?g?mԪ?c?6? >E>@>_'>1E>u=>76>Lέ>0g(> +=v==/=/=D=REt;=R}<巄=;Q<=<;n㻇 +U<)=L l>5D>0>ְ>c>M >j@>>>ն>f>1D? +?^?D?O?$?~??@@K?3?t??h??P?u?_?I/{??(7?Q.> 2> >T>>P6>3Δ>:=7==`=s> N>K>>9>Jp*>>շ>؎>!?&??KrD?Py?mF?4?HR@???:e??%?;?o??m9?S?D??>π>>u>]>f> #>9|>*>=g===r g=M =v=M=-1= <=U<Ӡ*B(+= E6<;MZ=X<<5q<--;_ X =m>M>">/)>>>B>F>_>>7?"AV?2s?o ?vW??: ?jC?PJ?.??b7?v?d+U?O&??w?.2?۹>>n>>{>$>l>Ao>8Y.=ȇ=E=={u=1=J@== @rCBo=i={=$X"<=Br<_H=r/G<; 0;<^=,"=#l<б̼h;c?<4v<#I= J =|=;\[%L= >=>'4>H)^>T1>Zs>>%>?B>? A?#?FU?K?~?Y^?{?}* ?F-?O?nP?57?1 J?:iU?R?>~?a>ؗ>]>>M==Y>"=>*>==_=2<=r=|=`=v=DL=@μń;n<{.=M<=I!=50J>8?>CL>;>V>l> >?.>??s ?&9?+B?D?Q!?R?@?aSH?NK ?9E?#?!?!i? +g>>>>(<>>#>K +>sm>@K>U`=(>Z>=d]> +c={===v`<^=_<|!<&0ɻ;%x/;%Y=IC`<_QkT<; 6 +o<.ڼ=1sC<4$E;Wƌ`;{;;:@[K<= `=fV>y$>AV=>>yr>X_>h>w>x>ٱ>b>؏?)?j?!H?+S?( +?6m?;?>?<?3?0.>%I? ?-M>l>>/>t>sj>u0>73F>"=>"=j>}=5=M=)= +=\=@(=>8>>'3= >w>V>n;>jBp>[}>>'>>l>8?#?s?M? ?"? c?)??'? >ZW>OY>V>>si>R>a<>1T>Am>Ry==(=s===Q=d=<(HЂ&=-<<_r5ɼkLu;[m<sG%<6< <+ӼǙ8S +;]<<B9`>C> >[z>/* >+>> >r> >>>>U?p>ؑ +>I>k?tk? ?ZX?? ? ;>ڭ>Z>IJ>\k>y>yu>>C>&'> +==U=hl===z<(=I=H<:o3=mp>>9c>QA >?>z*>>i>6>->q>0>չ>֑?%?tK>>>5>Yw>k>w>}>>P>=>|>>QTR>>/?>n=7=ʙ=-8==q=`=EZ +<=I&-;1׼0<|ν,9Ӽ)y>9c >ILK>n|> u>Z>v >a>V>5>"b>Qj>y>>ȩ7>dž>į>>Ȏ>18>I!>~ >>>B>C>4>D==g>K=n=ڲ=ol=A===I<˫<=-=$=2p>v>>@>9d>N>^ +>Rf>C2>n>>hM>">y>/ >#>B>>>>O>2$>&a>U>H9>:2>\>D>>x->6{=:=$==dR=W=q=s=d^y=c _ < =>= @s=@z<;xk<ܡY<3< <̑<Z㼛TګHmg.# G}t =gWү;(V=k1>">>IM>N>V>. >D->{Q>z>'>~>$W>`5>]3>Z>w?>f>8M>U> s>AhU>>o>S%=c=2>c=P=_= = j=q<=)DE=v =eu=)P<:β=dpFle<<(}xgo輳S oǼI3ƼqP:9= |;'%]UZY$N߼oݽ^<5]~!ݻe<#a7:ft>"> t>Y8>K>w>1v>>8H>^>${>T>{V>T >ṿ=+>=>d>'EW=[>u=T=@==~i= +=%;%=<,==D<>(Z> >j><> +>fv>C>< +>xI>IUc=Ɠ>(>K~>6`>!=Bb>0[3>$>&"=ԅ=Z=c/=7C= => = =;hv<:6쿺:oᑼG<S< ;`YQ~4 .>=>]I>+>2>6h>,>:>6>bUG>3>@>*>J{>N>'C> +=ʺ==0=LE====#m== =V < += = G<<'=M}ļgY<<=[\gzO2(#< +$<}g[>»n<:= f>P>>2v>+>i#>#6>ɝ=x>)=j=>&>N>r$=r=+=G==y+=h=N=?=h=d=<ع=|<:)=h=p=[KK<=R:`=m >=>!==>. .>(^>[=6=N>&>6= >dU>=@=ʷZ=㸈>s=_=%=o=m=:=:.= =)7;< t=;o=-ρU/0 >#>*>)= = ==#=o=w==D^> =vdg<1=R=6S=h=ʬ=gt=j*>4===$=q=;E=v_W=&== =ۈ=6a<<<^I?=R(1=[ =<^=I<<=<7;3=Z4=X=[=^ > < T=p0=-=<]ފ=V:qQ<|T<6<<AYA=g<}=?f=%;==Z-= =D|=MF=U=i=q=-b=dI=N=2P==_8<+λl =vTf=Y=-=)-<3≮<^=;S<^=)+<_= zb;<^]=h&<=;#j=4=<9;<^<7<7=^~o<i<4}Y;XK=,k8;mC=G4ݼСڻU:\8G=];_z=<L=h=P=jWO~5@<<~;ڵ=^27(5ccpѻj} a=p=<^=P#;Wu۟ <}qo6:,;Xo[= =P;=g;:m;!ؼlWM>z=d;<#J<;&Y>;X<0= =L<:;2K +=<];뻱-<X!N= l!<\NA=h\;cNY=+-*5= c:ِ~-ͼ5h4=<Լ?;u= r\=zX:Һc<^r=5 ^;<7?;q}=:qu1%;;_;<<2<6༚';]id<+=QN4<ڥ׼UC=-\<.==âK W;=~j;;;Y#<<퓏<<<=_`f<8=z/LzYe< |WY#u <_5R*Az-wڇ9)/_>& ==bȮ=,S8u>V=J ='<=B=am2<6(= +5<6O /F$ȁ=~;`=<UZj$<#W<=uv%<=fٱ;ھ)Ř< +;Q= 3K:7aY8<;" =1s;<?<<Y;Y<$ټЍbEs<}BS=yϸ _=,ㅪ"<;{s<_=c6켾<B<Vk,;f:;.=<7Ƽ~ڻ<6K;_+A="}ʱ;<ږo'仏xT8b= (kv<ЛI<}.QFü6<$D 佈lWz:=5r<<<3>K>=a=S=hW=SLW G<߼#< +<"&=#hE<P۸C$Mx;<<ǹx:輚˼D4=<6H*iuvϽUTs<מ=#<<5'͗=_,<[=:<7{<=qY>{؆=,>h>ت=ә='=>82=}l<=s== Qm(=H<&Ƹ<&5fJNM:<<ɮwbc>jV42=DY9o < 꼀=5'/<0?Yn\b$?pC;M<}>< Kʶܰ; ^%D<"ǽU@]ѽ7m5n<7t< <%`<t= +wU;F% +<Լ;X:Wr<,!=j<#`.<6BZ<;\aJ0Pp=R8  <|`cra=OAS8\XIX=bDَלżف<=_0u<%=}y(<|l;Iμ%:;]2n3tm2<{$P<سۜJ<%C<*/*!<ƹQ8H=¼*= I2;U6<$Ww:}yF{2;(ۚ +B=t=Vm[h)='\$=:IH>=:ɽl{=C\?鼈٬6Hb=,;WV;"-㓌;G#<v<~&=;;?R;YI= O^Uc;@=qq*< Zȼŵb=$o;/; ;$8c/VAt\<J=q)=LО"r=1<n<$;"=1=?K0<"=Ll +!eAj[;uIe<ȝݻ8`A:W,= b; ռټmv;v*J=Gd)@;RJF1=Us1O&<&cS<3<@~ļZt3:~<5<S;`,;z0< XO[<\1<\|:R<`#ͼ78<`B=(<핺t<8aX>=ƽ, AH<17Ko< ;$'<2g)7ϑ<6̼ϒ!.=o;ͲP_L<$;X %X +ڛ;<"@$% I¼ZX\<|qʼI]<= 2J=d40;bB<V漇Di<4e<Tb<3: ϼ v9%i:kмzs=6=H<_T=3:k:J=5Zj=Lv4Ag <V:L>n'_c9s4ҝ: ǽ#G}I4Q$<+;i%<M<#8ӽ>1<6\;\ʼGGk;O]슽>ؼ|=5+=ٙUfI;ܧ<$ڽV=fY:<Ѣ {׾8};}j/ػT:F\!#^ȪY;<7<_!m0=h]aW=&q;;`<ǕIm$<ǩC ɼ߼;!tۼH#{ZvYD;,=H`Y|쁼tFGM~֊;C k3=QDE궽<%9<P<\<-u8? +<$z_ ;1Г%=XUѼJ=h<$F;q6SW<Ҹ}<=LmvQ+(@C< ve;4ie<#e5=^+;^G<ek<#"hs_< Q5<%<<8W͙S<~YWp<  *WC%6;-<7;}eV<"B<"-\ ?;;T޽-<ǀYܼ;cfSIMPLE = T / conforms to FITS standard BITPIX = -32 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 129 NAXIS2 = 129 EXTEND = T END A#6=5G_vk/zW iYVYf;;B;z;w!;D<;n49'dX6Mƻqw:@ f;96Ox֥biT;];;82ۻ ;S<:`=>Z>7>Vi>ucV>>>m>^>>1>_=>I>F?e??7?\?|g?-k?D>>>>>>.>nI>S>1>B9> =0E=4==57=Oh=iJ={=\ҡ=O =(P= =ni<(<.<Υ<ޭ{=U=o<ȄP>)l>H>dS>>2>Nh>5>-/>>QZ??P? ?T7?$?Ho??D?=?|J?W>h>2>!=>l)> +>>hN>K>+wg> F== == i=7=}=~ͷ=7$=^b=1=spy>,>>M>kM_>7>U>>ry>+>p1?UM? {??.?*?8Z?G?gp ?]_&?=:?!G6?z?K)>Wn>ӈ> >>>>`>>>(d>!n>ʣ=U=e===^=*O=F=kE=N=,"==J= +b<8dP>>4P>Q9m>o]>h>f<>w>U>??7??)\?3?@*?Jײ?SY?Z?V|?Do?5j?'?T? >ɚ>>ˆ>>|>c>M>:^#>%>s>A==v==z=JJ={4=T=X=\UQ=N=#? p>#e>AI>X7C>|>>>_>u#>JD>_S? +g?c?.:?>-?HN?Tũ?Z?e?g?g1?X?J?=?-?? >>H8>>C>F>y>X3>5>- >Z>=3==I=$=j=L=Vo%=g%=QmF=Q.= 4<&<8<Ƃ)C>̻":;3e;T vBN ̻lH L;(;,:;; Ҥ9N6JS%ƻSb𖺑{:pg;nx< k;I;B;;$k';߭;c9<;0;5;;&Z;&;0<<Ik===ݷ=f>w>#->>+>d|>h>b>k>>???*<???Q#'?_+?r?¸??&?Ŭ?|6?nGi?c?Ql?:!? ?i5?>t>\G>q>(>qy>P>;>o> v>A==xk="9==P}=8=[x=#,=ʨ=% T<< +ֵ>(J9>C>g6>x>>t>ق>z,? ?%Ӯ?;4?U=?h&?|??r????x?x???w?[c???&?>>i|>>'>>rG>Q\>6j|>%j>O=W=|w=*==k2=\ =EBn===&'<<<.<<=qx&>E>1#>Gq%>m\y>w>>;>Bq??]B?1j?H}?eH?C?\?x??O?=? ??Kb??D?1t?ab?@Q?&? Q>9]>f>+]>\>p>s>O>8E>t>=]=[=8==y=H =v<0==<ji=Kd==\<]=:B=v=Y=Zf(=[=\@=hN=>C>>Bz>%x>O>r[>!>>4>? ]?W?7~@?V֑?w? ?a?B?&??}r????—$???-??a?= -?%c? ?>>˛>Z>~>>Y}>O8>/>>)W==Ҙ==>l=bK=u==Ky= =;H=5;t +<0j;a<3< +<<1><<<a=*1=_oW=uk;=zu/==u= >>(U>4>YI>u>>}>˱X>p? Y?%R ?BH/?e?N?֬?1?Â?&?.@%n@??ޅ?I?.?n??s?a?AA?%E? +bw>>b>y>\>x>]>6m>">=ߒ=O=Li=X= =lo9=ME=4f=}==̵<<y<<<$< T> >4p->^n>|`>h>A>m>?>4?(?J={?ng??!?-?.?@l1@'R@@\@B@@?=????}?Z?8p?? .>wQ>On>>>_C>J4>-%>I==X===@==+$= 84= <<<)=<Ҡ<=<<<+Q?|==6=8==e3=$=V=QD==h=@h0=7=t<}<7z<_>>@>m.>>>ֲ>4B?+g?:_?_??Pg?}?@ +@*]@Ni@l@i@H@@=@[c@7@??#?;>?u?[FI? >?>>c>[E>2%>j>%=Z =s[===kF==*$=Ak=!= w=}8<|<}<<<<0*W\>h!>@>+>D>Y?C?:ަ?le???-?h@f@;@xe@3@p@6@ +@\V@@_ @9@z?y?9??zC?Op?+Zl?>x>!o>(>$~>m9>7x>0P>!===ӑD=Q{='Q=Jq=?V=0x=6(=8<;,+>4k>Zu>mX>;>XF>?t?<=(?m|? 1?Ox?@z@@Y@h@D@B@%@vi@x@ہ @V@@gD@-@Ł?ϞP?R??f?8|H?o?>8n>zR>P>S>M>"_>n>,=-== ==g.=2k=Pvr=0=::ﺅB;Ba<6c::Z;[M3:J:4}~:>;:;K= T=ى=׼=X> W>+E>^p>M>>>&>}??74?jG?9K?O?P@@%@d@Q@@AlzAA@J@_@C1@@G!=@?4?>?uQ?vl?M"?, ? +>㬶>F>>$>[>;T2>&> +>8=(=^=|=O=W:=Qu=)<&==<ݩ<$<Ef<"}<;Ck;$/< fF;S9;GIJ>$k>L=>bY>>>崥?>?5ru?bK?^?d?3?L@"@`@@w@"k@AA&A(TA +͕@c@@[y@@$.@>?hI?JU??\ ?2{?t>">j1>/>>k >H;r>1,w>*'=My=[==Z==kw=;= 7=s=K&:2tE{rw|5;^8D&sW҄X;*JhOC:@Z&bY< ;쾳;Ղ;O:b b:dU;dPлE]]k<;+;a;|:t:H< -f Ag;˼;p<4Qw<&>K%>},->^>I>)?r?Y?:>x>L>>f>y>T>0=)> ]=Tw=r= =q==xN=F=) +=$<< <\&3Q;v;-;g^;g28;e;8;!;9xK;p;;UȻ#.O\̺X\Cs3[9+;Nj< +>"T2>LTu>r>}>>R?&M?Ty?^|i?{??? @R9@H| @R@A7A2PAAAiEA@&@@C@l}?P{?}7??u?D?_?>oi>K?>ڻ>">Sy0>3Q>==ّ=-W==9=ol$=T+V=S <. = +`;.;|:`77^9`:$9D:QOŻ2;>;Uw}8;G©>>2r>X>8>s?[?j|??m"?c? ??A@L@>@W@C@oAAB=AiRAKdAk@2@r@cj@,4@ x?܅>L>>}>oY>K&>7>þ=F={=G)=d=]=U=Fl= u= =#y<ҭ(>'E>Jy>r>>P|?/ ?I?D?O?zB?C?t$@ @ 1@:j@j@hi@حAMOA:!A.s@0@@d@q0@2@z?O6?@?1?w?CU?$j? >> >2N>j>N7>2;> =z= ==lz=b\=c=%=#=)<{<:e;/<8<5?9<V>bCO}<lVA<C3X})#ȻJHI;OJ"s ˬ7;b2mo&JSX<:;`鋼&98NפɉFe:93:p;@;;*:i4z_;;|>;A:OF< /a;> :2 ;}z;z <9v>%>J^;>qp*>Q>b>]??Gm?6p?`c??G?^Y@M@;@@@z@@UA BNA@pS@@D@gS@8 @"@n????YkO?; +(?#?>>N>>|@>Q>/f:> +TM=.=_=v==q"=g=`و=S<ݵT<<2;yUyԻ=|; ;<< + mO>>?e>dĕ>>O>;Q>J? ?>->>VS>1>==L=8=D=/=o=:=K^=q==m<<<<;9H]-IkKT:ze%8E󺕪oFy:FPh6;%<;h;[⹞g:;<;<|gB;v4}[=[k8,m;d;;;m:to<<?: ҳ<*=%=PI_=D3=^=lx=l==.B> >5>[>{>>>o>a>?M?3 +?W +A?{%N? ?N?@ +@$@C@g @ׇ@s@@z@pH$@\U@GT@d?VC?d?W??ws? e??+\>*>"&>a>a#>6>> f=%=l==k&=(=Dy=.-$=k=.<<ñ<1<<\u>ۃ>A >eP>G>>ס>|? @?%^?@x?d?n??œ,?蘍@ C@U@8@O@bX@x5@pd@b@R@2K@ 8?-2?Q???X[??f ?~T>֋|>o>>oI>@š>*4 >A=,==Z=B=g=C=.6="D=(< /1T;};"9}(?]; {w[:j:64Ygջٻa5HB߻JwYӸ;:2!Nh1I;<CA;OM: {~:]>}>'>P>|v>#3>Q>^>k?U?,O?LMn?t?H?[??A5@ \@.@-sG@;g@C@N +@Rjj@8@-????s'?ql?Of?:, +?&[_?>j>>T>km>HNW>)$>=Շ=WD====&\=0l=+t;94:l;zm6Q=\ ֻYϬ:]9z<:(:;?*<1h<=;d;<2,;{L;V̪' ;H<0<<<|O=> m>>C)>h+/>S>>>ӂ>?Mb?.?M-?uA? ?x?ǖO?l@A@@$#@$}@(C@+NO@i?%?)?k ?S??`??D?(\/? >+>zn>U>cS>lw>J>**>===z=z=Oď=)x=%N==<<,<#>>.>Mb>wS>> >1>ށd?m??3܇?XW?~0? ?/?'?{@@]@@ 9@r?h?2 ???k?z!?[59?3t?/?>ۨ`>->%>>o^>>>5=_=߲=(=U{= =^=[g=Fh=6e4=#="v=H=<( ir>+A)>; >]!O>{T>A>>>`? +8?"m?>?^U?e? ?!?#_@ @"\@)??^?n?k?z?Z??i\?N}n?1X??py>Ы>>>^>_i>B>a >)=7'=%L=DŽ=R=x=_=I='VW=X<Ó<+= #>Z">39>I>_~<>>w>Y>Ֆ<>W? 7\?" ?Y>>%"> >,>Y.>;_>> y=ΐ=k==@=MO=:=VLX=<1:::T;Wӻʻf$ +~  ;%IR;;4.»q:;= [;Kg;:AT;Q:~;.3,;-m;(r<ѥ<)`;}J;]h +:c=;ʊ-9;;T?Y<";͸::xz<7;f;O;3&<$$F >#O>5>N4>kc>R>=>G>u*>z?o? k?3>˗>>>z>b@><1>>=m=!!=J=$=ik=AHB=.2 ="= +߯ɻXwVmaܻϙ~Ϲ.Hfûc:D2m 99:٩:\;(x;@~;E;;:V;R9;%<bP;!;;:[:[4;<<:|;XG<@:8<;~?<1 T6>k >$A>@U)>wq>>#>^>q>"`?J?%S?=?YS?|???@??*??{ ?qG7>_>9>>N>p>T>5>=+ =J==m=0=)}=X=)<|= =1<<@L9ܣ 3o;n<:~;-׺0H9 ;V]sk`&66os;c?;Ɯ<<*(>.pC>E&a>]Nk>n>>>>G?? Z?!?;?Q ?gJ?xh?n?~?|׵?p7?d?]2?M??Sh?+F??/>>R>>Y>">a'w>FX7>39>Q:==K=X=G=L=z=mHE=*J=>(>>Iء>^M+>\>>B>N>>%??y?'`?:?H(a?Q?S+?Pw:?Nd?I?F`?8N?*L?C? ?Y>`>i>W>>T>h` >Dߒ>,>=R%==U=H==n=X =0<<;> +ԺCaH $~^;z;P;^<>X<&9===?|=~9=z[==w>j>ź>Bd>PY>h<>>0y>z>>k>I?F? c?L?(+?0c?6f=?6$?4E?0?- ?&%?? ??>g>>`>`s>]>s>W >@ʏ>)j>#==ƾ=1=}6==m=L=-_[<<<-i<<Ц< t>$a>>->BM>`};>v)*>x>!>F>ϬH>>??zY?s? ?!&? ?=?l??>>U> >>o>3>{>}>TŸ>;FP> W> =s=} ==h33=jU=?3===>$>O>:>]`>pH>Ĺ>b>l>>'>!>>N? ? Q?cd?d?s?m>^>ۡ>ψ>xF>>> >I>h>M">8>#3==$I=(<=>e=<=y%=Zٳ=;R==<+6d';XeG0-:(y;c:4:n >9>04>Ik>[]>K>>=>bU>>>P>>ߗh>>fD>(>裐> >w>H>]>l>׾>>r>yc>TF>:0>+uo> +~===T==r=X=T`/=4C=<,x<=< <@ <><1ة<y<*d&; >\>*>I>]{>jlj>x_+>s>/>X>|,>>_>ά>>?>>>2B>B>N>>d>~`>x>bF>A%>'>!4>=E===="=ok=[J=ގ<͍="=v<(W<Λa->>>%Ɖ>@D>Eqx>O8>u3>=>>4>>>>bg>;>5>D>m>E?>!H>>>p >_j>HN>/g>$Bf>> =Ru=j===c1=Ek=^X=@=<i= +<Š<=H^Zz:'I9*;|:#güLW<?U'o;݅<&;;>I1;C+:Kw< +;FayJ;=;?\<@O5;;}jy:xvF:;,: ;D<<5iw>1>Y>)1>3Y&>X}>y>Y>>>->>Y>O>b>>9>˄>>s>}z<>{>c3>Kf>0=>)>"h^> +=n=N===&=d_=g=X|=CPG=#=Mމۡ*CdžW;@;.$v';c9b*@㱔"&=N;3PQ:p0lݤJX;=jQ&;:;:wS5; _9Rh;X;&CX;" ;A X;V>i>>m>>>L>[َ>m>p>{>>~>W>>>>X>q>d>f>TS>=8>>X>=4k=98=8= ===w=fS=Q=")=N==u<\;o<n;ZS;HzK;z:HU<6,TY;;/V;e;;<>3;7gR n`IHvFaJ<;[;h<Jl :;;Z-;o<< `e>%>%wo>=%>S>UWu>TA`>h>p]>v}>t$>ge>d_>cU>`>J0A>Bה>=O>+>>-=*P==Y= +==ZI=tBg=r=C =3t=(>=J<{C<<-}/%:[;ף agNM +8:9l:?;\;c%;8'4C:*r;iR;A۹ <#:Җ췕{[0:5tV;B;u<.;/N{:e#G,;o;;;E;؊;fVxg;6<6>>,>&:p>9>;>=h>H>O_>QX>Oo>F/>Cό>B>Cw>*^>">d>|>=sn=+=eI=ҲS=4=s=}=i{=K;= t=EM=~=H< ==7s==-=5=>;> +{w>>#K>%F>&I>'\>-g>1~>*>-2g>-v>+,>>> > $=82=pM==ڥ={===; +=v =Qu=8h{>~>(> >{>>>>>p>>>=@==`=Ԅ:= .=r==-=}=tU==G>=(l=== <>T<72qC\;t;K};;D;nU;g< `~%9+;7Aů=>e>> w>iY>k/>V>=[= +=Z===n===VI=yq=e=W5=av0=8X=a== <)< <%c3:;'; !LMc L.b̼ TϻݗLw#9 Eϼ%Ѻ7$6W:D<64; ;\:;<w= y;nǻ)$aCݺ̼=~Væ:;/U<(V:?g*zd[6_f1P)];;d=e:' ~;jW)LW;yc:8;z,;Qaa9;C%;<.~;m?<sC޻F;pEJכּ໠1?:܏L<;S:=Ҷy;~;B;|ƺ֌5;X93;;;]^K;': ;6;k;-TJG:X:: +s;)Fy:}s;N.:~<#;t;ѩ;+;@}ږ9\;Q;IԈĀ|ڑ:ۻWɻĝ:i;A 93EBȹ:Kv;X>s^%1вZ_HxPsY;'<<̝;;ب:;{;J;{/;<)<];؏;؋< ?J:ܵt;r;;A;u:f;L{;tb; 7W;~Ѹ;Nx^bk<"F<}=<#PZ Hкm<'@;<):9|;$< +S<8¼;m;*G;:yJʄ{M+Y';b;ȉ<;i<W8;;`x<<h[;n_:3f8#1:n;w;<G;)G;+;C;3d;4;);+\<)<I;Kۨï; Ak< N<;$ +;QE=<9;;5jittߝ\E:;x;#=:Abh*(S{-AԺ٪";:e;'w!W;);,P_ct!ta;ۺ<2D;<@z9;cHGD;/<g;Dˢ,+e`"黜G9-ذj-fB;;,3?;踇 9Q黻nR ĻVë;:Ma(8۷c!9;$f; ;C:q`9;d %55zq9;0;ͽ:1v:ô :fS:?;r<_;/k;ecZʑؙ;aZ;5 OAv;˺._+mTƻq.: :ݸk;N:i;;Z98<;q<s:r;;;Glfys:J:f9;O;l:8.:<9^x:ϻ6a]=יQUd;u6;;4(<;<:Q%:;b:: ;;57~(:ڻ4hr4Nv6959b 滛Frc:-pn;L1:j?8 +YȻo;|D;mo:Y;ğ;;ꝱ;3p˺;]; q<>Rz:AO;<*!15asf<8];b;D;PzR:/;<&/<%$< n<_?;<<9Z{;d: !-M6~ݎ:i;~-;6Y;|v(:@{>:~E:ϰ:.|79zP;::+:@t;o/;Ų;;-;;H;_>;4Ļ}9rwS;h|;ܯ<F:;G7TMٻb{;4[aI:0;8pv%¾;ȣ;z:,W %lU+Xg;KN;@;v:CX(3;4[":sU:Ŀ39Pڻꐠ(s;`;ْ;N::;;b< Ie:o8뻜̻q^ں޽8ֵt;{a.;~kwD(]`)X:;; Sᒼ(:`N;=k :5mL~:3:BuV:ER>0O; "lW;b;M`:ʺϵ;~@:Jۻ򶯻 ;:I;L<r;09Z1;sW;;¨X՘:0<+e5;>;';=#=i*ua;_YUY`;9ʻoDK:g;:iG;BE);:b;E3]QA;jK;+8&J;p;>;*;3;} ::W8;jO;|"t' +;=g%;q< :}< <;J;wR:cdOZkm;`;[c<9;g;膻;v;>=Ҙ*";EF; n+~:-;]O*:L_D:p(9{%\:j;P#;h;:j3ٶ;6;,-9< +X<+S'<><:Ӂ<;׹Q:;D;ؕ7U޻qDɻn;{9Ç9@0;K*<ɕ<;D;ˬ +ZE%:(;顄;yѻm;_;9:q;N3<,<#<:i}: q2;V;΢><<L<<';;v;_w<݊5E0:ƹ*,;һ9;m;w<Y9x; 0; 6":;2m;! +puW;<Y0+~4R<J < ;<;Nl<;p\\_;;'u;4lrx;<;Qhhq8l;- +9*^;q<Ӻػo;,';Z;չX3E;W<pƺ\^s9X<`< <=-);3ŷ;AP;O,;u9;<պ:1:a2:.8N;nf<;j<#<#};nqW9O;%;@ ;>ڻ^W_BB';;VF :o׻MK;*:z"9LW6ڗe :3;X,;S8Һh};IL;z(VR)Q%S;u>;; Eeo;"P;};'o;-@9;:b̻"3:Gǻ߀:Ι;<U;R\;m<Jp< >J== 8<J+;_sO z 4(ٻ-;A7$;<=:a;Ů:לy;;-;<M<#;A;$L ˻~;7;k;Q;H;G_D;ɫ ;# SV:Lۺm|u2&\s0.𻬝Gs퇽;Z;|< 6);g;][; J:3;~,;=:ۻ;xQj<_T;uewy(&;#8Gk]9;ڠ;,;̰;;75o;&q; ;<&/< P;G;!4>7=m=Y ;n;b;E9CKЕ;k Rk:Y|:2;P< +_;_6;a:1VŻc;ҍ;b4;tg \,;;c: %|::Q ;;ks<;qN;><%T<@EF<"o;/:m6;xy:-<,;aq;!:XV@@SP ߺZ;5<;<ʻLջ&$};2<0E :p1:>:g;L m; :|9r*ػ;K};u,<;קWt!9:*-;M;ʱ;m;c;G:5<Ļ +o.-Gy:9|Ϻ*W%䡺Q:b9kD%\QOfz~< k;a:C<,@};Ui',~|\9Ե;<dq;KgOs3;n#*8= +ɵ05;5<+W5>\zh>6h|=GQ=:AG\rZ;A:2: 5:Zh;':kLf,g0:}:2#;<8˺w9Cƹ"/fǖwk]UnJ;(i;*<\E^= >ƍ +> >=J;+<Z (N|w;׎;:aٻ;SRg: a͸;(&::U::k;;Zus\8;B);4:M:һTػsl;z::V97ĺ;;%]"v;Sܗ;@2d<0:ʯ.}xk];QI^;1pIS>*h>==e[;>)C=S=0;Sz׻b{::ݻW:<;O57U:.6O9 :me: we:Ix);q; ;kfPS0Ⱥ<;"L, +F ;M!;;;3;L;;;;! ;2;K;a;ͨ;p^<<;[.;N; !9=;{;[ V.;:*;p +zi$滙ǻ]=oAoS޻67D;pXY;r0:$;;}9;G¹VdvkO.5"`}y@7툎<;:#ZF)@>6!֜;9X{< +<+;&;X(;(:܆]B;(v`;Ga ֹl;; L";|v;]%;;6t;x`9;V|d:2vkf;=;@;;6n2~XǻFW&-;@<Q;m׻rW;.;5rC?::;MA;:E +;;;; JQ;zƣ:,<;9@6ջ}F~ͺqjap8$W:aE*t; yf;;X\Ӡ9:ֻ~}"8x8uͻm:l:eXeKr ҡ&')Xw;ͺSD6ݻ#%ӻ;:4;!ELϰs2ubd.;;Y:|< 4;oQG:P;;zR'(I>;!>sT};,8?ڻBV:<;#dem\:J;;;g::<_<<s$8ϸ~;ٻ=>;乛iO9/ ʻ~R;;3$;\Ֆ;;0:;!;*;>V;n.ֻ~ɺ JԠ!κEhLAtٻۣ;;Tṕ58=v;HL;+3;NY;I㨻e:B;+;TU9jݺ8F Qw;;Χ!t~;];`:z) ҕ;;C;a:gD:%;Iz;<;|ωVwO:&#<{<4 #1» ;:ӻDdk<,O:^ Ȼ0?n)v*#x;];:A1;;~';7LDH:DWԷq:m2Ի 9C4lqi]; +;֊;;::mi:B\;ɻbKc7<!vc;7f; ;\Q;;~߰<,_;6;͵;NӍ 9@LN{F;֣_;na<<<-);;BQ;.@;އ;G<]=!lR;ћ;<*s;:/CT92;~} Y;< 7:O#묻xHMd;?e1;JȺ:[j:%PC2;c;,9:v:A2;<0;:]l;np;^􉼅⊻x:q˱: oaF;SB-;|~쏻TzhO;.M;q;C_;6<<:A;;<ך:;W7 :u(19K {:d$U;9劻ohcB: :R;ͽq:ƹ]%W;P-;aD:1B;Ҵ :gr ;C;v&;B;<k;F;<;8Uw滆:ͻy;;e<V<<5 <>;< ;<8L<!;w;S;<0;#;;<'<;;9}-qAI;L(}iS;I-H:;;H;xU>/̼$ +$d;G,p?;7;Um;D:dݻetv:+9^:;%lú . \r;Zpغ鍳g!::96=˹d4;}CG;ֹ;J;V9 :ڹBZw7KM: 6-6S$:4;6];:2;]jʻmƗV:D;۫h;$D"$cN;;;P7;;;|:;x:(::;;dxp6=iͻ?=;5 9wM?|2v8i:];owU:{຿;;}:?F89 ;CT:U;<,<%Ki;v;_LJY;%?㺪[(J/;IYw<2W(ܹC:_d;q;e &ﻇ9;=;QrO*c;]KDO;;H,h;-;};2G;< #ܓǸ +w$;d:;u;3;I?;ޓT =;;;f;|ͺ~7;%cq:j;%ջu:HƼ"c=mk9:'Pˤ):9w;"p;V9O:;D;-;9,9ky:P;.{;ݧn;ˮt<:7;9; G: )W;F1;;* ޻ +{˵;a;;8;ո?;|P;'@;61;<;点܇EG=Zf::\X:6<"gOɻ.`<0 Ȼ|9iol;h;t:;-J;yIr:DU9l\ԺD_:IK,ںp,;d `;>;;i;m&;߽v;?9";;¸[;1^;˗:9zq;;{RF:ϻv(8xy7&ФG2)0;;I;'X6:g; O;f9::Z<:;I3;Z[9+;A 4&K ^ ;S;M; =5G;#<6;ދ߻!G3:];:X[ܻ ;;(;;;-w:Iܰ;lr< +*;U;*;:ps;؎$';jP_W řʻ*ʺFK;Sx:RV:@']89㻷Y ;/;/\\]qr@;aV@eȻݻ߼BY_ѻl,Gje<~8;_;;i=;9ȃ~"Oѻ;3Q;[J;ˀ!߯:O=ٜB::eb>+y<8<*%:۪ <6; v>i;ꮼ% 'ؑ;7 &;0;h;g$v9;-:e-~0y;~q<;D!;Y<c9@ v;Tߺu:愻 :Ao򚊼 ?9<;N;;o<]<?z;XƲ;k8;`;tw;CS,kkG73; :99ҺOp;9̺*\PX*;r;U6;܅<<# :"K@H}?;O +;;l#;uW:"k,;;< i/;/Y9:J;N9tP"MX ܹ +a3;V5;Ei:Nd:Pkv jؿ:լ;zӃ;#F:A: +;Aq;Ə;:%*=7c:w;{:;j +L';-439wL2;h<*<s;y:b;qк=@8뻮;!Y;Xe;E:!i̻D::<;0;+<'2mܩc;\v:u: 2ͻl;';U:/:h;`Q +A@,]:y.ٺM2;;')9Q;S]; +]r;w;`):o: <#j: I1G6DN|C,:Wdt 9AZ.8:;-9m9E$7[i Wf!l;<:׻D7RC:f.+b㻅:쭋+f':ս$;ЙW/1@n]''67d;1:9`@*8EK: F;a<ԻRGqd&9|}:;q;oyZC;H:8'; ;|;?@;P:J<=:xu!:5y=/=!;E;hJ[ rmM:@ ;15<s;;2=;V0Y;$M»PO[;[:.#pex: g;;Ϣٺ}:;;֋>;^o?9陿_<$F;9 ?;};~t:B=9Z{;:=ߺ;:^:U+:Ų9ԫ;̕;y;9;~g8:m ﻤ ;P8[:*<]F哒9\:(7$gѻ=9޸:zH4ܻh9}:;B;ŻJ},:>b:4;\T:6w7bsT;4z;):R-$;*?t<;U;o;+W1; ~53:݁<-';7};;:bvk1[. ;$c@m9S|;IuE&;ۺ틳4lKH̺9t;H 1:4F:L;.<,s;[{»n< ;;{};rL:Q¦:D90;fټ1c1/;;w;`::<;N;$Z;>9UtI9:82ǻ:v:(;,"J5ֻ;.9Ļ,tD*Q:g:ͺԼo:i;Rs;׋V:⣻B9; ,:W:`C;YY9;v;۠:Gg;;\?o{Ի>.':V;ޞ8n!; r$';Y;A-;< +:;tM;L ;/;Gx;(i%;;Ϩ;;r;;?lt;9)@:tQ(;(t#:8 ;,;} 9c֦:];pX;U7;;t`;jW9I:ݺs;dF;kZ.;;;;W<;+ɻ\njºgJ ;8;;l>;0 V=u;Gr:#:ީ9jV+1$#xY:a;_޻EL8< l;g;lg}лH;;<vkf5u1ۼ@V ;|:^&};:m1)f(»&cN/,a:n3;Y;,;_Ҍ:;&;I;,;OuR99$H;}!ɺ7Zm;@;{Jm*:k;~;ݷ&Q::L_s; +Gn@D;4v r9 ; :-;d—CBf:K:;;`=8X:H<x|<* o b?)Ji`4μ>9:$;|@;w ;:u:ٺvһ$TG™3:SG׻麹H1s;<Jh2o8>G):F;EEk?;rڶ:qCN;;{:[Y+/Z(;5;::Mׄ;b쵺;:뺚::û$o:;t;k<M:Sl) Iuc*; :̻l+;};wMi:AA;:|8h;86!ջ& ;޺Yٻ*]C]3I:3J:A;@Z;~:- iĤ!H뻑v%׋moɻHN: :S-:^:؎';ָJ9\;Ez;lQ;6:ӭW:y;;&;N:N;; ;ʝ;:A;':!; K;;re:lﺜro*> +P;^<t;Z=xu +:9 )Wei:D;' +;~$I:8`p/9G:9#3ƻt~%;d;ZܻJm=;2L;Xmm|T#7;t[+; X8qFC@ 8:̭; + +8û4Gs#-v I;q3{9fE;{H;R@񻰠MK;;車@g:l;~>!CVv}9J;!߲P z:e;#|U߇gxܹ.= \14=;׺:;<`;.;L:]0::4;E\;# ;U}/;a\< <8t;,:ٿ;F +;vo:V;TO\hy;5c5;a{;;;M;YbF+:07;PlPֻ}]Kʶc;9 ;%/:@;?;[19B'߻{1Ҫh>;m<=;;r;\٪,fwe:;%N7cG< ;U;E&:v@8cv;F%U:L6Jp*.< `:tybXP:OtMѺRñ;Iq\޻^mfrޮ~mR;a;";YwX.2tp$&X4ҺûC}f_; +<;[i;]:;d̓AJB]:ջX< ^9 :^;CB0Je|-m;+b ;Q]:9{-󻬦;0c;J;;5鵢`- +>Ż3n4:5f:P]:H;J;M; p\4w:H;~bA)Q:փ޻Rd_:s[;k:E9;rY}n7UU9A:59!OH:9oXHUh3G!׺~P90";;\[;v;F9F Us캮!YޜPۦ(7]-;[<;@:;;*;m:b +p$t:'_nK!:jѵ;֒][:IJ;^:4wt:P;cp* +:Ȋ;][;);78;1D;";);m8x9jB'%25i -rŻ&G:+;a;w9%F+;)xݼ"$Ȼ-[+ dغ9:8f; ;t~9fj.zSIݻǺk@9LlWpP:Q:9;1w;0ȅ+'਻1N6g;z~;U9Z::7:k8R:$#7;uI=pNTe ,;?;Q:*y;J'};/|<7<9s;4;b纫4?B:KMp. ᛻ ػkyI;Y;2v, E;/R;ǻwIc%;۰< 9D;ȡ;ѱ/;/;һ̉(c;2=m T8T;&;;iH0:B:);;:` ;Z;5;ֻ»Z::ws2 eHFD;=6:; b9thtZVs)|2mk ;F < +Y2xp~ܺ¬:}²ֻ:;/:ryKYGԻ2m;:;^|9d;{;Fy&+:к~һqulWȍcǼjY׻[>Gz%;Z< W;^l;v:$퐺޷/lÀd)>{WO;aCBļ%;s4GӺb9;o:IR溺^:d =`;Q;wP9X,;;8}|!GIk9 ;ڔ;)_; +g::S:;_<+<;i;< +;p ]ǼO:j;PB-P[27P:&AD;*<:g;;h_]=8<vܻ@j?SRi:ϋfg !d=9iknշ:S8/#n;";:s9ӼR䥬 4M;:+K;𰹰S̴:~; RUFjϗ [m:j:ѵ8:M; ]&77;#;5p] +Gq*[;I;:k;xx|;%;Q87L9Ygڻƒs#VT;-/PhY;R{;mL@PU[:QDԻ60;X:{Ts"Vy;;<h8nWy89k3;-Q;<$n;'w?g:N<:RU;J;*;;n:d2e;I;IĬ%9`&O9f=)ָU;o|9k4^ :T+`1Br1;L};w$庮4RL8W <$n;R;TN;;};t;<4C<Tp::&P;6~858yʻZúznYxȹۺ 0:5;@;gy;A:Lr蔼wl :YC;Vl;r ;8e;o2Aɻbnr xmr;Qp:ћ:]kf1" :l q˻ Xt2:,P:%;舿;N;0߼;Nr˼-L%[;.Osg-D`I v;uk;Z͗:W +Ԃ5YO;9a3;X:2I":Fʧ<E9*:Dxlp[<%#;M);O;9h<>f *ur:B;k;:ԭ#Hc;V܂:\$<>r<=;[=\<^-:旱.񻨧5;l;V;ƣ;ú;379*7**;Y;h:;lo;:_:VTh;9;ϗ;_ ;.B;/+1ڼDI:;3_:C:Ŧ'nr;^f$ R8ˁ:ĥ򑻨K +ؓ8V;_údlu 3 ;:s܂8B:;fq6C<=^=u=n-=ַ< h<JQ;v:8ͻ0 S;>;DJ;o;WY;3;>;*;n:yXl9w5yS :;yl:|9{Ⱥ;>T +: ;1W:0:?9:7Ra;!;9< <;طvG ݤ#;ܝ:T9NiE;#f9wa;i}:;$;jf;3!:츭:HcbݼWl5;.:}C}aƞ;;gb;AX?ù;k :;; RA9 :2R3f4u +L;,;a;+;=z +H0Z׺Kƻ\{׻l}m20Ӽi_Ի-)!vI$;;$Y-- GM; ;BZfG;rzQZ;NLM:N?n˺迦a::;9@<|!=K==3=3<5<]4j;9:(FRv>;;ㄇ;={;:#:`M:cU5:y;؃ɼ.Oq)<Ӵ; L[;f*x.#9b`;9gh9c:tW2X̝.:;:ߺ>s=VPvV;ϓ:Y8*9Y;&Żn:;,;XZ:W^zo>;6(2::d; s:;dV:B^:6仈u:Н:ݻ :VP;6;a 9$0ͻrd:cI|㹬R;V8<X<1;M;W_,)vi./E:ؘ!:cۺ(X]J\@^u01_MQ!:h8&.V;;ķq9;Fx;ԮY:?Mp;9;Ñ*I3:8ų:R;;8 ;ǎ<*<}=<{cXݞc:z]*KB¥Fn;ٜ;Qi5X&+x>9Ro9ko,̼I_pW:<+;`;<8ER;XٻX곺;Rv ;A;!;vV9;7;N#d:P;(;w;h;u;>u:^;f л 9n;LX~g䉺ֻ:%3:[@"lMb +;Z0;/V< +9F:\0;ϸ< b`>>@Ȼ0:UPZyZ3(8_:pĻXV:W6bX:";z<*;;+8:*q36ɻ[{;~sW:H޻^:pv%:!LúUl;P:;u;܉:"I:$1;);s;o_: :gp$}o;O_;# :VQ?-8j ;xO1; +M:3;Hǩ:a9B%v8"F:<<朊9B8 );(9R5;hn;::Pp컁ܻsƔgd;C9);v{J<7:;cչӻF$:AdYR.kGGЕ +`TRH@9zb"@ g Ew.65C[IE AF184D(C@%?Dl<.¥=<78 8ޔЕ,tB>ye@8i?׿ܾX>p> +tApb"@S% EH%M@y&1@`TRH@BD4=C +CQD(DaC>BDL߭DSD D~CEGGЕ`TRH@6"@\ +Ef7M7CYAF184GCkBX@µ>GC$8==<; +9ٵ8u7ЕGGЕ +`TRH@ZKI"@E6g6D_AF184u]EwVBB`?%@X<= =\<7T87Е +SB9F=~ɢBm?ml>?  + +F@II"@<ЩEF184B/A?  +II"@<ЩE +F@h|o@`TRH@zEBBC +A< CdCxdBBߞuCGGЕ +`TRH@h )I"@p>;E@F184 +FZC^zB~>&gpeC<^=᪼A79 NЕWJA6AM?;Q?<>v> +1(I"@$E !rhR@CԠ@`TRH@C?J}CC|C=gCӹB tD:AdYR.k \ No newline at end of file diff --git a/alerts/roman_rapid_alerts/schema/01/00/rapid.v01_00.alert.avsc b/alerts/roman_rapid_alerts/schema/01/00/rapid.v01_00.alert.avsc new file mode 100644 index 00000000..7e86ebe0 --- /dev/null +++ b/alerts/roman_rapid_alerts/schema/01/00/rapid.v01_00.alert.avsc @@ -0,0 +1,21 @@ +{ + "namespace": "rapid.v01_00", + "name": "alert", + "doc": "RAPID alert schema: top-level alert record (LSST-compatible)", + "version": "01.00", + "type": "record", + "fields": [ + {"name": "diaSourceId", "type": "long", "doc": "Identifier for the triggering diaSource"}, + {"name": "observation_reason", "type": ["null", "string"], "default": null, "doc": "Reason for observation (e.g. survey, ToO)"}, + {"name": "target_name", "type": ["null", "string"], "default": null, "doc": "Target name if targeted observation"}, + {"name": "diaSource", "type": "rapid.v01_00.diaSource", "doc": "Triggering source detection"}, + {"name": "prvDiaSources", "type": ["null", {"type": "array", "items": "rapid.v01_00.diaSource"}], "default": null, "doc": "Previous detections of the same object within 12 months"}, + {"name": "prvDiaForcedSources","type": ["null", {"type": "array", "items": "rapid.v01_00.diaForcedSource"}], "default": null, "doc": "Forced photometry history at the object position"}, + {"name": "diaObject", "type": ["null", "rapid.v01_00.diaObject"], "default": null, "doc": "Summary object record"}, + {"name": "ssSource", "type": ["null", "rapid.v01_00.ssSource"], "default": null, "doc": "Solar system source association (stub)"}, + {"name": "mpc_orbits", "type": ["null", "rapid.v01_00.mpc_orbits"], "default": null, "doc": "MPC orbital elements (stub)"}, + {"name": "cutoutDifference", "type": ["null", "bytes"], "default": null, "doc": "FITS cutout of difference image"}, + {"name": "cutoutScience", "type": ["null", "bytes"], "default": null, "doc": "FITS cutout of science image"}, + {"name": "cutoutTemplate", "type": ["null", "bytes"], "default": null, "doc": "FITS cutout of template image"} + ] +} diff --git a/alerts/roman_rapid_alerts/schema/01/00/rapid.v01_00.diaForcedSource.avsc b/alerts/roman_rapid_alerts/schema/01/00/rapid.v01_00.diaForcedSource.avsc new file mode 100644 index 00000000..dc69943a --- /dev/null +++ b/alerts/roman_rapid_alerts/schema/01/00/rapid.v01_00.diaForcedSource.avsc @@ -0,0 +1,23 @@ +{ + "namespace": "rapid.v01_00", + "name": "diaForcedSource", + "doc": "RAPID alert schema: forced photometry measurement at a diaObject position", + "version": "01.00", + "type": "record", + "fields": [ + {"name": "diaForcedSourceId", "type": "long", "doc": "Unique identifier for this forced source measurement"}, + {"name": "diaObjectId", "type": "long", "doc": "Associated diaObject identifier"}, + {"name": "visit", "type": "long", "doc": "Visit (exposure) identifier"}, + {"name": "detector", "type": "int", "doc": "Detector (SCA) number"}, + {"name": "ra", "type": "double", "doc": "Right ascension of forced measurement position; ICRS [deg]"}, + {"name": "dec", "type": "double", "doc": "Declination of forced measurement position; ICRS [deg]"}, + {"name": "band", "type": ["null", "string"], "default": null, "doc": "Filter band name"}, + {"name": "psfFlux", "type": ["null", "float"], "default": null, "doc": "Forced PSF flux on difference image [nJy]"}, + {"name": "psfFluxErr", "type": ["null", "float"], "default": null, "doc": "Uncertainty in psfFlux [nJy]"}, + {"name": "scienceFlux", "type": ["null", "float"], "default": null, "doc": "Forced PSF flux on science image (stub) [nJy]"}, + {"name": "scienceFluxErr", "type": ["null", "float"], "default": null, "doc": "Uncertainty in scienceFlux (stub) [nJy]"}, + {"name": "midpointMjdTai", "type": "double", "doc": "Effective mid-observation time [TAI MJD]"}, + {"name": "timeProcessedMjdTai","type": "double", "doc": "Time measurement was processed [TAI MJD]"}, + {"name": "timeWithdrawnMjdTai","type": ["null", "double"], "default": null, "doc": "Time measurement was withdrawn [TAI MJD]"} + ] +} diff --git a/alerts/roman_rapid_alerts/schema/01/00/rapid.v01_00.diaObject.avsc b/alerts/roman_rapid_alerts/schema/01/00/rapid.v01_00.diaObject.avsc new file mode 100644 index 00000000..07438349 --- /dev/null +++ b/alerts/roman_rapid_alerts/schema/01/00/rapid.v01_00.diaObject.avsc @@ -0,0 +1,66 @@ +{ + "namespace": "rapid.v01_00", + "name": "diaObject", + "doc": "RAPID alert schema: astronomical object derived from DIASources", + "version": "01.00", + "type": "record", + "fields": [ + {"name": "diaObjectId", "type": "long", "doc": "Unique identifier for this object"}, + {"name": "ra", "type": "double", "doc": "Right ascension of object centroid; ICRS [deg]"}, + {"name": "dec", "type": "double", "doc": "Declination of object centroid; ICRS [deg]"}, + {"name": "raErr", "type": ["null", "float"], "default": null, "doc": "Uncertainty in ra [deg]"}, + {"name": "decErr", "type": ["null", "float"], "default": null, "doc": "Uncertainty in dec [deg]"}, + {"name": "nDiaSources", "type": "int", "doc": "Total number of associated DIASources"}, + {"name": "firstDiaSourceMjdTai", "type": ["null", "double"], "default": null, "doc": "MJD of earliest associated diaSource [TAI MJD]"}, + {"name": "lastDiaSourceMjdTai", "type": ["null", "double"], "default": null, "doc": "MJD of latest associated diaSource [TAI MJD]"}, + {"name": "validityStartMjdTai", "type": "double", "doc": "Start of validity interval for this object summary [TAI MJD]"}, + + {"name": "F062PsfFluxMean", "type": ["null", "float"], "default": null, "doc": "Mean PSF flux in F062 [nJy]"}, + {"name": "F062PsfFluxSigma", "type": ["null", "float"], "default": null, "doc": "Std dev of PSF flux in F062 [nJy]"}, + {"name": "F062PsfFluxNdata", "type": ["null", "int"], "default": null, "doc": "Number of F062 measurements"}, + {"name": "F062PsfFluxMin", "type": ["null", "float"], "default": null, "doc": "Minimum PSF flux in F062 [nJy]"}, + {"name": "F062PsfFluxMax", "type": ["null", "float"], "default": null, "doc": "Maximum PSF flux in F062 [nJy]"}, + + {"name": "F087PsfFluxMean", "type": ["null", "float"], "default": null, "doc": "Mean PSF flux in F087 [nJy]"}, + {"name": "F087PsfFluxSigma", "type": ["null", "float"], "default": null, "doc": "Std dev of PSF flux in F087 [nJy]"}, + {"name": "F087PsfFluxNdata", "type": ["null", "int"], "default": null, "doc": "Number of F087 measurements"}, + {"name": "F087PsfFluxMin", "type": ["null", "float"], "default": null, "doc": "Minimum PSF flux in F087 [nJy]"}, + {"name": "F087PsfFluxMax", "type": ["null", "float"], "default": null, "doc": "Maximum PSF flux in F087 [nJy]"}, + + {"name": "F106PsfFluxMean", "type": ["null", "float"], "default": null, "doc": "Mean PSF flux in F106 [nJy]"}, + {"name": "F106PsfFluxSigma", "type": ["null", "float"], "default": null, "doc": "Std dev of PSF flux in F106 [nJy]"}, + {"name": "F106PsfFluxNdata", "type": ["null", "int"], "default": null, "doc": "Number of F106 measurements"}, + {"name": "F106PsfFluxMin", "type": ["null", "float"], "default": null, "doc": "Minimum PSF flux in F106 [nJy]"}, + {"name": "F106PsfFluxMax", "type": ["null", "float"], "default": null, "doc": "Maximum PSF flux in F106 [nJy]"}, + + {"name": "F129PsfFluxMean", "type": ["null", "float"], "default": null, "doc": "Mean PSF flux in F129 [nJy]"}, + {"name": "F129PsfFluxSigma", "type": ["null", "float"], "default": null, "doc": "Std dev of PSF flux in F129 [nJy]"}, + {"name": "F129PsfFluxNdata", "type": ["null", "int"], "default": null, "doc": "Number of F129 measurements"}, + {"name": "F129PsfFluxMin", "type": ["null", "float"], "default": null, "doc": "Minimum PSF flux in F129 [nJy]"}, + {"name": "F129PsfFluxMax", "type": ["null", "float"], "default": null, "doc": "Maximum PSF flux in F129 [nJy]"}, + + {"name": "F146PsfFluxMean", "type": ["null", "float"], "default": null, "doc": "Mean PSF flux in F146 [nJy]"}, + {"name": "F146PsfFluxSigma", "type": ["null", "float"], "default": null, "doc": "Std dev of PSF flux in F146 [nJy]"}, + {"name": "F146PsfFluxNdata", "type": ["null", "int"], "default": null, "doc": "Number of F146 measurements"}, + {"name": "F146PsfFluxMin", "type": ["null", "float"], "default": null, "doc": "Minimum PSF flux in F146 [nJy]"}, + {"name": "F146PsfFluxMax", "type": ["null", "float"], "default": null, "doc": "Maximum PSF flux in F146 [nJy]"}, + + {"name": "F158PsfFluxMean", "type": ["null", "float"], "default": null, "doc": "Mean PSF flux in F158 [nJy]"}, + {"name": "F158PsfFluxSigma", "type": ["null", "float"], "default": null, "doc": "Std dev of PSF flux in F158 [nJy]"}, + {"name": "F158PsfFluxNdata", "type": ["null", "int"], "default": null, "doc": "Number of F158 measurements"}, + {"name": "F158PsfFluxMin", "type": ["null", "float"], "default": null, "doc": "Minimum PSF flux in F158 [nJy]"}, + {"name": "F158PsfFluxMax", "type": ["null", "float"], "default": null, "doc": "Maximum PSF flux in F158 [nJy]"}, + + {"name": "F184PsfFluxMean", "type": ["null", "float"], "default": null, "doc": "Mean PSF flux in F184 [nJy]"}, + {"name": "F184PsfFluxSigma", "type": ["null", "float"], "default": null, "doc": "Std dev of PSF flux in F184 [nJy]"}, + {"name": "F184PsfFluxNdata", "type": ["null", "int"], "default": null, "doc": "Number of F184 measurements"}, + {"name": "F184PsfFluxMin", "type": ["null", "float"], "default": null, "doc": "Minimum PSF flux in F184 [nJy]"}, + {"name": "F184PsfFluxMax", "type": ["null", "float"], "default": null, "doc": "Maximum PSF flux in F184 [nJy]"}, + + {"name": "F213PsfFluxMean", "type": ["null", "float"], "default": null, "doc": "Mean PSF flux in F213 [nJy]"}, + {"name": "F213PsfFluxSigma", "type": ["null", "float"], "default": null, "doc": "Std dev of PSF flux in F213 [nJy]"}, + {"name": "F213PsfFluxNdata", "type": ["null", "int"], "default": null, "doc": "Number of F213 measurements"}, + {"name": "F213PsfFluxMin", "type": ["null", "float"], "default": null, "doc": "Minimum PSF flux in F213 [nJy]"}, + {"name": "F213PsfFluxMax", "type": ["null", "float"], "default": null, "doc": "Maximum PSF flux in F213 [nJy]"} + ] +} diff --git a/alerts/roman_rapid_alerts/schema/01/00/rapid.v01_00.diaSource.avsc b/alerts/roman_rapid_alerts/schema/01/00/rapid.v01_00.diaSource.avsc new file mode 100644 index 00000000..af277d42 --- /dev/null +++ b/alerts/roman_rapid_alerts/schema/01/00/rapid.v01_00.diaSource.avsc @@ -0,0 +1,77 @@ +{ + "namespace": "rapid.v01_00", + "name": "diaSource", + "doc": "RAPID alert schema: individual source detection on a difference image", + "version": "01.00", + "type": "record", + "fields": [ + {"name": "diaSourceId", "type": "long", "doc": "Unique identifier for this source detection"}, + {"name": "visit", "type": "long", "doc": "Visit (exposure) identifier"}, + {"name": "detector", "type": "int", "doc": "Detector (SCA) number"}, + {"name": "diaObjectId", "type": ["null", "long"], "default": null, "doc": "Associated diaObject identifier"}, + {"name": "ssObjectId", "type": ["null", "long"], "default": null, "doc": "Associated solar system object identifier (stub)"}, + {"name": "parentDiaSourceId", "type": ["null", "long"], "default": null, "doc": "Parent diaSource if deblended (stub)"}, + {"name": "midpointMjdTai", "type": "double", "doc": "Effective mid-observation time [TAI MJD]"}, + {"name": "ra", "type": "double", "doc": "Right ascension; ICRS [deg]"}, + {"name": "dec", "type": "double", "doc": "Declination; ICRS [deg]"}, + {"name": "raErr", "type": ["null", "float"], "default": null, "doc": "Uncertainty in ra [deg]"}, + {"name": "decErr", "type": ["null", "float"], "default": null, "doc": "Uncertainty in dec [deg]"}, + {"name": "x", "type": "float", "doc": "x-pixel position on detector [pixels]"}, + {"name": "y", "type": "float", "doc": "y-pixel position on detector [pixels]"}, + {"name": "xErr", "type": ["null", "float"], "default": null, "doc": "Uncertainty in x [pixels]"}, + {"name": "yErr", "type": ["null", "float"], "default": null, "doc": "Uncertainty in y [pixels]"}, + {"name": "band", "type": ["null", "string"], "default": null, "doc": "Filter band name (F062, F087, F106, F129, F146, F158, F184, F213)"}, + {"name": "psfFlux", "type": ["null", "float"], "default": null, "doc": "Flux from PSF-fit on difference image [nJy]"}, + {"name": "psfFluxErr", "type": ["null", "float"], "default": null, "doc": "Uncertainty in psfFlux [nJy]"}, + {"name": "snr", "type": ["null", "float"], "default": null, "doc": "Signal-to-noise ratio (psfFlux / psfFluxErr)"}, + {"name": "extendedness", "type": ["null", "float"], "default": null, "doc": "Probability of being extended (stub)"}, + {"name": "reliability", "type": ["null", "float"], "default": null, "doc": "Reliability score (stub)"}, + {"name": "flags", "type": "long", "doc": "Bitmask of processing flags"}, + + {"name": "apFlux", "type": ["null", "float"], "default": null, "doc": "Aperture flux on difference image (stub) [nJy]"}, + {"name": "apFluxErr", "type": ["null", "float"], "default": null, "doc": "Uncertainty in apFlux (stub) [nJy]"}, + {"name": "trailFlux", "type": ["null", "float"], "default": null, "doc": "Trail-fit flux (stub) [nJy]"}, + {"name": "trailFluxErr", "type": ["null", "float"], "default": null, "doc": "Uncertainty in trailFlux (stub) [nJy]"}, + {"name": "trailLength", "type": ["null", "float"], "default": null, "doc": "Trail length (stub) [arcsec]"}, + {"name": "trailAngle", "type": ["null", "float"], "default": null, "doc": "Trail angle (stub) [deg]"}, + {"name": "scienceFlux", "type": ["null", "float"], "default": null, "doc": "Forced PSF flux on science image (stub) [nJy]"}, + {"name": "scienceFluxErr", "type": ["null", "float"], "default": null, "doc": "Uncertainty in scienceFlux (stub) [nJy]"}, + {"name": "templateFlux", "type": ["null", "float"], "default": null, "doc": "Forced PSF flux on template image (stub) [nJy]"}, + {"name": "templateFluxErr", "type": ["null", "float"], "default": null, "doc": "Uncertainty in templateFlux (stub) [nJy]"}, + {"name": "dipoleMeanFlux", "type": ["null", "float"], "default": null, "doc": "Dipole mean flux (stub) [nJy]"}, + {"name": "dipoleFluxErr", "type": ["null", "float"], "default": null, "doc": "Uncertainty in dipoleMeanFlux (stub) [nJy]"}, + {"name": "dipoleLength", "type": ["null", "float"], "default": null, "doc": "Dipole separation (stub) [arcsec]"}, + {"name": "dipoleAngle", "type": ["null", "float"], "default": null, "doc": "Dipole orientation (stub) [deg]"}, + + {"name": "ixx", "type": ["null", "float"], "default": null, "doc": "Adaptive second moment Ixx (stub) [arcsec^2]"}, + {"name": "iyy", "type": ["null", "float"], "default": null, "doc": "Adaptive second moment Iyy (stub) [arcsec^2]"}, + {"name": "ixy", "type": ["null", "float"], "default": null, "doc": "Adaptive second moment Ixy (stub) [arcsec^2]"}, + {"name": "ixxErr", "type": ["null", "float"], "default": null, "doc": "Uncertainty in ixx (stub) [arcsec^2]"}, + {"name": "iyyErr", "type": ["null", "float"], "default": null, "doc": "Uncertainty in iyy (stub) [arcsec^2]"}, + {"name": "ixyErr", "type": ["null", "float"], "default": null, "doc": "Uncertainty in ixy (stub) [arcsec^2]"}, + + {"name": "pixelFlags_saturated", "type": ["null", "boolean"], "default": null, "doc": "Source has saturated pixels (stub)"}, + {"name": "pixelFlags_bad", "type": ["null", "boolean"], "default": null, "doc": "Source has bad pixels (stub)"}, + {"name": "pixelFlags_edge", "type": ["null", "boolean"], "default": null, "doc": "Source is near detector edge (stub)"}, + {"name": "pixelFlags_cr", "type": ["null", "boolean"], "default": null, "doc": "Source has cosmic ray pixels (stub)"}, + + {"name": "timeProcessedMjdTai", "type": ["null", "double"], "default": null, "doc": "Time alert was processed [TAI MJD]"}, + {"name": "timeWithdrawnMjdTai", "type": ["null", "double"], "default": null, "doc": "Time alert was withdrawn [TAI MJD]"}, + + {"name": "sca", "type": "int", "doc": "Roman SCA detector number"}, + {"name": "field", "type": "int", "doc": "Roman field identifier"}, + {"name": "hp6", "type": "int", "doc": "HEALPix index at nside=64 (order 6)"}, + {"name": "hp9", "type": "int", "doc": "HEALPix index at nside=512 (order 9)"}, + {"name": "pid", "type": "long", "doc": "Processing ID for science image"}, + {"name": "expid", "type": "int", "doc": "Exposure identifier"}, + {"name": "isdiffpos", "type": "boolean", "doc": "true if source is from positive (sci minus ref) subtraction"}, + {"name": "qfit", "type": ["null", "float"], "default": null, "doc": "PSF-fit quality parameter"}, + {"name": "cfit", "type": ["null", "float"], "default": null, "doc": "PSF-fit chi parameter"}, + {"name": "redchi", "type": ["null", "float"], "default": null, "doc": "Reduced chi-square of PSF fit"}, + {"name": "npixfit", "type": ["null", "int"], "default": null, "doc": "Number of pixels used in PSF fit"}, + {"name": "sharpness", "type": ["null", "float"], "default": null, "doc": "PSF-fit sharpness parameter"}, + {"name": "roundness1", "type": ["null", "float"], "default": null, "doc": "PSF-fit roundness parameter 1"}, + {"name": "roundness2", "type": ["null", "float"], "default": null, "doc": "PSF-fit roundness parameter 2"}, + {"name": "peak", "type": ["null", "float"], "default": null, "doc": "Peak pixel value in source stamp [DN]"} + ] +} diff --git a/alerts/roman_rapid_alerts/schema/01/00/rapid.v01_00.mpc_orbits.avsc b/alerts/roman_rapid_alerts/schema/01/00/rapid.v01_00.mpc_orbits.avsc new file mode 100644 index 00000000..795c5221 --- /dev/null +++ b/alerts/roman_rapid_alerts/schema/01/00/rapid.v01_00.mpc_orbits.avsc @@ -0,0 +1,19 @@ +{ + "namespace": "rapid.v01_00", + "name": "mpc_orbits", + "doc": "RAPID alert schema: MPC orbital elements (stub)", + "version": "01.00", + "type": "record", + "fields": [ + {"name": "id", "type": "string", "doc": "MPC designation or packed designation"}, + {"name": "a", "type": ["null", "double"], "default": null, "doc": "Semi-major axis [AU]"}, + {"name": "e", "type": ["null", "double"], "default": null, "doc": "Eccentricity"}, + {"name": "incl", "type": ["null", "double"], "default": null, "doc": "Inclination [deg]"}, + {"name": "Omega", "type": ["null", "double"], "default": null, "doc": "Longitude of ascending node [deg]"}, + {"name": "omega", "type": ["null", "double"], "default": null, "doc": "Argument of perihelion [deg]"}, + {"name": "M", "type": ["null", "double"], "default": null, "doc": "Mean anomaly [deg]"}, + {"name": "epoch", "type": ["null", "double"], "default": null, "doc": "Epoch of orbital elements [MJD]"}, + {"name": "H", "type": ["null", "float"], "default": null, "doc": "Absolute magnitude [mag]"}, + {"name": "G", "type": ["null", "float"], "default": null, "doc": "Slope parameter"} + ] +} diff --git a/alerts/roman_rapid_alerts/schema/01/00/rapid.v01_00.ssSource.avsc b/alerts/roman_rapid_alerts/schema/01/00/rapid.v01_00.ssSource.avsc new file mode 100644 index 00000000..6e8de767 --- /dev/null +++ b/alerts/roman_rapid_alerts/schema/01/00/rapid.v01_00.ssSource.avsc @@ -0,0 +1,18 @@ +{ + "namespace": "rapid.v01_00", + "name": "ssSource", + "doc": "RAPID alert schema: solar system source association (stub)", + "version": "01.00", + "type": "record", + "fields": [ + {"name": "ssSourceId", "type": "long", "doc": "Unique identifier for this solar system source"}, + {"name": "diaSourceId", "type": "long", "doc": "Associated diaSource identifier"}, + {"name": "ssObjectId", "type": ["null", "long"], "default": null, "doc": "Associated solar system object identifier"}, + {"name": "heliocentricX", "type": ["null", "double"], "default": null, "doc": "Heliocentric x position [AU]"}, + {"name": "heliocentricY", "type": ["null", "double"], "default": null, "doc": "Heliocentric y position [AU]"}, + {"name": "heliocentricZ", "type": ["null", "double"], "default": null, "doc": "Heliocentric z position [AU]"}, + {"name": "phaseAngle", "type": ["null", "float"], "default": null, "doc": "Phase angle [deg]"}, + {"name": "heliocentricDist", "type": ["null", "float"],"default": null, "doc": "Heliocentric distance [AU]"}, + {"name": "topocentricDist", "type": ["null", "float"], "default": null, "doc": "Topocentric distance [AU]"} + ] +}