{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Welcome to the Kotlin Notebook!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Basics" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's start with something simple: execute a cell with a simple arithmetics and immediately see the result." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:24:56.416908100Z", "start_time": "2023-07-01T16:24:55.936894100Z" } }, "outputs": [ { "data": { "text/plain": "4" }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "2 + 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Execution results could be saved in variables and reused" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:24:56.780894800Z", "start_time": "2023-07-01T16:24:56.405912Z" } }, "outputs": [], "source": [ "val result = 3 * 14" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:24:57.002898200Z", "start_time": "2023-07-01T16:24:56.669899300Z" } }, "outputs": [ { "data": { "text/plain": "42" }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:24:57.307907Z", "start_time": "2023-07-01T16:24:56.854896600Z" } }, "outputs": [ { "data": { "text/plain": "21" }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(Out[3] as Int) / 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Variables defined in the notebook can lose their nullability if they are not actually nulls" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:24:57.817903600Z", "start_time": "2023-07-01T16:24:57.161909200Z" } }, "outputs": [], "source": [ "val a1: Int = 1\n", "val a2: Int? = 2\n", "val a3: Int? = null" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:24:58.061904900Z", "start_time": "2023-07-01T16:24:57.670896100Z" } }, "outputs": [ { "data": { "text/plain": "3" }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a1 + a2 // OK, a2 was converted to Int" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:24:58.473901300Z", "start_time": "2023-07-01T16:24:57.896894200Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Line_9.jupyter.kts (1:6 - 8) Type mismatch: inferred type is Int? but Int was expected" ] } ], "source": [ "a1 + a3 // compile-time error" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Rich outputs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Outputs might be not only plain text. They could also be images and HTML. HTML can contain CSS and JavaScript." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:24:58.725894100Z", "start_time": "2023-07-01T16:24:58.395028700Z" } }, "outputs": [ { "data": { "text/html": "\n

Counter: 0

\n \n" }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "HTML(\"\"\"\n", "

Counter: 0

\n", " \n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**NB!** If your outputs contain JS, notebook should be marked as trusted.\n", "\n", "![trusted-notebook](screenshots/screenshot3.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Images could be loaded by link. In this case, it won't show if the link breaks or if you lose Internet connection" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "%use lib-ext(0.11.0-398)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": "" }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Image(\"https://kotlinlang.org/docs/images/kotlin-logo.png\", embed = false).withWidth(300)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also embed images. In this case they will stay in the notebook forever" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": "" }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "val kotlinMascot = Image(\"https://blog.jetbrains.com/wp-content/uploads/2023/04/DSGN-16174-Blog-post-banner-and-promo-materials-for-post-about-Kotlin-mascot_3.png\", embed = true).withWidth(400)\n", "kotlinMascot" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The cell can also have several outputs, to achieve it use `DISPLAY()` function" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": "

Kodee is back!

" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": "" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "DISPLAY(HTML(\"

Kodee is back!

\"))\n", "DISPLAY(kotlinMascot)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "With Kotlin Notebook, you can also render LaTeX formulae" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:25:36.593896700Z", "start_time": "2023-07-01T16:25:31.532914200Z" } }, "outputs": [ { "data": { "text/html": "" }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "LATEX(\"c^2 = a^2 + b^2 - 2 a b \\\\cos\\\\alpha\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also output BufferedImage's. They are embedded into notebook" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:25:36.659903900Z", "start_time": "2023-07-01T16:25:33.940897200Z" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAYAAAB5fY51AAAEcUlEQVR4Xu3SMY4cMQADwf3/p+1cHWvAE4pAJR3z9/v9/gH8EQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqoRPmN3Y+TOek/AJsxs7f8ZzEj5hdmPnz3hOwifMbuz8Gc9J+ITZjZ0/4zkJnzC7sfNnPCfhE2Y3dv6M5yR8wuzGzp/xnIRPmN3Y+TOek/AJsxs7f8ZzEj5hdmPnz3hOwifMbuz8Gc9J+ITZjZ0/4zkJnzC7sfNnPCfhE2Y3dv6M5yR8wuzGzp/xnIRPmN3Y+TOek/AJsxs7f8ZzEj5hdmPnz3hOwifMbuz8Gc9J+ITZjZ0/4zkJnzC7sfNnPCfhE2Y3dv6M5yR8wuzGzp/xnIRPmN3Y+TOek/AJsxs7f8ZzEj5hdmPnz3hOwifMbuz8Gc9J+ITZjZ0/4zkJnzC7sfNnPCcBYFUCwKoEgFUJAKsSAFYlAKxKAFiVALAqAWBVAsCqBIBVCQCrEgBWJQCsSgBYlQCwKgFgVQLAqgSAVQkAqxIAViUArEoAWJUAsCoBYFUCwKoEgFUJAKsSAFYlAEz6D5tIz0MBx/WUAAAAAElFTkSuQmCC", "text/plain": "class java.awt.image.BufferedImage: 300x300 px" }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import java.awt.Color\n", "import java.awt.image.BufferedImage\n", "\n", "val width = 300\n", "val height = width\n", "\n", "val image = BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB)\n", "\n", "val graphics = image.createGraphics()\n", "graphics.background = Color.BLACK\n", "graphics.clearRect(0, 0, width, height)\n", "graphics.setRenderingHint(\n", " java.awt.RenderingHints.KEY_ANTIALIASING,\n", " java.awt.RenderingHints.VALUE_ANTIALIAS_ON\n", ")\n", "graphics.color = Color.WHITE\n", "graphics.fillRect(width / 10, height * 8 / 10, width * 10 / 20, height / 10)\n", "graphics.dispose()\n", "\n", "image" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Generally, you can display any output using `mimeResult` function.\n", "We're using [Jupyter approach](https://docs.jupyter.org/en/latest/reference/mimetype.html) for outputs." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:25:36.742900200Z", "start_time": "2023-07-01T16:25:34.835907800Z" } }, "outputs": [ { "data": { "text/plain": "JetBrains logo", "text/html": "JetBrains logo" }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mimeResult(\n", " MimeTypes.PLAIN_TEXT to \"JetBrains logo\",\n", " MimeTypes.HTML to \"JetBrains logo\"\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using libraries and dependencies" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can always turn on source and binary dependencies of a current project.\n", "To do it, use the corresponding button in the toolbar." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:25:37.349895400Z", "start_time": "2023-07-01T16:25:35.144897600Z" } }, "outputs": [], "source": [ "import java.io.File\n", "import javax.imageio.ImageIO\n", "\n", "fun showScreenshot(id: Any) {\n", " DISPLAY(ImageIO.read(File(\"screenshots/screenshot$id.png\")))\n", "}" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:25:37.373896800Z", "start_time": "2023-07-01T16:25:35.378898800Z" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABKgAAADuCAYAAAAdkz9HAABQQElEQVR4Xu29ebAtx33fd/9V/rRKZUdVrsS2bCuqrJZN5yaOspVdiZWkXKxUpRzZJVZUdWMmEQEQxCKK2iCSjyTEAxFyoYoAKVAkCIMCRZEgdflEAeAC4PGBxPrwhOUSeADx8EDsmwBiIYHO7ZnpOT2//vVM9yznnDv386n6FN+Z6enp6Z4znP5iztytl156ySAiIiIiIiIiIq7LLbkAERERERERERFxlRJQISIiIiIiIiLiWiWgQkRERERERETEtUpAhYiIiIiIiIiIa5WAChERERERERER1+rWAw88YBAREREREREREdfl1r333mvavPvuuxERERERERERESeTgAoREREREREREdfq1ssvv2zatIUAAODgIH/LjYiIiIiIuOkSUAEAzAx5oUdERERERNx0CagAAGaGvNAjIiIiIiJuugRUAAAzQ17oERERERERN10CKgCAmSEv9IiIiIiIiJsuARUAwMyQF3pERERERMRNl4AKAGBmyAs9IiIiIiLipktABQAwM+SFHhERERERcdOdLKD6xl9/zNz0U6fNsb/2fXP8Jx8yt/7Uvea7f+Muc9tP32pu/5s3mTv/w+vNXX9719z9d//U3PP3P2dO/txnzF/+x58w9/1nl5n7/8ElZu8ffth87x9fZB7cfp859U/OMw//t2eZR/77f2Me/ae/IncFAAAe8kKPiIiIiIi46U4WUN3w02cmCameXVwtdwUAAB7yQo+IiIiIiLjpThZQfe1vPj56SHX6X37EvPXq63JXAADgIS/0iIiIiIiIm+5kAdVX/4MnRg2pHvyv329e+8vTcjcAACCQF3pERERERMRNd7KA6it/+8lRQ6pnr7hF7gIAABTkhR4REREREXHTnSyg+tLffao1pHr80ufNize/Yu7953udIdUj//pPjHnzLbmLjeDo1VvmJy5ZmO/JFbBWDuu4fO/6bfMT5++Yo3LFCinaMKO+34Q+zUVe6BERERERETfdyQKqL/z9p6Mh1T3/+9N1uVcffN3c/rdOREOqe//hvzOvf//FuvyPn3ul/neMIpyITSifXJhfOH/L/ML1e3LNPrvmnfvrfuLqXbkiymENQnpxckcdF9uH/94FsTHpR3Nc9szHLhlxnPaPw7Y3Xl95Ho15PKlsQpiSFFAV58K2+diTcoVj5DEbwBR9+uprr5lHTp+RiwO+v1/Gls1FXugRERERERE33ckCqmt/7lk1pPrG33ncvPrIjxpln7ji2ejP/Z7744caZR9793WNzypVgPDOk3JFOdmMhgtVeKVtF2OeAVUZsOT0QxJaQNUyVmnobV1FQBVv99CASj+mFKYIU3IhoOrmkdOPma/fctx87+FH5KqaBx/+flHGls1FXugRERERERE33ckCqmv+k+fUkOrhy/5KFjXmLWPue/v3g5Dq1M5tjWLP/8kDxTupuokHBDa4+IVL9AlnORFtmzSHzDKg6hHUJSEDqtan2RKJtHXScamO453RJ/Xi518SkWNKYYowJZdxAqrNYao+teFULKRy62xI1Qd5oUdERERERNx0JwuoPvufPx+EVN/6X541bzUfnqp5/fSPzG1/5/46pDrxXxw3P3r29eX6R1829/6ja4p3UqWgBxTVkynX6wGAvk07fbbZeAYEJK00Aqrq55RD+y7S1knHpT6O2E9CCag6+744xsMdUFm0kGpoOGWRF3pERERERMRNd7KA6tP/4IVGSPWnP/e0ef6eZTr1+jNvmnv+7+eKp6ccT139UvnX/f79u8wL1z9fL3/rx2+Z7/0f36xfnJ6C+jRUHSxUPx9qBAuRUKEKC9xPuuTEWw9CyvrdNsV2IsRw712q1ysT4OXEuGxbUJdsWxCUKGWCtjaR7dLqlWW0tqt4AVXRbx3bde1HrvfbKscl+ln0TzD+Gt5xqOdZ7FwyYZtzjqmgYzyX50zzHAzbuETuU7bJJ6WsFlC57eo+SQio5JjFjs3qh3lyuyXNnw2mngOx/bb1aQ5+SOV+1qc9VZWDvNAjIiIiIiJuupMFVFf+o5caIdVdH2q+3Pzus14o3kl1+pMvN5Y/8Es/MA+/5weNZU/8wcONF6cnoTyF4k9cg0msUj78CVoYbMXqCcKv+rP+5FBRj5jw2olxEAK4NsmfKQZt1ZaF7VfR+qIgve0qVbDzMTXU8cnYT6Stcly0z0Xf+vtIfR9W40kw7V1JWkA1/JhSxnN5zujnUrPOjDZllJUBlVamb0CVdGyxcRT9mnoOJO93AC6kGvrklENe6BERERERETfdyQKqT/yXf1WHVF/8n180P3pl+ajUUze9Xr+T6oa/9wPzykM/qte98fSb5k2v7Ct3vWzu+Fs3N16cnoacvJef68m9eAdO+DMeuX2F2E5OouVnSXx9uD/96ZzIhN8tr+sO6ytIefdPJCDJabtKNfkvJvstZbP2k9hW9XPQD0r9Go2AyihtCAMquf8lyj6D+ixKOYtyHsdCE9kG+XlJuK+csn5AFTuHhwRU3ccWtsmSFJwp26bvtz/uyakxnp6yyAs9IiIiIiLipjtZQPXx/+rlOqR67KYf1ct//Opb5uj/+Fzjxem3/m9Pm7d+7G1c8eZ+2Xv+yX3BX/dLpZyAVkFCMCGu3kdVTDrDSakeEoTLmxNUv06NMLjwkSGZ/OxIWp7YfhW1TF7bVVywEzwJ5JO5H7Wtcly6PztiyxvIgMqIcy04Bvm5SdIxacuU5UFdHs11OW3KKbsMgo62BDtlu/V2OuRYyP34yHXys3YMsv7Y8rCuJW3rUvHfOaW9k6oP8kKPiIiIiIi46U4WUF3237xShFQ3vu/VxvK7PvpD9a/7nbo0/Ot+D5//dPlOKvHX/ZLxni4JJ5J+KBVOXt3E3z3xI1UDqliIUKPsx0cEH2GbM5Yntl9FPY68tqt4ZWxb9XZk7kdtaxgydH12xJY3kG0o8Nstj0F+Fsj6tGNKHM/YuWHJCZ2abcopuxxbq3yKqWbigMq1ue5D2ccmrD+2PKx7Sdu6FLRASluWi7zQIyIiIiIibrqTBVR/8N+9aj75z39oXnlm+XO9Z+//sbn658O/7mdDqj//mSfNSyffqMs+d8Or5thPft8c/8mHgpAqneXEuph0aj/5sZNL7WdvWkigMGZAJSe78rMjaXlnW1pQt81ru4oICcqnjuRPrDL3o7Y1DBm6PjtiyxsoYYelbJs9HnkM8nOTpGPSlikEdXnkBFT9y1afbR+eLH/SGduuCzkWcj8+2jp/e+37L+uPLdfqdrSt68L9rE9759TQkEpe6BERERERETfdyQKq3/8fXjN/+ZXl7/beetOY6/71K8Ff9/NDqpv+2TPmzdffMm88+6Y59p/+wNz0U6fNsb8WhlQ5lBPTnebTFI5i0r9t3nl1NaFurFR+9qfQnMx2byMnv0vCbWOT37TlYX3JRMKQnLarBMFOGXzIY8naT2Jbuz47YssbBMfhqNp3yXbRJj+YidebekxKOYVlSCbXhNvntCmnbB1Q2Q8DQiq5z5xjK3DB88nyey63k/XHlmfvN4FHTj8WDaccLqT6/ukzclUn8kKPiIiIiIi46U4WUH3u3W8Ys3x4ypy45o3Gi9NjIZX9uZ/96343/PQZ842//pgaUuVgJ5fFT43UCWYZkER/ilRNroMnidqCjmqbZn27y7/iV4UPcmJc1CNCj7QgqmV5Qvt1Ik/MZLRdRQt2tDq1ZSa2H72tcly6Pjtiyxtox+Go2h6EMiMcU8p4Ls93JfST+8lpU0bZRkBVfQ76IzgWF+7Fxyjr2ArKOottlDGV9ceW5++3m1dfe60IqbqwZWzZXOSFHhERERERcdOdLKB69vQynXrpibfMFf+sfCfVGCFVFpGJtcNOMsNJv0c1kfb1y8rJbMky+NK28SfOzrAOJXDqs7yj/VG87ZphW1rbVSLBTh0ANOrJ2I/SVjkuXZ8dseUNIsfhcOdUEDANPCa53OmPZ30OeEFZUUe0vRltSiwrAyq3rFG+Z0CVd2yRcKxC1h9b3me/60Ze6BERERERETfdyQIqny9e+EbxTir34vShIRUAHD7UALaDPtvMAXmhR0RERERE3HQnD6ju+8ab5qP/9PXinVRjhVQAcPjID5v6vyPqoCMv9IiIiIiIiJvupAHVq39lzKW/9GPzkf/pjVFDKgA4fOQGVLnl54S80CMiIiIiIm66kwZU1/3bt8z7/9c3zZFfHDekAoDDR2rgVL/vKqHsXJEXekRERERExE130oAKAABWj7zQIyIiIiIibroEVAAAM0Ne6BERERERETddAioAgJkhL/SIiIiIiIibLgEVAMDMkBd6RERERETETZeACgBgZsgLPSIiIiIi4qabFFB94t8dRUTEA6K80CMiIiIiIm66BFSIiDNTXugRERERERE3XQIqRMSZKS/0iIiIiIiIm+7Wvffea9okoEJEPFja6zYiIiIiIuJBcuvUqVOmTVtITn4QEXFzlRd6RERERETETTcpoJKPXSEiIiIiIiIiIo7l1unTp43m8ePHCagQEREREREREXFyCagQEREREREREXGtElAhIiIiIiIiIuJaJaBCRETE3j711FPmnnvuMbfeequ5+eabsae33HKLueOOO8xDDz1kXnzxxaCfEREREefu7AMq9zZ4uRwPh4z/tM6lf+dyHIir9syZM+bYsWNFwHLixInivuHRRx/FHt5///11yHfXXXdlh1RcxxAREfGgS0CFs5bxn9a59O9cjgNxlb7wwgtFoGKf/HnmmWcMDOeNN94wJ0+eLEIq+ySV7PM2uY4hIiLiQZeACmct4z+tc+nfuRwH4ip97LHHiiDlkUcekTkLDMCGVPYe7Pbbbw/6vE2uY4iIiHjQJaDCWcv4T+tc+ncux4G4Sh988MEioPrhD38oMxYYyH333Vf8dFL2eZtcxxAREfGgS0CFs5bxn9Yh/fulE0fNDfffFCxfh0OOA/Gw+r3vfa8IqGB87P2X7VvZ521yHUNERMSDLgHVAfeLX/xituvuD9kepyw3hnMf/3U7pH8/e/ufmH95zTvNh77+B+bRpx4L1q/SIceBh097rmzK9dRXXlOnvLZaCaimg4AKERERD6MEVAnal79ec8015v3vf79573vfaz7+8Y9nv7x0Kt/1rndlO+WEJUXZHqcsN4ZjjD/GHdK/LqCy/l+fP8d89d4bgjKrcshx4OHTXkM35XrqK6+pU15brQRU07FJAdWzzz5rPvOZz5jLLrus0P7bLpPlEBEREYdKQNWhvQn7wAc+ENzwn3vuucU7ImR5qb3BPPvss+vtxg62ZLtSXOWEyp/IxdqQUqavQ8e/y9///d83l1xySbB83a5qAj2kf/2Ayvm71y/MI08+GpSd2iHHcRic6hy69OZPmGde0Ce6Xzn5NfOdU3cEyzfBVX2/2oxdN1Mcq80EVNOxSQGVfQm+PIfsMlkOERERcahrC6hsvfYm2TrVPqxDb9iuu+664mbsgx/8YHEz/sQTTxT/9dAu+/CHPxyU95Xh1Cc+8Yniz3LLckOUk44Uh/RHrrFJlA11XHvsv+V6dzyyvlyHjn+bH/rQh+q2HjlyJFi/Tv1+H6MfYw7pXy2gsr7j2rPNdfccNS++9GKwzVQOOQ7nmTNnzAMPPNBLu62sbyrtNche3//wD/+wuK7Zp0J/8zd/0/ze7/2e+cIXvhBMPN25JOsZQzve5/7Zb5sHHv9esM6eH7/0uf+3+N8XX1zduZDiqr5fbcaurSmO1WYCqunYpIDqxIkTwTlkl8lyiIiIiENdW0C1qhv8oTdsl156adHGO++8s15mJ3jnn3++Oeuss8xTTz0VbGNdRThl9W8Y5bpNcN2TqKHjH1M7rjHaO5YH4fsVC6icv/HnHzYP/uBUsN0UDjkOpw2avvGNb/TSbivrm8I77rjD/O7v/m5w7vra69qnPvUp8+STTzbOI1nXGLqx/uVr32X+/L6vN9b558dF13/UnH56dSFel6v6frWpXYNSHavNBFTTsa6A6t57721cj+y9z2KxCM4hu8y/L7Lb2G1lfYiIiIg5ElB1aH/CZdtoJ3ZumQuo7PLHHgtf7ryqcMrq3zDaz30nLbLesezbHusY58XQ8ddsO6Yx2jyGB+H71RVQueDi83d92bzw4jTfH+eQ43BuekB19OjRxnWpywsvvLDxWdY3hnK8/Z/8HT91WzH+bt2/+dPzN+Ynf6v6fm26BFTTsY6A6vHHHze//uu/XpzXH/vYx4qgWl4XpLaMLWv/bbe1dch6EREREVMloOrQtdP+hMu+P8o+MXXVVVcVy37t134t+OnJKsMpq3+jaD+3hSdtynrH0m+P/7O+mP7P/cY4L4aOv9Q/HvukifbvMdo91IPw/UoJqJz/9uY/DLYf0yHH4dzkgOpb3/pW4/t+wQUXFOeF+3mhvbZ9+9vfrieamrLOMZTjbPV/8mf/13526zblJ3+r+n6lKK+hXcrth7jJAdXeYttsbS/MnlxxQFhHQPXpT386+N7nauuQ9SIiIiKmSkDVoX1J+u/8zu8EN2FO+18P3WRp1eGU1W+L/ez3a46y3rHMHefc8l0OHX9fv212nC+//PL68xVXXNEY+zHaPsSx+zHmkP5NCaj+z8/9P+bj3/60eeq5p4Ptx3TIcTg3NaCy13P7Rx3c+WBDYPsuPVnOaf9KqSvrK8uNoRxvp/+TP/tElX2yyl+/7p/8rer7laIcpy7l9kMcJ6DaNTtbW2ar4c7+0mFMFVDZ7+pXv/rVLO02uaw6oLJPPvnXCen73ve+4p7Gav8t1zttHTxFhYiIiH0loErQvovF/ldBe1Nmn5T5yEc+0ggjXEh100031ctXEU5Z/RtD+zmnX+W2U5jTnj7luxxj/K0ynLrllluCth47dmxjQirZNrl+LIf0b1dAdc5Xfsvc+f0TwXZTOOQ4nJsaUP3RH/1RfS7Yl6K3/Xl4/7yRyrJjKMdc6v/kzwZW6/zJ3yc/+cmgT6S2jNxuamUbupTbD3FoQFWESFtbZkekUXuLHbMYmCxNFVC99tpr5uKLLw76NaYta7fJZdUB1fPPP2+uueaaxtPAThtaP/PMM3VZ+28tyLbb2jpsXbJ+RERExBQnD6js9nbSI3XvdrLaf8v11qH7dvsfox7pN7/5zWhIZScpqwinrP7Nof3sTzC7flInt51Cfz/233K9NLd8l2OM/97eXj3WLpyyy7W2+iGVvVm328r6VqHWtikc0r+xgOpf/fH/Z67aX/fcC88F20zlkONwbmJA9dxzz5n3vOc99blwzz33BGWc8pogleXHUI695ib85M/Wb//aoewTqS0zdVuksg1dyu2HOCig2t0xW1vbg4OoGFMFVBZ77BdddFHQt1Jbxpbtw6oDKuett97aOAb7Xik/nHLaZe59VU67rSyHiIiImOPkAVXXpKfNMSbWY9ywxXQhlX2yyoZB/s/9VqXfX/Zz3/6W9Y5lblCSW77LscbfBo/vfve763DKGmurDalsWbuNrGcq7XfW/xxrm1Z2iEP6Vwuo3nv0iLnvzOpDvSHH4dzEgMoekzsP3v/+9wfrnSnXDbnNGMrxj7nun/zdf//9QX/EtGXl9lMq99+l3H6I/QOqPbPY3jLbiemUe9KqVj5yZWze5a3fXphdJaBq1jMsHHv66aeDgMbXrrNl+rKugMru1z8O+zS4LOO06/yydltZBhERETFHAqoBuqdlbEDlXi686pDK7y/7uS2YkMptpzCnPX3Kdznm+Mtgp62tsuyUrjM8G9K/fkD1jmvPMl888dXk707XdUWW73LIcTg3MaCyIbrrkyuvvDJYv25lEBVz3QHVJivP/S7l9kPsHVDtLcx2YkBUBk/+O6nKcMsPqYIyRf1lUOV2UZTxA6viCa5h77p69NFHzXnnnRf0sV1m1w2BgAoREREPo5MHVHZ7O5mUHvSf+Mn3DfmuMqTy92s/+xN3fuI33fhbx25rH9f988Mh/esCqvffcIl55MlHg/Vt+tcVdy3xz21Zvsshx+HcxIDqa1/7Wn0eXH311cH6dSuDKM1N+Inf9ddf3zi/2rRl5fZT6l/HU5TbD3HygKoKmoIHphrbly9Zl2UaP/FT91cGXXK7XOwTc+ecc07dv/bfdtlQ1hVQ8RM/REREXKeTB1Qx7Y28u6npM6FMdYwbNnsjZl/8aX8ic/755xcTYj+csn/B7etf/7r6TipZ19j6N4f2s9+vOcp6xzJ3nHPLdznG+Mccu6199dux6he4D+nfL504aq6//5vB8lzdscrlOQ45DucmBlTf/va36zG/7LLLgvXrVoZR0k14Sbq9/vsBRJe2rDahn0q5/y7l9kOcPKCKPuXkhVKRMo2Aqijj/5XApak/M2zjtttuK0J/q/33GKw6oOIl6YiIiLgJElB1aP/i1Qc+8IHgRsxpwyn3QvRvfetbKw+p/LbYzzn9Kredwpz29Cnf5dDxb3Pstg5RhlSXX355/dmeo1OEU9Yp+zdVAqq4Dz/8cD3u9mXpff+C39D+jSkDKecm/aTvO9/5TtAXXdptZD1TKffdpdx+iL0Dqipg6gyHIuFTv4AqLDMmN954Y+FYrDqgevzxx825554bnC9O+yoD+5M+q/23XO+0ddi6ZP2IiIiIKRJQdXjdddcVbTxy5Ih58MEHzZNPPmk+85nPFMsuvPDC4K/1rTqksn3ndJ/dvvmJ3/Dxb3Pstg7Vb4//X8H9f4/dzin7N1V33HJ5jmMcxyYGVFb75Kcbf3s9k+ud8pogleXHUAZT1k34SZ/vZz/72aAvurTbyHqmUu67S7n9EPsHVO6F5R2hUcpP/CJPYzXeORWrZ4NZdUBl/fSnPx2cL7naOmS9iIiIiKkSUHV46aWXFm28884762U2lLI/9bPLz5wJ/yv+qkMq365JZkxZz1jmjnNu+S6Hjn+bY7d1DNvGf4o2Ttm/qRJQtWvrd+eA/fnZHXfoP4trO3eG9m9MGU75P+k7fuq2tfykT/rbv/3bQV90abeR9Uyl3HeXcvshDgmo6pedK+HS3mKnXha8AD14SXr1OXgBuvKSdFnPTvOv/G0S6wio7JNP7r1S9g+/2HsXef5IbRn3R2Lstjw9hYiIiEMkoOrQ3XhpAZV9MuWpp54KtrHav5K2jpCqa5IZU9Yzln3bYx3jvBg6/m2u6hzOVevzqdo3Zf+mSkDVrr3uXHzxxfW5YEOqP/uzPzPPPfdco5x23vjKesfQhU/+T/qc/l95XOVP+nwfeeQRtR+6+spqt5X1TaHcb5dy+yEOC6gqtPdD+WGTcU9btb03yoVdlTu7zZ/4VZQhVVs9m8M6Airrvffe27ge2XufxWIRnEd2mX9fZLex28r6EBEREXNcW0Bl67U3+dap9mEdesPmJiL+T/yuuuqqepks77uOkCpl4qQp6xnLvu2xjhGqDB3/Njc1oLJ+6EMfqtvWdZ4Occr+TXVTAir7NKWdpPVRexJzTG39v/Ebv9H4fl1wwQXF+8m+8IUvFGW6vquyzjGUP+nztQHVOn7S5/sXf/EXaj909ZXVbivrm0L5l9TatGXl9kMcJaAClXUFVJonTpwIziW7TJZDREREHOraAqpVOfSGzb5U+KKLLgpuzuxTCPfcc09QXipDqoceeigoM6YpEydNWc9Y9m2PdYzQZ+j4t7nJAZXV/rVJ+x4yuXxMp+zfVDcloNp0H3vsMfPhD384+J65vuv6rsr6xtD/SZ/0Kye/tpaf9Pnav3yo9UNXX1lX9VcTv/vd77a+tNppy9iycvshElBNxyYFVNqThP4Tgtdee23xOoSYdr2sExEREVGTgCpB+zM++2J0+wTCeeedV9xw+Y/A4+Y6xvhj3E3oXwKqdO3Pk2+44QbzW7/1W43Jpl3XFbrIuubu888/X/zlQ60fuvrKare1dch65yQB1XRsUkBl/0OdvQeyoavV/tv/i6B7e3vmF3/xF83P//zPB9rldr2sExEREVGTgApnLeM/revqX7tPGxJYr7zyyuJpMfe5z9Ns6zqOdWonjd/85jfNl7/85eKz36eacvu5a1/2LPvA9UNXXznn/sJoAqrp2KSAKkUtpCKcQkRExFwJqHDWMv7Tuq7+tZN/+cSKfMolx3UdB+JB1r6X0YYoP/zhD2W+AgO57777zLFjx4I+b3Pd1zE/pCKcQkRExD4SUOGsZfyndS79O5fjQFyl9r1mNqCy7yOC8XjjjTeKe7Dbb7896PM2N+E6ZkOpX/mVXyGcQkRExF4SUOGsZfyndS79O5fjQFyl9p1mt956q7nlllvMM888I3MW6IENp06ePFkEf7l/VIXrGCIiIh50Zx9QISIi4jSeOXOm+CmaDVROnDhR3Dc8+uij2MP777+/CPxsX951113mxRdfDPobERERcc4SUCEiImJv7V+6veeee+pwBftpn0S74447iienCKcQERHxMEpAhYiIiDhjr732WkRERFyB8v+DMU8CKkRERMQZa2+YAQAAYDoIqMaRgAoRERFxxhJQAQAATAsB1TgSUCEiIiLOWAIqAACAaSGgGsekgAoRERERD6YEVAAAANPiAir5/8GYJwEVIiIi4owloAIAAJgWAqpxTAqoAAAAAOBgQkAFAAAwLS6ggmEQUAEAAADMGG6YAQAApoWAahwIqAAAAABmDDfMAAAA00JANQ4EVAAAAAAzhhtmAACAaSGgGgcCKgAAAIAZww0zAADAtBBQjQMBFQAAAMCM4YYZAABgWgioxoGACgAAAGDGcMMMAAAwLQRU40BABQAAADBjuGEGAACYFgKqcSCgAgAAAJgx3DADAABMCwHVOBBQAQAAAMwYbphLdne2zNb2wuxFPgPMhb3Fttna2jG7csVADsp35qC0cwqmGvscijYcwv4noBoHAioAAACAGXM4bph3zc7WVuvETE5a5ec50T5B3DOL7f1j34n11Ijs7uyPiR2XptsLvWX9qY4pesyromrH5MfbzlQhxfDvzGrGaXg7O3DndXQf5fVo1eNumWrsc2i//swXAqpxIKACAAAAmDGH4obZThi3t832/qQwlrvISav8vB7KiWyszX1pnyCuOqDaNo15+t6iGKdx9z9V8JExPlVoEYQS+8uDZRMzVUgx/Dsz9jjp4zO8nR14wavcd8nQgEo/rhSmGvsc2q8/84WAahwIqAAAAABmzPxvmMtJr50Mtk1M5Tr5eS1UYU2fiWgb7RPENQdUxk2iw+UbR/L4rLBPE5gqpNiI74xPZHwmb2dxXu+YHbsftZ8HBlSR40phqrHPof36M18IqMaBgAoAAABgxsz+hrmYzFVhRyQQschJq/y8FgZMRNtonyCuMEyJjcdExz06ye2sfmLaXXAlTBVSbMR3xicyPpO3swqodqPjTkA1af9vKARU40BABQAAADBj5n7D3JwMLZ+mkshJq/zsKJbbSWdtc7KnbldNKJv7bQ+Cwv2EZcMyaRPP9gmi3q5gX7Ld7qd5zmj9HrGAqvqJlNtF3aeRd/sEbVP6oW1c2tusvDdqv2HhPsvlMcryyrF6qG0saP70bRkyuHerif3L4xLtWm4vjy3evvB40/o42K6ljyyyjvqzOCbtO+wT7Nfbd6xOtW2yjDo+gjqgcn0t+zUeUIXtVq4vkeMq6GjvVGPvSCmrXX/cdnOGgGocCKgAAAAAZsy8b5jDiWDsCYLoxHhZogwD1ImVN7lTQpdyn3LbhPfIRJ+USGxLBG2CuEQGVNp7gfb3r0yKl/0s64ig9JVFjlE96Q3qS++HYDxT2uwm+439esceHR8NL0yK9b0I5mrEfurzyT+P3fFsi/M7OE5/e/08be6/bx8nnDcKcpzqsffrifWTJDI+bXU2QqOg75RzRMMLqKL9IPeV0c+x40pp71Rjn1NWXn+0MnOEgGoctk6fvt1oHj++a06dOk5ABQAAAHCAmfUNsxaARCZ36sS45fMSOQkMJ592252F3a8XHDQmsRES27pEtkVHThCbyDq6gjRZvkLre4lWRgkfygls2Fc5/aCGJx1tjtdfERmfNpYBgVa33i45XvpTOa6fIsuD7fV2y7Ly85Kwrc2yXeeNjtyffkzhvlUi45NWp/xcoZ2zEvndDtqhXyNS+zmsr1gYlrOI9q5m7H3Csv75HDuX5wgB1TgQUAEAAADMmDnfMOuTpnDCZJFltcm29pMci/rET12/3dZOwJoTdhk6qKgT0by2aLTvW/ZP9Tk2iVTb2LLcpwqjmob7kWNTLc3qh0YdsbY1licELLF6Emh/ksUfv/A4wzJ5y+Vnn+a6cN8+sp7mOHWcNxHkWMvPjtjyBpHxiW2bf45EkAFVscj2Raxf5ecmsp/VNmjLlOVBXR79xz6nbPV5v593q+9A0OaZQkA1DgRUAAAAADNmvjfM5aQpDECczYmznLTmBFTBhNT/bP9d1WPrLOsoJ+/R+hzqpDOzLQpywthEBlQl5QS70l9XtTHs39LWyWfK0yhGjkW9NKsftPBBtrXRZrXvBSllWqnO0caxiWBMGc/Y+KUul599coIH2TZtnKLnTQRZh/zsiC1vEBmf2LbZ50gMZcyafSn7VX4WyPq040ps7zRjn1PW7adqW2tHzgsCqnEgoAIAAACYMXO9YW6biLnJnD+hkpPWnIAq2Jc3gVyGUqacqNk6i/XdwYw6Ec1ti0J7mfb664mwmMj3mmdOGFDJY9TCh9Y2j1WmA9lOi9/W4t9iB9o2OcvlZ5+ckELWo49ThTxvIsg65GdHbHmDyPjEts0+R2LIQKmi7K/l05SpAZXsZ7Vt2jKFoC6P/mOfU7b6bPu56Kf4dnODgGocCKgAAAAAZsw8b5j1p4CWVOtbJsJdn5do+3JPSC1M+fM+t7gKphbLp6paiUw689qiEKm3ICU0apRJ3KdGyr5M/Hhjy7U2NcuG60MSyrT1YyJFu2Rg4PplVw8y5YQ/d/kyKGkUs2uCY+7fxwoJ4y3rkJ8dseUNIuMT2zb/HIkQCajqOre3i3a1BeRLlHaox6WUU1j92Idl64DKfjhEIRUB1TgQUAEAAADMmFneMKsTOIGYLMsJlvzs6pSTMDVgMG4Stj8RbZSvJmvJE7LIkwmZbdEoy4qJqqu30XG7wV9eC/qmmmQ2i+1vp05YPRICC0uwP0dGPwR1pLS5KhPvj8j4BNhyyrhEJ+fL80QeW7E2MYiKLS8/R/pIbt+7jxPOGwVZRn52xJY30ccntm2wPOUc0YgGVGbZn7JdGf0cO66U9k419jllGwGV+6wdz8wgoBoHAioAAACAGTPHG2ZtUhRSTvJc+CAnp/JziRccOIMyFdWETU663GSsNTzzcSGJ19aSjLbE8OuuDNtV9VPXfpLqEgwNqArS+kGtI6nN4fE386rY+PiEdZTGj71t0i4Dp9zl9WcvLCkNty3p08fKMSvbSOQ4yc+O2PIAZXxi26rLk84RQVtAZar9bGljm9bPBcpxBcuV9k419iVpZWVAVS/bLz9nCKjGgYAKAAAAYMZwwwyHATV82GBkqAQABxsCqnEgoAIAAACYMdwww/wJ34Oz2Ry09gJAFwRU40BABQAAADBjuGGG2ZP4U8JNgaenAOYHAdU4EFABAAAAzBhumGGe+O/DORjhVOwF1gBw8CGgGgcCKgAAAIAZww0zAADAtBBQjQMBFQAAAMCM4YYZAABgWgioxoGACgAAAGDGcMMMAAAwLQRU40BABQAAADBjuGEGAACYFgKqcSCgAgAAAJgx9ob57533dURERJxIAqpxIKACAAAAmDEEVIiIiNNKQDUOBFQAAAAAM4aAChERcVoJqMaBgAoAAABgxhBQISIiTisB1TgQUAEAAADMGAIqRETEaSWgGgcCKgAAAIAZQ0CFiIg4rQRU40BABQAAADBjCKgQERGnlYBqHAioAAAAAGYMARUiIuK0ElCNAwEVAAAAwIwhoGr3Z95z0ly/30+nrv9OsE6aUxZ1/8X1L+/34JPmvPfcGKzD/p53wnbrw+ZfHMJ+3YRzqmjDxP0/5zGew7ERUI0DARUAAADAjDkMAZULjvpMUnNCp9SyP3PVk40xcHRtl+vPvOc75nK7qzVO7NrCAa19beWnVmvPXJx6gl+f05F9pH43pnCd55RzjICqPA7Jy+byj5Z1Tj3G63QOx0ZANQ4EVAAAAAAz5lAEVHby/OTL5tT+8V5/Vd4EJ2dinVq2nMwvJ5bFso8+XLTPnDgZlO/rVIGLO86UvmwLB7T2tZWfWq09U5nThznG6p16gu+HrnLfxfrE70bM2HGluM5zyjkkoGoL2M87Ma+AKjbOczg2AqpxIKACAAAAmDFzD6hc6GAnxn0mOTkT69SyWkBlLSfS4fJN04VpchKpmRsO5JY/qOb0YY6xevuc+zmW5/ST5nq7H2X8Ur8bMWPHleImnFN9A6o6nEoIrqce41UYG+c5HBsB1TgQUAEAAADMmNkHVMWEpwx9YsFQmzkT69SysXbEJmebZk47c8OB3PIH1Zw+zDFW79QTfBdQnRcJVFK/GzFjx5XiJpxTfQOqnLZPPcarMDbOczg2AqpxIKACAAAAmDFzD6j8iaH/NJUsZ61/4lVjQyR9Yp1TVhoNqKqfSbnJWT0pi7zfp1jfIJzIahO7+ueE9WbhxC88PlOEDuE+TRBG+HZNsGX7luXl/sP+ivVPrO0p28r2WFP6K+iXlj4Jylq09jWI92F8G1PXWx+XPBalnSnHK10GVDeqTwK2BVRhu5vHGq43jXZ3tTfnnIrvM97/KWW1gMptp/WJtT6PlTHSlOduyveg3q6lTNv6eN+GIVNXe4L9WHqcv5sqAdU4EFABAAAAzJg5B1TapDgWmNSTXH/iW7/7pVlHTlnNWEAl21ZP2MQkrN6XOuFt1htMWqu2uzZqk+Do8VWfY085aMpjksr2leXD43DL/X1G+2e/fxvjpZwHsW1le7r6S3tvld9XMWN9mDO2mrF66+P121mFc9q5HTvemH5AFe0Tua+MY40dV0p7c86prDZllJUBlVZGKo+ty+Dc7fgeRMcp49zO6tuO9hTLIuOcev5usgRU47B1+vQDRvP48W+YU6dOElABAAAAbBjPv/BisrMOqJQgqHUCJCaafvkg3Egsq6m2Szw9Ve9HCXei+1cm535Zbb3Wnlj9dflIH2r2Dai0umXZWP9opm6b219ukq21t81YH8p21uUjbZG21ivPuVjY1nK8cn/NMsv+lO3QwoicY5X1xcot27Jsb/Y5ldimnLJ+QFW2p70/i3qUY24z1p5Yma5zt2u9NadvNWWZ2DGnnL+bLgHVOGydPn3aaB4/ftycOnWKgAoAAABgw5AhVJtzDqjk5MeqTWq0yXNsnfzcVjamC6OahBNWvf3t+5CBUGNCGpn8+ctTJqWxejRle6TyGNvKy3VyW996nH0Sgoj8/nL7CcevTa3u3LHV1Oq1jnW8cn91GRFQ1XXXT1Wlf4+s8li1NmjLtOWyrth+ctqUU7b+vN/P57UEOlJ5HF1qY9z2Peg6d7vWW+Vxdq1ra0+xPnLM2rG1Ld9ECajGgYAKAAAA4IAhQ6g25xpQuQlknOWkq22yKdfJz21lY8onPGJqk6+ufcigQAsgYhSBS2SC2NhHQhmnNkn1lcfYVl6uk9s26jTNPpJl5WetXEp/yX0WJDzRofVh7thqavVaxz5eqdY2/3jkscnPUlmfdlyp7ZXnjW9O6OS3Kafscj8VCedHUUfHPqRyjFO+B365WNva1qf2bWp7tHHWynUt30QJqMaBgAoAhrG7Y7a2tsz2Yq99GRxY9hbb++O5bdY2nJxPAAEyhGpzrgGVnBz5uklQymRZrpOf28rGnDKgksetBRBy8uc7VhmnbI9UHmNbeblObmuNtU2WlZ+1crG62qxDE6VurVxOQCWPX1Or1zrV8TplIOMs22zP9fTv0XK7tICqq72yrti6nDbllK0/236unp6MbSeNjZtmyli21dd17mrr5XH6NvorsT2p5bqWb6IEVONAQAXQk729XbPY2Tbb+xNnO3ku3f+8vWMWu3vm0EyltfBAWwYHFi2gKpetaIw5n2CDWOm534IModqcY0Cl/YxPXe8mc+Jzo6yYUOaUjTkkoGpbrh13Y9KqrJcmlYlMIjXbJrBWeSzLQCPv2OpyStu0MdO2lcu1faaYMr5aO62xdqW2JbfeMY7XGguoln3/ctGutqdngm38n+Eqx6WV0xx6To1Rtg6obD8nXieKuqrjTinbGMu2/lLaXJfpOHfl+tS+TW2PVs4a6+vY8k2UgGocCKgAstkzi+1lKGUDqZ0dqw2nlkHVmucuq0MLD7RlcGAhoAJYstJzvwUZQrU5y4AqMslplBETLTdp1CbFFn+CmFNWU+47ZmzypT3JUJcXIYGsw7W9OVE8aa5XyjSOz5Zxk82Op0d8+wVUkePQlok+cG0LgoRi82VZbVtteVd/+f0Sq0Mz1oc5Y6sZqzfWJrm863jl/uoykYCqWBf5buQca+y4Utqbc05ltSmjrB9Q+W2Sx6NZfx+VMTjvxPI64o9lyveg69ztWm8/p/ZtSnv8crJf5H67lm+iBFTjQEAFkMWu2alCqO3FbuQpqb39+fQOAZVcBgcWLaBaKZxPG8PuYsdsb+3sXwnXw7r3v0nIEKrNOQZUcnKkqU2Y/Il0QTHx0SdMOWWlQwOqog739EHQhu4JXD3h9ZBhXt0/kTKNOlqeYFlOYAVVm2T76kBL9q8ynnLbum1iWzsesqz83FZnW39p/SS3jxnrw9SxjanVqx1XbHnb8cZsC6jq/Zjwu5FzrNpxBcsr/PbmnFPZbUosKwOqZbv08lJ1PwXLY5Bj2fU96Dp3u9YvjyGtb7vaU5dTxlkr17Z8EyWgGgcCKoAMdnfKcGqH2dESLTzQlsGBhYAKStzTo+sKiNa9/81ChlBtzjGgwqUHaQKHiAfLrickcSkB1TgQUAGkUk2St0inmmjhgbYMDiwEVFCy7oBo3fvfLGQI1SYB1XyV74FBRBxTAqp0CajGgYAKIJHy6amBk/Q9+xPB8v0lpdtme0f5qaA/IZfbbO9PzoINKmTZWP32p4p12GZ/klhts71YllVeAm/ftxXsWwsPxLLOJ8/2FuV+ogV0etcbOTb7cntJazhTHaesvhVl31vbon6lTGffy7HXynewt7uof8Lq6iiq1vpAG3fj6hDnoF+mMSblubc8zsj5GtlXSj/1Pkc0EvZXkDEuo7bPEmnj0HPbtTPQFegxrqPuP0LOPhyd57B2PmaMuU/Wd04gQ6g2Cajma+pPCRER+0hAlS4B1TgQUAEkUf2Xez/AyWXXvjulnOzs7CzM7mJRvFi9nJiIJwLqyc6iCJK27Tut7L/rSY/yBEFO/V5A1Zj41cdXrS8mlnZyuygmvWpdXZM1S8ckO2UyptKjXveC4+axub4LQxCtjprIBDdKPUbVmO7aMGGnGNdlHX36PuM8ieD3iz1/lvXYz0ofyDH2ltnAbWdh67DHJsanHrNF9Z3aqcvWf2RAfs+0faX2U49zRCdxf0XRjHEZrX3Tntt7dizrusr6iz8OEXzH08d11P1HyNmHv6z1HNbOx5wxr8j+zglkCNUmAdW8bL6rhnAKEaeTgCpdAqpxIKACSKKanMqJcyreJDTYvlqnTXaCyVOxSlmeW399PNv6EyDGBidhXW5CpU3otPYvl7X9NGdI+JdZr+sndV/Lv87YzFNaJoraBDeG27dtq1ZXTX7fB8uLVfpylbZ+qffRFVDFx2LP367uB3lOlrh2t59PxcLEfoq3Sz1HoqTuz2SOy0jtaxvD0c7tlrb2GNdR9x8hbx/x+hvnsHY+Zo25aR+v2HdOIEOoNgmoEBERp5WAahwIqACSaA+otJ+fhBOxcNJTokxC3QRFznS8dYPqd8fTMQEK0MIupT3Jy9qWpxLbXlne+TNN5WmWvAluHHWSmkNL36eeJzG6+kVdH9Qfn9w3aJuYFyjftWBfLbT0U7B9bHkOLftLHhdtWdtyBXWMfEY5t1vGuMe4jrr/CHn7SKxfG5fMMe8ar671luduP2LeZve579ve8Y7q328zv/z5O8x3P/i2sj37nz9w+wsEVIiIiBNLQDUOBFQASYSTKx/385PC6icd4cS9S29SpExoaoKJZo/6O47Hsed+gmbfJ+O9U0WbmHUui+yznIh1TAhbSa03ZfIZ1pU3wY2hhYTt9O57R3CexOjuF7UPlH27p4mKn0ft7unH2tkupa+UfTmS+kkZ12JpcI50k7S/lvbqxz+0fd1jqO1DHVeHem637Ec9Lp9wXEfdf4TcfSSdw9r4asscQd90H0druyvc01EfeJut6x3m2ttfMM99vgqq3nbEfHf/cxFU7f+bgAoREXFaCajGgYAKIInuCUVNMFFx29r3inhBVmDahDw+2cmo301WY5PJ4iW/ts6yXvszQFtH8T4Z2S6trdqyYnFZ33JxRzsSSas3nKCHjDGJ1kjZd8XQvncE50mM7rapfRDZ997u8p1HRft3xM/iOtulfNe0feX0k0k9R1rI2Z/WXkfk+Ie1r3sMxzm3lbGpV+nHtSTcdtT9R8jfR8I5rI2vtswR9E33eLW2u8IPqH758y8U/37u+c+bX66emio+26esCKgQEREnl4BqHAioABJx/2VdnYD4BBOV/ElVWIdHMNnpUX/r5HcZeAW7b/k5U+cyi9g+ZRKWRFK9Kf0UThz1uioiE9yQsF6dEfreEZwnMcLgQqL2Qdu+99nzAx2/7s52KX0V7Cuzn5Tl6jFFydxf0F6P2PGP0r6pz+2W/cSOq2bi/UfI38eS6Dmsja+2zBH0Tc/vnCA3oAIAAIDpIKAaBwIqgGSqCVbHpEGbqGS/f0ipoyaY7PSovzWgalmntSt1WYE/MeuepKWTVm/4lIpA6VsXTGrd0bZO0rnvghH63qEcS4z2tkXCmbZ9ewR1u3Yp41OgtTvYV2Y/FaSdIzqZ+9OWObTjK1cMaJ/SzxJlv23nr76uJSDqMa76PtrWtew/gl5P9zqfoG+18dWWOYJjj3ynarrWlxBQAQAAbA4EVONAQAWQQzUJsRMH+34SFW2i4iYodmKlbLa3u2gu1+pwBJMdb1lq/W0TbuVJhxI3aUqYmGnLxDr7J9xtm9Um9CGl3tZJdGRS6MZcblP3eWRfklg9DUboe4d2nsRwbduJ/5W6WL/4+278pbOKYHLf6De5QfsYBAFVaj85Us4Rlcz9Be31aBuX3u0zKzq3WwKiAeM6yv5jZO4j6RzWxldb5tDGvM93TkBABQAAsDkQUI0DARVAJsH7Sap30RQvTa6XhxMVf9Kxbd9ds7soXrZcbqNP3GQdBdpkp1icUX9rQOUmZPvaY1ss67H1Fv/bNTHTltW4J9Gs+kQz9cmGJt31Wtr7qW1y7fdHOdZ23HPaGdu3/RmRq2Nw3zsi54mOf4z2XWaL4t1K5c+b7HuWlJ8bBfuu6ii+Dwuzu992+50o6mwkAC5IKfvQfn8Wi/LF424MguMJ9pXZTzVp54hG1v6U9ta0jkv/9lli59eY53a9j2Lc9sd4URXoM65j7j9Kzj4Sz2FtfLVlDnXMxXduYffX8Z0TEFABAABsDgRU40BABdCLvWIyse0mGG4CVkw0dtX/Cm+xTzItX7TstrFPPXVPyGvUyU61KrX+joCqOD43MSusnhir9t05MdOWedST/cj+y/X5E/Sueh1lP/nH5/pJlnTsFZPaurydHNuy1XF27K5B974H9r2j5TzRqc5pv13Vi/XLUKAroDLB9uXEu+Ul6Y0Xj1f9qg2Csq+sfvJIPUdCMvantreiY1z6t6+k+/yS5J7borwr0GdcC0bafyvp+0g6h7Xx1ZY5omOe+Z0TFOGTt+3bPnhHFVCVn21o5cpwwwwAADAtBFTjQEAFACsn+MlMgzI8Uyd6HbTXCxtBdLK+Gjb9HNn09kVZ87jOjZTzwD1BlSI3zAAAANNCQDUOBFQAsFrqnwJp78ox1fr2iZlKV72wGawzyNj0c2TT29fGOsd1dsTeedZEhlBtcsMMAAAwLQRU40BABQArxf2EKTaPLX7a0jEx0+iqFzaENQYZm36ObHr7WlnjuB5I9sr3Z4XXOftT0vI86HqKVIZQbXLDDAAAMC0EVONAQAUAk7NnX/5bvAy8eg/MSJPYqeqFCVlxkLHp58imty+ZFY/rgcf1V/VC+/IPbXjvo0oI6WUI1SY3zAAAANNCQDUOBFQAMDn+XxfTnxrox1T1woSsOMjY9HNk09uXzIrHdQ7EXmgff6F8ExlCtRm7YX7ggQcQERGxhxICqnEgoAIAAAA4YMgQqs3YDbO82UZERMQ0JQRU40BABQAAADBjuGEGAACYFgKqcSCgAgAAAJgx3DADAABMCwHVOBBQAQAAAMwYbpgBAACmhYBqHAioAAAAAGYMN8wAAADTQkA1DgRUAAAAADOGG2YAAIBpIaAaBwIqAAAAgBnDDTMAAMC0EFCNAwEVAAAAwIzhhhkAAGBaCKjGgYAKAAAAYMZwwwwAADAtBFTjQEAFAAAAMGO4YQYAAJgWAqpxIKACAABYB3cfM//Ru/7YvP3oC3JNT/bMYmfbbG1t7bttFntyPRxWuGEGAACYFgKqcSCgAkhgb1FO+rbbZny7O+XEcGdXrlmSUqaV/Qno9v722wvT0pIDQ1K/roUXzBVHPmd+9lePmRvlKoCxGDWgqq4NW9tme2fH7Oy7u2lfK1gb3DADAABMCwHVOBBQAaTggqWWYGh3x04OrfsTQ7mywpXpnU/t17yzkYFOPwio4FAzZkBVXaM277sEmwA3zAAAANNCQDUOBFQASZTBUDx8ck8vtAVQrkysjgT2Fmabn+6sgIMTUN149Jh5+wFoJyiMGFC5sFe/9syL3cXO/nVwwHV0IOvefx+4YQYAAJgWAqpxIKACSKT16aciONoy29stTwRVZdqewuqimIQO2B5SOSgB1UFpJ6iMHlAdhvB6hKB/EOvefz826Yb5pZdeMs8++6x5/fXX5SoAAIADCwHVOBBQAaTS8hOa5dML1ZNWWojUsn0qRUimJmQwLgcl+Dko7QQVAqoerDsgWvf++7EJN8z2vvLiiy8273rXuwrPOeccc9ttt8liAAAABxICqnEgoAJIpeUJqPLpKjthiU9eyjKRCeTertmpnr4qtS86trWlUIViRXC1t7+fqh7ZzkH76JgAV+GbzM72dhfhPv0KtNDOXybbvB1/8XO5L7efsmxRRVu7o+jBz6mjR/eXHTVXPOEtdFRhw4X+JfOJk+btv7pfz6dOG1vnjZ86Wny25Ww9b99ffsorfuOnynWNOny8+lxZabkvf5vT5sIjR5frlf2W7JcTbS3KHzmplBXs7+MK79iK0OXIft/Jfsrsj97bpB5LpN1X3B0JjCLlg+N0KOV/9oh3/vgBlRyntnp93PvxpMr33/6Fv+IaVrltvyPqFyrxmhIjY1+t309xXVm+50/oCrhrtNfuZRv0692o+zcJ17w1sc4b5jfffNNceeWVdTDl/NKXviSLAgAAHFgIqMaBgAogmeVfyWrON/zJnJvwyLCm5R1Wu/Z9JmW9OzsLs7vYn+DUfypeKR+w3H9jAuVPJgfvI28i5y/b2p+s7ezvb7HYKQMkv1BrQLUoXwi/sz+xtf+uJ31he12fu+NblrefW9odZeyA6mRZ35Fj5sKj+/+27406UoUsfmjSCGNC/P2f2q/jwk/Z90/Zdtqgpvx8of80zt3L9Rfut+HG/X1f6MKa4KmrZajjh19BqBNQbVe14Yq7TxahjLqP3P7ou03Csdi+LNvot7vsrzo0apBxnJaq74u6ivI2rDpWhFD1OVIHVCeLuoty9t9VUKXWK9mz3+Xqu1V9X4rPi2UY438/iu/T7v53ZMddE7SnOhOuKRFy95VzXdmz15C6ruVfK9xxG9cB1aL6a6d2XXnt2XbhtTiGUfefcs1bE+u8Yf7yl788i3Cq+C4kfAfmRvkdCf9/d5VM/XqDwzq2ADAuBFTjQEAFkIEaPsmQpfFf8Su0ZWJ5cGPk3mulzpx83M8Kt4unFIKHFEbZR95EztRhXnhTu+dvL/vOWxb0c7FKWd7yZNuyrki7o4wbUOmBx/KJqeU6fb+NdY0wpqW8F3YFAVO1rtmmKoA5crT9qaAAG7yE+3AB0LD+MP226ToW1zdBsGUp+zRoe4/jLMZF7tunOmeC7U3C03SC6Pez7ftRf0/ld63jmhKjx76i7bYE1xVL/NpS719eUyrc9cNfN97+Y8vFNW9NrOuG2b5v6uyzz04Kp5544gnz1ltvycXtFGMU9rk21kNphhjVeKvneg/qcDNW3/r+gu+BDqi8+wlf2Y/TB1Qjny8FzT/OEzu2cZniOADmAwHVOBBQAeSgBE3hT/fC91CpwVa9PHbjl3oj4J7O0idZ4+wjdyIXn6w1aAuoZGd56/zyYf836Vqvowc/fQMqPQixuCDFWx97L5G6XG+npWxruLxEC7uWTwipx5eLFoL16Y8+23Qciw1/YusKOp5ka6AcZ3K4VI2pup+2dQqx72fn+a9c07quKTH67CvW7oLgumJpuba0BmSW2LV5jP3Hlm8G67phvummmxrhlP2pn8aZM2fMe9/73uL+MwstoFLHLYfyPJHbrySgUvZbMjSg0o8phfZ7iNUwLKAS32/lOnTgAirlXsgtD5Z1Ejs3tOUjHwfAzCCgGgcCKoAs5E/19P+zlhM1+blE/69foV03huGka8lY+8ifyLlQrvi5y+6e0jaj32RpyxzBjWX3pLC13VH04Kd3QBUNGVqCIhHIlKGKDJz0dvpPAbXZ3E7fbyqn3E/Y7DuXvHcpqQFVTn/02ab1WGJ95hPfvvs4tfZEUEPHis7jbqKf593fD/36oS3rot++9HZXKNeV1v0E1wdJeL0ec/9J17w1sa4b5uuuu64RUJ177rnm/vvvb5Rx4ZRdn/3SdBlQZTwVHKWqQ55Gk4YY1XHsFPcK4bnlvju9jytyTCnMLqAy4fd+0rEdneoa1GcwNWLnRmw5AEQhoBoHAiqATBphU+xmuBGyhJOyEjfRse9Jqt5loiq3k1T1q3cRY+0jvKFroE7k9rex/zXPtq1QeUmxFkZpyxzBBDTWt0ta2x1FDzEmC6jEfsInfJbvVGqib79cbt89Vb2bSlUJdYJ9dFC83Lt6F5R9P5N9R1TxLqXyHUy9Air/ePps03os8fBpiRIyJR9nSv0VkwdU3d+P+hqhBVTyC91Kv33p7a5QryvxgCi8PkjCbUfdv0m45q2Jdd0wf+UrXwneP+WHVH44ZT1x4oSooYNGQJVyDiYQmZhPGmLUxxH77hFQ9er7SEAl+2PSsR2d2DnSk9i5EVsOAFEIqMaBgAogFy9Acf/FPPg/cH+iFAuxOiY66bTdrIy1jz4TuSV7xV/jqyZt/k2gFkZpyxzBBDSc8Epa2x1FCz2mCKgiYYb42Vh8v3o748vbaAt1YiyDsKBtyk/fevVHn21ajyWlb2SdOccpt21h8oAq5fuvTerbrikx+u1Lb3eFel1p2U9wfZBMvH+P6DVvTazrhvnOO+8MAioXUtmf//nh1FlnnWWef/55WUU7XkBV/sej9nEpy/g2y4frl+eTDDGin915WKn+f5nEOw79nIwHVGGb04+pQLRXnq/LgMqd+07ZxiXhPuPjklJWC6jcdlqf1MQCKvHdbo5l7Aml2PLqutLol3C8xjxfymNXjkujZXzDvi+PL7a83kbWkXwcaX1VlJRtCPodYPMgoBoHAiqAbNzkzf51Kvt/nOHNlD+JWcRCLLP8P2BtXTrtk8lx9uFuUvV62tb5BDdVWhilLXMEE1DXz7Ebta71MfSAQ30hdts6FzLEwopoCOE/waM8zSPLKWFL8nuQavRjbqdlGy186dMffbZpa5fRnlATBHW21KccZ2f9DmXbmqAN7eiTWuU7Jwm+U5b2a0qMPvtqu3bo61oCIld/LBCaev8KnX2yItZxw/zKK6+Yj3zkI0E4FfOyyy6TVXRTBTvl/8+29XMYThZLtfGJPDkSnZj7n+U+1JBTwQuo6nOs0VZtEj/8mNzyZb1hCOO+B7JO/fuR0aaMsjKg0sqoRAKqZehW0hzLsA9KlOXKNaU+LjFeo54vftATu95ZEsa369yQy3sfR3JfRc5/2RCADYSAahwIqACycf/nua38n+0SN2Es/7x5ZDJT/xenHfUvZe3tLtTlTTomk6Psw9Q3HMHNkPdfzRr3PEqdwU2lFkZpyxzaDY5r1074U5rYjXUXathkcS+ulmFJFSYE2zSWyxCi5akci3si62hZR9CWgnhAVQccdp1S/6m7T4rlLSFMlNjTQmW7gvClT3/02abrWFpDL63OzOOMnSeSFQRU9XdGfm/LlZEAt+OaEqPPvjKvK8t6lGtqYxvZgun3n3TNWxOrvmHODacuuOAC8+yzz8pqunHj13G+ykn1kvQJu6xD/RyMtVK/RiOgMkobwoBK7n+Jss+gvmJhWM4iQh09iCqRbZCfl4T7yinrB1TRa52GFlAp4UnfgCp6DEEwFJYddL5ULO9xtHZE6pJ9op4b8eV9j0NuVxP0VXmuy/0CHAQIqMaBgAqgB/5NgRqkWLwJTnCD4OGHKNs7O2axa5/Mcu8xkf+nr9E9mRy+D4ubmNmbjB2zs7B1lCGdfY9V84avKmvL7SzM7n7ZnZ2qDc27wrAPtWUOLaBqtGu7aNfuYqf6eU3Kf1m32KChel9TFTjo4cIykPhZ+w6ioyfNFfZl2TZA+lTLT/yOlGXse4uuOFq+ZNuFLmo4UVCGIsW+tACqwoVptj1X7LfnwqPLQKNeZ9+ZZN+XdLdtb7nv7FAngntSa9kf1TuZ3P8qAVVWf/TZJuFY2vpGC8OyjtPE67fnV32OrCKgqtfFvv9amNN9TYmRv6+c60q1hdvHtv1+719bFlWBOiArt98u1u829h9eV8baf9o1z20btmNaVnnDnBtOXXTRRcV9Zy9csBNMcn3CcMenHJO2cKhETrC7PjtiyxvIgKpYZM9Lt0weg/zcJOmYtGXK8qAuj+a6nDbllK0+b9vvVfn9Cdocww8wa8PrZL+Aqu0YwnXyPJCfHbHlbfjX3XqXieMbfHZElsv2yc+O5vKwP5bIde6aHI4TwKZDQDUOBFQAfajDp7b/A60medH/U15in2Kq31fittm2N93t25WkTSaH7cOxV0ze6jrsBM1urv0XyYX/smBb1oZHY78kvV4R7G+7evF728R9yTJ4KgKDT51WwinHC0Uo5coWwZANerreQeW9ZLveLngiqEkdirSGFKI9oqx9Usrfb3F8R+xTVXLf3aGOzgv77fT2/6tHy3CnOnY1oMrpjz7bJB5L2TfLti/7Rpa0ZBxnRWf9KwqoLOX33/vu1t9/WdKSdk2JkbcvS/p1RS2/nEkvrw/+O6BcndEGjLN/eQ3SrnlzD6jawqmzzz67aMfll19uLr30UvPxj3+8uNd8/fXXZTXpeMGO69twvOQEWCDDoZ4Tc/nZEVveQLahXOi1Wx6D/CyQ9WnHVN/H6C6/Vs2wyCcndGq2Kafscmz971sSRT3x66LjoAdUJdV1222bOL7qudGyXLZPfnb0D6iqpXb7PmMOsEYIqMaBgAoAZk15k9N9gzoJmSGDJPldRgeFPv3RZxs4nEQDbFjFDXNXOHX77bfLTYYjggz9eq9PgB1BANNzYi4/O2LLG8hAqWIZPMtjkJ+bJB2TtkwhqMsjJ6DqX7b6bPuw7T9gaRyqgEr0W+L4RstFlsv2yc+OoQFVjbuuK/sA2DQIqMaBgAoAZoz4L4qrZki40vqepANKn/7osw0cTgiookx9w7yWcMoSBDvVNV8EKrFJdBg62EX9JubysyO2vEFwHA7309HqZ6stgceS1GNSyinEn84Mt89pU07ZOqCyH3JCql4BVfi5WlqeW3W73NjIckZto6xTfnbElqdQbFufR2E/qqjnRny5bJ/87Gguz+urgMRxBFg3BFTjQEAFAAebvfIdMOF9y151s9Zx4zMlA8KV/L/CdwDo0x99toHDCQFVlClvmNcWTlm0YEd74kJbZuSEvl6qPtEhJ+Jdnx2x5Q2043C4tss2jXBMLhxofmX2y3p1Ln9ep4R+cj85bcoo2wio3GfteCSJwUYwRkG/VAGLvL5U5bQwULZP7kN+dsSWL7FjKcfXLlaCnuA4ioWN8S3r0/pSXy7bJz87guXJfbUb/MW+Zl0y7Ip/Blg1BFTjQEAFAAeb+ganfCmzfbGx1d30aDdOKyMzXDl19Fj1ovbqBduJ2x0YMvujoM82cDghoIoy1Q3zWsMpSyTYqUOVxvXfCxm6/v/BTaa980lOuLs+O2LLG0SOw1GGNmFYMPSYguWVzQyh+tmYFyaUxtqb0abEsjKgqpdFytf0DaiMV3/dJ5EnkmS/FPWE4Y7ch/zsiC1f4p4SlEaOs2N8gzKxcyPxe+BQlyf1lXJ8jXrigZT8DLBqCKjGgYAKAA48sZcyx1+KvCIywxX/L7/Zv8Y3m5/2OTL7o6DPNnA4IaCKMsUN849//OP1hlMAG0sZsnApSoG+gvlAQDUOBFQAAAAAM2aqG+abb77ZnHXWWYRTAD6JT26Boa9gVhBQjQMBFQAAAMCMmfKG2Q+pCKfgMGF/Bhj87FJ7FxTQV3AoIKAaBwIqAAAAgBkz9Q2zDanOOeccwik4XMh3KhXyNJAKfQWHAAKqcdg6ffp2o3n8+K45deo4ARUAAADAAWYVN8zPPPOMXAQAAHBoIKAaBwIqAAAAgBnDDTMAAMC0EFCNAwEVAAAAwIzhhhkAAGBaCKjGgYAKAAAAYMZwwwwAADAtBFTjQEAFAAAAMGO4YQYAAJgWAqpxIKACAAAAmDHcMAMAAEwLAdU4EFABAAAAzBhumAEAAKaFgGocCKgAAAAAZgw3zAAAANNCQDUOBFQAAAAAM4YbZgAAgGkhoBoHAioAAACAGcMNMwAAwLQQUI0DARUAAADAjOGGGQAAYFoIqMaBgAoAAABgxribZkRERJxWGAYBFQAAAAAAAAAArBUCKgAAAAAAAAAAWCsEVAAAAAAAAAAAsFYIqAAAAAAAAAAAYK0QUAEAAAAAAAAAwFohoAIAAAAAAAAAgLVCQAUAAAAAAAAAAGuFgAoAAAAAAAAAANYKARUAAAAAAAAAAKwVAioAAAAAAAAAAFgrBFQAAAAAAAAAALBWCKgAAAAAAAAAAGCtEFABAAAAAAAAAMBaIaACAAAAAAAAAIC1QkAFAAAAAAAAAABrhYAKAAAAAAAAAADWCgEVAAAAAAAAAACsFQIqAAAAAAAAAABYK1unTz9gNI8f/4Y5deokARUAAAAAAAAAAEzK1unTp43m8ePHzalTpwioAAAAAAAAAABgUgioAAAAAAAAAABgrRBQAQAAAAAAAADAWiGgAgAAAAAAAACAtUJABQAAAAAAAAAAa4WACgAAAAAAAAAA1goBFQAAAAAAAAAArBUCKgAAAAAAAAAAWCv/P1POqaqJ0KbsAAAAAElFTkSuQmCC", "text/plain": "class java.awt.image.BufferedImage: 1192x238 px" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "showScreenshot(1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is also possible to set these options for the newly created notebooks" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:25:37.400895700Z", "start_time": "2023-07-01T16:25:35.697899500Z" } }, "outputs": [ { "data": { "image/png": "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nML47GbvXcogHgsfQJgiH74wM8wQf+2111rnAAAAAAzxjcvPF39055XiNz/xIEsijEcYl3isdlJoTi+88EL53XYshzAeu7VcRiVc//r16+VkW5ZDGI/dHvcgiyAOAAAAAABDCeIAAAAAAKwFQRwAAAAAgLUgiAMAAAAAsBZCA6+DeKjj8QkAAAAAALAK6hnid999d/nDrfgmTwAAAAAAuJVC+66D+D333FPOEn/ppZdaJwIAAAAAQM42NzfLBr5x9erV4t577y3r+GOPPdY6EQAAAAAAcvb444+Pg/j9999f/vDAAw+0TgQAAAAAgJw9+OCDoyB+7dq14qGHHip/+MpXvlI89dRTrZMBAAAAACBHzzzzTPG1r31tHMTDOuJf//rXy2VTvvWtbxUvv/xy60UAAAAAAJCTra2teoWU0MA3HnnkkSIsmxJmiZ89e7aM4pcvX269EAAAAAAAcvIP//APZfO+++67ywZeB/EwS/zb3/52efDLX/5yGcXNFAcAAAAAIDdhZnho3KF1h+Ydvj8zNPAyiFfLpjz88MPF3//93xd33XVXKSyfYk1xAAAAAABy8fTTT0907vDn0L7LIP7oo4+WQTzMEg87r1y5UnznO98p11Q5depUKcwcf+KJJ4of/ehHxeuvv956AwAAAAAA2AuhWYd2HRp2aNshgoeuHRp3aNuhewehgZdBvLlsSgjiwcWLF4v77ruvfOFf//VfF1/60peKL37xi7U777xzLl/4whduqT//8z8vfeITn+jt9ttvL1/z8Y9/vPj85z/PDvurv/qrrHzuc5/LxokTJ9beZz/72bX3mc98Jhuf/vSn2QWf+tSnAIAMxf+Zvo7i/764zOL/Hr6O4v89to7i/12+zOLesczilsTOidvpMou78izNZh0admjZoWl/7WtfKxt3aN3V7PDQwP8/4HC1GQeouTYAAAAASUVORK5CYII=", "text/plain": "class java.awt.image.BufferedImage: 1476x1068 px" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "showScreenshot(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Of course, you can depend on various JVM libraries even if you don't have a project in the current scope.\n", "The simpliest option we offer is to use predefined library descriptors, you can find which are available using `:help` command or [here](https://github.com/Kotlin/kotlin-jupyter#list-of-supported-libraries)." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:25:37.406894500Z", "start_time": "2023-07-01T16:25:36.078898Z" } }, "outputs": [ { "data": { "text/plain": "Kotlin Jupyter kernel.\nKernel version: 0.11.0.381\nKotlin version: 1.8.20\nJVM version: 11\n\nCommands:\n :help - display help\n :classpath - show current classpath\n :vars - get visible variables values\n\nMagics:\n %use - injects code for supported libraries: artifact resolution, default imports, initialization code, type renderers\n Usage: %use klaxon(5.5), lets-plot\n %trackClasspath - logs any changes of current classpath. Useful for debugging artifact resolution failures\n Usage: %trackClasspath [on|off]\n %trackExecution - logs pieces of code that are going to be executed. Useful for debugging of libraries support\n Usage: %trackExecution [all|generated|off]\n %useLatestDescriptors - use latest versions of library descriptors available. By default, bundled descriptors are used. Note that default behavior is preferred: latest descriptors versions might be not supported by current version of kernel. So if you care about stability of the notebook, avoid using this line magic\n Usage: %useLatestDescriptors [on|off]\n %output - output capturing settings\n Usage: %output --max-cell-size=1000 --no-stdout --max-time=100 --max-buffer=400\n %logLevel - set logging level\n Usage: %logLevel [off|error|warn|info|debug]\n\nSupported libraries:\n kravis (https://github.com/holgerbrandl/kravis) - Kotlin grammar for data visualization\n plotly (https://github.com/mipt-npm/plotly.kt) - [beta] Plotly.kt jupyter integration for static plots.\n exposed (https://github.com/JetBrains/Exposed) - Kotlin SQL framework\n lets-plot-gt (https://github.com/JetBrains/lets-plot-kotlin) - Lets-Plot visualisation for GeoTools toolkit\n deeplearning4j (https://github.com/eclipse/deeplearning4j) - Deep learning library for the JVM\n kraphviz (https://github.com/nidi3/graphviz-java) - Graphviz wrapper for JVM\n serialization (https://github.com/Kotlin/kotlinx.serialization) - Kotlin multi-format reflection-less serialization\n krangl (https://github.com/holgerbrandl/krangl) - Kotlin DSL for data wrangling\n roboquant (https://roboquant.org) - Algorithmic trading platform written in Kotlin\n kmath (https://github.com/mipt-npm/kmath) - Experimental Kotlin algebra-based mathematical library\n gral (https://github.com/eseifert/gral) - Java library for displaying plots\n webtau (https://github.com/testingisdocumenting/webtau) - WebTau end-to-end testing across layers\n deeplearning4j-cuda (https://github.com/eclipse/deeplearning4j) - Deep learning library for the JVM (CUDA support)\n gradle-enterprise-api-kotlin (https://github.com/gabrielfeo/gradle-enterprise-api-kotlin) - A library to use the Gradle Enterprise API in Kotlin scripts or projects\n coroutines (https://github.com/Kotlin/kotlinx.coroutines) - Asynchronous programming and reactive streams support\n mysql (https://github.com/mysql/mysql-connector-j) - MySql JDBC Connector\n lets-plot-dataframe (https://github.com/JetBrains/lets-plot-kotlin) - A bridge between Lets-Plot and dataframe libraries\n multik (https://github.com/Kotlin/multik) - Multidimensional array library for Kotlin\n reflection (https://kotlinlang.org/docs/reflection.html) - Imports for Kotlin Reflection\n smile (https://github.com/haifengl/smile) - Statistical Machine Intelligence and Learning Engine\n kandy-echarts (https://github.com/Kotlin/kandy) - Kotlin plotting DSL for Apache ECharts\n spark-streaming (https://github.com/JetBrains/kotlin-spark-api) - Kotlin API for Apache Spark Streaming: scalable, high-throughput, fault-tolerant stream processing of live data streams\n rdkit (https://www.rdkit.org/) - Open-Source Cheminformatics Software\n combinatoricskt (https://github.com/shiguruikai/combinatoricskt) - A combinatorics library for Kotlin\n lib-ext (https://github.com/Kotlin/kotlin-jupyter) - Extended functionality for Jupyter kernel\n khttp (https://github.com/jkcclemens/khttp) - HTTP networking library\n plotly-server (https://github.com/mipt-npm/plotly.kt) - [beta] Plotly.kt jupyter integration for dynamic plots.\n londogard-nlp-toolkit (https://github.com/londogard/londogard-nlp-toolkit) - A Natural Language Processing (NLP) toolkit for Kotlin on the JVM\n lets-plot (https://github.com/JetBrains/lets-plot-kotlin) - ggplot-like interactive visualization for Kotlin\n openai (https://openai.com/blog/chatgpt) - OpenAI API for Jupyter Notebooks\n fuel (https://github.com/kittinunf/fuel) - HTTP networking library\n kalasim (https://www.kalasim.org) - Discrete event simulator\n kaliningraph (https://github.com/breandan/kaliningraph) - Graph library with a DSL for constructing graphs and visualizing the behavior of graph algorithms\n kandy (https://github.com/Kotlin/kandy) - Kotlin plotting DSL for Lets-Plot\n kotlin-dl (https://github.com/Kotlin/kotlindl) - KotlinDL library which provides Keras-like API for deep learning\n kotlin-statistics (https://github.com/thomasnield/kotlin-statistics) - Idiomatic statistical operators for Kotlin\n jdsp (https://github.com/psambit9791/jDSP) - Java library for signal processing\n default - Default imports: dataframe and Lets-Plot libraries\n dataframe (https://github.com/Kotlin/dataframe) - Kotlin framework for structured data processing\n biokotlin (https://bitbucket.org/bucklerlab/biokotlin) - BioKotlin aims to be a high-performance bioinformatics library that brings the power and speed of compiled programming languages to scripting and big data environments.\n klaxon (https://github.com/cbeust/klaxon) - JSON parser for Kotlin\n datetime (https://github.com/Kotlin/kotlinx-datetime) - Kotlin date/time library\n spark (https://github.com/JetBrains/kotlin-spark-api) - Kotlin API for Apache Spark: unified analytics engine for large-scale data processing" }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ ":help" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's try `kotlinx.serialization` library" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:25:37.473896800Z", "start_time": "2023-07-01T16:25:36.162916800Z" } }, "outputs": [], "source": [ "%use serialization" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It allows us to serialize and deserialize classes." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:25:38.138906600Z", "start_time": "2023-07-01T16:25:36.568902400Z" } }, "outputs": [], "source": [ "import kotlinx.serialization.Serializable\n", "\n", "@Serializable\n", "class User(val firstName: String, val lastName: String)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:25:38.274904200Z", "start_time": "2023-07-01T16:25:37.334915300Z" } }, "outputs": [], "source": [ "val bob = User(\"Alex\", \"Green\")" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:25:38.381895900Z", "start_time": "2023-07-01T16:25:37.448897700Z" } }, "outputs": [ { "data": { "text/plain": "{\n \"firstName\": \"Alex\",\n \"lastName\": \"Green\"\n}" }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Json { prettyPrint = true }.encodeToString(bob)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is possible to specify descriptors' and underlying libraries' versions, write and contribute your own descriptors and much more.\n", "You can read about it [here](https://github.com/Kotlin/kotlin-jupyter/blob/master/docs/libraries.md)\n", "\n", "Also, you can add dependencies for any Maven libraries you want" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:25:41.991897100Z", "start_time": "2023-07-01T16:25:37.838994200Z" } }, "outputs": [ { "data": { "text/plain": "" }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": "
\n " }, "metadata": {}, "output_type": "display_data" } ], "source": [ "USE {\n", " repositories {\n", " // Any additional repositories. Maven central is already included\n", " // maven(\"\")\n", " }\n", " dependencies {\n", " // Here we add kandy plotting library\n", " implementation(\"org.jetbrains.kotlinx:kandy-lets-plot:0.4.3\")\n", " }\n", "\n", " // Sometimes library integration are loaded transitively and you don't want them to do it.\n", " discardIntegrationTypeNameIf {\n", " it.startsWith(\"org.jetbrains.kotlinx.dataframe.\")\n", " }\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Renderers and other integration features\n", "\n", "Let's try to conduct an experiment: we'll throw 50 dices and count the sum of points on them.\n", "Then, we'll repeat this experiment some reasonable number of times and plot the distribution using kandy library we've just loaded." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:25:45.532895800Z", "start_time": "2023-07-01T16:25:41.881901100Z" } }, "outputs": [ { "data": { "text/html": " \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 120\n \n \n \n \n \n \n \n \n 140\n \n \n \n \n \n \n \n \n 160\n \n \n \n \n \n \n \n \n 180\n \n \n \n \n \n \n \n \n 200\n \n \n \n \n \n \n \n \n 220\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 0\n \n \n \n \n \n \n 500\n \n \n \n \n \n \n 1,000\n \n \n \n \n \n \n 1,500\n \n \n \n \n \n \n 2,000\n \n \n \n \n \n \n 2,500\n \n \n \n \n \n \n 3,000\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n y\n \n \n \n \n x\n \n \n \n \n \n\n ", "application/plot+json": { "output_type": "lets_plot_spec", "output": { "mapping": {}, "data": { "x": [ 124.0, 127.0, 128.0, 129.0, 130.0, 131.0, 132.0, 133.0, 134.0, 135.0, 136.0, 137.0, 138.0, 139.0, 140.0, 141.0, 142.0, 143.0, 144.0, 145.0, 146.0, 147.0, 148.0, 149.0, 150.0, 151.0, 152.0, 153.0, 154.0, 155.0, 156.0, 157.0, 158.0, 159.0, 160.0, 161.0, 162.0, 163.0, 164.0, 165.0, 166.0, 167.0, 168.0, 169.0, 170.0, 171.0, 172.0, 173.0, 174.0, 175.0, 176.0, 177.0, 178.0, 179.0, 180.0, 181.0, 182.0, 183.0, 184.0, 185.0, 186.0, 187.0, 188.0, 189.0, 190.0, 191.0, 192.0, 193.0, 194.0, 195.0, 196.0, 197.0, 198.0, 199.0, 200.0, 201.0, 202.0, 203.0, 204.0, 205.0, 206.0, 207.0, 208.0, 209.0, 210.0, 211.0, 212.0, 213.0, 214.0, 215.0, 216.0, 217.0, 218.0, 219.0, 220.0, 221.0, 222.0, 223.0, 226.0, 228.0 ], "y": [ 1.0, 1.0, 2.0, 5.0, 1.0, 2.0, 7.0, 7.0, 2.0, 16.0, 13.0, 29.0, 30.0, 33.0, 40.0, 49.0, 77.0, 102.0, 116.0, 179.0, 178.0, 235.0, 266.0, 327.0, 359.0, 453.0, 567.0, 675.0, 705.0, 870.0, 928.0, 1051.0, 1230.0, 1353.0, 1496.0, 1765.0, 1852.0, 2041.0, 2244.0, 2324.0, 2381.0, 2687.0, 2763.0, 2935.0, 3074.0, 3045.0, 3262.0, 3193.0, 3239.0, 3263.0, 3222.0, 3241.0, 3177.0, 3150.0, 3113.0, 2834.0, 2838.0, 2666.0, 2449.0, 2421.0, 2223.0, 2066.0, 1830.0, 1706.0, 1597.0, 1424.0, 1226.0, 1066.0, 958.0, 816.0, 716.0, 643.0, 532.0, 495.0, 385.0, 322.0, 272.0, 245.0, 164.0, 143.0, 128.0, 101.0, 93.0, 58.0, 63.0, 37.0, 16.0, 23.0, 15.0, 13.0, 10.0, 9.0, 4.0, 5.0, 6.0, 2.0, 1.0, 1.0, 1.0, 1.0 ] }, "kind": "plot", "scales": [ { "aesthetic": "x", "limits": [ null, null ] }, { "aesthetic": "y", "limits": [ null, null ] } ], "layers": [ { "mapping": { "x": "x", "y": "y" }, "stat": "identity", "sampling": "none", "position": "dodge", "geom": "bar" } ] }, "apply_color_scheme": true, "swing_enabled": true } }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import kotlin.random.Random\n", "\n", "fun diceNTimesSum(n: Int): Int {\n", " return (1..n).sumOf { Random.nextInt(1, 7) }\n", "}\n", "\n", "val experimentData = (1..100000).map { diceNTimesSum(50) }.groupBy { it }.mapValues { it.value.size }.entries.sortedBy { it.key }\n", "val experimentX = experimentData.map { it.key }\n", "val experimentY = experimentData.map { it.value }\n", "\n", "val gaussPlot = plot {\n", " bars {\n", " x(experimentX)\n", " y(experimentY)\n", " }\n", "}\n", "gaussPlot" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:25:46.133896700Z", "start_time": "2023-07-01T16:25:45.479975700Z" } }, "outputs": [ { "data": { "text/plain": "class org.jetbrains.kotlinx.kandy.ir.Plot" }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gaussPlot::class" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As you can see kandy's `Plot` object was rendered to some image. That's because `kandy` library defines a **renderer** for this type of objects. We also can define renderers ourselves." ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:26:03.095894200Z", "start_time": "2023-07-01T16:25:45.742906200Z" } }, "outputs": [], "source": [ "%use dataframe" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:26:03.180935500Z", "start_time": "2023-07-01T16:26:02.956908Z" } }, "outputs": [ { "data": { "text/plain": "Line_23_jupyter$User@26989de3" }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "val bob = User(\"Bob\", \"Brown\")\n", "bob" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`User` isn't a data class, that's why it was rendered this way." ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:26:04.125939100Z", "start_time": "2023-07-01T16:26:03.111033100Z" } }, "outputs": [], "source": [ "USE {\n", " // Match is based on runtime type here, beware of type erasure\n", " render { listOf(it).toDataFrame() }\n", "}" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:26:04.212895400Z", "start_time": "2023-07-01T16:26:03.492908100Z" } }, "outputs": [ { "data": { "text/html": " \n ", "application/kotlindataframe+json": "{\"nrow\":1,\"ncol\":2,\"columns\":[\"firstName\",\"lastName\"],\"kotlin_dataframe\":[{\"firstName\":\"Bob\",\"lastName\":\"Brown\"}]}" }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bob" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also use full syntax for defining renderers. It's verbose but let you do many things" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:26:04.348896900Z", "start_time": "2023-07-01T16:26:03.831944200Z" } }, "outputs": [], "source": [ "class User2(val name: String)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:26:05.346896200Z", "start_time": "2023-07-01T16:26:03.935910Z" } }, "outputs": [], "source": [ "USE {\n", " addRenderer(object : RendererHandler {\n", " override fun replaceVariables(mapping: Map): RendererHandler {\n", " return this\n", " }\n", "\n", " override val execution: ResultHandlerExecution\n", " get() = ResultHandlerExecution { host, res ->\n", " FieldValue(\"Value of ${res.name} is a user with name ${(res.value as User2).name}\", null)\n", " }\n", "\n", " override fun accepts(value: Any?): Boolean {\n", " return value != null && value::class == User2::class\n", " }\n", " })\n", "}" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:26:05.785010200Z", "start_time": "2023-07-01T16:26:04.733895900Z" } }, "outputs": [ { "data": { "text/plain": "Value of res42 is a user with name Felix" }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "User2(\"Felix\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What do the libraries bring except for dependencies and renderers? First of all, default imports.\n", "These imports are implicitly added to all subsequent cells." ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:26:06.100904600Z", "start_time": "2023-07-01T16:26:04.905012700Z" } }, "outputs": [], "source": [ "fun loadFileFromGitHub(repositoryUrl: String, filePath: String): String {\n", " val rawUrl = \"$repositoryUrl/raw/master/$filePath\"\n", " val url = URL(rawUrl)\n", " val connection = url.openConnection()\n", " connection.setRequestProperty(\"Accept\", \"application/vnd.github.v3.raw\")\n", "\n", " val inputStream = connection.getInputStream()\n", " val content = inputStream.bufferedReader().use { it.readText() }\n", "\n", " return content\n", "}\n", "\n", "fun loadDescriptor(name: String) {\n", " val text = loadFileFromGitHub(\"https://github.com/Kotlin/kotlin-jupyter-libraries\", \"$name.json\")\n", " DISPLAY(MIME(\n", " \"text/markdown\" to \"```json\\n$text```\"\n", " ))\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice `imports` section in the following descriptor:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:26:06.711895700Z", "start_time": "2023-07-01T16:26:05.632909600Z" } }, "outputs": [ { "data": { "text/markdown": "```json\n{\n \"link\": \"https://github.com/breandan/kaliningraph\",\n \"description\": \"Graph library with a DSL for constructing graphs and visualizing the behavior of graph algorithms\",\n \"dependencies\": [\n \"com.github.breandan:kaliningraph:0.1.4\"\n ],\n \"imports\": [\n \"edu.mcgill.kaliningraph.*\",\n \"edu.mcgill.kaliningraph.matrix.*\",\n \"edu.mcgill.kaliningraph.circuits.*\",\n \"org.ejml.data.*\",\n \"org.ejml.kotlin.*\"\n ],\n \"renderers\": {\n \"edu.mcgill.kaliningraph.LabeledGraph\": \"HTML(($it as edu.mcgill.kaliningraph.Graph<*, *, *>).html())\",\n \"edu.mcgill.kaliningraph.circuits.Gate\": \"HTML(($it as edu.mcgill.kaliningraph.circuits.Gate).graph.html())\",\n \"edu.mcgill.kaliningraph.circuits.NFunction\": \"HTML(($it as edu.mcgill.kaliningraph.circuits.NFunction).graph.html())\",\n \"edu.mcgill.kaliningraph.circuits.ComputationGraph\": \"HTML(($it as edu.mcgill.kaliningraph.Graph<*, *, *>).html())\",\n \"edu.mcgill.kaliningraph.matrix.BMat\": \"HTML(\\\"\\\")\",\n \"edu.mcgill.kaliningraph.matrix.BSqMat\": \"HTML(\\\"\\\")\"\n }\n}\n```" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "loadDescriptor(\"kaliningraph\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You might have noticed that almost every descriptor in `Kotlin/kotlin-jupyter-libraries` contains link and description.\n", "They are used to build `:help` command output and [our README](https://github.com/Kotlin/kotlin-jupyter#list-of-supported-libraries)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Creating an integration" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So, we learned the concept of the integration. It is a wrapper on top of the usual Kotlin library that simplifies and elevates the experience of using this library in the notebook.\n", "Comprehensive guide to writing library integrations can be found [here](). To inspire you, there is an example of the `dataframe` integration below." ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:26:14.046897300Z", "start_time": "2023-07-01T16:26:06.491895300Z" } }, "outputs": [], "source": [ "%use dataframe" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:26:16.898989Z", "start_time": "2023-07-01T16:26:14.024900100Z" } }, "outputs": [], "source": [ "val df = DataFrame.read(\"https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's try to investigate the data that we have just read." ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:26:17.314907100Z", "start_time": "2023-07-01T16:26:16.825895800Z" } }, "outputs": [ { "data": { "text/html": " \n ", "application/kotlindataframe+json": "{\"nrow\":150,\"ncol\":1,\"columns\":[\"petal_length\"],\"kotlin_dataframe\":[{\"petal_length\":1.4},{\"petal_length\":1.4},{\"petal_length\":1.3},{\"petal_length\":1.5},{\"petal_length\":1.4},{\"petal_length\":1.7},{\"petal_length\":1.4},{\"petal_length\":1.5},{\"petal_length\":1.4},{\"petal_length\":1.5},{\"petal_length\":1.5},{\"petal_length\":1.6},{\"petal_length\":1.4},{\"petal_length\":1.1},{\"petal_length\":1.2},{\"petal_length\":1.5},{\"petal_length\":1.3},{\"petal_length\":1.4},{\"petal_length\":1.7},{\"petal_length\":1.5}]}" }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.petal_length" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:26:19.919905400Z", "start_time": "2023-07-01T16:26:17.097895900Z" } }, "outputs": [ { "data": { "text/html": " \n ", "application/kotlindataframe+json": "{\"nrow\":1,\"ncol\":5,\"columns\":[\"sepal_length\",\"sepal_width\",\"petal_length\",\"petal_width\",\"species\"],\"kotlin_dataframe\":[{\"sepal_length\":5.9,\"sepal_width\":3.0,\"petal_length\":4.2,\"petal_width\":1.5,\"species\":\"versicolor\"}]}" }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.filter { petal_width >= 1.5 && petal_length < 4.5 }" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There is also a special variable in the integration to manage display options. For example, we can limit number of displayed rows." ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:26:20.048901400Z", "start_time": "2023-07-01T16:26:17.569046600Z" } }, "outputs": [], "source": [ "dataFrameConfig.display.rowsLimit = 5" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:26:20.813895800Z", "start_time": "2023-07-01T16:26:17.765896100Z" } }, "outputs": [ { "data": { "text/html": " \n ", "application/kotlindataframe+json": "{\"nrow\":150,\"ncol\":5,\"columns\":[\"sepal_length\",\"sepal_width\",\"petal_length\",\"petal_width\",\"species\"],\"kotlin_dataframe\":[{\"sepal_length\":5.1,\"sepal_width\":3.5,\"petal_length\":1.4,\"petal_width\":0.2,\"species\":\"setosa\"},{\"sepal_length\":4.9,\"sepal_width\":3.0,\"petal_length\":1.4,\"petal_width\":0.2,\"species\":\"setosa\"},{\"sepal_length\":4.7,\"sepal_width\":3.2,\"petal_length\":1.3,\"petal_width\":0.2,\"species\":\"setosa\"},{\"sepal_length\":4.6,\"sepal_width\":3.1,\"petal_length\":1.5,\"petal_width\":0.2,\"species\":\"setosa\"},{\"sepal_length\":5.0,\"sepal_width\":3.6,\"petal_length\":1.4,\"petal_width\":0.2,\"species\":\"setosa\"}]}" }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's now see what's happening there under the hood. First, we enable debugging logging that will print the code that is executed under the hood." ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:26:20.826898500Z", "start_time": "2023-07-01T16:26:17.976898300Z" } }, "outputs": [], "source": [ "%trackExecution" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then, we define some other dataframe." ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:26:22.598896Z", "start_time": "2023-07-01T16:26:18.109896400Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Executing:\n", "val df1 = dataFrameOf(\"A\", \"B\", \"C\")(1, \"Str1\", null, 2, \"Str2\", 3)\n", "\r\n", "Executing:\n", "@DataSchema\n", "interface _DataFrameType1\n", "\n", "val ColumnsContainer<_DataFrameType1>.A: DataColumn @JvmName(\"_DataFrameType1_A\") get() = this[\"A\"] as DataColumn\n", "val DataRow<_DataFrameType1>.A: Int @JvmName(\"_DataFrameType1_A\") get() = this[\"A\"] as Int\n", "val ColumnsContainer<_DataFrameType1?>.A: DataColumn @JvmName(\"Nullable_DataFrameType1_A\") get() = this[\"A\"] as DataColumn\n", "val DataRow<_DataFrameType1?>.A: Int? @JvmName(\"Nullable_DataFrameType1_A\") get() = this[\"A\"] as Int?\n", "val ColumnsContainer<_DataFrameType1>.B: DataColumn @JvmName(\"_DataFrameType1_B\") get() = this[\"B\"] as DataColumn\n", "val DataRow<_DataFrameType1>.B: String @JvmName(\"_DataFrameType1_B\") get() = this[\"B\"] as String\n", "val ColumnsContainer<_DataFrameType1?>.B: DataColumn @JvmName(\"Nullable_DataFrameType1_B\") get() = this[\"B\"] as DataColumn\n", "val DataRow<_DataFrameType1?>.B: String? @JvmName(\"Nullable_DataFrameType1_B\") get() = this[\"B\"] as String?\n", "val ColumnsContainer<_DataFrameType1>.C: DataColumn @JvmName(\"_DataFrameType1_C\") get() = this[\"C\"] as DataColumn\n", "val DataRow<_DataFrameType1>.C: Int? @JvmName(\"_DataFrameType1_C\") get() = this[\"C\"] as Int?\n", "val ColumnsContainer<_DataFrameType1?>.C: DataColumn @JvmName(\"Nullable_DataFrameType1_C\") get() = this[\"C\"] as DataColumn\n", "val DataRow<_DataFrameType1?>.C: Int? @JvmName(\"Nullable_DataFrameType1_C\") get() = this[\"C\"] as Int?\n", "df1.cast<_DataFrameType1>()\r\n", "Executing:\n", "val df1 = res54\r\n" ] } ], "source": [ "val df1 = dataFrameOf(\"A\", \"B\", \"C\")(1, \"Str1\", null, 2, \"Str2\", 3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As you can see, a marker interface `_DataFrameType1` is created and property accessors are generated for it. Let's check what's the type of `df1` now:" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:26:22.896913600Z", "start_time": "2023-07-01T16:26:19.412895300Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Executing:\n", "::df1\n", "\r\n" ] }, { "data": { "text/plain": "val Line_55_jupyter.df1: org.jetbrains.kotlinx.dataframe.DataFrame" }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "::df1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So, `df1` now is not simply a `DataFrame<*>`, it's `DataFrame<_DataFrameType1>`. That's exactly what allows us to statically resolve defined property accessors on it." ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:26:22.899897600Z", "start_time": "2023-07-01T16:26:19.694009700Z" } }, "outputs": [], "source": [ "%trackExecution off" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "API that DataFrame uses to achieve all of these is open, and you can try it yourself! The code of the integration is available [here](https://github.com/Kotlin/dataframe/blob/master/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/jupyter/Integration.kt)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Inter-cell API" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To use Kotlin Notebook API you don't necessarily need to create a separate file with integration. As it was shown above, you can place in `USE { }` call the same integration that you would\n", "place in the standalone library or JSON descriptor. However, notebook offers API to get some information about the current notebook session and to set it up.\n", "\n", "The main entry point is `notebook`: it allows you to investigate what cells were already executed, what libraries were loaded, what renderers and variable processors are loaded and gives the ability to unload them.\n", "Read the documentation of the `Notebook` interface for reliable and actual information about this API" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:26:23.056895600Z", "start_time": "2023-07-01T16:26:19.711907100Z" } }, "outputs": [ { "data": { "text/plain": "> 2 + 2\n\n> val result = 3 * 14\n\n> result\n\n> (Out[3] as Int) / 2\n\n> val a1: Int = 1\nval a2: Int? = 2\nval a3: Int? = null\n" }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "notebook.cellsList.take(5).map { \"> \" + it.code }.joinToString(\"\\n\")" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:26:23.292899900Z", "start_time": "2023-07-01T16:26:20.125896500Z" } }, "outputs": [ { "data": { "text/plain": "0.11.0.381" }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "notebook.kernelVersion" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:26:23.338896200Z", "start_time": "2023-07-01T16:26:20.302896300Z" } }, "outputs": [ { "data": { "text/plain": "{0=[], 1=[result], 2=[result], 3=[result], 4=[a1, a3, result], -1=[___a2, a2, kandyConfig, dataFrameConfig, df, df1, height, width], 5=[result, a1, a2], 7=[result, a1, a2], 9=[result, a1, a2], 10=[kotlinMascot, result, a1, a2], 11=[result, a1, a2], 12=[result, a1, a2], 13=[graphics, height, image, width, result, a1, a2], 14=[result, a1, a2, height, width], 15=[a1, a2, height, width], 16=[a1, a2, height, width], 17=[a1, a2, height, width], 20=[a2, height, width], 21=[height, width], 22=[height, width], 23=[height, width], 24=[experimentData, experimentX, experimentY, gaussPlot, height, width], 25=[height, width], 27=[bob, height, width], 28=[height, width], 29=[height, width], 30=[height, width], 31=[height, width], 32=[height, width], 33=[height, width], 34=[height, width], 36=[height, width], 37=[height, width], 38=[height, width], 39=[height, width], 40=[height, width], 42=[height, width], 43=[height, width], 45=[height, width], 46=[height, width], 47=[height, width]}" }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "notebook.cellVariables" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Also, a couple of options is available with `SessionOptions` object." ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:26:23.354896700Z", "start_time": "2023-07-01T16:26:20.468007400Z" } }, "outputs": [ { "data": { "text/plain": "true" }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "SessionOptions.resolveSources // could be switched off to speed up dependencies loading process" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:26:23.377895300Z", "start_time": "2023-07-01T16:26:20.696900200Z" } }, "outputs": [ { "data": { "text/plain": "false" }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "SessionOptions.resolveMpp // could be switched on to resolve MPP libraries such as kotlinx-serialization from \"universal\" Maven coordinates" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Sharing the notebooks\n", "\n", "Essentially, Kotlin notebooks are Jupyter notebooks. It means they could be opened, edited and run with any Jupyter client such as [Jupyter Notebook](https://jupyter.org/),\n", "[Jupyter Lab](https://jupyterlab.readthedocs.io/en/latest/) and [Datalore](https://www.jetbrains.com/datalore/). [We plan](https://youtrack.jetbrains.com/issue/KTNB-291/Datalore-Share-action) to integrate with Datalore better in the future.\n", "The only limitation is that project dependencies will be not included into the notebook in other clients. However, you can build the logic based on Jupyter client type:" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:26:23.386896200Z", "start_time": "2023-07-01T16:26:20.915897500Z" } }, "outputs": [], "source": [ "if (notebook.jupyterClientType != JupyterClientType.KOTLIN_NOTEBOOK) {\n", " // load substitutive dependencies\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notebooks could be also loaded and viewed on GitHub (including gists). Limitation there is that JS isn't executed in the outputs.\n", "To overcome it in `kandy`, we [add extra SVG output that is hidden from JS](https://github.com/Kotlin/kandy/blob/main/kandy-lets-plot/src/main/kotlin/org/jetbrains/kotlinx/kandy/letsplot/util/rendering.kt#L46).\n", "\n", "Kotlin Notebooks could be also converted to some other format using [nbconvert tool](https://nbconvert.readthedocs.io/en/latest/)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## What's next?\n", "\n", "Kotlin Notebook project is experimental and actively developed. Use the latest version of plugin to be in sync.\n", "We eagerly need your stories and feedback: share them in the dedicated [#notebooks](https://kotlinlang.slack.com/archives/C05333T208Y) Slack channel or in our [issue tracker](https://youtrack.jetbrains.com/issues/KTNB).\n", "\n", "See you in the next cell!" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "ExecuteTime": { "end_time": "2023-07-01T16:26:23.388895Z", "start_time": "2023-07-01T16:26:21.279905600Z" } }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Kotlin", "language": "kotlin", "name": "kotlin" }, "ktnbPluginMetadata": { "isAddProjectLibrariesToClasspath": false }, "language_info": { "codemirror_mode": "text/x-kotlin", "file_extension": ".kt", "mimetype": "text/x-kotlin", "name": "kotlin", "nbconvert_exporter": "", "pygments_lexer": "kotlin", "version": "1.8.20" } }, "nbformat": 4, "nbformat_minor": 1 }