\n",
"\n",
"**This is a fixed-text formatted version of a Jupyter notebook**\n",
"\n",
"- Try online [![Binder](https://static.mybinder.org/badge.svg)](https://mybinder.org/v2/gh/gammapy/gammapy-webpage/v0.18.2?urlpath=lab/tree/extended_source_spectral_analysis.ipynb)\n",
"- You can contribute with your own notebooks in this\n",
"[GitHub repository](https://github.com/gammapy/gammapy/tree/master/docs/tutorials).\n",
"- **Source files:**\n",
"[extended_source_spectral_analysis.ipynb](../_static/notebooks/extended_source_spectral_analysis.ipynb) |\n",
"[extended_source_spectral_analysis.py](../_static/notebooks/extended_source_spectral_analysis.py)\n",
"
\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Spectral analysis of extended sources\n",
"\n",
"## Prerequisites:\n",
"\n",
"- Understanding of spectral analysis techniques in classical Cherenkov astronomy.\n",
"- Understanding of how the spectrum and cube extraction API works, please refer to the [spectrum extraction notebook](spectrum_analysis.ipynb) and to the [3D analysis notebook](analysis_2.ipynb).\n",
"\n",
"## Context\n",
"\n",
"Many VHE sources in the Galaxy are extended. Studying them with a 1D spectral analysis is more complex than studying point sources. \n",
"One often has to use complex (i.e. non circular) regions and more importantly, one has to take into account the fact that the instrument response is non uniform over the selectred region.\n",
"A typical example is given by the supernova remnant RX J1713-3935 which is nearly 1 degree in diameter. See the [following article](https://ui.adsabs.harvard.edu/abs/2018A%26A...612A...6H/abstract).\n",
"\n",
"**Objective: Measure the spectrum of RX J1713-3945 in a 1 degree region fully enclosing it.**\n",
"\n",
"## Proposed approach:\n",
"\n",
"We have seen in the general presentation of the spectrum extraction for point sources, see [the corresponding notebook](spectrum_analysis.ipynb), that Gammapy uses specific datasets makers to first produce reduced spectral data and then to extract OFF measurements with reflected background techniques: the `~gammapy.makers.SpectrumDatasetMaker` and the `~gammapy.makers.ReflectedRegionsBackgroundMaker`. The former simply computes the reduced IRF at the center of the ON region (assumed to be circular).\n",
"\n",
"This is no longer valid for extended sources. To be able to compute average responses in the ON region, Gammapy relies on the creation of a cube enclosing it (i.e. a `~gammapy.datasets.MapDataset`) which can be reduced to a simple spectrum (i.e. a `~gammapy.datasets.SpectrumDataset`). We can then proceed with the OFF extraction as the standard point source case.\n",
"\n",
"In summary, we have to:\n",
"\n",
"- Define an ON region (a `~regions.SkyRegion`) fully enclosing the source we want to study.\n",
"- Define a geometry that fully contains the region and that covers the required energy range (beware in particular, the true energy range). \n",
"- Create the necessary makers : \n",
" - the map dataset maker : `~gammapy.makers.MapDatasetMaker`\n",
" - the OFF background maker, here a `~gammapy.makers.ReflectedRegionsBackgroundMaker`\n",
" - and usually the safe range maker : `~gammapy.makers.SafeRangeMaker`\n",
"- Perform the data reduction loop. And for every observation:\n",
" - Produce a map dataset and squeeze it to a spectrum dataset with `~gammapy.datasets.MapDataset.to_spectrum_dataset(on_region)`\n",
" - Extract the OFF data to produce a `~gammapy.datasets.SpectrumDatasetOnOff` and compute a safe range for it.\n",
" - Stack or store the resulting spectrum dataset.\n",
"- Finally proceed with model fitting on the dataset as usual.\n",
"\n",
"Here, we will use the RX J1713-3945 observations from the H.E.S.S. first public test data release. The tutorial is implemented with the intermediate level API.\n",
"\n",
"## Setup \n",
"\n",
"As usual, we'll start with some general imports..."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import astropy.units as u\n",
"from astropy.coordinates import SkyCoord, Angle\n",
"from regions import CircleSkyRegion\n",
"from gammapy.maps import Map, MapAxis, WcsGeom\n",
"from gammapy.modeling import Fit\n",
"from gammapy.data import DataStore\n",
"from gammapy.modeling.models import PowerLawSpectralModel, SkyModel\n",
"from gammapy.datasets import Datasets, MapDataset\n",
"from gammapy.makers import (\n",
" SafeMaskMaker,\n",
" MapDatasetMaker,\n",
" ReflectedRegionsBackgroundMaker,\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Select the data\n",
"\n",
"We first set the datastore and retrieve a few observations from our source."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"datastore = DataStore.from_dir(\"$GAMMAPY_DATA/hess-dl3-dr1/\")\n",
"obs_ids = [20326, 20327, 20349, 20350, 20396, 20397]\n",
"# In case you want to use all RX J1713 data in the HESS DR1\n",
"# other_ids=[20421, 20422, 20517, 20518, 20519, 20521, 20898, 20899, 20900]\n",
"\n",
"observations = datastore.get_observations(obs_ids)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Prepare the datasets creation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Select the ON region\n",
"\n",
"Here we take a simple 1 degree circular region because it fits well with the morphology of RX J1713-3945. More complex regions could be used e.g. `~regions.EllipseSkyRegion` or `~regions.RectangleSkyRegion`."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"target_position = SkyCoord(347.3, -0.5, unit=\"deg\", frame=\"galactic\")\n",
"radius = Angle(\"0.5 deg\")\n",
"on_region = CircleSkyRegion(target_position, radius)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Define the geometries\n",
"\n",
"This part is especially important. \n",
"- We have to define first energy axes. They define the axes of the resulting `~gammapy.datasets.SpectrumDatasetOnOff`. In particular, we have to be careful to the true energy axis: it has to cover a larger range than the reconstructed energy one.\n",
"- Then we define the geometry itself. It does not need to be very finely binned and should enclose all the ON region. To limit CPU and memory usage, one should avoid using a much larger region."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# The binning of the final spectrum is defined here.\n",
"energy_axis = MapAxis.from_energy_bounds(0.3, 40.0, 10, unit=\"TeV\")\n",
"\n",
"# Reduced IRFs are defined in true energy (i.e. not measured energy).\n",
"energy_axis_true = MapAxis.from_energy_bounds(\n",
" 0.05, 100, 30, unit=\"TeV\", name=\"energy_true\"\n",
")\n",
"\n",
"# Here we use 1.5 degree which is slightly larger than needed.\n",
"geom = WcsGeom.create(\n",
" skydir=target_position,\n",
" binsz=0.04,\n",
" width=(1.5, 1.5),\n",
" frame=\"galactic\",\n",
" proj=\"CAR\",\n",
" axes=[energy_axis],\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Create the makers\n",
"\n",
"First we instantiate the target `~gammapy.datasets.MapDataset`. "
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"stacked = MapDataset.create(\n",
" geom=geom, energy_axis_true=energy_axis_true, name=\"rxj-stacked\"\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we create its associated maker. Here we need to produce, counts, exposure and edisp (energy dispersion) entries. PSF and IRF background are not needed, therefore we don't compute them."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"maker = MapDatasetMaker(selection=[\"counts\", \"exposure\", \"edisp\"])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we create the OFF background maker for the spectra. If we have an exclusion region, we have to pass it here. We also define the safe range maker."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"bkg_maker = ReflectedRegionsBackgroundMaker()\n",
"safe_mask_maker = SafeMaskMaker(\n",
" methods=[\"aeff-default\", \"aeff-max\"], aeff_percent=10\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Perform the data reduction loop.\n",
"\n",
"We can now run over selected observations. For each of them, we:\n",
"- create the map dataset and stack it on our target dataset.\n",
"- squeeze the map dataset to a spectral dataset in the ON region\n",
"- Compute the OFF and create a `~gammapy.datasets.SpectrumDatasetOnOff` object\n",
"- Run the safe mask maker on it\n",
"- Add the `~gammapy.datasets.SpectrumDatasetOnOff` to the list."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 3.43 s, sys: 232 ms, total: 3.66 s\n",
"Wall time: 3.75 s\n"
]
}
],
"source": [
"%%time\n",
"datasets = Datasets()\n",
"\n",
"for obs in observations:\n",
" # A MapDataset is filled in this geometry\n",
" dataset = maker.run(stacked, obs)\n",
" # To make images, the resulting dataset cutout is stacked onto the final one\n",
" stacked.stack(dataset)\n",
"\n",
" # Extract 1D spectrum\n",
" spectrum_dataset = dataset.to_spectrum_dataset(\n",
" on_region, name=f\"obs-{obs.obs_id}\"\n",
" )\n",
" # Compute OFF\n",
" spectrum_dataset = bkg_maker.run(spectrum_dataset, obs)\n",
" # Define safe mask\n",
" spectrum_dataset = safe_mask_maker.run(spectrum_dataset, obs)\n",
" # Append dataset to the list\n",
" datasets.append(spectrum_dataset)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"Table length=6\n",
"
\n",
"
NAME
TYPE
TELESCOP
OBS_ID
RA_PNT
DEC_PNT
\n",
"
deg
deg
\n",
"
str9
str20
str4
int64
float64
float64
\n",
"
obs-20326
SpectrumDatasetOnOff
HESS
20326
259.29852294921875
-39.76222229003906
\n",
"
obs-20327
SpectrumDatasetOnOff
HESS
20327
257.4773254394531
-39.76222229003906
\n",
"
obs-20349
SpectrumDatasetOnOff
HESS
20349
259.29852294921875
-39.76222229003906
\n",
"
obs-20350
SpectrumDatasetOnOff
HESS
20350
257.4773254394531
-39.76222229003906
\n",
"
obs-20396
SpectrumDatasetOnOff
HESS
20396
258.3879089355469
-39.06222152709961
\n",
"
obs-20397
SpectrumDatasetOnOff
HESS
20397
258.3879089355469
-40.462223052978516
\n",
"
"
],
"text/plain": [
"
\n",
" NAME TYPE ... RA_PNT DEC_PNT \n",
" ... deg deg \n",
" str9 str20 ... float64 float64 \n",
"--------- -------------------- ... ------------------ -------------------\n",
"obs-20326 SpectrumDatasetOnOff ... 259.29852294921875 -39.76222229003906\n",
"obs-20327 SpectrumDatasetOnOff ... 257.4773254394531 -39.76222229003906\n",
"obs-20349 SpectrumDatasetOnOff ... 259.29852294921875 -39.76222229003906\n",
"obs-20350 SpectrumDatasetOnOff ... 257.4773254394531 -39.76222229003906\n",
"obs-20396 SpectrumDatasetOnOff ... 258.3879089355469 -39.06222152709961\n",
"obs-20397 SpectrumDatasetOnOff ... 258.3879089355469 -40.462223052978516"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"datasets.meta_table"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Explore the results"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First let's look at the data to see if our region is correct.\n",
"We plot it over the excess. To do so we convert it to a pixel region using the WCS information stored on the geom."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure(figsize=(10, 6))\n",
"ax = fig.add_subplot(121)\n",
"ax.plot(\n",
" info_table[\"livetime\"].to(\"h\"), info_table[\"excess\"], marker=\"o\", ls=\"none\"\n",
")\n",
"plt.xlabel(\"Livetime [h]\")\n",
"plt.ylabel(\"Excess events\")\n",
"\n",
"ax = fig.add_subplot(122)\n",
"ax.plot(\n",
" info_table[\"livetime\"].to(\"h\"),\n",
" info_table[\"sqrt_ts\"],\n",
" marker=\"o\",\n",
" ls=\"none\",\n",
")\n",
"plt.xlabel(\"Livetime [h]\")\n",
"plt.ylabel(\"Sqrt(TS)\");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Perform spectral model fitting\n",
"\n",
"Here we perform a joint fit. \n",
"\n",
"We first create the model, here a simple powerlaw, and assign it to every dataset in the `~gammapy.datasets.Datasets`."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"spectral_model = PowerLawSpectralModel(\n",
" index=2, amplitude=2e-11 * u.Unit(\"cm-2 s-1 TeV-1\"), reference=1 * u.TeV\n",
")\n",
"model = SkyModel(spectral_model=spectral_model, name=\"RXJ 1713\")\n",
"\n",
"datasets.models = [model]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we can run the fit"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"OptimizeResult\n",
"\n",
"\tbackend : minuit\n",
"\tmethod : minuit\n",
"\tsuccess : True\n",
"\tmessage : Optimization terminated successfully.\n",
"\tnfev : 39\n",
"\ttotal stat : 72.95\n",
"\n"
]
}
],
"source": [
"fit_joint = Fit(datasets)\n",
"result_joint = fit_joint.run()\n",
"print(result_joint)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Explore the fit results\n",
"\n",
"First the fitted parameters values and their errors."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"Table length=3\n",
"
\n",
"
name
value
unit
min
max
frozen
error
\n",
"
str9
float64
str14
float64
float64
bool
float64
\n",
"
index
2.1021e+00
nan
nan
False
6.657e-02
\n",
"
amplitude
1.2869e-11
cm-2 s-1 TeV-1
nan
nan
False
1.023e-12
\n",
"
reference
1.0000e+00
TeV
nan
nan
True
0.000e+00
\n",
"
"
],
"text/plain": [
"
\n",
" name value unit min max frozen error \n",
" str9 float64 str14 float64 float64 bool float64 \n",
"--------- ---------- -------------- ------- ------- ------ ---------\n",
" index 2.1021e+00 nan nan False 6.657e-02\n",
"amplitude 1.2869e-11 cm-2 s-1 TeV-1 nan nan False 1.023e-12\n",
"reference 1.0000e+00 TeV nan nan True 0.000e+00"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"result_joint.parameters.to_table()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Then plot the fit result to compare measured and expected counts. Rather than plotting them for each individual dataset, we stack all datasets and plot the fit result on the result."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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7ne/o1OnTuTn57NgwQJ2797NP//5Ty644AJ++ctfAvDQQw/xi1/8guOOO44OHTrQoEED7rvvPrZt28Y111zD+++/D8D06dM57bTTUvL5iGSiqOsU1V4hKigogC176ZPqQCTl+vfvn7Dt4osv5tprr2X37t2cc845Ca+PGjWKUaNGsX37di666KIDXluxYkWV57v//vv505/+xEsvvUSzZs3Iz88HYn9gzj33XIYOHZpQZqnNmzezbNky6tWrxyeffMLKlSs5/PDDWbZsGbfccgvz588HYvdkv/766zRo0IBOnTpx3XXXUa9ePaZMmcJrr73G0UcfzRlnnEG3bt0AuP7668nLy+P000/n/fff56yzzuKtt96q5pMTkVJR1ylKEEJ0yy23QOHnmgdBMsp3vvMd6tWrB0BRURFXXHEFb7/9NmZGSUlJ2X4DBgygdNxO586dee+999i+fTv9+vXj2GOPLStr8+bNACxbtuyAsQ+ffPIJu3bt4uijj47qrYlktKjrFCUIIhGo6ht/o0aNqny9WbNm1bYYBOnII48s+/0nP/kJ3/72t3nmmWcoLCw8oCWkQYMGZb/Xq1ePvXv34u6Vlrt//35WrVpFTk5OKHGLSLB0FwO6zVHqlqOPPppdu3bVaN+ioiJatGgBUNZNUZVTTjmFl19+mZ07d7J3796y7giAM888k/vuu6/s+fr16w8tcBGJlBIEdJuj1C2XXnopd999Nz169OCf//xnlfv+z//8DzfffDOnnXYa+/ZVPwd8ixYtuOWWW/jWt77FwIED6dy5c1k3xL333svatWvp2rUrnTt35v777w/k/YhIOKyqJsG6Jjc319euXRtYef3794fCV1hRuDewMiUzvPXWW5x44ompDiMlPv30U4466ij27t3LBRdcwOjRo7ngggtSHVbWqcvXWHltb1pUtmhTtgurTjGzde6ee/B2tSCEaPr06Uwf3DDVYYhEavLkyXTv3p2TTjqJdu3acf7556c6JJGsEHWdokGKIerevTt8rV6qwxCJ1NSpU1MdgkhWirpOUQtCiJYtW8ayd9S9ICIiyYu6TlELQohuv/12KPycgakOREREMl7UdYpaEERERCSBEgQRERFJoARBJEvVq1ev7G6C73znO+zevbvWZY0aNYqnn34agLFjx1a5XPSKFStic8YforZt27J9+/Ya7fvTn/6UZcuWHfI5gowhSPn5+Xz44YeRn1ekKhqDQGwmRWBY+/btUx2KZKtpXaDo/eDKa9wa8t6ocpecnJyy2QpHjhzJ/fffzw9+8IOy1/ft21e25sKhmD17dpWvr1ixgqOOOiq28lxIfvazn4VWdirk5+dz0kkncdxxx6U6FJEvubse8UfPnj09SBs3bvSNE44MtEzJDG+++eaBGyYdE+wJalDekUd+ee3NnDnTx48f7y+99JL379/fR4wY4SeeeKLv3bvXf/jDH3pubq536dLF77//fnd3379/v0+YMMFPPPFEP+ecc/zss8/2p556yt3d+/Xr52vWrHF39yVLlniPHj28a9eufsYZZ/i7777r//Vf/+XHHXecd+vWzVeuXOn/+c9//MILL/Tc3FzPzc31V155xd3dt2/f7oMGDfLu3bv7uHHjvHXr1r5t27YD3sPevXv9iiuu8G9+85t+0kkn+a9//Wt3d7/iiivK4lm0aJF36tTJTzvtNL/uuut8yJAhsY9o0iS/8sorvV+/ft6uXTu/5557yso977zz/OSTT/bOnTv7Aw88ULa9TZs2CTFU9D7d3Xfs2OHnnXeed+nSxb/1rW/5X//617Lz3n333WXHfvOb3/R3333X3333XT/hhBN87Nix3rlzZx80aJDv3r3bn3rqKT/yyCO9Y8eO3q1bN9+9e7f/6Ec/8hNPPNG7dOniN9xwQ4X/vgnXWB3V5kfPpTqEyIRVpwBrvYI6US0IIerUqRM00zwIklp79+5lyZIlDB48GIDVq1ezYcMG2rVrx6xZs2jcuDFr1qzh888/57TTTuPMM8/k9ddfZ9OmTbzxxhv8+9//pnPnzowePfqAcrdt28ZVV13FypUradeuHR9//DHHHnss11xzDUcddRQ//OEPAfjud79b4TLPt912G6effjo//elPWbRoEbNmzUqIff369XzwwQds2LABgP/7v/874PU9e/Zw9dVXl8UwYsSIA17fuHEjL730Ert27aJTp06MHz+e+vXrM2fOHI499liKi4vp1asXw4cPp2nTphV+fhW9T4BJkybRo0cPnn32WV588UW+973vVbu+xNtvv80TTzzBgw8+yMUXX8z8+fO57LLLuO+++5g6dSq5ubl8/PHHPPPMM2zcuBEzS3jPUndFXacoQQjRwoULYVMJw1IdiNRJxcXFsYlVgP/+7/9mzJgxFBQUcMopp9CuXTsAXnjhBf72t7+VjS8oKiri7bffZuXKlYwYMYJ69epx3HHHccYZZySU/+qrr9K3b9+yskqXeD5YZcs8r1y5kj/84Q8ADBkyhCZNmiQce/zxx/POO+9w3XXXMWTIEM4888wDXt+4cSPHH398WQwjRow4INEYMmQIDRo0oEGDBnz1q1/l3//+Ny1btuTee+/lmWeeAWDLli28/fbblSYIlb3PV155pWwxqjPOOIMdO3ZQ3YJv7dq1K/s36dmzJ4WFhQn7HHPMMTRs2JCxY8cyZMgQhg4dWmWZUndEXacoQQjRr371K+/ZygcAAB+ASURBVCj8QgmCpET5MQjllV/O2d35zW9+w1lnnXXAPosXL8bMqizf3avdB6pe5rm645s0acJf//pXnn/+eX77298yb9485syZc0AMValoSeoVK1awbNkyVq1aRaNGjejfvz979uyptIzK3mdF5zYzDj/8cPbv31+2rXzZB8dTXFycUMbhhx/O6tWrWb58OXPnzuW+++7jxRdfrPJ9St0QdZ2iuxhE6rCzzjqLmTNnUlJSAsDmzZv57LPP6Nu3L3PnzmXfvn189NFHvPTSSwnHnnrqqbz88su8++67AGVN7wcvJ13ZMs99+/blscceA2DJkiXs3Lkz4Rzbt29n//79DB8+nClTpvDaa68d8PoJJ5zAO++8U/ZN/Mknn6z2PRcVFdGkSRMaNWrExo0befXVV6vcv7L3WT7+FStW0KxZM4455hjatm1bFudrr71WdlxVyn9mn376KUVFRZxzzjlMnz5dy2JLyqgFQaQOGzt2LIWFhZx88sm4O82bN+fZZ5/lggsu4MUXX6RLly507NiRfv36JRzbvHlzZs2axYUXXsj+/fv56le/ytKlSxk2bBgXXXQRf/zjH/nNb37Dvffey4QJE+jatSt79+6lb9++3H///UyaNIkRI0Zw8skn069fP1q3bp1wjg8++IArr7yy7Bv5nXfeecDrOTk5zJgxg8GDB9OsWTNOOeWUat/z4MGDuf/+++natSudOnWid+/eVe5f2fucPHkyV155JV27dqVRo0Y8/PDDAAwfPpxHHnmE7t2706tXLzp27FhtTKNGjeKaa64hJyeHJUuWcN5557Fnzx7cnWnTplV7vEgYtNxzOVruWYKSsBRvCm5zrCtKl5d2dyZMmECHDh3Iy8tLdVih03LPMVruOXmVLfesFgSRKKgyD82DDz7Iww8/zBdffEGPHj24+uqrUx2SSFZQghCiRx99FH7dOdVhiGS1vLy8OtFiIBJ1naIEIUStWrWCxhoHKiIiyYu6TlHtFaInn3ySJzeUpDoMERHJAlHXKWpBCNHMmTOh8AsuSXUgIiKS8aKuU5QgiKSBaUs3c8/yt8ueXz+gA3mDqr89TkQkLOpiILaao5nNqm6aVJGw5A3qWHarVuFdQwJJDkqXey593HXXXUmXme6effbZKpeiFpGaUwsC4O4LgYW5ublXpToWkaBUNtVyNnv22WcZOnQonTvr7iGRZKkFQSRFpi3dfMDzde/tPOBnZfslo6ioiE6dOrFp0yYgtrjRgw8+CMAjjzxC165d6datG5dffjkQW8lw+PDh9OrVi169evG///u/ALz88stlLRM9evRg165dfPTRR/Tt25fu3btz0kkn8ec//znh/GvWrKFPnz5069aNU045hV27drFnzx6uvPJKunTpQo8ePcqmdc7Pz+f73/9+2bFDhw5lxYoVABx11FH8+Mc/plu3bvTu3Zt///vfFBQUsGDBAm688Ua6d+/OP//5T+699146d+5M165dufTSSwP7HEXqhIrWgK6rj549ex7iKtpV27Ztm2+78ahAy5TM8Oabb1a7T/l17NcWfuydbl3sbX70nHe6dbGvLfy4wv0OxWGHHebdunUre8ydO9fd3V944QXv3bu3P/HEE37WWWe5u/uGDRu8Y8eOvm3bNnd337Fjh7u7jxgxwv/85z+7u/t7773nJ5xwgru7Dx061F955RV3d9+1a5eXlJT41KlT/fbbb3d397179/onn3xyQDyff/65t2vXzlevXu3u7kVFRWXHjRo1yt3d33rrLW/VqpUXFxf77373O58wYULZ8UOGDPGXXnrJ3d0BX7Bggbu733jjjT5lyhR3d7/iiiv8qaeeKjvm61//uu/Zs8fd3Xfu3FmrzzFd1eQaqwtq+/8jE4VVpwBrvYI6UV0MIWrWrBk0UiONVK7tTYsStu0p2c/wmQVJl11ZF8OgQYN46qmnmDBhAn/9618BePHFF7noooti1yxfLmlc2VLNp512Gj/4wQ8YOXIkF154IS1btqRXr16MHj2akpISzj///LJljUtt2rSJr3/96/Tq1QuILWsMsWWTr7vuOiC2+FKbNm3YvLnqVpMjjjiibBnknj17snTp0gr369q1KyNHjuT888/n/PPPr/oDk9BNW7o50MG35VvderZJXC68NoKOMUhR1ymqvUKUn59P/vovUh2GpLHCu4ZQeNcQ5o/vQ8P6sf+ODesfxvzxfcpeC9r+/ft56623yMnJKVuZ0CtZ0rh0qeb169ezfv16PvjgA44++mhuuukmZs+eTXFxMb1792bjxo307duXlStX0qJFCy6//HIeeeSRA8qq7BxeyXowVS2bXL9+/bKySpdxrsiiRYuYMGEC69ato2fPnpXuJ9Eof6dOsta9t5ORs2MrcY6c/WpC11xtBRlj0KKuU9SCEKL8/HwoLGFUqgORtHT9gA5lv/ds04THxvZm+MwCHhvb+4BvQ+X3C8K0adM48cQTueOOOxg9ejSrVq1iwIABXHDBBeTl5dG0aVM+/vhjjj322LKlmm+88UYgtlRzaf9+ly5d6NKlC6tWrWLjxo3k5OTQokULrrrqKj777DNee+01vve975Wd94QTTuDDDz9kzZo19OrVi127dpGTk1O2bPIZZ5zB5s2bef/99+nUqROffPIJM2bMYP/+/XzwwQesXr262vdWftnk/fv3s2XLFr797W9z+umn8/jjj/Ppp5/yla98JdDPUw5NRa1myQqq1S3dRV2nKEEQSZGDmzFLk4KDm0pr29xZXFx8QDP/4MGDGT16NLNnz2b16tUcffTR9O3bl9tvv53bbruNH//4x/Tr14969erRo0cP8vPzK12qefr06bz00kvUq1ePzp07c/bZZzN37lzuvvtu6tevz1FHHZXQgnDEEUfw5JNPct1111FcXExOTg7Lli3j2muv5ZprrqFLly4cfvjh5Ofn06BBA0477TTatWtHly5dOOmkkzj55JOrfc+XXnopV111Fffeey9z585lzJgxFBUV4e7k5eUpOUgDQbWKlbYg7CnZT8P6hyUk1rUVRgKTqbTcczla7lmCUtuleOvS0rWSnExc7jmMMQjDZxYwf3yfOjEGIerlnjUGQSQNTFu6ueybS9ubFgV6a6NIugi64q2s1S0Z6ZocpIK6GETSQN6gjvrDJCJpRQlCiBYvXgw//1qqwxARkSwQdZ2iBCFEjRo1gvqJt3VJ3VDZbX0iydLYsbop6jpFYxBCNGPGDGas0TwIdVHDhg3ZsWOH/pBL4NydHTt20LBhw1SH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\n",
"text/plain": [
"