Skip to content

Instantly share code, notes, and snippets.

@jochym
Created March 21, 2014 10:52
Show Gist options
  • Save jochym/9869825c8fdad5f71ec6 to your computer and use it in GitHub Desktop.
Save jochym/9869825c8fdad5f71ec6 to your computer and use it in GitHub Desktop.
Prezentacja IPython notebook w IFJ cz.I
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"IPython notebook - narz\u0119dzie dla fizyka\n",
"=======================================\n",
"\n",
"Pawe\u0142 T. Jochym\n",
"---------------\n",
"\n",
"*Instytut Fizyki J\u0105drowej PAN*"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Plan\n",
"====\n",
"\n",
"* Python, IPython i dlaczego nie FORTRAN\n",
"* Za wolny do *powa\u017cnych* oblicze\u0144?\n",
"* IPython notebook\n",
"* Inne j\u0119zyki: Ruby, Julia, R, Perl ... Magic!\n",
"* Cykl pracy\n",
"* Mo\u017cliwo\u015bci: \u015bpiewa, ta\u0144czy, deklamuje\n",
"* Jak zacz\u0105\u0107?\n",
"* Bliska przysz\u0142o\u015b\u0107: obrazy IPython dla CC1"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Python, IPython i dlaczego nie FORTRAN?\n",
"======================================"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Python\n",
"------\n",
"\n",
"* Sk\u0142adnia: pokrewna popularnym j\u0119zykom (C, Java, C++)\n",
"* Obiektowo\u015b\u0107: kompletna ale nie wymuszona\n",
"* Interpreter: natychmiastowe wykonanie polece\u0144\n",
"* Dost\u0119pno\u015b\u0107: wolna implementacja na wiele platform (Linux, MacOS, Windows, ...)\n",
"* Zastosowania: bogata biblioteka funkcji naukowych, graficznych i innych"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"IPython\n",
"-------\n",
"\n",
"* Interaktywna pow\u0142oka *standardowego* interpretera\n",
"* Zerwanie z cyklem edytuj-zapisz-wykonaj\n",
"* Rozbudowany, interaktywny system pomocy\n",
"* Integracja z j\u0119zykiem i narz\u0119dziami programistycznymi"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Dlaczego nie FORTRAN/C++/Mathematica/Maple/MatLab?\n",
"----------------------------------------------\n",
"\n",
"* Dost\u0119pno\u015b\u0107 (tak\u017ce dla wsp\u00f3\u0142pracownik\u00f3w)\n",
"* Szybko\u015b\u0107 i \u0142atwo\u015b\u0107 tworzenia kodu\n",
"* \u0141atwo\u015b\u0107 wsp\u00f3\u0142pracy (niezb\u0119dna jedynie przegl\u0105darka WWW)\n",
"* Mo\u017cliwo\u015b\u0107 realizacji kompletnego cyklu pracy"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"**Interpretowany j\u0119zyk do *powa\u017cnych* oblicze\u0144?**\n",
"\n",
"* Liczy si\u0119 *czas do uzyskania wyniku*, nie czas komputera\n",
"* Komputery staj\u0105 si\u0119 coraz wydajniejsze - *ludzie nie*\n",
"* \"Niska wydajno\u015b\u0107\" nie jest wcale taka niska"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Wydajno\u015b\u0107 w obliczeniach numerycznych\n",
"-------------------------------------\n",
"\n",
"Diagonalizacja macierzy $1000\\times1000$ ($10^6$ element\u00f3w):"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%timeit -n1 -r1\n",
"from numpy.linalg import eig\n",
"from scipy import random\n",
"\n",
"# Losowa macierz 1000x1000 - 10^6 element\u00f3w\n",
"M=random.random((1000,1000))\n",
"# Symetryzacja\n",
"M=(M+M.T)\n",
"# Diagonalizacja\n",
"V, L=eig(M)\n",
"print '\\nSuma warto\u015bci w\u0142asnych:', sum(V), '\\n'"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n",
"Suma warto\u015bci w\u0142asnych: 1008.39411105 \n",
"\n",
"1 loops, best of 1: 6.69 s per loop\n"
]
}
],
"prompt_number": 4
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Prosta analiza danych\n",
"---------------------\n",
"\n",
"Generacja $10^7$ losowych danych o rozk\u0142adzie normalnym i obliczenie histogramu."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%timeit -n1 -r1\n",
"r=random.normal(size=1e7)\n",
"hist(r,bins=50,normed=True);\n",
"x=linspace(-5,5,100)\n",
"plot(x, exp(-x*x/2)/sqrt(2*pi),'r-');"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"1 loops, best of 1: 1.26 s per loop\n"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n9T8h4P1xra7CyQAAAABJRU5ErkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0x7f6cdf879290>"
]
}
],
"prompt_number": 90
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Rozwi\u0105zanie r\u00f3wnania Laplace'a \n",
"------------------------------\n",
"$$\n",
"\\frac{\\partial^2 f(x,y)}{\\partial x^2} + \\frac{\\partial^2 f(x,y)}{\\partial y^2} = 0\n",
"$$\n",
"\n",
"Rozwi\u0105zanie metod\u0105 relaksacyjn\u0105"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%timeit -n1 -r1\n",
"nx = 50 ; ny = 50; ## Rozmiar siatki\n",
"epsilon = 1e-3 ## Pr\u00f3g zbie\u017cno\u015b\u0107i\n",
"imax = 10000 ## Maksymalna liczba iteracji\n",
"\n",
"T = zeros((nx+1, ny+1)); TN = zeros((nx+1, ny+1)) ## Pole temperatury\n",
"T[[0,nx],:] = 100 ## Warunki brzegowe\n",
"\n",
"k=1\n",
"while k<imax:\n",
" TN[1:-1,1:-1]=(T[:-2,1:-1]+T[2:,1:-1]+T[1:-1,:-2]+T[1:-1,2:])/4.0\n",
" errmax=np.max(TN-T)\n",
" T[1:-1,1:-1]=TN[1:-1,1:-1]\n",
" k+=1\n",
" if errmax < epsilon:\n",
" print \"Zbie\u017cno\u015b\u0107 po \", k, \" iteracjach.\"\n",
" break"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Zbie\u017cno\u015b\u0107 po 2571 iteracjach.\n",
"1 loops, best of 1: 165 ms per loop\n"
]
}
],
"prompt_number": 108
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"X, Y = meshgrid(linspace(0, nx, nx+1), linspace(0, ny, ny+1))\n",
"contourf(X, Y, T.T, 64, rstride=1, cstride=1) ; colorbar(); xlabel(\"X\"); ylabel(\"Y\"); show();"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAWMAAAEKCAYAAADHOTRzAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztvX2UFNWd//9qdIBFEmYYYAaFOARFHp0ZwWD24Iqrg3H9\naYgYNyZhOYK7e8zZPXE1Pm2yZzX7U9DENcjGXxJjDIm/n9nsNw+SBDkBBTQmivKgbhKDwRlFA6MM\nM0R84ql/f/RUd3X1fay61VU9U+9z5kx31a1bt6urXvXp9/3cW7l8Pp8nU6ZMmTIlqiFJNyBTpkyZ\nMmUwzpQpU6ZUKINxpkyZMqVAGYwzZcqUKQXKYJwpU6ZMKVAG40yZMmVKgY5PugEi5Ua2wdvPJd2M\nTJky1YDOOeccNm3aFKmOEbkc7xqWbWhoYP/+/ZH2J1IujXnGuVwOHs3Dm8AfgL0UXgP0APv6X3v/\n3/RtfMRfU7eg9tc1exdtI9ODwGdDbltN/RRYaFH+jbgaotF6oCOhfdtI1M5xSTREI9vvHaApwv50\n254k2eaWwp8/NBzb/39M/x9AY//y5v5ljcA0oDVHVIzlcjnuMCx7I0Ten0ipjIwBFv31/8suJtN5\nqIUDLzYXwPsmJRjv7S/oLQMBpAMnxxEoP2FE8PROGB20AUb21+fVE+VEDipJsCcFlhMS3LeN0tRO\n1Tl3gmZ92HqDEkFWUocIuG8Bk/pfi8DrLfeWTX2fUWN6mTS0i9ls5X6LlqZZqYXxF/gqW5nN9qHt\ndJ3eQg+NBTDva4B9w9RwPq1/+VQqAe2VAYonS1k07V9nCkTbE96kXpdg91+UaY3eB4NcfqfV2K8M\nspq6g1QZG3g/JvB/L4Vr1ivnj3zH9r8e8z4nn9hJA31MZhctdNLODmbzbAbjuHXW/9nBWXN38OLE\nk9nKHLbTRt/QBrpObKHnRA2YoRzOUPri9wVe+/Vm4D1NElB7ugCzEzYYZYe9OMKC9HQH+44qk7ZP\njb0Vbj7/Rx3VE0Y2+z1HUd7kvNXsT0QPGXj9rxsDZU+eD2f61vUDeNTUvdQP7aOBPhrpoYWuMgg3\nP3cAfmX4MWLWypUr+fa3v00+n+fv//7v+fznPw/AqlWruPfeeznuuOO46KKLuOMOuRmSWs84fypw\nFjAXmAd7W0cVodzFJPqop496emikl3pe+dOkSjCDHM49lLRP8tpTBaTRQBrCgdPEGgmjLBpOn+KC\nuSlkPRm0wwS6IAYvVMI3aD146wQArqePFjqZRMGSaH9nB8OeAp4EngKehlxPdA83l8vxgGHZKynf\n3//+7/9yxRVX8Mwzz1BXV8fHPvYxvvGNb/Dqq69y++23s3btWurq6njzzTcZO1Z04ApKbWT83Zfg\nwpeg6SXgJWied4CL5j7K5Il/ZCtz6KSFPuqLYG44sY/eE+vpO1RfiJhfHFaoyAPzGAqgbaYA5rGU\nINtICc5eOZ1EgPZU4U2LpPKrVQoD7KgXfgbzSlU7MraFrF8hgetJB97g+0bfawMAM6bgAXsQnsyu\n/lCrl3r6KiPhp4GnYNtLsEH/yWLXiy++yNy5cxk+fDhQyO748Y9/zLPPPsvNN99MXV0dgBLEkGIY\nF9UD7KfAg5dgUuMr9I1ooI96AFropI+GUvmhwBg4MLXfwoASeP3QjaJ9iE9QD9Cyo1oWTasuEBX8\nbC5KV5F2Uj/JB4OiQNaTxfeju+JlvFDBF/QA9pcpy5QogfiUIoRLIJ5EF5P5Iw3vHCixwMU17FAz\nZ87ki1/8Ivv372f48OGsXbuWOXPmsHPnTh5//HH+9V//leHDh/PVr36VOXPmSOtJNYxfp/80876E\n/TCsB+pH9NJCF9BSLNsC1NNHH/X8cejkApBp6I90h5VX7EHZJAr2yumkAzQYQhrCRdUiJQHuwS4X\ncA0qxM3Q5Mo2Ba9oWWPgvb8uFYSLnXcFCANMGtpVtCQ8EE+iy/e+j2EvUQ5i92m+oTV16lRuvPFG\nFixYwAknnEBbWxvHHXccR44cobe3l6eeeopnnnmGyy+/nJdffllaT2wwfu+99zjnnHN4//33OXTo\nEB//+MdZvnw5+/fv52//9m955ZVXaGlp4Yc//CH19fXyiryD3kNFdAxQTz2dPigDnMIueoY20nti\nX8G2kEHZL1N7QgTnfZJloAc0WEDak8nFaWstRIHIQAR5HFCVKcIvjyjQ9WQCXxBHv56CAPaXl0A4\n6A17/nCDD8KN9JSi4m6KQVkckn0Lz/f/qbR06VKWLl0KwBe/+EUmTJjAiy++yKWXXgrAmWeeyZAh\nQ+jp6aGxMXgnKyg2GA8fPpyNGzcyYsQIjhw5wrx58/jVr37FmjVr6Ojo4IYbbuCOO+5gxYoVrFix\nQl3Z/vI/Lzr2NImu/vtpH13FhMV+DYV6GyjbyhTO3nKQXxymkAaDDsQ4gC1TNcFVa3Jg8dhcpWHA\nK1uuin5BD2D/ujHvA5R5w4XipU66evrKQDyZP5ZHxT4Id/dUryfjdMrzkf4/QZk33niDcePG8eqr\nr/LjH/+Yp59+miFDhvDYY49xzjnnsHPnTg4dOiQFMcRsU4wYMQKAQ4cOcfToURoaGlizZg2bN28G\nYMmSJcyfP18P46D2F6Lj3hF9gpWdxY49z7booVEOZdOIGEodf548H9qTvxPQr32S5f51YBZFe4oE\nak+moMg68Crl2Ee3vRJ10AW1vWYC3+B+mgPrgjaEv7whhP3+cEMRwrtKy/xRcY/vL2W67LLL6Onp\noa6ujnvvvZcPfvCDxWh51qxZDB06lO9973vKOmKF8bFjxzjjjDPYtWsXV199NTNmzKC7u5umpsKJ\n3NTURHe3/ELvpnAHbBoNeH/dhf/DRkMDB2BEZ39M3MAuJhe39XfsKaEMQCBS9mdayBQEs0g6OIvW\nBdebRtF+OQG1X9XOi66mqtg5GfZqiwpe1XrT6FdUjyYKhhKEgTJLAqgAcQued1wCcVlUnCKfOKjH\nH3+8YlldXR3f//73jeuIFcZDhgxhx44dHDhwgAsuuICNGzeWrc/lcoV5KAR6A8FlErQr8IBcWD2Z\nXWVAFqmRniKUvZNHCmUb6aJmMIOzyXoIB2nQf+OhYC3TIMrCcHElmUAXzDqUTeEr2q8JgP3bCaJg\noALCQFk07L1XgjgYBSfgGVdLVcmmGDVqFBdddBFbt26lqamJvXv30tzczJ49exg3TjzGfz3wHPAo\n8H91w/xGSlkQ/dExlAO5j4biXVemPuqLJwZD+xcGoey3L7wTzg9Xv0/sgdI7gb3BJUEwgzs4i8p4\nCgtpT6ZnhFNop1yurxJT6HoKG/WCGL6iNqgAHKwnCGHQglgUDXvr64tlfCD2Q9hvUQCbDsNDwEGS\nm9IqDsUG43379nH88cdTX1/Pu+++y/r16/n3f/93LrnkElavXs2NN97I6tWrWbhQPKtUBzALOANo\nqutf2EMRwv674zCAERTvtkH1US9dB8ih7EXKJlD2yvlPahWYQew3+9pRpiiADrYhKFNQ+2V75qQF\n3tVK5rQFrqcoUa8nUwCDeRTs394QwoUq9CD2ry+C2EtjC1oUPTC/Dj5IgdEvkI6BHy4U26m5Z88e\nlixZwrFjxzh27BiLFy/mvPPOo729ncsvv5z777+/mNqmUlmu8WhKX0zgN0XDOyW7QqcCnAsnQA+N\nNNBHL/XUDy14yaPG9BZG8RW9L4F9Ieq8swWzVw/Io2ZPJtaFLaA9uQa1SKnOaA+psMAFM+ialrWB\nL4SLgoPlDCAMBGBb8of967youCg/iP3dDv1A7u6/NmqhR8JGsV0is2bNYtu2bRXLR48ezYYNIe9l\n+ym3KnwK+sehFYyS/VD27IuggtGyb/sKGwNKYAazqNlfrycTOIvK6coHZQIcV8BOk6KANiiX4AU5\nfMEs+hXtR9WRp4AwuAGx0J7wlNIMCteqiXilmFEB5RFyQEH/uNH3DfZRXzwRCu81/rIplGUWhtfW\nYLQM9mAGezj79ydSVEj7FQZc1QS4S7CqZANdm21s4QtmAA7WrZxxzQ7C3v9gR51/nRDEwag42GEX\nY0ZF0tnyNQFjoBQVB19L5KW7NYa4pQatC8AOyhAOzKC3Mzzp4Oxrc5l0sFXBIQyoZaoWIF0rDHBt\nt9Wc204BHKyvYg6KcBAu/HcAYv957Xs90CwKSDmMuwlYw/4OPAljVXaF3ysuve8tRsnB9Z6soAyV\n0TLIbQyvvCeTqNlfrycTOAf3K9q/SjqYuIR1UooC27D1hIUviAEs2r8upc0CwmAG4mBHnbe+wiM2\nUYpzjF0p1TAWyvtSRvuWKfxjb3Y376Tx3jcEoBsEspcC50XJQEUnHwigDOWj+mRQhvBg9tfrr9sv\nUzgH9++XLVxtQRY3vF2B1fU+dPAFNwCW7csAwqCOhgtVi71hb5lXXgZio6hYMEvbQJwJBWoAxt1I\nvBz/nXK0qEBB3okg85B7BdFwEMggti6UUA524KnyjkVpbUFQmYLZX79fNnAOtiUoVxCtBixdKWxb\nTcALetvGBsCi/ar8YNBCGOxsCa98EMTFer2hzpbqtncdjdVk+l3F1IbUwxj674T+TjyRJNFx74hR\nZUAGP6DLgSzLR9ZFyYAeyuAmWgY1mP31+/cRlOjEMz3JquUrV1OubgymFzSEBzCEi4JF21lAuLAL\ncxAX6yobgddbFvwYecX+9QNYNQHjovxfRiPa6HhYTwnIUDphemjUAllmW3jbi6JkoJSjDGL7AuRQ\n9j5XYScluQJzcF9BRQG0pzRZFXFG3jbQ9RQFvmAOYNG+DCEMekuiWM4yIi7zkf1pbLJzLIUTycep\n2oKxXz1UnojBLtZ+QHsDQvyRrx/InnRABnWUDALrAsyhDOpo2b+tf3tPsswMv2zgHGyHX64ukrRb\nFWGgC+bZImEADGZRsGh7AwhDpSUBldFw4XV5R51ROT+I9/v+dzPgo1+VahfGfnlfbDA67p9M6P1G\nNZBFWRQiy0IVJYMDKIM6WvZ/Vv/2wTo86aJm//78MskBVkGq1qKZsMD1K274QvgoGKwhXNidXTRc\nvt4/HLq0vzKfWBb5pvTxSnGrtmEsgrA/Ou4/eYf1FIAMpek0C6t7KoBcOTjELEoGokMZ1NGy7zOV\nfX5ZHX6ZRM2ewgLakw3c4rzgXEBWJNsc6WoAWFaPD8Jg5wuDPMr1LzMBsb/DbljQ/1VFxT6/OM7O\nO0CZCFCmwdyBVyaZTywCs2+Z3z8OZljIgCyzLQrbiqNkoLgtIO/kg0oog3m0DGJ/2V9HsB6/bODs\nb4NfLkbRxQVMVwozOEUHX3A734QlhKE6IA7WA5QPd1ZFxRIN1LQ2qDEYd/dI0k/2I7QoymZ48/nH\n/g69MEAubFteFqiIkv1ABuKHMoSfw8IWzv72BFWLc1VEGRFoAl9wP+FPzBD2v/ZbDaYgDtoTFT6x\n91o0nE4RfQ7E0XdQQzB+HUm+cbAjz/uimyrXi+wKV0CG8rmSg14yiKFcBDLYQxnswOyvL1hnUGHg\n7Cltkwu5HnptCl8ID2CIDcJQPRBX5BP7HzDsl8gjVkTIAxHINQHjimHRnoIRsQjMgeg4aFeEBTKU\nj9oDsR8NCKEsjZLBHMogj5ZBbmME6xTVG5QIQDaADqpW5qawAS9En/gHzK0IiAThQlPMbAn/chsQ\nexLaE6KoOAjganbimVpmL1UuWr58OQ8++CBDhgxh1qxZPPDAAwwbVrh+77rrLq6//nr27dvH6NFy\nY3pIiCanQ6q7aPBLFvw88u7Wwbu/LKk9eAL6t6mnPK/Sf3L6T/ayRPihfWUXyqgxvRUXEmPer7jY\nGOP782us7y+oxsCfSGOQ1y1Ts+SvFhX2s5geN93xl31/snoD54bo/AlaEsFoWDycWX1+24JYaU+I\nXoNVhJwGdXV1cd9997Ft2zZeeOEFjh49yg9+8AMAdu/ezfr16zn55JO19aQ+MhZGxaqIWBYdC+wK\nzz+WRcieRBEylGda+MsFX9taF2AQKYM+Wgb90GjTCYVsBmeoIBYlmo4qVzeKuGdfk+0jeGOmMhIG\nc0sCzG0Jfz02IC5KZE+IAqZgea9oitPcPvjBD1JXV8c777zDcccdxzvvvMNJJxVM1WuvvZY777yT\nj3/849p6Ug/joCo68SQddYXCFEgusSve11wsosyJso45C9sC9NYFGEIZzCwMUNsYhUaVZDuZUJjR\nc7UWOdsOSokyCZChFQH2EC40Te0NF17LbQn/MlMQS+0JNK9rSKNHj+a6667jQx/6EH/xF3/BBRdc\nwPnnn8/DDz/MhAkTOP30043qqTkYl0k0Cs+TB2B/aO2VF2RX6KJjqIyQ/csKr8Xpb95roKJef11g\nCGUoXKCySBnso+VC40oKO5FQrc5NAfHNwAb2UTAIIQx6Xxjso+HCa3FEHFwmWqeUCLKyqFiR+hZM\na6vWw0g3HYBNf5av37VrF1/72tfo6upi1KhRfPKTn+R73/se9957L7/85S+L5fL5vHI/NQVjaUYF\nqK0KEKa/mdoVomhXB+TK5WLbAiqjZCjv5ANL+wLMomUwn0go6iRCaYJ01CHYrmZiiwhhsIuGwR7E\nqiHOsUXFSUXIkr61+aNhvu/9rYG7wrPPPstf/uVf0thYODEuvfRSHnjgAbq6umhtbQXgtddeY/bs\n2WzZsoVx48YJ91O7HXh+6b5URWeed8KYduj5X4t+vvm3FW0nOpk9BS+kYCcfaDr6RBexrmNJ1fHn\nl0knoErBji7RnwvFsR+bz647nqp2SL5DWeecqoOu0OxyWyIREOuiYp1qwLqYOnUqTz31FO+++y75\nfJ4NGzawaNEi9u7dS2dnJ52dnUyYMIFt27ZJQQw1FhmXSTTQw3Qblb0hkIsIGajY1qsb9FEyoI+U\nQd/ZB/Io1SRi9hQ2clYpLZMG2d5sTNL0VJ8tQiQM4aPhwvvKNDSVR+yv3ygiBnFUHFyneu1TGvOL\nW1tb+bu/+zvmzJnDkCFDOOOMM/iHf/iHsjK5XE5bTy6vMzISUC6X4w7Au4c0UbJ9T8LXgefBuFHx\n2l+uSb7O68zzRud5sPSACiVg+jvl/K97i9v415fDUratv36/egNloBzKniqg7ElkYZStV68Gog3Q\nSHEveKSh2FEBDFWFcPC9LhquLC/usPOvk0bF/iHO3Yp1/u18r71Mitd9m3dT8oxvRO/H6pTL5cj/\njWHZtdH3J1LNRMb+fjjpsGhPqqg5GB0Hsitk/jGoI2QodcYFU98Kr8U+slfOqx/KoRzs4INKPxkM\nImWw95Y92U676VfSs7u5mvvCdJBKSABDeAhDuGg4uC42EMskWpekLZHwPCmphvEblKJjrUQADmZP\nSIfylcsFkIPLTW0Lbx+F5ttZF6CAMph1+IE+Wo4CZ7/SPEmQzQhBE3vFEsLgPhouvI8GYlHdWp9Y\nFhX7lTYwJ6Da7sAz/VJl20k680QSPY5JFn2YdOyJtg9eOKIOPpNOPpB09HmSdfYV12PX2TUW847A\ntCrMZ9AdI1XHKvLvSPSd6jrooDogFnnMUtlci5rtBvJsbZ5qDsbCL0V1V1V1HgjKy7IrCq/LMywq\n10cDsui9KCIR/UyNBGWXYIZKsKUN0FHaZ3I8NMfUBYRt/eGwIC6vs7LNWntC5RUHNcgi4aBig/Hu\n3bs599xzmTFjBjNnzuSee+4B4JZbbmHChAm0t7fT3t7OunXr3O3U5Ms0OSkCigPIqgR7EZBNomQI\nCWXQQxmipYiJABgXrF3uy+YzO4QwmHvDql9Yqpu/CYitfOKwUk2XKViXxowKF4rNM66rq+Puu++m\nra2NgwcPMnv2bDo6Osjlclx77bVce+21ce3aOnVN15kHlb4ulI+ms/WQC+/VPrL/vbe/QnPLO/ig\nMusilKcM+g6/srK+11EHdaQlera9yWhuYKoboAjAYAZhsLMlguujglgo26hYFTwlESXbpso6VmyR\ncXNzM21tbQCMHDmSadOm8frrBZPBRVpIt80Xqjs5BAraFeDPuSydnFEi5GBd4vVmF6boAgb5Be9F\naUbRsi5ihvgGccStMG02OC6qY6uKhOMAcTBatgGxbB9GgzvCKM2pkDGrKp5xV1cX27dv56yzzgJg\n1apVtLa2smzZMvr69B0BRj9LXP1UEpxUZbNP9SsqkG19ZBfWhQ7MStmAubiN4C8pRR2NZ/j5XUM4\njC2himRtQSwcFCK4Hoqy9YotYD5Q7QlPsQ/6OHjwIPPnz+dLX/oSCxcu5I033mDs2MJv0n/7t39j\nz5493H///eWNyuU4v//1CcBU4BzKB36AZPCHzfsmyXrfsuBgEJAP6vDbB7qBIaJ1wfrE68vfB/fr\nl2jASLEewcARv6Q2RlA6KyOMwlgecYDe8Maju5HJboIg/0Xj2pYI7ssGxP4yfhArc4pNLQrNe9GA\nj83Ai8Db/e834GjQx+cNy66swUEfhw8fZtGiRXz2s59l4cKFAGVjs6+66iouvvhi4bYd/f+N84yj\nSDFM2tQ/VknmIYvq8vvI4vVmXrK3LxBDWeYpe9J6y55sPGZTJRVB20T9JAdh0bJqgNgvZaedY783\nmEE1tf/PG4G3wdWOEs57j82myOfzLFu2jOnTp3PNNdcUl+/Zs6f4+ic/+QmzZs0yrtPZzxTRBEKy\nMj6FtSuC7ytyhS0vLNky0YUs2l9ZPQpggKGF4cn/U97W0khCIdpq4rWrLCEbSwLiBbGJtPaEKivJ\ntuNOEhUPFsUWGT/55JM8+OCDnH766bS3twNw++2389BDD7Fjxw5yuRyTJk3im9/8pnXd3lSaxWHR\nkiHO0vciGUTHfslG18kyLILvo0bIsmVRomTQR8pgYWFAJeTisDXCtMNCpjcj3Y3NdTRcWBYexCZR\ncbEekT0hkk1U7Lrzr8YVG4znzZvHsWPHKpZfeOGFce0ynFRDpAVDrGV2hSmQy+oKAWSgAvDBZcE2\nBPcJcj9ZZ19ABDCDGopRQe04Ek8CwpAeEGvtCZuoOJNWqZ6bIhYFo2W/DKPjKEAOAtcWyKIysmWy\nKNnbL0SDMkQEc1AJ2xrGdky/wkIYooFYNzQ/uO+oIFbaE7plnrIoWKuBD2MVfD0ZRscmz82TKSqQ\noTzTQgbkQjn3UAY7MHuKDOgYZQtf0AMY4oNwYVlyIBbaE6qoWKU0wnmgDvpIXCZfsuruLvo55pNo\nMEjhtbhDr7Kc/AISrQ/W7ZUxvYhF7QnuXwURUHdMyeTv8AoDP5cK2xZdnrYn1TGUddBBNFsiLIht\nJbQnMFxm0hGXRjhXWQMnMrZ5ioftcGmfotgVleXsIuRg3epy9lGy1wZQ5yjbRMtBVSN6dgV90xuP\n7iZmA2HZcpMMG2XWTGBdaHvCL9uo2AK0gy2TAgYAjLUTzftla1X4oW1pV6iAXF4uPiCrlruAMph7\nyyolHTH7ZRP5h4UwxA9i1a+wSPaEbVQskgVovRzjgT76DgYAjI1kktKmWyaR6WAQ05Q3iAZkqIyG\nTdsl/HyWUPYUBc7Vlq31Ui0IF5ZHA7FN27TyA9Y0Kq7i4JDIMnjwhEh/+MMf+NSnPlV8//LLL/Pl\nL3+Z1157jZ///OcMHTqUyZMn88ADDzBq1ChpPTXrGRtNNm17d9adTL76/NGCiX8M5oNCQHyBmfSq\ni+qSbe9vl+4iNfGUy/Zn6LMmIX/bbCPhakbDLkAs67Dz9iEqZ5xTDOZAdRQppzFCPu2009i+fTvb\nt29n69atjBgxgksvvZQFCxbw29/+lueee44pU6awfPlyZT01FxkbPTnJRSTsX2bpMcv8Y1U50Xvh\n8+8MMi1E5fzLC+XtrQuvTZ500XJxnwLgVTNyjnJDML0BhYGwbJ1JxoSoba5BXCZdVCwrG1QtRcoh\ntGHDBiZPnszEiROZOHFicfncuXP50Y9+pNy25mAcWqZA1dFe4h377YqgTDv0RO9NgBzch78ciMGr\nsy5ADWWvbWAO5bL9KwAZBtSuI3AXEIbotoSsrA2ITfYhktWk8bYWxQDVD37wAz796U9XLP/Od77D\nFVdcodx2YMHYwusF9IC2jI7D+Meisi6BrGqLCtZeO8EcyhAOzBXtSsjasLFhwkJYtS4uEJtG7Uad\ndq468xRRcNoyKTb9tvCn06FDh/jZz37GHXfcUbb8tttuY+jQoUJI+1UzMFYFrMqMijC2hE4hBoIE\nQanrOKsWkHXrTNrql2swxy0bAINZB1iaQWz81A4bpdHIDSPJ9T//7MKfp1v/R1zukUceYfbs2cUp\nggG++93vsnbtWh599FHt7mu2Ay9W+U8uA6/MpDOv8F4x05fBhSGcON7Qc9TtQ9XBB6VOPpveeK/D\nyxZ4cStMu0w+u+oYytaJOuq88kHZZE2I2yA//5xExX6ZjtYLGQW/oS9SdT300ENlVsS6dev4yle+\nwsMPP8zw4cO12w9cGIc5GWw6EAzL2qQZmfh+LoAcJnLzyxbKUA7AasM5yr5NP6uraFhW3qTdpvnE\nwbLawR2minke4zTr7bffZsOGDVx66aXFZf/8z//MwYMH6ejooL29nc997nPKOmrGphDJm0ozFvl9\nEQMLI0xnHtj7x2BnWUBlpoWsvH9dYTu1zWDqKYskgosLW8MV6E1vNrqbV1wgduUTB2UdFessCheD\nRGpAJ5xwAvv2lT+i5qWXXrKqo6ZhLFTcqWuSUXlBqTrzVOlu4vLhgazan84rrgaU/UqDnRE3hAvr\nqgtiU3vCmVLWAWesgfqkj5pVhDu0KhXIxq4w3d7UsigsD2dbqOoMKoyvnAbZtruWQRxbVBzGQzbU\nQOkf1GnwwThs7mSIjgxV1KEanVdYbwZaF0BWbeNfb9NhlHYwh2lf1BuXaxDbKri91Ui7MAoB6LSl\ntVVTAwbGwi/R1VBOC9lEx66AbLIv2T6D27iGMoTr8ItLYdoS9bjIMia87YIy76QNb08oZXtduBqd\nN8hVkzAO9bPF5i5t8lPMQXRsorApb6ptdRepyT6jQLlacA7uLw4Ie+Xk6+x+jbgCsa68cVQctuMu\nk7UGXgdeCqQaCKLrzDMZYGHaoScr6+0XxJkWqu3ClhMpCJCoHYCuAB/110dpfXQQh9mvbt9KxRG5\n1kq0nPBDlTSZAAAgAElEQVSTPlIP4zeAcbYb6VLRIkwuH2afwVQ32xFv4rS16EAurFNPZAT6bArT\ncjqlwcpICsRRytp22hn/WrPNwQ+bsy9QLeUYu1JN2hROFaXXWMEOmw4RkygmSoeerKzp/m0AFca+\nSFq27Y4DxHHZExX7CYBYO3G8SDZZFDIlf99NnQY+jKv5pVt4x7adeaJtZMviArJtRJd2KMfxmaoJ\nYpP9h/4OksiuGORKvU2hk9UoPNtZ3UzqUVgeUZ4mDXYT9ATl2rIw2V5WHqJbGK4UBk4uPFobEJtu\nb5s9oYyKVbLtuLPJrvBXnXC0HOVadaGBHxnLZPvzzLT32GF0LJJNxBRHhOxtbwu1pC2MsPtOAsSu\njpFVPWGi1pDQDauBnsAxoGDs5M4axkOL8USMYleopANy2BuD6b7jBrN/H1HaqS8TP4irHhVnfm4i\nig3Gu3fv5txzz2XGjBnMnDmTe+65B4D9+/fT0dHBlClTWLBgAX196fYVoyp40ruIjm1k8/j2yvXx\nRMmi7V2A0xXkzfOL3XR82paPOotchVRBR9w+b+YjFxUbjOvq6rj77rv57W9/y1NPPcXXv/51fv/7\n37NixQo6OjrYuXMn5513HitWrIinAXF8yaa9yBH37bIzD+IHskk9NhIBWvfnct9m5cKD2OrBrg5u\nCkGFHvocJYuiypZGGPWOGGX0F5dig3FzczNtbW0AjBw5kmnTpvH666+zZs0alixZAsCSJUv46U9/\nGlcTSory5TuwKmyjY5FqBchpz6CQyS61zT2Iw9oTJnVZjQINc62YTDCUSauqeMZdXV1s376duXPn\n0t3dTVNTYaLgpqYmurvNbXknBr5JXrGLk8hxdGy3bXJA9uqqFSjbp7dVB8Su2hNURVScpEVhoIHe\naedX7KltBw8eZNGiRaxcuZIPfOADZetyuRy5XE643Xrf69nA1PiaGF4WqXLBNDfbUXkgTnWzTTWT\npbyZ1GWS+hasD9KT1uaXvZ8brUPTfv6QlEXFKaLii8DWpBsRg2KNjA8fPsyiRYtYvHgxCxcuBArR\n8N69ewHYs2cP48aJBzt3+P5SBWLVSen4Z1kc0XFUhWlTmqLkcGl58WWWRJHrzl5jxRwx64ZCT6Wc\nD2lQX18fl112GdOmTWP69Ok8/fTT1skKscE4n8+zbNkypk+fzjXXXFNcfskll7B69WoAVq9eXYR0\nqlWln2suvWPV8ih2RaGMWepbsN7azDOODuK0RMWxWBQDyBc27S4W6fOf/zx/8zd/w+9//3uef/55\npk6dap2sEBuMn3zySR588EE2btxIe3s77e3trFu3jptuuon169czZcoUHnvsMW666aZQ9cf+qynM\n6CTNOl1HXjUVFciFcuEis2pCOVq6XPTI0/ZRUnEf+1gVod8l6dF3UXTgwAGeeOIJli5dCsDxxx/P\nqFGjrJMVYvOM582bx7Fjx4TrNmzY4HRfzh5M6mK4tOMZ4UQ+rY13bOsp225n6yMH9+HJpa/sAvQu\nUvpc3PAghrxikeL0i0PMA15L6uzsZOzYsVx55ZU899xzzJ49m6997WvWyQoDagQeKO6wLjMnYgzL\now6gsJEuaqtmlBYlb9h1znESudWu64tkUag0QADqUkeOHGHbtm187nOfY9u2bZxwwgkVloQqWcFT\nzU8UpJSriYGi1BXYTpdVIZJpdCzfXh7lqrIrdNvq2hhFyXnLbkAcZ1Qcu0UxSIErO3+3bXqLbZsO\nSrebMGECEyZM4MwzzwTgsssuY/ny5TQ3N7N3716am5uVyQqeBlxknIgcn7zVjI5dKpU+pqFsOiXj\n+H4S/c7D+rU17PPa6Iz5H+CqW8YX/4Jqbm5m4sSJ7Ny5EyjYsDNmzODiiy+2SlYY2JFxVIX1f+N4\nkkhEVSM6LpR1GyFXQ9WcD8RGYaNipxaFg9kKB4NWrVrFZz7zGQ4dOsTkyZN54IEHOHr0KJdffjn3\n338/LS0t/PCHP1TWkcE4rLqBJsOyKbAqomqgAjlMip5KYeyJNOVhZwqn1tZWnnnmmYrlNskKmU0R\n1AC4w4e56F1Fc6V92eciV1uuQZyEnLfJxfk/SOwL18oiY1dy2VmIOBKNOzp2aVeUtklnlBzHjcJV\npx24syicagAEKipV61emTFlkDG4GeESU64sorp/EcY1iq6bSNKQ77mhb6xfHHcUOcIC7VAbjuKS5\nCELPKRuzTOyKWgZyXCB2GRWbKlHbJOpUm5kqNHhhXAN3bNOLzfZx7WnP4U3T/uM8VrK6E8ktFilF\nM7UNBmWesU4pS1Oz8WDDDoXWecdR6k7KQ44TZq47P8MqyblOrJXCYCjpqV4HV2Ts+mdSFjmEUrWj\nvCgTGkXfdzpAbaQUAnIwaXDBOOWqZmSTNGiqAeRaSK8LytZySoUyiDtRBmOXSvCkdH0RV+Ond5yg\njFq36Y0m7HGK+qgnk+2dZlLEeG7X8vSZLpXBWKQqQTVsRoXt8+jiVPRUOffRa61Fw5kywWDowHM8\nGMOqvmDnX4i2hO0oS7puW7nq2KsmiF1NQZqpJN0jl+JU0tdCFhlnkiotWQLVVgbRCMosh9DKYJwp\nslzBK7rPO3jtiZpKa8skVAbjTKlS+DS02gdxTWZSZHKmge8ZZ6o52frHAwHEmZKXbqBT3Moi40yp\nlPlTN2oPxDXhSWcDmqouKYwvvPBCOjs7q9mWTETz/gbaz1wdaGsRxJkyySSF8dKlS7ngggu47bbb\nOHz4cDXbFFlZEvnAkQy4cYHY1WCPmoh+M6VKUs/4k5/8JBdeeCFf/vKXmTNnDosXLy4+ajqXy3Ht\ntddWrZGZMvk1mCLiVH7WLNgR6ujRo8yZM4cJEybws5/9jC1btvBP//RPHD58mOOPP5577723+ARp\nkZQdeHV1dYwcOZL33nuPt956iyFDasNibkrRLGuZoknUkddHQ+KQ6qVeGR33Ue8kOk7DZ61QIwMS\nyFEHfaxcuZLp06fz1ltvAXDDDTfwH//xH1xwwQU88sgj3HDDDWzcuFG6vRTG69at49prr+Xiiy9m\n+/btjBgxIlJDM2WylSqjIi5IuYJopsGl1157jbVr1/LFL36R//zP/wRg/PjxHDhQ6APq6+vjpJNO\nUtYhhfFtt93G//zP/zBjxozQDVy6dCm/+MUvGDduHC+88AIAt9xyC9/+9rcZO3YsAMuXL+djH/tY\n6H0MNOmeEq1S0s/wcimT1LZURo0GqgngN5FlVFjoX/7lX/jKV77Cn//85+KyFStWMG/ePL7whS9w\n7NgxfvOb3yjrkPoOjz/+eCQQA1x55ZWsW7eubJnnN2/fvp3t27dnIM5UIZsc4z4aUvnA00yDRz//\n+c8ZN24c7e3t5PP54vJly5Zxzz338Oqrr3L33XezdOlSZT3SyNjrrIuis88+m66urorl/gZnyuRX\nWLDWapTsVw+NAy49sZYkO/f2bNrJnk0vSbf79a9/zZo1a1i7di3vvfcef/7zn1m8eDFbtmxhw4YN\nAFx22WVcddVVyv0n0iO3atUqWltbWbZsGX19Kf+5lqlqyiLcTGnU+PlTOOOWi4p/Qd1+++3s3r2b\nzs5OfvCDH/DXf/3XfP/73+eUU05h8+bNADz22GNMmTJFuZ+qw/jqq6+ms7OTHTt2MH78eK677jph\nufW+vxer2cBMRZkOD0166kFPgxnmUfoaak0vUs6HtMlzFb71rW9xww030NbWxpe+9CW+9a1vKber\n+twU48aNK76+6qqruPjii4XlOvzbxNwmK7mcGzlhpQWi4A6kLuwK0w42XXrboFTEtLeT0M9pPJXy\ny3BD+N051znnnMM555wDwJw5c3j66aeNt616ZLxnz57i65/85CfMmjUr3h2Ggacr4AaTGwL1vm+Q\n/CACpl0HV7zAdVG/64g2LRFymm52mdKvWCPjK664gs2bN7Nv3z4mTpzIrbfeyqZNm9ixYwe5XI5J\nkybxzW9+M84mVFcJRs2u09qqNYNVXOCMGiHHnX5mU7/os4Rq32jKHylmE8UGtx2ASvrmGSuMH3ro\noYpluvSOTNVR0ideoQ3xRrDVyLBwbVW4zKh4vzH8cxarqabGbD4ZGGxTaKZ8TEStdcJEAXq1rIQo\n+3FjwSR/0zNW2F92A6gfJUkNLhiHkQrgTVVrRSiFBUGcFkUSgzTS4iHHrZq6mWcAr1D2pI8Uy7Tz\nLolh0GFAnyQUw1oWJt5sWKuiJoZFDyIl/Stm8EbG1b4zh8ikiEuqk84kKq41EPvbkEQ7bI+X6OYq\nnr0uZniofvmFOX9TbhMmrcEL47hleeK5/omZ9F3erzSA2C/b9pgcy6SfnyZTxU0/swdSqwzGYA5O\n1YlchZPchUVR7ag4bSD2VG0gy7Z3fdO0vqnHHa1m8DdWBuOgUnLypCmy9TRQQOwpDiC7kqlV4Vwu\nAo7MjgilrAMvrGwyKarsF4eJwnRR8UADsSfbjj1dp5uqM0+2bZSOvKwT0J2Sng88i4xVCvvdxOAX\nx5lF4drvrBUQe0pre8NGx8HzKZJvbBp0pOQXZS0rg3EKFW0whXtv0mbbtIJNJ5fzfYTxjhNVZiuk\nQhmMTZVg513UqLga9kScaWN91Ff8xbOf5CZgqtbN0qkyiDvVgPOMy54M7YekbHnc0vjFLlPakgKE\nu+kvbSJwcdmo/qn3WaLOaeHKOxbNVWHic/eOGEXDOweK7yvmqVBN/BN2XY0r6fTEAREZq5+5qlGY\nu7vrZHifTIBUjai4WiB2He26qs/sgajh7QrXSqX9kclKNQvjWKaFkEXSpttYKmzHnbic3cXoAhRR\nJ+GpxlzLcU9mFBbINt5+VdLcXM/BkrZfqDWgmoVxVeVoNitdSlvYqNi2086FTxwGBnF7vnHs1wWQ\nXW9nKm1WhUphcoojwLUp858zGDuV4xMqrfMohBkskZaf0UkA2fZXSNjo2PqzpXTKzEi2YwT1Hao3\n+gvqvffeY+7cubS1tTF9+nRuvvnm4rpVq1Yxbdo0Zs6cyY033qjc/4DrwItdIf0RXcddGqLiuECc\nNnltsunsM+k0Uw3AkHXopWrQRsTn1w1WDR8+nI0bNzJixAiOHDnCvHnz+NWvfsXhw4dZs2YNzz//\nPHV1dbz55pvKemoqMnbuE0eNZGNMd4tjUvQoILZNXUtTNCyTbRvjipDFU6WaRce67SJZFX4lNHd3\nyqcML2rEiBEAHDp0iKNHj9LQ0MA3vvENbr75Zurq6gAYO3asso6agnFomfhaUTsZLE7yuKNi4T4j\ngthUtQDhoGzabHJTcpkZElTwPIhsZcWZPz+IfOBjx47R1tZGU1MT5557LjNmzGDnzp08/vjjnHXW\nWcyfP59nn31WWcfAtSni8LUcWRQ6uY6KqwHiOAEsqjuOn/Y29oXOtpDZD3HYFcG2BOvS5hz7ZWpV\n+PON/dvI8pBrOD/5yOZfc+TxXyvLDBkyhB07dnDgwAEuuOACNm3axJEjR+jt7eWpp57imWee4fLL\nL+fll1+W1jFwYRy3HEUULqNi+8l80gNil22PPvDDDIxhnx5iA2TTgSCRZArKJqDbwf5S6k0f2Cc5\n32dcVPjz9H/fJa1j1KhRXHTRRTz77LNMmDCBSy+9FIAzzzyTIUOG0NPTQ2OjODobUDZFYukxiv3a\njrgLAjAqiG3zXGXtkNURJa0rrlQ3F/W6GPQSp3+sa4cz7zjuXOABkGu8b98++voKN8x3332X9evX\n097ezsKFC3nssccA2LlzJ4cOHZKCGAZzZGyblB7D7FWx55nGDGJbJeElB/dpl0FhZluoIuQwGRYm\nch4d+5XSyDWt2rNnD0uWLOHYsWMcO3aMxYsXc9555/FXf/VXLF26lFmzZjF06FC+973vKevJ5fP5\nfJXabKxcLscdvvfj+v/7eeh/7eUlauelMIGuCYyDwJVsY5vO5jIqDusTx9E5lcYOPVsrw6S8yrKQ\nbS+Dsah8cJkIxsE2BLfxe8cVvrHfquiRLIdyq8Jkmx7zst39y1+X7M57/YZv2Y1AVIzlcjl4/T2z\nwicNj7w/kWo+MtYmiMdtXYSsXwdik21ky2y2j7p/l+WrKdtcY5PyYSLkKP5x1OjYuCPPVedb2jvx\n9g1LdPcDyjOOLIcWRdTZ2SpTmKL5xFGjYXMPNZkhz2Fl294o+diufX3Qp7rpvOMyDQD/tpYVK4yX\nLl1KU1MTs2bNKi7bv38/HR0dTJkyhQULFhSNb6eyOalsT8AQkwm5sCeCqiaITRQXgHtoFP7FIdPP\nYFLOFZBNt1ftW7WNsiPP1rKz+Vo0ZZMaEp2kYoXxlVdeybp168qWrVixgo6ODnbu3Ml5553HihUr\nlHWMU64NqTiuZUVUrJJLeyAJELuAsAy4KuiqtokKaxsoq9dHB7LJLyLbz1uV6DiLsq0VK4zPPvts\nGhrKT8g1a9awZMkSAJYsWcJPf/pT63pDjb0IGy1HjAJsR9uFtSdcgtgs8gsP4WpEuS724eJmlBSQ\nnUXHLqSrPwM3kIBn3N3dTVNTgXBNTU10d7vIIg+ZYxz2J5aqHgvp7AkXmRMm+9XVH6ZMUHHDN679\nu4iS4wKyvk3y79k4Og6TXaRSmsG7z/AvJiWaTZHL5QopJQKt7/9/AjC1/89aCVz3/igjzBwUKtmA\nWLYvWzDYlvEr6Uefy+Rvl2k2glk2hTynWJZpYZtlodpWl12hap8ys8JGcWRhBPQisNV9tYmr6jBu\nampi7969NDc3s2fPHsaNE7vCHf3/nXvGNj+ZTCwKQ6/YttOusnw0ayJKNGwD4bQCWCZbMOugrFov\ne76eKZDDpLup0u2Cc1aUyWTuiajDowWDS5oaS7nGxWWB3Uyl/HLcEKEJaVLVbYpLLrmE1atXA7B6\n9WoWLlzodgein0G6n0Yx8EP1M3AggjgOC6KXeu2fS9l8hijHTfR9mFoWUTv0VKlukbzjBK6xgaZY\nI+MrrriCzZs3s2/fPiZOnMiXv/xlbrrpJi6//HLuv/9+Wlpa+OEPfxi6/kjpL7qTJ8ao2C8Tnzgo\nFyB2CeEoigpU1fZRhhqDPlI2iZJtbAvTgSiqej35I2TdrG5S2c7MhqCsrt40ST33e+yKFcYPPfSQ\ncPmGDVX4YRG1Qy+C/NGGzp7QqSKSiRnEYQYamKraj0IX7c8G0C6grLMtTHxkkX8cLKMDrArIfrvC\n2jvWWRWm4E0roKuowTUCT8QQGw/ZICqO055IGsRhrIi4LIWwCtMe088d5tiafk8m371tuptM70vO\n88gpapb3cNUv31jGHySsAQFj67Q2G4sigqLYE65BrErR0qVv2UI4bQCWybadJsdBd5zFy6sHZFlZ\n2+H62ukCTE+XzEsuqmZgHJqPptaDruPPMipW2RNxgVg2L0LUaNhEtQJgmWzabwpl2XLZd2dSTxgg\nm+wHFJ15UfOILTvVE5uXPGHV/KxtZVKdNKYWhQX1TXufbbIZooDYpH7dck82EI4i0aPPXah+aLjO\nOyh9Jp2/rPOUdV5yZZqaWeqbbQ6yKt3NuDPPk8uOvLQp4bYOLBh7UnEkauqbpKwsKlb5xHGCOGw0\nbALhsACOC7w2+7KBtP9zquBnAmVTIBeWizMtVEDWQdUUyNLOPFlmhSfTnGMVoAd5J17N2BSerOwK\n20jZdFvM7Qm/rPI/YwCxys80+elta0P0Haov+0uDwrbJ5LOrjqHcnjC3LXTnSBT/uKxeG//YgS1h\n4xs76s5JpWoOxp5imWJP1xFhmfpm6hObpJNFAXE1IZw2+Opk215TKEv3Z2EbxQ1kf/2ydlllVth2\n5KV5nooEVLMw9mRk9ruwLSw77aKAWH+BVXbUqSIvmVxB2DWAD+xrsP5zIZvPoTs2YaPkymXugSyr\nX5Zdoe0biTES9lSViDjkREG7d+/m3HPPZcaMGcycOZN77rmnbP1dd93FkCFD2L9f7cEMHM/Y5C7r\nlXFxV8fcJ/ZLFwWbgNi0TlU0bNMGYd0RwesKoCb1jRojfzadTN7n03nMus4+lZ8s7sSr7PRz4SGr\nOvSsFMU7DuEJn0T58/DSqLq6Ou6++27a2to4ePAgs2fPpqOjg2nTprF7927Wr1/PySefrK2n5iPj\nCnmcsYGzxTLb8ftROuzCglhnS8hkEgmHiYDjimSrsX/TaNkkUhbWb3gjlf0aCrbBpO5ge2KLjj3Z\nXDP99dRSeltzczNtbW0AjBw5kmnTpvGnP/0JgGuvvZY777zTqJ6BExnLZPKlGkbFUewJFYjNckfN\nQSySDsIqhYFv2hVso0n07D8OsohZFSnLomRZCpws/U01z4QqQg6Wlc1fIcuuKEoXHYvKyeSVqbU0\nOIm6urrYvn07c+fO5eGHH2bChAmcfvrpRtsOfBh7CloUEXqB4wSxiW+YNgjXAnx18n8GGzC7hnIa\ngexJmupGYJmJVVFL8O3cBF2btMUOHjzIZZddxsqVKxkyZAi3334769evL67P5/PK7QcPjGVSRcUa\neyJuEEeJhuOGsBMAV+PR6GPet97EBsxRoWwSJZv4yFGArJN2IiGT6LgW4LtXsvwv5sO0+aX3m26t\nKHL48GEWLVrEZz/7WRYuXMgLL7xAV1cXra2tALz22mvMnj2bLVu2SOdwr2kYNwWhqXuvkqKM6URA\nOrkGsW00rIJwrFFwNaBrs28LQJuCWWdhyKAcJUoOjtgLQtsUyE7siuCyqBPP15Dy+TzLli1j+vTp\nXHPNNQDMmjWr7JFykyZNYuvWrYweLQdNTXbghc4xDsLZMCr2FMWeiAJiUYecLBoWgVjVuWTSOWXd\n8bVvWPlf2hRsn2EbTY+D6njKvgvR92b6vatsLNW55n9tk38s7MyzSTF1ETylSE8++SQPPvggGzdu\npL29nfb2dh555JGyMrLHy/lVU5FxbLmGhlGxp2qDWLV/0b79UkFYJyv41rr8n8EgcvaOjSxaNrEv\nwkbJtrZF1Ai52GaRXWESHYcc5uw9gint6W3z5s3j2LFjyjIvv/yytp6agrGVwtx1A2V09oQtiCu3\ntwNxNSBcdQDH+LRdxoTczgLMOhtDBWWVdRHWtogDyMZ2RS34wioN5Cd9uJJRRGz7E8erVDUQpF8i\ne8JlRBzWH5ZZEiI5gXBYAMcJ3LD7NQV18DMr4KyKllWesgjKoihZ1rkXJ5Bl+wHNU0Fk0bEHbNl7\nhQa6DV0TMFbKtb8kiIo96YDoAsTVhHAsAE4KvLYStdME0AZRs4mFIYuUTawLnW0h6tjzAxlK4NcB\nWdShp7QrokbHtR5dR1BNduCBZoSOzqKQRcWKTjsRQNMMYlXHnLYTyqZjSzNu34neFPzFIdvPojlG\nqg4/2fdj2sFn0rmn6ojrlZyvJh2EoMkqinC9FVVjnXguVPuRsV9Rn0jQLy8q1vnEpWV6ENtcKKJl\nLqJhbSRsGgVHha4LmNrWMTbEPvyfUxU1R4iWZZ6yjXVhaluocpFFEbKpf6zszDORIhr2OvHKljEw\n7Yqag7Ewrc0mSg4a0JJOO1Of2DWIqw5h0+g3jBLuECmTrC2mkHYE5jBQ1nXwmdgWJrnIIl9YB+QK\nybxgE4ImPbl8wvZIzdoUWplEyQa5kbUAYtlPXqUdYWJD2FgP1bISXCtMm02tDMUxtrEvRNZFMKdc\nZ1uY5iKXzvfSMlkONJSCFuMJtEysihqaJMilUh0Zax/HbfpFyryrwPpgVGzq2ZqA2NYfDu5HBmGR\nIkXCNlGwa+C6iEyiXsjBz6SLnE0iZu+YR4yUZdaFqW1hk2kRXG/SoSftzDOJjjUdd2nPNXahVMPY\nL21622jBawv7QgViVYedLYgTgbArAEeBb7V+AprsxwbYNnDWgVlhYaigrLMugl5ypU1RDuTCOnGm\nRQN9ZdvrgCyVynIwzbxI2raosmoGxn6VZVKYzrMqi4o1qhaITSwJpxA2AXAY+NZCWpKsjSaQNoWz\nKZgNoOwiStb5yCoPWQVkaXTsySQ69kM3SQAnnJaZGIxbWlr44Ac/yHHHHUddXR1btmyJXqkO0hK/\nShYVxwViV9GwNYTjAHAtwNdUotnIdPIfLx2YqwBl2yg5DJCL7dEBWRUBi9ZJXosyKgaiEoNxLpdj\n06ZNylmMlBLZErLXIo/DMYhdRMORIBwlCjYFsKsLIokIJMzQaFs468CsipYdQNkmSo4CZFWGhTRC\nBiczug3UtDZI2KbQTbYclPFsbSZRMZU9wHGC2DYajh3CcQM4bSPxXAyNtoGzKZgdQtkkShbZFn4f\nOQyQlTKJjk1fD3AlltqWy+U4//zzmTNnDvfdd1+4Sky8Y0VU7Ek3R3GcIBalLQVBLEyDkqVNqdKu\nTFK4egJ/JjJ4gm6qFbb9psdKdcxl+5N8v6JzQZcKp0qBE52//jKqR4KVUjwbypZXpLvpfq3a9AEN\nYOXytuGpI+3Zs4fx48fz5ptv0tHRwapVqzj77LMLjcrlOB84ob/sR4EOCpFx2YTyjZRHvKLXTQi9\nYlN7wiWIbaNhq0g4ShRsE/3GAVrZExaiqDmGOm2sDh1UVFkZov1IRvYFsy+CmRfBdDV/NOv3gMtf\n91Ys9+oRbePV6W1X3KZ//ophPZSiW/9rz2/YH1gueO15xq8D64Hf9K9+G9iA/a/soHK5HIw3rGNP\nLvL+hG1ICsZ+3XrrrYwcOZLrrrsOKByYOyjkGXs30CYMYexf3xQoC2VesQsQpxbCrgAcBb5xQNal\nogLbFM5hwSyrXwBmGygH7YV6IWjlQBZtowJy0Tv2oOu9hgKQg8uDr/vLdvcUYNxNieNvADcyMGCc\niE3xzjvv8NZbbwHw9ttv88tf/pJZs2aZV+CHK1Se7JoOvTAg9v/0Cwvi4M/H4GgrYztC9nNaZ0OY\n/KQO83N9r+Qv7ZK127TtpsdKd9xl35msbsE5IbIu/OdW0LaQ9Yf4z+0K+0FwjussCwj0zcisi8yq\nSKYDr7u7m0984hMAHDlyhM985jMsWLAgWqXBpAyRPUH5iWEDYtk2YaLh0JFwmChYFwHbRr5xQtbF\niDu8VocAABJ9SURBVL4wEwKJJPqcukg6eCxFkW0wB9cvVaefqMMv0Nkn6+RTdfDJOveC2RbFbAlf\nHbJOPf82jKCUXQGVnXnB9Ihgh513jAZBJ14qbIqggjaF5zYUbQqVRRH0ijX2hCmIZR0dpWXyaNiv\nYCRcIVMIVwPALsCb5jkqooLbxubQWRqqaFDUTgNfOax1IfKFg/aDf3uRZWFlV3hWBZRsCYFV4bcp\n6P/v1KY43rCOI+U2xdKlS/nFL37BuHHjeOGFFwC4/vrr+fnPf87QoUOZPHkyDzzwAKNGqRMFamai\nIGlamx/AnpowsieqCWKRJVEmlR3hl+wnre6nsMnP6bA2g2iSoFqYLChqu23sDd3xV31/ojYZ2BdB\n20tnXRTLaX4Jyq4P3XUitCug8noNrk+5rrzyStatW1e2bMGCBfz2t7/lueeeY8qUKSxfvlxbT00N\nhy6LioMSQVljT4A5iEX+sCmE/RJCuOw9lVJ5wCrpIuAwkW+1Aav6jHFesKLPaRJJ+4+pLHLWDZX2\nj0ITtcnfjhD2hT8/2W87+POSy/OQPTtCMEkQ9WWWRaH5FnaF99ovRW6xF5SlaeDH2WefTVdXV9my\njo6O4uu5c+fyox/9SFtPTcG4TDIoS6JiKETFfrhWE8RVg7BLALsCb1xDWaM+3sdWtoAOHmsRnFVg\nlvnLIm85JJT9frLKS/YDGcoHiIgmGBJNKlT2MNMgcP15x5LBNU3U5rDo73znO1xxxRXacrULY08G\nkbLfngA1XGUgThzCKvtBJVP41sKMbC6la7MprG0ArYNzFDAHoeyvQwFl0yi5PgBbUceeH8ilpvb4\nAN4/XJoDpbkrPImiY9m6auvYJshvCrXpbbfdxtChQ/n0pz+tLVv7MPbk5RUHOvJUPrEKxCpgxwLh\nagO4FicE2ke4OSbCqBozu6ksDRMw20bLIaGssy1kloW3TRDIIHmytCo6roaOyFbM7//zdKtRdd/9\n7ndZu3Ytjz76qFH52oOxKHNCoqBPrAOxTTRcdQjrOt50soGvywvB9Yg9l/W5mDzIk+k8FSCGsypq\nloHZNlpWQFnmJ+uiZL90QAbE/rEnUQTcKFmecq1bt46vfOUrbN68meHDhxttUzMwbpLB11seiIr9\nw52DMPVD1tSWEEXDxhCOIwrWAbhaM7HV2jwUfunabgPrsJMIgR7OYcFsAWWZn2wTJfsl6tQrbFPe\noVeh4Fwy+yld9ymF8hVXXMHmzZvZt28fEydO5NZbb2X58uUcOnSo2JH30Y9+lHvvvVdZT03kGZ+B\nIL/41P7CChiLOuyigNgoGnYB4TAAjhO+tQzcuBQmqjaxOHQZG7IMDVF7RPsL1u/fzpen7M9R9jr5\nRHnJwRzjivxivGS48hzkivxj/9Dn7sD7wP9tPaUh0U7zjDGtI57h0KmPjIWPW2r0/bcAsScdiENF\nwzYQriaAk5wEKO0Qj+I/iz6brj6T6FkXNdtEzCpv2R8tayJlXZSs8pGhdI15WRaeyjr0BIeiqMBx\nO4m4UtuSTZhLPYzLZOATBxVMYQuCOEw07AzCcQC4GhMAudg+DTL5DDbAltUnq8MWzrZgDkLZvw8/\nlDX2hayDT6QgkAGCaW9QCn6CTw8RymtzGjqRY1SqYVwWFYsmFtFExTprQgTiyBAOGwXLABxl2LNq\nf3FuF4dMHm8Uh1z4yqZRtA7OqqhZBGZVtOzVL4KyV77/HD/g94P76wl28Pm9ZGuNQB0de16xrzNv\nID7xI9UwFio4RaYliP22hC4aDg3hKACOCl9bgMYB3LhH6cVRf1jA20bDqu1UucVgPrGQLZj9UPbq\n8kfLAvuiWMdQjOSfZMh7XzaZlgdkUSfdaF9b/a8HmGoCxmVzGIO0I0QE4mDqmsobNoKwTRQcvOBs\no1/X8I0K3rTPNRFFpp/NFNphIK2b9U0FZ1nUbAJmk2jZEZRlKtoVIhuyhyqluL0e9w6UqgkYA5Xz\noEpS2WxA7ATC1QSwKUzDQjdp2EqT7i0U9xmtOkYmoLaBtCs4hwFzMFouk9hT1lkXfh+5vNk9pXQ3\nkV2xn1KKW08hOHu9p4CAN2RNrEGlHsZls7X5gazMnhB31Km84QoQ20DYxIKIC75hwBsHdF2A1IWS\nBHoUUJvYFroyMjiLomYVmE2jZQKesmWUHHxwKlAOZL814dkTNToIxESphzFQ/tOlkbKePZFPDJVD\nm4MgjgXCJgCOAl8b8LoCblogW02Zfmabq0f2faggHQbQNiP0vP0HwWwSLRtC2T+CD8qfRi1TAwfK\n2+z11PlAHF96W3JKLYzHBReM9v1BMSqW+cTBjjq/P9xLvR2E4wKwK/iGBW8qQBvnJSXMUncn3fEz\nubpsIa2zLmTrTaJmFZh1UPY85aCfHMJL7h3RV25XNFGyKmDAduKlFsaguJRGw/unikHcSUtZNGwN\nYVsAu4KvCXjDQDc24NZCXOKqjSGhHgXWppDWRc82cFaBWac3+7fZN6y4jwM0cID+eS+GlqbprJye\ns5dJdJVV1zeil0m8UgDy6MBfbCDOBn0o1dRI4UTx/poK//0g3sXkstQ1P4iDlkQZhIMAhtIX7T+J\nddGv7cQ+OvDaQtcJcGsBrknJ5thYgFv1vcmuTBNIqwBtCmcnKtkXKigDdFKwMPxQ7hwB9SP6aN5/\noBQdvxRHO9Oh1MO4KN+d8f1TC3fVXZxS1lnXRz1dTLKHsCgKtgWwDLCuwBsJuEmDNtmUIbGkD/KK\nKNNjrYG2Lah18yrLAC1bLuvAM5HX0RaIloNQLhRtZDK7ipt20lIcsectbx59oNye3A9N/ufkDRCl\nH8Z+n9gXFQdB7EHYD2JjCIsAHAa+KvCanMyhgRsnbNMIUhdy8bmiAF33nSlgLTtPglezLoqWRclx\njbwMQLlvTC/1Q/vYxWQa6aElUHwXk5nMLvZO7I+O/SygcIReiKmpSSj9MIaSRdEfFfvBW/CIy22J\nzkMtcgibAjgKfHXgtYKuS9AOVLAmpTDH0xTgIWBtGk3Lomib6FkkLxL2S/RAAB+Ug5189cUJhjqB\nApDr6S1Ex55VYTk/jbkyz1iqk6A8t7g/Ku6hUdhR90cml6JhUwibpq2FAa8xdKOcBGkAbNI2iGvF\nmYVh+n3poG0Ja100bQpoUzgHwSyB8oExzRwY0wAndpatKgRchY69Php4v/EVhgXGF2Q2RZV0OtB0\nKoV5i+cC82Bv6yi2MofttMltiRebC1+8yIoIAlgV/YpOOBl4jaAbBlhxg3agQdSVXB6XsGCPCm3V\nZ/C1SQVpE2tNBNmg/GD2ypf5ysN4hUn0jemld2ipc68FLz4GRkD7WTtKT5bugTP21+YDSmVK7eTy\n+c8D84C58OLEk4sQ7qOBLlrkABZFwLp0NZNJ4LXAtbmAXUI2A+rAlcsI3cbfVuxXFr4pJ63v/98Y\nKNvsW+9fN/V9RvX7ySUwd9FCJ+3sYDbP0vzcAfgV8DTkvu9qcvkHDEtfGcvk8onAeN26dVxzzTUc\nPXqUq666ihtvvLG8Ubkc770N20e0sZXZbKe9P3tiMr3U88qfJpVsCA/AKvjagFcKXRPoRYVsWsCa\nlnbUimIeXGKlqG0xgbZkH0FQywDtB3Uj5XAeE1geAPNkdpVBeeruV8h9KHkY65hm1IZqw/jo0aOc\ndtppbNiwgZNOOokzzzyThx56iGnTppUalcvxH/nr2EE7u5hc6pATAVgFX9mQZiFwdQASgfZZYI6k\nfDWAZrqPF4GpcTbEkbJ2VioKXJ+nYPi53ocK2IK6VJAeAxzcBC3zC+/9EbIHZw/MY4Ax73PyiZ2c\nwq5itPxvubscwfgOw9I3lu3PhGkmqrpnvGXLFk455RRaWloA+NSnPsXDDz9c0fCvHvpCyX54kUrP\n1w9eI+jKwGUSzcq23QxMNNheV0/cyiDnVtVsZ5Rz5jdUwlEEXtt9dEvqgfLrqR/aZddhE+zxvX0T\nOLoJds8vQXoM8Acqo+RmYMwwXmmcyitjp8LUApjhLsv2u5Up03SqOoxff/11Jk4sAWzChAk8/fTT\nFeUOXNNcaUEE84SVsJVBNsyJJ9PbIeoLqyiTBb4dcftqKWunmSpmbrGQq/NVBWTZvpqouC6PAByE\nI90lSO/x1esRyg/qIqSH8cqs5G/epkzTqeowLvwcMND/A6UvMwhW2Qnl4kSzuciSvigzDU6ZnnNx\nn5/BunU3Cdn1+UfgEZS50x6gi1F1f9T9f5L3642ZplHVYXzSSSexe/fu4vvdu3czYcKEsjKTJ09m\n1y43HzB+bUi6AYbK2ulWWTvd6uHQW7a2tjpqg1mn28iRI8vemzDNRFXvwDty5AinnXYajz76KCee\neCIf+chHQpndmTJlypQGuWJa1SPj448/nv/6r//iggsu4OjRoyxbtiwDcaZMmWpWrpiWykEfmTJl\nyjTYNCTpBgS1bt06pk6dyqmnnsodd5jm/VVfLS0tnH766bS3t/ORj3wk6eYUtXTpUpqampg1a1Zx\n2f79++no6GDKlCksWLCAvr6+BFtYkKidt9xyCxMmTKC9vZ329nbWrVuXYAsL3t+5557LjBkzmDlz\nJvfccw+QvuMpa2fajud7773H3LlzaWtrY/r06dx8881A+o5nYsqnSEeOHMlPnjw539nZmT906FC+\ntbU1/7vf/S7pZgnV0tKS7+npSboZFXr88cfz27Zty8+cObO47Prrr8/fcccd+Xw+n1+xYkX+xhtv\nTKp5RYnaecstt+TvuuuuBFtVrj179uS3b9+ez+fz+bfeeis/ZcqU/O9+97vUHU9ZO9N2PPP5fP7t\nt9/O5/P5/OHDh/Nz587NP/HEE6k7nkkpVZGxP3m6rq6umDydVuVT6PCcffbZNDSUP/BxzZo1LFmy\nBIAlS5bw05/+NImmlUnUTkjXMW1ubqatrQ0o9KBPmzaN119/PXXHU9ZOSNfxBBgxYgQAhw4d4ujR\nozQ0NKTueCalVMFYlDztnVRpUy6X4/zzz2fOnDncd999STdHqe7ubpqaCvmYTU1NdHend+6JVatW\n0drayrJly1L1c7Wrq4vt27czd+7cVB9Pr51nnXUWkL7jeezYMdra2mhqaipaK2k+ntVUqmDsKnm6\nGnryySfZvn07jzzyCF//+td54oknkm6SkXK5XGqP89VXX01nZyc7duxg/PjxXHfddUk3CYCDBw+y\naNEiVq5cyQc+8IGydWk6ngcPHuSyyy5j5cqVjBw5MpXHc8iQIezYsYPXXnuNxx9/nI0bN5atT9Px\nrLZSBWNXydPV0Pjx4wEYO3Ysn/jEJ9iyZUvCLZKrqamJvXsLE3vs2bOHceOiDKeNT+PGjStejFdd\ndVUqjunhw4dZtGgRixcvZuHChUA6j6fXzs9+9rPFdqbxeHoaNWoUF110EVu3bk3l8UxCqYLxnDlz\neOmll+jq6uLQoUP893//N5dccknSzarQO++8w1tvvQXA22+/zS9/+cuyrIC06ZJLLmH16tUArF69\nunixpk179pRmkPnJT36S+DHN5/MsW7aM6dOnc8011xSXp+14ytqZtuO5b9++olXy7rvvsn79etrb\n21N3PBNTot2HAq1duzY/ZcqU/OTJk/O333570s0R6uWXX863trbmW1tb8zNmzEhVOz/1qU/lx48f\nn6+rq8tPmDAh/53vfCff09OTP++88/KnnnpqvqOjI9/b25t0Myvaef/99+cXL16cnzVrVv7000/P\nf/zjH8/v3bs30TY+8cQT+Vwul29tbc23tbXl29ra8o888kjqjqeonWvXrk3d8Xz++efz7e3t+dbW\n1vysWbPyd955Zz6fz6fueCalbNBHpkyZMqVAqbIpMmXKlGmwKoNxpkyZMqVAGYwzZcqUKQXKYJwp\nU6ZMKVAG40yZMmVKgTIYZ8qUKVMKlME4U6q1e/duPvzhD9Pb2wtAb28vH/7wh3n11VcTblmmTG6V\nwThTqjVx4kSuvvpqbrrpJgBuuukm/vEf/5EPfehDCbcsUya3ygZ9ZEq9jhw5wuzZs7nyyiu5//77\n2bFjB8cdd1zSzcqUyamq/gy8TJlsdfzxx3PnnXdy4YUXsn79+gzEmQakMpsiU03okUce4cQTT+SF\nF15IuimZMsWiDMaZUq8dO3awYcMGfvOb33D33XcXp1vMlGkgKYNxplQrn89z9dVXs3LlSiZOnMj1\n11/PF77whaSblSmTc2UwzpRq3XfffbS0tHDeeecB8LnPfY7f//73NfNklUyZTJVlU2TKlClTCpRF\nxpkyZcqUAmUwzpQpU6YUKINxpkyZMqVAGYwzZcqUKQXKYJwpU6ZMKVAG40yZMmVKgTIYZ8qUKVMK\nlME4U6ZMmVKg/x81okGLZvT7lgAAAABJRU5ErkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0x7f6cdf7173d0>"
]
}
],
"prompt_number": 106
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Metody dalszego zwi\u0119kszenia wydajno\u015bci\n",
"--------------------------------------\n",
"\n",
"* Lepsze wykorzystanie bibliotek standardowych (SciPy, NumPy, ...)\n",
"* Zr\u00f3wnoleglenie oblicze\u0144 (Python clusters)\n",
"* PyPy - alternatywny interpreter Pythona\n",
"* Pyrex/Cython - automatyczna translacja do kodu w C\n",
"* Rozszerzenia w j\u0119zykach ni\u017cszego poziomu (C, C++, FORTRAN a nawet assembler)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"*Nawet je\u015bli optymalizacja okazuje si\u0119 konieczna, to wi\u0119kszo\u015b\u0107 logiki programu pozostaje w Pythonie. Optymalizacji wymagaj\u0105 jedynie sekcje krytyczne pod wzgl\u0119dem wydajno\u015bci - zazwyczaj nie wi\u0119cej ni\u017c kilka procent kodu.*"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Notes IPytona (notebook) \n",
"========================\n",
"\n",
"Interaktywne \u015brodowisko pozwalaj\u0105ce na tworzenie, testowanie i wykonanie kodu. \n",
"\n",
"Ale tak\u017ce na ...\n",
"\n",
"* tworzenie dokumentacji,\n",
"* sterowanie obliczeniami lub eksperymentami,\n",
"* analiz\u0119 danych,\n",
"* tworzenie ilustracji, wykres\u00f3w itp.\n",
"* komunikacj\u0119 z wsp\u00f3\u0142pracownikami,\n",
"* tworzenie prezentacji,\n",
"* tworzenie publikacji (w\u0142\u0105cznie z wzorami i literatur\u0105)."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Pe\u0142ne (niemal) \u015brodowisko s\u0142u\u017c\u0105ce do tworzenia *reprodukowalnych* prac naukowych."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Python (nie) do wszystkiego\n",
"===========================\n",
"\n",
"* Python jest j\u0119zykiem uniwersalnym\n",
"* J\u0119zyki maj\u0105 swoje \"specjalno\u015bci\"\n",
"* Notes pozwala miesza\u0107 j\u0119zyki zale\u017cnie od potrzeb (R, perl, bash, HTML, SVG, javascript, LaTeX, etc.)"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%lsmagic"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"json": [
"{\"cell\": {\"prun\": \"ExecutionMagics\", \"file\": \"Other\", \"!\": \"OSMagics\", \"capture\": \"ExecutionMagics\", \"timeit\": \"ExecutionMagics\", \"script\": \"ScriptMagics\", \"ruby\": \"Other\", \"system\": \"OSMagics\", \"perl\": \"Other\", \"HTML\": \"Other\", \"bash\": \"Other\", \"python\": \"Other\", \"SVG\": \"Other\", \"javascript\": \"DisplayMagics\", \"writefile\": \"OSMagics\", \"pypy\": \"Other\", \"python3\": \"Other\", \"latex\": \"DisplayMagics\", \"sx\": \"OSMagics\", \"svg\": \"DisplayMagics\", \"html\": \"DisplayMagics\", \"sh\": \"Other\", \"time\": \"ExecutionMagics\", \"debug\": \"ExecutionMagics\"}, \"line\": {\"load\": \"CodeMagics\", \"psource\": \"NamespaceMagics\", \"lsmagic\": \"BasicMagics\", \"logstate\": \"LoggingMagics\", \"logstart\": \"LoggingMagics\", \"popd\": \"OSMagics\", \"ed\": \"Other\", \"pycat\": \"OSMagics\", \"loadpy\": \"CodeMagics\", \"install_ext\": \"ExtensionMagics\", \"cd\": \"OSMagics\", \"pastebin\": \"CodeMagics\", \"clear\": \"KernelMagics\", \"colors\": \"BasicMagics\", \"prun\": \"ExecutionMagics\", \"pushd\": \"OSMagics\", \"rep\": \"Other\", \"config\": \"ConfigMagics\", \"dirs\": \"OSMagics\", \"time\": \"ExecutionMagics\", \"who_ls\": \"NamespaceMagics\", \"install_profiles\": \"DeprecatedMagics\", \"macro\": \"ExecutionMagics\", \"autocall\": \"AutoMagics\", \"alias\": \"OSMagics\", \"bookmark\": \"OSMagics\", \"connect_info\": \"KernelMagics\", \"rehashx\": \"OSMagics\", \"pprint\": \"BasicMagics\", \"system\": \"OSMagics\", \"whos\": \"NamespaceMagics\", \"hist\": \"Other\", \"install_default_config\": \"DeprecatedMagics\", \"logoff\": \"LoggingMagics\", \"env\": \"OSMagics\", \"qtconsole\": \"KernelMagics\", \"load_ext\": \"ExtensionMagics\", \"save\": \"CodeMagics\", \"tb\": \"ExecutionMagics\", \"store\": \"StoreMagics\", \"more\": \"KernelMagics\", \"profile\": \"BasicMagics\", \"doctest_mode\": \"KernelMagics\", \"pylab\": \"PylabMagics\", \"run\": \"ExecutionMagics\", \"reset_selective\": \"NamespaceMagics\", \"pfile\": \"NamespaceMagics\", \"pinfo2\": \"NamespaceMagics\", \"pdef\": \"NamespaceMagics\", \"killbgscripts\": \"ScriptMagics\", \"who\": \"NamespaceMagics\", \"precision\": \"BasicMagics\", \"matplotlib\": \"PylabMagics\", \"quickref\": \"BasicMagics\", \"pinfo\": \"NamespaceMagics\", \"pwd\": \"OSMagics\", \"psearch\": \"NamespaceMagics\", \"autosave\": \"KernelMagics\", \"less\": \"KernelMagics\", \"sc\": \"OSMagics\", \"automagic\": \"AutoMagics\", \"reset\": \"NamespaceMagics\", \"sx\": \"OSMagics\", \"magic\": \"BasicMagics\", \"dhist\": \"OSMagics\", \"timeit\": \"ExecutionMagics\", \"edit\": \"KernelMagics\", \"logstop\": \"LoggingMagics\", \"gui\": \"BasicMagics\", \"xdel\": \"NamespaceMagics\", \"xmode\": \"BasicMagics\", \"notebook\": \"BasicMagics\", \"pdb\": \"ExecutionMagics\", \"recall\": \"HistoryMagics\", \"unalias\": \"OSMagics\", \"unload_ext\": \"ExtensionMagics\", \"alias_magic\": \"BasicMagics\", \"reload_ext\": \"ExtensionMagics\", \"man\": \"KernelMagics\", \"rerun\": \"HistoryMagics\", \"debug\": \"ExecutionMagics\", \"logon\": \"LoggingMagics\", \"page\": \"BasicMagics\", \"pdoc\": \"NamespaceMagics\", \"history\": \"HistoryMagics\"}}"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 136,
"text": [
"Available line magics:\n",
"%alias %alias_magic %autocall %automagic %autosave %bookmark %cd %clear %colors %config %connect_info %debug %dhist %dirs %doctest_mode %ed %edit %env %gui %hist %history %install_default_config %install_ext %install_profiles %killbgscripts %less %load %load_ext %loadpy %logoff %logon %logstart %logstate %logstop %lsmagic %macro %magic %man %matplotlib %more %notebook %page %pastebin %pdb %pdef %pdoc %pfile %pinfo %pinfo2 %popd %pprint %precision %profile %prun %psearch %psource %pushd %pwd %pycat %pylab %qtconsole %quickref %recall %rehashx %reload_ext %rep %rerun %reset %reset_selective %run %save %sc %store %sx %system %tb %time %timeit %unalias %unload_ext %who %who_ls %whos %xdel %xmode\n",
"\n",
"Available cell magics:\n",
"%%! %%HTML %%SVG %%bash %%capture %%debug %%file %%html %%javascript %%latex %%perl %%prun %%pypy %%python %%python3 %%ruby %%script %%sh %%svg %%sx %%system %%time %%timeit %%writefile\n",
"\n",
"Automagic is ON, % prefix IS NOT needed for line magics."
]
}
],
"prompt_number": 136
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Wie\u017ca Babel czyli pomieszanie j\u0119zyk\u00f3w\n",
"-------------------------------------"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%ruby\n",
"puts \"Hello Ruby #{RUBY_VERSION}\""
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Hello Ruby 1.9.3\n"
]
}
],
"prompt_number": 132
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%bash\n",
"echo \"Jestem BASH ($BASH)\" "
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Jestem BASH (/bin/bash)\n"
]
}
],
"prompt_number": 133
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%perl\n",
"@numbers = (1, 2, 3, 4, 5, 6);\n",
"print $#numbers"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"5"
]
}
],
"prompt_number": 134
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%latex\n",
"\\begin{equation}\n",
"i\\hbar\\frac{\\partial}{\\partial t} \\Psi(\\mathbf{r},t) = \\left [ \\frac{-\\hbar^2}{2m}\\nabla^2 + V(\\mathbf{r},t)\\right ] \\Psi(\\mathbf{r},t)\n",
"\\end{equation}"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"latex": [
"\\begin{equation}\n",
"i\\hbar\\frac{\\partial}{\\partial t} \\Psi(\\mathbf{r},t) = \\left [ \\frac{-\\hbar^2}{2m}\\nabla^2 + V(\\mathbf{r},t)\\right ] \\Psi(\\mathbf{r},t)\n",
"\\end{equation}"
],
"metadata": {},
"output_type": "display_data",
"text": [
"<IPython.core.display.Latex at 0x7f6cdf86ab10>"
]
}
],
"prompt_number": 135
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Notes w innych j\u0119zykach\n",
"-----------------------\n",
"\n",
"* *Ca\u0142y* notes mo\u017ce by\u0107 napisany w innym j\u0119zyku\n",
"* Dost\u0119pne obecnie (we wczesnej postaci): IRuby, IJulia\n",
"* Serwery dalszych j\u0119zyk\u00f3w s\u0105 w przygotowaniu"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Cykl pracy\n",
"==========\n",
"\n",
"1. Prototyp rozwi\u0105zania\n",
"2. Testowanie \n",
"3. Poprawki -> ponowne testowanie\n",
"4. Opracowanie rozwi\u0105zania (notatki/rysunki/teoria)\n",
"5. Publikacja \n",
"6. Rozpowszechnianie"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"*Wszystkie te etapy mo\u017cna zrealizowa\u0107 wewn\u0105trz jednego \u015brodowiska.*\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Mo\u017cliwo\u015bci \u015brodowiska\n",
"---------------------\n",
"\n",
"Kilka przyk\u0142ad\u00f3w zastosowa\u0144 notes\u00f3w IPythona:\n",
"\n",
"* Eksperymenty obliczeniowe, analiza danych i obliczenia symboliczne\n",
"* Tworzenie nowego kodu (rapid prototyping)\n",
"* [Materia\u0142y edukacyjne](http://jochym.github.io/qe-doc/)\n",
"* [Dokumentacja](http://nbviewer.ipython.org/github/ipython/sloan-2013-reports/blob/master/IPython%202013%20Progress%20Report%20-%20Sloan%20Foundation.ipynb)\n",
"* [Reprodukowalne (i zwyczajne) publikacje](http://www.nature.com/ismej/journal/v7/n3/full/ismej2012123a.html) \n",
"* Ksi\u0105\u017cki [tradycyjne](http://link.springer.com/book/10.1007/978-3-319-01342-8?no-access=true) i [elektroniczne](http://camdavidsonpilon.github.io/Probabilistic-Programming-and-Bayesian-Methods-for-Hackers/)\n",
"* Prezentacje (na przyk\u0142ad niniejsza)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Jak zacz\u0105\u0107?\n",
"===========\n",
"\n",
"* [Enthought Python Distribution](https://www.enthought.com/products/epd/free/) (Windows/Mac)\n",
"* Standardowe pakiety dystrybucji (Linux/Mac)\n",
"* [\u015arodowisko wirtualne](http://www.virtualenv.org/en/latest/) (Linux/Mac/Unix)\n",
"* Maszyna wirtualna (VirtualBox + linux)\n",
"* Cloud (Amazon EC2, CC1, w\u0142asne serwery)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"Dokumentacja\n",
"------------\n",
"\n",
"Kilka miejsc od kt\u00f3rych warto zacz\u0105\u0107 poszukiwanie informacji:\n",
"\n",
"* [Python](http://python.org/) - Dokumentacja j\u0119zyka Python\n",
"* [IPython](http://ipython.org/) - Dokumentacja \u015brodowiska IPython\n",
"* [SciPy](http://scipy.org/) - Biblioteki naukowe i graficzne\n",
"* [MayaVi](http://code.enthought.com/projects/mayavi/) - Biblioteka i \u015brodowisko wizualizacji 3D"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"Gotowiec -- czyli obraz maszyny dla CC1\n",
"---------------------------------------\n",
"\n",
"**Zalety**\n",
"\n",
"* Natychmiast gotowa do dzia\u0142ania\n",
"* Zainstalowany du\u017cy zestw bibliotek\n",
"* Wymagane jedynie konto na CC1 i przegl\u0105darka WWW\n",
"* Dost\u0119pno\u015b\u0107 zasob\u00f3w obliczeniowych CC1, w tym klastr\u00f3w\n",
"* Mo\u017cliwo\u015b\u0107 pracy zdalnej r\u00f3wnie\u017c na du\u017ce odleg\u0142o\u015bci"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"**Wady**\n",
"\n",
"* Zale\u017cno\u015b\u0107 od funkcjonowania CC1\n",
"* Konieczno\u015b\u0107 transferu danych do/z CC1\n",
"* Wzgl\u0119dnie wczesny etap wdro\u017cenia systemu"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"Dzi\u0119kuj\u0119 za uwag\u0119\n",
"================="
]
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment