diff --git a/.gitignore b/.gitignore index bdcbb4f..9870c53 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,8 @@ dist .vscode .pytest_cache python -.env.test \ No newline at end of file +.env.test +test.py +test2.py +main.py +lamoom_venv/ diff --git a/docs/getting_started_notebook.ipynb b/docs/getting_started_notebook.ipynb index 770c291..199db6a 100644 --- a/docs/getting_started_notebook.ipynb +++ b/docs/getting_started_notebook.ipynb @@ -205,7 +205,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -331,12 +331,12 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, "outputs": [ { "data": { - "image/png": "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IbXGdtttJ0uWLAl9fP755zGNs2bNGhkxYoRkZWWZF/OMGTPkjjvuMCfMsfxu4duk+18dd9xxUY916623mjec++67z5zg6te33Xab3HvvvRKLP//5z2Z7/v3vf8u0adPMMaEBgQaRrTk2dZvuuecec3KrwYW+8R188MHmD260Y+n399prL/O7tqS5sUpLS+Wbb74xgah+1gBNTyw0SIjld9xmm23M86D7TY8zDZh1/61YsSLqsaxXX33VvEb1pD6W39HSYCD8mPvPf/4T01h6oqX7XgPGTz75RH744Qez/3Jzc6MeK3x79OOJJ54wf1T1pCvasS6++GJ599135dlnnzWvA70YoIHVG2+8EdVYehKjJ5hz586V119/Xb799ltzUUFfA429N0byPnrRRRfJuHHjzMmC3l8D9WOOOSamsfSY1efyiiuuaHQ/RDqWboN+/POf/5Tp06fLU089ZfbfGWecEdN27bLLLvLkk0+aff/ee++Z/aj30Qs90Y5l6YUDPR5i/R2tv/zlL/WOM30vimUsPZnUfa+3T5482byP6zGWnp4e1Vi9e/fe7Ni/9tprTcChJ9DRbpde/NH3LT3W9b1Hjy0NgPTYjWYs/axf6z7/6KOP5IsvvpDKykpz0aG2tjaqv/mRHvORjBXpMd/SWNEc85FuW6THfSRjRXrcRzpWJMd9JGNFety3NFbvKI77SLYr0uPeGdr+HG7Rp+XVV1+N23jLly83Y3766adxGa9Dhw6Bxx57LKaf3bBhQ2DrrbcOfPDBB4F999038Le//S2mca655prAjjvuGIiHyy67LLDXXnsFEkF/vwEDBgRqa2uj/tnDDjsscPrpp9e77ZhjjgmcdNJJUY9VWloayMjICLz55pv1bh86dGjg//7v/2I+NvX36t69e+D2228P3bZ27dpATk5O4D//+U9UY4WbN2+e+f63334b03Y1ZvLkyeZ+v/76a6vHWrdunbnfhx9+GNNYv/32W2CLLbYITJ8+PdC3b9/AXXfd1ew4TY116qmnBo488sgWfzaSsX7/+98HTj755LiM1ZBu4wEHHBDTWNttt13guuuui/q4bTjWrFmzzG26z62amppAly5dAo8++mjU76N6nGdlZQVefvnl0H1mzpxp7jNx4sSoxgr38ccfm++tWbOmxW1qaSzrpZdeCmRnZweqqqpaPdb3339v7vPL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UVxcbLI54be98MILMmjQIMnNzZWBAwfKAw88EPrZyspKOe+886RHjx7m+3379pWbb77ZfK9fv37m89FHH23GtF+3ZP78+eb+r7zyiuy///6Sn58vO+64o0ycODF0n19//VUOP/xw6dChgxQUFMh2220nb7/9tvlZ/Rml39NxTjvtNPP1u+++K3vttZe0b99eOnXqJL/73e9kzpw5UT2u+uKLL2S//fYz39fHOPjgg2XNmjXme7W1teb379+/v+Tl5Zmf/+9//9uKZwcA0FoEUgCApHvuuedMhurGG2+UmTNnyk033SRXXXWVPP300+b799xzj7zxxhvy0ksvmSyW3t8GTF9//bX5/OSTT5qsl/06Uv/3f/8nf//73+W7776TbbbZRk444QSprq423zv33HOloqJCJkyYINOmTZNbb73VZM569+4t//vf/8x9dHv0cf/1r3+Zr0tKSuTiiy+WKVOmyPjx4yU9Pd0EeRr8RPq4etuBBx4ogwcPNgHW559/bgK6mpoa830Nop555hl56KGH5Mcff5SLLrpITj75ZPn0009b+UwAAGIWAAAgwZ588slAcXFx6OsBAwYEnn/++Xr3uf766wPDhw83/z///PMDBxxwQKC2trbR8fTP16uvvtri44bfb968eebrxx57LPT9H3/80dw2c+ZM8/WQIUMCY8eObXSsjz/+2Nx3zZo1zT7mihUrzP2mTZsW8eOecMIJgREjRjQ6Xnl5eSA/Pz/w5Zdf1rv9jDPOMD8HAPAGGSkAQFJpBkdL38444wyT7bEfN9xwQ6gkTsvmNEuz7bbbygUXXCDvv/9+3B5/hx12CP1fSwfV8uXLzWd9LN2OESNGyDXXXCM//PBDi+PNnj3bZJe23HJLadeuXShztmDBgogf12akGvPLL79IaWmpjBw5st7+0gxVeAkhACC5aDYBAEiqjRs3ms+PPvqoDBs2rN73MjIyzOehQ4fKvHnz5J133pEPP/xQjj/+eDnooIPiMi8oKysr9H+du6RsGd6f//xnMzfprbfeMsGbltTdcccdcv755zc5npbg6Rwu/X169uxpxtp+++3NPK9IH1fnPbW0v3Sbtthii3rfy8nJiep3BwDEDxkpAEBSdevWzQQcc+fOla222qrehzZTsDS78/vf/94EKNr1T+corV69OhSU2PlD8abzoc466yzTHOKSSy4xj6+ys7PN5/DHXbVqlZkzdeWVV5qMkjbPsA0ioqHZKp1f1RidN6UBk2a4Gu4v3VYAgDfISAEAku7aa681ZXTaze+QQw4xDR60WYMGIdq44c477zTlbzvvvLNp3vDyyy+bTn/aGU9p+ZwGHlqCp0GGdrmLhwsvvFAOPfRQ0wxCt+Xjjz82wZHSrJNmkt58800ZPXq0ySLp42qnvkceecRsrwY7l19+edSPO2bMGBkyZIicc845JojToE0f+7jjjpPOnTubJhXaYEIzWNohcN26dabLnwabp556alx+dwBAdMhIAQCSTkvoHnvsMdN5TwOIfffdV5566qlQRqqoqEhuu+022XXXXWW33XYzLcS1DbkGVUrL7T744AOTkdFgK14026Sd+zR40gBPAyrbll3L6jQA1EBJs2ranl23R9u4T5061ZTzabBz++23R/24+jhaSvj999/L7rvvLsOHD5fXX39dMjPrrndef/31pquhlhrabdNSv/AMHgAgudK040SSHxMAAAAAfI2MFAAAAABEiUAKAAAAAKJEIAUAAAAAUSKQAgAAAIAoEUgBAAAAQJQIpAAAAAAgSgRSAAAAABAlAikAAAAAiBKBFAAAAABEiUAKAAAAAKJEIAUAAAAAEp3/D0hHASDf0hjYAAAAAElFTkSuQmCC", + "image/png": "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LFu2rNkcfv75Z4wbNw42mw3du3fHQw89hNdffz2gdVdFRUWYPXs2unfvDovFgqysLEybNq3Zz33yyScYN24c4uLiEB8fj9NPP73Z59Z7770nv69SU1Nx1VVXNSuDu+aaaxAbG4u9e/diypQpiIuLw5VXXgnAt6ZtyZIlGDRoEKxWKzIyMnDjjTeivLy8zd8hHFasWAFBEDBz5kz5NofDgbVr1+Kqq65CfHy8fPvVV1+N2NhYrFy5EoAv2ySKIpKSkgD4XsOJiYmoqakB4Cv7+8c//oGnn34aBkPrp40TJkzAgQMHsG3bthD8hkTqxNI+ImrTzJkzMXHiROzduxd5eXkAfAftSy65BGazOSiP8fDDD+O+++7DjBkzcP311+PYsWN49tlnceaZZ+LHH39EYmIinE4nJk2ahPr6etx2223IzMzEkSNH8NFHH6GiogIJCQl48803cf3112P48OG44YYbAECec0t69uwJj8eDN998E7NmzWpzjmvXrsX555+PrKws/PnPf0ZmZiZ27tyJjz76CH/+858BAOvWrcN5552H3r17Y/78+aitrcWzzz6LMWPGYOvWrXKZjOTSSy9F37598cgjj8gn8MF6LtpSXl6OKVOmYMaMGbjiiiuwcuVK3HzzzYiKisK1114LwHfSeOGFF+Lbb7/FDTfcgAEDBuCXX37BU089hd9//73ZOrQvvvgCK1euxK233orU1NRmv2sg9u3bB6PRiMTExDbH/fXXX3HGGWcgPj4ed999N8xmM1566SWcddZZWL9+PUaMGNFkXOk5WrBgAb7//nu8/PLLSExMxIYNG9CjRw888sgj+Pjjj/H4449j8ODBuPrqq5v8/LJly1BZWYlbbrkFdXV1ePrpp3HOOefgl19+kU+mjx49irVr1+LNN98M6HfdsGEDBg8eHPB7aO/evQCAlJQUAMDTTz+NCy+8EFdeeSWcTifeeecdXHrppfjoo48wdepUAMCvv/6K888/HyeffDIWLlwIi8WCPXv24LvvvpPHfeWVV3D77bfjkksuwZ///GfU1dXh559/Rn5+fpOT8pbs2bMHl1xyCa677jrMmjULr732Gq655hoMGzYMgwYNAuA7CT/77LMhCALmzZuHmJgY/POf/wy4THD69On49ddfcdttt6FXr14oKSnB2rVrcfDgQfk19sYbb+Daa6/FoEGDMG/e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XkJ9fT0ee+yxoD9enz59MHbsWNx8882or6/HkiVLkJKSgrvvvlu+jxSA3n777Zg0aRKMRiMuv/zyVsecNm0aHnzwQaxfvx4TJ07s0HymTp2KxYsXY/LkyZg5cyZKSkrw/PPPo0+fPvj555/l+y1cuBBff/01pk6dip49e6KkpAQvvPACunfvLu9bNnHiRGRmZmLMmDHIyMjAzp078dxzz2Hq1KmIi4vr0Lxacvfdd2P58uWYMGECbrvtNrn9eY8ePVBWVtZmJu/333/HueeeixkzZmDgwIEwmUz44IMPUFxcLD+38fHxeOqpp3D99dfj9NNPl/dl++mnn1BTU4N//etfMJvNWLRoEWbPno1x48bhiiuukNuf9+rVC3fccUe7v8e4ceNw44034tFHH8W2bdswceJEmM1m7N69G++99x6efvppXHLJJa3+fCjWSL377rtwu91tNu54+OGHMXr0aIwbNw433HADDh8+jCeffBITJ07E5MmTW/yZO+64A5dddhmGDx8u33bJJZdg2rRp8mfi6tWr8dFHHzX5ubVr16JHjx5sfU6RJdxtAokodNprsXvo0CG5pXNr/958801RFBvanwfyeF1pfy55//33xbFjx4oxMTFiTEyM2L9/f/GWW24Rd+3aJYqiKO7bt0+89tprxby8PNFqtYrJycni2WefLa5bt67JOL/99pt45plnijabTQTQZiv0n3/+WbzrrrvEU089VUxOThZNJpOYlZUlXnrppeLWrVub3f/bb78VJ0yYIMbFxYkxMTHiySefLD777LNN7rNu3TpxzJgxos1mE+Pj48ULLrhA3LFjR5P7SO3PW2tLHaznoiXjxo0TBw0aJG7evFkcNWqUaLVaxZ49e4rPPfdcs/s6nU5x0aJF4qBBg0SLxSImJSWJw4YNExcsWCDa7Xb5fgDEW265pd3HPnEO7Wlr3K1bt4qTJk0SY2NjxejoaPHss88WN2zY0OQ+rb0+W3v+Z82aJcbExMhfN94q4MknnxRzcnJEi8UinnHGGeJPP/3U5Gfdbrd42223iWlpaaIgCAG1sT755JPF6667LqA5n+jVV18V+/btK1osFrF///7i66+/Lv9eks8//1ycNm2amJ2dLUZFRYnZ2dniFVdcIf7+++/yfV566SXxzDPPFFNSUkSLxSLm5eWJd911V5O/b2vtz1v6fBg3blyTFvKi6GvXf8YZZ4gWi0Xs3r27+Oijj4rPPPOMCEAsKipq9Xc8fvy4eMstt4j9+/cXY2JixISEBHHEiBHiypUrm933v//9rzh69Gj5fTd8+HDx7bffbnKfd999VzzllFNEi8UiJicni1deeWWTtvai2Pw1cKKXX35ZHDZsmGiz2cS4uDhxyJAh4t133y0ePXq01Z8JlZEjR4rp6emi2+1u837ffPONOHr0aNFqtYppaWniLbfcIjocjhbv+7///U+MjY1t8fd59NFHxezsbDErK0tctGhRk+95PB4xKytL/Pvf/975X4hIgwRRDNPKWiIiUtxZZ52F48ePY/v27UpPRfX279+P3NxcPP744/jLX/4S9PHffPNN3HLLLTh48GCztvp6N2fOHLz00kuoqqpqtWkFaceqVaswc+ZM7N27NyTdCYnUimukiIiIFHDllVeiR48eeP7555WeSkg13q8I8K3LevPNNzF27FgGUTqxaNEi3HrrrQyiKOJwjRQREZECDAZDRGQGR40ahbPOOgsDBgxAcXExXn31VTgcDtx3331KT42CZOPGjUpPgUgRDKSIiIgoZKZMmYJ///vfePnllyEIAk499VS8+uqrOPPMM5WeGhFRl3CNFBERERERUQdxjRQREREREVEHMZAiIiIiIiLqIK6RAuD1enH06FHExcW1uTkgERERERHpmyiKqKysRHZ2NgyG1vNODKQAHD16FDk5OUpPg4iIiIiIVOLQoUPo3r17q99nIAUgLi4OgO/Jio+PV3QuLpcLn332GSZOnAiz2czxFB4vFGNyPI6n9Jgcj+MpPSbH0/d4oRiT43G8cHI4HMjJyZFjhNYwkALkcr74+HhVBFLR0dGIj48P2guT46lrTI7H8ZQek+NxPKXH5Hj6Hi8UY3I8jqeE9pb8sNkEERERERFRBzGQIiIiIiIi6iAGUkRERERERB3EQIqIiIiIiKiDGEgRERERERF1EAMpIiIiIiKiDmIgRURERERE1EEMpIiIiIiIiDqIgRQREREREVEHMZAiIiIiIiLqIAZSREREREREHcRAioiIiIiIqIMYSBEREREREXUQAykV8XhF5BeUYctxAfkFZfB4RVWNR0Tax88ZIm3TwntYC3NUM7U/f2ofL5xMSj74119/jccffxxbtmxBYWEhPvjgA1x00UXy90VRxAMPPIBXXnkFFRUVGDNmDJYuXYq+ffvK9ykrK8Ntt92G1atXw2AwYPr06Xj66acRGxurwG/UeWu2F2LB6h0otNcBMGLZ7s3ISrDigQsGYvLgLMXHIyLt4+cMkbZp4T2shTmqmdqfP7WPF26KZqSqq6vx//7f/8Pzzz/f4vcfe+wxPPPMM3jxxReRn5+PmJgYTJo0CXV1dfJ9rrzySvz6669Yu3YtPvroI3z99de44YYbwvUrBMWa7YW4eflW/4uoQZG9Djcv34o12wsVHY+ItI+fM0TapoX3sBbmqGZqf/7UPp4SFM1InXfeeTjvvPNa/J4oiliyZAn+/ve/Y9q0aQCAZcuWISMjA6tWrcLll1+OnTt3Ys2aNfjhhx9w2mmnAQCeffZZTJkyBU888QSys7PD9rt0lscrYsHqHWgpiSndNu8/v8DrFWEwCO2O5/WK+Ouq7a2OJwBYsHoHJgzMhDGA8YhI+/g5Q6Rt4X4Pd3S8UIwZaZ8zav8b8+/bMkUDqbYUFBSgqKgI48ePl29LSEjAiBEjsHHjRlx++eXYuHEjEhMT5SAKAMaPHw+DwYD8/Hz84Q9/aHHs+vp61NfXy187HA4AgMvlgsvlCtFv1LL8grJmkfiJymtc+NOKH4PyeCKAQnsdNu4pwYjc5A7/vPT8BOt5Uvt4oRiT43G8cI/JzxmOp7YxOV7HhPs9HIrxgj2m3j5n9PA3VtPft6sC/TsKoiiqYkWXIAhN1kht2LABY8aMwdGjR5GV1VAjOWPGDAiCgHfffRePPPII/vWvf2HXrl1NxkpPT8eCBQtw8803t/hY8+fPx4IFC5rdvmLFCkRHRwfvlwrAluMClu02tnu/NKuIWHP741W5gGN17UfuV/f1YFiqKv70RBRi/Jwh0jal3sOBjheKMSPtc0btf+NI+/vW1NRg5syZsNvtiI+Pb/V+qs1IhdK8efMwd+5c+WuHw4GcnBxMnDixzScrFFIKyrBs9+Z27/fUzNMDisjzC8pw1WvtjzfxjBGdvoKzdu1aTJgwAWZzgJ+uGh4vFGNyPI4X7jH5OcPx1DYmx+sYpd7DgY4XijEj7XNG7X9jrf19u0qqVmuPagOpzMxMAEBxcXGTjFRxcTGGDh0q36ekpKTJz7ndbpSVlck/3xKLxQKLxdLsdrPZHLSDTqBG9UlHVoIVRfa6FutEBQCZCVaM6pMeUI1osMdrTbCfK7WPF4oxOR7HC9eY/JzheGodk+MFRgvvYS3MsSX8G+tjvGAL9G+o2n2kcnNzkZmZic8//1y+zeFwID8/H6NGjQIAjBo1ChUVFdiyZYt8ny+++AJerxcjRowI+5w7w2gQ8MAFAwH4XjSNSV8/cMHAgF9EwR6PiLSv8efCifg5Q6R+WjhX0MIc1Uztn9NqH08pigZSVVVV2LZtG7Zt2wbA12Bi27ZtOHjwIARBwJw5c/DQQw/hv//9L3755RdcffXVyM7OltdRDRgwAJMnT8Yf//hHbNq0Cd999x1uvfVWXH755Zro2CeZPDgLS686FZkJ1ia3ZyZYsfSqUzvcRz/Y4xGR9kmfC1HGph/7/Jwh0gbpPZcW17SiRk3vYZ7PdI30+5qNTYMHtTx/ah9PCYqW9m3evBlnn322/LW0bmnWrFl44403cPfdd6O6uho33HADKioqMHbsWKxZswZWa8MT/tZbb+HWW2/FueeeK2/I+8wzz4T9d+mqyYOzMGFgJjbuKcFn3+Rj4hkjupTOlMb777ZDuGPlLzAagK/+chYs5vYXMhKRPk0enIXeabvxW1Elzs32Yvbk4UH5nLn739vw/tajOLNvCl6fPUL1VxCJtGry4CzkpsZg0pJvECWIeG326UF5Dwfr3CMUY574OTM2Lxn/um6kbj9nJg3KRJTRAJfHgwt7eDBjfHCev2D/PdQ6XrgpGkidddZZaKtpoCAIWLhwIRYuXNjqfZKTk7FixYpQTC/sjAYBI3KTUbpTxIjc5C6/iIwGAVMGZeIew89wegUcrqhFXlpskGZLRFpUXuMEAJyS4g3a58yo3il4f+tR1Lu9mjn4EWlVVb0HABAXhaC9h4N57hGKMY0GAWf1S8P7W4/CUefW9edMkaMO1U4PTAYBZ2UF7/kL9t9DzeOFk2rXSFFwGAwC0m2+/99TUqXsZIhIUaIoorzatzdGTBB7EOQk+T5kDpfXBm9QImqRo9b3Hraptl1YaOSlxQAA9h6vbvMivNZJ52o9kqNh5Fm66vFPFAEybL4PHAZSRJGtqt4Np8cLAIgN4klYt0RfuXWhvQ4u//hEFBqOOn8gZdRvMNGSnsnRMEBEdb0HRY62N67VMulcTQocSd0YSEWATAZSRATI2Sib2YCoIC6XTIu1wCSI8IpAYYV+T3CI1MDuz0hFR1hGKspkQKp/ifzuYv2ez+z2n6v1YSClCQykIkAGS/uICEBpdT0AICk6KqjjGgwCkv2NxA6V1wR1bCJqKlJL+4DIqLBhRkpbGEhFAOmDZ++xKni9kVUKQEQNyqp9jSaSY4IbSAFAitX32XKojIEUUSg56twAgOgIbMKbEe37755j+g2k9sqBFJuDaQEDqQiQZgVMBgE1Tg8KdVxXTERtkwKppOggdprwY0aKKDzsNVJGKvIujOp9qUJ5tROl/s/p3mnRCs+GAsFAKgIYDb7uL4B+P3yIqH0hzUhZfCc47NxHFFpys4kILu3bq9NzGSnT1i3RhuioCPwDaxADqQjRJ91Xa8tAiihyldWEsrTP91+W9hGFltRswhaJpX3+Nd+l1U6U+y8M6Yl0jtYnnWV9WsFAKkJIixYZSBFFrrKq0JX2SRmpQ8xIEYWUlJGKtK59AGAxAtkJvqs2elwnxUBKexhIRQhp0aJe0+FE1L7yEGakpDVSxyrrUefyBH18IvKRM1IRuEYK0PeFYQZS2sNAKkJI+xHo8QoOEQWmNITNJqJNQIzFV2t0mA0niELGUevr2heJpX0AAylSFwZSESI31ddsoqzaidKqeoVnQ0RKKA9hswlBAHISfQsYDpWxvI8oFLxeMaJL+4CGChu9BVI1TjeOVPg+O/uw9blmMJCKENFRJnTzn+To7cOHiALTkJEKfiAFAN2T/IEUM1JEIVHldEP0V/RFYtc+QL8Zqb0l1QCAlJgoJIXgYheFBgOpCCKlilneRxR5nG4vKv0beSbHBL+0D2gUSLFzH1FIOPzroywmA8wRegYnBVJHKmpRXe9WeDbBs+dYJQAgj2V9mhKhb8PIJAdSOruKQ0Ttq/A3mjAIQII1tIEU95IiCg2p0US8NULTUfCVJkvlyfuOVSs8m+Dh+ihtYiAVQRhIEUWuxmV9BoMQksdgaR9RaEmNJuJtobkYohXSGiIpi6MHciDF9VGawkAqgkiBFFugE0UeqdFEKGvvc5LYbIIolJiR8snT4YVhZqS0iYFUBJGuchy11+mqrpiI2lcawo59Eqmhjb3WJXcWI6Lgkd5X8SEqz9WKvjoLpFweLw6U+jL5fTMYSGkJA6kIkhQThdRY30nUXjacIIoo0ma8KSEMpGIsJnl8NpwgCj6p2UR8pLbs89PbUoUDpdVwe0XEWkzIjLcqPR3qAAZSEUav+y8QUdtKq0Jf2gc07tzH8j6iYJMDqQjPSEmB1IHSGrg8XoVn03XSOVleWgwEITRrWCk0GEhFGL1dxSGiwIQjIwUA3ZN9m38fZsMJoqCzMyMFAMhKsCImygi3V8SBUu137pMDKa6P0hwGUhGGgRRRZAr1ZrySnCRfIMXSPqLgc/j3gov0jJQgCLpqOMFGE9rFQCrCMJAiikxS176U2BAHUslSC3SW9hEFm1TalxDhGSmgoYHW7mLtn8/sZutzzWIgFWHkuuKyGjjd2q8rJqLAlIU5I8XSPqLgk0r74iI8IwU0aoGu8eZZXq8oNwBjRkp7GEhFmMx4K2ItJni8IvbroK6YiAITjvbnAJCTLJX21UIUxZA+FlGkkdqfMyOlnwqbIxW1qHN5EWU0oIf/85O0g4FUhBEEAXlpMQC0/+FDRIERRVEu7Qt1IJWdaIUgALUujxy8EVFw2Nm1TyYFUnuPVcHr1e5FGymj1is1GiYjT8u1hn+xCKSnBZpE1D5HnRtu/4lGqAMpi8ko74PChhNEweWo9TWbiLMyI9UzORpmo4A6lxdHKrS7JnMvG01oGgOpCNQ3PQ4AAymiSCFlo2KijLCajSF/PHkvKTacIAoap9uLWpcHAJBgY0bKZDQgN9VfYaPhdVINHfviFJ4JdQYDqQikl7piIgqM3Po8xNkoCVugEwWftD4KAGItzEgBjcr7NHw+w9bn2sZAKgJJb9Z9x7VdV0xEgZFbn4cpkOKmvETB19CxzwSjQVB4NuogtQvX6oVhURTlbBpbn2sTA6kIlJNkQ5TRoPm6YiIKTFnYM1L+0r4yfr4QBYuDjSaa0fqa79JqJypqXBAEoLe/ERhpCwOpCNS4rnh3SaXCsyGiUCurCU/HPoncAp0ZKaKgcdT5Gk1wfVQDqcJmd0mVJrdbkDYTzkmKDsv6VQo+BlIRiuukiCKHlJFKDvFmvBIpkDpaUQsPy4eJgkJufc49pGR5abEQBN9zc7xKe9st7OFGvJrHQCpCaT0dTkSBK/WfYCTHhieQyoy3wmwU4PKIKHbUheUxifROKu1jRqqB1WyUu4Rq8XyGrc+1j4FUhGJGiihylNeENyNlNAjITpTWSbG8jygYuBlvy+SGExpsgS537GOjCc1iIBWhGne60WJdMREFTmp/Hq41UkCjFujcS4ooKKT25/HMSDWh5RboUiCVx4yUZjGQilC902JgEHyLV49V1Ss9HSIKIbn9eZhK+4BGm/IyI0UUFCzta1lf/0a2Wquwqaxzochf+szSPu1iIBWhrGajvCBcax8+RNQxcvvzMJX2AezcRxRsjlpf1754K5tNNKbVNd97j1UDANLjLAyONYyBVASTyvu0mA4nosDUuz2oqvedgKXEWML2uFJG6jD3kiIKCmmNVEI0T7obk7I5RY46VPrLH7VgDxtN6AIDqQjGhhNE+lde7TuxMBoExIXxSjYzUkTBJa+RYrOJJhJsZqTF+S4SSVkeLWAgpQ8MpCKYnA7XYKcbIgpM47I+g0EI2+NKzSaKHHWod3vC9rhEesU1Uq1r3EBLKxhI6QMDqQgm7wherJ0PHiLqGHkz3pjwnnylxkbBZjZCFIHCCu4lRdRVDRvyMpA6kXw+U1Kp8EwCt8c/V7Y+1zYGUhFM+uApqayXSwaISF9Kq31dOcPZ+hwABEFo6NzH8j6iLhFFEY4631pHZqSa01oL9DqXBwf9HU2ZkdI2BlIRLN5qRrq/rlhL6XAiCly5AntISeR1Umw4QdQl1U4PPF7fno9cI9Wc1tZ87y+thlcE4qwmeX0XaRMDqQintQ8fIuqYMiUDKWakiIJCWh9lNgqwmnnqdiLpXOZgWQ3qXOpfk9l4fZQghG/tKgUf340RTmvpcCLqmLIaKZAK/1XP7klSRoqBFFFX2Bs1muCJd3PpcRbEWUzwir5sj9rJgRTXR2keA6kI15cZKSJdkzNSCuw9k5MsZaRY2kfUFVJGimV9LRMEAX0ytHM+I82xbwYDKa1jIBXh2AKdSN/kQCpWuYzUYWakiLqEHfvap6UW6Gx9rh8MpCKc9CY+pJG6YiLqmIaMlHLNJkqrnaiud4f98Yn0QurYx0CqdVpZ8+3xith33Fd+2CctTuHZUFcxkIpwabEWxFt9dcUFx9VfV0xEHVNW7buSrUSziQSbGfFWEwDgMMv7iDqNm/G2TyuB1OHyGjjdXlhMBnTzN+Qh7WIgFeEEQdDMhw8RdYzXK6K8RrmufUBDVuowO/cRdZpc2ue/MEHNSecy+45Xy63i1Ug61+qdFgujgY1DtI6BFDXaEZyBFJGeOOpc8glFUowyV7Jz2LmPqMscdVwj1Z7uSdGIMhngdHtV/Xmzm+ujdEX1gVRlZSXmzJmDnj17wmazYfTo0fjhhx/k74uiiPvvvx9ZWVmw2WwYP348du/ereCMtYct0In0SVofFWsxwWIyKjIHdu4j6jo7S/vaZTQI6J0aA0DdFTZsfa4vqg+krr/+eqxduxZvvvkmfvnlF0ycOBHjx4/HkSNHAACPPfYYnnnmGbz44ovIz89HTEwMJk2ahLq6OoVnrh0s7SPSJyU345VIpX1qvkJMpHaOWn+zCbY/b1MfDXQiZsc+fVF1sW1tbS3ef/99fPjhhzjzzDMBAPPnz8fq1auxdOlSPPjgg1iyZAn+/ve/Y9q0aQCAZcuWISMjA6tWrcLll1/e4rj19fWor6+Xv3Y4HAAAl8sFl8sV4t+qbdLjB2segYzXM8kKANh3vAq1dfUwGVuPr5WYn5LjhWJMjsfxwjXmMYcvC5QUbW7ys+H8nTPjfEHcwbKagB9P7X+TSBsvFGNyvI6pqPGds8RGCU3OVdQyv3CMGch4vVN8F25+L3K0+7hKzE8URTmQ6pVsafO+av8bq328rgp0HoIoiqpdkVdZWYn4+HisW7cO5557rnz72LFjYTKZ8NprryEvLw8//vgjhg4dKn9/3LhxGDp0KJ5++ukWx50/fz4WLFjQ7PYVK1YgOjo66L+H2nlF4O58I1yigL8NdSOdTWSIdGFjsYB39hkxMNGLGwd4FZlDUQ3w6E8mWI0i/nG6BwLXVhN12D9+MqKwRsDNAzzon6ja0zbF/XhcwBu7jegZK2LuEPVt6WJ3AvdvMUGAiCdGeGBSfV1Y5KqpqcHMmTNht9sRHx/f6v1UnZGKi4vDqFGj8OCDD2LAgAHIyMjA22+/jY0bN6JPnz4oKioCAGRkZDT5uYyMDPl7LZk3bx7mzp0rf+1wOJCTk4OJEye2+WSFg8vlwtq1azFhwgSYzV1P4Qc63sv7N2JnUSVyBp6Gcwekq25+So0XijE5HscL15iHvi4A9u1G/9zumDJlcMjm2NZ4tU4PHv3pc9R5BIw5ewISo9t/PLX/TSJtvFCMyfE65tFf1wOox4RxozGkW4Lq5heOMQMZr09xJd7YvRGlLjPOO28ihDau3Cgxvw17S4EtW9ArJQYXnj+2y+MFe356Gq+rpGq19qg6kAKAN998E9deey26desGo9GIU089FVdccQW2bNnS6TEtFgssFkuz281msyr+eEDw59LeeH0z4rCzqBIFZXUBPW6456f0eKEYk+NxvFCPWeFfV5EaZ23x58LxO5vNZqTGWnC8qh5FlS6kJQSe9Vf73yTSxgvFmBwvMJX+DXmTY21Nfl4t8wvnmG2N1yczAQYBqKp3o7zOi4x4q6rmt7/Mt36/T0ZcwI+p9r+x2sfryjwCofqkYl5eHtavX4+qqiocOnQImzZtgsvlQu/evZGZmQkAKC4ubvIzxcXF8vcoMGw4QaQ/ZQrvISWROvdxLymijnN7vKh2+srU2LWvbRaTET1T1Nu5j40m9Ef1gZQkJiYGWVlZKC8vx6effopp06YhNzcXmZmZ+Pzzz+X7ORwO5OfnY9SoUQrOVnu00OmGiDpG7toXrXAgJe0lxUCKqMMc/mwUAMRxQ9525aWp98IwW5/rj+rfkZ9++ilEUcRJJ52EPXv24K677kL//v0xe/ZsCIKAOXPm4KGHHkLfvn2Rm5uL++67D9nZ2bjooouUnrqmNN5LShTFNuuKiUgb1ND+HGi0l1QZ95Ii6iiHfw+pmChjm111yadPeizW7SxWZyB1jBkpvVF9IGW32zFv3jwcPnwYycnJmD59Oh5++GG5dvHuu+9GdXU1brjhBlRUVGDs2LFYs2YNrNb262KpQa+UGBgNAqrq3Shy1CErga37iLROCqSSlA6kmJEi6jRuxtsxUpCyu6RS4Zk0Za9x4Vilr419HgMp3VB9IDVjxgzMmDGj1e8LgoCFCxdi4cKFYZyV/kSZDOiZHI19x6uxp6SKgRSRDkiBVIrSgRQ35SXqNEedL5CKZyAVkIY139UKz6SpPcd8gV1WghWxFtWfflOAmCMmWR4bThDpRp3Lgxr/AvXkWGUDqe5JUrOJWqh460IiVZIyUgykApOX5ms2cbyqHvYadWzuCrDRhF4xkCIZO/cR6YeUjTIbBcQpfPUzO9EGgwDUu71yaQsRBcbh38Yg3spAKhBxVjMy/W3PpSyQGkjnVnlsNKErDKRI1kfFnW6IqGPk9VHRUYo3jzEbDXK5MNdJEXUM10h1nBovDDMjpU8MpEjWN8PfuY8t0Ik0Ty0d+yRSeR879xF1TMMaKa6rCZQqAyn/uVVfBlK6wkCKZFK6+XiVExX+jTyJSJvKVbIZr0RqOMFNeYk6xsGMVIepLZCqc3lwuNx3EYkZKX1hIEWyGIsJ2Qn+umKVfPgQUeeUVqmj9blEboHOjBRRh8jNJrhGKmByIKWSCpu9x6ogikBStBkpsRalp0NBxECKmmDnPiJ9UEvrc4m8KS8zUkQd4qjzN5tgRipgUiB1uLwWdS6PwrPh+ig9YyBFTagtHU5EnVNW09BsQg3kvaQYSBF1CJtNdFxKTBQSo80QRXWs+97LQEq3GEhREw07giv/wUNEnVfmL+1LUXgPKYlU2ne0og5uj1fh2RBpR6Vc2sdmE4ESBEFVnYh3s/W5bjGQoibU9MFDRJ1XprJmE+lxFkQZDfB4RRTa65SeDpFmyBmpaGakOkJNFTYs7dMvBlLUhPQmP1JRixqnW+HZEFFnye3PVVLaZzAI6JbEdVJEHSGKYkP7czab6BC1BFJujxf7S6sBMJDSIwZS1ERKrAVJ/qte+45VKzwbIuqscimQUklpH9Cwl9Rhdu4jCkitywOXRwTANVIdpZbmWQfKauDyiLCZjcj2b0xO+sFAippRy1UcPfJ4ReQXlGHLcQH5BWXweEVVjUf64PWKDftIqSQjBbDhBFFHOWp9lSFGg4DoKKPCs9EWaanC/tJqRddlSudSeekxMBgExeZBocGVi9RMn/Q4/LC/nIFUkK3ZXogFq3f414cYsWz3ZmQlWPHABQMxeXCW4uORfthrXZBiarXsIwU0NJyQNqYkorY1lPWZIAg8Ce+Ibok22MxG1Lo8OFBWo1ijB+lcqm96nCKPT6HFjBQ1w4xU8K3ZXoibl29ttsi+yF6Hm5dvxZrthYqOR/pS6i/ri7OaYDaq52Ne3kuqjBkpokCw9XnnGQwC8tJjACh7PsPW5/qmniMsqYbadgTXOo9XxILVO9BS0Z1024LVOwIuywv2eKQ/atuMVyJlpFjaRxQYh9T6nIFUp6ihE7F0LsXW5/rE0j5qRgqk9h+vhsvjVdUVbS3aVFDWZrtnEUChvQ63rtiKrAAWohbaawMab1NBGUblpXRixqR1UiClprI+oGGNVLGjHnUuD6xmrvkgagszUl0jnc/sVSiQEkWRGSmdYyBFzWQnWBEdZUSN04MDpTV883dRSWVge+Z8sr1Ikccl/VFrRiop2oyYKCOqnR4cqajlFVqidsgZKbY+7xSlK2wK7XWodnpgMgjomRKtyBwotBhIUTOCICAvLRa/HLFjT0klA6kuSo+zBnS/af8vW95npy1Hymvx4U9Hg/a4pD9Sx74kFXXsA3yfLd2TorGruBKHFFz8TaQVdn/XPpb2dU7jNd9erxj2rnm7/dmoXqkxrO7RKQZS1KI+6VIgxXVSXTU8NxlZCVYU2etaXNckAMhMsGLxZUNhDOBD3uMVsWl/WbvjDc9N7uLMSatKq9S3h5QkJ9nmC6TYuY+oXXLXPhtP1zqjZ0oMTAYBNU4PCh116JYY3n2cpHOoPrxopFsMj6lF7NwXPEaDgAcuGNji96Sw6YELBgYURJ043ok/0ZnxSH+kjJTaSvsAoLvUAp2d+4jaxTVSXWM2GuSSOiXOZ/ZwfZTuMZCiFkklN+zcFxyTB2dh6VWnwmZu+pbLTLBi6VWndnjfJ2m8zISm5XudHY/0RWp/rrbSPoCb8hJ1BNdIdZ2SF4bZaEL/GEhRixo63VTDyzbaQTF5cBZG56UCAEame7H82tPw7T3ndDromTw4C9/ecw5y/Ouq/jKhT5fGI/0ol5pNqLG0z/965aa8RO1rKO1jINVZSgZS0sVoBlL6xUCKWtQzJRpmo4BalwdH7TzhCZaqet/C4ZMSRIzITe5y+Z2xUSegtDgLy/kIQKP252rOSLG0j6hdUrMJlvZ1Xt/0OADhb4FeVu1EWbUTgsA9pPSMgRS1yGw0oFeK8juC642jzndQDOa64VT/Opjj/gYDRA3tzy0Kz6Q5KZAqr3HJFxaIqGUNpX1sNtFZSrVAl86duiXaYIvinnl6xUCKWsWGE8FX6S/TsBmDVy4plW+VMpAiALVOD2pdHgBAUoz6rmLHWkxIivbNi1kporY52Gyiy3qn+S4KSxmicGGjicjAQIpaJa+TYsOJoJEOisHMSEmBFDNSBACl1fUAgCijAbEWdV7FZnkfUfs8XhGV9dxHqquio0xy2/NwXhhm6/PIwECKWiUFUruLGUgFg9cryqVM1iBm+VP95VvH/SfQFNnKq33BelKMGYKgzjVz3f0NJ7iXFFHrpAoGgF37uko+nympDNtjSo/FjJS+MZCiVjVugS6K7NzXVdVON6QGiLZgBlIs7aNGpIxUsgrXR0lykpiRImqPw99owmY2IsrE07WuUGKpAlufRwa+M6lVeWmxEASgosYl70tDnVfpbzRhNgowB/GdJ6+R4t+IoO7NeCXd/aV9h7mXFFGruBlv8IQ7kKqud+Oova7JY5M+MZCiVtmijIrUFeuVtB9InNWEYFZcpcb6Mg9l1U54uOdXxJMyk0kqDqSkvaQOlbG0j6g1DXtIqXOto5Y07I0ZnnMZaW15amwUElW4DQUFDwMpahM79wWPlJEKdq271AHNKzZkIyhyaSEjldMoI8WyYaKWNbQ+Z0aqq6SGD0ftdagOw7YL0jkT94/SPwZS1Ka+DKSCRjooxgV5PxCz0YAYk+9k9HgVG05EOjVvxiuRMt3VTg/Ka1zt3JsoMrG0L3iSYqLk9cTh6EQsnTP1zWAgpXcMpKhNbIEePFJGKtiBFADE+Y+zxyuZkYp0UiCVHKveQMpqNiIj3leSyoYTRC1rKO1jIBUMcgOtMFwYZuvzyMFAitrE0r7gkddIhWBvnzgzM1LkIwdSKs5IAY0697HhBFGLmJEKrnCez+w5JnXsiwv5Y5GyGEhRm/qk+T4ECu118h5I1DnyGqkQHBTljBQDqYgndW9MVvEaKaDRXlJsOEHUIqn9eXwIqhgiUbgCKafbiwOlNU0ek/SLgRS1KSHaLHeFC1e3G72S10iFJCPl++9x7iUV8co1EkhJDSeYkSJqmZSRYmlfcMiBVIiXKhwoq4HHKyLWYpJLmEm/GEhRu/qkxwAAdjOQ6hJHCNdIxbK0jwB4vCIq/Cdfqg+kuCkvUZu4Riq4pEDqQGkNnG5vyB5H7tiXHgshmHudkCoxkKJ2cZ1UcDTeRyrYWNpHAFBR44TUTVxqi69W3ZN9pX2Hy1naR9QSrpEKrsx4K2ItJni8IvaXVofscfYe843NRhORgYEUtatPGDvd6Fmo9pECgDh/8oGBVGSTGk0k2MwwGdX98S5lpI6U18LLjaSJmuE+UsElCALy0nwVNqE8n5EDKa6PigjqPtKSKkhdZ9gCvWtCtY8U0KhrH9ufRzQpkFLzZrySrAQrjAYBTo8XJZW8AEB0IofcoIjNJoIlLwwVNgykIgsDKWpXQ11xNepDWFesd5VhKO0rra6HKPLqfqSSN+PVQCBlMhqQnWgFwIYTRC1haV/whXqpglcECkoZSEUSBlLUrox4C+IsJnhFXzBFnRPKZhNSIOXyiHLLXIo8ZTXa6NgnYcMJopbVuTxyQwQ2mwievv4Km1AFUuX1QJ3LiyiTATn+LR5I3xhIUbsEQZDT4VLKmjpOykiFot7dbABi/W3Vj3GdVMQqq9LGZryShkCKDSeIGpNKwQ0CEBvF0r5gkbJE+45XhWRtZlGtr0tf79QY1a9TpeDgX5kC0rD/AgOpznC6vahz+a4uhiIjBQCpsb6TZzaciFzyZryx2gik5E15WdpH1ERDl1czDAa20A6WnCQboowG1Lm8OGIP/gWcYv+QeSzrixgMpCggfZiR6hIpGwU0ZI6CjYEUlddoLCOVzNI+opZwfVRomIwG5Kb6OveF4nym2J+RYuvzyMFAigIifSgwkOocaX1UrMUEY4iuLkqd2o6zA1rEkppNaGaNFPeSImqRtNaVHfuCL5QXhuVAihmpiMFAigLSUFdcDW750nEN66NCd1BMjbUAaCjvoshTprHSPmmNVKG9Fi4PO4ISSezcQypkGlqgBzeQEkURRf7kOgOpyMFAigKSkxyNKJMBTrcXZUx4dJh0dTEuhAfFFJb2RTw5kNJIaV9anAUWkwFeESisqFN6OkSqIa2RYmlf8DVkpILbue94lRO1HgEGAXL5IOkfAykKiNEgoLf/g0HqSkOBkzNSISzTkEr7jnFT3ogkiqLmSvsEQWDDCaIWOJiRCpnGSxWCue2iVCrYPckGq9kYvIFJ1RhIUcB6p/kCqS3HBOQXlMHTxRo/j1dEfkEZthwPznhq1rgDU6iw2URkq3F65A2ztRJIAWw4EYmC/dmvx2OJ3GwimoFUsEnnMo46N74rDt5rcN3OYgBAcoxZF69BCoyqAymPx4P77rsPubm5sNlsyMvLw4MPPgix0SUEURRx//33IysrCzabDePHj8fu3bsVnLU+rdleiK9/Pw4A2FpqwFWvbcbYRV9gzfbCTo83dtEXuOq1zVi229jl8dSu0t9sIhxrpBhIRSYpG2UxGRAdpZ2rofJeUsxIRYRgf/br9VgiN5sI4TEjUn21qwRGwVdZ815B8F6D//r+EABg2yGHLl6DFBhVB1KLFi3C0qVL8dxzz2Hnzp1YtGgRHnvsMTz77LPyfR577DE888wzePHFF5Gfn4+YmBhMmjQJdXWstw+WNdsLcfPyraiqdze5vcheh5uXb+3wh4U0XqG96d+os+NpgVSmEa41UmIw6xVIExqX9QmCdspvpc593JRX/4L92a/nYwnbn4eG9JrxnHCM5GuQOkvVgdSGDRswbdo0TJ06Fb169cIll1yCiRMnYtOmTQB82aglS5bg73//O6ZNm4aTTz4Zy5Ytw9GjR7Fq1SplJ68THq+IBat3oKXTcum2Bat3BJzGDvZ4WiG1Pw/lGqlUfzlXncuLGqcnZI9D6qS19VGS7sxIRQQeSzrGIa+rZSAVLHwNUiioOmc8evRovPzyy/j999/Rr18//PTTT/j222+xePFiAEBBQQGKioowfvx4+WcSEhIwYsQIbNy4EZdffnmL49bX16O+vqH8yeFwAABcLhdcLleLPxMu0uMHax5dHS+/oKzZlZbGRACF9joMemBNQPsjebwi6lyttzmWxtu4pwQjcpM7PN9gP3/BGtNe43u9RZsNIfsbRxlE2MwG1Lq8KKyoRk//2pPOjqeW12CkjxfomMccvoxOos3c7mOr6XfOivMFfofKapqNo4b5cbzgjBnpx5KOjlfh31w7xiy0+DNKz0+JMfka7JpIG6+rAp2HIKq4Bsjr9eKvf/0rHnvsMRiNRng8Hjz88MOYN28eAF/GasyYMTh69CiysrLkn5sxYwYEQcC7777b4rjz58/HggULmt2+YsUKREd37uRTr7YcF7Bsd/jXW1zd14Nhqap9aXbYP38z4JdyAy7r7cHojND9Xgu3GlFaL2DOYDdy40L2MKRCXxwV8OEBI4alenF1X+3syVTtAv662XdN7/HhbmhoeRd1AI8lHcPP8uDja5A6oqamBjNnzoTdbkd8fHyr91N1RmrlypV46623sGLFCgwaNAjbtm3DnDlzkJ2djVmzZnV63Hnz5mHu3Lny1w6HAzk5OZg4cWKbT1Y4uFwurF27FhMmTIDZ3PWUflfHSykow7Ldm9u93xOXDMbQnMR277ftUAX+8u/t7d5v4hkjOn0FJ5jPX7DGfKvwB6C8HKNOOwUT+qeE7G/82qGtKD1sR98hwzBxYEaXx1PDazDSxwt0zB2f7QYOFGBw316YMqV/WOfYlfFEUcQjv3yJqno3Bo04E33TY1U1P44XnDEj/VjS0fHu+/ELAG5MOvvMFjd3VXp+SozJ12DXRNp4XSVVq7VH1YHUXXfdhXvvvVcu0RsyZAgOHDiARx99FLNmzUJmZiYAoLi4uElGqri4GEOHDm11XIvFAovF0ux2s9msij8eEPy5dHa8UX3SkZVgRZG9rsU6YAFAZoIVfzi1R0Cp8Ny0eDy5dk+7443qkx7QeK0Jxd+yK2NW1fvWLCXFWuUxQvE3TouzArCjvNbT5bHV8hrkeIGNWeHv8pXa6DXWlfGCPb+25CRHY2ehA8WVLgzs1vDzapkfx+v6mDyWBD6e1yui0t/cKSXe1ub99fyaCfZ4fA1G5nhdmUcgVN1soqamBgZD0ykajUZ4vb6yldzcXGRmZuLzzz+Xv+9wOJCfn49Ro0aFda56ZTQIeOCCgQB8HwqNSV8/cMHAgD8kgj2eVjTsIxXaaxdpcdxLKlKV+ddUJMdqq9kEAORwU17dkz77WzvhBHgskVQ53fJGsdyQN3h4PkOhoOpA6oILLsDDDz+M//3vf9i/fz8++OADLF68GH/4wx8AAIIgYM6cOXjooYfw3//+F7/88guuvvpqZGdn46KLLlJ28joyeXAWll51KjITrE1uz0ywYulVp2Ly4KxWfjI842lBwz5SoT0oSntJlVY5Q/o4pD5y175oDQZS3JQ3IkwenIUZp3VvdjuPJU3Za3wX3iwmA6xmLhoMJp7PULCpurTv2WefxX333Yc//elPKCkpQXZ2Nm688Ubcf//98n3uvvtuVFdX44YbbkBFRQXGjh2LNWvWwGq1tjEyddTkwVmYMDATG/eU4LNv8jHxjBFdSldL4z24ejve2HgQw3okYuVNo3V55UYURVRKrWxDnJHipryRq1yj7c+BRhkp7iWle9JGs5eemg1b5aGgHUuue2MTvvr9OC4+JRuPXzpU08cStj4PrVCdzwRrPNIWVQdScXFxWLJkCZYsWdLqfQRBwMKFC7Fw4cLwTSxCGQ0CRuQmo3SniBG5yV3+kDAaBN+Czo0HYTQIuv3QqXZ6IG0j4Tswhq6jGgOpyFWq5UAqmXtJRQJRFLFpfxkAYPqp3VD868GgHUuGdIvHV78fh9lo0PyxhJvxhl4ozmeCOR5ph6pL+0j/pAOFdODQI4f/dzMbBVhMoX3LpcRKa6RY2hdJXB6v/B7SYiAlb8rL0j5d211ShbJqJ6xmA4Z0Swjq2JnxviqUIkfr+wRphZS1C3UFAxF1HQMpUlSCzXeg0HMg1Xh9lCCE9iqVnJGqZEYqklT411QIApCowTVS3f2lfY46t64/CyJd/r5SAMCwnkmICvJFpYx432dfsUP7n30OZqSINIOBFClKOlA4/MGGHoWrYx8ApPkDqcp6N+pcnpA/HqmD1Ggi0WbWZElJjMWEFH8mjVkp/fq+wFfWNyI3JehjZ/gzUsV6yEhxjRSRZjCQIkVJgVSN0wOnO3Rrh5RUGcaDYrzNhCij720trZkh/SvT8PooSXf/OqnDXCelS6IoyhmpzmxO2h6ptK+8xqX5i0hSVpatz4nUj4EUKSrOYoLg31lEryU9Ur17ODJSgiA0rJNieV/E0EMgJXXuO1zOzn16tPdYNY5XOWExGfD/chKDPn6CzQSz4DuWlGi8vI+lfUTawUCKFGUwCLD5t8mw1+ozg9LQ+jw8B0V27os88ma8Wg6kuJeUruUX+LJRp/RIDMneSIIgIMH30YdCu7aDcanUPd7GZhNEasdAihQnHSt0m5GqC19GCmjcuY+BVKQoq9JBICV17mNGSpfy94VufZQk0f/y13rnPrY/J9IOBlKkuGh/fCF1HtMbR5jr3RsyUvrM8FFz5brISEmb8jIjpTeiKOJ7aX1U7+Cvj5IkRPlK+4rs2g6kwn3MIKLOYyBFios26XyNlJyRCm8gdYxrpCKG1FgkSYOtzyVSRupweS1EUVR4NhRM+0trUFJZjyijAaf2SArZ4zAjRUThxkCKFKf7jJTctS88pX2p/tI+du2LHGXVvqBZKuvUoqxEKwQBqHV5+NrVGalb39Cc0KyPkkgZKa23QGf7cyLtYCBFiovW+RqpyjBnpNLiuClvpCmr9r13tJyRspiMcgtrrpPSl3xp/6gQlvUBDRmpQo2X9rH9OZF2MJAixek9kGqodw9XRopd+yKNnJGKsSg8k65pXN5H+tBkfVQIG00AjTJSGg6k6t0e1Ll8eyqytI9I/RhIkeL0vkZKan8erowUu/ZFFlEUUS5lpGK0feLVPZl7SenNobJaFNrrYDYKOLVnYkgfS8pIFVfWw+PV5jo7ad9BAIgN08U3Iuo8BlKkuIY1UvpcFxHuPUGkjFR5jQsujzcsj0nKqap3w+n/O+slI3WkgoGUXnzv3z/q5O6JiI4K7WdgXBRgEACPV0SpRi8kOeQLbyYYDYLCsyGi9jCQIsU1bMir74xUuOrdk6KjIB1/y7hoX/ekbJTNbIQtKnQL+cNB3pSXGSndaNg/KrTrowDAKABp/gtJWu3cx9bnRNrCQIoUF+Mv7avQYSDldHvlevdwHRiNBgHJMVwnFSlK/eujtLyHlCQniaV9epNfIO0fFdr1UZKMBN9nn1YbTrD1OZG2MJAixUkVbw4dBlJSNgoIb717qrxOihkpvdPDZrwSKSNVaK+DRpe4UCOHy2twuLwWRoOA03qGbv+oxjLifJ0ftdoCPdyl4ETUNQykSHExjfaR0ttGnNJBMdYS3np3tkCPHKX+YDlJB4FURrwVZqMAl0dEBa8BaJ5U1jekWwJiLOEJDDLjmZEiovBhIEWKky68ub0iapweZScTZA3ro8J7dTElhp37IoWUkUrRQSBlNAjITvSV95Vp8zyYGmko6wv9+ihJhn8vMq22QOcaKSJtYSBFiosyAGajL1ujt3VSUivbcLU+l3AvqchR6m8oouXNeBvr7g+kthw3IL+grMttrD1eEfkFZdhyXIiI8dRE2oh3ZIj3j2pMykhpvtkEM1JEmsAiXFKcIPjKGI5XOWGvcaGb/0RKD+SMVJjr3VOl0j6ukdK9Mv/fWNo/TMvWbC/E1kMVAIANJQZseG0zshKseOCCgZg8OKtT4y1YvcNf5mXEst36Hk9NCu21OFBaA4MAnNYrPOujACAzwZeRKtJqRqqOpX1EWsKMFKmCdNCoqNXXib8jzJvxSpiRihxSaZ/WM1Jrthfi5uVbUXtCeW+RvQ43L9+KNdsLOzXeiWtl9Dqe2kjrowZ3Swjr519Go4yUFtfc2muVKQcnos5hIEWqIAVSeuvcVyl1YArzQZFd+yKHVNqn5a59Hq+IBat3oKXTXum2Bat3BFz2FmnjqZG8PioM+0c1JnXtq3F65GY/WiKVgydEMyNFpAW85EGqkOAvfauo0VcgJQWGzEhRqJRXa7+0b1NBWZtd1kT4urD9cdkPcjOBthQ76nQx3qaCMozKC9/6omBq2Ig3vPO3RRmRYDPDXutCsaNOcyVyjjBv4E5EXcNAilQhwX/QsOssI6XUniBSIFVW7YTXK8IQxtbrFF56aDZRUhnYepYvfjsW1MdV+3iBPi9qU+Kow77j1RAE4PQwZ6QAIDPeCnutC0X2OvTLiAv743cF258TaQsDKVIFqYxBd137FFojJWUnPF4R5TVOpPgDK9IXl8crl49quf15elz7WRwAmHFad/Twb9rbloNlNVi5+bDmxwv0eVGb7/3d+gZmxSsSEGQmWLGruFKTDSfYtY9IWxhIkSroNSPVsEYqvAdFs9GAxGgzKmpcOF7FQEqvpLI+g6DtK9jDc5ORlWBFkb2uxXVDAnwnx49efHJAG1t7vCK+2X1c8+MNVyCbEwz5+6T1UcqUJWb6yyu11gJdFEW5ikHL72eiSMJmE6QKUkbKrts1UuG/ZiGV95VynZRulTXq2Kfl8k2jQcADFwwE4AsiGpO+fuCCgQEFKVofT9KR8dRG2j8qnBvxNpbhb4He1jo0Nap2euQGI1wjRaQNDKRIFRL8gYZuM1IKXF2UOvcdYyClW9IeUkkaLuuTTB6chaVXnSrvAyTJTLBi6VWndnhfJa2OBwAP/2GwZveROl5Vjz0lVRCE8Hfsk2T5n9NijWWkpOOf2SjAaubpGZEWsLSPVKFhjZS+2nU3rJFSLiPFFuj6pYfW541NHpyFCQMzsXFPCT77Jh8TzxiBUX3SO52Z0dp4P1QmYGdRFYod2r34IXXrOykjDokKNUCRS/s0lpFyNGo0IQjazEYSRRpe8iBV4Bqp4GMLdP2TNuNN1nDHvhMZDQJG5CZjWKqIEbnJXS5v09J4N5yRCwB494dDcHu8XRpXKdL+USN7K9e2XcryaW2NVMNmvCzrI9IKBlKkCtLCWj3tIyWKIirrlNulXt6Ut5KBlF6V+rONyRreQ4oaTBiYgeSYKBQ56vDVruC2Ug+Xhv2jlGuUIWWkyqqdqHN5FJtHR7FjH5H2MJAiVZA25K2sc8uLbbWu2umB9Ksos0aKGSm9kzJSWm59Tg0sJgMuGdYdALBi00GFZ9NxZdVO7CquBABFOw4mRpsRZfKd3pRoqEzSoeCaWiLqHAZSpAqNDxwOnZT3ORotHLaYwv9Wk7v2VXONlF7pYTNeauqK4T0AAF/tKsGRilqFZ9Mxm/xlff0yYhXdckEQBLnhhJbK+7gZL5H2MJAiVTAbDYiJMgLQzzqpxuujlFg4nBrnz0ixtE+3pH2kUljapxu5qTEYnZcCrwi8q7Gs1PdyWZ9y66MkGRrcS0ou7VOgFJyIOoeBFKmG1OGpQieBlJId+4BGa6SqnBBFfZRLUlNlzEjp0swRvqzUu5u11XRC6f2jGpMzUnbtZPWYkSLSHgZSpBpSeZ9+MlLKLhyWSvucHq9ce0/6Uqaz9ufkM3FgJlJiolDsqMcXv5UoPZ2AVNQ48VuRA4Cy66MkDS3QtZORdyh8zCCijmMgRaqRKHfu08eaHketL3hRKiNlNRsRa/E9NhtO6I8oig3tzxlI6UqUyYBLTtNW04lNBWUQRSAvLQbpcc03GQ63hhbo2slIOdj+nEhzGEiRakjlDHppNtHQ+ly5gyJboOuXo84Nl8dXsslASn+uON1X3rf+92M4VFaj8Gza11DWp/z6KECbm/JKF99Y2kekHQykSDUSo/W1l5RUTqdURgpg5z49kxpNREcZYTUbFZ4NBVuv1BiM7ZMKUfRt0Kt20ka8Su4f1ViGPyNVrKn251JpH5tNEGkFAylSjQSdrZFyqCIjxb2k9KqU66N0T2qFvnLzIbhU3HTCXuvCjqO+9VEjVZKRypIDqTp4NbI3IZtNEGkPAylSjQQpI6WXQEpeI6VgIBXH0j69klufM5DSrQkDM5AaG4WSynp8vlO9TSc27y+DV/S1bpfajistLdYCgwC4vSKOV2vj849rpIi0h4EUqYbeMlKVKijTkDJSx6pY2qc3cutzBlK6FWUy4NLTcgCou+mEvD5KJWV9AGAyGpDm30tPC+ukXB4vqp0eAMxIEWkJAylSjUSb74TQrrs1UsodFFNY2qdbZezYFxGkphPf7FZv04n8ff71USrYP6oxLTWcqGy0RYWS62qJqGMYSJFq6DYjpeBBMU3elJeBlN7Ie0hxM15d65ESjTP6+ppOvK3CrFRVvRvb/eujRuSqY32URCozLHKoP5CSjnsxUUaYjDw1I9IKvltJNeSufbX6KEOT6t0VXSMlde1jaZ/uyIFULAMpvZspN504rLqmE5v3l8HjFdEjORrZiTalp9OE1HBCCxkpBxtNEGlSlwOp+npe6abg0F9GyleqoYY1UsxI6Q8zUpFj/MAMpMVZcLyqHut2FCs9nSa+36e+9VGSjATtZaTiGUgRaUqHA6lPPvkEs2bNQu/evWE2mxEdHY34+HiMGzcODz/8MI4ePRqKeVIEkLr21bm8qHN5FJ5N16mi/bl/sXWN04Map7ude5OWsP155DAbDZhxWncA6ms6Ie8fpZK2541pKiNVx0CKSIsCDqQ++OAD9OvXD9deey1MJhPuuece/Oc//8Gnn36Kf/7znxg3bhzWrVuH3r1746abbsKxY8dCOW/SodgoEwyC7/8dGs9KOd1e1Ll8JThKBlIxUUZYzb63+fFKlvfpSTkDqYhy+ek9IAjAN7uP40BptdLTAQDUON345bAdgEozUhpaIyVtl8HW50TaEnDN0WOPPYannnoK5513HgyG5vHXjBkzAABHjhzBs88+i+XLl+OOO+4I3kxJ9wwGAQk2M8prXKiodSFdJfuRdIbUaAIAYhVsNiEIAlJiLDhSUYtjVfXokRKt2FwouMoYSEWUnORonNE3DV//fgzv/HAI90zur/SUsOVAOdxeEd0SbchJVt9nS+OufaIoQhAEhWfUOm7GS6RNAZ/hbdy4MaD7devWDf/4xz86PSGKbFIgpfV1UtL6qFiLCUaDsgfv1DhfIMV1UvpR7/agqt73GkuJsSg8GwqXmcN74Ovfj+G9zYdwx/h+iDIp2y/qe5W2PZdk+kv7apweVNa7VZ3tcahg30Ei6rigfApXV1fD4XAEYyiKcAn+hfMVGt9LSjooqmE/EKkFOjv36Ud5te/1ZTQIqniNUXicOyAd6XEWHK9yYq0Kmk7k+xtNjFRZ23NJdJRJ3n6iWOXrpJiRItKmLgVSO3bswGmnnYa4uDgkJSVhyJAh2Lx5c7DmBgDo1asXBEFo9u+WW24BANTV1eGWW25BSkoKYmNjMX36dBQXK3+Aoc7RS+c+uWOfCq6AsnOf/khlfUnRUTAonPGk8DEbDbjs9BwAwIpNBxSdS63Tg58OVwBQb0YKALISfC3ZC1UeSEnrgtVwzCCiwHUpkLrxxhtx6623oqqqCqWlpbj44osxa9asYM0NAPDDDz+gsLBQ/rd27VoAwKWXXgoAuOOOO7B69Wq89957WL9+PY4ePYqLL744qHOg8NFLINWwh5Ty2QIGUvrTsD6KJ12R5rLTcyAIwHd7SrH/uHJNJ348WA6XR0RWghU9VLg+SqKVFuhsf06kTR0KpKZNm4YjR47IXx87dgwXXnghoqOjkZiYiClTpgQ9G5SWlobMzEz530cffYS8vDyMGzcOdrsdr776KhYvXoxzzjkHw4YNw+uvv44NGzbg+++/D+o8KDwSpUCqRttlaGpqZZvqL+1jIKUfZTVsNBGpuidFY1y/NADA2z8o1wpdXh+Vm6zqJg6Z8b4LSWpvge7wVzGwtI9IWzp0ufyqq67COeecg1tuuQW33XYbbr31VgwaNAjjxo2Dy+XCF198gTvvvDNUc4XT6cTy5csxd+5cCIKALVu2wOVyYfz48fJ9+vfvjx49emDjxo0YOXJki+PU19c32UhYWt/lcrngcimbCZEeP1jz0Np4sRZfbF9eXd+pxwj2/Do7ZkW17/UVE2Vo9nPh/psk+hcvlzjqAnpMrb1m9D5eS2Mec9QC8F14UMP7hOOFd7zLhnXDV7t8TSduP6t3s6YT4XgNbvQHUqf1TFT1azDdfyHpaEVNhx4r3H9j6eJhtDmwx1T6NajEmByP44VToPMQRFEUOzKw3W7HPffcgx9//BEvvvgiTCYTvvrqK3g8HowZMwann356pyYciJUrV2LmzJk4ePAgsrOzsWLFCsyePbtJUAQAw4cPx9lnn41Fixa1OM78+fOxYMGCZrevWLEC0dHqLVGIBF8eFbDqgBHDUr24uq9X6el02scHDfj0iAFjM7y4tLeyv8duu4DndhiRbhXxt1O0v9ExNby+xmR4MUPh1xeFn0cEFmwxwu4SMKuvB6emdugw3mUuL3DvJiPcooC/DXUj3RbWh++QDcUC3t1nxKAkL27or973yt9+MKLKLeCek93IjlF6NkRUU1ODmTNnwm63Iz4+vtX7dXgBR0JCAl588UV8++23mDVrFiZMmIAHH3wwLAHIq6++ivPOOw/Z2dldGmfevHmYO3eu/LXD4UBOTg4mTpzY5pMVDi6XC2vXrsWECRNgNnc9xa+18Wq2HsGqA78iNikdU6acqvj8Ojvmlv/9Bhw5iMEn5WHKhL4hnWN74+0pqcJzOzagDmZMmTKpy+MFe34cr+Nj5q/eARw5jKED+mDKuX0UnyPHC/94e6178PxX+7DLnYq/T2l6ATPUr8Gthyvhzt+M9DgLZl08oVOlfeF6DqN/P4Z39/0IryUBU6aMUt38AEAURfxl0zoAIqZOPAdZCe3voaiG12C4x+R4HC+cAu1G3uFAqqysDAUFBRgyZAi2bNmCRx55BKeccgqeeuopTJkypcMTDdSBAwewbt06/Oc//5Fvy8zMhNPpREVFBRITE+Xbi4uLkZmZ2epYFosFFkvzvVfMZrMq/nhA8OeilfFSYn0HEHudu0vjh+Jv2ZExq5y+zE9ijKXVnwnX3yQryXd501HnhlcwwGIydmm8YM+P43V8zIpa33qKtDirqt4nHC98480c2QtL1+/D9wXlOFRRj95psSGfnzTmloO+E4wRvVMQFdW1dXqhfg67Jfmel5LK+k49Tjj+xjVON1weX1YxJc4GsznwUzO1v6ZDMSbH43jhEOgcOtRsYsWKFejevTumTp2Knj174pNPPsEDDzyADz/8EI899hhmzJgRstbjr7/+OtLT0zF16lT5tmHDhsFsNuPzzz+Xb9u1axcOHjyIUaMCv/JE6iEttHVovGuf1P5cDV37EmxmmI2+K8bcS0of5K59sdyMN1J1S7ThrJPSAQDv/HAorI/duNGE2kmb8pZWO1HvVmdps8N/YcRoEBAdFdiFLiJShw4FUvPmzcNrr72GoqIifP7557jvvvsA+Bo8fPXVV5gwYUJIAhiv14vXX38ds2bNgsnUcGKakJCA6667DnPnzsWXX36JLVu2YPbs2Rg1alSrjSZI3RKlDXk1HkipaU8QQRCQEsMW6HoiB1LR7NoXyWYO7wEA+PeWw2ELEurdXmw9WA4AGKni/aMkSdFmuRlHiUOdn3+NN+NVcwdEImquQ4FUVVUVTjrpJABAXl4eampqmnz/j3/8Y0jajq9btw4HDx7Etdde2+x7Tz31FM4//3xMnz4dZ555JjIzM5uU/5G2NN5HqoN9UFRFTRkpAEhhC3RdKav2nXix/XlkO+ukNGTGW1FW7cSa7UVhecxfjthR7/YiNTYKeS2UE6qNIAjIjFf3XlLydhkqOV4QUeA6FEjNmjULU6dOxcyZMzF8+HD83//9X7P7pKenB21ykokTJ0IURfTr16/Z96xWK55//nmUlZWhuroa//nPf9pcH0XqlhjtC6Q8XhFV9W6FZ9N5atpHCmi0KW8lS/u0zusVUc59pAiAyWjAZafnAABW5IdnT6lNBb5s1IjcFM1kT6TyvkKV7iVlr1HX8YKIAtehyx+LFy/G2Wefjd9++w3XXHMNJk6cGKp5UYSymo2IMhngdHthr3UhTgWlcZ0hZaTUUNoHNAqkqpmR0rrKOjc8Xl+2NilGHa8vUs7lw3Pw7Be7kV9Qhr3HqkKeJcrfXwYAGKGBsj6JlJEqVmkgJV1442a8RNrToYwUAFxwwQW46667GERRyCT6DyYVNdpcJyWKIipVVqqRGucv7WNGSvNK/cFwrMUUcAdG0q+sBBvO6e+rBHk7xFkpjxf48WAFAF9GSitUn5FS0ZpaIuqYgAOpd955J+BBDx06hO+++65TEyLSeue+aqcH/oSBako10mLZbEIv5EYTLOsjvyukphNbD6POFbqmEwergVqXF8kxUeibrv71URI5I6XWNVL+rn1qOV4QUeACDqSWLl2KAQMG4LHHHsPOnTubfd9ut+Pjjz/GzJkzceqpp6K0tDSoE6XIIa2T0mrnPikANBsFWEwdTvqGRCoDKd2QAqkkBlLkd9ZJ6chOsKKixhXSphN7HL41UcN7JcNg0Mb6KKAhI6X6ZhM2dVQwEFHgAj7LW79+PRYtWoS1a9di8ODBiI+PR9++fTFkyBB0794dKSkpuPbaa9GjRw9s374dF154YSjnTTrWuHOfFjVeH6WWxdjs2qcfUiCVwkCK/IwGAZed7stKrdgUuvK+PXbf55mW1kcBjQIplZf2cY0UkfZ06PLHhRdeiAsvvBDHjx/Ht99+iwMHDqC2thapqak45ZRTcMopp8BgUMcVeNKuBJt/LymNrpGSri6qpfU50JCR4oa82lfm79iXxD2kqJHLTs/B05//jk0FZdhTUhX08d0eLwoq/YGUhtZHAU1L+7xeUXXZNDXtO0hEHdOpM73U1FRcdNFFQZ4KkY/2M1Lqa2UrBVJlNU64PV6YjLzgoVVl/mBYyjISAb6syzn9M7BuZzHe3XwYpwR5/F8LK1HvFZBgM6F/ZlyQRw+ttDgLBAFwe0Ucr65HepxV6Sk1ITebUNExg4gCw7MpUh1pjZS9VpvZE2nhsJoyUskxUTAIgCg2ZDS0yOMVkV9Qhi3HBeQXlMltwNUyXjiUcQ8pasWVI3zlfe9tOYz8kuC9pj1eEf/eehgAkJcaA/W/S5oyGw1yw51iu/rKmx3+cnCW9hFpj3rO9Ij8dJORUlGZhtEgIDkmCsernDhe6VTdFdlArNleiAWrd/hbGBuxbPdmZCVY8cAFAzF5cJbi44WL3LWPpX10glqnBwYBqHZ6sWKvESv2dv013fR9Amw9ZMfYRV+o/n1yoswEK0oq61HkqMMQJCg9nSYaSvt4SkakNcxIkerIXfs0u0ZKfRkpQNud+9ZsL8TNy7c22wemyF6Hm5dvxZrthYqOF07lbH9OLVizvRC3rNiKExNQXXlNa/l9ciJpnVSRvVbhmTTnYLMJIs1S15keERrqxLWakXKoMCMFaLdzn8crYsHqHS2WE0m33f3vn7G/tBqGALokekURz3+5t9XxBAALVu/AhIGZMKpsUToAlLL9OZ0g2O8RQPvvkxOptQW6xyuisp77SBFpVZcCKafTiYKCAuTl5cFkYkxGwZFo03hGSl4jpa6DolY7920qKGt2RfxEjjo3/vHJrqA8ngig0F6HTQVlGJWnvu5k5Wx/TicI93sEUP/75EQZ/oxUe89TuEml4ID6Lr4RUfs6Ff3U1NTgtttuw7/+9S8AwO+//47evXvjtttuQ7du3XDvvfcGdZIUWaTyBodGM1KVKt1cUaulfSWVgZ34nN4rCTnJ0e3e71BZDX7YXx60xw2nepcH1U4PAGakqEGw3yOAtt8nLclKaGiBribShTeb2YgolWzgTkSB69SZ3rx58/DTTz/hq6++wuTJk+Xbx48fj/nz5zOQoi5J9C+ir6x3a7JVd8MaKXVdXZQCqWMaC6QCbYwxd8JJAV0Z37i3FFe88n3QHjecyvxZWpNB4MJ0kgX7PQJo+33SkoY1UuoKpLgZL5G2deoMddWqVXjuuecwduxYCI3qrQcNGoS9e/cGbXIUmRqfIEpBiZY0dO1T14luqrxGSlulfcNzk5GVYEVrqzAE+K42D89NVmS8cCprtD5KCHCtC+lfKF7TWn6ftEReI6WyQMqh0goGIgpMpwKpY8eOIT09vdnt1dXVPLhTl5mMBsRZfAeVCg3ueSSVJKouIxXnL+2r1FZGymgQ8MAFA1v8nvRp88AFAwNe8N54vJZ+QuzgeOEk7SHF9VHUWFuv6c68R0I1ppKkQKra6WmyLklp8ma8KjteEFFgOhVInXbaafjf//4nfy0FT//85z8xatSo4MyMIpqWO/dV1kkdmNR1hTFNo2ukAGDy4CwsvepUmE44actMsGLpVad2eD8baTzp5Kqxwdnxqt0fp7za935g63M6UWuv6c6+R0I1plKio0zylhRqykqx9TmRtnXqTO+RRx7Beeedhx07dsDtduPpp5/Gjh07sGHDBqxfvz7Yc6QIlBhtxpGKWlRoMJBSe/vzsmonvF4RBo1cSZac0z8DUjPni3t5cPE5IzCqT3qnr4hPHpyFCQMzsXFPCT77Jh8nn/z/8Jf3t2P7UQd2FVXipMy4IM4+OKSMFBtNUEtOfE1PPKNr75FQjamUrAQrKuuqUOSoQ98Mdby/5YwUAykiTepURmrs2LH46aef4Ha7MWTIEHz22WdIT0/Hxo0bMWzYsGDPkSKQVjv3Od1e1Lm8AFQYSMX4MlJur6jJTN/ukkq4vUCCzYQzM0WMyE3u8smc0SBgRG4yhqWKmDY0G1OGZAIAXv56XzCmHHRSRoqlfdSaxq/pYLxHQjWmEjJU2HBCuvDGjBSRNnU4kHK5XLj22mshCAJeeeUVbNq0CTt27MDy5csxZMiQUMyRIlBitDb3kmpcex+rsmYTUSaDfLDWYnnfr0cdAIABmXEI1VLMG87MAwD896cjKLTXhuZBukDOSEUzkCLqqCwVNpxoWCOlruMFEQWmw4GU2WzG+++/H4q5EMkSNLpGSlofFWsxqfKqrdS5T2st0AFghxRIZcWH7DGG5iRiRG4yXB4Rr3+3P2SP01nyZryxDKSIOkpuga6ivaSkfaRY2kekTZ0q7bvooouwatWqIE+FqEGCzXeiqLWMlFSmEafSq4sNm/JqrxvijsKGjFQo3TiuNwBgRf5B+e+pFtI+UsxIEXVchgozUg3tzxlIEWlRp872+vbti4ULF+K7777DsGHDEBMT0+T7t99+e1AmR5FL6xkpta2Pkmi1BbrXK2KnPyM1MCsOewtD91hn9UtH3/RY7C6pwtv5B3HjuLzQPVgHSftIcY0UUcfJpX0qykhxQ14ibetUIPXqq68iMTERW7ZswZYtW5p8TxAEBlLUZdIaKXuttjInDXtIqTQj5T8BL63WViB1uLwWlfVuRBkN6J0Wg1Bu+20wCLjhzN64698/47XvCjB7TC6iTJ1K3gddObv2EXWa1GyiWEWBlIP7SBFpWqfO9goKCoI9D6ImNJ+RUunVRbm0r1JbAeqOQjsAoF9mLMzG0Ac104Z2wxOf7UKxox4fbjuCS0/LCfljtscrNpS6MiNF1HFZCTYAvtLmercHFpNR4RkB9lp17jtIRIHp8hmJKIoQRTEYcyGSJdq02bVP9Wuk4rS5Ka/UsW9QVkJYHi/KZMC1Y3IB+Fqhe73Kf8bVun3BFMCMFFFnJEWb5exyiUMdn4Fsf06kbZ0OpJYtW4YhQ4bAZrPBZrPh5JNPxptvvhnMuVEEi9doRsqh9jVSsdoMpKSOfQOzQ9ex70RXjOiBWIsJu0uq8NXvJWF73NZU+V5aiLOawpKVI9IbQRCQEe/7DFTDOqk6lwdOt3/fQQZSRJrUqaPx4sWLcfPNN2PKlClYuXIlVq5cicmTJ+Omm27CU089Few5UgSS95HSWiCl9jVS/rbZWuvaJ3XsC2cgFW8148oRPQAAL65XfoPeKv9bgWV9RJ2XFe8r71ND5z7peGEQgNgodR4ziKhtnXrnPvvss1i6dCmuvvpq+bYLL7wQgwYNwvz583HHHXcEbYIUmaQyB6fbizqXB1az8rXsgdDKGqljVfUQRRFCqHa2DaKyaicK/Sc9vj2kwldmN3tMLl77rgCbCsrw48FynNIjKWyPfaIql+9vxbI+os6TWqCroeGEXb7wZoZBhfsOElH7OpWRKiwsxOjRo5vdPnr0aBQWhrAvMUWMxhvaammdlOrXSPkDKafbi6p6t8KzCYxU1tcrJRqxlvA+r5kJVkwb2g2Ab62Ukqr9fy5mpIg6T2qBXqiGjBTXRxFpXqcCqT59+mDlypXNbn/33XfRt2/fLk+KSBAETXbuq6xTdytbW5QRMVG+7J5Wyvt+Perr2BfOsr7GbjjTt0Hvml+LsP94tSJzABpK+7gZL1HnSS3Q1bBGysGOfUSa16l374IFC3DZZZfh66+/xpgxYwAA3333HT7//PMWAyyizki0mVFW7URFjTZO+IGGA6NaM1KAr3NfdWkNjlfVIzc1pv0fUJi0PmpQdng69p2oX0Yczj4pDV/uOoZ/frsPD100RJF5VLl9GdrkWAZSRJ0lb8qrgowUN+Ml0r5OZaSmT5+O/Px8pKamYtWqVVi1ahVSU1OxadMm/OEPfwj2HClCabFzX2W9PyOl4gNjw15S2ujcJ3fsy1ImIwUAN47LAwC8t/mwYh0Pq/1vg2RmpIg6Tc5IqSCQcqi8goGI2tfpy+bDhg3D8uXLgzkXoia02LlPLtVQc0ZK7tyn/kCq1unB3mNVAIBBCpX2AcCI3GT8v+4J+OmwHcs2HsDcCf3CPgeptC+Za6SIOi3Tn5EqqayD1ysq2uTBXsNAikjrOpWR+vjjj/Hpp582u/3TTz/FJ5980uVJEQEN5Q4OjQRSoiiqfo0U0Lhzn/pLJncVV8Ir+oK/NP9mwkoQBEHOSi3buB81zvA36qj2l/alsLSPqNPS4ywQBMDlEVFarexnoNxsIlq9xwsialunAql7770XHo+n2e2iKOLee+/t8qSIAN8aKUA7XfuqnR54/Z2541QcSKX4A6lSDWSkpLK+AVnxirdqnzQoEz1TolFR48J7mw+H/fHZbIKo68xGg3wxSekW6FLZuporGIiobZ0KpHbv3o2BAwc2u71///7Ys2dPlydFBEBzXfukbJTZKMBq7tRbKyzSNFTaJ3XsU6rRRGNGg4Drz/B18Hvlm31we7xhffyG9ufKZeaI9EAtLdClUnA2myDSrk6d7SUkJGDfvuZ7quzZswcxMervAkbakOC/8q6VNVINHfvMimdP2iI3m9BAaZ/UsU+p1ucnunRYdyTHROFweS0+2V4UtsetdXrg9Eob8vKki6gr1NICXc5IMZAi0qxOBVLTpk3DnDlzsHfvXvm2PXv24M4778SFF14YtMlRZNNaRqqhA5O6yzRS46RASt0ZKY9XxG+FlQCU7djXmNVsxKxRvQD4NugVRTEsj1vu3wLAbBTCvikxkd5kyp37ahWdh3zMYCBFpFmdCqQee+wxxMTEoH///sjNzUVubi4GDBiAlJQUPPHEE8GeI0WoRI0FUlJpn5rXRwHaaX9ecLwatS4PbGajqva7+r9RPWE1G/DLETs27i0Ny2OW+XufJ0dHqTrbSaQFmfJeUsp+BrL9OZH2derSZkJCAjZs2IC1a9fip59+gs1mw8knn4wzzzwz2POjCCZ1MrJrZENerexSL7U/r3Z6UOv0wBZlVHhGLZPK+vpnxcGoYIviEyXHRGHGaTlYtvEAXvp6H0b3SQ35Y5b53wNJbH1O1GVSRkrxZhM10oa86j5mEFHrOv3uFQQBEydOxMSJE4M5HyKZ1kr75IyURd1XF2MtJkSZDHC6vTheVY+c5Gilp9QiNWzE25rrx/bG8u8PYP3vx7Cz0IEBIZ5jub9NczLbJBN1WUOzCeVK+7xeEZX10sU3vq+JtKpDpX0bN27ERx991OS2ZcuWITc3F+np6bjhhhtQX6/uciHSjsalfV5veNaidIWjThsZKUEQkBar/nVSaurYd6IeKdE4b0gWAOCVr5s33gm2Mv+Va2akiLouI0HKSCn3+VdZ74a0xJKlfUTa1aFAauHChfj111/lr3/55Rdcd911GD9+PO69916sXr0ajz76aNAnSZFJukrnFYEqBTZA7SiHRtZIAQ3lfWrt3CeKYkNGSiUd+05045m+Vuj//ekojlaE9sq2nJFiIEXUZVJpX1W9W64kCDdpo3mLyQCrWZ3l1UTUvg4FUtu2bcO5554rf/3OO+9gxIgReOWVVzB37lw888wzWLlyZdAnSZHJajbK+zHZNbApr7xGShOBlLozUscq61Fa7YRBAE7KiFN6Oi06uXsiRvVOgdsr4rVvC0L6WPIaKZb2EXVZjMWEOH93VaXWSbH1OZE+dCiQKi8vR0ZGhvz1+vXrcd5558lfn3766Th06FDwZkcRT0vrpBq69qm7tA9Qf+e+X/3ZqLy0WNU2wwCAG8f5slJvbzoY0teo3LWPGSmioGhoga7MZ6BUwcDNeIm0rUOBVEZGBgoKfFdenU4ntm7dipEjR8rfr6yshNnMDwUKnkSbf1NeLWSk6rSzcDg1TirtU2cgpbaNeFszrl8a+mfGodrpwVv5B0L2ONI+Umw2QRQcmQo3nJBK+9S+7yARta1DgdSUKVNw77334ptvvsG8efMQHR2NM844Q/7+zz//jLy8vKBPkiIXM1KhkRLjz0hVq3ONVEOjCXUHUoIg4I9n+LJSr3+3H/VuT0gehxkpouBSugW6VArOjBSRtnUokHrwwQdhMpkwbtw4vPLKK3jllVcQFdVwYH/ttdfYDp2CStpLqqJWnSf8jTVcYVT/gTE1Tt2lfQ2tz9XXse9EF/y/bGQlWHGssh6rfjwSksco5xopoqBqyEgpFEjVcY0UkR506NJ5amoqvv76a9jtdsTGxsJobLp24b333kNsbGxQJ0iRTVsZKW20Pwcad+1TXyBVVe/G/tIaAOov7QOAKJMB147JxcMf78TLX+/DRSdnBnV8j1dERS0zUkTBlJmgbEbKrqELb0TUug5lpCQJCQnNgigASE5ObpKhIuoqeS8pTayR0s6BsWEfKfVl+nb610dlJVg1EzhcPjwHcVYT9h6rxotf78OW4wLyC8rgCcL+Z6VV9fJ+M7uKKoMyJlGkk5tNKFbax2YTRHrQqUCKKFy0kpFyur2oc3kBaCOQkrr22WtdcLq9Cs+mqYayPvVnoyRxVjNG9U4BADz1+V4s223EVa9txthFX2DN9sJOj7tmeyGmPPON/PU1/9ra5TGJqCEjVaRQaV9D+3P1VzAQUetUH0gdOXIEV111FVJSUmCz2TBkyBBs3rxZ/r4oirj//vuRlZUFm82G8ePHY/fu3QrOmIIpUVojpfKMVONNHWM10GwiwWaGySAAAEqr1VXep/aNeFuyZnshPttR3Oz2Insdbl6+tVOBz5rthbh5+dZmWcOujElEPlJG6niVU5GLSVKXV2akiLRN1YFUeXk5xowZA7PZjE8++QQ7duzAk08+iaSkJPk+jz32GJ555hm8+OKLyM/PR0xMDCZNmoS6OmWuMlFwxWskIyWtj4q1mGD0ByhqZjAIctlcqcrK+34t1EbHPonHK2LB6h0tfk8qwluwekeHSvKkMVv6ic6OSUQNkmOiEGX0nQIpsU6Ka6SI9EHVl84XLVqEnJwcvP766/Jtubm58v+LooglS5bg73//O6ZNmwYAWLZsGTIyMrBq1SpcfvnlLY5bX1+P+vqGq/AOh+8KuMvlgsul7Am79PjBmofWx4uL8h3oymucAT1msOcX6JhlVb69SGItxnYfWy1/k5SYKJRU1qOoohonpUerYn4ujxe7iioBAH3Tolv8GbU8f5L8grI2O3+J8HUGu+nNH+Sr4O0pctQFNObGPSUYkZvcwRmr7znkeOoeLxRjqmG89HgLDpfX4khZFTLjmgY0oZ6f3d+JMyZK6NRjqOH5C/eYHI/jhVOg8xBEUVTtJc2BAwdi0qRJOHz4MNavX49u3brhT3/6E/74xz8CAPbt24e8vDz8+OOPGDp0qPxz48aNw9ChQ/H000+3OO78+fOxYMGCZrevWLEC0dHRLfwEKeVAJbB4uwlJUSLmDwvNHj3BsMsu4IUdRmTZRNw7VL3zbGzpDgN+sxswM8+DEenq+Bg4Wg0s+tkEq1HEo6d7oIHkHrYcF7Bsd/PmO+FwdV8PhqWq429HpDVPbzdiX6WAa/p6cEqY30f3bTbC4RLwlyFu5LDZMZHq1NTUYObMmbDb7YiPb71CRtUZqX379mHp0qWYO3cu/vrXv+KHH37A7bffjqioKMyaNQtFRUUAgIyMjCY/l5GRIX+vJfPmzcPcuXPlrx0OB3JycjBx4sQ2n6xwcLlcWLt2LSZMmACzuespf62Pd6C0Bou3fwsnTJgyZVLY5xfomIZfi4EdPyE7LQlTpgwP6xw7O95Xtb/gt22FyO7dH1PObMj0Kjm/D348Cvy8HUNyknH+1NO7PF6w59eSlIIyLNu9ud37Tft/WeiWaAtozCMVtfjwp/bXQE08Y0SnM1Jqeg45nrrHC8WYahjvs6qfse+XImTlDcCUMb3COr97Nq8D4MWUCWchJ6njF3DV8PyFe0yOx/HCSapWa4+qAymv14vTTjsNjzzyCADglFNOwfbt2/Hiiy9i1qxZnR7XYrHAYrE0u91sNqvijwcEfy5aHS8lznfiWe30AAYjzMbAlvWF4m/Z1pi1Lt/VzIToqIAfV+m/SXq877ktr3W3+HNKzG9XSTUAYFB2Qrv3Vfr5k4zqk46sBCuK7HUtrmkS4OsQtviyUwJeP+fxiti0v7zdMUf1Se/Smjy1PIccTxvjhWJMJcfL9l/YOFblavVnQjE/r2CQu7ymxEZ3aXy1/z1CMSbH43jhEOgcVN1sIisrCwMHDmxy24ABA3Dw4EEAQGamb+PL4uKm3bKKi4vl75G2Nd71Xc0NJ6Q9pOI00LFPkirvJaWern1a7NhnNAh44ALf59SJIY309QMXDOxQwBOKMYmoqQz/msXCMDebcNS65f/XQpdXImqdqgOpMWPGYNeuXU1u+/3339GzZ08AvsYTmZmZ+Pzzz+XvOxwO5OfnY9SoUWGdK4WG0SDIwYm6AynfgVFLHZhSYtXVtU8URfx6VFsd+ySTB2dh6VWnynvTSDITrFh61amYPDhLFWMSUYOsBF9GqjjMe0k1vvDGiyFE2qbqSyF33HEHRo8ejUceeQQzZszApk2b8PLLL+Pll18GAAiCgDlz5uChhx5C3759kZubi/vuuw/Z2dm46KKLlJ08BU1itBmVdW5V7yUl7VLPjFTnHamohaPODbNRQN/0OKWn02GTB2dhwsBMbNxTgs++ycfEM0Z0ufQuFGMSkU9mgu8zsCjMGSm2PifSD1Wf9Z1++un44IMPMG/ePCxcuBC5ublYsmQJrrzySvk+d999N6qrq3HDDTegoqICY8eOxZo1a2C1BtZmmNQvwWbGIdTKwYoaSftIxWtoc0W1BVK/+sv6+qTHIcqk6mR5q4wGASNyk1G6U8SI3OSgBDyhGJOIgEwpI+Wog9crwhCm95Z0LONmvETap+pACgDOP/98nH/++a1+XxAELFy4EAsXLgzjrCicEm2+ErSKWnWUoLVEk2uk4nzPa1m1Ex6vqPgJurQ+SmtlfUSkTelxFggC4PKIKKtxyheXQk3OSNm0c7wgopZp87IvRRTpqp1dxaV9lXXaK9VIjo6CIABe0RdMKW1Hob/RRBYDKSIKPbPRgJQYf3lfGNdJSWtqmZEi0j4GUqR6CdG+g02Fikv7pC5MWspImYwGJEf7slJqKO9jRoqIwi3L38wlrIEU10gR6QYDKVI9OSOl4kCqsl4q1dDWgVEqZVG6c19FjRNHKmoBAAMYSBFRmEgt0MPZcEIOpDR2vCCi5hhIkeolaqC0T8pIxWsoIwU0tEBXOiMllfXlJNt4lZaIwkaRjFQdm00Q6QUDKVI9tWekRFHU5BopQD2d++SyvqwERedBRJFF2qctnBmphvbn2rrwRkTNMZAi1UtU+RqpaqcHXtH3/3EaDaSOqSSQGsiyPiIKI7m0L6xrpPzNJqK1dbwgouYYSJHqxas8IyVlo8xGAVaztt5SUgv045XKrpFixz4iUkKWohkpBlJEWqetsz6KSPI+UipdI9XQsc8MQdDWZqlqKO2rc3mwu6QKADCoGwMpIgofKSNVzDVSRNQJDKRI9aTyB0etC6IoKjyb5hrWR2mv3j1N6tpXrVwgtbu4Ch6viKRoMzL9JzVEROEgrZGqrHejqt4dlse0s2sfkW4wkCLVk7r2OT1e1Lo8Cs+mOenqotbWRwGNuvYpWNq3o9AOwLc+SmsZPSLStliLCXEW30WwcKyTEkVRbn/OjBSR9jGQItWLjjLCZPCdYKtxnVSlf5f6eJv2MlKpjTJSSmX7fpU34mXHPiIKv4wwtkCvqm9oTsQ1UkTax0CKVE8QhIbOfSpcJyVdXYyzaO+gKGWkXB5RsSBV7tjHRhNEpIBwNpzQcnMiImqO72LSBDV37nNoOCNlMRnltV1KNJzwekXsLGTrcyJSjtxwIgyBlHS8SLBprzkRETXHQIo0QVonpcqMlIbXSAFAapx/LykF1kkdKKtBtdMDi8mA3qkxYX98IiIpI1Vorw35Y7H1OZG+MJAiTZAW5TpUmJGS10hp9MCYqmDnPqmsr39mHExGfhwRUfg1bMob+s/AhjW12jxeEFFTPHMhTUiM9u8lVavsxrEtkddIabD9OQCkyp37wh9I/XpU6tjHRhNEpAxp24UiRxgzUgykiHSBgRRpQoKK10hp/Qpjw6a84Q9Sd3B9FBEpLDMhfBmpxmukiEj7GEiRJiRoYo2UVjNSUiClXGkfO/YRkVKkQKq0uh5Otzekj+Wo1e4G7kTUHAMp0gRNZKQ0vkYq3IHUscp6lFTWQxCAAVlxYX1sIiJJcnQUoowGiCJQUhnazn3MSBHpCwMp0gRpHyk1BlJ6WSN1LMylfVJZX25qDKKjtPncEZH2GQwC0uN9F5RC3QLdwTVSRLrCQIo0QQsZKa1eYZTan5eGOSPFsj4iUgup4UShPTwZKa1WMBBRUwykSBOkjJTa1ki5PF7UujwANJyRimko7RNFMWyPK3XsG8SOfUSksIaGE6EOpHzHMK1eeCOiphhIkSaoNSMlZaMAINai0UAqzlfaV+fyotrpCdvjsmMfEamFlJEKfWmf1OVVm8cLImqKgRRpQoLNd7LvqHPB6w1f1qQ9Ur17TJRRsxvKRkeZEB1lBBC+vaRqnG4UHK8GwNI+IlKelJEKfWkfM1JEeqLNMz+KONJBRxSbZoGUJh0Utb5wONyd+3YWVkIUgfQ4C9L8a7SIiJQiBVIhz0hxjRSRrjCQIk2IMhnkrImayvukoE6r66MkUue+cAVSLOsjIjXJCkNGyuMFavzl08xIEekDAynSDHlT3trwtuluS8Pmito+KDZkpMLz3LJjHxGpSYZ/jVSJI3RNd2obLUHV+sU3IvJhIEWaocaGE3rJSKWEubRvBzv2EZGKpMf5Aimnx4uy6tBcUKrxV6XHWkyaXVNLRE3xnUyaIWekVNQCXS9rpNLCWNrn9njxW1ElAJb2EZE6RJkMcmY+VOV9/oZ9iNf4hTciasBAijRDjRkph04yUtKmvMcrQ1/at+94NerdXsREGdEzOTrkj0dEFIjMBN/nYKgaTtR6BADav/BGRA0YSJFmSJvyqiqQ0t0aqdBnpKT1UQOy4mEwCCF/PCKiQGTG2wCEISPFQIpINxhIkWaoMSPVsEZK2wfGsAZS7NhHRCoU6oxUjb/ZhNYvvBFRAwZSpBmJ0b51PBU1KuraJ6+R0nhpn3+NVGkYuvb9KjeaYCBFROqRGR/aFuhSRoqtz4n0g4EUaUa8KjNS+ijtk7r2Vda7Ue/ytHPvzhNFsVHrc3bsIyL1yEzwlfaFLCPlltZIafvCGxE1YCBFmpGoxq59tfpoNhFvNSHK3473eIha/wJAkaMO5TUuGA0C+mbEhuxxiIg6SspIFYUqI+W/RsWMFJF+MJAizVDlGql6fbQ/FwRBLu8L5aa8vx7xZaP6psfCajaG7HGIiDoqMyHEgZTc/lzbxwsiasBAijRDnV37fEdGPewLIrdAD2HDCbnRRBbXRxGRukiBVGW9G1X17qCPz659RPrDQIo0Q20ZKVEUdbNGCmjo3BfKhhPy+ig2miAilYm1mBBr8V0UK3YE/4KStEaKpX1E+sFAijQj0eYrPatxeuB0exWeDVDt9MAr+v5f6+3PgUad+0K4RurXQl/HPgZSRKRGUlYqFA0nauX259qvYCAiHwZSpBlxVhME//6tashKSdkos1GA1az9t1KKvJdUaAIpR60Lh8pqAbC0j4jUSWo4EYqMlNz+PFr7F96IyEf7Z38UMQwGQS6hs9cqv5dUQ8c+MwQpwtOwUJf2/VZcCQDolmiT9wQjIlITueFEkDNSoihyQ14iHWIgRZqipnVSDeuj9FGmIXftqw5Ns4kdhb5AimV9RKRWocpI1bo88IpcI0WkNwykSFOkzn1q2EvK4Q+k9LA+CgDSQlzat1MKpFjWR0QqlRGijJTdX8FgNAiIjuLWD0R6wUCKNEVdGSl/63Od7FIvtT8PVWnfTmakiEjlskKUkWpcwaCHUnAi8mEgRZoiBVKqyEj5g7k4iz4yUtIaqYpaFzxBboro9gJ7jlUBAAYxkCIilQpV1z67vOegPo4XROTDQIo0RU0ZKYfOMlKJNjOMBt+V0qog70VZVAu4PCLirSZ0S7QFd3AioiCRAqnj1c6gXlCSSsH1crwgIh8GUqQp0hopdQRS+lojZTAISI7xNZyoDPLTe7jaF6ANzI5nWQsRqVZydBTMRgGiCNiD+DnoYEaKSJcYSJGmqCkjJa+R0tGBUSrvq3QGN9g54g+kBmUnBHVcIqJgMhgEpMf5slL2IC4XdeisyysR+TCQIk1JtPkyJhU1athHSspI6efAKLVAD3ZGSgqk2LGPiNQuy1/eVxHEC0oNpeD6ufBGRAykSGPi1ZiR0tGBUWqBHsxAyusVcaTG9/+DujGQIiJ1k1qgBzUjVcuMFJEeMZAiTZH3kVJBINWwRko/B8Zkf0Zqj0NAfkEZPF6xS+N5vCI++qUQdR4BRgPQKyUmGNMkIgqZDP9WELsqgvc5uPdYNQDfRcCujkdE6qHqQGr+/PkQBKHJv/79+8vfr6urwy233IKUlBTExsZi+vTpKC4uVnDGFGrSGimHCgIpva2RWrO9EO/+cAgAsKPCgKte24yxi77Amu2FnR5v7KIvcOe/twMAPF7g7Ce+6vR4REShtmZ7Id7bchhAcD8Hv9lTCgBYueVIl8YjInVRdSAFAIMGDUJhYaH879tvv5W/d8cdd2D16tV47733sH79ehw9ehQXX3yxgrOlUJMzUjUuiKKyV/X0tEZqzfZC3Lx8qxwcSorsdbh5+dYOH/Sl8QrtTfdi6ex4REShxs9BIuoo1QdSJpMJmZmZ8r/U1FQAgN1ux6uvvorFixfjnHPOwbBhw/D6669jw4YN+P777xWeNYWKlJFye0XUOD2KzkU62CZofI2UxytiweodaCkslW5bsHpHwOUowR6PiCjU+DlIRJ2h+kvpu3fvRnZ2NqxWK0aNGoVHH30UPXr0wJYtW+ByuTB+/Hj5vv3790ePHj2wceNGjBw5stUx6+vrUV9fL3/tcDgAAC6XCy6XsiVj0uMHax56G88EEWajAJdHxHFHDaJO2Nw12PNrbUyXx4taly+Qsxo79nhKP4cnyi8oa3bFtDERQKG9Dqc9tBYWU/vXXurdXpTXtD4XabyNe0owIje5w/NV2/MX6vFCMSbH43hKj6m28fg5yNcMx9PXeF0V6DwEUen6qDZ88sknqKqqwkknnYTCwkIsWLAAR44cwfbt27F69WrMnj27SUAEAMOHD8fZZ5+NRYsWtTru/PnzsWDBgma3r1ixAtHR0UH/PSi4/r7ZiEqXgLtPdqObQr0LqlzA3zb7rkMsHumGUcN7zG45LmDZbmPYH/fqvh4MS1Xtxw8RRRB+DhJRYzU1NZg5cybsdjvi41vvOKzqjNR5550n///JJ5+MESNGoGfPnli5ciVsNlsbP9m2efPmYe7cufLXDocDOTk5mDhxYptPVji4XC6sXbsWEyZMgNnc9ZIxPY73zJ7vUHmsGkOGjcTI3k2v5AV7fq2NeaC0Btj8LWKijLhg6sQujxfs+XVESkEZlu3e3O79HrxwAIZ0a39D3V+O2HHff3e2e7+JZ4zo9JVYNT1/oR4vFGNyPI6n9JhqG4+fg3zNcDx9jddVUrVae1QdSJ0oMTER/fr1w549ezBhwgQ4nU5UVFQgMTFRvk9xcTEyMzPbHMdiscBisTS73Ww2q+KPBwR/LnoaLzE6CkA1ql3eVn8mFH/LxmPW+tcix9s6/zhq+ZuM6pOOrAQriux1LdbzCwAyE6yYOTIXRkP7qbchOcl4YX1Bu+ON6pMe0HitUcvzF67xQjEmx+N4So+plvH4ORia8UIxJsfjeOEQ6BxU32yisaqqKuzduxdZWVkYNmwYzGYzPv/8c/n7u3btwsGDBzFq1CgFZ0mhlmhr6NynFD3tIWU0CHjggoEAfAf3xqSvH7hgYMAH+2CPR0QUavwcJKLOUHUg9Ze//AXr16/H/v37sWHDBvzhD3+A0WjEFVdcgYSEBFx33XWYO3cuvvzyS2zZsgWzZ8/GqFGj2mw0QdondcmzK7iXVGWdtEu98ldNgmHy4CwsvepUZCZYm9yemWDF0qtOxeTBWYqOR0QUavwcJKKOUvXl9MOHD+OKK65AaWkp0tLSMHbsWHz//fdIS0sDADz11FMwGAyYPn066uvrMWnSJLzwwgsKz5pCLUHaS0rBQMrhr+3TQ0ZKMnlwFiYMzMTGPSX47Jt8TDxjRJfKToI9HhFRqPFzkIg6QtVnge+8806b37darXj++efx/PPPh2lGpAZqyEhJpX3xGt9D6kRGg4ARucko3SliRG5ylw/2wR6PiCjU+DlIRIFSdWkfUUukNVJ2RddI6S8jRURERESBYyBFmiOV9nGNFBEREREphYEUaU6iLQoAUFHrVGwODWukGEgRERERRSIGUqQ58SpYIyVnpGws7SMiIiKKRAykSHMSo9W0jxQzUkRERESRiIEUaY7Uta+yzg2Pt6U940Ov0t9sIp7NJoiIiIgiEgMp0pyERi3HHQqV9zEjRURERBTZGEiR5piNBsREGQEot05KykglcI0UERERUURiIEWalBgtde4LfyAliqKcCWNGioiIiCgyMZAiTVKyc1+10wNpaRb3kSIiIiKKTAykSJMSbVLnvvDvJSW1PjcZBFjNfAsRERERRSKeBZImSQ0nlGg2IW3GG28zQxCEsD8+ERERESmPgRRpkrSXlBKlfZVyxz42miAiIiKKVAykSJMSbMptyiu1Puf6KCIiIqLIxUCKNEnJZhNS63NmpIiIiIgiFwMp0iSptE+J9ufSuixmpIiIiIgiFwMp0qQEBTNSDmakiIiIiCIeAynSpESbb0Neu5JrpGzMSBERERFFKgZSpElKZqS4RoqIiIiIGEiRJjWskQr/hrxcI0VEREREDKRIk6SyujqXF3UuT1gfW8pIsbSPiIiIKHIxkCJNirOYYBB8/+8Ic3mfgxvyEhEREUU8BlKkSQaDoNheUnJGiqV9RERERBGLgRRpVqJNmb2kpAwYM1JEREREkYuBFGmW3LkvzC3QpYxUAtdIEREREUUsBlKkWQnRvr2kwpmRcnm8qPU3t2BGioiIiChyMZAizVJiLykpGwUAsRYGUkRERESRioEUaVaiXNoXvr2kpPVRMVFGmIx8+xARERFFKp4JkmYpmZHiHlJEREREkY2BFGlWYnT4u/ZxDykiIiIiAhhIkYYpsY9UpT+Q4h5SRERERJGNgRRplryPVBjbnztqfaV9zEgRERERRTYGUqRZ0hophwKlfVwjRURERBTZGEiRZiUqsI+Uo44ZKSIiIiJiIEUa1rhrnyiKYXlMrpEiIiIiIoCBFGmY1LXP4xVRVe9u597B0bBGioEUERERUSRjIEWaZTUbEWXyvYTD1blPzkjZWNpHREREFMkYSJGmhbtzX8M+UsxIEREREUUyBlKkaeHu3FfpbzYRz2YTRERERBGNgRRpmrROKlyd+5iRIiIiIiKAgRRpXOPOfeEgZaQSuEaKiIiIKKIxkCJNS7D595IKwxopURTlQIoZKSIiIqLIxkCKNC2cGakapwcer2+/Ku4jRURERBTZGEiRpklrpOy1zpA/lsOfjTIZBFjNfOsQERERRTKeDZKmhTMjVSV17LOZIQhCyB+PiIiIiNSLgRRpmty1LwxrpBo69rHRBBEREVGkYyBFmhYfxoxUZb20hxTXRxERERFFOgZSpGmJtjBmpGqljn3MSBERERFFOgZSpGnSGikHM1JEREREFEYMpEjTEqN9+0hV1rvh9nhD+liVtVwjRUREREQ+DKRI0+IbBTVSe/JQkTNSNmakiIiIiCIdAynSNJPRgDiLL5iqqAntXlJSoMaMFBERERFpKpD6xz/+AUEQMGfOHPm2uro63HLLLUhJSUFsbCymT5+O4uJi5SZJYReuzn2VdVwjRUREREQ+mgmkfvjhB7z00ks4+eSTm9x+xx13YPXq1Xjvvfewfv16HD16FBdffLFCsyQlyHtJhTyQ4hopIiIiIvLRRCBVVVWFK6+8Eq+88gqSkpLk2+12O1599VUsXrwY55xzDoYNG4bXX38dGzZswPfff6/gjCmcwtW5T85IcY0UERERUcTTxKX1W265BVOnTsX48ePx0EMPybdv2bIFLpcL48ePl2/r378/evTogY0bN2LkyJEtjldfX4/6+nr5a4fDAQBwuVxwuULfRrst0uMHax6RMJ7UcKK0si7o82s8llQ6GG0SujS+Gp9Djqfe8UIxJsfjeEqPyfH0PV4oxuR4HC+cAp2HIIqiGOK5dMk777yDhx9+GD/88AOsVivOOussDB06FEuWLMGKFSswe/bsJkERAAwfPhxnn302Fi1a1OKY8+fPx4IFC5rdvmLFCkRHR4fk96DQeWevARtLDJiS48Gk7qF7Od+32QiHS8BdJ7vRPSZkD0NERERECqqpqcHMmTNht9sRHx/f6v1UnZE6dOgQ/vznP2Pt2rWwWq1BG3fevHmYO3eu/LXD4UBOTg4mTpzY5pMVDi6XC2vXrsWECRNgNne9hCwSxvv1s9+xsWQ/0rvnYsKEvKDOr/EcXTAC8GLyuWehR3LnA241PoccT73jhWJMjsfxlB6T4+l7vFCMyfE4XjhJ1WrtUXUgtWXLFpSUlODUU0+Vb/N4PPj666/x3HPP4dNPP4XT6URFRQUSExPl+xQXFyMzM7PVcS0WCywWS7PbzWazKv54QPDnoufxkmJ8QXZlvVceI9jz83iBWpdvw9+UOFtQxlbTc8jx1D9eKMbkeBxP6TE5nr7HC8WYHI/jhUOgc1B1IHXuuefil19+aXLb7Nmz0b9/f9xzzz3IycmB2WzG559/junTpwMAdu3ahYMHD2LUqFFKTJkUIHXts9eGbh+pWk/D/8daVP22ISIiIqIwUPUZYVxcHAYPHtzktpiYGKSkpMi3X3fddZg7dy6Sk5MRHx+P2267DaNGjWq10QTpT0IY9pGq9TXsQ0yUESajJppdEhEREVEIqTqQCsRTTz0Fg8GA6dOno76+HpMmTcILL7yg9LQojBLDEEjV+TNScdyMl4iIiIigwUDqq6++avK11WrF888/j+eff16ZCZHipH2dKmpCF0jVeAT/Y2nuLUNEREREIcAaJdK8cJT2+ffiZUaKiIiIiAAwkCIdkJpN1Lu9qHN52rl350jNJqTNf4mIiIgosjGQIs2LtZhgNPhK70KVlaplRoqIiIiIGmEgRZonCELIy/tquUaKiIiIiBphIEW60BBIuUMyPtdIEREREVFjDKRIF0KfkfL9N56BFBERERGBgRTpRMgDKX9GiqV9RERERAQwkCKdkDr3hTojxdI+IiIiIgIYSJFOhHyNlNRsgu3PiYiIiAgMpEgnEsNU2seMFBEREREBDKRIJ+LD1GwigWukiIiIiAgMpEgnEqOjAIQmkBJFke3PiYiIiKgJBlKkC/IaqbrgB1I1Tg+8kNZIMZAiIiIiIgZSpBNy176a4DebcPjTUSaDAKuZbxkiIiIiYiBFOiFlpBwhyEhV+QOpOKsJgiAEfXwiIiIi0h4GUqQLjbv2ecXgji0FZ3FsfU5EREREfgykSBekrn1eEaj3BHfsynpfRorro4iIiIhIwkCKdMFqNsrrl4K9TMpR21DaR0REREQEMJAiHZHWSQU7kJIyUgykiIiIiEjCQIp0I9Hm20uqxh3chhCVtVwjRURERERNMZAi3ZAzUlwjRUREREQhxkCKdCMhOjSlfdI+UnEWZqSIiIiIyIeBFOlGyNZISYGUjYEUEREREfkwkCLdSJQDqSCvkZL2kWJGioiIiIj8GEiRbkgZqdoQZaS4RoqIiIiIJLzETrqR6F8jVR2qNVLs2kdERBoniiLcbjc8nobOTC6XCyaTCXV1dU1u74pgj8nxOF4wGY1GmEwmCELXqph4Zki6ER+ijFQVAykiItIBp9OJwsJC1NTUNLldFEVkZmbi0KFDXT6xDNWYHI/jBVt0dDSysrIQFRXV6TF4Zki6kRgdmn2kHHXcR4qIiLTN6/WioKAARqMR2dnZiIqKkk9YvV4vqqqqEBsbC4MhOKs+gj0mx+N4wSKKIpxOJ44dO4aCggL07du304/JM0PSjVB07XN5vKh1eQFwjRQREWmX0+mE1+tFTk4OoqOjm3zP6/XC6XTCarUGNZAK5pgcj+MFk81mg9lsxoEDB+TH7Qw2myDdSAxBICU1mgCAWIsxeAMTEREpIBwnqURaEIz3At9NpBtSRqreK8Dl8QZlTKn1ucUgwmTk24WIiIiIfHhmSLohNZsAAEetKyhjOvydK7g8ioiIiIgaYyBFumIz+17SX+8uhccrdnk8e43T9z8ikF9QFpQxiYiItMrjFbFxbyk+3HYEG/cG51hLpFUMpEgX1mwvxNhFX8iNIe7+z3aMXfQF1mwv7NKYt77zIwDA7hJw1WubuzwmERGRVknH2ite+R5/fmcbrnjl+5AfF6+55hoIggCj0Yj09HT069cPCxcuhNsd5L1OguSrr76CIAioqKhQeioR64033kBiYmJYHouBFGnemu2FuHn5VhTa65rcXmSvw83Lt3bqA14as6KmaYlgV8YkIiLSqlAcawM1efJkHDlyBJs3b8Ydd9yB+fPn4/HHH2/xvk6nM2Tz0BuPxwOvNzhryhuLpL8BAynSNI9XxILVO9BSYYHo/zfvP7/g45+PYs32woD+ffzzUdz7n19aHRMAFqzewXIGIiLSLFEUUeN0y/9qnZ4mXzf+V1nnwgP//bXN4+L8/+5AZZ0roDFFsWPHT4vFgszMTPTo0QM333wzxo8fj//+978AfBmriy66CA8//DCys7Nx0kknAQB++eUXnHPOObDZbEhJScENN9yAqqoqeczZs2fjyiuvxKOPPoqMjAwkJibKma677roLycnJ6N69O15//XX5Z/bv3w9BEPDOO+9g9OjRsFqtGDx4MNavXw8AOHjwIM4991wAQFJSEgRBwDXXXBPw79mrVy8sWbKkyW2nnnoq5s+fD8D3N5s/fz569OgBi8WC7Oxs3H777fJ96+vr8Ze//AXdunVDTEwMRowYga+++kr+/ooVK5CcnIz//ve/GDhwICwWCw4ePNjmnKTnd8GCBUhLS0N8fDxuuummJsHSWWedhVtvvRVz5sxBamoqJk2aBABYv349hg8fDovFgqysLNx7771NMolnnXUWbrvtNsyZMwcpKSno168fXnnlFVRXV2P27NmIi4tDnz598Mknn8g/I2X8/ve//+Hkk0+G1WrFyJEjsX37dvn7s2fPht1uhyAIEARBfv5CgUvoSdM2FZQ1uzp2ovIaF/604segPaYIoNBeh00FZRiVlxK0cYmIiMKl1uXBwPs/DcpYIoAiRx2GzP8soPvvWDgJ0VGdPwW12WwoLS2Vv/78888RHx+PtWvXAgCqq6sxadIkjBo1Cj/88ANKSkpw/fXX49Zbb8Ubb7wh/9w333yDXr164euvv8Z3332H6667Dhs2bMCZZ56J/Px8vPvuu7jxxhsxYcIEdO/eXf65u+66C0uWLMHAgQOxePFiXHDBBdi7dy+6deuG9957D5deeil27dqF+Ph42Gw2AL5ys9mzZ3c4iGzs/fffx1NPPYV33nkHgwYNQlFREX766Sf5+7feeit2/P/27jyqiXvtA/h3gLAqAUT2RRRZqsh1b9S6F9EWFT3qddfaxQqu1SpWRWtbUduqrUvrhvtSb6UuKKiIWnlxwYJgi4iKpVUqVpFVFsnz/uEhlyAhmSQK9j6fc3IOmUy+eRLyTOaXmcz89hv27dsHJycnREVFITAwEGlpaWjRogUAoKSkBMuXL8fmzZvRpEkT2NnZqX3cuLg4mJqa4syZM7hz5w4mTpwIGxsbfPzxx4p5tm/fjg8//BAJCQkAgLt372LAgAGYMGECduzYgevXr+O9996Dqamp0sBm+/bt+Pjjj3HhwgXs3LkTISEhOHToEIKDgzF//nysWrUKY8eORXZ2ttL5z+bMmYM1a9bAwcEB8+fPR1BQEG7cuIEuXbpg9erVWLRoETIyMgAAjRo10vo1V4cHUuyVlltY9yCqioetBZpYGGs078PicmT9Xay3x2aMMcaY7ogIp06dQmxsLKZOnaqYbmFhgc2bN8PY+Nnn/KZNm1BaWoodO3bAwsICALB27VoEBQVh+fLlsLe3BwBYWVlhzZo1MDIygre3N1asWIGSkhLMnz8fABAWFoaIiAicP38e//73vxWPFxoaiqFDhwIANmzYgJiYGGzduhUffPABbGxsAAB2dnZKv9ORSqWKrWXays7OhoODA/r27QuJRAI3Nzd06tRJcVtkZCSys7Ph5OQEAJg9ezZiYmIQGRmJzz77DABQUVGB9evXw9/fX+PHNTY2xtatW2Fubo5WrVrh008/xZw5czB79mzFPC1btsSKFSsU1z/55BO4urpi7dq1EAQBPj4+uHfvHubOnYtFixYpzuHk7++PBQsWQC6XY+bMmVi9ejVsbW3x3nvvAQAWLVqEDRs2IDU1Fa+//roiPzw8HG+++SaAZ4MxFxcXREVFYfjw4ZBKpRAEAQ4ODtq8zKLwQIq90uwaa3Ym6i+C/TTeepR46yFGbrqgt8dmjDHGGhoziSF++/TZLlhyuRyFBYVobNm41pOUXsp6hAmRl9VmbpvYEZ08bNRmmknEneD+6NGjsLS0REVFBeRyOUaNGqW0VcPPz08xiAKA9PR0+Pv7KwZRANC1a1fI5XJkZGQoBlI+Pj5Ktdnb26N169aK64aGhmjSpAlyc3OV6pHJZIq/jYyM0KFDB6Snp9f5HIKDgxEcHCzqedc0bNgwrF69Gs2bN0dgYCAGDBiAoKAgGBkZIS0tDZWVlfDy8lK6T1lZGZo0+e/6j7GxMdq0aSPqcf39/ZW2BslkMhQVFeHPP/9UDBbbt2+vdJ/09HTIZDIIgqCY1rVrV8X93NzcAECplqrX28/PTzGt6n9V1//AxsYG3t7eav8HLwIPpNgrrZOHDRylpvgrv7TWfbcFAA5SU8WCvb4yGWOMsYZEEATF7nVyuRxPjQ1hbmxU60DqjZZNNfpcfKNlUxgaCBplitGrVy+sW7cOZWVl8Pb2Vho0AVAaMIkhkUiUrguCUOu0F3FAhtoYGBg8t+tfRcV/D3rl6uqKjIwMnDp1CidPnsSUKVOwcuVKnD17FkVFRTA0NMSVK1dgaKg8UK2+a5uZmZnS4EZfXtT/oKrWl/U/EIsPNsFeaYYGAsKDXgPwbEFeXdX18KDXFAv2+spkjDHGXlX1/bloYWEBT09PuLq6wshI/TYAX19fXL16FcXF/91NPyEhAQYGBjrvXgcAFy78d6+Vp0+f4sqVK/D19QUAxSCvsrJSdG7Tpk2Rk/Pfox8WFBQgKytLaR4zMzMEBQXhm2++wZkzZ5CYmIi0tDS0bdsWlZWVyM3Nhaenp9JF113crl69iidPniiuX7hwAY0aNVL63VhNvr6+SExMVBoYJiQkoHHjxnXeT1PV/wd5eXm4ceOG0v9Am9dfGzyQYq+8wNaO2DCmHRykyrvaOUhNsWFMOwS2dmwQmYwxxtir6lX6XBw9ejRMTU0xfvx4XLt2DfHx8Zg6dSrGjh2r2FVMF+vWrUNUVBSuX7+OkJAQ5OXlYeLEiQAAd3d3CIKAo0eP4sGDB4ojBUZFRcHHx6fO3N69e2Pnzp34+eefkZaWhilTpihtXdq2bRu2bNmCa9eu4fbt29i1axfMzMzg7u4OLy8vjB49GuPGjcPBgweRlZWFS5cuYdmyZYiOjtbp+ZaXl2PSpEn47bffcOzYMYSHhyMkJKTOLY1TpkzBH3/8galTp+L69es4dOgQwsPDMWvWLJ23UALAp59+iri4OFy7dg0TJkyAra0tBg8eDODZ0Q+LiooQFxeHv//+GyUlJTo/niq8ax/7Rwhs7Yg3X3NA4s1cnPj5IgLe6AyZp51O3469iEzGGGPsVVX1uXgp6xFyC0th1/jZbu4N7XPR3NwcsbGxmD59Ojp27Ahzc3MMHToUX3/9tV7yIyIiEBERgZSUFHh6euLw4cOwtbVFQUEBnJ2dsWTJEsybNw8TJ07EuHHjsG3bNuTn5yuOIqdKWFgYsrKy8Pbbb0MqlSIsLAx//vmn4nYrKytERERg1qxZqKyshJ+fH44cOaL4DVTVQSU++ugj3L17F7a2tnj99dfx9ttv6/R8+/Tpg5YtW6J79+4oKyvDyJEjER4ejrKyMpX3cXZ2xrFjxzBnzhz4+/vDxsYGkyZNwoIFC3SqpUpERASmT5+OzMxM/Otf/8KRI0cUWwO7dOmCyZMnY8SIEXj48CHCw8Nf2CHQeSDF/jEMDQR09rDBw3RCZz0t2F9EJmOMMfaqMjQQXuqpP6oOV67qNzLVD2denZ+fH06fPq0yNzIyEgUFBUrTqp9zqcqdO3eem+br64uLFy8qTate38KFC7Fw4UKl2ydMmKD2nFKWlpbYt2+fIq+goAAffPCBYgvO4MGDFVtdaiORSLBkyRIsWbLkuduqDtIxefLkOmtQpWauXC5XDKRqe90AoEePHrh06ZLKzNrud/v27ee2WNV2yPhu3bopzh1Vmw0bNmDDhg0qb9cX3rWPMcYYY4wxxkTiLVKMMcYYY4z9D6rrZLXHjx9/iZW8mnggxRhjjDHGmBrNmjWrdTezV1lKSorK25ydnfHGG2+8vGI00LNnzwb1P+CBFGOMMcYYY/+DPD0967uEVxr/Rooxxhhj7H9EQ/o2n7H6pI9e4IEUY4wxxtg/nEQiAYAXek4dxl4lVb1Q1Rva4F37GGOMMcb+4QwNDWFlZYXc3FwAz861JAjPTukhl8tRXl6O0tJSvZws9UVkch7n6QsRoaSkBLm5ubCyslI66bFYPJBijDHGGPsf4ODgAACKwVQVIsKTJ09gZmamGFzpSt+ZnMd5+mZlZaXoCW016IFU1cm0qk6G1qpVKyxatAj9+/cHAJSWluKjjz7Cvn37UFZWhn79+mH9+vWwt7evx6oZY4wxxhoeQRDg6OgIOzs7VFRUKKZXVFTg3Llz6N69u067OVWn70zO4zx9kkgkOm2JqtKgB1IuLi6IiIhAy5YtQUTYvn07Bg0ahOTkZLRq1QozZ85EdHQ0Dhw4AKlUitDQUAwZMgQJCQn1XTpjjDHGWINkaGiotBJpaGiIp0+fwtTUVG8rsfrO5DzOa4ga9EAqKChI6frnn3+ODRs24MKFC3BxccGWLVuwZ88e9O7dGwAQGRkJX19fXLhwAa+//np9lMwYY4wxxhj7H9CgB1LVVVZW4sCBAyguLoZMJsOVK1dQUVGBvn37Kubx8fGBm5sbEhMT6xxIlZWVoaysTHG9oKAAwLPNitU3ddeHqsfXVx2c1/AyOY/z6juT8zivvjM575+d9yIyOY/zXiZN6xCogZ9QIC0tDTKZDKWlpWjUqBH27NmDAQMGYM+ePZg4caLSgAgAOnXqhF69emH58uUqMxcvXowlS5Y8N33Pnj0wNzfX+3NgjDHGGGOMvRpKSkowatQo5Ofnw9LSUuV8DX6LlLe3N1JSUpCfn4///Oc/GD9+PM6ePatTZlhYGGbNmqW4np+fDzc3N8hkMjRu3FjXknVSUVGB+Ph49OrVS28/3uO8hpXJeZxX35mcx3n1ncl5/+y8F5HJeZz3MhUWFgJQf9LeBj+QMjY2hqenJwCgffv2uHz5MtasWYMRI0agvLwcjx8/hpWVlWL++/fvqz2UoYmJCUxMTBTXq3bt8/Dw0P8TYIwxxhhjjL1yCgsLIZVKVd7e4AdSNcnlcpSVlaF9+/aQSCSIi4vD0KFDAQAZGRnIzs6GTCYTlenk5IQ//vgDjRs3fmnHrleloKAArq6u+OOPP+rclMh5LyfvRWRyHufVdybncV59Z3LePzvvRWRyHue9TESEwsJCODk51Tlfgx5IhYWFoX///nBzc0NhYSH27NmDM2fOIDY2FlKpFJMmTcKsWbNgY2MDS0tLTJ06FTKZTPQR+wwMDODi4vKCnoV2LC0t9fpG4ryGl8l5nFffmZzHefWdyXn/7LwXkcl5nPey1LUlqkqDHkjl5uZi3LhxyMnJgVQqRZs2bRAbG4s333wTALBq1SoYGBhg6NChSifkZYwxxhhjjLEXqUEPpLZs2VLn7aampli3bh3WrVv3kipijDHGGGOMMcCgvgtgykxMTBAeHq50MAzOq7+8F5HJeZxX35mcx3n1ncl5/+y8F5HJeZzXEDX480gxxhhjjDHGWEPDW6QYY4wxxhhjTCQeSDHGGGOMMcaYSDyQYowxxhhjjDGReCDFGGOMMcYYYyLxQKqBOHfuHIKCguDk5ARBEPDTTz/plLds2TJ07NgRjRs3hp2dHQYPHoyMjAyt8zZs2IA2bdooTpQmk8lw/PhxnWqsLiIiAoIgYMaMGVrdf/HixRAEQeni4+OjU013797FmDFj0KRJE5iZmcHPzw9JSUlaZTVr1uy5+gRBQEhIiFZ5lZWVWLhwITw8PGBmZoYWLVpg6dKl0OXYMYWFhZgxYwbc3d1hZmaGLl264PLlyxrfX917mIiwaNEiODo6wszMDH379kVmZqbWeQcPHkRAQACaNGkCQRCQkpKidX0VFRWYO3cu/Pz8YGFhAScnJ4wbNw737t3Tur7FixfDx8cHFhYWsLa2Rt++fXHx4kWt86qbPHkyBEHA6tWrtc6bMGHCc+/HwMBAlXma1pieno6BAwdCKpXCwsICHTt2RHZ2tlZ5tfWMIAhYuXKlVnlFRUUIDQ2Fi4sLzMzM8Nprr+G7777T+vnev38fEyZMgJOTE8zNzREYGFjne1qT5XJpaSlCQkLQpEkTNGrUCEOHDsX9+/e1ztu4cSN69uwJS0tLCIKAx48fa13fo0ePMHXqVHh7e8PMzAxubm6YNm0a8vPzta7vgw8+QIsWLWBmZoamTZti0KBBuH79utZ5VYgI/fv3r7OXNMnr2bPnc++/yZMn61RfYmIievfuDQsLC1haWqJ79+548uSJVpl37txR2ScHDhzQqsa//voLY8eOhYODAywsLNCuXTv8+OOPWj/nW7duITg4GE2bNoWlpSWGDx+u8j2tbl1DTH9okiemP9Tlie0PTeoT0x+a5FXRpD80zRTTI5rWKKZH6hsPpBqI4uJi+Pv76+2cWGfPnkVISAguXLiAkydPoqKiAgEBASguLtYqz8XFBREREbhy5QqSkpLQu3dvDBo0CL/++qvOtV6+fBnff/892rRpo1NOq1atkJOTo7icP39e66y8vDx07doVEokEx48fx2+//YavvvoK1tbWWuVdvnxZqbaTJ08CAIYNG6ZV3vLly7FhwwasXbsW6enpWL58OVasWIFvv/1WqzwAePfdd3Hy5Ens3LkTaWlpCAgIQN++fXH37l2N7q/uPbxixQp88803+O6773Dx4kVYWFigX79+KC0t1SqvuLgY3bp1w/Lly3Wur6SkBL/88gsWLlyIX375BQcPHkRGRgYGDhyoVR4AeHl5Ye3atUhLS8P58+fRrFkzBAQE4MGDB1rlVYmKisKFCxfg5ORU53ya5AUGBiq9L/fu3atT5q1bt9CtWzf4+PjgzJkzSE1NxcKFC2FqaqpVXvXacnJysHXrVgiCgKFDh2qVN2vWLMTExGDXrl1IT0/HjBkzEBoaisOHD4vOIyIMHjwYt2/fxqFDh5CcnAx3d3f07dtX5XJWk+XyzJkzceTIERw4cABnz57FvXv3MGTIEK3zSkpKEBgYiPnz59eaISbv3r17uHfvHr788ktcu3YN27ZtQ0xMDCZNmqR1fe3bt0dkZCTS09MRGxsLIkJAQAAqKyu1yquyevVqCIKg0/Ot8t577ym9D1esWKF1XmJiIgIDAxEQEIBLly7h8uXLCA0NhYFB7atj6jJdXV2f65MlS5agUaNG6N+/v1Y1jhs3DhkZGTh8+DDS0tIwZMgQDB8+HMnJyaLziouLERAQAEEQcPr0aSQkJKC8vBxBQUGQy+XP5alb1xDTH5rkiekPdXli+0OT+sT0hyZ5VTTpDzGZmvaIJnlie6TeEWtwAFBUVJReM3NzcwkAnT17Vm+Z1tbWtHnzZp0yCgsLqWXLlnTy5Enq0aMHTZ8+Xauc8PBw8vf316mW6ubOnUvdunXTW15N06dPpxYtWpBcLtfq/m+99Ra98847StOGDBlCo0eP1iqvpKSEDA0N6ejRo0rT27VrR5988onovJrvYblcTg4ODrRy5UrFtMePH5OJiQnt3btXdF51WVlZBICSk5O1rq82ly5dIgD0+++/6yUvPz+fANCpU6e0zvvzzz/J2dmZrl27Ru7u7rRq1Sq1Waryxo8fT4MGDdLo/ppmjhgxgsaMGaO3vJoGDRpEvXv31jqvVatW9OmnnypN0/Q9XjMvIyODANC1a9cU0yorK6lp06a0adMmjWqsuVx+/PgxSSQSOnDggGKe9PR0AkCJiYmi86qLj48nAJSXl6dRberyqvzwww9kbGxMFRUVesm7evUqAaCbN29qnZecnEzOzs6Uk5Mj6vO0tjxdPpdqy+vcuTMtWLBAqzxVmTX961//eu7zQUyehYUF7dixQ2k+Gxsbjd7XNfNiY2PJwMCA8vPzFfM8fvyYBEGgkydPalRj1bqGrv1RM686bfqjrrwqYvpDkzwx/aEqT9v+UJWpS4/Ulqdrj7xsDXR4x/StatOyjY2NzlmVlZXYt28fiouLIZPJdMoKCQnBW2+9hb59++pcV2ZmJpycnNC8eXOMHj1a5e5Emjh8+DA6dOiAYcOGwc7ODm3btsWmTZt0rhEAysvLsWvXLrzzzjsafyNUU5cuXRAXF4cbN24AAK5evYrz58/X+g2kJp4+fYrKysrnthyYmZnptGWvSlZWFv766y+l/7NUKkXnzp2RmJioc/6LkJ+fD0EQYGVlpXNWeXk5Nm7cCKlUCn9/f60y5HI5xo4dizlz5qBVq1Y61wQAZ86cgZ2dHby9vfHhhx/i4cOHWmfJ5XJER0fDy8sL/fr1g52dHTp37qzzbspV7t+/j+jo6Dq/3VWnS5cuOHz4MO7evQsiQnx8PG7cuIGAgADRWWVlZQCg1DMGBgYwMTHRuGdqLpevXLmCiooKpT7x8fGBm5ubRn2iz+W8pnn5+fmwtLSEkZGRznnFxcWIjIyEh4cHXF1dtcorKSnBqFGjsG7dOjg4OKjN0KS+3bt3w9bWFq1bt0ZYWBhKSkq0ysvNzcXFixdhZ2eHLl26wN7eHj169BC1jFX3Gl65cgUpKSka90lteV26dMH+/fvx6NEjyOVy7Nu3D6WlpejZs6fovLKyMgiCoHSSVVNTUxgYGKh93jXXNXTtD32uu2iaJ6Y/1OWJ7Y/a8nTpj7pq1LZHaubpo0deuvoeybHnQc9bpCorK+mtt96irl276pSTmppKFhYWZGhoSFKplKKjo3XK27t3L7Vu3ZqePHlCRLp9q3Hs2DH64Ycf6OrVqxQTE0MymYzc3NyooKBAqzwTExMyMTGhsLAw+uWXX+j7778nU1NT2rZtm1Z51e3fv58MDQ3p7t27WmdUVlbS3LlzSRAEMjIyIkEQ6IsvvtCpLplMRj169KC7d+/S06dPaefOnWRgYEBeXl6is2q+hxMSEggA3bt3T2m+YcOG0fDhw0XnVfcitkg9efKE2rVrR6NGjdIp78iRI2RhYUGCIJCTkxNdunRJ67wvvviC3nzzTcVWTF23SO3du5cOHTpEqampFBUVRb6+vtSxY0d6+vSpVplV326am5vT119/TcnJybRs2TISBIHOnDmjVY3VLV++nKytrRXLC23ySktLady4cQSAjIyMyNjYmLZv365VXnl5Obm5udGwYcPo0aNHVFZWRhEREQSAAgIC1ObVtlzevXs3GRsbPzdvx44d6eOPPxadV53Yb9w1+dx48OABubm50fz583XKW7duHVlYWBAA8vb21ujbdlV577//Pk2aNElxXdPPU1V533//PcXExFBqairt2rWLnJ2dKTg4WKu8xMREAkA2Nja0detW+uWXX2jGjBlkbGxMN27c0LrG6j788EPy9fVVm1VXXl5eHgUEBCj6xNLSkmJjY7XKy83NJUtLS5o+fToVFxdTUVERhYaGEgB6//33a81Rta6hbX9osu4ipj80XRfStD/U5Yntj7rytO2PujK16RFVebr2SH3ggVQDpO+B1OTJk8nd3Z3++OMPnXLKysooMzOTkpKSaN68eWRra0u//vqrVlnZ2dlkZ2dHV69eVUzTx+bhKnl5eWRpaan1rocSiYRkMpnStKlTp9Lrr7+uc20BAQH09ttv65Sxd+9ecnFxob1791Jqairt2LGDbGxsdBro3bx5k7p3704AyNDQkDp27EijR48mHx8f0Vmv8kCqvLycgoKCqG3btkq7o2iTV1RURJmZmZSYmEjvvPMONWvWjO7fvy86Lykpiezt7ZUG37oOpGq6deuWxrse1pZ59+5dAkAjR45Umi8oKIj+/e9/61yjt7c3hYaGalSbqryVK1eSl5cXHT58mK5evUrffvstNWrUSKNdjGrLS0pKIn9/f0XP9OvXj/r370+BgYFq82pbLusykFK3nBc7kFKXl5+fT506daLAwEAqLy/XKe/x48d048YNOnv2LAUFBVG7du3UDphryzt06BB5enpSYWGhYpqmn6eafk7GxcVptGtVbXlVy8GwsDClef38/GjevHk611hSUkJSqZS+/PJLtVl15YWGhlKnTp3o1KlTlJKSQosXLyapVEqpqala5cXGxlLz5s1JEAQyNDSkMWPGULt27Wjy5Mm15qha19C2PzRZdxHTH5rkiekPdXli+0NVni79IWb9T5MeUZWna4/UBx5INUD6HEiFhISQi4sL3b59Wy951fXp00flN0rqREVFKVY+qi4AFAtaTb8Vr0uHDh20bjw3Nzelb22IiNavX09OTk461XTnzh0yMDCgn376SaccFxcXWrt2rdK0pUuXkre3t065RM9W/qsGPMOHD6cBAwaIzqj5Hq5aSa852OnevTtNmzZNdF51+hxIlZeX0+DBg6lNmzb0999/65xXk6enp0ZbDmvmrVq1StEb1fvFwMCA3N3d9Vafra0tfffdd2rnqy2zrKyMjIyMaOnSpUrzffzxx9SlSxedajx37hwBoJSUFI1qqy2vpKSEJBLJc78DnDRpEvXr10+n+h4/fky5ublERNSpUyeaMmVKnVmqlstVKyA1V+bc3Nzo66+/Fp1XnZgVRXV5BQUFJJPJqE+fPhptIRTzOVRWVkbm5ua0Z88e0XnTp09X2Sc9evTQS31FRUUEgGJiYkTn3b59mwDQzp07laYPHz5c7dZvTWrcsWMHSSQSxXtRm7ybN28+99s/omef9x988IFO9T148EDx/rO3t6cVK1aorbPqsd9//32t+0NVXnW6/EaqZp7Y/tCkviqa9IeqPG37Q2yNmvSIqjxdeqS+8G+k/qGICKGhoYiKisLp06fh4eGh98eQy+WK3wmI1adPH6SlpSElJUVx6dChA0aPHo2UlBQYGhrqVFtRURFu3boFR0dHre7ftWvX5w7heuPGDbi7u+tUV2RkJOzs7PDWW2/plFNSUvLcEWwMDQ1rPQqSWBYWFnB0dEReXh5iY2MxaNAgnTM9PDzg4OCAuLg4xbSCggJcvHhRL/uq60NFRQWGDx+OzMxMnDp1Ck2aNNH7Y2jbM2PHjkVqaqpSvzg5OWHOnDmIjY3VS21//vknHj58qHXPGBsbo2PHji+kb7Zs2YL27dtr/fsy4Nn/t6Ki4oX0jVQqRdOmTZGZmYmkpCSVPaNuudy+fXtIJBKlPsnIyEB2dnatfaLv5bwmeQUFBQgICICxsTEOHz6s8oiM2tZHz77grbVP1OXNmzfvuT4BgFWrViEyMlIv9VVl1tYn6vKaNWsGJycnUT0ipsYtW7Zg4MCBaNq0qcp51OVV/bZF0z4RU5+trS2srKxw+vRp5Obm1nlU1Oqqlpti+0Ndnr5UzxPTH9rUV1d/qMsT2x/a1lhXj6jL06ZH6l09DN5YLQoLCyk5OZmSk5MJgOI3BpocMaw2H374IUmlUjpz5gzl5OQoLiUlJVrlzZs3j86ePUtZWVmUmppK8+bNI0EQ6MSJE1rl1UaXXfs++ugjOnPmDGVlZVFCQgL17duXbG1tNfpmrjaXLl0iIyMj+vzzzykzM5N2795N5ubmtGvXLq3yiJ7tP+7m5kZz587VOqPK+PHjydnZmY4ePUpZWVl08OBBsrW1Vbv7T11iYmLo+PHjdPv2bTpx4gT5+/tT586dNdpth0j9ezgiIoKsrKwUv8sZNGgQeXh4qPzGTl3ew4cPKTk5maKjowkA7du3j5KTkyknJ0d0Xnl5OQ0cOJBcXFwoJSVFqWfKyspE5xUVFVFYWBglJibSnTt3KCkpiSZOnEgmJibPfdOr6fOtSd2ufXXlFRYW0uzZsykxMZGysrLo1KlT1K5dO2rZsiWVlpZqlUlEdPDgQZJIJLRx40bKzMykb7/9lgwNDennn3/W+jnn5+eTubk5bdiwQWVdmub16NGDWrVqRfHx8XT79m2KjIwkU1NTWr9+vVZ5P/zwA8XHx9OtW7fop59+Ind3dxoyZIjK+jRZLk+ePJnc3Nzo9OnTlJSURDKZ7LndjMXk5eTkUHJyMm3atIkA0Llz5yg5OZkePnwoOi8/P586d+5Mfn5+dPPmTaV5atuLQF3erVu36IsvvqCkpCT6/fffKSEhgYKCgsjGxqbWXWC1+VxDHVsS1eXdvHmTPv30U0pKSqKsrCw6dOgQNW/enLp37671/2PVqlVkaWlJBw4coMzMTFqwYAGZmpqq3A1K0+ecmZlJgiDQ8ePHVb4WmuSVl5eTp6cnvfHGG3Tx4kW6efMmffnllyQIQq2/BdKkvq1bt1JiYiLdvHmTdu7cSTY2NjRr1qxa61O3riGmPzTJE9Mf6vLE9oe6PLH9ocnzramu/tAkU2yPaFKj2B6pbzyQaiCqNivXvIwfP16rvNqyAFBkZKRWee+88w65u7uTsbExNW3alPr06aPXQRSRbgOpESNGkKOjIxkbG5OzszONGDFC56Y7cuQItW7dmkxMTMjHx4c2btyoU15sbCwBoIyMDJ1yiJ7tOjB9+nRyc3MjU1NTat68OX3yyScqV/o1sX//fmrevDkZGxuTg4MDhYSE0OPHjzW+v7r3sFwup4ULF5K9vT2ZmJhQnz596nwt1OVFRkbWent4eLjovKrdA2u7xMfHi8578uQJBQcHk5OTExkbG5OjoyMNHDiwzoNNiF0GqBtI1ZVXUlJCAQEB1LRpU5JIJOTu7k7vvfce/fXXXyrzNK1xy5Yt5OnpSaampuTv71/nbqya5H3//fdkZmam0XtRXV5OTg5NmDCBnJycyNTUlLy9vemrr75SeRoCdXlr1qwhFxcXkkgk5ObmRgsWLKizBzVZLj958oSmTJlC1tbWZG5uTsHBwSq/HNAkLzw8XOPPAnV5ql4PAJSVlSU67+7du9S/f3+ys7MjiURCLi4uNGrUKLp+/brWz7e2+6haUVSXl52dTd27dycbGxsyMTEhT09PmjNnjsrfTmpa37Jly8jFxYXMzc1JJpOp/KJBTGZYWBi5urpSZWWlyixN827cuEFDhgwhOzs7Mjc3pzZt2jx3OHQxeXPnziV7e3uSSCTUsmXLOntO3bqGmP7QJE9Mf6jLE9sf6vLE9ocmz7emuvpDk0yxPaJpjWJ6pL4JRERgjDHGGGOMMaYx/o0UY4wxxhhjjInEAynGGGOMMcYYE4kHUowxxhhjjDEmEg+kGGOMMcYYY0wkHkgxxhhjjDHGmEg8kGKMMcYYY4wxkXggxRhjjDHGGGMi8UCKMcYYY4wxxkTigRRjjDHGGGOMicQDKcYYYy+EIAh1XhYvXqxT9k8//aS3+TRx5swZCIKAx48f6yWPMcbYq82ovgtgjDH2z5STk6P4e//+/Vi0aBEyMjIU0xo1alQfZTHGGGN6wVukGGOMvRAODg6Ki1QqhSAIStP27dsHX19fmJqawsfHB+vXr1fct7y8HKGhoXB0dISpqSnc3d2xbNkyAECzZs0AAMHBwRAEQXFdnTt37kAQBBw8eBC9evWCubk5/P39kZiYqJjn999/R1BQEKytrWFhYYFWrVrh2LFjuHPnDnr16gUAsLa2hiAImDBhAgAgJiYG3bp1g5WVFZo0aYK3334bt27dEvW4AJCQkICePXvC3Nwc1tbW6NevH/Ly8gAAcrkcy5Ytg4eHB8zMzODv74///Oc/ov4fjDHG9IsHUowxxl663bt3Y9GiRfj888+Rnp6OL774AgsXLsT27dsBAN988w0OHz6MH374ARkZGdi9e7diwHT58mUAQGRkJHJychTXNfXJJ59g9uzZSElJgZeXF0aOHImnT58CAEJCQlBWVoZz584hLS0Ny5cvR6NGjeDq6ooff/wRAJCRkYGcnBysWbMGAFBcXIxZs2YhKSkJcXFxMDAwQHBwMORyucaPm5KSgj59+uC1115DYmIizp8/j6CgIFRWVgIAli1bhh07duC7777Dr7/+ipkzZ2LMmDE4e/asFq8+Y4wxvSDGGGPsBYuMjCSpVKq43qJFC9qzZ4/SPEuXLiWZTEZERFOnTqXevXuTXC6vNQ8ARUVFqX3c6vNlZWURANq8ebPi9l9//ZUAUHp6OhER+fn50eLFi2vNio+PJwCUl5dX52M+ePCAAFBaWprGjzty5Ejq2rVrrXmlpaVkbm5O//d//6c0fdKkSTRy5Mg6a2GMMfbi8BYpxhhjL1VxcTFu3bqFSZMmoVGjRorLZ599ptglbsKECUhJSYG3tzemTZuGEydO6O3x27Rpo/jb0dERAJCbmwsAmDZtGj777DN07doV4eHhSE1NVZuXmZmJkSNHonnz5rC0tFRsOcvOztb4cau2SNXm5s2bKCkpwZtvvqn0eu3YsUNpF0LGGGMvFx9sgjHG2EtVVFQEANi0aRM6d+6sdJuhoSEAoF27dsjKysLx48dx6tQpDB8+HH379tXL74IkEonib0EQAECxG967776Lfv36ITo6GidOnMCyZcvw1VdfYerUqSrzgoKC4O7ujk2bNsHJyQlyuRytW7dGeXm5xo9rZmamMr/q9YqOjoazs7PSbSYmJmqfL2OMsReDt0gxxhh7qezt7eHk5ITbt2/D09NT6eLh4aGYz9LSEiNGjMCmTZuwf/9+/Pjjj3j06BGAZ4OSqt8P6ZurqysmT56MgwcP4qOPPsKmTZsAAMbGxgCg9LgPHz5ERkYGFixYgD59+sDX11dxgAgx2rRpg7i4uFpve+2112BiYoLs7OznXi9XV1ctniFjjDF94C1SjDHGXrolS5Zg2rRpkEqlCAwMRFlZGZKSkpCXl4dZs2bh66+/hqOjI9q2bQsDAwMcOHAADg4OsLKyAvDsyH1xcXHo2rUrTExMYG1trZe6ZsyYgf79+8PLywt5eXmIj4+Hr68vAMDd3R2CIODo0aMYMGAAzMzMYG1tjSZNmmDjxo1wdHREdnY25s2bJ/pxw8LC4OfnhylTpmDy5MkwNjZGfHw8hg0bBltbW8yePRszZ86EXC5Ht27dkJ+fj4SEBFhaWmL8+PF6ee6MMcbE4S1SjDHGXrp3330XmzdvRmRkJPz8/NCjRw9s27ZNsUWqcePGWLFiBTp06ICOHTvizp07OHbsGAwMnn1sffXVVzh58iRcXV3Rtm1bvdVVWVmJkJAQ+Pr6IjAwEF5eXorDsjs7O2PJkiWYN28e7O3tERoaCgMDA+zbtw9XrlxB69atMXPmTKxcuVL043p5eeHEiRO4evUqOnXqBJlMhkOHDsHI6Nn3nUuXLsXChQuxbNkyRW3R0dFKW/AYY4y9XAIRUX0XwRhjjDHGGGOvEt4ixRhjjDHGGGMi8UCKMcYYY4wxxkTigRRjjDHGGGOMicQDKcYYY4wxxhgTiQdSjDHGGGOMMSYSD6QYY4wxxhhjTCQeSDHGGGOMMcaYSDyQYowxxhhjjDGReCDFGGOMMcYYYyLxQIoxxhhjjDHGROKBFGOMMcYYY4yJ9P/+hKzxW8x8KQAAAABJRU5ErkJggg==", "text/plain": [ "
" ] @@ -360,7 +360,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -371,22 +371,22 @@ "==== Test Case 1 ====\n", "Score: True\n", "\n", - "Question: What are some causes of headaches?\n", + "Question: What are some possible causes of headaches?\n", "\n", "Ideal Answer: Headaches can have many causes, including stress, dehydration, lack of sleep, or more serious conditions like migraines or sinusitis.\n", "\n", - "Model Response: The text mentions that persistent headaches may be caused by a variety of factors including chronic tension-type headaches, migraines, cluster headaches, lifestyle factors such as poor sleep, dehydration, excessive caffeine or alcohol use, stress, vision problems that lead to eye strain, underlying conditions like sinus infections, hypertension, and even medication overuse.\n", + "Model Response: The text lists several possible causes of a persistent headache: tension-type headaches (often related to stress, muscle tension, or poor posture), migraines (which may include visual disturbances, nausea, and sensitivity to light and sound), medication overuse (rebound headaches), sinus or cluster headaches, as well as factors like dehydration, lack of sleep, eye strain, and caffeine withdrawal.\n", "\n", "--------------------------------------------------------------------------------\n", "\n", "==== Test Case 2 ====\n", "Score: True\n", "\n", - "Question: What medical conditions can be associated with fatigue?\n", + "Question: What can fatigue be a symptom of?\n", "\n", - "Ideal Answer: Fatigue can be a symptom of various conditions, from anemia and thyroid disorders to depression or chronic fatigue syndrome.\n", + "Ideal Answer: Fatigue can be a symptom of various conditions\n", "\n", - "Model Response: The text mentions that common causes of fatigue include anemia, thyroid disorders (like hypothyroidism), diabetes, chronic fatigue syndrome, and depression.\n", + "Model Response: The text explains that fatigue can be a symptom of many causes, including lifestyle factors and underlying medical conditions.\n", "\n", "--------------------------------------------------------------------------------\n", "\n", @@ -397,7 +397,7 @@ "\n", "Ideal Answer: A persistent cough can be a sign of several conditions, such as asthma, bronchitis, pneumonia, or even lung cancer.\n", "\n", - "Model Response: The text mentions that a persistent cough could range from relatively benign conditions, such as a mild lingering infection or post-nasal drip, to more serious issues like chronic respiratory conditions or even heart problems. It also advises considering preexisting conditions like asthma, allergies, COPD, or GERD.\n", + "Model Response: A persistent cough could be due to causes like postnasal drip, lingering viral irritation, acid reflux, asthma, chronic bronchitis, or other lung conditions.\n", "\n", "--------------------------------------------------------------------------------\n" ] @@ -462,7 +462,7 @@ ], "metadata": { "kernelspec": { - "display_name": ".venv", + "display_name": "Python 3", "language": "python", "name": "python3" }, @@ -476,7 +476,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.0" + "version": "3.13.1" } }, "nbformat": 4, diff --git a/lamoom/__init__.py b/lamoom/__init__.py index 121564d..5858b11 100644 --- a/lamoom/__init__.py +++ b/lamoom/__init__.py @@ -17,3 +17,5 @@ from lamoom.responses import AIResponse from lamoom.ai_models.openai.responses import OpenAIResponse from lamoom.ai_models.behaviour import AIModelsBehaviour, PromptAttempts + +from lamoom.validators import JSONValidator, XMLValidator, YAMLValidator diff --git a/lamoom/exceptions.py b/lamoom/exceptions.py index 8797504..dc05c1e 100644 --- a/lamoom/exceptions.py +++ b/lamoom/exceptions.py @@ -39,3 +39,6 @@ class NotParsedResponseException(LamoomError): class APITokenNotProvided(LamoomError): pass + +class ValidatorException(LamoomError): + pass \ No newline at end of file diff --git a/lamoom/prompt/lamoom.py b/lamoom/prompt/lamoom.py index 157806a..5fa9a1c 100644 --- a/lamoom/prompt/lamoom.py +++ b/lamoom/prompt/lamoom.py @@ -4,7 +4,8 @@ from decimal import Decimal import requests import time -from lamoom.settings import LAMOOM_API_URI +import json +from lamoom.settings import LAMOOM_API_URI, PROMPT_VALIDATORS from lamoom import Secrets, settings from lamoom.ai_models.ai_model import AI_MODELS_PROVIDER from lamoom.ai_models.attempt_to_call import AttemptToCall @@ -16,7 +17,8 @@ from lamoom.exceptions import ( LamoomPromptIsnotFoundError, - RetryableCustomError + RetryableCustomError, + ValidatorException ) from lamoom.services.SaveWorker import SaveWorker from lamoom.prompt.prompt import Prompt @@ -25,8 +27,7 @@ from lamoom.responses import AIResponse from lamoom.services.lamoom import LamoomService from lamoom.utils import current_timestamp_ms -import json - +from lamoom.validators import Validator logger = logging.getLogger(__name__) @@ -220,7 +221,7 @@ def init_behavior(self, model: str, provider_url: str = None) -> AIModelsBehavio fallback_attempts=fallback_attempts ) - def call( + def call_llm( self, prompt_id: str, context: t.Dict[str, str], @@ -310,6 +311,99 @@ def call( "Prompt call failed, no attempts worked" ) raise Exception + + + def call( + self, + prompt_id: str, + context: t.Dict[str, str], + model: str, + provider_url: str = None, + params: t.Dict[str, t.Any] = {}, + version: str = None, + count_of_retries: int = 5, + test_data: dict = {}, + stream_function: t.Callable = None, + check_connection: t.Callable = None, + stream_params: dict = {}, + ) -> AIResponse: + + max_attempts = 1 + validators = PROMPT_VALIDATORS.get(prompt_id) + if validators is None: + validators = [] + else: + validators = validators.values() + for validator in validators: + max_attempts += min(sum(map(int, validator.retry_rules.values())), validator.retry) + + total_results: t.List[AIResponse] = [] + total_errors: t.List[dict] = [] + + for iteration in range(max_attempts): + result = None + try: + result = self.call_llm( + prompt_id=prompt_id, + context=context, + model=model, + provider_url=provider_url, + params=params, + version=version, + count_of_retries=count_of_retries, + test_data=test_data, + stream_function=stream_function, + check_connection=check_connection, + stream_params=stream_params + ) + except Exception as e: + logger.error(f"Attempt {iteration + 1} failed with error: {str(e)}") + if result is None: + result = AIResponse() + result.errors = [{ + "iteration": iteration, + "error": str(e) + }] + break + + validation_failed = False + can_retry = False + + validation_errors = [] + for validator in validators: + validator.validate(result) + if validator.has_errors(): + validation_failed = True + for error in validator.get_errors(): + validation_errors.append({ + "id": validator.id, + "iteration": iteration, + "error": validator.format_error(error) + }) + if validator.can_retry(): + can_retry = True + else: + total_errors.extend(validation_errors) + break + + result.errors = validation_errors if validation_errors else None + total_results.append(result) + + if validation_failed: + if can_retry and iteration < max_attempts - 1: + logger.info(f"Validation errors occurred, retrying (attempt {iteration + 1}/{max_attempts})") + continue + else: + error_messages = [e["error"] for e in validation_errors[-len(validators):]] + logger.error(f"Validation failed: {', '.join(error_messages)}") + raise ValidatorException() + else: + total_results[-1].attemps = total_results[:-1] + return total_results[-1] + + logger.error("All attempts failed") + raise Exception("All attempts failed. Errors: " + ", ".join([e["error"] for e in total_errors])) + def get_prompt(self, prompt_id: str, version: str = None) -> Prompt: """ diff --git a/lamoom/response_parsers/response_parser.py b/lamoom/response_parsers/response_parser.py index 0c522d6..012843f 100644 --- a/lamoom/response_parsers/response_parser.py +++ b/lamoom/response_parsers/response_parser.py @@ -5,19 +5,11 @@ import yaml from lamoom.exceptions import NotParsedResponseException -from lamoom.responses import AIResponse +from lamoom.responses import AIResponse, Tag logger = logging.getLogger(__name__) -@dataclass -class Tag: - start_tag: str - end_tag: str - include_tag: bool - is_right_find_end_ind: bool = False - - @dataclass class TaggedContent: content: str diff --git a/lamoom/responses.py b/lamoom/responses.py index 5abcb79..1ff8255 100644 --- a/lamoom/responses.py +++ b/lamoom/responses.py @@ -2,8 +2,9 @@ import json import logging from dataclasses import dataclass, field +from functools import cached_property import typing as t - +from lamoom.exceptions import LamoomError logger = logging.getLogger(__name__) @@ -24,6 +25,13 @@ class Metrics: ai_model_details: dict = None latency: int = None +@dataclass +class Tag: + start_tag: str + end_tag: str + include_tag: bool + is_right_find_end_ind: bool = False + @dataclass(kw_only=True) class AIResponse: @@ -34,6 +42,8 @@ class AIResponse: prompt: Prompt = field(default_factory=Prompt) metrics: Metrics = field(default_factory=Metrics) id: str = "" + errors: t.Optional[t.List[LamoomError]] = None + attemps: t.Optional[t.List] = None @property def response(self) -> str: @@ -41,3 +51,60 @@ def response(self) -> str: def get_message_str(self) -> str: return json.loads(self.response) + + @cached_property + def json_list(self) -> t.List[t.Dict]: + + tags = [Tag("```json", "\n```", 0), Tag("```json", "```", 0)] + return self._get_tagged_content_list(tags) + + @cached_property + def xml_list(self) -> t.List[t.Dict]: + + tags = [Tag("```xml", "\n```", 0), Tag("```xml", "```", 0)] + return self._get_tagged_content_list(tags) + + @cached_property + def yaml_list(self) -> t.List[t.Dict]: + + tags = [Tag("```yaml", "\n```", 0), Tag("```yaml", "```", 0)] + return self._get_tagged_content_list(tags) + + def _get_tagged_content_list(self, tags: Tag) -> t.List[t.Dict]: + + content_list = [] + start_from = 0 + while True: + response_tagged, start_from, end_ind = self._get_format_from_response(tags, start_from) + if response_tagged: + content_list.append({ + "content": response_tagged, + "start_ind": start_from, + "end_ind": end_ind + }) + start_from = end_ind + else: + break + return content_list + + def _get_format_from_response(self, tags: list, start_from: int = 0): + + start_ind, end_ind = 0, -1 + content = self.response[start_from:] + for t in tags: + start_ind = content.find(t.start_tag) + if t.is_right_find_end_ind: + end_ind = content.rfind(t.end_tag, start_ind + len(t.start_tag)) + else: + end_ind = content.find(t.end_tag, start_ind + len(t.start_tag)) + if start_ind != -1: + try: + if t.include_tag: + end_ind += len(t.end_tag) + else: + start_ind += len(t.start_tag) + response_tagged = content[start_ind:end_ind].strip() + return response_tagged, start_from + start_ind, start_from + end_ind + except Exception as e: + logger.exception(f"Couldn't parse json:\n{content}") + return None, 0, -1 diff --git a/lamoom/settings.py b/lamoom/settings.py index 20baa99..9cc6868 100644 --- a/lamoom/settings.py +++ b/lamoom/settings.py @@ -35,6 +35,7 @@ os.environ.get("LAMOOM_RECEIVE_PROMPT_FROM_SERVER", True) ) PIPE_PROMPTS = {} +PROMPT_VALIDATORS = {} FALLBACK_MODELS = [] @@ -48,7 +49,11 @@ class Secrets: CUSTOM_API_KEY: str = field(default_factory=lambda: os.getenv("CUSTOM_API_KEY")) OPENAI_ORG: str = field(default_factory=lambda: os.getenv("OPENAI_ORG")) azure_keys: dict = field( - default_factory=lambda: json.loads( - os.getenv("azure_keys", os.getenv("AZURE_OPENAI_KEYS", os.getenv("AZURE_KEYS", "{}"))) + default_factory = lambda: ( + json.loads( + os.getenv("azure_keys", os.getenv("AZURE_OPENAI_KEYS", os.getenv("AZURE_KEYS", "{}"))) + ) + if os.getenv("azure_keys") or os.getenv("AZURE_OPENAI_KEYS") or os.getenv("AZURE_KEYS") + else {} ) ) diff --git a/lamoom/validators.py b/lamoom/validators.py new file mode 100644 index 0000000..762c07c --- /dev/null +++ b/lamoom/validators.py @@ -0,0 +1,291 @@ +from abc import ABC, abstractmethod +import typing as t +import json +import jsonschema +import yaml +import xmltodict +from lamoom.settings import PROMPT_VALIDATORS +from lamoom import AIResponse + + +class Validator(ABC): + def __init__(self, validator_id: str, validator_type: str, schema: t.Dict = None, retry_count: int = 0, retry_rules: t.Optional[t.Dict]= None): + self.id = validator_id + self.type = validator_type + if schema: + self.schema = schema + else: + self.schema = {} + self.retry = retry_count + if retry_rules: + self.retry_rules = retry_rules + else: + self.retry_rules = {} + self.errors = [] + self.prompt_id = None + + @abstractmethod + def validate(self, response: str) -> None: + pass + + def add_field_to_validate(self, field: str, field_type: t.Optional[t.Union[str, t.Dict]], **kwargs) -> None: + + field_type_str = isinstance(field_type, str) + field_type_dict = isinstance(field_type, dict) + if self.schema: + if field not in self.schema["required"]: + self.schema["required"].append(field) + if field_type_str: + self.schema["properties"][field] = {"type": field_type} + elif field_type_dict: + self.schema["properties"][field] = field_type + else: + self.schema = { + "type": "object", + "required": [field], + } + if field_type_str: + self.schema["properties"] = { + field: { + "type": field_type + } + } + elif field_type_dict: + self.schema["properties"] = { + field: field_type + } + if field_type_str: + for key, value in kwargs.items(): + self.schema["properties"][field][key] = value + + def attach_to_promt(self, prompt_id: str) -> None: + self.prompt_id = prompt_id + if prompt_id in PROMPT_VALIDATORS: + PROMPT_VALIDATORS[prompt_id][self.id] = self + else: + PROMPT_VALIDATORS[prompt_id] = {self.id: self} + + def clear_errors(self) -> None: + self.errors = [] + + def has_errors(self) -> bool: + return len(self.errors) > 0 + + def get_errors(self) -> t.List[t.Dict]: + return self.errors + + def add_error(self, error: t.Dict): + self.errors.append(error) + + def update_format(self, validator_type: str, validation_format: t.Dict): + self.__init__(validator_type, validation_format) + + def can_retry(self) -> bool: + error_type = self.errors[0].get("type") + if error_type: + if int(self.retry_rules.get(error_type, 0)) > 0: + self.retry_rules[error_type] -= 1 + return True + return False + + def dump(self) -> dict: + return { + "id": self.id, + "type": self.type, + "schema": self.schema, + "retry": self.retry, + "retry_rules": self.retry_rules, + "errors": self.errors, + "prompt_id": self.prompt_id, + } + + @classmethod + def load(cls, data: dict) -> 'Validator': + instance = cls( + validator_id=data["id"], + schema=data.get("schema"), + retry_count=data.get("retry", 0), + retry_rules=data.get("retry_rules"), + ) + instance.type = data["type"] + instance.errors = data.get("errors", []) + instance.prompt_id = data.get("prompt_id") + return instance + + def format_error(self, error: t.Dict) -> str: + """Format the error into a human-readable string.""" + error_type = error.get("type", "unknown_error") + if error_type == "invalid_structure": + return f"Error parsing JSON: {error.get('details', 'Unknown parsing error')}. Please check your JSON format." + elif error_type == "missing_field": + return ( + f"Missing required field: {error.get('field', 'Unknown field')}. " + f"Available fields are: {error.get('available_fields', 'N/A')}. " + f"Error location: {error.get('error_location', 'Unknown location')}." + ) + elif error_type == "invalid_type": + return ( + f"Invalid type for field: {error.get('field', 'Unknown field')}. " + f"Expected type: {error.get('expected_type', 'N/A')}, but got: {error.get('actual_type', 'N/A')}." + f"Error location: {error.get('error_location', 'Unknown location')}." + ) + elif error_type == "invalid_schema": + return ( + f"Schema error encountered: {error.get('details', 'Unknown error')}.\n" + f"Error location in schema: {error.get('error_location', 'Unknown location')}." + ) + return "An unknown error occurred." + + +class FormatValidator(Validator): + def validate(self, json_data: t.Dict): + try: + jsonschema.validate(instance=json_data, schema=self.schema) + except jsonschema.ValidationError as e: + path = list(e.path) + if path: + error_location = " -> ".join(map(str, path)) + else: + error_location = "/" + if e.validator == "required": + + available_fields = list(json_data.keys()) + + current_instance = json_data + for key in path: + if isinstance(key, int): + current_instance = current_instance[key-1] + elif isinstance(current_instance, dict) and key in current_instance: + current_instance = current_instance[key] + else: + current_instance = None + break + + if isinstance(current_instance, dict): + available_fields = list(current_instance.keys()) + + self.add_error({ + "type": "missing_field", + "field": e.args[0].split()[0], + "available_fields": available_fields, + "error_location": error_location + }) + elif e.validator == "type": + self.add_error({ + "type": "invalid_type", + "field": e.args[0], + "expected_type": e.schema.get("type", "unknown"), + "actual_type": type(e.instance).__name__, + "error_location": error_location + }) + except jsonschema.SchemaError as e: + path = list(e.context[0].context[0].absolute_path) + error_location = " -> ".join(map(str, path)) + context = e.context[0].context[0].context[0].args[0] + self.add_error({ + "type": "invalid_schema", + "details": f"Schema error: {context}", + "error_location": error_location + }) + +class JSONValidator(FormatValidator): + def __init__(self, validator_id: str, schema: t.Dict = None, retry_count: int = 0, retry_rules: t.Optional[t.Dict]= None): + super().__init__(validator_id, "json", schema, retry_count, retry_rules) + + def validate(self, response: AIResponse): + json_list = response.json_list + if json_list: + for _json in json_list: + try: + json_data = json.loads(_json["content"]) + except json.JSONDecodeError as e: + self.add_error({ + "type": "invalid_structure", + "details": f"Invalid JSON format at line {e.lineno}: {e.msg}" + }) + return + super().validate(json_data) + if len(self.get_errors()) < len(json_list): + self.clear_errors() + else: + self.add_error({ + "type": "invalid_structure", + "details": "No JSON content found in the response. " + "Expected JSON content between specified tags (e.g., '```json' and '```')." + }) + + +class YAMLValidator(FormatValidator): + def __init__(self, validator_id: str, schema: t.Dict = None, retry_count: int = 0, retry_rules: t.Optional[t.Dict]= None): + super().__init__(validator_id, "yaml", schema, retry_count, retry_rules) + + def validate(self, response: AIResponse): + yaml_list = response.yaml_list + if yaml_list: + for _yaml in yaml_list: + try: + yaml_data = yaml.safe_load(_yaml["content"]) + except yaml.YAMLError as e: + if hasattr(e, 'problem_mark'): + line = e.problem_mark.line + 1 + column = e.problem_mark.column + 1 + self.add_error({ + "type": "invalid_structure", + "details": f"Invalid YAML format at line {line}, column {column}: {str(e)}" + }) + else: + self.add_error({ + "type": "invalid_structure", + "details": f"Invalid YAML format: {str(e)}" + }) + return + super().validate(yaml_data) + if len(self.get_errors()) < len(yaml_list): + self.clear_errors() + else: + self.add_error({ + "type": "invalid_structure", + "details": "No YAML content found in the response. " + "Expected YAML content between specified tags (e.g., '```yaml' and '```')." + }) + + +class XMLValidator(FormatValidator): + def __init__(self, validator_id: str, schema: t.Dict = None, retry_count: int = 0, retry_rules: t.Optional[t.Dict]= None): + super().__init__(validator_id, "xml", schema, retry_count, retry_rules) + + def validate(self, response: AIResponse): + xml_list = response.xml_list + if xml_list: + for _xml in xml_list: + try: + content = _xml["content"] + content.replace('&', '&') + xml_dict = xmltodict.parse(content) + updated_dict = xml_dict.get(list(xml_dict.keys())[0], {}) + updated_dict = self._handle_lists(updated_dict) + except xmltodict.expat.ExpatError as e: + self.add_error({ + "type": "invalid_structure", + "details": f"XML parsing error: {e.args[0]}" + }) + return + super().validate(updated_dict) + if len(self.get_errors()) < len(xml_list): + self.clear_errors() + else: + self.add_error({ + "type": "invalid_structure", + "details": "No XML content found." + }) + return + + def _handle_lists(self, data: t.Any) -> t.Dict: + if isinstance(data, dict): + for key, value in data.items(): + if isinstance(value, dict) and (len(value.keys())==1): + children_list = value[list(value.keys())[0]] + data[key] = [self._handle_lists(item) for item in children_list] + else: + data[key] = self._handle_lists(value) + return data diff --git a/poetry.lock b/poetry.lock index 8bf1da0..98fc1fe 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.1.0 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. [[package]] name = "annotated-types" @@ -90,6 +90,26 @@ files = [ astroid = ["astroid (>=2,<4)"] test = ["astroid (>=2,<4)", "pytest", "pytest-cov", "pytest-xdist"] +[[package]] +name = "attrs" +version = "25.3.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3"}, + {file = "attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"}, +] + +[package.extras] +benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"] +tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\""] + [[package]] name = "autopep8" version = "2.3.2" @@ -1306,6 +1326,43 @@ files = [ {file = "jiter-0.8.2.tar.gz", hash = "sha256:cd73d3e740666d0e639f678adb176fad25c1bcbdae88d8d7b857e1783bb4212d"}, ] +[[package]] +name = "jsonschema" +version = "4.23.0" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, + {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rpds-py = ">=0.7.1" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=24.6.0)"] + +[[package]] +name = "jsonschema-specifications" +version = "2024.10.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, + {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, +] + +[package.dependencies] +referencing = ">=0.31.0" + [[package]] name = "jupyter-client" version = "8.6.3" @@ -2493,6 +2550,23 @@ Pygments = ">=2.5.1" [package.extras] md = ["cmarkgfm (>=0.8.0)"] +[[package]] +name = "referencing" +version = "0.36.2" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, + {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" +typing-extensions = {version = ">=4.4.0", markers = "python_version < \"3.13\""} + [[package]] name = "regex" version = "2024.11.6" @@ -2669,6 +2743,119 @@ typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.1 [package.extras] jupyter = ["ipywidgets (>=7.5.1,<9)"] +[[package]] +name = "rpds-py" +version = "0.23.1" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "rpds_py-0.23.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2a54027554ce9b129fc3d633c92fa33b30de9f08bc61b32c053dc9b537266fed"}, + {file = "rpds_py-0.23.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b5ef909a37e9738d146519657a1aab4584018746a18f71c692f2f22168ece40c"}, + {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ee9d6f0b38efb22ad94c3b68ffebe4c47865cdf4b17f6806d6c674e1feb4246"}, + {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f7356a6da0562190558c4fcc14f0281db191cdf4cb96e7604c06acfcee96df15"}, + {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9441af1d25aed96901f97ad83d5c3e35e6cd21a25ca5e4916c82d7dd0490a4fa"}, + {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d8abf7896a91fb97e7977d1aadfcc2c80415d6dc2f1d0fca5b8d0df247248f3"}, + {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b08027489ba8fedde72ddd233a5ea411b85a6ed78175f40285bd401bde7466d"}, + {file = "rpds_py-0.23.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fee513135b5a58f3bb6d89e48326cd5aa308e4bcdf2f7d59f67c861ada482bf8"}, + {file = "rpds_py-0.23.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:35d5631ce0af26318dba0ae0ac941c534453e42f569011585cb323b7774502a5"}, + {file = "rpds_py-0.23.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a20cb698c4a59c534c6701b1c24a968ff2768b18ea2991f886bd8985ce17a89f"}, + {file = "rpds_py-0.23.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e9c206a1abc27e0588cf8b7c8246e51f1a16a103734f7750830a1ccb63f557a"}, + {file = "rpds_py-0.23.1-cp310-cp310-win32.whl", hash = "sha256:d9f75a06ecc68f159d5d7603b734e1ff6daa9497a929150f794013aa9f6e3f12"}, + {file = "rpds_py-0.23.1-cp310-cp310-win_amd64.whl", hash = "sha256:f35eff113ad430b5272bbfc18ba111c66ff525828f24898b4e146eb479a2cdda"}, + {file = "rpds_py-0.23.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b79f5ced71efd70414a9a80bbbfaa7160da307723166f09b69773153bf17c590"}, + {file = "rpds_py-0.23.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c9e799dac1ffbe7b10c1fd42fe4cd51371a549c6e108249bde9cd1200e8f59b4"}, + {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:721f9c4011b443b6e84505fc00cc7aadc9d1743f1c988e4c89353e19c4a968ee"}, + {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f88626e3f5e57432e6191cd0c5d6d6b319b635e70b40be2ffba713053e5147dd"}, + {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:285019078537949cecd0190f3690a0b0125ff743d6a53dfeb7a4e6787af154f5"}, + {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b92f5654157de1379c509b15acec9d12ecf6e3bc1996571b6cb82a4302060447"}, + {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e768267cbe051dd8d1c5305ba690bb153204a09bf2e3de3ae530de955f5b5580"}, + {file = "rpds_py-0.23.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c5334a71f7dc1160382d45997e29f2637c02f8a26af41073189d79b95d3321f1"}, + {file = "rpds_py-0.23.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d6adb81564af0cd428910f83fa7da46ce9ad47c56c0b22b50872bc4515d91966"}, + {file = "rpds_py-0.23.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:cafa48f2133d4daa028473ede7d81cd1b9f9e6925e9e4003ebdf77010ee02f35"}, + {file = "rpds_py-0.23.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fced9fd4a07a1ded1bac7e961ddd9753dd5d8b755ba8e05acba54a21f5f1522"}, + {file = "rpds_py-0.23.1-cp311-cp311-win32.whl", hash = "sha256:243241c95174b5fb7204c04595852fe3943cc41f47aa14c3828bc18cd9d3b2d6"}, + {file = "rpds_py-0.23.1-cp311-cp311-win_amd64.whl", hash = "sha256:11dd60b2ffddba85715d8a66bb39b95ddbe389ad2cfcf42c833f1bcde0878eaf"}, + {file = "rpds_py-0.23.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3902df19540e9af4cc0c3ae75974c65d2c156b9257e91f5101a51f99136d834c"}, + {file = "rpds_py-0.23.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:66f8d2a17e5838dd6fb9be6baaba8e75ae2f5fa6b6b755d597184bfcd3cb0eba"}, + {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:112b8774b0b4ee22368fec42749b94366bd9b536f8f74c3d4175d4395f5cbd31"}, + {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e0df046f2266e8586cf09d00588302a32923eb6386ced0ca5c9deade6af9a149"}, + {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3288930b947cbebe767f84cf618d2cbe0b13be476e749da0e6a009f986248c"}, + {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce473a2351c018b06dd8d30d5da8ab5a0831056cc53b2006e2a8028172c37ce5"}, + {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d550d7e9e7d8676b183b37d65b5cd8de13676a738973d330b59dc8312df9c5dc"}, + {file = "rpds_py-0.23.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e14f86b871ea74c3fddc9a40e947d6a5d09def5adc2076ee61fb910a9014fb35"}, + {file = "rpds_py-0.23.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1bf5be5ba34e19be579ae873da515a2836a2166d8d7ee43be6ff909eda42b72b"}, + {file = "rpds_py-0.23.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d7031d493c4465dbc8d40bd6cafefef4bd472b17db0ab94c53e7909ee781b9ef"}, + {file = "rpds_py-0.23.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:55ff4151cfd4bc635e51cfb1c59ac9f7196b256b12e3a57deb9e5742e65941ad"}, + {file = "rpds_py-0.23.1-cp312-cp312-win32.whl", hash = "sha256:a9d3b728f5a5873d84cba997b9d617c6090ca5721caaa691f3b1a78c60adc057"}, + {file = "rpds_py-0.23.1-cp312-cp312-win_amd64.whl", hash = "sha256:b03a8d50b137ee758e4c73638b10747b7c39988eb8e6cd11abb7084266455165"}, + {file = "rpds_py-0.23.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:4caafd1a22e5eaa3732acb7672a497123354bef79a9d7ceed43387d25025e935"}, + {file = "rpds_py-0.23.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:178f8a60fc24511c0eb756af741c476b87b610dba83270fce1e5a430204566a4"}, + {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c632419c3870507ca20a37c8f8f5352317aca097639e524ad129f58c125c61c6"}, + {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:698a79d295626ee292d1730bc2ef6e70a3ab135b1d79ada8fde3ed0047b65a10"}, + {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:271fa2184cf28bdded86bb6217c8e08d3a169fe0bbe9be5e8d96e8476b707122"}, + {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b91cceb5add79ee563bd1f70b30896bd63bc5f78a11c1f00a1e931729ca4f1f4"}, + {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a6cb95074777f1ecda2ca4fa7717caa9ee6e534f42b7575a8f0d4cb0c24013"}, + {file = "rpds_py-0.23.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:50fb62f8d8364978478b12d5f03bf028c6bc2af04082479299139dc26edf4c64"}, + {file = "rpds_py-0.23.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c8f7e90b948dc9dcfff8003f1ea3af08b29c062f681c05fd798e36daa3f7e3e8"}, + {file = "rpds_py-0.23.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5b98b6c953e5c2bda51ab4d5b4f172617d462eebc7f4bfdc7c7e6b423f6da957"}, + {file = "rpds_py-0.23.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2893d778d4671ee627bac4037a075168b2673c57186fb1a57e993465dbd79a93"}, + {file = "rpds_py-0.23.1-cp313-cp313-win32.whl", hash = "sha256:2cfa07c346a7ad07019c33fb9a63cf3acb1f5363c33bc73014e20d9fe8b01cdd"}, + {file = "rpds_py-0.23.1-cp313-cp313-win_amd64.whl", hash = "sha256:3aaf141d39f45322e44fc2c742e4b8b4098ead5317e5f884770c8df0c332da70"}, + {file = "rpds_py-0.23.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:759462b2d0aa5a04be5b3e37fb8183615f47014ae6b116e17036b131985cb731"}, + {file = "rpds_py-0.23.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3e9212f52074fc9d72cf242a84063787ab8e21e0950d4d6709886fb62bcb91d5"}, + {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e9f3a3ac919406bc0414bbbd76c6af99253c507150191ea79fab42fdb35982a"}, + {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c04ca91dda8a61584165825907f5c967ca09e9c65fe8966ee753a3f2b019fe1e"}, + {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ab923167cfd945abb9b51a407407cf19f5bee35001221f2911dc85ffd35ff4f"}, + {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed6f011bedca8585787e5082cce081bac3d30f54520097b2411351b3574e1219"}, + {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6959bb9928c5c999aba4a3f5a6799d571ddc2c59ff49917ecf55be2bbb4e3722"}, + {file = "rpds_py-0.23.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1ed7de3c86721b4e83ac440751329ec6a1102229aa18163f84c75b06b525ad7e"}, + {file = "rpds_py-0.23.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5fb89edee2fa237584e532fbf78f0ddd1e49a47c7c8cfa153ab4849dc72a35e6"}, + {file = "rpds_py-0.23.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7e5413d2e2d86025e73f05510ad23dad5950ab8417b7fc6beaad99be8077138b"}, + {file = "rpds_py-0.23.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d31ed4987d72aabdf521eddfb6a72988703c091cfc0064330b9e5f8d6a042ff5"}, + {file = "rpds_py-0.23.1-cp313-cp313t-win32.whl", hash = "sha256:f3429fb8e15b20961efca8c8b21432623d85db2228cc73fe22756c6637aa39e7"}, + {file = "rpds_py-0.23.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d6f6512a90bd5cd9030a6237f5346f046c6f0e40af98657568fa45695d4de59d"}, + {file = "rpds_py-0.23.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:09cd7dbcb673eb60518231e02874df66ec1296c01a4fcd733875755c02014b19"}, + {file = "rpds_py-0.23.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c6760211eee3a76316cf328f5a8bd695b47b1626d21c8a27fb3b2473a884d597"}, + {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72e680c1518733b73c994361e4b06441b92e973ef7d9449feec72e8ee4f713da"}, + {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ae28144c1daa61366205d32abd8c90372790ff79fc60c1a8ad7fd3c8553a600e"}, + {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c698d123ce5d8f2d0cd17f73336615f6a2e3bdcedac07a1291bb4d8e7d82a05a"}, + {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98b257ae1e83f81fb947a363a274c4eb66640212516becaff7bef09a5dceacaa"}, + {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c9ff044eb07c8468594d12602291c635da292308c8c619244e30698e7fc455a"}, + {file = "rpds_py-0.23.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7938c7b0599a05246d704b3f5e01be91a93b411d0d6cc62275f025293b8a11ce"}, + {file = "rpds_py-0.23.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e9cb79ecedfc156c0692257ac7ed415243b6c35dd969baa461a6888fc79f2f07"}, + {file = "rpds_py-0.23.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:7b77e07233925bd33fc0022b8537774423e4c6680b6436316c5075e79b6384f4"}, + {file = "rpds_py-0.23.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a970bfaf130c29a679b1d0a6e0f867483cea455ab1535fb427566a475078f27f"}, + {file = "rpds_py-0.23.1-cp39-cp39-win32.whl", hash = "sha256:4233df01a250b3984465faed12ad472f035b7cd5240ea3f7c76b7a7016084495"}, + {file = "rpds_py-0.23.1-cp39-cp39-win_amd64.whl", hash = "sha256:c617d7453a80e29d9973b926983b1e700a9377dbe021faa36041c78537d7b08c"}, + {file = "rpds_py-0.23.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c1f8afa346ccd59e4e5630d5abb67aba6a9812fddf764fd7eb11f382a345f8cc"}, + {file = "rpds_py-0.23.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fad784a31869747df4ac968a351e070c06ca377549e4ace94775aaa3ab33ee06"}, + {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5a96fcac2f18e5a0a23a75cd27ce2656c66c11c127b0318e508aab436b77428"}, + {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3e77febf227a1dc3220159355dba68faa13f8dca9335d97504abf428469fb18b"}, + {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26bb3e8de93443d55e2e748e9fd87deb5f8075ca7bc0502cfc8be8687d69a2ec"}, + {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:db7707dde9143a67b8812c7e66aeb2d843fe33cc8e374170f4d2c50bd8f2472d"}, + {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1eedaaccc9bb66581d4ae7c50e15856e335e57ef2734dbc5fd8ba3e2a4ab3cb6"}, + {file = "rpds_py-0.23.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28358c54fffadf0ae893f6c1050e8f8853e45df22483b7fff2f6ab6152f5d8bf"}, + {file = "rpds_py-0.23.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:633462ef7e61d839171bf206551d5ab42b30b71cac8f10a64a662536e057fdef"}, + {file = "rpds_py-0.23.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a98f510d86f689fcb486dc59e6e363af04151e5260ad1bdddb5625c10f1e95f8"}, + {file = "rpds_py-0.23.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e0397dd0b3955c61ef9b22838144aa4bef6f0796ba5cc8edfc64d468b93798b4"}, + {file = "rpds_py-0.23.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:75307599f0d25bf6937248e5ac4e3bde5ea72ae6618623b86146ccc7845ed00b"}, + {file = "rpds_py-0.23.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3614d280bf7aab0d3721b5ce0e73434acb90a2c993121b6e81a1c15c665298ac"}, + {file = "rpds_py-0.23.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:e5963ea87f88bddf7edd59644a35a0feecf75f8985430124c253612d4f7d27ae"}, + {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad76f44f70aac3a54ceb1813ca630c53415da3a24fd93c570b2dfb4856591017"}, + {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c6ae11e6e93728d86aafc51ced98b1658a0080a7dd9417d24bfb955bb09c3c2"}, + {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc869af5cba24d45fb0399b0cfdbcefcf6910bf4dee5d74036a57cf5264b3ff4"}, + {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c76b32eb2ab650a29e423525e84eb197c45504b1c1e6e17b6cc91fcfeb1a4b1d"}, + {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4263320ed887ed843f85beba67f8b2d1483b5947f2dc73a8b068924558bfeace"}, + {file = "rpds_py-0.23.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7f9682a8f71acdf59fd554b82b1c12f517118ee72c0f3944eda461606dfe7eb9"}, + {file = "rpds_py-0.23.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:754fba3084b70162a6b91efceee8a3f06b19e43dac3f71841662053c0584209a"}, + {file = "rpds_py-0.23.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:a1c66e71ecfd2a4acf0e4bd75e7a3605afa8f9b28a3b497e4ba962719df2be57"}, + {file = "rpds_py-0.23.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:8d67beb6002441faef8251c45e24994de32c4c8686f7356a1f601ad7c466f7c3"}, + {file = "rpds_py-0.23.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a1e17d8dc8e57d8e0fd21f8f0f0a5211b3fa258b2e444c2053471ef93fe25a00"}, + {file = "rpds_py-0.23.1.tar.gz", hash = "sha256:7f3240dcfa14d198dba24b8b9cb3b108c06b68d45b7babd9eefc1038fdf7e707"}, +] + [[package]] name = "secretstorage" version = "3.3.3" @@ -3123,6 +3310,18 @@ cffi = ">=1.16.0" [package.extras] test = ["pytest"] +[[package]] +name = "xmltodict" +version = "0.14.2" +description = "Makes working with XML feel like you are working with JSON" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "xmltodict-0.14.2-py2.py3-none-any.whl", hash = "sha256:20cc7d723ed729276e808f26fb6b3599f786cbc37e06c65e192ba77c40f20aac"}, + {file = "xmltodict-0.14.2.tar.gz", hash = "sha256:201e7c28bb210e374999d1dde6382923ab0ed1a8a5faeece48ab525b7810a553"}, +] + [[package]] name = "zipp" version = "3.21.0" @@ -3146,4 +3345,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = "^3.9" -content-hash = "0d6587f748072058643c5e9a3cae6db6e58e0e364027262e7c45fdde632c22d6" +content-hash = "83eeb4fd3b77ad4977b9906d5a35e30181cd434e2f7558afeae5a1a9879ce5bf" diff --git a/pyproject.toml b/pyproject.toml index 738fb9f..336baac 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,6 +12,8 @@ pyyaml = "^6.0.1" openai = "^1.65.1" anthropic = "^0.31.2" httpx = "^0.27.2" +jsonschema = "^4.23.0" +xmltodict = "^0.14.2" [tool.poetry.dev-dependencies] poetry = "^1.7.1" diff --git a/tests/test_integrational_validators.py b/tests/test_integrational_validators.py new file mode 100644 index 0000000..9f944f4 --- /dev/null +++ b/tests/test_integrational_validators.py @@ -0,0 +1,373 @@ +import dotenv +import os +from lamoom import Lamoom +from lamoom import JSONValidator, XMLValidator, YAMLValidator +from lamoom import Prompt + +from pytest import fixture + +json_agent = Prompt("Roman Empire json") +json_agent.add(""" +Generate 10 statements about the Roman Empire and corresponding questions. +Use the following JSON format for your answer: + +```json +{ + "statements": [], + "questions": [], + "name": "" +} +``` +""", role="system") + +xml_agent = Prompt("Roman Empire xml") +xml_agent.add(""" +Generate 10 statements about the Roman Empire and corresponding questions. +Use the following XML format for your answer: + +```xml + + + + + + + + ... + + + +``` +""", role="system") + +yaml_agent = Prompt("Roman Empire yaml") +yaml_agent.add(""" +Generate 10 statements about the Roman Empire and corresponding questions. +Use the following YAML format for your answer: + +```yaml +statements: + - "" + - "" + ... +questions: + - "" + - "" + ... +name: "" +``` +""", role="system") + + +extra_json_agent = Prompt("Roman Empire json2") +extra_json_agent.add(""" +Create a JSON object that conforms to the following schema: +#it's important - ```json end in the end ``` +```json +{ + "type": "object", + "required": ["title", "author", "chapters"], + "properties": { + "title": { + "type": "string", + "minLength": 1 + }, + "author": { + "type": "object", + "required": ["name", "birthDate"], + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "birthDate": { + "type": "string", + "format": "date" + }, + "nationality": { + "type": "string" + } + } + }, + "chapters": { + "type": "array", + "items": { + "type": "object", + "required": ["title", "pageCount", "sections"], + "properties": { + "title": { + "type": "string", + "minLength": 1 + }, + "pageCount": { + "type": "integer", + "minimum": 1 + }, + "sections": { + "type": "array", + "items": { + "type": "object", + "required": ["heading", "content"], + "properties": { + "heading": { + "type": "string", + "minLength": 1 + }, + "content": { + "type": "string" + }, + "subSections": { + "type": "array", + "items": { + "type": "object", + "required": ["subHeading", "text"], + "properties": { + "subHeading": { + "type": "string", + "minLength": 1 + }, + "text": { + "type": "string" + } + } + } + } + } + } + } + } + } + }, + "published": { + "type": "boolean" + }, + "publicationDate": { + "type": "string", + "format": "date" + } + } +} +``` + +Please generate a sample data object that matches this schema and includes: +- A book title +- Author information (name, birth date, nationality) +- A list of chapters with titles, page counts, and sections, including sub-sections +- A publication flag and publication date +""", role="system") + +two_json_agent = Prompt("Roman Empire two json") +two_json_agent.add(""" +Generate 10 statements about the Roman Empire and corresponding questions. +Use the following JSON format for your answer: + +```json +{ + "statements": [], + "name": "" +} +``` + +```json +{ + "questions": [], + "name": "" +} +``` + +```json +{ + "statements": [], + "questions": [], + "name": "" +} +``` +""", role="system") + + +base_format = { + "validator_id": "base_test", + "validator_type": "json", + "schema": { + "type": "object", + "required": ["statements", "questions", "name"], + "properties": { + "name": { "type": "string" }, + "statements": { + "type": "array", + "items": { "type": "string" } + }, + "questions": { + "type": "array", + "items": { "type": "string" } + } + } + }, + "retry": 3, + "retry_rules": { + "invalid_structure": 2, + "missing_field": 2, + "invalid_type": 1 + } +} + +extra_format = { + "validator_id": "extra_test", + "validator_type": "json", + "schema": { + "type": "object", + "required": ["title", "author", "chapters"], + "properties": { + "title": { + "type": "string", + "minLength": 1 + }, + "author": { + "type": "object", + "required": ["name", "birthDate"], + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "birthDate": { + "type": "string", + "format": "date" + }, + "nationality": { + "type": "string" + } + } + }, + "chapters": { + "type": "array", + "items": { + "type": "object", + "required": ["title", "pageCount", "sections"], + "properties": { + "title": { + "type": "string", + "minLength": 1 + }, + "pageCount": { + "type": "integer", + "minimum": 1 + }, + "sections": { + "type": "array", + "items": { + "type": "object", + "required": ["heading", "content"], + "properties": { + "heading": { + "type": "string", + "minLength": 1 + }, + "content": { + "type": "string" + }, + "subSections": { + "type": "array", + "items": { + "type": "object", + "required": ["subHeading", "text"], + "properties": { + "subHeading": { + "type": "string", + "minLength": 1 + }, + "text": { + "type": "string" + } + } + } + } + } + } + } + } + } + }, + "published": { + "type": "boolean" + }, + "publicationDate": { + "type": "string", + "format": "date" + } + }, + + }, + "retry": 3, + "retry_rules": { + "invalid_structure": 2, + "missing_field": 2, + "invalid_type": 1 + } +} + +@fixture +def client(): + base_shema = base_format["schema"] + base_retry_count = base_format["retry"] + base_retry_rules = base_format["retry_rules"] + base_validator_id = base_format["validator_id"] + + json_validator = JSONValidator(base_validator_id, base_shema, base_retry_count, base_retry_rules) + xml_validator = XMLValidator(base_validator_id, base_shema, base_retry_count, base_retry_rules) + yaml_validator = YAMLValidator(base_validator_id, base_shema, base_retry_count, base_retry_rules) + json_validator.attach_to_promt(json_agent.id) + xml_validator.attach_to_promt(xml_agent.id) + yaml_validator.attach_to_promt(yaml_agent.id) + + extra_shema = extra_format["schema"] + extra_retry_count = extra_format["retry"] + extra_retry_rules = extra_format["retry_rules"] + extra_validator_id = extra_format["validator_id"] + extra_json_validator = JSONValidator(extra_validator_id, extra_shema, extra_retry_count, extra_retry_rules) + extra_json_validator.attach_to_promt(extra_json_agent.id) + + dotenv.load_dotenv('./.env') + openai_key = os.getenv("OPENAI_API_KEY") + lamoom = Lamoom(openai_key=openai_key) + return lamoom + +def test_json(client: Lamoom): + response = client.call( + json_agent.id, + {}, + 'openai/o3-mini', + ) + assert not response.errors + +def test_xml(client: Lamoom): + response = client.call( + xml_agent.id, + {}, + 'openai/o3-mini', + ) + assert not response.errors + +def test_yaml(client: Lamoom): + response = client.call( + yaml_agent.id, + {}, + 'openai/o3-mini', + ) + assert not response.errors + +def test_extra_json(client: Lamoom): + response = client.call( + extra_json_agent.id, + {}, + 'openai/o3-mini', + ) + assert not response.errors + +def test_two_json(client: Lamoom): + response = client.call( + two_json_agent.id, + {}, + 'openai/o3-mini', + ) + assert not response.errors \ No newline at end of file diff --git a/tests/test_validators.py b/tests/test_validators.py new file mode 100644 index 0000000..a3d21fc --- /dev/null +++ b/tests/test_validators.py @@ -0,0 +1,423 @@ +import pytest + +from lamoom import JSONValidator, XMLValidator, YAMLValidator +from lamoom import AIResponse + +format = { + "validator_id": "test_validator", + "validator_type": "json", + "schema": { + "type": "object", + "required": ["statements", "questions", "name"], + "properties": { + "name": {"type": "string"}, + "statements": { + "type": "array", + "items": {"type": "string"} + }, + "questions": { + "type": "array", + "items": {"type": "string"} + } + } + }, + "retry": 3, + "retry_rules": { + "invalid_structure": 2, + "missing_field": 2, + "invalid_type": 1 + } +} + +prompt_id = "Statements and Questions" +schema = format["schema"] +retry_count = format["retry"] +retry_rules = format["retry_rules"] + +@pytest.fixture +def json_validator(): + validator = JSONValidator("test_json", schema, retry_count, retry_rules) + validator.attach_to_promt(prompt_id) + return validator + +def test_valid_json(json_validator): + response = AIResponse(_response="""```json +{ + "statements": ["Statement 1", "Statement 2"], + "questions": ["Question 1", "Question 2"], + "name": "Test Name", + "extra_field": "Extra value" +} +``` +""") + json_validator.validate(response) + assert not json_validator.has_errors() + +def test_invalid_json(json_validator): + response = AIResponse(_response="""```json +{ + name: "Test Name", + "statements": ["Statement 1"], + "questions": ["Question 1"] +} +``` +""") + json_validator.validate(response) + assert len(json_validator.get_errors()) == 1 + assert json_validator.get_errors()[0]['type'] == "invalid_structure" + +def test_missing_required_field_json(json_validator): + response = AIResponse(_response="""```json +{ + "statements": ["Statement 1"], + "questions": ["Question 1"] +} +``` +""") + json_validator.validate(response) + assert len(json_validator.get_errors()) == 1 + assert json_validator.get_errors()[0]['type'] == "missing_field" + +def test_invalid_type_json(json_validator): + response = AIResponse(_response="""```json +{ + "name": "Test Name", + "statements": ["Statement 1"], + "questions": "This should be an array" +} +``` +""") + json_validator.validate(response) + assert len(json_validator.get_errors()) == 1 + assert json_validator.get_errors()[0]['type'] == "invalid_type" + +def test_no_json_content(json_validator): + response = AIResponse(_response="""No JSON content here!""") + json_validator.validate(response) + assert len(json_validator.get_errors()) == 1 + assert json_validator.get_errors()[0]['type'] == "invalid_structure" + +@pytest.fixture +def xml_validator(): + validator = XMLValidator("test_xml", schema, retry_count, retry_rules) + validator.attach_to_promt(prompt_id) + return validator + +def test_valid_xml(xml_validator): + response = AIResponse(_response=""" +```xml + + + Statement 1 + Statement 2 + + + Question 1 + Question 2 + + Test Name + +``` +""") + xml_validator.validate(response) + print(xml_validator.get_errors()) + assert not xml_validator.has_errors() + +def test_invalid_xml(xml_validator): + response = AIResponse(_response="""```xml + + Test Name + + Statement 1 + + +``` +""") + xml_validator.validate(response) + assert len(xml_validator.get_errors()) == 1 + assert xml_validator.get_errors()[0]['type'] == "invalid_structure" + +def test_missing_required_field_xml(xml_validator): + response = AIResponse(_response=""" +```xml + + + Statement 1 + Statement 2 + + + Question 1 + Question 2 + + +``` +""") + xml_validator.validate(response) + assert len(xml_validator.get_errors()) == 1 + assert xml_validator.get_errors()[0]['type'] == "missing_field" + +def test_invalid_type_xml(xml_validator): + response = AIResponse(_response="""```xml + + Test Name + + Statement 1 + + This should be array + +``` +""") + xml_validator.validate(response) + assert len(xml_validator.get_errors()) == 1 + assert xml_validator.get_errors()[0]['type'] == "invalid_type" + +def test_no_xml_content(xml_validator): + response = AIResponse(_response="""No XML content here!""") + xml_validator.validate(response) + assert len(xml_validator.get_errors()) == 1 + assert xml_validator.get_errors()[0]['type'] == "invalid_structure" + + +@pytest.fixture +def yaml_validator(): + validator = YAMLValidator("test_yaml", schema, retry_count, retry_rules) + validator.attach_to_promt(prompt_id) + return validator + +def test_valid_yaml(yaml_validator): + response = AIResponse(_response=""" +```yaml +statements: + - Statement 1 + - Statement 2 +questions: + - Question 1 + - Question 2 +name: Test Name +``` +""") + yaml_validator.validate(response) + assert not yaml_validator.has_errors() + +def test_invalid_yaml(yaml_validator): + response = AIResponse(_response=""" +```yaml +name: Test Name +statements: +Statement 1 +questions: +Question 1 +julia +``` +""") + yaml_validator.validate(response) + assert len(yaml_validator.get_errors()) == 1 + assert yaml_validator.get_errors()[0]['type'] == "invalid_structure" + +def test_missing_required_field_yaml(yaml_validator): + response = AIResponse(_response=""" +```yaml +statements: + - Statement 1 +questions: + - Question 1 +``` +""") + yaml_validator.validate(response) + assert len(yaml_validator.get_errors()) == 1 + assert yaml_validator.get_errors()[0]['type'] == "missing_field" + +def test_invalid_type_yaml(yaml_validator): + response = AIResponse(_response=""" +```yaml +name: Test Name +statements: + - Statement 1 +questions: This should be an array +``` +""") + yaml_validator.validate(response) + assert len(yaml_validator.get_errors()) == 1 + assert yaml_validator.get_errors()[0]['type'] == "invalid_type" + +def test_no_yaml_content(yaml_validator): + response = AIResponse(_response="""No YAML content here!""") + yaml_validator.validate(response) + assert len(yaml_validator.get_errors()) == 1 + assert yaml_validator.get_errors()[0]['type'] == "invalid_structure" + + +@pytest.fixture +def empty_json_validator(): + validator = JSONValidator("test_empty_json") + validator.attach_to_promt("test_prompt") + return validator + +def test_no_empty_validator_json_content(empty_json_validator): + response = AIResponse(_response="""No JSON content here!""") + empty_json_validator.validate(response) + assert len(empty_json_validator.get_errors()) == 1 + assert empty_json_validator.get_errors()[0]['type'] == "invalid_structure" + +def test_invalid_empty_validator_json(empty_json_validator): + response = AIResponse(_response="""```json +{ + name: "Test Name", + "statements": ["Statement 1"], + "questions": ["Question 1"] +} +``` +""") + empty_json_validator.validate(response) + assert len(empty_json_validator.get_errors()) == 1 + assert empty_json_validator.get_errors()[0]['type'] == "invalid_structure" + +def test_valid_empty_validator_json(empty_json_validator): + response = AIResponse(_response="""```json +{ + "statements": ["Statement 1", "Statement 2"], + "questions": ["Question 1", "Question 2"], + "name": "Test Name", + "extra_field": "Extra value" +} +``` +""") + empty_json_validator.add_field_to_validate("statements", "array") + empty_json_validator.validate(response) + assert not empty_json_validator.has_errors() + + +def test_missing_required_field_empty_validator_json(empty_json_validator): + response = AIResponse(_response="""```json +{ + "statements": ["Statement 1"], + "questions": ["Question 1"] +} +``` +""") + empty_json_validator.add_field_to_validate("name", "string", minLength = 1) + empty_json_validator.validate(response) + assert len(empty_json_validator.get_errors()) == 1 + assert empty_json_validator.get_errors()[0]['type'] == "missing_field" + +def test_invalid_type_empty_validator_json(empty_json_validator): + response = AIResponse(_response="""```json +{ + "name": "Test Name", + "statements": ["Statement 1"], + "questions": "This should be an array" +} +``` +""") + empty_json_validator.add_field_to_validate("questions", "array") + empty_json_validator.validate(response) + assert len(empty_json_validator.get_errors()) == 1 + assert empty_json_validator.get_errors()[0]['type'] == "invalid_type" + +field_type = { + "type": "array", + "items": { + "type": "object", + "required": ["title", "content"], + "properties": { + "title": { + "type": "string", + "minLength": 1 + }, + "content": { + "type": "array" + } + } + } + } + +@pytest.fixture +def empty_extra_json_validator(): + validator = JSONValidator("test_empty_extra_json") + validator.attach_to_promt("test_extra_prompt") + return validator + +def test_no_extra_empty_validator_json_content(empty_extra_json_validator): + response = AIResponse(_response="""No JSON content here!""") + empty_extra_json_validator.validate(response) + assert len(empty_extra_json_validator.get_errors()) == 1 + assert empty_extra_json_validator.get_errors()[0]['type'] == "invalid_structure" + +def test_invalid_extra_empty_validator_json(empty_extra_json_validator): + response = AIResponse(_response=""" +```json +{ + name: "Test Name", + "statements": ["Statement 1"], + "questions": ["Question 1"] +} +``` +""") + empty_extra_json_validator.validate(response) + assert len(empty_extra_json_validator.get_errors()) == 1 + assert empty_extra_json_validator.get_errors()[0]['type'] == "invalid_structure" + +def test_valid_extra_empty_validator_json(empty_extra_json_validator): + response = AIResponse(_response=""" +```json +{ + "statements": [{"title": "Statement1", "content": ["Some content"]}], + "questions": ["Question 1", "Question 2"], + "name": "Test Name", + "extra_field": "Extra value" +} +``` +""") + empty_extra_json_validator.add_field_to_validate("statements", field_type) + print(empty_extra_json_validator.schema) + empty_extra_json_validator.validate(response) + print(empty_extra_json_validator.get_errors()) + assert not empty_extra_json_validator.has_errors() + +def test_missing_required_field__extra_empty_validator_json(empty_extra_json_validator): + response = AIResponse(_response="""```json +{ + "statements": [{"title": "Statement1", "content": ["Some content"]}], + "questions": ["Question 1", "Question 2"], + "name": [{"name": "Test Name"}], + "extra_field": "Extra value" +} +``` +""") + empty_extra_json_validator.add_field_to_validate( + "name", + { + "type": "array", + "items": { + "type": "object", + "required": ["name", "subname"], + }, + } + ) + empty_extra_json_validator.validate(response) + assert len(empty_extra_json_validator.get_errors()) == 1 + assert empty_extra_json_validator.get_errors()[0]['type'] == "missing_field" + +def test_invalid_type_extra_empty_validator_json(empty_extra_json_validator): + response = AIResponse(_response="""```json +{ + "statements": [{"title": "Statement1", "content": ["Some content"]}], + "questions": ["Question 1", "Question 2"], + "name": [{"name": "Test Name", "subname": "Test Subname"}], + "extra_field": "Extra value" +} +``` +""") + empty_extra_json_validator.add_field_to_validate( + "questions", + { + "type": "array", + "items": { + "type": "object", + "required": ["question", "subquestion"], + }, + } + ) + empty_extra_json_validator.validate(response) + assert len(empty_extra_json_validator.get_errors()) == 1 + assert empty_extra_json_validator.get_errors()[0]['type'] == "invalid_type" \ No newline at end of file