{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "What you should know about C\n", "----\n", "\n", "- Write, compile and run a simple program in C\n", "- Static types\n", "- Control flow especially `for` loop\n", "- Using functions\n", "- Using structs\n", "- Pointers and arrays\n", "- Function pointers\n", "- Dynamic memory allocation\n", "- Separate compilation and `make`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Structs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercise 1**\n", "\n", "Write and use a `struct` to represent dates." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Solution**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%%file ex1.c\n", "#include \n", "\n", "typedef struct {\n", " int day;\n", " int month;\n", " int year;\n", "} date;\n", "\n", "int main(int argc, char* argv[])\n", "{\n", " date d1;\n", " d1.day = 29;\n", " d1.month = 3;\n", " d1.year = 2016;\n", "\n", " date d2 = {30, 3, 2016};\n", "\n", " date d3 = {.year = 2016, .month = 3, .day = 31};\n", "\n", " printf(\"%d-%d-%d\\n\", d1.month, d1.day, d1.year);\n", " printf(\"%d-%d-%d\\n\", d2.month, d2.day, d2.year);\n", " printf(\"%d-%d-%d\\n\", d3.month, d3.day, d3.year);\n", "}" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%%bash\n", "gcc -std=c99 -o ex1 ex1.c" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%%bash\n", "./ex1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Pointers" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercise 2**\n", "\n", "Write and use pointers for working with\n", "\n", "- (a) doubles\n", "- (b) the date struct\n", "- (c) vector of doubles\n", "- (d) 2D array of doubles" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Solution**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%%file ex2a.c\n", "#include \n", "#include \n", "\n", "int main(int argc, char* argv[])\n", "{\n", " double x1 = 2.78;\n", " double x2 = 3.14;\n", "\n", " double *p1 = malloc(sizeof(double));\n", " if (p1 == NULL) return -1;\n", "\n", " double *p2 = calloc(sizeof(double), 1);\n", " if (p2 == NULL) return -1;\n", "\n", " printf(\"%p: %.2f\\n\", p1, *p1);\n", " printf(\"%p: %.2f\\n\\n\", p2, *p2);\n", "\n", " p1 = &x1;\n", " *p2 = x2;\n", "\n", " printf(\"%p: %.2f\\n\", p1, *p1);\n", " printf(\"%p: %.2f\\n\", p2, *p2);\n", "\n", " // free(p1);\n", " // free(p2);\n", "}" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%%bash\n", "gcc -std=c99 -o ex2a ex2a.c" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%%bash\n", "./ex2a" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Solution**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%%file ex2b.c\n", "#include \n", "#include \n", "\n", "typedef struct {\n", " int day;\n", " int month;\n", " int year;\n", "} date;\n", "\n", "int main(int argc, char* argv[])\n", "{\n", " date *d1 = malloc(sizeof(date));\n", " if (d1 == NULL) return -1;\n", "\n", " d1->day = 29;\n", " d1->month = 3;\n", " d1->year = 2016;\n", "\n", " printf(\"%d-%d-%d\\n\", d1->month, d1->day, d1->year);\n", " printf(\"%d-%d-%d\\n\", (*d1).month, (*d1).day, (*d1).year);\n", "\n", " free(d1);\n", "}" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%%bash\n", "gcc -std=c99 -o ex2b ex2b.c" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%%bash\n", "./ex2b" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Solution**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%%file ex2c.c\n", "#include \n", "#include \n", "\n", "int main(int argc, char* argv[])\n", "{\n", " int n = atoi(argv[1]);\n", " double *xs = calloc(sizeof(double), n);\n", " if (xs == NULL) return -1;\n", " \n", " for (int i=0; i\n", "#include \n", "\n", "int main(int argc, char* argv[])\n", "{\n", " int rows = 2;;\n", " int cols = 3;\n", " double **xs = malloc(sizeof(double) * rows);\n", " for (int i=0; i < rows; i++) {\n", " xs[i] = calloc(sizeof(double), cols);\n", " }\n", " \n", " for (int i=0; i\n", "#include \n", "\n", "double add(double x, double y) {\n", " return x + y;\n", "}\n", "\n", "\n", "double mult(double x, double y) {\n", " return x * y;\n", "}\n", "\n", "int main(int argc, char* argv[])\n", "{\n", " double a = 3.0;\n", " double b = 4.0;\n", "\n", " double (*f)(double, double) = add;\n", "\n", " typedef double (*fp)(double, double);\n", " fp g = mult;\n", "\n", " printf(\"%.2f\\n\", add(a, b));\n", " printf(\"%.2f\\n\", f(a, b));\n", " printf(\"%.2f\\n\", g(a, b));\n", "\n", "}" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%%bash\n", "gcc -std=c99 -o ex3 ex3.c" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%%bash\n", "./ex3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Separate compilation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercise 4**\n", "\n", "Write header and implementation files for the add function, and use the function in a separate driver file. Use a makefile to compile the executable." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Solution**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%%file ex4.h\n", "\n", "#pragma once\n", "double add(double x, double y);\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%%file ex4.c\n", "#include \"ex4.h\"\n", "\n", "double add(double x, double y) {\n", " return x + y;\n", "}\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%%file ex4_main.c\n", "#include \n", "#include \"ex4.h\"\n", "\n", "int main() {\n", " double a = 3.0;\n", " double b = 4.0;\n", "\n", " printf(\"%.2f\\n\", add(a, b));\n", "}\n" ] }, { "cell_type": "code", "execution_count": 236, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overwriting makefile\n" ] } ], "source": [ "%%file makefile\n", "\n", "ex4_main: ex4_main.c ex4.o\n", " \t gcc -std=c99 -o ex4_main ex4_main.c ex4.o\n", "\n", "ex4.o: ex4.c\n", " \t gcc -std=c99 -c ex4.c" ] }, { "cell_type": "code", "execution_count": 237, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "cc -c -o ex4.o ex4.c\n", "cc ex4_main.c ex4.o -o ex4_main\n" ] } ], "source": [ "%%bash\n", "make" ] }, { "cell_type": "code", "execution_count": 238, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "7.00\n" ] } ], "source": [ "%%bash\n", "./ex4_main" ] }, { "cell_type": "code", "execution_count": 234, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overwriting makefile\n" ] } ], "source": [ "%%file makefile\n", "TARGET = ex4_main\n", "OBJECTS = ex4.o\n", "CFLAGS = -O3 -std=c99\n", "LDLIBS = -lm\n", "CC = gcc\n", "\n", "all: $(TARGET)\n", " \n", "clean:\n", "\t rm $(TARGET) $(OBJECTS)\n", "\n", "$(TARGET): $(OBJECTS)" ] }, { "cell_type": "code", "execution_count": 235, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "rm ex4_main ex4.o\n" ] } ], "source": [ "%%bash\n", "make clean\n", "make" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%%bash\n", "./ex4_main" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What you should know about C++\n", "----\n", "\n", "- Anonymous functions\n", "- Generalized function pointers\n", "- Ranged for\n", "- Using the standard template library\n", " - Iterators\n", " - Containers\n", " - Algorithms\n", "- The `random` library\n", "- Using `amradillo`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercise 5**\n", "\n", "Implement Newton's method in 1D for root finding. Pass in the function and gradient as generalized function pointers. Use the method to find all roots of the polynomial equation $f(x) = x^3 - 7x - 6$" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Solution**" ] }, { "cell_type": "code", "execution_count": 266, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overwriting ex5.cpp\n" ] } ], "source": [ "%%file ex5.cpp\n", "#include \n", "#include \n", "#include \n", "#include \n", "#include \n", "using std::vector;\n", "using std::cout;\n", "using std::function;\n", "\n", "using func = function;\n", "\n", "double newton(double x, func f, func fprime, int max_iter=10) {\n", " for (int i=0; i x = {-5, 0, 5};\n", " for (auto x_: x) {\n", " cout << std::setw(2) << x_ << \": \" \n", " << std::setw(3) << newton(x_, f, fprime) << \"\\n\";\n", " }\n", "}" ] }, { "cell_type": "code", "execution_count": 267, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%%bash\n", "g++ -std=c++11 ex5.cpp -o ex5" ] }, { "cell_type": "code", "execution_count": 268, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-5: -2\n", " 0: -1\n", " 5: 3\n" ] } ], "source": [ "%%bash\n", "./ex5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Exercise 6**\n", "\n", "Use the armadillo library to\n", "\n", "- Generate 10 x-coordinates linearly spaced between 10 and 15\n", "- Generate 10 random y-values as $y = 3x^2 - 7x + 2 + \\epsilon$ where $\\epsilon \\sim 10 N(0,1)$\n", "- Find the length of $x$ and $y$ and the Euclidean distance between $x$ and $y$\n", "- Find the correlation between $x$ and $y$\n", "- Solve the linear system to find a quadratic fit for this data" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Solution**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%%file ex6.cpp\n", "#include \n", "#include \n", "#include \n", "using std::cout;\n", "using std::ofstream;\n", "using namespace arma;\n", "\n", "int main() \n", "{\n", " vec x = linspace(10.0,15.0,10);\n", " vec eps = 10*randn(10);\n", " vec y = 3*x%x - 7*x + 2 + eps; \n", "\n", " cout << \"x:\\n\" << x << \"\\n\";\n", " cout << \"y:\\n\" << y << \"\\n\";\n", "\n", " cout << \"Lenght of x is: \" << norm(x) << \"\\n\";\n", " cout << \"Lenght of y is: \" << norm(y) << \"\\n\";\n", "\n", " cout << \"Distance(x, y) is: \" << norm(x-y) << \"\\n\";\n", "\n", " cout << \"Correlation(x, y) is: \" << cor(x, y) << \"\\n\";\n", "\n", " mat A = join_rows(ones(10), x);\n", " A = join_rows(A, x%x);\n", " cout << \"A:\\n\" << A << \"\\n\";\n", "\n", " vec b = solve(A, y);\n", " cout << \"b:\\n\" << b << \"\\n\";\n", "\n", " ofstream fout1(\"x.txt\");\n", " x.print(fout1);\n", " ofstream fout2(\"y.txt\");\n", " y.print(fout2);\n", " ofstream fout3(\"b.txt\");\n", " b.print(fout3);\n", "}" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%%bash\n", "g++ -std=c++11 ex6.cpp -o ex6 -larmadillo" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x:\n", " 10.0000\n", " 10.5556\n", " 11.1111\n", " 11.6667\n", " 12.2222\n", " 12.7778\n", " 13.3333\n", " 13.8889\n", " 14.4444\n", " 15.0000\n", "\n", "y:\n", " 2.4802e+02\n", " 2.6412e+02\n", " 2.9157e+02\n", " 3.3056e+02\n", " 3.4089e+02\n", " 3.9573e+02\n", " 4.4029e+02\n", " 4.7583e+02\n", " 5.2827e+02\n", " 5.8404e+02\n", "\n", "Lenght of x is: 39.8493\n", "Lenght of y is: 1280.16\n", "Distance(x, y) is: 1240.76\n", "Correlation(x, y) is: 0.9887\n", "\n", "A:\n", " 1.0000e+00 1.0000e+01 1.0000e+02\n", " 1.0000e+00 1.0556e+01 1.1142e+02\n", " 1.0000e+00 1.1111e+01 1.2346e+02\n", " 1.0000e+00 1.1667e+01 1.3611e+02\n", " 1.0000e+00 1.2222e+01 1.4938e+02\n", " 1.0000e+00 1.2778e+01 1.6327e+02\n", " 1.0000e+00 1.3333e+01 1.7778e+02\n", " 1.0000e+00 1.3889e+01 1.9290e+02\n", " 1.0000e+00 1.4444e+01 2.0864e+02\n", " 1.0000e+00 1.5000e+01 2.2500e+02\n", "\n", "b:\n", " 5.8621e+02\n", " -1.0156e+02\n", " 6.7586e+00\n", "\n" ] } ], "source": [ "%%bash\n", "./ex6" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEJCAYAAAB7UTvrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl4FFXWwOFfZ0/IAmoUBR3lU0/AdVxwYIKKgiLggriC\ngrigo4KogzqgYEAddwRBFEFcQVABFxZHkd2g6IgKynGbAQYUVCAJZOks/f1Rldg2kHRCpLqT8z6P\nT7rr1i1OtUlO7lL3+gKBAMYYYwxAjNcBGGOMiRyWFIwxxlSxpGCMMaaKJQVjjDFVLCkYY4ypYknB\nGGNMlbhwTxSRa4HBwMHAV8BgVV3gln0MnBR0egCYpKr93fJMYBzQGfADk4EhqlpRHzdhjDGmfoTV\nUhCRvsBY4AHgaGAR8JaIHOKe0ga4HGju/ncgcFvQJWYA+wMdgL5APyCnHuI3xhhTj3zhPLwmIv8B\nnlfVHPe9D/gUeBj4GPgOOExV1+6ibjtgqVu+zj3WBxgDZKpqaT3dizHGmD1UY/eRiAjwJ2B65TFV\nDQAnuOXnAYW7SgiubGBtZUJwLQTSgeOBFXWK3BhjTL0LZ0zhSJwxgmYiMh+n+2gNcJeq5rrv80Rk\nCnAa8CswWVVHufVbAhtCrrnR/XowlhSMMSZihDOmkA74gOeBCcDZwCpgvohkAUcBTYC5wFk4Yw85\nIjLcrZ8CFAdfUFXLcBJN0p7fgjHGmPoSTkuhss//PlWd5r6+SUQ6ADcAVwKpqprvlq0WkabAEJzB\n5CIgMfiCIhKHk2h27GH8xhhj6lE4SWEDzl/1q0KOf40zeFwB5IeUfQmkiUg6sB44J6T8oKBr71Yg\nEAj4fL4wQjTGGBOkzr84w0kK/wYKgZPd15XaAO+JSC7wkaoOCio7GdioqvkishR4UERaqGplEjgD\nJ5GsrO4f9vl8/PxzQZi3EnkyM9Msfg9Z/N6J5tihYcRfVzUmBVUtEpFRwP0ishmnFXAT0AoYD/yI\nM4bwKbAM6IjzkNtAt36uiCwHponIAJznGB4CHnPHFowxxkSIsJ5oVtVhIrIDGIXzENpKoLOqfgs8\nIiKlwFDgEGAdMEhVJwddogdOAlkMFAATVHVk/d2GMcaY+hDWw2seCkR7E87i947F751ojh0aRPx1\nHlOwBfGMMcZUsaRgjDGmiiUFY4wxVSwpGGOMqWJJwRhjTBVLCsYYY6pYUjDGGFPFkoIxxpgqlhSM\nMcZUsaRgjDGmiiUFY4wxVSwpGGOMqWJJwRhjTJWwls4GEJFrcfZJOBj4ChisqgvcsrNw9kgQ4Bvg\nLlWdF1Q3ExgHdAb8wGRgiLtrmzHGmAgRVktBRPoCY4EHgKOBRcBbInKIiLQB3gSmAccDbwGzRKR1\n0CVm4OzD0AHoC/TD2b/ZGGNMBAm3++he4J+q+oKq/gD8HfgWaI+zw1quqj6oqt+o6jDgQ+AWABFp\n557XR1VXuS2IwcAAEYmv39sxxhizJ2rsPhIRAf4ETK88pqoB4AS3/B6cVkKwhcCl7utsYK2qrgsp\nT8dpWayoW+jGGGPqWzhjCkcCAaCZiMzH6T5agzNukAu0BDaE1NmIM/ZANeW451hSMMaYCBFO91E6\n4AOeByYAZwOrgPkikgWkAMUhdUqAJPf1TuWqWoaTaJIwxhgTMcJpKZS6X+9T1cpuoptEJBv4G1AI\nJIbUSQR2uK+LQstFJA4n0eygBpmZaWGEGLksfm9Z/N6J5tgh+uOvq3CSwgacv+pXhRxfAxwGrAcO\nDCk7iN+6jNYD5+yiHHbuVtpJlG+ebfF7yOL3TjTHDg0j/roKp/vo3zitgZNDjrcBvgOWAqeHlHUE\nFruvlwKtRKRFUPkZQD6wspbxGmOM+QPV2FJQ1SIRGQXcLyKbgS+Bm4BWwFM44wKfiMi9wFSgN9AW\nuMGtnysiy4FpIjIAaI7zoNtj7tiCMcaYCBHWE82qOkxEdgCjcB5CWwl0VtXvAESkB/AwcAdOt1J3\nVdWgS/QAxuO0HgqACao6st7uwhhj6oHf72fOnFzS05PJzj6ehIQEr0Pa63yBQMDrGKoTiPZ+PYvf\nOxa/d6Ix9gULvmDYsA2odgEgK2seOTkt6NjxWI8jq73MzDRfXevagnjGmEbP7/e7CeESnFn46axZ\ncwnDh2+gtLS0puoNiiUFY0yjN2dOblULIYki2rAagDVrujB7dq6Xoe11lhSMMcaVwTYWcRqrOZp9\n+NXrcDxhScEY0+h17dqOEw+fwbucTVtWMImr2cK+ZGXNo1u3dl6Ht1eFvZ+CMcY0VIklxczzPcp+\nrOZ5etGfR8nKmk5OTgvi4xvXYs6WFIwxjZpvewEZl/Uk/tvVFPa8hLLOlzK12WdkZ3dqdAkBLCkY\nYxqz7dvJuPwi4ld8RPGFF7Nj7DOcHxsblVNq64uNKRhjGqft28nodRHxH+VS3KMnBWOfgdhYr6Py\nnCUFY0zjs2MHGVdcQsLyDyk+/0IKxj0LcdZxApYUjDGNTWEhGVdeSsKHSyk59wIKnrKEEMySgjGm\n8SgqIuPKy0hYupiSbueR//QkaISDydWxpGCMaRyKisjocxkJSxZS0qUb+c88ZwlhFywpGGMavuJi\nMq7qRcKiBZScfQ75E1+ARrgCajjC6kgTkdbAapwd2CpX3wsAHVT1QxH5GDgpqEoAmKSq/d36mcA4\noDPgByYDQ1S1ol7uwhhjdqekhPR+vUlYMJ+SzmeTP/FFSwjVCHd05RjgZ+BofksKQNXiIG2Ay4EF\nQWWFQa9nAOVAB6Al8ALO3s/31D5kY4wJU0kJ6VdfQeL89yg5szP5z70MiaFbyptg4SaFo4GvVPXn\n0AIRaQUkA8tVdfMuytsB7YHDVHUdsEpEBgNjRGSEqjaudWmNMXuH30/6tX1IfO9d/B3PJH/yK5YQ\nwhDumMLRwNfVlBWp6trdlGcDa92EUGkhzqLlx4f57xtjTPj8ftKv7Uviu3Pxn9aRvBemQlKS11FF\nhdq0FJJEJBc4FFiFMyawwi3LE5EpwGk4XUqTVXWUW7clsCHkehvdrwcDK+oevjHGhCgtJb1/PxLn\nzcbf4XTyXnzVEkIt1NhSEJEkoBWQBvwdOBfnl/pCEckCjgKaAHOBs4CxQI6IDHcvkQIUB19TVctw\nBqPt/5Qxpv6UlpJ+wzUkznkbf/ap5L30KiQnex1VVKmxpaCqxSLSFCip7P8XkauAE4G/AVcCqaqa\n71ZZ7Z4/BMgBioDfdeSJSBzOgPWOmv79zMy0sG8mEln83rL4vbPXYy8rg97Xwtuz4PTTSXjnHTKb\nNKnz5aL5s98TYXUfqer2kPcBEVkNHOxOK80PqfIlkCYi6cB64JyQ8oPcr6HdSjuJ5pUKo32lRYvf\nW9Ec/16PvayMtJuuI2nmG/j/0p68yVOhsAIK6xZDNH/2sGcJLZzuoxNEJE9E/hx0LAZnkHi1iOSK\nyBMh1U4GNrqth6VAKxFpEVR+Bk4iWVnnyI0xBqC8nLSbrydp5huUntKOvCmvwx60EBq7cFoKnwP/\nAZ4RkZtxunzuBPYFRuP8cs8RkU+BZUBHYDAwEEBVc0VkOTBNRAYAzYGHgMfcsQVjjKmb8nLSBtxA\n0ozXKD35FPKmvg6pqV5HFdXCGVMoF5FzgIeBt3AGlZcBp6rqL8AjIlIKDAUOAdYBg1R1ctBlegDj\ngcVAATBBVUfW650YYxqX8nLSBt1E0uvTKD3xZPJefYNAauMcB6hPvkAg4HUM1QlEe7+exe8di987\nf3jsFRWk3nozyVNfpvSEE8mbPotAeka9XT6aP3uAzMw0X81n7ZotiGeMiS4VFaTePtBJCMf/mbxp\nM+s1ITR2trOEMSbi+f1+5szJhYoKei15g+RXXqT0uD87LYSMpl6H16BYUjDGRLQFC75g2LANqJ7N\nU9xGE15k66FHUj59JoGmzbwOr8Gx7iNjTMTy+/1uQriYJxnK33iOlRxH1/g78Nug8h/CkoIxJmLN\nmZPLd9qJSVzDzYzjc46lE++z/NuLmT071+vwGiTrPjLGRKyY0lKmcRU9eZsVnMQ5zOVX9mPnRRRM\nfbGkYIyJTNu303vaGJJYyAd05HzeZDtOl1FW1jy6devkcYANkyUFY0zE8W3dQkavi4n/dAUbTsrm\n1vyr2f5NAMgnK2seOTktiI+P9zrMBsmSgjEmosRs+omMSy4g7uuvKL74MhJGP8XcQIDZs5cA0K1b\nJ0sIfyBLCsaYiBGz9r80vfh8Yv/7HwqvvZ4d9z0EMTHEAxdccKrX4TUKlhSMMREhds3XZFx8PrGb\nfmLH7XdSeMcQ8NV5tQZTR5YUjDGei/v3J2Rc3pOYrVvZPvKfFF1/k9chNVqWFIwxnopfsoj0Ppfj\nKyokf8x4Si7r7XVIjVpYSUFEWgOrcfZVrmzPBYAOqvqhiJyFs0eCAN8Ad6nqvKD6mcA4oDPgByYD\nQ9xd24wxjVTC3Nmk978KAgHyJ76Iv/t5XofU6IX7RPMxwM84G+RU/ncg8JGItAHeBKbh7Mb2FjDL\nTSSVZgD7Ax2AvkA/nP2bjTGNVOK0KaRffQXExpH3ymuWECJEuN1HRwNfqerPoQUiMhDIVdUH3UPD\nRCQbuAW4QUTaAe2Bw1R1HbBKRAYDY0RkhKqW7vltGGOiSfKz40kdeicVTZuSN+V1yk5q63VIxhVu\nS+Fo4OvdlHUAFoYcW+geB8gG1roJIbg8HadlYYxpLAIBUh75J6lD76R8/wPYNmuuJYQIU5uWQpKI\n5AKHAqtwxgRWAC2BDSHnbwQOdl/vrhz3nBW1jNkYE40qKmgy7B+kTBhP+SGHsu21WVQc1srrqEyI\nGlsKIpIEtALSgL8D5+L8Ul8oIllAClAcUq0ESHJf71SuqmU4A9VJGGMavrIy0m65kZQJ4ynLas22\nd961hBChamwpqGqxiDQFSir7/0XkKuAE4EagEEgMqZYI7HBfF4WWi0gcziymHdQgMzO610y3+L1l\n8XunKvbiYri8D8yaBW3bEjdnDvvuu6+3wYUhmj/7PRFW95Gqbg95HxCRr3C6f9bjzEQKdhC/dRmt\nB87ZRTns3K20kyjfPNvi95DF753K2H3bC0jv24uEJYvwdziN/BemEKhIgAi/r2j+7GHPElo43Ucn\niEieiPw56FgMziDxKmApcHpItY7AYvf1UqCViLQIKj8DZ0H0lXWO3BgT0XxbfiXjovNIWLKIknO6\nk/fKawRst7SIF05L4XPgP8AzInIzTpfPncC+wGicZxY+EZF7galAb6AtcAOAquaKyHJgmogMcM9/\nCHjMHVswxjQ0GzfS9IKuxK35muJLe1EwaizE2QIK0aDGloKqluN0/yjOg2nLcR5EO1VVf1HVVUAP\noCfwGdAd6K6qGnSZHsAmnNbDJGCCqo6szxsxxkSGmP/8ANnZxK35msL+f6Ng9FOWEKKILxAIeB1D\ndQLR3q9n8XvH4t/7Yr9aTcYlFxC7eRM77hhC4e13RuVKp9H42QfLzEyr84du6dsYUy/iPvmYjF4X\nEbNtG4weTeHl/bwOydRBuE80G2PMbsUvWkDTi87HV1BA/pNPw8CBXodk6shaCsaYOvH7/cyZk8uh\n//6QTs89BkD+pJfwd+3ucWRmT1hSMMbU2oIFXzBs2Ab+qpu5moco9MWz4u6HOcoSQtSz7iNjTK34\n/X6G37OePrqSSQxgG03pGFjM315rTmmpLXoc7SwpGGNq5d1ZC8n5ZhpD+CffcjjtyGUFbVmzpguz\nZ+d6HZ7ZQ9Z9ZIwJm2/zZro9NpQDUBbTgR7MZAuRv46RCZ+1FIwxYYnVNTTreiYH/Ed5M70DnXnv\ndwkhK2se3bq18zBCUx8sKRhjahS/8AOadu1E7Lq17LhjCCUTHqBV1ps4S5jlk5U1nZycFsTHx3sd\nqtlD1n1kjKlW0kvPk3rHrRAbS/74iZT0vISOQHaHNsyevQSAbt06WUJoICwpGGN2raKCJiOHkzJu\nNBX77EPeC69Sdspfqorj4+O54IJTPQzQ/BEsKRhjdlZYSPqN15E4523KDj+CvFdes53SGolaJQUR\n+QuwBDhTVRe7xz4GTgo6LQBMUtX+bnkmMA7oDPiByTj7O1fsefjGmPoWs+kn0q+8lPiVn+H/awfy\nJ79MoGkzr8Mye0nYSUFEUoCX2Hlwug1wObAg6Fhh0OsZQDnQAWgJvACUAvfUIV5jzB8o9qvVZPS+\nmNgN/6P4st4UPDoaEhK8DsvsRbVpKYwC1gFVbUgRaQUkA8tVdXNoBRFpB7QHDlPVdcAqERkMjBGR\nEZV7PhtjvBf/wXukX3sVMdsL2DFkGIW33B6Vy16bPRPWlFQR6Yqz0c5AIPi75GigSFXX7qZqNrDW\nTQiVFgLpONt5GmMiQNLkiWT0uhhfqZ/8CZMpHPR3SwiNVI0tBRHZD5gI9AW2hRQfDeSJyBTgNOBX\nYLKqjnLLWwIbQupsdL8eDKyoY9zGmPpQXk6Te+8m5ZlxVOy3H3kvTKXs5FO8jsp4KJyWwtPALFV9\nbxdlRwFNgLnAWcBYIEdEhrvlKUBxcAV3X+YAkFTXoI0x9WD7dtL79SblmXGUHSlsnfuBJQRTfUtB\nRPridPMc6x4KbU9eCaSqar77frWINAWGADlAEZAYcs049zo79ix0Y0xdxfy4kfQrLiX+y8/xdzid\n/OdeJJDR1OuwTASoqfuoL04X0CYRgd+SwlwReUFVb8R5zj3Yl0CaiKQD63HGIoId5H4N7VbapczM\ntHBOi1gWv7cs/l1YuRK6d4cNG+Daa0l46in2+wOeRrbPPjrVlBR648wuqnQgznMK1wDvi0gu8JGq\nDgo652Rgo6rmi8hS4EERaaGqlUngDJxEsjKcAKN882yL30ONNf7KHdEAunZtR0LQlNKE9+aRfl0/\nfIU72D5sJEU3DYRtxYT08u6xxvrZR4o9SWjVJgVV/TH4vYiUuC83quovIjIDZwzhU2AZ0BEYjDNL\nCVXNFZHlwDQRGQA0Bx4CHnPHFowx9ahyRzTVLoCzcmlOTgs6djyW5GfH0+Sef0BCAnmTXsJ/7vke\nR2siUV2WuQhUvlDVR0SkFBgKHILzHMMgVZ0cdH4PYDywGCgAJqjqyLqHbIzZFb/f7yaES6qOrVlz\nCSOGTaVr++dJnTyRisz9yXvpVcpOOKmaK5nGrFZJwe0Cig059gTwRDV1NgM96xSdMSZsc+bkVrUQ\nKqVSwEP6PKn6L8patyHv5elUHHyIRxGaaGAL4hnTQLVkPW9zLsfzOeuPOoHkN98kkJ7hdVgmwtkm\nO8Y0EF27tkNkHgAn8CkfcQrH8zmvNu1M7Jy5lhBMWCwpGNNAJCQkMGJEC249aBCLOZXm/MSD+/ch\n5ulhxCcn13wBY7DuI2MaDr+f7vNf4ZKN4/EnJvP+NUPpM/RW2xHN1IolBWMagJiffiT9mj7Er/iI\nsiOF7ZNf4c9HHOl1WCYKWfeRMVEuftkSmp2RTfyKjyi+4EK2zltAuSUEU0eWFIyJVoEAyWNHk3HR\nefi2bWX7fQ9S8MxkSE31OjITxaz7yJgo5CvIJ23gjSTOfovyA5qTP/FFyk75i9dhmQbAkoIxUSZ2\nzdek9+tN3Pff4W+fTf4zkwkccIDXYZkGwrqPjIkiiTNeo1mXjsR9/x2FN91C3utvWUIw9cpaCsZE\nA7+fJvcOJWXiM1SkppH/3Mv4u5/ndVSmAbKkYEyEi9m4gfRr+xL/yceUZbUm/7mXKT/8CK/DMg2U\ndR8ZE8Hily6mWacOxH/yMcUXXsTWOfMtIZg/VK1aCiLyF5xNds5U1cXusbNw9kgQ4BvgLlWdF1Qn\nExgHdAb8wGRgiKpW1MsdGNMQBQLw0ENkDBkCMTEU/PMRiq/uD77QHXGNqV9htxREJAV4KbiOiLQB\n3gSm4ezl/BYwS0RaB1WdAewPdMDZ3rMfzv7Nxphd8OXnkX5Vb7jrLir2P4Btb86l+JrrLSGYvaI2\n3UejcDbRCXYLkKuqD6rqN6o6DPjQPY6ItAPaA31UdZXbghgMDBARW5DFmBCxX62m6Vmnkzj3HejY\nka3zl1J28ileh2UakbCSgoh0Bc7B2WYz+M+VbGBhyOkLcVoFleVrVXVdSHk6TsvCGONKfH0azc45\ng7gfvqdwwK3wr38RyMz0OizTyNQ4piAi+wETcbp+toUUtwQ2hBzbCBxcQznuOStqE6wxDZLfT+qw\nf5D83LNUpKWT//wk/F27kxJnkwPN3hdOS+FpYJaqvhd0rHKf5hSgOOT8EiBpd+WqWubWT8KYRsLv\n9zNr1iJmzVqE3++vOh6zcQNNz+9C8nPPUta6DdveW4i/a3cPIzWNXbV/iohIX5xunmPdQ76Qr0VA\nYki1RGDH7spFJM6tvwNjGoEFC75g2LANVfsnZ2XNIyenBWfFbiH9+n7E/PorxT0voeDR0dCkicfR\nmsaupvZpX5wuoE0iAr8lg7ki8iLOwPOBIXUO4rcuo/U4YxGh5bBzt9IuZWamhXNaxLL4veV1/H6/\nnxEjfkL1kqpjuuYiNg64koxfXsUXGwtjx5J0440k7WJ2kdfx74lojh2iP/66qikp9AaC9/E7EOc5\nhWuA94H7gdPcr5U6Aovd10uBB0WkhapWJoEzgHxgZTgB/vxzQTinRaTMzDSL30OREP+sWYtYvbpz\n1fsMtvECfTl/81tsb7Yfpa+8StlJbeGX7TvVjYT46yqaY4eGEX9dVZsUVPXH4PciUuK+3Kiqv4jI\nk8AnInIvMBUnibQFbnDr54rIcmCaiAwAmuM86PaYO7ZgTKNxDF/wBj05gu94n9P48e7+dDmprddh\nGfM7dVnmonKQGVVdBfQAegKfAd2B7qqqQef3ADbhtB4mARNUdWSdIzYminTt2o6sI+cwiFF8TFuO\n4Dse4B/cIjdw5mVdvA7PmJ3Uas6b2wUUG3JsLjC3mjqbcZKGMY1O0i8/szDhUQ7gUzazHxfxIt9n\nQU5OC+Lj7flNE3lsIrQxf5DEma+TesdtxORto7hzF949+wrOT29Ct27tLCGYiGVJwZh65svbRuqd\nt5M04zUCKU0oeGwMxVf0pYutXWSigCUFY+pR/NLFpA24gdgN/6P0xJPIH/csFa3+z+uwjAmb7adg\nTH0oKaHJ8KFk9DyXmJ9+ZMcdQ9j29r8sIZioYy0FY/ZQ7OpVpN94HXFfr6as1f9R8NSzlJ1wktdh\nGVMn1lIwpq4qKkgeN4ZmZ59O3NerKep7jbPUtSUEE8WspWBMHcT8bz1pA24gYdkSKjL3J/+Jsfg7\n23MHJvpZS8GYWkp8YzrNTm9PwrIllHTpxpZFyy0hmAbDWgrGhMm3bSupd95G0sw3nKmmo8ZS3OtK\n2ybTNCiWFIwJQ/zihc5U0x83UnpSW/LHTaDisFZeh2VMvbPuI2OqU1xMk3vuoulF5xHz82Z23HU3\n296aZwnBNFjWUjBmN2JXfUn6jdcSt+Zryg4/wplqevwJXodlzB/KWgrGhCovJ/nJJ5yppmu+pujq\n69j6/hJLCKZRCKulICItgCdwNsiJAeYBt1XutyAiHwPBk7MDwCRV7e+WZwLjgM6AH5gMDFHVinq6\nD2PqRcz6daTdfD0Jucso3/8ACsY8RekZnWuuaEwDEW730WxgM84uaz7gSeBtfksEbYDLgQVBdQqD\nXs8AyoEOONt7vgCUAvfUNXBj6lUgQOJrr5L6j8HEFORT0u08Ch4dTWDffb2OzJi9qsakICIHAF8B\nd6nqOvfY48BMEckA9sPZsnO5u3dCaP12QHvgMLf+KhEZDIwRkRGqWlp/t2NM7fm2biF18K0kvTWT\niiap5I8ZT8mlvWyqqWmUakwKqroJ6FX5XkRa4my3+bGq5onI6UCRqq7dzSWygbWVCcW1EEgHjgdW\n1C10Y/ZcwrtzSR08iNiffqS07V+cqaZ/OtTrsIzxTK1mH4nITOB8YAvQ0T18FJAnIlNwupd+BSar\n6ii3vCWwIeRSG92vB2NJwXggZsP/SB16J4lz3iYQH8/2ocMpunkQxMbWXNmYBqy2s4/uBtoCy4D3\nReQgnKTQBGdLzrOAsUCOiAx366QAxcEXUdUynMHopLqHbkwdlJWR/PRYmmW3JXHO2/j/0p6tHyyj\n6JbbLSEYQ+33aF4NICKXAeuBPsCVQKqq5runrRaRpsAQIAcoAhKDryMicTgD1jtq+jczM9NqE2LE\nsfi99bv4V6yA66+Hzz6DffaBMZNIuOoq9omJ3JnZ0fz5R3PsEP3x11U4A837Ax1VdVrlMVUtEpHv\ngRbutNL8kGpfAmkiko6TPM4JKT/I/RrarbSTn38uqOmUiJWZmWbxe6gyfl9+Hk0eGEHS5In4AgGK\nL+3F9uH3UZKezpxJcwDo2rUdCQkJHkf8e9H8+Udz7NAw4q+rcP5E+hMwVUSqntxxZx0J8JWI5IrI\nEyF1TgY2uq2HpUAr91mHSmfgJJKVdY7cmJoEAiS8NZNmfz2Z5Oeepfz/DmfbzNkUPPk0H3y5kTPP\nnE///qfSv/+pdOo0nwULvvA6YmM8F0730SfAYmCiiFwPlAEPAptwnjdIxRlD+BRnrKEjMBgYCKCq\nuSKyHJgmIgOA5sBDwGPu2IIx9S5m7X+h751kzJ1LIDGRHXcOpfDmQZCYiN/vZ9iwDaheUnX+mjWX\nMHz4dLKzWxMfH+9d4MZ4rMaWgqoGgAtx/qp/G+cBta3A6apaqKqP4IwfDAVW4SSEQao6OegyPXCS\nyGJgEjBBVUfW540YA4DfT/KYx9nn1FNg7lz8p3Zk66JcCm+/ExKdoa05c3JR3Xn/gzVrujB7du7e\njtiYiBLWQLOqbgGurqb8CZxlMHZXvhnoWevojKmFuOW5pN0xiLg1X1OxXya+iRPJ69TdHkIzphYi\nd9qFabT8fj+zZi1i1qxF+P3+Gs/3bd1C6q030+y8s50F7PpczZYPP4Feu34quWvXdojM2+l4VtY8\nunVrVy/3YEy0sqRgIsqCBV+EPwAcCJA4bQr7tD+R5FdepKz1UWyd/R7bH32CQNNmu/03EhISGDGi\nBVlZ03HmO+STlTWdnJwWNp5gGj3bT8FEjNoMAMd+9y2pd95GwpJFBFJS2D5sJEXX3whh/lLv2PFY\nsrNbM3tQbQPoAAATWUlEQVT2EgC6detkCcEYLCmYCFL9APASLrjgVCguJmXM46SMeRyf30/JWV3Y\n/s9HqTj4kFr/e/Hx8c41jTFVLCmYqBG/ZBGpgwcR98P3lB94ENvvfxh/t3NtINmYemRjCiZi7G4A\nuP3h0+g97wWa9jyX2P/+h8L+f2PrshX4u59nCcGYemZJwUSM0AFgH9u4p3l/Fvx4GykzXqP0uD+z\n7d0F7LjvIQKpjXNdGmP+aNZ9ZCJK5QDwhxNeIvvlcTT//msqUtMoeOBhivtdZyuZGvMHs6RgIkrM\nTz/S7OEH6DnlJXwVFZScewHb73uQigMPqrmyMWaPWVIwEcFXkE/y2CdIeXocvqIiyo4Udtx7H/5O\nZ3sdmjGNiiUF4y2/n+QXJpHy+MPE/Por5c0PpPD+hym+rDfE2benMXub/dQZb1RUkPjmDJrcP4LY\ndf+lIjWNHUOGUdj/RkhJ8To6YxotSwpmr4tfsogmI4YR//lnBOLjKbzuBgpvvYPAfvt5HZoxjV5Y\nScHdIOcJnM1xYoB5wG2q+qNbfhbOHgkCfAPcparzgupnAuOAzoAfmAwMcXdtM41E7OpVpI4cRsIH\n7wNQ3KMnO/4xjIpDD/M4MmNMpXCfU5gNZACnAacCBwJvAYhIG+BNYBpwvHt8loi0Dqo/A9gf6AD0\nBfrh7N9sGoGY/60n7ebraXbGX0n44H38HU5j678WUvDMZEsIxkSYcPZoPgD4Cuev/3XusceBme62\nnLcAuar6oFtlmIhku8dvEJF2QHvgMLf+KhEZDIwRkRGqWlr/t2UigW/bVlJGP07yxKfxlZRQ1uZo\ntg/LobRjJ3sS2ZgIVWNSUNVNQK/K9yLSErgB+FhV89wEMC2k2kLgUvd1NrC2MqEElafjtCxW1DV4\nE6GKi0meNIGU0Y8Ss20b5S1asuOuuym56FJ7+MyYCFergWYRmQmcD2zB2YsZoCWwIeTUjcDBNZTj\nnmNJoaEoLyfx9Wk0eeh+Yv+3noqMpmwffh9F1/SHpCSvozPGhKG2ax/dDbQFlgHvichBQApQHHJe\nCVD5W2CnclUtAwJB55hoFggQ/8F7NDuzA+kDbiDm580U3jiQLR+vpOimgZYQjIkitWopqOpqABG5\nDFiHM2hcCCSGnJoI7HBfF4WWi0gc4As6Z7cyM6N74bOGEr/f72fmTGdDmh49OpCQkOCc8OmncMcd\n8MEHzjhBnz74Ro4k5ZBDiISnDRrK5x+Nojl2iP746yqcgeb9gY6qWjVuoKpFIvIDcBCwHmc2UrCD\n+K3LaD1wzi7KYedupZ38/HNBTadErMzMtAYR/4IFX7g7ojkb4GRlzeLRG+HMBdNJmvkGAP4zOrH9\n7hzKjz7GqRwB991QPv9oFM2xQ8OIv67C6T76EzBVRE6oPODOOhKcWUnLcKaqBusILHZfLwVauc86\nVDoDZ3PclXWM2+wlv98iM5198XP9mg/pPLAXSTPfcJazfuNt8l6d8VtCMMZErXC6jz7B+QU/UUSu\nB8qAB4FNwAvAEuATEbkXmAr0xhl3uAFAVXNFZDkwTUQGAM1xHnR7zB1bMBGscovM/fiZATzJLYwm\ng3x+4E/859pLOPa+oRBj23IY01DU+NOsqgHgQpy/6t8GFgBbgdNVtVBVVwE9gJ7AZ0B3oLuqatBl\neuAkkcXAJGCCqo6szxsxf4y0X37iSf7OWv7EMEbiJ4GBjCaLT/ih7WmWEIxpYHyBQMDrGKoTiPZ+\nvWiNP3bVl+zz7FgC06fjKy/nv/yJx7id57iaQpqQlTWd+fM7ER8f73WouxXNnz9Ed/zRHDs0iPjr\n/HSoLYhnfhMIEP/hUlKeHFW1PlF566P45MyeXPeesEq7A+VkZU0nJ6dFRCcEY0zdWFIwUF5OwtzZ\npIwdRfy/PwXA3z6bhLuHsPXEv/J/Ph/v/qOU2bOdKandukV2C8EYU3eWFBqzkhKSXnuV5HGjifv+\nOwI+HyVdz6VwwCDKTjzZmdbmNqHj4+O54IJTPQ7YGPNHs6TQCPkK8kl6/jmSJzxF7KafCMTHU9Tr\nSopuuoXyI470OjxjjIcsKTQivk2bSHl2PEmTJxJTkE9FahqFNw6k6PobqTjwoJovYIxp8CwpNAKx\nP3xH8rgnSZo+BV9JCRWZ+7N94K0UX3UNgYymXodnjIkglhQasLiV/yblySdIeOdNfIEA5YceRuFN\nt1B8aS9bpM4Ys0uWFBqaQID4hR+QMvYJEpYsAqD02OMpGjCIku7n234GxphqWVKIcn6/nzlzcvGV\nl3Nh4GfSxo8l/svPnbJTO1I4YBClp55uO50ZY8JiSSGKLVjwBQ8N/ZZTvvuV2xnLPvyXCl8Mxedf\nSNHNt1B23J+9DtEYE2UsKUSjQACWLib+ukdZkv8xKRRRTCLjuYFZh7Vm8lNX2MNlxpg6saQQRXyb\nNpE0bQpJU18i7vvv6AF8TysmcQ3PcTWbaA4/5DN79hJ70MwYUyeWFCJdWRkJ898j6ZUXSXhvHr7y\ncgJJSXx7yun0/+h2FtGVQK13VTXGmF0LKym4u689AnQGkoGPgNuDtuf8GDgpqEoAmKSq/d3yTGCc\nW98PTAaGqGpFPd1HgxP7w3ckTXmZxGlTiN30EwClxxxHce8+lFx4ESkpTfjxzPkE9PcJIStrHt26\ndfIiZGNMAxDOdpw+YBbOL/pzcfZVzgHmi0hrVd0KtAEux9lroVJh0OsZQDnQAWiJszlPKXBPPdxD\nw1FYSOI7bzqtgtxlAFRkNKXo6uso7t2HsmOOqzo1ARgxogXDh09nzZrKbTLn2eqlxpg9Ek5L4Tjg\nFKC1qn4DICJXAluAbiLyIZACLFfVzaGVRaQd0B44TFXXAatEZDAwRkRGqGppPd1LdAoEiPv8M5Je\neYnEGa8RU5APgD/7VKdV0PVcSE7eZdWOHY8lO7u1rV5qjKk34SSFdTg7qX0TdKyy26cZcDRQqKpr\nd1M/G1jrJoRKC4F04HhgRa0ijgKVzw6kpyeTnX08CQkJO53j27qFxDemk/zyi8R9tQqA8gMPYse1\n/Sm+7AoqDmsV1r9lq5caY+pTjUlBVbcAc0MO3wIkAf/C2YYzT0SmAKcBvwKTVXWUe25LYENI/Y3u\n14NpYElhwYIv3I3uf9+l07HjsVBRQfySRSRNeZHEOe/gKykhEBdHSddzKb6iD/6OneyJY2OMp2o9\n+0hEzgMeAB5TVRWRo4AmOInjfuCvwKMikq6qOThdS8XB11DVMhEJ4CSWBsPv97sJ4ZKqY2vWXML4\nIU/Rpcc7NJk+ldh1ToOq7IgjKe7Vh+KLLyOw//5ehWyMMb9Tq6QgIlcBE4Apqnqne/hKIFVV8933\nq0WkKTAEZ0C6CEgMuU4c4MMZtK5WZmZabUL01LRp86taCHGUcj5vcg2TOPv7d4l5NABNmkC/fnDt\ntcS1a0eqz0eqxzHXJJo+/12x+L0TzbFD9MdfV2EnBREZCowExqjqoMrj7rTS/JDTvwTSRCQdWA+c\nE1JeuXh/aLfSTqJp8+z8/KKq149zGwMYC0AuJ1N65V9ok3MXgVT3G+2X7V6EWCsNYPNyi98j0Rw7\nNIz46yqsp55E5A5gBHB3cEJwy3JF5ImQKicDG93Ww1KglYi0CCo/AyeRrKxz5BGoa9d2iMwDYAYX\nMpK7OYpVXJ31dw5/8N7fEoIxxkSocJ5TOBZnrOA5YJKIHBBUXIDzDEKOiHwKLAM6AoOBgQCqmisi\ny4FpIjIAaA48hDMmUVafN+O1hISEqmcHFq7pwkJOtGcHjDFRJZzuo0txWhRXu/8Fu0dVHxCRUmAo\ncAjOFNZBqjo56LwewHhgMU4imaCqI/c0+EgU/OxARkYy2dn27IAxJnr4AoGA1zFUJxDt/XoWv3cs\nfu9Ec+zQIOKv8wYqtpKaMcaYKpYUjDHGVLGkYIwxpoolBWOMMVUsKRhjjKliScEYY0wVSwrGGGOq\nWFIwxhhTxZKCMcaYKpYUjDHGVLGkYIwxpoolBWOMMVXC2mRHRPYHHgE6A8nAR8DtqrraLT8LZzls\nAb4B7lLVeUH1M4Fxbn0/MBkY4m7QY4wxJkLU2FIQER8wCzgcOBdoB+QB80WkmYi0Ad4EpgHHA28B\ns0SkddBlZgD7Ax2AvkA/nK06jTHGRJBwWgrHAacArVX1GwARuRLYAnQDsoFcVX3QPX+YiGQDtwA3\niEg7oD1wmKquA1aJyGBgjIiMUNXS+r0lY4wxdRXOmMI6oHtlQnBVdvs0w/nrf2FInYXucXCSxlo3\nIQSXp+O0LIwxxkSIGpOCqm5R1bkhh28BkoB/AS2BDSHlG4GD3de7KyfoHGOMMRGg1rOPROQ84AGc\nPZYVSAGKQ04rwUka7Krc3Zs5EHSOMcaYCFCrpCAiVwGvA1NV9U73cBGQGHJqIrBjd+UiEgf4gs4x\nxhgTAcKakgogIkOBkcAYVR0UVLQeODDk9IP4rctoPXDOLsph526lUL7MzLRwQ4xIFr+3LH7vRHPs\nEP3x11VYLQURuQMYAdwdkhAAlgKnhRzrCCwOKm8lIi2Cys8A8oGVtY7YGGPMH8YXCASqPUFEjgU+\nBZ4H7g4pLgBaAZ8ADwJTgd7A7cAJ7pgDIrIMZwxhANDcvdZYVR1ZT/dhjDGmHoTTUrjUPe9qnFlD\nwf8NUtVVQA+gJ/AZ0B1nCqsGXaMHsAmn9TAJmGAJwRhjIk+NLQVjjDGNhy2IZ4wxpoolBWOMMVXC\nnpK6N4lIGs6qrOfiPOMwF7hNVX/2NLAaiMjTQIyq9g86Vu0KspFkV/EHlZ0KzFXVJns/svDs5vO/\nGbgJ5+n5/wKjVHWSNxFWbzfx3wX0x5mgsRoYrqpzPAqxWjV8/8QBK4DPVPXqvR5cGHbz+X8MnBR0\nWgCYtKt79NJuYm8NPIGz1NAWYLKqDqvpWpHaUngdOBtnRdUOQCqwQETiPY2qGiIyAueHN/hYOCvI\nRoRdxR9U1h5npVvfXg2qFnbz+f8N+CfOdOpjgFHAUyLSe+9HWL3dxH87cAcwEGiD8//gTRGJuDXD\nqvv+cY3EWVwzIlUTfxvgcpyk3Bznmazb9mJoNdrN986+OGvM/YLzu+dGYICI1Bh7xLUUROQ4nH0X\nzlTVBe6xK3AegrsMeMnD8HYiIofhzKg6ClgbUjyQalaQ3XtR7l4N8SMiD+PcxyqcH5CIUkP81wNP\nqupU9/0kd9XefsArey/K3ash/iScFvI77vt/uisMn0aEPONT0/ePe85fcT7zL/ZiaGGpLn4RaYWz\nf8xyVd3sQXjVCuN3Tx5wpbtvzbci8hjOitWPV3fdSGwpHIHTRFtWeUBVdwDfsvNDcpGgPc5Kssfg\ndE8Eq2kF2Uiw2/hFJBboBHQBxu/1yMJT3ec/AHgm5FgFzuq+kWK38avq/ar6PICIJIrIjTi/pBbs\n5RirU93nj4g0AV4AbgYisfu3uviPBopUdZfJLgJUF/tZwMzgjcxU9T5Vvaimi0ZcS4HfVlBtCfwA\nICIx7vtNXgW1O6r6Cu5fnSISWlzTCrKeqy5+VS0HTnDL/m+vBxeGGuJfEvxeRA7B6QoYvbfiq0kN\n3z+4x3vgdKkCDFPViPmLO4z4RwMfqerrInL93owtHDXEfzSQJyJTcP4g/RVn18gnVNXzufw1xH4k\n8JqIjAEuxHnQ+AXg4Zp2vIzElsIKQIGnRaS5iCTjPC2dCSR4Glnt1bSCrNlL3C1hZ+Mk5Yc8Dqe2\nluP0C98GDBeRaz2OJyzuispdcPqzo9FRQBOciS5nAWNxdoyscbA2AqQDQ4FSnAeK7wPuJIzYI66l\noKqlInIB8DLOD3AJTjac476OJjWtIGv2ArdveC7OZ3+aqhZ4HFKtqOqPwI/Al+L8Sfh3YKK3UVXP\nTcITgH6qmud1PHV0JZCqqvnu+9Ui0hQYQuRvJ1wKfK6qt7vvV4pIc5yliu6trmIkthRQ1W9UtS2w\nL7Cfql6L0+XyvbeR1VpNK8iaP5iInADk4vyQtI/g/uGdiEjXXXTbfQm02NX5EeYcnNb9NBEpEJEC\n4HTgChHJr7ZmhFDViqCEUOlLIE1E0r2IqRY24EwOCfYVkC4i1Y6pRVxLwX1G4W3gJlVd7R47FGc6\nW0RNBQtD5Qqy9wcdC15B1vyBRCQLZ3fAb4CuqrrN45Bq6xFgPs5Mkkqn4PxwR7o3cL7/g72I0+K5\nY++HU3sikoszHhK8MvTJwMZdJItIswQn1mDHAFtUdWt1FSMuKahqgTvrZZSI3AKk4Uy7ek9VF3kb\nXa09CXwiIvfy2wqybYmQ6aiNwIs4XXh9gEQROcA9Xqaqv3oXVtgeB8aJyKc4v2AvxBkoP8/TqMLg\nzhj8IfiYiBQBBar6H2+iqrUZQI77+S/D+YNuML9P0pHqUWCFOw31KZw/qu8CHqupYkR2H+GszLod\n+BCYhTMFr6enEYXndzMSwlxBNpJ4PqNiD1XFLyJHACfidNcpv1/dN9eT6GoW+v0zCecX0D9wui16\nAReq6rsexBaOBvP9A6Cqj+CMHwzF6YoZjLMy9GQPYqtJaOxf4UwnPwXne2cUzsyj+3dR93dslVRj\njDFVIrWlYIwxxgOWFIwxxlSxpGCMMaaKJQVjjDFVLCkYY4ypYknBGGNMFUsKxhhjqlhSMMYYU8WS\ngjHGmCr/D/nCt4i6I7Z8AAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x = np.loadtxt('x.txt')\n", "y = np.loadtxt('y.txt')\n", "b = np.loadtxt('b.txt')\n", "\n", "plt.scatter(x, y, s=40)\n", "plt.plot(x, b[0] + b[1]*x + b[2]*x**2, c='red')\n", "pass" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.1" } }, "nbformat": 4, "nbformat_minor": 0 }