{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# ImageJ Tutorials and Demo\n", "\n", "Welcome to the ImageJ tutorial series. These notebooks offer a hands-on series of lessons for learning ImageJ.\n", "\n", "* For a quick demo of what ImageJ can do, ___just scroll down___!\n", "\n", "* To dive in to the tutorials, click the links below. If ImageJ is new to you, please try the \"Using ImageJ\" notebooks first.\n", "\n", "* For a thorough academic overview of the ImageJ software stack, including its features, history, motivation and goals, see:\n", " > Rueden, C. T., et al. \"[ImageJ2: ImageJ for the next generation of scientific image data](https://arxiv.org/abs/1701.05940).\" arXiv preprint (2017).\n", " \n", "* Learn more about ImageJ at [imagej.net](https://imagej.net/). Learn more about Jupyter Notebook at [jupyter.org](https://jupyter.org/).\n", "\n", "Feedback is very welcome! Please share your ideas on the [ImageJ Forum](http://forum.imagej.net/)!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "
\n", "
\n", "
\n", "
\n", "
\n", "

1. Using ImageJ

\n", "
    \n", "
  1. Fundamentals of ImageJ
  2. \n", "
  3. Introduction to ImageJ Ops
  4. \n", "
  5. N-dimensional image processing (incomplete)
  6. \n", "
  7. Working with tables
  8. \n", "
  9. Mixed World: Using ImageJ 1.x (incomplete)
  10. \n", "
\n", "
\n", "
\n", "

2. Extending ImageJ

\n", "
    \n", "
  1. Scripting: the easy way to extend ImageJ (incomplete)
  2. \n", "
  3. Extending ImageJ: Data I/O
  4. \n", "
  5. Extending ImageJ: Commands (incomplete)
  6. \n", "
  7. Extending ImageJ: Ops (incomplete)
  8. \n", "
  9. Extending ImageJ: Tools (incomplete)
  10. \n", "
\n", "
\n", "
\n", "
\n", "
\n", "

3. Advanced usage

\n", "
    \n", "
  1. Under the hood: SciJava (incomplete)
  2. \n", "
  3. Under the hood: ImgLib2
  4. \n", "
  5. Under the hood: ImageJ (coming later)
  6. \n", "
  7. Under the hood: SCIFIO (coming later)
  8. \n", "
\n", "
\n", "
\n", "

4. Advanced extensions

\n", "
    \n", "
  1. Writing a reusable op (coming later)
  2. \n", "
  3. Creating a custom service (coming later)
  4. \n", "
  5. Customizing module execution (coming later)
  6. \n", "
  7. Creating a SCIFIO plugin (coming later)
  8. \n", "
\n", "
\n", "
\n", "
\n", "
\n", "
\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# ImageJ Demo" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "ImageJ is ready to go." ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#@ImageJ ij\n", "\n", "// Behind a firewall? Configure your proxy settings here.\n", "//System.setProperty(\"http.proxyHost\",\"myproxy.domain\")\n", "//System.setProperty(\"http.proxyPort\",\"8080\")\n", "\n", "\"ImageJ is ready to go.\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Load some images" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[INFO] Populating metadata\n", "[INFO] Populating metadata\n", "[INFO] Populating metadata\n", "[INFO] Populating metadata\n" ] }, { "data": { "text/html": [ "
cellsmandrill
" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sourcePath = \"http://imagej.net/images\"\n", "//sourcePath = System.getProperty(\"user.home\") + \"/data\"\n", "cells = ij.io().open(sourcePath + \"/FluorescentCells.jpg\")\n", "mandrill = ij.io().open(sourcePath + \"/baboon.jpg\")\n", "[[\"cells\":cells, \"mandrill\":mandrill]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Compute and display per-channel histograms" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAyAAAAGQCAIAAADZR5NjAABp30lEQVR42uzdC1BUZ54/fHbJLrvssC+1yy5Zd5YNu9YsW2atWDXUUmu2zPAfd61/8S4zvvP6DzVk1nnNmDAbMyQ6MTESlbQCrbQ0NxuaRlpawFZRBBFsBUWInbSK0QjReIkaJYjxrniN7+/0Tx8PfaNpmqYv3291nTrnec5zuvt085wP55w+J+wIgiAIgiAI4tWEYRUgCIIgCIIAWAiCIAiCIAAWgiAIgiAIgIUgCIIgCIIAWAiCIAiCIAAWgiAIgiAIgIUgCIIgCIIAWAiCIAiCIAAWgiAIgiAIgIUgCIIgCIIAWAiCIAiCIAAWgiAIgiAIgIUgCIIgCAJgIQiCIAiCIAAWgiAIgiAIgIUgCIIgCAJgIQiCuEp3d3dLS4vJZMKqQBAEAbAQBHErbW1tidbIC2fMmEElRqORxklXYWFhEyZMwLpCEAQBsBAEcSvsJ4q8kDhFJTqdjsa7uroyMjIWLlw47KJottTUVKxSBEEALARBAKxhgOXwEGF9fb1KpdJqtU1NTVxCM/ByaOaOjg4xJ41rrLE/yNjQ0FBcXEzlFotFtJI/HY0YDAYaMZvN9GKUSqVer6cZuDnP2dbWxnPSU9ByuJxmo9cm5kQQBAGwEATxL2DZHCIktcyYMYNKwq0RDbkJR+zHWrhwYUREhJg5PT1dPAWN88w0Q1JSkmglni4jI4MLCVvcPDIykkomTpzY1dUl5kxMTJw9ezYvKjo6mtAWHx/PkzNnzsTniyAIgIUgyHgCK1UWpoxDYNXW1tJkXFycxWIxm816vZ7L7fdgaTQabkhVRKJJkybRZFZWFlUVFxfTeExMDFXRzNOmTbMBFnGKnoJ8ptVqqS0tiqroGZOTk8VCeE56qZMnT1apVDQ/TUZFRZHM5s2bx+P4fBEEAbAQBBlPYCXKwrudHAKrra2N9yfNmTOHD88962iG7gnjHV1kHZ5UKpU0SRii8ZkzZ8p3dCkUChtgkY1sFk6TZDuah2qJUGJOchU578jTXWL0qhy+GARBEAALQZBxAJa80MUhQsqiRYsIQLyfKS0tTZzqZLOcKVOm0CThiSdpaTQZGxtL42Q4sSPKIbDkT0e0mjp1Kj8dP68cWOL3j3xIUTwdgIUgCICFIEggAeuI9aeFmZmZfCSRvOXQNNOnT6fJ+fPn8yQfFpw0adKRpzu3xN6muXPnugBWSkoKo8pisbCiACwEQQAsBEGCCljyXxTyATtBKD6wyL/7o+Tk5PA56XwIj73FRwx5l1V0dDSNELN4v5QzYE2ePJlKNBpNd3c3n4PFMgOwEAQBsBAECRJgsY3i4uJITlwuTpbiM6vCw8PJUlwya9YsPpmdFzht2jRxJQU+sZ0XlZmZ6QJYfMY6n8/OrUhyarUawEIQBMBCEMRPYzabFdbIC1UqFZWwnHgGKhHz19bW5uTkkHuUSiWDSYTcQ1rSarWihGZeZI3Ys8UhYxmNRqqlEb7OAu/csnk6TnFx8fz582lmMU664jn5B4YUWhpNiuty2b8pBEEQAAtBkCBPSkoKAUin05GWIiMjIyIihI0QBEEArGf/0broHF3M0NDQQP+Jul+OIEgQpLu7OyEhQVyYNC4uTq1WY7UgCAJgPUtSUpL47XRiYqL8FhmuZ2hra6Melv9znTJlCl+a2UU5giBBFvrrtrmvDoIgCID1JOL+X3wi6uzZs92cYdq0aTExMdS3mkwm4pS45KCzcgRBEARBkFABlohWqyU/paWluTNDU1OT/DrOycnJ4eHhhCpn5TaLMhqNYnzlypXZCIIgCIJ4KfLfqSDjDyy+yI24MZnrGfiSg3y1QAqpiy+f46xcuEp8/GKxYry/v/+xNTSCEpSgBCUoQQlKPCuRb2SRcQbW3Llzw8PDxY0vhp2BL6UjIMUXsCEyOyu3WZoNsB4jCIIgCOKlAFj+Aqw5c+ZERka62KNoPwPflYzUxZN8Pej6+npn5QAWgiAIggBYIQSs+fPn810s5IUtLS1EJb5KocMZzGZzVFTU1KlTeXLSpEkxMTEWi8VZOYCFIAiCIABWqADLZDLxbSsSnyYzM/OI7J4Vzmag0AgfNOS7ZIhrLjsrB7AQBEEQBMAKCWB1dHSkDs3SpUuPWG+XERMTQzZyNgOHFEXkmjp1ak5OjnyxzsoBLARBEAQBsELrV4Q2hwgJWPbnTnkrABaCIAiCAFghByydTufieg0AFoIgCIIAWACW3wXAQhAEQRAAC8ACsBAEQRAEwAKwACwEQRAEAbAQAAtBEARBEAALwAKwEARB/D3nb/cWfDm78tQCrAoACwGwEARBEM+zt79m07ncS3fPAlgAFgJgIQiCIN4J6YpQRbQCsAAsBMBCEARBACwEwAKwACxknHLwqPS4dw9rAkEALATAArAALMRL+SBPely5hjWBIAAWAmABWAAWAmAhiA+B1XlpI43s+rYKwAKwEAALQTwB1qNH0uS1G1g3CPIMWDv7Kmi45Xw+gAVgIQAWgngCLBqnEqUG6wZBACwEwAKwACwEwEIQAAsBsAAsAAsJJmCBZUjwhSxFDwALwIKcACwAC/E+sC5dfnzq7OMbtwAsBMACsAAsZJyApdPp5s+fn5qampaWZjQanc1Dtenp6TYzjLQcwEJ8A6yN26XJg0cBLATAArAALGScgDVlyhSS0Jw5c+Li4sLDwzUajc0MSqWSymfNmpWSkkIjxcXFnpUDWMhYAGvwrjTyzbdOgUUz7Op83HUAwEIALATAQsbjECHRKiwsbObMmfJCi8USExNDCONJQtjEiRM9KAewkDECFuGJxtdvcQosF0cPASwkpIB1/f4APR59/whrCcBCfAqspUuXErAyMzPlhXq9ngrnzJnDkykpKTTZ0NAw0nKeNBqN2U9jj63+/n7+ZtAISlDiokQOrIbWWzReWnVNUInmKTdcocn2rutCUYrCe7wcthdV0eT+T7+Ut8J6RkkQlDCwak5m03BDz0oBLO2Jd7jqdN+XWGNBXwJg+RGw2traYmJi4uPjOzo65OU5OTkkpIyMDJ4kOdGkVqsdaTn2YCF+sgfLRRWCBG6u3x8wX97ac63TxR4srqI5sbqwBwvxEbBIV0SrSZMm0YhNlUqlkoMpPT2dJvV6/UjLASzE98Da3SXVfnrY3SoECdzwDQfZVQAWAmD5BbBYV1OmTDGbzfa1RqORhERO4snp06fTJDUZaTmAhfgeWPU7RlbFuXdPWvKtO1jNCICFAFgAlqexWCwJCQkREREEoxZr+BChWq1OTU3lPU80Q1xcHM3Z1dUVHR2dnJzMbUdaDmAh7uTUWQk92trhgXXoqHSkb5vJy8CiZVIhzSaP5XOp5Mx5fD4IgIUAWACWGyFRhQ0NuYrKMzIyaFyhUNB4fX19TEzMxIkTJ0yYQHISZ6yPtBzAQkYJLK4iDzGw1lRLw+p6dxXV3C6V127zBFhuXlgLQQAsBMACsJ7swdINDXuI4BUfH69UKnm2jo4OtVpdXFxscxhxpOUAFjLWwOo6IB00rHOkKG7IkwAWErLAMvXpqPbrW/g2A1iIry7TIA/RatKkScSvMVo+gIWMEbBcKArAQgAsetSd/ZiGPdc6sdIALGQcgNXd3T2mywewEL8CVtl6aXjtBoCFBCStzJe3HrrSCmAhAFYAAGusA2AhfgUsruKfJQJYSGCFdCUsBWAhABaABWAhABaCAFgIgAVgAVjI+AGL6EPlTB/fAMvFpeERBMBCACwAC8BCggFYfDXRSiOA5eU86rt4//BBGuKLB2AhABaABWAhAJYtsNbVP5Tu6Fx6B8AaUe7otd/9r3+lIb54ABYCYAFYABYCYNkCq6r+Lg0/Kr5iryj37eUmsO4+uk2btO4rOx3sEPr+0fX7AzcfXAGwEAALAbAALAALCWBgqesu0nBV7UkG1vJSSVrVWx4JRbmwlw2wer89Q1udfd3XXQOLCMWbq2s3JJM9evTsdYoqAAvxc2B9ermBvu0X7pzACgSwACwACwna3LglSeXBgyHAohF6cKH7wKKHFVX3PADWtq/qaMPT+NkJedW5C9LL2NDoAFjy/V4AFhJYwGr8ppBnwAoEsAAsAAsJ2hCnSCrkGDmwWFFfnpJKtrf5DlhbzV/Q+Nr6Qfszt9wH1s0HV2j80fePACwEwEIALAALwEL8DljyE618A6zqzn00rqo94yawWk830vhXNyzyKt6Y+f9ddQGsAA35iR4AFgJgAVgAFuIvwFpX/4CGm3Y89ABYda0DK6rO6ncfkQOLW/EpwwAW4pswlQAsBMACsAAsxF+Apao9TUPdtm89ABa3Wr2x1x5YHf11tEnb9+3G/EMLyr/42E1g3X5w7fzt3kt3zwJYCICFAFgAFoCFBCewirb0Li4aKGno8QBYu/rW0nDzcT0/l5vA6rnWydtCAAsBsBAAC8ACsJAxAVbvSemEcRr6Hli5ax6JqqL6494CVuclI23nvr4lnbrFl8iyIReAhQBYCIAFYAFYyNgCi681xcNRAqtsozSs3X7HTWBxK16IQ2DJ7WUDLMP+XTkm7bbjm+2Btf1Csc3pWWKjOCywHn5/n5rcfnBNXkgl52/3OtwxZnPTm6u//Bk9AKwgS9+dk/TVar6wBsBCAKwAA1Z3d7ezKovF0tHR4bCc4n45gIXIc+Wa9PAMWKqqG1b6nLUHFk+yorwOLNWGE4qtW1StDfJW1Z37vAssgpR9FW9KaWg//2et2RVdv6QhTxKb6MHjBC8iFA0BrEAMU4m+D/JvBYCFAFgBACyTyZSZmTlt2rSoqKiWlhb7Gcxmc3Jycpg1cXFxer1elE+fPj08PDwiIiI1NVXgzFk5gBWy4UuGOgxTyTNgKXQXaLhy/SmPgVVVf5+GS4qvjQhYDp9r3IG1b/dHVEVDe2A5VNSNdzOo8GZeNoAFYCEAFoA1JtFoNLNmzZo8eTL5ySGwZs+eHRkZ2dTURBSLiYlJSkricsITmayhocFgMJClaDbX5QBWyIY9JLC1q/OZt3wJLIKUqCrZ8pV0sK/2a/tWvgHWF9f20rZt77frfQCs3m15jVU/pyGAFWTAunT3LJV0DmwEsBAAy38PEZKKnAErLS2NnETAovFJkybNnDmT93uFh4fPmDGD55k6dSrN09XV5awcwAKwOHzTm12d4wAse0U5bOUVYK2o6V6i691ystIZsHjLxxs5j4ElP9HKIbBYUR0N78irAKygAZZcUQAWAmAFHrCIVjExMZGRkaSl+Pj4trY23u9F82dkZPA8s2bNosna2lpn5TxpNBqzn8YeW/39/fzNoBGUBFMJe4hLGlpv0Xjjrsc00rDjvBxY1Zulu9OUG67IgZVfdpuGFbV3BbAUhffkwMqrlm4dmLOuV44entRsOieAlVX0HT2EhwqMPc5acRUDi56Ln46B5aKVrm23AJZ4LpqUPHSumd74Z0c7BbBotWzoWSnNf2oVbwvt1+HRC/upSt+bJV+rzabFVLi742O5orgVA6ttx/u8HDmwWusyuEr+6fS98SsBrIHSAnxX/bak5mQ2fXx7j26nEgYWl4gRVhR/o2yquJCBpT3xDlcZTn4kgEUzYD0HZQmAFRjAIlFNmjQpNjaWZiBgNTQ0UKFCoZBDikZoUqvVOivHHizswZLvwbLZTTVGe7A0W6UjgKXGS6PZg7W8VPJZfu0pd1rZVDGwRroH687DmzTz6VuH7atsdlNVdP2SHtiDhT1Y2IOFYA9WQAJrsjXd3d1KpTI6OpqkRYVkJjmkZs6cSZNGo9FZOYAFYPkeWCP1kENgjWaBngHLZnvpAli8QMt322lm094P3ASWvMr/gfXwm/N3W5seHD0MYAFYCIAVDMDq6uqicbPZ3NbWRuVpaWlcnpmZSZMNDQ0dHR0RERHJyclcPmXKlKioKJrfWTmABWCFLLA+vdxgvrz16LU9wwKr785J2oLuuKgZEbB4U9rc+d7ogUWUoYdffXno9dArvKUM3V4CwEIArEAFFhFKp9NNnTqV5KRUKg0Ggzi0p1Aouru7Y2JioqOj1Wp1bW3t5MmTY2Nj+coLs2fPJktpNBpqFR4eTvYSvzp0WA5gAVihCSy+yDv/opAeX92w9FzrbL5Qag8s3gTy5tAGWLdLVxOJOpqkGdrbP6QlfH3rKC9w47FFErD2zJduidj8HllksHYdK6pz3W8aq36+c8fvpBk6fi/NfOpje2B9V1PCC5T/9hDAArAQAAvAGu1lGhJl4R8AEq2ioqJoyGemJyUl0SQxKzk5mX9OeMR6VVKyFHkrLi5OHBN0UQ5gAVgAltjO8TaPN3LGswraHNLDBbDk+6Kad0tg2mB+ixe4of3/k5ZvmicBq+EdxpN9FQ+phBXFVfs3zW9XpXzauoyfywWwiDjjopxhgfX9zRt39NrBzXUAFoCFAFj+eIjQJl1dXRMmTBDXFPV6AKwQBNaJ048PHn28vS0wgOWVqvUHtio7c7efrnMNLN7g2VS1nrba6/Dv7YElqDR6YHEhH150Dazx2rk1LLAe9V2kGdy5LxCABWABWMj4A0utVufk5Izd8gGsEASWC0V5Cqxv/BxY8ktkjRRYLcfy2EN39Fp6eBFY/NvDIcCyHl7ceGyRvaIenjxOS7tduhrAGhda8YM+ndO3Dst/WwpgIQBWoAJrrANgAVgAlpvAsj9dfZTAGnbnlvyzu3/4oHh294HFLLupWOzm/N/fuUNO+v7aVZ68XVZIorpv7iRd3albF7LAGpGiACwEwAKwACwAC8AKVGAN1q4j6zw897XrT5xbOUSPzSlTZCma7VbRSrmiqEQ6AX/ZB1Jh/nI3gXWvo41ARlYDsAAsBMACsAAsACv4gcVVqzf2jgZYvao3LIv+c3dT5pgCq12VQg8XwOIRKvQYWDY7nEhO9opyE1h89JBn47sG0QgtH8ACsBAAC8ACsAAsAGsYYDVW/ZweblJplMCSX6lrcHMdkeVC5XJ69s51v3ETWA9PHif3DG4xugmsZutTd9ctHBGwvr92lZYz2FhvD6w75SX0Iu9b9gNYABaAhQBYABaABWBJVRWHXpeqjmfLgTUiKnkRWHf0WlrUCd0H9kcqXQCLW914/3djCiz5fi8bYPGkv10uFcBCACwAC8BCAKyxBVbpZ0XKztxNp4sdAMv8KxrW9ywZX2Ddt+wnoNzWqN0E1vX7A/R49P0je2Dx1bPE2eseA+vmxx/Kz5oHsAAsBMACsAAsBMAaAiyu0h8wjgWw2psye978yZkVb4wGWPKLvLsDLG5FxrIHFreSnxflIbCeKioUgHXl3kVyj+W77T4AlqhCNwVgAVgAFgJgBSSweJxrxw5YXqnyOrA2nswWN70GsIaNZ1cTBbAQAAvAArCCORf7H586+3jwLoAV8MA6VPNebeOstsZMe2DdrpBOJL9Tqyfo3C4r5FbXrn1tDyxaAj02fPURgAVgIQAWgAVgIZ6ESMQP0gMZC8AKdGDZXHOLr/8u37l106ocYg23OvC10Xx56/lNBXJgcdX6Pb+WFLXpQ+msLFWOPbD2NL7bWPXzg3W/HxZYjy71E9Fu5S3zB2DdfXT7+v0BGo5+UZbvthOGugY2kXXav60GsBAAC8ACsBAHimJgDd6VRi72A1gOgKXeZllWs0+/v0na4J1Z5lfAOqSZ265K2dX8O9dHD22AVfdVFg0Pb1/uFFjW3VQ2+6IYWC2t0nPR+LDAcrPKN8AiUNLLpuHoFzV6RY0SWD3XOulx/9FddGUAFoAFYCH+C6zDPRKtaOimokIQWLnrztCwZFsnbd5qj7zrV8By8/QsACuYgCU/kQ4BsAAsAAvxU2CNVFFuAqu09pYASpAAa+Nu2qrVWP0hgLV5/9uSNrreD25g8Z1tmne+5QGwjlW8265KOav9yLW9XNxgx8fAIsG4PgwHYCEAFoAFYCHjAKziun4a5q07GzTAytH2Su/LsN0eWJt2vz6+inJRZdr4em3jrK81i0cPLPbQ9pbfegAsbuVwgTx5rUBxdtbLlwuWuvntPXXzEDnp0t2zYwQsXg97+2vIPQ6fBcBCACwAC8BCxgFY6rqL0l4f/ZngAZbmmASsdY32wDI0LVZ25m7evsQPgcUjJ3QfjBGwHvVdfHSpf0TA+i5nYbsq5RP1/5G3oiq52OS5/+guMeLOw5vyQoYI/85xlMAiP52/3Wtz5rscPVQLYCEAFoAFYCEAlq+BtaqiS3rj65oDEVgHWj4+O+vlS0vf9gBYNO7miVZyYPWteo9XnZvAIkXZX8Hci8ByqCgXwOKzywEsBMAKWmC1tLQoFIquri6HtR0dHTk5ORkZGYsWLTIYDKK8oaFhoTUmk0k+v7NyACs4sscsMejg0ce7Op9dkQHAGqbKcHxYYBU0FeaYtMryz/wcWJ8b3ut58yd9xR/ZA2vr/vlSq6a59sDa1zC/XZVyrOJdN4HVZXy7tnHWl+s+DBRg8YlWIwWWtxQFYCEAlt8BS6vVTpgwIcwaYpb9DEajMTY2luaZNWtWUlLStGnTRMPIyMipU6dOnjw5OjpawMtZOYAVNJF7aFcngOU1YH2kHpCq1hz1c2Btf/LTPwlAWzf90k1gsaK2mX7bWPVz09pXXQCrZmd6RdcvG0zSHRUPGN87O+vlgdz3/R9Ybiqq89JGGhHPBWAhAFbQAotQ1dDQkJqa6gxYU6ZMiYmJsdm51d3dHRcXl5CQ0G0NCYxmc1EOYAUrsOp3SNdNqN0GYFmrar6Sqoq+CwVg8ZAPa7oPrK27MuQecggsXmbDrjed7dwaKbAGN9fd0Wu/v3nDA2DdeXjT2dVEGVi7+ioJKM0X1oxoN5VDlgFYCIAVhIcInQGrvr6eytPT081mc21trWCWwWCg8tmzZ/PkjBkzaNJkMjkrFzvDsp/GHlv9/f38zaARlPhzSUGFdLmE6s2DwkNcImDEVeWGK3IqedYqv+w2DVWG8wJYWUXfyYGVV31CQsm6Xjl6eLLA2COUQ624IU9ylfdbWRWVpR7IKrwsTa4/Iapyq47JgbVizReSvfTbaKu2bte8ZTX76JElA1ZJlXQN0ppds+Wy2dIk3cV5m5UXAj08D3OHq3zZSmt+TQ6sDXukyy40bntdDqzqtv8WVNrSOpdbXX71/xZUamiULNW4/Q05sDbteF204qr+//d/y1t1Vr5F41+vyGRgcdWFd38rgEWtqMnF13/JVY/6LtK3d+cXddKL713Jz7XvXH3DsbK6nlwBrLN9J/W9WfTg7zwbheax/7ugQoGYGuv9FsUIAUv+tyOv2tCzUgDLpooXxTPYLJALHT7XsK1YUdoT73CV4eRHAljVPUvlVaf7vkRfFxwlAFYAAEutVlN5UlJSdHR0VFRUZGSkUqmkchpSeUZGBs9GoqJJrVbrrBx7sIJ1D5ZXdlMFzx4sK7A+Ug/wvqhVeolWRRt7nO3BKqhsyzFpSzdpn1TJgFVY2blE16vS78QeLI/3YNm0utu09Y5e+8WJTVTVerqIq3jnzfYLxQJY1+8P8MvuvrKTGMRVNmeyN19Ys+lc7u5v9c52HWEPFoI9WADWMMDKycmh8vj4+I6ODrPZHBMTQ8ayWCwOIaXT6ZyVA1gAVggCa2XZQamq+uAQYD1RlLQHS1nWTcOPS07aA2u11kzD5Wu+XFw0QI/AAhZfyktUOQTWhYyZZ2e9LAdWU+tve978yVfv/T/eAlZTy2/pKeiJ+LmuZ0tVRzpL5MDSfSld1rXpfJF0jYnvTASjM7c+55fN7GCC2ACLq1zIBsBCACwAaxhg6fV6PkQoP+RHs3l2iBDAArCCD1gr11oP9tV8LlVVf2kPrMIqizQuDhHKFOUOsLiqYqsqx6Td0vxh0ADLXlEuqhwC67NNvyeQHde86wxYNgvsMs5rrPr5PnOeHFhc1XRqlfVsqrXye28DWAiABWB5H1g6nS4jI8NoNFoslpiYmEmTJnH55MmTIyMj+QR2PpmdT2y3P8ndphzAArCCFljlh6RXWLHfCqZD9sCSV3kMLB6pqS8EsGwOLNocczxY/TtS1N6md50tcKdFurX29tOr+ceMABaABWABWGMVvV5PuiIVEbCmT5/OO59IVzSpUChoXKVShYeHT5s2LTExkUaWLl0qEObwcgzOygEsAAvACmJg1Vik09u37vmf8QWWwyr5AlvN0mndTcdz5FUAFoAFYAFY3k9TU5NCFuIU/9yPyJWTkyO/cGhmZmZtba3NBUXnz5+/aNEi+wuNOiwHsAAsACtYgcWK2rLrDT8HlsMqAAvAArAALB9Fq9XGx8c7u7D76ANgAVgAFoDlXWB9ov4/7aqUxp0ZYwesh9/fJznRY1hgcaHDS2Rx1b5LdT3XOr++dRTAQgCs0AJWW1ub2Wweu+UDWAAWgAVgeQAs+98eerZAz4AlruDgJrD8pArAArAQPwLWWAfAArAALA+AxYV+dZF33wBLXHBhNIoaDbCYIzZVABYCYAFYABbinRw8Kj0ALL8CVmHNxmU1+zY1KoIYWGNdBWABWAAWgAVgIeOZMVJUgAFr/dOrifoHsMb36CGABWAhABaABWAhI9tZtavz8ZVrAJbzy7UDWAAWgIUAWAAWgIV4cKLVqbMAVkACK//QAnoAWAAWgAVgIQAWAmD5JbCKvpMmawIMWNwKwAKwRgSszktGavj1raPoAAEsAAvAQnwBrCvXpMOFB4+GBrCs92ZmNklVVvQwqrjKTlEAVsADq2GP9F52di8PcWBtv1BMw55rnegAASwAC8BCxhZYvlGUi6ridQ/9HlgHAayAB5bsNoUAFoAFYAFYABYSCsB6MIbAqvlKqir6LkCBpdi6hR4AFoAFYCEAFoAFYAFYI6taoeuzSuj0mABr6NlUcmDZUMk/geXiIu8AFoAFYAFYCIAFYAFYTqvkihpPYFVLiCnUA1gAFoCFAFgAFoCFAFheAtaIFAVgBQewKg5J72LL8WwACwGwACwAC/Ekg3el3wnSkOP7++EAWCMClov7QG9p/jDHpK3YqnIBrGU1++gBYA0PLGtVfc8SAAsBsAAsAAvxJLs6pY3xrqedqu8VBWB5C1g0lFc5pJJ3d24FIbC+zgaw0CsCWAAWgIUAWACWNFJUuXdx0UBhZcdogLVE10uPUAfWVx8BWOgVASwAC8BCACwAy2mV3EObty9RbN2yZmOFd3duAVgAFgJgAViOYzab1Wp1enp6QkJCS0uLiznT0tISExPb2tp4sru7e/bs2RMmTIiLi8vIyBCzOSsHsAAsAGscgTVGRw+DCVitHe/TsPbQ7wAs9IrBDazS0tLsUMrq1avHB1gqlWrq1KkTJ04MCwtzAaz58+eHWSPmIUVFREQUFxcrlcrw8PDMzEzX5QAWgOVOVfW2WxJN9P3eB9ZwdxUMVmCtrateoustqdoJYLlTVWN9taEMrE8vN5gvbz118xD6xmAFVqhtdl2vjTE/RJiamuoCWFqtNjIyMj09XczT0dFBikpOTuYZEhMTo6KizGazs3IAC8Bys6qq4Zp0fdGqs94HlvySoTbAKrxstdeJIAPWsPbS1mxeXDRAQwALwBLA4pteU1v0jQAWgDW2wDKZTDExMQprxDxELhoXRwBnzpxJk0aj0Vk5T9KI2GVnj63+/n5eFzSCEl+WNLTeYmBxiRw91ZsHaVhuuCL3UEHFLVHFKuISr7QqNpyXAyu7/BwN86pPCGBlWXdECWBxVc66XjmweLLA2COARa2yZMDiqtyqY3IP8WSB/oDwEDXJklGpQNslPaPGIm+VpzkgqoZtJRS1ovSotXAIsLJkwFKVSyxbXtorp1J+2SfPqoSirPOwn9xvVbNL2qCuWddM4yVVTRIsds0eYi9D1RJdr65mnRxY3Ippta3lt9Js5tfkitq4Yw4NjaY5cmBVt/234MuW1rncSi6bhsY3RZVAz6Ydr49LK0P7bHtg1XRnSVVH5nOV9sQ70mrpWSkQU3PyyW8PeYQLeQabKt+3YkXxa5bexcmPBLCqe5bKq+pPS3NuPJYvgIUeMkBLAKwAAJbFYpk0aVJaWhqNy4HF4wJSNEKTpCtn5diDhT1Yfr0Hi6uswCqssoTOHiwGls2VSx1WhfgerIZDH8qrsAcLwR4sAGu0wOJTr6ZMmZKYmBgfH0/jkydPbmtr02g0ckjNmjWLJmtra52VA1gAlv8Dy1uKCjhglepNys7cqu1LASwAC8ACsAAsHwFLrVanPg0xi+aZPn16R0eHyWQKDw+fMWMGzzZ16tSIiIiuri5n5QAWgOVfwBrLE60CDlg2VYU1G5fV7Cus3AtgAVgIgAVgjeoyDeQqYhPhSa/Xk5DEoT2FQiGfU36IkE0WFRXV0NBgMBhIUenp6a7LASwAC8AKCGA5vO8hgAVgIQAWgDXiyzRMkGXKlClUuHDhQrKRDbB4ThYYyyw5OTk8PJzmJFR1d3e7LgewACwAC8AKOGBt3v+2NP++39kDq+Xz5WIIYCEAFoDlbuLj4zUajTs7wBwSylk5gOW3wNq2UyLOHnOwA2vsz2QPCGDJjwMCWC6Axe9li+kNeZXu2Fs0bN4j/aiwufM9AAsBsAAsd6NUKufOnYtb5YQUsMbxcu1eB9bK8kNiN5UNsHygqIAAlptVAJZDYHEVrwEACwkyYH1//dq9fe2ePR58fgjAwr0IEQALwAKwACwAC8CyzYMvPv/uf/2rZ4/rb/8GwAKwQjSXrzw+ePTxidNPJveYJdY07ASwACwAC8ACsAAsAAvAQjwN6YpBw/GTOzoDWAENLGVnLj0MbXMBLAALAbAALAAr5LLHLDmmfgeABWB5GVjcam3r7wEsAAsBsAAsACvkwnyprn8CGvEAsAAsF1XFVbtzTNqKrSoAC8BCACwAC8BChgfW+CrKN8AqrJSIsFJ3BMAafRWABWAhAJaPgdXd3b1161YAC8ACsPwOWCwbHgewACwAC8ACsAILWFVVVbNnzwawACwAyz+AVXjZKhsAa0yAZdj5Tv6hBY2t7wJYzoC1wWy9Bunu3/mPvQAsAAvAArCQkAZWTeMgDXVbL40KWHayYWwRvACs0VTxTwW5qqa+EMByCizZTj4ACwGwbHL+/PmXX365uLj4+eef55JVq1YlWLNr1y55ySuvvPL6668DWAAWgOWFqtJ6CVXqTSe8CyzfKyoogSWvArDcBVa7tKvPePj3ABYCYHHOnDnz3HPP5ebmDg4O0iSh6sUXX6Tx/fv3v/DCC1TS3t5Ourp58+aDBw8ALAALwAKwAKzQBdb2tkxJUQfecXaamrjIhRw9racLfWYvAAvA8itg/fCHPxSTmZmZSUlJS60heA0MDLz//vsLFizAIUIAC8ACsEIRWCVVpiW63rLqhmU1+/JqmkMdWEMV5SawWo7lOasCsJDgBhbvqRLAevXVV9ufZnBw8PXXX1+8eDGABWAFRroOSHcbXL8FwAKwvF/FrxnAArAQAMsDYLW0tPABQVGi0WiSkpIePHhAhSkpKQAWgOXXUWqk7V+lMdiA9XGpVKisPAZg+QOwSjZqc0zagsrd0sdR0cUKyT+0gB6G9jkAFoAVTHnUd/H+4YM0BLBGCSyKQqGgkldeeeXFF1/s6+sbHByk8eeff/6ll15aunQpgAVgAVgAVqgDi98FvyMBLPnOLQALwAqC3Hg3gxhxMy+bhnf0WgDLW5dpGBgYkE9evXrVZ2sDwEIALCfAqpAu1L6y6gv/uRYDgAVguQAW06rZ/CGABWABWP6wNsYcWBaLRafTmc1mh1VGozEnJ0etVtO4vKqrq4sKi4uLbRo6KwewACzvA8u6RfcrRQFYK7WfKjtzS3Yuk1dV1a4HsMRlHVzs3AKwACwAK0iAZTAYEhMTIyIiwsLCWlpa7GeYMGFCfHz8pEmTwsPDY2Njm5qauLy+vj4mJmbixIk0Q1xcXENDg+tyAAvAArBCBFg5a76wrwKwACwAC8AKLWCRhzQazfTp050BSxQqFAqaJy0tjScTEhKIUBaLxWw2R0dHJycnuy4HsAAsbwPrJIAFYAFYABaABWD59SHC1NRUZ8ASUavVNM+cOXNovLa2lsbT09O5in3W1tbmrJwnjUZj9tPYY+vUqVO8Lnp6elDixRIGVlHlTesVjK7LZVNQcUuyV90NgR4uEfNo11+lYbnhig9aqWqOWy31hRxY2eXnJFqtOy6AlVX0nXyznbtGgkuexiKXTZ7mgLT88i4hmyz1QJYMPavL9o1LK8GOFaWSovKsL14AK0sGrPyyTyTQlPbKZcOFKq4S6LHOw9zxfausoYrij4PfnUNgbW6RvKI1v6aVyaah8U1RRXahWokIO14X6PFlq+r2/2ZtaGXA2rhD+iGk4VmV1GpL0xuCSjW7ZnMVj3AhzyCq1n35EQ3rTW/bt6o+vkR4aEPPSlEiWnEhz8Al7rdiRZV9+Tuu0h//UACrumcpDcuPZ3JV7Zc50ps9li+AhV7UpqTvjV8RI/qyfs/A8tvXPBpgPTz39c0lCz173NGtCU5gkWPkx+O6u7sVCoW3gEVLS0xMjIyMrK+vp0mVSkXzZ2RkcC2Jiib1er2zctd7sHjk+PHjNl8RlHilZFhg6Wqve0Alr7dyAawcBtZaaT9WlvV2zu4Bq9MjKo1hK68AK98jKo1Rq1EA6zWPqDTmraqHKkoOrOpRAuuLRRKwds6zb8UeklNJKMoFsNxsZQOsqi9tgSWqXAAL/aocWBc+XGADLH97zaMBVvDFC8AiTpGTxKTRaCTcmEym0QOLdDV9+nTSlU6n45KcnBw5pObMmUOTVOusHIcIcYjQC4cIK79ydkwKhwgD5RDhFtP/5B9aoNmbGYKHCN28ggMOEfpVHvVdJEjdbW0KnUOEAJZt0tLSoqOjyUATnoZkQ5M2v/vzAFisq5iYGPnuMb1eLw4XUlJSUmiyqanJWTmABWABWACWRIrti7kKwAKwAiL3Dx8kS5GrAKzQBVZGRoYNsKZMmVJcXOzZIUKj0ahQKBhGM2fODA8P5yOD8ms3ELnoKXgyLi5u4sSJLsoBLAALwAKwACwAC8ACsALyECGpSK1Wj/T0dmpFOEtISOCT0xcuXMhco0kyFpGLRghYwm2zZ8/mhkqlkspnzZo1Y8aMiIgIgTln5QAWgAVghTKwKtdvyD+0YP22FfJVZNz+IYAFYAFYAJa/A8uzMLBEGFg6nY4sRcDq6urKGBq54Wi2tLQ0YhktRL5MZ+UAli/z4MHjU2elh/8Da6W+n4aFm04CWEEMLIeriIG1YbN6Wc0+bV11iAOr9XShGAJYABaA5UfAIgyRaeLj4yfI4rG6YmNjxeUVcKucQMyVa0/44v/AYk4xrQCsEARWVe166WeJFftDHFh8iSweAlju/w/J2WOWupSDR8cKWHydJwArRIE1b948PrF99MBqaGhwfU0sAAvAArAALADLW8AyHpZu19jc/o7/AKv1YsX1+wM3H1zx/y6Ow73Krk7fAetW0apbyuzB2nUAVvADa+HChbGxsbjZM3L5ivRv3KGjABaABWAFBrDkVTbA2mB+S+LOCZWPgcXjVAVgOQPWTWW2/OghgBXMwOro6IiPj7e/qieAFWo5aKXVmmoAC8ACsAIQWHvnS1f7PP6RvKrlWB6ABWD5BliDD29+deOAZ49vbn8ZnMBSqVTR0dHyX/x5fIgQwArQ3LojdTrm7iACVgWAFczAqjSW55i02uoGAMt1FYAFYPkMWBfunODvgwcP49nlQQusCXYBsEIq3MWwooIEWNpzAFYQA0u+igAsAMszYJWtl3q5qo3SeOteqfz8xSH2ArAArPG82TOAFeip3SZ5Zd3mYAPWx5oz1us4fAlghQ6w8mqal9Xs29SyAMByH1gtx1XihK1QA5Z9Fyd6PwALwAKwkNHGRRcT2MB6stk+LG22NV8AWKEArPG9Bql/AqvZ/KFglmNgWascXrl0lMDqu3Py/O3eh9/f95/u7sx5qQ/ZsWd4YN24JTnswYORLf/hyePkqu9v3gCwAKwn0Wg0iXYBsACsgAGWUdp4qzf0SiWVX7u52QawAKxQAJbjHxjKdm6NHbC49vr9AT+h1cGjj3d3DdPFiSruZMS1stwMK4poBWABWA7OwYqOjo6IiMA5WABWAAFr9VqL/RYdwApZYHEV38EQwHIBrB2Wj6zDJaEALDdPMwWwAKwxPERoNpunTp2alZUFYAFYABaAFRDAWll+cHHRQLbm+LDA2tSyIP/Qgu3N74UasDy7uSGA9dnn0n6vi/0AFoDlpXOw1Gp1ZGRkd3c3gBXEuXVH6nGa2wEsACvggeWwyiGwVBWfjN3OLQAr+IA10is4AFhjDayBgYGbN286LJePX7161abWpoRCJYODg74+BysqKiosLKyjowPACuLw72iofwGwAKxQA1bZumbF1i2Vm9YAWAAWgBUowHrw4MEvfvGLH//4xykpKT/96U9nz54tnVp35swLL7xA4y+99BLPk56e/vLLL1MhwcZhCTdZsGDBiy+++Pzzz1sslrEFlkKhCJMlLi5u0aJFOEQIYPk/sJaXSb8cXF3xKYAFYLkPrDG6ehaABWABWGMHLIPBkJCQ8MD6w87c3FwBrOeee66lpUXMQ/bi8ujoaIclNELOqauro/HMzEySlk8PEeIyDQBWwADL+RYdwApxYDlUFIAFYPkAWLcrSmiEhgCWF4H11ltvkYd4vKqqSr4HSz4PTb5iDSnq/Pnz9iXyJkuXLuXl+AJYbW1tZrMZwAKwACwAC8AKZWC1nrYq6isFgOUBsGwUBWB5BVgLFix49dVXeby4uNghsN5//32BMGcl4wAspVIZHR3NhwiTkpJIWgAWgAVgAVgAVmgC68llHTp+C2ABWH4CrH379v3gBz8oKCjIzc398Y9/7BBYR48eff7553t7e2n8/Pnzg4OD9iW+BlZ9fX14eHhERMTkyZOnTJlC42QsAAvAArAALAALwAKwACw/+RVhS0vLm2++qdFoFArFW2+9RSV9fX1itxanqakpyZqUlBT+aaFNibxJVVUVcW1sgZWZmZmYmGixWIS3wsLCxKSLGI3GhQsXJicnm0wmhzMQD2nJU6dOzcnJGU05gAVgceGG9VdpqMk9DWABWG5dIktrWVazL6+mOVtzfHHRwMrygwAWgBVMwLrXtfeWMvtuc0MoAIsvtXDz5s2XXnrJYDCMOzfdAtbcuXNnzZolJru6ughYwx4lJELGx8dPmDCBZiZXOnQbVZHAeITm96wcwAKwngGr+rIELMVxAAvA8u7OLQALwHIGLNEj+SGw7ui1tCgyVtADa2Bg4MUXX/zxj3/8/PPPv/nmmw9Gep/I8QJWcXFxeHj4jBkzFi1aNGfOnIkTJ8bGxrp5zC41NdUhsMxmc1RU1NSpU3ly8uTJMTExFotlpOUAFoAFYAFYABaABWCFOLD88ICpuye5T58+XVwHKzIyUqPRjBJYOp2OyufOnSufrb6+fqTl4lhk9tPYY6u//8mNDGgEJW6WMLBySh4qCu9JZDHcE11Mftltee/DVSVV1+XoKai4Jc2/eVD0Plwi5uGqcsMVr7XKP0bDmrzD0otZ1ivfbKvKrdtLzSf2wMrTHBKb7ayhm22uytNY5BvgPM0B6Rm1XWLbTK2yZNtmrvJ9K8GOFaVHrYVDgJUlAxavjeWlQ1ZRftknz6oEeqzzMHd838rm48hdc0i8OyfAOsCt5FRaXbZPVNms2GFb5Wu75FSq2pSbY9Lq1m9cXDRQuLaVSrTm1+SKamiUhlta5w65986O1wWwDO2z7YG1cccc+6otTW8I2dTufmIvHuFCnsGmyjetak5m07De9LYAlvbEO1xlOPmRAFZ1z1J5Vf1pyVsbj+ULYFGVpldayOm+L8e3rzt3Qbql4LpNg6IfE4py0fs57JFcPJdcUQPLFtHw3PvvyIHV98avRBUDi0pG/04HSgtoUec/eMdbawzA8j6wKFqtdv78+QqFYkQ/IXQGLL54aUZGBk/SCE3SU4y0HHuwsAeLR2oLjwtgYQ8W9mB5fQ/W6M9/D/49WGeyA3EPFvdj67d4YQ8WdZv0cBgXu6mwBwvAepYOa0YJrOLiYjmY0tLSaNJgMIy0HMDyem7ckv6fO3nGf4FlrL8r/ddYfp2ryiul/ylrV/cCWAAWgDWewPoqK8SBxVVeBBbxiB53W5to+KjvYqAD68q9i00Xijx7dA1sCjZgzZw5U5z2JD85feLEiaMEVlNTE5XT8nkyOTk5PDyc3DbScgDL6zl49Fl345/AsjnRikeYVtWrpM2weiWABWABWABWwANLXsU32AloYAVfRgWspKSkhQsX2hQ2NDS48ytCh8CipU2YMEGlUjGSYmJiurq6qDYyMpLmFHgaUTmA5a1cuiztu+o6EMDA0hUcdHOLDmABWACWB1XGw7+XgNUunVy1qc16wtmh1wEsAAvAGjGw4uPj7a84xZdpECeYu3mLaHKVOHeKr7BAREtISCAqRUREJCYm0mLFDXlGVA5gefd3NPU7ACwAC8B6vEprUWzdkr/ZkFfTvKxm36pyC4BlU8VvgV8zPdZb30XDoQ8BLAALwBoeWJMmTbLfg2UwGJxd2sqdEJLUarV8f5jDRY20HMACsAAsAMs36xzA8iKwjl7bY7689dLdswAWgBVawEpNTY2NjZVfh91isSQmJkZERHimK6VSmZKS0t3djVvl+FXK1ktdyfqtABaABWCNGFh1TUuVnbnbtmcBWB4Aiyd7rnX6uNN78EA6I+LchYAB1p31leSke117AawgARbfhTAqKoqklZGRkZaWRt6S/5oP9yIMjsi7GAALwAKwhgGW9lMSVcnOZfLTs6pq1wNYAQQsmyvR+D+wuIrABGAFCbAoOTk5BCxxKhV5a9asWe7ciBDAArAALAArKIElqgAsAAvAArBGdR2srq4ujUaTlZWlUqmampqO+HEArBHl1h2pa2huDxhgbVj7rXTJq6KvACwAyx+AJb9FdPm6bTkmbfXWVQBWiAPrxGnpYjc3bgFYAFZwBcAafRfjz8ByeLl2AAvA8p+Pw8X57+vb5+QfWkCP4AbWll1v2F8iK6SAxSM92iaSze2S1XylUAALwAKwACwAC8ACsMYEWFWtv+eXDWCFDrA8U1SwAuv2ncdfHPfwcfocgAVgBUju3ZP6l2++DRhglZVI513V5n9hD6zcYmnbXLn6IIAFYAFY/gmspnNqAAvA+vqbJ6vIg4fGAGABWAESh/fD8WdgyXdTObzhYPGaz8QQwAKwxg1YQ39gCGA9AdapVf4DrDPnpe5lrxnAArAALAALwHIDWCPdogNYAJYPfmAIYPkVsPgHPQ0mp70fgAVgAVgAFoAFYAFYABaANbK4uFkFgAVgAVgAFoAFYAFYABaABWABWAAWgAVgAVgAFoAVasDaIw11RzNCEFjl5dclYBVvBrB8CayrV68WFBS4UwhgAVgAFoAFYAUwsPgapBubP7AHlmZvZv6hBRtNGcEMrKFVIQUs7pq+yNMDWL4E1pkzZ1544QV3CgEsAAvAArAArAAGFlfVbFtOltre/J4cWFy1dutKAAvAArAALAALwAKwACwAy8Mqvk0hgAVgAVhjDazi4mIavvTSS/v377cBFpW8/PLLPF5gDY+vWrUqwZpdu3YBWAAWgAVgAVgAFoAFYAFYQ4D1gx/8QKPRDA4OErMITDbAam9vF+NLraERQtWLL75ITYhfHuzrArAQAAvAArDGs6py/QbpFoTbs+0/juJ1jQAWgAVgefcQ4cDAQFhY2M2bN4cFVmZmZlJSEk8+99xz1DBggKVQKKZNm5aYmDhnzhyz2SzKlUplcnLyjBkzCJvy+Z2VA1gAFoAFYAUusLjK4ceRX9G1rGZfgWFLjklLj2AF1jazdBbazmP5oQOsHXlthrebDuZtALDGC1gPHjxwB1ivvvpq+9MMDg4GBrDo1dM7pFe/cOHCiIiIlJQULl+0aBGVz5s3Lz09PTw8nFDluhzACk1gGRsfST94XncfwAKwghhYNp9UsAKLL1ex07IsdIDF3VRz3h4Ay2fAiomJ4V1QdXV1r7zyio26jh49SjPQSG9v7w9/+EMGVktLS0JCws2bNwPsJPeZM2dGRUVZLBYanzJlytSpU2mEJqkwKSmJ55k4cWJcXFx3d7ezcgDLi+HO4sq1wADWhurLckUBWAAWgBXEwPr0coP58tZTNw8BWACWx8AiNqWkpPz0pz8lMxGn7H9FSLXPP//8jBkzFixYwMCiKBQKmodA9uKLL/b19QUGsFQqVVhYWGJiYk5OTnR0tMFgoEKdTkeFc+fO5XlSU1NpsqGhwVn5KIHFI6dOneJ10dPTE8olisJ79DU9fOSsAFZp1TUarih+wP3ImnXS9fEqar4T3c3yovvcqqTqjuhi8stuy3ufosqb1hmuy7uYgopbUsdUd0P0Plwi5tGuvyrtoDJccdaKgVWyrFfeZ+k/lu7lXJX92RBglUrzqMo+ebbZLu2Vb7bzrVX5mk/sgZW35pDYbGcN3WznWqvyNBb59jJPc0B6neVdYlNKrbJkm9LVZfvGpZXYbK8oPSrel9hsZ8mPSVnXhsNVxOvwGXqs8/Aq9X0rhx8HvzuHwOLV5WQVHeBWWbIV6/tW2Y4+Dv6kRFXxzmXKztxN294RiKnZNZuNwiNcuKXpDfsqLvRlK1aU1vwaVxna/1sAq27nr61VT4C1aYc0Z0OjxKyG3dJF3ssPz9X0vi2J7USeOD1rQ8/KMe0PuW9hYDns/bgfE4py0fu56Me411qnsAhg9b3xKzmVvln0Lg3Pvf+OXFE8T1/W7wWwHLY6o1SM6L2fXbWCWp3/4B1vrUP/v5L71atXXdQ621k10rOvxv8crKSkpDBrpk+fzrujiIo0mZGRwTOQqGiSdOWs3M0nMhqN2U9jD6zjx4/bfEVCs4Q7i/X131FH0Nz2rIshRQ0LrOK1tzwAlq72ugfA4lYjBVa+R8DK9RBYnR5RaQxbeQVY+R5RaYxahSawuGptbXH+oQXbWt4LfGC9Zg+srbsyuIqBVXc81wZYY9cfct8iB5ZN7+cQWA57v2GBpf/YE2Bd+HDBsMAa0XsXwPLWOsStcvwCWOnp6bzjasaMGaSl5ORkKlSr1XJIpaWl0STN46wchwi9fojQxXFAPzlEWKc9T8Pa1b04RIhDhKF2iJCreA2sWdccZIcI+Yr2DCyqkh8iZGDt7KvAIUIcIgSwhonZbI6IiCBj8eSsWbMITCaTqb6+nkZokstJXeHh4R0dHc7K/QRYp84++fsBsHwArNrC4/aKArAALAALwPI4125Ip58amwAsACvwgdXV1UVgSkhI4JPc09LSCExUSOOJiYmxsbEksLa2tsjIyOnTp3MTZ+UAFoAFYAFYAFYQAuuE9VSzb4p8ACw3ez8AC8AKjEOEixYtioiIICrFxcVFRUUpFAoub2pqio+PJ0tFR0dPmjSJOOW6HMAKHWBp8q0HB1ceAbAALACruGq3dGWsrapgBRbXyq9BGqDAMtbflc7EKr/uorMCsCiXLj82bPHw0boXwBqajo4OrVar1+vlVxmldHd3GwwGo9FoM7+zcgArVIDlXFEAFoAVasASqwjA8nNguXNNGQArKINb5QBYwQasytXSRiu3+EsAC8ACsACskALW7UrNo76Lj767DGABWAAWgOV9YOkKDo5+iw5gAVgAFoAVcMASVQAWgAVgjWfu3ZN+OPPNt+4qCsACsACswAJW/qEF9AgCYJlOSr8lbOlRAlgAFoAFYPl1LJ9Lf/mte0emKAALwAKwAgtY3CoIgMV30Wk2zfNuT3jrjtTJNLcDWAAWgAVgeSnDXk8v4IClLJQ2wGtVhwAsAAvACiZgbTuwiIatHe9Li9017/zt3r47J73VE165NrLeb+yA1fFaNj0ALAALwAKw/A5YXt+iA1gAVmABS6XfuUTXa9yWG2TAklc1tP8P3wc6+IDFVQAWgAVgAVgAFoAFYPkXsHgV1dQXAlj+AyymVW3paQALwAKwACwAC8ACsAAsAMs7wBrpbScALAALwAKwACwAC8DyR2AVVe5dXDSwpno7X+QdwAKw/ApYSqUyO5RSWloKYAFYABaABWAFKrAUW7fQw8XaA7AALD8BFgJgAVgAFoAFYAUMsIZdewBWoACrepkld+nF43k6AAvAArAArLEClrFOujFqXdm5Mb3hIIAFYAFYAJb/AItHvsjTA1gAFoAFYI0VsEbaMQFYABaAFTrAenSp/1HfxccPH3rcBx486knvF0DAutvaRA8AC8ACsHyX0SgKwAKwAKzABdbauuolul4aBgGwrv7yZ8QCyVh+Ayx95Xc0LF7V5yfA4ioAC8ACsAAsAAvAArDGClh5FZ8uLhooqPhE+vNc1xzAwNr9WxrqDs/lqqsXjnnQB47mRmEuurgqjUSrYsVpAAtyArAALAALwAKwQgJY8qrCyr3LavYV1mwMRGDZVDGwHn5z/m5r04Ojh31wggSABWABWAAWgAVgAVgAlqsquYeM23JzTFq+zU4AAetyZwPR6k7duhERAcACsEIFWGazub6+vqOjw6bcZDK1tbXZz++sHMACsAAsAAvA8gxYa9Y1j8XRw7EGVt+q9yQc5C8HsAAsAMuWVjNnzgwLC4uJiaHh1KlTuZz8NGXKlAhrkpKSaDbX5QBWqAHLoJQ2OVUqaUO1Oh/AArAALE9W7BJdLz0ArDEC1rCKArCQMQRWamoqUUmn09F4V1eXwWDg8uTk5OjoaOJUS0tLZGQkzea6HMAKNWAVaz7zwRYdwAKwghtYXGXY+U7+oQWl+hYAC8ACsIIEWOSk8PDwGTNm2JQ3NTWFhYUJPE2bNo1m6+jocFYOYAFYABaABWB5ZcUCWHrVV1KPVHXBXWCVPJS6uLpHABaA5UfA0mq1BKb09PTp06dPmDAhOTm5paWFyouLi6k8IyODZ0tLS6NJg8HgrNzNpzMajeLmi/bY6u/v528GjXhWYmo/RX8VJfp7o1yOD0q4s9DV3aVhRc13ouPIKXmoKLwnqrj3Ka26xlXDttIY7oneJ7/sthxYXFVSdV2uqIKKW9L8mwcFsLiEHmUll6WqvM+lPiv7M3nvU7KsV/oZVKlsO1HaK99OqMqlDVW+5pMhmxDrPFzlfivepOVpDonNdtbQzTZX5Wks8u1lnuaA9F60XWJTSq2yZJtSrvJ9K7FtXlF61Fo4ZLOdJdui89qwWUX5ZZ88qxq6YnmV+r6VzceRu+aQeHdOgHWAW8lls7psn6iyWbG+b5XtCFh51vdlU8WryPbLLFtFT77MQ6uGbVVc2Uhqqd39a0YPj2xpekOAyaaKC3kGh61sFGVony2AVbfz1/Kq+ta5kqUa35QrSmt+TVQxsDbtmCMH1tcrfkc4OLd4viCC6OsuNW8jOjw8edy+P+Rux2E/VrlCWucbK8456/24HxPAyvn4W6nLUkqoWpsv4Uy97Cs5lapXHHTWj3EVA4tLxDwbVuzPXXpx+9Itcir1vfErGg4sWyQUxSViHq469/478lbDbh0GSgtotvMfvOOtrQyANf7AUigUJKSoqKicnByVShUREZGQkCDKBaRohCZJY87KsQdrjO4IMY57sFz8e1eyQhopwh4s7MHCHizswXKyB+teR9vd1qZbOUuo0OGlzF3twcrrEcByZw9W7sf9NCxXSK3WLpe+e8Ufnxr9HiwubM7bgz1YAJYn0Wg0JKSZM2fy5NSpU2nSZDLpdDo5pFJTU2myvr7eWTmAFVLA8uUWHcACsACsQAQWX+T95rIP7IHFVcZNd+jNbm56IPVjxvsAFoAVbMAiS4WHh0+bNk2cwE5gMlsTFRUlflE4efLkmJgYi8XirBzAGjb37km6+uZbAAvAArAArOAFlmIxKeF2WeGwwKpVHpEOw+V/LkTln8BqzOs8/IuMrxYuB7AArBFn1qxZEREROTk5ixYtkv8qcN68eWSvpUuXzp8/n9RFI67LAayxuOUWgAVgAVghDiyVfucSXS9ffdT/gcWiIkINC6wa68lPG6xXe/FnYIkqAAvAGnG6u7szMzMnTZqUkJAwd+5c+e4oItTkyZMTExNtFOWsHMACsAAsAAvA8i6wuKqmvjBwgXVHt4bocLN+U4+26eR6k/m3eR2vZa9f0f0MWDnSFyZPdYseYtIhsAzWg4lVpRfkPxUEsAAsPwXWuATA8itgbaiWfjBYp/la6kdyTwNYABaABWB5EVhc9U22kjHEHtJbfyrIwKqyjttUOQQW79x6oqjAAdZg7TrC08NzXwNYABaAFVrAGvY+EoaVUidYlAdgAVgA1pgDq1RvUnbmVm1fKgdWUeXexUUD2prNoQMs42rpW7ROfZp3bjkC1qlAARaP3D98EMACsAAsAGtIF6MrODheW3QAC8AKNWDZ3KZw9Oe/ByiwbKocAOtjAAvAArAALAALwAKwAKwRVuWYtPRwCCyu8hNgHTD8rl2Vclb7EYAFYAFYABaA5S6w1q2StkPlRRYAC8ACsHwMLBenZ3GVnwCLq7rrFgY3sDpey6YHgAVgAVgAlneA5ZsbDgJYABaAFcTA+ja/4PAvMo5+XDEaYMmrxgVYXAVgAVgAFoAFYAFYAFawAcumyv+B1anYbHi7qWlllweKArAALAALwBomx0483tX5eHcXgAVgAVgAVmgBS3410eAAVteH+sa52m/yCgEsAAvAGofcuiNdtLO5fawU5UVguehHVhVInbi6/FMAC8ACsAAsAEte9UWeHsACsACsILyjs2+A5SdbdAALwAKwXANrbV31El0vDQEsAAvAArAALAALwAKwACzvAGvNumbXl8gCsAAsBMACsAAsAAvAArAALAALwAKwAKxAA1aVps9ZP8KXvFqdD2ABWAAWgDViYO1rmN+uSjlW8S6ABWABWAAWgOUvl2sHsAAsAMuDKsPOd/IPLSjVt/gDsLhqe8tvASxnVXfWVxKh7nXtBbAALAAr+IGlLJR66rWqQwAWgAVgBRywXNwi2gWwqkyZxLLNrW8DWD4GFleRpQAsAAvACipgVZRIfdDa/K/sT7TiO+GM4/1wACwAC8DyVhXhiR4ugKVY0yv1kxuqxhRYWxZsMbzdVL3i86AEljlv8+FfZHyjLASwACwAa8yzxyw9b/sn0nDHHn8EljbvpOh9/O1MdgALwAKwvFtVtX2psjN3W8t7PgZWfeOi3KUXSz7qGb2i/BlYXNictwfAArAArDHPxu2+UxSABWABWACWO1U19YWEHn3DisVFA9ma42MKrC3bPs4xaavqtN5SFIAFYAUPsIqLizMyMrq6ukSJwWBIT0+fM2eO0WiUz+msHMACsAAsAAvA8jdgrd26kl/zmAKrqna9dAcIzSEAC8ACsI7YmCk8PDwsLKylpYVL1Go1lcycOXP69OmRkZFardZ1OYAFYAFYABaA5VefVGVtbY5JW1pbw69ZsXWL9Cg9AWABWIiPgNXW1hYbGzt58mQBrO7ubi7h8bi4uISEBBflAJYfAqu08j6ABWABWKEMLC50+HGodPuW6HqL128aPbCK9DsXFw0UVXYAWO4A67ZGfbe16b5lP4AV/MAiJyUmJqampioUCgEsvV5P43PmzOF5UlJSaLKpqclZOYAFYAFYABaAFUDA4ne0qqJrRMDatFWp2LqlctMaeZWq4hOx9lZaV+yyVZcArGGrAKzgB9bs2bMTEhIsFoscWDk5OTSekZHB85CoaFKn0zkrd/O5jEZj9tPYY6u/v5+/GTTiWYmpXfqjKtHfG+VyPCip3jwoXQqh5juBnpySh4rCe9L1peruCg+VVl3jKkYPV3mxlcZwTwBLVXKde4S8ldJImbX3KV/WPQRYpdLZGKry/c86aGuJ6KC5Kl/zyZC+24eteGOQZ/23mLcTWUO3E1yVp7HIt5d5mgM0LNB2iU0ptcqSbUq5yvetxHZuRelRa+GQzXaWbIvOa8NmFeWXffKsauiK5VXq+1Y2H0fumkPi3TkB1gFuJZfN6rJ9ospmxfq+VbYjYOVZ35dNFa8i2y+zbBU9+TIPrfJ9K1f/mWg75cAqqd68RNe7rrZQDiyt+TXp54Gtc58dByx/0ip/s4G8tbL8U9mKfSLXnI+/lf7lUxwWVKpYNmTnFletU5jlinKzFfdjQlHcqiz7mACWetkJuYeqrZfjqsr+TN77lSzrFVUMJi5xvxUDq++NX8kVNbBsEQ3Pvf+OHFg8D1cxsKhEvgUZKC2gwvMfvOOtbROANf7AUqvVDCbS1cyZM2l8/vz5ZrNZpVLJIZWenk6Ter3eWTn2YPnzHqyPlZekU7JyerAHC3uwsAcLe7Bc7MHifVGkKNcnWuVX7OcqFysWe7CwByvUgbVw4cIJTxMdHU1aio2NNZlMtbW1NE5+4tmmT59Ok21tbc7KASy/Apa+Utq5Vaz8Rr4xKFYeA7AALAALwHITWPU731Z25pbsXAZgAVgA1mgjP0RISUhIiIuL6+7uNpvNZK+kpCTX5SELrK4Dj3d1Pq7b5kfA4vvhiC5GDqzyvCNSV7gSwAKwACwA63Fe2eElut7la/cvq9lHj1XlFgGsDdsXcysGlraummZYU7UTwAKwAKzRAqu2tjYmJmbSpEnx8fETJkxoaGhwXR6ywPK9okYDrKKCzwNisw1gAVgAlg+AZVPF68EhsORnsgNYABaANeKLNeh0OovFIi9RKpVqtVp+9VEX5QAWgAVgAVgAVvADS/spHz0McWBtzfuk47Xsz98vArAALD9KEADr3r3HB48+PnocwAKwACwAK6iAZbOKlq/dv0TXu9J69ND9FRsKwBJVABaABWB5M1eujZuiPAPW6tUSsAqKACwAC8ACsEYALM9WLIAFYAFYAFaoAEu+nQCwACwAC8ACsAAsBMACsIavylPdkoBVfRfAArAALAALwAKwICcAC8AaXZXxPl+rnbsYne46gAVgAVgA1rgDS5ErXd94bQ6ABWABWACW27nYL1346tPDfgEsQ+2gvPepyP9a6mLyvwKwACwAC8AaR2Bxlc564T0AC8ACsAAst3Lw6DifaOUCWPIuRr0cwAKwACwAC8Aac2CdTvkZPUYKrKu//Bk9ACwAC8ACsAAsAAvAArAALKdVIwUWVwFYABaAJeXWHenUq0+7ASwAC8ACsAAsAAvAArAArOC6o/O6NRdouKnmO2fAKlltvdhV0UkAC8ACsAAsAAvAQgAsAMutKn2e1I9srDgnB9aS1VJ3VqLsEZdrd7GdALAALAALwAKwACwEwAKwHADLWCb9YNBQfYP7F/v74QBYABaABWABWD4DVvUyS+7Si8fzdCMC1t3WJtLVrdW5ABaABWD5C7Bseh8AC8ACsAAsAGscgcUjX+TpRwQsHrnx0e8BLAArRIFVtl7CzfqtfgQsw2qpUytbdUQOLGWx1LmsKu0GsAAsAAvAArAALATA8lNgnbsgmYZ1NZ4/FdxwT+pE8q7mrrgsuhhtyWeSpTSH5MAadrMNYAFYABaA5TNgrS6RJstLP5P/NwhgAVgAFoD1ZIH+di0GObBWWrszRe4lAAvAArAALH8DlrxK/DcIYAFYABaAFQDAsunOACwAC8ACsACscQQWFzbn7QGwAKwnMZvNDsu7rXG/HMAai6qqWumngktWP7lBvbpI6neKtfsBLAALwAKwACwAC8DyU2DNnDkzLi4uLCwsIiIiNTVVsInIRZNUGBkZmZaWNmw5gDV2VWtrr3Ofxf0I91MOuzMAC8ACsAAsAAvAArD8AliLFi1qaGgwmUwkLWLWvHnzuJwURYQyGo06nS48PHz27NmuywGssajaZLxGw0rNWe6zlucAWAAWgAVgAVgAFoAVUOdg6fV6AhYxi8bJW4SnGTNmcFVSUlJERERXV5ezcgBrjKr4cu065RE3uzMAC8ACsAAsAAvAArD8C1jp6ekELLVaTeMajYbGMzIyuGrWrFk0WVtb66zczacwGo3ZT2OPrf7+fv5m0IhnJaZ26Y+qRH9vlMsRJQysnJKHikLpQgm6urvCQ6VV17iKPcRVFdb7A7KNvNKKgaVZPqTPUmqkPmt12T55d5ZlrVoh2xhkD90YcFXemkNDeuHSXhqqyvc/66CtJWIersrXfDJerXhjkGftmnljkDV0O8FVeRqLfBXlaQ7QsEDbJVZR1tNVxD0+V/m+1bOPo9T6cWiGbLazZFt0Xhs2qyi/7JNnVUNXLK9S37ey+ThyrV8wfndOgHWAW8k3wE+/zAfsV6zvW2U7Ahb/4dhU8Sqy/TLLVtGTL/PQKt+3cgGs5UM/KRd9C1fxKrL5E3CzlbL0gJxKlQoJIusUZrmicj7+VlQxsCqWHbJvVb6sW64oblWWfezZre6XnZCjp3qF9DKqsj+Te6hkWa+oYhVxiVdabV7aIldU3xu/ouHAskUCWFwi5hlY+DYNz3/wzui3g/Z7MZBxBlZOTg5RiYzFkwqFQg4pGqFJrVbrrDz49mDt6pQWVWkctz1Y1TW3paFW+tMtVh/GHizswcIeLOzBwh6sYN2DNbDko9MpP7ukXIU9WMEGLNJVRETEwoULRQmZSQ4pPj3LaDQ6Kw8mYFFzSTb1PgfWxgfSv4aqW/ZXE3W/OwOwACwAC8ACsAIOWNs/3kmtavMOA1hBBSyVShUeHq5QKOSFHR0dRC5xrlViYmJUVJTZbHZWDmD58mJXABaABWABWACWPwNLVAFYoQssAlO4NalPs3TpUq5KS0sjS2m1WrVaTTOIvVbOygEsbwFr2apL0g2bC6XOpaTcDGABWAAWgBUEwOLbTlD/BmABWCEBrLa2tsShyczMFJcSJUtFR0fHxsbOnTtXNHFWDmB5/lPBqgtSx6H8Un5XQc+6MwALwAKwACz/BJaoCilgdbyWTQ8AK9R/RejLAFjKkodSZ5HXY9+PAFgAFoAFYAU9sFaXSpO64s+CG1hcBWABWACW74Dloh8BsAAsAAvACnpg8SlZfJopgAVgAVjBCawr16SLMnQd8Cmwcpb3i76jbqXUj1TmSVcTXZ4DYAFYABaABWAFFbAuLlh4OuVnV/NWAFgAVmgBS1yunZhFj7L1YwmszdKRwbyCwScXKrRevbBI67XuDMACsAAsAMvPgcX/XoYUsHjkizw9gAVghSiw+C9hTfUYAqu69vbod1MBWAAWgAVgBS6w5FWlZdIrXLP6cwALwAKwggpYx0483rj9cXO7L4C1uUm6juja6itj2mcBWAAWgAVgBRCwPLtEFoAFYAFY/gus2m2SfmoahihqTIE10ts2A1gAFoAFYAFYwQSsHXlthrebDuZtALAArKACFp/JfvDokxOtHJ7JPkbAWrdGusyVUd0DYAFYABaABWCFLLBc3EUHwAKwAhhYooq/7l4HVrX+Gg03bb4lXZO97q70N7/i8vIi6YyrqrxjorMAsAAsAAvAArAcAitnOYAFYAFYAJYdsPiSobybqqrojNSLKS/Jfyqo0Ug9XbH6MIAFYAFYABaANZqLvAc0sDbmHSh9/2D9kt0AFoAV8MDiM9nbunwBLN/spgKwACwAC8ACsAIUWKKqca6WHgAWgBWQwLrYL5W07LGeY74dwAKwACwAC8ACsI5/4H8XeQewACx/B9aJjtPSFzf3tPya7EyrsQNWbtFdH59oBWABWAAWgBXEwBr2NoUAFoAFYPkaWMfbTvAXV/5TQa8Da1O19S43aqmT+nj1Ve4sSlcftvYIFh+caAVgAVgAFoAVlMCSV7m4yHswAavrQ33jXK1RsR/AArD8Gljmdqk3yS3+Uq4oz4Cl1/TRsEJ9wR5Y6ytPWUX1uR9uJwAsAAvAArCCA1hla6QXX7HySHADi0fWLj8KYAFYfg2srvYueRczGmBVFUi/BCxb0UvDFSuvfFR4WZqzVDoEqbX2Bf65nQCwACwAC8AKDmC5uIIDgAVgAViBAayK6juSolbf4KpS7aD0t6qWvvSq1cfkf/a6vCNixzWABWABWAAWgOWzqiWrB8ShA3WhNFxReBLAArAALL8GVomuX97F8F/m6qLD8t6Ha9VFUpdUUm4GsAAsAAvAArDGq+rJx1EMYAFYfg+slpaWRYsWZWVlmUymYAXWhvVX+QeGXLW6RLozYEnZSesvVk7Juxj1Ciuwih0Ay/97HwALwAKwAKxQAVYJgAVg+Tew9Hp9ZGRkYmLi5MmTY2JijEZjkAGrplE65LfOIJ2uXpR3XN77DLvZBrAALAALwAKw/BxYy1ZdkqqKpPdSVPA5gAVg+Quw4q3p7u62WCyxsbEkraABVm7F1zQs0H3mrPcBsAAsAAvAArACHVjyT2rlGuv7Uj/duWX9Ubmu4IB0l9iV3QAW4jtg1dbWhoWFzZ49mydnzJhBkz44UOgbYA3b+wBYABaABWABWMEELJsq+XpQl30qjec/kQ2PlBdJFy8ssw5XFXwJYAFYXotKpSJRZWRk8CRJiyZ1Ot0YPZ3RaMx+Gnts9ff38zeDRjwr+WTPnvXVDa2NOxvqd9GDRmiyYVPDxrod+9r2iRIxz+4de6hqU61U0lDfwq2a6ltpkgqpytS8x1rYstE6z84mqdW+XZ1UtW1jI7dq2d5GhVQlTW5opKoOU+d4tWra0kqTu3a0U9VmawmNcCuqkt5XnVSy19RBJTSy1bhNeq7tJum52vaJEjEPVdHktk3j1mpzzVbpfW2VPh36OKhk49P3xZ8OVUmtNjbyO6UHjTRYl9zaKH2gtIq41UbrZ8prjKrGpRVNcqtN8s9ru/S+pDcl+9aZtkufMq0ibkUrRBrZJLWiKlEi5tm3u3NcWvFrFp8Ov6/GLS3indIkfYhSq11Sq52NT1rxXxyvMfoyS98N61+l9esqfaYN/Fw+b9W0pYV7CW715H3V8ef1pJd40sp530KrSPrL3dQwoh5pjFqJfoxbURfnrPfzk35s2Fbcj9EfDvcSLnq/0fRIHY0dDeU7d6037anc39PSu8f4aeu6jp2GnVT4ybYumjyy6yhVtev37Cht43k+rT18YMsBmmyvbhclYh6qoskvTV/at+rc+Aktdrdx1+i3g/Z7MZDxAZZSqfQlsMZ6DxaCIAiCIADW+APLYDAE0yFCBEEQBEEArPEHVnd3d1xcXEJCAo/HxsbyOICFIAiCIAAWgOV5iouLIyMjk5OTExMTacRgMABYCIIgCAJgAVijTX19/bx58+bPn9/S0uKb9wNgIQiCIAiAFeTA8n0ALARBEAQBsAAsAAtBEARBACwAC8BCEARBEAALAbAQBEEQBAGwACwAC0EQBEEALAALwEIQBEEQAAsBsBAEQRAEAbAALLdiNBrFuFKpzEYQBEEQxEtZvXo15BSiwEIQBEEQBAGwEARBEARBACwEQRAEQRAkZIFlNBpxvBxBEARBvBX5ic4I9mB5J+KnEzxiP0TVGFVhPeCTQhU+KXxSo18UAmABWKjCesAnhSp8UqgCsACs0IjYL8oj9kNUjVEV1gM+KVThk8InNfpFIQAWgiAIgiAIgIUgCIIgCIIAWAiCIAiCIACW/6a7u9t1IY8PO5uYtFgs9rMdOHBATPIM3U9jvyibJYgXIJbPkZdzk08//VSMi2fkSfGkzp7FPg5nsF8zztaq6/Vm86bsh+IFi3cqr3LxATl8RofvxWw2269S8WHJPyZR5ewTlL8w+9cj/+zsX7P8tYkl2H+1bL4toi2/WptP1uYZXawcZ18D+TdWvFoqtFmUw5XPQ/o2ikJevfZvRP5+5S/Vfo3ZvC/X31iH31L5UzhcvQ7Xj/3rkb8F978q7r8Rm5nls/EqFeuTF0JfY/krFJ2AfJ3bfOHtPwj7v0qbdSL/mvFybN4vfzdEbCZdvEF+/fLvm83r4Rnsv582naqzHtXmD0E+j/g+8wuWL0T+7PJ3ZL8o+bfO2ScrnsXmS+7wL8L15mbYfhsBsHwdlUo1YcKEsLCwf/qnf3rttdd+9KMf/c3f/M2f/umfRkREUGFUVNRvfvObyMjI6OjoP//zPw8PD6fCP/qjP3r++edpnrCnofEXXnjhww8/TE5O/pd/+RduS/P/xV/8BVX94R/+ITX8gz/4Ayr8kz/5E5qTJqmQSzg2k6Lwueeesymk2fhljDL2T0cRr5OH/ET0Fn74wx/+X9b8gTVU+IMf/CAhIeGP//iP6UXS0MUyXT8jNR+LN+J6ZoerOsy3sX8NYt0OW8jflmFfs8O29k8t1gl9sW0WS5P06fO3wmErj9+Xtz5lm3L+xtJfDX8z+c+H56F3R399zlZyGDJO8cp3IzQ/QYfvmrZBf//3f09/CH/1V381wRqDwYANPYA1DjEajfRFTE9PN5lMvCGhL+i//uu/vvzyyzQyZcqUf/7nf+ZvLdmChlOnTiV+USF13Kwozp/92Z/RMDY2VnzpuUSEOEJDeROxGRPPyyU8tPnLiY+Pt2/II7TNYAi6UBqPkCCd/aGykGzAZ/9ibDa99sshU/LmzaYtvUjavInZiKc8m1ggz0aTvJ4dOk8wjsImZrnKXwCth7+yRqwK+dBm/fCH4vBN8VodtvcnQDursseKiBzNvMYcPhG/NflTONOhz7ZkLnzmPljFZ+F6NvkXZuw8NOwqlb/akb5Th1UORRjoPhjRN9Mrb9bFP5lu/rPklZcxLh8cPyn928+T1N395Cc/oQ0Tjb/yyitittTU1AxrWlpasK0HsMYhM2bMoC9iR0cHjavVavG9pEnehP/DP/wDf5tpo0i6Evtj6cv9ox/9SHyV//3f/52Gf/mXfyn/csv/JHhSDilaLCOMFvhf//VfNBITEyPf4so3MK+99hpTTK40Xg7pkIa//vWvaVKwgMML/Md//EeeXLRokc2fKL8eMg1txekN8pzsmOjoaBryH63osP7jP/5DvAyxA4//fWRcKhQKmpk5KP7U6Y3Qa87OzhbPLn07rU9EVYwefj3UnF7zxIkT5ZYSEBEvg2D0s5/9zH4TSK9Z7CT/u7/7Oy4XRKZJeo9iFf3nf/4nrTqepKcTnzKN0HPFxcXJ/zMW3ajN/8r/9m//5gwHpHMa+du//VvXHbF4efLvhpyh4uNzMww7h1X2wuYn5e+hwy2Ww0Kb77bYaWRPbfnXzOa/hYSEBDGbzR5Qhu9f//VfC+nabDL5jYgNjPjsRKF4MbTtEX9KNq+QC/m5uBXjXszGq4X/3KgfEP/G2K8iZxt78b7kO9JsvrfvvvsuDefMmWODLbGjml+b/D3aL4e/tyPa8NvMYPMPoWfC4BXojjls/u1xMSfX8qcgP2jA/bNDqdOXir9dXoz9kQTX/yDx99amQ/ZgxfLnIhbOXTr3KrQG/v/2zt61qi4L4zDMMBAQFF4QxNdXCyEqXkhiMIUIxsIPlJDYWMlAIOQiQsSgrYKgpAgEtZIUAUGwUC6kSJVCEOzyL81DHmax2Ocj5yZmIi+/XxF2Ts45d3+u9ey119UTJ06ocPfuXVk8GU+Vb968GQOxvr6Oi0dgHSXyo5qyLm9ubob/+Pbtm1as7Klm9uLioq9PTEw8fPhwamrqP7vESpALtEJqcUL2xF5v4+PjEW7RT71QNjTklK2qlE3eND948CAbkRxSOnv2rPWQXUXIBR+I6FfpFV/XarTP/scueiT8mQrqCh+sZLN1/fr1LPW8bqsmUobPhub06dNhiWQTXXaL7ty5E89ae/m1qlU05/Lly35b1TD55qiwDa4rGW5PT/21iyyO3bMfcRDIP+/du+fry8vLamy4tOg9fbpVVBa4/tzonOz5qoOSK3z+/Pl2vWIFUBv4dBuHtdFNnqBJH3gIWvxi1f9ZTBc3eAL4VYUvLESqeyZ3b3aihfSJi7l6vpj3M3GDxz3cXu6NooH+0DwiWcREE3xDjj3vI2TSMijeyWjhVLvLFfCicG/ELM31ieHLDcxtieq1VGPfkZjcdteq+JTqm4spnadKVbhU44hGO6hch6xNm+Z5x+VQbVFLW4qtYDGdusTSmno+t6joMZm4bJD166dPn7yj01My+DY7s7OzHA4isI4SrR/tA1ze2tryrJVa0gbIa0PLeGVlJW+jtUXQU95DePbL38R2qklghWUUc3Nz+U9WSMVCLRa/PjHeIPejm/O+1tVr2sLGms+GT23Jvlz32DNVnVA2EzloV3jN2hOffE8cdWXP6qPAFrvfxZ9Vz/gippKFkS8+f/7cd8o9W25a1mgQrXUKLdXyuU2HetHb+zCvTbGQ7v5v2BOrQrx2OaqrraQfD71YVVRdMsZyPWv1UK1vaxIWxbpryjxrP4Tac9B/4eFa/qwoW0fm9V47BC3Jdl3y8A7p7LXLjCrsUse35TsLidYUxC3mRscwZPfWFZWvhhVr32CFPVQfxge5J6P5bsX8/PyjR49idyd3g6NHYB19BGswGETwWehPf+4S8/jixYu6qBnsE4qrV69++PDBj1hv5X1GIbCsZorzDr825Jr8vd4ZDt6KxzdLnaigqjo7vljMvV7PZ5R6YQ4UeWtbnDlWM5O6JzfsaX9DF/b7/aanvOvynbUJKGF/s7cuPGVTBo/+FJtOaSb1gPVr3OyzP/ewDFMO2uVqaESiiyIqU7XOTak5RfUcHWzqUs+Kplyc2i3sr3XzNtC1vq32YoxFjiL4YjTTD7pva3vJwxTDkZ+ymGiRZS2qdNiecYULJ+eP9pag+7cfDj4oaogMRXRXcWLYngpWuyUYVjEUpumAeVfDHlM2nTnG7KptY+0JdUxRtSgMQnHAGhmZtRpa6iRSnaoTLH4edn59zgrNzbdRcuBTDYzbfMX9Njo6OjExocLnz5/x9QisI8vB2t7eVnllZSXEkK7oT5OTk86A8QKTrtKVEAdra2sOeul+G+hLly41Caxbt25FSlPhTiLJZnx8XBLK2R7WFiEOtH6mp6flzyKU5cXmUJaURBiUt2/fZi2Vw1RXrlyJ8HLLwZOfzca9SKuv2v1Y3mHmXr16VU2FyTtytdShuBZT68ORWmXjTiv608IrG1DpPA1K9EY+d1BPqiEXLlzIlisCYHkTXIjFXJP79+/niH0T79690zDFsWa215pRf+yiSdUSSRoqgtXd6LtKtSlKLQIrcpVs5f2gZ1qklHmZ5DPi2gBS5Ki1x8zaa9UkRLrokiK82iJqDzWCFQ3JNXHvFefyxalfl4oNG0lV2bk+TZux2HW0bMZqD/7yEaETFdprpT1n0yGv3x+d0xTvVEOi07zMc/Ko5VfTd4OKvW5tGMzjlXcaLfVpmYF7filEXW1vlYP0saG9ceOGvczi4mKcTsgHzc7OqrC6uoqvR2Ad5bcIB4NBr9fzytcmQFPzyZMnjx8/9sG25rFEjL/4HVphamoqZrwfXFpaiqlvNRN4HVoWFCYyG6ki86CaDZCPDmO5hlHWq4q09Gw7/GyRiFpd804Xc66Sz7kiW8uhO2dQWSfpT9VtparhjVS8XPIif2syKhOuvda+5J1ZbeAhu8DaO213whqqEMPnftAgRgf6H6GoBsyKQcnj5UGpTRCOfbN7I38FQVeiSv7QHK1scVr7U2B7noK1uOHD/pJU9eurw7ZIZc/5fIgWTtTv96DHSXFTJs1hn5rtiZdJS3zO6ZWHXaUIk1fPXv//HHkdfuGXDfNQRjmr+fYvq+Z/tafQvrIMeuHc3Jzttg318vKy9KUmlSMIgMA6At6/f3/u3Ll/71Kd1vrT06dPPe//tYun+LVr1w7yDZHfzRDYrKtpZ86cyVvPFonj2ENoghbFto86N6Uv1F6s7nH/uUs2Yfq10EmF/JWiirYUEbvufVhb4e4d0v1floKj8pQAv60N99ZiZmbGAkveqtfrbWxs4OURWAAAAAAILAAAAAAEFgAAAAAgsAAAAAAQWAAAAAAILAAAAABAYAEAAAAgsAAAAAAQWAAAAACAwAIAAABAYAHA34uXL1/O/I+FhYXv37/7uv/j862tLboIABBYAADDYSHV7/enp6dVGBsb8/W1tTVd/PHjB10EAAgsAID9CCwVdnZ2RkZGjh8/7usbGxuvX7/++fNnlCW23rx5s7Cw8PXrV/oNABBYAAB7CKzNzc2lpSUVnj17lq/7iNDlsbGxkydPqjA6Okq/AQACCwBgD4Fl5ufnd3Z2mgRWv99X2SeJ29vbdB0AILAAANoE1mAwePHixcjIyOTkpDVWVWBVywAACCwAgEaB5fLt27dV/vjxIwILABBYAAAHFVjr6+urq6vHjh1T+cuXLwgsAEBgAQAcVGCZU6dOtSS5I7AAAIEFAAAAAAgsAAAAAAQWAAAAAAILAAAAAIEFAAAAAAgsAAAAAAQWAAAAAAILAAAAABBYAAAAAAgsAAAAgL8V/wVGhhrP3G3w1gAAAABJRU5ErkJggg==" }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import net.imglib2.FinalInterval\n", "\n", "// Set this to the image you want to analyze.\n", "image = mandrill \n", "\n", "xLen = image.dimension(0)\n", "yLen = image.dimension(1)\n", "cLen = image.dimension(2)\n", "\n", "// Create a chart.\n", "import org.knowm.xchart.CategoryChart\n", "import org.knowm.xchart.CategoryChartBuilder\n", "CategoryChart chart = new CategoryChartBuilder().width(800).height(400).\n", " title(\"Histogram\").xAxisTitle(\"Bin\").yAxisTitle(\"Count\").build();\n", "chart.getStyler().setPlotGridVerticalLinesVisible(false).setOverlapped(true)\n", "\n", "import java.awt.Color\n", "cNames = [\"red\", \"green\", \"blue\"]\n", "colors = [new Color(0xED4337), new Color(0x90D860), new Color(0x7989FF)]\n", "for (c in 0..cLen - 1) {\n", " // Slice the image at this channel.\n", " slice = ij.op().transform().crop(image, FinalInterval.createMinSize(0, 0, c, xLen, yLen, 1))\n", " // Get the histogram.\n", " histogram = ij.op().image().histogram(slice)\n", "\n", " // Extract the counts and add them to the chart.\n", " counts = []\n", " for (value in histogram)\n", " counts.add(value.getRealDouble())\n", " chart.addSeries(cNames[c as int], (0..counts.size()-1), counts).setFillColor(colors[c as int])\n", "}\n", "chart" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
imagemediandogtopHatblackTopHat
" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import net.imglib2.FinalInterval\n", "\n", "// N-dimensional crop.\n", "eyes = ij.op().transform().crop(mandrill, FinalInterval.createMinSize(85, 5, 0, 335, 110, 1), true)\n", "\n", "// Type conversion.\n", "eyes32 = ij.op().convert().float32(eyes)\n", "\n", "// Median filter.\n", "median = ij.op().run(\"create.img\", eyes32)\n", "neighborhood = new HyperSphereShape(4)\n", "ij.op().run(\"filter.median\", median, eyes32, neighborhood)\n", "\n", "// Difference of Gaussians.\n", "dogFormula = \"gauss(image, sigma1) - gauss(image, sigma2)\"\n", "dog = ij.op().eval(dogFormula, [\n", " \"image\": eyes32,\n", " \"sigma1\": [20, 20],\n", " \"sigma2\": [4, 4]\n", "])\n", "\n", "// Grayscale morphology operators.\n", "import net.imglib2.algorithm.neighborhood.HyperSphereShape\n", "topHat = ij.op().morphology().topHat(eyes, [neighborhood])\n", "blackTopHat = ij.op().morphology().blackTopHat(eyes, [neighborhood])\n", "\n", "[[\"image\":eyes, \"median\":median, \"dog\":dog, \"topHat\":topHat, \"blackTopHat\":blackTopHat]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fourier transform with lowpass filter" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "scrolled": false }, "outputs": [ { "data": { "text/html": [ "
imagelowpass
" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import net.imglib2.util.Util\n", "import net.imglib2.FinalDimensions\n", "\n", "image = cells\n", "radius = 10\n", "\n", "def lowpass(fft, radius) {\n", " // Declare an array to hold the current position of the cursor.\n", " pos = new long[fft.numDimensions()]\n", "\n", " // Define origin as 0,0.\n", " long[] origin = [0, 0]\n", "\n", " // Define a 2nd 'origin' at bottom left of image.\n", " // This is a bit of a hack. We want to draw a circle around the origin,\n", " // since the origin is at 0,0 - the circle will 'reflect' to the bottom.\n", " long[] origin2 = [0, fft.dimension(1)]\n", "\n", " // Loop through all pixels.\n", " cursor = fft.localizingCursor()\n", " while (cursor.hasNext()) {\n", " cursor.fwd()\n", " cursor.localize(pos)\n", "\n", " // Calculate distance from 0,0 and bottom left corner\n", " // (so we can form the reflected semi-circle).\n", " dist = Util.distance(origin, pos)\n", " dist2 = Util.distance(origin2, pos)\n", "\n", " // If distance is above radius (cutoff frequency) set value of FFT to zero.\n", " if (dist > radius && dist2 > radius)\n", " cursor.get().setZero()\n", " }\n", "}\n", "\n", "// Perform fft of the input.\n", "fft = ij.op().filter().fft(image)\n", "\n", "// Filter it.\n", "lowpass(fft, 10)\n", "\n", "// Reverse the FFT.\n", "import net.imglib2.type.numeric.real.FloatType\n", "inverse = ij.op().run(\"create.img\", image, new FloatType())\n", "ij.op().filter().ifft(inverse, fft)\n", "\n", "// Display the result.\n", "[[\"image\":image, \"lowpass\":inverse]]" ] } ], "metadata": { "kernelspec": { "display_name": "SciJava", "language": "groovy", "name": "scijava" }, "language_info": { "codemirror_mode": "groovy", "file_extension": "", "mimetype": "", "name": "scijava", "nbconverter_exporter": "", "pygments_lexer": "groovy", "version": "1.0" } }, "nbformat": 4, "nbformat_minor": 2 }