{ "cells": [ { "cell_type": "markdown", "id": "615b2a5a", "metadata": {}, "source": [ "# Add Report\n", "\n", "This example demonstrates how to add a PDF and an image report to an HDF5 group and extract them. Having this information can be useful for archiving. \n" ] }, { "cell_type": "code", "execution_count": 1, "id": "c563b0fb", "metadata": {}, "outputs": [], "source": [ "from pathlib import Path\n", "from mth5.mth5 import MTH5\n" ] }, { "cell_type": "markdown", "id": "caef7dbf", "metadata": {}, "source": [ "## Add Text File\n", "\n", "Here we will add a simple text file as a report. Text files accepted are currently\n", "\n", "- `txt`\n", "- `pdf`\n", "- `md`" ] }, { "cell_type": "code", "execution_count": 2, "id": "986c72db", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m2026-01-27T21:33:56.741682-0800 | INFO | mth5.mth5 | _initialize_file | line: 773 | Initialized MTH5 0.2.0 file example.mth5 in mode a\u001b[0m\n", "/:\n", "====================\n", " |- Group: Experiment\n", " --------------------\n", " |- Group: Reports\n", " -----------------\n", " --> Dataset: example_text_file\n", " ................................\n", " |- Group: Standards\n", " -------------------\n", " --> Dataset: summary\n", " ......................\n", " |- Group: Surveys\n", " -----------------\n", " --> Dataset: channel_summary\n", " ..............................\n", " --> Dataset: fc_summary\n", " .........................\n", " --> Dataset: tf_summary\n", " .........................\n", "\u001b[1m2026-01-27T21:33:56.786725-0800 | INFO | mth5.mth5 | close_mth5 | line: 899 | Flushing and closing example.mth5\u001b[0m\n" ] } ], "source": [ "with MTH5() as m:\n", " m.open_mth5(\"example.mth5\", mode=\"a\")\n", " report_path = Path().cwd().joinpath(\"example_report.txt\")\n", " with open(report_path, \"w\") as f:\n", " f.write(\"This is an example report.\")\n", " m.reports_group.add_report(\n", " report_name=\"example_text_file\",\n", " report_metadata={\n", " \"description\": \"A simple report as a text file\",\n", " },\n", " filename=report_path,\n", " )\n", " print(m)" ] }, { "cell_type": "markdown", "id": "9b11708f", "metadata": {}, "source": [ "## Add Image\n", "\n", "Here's an example of how to add an image.\n", "\n", "Accepted images are:\n", "\n", "- `png`\n", "- `jpg`\n", "- `jpeg`\n", "- `tif`\n", "- `tiff`\n", "- `bmp`" ] }, { "cell_type": "code", "execution_count": 3, "id": "0ead74ff", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAh8AAAGdCAYAAACyzRGfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA9AElEQVR4nO3deVyU9d7/8fcgghugqIAIKCruZmoolrmES1aWd3dZWqZm2SnX7G6x7u5T53ffUWfppFmeNJc2bTm5nTotpgKa4b6UmoKi4oK4MiyyzvX7Y3CSxGVgmI3X8/Hgj7nmmuHzdbiYl9cMYDIMwxAAAICT+Lh6AAAAULMQHwAAwKmIDwAA4FTEBwAAcCriAwAAOBXxAQAAnIr4AAAATkV8AAAAp/J19QC/Z7FYdPz4cQUEBMhkMrl6HAAAcB0Mw1BOTo7Cw8Pl43P1cxtuFx/Hjx9XZGSkq8cAAACVkJGRoYiIiKvu43bxERAQIMk6fGBgoIunAQAA18NsNisyMtL2PH41bhcfF19qCQwMJD4AAPAw1/OWCd5wCgAAnIr4AAAATkV8AAAApyI+AACAUxEfAADAqYgPAADgVMQHAABwKuIDAAA4FfEBAACcivgAAABORXwAAACnIj4AAIBTER8AANQQOQXFemdtmhK+2evSOdzur9oCAADHMhcU64MfD+n99enKvlAsXx+TRse1UESjei6Zh/gAAMBLmQuKtXD9Ic1ff1DmghJJUqum9TU1PkbNguq6bC7iAwAAL5N9oVgL1qdrwY/pyimLjjYhDTT5tja664Zw1fIxuXQ+4gMAAC+RnV+s+T+ma+El0RET0kBT4mN0R5dmLo+Oi4gPAAA83Pn8Is1fn65FPx5STqE1OtqGNtDU+LYa2jlMPm4SHRcRHwAAeKhzeWXRseGQcsuio31YgKbEx+j2Tu4XHRcRHwAAeJizeUV6f91BfbDhkPKKSiVJHZoFamp8Gw3u6L7RcRHxAQCAhziTW6h569L14U+HlF8WHR2bBWrqwBgN6hDq9tFxEfEBAICbO5NbqLnrDuqjnw7boqNTeKCmxsdoUMdQmUyeER0XER8AALip07mFmptsjY4Lxdbo6NI8SFPjYxTfIcTjouMi4gMAADeTlVOguUkH9fHGwyootkiSbogI0rSBMRrQznOj4yLiAwAAN5GVU6D3kg7qk0uio2tkQ02Lj1H/dk09PjouIj4AAHCxLHOB5iQd0OKNR1RYYo2OblENNTU+Rv3aek90XER8AADgIpnZBfpH0gEt3nRERWXR0T2qoaYNbKtbY5p4XXRcRHwAAOBkJ7Iv6B+JB7Rkc4YtOm5q0UhTB8aoTxvvjY6LiA8AAJzk+PkLmpN4QJ9tzlBRqTU6Yls20rSBbXVz68ZeHx0XER8AAFSzY+cvaE5imj7ffNQWHT2jgzUtPka9a1B0XER8AABQTY6ey9e7iQf0xZYMFZcakqS4VsGaGt9WvVs3dvF0rkN8AADgYBln8/VuYpr+ufWoLTp6t2qsqQNjFNeq5kbHRT727JyQkKDY2FgFBAQoJCREw4cP1759+664/xNPPCGTyaS33nqrqnMCAOD2Ms7m64Uvd2nAXxO1ZJP1bMctbRrr8yd6a8mEOMKjjF1nPpKSkjRx4kTFxsaqpKREL730kgYPHqw9e/aofv365fZdvny5Nm7cqPDwcIcODACAuzlyJl+z16Zq6bZjKrFYz3TcGtNEU+NjdFPLYBdP537sio9vv/223OWFCxcqJCREW7duVd++fW3bjx07pkmTJum7777TnXfe6ZhJAQBwM4dO52n22jQt235MpZdEx7SBMerRgui4kiq95yM7O1uSFBz82z+wxWLR6NGj9eyzz6pTp07XvI/CwkIVFhbaLpvN5qqMBABAtUs/nafZa9K0fMdv0dGvbVNNiY9RjxaNXDyd+6t0fBiGoenTp6tPnz7q3Lmzbfsbb7whX19fTZky5bruJyEhQa+++mplxwAAwGkOnsq1RUdZc2hAO2t0dIsiOq5XpeNj0qRJ2rVrl9avX2/btnXrVs2cOVPbtm277p9ZnjFjhqZPn267bDabFRkZWdmxAABwuLSsXM1ek6qVO4/bouO29iGaEh+jGyMbunQ2T1Sp+Jg8ebJWrlyp5ORkRURE2LavW7dOWVlZioqKsm0rLS3VM888o7feekuHDh267L78/f3l7+9fmTEAAKhWaVk5entNmlbuPC6jLDoGdrBGxw0RDV06myezKz4Mw9DkyZO1bNkyJSYmKjo6utz1o0eP1sCBA8ttGzJkiEaPHq1x48ZVfVoAAJwg9WSOZq1J01e7fouOQR1DNTU+Rp2bB7l2OC9gV3xMnDhRixcv1ooVKxQQEKDMzExJUlBQkOrWravGjRurcePyP8Ncu3ZthYWFqV27do6bGgCAarAvM0ez1qTq3z+fsEXH4I6hmkJ0OJRd8TFnzhxJUv/+/cttX7hwocaOHeuomQAAcKpfM816e3Wavv75hG3b7Z3CNDm+jTqFEx2OZvfLLvaq6H0eAAC4g70nzJq1OlXf/JJp23ZHlzBNvi1GHZoFunAy78bfdgEA1Di7j2dr1upUfbf7pCTJZJLu6NxMk+PbqH0Y0VHdiA8AQI3xyzFrdHy/57fouLNLM02Jj1Hb0AAXT1dzEB8AAK/389FszVydqh/2/hYdw24I1+Tb2iiG6HA64gMA4LV2HT2vmT+kavWvWZIkH5M0rKs1OtqEEB2uQnwAALzOzozzmrk6VWsuiY57bmyuSbe1UeumDVw8HYgPAIDX2H7knGauTlXivlOSrNExvFtzTRrQRq2IDrdBfAAAPN7Ww9boSN5vjY5aPiYNLzvTEd2kvounw+8RHwAAj7X18Fm99UOq1qWelmSNjnu7NdfEAW3UkuhwW8QHAMDjbD50VjN/SNX6NGt0+PqYdG93a3S0aEx0uDviAwDgMTYePKOZq1O14cAZSdbouK9HhCYOaKPI4Houng7Xi/gAALi9lINnNPOHVP108LfouP+mSD3VvzXR4YGIDwCAWzIMQz+VRcfG9LOSpNq1fouOiEZEh6ciPgAAbsUwDP104Ize+iFVmw5Zo8Ovlo9GxEboyf5t1LxhXRdPiKoiPgAAbsEwDP2YdkYzV+/X5kPnJFmj44HYSD3Zv7XCiQ6vQXwAAFzKMAytSz2tmatTtfVwWXT4+mhkbKT+0L+1mgURHd6G+AAAuIRhGEpOPa23ftiv7UfOS7JGx6ieUXqyf2uFBtZx7YCoNsQHAMCpDMNQ4v5TmvlDqnZknJck+fv6aFSvKP2hH9FRExAfAACnMAxDa/dlaebqNO0si446tX30UK8WeqJvK4UQHTUG8QEAqFaGYWjNr1mauTpVu45mS7JGx+i4FprQt7WaBvi7eEI4G/EBAKgWhmHoh71ZmrU6VT8fs0ZH3dq1NLp3Cz1+ayuiowYjPgAADmUYhr7fc1KzVqdq93GzJKme32/R0aQB0VHTER8AAIewWKzRMXN1qvaesEZHfb9aeuTmlnr81lYKru/n4gnhLogPAECVWCyGvtudqZmrU/VrZo4ka3SMubmlHiM6UAHiAwBQKRaLoW9+ydTba36Ljgb+vhp7c0uN7xOtRkQHroD4AADYxWIx9O9fTmjW6lTtP5krSQrw99W4W1rq0T7RaliP6MDVER8AgOtSajH09c8n9PbqVKVmlUVHHV+NuyVa42+JVlC92i6eEJ6C+AAAXFWpxdBXu47r7TVpSiuLjsA6vnq0T7TG3RKtoLpEB+xDfAAAKlRqMfSvncc1a02qDp7Kk2SNjsdubaWxt7RUYB2iA5VDfAAAyikptWjlzuOavSZNB09boyOobm091idaY4gOOADxAQCQZI2O5TuO6521aUovi46G9Wrr8Vtb6ZHeLRRAdMBBiA8AqOFKSi1atv2YZq9N0+Ez+ZKkRvVq67FbW2nMzS3VwJ+nCjgWX1EAUEMVl1q0bJs1Oo6ctUZHcH0/25mO+kQHqglfWQBQwxSXWvTl1qN6JzFNGWcvSJIa1/fThL6t9HAc0YHqx1cYANQQRSUWfbntqGavSdOx89boaNLgt+io58dTApzDx56dExISFBsbq4CAAIWEhGj48OHat2+f7fri4mI9//zz6tKli+rXr6/w8HA98sgjOn78uMMHBwBcn6ISiz7ZeFgD/pqoGUt/1rHzF9Skgb/++84OWvfcbZrQtzXhAaey66stKSlJEydOVGxsrEpKSvTSSy9p8ODB2rNnj+rXr6/8/Hxt27ZNL7/8srp27apz585p2rRpuvvuu7Vly5bqWgMAoAKFJaX6fMtRzVmbpuPZBZKkpgH++kO/1hrVM0p1/Wq5eELUVCbDMIzK3vjUqVMKCQlRUlKS+vbtW+E+mzdvVs+ePXX48GFFRUVd8z7NZrOCgoKUnZ2twMDAyo4GADVWYUmpPt+coXcTD+hEWXSEXIyOXlGqU5vogOPZ8/xdpfNs2dnZkqTg4OCr7mMymdSwYcMKry8sLFRhYaHtstlsrspIAFBjFRSX6rPNGZqTeECZZmt0hAb668l+rfVgT6ID7qPS8WEYhqZPn64+ffqoc+fOFe5TUFCgF154QaNGjbpiBSUkJOjVV1+t7BgAUOMVFJdqyaYj+kfSAZ00W/8zFxZYR08NaK0RN0USHXA7lX7ZZeLEifr666+1fv16RUREXHZ9cXGx7r//fh05ckSJiYlXjI+KznxERkbysgsAXENBcakWb7RGR1aO9ftos6A6eqp/a42IjZS/L9EB56n2l10mT56slStXKjk5+YrhMWLECKWnp2vNmjVXHcLf31/+/v6VGQMAaqQLRaX6ZONhvZd8UKfKoiM8qI6eGtBG998UQXTA7dkVH4ZhaPLkyVq2bJkSExMVHR192T4XwyM1NVVr165V48aNHTYsANRk+UUl+iTliN5LPqjTudboaN6wriYOaKP7ekTIz9eu354AuIxd8TFx4kQtXrxYK1asUEBAgDIzMyVJQUFBqlu3rkpKSnTfffdp27Zt+uqrr1RaWmrbJzg4WH5+fo5fAQB4ufyiEn2cclhzkw/qdG6RJCmikTU6/rM70QHPY9d7PkwmU4XbFy5cqLFjx+rQoUMVng2RpLVr16p///7X/Bz8qC0AWOUVluijlMOal3xQZ/Ks0REZXFeTBrTRvd0jVLsW0QH3UW3v+bhWp7Rs2fKa+wAAri63sEQf/nRI769L19my6IgKrqdJt7XRf3RrTnTA4/H7dAHATeQWluiDDYf0/rqDOpdfLElq0bieJg1oo+FEB7wI8QEALpZTUGyNjvXpOl8WHdFN6mvSgDa658Zw+RId8DLEBwC4iLmgWIt+PKT569OVfcEaHa2a1Nfk+DYadgPRAe9FfACAk2VfuBgdB2UuKJEktWpaX1Nui9GwruGq5VPxm/sBb0F8AICTZF8o1oL16VrwY7pyyqKjTUgDTb6tje66gehAzUF8AEA1y84v1vwf07XwkuiICWmgKfExuqNLM6IDNQ7xAQDV5Hx+keavT9eiHw8pp9AaHW1Dy6KjczP5EB2ooYgPAHCwc3lFen/9QX2w4bByy6KjfViApsTH6PZOYUQHajziAwAc5Gxekd5fd1AfbDikvKJSSdbomDYwRoM7Eh3ARcQHAFTRmdxCzVuXrg9/OqT8sujo2CxQU+JjNLhjKNEB/A7xAQCVdDq3UPOSD+qjlMO26OgUHqip8TEa1DH0in8PC6jpiA8AsNOpnELNW3dQH/10WBeKrdHRuXmgpsW3VXyHEKIDuAbiAwCuU1ZOgeYmHdTHGw+roNgiSbohIkhT42N0W3uiA7hexAcAXEOWuUD/SDqoTzYeVmGJNTq6RjbUtPgY9W/XlOgA7ER8AMAVnDQX6B9JB7R44xFbdNwY2VDTBsaoX1uiA6gs4gMAficzuyw6Nh1RUVl0dI9qqKkD26pvTBOiA6gi4gMAypzIvqA5iQf06eYMW3Tc1KKRpg6MUZ82RAfgKMQHgBrv+HlrdHy2OUNFpdboiG3ZSNMGttXNrRsTHYCDER8Aaqxj5y/o3bVp+nxLhopLDUlSz+hgTYuPUW+iA6g2xAeAGufouXy9m3hAX1wSHb2igzVtYFv1bt3YxdMB3o/4AFBjZJzN17uJafrn1qO26OjdqrGmDoxRXCuiA3AW4gOA1ztyJl/vrE3Tl9uOqsRijY5b2jTW1Pi26hkd7OLpgJqH+ADgtY6cydfstan6ctsxlZZFR582TTR1YIxiWxIdgKsQHwC8zqHTeZq9Nk3Ltv8WHbfGNNG0gTHq0YLoAFyN+ADgNdJP5+ntNalaseO4LTr6tW2qKfEx6tGikYunA3AR8QHA4x08lavZa9K0fMcxlTWH+rdrqqnxMeoWRXQA7ob4AOCx0rJyNXtNqlbuPG6Ljtvah2hKfIxujGzo0tkAXBnxAcDjpGXlaNbqNP1r13EZZdExsIM1Om6IaOjS2QBcG/EBwGOknszRrDVp+qpcdIRqanyMukQEuXY4ANeN+ADg9vZl5mjWmlT9++cTtugY3DFUU+Jj1Lk50QF4GuIDgNv6NdOsWatT9e+fM23bbu8UpsnxbdQpnOgAPBXxAcDt7D1hjY5vfvktOoZ2DtOU+Bh1aBbowskAOALxAcBt7D6erVmrU/Xd7pOSJJNJuqNzM02Ob6P2YUQH4C187Nk5ISFBsbGxCggIUEhIiIYPH659+/aV28cwDL3yyisKDw9X3bp11b9/f+3evduhQwPwLr8cy9bjH27RnbPW67vdJ2UySXfd0EzfTeurdx7qTngAXsau+EhKStLEiROVkpKiVatWqaSkRIMHD1ZeXp5tnz//+c968803NXv2bG3evFlhYWEaNGiQcnJyHD48AM/289FsPfbBFt319nqt2mONjmFdw/X9tL6aPaq72oYGuHpEANXAZBgX3ztuv1OnTikkJERJSUnq27evDMNQeHi4pk2bpueff16SVFhYqNDQUL3xxht64oknrnmfZrNZQUFBys7OVmAg/9sBvNGuo+c184dUrf41S5LkUxYdk29rozYhBAfgiex5/q7Sez6ys7MlScHB1j/UlJ6erszMTA0ePNi2j7+/v/r166cNGzZUGB+FhYUqLCwsNzwA75RxNl9/XLlbay6JjntubK5Jt7VR66YNXDwdAGepdHwYhqHp06erT58+6ty5syQpM9P6zvTQ0NBy+4aGhurw4cMV3k9CQoJeffXVyo4BwEOkn87TyLkpyjQXyMckDS+LjlZEB1DjVDo+Jk2apF27dmn9+vWXXWcymcpdNgzjsm0XzZgxQ9OnT7ddNpvNioyMrOxYANzQwVO5GjkvRSfNhYoJaaD3RvcgOoAarFLxMXnyZK1cuVLJycmKiIiwbQ8LC5NkPQPSrFkz2/asrKzLzoZc5O/vL39//8qMAcADHDiVq5FzU5SVU6i2oQ20+PE4NWnAMQ/UZHb9tIthGJo0aZKWLl2qNWvWKDo6utz10dHRCgsL06pVq2zbioqKlJSUpJtvvtkxEwPwGGlZv4VHu9AAwgOAJDvPfEycOFGLFy/WihUrFBAQYHuPR1BQkOrWrSuTyaRp06bptddeU0xMjGJiYvTaa6+pXr16GjVqVLUsAIB7SsuyvtRyKqdQ7cMC9MljvdSY8AAgO+Njzpw5kqT+/fuX275w4UKNHTtWkvTcc8/pwoULeuqpp3Tu3Dn16tVL33//vQIC+PE5oKZIy8rRg3M36nSuNTwWPx6n4Pp+rh4LgJuo0u/5qA78ng/As6WezNHIeSk6nVukDs0C9cljvQgPoAZw2u/5AIBL7T+Zo5FzU3Qmr0gdy8KjEeEB4HeIDwAOsS8zR6PmWcOjU7g1PBrWIzwAXI74AFBlv2aaNWreRp3NK1Ln5oH6eDzhAeDKiA8AVbL3hFmj5qXoXH6xujQP0sfjeymoXm1XjwXAjREfACptz3GzHnrfGh43RATpo/G9FFSX8ABwdXb9kjEAuGj38WyNKguProQHADtw5gOA3X45lq2H3t+o7AvFujGyoT4c31OBdQgPANeHMx8A7HJpeHSLIjwA2I8zHwCu289Hs/XQ+ykyF5Soe1RDffBoTwUQHgDsRHwAuC67jp7Xw+9vlLmgRD1aNNKicbGEB4BKIT4AXNPOjPN6eP5G5RSU6KYWjbTo0Z5q4M+3DwCVw3cPAFe1/cg5PTJ/k3IKSxTbspEWjiM8AFQNbzgFcEXbLgmPni2DtYjwAOAAfBcBUKGth89pzIJNyi0sUc/oYC0cG6v6hAcAB+A7CYDLbD18VmMWbFZuYYniWgVrwdhY1fPj2wUAx+C7CYBythw6qzELNimvqFS9WzXW/LE3ER4AHIrvKABsNh86q7Fl4XFz68aaPyZWdf1quXosAF6G+AAgSdqUflZjF25SflGpbmnTWO8/QngAqB7EBwBtPHhG4xZtVn5RqW6NaaJ5j9ykOrUJDwDVg/gAariUg2c0buFmXSgmPAA4B/EB1GAbDpzW+EVbdKG4VH3bNtXc0T0IDwDVjvgAaqgNaaf16AebVVBsUb+2TfUe4QHASfgNp0AN9OMl4TGgHeEBwLk48wHUMOtTT2v8B5tVWGLRbe1DNOfh7vL3JTwAOA9nPoAaJHn/KVt4xBMeAFyE+ABqiKT9p/TYh1tUWGLRwA4hepfwAOAivOwC1ACJ+7I04aOtKiqxaFDHUL0zqrv8fPm/BwDX4LsP4OXW7svShA+t4TGY8ADgBjjzAXixtb9m6YmPtqqo1KIhnUI1e1R31a5FeABwLb4LAV5q9d6TtvAY2jmM8ADgNjjzAXihH/ac1JOfbFVxqaE7uoRp5oPdCA8AboPvRoCXWXVJeNzZpRnhAcDtcOYD8CLf7c7UpMXbVFxq6K4bmumtB26UL+EBwM0QH4CX+PYXa3iUWAwN6xquv4/oSngAcEt2f2dKTk7WsGHDFB4eLpPJpOXLl5e7Pjc3V5MmTVJERITq1q2rDh06aM6cOY6aF0AFvv3lhC087rmR8ADg3uz+7pSXl6euXbtq9uzZFV7/9NNP69tvv9XHH3+svXv36umnn9bkyZO1YsWKKg8L4HLf/HxCExdvV4nF0PAbw/W3+wkPAO7N7pddhg4dqqFDh17x+p9++kljxoxR//79JUkTJkzQe++9py1btuiee+6p9KAALvf1rhOa8ul2lVoM3dutuf5yf1fV8jG5eiwAuCqH//eoT58+WrlypY4dOybDMLR27Vrt379fQ4YMqXD/wsJCmc3mch8Aru2rXcd/C4/uhAcAz+Hw+Jg1a5Y6duyoiIgI+fn56fbbb9e7776rPn36VLh/QkKCgoKCbB+RkZGOHgnwOv/aeVxTP92hUouh/+weob/cR3gA8BzVEh8pKSlauXKltm7dqr/97W966qmn9MMPP1S4/4wZM5SdnW37yMjIcPRIgFdZseOYppad8bi/R4T+fN8NhAcAj+LQH7W9cOGCXnzxRS1btkx33nmnJOmGG27Qjh079Ne//lUDBw687Db+/v7y9/d35BiA11qx45ie/myHLIY04qYIvX7vDfIhPAB4GIee+SguLlZxcbF8fMrfba1atWSxWBz5qYAaZ9n2o7bweDA2kvAA4LHsPvORm5urtLQ02+X09HTt2LFDwcHBioqKUr9+/fTss8+qbt26atGihZKSkvThhx/qzTffdOjgQE2ydNtR/dcXO2UxpJE9I/V/w7sQHgA8lskwDMOeGyQmJmrAgAGXbR8zZowWLVqkzMxMzZgxQ99//73Onj2rFi1aaMKECXr66adlMl37m6XZbFZQUJCys7MVGBhoz2iAV/rn1qN69p87ZRjSqF5R+t97OhMeANyOPc/fdsdHdSM+gN98sSVDz325S4YhPdQrSv+P8ADgpux5/uZvuwBu6vMtGXq+LDxGx7XQn+7pdF1nDwHA3REfgBv6bPMRvbD0ZxmG9EjvFnr1bsIDgPcgPgA38+kma3hI0tibW+qPwzoSHgC8CvEBuJHFG4/oxWXW8Bh3S0v9z12EBwDvQ3wAbuKTjYf10rJfJEmP3hKtl+/qQHgA8ErEB+AGPko5rJeXW8NjfJ9o/fedhAcA70V8AC720U+H9PKK3ZKkx2+N1ot3EB4AvBvxAbjQBxsO6Y8rreHxRN9WemFoe8IDgNcjPgAXWfRjul751x5J0hP9WumF2wkPADUD8QG4wIL16frTV9bweLJ/az03pB3hAaDGID4AJ3t/3UH979d7JUkTB7TWfw0mPADULMQH4ESXhsekAW30zOC2hAeAGof4AJxkXvJB/d+/reEx5bY2enoQ4QGgZiI+ACd4L+mAEr75VZI0NT5GTw9q6+KJAMB1iA+gms1JPKA3vrWGx7SBMZo2kPAAULMRH0A1ejcxTX/+dp8k6emBbTV1YIyLJwIA1yM+gGryzto0/eU7a3g8M6itJscTHgAgER9AtXh7dar+tmq/JOm/BrfVpNsIDwC4iPgAHGzW6lS9WRYezw5pp4kD2rh4IgBwL8QH4EBv/bBfb/2QKkl67vZ2eqo/4QEAv0d8AA7y91X7NXO1NTxeGNpef+jX2sUTAYB7Ij6AKjIMQ3//IVWzysLjxTvaa0JfwgMAroT4AKrAMAy9uWq/3l6TJkl66Y4OerxvKxdPBQDujfgAKskwDP31+316Z+0BSdJ/39lBj91KeADAtRAfQCUYhqG/fLdP7yZaw+PluzpqfJ9oF08FAJ6B+ADsZBiG3vh2n/6RZA2PPw7rqHG3EB4AcL2ID8AOhmHo9W9+1XvJByVJr97dSWNubunaoQDAwxAfwHUyDEMJ3/yquWXh8ad7OumR3i1dOxQAeCDiA7gOhmHo/77eq/fXp0uS/t89nTSa8ACASiE+gGswDEP/76u9WvCjNTz+d3hnPRzXwsVTAYDnIj6AqzAMQ3/6ao8W/nhIkvTaf3TRqF5Rrh0KADwc8QFcgWEYevVfe7RowyFJUsK9XTSyJ+EBAFVFfAAVMAxDr6zcrQ9+OiyTSXr93i56IJbwAABHID6A3zEMQ/+zYrc+SrGGxxv33qARsZGuHgsAvIaPvTdITk7WsGHDFB4eLpPJpOXLl1+2z969e3X33XcrKChIAQEBiouL05EjRxwxL1CtLBZDL6/45bfw+E/CAwAcze74yMvLU9euXTV79uwKrz9w4ID69Omj9u3bKzExUTt37tTLL7+sOnXqVHlYoDpZLIb+e8Uv+jjliEwm6S/3ddWImwgPAHA0k2EYRqVvbDJp2bJlGj58uG3bgw8+qNq1a+ujjz6q1H2azWYFBQUpOztbgYGBlR0NsIvFYuil5b9oySZrePz1vq76zx4Rrh4LADyGPc/fdp/5uBqLxaKvv/5abdu21ZAhQxQSEqJevXpV+NLMRYWFhTKbzeU+AGeyWAy9uOxnLdl0RD4m6c0RhAcAVCeHxkdWVpZyc3P1+uuv6/bbb9f333+v//iP/9C9996rpKSkCm+TkJCgoKAg20dkJKe54TwWi6EZS3/Wp5szysLjRv1HN8IDAKqTQ192OX78uJo3b66RI0dq8eLFtv3uvvtu1a9fX0uWLLnsPgoLC1VYWGi7bDabFRkZycsuqHYWi6Hnv9ylL7YelY9J+vsDN+qeG5u7eiwA8Ej2vOzi0B+1bdKkiXx9fdWxY8dy2zt06KD169dXeBt/f3/5+/s7cgzgmkrLwuOfZeHx1oPddHfXcFePBQA1gkPjw8/PT7Gxsdq3b1+57fv371eLFvwtDLiHUouhZ/+5U0u3HVMtH5PeeuBGDSM8AMBp7I6P3NxcpaWl2S6np6drx44dCg4OVlRUlJ599lk98MAD6tu3rwYMGKBvv/1W//rXv5SYmOjIuYFKKbUYevaLnVq63Roesx7spjtvaObqsQCgRrH7PR+JiYkaMGDAZdvHjBmjRYsWSZIWLFighIQEHT16VO3atdOrr76qe+6557runx+1RXUptRh65vMdWr7juGr5mPT2yG66owvhAQCOYM/zd5XecFodiA9Uh5JSi575YqdW7Dgu37LwGEp4AIDDuOwNp4A7Kim1aPrnO7VypzU8Zo/qrts7h7l6LACosYgPeLWSUoumfbZDX+06IV8fk955qLuGdCI8AMCViA94rZJSi6Z+tkNf7zqh2rVMemdUdw0mPADA5YgPeKXiUoumfbpDX/9sDY85D/XQwI6hrh4LACDiA16ouNSiKUu265tfMuVXy0dzHu6u+A6EBwC4C+IDXqW41KLJi7fr293W8PjH6O66rT3hAQDuhPiA1ygqsWjykm36bvdJ+dXy0Xuje2hA+xBXjwUA+B3iA16hqMSiiYu3adWek/Lz9dHc0T3Uvx3hAQDuiPiAxysqseipT7bph73W8Jj3yE3q17apq8cCAFwB8QGPVlhSqomfbNMPe7PkXxYefQkPAHBrxAc8VmFJqZ78eJvW/GoNj/fH3KRbYwgPAHB3xAc8UkFxqZ78eKvW7julOrV9NH9MrG5p08TVYwEArgPxAY9TUFyqP3y8VYll4bFgTKxuJjwAwGMQH/AoBcWlmvDRViXvLwuPsbG6uTXhAQCehPiAxygoLtXjH27RutTTqlu7lhaMjVXv1o1dPRYAwE7EBzzC78Nj4bhYxbUiPADAExEfcHsXiqzhsT7ttOr51dLCsbHqRXgAgMciPuDWLhSVavwHm7XhwBnV96ulRY/2VGzLYFePBQCoAuIDbiu/qETjF23RTwet4fHBoz11E+EBAB6P+IBbyi8q0aOLNivl4Fk18PfVB4/GqkcLwgMAvAHxAbeTX1SicQs3a2P6xfDoqR4tGrl6LACAgxAfcCt5hSUat2izNqWfVYC/rz4Y31PdowgPAPAmxAfcRm5hicYt3KTNh84pwN9XH47vqW6EBwB4HeIDbiG3sERjF2zSlsPnFFDHVx+N76UbIxu6eiwAQDUgPuByOQXFGrtws7aWhcfH43upK+EBAF6L+IBL5RQUa8yCTdp25LwC6/jq48d66YaIhq4eCwBQjYgPuIy5LDy2HzmvoLq19cljvdS5eZCrxwIAVDPiAy5hLijWI/M3aUcG4QEANQ3xAafLvlCsRxZs0s6M82pYr7Y+Hk94AEBNQnzAqbIvFOuR+Ru182i2GtWrrU8ei1PH8EBXjwUAcCLiA06TnV+s0Qs2ahfhAQA1GvEBpzifX6SH52/UL8fMCq7vp08e66UOzQgPAKiJiA9Uu/P5RXro/Y3afdysxvX9tPjxOLULC3D1WAAAFyE+UK3O5VnDY88JwgMAYOVj7w2Sk5M1bNgwhYeHy2Qyafny5Vfc94knnpDJZNJbb71VhRHhqc7mFWlUWXg0aeCnJRMIDwBAJeIjLy9PXbt21ezZs6+63/Lly7Vx40aFh4dXejh4rrN5RRo1L0V7T5jVpIG/ljwep7ahhAcAoBIvuwwdOlRDhw696j7Hjh3TpEmT9N133+nOO++s9HDwTGdyC/XQ+xv1a2aOmjTw16cTeqlNCOEBALBy+Hs+LBaLRo8erWeffVadOnW65v6FhYUqLCy0XTabzY4eCU50OrdQD83bqH0nc9Q0wHrGo01IA1ePBQBwI3a/7HItb7zxhnx9fTVlypTr2j8hIUFBQUG2j8jISEePBCc5nVuoUfNStO9kjkIC/PXpBMIDAHA5h8bH1q1bNXPmTC1atEgmk+m6bjNjxgxlZ2fbPjIyMhw5EpzkVE6hRs5N0f6TuQoNtIZH66aEBwDgcg6Nj3Xr1ikrK0tRUVHy9fWVr6+vDh8+rGeeeUYtW7as8Db+/v4KDAws9wHPkpVToJHzUpSalauwwDr6dEJvtSI8AABX4ND3fIwePVoDBw4st23IkCEaPXq0xo0b58hPBTeRlVOgkXNTdOBUnpoF1dGSx+PUskl9V48FAHBjdsdHbm6u0tLSbJfT09O1Y8cOBQcHKyoqSo0bNy63f+3atRUWFqZ27dpVfVq4lSyz9YzHxfD4dEKcWjQmPAAAV2d3fGzZskUDBgywXZ4+fbokacyYMVq0aJHDBoN7O2m2nvE4eDpP4UF1tITwAABcJ7vjo3///jIM47r3P3TokL2fAm7u0vBo3rCuljwep6jG9Vw9FgDAQ/C3XWCXzGzrSy3pZeHx6YQ4RQYTHgCA60d84LqdyL6gkXNTdOhMPuEBAKg04gPX5fj5Cxo5L0WHz+QropE1PCIaER4AAPsRH7imY+etZzyOnM1XZHBdfTqht5o3rOvqsQAAHor4wFUdPZevkfNSlHH2gqKC62nJhDjCAwBQJcQHrujouXw9ODdFR89dUIvG9bTk8TiFEx4AgCoiPlChjLPWMx5Hz11Qy8bWMx7NgggPAEDVER+4TMZZ6xmPY+cvKLpJfS15PE5hQXVcPRYAwEs49A/LwfMdOfNbeLQiPAAA1YAzH7CxhsdPOp5dYA2PCXEKDSQ8AACORXxAknT4TJ4enJuiE9kFatW0vj59PE4hhAcAoBoQH9Ch09bwyDQXqHVT6xmPkADCAwBQPYiPGi79dJ5GloVHm5AGWvJ4nJoG+Lt6LACAFyM+arCDp3I1cl6KTpoLFRPSQIsJDwCAExAfNdSBU7kaOTdFWTmFahtqDY8mDQgPAED1Iz5qoLSsXI2aZw2PdqEBWvx4LzUmPAAATkJ81DBpWTkaOW+jTuUUqn1YgD55jPAAADgX8VGDpJ60hsfpXGt4LH48TsH1/Vw9FgCghiE+aghreKTodG6ROjQL1OLHeqkR4QEAcAF+vXoNsC8zRw/OtYZHR8IDAOBinPnwcvsyczRqXorO5BWpU3igPnmslxrWIzwAAK5DfHixXzPNGjVvo87mFalz80B9PJ7wAAC4HvHhpfYcN+uh91N0Lr9YXZoH6ePxvRRUr7arxwIAgPd8eKNLw6NrRJA+fozwAAC4D858eJndx7P10PsbdT6/WF0jG+rDR3sqqC7hAQBwH8SHF/nlmDU8si8U68bIhvpwfE8F1iE8AADuhZddvMSl4dEtivAAALgvznx4gZ+PZuuh91NkLihR96iG+uDRngogPAAAbor48HA7M85r9PyNMheUqEeLRlo0LpbwAAC4NeLDg+0oC4+cghLd1KKRFj3aUw38eUgBAO6NZyoPtf3IOT0yf5NyCksU27KRFo4jPAAAnoE3nHqgbZeER8+WwVpEeAAAPAjPWB5m6+FzGrNgk3ILS9QrOlgLxsaqPuEBAPAgPGt5kK2Hz2rMgs3KLSxRXCtreNTz4yEEAHgWu192SU5O1rBhwxQeHi6TyaTly5fbrisuLtbzzz+vLl26qH79+goPD9cjjzyi48ePO3LmGmnLobN6ZL71jEfvVo0JDwCAx7I7PvLy8tS1a1fNnj37suvy8/O1bds2vfzyy9q2bZuWLl2q/fv36+6773bIsDXV5kNnNWbBJuUVlerm1oQHAMCzmQzDMCp9Y5NJy5Yt0/Dhw6+4z+bNm9WzZ08dPnxYUVFR17xPs9msoKAgZWdnKzAwsLKjeY1N6Wc1duEm5ReVqk+bJpr3yE2q61fL1WMBAFCOPc/f1f7f5+zsbJlMJjVs2LDC6wsLC1VYWGi7bDabq3skj7Hx4BmNW7RZ+UWlujXGGh51ahMeAADPVq0/altQUKAXXnhBo0aNumIFJSQkKCgoyPYRGRlZnSN5jJSDZzR2IeEBAPA+1RYfxcXFevDBB2WxWPTuu+9ecb8ZM2YoOzvb9pGRkVFdI3mMDQdOa9zCzbpQXKq+bZsSHgAAr1ItL7sUFxdrxIgRSk9P15o1a6762o+/v7/8/f2rYwyPtCHttB79YLMKii3q17ap3hvdg/AAAHgVh8fHxfBITU3V2rVr1bhxY0d/Cq/1Y9ppjS8LjwHtmmrOw4QHAMD72B0fubm5SktLs11OT0/Xjh07FBwcrPDwcN13333atm2bvvrqK5WWliozM1OSFBwcLD8/P8dN7mXWp1rDo7DEotvah2jOw93l70t4AAC8j90/apuYmKgBAwZctn3MmDF65ZVXFB0dXeHt1q5dq/79+1/z/mvij9om7z+lxz/cosISi+Lbh+hdwgMA4GGq9Udt+/fvr6v1ShV+bUiNlFQWHkUlFg3sEKp3HupGeAAAvBq/JtOFEvdlacJHW1VUYtGgjqF6Z1R3+fnyh4YBAN6NZzoXWbsvSxM+tIbHYMIDAFCDcObDBdb+mqUnPtqqolKLbu8UprdHdVPtWoQHAKBm4BnPyVbvPWkLj6GdCQ8AQM3DmQ8n+mHPST35yVYVlxq6o0uYZj5IeAAAah6e+Zxk1SXhcecNzQgPAECNxbOfE3y3O1NPlYXHXTc008wHbiQ8AAA1Fi+7VLNvf8nUpMXbVGIxNKxruP4+oqt8CQ8AQA3Gs2A1+vaXE7bwuOdGwgMAAIkzH9Xm3z+f0OQl21VqMTT8xnD9bcSNquVjcvVYAAC4HP8NrwZf7/otPO7t1pzwAADgEpz5cLCvdh3X1E93WMOje3P95b6uhAcAAJfgzIcDrdz5W3jc1yOC8AAAoAKc+XCQFTuO6enPdshiSPf3iNDr/3kD4QEAQAWIDwe4NDweuClSCfd2kQ/hAQBAhXjZpYqWbT9qC48HYwkPAACuhTMfVbB021E988VOGYY0smek/m844QEAwLVw5qOS/rn1t/AY1SuK8AAA4DoRH5XwxZYMPftPa3g8HBel/72nM+EBAMB14mUXO32+OUPPL90lw5BGx7XQn+7pJJOJ8AAA4Hpx5sMOn20+YguPMb0JDwAAKoMzH9dpyaYjmrH0Z0nS2Jtb6o/DOhIeAABUAvFxHRZvPKIXl1nDY9wtLfU/dxEeAABUFvFxDZ9sPKyXlv0iSXr0lmi9fFcHwgMAgCogPq7io5TDenm5NTwe6xOtl+4kPAAAqCri4wo+/OmQ/mfFbknS47dG68U7CA8AAByB+KjABxsO6Y8rreHxRN9WemFoe8IDAAAHIT5+Z+GP6Xr1X3skSX/o11rP396O8AAAwIGIj0ssWJ+uP31lDY8n+7fWc0MIDwAAHI34KPP+uoP636/3SpImDmit/xpMeAAAUB2ID5UPj8m3tdH0QW0JDwAAqkmNj4+5yQf02r9/lSRNua2NniY8AACoVjU6Pt5LOqCEb6zhMTU+Rk8PauviiQAA8H52/2G55ORkDRs2TOHh4TKZTFq+fHm56w3D0CuvvKLw8HDVrVtX/fv31+7dux01r8PMSfwtPKYNJDwAAHAWu+MjLy9PXbt21ezZsyu8/s9//rPefPNNzZ49W5s3b1ZYWJgGDRqknJycKg/rKO+sTdMb31rD4+mBbTVtIOEBAICz2P2yy9ChQzV06NAKrzMMQ2+99ZZeeukl3XvvvZKkDz74QKGhoVq8eLGeeOKJqk3rAO+sTdNfvtsnSXpmUFtNjo9x8UQAANQsdp/5uJr09HRlZmZq8ODBtm3+/v7q16+fNmzYUOFtCgsLZTaby31Ul7dXp9rC49kh7QgPAABcwKHxkZmZKUkKDQ0ttz00NNR23e8lJCQoKCjI9hEZGenIkWx2ZJzX31btl2QNj4kD2lTL5wEAAFfn0Pi46Pc/qmoYxhV/fHXGjBnKzs62fWRkZFTHSLoxsqFevqujnr+9PeEBAIALOfRHbcPCwiRZz4A0a9bMtj0rK+uysyEX+fv7y9/f35FjXNH4PtFO+TwAAODKHHrmIzo6WmFhYVq1apVtW1FRkZKSknTzzTc78lMBAAAPZfeZj9zcXKWlpdkup6ena8eOHQoODlZUVJSmTZum1157TTExMYqJidFrr72mevXqadSoUQ4dHAAAeCa742PLli0aMGCA7fL06dMlSWPGjNGiRYv03HPP6cKFC3rqqad07tw59erVS99//70CAgIcNzUAAPBYJsMwDFcPcSmz2aygoCBlZ2crMDDQ1eMAAIDrYM/zd7X8tAsAAMCVEB8AAMCpiA8AAOBUxAcAAHAq4gMAADgV8QEAAJyK+AAAAE5FfAAAAKciPgAAgFM59K/aOsLFX7hqNptdPAkAALheF5+3r+cXp7tdfOTk5EiSIiMjXTwJAACwV05OjoKCgq66j9v9bReLxaLjx48rICBAJpPJofdtNpsVGRmpjIwMr/y7Md6+Psn718j6PJ+3r9Hb1yd5/xqra32GYSgnJ0fh4eHy8bn6uzrc7syHj4+PIiIiqvVzBAYGeuUX1EXevj7J+9fI+jyft6/R29cnef8aq2N91zrjcRFvOAUAAE5FfAAAAKeqUfHh7++vP/7xj/L393f1KNXC29cnef8aWZ/n8/Y1evv6JO9fozusz+3ecAoAALxbjTrzAQAAXI/4AAAATkV8AAAApyI+AACAU3l0fLz77ruKjo5WnTp11KNHD61bt+6q+yclJalHjx6qU6eOWrVqpX/84x+X7fPll1+qY8eO8vf3V8eOHbVs2bLqGv+62LPGpUuXatCgQWratKkCAwPVu3dvfffdd+X2WbRokUwm02UfBQUF1b2UCtmzvsTExApn//XXX8vt506PoT3rGzt2bIXr69Spk20fd3v8kpOTNWzYMIWHh8tkMmn58uXXvI0nHYf2rs/TjkF71+eJx6C9a/Sk4zAhIUGxsbEKCAhQSEiIhg8frn379l3zdu5wDHpsfHz22WeaNm2aXnrpJW3fvl233nqrhg4dqiNHjlS4f3p6uu644w7deuut2r59u1588UVNmTJFX375pW2fn376SQ888IBGjx6tnTt3avTo0RoxYoQ2btzorGWVY+8ak5OTNWjQIP373//W1q1bNWDAAA0bNkzbt28vt19gYKBOnDhR7qNOnTrOWFI59q7von379pWbPSYmxnadOz2G9q5v5syZ5daVkZGh4OBg3X///eX2c5fHT5Ly8vLUtWtXzZ49+7r297Tj0N71edoxaO/6LvKUY1Cyf42edBwmJSVp4sSJSklJ0apVq1RSUqLBgwcrLy/virdxm2PQ8FA9e/Y0/vCHP5Tb1r59e+OFF16ocP/nnnvOaN++fbltTzzxhBEXF2e7PGLECOP2228vt8+QIUOMBx980EFT28feNVakY8eOxquvvmq7vHDhQiMoKMhRI1aJvetbu3atIck4d+7cFe/TnR7Dqj5+y5YtM0wmk3Ho0CHbNnd6/H5PkrFs2bKr7uOJx+FF17O+irjzMXip61mfpx2Dv1eZx9CTjsOsrCxDkpGUlHTFfdzlGPTIMx9FRUXaunWrBg8eXG774MGDtWHDhgpv89NPP122/5AhQ7RlyxYVFxdfdZ8r3Wd1qswaf89isSgnJ0fBwcHltufm5qpFixaKiIjQXXfdddn/ypyhKuvr1q2bmjVrpvj4eK1du7bcde7yGDri8Zs/f74GDhyoFi1alNvuDo9fZXnacVhV7nwMVoUnHIOO4knHYXZ2tiRd9vV2KXc5Bj0yPk6fPq3S0lKFhoaW2x4aGqrMzMwKb5OZmVnh/iUlJTp9+vRV97nSfVanyqzx9/72t78pLy9PI0aMsG1r3769Fi1apJUrV2rJkiWqU6eObrnlFqWmpjp0/mupzPqaNWumuXPn6ssvv9TSpUvVrl07xcfHKzk52baPuzyGVX38Tpw4oW+++UaPPfZYue3u8vhVlqcdh1XlzsdgZXjSMegInnQcGoah6dOnq0+fPurcufMV93OXY9Dt/qqtPUwmU7nLhmFctu1a+/9+u733Wd0qO8+SJUv0yiuvaMWKFQoJCbFtj4uLU1xcnO3yLbfcou7du+vtt9/WrFmzHDf4dbJnfe3atVO7du1sl3v37q2MjAz99a9/Vd++fSt1n9WtsrMsWrRIDRs21PDhw8ttd7fHrzI88TisDE85Bu3hicdgVXjScThp0iTt2rVL69evv+a+7nAMeuSZjyZNmqhWrVqXVVhWVtZltXZRWFhYhfv7+vqqcePGV93nSvdZnSqzxos+++wzjR8/Xp9//rkGDhx41X19fHwUGxvr9GKvyvouFRcXV252d3kMq7I+wzC0YMECjR49Wn5+flfd11WPX2V52nFYWZ5wDDqKux6DVeVJx+HkyZO1cuVKrV27VhEREVfd112OQY+MDz8/P/Xo0UOrVq0qt33VqlW6+eabK7xN7969L9v/+++/10033aTatWtfdZ8r3Wd1qswaJev/tsaOHavFixfrzjvvvObnMQxDO3bsULNmzao8sz0qu77f2759e7nZ3eUxrMr6kpKSlJaWpvHjx1/z87jq8assTzsOK8NTjkFHcddjsKo84Tg0DEOTJk3S0qVLtWbNGkVHR1/zNm5zDDrsratO9umnnxq1a9c25s+fb+zZs8eYNm2aUb9+fds7kl944QVj9OjRtv0PHjxo1KtXz3j66aeNPXv2GPPnzzdq165t/POf/7Tt8+OPPxq1atUyXn/9dWPv3r3G66+/bvj6+hopKSlOX59h2L/GxYsXG76+vsY777xjnDhxwvZx/vx52z6vvPKK8e233xoHDhwwtm/fbowbN87w9fU1Nm7c6Pbr+/vf/24sW7bM2L9/v/HLL78YL7zwgiHJ+PLLL237uNNjaO/6Lnr44YeNXr16VXif7vT4GYZh5OTkGNu3bze2b99uSDLefPNNY/v27cbhw4cNw/D849De9XnaMWjv+jztGDQM+9d4kScch08++aQRFBRkJCYmlvt6y8/Pt+3jrsegx8aHYRjGO++8Y7Ro0cLw8/MzunfvXu7Hi8aMGWP069ev3P6JiYlGt27dDD8/P6Nly5bGnDlzLrvPL774wmjXrp1Ru3Zto3379uUOKlewZ439+vUzJF32MWbMGNs+06ZNM6Kiogw/Pz+jadOmxuDBg40NGzY4cUXl2bO+N954w2jdurVRp04do1GjRkafPn2Mr7/++rL7dKfH0N6v0fPnzxt169Y15s6dW+H9udvjd/FHL6/0Nefpx6G96/O0Y9De9XniMViZr1FPOQ4rWpckY+HChbZ93PUYNJUtAAAAwCk88j0fAADAcxEfAADAqYgPAADgVMQHAABwKuIDAAA4FfEBAACcivgAAABORXwAAACnIj4AAIBTER8AAMCpiA8AAOBUxAcAAHCq/w/tdykUVX0VhAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# create example image\n", "from matplotlib import pyplot as plt\n", "\n", "fig, ax = plt.subplots()\n", "ax.plot([0, 1, 2], [10, 20, 25])\n", "image_path = Path().cwd().joinpath(\"example_figure.png\")\n", "fig.savefig(image_path)" ] }, { "cell_type": "code", "execution_count": 4, "id": "6addb33e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/:\n", "====================\n", " |- Group: Experiment\n", " --------------------\n", " |- Group: Reports\n", " -----------------\n", " --> Dataset: example_figure\n", " .............................\n", " --> Dataset: example_text_file\n", " ................................\n", " |- Group: Standards\n", " -------------------\n", " --> Dataset: summary\n", " ......................\n", " |- Group: Surveys\n", " -----------------\n", " --> Dataset: channel_summary\n", " ..............................\n", " --> Dataset: fc_summary\n", " .........................\n", " --> Dataset: tf_summary\n", " .........................\n", "\u001b[1m2026-01-27T21:33:57.023085-0800 | INFO | mth5.mth5 | close_mth5 | line: 899 | Flushing and closing example.mth5\u001b[0m\n" ] } ], "source": [ "with MTH5() as m:\n", " m.open_mth5(\"example.mth5\", mode=\"a\")\n", " m.reports_group.add_report(\n", " report_name=\"example_figure\",\n", " report_metadata={ # supplying metadata is optional\n", " \"description\": \"An example figure saved as a PNG file\",\n", " },\n", " filename=image_path,\n", " )\n", " print(m)" ] }, { "cell_type": "markdown", "id": "97be65e5", "metadata": {}, "source": [ "## Retrieve Reports\n", "\n", "Now what if you want to get the report back. The data are stored as a binary array which is not very useful. So there is an option to write to a file in `get_report` that will write the array to the appropriate file. The `dataset` is also returned so if you don't want to write to a file, you can inspect the dataset." ] }, { "cell_type": "code", "execution_count": 6, "id": "b9d0723a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m2026-01-27T21:35:02.783678-0800 | INFO | mth5.groups.reports | get_report | line: 160 | Report extracted to c:\\Users\\peaco\\OneDrive\\Documents\\GitHub\\mth5\\docs\\examples\\notebooks\\example_report.txt\u001b[0m\n", "\u001b[1m2026-01-27T21:35:02.815284-0800 | INFO | mth5.groups.reports | get_report | line: 168 | Image report extracted to c:\\Users\\peaco\\OneDrive\\Documents\\GitHub\\mth5\\docs\\examples\\notebooks\\example_figure.png\u001b[0m\n", "\u001b[1m2026-01-27T21:35:02.821287-0800 | INFO | mth5.mth5 | close_mth5 | line: 899 | Flushing and closing example.mth5\u001b[0m\n" ] } ], "source": [ "with MTH5() as m:\n", " m.open_mth5(\"example.mth5\", mode=\"a\")\n", " text_ds = m.reports_group.get_report(\"example_text_file\", write=True)\n", " figure_ds = m.reports_group.get_report(\"example_figure\", write=True)" ] }, { "cell_type": "code", "execution_count": 7, "id": "a66c0a40", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Text file attributes:\n", "creation_time = 1769576723.3951802\n", "description = A simple report as a text file\n", "file_type = txt\n", "filename = example_report.txt\n", "\n", "Figure file attributes:\n", "creation_time = 1769577496.5228226\n", "description = An example figure saved as a PNG file\n", "file_type = png\n", "filename = example_figure.png\n", "\u001b[1m2026-01-27T21:35:08.819192-0800 | INFO | mth5.mth5 | close_mth5 | line: 899 | Flushing and closing example.mth5\u001b[0m\n" ] } ], "source": [ "with MTH5() as m:\n", " m.open_mth5(\"example.mth5\", mode=\"a\")\n", " text_ds = m.reports_group.get_report(\"example_text_file\", write=False)\n", " figure_ds = m.reports_group.get_report(\"example_figure\", write=False)\n", "\n", " print(\"Text file attributes:\")\n", " print(\"\\n\".join([f\"{k} = {v}\" for k, v in text_ds.attrs.items()]))\n", "\n", " print(\"\\nFigure file attributes:\")\n", " print(\"\\n\".join([f\"{k} = {v}\" for k, v in figure_ds.attrs.items()]))" ] }, { "cell_type": "code", "execution_count": null, "id": "2262049c", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "py311", "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.11.11" } }, "nbformat": 4, "nbformat_minor": 5 }