diff --git a/content/Week_2_2/PA_2_2_love_is_sparse.ipynb b/content/Week_2_2/PA/PA_2_2_love_is_sparse.ipynb similarity index 57% rename from content/Week_2_2/PA_2_2_love_is_sparse.ipynb rename to content/Week_2_2/PA/PA_2_2_love_is_sparse.ipynb index 029f0871e1ed828a0c53526bd9b431a366f6af95..03f44d27216a015f1c54d5e84c2a7230486cbc8b 100644 --- a/content/Week_2_2/PA_2_2_love_is_sparse.ipynb +++ b/content/Week_2_2/PA/PA_2_2_love_is_sparse.ipynb @@ -28,24 +28,16 @@ "tags": [] }, "source": [ - "## Overview\n", + "This assignment will introduce you to the concept of sparse matrices in Python and how they can be useful to speed up computations and reduce file sizes. This is especially important when using the numerical schemes we are learning about (FDM, FVM, FEM) to solve problems with a lot of unknowns at each time step. To accomplish this, we will be using the `scipy.sparse` library.\n", "\n", - "This assignment will introduce you to the concept of sparse matrices in Python and how they can be useful to speed up computations and reduce file sizes. To this end, we will be using the `scipy.sparse` library.\n", + "Keep the `scipy.sparse` [documentation](https://docs.scipy.org/doc/scipy/reference/sparse.html) handy. Some of the work you'll do is based off this [blog](https://www.sefidian.com/2021/04/28/python-scipy-sparse-matrices-explained/), so you may find it helpful. In addition, if you don't know what a byte is, you may want to read up on [Wikipdia here](https://en.wikipedia.org/wiki/Byte) (not all of it, as long as you recognize that it is a measure of storage space on a computer).The concepts you learn here are applied to the Finite Element Method in this [book chapter](https://mude.citg.tudelft.nl/book/fem/matrix.html), which you are expected to read during Week 2.2.\n", "\n", - "**You will pass this assignment as long as your respository fulfills the following criteria:** \n", - "\n", - "- You have completed this notebook and it runs without errors\n", - "\n", - "## Reading\n", - "\n", - "Keep the `scipy.sparse` [documentation](https://docs.scipy.org/doc/scipy/reference/sparse.html) handy. Some of the work you'll do is based off this [blog](https://www.sefidian.com/2021/04/28/python-scipy-sparse-matrices-explained/), so you may find it helpful. In addition, if you don't know what a byte is, you may want to read up on [Wikipdia here](https://en.wikipedia.org/wiki/Byte) (not all of it, as long as you recognize that it is a measure of storage space on a computer).The concepts you learn here are applied to the Finite Element Method in this [book chapter UPDATE LINK](https://mude.citg.tudelft.nl/book/fem/matrix.html), which you are expected to read during Week 2.2.\n", - "\n", - "**Note:** you probably skipped over all the links in the paragraph above. While we forgive you for your haste, just remember to revisit some of them if you are struggling to finish the questions below!\n" + "**Note:** _you probably skipped over all the links in the paragraph above. While we forgive you for your haste, just remember to revisit some of them if you are struggling to finish the questions below!_\n" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "a262eac1", "metadata": { "tags": [] @@ -80,15 +72,25 @@ "<div style=\"background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%\">\n", "<p>\n", "<b>Task 1.1:</b> \n", - " \n", - "- Create a function (`create_dense`) which returns a square matrix of arbitrary size. \n", - "- The function will take as input the size N (such that the matrix is N x N) and one float between 0 and 1, which represents the approximate fraction of the elements of the matrix which are non-zero (it doesn't have to be super accurate).\n", - " \n", - "For now it just return a regular Numpy matrix. To do this, you can use <a href=\"https://numpy.org/doc/stable/reference/random/generated/numpy.random.rand.html\">numpy.random.rand</a> to create a random set of values between 0 and 1 and then threshold the entries with a simple boolean operator.\n", + "\n", + "First we will create a regular Numpy matrix to use as a starting point for making a sparse one.\n", + "\n", + "- Create a function (`create_dense`) which returns a square matrix of arbitrary size filled with zero and non-zero values between 0 and 1. \n", + "- The function should take as input the size N (such that the matrix is N x N) and one float between 0 and 1, which represents the approximate fraction of the elements of the matrix which are non-zero.\n", + "- Use <a href=\"https://numpy.org/doc/stable/reference/random/generated/numpy.random.rand.html\">numpy.random.rand</a> to create a random set of values between 0 and 1\n", + "- Remove a portion of the values by using simple boolean expression to set the fraction specified by <code>percentage</code> to zero.\n", "</p>\n", "</div>" ] }, + { + "cell_type": "markdown", + "id": "2c707a48", + "metadata": {}, + "source": [ + "<div style=\"background-color:#facb8e; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%\"> <p>Note that the function below uses colons <code>:</code> with argument type, as well as a <code>-></code> before closing the function definition line. This is called \"typing,\" which is a useful feature for helping to write code that behaves properly. In this PA you should use them like hints to help you write the functions and use them properly. If you are curious, read more <a href=\"https://docs.python.org/3/library/typing.html\" target=\"_blank\">here</a>.</p></div>" + ] + }, { "cell_type": "code", "execution_count": null, @@ -98,12 +100,10 @@ }, "outputs": [], "source": [ - "# SOLUTION (a few things will be removed)\n", "def create_dense(size: int, percentage: float) -> np.array:\n", " matrix = YOUR_CODE_HERE\n", " matrix[YOUR_CODE_HERE] = 0\n", - " return matrix\n", - "####" + " return matrix" ] }, { @@ -197,48 +197,44 @@ "Let's compare the new storage requirements and see how much of an improvement we got (it should approach the value used above for `test_percentage`, but not reach it exactly):" ] }, + { + "cell_type": "markdown", + "id": "bb4b15d3", + "metadata": {}, + "source": [ + "<div style=\"background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%\">\n", + "<p>\n", + "<b>Task 1.4:</b> \n", + " Run the code below and comment on the improvement and whether or not it reaches the target percentage of sparse values in the non-sparse matrix.\n", + "</p>\n", + "</div>" + ] + }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "a46df127", "metadata": { "tags": [] }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CSR matrix size: 100418 bytes\n", - "Compared to the normal matrix, CSR uses this fraction of space: 0.100\n", - "BSR matrix size: 100418 bytes\n", - "Compared to the normal matrix, BSR uses this fraction of space: 0.100\n" - ] - } - ], + "outputs": [], "source": [ "print(f\"CSR matrix size: {csr_matrix.data.size} bytes\")\n", - "print(f\"Compared to the normal matrix, CSR uses this fraction of space: {csr_matrix.data.nbytes/my_matrix_size:0.3f}\")\n", + "print(f\"Compared to the normal matrix, CSR uses this \"\n", + " +f\"fraction of space: {csr_matrix.data.nbytes/my_matrix_size:0.6f}\")\n", "print(f\"BSR matrix size: {bsr_matrix.data.size} bytes\")\n", - "print(f\"Compared to the normal matrix, BSR uses this fraction of space: {bsr_matrix.data.nbytes/my_matrix_size:0.3f}\")" + "print(f\"Compared to the normal matrix, BSR uses this \"\n", + " +f\"fraction of space: {bsr_matrix.data.nbytes/my_matrix_size:0.6f}\")" ] }, { "cell_type": "markdown", - "id": "cea28aa8", + "id": "f832b8e0", "metadata": {}, "source": [ "## Task 2: [What is love?](https://www.youtube.com/watch?v=HEXWRTEbj1I)\n", "\n", - "Let's look into a small example of how sparse matrices can also help improve calculation speeds. We'll study the mysterious case of a massive friend group with a concerning love circle and how we can predict how each person feels." - ] - }, - { - "cell_type": "markdown", - "id": "f832b8e0", - "metadata": {}, - "source": [ - "We know there is a certain pecking order in this group, and neighbours in this order have a love-hate relationship which can be quantified with a simple differential equation:\n", + "Let's look into a small example of how sparse matrices can also help improve calculation speeds. We'll study the mysterious case of a massive friend group with a concerning love circle and how we can predict how each person feels with respect to the other. This is quantified by the amount of love, $n_i$, that is \"felt\" by person $i$. In fact, the feelings grow stronger with time, which means they can be described with a simple differential relationship between _neighbors_, where each person in the group is happy when the other is sad, but the opposite is true for the other person, which can be defined like this: \n", "\n", "$$\n", "\\begin{pmatrix}\n", @@ -254,15 +250,9 @@ "n_1\\\\\n", "n_2 \\\\\n", "\\end{pmatrix} \n", - "$$" - ] - }, - { - "cell_type": "markdown", - "id": "9b9d037e", - "metadata": {}, - "source": [ - "The state of any given person indicates how much they love the group in general. So in this case, person 2 doesn't like it when person 1 is happy. If we extend this to a four case scenario we'd get the following matrix:\n", + "$$\n", + "\n", + "So in this case, person 2 doesn't like it when person 1 is happy but person 2 likes it when person 1 is happy. If we extend this to a four case scenario we'd get the following matrix:\n", "$$\n", "\\begin{pmatrix}\n", "\\cfrac{dn_1}{dt}\\\\\n", @@ -285,30 +275,38 @@ "\\end{pmatrix} \n", "$$\n", "\n", - "What happens if we extend it to even more people?\n", + "Now we can see how everyone's feelings towards each other are...complicated!\n", + "\n", + "What happens if we extend it to even more people? The pattern persists, but importantly: _if the group gets very large, we will be storing a lot of useless information, all the 0's between the 1's!_\n", + "\n", + "OK, so maybe this is a silly example, but it creates a problem that is actually very similar to how we use individual elements to construct a global system of equations to solve in the Finite Element Method!\n", + "\n", + "We can easily operationalize the procedure of _constructing_ this matrix using the method `ix_`, for which a simple example is provided in the code cell below (this example is generic to illustrate `ix_` usage and is not related to the love circle!):" + ] + }, + { + "cell_type": "markdown", + "id": "eeeac139", + "metadata": {}, + "source": [ + "<div style=\"background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%\">\n", + "<p>\n", + "<b>Task 2.0:</b> \n", + " \n", + "Read and modify the code cell below until you are confident you understand how the <code>ix_</code> method works.\n", "\n", - "Coincidentally this is very similar to how we use individual elements in the Finite Element Method! We can easily operationalize it using the method `ix_`, for which a simple example is provided in the code cell below (this example is generic to illustrate `ix_` usage and is not related to the love circle!):" + "</p>\n", + "</div>" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "77f295f5", "metadata": { "tags": [] }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[0. 0. 0.5 0. ]\n", - " [0. 1. 0.5 0. ]\n", - " [0. 0. 0.5 0. ]\n", - " [0. 1. 0.5 0. ]]\n" - ] - } - ], + "outputs": [], "source": [ "blank = np.zeros(shape=(4, 4))\n", "blueprint = np.array([[0, 0.5], \n", @@ -322,6 +320,14 @@ "print(blank)" ] }, + { + "cell_type": "markdown", + "id": "4acb01e5", + "metadata": {}, + "source": [ + "Now we return to the love triangle problem and try to construct the matrix for a large group using `ix_`." + ] + }, { "cell_type": "markdown", "id": "7a73f37b-6763-4d1c-92b8-994aa28f8ff6", @@ -330,7 +336,9 @@ "<div style=\"background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%\">\n", "<p>\n", "<b>Task 2.1:</b> \n", - " Generate the matrix <code>relationship</code> for the differential equation for 1000 people. Use the <a href=\"https://numpy.org/doc/stable/reference/generated/numpy.ix_.html\"><code>numpy.ix_</code></a> function to make your life easier. \n", + "Generate the matrix <code>relationship</code> for the differential equation for 1000 people. Use the <a href=\"https://numpy.org/doc/stable/reference/generated/numpy.ix_.html\"><code>numpy.ix_</code></a> function to make your life easier.\n", + "\n", + "Note that we have already provided an easy way to place the smaller sub-matrices in the right place.\n", "</p>\n", "</div>" ] @@ -347,7 +355,72 @@ "N = 1000\n", "relationship = np.zeros(shape=(N, N))\n", "\n", - "YOUR_CODE_HERE" + "YOUR_CODE_HERE\n", + "\n", + "for i in range(N):\n", + " relationship[np.ix_([i, (i+1)%N], [i, (i+1)%N])] = YOUR_CODE_HERE" + ] + }, + { + "cell_type": "markdown", + "id": "28b9a66f", + "metadata": {}, + "source": [ + "Remember `plt.matshow()`? We used this back in Q1 to visualize the contents of a matrix. Try it now to see if we build this matrix correctly with `ix_`." + ] + }, + { + "cell_type": "markdown", + "id": "11c4eb64", + "metadata": {}, + "source": [ + "<div style=\"background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%\">\n", + "<p>\n", + "<b>Task 2.2:</b> \n", + " Use <code>plt.matshow()</code> to view the contents of the matrix <code>relationship</code>.\n", + "</p>\n", + "</div>" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2cd01702", + "metadata": {}, + "outputs": [], + "source": [ + "plt.matshow(YOUR_CODE_HERE)" + ] + }, + { + "cell_type": "markdown", + "id": "dc948f50", + "metadata": {}, + "source": [ + " Note that since the matrix is huge, we have to look at only a small subset of it in order to see its contents; try changing the indices of the plotted values to get a better view." + ] + }, + { + "cell_type": "markdown", + "id": "ca159fe4", + "metadata": {}, + "source": [ + "<div style=\"background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%\">\n", + "<p>\n", + "<b>Task 2.3:</b> \n", + " Try again, but look at a subset of the matrix!\n", + "</p>\n", + "</div>" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8ae5a340", + "metadata": {}, + "outputs": [], + "source": [ + "plt.matshow(YOUR_CODE_HERE)" ] }, { @@ -365,8 +438,10 @@ "source": [ "<div style=\"background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%\">\n", "<p>\n", - "<b>Task 2.2:</b> \n", - " Find the time it takes to evaluate the relationship using <code>timeit</code> by entering the function you wish to evaluate as a string. HINT: you have already learned how to convert a matrix into a sparse format, and the function is defined for you. Run the code cell and compare the performances of the different matrix formats. Which one is faster? How much space do they take?\n", + "<b>Task 2.4:</b> \n", + "Find the time it takes to evaluate the relationship using <code>timeit</code> by entering the function you wish to evaluate as a string.\n", + "\n", + "HINT: you have already learned how to convert a matrix into a sparse format, and the function is defined for you. Run the code cell and compare the performances of the different matrix formats. Which one is faster? How much space do they take?\n", "</p>\n", "</div>" ] @@ -378,35 +453,52 @@ "metadata": { "tags": [] }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Standard: 0.3432\n", - "CSR: 0.0091\n", - "BSR: 0.0085\n" - ] - } - ], + "outputs": [], "source": [ "N_ITS = 1000\n", "T = 5 # Seconds\n", "dt = T/N_ITS\n", "\n", "def test(rel_matrix):\n", - " state = np.zeros(N); state[0] = 1\n", + " state = np.zeros(N)\n", + " state[0] = 1\n", " for i in range(N_ITS):\n", " state = state + rel_matrix @ state * dt\n", "\n", - "# SOLUTION (only the strings in timeit will be removed + matrix definitions)\n", "csr_matrix = YOUR_CODE_HERE\n", "bsr_matrix = YOUR_CODE_HERE\n", - "print(f\"Standard: {timeit.timeit('test(relationship)', globals=globals(), number=10)/10:.4f}\")\n", - "print(f\"CSR: {timeit.timeit('test(csr_matrix)', globals=globals(), number=10)/10:.4f}\")\n", - "print(f\"BSR: {timeit.timeit('test(bsr_matrix)', globals=globals(), number=10)/10:.4f}\")\n", - "########\n", - " " + "print(f\"Standard: {timeit.timeit('test(relationship)',\n", + " globals=globals(),\n", + " number=10)/10:.4f}\")\n", + "print(f\"CSR: {timeit.timeit('test(csr_matrix)',\n", + " globals=globals(),\n", + " number=10)/10:.4f}\")\n", + "print(f\"BSR: {timeit.timeit('test(bsr_matrix)',\n", + " globals=globals(),\n", + " number=10)/10:.4f}\")" + ] + }, + { + "cell_type": "markdown", + "id": "a843ae4f", + "metadata": {}, + "source": [ + "<div style=\"background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%\">\n", + "<p>\n", + "<b>Task 2.5:</b> \n", + "\n", + "What is the change in performance by using the sparse matrices?\n", + "\n", + "</p>\n", + "</div>" + ] + }, + { + "cell_type": "markdown", + "id": "50d74c04", + "metadata": {}, + "source": [ + "_Your answer here._" ] }, { @@ -414,12 +506,12 @@ "id": "920bab21", "metadata": {}, "source": [ - "One final consideration when using sparse matrices is that it can take a long time to generate them from a regular matrix. You can test this out by placing the matrix generation inside or outside the <code>timeit</code> code to compare their performances." + "One final consideration when using sparse matrices is that it can take a long time to generate them from a regular matrix. You can test this out by placing the matrix generation inside or outside the <code>timeit</code> code to compare their performances. Try it!" ] }, { "cell_type": "markdown", - "id": "80580ab9-4d79-46b1-ae6e-775af04d43ad", + "id": "bf4fdf38", "metadata": {}, "source": [ "**End of notebook.**\n", @@ -430,19 +522,19 @@ " .markdown {width:100%; position: relative}\n", " article { position: relative }\n", " </style>\n", - " <a rel=\"license\" href=\"http://creativecommons.org/licenses/by-nc-sa/4.0/\">\n", - " <img alt=\"Creative Commons License\" style=\"border-width:; width:88px; height:auto; padding-top:10px\" src=\"https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png\" />\n", + " <a rel=\"license\" href=\"http://creativecommons.org/licenses/by/4.0/\">\n", + " <img alt=\"Creative Commons License\" style=\"border-width:; width:88px; height:auto; padding-top:10px\" src=\"https://i.creativecommons.org/l/by/4.0/88x31.png\" />\n", " </a>\n", " <a rel=\"TU Delft\" href=\"https://www.tudelft.nl/en/ceg\">\n", - " <img alt=\"TU Delft\" style=\"border-width:0; width:100px; height:auto; padding-bottom:0px\" src=\"https://gitlab.tudelft.nl/mude/public/-/raw/main/tu-logo/TU_P1_full-color.png\"/>\n", + " <img alt=\"TU Delft\" style=\"border-width:0; width:100px; height:auto; padding-bottom:0px\" src=\"https://gitlab.tudelft.nl/mude/public/-/raw/main/tu-logo/TU_P1_full-color.png\" />\n", " </a>\n", " <a rel=\"MUDE\" href=\"http://mude.citg.tudelft.nl/\">\n", - " <img alt=\"MUDE\" style=\"border-width:0; width:100px; height:auto; padding-bottom:0px\" src=\"https://gitlab.tudelft.nl/mude/public/-/raw/main/mude-logo/MUDE_Logo-small.png\"/>\n", + " <img alt=\"MUDE\" style=\"border-width:0; width:100px; height:auto; padding-bottom:0px\" src=\"https://gitlab.tudelft.nl/mude/public/-/raw/main/mude-logo/MUDE_Logo-small.png\" />\n", " </a>\n", " \n", "</h3>\n", "<span style=\"font-size: 75%\">\n", - "© Copyright 2023 <a rel=\"MUDE Team\" href=\"https://studiegids.tudelft.nl/a101_displayCourse.do?course_id=65595\">MUDE Teaching Team</a> TU Delft. This work is licensed under a <a rel=\"license\" href=\"http://creativecommons.org/licenses/by-nc-sa/4.0/\">Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License</a>." + "© Copyright 2024 <a rel=\"MUDE\" href=\"http://mude.citg.tudelft.nl/\">MUDE</a> TU Delft. This work is licensed under a <a rel=\"license\" href=\"http://creativecommons.org/licenses/by/4.0/\">CC BY 4.0 License</a>." ] } ], @@ -462,7 +554,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.5" + "version": "3.12.4" }, "widgets": { "application/vnd.jupyter.widget-state+json": { diff --git a/content/Week_2_2/PA/PA_2_2_solution.ipynb b/content/Week_2_2/PA/PA_2_2_solution.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..bdd20be3ea06649ddf13c55e593d46913b70d5f6 --- /dev/null +++ b/content/Week_2_2/PA/PA_2_2_solution.ipynb @@ -0,0 +1,709 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "c96d6259-08d6-4289-aea2-589d67cdb5ee", + "metadata": {}, + "source": [ + "# PA 2.2: Love is Sparse\n", + "\n", + "<h1 style=\"position: absolute; display: flex; flex-grow: 0; flex-shrink: 0; flex-direction: row-reverse; top: 60px;right: 30px; margin: 0; border: 0\">\n", + " <style>\n", + " .markdown {width:100%; position: relative}\n", + " article { position: relative }\n", + " </style>\n", + " <img src=\"https://gitlab.tudelft.nl/mude/public/-/raw/main/tu-logo/TU_P1_full-color.png\" style=\"width:100px\" />\n", + " <img src=\"https://gitlab.tudelft.nl/mude/public/-/raw/main/mude-logo/MUDE_Logo-small.png\" style=\"width:100px\" />\n", + "</h1>\n", + "<h2 style=\"height: 10px\">\n", + "</h2>\n", + "\n", + "*[CEGM1000 MUDE](http://mude.citg.tudelft.nl/): Week 2.2 Due: complete this PA prior to class on Friday, Nov 22, 2024.*" + ] + }, + { + "cell_type": "markdown", + "id": "7a28e541-d2d0-48a9-abf6-7b73075c8fd3", + "metadata": { + "tags": [] + }, + "source": [ + "This assignment will introduce you to the concept of sparse matrices in Python and how they can be useful to speed up computations and reduce file sizes. This is especially important when using the numerical schemes we are learning about (FDM, FVM, FEM) to solve problems with a lot of unknowns at each time step. To accomplish this, we will be using the `scipy.sparse` library.\n", + "\n", + "Keep the `scipy.sparse` [documentation](https://docs.scipy.org/doc/scipy/reference/sparse.html) handy. Some of the work you'll do is based off this [blog](https://www.sefidian.com/2021/04/28/python-scipy-sparse-matrices-explained/), so you may find it helpful. In addition, if you don't know what a byte is, you may want to read up on [Wikipdia here](https://en.wikipedia.org/wiki/Byte) (not all of it, as long as you recognize that it is a measure of storage space on a computer).The concepts you learn here are applied to the Finite Element Method in this [book chapter](https://mude.citg.tudelft.nl/book/fem/matrix.html), which you are expected to read during Week 2.2.\n", + "\n", + "**Note:** _you probably skipped over all the links in the paragraph above. While we forgive you for your haste, just remember to revisit some of them if you are struggling to finish the questions below!_\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "a262eac1", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import scipy.sparse as sparse\n", + "import matplotlib.pyplot as plt\n", + "import timeit" + ] + }, + { + "cell_type": "markdown", + "id": "c3cd5017-10e0-4b64-ad1a-b626d80a128a", + "metadata": { + "tags": [] + }, + "source": [ + "## Task 1: Why sparse?\n", + "\n", + "Some matrices have a lot of zeros, with such an example given below. When this is the case, the way we store the actual information of the matrix (the non-zero elements) can have a big impact on computation speed and storage demands. Formats which handle this by only storing non-zero elements are called sparse, and have very different internal representations of the data to the matrices you have been familiarized with in previous programming assignments.\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "f583dfa0-5a21-4ebb-99e5-7b27b323171d", + "metadata": {}, + "source": [ + "<div style=\"background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%\">\n", + "<p>\n", + "<b>Task 1.1:</b> \n", + "\n", + "First we will create a regular Numpy matrix to use as a starting point for making a sparse one.\n", + "\n", + "- Create a function (`create_dense`) which returns a square matrix of arbitrary size filled with zero and non-zero values between 0 and 1. \n", + "- The function should take as input the size N (such that the matrix is N x N) and one float between 0 and 1, which represents the approximate fraction of the elements of the matrix which are non-zero.\n", + "- Use <a href=\"https://numpy.org/doc/stable/reference/random/generated/numpy.random.rand.html\">numpy.random.rand</a> to create a random set of values between 0 and 1\n", + "- Remove a portion of the values by using simple boolean expression to set the fraction specified by <code>percentage</code> to zero.\n", + "</p>\n", + "</div>" + ] + }, + { + "cell_type": "markdown", + "id": "2c707a48", + "metadata": {}, + "source": [ + "<div style=\"background-color:#facb8e; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%\"> <p>Note that the function below uses colons <code>:</code> with argument type, as well as a <code>-></code> before closing the function definition line. This is called \"typing,\" which is a useful feature for helping to write code that behaves properly. In this PA you should use them like hints to help you write the functions and use them properly. If you are curious, read more <a href=\"https://docs.python.org/3/library/typing.html\" target=\"_blank\">here</a>.</p></div>" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "1310dca9-dc46-4ab1-ab78-0a5389191cfc", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# def create_dense(size: int, percentage: float) -> np.array:\n", + "# matrix = YOUR_CODE_HERE\n", + "# matrix[YOUR_CODE_HERE] = 0\n", + "# return matrix\n", + "\n", + "# SOLUTION\n", + "def create_dense(size: int, percentage: float) -> np.array:\n", + " matrix = np.random.rand(size, size)\n", + " matrix[matrix > percentage] = 0\n", + " return matrix" + ] + }, + { + "cell_type": "markdown", + "id": "d670f274-ef24-4abd-86bf-3cd24e3cf5c5", + "metadata": {}, + "source": [ + "Now, set up a test to check if you set the function up correctly:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "8f6a3117", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# test_size = YOUR_CODE_HERE\n", + "# test_percentage = YOUR_CODE_HERE\n", + "# matrix = create_dense(test_size, test_percentage)\n", + "# assert np.count_nonzero(matrix) < test_percentage*1.1*test_size**2\n", + "\n", + "# SOLUTION\n", + "test_size = 1000\n", + "test_percentage = 0.1\n", + "matrix = create_dense(test_size, test_percentage)\n", + "assert np.count_nonzero(matrix) < test_percentage*1.1*test_size**2" + ] + }, + { + "cell_type": "markdown", + "id": "0f3d9c79", + "metadata": {}, + "source": [ + "<div style=\"background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%\">\n", + "<p>\n", + "<b>Task 1.2:</b> \n", + "Use <a href=\"https://numpy.org/doc/stable/reference/generated/numpy.ndarray.nbytes.html\">array.nbytes</a> to find out how much space a 1000x1000 matrix with 10% non-zero elements takes. Try to explain where this number came from! (Hint: the answer is in the assert statement)\n", + "</p>\n", + "</div>" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "aa5a25f9", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# my_matrix_size = YOUR_CODE_HERE\n", + "# assert my_matrix_size == 8*test_size**2\n", + "\n", + "# SOLUTION\n", + "my_matrix_size = matrix.nbytes\n", + "assert my_matrix_size == 8*test_size**2" + ] + }, + { + "cell_type": "markdown", + "id": "912215f3", + "metadata": {}, + "source": [ + "Next we will explore how to use `scipy.sparse`, and how this reduces the data size of the matrix. The [ documentation](https://docs.scipy.org/doc/scipy/reference/sparse.html) gives us many different types of formats to choose from, so we'll explore two of them: BSR (Block Sparse Row) and CSR (Compressed Sparse Row). " + ] + }, + { + "cell_type": "markdown", + "id": "25a832c8", + "metadata": {}, + "source": [ + "<div style=\"background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%\">\n", + "<p>\n", + "<b>Task 1.3:</b> \n", + " Complete the code below to make a CSR and BSR matrix from the <code>matrix</code> variable.\n", + "</p>\n", + "</div>" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "29c0d2dc", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# csr_matrix = YOUR_CODE_HERE\n", + "# bsr_matrix = YOUR_CODE_HERE\n", + "\n", + "# SOLUTION\n", + "csr_matrix = sparse.csr_array(matrix)\n", + "bsr_matrix = sparse.bsr_array(matrix)" + ] + }, + { + "cell_type": "markdown", + "id": "56334ed7", + "metadata": {}, + "source": [ + "Let's compare the new storage requirements and see how much of an improvement we got (it should approach the value used above for `test_percentage`, but not reach it exactly):" + ] + }, + { + "cell_type": "markdown", + "id": "bb4b15d3", + "metadata": {}, + "source": [ + "<div style=\"background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%\">\n", + "<p>\n", + "<b>Task 1.4:</b> \n", + " Run the code below and comment on the improvement and whether or not it reaches the target percentage of sparse values in the non-sparse matrix.\n", + "</p>\n", + "</div>" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "a46df127", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CSR matrix size: 2000 bytes\n", + "Compared to the normal matrix, CSR uses this fraction of space: 0.002000\n", + "BSR matrix size: 2000 bytes\n", + "Compared to the normal matrix, BSR uses this fraction of space: 0.002000\n" + ] + } + ], + "source": [ + "print(f\"CSR matrix size: {csr_matrix.data.size} bytes\")\n", + "print(f\"Compared to the normal matrix, CSR uses this \"\n", + " +f\"fraction of space: {csr_matrix.data.nbytes/my_matrix_size:0.6f}\")\n", + "print(f\"BSR matrix size: {bsr_matrix.data.size} bytes\")\n", + "print(f\"Compared to the normal matrix, BSR uses this \"\n", + " +f\"fraction of space: {bsr_matrix.data.nbytes/my_matrix_size:0.6f}\")" + ] + }, + { + "cell_type": "markdown", + "id": "69dc3b5c", + "metadata": {}, + "source": [ + "<div style=\"background-color:#FAE99E; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%\">\n", + "<p>\n", + "<b>Solution:</b> \n", + "\n", + "As we can see in the output, the sparse methods reduce the size of the matrix by about 10x than the non-sparse method. This is nearly identical to the target percentage!\n", + "</p>\n", + "</div>" + ] + }, + { + "cell_type": "markdown", + "id": "f832b8e0", + "metadata": {}, + "source": [ + "## Task 2: [What is love?](https://www.youtube.com/watch?v=HEXWRTEbj1I)\n", + "\n", + "Let's look into a small example of how sparse matrices can also help improve calculation speeds. We'll study the mysterious case of a massive friend group with a concerning love circle and how we can predict how each person feels with respect to the other. This is quantified by the amount of love, $n_i$, that is \"felt\" by person $i$. In fact, the feelings grow stronger with time, which means they can be described with a simple differential relationship between _neighbors_, where each person in the group is happy when the other is sad, but the opposite is true for the other person, which can be defined like this: \n", + "\n", + "$$\n", + "\\begin{pmatrix}\n", + "\\cfrac{dn_1}{dt}\\\\\n", + "\\cfrac{dn_2}{dt} \\\\\n", + "\\end{pmatrix} \n", + "=\n", + "\\begin{pmatrix}\n", + "0 & 1\\\\\n", + "-1 & 0 \\\\\n", + "\\end{pmatrix} \n", + "\\begin{pmatrix}\n", + "n_1\\\\\n", + "n_2 \\\\\n", + "\\end{pmatrix} \n", + "$$\n", + "\n", + "So in this case, person 2 doesn't like it when person 1 is happy but person 2 likes it when person 1 is happy. If we extend this to a four case scenario we'd get the following matrix:\n", + "$$\n", + "\\begin{pmatrix}\n", + "\\cfrac{dn_1}{dt}\\\\\n", + "\\cfrac{dn_2}{dt}\\\\\n", + "\\cfrac{dn_3}{dt}\\\\\n", + "\\cfrac{dn_4}{dt}\\\\\n", + "\\end{pmatrix} \n", + "=\n", + "\\begin{pmatrix}\n", + "0 & 1 & 0 & -1 \\\\\n", + "-1 & 0 & 1 & 0 \\\\\n", + "0 & -1 & 0 & 1 \\\\\n", + "1 & 0 & -1 & 0 \\\\\n", + "\\end{pmatrix} \n", + "\\begin{pmatrix}\n", + "n_1 \\\\\n", + "n_2 \\\\\n", + "n_3 \\\\\n", + "n_4 \\\\\n", + "\\end{pmatrix} \n", + "$$\n", + "\n", + "Now we can see how everyone's feelings towards each other are...complicated!\n", + "\n", + "What happens if we extend it to even more people? The pattern persists, but importantly: _if the group gets very large, we will be storing a lot of useless information, all the 0's between the 1's!_\n", + "\n", + "OK, so maybe this is a silly example, but it creates a problem that is actually very similar to how we use individual elements to construct a global system of equations to solve in the Finite Element Method!\n", + "\n", + "We can easily operationalize the procedure of _constructing_ this matrix using the method `ix_`, for which a simple example is provided in the code cell below (this example is generic to illustrate `ix_` usage and is not related to the love circle!):" + ] + }, + { + "cell_type": "markdown", + "id": "eeeac139", + "metadata": {}, + "source": [ + "<div style=\"background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%\">\n", + "<p>\n", + "<b>Task 2.0:</b> \n", + " \n", + "Read and modify the code cell below until you are confident you understand how the <code>ix_</code> method works.\n", + "\n", + "</p>\n", + "</div>" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "77f295f5", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[0. 0. 0.5 0. ]\n", + " [0. 1. 0.5 0. ]\n", + " [0. 0. 0.5 0. ]\n", + " [0. 1. 0.5 0. ]]\n" + ] + } + ], + "source": [ + "blank = np.zeros(shape=(4, 4))\n", + "blueprint = np.array([[0, 0.5], \n", + " [1, 0.5]])\n", + "\n", + "for i in range(2):\n", + " # First argument will be used for rows\n", + " # Second for columns\n", + " blank[np.ix_([i*2, i*2 + 1], [1, 2])] = blueprint\n", + " \n", + "print(blank)" + ] + }, + { + "cell_type": "markdown", + "id": "4acb01e5", + "metadata": {}, + "source": [ + "Now we return to the love triangle problem and try to construct the matrix for a large group using `ix_`." + ] + }, + { + "cell_type": "markdown", + "id": "7a73f37b-6763-4d1c-92b8-994aa28f8ff6", + "metadata": {}, + "source": [ + "<div style=\"background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%\">\n", + "<p>\n", + "<b>Task 2.1:</b> \n", + "Generate the matrix <code>relationship</code> for the differential equation for 1000 people. Use the <a href=\"https://numpy.org/doc/stable/reference/generated/numpy.ix_.html\"><code>numpy.ix_</code></a> function to make your life easier.\n", + "\n", + "Note that we have already provided an easy way to place the smaller sub-matrices in the right place.\n", + "</p>\n", + "</div>" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b622c84f", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# N = 1000\n", + "# relationship = np.zeros(shape=(N, N))\n", + "\n", + "# YOUR_CODE_HERE\n", + "\n", + "# for i in range(N):\n", + "# relationship[np.ix_([i, (i+1)%N], [i, (i+1)%N])] = YOUR_CODE_HERE\n", + "\n", + "# SOLUTION\n", + "N = 1000\n", + "relationship = np.zeros(shape=(N, N))\n", + "\n", + "general = np.array([[0, 1], [-1, 0]])\n", + "\n", + "for i in range(N):\n", + " relationship[np.ix_([i, (i+1)%N], [i, (i+1)%N])] = general" + ] + }, + { + "cell_type": "markdown", + "id": "28b9a66f", + "metadata": {}, + "source": [ + "Remember `plt.matshow()`? We used this back in Q1 to visualize the contents of a matrix. Try it now to see if we build this matrix correctly with `ix_`." + ] + }, + { + "cell_type": "markdown", + "id": "11c4eb64", + "metadata": {}, + "source": [ + "<div style=\"background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%\">\n", + "<p>\n", + "<b>Task 2.2:</b> \n", + " Use <code>plt.matshow()</code> to view the contents of the matrix <code>relationship</code>.\n", + "</p>\n", + "</div>" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2cd01702", + "metadata": {}, + "outputs": [], + "source": [ + "# plt.matshow(YOUR_CODE_HERE)\n", + "\n", + "# SOLUTION\n", + "plt.matshow(relationship)" + ] + }, + { + "cell_type": "markdown", + "id": "dc948f50", + "metadata": {}, + "source": [ + " Note that since the matrix is huge, we have to look at only a small subset of it in order to see its contents; try changing the indices of the plotted values to get a better view." + ] + }, + { + "cell_type": "markdown", + "id": "ca159fe4", + "metadata": {}, + "source": [ + "<div style=\"background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%\">\n", + "<p>\n", + "<b>Task 2.3:</b> \n", + " Try again, but look at a subset of the matrix!\n", + "</p>\n", + "</div>" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8ae5a340", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<matplotlib.image.AxesImage at 0x2865a22ef00>" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZoAAAGkCAYAAAAIduO+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAUoElEQVR4nO3dfWzVhb3H8S/UeYqm1IkpkVARcAkIennMVNBt0ZD4lJm7ODTqjG6LhKo8JEaYblM36HUPSqKjpGbXuBGwf2xGlsxtxEXQOSJWULMtEDCRqjPMxbQ+xHqh5/6xSNYVtAf48junvF7JieHnOZ5PfiZ959dzOGdYuVwuBwAkGV70AACGNqEBIJXQAJBKaABIJTQApBIaAFIJDQCphAaAVEIDQCqhASBVzYZm9erVMX78+Kivr4+ZM2fGs88+W/SkqtLa2hqzZ8+OhoaGaGpqiquuuip27NhR9Kyq19raGsOGDYvFixcXPaUqvfnmm3H99dfHqFGj4qSTTopp06ZFZ2dn0bOqyr59++Luu++O8ePHx4gRI2LChAlx3333RV9fX9HTClOToeno6IjFixfHXXfdFdu2bYsLL7wwLr300tizZ0/R06rGpk2boqWlJbZs2RIbN26Mffv2xbx58+KDDz4oelrV2rp1a7S3t8e5555b9JSq9O6778acOXPic5/7XDz11FPx17/+NX7605/GKaecUvS0qnL//ffHmjVr4uGHH46//e1v8aMf/Sh+/OMfx0MPPVT0tMIMq8UP1fziF78YM2bMiLa2tgPHJk+eHFdddVW0trYWuKx6/eMf/4impqbYtGlTXHTRRUXPqTrvv/9+zJgxI1avXh0//OEPY9q0abFq1aqiZ1WVZcuWxZ/+9Ce/PfgMV1xxRYwePTp+/vOfHzj2ta99LU466aT45S9/WeCy4tTcFc3HH38cnZ2dMW/evH7H582bF88//3xBq6pfd3d3RESceuqpBS+pTi0tLXH55ZfHJZdcUvSUqrVhw4aYNWtWXH311dHU1BTTp0+PRx55pOhZVWfu3Lnx9NNPx86dOyMi4uWXX47nnnsuLrvssoKXFeeEogdU6p133on9+/fH6NGj+x0fPXp0vP322wWtqm7lcjmWLl0ac+fOjalTpxY9p+o8/vjj8dJLL8XWrVuLnlLVXnvttWhra4ulS5fGd77znXjhhRfi9ttvj1KpFN/4xjeKnlc17rzzzuju7o5JkyZFXV1d7N+/P1asWBHXXntt0dMKU3Oh+cSwYcP6/blcLg84xr/ceuut8corr8Rzzz1X9JSq09XVFYsWLYo//OEPUV9fX/ScqtbX1xezZs2KlStXRkTE9OnT4y9/+Uu0tbUJzb/p6OiItWvXxrp162LKlCmxffv2WLx4cYwZMyZuvPHGoucVouZCc9ppp0VdXd2Aq5e9e/cOuMoh4rbbbosNGzbE5s2bY+zYsUXPqTqdnZ2xd+/emDlz5oFj+/fvj82bN8fDDz8cvb29UVdXV+DC6nH66afH2Wef3e/Y5MmT41e/+lVBi6rTHXfcEcuWLYtrrrkmIiLOOeeceP3116O1tfW4DU3NvUZz4oknxsyZM2Pjxo39jm/cuDEuuOCCglZVn3K5HLfeemv8+te/jj/+8Y8xfvz4oidVpYsvvjheffXV2L59+4HbrFmz4rrrrovt27eLzL+ZM2fOgLfI79y5M8aNG1fQour04YcfxvDh/X+01tXVHddvb665K5qIiKVLl8YNN9wQs2bNivPPPz/a29tjz549sWDBgqKnVY2WlpZYt25dPPnkk9HQ0HDgCrCxsTFGjBhR8Lrq0dDQMOB1q5NPPjlGjRrl9az/sGTJkrjgggti5cqV8fWvfz1eeOGFaG9vj/b29qKnVZUrr7wyVqxYEWeccUZMmTIltm3bFg888EDcfPPNRU8rTrlG/exnPyuPGzeufOKJJ5ZnzJhR3rRpU9GTqkpEHPT26KOPFj2t6n3pS18qL1q0qOgZVek3v/lNeerUqeVSqVSeNGlSub29vehJVaenp6e8aNGi8hlnnFGur68vT5gwoXzXXXeVe3t7i55WmJr8ezQA1I6ae40GgNoiNACkEhoAUgkNAKmEBoBUQgNAqpoNTW9vb9xzzz3R29tb9JSq51wNjvM0OM7T4DlX/1Kzf4+mp6cnGhsbo7u7O0aOHFn0nKrmXA2O8zQ4ztPgOVf/UrNXNADUBqEBINUx/1DNvr6+eOutt6KhoeGIvj+mp6en3z85NOdqcJynwXGeBm+on6tyuRzvvfdejBkzZsAnVv+7Y/4azRtvvBHNzc3H8ikBSNTV1fWp33d1zK9oGhoaIiJi7D13x/Aq+kbDl//7f4ueMMB//fo4/lhxoOr1ffRRvHHPDw/8XD+UYx6aT35dNry+vqpCM7Kh+l6uqqbzA3Aon/UySPX9dAVgSBEaAFIJDQCphAaAVEIDQCqhASCV0ACQSmgASCU0AKQSGgBSCQ0AqYQGgFSHFZrVq1fH+PHjo76+PmbOnBnPPvvs0d4FwBBRcWg6Ojpi8eLFcdddd8W2bdviwgsvjEsvvTT27NmTsQ+AGldxaB544IH45je/Gd/61rdi8uTJsWrVqmhubo62traMfQDUuIpC8/HHH0dnZ2fMmzev3/F58+bF888/f9DH9Pb2Rk9PT78bAMePikLzzjvvxP79+2P06NH9jo8ePTrefvvtgz6mtbU1GhsbD9x8jTPA8eWw3gzwn9+mVi6XD/kNa8uXL4/u7u4Dt66ursN5SgBqVEVf5XzaaadFXV3dgKuXvXv3DrjK+USpVIpSqXT4CwGoaRVd0Zx44okxc+bM2LhxY7/jGzdujAsuuOCoDgNgaKjoiiYiYunSpXHDDTfErFmz4vzzz4/29vbYs2dPLFiwIGMfADWu4tDMnz8//vnPf8Z9990Xf//732Pq1Knx29/+NsaNG5exD4AaV3FoIiIWLlwYCxcuPNpbABiCfNYZAKmEBoBUQgNAKqEBIJXQAJBKaABIJTQApBIaAFIJDQCphAaAVEIDQKrD+qyzo2HCsq1xwrDPFfX0A0yM6vv06d3z1xQ94aAmdlTfuQKqlysaAFIJDQCphAaAVEIDQCqhASCV0ACQSmgASCU0AKQSGgBSCQ0AqYQGgFRCA0AqoQEgldAAkEpoAEglNACkEhoAUgkNAKmEBoBUQgNAKqEBIJXQAJBKaABIJTQApBIaAFIJDQCphAaAVEIDQCqhASCV0ACQSmgASCU0AKQSGgBSCQ0AqYQGgFRCA0CqE4p64tf+Z3YMr68v6ukHOGvJlqInDDAxFhQ94aB2z19T9IQBJnZU57kCXNEAkExoAEglNACkEhoAUgkNAKmEBoBUQgNAKqEBIJXQAJBKaABIJTQApBIaAFIJDQCphAaAVBWFprW1NWbPnh0NDQ3R1NQUV111VezYsSNrGwBDQEWh2bRpU7S0tMSWLVti48aNsW/fvpg3b1588MEHWfsAqHEVffHZ7373u35/fvTRR6OpqSk6OzvjoosuOqrDABgajugbNru7uyMi4tRTTz3kfXp7e6O3t/fAn3t6eo7kKQGoMYf9ZoByuRxLly6NuXPnxtSpUw95v9bW1mhsbDxwa25uPtynBKAGHXZobr311njllVdi/fr1n3q/5cuXR3d394FbV1fX4T4lADXosH51dtttt8WGDRti8+bNMXbs2E+9b6lUilKpdFjjAKh9FYWmXC7HbbfdFk888UQ888wzMX78+KxdAAwRFYWmpaUl1q1bF08++WQ0NDTE22+/HRERjY2NMWLEiJSBANS2il6jaWtri+7u7vjyl78cp59++oFbR0dH1j4AalzFvzoDgEr4rDMAUgkNAKmEBoBUQgNAKqEBIJXQAJBKaABIJTQApBIaAFIJDQCphAaAVEIDQKrD+uKzoWjXg+cVPWGAs5ZsKXrCQU2MBUVPGGD3/DVFTxhgYkf1nScogisaAFIJDQCphAaAVEIDQCqhASCV0ACQSmgASCU0AKQSGgBSCQ0AqYQGgFRCA0AqoQEgldAAkEpoAEglNACkEhoAUgkNAKmEBoBUQgNAKqEBIJXQAJBKaABIJTQApBIaAFIJDQCphAaAVEIDQCqhASCV0ACQSmgASCU0AKQSGgBSCQ0AqYQGgFRCA0CqE4oewKHtevC8oicc1FlLthQ9YYCJsaDoCQPsnr+m6AkDTOyovvPE0OeKBoBUQgNAKqEBIJXQAJBKaABIJTQApBIaAFIJDQCphAaAVEIDQCqhASCV0ACQSmgASCU0AKQ6otC0trbGsGHDYvHixUdpDgBDzWGHZuvWrdHe3h7nnnvu0dwDwBBzWKF5//3347rrrotHHnkkPv/5zx/tTQAMIYcVmpaWlrj88svjkksu+cz79vb2Rk9PT78bAMePir/K+fHHH4+XXnoptm7dOqj7t7a2xr333lvxMACGhoquaLq6umLRokWxdu3aqK+vH9Rjli9fHt3d3QduXV1dhzUUgNpU0RVNZ2dn7N27N2bOnHng2P79+2Pz5s3x8MMPR29vb9TV1fV7TKlUilKpdHTWAlBzKgrNxRdfHK+++mq/YzfddFNMmjQp7rzzzgGRAYCKQtPQ0BBTp07td+zkk0+OUaNGDTgOABE+GQCAZBW/6+w/PfPMM0dhBgBDlSsaAFIJDQCphAaAVEIDQCqhASCV0ACQSmgASCU0AKQSGgBSCQ0AqYQGgFRH/FlnHH92PXhe0RMGOGvJlqInDDAxFhQ9YYDd89cUPWGAiR3Vd544ulzRAJBKaABIJTQApBIaAFIJDQCphAaAVEIDQCqhASCV0ACQSmgASCU0AKQSGgBSCQ0AqYQGgFRCA0AqoQEgldAAkEpoAEglNACkEhoAUgkNAKmEBoBUQgNAKqEBIJXQAJBKaABIJTQApBIaAFIJDQCphAaAVEIDQCqhASCV0ACQSmgASCU0AKQSGgBSnVD0ADgadj14XtETBjhryZaiJwwwMRYUPWGA3fPXFD3hoCZ2VN+5qlWuaABIJTQApBIaAFIJDQCphAaAVEIDQCqhASCV0ACQSmgASCU0AKQSGgBSCQ0AqYQGgFRCA0CqikPz5ptvxvXXXx+jRo2Kk046KaZNmxadnZ0Z2wAYAir6Ppp333035syZE1/5ylfiqaeeiqampti9e3eccsopSfMAqHUVheb++++P5ubmePTRRw8cO/PMM4/2JgCGkIp+dbZhw4aYNWtWXH311dHU1BTTp0+PRx555FMf09vbGz09Pf1uABw/KgrNa6+9Fm1tbfGFL3whfv/738eCBQvi9ttvj1/84heHfExra2s0NjYeuDU3Nx/xaABqR0Wh6evrixkzZsTKlStj+vTpccstt8S3v/3taGtrO+Rjli9fHt3d3QduXV1dRzwagNpRUWhOP/30OPvss/sdmzx5cuzZs+eQjymVSjFy5Mh+NwCOHxWFZs6cObFjx45+x3bu3Bnjxo07qqMAGDoqCs2SJUtiy5YtsXLlyti1a1esW7cu2tvbo6WlJWsfADWuotDMnj07nnjiiVi/fn1MnTo1fvCDH8SqVaviuuuuy9oHQI2r6O/RRERcccUVccUVV2RsAWAI8llnAKQSGgBSCQ0AqYQGgFRCA0AqoQEgldAAkEpoAEglNACkEhoAUgkNAKkq/qwzYHB2PXhe0RMGOGvJlqInDDAxFhQ94aB2z19T9IQBJnZU57n6LK5oAEglNACkEhoAUgkNAKmEBoBUQgNAKqEBIJXQAJBKaABIJTQApBIaAFIJDQCphAaAVEIDQCqhASCV0ACQSmgASCU0AKQSGgBSCQ0AqYQGgFRCA0AqoQEgldAAkEpoAEglNACkEhoAUgkNAKmEBoBUQgNAKqEBIJXQAJBKaABIJTQApBIaAFIJDQCphAaAVCcUPQA4dnY9eF7REwY4a8mWoicc1MRYUPSEAXbPX1P0hH563uuLzy/77Pu5ogEgldAAkEpoAEglNACkEhoAUgkNAKmEBoBUQgNAKqEBIJXQAJBKaABIJTQApBIaAFJVFJp9+/bF3XffHePHj48RI0bEhAkT4r777ou+vr6sfQDUuIq+JuD++++PNWvWxGOPPRZTpkyJF198MW666aZobGyMRYsWZW0EoIZVFJo///nP8dWvfjUuv/zyiIg488wzY/369fHiiy+mjAOg9lX0q7O5c+fG008/HTt37oyIiJdffjmee+65uOyyyw75mN7e3ujp6el3A+D4UdEVzZ133hnd3d0xadKkqKuri/3798eKFSvi2muvPeRjWltb49577z3ioQDUpoquaDo6OmLt2rWxbt26eOmll+Kxxx6Ln/zkJ/HYY48d8jHLly+P7u7uA7eurq4jHg1A7ajoiuaOO+6IZcuWxTXXXBMREeecc068/vrr0draGjfeeONBH1MqlaJUKh35UgBqUkVXNB9++GEMH97/IXV1dd7eDMAhVXRFc+WVV8aKFSvijDPOiClTpsS2bdvigQceiJtvvjlrHwA1rqLQPPTQQ/Hd7343Fi5cGHv37o0xY8bELbfcEt/73vey9gFQ4yoKTUNDQ6xatSpWrVqVNAeAocZnnQGQSmgASCU0AKQSGgBSCQ0AqYQGgFRCA0AqoQEgldAAkEpoAEglNACkEhoAUlX0oZoAR9uuB88resJBnbVkS9ETBpgYC4qe0E/fRx9FxN2feT9XNACkEhoAUgkNAKmEBoBUQgNAKqEBIJXQAJBKaABIJTQApBIaAFIJDQCphAaAVEIDQCqhASCV0ACQSmgASCU0AKQSGgBSCQ0AqYQGgFRCA0AqoQEgldAAkEpoAEglNACkEhoAUgkNAKmEBoBUQgNAKqEBIJXQAJBKaABIJTQApBIaAFIJDQCpTjjWT1gulyMiou+jj471UwMM2r7y/xU9YYBq+7n5yZ5Pfq4fyrDyZ93jKHvjjTeiubn5WD4lAIm6urpi7Nixh/z3xzw0fX198dZbb0VDQ0MMGzbssP87PT090dzcHF1dXTFy5MijuHDoca4Gx3kaHOdp8Ib6uSqXy/Hee+/FmDFjYvjwQ78Sc8x/dTZ8+PBPLV+lRo4cOST/B2ZwrgbHeRoc52nwhvK5amxs/Mz7eDMAAKmEBoBUNRuaUqkU3//+96NUKhU9peo5V4PjPA2O8zR4ztW/HPM3AwBwfKnZKxoAaoPQAJBKaABIJTQApBIaAFIJDQCphAaAVEIDQKr/B53kztAVSYWIAAAAAElFTkSuQmCC", + "text/plain": [ + "<Figure size 480x480 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# plt.matshow(YOUR_CODE_HERE)\n", + "\n", + "# SOLUTION\n", + "plt.matshow(relationship[0:10,0:10])" + ] + }, + { + "cell_type": "markdown", + "id": "526706d5", + "metadata": {}, + "source": [ + "Finally, we are going to use the forward Euler method to simulate this differential equation for a total of 5 seconds over 1000 iterations. This has already been implemented in the `test` method." + ] + }, + { + "cell_type": "markdown", + "id": "9f128b80", + "metadata": {}, + "source": [ + "<div style=\"background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%\">\n", + "<p>\n", + "<b>Task 2.4:</b> \n", + "Find the time it takes to evaluate the relationship using <code>timeit</code> by entering the function you wish to evaluate as a string.\n", + "\n", + "HINT: you have already learned how to convert a matrix into a sparse format, and the function is defined for you. Run the code cell and compare the performances of the different matrix formats. Which one is faster? How much space do they take?\n", + "</p>\n", + "</div>" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0a8f83b9", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Standard: 0.0853\n", + "CSR: 0.0096\n", + "BSR: 0.0110\n" + ] + } + ], + "source": [ + "# N_ITS = 1000\n", + "# T = 5 # Seconds\n", + "# dt = T/N_ITS\n", + "\n", + "# def test(rel_matrix):\n", + "# state = np.zeros(N)\n", + "# state[0] = 1\n", + "# for i in range(N_ITS):\n", + "# state = state + rel_matrix @ state * dt\n", + "\n", + "# csr_matrix = YOUR_CODE_HERE\n", + "# bsr_matrix = YOUR_CODE_HERE\n", + "# print(f\"Standard: {timeit.timeit('test(relationship)',\n", + "# globals=globals(),\n", + "# number=10)/10:.4f}\")\n", + "# print(f\"CSR: {timeit.timeit('test(csr_matrix)',\n", + "# globals=globals(),\n", + "# number=10)/10:.4f}\")\n", + "# print(f\"BSR: {timeit.timeit('test(bsr_matrix)',\n", + "# globals=globals(),\n", + "# number=10)/10:.4f}\")\n", + " \n", + "\n", + "# SOLUTION\n", + "N_ITS = 1000\n", + "T = 5 # Seconds\n", + "dt = T/N_ITS\n", + "\n", + "def test(rel_matrix):\n", + " state = np.zeros(N)\n", + " state[0] = 1\n", + " for i in range(N_ITS):\n", + " state = state + rel_matrix @ state * dt\n", + "\n", + "csr_matrix = sparse.csr_array(relationship)\n", + "bsr_matrix = sparse.bsr_array(relationship)\n", + "print(f\"Standard: {timeit.timeit('test(relationship)',\n", + " globals=globals(),\n", + " number=10)/10:.4f}\")\n", + "print(f\"CSR: {timeit.timeit('test(csr_matrix)',\n", + " globals=globals(),\n", + " number=10)/10:.4f}\")\n", + "print(f\"BSR: {timeit.timeit('test(bsr_matrix)',\n", + " globals=globals(),\n", + " number=10)/10:.4f}\")" + ] + }, + { + "cell_type": "markdown", + "id": "a843ae4f", + "metadata": {}, + "source": [ + "<div style=\"background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%\">\n", + "<p>\n", + "<b>Task 2.5:</b> \n", + "\n", + "What is the change in performance by using the sparse matrices?\n", + "\n", + "</p>\n", + "</div>" + ] + }, + { + "cell_type": "markdown", + "id": "50d74c04", + "metadata": {}, + "source": [ + "_Your answer here._" + ] + }, + { + "cell_type": "markdown", + "id": "7d572557", + "metadata": {}, + "source": [ + "<div style=\"background-color:#FAE99E; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%\">\n", + "<p>\n", + "<b>Solution:</b> \n", + "\n", + "As we can see in the output, the sparse methods perform similarly, each around 10x faster than the non-sparse method.\n", + "</p>\n", + "</div>" + ] + }, + { + "cell_type": "markdown", + "id": "920bab21", + "metadata": {}, + "source": [ + "One final consideration when using sparse matrices is that it can take a long time to generate them from a regular matrix. You can test this out by placing the matrix generation inside or outside the <code>timeit</code> code to compare their performances. Try it!" + ] + }, + { + "cell_type": "markdown", + "id": "bf4fdf38", + "metadata": {}, + "source": [ + "**End of notebook.**\n", + "<h2 style=\"height: 60px\">\n", + "</h2>\n", + "<h3 style=\"position: absolute; display: flex; flex-grow: 0; flex-shrink: 0; flex-direction: row-reverse; bottom: 60px; right: 50px; margin: 0; border: 0\">\n", + " <style>\n", + " .markdown {width:100%; position: relative}\n", + " article { position: relative }\n", + " </style>\n", + " <a rel=\"license\" href=\"http://creativecommons.org/licenses/by/4.0/\">\n", + " <img alt=\"Creative Commons License\" style=\"border-width:; width:88px; height:auto; padding-top:10px\" src=\"https://i.creativecommons.org/l/by/4.0/88x31.png\" />\n", + " </a>\n", + " <a rel=\"TU Delft\" href=\"https://www.tudelft.nl/en/ceg\">\n", + " <img alt=\"TU Delft\" style=\"border-width:0; width:100px; height:auto; padding-bottom:0px\" src=\"https://gitlab.tudelft.nl/mude/public/-/raw/main/tu-logo/TU_P1_full-color.png\" />\n", + " </a>\n", + " <a rel=\"MUDE\" href=\"http://mude.citg.tudelft.nl/\">\n", + " <img alt=\"MUDE\" style=\"border-width:0; width:100px; height:auto; padding-bottom:0px\" src=\"https://gitlab.tudelft.nl/mude/public/-/raw/main/mude-logo/MUDE_Logo-small.png\" />\n", + " </a>\n", + " \n", + "</h3>\n", + "<span style=\"font-size: 75%\">\n", + "© Copyright 2024 <a rel=\"MUDE\" href=\"http://mude.citg.tudelft.nl/\">MUDE</a> TU Delft. This work is licensed under a <a rel=\"license\" href=\"http://creativecommons.org/licenses/by/4.0/\">CC BY 4.0 License</a>." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "mude-base", + "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.12.4" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/content/Week_2_2/PA/README.md b/content/Week_2_2/PA/README.md new file mode 100644 index 0000000000000000000000000000000000000000..43d0874bde2c5f652589338e486e61d394077d19 --- /dev/null +++ b/content/Week_2_2/PA/README.md @@ -0,0 +1,17 @@ +# PA 2.2: Love is Sparse + +*[CEGM1000 MUDE](http://mude.citg.tudelft.nl/): Week 2.2. Due: before Friday, November 22nd, 2024.* + +This assignment will introduce you to the concept of sparse matrices in Python and how they can be useful to speed up computations and reduce file sizes. This is especially important when using the numerical schemes we are learning about (FDM, FVM, FEM) to solve problems with a lot of unknowns at each time step. To accomplish this, we will be using the `scipy.sparse` library. + +The instructions and technical content for this PA are included in the attached notebook file. Enjoy! + +## Grading Criteria + +You will pass this PA if: +1. Your notebook `PA_2_2_love_is_sparse.ipynb` runs without errors. + +**End of file.** + +<span style="font-size: 75%"> +© Copyright 2024 <a rel="MUDE" href="http://mude.citg.tudelft.nl/">MUDE</a>, TU Delft. This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">CC BY 4.0 License</a>. \ No newline at end of file diff --git a/content/Week_2_2/PA/images/sparse_matrix.png b/content/Week_2_2/PA/images/sparse_matrix.png new file mode 100644 index 0000000000000000000000000000000000000000..3d527bffedb10dcce9c29d1f75d0913c1d7cde5e Binary files /dev/null and b/content/Week_2_2/PA/images/sparse_matrix.png differ diff --git a/content/Week_2_2/PA_2_2_solution.ipynb b/content/Week_2_2/PA_2_2_solution.ipynb deleted file mode 100644 index 70c7aacb4393661c417f26ffe7b1a3fbaac10f77..0000000000000000000000000000000000000000 --- a/content/Week_2_2/PA_2_2_solution.ipynb +++ /dev/null @@ -1,484 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "c96d6259-08d6-4289-aea2-589d67cdb5ee", - "metadata": {}, - "source": [ - "# PA 2.2: Love is Sparse\n", - "\n", - "<h1 style=\"position: absolute; display: flex; flex-grow: 0; flex-shrink: 0; flex-direction: row-reverse; top: 60px;right: 30px; margin: 0; border: 0\">\n", - " <style>\n", - " .markdown {width:100%; position: relative}\n", - " article { position: relative }\n", - " </style>\n", - " <img src=\"https://gitlab.tudelft.nl/mude/public/-/raw/main/tu-logo/TU_P1_full-color.png\" style=\"width:100px\" />\n", - " <img src=\"https://gitlab.tudelft.nl/mude/public/-/raw/main/mude-logo/MUDE_Logo-small.png\" style=\"width:100px\" />\n", - "</h1>\n", - "<h2 style=\"height: 10px\">\n", - "</h2>\n", - "\n", - "*[CEGM1000 MUDE](http://mude.citg.tudelft.nl/): Week 2.2 Due: complete this PA prior to class on Friday, Nov 22, 2024.*" - ] - }, - { - "cell_type": "markdown", - "id": "7a28e541-d2d0-48a9-abf6-7b73075c8fd3", - "metadata": { - "tags": [] - }, - "source": [ - "## Overview\n", - "\n", - "This assignment will introduce you to the concept of sparse matrices in Python and how they can be useful to speed up computations and reduce file sizes. To this end, we will be using the `scipy.sparse` library.\n", - "\n", - "**You will pass this assignment as long as your respository fulfills the following criteria:** \n", - "\n", - "- You have completed this notebook and it runs without errors\n", - "\n", - "## Reading\n", - "\n", - "Keep the `scipy.sparse` [documentation](https://docs.scipy.org/doc/scipy/reference/sparse.html) handy. Some of the work you'll do is based off this [blog](https://www.sefidian.com/2021/04/28/python-scipy-sparse-matrices-explained/), so you may find it helpful. In addition, if you don't know what a byte is, you may want to read up on [Wikipdia here](https://en.wikipedia.org/wiki/Byte) (not all of it, as long as you recognize that it is a measure of storage space on a computer).The concepts you learn here are applied to the Finite Element Method in this [book chapter UPDATE LINK](https://mude.citg.tudelft.nl/book/fem/matrix.html), which you are expected to read during Week 2.2.\n", - "\n", - "**Note:** you probably skipped over all the links in the paragraph above. While we forgive you for your haste, just remember to revisit some of them if you are struggling to finish the questions below!\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "id": "a262eac1", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "import numpy as np\n", - "import scipy.sparse as sparse\n", - "import matplotlib.pyplot as plt\n", - "import timeit" - ] - }, - { - "cell_type": "markdown", - "id": "c3cd5017-10e0-4b64-ad1a-b626d80a128a", - "metadata": { - "tags": [] - }, - "source": [ - "## Task 1: Why sparse?\n", - "\n", - "Some matrices have a lot of zeros, with such an example given below. When this is the case, the way we store the actual information of the matrix (the non-zero elements) can have a big impact on computation speed and storage demands. Formats which handle this by only storing non-zero elements are called sparse, and have very different internal representations of the data to the matrices you have been familiarized with in previous programming assignments.\n", - "\n", - "" - ] - }, - { - "cell_type": "markdown", - "id": "f583dfa0-5a21-4ebb-99e5-7b27b323171d", - "metadata": {}, - "source": [ - "<div style=\"background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%\">\n", - "<p>\n", - "<b>Task 1.1:</b> \n", - " \n", - "- Create a function (`create_dense`) which returns a square matrix of arbitrary size. \n", - "- The function will take as input the size N (such that the matrix is N x N) and one float between 0 and 1, which represents the approximate fraction of the elements of the matrix which are non-zero (it doesn't have to be super accurate).\n", - " \n", - "For now it just return a regular Numpy matrix. To do this, you can use <a href=\"https://numpy.org/doc/stable/reference/random/generated/numpy.random.rand.html\">numpy.random.rand</a> to create a random set of values between 0 and 1 and then threshold the entries with a simple boolean operator.\n", - "</p>\n", - "</div>" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "1310dca9-dc46-4ab1-ab78-0a5389191cfc", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# SOLUTION (a few things will be removed)\n", - "def create_dense(size: int, percentage: float) -> np.array:\n", - " matrix = np.random.rand(size, size)\n", - " matrix[matrix > percentage] = 0\n", - " return matrix\n", - "####" - ] - }, - { - "cell_type": "markdown", - "id": "d670f274-ef24-4abd-86bf-3cd24e3cf5c5", - "metadata": {}, - "source": [ - "Now, set up a test to check if you set the function up correctly:" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "8f6a3117", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "test_size = 1000\n", - "test_percentage = 0.1\n", - "matrix = create_dense(test_size, test_percentage)\n", - "assert np.count_nonzero(matrix) < test_percentage*1.1*test_size**2" - ] - }, - { - "cell_type": "markdown", - "id": "0f3d9c79", - "metadata": {}, - "source": [ - "<div style=\"background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%\">\n", - "<p>\n", - "<b>Task 1.2:</b> \n", - "Use <a href=\"https://numpy.org/doc/stable/reference/generated/numpy.ndarray.nbytes.html\">array.nbytes</a> to find out how much space a 1000x1000 matrix with 10% non-zero elements takes. Try to explain where this number came from! (Hint: the answer is in the assert statement)\n", - "</p>\n", - "</div>" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "aa5a25f9", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# Solution\n", - "my_matrix_size = matrix.nbytes\n", - "assert my_matrix_size == 8*test_size**2" - ] - }, - { - "cell_type": "markdown", - "id": "912215f3", - "metadata": {}, - "source": [ - "Next we will explore how to use `scipy.sparse`, and how this reduces the data size of the matrix. The [ documentation](https://docs.scipy.org/doc/scipy/reference/sparse.html) gives us many different types of formats to choose from, so we'll explore two of them: BSR (Block Sparse Row) and CSR (Compressed Sparse Row). " - ] - }, - { - "cell_type": "markdown", - "id": "25a832c8", - "metadata": {}, - "source": [ - "<div style=\"background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%\">\n", - "<p>\n", - "<b>Task 1.3:</b> \n", - " Complete the code below to make a CSR and BSR matrix from the <code>matrix</code> variable.\n", - "</p>\n", - "</div>" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "29c0d2dc", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# SOLUTION\n", - "csr_matrix = sparse.csr_array(matrix)\n", - "bsr_matrix = sparse.bsr_array(matrix)" - ] - }, - { - "cell_type": "markdown", - "id": "56334ed7", - "metadata": {}, - "source": [ - "Let's compare the new storage requirements and see how much of an improvement we got (it should approach the value used above for `test_percentage`, but not reach it exactly):" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "a46df127", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CSR matrix size: 100418 bytes\n", - "Compared to the normal matrix, CSR uses this fraction of space: 0.100\n", - "BSR matrix size: 100418 bytes\n", - "Compared to the normal matrix, BSR uses this fraction of space: 0.100\n" - ] - } - ], - "source": [ - "print(f\"CSR matrix size: {csr_matrix.data.size} bytes\")\n", - "print(f\"Compared to the normal matrix, CSR uses this fraction of space: {csr_matrix.data.nbytes/my_matrix_size:0.3f}\")\n", - "print(f\"BSR matrix size: {bsr_matrix.data.size} bytes\")\n", - "print(f\"Compared to the normal matrix, BSR uses this fraction of space: {bsr_matrix.data.nbytes/my_matrix_size:0.3f}\")" - ] - }, - { - "cell_type": "markdown", - "id": "cea28aa8", - "metadata": {}, - "source": [ - "## Task 2: [What is love?](https://www.youtube.com/watch?v=HEXWRTEbj1I)\n", - "\n", - "Let's look into a small example of how sparse matrices can also help improve calculation speeds. We'll study the mysterious case of a massive friend group with a concerning love circle and how we can predict how each person feels." - ] - }, - { - "cell_type": "markdown", - "id": "f832b8e0", - "metadata": {}, - "source": [ - "We know there is a certain pecking order in this group, and neighbours in this order have a love-hate relationship which can be quantified with a simple differential equation:\n", - "\n", - "$$\n", - "\\begin{pmatrix}\n", - "\\cfrac{dn_1}{dt}\\\\\n", - "\\cfrac{dn_2}{dt} \\\\\n", - "\\end{pmatrix} \n", - "=\n", - "\\begin{pmatrix}\n", - "0 & 1\\\\\n", - "-1 & 0 \\\\\n", - "\\end{pmatrix} \n", - "\\begin{pmatrix}\n", - "n_1\\\\\n", - "n_2 \\\\\n", - "\\end{pmatrix} \n", - "$$" - ] - }, - { - "cell_type": "markdown", - "id": "9b9d037e", - "metadata": {}, - "source": [ - "The state of any given person indicates how much they love the group in general. So in this case, person 2 doesn't like it when person 1 is happy. If we extend this to a four case scenario we'd get the following matrix:\n", - "$$\n", - "\\begin{pmatrix}\n", - "\\cfrac{dn_1}{dt}\\\\\n", - "\\cfrac{dn_2}{dt}\\\\\n", - "\\cfrac{dn_3}{dt}\\\\\n", - "\\cfrac{dn_4}{dt}\\\\\n", - "\\end{pmatrix} \n", - "=\n", - "\\begin{pmatrix}\n", - "0 & 1 & 0 & -1 \\\\\n", - "-1 & 0 & 1 & 0 \\\\\n", - "0 & -1 & 0 & 1 \\\\\n", - "1 & 0 & -1 & 0 \\\\\n", - "\\end{pmatrix} \n", - "\\begin{pmatrix}\n", - "n_1 \\\\\n", - "n_2 \\\\\n", - "n_3 \\\\\n", - "n_4 \\\\\n", - "\\end{pmatrix} \n", - "$$\n", - "\n", - "What happens if we extend it to even more people?\n", - "\n", - "Coincidentally this is very similar to how we use individual elements in the Finite Element Method! We can easily operationalize it using the method `ix_`, for which a simple example is provided in the code cell below (this example is generic to illustrate `ix_` usage and is not related to the love circle!):" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "77f295f5", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[0. 0. 0.5 0. ]\n", - " [0. 1. 0.5 0. ]\n", - " [0. 0. 0.5 0. ]\n", - " [0. 1. 0.5 0. ]]\n" - ] - } - ], - "source": [ - "blank = np.zeros(shape=(4, 4))\n", - "blueprint = np.array([[0, 0.5], \n", - " [1, 0.5]])\n", - "\n", - "for i in range(2):\n", - " # First argument will be used for rows\n", - " # Second for columns\n", - " blank[np.ix_([i*2, i*2 + 1], [1, 2])] = blueprint\n", - " \n", - "print(blank)" - ] - }, - { - "cell_type": "markdown", - "id": "7a73f37b-6763-4d1c-92b8-994aa28f8ff6", - "metadata": {}, - "source": [ - "<div style=\"background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%\">\n", - "<p>\n", - "<b>Task 2.1:</b> \n", - " Generate the matrix <code>relationship</code> for the differential equation for 1000 people. Use the <a href=\"https://numpy.org/doc/stable/reference/generated/numpy.ix_.html\"><code>numpy.ix_</code></a> function to make your life easier. \n", - "</p>\n", - "</div>" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "b622c84f", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "N = 1000\n", - "relationship = np.zeros(shape=(N, N))\n", - "\n", - "# SOLUTION\n", - "general = np.array([[0, 1], [-1, 0]])\n", - "\n", - "for i in range(N):\n", - " relationship[np.ix_([i, (i+1)%N], [i, (i+1)%N])] = general\n", - "##########" - ] - }, - { - "cell_type": "markdown", - "id": "526706d5", - "metadata": {}, - "source": [ - "Finally, we are going to use the forward Euler method to simulate this differential equation for a total of 5 seconds over 1000 iterations. This has already been implemented in the `test` method." - ] - }, - { - "cell_type": "markdown", - "id": "9f128b80", - "metadata": {}, - "source": [ - "<div style=\"background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%\">\n", - "<p>\n", - "<b>Task 2.2:</b> \n", - " Find the time it takes to evaluate the relationship using <code>timeit</code> by entering the function you wish to evaluate as a string. HINT: you have already learned how to convert a matrix into a sparse format, and the function is defined for you. Run the code cell and compare the performances of the different matrix formats. Which one is faster? How much space do they take?\n", - "</p>\n", - "</div>" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "0a8f83b9", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Standard: 0.3432\n", - "CSR: 0.0091\n", - "BSR: 0.0085\n" - ] - } - ], - "source": [ - "N_ITS = 1000\n", - "T = 5 # Seconds\n", - "dt = T/N_ITS\n", - "\n", - "def test(rel_matrix):\n", - " state = np.zeros(N); state[0] = 1\n", - " for i in range(N_ITS):\n", - " state = state + rel_matrix @ state * dt\n", - "\n", - "# SOLUTION (only the strings in timeit will be removed + matrix definitions)\n", - "csr_matrix = sparse.csr_array(relationship)\n", - "bsr_matrix = sparse.bsr_array(relationship)\n", - "print(f\"Standard: {timeit.timeit('test(relationship)', globals=globals(), number=10)/10:.4f}\")\n", - "print(f\"CSR: {timeit.timeit('test(csr_matrix)', globals=globals(), number=10)/10:.4f}\")\n", - "print(f\"BSR: {timeit.timeit('test(bsr_matrix)', globals=globals(), number=10)/10:.4f}\")\n", - "########\n", - " " - ] - }, - { - "cell_type": "markdown", - "id": "920bab21", - "metadata": {}, - "source": [ - "One final consideration when using sparse matrices is that it can take a long time to generate them from a regular matrix. You can test this out by placing the matrix generation inside or outside the <code>timeit</code> code to compare their performances." - ] - }, - { - "cell_type": "markdown", - "id": "80580ab9-4d79-46b1-ae6e-775af04d43ad", - "metadata": {}, - "source": [ - "**End of notebook.**\n", - "<h2 style=\"height: 60px\">\n", - "</h2>\n", - "<h3 style=\"position: absolute; display: flex; flex-grow: 0; flex-shrink: 0; flex-direction: row-reverse; bottom: 60px; right: 50px; margin: 0; border: 0\">\n", - " <style>\n", - " .markdown {width:100%; position: relative}\n", - " article { position: relative }\n", - " </style>\n", - " <a rel=\"license\" href=\"http://creativecommons.org/licenses/by-nc-sa/4.0/\">\n", - " <img alt=\"Creative Commons License\" style=\"border-width:; width:88px; height:auto; padding-top:10px\" src=\"https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png\" />\n", - " </a>\n", - " <a rel=\"TU Delft\" href=\"https://www.tudelft.nl/en/ceg\">\n", - " <img alt=\"TU Delft\" style=\"border-width:0; width:100px; height:auto; padding-bottom:0px\" src=\"https://gitlab.tudelft.nl/mude/public/-/raw/main/tu-logo/TU_P1_full-color.png\"/>\n", - " </a>\n", - " <a rel=\"MUDE\" href=\"http://mude.citg.tudelft.nl/\">\n", - " <img alt=\"MUDE\" style=\"border-width:0; width:100px; height:auto; padding-bottom:0px\" src=\"https://gitlab.tudelft.nl/mude/public/-/raw/main/mude-logo/MUDE_Logo-small.png\"/>\n", - " </a>\n", - " \n", - "</h3>\n", - "<span style=\"font-size: 75%\">\n", - "© Copyright 2023 <a rel=\"MUDE Team\" href=\"https://studiegids.tudelft.nl/a101_displayCourse.do?course_id=65595\">MUDE Teaching Team</a> TU Delft. This work is licensed under a <a rel=\"license\" href=\"http://creativecommons.org/licenses/by-nc-sa/4.0/\">Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License</a>." - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "mude-base", - "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.12.5" - }, - "widgets": { - "application/vnd.jupyter.widget-state+json": { - "state": {}, - "version_major": 2, - "version_minor": 0 - } - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/src/students/Week_2_2/PA_2_2_love_is_sparse.html b/src/students/Week_2_2/PA_2_2_love_is_sparse.html new file mode 100644 index 0000000000000000000000000000000000000000..177a2ed1b9f0fded007f64c475c0f7a37614eaf4 --- /dev/null +++ b/src/students/Week_2_2/PA_2_2_love_is_sparse.html @@ -0,0 +1,8122 @@ +<!DOCTYPE html> + +<html lang="en"> +<head><meta charset="utf-8"/> +<meta content="width=device-width, initial-scale=1.0" name="viewport"/> +<title>PA_2_2_love_is_sparse</title><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.min.js"></script><script> +(function() { + function addWidgetsRenderer() { + var mimeElement = document.querySelector('script[type="application/vnd.jupyter.widget-view+json"]'); + var scriptElement = document.createElement('script'); + + var widgetRendererSrc = 'https://unpkg.com/@jupyter-widgets/html-manager@*/dist/embed-amd.js'; + + var widgetState; + + // Fallback for older version: + try { + widgetState = mimeElement && JSON.parse(mimeElement.innerHTML); + + if (widgetState && (widgetState.version_major < 2 || !widgetState.version_major)) { + + var widgetRendererSrc = 'https://unpkg.com/@jupyter-js-widgets@*/dist/embed.js'; + + } + } catch(e) {} + + scriptElement.src = widgetRendererSrc; + document.body.appendChild(scriptElement); + } + + document.addEventListener('DOMContentLoaded', addWidgetsRenderer); +}()); +</script> +<style type="text/css"> + pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: var(--jp-cell-editor-active-background) } +.highlight { background: var(--jp-cell-editor-background); color: var(--jp-mirror-editor-variable-color) } +.highlight .c { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment */ +.highlight .err { color: var(--jp-mirror-editor-error-color) } /* Error */ +.highlight .k { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword */ +.highlight .o { color: var(--jp-mirror-editor-operator-color); font-weight: bold } /* Operator */ +.highlight .p { color: var(--jp-mirror-editor-punctuation-color) } /* Punctuation */ +.highlight .ch { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Preproc */ +.highlight .cpf { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Single */ +.highlight .cs { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Special */ +.highlight .kc { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Type */ +.highlight .m { color: var(--jp-mirror-editor-number-color) } /* Literal.Number */ +.highlight .s { color: var(--jp-mirror-editor-string-color) } /* Literal.String */ +.highlight .ow { color: var(--jp-mirror-editor-operator-color); font-weight: bold } /* Operator.Word */ +.highlight .pm { color: var(--jp-mirror-editor-punctuation-color) } /* Punctuation.Marker */ +.highlight .w { color: var(--jp-mirror-editor-variable-color) } /* Text.Whitespace */ +.highlight .mb { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Bin */ +.highlight .mf { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Float */ +.highlight .mh { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Hex */ +.highlight .mi { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Integer */ +.highlight .mo { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Oct */ +.highlight .sa { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Affix */ +.highlight .sb { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Backtick */ +.highlight .sc { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Char */ +.highlight .dl { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Delimiter */ +.highlight .sd { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Doc */ +.highlight .s2 { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Double */ +.highlight .se { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Escape */ +.highlight .sh { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Heredoc */ +.highlight .si { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Interpol */ +.highlight .sx { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Other */ +.highlight .sr { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Regex */ +.highlight .s1 { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Single */ +.highlight .ss { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Symbol */ +.highlight .il { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Integer.Long */ + </style> +<style type="text/css"> +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/* + * Mozilla scrollbar styling + */ + +/* use standard opaque scrollbars for most nodes */ +[data-jp-theme-scrollbars='true'] { + scrollbar-color: rgb(var(--jp-scrollbar-thumb-color)) + var(--jp-scrollbar-background-color); +} + +/* for code nodes, use a transparent style of scrollbar. These selectors + * will match lower in the tree, and so will override the above */ +[data-jp-theme-scrollbars='true'] .CodeMirror-hscrollbar, +[data-jp-theme-scrollbars='true'] .CodeMirror-vscrollbar { + scrollbar-color: rgba(var(--jp-scrollbar-thumb-color), 0.5) transparent; +} + +/* tiny scrollbar */ + +.jp-scrollbar-tiny { + scrollbar-color: rgba(var(--jp-scrollbar-thumb-color), 0.5) transparent; + scrollbar-width: thin; +} + +/* tiny scrollbar */ + +.jp-scrollbar-tiny::-webkit-scrollbar, +.jp-scrollbar-tiny::-webkit-scrollbar-corner { + background-color: transparent; + height: 4px; + width: 4px; +} + +.jp-scrollbar-tiny::-webkit-scrollbar-thumb { + background: rgba(var(--jp-scrollbar-thumb-color), 0.5); +} + +.jp-scrollbar-tiny::-webkit-scrollbar-track:horizontal { + border-left: 0 solid transparent; + border-right: 0 solid transparent; +} + +.jp-scrollbar-tiny::-webkit-scrollbar-track:vertical { + border-top: 0 solid transparent; + border-bottom: 0 solid transparent; +} + +/* + * Lumino + */ + +.lm-ScrollBar[data-orientation='horizontal'] { + min-height: 16px; + max-height: 16px; + min-width: 45px; + border-top: 1px solid #a0a0a0; +} + +.lm-ScrollBar[data-orientation='vertical'] { + min-width: 16px; + max-width: 16px; + min-height: 45px; + border-left: 1px solid #a0a0a0; +} + +.lm-ScrollBar-button { + background-color: #f0f0f0; + background-position: center center; + min-height: 15px; + max-height: 15px; + min-width: 15px; + max-width: 15px; +} + +.lm-ScrollBar-button:hover { + background-color: #dadada; +} + +.lm-ScrollBar-button.lm-mod-active { + background-color: #cdcdcd; +} + +.lm-ScrollBar-track { + background: #f0f0f0; +} + +.lm-ScrollBar-thumb { + background: #cdcdcd; +} + +.lm-ScrollBar-thumb:hover { + background: #bababa; +} + +.lm-ScrollBar-thumb.lm-mod-active { + background: #a0a0a0; +} + +.lm-ScrollBar[data-orientation='horizontal'] .lm-ScrollBar-thumb { + height: 100%; + min-width: 15px; + border-left: 1px solid #a0a0a0; + border-right: 1px solid #a0a0a0; +} + +.lm-ScrollBar[data-orientation='vertical'] .lm-ScrollBar-thumb { + width: 100%; + min-height: 15px; + border-top: 1px solid #a0a0a0; + border-bottom: 1px solid #a0a0a0; +} + +.lm-ScrollBar[data-orientation='horizontal'] + .lm-ScrollBar-button[data-action='decrement'] { + background-image: var(--jp-icon-caret-left); + background-size: 17px; +} + +.lm-ScrollBar[data-orientation='horizontal'] + .lm-ScrollBar-button[data-action='increment'] { + background-image: var(--jp-icon-caret-right); + background-size: 17px; +} + +.lm-ScrollBar[data-orientation='vertical'] + .lm-ScrollBar-button[data-action='decrement'] { + background-image: var(--jp-icon-caret-up); + background-size: 17px; +} + +.lm-ScrollBar[data-orientation='vertical'] + .lm-ScrollBar-button[data-action='increment'] { + background-image: var(--jp-icon-caret-down); + background-size: 17px; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-Widget { + box-sizing: border-box; + position: relative; + overflow: hidden; +} + +.lm-Widget.lm-mod-hidden { + display: none !important; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +.lm-AccordionPanel[data-orientation='horizontal'] > .lm-AccordionPanel-title { + /* Title is rotated for horizontal accordion panel using CSS */ + display: block; + transform-origin: top left; + transform: rotate(-90deg) translate(-100%); +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-CommandPalette { + display: flex; + flex-direction: column; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.lm-CommandPalette-search { + flex: 0 0 auto; +} + +.lm-CommandPalette-content { + flex: 1 1 auto; + margin: 0; + padding: 0; + min-height: 0; + overflow: auto; + list-style-type: none; +} + +.lm-CommandPalette-header { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.lm-CommandPalette-item { + display: flex; + flex-direction: row; +} + +.lm-CommandPalette-itemIcon { + flex: 0 0 auto; +} + +.lm-CommandPalette-itemContent { + flex: 1 1 auto; + overflow: hidden; +} + +.lm-CommandPalette-itemShortcut { + flex: 0 0 auto; +} + +.lm-CommandPalette-itemLabel { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.lm-close-icon { + border: 1px solid transparent; + background-color: transparent; + position: absolute; + z-index: 1; + right: 3%; + top: 0; + bottom: 0; + margin: auto; + padding: 7px 0; + display: none; + vertical-align: middle; + outline: 0; + cursor: pointer; +} +.lm-close-icon:after { + content: 'X'; + display: block; + width: 15px; + height: 15px; + text-align: center; + color: #000; + font-weight: normal; + font-size: 12px; + cursor: pointer; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-DockPanel { + z-index: 0; +} + +.lm-DockPanel-widget { + z-index: 0; +} + +.lm-DockPanel-tabBar { + z-index: 1; +} + +.lm-DockPanel-handle { + z-index: 2; +} + +.lm-DockPanel-handle.lm-mod-hidden { + display: none !important; +} + +.lm-DockPanel-handle:after { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + content: ''; +} + +.lm-DockPanel-handle[data-orientation='horizontal'] { + cursor: ew-resize; +} + +.lm-DockPanel-handle[data-orientation='vertical'] { + cursor: ns-resize; +} + +.lm-DockPanel-handle[data-orientation='horizontal']:after { + left: 50%; + min-width: 8px; + transform: translateX(-50%); +} + +.lm-DockPanel-handle[data-orientation='vertical']:after { + top: 50%; + min-height: 8px; + transform: translateY(-50%); +} + +.lm-DockPanel-overlay { + z-index: 3; + box-sizing: border-box; + pointer-events: none; +} + +.lm-DockPanel-overlay.lm-mod-hidden { + display: none !important; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-Menu { + z-index: 10000; + position: absolute; + white-space: nowrap; + overflow-x: hidden; + overflow-y: auto; + outline: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.lm-Menu-content { + margin: 0; + padding: 0; + display: table; + list-style-type: none; +} + +.lm-Menu-item { + display: table-row; +} + +.lm-Menu-item.lm-mod-hidden, +.lm-Menu-item.lm-mod-collapsed { + display: none !important; +} + +.lm-Menu-itemIcon, +.lm-Menu-itemSubmenuIcon { + display: table-cell; + text-align: center; +} + +.lm-Menu-itemLabel { + display: table-cell; + text-align: left; +} + +.lm-Menu-itemShortcut { + display: table-cell; + text-align: right; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-MenuBar { + outline: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.lm-MenuBar-content { + margin: 0; + padding: 0; + display: flex; + flex-direction: row; + list-style-type: none; +} + +.lm-MenuBar-item { + box-sizing: border-box; +} + +.lm-MenuBar-itemIcon, +.lm-MenuBar-itemLabel { + display: inline-block; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-ScrollBar { + display: flex; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.lm-ScrollBar[data-orientation='horizontal'] { + flex-direction: row; +} + +.lm-ScrollBar[data-orientation='vertical'] { + flex-direction: column; +} + +.lm-ScrollBar-button { + box-sizing: border-box; + flex: 0 0 auto; +} + +.lm-ScrollBar-track { + box-sizing: border-box; + position: relative; + overflow: hidden; + flex: 1 1 auto; +} + +.lm-ScrollBar-thumb { + box-sizing: border-box; + position: absolute; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-SplitPanel-child { + z-index: 0; +} + +.lm-SplitPanel-handle { + z-index: 1; +} + +.lm-SplitPanel-handle.lm-mod-hidden { + display: none !important; +} + +.lm-SplitPanel-handle:after { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + content: ''; +} + +.lm-SplitPanel[data-orientation='horizontal'] > .lm-SplitPanel-handle { + cursor: ew-resize; +} + +.lm-SplitPanel[data-orientation='vertical'] > .lm-SplitPanel-handle { + cursor: ns-resize; +} + +.lm-SplitPanel[data-orientation='horizontal'] > .lm-SplitPanel-handle:after { + left: 50%; + min-width: 8px; + transform: translateX(-50%); +} + +.lm-SplitPanel[data-orientation='vertical'] > .lm-SplitPanel-handle:after { + top: 50%; + min-height: 8px; + transform: translateY(-50%); +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-TabBar { + display: flex; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.lm-TabBar[data-orientation='horizontal'] { + flex-direction: row; + align-items: flex-end; +} + +.lm-TabBar[data-orientation='vertical'] { + flex-direction: column; + align-items: flex-end; +} + +.lm-TabBar-content { + margin: 0; + padding: 0; + display: flex; + flex: 1 1 auto; + list-style-type: none; +} + +.lm-TabBar[data-orientation='horizontal'] > .lm-TabBar-content { + flex-direction: row; +} + +.lm-TabBar[data-orientation='vertical'] > .lm-TabBar-content { + flex-direction: column; +} + +.lm-TabBar-tab { + display: flex; + flex-direction: row; + box-sizing: border-box; + overflow: hidden; + touch-action: none; /* Disable native Drag/Drop */ +} + +.lm-TabBar-tabIcon, +.lm-TabBar-tabCloseIcon { + flex: 0 0 auto; +} + +.lm-TabBar-tabLabel { + flex: 1 1 auto; + overflow: hidden; + white-space: nowrap; +} + +.lm-TabBar-tabInput { + user-select: all; + width: 100%; + box-sizing: border-box; +} + +.lm-TabBar-tab.lm-mod-hidden { + display: none !important; +} + +.lm-TabBar-addButton.lm-mod-hidden { + display: none !important; +} + +.lm-TabBar.lm-mod-dragging .lm-TabBar-tab { + position: relative; +} + +.lm-TabBar.lm-mod-dragging[data-orientation='horizontal'] .lm-TabBar-tab { + left: 0; + transition: left 150ms ease; +} + +.lm-TabBar.lm-mod-dragging[data-orientation='vertical'] .lm-TabBar-tab { + top: 0; + transition: top 150ms ease; +} + +.lm-TabBar.lm-mod-dragging .lm-TabBar-tab.lm-mod-dragging { + transition: none; +} + +.lm-TabBar-tabLabel .lm-TabBar-tabInput { + user-select: all; + width: 100%; + box-sizing: border-box; + background: inherit; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-TabPanel-tabBar { + z-index: 1; +} + +.lm-TabPanel-stackedPanel { + z-index: 0; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-Collapse { + display: flex; + flex-direction: column; + align-items: stretch; +} + +.jp-Collapse-header { + padding: 1px 12px; + background-color: var(--jp-layout-color1); + border-bottom: solid var(--jp-border-width) var(--jp-border-color2); + color: var(--jp-ui-font-color1); + cursor: pointer; + display: flex; + align-items: center; + font-size: var(--jp-ui-font-size0); + font-weight: 600; + text-transform: uppercase; + user-select: none; +} + +.jp-Collapser-icon { + height: 16px; +} + +.jp-Collapse-header-collapsed .jp-Collapser-icon { + transform: rotate(-90deg); + margin: auto 0; +} + +.jp-Collapser-title { + line-height: 25px; +} + +.jp-Collapse-contents { + padding: 0 12px; + background-color: var(--jp-layout-color1); + color: var(--jp-ui-font-color1); + overflow: auto; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/* This file was auto-generated by ensureUiComponents() in @jupyterlab/buildutils */ + +/** + * (DEPRECATED) Support for consuming icons as CSS background images + */ + +/* Icons urls */ + +:root { + --jp-icon-add-above: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzEzN18xOTQ5MikiPgo8cGF0aCBjbGFzcz0ianAtaWNvbjMiIGQ9Ik00Ljc1IDQuOTMwNjZINi42MjVWNi44MDU2NkM2LjYyNSA3LjAxMTkxIDYuNzkzNzUgNy4xODA2NiA3IDcuMTgwNjZDNy4yMDYyNSA3LjE4MDY2IDcuMzc1IDcuMDExOTEgNy4zNzUgNi44MDU2NlY0LjkzMDY2SDkuMjVDOS40NTYyNSA0LjkzMDY2IDkuNjI1IDQuNzYxOTEgOS42MjUgNC41NTU2NkM5LjYyNSA0LjM0OTQxIDkuNDU2MjUgNC4xODA2NiA5LjI1IDQuMTgwNjZINy4zNzVWMi4zMDU2NkM3LjM3NSAyLjA5OTQxIDcuMjA2MjUgMS45MzA2NiA3IDEuOTMwNjZDNi43OTM3NSAxLjkzMDY2IDYuNjI1IDIuMDk5NDEgNi42MjUgMi4zMDU2NlY0LjE4MDY2SDQuNzVDNC41NDM3NSA0LjE4MDY2IDQuMzc1IDQuMzQ5NDEgNC4zNzUgNC41NTU2NkM0LjM3NSA0Ljc2MTkxIDQuNTQzNzUgNC45MzA2NiA0Ljc1IDQuOTMwNjZaIiBmaWxsPSIjNjE2MTYxIiBzdHJva2U9IiM2MTYxNjEiIHN0cm9rZS13aWR0aD0iMC43Ii8+CjwvZz4KPHBhdGggY2xhc3M9ImpwLWljb24zIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTExLjUgOS41VjExLjVMMi41IDExLjVWOS41TDExLjUgOS41Wk0xMiA4QzEyLjU1MjMgOCAxMyA4LjQ0NzcyIDEzIDlWMTJDMTMgMTIuNTUyMyAxMi41NTIzIDEzIDEyIDEzTDIgMTNDMS40NDc3MiAxMyAxIDEyLjU1MjMgMSAxMlY5QzEgOC40NDc3MiAxLjQ0NzcxIDggMiA4TDEyIDhaIiBmaWxsPSIjNjE2MTYxIi8+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzEzN18xOTQ5MiI+CjxyZWN0IGNsYXNzPSJqcC1pY29uMyIgd2lkdGg9IjYiIGhlaWdodD0iNiIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0ibWF0cml4KC0xIDAgMCAxIDEwIDEuNTU1NjYpIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg==); + --jp-icon-add-below: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzEzN18xOTQ5OCkiPgo8cGF0aCBjbGFzcz0ianAtaWNvbjMiIGQ9Ik05LjI1IDEwLjA2OTNMNy4zNzUgMTAuMDY5M0w3LjM3NSA4LjE5NDM0QzcuMzc1IDcuOTg4MDkgNy4yMDYyNSA3LjgxOTM0IDcgNy44MTkzNEM2Ljc5Mzc1IDcuODE5MzQgNi42MjUgNy45ODgwOSA2LjYyNSA4LjE5NDM0TDYuNjI1IDEwLjA2OTNMNC43NSAxMC4wNjkzQzQuNTQzNzUgMTAuMDY5MyA0LjM3NSAxMC4yMzgxIDQuMzc1IDEwLjQ0NDNDNC4zNzUgMTAuNjUwNiA0LjU0Mzc1IDEwLjgxOTMgNC43NSAxMC44MTkzTDYuNjI1IDEwLjgxOTNMNi42MjUgMTIuNjk0M0M2LjYyNSAxMi45MDA2IDYuNzkzNzUgMTMuMDY5MyA3IDEzLjA2OTNDNy4yMDYyNSAxMy4wNjkzIDcuMzc1IDEyLjkwMDYgNy4zNzUgMTIuNjk0M0w3LjM3NSAxMC44MTkzTDkuMjUgMTAuODE5M0M5LjQ1NjI1IDEwLjgxOTMgOS42MjUgMTAuNjUwNiA5LjYyNSAxMC40NDQzQzkuNjI1IDEwLjIzODEgOS40NTYyNSAxMC4wNjkzIDkuMjUgMTAuMDY5M1oiIGZpbGw9IiM2MTYxNjEiIHN0cm9rZT0iIzYxNjE2MSIgc3Ryb2tlLXdpZHRoPSIwLjciLz4KPC9nPgo8cGF0aCBjbGFzcz0ianAtaWNvbjMiIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMi41IDUuNUwyLjUgMy41TDExLjUgMy41TDExLjUgNS41TDIuNSA1LjVaTTIgN0MxLjQ0NzcyIDcgMSA2LjU1MjI4IDEgNkwxIDNDMSAyLjQ0NzcyIDEuNDQ3NzIgMiAyIDJMMTIgMkMxMi41NTIzIDIgMTMgMi40NDc3MiAxMyAzTDEzIDZDMTMgNi41NTIyOSAxMi41NTIzIDcgMTIgN0wyIDdaIiBmaWxsPSIjNjE2MTYxIi8+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzEzN18xOTQ5OCI+CjxyZWN0IGNsYXNzPSJqcC1pY29uMyIgd2lkdGg9IjYiIGhlaWdodD0iNiIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0ibWF0cml4KDEgMS43NDg0NmUtMDcgMS43NDg0NmUtMDcgLTEgNCAxMy40NDQzKSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=); + --jp-icon-add: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTE5IDEzaC02djZoLTJ2LTZINXYtMmg2VjVoMnY2aDZ2MnoiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-bell: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE2IDE2IiB2ZXJzaW9uPSIxLjEiPgogICA8cGF0aCBjbGFzcz0ianAtaWNvbjIganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjMzMzMzMzIgogICAgICBkPSJtOCAwLjI5Yy0xLjQgMC0yLjcgMC43My0zLjYgMS44LTEuMiAxLjUtMS40IDMuNC0xLjUgNS4yLTAuMTggMi4yLTAuNDQgNC0yLjMgNS4zbDAuMjggMS4zaDVjMC4wMjYgMC42NiAwLjMyIDEuMSAwLjcxIDEuNSAwLjg0IDAuNjEgMiAwLjYxIDIuOCAwIDAuNTItMC40IDAuNi0xIDAuNzEtMS41aDVsMC4yOC0xLjNjLTEuOS0wLjk3LTIuMi0zLjMtMi4zLTUuMy0wLjEzLTEuOC0wLjI2LTMuNy0xLjUtNS4yLTAuODUtMS0yLjItMS44LTMuNi0xLjh6bTAgMS40YzAuODggMCAxLjkgMC41NSAyLjUgMS4zIDAuODggMS4xIDEuMSAyLjcgMS4yIDQuNCAwLjEzIDEuNyAwLjIzIDMuNiAxLjMgNS4yaC0xMGMxLjEtMS42IDEuMi0zLjQgMS4zLTUuMiAwLjEzLTEuNyAwLjMtMy4zIDEuMi00LjQgMC41OS0wLjcyIDEuNi0xLjMgMi41LTEuM3ptLTAuNzQgMTJoMS41Yy0wLjAwMTUgMC4yOCAwLjAxNSAwLjc5LTAuNzQgMC43OS0wLjczIDAuMDAxNi0wLjcyLTAuNTMtMC43NC0wLjc5eiIgLz4KPC9zdmc+Cg==); + --jp-icon-bug-dot: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiM2MTYxNjEiPgogICAgICAgIDxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTcuMTkgOEgyMFYxMEgxNy45MUMxNy45NiAxMC4zMyAxOCAxMC42NiAxOCAxMVYxMkgyMFYxNEgxOC41SDE4VjE0LjAyNzVDMTUuNzUgMTQuMjc2MiAxNCAxNi4xODM3IDE0IDE4LjVDMTQgMTkuMjA4IDE0LjE2MzUgMTkuODc3OSAxNC40NTQ5IDIwLjQ3MzlDMTMuNzA2MyAyMC44MTE3IDEyLjg3NTcgMjEgMTIgMjFDOS43OCAyMSA3Ljg1IDE5Ljc5IDYuODEgMThINFYxNkg2LjA5QzYuMDQgMTUuNjcgNiAxNS4zNCA2IDE1VjE0SDRWMTJINlYxMUM2IDEwLjY2IDYuMDQgMTAuMzMgNi4wOSAxMEg0VjhINi44MUM3LjI2IDcuMjIgNy44OCA2LjU1IDguNjIgNi4wNEw3IDQuNDFMOC40MSAzTDEwLjU5IDUuMTdDMTEuMDQgNS4wNiAxMS41MSA1IDEyIDVDMTIuNDkgNSAxMi45NiA1LjA2IDEzLjQyIDUuMTdMMTUuNTkgM0wxNyA0LjQxTDE1LjM3IDYuMDRDMTYuMTIgNi41NSAxNi43NCA3LjIyIDE3LjE5IDhaTTEwIDE2SDE0VjE0SDEwVjE2Wk0xMCAxMkgxNFYxMEgxMFYxMloiIGZpbGw9IiM2MTYxNjEiLz4KICAgICAgICA8cGF0aCBkPSJNMjIgMTguNUMyMiAyMC40MzMgMjAuNDMzIDIyIDE4LjUgMjJDMTYuNTY3IDIyIDE1IDIwLjQzMyAxNSAxOC41QzE1IDE2LjU2NyAxNi41NjcgMTUgMTguNSAxNUMyMC40MzMgMTUgMjIgMTYuNTY3IDIyIDE4LjVaIiBmaWxsPSIjNjE2MTYxIi8+CiAgICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-bug: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxwYXRoIGQ9Ik0yMCA4aC0yLjgxYy0uNDUtLjc4LTEuMDctMS40NS0xLjgyLTEuOTZMMTcgNC40MSAxNS41OSAzbC0yLjE3IDIuMTdDMTIuOTYgNS4wNiAxMi40OSA1IDEyIDVjLS40OSAwLS45Ni4wNi0xLjQxLjE3TDguNDEgMyA3IDQuNDFsMS42MiAxLjYzQzcuODggNi41NSA3LjI2IDcuMjIgNi44MSA4SDR2MmgyLjA5Yy0uMDUuMzMtLjA5LjY2LS4wOSAxdjFINHYyaDJ2MWMwIC4zNC4wNC42Ny4wOSAxSDR2MmgyLjgxYzEuMDQgMS43OSAyLjk3IDMgNS4xOSAzczQuMTUtMS4yMSA1LjE5LTNIMjB2LTJoLTIuMDljLjA1LS4zMy4wOS0uNjYuMDktMXYtMWgydi0yaC0ydi0xYzAtLjM0LS4wNC0uNjctLjA5LTFIMjBWOHptLTYgOGgtNHYtMmg0djJ6bTAtNGgtNHYtMmg0djJ6Ii8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-build: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTE0LjkgMTcuNDVDMTYuMjUgMTcuNDUgMTcuMzUgMTYuMzUgMTcuMzUgMTVDMTcuMzUgMTMuNjUgMTYuMjUgMTIuNTUgMTQuOSAxMi41NUMxMy41NCAxMi41NSAxMi40NSAxMy42NSAxMi40NSAxNUMxMi40NSAxNi4zNSAxMy41NCAxNy40NSAxNC45IDE3LjQ1Wk0yMC4xIDE1LjY4TDIxLjU4IDE2Ljg0QzIxLjcxIDE2Ljk1IDIxLjc1IDE3LjEzIDIxLjY2IDE3LjI5TDIwLjI2IDE5LjcxQzIwLjE3IDE5Ljg2IDIwIDE5LjkyIDE5LjgzIDE5Ljg2TDE4LjA5IDE5LjE2QzE3LjczIDE5LjQ0IDE3LjMzIDE5LjY3IDE2LjkxIDE5Ljg1TDE2LjY0IDIxLjdDMTYuNjIgMjEuODcgMTYuNDcgMjIgMTYuMyAyMkgxMy41QzEzLjMyIDIyIDEzLjE4IDIxLjg3IDEzLjE1IDIxLjdMMTIuODkgMTkuODVDMTIuNDYgMTkuNjcgMTIuMDcgMTkuNDQgMTEuNzEgMTkuMTZMOS45NjAwMiAxOS44NkM5LjgxMDAyIDE5LjkyIDkuNjIwMDIgMTkuODYgOS41NDAwMiAxOS43MUw4LjE0MDAyIDE3LjI5QzguMDUwMDIgMTcuMTMgOC4wOTAwMiAxNi45NSA4LjIyMDAyIDE2Ljg0TDkuNzAwMDIgMTUuNjhMOS42NTAwMSAxNUw5LjcwMDAyIDE0LjMxTDguMjIwMDIgMTMuMTZDOC4wOTAwMiAxMy4wNSA4LjA1MDAyIDEyLjg2IDguMTQwMDIgMTIuNzFMOS41NDAwMiAxMC4yOUM5LjYyMDAyIDEwLjEzIDkuODEwMDIgMTAuMDcgOS45NjAwMiAxMC4xM0wxMS43MSAxMC44NEMxMi4wNyAxMC41NiAxMi40NiAxMC4zMiAxMi44OSAxMC4xNUwxMy4xNSA4LjI4OTk4QzEzLjE4IDguMTI5OTggMTMuMzIgNy45OTk5OCAxMy41IDcuOTk5OThIMTYuM0MxNi40NyA3Ljk5OTk4IDE2LjYyIDguMTI5OTggMTYuNjQgOC4yODk5OEwxNi45MSAxMC4xNUMxNy4zMyAxMC4zMiAxNy43MyAxMC41NiAxOC4wOSAxMC44NEwxOS44MyAxMC4xM0MyMCAxMC4wNyAyMC4xNyAxMC4xMyAyMC4yNiAxMC4yOUwyMS42NiAxMi43MUMyMS43NSAxMi44NiAyMS43MSAxMy4wNSAyMS41OCAxMy4xNkwyMC4xIDE0LjMxTDIwLjE1IDE1TDIwLjEgMTUuNjhaIi8+CiAgICA8cGF0aCBkPSJNNy4zMjk2NiA3LjQ0NDU0QzguMDgzMSA3LjAwOTU0IDguMzM5MzIgNi4wNTMzMiA3LjkwNDMyIDUuMjk5ODhDNy40NjkzMiA0LjU0NjQzIDYuNTA4MSA0LjI4MTU2IDUuNzU0NjYgNC43MTY1NkM1LjM5MTc2IDQuOTI2MDggNS4xMjY5NSA1LjI3MTE4IDUuMDE4NDkgNS42NzU5NEM0LjkxMDA0IDYuMDgwNzEgNC45NjY4MiA2LjUxMTk4IDUuMTc2MzQgNi44NzQ4OEM1LjYxMTM0IDcuNjI4MzIgNi41NzYyMiA3Ljg3OTU0IDcuMzI5NjYgNy40NDQ1NFpNOS42NTcxOCA0Ljc5NTkzTDEwLjg2NzIgNC45NTE3OUMxMC45NjI4IDQuOTc3NDEgMTEuMDQwMiA1LjA3MTMzIDExLjAzODIgNS4xODc5M0wxMS4wMzg4IDYuOTg4OTNDMTEuMDQ1NSA3LjEwMDU0IDEwLjk2MTYgNy4xOTUxOCAxMC44NTUgNy4yMTA1NEw5LjY2MDAxIDcuMzgwODNMOS4yMzkxNSA4LjEzMTg4TDkuNjY5NjEgOS4yNTc0NUM5LjcwNzI5IDkuMzYyNzEgOS42NjkzNCA5LjQ3Njk5IDkuNTc0MDggOS41MzE5OUw4LjAxNTIzIDEwLjQzMkM3LjkxMTMxIDEwLjQ5MiA3Ljc5MzM3IDEwLjQ2NzcgNy43MjEwNSAxMC4zODI0TDYuOTg3NDggOS40MzE4OEw2LjEwOTMxIDkuNDMwODNMNS4zNDcwNCAxMC4zOTA1QzUuMjg5MDkgMTAuNDcwMiA1LjE3MzgzIDEwLjQ5MDUgNS4wNzE4NyAxMC40MzM5TDMuNTEyNDUgOS41MzI5M0MzLjQxMDQ5IDkuNDc2MzMgMy4zNzY0NyA5LjM1NzQxIDMuNDEwNzUgOS4yNTY3OUwzLjg2MzQ3IDguMTQwOTNMMy42MTc0OSA3Ljc3NDg4TDMuNDIzNDcgNy4zNzg4M0wyLjIzMDc1IDcuMjEyOTdDMi4xMjY0NyA3LjE5MjM1IDIuMDQwNDkgNy4xMDM0MiAyLjA0MjQ1IDYuOTg2ODJMMi4wNDE4NyA1LjE4NTgyQzIuMDQzODMgNS4wNjkyMiAyLjExOTA5IDQuOTc5NTggMi4yMTcwNCA0Ljk2OTIyTDMuNDIwNjUgNC43OTM5M0wzLjg2NzQ5IDQuMDI3ODhMMy40MTEwNSAyLjkxNzMxQzMuMzczMzcgMi44MTIwNCAzLjQxMTMxIDIuNjk3NzYgMy41MTUyMyAyLjYzNzc2TDUuMDc0MDggMS43Mzc3NkM1LjE2OTM0IDEuNjgyNzYgNS4yODcyOSAxLjcwNzA0IDUuMzU5NjEgMS43OTIzMUw2LjExOTE1IDIuNzI3ODhMNi45ODAwMSAyLjczODkzTDcuNzI0OTYgMS43ODkyMkM3Ljc5MTU2IDEuNzA0NTggNy45MTU0OCAxLjY3OTIyIDguMDA4NzkgMS43NDA4Mkw5LjU2ODIxIDIuNjQxODJDOS42NzAxNyAyLjY5ODQyIDkuNzEyODUgMi44MTIzNCA5LjY4NzIzIDIuOTA3OTdMOS4yMTcxOCA0LjAzMzgzTDkuNDYzMTYgNC4zOTk4OEw5LjY1NzE4IDQuNzk1OTNaIi8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-caret-down-empty-thin: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iPgoJCTxwb2x5Z29uIGNsYXNzPSJzdDEiIHBvaW50cz0iOS45LDEzLjYgMy42LDcuNCA0LjQsNi42IDkuOSwxMi4yIDE1LjQsNi43IDE2LjEsNy40ICIvPgoJPC9nPgo8L3N2Zz4K); + --jp-icon-caret-down-empty: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIj4KICAgIDxwYXRoIGQ9Ik01LjIsNS45TDksOS43bDMuOC0zLjhsMS4yLDEuMmwtNC45LDVsLTQuOS01TDUuMiw1Ljl6Ii8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-caret-down: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIj4KICAgIDxwYXRoIGQ9Ik01LjIsNy41TDksMTEuMmwzLjgtMy44SDUuMnoiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-caret-left: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iPgoJCTxwYXRoIGQ9Ik0xMC44LDEyLjhMNy4xLDlsMy44LTMuOGwwLDcuNkgxMC44eiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-caret-right: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIj4KICAgIDxwYXRoIGQ9Ik03LjIsNS4yTDEwLjksOWwtMy44LDMuOFY1LjJINy4yeiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-caret-up-empty-thin: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iPgoJCTxwb2x5Z29uIGNsYXNzPSJzdDEiIHBvaW50cz0iMTUuNCwxMy4zIDkuOSw3LjcgNC40LDEzLjIgMy42LDEyLjUgOS45LDYuMyAxNi4xLDEyLjYgIi8+Cgk8L2c+Cjwvc3ZnPgo=); + --jp-icon-caret-up: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iPgoJCTxwYXRoIGQ9Ik01LjIsMTAuNUw5LDYuOGwzLjgsMy44SDUuMnoiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-case-sensitive: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICA8ZyBjbGFzcz0ianAtaWNvbjIiIGZpbGw9IiM0MTQxNDEiPgogICAgPHJlY3QgeD0iMiIgeT0iMiIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ii8+CiAgPC9nPgogIDxnIGNsYXNzPSJqcC1pY29uLWFjY2VudDIiIGZpbGw9IiNGRkYiPgogICAgPHBhdGggZD0iTTcuNiw4aDAuOWwzLjUsOGgtMS4xTDEwLDE0SDZsLTAuOSwySDRMNy42LDh6IE04LDkuMUw2LjQsMTNoMy4yTDgsOS4xeiIvPgogICAgPHBhdGggZD0iTTE2LjYsOS44Yy0wLjIsMC4xLTAuNCwwLjEtMC43LDAuMWMtMC4yLDAtMC40LTAuMS0wLjYtMC4yYy0wLjEtMC4xLTAuMi0wLjQtMC4yLTAuNyBjLTAuMywwLjMtMC42LDAuNS0wLjksMC43Yy0wLjMsMC4xLTAuNywwLjItMS4xLDAuMmMtMC4zLDAtMC41LDAtMC43LTAuMWMtMC4yLTAuMS0wLjQtMC4yLTAuNi0wLjNjLTAuMi0wLjEtMC4zLTAuMy0wLjQtMC41IGMtMC4xLTAuMi0wLjEtMC40LTAuMS0wLjdjMC0wLjMsMC4xLTAuNiwwLjItMC44YzAuMS0wLjIsMC4zLTAuNCwwLjQtMC41QzEyLDcsMTIuMiw2LjksMTIuNSw2LjhjMC4yLTAuMSwwLjUtMC4xLDAuNy0wLjIgYzAuMy0wLjEsMC41LTAuMSwwLjctMC4xYzAuMiwwLDAuNC0wLjEsMC42LTAuMWMwLjIsMCwwLjMtMC4xLDAuNC0wLjJjMC4xLTAuMSwwLjItMC4yLDAuMi0wLjRjMC0xLTEuMS0xLTEuMy0xIGMtMC40LDAtMS40LDAtMS40LDEuMmgtMC45YzAtMC40LDAuMS0wLjcsMC4yLTFjMC4xLTAuMiwwLjMtMC40LDAuNS0wLjZjMC4yLTAuMiwwLjUtMC4zLDAuOC0wLjNDMTMuMyw0LDEzLjYsNCwxMy45LDQgYzAuMywwLDAuNSwwLDAuOCwwLjFjMC4zLDAsMC41LDAuMSwwLjcsMC4yYzAuMiwwLjEsMC40LDAuMywwLjUsMC41QzE2LDUsMTYsNS4yLDE2LDUuNnYyLjljMCwwLjIsMCwwLjQsMCwwLjUgYzAsMC4xLDAuMSwwLjIsMC4zLDAuMmMwLjEsMCwwLjIsMCwwLjMsMFY5Ljh6IE0xNS4yLDYuOWMtMS4yLDAuNi0zLjEsMC4yLTMuMSwxLjRjMCwxLjQsMy4xLDEsMy4xLTAuNVY2Ljl6Ii8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-check: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxwYXRoIGQ9Ik05IDE2LjE3TDQuODMgMTJsLTEuNDIgMS40MUw5IDE5IDIxIDdsLTEuNDEtMS40MXoiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-circle-empty: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTEyIDJDNi40NyAyIDIgNi40NyAyIDEyczQuNDcgMTAgMTAgMTAgMTAtNC40NyAxMC0xMFMxNy41MyAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-circle: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTggMTgiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPGNpcmNsZSBjeD0iOSIgY3k9IjkiIHI9IjgiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-clear: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8bWFzayBpZD0iZG9udXRIb2xlIj4KICAgIDxyZWN0IHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0id2hpdGUiIC8+CiAgICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI4IiBmaWxsPSJibGFjayIvPgogIDwvbWFzaz4KCiAgPGcgY2xhc3M9ImpwLWljb24zIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxyZWN0IGhlaWdodD0iMTgiIHdpZHRoPSIyIiB4PSIxMSIgeT0iMyIgdHJhbnNmb3JtPSJyb3RhdGUoMzE1LCAxMiwgMTIpIi8+CiAgICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgbWFzaz0idXJsKCNkb251dEhvbGUpIi8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-close: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbi1ub25lIGpwLWljb24tc2VsZWN0YWJsZS1pbnZlcnNlIGpwLWljb24zLWhvdmVyIiBmaWxsPSJub25lIj4KICAgIDxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjExIi8+CiAgPC9nPgoKICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIGpwLWljb24tYWNjZW50Mi1ob3ZlciIgZmlsbD0iIzYxNjE2MSI+CiAgICA8cGF0aCBkPSJNMTkgNi40MUwxNy41OSA1IDEyIDEwLjU5IDYuNDEgNSA1IDYuNDEgMTAuNTkgMTIgNSAxNy41OSA2LjQxIDE5IDEyIDEzLjQxIDE3LjU5IDE5IDE5IDE3LjU5IDEzLjQxIDEyeiIvPgogIDwvZz4KCiAgPGcgY2xhc3M9ImpwLWljb24tbm9uZSBqcC1pY29uLWJ1c3kiIGZpbGw9Im5vbmUiPgogICAgPGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iNyIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-code-check: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBzaGFwZS1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiI+CiAgICA8cGF0aCBkPSJNNi41OSwzLjQxTDIsOEw2LjU5LDEyLjZMOCwxMS4xOEw0LjgyLDhMOCw0LjgyTDYuNTksMy40MU0xMi40MSwzLjQxTDExLDQuODJMMTQuMTgsOEwxMSwxMS4xOEwxMi40MSwxMi42TDE3LDhMMTIuNDEsMy40MU0yMS41OSwxMS41OUwxMy41LDE5LjY4TDkuODMsMTZMOC40MiwxNy40MUwxMy41LDIyLjVMMjMsMTNMMjEuNTksMTEuNTlaIiAvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-code: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjIiIGhlaWdodD0iMjIiIHZpZXdCb3g9IjAgMCAyOCAyOCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CgkJPHBhdGggZD0iTTExLjQgMTguNkw2LjggMTRMMTEuNCA5LjRMMTAgOEw0IDE0TDEwIDIwTDExLjQgMTguNlpNMTYuNiAxOC42TDIxLjIgMTRMMTYuNiA5LjRMMTggOEwyNCAxNEwxOCAyMEwxNi42IDE4LjZWMTguNloiLz4KCTwvZz4KPC9zdmc+Cg==); + --jp-icon-collapse-all: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgZD0iTTggMmMxIDAgMTEgMCAxMiAwczIgMSAyIDJjMCAxIDAgMTEgMCAxMnMwIDItMiAyQzIwIDE0IDIwIDQgMjAgNFMxMCA0IDYgNGMwLTIgMS0yIDItMnoiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgZD0iTTE4IDhjMC0xLTEtMi0yLTJTNSA2IDQgNnMtMiAxLTIgMmMwIDEgMCAxMSAwIDEyczEgMiAyIDJjMSAwIDExIDAgMTIgMHMyLTEgMi0yYzAtMSAwLTExIDAtMTJ6bS0yIDB2MTJINFY4eiIgLz4KICAgICAgICA8cGF0aCBkPSJNNiAxM3YyaDh2LTJ6IiAvPgogICAgPC9nPgo8L3N2Zz4K); + --jp-icon-console: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwMCAyMDAiPgogIDxnIGNsYXNzPSJqcC1jb25zb2xlLWljb24tYmFja2dyb3VuZC1jb2xvciBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiMwMjg4RDEiPgogICAgPHBhdGggZD0iTTIwIDE5LjhoMTYwdjE1OS45SDIweiIvPgogIDwvZz4KICA8ZyBjbGFzcz0ianAtY29uc29sZS1pY29uLWNvbG9yIGpwLWljb24tc2VsZWN0YWJsZS1pbnZlcnNlIiBmaWxsPSIjZmZmIj4KICAgIDxwYXRoIGQ9Ik0xMDUgMTI3LjNoNDB2MTIuOGgtNDB6TTUxLjEgNzdMNzQgOTkuOWwtMjMuMyAyMy4zIDEwLjUgMTAuNSAyMy4zLTIzLjNMOTUgOTkuOSA4NC41IDg5LjQgNjEuNiA2Ni41eiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-copy: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTggMTgiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTExLjksMUgzLjJDMi40LDEsMS43LDEuNywxLjcsMi41djEwLjJoMS41VjIuNWg4LjdWMXogTTE0LjEsMy45aC04Yy0wLjgsMC0xLjUsMC43LTEuNSwxLjV2MTAuMmMwLDAuOCwwLjcsMS41LDEuNSwxLjVoOCBjMC44LDAsMS41LTAuNywxLjUtMS41VjUuNEMxNS41LDQuNiwxNC45LDMuOSwxNC4xLDMuOXogTTE0LjEsMTUuNWgtOFY1LjRoOFYxNS41eiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-copyright: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCI+CiAgPGcgY2xhc3M9ImpwLWljb24zIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxwYXRoIGQ9Ik0xMS44OCw5LjE0YzEuMjgsMC4wNiwxLjYxLDEuMTUsMS42MywxLjY2aDEuNzljLTAuMDgtMS45OC0xLjQ5LTMuMTktMy40NS0zLjE5QzkuNjQsNy42MSw4LDksOCwxMi4xNCBjMCwxLjk0LDAuOTMsNC4yNCwzLjg0LDQuMjRjMi4yMiwwLDMuNDEtMS42NSwzLjQ0LTIuOTVoLTEuNzljLTAuMDMsMC41OS0wLjQ1LDEuMzgtMS42MywxLjQ0QzEwLjU1LDE0LjgzLDEwLDEzLjgxLDEwLDEyLjE0IEMxMCw5LjI1LDExLjI4LDkuMTYsMTEuODgsOS4xNHogTTEyLDJDNi40OCwyLDIsNi40OCwyLDEyczQuNDgsMTAsMTAsMTBzMTAtNC40OCwxMC0xMFMxNy41MiwyLDEyLDJ6IE0xMiwyMGMtNC40MSwwLTgtMy41OS04LTggczMuNTktOCw4LThzOCwzLjU5LDgsOFMxNi40MSwyMCwxMiwyMHoiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-cut: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTkuNjQgNy42NGMuMjMtLjUuMzYtMS4wNS4zNi0xLjY0IDAtMi4yMS0xLjc5LTQtNC00UzIgMy43OSAyIDZzMS43OSA0IDQgNGMuNTkgMCAxLjE0LS4xMyAxLjY0LS4zNkwxMCAxMmwtMi4zNiAyLjM2QzcuMTQgMTQuMTMgNi41OSAxNCA2IDE0Yy0yLjIxIDAtNCAxLjc5LTQgNHMxLjc5IDQgNCA0IDQtMS43OSA0LTRjMC0uNTktLjEzLTEuMTQtLjM2LTEuNjRMMTIgMTRsNyA3aDN2LTFMOS42NCA3LjY0ek02IDhjLTEuMSAwLTItLjg5LTItMnMuOS0yIDItMiAyIC44OSAyIDItLjkgMi0yIDJ6bTAgMTJjLTEuMSAwLTItLjg5LTItMnMuOS0yIDItMiAyIC44OSAyIDItLjkgMi0yIDJ6bTYtNy41Yy0uMjggMC0uNS0uMjItLjUtLjVzLjIyLS41LjUtLjUuNS4yMi41LjUtLjIyLjUtLjUuNXpNMTkgM2wtNiA2IDIgMiA3LTdWM3oiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-delete: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2cHgiIGhlaWdodD0iMTZweCI+CiAgICA8cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIiAvPgogICAgPHBhdGggY2xhc3M9ImpwLWljb24zIiBmaWxsPSIjNjI2MjYyIiBkPSJNNiAxOWMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJWN0g2djEyek0xOSA0aC0zLjVsLTEtMWgtNWwtMSAxSDV2MmgxNFY0eiIgLz4KPC9zdmc+Cg==); + --jp-icon-download: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTE5IDloLTRWM0g5djZINWw3IDcgNy03ek01IDE4djJoMTR2LTJINXoiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-duplicate: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggY2xhc3M9ImpwLWljb24zIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTIuNzk5OTggMC44NzVIOC44OTU4MkM5LjIwMDYxIDAuODc1IDkuNDQ5OTggMS4xMzkxNCA5LjQ0OTk4IDEuNDYxOThDOS40NDk5OCAxLjc4NDgyIDkuMjAwNjEgMi4wNDg5NiA4Ljg5NTgyIDIuMDQ4OTZIMy4zNTQxNUMzLjA0OTM2IDIuMDQ4OTYgMi43OTk5OCAyLjMxMzEgMi43OTk5OCAyLjYzNTk0VjkuNjc5NjlDMi43OTk5OCAxMC4wMDI1IDIuNTUwNjEgMTAuMjY2NyAyLjI0NTgyIDEwLjI2NjdDMS45NDEwMyAxMC4yNjY3IDEuNjkxNjUgMTAuMDAyNSAxLjY5MTY1IDkuNjc5NjlWMi4wNDg5NkMxLjY5MTY1IDEuNDAzMjggMi4xOTA0IDAuODc1IDIuNzk5OTggMC44NzVaTTUuMzY2NjUgMTEuOVY0LjU1SDExLjA4MzNWMTEuOUg1LjM2NjY1Wk00LjE0MTY1IDQuMTQxNjdDNC4xNDE2NSAzLjY5MDYzIDQuNTA3MjggMy4zMjUgNC45NTgzMiAzLjMyNUgxMS40OTE3QzExLjk0MjcgMy4zMjUgMTIuMzA4MyAzLjY5MDYzIDEyLjMwODMgNC4xNDE2N1YxMi4zMDgzQzEyLjMwODMgMTIuNzU5NCAxMS45NDI3IDEzLjEyNSAxMS40OTE3IDEzLjEyNUg0Ljk1ODMyQzQuNTA3MjggMTMuMTI1IDQuMTQxNjUgMTIuNzU5NCA0LjE0MTY1IDEyLjMwODNWNC4xNDE2N1oiIGZpbGw9IiM2MTYxNjEiLz4KPHBhdGggY2xhc3M9ImpwLWljb24zIiBkPSJNOS40MzU3NCA4LjI2NTA3SDguMzY0MzFWOS4zMzY1QzguMzY0MzEgOS40NTQzNSA4LjI2Nzg4IDkuNTUwNzggOC4xNTAwMiA5LjU1MDc4QzguMDMyMTcgOS41NTA3OCA3LjkzNTc0IDkuNDU0MzUgNy45MzU3NCA5LjMzNjVWOC4yNjUwN0g2Ljg2NDMxQzYuNzQ2NDUgOC4yNjUwNyA2LjY1MDAyIDguMTY4NjQgNi42NTAwMiA4LjA1MDc4QzYuNjUwMDIgNy45MzI5MiA2Ljc0NjQ1IDcuODM2NSA2Ljg2NDMxIDcuODM2NUg3LjkzNTc0VjYuNzY1MDdDNy45MzU3NCA2LjY0NzIxIDguMDMyMTcgNi41NTA3OCA4LjE1MDAyIDYuNTUwNzhDOC4yNjc4OCA2LjU1MDc4IDguMzY0MzEgNi42NDcyMSA4LjM2NDMxIDYuNzY1MDdWNy44MzY1SDkuNDM1NzRDOS41NTM2IDcuODM2NSA5LjY1MDAyIDcuOTMyOTIgOS42NTAwMiA4LjA1MDc4QzkuNjUwMDIgOC4xNjg2NCA5LjU1MzYgOC4yNjUwNyA5LjQzNTc0IDguMjY1MDdaIiBmaWxsPSIjNjE2MTYxIiBzdHJva2U9IiM2MTYxNjEiIHN0cm9rZS13aWR0aD0iMC41Ii8+Cjwvc3ZnPgo=); + --jp-icon-edit: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTMgMTcuMjVWMjFoMy43NUwxNy44MSA5Ljk0bC0zLjc1LTMuNzVMMyAxNy4yNXpNMjAuNzEgNy4wNGMuMzktLjM5LjM5LTEuMDIgMC0xLjQxbC0yLjM0LTIuMzRjLS4zOS0uMzktMS4wMi0uMzktMS40MSAwbC0xLjgzIDEuODMgMy43NSAzLjc1IDEuODMtMS44M3oiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-ellipses: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPGNpcmNsZSBjeD0iNSIgY3k9IjEyIiByPSIyIi8+CiAgICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIyIi8+CiAgICA8Y2lyY2xlIGN4PSIxOSIgY3k9IjEyIiByPSIyIi8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-error: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KPGcgY2xhc3M9ImpwLWljb24zIiBmaWxsPSIjNjE2MTYxIj48Y2lyY2xlIGN4PSIxMiIgY3k9IjE5IiByPSIyIi8+PHBhdGggZD0iTTEwIDNoNHYxMmgtNHoiLz48L2c+CjxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0wIDBoMjR2MjRIMHoiLz4KPC9zdmc+Cg==); + --jp-icon-expand-all: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgZD0iTTggMmMxIDAgMTEgMCAxMiAwczIgMSAyIDJjMCAxIDAgMTEgMCAxMnMwIDItMiAyQzIwIDE0IDIwIDQgMjAgNFMxMCA0IDYgNGMwLTIgMS0yIDItMnoiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgZD0iTTE4IDhjMC0xLTEtMi0yLTJTNSA2IDQgNnMtMiAxLTIgMmMwIDEgMCAxMSAwIDEyczEgMiAyIDJjMSAwIDExIDAgMTIgMHMyLTEgMi0yYzAtMSAwLTExIDAtMTJ6bS0yIDB2MTJINFY4eiIgLz4KICAgICAgICA8cGF0aCBkPSJNMTEgMTBIOXYzSDZ2MmgzdjNoMnYtM2gzdi0yaC0zeiIgLz4KICAgIDwvZz4KPC9zdmc+Cg==); + --jp-icon-extension: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTIwLjUgMTFIMTlWN2MwLTEuMS0uOS0yLTItMmgtNFYzLjVDMTMgMi4xMiAxMS44OCAxIDEwLjUgMVM4IDIuMTIgOCAzLjVWNUg0Yy0xLjEgMC0xLjk5LjktMS45OSAydjMuOEgzLjVjMS40OSAwIDIuNyAxLjIxIDIuNyAyLjdzLTEuMjEgMi43LTIuNyAyLjdIMlYyMGMwIDEuMS45IDIgMiAyaDMuOHYtMS41YzAtMS40OSAxLjIxLTIuNyAyLjctMi43IDEuNDkgMCAyLjcgMS4yMSAyLjcgMi43VjIySDE3YzEuMSAwIDItLjkgMi0ydi00aDEuNWMxLjM4IDAgMi41LTEuMTIgMi41LTIuNVMyMS44OCAxMSAyMC41IDExeiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-fast-forward: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTQgMThsOC41LTZMNCA2djEyem05LTEydjEybDguNS02TDEzIDZ6Ii8+CiAgICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-file-upload: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTkgMTZoNnYtNmg0bC03LTctNyA3aDR6bS00IDJoMTR2Mkg1eiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-file: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8cGF0aCBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMTkuMyA4LjJsLTUuNS01LjVjLS4zLS4zLS43LS41LTEuMi0uNUgzLjljLS44LjEtMS42LjktMS42IDEuOHYxNC4xYzAgLjkuNyAxLjYgMS42IDEuNmgxNC4yYy45IDAgMS42LS43IDEuNi0xLjZWOS40Yy4xLS41LS4xLS45LS40LTEuMnptLTUuOC0zLjNsMy40IDMuNmgtMy40VjQuOXptMy45IDEyLjdINC43Yy0uMSAwLS4yIDAtLjItLjJWNC43YzAtLjIuMS0uMy4yLS4zaDcuMnY0LjRzMCAuOC4zIDEuMWMuMy4zIDEuMS4zIDEuMS4zaDQuM3Y3LjJzLS4xLjItLjIuMnoiLz4KPC9zdmc+Cg==); + --jp-icon-filter-dot: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiNGRkYiPgogICAgPHBhdGggZD0iTTE0LDEyVjE5Ljg4QzE0LjA0LDIwLjE4IDEzLjk0LDIwLjUgMTMuNzEsMjAuNzFDMTMuMzIsMjEuMSAxMi42OSwyMS4xIDEyLjMsMjAuNzFMMTAuMjksMTguN0MxMC4wNiwxOC40NyA5Ljk2LDE4LjE2IDEwLDE3Ljg3VjEySDkuOTdMNC4yMSw0LjYyQzMuODcsNC4xOSAzLjk1LDMuNTYgNC4zOCwzLjIyQzQuNTcsMy4wOCA0Ljc4LDMgNSwzVjNIMTlWM0MxOS4yMiwzIDE5LjQzLDMuMDggMTkuNjIsMy4yMkMyMC4wNSwzLjU2IDIwLjEzLDQuMTkgMTkuNzksNC42MkwxNC4wMywxMkgxNFoiIC8+CiAgPC9nPgogIDxnIGNsYXNzPSJqcC1pY29uLWRvdCIgZmlsbD0iI0ZGRiI+CiAgICA8Y2lyY2xlIGN4PSIxOCIgY3k9IjE3IiByPSIzIj48L2NpcmNsZT4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-filter-list: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTEwIDE4aDR2LTJoLTR2MnpNMyA2djJoMThWNkgzem0zIDdoMTJ2LTJINnYyeiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-filter: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiNGRkYiPgogICAgPHBhdGggZD0iTTE0LDEyVjE5Ljg4QzE0LjA0LDIwLjE4IDEzLjk0LDIwLjUgMTMuNzEsMjAuNzFDMTMuMzIsMjEuMSAxMi42OSwyMS4xIDEyLjMsMjAuNzFMMTAuMjksMTguN0MxMC4wNiwxOC40NyA5Ljk2LDE4LjE2IDEwLDE3Ljg3VjEySDkuOTdMNC4yMSw0LjYyQzMuODcsNC4xOSAzLjk1LDMuNTYgNC4zOCwzLjIyQzQuNTcsMy4wOCA0Ljc4LDMgNSwzVjNIMTlWM0MxOS4yMiwzIDE5LjQzLDMuMDggMTkuNjIsMy4yMkMyMC4wNSwzLjU2IDIwLjEzLDQuMTkgMTkuNzksNC42MkwxNC4wMywxMkgxNFoiIC8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-folder-favorite: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzAwMDAwMCI+CiAgPHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggY2xhc3M9ImpwLWljb24zIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iIzYxNjE2MSIgZD0iTTIwIDZoLThsLTItMkg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6bS0yLjA2IDExTDE1IDE1LjI4IDEyLjA2IDE3bC43OC0zLjMzLTIuNTktMi4yNCAzLjQxLS4yOUwxNSA4bDEuMzQgMy4xNCAzLjQxLjI5LTIuNTkgMi4yNC43OCAzLjMzeiIvPgo8L3N2Zz4K); + --jp-icon-folder: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMTAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY4YzAtMS4xLS45LTItMi0yaC04bC0yLTJ6Ii8+Cjwvc3ZnPgo=); + --jp-icon-home: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzAwMDAwMCI+CiAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGNsYXNzPSJqcC1pY29uMyBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiM2MTYxNjEiIGQ9Ik0xMCAyMHYtNmg0djZoNXYtOGgzTDEyIDMgMiAxMmgzdjh6Ii8+Cjwvc3ZnPgo=); + --jp-icon-html5: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDUxMiA1MTIiPgogIDxwYXRoIGNsYXNzPSJqcC1pY29uMCBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiMwMDAiIGQ9Ik0xMDguNCAwaDIzdjIyLjhoMjEuMlYwaDIzdjY5aC0yM1Y0NmgtMjF2MjNoLTIzLjJNMjA2IDIzaC0yMC4zVjBoNjMuN3YyM0gyMjl2NDZoLTIzbTUzLjUtNjloMjQuMWwxNC44IDI0LjNMMzEzLjIgMGgyNC4xdjY5aC0yM1YzNC44bC0xNi4xIDI0LjgtMTYuMS0yNC44VjY5aC0yMi42bTg5LjItNjloMjN2NDYuMmgzMi42VjY5aC01NS42Ii8+CiAgPHBhdGggY2xhc3M9ImpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iI2U0NGQyNiIgZD0iTTEwNy42IDQ3MWwtMzMtMzcwLjRoMzYyLjhsLTMzIDM3MC4yTDI1NS43IDUxMiIvPgogIDxwYXRoIGNsYXNzPSJqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiNmMTY1MjkiIGQ9Ik0yNTYgNDgwLjVWMTMxaDE0OC4zTDM3NiA0NDciLz4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1zZWxlY3RhYmxlLWludmVyc2UiIGZpbGw9IiNlYmViZWIiIGQ9Ik0xNDIgMTc2LjNoMTE0djQ1LjRoLTY0LjJsNC4yIDQ2LjVoNjB2NDUuM0gxNTQuNG0yIDIyLjhIMjAybDMuMiAzNi4zIDUwLjggMTMuNnY0Ny40bC05My4yLTI2Ii8+CiAgPHBhdGggY2xhc3M9ImpwLWljb24tc2VsZWN0YWJsZS1pbnZlcnNlIiBmaWxsPSIjZmZmIiBkPSJNMzY5LjYgMTc2LjNIMjU1Ljh2NDUuNGgxMDkuNm0tNC4xIDQ2LjVIMjU1Ljh2NDUuNGg1NmwtNS4zIDU5LTUwLjcgMTMuNnY0Ny4ybDkzLTI1LjgiLz4KPC9zdmc+Cg==); + --jp-icon-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1icmFuZDQganAtaWNvbi1zZWxlY3RhYmxlLWludmVyc2UiIGZpbGw9IiNGRkYiIGQ9Ik0yLjIgMi4yaDE3LjV2MTcuNUgyLjJ6Ii8+CiAgPHBhdGggY2xhc3M9ImpwLWljb24tYnJhbmQwIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iIzNGNTFCNSIgZD0iTTIuMiAyLjJ2MTcuNWgxNy41bC4xLTE3LjVIMi4yem0xMi4xIDIuMmMxLjIgMCAyLjIgMSAyLjIgMi4ycy0xIDIuMi0yLjIgMi4yLTIuMi0xLTIuMi0yLjIgMS0yLjIgMi4yLTIuMnpNNC40IDE3LjZsMy4zLTguOCAzLjMgNi42IDIuMi0zLjIgNC40IDUuNEg0LjR6Ii8+Cjwvc3ZnPgo=); + --jp-icon-info: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDUwLjk3OCA1MC45NzgiPgoJPGcgY2xhc3M9ImpwLWljb24zIiBmaWxsPSIjNjE2MTYxIj4KCQk8cGF0aCBkPSJNNDMuNTIsNy40NThDMzguNzExLDIuNjQ4LDMyLjMwNywwLDI1LjQ4OSwwQzE4LjY3LDAsMTIuMjY2LDIuNjQ4LDcuNDU4LDcuNDU4CgkJCWMtOS45NDMsOS45NDEtOS45NDMsMjYuMTE5LDAsMzYuMDYyYzQuODA5LDQuODA5LDExLjIxMiw3LjQ1NiwxOC4wMzEsNy40NThjMCwwLDAuMDAxLDAsMC4wMDIsMAoJCQljNi44MTYsMCwxMy4yMjEtMi42NDgsMTguMDI5LTcuNDU4YzQuODA5LTQuODA5LDcuNDU3LTExLjIxMiw3LjQ1Ny0xOC4wM0M1MC45NzcsMTguNjcsNDguMzI4LDEyLjI2Niw0My41Miw3LjQ1OHoKCQkJIE00Mi4xMDYsNDIuMTA1Yy00LjQzMiw0LjQzMS0xMC4zMzIsNi44NzItMTYuNjE1LDYuODcyaC0wLjAwMmMtNi4yODUtMC4wMDEtMTIuMTg3LTIuNDQxLTE2LjYxNy02Ljg3MgoJCQljLTkuMTYyLTkuMTYzLTkuMTYyLTI0LjA3MSwwLTMzLjIzM0MxMy4zMDMsNC40NCwxOS4yMDQsMiwyNS40ODksMmM2LjI4NCwwLDEyLjE4NiwyLjQ0LDE2LjYxNyw2Ljg3MgoJCQljNC40MzEsNC40MzEsNi44NzEsMTAuMzMyLDYuODcxLDE2LjYxN0M0OC45NzcsMzEuNzcyLDQ2LjUzNiwzNy42NzUsNDIuMTA2LDQyLjEwNXoiLz4KCQk8cGF0aCBkPSJNMjMuNTc4LDMyLjIxOGMtMC4wMjMtMS43MzQsMC4xNDMtMy4wNTksMC40OTYtMy45NzJjMC4zNTMtMC45MTMsMS4xMS0xLjk5NywyLjI3Mi0zLjI1MwoJCQljMC40NjgtMC41MzYsMC45MjMtMS4wNjIsMS4zNjctMS41NzVjMC42MjYtMC43NTMsMS4xMDQtMS40NzgsMS40MzYtMi4xNzVjMC4zMzEtMC43MDcsMC40OTUtMS41NDEsMC40OTUtMi41CgkJCWMwLTEuMDk2LTAuMjYtMi4wODgtMC43NzktMi45NzljLTAuNTY1LTAuODc5LTEuNTAxLTEuMzM2LTIuODA2LTEuMzY5Yy0xLjgwMiwwLjA1Ny0yLjk4NSwwLjY2Ny0zLjU1LDEuODMyCgkJCWMtMC4zMDEsMC41MzUtMC41MDMsMS4xNDEtMC42MDcsMS44MTRjLTAuMTM5LDAuNzA3LTAuMjA3LDEuNDMyLTAuMjA3LDIuMTc0aC0yLjkzN2MtMC4wOTEtMi4yMDgsMC40MDctNC4xMTQsMS40OTMtNS43MTkKCQkJYzEuMDYyLTEuNjQsMi44NTUtMi40ODEsNS4zNzgtMi41MjdjMi4xNiwwLjAyMywzLjg3NCwwLjYwOCw1LjE0MSwxLjc1OGMxLjI3OCwxLjE2LDEuOTI5LDIuNzY0LDEuOTUsNC44MTEKCQkJYzAsMS4xNDItMC4xMzcsMi4xMTEtMC40MSwyLjkxMWMtMC4zMDksMC44NDUtMC43MzEsMS41OTMtMS4yNjgsMi4yNDNjLTAuNDkyLDAuNjUtMS4wNjgsMS4zMTgtMS43MywyLjAwMgoJCQljLTAuNjUsMC42OTctMS4zMTMsMS40NzktMS45ODcsMi4zNDZjLTAuMjM5LDAuMzc3LTAuNDI5LDAuNzc3LTAuNTY1LDEuMTk5Yy0wLjE2LDAuOTU5LTAuMjE3LDEuOTUxLTAuMTcxLDIuOTc5CgkJCUMyNi41ODksMzIuMjE4LDIzLjU3OCwzMi4yMTgsMjMuNTc4LDMyLjIxOHogTTIzLjU3OCwzOC4yMnYtMy40ODRoMy4wNzZ2My40ODRIMjMuNTc4eiIvPgoJPC9nPgo8L3N2Zz4K); + --jp-icon-inspector: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtaW5zcGVjdG9yLWljb24tY29sb3IganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMjAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0tNSAxNEg0di00aDExdjR6bTAtNUg0VjloMTF2NHptNSA1aC00VjloNHY5eiIvPgo8L3N2Zz4K); + --jp-icon-json: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8ZyBjbGFzcz0ianAtanNvbi1pY29uLWNvbG9yIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iI0Y5QTgyNSI+CiAgICA8cGF0aCBkPSJNMjAuMiAxMS44Yy0xLjYgMC0xLjcuNS0xLjcgMSAwIC40LjEuOS4xIDEuMy4xLjUuMS45LjEgMS4zIDAgMS43LTEuNCAyLjMtMy41IDIuM2gtLjl2LTEuOWguNWMxLjEgMCAxLjQgMCAxLjQtLjggMC0uMyAwLS42LS4xLTEgMC0uNC0uMS0uOC0uMS0xLjIgMC0xLjMgMC0xLjggMS4zLTItMS4zLS4yLTEuMy0uNy0xLjMtMiAwLS40LjEtLjguMS0xLjIuMS0uNC4xLS43LjEtMSAwLS44LS40LS43LTEuNC0uOGgtLjVWNC4xaC45YzIuMiAwIDMuNS43IDMuNSAyLjMgMCAuNC0uMS45LS4xIDEuMy0uMS41LS4xLjktLjEgMS4zIDAgLjUuMiAxIDEuNyAxdjEuOHpNMS44IDEwLjFjMS42IDAgMS43LS41IDEuNy0xIDAtLjQtLjEtLjktLjEtMS4zLS4xLS41LS4xLS45LS4xLTEuMyAwLTEuNiAxLjQtMi4zIDMuNS0yLjNoLjl2MS45aC0uNWMtMSAwLTEuNCAwLTEuNC44IDAgLjMgMCAuNi4xIDEgMCAuMi4xLjYuMSAxIDAgMS4zIDAgMS44LTEuMyAyQzYgMTEuMiA2IDExLjcgNiAxM2MwIC40LS4xLjgtLjEgMS4yLS4xLjMtLjEuNy0uMSAxIDAgLjguMy44IDEuNC44aC41djEuOWgtLjljLTIuMSAwLTMuNS0uNi0zLjUtMi4zIDAtLjQuMS0uOS4xLTEuMy4xLS41LjEtLjkuMS0xLjMgMC0uNS0uMi0xLTEuNy0xdi0xLjl6Ii8+CiAgICA8Y2lyY2xlIGN4PSIxMSIgY3k9IjEzLjgiIHI9IjIuMSIvPgogICAgPGNpcmNsZSBjeD0iMTEiIGN5PSI4LjIiIHI9IjIuMSIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-julia: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDMyNSAzMDAiPgogIDxnIGNsYXNzPSJqcC1icmFuZDAganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjY2IzYzMzIj4KICAgIDxwYXRoIGQ9Ik0gMTUwLjg5ODQzOCAyMjUgQyAxNTAuODk4NDM4IDI2Ni40MjE4NzUgMTE3LjMyMDMxMiAzMDAgNzUuODk4NDM4IDMwMCBDIDM0LjQ3NjU2MiAzMDAgMC44OTg0MzggMjY2LjQyMTg3NSAwLjg5ODQzOCAyMjUgQyAwLjg5ODQzOCAxODMuNTc4MTI1IDM0LjQ3NjU2MiAxNTAgNzUuODk4NDM4IDE1MCBDIDExNy4zMjAzMTIgMTUwIDE1MC44OTg0MzggMTgzLjU3ODEyNSAxNTAuODk4NDM4IDIyNSIvPgogIDwvZz4KICA8ZyBjbGFzcz0ianAtYnJhbmQwIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iIzM4OTgyNiI+CiAgICA8cGF0aCBkPSJNIDIzNy41IDc1IEMgMjM3LjUgMTE2LjQyMTg3NSAyMDMuOTIxODc1IDE1MCAxNjIuNSAxNTAgQyAxMjEuMDc4MTI1IDE1MCA4Ny41IDExNi40MjE4NzUgODcuNSA3NSBDIDg3LjUgMzMuNTc4MTI1IDEyMS4wNzgxMjUgMCAxNjIuNSAwIEMgMjAzLjkyMTg3NSAwIDIzNy41IDMzLjU3ODEyNSAyMzcuNSA3NSIvPgogIDwvZz4KICA8ZyBjbGFzcz0ianAtYnJhbmQwIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iIzk1NThiMiI+CiAgICA8cGF0aCBkPSJNIDMyNC4xMDE1NjIgMjI1IEMgMzI0LjEwMTU2MiAyNjYuNDIxODc1IDI5MC41MjM0MzggMzAwIDI0OS4xMDE1NjIgMzAwIEMgMjA3LjY3OTY4OCAzMDAgMTc0LjEwMTU2MiAyNjYuNDIxODc1IDE3NC4xMDE1NjIgMjI1IEMgMTc0LjEwMTU2MiAxODMuNTc4MTI1IDIwNy42Nzk2ODggMTUwIDI0OS4xMDE1NjIgMTUwIEMgMjkwLjUyMzQzOCAxNTAgMzI0LjEwMTU2MiAxODMuNTc4MTI1IDMyNC4xMDE1NjIgMjI1Ii8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-jupyter-favicon: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUyIiBoZWlnaHQ9IjE2NSIgdmlld0JveD0iMCAwIDE1MiAxNjUiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgPGcgY2xhc3M9ImpwLWp1cHl0ZXItaWNvbi1jb2xvciIgZmlsbD0iI0YzNzcyNiI+CiAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjA3ODk0NywgMTEwLjU4MjkyNykiIGQ9Ik03NS45NDIyODQyLDI5LjU4MDQ1NjEgQzQzLjMwMjM5NDcsMjkuNTgwNDU2MSAxNC43OTY3ODMyLDE3LjY1MzQ2MzQgMCwwIEM1LjUxMDgzMjExLDE1Ljg0MDY4MjkgMTUuNzgxNTM4OSwyOS41NjY3NzMyIDI5LjM5MDQ5NDcsMzkuMjc4NDE3MSBDNDIuOTk5Nyw0OC45ODk4NTM3IDU5LjI3MzcsNTQuMjA2NzgwNSA3NS45NjA1Nzg5LDU0LjIwNjc4MDUgQzkyLjY0NzQ1NzksNTQuMjA2NzgwNSAxMDguOTIxNDU4LDQ4Ljk4OTg1MzcgMTIyLjUzMDY2MywzOS4yNzg0MTcxIEMxMzYuMTM5NDUzLDI5LjU2Njc3MzIgMTQ2LjQxMDI4NCwxNS44NDA2ODI5IDE1MS45MjExNTgsMCBDMTM3LjA4Nzg2OCwxNy42NTM0NjM0IDEwOC41ODI1ODksMjkuNTgwNDU2MSA3NS45NDIyODQyLDI5LjU4MDQ1NjEgTDc1Ljk0MjI4NDIsMjkuNTgwNDU2MSBaIiAvPgogICAgPHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4wMzczNjgsIDAuNzA0ODc4KSIgZD0iTTc1Ljk3ODQ1NzksMjQuNjI2NDA3MyBDMTA4LjYxODc2MywyNC42MjY0MDczIDEzNy4xMjQ0NTgsMzYuNTUzNDQxNSAxNTEuOTIxMTU4LDU0LjIwNjc4MDUgQzE0Ni40MTAyODQsMzguMzY2MjIyIDEzNi4xMzk0NTMsMjQuNjQwMTMxNyAxMjIuNTMwNjYzLDE0LjkyODQ4NzggQzEwOC45MjE0NTgsNS4yMTY4NDM5IDkyLjY0NzQ1NzksMCA3NS45NjA1Nzg5LDAgQzU5LjI3MzcsMCA0Mi45OTk3LDUuMjE2ODQzOSAyOS4zOTA0OTQ3LDE0LjkyODQ4NzggQzE1Ljc4MTUzODksMjQuNjQwMTMxNyA1LjUxMDgzMjExLDM4LjM2NjIyMiAwLDU0LjIwNjc4MDUgQzE0LjgzMzA4MTYsMzYuNTg5OTI5MyA0My4zMzg1Njg0LDI0LjYyNjQwNzMgNzUuOTc4NDU3OSwyNC42MjY0MDczIEw3NS45Nzg0NTc5LDI0LjYyNjQwNzMgWiIgLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-jupyter: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzkiIGhlaWdodD0iNTEiIHZpZXdCb3g9IjAgMCAzOSA1MSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTYzOCAtMjI4MSkiPgogICAgIDxnIGNsYXNzPSJqcC1qdXB5dGVyLWljb24tY29sb3IiIGZpbGw9IiNGMzc3MjYiPgogICAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjM5Ljc0IDIzMTEuOTgpIiBkPSJNIDE4LjI2NDYgNy4xMzQxMUMgMTAuNDE0NSA3LjEzNDExIDMuNTU4NzIgNC4yNTc2IDAgMEMgMS4zMjUzOSAzLjgyMDQgMy43OTU1NiA3LjEzMDgxIDcuMDY4NiA5LjQ3MzAzQyAxMC4zNDE3IDExLjgxNTIgMTQuMjU1NyAxMy4wNzM0IDE4LjI2OSAxMy4wNzM0QyAyMi4yODIzIDEzLjA3MzQgMjYuMTk2MyAxMS44MTUyIDI5LjQ2OTQgOS40NzMwM0MgMzIuNzQyNCA3LjEzMDgxIDM1LjIxMjYgMy44MjA0IDM2LjUzOCAwQyAzMi45NzA1IDQuMjU3NiAyNi4xMTQ4IDcuMTM0MTEgMTguMjY0NiA3LjEzNDExWiIvPgogICAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjM5LjczIDIyODUuNDgpIiBkPSJNIDE4LjI3MzMgNS45MzkzMUMgMjYuMTIzNSA1LjkzOTMxIDMyLjk3OTMgOC44MTU4MyAzNi41MzggMTMuMDczNEMgMzUuMjEyNiA5LjI1MzAzIDMyLjc0MjQgNS45NDI2MiAyOS40Njk0IDMuNjAwNEMgMjYuMTk2MyAxLjI1ODE4IDIyLjI4MjMgMCAxOC4yNjkgMEMgMTQuMjU1NyAwIDEwLjM0MTcgMS4yNTgxOCA3LjA2ODYgMy42MDA0QyAzLjc5NTU2IDUuOTQyNjIgMS4zMjUzOSA5LjI1MzAzIDAgMTMuMDczNEMgMy41Njc0NSA4LjgyNDYzIDEwLjQyMzIgNS45MzkzMSAxOC4yNzMzIDUuOTM5MzFaIi8+CiAgICA8L2c+CiAgICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjY5LjMgMjI4MS4zMSkiIGQ9Ik0gNS44OTM1MyAyLjg0NEMgNS45MTg4OSAzLjQzMTY1IDUuNzcwODUgNC4wMTM2NyA1LjQ2ODE1IDQuNTE2NDVDIDUuMTY1NDUgNS4wMTkyMiA0LjcyMTY4IDUuNDIwMTUgNC4xOTI5OSA1LjY2ODUxQyAzLjY2NDMgNS45MTY4OCAzLjA3NDQ0IDYuMDAxNTEgMi40OTgwNSA1LjkxMTcxQyAxLjkyMTY2IDUuODIxOSAxLjM4NDYzIDUuNTYxNyAwLjk1NDg5OCA1LjE2NDAxQyAwLjUyNTE3IDQuNzY2MzMgMC4yMjIwNTYgNC4yNDkwMyAwLjA4MzkwMzcgMy42Nzc1N0MgLTAuMDU0MjQ4MyAzLjEwNjExIC0wLjAyMTIzIDIuNTA2MTcgMC4xNzg3ODEgMS45NTM2NEMgMC4zNzg3OTMgMS40MDExIDAuNzM2ODA5IDAuOTIwODE3IDEuMjA3NTQgMC41NzM1MzhDIDEuNjc4MjYgMC4yMjYyNTkgMi4yNDA1NSAwLjAyNzU5MTkgMi44MjMyNiAwLjAwMjY3MjI5QyAzLjYwMzg5IC0wLjAzMDcxMTUgNC4zNjU3MyAwLjI0OTc4OSA0Ljk0MTQyIDAuNzgyNTUxQyA1LjUxNzExIDEuMzE1MzEgNS44NTk1NiAyLjA1Njc2IDUuODkzNTMgMi44NDRaIi8+CiAgICAgIDxwYXRoIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2MzkuOCAyMzIzLjgxKSIgZD0iTSA3LjQyNzg5IDMuNTgzMzhDIDcuNDYwMDggNC4zMjQzIDcuMjczNTUgNS4wNTgxOSA2Ljg5MTkzIDUuNjkyMTNDIDYuNTEwMzEgNi4zMjYwNyA1Ljk1MDc1IDYuODMxNTYgNS4yODQxMSA3LjE0NDZDIDQuNjE3NDcgNy40NTc2MyAzLjg3MzcxIDcuNTY0MTQgMy4xNDcwMiA3LjQ1MDYzQyAyLjQyMDMyIDcuMzM3MTIgMS43NDMzNiA3LjAwODcgMS4yMDE4NCA2LjUwNjk1QyAwLjY2MDMyOCA2LjAwNTIgMC4yNzg2MSA1LjM1MjY4IDAuMTA1MDE3IDQuNjMyMDJDIC0wLjA2ODU3NTcgMy45MTEzNSAtMC4wMjYyMzYxIDMuMTU0OTQgMC4yMjY2NzUgMi40NTg1NkMgMC40Nzk1ODcgMS43NjIxNyAwLjkzMTY5NyAxLjE1NzEzIDEuNTI1NzYgMC43MjAwMzNDIDIuMTE5ODMgMC4yODI5MzUgMi44MjkxNCAwLjAzMzQzOTUgMy41NjM4OSAwLjAwMzEzMzQ0QyA0LjU0NjY3IC0wLjAzNzQwMzMgNS41MDUyOSAwLjMxNjcwNiA2LjIyOTYxIDAuOTg3ODM1QyA2Ljk1MzkzIDEuNjU4OTYgNy4zODQ4NCAyLjU5MjM1IDcuNDI3ODkgMy41ODMzOEwgNy40Mjc4OSAzLjU4MzM4WiIvPgogICAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjM4LjM2IDIyODYuMDYpIiBkPSJNIDIuMjc0NzEgNC4zOTYyOUMgMS44NDM2MyA0LjQxNTA4IDEuNDE2NzEgNC4zMDQ0NSAxLjA0Nzk5IDQuMDc4NDNDIDAuNjc5MjY4IDMuODUyNCAwLjM4NTMyOCAzLjUyMTE0IDAuMjAzMzcxIDMuMTI2NTZDIDAuMDIxNDEzNiAyLjczMTk4IC0wLjA0MDM3OTggMi4yOTE4MyAwLjAyNTgxMTYgMS44NjE4MUMgMC4wOTIwMDMxIDEuNDMxOCAwLjI4MzIwNCAxLjAzMTI2IDAuNTc1MjEzIDAuNzEwODgzQyAwLjg2NzIyMiAwLjM5MDUxIDEuMjQ2OTEgMC4xNjQ3MDggMS42NjYyMiAwLjA2MjA1OTJDIDIuMDg1NTMgLTAuMDQwNTg5NyAyLjUyNTYxIC0wLjAxNTQ3MTQgMi45MzA3NiAwLjEzNDIzNUMgMy4zMzU5MSAwLjI4Mzk0MSAzLjY4NzkyIDAuNTUxNTA1IDMuOTQyMjIgMC45MDMwNkMgNC4xOTY1MiAxLjI1NDYyIDQuMzQxNjkgMS42NzQzNiA0LjM1OTM1IDIuMTA5MTZDIDQuMzgyOTkgMi42OTEwNyA0LjE3Njc4IDMuMjU4NjkgMy43ODU5NyAzLjY4NzQ2QyAzLjM5NTE2IDQuMTE2MjQgMi44NTE2NiA0LjM3MTE2IDIuMjc0NzEgNC4zOTYyOUwgMi4yNzQ3MSA0LjM5NjI5WiIvPgogICAgPC9nPgogIDwvZz4+Cjwvc3ZnPgo=); + --jp-icon-jupyterlab-wordmark: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMDAiIHZpZXdCb3g9IjAgMCAxODYwLjggNDc1Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjIiIGZpbGw9IiM0RTRFNEUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ4MC4xMzY0MDEsIDY0LjI3MTQ5MykiPgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4wMDAwMDAsIDU4Ljg3NTU2NikiPgogICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjA4NzYwMywgMC4xNDAyOTQpIj4KICAgICAgICA8cGF0aCBkPSJNLTQyNi45LDE2OS44YzAsNDguNy0zLjcsNjQuNy0xMy42LDc2LjRjLTEwLjgsMTAtMjUsMTUuNS0zOS43LDE1LjVsMy43LDI5IGMyMi44LDAuMyw0NC44LTcuOSw2MS45LTIzLjFjMTcuOC0xOC41LDI0LTQ0LjEsMjQtODMuM1YwSC00Mjd2MTcwLjFMLTQyNi45LDE2OS44TC00MjYuOSwxNjkuOHoiLz4KICAgICAgPC9nPgogICAgPC9nPgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTU1LjA0NTI5NiwgNTYuODM3MTA0KSI+CiAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuNTYyNDUzLCAxLjc5OTg0MikiPgogICAgICAgIDxwYXRoIGQ9Ik0tMzEyLDE0OGMwLDIxLDAsMzkuNSwxLjcsNTUuNGgtMzEuOGwtMi4xLTMzLjNoLTAuOGMtNi43LDExLjYtMTYuNCwyMS4zLTI4LDI3LjkgYy0xMS42LDYuNi0yNC44LDEwLTM4LjIsOS44Yy0zMS40LDAtNjktMTcuNy02OS04OVYwaDM2LjR2MTEyLjdjMCwzOC43LDExLjYsNjQuNyw0NC42LDY0LjdjMTAuMy0wLjIsMjAuNC0zLjUsMjguOS05LjQgYzguNS01LjksMTUuMS0xNC4zLDE4LjktMjMuOWMyLjItNi4xLDMuMy0xMi41LDMuMy0xOC45VjAuMmgzNi40VjE0OEgtMzEyTC0zMTIsMTQ4eiIvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzOTAuMDEzMzIyLCA1My40Nzk2MzgpIj4KICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMS43MDY0NTgsIDAuMjMxNDI1KSI+CiAgICAgICAgPHBhdGggZD0iTS00NzguNiw3MS40YzAtMjYtMC44LTQ3LTEuNy02Ni43aDMyLjdsMS43LDM0LjhoMC44YzcuMS0xMi41LDE3LjUtMjIuOCwzMC4xLTI5LjcgYzEyLjUtNywyNi43LTEwLjMsNDEtOS44YzQ4LjMsMCw4NC43LDQxLjcsODQuNywxMDMuM2MwLDczLjEtNDMuNywxMDkuMi05MSwxMDkuMmMtMTIuMSwwLjUtMjQuMi0yLjItMzUtNy44IGMtMTAuOC01LjYtMTkuOS0xMy45LTI2LjYtMjQuMmgtMC44VjI5MWgtMzZ2LTIyMEwtNDc4LjYsNzEuNEwtNDc4LjYsNzEuNHogTS00NDIuNiwxMjUuNmMwLjEsNS4xLDAuNiwxMC4xLDEuNywxNS4xIGMzLDEyLjMsOS45LDIzLjMsMTkuOCwzMS4xYzkuOSw3LjgsMjIuMSwxMi4xLDM0LjcsMTIuMWMzOC41LDAsNjAuNy0zMS45LDYwLjctNzguNWMwLTQwLjctMjEuMS03NS42LTU5LjUtNzUuNiBjLTEyLjksMC40LTI1LjMsNS4xLTM1LjMsMTMuNGMtOS45LDguMy0xNi45LDE5LjctMTkuNiwzMi40Yy0xLjUsNC45LTIuMywxMC0yLjUsMTUuMVYxMjUuNkwtNDQyLjYsMTI1LjZMLTQ0Mi42LDEyNS42eiIvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg2MDYuNzQwNzI2LCA1Ni44MzcxMDQpIj4KICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC43NTEyMjYsIDEuOTg5Mjk5KSI+CiAgICAgICAgPHBhdGggZD0iTS00NDAuOCwwbDQzLjcsMTIwLjFjNC41LDEzLjQsOS41LDI5LjQsMTIuOCw0MS43aDAuOGMzLjctMTIuMiw3LjktMjcuNywxMi44LTQyLjQgbDM5LjctMTE5LjJoMzguNUwtMzQ2LjksMTQ1Yy0yNiw2OS43LTQzLjcsMTA1LjQtNjguNiwxMjcuMmMtMTIuNSwxMS43LTI3LjksMjAtNDQuNiwyMy45bC05LjEtMzEuMSBjMTEuNy0zLjksMjIuNS0xMC4xLDMxLjgtMTguMWMxMy4yLTExLjEsMjMuNy0yNS4yLDMwLjYtNDEuMmMxLjUtMi44LDIuNS01LjcsMi45LTguOGMtMC4zLTMuMy0xLjItNi42LTIuNS05LjdMLTQ4MC4yLDAuMSBoMzkuN0wtNDQwLjgsMEwtNDQwLjgsMHoiLz4KICAgICAgPC9nPgogICAgPC9nPgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoODIyLjc0ODEwNCwgMC4wMDAwMDApIj4KICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMS40NjQwNTAsIDAuMzc4OTE0KSI+CiAgICAgICAgPHBhdGggZD0iTS00MTMuNywwdjU4LjNoNTJ2MjguMmgtNTJWMTk2YzAsMjUsNywzOS41LDI3LjMsMzkuNWM3LjEsMC4xLDE0LjItMC43LDIxLjEtMi41IGwxLjcsMjcuN2MtMTAuMywzLjctMjEuMyw1LjQtMzIuMiw1Yy03LjMsMC40LTE0LjYtMC43LTIxLjMtMy40Yy02LjgtMi43LTEyLjktNi44LTE3LjktMTIuMWMtMTAuMy0xMC45LTE0LjEtMjktMTQuMS01Mi45IFY4Ni41aC0zMVY1OC4zaDMxVjkuNkwtNDEzLjcsMEwtNDEzLjcsMHoiLz4KICAgICAgPC9nPgogICAgPC9nPgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOTc0LjQzMzI4NiwgNTMuNDc5NjM4KSI+CiAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAuOTkwMDM0LCAwLjYxMDMzOSkiPgogICAgICAgIDxwYXRoIGQ9Ik0tNDQ1LjgsMTEzYzAuOCw1MCwzMi4yLDcwLjYsNjguNiw3MC42YzE5LDAuNiwzNy45LTMsNTUuMy0xMC41bDYuMiwyNi40IGMtMjAuOSw4LjktNDMuNSwxMy4xLTY2LjIsMTIuNmMtNjEuNSwwLTk4LjMtNDEuMi05OC4zLTEwMi41Qy00ODAuMiw0OC4yLTQ0NC43LDAtMzg2LjUsMGM2NS4yLDAsODIuNyw1OC4zLDgyLjcsOTUuNyBjLTAuMSw1LjgtMC41LDExLjUtMS4yLDE3LjJoLTE0MC42SC00NDUuOEwtNDQ1LjgsMTEzeiBNLTMzOS4yLDg2LjZjMC40LTIzLjUtOS41LTYwLjEtNTAuNC02MC4xIGMtMzYuOCwwLTUyLjgsMzQuNC01NS43LDYwLjFILTMzOS4yTC0zMzkuMiw4Ni42TC0zMzkuMiw4Ni42eiIvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMjAxLjk2MTA1OCwgNTMuNDc5NjM4KSI+CiAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuMTc5NjQwLCAwLjcwNTA2OCkiPgogICAgICAgIDxwYXRoIGQ9Ik0tNDc4LjYsNjhjMC0yMy45LTAuNC00NC41LTEuNy02My40aDMxLjhsMS4yLDM5LjloMS43YzkuMS0yNy4zLDMxLTQ0LjUsNTUuMy00NC41IGMzLjUtMC4xLDcsMC40LDEwLjMsMS4ydjM0LjhjLTQuMS0wLjktOC4yLTEuMy0xMi40LTEuMmMtMjUuNiwwLTQzLjcsMTkuNy00OC43LDQ3LjRjLTEsNS43LTEuNiwxMS41LTEuNywxNy4ydjEwOC4zaC0zNlY2OCBMLTQ3OC42LDY4eiIvPgogICAgICA8L2c+CiAgICA8L2c+CiAgPC9nPgoKICA8ZyBjbGFzcz0ianAtaWNvbi13YXJuMCIgZmlsbD0iI0YzNzcyNiI+CiAgICA8cGF0aCBkPSJNMTM1Mi4zLDMyNi4yaDM3VjI4aC0zN1YzMjYuMnogTTE2MDQuOCwzMjYuMmMtMi41LTEzLjktMy40LTMxLjEtMy40LTQ4Ljd2LTc2IGMwLTQwLjctMTUuMS04My4xLTc3LjMtODMuMWMtMjUuNiwwLTUwLDcuMS02Ni44LDE4LjFsOC40LDI0LjRjMTQuMy05LjIsMzQtMTUuMSw1My0xNS4xYzQxLjYsMCw0Ni4yLDMwLjIsNDYuMiw0N3Y0LjIgYy03OC42LTAuNC0xMjIuMywyNi41LTEyMi4zLDc1LjZjMCwyOS40LDIxLDU4LjQsNjIuMiw1OC40YzI5LDAsNTAuOS0xNC4zLDYyLjItMzAuMmgxLjNsMi45LDI1LjZIMTYwNC44eiBNMTU2NS43LDI1Ny43IGMwLDMuOC0wLjgsOC0yLjEsMTEuOGMtNS45LDE3LjItMjIuNywzNC00OS4yLDM0Yy0xOC45LDAtMzQuOS0xMS4zLTM0LjktMzUuM2MwLTM5LjUsNDUuOC00Ni42LDg2LjItNDUuOFYyNTcuN3ogTTE2OTguNSwzMjYuMiBsMS43LTMzLjZoMS4zYzE1LjEsMjYuOSwzOC43LDM4LjIsNjguMSwzOC4yYzQ1LjQsMCw5MS4yLTM2LjEsOTEuMi0xMDguOGMwLjQtNjEuNy0zNS4zLTEwMy43LTg1LjctMTAzLjcgYy0zMi44LDAtNTYuMywxNC43LTY5LjMsMzcuNGgtMC44VjI4aC0zNi42djI0NS43YzAsMTguMS0wLjgsMzguNi0xLjcsNTIuNUgxNjk4LjV6IE0xNzA0LjgsMjA4LjJjMC01LjksMS4zLTEwLjksMi4xLTE1LjEgYzcuNi0yOC4xLDMxLjEtNDUuNCw1Ni4zLTQ1LjRjMzkuNSwwLDYwLjUsMzQuOSw2MC41LDc1LjZjMCw0Ni42LTIzLjEsNzguMS02MS44LDc4LjFjLTI2LjksMC00OC4zLTE3LjYtNTUuNS00My4zIGMtMC44LTQuMi0xLjctOC44LTEuNy0xMy40VjIwOC4yeiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-kernel: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxwYXRoIGNsYXNzPSJqcC1pY29uMiIgZmlsbD0iIzYxNjE2MSIgZD0iTTE1IDlIOXY2aDZWOXptLTIgNGgtMnYtMmgydjJ6bTgtMlY5aC0yVjdjMC0xLjEtLjktMi0yLTJoLTJWM2gtMnYyaC0yVjNIOXYySDdjLTEuMSAwLTIgLjktMiAydjJIM3YyaDJ2MkgzdjJoMnYyYzAgMS4xLjkgMiAyIDJoMnYyaDJ2LTJoMnYyaDJ2LTJoMmMxLjEgMCAyLS45IDItMnYtMmgydi0yaC0ydi0yaDJ6bS00IDZIN1Y3aDEwdjEweiIvPgo8L3N2Zz4K); + --jp-icon-keyboard: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMjAgNUg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMTdjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY3YzAtMS4xLS45LTItMi0yem0tOSAzaDJ2MmgtMlY4em0wIDNoMnYyaC0ydi0yek04IDhoMnYySDhWOHptMCAzaDJ2Mkg4di0yem0tMSAySDV2LTJoMnYyem0wLTNINVY4aDJ2MnptOSA3SDh2LTJoOHYyem0wLTRoLTJ2LTJoMnYyem0wLTNoLTJWOGgydjJ6bTMgM2gtMnYtMmgydjJ6bTAtM2gtMlY4aDJ2MnoiLz4KPC9zdmc+Cg==); + --jp-icon-launch: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMzIgMzIiIHdpZHRoPSIzMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxwYXRoIGQ9Ik0yNiwyOEg2YTIuMDAyNywyLjAwMjcsMCwwLDEtMi0yVjZBMi4wMDI3LDIuMDAyNywwLDAsMSw2LDRIMTZWNkg2VjI2SDI2VjE2aDJWMjZBMi4wMDI3LDIuMDAyNywwLDAsMSwyNiwyOFoiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iMjAgMiAyMCA0IDI2LjU4NiA0IDE4IDEyLjU4NiAxOS40MTQgMTQgMjggNS40MTQgMjggMTIgMzAgMTIgMzAgMiAyMCAyIi8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-launcher: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMTkgMTlINVY1aDdWM0g1YTIgMiAwIDAwLTIgMnYxNGEyIDIgMCAwMDIgMmgxNGMxLjEgMCAyLS45IDItMnYtN2gtMnY3ek0xNCAzdjJoMy41OWwtOS44MyA5LjgzIDEuNDEgMS40MUwxOSA2LjQxVjEwaDJWM2gtN3oiLz4KPC9zdmc+Cg==); + --jp-icon-line-form: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxwYXRoIGZpbGw9IndoaXRlIiBkPSJNNS44OCA0LjEyTDEzLjc2IDEybC03Ljg4IDcuODhMOCAyMmwxMC0xMEw4IDJ6Ii8+Cjwvc3ZnPgo=); + --jp-icon-link: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTMuOSAxMmMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMWg0VjdIN2MtMi43NiAwLTUgMi4yNC01IDVzMi4yNCA1IDUgNWg0di0xLjlIN2MtMS43MSAwLTMuMS0xLjM5LTMuMS0zLjF6TTggMTNoOHYtMkg4djJ6bTktNmgtNHYxLjloNGMxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXMtMS4zOSAzLjEtMy4xIDMuMWgtNFYxN2g0YzIuNzYgMCA1LTIuMjQgNS01cy0yLjI0LTUtNS01eiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-list: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxwYXRoIGNsYXNzPSJqcC1pY29uMiBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiM2MTYxNjEiIGQ9Ik0xOSA1djE0SDVWNWgxNG0xLjEtMkgzLjljLS41IDAtLjkuNC0uOS45djE2LjJjMCAuNC40LjkuOS45aDE2LjJjLjQgMCAuOS0uNS45LS45VjMuOWMwLS41LS41LS45LS45LS45ek0xMSA3aDZ2MmgtNlY3em0wIDRoNnYyaC02di0yem0wIDRoNnYyaC02ek03IDdoMnYySDd6bTAgNGgydjJIN3ptMCA0aDJ2Mkg3eiIvPgo8L3N2Zz4K); + --jp-icon-markdown: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1jb250cmFzdDAganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjN0IxRkEyIiBkPSJNNSAxNC45aDEybC02LjEgNnptOS40LTYuOGMwLTEuMy0uMS0yLjktLjEtNC41LS40IDEuNC0uOSAyLjktMS4zIDQuM2wtMS4zIDQuM2gtMkw4LjUgNy45Yy0uNC0xLjMtLjctMi45LTEtNC4zLS4xIDEuNi0uMSAzLjItLjIgNC42TDcgMTIuNEg0LjhsLjctMTFoMy4zTDEwIDVjLjQgMS4yLjcgMi43IDEgMy45LjMtMS4yLjctMi42IDEtMy45bDEuMi0zLjdoMy4zbC42IDExaC0yLjRsLS4zLTQuMnoiLz4KPC9zdmc+Cg==); + --jp-icon-move-down: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggY2xhc3M9ImpwLWljb24zIiBkPSJNMTIuNDcxIDcuNTI4OTlDMTIuNzYzMiA3LjIzNjg0IDEyLjc2MzIgNi43NjMxNiAxMi40NzEgNi40NzEwMVY2LjQ3MTAxQzEyLjE3OSA2LjE3OTA1IDExLjcwNTcgNi4xNzg4NCAxMS40MTM1IDYuNDcwNTRMNy43NSAxMC4xMjc1VjEuNzVDNy43NSAxLjMzNTc5IDcuNDE0MjEgMSA3IDFWMUM2LjU4NTc5IDEgNi4yNSAxLjMzNTc5IDYuMjUgMS43NVYxMC4xMjc1TDIuNTk3MjYgNi40NjgyMkMyLjMwMzM4IDYuMTczODEgMS44MjY0MSA2LjE3MzU5IDEuNTMyMjYgNi40Njc3NFY2LjQ2Nzc0QzEuMjM4MyA2Ljc2MTcgMS4yMzgzIDcuMjM4MyAxLjUzMjI2IDcuNTMyMjZMNi4yOTI4OSAxMi4yOTI5QzYuNjgzNDIgMTIuNjgzNCA3LjMxNjU4IDEyLjY4MzQgNy43MDcxMSAxMi4yOTI5TDEyLjQ3MSA3LjUyODk5WiIgZmlsbD0iIzYxNjE2MSIvPgo8L3N2Zz4K); + --jp-icon-move-up: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggY2xhc3M9ImpwLWljb24zIiBkPSJNMS41Mjg5OSA2LjQ3MTAxQzEuMjM2ODQgNi43NjMxNiAxLjIzNjg0IDcuMjM2ODQgMS41Mjg5OSA3LjUyODk5VjcuNTI4OTlDMS44MjA5NSA3LjgyMDk1IDIuMjk0MjYgNy44MjExNiAyLjU4NjQ5IDcuNTI5NDZMNi4yNSAzLjg3MjVWMTIuMjVDNi4yNSAxMi42NjQyIDYuNTg1NzkgMTMgNyAxM1YxM0M3LjQxNDIxIDEzIDcuNzUgMTIuNjY0MiA3Ljc1IDEyLjI1VjMuODcyNUwxMS40MDI3IDcuNTMxNzhDMTEuNjk2NiA3LjgyNjE5IDEyLjE3MzYgNy44MjY0MSAxMi40Njc3IDcuNTMyMjZWNy41MzIyNkMxMi43NjE3IDcuMjM4MyAxMi43NjE3IDYuNzYxNyAxMi40Njc3IDYuNDY3NzRMNy43MDcxMSAxLjcwNzExQzcuMzE2NTggMS4zMTY1OCA2LjY4MzQyIDEuMzE2NTggNi4yOTI4OSAxLjcwNzExTDEuNTI4OTkgNi40NzEwMVoiIGZpbGw9IiM2MTYxNjEiLz4KPC9zdmc+Cg==); + --jp-icon-new-folder: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTIwIDZoLThsLTItMkg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOGMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6bS0xIDhoLTN2M2gtMnYtM2gtM3YtMmgzVjloMnYzaDN2MnoiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-not-trusted: url(data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI1IDI1Ij4KICAgIDxwYXRoIGNsYXNzPSJqcC1pY29uMiIgc3Ryb2tlPSIjMzMzMzMzIiBzdHJva2Utd2lkdGg9IjIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMgMykiIGQ9Ik0xLjg2MDk0IDExLjQ0MDlDMC44MjY0NDggOC43NzAyNyAwLjg2Mzc3OSA2LjA1NzY0IDEuMjQ5MDcgNC4xOTkzMkMyLjQ4MjA2IDMuOTMzNDcgNC4wODA2OCAzLjQwMzQ3IDUuNjAxMDIgMi44NDQ5QzcuMjM1NDkgMi4yNDQ0IDguODU2NjYgMS41ODE1IDkuOTg3NiAxLjA5NTM5QzExLjA1OTcgMS41ODM0MSAxMi42MDk0IDIuMjQ0NCAxNC4yMTggMi44NDMzOUMxNS43NTAzIDMuNDEzOTQgMTcuMzk5NSAzLjk1MjU4IDE4Ljc1MzkgNC4yMTM4NUMxOS4xMzY0IDYuMDcxNzcgMTkuMTcwOSA4Ljc3NzIyIDE4LjEzOSAxMS40NDA5QzE3LjAzMDMgMTQuMzAzMiAxNC42NjY4IDE3LjE4NDQgOS45OTk5OSAxOC45MzU0QzUuMzMzMTkgMTcuMTg0NCAyLjk2OTY4IDE0LjMwMzIgMS44NjA5NCAxMS40NDA5WiIvPgogICAgPHBhdGggY2xhc3M9ImpwLWljb24yIiBzdHJva2U9IiMzMzMzMzMiIHN0cm9rZS13aWR0aD0iMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOS4zMTU5MiA5LjMyMDMxKSIgZD0iTTcuMzY4NDIgMEwwIDcuMzY0NzkiLz4KICAgIDxwYXRoIGNsYXNzPSJqcC1pY29uMiIgc3Ryb2tlPSIjMzMzMzMzIiBzdHJva2Utd2lkdGg9IjIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDkuMzE1OTIgMTYuNjgzNikgc2NhbGUoMSAtMSkiIGQ9Ik03LjM2ODQyIDBMMCA3LjM2NDc5Ii8+Cjwvc3ZnPgo=); + --jp-icon-notebook: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8ZyBjbGFzcz0ianAtbm90ZWJvb2staWNvbi1jb2xvciBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiNFRjZDMDAiPgogICAgPHBhdGggZD0iTTE4LjcgMy4zdjE1LjRIMy4zVjMuM2gxNS40bTEuNS0xLjVIMS44djE4LjNoMTguM2wuMS0xOC4zeiIvPgogICAgPHBhdGggZD0iTTE2LjUgMTYuNWwtNS40LTQuMy01LjYgNC4zdi0xMWgxMXoiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-numbering: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjIiIGhlaWdodD0iMjIiIHZpZXdCb3g9IjAgMCAyOCAyOCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CgkJPHBhdGggZD0iTTQgMTlINlYxOS41SDVWMjAuNUg2VjIxSDRWMjJIN1YxOEg0VjE5Wk01IDEwSDZWNkg0VjdINVYxMFpNNCAxM0g1LjhMNCAxNS4xVjE2SDdWMTVINS4yTDcgMTIuOVYxMkg0VjEzWk05IDdWOUgyM1Y3SDlaTTkgMjFIMjNWMTlIOVYyMVpNOSAxNUgyM1YxM0g5VjE1WiIvPgoJPC9nPgo8L3N2Zz4K); + --jp-icon-offline-bolt: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTEyIDIuMDJjLTUuNTEgMC05Ljk4IDQuNDctOS45OCA5Ljk4czQuNDcgOS45OCA5Ljk4IDkuOTggOS45OC00LjQ3IDkuOTgtOS45OFMxNy41MSAyLjAyIDEyIDIuMDJ6TTExLjQ4IDIwdi02LjI2SDhMMTMgNHY2LjI2aDMuMzVMMTEuNDggMjB6Ii8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-palette: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTE4IDEzVjIwSDRWNkg5LjAyQzkuMDcgNS4yOSA5LjI0IDQuNjIgOS41IDRINEMyLjkgNCAyIDQuOSAyIDZWMjBDMiAyMS4xIDIuOSAyMiA0IDIySDE4QzE5LjEgMjIgMjAgMjEuMSAyMCAyMFYxNUwxOCAxM1pNMTkuMyA4Ljg5QzE5Ljc0IDguMTkgMjAgNy4zOCAyMCA2LjVDMjAgNC4wMSAxNy45OSAyIDE1LjUgMkMxMy4wMSAyIDExIDQuMDEgMTEgNi41QzExIDguOTkgMTMuMDEgMTEgMTUuNDkgMTFDMTYuMzcgMTEgMTcuMTkgMTAuNzQgMTcuODggMTAuM0wyMSAxMy40MkwyMi40MiAxMkwxOS4zIDguODlaTTE1LjUgOUMxNC4xMiA5IDEzIDcuODggMTMgNi41QzEzIDUuMTIgMTQuMTIgNCAxNS41IDRDMTYuODggNCAxOCA1LjEyIDE4IDYuNUMxOCA3Ljg4IDE2Ljg4IDkgMTUuNSA5WiIvPgogICAgPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00IDZIOS4wMTg5NEM5LjAwNjM5IDYuMTY1MDIgOSA2LjMzMTc2IDkgNi41QzkgOC44MTU3NyAxMC4yMTEgMTAuODQ4NyAxMi4wMzQzIDEySDlWMTRIMTZWMTIuOTgxMUMxNi41NzAzIDEyLjkzNzcgMTcuMTIgMTIuODIwNyAxNy42Mzk2IDEyLjYzOTZMMTggMTNWMjBINFY2Wk04IDhINlYxMEg4VjhaTTYgMTJIOFYxNEg2VjEyWk04IDE2SDZWMThIOFYxNlpNOSAxNkgxNlYxOEg5VjE2WiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-paste: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTE5IDJoLTQuMThDMTQuNC44NCAxMy4zIDAgMTIgMGMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS03IDBjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptNyAxOEg1VjRoMnYzaDEwVjRoMnYxNnoiLz4KICAgIDwvZz4KPC9zdmc+Cg==); + --jp-icon-pdf: url(data:image/svg+xml;base64,PHN2ZwogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMiAyMiIgd2lkdGg9IjE2Ij4KICAgIDxwYXRoIHRyYW5zZm9ybT0icm90YXRlKDQ1KSIgY2xhc3M9ImpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iI0ZGMkEyQSIKICAgICAgIGQ9Im0gMjIuMzQ0MzY5LC0zLjAxNjM2NDIgaCA1LjYzODYwNCB2IDEuNTc5MjQzMyBoIC0zLjU0OTIyNyB2IDEuNTA4NjkyOTkgaCAzLjMzNzU3NiBWIDEuNjUwODE1NCBoIC0zLjMzNzU3NiB2IDMuNDM1MjYxMyBoIC0yLjA4OTM3NyB6IG0gLTcuMTM2NDQ0LDEuNTc5MjQzMyB2IDQuOTQzOTU0MyBoIDAuNzQ4OTIgcSAxLjI4MDc2MSwwIDEuOTUzNzAzLC0wLjYzNDk1MzUgMC42NzgzNjksLTAuNjM0OTUzNSAwLjY3ODM2OSwtMS44NDUxNjQxIDAsLTEuMjA0NzgzNTUgLTAuNjcyOTQyLC0xLjgzNDMxMDExIC0wLjY3Mjk0MiwtMC42Mjk1MjY1OSAtMS45NTkxMywtMC42Mjk1MjY1OSB6IG0gLTIuMDg5Mzc3LC0xLjU3OTI0MzMgaCAyLjIwMzM0MyBxIDEuODQ1MTY0LDAgMi43NDYwMzksMC4yNjU5MjA3IDAuOTA2MzAxLDAuMjYwNDkzNyAxLjU1MjEwOCwwLjg5MDAyMDMgMC41Njk4MywwLjU0ODEyMjMgMC44NDY2MDUsMS4yNjQ0ODAwNiAwLjI3Njc3NCwwLjcxNjM1NzgxIDAuMjc2Nzc0LDEuNjIyNjU4OTQgMCwwLjkxNzE1NTEgLTAuMjc2Nzc0LDEuNjM4OTM5OSAtMC4yNzY3NzUsMC43MTYzNTc4IC0wLjg0NjYwNSwxLjI2NDQ4IC0wLjY1MTIzNCwwLjYyOTUyNjYgLTEuNTYyOTYyLDAuODk1NDQ3MyAtMC45MTE3MjgsMC4yNjA0OTM3IC0yLjczNTE4NSwwLjI2MDQ5MzcgaCAtMi4yMDMzNDMgeiBtIC04LjE0NTg1NjUsMCBoIDMuNDY3ODIzIHEgMS41NDY2ODE2LDAgMi4zNzE1Nzg1LDAuNjg5MjIzIDAuODMwMzI0LDAuNjgzNzk2MSAwLjgzMDMyNCwxLjk1MzcwMzE0IDAsMS4yNzUzMzM5NyAtMC44MzAzMjQsMS45NjQ1NTcwNiBRIDkuOTg3MTk2MSwyLjI3NDkxNSA4LjQ0MDUxNDUsMi4yNzQ5MTUgSCA3LjA2MjA2ODQgViA1LjA4NjA3NjcgSCA0Ljk3MjY5MTUgWiBtIDIuMDg5Mzc2OSwxLjUxNDExOTkgdiAyLjI2MzAzOTQzIGggMS4xNTU5NDEgcSAwLjYwNzgxODgsMCAwLjkzODg2MjksLTAuMjkzMDU1NDcgMC4zMzEwNDQxLC0wLjI5ODQ4MjQxIDAuMzMxMDQ0MSwtMC44NDExNzc3MiAwLC0wLjU0MjY5NTMxIC0wLjMzMTA0NDEsLTAuODM1NzUwNzQgLTAuMzMxMDQ0MSwtMC4yOTMwNTU1IC0wLjkzODg2MjksLTAuMjkzMDU1NSB6IgovPgo8L3N2Zz4K); + --jp-icon-python: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iLTEwIC0xMCAxMzEuMTYxMzYxNjk0MzM1OTQgMTMyLjM4ODk5OTkzODk2NDg0Ij4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjMzA2OTk4IiBkPSJNIDU0LjkxODc4NSw5LjE5Mjc0MjFlLTQgQyA1MC4zMzUxMzIsMC4wMjIyMTcyNyA0NS45NTc4NDYsMC40MTMxMzY5NyA0Mi4xMDYyODUsMS4wOTQ2NjkzIDMwLjc2MDA2OSwzLjA5OTE3MzEgMjguNzAwMDM2LDcuMjk0NzcxNCAyOC43MDAwMzUsMTUuMDMyMTY5IHYgMTAuMjE4NzUgaCAyNi44MTI1IHYgMy40MDYyNSBoIC0yNi44MTI1IC0xMC4wNjI1IGMgLTcuNzkyNDU5LDAgLTE0LjYxNTc1ODgsNC42ODM3MTcgLTE2Ljc0OTk5OTgsMTMuNTkzNzUgLTIuNDYxODE5OTgsMTAuMjEyOTY2IC0yLjU3MTAxNTA4LDE2LjU4NjAyMyAwLDI3LjI1IDEuOTA1OTI4Myw3LjkzNzg1MiA2LjQ1NzU0MzIsMTMuNTkzNzQ4IDE0LjI0OTk5OTgsMTMuNTkzNzUgaCA5LjIxODc1IHYgLTEyLjI1IGMgMCwtOC44NDk5MDIgNy42NTcxNDQsLTE2LjY1NjI0OCAxNi43NSwtMTYuNjU2MjUgaCAyNi43ODEyNSBjIDcuNDU0OTUxLDAgMTMuNDA2MjUzLC02LjEzODE2NCAxMy40MDYyNSwtMTMuNjI1IHYgLTI1LjUzMTI1IGMgMCwtNy4yNjYzMzg2IC02LjEyOTk4LC0xMi43MjQ3NzcxIC0xMy40MDYyNSwtMTMuOTM3NDk5NyBDIDY0LjI4MTU0OCwwLjMyNzk0Mzk3IDU5LjUwMjQzOCwtMC4wMjAzNzkwMyA1NC45MTg3ODUsOS4xOTI3NDIxZS00IFogbSAtMTQuNSw4LjIxODc1MDEyNTc5IGMgMi43Njk1NDcsMCA1LjAzMTI1LDIuMjk4NjQ1NiA1LjAzMTI1LDUuMTI0OTk5NiAtMmUtNiwyLjgxNjMzNiAtMi4yNjE3MDMsNS4wOTM3NSAtNS4wMzEyNSw1LjA5Mzc1IC0yLjc3OTQ3NiwtMWUtNiAtNS4wMzEyNSwtMi4yNzc0MTUgLTUuMDMxMjUsLTUuMDkzNzUgLTEwZS03LC0yLjgyNjM1MyAyLjI1MTc3NCwtNS4xMjQ5OTk2IDUuMDMxMjUsLTUuMTI0OTk5NiB6Ii8+CiAgPHBhdGggY2xhc3M9ImpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iI2ZmZDQzYiIgZD0ibSA4NS42Mzc1MzUsMjguNjU3MTY5IHYgMTEuOTA2MjUgYyAwLDkuMjMwNzU1IC03LjgyNTg5NSwxNi45OTk5OTkgLTE2Ljc1LDE3IGggLTI2Ljc4MTI1IGMgLTcuMzM1ODMzLDAgLTEzLjQwNjI0OSw2LjI3ODQ4MyAtMTMuNDA2MjUsMTMuNjI1IHYgMjUuNTMxMjQ3IGMgMCw3LjI2NjM0NCA2LjMxODU4OCwxMS41NDAzMjQgMTMuNDA2MjUsMTMuNjI1MDA0IDguNDg3MzMxLDIuNDk1NjEgMTYuNjI2MjM3LDIuOTQ2NjMgMjYuNzgxMjUsMCA2Ljc1MDE1NSwtMS45NTQzOSAxMy40MDYyNTMsLTUuODg3NjEgMTMuNDA2MjUsLTEzLjYyNTAwNCBWIDg2LjUwMDkxOSBoIC0yNi43ODEyNSB2IC0zLjQwNjI1IGggMjYuNzgxMjUgMTMuNDA2MjU0IGMgNy43OTI0NjEsMCAxMC42OTYyNTEsLTUuNDM1NDA4IDEzLjQwNjI0MSwtMTMuNTkzNzUgMi43OTkzMywtOC4zOTg4ODYgMi42ODAyMiwtMTYuNDc1Nzc2IDAsLTI3LjI1IC0xLjkyNTc4LC03Ljc1NzQ0MSAtNS42MDM4NywtMTMuNTkzNzUgLTEzLjQwNjI0MSwtMTMuNTkzNzUgeiBtIC0xNS4wNjI1LDY0LjY1NjI1IGMgMi43Nzk0NzgsM2UtNiA1LjAzMTI1LDIuMjc3NDE3IDUuMDMxMjUsNS4wOTM3NDcgLTJlLTYsMi44MjYzNTQgLTIuMjUxNzc1LDUuMTI1MDA0IC01LjAzMTI1LDUuMTI1MDA0IC0yLjc2OTU1LDAgLTUuMDMxMjUsLTIuMjk4NjUgLTUuMDMxMjUsLTUuMTI1MDA0IDJlLTYsLTIuODE2MzMgMi4yNjE2OTcsLTUuMDkzNzQ3IDUuMDMxMjUsLTUuMDkzNzQ3IHoiLz4KPC9zdmc+Cg==); + --jp-icon-r-kernel: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1jb250cmFzdDMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjMjE5NkYzIiBkPSJNNC40IDIuNWMxLjItLjEgMi45LS4zIDQuOS0uMyAyLjUgMCA0LjEuNCA1LjIgMS4zIDEgLjcgMS41IDEuOSAxLjUgMy41IDAgMi0xLjQgMy41LTIuOSA0LjEgMS4yLjQgMS43IDEuNiAyLjIgMyAuNiAxLjkgMSAzLjkgMS4zIDQuNmgtMy44Yy0uMy0uNC0uOC0xLjctMS4yLTMuN3MtMS4yLTIuNi0yLjYtMi42aC0uOXY2LjRINC40VjIuNXptMy43IDYuOWgxLjRjMS45IDAgMi45LS45IDIuOS0yLjNzLTEtMi4zLTIuOC0yLjNjLS43IDAtMS4zIDAtMS42LjJ2NC41aC4xdi0uMXoiLz4KPC9zdmc+Cg==); + --jp-icon-react: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMTUwIDE1MCA1NDEuOSAyOTUuMyI+CiAgPGcgY2xhc3M9ImpwLWljb24tYnJhbmQyIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iIzYxREFGQiI+CiAgICA8cGF0aCBkPSJNNjY2LjMgMjk2LjVjMC0zMi41LTQwLjctNjMuMy0xMDMuMS04Mi40IDE0LjQtNjMuNiA4LTExNC4yLTIwLjItMTMwLjQtNi41LTMuOC0xNC4xLTUuNi0yMi40LTUuNnYyMi4zYzQuNiAwIDguMy45IDExLjQgMi42IDEzLjYgNy44IDE5LjUgMzcuNSAxNC45IDc1LjctMS4xIDkuNC0yLjkgMTkuMy01LjEgMjkuNC0xOS42LTQuOC00MS04LjUtNjMuNS0xMC45LTEzLjUtMTguNS0yNy41LTM1LjMtNDEuNi01MCAzMi42LTMwLjMgNjMuMi00Ni45IDg0LTQ2LjlWNzhjLTI3LjUgMC02My41IDE5LjYtOTkuOSA1My42LTM2LjQtMzMuOC03Mi40LTUzLjItOTkuOS01My4ydjIyLjNjMjAuNyAwIDUxLjQgMTYuNSA4NCA0Ni42LTE0IDE0LjctMjggMzEuNC00MS4zIDQ5LjktMjIuNiAyLjQtNDQgNi4xLTYzLjYgMTEtMi4zLTEwLTQtMTkuNy01LjItMjktNC43LTM4LjIgMS4xLTY3LjkgMTQuNi03NS44IDMtMS44IDYuOS0yLjYgMTEuNS0yLjZWNzguNWMtOC40IDAtMTYgMS44LTIyLjYgNS42LTI4LjEgMTYuMi0zNC40IDY2LjctMTkuOSAxMzAuMS02Mi4yIDE5LjItMTAyLjcgNDkuOS0xMDIuNyA4Mi4zIDAgMzIuNSA0MC43IDYzLjMgMTAzLjEgODIuNC0xNC40IDYzLjYtOCAxMTQuMiAyMC4yIDEzMC40IDYuNSAzLjggMTQuMSA1LjYgMjIuNSA1LjYgMjcuNSAwIDYzLjUtMTkuNiA5OS45LTUzLjYgMzYuNCAzMy44IDcyLjQgNTMuMiA5OS45IDUzLjIgOC40IDAgMTYtMS44IDIyLjYtNS42IDI4LjEtMTYuMiAzNC40LTY2LjcgMTkuOS0xMzAuMSA2Mi0xOS4xIDEwMi41LTQ5LjkgMTAyLjUtODIuM3ptLTEzMC4yLTY2LjdjLTMuNyAxMi45LTguMyAyNi4yLTEzLjUgMzkuNS00LjEtOC04LjQtMTYtMTMuMS0yNC00LjYtOC05LjUtMTUuOC0xNC40LTIzLjQgMTQuMiAyLjEgMjcuOSA0LjcgNDEgNy45em0tNDUuOCAxMDYuNWMtNy44IDEzLjUtMTUuOCAyNi4zLTI0LjEgMzguMi0xNC45IDEuMy0zMCAyLTQ1LjIgMi0xNS4xIDAtMzAuMi0uNy00NS0xLjktOC4zLTExLjktMTYuNC0yNC42LTI0LjItMzgtNy42LTEzLjEtMTQuNS0yNi40LTIwLjgtMzkuOCA2LjItMTMuNCAxMy4yLTI2LjggMjAuNy0zOS45IDcuOC0xMy41IDE1LjgtMjYuMyAyNC4xLTM4LjIgMTQuOS0xLjMgMzAtMiA0NS4yLTIgMTUuMSAwIDMwLjIuNyA0NSAxLjkgOC4zIDExLjkgMTYuNCAyNC42IDI0LjIgMzggNy42IDEzLjEgMTQuNSAyNi40IDIwLjggMzkuOC02LjMgMTMuNC0xMy4yIDI2LjgtMjAuNyAzOS45em0zMi4zLTEzYzUuNCAxMy40IDEwIDI2LjggMTMuOCAzOS44LTEzLjEgMy4yLTI2LjkgNS45LTQxLjIgOCA0LjktNy43IDkuOC0xNS42IDE0LjQtMjMuNyA0LjYtOCA4LjktMTYuMSAxMy0yNC4xek00MjEuMiA0MzBjLTkuMy05LjYtMTguNi0yMC4zLTI3LjgtMzIgOSAuNCAxOC4yLjcgMjcuNS43IDkuNCAwIDE4LjctLjIgMjcuOC0uNy05IDExLjctMTguMyAyMi40LTI3LjUgMzJ6bS03NC40LTU4LjljLTE0LjItMi4xLTI3LjktNC43LTQxLTcuOSAzLjctMTIuOSA4LjMtMjYuMiAxMy41LTM5LjUgNC4xIDggOC40IDE2IDEzLjEgMjQgNC43IDggOS41IDE1LjggMTQuNCAyMy40ek00MjAuNyAxNjNjOS4zIDkuNiAxOC42IDIwLjMgMjcuOCAzMi05LS40LTE4LjItLjctMjcuNS0uNy05LjQgMC0xOC43LjItMjcuOC43IDktMTEuNyAxOC4zLTIyLjQgMjcuNS0zMnptLTc0IDU4LjljLTQuOSA3LjctOS44IDE1LjYtMTQuNCAyMy43LTQuNiA4LTguOSAxNi0xMyAyNC01LjQtMTMuNC0xMC0yNi44LTEzLjgtMzkuOCAxMy4xLTMuMSAyNi45LTUuOCA0MS4yLTcuOXptLTkwLjUgMTI1LjJjLTM1LjQtMTUuMS01OC4zLTM0LjktNTguMy01MC42IDAtMTUuNyAyMi45LTM1LjYgNTguMy01MC42IDguNi0zLjcgMTgtNyAyNy43LTEwLjEgNS43IDE5LjYgMTMuMiA0MCAyMi41IDYwLjktOS4yIDIwLjgtMTYuNiA0MS4xLTIyLjIgNjAuNi05LjktMy4xLTE5LjMtNi41LTI4LTEwLjJ6TTMxMCA0OTBjLTEzLjYtNy44LTE5LjUtMzcuNS0xNC45LTc1LjcgMS4xLTkuNCAyLjktMTkuMyA1LjEtMjkuNCAxOS42IDQuOCA0MSA4LjUgNjMuNSAxMC45IDEzLjUgMTguNSAyNy41IDM1LjMgNDEuNiA1MC0zMi42IDMwLjMtNjMuMiA0Ni45LTg0IDQ2LjktNC41LS4xLTguMy0xLTExLjMtMi43em0yMzcuMi03Ni4yYzQuNyAzOC4yLTEuMSA2Ny45LTE0LjYgNzUuOC0zIDEuOC02LjkgMi42LTExLjUgMi42LTIwLjcgMC01MS40LTE2LjUtODQtNDYuNiAxNC0xNC43IDI4LTMxLjQgNDEuMy00OS45IDIyLjYtMi40IDQ0LTYuMSA2My42LTExIDIuMyAxMC4xIDQuMSAxOS44IDUuMiAyOS4xem0zOC41LTY2LjdjLTguNiAzLjctMTggNy0yNy43IDEwLjEtNS43LTE5LjYtMTMuMi00MC0yMi41LTYwLjkgOS4yLTIwLjggMTYuNi00MS4xIDIyLjItNjAuNiA5LjkgMy4xIDE5LjMgNi41IDI4LjEgMTAuMiAzNS40IDE1LjEgNTguMyAzNC45IDU4LjMgNTAuNi0uMSAxNS43LTIzIDM1LjYtNTguNCA1MC42ek0zMjAuOCA3OC40eiIvPgogICAgPGNpcmNsZSBjeD0iNDIwLjkiIGN5PSIyOTYuNSIgcj0iNDUuNyIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-redo: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgICA8cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE4LjQgMTAuNkMxNi41NSA4Ljk5IDE0LjE1IDggMTEuNSA4Yy00LjY1IDAtOC41OCAzLjAzLTkuOTYgNy4yMkwzLjkgMTZjMS4wNS0zLjE5IDQuMDUtNS41IDcuNi01LjUgMS45NSAwIDMuNzMuNzIgNS4xMiAxLjg4TDEzIDE2aDlWN2wtMy42IDMuNnoiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-refresh: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTkgMTMuNWMtMi40OSAwLTQuNS0yLjAxLTQuNS00LjVTNi41MSA0LjUgOSA0LjVjMS4yNCAwIDIuMzYuNTIgMy4xNyAxLjMzTDEwIDhoNVYzbC0xLjc2IDEuNzZDMTIuMTUgMy42OCAxMC42NiAzIDkgMyA1LjY5IDMgMy4wMSA1LjY5IDMuMDEgOVM1LjY5IDE1IDkgMTVjMi45NyAwIDUuNDMtMi4xNiA1LjktNWgtMS41MmMtLjQ2IDItMi4yNCAzLjUtNC4zOCAzLjV6Ii8+CiAgICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-regex: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICA8ZyBjbGFzcz0ianAtaWNvbjIiIGZpbGw9IiM0MTQxNDEiPgogICAgPHJlY3QgeD0iMiIgeT0iMiIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ii8+CiAgPC9nPgoKICA8ZyBjbGFzcz0ianAtaWNvbi1hY2NlbnQyIiBmaWxsPSIjRkZGIj4KICAgIDxjaXJjbGUgY2xhc3M9InN0MiIgY3g9IjUuNSIgY3k9IjE0LjUiIHI9IjEuNSIvPgogICAgPHJlY3QgeD0iMTIiIHk9IjQiIGNsYXNzPSJzdDIiIHdpZHRoPSIxIiBoZWlnaHQ9IjgiLz4KICAgIDxyZWN0IHg9IjguNSIgeT0iNy41IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjg2NiAtMC41IDAuNSAwLjg2NiAtMi4zMjU1IDcuMzIxOSkiIGNsYXNzPSJzdDIiIHdpZHRoPSI4IiBoZWlnaHQ9IjEiLz4KICAgIDxyZWN0IHg9IjEyIiB5PSI0IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjUgLTAuODY2IDAuODY2IDAuNSAtMC42Nzc5IDE0LjgyNTIpIiBjbGFzcz0ic3QyIiB3aWR0aD0iMSIgaGVpZ2h0PSI4Ii8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-run: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTggNXYxNGwxMS03eiIvPgogICAgPC9nPgo8L3N2Zz4K); + --jp-icon-running: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDUxMiA1MTIiPgogIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICA8cGF0aCBkPSJNMjU2IDhDMTE5IDggOCAxMTkgOCAyNTZzMTExIDI0OCAyNDggMjQ4IDI0OC0xMTEgMjQ4LTI0OFMzOTMgOCAyNTYgOHptOTYgMzI4YzAgOC44LTcuMiAxNi0xNiAxNkgxNzZjLTguOCAwLTE2LTcuMi0xNi0xNlYxNzZjMC04LjggNy4yLTE2IDE2LTE2aDE2MGM4LjggMCAxNiA3LjIgMTYgMTZ2MTYweiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-save: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTE3IDNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjdsLTQtNHptLTUgMTZjLTEuNjYgMC0zLTEuMzQtMy0zczEuMzQtMyAzLTMgMyAxLjM0IDMgMy0xLjM0IDMtMyAzem0zLTEwSDVWNWgxMHY0eiIvPgogICAgPC9nPgo8L3N2Zz4K); + --jp-icon-search: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTggMTgiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTEyLjEsMTAuOWgtMC43bC0wLjItMC4yYzAuOC0wLjksMS4zLTIuMiwxLjMtMy41YzAtMy0yLjQtNS40LTUuNC01LjRTMS44LDQuMiwxLjgsNy4xczIuNCw1LjQsNS40LDUuNCBjMS4zLDAsMi41LTAuNSwzLjUtMS4zbDAuMiwwLjJ2MC43bDQuMSw0LjFsMS4yLTEuMkwxMi4xLDEwLjl6IE03LjEsMTAuOWMtMi4xLDAtMy43LTEuNy0zLjctMy43czEuNy0zLjcsMy43LTMuN3MzLjcsMS43LDMuNywzLjcgUzkuMiwxMC45LDcuMSwxMC45eiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-settings: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMTkuNDMgMTIuOThjLjA0LS4zMi4wNy0uNjQuMDctLjk4cy0uMDMtLjY2LS4wNy0uOThsMi4xMS0xLjY1Yy4xOS0uMTUuMjQtLjQyLjEyLS42NGwtMi0zLjQ2Yy0uMTItLjIyLS4zOS0uMy0uNjEtLjIybC0yLjQ5IDFjLS41Mi0uNC0xLjA4LS43My0xLjY5LS45OGwtLjM4LTIuNjVBLjQ4OC40ODggMCAwMDE0IDJoLTRjLS4yNSAwLS40Ni4xOC0uNDkuNDJsLS4zOCAyLjY1Yy0uNjEuMjUtMS4xNy41OS0xLjY5Ljk4bC0yLjQ5LTFjLS4yMy0uMDktLjQ5IDAtLjYxLjIybC0yIDMuNDZjLS4xMy4yMi0uMDcuNDkuMTIuNjRsMi4xMSAxLjY1Yy0uMDQuMzItLjA3LjY1LS4wNy45OHMuMDMuNjYuMDcuOThsLTIuMTEgMS42NWMtLjE5LjE1LS4yNC40Mi0uMTIuNjRsMiAzLjQ2Yy4xMi4yMi4zOS4zLjYxLjIybDIuNDktMWMuNTIuNCAxLjA4LjczIDEuNjkuOThsLjM4IDIuNjVjLjAzLjI0LjI0LjQyLjQ5LjQyaDRjLjI1IDAgLjQ2LS4xOC40OS0uNDJsLjM4LTIuNjVjLjYxLS4yNSAxLjE3LS41OSAxLjY5LS45OGwyLjQ5IDFjLjIzLjA5LjQ5IDAgLjYxLS4yMmwyLTMuNDZjLjEyLS4yMi4wNy0uNDktLjEyLS42NGwtMi4xMS0xLjY1ek0xMiAxNS41Yy0xLjkzIDAtMy41LTEuNTctMy41LTMuNXMxLjU3LTMuNSAzLjUtMy41IDMuNSAxLjU3IDMuNSAzLjUtMS41NyAzLjUtMy41IDMuNXoiLz4KPC9zdmc+Cg==); + --jp-icon-share: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTSAxOCAyIEMgMTYuMzU0OTkgMiAxNSAzLjM1NDk5MDQgMTUgNSBDIDE1IDUuMTkwOTUyOSAxNS4wMjE3OTEgNS4zNzcxMjI0IDE1LjA1NjY0MSA1LjU1ODU5MzggTCA3LjkyMTg3NSA5LjcyMDcwMzEgQyA3LjM5ODUzOTkgOS4yNzc4NTM5IDYuNzMyMDc3MSA5IDYgOSBDIDQuMzU0OTkwNCA5IDMgMTAuMzU0OTkgMyAxMiBDIDMgMTMuNjQ1MDEgNC4zNTQ5OTA0IDE1IDYgMTUgQyA2LjczMjA3NzEgMTUgNy4zOTg1Mzk5IDE0LjcyMjE0NiA3LjkyMTg3NSAxNC4yNzkyOTcgTCAxNS4wNTY2NDEgMTguNDM5NDUzIEMgMTUuMDIxNTU1IDE4LjYyMTUxNCAxNSAxOC44MDgzODYgMTUgMTkgQyAxNSAyMC42NDUwMSAxNi4zNTQ5OSAyMiAxOCAyMiBDIDE5LjY0NTAxIDIyIDIxIDIwLjY0NTAxIDIxIDE5IEMgMjEgMTcuMzU0OTkgMTkuNjQ1MDEgMTYgMTggMTYgQyAxNy4yNjc0OCAxNiAxNi42MDE1OTMgMTYuMjc5MzI4IDE2LjA3ODEyNSAxNi43MjI2NTYgTCA4Ljk0MzM1OTQgMTIuNTU4NTk0IEMgOC45NzgyMDk1IDEyLjM3NzEyMiA5IDEyLjE5MDk1MyA5IDEyIEMgOSAxMS44MDkwNDcgOC45NzgyMDk1IDExLjYyMjg3OCA4Ljk0MzM1OTQgMTEuNDQxNDA2IEwgMTYuMDc4MTI1IDcuMjc5Mjk2OSBDIDE2LjYwMTQ2IDcuNzIyMTQ2MSAxNy4yNjc5MjMgOCAxOCA4IEMgMTkuNjQ1MDEgOCAyMSA2LjY0NTAwOTYgMjEgNSBDIDIxIDMuMzU0OTkwNCAxOS42NDUwMSAyIDE4IDIgeiBNIDE4IDQgQyAxOC41NjQxMjkgNCAxOSA0LjQzNTg3MDYgMTkgNSBDIDE5IDUuNTY0MTI5NCAxOC41NjQxMjkgNiAxOCA2IEMgMTcuNDM1ODcxIDYgMTcgNS41NjQxMjk0IDE3IDUgQyAxNyA0LjQzNTg3MDYgMTcuNDM1ODcxIDQgMTggNCB6IE0gNiAxMSBDIDYuNTY0MTI5NCAxMSA3IDExLjQzNTg3MSA3IDEyIEMgNyAxMi41NjQxMjkgNi41NjQxMjk0IDEzIDYgMTMgQyA1LjQzNTg3MDYgMTMgNSAxMi41NjQxMjkgNSAxMiBDIDUgMTEuNDM1ODcxIDUuNDM1ODcwNiAxMSA2IDExIHogTSAxOCAxOCBDIDE4LjU2NDEyOSAxOCAxOSAxOC40MzU4NzEgMTkgMTkgQyAxOSAxOS41NjQxMjkgMTguNTY0MTI5IDIwIDE4IDIwIEMgMTcuNDM1ODcxIDIwIDE3IDE5LjU2NDEyOSAxNyAxOSBDIDE3IDE4LjQzNTg3MSAxNy40MzU4NzEgMTggMTggMTggeiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-spreadsheet: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1jb250cmFzdDEganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNENBRjUwIiBkPSJNMi4yIDIuMnYxNy42aDE3LjZWMi4ySDIuMnptMTUuNCA3LjdoLTUuNVY0LjRoNS41djUuNXpNOS45IDQuNHY1LjVINC40VjQuNGg1LjV6bS01LjUgNy43aDUuNXY1LjVINC40di01LjV6bTcuNyA1LjV2LTUuNWg1LjV2NS41aC01LjV6Ii8+Cjwvc3ZnPgo=); + --jp-icon-stop: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPgogICAgICAgIDxwYXRoIGQ9Ik02IDZoMTJ2MTJINnoiLz4KICAgIDwvZz4KPC9zdmc+Cg==); + --jp-icon-tab: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTIxIDNIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDNWNWgxMHY0aDh2MTB6Ii8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-table-rows: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0yMSw4SDNWNGgxOFY4eiBNMjEsMTBIM3Y0aDE4VjEweiBNMjEsMTZIM3Y0aDE4VjE2eiIvPgogICAgPC9nPgo8L3N2Zz4K); + --jp-icon-tag: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjgiIGhlaWdodD0iMjgiIHZpZXdCb3g9IjAgMCA0MyAyOCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CgkJPHBhdGggZD0iTTI4LjgzMzIgMTIuMzM0TDMyLjk5OTggMTYuNTAwN0wzNy4xNjY1IDEyLjMzNEgyOC44MzMyWiIvPgoJCTxwYXRoIGQ9Ik0xNi4yMDk1IDIxLjYxMDRDMTUuNjg3MyAyMi4xMjk5IDE0Ljg0NDMgMjIuMTI5OSAxNC4zMjQ4IDIxLjYxMDRMNi45ODI5IDE0LjcyNDVDNi41NzI0IDE0LjMzOTQgNi4wODMxMyAxMy42MDk4IDYuMDQ3ODYgMTMuMDQ4MkM1Ljk1MzQ3IDExLjUyODggNi4wMjAwMiA4LjYxOTQ0IDYuMDY2MjEgNy4wNzY5NUM2LjA4MjgxIDYuNTE0NzcgNi41NTU0OCA2LjA0MzQ3IDcuMTE4MDQgNi4wMzA1NUM5LjA4ODYzIDUuOTg0NzMgMTMuMjYzOCA1LjkzNTc5IDEzLjY1MTggNi4zMjQyNUwyMS43MzY5IDEzLjYzOUMyMi4yNTYgMTQuMTU4NSAyMS43ODUxIDE1LjQ3MjQgMjEuMjYyIDE1Ljk5NDZMMTYuMjA5NSAyMS42MTA0Wk05Ljc3NTg1IDguMjY1QzkuMzM1NTEgNy44MjU2NiA4LjYyMzUxIDcuODI1NjYgOC4xODI4IDguMjY1QzcuNzQzNDYgOC43MDU3MSA3Ljc0MzQ2IDkuNDE3MzMgOC4xODI4IDkuODU2NjdDOC42MjM4MiAxMC4yOTY0IDkuMzM1ODIgMTAuMjk2NCA5Ljc3NTg1IDkuODU2NjdDMTAuMjE1NiA5LjQxNzMzIDEwLjIxNTYgOC43MDUzMyA5Ljc3NTg1IDguMjY1WiIvPgoJPC9nPgo8L3N2Zz4K); + --jp-icon-terminal: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0IiA+CiAgICA8cmVjdCBjbGFzcz0ianAtdGVybWluYWwtaWNvbi1iYWNrZ3JvdW5kLWNvbG9yIGpwLWljb24tc2VsZWN0YWJsZSIgd2lkdGg9IjIwIiBoZWlnaHQ9IjIwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyIDIpIiBmaWxsPSIjMzMzMzMzIi8+CiAgICA8cGF0aCBjbGFzcz0ianAtdGVybWluYWwtaWNvbi1jb2xvciBqcC1pY29uLXNlbGVjdGFibGUtaW52ZXJzZSIgZD0iTTUuMDU2NjQgOC43NjE3MkM1LjA1NjY0IDguNTk3NjYgNS4wMzEyNSA4LjQ1MzEyIDQuOTgwNDcgOC4zMjgxMkM0LjkzMzU5IDguMTk5MjIgNC44NTU0NyA4LjA4MjAzIDQuNzQ2MDkgNy45NzY1NkM0LjY0MDYyIDcuODcxMDkgNC41IDcuNzc1MzkgNC4zMjQyMiA3LjY4OTQ1QzQuMTUyMzQgNy41OTk2MSAzLjk0MzM2IDcuNTExNzIgMy42OTcyNyA3LjQyNTc4QzMuMzAyNzMgNy4yODUxNiAyLjk0MzM2IDcuMTM2NzIgMi42MTkxNCA2Ljk4MDQ3QzIuMjk0OTIgNi44MjQyMiAyLjAxNzU4IDYuNjQyNTggMS43ODcxMSA2LjQzNTU1QzEuNTYwNTUgNi4yMjg1MiAxLjM4NDc3IDUuOTg4MjggMS4yNTk3NyA1LjcxNDg0QzEuMTM0NzcgNS40Mzc1IDEuMDcyMjcgNS4xMDkzOCAxLjA3MjI3IDQuNzMwNDdDMS4wNzIyNyA0LjM5ODQ0IDEuMTI4OTEgNC4wOTU3IDEuMjQyMTkgMy44MjIyN0MxLjM1NTQ3IDMuNTQ0OTIgMS41MTU2MiAzLjMwNDY5IDEuNzIyNjYgMy4xMDE1NkMxLjkyOTY5IDIuODk4NDQgMi4xNzk2OSAyLjczNDM3IDIuNDcyNjYgMi42MDkzOEMyLjc2NTYyIDIuNDg0MzggMy4wOTE4IDIuNDA0MyAzLjQ1MTE3IDIuMzY5MTRWMS4xMDkzOEg0LjM4ODY3VjIuMzgwODZDNC43NDAyMyAyLjQyNzczIDUuMDU2NjQgMi41MjM0NCA1LjMzNzg5IDIuNjY3OTdDNS42MTkxNCAyLjgxMjUgNS44NTc0MiAzLjAwMTk1IDYuMDUyNzMgMy4yMzYzM0M2LjI1MTk1IDMuNDY2OCA2LjQwNDMgMy43NDAyMyA2LjUwOTc3IDQuMDU2NjRDNi42MTkxNCA0LjM2OTE0IDYuNjczODMgNC43MjA3IDYuNjczODMgNS4xMTEzM0g1LjA0NDkyQzUuMDQ0OTIgNC42Mzg2NyA0LjkzNzUgNC4yODEyNSA0LjcyMjY2IDQuMDM5MDZDNC41MDc4MSAzLjc5Mjk3IDQuMjE2OCAzLjY2OTkyIDMuODQ5NjEgMy42Njk5MkMzLjY1MDM5IDMuNjY5OTIgMy40NzY1NiAzLjY5NzI3IDMuMzI4MTIgMy43NTE5NUMzLjE4MzU5IDMuODAyNzMgMy4wNjQ0NSAzLjg3Njk1IDIuOTcwNyAzLjk3NDYxQzIuODc2OTUgNC4wNjgzNiAyLjgwNjY0IDQuMTc5NjkgMi43NTk3NyA0LjMwODU5QzIuNzE2OCA0LjQzNzUgMi42OTUzMSA0LjU3ODEyIDIuNjk1MzEgNC43MzA0N0MyLjY5NTMxIDQuODgyODEgMi43MTY4IDUuMDE5NTMgMi43NTk3NyA1LjE0MDYyQzIuODA2NjQgNS4yNTc4MSAyLjg4MjgxIDUuMzY3MTkgMi45ODgyOCA1LjQ2ODc1QzMuMDk3NjYgNS41NzAzMSAzLjI0MDIzIDUuNjY3OTcgMy40MTYwMiA1Ljc2MTcyQzMuNTkxOCA1Ljg1MTU2IDMuODEwNTUgNS45NDMzNiA0LjA3MjI3IDYuMDM3MTFDNC40NjY4IDYuMTg1NTUgNC44MjQyMiA2LjMzOTg0IDUuMTQ0NTMgNi41QzUuNDY0ODQgNi42NTYyNSA1LjczODI4IDYuODM5ODQgNS45NjQ4NCA3LjA1MDc4QzYuMTk1MzEgNy4yNTc4MSA2LjM3MTA5IDcuNSA2LjQ5MjE5IDcuNzc3MzRDNi42MTcxOSA4LjA1MDc4IDYuNjc5NjkgOC4zNzUgNi42Nzk2OSA4Ljc1QzYuNjc5NjkgOS4wOTM3NSA2LjYyMzA1IDkuNDA0MyA2LjUwOTc3IDkuNjgxNjRDNi4zOTY0OCA5Ljk1NTA4IDYuMjM0MzggMTAuMTkxNCA2LjAyMzQ0IDEwLjM5MDZDNS44MTI1IDEwLjU4OTggNS41NTg1OSAxMC43NSA1LjI2MTcyIDEwLjg3MTFDNC45NjQ4NCAxMC45ODgzIDQuNjMyODEgMTEuMDY0NSA0LjI2NTYyIDExLjA5OTZWMTIuMjQ4SDMuMzMzOThWMTEuMDk5NkMzLjAwMTk1IDExLjA2ODQgMi42Nzk2OSAxMC45OTYxIDIuMzY3MTkgMTAuODgyOEMyLjA1NDY5IDEwLjc2NTYgMS43NzczNCAxMC41OTc3IDEuNTM1MTYgMTAuMzc4OUMxLjI5Njg4IDEwLjE2MDIgMS4xMDU0NyA5Ljg4NDc3IDAuOTYwOTM4IDkuNTUyNzNDMC44MTY0MDYgOS4yMTY4IDAuNzQ0MTQxIDguODE0NDUgMC43NDQxNDEgOC4zNDU3SDIuMzc4OTFDMi4zNzg5MSA4LjYyNjk1IDIuNDE5OTIgOC44NjMyOCAyLjUwMTk1IDkuMDU0NjlDMi41ODM5OCA5LjI0MjE5IDIuNjg5NDUgOS4zOTI1OCAyLjgxODM2IDkuNTA1ODZDMi45NTExNyA5LjYxNTIzIDMuMTAxNTYgOS42OTMzNiAzLjI2OTUzIDkuNzQwMjNDMy40Mzc1IDkuNzg3MTEgMy42MDkzOCA5LjgxMDU1IDMuNzg1MTYgOS44MTA1NUM0LjIwMzEyIDkuODEwNTUgNC41MTk1MyA5LjcxMjg5IDQuNzM0MzggOS41MTc1OEM0Ljk0OTIyIDkuMzIyMjcgNS4wNTY2NCA5LjA3MDMxIDUuMDU2NjQgOC43NjE3MlpNMTMuNDE4IDEyLjI3MTVIOC4wNzQyMlYxMUgxMy40MThWMTIuMjcxNVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMuOTUyNjQgNikiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPgo=); + --jp-icon-text-editor: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtdGV4dC1lZGl0b3ItaWNvbi1jb2xvciBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiM2MTYxNjEiIGQ9Ik0xNSAxNUgzdjJoMTJ2LTJ6bTAtOEgzdjJoMTJWN3pNMyAxM2gxOHYtMkgzdjJ6bTAgOGgxOHYtMkgzdjJ6TTMgM3YyaDE4VjNIM3oiLz4KPC9zdmc+Cg==); + --jp-icon-toc: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxwYXRoIGQ9Ik03LDVIMjFWN0g3VjVNNywxM1YxMUgyMVYxM0g3TTQsNC41QTEuNSwxLjUgMCAwLDEgNS41LDZBMS41LDEuNSAwIDAsMSA0LDcuNUExLjUsMS41IDAgMCwxIDIuNSw2QTEuNSwxLjUgMCAwLDEgNCw0LjVNNCwxMC41QTEuNSwxLjUgMCAwLDEgNS41LDEyQTEuNSwxLjUgMCAwLDEgNCwxMy41QTEuNSwxLjUgMCAwLDEgMi41LDEyQTEuNSwxLjUgMCAwLDEgNCwxMC41TTcsMTlWMTdIMjFWMTlIN000LDE2LjVBMS41LDEuNSAwIDAsMSA1LjUsMThBMS41LDEuNSAwIDAsMSA0LDE5LjVBMS41LDEuNSAwIDAsMSAyLjUsMThBMS41LDEuNSAwIDAsMSA0LDE2LjVaIiAvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-tree-view: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0yMiAxMVYzaC03djNIOVYzSDJ2OGg3VjhoMnYxMGg0djNoN3YtOGgtN3YzaC0yVjhoMnYzeiIvPgogICAgPC9nPgo8L3N2Zz4K); + --jp-icon-trusted: url(data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI1Ij4KICAgIDxwYXRoIGNsYXNzPSJqcC1pY29uMiIgc3Ryb2tlPSIjMzMzMzMzIiBzdHJva2Utd2lkdGg9IjIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIgMykiIGQ9Ik0xLjg2MDk0IDExLjQ0MDlDMC44MjY0NDggOC43NzAyNyAwLjg2Mzc3OSA2LjA1NzY0IDEuMjQ5MDcgNC4xOTkzMkMyLjQ4MjA2IDMuOTMzNDcgNC4wODA2OCAzLjQwMzQ3IDUuNjAxMDIgMi44NDQ5QzcuMjM1NDkgMi4yNDQ0IDguODU2NjYgMS41ODE1IDkuOTg3NiAxLjA5NTM5QzExLjA1OTcgMS41ODM0MSAxMi42MDk0IDIuMjQ0NCAxNC4yMTggMi44NDMzOUMxNS43NTAzIDMuNDEzOTQgMTcuMzk5NSAzLjk1MjU4IDE4Ljc1MzkgNC4yMTM4NUMxOS4xMzY0IDYuMDcxNzcgMTkuMTcwOSA4Ljc3NzIyIDE4LjEzOSAxMS40NDA5QzE3LjAzMDMgMTQuMzAzMiAxNC42NjY4IDE3LjE4NDQgOS45OTk5OSAxOC45MzU0QzUuMzMzMiAxNy4xODQ0IDIuOTY5NjggMTQuMzAzMiAxLjg2MDk0IDExLjQ0MDlaIi8+CiAgICA8cGF0aCBjbGFzcz0ianAtaWNvbjIiIGZpbGw9IiMzMzMzMzMiIHN0cm9rZT0iIzMzMzMzMyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOCA5Ljg2NzE5KSIgZD0iTTIuODYwMTUgNC44NjUzNUwwLjcyNjU0OSAyLjk5OTU5TDAgMy42MzA0NUwyLjg2MDE1IDYuMTMxNTdMOCAwLjYzMDg3Mkw3LjI3ODU3IDBMMi44NjAxNSA0Ljg2NTM1WiIvPgo8L3N2Zz4K); + --jp-icon-undo: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTEyLjUgOGMtMi42NSAwLTUuMDUuOTktNi45IDIuNkwyIDd2OWg5bC0zLjYyLTMuNjJjMS4zOS0xLjE2IDMuMTYtMS44OCA1LjEyLTEuODggMy41NCAwIDYuNTUgMi4zMSA3LjYgNS41bDIuMzctLjc4QzIxLjA4IDExLjAzIDE3LjE1IDggMTIuNSA4eiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-user: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTE2IDdhNCA0IDAgMTEtOCAwIDQgNCAwIDAxOCAwek0xMiAxNGE3IDcgMCAwMC03IDdoMTRhNyA3IDAgMDAtNy03eiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-users: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDM2IDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogPGcgY2xhc3M9ImpwLWljb24zIiB0cmFuc2Zvcm09Im1hdHJpeCgxLjczMjcgMCAwIDEuNzMyNyAtMy42MjgyIC4wOTk1NzcpIiBmaWxsPSIjNjE2MTYxIj4KICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCgxLjUsMCwwLDEuNSwwLC02KSIgZD0ibTEyLjE4NiA3LjUwOThjLTEuMDUzNSAwLTEuOTc1NyAwLjU2NjUtMi40Nzg1IDEuNDEwMiAwLjc1MDYxIDAuMzEyNzcgMS4zOTc0IDAuODI2NDggMS44NzMgMS40NzI3aDMuNDg2M2MwLTEuNTkyLTEuMjg4OS0yLjg4MjgtMi44ODA5LTIuODgyOHoiLz4KICA8cGF0aCBkPSJtMjAuNDY1IDIuMzg5NWEyLjE4ODUgMi4xODg1IDAgMCAxLTIuMTg4NCAyLjE4ODUgMi4xODg1IDIuMTg4NSAwIDAgMS0yLjE4ODUtMi4xODg1IDIuMTg4NSAyLjE4ODUgMCAwIDEgMi4xODg1LTIuMTg4NSAyLjE4ODUgMi4xODg1IDAgMCAxIDIuMTg4NCAyLjE4ODV6Ii8+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMS41LDAsMCwxLjUsMCwtNikiIGQ9Im0zLjU4OTggOC40MjE5Yy0xLjExMjYgMC0yLjAxMzcgMC45MDExMS0yLjAxMzcgMi4wMTM3aDIuODE0NWMwLjI2Nzk3LTAuMzczMDkgMC41OTA3LTAuNzA0MzUgMC45NTg5OC0wLjk3ODUyLTAuMzQ0MzMtMC42MTY4OC0xLjAwMzEtMS4wMzUyLTEuNzU5OC0xLjAzNTJ6Ii8+CiAgPHBhdGggZD0ibTYuOTE1NCA0LjYyM2ExLjUyOTQgMS41Mjk0IDAgMCAxLTEuNTI5NCAxLjUyOTQgMS41Mjk0IDEuNTI5NCAwIDAgMS0xLjUyOTQtMS41Mjk0IDEuNTI5NCAxLjUyOTQgMCAwIDEgMS41Mjk0LTEuNTI5NCAxLjUyOTQgMS41Mjk0IDAgMCAxIDEuNTI5NCAxLjUyOTR6Ii8+CiAgPHBhdGggZD0ibTYuMTM1IDEzLjUzNWMwLTMuMjM5MiAyLjYyNTktNS44NjUgNS44NjUtNS44NjUgMy4yMzkyIDAgNS44NjUgMi42MjU5IDUuODY1IDUuODY1eiIvPgogIDxjaXJjbGUgY3g9IjEyIiBjeT0iMy43Njg1IiByPSIyLjk2ODUiLz4KIDwvZz4KPC9zdmc+Cg==); + --jp-icon-vega: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8ZyBjbGFzcz0ianAtaWNvbjEganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjMjEyMTIxIj4KICAgIDxwYXRoIGQ9Ik0xMC42IDUuNGwyLjItMy4ySDIuMnY3LjNsNC02LjZ6Ii8+CiAgICA8cGF0aCBkPSJNMTUuOCAyLjJsLTQuNCA2LjZMNyA2LjNsLTQuOCA4djUuNWgxNy42VjIuMmgtNHptLTcgMTUuNEg1LjV2LTQuNGgzLjN2NC40em00LjQgMEg5LjhWOS44aDMuNHY3Ljh6bTQuNCAwaC0zLjRWNi41aDMuNHYxMS4xeiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-word: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwIDIwIj4KIDxnIGNsYXNzPSJqcC1pY29uMiIgZmlsbD0iIzQxNDE0MSI+CiAgPHJlY3QgeD0iMiIgeT0iMiIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ii8+CiA8L2c+CiA8ZyBjbGFzcz0ianAtaWNvbi1hY2NlbnQyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSguNDMgLjA0MDEpIiBmaWxsPSIjZmZmIj4KICA8cGF0aCBkPSJtNC4xNCA4Ljc2cTAuMDY4Mi0xLjg5IDIuNDItMS44OSAxLjE2IDAgMS42OCAwLjQyIDAuNTY3IDAuNDEgMC41NjcgMS4xNnYzLjQ3cTAgMC40NjIgMC41MTQgMC40NjIgMC4xMDMgMCAwLjItMC4wMjMxdjAuNzE0cS0wLjM5OSAwLjEwMy0wLjY1MSAwLjEwMy0wLjQ1MiAwLTAuNjkzLTAuMjItMC4yMzEtMC4yLTAuMjg0LTAuNjYyLTAuOTU2IDAuODcyLTIgMC44NzItMC45MDMgMC0xLjQ3LTAuNDcyLTAuNTI1LTAuNDcyLTAuNTI1LTEuMjYgMC0wLjI2MiAwLjA0NTItMC40NzIgMC4wNTY3LTAuMjIgMC4xMTYtMC4zNzggMC4wNjgyLTAuMTY4IDAuMjMxLTAuMzA0IDAuMTU4LTAuMTQ3IDAuMjYyLTAuMjQyIDAuMTE2LTAuMDkxNCAwLjM2OC0wLjE2OCAwLjI2Mi0wLjA5MTQgMC4zOTktMC4xMjYgMC4xMzYtMC4wNDUyIDAuNDcyLTAuMTAzIDAuMzM2LTAuMDU3OCAwLjUwNC0wLjA3OTggMC4xNTgtMC4wMjMxIDAuNTY3LTAuMDc5OCAwLjU1Ni0wLjA2ODIgMC43NzctMC4yMjEgMC4yMi0wLjE1MiAwLjIyLTAuNDQxdi0wLjI1MnEwLTAuNDMtMC4zNTctMC42NjItMC4zMzYtMC4yMzEtMC45NzYtMC4yMzEtMC42NjIgMC0wLjk5OCAwLjI2Mi0wLjMzNiAwLjI1Mi0wLjM5OSAwLjc5OHptMS44OSAzLjY4cTAuNzg4IDAgMS4yNi0wLjQxIDAuNTA0LTAuNDIgMC41MDQtMC45MDN2LTEuMDVxLTAuMjg0IDAuMTM2LTAuODYxIDAuMjMxLTAuNTY3IDAuMDkxNC0wLjk4NyAwLjE1OC0wLjQyIDAuMDY4Mi0wLjc2NiAwLjMyNi0wLjMzNiAwLjI1Mi0wLjMzNiAwLjcwNHQwLjMwNCAwLjcwNCAwLjg2MSAwLjI1MnoiIHN0cm9rZS13aWR0aD0iMS4wNSIvPgogIDxwYXRoIGQ9Im0xMCA0LjU2aDAuOTQ1djMuMTVxMC42NTEtMC45NzYgMS44OS0wLjk3NiAxLjE2IDAgMS44OSAwLjg0IDAuNjgyIDAuODQgMC42ODIgMi4zMSAwIDEuNDctMC43MDQgMi40Mi0wLjcwNCAwLjg4Mi0xLjg5IDAuODgyLTEuMjYgMC0xLjg5LTEuMDJ2MC43NjZoLTAuODV6bTIuNjIgMy4wNHEtMC43NDYgMC0xLjE2IDAuNjQtMC40NTIgMC42My0wLjQ1MiAxLjY4IDAgMS4wNSAwLjQ1MiAxLjY4dDEuMTYgMC42M3EwLjc3NyAwIDEuMjYtMC42MyAwLjQ5NC0wLjY0IDAuNDk0LTEuNjggMC0xLjA1LTAuNDcyLTEuNjgtMC40NjItMC42NC0xLjI2LTAuNjR6IiBzdHJva2Utd2lkdGg9IjEuMDUiLz4KICA8cGF0aCBkPSJtMi43MyAxNS44IDEzLjYgMC4wMDgxYzAuMDA2OSAwIDAtMi42IDAtMi42IDAtMC4wMDc4LTEuMTUgMC0xLjE1IDAtMC4wMDY5IDAtMC4wMDgzIDEuNS0wLjAwODMgMS41LTJlLTMgLTAuMDAxNC0xMS4zLTAuMDAxNC0xMS4zLTAuMDAxNGwtMC4wMDU5Mi0xLjVjMC0wLjAwNzgtMS4xNyAwLjAwMTMtMS4xNyAwLjAwMTN6IiBzdHJva2Utd2lkdGg9Ii45NzUiLz4KIDwvZz4KPC9zdmc+Cg==); + --jp-icon-yaml: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8ZyBjbGFzcz0ianAtaWNvbi1jb250cmFzdDIganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjRDgxQjYwIj4KICAgIDxwYXRoIGQ9Ik03LjIgMTguNnYtNS40TDMgNS42aDMuM2wxLjQgMy4xYy4zLjkuNiAxLjYgMSAyLjUuMy0uOC42LTEuNiAxLTIuNWwxLjQtMy4xaDMuNGwtNC40IDcuNnY1LjVsLTIuOS0uMXoiLz4KICAgIDxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjE3LjYiIGN5PSIxNi41IiByPSIyLjEiLz4KICAgIDxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjE3LjYiIGN5PSIxMSIgcj0iMi4xIi8+CiAgPC9nPgo8L3N2Zz4K); +} + +/* Icon CSS class declarations */ + +.jp-AddAboveIcon { + background-image: var(--jp-icon-add-above); +} + +.jp-AddBelowIcon { + background-image: var(--jp-icon-add-below); +} + +.jp-AddIcon { + background-image: var(--jp-icon-add); +} + +.jp-BellIcon { + background-image: var(--jp-icon-bell); +} + +.jp-BugDotIcon { + background-image: var(--jp-icon-bug-dot); +} + +.jp-BugIcon { + background-image: var(--jp-icon-bug); +} + +.jp-BuildIcon { + background-image: var(--jp-icon-build); +} + +.jp-CaretDownEmptyIcon { + background-image: var(--jp-icon-caret-down-empty); +} + +.jp-CaretDownEmptyThinIcon { + background-image: var(--jp-icon-caret-down-empty-thin); +} + +.jp-CaretDownIcon { + background-image: var(--jp-icon-caret-down); +} + +.jp-CaretLeftIcon { + background-image: var(--jp-icon-caret-left); +} + +.jp-CaretRightIcon { + background-image: var(--jp-icon-caret-right); +} + +.jp-CaretUpEmptyThinIcon { + background-image: var(--jp-icon-caret-up-empty-thin); +} + +.jp-CaretUpIcon { + background-image: var(--jp-icon-caret-up); +} + +.jp-CaseSensitiveIcon { + background-image: var(--jp-icon-case-sensitive); +} + +.jp-CheckIcon { + background-image: var(--jp-icon-check); +} + +.jp-CircleEmptyIcon { + background-image: var(--jp-icon-circle-empty); +} + +.jp-CircleIcon { + background-image: var(--jp-icon-circle); +} + +.jp-ClearIcon { + background-image: var(--jp-icon-clear); +} + +.jp-CloseIcon { + background-image: var(--jp-icon-close); +} + +.jp-CodeCheckIcon { + background-image: var(--jp-icon-code-check); +} + +.jp-CodeIcon { + background-image: var(--jp-icon-code); +} + +.jp-CollapseAllIcon { + background-image: var(--jp-icon-collapse-all); +} + +.jp-ConsoleIcon { + background-image: var(--jp-icon-console); +} + +.jp-CopyIcon { + background-image: var(--jp-icon-copy); +} + +.jp-CopyrightIcon { + background-image: var(--jp-icon-copyright); +} + +.jp-CutIcon { + background-image: var(--jp-icon-cut); +} + +.jp-DeleteIcon { + background-image: var(--jp-icon-delete); +} + +.jp-DownloadIcon { + background-image: var(--jp-icon-download); +} + +.jp-DuplicateIcon { + background-image: var(--jp-icon-duplicate); +} + +.jp-EditIcon { + background-image: var(--jp-icon-edit); +} + +.jp-EllipsesIcon { + background-image: var(--jp-icon-ellipses); +} + +.jp-ErrorIcon { + background-image: var(--jp-icon-error); +} + +.jp-ExpandAllIcon { + background-image: var(--jp-icon-expand-all); +} + +.jp-ExtensionIcon { + background-image: var(--jp-icon-extension); +} + +.jp-FastForwardIcon { + background-image: var(--jp-icon-fast-forward); +} + +.jp-FileIcon { + background-image: var(--jp-icon-file); +} + +.jp-FileUploadIcon { + background-image: var(--jp-icon-file-upload); +} + +.jp-FilterDotIcon { + background-image: var(--jp-icon-filter-dot); +} + +.jp-FilterIcon { + background-image: var(--jp-icon-filter); +} + +.jp-FilterListIcon { + background-image: var(--jp-icon-filter-list); +} + +.jp-FolderFavoriteIcon { + background-image: var(--jp-icon-folder-favorite); +} + +.jp-FolderIcon { + background-image: var(--jp-icon-folder); +} + +.jp-HomeIcon { + background-image: var(--jp-icon-home); +} + +.jp-Html5Icon { + background-image: var(--jp-icon-html5); +} + +.jp-ImageIcon { + background-image: var(--jp-icon-image); +} + +.jp-InfoIcon { + background-image: var(--jp-icon-info); +} + +.jp-InspectorIcon { + background-image: var(--jp-icon-inspector); +} + +.jp-JsonIcon { + background-image: var(--jp-icon-json); +} + +.jp-JuliaIcon { + background-image: var(--jp-icon-julia); +} + +.jp-JupyterFaviconIcon { + background-image: var(--jp-icon-jupyter-favicon); +} + +.jp-JupyterIcon { + background-image: var(--jp-icon-jupyter); +} + +.jp-JupyterlabWordmarkIcon { + background-image: var(--jp-icon-jupyterlab-wordmark); +} + +.jp-KernelIcon { + background-image: var(--jp-icon-kernel); +} + +.jp-KeyboardIcon { + background-image: var(--jp-icon-keyboard); +} + +.jp-LaunchIcon { + background-image: var(--jp-icon-launch); +} + +.jp-LauncherIcon { + background-image: var(--jp-icon-launcher); +} + +.jp-LineFormIcon { + background-image: var(--jp-icon-line-form); +} + +.jp-LinkIcon { + background-image: var(--jp-icon-link); +} + +.jp-ListIcon { + background-image: var(--jp-icon-list); +} + +.jp-MarkdownIcon { + background-image: var(--jp-icon-markdown); +} + +.jp-MoveDownIcon { + background-image: var(--jp-icon-move-down); +} + +.jp-MoveUpIcon { + background-image: var(--jp-icon-move-up); +} + +.jp-NewFolderIcon { + background-image: var(--jp-icon-new-folder); +} + +.jp-NotTrustedIcon { + background-image: var(--jp-icon-not-trusted); +} + +.jp-NotebookIcon { + background-image: var(--jp-icon-notebook); +} + +.jp-NumberingIcon { + background-image: var(--jp-icon-numbering); +} + +.jp-OfflineBoltIcon { + background-image: var(--jp-icon-offline-bolt); +} + +.jp-PaletteIcon { + background-image: var(--jp-icon-palette); +} + +.jp-PasteIcon { + background-image: var(--jp-icon-paste); +} + +.jp-PdfIcon { + background-image: var(--jp-icon-pdf); +} + +.jp-PythonIcon { + background-image: var(--jp-icon-python); +} + +.jp-RKernelIcon { + background-image: var(--jp-icon-r-kernel); +} + +.jp-ReactIcon { + background-image: var(--jp-icon-react); +} + +.jp-RedoIcon { + background-image: var(--jp-icon-redo); +} + +.jp-RefreshIcon { + background-image: var(--jp-icon-refresh); +} + +.jp-RegexIcon { + background-image: var(--jp-icon-regex); +} + +.jp-RunIcon { + background-image: var(--jp-icon-run); +} + +.jp-RunningIcon { + background-image: var(--jp-icon-running); +} + +.jp-SaveIcon { + background-image: var(--jp-icon-save); +} + +.jp-SearchIcon { + background-image: var(--jp-icon-search); +} + +.jp-SettingsIcon { + background-image: var(--jp-icon-settings); +} + +.jp-ShareIcon { + background-image: var(--jp-icon-share); +} + +.jp-SpreadsheetIcon { + background-image: var(--jp-icon-spreadsheet); +} + +.jp-StopIcon { + background-image: var(--jp-icon-stop); +} + +.jp-TabIcon { + background-image: var(--jp-icon-tab); +} + +.jp-TableRowsIcon { + background-image: var(--jp-icon-table-rows); +} + +.jp-TagIcon { + background-image: var(--jp-icon-tag); +} + +.jp-TerminalIcon { + background-image: var(--jp-icon-terminal); +} + +.jp-TextEditorIcon { + background-image: var(--jp-icon-text-editor); +} + +.jp-TocIcon { + background-image: var(--jp-icon-toc); +} + +.jp-TreeViewIcon { + background-image: var(--jp-icon-tree-view); +} + +.jp-TrustedIcon { + background-image: var(--jp-icon-trusted); +} + +.jp-UndoIcon { + background-image: var(--jp-icon-undo); +} + +.jp-UserIcon { + background-image: var(--jp-icon-user); +} + +.jp-UsersIcon { + background-image: var(--jp-icon-users); +} + +.jp-VegaIcon { + background-image: var(--jp-icon-vega); +} + +.jp-WordIcon { + background-image: var(--jp-icon-word); +} + +.jp-YamlIcon { + background-image: var(--jp-icon-yaml); +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/** + * (DEPRECATED) Support for consuming icons as CSS background images + */ + +.jp-Icon, +.jp-MaterialIcon { + background-position: center; + background-repeat: no-repeat; + background-size: 16px; + min-width: 16px; + min-height: 16px; +} + +.jp-Icon-cover { + background-position: center; + background-repeat: no-repeat; + background-size: cover; +} + +/** + * (DEPRECATED) Support for specific CSS icon sizes + */ + +.jp-Icon-16 { + background-size: 16px; + min-width: 16px; + min-height: 16px; +} + +.jp-Icon-18 { + background-size: 18px; + min-width: 18px; + min-height: 18px; +} + +.jp-Icon-20 { + background-size: 20px; + min-width: 20px; + min-height: 20px; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.lm-TabBar .lm-TabBar-addButton { + align-items: center; + display: flex; + padding: 4px; + padding-bottom: 5px; + margin-right: 1px; + background-color: var(--jp-layout-color2); +} + +.lm-TabBar .lm-TabBar-addButton:hover { + background-color: var(--jp-layout-color1); +} + +.lm-DockPanel-tabBar .lm-TabBar-tab { + width: var(--jp-private-horizontal-tab-width); +} + +.lm-DockPanel-tabBar .lm-TabBar-content { + flex: unset; +} + +.lm-DockPanel-tabBar[data-orientation='horizontal'] { + flex: 1 1 auto; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/** + * Support for icons as inline SVG HTMLElements + */ + +/* recolor the primary elements of an icon */ +.jp-icon0[fill] { + fill: var(--jp-inverse-layout-color0); +} + +.jp-icon1[fill] { + fill: var(--jp-inverse-layout-color1); +} + +.jp-icon2[fill] { + fill: var(--jp-inverse-layout-color2); +} + +.jp-icon3[fill] { + fill: var(--jp-inverse-layout-color3); +} + +.jp-icon4[fill] { + fill: var(--jp-inverse-layout-color4); +} + +.jp-icon0[stroke] { + stroke: var(--jp-inverse-layout-color0); +} + +.jp-icon1[stroke] { + stroke: var(--jp-inverse-layout-color1); +} + +.jp-icon2[stroke] { + stroke: var(--jp-inverse-layout-color2); +} + +.jp-icon3[stroke] { + stroke: var(--jp-inverse-layout-color3); +} + +.jp-icon4[stroke] { + stroke: var(--jp-inverse-layout-color4); +} + +/* recolor the accent elements of an icon */ +.jp-icon-accent0[fill] { + fill: var(--jp-layout-color0); +} + +.jp-icon-accent1[fill] { + fill: var(--jp-layout-color1); +} + +.jp-icon-accent2[fill] { + fill: var(--jp-layout-color2); +} + +.jp-icon-accent3[fill] { + fill: var(--jp-layout-color3); +} + +.jp-icon-accent4[fill] { + fill: var(--jp-layout-color4); +} + +.jp-icon-accent0[stroke] { + stroke: var(--jp-layout-color0); +} + +.jp-icon-accent1[stroke] { + stroke: var(--jp-layout-color1); +} + +.jp-icon-accent2[stroke] { + stroke: var(--jp-layout-color2); +} + +.jp-icon-accent3[stroke] { + stroke: var(--jp-layout-color3); +} + +.jp-icon-accent4[stroke] { + stroke: var(--jp-layout-color4); +} + +/* set the color of an icon to transparent */ +.jp-icon-none[fill] { + fill: none; +} + +.jp-icon-none[stroke] { + stroke: none; +} + +/* brand icon colors. Same for light and dark */ +.jp-icon-brand0[fill] { + fill: var(--jp-brand-color0); +} + +.jp-icon-brand1[fill] { + fill: var(--jp-brand-color1); +} + +.jp-icon-brand2[fill] { + fill: var(--jp-brand-color2); +} + +.jp-icon-brand3[fill] { + fill: var(--jp-brand-color3); +} + +.jp-icon-brand4[fill] { + fill: var(--jp-brand-color4); +} + +.jp-icon-brand0[stroke] { + stroke: var(--jp-brand-color0); +} + +.jp-icon-brand1[stroke] { + stroke: var(--jp-brand-color1); +} + +.jp-icon-brand2[stroke] { + stroke: var(--jp-brand-color2); +} + +.jp-icon-brand3[stroke] { + stroke: var(--jp-brand-color3); +} + +.jp-icon-brand4[stroke] { + stroke: var(--jp-brand-color4); +} + +/* warn icon colors. Same for light and dark */ +.jp-icon-warn0[fill] { + fill: var(--jp-warn-color0); +} + +.jp-icon-warn1[fill] { + fill: var(--jp-warn-color1); +} + +.jp-icon-warn2[fill] { + fill: var(--jp-warn-color2); +} + +.jp-icon-warn3[fill] { + fill: var(--jp-warn-color3); +} + +.jp-icon-warn0[stroke] { + stroke: var(--jp-warn-color0); +} + +.jp-icon-warn1[stroke] { + stroke: var(--jp-warn-color1); +} + +.jp-icon-warn2[stroke] { + stroke: var(--jp-warn-color2); +} + +.jp-icon-warn3[stroke] { + stroke: var(--jp-warn-color3); +} + +/* icon colors that contrast well with each other and most backgrounds */ +.jp-icon-contrast0[fill] { + fill: var(--jp-icon-contrast-color0); +} + +.jp-icon-contrast1[fill] { + fill: var(--jp-icon-contrast-color1); +} + +.jp-icon-contrast2[fill] { + fill: var(--jp-icon-contrast-color2); +} + +.jp-icon-contrast3[fill] { + fill: var(--jp-icon-contrast-color3); +} + +.jp-icon-contrast0[stroke] { + stroke: var(--jp-icon-contrast-color0); +} + +.jp-icon-contrast1[stroke] { + stroke: var(--jp-icon-contrast-color1); +} + +.jp-icon-contrast2[stroke] { + stroke: var(--jp-icon-contrast-color2); +} + +.jp-icon-contrast3[stroke] { + stroke: var(--jp-icon-contrast-color3); +} + +.jp-icon-dot[fill] { + fill: var(--jp-warn-color0); +} + +.jp-jupyter-icon-color[fill] { + fill: var(--jp-jupyter-icon-color, var(--jp-warn-color0)); +} + +.jp-notebook-icon-color[fill] { + fill: var(--jp-notebook-icon-color, var(--jp-warn-color0)); +} + +.jp-json-icon-color[fill] { + fill: var(--jp-json-icon-color, var(--jp-warn-color1)); +} + +.jp-console-icon-color[fill] { + fill: var(--jp-console-icon-color, white); +} + +.jp-console-icon-background-color[fill] { + fill: var(--jp-console-icon-background-color, var(--jp-brand-color1)); +} + +.jp-terminal-icon-color[fill] { + fill: var(--jp-terminal-icon-color, var(--jp-layout-color2)); +} + +.jp-terminal-icon-background-color[fill] { + fill: var( + --jp-terminal-icon-background-color, + var(--jp-inverse-layout-color2) + ); +} + +.jp-text-editor-icon-color[fill] { + fill: var(--jp-text-editor-icon-color, var(--jp-inverse-layout-color3)); +} + +.jp-inspector-icon-color[fill] { + fill: var(--jp-inspector-icon-color, var(--jp-inverse-layout-color3)); +} + +/* CSS for icons in selected filebrowser listing items */ +.jp-DirListing-item.jp-mod-selected .jp-icon-selectable[fill] { + fill: #fff; +} + +.jp-DirListing-item.jp-mod-selected .jp-icon-selectable-inverse[fill] { + fill: var(--jp-brand-color1); +} + +/* stylelint-disable selector-max-class, selector-max-compound-selectors */ + +/** +* TODO: come up with non css-hack solution for showing the busy icon on top +* of the close icon +* CSS for complex behavior of close icon of tabs in the main area tabbar +*/ +.lm-DockPanel-tabBar + .lm-TabBar-tab.lm-mod-closable.jp-mod-dirty + > .lm-TabBar-tabCloseIcon + > :not(:hover) + > .jp-icon3[fill] { + fill: none; +} + +.lm-DockPanel-tabBar + .lm-TabBar-tab.lm-mod-closable.jp-mod-dirty + > .lm-TabBar-tabCloseIcon + > :not(:hover) + > .jp-icon-busy[fill] { + fill: var(--jp-inverse-layout-color3); +} + +/* stylelint-enable selector-max-class, selector-max-compound-selectors */ + +/* CSS for icons in status bar */ +#jp-main-statusbar .jp-mod-selected .jp-icon-selectable[fill] { + fill: #fff; +} + +#jp-main-statusbar .jp-mod-selected .jp-icon-selectable-inverse[fill] { + fill: var(--jp-brand-color1); +} + +/* special handling for splash icon CSS. While the theme CSS reloads during + splash, the splash icon can loose theming. To prevent that, we set a + default for its color variable */ +:root { + --jp-warn-color0: var(--md-orange-700); +} + +/* not sure what to do with this one, used in filebrowser listing */ +.jp-DragIcon { + margin-right: 4px; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/** + * Support for alt colors for icons as inline SVG HTMLElements + */ + +/* alt recolor the primary elements of an icon */ +.jp-icon-alt .jp-icon0[fill] { + fill: var(--jp-layout-color0); +} + +.jp-icon-alt .jp-icon1[fill] { + fill: var(--jp-layout-color1); +} + +.jp-icon-alt .jp-icon2[fill] { + fill: var(--jp-layout-color2); +} + +.jp-icon-alt .jp-icon3[fill] { + fill: var(--jp-layout-color3); +} + +.jp-icon-alt .jp-icon4[fill] { + fill: var(--jp-layout-color4); +} + +.jp-icon-alt .jp-icon0[stroke] { + stroke: var(--jp-layout-color0); +} + +.jp-icon-alt .jp-icon1[stroke] { + stroke: var(--jp-layout-color1); +} + +.jp-icon-alt .jp-icon2[stroke] { + stroke: var(--jp-layout-color2); +} + +.jp-icon-alt .jp-icon3[stroke] { + stroke: var(--jp-layout-color3); +} + +.jp-icon-alt .jp-icon4[stroke] { + stroke: var(--jp-layout-color4); +} + +/* alt recolor the accent elements of an icon */ +.jp-icon-alt .jp-icon-accent0[fill] { + fill: var(--jp-inverse-layout-color0); +} + +.jp-icon-alt .jp-icon-accent1[fill] { + fill: var(--jp-inverse-layout-color1); +} + +.jp-icon-alt .jp-icon-accent2[fill] { + fill: var(--jp-inverse-layout-color2); +} + +.jp-icon-alt .jp-icon-accent3[fill] { + fill: var(--jp-inverse-layout-color3); +} + +.jp-icon-alt .jp-icon-accent4[fill] { + fill: var(--jp-inverse-layout-color4); +} + +.jp-icon-alt .jp-icon-accent0[stroke] { + stroke: var(--jp-inverse-layout-color0); +} + +.jp-icon-alt .jp-icon-accent1[stroke] { + stroke: var(--jp-inverse-layout-color1); +} + +.jp-icon-alt .jp-icon-accent2[stroke] { + stroke: var(--jp-inverse-layout-color2); +} + +.jp-icon-alt .jp-icon-accent3[stroke] { + stroke: var(--jp-inverse-layout-color3); +} + +.jp-icon-alt .jp-icon-accent4[stroke] { + stroke: var(--jp-inverse-layout-color4); +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-icon-hoverShow:not(:hover) .jp-icon-hoverShow-content { + display: none !important; +} + +/** + * Support for hover colors for icons as inline SVG HTMLElements + */ + +/** + * regular colors + */ + +/* recolor the primary elements of an icon */ +.jp-icon-hover :hover .jp-icon0-hover[fill] { + fill: var(--jp-inverse-layout-color0); +} + +.jp-icon-hover :hover .jp-icon1-hover[fill] { + fill: var(--jp-inverse-layout-color1); +} + +.jp-icon-hover :hover .jp-icon2-hover[fill] { + fill: var(--jp-inverse-layout-color2); +} + +.jp-icon-hover :hover .jp-icon3-hover[fill] { + fill: var(--jp-inverse-layout-color3); +} + +.jp-icon-hover :hover .jp-icon4-hover[fill] { + fill: var(--jp-inverse-layout-color4); +} + +.jp-icon-hover :hover .jp-icon0-hover[stroke] { + stroke: var(--jp-inverse-layout-color0); +} + +.jp-icon-hover :hover .jp-icon1-hover[stroke] { + stroke: var(--jp-inverse-layout-color1); +} + +.jp-icon-hover :hover .jp-icon2-hover[stroke] { + stroke: var(--jp-inverse-layout-color2); +} + +.jp-icon-hover :hover .jp-icon3-hover[stroke] { + stroke: var(--jp-inverse-layout-color3); +} + +.jp-icon-hover :hover .jp-icon4-hover[stroke] { + stroke: var(--jp-inverse-layout-color4); +} + +/* recolor the accent elements of an icon */ +.jp-icon-hover :hover .jp-icon-accent0-hover[fill] { + fill: var(--jp-layout-color0); +} + +.jp-icon-hover :hover .jp-icon-accent1-hover[fill] { + fill: var(--jp-layout-color1); +} + +.jp-icon-hover :hover .jp-icon-accent2-hover[fill] { + fill: var(--jp-layout-color2); +} + +.jp-icon-hover :hover .jp-icon-accent3-hover[fill] { + fill: var(--jp-layout-color3); +} + +.jp-icon-hover :hover .jp-icon-accent4-hover[fill] { + fill: var(--jp-layout-color4); +} + +.jp-icon-hover :hover .jp-icon-accent0-hover[stroke] { + stroke: var(--jp-layout-color0); +} + +.jp-icon-hover :hover .jp-icon-accent1-hover[stroke] { + stroke: var(--jp-layout-color1); +} + +.jp-icon-hover :hover .jp-icon-accent2-hover[stroke] { + stroke: var(--jp-layout-color2); +} + +.jp-icon-hover :hover .jp-icon-accent3-hover[stroke] { + stroke: var(--jp-layout-color3); +} + +.jp-icon-hover :hover .jp-icon-accent4-hover[stroke] { + stroke: var(--jp-layout-color4); +} + +/* set the color of an icon to transparent */ +.jp-icon-hover :hover .jp-icon-none-hover[fill] { + fill: none; +} + +.jp-icon-hover :hover .jp-icon-none-hover[stroke] { + stroke: none; +} + +/** + * inverse colors + */ + +/* inverse recolor the primary elements of an icon */ +.jp-icon-hover.jp-icon-alt :hover .jp-icon0-hover[fill] { + fill: var(--jp-layout-color0); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon1-hover[fill] { + fill: var(--jp-layout-color1); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon2-hover[fill] { + fill: var(--jp-layout-color2); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon3-hover[fill] { + fill: var(--jp-layout-color3); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon4-hover[fill] { + fill: var(--jp-layout-color4); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon0-hover[stroke] { + stroke: var(--jp-layout-color0); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon1-hover[stroke] { + stroke: var(--jp-layout-color1); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon2-hover[stroke] { + stroke: var(--jp-layout-color2); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon3-hover[stroke] { + stroke: var(--jp-layout-color3); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon4-hover[stroke] { + stroke: var(--jp-layout-color4); +} + +/* inverse recolor the accent elements of an icon */ +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent0-hover[fill] { + fill: var(--jp-inverse-layout-color0); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent1-hover[fill] { + fill: var(--jp-inverse-layout-color1); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent2-hover[fill] { + fill: var(--jp-inverse-layout-color2); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent3-hover[fill] { + fill: var(--jp-inverse-layout-color3); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent4-hover[fill] { + fill: var(--jp-inverse-layout-color4); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent0-hover[stroke] { + stroke: var(--jp-inverse-layout-color0); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent1-hover[stroke] { + stroke: var(--jp-inverse-layout-color1); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent2-hover[stroke] { + stroke: var(--jp-inverse-layout-color2); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent3-hover[stroke] { + stroke: var(--jp-inverse-layout-color3); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent4-hover[stroke] { + stroke: var(--jp-inverse-layout-color4); +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-IFrame { + width: 100%; + height: 100%; +} + +.jp-IFrame > iframe { + border: none; +} + +/* +When drag events occur, `lm-mod-override-cursor` is added to the body. +Because iframes steal all cursor events, the following two rules are necessary +to suppress pointer events while resize drags are occurring. There may be a +better solution to this problem. +*/ +body.lm-mod-override-cursor .jp-IFrame { + position: relative; +} + +body.lm-mod-override-cursor .jp-IFrame::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: transparent; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) 2014-2016, Jupyter Development Team. +| +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-HoverBox { + position: fixed; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-FormGroup-content fieldset { + border: none; + padding: 0; + min-width: 0; + width: 100%; +} + +/* stylelint-disable selector-max-type */ + +.jp-FormGroup-content fieldset .jp-inputFieldWrapper input, +.jp-FormGroup-content fieldset .jp-inputFieldWrapper select, +.jp-FormGroup-content fieldset .jp-inputFieldWrapper textarea { + font-size: var(--jp-content-font-size2); + border-color: var(--jp-input-border-color); + border-style: solid; + border-radius: var(--jp-border-radius); + border-width: 1px; + padding: 6px 8px; + background: none; + color: var(--jp-ui-font-color0); + height: inherit; +} + +.jp-FormGroup-content fieldset input[type='checkbox'] { + position: relative; + top: 2px; + margin-left: 0; +} + +.jp-FormGroup-content button.jp-mod-styled { + cursor: pointer; +} + +.jp-FormGroup-content .checkbox label { + cursor: pointer; + font-size: var(--jp-content-font-size1); +} + +.jp-FormGroup-content .jp-root > fieldset > legend { + display: none; +} + +.jp-FormGroup-content .jp-root > fieldset > p { + display: none; +} + +/** copy of `input.jp-mod-styled:focus` style */ +.jp-FormGroup-content fieldset input:focus, +.jp-FormGroup-content fieldset select:focus { + -moz-outline-radius: unset; + outline: var(--jp-border-width) solid var(--md-blue-500); + outline-offset: -1px; + box-shadow: inset 0 0 4px var(--md-blue-300); +} + +.jp-FormGroup-content fieldset input:hover:not(:focus), +.jp-FormGroup-content fieldset select:hover:not(:focus) { + background-color: var(--jp-border-color2); +} + +/* stylelint-enable selector-max-type */ + +.jp-FormGroup-content .checkbox .field-description { + /* Disable default description field for checkbox: + because other widgets do not have description fields, + we add descriptions to each widget on the field level. + */ + display: none; +} + +.jp-FormGroup-content #root__description { + display: none; +} + +.jp-FormGroup-content .jp-modifiedIndicator { + width: 5px; + background-color: var(--jp-brand-color2); + margin-top: 0; + margin-left: calc(var(--jp-private-settingeditor-modifier-indent) * -1); + flex-shrink: 0; +} + +.jp-FormGroup-content .jp-modifiedIndicator.jp-errorIndicator { + background-color: var(--jp-error-color0); + margin-right: 0.5em; +} + +/* RJSF ARRAY style */ + +.jp-arrayFieldWrapper legend { + font-size: var(--jp-content-font-size2); + color: var(--jp-ui-font-color0); + flex-basis: 100%; + padding: 4px 0; + font-weight: var(--jp-content-heading-font-weight); + border-bottom: 1px solid var(--jp-border-color2); +} + +.jp-arrayFieldWrapper .field-description { + padding: 4px 0; + white-space: pre-wrap; +} + +.jp-arrayFieldWrapper .array-item { + width: 100%; + border: 1px solid var(--jp-border-color2); + border-radius: 4px; + margin: 4px; +} + +.jp-ArrayOperations { + display: flex; + margin-left: 8px; +} + +.jp-ArrayOperationsButton { + margin: 2px; +} + +.jp-ArrayOperationsButton .jp-icon3[fill] { + fill: var(--jp-ui-font-color0); +} + +button.jp-ArrayOperationsButton.jp-mod-styled:disabled { + cursor: not-allowed; + opacity: 0.5; +} + +/* RJSF form validation error */ + +.jp-FormGroup-content .validationErrors { + color: var(--jp-error-color0); +} + +/* Hide panel level error as duplicated the field level error */ +.jp-FormGroup-content .panel.errors { + display: none; +} + +/* RJSF normal content (settings-editor) */ + +.jp-FormGroup-contentNormal { + display: flex; + align-items: center; + flex-wrap: wrap; +} + +.jp-FormGroup-contentNormal .jp-FormGroup-contentItem { + margin-left: 7px; + color: var(--jp-ui-font-color0); +} + +.jp-FormGroup-contentNormal .jp-FormGroup-description { + flex-basis: 100%; + padding: 4px 7px; +} + +.jp-FormGroup-contentNormal .jp-FormGroup-default { + flex-basis: 100%; + padding: 4px 7px; +} + +.jp-FormGroup-contentNormal .jp-FormGroup-fieldLabel { + font-size: var(--jp-content-font-size1); + font-weight: normal; + min-width: 120px; +} + +.jp-FormGroup-contentNormal fieldset:not(:first-child) { + margin-left: 7px; +} + +.jp-FormGroup-contentNormal .field-array-of-string .array-item { + /* Display `jp-ArrayOperations` buttons side-by-side with content except + for small screens where flex-wrap will place them one below the other. + */ + display: flex; + align-items: center; + flex-wrap: wrap; +} + +.jp-FormGroup-contentNormal .jp-objectFieldWrapper .form-group { + padding: 2px 8px 2px var(--jp-private-settingeditor-modifier-indent); + margin-top: 2px; +} + +/* RJSF compact content (metadata-form) */ + +.jp-FormGroup-content.jp-FormGroup-contentCompact { + width: 100%; +} + +.jp-FormGroup-contentCompact .form-group { + display: flex; + padding: 0.5em 0.2em 0.5em 0; +} + +.jp-FormGroup-contentCompact + .jp-FormGroup-compactTitle + .jp-FormGroup-description { + font-size: var(--jp-ui-font-size1); + color: var(--jp-ui-font-color2); +} + +.jp-FormGroup-contentCompact .jp-FormGroup-fieldLabel { + padding-bottom: 0.3em; +} + +.jp-FormGroup-contentCompact .jp-inputFieldWrapper .form-control { + width: 100%; + box-sizing: border-box; +} + +.jp-FormGroup-contentCompact .jp-arrayFieldWrapper .jp-FormGroup-compactTitle { + padding-bottom: 7px; +} + +.jp-FormGroup-contentCompact + .jp-objectFieldWrapper + .jp-objectFieldWrapper + .form-group { + padding: 2px 8px 2px var(--jp-private-settingeditor-modifier-indent); + margin-top: 2px; +} + +.jp-FormGroup-contentCompact ul.error-detail { + margin-block-start: 0.5em; + margin-block-end: 0.5em; + padding-inline-start: 1em; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +.jp-SidePanel { + display: flex; + flex-direction: column; + min-width: var(--jp-sidebar-min-width); + overflow-y: auto; + color: var(--jp-ui-font-color1); + background: var(--jp-layout-color1); + font-size: var(--jp-ui-font-size1); +} + +.jp-SidePanel-header { + flex: 0 0 auto; + display: flex; + border-bottom: var(--jp-border-width) solid var(--jp-border-color2); + font-size: var(--jp-ui-font-size0); + font-weight: 600; + letter-spacing: 1px; + margin: 0; + padding: 2px; + text-transform: uppercase; +} + +.jp-SidePanel-toolbar { + flex: 0 0 auto; +} + +.jp-SidePanel-content { + flex: 1 1 auto; +} + +.jp-SidePanel-toolbar, +.jp-AccordionPanel-toolbar { + height: var(--jp-private-toolbar-height); +} + +.jp-SidePanel-toolbar.jp-Toolbar-micro { + display: none; +} + +.lm-AccordionPanel .jp-AccordionPanel-title { + box-sizing: border-box; + line-height: 25px; + margin: 0; + display: flex; + align-items: center; + background: var(--jp-layout-color1); + color: var(--jp-ui-font-color1); + border-bottom: var(--jp-border-width) solid var(--jp-toolbar-border-color); + box-shadow: var(--jp-toolbar-box-shadow); + font-size: var(--jp-ui-font-size0); +} + +.jp-AccordionPanel-title { + cursor: pointer; + user-select: none; + -moz-user-select: none; + -webkit-user-select: none; + text-transform: uppercase; +} + +.lm-AccordionPanel[data-orientation='horizontal'] > .jp-AccordionPanel-title { + /* Title is rotated for horizontal accordion panel using CSS */ + display: block; + transform-origin: top left; + transform: rotate(-90deg) translate(-100%); +} + +.jp-AccordionPanel-title .lm-AccordionPanel-titleLabel { + user-select: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.jp-AccordionPanel-title .lm-AccordionPanel-titleCollapser { + transform: rotate(-90deg); + margin: auto 0; + height: 16px; +} + +.jp-AccordionPanel-title.lm-mod-expanded .lm-AccordionPanel-titleCollapser { + transform: rotate(0deg); +} + +.lm-AccordionPanel .jp-AccordionPanel-toolbar { + background: none; + box-shadow: none; + border: none; + margin-left: auto; +} + +.lm-AccordionPanel .lm-SplitPanel-handle:hover { + background: var(--jp-layout-color3); +} + +.jp-text-truncated { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) 2017, Jupyter Development Team. +| +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-Spinner { + position: absolute; + display: flex; + justify-content: center; + align-items: center; + z-index: 10; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: var(--jp-layout-color0); + outline: none; +} + +.jp-SpinnerContent { + font-size: 10px; + margin: 50px auto; + text-indent: -9999em; + width: 3em; + height: 3em; + border-radius: 50%; + background: var(--jp-brand-color3); + background: linear-gradient( + to right, + #f37626 10%, + rgba(255, 255, 255, 0) 42% + ); + position: relative; + animation: load3 1s infinite linear, fadeIn 1s; +} + +.jp-SpinnerContent::before { + width: 50%; + height: 50%; + background: #f37626; + border-radius: 100% 0 0; + position: absolute; + top: 0; + left: 0; + content: ''; +} + +.jp-SpinnerContent::after { + background: var(--jp-layout-color0); + width: 75%; + height: 75%; + border-radius: 50%; + content: ''; + margin: auto; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; +} + +@keyframes fadeIn { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + +@keyframes load3 { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} + +/*----------------------------------------------------------------------------- +| Copyright (c) 2014-2017, Jupyter Development Team. +| +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +button.jp-mod-styled { + font-size: var(--jp-ui-font-size1); + color: var(--jp-ui-font-color0); + border: none; + box-sizing: border-box; + text-align: center; + line-height: 32px; + height: 32px; + padding: 0 12px; + letter-spacing: 0.8px; + outline: none; + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; +} + +input.jp-mod-styled { + background: var(--jp-input-background); + height: 28px; + box-sizing: border-box; + border: var(--jp-border-width) solid var(--jp-border-color1); + padding-left: 7px; + padding-right: 7px; + font-size: var(--jp-ui-font-size2); + color: var(--jp-ui-font-color0); + outline: none; + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; +} + +input[type='checkbox'].jp-mod-styled { + appearance: checkbox; + -webkit-appearance: checkbox; + -moz-appearance: checkbox; + height: auto; +} + +input.jp-mod-styled:focus { + border: var(--jp-border-width) solid var(--md-blue-500); + box-shadow: inset 0 0 4px var(--md-blue-300); +} + +.jp-select-wrapper { + display: flex; + position: relative; + flex-direction: column; + padding: 1px; + background-color: var(--jp-layout-color1); + box-sizing: border-box; + margin-bottom: 12px; +} + +.jp-select-wrapper:not(.multiple) { + height: 28px; +} + +.jp-select-wrapper.jp-mod-focused select.jp-mod-styled { + border: var(--jp-border-width) solid var(--jp-input-active-border-color); + box-shadow: var(--jp-input-box-shadow); + background-color: var(--jp-input-active-background); +} + +select.jp-mod-styled:hover { + cursor: pointer; + color: var(--jp-ui-font-color0); + background-color: var(--jp-input-hover-background); + box-shadow: inset 0 0 1px rgba(0, 0, 0, 0.5); +} + +select.jp-mod-styled { + flex: 1 1 auto; + width: 100%; + font-size: var(--jp-ui-font-size2); + background: var(--jp-input-background); + color: var(--jp-ui-font-color0); + padding: 0 25px 0 8px; + border: var(--jp-border-width) solid var(--jp-input-border-color); + border-radius: 0; + outline: none; + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; +} + +select.jp-mod-styled:not([multiple]) { + height: 32px; +} + +select.jp-mod-styled[multiple] { + max-height: 200px; + overflow-y: auto; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-switch { + display: flex; + align-items: center; + padding-left: 4px; + padding-right: 4px; + font-size: var(--jp-ui-font-size1); + background-color: transparent; + color: var(--jp-ui-font-color1); + border: none; + height: 20px; +} + +.jp-switch:hover { + background-color: var(--jp-layout-color2); +} + +.jp-switch-label { + margin-right: 5px; + font-family: var(--jp-ui-font-family); +} + +.jp-switch-track { + cursor: pointer; + background-color: var(--jp-switch-color, var(--jp-border-color1)); + -webkit-transition: 0.4s; + transition: 0.4s; + border-radius: 34px; + height: 16px; + width: 35px; + position: relative; +} + +.jp-switch-track::before { + content: ''; + position: absolute; + height: 10px; + width: 10px; + margin: 3px; + left: 0; + background-color: var(--jp-ui-inverse-font-color1); + -webkit-transition: 0.4s; + transition: 0.4s; + border-radius: 50%; +} + +.jp-switch[aria-checked='true'] .jp-switch-track { + background-color: var(--jp-switch-true-position-color, var(--jp-warn-color0)); +} + +.jp-switch[aria-checked='true'] .jp-switch-track::before { + /* track width (35) - margins (3 + 3) - thumb width (10) */ + left: 19px; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) 2014-2016, Jupyter Development Team. +| +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +:root { + --jp-private-toolbar-height: calc( + 28px + var(--jp-border-width) + ); /* leave 28px for content */ +} + +.jp-Toolbar { + color: var(--jp-ui-font-color1); + flex: 0 0 auto; + display: flex; + flex-direction: row; + border-bottom: var(--jp-border-width) solid var(--jp-toolbar-border-color); + box-shadow: var(--jp-toolbar-box-shadow); + background: var(--jp-toolbar-background); + min-height: var(--jp-toolbar-micro-height); + padding: 2px; + z-index: 8; + overflow-x: hidden; +} + +/* Toolbar items */ + +.jp-Toolbar > .jp-Toolbar-item.jp-Toolbar-spacer { + flex-grow: 1; + flex-shrink: 1; +} + +.jp-Toolbar-item.jp-Toolbar-kernelStatus { + display: inline-block; + width: 32px; + background-repeat: no-repeat; + background-position: center; + background-size: 16px; +} + +.jp-Toolbar > .jp-Toolbar-item { + flex: 0 0 auto; + display: flex; + padding-left: 1px; + padding-right: 1px; + font-size: var(--jp-ui-font-size1); + line-height: var(--jp-private-toolbar-height); + height: 100%; +} + +/* Toolbar buttons */ + +/* This is the div we use to wrap the react component into a Widget */ +div.jp-ToolbarButton { + color: transparent; + border: none; + box-sizing: border-box; + outline: none; + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; + padding: 0; + margin: 0; +} + +button.jp-ToolbarButtonComponent { + background: var(--jp-layout-color1); + border: none; + box-sizing: border-box; + outline: none; + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; + padding: 0 6px; + margin: 0; + height: 24px; + border-radius: var(--jp-border-radius); + display: flex; + align-items: center; + text-align: center; + font-size: 14px; + min-width: unset; + min-height: unset; +} + +button.jp-ToolbarButtonComponent:disabled { + opacity: 0.4; +} + +button.jp-ToolbarButtonComponent > span { + padding: 0; + flex: 0 0 auto; +} + +button.jp-ToolbarButtonComponent .jp-ToolbarButtonComponent-label { + font-size: var(--jp-ui-font-size1); + line-height: 100%; + padding-left: 2px; + color: var(--jp-ui-font-color1); + font-family: var(--jp-ui-font-family); +} + +#jp-main-dock-panel[data-mode='single-document'] + .jp-MainAreaWidget + > .jp-Toolbar.jp-Toolbar-micro { + padding: 0; + min-height: 0; +} + +#jp-main-dock-panel[data-mode='single-document'] + .jp-MainAreaWidget + > .jp-Toolbar { + border: none; + box-shadow: none; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +.jp-WindowedPanel-outer { + position: relative; + overflow-y: auto; +} + +.jp-WindowedPanel-inner { + position: relative; +} + +.jp-WindowedPanel-window { + position: absolute; + left: 0; + right: 0; + overflow: visible; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/* Sibling imports */ + +body { + color: var(--jp-ui-font-color1); + font-size: var(--jp-ui-font-size1); +} + +/* Disable native link decoration styles everywhere outside of dialog boxes */ +a { + text-decoration: unset; + color: unset; +} + +a:hover { + text-decoration: unset; + color: unset; +} + +/* Accessibility for links inside dialog box text */ +.jp-Dialog-content a { + text-decoration: revert; + color: var(--jp-content-link-color); +} + +.jp-Dialog-content a:hover { + text-decoration: revert; +} + +/* Styles for ui-components */ +.jp-Button { + color: var(--jp-ui-font-color2); + border-radius: var(--jp-border-radius); + padding: 0 12px; + font-size: var(--jp-ui-font-size1); + + /* Copy from blueprint 3 */ + display: inline-flex; + flex-direction: row; + border: none; + cursor: pointer; + align-items: center; + justify-content: center; + text-align: left; + vertical-align: middle; + min-height: 30px; + min-width: 30px; +} + +.jp-Button:disabled { + cursor: not-allowed; +} + +.jp-Button:empty { + padding: 0 !important; +} + +.jp-Button.jp-mod-small { + min-height: 24px; + min-width: 24px; + font-size: 12px; + padding: 0 7px; +} + +/* Use our own theme for hover styles */ +.jp-Button.jp-mod-minimal:hover { + background-color: var(--jp-layout-color2); +} + +.jp-Button.jp-mod-minimal { + background: none; +} + +.jp-InputGroup { + display: block; + position: relative; +} + +.jp-InputGroup input { + box-sizing: border-box; + border: none; + border-radius: 0; + background-color: transparent; + color: var(--jp-ui-font-color0); + box-shadow: inset 0 0 0 var(--jp-border-width) var(--jp-input-border-color); + padding-bottom: 0; + padding-top: 0; + padding-left: 10px; + padding-right: 28px; + position: relative; + width: 100%; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + font-size: 14px; + font-weight: 400; + height: 30px; + line-height: 30px; + outline: none; + vertical-align: middle; +} + +.jp-InputGroup input:focus { + box-shadow: inset 0 0 0 var(--jp-border-width) + var(--jp-input-active-box-shadow-color), + inset 0 0 0 3px var(--jp-input-active-box-shadow-color); +} + +.jp-InputGroup input:disabled { + cursor: not-allowed; + resize: block; + background-color: var(--jp-layout-color2); + color: var(--jp-ui-font-color2); +} + +.jp-InputGroup input:disabled ~ span { + cursor: not-allowed; + color: var(--jp-ui-font-color2); +} + +.jp-InputGroup input::placeholder, +input::placeholder { + color: var(--jp-ui-font-color2); +} + +.jp-InputGroupAction { + position: absolute; + bottom: 1px; + right: 0; + padding: 6px; +} + +.jp-HTMLSelect.jp-DefaultStyle select { + background-color: initial; + border: none; + border-radius: 0; + box-shadow: none; + color: var(--jp-ui-font-color0); + display: block; + font-size: var(--jp-ui-font-size1); + font-family: var(--jp-ui-font-family); + height: 24px; + line-height: 14px; + padding: 0 25px 0 10px; + text-align: left; + -moz-appearance: none; + -webkit-appearance: none; +} + +.jp-HTMLSelect.jp-DefaultStyle select:disabled { + background-color: var(--jp-layout-color2); + color: var(--jp-ui-font-color2); + cursor: not-allowed; + resize: block; +} + +.jp-HTMLSelect.jp-DefaultStyle select:disabled ~ span { + cursor: not-allowed; +} + +/* Use our own theme for hover and option styles */ +/* stylelint-disable-next-line selector-max-type */ +.jp-HTMLSelect.jp-DefaultStyle select:hover, +.jp-HTMLSelect.jp-DefaultStyle select > option { + background-color: var(--jp-layout-color2); + color: var(--jp-ui-font-color0); +} + +select { + box-sizing: border-box; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Styles +|----------------------------------------------------------------------------*/ + +.jp-StatusBar-Widget { + display: flex; + align-items: center; + background: var(--jp-layout-color2); + min-height: var(--jp-statusbar-height); + justify-content: space-between; + padding: 0 10px; +} + +.jp-StatusBar-Left { + display: flex; + align-items: center; + flex-direction: row; +} + +.jp-StatusBar-Middle { + display: flex; + align-items: center; +} + +.jp-StatusBar-Right { + display: flex; + align-items: center; + flex-direction: row-reverse; +} + +.jp-StatusBar-Item { + max-height: var(--jp-statusbar-height); + margin: 0 2px; + height: var(--jp-statusbar-height); + white-space: nowrap; + text-overflow: ellipsis; + color: var(--jp-ui-font-color1); + padding: 0 6px; +} + +.jp-mod-highlighted:hover { + background-color: var(--jp-layout-color3); +} + +.jp-mod-clicked { + background-color: var(--jp-brand-color1); +} + +.jp-mod-clicked:hover { + background-color: var(--jp-brand-color0); +} + +.jp-mod-clicked .jp-StatusBar-TextItem { + color: var(--jp-ui-inverse-font-color1); +} + +.jp-StatusBar-HoverItem { + box-shadow: '0px 4px 4px rgba(0, 0, 0, 0.25)'; +} + +.jp-StatusBar-TextItem { + font-size: var(--jp-ui-font-size1); + font-family: var(--jp-ui-font-family); + line-height: 24px; + color: var(--jp-ui-font-color1); +} + +.jp-StatusBar-GroupItem { + display: flex; + align-items: center; + flex-direction: row; +} + +.jp-Statusbar-ProgressCircle svg { + display: block; + margin: 0 auto; + width: 16px; + height: 24px; + align-self: normal; +} + +.jp-Statusbar-ProgressCircle path { + fill: var(--jp-inverse-layout-color3); +} + +.jp-Statusbar-ProgressBar-progress-bar { + height: 10px; + width: 100px; + border: solid 0.25px var(--jp-brand-color2); + border-radius: 3px; + overflow: hidden; + align-self: center; +} + +.jp-Statusbar-ProgressBar-progress-bar > div { + background-color: var(--jp-brand-color2); + background-image: linear-gradient( + -45deg, + rgba(255, 255, 255, 0.2) 25%, + transparent 25%, + transparent 50%, + rgba(255, 255, 255, 0.2) 50%, + rgba(255, 255, 255, 0.2) 75%, + transparent 75%, + transparent + ); + background-size: 40px 40px; + float: left; + width: 0%; + height: 100%; + font-size: 12px; + line-height: 14px; + color: #fff; + text-align: center; + animation: jp-Statusbar-ExecutionTime-progress-bar 2s linear infinite; +} + +.jp-Statusbar-ProgressBar-progress-bar p { + color: var(--jp-ui-font-color1); + font-family: var(--jp-ui-font-family); + font-size: var(--jp-ui-font-size1); + line-height: 10px; + width: 100px; +} + +@keyframes jp-Statusbar-ExecutionTime-progress-bar { + 0% { + background-position: 0 0; + } + + 100% { + background-position: 40px 40px; + } +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Variables +|----------------------------------------------------------------------------*/ + +:root { + --jp-private-commandpalette-search-height: 28px; +} + +/*----------------------------------------------------------------------------- +| Overall styles +|----------------------------------------------------------------------------*/ + +.lm-CommandPalette { + padding-bottom: 0; + color: var(--jp-ui-font-color1); + background: var(--jp-layout-color1); + + /* This is needed so that all font sizing of children done in ems is + * relative to this base size */ + font-size: var(--jp-ui-font-size1); +} + +/*----------------------------------------------------------------------------- +| Modal variant +|----------------------------------------------------------------------------*/ + +.jp-ModalCommandPalette { + position: absolute; + z-index: 10000; + top: 38px; + left: 30%; + margin: 0; + padding: 4px; + width: 40%; + box-shadow: var(--jp-elevation-z4); + border-radius: 4px; + background: var(--jp-layout-color0); +} + +.jp-ModalCommandPalette .lm-CommandPalette { + max-height: 40vh; +} + +.jp-ModalCommandPalette .lm-CommandPalette .lm-close-icon::after { + display: none; +} + +.jp-ModalCommandPalette .lm-CommandPalette .lm-CommandPalette-header { + display: none; +} + +.jp-ModalCommandPalette .lm-CommandPalette .lm-CommandPalette-item { + margin-left: 4px; + margin-right: 4px; +} + +.jp-ModalCommandPalette + .lm-CommandPalette + .lm-CommandPalette-item.lm-mod-disabled { + display: none; +} + +/*----------------------------------------------------------------------------- +| Search +|----------------------------------------------------------------------------*/ + +.lm-CommandPalette-search { + padding: 4px; + background-color: var(--jp-layout-color1); + z-index: 2; +} + +.lm-CommandPalette-wrapper { + overflow: overlay; + padding: 0 9px; + background-color: var(--jp-input-active-background); + height: 30px; + box-shadow: inset 0 0 0 var(--jp-border-width) var(--jp-input-border-color); +} + +.lm-CommandPalette.lm-mod-focused .lm-CommandPalette-wrapper { + box-shadow: inset 0 0 0 1px var(--jp-input-active-box-shadow-color), + inset 0 0 0 3px var(--jp-input-active-box-shadow-color); +} + +.jp-SearchIconGroup { + color: white; + background-color: var(--jp-brand-color1); + position: absolute; + top: 4px; + right: 4px; + padding: 5px 5px 1px; +} + +.jp-SearchIconGroup svg { + height: 20px; + width: 20px; +} + +.jp-SearchIconGroup .jp-icon3[fill] { + fill: var(--jp-layout-color0); +} + +.lm-CommandPalette-input { + background: transparent; + width: calc(100% - 18px); + float: left; + border: none; + outline: none; + font-size: var(--jp-ui-font-size1); + color: var(--jp-ui-font-color0); + line-height: var(--jp-private-commandpalette-search-height); +} + +.lm-CommandPalette-input::-webkit-input-placeholder, +.lm-CommandPalette-input::-moz-placeholder, +.lm-CommandPalette-input:-ms-input-placeholder { + color: var(--jp-ui-font-color2); + font-size: var(--jp-ui-font-size1); +} + +/*----------------------------------------------------------------------------- +| Results +|----------------------------------------------------------------------------*/ + +.lm-CommandPalette-header:first-child { + margin-top: 0; +} + +.lm-CommandPalette-header { + border-bottom: solid var(--jp-border-width) var(--jp-border-color2); + color: var(--jp-ui-font-color1); + cursor: pointer; + display: flex; + font-size: var(--jp-ui-font-size0); + font-weight: 600; + letter-spacing: 1px; + margin-top: 8px; + padding: 8px 0 8px 12px; + text-transform: uppercase; +} + +.lm-CommandPalette-header.lm-mod-active { + background: var(--jp-layout-color2); +} + +.lm-CommandPalette-header > mark { + background-color: transparent; + font-weight: bold; + color: var(--jp-ui-font-color1); +} + +.lm-CommandPalette-item { + padding: 4px 12px 4px 4px; + color: var(--jp-ui-font-color1); + font-size: var(--jp-ui-font-size1); + font-weight: 400; + display: flex; +} + +.lm-CommandPalette-item.lm-mod-disabled { + color: var(--jp-ui-font-color2); +} + +.lm-CommandPalette-item.lm-mod-active { + color: var(--jp-ui-inverse-font-color1); + background: var(--jp-brand-color1); +} + +.lm-CommandPalette-item.lm-mod-active .lm-CommandPalette-itemLabel > mark { + color: var(--jp-ui-inverse-font-color0); +} + +.lm-CommandPalette-item.lm-mod-active .jp-icon-selectable[fill] { + fill: var(--jp-layout-color0); +} + +.lm-CommandPalette-item.lm-mod-active:hover:not(.lm-mod-disabled) { + color: var(--jp-ui-inverse-font-color1); + background: var(--jp-brand-color1); +} + +.lm-CommandPalette-item:hover:not(.lm-mod-active):not(.lm-mod-disabled) { + background: var(--jp-layout-color2); +} + +.lm-CommandPalette-itemContent { + overflow: hidden; +} + +.lm-CommandPalette-itemLabel > mark { + color: var(--jp-ui-font-color0); + background-color: transparent; + font-weight: bold; +} + +.lm-CommandPalette-item.lm-mod-disabled mark { + color: var(--jp-ui-font-color2); +} + +.lm-CommandPalette-item .lm-CommandPalette-itemIcon { + margin: 0 4px 0 0; + position: relative; + width: 16px; + top: 2px; + flex: 0 0 auto; +} + +.lm-CommandPalette-item.lm-mod-disabled .lm-CommandPalette-itemIcon { + opacity: 0.6; +} + +.lm-CommandPalette-item .lm-CommandPalette-itemShortcut { + flex: 0 0 auto; +} + +.lm-CommandPalette-itemCaption { + display: none; +} + +.lm-CommandPalette-content { + background-color: var(--jp-layout-color1); +} + +.lm-CommandPalette-content:empty::after { + content: 'No results'; + margin: auto; + margin-top: 20px; + width: 100px; + display: block; + font-size: var(--jp-ui-font-size2); + font-family: var(--jp-ui-font-family); + font-weight: lighter; +} + +.lm-CommandPalette-emptyMessage { + text-align: center; + margin-top: 24px; + line-height: 1.32; + padding: 0 8px; + color: var(--jp-content-font-color3); +} + +/*----------------------------------------------------------------------------- +| Copyright (c) 2014-2017, Jupyter Development Team. +| +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-Dialog { + position: absolute; + z-index: 10000; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + top: 0; + left: 0; + margin: 0; + padding: 0; + width: 100%; + height: 100%; + background: var(--jp-dialog-background); +} + +.jp-Dialog-content { + display: flex; + flex-direction: column; + margin-left: auto; + margin-right: auto; + background: var(--jp-layout-color1); + padding: 24px 24px 12px; + min-width: 300px; + min-height: 150px; + max-width: 1000px; + max-height: 500px; + box-sizing: border-box; + box-shadow: var(--jp-elevation-z20); + word-wrap: break-word; + border-radius: var(--jp-border-radius); + + /* This is needed so that all font sizing of children done in ems is + * relative to this base size */ + font-size: var(--jp-ui-font-size1); + color: var(--jp-ui-font-color1); + resize: both; +} + +.jp-Dialog-content.jp-Dialog-content-small { + max-width: 500px; +} + +.jp-Dialog-button { + overflow: visible; +} + +button.jp-Dialog-button:focus { + outline: 1px solid var(--jp-brand-color1); + outline-offset: 4px; + -moz-outline-radius: 0; +} + +button.jp-Dialog-button:focus::-moz-focus-inner { + border: 0; +} + +button.jp-Dialog-button.jp-mod-styled.jp-mod-accept:focus, +button.jp-Dialog-button.jp-mod-styled.jp-mod-warn:focus, +button.jp-Dialog-button.jp-mod-styled.jp-mod-reject:focus { + outline-offset: 4px; + -moz-outline-radius: 0; +} + +button.jp-Dialog-button.jp-mod-styled.jp-mod-accept:focus { + outline: 1px solid var(--jp-accept-color-normal, var(--jp-brand-color1)); +} + +button.jp-Dialog-button.jp-mod-styled.jp-mod-warn:focus { + outline: 1px solid var(--jp-warn-color-normal, var(--jp-error-color1)); +} + +button.jp-Dialog-button.jp-mod-styled.jp-mod-reject:focus { + outline: 1px solid var(--jp-reject-color-normal, var(--md-grey-600)); +} + +button.jp-Dialog-close-button { + padding: 0; + height: 100%; + min-width: unset; + min-height: unset; +} + +.jp-Dialog-header { + display: flex; + justify-content: space-between; + flex: 0 0 auto; + padding-bottom: 12px; + font-size: var(--jp-ui-font-size3); + font-weight: 400; + color: var(--jp-ui-font-color1); +} + +.jp-Dialog-body { + display: flex; + flex-direction: column; + flex: 1 1 auto; + font-size: var(--jp-ui-font-size1); + background: var(--jp-layout-color1); + color: var(--jp-ui-font-color1); + overflow: auto; +} + +.jp-Dialog-footer { + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: center; + flex: 0 0 auto; + margin-left: -12px; + margin-right: -12px; + padding: 12px; +} + +.jp-Dialog-checkbox { + padding-right: 5px; +} + +.jp-Dialog-checkbox > input:focus-visible { + outline: 1px solid var(--jp-input-active-border-color); + outline-offset: 1px; +} + +.jp-Dialog-spacer { + flex: 1 1 auto; +} + +.jp-Dialog-title { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.jp-Dialog-body > .jp-select-wrapper { + width: 100%; +} + +.jp-Dialog-body > button { + padding: 0 16px; +} + +.jp-Dialog-body > label { + line-height: 1.4; + color: var(--jp-ui-font-color0); +} + +.jp-Dialog-button.jp-mod-styled:not(:last-child) { + margin-right: 12px; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +.jp-Input-Boolean-Dialog { + flex-direction: row-reverse; + align-items: end; + width: 100%; +} + +.jp-Input-Boolean-Dialog > label { + flex: 1 1 auto; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) 2014-2016, Jupyter Development Team. +| +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-MainAreaWidget > :focus { + outline: none; +} + +.jp-MainAreaWidget .jp-MainAreaWidget-error { + padding: 6px; +} + +.jp-MainAreaWidget .jp-MainAreaWidget-error > pre { + width: auto; + padding: 10px; + background: var(--jp-error-color3); + border: var(--jp-border-width) solid var(--jp-error-color1); + border-radius: var(--jp-border-radius); + color: var(--jp-ui-font-color1); + font-size: var(--jp-ui-font-size1); + white-space: pre-wrap; + word-wrap: break-word; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/** + * google-material-color v1.2.6 + * https://github.com/danlevan/google-material-color + */ +:root { + --md-red-50: #ffebee; + --md-red-100: #ffcdd2; + --md-red-200: #ef9a9a; + --md-red-300: #e57373; + --md-red-400: #ef5350; + --md-red-500: #f44336; + --md-red-600: #e53935; + --md-red-700: #d32f2f; + --md-red-800: #c62828; + --md-red-900: #b71c1c; + --md-red-A100: #ff8a80; + --md-red-A200: #ff5252; + --md-red-A400: #ff1744; + --md-red-A700: #d50000; + --md-pink-50: #fce4ec; + --md-pink-100: #f8bbd0; + --md-pink-200: #f48fb1; + --md-pink-300: #f06292; + --md-pink-400: #ec407a; + --md-pink-500: #e91e63; + --md-pink-600: #d81b60; + --md-pink-700: #c2185b; + --md-pink-800: #ad1457; + --md-pink-900: #880e4f; + --md-pink-A100: #ff80ab; + --md-pink-A200: #ff4081; + --md-pink-A400: #f50057; + --md-pink-A700: #c51162; + --md-purple-50: #f3e5f5; + --md-purple-100: #e1bee7; + --md-purple-200: #ce93d8; + --md-purple-300: #ba68c8; + --md-purple-400: #ab47bc; + --md-purple-500: #9c27b0; + --md-purple-600: #8e24aa; + --md-purple-700: #7b1fa2; + --md-purple-800: #6a1b9a; + --md-purple-900: #4a148c; + --md-purple-A100: #ea80fc; + --md-purple-A200: #e040fb; + --md-purple-A400: #d500f9; + --md-purple-A700: #a0f; + --md-deep-purple-50: #ede7f6; + --md-deep-purple-100: #d1c4e9; + --md-deep-purple-200: #b39ddb; + --md-deep-purple-300: #9575cd; + --md-deep-purple-400: #7e57c2; + --md-deep-purple-500: #673ab7; + --md-deep-purple-600: #5e35b1; + --md-deep-purple-700: #512da8; + --md-deep-purple-800: #4527a0; + --md-deep-purple-900: #311b92; + --md-deep-purple-A100: #b388ff; + --md-deep-purple-A200: #7c4dff; + --md-deep-purple-A400: #651fff; + --md-deep-purple-A700: #6200ea; + --md-indigo-50: #e8eaf6; + --md-indigo-100: #c5cae9; + --md-indigo-200: #9fa8da; + --md-indigo-300: #7986cb; + --md-indigo-400: #5c6bc0; + --md-indigo-500: #3f51b5; + --md-indigo-600: #3949ab; + --md-indigo-700: #303f9f; + --md-indigo-800: #283593; + --md-indigo-900: #1a237e; + --md-indigo-A100: #8c9eff; + --md-indigo-A200: #536dfe; + --md-indigo-A400: #3d5afe; + --md-indigo-A700: #304ffe; + --md-blue-50: #e3f2fd; + --md-blue-100: #bbdefb; + --md-blue-200: #90caf9; + --md-blue-300: #64b5f6; + --md-blue-400: #42a5f5; + --md-blue-500: #2196f3; + --md-blue-600: #1e88e5; + --md-blue-700: #1976d2; + --md-blue-800: #1565c0; + --md-blue-900: #0d47a1; + --md-blue-A100: #82b1ff; + --md-blue-A200: #448aff; + --md-blue-A400: #2979ff; + --md-blue-A700: #2962ff; + --md-light-blue-50: #e1f5fe; + --md-light-blue-100: #b3e5fc; + --md-light-blue-200: #81d4fa; + --md-light-blue-300: #4fc3f7; + --md-light-blue-400: #29b6f6; + --md-light-blue-500: #03a9f4; + --md-light-blue-600: #039be5; + --md-light-blue-700: #0288d1; + --md-light-blue-800: #0277bd; + --md-light-blue-900: #01579b; + --md-light-blue-A100: #80d8ff; + --md-light-blue-A200: #40c4ff; + --md-light-blue-A400: #00b0ff; + --md-light-blue-A700: #0091ea; + --md-cyan-50: #e0f7fa; + --md-cyan-100: #b2ebf2; + --md-cyan-200: #80deea; + --md-cyan-300: #4dd0e1; + --md-cyan-400: #26c6da; + --md-cyan-500: #00bcd4; + --md-cyan-600: #00acc1; + --md-cyan-700: #0097a7; + --md-cyan-800: #00838f; + --md-cyan-900: #006064; + --md-cyan-A100: #84ffff; + --md-cyan-A200: #18ffff; + --md-cyan-A400: #00e5ff; + --md-cyan-A700: #00b8d4; + --md-teal-50: #e0f2f1; + --md-teal-100: #b2dfdb; + --md-teal-200: #80cbc4; + --md-teal-300: #4db6ac; + --md-teal-400: #26a69a; + --md-teal-500: #009688; + --md-teal-600: #00897b; + --md-teal-700: #00796b; + --md-teal-800: #00695c; + --md-teal-900: #004d40; + --md-teal-A100: #a7ffeb; + --md-teal-A200: #64ffda; + --md-teal-A400: #1de9b6; + --md-teal-A700: #00bfa5; + --md-green-50: #e8f5e9; + --md-green-100: #c8e6c9; + --md-green-200: #a5d6a7; + --md-green-300: #81c784; + --md-green-400: #66bb6a; + --md-green-500: #4caf50; + --md-green-600: #43a047; + --md-green-700: #388e3c; + --md-green-800: #2e7d32; + --md-green-900: #1b5e20; + --md-green-A100: #b9f6ca; + --md-green-A200: #69f0ae; + --md-green-A400: #00e676; + --md-green-A700: #00c853; + --md-light-green-50: #f1f8e9; + --md-light-green-100: #dcedc8; + --md-light-green-200: #c5e1a5; + --md-light-green-300: #aed581; + --md-light-green-400: #9ccc65; + --md-light-green-500: #8bc34a; + --md-light-green-600: #7cb342; + --md-light-green-700: #689f38; + --md-light-green-800: #558b2f; + --md-light-green-900: #33691e; + --md-light-green-A100: #ccff90; + --md-light-green-A200: #b2ff59; + --md-light-green-A400: #76ff03; + --md-light-green-A700: #64dd17; + --md-lime-50: #f9fbe7; + --md-lime-100: #f0f4c3; + --md-lime-200: #e6ee9c; + --md-lime-300: #dce775; + --md-lime-400: #d4e157; + --md-lime-500: #cddc39; + --md-lime-600: #c0ca33; + --md-lime-700: #afb42b; + --md-lime-800: #9e9d24; + --md-lime-900: #827717; + --md-lime-A100: #f4ff81; + --md-lime-A200: #eeff41; + --md-lime-A400: #c6ff00; + --md-lime-A700: #aeea00; + --md-yellow-50: #fffde7; + --md-yellow-100: #fff9c4; + --md-yellow-200: #fff59d; + --md-yellow-300: #fff176; + --md-yellow-400: #ffee58; + --md-yellow-500: #ffeb3b; + --md-yellow-600: #fdd835; + --md-yellow-700: #fbc02d; + --md-yellow-800: #f9a825; + --md-yellow-900: #f57f17; + --md-yellow-A100: #ffff8d; + --md-yellow-A200: #ff0; + --md-yellow-A400: #ffea00; + --md-yellow-A700: #ffd600; + --md-amber-50: #fff8e1; + --md-amber-100: #ffecb3; + --md-amber-200: #ffe082; + --md-amber-300: #ffd54f; + --md-amber-400: #ffca28; + --md-amber-500: #ffc107; + --md-amber-600: #ffb300; + --md-amber-700: #ffa000; + --md-amber-800: #ff8f00; + --md-amber-900: #ff6f00; + --md-amber-A100: #ffe57f; + --md-amber-A200: #ffd740; + --md-amber-A400: #ffc400; + --md-amber-A700: #ffab00; + --md-orange-50: #fff3e0; + --md-orange-100: #ffe0b2; + --md-orange-200: #ffcc80; + --md-orange-300: #ffb74d; + --md-orange-400: #ffa726; + --md-orange-500: #ff9800; + --md-orange-600: #fb8c00; + --md-orange-700: #f57c00; + --md-orange-800: #ef6c00; + --md-orange-900: #e65100; + --md-orange-A100: #ffd180; + --md-orange-A200: #ffab40; + --md-orange-A400: #ff9100; + --md-orange-A700: #ff6d00; + --md-deep-orange-50: #fbe9e7; + --md-deep-orange-100: #ffccbc; + --md-deep-orange-200: #ffab91; + --md-deep-orange-300: #ff8a65; + --md-deep-orange-400: #ff7043; + --md-deep-orange-500: #ff5722; + --md-deep-orange-600: #f4511e; + --md-deep-orange-700: #e64a19; + --md-deep-orange-800: #d84315; + --md-deep-orange-900: #bf360c; + --md-deep-orange-A100: #ff9e80; + --md-deep-orange-A200: #ff6e40; + --md-deep-orange-A400: #ff3d00; + --md-deep-orange-A700: #dd2c00; + --md-brown-50: #efebe9; + --md-brown-100: #d7ccc8; + --md-brown-200: #bcaaa4; + --md-brown-300: #a1887f; + --md-brown-400: #8d6e63; + --md-brown-500: #795548; + --md-brown-600: #6d4c41; + --md-brown-700: #5d4037; + --md-brown-800: #4e342e; + --md-brown-900: #3e2723; + --md-grey-50: #fafafa; + --md-grey-100: #f5f5f5; + --md-grey-200: #eee; + --md-grey-300: #e0e0e0; + --md-grey-400: #bdbdbd; + --md-grey-500: #9e9e9e; + --md-grey-600: #757575; + --md-grey-700: #616161; + --md-grey-800: #424242; + --md-grey-900: #212121; + --md-blue-grey-50: #eceff1; + --md-blue-grey-100: #cfd8dc; + --md-blue-grey-200: #b0bec5; + --md-blue-grey-300: #90a4ae; + --md-blue-grey-400: #78909c; + --md-blue-grey-500: #607d8b; + --md-blue-grey-600: #546e7a; + --md-blue-grey-700: #455a64; + --md-blue-grey-800: #37474f; + --md-blue-grey-900: #263238; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) 2014-2017, Jupyter Development Team. +| +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| RenderedText +|----------------------------------------------------------------------------*/ + +:root { + /* This is the padding value to fill the gaps between lines containing spans with background color. */ + --jp-private-code-span-padding: calc( + (var(--jp-code-line-height) - 1) * var(--jp-code-font-size) / 2 + ); +} + +.jp-RenderedText { + text-align: left; + padding-left: var(--jp-code-padding); + line-height: var(--jp-code-line-height); + font-family: var(--jp-code-font-family); +} + +.jp-RenderedText pre, +.jp-RenderedJavaScript pre, +.jp-RenderedHTMLCommon pre { + color: var(--jp-content-font-color1); + font-size: var(--jp-code-font-size); + border: none; + margin: 0; + padding: 0; +} + +.jp-RenderedText pre a:link { + text-decoration: none; + color: var(--jp-content-link-color); +} + +.jp-RenderedText pre a:hover { + text-decoration: underline; + color: var(--jp-content-link-color); +} + +.jp-RenderedText pre a:visited { + text-decoration: none; + color: var(--jp-content-link-color); +} + +/* console foregrounds and backgrounds */ +.jp-RenderedText pre .ansi-black-fg { + color: #3e424d; +} + +.jp-RenderedText pre .ansi-red-fg { + color: #e75c58; +} + +.jp-RenderedText pre .ansi-green-fg { + color: #00a250; +} + +.jp-RenderedText pre .ansi-yellow-fg { + color: #ddb62b; +} + +.jp-RenderedText pre .ansi-blue-fg { + color: #208ffb; +} + +.jp-RenderedText pre .ansi-magenta-fg { + color: #d160c4; +} + +.jp-RenderedText pre .ansi-cyan-fg { + color: #60c6c8; +} + +.jp-RenderedText pre .ansi-white-fg { + color: #c5c1b4; +} + +.jp-RenderedText pre .ansi-black-bg { + background-color: #3e424d; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-red-bg { + background-color: #e75c58; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-green-bg { + background-color: #00a250; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-yellow-bg { + background-color: #ddb62b; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-blue-bg { + background-color: #208ffb; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-magenta-bg { + background-color: #d160c4; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-cyan-bg { + background-color: #60c6c8; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-white-bg { + background-color: #c5c1b4; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-black-intense-fg { + color: #282c36; +} + +.jp-RenderedText pre .ansi-red-intense-fg { + color: #b22b31; +} + +.jp-RenderedText pre .ansi-green-intense-fg { + color: #007427; +} + +.jp-RenderedText pre .ansi-yellow-intense-fg { + color: #b27d12; +} + +.jp-RenderedText pre .ansi-blue-intense-fg { + color: #0065ca; +} + +.jp-RenderedText pre .ansi-magenta-intense-fg { + color: #a03196; +} + +.jp-RenderedText pre .ansi-cyan-intense-fg { + color: #258f8f; +} + +.jp-RenderedText pre .ansi-white-intense-fg { + color: #a1a6b2; +} + +.jp-RenderedText pre .ansi-black-intense-bg { + background-color: #282c36; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-red-intense-bg { + background-color: #b22b31; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-green-intense-bg { + background-color: #007427; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-yellow-intense-bg { + background-color: #b27d12; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-blue-intense-bg { + background-color: #0065ca; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-magenta-intense-bg { + background-color: #a03196; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-cyan-intense-bg { + background-color: #258f8f; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-white-intense-bg { + background-color: #a1a6b2; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-default-inverse-fg { + color: var(--jp-ui-inverse-font-color0); +} + +.jp-RenderedText pre .ansi-default-inverse-bg { + background-color: var(--jp-inverse-layout-color0); + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-bold { + font-weight: bold; +} + +.jp-RenderedText pre .ansi-underline { + text-decoration: underline; +} + +.jp-RenderedText[data-mime-type='application/vnd.jupyter.stderr'] { + background: var(--jp-rendermime-error-background); + padding-top: var(--jp-code-padding); +} + +/*----------------------------------------------------------------------------- +| RenderedLatex +|----------------------------------------------------------------------------*/ + +.jp-RenderedLatex { + color: var(--jp-content-font-color1); + font-size: var(--jp-content-font-size1); + line-height: var(--jp-content-line-height); +} + +/* Left-justify outputs.*/ +.jp-OutputArea-output.jp-RenderedLatex { + padding: var(--jp-code-padding); + text-align: left; +} + +/*----------------------------------------------------------------------------- +| RenderedHTML +|----------------------------------------------------------------------------*/ + +.jp-RenderedHTMLCommon { + color: var(--jp-content-font-color1); + font-family: var(--jp-content-font-family); + font-size: var(--jp-content-font-size1); + line-height: var(--jp-content-line-height); + + /* Give a bit more R padding on Markdown text to keep line lengths reasonable */ + padding-right: 20px; +} + +.jp-RenderedHTMLCommon em { + font-style: italic; +} + +.jp-RenderedHTMLCommon strong { + font-weight: bold; +} + +.jp-RenderedHTMLCommon u { + text-decoration: underline; +} + +.jp-RenderedHTMLCommon a:link { + text-decoration: none; + color: var(--jp-content-link-color); +} + +.jp-RenderedHTMLCommon a:hover { + text-decoration: underline; + color: var(--jp-content-link-color); +} + +.jp-RenderedHTMLCommon a:visited { + text-decoration: none; + color: var(--jp-content-link-color); +} + +/* Headings */ + +.jp-RenderedHTMLCommon h1, +.jp-RenderedHTMLCommon h2, +.jp-RenderedHTMLCommon h3, +.jp-RenderedHTMLCommon h4, +.jp-RenderedHTMLCommon h5, +.jp-RenderedHTMLCommon h6 { + line-height: var(--jp-content-heading-line-height); + font-weight: var(--jp-content-heading-font-weight); + font-style: normal; + margin: var(--jp-content-heading-margin-top) 0 + var(--jp-content-heading-margin-bottom) 0; +} + +.jp-RenderedHTMLCommon h1:first-child, +.jp-RenderedHTMLCommon h2:first-child, +.jp-RenderedHTMLCommon h3:first-child, +.jp-RenderedHTMLCommon h4:first-child, +.jp-RenderedHTMLCommon h5:first-child, +.jp-RenderedHTMLCommon h6:first-child { + margin-top: calc(0.5 * var(--jp-content-heading-margin-top)); +} + +.jp-RenderedHTMLCommon h1:last-child, +.jp-RenderedHTMLCommon h2:last-child, +.jp-RenderedHTMLCommon h3:last-child, +.jp-RenderedHTMLCommon h4:last-child, +.jp-RenderedHTMLCommon h5:last-child, +.jp-RenderedHTMLCommon h6:last-child { + margin-bottom: calc(0.5 * var(--jp-content-heading-margin-bottom)); +} + +.jp-RenderedHTMLCommon h1 { + font-size: var(--jp-content-font-size5); +} + +.jp-RenderedHTMLCommon h2 { + font-size: var(--jp-content-font-size4); +} + +.jp-RenderedHTMLCommon h3 { + font-size: var(--jp-content-font-size3); +} + +.jp-RenderedHTMLCommon h4 { + font-size: var(--jp-content-font-size2); +} + +.jp-RenderedHTMLCommon h5 { + font-size: var(--jp-content-font-size1); +} + +.jp-RenderedHTMLCommon h6 { + font-size: var(--jp-content-font-size0); +} + +/* Lists */ + +/* stylelint-disable selector-max-type, selector-max-compound-selectors */ + +.jp-RenderedHTMLCommon ul:not(.list-inline), +.jp-RenderedHTMLCommon ol:not(.list-inline) { + padding-left: 2em; +} + +.jp-RenderedHTMLCommon ul { + list-style: disc; +} + +.jp-RenderedHTMLCommon ul ul { + list-style: square; +} + +.jp-RenderedHTMLCommon ul ul ul { + list-style: circle; +} + +.jp-RenderedHTMLCommon ol { + list-style: decimal; +} + +.jp-RenderedHTMLCommon ol ol { + list-style: upper-alpha; +} + +.jp-RenderedHTMLCommon ol ol ol { + list-style: lower-alpha; +} + +.jp-RenderedHTMLCommon ol ol ol ol { + list-style: lower-roman; +} + +.jp-RenderedHTMLCommon ol ol ol ol ol { + list-style: decimal; +} + +.jp-RenderedHTMLCommon ol, +.jp-RenderedHTMLCommon ul { + margin-bottom: 1em; +} + +.jp-RenderedHTMLCommon ul ul, +.jp-RenderedHTMLCommon ul ol, +.jp-RenderedHTMLCommon ol ul, +.jp-RenderedHTMLCommon ol ol { + margin-bottom: 0; +} + +/* stylelint-enable selector-max-type, selector-max-compound-selectors */ + +.jp-RenderedHTMLCommon hr { + color: var(--jp-border-color2); + background-color: var(--jp-border-color1); + margin-top: 1em; + margin-bottom: 1em; +} + +.jp-RenderedHTMLCommon > pre { + margin: 1.5em 2em; +} + +.jp-RenderedHTMLCommon pre, +.jp-RenderedHTMLCommon code { + border: 0; + background-color: var(--jp-layout-color0); + color: var(--jp-content-font-color1); + font-family: var(--jp-code-font-family); + font-size: inherit; + line-height: var(--jp-code-line-height); + padding: 0; + white-space: pre-wrap; +} + +.jp-RenderedHTMLCommon :not(pre) > code { + background-color: var(--jp-layout-color2); + padding: 1px 5px; +} + +/* Tables */ + +.jp-RenderedHTMLCommon table { + border-collapse: collapse; + border-spacing: 0; + border: none; + color: var(--jp-ui-font-color1); + font-size: var(--jp-ui-font-size1); + table-layout: fixed; + margin-left: auto; + margin-bottom: 1em; + margin-right: auto; +} + +.jp-RenderedHTMLCommon thead { + border-bottom: var(--jp-border-width) solid var(--jp-border-color1); + vertical-align: bottom; +} + +.jp-RenderedHTMLCommon td, +.jp-RenderedHTMLCommon th, +.jp-RenderedHTMLCommon tr { + vertical-align: middle; + padding: 0.5em; + line-height: normal; + white-space: normal; + max-width: none; + border: none; +} + +.jp-RenderedMarkdown.jp-RenderedHTMLCommon td, +.jp-RenderedMarkdown.jp-RenderedHTMLCommon th { + max-width: none; +} + +:not(.jp-RenderedMarkdown).jp-RenderedHTMLCommon td, +:not(.jp-RenderedMarkdown).jp-RenderedHTMLCommon th, +:not(.jp-RenderedMarkdown).jp-RenderedHTMLCommon tr { + text-align: right; +} + +.jp-RenderedHTMLCommon th { + font-weight: bold; +} + +.jp-RenderedHTMLCommon tbody tr:nth-child(odd) { + background: var(--jp-layout-color0); +} + +.jp-RenderedHTMLCommon tbody tr:nth-child(even) { + background: var(--jp-rendermime-table-row-background); +} + +.jp-RenderedHTMLCommon tbody tr:hover { + background: var(--jp-rendermime-table-row-hover-background); +} + +.jp-RenderedHTMLCommon p { + text-align: left; + margin: 0; + margin-bottom: 1em; +} + +.jp-RenderedHTMLCommon img { + -moz-force-broken-image-icon: 1; +} + +/* Restrict to direct children as other images could be nested in other content. */ +.jp-RenderedHTMLCommon > img { + display: block; + margin-left: 0; + margin-right: 0; + margin-bottom: 1em; +} + +/* Change color behind transparent images if they need it... */ +[data-jp-theme-light='false'] .jp-RenderedImage img.jp-needs-light-background { + background-color: var(--jp-inverse-layout-color1); +} + +[data-jp-theme-light='true'] .jp-RenderedImage img.jp-needs-dark-background { + background-color: var(--jp-inverse-layout-color1); +} + +.jp-RenderedHTMLCommon img, +.jp-RenderedImage img, +.jp-RenderedHTMLCommon svg, +.jp-RenderedSVG svg { + max-width: 100%; + height: auto; +} + +.jp-RenderedHTMLCommon img.jp-mod-unconfined, +.jp-RenderedImage img.jp-mod-unconfined, +.jp-RenderedHTMLCommon svg.jp-mod-unconfined, +.jp-RenderedSVG svg.jp-mod-unconfined { + max-width: none; +} + +.jp-RenderedHTMLCommon .alert { + padding: var(--jp-notebook-padding); + border: var(--jp-border-width) solid transparent; + border-radius: var(--jp-border-radius); + margin-bottom: 1em; +} + +.jp-RenderedHTMLCommon .alert-info { + color: var(--jp-info-color0); + background-color: var(--jp-info-color3); + border-color: var(--jp-info-color2); +} + +.jp-RenderedHTMLCommon .alert-info hr { + border-color: var(--jp-info-color3); +} + +.jp-RenderedHTMLCommon .alert-info > p:last-child, +.jp-RenderedHTMLCommon .alert-info > ul:last-child { + margin-bottom: 0; +} + +.jp-RenderedHTMLCommon .alert-warning { + color: var(--jp-warn-color0); + background-color: var(--jp-warn-color3); + border-color: var(--jp-warn-color2); +} + +.jp-RenderedHTMLCommon .alert-warning hr { + border-color: var(--jp-warn-color3); +} + +.jp-RenderedHTMLCommon .alert-warning > p:last-child, +.jp-RenderedHTMLCommon .alert-warning > ul:last-child { + margin-bottom: 0; +} + +.jp-RenderedHTMLCommon .alert-success { + color: var(--jp-success-color0); + background-color: var(--jp-success-color3); + border-color: var(--jp-success-color2); +} + +.jp-RenderedHTMLCommon .alert-success hr { + border-color: var(--jp-success-color3); +} + +.jp-RenderedHTMLCommon .alert-success > p:last-child, +.jp-RenderedHTMLCommon .alert-success > ul:last-child { + margin-bottom: 0; +} + +.jp-RenderedHTMLCommon .alert-danger { + color: var(--jp-error-color0); + background-color: var(--jp-error-color3); + border-color: var(--jp-error-color2); +} + +.jp-RenderedHTMLCommon .alert-danger hr { + border-color: var(--jp-error-color3); +} + +.jp-RenderedHTMLCommon .alert-danger > p:last-child, +.jp-RenderedHTMLCommon .alert-danger > ul:last-child { + margin-bottom: 0; +} + +.jp-RenderedHTMLCommon blockquote { + margin: 1em 2em; + padding: 0 1em; + border-left: 5px solid var(--jp-border-color2); +} + +a.jp-InternalAnchorLink { + visibility: hidden; + margin-left: 8px; + color: var(--md-blue-800); +} + +h1:hover .jp-InternalAnchorLink, +h2:hover .jp-InternalAnchorLink, +h3:hover .jp-InternalAnchorLink, +h4:hover .jp-InternalAnchorLink, +h5:hover .jp-InternalAnchorLink, +h6:hover .jp-InternalAnchorLink { + visibility: visible; +} + +.jp-RenderedHTMLCommon kbd { + background-color: var(--jp-rendermime-table-row-background); + border: 1px solid var(--jp-border-color0); + border-bottom-color: var(--jp-border-color2); + border-radius: 3px; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); + display: inline-block; + font-size: var(--jp-ui-font-size0); + line-height: 1em; + padding: 0.2em 0.5em; +} + +/* Most direct children of .jp-RenderedHTMLCommon have a margin-bottom of 1.0. + * At the bottom of cells this is a bit too much as there is also spacing + * between cells. Going all the way to 0 gets too tight between markdown and + * code cells. + */ +.jp-RenderedHTMLCommon > *:last-child { + margin-bottom: 0.5em; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-cursor-backdrop { + position: fixed; + width: 200px; + height: 200px; + margin-top: -100px; + margin-left: -100px; + will-change: transform; + z-index: 100; +} + +.lm-mod-drag-image { + will-change: transform; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +.jp-lineFormSearch { + padding: 4px 12px; + background-color: var(--jp-layout-color2); + box-shadow: var(--jp-toolbar-box-shadow); + z-index: 2; + font-size: var(--jp-ui-font-size1); +} + +.jp-lineFormCaption { + font-size: var(--jp-ui-font-size0); + line-height: var(--jp-ui-font-size1); + margin-top: 4px; + color: var(--jp-ui-font-color0); +} + +.jp-baseLineForm { + border: none; + border-radius: 0; + position: absolute; + background-size: 16px; + background-repeat: no-repeat; + background-position: center; + outline: none; +} + +.jp-lineFormButtonContainer { + top: 4px; + right: 8px; + height: 24px; + padding: 0 12px; + width: 12px; +} + +.jp-lineFormButtonIcon { + top: 0; + right: 0; + background-color: var(--jp-brand-color1); + height: 100%; + width: 100%; + box-sizing: border-box; + padding: 4px 6px; +} + +.jp-lineFormButton { + top: 0; + right: 0; + background-color: transparent; + height: 100%; + width: 100%; + box-sizing: border-box; +} + +.jp-lineFormWrapper { + overflow: hidden; + padding: 0 8px; + border: 1px solid var(--jp-border-color0); + background-color: var(--jp-input-active-background); + height: 22px; +} + +.jp-lineFormWrapperFocusWithin { + border: var(--jp-border-width) solid var(--md-blue-500); + box-shadow: inset 0 0 4px var(--md-blue-300); +} + +.jp-lineFormInput { + background: transparent; + width: 200px; + height: 100%; + border: none; + outline: none; + color: var(--jp-ui-font-color0); + line-height: 28px; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) 2014-2016, Jupyter Development Team. +| +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-JSONEditor { + display: flex; + flex-direction: column; + width: 100%; +} + +.jp-JSONEditor-host { + flex: 1 1 auto; + border: var(--jp-border-width) solid var(--jp-input-border-color); + border-radius: 0; + background: var(--jp-layout-color0); + min-height: 50px; + padding: 1px; +} + +.jp-JSONEditor.jp-mod-error .jp-JSONEditor-host { + border-color: red; + outline-color: red; +} + +.jp-JSONEditor-header { + display: flex; + flex: 1 0 auto; + padding: 0 0 0 12px; +} + +.jp-JSONEditor-header label { + flex: 0 0 auto; +} + +.jp-JSONEditor-commitButton { + height: 16px; + width: 16px; + background-size: 18px; + background-repeat: no-repeat; + background-position: center; +} + +.jp-JSONEditor-host.jp-mod-focused { + background-color: var(--jp-input-active-background); + border: 1px solid var(--jp-input-active-border-color); + box-shadow: var(--jp-input-box-shadow); +} + +.jp-Editor.jp-mod-dropTarget { + border: var(--jp-border-width) solid var(--jp-input-active-border-color); + box-shadow: var(--jp-input-box-shadow); +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ +.jp-DocumentSearch-input { + border: none; + outline: none; + color: var(--jp-ui-font-color0); + font-size: var(--jp-ui-font-size1); + background-color: var(--jp-layout-color0); + font-family: var(--jp-ui-font-family); + padding: 2px 1px; + resize: none; +} + +.jp-DocumentSearch-overlay { + position: absolute; + background-color: var(--jp-toolbar-background); + border-bottom: var(--jp-border-width) solid var(--jp-toolbar-border-color); + border-left: var(--jp-border-width) solid var(--jp-toolbar-border-color); + top: 0; + right: 0; + z-index: 7; + min-width: 405px; + padding: 2px; + font-size: var(--jp-ui-font-size1); + + --jp-private-document-search-button-height: 20px; +} + +.jp-DocumentSearch-overlay button { + background-color: var(--jp-toolbar-background); + outline: 0; +} + +.jp-DocumentSearch-overlay button:hover { + background-color: var(--jp-layout-color2); +} + +.jp-DocumentSearch-overlay button:active { + background-color: var(--jp-layout-color3); +} + +.jp-DocumentSearch-overlay-row { + display: flex; + align-items: center; + margin-bottom: 2px; +} + +.jp-DocumentSearch-button-content { + display: inline-block; + cursor: pointer; + box-sizing: border-box; + width: 100%; + height: 100%; +} + +.jp-DocumentSearch-button-content svg { + width: 100%; + height: 100%; +} + +.jp-DocumentSearch-input-wrapper { + border: var(--jp-border-width) solid var(--jp-border-color0); + display: flex; + background-color: var(--jp-layout-color0); + margin: 2px; +} + +.jp-DocumentSearch-input-wrapper:focus-within { + border-color: var(--jp-cell-editor-active-border-color); +} + +.jp-DocumentSearch-toggle-wrapper, +.jp-DocumentSearch-button-wrapper { + all: initial; + overflow: hidden; + display: inline-block; + border: none; + box-sizing: border-box; +} + +.jp-DocumentSearch-toggle-wrapper { + width: 14px; + height: 14px; +} + +.jp-DocumentSearch-button-wrapper { + width: var(--jp-private-document-search-button-height); + height: var(--jp-private-document-search-button-height); +} + +.jp-DocumentSearch-toggle-wrapper:focus, +.jp-DocumentSearch-button-wrapper:focus { + outline: var(--jp-border-width) solid + var(--jp-cell-editor-active-border-color); + outline-offset: -1px; +} + +.jp-DocumentSearch-toggle-wrapper, +.jp-DocumentSearch-button-wrapper, +.jp-DocumentSearch-button-content:focus { + outline: none; +} + +.jp-DocumentSearch-toggle-placeholder { + width: 5px; +} + +.jp-DocumentSearch-input-button::before { + display: block; + padding-top: 100%; +} + +.jp-DocumentSearch-input-button-off { + opacity: var(--jp-search-toggle-off-opacity); +} + +.jp-DocumentSearch-input-button-off:hover { + opacity: var(--jp-search-toggle-hover-opacity); +} + +.jp-DocumentSearch-input-button-on { + opacity: var(--jp-search-toggle-on-opacity); +} + +.jp-DocumentSearch-index-counter { + padding-left: 10px; + padding-right: 10px; + user-select: none; + min-width: 35px; + display: inline-block; +} + +.jp-DocumentSearch-up-down-wrapper { + display: inline-block; + padding-right: 2px; + margin-left: auto; + white-space: nowrap; +} + +.jp-DocumentSearch-spacer { + margin-left: auto; +} + +.jp-DocumentSearch-up-down-wrapper button { + outline: 0; + border: none; + width: var(--jp-private-document-search-button-height); + height: var(--jp-private-document-search-button-height); + vertical-align: middle; + margin: 1px 5px 2px; +} + +.jp-DocumentSearch-up-down-button:hover { + background-color: var(--jp-layout-color2); +} + +.jp-DocumentSearch-up-down-button:active { + background-color: var(--jp-layout-color3); +} + +.jp-DocumentSearch-filter-button { + border-radius: var(--jp-border-radius); +} + +.jp-DocumentSearch-filter-button:hover { + background-color: var(--jp-layout-color2); +} + +.jp-DocumentSearch-filter-button-enabled { + background-color: var(--jp-layout-color2); +} + +.jp-DocumentSearch-filter-button-enabled:hover { + background-color: var(--jp-layout-color3); +} + +.jp-DocumentSearch-search-options { + padding: 0 8px; + margin-left: 3px; + width: 100%; + display: grid; + justify-content: start; + grid-template-columns: 1fr 1fr; + align-items: center; + justify-items: stretch; +} + +.jp-DocumentSearch-search-filter-disabled { + color: var(--jp-ui-font-color2); +} + +.jp-DocumentSearch-search-filter { + display: flex; + align-items: center; + user-select: none; +} + +.jp-DocumentSearch-regex-error { + color: var(--jp-error-color0); +} + +.jp-DocumentSearch-replace-button-wrapper { + overflow: hidden; + display: inline-block; + box-sizing: border-box; + border: var(--jp-border-width) solid var(--jp-border-color0); + margin: auto 2px; + padding: 1px 4px; + height: calc(var(--jp-private-document-search-button-height) + 2px); +} + +.jp-DocumentSearch-replace-button-wrapper:focus { + border: var(--jp-border-width) solid var(--jp-cell-editor-active-border-color); +} + +.jp-DocumentSearch-replace-button { + display: inline-block; + text-align: center; + cursor: pointer; + box-sizing: border-box; + color: var(--jp-ui-font-color1); + + /* height - 2 * (padding of wrapper) */ + line-height: calc(var(--jp-private-document-search-button-height) - 2px); + width: 100%; + height: 100%; +} + +.jp-DocumentSearch-replace-button:focus { + outline: none; +} + +.jp-DocumentSearch-replace-wrapper-class { + margin-left: 14px; + display: flex; +} + +.jp-DocumentSearch-replace-toggle { + border: none; + background-color: var(--jp-toolbar-background); + border-radius: var(--jp-border-radius); +} + +.jp-DocumentSearch-replace-toggle:hover { + background-color: var(--jp-layout-color2); +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.cm-editor { + line-height: var(--jp-code-line-height); + font-size: var(--jp-code-font-size); + font-family: var(--jp-code-font-family); + border: 0; + border-radius: 0; + height: auto; + + /* Changed to auto to autogrow */ +} + +.cm-editor pre { + padding: 0 var(--jp-code-padding); +} + +.jp-CodeMirrorEditor[data-type='inline'] .cm-dialog { + background-color: var(--jp-layout-color0); + color: var(--jp-content-font-color1); +} + +.jp-CodeMirrorEditor { + cursor: text; +} + +/* When zoomed out 67% and 33% on a screen of 1440 width x 900 height */ +@media screen and (min-width: 2138px) and (max-width: 4319px) { + .jp-CodeMirrorEditor[data-type='inline'] .cm-cursor { + border-left: var(--jp-code-cursor-width1) solid + var(--jp-editor-cursor-color); + } +} + +/* When zoomed out less than 33% */ +@media screen and (min-width: 4320px) { + .jp-CodeMirrorEditor[data-type='inline'] .cm-cursor { + border-left: var(--jp-code-cursor-width2) solid + var(--jp-editor-cursor-color); + } +} + +.cm-editor.jp-mod-readOnly .cm-cursor { + display: none; +} + +.jp-CollaboratorCursor { + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-top: none; + border-bottom: 3px solid; + background-clip: content-box; + margin-left: -5px; + margin-right: -5px; +} + +.cm-searching, +.cm-searching span { + /* `.cm-searching span`: we need to override syntax highlighting */ + background-color: var(--jp-search-unselected-match-background-color); + color: var(--jp-search-unselected-match-color); +} + +.cm-searching::selection, +.cm-searching span::selection { + background-color: var(--jp-search-unselected-match-background-color); + color: var(--jp-search-unselected-match-color); +} + +.jp-current-match > .cm-searching, +.jp-current-match > .cm-searching span, +.cm-searching > .jp-current-match, +.cm-searching > .jp-current-match span { + background-color: var(--jp-search-selected-match-background-color); + color: var(--jp-search-selected-match-color); +} + +.jp-current-match > .cm-searching::selection, +.cm-searching > .jp-current-match::selection, +.jp-current-match > .cm-searching span::selection { + background-color: var(--jp-search-selected-match-background-color); + color: var(--jp-search-selected-match-color); +} + +.cm-trailingspace { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAsElEQVQIHQGlAFr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7+r3zKmT0/+pk9P/7+r3zAAAAAAAAAAABAAAAAAAAAAA6OPzM+/q9wAAAAAA6OPzMwAAAAAAAAAAAgAAAAAAAAAAGR8NiRQaCgAZIA0AGR8NiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQyoYJ/SY80UAAAAASUVORK5CYII=); + background-position: center left; + background-repeat: repeat-x; +} + +.jp-CollaboratorCursor-hover { + position: absolute; + z-index: 1; + transform: translateX(-50%); + color: white; + border-radius: 3px; + padding-left: 4px; + padding-right: 4px; + padding-top: 1px; + padding-bottom: 1px; + text-align: center; + font-size: var(--jp-ui-font-size1); + white-space: nowrap; +} + +.jp-CodeMirror-ruler { + border-left: 1px dashed var(--jp-border-color2); +} + +/* Styles for shared cursors (remote cursor locations and selected ranges) */ +.jp-CodeMirrorEditor .cm-ySelectionCaret { + position: relative; + border-left: 1px solid black; + margin-left: -1px; + margin-right: -1px; + box-sizing: border-box; +} + +.jp-CodeMirrorEditor .cm-ySelectionCaret > .cm-ySelectionInfo { + white-space: nowrap; + position: absolute; + top: -1.15em; + padding-bottom: 0.05em; + left: -1px; + font-size: 0.95em; + font-family: var(--jp-ui-font-family); + font-weight: bold; + line-height: normal; + user-select: none; + color: white; + padding-left: 2px; + padding-right: 2px; + z-index: 101; + transition: opacity 0.3s ease-in-out; +} + +.jp-CodeMirrorEditor .cm-ySelectionInfo { + transition-delay: 0.7s; + opacity: 0; +} + +.jp-CodeMirrorEditor .cm-ySelectionCaret:hover > .cm-ySelectionInfo { + opacity: 1; + transition-delay: 0s; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-MimeDocument { + outline: none; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Variables +|----------------------------------------------------------------------------*/ + +:root { + --jp-private-filebrowser-button-height: 28px; + --jp-private-filebrowser-button-width: 48px; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-FileBrowser .jp-SidePanel-content { + display: flex; + flex-direction: column; +} + +.jp-FileBrowser-toolbar.jp-Toolbar { + flex-wrap: wrap; + row-gap: 12px; + border-bottom: none; + height: auto; + margin: 8px 12px 0; + box-shadow: none; + padding: 0; + justify-content: flex-start; +} + +.jp-FileBrowser-Panel { + flex: 1 1 auto; + display: flex; + flex-direction: column; +} + +.jp-BreadCrumbs { + flex: 0 0 auto; + margin: 8px 12px; +} + +.jp-BreadCrumbs-item { + margin: 0 2px; + padding: 0 2px; + border-radius: var(--jp-border-radius); + cursor: pointer; +} + +.jp-BreadCrumbs-item:hover { + background-color: var(--jp-layout-color2); +} + +.jp-BreadCrumbs-item:first-child { + margin-left: 0; +} + +.jp-BreadCrumbs-item.jp-mod-dropTarget { + background-color: var(--jp-brand-color2); + opacity: 0.7; +} + +/*----------------------------------------------------------------------------- +| Buttons +|----------------------------------------------------------------------------*/ + +.jp-FileBrowser-toolbar > .jp-Toolbar-item { + flex: 0 0 auto; + padding-left: 0; + padding-right: 2px; + align-items: center; + height: unset; +} + +.jp-FileBrowser-toolbar > .jp-Toolbar-item .jp-ToolbarButtonComponent { + width: 40px; +} + +/*----------------------------------------------------------------------------- +| Other styles +|----------------------------------------------------------------------------*/ + +.jp-FileDialog.jp-mod-conflict input { + color: var(--jp-error-color1); +} + +.jp-FileDialog .jp-new-name-title { + margin-top: 12px; +} + +.jp-LastModified-hidden { + display: none; +} + +.jp-FileSize-hidden { + display: none; +} + +.jp-FileBrowser .lm-AccordionPanel > h3:first-child { + display: none; +} + +/*----------------------------------------------------------------------------- +| DirListing +|----------------------------------------------------------------------------*/ + +.jp-DirListing { + flex: 1 1 auto; + display: flex; + flex-direction: column; + outline: 0; +} + +.jp-DirListing-header { + flex: 0 0 auto; + display: flex; + flex-direction: row; + align-items: center; + overflow: hidden; + border-top: var(--jp-border-width) solid var(--jp-border-color2); + border-bottom: var(--jp-border-width) solid var(--jp-border-color1); + box-shadow: var(--jp-toolbar-box-shadow); + z-index: 2; +} + +.jp-DirListing-headerItem { + padding: 4px 12px 2px; + font-weight: 500; +} + +.jp-DirListing-headerItem:hover { + background: var(--jp-layout-color2); +} + +.jp-DirListing-headerItem.jp-id-name { + flex: 1 0 84px; +} + +.jp-DirListing-headerItem.jp-id-modified { + flex: 0 0 112px; + border-left: var(--jp-border-width) solid var(--jp-border-color2); + text-align: right; +} + +.jp-DirListing-headerItem.jp-id-filesize { + flex: 0 0 75px; + border-left: var(--jp-border-width) solid var(--jp-border-color2); + text-align: right; +} + +.jp-id-narrow { + display: none; + flex: 0 0 5px; + padding: 4px; + border-left: var(--jp-border-width) solid var(--jp-border-color2); + text-align: right; + color: var(--jp-border-color2); +} + +.jp-DirListing-narrow .jp-id-narrow { + display: block; +} + +.jp-DirListing-narrow .jp-id-modified, +.jp-DirListing-narrow .jp-DirListing-itemModified { + display: none; +} + +.jp-DirListing-headerItem.jp-mod-selected { + font-weight: 600; +} + +/* increase specificity to override bundled default */ +.jp-DirListing-content { + flex: 1 1 auto; + margin: 0; + padding: 0; + list-style-type: none; + overflow: auto; + background-color: var(--jp-layout-color1); +} + +.jp-DirListing-content mark { + color: var(--jp-ui-font-color0); + background-color: transparent; + font-weight: bold; +} + +.jp-DirListing-content .jp-DirListing-item.jp-mod-selected mark { + color: var(--jp-ui-inverse-font-color0); +} + +/* Style the directory listing content when a user drops a file to upload */ +.jp-DirListing.jp-mod-native-drop .jp-DirListing-content { + outline: 5px dashed rgba(128, 128, 128, 0.5); + outline-offset: -10px; + cursor: copy; +} + +.jp-DirListing-item { + display: flex; + flex-direction: row; + align-items: center; + padding: 4px 12px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.jp-DirListing-checkboxWrapper { + /* Increases hit area of checkbox. */ + padding: 4px; +} + +.jp-DirListing-header + .jp-DirListing-checkboxWrapper + + .jp-DirListing-headerItem { + padding-left: 4px; +} + +.jp-DirListing-content .jp-DirListing-checkboxWrapper { + position: relative; + left: -4px; + margin: -4px 0 -4px -8px; +} + +.jp-DirListing-checkboxWrapper.jp-mod-visible { + visibility: visible; +} + +/* For devices that support hovering, hide checkboxes until hovered, selected... +*/ +@media (hover: hover) { + .jp-DirListing-checkboxWrapper { + visibility: hidden; + } + + .jp-DirListing-item:hover .jp-DirListing-checkboxWrapper, + .jp-DirListing-item.jp-mod-selected .jp-DirListing-checkboxWrapper { + visibility: visible; + } +} + +.jp-DirListing-item[data-is-dot] { + opacity: 75%; +} + +.jp-DirListing-item.jp-mod-selected { + color: var(--jp-ui-inverse-font-color1); + background: var(--jp-brand-color1); +} + +.jp-DirListing-item.jp-mod-dropTarget { + background: var(--jp-brand-color3); +} + +.jp-DirListing-item:hover:not(.jp-mod-selected) { + background: var(--jp-layout-color2); +} + +.jp-DirListing-itemIcon { + flex: 0 0 20px; + margin-right: 4px; +} + +.jp-DirListing-itemText { + flex: 1 0 64px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + user-select: none; +} + +.jp-DirListing-itemText:focus { + outline-width: 2px; + outline-color: var(--jp-inverse-layout-color1); + outline-style: solid; + outline-offset: 1px; +} + +.jp-DirListing-item.jp-mod-selected .jp-DirListing-itemText:focus { + outline-color: var(--jp-layout-color1); +} + +.jp-DirListing-itemModified { + flex: 0 0 125px; + text-align: right; +} + +.jp-DirListing-itemFileSize { + flex: 0 0 90px; + text-align: right; +} + +.jp-DirListing-editor { + flex: 1 0 64px; + outline: none; + border: none; + color: var(--jp-ui-font-color1); + background-color: var(--jp-layout-color1); +} + +.jp-DirListing-item.jp-mod-running .jp-DirListing-itemIcon::before { + color: var(--jp-success-color1); + content: '\25CF'; + font-size: 8px; + position: absolute; + left: -8px; +} + +.jp-DirListing-item.jp-mod-running.jp-mod-selected + .jp-DirListing-itemIcon::before { + color: var(--jp-ui-inverse-font-color1); +} + +.jp-DirListing-item.lm-mod-drag-image, +.jp-DirListing-item.jp-mod-selected.lm-mod-drag-image { + font-size: var(--jp-ui-font-size1); + padding-left: 4px; + margin-left: 4px; + width: 160px; + background-color: var(--jp-ui-inverse-font-color2); + box-shadow: var(--jp-elevation-z2); + border-radius: 0; + color: var(--jp-ui-font-color1); + transform: translateX(-40%) translateY(-58%); +} + +.jp-Document { + min-width: 120px; + min-height: 120px; + outline: none; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Main OutputArea +| OutputArea has a list of Outputs +|----------------------------------------------------------------------------*/ + +.jp-OutputArea { + overflow-y: auto; +} + +.jp-OutputArea-child { + display: table; + table-layout: fixed; + width: 100%; + overflow: hidden; +} + +.jp-OutputPrompt { + width: var(--jp-cell-prompt-width); + color: var(--jp-cell-outprompt-font-color); + font-family: var(--jp-cell-prompt-font-family); + padding: var(--jp-code-padding); + letter-spacing: var(--jp-cell-prompt-letter-spacing); + line-height: var(--jp-code-line-height); + font-size: var(--jp-code-font-size); + border: var(--jp-border-width) solid transparent; + opacity: var(--jp-cell-prompt-opacity); + + /* Right align prompt text, don't wrap to handle large prompt numbers */ + text-align: right; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + + /* Disable text selection */ + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.jp-OutputArea-prompt { + display: table-cell; + vertical-align: top; +} + +.jp-OutputArea-output { + display: table-cell; + width: 100%; + height: auto; + overflow: auto; + user-select: text; + -moz-user-select: text; + -webkit-user-select: text; + -ms-user-select: text; +} + +.jp-OutputArea .jp-RenderedText { + padding-left: 1ch; +} + +/** + * Prompt overlay. + */ + +.jp-OutputArea-promptOverlay { + position: absolute; + top: 0; + width: var(--jp-cell-prompt-width); + height: 100%; + opacity: 0.5; +} + +.jp-OutputArea-promptOverlay:hover { + background: var(--jp-layout-color2); + box-shadow: inset 0 0 1px var(--jp-inverse-layout-color0); + cursor: zoom-out; +} + +.jp-mod-outputsScrolled .jp-OutputArea-promptOverlay:hover { + cursor: zoom-in; +} + +/** + * Isolated output. + */ +.jp-OutputArea-output.jp-mod-isolated { + width: 100%; + display: block; +} + +/* +When drag events occur, `lm-mod-override-cursor` is added to the body. +Because iframes steal all cursor events, the following two rules are necessary +to suppress pointer events while resize drags are occurring. There may be a +better solution to this problem. +*/ +body.lm-mod-override-cursor .jp-OutputArea-output.jp-mod-isolated { + position: relative; +} + +body.lm-mod-override-cursor .jp-OutputArea-output.jp-mod-isolated::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: transparent; +} + +/* pre */ + +.jp-OutputArea-output pre { + border: none; + margin: 0; + padding: 0; + overflow-x: auto; + overflow-y: auto; + word-break: break-all; + word-wrap: break-word; + white-space: pre-wrap; +} + +/* tables */ + +.jp-OutputArea-output.jp-RenderedHTMLCommon table { + margin-left: 0; + margin-right: 0; +} + +/* description lists */ + +.jp-OutputArea-output dl, +.jp-OutputArea-output dt, +.jp-OutputArea-output dd { + display: block; +} + +.jp-OutputArea-output dl { + width: 100%; + overflow: hidden; + padding: 0; + margin: 0; +} + +.jp-OutputArea-output dt { + font-weight: bold; + float: left; + width: 20%; + padding: 0; + margin: 0; +} + +.jp-OutputArea-output dd { + float: left; + width: 80%; + padding: 0; + margin: 0; +} + +.jp-TrimmedOutputs pre { + background: var(--jp-layout-color3); + font-size: calc(var(--jp-code-font-size) * 1.4); + text-align: center; + text-transform: uppercase; +} + +/* Hide the gutter in case of + * - nested output areas (e.g. in the case of output widgets) + * - mirrored output areas + */ +.jp-OutputArea .jp-OutputArea .jp-OutputArea-prompt { + display: none; +} + +/* Hide empty lines in the output area, for instance due to cleared widgets */ +.jp-OutputArea-prompt:empty { + padding: 0; + border: 0; +} + +/*----------------------------------------------------------------------------- +| executeResult is added to any Output-result for the display of the object +| returned by a cell +|----------------------------------------------------------------------------*/ + +.jp-OutputArea-output.jp-OutputArea-executeResult { + margin-left: 0; + width: 100%; +} + +/* Text output with the Out[] prompt needs a top padding to match the + * alignment of the Out[] prompt itself. + */ +.jp-OutputArea-executeResult .jp-RenderedText.jp-OutputArea-output { + padding-top: var(--jp-code-padding); + border-top: var(--jp-border-width) solid transparent; +} + +/*----------------------------------------------------------------------------- +| The Stdin output +|----------------------------------------------------------------------------*/ + +.jp-Stdin-prompt { + color: var(--jp-content-font-color0); + padding-right: var(--jp-code-padding); + vertical-align: baseline; + flex: 0 0 auto; +} + +.jp-Stdin-input { + font-family: var(--jp-code-font-family); + font-size: inherit; + color: inherit; + background-color: inherit; + width: 42%; + min-width: 200px; + + /* make sure input baseline aligns with prompt */ + vertical-align: baseline; + + /* padding + margin = 0.5em between prompt and cursor */ + padding: 0 0.25em; + margin: 0 0.25em; + flex: 0 0 70%; +} + +.jp-Stdin-input::placeholder { + opacity: 0; +} + +.jp-Stdin-input:focus { + box-shadow: none; +} + +.jp-Stdin-input:focus::placeholder { + opacity: 1; +} + +/*----------------------------------------------------------------------------- +| Output Area View +|----------------------------------------------------------------------------*/ + +.jp-LinkedOutputView .jp-OutputArea { + height: 100%; + display: block; +} + +.jp-LinkedOutputView .jp-OutputArea-output:only-child { + height: 100%; +} + +/*----------------------------------------------------------------------------- +| Printing +|----------------------------------------------------------------------------*/ + +@media print { + .jp-OutputArea-child { + break-inside: avoid-page; + } +} + +/*----------------------------------------------------------------------------- +| Mobile +|----------------------------------------------------------------------------*/ +@media only screen and (max-width: 760px) { + .jp-OutputPrompt { + display: table-row; + text-align: left; + } + + .jp-OutputArea-child .jp-OutputArea-output { + display: table-row; + margin-left: var(--jp-notebook-padding); + } +} + +/* Trimmed outputs warning */ +.jp-TrimmedOutputs > a { + margin: 10px; + text-decoration: none; + cursor: pointer; +} + +.jp-TrimmedOutputs > a:hover { + text-decoration: none; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Table of Contents +|----------------------------------------------------------------------------*/ + +:root { + --jp-private-toc-active-width: 4px; +} + +.jp-TableOfContents { + display: flex; + flex-direction: column; + background: var(--jp-layout-color1); + color: var(--jp-ui-font-color1); + font-size: var(--jp-ui-font-size1); + height: 100%; +} + +.jp-TableOfContents-placeholder { + text-align: center; +} + +.jp-TableOfContents-placeholderContent { + color: var(--jp-content-font-color2); + padding: 8px; +} + +.jp-TableOfContents-placeholderContent > h3 { + margin-bottom: var(--jp-content-heading-margin-bottom); +} + +.jp-TableOfContents .jp-SidePanel-content { + overflow-y: auto; +} + +.jp-TableOfContents-tree { + margin: 4px; +} + +.jp-TableOfContents ol { + list-style-type: none; +} + +/* stylelint-disable-next-line selector-max-type */ +.jp-TableOfContents li > ol { + /* Align left border with triangle icon center */ + padding-left: 11px; +} + +.jp-TableOfContents-content { + /* left margin for the active heading indicator */ + margin: 0 0 0 var(--jp-private-toc-active-width); + padding: 0; + background-color: var(--jp-layout-color1); +} + +.jp-tocItem { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.jp-tocItem-heading { + display: flex; + cursor: pointer; +} + +.jp-tocItem-heading:hover { + background-color: var(--jp-layout-color2); +} + +.jp-tocItem-content { + display: block; + padding: 4px 0; + white-space: nowrap; + text-overflow: ellipsis; + overflow-x: hidden; +} + +.jp-tocItem-collapser { + height: 20px; + margin: 2px 2px 0; + padding: 0; + background: none; + border: none; + cursor: pointer; +} + +.jp-tocItem-collapser:hover { + background-color: var(--jp-layout-color3); +} + +/* Active heading indicator */ + +.jp-tocItem-heading::before { + content: ' '; + background: transparent; + width: var(--jp-private-toc-active-width); + height: 24px; + position: absolute; + left: 0; + border-radius: var(--jp-border-radius); +} + +.jp-tocItem-heading.jp-tocItem-active::before { + background-color: var(--jp-brand-color1); +} + +.jp-tocItem-heading:hover.jp-tocItem-active::before { + background: var(--jp-brand-color0); + opacity: 1; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-Collapser { + flex: 0 0 var(--jp-cell-collapser-width); + padding: 0; + margin: 0; + border: none; + outline: none; + background: transparent; + border-radius: var(--jp-border-radius); + opacity: 1; +} + +.jp-Collapser-child { + display: block; + width: 100%; + box-sizing: border-box; + + /* height: 100% doesn't work because the height of its parent is computed from content */ + position: absolute; + top: 0; + bottom: 0; +} + +/*----------------------------------------------------------------------------- +| Printing +|----------------------------------------------------------------------------*/ + +/* +Hiding collapsers in print mode. + +Note: input and output wrappers have "display: block" propery in print mode. +*/ + +@media print { + .jp-Collapser { + display: none; + } +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Header/Footer +|----------------------------------------------------------------------------*/ + +/* Hidden by zero height by default */ +.jp-CellHeader, +.jp-CellFooter { + height: 0; + width: 100%; + padding: 0; + margin: 0; + border: none; + outline: none; + background: transparent; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Input +|----------------------------------------------------------------------------*/ + +/* All input areas */ +.jp-InputArea { + display: table; + table-layout: fixed; + width: 100%; + overflow: hidden; +} + +.jp-InputArea-editor { + display: table-cell; + overflow: hidden; + vertical-align: top; + + /* This is the non-active, default styling */ + border: var(--jp-border-width) solid var(--jp-cell-editor-border-color); + border-radius: 0; + background: var(--jp-cell-editor-background); +} + +.jp-InputPrompt { + display: table-cell; + vertical-align: top; + width: var(--jp-cell-prompt-width); + color: var(--jp-cell-inprompt-font-color); + font-family: var(--jp-cell-prompt-font-family); + padding: var(--jp-code-padding); + letter-spacing: var(--jp-cell-prompt-letter-spacing); + opacity: var(--jp-cell-prompt-opacity); + line-height: var(--jp-code-line-height); + font-size: var(--jp-code-font-size); + border: var(--jp-border-width) solid transparent; + + /* Right align prompt text, don't wrap to handle large prompt numbers */ + text-align: right; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + + /* Disable text selection */ + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/*----------------------------------------------------------------------------- +| Mobile +|----------------------------------------------------------------------------*/ +@media only screen and (max-width: 760px) { + .jp-InputArea-editor { + display: table-row; + margin-left: var(--jp-notebook-padding); + } + + .jp-InputPrompt { + display: table-row; + text-align: left; + } +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Placeholder +|----------------------------------------------------------------------------*/ + +.jp-Placeholder { + display: table; + table-layout: fixed; + width: 100%; +} + +.jp-Placeholder-prompt { + display: table-cell; + box-sizing: border-box; +} + +.jp-Placeholder-content { + display: table-cell; + padding: 4px 6px; + border: 1px solid transparent; + border-radius: 0; + background: none; + box-sizing: border-box; + cursor: pointer; +} + +.jp-Placeholder-contentContainer { + display: flex; +} + +.jp-Placeholder-content:hover, +.jp-InputPlaceholder > .jp-Placeholder-content:hover { + border-color: var(--jp-layout-color3); +} + +.jp-Placeholder-content .jp-MoreHorizIcon { + width: 32px; + height: 16px; + border: 1px solid transparent; + border-radius: var(--jp-border-radius); +} + +.jp-Placeholder-content .jp-MoreHorizIcon:hover { + border: 1px solid var(--jp-border-color1); + box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.25); + background-color: var(--jp-layout-color0); +} + +.jp-PlaceholderText { + white-space: nowrap; + overflow-x: hidden; + color: var(--jp-inverse-layout-color3); + font-family: var(--jp-code-font-family); +} + +.jp-InputPlaceholder > .jp-Placeholder-content { + border-color: var(--jp-cell-editor-border-color); + background: var(--jp-cell-editor-background); +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Private CSS variables +|----------------------------------------------------------------------------*/ + +:root { + --jp-private-cell-scrolling-output-offset: 5px; +} + +/*----------------------------------------------------------------------------- +| Cell +|----------------------------------------------------------------------------*/ + +.jp-Cell { + padding: var(--jp-cell-padding); + margin: 0; + border: none; + outline: none; + background: transparent; +} + +/*----------------------------------------------------------------------------- +| Common input/output +|----------------------------------------------------------------------------*/ + +.jp-Cell-inputWrapper, +.jp-Cell-outputWrapper { + display: flex; + flex-direction: row; + padding: 0; + margin: 0; + + /* Added to reveal the box-shadow on the input and output collapsers. */ + overflow: visible; +} + +/* Only input/output areas inside cells */ +.jp-Cell-inputArea, +.jp-Cell-outputArea { + flex: 1 1 auto; +} + +/*----------------------------------------------------------------------------- +| Collapser +|----------------------------------------------------------------------------*/ + +/* Make the output collapser disappear when there is not output, but do so + * in a manner that leaves it in the layout and preserves its width. + */ +.jp-Cell.jp-mod-noOutputs .jp-Cell-outputCollapser { + border: none !important; + background: transparent !important; +} + +.jp-Cell:not(.jp-mod-noOutputs) .jp-Cell-outputCollapser { + min-height: var(--jp-cell-collapser-min-height); +} + +/*----------------------------------------------------------------------------- +| Output +|----------------------------------------------------------------------------*/ + +/* Put a space between input and output when there IS output */ +.jp-Cell:not(.jp-mod-noOutputs) .jp-Cell-outputWrapper { + margin-top: 5px; +} + +.jp-CodeCell.jp-mod-outputsScrolled .jp-Cell-outputArea { + overflow-y: auto; + max-height: 24em; + margin-left: var(--jp-private-cell-scrolling-output-offset); + resize: vertical; +} + +.jp-CodeCell.jp-mod-outputsScrolled .jp-Cell-outputArea[style*='height'] { + max-height: unset; +} + +.jp-CodeCell.jp-mod-outputsScrolled .jp-Cell-outputArea::after { + content: ' '; + box-shadow: inset 0 0 6px 2px rgb(0 0 0 / 30%); + width: 100%; + height: 100%; + position: sticky; + bottom: 0; + top: 0; + margin-top: -50%; + float: left; + display: block; + pointer-events: none; +} + +.jp-CodeCell.jp-mod-outputsScrolled .jp-OutputArea-child { + padding-top: 6px; +} + +.jp-CodeCell.jp-mod-outputsScrolled .jp-OutputArea-prompt { + width: calc( + var(--jp-cell-prompt-width) - var(--jp-private-cell-scrolling-output-offset) + ); +} + +.jp-CodeCell.jp-mod-outputsScrolled .jp-OutputArea-promptOverlay { + left: calc(-1 * var(--jp-private-cell-scrolling-output-offset)); +} + +/*----------------------------------------------------------------------------- +| CodeCell +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| MarkdownCell +|----------------------------------------------------------------------------*/ + +.jp-MarkdownOutput { + display: table-cell; + width: 100%; + margin-top: 0; + margin-bottom: 0; + padding-left: var(--jp-code-padding); +} + +.jp-MarkdownOutput.jp-RenderedHTMLCommon { + overflow: auto; +} + +/* collapseHeadingButton (show always if hiddenCellsButton is _not_ shown) */ +.jp-collapseHeadingButton { + display: flex; + min-height: var(--jp-cell-collapser-min-height); + font-size: var(--jp-code-font-size); + position: absolute; + background-color: transparent; + background-size: 25px; + background-repeat: no-repeat; + background-position-x: center; + background-position-y: top; + background-image: var(--jp-icon-caret-down); + right: 0; + top: 0; + bottom: 0; +} + +.jp-collapseHeadingButton.jp-mod-collapsed { + background-image: var(--jp-icon-caret-right); +} + +/* + set the container font size to match that of content + so that the nested collapse buttons have the right size +*/ +.jp-MarkdownCell .jp-InputPrompt { + font-size: var(--jp-content-font-size1); +} + +/* + Align collapseHeadingButton with cell top header + The font sizes are identical to the ones in packages/rendermime/style/base.css +*/ +.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='1'] { + font-size: var(--jp-content-font-size5); + background-position-y: calc(0.3 * var(--jp-content-font-size5)); +} + +.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='2'] { + font-size: var(--jp-content-font-size4); + background-position-y: calc(0.3 * var(--jp-content-font-size4)); +} + +.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='3'] { + font-size: var(--jp-content-font-size3); + background-position-y: calc(0.3 * var(--jp-content-font-size3)); +} + +.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='4'] { + font-size: var(--jp-content-font-size2); + background-position-y: calc(0.3 * var(--jp-content-font-size2)); +} + +.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='5'] { + font-size: var(--jp-content-font-size1); + background-position-y: top; +} + +.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='6'] { + font-size: var(--jp-content-font-size0); + background-position-y: top; +} + +/* collapseHeadingButton (show only on (hover,active) if hiddenCellsButton is shown) */ +.jp-Notebook.jp-mod-showHiddenCellsButton .jp-collapseHeadingButton { + display: none; +} + +.jp-Notebook.jp-mod-showHiddenCellsButton + :is(.jp-MarkdownCell:hover, .jp-mod-active) + .jp-collapseHeadingButton { + display: flex; +} + +/* showHiddenCellsButton (only show if jp-mod-showHiddenCellsButton is set, which +is a consequence of the showHiddenCellsButton option in Notebook Settings)*/ +.jp-Notebook.jp-mod-showHiddenCellsButton .jp-showHiddenCellsButton { + margin-left: calc(var(--jp-cell-prompt-width) + 2 * var(--jp-code-padding)); + margin-top: var(--jp-code-padding); + border: 1px solid var(--jp-border-color2); + background-color: var(--jp-border-color3) !important; + color: var(--jp-content-font-color0) !important; + display: flex; +} + +.jp-Notebook.jp-mod-showHiddenCellsButton .jp-showHiddenCellsButton:hover { + background-color: var(--jp-border-color2) !important; +} + +.jp-showHiddenCellsButton { + display: none; +} + +/*----------------------------------------------------------------------------- +| Printing +|----------------------------------------------------------------------------*/ + +/* +Using block instead of flex to allow the use of the break-inside CSS property for +cell outputs. +*/ + +@media print { + .jp-Cell-inputWrapper, + .jp-Cell-outputWrapper { + display: block; + } +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Variables +|----------------------------------------------------------------------------*/ + +:root { + --jp-notebook-toolbar-padding: 2px 5px 2px 2px; +} + +/*----------------------------------------------------------------------------- + +/*----------------------------------------------------------------------------- +| Styles +|----------------------------------------------------------------------------*/ + +.jp-NotebookPanel-toolbar { + padding: var(--jp-notebook-toolbar-padding); + + /* disable paint containment from lumino 2.0 default strict CSS containment */ + contain: style size !important; +} + +.jp-Toolbar-item.jp-Notebook-toolbarCellType .jp-select-wrapper.jp-mod-focused { + border: none; + box-shadow: none; +} + +.jp-Notebook-toolbarCellTypeDropdown select { + height: 24px; + font-size: var(--jp-ui-font-size1); + line-height: 14px; + border-radius: 0; + display: block; +} + +.jp-Notebook-toolbarCellTypeDropdown span { + top: 5px !important; +} + +.jp-Toolbar-responsive-popup { + position: absolute; + height: fit-content; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-end; + border-bottom: var(--jp-border-width) solid var(--jp-toolbar-border-color); + box-shadow: var(--jp-toolbar-box-shadow); + background: var(--jp-toolbar-background); + min-height: var(--jp-toolbar-micro-height); + padding: var(--jp-notebook-toolbar-padding); + z-index: 1; + right: 0; + top: 0; +} + +.jp-Toolbar > .jp-Toolbar-responsive-opener { + margin-left: auto; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Variables +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- + +/*----------------------------------------------------------------------------- +| Styles +|----------------------------------------------------------------------------*/ + +.jp-Notebook-ExecutionIndicator { + position: relative; + display: inline-block; + height: 100%; + z-index: 9997; +} + +.jp-Notebook-ExecutionIndicator-tooltip { + visibility: hidden; + height: auto; + width: max-content; + width: -moz-max-content; + background-color: var(--jp-layout-color2); + color: var(--jp-ui-font-color1); + text-align: justify; + border-radius: 6px; + padding: 0 5px; + position: fixed; + display: table; +} + +.jp-Notebook-ExecutionIndicator-tooltip.up { + transform: translateX(-50%) translateY(-100%) translateY(-32px); +} + +.jp-Notebook-ExecutionIndicator-tooltip.down { + transform: translateX(calc(-100% + 16px)) translateY(5px); +} + +.jp-Notebook-ExecutionIndicator-tooltip.hidden { + display: none; +} + +.jp-Notebook-ExecutionIndicator:hover .jp-Notebook-ExecutionIndicator-tooltip { + visibility: visible; +} + +.jp-Notebook-ExecutionIndicator span { + font-size: var(--jp-ui-font-size1); + font-family: var(--jp-ui-font-family); + color: var(--jp-ui-font-color1); + line-height: 24px; + display: block; +} + +.jp-Notebook-ExecutionIndicator-progress-bar { + display: flex; + justify-content: center; + height: 100%; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/* + * Execution indicator + */ +.jp-tocItem-content::after { + content: ''; + + /* Must be identical to form a circle */ + width: 12px; + height: 12px; + background: none; + border: none; + position: absolute; + right: 0; +} + +.jp-tocItem-content[data-running='0']::after { + border-radius: 50%; + border: var(--jp-border-width) solid var(--jp-inverse-layout-color3); + background: none; +} + +.jp-tocItem-content[data-running='1']::after { + border-radius: 50%; + border: var(--jp-border-width) solid var(--jp-inverse-layout-color3); + background-color: var(--jp-inverse-layout-color3); +} + +.jp-tocItem-content[data-running='0'], +.jp-tocItem-content[data-running='1'] { + margin-right: 12px; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +.jp-Notebook-footer { + height: 27px; + margin-left: calc( + var(--jp-cell-prompt-width) + var(--jp-cell-collapser-width) + + var(--jp-cell-padding) + ); + width: calc( + 100% - + ( + var(--jp-cell-prompt-width) + var(--jp-cell-collapser-width) + + var(--jp-cell-padding) + var(--jp-cell-padding) + ) + ); + border: var(--jp-border-width) solid var(--jp-cell-editor-border-color); + color: var(--jp-ui-font-color3); + margin-top: 6px; + background: none; + cursor: pointer; +} + +.jp-Notebook-footer:focus { + border-color: var(--jp-cell-editor-active-border-color); +} + +/* For devices that support hovering, hide footer until hover */ +@media (hover: hover) { + .jp-Notebook-footer { + opacity: 0; + } + + .jp-Notebook-footer:focus, + .jp-Notebook-footer:hover { + opacity: 1; + } +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Imports +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| CSS variables +|----------------------------------------------------------------------------*/ + +:root { + --jp-side-by-side-output-size: 1fr; + --jp-side-by-side-resized-cell: var(--jp-side-by-side-output-size); + --jp-private-notebook-dragImage-width: 304px; + --jp-private-notebook-dragImage-height: 36px; + --jp-private-notebook-selected-color: var(--md-blue-400); + --jp-private-notebook-active-color: var(--md-green-400); +} + +/*----------------------------------------------------------------------------- +| Notebook +|----------------------------------------------------------------------------*/ + +/* stylelint-disable selector-max-class */ + +.jp-NotebookPanel { + display: block; + height: 100%; +} + +.jp-NotebookPanel.jp-Document { + min-width: 240px; + min-height: 120px; +} + +.jp-Notebook { + padding: var(--jp-notebook-padding); + outline: none; + overflow: auto; + background: var(--jp-layout-color0); +} + +.jp-Notebook.jp-mod-scrollPastEnd::after { + display: block; + content: ''; + min-height: var(--jp-notebook-scroll-padding); +} + +.jp-MainAreaWidget-ContainStrict .jp-Notebook * { + contain: strict; +} + +.jp-Notebook .jp-Cell { + overflow: visible; +} + +.jp-Notebook .jp-Cell .jp-InputPrompt { + cursor: move; +} + +/*----------------------------------------------------------------------------- +| Notebook state related styling +| +| The notebook and cells each have states, here are the possibilities: +| +| - Notebook +| - Command +| - Edit +| - Cell +| - None +| - Active (only one can be active) +| - Selected (the cells actions are applied to) +| - Multiselected (when multiple selected, the cursor) +| - No outputs +|----------------------------------------------------------------------------*/ + +/* Command or edit modes */ + +.jp-Notebook .jp-Cell:not(.jp-mod-active) .jp-InputPrompt { + opacity: var(--jp-cell-prompt-not-active-opacity); + color: var(--jp-cell-prompt-not-active-font-color); +} + +.jp-Notebook .jp-Cell:not(.jp-mod-active) .jp-OutputPrompt { + opacity: var(--jp-cell-prompt-not-active-opacity); + color: var(--jp-cell-prompt-not-active-font-color); +} + +/* cell is active */ +.jp-Notebook .jp-Cell.jp-mod-active .jp-Collapser { + background: var(--jp-brand-color1); +} + +/* cell is dirty */ +.jp-Notebook .jp-Cell.jp-mod-dirty .jp-InputPrompt { + color: var(--jp-warn-color1); +} + +.jp-Notebook .jp-Cell.jp-mod-dirty .jp-InputPrompt::before { + color: var(--jp-warn-color1); + content: '•'; +} + +.jp-Notebook .jp-Cell.jp-mod-active.jp-mod-dirty .jp-Collapser { + background: var(--jp-warn-color1); +} + +/* collapser is hovered */ +.jp-Notebook .jp-Cell .jp-Collapser:hover { + box-shadow: var(--jp-elevation-z2); + background: var(--jp-brand-color1); + opacity: var(--jp-cell-collapser-not-active-hover-opacity); +} + +/* cell is active and collapser is hovered */ +.jp-Notebook .jp-Cell.jp-mod-active .jp-Collapser:hover { + background: var(--jp-brand-color0); + opacity: 1; +} + +/* Command mode */ + +.jp-Notebook.jp-mod-commandMode .jp-Cell.jp-mod-selected { + background: var(--jp-notebook-multiselected-color); +} + +.jp-Notebook.jp-mod-commandMode + .jp-Cell.jp-mod-active.jp-mod-selected:not(.jp-mod-multiSelected) { + background: transparent; +} + +/* Edit mode */ + +.jp-Notebook.jp-mod-editMode .jp-Cell.jp-mod-active .jp-InputArea-editor { + border: var(--jp-border-width) solid var(--jp-cell-editor-active-border-color); + box-shadow: var(--jp-input-box-shadow); + background-color: var(--jp-cell-editor-active-background); +} + +/*----------------------------------------------------------------------------- +| Notebook drag and drop +|----------------------------------------------------------------------------*/ + +.jp-Notebook-cell.jp-mod-dropSource { + opacity: 0.5; +} + +.jp-Notebook-cell.jp-mod-dropTarget, +.jp-Notebook.jp-mod-commandMode + .jp-Notebook-cell.jp-mod-active.jp-mod-selected.jp-mod-dropTarget { + border-top-color: var(--jp-private-notebook-selected-color); + border-top-style: solid; + border-top-width: 2px; +} + +.jp-dragImage { + display: block; + flex-direction: row; + width: var(--jp-private-notebook-dragImage-width); + height: var(--jp-private-notebook-dragImage-height); + border: var(--jp-border-width) solid var(--jp-cell-editor-border-color); + background: var(--jp-cell-editor-background); + overflow: visible; +} + +.jp-dragImage-singlePrompt { + box-shadow: 2px 2px 4px 0 rgba(0, 0, 0, 0.12); +} + +.jp-dragImage .jp-dragImage-content { + flex: 1 1 auto; + z-index: 2; + font-size: var(--jp-code-font-size); + font-family: var(--jp-code-font-family); + line-height: var(--jp-code-line-height); + padding: var(--jp-code-padding); + border: var(--jp-border-width) solid var(--jp-cell-editor-border-color); + background: var(--jp-cell-editor-background-color); + color: var(--jp-content-font-color3); + text-align: left; + margin: 4px 4px 4px 0; +} + +.jp-dragImage .jp-dragImage-prompt { + flex: 0 0 auto; + min-width: 36px; + color: var(--jp-cell-inprompt-font-color); + padding: var(--jp-code-padding); + padding-left: 12px; + font-family: var(--jp-cell-prompt-font-family); + letter-spacing: var(--jp-cell-prompt-letter-spacing); + line-height: 1.9; + font-size: var(--jp-code-font-size); + border: var(--jp-border-width) solid transparent; +} + +.jp-dragImage-multipleBack { + z-index: -1; + position: absolute; + height: 32px; + width: 300px; + top: 8px; + left: 8px; + background: var(--jp-layout-color2); + border: var(--jp-border-width) solid var(--jp-input-border-color); + box-shadow: 2px 2px 4px 0 rgba(0, 0, 0, 0.12); +} + +/*----------------------------------------------------------------------------- +| Cell toolbar +|----------------------------------------------------------------------------*/ + +.jp-NotebookTools { + display: block; + min-width: var(--jp-sidebar-min-width); + color: var(--jp-ui-font-color1); + background: var(--jp-layout-color1); + + /* This is needed so that all font sizing of children done in ems is + * relative to this base size */ + font-size: var(--jp-ui-font-size1); + overflow: auto; +} + +.jp-ActiveCellTool { + padding: 12px 0; + display: flex; +} + +.jp-ActiveCellTool-Content { + flex: 1 1 auto; +} + +.jp-ActiveCellTool .jp-ActiveCellTool-CellContent { + background: var(--jp-cell-editor-background); + border: var(--jp-border-width) solid var(--jp-cell-editor-border-color); + border-radius: 0; + min-height: 29px; +} + +.jp-ActiveCellTool .jp-InputPrompt { + min-width: calc(var(--jp-cell-prompt-width) * 0.75); +} + +.jp-ActiveCellTool-CellContent > pre { + padding: 5px 4px; + margin: 0; + white-space: normal; +} + +.jp-MetadataEditorTool { + flex-direction: column; + padding: 12px 0; +} + +.jp-RankedPanel > :not(:first-child) { + margin-top: 12px; +} + +.jp-KeySelector select.jp-mod-styled { + font-size: var(--jp-ui-font-size1); + color: var(--jp-ui-font-color0); + border: var(--jp-border-width) solid var(--jp-border-color1); +} + +.jp-KeySelector label, +.jp-MetadataEditorTool label, +.jp-NumberSetter label { + line-height: 1.4; +} + +.jp-NotebookTools .jp-select-wrapper { + margin-top: 4px; + margin-bottom: 0; +} + +.jp-NumberSetter input { + width: 100%; + margin-top: 4px; +} + +.jp-NotebookTools .jp-Collapse { + margin-top: 16px; +} + +/*----------------------------------------------------------------------------- +| Presentation Mode (.jp-mod-presentationMode) +|----------------------------------------------------------------------------*/ + +.jp-mod-presentationMode .jp-Notebook { + --jp-content-font-size1: var(--jp-content-presentation-font-size1); + --jp-code-font-size: var(--jp-code-presentation-font-size); +} + +.jp-mod-presentationMode .jp-Notebook .jp-Cell .jp-InputPrompt, +.jp-mod-presentationMode .jp-Notebook .jp-Cell .jp-OutputPrompt { + flex: 0 0 110px; +} + +/*----------------------------------------------------------------------------- +| Side-by-side Mode (.jp-mod-sideBySide) +|----------------------------------------------------------------------------*/ +.jp-mod-sideBySide.jp-Notebook .jp-Notebook-cell { + margin-top: 3em; + margin-bottom: 3em; + margin-left: 5%; + margin-right: 5%; +} + +.jp-mod-sideBySide.jp-Notebook .jp-CodeCell { + display: grid; + grid-template-columns: minmax(0, 1fr) min-content minmax( + 0, + var(--jp-side-by-side-output-size) + ); + grid-template-rows: auto minmax(0, 1fr) auto; + grid-template-areas: + 'header header header' + 'input handle output' + 'footer footer footer'; +} + +.jp-mod-sideBySide.jp-Notebook .jp-CodeCell.jp-mod-resizedCell { + grid-template-columns: minmax(0, 1fr) min-content minmax( + 0, + var(--jp-side-by-side-resized-cell) + ); +} + +.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-CellHeader { + grid-area: header; +} + +.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-Cell-inputWrapper { + grid-area: input; +} + +.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-Cell-outputWrapper { + /* overwrite the default margin (no vertical separation needed in side by side move */ + margin-top: 0; + grid-area: output; +} + +.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-CellFooter { + grid-area: footer; +} + +.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-CellResizeHandle { + grid-area: handle; + user-select: none; + display: block; + height: 100%; + cursor: ew-resize; + padding: 0 var(--jp-cell-padding); +} + +.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-CellResizeHandle::after { + content: ''; + display: block; + background: var(--jp-border-color2); + height: 100%; + width: 5px; +} + +.jp-mod-sideBySide.jp-Notebook + .jp-CodeCell.jp-mod-resizedCell + .jp-CellResizeHandle::after { + background: var(--jp-border-color0); +} + +.jp-CellResizeHandle { + display: none; +} + +/*----------------------------------------------------------------------------- +| Placeholder +|----------------------------------------------------------------------------*/ + +.jp-Cell-Placeholder { + padding-left: 55px; +} + +.jp-Cell-Placeholder-wrapper { + background: #fff; + border: 1px solid; + border-color: #e5e6e9 #dfe0e4 #d0d1d5; + border-radius: 4px; + -webkit-border-radius: 4px; + margin: 10px 15px; +} + +.jp-Cell-Placeholder-wrapper-inner { + padding: 15px; + position: relative; +} + +.jp-Cell-Placeholder-wrapper-body { + background-repeat: repeat; + background-size: 50% auto; +} + +.jp-Cell-Placeholder-wrapper-body div { + background: #f6f7f8; + background-image: -webkit-linear-gradient( + left, + #f6f7f8 0%, + #edeef1 20%, + #f6f7f8 40%, + #f6f7f8 100% + ); + background-repeat: no-repeat; + background-size: 800px 104px; + height: 104px; + position: absolute; + right: 15px; + left: 15px; + top: 15px; +} + +div.jp-Cell-Placeholder-h1 { + top: 20px; + height: 20px; + left: 15px; + width: 150px; +} + +div.jp-Cell-Placeholder-h2 { + left: 15px; + top: 50px; + height: 10px; + width: 100px; +} + +div.jp-Cell-Placeholder-content-1, +div.jp-Cell-Placeholder-content-2, +div.jp-Cell-Placeholder-content-3 { + left: 15px; + right: 15px; + height: 10px; +} + +div.jp-Cell-Placeholder-content-1 { + top: 100px; +} + +div.jp-Cell-Placeholder-content-2 { + top: 120px; +} + +div.jp-Cell-Placeholder-content-3 { + top: 140px; +} + +</style> +<style type="text/css"> +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/* +The following CSS variables define the main, public API for styling JupyterLab. +These variables should be used by all plugins wherever possible. In other +words, plugins should not define custom colors, sizes, etc unless absolutely +necessary. This enables users to change the visual theme of JupyterLab +by changing these variables. + +Many variables appear in an ordered sequence (0,1,2,3). These sequences +are designed to work well together, so for example, `--jp-border-color1` should +be used with `--jp-layout-color1`. The numbers have the following meanings: + +* 0: super-primary, reserved for special emphasis +* 1: primary, most important under normal situations +* 2: secondary, next most important under normal situations +* 3: tertiary, next most important under normal situations + +Throughout JupyterLab, we are mostly following principles from Google's +Material Design when selecting colors. We are not, however, following +all of MD as it is not optimized for dense, information rich UIs. +*/ + +:root { + /* Elevation + * + * We style box-shadows using Material Design's idea of elevation. These particular numbers are taken from here: + * + * https://github.com/material-components/material-components-web + * https://material-components-web.appspot.com/elevation.html + */ + + --jp-shadow-base-lightness: 0; + --jp-shadow-umbra-color: rgba( + var(--jp-shadow-base-lightness), + var(--jp-shadow-base-lightness), + var(--jp-shadow-base-lightness), + 0.2 + ); + --jp-shadow-penumbra-color: rgba( + var(--jp-shadow-base-lightness), + var(--jp-shadow-base-lightness), + var(--jp-shadow-base-lightness), + 0.14 + ); + --jp-shadow-ambient-color: rgba( + var(--jp-shadow-base-lightness), + var(--jp-shadow-base-lightness), + var(--jp-shadow-base-lightness), + 0.12 + ); + --jp-elevation-z0: none; + --jp-elevation-z1: 0 2px 1px -1px var(--jp-shadow-umbra-color), + 0 1px 1px 0 var(--jp-shadow-penumbra-color), + 0 1px 3px 0 var(--jp-shadow-ambient-color); + --jp-elevation-z2: 0 3px 1px -2px var(--jp-shadow-umbra-color), + 0 2px 2px 0 var(--jp-shadow-penumbra-color), + 0 1px 5px 0 var(--jp-shadow-ambient-color); + --jp-elevation-z4: 0 2px 4px -1px var(--jp-shadow-umbra-color), + 0 4px 5px 0 var(--jp-shadow-penumbra-color), + 0 1px 10px 0 var(--jp-shadow-ambient-color); + --jp-elevation-z6: 0 3px 5px -1px var(--jp-shadow-umbra-color), + 0 6px 10px 0 var(--jp-shadow-penumbra-color), + 0 1px 18px 0 var(--jp-shadow-ambient-color); + --jp-elevation-z8: 0 5px 5px -3px var(--jp-shadow-umbra-color), + 0 8px 10px 1px var(--jp-shadow-penumbra-color), + 0 3px 14px 2px var(--jp-shadow-ambient-color); + --jp-elevation-z12: 0 7px 8px -4px var(--jp-shadow-umbra-color), + 0 12px 17px 2px var(--jp-shadow-penumbra-color), + 0 5px 22px 4px var(--jp-shadow-ambient-color); + --jp-elevation-z16: 0 8px 10px -5px var(--jp-shadow-umbra-color), + 0 16px 24px 2px var(--jp-shadow-penumbra-color), + 0 6px 30px 5px var(--jp-shadow-ambient-color); + --jp-elevation-z20: 0 10px 13px -6px var(--jp-shadow-umbra-color), + 0 20px 31px 3px var(--jp-shadow-penumbra-color), + 0 8px 38px 7px var(--jp-shadow-ambient-color); + --jp-elevation-z24: 0 11px 15px -7px var(--jp-shadow-umbra-color), + 0 24px 38px 3px var(--jp-shadow-penumbra-color), + 0 9px 46px 8px var(--jp-shadow-ambient-color); + + /* Borders + * + * The following variables, specify the visual styling of borders in JupyterLab. + */ + + --jp-border-width: 1px; + --jp-border-color0: var(--md-grey-400); + --jp-border-color1: var(--md-grey-400); + --jp-border-color2: var(--md-grey-300); + --jp-border-color3: var(--md-grey-200); + --jp-inverse-border-color: var(--md-grey-600); + --jp-border-radius: 2px; + + /* UI Fonts + * + * The UI font CSS variables are used for the typography all of the JupyterLab + * user interface elements that are not directly user generated content. + * + * The font sizing here is done assuming that the body font size of --jp-ui-font-size1 + * is applied to a parent element. When children elements, such as headings, are sized + * in em all things will be computed relative to that body size. + */ + + --jp-ui-font-scale-factor: 1.2; + --jp-ui-font-size0: 0.83333em; + --jp-ui-font-size1: 13px; /* Base font size */ + --jp-ui-font-size2: 1.2em; + --jp-ui-font-size3: 1.44em; + --jp-ui-font-family: system-ui, -apple-system, blinkmacsystemfont, 'Segoe UI', + helvetica, arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', + 'Segoe UI Symbol'; + + /* + * Use these font colors against the corresponding main layout colors. + * In a light theme, these go from dark to light. + */ + + /* Defaults use Material Design specification */ + --jp-ui-font-color0: rgba(0, 0, 0, 1); + --jp-ui-font-color1: rgba(0, 0, 0, 0.87); + --jp-ui-font-color2: rgba(0, 0, 0, 0.54); + --jp-ui-font-color3: rgba(0, 0, 0, 0.38); + + /* + * Use these against the brand/accent/warn/error colors. + * These will typically go from light to darker, in both a dark and light theme. + */ + + --jp-ui-inverse-font-color0: rgba(255, 255, 255, 1); + --jp-ui-inverse-font-color1: rgba(255, 255, 255, 1); + --jp-ui-inverse-font-color2: rgba(255, 255, 255, 0.7); + --jp-ui-inverse-font-color3: rgba(255, 255, 255, 0.5); + + /* Content Fonts + * + * Content font variables are used for typography of user generated content. + * + * The font sizing here is done assuming that the body font size of --jp-content-font-size1 + * is applied to a parent element. When children elements, such as headings, are sized + * in em all things will be computed relative to that body size. + */ + + --jp-content-line-height: 1.6; + --jp-content-font-scale-factor: 1.2; + --jp-content-font-size0: 0.83333em; + --jp-content-font-size1: 14px; /* Base font size */ + --jp-content-font-size2: 1.2em; + --jp-content-font-size3: 1.44em; + --jp-content-font-size4: 1.728em; + --jp-content-font-size5: 2.0736em; + + /* This gives a magnification of about 125% in presentation mode over normal. */ + --jp-content-presentation-font-size1: 17px; + --jp-content-heading-line-height: 1; + --jp-content-heading-margin-top: 1.2em; + --jp-content-heading-margin-bottom: 0.8em; + --jp-content-heading-font-weight: 500; + + /* Defaults use Material Design specification */ + --jp-content-font-color0: rgba(0, 0, 0, 1); + --jp-content-font-color1: rgba(0, 0, 0, 0.87); + --jp-content-font-color2: rgba(0, 0, 0, 0.54); + --jp-content-font-color3: rgba(0, 0, 0, 0.38); + --jp-content-link-color: var(--md-blue-900); + --jp-content-font-family: system-ui, -apple-system, blinkmacsystemfont, + 'Segoe UI', helvetica, arial, sans-serif, 'Apple Color Emoji', + 'Segoe UI Emoji', 'Segoe UI Symbol'; + + /* + * Code Fonts + * + * Code font variables are used for typography of code and other monospaces content. + */ + + --jp-code-font-size: 13px; + --jp-code-line-height: 1.3077; /* 17px for 13px base */ + --jp-code-padding: 5px; /* 5px for 13px base, codemirror highlighting needs integer px value */ + --jp-code-font-family-default: menlo, consolas, 'DejaVu Sans Mono', monospace; + --jp-code-font-family: var(--jp-code-font-family-default); + + /* This gives a magnification of about 125% in presentation mode over normal. */ + --jp-code-presentation-font-size: 16px; + + /* may need to tweak cursor width if you change font size */ + --jp-code-cursor-width0: 1.4px; + --jp-code-cursor-width1: 2px; + --jp-code-cursor-width2: 4px; + + /* Layout + * + * The following are the main layout colors use in JupyterLab. In a light + * theme these would go from light to dark. + */ + + --jp-layout-color0: white; + --jp-layout-color1: white; + --jp-layout-color2: var(--md-grey-200); + --jp-layout-color3: var(--md-grey-400); + --jp-layout-color4: var(--md-grey-600); + + /* Inverse Layout + * + * The following are the inverse layout colors use in JupyterLab. In a light + * theme these would go from dark to light. + */ + + --jp-inverse-layout-color0: #111; + --jp-inverse-layout-color1: var(--md-grey-900); + --jp-inverse-layout-color2: var(--md-grey-800); + --jp-inverse-layout-color3: var(--md-grey-700); + --jp-inverse-layout-color4: var(--md-grey-600); + + /* Brand/accent */ + + --jp-brand-color0: var(--md-blue-900); + --jp-brand-color1: var(--md-blue-700); + --jp-brand-color2: var(--md-blue-300); + --jp-brand-color3: var(--md-blue-100); + --jp-brand-color4: var(--md-blue-50); + --jp-accent-color0: var(--md-green-900); + --jp-accent-color1: var(--md-green-700); + --jp-accent-color2: var(--md-green-300); + --jp-accent-color3: var(--md-green-100); + + /* State colors (warn, error, success, info) */ + + --jp-warn-color0: var(--md-orange-900); + --jp-warn-color1: var(--md-orange-700); + --jp-warn-color2: var(--md-orange-300); + --jp-warn-color3: var(--md-orange-100); + --jp-error-color0: var(--md-red-900); + --jp-error-color1: var(--md-red-700); + --jp-error-color2: var(--md-red-300); + --jp-error-color3: var(--md-red-100); + --jp-success-color0: var(--md-green-900); + --jp-success-color1: var(--md-green-700); + --jp-success-color2: var(--md-green-300); + --jp-success-color3: var(--md-green-100); + --jp-info-color0: var(--md-cyan-900); + --jp-info-color1: var(--md-cyan-700); + --jp-info-color2: var(--md-cyan-300); + --jp-info-color3: var(--md-cyan-100); + + /* Cell specific styles */ + + --jp-cell-padding: 5px; + --jp-cell-collapser-width: 8px; + --jp-cell-collapser-min-height: 20px; + --jp-cell-collapser-not-active-hover-opacity: 0.6; + --jp-cell-editor-background: var(--md-grey-100); + --jp-cell-editor-border-color: var(--md-grey-300); + --jp-cell-editor-box-shadow: inset 0 0 2px var(--md-blue-300); + --jp-cell-editor-active-background: var(--jp-layout-color0); + --jp-cell-editor-active-border-color: var(--jp-brand-color1); + --jp-cell-prompt-width: 64px; + --jp-cell-prompt-font-family: var(--jp-code-font-family-default); + --jp-cell-prompt-letter-spacing: 0; + --jp-cell-prompt-opacity: 1; + --jp-cell-prompt-not-active-opacity: 0.5; + --jp-cell-prompt-not-active-font-color: var(--md-grey-700); + + /* A custom blend of MD grey and blue 600 + * See https://meyerweb.com/eric/tools/color-blend/#546E7A:1E88E5:5:hex */ + --jp-cell-inprompt-font-color: #307fc1; + + /* A custom blend of MD grey and orange 600 + * https://meyerweb.com/eric/tools/color-blend/#546E7A:F4511E:5:hex */ + --jp-cell-outprompt-font-color: #bf5b3d; + + /* Notebook specific styles */ + + --jp-notebook-padding: 10px; + --jp-notebook-select-background: var(--jp-layout-color1); + --jp-notebook-multiselected-color: var(--md-blue-50); + + /* The scroll padding is calculated to fill enough space at the bottom of the + notebook to show one single-line cell (with appropriate padding) at the top + when the notebook is scrolled all the way to the bottom. We also subtract one + pixel so that no scrollbar appears if we have just one single-line cell in the + notebook. This padding is to enable a 'scroll past end' feature in a notebook. + */ + --jp-notebook-scroll-padding: calc( + 100% - var(--jp-code-font-size) * var(--jp-code-line-height) - + var(--jp-code-padding) - var(--jp-cell-padding) - 1px + ); + + /* Rendermime styles */ + + --jp-rendermime-error-background: #fdd; + --jp-rendermime-table-row-background: var(--md-grey-100); + --jp-rendermime-table-row-hover-background: var(--md-light-blue-50); + + /* Dialog specific styles */ + + --jp-dialog-background: rgba(0, 0, 0, 0.25); + + /* Console specific styles */ + + --jp-console-padding: 10px; + + /* Toolbar specific styles */ + + --jp-toolbar-border-color: var(--jp-border-color1); + --jp-toolbar-micro-height: 8px; + --jp-toolbar-background: var(--jp-layout-color1); + --jp-toolbar-box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.24); + --jp-toolbar-header-margin: 4px 4px 0 4px; + --jp-toolbar-active-background: var(--md-grey-300); + + /* Statusbar specific styles */ + + --jp-statusbar-height: 24px; + + /* Input field styles */ + + --jp-input-box-shadow: inset 0 0 2px var(--md-blue-300); + --jp-input-active-background: var(--jp-layout-color1); + --jp-input-hover-background: var(--jp-layout-color1); + --jp-input-background: var(--md-grey-100); + --jp-input-border-color: var(--jp-inverse-border-color); + --jp-input-active-border-color: var(--jp-brand-color1); + --jp-input-active-box-shadow-color: rgba(19, 124, 189, 0.3); + + /* General editor styles */ + + --jp-editor-selected-background: #d9d9d9; + --jp-editor-selected-focused-background: #d7d4f0; + --jp-editor-cursor-color: var(--jp-ui-font-color0); + + /* Code mirror specific styles */ + + --jp-mirror-editor-keyword-color: #008000; + --jp-mirror-editor-atom-color: #88f; + --jp-mirror-editor-number-color: #080; + --jp-mirror-editor-def-color: #00f; + --jp-mirror-editor-variable-color: var(--md-grey-900); + --jp-mirror-editor-variable-2-color: rgb(0, 54, 109); + --jp-mirror-editor-variable-3-color: #085; + --jp-mirror-editor-punctuation-color: #05a; + --jp-mirror-editor-property-color: #05a; + --jp-mirror-editor-operator-color: #a2f; + --jp-mirror-editor-comment-color: #408080; + --jp-mirror-editor-string-color: #ba2121; + --jp-mirror-editor-string-2-color: #708; + --jp-mirror-editor-meta-color: #a2f; + --jp-mirror-editor-qualifier-color: #555; + --jp-mirror-editor-builtin-color: #008000; + --jp-mirror-editor-bracket-color: #997; + --jp-mirror-editor-tag-color: #170; + --jp-mirror-editor-attribute-color: #00c; + --jp-mirror-editor-header-color: blue; + --jp-mirror-editor-quote-color: #090; + --jp-mirror-editor-link-color: #00c; + --jp-mirror-editor-error-color: #f00; + --jp-mirror-editor-hr-color: #999; + + /* + RTC user specific colors. + These colors are used for the cursor, username in the editor, + and the icon of the user. + */ + + --jp-collaborator-color1: #ffad8e; + --jp-collaborator-color2: #dac83d; + --jp-collaborator-color3: #72dd76; + --jp-collaborator-color4: #00e4d0; + --jp-collaborator-color5: #45d4ff; + --jp-collaborator-color6: #e2b1ff; + --jp-collaborator-color7: #ff9de6; + + /* Vega extension styles */ + + --jp-vega-background: white; + + /* Sidebar-related styles */ + + --jp-sidebar-min-width: 250px; + + /* Search-related styles */ + + --jp-search-toggle-off-opacity: 0.5; + --jp-search-toggle-hover-opacity: 0.8; + --jp-search-toggle-on-opacity: 1; + --jp-search-selected-match-background-color: rgb(245, 200, 0); + --jp-search-selected-match-color: black; + --jp-search-unselected-match-background-color: var( + --jp-inverse-layout-color0 + ); + --jp-search-unselected-match-color: var(--jp-ui-inverse-font-color0); + + /* Icon colors that work well with light or dark backgrounds */ + --jp-icon-contrast-color0: var(--md-purple-600); + --jp-icon-contrast-color1: var(--md-green-600); + --jp-icon-contrast-color2: var(--md-pink-600); + --jp-icon-contrast-color3: var(--md-blue-600); + + /* Button colors */ + --jp-accept-color-normal: var(--md-blue-700); + --jp-accept-color-hover: var(--md-blue-800); + --jp-accept-color-active: var(--md-blue-900); + --jp-warn-color-normal: var(--md-red-700); + --jp-warn-color-hover: var(--md-red-800); + --jp-warn-color-active: var(--md-red-900); + --jp-reject-color-normal: var(--md-grey-600); + --jp-reject-color-hover: var(--md-grey-700); + --jp-reject-color-active: var(--md-grey-800); + + /* File or activity icons and switch semantic variables */ + --jp-jupyter-icon-color: #f37626; + --jp-notebook-icon-color: #f37626; + --jp-json-icon-color: var(--md-orange-700); + --jp-console-icon-background-color: var(--md-blue-700); + --jp-console-icon-color: white; + --jp-terminal-icon-background-color: var(--md-grey-800); + --jp-terminal-icon-color: var(--md-grey-200); + --jp-text-editor-icon-color: var(--md-grey-700); + --jp-inspector-icon-color: var(--md-grey-700); + --jp-switch-color: var(--md-grey-400); + --jp-switch-true-position-color: var(--md-orange-900); +} +</style> +<style type="text/css"> +/* Force rendering true colors when outputing to pdf */ +* { + -webkit-print-color-adjust: exact; +} + +/* Misc */ +a.anchor-link { + display: none; +} + +/* Input area styling */ +.jp-InputArea { + overflow: hidden; +} + +.jp-InputArea-editor { + overflow: hidden; +} + +.cm-editor.cm-s-jupyter .highlight pre { +/* weird, but --jp-code-padding defined to be 5px but 4px horizontal padding is hardcoded for pre.cm-line */ + padding: var(--jp-code-padding) 4px; + margin: 0; + + font-family: inherit; + font-size: inherit; + line-height: inherit; + color: inherit; + +} + +.jp-OutputArea-output pre { + line-height: inherit; + font-family: inherit; +} + +.jp-RenderedText pre { + color: var(--jp-content-font-color1); + font-size: var(--jp-code-font-size); +} + +/* Hiding the collapser by default */ +.jp-Collapser { + display: none; +} + +@page { + margin: 0.5in; /* Margin for each printed piece of paper */ +} + +@media print { + .jp-Cell-inputWrapper, + .jp-Cell-outputWrapper { + display: block; + } +} +</style> +<!-- Load mathjax --> +<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS_CHTML-full,Safe"> </script> +<!-- MathJax configuration --> +<script type="text/x-mathjax-config"> + init_mathjax = function() { + if (window.MathJax) { + // MathJax loaded + MathJax.Hub.Config({ + TeX: { + equationNumbers: { + autoNumber: "AMS", + useLabelIds: true + } + }, + tex2jax: { + inlineMath: [ ['$','$'], ["\\(","\\)"] ], + displayMath: [ ['$$','$$'], ["\\[","\\]"] ], + processEscapes: true, + processEnvironments: true + }, + displayAlign: 'center', + CommonHTML: { + linebreaks: { + automatic: true + } + } + }); + + MathJax.Hub.Queue(["Typeset", MathJax.Hub]); + } + } + init_mathjax(); + </script> +<!-- End of mathjax configuration --><script type="module"> + document.addEventListener("DOMContentLoaded", async () => { + const diagrams = document.querySelectorAll(".jp-Mermaid > pre.mermaid"); + // do not load mermaidjs if not needed + if (!diagrams.length) { + return; + } + const mermaid = (await import("https://cdnjs.cloudflare.com/ajax/libs/mermaid/10.6.0/mermaid.esm.min.mjs")).default; + const parser = new DOMParser(); + + mermaid.initialize({ + maxTextSize: 100000, + startOnLoad: false, + fontFamily: window + .getComputedStyle(document.body) + .getPropertyValue("--jp-ui-font-family"), + theme: document.querySelector("body[data-jp-theme-light='true']") + ? "default" + : "dark", + }); + + let _nextMermaidId = 0; + + function makeMermaidImage(svg) { + const img = document.createElement("img"); + const doc = parser.parseFromString(svg, "image/svg+xml"); + const svgEl = doc.querySelector("svg"); + const { maxWidth } = svgEl?.style || {}; + const firstTitle = doc.querySelector("title"); + const firstDesc = doc.querySelector("desc"); + + img.setAttribute("src", `data:image/svg+xml,${encodeURIComponent(svg)}`); + if (maxWidth) { + img.width = parseInt(maxWidth); + } + if (firstTitle) { + img.setAttribute("alt", firstTitle.textContent); + } + if (firstDesc) { + const caption = document.createElement("figcaption"); + caption.className = "sr-only"; + caption.textContent = firstDesc.textContent; + return [img, caption]; + } + return [img]; + } + + async function makeMermaidError(text) { + let errorMessage = ""; + try { + await mermaid.parse(text); + } catch (err) { + errorMessage = `${err}`; + } + + const result = document.createElement("details"); + result.className = 'jp-RenderedMermaid-Details'; + const summary = document.createElement("summary"); + summary.className = 'jp-RenderedMermaid-Summary'; + const pre = document.createElement("pre"); + const code = document.createElement("code"); + code.innerText = text; + pre.appendChild(code); + summary.appendChild(pre); + result.appendChild(summary); + + const warning = document.createElement("pre"); + warning.innerText = errorMessage; + result.appendChild(warning); + return [result]; + } + + async function renderOneMarmaid(src) { + const id = `jp-mermaid-${_nextMermaidId++}`; + const parent = src.parentNode; + let raw = src.textContent.trim(); + const el = document.createElement("div"); + el.style.visibility = "hidden"; + document.body.appendChild(el); + let results = null; + let output = null; + try { + const { svg } = await mermaid.render(id, raw, el); + results = makeMermaidImage(svg); + output = document.createElement("figure"); + results.map(output.appendChild, output); + } catch (err) { + parent.classList.add("jp-mod-warning"); + results = await makeMermaidError(raw); + output = results[0]; + } finally { + el.remove(); + } + parent.classList.add("jp-RenderedMermaid"); + parent.appendChild(output); + } + + void Promise.all([...diagrams].map(renderOneMarmaid)); + }); +</script> +<style> + .jp-Mermaid:not(.jp-RenderedMermaid) { + display: none; + } + + .jp-RenderedMermaid { + overflow: auto; + display: flex; + } + + .jp-RenderedMermaid.jp-mod-warning { + width: auto; + padding: 0.5em; + margin-top: 0.5em; + border: var(--jp-border-width) solid var(--jp-warn-color2); + border-radius: var(--jp-border-radius); + color: var(--jp-ui-font-color1); + font-size: var(--jp-ui-font-size1); + white-space: pre-wrap; + word-wrap: break-word; + } + + .jp-RenderedMermaid figure { + margin: 0; + overflow: auto; + max-width: 100%; + } + + .jp-RenderedMermaid img { + max-width: 100%; + } + + .jp-RenderedMermaid-Details > pre { + margin-top: 1em; + } + + .jp-RenderedMermaid-Summary { + color: var(--jp-warn-color2); + } + + .jp-RenderedMermaid:not(.jp-mod-warning) pre { + display: none; + } + + .jp-RenderedMermaid-Summary > pre { + display: inline-block; + white-space: normal; + } +</style> +<!-- End of mermaid configuration --></head> +<body class="jp-Notebook" data-jp-theme-light="true" data-jp-theme-name="JupyterLab Light"> +<main> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=c96d6259-08d6-4289-aea2-589d67cdb5ee"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<h1 id="PA-2.2:-Love-is-Sparse">PA 2.2: Love is Sparse<a class="anchor-link" href="#PA-2.2:-Love-is-Sparse">¶</a></h1><h1 style="position: absolute; display: flex; flex-grow: 0; flex-shrink: 0; flex-direction: row-reverse; top: 60px;right: 30px; margin: 0; border: 0"> +<style> + .markdown {width:100%; position: relative} + article { position: relative } + </style> +<img alt="No description has been provided for this image" src="https://gitlab.tudelft.nl/mude/public/-/raw/main/tu-logo/TU_P1_full-color.png" style="width:100px"/> +<img alt="No description has been provided for this image" src="https://gitlab.tudelft.nl/mude/public/-/raw/main/mude-logo/MUDE_Logo-small.png" style="width:100px"/> +</h1> +<h2 style="height: 10px"> +</h2> +<p><em><a href="http://mude.citg.tudelft.nl/">CEGM1000 MUDE</a>: Week 2.2 Due: complete this PA prior to class on Friday, Nov 22, 2024.</em></p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=7a28e541-d2d0-48a9-abf6-7b73075c8fd3"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p>This assignment will introduce you to the concept of sparse matrices in Python and how they can be useful to speed up computations and reduce file sizes. This is especially important when using the numerical schemes we are learning about (FDM, FVM, FEM) to solve problems with a lot of unknowns at each time step. To accomplish this, we will be using the <code>scipy.sparse</code> library.</p> +<p>Keep the <code>scipy.sparse</code> <a href="https://docs.scipy.org/doc/scipy/reference/sparse.html">documentation</a> handy. Some of the work you'll do is based off this <a href="https://www.sefidian.com/2021/04/28/python-scipy-sparse-matrices-explained/">blog</a>, so you may find it helpful. In addition, if you don't know what a byte is, you may want to read up on <a href="https://en.wikipedia.org/wiki/Byte">Wikipdia here</a> (not all of it, as long as you recognize that it is a measure of storage space on a computer).The concepts you learn here are applied to the Finite Element Method in this <a href="https://mude.citg.tudelft.nl/book/fem/matrix.html">book chapter</a>, which you are expected to read during Week 2.2.</p> +<p><strong>Note:</strong> <em>you probably skipped over all the links in the paragraph above. While we forgive you for your haste, just remember to revisit some of them if you are struggling to finish the questions below!</em></p> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=a262eac1"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> +<span class="kn">import</span> <span class="nn">scipy.sparse</span> <span class="k">as</span> <span class="nn">sparse</span> +<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span> +<span class="kn">import</span> <span class="nn">timeit</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=c3cd5017-10e0-4b64-ad1a-b626d80a128a"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<h2 id="Task-1:-Why-sparse?">Task 1: Why sparse?<a class="anchor-link" href="#Task-1:-Why-sparse?">¶</a></h2><p>Some matrices have a lot of zeros, with such an example given below. When this is the case, the way we store the actual information of the matrix (the non-zero elements) can have a big impact on computation speed and storage demands. Formats which handle this by only storing non-zero elements are called sparse, and have very different internal representations of the data to the matrices you have been familiarized with in previous programming assignments.</p> +<p><img alt="Sparse matrix" src="images/sparse_matrix.png"/></p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=f583dfa0-5a21-4ebb-99e5-7b27b323171d"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 1.1:</b> +<p>First we will create a regular Numpy matrix to use as a starting point for making a sparse one.</p> +<ul> +<li>Create a function (<code>create_dense</code>) which returns a square matrix of arbitrary size filled with zero and non-zero values between 0 and 1.</li> +<li>The function should take as input the size N (such that the matrix is N x N) and one float between 0 and 1, which represents the approximate fraction of the elements of the matrix which are non-zero.</li> +<li>Use <a href="https://numpy.org/doc/stable/reference/random/generated/numpy.random.rand.html">numpy.random.rand</a> to create a random set of values between 0 and 1</li> +<li>Remove a portion of the values by using simple boolean expression to set the fraction specified by <code>percentage</code> to zero.</li> +</ul> +</p> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=2c707a48"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#facb8e; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> <p>Note that the function below uses colons <code>:</code> with argument type, as well as a <code>-></code> before closing the function definition line. This is called "typing," which is a useful feature for helping to write code that behaves properly. In this PA you should use them like hints to help you write the functions and use them properly. If you are curious, read more <a href="https://docs.python.org/3/library/typing.html" target="_blank">here</a>.</p></div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=1310dca9-dc46-4ab1-ab78-0a5389191cfc"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">create_dense</span><span class="p">(</span><span class="n">size</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">percentage</span><span class="p">:</span> <span class="nb">float</span><span class="p">)</span> <span class="o">-></span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">:</span> + <span class="n">matrix</span> <span class="o">=</span> <span class="n">YOUR_CODE_HERE</span> + <span class="n">matrix</span><span class="p">[</span><span class="n">YOUR_CODE_HERE</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span> + <span class="k">return</span> <span class="n">matrix</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=d670f274-ef24-4abd-86bf-3cd24e3cf5c5"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p>Now, set up a test to check if you set the function up correctly:</p> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=8f6a3117"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="n">test_size</span> <span class="o">=</span> <span class="n">YOUR_CODE_HERE</span> +<span class="n">test_percentage</span> <span class="o">=</span> <span class="n">YOUR_CODE_HERE</span> +<span class="n">matrix</span> <span class="o">=</span> <span class="n">create_dense</span><span class="p">(</span><span class="n">test_size</span><span class="p">,</span> <span class="n">test_percentage</span><span class="p">)</span> +<span class="k">assert</span> <span class="n">np</span><span class="o">.</span><span class="n">count_nonzero</span><span class="p">(</span><span class="n">matrix</span><span class="p">)</span> <span class="o"><</span> <span class="n">test_percentage</span><span class="o">*</span><span class="mf">1.1</span><span class="o">*</span><span class="n">test_size</span><span class="o">**</span><span class="mi">2</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=0f3d9c79"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 1.2:</b> +Use <a href="https://numpy.org/doc/stable/reference/generated/numpy.ndarray.nbytes.html">array.nbytes</a> to find out how much space a 1000x1000 matrix with 10% non-zero elements takes. Try to explain where this number came from! (Hint: the answer is in the assert statement) +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=aa5a25f9"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="n">my_matrix_size</span> <span class="o">=</span> <span class="n">YOUR_CODE_HERE</span> +<span class="k">assert</span> <span class="n">my_matrix_size</span> <span class="o">==</span> <span class="mi">8</span><span class="o">*</span><span class="n">test_size</span><span class="o">**</span><span class="mi">2</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=912215f3"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p>Next we will explore how to use <code>scipy.sparse</code>, and how this reduces the data size of the matrix. The <a href="https://docs.scipy.org/doc/scipy/reference/sparse.html"> documentation</a> gives us many different types of formats to choose from, so we'll explore two of them: BSR (Block Sparse Row) and CSR (Compressed Sparse Row).</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=25a832c8"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 1.3:</b> + Complete the code below to make a CSR and BSR matrix from the <code>matrix</code> variable. +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=29c0d2dc"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="n">csr_matrix</span> <span class="o">=</span> <span class="n">YOUR_CODE_HERE</span> +<span class="n">bsr_matrix</span> <span class="o">=</span> <span class="n">YOUR_CODE_HERE</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=56334ed7"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p>Let's compare the new storage requirements and see how much of an improvement we got (it should approach the value used above for <code>test_percentage</code>, but not reach it exactly):</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=bb4b15d3"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 1.4:</b> + Run the code below and comment on the improvement and whether or not it reaches the target percentage of sparse values in the non-sparse matrix. +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=a46df127"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"CSR matrix size: </span><span class="si">{</span><span class="n">csr_matrix</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">size</span><span class="si">}</span><span class="s2"> bytes"</span><span class="p">)</span> +<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Compared to the normal matrix, CSR uses this "</span> + <span class="o">+</span><span class="sa">f</span><span class="s2">"fraction of space: </span><span class="si">{</span><span class="n">csr_matrix</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">nbytes</span><span class="o">/</span><span class="n">my_matrix_size</span><span class="si">:</span><span class="s2">0.6f</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span> +<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"BSR matrix size: </span><span class="si">{</span><span class="n">bsr_matrix</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">size</span><span class="si">}</span><span class="s2"> bytes"</span><span class="p">)</span> +<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Compared to the normal matrix, BSR uses this "</span> + <span class="o">+</span><span class="sa">f</span><span class="s2">"fraction of space: </span><span class="si">{</span><span class="n">bsr_matrix</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">nbytes</span><span class="o">/</span><span class="n">my_matrix_size</span><span class="si">:</span><span class="s2">0.6f</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=f832b8e0"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<h2 id="Task-2:-What-is-love?">Task 2: <a href="https://www.youtube.com/watch?v=HEXWRTEbj1I">What is love?</a><a class="anchor-link" href="#Task-2:-What-is-love?">¶</a></h2><p>Let's look into a small example of how sparse matrices can also help improve calculation speeds. We'll study the mysterious case of a massive friend group with a concerning love circle and how we can predict how each person feels with respect to the other. This is quantified by the amount of love, $n_i$, that is "felt" by person $i$. In fact, the feelings grow stronger with time, which means they can be described with a simple differential relationship between <em>neighbors</em>, where each person in the group is happy when the other is sad, but the opposite is true for the other person, which can be defined like this:</p> +$$ +\begin{pmatrix} +\cfrac{dn_1}{dt}\\ +\cfrac{dn_2}{dt} \\ +\end{pmatrix} += +\begin{pmatrix} +0 & 1\\ +-1 & 0 \\ +\end{pmatrix} +\begin{pmatrix} +n_1\\ +n_2 \\ +\end{pmatrix} +$$<p>So in this case, person 2 doesn't like it when person 1 is happy but person 2 likes it when person 1 is happy. If we extend this to a four case scenario we'd get the following matrix: +$$ +\begin{pmatrix} +\cfrac{dn_1}{dt}\\ +\cfrac{dn_2}{dt}\\ +\cfrac{dn_3}{dt}\\ +\cfrac{dn_4}{dt}\\ +\end{pmatrix} += +\begin{pmatrix} +0 & 1 & 0 & -1 \\ +-1 & 0 & 1 & 0 \\ +0 & -1 & 0 & 1 \\ +1 & 0 & -1 & 0 \\ +\end{pmatrix} +\begin{pmatrix} +n_1 \\ +n_2 \\ +n_3 \\ +n_4 \\ +\end{pmatrix} +$$</p> +<p>Now we can see how everyone's feelings towards each other are...complicated!</p> +<p>What happens if we extend it to even more people? The pattern persists, but importantly: <em>if the group gets very large, we will be storing a lot of useless information, all the 0's between the 1's!</em></p> +<p>OK, so maybe this is a silly example, but it creates a problem that is actually very similar to how we use individual elements to construct a global system of equations to solve in the Finite Element Method!</p> +<p>We can easily operationalize the procedure of <em>constructing</em> this matrix using the method <code>ix_</code>, for which a simple example is provided in the code cell below (this example is generic to illustrate <code>ix_</code> usage and is not related to the love circle!):</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=eeeac139"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 2.0:</b> +<p>Read and modify the code cell below until you are confident you understand how the <code>ix_</code> method works.</p> +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=77f295f5"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="n">blank</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">shape</span><span class="o">=</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">4</span><span class="p">))</span> +<span class="n">blueprint</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([[</span><span class="mi">0</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">],</span> + <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">]])</span> + +<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">):</span> + <span class="c1"># First argument will be used for rows</span> + <span class="c1"># Second for columns</span> + <span class="n">blank</span><span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">ix_</span><span class="p">([</span><span class="n">i</span><span class="o">*</span><span class="mi">2</span><span class="p">,</span> <span class="n">i</span><span class="o">*</span><span class="mi">2</span> <span class="o">+</span> <span class="mi">1</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">])]</span> <span class="o">=</span> <span class="n">blueprint</span> + +<span class="nb">print</span><span class="p">(</span><span class="n">blank</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=4acb01e5"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p>Now we return to the love triangle problem and try to construct the matrix for a large group using <code>ix_</code>.</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=7a73f37b-6763-4d1c-92b8-994aa28f8ff6"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 2.1:</b> +Generate the matrix <code>relationship</code> for the differential equation for 1000 people. Use the <a href="https://numpy.org/doc/stable/reference/generated/numpy.ix_.html"><code>numpy.ix_</code></a> function to make your life easier. +<p>Note that we have already provided an easy way to place the smaller sub-matrices in the right place.</p> +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=b622c84f"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="n">N</span> <span class="o">=</span> <span class="mi">1000</span> +<span class="n">relationship</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">shape</span><span class="o">=</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">N</span><span class="p">))</span> + +<span class="n">YOUR_CODE_HERE</span> + +<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">N</span><span class="p">):</span> + <span class="n">relationship</span><span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">ix_</span><span class="p">([</span><span class="n">i</span><span class="p">,</span> <span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">%</span><span class="k">N</span>], [i, (i+1)%N])] = YOUR_CODE_HERE +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=28b9a66f"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p>Remember <code>plt.matshow()</code>? We used this back in Q1 to visualize the contents of a matrix. Try it now to see if we build this matrix correctly with <code>ix_</code>.</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=11c4eb64"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 2.2:</b> + Use <code>plt.matshow()</code> to view the contents of the matrix <code>relationship</code>. +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=2cd01702"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="n">plt</span><span class="o">.</span><span class="n">matshow</span><span class="p">(</span><span class="n">YOUR_CODE_HERE</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=dc948f50"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p>Note that since the matrix is huge, we have to look at only a small subset of it in order to see its contents; try changing the indices of the plotted values to get a better view.</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=ca159fe4"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 2.3:</b> + Try again, but look at a subset of the matrix! +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=8ae5a340"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="n">plt</span><span class="o">.</span><span class="n">matshow</span><span class="p">(</span><span class="n">YOUR_CODE_HERE</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=526706d5"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p>Finally, we are going to use the forward Euler method to simulate this differential equation for a total of 5 seconds over 1000 iterations. This has already been implemented in the <code>test</code> method.</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=9f128b80"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 2.4:</b> +Find the time it takes to evaluate the relationship using <code>timeit</code> by entering the function you wish to evaluate as a string. +<p>HINT: you have already learned how to convert a matrix into a sparse format, and the function is defined for you. Run the code cell and compare the performances of the different matrix formats. Which one is faster? How much space do they take?</p> +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=0a8f83b9"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="n">N_ITS</span> <span class="o">=</span> <span class="mi">1000</span> +<span class="n">T</span> <span class="o">=</span> <span class="mi">5</span> <span class="c1"># Seconds</span> +<span class="n">dt</span> <span class="o">=</span> <span class="n">T</span><span class="o">/</span><span class="n">N_ITS</span> + +<span class="k">def</span> <span class="nf">test</span><span class="p">(</span><span class="n">rel_matrix</span><span class="p">):</span> + <span class="n">state</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">N</span><span class="p">)</span> + <span class="n">state</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span> + <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">N_ITS</span><span class="p">):</span> + <span class="n">state</span> <span class="o">=</span> <span class="n">state</span> <span class="o">+</span> <span class="n">rel_matrix</span> <span class="o">@</span> <span class="n">state</span> <span class="o">*</span> <span class="n">dt</span> + +<span class="n">csr_matrix</span> <span class="o">=</span> <span class="n">YOUR_CODE_HERE</span> +<span class="n">bsr_matrix</span> <span class="o">=</span> <span class="n">YOUR_CODE_HERE</span> +<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Standard: </span><span class="si">{</span><span class="n">timeit</span><span class="o">.</span><span class="n">timeit</span><span class="p">(</span><span class="s1">'test(relationship)'</span><span class="p">,</span> +<span class="w"> </span><span class="nb">globals</span><span class="o">=</span><span class="nb">globals</span><span class="p">(),</span> +<span class="w"> </span><span class="n">number</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span><span class="o">/</span><span class="mi">10</span><span class="si">:</span><span class="s2">.4f</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span> +<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"CSR: </span><span class="si">{</span><span class="n">timeit</span><span class="o">.</span><span class="n">timeit</span><span class="p">(</span><span class="s1">'test(csr_matrix)'</span><span class="p">,</span> +<span class="w"> </span><span class="nb">globals</span><span class="o">=</span><span class="nb">globals</span><span class="p">(),</span> +<span class="w"> </span><span class="n">number</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span><span class="o">/</span><span class="mi">10</span><span class="si">:</span><span class="s2">.4f</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span> +<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"BSR: </span><span class="si">{</span><span class="n">timeit</span><span class="o">.</span><span class="n">timeit</span><span class="p">(</span><span class="s1">'test(bsr_matrix)'</span><span class="p">,</span> +<span class="w"> </span><span class="nb">globals</span><span class="o">=</span><span class="nb">globals</span><span class="p">(),</span> +<span class="w"> </span><span class="n">number</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span><span class="o">/</span><span class="mi">10</span><span class="si">:</span><span class="s2">.4f</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=a843ae4f"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 2.5:</b> +<p>What is the change in performance by using the sparse matrices?</p> +</p> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=50d74c04"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p><em>Your answer here.</em></p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=920bab21"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p>One final consideration when using sparse matrices is that it can take a long time to generate them from a regular matrix. You can test this out by placing the matrix generation inside or outside the <code>timeit</code> code to compare their performances. Try it!</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=bf4fdf38"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p><strong>End of notebook.</strong></p> +<h2 style="height: 60px"> +</h2> +<h3 style="position: absolute; display: flex; flex-grow: 0; flex-shrink: 0; flex-direction: row-reverse; bottom: 60px; right: 50px; margin: 0; border: 0"> +<style> + .markdown {width:100%; position: relative} + article { position: relative } + </style> +<a href="http://creativecommons.org/licenses/by/4.0/" rel="license"> +<img alt="Creative Commons License" src="https://i.creativecommons.org/l/by/4.0/88x31.png" style="border-width:; width:88px; height:auto; padding-top:10px"/> +</a> +<a href="https://www.tudelft.nl/en/ceg" rel="TU Delft"> +<img alt="TU Delft" src="https://gitlab.tudelft.nl/mude/public/-/raw/main/tu-logo/TU_P1_full-color.png" style="border-width:0; width:100px; height:auto; padding-bottom:0px"/> +</a> +<a href="http://mude.citg.tudelft.nl/" rel="MUDE"> +<img alt="MUDE" src="https://gitlab.tudelft.nl/mude/public/-/raw/main/mude-logo/MUDE_Logo-small.png" style="border-width:0; width:100px; height:auto; padding-bottom:0px"/> +</a> +</h3> +<span style="font-size: 75%"> +© Copyright 2024 <a href="http://mude.citg.tudelft.nl/" rel="MUDE">MUDE</a> TU Delft. This work is licensed under a <a href="http://creativecommons.org/licenses/by/4.0/" rel="license">CC BY 4.0 License</a>. + +</span></div> +</div> +</div> +</div> +</main> +</body> +<script type="application/vnd.jupyter.widget-state+json"> +{"state": {}, "version_major": 2, "version_minor": 0} +</script> +</html> diff --git a/src/students/Week_2_2/README.html b/src/students/Week_2_2/README.html new file mode 100644 index 0000000000000000000000000000000000000000..fbbb5968879d663d50d8962649bcdf262631f726 --- /dev/null +++ b/src/students/Week_2_2/README.html @@ -0,0 +1,382 @@ +<!DOCTYPE html> +<html> +<head> +<title>README.md</title> +<meta http-equiv="Content-type" content="text/html;charset=UTF-8"> + +<style> +/* https://github.com/microsoft/vscode/blob/master/extensions/markdown-language-features/media/markdown.css */ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +body { + font-family: var(--vscode-markdown-font-family, -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", sans-serif); + font-size: var(--vscode-markdown-font-size, 14px); + padding: 0 26px; + line-height: var(--vscode-markdown-line-height, 22px); + word-wrap: break-word; +} + +#code-csp-warning { + position: fixed; + top: 0; + right: 0; + color: white; + margin: 16px; + text-align: center; + font-size: 12px; + font-family: sans-serif; + background-color:#444444; + cursor: pointer; + padding: 6px; + box-shadow: 1px 1px 1px rgba(0,0,0,.25); +} + +#code-csp-warning:hover { + text-decoration: none; + background-color:#007acc; + box-shadow: 2px 2px 2px rgba(0,0,0,.25); +} + +body.scrollBeyondLastLine { + margin-bottom: calc(100vh - 22px); +} + +body.showEditorSelection .code-line { + position: relative; +} + +body.showEditorSelection .code-active-line:before, +body.showEditorSelection .code-line:hover:before { + content: ""; + display: block; + position: absolute; + top: 0; + left: -12px; + height: 100%; +} + +body.showEditorSelection li.code-active-line:before, +body.showEditorSelection li.code-line:hover:before { + left: -30px; +} + +.vscode-light.showEditorSelection .code-active-line:before { + border-left: 3px solid rgba(0, 0, 0, 0.15); +} + +.vscode-light.showEditorSelection .code-line:hover:before { + border-left: 3px solid rgba(0, 0, 0, 0.40); +} + +.vscode-light.showEditorSelection .code-line .code-line:hover:before { + border-left: none; +} + +.vscode-dark.showEditorSelection .code-active-line:before { + border-left: 3px solid rgba(255, 255, 255, 0.4); +} + +.vscode-dark.showEditorSelection .code-line:hover:before { + border-left: 3px solid rgba(255, 255, 255, 0.60); +} + +.vscode-dark.showEditorSelection .code-line .code-line:hover:before { + border-left: none; +} + +.vscode-high-contrast.showEditorSelection .code-active-line:before { + border-left: 3px solid rgba(255, 160, 0, 0.7); +} + +.vscode-high-contrast.showEditorSelection .code-line:hover:before { + border-left: 3px solid rgba(255, 160, 0, 1); +} + +.vscode-high-contrast.showEditorSelection .code-line .code-line:hover:before { + border-left: none; +} + +img { + max-width: 100%; + max-height: 100%; +} + +a { + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +a:focus, +input:focus, +select:focus, +textarea:focus { + outline: 1px solid -webkit-focus-ring-color; + outline-offset: -1px; +} + +hr { + border: 0; + height: 2px; + border-bottom: 2px solid; +} + +h1 { + padding-bottom: 0.3em; + line-height: 1.2; + border-bottom-width: 1px; + border-bottom-style: solid; +} + +h1, h2, h3 { + font-weight: normal; +} + +table { + border-collapse: collapse; +} + +table > thead > tr > th { + text-align: left; + border-bottom: 1px solid; +} + +table > thead > tr > th, +table > thead > tr > td, +table > tbody > tr > th, +table > tbody > tr > td { + padding: 5px 10px; +} + +table > tbody > tr + tr > td { + border-top: 1px solid; +} + +blockquote { + margin: 0 7px 0 5px; + padding: 0 16px 0 10px; + border-left-width: 5px; + border-left-style: solid; +} + +code { + font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback"; + font-size: 1em; + line-height: 1.357em; +} + +body.wordWrap pre { + white-space: pre-wrap; +} + +pre:not(.hljs), +pre.hljs code > div { + padding: 16px; + border-radius: 3px; + overflow: auto; +} + +pre code { + color: var(--vscode-editor-foreground); + tab-size: 4; +} + +/** Theming */ + +.vscode-light pre { + background-color: rgba(220, 220, 220, 0.4); +} + +.vscode-dark pre { + background-color: rgba(10, 10, 10, 0.4); +} + +.vscode-high-contrast pre { + background-color: rgb(0, 0, 0); +} + +.vscode-high-contrast h1 { + border-color: rgb(0, 0, 0); +} + +.vscode-light table > thead > tr > th { + border-color: rgba(0, 0, 0, 0.69); +} + +.vscode-dark table > thead > tr > th { + border-color: rgba(255, 255, 255, 0.69); +} + +.vscode-light h1, +.vscode-light hr, +.vscode-light table > tbody > tr + tr > td { + border-color: rgba(0, 0, 0, 0.18); +} + +.vscode-dark h1, +.vscode-dark hr, +.vscode-dark table > tbody > tr + tr > td { + border-color: rgba(255, 255, 255, 0.18); +} + +</style> + +<style> +/* Tomorrow Theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ + +/* Tomorrow Comment */ +.hljs-comment, +.hljs-quote { + color: #8e908c; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-deletion { + color: #c82829; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params, +.hljs-meta, +.hljs-link { + color: #f5871f; +} + +/* Tomorrow Yellow */ +.hljs-attribute { + color: #eab700; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition { + color: #718c00; +} + +/* Tomorrow Blue */ +.hljs-title, +.hljs-section { + color: #4271ae; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #8959a8; +} + +.hljs { + display: block; + overflow-x: auto; + color: #4d4d4c; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} +</style> + +<style> +/* + * Markdown PDF CSS + */ + + body { + font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", sans-serif, "Meiryo"; + padding: 0 12px; +} + +pre { + background-color: #f8f8f8; + border: 1px solid #cccccc; + border-radius: 3px; + overflow-x: auto; + white-space: pre-wrap; + overflow-wrap: break-word; +} + +pre:not(.hljs) { + padding: 23px; + line-height: 19px; +} + +blockquote { + background: rgba(127, 127, 127, 0.1); + border-color: rgba(0, 122, 204, 0.5); +} + +.emoji { + height: 1.4em; +} + +code { + font-size: 14px; + line-height: 19px; +} + +/* for inline code */ +:not(pre):not(.hljs) > code { + color: #C9AE75; /* Change the old color so it seems less like an error */ + font-size: inherit; +} + +/* Page Break : use <div class="page"/> to insert page break +-------------------------------------------------------- */ +.page { + page-break-after: always; +} + +</style> + +<script src="https://unpkg.com/mermaid/dist/mermaid.min.js"></script> +</head> +<body> + <script> + mermaid.initialize({ + startOnLoad: true, + theme: document.body.classList.contains('vscode-dark') || document.body.classList.contains('vscode-high-contrast') + ? 'dark' + : 'default' + }); + </script> +<h1 id="pa-22-love-is-sparse">PA 2.2: Love is Sparse</h1> +<p><em><a href="http://mude.citg.tudelft.nl/">CEGM1000 MUDE</a>: Week 2.2. Due: before Friday, November 22nd, 2024.</em></p> +<p><em>You can access this assignment with the following link: <a href="https://classroom.github.com/a/yyIrSrxc">classroom.github.com/a/yyIrSrxc</a>.</em></p> +<p>This assignment will introduce you to the concept of sparse matrices in Python and how they can be useful to speed up computations and reduce file sizes. This is especially important when using the numerical schemes we are learning about (FDM, FVM, FEM) to solve problems with a lot of unknowns at each time step. To accomplish this, we will be using the <code>scipy.sparse</code> library.</p> +<p>The instructions and technical content for this PA are included in the attached notebook file. Enjoy!</p> +<h2 id="grading-criteria">Grading Criteria</h2> +<p>You will pass this PA if:</p> +<ol> +<li>Your notebook <code>PA_2_2_love_is_sparse.ipynb</code> runs without errors.</li> +</ol> +<p><strong>End of file.</strong></p> +<span style="font-size: 75%"> +© Copyright 2024 <a rel="MUDE" href="http://mude.citg.tudelft.nl/">MUDE</a>, TU Delft. This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">CC BY 4.0 License</a>. +</body> +</html> diff --git a/src/teachers/Week_2_2/PA_2_2_love_is_sparse.html b/src/teachers/Week_2_2/PA_2_2_love_is_sparse.html new file mode 100644 index 0000000000000000000000000000000000000000..177a2ed1b9f0fded007f64c475c0f7a37614eaf4 --- /dev/null +++ b/src/teachers/Week_2_2/PA_2_2_love_is_sparse.html @@ -0,0 +1,8122 @@ +<!DOCTYPE html> + +<html lang="en"> +<head><meta charset="utf-8"/> +<meta content="width=device-width, initial-scale=1.0" name="viewport"/> +<title>PA_2_2_love_is_sparse</title><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.min.js"></script><script> +(function() { + function addWidgetsRenderer() { + var mimeElement = document.querySelector('script[type="application/vnd.jupyter.widget-view+json"]'); + var scriptElement = document.createElement('script'); + + var widgetRendererSrc = 'https://unpkg.com/@jupyter-widgets/html-manager@*/dist/embed-amd.js'; + + var widgetState; + + // Fallback for older version: + try { + widgetState = mimeElement && JSON.parse(mimeElement.innerHTML); + + if (widgetState && (widgetState.version_major < 2 || !widgetState.version_major)) { + + var widgetRendererSrc = 'https://unpkg.com/@jupyter-js-widgets@*/dist/embed.js'; + + } + } catch(e) {} + + scriptElement.src = widgetRendererSrc; + document.body.appendChild(scriptElement); + } + + document.addEventListener('DOMContentLoaded', addWidgetsRenderer); +}()); +</script> +<style type="text/css"> + pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: var(--jp-cell-editor-active-background) } +.highlight { background: var(--jp-cell-editor-background); color: var(--jp-mirror-editor-variable-color) } +.highlight .c { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment */ +.highlight .err { color: var(--jp-mirror-editor-error-color) } /* Error */ +.highlight .k { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword */ +.highlight .o { color: var(--jp-mirror-editor-operator-color); font-weight: bold } /* Operator */ +.highlight .p { color: var(--jp-mirror-editor-punctuation-color) } /* Punctuation */ +.highlight .ch { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Preproc */ +.highlight .cpf { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Single */ +.highlight .cs { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Special */ +.highlight .kc { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Type */ +.highlight .m { color: var(--jp-mirror-editor-number-color) } /* Literal.Number */ +.highlight .s { color: var(--jp-mirror-editor-string-color) } /* Literal.String */ +.highlight .ow { color: var(--jp-mirror-editor-operator-color); font-weight: bold } /* Operator.Word */ +.highlight .pm { color: var(--jp-mirror-editor-punctuation-color) } /* Punctuation.Marker */ +.highlight .w { color: var(--jp-mirror-editor-variable-color) } /* Text.Whitespace */ +.highlight .mb { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Bin */ +.highlight .mf { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Float */ +.highlight .mh { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Hex */ +.highlight .mi { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Integer */ +.highlight .mo { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Oct */ +.highlight .sa { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Affix */ +.highlight .sb { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Backtick */ +.highlight .sc { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Char */ +.highlight .dl { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Delimiter */ +.highlight .sd { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Doc */ +.highlight .s2 { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Double */ +.highlight .se { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Escape */ +.highlight .sh { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Heredoc */ +.highlight .si { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Interpol */ +.highlight .sx { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Other */ +.highlight .sr { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Regex */ +.highlight .s1 { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Single */ +.highlight .ss { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Symbol */ +.highlight .il { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Integer.Long */ + </style> +<style type="text/css"> +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/* + * Mozilla scrollbar styling + */ + +/* use standard opaque scrollbars for most nodes */ +[data-jp-theme-scrollbars='true'] { + scrollbar-color: rgb(var(--jp-scrollbar-thumb-color)) + var(--jp-scrollbar-background-color); +} + +/* for code nodes, use a transparent style of scrollbar. These selectors + * will match lower in the tree, and so will override the above */ +[data-jp-theme-scrollbars='true'] .CodeMirror-hscrollbar, +[data-jp-theme-scrollbars='true'] .CodeMirror-vscrollbar { + scrollbar-color: rgba(var(--jp-scrollbar-thumb-color), 0.5) transparent; +} + +/* tiny scrollbar */ + +.jp-scrollbar-tiny { + scrollbar-color: rgba(var(--jp-scrollbar-thumb-color), 0.5) transparent; + scrollbar-width: thin; +} + +/* tiny scrollbar */ + +.jp-scrollbar-tiny::-webkit-scrollbar, +.jp-scrollbar-tiny::-webkit-scrollbar-corner { + background-color: transparent; + height: 4px; + width: 4px; +} + +.jp-scrollbar-tiny::-webkit-scrollbar-thumb { + background: rgba(var(--jp-scrollbar-thumb-color), 0.5); +} + +.jp-scrollbar-tiny::-webkit-scrollbar-track:horizontal { + border-left: 0 solid transparent; + border-right: 0 solid transparent; +} + +.jp-scrollbar-tiny::-webkit-scrollbar-track:vertical { + border-top: 0 solid transparent; + border-bottom: 0 solid transparent; +} + +/* + * Lumino + */ + +.lm-ScrollBar[data-orientation='horizontal'] { + min-height: 16px; + max-height: 16px; + min-width: 45px; + border-top: 1px solid #a0a0a0; +} + +.lm-ScrollBar[data-orientation='vertical'] { + min-width: 16px; + max-width: 16px; + min-height: 45px; + border-left: 1px solid #a0a0a0; +} + +.lm-ScrollBar-button { + background-color: #f0f0f0; + background-position: center center; + min-height: 15px; + max-height: 15px; + min-width: 15px; + max-width: 15px; +} + +.lm-ScrollBar-button:hover { + background-color: #dadada; +} + +.lm-ScrollBar-button.lm-mod-active { + background-color: #cdcdcd; +} + +.lm-ScrollBar-track { + background: #f0f0f0; +} + +.lm-ScrollBar-thumb { + background: #cdcdcd; +} + +.lm-ScrollBar-thumb:hover { + background: #bababa; +} + +.lm-ScrollBar-thumb.lm-mod-active { + background: #a0a0a0; +} + +.lm-ScrollBar[data-orientation='horizontal'] .lm-ScrollBar-thumb { + height: 100%; + min-width: 15px; + border-left: 1px solid #a0a0a0; + border-right: 1px solid #a0a0a0; +} + +.lm-ScrollBar[data-orientation='vertical'] .lm-ScrollBar-thumb { + width: 100%; + min-height: 15px; + border-top: 1px solid #a0a0a0; + border-bottom: 1px solid #a0a0a0; +} + +.lm-ScrollBar[data-orientation='horizontal'] + .lm-ScrollBar-button[data-action='decrement'] { + background-image: var(--jp-icon-caret-left); + background-size: 17px; +} + +.lm-ScrollBar[data-orientation='horizontal'] + .lm-ScrollBar-button[data-action='increment'] { + background-image: var(--jp-icon-caret-right); + background-size: 17px; +} + +.lm-ScrollBar[data-orientation='vertical'] + .lm-ScrollBar-button[data-action='decrement'] { + background-image: var(--jp-icon-caret-up); + background-size: 17px; +} + +.lm-ScrollBar[data-orientation='vertical'] + .lm-ScrollBar-button[data-action='increment'] { + background-image: var(--jp-icon-caret-down); + background-size: 17px; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-Widget { + box-sizing: border-box; + position: relative; + overflow: hidden; +} + +.lm-Widget.lm-mod-hidden { + display: none !important; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +.lm-AccordionPanel[data-orientation='horizontal'] > .lm-AccordionPanel-title { + /* Title is rotated for horizontal accordion panel using CSS */ + display: block; + transform-origin: top left; + transform: rotate(-90deg) translate(-100%); +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-CommandPalette { + display: flex; + flex-direction: column; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.lm-CommandPalette-search { + flex: 0 0 auto; +} + +.lm-CommandPalette-content { + flex: 1 1 auto; + margin: 0; + padding: 0; + min-height: 0; + overflow: auto; + list-style-type: none; +} + +.lm-CommandPalette-header { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.lm-CommandPalette-item { + display: flex; + flex-direction: row; +} + +.lm-CommandPalette-itemIcon { + flex: 0 0 auto; +} + +.lm-CommandPalette-itemContent { + flex: 1 1 auto; + overflow: hidden; +} + +.lm-CommandPalette-itemShortcut { + flex: 0 0 auto; +} + +.lm-CommandPalette-itemLabel { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.lm-close-icon { + border: 1px solid transparent; + background-color: transparent; + position: absolute; + z-index: 1; + right: 3%; + top: 0; + bottom: 0; + margin: auto; + padding: 7px 0; + display: none; + vertical-align: middle; + outline: 0; + cursor: pointer; +} +.lm-close-icon:after { + content: 'X'; + display: block; + width: 15px; + height: 15px; + text-align: center; + color: #000; + font-weight: normal; + font-size: 12px; + cursor: pointer; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-DockPanel { + z-index: 0; +} + +.lm-DockPanel-widget { + z-index: 0; +} + +.lm-DockPanel-tabBar { + z-index: 1; +} + +.lm-DockPanel-handle { + z-index: 2; +} + +.lm-DockPanel-handle.lm-mod-hidden { + display: none !important; +} + +.lm-DockPanel-handle:after { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + content: ''; +} + +.lm-DockPanel-handle[data-orientation='horizontal'] { + cursor: ew-resize; +} + +.lm-DockPanel-handle[data-orientation='vertical'] { + cursor: ns-resize; +} + +.lm-DockPanel-handle[data-orientation='horizontal']:after { + left: 50%; + min-width: 8px; + transform: translateX(-50%); +} + +.lm-DockPanel-handle[data-orientation='vertical']:after { + top: 50%; + min-height: 8px; + transform: translateY(-50%); +} + +.lm-DockPanel-overlay { + z-index: 3; + box-sizing: border-box; + pointer-events: none; +} + +.lm-DockPanel-overlay.lm-mod-hidden { + display: none !important; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-Menu { + z-index: 10000; + position: absolute; + white-space: nowrap; + overflow-x: hidden; + overflow-y: auto; + outline: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.lm-Menu-content { + margin: 0; + padding: 0; + display: table; + list-style-type: none; +} + +.lm-Menu-item { + display: table-row; +} + +.lm-Menu-item.lm-mod-hidden, +.lm-Menu-item.lm-mod-collapsed { + display: none !important; +} + +.lm-Menu-itemIcon, +.lm-Menu-itemSubmenuIcon { + display: table-cell; + text-align: center; +} + +.lm-Menu-itemLabel { + display: table-cell; + text-align: left; +} + +.lm-Menu-itemShortcut { + display: table-cell; + text-align: right; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-MenuBar { + outline: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.lm-MenuBar-content { + margin: 0; + padding: 0; + display: flex; + flex-direction: row; + list-style-type: none; +} + +.lm-MenuBar-item { + box-sizing: border-box; +} + +.lm-MenuBar-itemIcon, +.lm-MenuBar-itemLabel { + display: inline-block; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-ScrollBar { + display: flex; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.lm-ScrollBar[data-orientation='horizontal'] { + flex-direction: row; +} + +.lm-ScrollBar[data-orientation='vertical'] { + flex-direction: column; +} + +.lm-ScrollBar-button { + box-sizing: border-box; + flex: 0 0 auto; +} + +.lm-ScrollBar-track { + box-sizing: border-box; + position: relative; + overflow: hidden; + flex: 1 1 auto; +} + +.lm-ScrollBar-thumb { + box-sizing: border-box; + position: absolute; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-SplitPanel-child { + z-index: 0; +} + +.lm-SplitPanel-handle { + z-index: 1; +} + +.lm-SplitPanel-handle.lm-mod-hidden { + display: none !important; +} + +.lm-SplitPanel-handle:after { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + content: ''; +} + +.lm-SplitPanel[data-orientation='horizontal'] > .lm-SplitPanel-handle { + cursor: ew-resize; +} + +.lm-SplitPanel[data-orientation='vertical'] > .lm-SplitPanel-handle { + cursor: ns-resize; +} + +.lm-SplitPanel[data-orientation='horizontal'] > .lm-SplitPanel-handle:after { + left: 50%; + min-width: 8px; + transform: translateX(-50%); +} + +.lm-SplitPanel[data-orientation='vertical'] > .lm-SplitPanel-handle:after { + top: 50%; + min-height: 8px; + transform: translateY(-50%); +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-TabBar { + display: flex; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.lm-TabBar[data-orientation='horizontal'] { + flex-direction: row; + align-items: flex-end; +} + +.lm-TabBar[data-orientation='vertical'] { + flex-direction: column; + align-items: flex-end; +} + +.lm-TabBar-content { + margin: 0; + padding: 0; + display: flex; + flex: 1 1 auto; + list-style-type: none; +} + +.lm-TabBar[data-orientation='horizontal'] > .lm-TabBar-content { + flex-direction: row; +} + +.lm-TabBar[data-orientation='vertical'] > .lm-TabBar-content { + flex-direction: column; +} + +.lm-TabBar-tab { + display: flex; + flex-direction: row; + box-sizing: border-box; + overflow: hidden; + touch-action: none; /* Disable native Drag/Drop */ +} + +.lm-TabBar-tabIcon, +.lm-TabBar-tabCloseIcon { + flex: 0 0 auto; +} + +.lm-TabBar-tabLabel { + flex: 1 1 auto; + overflow: hidden; + white-space: nowrap; +} + +.lm-TabBar-tabInput { + user-select: all; + width: 100%; + box-sizing: border-box; +} + +.lm-TabBar-tab.lm-mod-hidden { + display: none !important; +} + +.lm-TabBar-addButton.lm-mod-hidden { + display: none !important; +} + +.lm-TabBar.lm-mod-dragging .lm-TabBar-tab { + position: relative; +} + +.lm-TabBar.lm-mod-dragging[data-orientation='horizontal'] .lm-TabBar-tab { + left: 0; + transition: left 150ms ease; +} + +.lm-TabBar.lm-mod-dragging[data-orientation='vertical'] .lm-TabBar-tab { + top: 0; + transition: top 150ms ease; +} + +.lm-TabBar.lm-mod-dragging .lm-TabBar-tab.lm-mod-dragging { + transition: none; +} + +.lm-TabBar-tabLabel .lm-TabBar-tabInput { + user-select: all; + width: 100%; + box-sizing: border-box; + background: inherit; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-TabPanel-tabBar { + z-index: 1; +} + +.lm-TabPanel-stackedPanel { + z-index: 0; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-Collapse { + display: flex; + flex-direction: column; + align-items: stretch; +} + +.jp-Collapse-header { + padding: 1px 12px; + background-color: var(--jp-layout-color1); + border-bottom: solid var(--jp-border-width) var(--jp-border-color2); + color: var(--jp-ui-font-color1); + cursor: pointer; + display: flex; + align-items: center; + font-size: var(--jp-ui-font-size0); + font-weight: 600; + text-transform: uppercase; + user-select: none; +} + +.jp-Collapser-icon { + height: 16px; +} + +.jp-Collapse-header-collapsed .jp-Collapser-icon { + transform: rotate(-90deg); + margin: auto 0; +} + +.jp-Collapser-title { + line-height: 25px; +} + +.jp-Collapse-contents { + padding: 0 12px; + background-color: var(--jp-layout-color1); + color: var(--jp-ui-font-color1); + overflow: auto; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/* This file was auto-generated by ensureUiComponents() in @jupyterlab/buildutils */ + +/** + * (DEPRECATED) Support for consuming icons as CSS background images + */ + +/* Icons urls */ + +:root { + --jp-icon-add-above: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzEzN18xOTQ5MikiPgo8cGF0aCBjbGFzcz0ianAtaWNvbjMiIGQ9Ik00Ljc1IDQuOTMwNjZINi42MjVWNi44MDU2NkM2LjYyNSA3LjAxMTkxIDYuNzkzNzUgNy4xODA2NiA3IDcuMTgwNjZDNy4yMDYyNSA3LjE4MDY2IDcuMzc1IDcuMDExOTEgNy4zNzUgNi44MDU2NlY0LjkzMDY2SDkuMjVDOS40NTYyNSA0LjkzMDY2IDkuNjI1IDQuNzYxOTEgOS42MjUgNC41NTU2NkM5LjYyNSA0LjM0OTQxIDkuNDU2MjUgNC4xODA2NiA5LjI1IDQuMTgwNjZINy4zNzVWMi4zMDU2NkM3LjM3NSAyLjA5OTQxIDcuMjA2MjUgMS45MzA2NiA3IDEuOTMwNjZDNi43OTM3NSAxLjkzMDY2IDYuNjI1IDIuMDk5NDEgNi42MjUgMi4zMDU2NlY0LjE4MDY2SDQuNzVDNC41NDM3NSA0LjE4MDY2IDQuMzc1IDQuMzQ5NDEgNC4zNzUgNC41NTU2NkM0LjM3NSA0Ljc2MTkxIDQuNTQzNzUgNC45MzA2NiA0Ljc1IDQuOTMwNjZaIiBmaWxsPSIjNjE2MTYxIiBzdHJva2U9IiM2MTYxNjEiIHN0cm9rZS13aWR0aD0iMC43Ii8+CjwvZz4KPHBhdGggY2xhc3M9ImpwLWljb24zIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTExLjUgOS41VjExLjVMMi41IDExLjVWOS41TDExLjUgOS41Wk0xMiA4QzEyLjU1MjMgOCAxMyA4LjQ0NzcyIDEzIDlWMTJDMTMgMTIuNTUyMyAxMi41NTIzIDEzIDEyIDEzTDIgMTNDMS40NDc3MiAxMyAxIDEyLjU1MjMgMSAxMlY5QzEgOC40NDc3MiAxLjQ0NzcxIDggMiA4TDEyIDhaIiBmaWxsPSIjNjE2MTYxIi8+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzEzN18xOTQ5MiI+CjxyZWN0IGNsYXNzPSJqcC1pY29uMyIgd2lkdGg9IjYiIGhlaWdodD0iNiIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0ibWF0cml4KC0xIDAgMCAxIDEwIDEuNTU1NjYpIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg==); + --jp-icon-add-below: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzEzN18xOTQ5OCkiPgo8cGF0aCBjbGFzcz0ianAtaWNvbjMiIGQ9Ik05LjI1IDEwLjA2OTNMNy4zNzUgMTAuMDY5M0w3LjM3NSA4LjE5NDM0QzcuMzc1IDcuOTg4MDkgNy4yMDYyNSA3LjgxOTM0IDcgNy44MTkzNEM2Ljc5Mzc1IDcuODE5MzQgNi42MjUgNy45ODgwOSA2LjYyNSA4LjE5NDM0TDYuNjI1IDEwLjA2OTNMNC43NSAxMC4wNjkzQzQuNTQzNzUgMTAuMDY5MyA0LjM3NSAxMC4yMzgxIDQuMzc1IDEwLjQ0NDNDNC4zNzUgMTAuNjUwNiA0LjU0Mzc1IDEwLjgxOTMgNC43NSAxMC44MTkzTDYuNjI1IDEwLjgxOTNMNi42MjUgMTIuNjk0M0M2LjYyNSAxMi45MDA2IDYuNzkzNzUgMTMuMDY5MyA3IDEzLjA2OTNDNy4yMDYyNSAxMy4wNjkzIDcuMzc1IDEyLjkwMDYgNy4zNzUgMTIuNjk0M0w3LjM3NSAxMC44MTkzTDkuMjUgMTAuODE5M0M5LjQ1NjI1IDEwLjgxOTMgOS42MjUgMTAuNjUwNiA5LjYyNSAxMC40NDQzQzkuNjI1IDEwLjIzODEgOS40NTYyNSAxMC4wNjkzIDkuMjUgMTAuMDY5M1oiIGZpbGw9IiM2MTYxNjEiIHN0cm9rZT0iIzYxNjE2MSIgc3Ryb2tlLXdpZHRoPSIwLjciLz4KPC9nPgo8cGF0aCBjbGFzcz0ianAtaWNvbjMiIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMi41IDUuNUwyLjUgMy41TDExLjUgMy41TDExLjUgNS41TDIuNSA1LjVaTTIgN0MxLjQ0NzcyIDcgMSA2LjU1MjI4IDEgNkwxIDNDMSAyLjQ0NzcyIDEuNDQ3NzIgMiAyIDJMMTIgMkMxMi41NTIzIDIgMTMgMi40NDc3MiAxMyAzTDEzIDZDMTMgNi41NTIyOSAxMi41NTIzIDcgMTIgN0wyIDdaIiBmaWxsPSIjNjE2MTYxIi8+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzEzN18xOTQ5OCI+CjxyZWN0IGNsYXNzPSJqcC1pY29uMyIgd2lkdGg9IjYiIGhlaWdodD0iNiIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0ibWF0cml4KDEgMS43NDg0NmUtMDcgMS43NDg0NmUtMDcgLTEgNCAxMy40NDQzKSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=); + --jp-icon-add: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTE5IDEzaC02djZoLTJ2LTZINXYtMmg2VjVoMnY2aDZ2MnoiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-bell: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE2IDE2IiB2ZXJzaW9uPSIxLjEiPgogICA8cGF0aCBjbGFzcz0ianAtaWNvbjIganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjMzMzMzMzIgogICAgICBkPSJtOCAwLjI5Yy0xLjQgMC0yLjcgMC43My0zLjYgMS44LTEuMiAxLjUtMS40IDMuNC0xLjUgNS4yLTAuMTggMi4yLTAuNDQgNC0yLjMgNS4zbDAuMjggMS4zaDVjMC4wMjYgMC42NiAwLjMyIDEuMSAwLjcxIDEuNSAwLjg0IDAuNjEgMiAwLjYxIDIuOCAwIDAuNTItMC40IDAuNi0xIDAuNzEtMS41aDVsMC4yOC0xLjNjLTEuOS0wLjk3LTIuMi0zLjMtMi4zLTUuMy0wLjEzLTEuOC0wLjI2LTMuNy0xLjUtNS4yLTAuODUtMS0yLjItMS44LTMuNi0xLjh6bTAgMS40YzAuODggMCAxLjkgMC41NSAyLjUgMS4zIDAuODggMS4xIDEuMSAyLjcgMS4yIDQuNCAwLjEzIDEuNyAwLjIzIDMuNiAxLjMgNS4yaC0xMGMxLjEtMS42IDEuMi0zLjQgMS4zLTUuMiAwLjEzLTEuNyAwLjMtMy4zIDEuMi00LjQgMC41OS0wLjcyIDEuNi0xLjMgMi41LTEuM3ptLTAuNzQgMTJoMS41Yy0wLjAwMTUgMC4yOCAwLjAxNSAwLjc5LTAuNzQgMC43OS0wLjczIDAuMDAxNi0wLjcyLTAuNTMtMC43NC0wLjc5eiIgLz4KPC9zdmc+Cg==); + --jp-icon-bug-dot: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiM2MTYxNjEiPgogICAgICAgIDxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTcuMTkgOEgyMFYxMEgxNy45MUMxNy45NiAxMC4zMyAxOCAxMC42NiAxOCAxMVYxMkgyMFYxNEgxOC41SDE4VjE0LjAyNzVDMTUuNzUgMTQuMjc2MiAxNCAxNi4xODM3IDE0IDE4LjVDMTQgMTkuMjA4IDE0LjE2MzUgMTkuODc3OSAxNC40NTQ5IDIwLjQ3MzlDMTMuNzA2MyAyMC44MTE3IDEyLjg3NTcgMjEgMTIgMjFDOS43OCAyMSA3Ljg1IDE5Ljc5IDYuODEgMThINFYxNkg2LjA5QzYuMDQgMTUuNjcgNiAxNS4zNCA2IDE1VjE0SDRWMTJINlYxMUM2IDEwLjY2IDYuMDQgMTAuMzMgNi4wOSAxMEg0VjhINi44MUM3LjI2IDcuMjIgNy44OCA2LjU1IDguNjIgNi4wNEw3IDQuNDFMOC40MSAzTDEwLjU5IDUuMTdDMTEuMDQgNS4wNiAxMS41MSA1IDEyIDVDMTIuNDkgNSAxMi45NiA1LjA2IDEzLjQyIDUuMTdMMTUuNTkgM0wxNyA0LjQxTDE1LjM3IDYuMDRDMTYuMTIgNi41NSAxNi43NCA3LjIyIDE3LjE5IDhaTTEwIDE2SDE0VjE0SDEwVjE2Wk0xMCAxMkgxNFYxMEgxMFYxMloiIGZpbGw9IiM2MTYxNjEiLz4KICAgICAgICA8cGF0aCBkPSJNMjIgMTguNUMyMiAyMC40MzMgMjAuNDMzIDIyIDE4LjUgMjJDMTYuNTY3IDIyIDE1IDIwLjQzMyAxNSAxOC41QzE1IDE2LjU2NyAxNi41NjcgMTUgMTguNSAxNUMyMC40MzMgMTUgMjIgMTYuNTY3IDIyIDE4LjVaIiBmaWxsPSIjNjE2MTYxIi8+CiAgICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-bug: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxwYXRoIGQ9Ik0yMCA4aC0yLjgxYy0uNDUtLjc4LTEuMDctMS40NS0xLjgyLTEuOTZMMTcgNC40MSAxNS41OSAzbC0yLjE3IDIuMTdDMTIuOTYgNS4wNiAxMi40OSA1IDEyIDVjLS40OSAwLS45Ni4wNi0xLjQxLjE3TDguNDEgMyA3IDQuNDFsMS42MiAxLjYzQzcuODggNi41NSA3LjI2IDcuMjIgNi44MSA4SDR2MmgyLjA5Yy0uMDUuMzMtLjA5LjY2LS4wOSAxdjFINHYyaDJ2MWMwIC4zNC4wNC42Ny4wOSAxSDR2MmgyLjgxYzEuMDQgMS43OSAyLjk3IDMgNS4xOSAzczQuMTUtMS4yMSA1LjE5LTNIMjB2LTJoLTIuMDljLjA1LS4zMy4wOS0uNjYuMDktMXYtMWgydi0yaC0ydi0xYzAtLjM0LS4wNC0uNjctLjA5LTFIMjBWOHptLTYgOGgtNHYtMmg0djJ6bTAtNGgtNHYtMmg0djJ6Ii8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-build: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTE0LjkgMTcuNDVDMTYuMjUgMTcuNDUgMTcuMzUgMTYuMzUgMTcuMzUgMTVDMTcuMzUgMTMuNjUgMTYuMjUgMTIuNTUgMTQuOSAxMi41NUMxMy41NCAxMi41NSAxMi40NSAxMy42NSAxMi40NSAxNUMxMi40NSAxNi4zNSAxMy41NCAxNy40NSAxNC45IDE3LjQ1Wk0yMC4xIDE1LjY4TDIxLjU4IDE2Ljg0QzIxLjcxIDE2Ljk1IDIxLjc1IDE3LjEzIDIxLjY2IDE3LjI5TDIwLjI2IDE5LjcxQzIwLjE3IDE5Ljg2IDIwIDE5LjkyIDE5LjgzIDE5Ljg2TDE4LjA5IDE5LjE2QzE3LjczIDE5LjQ0IDE3LjMzIDE5LjY3IDE2LjkxIDE5Ljg1TDE2LjY0IDIxLjdDMTYuNjIgMjEuODcgMTYuNDcgMjIgMTYuMyAyMkgxMy41QzEzLjMyIDIyIDEzLjE4IDIxLjg3IDEzLjE1IDIxLjdMMTIuODkgMTkuODVDMTIuNDYgMTkuNjcgMTIuMDcgMTkuNDQgMTEuNzEgMTkuMTZMOS45NjAwMiAxOS44NkM5LjgxMDAyIDE5LjkyIDkuNjIwMDIgMTkuODYgOS41NDAwMiAxOS43MUw4LjE0MDAyIDE3LjI5QzguMDUwMDIgMTcuMTMgOC4wOTAwMiAxNi45NSA4LjIyMDAyIDE2Ljg0TDkuNzAwMDIgMTUuNjhMOS42NTAwMSAxNUw5LjcwMDAyIDE0LjMxTDguMjIwMDIgMTMuMTZDOC4wOTAwMiAxMy4wNSA4LjA1MDAyIDEyLjg2IDguMTQwMDIgMTIuNzFMOS41NDAwMiAxMC4yOUM5LjYyMDAyIDEwLjEzIDkuODEwMDIgMTAuMDcgOS45NjAwMiAxMC4xM0wxMS43MSAxMC44NEMxMi4wNyAxMC41NiAxMi40NiAxMC4zMiAxMi44OSAxMC4xNUwxMy4xNSA4LjI4OTk4QzEzLjE4IDguMTI5OTggMTMuMzIgNy45OTk5OCAxMy41IDcuOTk5OThIMTYuM0MxNi40NyA3Ljk5OTk4IDE2LjYyIDguMTI5OTggMTYuNjQgOC4yODk5OEwxNi45MSAxMC4xNUMxNy4zMyAxMC4zMiAxNy43MyAxMC41NiAxOC4wOSAxMC44NEwxOS44MyAxMC4xM0MyMCAxMC4wNyAyMC4xNyAxMC4xMyAyMC4yNiAxMC4yOUwyMS42NiAxMi43MUMyMS43NSAxMi44NiAyMS43MSAxMy4wNSAyMS41OCAxMy4xNkwyMC4xIDE0LjMxTDIwLjE1IDE1TDIwLjEgMTUuNjhaIi8+CiAgICA8cGF0aCBkPSJNNy4zMjk2NiA3LjQ0NDU0QzguMDgzMSA3LjAwOTU0IDguMzM5MzIgNi4wNTMzMiA3LjkwNDMyIDUuMjk5ODhDNy40NjkzMiA0LjU0NjQzIDYuNTA4MSA0LjI4MTU2IDUuNzU0NjYgNC43MTY1NkM1LjM5MTc2IDQuOTI2MDggNS4xMjY5NSA1LjI3MTE4IDUuMDE4NDkgNS42NzU5NEM0LjkxMDA0IDYuMDgwNzEgNC45NjY4MiA2LjUxMTk4IDUuMTc2MzQgNi44NzQ4OEM1LjYxMTM0IDcuNjI4MzIgNi41NzYyMiA3Ljg3OTU0IDcuMzI5NjYgNy40NDQ1NFpNOS42NTcxOCA0Ljc5NTkzTDEwLjg2NzIgNC45NTE3OUMxMC45NjI4IDQuOTc3NDEgMTEuMDQwMiA1LjA3MTMzIDExLjAzODIgNS4xODc5M0wxMS4wMzg4IDYuOTg4OTNDMTEuMDQ1NSA3LjEwMDU0IDEwLjk2MTYgNy4xOTUxOCAxMC44NTUgNy4yMTA1NEw5LjY2MDAxIDcuMzgwODNMOS4yMzkxNSA4LjEzMTg4TDkuNjY5NjEgOS4yNTc0NUM5LjcwNzI5IDkuMzYyNzEgOS42NjkzNCA5LjQ3Njk5IDkuNTc0MDggOS41MzE5OUw4LjAxNTIzIDEwLjQzMkM3LjkxMTMxIDEwLjQ5MiA3Ljc5MzM3IDEwLjQ2NzcgNy43MjEwNSAxMC4zODI0TDYuOTg3NDggOS40MzE4OEw2LjEwOTMxIDkuNDMwODNMNS4zNDcwNCAxMC4zOTA1QzUuMjg5MDkgMTAuNDcwMiA1LjE3MzgzIDEwLjQ5MDUgNS4wNzE4NyAxMC40MzM5TDMuNTEyNDUgOS41MzI5M0MzLjQxMDQ5IDkuNDc2MzMgMy4zNzY0NyA5LjM1NzQxIDMuNDEwNzUgOS4yNTY3OUwzLjg2MzQ3IDguMTQwOTNMMy42MTc0OSA3Ljc3NDg4TDMuNDIzNDcgNy4zNzg4M0wyLjIzMDc1IDcuMjEyOTdDMi4xMjY0NyA3LjE5MjM1IDIuMDQwNDkgNy4xMDM0MiAyLjA0MjQ1IDYuOTg2ODJMMi4wNDE4NyA1LjE4NTgyQzIuMDQzODMgNS4wNjkyMiAyLjExOTA5IDQuOTc5NTggMi4yMTcwNCA0Ljk2OTIyTDMuNDIwNjUgNC43OTM5M0wzLjg2NzQ5IDQuMDI3ODhMMy40MTEwNSAyLjkxNzMxQzMuMzczMzcgMi44MTIwNCAzLjQxMTMxIDIuNjk3NzYgMy41MTUyMyAyLjYzNzc2TDUuMDc0MDggMS43Mzc3NkM1LjE2OTM0IDEuNjgyNzYgNS4yODcyOSAxLjcwNzA0IDUuMzU5NjEgMS43OTIzMUw2LjExOTE1IDIuNzI3ODhMNi45ODAwMSAyLjczODkzTDcuNzI0OTYgMS43ODkyMkM3Ljc5MTU2IDEuNzA0NTggNy45MTU0OCAxLjY3OTIyIDguMDA4NzkgMS43NDA4Mkw5LjU2ODIxIDIuNjQxODJDOS42NzAxNyAyLjY5ODQyIDkuNzEyODUgMi44MTIzNCA5LjY4NzIzIDIuOTA3OTdMOS4yMTcxOCA0LjAzMzgzTDkuNDYzMTYgNC4zOTk4OEw5LjY1NzE4IDQuNzk1OTNaIi8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-caret-down-empty-thin: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iPgoJCTxwb2x5Z29uIGNsYXNzPSJzdDEiIHBvaW50cz0iOS45LDEzLjYgMy42LDcuNCA0LjQsNi42IDkuOSwxMi4yIDE1LjQsNi43IDE2LjEsNy40ICIvPgoJPC9nPgo8L3N2Zz4K); + --jp-icon-caret-down-empty: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIj4KICAgIDxwYXRoIGQ9Ik01LjIsNS45TDksOS43bDMuOC0zLjhsMS4yLDEuMmwtNC45LDVsLTQuOS01TDUuMiw1Ljl6Ii8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-caret-down: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIj4KICAgIDxwYXRoIGQ9Ik01LjIsNy41TDksMTEuMmwzLjgtMy44SDUuMnoiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-caret-left: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iPgoJCTxwYXRoIGQ9Ik0xMC44LDEyLjhMNy4xLDlsMy44LTMuOGwwLDcuNkgxMC44eiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-caret-right: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIj4KICAgIDxwYXRoIGQ9Ik03LjIsNS4yTDEwLjksOWwtMy44LDMuOFY1LjJINy4yeiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-caret-up-empty-thin: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iPgoJCTxwb2x5Z29uIGNsYXNzPSJzdDEiIHBvaW50cz0iMTUuNCwxMy4zIDkuOSw3LjcgNC40LDEzLjIgMy42LDEyLjUgOS45LDYuMyAxNi4xLDEyLjYgIi8+Cgk8L2c+Cjwvc3ZnPgo=); + --jp-icon-caret-up: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iPgoJCTxwYXRoIGQ9Ik01LjIsMTAuNUw5LDYuOGwzLjgsMy44SDUuMnoiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-case-sensitive: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICA8ZyBjbGFzcz0ianAtaWNvbjIiIGZpbGw9IiM0MTQxNDEiPgogICAgPHJlY3QgeD0iMiIgeT0iMiIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ii8+CiAgPC9nPgogIDxnIGNsYXNzPSJqcC1pY29uLWFjY2VudDIiIGZpbGw9IiNGRkYiPgogICAgPHBhdGggZD0iTTcuNiw4aDAuOWwzLjUsOGgtMS4xTDEwLDE0SDZsLTAuOSwySDRMNy42LDh6IE04LDkuMUw2LjQsMTNoMy4yTDgsOS4xeiIvPgogICAgPHBhdGggZD0iTTE2LjYsOS44Yy0wLjIsMC4xLTAuNCwwLjEtMC43LDAuMWMtMC4yLDAtMC40LTAuMS0wLjYtMC4yYy0wLjEtMC4xLTAuMi0wLjQtMC4yLTAuNyBjLTAuMywwLjMtMC42LDAuNS0wLjksMC43Yy0wLjMsMC4xLTAuNywwLjItMS4xLDAuMmMtMC4zLDAtMC41LDAtMC43LTAuMWMtMC4yLTAuMS0wLjQtMC4yLTAuNi0wLjNjLTAuMi0wLjEtMC4zLTAuMy0wLjQtMC41IGMtMC4xLTAuMi0wLjEtMC40LTAuMS0wLjdjMC0wLjMsMC4xLTAuNiwwLjItMC44YzAuMS0wLjIsMC4zLTAuNCwwLjQtMC41QzEyLDcsMTIuMiw2LjksMTIuNSw2LjhjMC4yLTAuMSwwLjUtMC4xLDAuNy0wLjIgYzAuMy0wLjEsMC41LTAuMSwwLjctMC4xYzAuMiwwLDAuNC0wLjEsMC42LTAuMWMwLjIsMCwwLjMtMC4xLDAuNC0wLjJjMC4xLTAuMSwwLjItMC4yLDAuMi0wLjRjMC0xLTEuMS0xLTEuMy0xIGMtMC40LDAtMS40LDAtMS40LDEuMmgtMC45YzAtMC40LDAuMS0wLjcsMC4yLTFjMC4xLTAuMiwwLjMtMC40LDAuNS0wLjZjMC4yLTAuMiwwLjUtMC4zLDAuOC0wLjNDMTMuMyw0LDEzLjYsNCwxMy45LDQgYzAuMywwLDAuNSwwLDAuOCwwLjFjMC4zLDAsMC41LDAuMSwwLjcsMC4yYzAuMiwwLjEsMC40LDAuMywwLjUsMC41QzE2LDUsMTYsNS4yLDE2LDUuNnYyLjljMCwwLjIsMCwwLjQsMCwwLjUgYzAsMC4xLDAuMSwwLjIsMC4zLDAuMmMwLjEsMCwwLjIsMCwwLjMsMFY5Ljh6IE0xNS4yLDYuOWMtMS4yLDAuNi0zLjEsMC4yLTMuMSwxLjRjMCwxLjQsMy4xLDEsMy4xLTAuNVY2Ljl6Ii8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-check: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxwYXRoIGQ9Ik05IDE2LjE3TDQuODMgMTJsLTEuNDIgMS40MUw5IDE5IDIxIDdsLTEuNDEtMS40MXoiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-circle-empty: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTEyIDJDNi40NyAyIDIgNi40NyAyIDEyczQuNDcgMTAgMTAgMTAgMTAtNC40NyAxMC0xMFMxNy41MyAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-circle: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTggMTgiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPGNpcmNsZSBjeD0iOSIgY3k9IjkiIHI9IjgiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-clear: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8bWFzayBpZD0iZG9udXRIb2xlIj4KICAgIDxyZWN0IHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0id2hpdGUiIC8+CiAgICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI4IiBmaWxsPSJibGFjayIvPgogIDwvbWFzaz4KCiAgPGcgY2xhc3M9ImpwLWljb24zIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxyZWN0IGhlaWdodD0iMTgiIHdpZHRoPSIyIiB4PSIxMSIgeT0iMyIgdHJhbnNmb3JtPSJyb3RhdGUoMzE1LCAxMiwgMTIpIi8+CiAgICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgbWFzaz0idXJsKCNkb251dEhvbGUpIi8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-close: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbi1ub25lIGpwLWljb24tc2VsZWN0YWJsZS1pbnZlcnNlIGpwLWljb24zLWhvdmVyIiBmaWxsPSJub25lIj4KICAgIDxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjExIi8+CiAgPC9nPgoKICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIGpwLWljb24tYWNjZW50Mi1ob3ZlciIgZmlsbD0iIzYxNjE2MSI+CiAgICA8cGF0aCBkPSJNMTkgNi40MUwxNy41OSA1IDEyIDEwLjU5IDYuNDEgNSA1IDYuNDEgMTAuNTkgMTIgNSAxNy41OSA2LjQxIDE5IDEyIDEzLjQxIDE3LjU5IDE5IDE5IDE3LjU5IDEzLjQxIDEyeiIvPgogIDwvZz4KCiAgPGcgY2xhc3M9ImpwLWljb24tbm9uZSBqcC1pY29uLWJ1c3kiIGZpbGw9Im5vbmUiPgogICAgPGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iNyIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-code-check: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBzaGFwZS1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiI+CiAgICA8cGF0aCBkPSJNNi41OSwzLjQxTDIsOEw2LjU5LDEyLjZMOCwxMS4xOEw0LjgyLDhMOCw0LjgyTDYuNTksMy40MU0xMi40MSwzLjQxTDExLDQuODJMMTQuMTgsOEwxMSwxMS4xOEwxMi40MSwxMi42TDE3LDhMMTIuNDEsMy40MU0yMS41OSwxMS41OUwxMy41LDE5LjY4TDkuODMsMTZMOC40MiwxNy40MUwxMy41LDIyLjVMMjMsMTNMMjEuNTksMTEuNTlaIiAvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-code: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjIiIGhlaWdodD0iMjIiIHZpZXdCb3g9IjAgMCAyOCAyOCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CgkJPHBhdGggZD0iTTExLjQgMTguNkw2LjggMTRMMTEuNCA5LjRMMTAgOEw0IDE0TDEwIDIwTDExLjQgMTguNlpNMTYuNiAxOC42TDIxLjIgMTRMMTYuNiA5LjRMMTggOEwyNCAxNEwxOCAyMEwxNi42IDE4LjZWMTguNloiLz4KCTwvZz4KPC9zdmc+Cg==); + --jp-icon-collapse-all: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgZD0iTTggMmMxIDAgMTEgMCAxMiAwczIgMSAyIDJjMCAxIDAgMTEgMCAxMnMwIDItMiAyQzIwIDE0IDIwIDQgMjAgNFMxMCA0IDYgNGMwLTIgMS0yIDItMnoiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgZD0iTTE4IDhjMC0xLTEtMi0yLTJTNSA2IDQgNnMtMiAxLTIgMmMwIDEgMCAxMSAwIDEyczEgMiAyIDJjMSAwIDExIDAgMTIgMHMyLTEgMi0yYzAtMSAwLTExIDAtMTJ6bS0yIDB2MTJINFY4eiIgLz4KICAgICAgICA8cGF0aCBkPSJNNiAxM3YyaDh2LTJ6IiAvPgogICAgPC9nPgo8L3N2Zz4K); + --jp-icon-console: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwMCAyMDAiPgogIDxnIGNsYXNzPSJqcC1jb25zb2xlLWljb24tYmFja2dyb3VuZC1jb2xvciBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiMwMjg4RDEiPgogICAgPHBhdGggZD0iTTIwIDE5LjhoMTYwdjE1OS45SDIweiIvPgogIDwvZz4KICA8ZyBjbGFzcz0ianAtY29uc29sZS1pY29uLWNvbG9yIGpwLWljb24tc2VsZWN0YWJsZS1pbnZlcnNlIiBmaWxsPSIjZmZmIj4KICAgIDxwYXRoIGQ9Ik0xMDUgMTI3LjNoNDB2MTIuOGgtNDB6TTUxLjEgNzdMNzQgOTkuOWwtMjMuMyAyMy4zIDEwLjUgMTAuNSAyMy4zLTIzLjNMOTUgOTkuOSA4NC41IDg5LjQgNjEuNiA2Ni41eiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-copy: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTggMTgiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTExLjksMUgzLjJDMi40LDEsMS43LDEuNywxLjcsMi41djEwLjJoMS41VjIuNWg4LjdWMXogTTE0LjEsMy45aC04Yy0wLjgsMC0xLjUsMC43LTEuNSwxLjV2MTAuMmMwLDAuOCwwLjcsMS41LDEuNSwxLjVoOCBjMC44LDAsMS41LTAuNywxLjUtMS41VjUuNEMxNS41LDQuNiwxNC45LDMuOSwxNC4xLDMuOXogTTE0LjEsMTUuNWgtOFY1LjRoOFYxNS41eiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-copyright: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCI+CiAgPGcgY2xhc3M9ImpwLWljb24zIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxwYXRoIGQ9Ik0xMS44OCw5LjE0YzEuMjgsMC4wNiwxLjYxLDEuMTUsMS42MywxLjY2aDEuNzljLTAuMDgtMS45OC0xLjQ5LTMuMTktMy40NS0zLjE5QzkuNjQsNy42MSw4LDksOCwxMi4xNCBjMCwxLjk0LDAuOTMsNC4yNCwzLjg0LDQuMjRjMi4yMiwwLDMuNDEtMS42NSwzLjQ0LTIuOTVoLTEuNzljLTAuMDMsMC41OS0wLjQ1LDEuMzgtMS42MywxLjQ0QzEwLjU1LDE0LjgzLDEwLDEzLjgxLDEwLDEyLjE0IEMxMCw5LjI1LDExLjI4LDkuMTYsMTEuODgsOS4xNHogTTEyLDJDNi40OCwyLDIsNi40OCwyLDEyczQuNDgsMTAsMTAsMTBzMTAtNC40OCwxMC0xMFMxNy41MiwyLDEyLDJ6IE0xMiwyMGMtNC40MSwwLTgtMy41OS04LTggczMuNTktOCw4LThzOCwzLjU5LDgsOFMxNi40MSwyMCwxMiwyMHoiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-cut: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTkuNjQgNy42NGMuMjMtLjUuMzYtMS4wNS4zNi0xLjY0IDAtMi4yMS0xLjc5LTQtNC00UzIgMy43OSAyIDZzMS43OSA0IDQgNGMuNTkgMCAxLjE0LS4xMyAxLjY0LS4zNkwxMCAxMmwtMi4zNiAyLjM2QzcuMTQgMTQuMTMgNi41OSAxNCA2IDE0Yy0yLjIxIDAtNCAxLjc5LTQgNHMxLjc5IDQgNCA0IDQtMS43OSA0LTRjMC0uNTktLjEzLTEuMTQtLjM2LTEuNjRMMTIgMTRsNyA3aDN2LTFMOS42NCA3LjY0ek02IDhjLTEuMSAwLTItLjg5LTItMnMuOS0yIDItMiAyIC44OSAyIDItLjkgMi0yIDJ6bTAgMTJjLTEuMSAwLTItLjg5LTItMnMuOS0yIDItMiAyIC44OSAyIDItLjkgMi0yIDJ6bTYtNy41Yy0uMjggMC0uNS0uMjItLjUtLjVzLjIyLS41LjUtLjUuNS4yMi41LjUtLjIyLjUtLjUuNXpNMTkgM2wtNiA2IDIgMiA3LTdWM3oiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-delete: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2cHgiIGhlaWdodD0iMTZweCI+CiAgICA8cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIiAvPgogICAgPHBhdGggY2xhc3M9ImpwLWljb24zIiBmaWxsPSIjNjI2MjYyIiBkPSJNNiAxOWMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJWN0g2djEyek0xOSA0aC0zLjVsLTEtMWgtNWwtMSAxSDV2MmgxNFY0eiIgLz4KPC9zdmc+Cg==); + --jp-icon-download: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTE5IDloLTRWM0g5djZINWw3IDcgNy03ek01IDE4djJoMTR2LTJINXoiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-duplicate: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggY2xhc3M9ImpwLWljb24zIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTIuNzk5OTggMC44NzVIOC44OTU4MkM5LjIwMDYxIDAuODc1IDkuNDQ5OTggMS4xMzkxNCA5LjQ0OTk4IDEuNDYxOThDOS40NDk5OCAxLjc4NDgyIDkuMjAwNjEgMi4wNDg5NiA4Ljg5NTgyIDIuMDQ4OTZIMy4zNTQxNUMzLjA0OTM2IDIuMDQ4OTYgMi43OTk5OCAyLjMxMzEgMi43OTk5OCAyLjYzNTk0VjkuNjc5NjlDMi43OTk5OCAxMC4wMDI1IDIuNTUwNjEgMTAuMjY2NyAyLjI0NTgyIDEwLjI2NjdDMS45NDEwMyAxMC4yNjY3IDEuNjkxNjUgMTAuMDAyNSAxLjY5MTY1IDkuNjc5NjlWMi4wNDg5NkMxLjY5MTY1IDEuNDAzMjggMi4xOTA0IDAuODc1IDIuNzk5OTggMC44NzVaTTUuMzY2NjUgMTEuOVY0LjU1SDExLjA4MzNWMTEuOUg1LjM2NjY1Wk00LjE0MTY1IDQuMTQxNjdDNC4xNDE2NSAzLjY5MDYzIDQuNTA3MjggMy4zMjUgNC45NTgzMiAzLjMyNUgxMS40OTE3QzExLjk0MjcgMy4zMjUgMTIuMzA4MyAzLjY5MDYzIDEyLjMwODMgNC4xNDE2N1YxMi4zMDgzQzEyLjMwODMgMTIuNzU5NCAxMS45NDI3IDEzLjEyNSAxMS40OTE3IDEzLjEyNUg0Ljk1ODMyQzQuNTA3MjggMTMuMTI1IDQuMTQxNjUgMTIuNzU5NCA0LjE0MTY1IDEyLjMwODNWNC4xNDE2N1oiIGZpbGw9IiM2MTYxNjEiLz4KPHBhdGggY2xhc3M9ImpwLWljb24zIiBkPSJNOS40MzU3NCA4LjI2NTA3SDguMzY0MzFWOS4zMzY1QzguMzY0MzEgOS40NTQzNSA4LjI2Nzg4IDkuNTUwNzggOC4xNTAwMiA5LjU1MDc4QzguMDMyMTcgOS41NTA3OCA3LjkzNTc0IDkuNDU0MzUgNy45MzU3NCA5LjMzNjVWOC4yNjUwN0g2Ljg2NDMxQzYuNzQ2NDUgOC4yNjUwNyA2LjY1MDAyIDguMTY4NjQgNi42NTAwMiA4LjA1MDc4QzYuNjUwMDIgNy45MzI5MiA2Ljc0NjQ1IDcuODM2NSA2Ljg2NDMxIDcuODM2NUg3LjkzNTc0VjYuNzY1MDdDNy45MzU3NCA2LjY0NzIxIDguMDMyMTcgNi41NTA3OCA4LjE1MDAyIDYuNTUwNzhDOC4yNjc4OCA2LjU1MDc4IDguMzY0MzEgNi42NDcyMSA4LjM2NDMxIDYuNzY1MDdWNy44MzY1SDkuNDM1NzRDOS41NTM2IDcuODM2NSA5LjY1MDAyIDcuOTMyOTIgOS42NTAwMiA4LjA1MDc4QzkuNjUwMDIgOC4xNjg2NCA5LjU1MzYgOC4yNjUwNyA5LjQzNTc0IDguMjY1MDdaIiBmaWxsPSIjNjE2MTYxIiBzdHJva2U9IiM2MTYxNjEiIHN0cm9rZS13aWR0aD0iMC41Ii8+Cjwvc3ZnPgo=); + --jp-icon-edit: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTMgMTcuMjVWMjFoMy43NUwxNy44MSA5Ljk0bC0zLjc1LTMuNzVMMyAxNy4yNXpNMjAuNzEgNy4wNGMuMzktLjM5LjM5LTEuMDIgMC0xLjQxbC0yLjM0LTIuMzRjLS4zOS0uMzktMS4wMi0uMzktMS40MSAwbC0xLjgzIDEuODMgMy43NSAzLjc1IDEuODMtMS44M3oiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-ellipses: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPGNpcmNsZSBjeD0iNSIgY3k9IjEyIiByPSIyIi8+CiAgICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIyIi8+CiAgICA8Y2lyY2xlIGN4PSIxOSIgY3k9IjEyIiByPSIyIi8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-error: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KPGcgY2xhc3M9ImpwLWljb24zIiBmaWxsPSIjNjE2MTYxIj48Y2lyY2xlIGN4PSIxMiIgY3k9IjE5IiByPSIyIi8+PHBhdGggZD0iTTEwIDNoNHYxMmgtNHoiLz48L2c+CjxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0wIDBoMjR2MjRIMHoiLz4KPC9zdmc+Cg==); + --jp-icon-expand-all: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgZD0iTTggMmMxIDAgMTEgMCAxMiAwczIgMSAyIDJjMCAxIDAgMTEgMCAxMnMwIDItMiAyQzIwIDE0IDIwIDQgMjAgNFMxMCA0IDYgNGMwLTIgMS0yIDItMnoiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgZD0iTTE4IDhjMC0xLTEtMi0yLTJTNSA2IDQgNnMtMiAxLTIgMmMwIDEgMCAxMSAwIDEyczEgMiAyIDJjMSAwIDExIDAgMTIgMHMyLTEgMi0yYzAtMSAwLTExIDAtMTJ6bS0yIDB2MTJINFY4eiIgLz4KICAgICAgICA8cGF0aCBkPSJNMTEgMTBIOXYzSDZ2MmgzdjNoMnYtM2gzdi0yaC0zeiIgLz4KICAgIDwvZz4KPC9zdmc+Cg==); + --jp-icon-extension: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTIwLjUgMTFIMTlWN2MwLTEuMS0uOS0yLTItMmgtNFYzLjVDMTMgMi4xMiAxMS44OCAxIDEwLjUgMVM4IDIuMTIgOCAzLjVWNUg0Yy0xLjEgMC0xLjk5LjktMS45OSAydjMuOEgzLjVjMS40OSAwIDIuNyAxLjIxIDIuNyAyLjdzLTEuMjEgMi43LTIuNyAyLjdIMlYyMGMwIDEuMS45IDIgMiAyaDMuOHYtMS41YzAtMS40OSAxLjIxLTIuNyAyLjctMi43IDEuNDkgMCAyLjcgMS4yMSAyLjcgMi43VjIySDE3YzEuMSAwIDItLjkgMi0ydi00aDEuNWMxLjM4IDAgMi41LTEuMTIgMi41LTIuNVMyMS44OCAxMSAyMC41IDExeiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-fast-forward: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTQgMThsOC41LTZMNCA2djEyem05LTEydjEybDguNS02TDEzIDZ6Ii8+CiAgICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-file-upload: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTkgMTZoNnYtNmg0bC03LTctNyA3aDR6bS00IDJoMTR2Mkg1eiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-file: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8cGF0aCBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMTkuMyA4LjJsLTUuNS01LjVjLS4zLS4zLS43LS41LTEuMi0uNUgzLjljLS44LjEtMS42LjktMS42IDEuOHYxNC4xYzAgLjkuNyAxLjYgMS42IDEuNmgxNC4yYy45IDAgMS42LS43IDEuNi0xLjZWOS40Yy4xLS41LS4xLS45LS40LTEuMnptLTUuOC0zLjNsMy40IDMuNmgtMy40VjQuOXptMy45IDEyLjdINC43Yy0uMSAwLS4yIDAtLjItLjJWNC43YzAtLjIuMS0uMy4yLS4zaDcuMnY0LjRzMCAuOC4zIDEuMWMuMy4zIDEuMS4zIDEuMS4zaDQuM3Y3LjJzLS4xLjItLjIuMnoiLz4KPC9zdmc+Cg==); + --jp-icon-filter-dot: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiNGRkYiPgogICAgPHBhdGggZD0iTTE0LDEyVjE5Ljg4QzE0LjA0LDIwLjE4IDEzLjk0LDIwLjUgMTMuNzEsMjAuNzFDMTMuMzIsMjEuMSAxMi42OSwyMS4xIDEyLjMsMjAuNzFMMTAuMjksMTguN0MxMC4wNiwxOC40NyA5Ljk2LDE4LjE2IDEwLDE3Ljg3VjEySDkuOTdMNC4yMSw0LjYyQzMuODcsNC4xOSAzLjk1LDMuNTYgNC4zOCwzLjIyQzQuNTcsMy4wOCA0Ljc4LDMgNSwzVjNIMTlWM0MxOS4yMiwzIDE5LjQzLDMuMDggMTkuNjIsMy4yMkMyMC4wNSwzLjU2IDIwLjEzLDQuMTkgMTkuNzksNC42MkwxNC4wMywxMkgxNFoiIC8+CiAgPC9nPgogIDxnIGNsYXNzPSJqcC1pY29uLWRvdCIgZmlsbD0iI0ZGRiI+CiAgICA8Y2lyY2xlIGN4PSIxOCIgY3k9IjE3IiByPSIzIj48L2NpcmNsZT4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-filter-list: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTEwIDE4aDR2LTJoLTR2MnpNMyA2djJoMThWNkgzem0zIDdoMTJ2LTJINnYyeiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-filter: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiNGRkYiPgogICAgPHBhdGggZD0iTTE0LDEyVjE5Ljg4QzE0LjA0LDIwLjE4IDEzLjk0LDIwLjUgMTMuNzEsMjAuNzFDMTMuMzIsMjEuMSAxMi42OSwyMS4xIDEyLjMsMjAuNzFMMTAuMjksMTguN0MxMC4wNiwxOC40NyA5Ljk2LDE4LjE2IDEwLDE3Ljg3VjEySDkuOTdMNC4yMSw0LjYyQzMuODcsNC4xOSAzLjk1LDMuNTYgNC4zOCwzLjIyQzQuNTcsMy4wOCA0Ljc4LDMgNSwzVjNIMTlWM0MxOS4yMiwzIDE5LjQzLDMuMDggMTkuNjIsMy4yMkMyMC4wNSwzLjU2IDIwLjEzLDQuMTkgMTkuNzksNC42MkwxNC4wMywxMkgxNFoiIC8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-folder-favorite: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzAwMDAwMCI+CiAgPHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggY2xhc3M9ImpwLWljb24zIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iIzYxNjE2MSIgZD0iTTIwIDZoLThsLTItMkg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6bS0yLjA2IDExTDE1IDE1LjI4IDEyLjA2IDE3bC43OC0zLjMzLTIuNTktMi4yNCAzLjQxLS4yOUwxNSA4bDEuMzQgMy4xNCAzLjQxLjI5LTIuNTkgMi4yNC43OCAzLjMzeiIvPgo8L3N2Zz4K); + --jp-icon-folder: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMTAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY4YzAtMS4xLS45LTItMi0yaC04bC0yLTJ6Ii8+Cjwvc3ZnPgo=); + --jp-icon-home: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzAwMDAwMCI+CiAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGNsYXNzPSJqcC1pY29uMyBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiM2MTYxNjEiIGQ9Ik0xMCAyMHYtNmg0djZoNXYtOGgzTDEyIDMgMiAxMmgzdjh6Ii8+Cjwvc3ZnPgo=); + --jp-icon-html5: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDUxMiA1MTIiPgogIDxwYXRoIGNsYXNzPSJqcC1pY29uMCBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiMwMDAiIGQ9Ik0xMDguNCAwaDIzdjIyLjhoMjEuMlYwaDIzdjY5aC0yM1Y0NmgtMjF2MjNoLTIzLjJNMjA2IDIzaC0yMC4zVjBoNjMuN3YyM0gyMjl2NDZoLTIzbTUzLjUtNjloMjQuMWwxNC44IDI0LjNMMzEzLjIgMGgyNC4xdjY5aC0yM1YzNC44bC0xNi4xIDI0LjgtMTYuMS0yNC44VjY5aC0yMi42bTg5LjItNjloMjN2NDYuMmgzMi42VjY5aC01NS42Ii8+CiAgPHBhdGggY2xhc3M9ImpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iI2U0NGQyNiIgZD0iTTEwNy42IDQ3MWwtMzMtMzcwLjRoMzYyLjhsLTMzIDM3MC4yTDI1NS43IDUxMiIvPgogIDxwYXRoIGNsYXNzPSJqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiNmMTY1MjkiIGQ9Ik0yNTYgNDgwLjVWMTMxaDE0OC4zTDM3NiA0NDciLz4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1zZWxlY3RhYmxlLWludmVyc2UiIGZpbGw9IiNlYmViZWIiIGQ9Ik0xNDIgMTc2LjNoMTE0djQ1LjRoLTY0LjJsNC4yIDQ2LjVoNjB2NDUuM0gxNTQuNG0yIDIyLjhIMjAybDMuMiAzNi4zIDUwLjggMTMuNnY0Ny40bC05My4yLTI2Ii8+CiAgPHBhdGggY2xhc3M9ImpwLWljb24tc2VsZWN0YWJsZS1pbnZlcnNlIiBmaWxsPSIjZmZmIiBkPSJNMzY5LjYgMTc2LjNIMjU1Ljh2NDUuNGgxMDkuNm0tNC4xIDQ2LjVIMjU1Ljh2NDUuNGg1NmwtNS4zIDU5LTUwLjcgMTMuNnY0Ny4ybDkzLTI1LjgiLz4KPC9zdmc+Cg==); + --jp-icon-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1icmFuZDQganAtaWNvbi1zZWxlY3RhYmxlLWludmVyc2UiIGZpbGw9IiNGRkYiIGQ9Ik0yLjIgMi4yaDE3LjV2MTcuNUgyLjJ6Ii8+CiAgPHBhdGggY2xhc3M9ImpwLWljb24tYnJhbmQwIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iIzNGNTFCNSIgZD0iTTIuMiAyLjJ2MTcuNWgxNy41bC4xLTE3LjVIMi4yem0xMi4xIDIuMmMxLjIgMCAyLjIgMSAyLjIgMi4ycy0xIDIuMi0yLjIgMi4yLTIuMi0xLTIuMi0yLjIgMS0yLjIgMi4yLTIuMnpNNC40IDE3LjZsMy4zLTguOCAzLjMgNi42IDIuMi0zLjIgNC40IDUuNEg0LjR6Ii8+Cjwvc3ZnPgo=); + --jp-icon-info: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDUwLjk3OCA1MC45NzgiPgoJPGcgY2xhc3M9ImpwLWljb24zIiBmaWxsPSIjNjE2MTYxIj4KCQk8cGF0aCBkPSJNNDMuNTIsNy40NThDMzguNzExLDIuNjQ4LDMyLjMwNywwLDI1LjQ4OSwwQzE4LjY3LDAsMTIuMjY2LDIuNjQ4LDcuNDU4LDcuNDU4CgkJCWMtOS45NDMsOS45NDEtOS45NDMsMjYuMTE5LDAsMzYuMDYyYzQuODA5LDQuODA5LDExLjIxMiw3LjQ1NiwxOC4wMzEsNy40NThjMCwwLDAuMDAxLDAsMC4wMDIsMAoJCQljNi44MTYsMCwxMy4yMjEtMi42NDgsMTguMDI5LTcuNDU4YzQuODA5LTQuODA5LDcuNDU3LTExLjIxMiw3LjQ1Ny0xOC4wM0M1MC45NzcsMTguNjcsNDguMzI4LDEyLjI2Niw0My41Miw3LjQ1OHoKCQkJIE00Mi4xMDYsNDIuMTA1Yy00LjQzMiw0LjQzMS0xMC4zMzIsNi44NzItMTYuNjE1LDYuODcyaC0wLjAwMmMtNi4yODUtMC4wMDEtMTIuMTg3LTIuNDQxLTE2LjYxNy02Ljg3MgoJCQljLTkuMTYyLTkuMTYzLTkuMTYyLTI0LjA3MSwwLTMzLjIzM0MxMy4zMDMsNC40NCwxOS4yMDQsMiwyNS40ODksMmM2LjI4NCwwLDEyLjE4NiwyLjQ0LDE2LjYxNyw2Ljg3MgoJCQljNC40MzEsNC40MzEsNi44NzEsMTAuMzMyLDYuODcxLDE2LjYxN0M0OC45NzcsMzEuNzcyLDQ2LjUzNiwzNy42NzUsNDIuMTA2LDQyLjEwNXoiLz4KCQk8cGF0aCBkPSJNMjMuNTc4LDMyLjIxOGMtMC4wMjMtMS43MzQsMC4xNDMtMy4wNTksMC40OTYtMy45NzJjMC4zNTMtMC45MTMsMS4xMS0xLjk5NywyLjI3Mi0zLjI1MwoJCQljMC40NjgtMC41MzYsMC45MjMtMS4wNjIsMS4zNjctMS41NzVjMC42MjYtMC43NTMsMS4xMDQtMS40NzgsMS40MzYtMi4xNzVjMC4zMzEtMC43MDcsMC40OTUtMS41NDEsMC40OTUtMi41CgkJCWMwLTEuMDk2LTAuMjYtMi4wODgtMC43NzktMi45NzljLTAuNTY1LTAuODc5LTEuNTAxLTEuMzM2LTIuODA2LTEuMzY5Yy0xLjgwMiwwLjA1Ny0yLjk4NSwwLjY2Ny0zLjU1LDEuODMyCgkJCWMtMC4zMDEsMC41MzUtMC41MDMsMS4xNDEtMC42MDcsMS44MTRjLTAuMTM5LDAuNzA3LTAuMjA3LDEuNDMyLTAuMjA3LDIuMTc0aC0yLjkzN2MtMC4wOTEtMi4yMDgsMC40MDctNC4xMTQsMS40OTMtNS43MTkKCQkJYzEuMDYyLTEuNjQsMi44NTUtMi40ODEsNS4zNzgtMi41MjdjMi4xNiwwLjAyMywzLjg3NCwwLjYwOCw1LjE0MSwxLjc1OGMxLjI3OCwxLjE2LDEuOTI5LDIuNzY0LDEuOTUsNC44MTEKCQkJYzAsMS4xNDItMC4xMzcsMi4xMTEtMC40MSwyLjkxMWMtMC4zMDksMC44NDUtMC43MzEsMS41OTMtMS4yNjgsMi4yNDNjLTAuNDkyLDAuNjUtMS4wNjgsMS4zMTgtMS43MywyLjAwMgoJCQljLTAuNjUsMC42OTctMS4zMTMsMS40NzktMS45ODcsMi4zNDZjLTAuMjM5LDAuMzc3LTAuNDI5LDAuNzc3LTAuNTY1LDEuMTk5Yy0wLjE2LDAuOTU5LTAuMjE3LDEuOTUxLTAuMTcxLDIuOTc5CgkJCUMyNi41ODksMzIuMjE4LDIzLjU3OCwzMi4yMTgsMjMuNTc4LDMyLjIxOHogTTIzLjU3OCwzOC4yMnYtMy40ODRoMy4wNzZ2My40ODRIMjMuNTc4eiIvPgoJPC9nPgo8L3N2Zz4K); + --jp-icon-inspector: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtaW5zcGVjdG9yLWljb24tY29sb3IganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMjAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0tNSAxNEg0di00aDExdjR6bTAtNUg0VjloMTF2NHptNSA1aC00VjloNHY5eiIvPgo8L3N2Zz4K); + --jp-icon-json: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8ZyBjbGFzcz0ianAtanNvbi1pY29uLWNvbG9yIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iI0Y5QTgyNSI+CiAgICA8cGF0aCBkPSJNMjAuMiAxMS44Yy0xLjYgMC0xLjcuNS0xLjcgMSAwIC40LjEuOS4xIDEuMy4xLjUuMS45LjEgMS4zIDAgMS43LTEuNCAyLjMtMy41IDIuM2gtLjl2LTEuOWguNWMxLjEgMCAxLjQgMCAxLjQtLjggMC0uMyAwLS42LS4xLTEgMC0uNC0uMS0uOC0uMS0xLjIgMC0xLjMgMC0xLjggMS4zLTItMS4zLS4yLTEuMy0uNy0xLjMtMiAwLS40LjEtLjguMS0xLjIuMS0uNC4xLS43LjEtMSAwLS44LS40LS43LTEuNC0uOGgtLjVWNC4xaC45YzIuMiAwIDMuNS43IDMuNSAyLjMgMCAuNC0uMS45LS4xIDEuMy0uMS41LS4xLjktLjEgMS4zIDAgLjUuMiAxIDEuNyAxdjEuOHpNMS44IDEwLjFjMS42IDAgMS43LS41IDEuNy0xIDAtLjQtLjEtLjktLjEtMS4zLS4xLS41LS4xLS45LS4xLTEuMyAwLTEuNiAxLjQtMi4zIDMuNS0yLjNoLjl2MS45aC0uNWMtMSAwLTEuNCAwLTEuNC44IDAgLjMgMCAuNi4xIDEgMCAuMi4xLjYuMSAxIDAgMS4zIDAgMS44LTEuMyAyQzYgMTEuMiA2IDExLjcgNiAxM2MwIC40LS4xLjgtLjEgMS4yLS4xLjMtLjEuNy0uMSAxIDAgLjguMy44IDEuNC44aC41djEuOWgtLjljLTIuMSAwLTMuNS0uNi0zLjUtMi4zIDAtLjQuMS0uOS4xLTEuMy4xLS41LjEtLjkuMS0xLjMgMC0uNS0uMi0xLTEuNy0xdi0xLjl6Ii8+CiAgICA8Y2lyY2xlIGN4PSIxMSIgY3k9IjEzLjgiIHI9IjIuMSIvPgogICAgPGNpcmNsZSBjeD0iMTEiIGN5PSI4LjIiIHI9IjIuMSIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-julia: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDMyNSAzMDAiPgogIDxnIGNsYXNzPSJqcC1icmFuZDAganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjY2IzYzMzIj4KICAgIDxwYXRoIGQ9Ik0gMTUwLjg5ODQzOCAyMjUgQyAxNTAuODk4NDM4IDI2Ni40MjE4NzUgMTE3LjMyMDMxMiAzMDAgNzUuODk4NDM4IDMwMCBDIDM0LjQ3NjU2MiAzMDAgMC44OTg0MzggMjY2LjQyMTg3NSAwLjg5ODQzOCAyMjUgQyAwLjg5ODQzOCAxODMuNTc4MTI1IDM0LjQ3NjU2MiAxNTAgNzUuODk4NDM4IDE1MCBDIDExNy4zMjAzMTIgMTUwIDE1MC44OTg0MzggMTgzLjU3ODEyNSAxNTAuODk4NDM4IDIyNSIvPgogIDwvZz4KICA8ZyBjbGFzcz0ianAtYnJhbmQwIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iIzM4OTgyNiI+CiAgICA8cGF0aCBkPSJNIDIzNy41IDc1IEMgMjM3LjUgMTE2LjQyMTg3NSAyMDMuOTIxODc1IDE1MCAxNjIuNSAxNTAgQyAxMjEuMDc4MTI1IDE1MCA4Ny41IDExNi40MjE4NzUgODcuNSA3NSBDIDg3LjUgMzMuNTc4MTI1IDEyMS4wNzgxMjUgMCAxNjIuNSAwIEMgMjAzLjkyMTg3NSAwIDIzNy41IDMzLjU3ODEyNSAyMzcuNSA3NSIvPgogIDwvZz4KICA8ZyBjbGFzcz0ianAtYnJhbmQwIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iIzk1NThiMiI+CiAgICA8cGF0aCBkPSJNIDMyNC4xMDE1NjIgMjI1IEMgMzI0LjEwMTU2MiAyNjYuNDIxODc1IDI5MC41MjM0MzggMzAwIDI0OS4xMDE1NjIgMzAwIEMgMjA3LjY3OTY4OCAzMDAgMTc0LjEwMTU2MiAyNjYuNDIxODc1IDE3NC4xMDE1NjIgMjI1IEMgMTc0LjEwMTU2MiAxODMuNTc4MTI1IDIwNy42Nzk2ODggMTUwIDI0OS4xMDE1NjIgMTUwIEMgMjkwLjUyMzQzOCAxNTAgMzI0LjEwMTU2MiAxODMuNTc4MTI1IDMyNC4xMDE1NjIgMjI1Ii8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-jupyter-favicon: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUyIiBoZWlnaHQ9IjE2NSIgdmlld0JveD0iMCAwIDE1MiAxNjUiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgPGcgY2xhc3M9ImpwLWp1cHl0ZXItaWNvbi1jb2xvciIgZmlsbD0iI0YzNzcyNiI+CiAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjA3ODk0NywgMTEwLjU4MjkyNykiIGQ9Ik03NS45NDIyODQyLDI5LjU4MDQ1NjEgQzQzLjMwMjM5NDcsMjkuNTgwNDU2MSAxNC43OTY3ODMyLDE3LjY1MzQ2MzQgMCwwIEM1LjUxMDgzMjExLDE1Ljg0MDY4MjkgMTUuNzgxNTM4OSwyOS41NjY3NzMyIDI5LjM5MDQ5NDcsMzkuMjc4NDE3MSBDNDIuOTk5Nyw0OC45ODk4NTM3IDU5LjI3MzcsNTQuMjA2NzgwNSA3NS45NjA1Nzg5LDU0LjIwNjc4MDUgQzkyLjY0NzQ1NzksNTQuMjA2NzgwNSAxMDguOTIxNDU4LDQ4Ljk4OTg1MzcgMTIyLjUzMDY2MywzOS4yNzg0MTcxIEMxMzYuMTM5NDUzLDI5LjU2Njc3MzIgMTQ2LjQxMDI4NCwxNS44NDA2ODI5IDE1MS45MjExNTgsMCBDMTM3LjA4Nzg2OCwxNy42NTM0NjM0IDEwOC41ODI1ODksMjkuNTgwNDU2MSA3NS45NDIyODQyLDI5LjU4MDQ1NjEgTDc1Ljk0MjI4NDIsMjkuNTgwNDU2MSBaIiAvPgogICAgPHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4wMzczNjgsIDAuNzA0ODc4KSIgZD0iTTc1Ljk3ODQ1NzksMjQuNjI2NDA3MyBDMTA4LjYxODc2MywyNC42MjY0MDczIDEzNy4xMjQ0NTgsMzYuNTUzNDQxNSAxNTEuOTIxMTU4LDU0LjIwNjc4MDUgQzE0Ni40MTAyODQsMzguMzY2MjIyIDEzNi4xMzk0NTMsMjQuNjQwMTMxNyAxMjIuNTMwNjYzLDE0LjkyODQ4NzggQzEwOC45MjE0NTgsNS4yMTY4NDM5IDkyLjY0NzQ1NzksMCA3NS45NjA1Nzg5LDAgQzU5LjI3MzcsMCA0Mi45OTk3LDUuMjE2ODQzOSAyOS4zOTA0OTQ3LDE0LjkyODQ4NzggQzE1Ljc4MTUzODksMjQuNjQwMTMxNyA1LjUxMDgzMjExLDM4LjM2NjIyMiAwLDU0LjIwNjc4MDUgQzE0LjgzMzA4MTYsMzYuNTg5OTI5MyA0My4zMzg1Njg0LDI0LjYyNjQwNzMgNzUuOTc4NDU3OSwyNC42MjY0MDczIEw3NS45Nzg0NTc5LDI0LjYyNjQwNzMgWiIgLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-jupyter: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzkiIGhlaWdodD0iNTEiIHZpZXdCb3g9IjAgMCAzOSA1MSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTYzOCAtMjI4MSkiPgogICAgIDxnIGNsYXNzPSJqcC1qdXB5dGVyLWljb24tY29sb3IiIGZpbGw9IiNGMzc3MjYiPgogICAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjM5Ljc0IDIzMTEuOTgpIiBkPSJNIDE4LjI2NDYgNy4xMzQxMUMgMTAuNDE0NSA3LjEzNDExIDMuNTU4NzIgNC4yNTc2IDAgMEMgMS4zMjUzOSAzLjgyMDQgMy43OTU1NiA3LjEzMDgxIDcuMDY4NiA5LjQ3MzAzQyAxMC4zNDE3IDExLjgxNTIgMTQuMjU1NyAxMy4wNzM0IDE4LjI2OSAxMy4wNzM0QyAyMi4yODIzIDEzLjA3MzQgMjYuMTk2MyAxMS44MTUyIDI5LjQ2OTQgOS40NzMwM0MgMzIuNzQyNCA3LjEzMDgxIDM1LjIxMjYgMy44MjA0IDM2LjUzOCAwQyAzMi45NzA1IDQuMjU3NiAyNi4xMTQ4IDcuMTM0MTEgMTguMjY0NiA3LjEzNDExWiIvPgogICAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjM5LjczIDIyODUuNDgpIiBkPSJNIDE4LjI3MzMgNS45MzkzMUMgMjYuMTIzNSA1LjkzOTMxIDMyLjk3OTMgOC44MTU4MyAzNi41MzggMTMuMDczNEMgMzUuMjEyNiA5LjI1MzAzIDMyLjc0MjQgNS45NDI2MiAyOS40Njk0IDMuNjAwNEMgMjYuMTk2MyAxLjI1ODE4IDIyLjI4MjMgMCAxOC4yNjkgMEMgMTQuMjU1NyAwIDEwLjM0MTcgMS4yNTgxOCA3LjA2ODYgMy42MDA0QyAzLjc5NTU2IDUuOTQyNjIgMS4zMjUzOSA5LjI1MzAzIDAgMTMuMDczNEMgMy41Njc0NSA4LjgyNDYzIDEwLjQyMzIgNS45MzkzMSAxOC4yNzMzIDUuOTM5MzFaIi8+CiAgICA8L2c+CiAgICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjY5LjMgMjI4MS4zMSkiIGQ9Ik0gNS44OTM1MyAyLjg0NEMgNS45MTg4OSAzLjQzMTY1IDUuNzcwODUgNC4wMTM2NyA1LjQ2ODE1IDQuNTE2NDVDIDUuMTY1NDUgNS4wMTkyMiA0LjcyMTY4IDUuNDIwMTUgNC4xOTI5OSA1LjY2ODUxQyAzLjY2NDMgNS45MTY4OCAzLjA3NDQ0IDYuMDAxNTEgMi40OTgwNSA1LjkxMTcxQyAxLjkyMTY2IDUuODIxOSAxLjM4NDYzIDUuNTYxNyAwLjk1NDg5OCA1LjE2NDAxQyAwLjUyNTE3IDQuNzY2MzMgMC4yMjIwNTYgNC4yNDkwMyAwLjA4MzkwMzcgMy42Nzc1N0MgLTAuMDU0MjQ4MyAzLjEwNjExIC0wLjAyMTIzIDIuNTA2MTcgMC4xNzg3ODEgMS45NTM2NEMgMC4zNzg3OTMgMS40MDExIDAuNzM2ODA5IDAuOTIwODE3IDEuMjA3NTQgMC41NzM1MzhDIDEuNjc4MjYgMC4yMjYyNTkgMi4yNDA1NSAwLjAyNzU5MTkgMi44MjMyNiAwLjAwMjY3MjI5QyAzLjYwMzg5IC0wLjAzMDcxMTUgNC4zNjU3MyAwLjI0OTc4OSA0Ljk0MTQyIDAuNzgyNTUxQyA1LjUxNzExIDEuMzE1MzEgNS44NTk1NiAyLjA1Njc2IDUuODkzNTMgMi44NDRaIi8+CiAgICAgIDxwYXRoIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2MzkuOCAyMzIzLjgxKSIgZD0iTSA3LjQyNzg5IDMuNTgzMzhDIDcuNDYwMDggNC4zMjQzIDcuMjczNTUgNS4wNTgxOSA2Ljg5MTkzIDUuNjkyMTNDIDYuNTEwMzEgNi4zMjYwNyA1Ljk1MDc1IDYuODMxNTYgNS4yODQxMSA3LjE0NDZDIDQuNjE3NDcgNy40NTc2MyAzLjg3MzcxIDcuNTY0MTQgMy4xNDcwMiA3LjQ1MDYzQyAyLjQyMDMyIDcuMzM3MTIgMS43NDMzNiA3LjAwODcgMS4yMDE4NCA2LjUwNjk1QyAwLjY2MDMyOCA2LjAwNTIgMC4yNzg2MSA1LjM1MjY4IDAuMTA1MDE3IDQuNjMyMDJDIC0wLjA2ODU3NTcgMy45MTEzNSAtMC4wMjYyMzYxIDMuMTU0OTQgMC4yMjY2NzUgMi40NTg1NkMgMC40Nzk1ODcgMS43NjIxNyAwLjkzMTY5NyAxLjE1NzEzIDEuNTI1NzYgMC43MjAwMzNDIDIuMTE5ODMgMC4yODI5MzUgMi44MjkxNCAwLjAzMzQzOTUgMy41NjM4OSAwLjAwMzEzMzQ0QyA0LjU0NjY3IC0wLjAzNzQwMzMgNS41MDUyOSAwLjMxNjcwNiA2LjIyOTYxIDAuOTg3ODM1QyA2Ljk1MzkzIDEuNjU4OTYgNy4zODQ4NCAyLjU5MjM1IDcuNDI3ODkgMy41ODMzOEwgNy40Mjc4OSAzLjU4MzM4WiIvPgogICAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjM4LjM2IDIyODYuMDYpIiBkPSJNIDIuMjc0NzEgNC4zOTYyOUMgMS44NDM2MyA0LjQxNTA4IDEuNDE2NzEgNC4zMDQ0NSAxLjA0Nzk5IDQuMDc4NDNDIDAuNjc5MjY4IDMuODUyNCAwLjM4NTMyOCAzLjUyMTE0IDAuMjAzMzcxIDMuMTI2NTZDIDAuMDIxNDEzNiAyLjczMTk4IC0wLjA0MDM3OTggMi4yOTE4MyAwLjAyNTgxMTYgMS44NjE4MUMgMC4wOTIwMDMxIDEuNDMxOCAwLjI4MzIwNCAxLjAzMTI2IDAuNTc1MjEzIDAuNzEwODgzQyAwLjg2NzIyMiAwLjM5MDUxIDEuMjQ2OTEgMC4xNjQ3MDggMS42NjYyMiAwLjA2MjA1OTJDIDIuMDg1NTMgLTAuMDQwNTg5NyAyLjUyNTYxIC0wLjAxNTQ3MTQgMi45MzA3NiAwLjEzNDIzNUMgMy4zMzU5MSAwLjI4Mzk0MSAzLjY4NzkyIDAuNTUxNTA1IDMuOTQyMjIgMC45MDMwNkMgNC4xOTY1MiAxLjI1NDYyIDQuMzQxNjkgMS42NzQzNiA0LjM1OTM1IDIuMTA5MTZDIDQuMzgyOTkgMi42OTEwNyA0LjE3Njc4IDMuMjU4NjkgMy43ODU5NyAzLjY4NzQ2QyAzLjM5NTE2IDQuMTE2MjQgMi44NTE2NiA0LjM3MTE2IDIuMjc0NzEgNC4zOTYyOUwgMi4yNzQ3MSA0LjM5NjI5WiIvPgogICAgPC9nPgogIDwvZz4+Cjwvc3ZnPgo=); + --jp-icon-jupyterlab-wordmark: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMDAiIHZpZXdCb3g9IjAgMCAxODYwLjggNDc1Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjIiIGZpbGw9IiM0RTRFNEUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ4MC4xMzY0MDEsIDY0LjI3MTQ5MykiPgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4wMDAwMDAsIDU4Ljg3NTU2NikiPgogICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjA4NzYwMywgMC4xNDAyOTQpIj4KICAgICAgICA8cGF0aCBkPSJNLTQyNi45LDE2OS44YzAsNDguNy0zLjcsNjQuNy0xMy42LDc2LjRjLTEwLjgsMTAtMjUsMTUuNS0zOS43LDE1LjVsMy43LDI5IGMyMi44LDAuMyw0NC44LTcuOSw2MS45LTIzLjFjMTcuOC0xOC41LDI0LTQ0LjEsMjQtODMuM1YwSC00Mjd2MTcwLjFMLTQyNi45LDE2OS44TC00MjYuOSwxNjkuOHoiLz4KICAgICAgPC9nPgogICAgPC9nPgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTU1LjA0NTI5NiwgNTYuODM3MTA0KSI+CiAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuNTYyNDUzLCAxLjc5OTg0MikiPgogICAgICAgIDxwYXRoIGQ9Ik0tMzEyLDE0OGMwLDIxLDAsMzkuNSwxLjcsNTUuNGgtMzEuOGwtMi4xLTMzLjNoLTAuOGMtNi43LDExLjYtMTYuNCwyMS4zLTI4LDI3LjkgYy0xMS42LDYuNi0yNC44LDEwLTM4LjIsOS44Yy0zMS40LDAtNjktMTcuNy02OS04OVYwaDM2LjR2MTEyLjdjMCwzOC43LDExLjYsNjQuNyw0NC42LDY0LjdjMTAuMy0wLjIsMjAuNC0zLjUsMjguOS05LjQgYzguNS01LjksMTUuMS0xNC4zLDE4LjktMjMuOWMyLjItNi4xLDMuMy0xMi41LDMuMy0xOC45VjAuMmgzNi40VjE0OEgtMzEyTC0zMTIsMTQ4eiIvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzOTAuMDEzMzIyLCA1My40Nzk2MzgpIj4KICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMS43MDY0NTgsIDAuMjMxNDI1KSI+CiAgICAgICAgPHBhdGggZD0iTS00NzguNiw3MS40YzAtMjYtMC44LTQ3LTEuNy02Ni43aDMyLjdsMS43LDM0LjhoMC44YzcuMS0xMi41LDE3LjUtMjIuOCwzMC4xLTI5LjcgYzEyLjUtNywyNi43LTEwLjMsNDEtOS44YzQ4LjMsMCw4NC43LDQxLjcsODQuNywxMDMuM2MwLDczLjEtNDMuNywxMDkuMi05MSwxMDkuMmMtMTIuMSwwLjUtMjQuMi0yLjItMzUtNy44IGMtMTAuOC01LjYtMTkuOS0xMy45LTI2LjYtMjQuMmgtMC44VjI5MWgtMzZ2LTIyMEwtNDc4LjYsNzEuNEwtNDc4LjYsNzEuNHogTS00NDIuNiwxMjUuNmMwLjEsNS4xLDAuNiwxMC4xLDEuNywxNS4xIGMzLDEyLjMsOS45LDIzLjMsMTkuOCwzMS4xYzkuOSw3LjgsMjIuMSwxMi4xLDM0LjcsMTIuMWMzOC41LDAsNjAuNy0zMS45LDYwLjctNzguNWMwLTQwLjctMjEuMS03NS42LTU5LjUtNzUuNiBjLTEyLjksMC40LTI1LjMsNS4xLTM1LjMsMTMuNGMtOS45LDguMy0xNi45LDE5LjctMTkuNiwzMi40Yy0xLjUsNC45LTIuMywxMC0yLjUsMTUuMVYxMjUuNkwtNDQyLjYsMTI1LjZMLTQ0Mi42LDEyNS42eiIvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg2MDYuNzQwNzI2LCA1Ni44MzcxMDQpIj4KICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC43NTEyMjYsIDEuOTg5Mjk5KSI+CiAgICAgICAgPHBhdGggZD0iTS00NDAuOCwwbDQzLjcsMTIwLjFjNC41LDEzLjQsOS41LDI5LjQsMTIuOCw0MS43aDAuOGMzLjctMTIuMiw3LjktMjcuNywxMi44LTQyLjQgbDM5LjctMTE5LjJoMzguNUwtMzQ2LjksMTQ1Yy0yNiw2OS43LTQzLjcsMTA1LjQtNjguNiwxMjcuMmMtMTIuNSwxMS43LTI3LjksMjAtNDQuNiwyMy45bC05LjEtMzEuMSBjMTEuNy0zLjksMjIuNS0xMC4xLDMxLjgtMTguMWMxMy4yLTExLjEsMjMuNy0yNS4yLDMwLjYtNDEuMmMxLjUtMi44LDIuNS01LjcsMi45LTguOGMtMC4zLTMuMy0xLjItNi42LTIuNS05LjdMLTQ4MC4yLDAuMSBoMzkuN0wtNDQwLjgsMEwtNDQwLjgsMHoiLz4KICAgICAgPC9nPgogICAgPC9nPgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoODIyLjc0ODEwNCwgMC4wMDAwMDApIj4KICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMS40NjQwNTAsIDAuMzc4OTE0KSI+CiAgICAgICAgPHBhdGggZD0iTS00MTMuNywwdjU4LjNoNTJ2MjguMmgtNTJWMTk2YzAsMjUsNywzOS41LDI3LjMsMzkuNWM3LjEsMC4xLDE0LjItMC43LDIxLjEtMi41IGwxLjcsMjcuN2MtMTAuMywzLjctMjEuMyw1LjQtMzIuMiw1Yy03LjMsMC40LTE0LjYtMC43LTIxLjMtMy40Yy02LjgtMi43LTEyLjktNi44LTE3LjktMTIuMWMtMTAuMy0xMC45LTE0LjEtMjktMTQuMS01Mi45IFY4Ni41aC0zMVY1OC4zaDMxVjkuNkwtNDEzLjcsMEwtNDEzLjcsMHoiLz4KICAgICAgPC9nPgogICAgPC9nPgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOTc0LjQzMzI4NiwgNTMuNDc5NjM4KSI+CiAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAuOTkwMDM0LCAwLjYxMDMzOSkiPgogICAgICAgIDxwYXRoIGQ9Ik0tNDQ1LjgsMTEzYzAuOCw1MCwzMi4yLDcwLjYsNjguNiw3MC42YzE5LDAuNiwzNy45LTMsNTUuMy0xMC41bDYuMiwyNi40IGMtMjAuOSw4LjktNDMuNSwxMy4xLTY2LjIsMTIuNmMtNjEuNSwwLTk4LjMtNDEuMi05OC4zLTEwMi41Qy00ODAuMiw0OC4yLTQ0NC43LDAtMzg2LjUsMGM2NS4yLDAsODIuNyw1OC4zLDgyLjcsOTUuNyBjLTAuMSw1LjgtMC41LDExLjUtMS4yLDE3LjJoLTE0MC42SC00NDUuOEwtNDQ1LjgsMTEzeiBNLTMzOS4yLDg2LjZjMC40LTIzLjUtOS41LTYwLjEtNTAuNC02MC4xIGMtMzYuOCwwLTUyLjgsMzQuNC01NS43LDYwLjFILTMzOS4yTC0zMzkuMiw4Ni42TC0zMzkuMiw4Ni42eiIvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMjAxLjk2MTA1OCwgNTMuNDc5NjM4KSI+CiAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuMTc5NjQwLCAwLjcwNTA2OCkiPgogICAgICAgIDxwYXRoIGQ9Ik0tNDc4LjYsNjhjMC0yMy45LTAuNC00NC41LTEuNy02My40aDMxLjhsMS4yLDM5LjloMS43YzkuMS0yNy4zLDMxLTQ0LjUsNTUuMy00NC41IGMzLjUtMC4xLDcsMC40LDEwLjMsMS4ydjM0LjhjLTQuMS0wLjktOC4yLTEuMy0xMi40LTEuMmMtMjUuNiwwLTQzLjcsMTkuNy00OC43LDQ3LjRjLTEsNS43LTEuNiwxMS41LTEuNywxNy4ydjEwOC4zaC0zNlY2OCBMLTQ3OC42LDY4eiIvPgogICAgICA8L2c+CiAgICA8L2c+CiAgPC9nPgoKICA8ZyBjbGFzcz0ianAtaWNvbi13YXJuMCIgZmlsbD0iI0YzNzcyNiI+CiAgICA8cGF0aCBkPSJNMTM1Mi4zLDMyNi4yaDM3VjI4aC0zN1YzMjYuMnogTTE2MDQuOCwzMjYuMmMtMi41LTEzLjktMy40LTMxLjEtMy40LTQ4Ljd2LTc2IGMwLTQwLjctMTUuMS04My4xLTc3LjMtODMuMWMtMjUuNiwwLTUwLDcuMS02Ni44LDE4LjFsOC40LDI0LjRjMTQuMy05LjIsMzQtMTUuMSw1My0xNS4xYzQxLjYsMCw0Ni4yLDMwLjIsNDYuMiw0N3Y0LjIgYy03OC42LTAuNC0xMjIuMywyNi41LTEyMi4zLDc1LjZjMCwyOS40LDIxLDU4LjQsNjIuMiw1OC40YzI5LDAsNTAuOS0xNC4zLDYyLjItMzAuMmgxLjNsMi45LDI1LjZIMTYwNC44eiBNMTU2NS43LDI1Ny43IGMwLDMuOC0wLjgsOC0yLjEsMTEuOGMtNS45LDE3LjItMjIuNywzNC00OS4yLDM0Yy0xOC45LDAtMzQuOS0xMS4zLTM0LjktMzUuM2MwLTM5LjUsNDUuOC00Ni42LDg2LjItNDUuOFYyNTcuN3ogTTE2OTguNSwzMjYuMiBsMS43LTMzLjZoMS4zYzE1LjEsMjYuOSwzOC43LDM4LjIsNjguMSwzOC4yYzQ1LjQsMCw5MS4yLTM2LjEsOTEuMi0xMDguOGMwLjQtNjEuNy0zNS4zLTEwMy43LTg1LjctMTAzLjcgYy0zMi44LDAtNTYuMywxNC43LTY5LjMsMzcuNGgtMC44VjI4aC0zNi42djI0NS43YzAsMTguMS0wLjgsMzguNi0xLjcsNTIuNUgxNjk4LjV6IE0xNzA0LjgsMjA4LjJjMC01LjksMS4zLTEwLjksMi4xLTE1LjEgYzcuNi0yOC4xLDMxLjEtNDUuNCw1Ni4zLTQ1LjRjMzkuNSwwLDYwLjUsMzQuOSw2MC41LDc1LjZjMCw0Ni42LTIzLjEsNzguMS02MS44LDc4LjFjLTI2LjksMC00OC4zLTE3LjYtNTUuNS00My4zIGMtMC44LTQuMi0xLjctOC44LTEuNy0xMy40VjIwOC4yeiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-kernel: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxwYXRoIGNsYXNzPSJqcC1pY29uMiIgZmlsbD0iIzYxNjE2MSIgZD0iTTE1IDlIOXY2aDZWOXptLTIgNGgtMnYtMmgydjJ6bTgtMlY5aC0yVjdjMC0xLjEtLjktMi0yLTJoLTJWM2gtMnYyaC0yVjNIOXYySDdjLTEuMSAwLTIgLjktMiAydjJIM3YyaDJ2MkgzdjJoMnYyYzAgMS4xLjkgMiAyIDJoMnYyaDJ2LTJoMnYyaDJ2LTJoMmMxLjEgMCAyLS45IDItMnYtMmgydi0yaC0ydi0yaDJ6bS00IDZIN1Y3aDEwdjEweiIvPgo8L3N2Zz4K); + --jp-icon-keyboard: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMjAgNUg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMTdjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY3YzAtMS4xLS45LTItMi0yem0tOSAzaDJ2MmgtMlY4em0wIDNoMnYyaC0ydi0yek04IDhoMnYySDhWOHptMCAzaDJ2Mkg4di0yem0tMSAySDV2LTJoMnYyem0wLTNINVY4aDJ2MnptOSA3SDh2LTJoOHYyem0wLTRoLTJ2LTJoMnYyem0wLTNoLTJWOGgydjJ6bTMgM2gtMnYtMmgydjJ6bTAtM2gtMlY4aDJ2MnoiLz4KPC9zdmc+Cg==); + --jp-icon-launch: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMzIgMzIiIHdpZHRoPSIzMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxwYXRoIGQ9Ik0yNiwyOEg2YTIuMDAyNywyLjAwMjcsMCwwLDEtMi0yVjZBMi4wMDI3LDIuMDAyNywwLDAsMSw2LDRIMTZWNkg2VjI2SDI2VjE2aDJWMjZBMi4wMDI3LDIuMDAyNywwLDAsMSwyNiwyOFoiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iMjAgMiAyMCA0IDI2LjU4NiA0IDE4IDEyLjU4NiAxOS40MTQgMTQgMjggNS40MTQgMjggMTIgMzAgMTIgMzAgMiAyMCAyIi8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-launcher: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMTkgMTlINVY1aDdWM0g1YTIgMiAwIDAwLTIgMnYxNGEyIDIgMCAwMDIgMmgxNGMxLjEgMCAyLS45IDItMnYtN2gtMnY3ek0xNCAzdjJoMy41OWwtOS44MyA5LjgzIDEuNDEgMS40MUwxOSA2LjQxVjEwaDJWM2gtN3oiLz4KPC9zdmc+Cg==); + --jp-icon-line-form: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxwYXRoIGZpbGw9IndoaXRlIiBkPSJNNS44OCA0LjEyTDEzLjc2IDEybC03Ljg4IDcuODhMOCAyMmwxMC0xMEw4IDJ6Ii8+Cjwvc3ZnPgo=); + --jp-icon-link: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTMuOSAxMmMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMWg0VjdIN2MtMi43NiAwLTUgMi4yNC01IDVzMi4yNCA1IDUgNWg0di0xLjlIN2MtMS43MSAwLTMuMS0xLjM5LTMuMS0zLjF6TTggMTNoOHYtMkg4djJ6bTktNmgtNHYxLjloNGMxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXMtMS4zOSAzLjEtMy4xIDMuMWgtNFYxN2g0YzIuNzYgMCA1LTIuMjQgNS01cy0yLjI0LTUtNS01eiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-list: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxwYXRoIGNsYXNzPSJqcC1pY29uMiBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiM2MTYxNjEiIGQ9Ik0xOSA1djE0SDVWNWgxNG0xLjEtMkgzLjljLS41IDAtLjkuNC0uOS45djE2LjJjMCAuNC40LjkuOS45aDE2LjJjLjQgMCAuOS0uNS45LS45VjMuOWMwLS41LS41LS45LS45LS45ek0xMSA3aDZ2MmgtNlY3em0wIDRoNnYyaC02di0yem0wIDRoNnYyaC02ek03IDdoMnYySDd6bTAgNGgydjJIN3ptMCA0aDJ2Mkg3eiIvPgo8L3N2Zz4K); + --jp-icon-markdown: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1jb250cmFzdDAganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjN0IxRkEyIiBkPSJNNSAxNC45aDEybC02LjEgNnptOS40LTYuOGMwLTEuMy0uMS0yLjktLjEtNC41LS40IDEuNC0uOSAyLjktMS4zIDQuM2wtMS4zIDQuM2gtMkw4LjUgNy45Yy0uNC0xLjMtLjctMi45LTEtNC4zLS4xIDEuNi0uMSAzLjItLjIgNC42TDcgMTIuNEg0LjhsLjctMTFoMy4zTDEwIDVjLjQgMS4yLjcgMi43IDEgMy45LjMtMS4yLjctMi42IDEtMy45bDEuMi0zLjdoMy4zbC42IDExaC0yLjRsLS4zLTQuMnoiLz4KPC9zdmc+Cg==); + --jp-icon-move-down: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggY2xhc3M9ImpwLWljb24zIiBkPSJNMTIuNDcxIDcuNTI4OTlDMTIuNzYzMiA3LjIzNjg0IDEyLjc2MzIgNi43NjMxNiAxMi40NzEgNi40NzEwMVY2LjQ3MTAxQzEyLjE3OSA2LjE3OTA1IDExLjcwNTcgNi4xNzg4NCAxMS40MTM1IDYuNDcwNTRMNy43NSAxMC4xMjc1VjEuNzVDNy43NSAxLjMzNTc5IDcuNDE0MjEgMSA3IDFWMUM2LjU4NTc5IDEgNi4yNSAxLjMzNTc5IDYuMjUgMS43NVYxMC4xMjc1TDIuNTk3MjYgNi40NjgyMkMyLjMwMzM4IDYuMTczODEgMS44MjY0MSA2LjE3MzU5IDEuNTMyMjYgNi40Njc3NFY2LjQ2Nzc0QzEuMjM4MyA2Ljc2MTcgMS4yMzgzIDcuMjM4MyAxLjUzMjI2IDcuNTMyMjZMNi4yOTI4OSAxMi4yOTI5QzYuNjgzNDIgMTIuNjgzNCA3LjMxNjU4IDEyLjY4MzQgNy43MDcxMSAxMi4yOTI5TDEyLjQ3MSA3LjUyODk5WiIgZmlsbD0iIzYxNjE2MSIvPgo8L3N2Zz4K); + --jp-icon-move-up: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggY2xhc3M9ImpwLWljb24zIiBkPSJNMS41Mjg5OSA2LjQ3MTAxQzEuMjM2ODQgNi43NjMxNiAxLjIzNjg0IDcuMjM2ODQgMS41Mjg5OSA3LjUyODk5VjcuNTI4OTlDMS44MjA5NSA3LjgyMDk1IDIuMjk0MjYgNy44MjExNiAyLjU4NjQ5IDcuNTI5NDZMNi4yNSAzLjg3MjVWMTIuMjVDNi4yNSAxMi42NjQyIDYuNTg1NzkgMTMgNyAxM1YxM0M3LjQxNDIxIDEzIDcuNzUgMTIuNjY0MiA3Ljc1IDEyLjI1VjMuODcyNUwxMS40MDI3IDcuNTMxNzhDMTEuNjk2NiA3LjgyNjE5IDEyLjE3MzYgNy44MjY0MSAxMi40Njc3IDcuNTMyMjZWNy41MzIyNkMxMi43NjE3IDcuMjM4MyAxMi43NjE3IDYuNzYxNyAxMi40Njc3IDYuNDY3NzRMNy43MDcxMSAxLjcwNzExQzcuMzE2NTggMS4zMTY1OCA2LjY4MzQyIDEuMzE2NTggNi4yOTI4OSAxLjcwNzExTDEuNTI4OTkgNi40NzEwMVoiIGZpbGw9IiM2MTYxNjEiLz4KPC9zdmc+Cg==); + --jp-icon-new-folder: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTIwIDZoLThsLTItMkg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOGMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6bS0xIDhoLTN2M2gtMnYtM2gtM3YtMmgzVjloMnYzaDN2MnoiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-not-trusted: url(data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI1IDI1Ij4KICAgIDxwYXRoIGNsYXNzPSJqcC1pY29uMiIgc3Ryb2tlPSIjMzMzMzMzIiBzdHJva2Utd2lkdGg9IjIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMgMykiIGQ9Ik0xLjg2MDk0IDExLjQ0MDlDMC44MjY0NDggOC43NzAyNyAwLjg2Mzc3OSA2LjA1NzY0IDEuMjQ5MDcgNC4xOTkzMkMyLjQ4MjA2IDMuOTMzNDcgNC4wODA2OCAzLjQwMzQ3IDUuNjAxMDIgMi44NDQ5QzcuMjM1NDkgMi4yNDQ0IDguODU2NjYgMS41ODE1IDkuOTg3NiAxLjA5NTM5QzExLjA1OTcgMS41ODM0MSAxMi42MDk0IDIuMjQ0NCAxNC4yMTggMi44NDMzOUMxNS43NTAzIDMuNDEzOTQgMTcuMzk5NSAzLjk1MjU4IDE4Ljc1MzkgNC4yMTM4NUMxOS4xMzY0IDYuMDcxNzcgMTkuMTcwOSA4Ljc3NzIyIDE4LjEzOSAxMS40NDA5QzE3LjAzMDMgMTQuMzAzMiAxNC42NjY4IDE3LjE4NDQgOS45OTk5OSAxOC45MzU0QzUuMzMzMTkgMTcuMTg0NCAyLjk2OTY4IDE0LjMwMzIgMS44NjA5NCAxMS40NDA5WiIvPgogICAgPHBhdGggY2xhc3M9ImpwLWljb24yIiBzdHJva2U9IiMzMzMzMzMiIHN0cm9rZS13aWR0aD0iMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOS4zMTU5MiA5LjMyMDMxKSIgZD0iTTcuMzY4NDIgMEwwIDcuMzY0NzkiLz4KICAgIDxwYXRoIGNsYXNzPSJqcC1pY29uMiIgc3Ryb2tlPSIjMzMzMzMzIiBzdHJva2Utd2lkdGg9IjIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDkuMzE1OTIgMTYuNjgzNikgc2NhbGUoMSAtMSkiIGQ9Ik03LjM2ODQyIDBMMCA3LjM2NDc5Ii8+Cjwvc3ZnPgo=); + --jp-icon-notebook: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8ZyBjbGFzcz0ianAtbm90ZWJvb2staWNvbi1jb2xvciBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiNFRjZDMDAiPgogICAgPHBhdGggZD0iTTE4LjcgMy4zdjE1LjRIMy4zVjMuM2gxNS40bTEuNS0xLjVIMS44djE4LjNoMTguM2wuMS0xOC4zeiIvPgogICAgPHBhdGggZD0iTTE2LjUgMTYuNWwtNS40LTQuMy01LjYgNC4zdi0xMWgxMXoiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-numbering: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjIiIGhlaWdodD0iMjIiIHZpZXdCb3g9IjAgMCAyOCAyOCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CgkJPHBhdGggZD0iTTQgMTlINlYxOS41SDVWMjAuNUg2VjIxSDRWMjJIN1YxOEg0VjE5Wk01IDEwSDZWNkg0VjdINVYxMFpNNCAxM0g1LjhMNCAxNS4xVjE2SDdWMTVINS4yTDcgMTIuOVYxMkg0VjEzWk05IDdWOUgyM1Y3SDlaTTkgMjFIMjNWMTlIOVYyMVpNOSAxNUgyM1YxM0g5VjE1WiIvPgoJPC9nPgo8L3N2Zz4K); + --jp-icon-offline-bolt: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTEyIDIuMDJjLTUuNTEgMC05Ljk4IDQuNDctOS45OCA5Ljk4czQuNDcgOS45OCA5Ljk4IDkuOTggOS45OC00LjQ3IDkuOTgtOS45OFMxNy41MSAyLjAyIDEyIDIuMDJ6TTExLjQ4IDIwdi02LjI2SDhMMTMgNHY2LjI2aDMuMzVMMTEuNDggMjB6Ii8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-palette: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTE4IDEzVjIwSDRWNkg5LjAyQzkuMDcgNS4yOSA5LjI0IDQuNjIgOS41IDRINEMyLjkgNCAyIDQuOSAyIDZWMjBDMiAyMS4xIDIuOSAyMiA0IDIySDE4QzE5LjEgMjIgMjAgMjEuMSAyMCAyMFYxNUwxOCAxM1pNMTkuMyA4Ljg5QzE5Ljc0IDguMTkgMjAgNy4zOCAyMCA2LjVDMjAgNC4wMSAxNy45OSAyIDE1LjUgMkMxMy4wMSAyIDExIDQuMDEgMTEgNi41QzExIDguOTkgMTMuMDEgMTEgMTUuNDkgMTFDMTYuMzcgMTEgMTcuMTkgMTAuNzQgMTcuODggMTAuM0wyMSAxMy40MkwyMi40MiAxMkwxOS4zIDguODlaTTE1LjUgOUMxNC4xMiA5IDEzIDcuODggMTMgNi41QzEzIDUuMTIgMTQuMTIgNCAxNS41IDRDMTYuODggNCAxOCA1LjEyIDE4IDYuNUMxOCA3Ljg4IDE2Ljg4IDkgMTUuNSA5WiIvPgogICAgPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00IDZIOS4wMTg5NEM5LjAwNjM5IDYuMTY1MDIgOSA2LjMzMTc2IDkgNi41QzkgOC44MTU3NyAxMC4yMTEgMTAuODQ4NyAxMi4wMzQzIDEySDlWMTRIMTZWMTIuOTgxMUMxNi41NzAzIDEyLjkzNzcgMTcuMTIgMTIuODIwNyAxNy42Mzk2IDEyLjYzOTZMMTggMTNWMjBINFY2Wk04IDhINlYxMEg4VjhaTTYgMTJIOFYxNEg2VjEyWk04IDE2SDZWMThIOFYxNlpNOSAxNkgxNlYxOEg5VjE2WiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-paste: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTE5IDJoLTQuMThDMTQuNC44NCAxMy4zIDAgMTIgMGMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS03IDBjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptNyAxOEg1VjRoMnYzaDEwVjRoMnYxNnoiLz4KICAgIDwvZz4KPC9zdmc+Cg==); + --jp-icon-pdf: url(data:image/svg+xml;base64,PHN2ZwogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMiAyMiIgd2lkdGg9IjE2Ij4KICAgIDxwYXRoIHRyYW5zZm9ybT0icm90YXRlKDQ1KSIgY2xhc3M9ImpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iI0ZGMkEyQSIKICAgICAgIGQ9Im0gMjIuMzQ0MzY5LC0zLjAxNjM2NDIgaCA1LjYzODYwNCB2IDEuNTc5MjQzMyBoIC0zLjU0OTIyNyB2IDEuNTA4NjkyOTkgaCAzLjMzNzU3NiBWIDEuNjUwODE1NCBoIC0zLjMzNzU3NiB2IDMuNDM1MjYxMyBoIC0yLjA4OTM3NyB6IG0gLTcuMTM2NDQ0LDEuNTc5MjQzMyB2IDQuOTQzOTU0MyBoIDAuNzQ4OTIgcSAxLjI4MDc2MSwwIDEuOTUzNzAzLC0wLjYzNDk1MzUgMC42NzgzNjksLTAuNjM0OTUzNSAwLjY3ODM2OSwtMS44NDUxNjQxIDAsLTEuMjA0NzgzNTUgLTAuNjcyOTQyLC0xLjgzNDMxMDExIC0wLjY3Mjk0MiwtMC42Mjk1MjY1OSAtMS45NTkxMywtMC42Mjk1MjY1OSB6IG0gLTIuMDg5Mzc3LC0xLjU3OTI0MzMgaCAyLjIwMzM0MyBxIDEuODQ1MTY0LDAgMi43NDYwMzksMC4yNjU5MjA3IDAuOTA2MzAxLDAuMjYwNDkzNyAxLjU1MjEwOCwwLjg5MDAyMDMgMC41Njk4MywwLjU0ODEyMjMgMC44NDY2MDUsMS4yNjQ0ODAwNiAwLjI3Njc3NCwwLjcxNjM1NzgxIDAuMjc2Nzc0LDEuNjIyNjU4OTQgMCwwLjkxNzE1NTEgLTAuMjc2Nzc0LDEuNjM4OTM5OSAtMC4yNzY3NzUsMC43MTYzNTc4IC0wLjg0NjYwNSwxLjI2NDQ4IC0wLjY1MTIzNCwwLjYyOTUyNjYgLTEuNTYyOTYyLDAuODk1NDQ3MyAtMC45MTE3MjgsMC4yNjA0OTM3IC0yLjczNTE4NSwwLjI2MDQ5MzcgaCAtMi4yMDMzNDMgeiBtIC04LjE0NTg1NjUsMCBoIDMuNDY3ODIzIHEgMS41NDY2ODE2LDAgMi4zNzE1Nzg1LDAuNjg5MjIzIDAuODMwMzI0LDAuNjgzNzk2MSAwLjgzMDMyNCwxLjk1MzcwMzE0IDAsMS4yNzUzMzM5NyAtMC44MzAzMjQsMS45NjQ1NTcwNiBRIDkuOTg3MTk2MSwyLjI3NDkxNSA4LjQ0MDUxNDUsMi4yNzQ5MTUgSCA3LjA2MjA2ODQgViA1LjA4NjA3NjcgSCA0Ljk3MjY5MTUgWiBtIDIuMDg5Mzc2OSwxLjUxNDExOTkgdiAyLjI2MzAzOTQzIGggMS4xNTU5NDEgcSAwLjYwNzgxODgsMCAwLjkzODg2MjksLTAuMjkzMDU1NDcgMC4zMzEwNDQxLC0wLjI5ODQ4MjQxIDAuMzMxMDQ0MSwtMC44NDExNzc3MiAwLC0wLjU0MjY5NTMxIC0wLjMzMTA0NDEsLTAuODM1NzUwNzQgLTAuMzMxMDQ0MSwtMC4yOTMwNTU1IC0wLjkzODg2MjksLTAuMjkzMDU1NSB6IgovPgo8L3N2Zz4K); + --jp-icon-python: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iLTEwIC0xMCAxMzEuMTYxMzYxNjk0MzM1OTQgMTMyLjM4ODk5OTkzODk2NDg0Ij4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjMzA2OTk4IiBkPSJNIDU0LjkxODc4NSw5LjE5Mjc0MjFlLTQgQyA1MC4zMzUxMzIsMC4wMjIyMTcyNyA0NS45NTc4NDYsMC40MTMxMzY5NyA0Mi4xMDYyODUsMS4wOTQ2NjkzIDMwLjc2MDA2OSwzLjA5OTE3MzEgMjguNzAwMDM2LDcuMjk0NzcxNCAyOC43MDAwMzUsMTUuMDMyMTY5IHYgMTAuMjE4NzUgaCAyNi44MTI1IHYgMy40MDYyNSBoIC0yNi44MTI1IC0xMC4wNjI1IGMgLTcuNzkyNDU5LDAgLTE0LjYxNTc1ODgsNC42ODM3MTcgLTE2Ljc0OTk5OTgsMTMuNTkzNzUgLTIuNDYxODE5OTgsMTAuMjEyOTY2IC0yLjU3MTAxNTA4LDE2LjU4NjAyMyAwLDI3LjI1IDEuOTA1OTI4Myw3LjkzNzg1MiA2LjQ1NzU0MzIsMTMuNTkzNzQ4IDE0LjI0OTk5OTgsMTMuNTkzNzUgaCA5LjIxODc1IHYgLTEyLjI1IGMgMCwtOC44NDk5MDIgNy42NTcxNDQsLTE2LjY1NjI0OCAxNi43NSwtMTYuNjU2MjUgaCAyNi43ODEyNSBjIDcuNDU0OTUxLDAgMTMuNDA2MjUzLC02LjEzODE2NCAxMy40MDYyNSwtMTMuNjI1IHYgLTI1LjUzMTI1IGMgMCwtNy4yNjYzMzg2IC02LjEyOTk4LC0xMi43MjQ3NzcxIC0xMy40MDYyNSwtMTMuOTM3NDk5NyBDIDY0LjI4MTU0OCwwLjMyNzk0Mzk3IDU5LjUwMjQzOCwtMC4wMjAzNzkwMyA1NC45MTg3ODUsOS4xOTI3NDIxZS00IFogbSAtMTQuNSw4LjIxODc1MDEyNTc5IGMgMi43Njk1NDcsMCA1LjAzMTI1LDIuMjk4NjQ1NiA1LjAzMTI1LDUuMTI0OTk5NiAtMmUtNiwyLjgxNjMzNiAtMi4yNjE3MDMsNS4wOTM3NSAtNS4wMzEyNSw1LjA5Mzc1IC0yLjc3OTQ3NiwtMWUtNiAtNS4wMzEyNSwtMi4yNzc0MTUgLTUuMDMxMjUsLTUuMDkzNzUgLTEwZS03LC0yLjgyNjM1MyAyLjI1MTc3NCwtNS4xMjQ5OTk2IDUuMDMxMjUsLTUuMTI0OTk5NiB6Ii8+CiAgPHBhdGggY2xhc3M9ImpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iI2ZmZDQzYiIgZD0ibSA4NS42Mzc1MzUsMjguNjU3MTY5IHYgMTEuOTA2MjUgYyAwLDkuMjMwNzU1IC03LjgyNTg5NSwxNi45OTk5OTkgLTE2Ljc1LDE3IGggLTI2Ljc4MTI1IGMgLTcuMzM1ODMzLDAgLTEzLjQwNjI0OSw2LjI3ODQ4MyAtMTMuNDA2MjUsMTMuNjI1IHYgMjUuNTMxMjQ3IGMgMCw3LjI2NjM0NCA2LjMxODU4OCwxMS41NDAzMjQgMTMuNDA2MjUsMTMuNjI1MDA0IDguNDg3MzMxLDIuNDk1NjEgMTYuNjI2MjM3LDIuOTQ2NjMgMjYuNzgxMjUsMCA2Ljc1MDE1NSwtMS45NTQzOSAxMy40MDYyNTMsLTUuODg3NjEgMTMuNDA2MjUsLTEzLjYyNTAwNCBWIDg2LjUwMDkxOSBoIC0yNi43ODEyNSB2IC0zLjQwNjI1IGggMjYuNzgxMjUgMTMuNDA2MjU0IGMgNy43OTI0NjEsMCAxMC42OTYyNTEsLTUuNDM1NDA4IDEzLjQwNjI0MSwtMTMuNTkzNzUgMi43OTkzMywtOC4zOTg4ODYgMi42ODAyMiwtMTYuNDc1Nzc2IDAsLTI3LjI1IC0xLjkyNTc4LC03Ljc1NzQ0MSAtNS42MDM4NywtMTMuNTkzNzUgLTEzLjQwNjI0MSwtMTMuNTkzNzUgeiBtIC0xNS4wNjI1LDY0LjY1NjI1IGMgMi43Nzk0NzgsM2UtNiA1LjAzMTI1LDIuMjc3NDE3IDUuMDMxMjUsNS4wOTM3NDcgLTJlLTYsMi44MjYzNTQgLTIuMjUxNzc1LDUuMTI1MDA0IC01LjAzMTI1LDUuMTI1MDA0IC0yLjc2OTU1LDAgLTUuMDMxMjUsLTIuMjk4NjUgLTUuMDMxMjUsLTUuMTI1MDA0IDJlLTYsLTIuODE2MzMgMi4yNjE2OTcsLTUuMDkzNzQ3IDUuMDMxMjUsLTUuMDkzNzQ3IHoiLz4KPC9zdmc+Cg==); + --jp-icon-r-kernel: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1jb250cmFzdDMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjMjE5NkYzIiBkPSJNNC40IDIuNWMxLjItLjEgMi45LS4zIDQuOS0uMyAyLjUgMCA0LjEuNCA1LjIgMS4zIDEgLjcgMS41IDEuOSAxLjUgMy41IDAgMi0xLjQgMy41LTIuOSA0LjEgMS4yLjQgMS43IDEuNiAyLjIgMyAuNiAxLjkgMSAzLjkgMS4zIDQuNmgtMy44Yy0uMy0uNC0uOC0xLjctMS4yLTMuN3MtMS4yLTIuNi0yLjYtMi42aC0uOXY2LjRINC40VjIuNXptMy43IDYuOWgxLjRjMS45IDAgMi45LS45IDIuOS0yLjNzLTEtMi4zLTIuOC0yLjNjLS43IDAtMS4zIDAtMS42LjJ2NC41aC4xdi0uMXoiLz4KPC9zdmc+Cg==); + --jp-icon-react: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMTUwIDE1MCA1NDEuOSAyOTUuMyI+CiAgPGcgY2xhc3M9ImpwLWljb24tYnJhbmQyIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iIzYxREFGQiI+CiAgICA8cGF0aCBkPSJNNjY2LjMgMjk2LjVjMC0zMi41LTQwLjctNjMuMy0xMDMuMS04Mi40IDE0LjQtNjMuNiA4LTExNC4yLTIwLjItMTMwLjQtNi41LTMuOC0xNC4xLTUuNi0yMi40LTUuNnYyMi4zYzQuNiAwIDguMy45IDExLjQgMi42IDEzLjYgNy44IDE5LjUgMzcuNSAxNC45IDc1LjctMS4xIDkuNC0yLjkgMTkuMy01LjEgMjkuNC0xOS42LTQuOC00MS04LjUtNjMuNS0xMC45LTEzLjUtMTguNS0yNy41LTM1LjMtNDEuNi01MCAzMi42LTMwLjMgNjMuMi00Ni45IDg0LTQ2LjlWNzhjLTI3LjUgMC02My41IDE5LjYtOTkuOSA1My42LTM2LjQtMzMuOC03Mi40LTUzLjItOTkuOS01My4ydjIyLjNjMjAuNyAwIDUxLjQgMTYuNSA4NCA0Ni42LTE0IDE0LjctMjggMzEuNC00MS4zIDQ5LjktMjIuNiAyLjQtNDQgNi4xLTYzLjYgMTEtMi4zLTEwLTQtMTkuNy01LjItMjktNC43LTM4LjIgMS4xLTY3LjkgMTQuNi03NS44IDMtMS44IDYuOS0yLjYgMTEuNS0yLjZWNzguNWMtOC40IDAtMTYgMS44LTIyLjYgNS42LTI4LjEgMTYuMi0zNC40IDY2LjctMTkuOSAxMzAuMS02Mi4yIDE5LjItMTAyLjcgNDkuOS0xMDIuNyA4Mi4zIDAgMzIuNSA0MC43IDYzLjMgMTAzLjEgODIuNC0xNC40IDYzLjYtOCAxMTQuMiAyMC4yIDEzMC40IDYuNSAzLjggMTQuMSA1LjYgMjIuNSA1LjYgMjcuNSAwIDYzLjUtMTkuNiA5OS45LTUzLjYgMzYuNCAzMy44IDcyLjQgNTMuMiA5OS45IDUzLjIgOC40IDAgMTYtMS44IDIyLjYtNS42IDI4LjEtMTYuMiAzNC40LTY2LjcgMTkuOS0xMzAuMSA2Mi0xOS4xIDEwMi41LTQ5LjkgMTAyLjUtODIuM3ptLTEzMC4yLTY2LjdjLTMuNyAxMi45LTguMyAyNi4yLTEzLjUgMzkuNS00LjEtOC04LjQtMTYtMTMuMS0yNC00LjYtOC05LjUtMTUuOC0xNC40LTIzLjQgMTQuMiAyLjEgMjcuOSA0LjcgNDEgNy45em0tNDUuOCAxMDYuNWMtNy44IDEzLjUtMTUuOCAyNi4zLTI0LjEgMzguMi0xNC45IDEuMy0zMCAyLTQ1LjIgMi0xNS4xIDAtMzAuMi0uNy00NS0xLjktOC4zLTExLjktMTYuNC0yNC42LTI0LjItMzgtNy42LTEzLjEtMTQuNS0yNi40LTIwLjgtMzkuOCA2LjItMTMuNCAxMy4yLTI2LjggMjAuNy0zOS45IDcuOC0xMy41IDE1LjgtMjYuMyAyNC4xLTM4LjIgMTQuOS0xLjMgMzAtMiA0NS4yLTIgMTUuMSAwIDMwLjIuNyA0NSAxLjkgOC4zIDExLjkgMTYuNCAyNC42IDI0LjIgMzggNy42IDEzLjEgMTQuNSAyNi40IDIwLjggMzkuOC02LjMgMTMuNC0xMy4yIDI2LjgtMjAuNyAzOS45em0zMi4zLTEzYzUuNCAxMy40IDEwIDI2LjggMTMuOCAzOS44LTEzLjEgMy4yLTI2LjkgNS45LTQxLjIgOCA0LjktNy43IDkuOC0xNS42IDE0LjQtMjMuNyA0LjYtOCA4LjktMTYuMSAxMy0yNC4xek00MjEuMiA0MzBjLTkuMy05LjYtMTguNi0yMC4zLTI3LjgtMzIgOSAuNCAxOC4yLjcgMjcuNS43IDkuNCAwIDE4LjctLjIgMjcuOC0uNy05IDExLjctMTguMyAyMi40LTI3LjUgMzJ6bS03NC40LTU4LjljLTE0LjItMi4xLTI3LjktNC43LTQxLTcuOSAzLjctMTIuOSA4LjMtMjYuMiAxMy41LTM5LjUgNC4xIDggOC40IDE2IDEzLjEgMjQgNC43IDggOS41IDE1LjggMTQuNCAyMy40ek00MjAuNyAxNjNjOS4zIDkuNiAxOC42IDIwLjMgMjcuOCAzMi05LS40LTE4LjItLjctMjcuNS0uNy05LjQgMC0xOC43LjItMjcuOC43IDktMTEuNyAxOC4zLTIyLjQgMjcuNS0zMnptLTc0IDU4LjljLTQuOSA3LjctOS44IDE1LjYtMTQuNCAyMy43LTQuNiA4LTguOSAxNi0xMyAyNC01LjQtMTMuNC0xMC0yNi44LTEzLjgtMzkuOCAxMy4xLTMuMSAyNi45LTUuOCA0MS4yLTcuOXptLTkwLjUgMTI1LjJjLTM1LjQtMTUuMS01OC4zLTM0LjktNTguMy01MC42IDAtMTUuNyAyMi45LTM1LjYgNTguMy01MC42IDguNi0zLjcgMTgtNyAyNy43LTEwLjEgNS43IDE5LjYgMTMuMiA0MCAyMi41IDYwLjktOS4yIDIwLjgtMTYuNiA0MS4xLTIyLjIgNjAuNi05LjktMy4xLTE5LjMtNi41LTI4LTEwLjJ6TTMxMCA0OTBjLTEzLjYtNy44LTE5LjUtMzcuNS0xNC45LTc1LjcgMS4xLTkuNCAyLjktMTkuMyA1LjEtMjkuNCAxOS42IDQuOCA0MSA4LjUgNjMuNSAxMC45IDEzLjUgMTguNSAyNy41IDM1LjMgNDEuNiA1MC0zMi42IDMwLjMtNjMuMiA0Ni45LTg0IDQ2LjktNC41LS4xLTguMy0xLTExLjMtMi43em0yMzcuMi03Ni4yYzQuNyAzOC4yLTEuMSA2Ny45LTE0LjYgNzUuOC0zIDEuOC02LjkgMi42LTExLjUgMi42LTIwLjcgMC01MS40LTE2LjUtODQtNDYuNiAxNC0xNC43IDI4LTMxLjQgNDEuMy00OS45IDIyLjYtMi40IDQ0LTYuMSA2My42LTExIDIuMyAxMC4xIDQuMSAxOS44IDUuMiAyOS4xem0zOC41LTY2LjdjLTguNiAzLjctMTggNy0yNy43IDEwLjEtNS43LTE5LjYtMTMuMi00MC0yMi41LTYwLjkgOS4yLTIwLjggMTYuNi00MS4xIDIyLjItNjAuNiA5LjkgMy4xIDE5LjMgNi41IDI4LjEgMTAuMiAzNS40IDE1LjEgNTguMyAzNC45IDU4LjMgNTAuNi0uMSAxNS43LTIzIDM1LjYtNTguNCA1MC42ek0zMjAuOCA3OC40eiIvPgogICAgPGNpcmNsZSBjeD0iNDIwLjkiIGN5PSIyOTYuNSIgcj0iNDUuNyIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-redo: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgICA8cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE4LjQgMTAuNkMxNi41NSA4Ljk5IDE0LjE1IDggMTEuNSA4Yy00LjY1IDAtOC41OCAzLjAzLTkuOTYgNy4yMkwzLjkgMTZjMS4wNS0zLjE5IDQuMDUtNS41IDcuNi01LjUgMS45NSAwIDMuNzMuNzIgNS4xMiAxLjg4TDEzIDE2aDlWN2wtMy42IDMuNnoiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-refresh: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTkgMTMuNWMtMi40OSAwLTQuNS0yLjAxLTQuNS00LjVTNi41MSA0LjUgOSA0LjVjMS4yNCAwIDIuMzYuNTIgMy4xNyAxLjMzTDEwIDhoNVYzbC0xLjc2IDEuNzZDMTIuMTUgMy42OCAxMC42NiAzIDkgMyA1LjY5IDMgMy4wMSA1LjY5IDMuMDEgOVM1LjY5IDE1IDkgMTVjMi45NyAwIDUuNDMtMi4xNiA1LjktNWgtMS41MmMtLjQ2IDItMi4yNCAzLjUtNC4zOCAzLjV6Ii8+CiAgICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-regex: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICA8ZyBjbGFzcz0ianAtaWNvbjIiIGZpbGw9IiM0MTQxNDEiPgogICAgPHJlY3QgeD0iMiIgeT0iMiIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ii8+CiAgPC9nPgoKICA8ZyBjbGFzcz0ianAtaWNvbi1hY2NlbnQyIiBmaWxsPSIjRkZGIj4KICAgIDxjaXJjbGUgY2xhc3M9InN0MiIgY3g9IjUuNSIgY3k9IjE0LjUiIHI9IjEuNSIvPgogICAgPHJlY3QgeD0iMTIiIHk9IjQiIGNsYXNzPSJzdDIiIHdpZHRoPSIxIiBoZWlnaHQ9IjgiLz4KICAgIDxyZWN0IHg9IjguNSIgeT0iNy41IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjg2NiAtMC41IDAuNSAwLjg2NiAtMi4zMjU1IDcuMzIxOSkiIGNsYXNzPSJzdDIiIHdpZHRoPSI4IiBoZWlnaHQ9IjEiLz4KICAgIDxyZWN0IHg9IjEyIiB5PSI0IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjUgLTAuODY2IDAuODY2IDAuNSAtMC42Nzc5IDE0LjgyNTIpIiBjbGFzcz0ic3QyIiB3aWR0aD0iMSIgaGVpZ2h0PSI4Ii8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-run: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTggNXYxNGwxMS03eiIvPgogICAgPC9nPgo8L3N2Zz4K); + --jp-icon-running: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDUxMiA1MTIiPgogIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICA8cGF0aCBkPSJNMjU2IDhDMTE5IDggOCAxMTkgOCAyNTZzMTExIDI0OCAyNDggMjQ4IDI0OC0xMTEgMjQ4LTI0OFMzOTMgOCAyNTYgOHptOTYgMzI4YzAgOC44LTcuMiAxNi0xNiAxNkgxNzZjLTguOCAwLTE2LTcuMi0xNi0xNlYxNzZjMC04LjggNy4yLTE2IDE2LTE2aDE2MGM4LjggMCAxNiA3LjIgMTYgMTZ2MTYweiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-save: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTE3IDNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjdsLTQtNHptLTUgMTZjLTEuNjYgMC0zLTEuMzQtMy0zczEuMzQtMyAzLTMgMyAxLjM0IDMgMy0xLjM0IDMtMyAzem0zLTEwSDVWNWgxMHY0eiIvPgogICAgPC9nPgo8L3N2Zz4K); + --jp-icon-search: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTggMTgiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTEyLjEsMTAuOWgtMC43bC0wLjItMC4yYzAuOC0wLjksMS4zLTIuMiwxLjMtMy41YzAtMy0yLjQtNS40LTUuNC01LjRTMS44LDQuMiwxLjgsNy4xczIuNCw1LjQsNS40LDUuNCBjMS4zLDAsMi41LTAuNSwzLjUtMS4zbDAuMiwwLjJ2MC43bDQuMSw0LjFsMS4yLTEuMkwxMi4xLDEwLjl6IE03LjEsMTAuOWMtMi4xLDAtMy43LTEuNy0zLjctMy43czEuNy0zLjcsMy43LTMuN3MzLjcsMS43LDMuNywzLjcgUzkuMiwxMC45LDcuMSwxMC45eiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-settings: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMTkuNDMgMTIuOThjLjA0LS4zMi4wNy0uNjQuMDctLjk4cy0uMDMtLjY2LS4wNy0uOThsMi4xMS0xLjY1Yy4xOS0uMTUuMjQtLjQyLjEyLS42NGwtMi0zLjQ2Yy0uMTItLjIyLS4zOS0uMy0uNjEtLjIybC0yLjQ5IDFjLS41Mi0uNC0xLjA4LS43My0xLjY5LS45OGwtLjM4LTIuNjVBLjQ4OC40ODggMCAwMDE0IDJoLTRjLS4yNSAwLS40Ni4xOC0uNDkuNDJsLS4zOCAyLjY1Yy0uNjEuMjUtMS4xNy41OS0xLjY5Ljk4bC0yLjQ5LTFjLS4yMy0uMDktLjQ5IDAtLjYxLjIybC0yIDMuNDZjLS4xMy4yMi0uMDcuNDkuMTIuNjRsMi4xMSAxLjY1Yy0uMDQuMzItLjA3LjY1LS4wNy45OHMuMDMuNjYuMDcuOThsLTIuMTEgMS42NWMtLjE5LjE1LS4yNC40Mi0uMTIuNjRsMiAzLjQ2Yy4xMi4yMi4zOS4zLjYxLjIybDIuNDktMWMuNTIuNCAxLjA4LjczIDEuNjkuOThsLjM4IDIuNjVjLjAzLjI0LjI0LjQyLjQ5LjQyaDRjLjI1IDAgLjQ2LS4xOC40OS0uNDJsLjM4LTIuNjVjLjYxLS4yNSAxLjE3LS41OSAxLjY5LS45OGwyLjQ5IDFjLjIzLjA5LjQ5IDAgLjYxLS4yMmwyLTMuNDZjLjEyLS4yMi4wNy0uNDktLjEyLS42NGwtMi4xMS0xLjY1ek0xMiAxNS41Yy0xLjkzIDAtMy41LTEuNTctMy41LTMuNXMxLjU3LTMuNSAzLjUtMy41IDMuNSAxLjU3IDMuNSAzLjUtMS41NyAzLjUtMy41IDMuNXoiLz4KPC9zdmc+Cg==); + --jp-icon-share: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTSAxOCAyIEMgMTYuMzU0OTkgMiAxNSAzLjM1NDk5MDQgMTUgNSBDIDE1IDUuMTkwOTUyOSAxNS4wMjE3OTEgNS4zNzcxMjI0IDE1LjA1NjY0MSA1LjU1ODU5MzggTCA3LjkyMTg3NSA5LjcyMDcwMzEgQyA3LjM5ODUzOTkgOS4yNzc4NTM5IDYuNzMyMDc3MSA5IDYgOSBDIDQuMzU0OTkwNCA5IDMgMTAuMzU0OTkgMyAxMiBDIDMgMTMuNjQ1MDEgNC4zNTQ5OTA0IDE1IDYgMTUgQyA2LjczMjA3NzEgMTUgNy4zOTg1Mzk5IDE0LjcyMjE0NiA3LjkyMTg3NSAxNC4yNzkyOTcgTCAxNS4wNTY2NDEgMTguNDM5NDUzIEMgMTUuMDIxNTU1IDE4LjYyMTUxNCAxNSAxOC44MDgzODYgMTUgMTkgQyAxNSAyMC42NDUwMSAxNi4zNTQ5OSAyMiAxOCAyMiBDIDE5LjY0NTAxIDIyIDIxIDIwLjY0NTAxIDIxIDE5IEMgMjEgMTcuMzU0OTkgMTkuNjQ1MDEgMTYgMTggMTYgQyAxNy4yNjc0OCAxNiAxNi42MDE1OTMgMTYuMjc5MzI4IDE2LjA3ODEyNSAxNi43MjI2NTYgTCA4Ljk0MzM1OTQgMTIuNTU4NTk0IEMgOC45NzgyMDk1IDEyLjM3NzEyMiA5IDEyLjE5MDk1MyA5IDEyIEMgOSAxMS44MDkwNDcgOC45NzgyMDk1IDExLjYyMjg3OCA4Ljk0MzM1OTQgMTEuNDQxNDA2IEwgMTYuMDc4MTI1IDcuMjc5Mjk2OSBDIDE2LjYwMTQ2IDcuNzIyMTQ2MSAxNy4yNjc5MjMgOCAxOCA4IEMgMTkuNjQ1MDEgOCAyMSA2LjY0NTAwOTYgMjEgNSBDIDIxIDMuMzU0OTkwNCAxOS42NDUwMSAyIDE4IDIgeiBNIDE4IDQgQyAxOC41NjQxMjkgNCAxOSA0LjQzNTg3MDYgMTkgNSBDIDE5IDUuNTY0MTI5NCAxOC41NjQxMjkgNiAxOCA2IEMgMTcuNDM1ODcxIDYgMTcgNS41NjQxMjk0IDE3IDUgQyAxNyA0LjQzNTg3MDYgMTcuNDM1ODcxIDQgMTggNCB6IE0gNiAxMSBDIDYuNTY0MTI5NCAxMSA3IDExLjQzNTg3MSA3IDEyIEMgNyAxMi41NjQxMjkgNi41NjQxMjk0IDEzIDYgMTMgQyA1LjQzNTg3MDYgMTMgNSAxMi41NjQxMjkgNSAxMiBDIDUgMTEuNDM1ODcxIDUuNDM1ODcwNiAxMSA2IDExIHogTSAxOCAxOCBDIDE4LjU2NDEyOSAxOCAxOSAxOC40MzU4NzEgMTkgMTkgQyAxOSAxOS41NjQxMjkgMTguNTY0MTI5IDIwIDE4IDIwIEMgMTcuNDM1ODcxIDIwIDE3IDE5LjU2NDEyOSAxNyAxOSBDIDE3IDE4LjQzNTg3MSAxNy40MzU4NzEgMTggMTggMTggeiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-spreadsheet: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1jb250cmFzdDEganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNENBRjUwIiBkPSJNMi4yIDIuMnYxNy42aDE3LjZWMi4ySDIuMnptMTUuNCA3LjdoLTUuNVY0LjRoNS41djUuNXpNOS45IDQuNHY1LjVINC40VjQuNGg1LjV6bS01LjUgNy43aDUuNXY1LjVINC40di01LjV6bTcuNyA1LjV2LTUuNWg1LjV2NS41aC01LjV6Ii8+Cjwvc3ZnPgo=); + --jp-icon-stop: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPgogICAgICAgIDxwYXRoIGQ9Ik02IDZoMTJ2MTJINnoiLz4KICAgIDwvZz4KPC9zdmc+Cg==); + --jp-icon-tab: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTIxIDNIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDNWNWgxMHY0aDh2MTB6Ii8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-table-rows: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0yMSw4SDNWNGgxOFY4eiBNMjEsMTBIM3Y0aDE4VjEweiBNMjEsMTZIM3Y0aDE4VjE2eiIvPgogICAgPC9nPgo8L3N2Zz4K); + --jp-icon-tag: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjgiIGhlaWdodD0iMjgiIHZpZXdCb3g9IjAgMCA0MyAyOCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CgkJPHBhdGggZD0iTTI4LjgzMzIgMTIuMzM0TDMyLjk5OTggMTYuNTAwN0wzNy4xNjY1IDEyLjMzNEgyOC44MzMyWiIvPgoJCTxwYXRoIGQ9Ik0xNi4yMDk1IDIxLjYxMDRDMTUuNjg3MyAyMi4xMjk5IDE0Ljg0NDMgMjIuMTI5OSAxNC4zMjQ4IDIxLjYxMDRMNi45ODI5IDE0LjcyNDVDNi41NzI0IDE0LjMzOTQgNi4wODMxMyAxMy42MDk4IDYuMDQ3ODYgMTMuMDQ4MkM1Ljk1MzQ3IDExLjUyODggNi4wMjAwMiA4LjYxOTQ0IDYuMDY2MjEgNy4wNzY5NUM2LjA4MjgxIDYuNTE0NzcgNi41NTU0OCA2LjA0MzQ3IDcuMTE4MDQgNi4wMzA1NUM5LjA4ODYzIDUuOTg0NzMgMTMuMjYzOCA1LjkzNTc5IDEzLjY1MTggNi4zMjQyNUwyMS43MzY5IDEzLjYzOUMyMi4yNTYgMTQuMTU4NSAyMS43ODUxIDE1LjQ3MjQgMjEuMjYyIDE1Ljk5NDZMMTYuMjA5NSAyMS42MTA0Wk05Ljc3NTg1IDguMjY1QzkuMzM1NTEgNy44MjU2NiA4LjYyMzUxIDcuODI1NjYgOC4xODI4IDguMjY1QzcuNzQzNDYgOC43MDU3MSA3Ljc0MzQ2IDkuNDE3MzMgOC4xODI4IDkuODU2NjdDOC42MjM4MiAxMC4yOTY0IDkuMzM1ODIgMTAuMjk2NCA5Ljc3NTg1IDkuODU2NjdDMTAuMjE1NiA5LjQxNzMzIDEwLjIxNTYgOC43MDUzMyA5Ljc3NTg1IDguMjY1WiIvPgoJPC9nPgo8L3N2Zz4K); + --jp-icon-terminal: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0IiA+CiAgICA8cmVjdCBjbGFzcz0ianAtdGVybWluYWwtaWNvbi1iYWNrZ3JvdW5kLWNvbG9yIGpwLWljb24tc2VsZWN0YWJsZSIgd2lkdGg9IjIwIiBoZWlnaHQ9IjIwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyIDIpIiBmaWxsPSIjMzMzMzMzIi8+CiAgICA8cGF0aCBjbGFzcz0ianAtdGVybWluYWwtaWNvbi1jb2xvciBqcC1pY29uLXNlbGVjdGFibGUtaW52ZXJzZSIgZD0iTTUuMDU2NjQgOC43NjE3MkM1LjA1NjY0IDguNTk3NjYgNS4wMzEyNSA4LjQ1MzEyIDQuOTgwNDcgOC4zMjgxMkM0LjkzMzU5IDguMTk5MjIgNC44NTU0NyA4LjA4MjAzIDQuNzQ2MDkgNy45NzY1NkM0LjY0MDYyIDcuODcxMDkgNC41IDcuNzc1MzkgNC4zMjQyMiA3LjY4OTQ1QzQuMTUyMzQgNy41OTk2MSAzLjk0MzM2IDcuNTExNzIgMy42OTcyNyA3LjQyNTc4QzMuMzAyNzMgNy4yODUxNiAyLjk0MzM2IDcuMTM2NzIgMi42MTkxNCA2Ljk4MDQ3QzIuMjk0OTIgNi44MjQyMiAyLjAxNzU4IDYuNjQyNTggMS43ODcxMSA2LjQzNTU1QzEuNTYwNTUgNi4yMjg1MiAxLjM4NDc3IDUuOTg4MjggMS4yNTk3NyA1LjcxNDg0QzEuMTM0NzcgNS40Mzc1IDEuMDcyMjcgNS4xMDkzOCAxLjA3MjI3IDQuNzMwNDdDMS4wNzIyNyA0LjM5ODQ0IDEuMTI4OTEgNC4wOTU3IDEuMjQyMTkgMy44MjIyN0MxLjM1NTQ3IDMuNTQ0OTIgMS41MTU2MiAzLjMwNDY5IDEuNzIyNjYgMy4xMDE1NkMxLjkyOTY5IDIuODk4NDQgMi4xNzk2OSAyLjczNDM3IDIuNDcyNjYgMi42MDkzOEMyLjc2NTYyIDIuNDg0MzggMy4wOTE4IDIuNDA0MyAzLjQ1MTE3IDIuMzY5MTRWMS4xMDkzOEg0LjM4ODY3VjIuMzgwODZDNC43NDAyMyAyLjQyNzczIDUuMDU2NjQgMi41MjM0NCA1LjMzNzg5IDIuNjY3OTdDNS42MTkxNCAyLjgxMjUgNS44NTc0MiAzLjAwMTk1IDYuMDUyNzMgMy4yMzYzM0M2LjI1MTk1IDMuNDY2OCA2LjQwNDMgMy43NDAyMyA2LjUwOTc3IDQuMDU2NjRDNi42MTkxNCA0LjM2OTE0IDYuNjczODMgNC43MjA3IDYuNjczODMgNS4xMTEzM0g1LjA0NDkyQzUuMDQ0OTIgNC42Mzg2NyA0LjkzNzUgNC4yODEyNSA0LjcyMjY2IDQuMDM5MDZDNC41MDc4MSAzLjc5Mjk3IDQuMjE2OCAzLjY2OTkyIDMuODQ5NjEgMy42Njk5MkMzLjY1MDM5IDMuNjY5OTIgMy40NzY1NiAzLjY5NzI3IDMuMzI4MTIgMy43NTE5NUMzLjE4MzU5IDMuODAyNzMgMy4wNjQ0NSAzLjg3Njk1IDIuOTcwNyAzLjk3NDYxQzIuODc2OTUgNC4wNjgzNiAyLjgwNjY0IDQuMTc5NjkgMi43NTk3NyA0LjMwODU5QzIuNzE2OCA0LjQzNzUgMi42OTUzMSA0LjU3ODEyIDIuNjk1MzEgNC43MzA0N0MyLjY5NTMxIDQuODgyODEgMi43MTY4IDUuMDE5NTMgMi43NTk3NyA1LjE0MDYyQzIuODA2NjQgNS4yNTc4MSAyLjg4MjgxIDUuMzY3MTkgMi45ODgyOCA1LjQ2ODc1QzMuMDk3NjYgNS41NzAzMSAzLjI0MDIzIDUuNjY3OTcgMy40MTYwMiA1Ljc2MTcyQzMuNTkxOCA1Ljg1MTU2IDMuODEwNTUgNS45NDMzNiA0LjA3MjI3IDYuMDM3MTFDNC40NjY4IDYuMTg1NTUgNC44MjQyMiA2LjMzOTg0IDUuMTQ0NTMgNi41QzUuNDY0ODQgNi42NTYyNSA1LjczODI4IDYuODM5ODQgNS45NjQ4NCA3LjA1MDc4QzYuMTk1MzEgNy4yNTc4MSA2LjM3MTA5IDcuNSA2LjQ5MjE5IDcuNzc3MzRDNi42MTcxOSA4LjA1MDc4IDYuNjc5NjkgOC4zNzUgNi42Nzk2OSA4Ljc1QzYuNjc5NjkgOS4wOTM3NSA2LjYyMzA1IDkuNDA0MyA2LjUwOTc3IDkuNjgxNjRDNi4zOTY0OCA5Ljk1NTA4IDYuMjM0MzggMTAuMTkxNCA2LjAyMzQ0IDEwLjM5MDZDNS44MTI1IDEwLjU4OTggNS41NTg1OSAxMC43NSA1LjI2MTcyIDEwLjg3MTFDNC45NjQ4NCAxMC45ODgzIDQuNjMyODEgMTEuMDY0NSA0LjI2NTYyIDExLjA5OTZWMTIuMjQ4SDMuMzMzOThWMTEuMDk5NkMzLjAwMTk1IDExLjA2ODQgMi42Nzk2OSAxMC45OTYxIDIuMzY3MTkgMTAuODgyOEMyLjA1NDY5IDEwLjc2NTYgMS43NzczNCAxMC41OTc3IDEuNTM1MTYgMTAuMzc4OUMxLjI5Njg4IDEwLjE2MDIgMS4xMDU0NyA5Ljg4NDc3IDAuOTYwOTM4IDkuNTUyNzNDMC44MTY0MDYgOS4yMTY4IDAuNzQ0MTQxIDguODE0NDUgMC43NDQxNDEgOC4zNDU3SDIuMzc4OTFDMi4zNzg5MSA4LjYyNjk1IDIuNDE5OTIgOC44NjMyOCAyLjUwMTk1IDkuMDU0NjlDMi41ODM5OCA5LjI0MjE5IDIuNjg5NDUgOS4zOTI1OCAyLjgxODM2IDkuNTA1ODZDMi45NTExNyA5LjYxNTIzIDMuMTAxNTYgOS42OTMzNiAzLjI2OTUzIDkuNzQwMjNDMy40Mzc1IDkuNzg3MTEgMy42MDkzOCA5LjgxMDU1IDMuNzg1MTYgOS44MTA1NUM0LjIwMzEyIDkuODEwNTUgNC41MTk1MyA5LjcxMjg5IDQuNzM0MzggOS41MTc1OEM0Ljk0OTIyIDkuMzIyMjcgNS4wNTY2NCA5LjA3MDMxIDUuMDU2NjQgOC43NjE3MlpNMTMuNDE4IDEyLjI3MTVIOC4wNzQyMlYxMUgxMy40MThWMTIuMjcxNVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMuOTUyNjQgNikiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPgo=); + --jp-icon-text-editor: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtdGV4dC1lZGl0b3ItaWNvbi1jb2xvciBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiM2MTYxNjEiIGQ9Ik0xNSAxNUgzdjJoMTJ2LTJ6bTAtOEgzdjJoMTJWN3pNMyAxM2gxOHYtMkgzdjJ6bTAgOGgxOHYtMkgzdjJ6TTMgM3YyaDE4VjNIM3oiLz4KPC9zdmc+Cg==); + --jp-icon-toc: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxwYXRoIGQ9Ik03LDVIMjFWN0g3VjVNNywxM1YxMUgyMVYxM0g3TTQsNC41QTEuNSwxLjUgMCAwLDEgNS41LDZBMS41LDEuNSAwIDAsMSA0LDcuNUExLjUsMS41IDAgMCwxIDIuNSw2QTEuNSwxLjUgMCAwLDEgNCw0LjVNNCwxMC41QTEuNSwxLjUgMCAwLDEgNS41LDEyQTEuNSwxLjUgMCAwLDEgNCwxMy41QTEuNSwxLjUgMCAwLDEgMi41LDEyQTEuNSwxLjUgMCAwLDEgNCwxMC41TTcsMTlWMTdIMjFWMTlIN000LDE2LjVBMS41LDEuNSAwIDAsMSA1LjUsMThBMS41LDEuNSAwIDAsMSA0LDE5LjVBMS41LDEuNSAwIDAsMSAyLjUsMThBMS41LDEuNSAwIDAsMSA0LDE2LjVaIiAvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-tree-view: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0yMiAxMVYzaC03djNIOVYzSDJ2OGg3VjhoMnYxMGg0djNoN3YtOGgtN3YzaC0yVjhoMnYzeiIvPgogICAgPC9nPgo8L3N2Zz4K); + --jp-icon-trusted: url(data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI1Ij4KICAgIDxwYXRoIGNsYXNzPSJqcC1pY29uMiIgc3Ryb2tlPSIjMzMzMzMzIiBzdHJva2Utd2lkdGg9IjIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIgMykiIGQ9Ik0xLjg2MDk0IDExLjQ0MDlDMC44MjY0NDggOC43NzAyNyAwLjg2Mzc3OSA2LjA1NzY0IDEuMjQ5MDcgNC4xOTkzMkMyLjQ4MjA2IDMuOTMzNDcgNC4wODA2OCAzLjQwMzQ3IDUuNjAxMDIgMi44NDQ5QzcuMjM1NDkgMi4yNDQ0IDguODU2NjYgMS41ODE1IDkuOTg3NiAxLjA5NTM5QzExLjA1OTcgMS41ODM0MSAxMi42MDk0IDIuMjQ0NCAxNC4yMTggMi44NDMzOUMxNS43NTAzIDMuNDEzOTQgMTcuMzk5NSAzLjk1MjU4IDE4Ljc1MzkgNC4yMTM4NUMxOS4xMzY0IDYuMDcxNzcgMTkuMTcwOSA4Ljc3NzIyIDE4LjEzOSAxMS40NDA5QzE3LjAzMDMgMTQuMzAzMiAxNC42NjY4IDE3LjE4NDQgOS45OTk5OSAxOC45MzU0QzUuMzMzMiAxNy4xODQ0IDIuOTY5NjggMTQuMzAzMiAxLjg2MDk0IDExLjQ0MDlaIi8+CiAgICA8cGF0aCBjbGFzcz0ianAtaWNvbjIiIGZpbGw9IiMzMzMzMzMiIHN0cm9rZT0iIzMzMzMzMyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOCA5Ljg2NzE5KSIgZD0iTTIuODYwMTUgNC44NjUzNUwwLjcyNjU0OSAyLjk5OTU5TDAgMy42MzA0NUwyLjg2MDE1IDYuMTMxNTdMOCAwLjYzMDg3Mkw3LjI3ODU3IDBMMi44NjAxNSA0Ljg2NTM1WiIvPgo8L3N2Zz4K); + --jp-icon-undo: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTEyLjUgOGMtMi42NSAwLTUuMDUuOTktNi45IDIuNkwyIDd2OWg5bC0zLjYyLTMuNjJjMS4zOS0xLjE2IDMuMTYtMS44OCA1LjEyLTEuODggMy41NCAwIDYuNTUgMi4zMSA3LjYgNS41bDIuMzctLjc4QzIxLjA4IDExLjAzIDE3LjE1IDggMTIuNSA4eiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-user: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTE2IDdhNCA0IDAgMTEtOCAwIDQgNCAwIDAxOCAwek0xMiAxNGE3IDcgMCAwMC03IDdoMTRhNyA3IDAgMDAtNy03eiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-users: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDM2IDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogPGcgY2xhc3M9ImpwLWljb24zIiB0cmFuc2Zvcm09Im1hdHJpeCgxLjczMjcgMCAwIDEuNzMyNyAtMy42MjgyIC4wOTk1NzcpIiBmaWxsPSIjNjE2MTYxIj4KICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCgxLjUsMCwwLDEuNSwwLC02KSIgZD0ibTEyLjE4NiA3LjUwOThjLTEuMDUzNSAwLTEuOTc1NyAwLjU2NjUtMi40Nzg1IDEuNDEwMiAwLjc1MDYxIDAuMzEyNzcgMS4zOTc0IDAuODI2NDggMS44NzMgMS40NzI3aDMuNDg2M2MwLTEuNTkyLTEuMjg4OS0yLjg4MjgtMi44ODA5LTIuODgyOHoiLz4KICA8cGF0aCBkPSJtMjAuNDY1IDIuMzg5NWEyLjE4ODUgMi4xODg1IDAgMCAxLTIuMTg4NCAyLjE4ODUgMi4xODg1IDIuMTg4NSAwIDAgMS0yLjE4ODUtMi4xODg1IDIuMTg4NSAyLjE4ODUgMCAwIDEgMi4xODg1LTIuMTg4NSAyLjE4ODUgMi4xODg1IDAgMCAxIDIuMTg4NCAyLjE4ODV6Ii8+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMS41LDAsMCwxLjUsMCwtNikiIGQ9Im0zLjU4OTggOC40MjE5Yy0xLjExMjYgMC0yLjAxMzcgMC45MDExMS0yLjAxMzcgMi4wMTM3aDIuODE0NWMwLjI2Nzk3LTAuMzczMDkgMC41OTA3LTAuNzA0MzUgMC45NTg5OC0wLjk3ODUyLTAuMzQ0MzMtMC42MTY4OC0xLjAwMzEtMS4wMzUyLTEuNzU5OC0xLjAzNTJ6Ii8+CiAgPHBhdGggZD0ibTYuOTE1NCA0LjYyM2ExLjUyOTQgMS41Mjk0IDAgMCAxLTEuNTI5NCAxLjUyOTQgMS41Mjk0IDEuNTI5NCAwIDAgMS0xLjUyOTQtMS41Mjk0IDEuNTI5NCAxLjUyOTQgMCAwIDEgMS41Mjk0LTEuNTI5NCAxLjUyOTQgMS41Mjk0IDAgMCAxIDEuNTI5NCAxLjUyOTR6Ii8+CiAgPHBhdGggZD0ibTYuMTM1IDEzLjUzNWMwLTMuMjM5MiAyLjYyNTktNS44NjUgNS44NjUtNS44NjUgMy4yMzkyIDAgNS44NjUgMi42MjU5IDUuODY1IDUuODY1eiIvPgogIDxjaXJjbGUgY3g9IjEyIiBjeT0iMy43Njg1IiByPSIyLjk2ODUiLz4KIDwvZz4KPC9zdmc+Cg==); + --jp-icon-vega: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8ZyBjbGFzcz0ianAtaWNvbjEganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjMjEyMTIxIj4KICAgIDxwYXRoIGQ9Ik0xMC42IDUuNGwyLjItMy4ySDIuMnY3LjNsNC02LjZ6Ii8+CiAgICA8cGF0aCBkPSJNMTUuOCAyLjJsLTQuNCA2LjZMNyA2LjNsLTQuOCA4djUuNWgxNy42VjIuMmgtNHptLTcgMTUuNEg1LjV2LTQuNGgzLjN2NC40em00LjQgMEg5LjhWOS44aDMuNHY3Ljh6bTQuNCAwaC0zLjRWNi41aDMuNHYxMS4xeiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-word: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwIDIwIj4KIDxnIGNsYXNzPSJqcC1pY29uMiIgZmlsbD0iIzQxNDE0MSI+CiAgPHJlY3QgeD0iMiIgeT0iMiIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ii8+CiA8L2c+CiA8ZyBjbGFzcz0ianAtaWNvbi1hY2NlbnQyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSguNDMgLjA0MDEpIiBmaWxsPSIjZmZmIj4KICA8cGF0aCBkPSJtNC4xNCA4Ljc2cTAuMDY4Mi0xLjg5IDIuNDItMS44OSAxLjE2IDAgMS42OCAwLjQyIDAuNTY3IDAuNDEgMC41NjcgMS4xNnYzLjQ3cTAgMC40NjIgMC41MTQgMC40NjIgMC4xMDMgMCAwLjItMC4wMjMxdjAuNzE0cS0wLjM5OSAwLjEwMy0wLjY1MSAwLjEwMy0wLjQ1MiAwLTAuNjkzLTAuMjItMC4yMzEtMC4yLTAuMjg0LTAuNjYyLTAuOTU2IDAuODcyLTIgMC44NzItMC45MDMgMC0xLjQ3LTAuNDcyLTAuNTI1LTAuNDcyLTAuNTI1LTEuMjYgMC0wLjI2MiAwLjA0NTItMC40NzIgMC4wNTY3LTAuMjIgMC4xMTYtMC4zNzggMC4wNjgyLTAuMTY4IDAuMjMxLTAuMzA0IDAuMTU4LTAuMTQ3IDAuMjYyLTAuMjQyIDAuMTE2LTAuMDkxNCAwLjM2OC0wLjE2OCAwLjI2Mi0wLjA5MTQgMC4zOTktMC4xMjYgMC4xMzYtMC4wNDUyIDAuNDcyLTAuMTAzIDAuMzM2LTAuMDU3OCAwLjUwNC0wLjA3OTggMC4xNTgtMC4wMjMxIDAuNTY3LTAuMDc5OCAwLjU1Ni0wLjA2ODIgMC43NzctMC4yMjEgMC4yMi0wLjE1MiAwLjIyLTAuNDQxdi0wLjI1MnEwLTAuNDMtMC4zNTctMC42NjItMC4zMzYtMC4yMzEtMC45NzYtMC4yMzEtMC42NjIgMC0wLjk5OCAwLjI2Mi0wLjMzNiAwLjI1Mi0wLjM5OSAwLjc5OHptMS44OSAzLjY4cTAuNzg4IDAgMS4yNi0wLjQxIDAuNTA0LTAuNDIgMC41MDQtMC45MDN2LTEuMDVxLTAuMjg0IDAuMTM2LTAuODYxIDAuMjMxLTAuNTY3IDAuMDkxNC0wLjk4NyAwLjE1OC0wLjQyIDAuMDY4Mi0wLjc2NiAwLjMyNi0wLjMzNiAwLjI1Mi0wLjMzNiAwLjcwNHQwLjMwNCAwLjcwNCAwLjg2MSAwLjI1MnoiIHN0cm9rZS13aWR0aD0iMS4wNSIvPgogIDxwYXRoIGQ9Im0xMCA0LjU2aDAuOTQ1djMuMTVxMC42NTEtMC45NzYgMS44OS0wLjk3NiAxLjE2IDAgMS44OSAwLjg0IDAuNjgyIDAuODQgMC42ODIgMi4zMSAwIDEuNDctMC43MDQgMi40Mi0wLjcwNCAwLjg4Mi0xLjg5IDAuODgyLTEuMjYgMC0xLjg5LTEuMDJ2MC43NjZoLTAuODV6bTIuNjIgMy4wNHEtMC43NDYgMC0xLjE2IDAuNjQtMC40NTIgMC42My0wLjQ1MiAxLjY4IDAgMS4wNSAwLjQ1MiAxLjY4dDEuMTYgMC42M3EwLjc3NyAwIDEuMjYtMC42MyAwLjQ5NC0wLjY0IDAuNDk0LTEuNjggMC0xLjA1LTAuNDcyLTEuNjgtMC40NjItMC42NC0xLjI2LTAuNjR6IiBzdHJva2Utd2lkdGg9IjEuMDUiLz4KICA8cGF0aCBkPSJtMi43MyAxNS44IDEzLjYgMC4wMDgxYzAuMDA2OSAwIDAtMi42IDAtMi42IDAtMC4wMDc4LTEuMTUgMC0xLjE1IDAtMC4wMDY5IDAtMC4wMDgzIDEuNS0wLjAwODMgMS41LTJlLTMgLTAuMDAxNC0xMS4zLTAuMDAxNC0xMS4zLTAuMDAxNGwtMC4wMDU5Mi0xLjVjMC0wLjAwNzgtMS4xNyAwLjAwMTMtMS4xNyAwLjAwMTN6IiBzdHJva2Utd2lkdGg9Ii45NzUiLz4KIDwvZz4KPC9zdmc+Cg==); + --jp-icon-yaml: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8ZyBjbGFzcz0ianAtaWNvbi1jb250cmFzdDIganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjRDgxQjYwIj4KICAgIDxwYXRoIGQ9Ik03LjIgMTguNnYtNS40TDMgNS42aDMuM2wxLjQgMy4xYy4zLjkuNiAxLjYgMSAyLjUuMy0uOC42LTEuNiAxLTIuNWwxLjQtMy4xaDMuNGwtNC40IDcuNnY1LjVsLTIuOS0uMXoiLz4KICAgIDxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjE3LjYiIGN5PSIxNi41IiByPSIyLjEiLz4KICAgIDxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjE3LjYiIGN5PSIxMSIgcj0iMi4xIi8+CiAgPC9nPgo8L3N2Zz4K); +} + +/* Icon CSS class declarations */ + +.jp-AddAboveIcon { + background-image: var(--jp-icon-add-above); +} + +.jp-AddBelowIcon { + background-image: var(--jp-icon-add-below); +} + +.jp-AddIcon { + background-image: var(--jp-icon-add); +} + +.jp-BellIcon { + background-image: var(--jp-icon-bell); +} + +.jp-BugDotIcon { + background-image: var(--jp-icon-bug-dot); +} + +.jp-BugIcon { + background-image: var(--jp-icon-bug); +} + +.jp-BuildIcon { + background-image: var(--jp-icon-build); +} + +.jp-CaretDownEmptyIcon { + background-image: var(--jp-icon-caret-down-empty); +} + +.jp-CaretDownEmptyThinIcon { + background-image: var(--jp-icon-caret-down-empty-thin); +} + +.jp-CaretDownIcon { + background-image: var(--jp-icon-caret-down); +} + +.jp-CaretLeftIcon { + background-image: var(--jp-icon-caret-left); +} + +.jp-CaretRightIcon { + background-image: var(--jp-icon-caret-right); +} + +.jp-CaretUpEmptyThinIcon { + background-image: var(--jp-icon-caret-up-empty-thin); +} + +.jp-CaretUpIcon { + background-image: var(--jp-icon-caret-up); +} + +.jp-CaseSensitiveIcon { + background-image: var(--jp-icon-case-sensitive); +} + +.jp-CheckIcon { + background-image: var(--jp-icon-check); +} + +.jp-CircleEmptyIcon { + background-image: var(--jp-icon-circle-empty); +} + +.jp-CircleIcon { + background-image: var(--jp-icon-circle); +} + +.jp-ClearIcon { + background-image: var(--jp-icon-clear); +} + +.jp-CloseIcon { + background-image: var(--jp-icon-close); +} + +.jp-CodeCheckIcon { + background-image: var(--jp-icon-code-check); +} + +.jp-CodeIcon { + background-image: var(--jp-icon-code); +} + +.jp-CollapseAllIcon { + background-image: var(--jp-icon-collapse-all); +} + +.jp-ConsoleIcon { + background-image: var(--jp-icon-console); +} + +.jp-CopyIcon { + background-image: var(--jp-icon-copy); +} + +.jp-CopyrightIcon { + background-image: var(--jp-icon-copyright); +} + +.jp-CutIcon { + background-image: var(--jp-icon-cut); +} + +.jp-DeleteIcon { + background-image: var(--jp-icon-delete); +} + +.jp-DownloadIcon { + background-image: var(--jp-icon-download); +} + +.jp-DuplicateIcon { + background-image: var(--jp-icon-duplicate); +} + +.jp-EditIcon { + background-image: var(--jp-icon-edit); +} + +.jp-EllipsesIcon { + background-image: var(--jp-icon-ellipses); +} + +.jp-ErrorIcon { + background-image: var(--jp-icon-error); +} + +.jp-ExpandAllIcon { + background-image: var(--jp-icon-expand-all); +} + +.jp-ExtensionIcon { + background-image: var(--jp-icon-extension); +} + +.jp-FastForwardIcon { + background-image: var(--jp-icon-fast-forward); +} + +.jp-FileIcon { + background-image: var(--jp-icon-file); +} + +.jp-FileUploadIcon { + background-image: var(--jp-icon-file-upload); +} + +.jp-FilterDotIcon { + background-image: var(--jp-icon-filter-dot); +} + +.jp-FilterIcon { + background-image: var(--jp-icon-filter); +} + +.jp-FilterListIcon { + background-image: var(--jp-icon-filter-list); +} + +.jp-FolderFavoriteIcon { + background-image: var(--jp-icon-folder-favorite); +} + +.jp-FolderIcon { + background-image: var(--jp-icon-folder); +} + +.jp-HomeIcon { + background-image: var(--jp-icon-home); +} + +.jp-Html5Icon { + background-image: var(--jp-icon-html5); +} + +.jp-ImageIcon { + background-image: var(--jp-icon-image); +} + +.jp-InfoIcon { + background-image: var(--jp-icon-info); +} + +.jp-InspectorIcon { + background-image: var(--jp-icon-inspector); +} + +.jp-JsonIcon { + background-image: var(--jp-icon-json); +} + +.jp-JuliaIcon { + background-image: var(--jp-icon-julia); +} + +.jp-JupyterFaviconIcon { + background-image: var(--jp-icon-jupyter-favicon); +} + +.jp-JupyterIcon { + background-image: var(--jp-icon-jupyter); +} + +.jp-JupyterlabWordmarkIcon { + background-image: var(--jp-icon-jupyterlab-wordmark); +} + +.jp-KernelIcon { + background-image: var(--jp-icon-kernel); +} + +.jp-KeyboardIcon { + background-image: var(--jp-icon-keyboard); +} + +.jp-LaunchIcon { + background-image: var(--jp-icon-launch); +} + +.jp-LauncherIcon { + background-image: var(--jp-icon-launcher); +} + +.jp-LineFormIcon { + background-image: var(--jp-icon-line-form); +} + +.jp-LinkIcon { + background-image: var(--jp-icon-link); +} + +.jp-ListIcon { + background-image: var(--jp-icon-list); +} + +.jp-MarkdownIcon { + background-image: var(--jp-icon-markdown); +} + +.jp-MoveDownIcon { + background-image: var(--jp-icon-move-down); +} + +.jp-MoveUpIcon { + background-image: var(--jp-icon-move-up); +} + +.jp-NewFolderIcon { + background-image: var(--jp-icon-new-folder); +} + +.jp-NotTrustedIcon { + background-image: var(--jp-icon-not-trusted); +} + +.jp-NotebookIcon { + background-image: var(--jp-icon-notebook); +} + +.jp-NumberingIcon { + background-image: var(--jp-icon-numbering); +} + +.jp-OfflineBoltIcon { + background-image: var(--jp-icon-offline-bolt); +} + +.jp-PaletteIcon { + background-image: var(--jp-icon-palette); +} + +.jp-PasteIcon { + background-image: var(--jp-icon-paste); +} + +.jp-PdfIcon { + background-image: var(--jp-icon-pdf); +} + +.jp-PythonIcon { + background-image: var(--jp-icon-python); +} + +.jp-RKernelIcon { + background-image: var(--jp-icon-r-kernel); +} + +.jp-ReactIcon { + background-image: var(--jp-icon-react); +} + +.jp-RedoIcon { + background-image: var(--jp-icon-redo); +} + +.jp-RefreshIcon { + background-image: var(--jp-icon-refresh); +} + +.jp-RegexIcon { + background-image: var(--jp-icon-regex); +} + +.jp-RunIcon { + background-image: var(--jp-icon-run); +} + +.jp-RunningIcon { + background-image: var(--jp-icon-running); +} + +.jp-SaveIcon { + background-image: var(--jp-icon-save); +} + +.jp-SearchIcon { + background-image: var(--jp-icon-search); +} + +.jp-SettingsIcon { + background-image: var(--jp-icon-settings); +} + +.jp-ShareIcon { + background-image: var(--jp-icon-share); +} + +.jp-SpreadsheetIcon { + background-image: var(--jp-icon-spreadsheet); +} + +.jp-StopIcon { + background-image: var(--jp-icon-stop); +} + +.jp-TabIcon { + background-image: var(--jp-icon-tab); +} + +.jp-TableRowsIcon { + background-image: var(--jp-icon-table-rows); +} + +.jp-TagIcon { + background-image: var(--jp-icon-tag); +} + +.jp-TerminalIcon { + background-image: var(--jp-icon-terminal); +} + +.jp-TextEditorIcon { + background-image: var(--jp-icon-text-editor); +} + +.jp-TocIcon { + background-image: var(--jp-icon-toc); +} + +.jp-TreeViewIcon { + background-image: var(--jp-icon-tree-view); +} + +.jp-TrustedIcon { + background-image: var(--jp-icon-trusted); +} + +.jp-UndoIcon { + background-image: var(--jp-icon-undo); +} + +.jp-UserIcon { + background-image: var(--jp-icon-user); +} + +.jp-UsersIcon { + background-image: var(--jp-icon-users); +} + +.jp-VegaIcon { + background-image: var(--jp-icon-vega); +} + +.jp-WordIcon { + background-image: var(--jp-icon-word); +} + +.jp-YamlIcon { + background-image: var(--jp-icon-yaml); +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/** + * (DEPRECATED) Support for consuming icons as CSS background images + */ + +.jp-Icon, +.jp-MaterialIcon { + background-position: center; + background-repeat: no-repeat; + background-size: 16px; + min-width: 16px; + min-height: 16px; +} + +.jp-Icon-cover { + background-position: center; + background-repeat: no-repeat; + background-size: cover; +} + +/** + * (DEPRECATED) Support for specific CSS icon sizes + */ + +.jp-Icon-16 { + background-size: 16px; + min-width: 16px; + min-height: 16px; +} + +.jp-Icon-18 { + background-size: 18px; + min-width: 18px; + min-height: 18px; +} + +.jp-Icon-20 { + background-size: 20px; + min-width: 20px; + min-height: 20px; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.lm-TabBar .lm-TabBar-addButton { + align-items: center; + display: flex; + padding: 4px; + padding-bottom: 5px; + margin-right: 1px; + background-color: var(--jp-layout-color2); +} + +.lm-TabBar .lm-TabBar-addButton:hover { + background-color: var(--jp-layout-color1); +} + +.lm-DockPanel-tabBar .lm-TabBar-tab { + width: var(--jp-private-horizontal-tab-width); +} + +.lm-DockPanel-tabBar .lm-TabBar-content { + flex: unset; +} + +.lm-DockPanel-tabBar[data-orientation='horizontal'] { + flex: 1 1 auto; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/** + * Support for icons as inline SVG HTMLElements + */ + +/* recolor the primary elements of an icon */ +.jp-icon0[fill] { + fill: var(--jp-inverse-layout-color0); +} + +.jp-icon1[fill] { + fill: var(--jp-inverse-layout-color1); +} + +.jp-icon2[fill] { + fill: var(--jp-inverse-layout-color2); +} + +.jp-icon3[fill] { + fill: var(--jp-inverse-layout-color3); +} + +.jp-icon4[fill] { + fill: var(--jp-inverse-layout-color4); +} + +.jp-icon0[stroke] { + stroke: var(--jp-inverse-layout-color0); +} + +.jp-icon1[stroke] { + stroke: var(--jp-inverse-layout-color1); +} + +.jp-icon2[stroke] { + stroke: var(--jp-inverse-layout-color2); +} + +.jp-icon3[stroke] { + stroke: var(--jp-inverse-layout-color3); +} + +.jp-icon4[stroke] { + stroke: var(--jp-inverse-layout-color4); +} + +/* recolor the accent elements of an icon */ +.jp-icon-accent0[fill] { + fill: var(--jp-layout-color0); +} + +.jp-icon-accent1[fill] { + fill: var(--jp-layout-color1); +} + +.jp-icon-accent2[fill] { + fill: var(--jp-layout-color2); +} + +.jp-icon-accent3[fill] { + fill: var(--jp-layout-color3); +} + +.jp-icon-accent4[fill] { + fill: var(--jp-layout-color4); +} + +.jp-icon-accent0[stroke] { + stroke: var(--jp-layout-color0); +} + +.jp-icon-accent1[stroke] { + stroke: var(--jp-layout-color1); +} + +.jp-icon-accent2[stroke] { + stroke: var(--jp-layout-color2); +} + +.jp-icon-accent3[stroke] { + stroke: var(--jp-layout-color3); +} + +.jp-icon-accent4[stroke] { + stroke: var(--jp-layout-color4); +} + +/* set the color of an icon to transparent */ +.jp-icon-none[fill] { + fill: none; +} + +.jp-icon-none[stroke] { + stroke: none; +} + +/* brand icon colors. Same for light and dark */ +.jp-icon-brand0[fill] { + fill: var(--jp-brand-color0); +} + +.jp-icon-brand1[fill] { + fill: var(--jp-brand-color1); +} + +.jp-icon-brand2[fill] { + fill: var(--jp-brand-color2); +} + +.jp-icon-brand3[fill] { + fill: var(--jp-brand-color3); +} + +.jp-icon-brand4[fill] { + fill: var(--jp-brand-color4); +} + +.jp-icon-brand0[stroke] { + stroke: var(--jp-brand-color0); +} + +.jp-icon-brand1[stroke] { + stroke: var(--jp-brand-color1); +} + +.jp-icon-brand2[stroke] { + stroke: var(--jp-brand-color2); +} + +.jp-icon-brand3[stroke] { + stroke: var(--jp-brand-color3); +} + +.jp-icon-brand4[stroke] { + stroke: var(--jp-brand-color4); +} + +/* warn icon colors. Same for light and dark */ +.jp-icon-warn0[fill] { + fill: var(--jp-warn-color0); +} + +.jp-icon-warn1[fill] { + fill: var(--jp-warn-color1); +} + +.jp-icon-warn2[fill] { + fill: var(--jp-warn-color2); +} + +.jp-icon-warn3[fill] { + fill: var(--jp-warn-color3); +} + +.jp-icon-warn0[stroke] { + stroke: var(--jp-warn-color0); +} + +.jp-icon-warn1[stroke] { + stroke: var(--jp-warn-color1); +} + +.jp-icon-warn2[stroke] { + stroke: var(--jp-warn-color2); +} + +.jp-icon-warn3[stroke] { + stroke: var(--jp-warn-color3); +} + +/* icon colors that contrast well with each other and most backgrounds */ +.jp-icon-contrast0[fill] { + fill: var(--jp-icon-contrast-color0); +} + +.jp-icon-contrast1[fill] { + fill: var(--jp-icon-contrast-color1); +} + +.jp-icon-contrast2[fill] { + fill: var(--jp-icon-contrast-color2); +} + +.jp-icon-contrast3[fill] { + fill: var(--jp-icon-contrast-color3); +} + +.jp-icon-contrast0[stroke] { + stroke: var(--jp-icon-contrast-color0); +} + +.jp-icon-contrast1[stroke] { + stroke: var(--jp-icon-contrast-color1); +} + +.jp-icon-contrast2[stroke] { + stroke: var(--jp-icon-contrast-color2); +} + +.jp-icon-contrast3[stroke] { + stroke: var(--jp-icon-contrast-color3); +} + +.jp-icon-dot[fill] { + fill: var(--jp-warn-color0); +} + +.jp-jupyter-icon-color[fill] { + fill: var(--jp-jupyter-icon-color, var(--jp-warn-color0)); +} + +.jp-notebook-icon-color[fill] { + fill: var(--jp-notebook-icon-color, var(--jp-warn-color0)); +} + +.jp-json-icon-color[fill] { + fill: var(--jp-json-icon-color, var(--jp-warn-color1)); +} + +.jp-console-icon-color[fill] { + fill: var(--jp-console-icon-color, white); +} + +.jp-console-icon-background-color[fill] { + fill: var(--jp-console-icon-background-color, var(--jp-brand-color1)); +} + +.jp-terminal-icon-color[fill] { + fill: var(--jp-terminal-icon-color, var(--jp-layout-color2)); +} + +.jp-terminal-icon-background-color[fill] { + fill: var( + --jp-terminal-icon-background-color, + var(--jp-inverse-layout-color2) + ); +} + +.jp-text-editor-icon-color[fill] { + fill: var(--jp-text-editor-icon-color, var(--jp-inverse-layout-color3)); +} + +.jp-inspector-icon-color[fill] { + fill: var(--jp-inspector-icon-color, var(--jp-inverse-layout-color3)); +} + +/* CSS for icons in selected filebrowser listing items */ +.jp-DirListing-item.jp-mod-selected .jp-icon-selectable[fill] { + fill: #fff; +} + +.jp-DirListing-item.jp-mod-selected .jp-icon-selectable-inverse[fill] { + fill: var(--jp-brand-color1); +} + +/* stylelint-disable selector-max-class, selector-max-compound-selectors */ + +/** +* TODO: come up with non css-hack solution for showing the busy icon on top +* of the close icon +* CSS for complex behavior of close icon of tabs in the main area tabbar +*/ +.lm-DockPanel-tabBar + .lm-TabBar-tab.lm-mod-closable.jp-mod-dirty + > .lm-TabBar-tabCloseIcon + > :not(:hover) + > .jp-icon3[fill] { + fill: none; +} + +.lm-DockPanel-tabBar + .lm-TabBar-tab.lm-mod-closable.jp-mod-dirty + > .lm-TabBar-tabCloseIcon + > :not(:hover) + > .jp-icon-busy[fill] { + fill: var(--jp-inverse-layout-color3); +} + +/* stylelint-enable selector-max-class, selector-max-compound-selectors */ + +/* CSS for icons in status bar */ +#jp-main-statusbar .jp-mod-selected .jp-icon-selectable[fill] { + fill: #fff; +} + +#jp-main-statusbar .jp-mod-selected .jp-icon-selectable-inverse[fill] { + fill: var(--jp-brand-color1); +} + +/* special handling for splash icon CSS. While the theme CSS reloads during + splash, the splash icon can loose theming. To prevent that, we set a + default for its color variable */ +:root { + --jp-warn-color0: var(--md-orange-700); +} + +/* not sure what to do with this one, used in filebrowser listing */ +.jp-DragIcon { + margin-right: 4px; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/** + * Support for alt colors for icons as inline SVG HTMLElements + */ + +/* alt recolor the primary elements of an icon */ +.jp-icon-alt .jp-icon0[fill] { + fill: var(--jp-layout-color0); +} + +.jp-icon-alt .jp-icon1[fill] { + fill: var(--jp-layout-color1); +} + +.jp-icon-alt .jp-icon2[fill] { + fill: var(--jp-layout-color2); +} + +.jp-icon-alt .jp-icon3[fill] { + fill: var(--jp-layout-color3); +} + +.jp-icon-alt .jp-icon4[fill] { + fill: var(--jp-layout-color4); +} + +.jp-icon-alt .jp-icon0[stroke] { + stroke: var(--jp-layout-color0); +} + +.jp-icon-alt .jp-icon1[stroke] { + stroke: var(--jp-layout-color1); +} + +.jp-icon-alt .jp-icon2[stroke] { + stroke: var(--jp-layout-color2); +} + +.jp-icon-alt .jp-icon3[stroke] { + stroke: var(--jp-layout-color3); +} + +.jp-icon-alt .jp-icon4[stroke] { + stroke: var(--jp-layout-color4); +} + +/* alt recolor the accent elements of an icon */ +.jp-icon-alt .jp-icon-accent0[fill] { + fill: var(--jp-inverse-layout-color0); +} + +.jp-icon-alt .jp-icon-accent1[fill] { + fill: var(--jp-inverse-layout-color1); +} + +.jp-icon-alt .jp-icon-accent2[fill] { + fill: var(--jp-inverse-layout-color2); +} + +.jp-icon-alt .jp-icon-accent3[fill] { + fill: var(--jp-inverse-layout-color3); +} + +.jp-icon-alt .jp-icon-accent4[fill] { + fill: var(--jp-inverse-layout-color4); +} + +.jp-icon-alt .jp-icon-accent0[stroke] { + stroke: var(--jp-inverse-layout-color0); +} + +.jp-icon-alt .jp-icon-accent1[stroke] { + stroke: var(--jp-inverse-layout-color1); +} + +.jp-icon-alt .jp-icon-accent2[stroke] { + stroke: var(--jp-inverse-layout-color2); +} + +.jp-icon-alt .jp-icon-accent3[stroke] { + stroke: var(--jp-inverse-layout-color3); +} + +.jp-icon-alt .jp-icon-accent4[stroke] { + stroke: var(--jp-inverse-layout-color4); +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-icon-hoverShow:not(:hover) .jp-icon-hoverShow-content { + display: none !important; +} + +/** + * Support for hover colors for icons as inline SVG HTMLElements + */ + +/** + * regular colors + */ + +/* recolor the primary elements of an icon */ +.jp-icon-hover :hover .jp-icon0-hover[fill] { + fill: var(--jp-inverse-layout-color0); +} + +.jp-icon-hover :hover .jp-icon1-hover[fill] { + fill: var(--jp-inverse-layout-color1); +} + +.jp-icon-hover :hover .jp-icon2-hover[fill] { + fill: var(--jp-inverse-layout-color2); +} + +.jp-icon-hover :hover .jp-icon3-hover[fill] { + fill: var(--jp-inverse-layout-color3); +} + +.jp-icon-hover :hover .jp-icon4-hover[fill] { + fill: var(--jp-inverse-layout-color4); +} + +.jp-icon-hover :hover .jp-icon0-hover[stroke] { + stroke: var(--jp-inverse-layout-color0); +} + +.jp-icon-hover :hover .jp-icon1-hover[stroke] { + stroke: var(--jp-inverse-layout-color1); +} + +.jp-icon-hover :hover .jp-icon2-hover[stroke] { + stroke: var(--jp-inverse-layout-color2); +} + +.jp-icon-hover :hover .jp-icon3-hover[stroke] { + stroke: var(--jp-inverse-layout-color3); +} + +.jp-icon-hover :hover .jp-icon4-hover[stroke] { + stroke: var(--jp-inverse-layout-color4); +} + +/* recolor the accent elements of an icon */ +.jp-icon-hover :hover .jp-icon-accent0-hover[fill] { + fill: var(--jp-layout-color0); +} + +.jp-icon-hover :hover .jp-icon-accent1-hover[fill] { + fill: var(--jp-layout-color1); +} + +.jp-icon-hover :hover .jp-icon-accent2-hover[fill] { + fill: var(--jp-layout-color2); +} + +.jp-icon-hover :hover .jp-icon-accent3-hover[fill] { + fill: var(--jp-layout-color3); +} + +.jp-icon-hover :hover .jp-icon-accent4-hover[fill] { + fill: var(--jp-layout-color4); +} + +.jp-icon-hover :hover .jp-icon-accent0-hover[stroke] { + stroke: var(--jp-layout-color0); +} + +.jp-icon-hover :hover .jp-icon-accent1-hover[stroke] { + stroke: var(--jp-layout-color1); +} + +.jp-icon-hover :hover .jp-icon-accent2-hover[stroke] { + stroke: var(--jp-layout-color2); +} + +.jp-icon-hover :hover .jp-icon-accent3-hover[stroke] { + stroke: var(--jp-layout-color3); +} + +.jp-icon-hover :hover .jp-icon-accent4-hover[stroke] { + stroke: var(--jp-layout-color4); +} + +/* set the color of an icon to transparent */ +.jp-icon-hover :hover .jp-icon-none-hover[fill] { + fill: none; +} + +.jp-icon-hover :hover .jp-icon-none-hover[stroke] { + stroke: none; +} + +/** + * inverse colors + */ + +/* inverse recolor the primary elements of an icon */ +.jp-icon-hover.jp-icon-alt :hover .jp-icon0-hover[fill] { + fill: var(--jp-layout-color0); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon1-hover[fill] { + fill: var(--jp-layout-color1); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon2-hover[fill] { + fill: var(--jp-layout-color2); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon3-hover[fill] { + fill: var(--jp-layout-color3); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon4-hover[fill] { + fill: var(--jp-layout-color4); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon0-hover[stroke] { + stroke: var(--jp-layout-color0); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon1-hover[stroke] { + stroke: var(--jp-layout-color1); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon2-hover[stroke] { + stroke: var(--jp-layout-color2); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon3-hover[stroke] { + stroke: var(--jp-layout-color3); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon4-hover[stroke] { + stroke: var(--jp-layout-color4); +} + +/* inverse recolor the accent elements of an icon */ +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent0-hover[fill] { + fill: var(--jp-inverse-layout-color0); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent1-hover[fill] { + fill: var(--jp-inverse-layout-color1); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent2-hover[fill] { + fill: var(--jp-inverse-layout-color2); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent3-hover[fill] { + fill: var(--jp-inverse-layout-color3); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent4-hover[fill] { + fill: var(--jp-inverse-layout-color4); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent0-hover[stroke] { + stroke: var(--jp-inverse-layout-color0); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent1-hover[stroke] { + stroke: var(--jp-inverse-layout-color1); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent2-hover[stroke] { + stroke: var(--jp-inverse-layout-color2); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent3-hover[stroke] { + stroke: var(--jp-inverse-layout-color3); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent4-hover[stroke] { + stroke: var(--jp-inverse-layout-color4); +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-IFrame { + width: 100%; + height: 100%; +} + +.jp-IFrame > iframe { + border: none; +} + +/* +When drag events occur, `lm-mod-override-cursor` is added to the body. +Because iframes steal all cursor events, the following two rules are necessary +to suppress pointer events while resize drags are occurring. There may be a +better solution to this problem. +*/ +body.lm-mod-override-cursor .jp-IFrame { + position: relative; +} + +body.lm-mod-override-cursor .jp-IFrame::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: transparent; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) 2014-2016, Jupyter Development Team. +| +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-HoverBox { + position: fixed; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-FormGroup-content fieldset { + border: none; + padding: 0; + min-width: 0; + width: 100%; +} + +/* stylelint-disable selector-max-type */ + +.jp-FormGroup-content fieldset .jp-inputFieldWrapper input, +.jp-FormGroup-content fieldset .jp-inputFieldWrapper select, +.jp-FormGroup-content fieldset .jp-inputFieldWrapper textarea { + font-size: var(--jp-content-font-size2); + border-color: var(--jp-input-border-color); + border-style: solid; + border-radius: var(--jp-border-radius); + border-width: 1px; + padding: 6px 8px; + background: none; + color: var(--jp-ui-font-color0); + height: inherit; +} + +.jp-FormGroup-content fieldset input[type='checkbox'] { + position: relative; + top: 2px; + margin-left: 0; +} + +.jp-FormGroup-content button.jp-mod-styled { + cursor: pointer; +} + +.jp-FormGroup-content .checkbox label { + cursor: pointer; + font-size: var(--jp-content-font-size1); +} + +.jp-FormGroup-content .jp-root > fieldset > legend { + display: none; +} + +.jp-FormGroup-content .jp-root > fieldset > p { + display: none; +} + +/** copy of `input.jp-mod-styled:focus` style */ +.jp-FormGroup-content fieldset input:focus, +.jp-FormGroup-content fieldset select:focus { + -moz-outline-radius: unset; + outline: var(--jp-border-width) solid var(--md-blue-500); + outline-offset: -1px; + box-shadow: inset 0 0 4px var(--md-blue-300); +} + +.jp-FormGroup-content fieldset input:hover:not(:focus), +.jp-FormGroup-content fieldset select:hover:not(:focus) { + background-color: var(--jp-border-color2); +} + +/* stylelint-enable selector-max-type */ + +.jp-FormGroup-content .checkbox .field-description { + /* Disable default description field for checkbox: + because other widgets do not have description fields, + we add descriptions to each widget on the field level. + */ + display: none; +} + +.jp-FormGroup-content #root__description { + display: none; +} + +.jp-FormGroup-content .jp-modifiedIndicator { + width: 5px; + background-color: var(--jp-brand-color2); + margin-top: 0; + margin-left: calc(var(--jp-private-settingeditor-modifier-indent) * -1); + flex-shrink: 0; +} + +.jp-FormGroup-content .jp-modifiedIndicator.jp-errorIndicator { + background-color: var(--jp-error-color0); + margin-right: 0.5em; +} + +/* RJSF ARRAY style */ + +.jp-arrayFieldWrapper legend { + font-size: var(--jp-content-font-size2); + color: var(--jp-ui-font-color0); + flex-basis: 100%; + padding: 4px 0; + font-weight: var(--jp-content-heading-font-weight); + border-bottom: 1px solid var(--jp-border-color2); +} + +.jp-arrayFieldWrapper .field-description { + padding: 4px 0; + white-space: pre-wrap; +} + +.jp-arrayFieldWrapper .array-item { + width: 100%; + border: 1px solid var(--jp-border-color2); + border-radius: 4px; + margin: 4px; +} + +.jp-ArrayOperations { + display: flex; + margin-left: 8px; +} + +.jp-ArrayOperationsButton { + margin: 2px; +} + +.jp-ArrayOperationsButton .jp-icon3[fill] { + fill: var(--jp-ui-font-color0); +} + +button.jp-ArrayOperationsButton.jp-mod-styled:disabled { + cursor: not-allowed; + opacity: 0.5; +} + +/* RJSF form validation error */ + +.jp-FormGroup-content .validationErrors { + color: var(--jp-error-color0); +} + +/* Hide panel level error as duplicated the field level error */ +.jp-FormGroup-content .panel.errors { + display: none; +} + +/* RJSF normal content (settings-editor) */ + +.jp-FormGroup-contentNormal { + display: flex; + align-items: center; + flex-wrap: wrap; +} + +.jp-FormGroup-contentNormal .jp-FormGroup-contentItem { + margin-left: 7px; + color: var(--jp-ui-font-color0); +} + +.jp-FormGroup-contentNormal .jp-FormGroup-description { + flex-basis: 100%; + padding: 4px 7px; +} + +.jp-FormGroup-contentNormal .jp-FormGroup-default { + flex-basis: 100%; + padding: 4px 7px; +} + +.jp-FormGroup-contentNormal .jp-FormGroup-fieldLabel { + font-size: var(--jp-content-font-size1); + font-weight: normal; + min-width: 120px; +} + +.jp-FormGroup-contentNormal fieldset:not(:first-child) { + margin-left: 7px; +} + +.jp-FormGroup-contentNormal .field-array-of-string .array-item { + /* Display `jp-ArrayOperations` buttons side-by-side with content except + for small screens where flex-wrap will place them one below the other. + */ + display: flex; + align-items: center; + flex-wrap: wrap; +} + +.jp-FormGroup-contentNormal .jp-objectFieldWrapper .form-group { + padding: 2px 8px 2px var(--jp-private-settingeditor-modifier-indent); + margin-top: 2px; +} + +/* RJSF compact content (metadata-form) */ + +.jp-FormGroup-content.jp-FormGroup-contentCompact { + width: 100%; +} + +.jp-FormGroup-contentCompact .form-group { + display: flex; + padding: 0.5em 0.2em 0.5em 0; +} + +.jp-FormGroup-contentCompact + .jp-FormGroup-compactTitle + .jp-FormGroup-description { + font-size: var(--jp-ui-font-size1); + color: var(--jp-ui-font-color2); +} + +.jp-FormGroup-contentCompact .jp-FormGroup-fieldLabel { + padding-bottom: 0.3em; +} + +.jp-FormGroup-contentCompact .jp-inputFieldWrapper .form-control { + width: 100%; + box-sizing: border-box; +} + +.jp-FormGroup-contentCompact .jp-arrayFieldWrapper .jp-FormGroup-compactTitle { + padding-bottom: 7px; +} + +.jp-FormGroup-contentCompact + .jp-objectFieldWrapper + .jp-objectFieldWrapper + .form-group { + padding: 2px 8px 2px var(--jp-private-settingeditor-modifier-indent); + margin-top: 2px; +} + +.jp-FormGroup-contentCompact ul.error-detail { + margin-block-start: 0.5em; + margin-block-end: 0.5em; + padding-inline-start: 1em; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +.jp-SidePanel { + display: flex; + flex-direction: column; + min-width: var(--jp-sidebar-min-width); + overflow-y: auto; + color: var(--jp-ui-font-color1); + background: var(--jp-layout-color1); + font-size: var(--jp-ui-font-size1); +} + +.jp-SidePanel-header { + flex: 0 0 auto; + display: flex; + border-bottom: var(--jp-border-width) solid var(--jp-border-color2); + font-size: var(--jp-ui-font-size0); + font-weight: 600; + letter-spacing: 1px; + margin: 0; + padding: 2px; + text-transform: uppercase; +} + +.jp-SidePanel-toolbar { + flex: 0 0 auto; +} + +.jp-SidePanel-content { + flex: 1 1 auto; +} + +.jp-SidePanel-toolbar, +.jp-AccordionPanel-toolbar { + height: var(--jp-private-toolbar-height); +} + +.jp-SidePanel-toolbar.jp-Toolbar-micro { + display: none; +} + +.lm-AccordionPanel .jp-AccordionPanel-title { + box-sizing: border-box; + line-height: 25px; + margin: 0; + display: flex; + align-items: center; + background: var(--jp-layout-color1); + color: var(--jp-ui-font-color1); + border-bottom: var(--jp-border-width) solid var(--jp-toolbar-border-color); + box-shadow: var(--jp-toolbar-box-shadow); + font-size: var(--jp-ui-font-size0); +} + +.jp-AccordionPanel-title { + cursor: pointer; + user-select: none; + -moz-user-select: none; + -webkit-user-select: none; + text-transform: uppercase; +} + +.lm-AccordionPanel[data-orientation='horizontal'] > .jp-AccordionPanel-title { + /* Title is rotated for horizontal accordion panel using CSS */ + display: block; + transform-origin: top left; + transform: rotate(-90deg) translate(-100%); +} + +.jp-AccordionPanel-title .lm-AccordionPanel-titleLabel { + user-select: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.jp-AccordionPanel-title .lm-AccordionPanel-titleCollapser { + transform: rotate(-90deg); + margin: auto 0; + height: 16px; +} + +.jp-AccordionPanel-title.lm-mod-expanded .lm-AccordionPanel-titleCollapser { + transform: rotate(0deg); +} + +.lm-AccordionPanel .jp-AccordionPanel-toolbar { + background: none; + box-shadow: none; + border: none; + margin-left: auto; +} + +.lm-AccordionPanel .lm-SplitPanel-handle:hover { + background: var(--jp-layout-color3); +} + +.jp-text-truncated { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) 2017, Jupyter Development Team. +| +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-Spinner { + position: absolute; + display: flex; + justify-content: center; + align-items: center; + z-index: 10; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: var(--jp-layout-color0); + outline: none; +} + +.jp-SpinnerContent { + font-size: 10px; + margin: 50px auto; + text-indent: -9999em; + width: 3em; + height: 3em; + border-radius: 50%; + background: var(--jp-brand-color3); + background: linear-gradient( + to right, + #f37626 10%, + rgba(255, 255, 255, 0) 42% + ); + position: relative; + animation: load3 1s infinite linear, fadeIn 1s; +} + +.jp-SpinnerContent::before { + width: 50%; + height: 50%; + background: #f37626; + border-radius: 100% 0 0; + position: absolute; + top: 0; + left: 0; + content: ''; +} + +.jp-SpinnerContent::after { + background: var(--jp-layout-color0); + width: 75%; + height: 75%; + border-radius: 50%; + content: ''; + margin: auto; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; +} + +@keyframes fadeIn { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + +@keyframes load3 { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} + +/*----------------------------------------------------------------------------- +| Copyright (c) 2014-2017, Jupyter Development Team. +| +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +button.jp-mod-styled { + font-size: var(--jp-ui-font-size1); + color: var(--jp-ui-font-color0); + border: none; + box-sizing: border-box; + text-align: center; + line-height: 32px; + height: 32px; + padding: 0 12px; + letter-spacing: 0.8px; + outline: none; + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; +} + +input.jp-mod-styled { + background: var(--jp-input-background); + height: 28px; + box-sizing: border-box; + border: var(--jp-border-width) solid var(--jp-border-color1); + padding-left: 7px; + padding-right: 7px; + font-size: var(--jp-ui-font-size2); + color: var(--jp-ui-font-color0); + outline: none; + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; +} + +input[type='checkbox'].jp-mod-styled { + appearance: checkbox; + -webkit-appearance: checkbox; + -moz-appearance: checkbox; + height: auto; +} + +input.jp-mod-styled:focus { + border: var(--jp-border-width) solid var(--md-blue-500); + box-shadow: inset 0 0 4px var(--md-blue-300); +} + +.jp-select-wrapper { + display: flex; + position: relative; + flex-direction: column; + padding: 1px; + background-color: var(--jp-layout-color1); + box-sizing: border-box; + margin-bottom: 12px; +} + +.jp-select-wrapper:not(.multiple) { + height: 28px; +} + +.jp-select-wrapper.jp-mod-focused select.jp-mod-styled { + border: var(--jp-border-width) solid var(--jp-input-active-border-color); + box-shadow: var(--jp-input-box-shadow); + background-color: var(--jp-input-active-background); +} + +select.jp-mod-styled:hover { + cursor: pointer; + color: var(--jp-ui-font-color0); + background-color: var(--jp-input-hover-background); + box-shadow: inset 0 0 1px rgba(0, 0, 0, 0.5); +} + +select.jp-mod-styled { + flex: 1 1 auto; + width: 100%; + font-size: var(--jp-ui-font-size2); + background: var(--jp-input-background); + color: var(--jp-ui-font-color0); + padding: 0 25px 0 8px; + border: var(--jp-border-width) solid var(--jp-input-border-color); + border-radius: 0; + outline: none; + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; +} + +select.jp-mod-styled:not([multiple]) { + height: 32px; +} + +select.jp-mod-styled[multiple] { + max-height: 200px; + overflow-y: auto; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-switch { + display: flex; + align-items: center; + padding-left: 4px; + padding-right: 4px; + font-size: var(--jp-ui-font-size1); + background-color: transparent; + color: var(--jp-ui-font-color1); + border: none; + height: 20px; +} + +.jp-switch:hover { + background-color: var(--jp-layout-color2); +} + +.jp-switch-label { + margin-right: 5px; + font-family: var(--jp-ui-font-family); +} + +.jp-switch-track { + cursor: pointer; + background-color: var(--jp-switch-color, var(--jp-border-color1)); + -webkit-transition: 0.4s; + transition: 0.4s; + border-radius: 34px; + height: 16px; + width: 35px; + position: relative; +} + +.jp-switch-track::before { + content: ''; + position: absolute; + height: 10px; + width: 10px; + margin: 3px; + left: 0; + background-color: var(--jp-ui-inverse-font-color1); + -webkit-transition: 0.4s; + transition: 0.4s; + border-radius: 50%; +} + +.jp-switch[aria-checked='true'] .jp-switch-track { + background-color: var(--jp-switch-true-position-color, var(--jp-warn-color0)); +} + +.jp-switch[aria-checked='true'] .jp-switch-track::before { + /* track width (35) - margins (3 + 3) - thumb width (10) */ + left: 19px; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) 2014-2016, Jupyter Development Team. +| +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +:root { + --jp-private-toolbar-height: calc( + 28px + var(--jp-border-width) + ); /* leave 28px for content */ +} + +.jp-Toolbar { + color: var(--jp-ui-font-color1); + flex: 0 0 auto; + display: flex; + flex-direction: row; + border-bottom: var(--jp-border-width) solid var(--jp-toolbar-border-color); + box-shadow: var(--jp-toolbar-box-shadow); + background: var(--jp-toolbar-background); + min-height: var(--jp-toolbar-micro-height); + padding: 2px; + z-index: 8; + overflow-x: hidden; +} + +/* Toolbar items */ + +.jp-Toolbar > .jp-Toolbar-item.jp-Toolbar-spacer { + flex-grow: 1; + flex-shrink: 1; +} + +.jp-Toolbar-item.jp-Toolbar-kernelStatus { + display: inline-block; + width: 32px; + background-repeat: no-repeat; + background-position: center; + background-size: 16px; +} + +.jp-Toolbar > .jp-Toolbar-item { + flex: 0 0 auto; + display: flex; + padding-left: 1px; + padding-right: 1px; + font-size: var(--jp-ui-font-size1); + line-height: var(--jp-private-toolbar-height); + height: 100%; +} + +/* Toolbar buttons */ + +/* This is the div we use to wrap the react component into a Widget */ +div.jp-ToolbarButton { + color: transparent; + border: none; + box-sizing: border-box; + outline: none; + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; + padding: 0; + margin: 0; +} + +button.jp-ToolbarButtonComponent { + background: var(--jp-layout-color1); + border: none; + box-sizing: border-box; + outline: none; + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; + padding: 0 6px; + margin: 0; + height: 24px; + border-radius: var(--jp-border-radius); + display: flex; + align-items: center; + text-align: center; + font-size: 14px; + min-width: unset; + min-height: unset; +} + +button.jp-ToolbarButtonComponent:disabled { + opacity: 0.4; +} + +button.jp-ToolbarButtonComponent > span { + padding: 0; + flex: 0 0 auto; +} + +button.jp-ToolbarButtonComponent .jp-ToolbarButtonComponent-label { + font-size: var(--jp-ui-font-size1); + line-height: 100%; + padding-left: 2px; + color: var(--jp-ui-font-color1); + font-family: var(--jp-ui-font-family); +} + +#jp-main-dock-panel[data-mode='single-document'] + .jp-MainAreaWidget + > .jp-Toolbar.jp-Toolbar-micro { + padding: 0; + min-height: 0; +} + +#jp-main-dock-panel[data-mode='single-document'] + .jp-MainAreaWidget + > .jp-Toolbar { + border: none; + box-shadow: none; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +.jp-WindowedPanel-outer { + position: relative; + overflow-y: auto; +} + +.jp-WindowedPanel-inner { + position: relative; +} + +.jp-WindowedPanel-window { + position: absolute; + left: 0; + right: 0; + overflow: visible; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/* Sibling imports */ + +body { + color: var(--jp-ui-font-color1); + font-size: var(--jp-ui-font-size1); +} + +/* Disable native link decoration styles everywhere outside of dialog boxes */ +a { + text-decoration: unset; + color: unset; +} + +a:hover { + text-decoration: unset; + color: unset; +} + +/* Accessibility for links inside dialog box text */ +.jp-Dialog-content a { + text-decoration: revert; + color: var(--jp-content-link-color); +} + +.jp-Dialog-content a:hover { + text-decoration: revert; +} + +/* Styles for ui-components */ +.jp-Button { + color: var(--jp-ui-font-color2); + border-radius: var(--jp-border-radius); + padding: 0 12px; + font-size: var(--jp-ui-font-size1); + + /* Copy from blueprint 3 */ + display: inline-flex; + flex-direction: row; + border: none; + cursor: pointer; + align-items: center; + justify-content: center; + text-align: left; + vertical-align: middle; + min-height: 30px; + min-width: 30px; +} + +.jp-Button:disabled { + cursor: not-allowed; +} + +.jp-Button:empty { + padding: 0 !important; +} + +.jp-Button.jp-mod-small { + min-height: 24px; + min-width: 24px; + font-size: 12px; + padding: 0 7px; +} + +/* Use our own theme for hover styles */ +.jp-Button.jp-mod-minimal:hover { + background-color: var(--jp-layout-color2); +} + +.jp-Button.jp-mod-minimal { + background: none; +} + +.jp-InputGroup { + display: block; + position: relative; +} + +.jp-InputGroup input { + box-sizing: border-box; + border: none; + border-radius: 0; + background-color: transparent; + color: var(--jp-ui-font-color0); + box-shadow: inset 0 0 0 var(--jp-border-width) var(--jp-input-border-color); + padding-bottom: 0; + padding-top: 0; + padding-left: 10px; + padding-right: 28px; + position: relative; + width: 100%; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + font-size: 14px; + font-weight: 400; + height: 30px; + line-height: 30px; + outline: none; + vertical-align: middle; +} + +.jp-InputGroup input:focus { + box-shadow: inset 0 0 0 var(--jp-border-width) + var(--jp-input-active-box-shadow-color), + inset 0 0 0 3px var(--jp-input-active-box-shadow-color); +} + +.jp-InputGroup input:disabled { + cursor: not-allowed; + resize: block; + background-color: var(--jp-layout-color2); + color: var(--jp-ui-font-color2); +} + +.jp-InputGroup input:disabled ~ span { + cursor: not-allowed; + color: var(--jp-ui-font-color2); +} + +.jp-InputGroup input::placeholder, +input::placeholder { + color: var(--jp-ui-font-color2); +} + +.jp-InputGroupAction { + position: absolute; + bottom: 1px; + right: 0; + padding: 6px; +} + +.jp-HTMLSelect.jp-DefaultStyle select { + background-color: initial; + border: none; + border-radius: 0; + box-shadow: none; + color: var(--jp-ui-font-color0); + display: block; + font-size: var(--jp-ui-font-size1); + font-family: var(--jp-ui-font-family); + height: 24px; + line-height: 14px; + padding: 0 25px 0 10px; + text-align: left; + -moz-appearance: none; + -webkit-appearance: none; +} + +.jp-HTMLSelect.jp-DefaultStyle select:disabled { + background-color: var(--jp-layout-color2); + color: var(--jp-ui-font-color2); + cursor: not-allowed; + resize: block; +} + +.jp-HTMLSelect.jp-DefaultStyle select:disabled ~ span { + cursor: not-allowed; +} + +/* Use our own theme for hover and option styles */ +/* stylelint-disable-next-line selector-max-type */ +.jp-HTMLSelect.jp-DefaultStyle select:hover, +.jp-HTMLSelect.jp-DefaultStyle select > option { + background-color: var(--jp-layout-color2); + color: var(--jp-ui-font-color0); +} + +select { + box-sizing: border-box; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Styles +|----------------------------------------------------------------------------*/ + +.jp-StatusBar-Widget { + display: flex; + align-items: center; + background: var(--jp-layout-color2); + min-height: var(--jp-statusbar-height); + justify-content: space-between; + padding: 0 10px; +} + +.jp-StatusBar-Left { + display: flex; + align-items: center; + flex-direction: row; +} + +.jp-StatusBar-Middle { + display: flex; + align-items: center; +} + +.jp-StatusBar-Right { + display: flex; + align-items: center; + flex-direction: row-reverse; +} + +.jp-StatusBar-Item { + max-height: var(--jp-statusbar-height); + margin: 0 2px; + height: var(--jp-statusbar-height); + white-space: nowrap; + text-overflow: ellipsis; + color: var(--jp-ui-font-color1); + padding: 0 6px; +} + +.jp-mod-highlighted:hover { + background-color: var(--jp-layout-color3); +} + +.jp-mod-clicked { + background-color: var(--jp-brand-color1); +} + +.jp-mod-clicked:hover { + background-color: var(--jp-brand-color0); +} + +.jp-mod-clicked .jp-StatusBar-TextItem { + color: var(--jp-ui-inverse-font-color1); +} + +.jp-StatusBar-HoverItem { + box-shadow: '0px 4px 4px rgba(0, 0, 0, 0.25)'; +} + +.jp-StatusBar-TextItem { + font-size: var(--jp-ui-font-size1); + font-family: var(--jp-ui-font-family); + line-height: 24px; + color: var(--jp-ui-font-color1); +} + +.jp-StatusBar-GroupItem { + display: flex; + align-items: center; + flex-direction: row; +} + +.jp-Statusbar-ProgressCircle svg { + display: block; + margin: 0 auto; + width: 16px; + height: 24px; + align-self: normal; +} + +.jp-Statusbar-ProgressCircle path { + fill: var(--jp-inverse-layout-color3); +} + +.jp-Statusbar-ProgressBar-progress-bar { + height: 10px; + width: 100px; + border: solid 0.25px var(--jp-brand-color2); + border-radius: 3px; + overflow: hidden; + align-self: center; +} + +.jp-Statusbar-ProgressBar-progress-bar > div { + background-color: var(--jp-brand-color2); + background-image: linear-gradient( + -45deg, + rgba(255, 255, 255, 0.2) 25%, + transparent 25%, + transparent 50%, + rgba(255, 255, 255, 0.2) 50%, + rgba(255, 255, 255, 0.2) 75%, + transparent 75%, + transparent + ); + background-size: 40px 40px; + float: left; + width: 0%; + height: 100%; + font-size: 12px; + line-height: 14px; + color: #fff; + text-align: center; + animation: jp-Statusbar-ExecutionTime-progress-bar 2s linear infinite; +} + +.jp-Statusbar-ProgressBar-progress-bar p { + color: var(--jp-ui-font-color1); + font-family: var(--jp-ui-font-family); + font-size: var(--jp-ui-font-size1); + line-height: 10px; + width: 100px; +} + +@keyframes jp-Statusbar-ExecutionTime-progress-bar { + 0% { + background-position: 0 0; + } + + 100% { + background-position: 40px 40px; + } +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Variables +|----------------------------------------------------------------------------*/ + +:root { + --jp-private-commandpalette-search-height: 28px; +} + +/*----------------------------------------------------------------------------- +| Overall styles +|----------------------------------------------------------------------------*/ + +.lm-CommandPalette { + padding-bottom: 0; + color: var(--jp-ui-font-color1); + background: var(--jp-layout-color1); + + /* This is needed so that all font sizing of children done in ems is + * relative to this base size */ + font-size: var(--jp-ui-font-size1); +} + +/*----------------------------------------------------------------------------- +| Modal variant +|----------------------------------------------------------------------------*/ + +.jp-ModalCommandPalette { + position: absolute; + z-index: 10000; + top: 38px; + left: 30%; + margin: 0; + padding: 4px; + width: 40%; + box-shadow: var(--jp-elevation-z4); + border-radius: 4px; + background: var(--jp-layout-color0); +} + +.jp-ModalCommandPalette .lm-CommandPalette { + max-height: 40vh; +} + +.jp-ModalCommandPalette .lm-CommandPalette .lm-close-icon::after { + display: none; +} + +.jp-ModalCommandPalette .lm-CommandPalette .lm-CommandPalette-header { + display: none; +} + +.jp-ModalCommandPalette .lm-CommandPalette .lm-CommandPalette-item { + margin-left: 4px; + margin-right: 4px; +} + +.jp-ModalCommandPalette + .lm-CommandPalette + .lm-CommandPalette-item.lm-mod-disabled { + display: none; +} + +/*----------------------------------------------------------------------------- +| Search +|----------------------------------------------------------------------------*/ + +.lm-CommandPalette-search { + padding: 4px; + background-color: var(--jp-layout-color1); + z-index: 2; +} + +.lm-CommandPalette-wrapper { + overflow: overlay; + padding: 0 9px; + background-color: var(--jp-input-active-background); + height: 30px; + box-shadow: inset 0 0 0 var(--jp-border-width) var(--jp-input-border-color); +} + +.lm-CommandPalette.lm-mod-focused .lm-CommandPalette-wrapper { + box-shadow: inset 0 0 0 1px var(--jp-input-active-box-shadow-color), + inset 0 0 0 3px var(--jp-input-active-box-shadow-color); +} + +.jp-SearchIconGroup { + color: white; + background-color: var(--jp-brand-color1); + position: absolute; + top: 4px; + right: 4px; + padding: 5px 5px 1px; +} + +.jp-SearchIconGroup svg { + height: 20px; + width: 20px; +} + +.jp-SearchIconGroup .jp-icon3[fill] { + fill: var(--jp-layout-color0); +} + +.lm-CommandPalette-input { + background: transparent; + width: calc(100% - 18px); + float: left; + border: none; + outline: none; + font-size: var(--jp-ui-font-size1); + color: var(--jp-ui-font-color0); + line-height: var(--jp-private-commandpalette-search-height); +} + +.lm-CommandPalette-input::-webkit-input-placeholder, +.lm-CommandPalette-input::-moz-placeholder, +.lm-CommandPalette-input:-ms-input-placeholder { + color: var(--jp-ui-font-color2); + font-size: var(--jp-ui-font-size1); +} + +/*----------------------------------------------------------------------------- +| Results +|----------------------------------------------------------------------------*/ + +.lm-CommandPalette-header:first-child { + margin-top: 0; +} + +.lm-CommandPalette-header { + border-bottom: solid var(--jp-border-width) var(--jp-border-color2); + color: var(--jp-ui-font-color1); + cursor: pointer; + display: flex; + font-size: var(--jp-ui-font-size0); + font-weight: 600; + letter-spacing: 1px; + margin-top: 8px; + padding: 8px 0 8px 12px; + text-transform: uppercase; +} + +.lm-CommandPalette-header.lm-mod-active { + background: var(--jp-layout-color2); +} + +.lm-CommandPalette-header > mark { + background-color: transparent; + font-weight: bold; + color: var(--jp-ui-font-color1); +} + +.lm-CommandPalette-item { + padding: 4px 12px 4px 4px; + color: var(--jp-ui-font-color1); + font-size: var(--jp-ui-font-size1); + font-weight: 400; + display: flex; +} + +.lm-CommandPalette-item.lm-mod-disabled { + color: var(--jp-ui-font-color2); +} + +.lm-CommandPalette-item.lm-mod-active { + color: var(--jp-ui-inverse-font-color1); + background: var(--jp-brand-color1); +} + +.lm-CommandPalette-item.lm-mod-active .lm-CommandPalette-itemLabel > mark { + color: var(--jp-ui-inverse-font-color0); +} + +.lm-CommandPalette-item.lm-mod-active .jp-icon-selectable[fill] { + fill: var(--jp-layout-color0); +} + +.lm-CommandPalette-item.lm-mod-active:hover:not(.lm-mod-disabled) { + color: var(--jp-ui-inverse-font-color1); + background: var(--jp-brand-color1); +} + +.lm-CommandPalette-item:hover:not(.lm-mod-active):not(.lm-mod-disabled) { + background: var(--jp-layout-color2); +} + +.lm-CommandPalette-itemContent { + overflow: hidden; +} + +.lm-CommandPalette-itemLabel > mark { + color: var(--jp-ui-font-color0); + background-color: transparent; + font-weight: bold; +} + +.lm-CommandPalette-item.lm-mod-disabled mark { + color: var(--jp-ui-font-color2); +} + +.lm-CommandPalette-item .lm-CommandPalette-itemIcon { + margin: 0 4px 0 0; + position: relative; + width: 16px; + top: 2px; + flex: 0 0 auto; +} + +.lm-CommandPalette-item.lm-mod-disabled .lm-CommandPalette-itemIcon { + opacity: 0.6; +} + +.lm-CommandPalette-item .lm-CommandPalette-itemShortcut { + flex: 0 0 auto; +} + +.lm-CommandPalette-itemCaption { + display: none; +} + +.lm-CommandPalette-content { + background-color: var(--jp-layout-color1); +} + +.lm-CommandPalette-content:empty::after { + content: 'No results'; + margin: auto; + margin-top: 20px; + width: 100px; + display: block; + font-size: var(--jp-ui-font-size2); + font-family: var(--jp-ui-font-family); + font-weight: lighter; +} + +.lm-CommandPalette-emptyMessage { + text-align: center; + margin-top: 24px; + line-height: 1.32; + padding: 0 8px; + color: var(--jp-content-font-color3); +} + +/*----------------------------------------------------------------------------- +| Copyright (c) 2014-2017, Jupyter Development Team. +| +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-Dialog { + position: absolute; + z-index: 10000; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + top: 0; + left: 0; + margin: 0; + padding: 0; + width: 100%; + height: 100%; + background: var(--jp-dialog-background); +} + +.jp-Dialog-content { + display: flex; + flex-direction: column; + margin-left: auto; + margin-right: auto; + background: var(--jp-layout-color1); + padding: 24px 24px 12px; + min-width: 300px; + min-height: 150px; + max-width: 1000px; + max-height: 500px; + box-sizing: border-box; + box-shadow: var(--jp-elevation-z20); + word-wrap: break-word; + border-radius: var(--jp-border-radius); + + /* This is needed so that all font sizing of children done in ems is + * relative to this base size */ + font-size: var(--jp-ui-font-size1); + color: var(--jp-ui-font-color1); + resize: both; +} + +.jp-Dialog-content.jp-Dialog-content-small { + max-width: 500px; +} + +.jp-Dialog-button { + overflow: visible; +} + +button.jp-Dialog-button:focus { + outline: 1px solid var(--jp-brand-color1); + outline-offset: 4px; + -moz-outline-radius: 0; +} + +button.jp-Dialog-button:focus::-moz-focus-inner { + border: 0; +} + +button.jp-Dialog-button.jp-mod-styled.jp-mod-accept:focus, +button.jp-Dialog-button.jp-mod-styled.jp-mod-warn:focus, +button.jp-Dialog-button.jp-mod-styled.jp-mod-reject:focus { + outline-offset: 4px; + -moz-outline-radius: 0; +} + +button.jp-Dialog-button.jp-mod-styled.jp-mod-accept:focus { + outline: 1px solid var(--jp-accept-color-normal, var(--jp-brand-color1)); +} + +button.jp-Dialog-button.jp-mod-styled.jp-mod-warn:focus { + outline: 1px solid var(--jp-warn-color-normal, var(--jp-error-color1)); +} + +button.jp-Dialog-button.jp-mod-styled.jp-mod-reject:focus { + outline: 1px solid var(--jp-reject-color-normal, var(--md-grey-600)); +} + +button.jp-Dialog-close-button { + padding: 0; + height: 100%; + min-width: unset; + min-height: unset; +} + +.jp-Dialog-header { + display: flex; + justify-content: space-between; + flex: 0 0 auto; + padding-bottom: 12px; + font-size: var(--jp-ui-font-size3); + font-weight: 400; + color: var(--jp-ui-font-color1); +} + +.jp-Dialog-body { + display: flex; + flex-direction: column; + flex: 1 1 auto; + font-size: var(--jp-ui-font-size1); + background: var(--jp-layout-color1); + color: var(--jp-ui-font-color1); + overflow: auto; +} + +.jp-Dialog-footer { + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: center; + flex: 0 0 auto; + margin-left: -12px; + margin-right: -12px; + padding: 12px; +} + +.jp-Dialog-checkbox { + padding-right: 5px; +} + +.jp-Dialog-checkbox > input:focus-visible { + outline: 1px solid var(--jp-input-active-border-color); + outline-offset: 1px; +} + +.jp-Dialog-spacer { + flex: 1 1 auto; +} + +.jp-Dialog-title { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.jp-Dialog-body > .jp-select-wrapper { + width: 100%; +} + +.jp-Dialog-body > button { + padding: 0 16px; +} + +.jp-Dialog-body > label { + line-height: 1.4; + color: var(--jp-ui-font-color0); +} + +.jp-Dialog-button.jp-mod-styled:not(:last-child) { + margin-right: 12px; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +.jp-Input-Boolean-Dialog { + flex-direction: row-reverse; + align-items: end; + width: 100%; +} + +.jp-Input-Boolean-Dialog > label { + flex: 1 1 auto; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) 2014-2016, Jupyter Development Team. +| +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-MainAreaWidget > :focus { + outline: none; +} + +.jp-MainAreaWidget .jp-MainAreaWidget-error { + padding: 6px; +} + +.jp-MainAreaWidget .jp-MainAreaWidget-error > pre { + width: auto; + padding: 10px; + background: var(--jp-error-color3); + border: var(--jp-border-width) solid var(--jp-error-color1); + border-radius: var(--jp-border-radius); + color: var(--jp-ui-font-color1); + font-size: var(--jp-ui-font-size1); + white-space: pre-wrap; + word-wrap: break-word; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/** + * google-material-color v1.2.6 + * https://github.com/danlevan/google-material-color + */ +:root { + --md-red-50: #ffebee; + --md-red-100: #ffcdd2; + --md-red-200: #ef9a9a; + --md-red-300: #e57373; + --md-red-400: #ef5350; + --md-red-500: #f44336; + --md-red-600: #e53935; + --md-red-700: #d32f2f; + --md-red-800: #c62828; + --md-red-900: #b71c1c; + --md-red-A100: #ff8a80; + --md-red-A200: #ff5252; + --md-red-A400: #ff1744; + --md-red-A700: #d50000; + --md-pink-50: #fce4ec; + --md-pink-100: #f8bbd0; + --md-pink-200: #f48fb1; + --md-pink-300: #f06292; + --md-pink-400: #ec407a; + --md-pink-500: #e91e63; + --md-pink-600: #d81b60; + --md-pink-700: #c2185b; + --md-pink-800: #ad1457; + --md-pink-900: #880e4f; + --md-pink-A100: #ff80ab; + --md-pink-A200: #ff4081; + --md-pink-A400: #f50057; + --md-pink-A700: #c51162; + --md-purple-50: #f3e5f5; + --md-purple-100: #e1bee7; + --md-purple-200: #ce93d8; + --md-purple-300: #ba68c8; + --md-purple-400: #ab47bc; + --md-purple-500: #9c27b0; + --md-purple-600: #8e24aa; + --md-purple-700: #7b1fa2; + --md-purple-800: #6a1b9a; + --md-purple-900: #4a148c; + --md-purple-A100: #ea80fc; + --md-purple-A200: #e040fb; + --md-purple-A400: #d500f9; + --md-purple-A700: #a0f; + --md-deep-purple-50: #ede7f6; + --md-deep-purple-100: #d1c4e9; + --md-deep-purple-200: #b39ddb; + --md-deep-purple-300: #9575cd; + --md-deep-purple-400: #7e57c2; + --md-deep-purple-500: #673ab7; + --md-deep-purple-600: #5e35b1; + --md-deep-purple-700: #512da8; + --md-deep-purple-800: #4527a0; + --md-deep-purple-900: #311b92; + --md-deep-purple-A100: #b388ff; + --md-deep-purple-A200: #7c4dff; + --md-deep-purple-A400: #651fff; + --md-deep-purple-A700: #6200ea; + --md-indigo-50: #e8eaf6; + --md-indigo-100: #c5cae9; + --md-indigo-200: #9fa8da; + --md-indigo-300: #7986cb; + --md-indigo-400: #5c6bc0; + --md-indigo-500: #3f51b5; + --md-indigo-600: #3949ab; + --md-indigo-700: #303f9f; + --md-indigo-800: #283593; + --md-indigo-900: #1a237e; + --md-indigo-A100: #8c9eff; + --md-indigo-A200: #536dfe; + --md-indigo-A400: #3d5afe; + --md-indigo-A700: #304ffe; + --md-blue-50: #e3f2fd; + --md-blue-100: #bbdefb; + --md-blue-200: #90caf9; + --md-blue-300: #64b5f6; + --md-blue-400: #42a5f5; + --md-blue-500: #2196f3; + --md-blue-600: #1e88e5; + --md-blue-700: #1976d2; + --md-blue-800: #1565c0; + --md-blue-900: #0d47a1; + --md-blue-A100: #82b1ff; + --md-blue-A200: #448aff; + --md-blue-A400: #2979ff; + --md-blue-A700: #2962ff; + --md-light-blue-50: #e1f5fe; + --md-light-blue-100: #b3e5fc; + --md-light-blue-200: #81d4fa; + --md-light-blue-300: #4fc3f7; + --md-light-blue-400: #29b6f6; + --md-light-blue-500: #03a9f4; + --md-light-blue-600: #039be5; + --md-light-blue-700: #0288d1; + --md-light-blue-800: #0277bd; + --md-light-blue-900: #01579b; + --md-light-blue-A100: #80d8ff; + --md-light-blue-A200: #40c4ff; + --md-light-blue-A400: #00b0ff; + --md-light-blue-A700: #0091ea; + --md-cyan-50: #e0f7fa; + --md-cyan-100: #b2ebf2; + --md-cyan-200: #80deea; + --md-cyan-300: #4dd0e1; + --md-cyan-400: #26c6da; + --md-cyan-500: #00bcd4; + --md-cyan-600: #00acc1; + --md-cyan-700: #0097a7; + --md-cyan-800: #00838f; + --md-cyan-900: #006064; + --md-cyan-A100: #84ffff; + --md-cyan-A200: #18ffff; + --md-cyan-A400: #00e5ff; + --md-cyan-A700: #00b8d4; + --md-teal-50: #e0f2f1; + --md-teal-100: #b2dfdb; + --md-teal-200: #80cbc4; + --md-teal-300: #4db6ac; + --md-teal-400: #26a69a; + --md-teal-500: #009688; + --md-teal-600: #00897b; + --md-teal-700: #00796b; + --md-teal-800: #00695c; + --md-teal-900: #004d40; + --md-teal-A100: #a7ffeb; + --md-teal-A200: #64ffda; + --md-teal-A400: #1de9b6; + --md-teal-A700: #00bfa5; + --md-green-50: #e8f5e9; + --md-green-100: #c8e6c9; + --md-green-200: #a5d6a7; + --md-green-300: #81c784; + --md-green-400: #66bb6a; + --md-green-500: #4caf50; + --md-green-600: #43a047; + --md-green-700: #388e3c; + --md-green-800: #2e7d32; + --md-green-900: #1b5e20; + --md-green-A100: #b9f6ca; + --md-green-A200: #69f0ae; + --md-green-A400: #00e676; + --md-green-A700: #00c853; + --md-light-green-50: #f1f8e9; + --md-light-green-100: #dcedc8; + --md-light-green-200: #c5e1a5; + --md-light-green-300: #aed581; + --md-light-green-400: #9ccc65; + --md-light-green-500: #8bc34a; + --md-light-green-600: #7cb342; + --md-light-green-700: #689f38; + --md-light-green-800: #558b2f; + --md-light-green-900: #33691e; + --md-light-green-A100: #ccff90; + --md-light-green-A200: #b2ff59; + --md-light-green-A400: #76ff03; + --md-light-green-A700: #64dd17; + --md-lime-50: #f9fbe7; + --md-lime-100: #f0f4c3; + --md-lime-200: #e6ee9c; + --md-lime-300: #dce775; + --md-lime-400: #d4e157; + --md-lime-500: #cddc39; + --md-lime-600: #c0ca33; + --md-lime-700: #afb42b; + --md-lime-800: #9e9d24; + --md-lime-900: #827717; + --md-lime-A100: #f4ff81; + --md-lime-A200: #eeff41; + --md-lime-A400: #c6ff00; + --md-lime-A700: #aeea00; + --md-yellow-50: #fffde7; + --md-yellow-100: #fff9c4; + --md-yellow-200: #fff59d; + --md-yellow-300: #fff176; + --md-yellow-400: #ffee58; + --md-yellow-500: #ffeb3b; + --md-yellow-600: #fdd835; + --md-yellow-700: #fbc02d; + --md-yellow-800: #f9a825; + --md-yellow-900: #f57f17; + --md-yellow-A100: #ffff8d; + --md-yellow-A200: #ff0; + --md-yellow-A400: #ffea00; + --md-yellow-A700: #ffd600; + --md-amber-50: #fff8e1; + --md-amber-100: #ffecb3; + --md-amber-200: #ffe082; + --md-amber-300: #ffd54f; + --md-amber-400: #ffca28; + --md-amber-500: #ffc107; + --md-amber-600: #ffb300; + --md-amber-700: #ffa000; + --md-amber-800: #ff8f00; + --md-amber-900: #ff6f00; + --md-amber-A100: #ffe57f; + --md-amber-A200: #ffd740; + --md-amber-A400: #ffc400; + --md-amber-A700: #ffab00; + --md-orange-50: #fff3e0; + --md-orange-100: #ffe0b2; + --md-orange-200: #ffcc80; + --md-orange-300: #ffb74d; + --md-orange-400: #ffa726; + --md-orange-500: #ff9800; + --md-orange-600: #fb8c00; + --md-orange-700: #f57c00; + --md-orange-800: #ef6c00; + --md-orange-900: #e65100; + --md-orange-A100: #ffd180; + --md-orange-A200: #ffab40; + --md-orange-A400: #ff9100; + --md-orange-A700: #ff6d00; + --md-deep-orange-50: #fbe9e7; + --md-deep-orange-100: #ffccbc; + --md-deep-orange-200: #ffab91; + --md-deep-orange-300: #ff8a65; + --md-deep-orange-400: #ff7043; + --md-deep-orange-500: #ff5722; + --md-deep-orange-600: #f4511e; + --md-deep-orange-700: #e64a19; + --md-deep-orange-800: #d84315; + --md-deep-orange-900: #bf360c; + --md-deep-orange-A100: #ff9e80; + --md-deep-orange-A200: #ff6e40; + --md-deep-orange-A400: #ff3d00; + --md-deep-orange-A700: #dd2c00; + --md-brown-50: #efebe9; + --md-brown-100: #d7ccc8; + --md-brown-200: #bcaaa4; + --md-brown-300: #a1887f; + --md-brown-400: #8d6e63; + --md-brown-500: #795548; + --md-brown-600: #6d4c41; + --md-brown-700: #5d4037; + --md-brown-800: #4e342e; + --md-brown-900: #3e2723; + --md-grey-50: #fafafa; + --md-grey-100: #f5f5f5; + --md-grey-200: #eee; + --md-grey-300: #e0e0e0; + --md-grey-400: #bdbdbd; + --md-grey-500: #9e9e9e; + --md-grey-600: #757575; + --md-grey-700: #616161; + --md-grey-800: #424242; + --md-grey-900: #212121; + --md-blue-grey-50: #eceff1; + --md-blue-grey-100: #cfd8dc; + --md-blue-grey-200: #b0bec5; + --md-blue-grey-300: #90a4ae; + --md-blue-grey-400: #78909c; + --md-blue-grey-500: #607d8b; + --md-blue-grey-600: #546e7a; + --md-blue-grey-700: #455a64; + --md-blue-grey-800: #37474f; + --md-blue-grey-900: #263238; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) 2014-2017, Jupyter Development Team. +| +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| RenderedText +|----------------------------------------------------------------------------*/ + +:root { + /* This is the padding value to fill the gaps between lines containing spans with background color. */ + --jp-private-code-span-padding: calc( + (var(--jp-code-line-height) - 1) * var(--jp-code-font-size) / 2 + ); +} + +.jp-RenderedText { + text-align: left; + padding-left: var(--jp-code-padding); + line-height: var(--jp-code-line-height); + font-family: var(--jp-code-font-family); +} + +.jp-RenderedText pre, +.jp-RenderedJavaScript pre, +.jp-RenderedHTMLCommon pre { + color: var(--jp-content-font-color1); + font-size: var(--jp-code-font-size); + border: none; + margin: 0; + padding: 0; +} + +.jp-RenderedText pre a:link { + text-decoration: none; + color: var(--jp-content-link-color); +} + +.jp-RenderedText pre a:hover { + text-decoration: underline; + color: var(--jp-content-link-color); +} + +.jp-RenderedText pre a:visited { + text-decoration: none; + color: var(--jp-content-link-color); +} + +/* console foregrounds and backgrounds */ +.jp-RenderedText pre .ansi-black-fg { + color: #3e424d; +} + +.jp-RenderedText pre .ansi-red-fg { + color: #e75c58; +} + +.jp-RenderedText pre .ansi-green-fg { + color: #00a250; +} + +.jp-RenderedText pre .ansi-yellow-fg { + color: #ddb62b; +} + +.jp-RenderedText pre .ansi-blue-fg { + color: #208ffb; +} + +.jp-RenderedText pre .ansi-magenta-fg { + color: #d160c4; +} + +.jp-RenderedText pre .ansi-cyan-fg { + color: #60c6c8; +} + +.jp-RenderedText pre .ansi-white-fg { + color: #c5c1b4; +} + +.jp-RenderedText pre .ansi-black-bg { + background-color: #3e424d; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-red-bg { + background-color: #e75c58; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-green-bg { + background-color: #00a250; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-yellow-bg { + background-color: #ddb62b; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-blue-bg { + background-color: #208ffb; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-magenta-bg { + background-color: #d160c4; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-cyan-bg { + background-color: #60c6c8; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-white-bg { + background-color: #c5c1b4; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-black-intense-fg { + color: #282c36; +} + +.jp-RenderedText pre .ansi-red-intense-fg { + color: #b22b31; +} + +.jp-RenderedText pre .ansi-green-intense-fg { + color: #007427; +} + +.jp-RenderedText pre .ansi-yellow-intense-fg { + color: #b27d12; +} + +.jp-RenderedText pre .ansi-blue-intense-fg { + color: #0065ca; +} + +.jp-RenderedText pre .ansi-magenta-intense-fg { + color: #a03196; +} + +.jp-RenderedText pre .ansi-cyan-intense-fg { + color: #258f8f; +} + +.jp-RenderedText pre .ansi-white-intense-fg { + color: #a1a6b2; +} + +.jp-RenderedText pre .ansi-black-intense-bg { + background-color: #282c36; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-red-intense-bg { + background-color: #b22b31; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-green-intense-bg { + background-color: #007427; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-yellow-intense-bg { + background-color: #b27d12; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-blue-intense-bg { + background-color: #0065ca; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-magenta-intense-bg { + background-color: #a03196; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-cyan-intense-bg { + background-color: #258f8f; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-white-intense-bg { + background-color: #a1a6b2; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-default-inverse-fg { + color: var(--jp-ui-inverse-font-color0); +} + +.jp-RenderedText pre .ansi-default-inverse-bg { + background-color: var(--jp-inverse-layout-color0); + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-bold { + font-weight: bold; +} + +.jp-RenderedText pre .ansi-underline { + text-decoration: underline; +} + +.jp-RenderedText[data-mime-type='application/vnd.jupyter.stderr'] { + background: var(--jp-rendermime-error-background); + padding-top: var(--jp-code-padding); +} + +/*----------------------------------------------------------------------------- +| RenderedLatex +|----------------------------------------------------------------------------*/ + +.jp-RenderedLatex { + color: var(--jp-content-font-color1); + font-size: var(--jp-content-font-size1); + line-height: var(--jp-content-line-height); +} + +/* Left-justify outputs.*/ +.jp-OutputArea-output.jp-RenderedLatex { + padding: var(--jp-code-padding); + text-align: left; +} + +/*----------------------------------------------------------------------------- +| RenderedHTML +|----------------------------------------------------------------------------*/ + +.jp-RenderedHTMLCommon { + color: var(--jp-content-font-color1); + font-family: var(--jp-content-font-family); + font-size: var(--jp-content-font-size1); + line-height: var(--jp-content-line-height); + + /* Give a bit more R padding on Markdown text to keep line lengths reasonable */ + padding-right: 20px; +} + +.jp-RenderedHTMLCommon em { + font-style: italic; +} + +.jp-RenderedHTMLCommon strong { + font-weight: bold; +} + +.jp-RenderedHTMLCommon u { + text-decoration: underline; +} + +.jp-RenderedHTMLCommon a:link { + text-decoration: none; + color: var(--jp-content-link-color); +} + +.jp-RenderedHTMLCommon a:hover { + text-decoration: underline; + color: var(--jp-content-link-color); +} + +.jp-RenderedHTMLCommon a:visited { + text-decoration: none; + color: var(--jp-content-link-color); +} + +/* Headings */ + +.jp-RenderedHTMLCommon h1, +.jp-RenderedHTMLCommon h2, +.jp-RenderedHTMLCommon h3, +.jp-RenderedHTMLCommon h4, +.jp-RenderedHTMLCommon h5, +.jp-RenderedHTMLCommon h6 { + line-height: var(--jp-content-heading-line-height); + font-weight: var(--jp-content-heading-font-weight); + font-style: normal; + margin: var(--jp-content-heading-margin-top) 0 + var(--jp-content-heading-margin-bottom) 0; +} + +.jp-RenderedHTMLCommon h1:first-child, +.jp-RenderedHTMLCommon h2:first-child, +.jp-RenderedHTMLCommon h3:first-child, +.jp-RenderedHTMLCommon h4:first-child, +.jp-RenderedHTMLCommon h5:first-child, +.jp-RenderedHTMLCommon h6:first-child { + margin-top: calc(0.5 * var(--jp-content-heading-margin-top)); +} + +.jp-RenderedHTMLCommon h1:last-child, +.jp-RenderedHTMLCommon h2:last-child, +.jp-RenderedHTMLCommon h3:last-child, +.jp-RenderedHTMLCommon h4:last-child, +.jp-RenderedHTMLCommon h5:last-child, +.jp-RenderedHTMLCommon h6:last-child { + margin-bottom: calc(0.5 * var(--jp-content-heading-margin-bottom)); +} + +.jp-RenderedHTMLCommon h1 { + font-size: var(--jp-content-font-size5); +} + +.jp-RenderedHTMLCommon h2 { + font-size: var(--jp-content-font-size4); +} + +.jp-RenderedHTMLCommon h3 { + font-size: var(--jp-content-font-size3); +} + +.jp-RenderedHTMLCommon h4 { + font-size: var(--jp-content-font-size2); +} + +.jp-RenderedHTMLCommon h5 { + font-size: var(--jp-content-font-size1); +} + +.jp-RenderedHTMLCommon h6 { + font-size: var(--jp-content-font-size0); +} + +/* Lists */ + +/* stylelint-disable selector-max-type, selector-max-compound-selectors */ + +.jp-RenderedHTMLCommon ul:not(.list-inline), +.jp-RenderedHTMLCommon ol:not(.list-inline) { + padding-left: 2em; +} + +.jp-RenderedHTMLCommon ul { + list-style: disc; +} + +.jp-RenderedHTMLCommon ul ul { + list-style: square; +} + +.jp-RenderedHTMLCommon ul ul ul { + list-style: circle; +} + +.jp-RenderedHTMLCommon ol { + list-style: decimal; +} + +.jp-RenderedHTMLCommon ol ol { + list-style: upper-alpha; +} + +.jp-RenderedHTMLCommon ol ol ol { + list-style: lower-alpha; +} + +.jp-RenderedHTMLCommon ol ol ol ol { + list-style: lower-roman; +} + +.jp-RenderedHTMLCommon ol ol ol ol ol { + list-style: decimal; +} + +.jp-RenderedHTMLCommon ol, +.jp-RenderedHTMLCommon ul { + margin-bottom: 1em; +} + +.jp-RenderedHTMLCommon ul ul, +.jp-RenderedHTMLCommon ul ol, +.jp-RenderedHTMLCommon ol ul, +.jp-RenderedHTMLCommon ol ol { + margin-bottom: 0; +} + +/* stylelint-enable selector-max-type, selector-max-compound-selectors */ + +.jp-RenderedHTMLCommon hr { + color: var(--jp-border-color2); + background-color: var(--jp-border-color1); + margin-top: 1em; + margin-bottom: 1em; +} + +.jp-RenderedHTMLCommon > pre { + margin: 1.5em 2em; +} + +.jp-RenderedHTMLCommon pre, +.jp-RenderedHTMLCommon code { + border: 0; + background-color: var(--jp-layout-color0); + color: var(--jp-content-font-color1); + font-family: var(--jp-code-font-family); + font-size: inherit; + line-height: var(--jp-code-line-height); + padding: 0; + white-space: pre-wrap; +} + +.jp-RenderedHTMLCommon :not(pre) > code { + background-color: var(--jp-layout-color2); + padding: 1px 5px; +} + +/* Tables */ + +.jp-RenderedHTMLCommon table { + border-collapse: collapse; + border-spacing: 0; + border: none; + color: var(--jp-ui-font-color1); + font-size: var(--jp-ui-font-size1); + table-layout: fixed; + margin-left: auto; + margin-bottom: 1em; + margin-right: auto; +} + +.jp-RenderedHTMLCommon thead { + border-bottom: var(--jp-border-width) solid var(--jp-border-color1); + vertical-align: bottom; +} + +.jp-RenderedHTMLCommon td, +.jp-RenderedHTMLCommon th, +.jp-RenderedHTMLCommon tr { + vertical-align: middle; + padding: 0.5em; + line-height: normal; + white-space: normal; + max-width: none; + border: none; +} + +.jp-RenderedMarkdown.jp-RenderedHTMLCommon td, +.jp-RenderedMarkdown.jp-RenderedHTMLCommon th { + max-width: none; +} + +:not(.jp-RenderedMarkdown).jp-RenderedHTMLCommon td, +:not(.jp-RenderedMarkdown).jp-RenderedHTMLCommon th, +:not(.jp-RenderedMarkdown).jp-RenderedHTMLCommon tr { + text-align: right; +} + +.jp-RenderedHTMLCommon th { + font-weight: bold; +} + +.jp-RenderedHTMLCommon tbody tr:nth-child(odd) { + background: var(--jp-layout-color0); +} + +.jp-RenderedHTMLCommon tbody tr:nth-child(even) { + background: var(--jp-rendermime-table-row-background); +} + +.jp-RenderedHTMLCommon tbody tr:hover { + background: var(--jp-rendermime-table-row-hover-background); +} + +.jp-RenderedHTMLCommon p { + text-align: left; + margin: 0; + margin-bottom: 1em; +} + +.jp-RenderedHTMLCommon img { + -moz-force-broken-image-icon: 1; +} + +/* Restrict to direct children as other images could be nested in other content. */ +.jp-RenderedHTMLCommon > img { + display: block; + margin-left: 0; + margin-right: 0; + margin-bottom: 1em; +} + +/* Change color behind transparent images if they need it... */ +[data-jp-theme-light='false'] .jp-RenderedImage img.jp-needs-light-background { + background-color: var(--jp-inverse-layout-color1); +} + +[data-jp-theme-light='true'] .jp-RenderedImage img.jp-needs-dark-background { + background-color: var(--jp-inverse-layout-color1); +} + +.jp-RenderedHTMLCommon img, +.jp-RenderedImage img, +.jp-RenderedHTMLCommon svg, +.jp-RenderedSVG svg { + max-width: 100%; + height: auto; +} + +.jp-RenderedHTMLCommon img.jp-mod-unconfined, +.jp-RenderedImage img.jp-mod-unconfined, +.jp-RenderedHTMLCommon svg.jp-mod-unconfined, +.jp-RenderedSVG svg.jp-mod-unconfined { + max-width: none; +} + +.jp-RenderedHTMLCommon .alert { + padding: var(--jp-notebook-padding); + border: var(--jp-border-width) solid transparent; + border-radius: var(--jp-border-radius); + margin-bottom: 1em; +} + +.jp-RenderedHTMLCommon .alert-info { + color: var(--jp-info-color0); + background-color: var(--jp-info-color3); + border-color: var(--jp-info-color2); +} + +.jp-RenderedHTMLCommon .alert-info hr { + border-color: var(--jp-info-color3); +} + +.jp-RenderedHTMLCommon .alert-info > p:last-child, +.jp-RenderedHTMLCommon .alert-info > ul:last-child { + margin-bottom: 0; +} + +.jp-RenderedHTMLCommon .alert-warning { + color: var(--jp-warn-color0); + background-color: var(--jp-warn-color3); + border-color: var(--jp-warn-color2); +} + +.jp-RenderedHTMLCommon .alert-warning hr { + border-color: var(--jp-warn-color3); +} + +.jp-RenderedHTMLCommon .alert-warning > p:last-child, +.jp-RenderedHTMLCommon .alert-warning > ul:last-child { + margin-bottom: 0; +} + +.jp-RenderedHTMLCommon .alert-success { + color: var(--jp-success-color0); + background-color: var(--jp-success-color3); + border-color: var(--jp-success-color2); +} + +.jp-RenderedHTMLCommon .alert-success hr { + border-color: var(--jp-success-color3); +} + +.jp-RenderedHTMLCommon .alert-success > p:last-child, +.jp-RenderedHTMLCommon .alert-success > ul:last-child { + margin-bottom: 0; +} + +.jp-RenderedHTMLCommon .alert-danger { + color: var(--jp-error-color0); + background-color: var(--jp-error-color3); + border-color: var(--jp-error-color2); +} + +.jp-RenderedHTMLCommon .alert-danger hr { + border-color: var(--jp-error-color3); +} + +.jp-RenderedHTMLCommon .alert-danger > p:last-child, +.jp-RenderedHTMLCommon .alert-danger > ul:last-child { + margin-bottom: 0; +} + +.jp-RenderedHTMLCommon blockquote { + margin: 1em 2em; + padding: 0 1em; + border-left: 5px solid var(--jp-border-color2); +} + +a.jp-InternalAnchorLink { + visibility: hidden; + margin-left: 8px; + color: var(--md-blue-800); +} + +h1:hover .jp-InternalAnchorLink, +h2:hover .jp-InternalAnchorLink, +h3:hover .jp-InternalAnchorLink, +h4:hover .jp-InternalAnchorLink, +h5:hover .jp-InternalAnchorLink, +h6:hover .jp-InternalAnchorLink { + visibility: visible; +} + +.jp-RenderedHTMLCommon kbd { + background-color: var(--jp-rendermime-table-row-background); + border: 1px solid var(--jp-border-color0); + border-bottom-color: var(--jp-border-color2); + border-radius: 3px; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); + display: inline-block; + font-size: var(--jp-ui-font-size0); + line-height: 1em; + padding: 0.2em 0.5em; +} + +/* Most direct children of .jp-RenderedHTMLCommon have a margin-bottom of 1.0. + * At the bottom of cells this is a bit too much as there is also spacing + * between cells. Going all the way to 0 gets too tight between markdown and + * code cells. + */ +.jp-RenderedHTMLCommon > *:last-child { + margin-bottom: 0.5em; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-cursor-backdrop { + position: fixed; + width: 200px; + height: 200px; + margin-top: -100px; + margin-left: -100px; + will-change: transform; + z-index: 100; +} + +.lm-mod-drag-image { + will-change: transform; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +.jp-lineFormSearch { + padding: 4px 12px; + background-color: var(--jp-layout-color2); + box-shadow: var(--jp-toolbar-box-shadow); + z-index: 2; + font-size: var(--jp-ui-font-size1); +} + +.jp-lineFormCaption { + font-size: var(--jp-ui-font-size0); + line-height: var(--jp-ui-font-size1); + margin-top: 4px; + color: var(--jp-ui-font-color0); +} + +.jp-baseLineForm { + border: none; + border-radius: 0; + position: absolute; + background-size: 16px; + background-repeat: no-repeat; + background-position: center; + outline: none; +} + +.jp-lineFormButtonContainer { + top: 4px; + right: 8px; + height: 24px; + padding: 0 12px; + width: 12px; +} + +.jp-lineFormButtonIcon { + top: 0; + right: 0; + background-color: var(--jp-brand-color1); + height: 100%; + width: 100%; + box-sizing: border-box; + padding: 4px 6px; +} + +.jp-lineFormButton { + top: 0; + right: 0; + background-color: transparent; + height: 100%; + width: 100%; + box-sizing: border-box; +} + +.jp-lineFormWrapper { + overflow: hidden; + padding: 0 8px; + border: 1px solid var(--jp-border-color0); + background-color: var(--jp-input-active-background); + height: 22px; +} + +.jp-lineFormWrapperFocusWithin { + border: var(--jp-border-width) solid var(--md-blue-500); + box-shadow: inset 0 0 4px var(--md-blue-300); +} + +.jp-lineFormInput { + background: transparent; + width: 200px; + height: 100%; + border: none; + outline: none; + color: var(--jp-ui-font-color0); + line-height: 28px; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) 2014-2016, Jupyter Development Team. +| +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-JSONEditor { + display: flex; + flex-direction: column; + width: 100%; +} + +.jp-JSONEditor-host { + flex: 1 1 auto; + border: var(--jp-border-width) solid var(--jp-input-border-color); + border-radius: 0; + background: var(--jp-layout-color0); + min-height: 50px; + padding: 1px; +} + +.jp-JSONEditor.jp-mod-error .jp-JSONEditor-host { + border-color: red; + outline-color: red; +} + +.jp-JSONEditor-header { + display: flex; + flex: 1 0 auto; + padding: 0 0 0 12px; +} + +.jp-JSONEditor-header label { + flex: 0 0 auto; +} + +.jp-JSONEditor-commitButton { + height: 16px; + width: 16px; + background-size: 18px; + background-repeat: no-repeat; + background-position: center; +} + +.jp-JSONEditor-host.jp-mod-focused { + background-color: var(--jp-input-active-background); + border: 1px solid var(--jp-input-active-border-color); + box-shadow: var(--jp-input-box-shadow); +} + +.jp-Editor.jp-mod-dropTarget { + border: var(--jp-border-width) solid var(--jp-input-active-border-color); + box-shadow: var(--jp-input-box-shadow); +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ +.jp-DocumentSearch-input { + border: none; + outline: none; + color: var(--jp-ui-font-color0); + font-size: var(--jp-ui-font-size1); + background-color: var(--jp-layout-color0); + font-family: var(--jp-ui-font-family); + padding: 2px 1px; + resize: none; +} + +.jp-DocumentSearch-overlay { + position: absolute; + background-color: var(--jp-toolbar-background); + border-bottom: var(--jp-border-width) solid var(--jp-toolbar-border-color); + border-left: var(--jp-border-width) solid var(--jp-toolbar-border-color); + top: 0; + right: 0; + z-index: 7; + min-width: 405px; + padding: 2px; + font-size: var(--jp-ui-font-size1); + + --jp-private-document-search-button-height: 20px; +} + +.jp-DocumentSearch-overlay button { + background-color: var(--jp-toolbar-background); + outline: 0; +} + +.jp-DocumentSearch-overlay button:hover { + background-color: var(--jp-layout-color2); +} + +.jp-DocumentSearch-overlay button:active { + background-color: var(--jp-layout-color3); +} + +.jp-DocumentSearch-overlay-row { + display: flex; + align-items: center; + margin-bottom: 2px; +} + +.jp-DocumentSearch-button-content { + display: inline-block; + cursor: pointer; + box-sizing: border-box; + width: 100%; + height: 100%; +} + +.jp-DocumentSearch-button-content svg { + width: 100%; + height: 100%; +} + +.jp-DocumentSearch-input-wrapper { + border: var(--jp-border-width) solid var(--jp-border-color0); + display: flex; + background-color: var(--jp-layout-color0); + margin: 2px; +} + +.jp-DocumentSearch-input-wrapper:focus-within { + border-color: var(--jp-cell-editor-active-border-color); +} + +.jp-DocumentSearch-toggle-wrapper, +.jp-DocumentSearch-button-wrapper { + all: initial; + overflow: hidden; + display: inline-block; + border: none; + box-sizing: border-box; +} + +.jp-DocumentSearch-toggle-wrapper { + width: 14px; + height: 14px; +} + +.jp-DocumentSearch-button-wrapper { + width: var(--jp-private-document-search-button-height); + height: var(--jp-private-document-search-button-height); +} + +.jp-DocumentSearch-toggle-wrapper:focus, +.jp-DocumentSearch-button-wrapper:focus { + outline: var(--jp-border-width) solid + var(--jp-cell-editor-active-border-color); + outline-offset: -1px; +} + +.jp-DocumentSearch-toggle-wrapper, +.jp-DocumentSearch-button-wrapper, +.jp-DocumentSearch-button-content:focus { + outline: none; +} + +.jp-DocumentSearch-toggle-placeholder { + width: 5px; +} + +.jp-DocumentSearch-input-button::before { + display: block; + padding-top: 100%; +} + +.jp-DocumentSearch-input-button-off { + opacity: var(--jp-search-toggle-off-opacity); +} + +.jp-DocumentSearch-input-button-off:hover { + opacity: var(--jp-search-toggle-hover-opacity); +} + +.jp-DocumentSearch-input-button-on { + opacity: var(--jp-search-toggle-on-opacity); +} + +.jp-DocumentSearch-index-counter { + padding-left: 10px; + padding-right: 10px; + user-select: none; + min-width: 35px; + display: inline-block; +} + +.jp-DocumentSearch-up-down-wrapper { + display: inline-block; + padding-right: 2px; + margin-left: auto; + white-space: nowrap; +} + +.jp-DocumentSearch-spacer { + margin-left: auto; +} + +.jp-DocumentSearch-up-down-wrapper button { + outline: 0; + border: none; + width: var(--jp-private-document-search-button-height); + height: var(--jp-private-document-search-button-height); + vertical-align: middle; + margin: 1px 5px 2px; +} + +.jp-DocumentSearch-up-down-button:hover { + background-color: var(--jp-layout-color2); +} + +.jp-DocumentSearch-up-down-button:active { + background-color: var(--jp-layout-color3); +} + +.jp-DocumentSearch-filter-button { + border-radius: var(--jp-border-radius); +} + +.jp-DocumentSearch-filter-button:hover { + background-color: var(--jp-layout-color2); +} + +.jp-DocumentSearch-filter-button-enabled { + background-color: var(--jp-layout-color2); +} + +.jp-DocumentSearch-filter-button-enabled:hover { + background-color: var(--jp-layout-color3); +} + +.jp-DocumentSearch-search-options { + padding: 0 8px; + margin-left: 3px; + width: 100%; + display: grid; + justify-content: start; + grid-template-columns: 1fr 1fr; + align-items: center; + justify-items: stretch; +} + +.jp-DocumentSearch-search-filter-disabled { + color: var(--jp-ui-font-color2); +} + +.jp-DocumentSearch-search-filter { + display: flex; + align-items: center; + user-select: none; +} + +.jp-DocumentSearch-regex-error { + color: var(--jp-error-color0); +} + +.jp-DocumentSearch-replace-button-wrapper { + overflow: hidden; + display: inline-block; + box-sizing: border-box; + border: var(--jp-border-width) solid var(--jp-border-color0); + margin: auto 2px; + padding: 1px 4px; + height: calc(var(--jp-private-document-search-button-height) + 2px); +} + +.jp-DocumentSearch-replace-button-wrapper:focus { + border: var(--jp-border-width) solid var(--jp-cell-editor-active-border-color); +} + +.jp-DocumentSearch-replace-button { + display: inline-block; + text-align: center; + cursor: pointer; + box-sizing: border-box; + color: var(--jp-ui-font-color1); + + /* height - 2 * (padding of wrapper) */ + line-height: calc(var(--jp-private-document-search-button-height) - 2px); + width: 100%; + height: 100%; +} + +.jp-DocumentSearch-replace-button:focus { + outline: none; +} + +.jp-DocumentSearch-replace-wrapper-class { + margin-left: 14px; + display: flex; +} + +.jp-DocumentSearch-replace-toggle { + border: none; + background-color: var(--jp-toolbar-background); + border-radius: var(--jp-border-radius); +} + +.jp-DocumentSearch-replace-toggle:hover { + background-color: var(--jp-layout-color2); +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.cm-editor { + line-height: var(--jp-code-line-height); + font-size: var(--jp-code-font-size); + font-family: var(--jp-code-font-family); + border: 0; + border-radius: 0; + height: auto; + + /* Changed to auto to autogrow */ +} + +.cm-editor pre { + padding: 0 var(--jp-code-padding); +} + +.jp-CodeMirrorEditor[data-type='inline'] .cm-dialog { + background-color: var(--jp-layout-color0); + color: var(--jp-content-font-color1); +} + +.jp-CodeMirrorEditor { + cursor: text; +} + +/* When zoomed out 67% and 33% on a screen of 1440 width x 900 height */ +@media screen and (min-width: 2138px) and (max-width: 4319px) { + .jp-CodeMirrorEditor[data-type='inline'] .cm-cursor { + border-left: var(--jp-code-cursor-width1) solid + var(--jp-editor-cursor-color); + } +} + +/* When zoomed out less than 33% */ +@media screen and (min-width: 4320px) { + .jp-CodeMirrorEditor[data-type='inline'] .cm-cursor { + border-left: var(--jp-code-cursor-width2) solid + var(--jp-editor-cursor-color); + } +} + +.cm-editor.jp-mod-readOnly .cm-cursor { + display: none; +} + +.jp-CollaboratorCursor { + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-top: none; + border-bottom: 3px solid; + background-clip: content-box; + margin-left: -5px; + margin-right: -5px; +} + +.cm-searching, +.cm-searching span { + /* `.cm-searching span`: we need to override syntax highlighting */ + background-color: var(--jp-search-unselected-match-background-color); + color: var(--jp-search-unselected-match-color); +} + +.cm-searching::selection, +.cm-searching span::selection { + background-color: var(--jp-search-unselected-match-background-color); + color: var(--jp-search-unselected-match-color); +} + +.jp-current-match > .cm-searching, +.jp-current-match > .cm-searching span, +.cm-searching > .jp-current-match, +.cm-searching > .jp-current-match span { + background-color: var(--jp-search-selected-match-background-color); + color: var(--jp-search-selected-match-color); +} + +.jp-current-match > .cm-searching::selection, +.cm-searching > .jp-current-match::selection, +.jp-current-match > .cm-searching span::selection { + background-color: var(--jp-search-selected-match-background-color); + color: var(--jp-search-selected-match-color); +} + +.cm-trailingspace { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAsElEQVQIHQGlAFr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7+r3zKmT0/+pk9P/7+r3zAAAAAAAAAAABAAAAAAAAAAA6OPzM+/q9wAAAAAA6OPzMwAAAAAAAAAAAgAAAAAAAAAAGR8NiRQaCgAZIA0AGR8NiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQyoYJ/SY80UAAAAASUVORK5CYII=); + background-position: center left; + background-repeat: repeat-x; +} + +.jp-CollaboratorCursor-hover { + position: absolute; + z-index: 1; + transform: translateX(-50%); + color: white; + border-radius: 3px; + padding-left: 4px; + padding-right: 4px; + padding-top: 1px; + padding-bottom: 1px; + text-align: center; + font-size: var(--jp-ui-font-size1); + white-space: nowrap; +} + +.jp-CodeMirror-ruler { + border-left: 1px dashed var(--jp-border-color2); +} + +/* Styles for shared cursors (remote cursor locations and selected ranges) */ +.jp-CodeMirrorEditor .cm-ySelectionCaret { + position: relative; + border-left: 1px solid black; + margin-left: -1px; + margin-right: -1px; + box-sizing: border-box; +} + +.jp-CodeMirrorEditor .cm-ySelectionCaret > .cm-ySelectionInfo { + white-space: nowrap; + position: absolute; + top: -1.15em; + padding-bottom: 0.05em; + left: -1px; + font-size: 0.95em; + font-family: var(--jp-ui-font-family); + font-weight: bold; + line-height: normal; + user-select: none; + color: white; + padding-left: 2px; + padding-right: 2px; + z-index: 101; + transition: opacity 0.3s ease-in-out; +} + +.jp-CodeMirrorEditor .cm-ySelectionInfo { + transition-delay: 0.7s; + opacity: 0; +} + +.jp-CodeMirrorEditor .cm-ySelectionCaret:hover > .cm-ySelectionInfo { + opacity: 1; + transition-delay: 0s; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-MimeDocument { + outline: none; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Variables +|----------------------------------------------------------------------------*/ + +:root { + --jp-private-filebrowser-button-height: 28px; + --jp-private-filebrowser-button-width: 48px; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-FileBrowser .jp-SidePanel-content { + display: flex; + flex-direction: column; +} + +.jp-FileBrowser-toolbar.jp-Toolbar { + flex-wrap: wrap; + row-gap: 12px; + border-bottom: none; + height: auto; + margin: 8px 12px 0; + box-shadow: none; + padding: 0; + justify-content: flex-start; +} + +.jp-FileBrowser-Panel { + flex: 1 1 auto; + display: flex; + flex-direction: column; +} + +.jp-BreadCrumbs { + flex: 0 0 auto; + margin: 8px 12px; +} + +.jp-BreadCrumbs-item { + margin: 0 2px; + padding: 0 2px; + border-radius: var(--jp-border-radius); + cursor: pointer; +} + +.jp-BreadCrumbs-item:hover { + background-color: var(--jp-layout-color2); +} + +.jp-BreadCrumbs-item:first-child { + margin-left: 0; +} + +.jp-BreadCrumbs-item.jp-mod-dropTarget { + background-color: var(--jp-brand-color2); + opacity: 0.7; +} + +/*----------------------------------------------------------------------------- +| Buttons +|----------------------------------------------------------------------------*/ + +.jp-FileBrowser-toolbar > .jp-Toolbar-item { + flex: 0 0 auto; + padding-left: 0; + padding-right: 2px; + align-items: center; + height: unset; +} + +.jp-FileBrowser-toolbar > .jp-Toolbar-item .jp-ToolbarButtonComponent { + width: 40px; +} + +/*----------------------------------------------------------------------------- +| Other styles +|----------------------------------------------------------------------------*/ + +.jp-FileDialog.jp-mod-conflict input { + color: var(--jp-error-color1); +} + +.jp-FileDialog .jp-new-name-title { + margin-top: 12px; +} + +.jp-LastModified-hidden { + display: none; +} + +.jp-FileSize-hidden { + display: none; +} + +.jp-FileBrowser .lm-AccordionPanel > h3:first-child { + display: none; +} + +/*----------------------------------------------------------------------------- +| DirListing +|----------------------------------------------------------------------------*/ + +.jp-DirListing { + flex: 1 1 auto; + display: flex; + flex-direction: column; + outline: 0; +} + +.jp-DirListing-header { + flex: 0 0 auto; + display: flex; + flex-direction: row; + align-items: center; + overflow: hidden; + border-top: var(--jp-border-width) solid var(--jp-border-color2); + border-bottom: var(--jp-border-width) solid var(--jp-border-color1); + box-shadow: var(--jp-toolbar-box-shadow); + z-index: 2; +} + +.jp-DirListing-headerItem { + padding: 4px 12px 2px; + font-weight: 500; +} + +.jp-DirListing-headerItem:hover { + background: var(--jp-layout-color2); +} + +.jp-DirListing-headerItem.jp-id-name { + flex: 1 0 84px; +} + +.jp-DirListing-headerItem.jp-id-modified { + flex: 0 0 112px; + border-left: var(--jp-border-width) solid var(--jp-border-color2); + text-align: right; +} + +.jp-DirListing-headerItem.jp-id-filesize { + flex: 0 0 75px; + border-left: var(--jp-border-width) solid var(--jp-border-color2); + text-align: right; +} + +.jp-id-narrow { + display: none; + flex: 0 0 5px; + padding: 4px; + border-left: var(--jp-border-width) solid var(--jp-border-color2); + text-align: right; + color: var(--jp-border-color2); +} + +.jp-DirListing-narrow .jp-id-narrow { + display: block; +} + +.jp-DirListing-narrow .jp-id-modified, +.jp-DirListing-narrow .jp-DirListing-itemModified { + display: none; +} + +.jp-DirListing-headerItem.jp-mod-selected { + font-weight: 600; +} + +/* increase specificity to override bundled default */ +.jp-DirListing-content { + flex: 1 1 auto; + margin: 0; + padding: 0; + list-style-type: none; + overflow: auto; + background-color: var(--jp-layout-color1); +} + +.jp-DirListing-content mark { + color: var(--jp-ui-font-color0); + background-color: transparent; + font-weight: bold; +} + +.jp-DirListing-content .jp-DirListing-item.jp-mod-selected mark { + color: var(--jp-ui-inverse-font-color0); +} + +/* Style the directory listing content when a user drops a file to upload */ +.jp-DirListing.jp-mod-native-drop .jp-DirListing-content { + outline: 5px dashed rgba(128, 128, 128, 0.5); + outline-offset: -10px; + cursor: copy; +} + +.jp-DirListing-item { + display: flex; + flex-direction: row; + align-items: center; + padding: 4px 12px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.jp-DirListing-checkboxWrapper { + /* Increases hit area of checkbox. */ + padding: 4px; +} + +.jp-DirListing-header + .jp-DirListing-checkboxWrapper + + .jp-DirListing-headerItem { + padding-left: 4px; +} + +.jp-DirListing-content .jp-DirListing-checkboxWrapper { + position: relative; + left: -4px; + margin: -4px 0 -4px -8px; +} + +.jp-DirListing-checkboxWrapper.jp-mod-visible { + visibility: visible; +} + +/* For devices that support hovering, hide checkboxes until hovered, selected... +*/ +@media (hover: hover) { + .jp-DirListing-checkboxWrapper { + visibility: hidden; + } + + .jp-DirListing-item:hover .jp-DirListing-checkboxWrapper, + .jp-DirListing-item.jp-mod-selected .jp-DirListing-checkboxWrapper { + visibility: visible; + } +} + +.jp-DirListing-item[data-is-dot] { + opacity: 75%; +} + +.jp-DirListing-item.jp-mod-selected { + color: var(--jp-ui-inverse-font-color1); + background: var(--jp-brand-color1); +} + +.jp-DirListing-item.jp-mod-dropTarget { + background: var(--jp-brand-color3); +} + +.jp-DirListing-item:hover:not(.jp-mod-selected) { + background: var(--jp-layout-color2); +} + +.jp-DirListing-itemIcon { + flex: 0 0 20px; + margin-right: 4px; +} + +.jp-DirListing-itemText { + flex: 1 0 64px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + user-select: none; +} + +.jp-DirListing-itemText:focus { + outline-width: 2px; + outline-color: var(--jp-inverse-layout-color1); + outline-style: solid; + outline-offset: 1px; +} + +.jp-DirListing-item.jp-mod-selected .jp-DirListing-itemText:focus { + outline-color: var(--jp-layout-color1); +} + +.jp-DirListing-itemModified { + flex: 0 0 125px; + text-align: right; +} + +.jp-DirListing-itemFileSize { + flex: 0 0 90px; + text-align: right; +} + +.jp-DirListing-editor { + flex: 1 0 64px; + outline: none; + border: none; + color: var(--jp-ui-font-color1); + background-color: var(--jp-layout-color1); +} + +.jp-DirListing-item.jp-mod-running .jp-DirListing-itemIcon::before { + color: var(--jp-success-color1); + content: '\25CF'; + font-size: 8px; + position: absolute; + left: -8px; +} + +.jp-DirListing-item.jp-mod-running.jp-mod-selected + .jp-DirListing-itemIcon::before { + color: var(--jp-ui-inverse-font-color1); +} + +.jp-DirListing-item.lm-mod-drag-image, +.jp-DirListing-item.jp-mod-selected.lm-mod-drag-image { + font-size: var(--jp-ui-font-size1); + padding-left: 4px; + margin-left: 4px; + width: 160px; + background-color: var(--jp-ui-inverse-font-color2); + box-shadow: var(--jp-elevation-z2); + border-radius: 0; + color: var(--jp-ui-font-color1); + transform: translateX(-40%) translateY(-58%); +} + +.jp-Document { + min-width: 120px; + min-height: 120px; + outline: none; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Main OutputArea +| OutputArea has a list of Outputs +|----------------------------------------------------------------------------*/ + +.jp-OutputArea { + overflow-y: auto; +} + +.jp-OutputArea-child { + display: table; + table-layout: fixed; + width: 100%; + overflow: hidden; +} + +.jp-OutputPrompt { + width: var(--jp-cell-prompt-width); + color: var(--jp-cell-outprompt-font-color); + font-family: var(--jp-cell-prompt-font-family); + padding: var(--jp-code-padding); + letter-spacing: var(--jp-cell-prompt-letter-spacing); + line-height: var(--jp-code-line-height); + font-size: var(--jp-code-font-size); + border: var(--jp-border-width) solid transparent; + opacity: var(--jp-cell-prompt-opacity); + + /* Right align prompt text, don't wrap to handle large prompt numbers */ + text-align: right; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + + /* Disable text selection */ + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.jp-OutputArea-prompt { + display: table-cell; + vertical-align: top; +} + +.jp-OutputArea-output { + display: table-cell; + width: 100%; + height: auto; + overflow: auto; + user-select: text; + -moz-user-select: text; + -webkit-user-select: text; + -ms-user-select: text; +} + +.jp-OutputArea .jp-RenderedText { + padding-left: 1ch; +} + +/** + * Prompt overlay. + */ + +.jp-OutputArea-promptOverlay { + position: absolute; + top: 0; + width: var(--jp-cell-prompt-width); + height: 100%; + opacity: 0.5; +} + +.jp-OutputArea-promptOverlay:hover { + background: var(--jp-layout-color2); + box-shadow: inset 0 0 1px var(--jp-inverse-layout-color0); + cursor: zoom-out; +} + +.jp-mod-outputsScrolled .jp-OutputArea-promptOverlay:hover { + cursor: zoom-in; +} + +/** + * Isolated output. + */ +.jp-OutputArea-output.jp-mod-isolated { + width: 100%; + display: block; +} + +/* +When drag events occur, `lm-mod-override-cursor` is added to the body. +Because iframes steal all cursor events, the following two rules are necessary +to suppress pointer events while resize drags are occurring. There may be a +better solution to this problem. +*/ +body.lm-mod-override-cursor .jp-OutputArea-output.jp-mod-isolated { + position: relative; +} + +body.lm-mod-override-cursor .jp-OutputArea-output.jp-mod-isolated::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: transparent; +} + +/* pre */ + +.jp-OutputArea-output pre { + border: none; + margin: 0; + padding: 0; + overflow-x: auto; + overflow-y: auto; + word-break: break-all; + word-wrap: break-word; + white-space: pre-wrap; +} + +/* tables */ + +.jp-OutputArea-output.jp-RenderedHTMLCommon table { + margin-left: 0; + margin-right: 0; +} + +/* description lists */ + +.jp-OutputArea-output dl, +.jp-OutputArea-output dt, +.jp-OutputArea-output dd { + display: block; +} + +.jp-OutputArea-output dl { + width: 100%; + overflow: hidden; + padding: 0; + margin: 0; +} + +.jp-OutputArea-output dt { + font-weight: bold; + float: left; + width: 20%; + padding: 0; + margin: 0; +} + +.jp-OutputArea-output dd { + float: left; + width: 80%; + padding: 0; + margin: 0; +} + +.jp-TrimmedOutputs pre { + background: var(--jp-layout-color3); + font-size: calc(var(--jp-code-font-size) * 1.4); + text-align: center; + text-transform: uppercase; +} + +/* Hide the gutter in case of + * - nested output areas (e.g. in the case of output widgets) + * - mirrored output areas + */ +.jp-OutputArea .jp-OutputArea .jp-OutputArea-prompt { + display: none; +} + +/* Hide empty lines in the output area, for instance due to cleared widgets */ +.jp-OutputArea-prompt:empty { + padding: 0; + border: 0; +} + +/*----------------------------------------------------------------------------- +| executeResult is added to any Output-result for the display of the object +| returned by a cell +|----------------------------------------------------------------------------*/ + +.jp-OutputArea-output.jp-OutputArea-executeResult { + margin-left: 0; + width: 100%; +} + +/* Text output with the Out[] prompt needs a top padding to match the + * alignment of the Out[] prompt itself. + */ +.jp-OutputArea-executeResult .jp-RenderedText.jp-OutputArea-output { + padding-top: var(--jp-code-padding); + border-top: var(--jp-border-width) solid transparent; +} + +/*----------------------------------------------------------------------------- +| The Stdin output +|----------------------------------------------------------------------------*/ + +.jp-Stdin-prompt { + color: var(--jp-content-font-color0); + padding-right: var(--jp-code-padding); + vertical-align: baseline; + flex: 0 0 auto; +} + +.jp-Stdin-input { + font-family: var(--jp-code-font-family); + font-size: inherit; + color: inherit; + background-color: inherit; + width: 42%; + min-width: 200px; + + /* make sure input baseline aligns with prompt */ + vertical-align: baseline; + + /* padding + margin = 0.5em between prompt and cursor */ + padding: 0 0.25em; + margin: 0 0.25em; + flex: 0 0 70%; +} + +.jp-Stdin-input::placeholder { + opacity: 0; +} + +.jp-Stdin-input:focus { + box-shadow: none; +} + +.jp-Stdin-input:focus::placeholder { + opacity: 1; +} + +/*----------------------------------------------------------------------------- +| Output Area View +|----------------------------------------------------------------------------*/ + +.jp-LinkedOutputView .jp-OutputArea { + height: 100%; + display: block; +} + +.jp-LinkedOutputView .jp-OutputArea-output:only-child { + height: 100%; +} + +/*----------------------------------------------------------------------------- +| Printing +|----------------------------------------------------------------------------*/ + +@media print { + .jp-OutputArea-child { + break-inside: avoid-page; + } +} + +/*----------------------------------------------------------------------------- +| Mobile +|----------------------------------------------------------------------------*/ +@media only screen and (max-width: 760px) { + .jp-OutputPrompt { + display: table-row; + text-align: left; + } + + .jp-OutputArea-child .jp-OutputArea-output { + display: table-row; + margin-left: var(--jp-notebook-padding); + } +} + +/* Trimmed outputs warning */ +.jp-TrimmedOutputs > a { + margin: 10px; + text-decoration: none; + cursor: pointer; +} + +.jp-TrimmedOutputs > a:hover { + text-decoration: none; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Table of Contents +|----------------------------------------------------------------------------*/ + +:root { + --jp-private-toc-active-width: 4px; +} + +.jp-TableOfContents { + display: flex; + flex-direction: column; + background: var(--jp-layout-color1); + color: var(--jp-ui-font-color1); + font-size: var(--jp-ui-font-size1); + height: 100%; +} + +.jp-TableOfContents-placeholder { + text-align: center; +} + +.jp-TableOfContents-placeholderContent { + color: var(--jp-content-font-color2); + padding: 8px; +} + +.jp-TableOfContents-placeholderContent > h3 { + margin-bottom: var(--jp-content-heading-margin-bottom); +} + +.jp-TableOfContents .jp-SidePanel-content { + overflow-y: auto; +} + +.jp-TableOfContents-tree { + margin: 4px; +} + +.jp-TableOfContents ol { + list-style-type: none; +} + +/* stylelint-disable-next-line selector-max-type */ +.jp-TableOfContents li > ol { + /* Align left border with triangle icon center */ + padding-left: 11px; +} + +.jp-TableOfContents-content { + /* left margin for the active heading indicator */ + margin: 0 0 0 var(--jp-private-toc-active-width); + padding: 0; + background-color: var(--jp-layout-color1); +} + +.jp-tocItem { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.jp-tocItem-heading { + display: flex; + cursor: pointer; +} + +.jp-tocItem-heading:hover { + background-color: var(--jp-layout-color2); +} + +.jp-tocItem-content { + display: block; + padding: 4px 0; + white-space: nowrap; + text-overflow: ellipsis; + overflow-x: hidden; +} + +.jp-tocItem-collapser { + height: 20px; + margin: 2px 2px 0; + padding: 0; + background: none; + border: none; + cursor: pointer; +} + +.jp-tocItem-collapser:hover { + background-color: var(--jp-layout-color3); +} + +/* Active heading indicator */ + +.jp-tocItem-heading::before { + content: ' '; + background: transparent; + width: var(--jp-private-toc-active-width); + height: 24px; + position: absolute; + left: 0; + border-radius: var(--jp-border-radius); +} + +.jp-tocItem-heading.jp-tocItem-active::before { + background-color: var(--jp-brand-color1); +} + +.jp-tocItem-heading:hover.jp-tocItem-active::before { + background: var(--jp-brand-color0); + opacity: 1; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-Collapser { + flex: 0 0 var(--jp-cell-collapser-width); + padding: 0; + margin: 0; + border: none; + outline: none; + background: transparent; + border-radius: var(--jp-border-radius); + opacity: 1; +} + +.jp-Collapser-child { + display: block; + width: 100%; + box-sizing: border-box; + + /* height: 100% doesn't work because the height of its parent is computed from content */ + position: absolute; + top: 0; + bottom: 0; +} + +/*----------------------------------------------------------------------------- +| Printing +|----------------------------------------------------------------------------*/ + +/* +Hiding collapsers in print mode. + +Note: input and output wrappers have "display: block" propery in print mode. +*/ + +@media print { + .jp-Collapser { + display: none; + } +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Header/Footer +|----------------------------------------------------------------------------*/ + +/* Hidden by zero height by default */ +.jp-CellHeader, +.jp-CellFooter { + height: 0; + width: 100%; + padding: 0; + margin: 0; + border: none; + outline: none; + background: transparent; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Input +|----------------------------------------------------------------------------*/ + +/* All input areas */ +.jp-InputArea { + display: table; + table-layout: fixed; + width: 100%; + overflow: hidden; +} + +.jp-InputArea-editor { + display: table-cell; + overflow: hidden; + vertical-align: top; + + /* This is the non-active, default styling */ + border: var(--jp-border-width) solid var(--jp-cell-editor-border-color); + border-radius: 0; + background: var(--jp-cell-editor-background); +} + +.jp-InputPrompt { + display: table-cell; + vertical-align: top; + width: var(--jp-cell-prompt-width); + color: var(--jp-cell-inprompt-font-color); + font-family: var(--jp-cell-prompt-font-family); + padding: var(--jp-code-padding); + letter-spacing: var(--jp-cell-prompt-letter-spacing); + opacity: var(--jp-cell-prompt-opacity); + line-height: var(--jp-code-line-height); + font-size: var(--jp-code-font-size); + border: var(--jp-border-width) solid transparent; + + /* Right align prompt text, don't wrap to handle large prompt numbers */ + text-align: right; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + + /* Disable text selection */ + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/*----------------------------------------------------------------------------- +| Mobile +|----------------------------------------------------------------------------*/ +@media only screen and (max-width: 760px) { + .jp-InputArea-editor { + display: table-row; + margin-left: var(--jp-notebook-padding); + } + + .jp-InputPrompt { + display: table-row; + text-align: left; + } +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Placeholder +|----------------------------------------------------------------------------*/ + +.jp-Placeholder { + display: table; + table-layout: fixed; + width: 100%; +} + +.jp-Placeholder-prompt { + display: table-cell; + box-sizing: border-box; +} + +.jp-Placeholder-content { + display: table-cell; + padding: 4px 6px; + border: 1px solid transparent; + border-radius: 0; + background: none; + box-sizing: border-box; + cursor: pointer; +} + +.jp-Placeholder-contentContainer { + display: flex; +} + +.jp-Placeholder-content:hover, +.jp-InputPlaceholder > .jp-Placeholder-content:hover { + border-color: var(--jp-layout-color3); +} + +.jp-Placeholder-content .jp-MoreHorizIcon { + width: 32px; + height: 16px; + border: 1px solid transparent; + border-radius: var(--jp-border-radius); +} + +.jp-Placeholder-content .jp-MoreHorizIcon:hover { + border: 1px solid var(--jp-border-color1); + box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.25); + background-color: var(--jp-layout-color0); +} + +.jp-PlaceholderText { + white-space: nowrap; + overflow-x: hidden; + color: var(--jp-inverse-layout-color3); + font-family: var(--jp-code-font-family); +} + +.jp-InputPlaceholder > .jp-Placeholder-content { + border-color: var(--jp-cell-editor-border-color); + background: var(--jp-cell-editor-background); +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Private CSS variables +|----------------------------------------------------------------------------*/ + +:root { + --jp-private-cell-scrolling-output-offset: 5px; +} + +/*----------------------------------------------------------------------------- +| Cell +|----------------------------------------------------------------------------*/ + +.jp-Cell { + padding: var(--jp-cell-padding); + margin: 0; + border: none; + outline: none; + background: transparent; +} + +/*----------------------------------------------------------------------------- +| Common input/output +|----------------------------------------------------------------------------*/ + +.jp-Cell-inputWrapper, +.jp-Cell-outputWrapper { + display: flex; + flex-direction: row; + padding: 0; + margin: 0; + + /* Added to reveal the box-shadow on the input and output collapsers. */ + overflow: visible; +} + +/* Only input/output areas inside cells */ +.jp-Cell-inputArea, +.jp-Cell-outputArea { + flex: 1 1 auto; +} + +/*----------------------------------------------------------------------------- +| Collapser +|----------------------------------------------------------------------------*/ + +/* Make the output collapser disappear when there is not output, but do so + * in a manner that leaves it in the layout and preserves its width. + */ +.jp-Cell.jp-mod-noOutputs .jp-Cell-outputCollapser { + border: none !important; + background: transparent !important; +} + +.jp-Cell:not(.jp-mod-noOutputs) .jp-Cell-outputCollapser { + min-height: var(--jp-cell-collapser-min-height); +} + +/*----------------------------------------------------------------------------- +| Output +|----------------------------------------------------------------------------*/ + +/* Put a space between input and output when there IS output */ +.jp-Cell:not(.jp-mod-noOutputs) .jp-Cell-outputWrapper { + margin-top: 5px; +} + +.jp-CodeCell.jp-mod-outputsScrolled .jp-Cell-outputArea { + overflow-y: auto; + max-height: 24em; + margin-left: var(--jp-private-cell-scrolling-output-offset); + resize: vertical; +} + +.jp-CodeCell.jp-mod-outputsScrolled .jp-Cell-outputArea[style*='height'] { + max-height: unset; +} + +.jp-CodeCell.jp-mod-outputsScrolled .jp-Cell-outputArea::after { + content: ' '; + box-shadow: inset 0 0 6px 2px rgb(0 0 0 / 30%); + width: 100%; + height: 100%; + position: sticky; + bottom: 0; + top: 0; + margin-top: -50%; + float: left; + display: block; + pointer-events: none; +} + +.jp-CodeCell.jp-mod-outputsScrolled .jp-OutputArea-child { + padding-top: 6px; +} + +.jp-CodeCell.jp-mod-outputsScrolled .jp-OutputArea-prompt { + width: calc( + var(--jp-cell-prompt-width) - var(--jp-private-cell-scrolling-output-offset) + ); +} + +.jp-CodeCell.jp-mod-outputsScrolled .jp-OutputArea-promptOverlay { + left: calc(-1 * var(--jp-private-cell-scrolling-output-offset)); +} + +/*----------------------------------------------------------------------------- +| CodeCell +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| MarkdownCell +|----------------------------------------------------------------------------*/ + +.jp-MarkdownOutput { + display: table-cell; + width: 100%; + margin-top: 0; + margin-bottom: 0; + padding-left: var(--jp-code-padding); +} + +.jp-MarkdownOutput.jp-RenderedHTMLCommon { + overflow: auto; +} + +/* collapseHeadingButton (show always if hiddenCellsButton is _not_ shown) */ +.jp-collapseHeadingButton { + display: flex; + min-height: var(--jp-cell-collapser-min-height); + font-size: var(--jp-code-font-size); + position: absolute; + background-color: transparent; + background-size: 25px; + background-repeat: no-repeat; + background-position-x: center; + background-position-y: top; + background-image: var(--jp-icon-caret-down); + right: 0; + top: 0; + bottom: 0; +} + +.jp-collapseHeadingButton.jp-mod-collapsed { + background-image: var(--jp-icon-caret-right); +} + +/* + set the container font size to match that of content + so that the nested collapse buttons have the right size +*/ +.jp-MarkdownCell .jp-InputPrompt { + font-size: var(--jp-content-font-size1); +} + +/* + Align collapseHeadingButton with cell top header + The font sizes are identical to the ones in packages/rendermime/style/base.css +*/ +.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='1'] { + font-size: var(--jp-content-font-size5); + background-position-y: calc(0.3 * var(--jp-content-font-size5)); +} + +.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='2'] { + font-size: var(--jp-content-font-size4); + background-position-y: calc(0.3 * var(--jp-content-font-size4)); +} + +.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='3'] { + font-size: var(--jp-content-font-size3); + background-position-y: calc(0.3 * var(--jp-content-font-size3)); +} + +.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='4'] { + font-size: var(--jp-content-font-size2); + background-position-y: calc(0.3 * var(--jp-content-font-size2)); +} + +.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='5'] { + font-size: var(--jp-content-font-size1); + background-position-y: top; +} + +.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='6'] { + font-size: var(--jp-content-font-size0); + background-position-y: top; +} + +/* collapseHeadingButton (show only on (hover,active) if hiddenCellsButton is shown) */ +.jp-Notebook.jp-mod-showHiddenCellsButton .jp-collapseHeadingButton { + display: none; +} + +.jp-Notebook.jp-mod-showHiddenCellsButton + :is(.jp-MarkdownCell:hover, .jp-mod-active) + .jp-collapseHeadingButton { + display: flex; +} + +/* showHiddenCellsButton (only show if jp-mod-showHiddenCellsButton is set, which +is a consequence of the showHiddenCellsButton option in Notebook Settings)*/ +.jp-Notebook.jp-mod-showHiddenCellsButton .jp-showHiddenCellsButton { + margin-left: calc(var(--jp-cell-prompt-width) + 2 * var(--jp-code-padding)); + margin-top: var(--jp-code-padding); + border: 1px solid var(--jp-border-color2); + background-color: var(--jp-border-color3) !important; + color: var(--jp-content-font-color0) !important; + display: flex; +} + +.jp-Notebook.jp-mod-showHiddenCellsButton .jp-showHiddenCellsButton:hover { + background-color: var(--jp-border-color2) !important; +} + +.jp-showHiddenCellsButton { + display: none; +} + +/*----------------------------------------------------------------------------- +| Printing +|----------------------------------------------------------------------------*/ + +/* +Using block instead of flex to allow the use of the break-inside CSS property for +cell outputs. +*/ + +@media print { + .jp-Cell-inputWrapper, + .jp-Cell-outputWrapper { + display: block; + } +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Variables +|----------------------------------------------------------------------------*/ + +:root { + --jp-notebook-toolbar-padding: 2px 5px 2px 2px; +} + +/*----------------------------------------------------------------------------- + +/*----------------------------------------------------------------------------- +| Styles +|----------------------------------------------------------------------------*/ + +.jp-NotebookPanel-toolbar { + padding: var(--jp-notebook-toolbar-padding); + + /* disable paint containment from lumino 2.0 default strict CSS containment */ + contain: style size !important; +} + +.jp-Toolbar-item.jp-Notebook-toolbarCellType .jp-select-wrapper.jp-mod-focused { + border: none; + box-shadow: none; +} + +.jp-Notebook-toolbarCellTypeDropdown select { + height: 24px; + font-size: var(--jp-ui-font-size1); + line-height: 14px; + border-radius: 0; + display: block; +} + +.jp-Notebook-toolbarCellTypeDropdown span { + top: 5px !important; +} + +.jp-Toolbar-responsive-popup { + position: absolute; + height: fit-content; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-end; + border-bottom: var(--jp-border-width) solid var(--jp-toolbar-border-color); + box-shadow: var(--jp-toolbar-box-shadow); + background: var(--jp-toolbar-background); + min-height: var(--jp-toolbar-micro-height); + padding: var(--jp-notebook-toolbar-padding); + z-index: 1; + right: 0; + top: 0; +} + +.jp-Toolbar > .jp-Toolbar-responsive-opener { + margin-left: auto; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Variables +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- + +/*----------------------------------------------------------------------------- +| Styles +|----------------------------------------------------------------------------*/ + +.jp-Notebook-ExecutionIndicator { + position: relative; + display: inline-block; + height: 100%; + z-index: 9997; +} + +.jp-Notebook-ExecutionIndicator-tooltip { + visibility: hidden; + height: auto; + width: max-content; + width: -moz-max-content; + background-color: var(--jp-layout-color2); + color: var(--jp-ui-font-color1); + text-align: justify; + border-radius: 6px; + padding: 0 5px; + position: fixed; + display: table; +} + +.jp-Notebook-ExecutionIndicator-tooltip.up { + transform: translateX(-50%) translateY(-100%) translateY(-32px); +} + +.jp-Notebook-ExecutionIndicator-tooltip.down { + transform: translateX(calc(-100% + 16px)) translateY(5px); +} + +.jp-Notebook-ExecutionIndicator-tooltip.hidden { + display: none; +} + +.jp-Notebook-ExecutionIndicator:hover .jp-Notebook-ExecutionIndicator-tooltip { + visibility: visible; +} + +.jp-Notebook-ExecutionIndicator span { + font-size: var(--jp-ui-font-size1); + font-family: var(--jp-ui-font-family); + color: var(--jp-ui-font-color1); + line-height: 24px; + display: block; +} + +.jp-Notebook-ExecutionIndicator-progress-bar { + display: flex; + justify-content: center; + height: 100%; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/* + * Execution indicator + */ +.jp-tocItem-content::after { + content: ''; + + /* Must be identical to form a circle */ + width: 12px; + height: 12px; + background: none; + border: none; + position: absolute; + right: 0; +} + +.jp-tocItem-content[data-running='0']::after { + border-radius: 50%; + border: var(--jp-border-width) solid var(--jp-inverse-layout-color3); + background: none; +} + +.jp-tocItem-content[data-running='1']::after { + border-radius: 50%; + border: var(--jp-border-width) solid var(--jp-inverse-layout-color3); + background-color: var(--jp-inverse-layout-color3); +} + +.jp-tocItem-content[data-running='0'], +.jp-tocItem-content[data-running='1'] { + margin-right: 12px; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +.jp-Notebook-footer { + height: 27px; + margin-left: calc( + var(--jp-cell-prompt-width) + var(--jp-cell-collapser-width) + + var(--jp-cell-padding) + ); + width: calc( + 100% - + ( + var(--jp-cell-prompt-width) + var(--jp-cell-collapser-width) + + var(--jp-cell-padding) + var(--jp-cell-padding) + ) + ); + border: var(--jp-border-width) solid var(--jp-cell-editor-border-color); + color: var(--jp-ui-font-color3); + margin-top: 6px; + background: none; + cursor: pointer; +} + +.jp-Notebook-footer:focus { + border-color: var(--jp-cell-editor-active-border-color); +} + +/* For devices that support hovering, hide footer until hover */ +@media (hover: hover) { + .jp-Notebook-footer { + opacity: 0; + } + + .jp-Notebook-footer:focus, + .jp-Notebook-footer:hover { + opacity: 1; + } +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Imports +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| CSS variables +|----------------------------------------------------------------------------*/ + +:root { + --jp-side-by-side-output-size: 1fr; + --jp-side-by-side-resized-cell: var(--jp-side-by-side-output-size); + --jp-private-notebook-dragImage-width: 304px; + --jp-private-notebook-dragImage-height: 36px; + --jp-private-notebook-selected-color: var(--md-blue-400); + --jp-private-notebook-active-color: var(--md-green-400); +} + +/*----------------------------------------------------------------------------- +| Notebook +|----------------------------------------------------------------------------*/ + +/* stylelint-disable selector-max-class */ + +.jp-NotebookPanel { + display: block; + height: 100%; +} + +.jp-NotebookPanel.jp-Document { + min-width: 240px; + min-height: 120px; +} + +.jp-Notebook { + padding: var(--jp-notebook-padding); + outline: none; + overflow: auto; + background: var(--jp-layout-color0); +} + +.jp-Notebook.jp-mod-scrollPastEnd::after { + display: block; + content: ''; + min-height: var(--jp-notebook-scroll-padding); +} + +.jp-MainAreaWidget-ContainStrict .jp-Notebook * { + contain: strict; +} + +.jp-Notebook .jp-Cell { + overflow: visible; +} + +.jp-Notebook .jp-Cell .jp-InputPrompt { + cursor: move; +} + +/*----------------------------------------------------------------------------- +| Notebook state related styling +| +| The notebook and cells each have states, here are the possibilities: +| +| - Notebook +| - Command +| - Edit +| - Cell +| - None +| - Active (only one can be active) +| - Selected (the cells actions are applied to) +| - Multiselected (when multiple selected, the cursor) +| - No outputs +|----------------------------------------------------------------------------*/ + +/* Command or edit modes */ + +.jp-Notebook .jp-Cell:not(.jp-mod-active) .jp-InputPrompt { + opacity: var(--jp-cell-prompt-not-active-opacity); + color: var(--jp-cell-prompt-not-active-font-color); +} + +.jp-Notebook .jp-Cell:not(.jp-mod-active) .jp-OutputPrompt { + opacity: var(--jp-cell-prompt-not-active-opacity); + color: var(--jp-cell-prompt-not-active-font-color); +} + +/* cell is active */ +.jp-Notebook .jp-Cell.jp-mod-active .jp-Collapser { + background: var(--jp-brand-color1); +} + +/* cell is dirty */ +.jp-Notebook .jp-Cell.jp-mod-dirty .jp-InputPrompt { + color: var(--jp-warn-color1); +} + +.jp-Notebook .jp-Cell.jp-mod-dirty .jp-InputPrompt::before { + color: var(--jp-warn-color1); + content: '•'; +} + +.jp-Notebook .jp-Cell.jp-mod-active.jp-mod-dirty .jp-Collapser { + background: var(--jp-warn-color1); +} + +/* collapser is hovered */ +.jp-Notebook .jp-Cell .jp-Collapser:hover { + box-shadow: var(--jp-elevation-z2); + background: var(--jp-brand-color1); + opacity: var(--jp-cell-collapser-not-active-hover-opacity); +} + +/* cell is active and collapser is hovered */ +.jp-Notebook .jp-Cell.jp-mod-active .jp-Collapser:hover { + background: var(--jp-brand-color0); + opacity: 1; +} + +/* Command mode */ + +.jp-Notebook.jp-mod-commandMode .jp-Cell.jp-mod-selected { + background: var(--jp-notebook-multiselected-color); +} + +.jp-Notebook.jp-mod-commandMode + .jp-Cell.jp-mod-active.jp-mod-selected:not(.jp-mod-multiSelected) { + background: transparent; +} + +/* Edit mode */ + +.jp-Notebook.jp-mod-editMode .jp-Cell.jp-mod-active .jp-InputArea-editor { + border: var(--jp-border-width) solid var(--jp-cell-editor-active-border-color); + box-shadow: var(--jp-input-box-shadow); + background-color: var(--jp-cell-editor-active-background); +} + +/*----------------------------------------------------------------------------- +| Notebook drag and drop +|----------------------------------------------------------------------------*/ + +.jp-Notebook-cell.jp-mod-dropSource { + opacity: 0.5; +} + +.jp-Notebook-cell.jp-mod-dropTarget, +.jp-Notebook.jp-mod-commandMode + .jp-Notebook-cell.jp-mod-active.jp-mod-selected.jp-mod-dropTarget { + border-top-color: var(--jp-private-notebook-selected-color); + border-top-style: solid; + border-top-width: 2px; +} + +.jp-dragImage { + display: block; + flex-direction: row; + width: var(--jp-private-notebook-dragImage-width); + height: var(--jp-private-notebook-dragImage-height); + border: var(--jp-border-width) solid var(--jp-cell-editor-border-color); + background: var(--jp-cell-editor-background); + overflow: visible; +} + +.jp-dragImage-singlePrompt { + box-shadow: 2px 2px 4px 0 rgba(0, 0, 0, 0.12); +} + +.jp-dragImage .jp-dragImage-content { + flex: 1 1 auto; + z-index: 2; + font-size: var(--jp-code-font-size); + font-family: var(--jp-code-font-family); + line-height: var(--jp-code-line-height); + padding: var(--jp-code-padding); + border: var(--jp-border-width) solid var(--jp-cell-editor-border-color); + background: var(--jp-cell-editor-background-color); + color: var(--jp-content-font-color3); + text-align: left; + margin: 4px 4px 4px 0; +} + +.jp-dragImage .jp-dragImage-prompt { + flex: 0 0 auto; + min-width: 36px; + color: var(--jp-cell-inprompt-font-color); + padding: var(--jp-code-padding); + padding-left: 12px; + font-family: var(--jp-cell-prompt-font-family); + letter-spacing: var(--jp-cell-prompt-letter-spacing); + line-height: 1.9; + font-size: var(--jp-code-font-size); + border: var(--jp-border-width) solid transparent; +} + +.jp-dragImage-multipleBack { + z-index: -1; + position: absolute; + height: 32px; + width: 300px; + top: 8px; + left: 8px; + background: var(--jp-layout-color2); + border: var(--jp-border-width) solid var(--jp-input-border-color); + box-shadow: 2px 2px 4px 0 rgba(0, 0, 0, 0.12); +} + +/*----------------------------------------------------------------------------- +| Cell toolbar +|----------------------------------------------------------------------------*/ + +.jp-NotebookTools { + display: block; + min-width: var(--jp-sidebar-min-width); + color: var(--jp-ui-font-color1); + background: var(--jp-layout-color1); + + /* This is needed so that all font sizing of children done in ems is + * relative to this base size */ + font-size: var(--jp-ui-font-size1); + overflow: auto; +} + +.jp-ActiveCellTool { + padding: 12px 0; + display: flex; +} + +.jp-ActiveCellTool-Content { + flex: 1 1 auto; +} + +.jp-ActiveCellTool .jp-ActiveCellTool-CellContent { + background: var(--jp-cell-editor-background); + border: var(--jp-border-width) solid var(--jp-cell-editor-border-color); + border-radius: 0; + min-height: 29px; +} + +.jp-ActiveCellTool .jp-InputPrompt { + min-width: calc(var(--jp-cell-prompt-width) * 0.75); +} + +.jp-ActiveCellTool-CellContent > pre { + padding: 5px 4px; + margin: 0; + white-space: normal; +} + +.jp-MetadataEditorTool { + flex-direction: column; + padding: 12px 0; +} + +.jp-RankedPanel > :not(:first-child) { + margin-top: 12px; +} + +.jp-KeySelector select.jp-mod-styled { + font-size: var(--jp-ui-font-size1); + color: var(--jp-ui-font-color0); + border: var(--jp-border-width) solid var(--jp-border-color1); +} + +.jp-KeySelector label, +.jp-MetadataEditorTool label, +.jp-NumberSetter label { + line-height: 1.4; +} + +.jp-NotebookTools .jp-select-wrapper { + margin-top: 4px; + margin-bottom: 0; +} + +.jp-NumberSetter input { + width: 100%; + margin-top: 4px; +} + +.jp-NotebookTools .jp-Collapse { + margin-top: 16px; +} + +/*----------------------------------------------------------------------------- +| Presentation Mode (.jp-mod-presentationMode) +|----------------------------------------------------------------------------*/ + +.jp-mod-presentationMode .jp-Notebook { + --jp-content-font-size1: var(--jp-content-presentation-font-size1); + --jp-code-font-size: var(--jp-code-presentation-font-size); +} + +.jp-mod-presentationMode .jp-Notebook .jp-Cell .jp-InputPrompt, +.jp-mod-presentationMode .jp-Notebook .jp-Cell .jp-OutputPrompt { + flex: 0 0 110px; +} + +/*----------------------------------------------------------------------------- +| Side-by-side Mode (.jp-mod-sideBySide) +|----------------------------------------------------------------------------*/ +.jp-mod-sideBySide.jp-Notebook .jp-Notebook-cell { + margin-top: 3em; + margin-bottom: 3em; + margin-left: 5%; + margin-right: 5%; +} + +.jp-mod-sideBySide.jp-Notebook .jp-CodeCell { + display: grid; + grid-template-columns: minmax(0, 1fr) min-content minmax( + 0, + var(--jp-side-by-side-output-size) + ); + grid-template-rows: auto minmax(0, 1fr) auto; + grid-template-areas: + 'header header header' + 'input handle output' + 'footer footer footer'; +} + +.jp-mod-sideBySide.jp-Notebook .jp-CodeCell.jp-mod-resizedCell { + grid-template-columns: minmax(0, 1fr) min-content minmax( + 0, + var(--jp-side-by-side-resized-cell) + ); +} + +.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-CellHeader { + grid-area: header; +} + +.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-Cell-inputWrapper { + grid-area: input; +} + +.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-Cell-outputWrapper { + /* overwrite the default margin (no vertical separation needed in side by side move */ + margin-top: 0; + grid-area: output; +} + +.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-CellFooter { + grid-area: footer; +} + +.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-CellResizeHandle { + grid-area: handle; + user-select: none; + display: block; + height: 100%; + cursor: ew-resize; + padding: 0 var(--jp-cell-padding); +} + +.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-CellResizeHandle::after { + content: ''; + display: block; + background: var(--jp-border-color2); + height: 100%; + width: 5px; +} + +.jp-mod-sideBySide.jp-Notebook + .jp-CodeCell.jp-mod-resizedCell + .jp-CellResizeHandle::after { + background: var(--jp-border-color0); +} + +.jp-CellResizeHandle { + display: none; +} + +/*----------------------------------------------------------------------------- +| Placeholder +|----------------------------------------------------------------------------*/ + +.jp-Cell-Placeholder { + padding-left: 55px; +} + +.jp-Cell-Placeholder-wrapper { + background: #fff; + border: 1px solid; + border-color: #e5e6e9 #dfe0e4 #d0d1d5; + border-radius: 4px; + -webkit-border-radius: 4px; + margin: 10px 15px; +} + +.jp-Cell-Placeholder-wrapper-inner { + padding: 15px; + position: relative; +} + +.jp-Cell-Placeholder-wrapper-body { + background-repeat: repeat; + background-size: 50% auto; +} + +.jp-Cell-Placeholder-wrapper-body div { + background: #f6f7f8; + background-image: -webkit-linear-gradient( + left, + #f6f7f8 0%, + #edeef1 20%, + #f6f7f8 40%, + #f6f7f8 100% + ); + background-repeat: no-repeat; + background-size: 800px 104px; + height: 104px; + position: absolute; + right: 15px; + left: 15px; + top: 15px; +} + +div.jp-Cell-Placeholder-h1 { + top: 20px; + height: 20px; + left: 15px; + width: 150px; +} + +div.jp-Cell-Placeholder-h2 { + left: 15px; + top: 50px; + height: 10px; + width: 100px; +} + +div.jp-Cell-Placeholder-content-1, +div.jp-Cell-Placeholder-content-2, +div.jp-Cell-Placeholder-content-3 { + left: 15px; + right: 15px; + height: 10px; +} + +div.jp-Cell-Placeholder-content-1 { + top: 100px; +} + +div.jp-Cell-Placeholder-content-2 { + top: 120px; +} + +div.jp-Cell-Placeholder-content-3 { + top: 140px; +} + +</style> +<style type="text/css"> +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/* +The following CSS variables define the main, public API for styling JupyterLab. +These variables should be used by all plugins wherever possible. In other +words, plugins should not define custom colors, sizes, etc unless absolutely +necessary. This enables users to change the visual theme of JupyterLab +by changing these variables. + +Many variables appear in an ordered sequence (0,1,2,3). These sequences +are designed to work well together, so for example, `--jp-border-color1` should +be used with `--jp-layout-color1`. The numbers have the following meanings: + +* 0: super-primary, reserved for special emphasis +* 1: primary, most important under normal situations +* 2: secondary, next most important under normal situations +* 3: tertiary, next most important under normal situations + +Throughout JupyterLab, we are mostly following principles from Google's +Material Design when selecting colors. We are not, however, following +all of MD as it is not optimized for dense, information rich UIs. +*/ + +:root { + /* Elevation + * + * We style box-shadows using Material Design's idea of elevation. These particular numbers are taken from here: + * + * https://github.com/material-components/material-components-web + * https://material-components-web.appspot.com/elevation.html + */ + + --jp-shadow-base-lightness: 0; + --jp-shadow-umbra-color: rgba( + var(--jp-shadow-base-lightness), + var(--jp-shadow-base-lightness), + var(--jp-shadow-base-lightness), + 0.2 + ); + --jp-shadow-penumbra-color: rgba( + var(--jp-shadow-base-lightness), + var(--jp-shadow-base-lightness), + var(--jp-shadow-base-lightness), + 0.14 + ); + --jp-shadow-ambient-color: rgba( + var(--jp-shadow-base-lightness), + var(--jp-shadow-base-lightness), + var(--jp-shadow-base-lightness), + 0.12 + ); + --jp-elevation-z0: none; + --jp-elevation-z1: 0 2px 1px -1px var(--jp-shadow-umbra-color), + 0 1px 1px 0 var(--jp-shadow-penumbra-color), + 0 1px 3px 0 var(--jp-shadow-ambient-color); + --jp-elevation-z2: 0 3px 1px -2px var(--jp-shadow-umbra-color), + 0 2px 2px 0 var(--jp-shadow-penumbra-color), + 0 1px 5px 0 var(--jp-shadow-ambient-color); + --jp-elevation-z4: 0 2px 4px -1px var(--jp-shadow-umbra-color), + 0 4px 5px 0 var(--jp-shadow-penumbra-color), + 0 1px 10px 0 var(--jp-shadow-ambient-color); + --jp-elevation-z6: 0 3px 5px -1px var(--jp-shadow-umbra-color), + 0 6px 10px 0 var(--jp-shadow-penumbra-color), + 0 1px 18px 0 var(--jp-shadow-ambient-color); + --jp-elevation-z8: 0 5px 5px -3px var(--jp-shadow-umbra-color), + 0 8px 10px 1px var(--jp-shadow-penumbra-color), + 0 3px 14px 2px var(--jp-shadow-ambient-color); + --jp-elevation-z12: 0 7px 8px -4px var(--jp-shadow-umbra-color), + 0 12px 17px 2px var(--jp-shadow-penumbra-color), + 0 5px 22px 4px var(--jp-shadow-ambient-color); + --jp-elevation-z16: 0 8px 10px -5px var(--jp-shadow-umbra-color), + 0 16px 24px 2px var(--jp-shadow-penumbra-color), + 0 6px 30px 5px var(--jp-shadow-ambient-color); + --jp-elevation-z20: 0 10px 13px -6px var(--jp-shadow-umbra-color), + 0 20px 31px 3px var(--jp-shadow-penumbra-color), + 0 8px 38px 7px var(--jp-shadow-ambient-color); + --jp-elevation-z24: 0 11px 15px -7px var(--jp-shadow-umbra-color), + 0 24px 38px 3px var(--jp-shadow-penumbra-color), + 0 9px 46px 8px var(--jp-shadow-ambient-color); + + /* Borders + * + * The following variables, specify the visual styling of borders in JupyterLab. + */ + + --jp-border-width: 1px; + --jp-border-color0: var(--md-grey-400); + --jp-border-color1: var(--md-grey-400); + --jp-border-color2: var(--md-grey-300); + --jp-border-color3: var(--md-grey-200); + --jp-inverse-border-color: var(--md-grey-600); + --jp-border-radius: 2px; + + /* UI Fonts + * + * The UI font CSS variables are used for the typography all of the JupyterLab + * user interface elements that are not directly user generated content. + * + * The font sizing here is done assuming that the body font size of --jp-ui-font-size1 + * is applied to a parent element. When children elements, such as headings, are sized + * in em all things will be computed relative to that body size. + */ + + --jp-ui-font-scale-factor: 1.2; + --jp-ui-font-size0: 0.83333em; + --jp-ui-font-size1: 13px; /* Base font size */ + --jp-ui-font-size2: 1.2em; + --jp-ui-font-size3: 1.44em; + --jp-ui-font-family: system-ui, -apple-system, blinkmacsystemfont, 'Segoe UI', + helvetica, arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', + 'Segoe UI Symbol'; + + /* + * Use these font colors against the corresponding main layout colors. + * In a light theme, these go from dark to light. + */ + + /* Defaults use Material Design specification */ + --jp-ui-font-color0: rgba(0, 0, 0, 1); + --jp-ui-font-color1: rgba(0, 0, 0, 0.87); + --jp-ui-font-color2: rgba(0, 0, 0, 0.54); + --jp-ui-font-color3: rgba(0, 0, 0, 0.38); + + /* + * Use these against the brand/accent/warn/error colors. + * These will typically go from light to darker, in both a dark and light theme. + */ + + --jp-ui-inverse-font-color0: rgba(255, 255, 255, 1); + --jp-ui-inverse-font-color1: rgba(255, 255, 255, 1); + --jp-ui-inverse-font-color2: rgba(255, 255, 255, 0.7); + --jp-ui-inverse-font-color3: rgba(255, 255, 255, 0.5); + + /* Content Fonts + * + * Content font variables are used for typography of user generated content. + * + * The font sizing here is done assuming that the body font size of --jp-content-font-size1 + * is applied to a parent element. When children elements, such as headings, are sized + * in em all things will be computed relative to that body size. + */ + + --jp-content-line-height: 1.6; + --jp-content-font-scale-factor: 1.2; + --jp-content-font-size0: 0.83333em; + --jp-content-font-size1: 14px; /* Base font size */ + --jp-content-font-size2: 1.2em; + --jp-content-font-size3: 1.44em; + --jp-content-font-size4: 1.728em; + --jp-content-font-size5: 2.0736em; + + /* This gives a magnification of about 125% in presentation mode over normal. */ + --jp-content-presentation-font-size1: 17px; + --jp-content-heading-line-height: 1; + --jp-content-heading-margin-top: 1.2em; + --jp-content-heading-margin-bottom: 0.8em; + --jp-content-heading-font-weight: 500; + + /* Defaults use Material Design specification */ + --jp-content-font-color0: rgba(0, 0, 0, 1); + --jp-content-font-color1: rgba(0, 0, 0, 0.87); + --jp-content-font-color2: rgba(0, 0, 0, 0.54); + --jp-content-font-color3: rgba(0, 0, 0, 0.38); + --jp-content-link-color: var(--md-blue-900); + --jp-content-font-family: system-ui, -apple-system, blinkmacsystemfont, + 'Segoe UI', helvetica, arial, sans-serif, 'Apple Color Emoji', + 'Segoe UI Emoji', 'Segoe UI Symbol'; + + /* + * Code Fonts + * + * Code font variables are used for typography of code and other monospaces content. + */ + + --jp-code-font-size: 13px; + --jp-code-line-height: 1.3077; /* 17px for 13px base */ + --jp-code-padding: 5px; /* 5px for 13px base, codemirror highlighting needs integer px value */ + --jp-code-font-family-default: menlo, consolas, 'DejaVu Sans Mono', monospace; + --jp-code-font-family: var(--jp-code-font-family-default); + + /* This gives a magnification of about 125% in presentation mode over normal. */ + --jp-code-presentation-font-size: 16px; + + /* may need to tweak cursor width if you change font size */ + --jp-code-cursor-width0: 1.4px; + --jp-code-cursor-width1: 2px; + --jp-code-cursor-width2: 4px; + + /* Layout + * + * The following are the main layout colors use in JupyterLab. In a light + * theme these would go from light to dark. + */ + + --jp-layout-color0: white; + --jp-layout-color1: white; + --jp-layout-color2: var(--md-grey-200); + --jp-layout-color3: var(--md-grey-400); + --jp-layout-color4: var(--md-grey-600); + + /* Inverse Layout + * + * The following are the inverse layout colors use in JupyterLab. In a light + * theme these would go from dark to light. + */ + + --jp-inverse-layout-color0: #111; + --jp-inverse-layout-color1: var(--md-grey-900); + --jp-inverse-layout-color2: var(--md-grey-800); + --jp-inverse-layout-color3: var(--md-grey-700); + --jp-inverse-layout-color4: var(--md-grey-600); + + /* Brand/accent */ + + --jp-brand-color0: var(--md-blue-900); + --jp-brand-color1: var(--md-blue-700); + --jp-brand-color2: var(--md-blue-300); + --jp-brand-color3: var(--md-blue-100); + --jp-brand-color4: var(--md-blue-50); + --jp-accent-color0: var(--md-green-900); + --jp-accent-color1: var(--md-green-700); + --jp-accent-color2: var(--md-green-300); + --jp-accent-color3: var(--md-green-100); + + /* State colors (warn, error, success, info) */ + + --jp-warn-color0: var(--md-orange-900); + --jp-warn-color1: var(--md-orange-700); + --jp-warn-color2: var(--md-orange-300); + --jp-warn-color3: var(--md-orange-100); + --jp-error-color0: var(--md-red-900); + --jp-error-color1: var(--md-red-700); + --jp-error-color2: var(--md-red-300); + --jp-error-color3: var(--md-red-100); + --jp-success-color0: var(--md-green-900); + --jp-success-color1: var(--md-green-700); + --jp-success-color2: var(--md-green-300); + --jp-success-color3: var(--md-green-100); + --jp-info-color0: var(--md-cyan-900); + --jp-info-color1: var(--md-cyan-700); + --jp-info-color2: var(--md-cyan-300); + --jp-info-color3: var(--md-cyan-100); + + /* Cell specific styles */ + + --jp-cell-padding: 5px; + --jp-cell-collapser-width: 8px; + --jp-cell-collapser-min-height: 20px; + --jp-cell-collapser-not-active-hover-opacity: 0.6; + --jp-cell-editor-background: var(--md-grey-100); + --jp-cell-editor-border-color: var(--md-grey-300); + --jp-cell-editor-box-shadow: inset 0 0 2px var(--md-blue-300); + --jp-cell-editor-active-background: var(--jp-layout-color0); + --jp-cell-editor-active-border-color: var(--jp-brand-color1); + --jp-cell-prompt-width: 64px; + --jp-cell-prompt-font-family: var(--jp-code-font-family-default); + --jp-cell-prompt-letter-spacing: 0; + --jp-cell-prompt-opacity: 1; + --jp-cell-prompt-not-active-opacity: 0.5; + --jp-cell-prompt-not-active-font-color: var(--md-grey-700); + + /* A custom blend of MD grey and blue 600 + * See https://meyerweb.com/eric/tools/color-blend/#546E7A:1E88E5:5:hex */ + --jp-cell-inprompt-font-color: #307fc1; + + /* A custom blend of MD grey and orange 600 + * https://meyerweb.com/eric/tools/color-blend/#546E7A:F4511E:5:hex */ + --jp-cell-outprompt-font-color: #bf5b3d; + + /* Notebook specific styles */ + + --jp-notebook-padding: 10px; + --jp-notebook-select-background: var(--jp-layout-color1); + --jp-notebook-multiselected-color: var(--md-blue-50); + + /* The scroll padding is calculated to fill enough space at the bottom of the + notebook to show one single-line cell (with appropriate padding) at the top + when the notebook is scrolled all the way to the bottom. We also subtract one + pixel so that no scrollbar appears if we have just one single-line cell in the + notebook. This padding is to enable a 'scroll past end' feature in a notebook. + */ + --jp-notebook-scroll-padding: calc( + 100% - var(--jp-code-font-size) * var(--jp-code-line-height) - + var(--jp-code-padding) - var(--jp-cell-padding) - 1px + ); + + /* Rendermime styles */ + + --jp-rendermime-error-background: #fdd; + --jp-rendermime-table-row-background: var(--md-grey-100); + --jp-rendermime-table-row-hover-background: var(--md-light-blue-50); + + /* Dialog specific styles */ + + --jp-dialog-background: rgba(0, 0, 0, 0.25); + + /* Console specific styles */ + + --jp-console-padding: 10px; + + /* Toolbar specific styles */ + + --jp-toolbar-border-color: var(--jp-border-color1); + --jp-toolbar-micro-height: 8px; + --jp-toolbar-background: var(--jp-layout-color1); + --jp-toolbar-box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.24); + --jp-toolbar-header-margin: 4px 4px 0 4px; + --jp-toolbar-active-background: var(--md-grey-300); + + /* Statusbar specific styles */ + + --jp-statusbar-height: 24px; + + /* Input field styles */ + + --jp-input-box-shadow: inset 0 0 2px var(--md-blue-300); + --jp-input-active-background: var(--jp-layout-color1); + --jp-input-hover-background: var(--jp-layout-color1); + --jp-input-background: var(--md-grey-100); + --jp-input-border-color: var(--jp-inverse-border-color); + --jp-input-active-border-color: var(--jp-brand-color1); + --jp-input-active-box-shadow-color: rgba(19, 124, 189, 0.3); + + /* General editor styles */ + + --jp-editor-selected-background: #d9d9d9; + --jp-editor-selected-focused-background: #d7d4f0; + --jp-editor-cursor-color: var(--jp-ui-font-color0); + + /* Code mirror specific styles */ + + --jp-mirror-editor-keyword-color: #008000; + --jp-mirror-editor-atom-color: #88f; + --jp-mirror-editor-number-color: #080; + --jp-mirror-editor-def-color: #00f; + --jp-mirror-editor-variable-color: var(--md-grey-900); + --jp-mirror-editor-variable-2-color: rgb(0, 54, 109); + --jp-mirror-editor-variable-3-color: #085; + --jp-mirror-editor-punctuation-color: #05a; + --jp-mirror-editor-property-color: #05a; + --jp-mirror-editor-operator-color: #a2f; + --jp-mirror-editor-comment-color: #408080; + --jp-mirror-editor-string-color: #ba2121; + --jp-mirror-editor-string-2-color: #708; + --jp-mirror-editor-meta-color: #a2f; + --jp-mirror-editor-qualifier-color: #555; + --jp-mirror-editor-builtin-color: #008000; + --jp-mirror-editor-bracket-color: #997; + --jp-mirror-editor-tag-color: #170; + --jp-mirror-editor-attribute-color: #00c; + --jp-mirror-editor-header-color: blue; + --jp-mirror-editor-quote-color: #090; + --jp-mirror-editor-link-color: #00c; + --jp-mirror-editor-error-color: #f00; + --jp-mirror-editor-hr-color: #999; + + /* + RTC user specific colors. + These colors are used for the cursor, username in the editor, + and the icon of the user. + */ + + --jp-collaborator-color1: #ffad8e; + --jp-collaborator-color2: #dac83d; + --jp-collaborator-color3: #72dd76; + --jp-collaborator-color4: #00e4d0; + --jp-collaborator-color5: #45d4ff; + --jp-collaborator-color6: #e2b1ff; + --jp-collaborator-color7: #ff9de6; + + /* Vega extension styles */ + + --jp-vega-background: white; + + /* Sidebar-related styles */ + + --jp-sidebar-min-width: 250px; + + /* Search-related styles */ + + --jp-search-toggle-off-opacity: 0.5; + --jp-search-toggle-hover-opacity: 0.8; + --jp-search-toggle-on-opacity: 1; + --jp-search-selected-match-background-color: rgb(245, 200, 0); + --jp-search-selected-match-color: black; + --jp-search-unselected-match-background-color: var( + --jp-inverse-layout-color0 + ); + --jp-search-unselected-match-color: var(--jp-ui-inverse-font-color0); + + /* Icon colors that work well with light or dark backgrounds */ + --jp-icon-contrast-color0: var(--md-purple-600); + --jp-icon-contrast-color1: var(--md-green-600); + --jp-icon-contrast-color2: var(--md-pink-600); + --jp-icon-contrast-color3: var(--md-blue-600); + + /* Button colors */ + --jp-accept-color-normal: var(--md-blue-700); + --jp-accept-color-hover: var(--md-blue-800); + --jp-accept-color-active: var(--md-blue-900); + --jp-warn-color-normal: var(--md-red-700); + --jp-warn-color-hover: var(--md-red-800); + --jp-warn-color-active: var(--md-red-900); + --jp-reject-color-normal: var(--md-grey-600); + --jp-reject-color-hover: var(--md-grey-700); + --jp-reject-color-active: var(--md-grey-800); + + /* File or activity icons and switch semantic variables */ + --jp-jupyter-icon-color: #f37626; + --jp-notebook-icon-color: #f37626; + --jp-json-icon-color: var(--md-orange-700); + --jp-console-icon-background-color: var(--md-blue-700); + --jp-console-icon-color: white; + --jp-terminal-icon-background-color: var(--md-grey-800); + --jp-terminal-icon-color: var(--md-grey-200); + --jp-text-editor-icon-color: var(--md-grey-700); + --jp-inspector-icon-color: var(--md-grey-700); + --jp-switch-color: var(--md-grey-400); + --jp-switch-true-position-color: var(--md-orange-900); +} +</style> +<style type="text/css"> +/* Force rendering true colors when outputing to pdf */ +* { + -webkit-print-color-adjust: exact; +} + +/* Misc */ +a.anchor-link { + display: none; +} + +/* Input area styling */ +.jp-InputArea { + overflow: hidden; +} + +.jp-InputArea-editor { + overflow: hidden; +} + +.cm-editor.cm-s-jupyter .highlight pre { +/* weird, but --jp-code-padding defined to be 5px but 4px horizontal padding is hardcoded for pre.cm-line */ + padding: var(--jp-code-padding) 4px; + margin: 0; + + font-family: inherit; + font-size: inherit; + line-height: inherit; + color: inherit; + +} + +.jp-OutputArea-output pre { + line-height: inherit; + font-family: inherit; +} + +.jp-RenderedText pre { + color: var(--jp-content-font-color1); + font-size: var(--jp-code-font-size); +} + +/* Hiding the collapser by default */ +.jp-Collapser { + display: none; +} + +@page { + margin: 0.5in; /* Margin for each printed piece of paper */ +} + +@media print { + .jp-Cell-inputWrapper, + .jp-Cell-outputWrapper { + display: block; + } +} +</style> +<!-- Load mathjax --> +<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS_CHTML-full,Safe"> </script> +<!-- MathJax configuration --> +<script type="text/x-mathjax-config"> + init_mathjax = function() { + if (window.MathJax) { + // MathJax loaded + MathJax.Hub.Config({ + TeX: { + equationNumbers: { + autoNumber: "AMS", + useLabelIds: true + } + }, + tex2jax: { + inlineMath: [ ['$','$'], ["\\(","\\)"] ], + displayMath: [ ['$$','$$'], ["\\[","\\]"] ], + processEscapes: true, + processEnvironments: true + }, + displayAlign: 'center', + CommonHTML: { + linebreaks: { + automatic: true + } + } + }); + + MathJax.Hub.Queue(["Typeset", MathJax.Hub]); + } + } + init_mathjax(); + </script> +<!-- End of mathjax configuration --><script type="module"> + document.addEventListener("DOMContentLoaded", async () => { + const diagrams = document.querySelectorAll(".jp-Mermaid > pre.mermaid"); + // do not load mermaidjs if not needed + if (!diagrams.length) { + return; + } + const mermaid = (await import("https://cdnjs.cloudflare.com/ajax/libs/mermaid/10.6.0/mermaid.esm.min.mjs")).default; + const parser = new DOMParser(); + + mermaid.initialize({ + maxTextSize: 100000, + startOnLoad: false, + fontFamily: window + .getComputedStyle(document.body) + .getPropertyValue("--jp-ui-font-family"), + theme: document.querySelector("body[data-jp-theme-light='true']") + ? "default" + : "dark", + }); + + let _nextMermaidId = 0; + + function makeMermaidImage(svg) { + const img = document.createElement("img"); + const doc = parser.parseFromString(svg, "image/svg+xml"); + const svgEl = doc.querySelector("svg"); + const { maxWidth } = svgEl?.style || {}; + const firstTitle = doc.querySelector("title"); + const firstDesc = doc.querySelector("desc"); + + img.setAttribute("src", `data:image/svg+xml,${encodeURIComponent(svg)}`); + if (maxWidth) { + img.width = parseInt(maxWidth); + } + if (firstTitle) { + img.setAttribute("alt", firstTitle.textContent); + } + if (firstDesc) { + const caption = document.createElement("figcaption"); + caption.className = "sr-only"; + caption.textContent = firstDesc.textContent; + return [img, caption]; + } + return [img]; + } + + async function makeMermaidError(text) { + let errorMessage = ""; + try { + await mermaid.parse(text); + } catch (err) { + errorMessage = `${err}`; + } + + const result = document.createElement("details"); + result.className = 'jp-RenderedMermaid-Details'; + const summary = document.createElement("summary"); + summary.className = 'jp-RenderedMermaid-Summary'; + const pre = document.createElement("pre"); + const code = document.createElement("code"); + code.innerText = text; + pre.appendChild(code); + summary.appendChild(pre); + result.appendChild(summary); + + const warning = document.createElement("pre"); + warning.innerText = errorMessage; + result.appendChild(warning); + return [result]; + } + + async function renderOneMarmaid(src) { + const id = `jp-mermaid-${_nextMermaidId++}`; + const parent = src.parentNode; + let raw = src.textContent.trim(); + const el = document.createElement("div"); + el.style.visibility = "hidden"; + document.body.appendChild(el); + let results = null; + let output = null; + try { + const { svg } = await mermaid.render(id, raw, el); + results = makeMermaidImage(svg); + output = document.createElement("figure"); + results.map(output.appendChild, output); + } catch (err) { + parent.classList.add("jp-mod-warning"); + results = await makeMermaidError(raw); + output = results[0]; + } finally { + el.remove(); + } + parent.classList.add("jp-RenderedMermaid"); + parent.appendChild(output); + } + + void Promise.all([...diagrams].map(renderOneMarmaid)); + }); +</script> +<style> + .jp-Mermaid:not(.jp-RenderedMermaid) { + display: none; + } + + .jp-RenderedMermaid { + overflow: auto; + display: flex; + } + + .jp-RenderedMermaid.jp-mod-warning { + width: auto; + padding: 0.5em; + margin-top: 0.5em; + border: var(--jp-border-width) solid var(--jp-warn-color2); + border-radius: var(--jp-border-radius); + color: var(--jp-ui-font-color1); + font-size: var(--jp-ui-font-size1); + white-space: pre-wrap; + word-wrap: break-word; + } + + .jp-RenderedMermaid figure { + margin: 0; + overflow: auto; + max-width: 100%; + } + + .jp-RenderedMermaid img { + max-width: 100%; + } + + .jp-RenderedMermaid-Details > pre { + margin-top: 1em; + } + + .jp-RenderedMermaid-Summary { + color: var(--jp-warn-color2); + } + + .jp-RenderedMermaid:not(.jp-mod-warning) pre { + display: none; + } + + .jp-RenderedMermaid-Summary > pre { + display: inline-block; + white-space: normal; + } +</style> +<!-- End of mermaid configuration --></head> +<body class="jp-Notebook" data-jp-theme-light="true" data-jp-theme-name="JupyterLab Light"> +<main> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=c96d6259-08d6-4289-aea2-589d67cdb5ee"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<h1 id="PA-2.2:-Love-is-Sparse">PA 2.2: Love is Sparse<a class="anchor-link" href="#PA-2.2:-Love-is-Sparse">¶</a></h1><h1 style="position: absolute; display: flex; flex-grow: 0; flex-shrink: 0; flex-direction: row-reverse; top: 60px;right: 30px; margin: 0; border: 0"> +<style> + .markdown {width:100%; position: relative} + article { position: relative } + </style> +<img alt="No description has been provided for this image" src="https://gitlab.tudelft.nl/mude/public/-/raw/main/tu-logo/TU_P1_full-color.png" style="width:100px"/> +<img alt="No description has been provided for this image" src="https://gitlab.tudelft.nl/mude/public/-/raw/main/mude-logo/MUDE_Logo-small.png" style="width:100px"/> +</h1> +<h2 style="height: 10px"> +</h2> +<p><em><a href="http://mude.citg.tudelft.nl/">CEGM1000 MUDE</a>: Week 2.2 Due: complete this PA prior to class on Friday, Nov 22, 2024.</em></p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=7a28e541-d2d0-48a9-abf6-7b73075c8fd3"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p>This assignment will introduce you to the concept of sparse matrices in Python and how they can be useful to speed up computations and reduce file sizes. This is especially important when using the numerical schemes we are learning about (FDM, FVM, FEM) to solve problems with a lot of unknowns at each time step. To accomplish this, we will be using the <code>scipy.sparse</code> library.</p> +<p>Keep the <code>scipy.sparse</code> <a href="https://docs.scipy.org/doc/scipy/reference/sparse.html">documentation</a> handy. Some of the work you'll do is based off this <a href="https://www.sefidian.com/2021/04/28/python-scipy-sparse-matrices-explained/">blog</a>, so you may find it helpful. In addition, if you don't know what a byte is, you may want to read up on <a href="https://en.wikipedia.org/wiki/Byte">Wikipdia here</a> (not all of it, as long as you recognize that it is a measure of storage space on a computer).The concepts you learn here are applied to the Finite Element Method in this <a href="https://mude.citg.tudelft.nl/book/fem/matrix.html">book chapter</a>, which you are expected to read during Week 2.2.</p> +<p><strong>Note:</strong> <em>you probably skipped over all the links in the paragraph above. While we forgive you for your haste, just remember to revisit some of them if you are struggling to finish the questions below!</em></p> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=a262eac1"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> +<span class="kn">import</span> <span class="nn">scipy.sparse</span> <span class="k">as</span> <span class="nn">sparse</span> +<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span> +<span class="kn">import</span> <span class="nn">timeit</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=c3cd5017-10e0-4b64-ad1a-b626d80a128a"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<h2 id="Task-1:-Why-sparse?">Task 1: Why sparse?<a class="anchor-link" href="#Task-1:-Why-sparse?">¶</a></h2><p>Some matrices have a lot of zeros, with such an example given below. When this is the case, the way we store the actual information of the matrix (the non-zero elements) can have a big impact on computation speed and storage demands. Formats which handle this by only storing non-zero elements are called sparse, and have very different internal representations of the data to the matrices you have been familiarized with in previous programming assignments.</p> +<p><img alt="Sparse matrix" src="images/sparse_matrix.png"/></p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=f583dfa0-5a21-4ebb-99e5-7b27b323171d"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 1.1:</b> +<p>First we will create a regular Numpy matrix to use as a starting point for making a sparse one.</p> +<ul> +<li>Create a function (<code>create_dense</code>) which returns a square matrix of arbitrary size filled with zero and non-zero values between 0 and 1.</li> +<li>The function should take as input the size N (such that the matrix is N x N) and one float between 0 and 1, which represents the approximate fraction of the elements of the matrix which are non-zero.</li> +<li>Use <a href="https://numpy.org/doc/stable/reference/random/generated/numpy.random.rand.html">numpy.random.rand</a> to create a random set of values between 0 and 1</li> +<li>Remove a portion of the values by using simple boolean expression to set the fraction specified by <code>percentage</code> to zero.</li> +</ul> +</p> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=2c707a48"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#facb8e; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> <p>Note that the function below uses colons <code>:</code> with argument type, as well as a <code>-></code> before closing the function definition line. This is called "typing," which is a useful feature for helping to write code that behaves properly. In this PA you should use them like hints to help you write the functions and use them properly. If you are curious, read more <a href="https://docs.python.org/3/library/typing.html" target="_blank">here</a>.</p></div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=1310dca9-dc46-4ab1-ab78-0a5389191cfc"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">create_dense</span><span class="p">(</span><span class="n">size</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">percentage</span><span class="p">:</span> <span class="nb">float</span><span class="p">)</span> <span class="o">-></span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">:</span> + <span class="n">matrix</span> <span class="o">=</span> <span class="n">YOUR_CODE_HERE</span> + <span class="n">matrix</span><span class="p">[</span><span class="n">YOUR_CODE_HERE</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span> + <span class="k">return</span> <span class="n">matrix</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=d670f274-ef24-4abd-86bf-3cd24e3cf5c5"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p>Now, set up a test to check if you set the function up correctly:</p> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=8f6a3117"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="n">test_size</span> <span class="o">=</span> <span class="n">YOUR_CODE_HERE</span> +<span class="n">test_percentage</span> <span class="o">=</span> <span class="n">YOUR_CODE_HERE</span> +<span class="n">matrix</span> <span class="o">=</span> <span class="n">create_dense</span><span class="p">(</span><span class="n">test_size</span><span class="p">,</span> <span class="n">test_percentage</span><span class="p">)</span> +<span class="k">assert</span> <span class="n">np</span><span class="o">.</span><span class="n">count_nonzero</span><span class="p">(</span><span class="n">matrix</span><span class="p">)</span> <span class="o"><</span> <span class="n">test_percentage</span><span class="o">*</span><span class="mf">1.1</span><span class="o">*</span><span class="n">test_size</span><span class="o">**</span><span class="mi">2</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=0f3d9c79"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 1.2:</b> +Use <a href="https://numpy.org/doc/stable/reference/generated/numpy.ndarray.nbytes.html">array.nbytes</a> to find out how much space a 1000x1000 matrix with 10% non-zero elements takes. Try to explain where this number came from! (Hint: the answer is in the assert statement) +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=aa5a25f9"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="n">my_matrix_size</span> <span class="o">=</span> <span class="n">YOUR_CODE_HERE</span> +<span class="k">assert</span> <span class="n">my_matrix_size</span> <span class="o">==</span> <span class="mi">8</span><span class="o">*</span><span class="n">test_size</span><span class="o">**</span><span class="mi">2</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=912215f3"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p>Next we will explore how to use <code>scipy.sparse</code>, and how this reduces the data size of the matrix. The <a href="https://docs.scipy.org/doc/scipy/reference/sparse.html"> documentation</a> gives us many different types of formats to choose from, so we'll explore two of them: BSR (Block Sparse Row) and CSR (Compressed Sparse Row).</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=25a832c8"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 1.3:</b> + Complete the code below to make a CSR and BSR matrix from the <code>matrix</code> variable. +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=29c0d2dc"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="n">csr_matrix</span> <span class="o">=</span> <span class="n">YOUR_CODE_HERE</span> +<span class="n">bsr_matrix</span> <span class="o">=</span> <span class="n">YOUR_CODE_HERE</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=56334ed7"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p>Let's compare the new storage requirements and see how much of an improvement we got (it should approach the value used above for <code>test_percentage</code>, but not reach it exactly):</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=bb4b15d3"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 1.4:</b> + Run the code below and comment on the improvement and whether or not it reaches the target percentage of sparse values in the non-sparse matrix. +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=a46df127"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"CSR matrix size: </span><span class="si">{</span><span class="n">csr_matrix</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">size</span><span class="si">}</span><span class="s2"> bytes"</span><span class="p">)</span> +<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Compared to the normal matrix, CSR uses this "</span> + <span class="o">+</span><span class="sa">f</span><span class="s2">"fraction of space: </span><span class="si">{</span><span class="n">csr_matrix</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">nbytes</span><span class="o">/</span><span class="n">my_matrix_size</span><span class="si">:</span><span class="s2">0.6f</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span> +<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"BSR matrix size: </span><span class="si">{</span><span class="n">bsr_matrix</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">size</span><span class="si">}</span><span class="s2"> bytes"</span><span class="p">)</span> +<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Compared to the normal matrix, BSR uses this "</span> + <span class="o">+</span><span class="sa">f</span><span class="s2">"fraction of space: </span><span class="si">{</span><span class="n">bsr_matrix</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">nbytes</span><span class="o">/</span><span class="n">my_matrix_size</span><span class="si">:</span><span class="s2">0.6f</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=f832b8e0"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<h2 id="Task-2:-What-is-love?">Task 2: <a href="https://www.youtube.com/watch?v=HEXWRTEbj1I">What is love?</a><a class="anchor-link" href="#Task-2:-What-is-love?">¶</a></h2><p>Let's look into a small example of how sparse matrices can also help improve calculation speeds. We'll study the mysterious case of a massive friend group with a concerning love circle and how we can predict how each person feels with respect to the other. This is quantified by the amount of love, $n_i$, that is "felt" by person $i$. In fact, the feelings grow stronger with time, which means they can be described with a simple differential relationship between <em>neighbors</em>, where each person in the group is happy when the other is sad, but the opposite is true for the other person, which can be defined like this:</p> +$$ +\begin{pmatrix} +\cfrac{dn_1}{dt}\\ +\cfrac{dn_2}{dt} \\ +\end{pmatrix} += +\begin{pmatrix} +0 & 1\\ +-1 & 0 \\ +\end{pmatrix} +\begin{pmatrix} +n_1\\ +n_2 \\ +\end{pmatrix} +$$<p>So in this case, person 2 doesn't like it when person 1 is happy but person 2 likes it when person 1 is happy. If we extend this to a four case scenario we'd get the following matrix: +$$ +\begin{pmatrix} +\cfrac{dn_1}{dt}\\ +\cfrac{dn_2}{dt}\\ +\cfrac{dn_3}{dt}\\ +\cfrac{dn_4}{dt}\\ +\end{pmatrix} += +\begin{pmatrix} +0 & 1 & 0 & -1 \\ +-1 & 0 & 1 & 0 \\ +0 & -1 & 0 & 1 \\ +1 & 0 & -1 & 0 \\ +\end{pmatrix} +\begin{pmatrix} +n_1 \\ +n_2 \\ +n_3 \\ +n_4 \\ +\end{pmatrix} +$$</p> +<p>Now we can see how everyone's feelings towards each other are...complicated!</p> +<p>What happens if we extend it to even more people? The pattern persists, but importantly: <em>if the group gets very large, we will be storing a lot of useless information, all the 0's between the 1's!</em></p> +<p>OK, so maybe this is a silly example, but it creates a problem that is actually very similar to how we use individual elements to construct a global system of equations to solve in the Finite Element Method!</p> +<p>We can easily operationalize the procedure of <em>constructing</em> this matrix using the method <code>ix_</code>, for which a simple example is provided in the code cell below (this example is generic to illustrate <code>ix_</code> usage and is not related to the love circle!):</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=eeeac139"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 2.0:</b> +<p>Read and modify the code cell below until you are confident you understand how the <code>ix_</code> method works.</p> +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=77f295f5"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="n">blank</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">shape</span><span class="o">=</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">4</span><span class="p">))</span> +<span class="n">blueprint</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([[</span><span class="mi">0</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">],</span> + <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">]])</span> + +<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">):</span> + <span class="c1"># First argument will be used for rows</span> + <span class="c1"># Second for columns</span> + <span class="n">blank</span><span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">ix_</span><span class="p">([</span><span class="n">i</span><span class="o">*</span><span class="mi">2</span><span class="p">,</span> <span class="n">i</span><span class="o">*</span><span class="mi">2</span> <span class="o">+</span> <span class="mi">1</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">])]</span> <span class="o">=</span> <span class="n">blueprint</span> + +<span class="nb">print</span><span class="p">(</span><span class="n">blank</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=4acb01e5"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p>Now we return to the love triangle problem and try to construct the matrix for a large group using <code>ix_</code>.</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=7a73f37b-6763-4d1c-92b8-994aa28f8ff6"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 2.1:</b> +Generate the matrix <code>relationship</code> for the differential equation for 1000 people. Use the <a href="https://numpy.org/doc/stable/reference/generated/numpy.ix_.html"><code>numpy.ix_</code></a> function to make your life easier. +<p>Note that we have already provided an easy way to place the smaller sub-matrices in the right place.</p> +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=b622c84f"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="n">N</span> <span class="o">=</span> <span class="mi">1000</span> +<span class="n">relationship</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">shape</span><span class="o">=</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">N</span><span class="p">))</span> + +<span class="n">YOUR_CODE_HERE</span> + +<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">N</span><span class="p">):</span> + <span class="n">relationship</span><span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">ix_</span><span class="p">([</span><span class="n">i</span><span class="p">,</span> <span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">%</span><span class="k">N</span>], [i, (i+1)%N])] = YOUR_CODE_HERE +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=28b9a66f"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p>Remember <code>plt.matshow()</code>? We used this back in Q1 to visualize the contents of a matrix. Try it now to see if we build this matrix correctly with <code>ix_</code>.</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=11c4eb64"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 2.2:</b> + Use <code>plt.matshow()</code> to view the contents of the matrix <code>relationship</code>. +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=2cd01702"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="n">plt</span><span class="o">.</span><span class="n">matshow</span><span class="p">(</span><span class="n">YOUR_CODE_HERE</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=dc948f50"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p>Note that since the matrix is huge, we have to look at only a small subset of it in order to see its contents; try changing the indices of the plotted values to get a better view.</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=ca159fe4"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 2.3:</b> + Try again, but look at a subset of the matrix! +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=8ae5a340"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="n">plt</span><span class="o">.</span><span class="n">matshow</span><span class="p">(</span><span class="n">YOUR_CODE_HERE</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=526706d5"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p>Finally, we are going to use the forward Euler method to simulate this differential equation for a total of 5 seconds over 1000 iterations. This has already been implemented in the <code>test</code> method.</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=9f128b80"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 2.4:</b> +Find the time it takes to evaluate the relationship using <code>timeit</code> by entering the function you wish to evaluate as a string. +<p>HINT: you have already learned how to convert a matrix into a sparse format, and the function is defined for you. Run the code cell and compare the performances of the different matrix formats. Which one is faster? How much space do they take?</p> +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=0a8f83b9"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="n">N_ITS</span> <span class="o">=</span> <span class="mi">1000</span> +<span class="n">T</span> <span class="o">=</span> <span class="mi">5</span> <span class="c1"># Seconds</span> +<span class="n">dt</span> <span class="o">=</span> <span class="n">T</span><span class="o">/</span><span class="n">N_ITS</span> + +<span class="k">def</span> <span class="nf">test</span><span class="p">(</span><span class="n">rel_matrix</span><span class="p">):</span> + <span class="n">state</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">N</span><span class="p">)</span> + <span class="n">state</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span> + <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">N_ITS</span><span class="p">):</span> + <span class="n">state</span> <span class="o">=</span> <span class="n">state</span> <span class="o">+</span> <span class="n">rel_matrix</span> <span class="o">@</span> <span class="n">state</span> <span class="o">*</span> <span class="n">dt</span> + +<span class="n">csr_matrix</span> <span class="o">=</span> <span class="n">YOUR_CODE_HERE</span> +<span class="n">bsr_matrix</span> <span class="o">=</span> <span class="n">YOUR_CODE_HERE</span> +<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Standard: </span><span class="si">{</span><span class="n">timeit</span><span class="o">.</span><span class="n">timeit</span><span class="p">(</span><span class="s1">'test(relationship)'</span><span class="p">,</span> +<span class="w"> </span><span class="nb">globals</span><span class="o">=</span><span class="nb">globals</span><span class="p">(),</span> +<span class="w"> </span><span class="n">number</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span><span class="o">/</span><span class="mi">10</span><span class="si">:</span><span class="s2">.4f</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span> +<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"CSR: </span><span class="si">{</span><span class="n">timeit</span><span class="o">.</span><span class="n">timeit</span><span class="p">(</span><span class="s1">'test(csr_matrix)'</span><span class="p">,</span> +<span class="w"> </span><span class="nb">globals</span><span class="o">=</span><span class="nb">globals</span><span class="p">(),</span> +<span class="w"> </span><span class="n">number</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span><span class="o">/</span><span class="mi">10</span><span class="si">:</span><span class="s2">.4f</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span> +<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"BSR: </span><span class="si">{</span><span class="n">timeit</span><span class="o">.</span><span class="n">timeit</span><span class="p">(</span><span class="s1">'test(bsr_matrix)'</span><span class="p">,</span> +<span class="w"> </span><span class="nb">globals</span><span class="o">=</span><span class="nb">globals</span><span class="p">(),</span> +<span class="w"> </span><span class="n">number</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span><span class="o">/</span><span class="mi">10</span><span class="si">:</span><span class="s2">.4f</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=a843ae4f"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 2.5:</b> +<p>What is the change in performance by using the sparse matrices?</p> +</p> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=50d74c04"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p><em>Your answer here.</em></p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=920bab21"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p>One final consideration when using sparse matrices is that it can take a long time to generate them from a regular matrix. You can test this out by placing the matrix generation inside or outside the <code>timeit</code> code to compare their performances. Try it!</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=bf4fdf38"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p><strong>End of notebook.</strong></p> +<h2 style="height: 60px"> +</h2> +<h3 style="position: absolute; display: flex; flex-grow: 0; flex-shrink: 0; flex-direction: row-reverse; bottom: 60px; right: 50px; margin: 0; border: 0"> +<style> + .markdown {width:100%; position: relative} + article { position: relative } + </style> +<a href="http://creativecommons.org/licenses/by/4.0/" rel="license"> +<img alt="Creative Commons License" src="https://i.creativecommons.org/l/by/4.0/88x31.png" style="border-width:; width:88px; height:auto; padding-top:10px"/> +</a> +<a href="https://www.tudelft.nl/en/ceg" rel="TU Delft"> +<img alt="TU Delft" src="https://gitlab.tudelft.nl/mude/public/-/raw/main/tu-logo/TU_P1_full-color.png" style="border-width:0; width:100px; height:auto; padding-bottom:0px"/> +</a> +<a href="http://mude.citg.tudelft.nl/" rel="MUDE"> +<img alt="MUDE" src="https://gitlab.tudelft.nl/mude/public/-/raw/main/mude-logo/MUDE_Logo-small.png" style="border-width:0; width:100px; height:auto; padding-bottom:0px"/> +</a> +</h3> +<span style="font-size: 75%"> +© Copyright 2024 <a href="http://mude.citg.tudelft.nl/" rel="MUDE">MUDE</a> TU Delft. This work is licensed under a <a href="http://creativecommons.org/licenses/by/4.0/" rel="license">CC BY 4.0 License</a>. + +</span></div> +</div> +</div> +</div> +</main> +</body> +<script type="application/vnd.jupyter.widget-state+json"> +{"state": {}, "version_major": 2, "version_minor": 0} +</script> +</html> diff --git a/src/teachers/Week_2_2/PA_2_2_solution.html b/src/teachers/Week_2_2/PA_2_2_solution.html new file mode 100644 index 0000000000000000000000000000000000000000..188e1416406dfef12288d8765ad4aeb3c73e1ae0 --- /dev/null +++ b/src/teachers/Week_2_2/PA_2_2_solution.html @@ -0,0 +1,8279 @@ +<!DOCTYPE html> + +<html lang="en"> +<head><meta charset="utf-8"/> +<meta content="width=device-width, initial-scale=1.0" name="viewport"/> +<title>PA_2_2_solution</title><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.min.js"></script><script> +(function() { + function addWidgetsRenderer() { + var mimeElement = document.querySelector('script[type="application/vnd.jupyter.widget-view+json"]'); + var scriptElement = document.createElement('script'); + + var widgetRendererSrc = 'https://unpkg.com/@jupyter-widgets/html-manager@*/dist/embed-amd.js'; + + var widgetState; + + // Fallback for older version: + try { + widgetState = mimeElement && JSON.parse(mimeElement.innerHTML); + + if (widgetState && (widgetState.version_major < 2 || !widgetState.version_major)) { + + var widgetRendererSrc = 'https://unpkg.com/@jupyter-js-widgets@*/dist/embed.js'; + + } + } catch(e) {} + + scriptElement.src = widgetRendererSrc; + document.body.appendChild(scriptElement); + } + + document.addEventListener('DOMContentLoaded', addWidgetsRenderer); +}()); +</script> +<style type="text/css"> + pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: var(--jp-cell-editor-active-background) } +.highlight { background: var(--jp-cell-editor-background); color: var(--jp-mirror-editor-variable-color) } +.highlight .c { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment */ +.highlight .err { color: var(--jp-mirror-editor-error-color) } /* Error */ +.highlight .k { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword */ +.highlight .o { color: var(--jp-mirror-editor-operator-color); font-weight: bold } /* Operator */ +.highlight .p { color: var(--jp-mirror-editor-punctuation-color) } /* Punctuation */ +.highlight .ch { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Preproc */ +.highlight .cpf { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Single */ +.highlight .cs { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Special */ +.highlight .kc { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Pseudo */ +.highlight .kr { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Type */ +.highlight .m { color: var(--jp-mirror-editor-number-color) } /* Literal.Number */ +.highlight .s { color: var(--jp-mirror-editor-string-color) } /* Literal.String */ +.highlight .ow { color: var(--jp-mirror-editor-operator-color); font-weight: bold } /* Operator.Word */ +.highlight .pm { color: var(--jp-mirror-editor-punctuation-color) } /* Punctuation.Marker */ +.highlight .w { color: var(--jp-mirror-editor-variable-color) } /* Text.Whitespace */ +.highlight .mb { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Bin */ +.highlight .mf { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Float */ +.highlight .mh { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Hex */ +.highlight .mi { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Integer */ +.highlight .mo { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Oct */ +.highlight .sa { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Affix */ +.highlight .sb { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Backtick */ +.highlight .sc { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Char */ +.highlight .dl { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Delimiter */ +.highlight .sd { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Doc */ +.highlight .s2 { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Double */ +.highlight .se { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Escape */ +.highlight .sh { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Heredoc */ +.highlight .si { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Interpol */ +.highlight .sx { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Other */ +.highlight .sr { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Regex */ +.highlight .s1 { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Single */ +.highlight .ss { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Symbol */ +.highlight .il { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Integer.Long */ + </style> +<style type="text/css"> +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/* + * Mozilla scrollbar styling + */ + +/* use standard opaque scrollbars for most nodes */ +[data-jp-theme-scrollbars='true'] { + scrollbar-color: rgb(var(--jp-scrollbar-thumb-color)) + var(--jp-scrollbar-background-color); +} + +/* for code nodes, use a transparent style of scrollbar. These selectors + * will match lower in the tree, and so will override the above */ +[data-jp-theme-scrollbars='true'] .CodeMirror-hscrollbar, +[data-jp-theme-scrollbars='true'] .CodeMirror-vscrollbar { + scrollbar-color: rgba(var(--jp-scrollbar-thumb-color), 0.5) transparent; +} + +/* tiny scrollbar */ + +.jp-scrollbar-tiny { + scrollbar-color: rgba(var(--jp-scrollbar-thumb-color), 0.5) transparent; + scrollbar-width: thin; +} + +/* tiny scrollbar */ + +.jp-scrollbar-tiny::-webkit-scrollbar, +.jp-scrollbar-tiny::-webkit-scrollbar-corner { + background-color: transparent; + height: 4px; + width: 4px; +} + +.jp-scrollbar-tiny::-webkit-scrollbar-thumb { + background: rgba(var(--jp-scrollbar-thumb-color), 0.5); +} + +.jp-scrollbar-tiny::-webkit-scrollbar-track:horizontal { + border-left: 0 solid transparent; + border-right: 0 solid transparent; +} + +.jp-scrollbar-tiny::-webkit-scrollbar-track:vertical { + border-top: 0 solid transparent; + border-bottom: 0 solid transparent; +} + +/* + * Lumino + */ + +.lm-ScrollBar[data-orientation='horizontal'] { + min-height: 16px; + max-height: 16px; + min-width: 45px; + border-top: 1px solid #a0a0a0; +} + +.lm-ScrollBar[data-orientation='vertical'] { + min-width: 16px; + max-width: 16px; + min-height: 45px; + border-left: 1px solid #a0a0a0; +} + +.lm-ScrollBar-button { + background-color: #f0f0f0; + background-position: center center; + min-height: 15px; + max-height: 15px; + min-width: 15px; + max-width: 15px; +} + +.lm-ScrollBar-button:hover { + background-color: #dadada; +} + +.lm-ScrollBar-button.lm-mod-active { + background-color: #cdcdcd; +} + +.lm-ScrollBar-track { + background: #f0f0f0; +} + +.lm-ScrollBar-thumb { + background: #cdcdcd; +} + +.lm-ScrollBar-thumb:hover { + background: #bababa; +} + +.lm-ScrollBar-thumb.lm-mod-active { + background: #a0a0a0; +} + +.lm-ScrollBar[data-orientation='horizontal'] .lm-ScrollBar-thumb { + height: 100%; + min-width: 15px; + border-left: 1px solid #a0a0a0; + border-right: 1px solid #a0a0a0; +} + +.lm-ScrollBar[data-orientation='vertical'] .lm-ScrollBar-thumb { + width: 100%; + min-height: 15px; + border-top: 1px solid #a0a0a0; + border-bottom: 1px solid #a0a0a0; +} + +.lm-ScrollBar[data-orientation='horizontal'] + .lm-ScrollBar-button[data-action='decrement'] { + background-image: var(--jp-icon-caret-left); + background-size: 17px; +} + +.lm-ScrollBar[data-orientation='horizontal'] + .lm-ScrollBar-button[data-action='increment'] { + background-image: var(--jp-icon-caret-right); + background-size: 17px; +} + +.lm-ScrollBar[data-orientation='vertical'] + .lm-ScrollBar-button[data-action='decrement'] { + background-image: var(--jp-icon-caret-up); + background-size: 17px; +} + +.lm-ScrollBar[data-orientation='vertical'] + .lm-ScrollBar-button[data-action='increment'] { + background-image: var(--jp-icon-caret-down); + background-size: 17px; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-Widget { + box-sizing: border-box; + position: relative; + overflow: hidden; +} + +.lm-Widget.lm-mod-hidden { + display: none !important; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +.lm-AccordionPanel[data-orientation='horizontal'] > .lm-AccordionPanel-title { + /* Title is rotated for horizontal accordion panel using CSS */ + display: block; + transform-origin: top left; + transform: rotate(-90deg) translate(-100%); +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-CommandPalette { + display: flex; + flex-direction: column; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.lm-CommandPalette-search { + flex: 0 0 auto; +} + +.lm-CommandPalette-content { + flex: 1 1 auto; + margin: 0; + padding: 0; + min-height: 0; + overflow: auto; + list-style-type: none; +} + +.lm-CommandPalette-header { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.lm-CommandPalette-item { + display: flex; + flex-direction: row; +} + +.lm-CommandPalette-itemIcon { + flex: 0 0 auto; +} + +.lm-CommandPalette-itemContent { + flex: 1 1 auto; + overflow: hidden; +} + +.lm-CommandPalette-itemShortcut { + flex: 0 0 auto; +} + +.lm-CommandPalette-itemLabel { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.lm-close-icon { + border: 1px solid transparent; + background-color: transparent; + position: absolute; + z-index: 1; + right: 3%; + top: 0; + bottom: 0; + margin: auto; + padding: 7px 0; + display: none; + vertical-align: middle; + outline: 0; + cursor: pointer; +} +.lm-close-icon:after { + content: 'X'; + display: block; + width: 15px; + height: 15px; + text-align: center; + color: #000; + font-weight: normal; + font-size: 12px; + cursor: pointer; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-DockPanel { + z-index: 0; +} + +.lm-DockPanel-widget { + z-index: 0; +} + +.lm-DockPanel-tabBar { + z-index: 1; +} + +.lm-DockPanel-handle { + z-index: 2; +} + +.lm-DockPanel-handle.lm-mod-hidden { + display: none !important; +} + +.lm-DockPanel-handle:after { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + content: ''; +} + +.lm-DockPanel-handle[data-orientation='horizontal'] { + cursor: ew-resize; +} + +.lm-DockPanel-handle[data-orientation='vertical'] { + cursor: ns-resize; +} + +.lm-DockPanel-handle[data-orientation='horizontal']:after { + left: 50%; + min-width: 8px; + transform: translateX(-50%); +} + +.lm-DockPanel-handle[data-orientation='vertical']:after { + top: 50%; + min-height: 8px; + transform: translateY(-50%); +} + +.lm-DockPanel-overlay { + z-index: 3; + box-sizing: border-box; + pointer-events: none; +} + +.lm-DockPanel-overlay.lm-mod-hidden { + display: none !important; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-Menu { + z-index: 10000; + position: absolute; + white-space: nowrap; + overflow-x: hidden; + overflow-y: auto; + outline: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.lm-Menu-content { + margin: 0; + padding: 0; + display: table; + list-style-type: none; +} + +.lm-Menu-item { + display: table-row; +} + +.lm-Menu-item.lm-mod-hidden, +.lm-Menu-item.lm-mod-collapsed { + display: none !important; +} + +.lm-Menu-itemIcon, +.lm-Menu-itemSubmenuIcon { + display: table-cell; + text-align: center; +} + +.lm-Menu-itemLabel { + display: table-cell; + text-align: left; +} + +.lm-Menu-itemShortcut { + display: table-cell; + text-align: right; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-MenuBar { + outline: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.lm-MenuBar-content { + margin: 0; + padding: 0; + display: flex; + flex-direction: row; + list-style-type: none; +} + +.lm-MenuBar-item { + box-sizing: border-box; +} + +.lm-MenuBar-itemIcon, +.lm-MenuBar-itemLabel { + display: inline-block; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-ScrollBar { + display: flex; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.lm-ScrollBar[data-orientation='horizontal'] { + flex-direction: row; +} + +.lm-ScrollBar[data-orientation='vertical'] { + flex-direction: column; +} + +.lm-ScrollBar-button { + box-sizing: border-box; + flex: 0 0 auto; +} + +.lm-ScrollBar-track { + box-sizing: border-box; + position: relative; + overflow: hidden; + flex: 1 1 auto; +} + +.lm-ScrollBar-thumb { + box-sizing: border-box; + position: absolute; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-SplitPanel-child { + z-index: 0; +} + +.lm-SplitPanel-handle { + z-index: 1; +} + +.lm-SplitPanel-handle.lm-mod-hidden { + display: none !important; +} + +.lm-SplitPanel-handle:after { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + content: ''; +} + +.lm-SplitPanel[data-orientation='horizontal'] > .lm-SplitPanel-handle { + cursor: ew-resize; +} + +.lm-SplitPanel[data-orientation='vertical'] > .lm-SplitPanel-handle { + cursor: ns-resize; +} + +.lm-SplitPanel[data-orientation='horizontal'] > .lm-SplitPanel-handle:after { + left: 50%; + min-width: 8px; + transform: translateX(-50%); +} + +.lm-SplitPanel[data-orientation='vertical'] > .lm-SplitPanel-handle:after { + top: 50%; + min-height: 8px; + transform: translateY(-50%); +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-TabBar { + display: flex; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.lm-TabBar[data-orientation='horizontal'] { + flex-direction: row; + align-items: flex-end; +} + +.lm-TabBar[data-orientation='vertical'] { + flex-direction: column; + align-items: flex-end; +} + +.lm-TabBar-content { + margin: 0; + padding: 0; + display: flex; + flex: 1 1 auto; + list-style-type: none; +} + +.lm-TabBar[data-orientation='horizontal'] > .lm-TabBar-content { + flex-direction: row; +} + +.lm-TabBar[data-orientation='vertical'] > .lm-TabBar-content { + flex-direction: column; +} + +.lm-TabBar-tab { + display: flex; + flex-direction: row; + box-sizing: border-box; + overflow: hidden; + touch-action: none; /* Disable native Drag/Drop */ +} + +.lm-TabBar-tabIcon, +.lm-TabBar-tabCloseIcon { + flex: 0 0 auto; +} + +.lm-TabBar-tabLabel { + flex: 1 1 auto; + overflow: hidden; + white-space: nowrap; +} + +.lm-TabBar-tabInput { + user-select: all; + width: 100%; + box-sizing: border-box; +} + +.lm-TabBar-tab.lm-mod-hidden { + display: none !important; +} + +.lm-TabBar-addButton.lm-mod-hidden { + display: none !important; +} + +.lm-TabBar.lm-mod-dragging .lm-TabBar-tab { + position: relative; +} + +.lm-TabBar.lm-mod-dragging[data-orientation='horizontal'] .lm-TabBar-tab { + left: 0; + transition: left 150ms ease; +} + +.lm-TabBar.lm-mod-dragging[data-orientation='vertical'] .lm-TabBar-tab { + top: 0; + transition: top 150ms ease; +} + +.lm-TabBar.lm-mod-dragging .lm-TabBar-tab.lm-mod-dragging { + transition: none; +} + +.lm-TabBar-tabLabel .lm-TabBar-tabInput { + user-select: all; + width: 100%; + box-sizing: border-box; + background: inherit; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-TabPanel-tabBar { + z-index: 1; +} + +.lm-TabPanel-stackedPanel { + z-index: 0; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-Collapse { + display: flex; + flex-direction: column; + align-items: stretch; +} + +.jp-Collapse-header { + padding: 1px 12px; + background-color: var(--jp-layout-color1); + border-bottom: solid var(--jp-border-width) var(--jp-border-color2); + color: var(--jp-ui-font-color1); + cursor: pointer; + display: flex; + align-items: center; + font-size: var(--jp-ui-font-size0); + font-weight: 600; + text-transform: uppercase; + user-select: none; +} + +.jp-Collapser-icon { + height: 16px; +} + +.jp-Collapse-header-collapsed .jp-Collapser-icon { + transform: rotate(-90deg); + margin: auto 0; +} + +.jp-Collapser-title { + line-height: 25px; +} + +.jp-Collapse-contents { + padding: 0 12px; + background-color: var(--jp-layout-color1); + color: var(--jp-ui-font-color1); + overflow: auto; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/* This file was auto-generated by ensureUiComponents() in @jupyterlab/buildutils */ + +/** + * (DEPRECATED) Support for consuming icons as CSS background images + */ + +/* Icons urls */ + +:root { + --jp-icon-add-above: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzEzN18xOTQ5MikiPgo8cGF0aCBjbGFzcz0ianAtaWNvbjMiIGQ9Ik00Ljc1IDQuOTMwNjZINi42MjVWNi44MDU2NkM2LjYyNSA3LjAxMTkxIDYuNzkzNzUgNy4xODA2NiA3IDcuMTgwNjZDNy4yMDYyNSA3LjE4MDY2IDcuMzc1IDcuMDExOTEgNy4zNzUgNi44MDU2NlY0LjkzMDY2SDkuMjVDOS40NTYyNSA0LjkzMDY2IDkuNjI1IDQuNzYxOTEgOS42MjUgNC41NTU2NkM5LjYyNSA0LjM0OTQxIDkuNDU2MjUgNC4xODA2NiA5LjI1IDQuMTgwNjZINy4zNzVWMi4zMDU2NkM3LjM3NSAyLjA5OTQxIDcuMjA2MjUgMS45MzA2NiA3IDEuOTMwNjZDNi43OTM3NSAxLjkzMDY2IDYuNjI1IDIuMDk5NDEgNi42MjUgMi4zMDU2NlY0LjE4MDY2SDQuNzVDNC41NDM3NSA0LjE4MDY2IDQuMzc1IDQuMzQ5NDEgNC4zNzUgNC41NTU2NkM0LjM3NSA0Ljc2MTkxIDQuNTQzNzUgNC45MzA2NiA0Ljc1IDQuOTMwNjZaIiBmaWxsPSIjNjE2MTYxIiBzdHJva2U9IiM2MTYxNjEiIHN0cm9rZS13aWR0aD0iMC43Ii8+CjwvZz4KPHBhdGggY2xhc3M9ImpwLWljb24zIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTExLjUgOS41VjExLjVMMi41IDExLjVWOS41TDExLjUgOS41Wk0xMiA4QzEyLjU1MjMgOCAxMyA4LjQ0NzcyIDEzIDlWMTJDMTMgMTIuNTUyMyAxMi41NTIzIDEzIDEyIDEzTDIgMTNDMS40NDc3MiAxMyAxIDEyLjU1MjMgMSAxMlY5QzEgOC40NDc3MiAxLjQ0NzcxIDggMiA4TDEyIDhaIiBmaWxsPSIjNjE2MTYxIi8+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzEzN18xOTQ5MiI+CjxyZWN0IGNsYXNzPSJqcC1pY29uMyIgd2lkdGg9IjYiIGhlaWdodD0iNiIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0ibWF0cml4KC0xIDAgMCAxIDEwIDEuNTU1NjYpIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg==); + --jp-icon-add-below: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzEzN18xOTQ5OCkiPgo8cGF0aCBjbGFzcz0ianAtaWNvbjMiIGQ9Ik05LjI1IDEwLjA2OTNMNy4zNzUgMTAuMDY5M0w3LjM3NSA4LjE5NDM0QzcuMzc1IDcuOTg4MDkgNy4yMDYyNSA3LjgxOTM0IDcgNy44MTkzNEM2Ljc5Mzc1IDcuODE5MzQgNi42MjUgNy45ODgwOSA2LjYyNSA4LjE5NDM0TDYuNjI1IDEwLjA2OTNMNC43NSAxMC4wNjkzQzQuNTQzNzUgMTAuMDY5MyA0LjM3NSAxMC4yMzgxIDQuMzc1IDEwLjQ0NDNDNC4zNzUgMTAuNjUwNiA0LjU0Mzc1IDEwLjgxOTMgNC43NSAxMC44MTkzTDYuNjI1IDEwLjgxOTNMNi42MjUgMTIuNjk0M0M2LjYyNSAxMi45MDA2IDYuNzkzNzUgMTMuMDY5MyA3IDEzLjA2OTNDNy4yMDYyNSAxMy4wNjkzIDcuMzc1IDEyLjkwMDYgNy4zNzUgMTIuNjk0M0w3LjM3NSAxMC44MTkzTDkuMjUgMTAuODE5M0M5LjQ1NjI1IDEwLjgxOTMgOS42MjUgMTAuNjUwNiA5LjYyNSAxMC40NDQzQzkuNjI1IDEwLjIzODEgOS40NTYyNSAxMC4wNjkzIDkuMjUgMTAuMDY5M1oiIGZpbGw9IiM2MTYxNjEiIHN0cm9rZT0iIzYxNjE2MSIgc3Ryb2tlLXdpZHRoPSIwLjciLz4KPC9nPgo8cGF0aCBjbGFzcz0ianAtaWNvbjMiIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMi41IDUuNUwyLjUgMy41TDExLjUgMy41TDExLjUgNS41TDIuNSA1LjVaTTIgN0MxLjQ0NzcyIDcgMSA2LjU1MjI4IDEgNkwxIDNDMSAyLjQ0NzcyIDEuNDQ3NzIgMiAyIDJMMTIgMkMxMi41NTIzIDIgMTMgMi40NDc3MiAxMyAzTDEzIDZDMTMgNi41NTIyOSAxMi41NTIzIDcgMTIgN0wyIDdaIiBmaWxsPSIjNjE2MTYxIi8+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzEzN18xOTQ5OCI+CjxyZWN0IGNsYXNzPSJqcC1pY29uMyIgd2lkdGg9IjYiIGhlaWdodD0iNiIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0ibWF0cml4KDEgMS43NDg0NmUtMDcgMS43NDg0NmUtMDcgLTEgNCAxMy40NDQzKSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=); + --jp-icon-add: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTE5IDEzaC02djZoLTJ2LTZINXYtMmg2VjVoMnY2aDZ2MnoiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-bell: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE2IDE2IiB2ZXJzaW9uPSIxLjEiPgogICA8cGF0aCBjbGFzcz0ianAtaWNvbjIganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjMzMzMzMzIgogICAgICBkPSJtOCAwLjI5Yy0xLjQgMC0yLjcgMC43My0zLjYgMS44LTEuMiAxLjUtMS40IDMuNC0xLjUgNS4yLTAuMTggMi4yLTAuNDQgNC0yLjMgNS4zbDAuMjggMS4zaDVjMC4wMjYgMC42NiAwLjMyIDEuMSAwLjcxIDEuNSAwLjg0IDAuNjEgMiAwLjYxIDIuOCAwIDAuNTItMC40IDAuNi0xIDAuNzEtMS41aDVsMC4yOC0xLjNjLTEuOS0wLjk3LTIuMi0zLjMtMi4zLTUuMy0wLjEzLTEuOC0wLjI2LTMuNy0xLjUtNS4yLTAuODUtMS0yLjItMS44LTMuNi0xLjh6bTAgMS40YzAuODggMCAxLjkgMC41NSAyLjUgMS4zIDAuODggMS4xIDEuMSAyLjcgMS4yIDQuNCAwLjEzIDEuNyAwLjIzIDMuNiAxLjMgNS4yaC0xMGMxLjEtMS42IDEuMi0zLjQgMS4zLTUuMiAwLjEzLTEuNyAwLjMtMy4zIDEuMi00LjQgMC41OS0wLjcyIDEuNi0xLjMgMi41LTEuM3ptLTAuNzQgMTJoMS41Yy0wLjAwMTUgMC4yOCAwLjAxNSAwLjc5LTAuNzQgMC43OS0wLjczIDAuMDAxNi0wLjcyLTAuNTMtMC43NC0wLjc5eiIgLz4KPC9zdmc+Cg==); + --jp-icon-bug-dot: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiM2MTYxNjEiPgogICAgICAgIDxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTcuMTkgOEgyMFYxMEgxNy45MUMxNy45NiAxMC4zMyAxOCAxMC42NiAxOCAxMVYxMkgyMFYxNEgxOC41SDE4VjE0LjAyNzVDMTUuNzUgMTQuMjc2MiAxNCAxNi4xODM3IDE0IDE4LjVDMTQgMTkuMjA4IDE0LjE2MzUgMTkuODc3OSAxNC40NTQ5IDIwLjQ3MzlDMTMuNzA2MyAyMC44MTE3IDEyLjg3NTcgMjEgMTIgMjFDOS43OCAyMSA3Ljg1IDE5Ljc5IDYuODEgMThINFYxNkg2LjA5QzYuMDQgMTUuNjcgNiAxNS4zNCA2IDE1VjE0SDRWMTJINlYxMUM2IDEwLjY2IDYuMDQgMTAuMzMgNi4wOSAxMEg0VjhINi44MUM3LjI2IDcuMjIgNy44OCA2LjU1IDguNjIgNi4wNEw3IDQuNDFMOC40MSAzTDEwLjU5IDUuMTdDMTEuMDQgNS4wNiAxMS41MSA1IDEyIDVDMTIuNDkgNSAxMi45NiA1LjA2IDEzLjQyIDUuMTdMMTUuNTkgM0wxNyA0LjQxTDE1LjM3IDYuMDRDMTYuMTIgNi41NSAxNi43NCA3LjIyIDE3LjE5IDhaTTEwIDE2SDE0VjE0SDEwVjE2Wk0xMCAxMkgxNFYxMEgxMFYxMloiIGZpbGw9IiM2MTYxNjEiLz4KICAgICAgICA8cGF0aCBkPSJNMjIgMTguNUMyMiAyMC40MzMgMjAuNDMzIDIyIDE4LjUgMjJDMTYuNTY3IDIyIDE1IDIwLjQzMyAxNSAxOC41QzE1IDE2LjU2NyAxNi41NjcgMTUgMTguNSAxNUMyMC40MzMgMTUgMjIgMTYuNTY3IDIyIDE4LjVaIiBmaWxsPSIjNjE2MTYxIi8+CiAgICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-bug: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxwYXRoIGQ9Ik0yMCA4aC0yLjgxYy0uNDUtLjc4LTEuMDctMS40NS0xLjgyLTEuOTZMMTcgNC40MSAxNS41OSAzbC0yLjE3IDIuMTdDMTIuOTYgNS4wNiAxMi40OSA1IDEyIDVjLS40OSAwLS45Ni4wNi0xLjQxLjE3TDguNDEgMyA3IDQuNDFsMS42MiAxLjYzQzcuODggNi41NSA3LjI2IDcuMjIgNi44MSA4SDR2MmgyLjA5Yy0uMDUuMzMtLjA5LjY2LS4wOSAxdjFINHYyaDJ2MWMwIC4zNC4wNC42Ny4wOSAxSDR2MmgyLjgxYzEuMDQgMS43OSAyLjk3IDMgNS4xOSAzczQuMTUtMS4yMSA1LjE5LTNIMjB2LTJoLTIuMDljLjA1LS4zMy4wOS0uNjYuMDktMXYtMWgydi0yaC0ydi0xYzAtLjM0LS4wNC0uNjctLjA5LTFIMjBWOHptLTYgOGgtNHYtMmg0djJ6bTAtNGgtNHYtMmg0djJ6Ii8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-build: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTE0LjkgMTcuNDVDMTYuMjUgMTcuNDUgMTcuMzUgMTYuMzUgMTcuMzUgMTVDMTcuMzUgMTMuNjUgMTYuMjUgMTIuNTUgMTQuOSAxMi41NUMxMy41NCAxMi41NSAxMi40NSAxMy42NSAxMi40NSAxNUMxMi40NSAxNi4zNSAxMy41NCAxNy40NSAxNC45IDE3LjQ1Wk0yMC4xIDE1LjY4TDIxLjU4IDE2Ljg0QzIxLjcxIDE2Ljk1IDIxLjc1IDE3LjEzIDIxLjY2IDE3LjI5TDIwLjI2IDE5LjcxQzIwLjE3IDE5Ljg2IDIwIDE5LjkyIDE5LjgzIDE5Ljg2TDE4LjA5IDE5LjE2QzE3LjczIDE5LjQ0IDE3LjMzIDE5LjY3IDE2LjkxIDE5Ljg1TDE2LjY0IDIxLjdDMTYuNjIgMjEuODcgMTYuNDcgMjIgMTYuMyAyMkgxMy41QzEzLjMyIDIyIDEzLjE4IDIxLjg3IDEzLjE1IDIxLjdMMTIuODkgMTkuODVDMTIuNDYgMTkuNjcgMTIuMDcgMTkuNDQgMTEuNzEgMTkuMTZMOS45NjAwMiAxOS44NkM5LjgxMDAyIDE5LjkyIDkuNjIwMDIgMTkuODYgOS41NDAwMiAxOS43MUw4LjE0MDAyIDE3LjI5QzguMDUwMDIgMTcuMTMgOC4wOTAwMiAxNi45NSA4LjIyMDAyIDE2Ljg0TDkuNzAwMDIgMTUuNjhMOS42NTAwMSAxNUw5LjcwMDAyIDE0LjMxTDguMjIwMDIgMTMuMTZDOC4wOTAwMiAxMy4wNSA4LjA1MDAyIDEyLjg2IDguMTQwMDIgMTIuNzFMOS41NDAwMiAxMC4yOUM5LjYyMDAyIDEwLjEzIDkuODEwMDIgMTAuMDcgOS45NjAwMiAxMC4xM0wxMS43MSAxMC44NEMxMi4wNyAxMC41NiAxMi40NiAxMC4zMiAxMi44OSAxMC4xNUwxMy4xNSA4LjI4OTk4QzEzLjE4IDguMTI5OTggMTMuMzIgNy45OTk5OCAxMy41IDcuOTk5OThIMTYuM0MxNi40NyA3Ljk5OTk4IDE2LjYyIDguMTI5OTggMTYuNjQgOC4yODk5OEwxNi45MSAxMC4xNUMxNy4zMyAxMC4zMiAxNy43MyAxMC41NiAxOC4wOSAxMC44NEwxOS44MyAxMC4xM0MyMCAxMC4wNyAyMC4xNyAxMC4xMyAyMC4yNiAxMC4yOUwyMS42NiAxMi43MUMyMS43NSAxMi44NiAyMS43MSAxMy4wNSAyMS41OCAxMy4xNkwyMC4xIDE0LjMxTDIwLjE1IDE1TDIwLjEgMTUuNjhaIi8+CiAgICA8cGF0aCBkPSJNNy4zMjk2NiA3LjQ0NDU0QzguMDgzMSA3LjAwOTU0IDguMzM5MzIgNi4wNTMzMiA3LjkwNDMyIDUuMjk5ODhDNy40NjkzMiA0LjU0NjQzIDYuNTA4MSA0LjI4MTU2IDUuNzU0NjYgNC43MTY1NkM1LjM5MTc2IDQuOTI2MDggNS4xMjY5NSA1LjI3MTE4IDUuMDE4NDkgNS42NzU5NEM0LjkxMDA0IDYuMDgwNzEgNC45NjY4MiA2LjUxMTk4IDUuMTc2MzQgNi44NzQ4OEM1LjYxMTM0IDcuNjI4MzIgNi41NzYyMiA3Ljg3OTU0IDcuMzI5NjYgNy40NDQ1NFpNOS42NTcxOCA0Ljc5NTkzTDEwLjg2NzIgNC45NTE3OUMxMC45NjI4IDQuOTc3NDEgMTEuMDQwMiA1LjA3MTMzIDExLjAzODIgNS4xODc5M0wxMS4wMzg4IDYuOTg4OTNDMTEuMDQ1NSA3LjEwMDU0IDEwLjk2MTYgNy4xOTUxOCAxMC44NTUgNy4yMTA1NEw5LjY2MDAxIDcuMzgwODNMOS4yMzkxNSA4LjEzMTg4TDkuNjY5NjEgOS4yNTc0NUM5LjcwNzI5IDkuMzYyNzEgOS42NjkzNCA5LjQ3Njk5IDkuNTc0MDggOS41MzE5OUw4LjAxNTIzIDEwLjQzMkM3LjkxMTMxIDEwLjQ5MiA3Ljc5MzM3IDEwLjQ2NzcgNy43MjEwNSAxMC4zODI0TDYuOTg3NDggOS40MzE4OEw2LjEwOTMxIDkuNDMwODNMNS4zNDcwNCAxMC4zOTA1QzUuMjg5MDkgMTAuNDcwMiA1LjE3MzgzIDEwLjQ5MDUgNS4wNzE4NyAxMC40MzM5TDMuNTEyNDUgOS41MzI5M0MzLjQxMDQ5IDkuNDc2MzMgMy4zNzY0NyA5LjM1NzQxIDMuNDEwNzUgOS4yNTY3OUwzLjg2MzQ3IDguMTQwOTNMMy42MTc0OSA3Ljc3NDg4TDMuNDIzNDcgNy4zNzg4M0wyLjIzMDc1IDcuMjEyOTdDMi4xMjY0NyA3LjE5MjM1IDIuMDQwNDkgNy4xMDM0MiAyLjA0MjQ1IDYuOTg2ODJMMi4wNDE4NyA1LjE4NTgyQzIuMDQzODMgNS4wNjkyMiAyLjExOTA5IDQuOTc5NTggMi4yMTcwNCA0Ljk2OTIyTDMuNDIwNjUgNC43OTM5M0wzLjg2NzQ5IDQuMDI3ODhMMy40MTEwNSAyLjkxNzMxQzMuMzczMzcgMi44MTIwNCAzLjQxMTMxIDIuNjk3NzYgMy41MTUyMyAyLjYzNzc2TDUuMDc0MDggMS43Mzc3NkM1LjE2OTM0IDEuNjgyNzYgNS4yODcyOSAxLjcwNzA0IDUuMzU5NjEgMS43OTIzMUw2LjExOTE1IDIuNzI3ODhMNi45ODAwMSAyLjczODkzTDcuNzI0OTYgMS43ODkyMkM3Ljc5MTU2IDEuNzA0NTggNy45MTU0OCAxLjY3OTIyIDguMDA4NzkgMS43NDA4Mkw5LjU2ODIxIDIuNjQxODJDOS42NzAxNyAyLjY5ODQyIDkuNzEyODUgMi44MTIzNCA5LjY4NzIzIDIuOTA3OTdMOS4yMTcxOCA0LjAzMzgzTDkuNDYzMTYgNC4zOTk4OEw5LjY1NzE4IDQuNzk1OTNaIi8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-caret-down-empty-thin: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iPgoJCTxwb2x5Z29uIGNsYXNzPSJzdDEiIHBvaW50cz0iOS45LDEzLjYgMy42LDcuNCA0LjQsNi42IDkuOSwxMi4yIDE1LjQsNi43IDE2LjEsNy40ICIvPgoJPC9nPgo8L3N2Zz4K); + --jp-icon-caret-down-empty: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIj4KICAgIDxwYXRoIGQ9Ik01LjIsNS45TDksOS43bDMuOC0zLjhsMS4yLDEuMmwtNC45LDVsLTQuOS01TDUuMiw1Ljl6Ii8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-caret-down: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIj4KICAgIDxwYXRoIGQ9Ik01LjIsNy41TDksMTEuMmwzLjgtMy44SDUuMnoiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-caret-left: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iPgoJCTxwYXRoIGQ9Ik0xMC44LDEyLjhMNy4xLDlsMy44LTMuOGwwLDcuNkgxMC44eiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-caret-right: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIj4KICAgIDxwYXRoIGQ9Ik03LjIsNS4yTDEwLjksOWwtMy44LDMuOFY1LjJINy4yeiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-caret-up-empty-thin: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iPgoJCTxwb2x5Z29uIGNsYXNzPSJzdDEiIHBvaW50cz0iMTUuNCwxMy4zIDkuOSw3LjcgNC40LDEzLjIgMy42LDEyLjUgOS45LDYuMyAxNi4xLDEyLjYgIi8+Cgk8L2c+Cjwvc3ZnPgo=); + --jp-icon-caret-up: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iPgoJCTxwYXRoIGQ9Ik01LjIsMTAuNUw5LDYuOGwzLjgsMy44SDUuMnoiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-case-sensitive: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICA8ZyBjbGFzcz0ianAtaWNvbjIiIGZpbGw9IiM0MTQxNDEiPgogICAgPHJlY3QgeD0iMiIgeT0iMiIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ii8+CiAgPC9nPgogIDxnIGNsYXNzPSJqcC1pY29uLWFjY2VudDIiIGZpbGw9IiNGRkYiPgogICAgPHBhdGggZD0iTTcuNiw4aDAuOWwzLjUsOGgtMS4xTDEwLDE0SDZsLTAuOSwySDRMNy42LDh6IE04LDkuMUw2LjQsMTNoMy4yTDgsOS4xeiIvPgogICAgPHBhdGggZD0iTTE2LjYsOS44Yy0wLjIsMC4xLTAuNCwwLjEtMC43LDAuMWMtMC4yLDAtMC40LTAuMS0wLjYtMC4yYy0wLjEtMC4xLTAuMi0wLjQtMC4yLTAuNyBjLTAuMywwLjMtMC42LDAuNS0wLjksMC43Yy0wLjMsMC4xLTAuNywwLjItMS4xLDAuMmMtMC4zLDAtMC41LDAtMC43LTAuMWMtMC4yLTAuMS0wLjQtMC4yLTAuNi0wLjNjLTAuMi0wLjEtMC4zLTAuMy0wLjQtMC41IGMtMC4xLTAuMi0wLjEtMC40LTAuMS0wLjdjMC0wLjMsMC4xLTAuNiwwLjItMC44YzAuMS0wLjIsMC4zLTAuNCwwLjQtMC41QzEyLDcsMTIuMiw2LjksMTIuNSw2LjhjMC4yLTAuMSwwLjUtMC4xLDAuNy0wLjIgYzAuMy0wLjEsMC41LTAuMSwwLjctMC4xYzAuMiwwLDAuNC0wLjEsMC42LTAuMWMwLjIsMCwwLjMtMC4xLDAuNC0wLjJjMC4xLTAuMSwwLjItMC4yLDAuMi0wLjRjMC0xLTEuMS0xLTEuMy0xIGMtMC40LDAtMS40LDAtMS40LDEuMmgtMC45YzAtMC40LDAuMS0wLjcsMC4yLTFjMC4xLTAuMiwwLjMtMC40LDAuNS0wLjZjMC4yLTAuMiwwLjUtMC4zLDAuOC0wLjNDMTMuMyw0LDEzLjYsNCwxMy45LDQgYzAuMywwLDAuNSwwLDAuOCwwLjFjMC4zLDAsMC41LDAuMSwwLjcsMC4yYzAuMiwwLjEsMC40LDAuMywwLjUsMC41QzE2LDUsMTYsNS4yLDE2LDUuNnYyLjljMCwwLjIsMCwwLjQsMCwwLjUgYzAsMC4xLDAuMSwwLjIsMC4zLDAuMmMwLjEsMCwwLjIsMCwwLjMsMFY5Ljh6IE0xNS4yLDYuOWMtMS4yLDAuNi0zLjEsMC4yLTMuMSwxLjRjMCwxLjQsMy4xLDEsMy4xLTAuNVY2Ljl6Ii8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-check: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxwYXRoIGQ9Ik05IDE2LjE3TDQuODMgMTJsLTEuNDIgMS40MUw5IDE5IDIxIDdsLTEuNDEtMS40MXoiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-circle-empty: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTEyIDJDNi40NyAyIDIgNi40NyAyIDEyczQuNDcgMTAgMTAgMTAgMTAtNC40NyAxMC0xMFMxNy41MyAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-circle: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTggMTgiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPGNpcmNsZSBjeD0iOSIgY3k9IjkiIHI9IjgiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-clear: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8bWFzayBpZD0iZG9udXRIb2xlIj4KICAgIDxyZWN0IHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0id2hpdGUiIC8+CiAgICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI4IiBmaWxsPSJibGFjayIvPgogIDwvbWFzaz4KCiAgPGcgY2xhc3M9ImpwLWljb24zIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxyZWN0IGhlaWdodD0iMTgiIHdpZHRoPSIyIiB4PSIxMSIgeT0iMyIgdHJhbnNmb3JtPSJyb3RhdGUoMzE1LCAxMiwgMTIpIi8+CiAgICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgbWFzaz0idXJsKCNkb251dEhvbGUpIi8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-close: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbi1ub25lIGpwLWljb24tc2VsZWN0YWJsZS1pbnZlcnNlIGpwLWljb24zLWhvdmVyIiBmaWxsPSJub25lIj4KICAgIDxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjExIi8+CiAgPC9nPgoKICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIGpwLWljb24tYWNjZW50Mi1ob3ZlciIgZmlsbD0iIzYxNjE2MSI+CiAgICA8cGF0aCBkPSJNMTkgNi40MUwxNy41OSA1IDEyIDEwLjU5IDYuNDEgNSA1IDYuNDEgMTAuNTkgMTIgNSAxNy41OSA2LjQxIDE5IDEyIDEzLjQxIDE3LjU5IDE5IDE5IDE3LjU5IDEzLjQxIDEyeiIvPgogIDwvZz4KCiAgPGcgY2xhc3M9ImpwLWljb24tbm9uZSBqcC1pY29uLWJ1c3kiIGZpbGw9Im5vbmUiPgogICAgPGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iNyIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-code-check: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBzaGFwZS1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiI+CiAgICA8cGF0aCBkPSJNNi41OSwzLjQxTDIsOEw2LjU5LDEyLjZMOCwxMS4xOEw0LjgyLDhMOCw0LjgyTDYuNTksMy40MU0xMi40MSwzLjQxTDExLDQuODJMMTQuMTgsOEwxMSwxMS4xOEwxMi40MSwxMi42TDE3LDhMMTIuNDEsMy40MU0yMS41OSwxMS41OUwxMy41LDE5LjY4TDkuODMsMTZMOC40MiwxNy40MUwxMy41LDIyLjVMMjMsMTNMMjEuNTksMTEuNTlaIiAvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-code: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjIiIGhlaWdodD0iMjIiIHZpZXdCb3g9IjAgMCAyOCAyOCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CgkJPHBhdGggZD0iTTExLjQgMTguNkw2LjggMTRMMTEuNCA5LjRMMTAgOEw0IDE0TDEwIDIwTDExLjQgMTguNlpNMTYuNiAxOC42TDIxLjIgMTRMMTYuNiA5LjRMMTggOEwyNCAxNEwxOCAyMEwxNi42IDE4LjZWMTguNloiLz4KCTwvZz4KPC9zdmc+Cg==); + --jp-icon-collapse-all: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgZD0iTTggMmMxIDAgMTEgMCAxMiAwczIgMSAyIDJjMCAxIDAgMTEgMCAxMnMwIDItMiAyQzIwIDE0IDIwIDQgMjAgNFMxMCA0IDYgNGMwLTIgMS0yIDItMnoiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgZD0iTTE4IDhjMC0xLTEtMi0yLTJTNSA2IDQgNnMtMiAxLTIgMmMwIDEgMCAxMSAwIDEyczEgMiAyIDJjMSAwIDExIDAgMTIgMHMyLTEgMi0yYzAtMSAwLTExIDAtMTJ6bS0yIDB2MTJINFY4eiIgLz4KICAgICAgICA8cGF0aCBkPSJNNiAxM3YyaDh2LTJ6IiAvPgogICAgPC9nPgo8L3N2Zz4K); + --jp-icon-console: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwMCAyMDAiPgogIDxnIGNsYXNzPSJqcC1jb25zb2xlLWljb24tYmFja2dyb3VuZC1jb2xvciBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiMwMjg4RDEiPgogICAgPHBhdGggZD0iTTIwIDE5LjhoMTYwdjE1OS45SDIweiIvPgogIDwvZz4KICA8ZyBjbGFzcz0ianAtY29uc29sZS1pY29uLWNvbG9yIGpwLWljb24tc2VsZWN0YWJsZS1pbnZlcnNlIiBmaWxsPSIjZmZmIj4KICAgIDxwYXRoIGQ9Ik0xMDUgMTI3LjNoNDB2MTIuOGgtNDB6TTUxLjEgNzdMNzQgOTkuOWwtMjMuMyAyMy4zIDEwLjUgMTAuNSAyMy4zLTIzLjNMOTUgOTkuOSA4NC41IDg5LjQgNjEuNiA2Ni41eiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-copy: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTggMTgiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTExLjksMUgzLjJDMi40LDEsMS43LDEuNywxLjcsMi41djEwLjJoMS41VjIuNWg4LjdWMXogTTE0LjEsMy45aC04Yy0wLjgsMC0xLjUsMC43LTEuNSwxLjV2MTAuMmMwLDAuOCwwLjcsMS41LDEuNSwxLjVoOCBjMC44LDAsMS41LTAuNywxLjUtMS41VjUuNEMxNS41LDQuNiwxNC45LDMuOSwxNC4xLDMuOXogTTE0LjEsMTUuNWgtOFY1LjRoOFYxNS41eiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-copyright: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCI+CiAgPGcgY2xhc3M9ImpwLWljb24zIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxwYXRoIGQ9Ik0xMS44OCw5LjE0YzEuMjgsMC4wNiwxLjYxLDEuMTUsMS42MywxLjY2aDEuNzljLTAuMDgtMS45OC0xLjQ5LTMuMTktMy40NS0zLjE5QzkuNjQsNy42MSw4LDksOCwxMi4xNCBjMCwxLjk0LDAuOTMsNC4yNCwzLjg0LDQuMjRjMi4yMiwwLDMuNDEtMS42NSwzLjQ0LTIuOTVoLTEuNzljLTAuMDMsMC41OS0wLjQ1LDEuMzgtMS42MywxLjQ0QzEwLjU1LDE0LjgzLDEwLDEzLjgxLDEwLDEyLjE0IEMxMCw5LjI1LDExLjI4LDkuMTYsMTEuODgsOS4xNHogTTEyLDJDNi40OCwyLDIsNi40OCwyLDEyczQuNDgsMTAsMTAsMTBzMTAtNC40OCwxMC0xMFMxNy41MiwyLDEyLDJ6IE0xMiwyMGMtNC40MSwwLTgtMy41OS04LTggczMuNTktOCw4LThzOCwzLjU5LDgsOFMxNi40MSwyMCwxMiwyMHoiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-cut: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTkuNjQgNy42NGMuMjMtLjUuMzYtMS4wNS4zNi0xLjY0IDAtMi4yMS0xLjc5LTQtNC00UzIgMy43OSAyIDZzMS43OSA0IDQgNGMuNTkgMCAxLjE0LS4xMyAxLjY0LS4zNkwxMCAxMmwtMi4zNiAyLjM2QzcuMTQgMTQuMTMgNi41OSAxNCA2IDE0Yy0yLjIxIDAtNCAxLjc5LTQgNHMxLjc5IDQgNCA0IDQtMS43OSA0LTRjMC0uNTktLjEzLTEuMTQtLjM2LTEuNjRMMTIgMTRsNyA3aDN2LTFMOS42NCA3LjY0ek02IDhjLTEuMSAwLTItLjg5LTItMnMuOS0yIDItMiAyIC44OSAyIDItLjkgMi0yIDJ6bTAgMTJjLTEuMSAwLTItLjg5LTItMnMuOS0yIDItMiAyIC44OSAyIDItLjkgMi0yIDJ6bTYtNy41Yy0uMjggMC0uNS0uMjItLjUtLjVzLjIyLS41LjUtLjUuNS4yMi41LjUtLjIyLjUtLjUuNXpNMTkgM2wtNiA2IDIgMiA3LTdWM3oiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-delete: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2cHgiIGhlaWdodD0iMTZweCI+CiAgICA8cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIiAvPgogICAgPHBhdGggY2xhc3M9ImpwLWljb24zIiBmaWxsPSIjNjI2MjYyIiBkPSJNNiAxOWMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJWN0g2djEyek0xOSA0aC0zLjVsLTEtMWgtNWwtMSAxSDV2MmgxNFY0eiIgLz4KPC9zdmc+Cg==); + --jp-icon-download: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTE5IDloLTRWM0g5djZINWw3IDcgNy03ek01IDE4djJoMTR2LTJINXoiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-duplicate: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggY2xhc3M9ImpwLWljb24zIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTIuNzk5OTggMC44NzVIOC44OTU4MkM5LjIwMDYxIDAuODc1IDkuNDQ5OTggMS4xMzkxNCA5LjQ0OTk4IDEuNDYxOThDOS40NDk5OCAxLjc4NDgyIDkuMjAwNjEgMi4wNDg5NiA4Ljg5NTgyIDIuMDQ4OTZIMy4zNTQxNUMzLjA0OTM2IDIuMDQ4OTYgMi43OTk5OCAyLjMxMzEgMi43OTk5OCAyLjYzNTk0VjkuNjc5NjlDMi43OTk5OCAxMC4wMDI1IDIuNTUwNjEgMTAuMjY2NyAyLjI0NTgyIDEwLjI2NjdDMS45NDEwMyAxMC4yNjY3IDEuNjkxNjUgMTAuMDAyNSAxLjY5MTY1IDkuNjc5NjlWMi4wNDg5NkMxLjY5MTY1IDEuNDAzMjggMi4xOTA0IDAuODc1IDIuNzk5OTggMC44NzVaTTUuMzY2NjUgMTEuOVY0LjU1SDExLjA4MzNWMTEuOUg1LjM2NjY1Wk00LjE0MTY1IDQuMTQxNjdDNC4xNDE2NSAzLjY5MDYzIDQuNTA3MjggMy4zMjUgNC45NTgzMiAzLjMyNUgxMS40OTE3QzExLjk0MjcgMy4zMjUgMTIuMzA4MyAzLjY5MDYzIDEyLjMwODMgNC4xNDE2N1YxMi4zMDgzQzEyLjMwODMgMTIuNzU5NCAxMS45NDI3IDEzLjEyNSAxMS40OTE3IDEzLjEyNUg0Ljk1ODMyQzQuNTA3MjggMTMuMTI1IDQuMTQxNjUgMTIuNzU5NCA0LjE0MTY1IDEyLjMwODNWNC4xNDE2N1oiIGZpbGw9IiM2MTYxNjEiLz4KPHBhdGggY2xhc3M9ImpwLWljb24zIiBkPSJNOS40MzU3NCA4LjI2NTA3SDguMzY0MzFWOS4zMzY1QzguMzY0MzEgOS40NTQzNSA4LjI2Nzg4IDkuNTUwNzggOC4xNTAwMiA5LjU1MDc4QzguMDMyMTcgOS41NTA3OCA3LjkzNTc0IDkuNDU0MzUgNy45MzU3NCA5LjMzNjVWOC4yNjUwN0g2Ljg2NDMxQzYuNzQ2NDUgOC4yNjUwNyA2LjY1MDAyIDguMTY4NjQgNi42NTAwMiA4LjA1MDc4QzYuNjUwMDIgNy45MzI5MiA2Ljc0NjQ1IDcuODM2NSA2Ljg2NDMxIDcuODM2NUg3LjkzNTc0VjYuNzY1MDdDNy45MzU3NCA2LjY0NzIxIDguMDMyMTcgNi41NTA3OCA4LjE1MDAyIDYuNTUwNzhDOC4yNjc4OCA2LjU1MDc4IDguMzY0MzEgNi42NDcyMSA4LjM2NDMxIDYuNzY1MDdWNy44MzY1SDkuNDM1NzRDOS41NTM2IDcuODM2NSA5LjY1MDAyIDcuOTMyOTIgOS42NTAwMiA4LjA1MDc4QzkuNjUwMDIgOC4xNjg2NCA5LjU1MzYgOC4yNjUwNyA5LjQzNTc0IDguMjY1MDdaIiBmaWxsPSIjNjE2MTYxIiBzdHJva2U9IiM2MTYxNjEiIHN0cm9rZS13aWR0aD0iMC41Ii8+Cjwvc3ZnPgo=); + --jp-icon-edit: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTMgMTcuMjVWMjFoMy43NUwxNy44MSA5Ljk0bC0zLjc1LTMuNzVMMyAxNy4yNXpNMjAuNzEgNy4wNGMuMzktLjM5LjM5LTEuMDIgMC0xLjQxbC0yLjM0LTIuMzRjLS4zOS0uMzktMS4wMi0uMzktMS40MSAwbC0xLjgzIDEuODMgMy43NSAzLjc1IDEuODMtMS44M3oiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-ellipses: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPGNpcmNsZSBjeD0iNSIgY3k9IjEyIiByPSIyIi8+CiAgICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIyIi8+CiAgICA8Y2lyY2xlIGN4PSIxOSIgY3k9IjEyIiByPSIyIi8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-error: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KPGcgY2xhc3M9ImpwLWljb24zIiBmaWxsPSIjNjE2MTYxIj48Y2lyY2xlIGN4PSIxMiIgY3k9IjE5IiByPSIyIi8+PHBhdGggZD0iTTEwIDNoNHYxMmgtNHoiLz48L2c+CjxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0wIDBoMjR2MjRIMHoiLz4KPC9zdmc+Cg==); + --jp-icon-expand-all: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgZD0iTTggMmMxIDAgMTEgMCAxMiAwczIgMSAyIDJjMCAxIDAgMTEgMCAxMnMwIDItMiAyQzIwIDE0IDIwIDQgMjAgNFMxMCA0IDYgNGMwLTIgMS0yIDItMnoiIC8+CiAgICAgICAgPHBhdGgKICAgICAgICAgICAgZD0iTTE4IDhjMC0xLTEtMi0yLTJTNSA2IDQgNnMtMiAxLTIgMmMwIDEgMCAxMSAwIDEyczEgMiAyIDJjMSAwIDExIDAgMTIgMHMyLTEgMi0yYzAtMSAwLTExIDAtMTJ6bS0yIDB2MTJINFY4eiIgLz4KICAgICAgICA8cGF0aCBkPSJNMTEgMTBIOXYzSDZ2MmgzdjNoMnYtM2gzdi0yaC0zeiIgLz4KICAgIDwvZz4KPC9zdmc+Cg==); + --jp-icon-extension: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTIwLjUgMTFIMTlWN2MwLTEuMS0uOS0yLTItMmgtNFYzLjVDMTMgMi4xMiAxMS44OCAxIDEwLjUgMVM4IDIuMTIgOCAzLjVWNUg0Yy0xLjEgMC0xLjk5LjktMS45OSAydjMuOEgzLjVjMS40OSAwIDIuNyAxLjIxIDIuNyAyLjdzLTEuMjEgMi43LTIuNyAyLjdIMlYyMGMwIDEuMS45IDIgMiAyaDMuOHYtMS41YzAtMS40OSAxLjIxLTIuNyAyLjctMi43IDEuNDkgMCAyLjcgMS4yMSAyLjcgMi43VjIySDE3YzEuMSAwIDItLjkgMi0ydi00aDEuNWMxLjM4IDAgMi41LTEuMTIgMi41LTIuNVMyMS44OCAxMSAyMC41IDExeiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-fast-forward: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTQgMThsOC41LTZMNCA2djEyem05LTEydjEybDguNS02TDEzIDZ6Ii8+CiAgICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-file-upload: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTkgMTZoNnYtNmg0bC03LTctNyA3aDR6bS00IDJoMTR2Mkg1eiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-file: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8cGF0aCBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMTkuMyA4LjJsLTUuNS01LjVjLS4zLS4zLS43LS41LTEuMi0uNUgzLjljLS44LjEtMS42LjktMS42IDEuOHYxNC4xYzAgLjkuNyAxLjYgMS42IDEuNmgxNC4yYy45IDAgMS42LS43IDEuNi0xLjZWOS40Yy4xLS41LS4xLS45LS40LTEuMnptLTUuOC0zLjNsMy40IDMuNmgtMy40VjQuOXptMy45IDEyLjdINC43Yy0uMSAwLS4yIDAtLjItLjJWNC43YzAtLjIuMS0uMy4yLS4zaDcuMnY0LjRzMCAuOC4zIDEuMWMuMy4zIDEuMS4zIDEuMS4zaDQuM3Y3LjJzLS4xLjItLjIuMnoiLz4KPC9zdmc+Cg==); + --jp-icon-filter-dot: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiNGRkYiPgogICAgPHBhdGggZD0iTTE0LDEyVjE5Ljg4QzE0LjA0LDIwLjE4IDEzLjk0LDIwLjUgMTMuNzEsMjAuNzFDMTMuMzIsMjEuMSAxMi42OSwyMS4xIDEyLjMsMjAuNzFMMTAuMjksMTguN0MxMC4wNiwxOC40NyA5Ljk2LDE4LjE2IDEwLDE3Ljg3VjEySDkuOTdMNC4yMSw0LjYyQzMuODcsNC4xOSAzLjk1LDMuNTYgNC4zOCwzLjIyQzQuNTcsMy4wOCA0Ljc4LDMgNSwzVjNIMTlWM0MxOS4yMiwzIDE5LjQzLDMuMDggMTkuNjIsMy4yMkMyMC4wNSwzLjU2IDIwLjEzLDQuMTkgMTkuNzksNC42MkwxNC4wMywxMkgxNFoiIC8+CiAgPC9nPgogIDxnIGNsYXNzPSJqcC1pY29uLWRvdCIgZmlsbD0iI0ZGRiI+CiAgICA8Y2lyY2xlIGN4PSIxOCIgY3k9IjE3IiByPSIzIj48L2NpcmNsZT4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-filter-list: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTEwIDE4aDR2LTJoLTR2MnpNMyA2djJoMThWNkgzem0zIDdoMTJ2LTJINnYyeiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-filter: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiNGRkYiPgogICAgPHBhdGggZD0iTTE0LDEyVjE5Ljg4QzE0LjA0LDIwLjE4IDEzLjk0LDIwLjUgMTMuNzEsMjAuNzFDMTMuMzIsMjEuMSAxMi42OSwyMS4xIDEyLjMsMjAuNzFMMTAuMjksMTguN0MxMC4wNiwxOC40NyA5Ljk2LDE4LjE2IDEwLDE3Ljg3VjEySDkuOTdMNC4yMSw0LjYyQzMuODcsNC4xOSAzLjk1LDMuNTYgNC4zOCwzLjIyQzQuNTcsMy4wOCA0Ljc4LDMgNSwzVjNIMTlWM0MxOS4yMiwzIDE5LjQzLDMuMDggMTkuNjIsMy4yMkMyMC4wNSwzLjU2IDIwLjEzLDQuMTkgMTkuNzksNC42MkwxNC4wMywxMkgxNFoiIC8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-folder-favorite: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzAwMDAwMCI+CiAgPHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggY2xhc3M9ImpwLWljb24zIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iIzYxNjE2MSIgZD0iTTIwIDZoLThsLTItMkg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6bS0yLjA2IDExTDE1IDE1LjI4IDEyLjA2IDE3bC43OC0zLjMzLTIuNTktMi4yNCAzLjQxLS4yOUwxNSA4bDEuMzQgMy4xNCAzLjQxLjI5LTIuNTkgMi4yNC43OCAzLjMzeiIvPgo8L3N2Zz4K); + --jp-icon-folder: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMTAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY4YzAtMS4xLS45LTItMi0yaC04bC0yLTJ6Ii8+Cjwvc3ZnPgo=); + --jp-icon-home: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjRweCIgZmlsbD0iIzAwMDAwMCI+CiAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGNsYXNzPSJqcC1pY29uMyBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiM2MTYxNjEiIGQ9Ik0xMCAyMHYtNmg0djZoNXYtOGgzTDEyIDMgMiAxMmgzdjh6Ii8+Cjwvc3ZnPgo=); + --jp-icon-html5: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDUxMiA1MTIiPgogIDxwYXRoIGNsYXNzPSJqcC1pY29uMCBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiMwMDAiIGQ9Ik0xMDguNCAwaDIzdjIyLjhoMjEuMlYwaDIzdjY5aC0yM1Y0NmgtMjF2MjNoLTIzLjJNMjA2IDIzaC0yMC4zVjBoNjMuN3YyM0gyMjl2NDZoLTIzbTUzLjUtNjloMjQuMWwxNC44IDI0LjNMMzEzLjIgMGgyNC4xdjY5aC0yM1YzNC44bC0xNi4xIDI0LjgtMTYuMS0yNC44VjY5aC0yMi42bTg5LjItNjloMjN2NDYuMmgzMi42VjY5aC01NS42Ii8+CiAgPHBhdGggY2xhc3M9ImpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iI2U0NGQyNiIgZD0iTTEwNy42IDQ3MWwtMzMtMzcwLjRoMzYyLjhsLTMzIDM3MC4yTDI1NS43IDUxMiIvPgogIDxwYXRoIGNsYXNzPSJqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiNmMTY1MjkiIGQ9Ik0yNTYgNDgwLjVWMTMxaDE0OC4zTDM3NiA0NDciLz4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1zZWxlY3RhYmxlLWludmVyc2UiIGZpbGw9IiNlYmViZWIiIGQ9Ik0xNDIgMTc2LjNoMTE0djQ1LjRoLTY0LjJsNC4yIDQ2LjVoNjB2NDUuM0gxNTQuNG0yIDIyLjhIMjAybDMuMiAzNi4zIDUwLjggMTMuNnY0Ny40bC05My4yLTI2Ii8+CiAgPHBhdGggY2xhc3M9ImpwLWljb24tc2VsZWN0YWJsZS1pbnZlcnNlIiBmaWxsPSIjZmZmIiBkPSJNMzY5LjYgMTc2LjNIMjU1Ljh2NDUuNGgxMDkuNm0tNC4xIDQ2LjVIMjU1Ljh2NDUuNGg1NmwtNS4zIDU5LTUwLjcgMTMuNnY0Ny4ybDkzLTI1LjgiLz4KPC9zdmc+Cg==); + --jp-icon-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1icmFuZDQganAtaWNvbi1zZWxlY3RhYmxlLWludmVyc2UiIGZpbGw9IiNGRkYiIGQ9Ik0yLjIgMi4yaDE3LjV2MTcuNUgyLjJ6Ii8+CiAgPHBhdGggY2xhc3M9ImpwLWljb24tYnJhbmQwIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iIzNGNTFCNSIgZD0iTTIuMiAyLjJ2MTcuNWgxNy41bC4xLTE3LjVIMi4yem0xMi4xIDIuMmMxLjIgMCAyLjIgMSAyLjIgMi4ycy0xIDIuMi0yLjIgMi4yLTIuMi0xLTIuMi0yLjIgMS0yLjIgMi4yLTIuMnpNNC40IDE3LjZsMy4zLTguOCAzLjMgNi42IDIuMi0zLjIgNC40IDUuNEg0LjR6Ii8+Cjwvc3ZnPgo=); + --jp-icon-info: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDUwLjk3OCA1MC45NzgiPgoJPGcgY2xhc3M9ImpwLWljb24zIiBmaWxsPSIjNjE2MTYxIj4KCQk8cGF0aCBkPSJNNDMuNTIsNy40NThDMzguNzExLDIuNjQ4LDMyLjMwNywwLDI1LjQ4OSwwQzE4LjY3LDAsMTIuMjY2LDIuNjQ4LDcuNDU4LDcuNDU4CgkJCWMtOS45NDMsOS45NDEtOS45NDMsMjYuMTE5LDAsMzYuMDYyYzQuODA5LDQuODA5LDExLjIxMiw3LjQ1NiwxOC4wMzEsNy40NThjMCwwLDAuMDAxLDAsMC4wMDIsMAoJCQljNi44MTYsMCwxMy4yMjEtMi42NDgsMTguMDI5LTcuNDU4YzQuODA5LTQuODA5LDcuNDU3LTExLjIxMiw3LjQ1Ny0xOC4wM0M1MC45NzcsMTguNjcsNDguMzI4LDEyLjI2Niw0My41Miw3LjQ1OHoKCQkJIE00Mi4xMDYsNDIuMTA1Yy00LjQzMiw0LjQzMS0xMC4zMzIsNi44NzItMTYuNjE1LDYuODcyaC0wLjAwMmMtNi4yODUtMC4wMDEtMTIuMTg3LTIuNDQxLTE2LjYxNy02Ljg3MgoJCQljLTkuMTYyLTkuMTYzLTkuMTYyLTI0LjA3MSwwLTMzLjIzM0MxMy4zMDMsNC40NCwxOS4yMDQsMiwyNS40ODksMmM2LjI4NCwwLDEyLjE4NiwyLjQ0LDE2LjYxNyw2Ljg3MgoJCQljNC40MzEsNC40MzEsNi44NzEsMTAuMzMyLDYuODcxLDE2LjYxN0M0OC45NzcsMzEuNzcyLDQ2LjUzNiwzNy42NzUsNDIuMTA2LDQyLjEwNXoiLz4KCQk8cGF0aCBkPSJNMjMuNTc4LDMyLjIxOGMtMC4wMjMtMS43MzQsMC4xNDMtMy4wNTksMC40OTYtMy45NzJjMC4zNTMtMC45MTMsMS4xMS0xLjk5NywyLjI3Mi0zLjI1MwoJCQljMC40NjgtMC41MzYsMC45MjMtMS4wNjIsMS4zNjctMS41NzVjMC42MjYtMC43NTMsMS4xMDQtMS40NzgsMS40MzYtMi4xNzVjMC4zMzEtMC43MDcsMC40OTUtMS41NDEsMC40OTUtMi41CgkJCWMwLTEuMDk2LTAuMjYtMi4wODgtMC43NzktMi45NzljLTAuNTY1LTAuODc5LTEuNTAxLTEuMzM2LTIuODA2LTEuMzY5Yy0xLjgwMiwwLjA1Ny0yLjk4NSwwLjY2Ny0zLjU1LDEuODMyCgkJCWMtMC4zMDEsMC41MzUtMC41MDMsMS4xNDEtMC42MDcsMS44MTRjLTAuMTM5LDAuNzA3LTAuMjA3LDEuNDMyLTAuMjA3LDIuMTc0aC0yLjkzN2MtMC4wOTEtMi4yMDgsMC40MDctNC4xMTQsMS40OTMtNS43MTkKCQkJYzEuMDYyLTEuNjQsMi44NTUtMi40ODEsNS4zNzgtMi41MjdjMi4xNiwwLjAyMywzLjg3NCwwLjYwOCw1LjE0MSwxLjc1OGMxLjI3OCwxLjE2LDEuOTI5LDIuNzY0LDEuOTUsNC44MTEKCQkJYzAsMS4xNDItMC4xMzcsMi4xMTEtMC40MSwyLjkxMWMtMC4zMDksMC44NDUtMC43MzEsMS41OTMtMS4yNjgsMi4yNDNjLTAuNDkyLDAuNjUtMS4wNjgsMS4zMTgtMS43MywyLjAwMgoJCQljLTAuNjUsMC42OTctMS4zMTMsMS40NzktMS45ODcsMi4zNDZjLTAuMjM5LDAuMzc3LTAuNDI5LDAuNzc3LTAuNTY1LDEuMTk5Yy0wLjE2LDAuOTU5LTAuMjE3LDEuOTUxLTAuMTcxLDIuOTc5CgkJCUMyNi41ODksMzIuMjE4LDIzLjU3OCwzMi4yMTgsMjMuNTc4LDMyLjIxOHogTTIzLjU3OCwzOC4yMnYtMy40ODRoMy4wNzZ2My40ODRIMjMuNTc4eiIvPgoJPC9nPgo8L3N2Zz4K); + --jp-icon-inspector: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtaW5zcGVjdG9yLWljb24tY29sb3IganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMjAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0tNSAxNEg0di00aDExdjR6bTAtNUg0VjloMTF2NHptNSA1aC00VjloNHY5eiIvPgo8L3N2Zz4K); + --jp-icon-json: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8ZyBjbGFzcz0ianAtanNvbi1pY29uLWNvbG9yIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iI0Y5QTgyNSI+CiAgICA8cGF0aCBkPSJNMjAuMiAxMS44Yy0xLjYgMC0xLjcuNS0xLjcgMSAwIC40LjEuOS4xIDEuMy4xLjUuMS45LjEgMS4zIDAgMS43LTEuNCAyLjMtMy41IDIuM2gtLjl2LTEuOWguNWMxLjEgMCAxLjQgMCAxLjQtLjggMC0uMyAwLS42LS4xLTEgMC0uNC0uMS0uOC0uMS0xLjIgMC0xLjMgMC0xLjggMS4zLTItMS4zLS4yLTEuMy0uNy0xLjMtMiAwLS40LjEtLjguMS0xLjIuMS0uNC4xLS43LjEtMSAwLS44LS40LS43LTEuNC0uOGgtLjVWNC4xaC45YzIuMiAwIDMuNS43IDMuNSAyLjMgMCAuNC0uMS45LS4xIDEuMy0uMS41LS4xLjktLjEgMS4zIDAgLjUuMiAxIDEuNyAxdjEuOHpNMS44IDEwLjFjMS42IDAgMS43LS41IDEuNy0xIDAtLjQtLjEtLjktLjEtMS4zLS4xLS41LS4xLS45LS4xLTEuMyAwLTEuNiAxLjQtMi4zIDMuNS0yLjNoLjl2MS45aC0uNWMtMSAwLTEuNCAwLTEuNC44IDAgLjMgMCAuNi4xIDEgMCAuMi4xLjYuMSAxIDAgMS4zIDAgMS44LTEuMyAyQzYgMTEuMiA2IDExLjcgNiAxM2MwIC40LS4xLjgtLjEgMS4yLS4xLjMtLjEuNy0uMSAxIDAgLjguMy44IDEuNC44aC41djEuOWgtLjljLTIuMSAwLTMuNS0uNi0zLjUtMi4zIDAtLjQuMS0uOS4xLTEuMy4xLS41LjEtLjkuMS0xLjMgMC0uNS0uMi0xLTEuNy0xdi0xLjl6Ii8+CiAgICA8Y2lyY2xlIGN4PSIxMSIgY3k9IjEzLjgiIHI9IjIuMSIvPgogICAgPGNpcmNsZSBjeD0iMTEiIGN5PSI4LjIiIHI9IjIuMSIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-julia: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDMyNSAzMDAiPgogIDxnIGNsYXNzPSJqcC1icmFuZDAganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjY2IzYzMzIj4KICAgIDxwYXRoIGQ9Ik0gMTUwLjg5ODQzOCAyMjUgQyAxNTAuODk4NDM4IDI2Ni40MjE4NzUgMTE3LjMyMDMxMiAzMDAgNzUuODk4NDM4IDMwMCBDIDM0LjQ3NjU2MiAzMDAgMC44OTg0MzggMjY2LjQyMTg3NSAwLjg5ODQzOCAyMjUgQyAwLjg5ODQzOCAxODMuNTc4MTI1IDM0LjQ3NjU2MiAxNTAgNzUuODk4NDM4IDE1MCBDIDExNy4zMjAzMTIgMTUwIDE1MC44OTg0MzggMTgzLjU3ODEyNSAxNTAuODk4NDM4IDIyNSIvPgogIDwvZz4KICA8ZyBjbGFzcz0ianAtYnJhbmQwIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iIzM4OTgyNiI+CiAgICA8cGF0aCBkPSJNIDIzNy41IDc1IEMgMjM3LjUgMTE2LjQyMTg3NSAyMDMuOTIxODc1IDE1MCAxNjIuNSAxNTAgQyAxMjEuMDc4MTI1IDE1MCA4Ny41IDExNi40MjE4NzUgODcuNSA3NSBDIDg3LjUgMzMuNTc4MTI1IDEyMS4wNzgxMjUgMCAxNjIuNSAwIEMgMjAzLjkyMTg3NSAwIDIzNy41IDMzLjU3ODEyNSAyMzcuNSA3NSIvPgogIDwvZz4KICA8ZyBjbGFzcz0ianAtYnJhbmQwIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iIzk1NThiMiI+CiAgICA8cGF0aCBkPSJNIDMyNC4xMDE1NjIgMjI1IEMgMzI0LjEwMTU2MiAyNjYuNDIxODc1IDI5MC41MjM0MzggMzAwIDI0OS4xMDE1NjIgMzAwIEMgMjA3LjY3OTY4OCAzMDAgMTc0LjEwMTU2MiAyNjYuNDIxODc1IDE3NC4xMDE1NjIgMjI1IEMgMTc0LjEwMTU2MiAxODMuNTc4MTI1IDIwNy42Nzk2ODggMTUwIDI0OS4xMDE1NjIgMTUwIEMgMjkwLjUyMzQzOCAxNTAgMzI0LjEwMTU2MiAxODMuNTc4MTI1IDMyNC4xMDE1NjIgMjI1Ii8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-jupyter-favicon: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUyIiBoZWlnaHQ9IjE2NSIgdmlld0JveD0iMCAwIDE1MiAxNjUiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgPGcgY2xhc3M9ImpwLWp1cHl0ZXItaWNvbi1jb2xvciIgZmlsbD0iI0YzNzcyNiI+CiAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjA3ODk0NywgMTEwLjU4MjkyNykiIGQ9Ik03NS45NDIyODQyLDI5LjU4MDQ1NjEgQzQzLjMwMjM5NDcsMjkuNTgwNDU2MSAxNC43OTY3ODMyLDE3LjY1MzQ2MzQgMCwwIEM1LjUxMDgzMjExLDE1Ljg0MDY4MjkgMTUuNzgxNTM4OSwyOS41NjY3NzMyIDI5LjM5MDQ5NDcsMzkuMjc4NDE3MSBDNDIuOTk5Nyw0OC45ODk4NTM3IDU5LjI3MzcsNTQuMjA2NzgwNSA3NS45NjA1Nzg5LDU0LjIwNjc4MDUgQzkyLjY0NzQ1NzksNTQuMjA2NzgwNSAxMDguOTIxNDU4LDQ4Ljk4OTg1MzcgMTIyLjUzMDY2MywzOS4yNzg0MTcxIEMxMzYuMTM5NDUzLDI5LjU2Njc3MzIgMTQ2LjQxMDI4NCwxNS44NDA2ODI5IDE1MS45MjExNTgsMCBDMTM3LjA4Nzg2OCwxNy42NTM0NjM0IDEwOC41ODI1ODksMjkuNTgwNDU2MSA3NS45NDIyODQyLDI5LjU4MDQ1NjEgTDc1Ljk0MjI4NDIsMjkuNTgwNDU2MSBaIiAvPgogICAgPHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4wMzczNjgsIDAuNzA0ODc4KSIgZD0iTTc1Ljk3ODQ1NzksMjQuNjI2NDA3MyBDMTA4LjYxODc2MywyNC42MjY0MDczIDEzNy4xMjQ0NTgsMzYuNTUzNDQxNSAxNTEuOTIxMTU4LDU0LjIwNjc4MDUgQzE0Ni40MTAyODQsMzguMzY2MjIyIDEzNi4xMzk0NTMsMjQuNjQwMTMxNyAxMjIuNTMwNjYzLDE0LjkyODQ4NzggQzEwOC45MjE0NTgsNS4yMTY4NDM5IDkyLjY0NzQ1NzksMCA3NS45NjA1Nzg5LDAgQzU5LjI3MzcsMCA0Mi45OTk3LDUuMjE2ODQzOSAyOS4zOTA0OTQ3LDE0LjkyODQ4NzggQzE1Ljc4MTUzODksMjQuNjQwMTMxNyA1LjUxMDgzMjExLDM4LjM2NjIyMiAwLDU0LjIwNjc4MDUgQzE0LjgzMzA4MTYsMzYuNTg5OTI5MyA0My4zMzg1Njg0LDI0LjYyNjQwNzMgNzUuOTc4NDU3OSwyNC42MjY0MDczIEw3NS45Nzg0NTc5LDI0LjYyNjQwNzMgWiIgLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-jupyter: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzkiIGhlaWdodD0iNTEiIHZpZXdCb3g9IjAgMCAzOSA1MSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTYzOCAtMjI4MSkiPgogICAgIDxnIGNsYXNzPSJqcC1qdXB5dGVyLWljb24tY29sb3IiIGZpbGw9IiNGMzc3MjYiPgogICAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjM5Ljc0IDIzMTEuOTgpIiBkPSJNIDE4LjI2NDYgNy4xMzQxMUMgMTAuNDE0NSA3LjEzNDExIDMuNTU4NzIgNC4yNTc2IDAgMEMgMS4zMjUzOSAzLjgyMDQgMy43OTU1NiA3LjEzMDgxIDcuMDY4NiA5LjQ3MzAzQyAxMC4zNDE3IDExLjgxNTIgMTQuMjU1NyAxMy4wNzM0IDE4LjI2OSAxMy4wNzM0QyAyMi4yODIzIDEzLjA3MzQgMjYuMTk2MyAxMS44MTUyIDI5LjQ2OTQgOS40NzMwM0MgMzIuNzQyNCA3LjEzMDgxIDM1LjIxMjYgMy44MjA0IDM2LjUzOCAwQyAzMi45NzA1IDQuMjU3NiAyNi4xMTQ4IDcuMTM0MTEgMTguMjY0NiA3LjEzNDExWiIvPgogICAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjM5LjczIDIyODUuNDgpIiBkPSJNIDE4LjI3MzMgNS45MzkzMUMgMjYuMTIzNSA1LjkzOTMxIDMyLjk3OTMgOC44MTU4MyAzNi41MzggMTMuMDczNEMgMzUuMjEyNiA5LjI1MzAzIDMyLjc0MjQgNS45NDI2MiAyOS40Njk0IDMuNjAwNEMgMjYuMTk2MyAxLjI1ODE4IDIyLjI4MjMgMCAxOC4yNjkgMEMgMTQuMjU1NyAwIDEwLjM0MTcgMS4yNTgxOCA3LjA2ODYgMy42MDA0QyAzLjc5NTU2IDUuOTQyNjIgMS4zMjUzOSA5LjI1MzAzIDAgMTMuMDczNEMgMy41Njc0NSA4LjgyNDYzIDEwLjQyMzIgNS45MzkzMSAxOC4yNzMzIDUuOTM5MzFaIi8+CiAgICA8L2c+CiAgICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjY5LjMgMjI4MS4zMSkiIGQ9Ik0gNS44OTM1MyAyLjg0NEMgNS45MTg4OSAzLjQzMTY1IDUuNzcwODUgNC4wMTM2NyA1LjQ2ODE1IDQuNTE2NDVDIDUuMTY1NDUgNS4wMTkyMiA0LjcyMTY4IDUuNDIwMTUgNC4xOTI5OSA1LjY2ODUxQyAzLjY2NDMgNS45MTY4OCAzLjA3NDQ0IDYuMDAxNTEgMi40OTgwNSA1LjkxMTcxQyAxLjkyMTY2IDUuODIxOSAxLjM4NDYzIDUuNTYxNyAwLjk1NDg5OCA1LjE2NDAxQyAwLjUyNTE3IDQuNzY2MzMgMC4yMjIwNTYgNC4yNDkwMyAwLjA4MzkwMzcgMy42Nzc1N0MgLTAuMDU0MjQ4MyAzLjEwNjExIC0wLjAyMTIzIDIuNTA2MTcgMC4xNzg3ODEgMS45NTM2NEMgMC4zNzg3OTMgMS40MDExIDAuNzM2ODA5IDAuOTIwODE3IDEuMjA3NTQgMC41NzM1MzhDIDEuNjc4MjYgMC4yMjYyNTkgMi4yNDA1NSAwLjAyNzU5MTkgMi44MjMyNiAwLjAwMjY3MjI5QyAzLjYwMzg5IC0wLjAzMDcxMTUgNC4zNjU3MyAwLjI0OTc4OSA0Ljk0MTQyIDAuNzgyNTUxQyA1LjUxNzExIDEuMzE1MzEgNS44NTk1NiAyLjA1Njc2IDUuODkzNTMgMi44NDRaIi8+CiAgICAgIDxwYXRoIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE2MzkuOCAyMzIzLjgxKSIgZD0iTSA3LjQyNzg5IDMuNTgzMzhDIDcuNDYwMDggNC4zMjQzIDcuMjczNTUgNS4wNTgxOSA2Ljg5MTkzIDUuNjkyMTNDIDYuNTEwMzEgNi4zMjYwNyA1Ljk1MDc1IDYuODMxNTYgNS4yODQxMSA3LjE0NDZDIDQuNjE3NDcgNy40NTc2MyAzLjg3MzcxIDcuNTY0MTQgMy4xNDcwMiA3LjQ1MDYzQyAyLjQyMDMyIDcuMzM3MTIgMS43NDMzNiA3LjAwODcgMS4yMDE4NCA2LjUwNjk1QyAwLjY2MDMyOCA2LjAwNTIgMC4yNzg2MSA1LjM1MjY4IDAuMTA1MDE3IDQuNjMyMDJDIC0wLjA2ODU3NTcgMy45MTEzNSAtMC4wMjYyMzYxIDMuMTU0OTQgMC4yMjY2NzUgMi40NTg1NkMgMC40Nzk1ODcgMS43NjIxNyAwLjkzMTY5NyAxLjE1NzEzIDEuNTI1NzYgMC43MjAwMzNDIDIuMTE5ODMgMC4yODI5MzUgMi44MjkxNCAwLjAzMzQzOTUgMy41NjM4OSAwLjAwMzEzMzQ0QyA0LjU0NjY3IC0wLjAzNzQwMzMgNS41MDUyOSAwLjMxNjcwNiA2LjIyOTYxIDAuOTg3ODM1QyA2Ljk1MzkzIDEuNjU4OTYgNy4zODQ4NCAyLjU5MjM1IDcuNDI3ODkgMy41ODMzOEwgNy40Mjc4OSAzLjU4MzM4WiIvPgogICAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjM4LjM2IDIyODYuMDYpIiBkPSJNIDIuMjc0NzEgNC4zOTYyOUMgMS44NDM2MyA0LjQxNTA4IDEuNDE2NzEgNC4zMDQ0NSAxLjA0Nzk5IDQuMDc4NDNDIDAuNjc5MjY4IDMuODUyNCAwLjM4NTMyOCAzLjUyMTE0IDAuMjAzMzcxIDMuMTI2NTZDIDAuMDIxNDEzNiAyLjczMTk4IC0wLjA0MDM3OTggMi4yOTE4MyAwLjAyNTgxMTYgMS44NjE4MUMgMC4wOTIwMDMxIDEuNDMxOCAwLjI4MzIwNCAxLjAzMTI2IDAuNTc1MjEzIDAuNzEwODgzQyAwLjg2NzIyMiAwLjM5MDUxIDEuMjQ2OTEgMC4xNjQ3MDggMS42NjYyMiAwLjA2MjA1OTJDIDIuMDg1NTMgLTAuMDQwNTg5NyAyLjUyNTYxIC0wLjAxNTQ3MTQgMi45MzA3NiAwLjEzNDIzNUMgMy4zMzU5MSAwLjI4Mzk0MSAzLjY4NzkyIDAuNTUxNTA1IDMuOTQyMjIgMC45MDMwNkMgNC4xOTY1MiAxLjI1NDYyIDQuMzQxNjkgMS42NzQzNiA0LjM1OTM1IDIuMTA5MTZDIDQuMzgyOTkgMi42OTEwNyA0LjE3Njc4IDMuMjU4NjkgMy43ODU5NyAzLjY4NzQ2QyAzLjM5NTE2IDQuMTE2MjQgMi44NTE2NiA0LjM3MTE2IDIuMjc0NzEgNC4zOTYyOUwgMi4yNzQ3MSA0LjM5NjI5WiIvPgogICAgPC9nPgogIDwvZz4+Cjwvc3ZnPgo=); + --jp-icon-jupyterlab-wordmark: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMDAiIHZpZXdCb3g9IjAgMCAxODYwLjggNDc1Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjIiIGZpbGw9IiM0RTRFNEUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ4MC4xMzY0MDEsIDY0LjI3MTQ5MykiPgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4wMDAwMDAsIDU4Ljg3NTU2NikiPgogICAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjA4NzYwMywgMC4xNDAyOTQpIj4KICAgICAgICA8cGF0aCBkPSJNLTQyNi45LDE2OS44YzAsNDguNy0zLjcsNjQuNy0xMy42LDc2LjRjLTEwLjgsMTAtMjUsMTUuNS0zOS43LDE1LjVsMy43LDI5IGMyMi44LDAuMyw0NC44LTcuOSw2MS45LTIzLjFjMTcuOC0xOC41LDI0LTQ0LjEsMjQtODMuM1YwSC00Mjd2MTcwLjFMLTQyNi45LDE2OS44TC00MjYuOSwxNjkuOHoiLz4KICAgICAgPC9nPgogICAgPC9nPgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTU1LjA0NTI5NiwgNTYuODM3MTA0KSI+CiAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuNTYyNDUzLCAxLjc5OTg0MikiPgogICAgICAgIDxwYXRoIGQ9Ik0tMzEyLDE0OGMwLDIxLDAsMzkuNSwxLjcsNTUuNGgtMzEuOGwtMi4xLTMzLjNoLTAuOGMtNi43LDExLjYtMTYuNCwyMS4zLTI4LDI3LjkgYy0xMS42LDYuNi0yNC44LDEwLTM4LjIsOS44Yy0zMS40LDAtNjktMTcuNy02OS04OVYwaDM2LjR2MTEyLjdjMCwzOC43LDExLjYsNjQuNyw0NC42LDY0LjdjMTAuMy0wLjIsMjAuNC0zLjUsMjguOS05LjQgYzguNS01LjksMTUuMS0xNC4zLDE4LjktMjMuOWMyLjItNi4xLDMuMy0xMi41LDMuMy0xOC45VjAuMmgzNi40VjE0OEgtMzEyTC0zMTIsMTQ4eiIvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzOTAuMDEzMzIyLCA1My40Nzk2MzgpIj4KICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMS43MDY0NTgsIDAuMjMxNDI1KSI+CiAgICAgICAgPHBhdGggZD0iTS00NzguNiw3MS40YzAtMjYtMC44LTQ3LTEuNy02Ni43aDMyLjdsMS43LDM0LjhoMC44YzcuMS0xMi41LDE3LjUtMjIuOCwzMC4xLTI5LjcgYzEyLjUtNywyNi43LTEwLjMsNDEtOS44YzQ4LjMsMCw4NC43LDQxLjcsODQuNywxMDMuM2MwLDczLjEtNDMuNywxMDkuMi05MSwxMDkuMmMtMTIuMSwwLjUtMjQuMi0yLjItMzUtNy44IGMtMTAuOC01LjYtMTkuOS0xMy45LTI2LjYtMjQuMmgtMC44VjI5MWgtMzZ2LTIyMEwtNDc4LjYsNzEuNEwtNDc4LjYsNzEuNHogTS00NDIuNiwxMjUuNmMwLjEsNS4xLDAuNiwxMC4xLDEuNywxNS4xIGMzLDEyLjMsOS45LDIzLjMsMTkuOCwzMS4xYzkuOSw3LjgsMjIuMSwxMi4xLDM0LjcsMTIuMWMzOC41LDAsNjAuNy0zMS45LDYwLjctNzguNWMwLTQwLjctMjEuMS03NS42LTU5LjUtNzUuNiBjLTEyLjksMC40LTI1LjMsNS4xLTM1LjMsMTMuNGMtOS45LDguMy0xNi45LDE5LjctMTkuNiwzMi40Yy0xLjUsNC45LTIuMywxMC0yLjUsMTUuMVYxMjUuNkwtNDQyLjYsMTI1LjZMLTQ0Mi42LDEyNS42eiIvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg2MDYuNzQwNzI2LCA1Ni44MzcxMDQpIj4KICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC43NTEyMjYsIDEuOTg5Mjk5KSI+CiAgICAgICAgPHBhdGggZD0iTS00NDAuOCwwbDQzLjcsMTIwLjFjNC41LDEzLjQsOS41LDI5LjQsMTIuOCw0MS43aDAuOGMzLjctMTIuMiw3LjktMjcuNywxMi44LTQyLjQgbDM5LjctMTE5LjJoMzguNUwtMzQ2LjksMTQ1Yy0yNiw2OS43LTQzLjcsMTA1LjQtNjguNiwxMjcuMmMtMTIuNSwxMS43LTI3LjksMjAtNDQuNiwyMy45bC05LjEtMzEuMSBjMTEuNy0zLjksMjIuNS0xMC4xLDMxLjgtMTguMWMxMy4yLTExLjEsMjMuNy0yNS4yLDMwLjYtNDEuMmMxLjUtMi44LDIuNS01LjcsMi45LTguOGMtMC4zLTMuMy0xLjItNi42LTIuNS05LjdMLTQ4MC4yLDAuMSBoMzkuN0wtNDQwLjgsMEwtNDQwLjgsMHoiLz4KICAgICAgPC9nPgogICAgPC9nPgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoODIyLjc0ODEwNCwgMC4wMDAwMDApIj4KICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMS40NjQwNTAsIDAuMzc4OTE0KSI+CiAgICAgICAgPHBhdGggZD0iTS00MTMuNywwdjU4LjNoNTJ2MjguMmgtNTJWMTk2YzAsMjUsNywzOS41LDI3LjMsMzkuNWM3LjEsMC4xLDE0LjItMC43LDIxLjEtMi41IGwxLjcsMjcuN2MtMTAuMywzLjctMjEuMyw1LjQtMzIuMiw1Yy03LjMsMC40LTE0LjYtMC43LTIxLjMtMy40Yy02LjgtMi43LTEyLjktNi44LTE3LjktMTIuMWMtMTAuMy0xMC45LTE0LjEtMjktMTQuMS01Mi45IFY4Ni41aC0zMVY1OC4zaDMxVjkuNkwtNDEzLjcsMEwtNDEzLjcsMHoiLz4KICAgICAgPC9nPgogICAgPC9nPgogICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOTc0LjQzMzI4NiwgNTMuNDc5NjM4KSI+CiAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAuOTkwMDM0LCAwLjYxMDMzOSkiPgogICAgICAgIDxwYXRoIGQ9Ik0tNDQ1LjgsMTEzYzAuOCw1MCwzMi4yLDcwLjYsNjguNiw3MC42YzE5LDAuNiwzNy45LTMsNTUuMy0xMC41bDYuMiwyNi40IGMtMjAuOSw4LjktNDMuNSwxMy4xLTY2LjIsMTIuNmMtNjEuNSwwLTk4LjMtNDEuMi05OC4zLTEwMi41Qy00ODAuMiw0OC4yLTQ0NC43LDAtMzg2LjUsMGM2NS4yLDAsODIuNyw1OC4zLDgyLjcsOTUuNyBjLTAuMSw1LjgtMC41LDExLjUtMS4yLDE3LjJoLTE0MC42SC00NDUuOEwtNDQ1LjgsMTEzeiBNLTMzOS4yLDg2LjZjMC40LTIzLjUtOS41LTYwLjEtNTAuNC02MC4xIGMtMzYuOCwwLTUyLjgsMzQuNC01NS43LDYwLjFILTMzOS4yTC0zMzkuMiw4Ni42TC0zMzkuMiw4Ni42eiIvPgogICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMjAxLjk2MTA1OCwgNTMuNDc5NjM4KSI+CiAgICAgIDxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEuMTc5NjQwLCAwLjcwNTA2OCkiPgogICAgICAgIDxwYXRoIGQ9Ik0tNDc4LjYsNjhjMC0yMy45LTAuNC00NC41LTEuNy02My40aDMxLjhsMS4yLDM5LjloMS43YzkuMS0yNy4zLDMxLTQ0LjUsNTUuMy00NC41IGMzLjUtMC4xLDcsMC40LDEwLjMsMS4ydjM0LjhjLTQuMS0wLjktOC4yLTEuMy0xMi40LTEuMmMtMjUuNiwwLTQzLjcsMTkuNy00OC43LDQ3LjRjLTEsNS43LTEuNiwxMS41LTEuNywxNy4ydjEwOC4zaC0zNlY2OCBMLTQ3OC42LDY4eiIvPgogICAgICA8L2c+CiAgICA8L2c+CiAgPC9nPgoKICA8ZyBjbGFzcz0ianAtaWNvbi13YXJuMCIgZmlsbD0iI0YzNzcyNiI+CiAgICA8cGF0aCBkPSJNMTM1Mi4zLDMyNi4yaDM3VjI4aC0zN1YzMjYuMnogTTE2MDQuOCwzMjYuMmMtMi41LTEzLjktMy40LTMxLjEtMy40LTQ4Ljd2LTc2IGMwLTQwLjctMTUuMS04My4xLTc3LjMtODMuMWMtMjUuNiwwLTUwLDcuMS02Ni44LDE4LjFsOC40LDI0LjRjMTQuMy05LjIsMzQtMTUuMSw1My0xNS4xYzQxLjYsMCw0Ni4yLDMwLjIsNDYuMiw0N3Y0LjIgYy03OC42LTAuNC0xMjIuMywyNi41LTEyMi4zLDc1LjZjMCwyOS40LDIxLDU4LjQsNjIuMiw1OC40YzI5LDAsNTAuOS0xNC4zLDYyLjItMzAuMmgxLjNsMi45LDI1LjZIMTYwNC44eiBNMTU2NS43LDI1Ny43IGMwLDMuOC0wLjgsOC0yLjEsMTEuOGMtNS45LDE3LjItMjIuNywzNC00OS4yLDM0Yy0xOC45LDAtMzQuOS0xMS4zLTM0LjktMzUuM2MwLTM5LjUsNDUuOC00Ni42LDg2LjItNDUuOFYyNTcuN3ogTTE2OTguNSwzMjYuMiBsMS43LTMzLjZoMS4zYzE1LjEsMjYuOSwzOC43LDM4LjIsNjguMSwzOC4yYzQ1LjQsMCw5MS4yLTM2LjEsOTEuMi0xMDguOGMwLjQtNjEuNy0zNS4zLTEwMy43LTg1LjctMTAzLjcgYy0zMi44LDAtNTYuMywxNC43LTY5LjMsMzcuNGgtMC44VjI4aC0zNi42djI0NS43YzAsMTguMS0wLjgsMzguNi0xLjcsNTIuNUgxNjk4LjV6IE0xNzA0LjgsMjA4LjJjMC01LjksMS4zLTEwLjksMi4xLTE1LjEgYzcuNi0yOC4xLDMxLjEtNDUuNCw1Ni4zLTQ1LjRjMzkuNSwwLDYwLjUsMzQuOSw2MC41LDc1LjZjMCw0Ni42LTIzLjEsNzguMS02MS44LDc4LjFjLTI2LjksMC00OC4zLTE3LjYtNTUuNS00My4zIGMtMC44LTQuMi0xLjctOC44LTEuNy0xMy40VjIwOC4yeiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-kernel: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxwYXRoIGNsYXNzPSJqcC1pY29uMiIgZmlsbD0iIzYxNjE2MSIgZD0iTTE1IDlIOXY2aDZWOXptLTIgNGgtMnYtMmgydjJ6bTgtMlY5aC0yVjdjMC0xLjEtLjktMi0yLTJoLTJWM2gtMnYyaC0yVjNIOXYySDdjLTEuMSAwLTIgLjktMiAydjJIM3YyaDJ2MkgzdjJoMnYyYzAgMS4xLjkgMiAyIDJoMnYyaDJ2LTJoMnYyaDJ2LTJoMmMxLjEgMCAyLS45IDItMnYtMmgydi0yaC0ydi0yaDJ6bS00IDZIN1Y3aDEwdjEweiIvPgo8L3N2Zz4K); + --jp-icon-keyboard: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMjAgNUg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMTdjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY3YzAtMS4xLS45LTItMi0yem0tOSAzaDJ2MmgtMlY4em0wIDNoMnYyaC0ydi0yek04IDhoMnYySDhWOHptMCAzaDJ2Mkg4di0yem0tMSAySDV2LTJoMnYyem0wLTNINVY4aDJ2MnptOSA3SDh2LTJoOHYyem0wLTRoLTJ2LTJoMnYyem0wLTNoLTJWOGgydjJ6bTMgM2gtMnYtMmgydjJ6bTAtM2gtMlY4aDJ2MnoiLz4KPC9zdmc+Cg==); + --jp-icon-launch: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMzIgMzIiIHdpZHRoPSIzMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxwYXRoIGQ9Ik0yNiwyOEg2YTIuMDAyNywyLjAwMjcsMCwwLDEtMi0yVjZBMi4wMDI3LDIuMDAyNywwLDAsMSw2LDRIMTZWNkg2VjI2SDI2VjE2aDJWMjZBMi4wMDI3LDIuMDAyNywwLDAsMSwyNiwyOFoiLz4KICAgIDxwb2x5Z29uIHBvaW50cz0iMjAgMiAyMCA0IDI2LjU4NiA0IDE4IDEyLjU4NiAxOS40MTQgMTQgMjggNS40MTQgMjggMTIgMzAgMTIgMzAgMiAyMCAyIi8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-launcher: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMTkgMTlINVY1aDdWM0g1YTIgMiAwIDAwLTIgMnYxNGEyIDIgMCAwMDIgMmgxNGMxLjEgMCAyLS45IDItMnYtN2gtMnY3ek0xNCAzdjJoMy41OWwtOS44MyA5LjgzIDEuNDEgMS40MUwxOSA2LjQxVjEwaDJWM2gtN3oiLz4KPC9zdmc+Cg==); + --jp-icon-line-form: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxwYXRoIGZpbGw9IndoaXRlIiBkPSJNNS44OCA0LjEyTDEzLjc2IDEybC03Ljg4IDcuODhMOCAyMmwxMC0xMEw4IDJ6Ii8+Cjwvc3ZnPgo=); + --jp-icon-link: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTMuOSAxMmMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMWg0VjdIN2MtMi43NiAwLTUgMi4yNC01IDVzMi4yNCA1IDUgNWg0di0xLjlIN2MtMS43MSAwLTMuMS0xLjM5LTMuMS0zLjF6TTggMTNoOHYtMkg4djJ6bTktNmgtNHYxLjloNGMxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXMtMS4zOSAzLjEtMy4xIDMuMWgtNFYxN2g0YzIuNzYgMCA1LTIuMjQgNS01cy0yLjI0LTUtNS01eiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-list: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxwYXRoIGNsYXNzPSJqcC1pY29uMiBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiM2MTYxNjEiIGQ9Ik0xOSA1djE0SDVWNWgxNG0xLjEtMkgzLjljLS41IDAtLjkuNC0uOS45djE2LjJjMCAuNC40LjkuOS45aDE2LjJjLjQgMCAuOS0uNS45LS45VjMuOWMwLS41LS41LS45LS45LS45ek0xMSA3aDZ2MmgtNlY3em0wIDRoNnYyaC02di0yem0wIDRoNnYyaC02ek03IDdoMnYySDd6bTAgNGgydjJIN3ptMCA0aDJ2Mkg3eiIvPgo8L3N2Zz4K); + --jp-icon-markdown: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1jb250cmFzdDAganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjN0IxRkEyIiBkPSJNNSAxNC45aDEybC02LjEgNnptOS40LTYuOGMwLTEuMy0uMS0yLjktLjEtNC41LS40IDEuNC0uOSAyLjktMS4zIDQuM2wtMS4zIDQuM2gtMkw4LjUgNy45Yy0uNC0xLjMtLjctMi45LTEtNC4zLS4xIDEuNi0uMSAzLjItLjIgNC42TDcgMTIuNEg0LjhsLjctMTFoMy4zTDEwIDVjLjQgMS4yLjcgMi43IDEgMy45LjMtMS4yLjctMi42IDEtMy45bDEuMi0zLjdoMy4zbC42IDExaC0yLjRsLS4zLTQuMnoiLz4KPC9zdmc+Cg==); + --jp-icon-move-down: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggY2xhc3M9ImpwLWljb24zIiBkPSJNMTIuNDcxIDcuNTI4OTlDMTIuNzYzMiA3LjIzNjg0IDEyLjc2MzIgNi43NjMxNiAxMi40NzEgNi40NzEwMVY2LjQ3MTAxQzEyLjE3OSA2LjE3OTA1IDExLjcwNTcgNi4xNzg4NCAxMS40MTM1IDYuNDcwNTRMNy43NSAxMC4xMjc1VjEuNzVDNy43NSAxLjMzNTc5IDcuNDE0MjEgMSA3IDFWMUM2LjU4NTc5IDEgNi4yNSAxLjMzNTc5IDYuMjUgMS43NVYxMC4xMjc1TDIuNTk3MjYgNi40NjgyMkMyLjMwMzM4IDYuMTczODEgMS44MjY0MSA2LjE3MzU5IDEuNTMyMjYgNi40Njc3NFY2LjQ2Nzc0QzEuMjM4MyA2Ljc2MTcgMS4yMzgzIDcuMjM4MyAxLjUzMjI2IDcuNTMyMjZMNi4yOTI4OSAxMi4yOTI5QzYuNjgzNDIgMTIuNjgzNCA3LjMxNjU4IDEyLjY4MzQgNy43MDcxMSAxMi4yOTI5TDEyLjQ3MSA3LjUyODk5WiIgZmlsbD0iIzYxNjE2MSIvPgo8L3N2Zz4K); + --jp-icon-move-up: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQiIGhlaWdodD0iMTQiIHZpZXdCb3g9IjAgMCAxNCAxNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggY2xhc3M9ImpwLWljb24zIiBkPSJNMS41Mjg5OSA2LjQ3MTAxQzEuMjM2ODQgNi43NjMxNiAxLjIzNjg0IDcuMjM2ODQgMS41Mjg5OSA3LjUyODk5VjcuNTI4OTlDMS44MjA5NSA3LjgyMDk1IDIuMjk0MjYgNy44MjExNiAyLjU4NjQ5IDcuNTI5NDZMNi4yNSAzLjg3MjVWMTIuMjVDNi4yNSAxMi42NjQyIDYuNTg1NzkgMTMgNyAxM1YxM0M3LjQxNDIxIDEzIDcuNzUgMTIuNjY0MiA3Ljc1IDEyLjI1VjMuODcyNUwxMS40MDI3IDcuNTMxNzhDMTEuNjk2NiA3LjgyNjE5IDEyLjE3MzYgNy44MjY0MSAxMi40Njc3IDcuNTMyMjZWNy41MzIyNkMxMi43NjE3IDcuMjM4MyAxMi43NjE3IDYuNzYxNyAxMi40Njc3IDYuNDY3NzRMNy43MDcxMSAxLjcwNzExQzcuMzE2NTggMS4zMTY1OCA2LjY4MzQyIDEuMzE2NTggNi4yOTI4OSAxLjcwNzExTDEuNTI4OTkgNi40NzEwMVoiIGZpbGw9IiM2MTYxNjEiLz4KPC9zdmc+Cg==); + --jp-icon-new-folder: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTIwIDZoLThsLTItMkg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOGMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6bS0xIDhoLTN2M2gtMnYtM2gtM3YtMmgzVjloMnYzaDN2MnoiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-not-trusted: url(data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI1IDI1Ij4KICAgIDxwYXRoIGNsYXNzPSJqcC1pY29uMiIgc3Ryb2tlPSIjMzMzMzMzIiBzdHJva2Utd2lkdGg9IjIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMgMykiIGQ9Ik0xLjg2MDk0IDExLjQ0MDlDMC44MjY0NDggOC43NzAyNyAwLjg2Mzc3OSA2LjA1NzY0IDEuMjQ5MDcgNC4xOTkzMkMyLjQ4MjA2IDMuOTMzNDcgNC4wODA2OCAzLjQwMzQ3IDUuNjAxMDIgMi44NDQ5QzcuMjM1NDkgMi4yNDQ0IDguODU2NjYgMS41ODE1IDkuOTg3NiAxLjA5NTM5QzExLjA1OTcgMS41ODM0MSAxMi42MDk0IDIuMjQ0NCAxNC4yMTggMi44NDMzOUMxNS43NTAzIDMuNDEzOTQgMTcuMzk5NSAzLjk1MjU4IDE4Ljc1MzkgNC4yMTM4NUMxOS4xMzY0IDYuMDcxNzcgMTkuMTcwOSA4Ljc3NzIyIDE4LjEzOSAxMS40NDA5QzE3LjAzMDMgMTQuMzAzMiAxNC42NjY4IDE3LjE4NDQgOS45OTk5OSAxOC45MzU0QzUuMzMzMTkgMTcuMTg0NCAyLjk2OTY4IDE0LjMwMzIgMS44NjA5NCAxMS40NDA5WiIvPgogICAgPHBhdGggY2xhc3M9ImpwLWljb24yIiBzdHJva2U9IiMzMzMzMzMiIHN0cm9rZS13aWR0aD0iMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOS4zMTU5MiA5LjMyMDMxKSIgZD0iTTcuMzY4NDIgMEwwIDcuMzY0NzkiLz4KICAgIDxwYXRoIGNsYXNzPSJqcC1pY29uMiIgc3Ryb2tlPSIjMzMzMzMzIiBzdHJva2Utd2lkdGg9IjIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDkuMzE1OTIgMTYuNjgzNikgc2NhbGUoMSAtMSkiIGQ9Ik03LjM2ODQyIDBMMCA3LjM2NDc5Ii8+Cjwvc3ZnPgo=); + --jp-icon-notebook: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8ZyBjbGFzcz0ianAtbm90ZWJvb2staWNvbi1jb2xvciBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiNFRjZDMDAiPgogICAgPHBhdGggZD0iTTE4LjcgMy4zdjE1LjRIMy4zVjMuM2gxNS40bTEuNS0xLjVIMS44djE4LjNoMTguM2wuMS0xOC4zeiIvPgogICAgPHBhdGggZD0iTTE2LjUgMTYuNWwtNS40LTQuMy01LjYgNC4zdi0xMWgxMXoiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-numbering: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjIiIGhlaWdodD0iMjIiIHZpZXdCb3g9IjAgMCAyOCAyOCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CgkJPHBhdGggZD0iTTQgMTlINlYxOS41SDVWMjAuNUg2VjIxSDRWMjJIN1YxOEg0VjE5Wk01IDEwSDZWNkg0VjdINVYxMFpNNCAxM0g1LjhMNCAxNS4xVjE2SDdWMTVINS4yTDcgMTIuOVYxMkg0VjEzWk05IDdWOUgyM1Y3SDlaTTkgMjFIMjNWMTlIOVYyMVpNOSAxNUgyM1YxM0g5VjE1WiIvPgoJPC9nPgo8L3N2Zz4K); + --jp-icon-offline-bolt: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTEyIDIuMDJjLTUuNTEgMC05Ljk4IDQuNDctOS45OCA5Ljk4czQuNDcgOS45OCA5Ljk4IDkuOTggOS45OC00LjQ3IDkuOTgtOS45OFMxNy41MSAyLjAyIDEyIDIuMDJ6TTExLjQ4IDIwdi02LjI2SDhMMTMgNHY2LjI2aDMuMzVMMTEuNDggMjB6Ii8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-palette: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTE4IDEzVjIwSDRWNkg5LjAyQzkuMDcgNS4yOSA5LjI0IDQuNjIgOS41IDRINEMyLjkgNCAyIDQuOSAyIDZWMjBDMiAyMS4xIDIuOSAyMiA0IDIySDE4QzE5LjEgMjIgMjAgMjEuMSAyMCAyMFYxNUwxOCAxM1pNMTkuMyA4Ljg5QzE5Ljc0IDguMTkgMjAgNy4zOCAyMCA2LjVDMjAgNC4wMSAxNy45OSAyIDE1LjUgMkMxMy4wMSAyIDExIDQuMDEgMTEgNi41QzExIDguOTkgMTMuMDEgMTEgMTUuNDkgMTFDMTYuMzcgMTEgMTcuMTkgMTAuNzQgMTcuODggMTAuM0wyMSAxMy40MkwyMi40MiAxMkwxOS4zIDguODlaTTE1LjUgOUMxNC4xMiA5IDEzIDcuODggMTMgNi41QzEzIDUuMTIgMTQuMTIgNCAxNS41IDRDMTYuODggNCAxOCA1LjEyIDE4IDYuNUMxOCA3Ljg4IDE2Ljg4IDkgMTUuNSA5WiIvPgogICAgPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00IDZIOS4wMTg5NEM5LjAwNjM5IDYuMTY1MDIgOSA2LjMzMTc2IDkgNi41QzkgOC44MTU3NyAxMC4yMTEgMTAuODQ4NyAxMi4wMzQzIDEySDlWMTRIMTZWMTIuOTgxMUMxNi41NzAzIDEyLjkzNzcgMTcuMTIgMTIuODIwNyAxNy42Mzk2IDEyLjYzOTZMMTggMTNWMjBINFY2Wk04IDhINlYxMEg4VjhaTTYgMTJIOFYxNEg2VjEyWk04IDE2SDZWMThIOFYxNlpNOSAxNkgxNlYxOEg5VjE2WiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-paste: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTE5IDJoLTQuMThDMTQuNC44NCAxMy4zIDAgMTIgMGMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS03IDBjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptNyAxOEg1VjRoMnYzaDEwVjRoMnYxNnoiLz4KICAgIDwvZz4KPC9zdmc+Cg==); + --jp-icon-pdf: url(data:image/svg+xml;base64,PHN2ZwogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMiAyMiIgd2lkdGg9IjE2Ij4KICAgIDxwYXRoIHRyYW5zZm9ybT0icm90YXRlKDQ1KSIgY2xhc3M9ImpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iI0ZGMkEyQSIKICAgICAgIGQ9Im0gMjIuMzQ0MzY5LC0zLjAxNjM2NDIgaCA1LjYzODYwNCB2IDEuNTc5MjQzMyBoIC0zLjU0OTIyNyB2IDEuNTA4NjkyOTkgaCAzLjMzNzU3NiBWIDEuNjUwODE1NCBoIC0zLjMzNzU3NiB2IDMuNDM1MjYxMyBoIC0yLjA4OTM3NyB6IG0gLTcuMTM2NDQ0LDEuNTc5MjQzMyB2IDQuOTQzOTU0MyBoIDAuNzQ4OTIgcSAxLjI4MDc2MSwwIDEuOTUzNzAzLC0wLjYzNDk1MzUgMC42NzgzNjksLTAuNjM0OTUzNSAwLjY3ODM2OSwtMS44NDUxNjQxIDAsLTEuMjA0NzgzNTUgLTAuNjcyOTQyLC0xLjgzNDMxMDExIC0wLjY3Mjk0MiwtMC42Mjk1MjY1OSAtMS45NTkxMywtMC42Mjk1MjY1OSB6IG0gLTIuMDg5Mzc3LC0xLjU3OTI0MzMgaCAyLjIwMzM0MyBxIDEuODQ1MTY0LDAgMi43NDYwMzksMC4yNjU5MjA3IDAuOTA2MzAxLDAuMjYwNDkzNyAxLjU1MjEwOCwwLjg5MDAyMDMgMC41Njk4MywwLjU0ODEyMjMgMC44NDY2MDUsMS4yNjQ0ODAwNiAwLjI3Njc3NCwwLjcxNjM1NzgxIDAuMjc2Nzc0LDEuNjIyNjU4OTQgMCwwLjkxNzE1NTEgLTAuMjc2Nzc0LDEuNjM4OTM5OSAtMC4yNzY3NzUsMC43MTYzNTc4IC0wLjg0NjYwNSwxLjI2NDQ4IC0wLjY1MTIzNCwwLjYyOTUyNjYgLTEuNTYyOTYyLDAuODk1NDQ3MyAtMC45MTE3MjgsMC4yNjA0OTM3IC0yLjczNTE4NSwwLjI2MDQ5MzcgaCAtMi4yMDMzNDMgeiBtIC04LjE0NTg1NjUsMCBoIDMuNDY3ODIzIHEgMS41NDY2ODE2LDAgMi4zNzE1Nzg1LDAuNjg5MjIzIDAuODMwMzI0LDAuNjgzNzk2MSAwLjgzMDMyNCwxLjk1MzcwMzE0IDAsMS4yNzUzMzM5NyAtMC44MzAzMjQsMS45NjQ1NTcwNiBRIDkuOTg3MTk2MSwyLjI3NDkxNSA4LjQ0MDUxNDUsMi4yNzQ5MTUgSCA3LjA2MjA2ODQgViA1LjA4NjA3NjcgSCA0Ljk3MjY5MTUgWiBtIDIuMDg5Mzc2OSwxLjUxNDExOTkgdiAyLjI2MzAzOTQzIGggMS4xNTU5NDEgcSAwLjYwNzgxODgsMCAwLjkzODg2MjksLTAuMjkzMDU1NDcgMC4zMzEwNDQxLC0wLjI5ODQ4MjQxIDAuMzMxMDQ0MSwtMC44NDExNzc3MiAwLC0wLjU0MjY5NTMxIC0wLjMzMTA0NDEsLTAuODM1NzUwNzQgLTAuMzMxMDQ0MSwtMC4yOTMwNTU1IC0wLjkzODg2MjksLTAuMjkzMDU1NSB6IgovPgo8L3N2Zz4K); + --jp-icon-python: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iLTEwIC0xMCAxMzEuMTYxMzYxNjk0MzM1OTQgMTMyLjM4ODk5OTkzODk2NDg0Ij4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjMzA2OTk4IiBkPSJNIDU0LjkxODc4NSw5LjE5Mjc0MjFlLTQgQyA1MC4zMzUxMzIsMC4wMjIyMTcyNyA0NS45NTc4NDYsMC40MTMxMzY5NyA0Mi4xMDYyODUsMS4wOTQ2NjkzIDMwLjc2MDA2OSwzLjA5OTE3MzEgMjguNzAwMDM2LDcuMjk0NzcxNCAyOC43MDAwMzUsMTUuMDMyMTY5IHYgMTAuMjE4NzUgaCAyNi44MTI1IHYgMy40MDYyNSBoIC0yNi44MTI1IC0xMC4wNjI1IGMgLTcuNzkyNDU5LDAgLTE0LjYxNTc1ODgsNC42ODM3MTcgLTE2Ljc0OTk5OTgsMTMuNTkzNzUgLTIuNDYxODE5OTgsMTAuMjEyOTY2IC0yLjU3MTAxNTA4LDE2LjU4NjAyMyAwLDI3LjI1IDEuOTA1OTI4Myw3LjkzNzg1MiA2LjQ1NzU0MzIsMTMuNTkzNzQ4IDE0LjI0OTk5OTgsMTMuNTkzNzUgaCA5LjIxODc1IHYgLTEyLjI1IGMgMCwtOC44NDk5MDIgNy42NTcxNDQsLTE2LjY1NjI0OCAxNi43NSwtMTYuNjU2MjUgaCAyNi43ODEyNSBjIDcuNDU0OTUxLDAgMTMuNDA2MjUzLC02LjEzODE2NCAxMy40MDYyNSwtMTMuNjI1IHYgLTI1LjUzMTI1IGMgMCwtNy4yNjYzMzg2IC02LjEyOTk4LC0xMi43MjQ3NzcxIC0xMy40MDYyNSwtMTMuOTM3NDk5NyBDIDY0LjI4MTU0OCwwLjMyNzk0Mzk3IDU5LjUwMjQzOCwtMC4wMjAzNzkwMyA1NC45MTg3ODUsOS4xOTI3NDIxZS00IFogbSAtMTQuNSw4LjIxODc1MDEyNTc5IGMgMi43Njk1NDcsMCA1LjAzMTI1LDIuMjk4NjQ1NiA1LjAzMTI1LDUuMTI0OTk5NiAtMmUtNiwyLjgxNjMzNiAtMi4yNjE3MDMsNS4wOTM3NSAtNS4wMzEyNSw1LjA5Mzc1IC0yLjc3OTQ3NiwtMWUtNiAtNS4wMzEyNSwtMi4yNzc0MTUgLTUuMDMxMjUsLTUuMDkzNzUgLTEwZS03LC0yLjgyNjM1MyAyLjI1MTc3NCwtNS4xMjQ5OTk2IDUuMDMxMjUsLTUuMTI0OTk5NiB6Ii8+CiAgPHBhdGggY2xhc3M9ImpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iI2ZmZDQzYiIgZD0ibSA4NS42Mzc1MzUsMjguNjU3MTY5IHYgMTEuOTA2MjUgYyAwLDkuMjMwNzU1IC03LjgyNTg5NSwxNi45OTk5OTkgLTE2Ljc1LDE3IGggLTI2Ljc4MTI1IGMgLTcuMzM1ODMzLDAgLTEzLjQwNjI0OSw2LjI3ODQ4MyAtMTMuNDA2MjUsMTMuNjI1IHYgMjUuNTMxMjQ3IGMgMCw3LjI2NjM0NCA2LjMxODU4OCwxMS41NDAzMjQgMTMuNDA2MjUsMTMuNjI1MDA0IDguNDg3MzMxLDIuNDk1NjEgMTYuNjI2MjM3LDIuOTQ2NjMgMjYuNzgxMjUsMCA2Ljc1MDE1NSwtMS45NTQzOSAxMy40MDYyNTMsLTUuODg3NjEgMTMuNDA2MjUsLTEzLjYyNTAwNCBWIDg2LjUwMDkxOSBoIC0yNi43ODEyNSB2IC0zLjQwNjI1IGggMjYuNzgxMjUgMTMuNDA2MjU0IGMgNy43OTI0NjEsMCAxMC42OTYyNTEsLTUuNDM1NDA4IDEzLjQwNjI0MSwtMTMuNTkzNzUgMi43OTkzMywtOC4zOTg4ODYgMi42ODAyMiwtMTYuNDc1Nzc2IDAsLTI3LjI1IC0xLjkyNTc4LC03Ljc1NzQ0MSAtNS42MDM4NywtMTMuNTkzNzUgLTEzLjQwNjI0MSwtMTMuNTkzNzUgeiBtIC0xNS4wNjI1LDY0LjY1NjI1IGMgMi43Nzk0NzgsM2UtNiA1LjAzMTI1LDIuMjc3NDE3IDUuMDMxMjUsNS4wOTM3NDcgLTJlLTYsMi44MjYzNTQgLTIuMjUxNzc1LDUuMTI1MDA0IC01LjAzMTI1LDUuMTI1MDA0IC0yLjc2OTU1LDAgLTUuMDMxMjUsLTIuMjk4NjUgLTUuMDMxMjUsLTUuMTI1MDA0IDJlLTYsLTIuODE2MzMgMi4yNjE2OTcsLTUuMDkzNzQ3IDUuMDMxMjUsLTUuMDkzNzQ3IHoiLz4KPC9zdmc+Cg==); + --jp-icon-r-kernel: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1jb250cmFzdDMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjMjE5NkYzIiBkPSJNNC40IDIuNWMxLjItLjEgMi45LS4zIDQuOS0uMyAyLjUgMCA0LjEuNCA1LjIgMS4zIDEgLjcgMS41IDEuOSAxLjUgMy41IDAgMi0xLjQgMy41LTIuOSA0LjEgMS4yLjQgMS43IDEuNiAyLjIgMyAuNiAxLjkgMSAzLjkgMS4zIDQuNmgtMy44Yy0uMy0uNC0uOC0xLjctMS4yLTMuN3MtMS4yLTIuNi0yLjYtMi42aC0uOXY2LjRINC40VjIuNXptMy43IDYuOWgxLjRjMS45IDAgMi45LS45IDIuOS0yLjNzLTEtMi4zLTIuOC0yLjNjLS43IDAtMS4zIDAtMS42LjJ2NC41aC4xdi0uMXoiLz4KPC9zdmc+Cg==); + --jp-icon-react: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMTUwIDE1MCA1NDEuOSAyOTUuMyI+CiAgPGcgY2xhc3M9ImpwLWljb24tYnJhbmQyIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iIzYxREFGQiI+CiAgICA8cGF0aCBkPSJNNjY2LjMgMjk2LjVjMC0zMi41LTQwLjctNjMuMy0xMDMuMS04Mi40IDE0LjQtNjMuNiA4LTExNC4yLTIwLjItMTMwLjQtNi41LTMuOC0xNC4xLTUuNi0yMi40LTUuNnYyMi4zYzQuNiAwIDguMy45IDExLjQgMi42IDEzLjYgNy44IDE5LjUgMzcuNSAxNC45IDc1LjctMS4xIDkuNC0yLjkgMTkuMy01LjEgMjkuNC0xOS42LTQuOC00MS04LjUtNjMuNS0xMC45LTEzLjUtMTguNS0yNy41LTM1LjMtNDEuNi01MCAzMi42LTMwLjMgNjMuMi00Ni45IDg0LTQ2LjlWNzhjLTI3LjUgMC02My41IDE5LjYtOTkuOSA1My42LTM2LjQtMzMuOC03Mi40LTUzLjItOTkuOS01My4ydjIyLjNjMjAuNyAwIDUxLjQgMTYuNSA4NCA0Ni42LTE0IDE0LjctMjggMzEuNC00MS4zIDQ5LjktMjIuNiAyLjQtNDQgNi4xLTYzLjYgMTEtMi4zLTEwLTQtMTkuNy01LjItMjktNC43LTM4LjIgMS4xLTY3LjkgMTQuNi03NS44IDMtMS44IDYuOS0yLjYgMTEuNS0yLjZWNzguNWMtOC40IDAtMTYgMS44LTIyLjYgNS42LTI4LjEgMTYuMi0zNC40IDY2LjctMTkuOSAxMzAuMS02Mi4yIDE5LjItMTAyLjcgNDkuOS0xMDIuNyA4Mi4zIDAgMzIuNSA0MC43IDYzLjMgMTAzLjEgODIuNC0xNC40IDYzLjYtOCAxMTQuMiAyMC4yIDEzMC40IDYuNSAzLjggMTQuMSA1LjYgMjIuNSA1LjYgMjcuNSAwIDYzLjUtMTkuNiA5OS45LTUzLjYgMzYuNCAzMy44IDcyLjQgNTMuMiA5OS45IDUzLjIgOC40IDAgMTYtMS44IDIyLjYtNS42IDI4LjEtMTYuMiAzNC40LTY2LjcgMTkuOS0xMzAuMSA2Mi0xOS4xIDEwMi41LTQ5LjkgMTAyLjUtODIuM3ptLTEzMC4yLTY2LjdjLTMuNyAxMi45LTguMyAyNi4yLTEzLjUgMzkuNS00LjEtOC04LjQtMTYtMTMuMS0yNC00LjYtOC05LjUtMTUuOC0xNC40LTIzLjQgMTQuMiAyLjEgMjcuOSA0LjcgNDEgNy45em0tNDUuOCAxMDYuNWMtNy44IDEzLjUtMTUuOCAyNi4zLTI0LjEgMzguMi0xNC45IDEuMy0zMCAyLTQ1LjIgMi0xNS4xIDAtMzAuMi0uNy00NS0xLjktOC4zLTExLjktMTYuNC0yNC42LTI0LjItMzgtNy42LTEzLjEtMTQuNS0yNi40LTIwLjgtMzkuOCA2LjItMTMuNCAxMy4yLTI2LjggMjAuNy0zOS45IDcuOC0xMy41IDE1LjgtMjYuMyAyNC4xLTM4LjIgMTQuOS0xLjMgMzAtMiA0NS4yLTIgMTUuMSAwIDMwLjIuNyA0NSAxLjkgOC4zIDExLjkgMTYuNCAyNC42IDI0LjIgMzggNy42IDEzLjEgMTQuNSAyNi40IDIwLjggMzkuOC02LjMgMTMuNC0xMy4yIDI2LjgtMjAuNyAzOS45em0zMi4zLTEzYzUuNCAxMy40IDEwIDI2LjggMTMuOCAzOS44LTEzLjEgMy4yLTI2LjkgNS45LTQxLjIgOCA0LjktNy43IDkuOC0xNS42IDE0LjQtMjMuNyA0LjYtOCA4LjktMTYuMSAxMy0yNC4xek00MjEuMiA0MzBjLTkuMy05LjYtMTguNi0yMC4zLTI3LjgtMzIgOSAuNCAxOC4yLjcgMjcuNS43IDkuNCAwIDE4LjctLjIgMjcuOC0uNy05IDExLjctMTguMyAyMi40LTI3LjUgMzJ6bS03NC40LTU4LjljLTE0LjItMi4xLTI3LjktNC43LTQxLTcuOSAzLjctMTIuOSA4LjMtMjYuMiAxMy41LTM5LjUgNC4xIDggOC40IDE2IDEzLjEgMjQgNC43IDggOS41IDE1LjggMTQuNCAyMy40ek00MjAuNyAxNjNjOS4zIDkuNiAxOC42IDIwLjMgMjcuOCAzMi05LS40LTE4LjItLjctMjcuNS0uNy05LjQgMC0xOC43LjItMjcuOC43IDktMTEuNyAxOC4zLTIyLjQgMjcuNS0zMnptLTc0IDU4LjljLTQuOSA3LjctOS44IDE1LjYtMTQuNCAyMy43LTQuNiA4LTguOSAxNi0xMyAyNC01LjQtMTMuNC0xMC0yNi44LTEzLjgtMzkuOCAxMy4xLTMuMSAyNi45LTUuOCA0MS4yLTcuOXptLTkwLjUgMTI1LjJjLTM1LjQtMTUuMS01OC4zLTM0LjktNTguMy01MC42IDAtMTUuNyAyMi45LTM1LjYgNTguMy01MC42IDguNi0zLjcgMTgtNyAyNy43LTEwLjEgNS43IDE5LjYgMTMuMiA0MCAyMi41IDYwLjktOS4yIDIwLjgtMTYuNiA0MS4xLTIyLjIgNjAuNi05LjktMy4xLTE5LjMtNi41LTI4LTEwLjJ6TTMxMCA0OTBjLTEzLjYtNy44LTE5LjUtMzcuNS0xNC45LTc1LjcgMS4xLTkuNCAyLjktMTkuMyA1LjEtMjkuNCAxOS42IDQuOCA0MSA4LjUgNjMuNSAxMC45IDEzLjUgMTguNSAyNy41IDM1LjMgNDEuNiA1MC0zMi42IDMwLjMtNjMuMiA0Ni45LTg0IDQ2LjktNC41LS4xLTguMy0xLTExLjMtMi43em0yMzcuMi03Ni4yYzQuNyAzOC4yLTEuMSA2Ny45LTE0LjYgNzUuOC0zIDEuOC02LjkgMi42LTExLjUgMi42LTIwLjcgMC01MS40LTE2LjUtODQtNDYuNiAxNC0xNC43IDI4LTMxLjQgNDEuMy00OS45IDIyLjYtMi40IDQ0LTYuMSA2My42LTExIDIuMyAxMC4xIDQuMSAxOS44IDUuMiAyOS4xem0zOC41LTY2LjdjLTguNiAzLjctMTggNy0yNy43IDEwLjEtNS43LTE5LjYtMTMuMi00MC0yMi41LTYwLjkgOS4yLTIwLjggMTYuNi00MS4xIDIyLjItNjAuNiA5LjkgMy4xIDE5LjMgNi41IDI4LjEgMTAuMiAzNS40IDE1LjEgNTguMyAzNC45IDU4LjMgNTAuNi0uMSAxNS43LTIzIDM1LjYtNTguNCA1MC42ek0zMjAuOCA3OC40eiIvPgogICAgPGNpcmNsZSBjeD0iNDIwLjkiIGN5PSIyOTYuNSIgcj0iNDUuNyIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-redo: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjE2Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgICA8cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE4LjQgMTAuNkMxNi41NSA4Ljk5IDE0LjE1IDggMTEuNSA4Yy00LjY1IDAtOC41OCAzLjAzLTkuOTYgNy4yMkwzLjkgMTZjMS4wNS0zLjE5IDQuMDUtNS41IDcuNi01LjUgMS45NSAwIDMuNzMuNzIgNS4xMiAxLjg4TDEzIDE2aDlWN2wtMy42IDMuNnoiLz4KICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-refresh: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDE4IDE4Ij4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTkgMTMuNWMtMi40OSAwLTQuNS0yLjAxLTQuNS00LjVTNi41MSA0LjUgOSA0LjVjMS4yNCAwIDIuMzYuNTIgMy4xNyAxLjMzTDEwIDhoNVYzbC0xLjc2IDEuNzZDMTIuMTUgMy42OCAxMC42NiAzIDkgMyA1LjY5IDMgMy4wMSA1LjY5IDMuMDEgOVM1LjY5IDE1IDkgMTVjMi45NyAwIDUuNDMtMi4xNiA1LjktNWgtMS41MmMtLjQ2IDItMi4yNCAzLjUtNC4zOCAzLjV6Ii8+CiAgICA8L2c+Cjwvc3ZnPgo=); + --jp-icon-regex: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwIDIwIj4KICA8ZyBjbGFzcz0ianAtaWNvbjIiIGZpbGw9IiM0MTQxNDEiPgogICAgPHJlY3QgeD0iMiIgeT0iMiIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ii8+CiAgPC9nPgoKICA8ZyBjbGFzcz0ianAtaWNvbi1hY2NlbnQyIiBmaWxsPSIjRkZGIj4KICAgIDxjaXJjbGUgY2xhc3M9InN0MiIgY3g9IjUuNSIgY3k9IjE0LjUiIHI9IjEuNSIvPgogICAgPHJlY3QgeD0iMTIiIHk9IjQiIGNsYXNzPSJzdDIiIHdpZHRoPSIxIiBoZWlnaHQ9IjgiLz4KICAgIDxyZWN0IHg9IjguNSIgeT0iNy41IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjg2NiAtMC41IDAuNSAwLjg2NiAtMi4zMjU1IDcuMzIxOSkiIGNsYXNzPSJzdDIiIHdpZHRoPSI4IiBoZWlnaHQ9IjEiLz4KICAgIDxyZWN0IHg9IjEyIiB5PSI0IiB0cmFuc2Zvcm09Im1hdHJpeCgwLjUgLTAuODY2IDAuODY2IDAuNSAtMC42Nzc5IDE0LjgyNTIpIiBjbGFzcz0ic3QyIiB3aWR0aD0iMSIgaGVpZ2h0PSI4Ii8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-run: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTggNXYxNGwxMS03eiIvPgogICAgPC9nPgo8L3N2Zz4K); + --jp-icon-running: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDUxMiA1MTIiPgogIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICA8cGF0aCBkPSJNMjU2IDhDMTE5IDggOCAxMTkgOCAyNTZzMTExIDI0OCAyNDggMjQ4IDI0OC0xMTEgMjQ4LTI0OFMzOTMgOCAyNTYgOHptOTYgMzI4YzAgOC44LTcuMiAxNi0xNiAxNkgxNzZjLTguOCAwLTE2LTcuMi0xNi0xNlYxNzZjMC04LjggNy4yLTE2IDE2LTE2aDE2MGM4LjggMCAxNiA3LjIgMTYgMTZ2MTYweiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-save: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTE3IDNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjdsLTQtNHptLTUgMTZjLTEuNjYgMC0zLTEuMzQtMy0zczEuMzQtMyAzLTMgMyAxLjM0IDMgMy0xLjM0IDMtMyAzem0zLTEwSDVWNWgxMHY0eiIvPgogICAgPC9nPgo8L3N2Zz4K); + --jp-icon-search: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTggMTgiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTEyLjEsMTAuOWgtMC43bC0wLjItMC4yYzAuOC0wLjksMS4zLTIuMiwxLjMtMy41YzAtMy0yLjQtNS40LTUuNC01LjRTMS44LDQuMiwxLjgsNy4xczIuNCw1LjQsNS40LDUuNCBjMS4zLDAsMi41LTAuNSwzLjUtMS4zbDAuMiwwLjJ2MC43bDQuMSw0LjFsMS4yLTEuMkwxMi4xLDEwLjl6IE03LjEsMTAuOWMtMi4xLDAtMy43LTEuNy0zLjctMy43czEuNy0zLjcsMy43LTMuN3MzLjcsMS43LDMuNywzLjcgUzkuMiwxMC45LDcuMSwxMC45eiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-settings: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMTkuNDMgMTIuOThjLjA0LS4zMi4wNy0uNjQuMDctLjk4cy0uMDMtLjY2LS4wNy0uOThsMi4xMS0xLjY1Yy4xOS0uMTUuMjQtLjQyLjEyLS42NGwtMi0zLjQ2Yy0uMTItLjIyLS4zOS0uMy0uNjEtLjIybC0yLjQ5IDFjLS41Mi0uNC0xLjA4LS43My0xLjY5LS45OGwtLjM4LTIuNjVBLjQ4OC40ODggMCAwMDE0IDJoLTRjLS4yNSAwLS40Ni4xOC0uNDkuNDJsLS4zOCAyLjY1Yy0uNjEuMjUtMS4xNy41OS0xLjY5Ljk4bC0yLjQ5LTFjLS4yMy0uMDktLjQ5IDAtLjYxLjIybC0yIDMuNDZjLS4xMy4yMi0uMDcuNDkuMTIuNjRsMi4xMSAxLjY1Yy0uMDQuMzItLjA3LjY1LS4wNy45OHMuMDMuNjYuMDcuOThsLTIuMTEgMS42NWMtLjE5LjE1LS4yNC40Mi0uMTIuNjRsMiAzLjQ2Yy4xMi4yMi4zOS4zLjYxLjIybDIuNDktMWMuNTIuNCAxLjA4LjczIDEuNjkuOThsLjM4IDIuNjVjLjAzLjI0LjI0LjQyLjQ5LjQyaDRjLjI1IDAgLjQ2LS4xOC40OS0uNDJsLjM4LTIuNjVjLjYxLS4yNSAxLjE3LS41OSAxLjY5LS45OGwyLjQ5IDFjLjIzLjA5LjQ5IDAgLjYxLS4yMmwyLTMuNDZjLjEyLS4yMi4wNy0uNDktLjEyLS42NGwtMi4xMS0xLjY1ek0xMiAxNS41Yy0xLjkzIDAtMy41LTEuNTctMy41LTMuNXMxLjU3LTMuNSAzLjUtMy41IDMuNSAxLjU3IDMuNSAzLjUtMS41NyAzLjUtMy41IDMuNXoiLz4KPC9zdmc+Cg==); + --jp-icon-share: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTSAxOCAyIEMgMTYuMzU0OTkgMiAxNSAzLjM1NDk5MDQgMTUgNSBDIDE1IDUuMTkwOTUyOSAxNS4wMjE3OTEgNS4zNzcxMjI0IDE1LjA1NjY0MSA1LjU1ODU5MzggTCA3LjkyMTg3NSA5LjcyMDcwMzEgQyA3LjM5ODUzOTkgOS4yNzc4NTM5IDYuNzMyMDc3MSA5IDYgOSBDIDQuMzU0OTkwNCA5IDMgMTAuMzU0OTkgMyAxMiBDIDMgMTMuNjQ1MDEgNC4zNTQ5OTA0IDE1IDYgMTUgQyA2LjczMjA3NzEgMTUgNy4zOTg1Mzk5IDE0LjcyMjE0NiA3LjkyMTg3NSAxNC4yNzkyOTcgTCAxNS4wNTY2NDEgMTguNDM5NDUzIEMgMTUuMDIxNTU1IDE4LjYyMTUxNCAxNSAxOC44MDgzODYgMTUgMTkgQyAxNSAyMC42NDUwMSAxNi4zNTQ5OSAyMiAxOCAyMiBDIDE5LjY0NTAxIDIyIDIxIDIwLjY0NTAxIDIxIDE5IEMgMjEgMTcuMzU0OTkgMTkuNjQ1MDEgMTYgMTggMTYgQyAxNy4yNjc0OCAxNiAxNi42MDE1OTMgMTYuMjc5MzI4IDE2LjA3ODEyNSAxNi43MjI2NTYgTCA4Ljk0MzM1OTQgMTIuNTU4NTk0IEMgOC45NzgyMDk1IDEyLjM3NzEyMiA5IDEyLjE5MDk1MyA5IDEyIEMgOSAxMS44MDkwNDcgOC45NzgyMDk1IDExLjYyMjg3OCA4Ljk0MzM1OTQgMTEuNDQxNDA2IEwgMTYuMDc4MTI1IDcuMjc5Mjk2OSBDIDE2LjYwMTQ2IDcuNzIyMTQ2MSAxNy4yNjc5MjMgOCAxOCA4IEMgMTkuNjQ1MDEgOCAyMSA2LjY0NTAwOTYgMjEgNSBDIDIxIDMuMzU0OTkwNCAxOS42NDUwMSAyIDE4IDIgeiBNIDE4IDQgQyAxOC41NjQxMjkgNCAxOSA0LjQzNTg3MDYgMTkgNSBDIDE5IDUuNTY0MTI5NCAxOC41NjQxMjkgNiAxOCA2IEMgMTcuNDM1ODcxIDYgMTcgNS41NjQxMjk0IDE3IDUgQyAxNyA0LjQzNTg3MDYgMTcuNDM1ODcxIDQgMTggNCB6IE0gNiAxMSBDIDYuNTY0MTI5NCAxMSA3IDExLjQzNTg3MSA3IDEyIEMgNyAxMi41NjQxMjkgNi41NjQxMjk0IDEzIDYgMTMgQyA1LjQzNTg3MDYgMTMgNSAxMi41NjQxMjkgNSAxMiBDIDUgMTEuNDM1ODcxIDUuNDM1ODcwNiAxMSA2IDExIHogTSAxOCAxOCBDIDE4LjU2NDEyOSAxOCAxOSAxOC40MzU4NzEgMTkgMTkgQyAxOSAxOS41NjQxMjkgMTguNTY0MTI5IDIwIDE4IDIwIEMgMTcuNDM1ODcxIDIwIDE3IDE5LjU2NDEyOSAxNyAxOSBDIDE3IDE4LjQzNTg3MSAxNy40MzU4NzEgMTggMTggMTggeiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-spreadsheet: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1jb250cmFzdDEganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNENBRjUwIiBkPSJNMi4yIDIuMnYxNy42aDE3LjZWMi4ySDIuMnptMTUuNCA3LjdoLTUuNVY0LjRoNS41djUuNXpNOS45IDQuNHY1LjVINC40VjQuNGg1LjV6bS01LjUgNy43aDUuNXY1LjVINC40di01LjV6bTcuNyA1LjV2LTUuNWg1LjV2NS41aC01LjV6Ii8+Cjwvc3ZnPgo=); + --jp-icon-stop: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPgogICAgICAgIDxwYXRoIGQ9Ik02IDZoMTJ2MTJINnoiLz4KICAgIDwvZz4KPC9zdmc+Cg==); + --jp-icon-tab: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTIxIDNIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDNWNWgxMHY0aDh2MTB6Ii8+CiAgPC9nPgo8L3N2Zz4K); + --jp-icon-table-rows: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0yMSw4SDNWNGgxOFY4eiBNMjEsMTBIM3Y0aDE4VjEweiBNMjEsMTZIM3Y0aDE4VjE2eiIvPgogICAgPC9nPgo8L3N2Zz4K); + --jp-icon-tag: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjgiIGhlaWdodD0iMjgiIHZpZXdCb3g9IjAgMCA0MyAyOCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CgkJPHBhdGggZD0iTTI4LjgzMzIgMTIuMzM0TDMyLjk5OTggMTYuNTAwN0wzNy4xNjY1IDEyLjMzNEgyOC44MzMyWiIvPgoJCTxwYXRoIGQ9Ik0xNi4yMDk1IDIxLjYxMDRDMTUuNjg3MyAyMi4xMjk5IDE0Ljg0NDMgMjIuMTI5OSAxNC4zMjQ4IDIxLjYxMDRMNi45ODI5IDE0LjcyNDVDNi41NzI0IDE0LjMzOTQgNi4wODMxMyAxMy42MDk4IDYuMDQ3ODYgMTMuMDQ4MkM1Ljk1MzQ3IDExLjUyODggNi4wMjAwMiA4LjYxOTQ0IDYuMDY2MjEgNy4wNzY5NUM2LjA4MjgxIDYuNTE0NzcgNi41NTU0OCA2LjA0MzQ3IDcuMTE4MDQgNi4wMzA1NUM5LjA4ODYzIDUuOTg0NzMgMTMuMjYzOCA1LjkzNTc5IDEzLjY1MTggNi4zMjQyNUwyMS43MzY5IDEzLjYzOUMyMi4yNTYgMTQuMTU4NSAyMS43ODUxIDE1LjQ3MjQgMjEuMjYyIDE1Ljk5NDZMMTYuMjA5NSAyMS42MTA0Wk05Ljc3NTg1IDguMjY1QzkuMzM1NTEgNy44MjU2NiA4LjYyMzUxIDcuODI1NjYgOC4xODI4IDguMjY1QzcuNzQzNDYgOC43MDU3MSA3Ljc0MzQ2IDkuNDE3MzMgOC4xODI4IDkuODU2NjdDOC42MjM4MiAxMC4yOTY0IDkuMzM1ODIgMTAuMjk2NCA5Ljc3NTg1IDkuODU2NjdDMTAuMjE1NiA5LjQxNzMzIDEwLjIxNTYgOC43MDUzMyA5Ljc3NTg1IDguMjY1WiIvPgoJPC9nPgo8L3N2Zz4K); + --jp-icon-terminal: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0IiA+CiAgICA8cmVjdCBjbGFzcz0ianAtdGVybWluYWwtaWNvbi1iYWNrZ3JvdW5kLWNvbG9yIGpwLWljb24tc2VsZWN0YWJsZSIgd2lkdGg9IjIwIiBoZWlnaHQ9IjIwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyIDIpIiBmaWxsPSIjMzMzMzMzIi8+CiAgICA8cGF0aCBjbGFzcz0ianAtdGVybWluYWwtaWNvbi1jb2xvciBqcC1pY29uLXNlbGVjdGFibGUtaW52ZXJzZSIgZD0iTTUuMDU2NjQgOC43NjE3MkM1LjA1NjY0IDguNTk3NjYgNS4wMzEyNSA4LjQ1MzEyIDQuOTgwNDcgOC4zMjgxMkM0LjkzMzU5IDguMTk5MjIgNC44NTU0NyA4LjA4MjAzIDQuNzQ2MDkgNy45NzY1NkM0LjY0MDYyIDcuODcxMDkgNC41IDcuNzc1MzkgNC4zMjQyMiA3LjY4OTQ1QzQuMTUyMzQgNy41OTk2MSAzLjk0MzM2IDcuNTExNzIgMy42OTcyNyA3LjQyNTc4QzMuMzAyNzMgNy4yODUxNiAyLjk0MzM2IDcuMTM2NzIgMi42MTkxNCA2Ljk4MDQ3QzIuMjk0OTIgNi44MjQyMiAyLjAxNzU4IDYuNjQyNTggMS43ODcxMSA2LjQzNTU1QzEuNTYwNTUgNi4yMjg1MiAxLjM4NDc3IDUuOTg4MjggMS4yNTk3NyA1LjcxNDg0QzEuMTM0NzcgNS40Mzc1IDEuMDcyMjcgNS4xMDkzOCAxLjA3MjI3IDQuNzMwNDdDMS4wNzIyNyA0LjM5ODQ0IDEuMTI4OTEgNC4wOTU3IDEuMjQyMTkgMy44MjIyN0MxLjM1NTQ3IDMuNTQ0OTIgMS41MTU2MiAzLjMwNDY5IDEuNzIyNjYgMy4xMDE1NkMxLjkyOTY5IDIuODk4NDQgMi4xNzk2OSAyLjczNDM3IDIuNDcyNjYgMi42MDkzOEMyLjc2NTYyIDIuNDg0MzggMy4wOTE4IDIuNDA0MyAzLjQ1MTE3IDIuMzY5MTRWMS4xMDkzOEg0LjM4ODY3VjIuMzgwODZDNC43NDAyMyAyLjQyNzczIDUuMDU2NjQgMi41MjM0NCA1LjMzNzg5IDIuNjY3OTdDNS42MTkxNCAyLjgxMjUgNS44NTc0MiAzLjAwMTk1IDYuMDUyNzMgMy4yMzYzM0M2LjI1MTk1IDMuNDY2OCA2LjQwNDMgMy43NDAyMyA2LjUwOTc3IDQuMDU2NjRDNi42MTkxNCA0LjM2OTE0IDYuNjczODMgNC43MjA3IDYuNjczODMgNS4xMTEzM0g1LjA0NDkyQzUuMDQ0OTIgNC42Mzg2NyA0LjkzNzUgNC4yODEyNSA0LjcyMjY2IDQuMDM5MDZDNC41MDc4MSAzLjc5Mjk3IDQuMjE2OCAzLjY2OTkyIDMuODQ5NjEgMy42Njk5MkMzLjY1MDM5IDMuNjY5OTIgMy40NzY1NiAzLjY5NzI3IDMuMzI4MTIgMy43NTE5NUMzLjE4MzU5IDMuODAyNzMgMy4wNjQ0NSAzLjg3Njk1IDIuOTcwNyAzLjk3NDYxQzIuODc2OTUgNC4wNjgzNiAyLjgwNjY0IDQuMTc5NjkgMi43NTk3NyA0LjMwODU5QzIuNzE2OCA0LjQzNzUgMi42OTUzMSA0LjU3ODEyIDIuNjk1MzEgNC43MzA0N0MyLjY5NTMxIDQuODgyODEgMi43MTY4IDUuMDE5NTMgMi43NTk3NyA1LjE0MDYyQzIuODA2NjQgNS4yNTc4MSAyLjg4MjgxIDUuMzY3MTkgMi45ODgyOCA1LjQ2ODc1QzMuMDk3NjYgNS41NzAzMSAzLjI0MDIzIDUuNjY3OTcgMy40MTYwMiA1Ljc2MTcyQzMuNTkxOCA1Ljg1MTU2IDMuODEwNTUgNS45NDMzNiA0LjA3MjI3IDYuMDM3MTFDNC40NjY4IDYuMTg1NTUgNC44MjQyMiA2LjMzOTg0IDUuMTQ0NTMgNi41QzUuNDY0ODQgNi42NTYyNSA1LjczODI4IDYuODM5ODQgNS45NjQ4NCA3LjA1MDc4QzYuMTk1MzEgNy4yNTc4MSA2LjM3MTA5IDcuNSA2LjQ5MjE5IDcuNzc3MzRDNi42MTcxOSA4LjA1MDc4IDYuNjc5NjkgOC4zNzUgNi42Nzk2OSA4Ljc1QzYuNjc5NjkgOS4wOTM3NSA2LjYyMzA1IDkuNDA0MyA2LjUwOTc3IDkuNjgxNjRDNi4zOTY0OCA5Ljk1NTA4IDYuMjM0MzggMTAuMTkxNCA2LjAyMzQ0IDEwLjM5MDZDNS44MTI1IDEwLjU4OTggNS41NTg1OSAxMC43NSA1LjI2MTcyIDEwLjg3MTFDNC45NjQ4NCAxMC45ODgzIDQuNjMyODEgMTEuMDY0NSA0LjI2NTYyIDExLjA5OTZWMTIuMjQ4SDMuMzMzOThWMTEuMDk5NkMzLjAwMTk1IDExLjA2ODQgMi42Nzk2OSAxMC45OTYxIDIuMzY3MTkgMTAuODgyOEMyLjA1NDY5IDEwLjc2NTYgMS43NzczNCAxMC41OTc3IDEuNTM1MTYgMTAuMzc4OUMxLjI5Njg4IDEwLjE2MDIgMS4xMDU0NyA5Ljg4NDc3IDAuOTYwOTM4IDkuNTUyNzNDMC44MTY0MDYgOS4yMTY4IDAuNzQ0MTQxIDguODE0NDUgMC43NDQxNDEgOC4zNDU3SDIuMzc4OTFDMi4zNzg5MSA4LjYyNjk1IDIuNDE5OTIgOC44NjMyOCAyLjUwMTk1IDkuMDU0NjlDMi41ODM5OCA5LjI0MjE5IDIuNjg5NDUgOS4zOTI1OCAyLjgxODM2IDkuNTA1ODZDMi45NTExNyA5LjYxNTIzIDMuMTAxNTYgOS42OTMzNiAzLjI2OTUzIDkuNzQwMjNDMy40Mzc1IDkuNzg3MTEgMy42MDkzOCA5LjgxMDU1IDMuNzg1MTYgOS44MTA1NUM0LjIwMzEyIDkuODEwNTUgNC41MTk1MyA5LjcxMjg5IDQuNzM0MzggOS41MTc1OEM0Ljk0OTIyIDkuMzIyMjcgNS4wNTY2NCA5LjA3MDMxIDUuMDU2NjQgOC43NjE3MlpNMTMuNDE4IDEyLjI3MTVIOC4wNzQyMlYxMUgxMy40MThWMTIuMjcxNVoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMuOTUyNjQgNikiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPgo=); + --jp-icon-text-editor: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtdGV4dC1lZGl0b3ItaWNvbi1jb2xvciBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiM2MTYxNjEiIGQ9Ik0xNSAxNUgzdjJoMTJ2LTJ6bTAtOEgzdjJoMTJWN3pNMyAxM2gxOHYtMkgzdjJ6bTAgOGgxOHYtMkgzdjJ6TTMgM3YyaDE4VjNIM3oiLz4KPC9zdmc+Cg==); + --jp-icon-toc: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxwYXRoIGQ9Ik03LDVIMjFWN0g3VjVNNywxM1YxMUgyMVYxM0g3TTQsNC41QTEuNSwxLjUgMCAwLDEgNS41LDZBMS41LDEuNSAwIDAsMSA0LDcuNUExLjUsMS41IDAgMCwxIDIuNSw2QTEuNSwxLjUgMCAwLDEgNCw0LjVNNCwxMC41QTEuNSwxLjUgMCAwLDEgNS41LDEyQTEuNSwxLjUgMCAwLDEgNCwxMy41QTEuNSwxLjUgMCAwLDEgMi41LDEyQTEuNSwxLjUgMCAwLDEgNCwxMC41TTcsMTlWMTdIMjFWMTlIN000LDE2LjVBMS41LDEuNSAwIDAsMSA1LjUsMThBMS41LDEuNSAwIDAsMSA0LDE5LjVBMS41LDEuNSAwIDAsMSAyLjUsMThBMS41LDEuNSAwIDAsMSA0LDE2LjVaIiAvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-tree-view: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0yMiAxMVYzaC03djNIOVYzSDJ2OGg3VjhoMnYxMGg0djNoN3YtOGgtN3YzaC0yVjhoMnYzeiIvPgogICAgPC9nPgo8L3N2Zz4K); + --jp-icon-trusted: url(data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI1Ij4KICAgIDxwYXRoIGNsYXNzPSJqcC1pY29uMiIgc3Ryb2tlPSIjMzMzMzMzIiBzdHJva2Utd2lkdGg9IjIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIgMykiIGQ9Ik0xLjg2MDk0IDExLjQ0MDlDMC44MjY0NDggOC43NzAyNyAwLjg2Mzc3OSA2LjA1NzY0IDEuMjQ5MDcgNC4xOTkzMkMyLjQ4MjA2IDMuOTMzNDcgNC4wODA2OCAzLjQwMzQ3IDUuNjAxMDIgMi44NDQ5QzcuMjM1NDkgMi4yNDQ0IDguODU2NjYgMS41ODE1IDkuOTg3NiAxLjA5NTM5QzExLjA1OTcgMS41ODM0MSAxMi42MDk0IDIuMjQ0NCAxNC4yMTggMi44NDMzOUMxNS43NTAzIDMuNDEzOTQgMTcuMzk5NSAzLjk1MjU4IDE4Ljc1MzkgNC4yMTM4NUMxOS4xMzY0IDYuMDcxNzcgMTkuMTcwOSA4Ljc3NzIyIDE4LjEzOSAxMS40NDA5QzE3LjAzMDMgMTQuMzAzMiAxNC42NjY4IDE3LjE4NDQgOS45OTk5OSAxOC45MzU0QzUuMzMzMiAxNy4xODQ0IDIuOTY5NjggMTQuMzAzMiAxLjg2MDk0IDExLjQ0MDlaIi8+CiAgICA8cGF0aCBjbGFzcz0ianAtaWNvbjIiIGZpbGw9IiMzMzMzMzMiIHN0cm9rZT0iIzMzMzMzMyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOCA5Ljg2NzE5KSIgZD0iTTIuODYwMTUgNC44NjUzNUwwLjcyNjU0OSAyLjk5OTU5TDAgMy42MzA0NUwyLjg2MDE1IDYuMTMxNTdMOCAwLjYzMDg3Mkw3LjI3ODU3IDBMMi44NjAxNSA0Ljg2NTM1WiIvPgo8L3N2Zz4K); + --jp-icon-undo: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTEyLjUgOGMtMi42NSAwLTUuMDUuOTktNi45IDIuNkwyIDd2OWg5bC0zLjYyLTMuNjJjMS4zOS0xLjE2IDMuMTYtMS44OCA1LjEyLTEuODggMy41NCAwIDYuNTUgMi4zMSA3LjYgNS41bDIuMzctLjc4QzIxLjA4IDExLjAzIDE3LjE1IDggMTIuNSA4eiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-user: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIHZpZXdCb3g9IjAgMCAyNCAyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTE2IDdhNCA0IDAgMTEtOCAwIDQgNCAwIDAxOCAwek0xMiAxNGE3IDcgMCAwMC03IDdoMTRhNyA3IDAgMDAtNy03eiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-users: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDM2IDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogPGcgY2xhc3M9ImpwLWljb24zIiB0cmFuc2Zvcm09Im1hdHJpeCgxLjczMjcgMCAwIDEuNzMyNyAtMy42MjgyIC4wOTk1NzcpIiBmaWxsPSIjNjE2MTYxIj4KICA8cGF0aCB0cmFuc2Zvcm09Im1hdHJpeCgxLjUsMCwwLDEuNSwwLC02KSIgZD0ibTEyLjE4NiA3LjUwOThjLTEuMDUzNSAwLTEuOTc1NyAwLjU2NjUtMi40Nzg1IDEuNDEwMiAwLjc1MDYxIDAuMzEyNzcgMS4zOTc0IDAuODI2NDggMS44NzMgMS40NzI3aDMuNDg2M2MwLTEuNTkyLTEuMjg4OS0yLjg4MjgtMi44ODA5LTIuODgyOHoiLz4KICA8cGF0aCBkPSJtMjAuNDY1IDIuMzg5NWEyLjE4ODUgMi4xODg1IDAgMCAxLTIuMTg4NCAyLjE4ODUgMi4xODg1IDIuMTg4NSAwIDAgMS0yLjE4ODUtMi4xODg1IDIuMTg4NSAyLjE4ODUgMCAwIDEgMi4xODg1LTIuMTg4NSAyLjE4ODUgMi4xODg1IDAgMCAxIDIuMTg4NCAyLjE4ODV6Ii8+CiAgPHBhdGggdHJhbnNmb3JtPSJtYXRyaXgoMS41LDAsMCwxLjUsMCwtNikiIGQ9Im0zLjU4OTggOC40MjE5Yy0xLjExMjYgMC0yLjAxMzcgMC45MDExMS0yLjAxMzcgMi4wMTM3aDIuODE0NWMwLjI2Nzk3LTAuMzczMDkgMC41OTA3LTAuNzA0MzUgMC45NTg5OC0wLjk3ODUyLTAuMzQ0MzMtMC42MTY4OC0xLjAwMzEtMS4wMzUyLTEuNzU5OC0xLjAzNTJ6Ii8+CiAgPHBhdGggZD0ibTYuOTE1NCA0LjYyM2ExLjUyOTQgMS41Mjk0IDAgMCAxLTEuNTI5NCAxLjUyOTQgMS41Mjk0IDEuNTI5NCAwIDAgMS0xLjUyOTQtMS41Mjk0IDEuNTI5NCAxLjUyOTQgMCAwIDEgMS41Mjk0LTEuNTI5NCAxLjUyOTQgMS41Mjk0IDAgMCAxIDEuNTI5NCAxLjUyOTR6Ii8+CiAgPHBhdGggZD0ibTYuMTM1IDEzLjUzNWMwLTMuMjM5MiAyLjYyNTktNS44NjUgNS44NjUtNS44NjUgMy4yMzkyIDAgNS44NjUgMi42MjU5IDUuODY1IDUuODY1eiIvPgogIDxjaXJjbGUgY3g9IjEyIiBjeT0iMy43Njg1IiByPSIyLjk2ODUiLz4KIDwvZz4KPC9zdmc+Cg==); + --jp-icon-vega: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8ZyBjbGFzcz0ianAtaWNvbjEganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjMjEyMTIxIj4KICAgIDxwYXRoIGQ9Ik0xMC42IDUuNGwyLjItMy4ySDIuMnY3LjNsNC02LjZ6Ii8+CiAgICA8cGF0aCBkPSJNMTUuOCAyLjJsLTQuNCA2LjZMNyA2LjNsLTQuOCA4djUuNWgxNy42VjIuMmgtNHptLTcgMTUuNEg1LjV2LTQuNGgzLjN2NC40em00LjQgMEg5LjhWOS44aDMuNHY3Ljh6bTQuNCAwaC0zLjRWNi41aDMuNHYxMS4xeiIvPgogIDwvZz4KPC9zdmc+Cg==); + --jp-icon-word: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwIDIwIj4KIDxnIGNsYXNzPSJqcC1pY29uMiIgZmlsbD0iIzQxNDE0MSI+CiAgPHJlY3QgeD0iMiIgeT0iMiIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ii8+CiA8L2c+CiA8ZyBjbGFzcz0ianAtaWNvbi1hY2NlbnQyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSguNDMgLjA0MDEpIiBmaWxsPSIjZmZmIj4KICA8cGF0aCBkPSJtNC4xNCA4Ljc2cTAuMDY4Mi0xLjg5IDIuNDItMS44OSAxLjE2IDAgMS42OCAwLjQyIDAuNTY3IDAuNDEgMC41NjcgMS4xNnYzLjQ3cTAgMC40NjIgMC41MTQgMC40NjIgMC4xMDMgMCAwLjItMC4wMjMxdjAuNzE0cS0wLjM5OSAwLjEwMy0wLjY1MSAwLjEwMy0wLjQ1MiAwLTAuNjkzLTAuMjItMC4yMzEtMC4yLTAuMjg0LTAuNjYyLTAuOTU2IDAuODcyLTIgMC44NzItMC45MDMgMC0xLjQ3LTAuNDcyLTAuNTI1LTAuNDcyLTAuNTI1LTEuMjYgMC0wLjI2MiAwLjA0NTItMC40NzIgMC4wNTY3LTAuMjIgMC4xMTYtMC4zNzggMC4wNjgyLTAuMTY4IDAuMjMxLTAuMzA0IDAuMTU4LTAuMTQ3IDAuMjYyLTAuMjQyIDAuMTE2LTAuMDkxNCAwLjM2OC0wLjE2OCAwLjI2Mi0wLjA5MTQgMC4zOTktMC4xMjYgMC4xMzYtMC4wNDUyIDAuNDcyLTAuMTAzIDAuMzM2LTAuMDU3OCAwLjUwNC0wLjA3OTggMC4xNTgtMC4wMjMxIDAuNTY3LTAuMDc5OCAwLjU1Ni0wLjA2ODIgMC43NzctMC4yMjEgMC4yMi0wLjE1MiAwLjIyLTAuNDQxdi0wLjI1MnEwLTAuNDMtMC4zNTctMC42NjItMC4zMzYtMC4yMzEtMC45NzYtMC4yMzEtMC42NjIgMC0wLjk5OCAwLjI2Mi0wLjMzNiAwLjI1Mi0wLjM5OSAwLjc5OHptMS44OSAzLjY4cTAuNzg4IDAgMS4yNi0wLjQxIDAuNTA0LTAuNDIgMC41MDQtMC45MDN2LTEuMDVxLTAuMjg0IDAuMTM2LTAuODYxIDAuMjMxLTAuNTY3IDAuMDkxNC0wLjk4NyAwLjE1OC0wLjQyIDAuMDY4Mi0wLjc2NiAwLjMyNi0wLjMzNiAwLjI1Mi0wLjMzNiAwLjcwNHQwLjMwNCAwLjcwNCAwLjg2MSAwLjI1MnoiIHN0cm9rZS13aWR0aD0iMS4wNSIvPgogIDxwYXRoIGQ9Im0xMCA0LjU2aDAuOTQ1djMuMTVxMC42NTEtMC45NzYgMS44OS0wLjk3NiAxLjE2IDAgMS44OSAwLjg0IDAuNjgyIDAuODQgMC42ODIgMi4zMSAwIDEuNDctMC43MDQgMi40Mi0wLjcwNCAwLjg4Mi0xLjg5IDAuODgyLTEuMjYgMC0xLjg5LTEuMDJ2MC43NjZoLTAuODV6bTIuNjIgMy4wNHEtMC43NDYgMC0xLjE2IDAuNjQtMC40NTIgMC42My0wLjQ1MiAxLjY4IDAgMS4wNSAwLjQ1MiAxLjY4dDEuMTYgMC42M3EwLjc3NyAwIDEuMjYtMC42MyAwLjQ5NC0wLjY0IDAuNDk0LTEuNjggMC0xLjA1LTAuNDcyLTEuNjgtMC40NjItMC42NC0xLjI2LTAuNjR6IiBzdHJva2Utd2lkdGg9IjEuMDUiLz4KICA8cGF0aCBkPSJtMi43MyAxNS44IDEzLjYgMC4wMDgxYzAuMDA2OSAwIDAtMi42IDAtMi42IDAtMC4wMDc4LTEuMTUgMC0xLjE1IDAtMC4wMDY5IDAtMC4wMDgzIDEuNS0wLjAwODMgMS41LTJlLTMgLTAuMDAxNC0xMS4zLTAuMDAxNC0xMS4zLTAuMDAxNGwtMC4wMDU5Mi0xLjVjMC0wLjAwNzgtMS4xNyAwLjAwMTMtMS4xNyAwLjAwMTN6IiBzdHJva2Utd2lkdGg9Ii45NzUiLz4KIDwvZz4KPC9zdmc+Cg==); + --jp-icon-yaml: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8ZyBjbGFzcz0ianAtaWNvbi1jb250cmFzdDIganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjRDgxQjYwIj4KICAgIDxwYXRoIGQ9Ik03LjIgMTguNnYtNS40TDMgNS42aDMuM2wxLjQgMy4xYy4zLjkuNiAxLjYgMSAyLjUuMy0uOC42LTEuNiAxLTIuNWwxLjQtMy4xaDMuNGwtNC40IDcuNnY1LjVsLTIuOS0uMXoiLz4KICAgIDxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjE3LjYiIGN5PSIxNi41IiByPSIyLjEiLz4KICAgIDxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjE3LjYiIGN5PSIxMSIgcj0iMi4xIi8+CiAgPC9nPgo8L3N2Zz4K); +} + +/* Icon CSS class declarations */ + +.jp-AddAboveIcon { + background-image: var(--jp-icon-add-above); +} + +.jp-AddBelowIcon { + background-image: var(--jp-icon-add-below); +} + +.jp-AddIcon { + background-image: var(--jp-icon-add); +} + +.jp-BellIcon { + background-image: var(--jp-icon-bell); +} + +.jp-BugDotIcon { + background-image: var(--jp-icon-bug-dot); +} + +.jp-BugIcon { + background-image: var(--jp-icon-bug); +} + +.jp-BuildIcon { + background-image: var(--jp-icon-build); +} + +.jp-CaretDownEmptyIcon { + background-image: var(--jp-icon-caret-down-empty); +} + +.jp-CaretDownEmptyThinIcon { + background-image: var(--jp-icon-caret-down-empty-thin); +} + +.jp-CaretDownIcon { + background-image: var(--jp-icon-caret-down); +} + +.jp-CaretLeftIcon { + background-image: var(--jp-icon-caret-left); +} + +.jp-CaretRightIcon { + background-image: var(--jp-icon-caret-right); +} + +.jp-CaretUpEmptyThinIcon { + background-image: var(--jp-icon-caret-up-empty-thin); +} + +.jp-CaretUpIcon { + background-image: var(--jp-icon-caret-up); +} + +.jp-CaseSensitiveIcon { + background-image: var(--jp-icon-case-sensitive); +} + +.jp-CheckIcon { + background-image: var(--jp-icon-check); +} + +.jp-CircleEmptyIcon { + background-image: var(--jp-icon-circle-empty); +} + +.jp-CircleIcon { + background-image: var(--jp-icon-circle); +} + +.jp-ClearIcon { + background-image: var(--jp-icon-clear); +} + +.jp-CloseIcon { + background-image: var(--jp-icon-close); +} + +.jp-CodeCheckIcon { + background-image: var(--jp-icon-code-check); +} + +.jp-CodeIcon { + background-image: var(--jp-icon-code); +} + +.jp-CollapseAllIcon { + background-image: var(--jp-icon-collapse-all); +} + +.jp-ConsoleIcon { + background-image: var(--jp-icon-console); +} + +.jp-CopyIcon { + background-image: var(--jp-icon-copy); +} + +.jp-CopyrightIcon { + background-image: var(--jp-icon-copyright); +} + +.jp-CutIcon { + background-image: var(--jp-icon-cut); +} + +.jp-DeleteIcon { + background-image: var(--jp-icon-delete); +} + +.jp-DownloadIcon { + background-image: var(--jp-icon-download); +} + +.jp-DuplicateIcon { + background-image: var(--jp-icon-duplicate); +} + +.jp-EditIcon { + background-image: var(--jp-icon-edit); +} + +.jp-EllipsesIcon { + background-image: var(--jp-icon-ellipses); +} + +.jp-ErrorIcon { + background-image: var(--jp-icon-error); +} + +.jp-ExpandAllIcon { + background-image: var(--jp-icon-expand-all); +} + +.jp-ExtensionIcon { + background-image: var(--jp-icon-extension); +} + +.jp-FastForwardIcon { + background-image: var(--jp-icon-fast-forward); +} + +.jp-FileIcon { + background-image: var(--jp-icon-file); +} + +.jp-FileUploadIcon { + background-image: var(--jp-icon-file-upload); +} + +.jp-FilterDotIcon { + background-image: var(--jp-icon-filter-dot); +} + +.jp-FilterIcon { + background-image: var(--jp-icon-filter); +} + +.jp-FilterListIcon { + background-image: var(--jp-icon-filter-list); +} + +.jp-FolderFavoriteIcon { + background-image: var(--jp-icon-folder-favorite); +} + +.jp-FolderIcon { + background-image: var(--jp-icon-folder); +} + +.jp-HomeIcon { + background-image: var(--jp-icon-home); +} + +.jp-Html5Icon { + background-image: var(--jp-icon-html5); +} + +.jp-ImageIcon { + background-image: var(--jp-icon-image); +} + +.jp-InfoIcon { + background-image: var(--jp-icon-info); +} + +.jp-InspectorIcon { + background-image: var(--jp-icon-inspector); +} + +.jp-JsonIcon { + background-image: var(--jp-icon-json); +} + +.jp-JuliaIcon { + background-image: var(--jp-icon-julia); +} + +.jp-JupyterFaviconIcon { + background-image: var(--jp-icon-jupyter-favicon); +} + +.jp-JupyterIcon { + background-image: var(--jp-icon-jupyter); +} + +.jp-JupyterlabWordmarkIcon { + background-image: var(--jp-icon-jupyterlab-wordmark); +} + +.jp-KernelIcon { + background-image: var(--jp-icon-kernel); +} + +.jp-KeyboardIcon { + background-image: var(--jp-icon-keyboard); +} + +.jp-LaunchIcon { + background-image: var(--jp-icon-launch); +} + +.jp-LauncherIcon { + background-image: var(--jp-icon-launcher); +} + +.jp-LineFormIcon { + background-image: var(--jp-icon-line-form); +} + +.jp-LinkIcon { + background-image: var(--jp-icon-link); +} + +.jp-ListIcon { + background-image: var(--jp-icon-list); +} + +.jp-MarkdownIcon { + background-image: var(--jp-icon-markdown); +} + +.jp-MoveDownIcon { + background-image: var(--jp-icon-move-down); +} + +.jp-MoveUpIcon { + background-image: var(--jp-icon-move-up); +} + +.jp-NewFolderIcon { + background-image: var(--jp-icon-new-folder); +} + +.jp-NotTrustedIcon { + background-image: var(--jp-icon-not-trusted); +} + +.jp-NotebookIcon { + background-image: var(--jp-icon-notebook); +} + +.jp-NumberingIcon { + background-image: var(--jp-icon-numbering); +} + +.jp-OfflineBoltIcon { + background-image: var(--jp-icon-offline-bolt); +} + +.jp-PaletteIcon { + background-image: var(--jp-icon-palette); +} + +.jp-PasteIcon { + background-image: var(--jp-icon-paste); +} + +.jp-PdfIcon { + background-image: var(--jp-icon-pdf); +} + +.jp-PythonIcon { + background-image: var(--jp-icon-python); +} + +.jp-RKernelIcon { + background-image: var(--jp-icon-r-kernel); +} + +.jp-ReactIcon { + background-image: var(--jp-icon-react); +} + +.jp-RedoIcon { + background-image: var(--jp-icon-redo); +} + +.jp-RefreshIcon { + background-image: var(--jp-icon-refresh); +} + +.jp-RegexIcon { + background-image: var(--jp-icon-regex); +} + +.jp-RunIcon { + background-image: var(--jp-icon-run); +} + +.jp-RunningIcon { + background-image: var(--jp-icon-running); +} + +.jp-SaveIcon { + background-image: var(--jp-icon-save); +} + +.jp-SearchIcon { + background-image: var(--jp-icon-search); +} + +.jp-SettingsIcon { + background-image: var(--jp-icon-settings); +} + +.jp-ShareIcon { + background-image: var(--jp-icon-share); +} + +.jp-SpreadsheetIcon { + background-image: var(--jp-icon-spreadsheet); +} + +.jp-StopIcon { + background-image: var(--jp-icon-stop); +} + +.jp-TabIcon { + background-image: var(--jp-icon-tab); +} + +.jp-TableRowsIcon { + background-image: var(--jp-icon-table-rows); +} + +.jp-TagIcon { + background-image: var(--jp-icon-tag); +} + +.jp-TerminalIcon { + background-image: var(--jp-icon-terminal); +} + +.jp-TextEditorIcon { + background-image: var(--jp-icon-text-editor); +} + +.jp-TocIcon { + background-image: var(--jp-icon-toc); +} + +.jp-TreeViewIcon { + background-image: var(--jp-icon-tree-view); +} + +.jp-TrustedIcon { + background-image: var(--jp-icon-trusted); +} + +.jp-UndoIcon { + background-image: var(--jp-icon-undo); +} + +.jp-UserIcon { + background-image: var(--jp-icon-user); +} + +.jp-UsersIcon { + background-image: var(--jp-icon-users); +} + +.jp-VegaIcon { + background-image: var(--jp-icon-vega); +} + +.jp-WordIcon { + background-image: var(--jp-icon-word); +} + +.jp-YamlIcon { + background-image: var(--jp-icon-yaml); +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/** + * (DEPRECATED) Support for consuming icons as CSS background images + */ + +.jp-Icon, +.jp-MaterialIcon { + background-position: center; + background-repeat: no-repeat; + background-size: 16px; + min-width: 16px; + min-height: 16px; +} + +.jp-Icon-cover { + background-position: center; + background-repeat: no-repeat; + background-size: cover; +} + +/** + * (DEPRECATED) Support for specific CSS icon sizes + */ + +.jp-Icon-16 { + background-size: 16px; + min-width: 16px; + min-height: 16px; +} + +.jp-Icon-18 { + background-size: 18px; + min-width: 18px; + min-height: 18px; +} + +.jp-Icon-20 { + background-size: 20px; + min-width: 20px; + min-height: 20px; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.lm-TabBar .lm-TabBar-addButton { + align-items: center; + display: flex; + padding: 4px; + padding-bottom: 5px; + margin-right: 1px; + background-color: var(--jp-layout-color2); +} + +.lm-TabBar .lm-TabBar-addButton:hover { + background-color: var(--jp-layout-color1); +} + +.lm-DockPanel-tabBar .lm-TabBar-tab { + width: var(--jp-private-horizontal-tab-width); +} + +.lm-DockPanel-tabBar .lm-TabBar-content { + flex: unset; +} + +.lm-DockPanel-tabBar[data-orientation='horizontal'] { + flex: 1 1 auto; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/** + * Support for icons as inline SVG HTMLElements + */ + +/* recolor the primary elements of an icon */ +.jp-icon0[fill] { + fill: var(--jp-inverse-layout-color0); +} + +.jp-icon1[fill] { + fill: var(--jp-inverse-layout-color1); +} + +.jp-icon2[fill] { + fill: var(--jp-inverse-layout-color2); +} + +.jp-icon3[fill] { + fill: var(--jp-inverse-layout-color3); +} + +.jp-icon4[fill] { + fill: var(--jp-inverse-layout-color4); +} + +.jp-icon0[stroke] { + stroke: var(--jp-inverse-layout-color0); +} + +.jp-icon1[stroke] { + stroke: var(--jp-inverse-layout-color1); +} + +.jp-icon2[stroke] { + stroke: var(--jp-inverse-layout-color2); +} + +.jp-icon3[stroke] { + stroke: var(--jp-inverse-layout-color3); +} + +.jp-icon4[stroke] { + stroke: var(--jp-inverse-layout-color4); +} + +/* recolor the accent elements of an icon */ +.jp-icon-accent0[fill] { + fill: var(--jp-layout-color0); +} + +.jp-icon-accent1[fill] { + fill: var(--jp-layout-color1); +} + +.jp-icon-accent2[fill] { + fill: var(--jp-layout-color2); +} + +.jp-icon-accent3[fill] { + fill: var(--jp-layout-color3); +} + +.jp-icon-accent4[fill] { + fill: var(--jp-layout-color4); +} + +.jp-icon-accent0[stroke] { + stroke: var(--jp-layout-color0); +} + +.jp-icon-accent1[stroke] { + stroke: var(--jp-layout-color1); +} + +.jp-icon-accent2[stroke] { + stroke: var(--jp-layout-color2); +} + +.jp-icon-accent3[stroke] { + stroke: var(--jp-layout-color3); +} + +.jp-icon-accent4[stroke] { + stroke: var(--jp-layout-color4); +} + +/* set the color of an icon to transparent */ +.jp-icon-none[fill] { + fill: none; +} + +.jp-icon-none[stroke] { + stroke: none; +} + +/* brand icon colors. Same for light and dark */ +.jp-icon-brand0[fill] { + fill: var(--jp-brand-color0); +} + +.jp-icon-brand1[fill] { + fill: var(--jp-brand-color1); +} + +.jp-icon-brand2[fill] { + fill: var(--jp-brand-color2); +} + +.jp-icon-brand3[fill] { + fill: var(--jp-brand-color3); +} + +.jp-icon-brand4[fill] { + fill: var(--jp-brand-color4); +} + +.jp-icon-brand0[stroke] { + stroke: var(--jp-brand-color0); +} + +.jp-icon-brand1[stroke] { + stroke: var(--jp-brand-color1); +} + +.jp-icon-brand2[stroke] { + stroke: var(--jp-brand-color2); +} + +.jp-icon-brand3[stroke] { + stroke: var(--jp-brand-color3); +} + +.jp-icon-brand4[stroke] { + stroke: var(--jp-brand-color4); +} + +/* warn icon colors. Same for light and dark */ +.jp-icon-warn0[fill] { + fill: var(--jp-warn-color0); +} + +.jp-icon-warn1[fill] { + fill: var(--jp-warn-color1); +} + +.jp-icon-warn2[fill] { + fill: var(--jp-warn-color2); +} + +.jp-icon-warn3[fill] { + fill: var(--jp-warn-color3); +} + +.jp-icon-warn0[stroke] { + stroke: var(--jp-warn-color0); +} + +.jp-icon-warn1[stroke] { + stroke: var(--jp-warn-color1); +} + +.jp-icon-warn2[stroke] { + stroke: var(--jp-warn-color2); +} + +.jp-icon-warn3[stroke] { + stroke: var(--jp-warn-color3); +} + +/* icon colors that contrast well with each other and most backgrounds */ +.jp-icon-contrast0[fill] { + fill: var(--jp-icon-contrast-color0); +} + +.jp-icon-contrast1[fill] { + fill: var(--jp-icon-contrast-color1); +} + +.jp-icon-contrast2[fill] { + fill: var(--jp-icon-contrast-color2); +} + +.jp-icon-contrast3[fill] { + fill: var(--jp-icon-contrast-color3); +} + +.jp-icon-contrast0[stroke] { + stroke: var(--jp-icon-contrast-color0); +} + +.jp-icon-contrast1[stroke] { + stroke: var(--jp-icon-contrast-color1); +} + +.jp-icon-contrast2[stroke] { + stroke: var(--jp-icon-contrast-color2); +} + +.jp-icon-contrast3[stroke] { + stroke: var(--jp-icon-contrast-color3); +} + +.jp-icon-dot[fill] { + fill: var(--jp-warn-color0); +} + +.jp-jupyter-icon-color[fill] { + fill: var(--jp-jupyter-icon-color, var(--jp-warn-color0)); +} + +.jp-notebook-icon-color[fill] { + fill: var(--jp-notebook-icon-color, var(--jp-warn-color0)); +} + +.jp-json-icon-color[fill] { + fill: var(--jp-json-icon-color, var(--jp-warn-color1)); +} + +.jp-console-icon-color[fill] { + fill: var(--jp-console-icon-color, white); +} + +.jp-console-icon-background-color[fill] { + fill: var(--jp-console-icon-background-color, var(--jp-brand-color1)); +} + +.jp-terminal-icon-color[fill] { + fill: var(--jp-terminal-icon-color, var(--jp-layout-color2)); +} + +.jp-terminal-icon-background-color[fill] { + fill: var( + --jp-terminal-icon-background-color, + var(--jp-inverse-layout-color2) + ); +} + +.jp-text-editor-icon-color[fill] { + fill: var(--jp-text-editor-icon-color, var(--jp-inverse-layout-color3)); +} + +.jp-inspector-icon-color[fill] { + fill: var(--jp-inspector-icon-color, var(--jp-inverse-layout-color3)); +} + +/* CSS for icons in selected filebrowser listing items */ +.jp-DirListing-item.jp-mod-selected .jp-icon-selectable[fill] { + fill: #fff; +} + +.jp-DirListing-item.jp-mod-selected .jp-icon-selectable-inverse[fill] { + fill: var(--jp-brand-color1); +} + +/* stylelint-disable selector-max-class, selector-max-compound-selectors */ + +/** +* TODO: come up with non css-hack solution for showing the busy icon on top +* of the close icon +* CSS for complex behavior of close icon of tabs in the main area tabbar +*/ +.lm-DockPanel-tabBar + .lm-TabBar-tab.lm-mod-closable.jp-mod-dirty + > .lm-TabBar-tabCloseIcon + > :not(:hover) + > .jp-icon3[fill] { + fill: none; +} + +.lm-DockPanel-tabBar + .lm-TabBar-tab.lm-mod-closable.jp-mod-dirty + > .lm-TabBar-tabCloseIcon + > :not(:hover) + > .jp-icon-busy[fill] { + fill: var(--jp-inverse-layout-color3); +} + +/* stylelint-enable selector-max-class, selector-max-compound-selectors */ + +/* CSS for icons in status bar */ +#jp-main-statusbar .jp-mod-selected .jp-icon-selectable[fill] { + fill: #fff; +} + +#jp-main-statusbar .jp-mod-selected .jp-icon-selectable-inverse[fill] { + fill: var(--jp-brand-color1); +} + +/* special handling for splash icon CSS. While the theme CSS reloads during + splash, the splash icon can loose theming. To prevent that, we set a + default for its color variable */ +:root { + --jp-warn-color0: var(--md-orange-700); +} + +/* not sure what to do with this one, used in filebrowser listing */ +.jp-DragIcon { + margin-right: 4px; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/** + * Support for alt colors for icons as inline SVG HTMLElements + */ + +/* alt recolor the primary elements of an icon */ +.jp-icon-alt .jp-icon0[fill] { + fill: var(--jp-layout-color0); +} + +.jp-icon-alt .jp-icon1[fill] { + fill: var(--jp-layout-color1); +} + +.jp-icon-alt .jp-icon2[fill] { + fill: var(--jp-layout-color2); +} + +.jp-icon-alt .jp-icon3[fill] { + fill: var(--jp-layout-color3); +} + +.jp-icon-alt .jp-icon4[fill] { + fill: var(--jp-layout-color4); +} + +.jp-icon-alt .jp-icon0[stroke] { + stroke: var(--jp-layout-color0); +} + +.jp-icon-alt .jp-icon1[stroke] { + stroke: var(--jp-layout-color1); +} + +.jp-icon-alt .jp-icon2[stroke] { + stroke: var(--jp-layout-color2); +} + +.jp-icon-alt .jp-icon3[stroke] { + stroke: var(--jp-layout-color3); +} + +.jp-icon-alt .jp-icon4[stroke] { + stroke: var(--jp-layout-color4); +} + +/* alt recolor the accent elements of an icon */ +.jp-icon-alt .jp-icon-accent0[fill] { + fill: var(--jp-inverse-layout-color0); +} + +.jp-icon-alt .jp-icon-accent1[fill] { + fill: var(--jp-inverse-layout-color1); +} + +.jp-icon-alt .jp-icon-accent2[fill] { + fill: var(--jp-inverse-layout-color2); +} + +.jp-icon-alt .jp-icon-accent3[fill] { + fill: var(--jp-inverse-layout-color3); +} + +.jp-icon-alt .jp-icon-accent4[fill] { + fill: var(--jp-inverse-layout-color4); +} + +.jp-icon-alt .jp-icon-accent0[stroke] { + stroke: var(--jp-inverse-layout-color0); +} + +.jp-icon-alt .jp-icon-accent1[stroke] { + stroke: var(--jp-inverse-layout-color1); +} + +.jp-icon-alt .jp-icon-accent2[stroke] { + stroke: var(--jp-inverse-layout-color2); +} + +.jp-icon-alt .jp-icon-accent3[stroke] { + stroke: var(--jp-inverse-layout-color3); +} + +.jp-icon-alt .jp-icon-accent4[stroke] { + stroke: var(--jp-inverse-layout-color4); +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-icon-hoverShow:not(:hover) .jp-icon-hoverShow-content { + display: none !important; +} + +/** + * Support for hover colors for icons as inline SVG HTMLElements + */ + +/** + * regular colors + */ + +/* recolor the primary elements of an icon */ +.jp-icon-hover :hover .jp-icon0-hover[fill] { + fill: var(--jp-inverse-layout-color0); +} + +.jp-icon-hover :hover .jp-icon1-hover[fill] { + fill: var(--jp-inverse-layout-color1); +} + +.jp-icon-hover :hover .jp-icon2-hover[fill] { + fill: var(--jp-inverse-layout-color2); +} + +.jp-icon-hover :hover .jp-icon3-hover[fill] { + fill: var(--jp-inverse-layout-color3); +} + +.jp-icon-hover :hover .jp-icon4-hover[fill] { + fill: var(--jp-inverse-layout-color4); +} + +.jp-icon-hover :hover .jp-icon0-hover[stroke] { + stroke: var(--jp-inverse-layout-color0); +} + +.jp-icon-hover :hover .jp-icon1-hover[stroke] { + stroke: var(--jp-inverse-layout-color1); +} + +.jp-icon-hover :hover .jp-icon2-hover[stroke] { + stroke: var(--jp-inverse-layout-color2); +} + +.jp-icon-hover :hover .jp-icon3-hover[stroke] { + stroke: var(--jp-inverse-layout-color3); +} + +.jp-icon-hover :hover .jp-icon4-hover[stroke] { + stroke: var(--jp-inverse-layout-color4); +} + +/* recolor the accent elements of an icon */ +.jp-icon-hover :hover .jp-icon-accent0-hover[fill] { + fill: var(--jp-layout-color0); +} + +.jp-icon-hover :hover .jp-icon-accent1-hover[fill] { + fill: var(--jp-layout-color1); +} + +.jp-icon-hover :hover .jp-icon-accent2-hover[fill] { + fill: var(--jp-layout-color2); +} + +.jp-icon-hover :hover .jp-icon-accent3-hover[fill] { + fill: var(--jp-layout-color3); +} + +.jp-icon-hover :hover .jp-icon-accent4-hover[fill] { + fill: var(--jp-layout-color4); +} + +.jp-icon-hover :hover .jp-icon-accent0-hover[stroke] { + stroke: var(--jp-layout-color0); +} + +.jp-icon-hover :hover .jp-icon-accent1-hover[stroke] { + stroke: var(--jp-layout-color1); +} + +.jp-icon-hover :hover .jp-icon-accent2-hover[stroke] { + stroke: var(--jp-layout-color2); +} + +.jp-icon-hover :hover .jp-icon-accent3-hover[stroke] { + stroke: var(--jp-layout-color3); +} + +.jp-icon-hover :hover .jp-icon-accent4-hover[stroke] { + stroke: var(--jp-layout-color4); +} + +/* set the color of an icon to transparent */ +.jp-icon-hover :hover .jp-icon-none-hover[fill] { + fill: none; +} + +.jp-icon-hover :hover .jp-icon-none-hover[stroke] { + stroke: none; +} + +/** + * inverse colors + */ + +/* inverse recolor the primary elements of an icon */ +.jp-icon-hover.jp-icon-alt :hover .jp-icon0-hover[fill] { + fill: var(--jp-layout-color0); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon1-hover[fill] { + fill: var(--jp-layout-color1); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon2-hover[fill] { + fill: var(--jp-layout-color2); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon3-hover[fill] { + fill: var(--jp-layout-color3); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon4-hover[fill] { + fill: var(--jp-layout-color4); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon0-hover[stroke] { + stroke: var(--jp-layout-color0); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon1-hover[stroke] { + stroke: var(--jp-layout-color1); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon2-hover[stroke] { + stroke: var(--jp-layout-color2); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon3-hover[stroke] { + stroke: var(--jp-layout-color3); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon4-hover[stroke] { + stroke: var(--jp-layout-color4); +} + +/* inverse recolor the accent elements of an icon */ +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent0-hover[fill] { + fill: var(--jp-inverse-layout-color0); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent1-hover[fill] { + fill: var(--jp-inverse-layout-color1); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent2-hover[fill] { + fill: var(--jp-inverse-layout-color2); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent3-hover[fill] { + fill: var(--jp-inverse-layout-color3); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent4-hover[fill] { + fill: var(--jp-inverse-layout-color4); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent0-hover[stroke] { + stroke: var(--jp-inverse-layout-color0); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent1-hover[stroke] { + stroke: var(--jp-inverse-layout-color1); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent2-hover[stroke] { + stroke: var(--jp-inverse-layout-color2); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent3-hover[stroke] { + stroke: var(--jp-inverse-layout-color3); +} + +.jp-icon-hover.jp-icon-alt :hover .jp-icon-accent4-hover[stroke] { + stroke: var(--jp-inverse-layout-color4); +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-IFrame { + width: 100%; + height: 100%; +} + +.jp-IFrame > iframe { + border: none; +} + +/* +When drag events occur, `lm-mod-override-cursor` is added to the body. +Because iframes steal all cursor events, the following two rules are necessary +to suppress pointer events while resize drags are occurring. There may be a +better solution to this problem. +*/ +body.lm-mod-override-cursor .jp-IFrame { + position: relative; +} + +body.lm-mod-override-cursor .jp-IFrame::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: transparent; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) 2014-2016, Jupyter Development Team. +| +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-HoverBox { + position: fixed; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-FormGroup-content fieldset { + border: none; + padding: 0; + min-width: 0; + width: 100%; +} + +/* stylelint-disable selector-max-type */ + +.jp-FormGroup-content fieldset .jp-inputFieldWrapper input, +.jp-FormGroup-content fieldset .jp-inputFieldWrapper select, +.jp-FormGroup-content fieldset .jp-inputFieldWrapper textarea { + font-size: var(--jp-content-font-size2); + border-color: var(--jp-input-border-color); + border-style: solid; + border-radius: var(--jp-border-radius); + border-width: 1px; + padding: 6px 8px; + background: none; + color: var(--jp-ui-font-color0); + height: inherit; +} + +.jp-FormGroup-content fieldset input[type='checkbox'] { + position: relative; + top: 2px; + margin-left: 0; +} + +.jp-FormGroup-content button.jp-mod-styled { + cursor: pointer; +} + +.jp-FormGroup-content .checkbox label { + cursor: pointer; + font-size: var(--jp-content-font-size1); +} + +.jp-FormGroup-content .jp-root > fieldset > legend { + display: none; +} + +.jp-FormGroup-content .jp-root > fieldset > p { + display: none; +} + +/** copy of `input.jp-mod-styled:focus` style */ +.jp-FormGroup-content fieldset input:focus, +.jp-FormGroup-content fieldset select:focus { + -moz-outline-radius: unset; + outline: var(--jp-border-width) solid var(--md-blue-500); + outline-offset: -1px; + box-shadow: inset 0 0 4px var(--md-blue-300); +} + +.jp-FormGroup-content fieldset input:hover:not(:focus), +.jp-FormGroup-content fieldset select:hover:not(:focus) { + background-color: var(--jp-border-color2); +} + +/* stylelint-enable selector-max-type */ + +.jp-FormGroup-content .checkbox .field-description { + /* Disable default description field for checkbox: + because other widgets do not have description fields, + we add descriptions to each widget on the field level. + */ + display: none; +} + +.jp-FormGroup-content #root__description { + display: none; +} + +.jp-FormGroup-content .jp-modifiedIndicator { + width: 5px; + background-color: var(--jp-brand-color2); + margin-top: 0; + margin-left: calc(var(--jp-private-settingeditor-modifier-indent) * -1); + flex-shrink: 0; +} + +.jp-FormGroup-content .jp-modifiedIndicator.jp-errorIndicator { + background-color: var(--jp-error-color0); + margin-right: 0.5em; +} + +/* RJSF ARRAY style */ + +.jp-arrayFieldWrapper legend { + font-size: var(--jp-content-font-size2); + color: var(--jp-ui-font-color0); + flex-basis: 100%; + padding: 4px 0; + font-weight: var(--jp-content-heading-font-weight); + border-bottom: 1px solid var(--jp-border-color2); +} + +.jp-arrayFieldWrapper .field-description { + padding: 4px 0; + white-space: pre-wrap; +} + +.jp-arrayFieldWrapper .array-item { + width: 100%; + border: 1px solid var(--jp-border-color2); + border-radius: 4px; + margin: 4px; +} + +.jp-ArrayOperations { + display: flex; + margin-left: 8px; +} + +.jp-ArrayOperationsButton { + margin: 2px; +} + +.jp-ArrayOperationsButton .jp-icon3[fill] { + fill: var(--jp-ui-font-color0); +} + +button.jp-ArrayOperationsButton.jp-mod-styled:disabled { + cursor: not-allowed; + opacity: 0.5; +} + +/* RJSF form validation error */ + +.jp-FormGroup-content .validationErrors { + color: var(--jp-error-color0); +} + +/* Hide panel level error as duplicated the field level error */ +.jp-FormGroup-content .panel.errors { + display: none; +} + +/* RJSF normal content (settings-editor) */ + +.jp-FormGroup-contentNormal { + display: flex; + align-items: center; + flex-wrap: wrap; +} + +.jp-FormGroup-contentNormal .jp-FormGroup-contentItem { + margin-left: 7px; + color: var(--jp-ui-font-color0); +} + +.jp-FormGroup-contentNormal .jp-FormGroup-description { + flex-basis: 100%; + padding: 4px 7px; +} + +.jp-FormGroup-contentNormal .jp-FormGroup-default { + flex-basis: 100%; + padding: 4px 7px; +} + +.jp-FormGroup-contentNormal .jp-FormGroup-fieldLabel { + font-size: var(--jp-content-font-size1); + font-weight: normal; + min-width: 120px; +} + +.jp-FormGroup-contentNormal fieldset:not(:first-child) { + margin-left: 7px; +} + +.jp-FormGroup-contentNormal .field-array-of-string .array-item { + /* Display `jp-ArrayOperations` buttons side-by-side with content except + for small screens where flex-wrap will place them one below the other. + */ + display: flex; + align-items: center; + flex-wrap: wrap; +} + +.jp-FormGroup-contentNormal .jp-objectFieldWrapper .form-group { + padding: 2px 8px 2px var(--jp-private-settingeditor-modifier-indent); + margin-top: 2px; +} + +/* RJSF compact content (metadata-form) */ + +.jp-FormGroup-content.jp-FormGroup-contentCompact { + width: 100%; +} + +.jp-FormGroup-contentCompact .form-group { + display: flex; + padding: 0.5em 0.2em 0.5em 0; +} + +.jp-FormGroup-contentCompact + .jp-FormGroup-compactTitle + .jp-FormGroup-description { + font-size: var(--jp-ui-font-size1); + color: var(--jp-ui-font-color2); +} + +.jp-FormGroup-contentCompact .jp-FormGroup-fieldLabel { + padding-bottom: 0.3em; +} + +.jp-FormGroup-contentCompact .jp-inputFieldWrapper .form-control { + width: 100%; + box-sizing: border-box; +} + +.jp-FormGroup-contentCompact .jp-arrayFieldWrapper .jp-FormGroup-compactTitle { + padding-bottom: 7px; +} + +.jp-FormGroup-contentCompact + .jp-objectFieldWrapper + .jp-objectFieldWrapper + .form-group { + padding: 2px 8px 2px var(--jp-private-settingeditor-modifier-indent); + margin-top: 2px; +} + +.jp-FormGroup-contentCompact ul.error-detail { + margin-block-start: 0.5em; + margin-block-end: 0.5em; + padding-inline-start: 1em; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +.jp-SidePanel { + display: flex; + flex-direction: column; + min-width: var(--jp-sidebar-min-width); + overflow-y: auto; + color: var(--jp-ui-font-color1); + background: var(--jp-layout-color1); + font-size: var(--jp-ui-font-size1); +} + +.jp-SidePanel-header { + flex: 0 0 auto; + display: flex; + border-bottom: var(--jp-border-width) solid var(--jp-border-color2); + font-size: var(--jp-ui-font-size0); + font-weight: 600; + letter-spacing: 1px; + margin: 0; + padding: 2px; + text-transform: uppercase; +} + +.jp-SidePanel-toolbar { + flex: 0 0 auto; +} + +.jp-SidePanel-content { + flex: 1 1 auto; +} + +.jp-SidePanel-toolbar, +.jp-AccordionPanel-toolbar { + height: var(--jp-private-toolbar-height); +} + +.jp-SidePanel-toolbar.jp-Toolbar-micro { + display: none; +} + +.lm-AccordionPanel .jp-AccordionPanel-title { + box-sizing: border-box; + line-height: 25px; + margin: 0; + display: flex; + align-items: center; + background: var(--jp-layout-color1); + color: var(--jp-ui-font-color1); + border-bottom: var(--jp-border-width) solid var(--jp-toolbar-border-color); + box-shadow: var(--jp-toolbar-box-shadow); + font-size: var(--jp-ui-font-size0); +} + +.jp-AccordionPanel-title { + cursor: pointer; + user-select: none; + -moz-user-select: none; + -webkit-user-select: none; + text-transform: uppercase; +} + +.lm-AccordionPanel[data-orientation='horizontal'] > .jp-AccordionPanel-title { + /* Title is rotated for horizontal accordion panel using CSS */ + display: block; + transform-origin: top left; + transform: rotate(-90deg) translate(-100%); +} + +.jp-AccordionPanel-title .lm-AccordionPanel-titleLabel { + user-select: none; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.jp-AccordionPanel-title .lm-AccordionPanel-titleCollapser { + transform: rotate(-90deg); + margin: auto 0; + height: 16px; +} + +.jp-AccordionPanel-title.lm-mod-expanded .lm-AccordionPanel-titleCollapser { + transform: rotate(0deg); +} + +.lm-AccordionPanel .jp-AccordionPanel-toolbar { + background: none; + box-shadow: none; + border: none; + margin-left: auto; +} + +.lm-AccordionPanel .lm-SplitPanel-handle:hover { + background: var(--jp-layout-color3); +} + +.jp-text-truncated { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) 2017, Jupyter Development Team. +| +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-Spinner { + position: absolute; + display: flex; + justify-content: center; + align-items: center; + z-index: 10; + left: 0; + top: 0; + width: 100%; + height: 100%; + background: var(--jp-layout-color0); + outline: none; +} + +.jp-SpinnerContent { + font-size: 10px; + margin: 50px auto; + text-indent: -9999em; + width: 3em; + height: 3em; + border-radius: 50%; + background: var(--jp-brand-color3); + background: linear-gradient( + to right, + #f37626 10%, + rgba(255, 255, 255, 0) 42% + ); + position: relative; + animation: load3 1s infinite linear, fadeIn 1s; +} + +.jp-SpinnerContent::before { + width: 50%; + height: 50%; + background: #f37626; + border-radius: 100% 0 0; + position: absolute; + top: 0; + left: 0; + content: ''; +} + +.jp-SpinnerContent::after { + background: var(--jp-layout-color0); + width: 75%; + height: 75%; + border-radius: 50%; + content: ''; + margin: auto; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; +} + +@keyframes fadeIn { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + +@keyframes load3 { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} + +/*----------------------------------------------------------------------------- +| Copyright (c) 2014-2017, Jupyter Development Team. +| +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +button.jp-mod-styled { + font-size: var(--jp-ui-font-size1); + color: var(--jp-ui-font-color0); + border: none; + box-sizing: border-box; + text-align: center; + line-height: 32px; + height: 32px; + padding: 0 12px; + letter-spacing: 0.8px; + outline: none; + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; +} + +input.jp-mod-styled { + background: var(--jp-input-background); + height: 28px; + box-sizing: border-box; + border: var(--jp-border-width) solid var(--jp-border-color1); + padding-left: 7px; + padding-right: 7px; + font-size: var(--jp-ui-font-size2); + color: var(--jp-ui-font-color0); + outline: none; + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; +} + +input[type='checkbox'].jp-mod-styled { + appearance: checkbox; + -webkit-appearance: checkbox; + -moz-appearance: checkbox; + height: auto; +} + +input.jp-mod-styled:focus { + border: var(--jp-border-width) solid var(--md-blue-500); + box-shadow: inset 0 0 4px var(--md-blue-300); +} + +.jp-select-wrapper { + display: flex; + position: relative; + flex-direction: column; + padding: 1px; + background-color: var(--jp-layout-color1); + box-sizing: border-box; + margin-bottom: 12px; +} + +.jp-select-wrapper:not(.multiple) { + height: 28px; +} + +.jp-select-wrapper.jp-mod-focused select.jp-mod-styled { + border: var(--jp-border-width) solid var(--jp-input-active-border-color); + box-shadow: var(--jp-input-box-shadow); + background-color: var(--jp-input-active-background); +} + +select.jp-mod-styled:hover { + cursor: pointer; + color: var(--jp-ui-font-color0); + background-color: var(--jp-input-hover-background); + box-shadow: inset 0 0 1px rgba(0, 0, 0, 0.5); +} + +select.jp-mod-styled { + flex: 1 1 auto; + width: 100%; + font-size: var(--jp-ui-font-size2); + background: var(--jp-input-background); + color: var(--jp-ui-font-color0); + padding: 0 25px 0 8px; + border: var(--jp-border-width) solid var(--jp-input-border-color); + border-radius: 0; + outline: none; + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; +} + +select.jp-mod-styled:not([multiple]) { + height: 32px; +} + +select.jp-mod-styled[multiple] { + max-height: 200px; + overflow-y: auto; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-switch { + display: flex; + align-items: center; + padding-left: 4px; + padding-right: 4px; + font-size: var(--jp-ui-font-size1); + background-color: transparent; + color: var(--jp-ui-font-color1); + border: none; + height: 20px; +} + +.jp-switch:hover { + background-color: var(--jp-layout-color2); +} + +.jp-switch-label { + margin-right: 5px; + font-family: var(--jp-ui-font-family); +} + +.jp-switch-track { + cursor: pointer; + background-color: var(--jp-switch-color, var(--jp-border-color1)); + -webkit-transition: 0.4s; + transition: 0.4s; + border-radius: 34px; + height: 16px; + width: 35px; + position: relative; +} + +.jp-switch-track::before { + content: ''; + position: absolute; + height: 10px; + width: 10px; + margin: 3px; + left: 0; + background-color: var(--jp-ui-inverse-font-color1); + -webkit-transition: 0.4s; + transition: 0.4s; + border-radius: 50%; +} + +.jp-switch[aria-checked='true'] .jp-switch-track { + background-color: var(--jp-switch-true-position-color, var(--jp-warn-color0)); +} + +.jp-switch[aria-checked='true'] .jp-switch-track::before { + /* track width (35) - margins (3 + 3) - thumb width (10) */ + left: 19px; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) 2014-2016, Jupyter Development Team. +| +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +:root { + --jp-private-toolbar-height: calc( + 28px + var(--jp-border-width) + ); /* leave 28px for content */ +} + +.jp-Toolbar { + color: var(--jp-ui-font-color1); + flex: 0 0 auto; + display: flex; + flex-direction: row; + border-bottom: var(--jp-border-width) solid var(--jp-toolbar-border-color); + box-shadow: var(--jp-toolbar-box-shadow); + background: var(--jp-toolbar-background); + min-height: var(--jp-toolbar-micro-height); + padding: 2px; + z-index: 8; + overflow-x: hidden; +} + +/* Toolbar items */ + +.jp-Toolbar > .jp-Toolbar-item.jp-Toolbar-spacer { + flex-grow: 1; + flex-shrink: 1; +} + +.jp-Toolbar-item.jp-Toolbar-kernelStatus { + display: inline-block; + width: 32px; + background-repeat: no-repeat; + background-position: center; + background-size: 16px; +} + +.jp-Toolbar > .jp-Toolbar-item { + flex: 0 0 auto; + display: flex; + padding-left: 1px; + padding-right: 1px; + font-size: var(--jp-ui-font-size1); + line-height: var(--jp-private-toolbar-height); + height: 100%; +} + +/* Toolbar buttons */ + +/* This is the div we use to wrap the react component into a Widget */ +div.jp-ToolbarButton { + color: transparent; + border: none; + box-sizing: border-box; + outline: none; + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; + padding: 0; + margin: 0; +} + +button.jp-ToolbarButtonComponent { + background: var(--jp-layout-color1); + border: none; + box-sizing: border-box; + outline: none; + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; + padding: 0 6px; + margin: 0; + height: 24px; + border-radius: var(--jp-border-radius); + display: flex; + align-items: center; + text-align: center; + font-size: 14px; + min-width: unset; + min-height: unset; +} + +button.jp-ToolbarButtonComponent:disabled { + opacity: 0.4; +} + +button.jp-ToolbarButtonComponent > span { + padding: 0; + flex: 0 0 auto; +} + +button.jp-ToolbarButtonComponent .jp-ToolbarButtonComponent-label { + font-size: var(--jp-ui-font-size1); + line-height: 100%; + padding-left: 2px; + color: var(--jp-ui-font-color1); + font-family: var(--jp-ui-font-family); +} + +#jp-main-dock-panel[data-mode='single-document'] + .jp-MainAreaWidget + > .jp-Toolbar.jp-Toolbar-micro { + padding: 0; + min-height: 0; +} + +#jp-main-dock-panel[data-mode='single-document'] + .jp-MainAreaWidget + > .jp-Toolbar { + border: none; + box-shadow: none; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +.jp-WindowedPanel-outer { + position: relative; + overflow-y: auto; +} + +.jp-WindowedPanel-inner { + position: relative; +} + +.jp-WindowedPanel-window { + position: absolute; + left: 0; + right: 0; + overflow: visible; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/* Sibling imports */ + +body { + color: var(--jp-ui-font-color1); + font-size: var(--jp-ui-font-size1); +} + +/* Disable native link decoration styles everywhere outside of dialog boxes */ +a { + text-decoration: unset; + color: unset; +} + +a:hover { + text-decoration: unset; + color: unset; +} + +/* Accessibility for links inside dialog box text */ +.jp-Dialog-content a { + text-decoration: revert; + color: var(--jp-content-link-color); +} + +.jp-Dialog-content a:hover { + text-decoration: revert; +} + +/* Styles for ui-components */ +.jp-Button { + color: var(--jp-ui-font-color2); + border-radius: var(--jp-border-radius); + padding: 0 12px; + font-size: var(--jp-ui-font-size1); + + /* Copy from blueprint 3 */ + display: inline-flex; + flex-direction: row; + border: none; + cursor: pointer; + align-items: center; + justify-content: center; + text-align: left; + vertical-align: middle; + min-height: 30px; + min-width: 30px; +} + +.jp-Button:disabled { + cursor: not-allowed; +} + +.jp-Button:empty { + padding: 0 !important; +} + +.jp-Button.jp-mod-small { + min-height: 24px; + min-width: 24px; + font-size: 12px; + padding: 0 7px; +} + +/* Use our own theme for hover styles */ +.jp-Button.jp-mod-minimal:hover { + background-color: var(--jp-layout-color2); +} + +.jp-Button.jp-mod-minimal { + background: none; +} + +.jp-InputGroup { + display: block; + position: relative; +} + +.jp-InputGroup input { + box-sizing: border-box; + border: none; + border-radius: 0; + background-color: transparent; + color: var(--jp-ui-font-color0); + box-shadow: inset 0 0 0 var(--jp-border-width) var(--jp-input-border-color); + padding-bottom: 0; + padding-top: 0; + padding-left: 10px; + padding-right: 28px; + position: relative; + width: 100%; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + font-size: 14px; + font-weight: 400; + height: 30px; + line-height: 30px; + outline: none; + vertical-align: middle; +} + +.jp-InputGroup input:focus { + box-shadow: inset 0 0 0 var(--jp-border-width) + var(--jp-input-active-box-shadow-color), + inset 0 0 0 3px var(--jp-input-active-box-shadow-color); +} + +.jp-InputGroup input:disabled { + cursor: not-allowed; + resize: block; + background-color: var(--jp-layout-color2); + color: var(--jp-ui-font-color2); +} + +.jp-InputGroup input:disabled ~ span { + cursor: not-allowed; + color: var(--jp-ui-font-color2); +} + +.jp-InputGroup input::placeholder, +input::placeholder { + color: var(--jp-ui-font-color2); +} + +.jp-InputGroupAction { + position: absolute; + bottom: 1px; + right: 0; + padding: 6px; +} + +.jp-HTMLSelect.jp-DefaultStyle select { + background-color: initial; + border: none; + border-radius: 0; + box-shadow: none; + color: var(--jp-ui-font-color0); + display: block; + font-size: var(--jp-ui-font-size1); + font-family: var(--jp-ui-font-family); + height: 24px; + line-height: 14px; + padding: 0 25px 0 10px; + text-align: left; + -moz-appearance: none; + -webkit-appearance: none; +} + +.jp-HTMLSelect.jp-DefaultStyle select:disabled { + background-color: var(--jp-layout-color2); + color: var(--jp-ui-font-color2); + cursor: not-allowed; + resize: block; +} + +.jp-HTMLSelect.jp-DefaultStyle select:disabled ~ span { + cursor: not-allowed; +} + +/* Use our own theme for hover and option styles */ +/* stylelint-disable-next-line selector-max-type */ +.jp-HTMLSelect.jp-DefaultStyle select:hover, +.jp-HTMLSelect.jp-DefaultStyle select > option { + background-color: var(--jp-layout-color2); + color: var(--jp-ui-font-color0); +} + +select { + box-sizing: border-box; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Styles +|----------------------------------------------------------------------------*/ + +.jp-StatusBar-Widget { + display: flex; + align-items: center; + background: var(--jp-layout-color2); + min-height: var(--jp-statusbar-height); + justify-content: space-between; + padding: 0 10px; +} + +.jp-StatusBar-Left { + display: flex; + align-items: center; + flex-direction: row; +} + +.jp-StatusBar-Middle { + display: flex; + align-items: center; +} + +.jp-StatusBar-Right { + display: flex; + align-items: center; + flex-direction: row-reverse; +} + +.jp-StatusBar-Item { + max-height: var(--jp-statusbar-height); + margin: 0 2px; + height: var(--jp-statusbar-height); + white-space: nowrap; + text-overflow: ellipsis; + color: var(--jp-ui-font-color1); + padding: 0 6px; +} + +.jp-mod-highlighted:hover { + background-color: var(--jp-layout-color3); +} + +.jp-mod-clicked { + background-color: var(--jp-brand-color1); +} + +.jp-mod-clicked:hover { + background-color: var(--jp-brand-color0); +} + +.jp-mod-clicked .jp-StatusBar-TextItem { + color: var(--jp-ui-inverse-font-color1); +} + +.jp-StatusBar-HoverItem { + box-shadow: '0px 4px 4px rgba(0, 0, 0, 0.25)'; +} + +.jp-StatusBar-TextItem { + font-size: var(--jp-ui-font-size1); + font-family: var(--jp-ui-font-family); + line-height: 24px; + color: var(--jp-ui-font-color1); +} + +.jp-StatusBar-GroupItem { + display: flex; + align-items: center; + flex-direction: row; +} + +.jp-Statusbar-ProgressCircle svg { + display: block; + margin: 0 auto; + width: 16px; + height: 24px; + align-self: normal; +} + +.jp-Statusbar-ProgressCircle path { + fill: var(--jp-inverse-layout-color3); +} + +.jp-Statusbar-ProgressBar-progress-bar { + height: 10px; + width: 100px; + border: solid 0.25px var(--jp-brand-color2); + border-radius: 3px; + overflow: hidden; + align-self: center; +} + +.jp-Statusbar-ProgressBar-progress-bar > div { + background-color: var(--jp-brand-color2); + background-image: linear-gradient( + -45deg, + rgba(255, 255, 255, 0.2) 25%, + transparent 25%, + transparent 50%, + rgba(255, 255, 255, 0.2) 50%, + rgba(255, 255, 255, 0.2) 75%, + transparent 75%, + transparent + ); + background-size: 40px 40px; + float: left; + width: 0%; + height: 100%; + font-size: 12px; + line-height: 14px; + color: #fff; + text-align: center; + animation: jp-Statusbar-ExecutionTime-progress-bar 2s linear infinite; +} + +.jp-Statusbar-ProgressBar-progress-bar p { + color: var(--jp-ui-font-color1); + font-family: var(--jp-ui-font-family); + font-size: var(--jp-ui-font-size1); + line-height: 10px; + width: 100px; +} + +@keyframes jp-Statusbar-ExecutionTime-progress-bar { + 0% { + background-position: 0 0; + } + + 100% { + background-position: 40px 40px; + } +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Variables +|----------------------------------------------------------------------------*/ + +:root { + --jp-private-commandpalette-search-height: 28px; +} + +/*----------------------------------------------------------------------------- +| Overall styles +|----------------------------------------------------------------------------*/ + +.lm-CommandPalette { + padding-bottom: 0; + color: var(--jp-ui-font-color1); + background: var(--jp-layout-color1); + + /* This is needed so that all font sizing of children done in ems is + * relative to this base size */ + font-size: var(--jp-ui-font-size1); +} + +/*----------------------------------------------------------------------------- +| Modal variant +|----------------------------------------------------------------------------*/ + +.jp-ModalCommandPalette { + position: absolute; + z-index: 10000; + top: 38px; + left: 30%; + margin: 0; + padding: 4px; + width: 40%; + box-shadow: var(--jp-elevation-z4); + border-radius: 4px; + background: var(--jp-layout-color0); +} + +.jp-ModalCommandPalette .lm-CommandPalette { + max-height: 40vh; +} + +.jp-ModalCommandPalette .lm-CommandPalette .lm-close-icon::after { + display: none; +} + +.jp-ModalCommandPalette .lm-CommandPalette .lm-CommandPalette-header { + display: none; +} + +.jp-ModalCommandPalette .lm-CommandPalette .lm-CommandPalette-item { + margin-left: 4px; + margin-right: 4px; +} + +.jp-ModalCommandPalette + .lm-CommandPalette + .lm-CommandPalette-item.lm-mod-disabled { + display: none; +} + +/*----------------------------------------------------------------------------- +| Search +|----------------------------------------------------------------------------*/ + +.lm-CommandPalette-search { + padding: 4px; + background-color: var(--jp-layout-color1); + z-index: 2; +} + +.lm-CommandPalette-wrapper { + overflow: overlay; + padding: 0 9px; + background-color: var(--jp-input-active-background); + height: 30px; + box-shadow: inset 0 0 0 var(--jp-border-width) var(--jp-input-border-color); +} + +.lm-CommandPalette.lm-mod-focused .lm-CommandPalette-wrapper { + box-shadow: inset 0 0 0 1px var(--jp-input-active-box-shadow-color), + inset 0 0 0 3px var(--jp-input-active-box-shadow-color); +} + +.jp-SearchIconGroup { + color: white; + background-color: var(--jp-brand-color1); + position: absolute; + top: 4px; + right: 4px; + padding: 5px 5px 1px; +} + +.jp-SearchIconGroup svg { + height: 20px; + width: 20px; +} + +.jp-SearchIconGroup .jp-icon3[fill] { + fill: var(--jp-layout-color0); +} + +.lm-CommandPalette-input { + background: transparent; + width: calc(100% - 18px); + float: left; + border: none; + outline: none; + font-size: var(--jp-ui-font-size1); + color: var(--jp-ui-font-color0); + line-height: var(--jp-private-commandpalette-search-height); +} + +.lm-CommandPalette-input::-webkit-input-placeholder, +.lm-CommandPalette-input::-moz-placeholder, +.lm-CommandPalette-input:-ms-input-placeholder { + color: var(--jp-ui-font-color2); + font-size: var(--jp-ui-font-size1); +} + +/*----------------------------------------------------------------------------- +| Results +|----------------------------------------------------------------------------*/ + +.lm-CommandPalette-header:first-child { + margin-top: 0; +} + +.lm-CommandPalette-header { + border-bottom: solid var(--jp-border-width) var(--jp-border-color2); + color: var(--jp-ui-font-color1); + cursor: pointer; + display: flex; + font-size: var(--jp-ui-font-size0); + font-weight: 600; + letter-spacing: 1px; + margin-top: 8px; + padding: 8px 0 8px 12px; + text-transform: uppercase; +} + +.lm-CommandPalette-header.lm-mod-active { + background: var(--jp-layout-color2); +} + +.lm-CommandPalette-header > mark { + background-color: transparent; + font-weight: bold; + color: var(--jp-ui-font-color1); +} + +.lm-CommandPalette-item { + padding: 4px 12px 4px 4px; + color: var(--jp-ui-font-color1); + font-size: var(--jp-ui-font-size1); + font-weight: 400; + display: flex; +} + +.lm-CommandPalette-item.lm-mod-disabled { + color: var(--jp-ui-font-color2); +} + +.lm-CommandPalette-item.lm-mod-active { + color: var(--jp-ui-inverse-font-color1); + background: var(--jp-brand-color1); +} + +.lm-CommandPalette-item.lm-mod-active .lm-CommandPalette-itemLabel > mark { + color: var(--jp-ui-inverse-font-color0); +} + +.lm-CommandPalette-item.lm-mod-active .jp-icon-selectable[fill] { + fill: var(--jp-layout-color0); +} + +.lm-CommandPalette-item.lm-mod-active:hover:not(.lm-mod-disabled) { + color: var(--jp-ui-inverse-font-color1); + background: var(--jp-brand-color1); +} + +.lm-CommandPalette-item:hover:not(.lm-mod-active):not(.lm-mod-disabled) { + background: var(--jp-layout-color2); +} + +.lm-CommandPalette-itemContent { + overflow: hidden; +} + +.lm-CommandPalette-itemLabel > mark { + color: var(--jp-ui-font-color0); + background-color: transparent; + font-weight: bold; +} + +.lm-CommandPalette-item.lm-mod-disabled mark { + color: var(--jp-ui-font-color2); +} + +.lm-CommandPalette-item .lm-CommandPalette-itemIcon { + margin: 0 4px 0 0; + position: relative; + width: 16px; + top: 2px; + flex: 0 0 auto; +} + +.lm-CommandPalette-item.lm-mod-disabled .lm-CommandPalette-itemIcon { + opacity: 0.6; +} + +.lm-CommandPalette-item .lm-CommandPalette-itemShortcut { + flex: 0 0 auto; +} + +.lm-CommandPalette-itemCaption { + display: none; +} + +.lm-CommandPalette-content { + background-color: var(--jp-layout-color1); +} + +.lm-CommandPalette-content:empty::after { + content: 'No results'; + margin: auto; + margin-top: 20px; + width: 100px; + display: block; + font-size: var(--jp-ui-font-size2); + font-family: var(--jp-ui-font-family); + font-weight: lighter; +} + +.lm-CommandPalette-emptyMessage { + text-align: center; + margin-top: 24px; + line-height: 1.32; + padding: 0 8px; + color: var(--jp-content-font-color3); +} + +/*----------------------------------------------------------------------------- +| Copyright (c) 2014-2017, Jupyter Development Team. +| +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-Dialog { + position: absolute; + z-index: 10000; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + top: 0; + left: 0; + margin: 0; + padding: 0; + width: 100%; + height: 100%; + background: var(--jp-dialog-background); +} + +.jp-Dialog-content { + display: flex; + flex-direction: column; + margin-left: auto; + margin-right: auto; + background: var(--jp-layout-color1); + padding: 24px 24px 12px; + min-width: 300px; + min-height: 150px; + max-width: 1000px; + max-height: 500px; + box-sizing: border-box; + box-shadow: var(--jp-elevation-z20); + word-wrap: break-word; + border-radius: var(--jp-border-radius); + + /* This is needed so that all font sizing of children done in ems is + * relative to this base size */ + font-size: var(--jp-ui-font-size1); + color: var(--jp-ui-font-color1); + resize: both; +} + +.jp-Dialog-content.jp-Dialog-content-small { + max-width: 500px; +} + +.jp-Dialog-button { + overflow: visible; +} + +button.jp-Dialog-button:focus { + outline: 1px solid var(--jp-brand-color1); + outline-offset: 4px; + -moz-outline-radius: 0; +} + +button.jp-Dialog-button:focus::-moz-focus-inner { + border: 0; +} + +button.jp-Dialog-button.jp-mod-styled.jp-mod-accept:focus, +button.jp-Dialog-button.jp-mod-styled.jp-mod-warn:focus, +button.jp-Dialog-button.jp-mod-styled.jp-mod-reject:focus { + outline-offset: 4px; + -moz-outline-radius: 0; +} + +button.jp-Dialog-button.jp-mod-styled.jp-mod-accept:focus { + outline: 1px solid var(--jp-accept-color-normal, var(--jp-brand-color1)); +} + +button.jp-Dialog-button.jp-mod-styled.jp-mod-warn:focus { + outline: 1px solid var(--jp-warn-color-normal, var(--jp-error-color1)); +} + +button.jp-Dialog-button.jp-mod-styled.jp-mod-reject:focus { + outline: 1px solid var(--jp-reject-color-normal, var(--md-grey-600)); +} + +button.jp-Dialog-close-button { + padding: 0; + height: 100%; + min-width: unset; + min-height: unset; +} + +.jp-Dialog-header { + display: flex; + justify-content: space-between; + flex: 0 0 auto; + padding-bottom: 12px; + font-size: var(--jp-ui-font-size3); + font-weight: 400; + color: var(--jp-ui-font-color1); +} + +.jp-Dialog-body { + display: flex; + flex-direction: column; + flex: 1 1 auto; + font-size: var(--jp-ui-font-size1); + background: var(--jp-layout-color1); + color: var(--jp-ui-font-color1); + overflow: auto; +} + +.jp-Dialog-footer { + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: center; + flex: 0 0 auto; + margin-left: -12px; + margin-right: -12px; + padding: 12px; +} + +.jp-Dialog-checkbox { + padding-right: 5px; +} + +.jp-Dialog-checkbox > input:focus-visible { + outline: 1px solid var(--jp-input-active-border-color); + outline-offset: 1px; +} + +.jp-Dialog-spacer { + flex: 1 1 auto; +} + +.jp-Dialog-title { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.jp-Dialog-body > .jp-select-wrapper { + width: 100%; +} + +.jp-Dialog-body > button { + padding: 0 16px; +} + +.jp-Dialog-body > label { + line-height: 1.4; + color: var(--jp-ui-font-color0); +} + +.jp-Dialog-button.jp-mod-styled:not(:last-child) { + margin-right: 12px; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +.jp-Input-Boolean-Dialog { + flex-direction: row-reverse; + align-items: end; + width: 100%; +} + +.jp-Input-Boolean-Dialog > label { + flex: 1 1 auto; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) 2014-2016, Jupyter Development Team. +| +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-MainAreaWidget > :focus { + outline: none; +} + +.jp-MainAreaWidget .jp-MainAreaWidget-error { + padding: 6px; +} + +.jp-MainAreaWidget .jp-MainAreaWidget-error > pre { + width: auto; + padding: 10px; + background: var(--jp-error-color3); + border: var(--jp-border-width) solid var(--jp-error-color1); + border-radius: var(--jp-border-radius); + color: var(--jp-ui-font-color1); + font-size: var(--jp-ui-font-size1); + white-space: pre-wrap; + word-wrap: break-word; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/** + * google-material-color v1.2.6 + * https://github.com/danlevan/google-material-color + */ +:root { + --md-red-50: #ffebee; + --md-red-100: #ffcdd2; + --md-red-200: #ef9a9a; + --md-red-300: #e57373; + --md-red-400: #ef5350; + --md-red-500: #f44336; + --md-red-600: #e53935; + --md-red-700: #d32f2f; + --md-red-800: #c62828; + --md-red-900: #b71c1c; + --md-red-A100: #ff8a80; + --md-red-A200: #ff5252; + --md-red-A400: #ff1744; + --md-red-A700: #d50000; + --md-pink-50: #fce4ec; + --md-pink-100: #f8bbd0; + --md-pink-200: #f48fb1; + --md-pink-300: #f06292; + --md-pink-400: #ec407a; + --md-pink-500: #e91e63; + --md-pink-600: #d81b60; + --md-pink-700: #c2185b; + --md-pink-800: #ad1457; + --md-pink-900: #880e4f; + --md-pink-A100: #ff80ab; + --md-pink-A200: #ff4081; + --md-pink-A400: #f50057; + --md-pink-A700: #c51162; + --md-purple-50: #f3e5f5; + --md-purple-100: #e1bee7; + --md-purple-200: #ce93d8; + --md-purple-300: #ba68c8; + --md-purple-400: #ab47bc; + --md-purple-500: #9c27b0; + --md-purple-600: #8e24aa; + --md-purple-700: #7b1fa2; + --md-purple-800: #6a1b9a; + --md-purple-900: #4a148c; + --md-purple-A100: #ea80fc; + --md-purple-A200: #e040fb; + --md-purple-A400: #d500f9; + --md-purple-A700: #a0f; + --md-deep-purple-50: #ede7f6; + --md-deep-purple-100: #d1c4e9; + --md-deep-purple-200: #b39ddb; + --md-deep-purple-300: #9575cd; + --md-deep-purple-400: #7e57c2; + --md-deep-purple-500: #673ab7; + --md-deep-purple-600: #5e35b1; + --md-deep-purple-700: #512da8; + --md-deep-purple-800: #4527a0; + --md-deep-purple-900: #311b92; + --md-deep-purple-A100: #b388ff; + --md-deep-purple-A200: #7c4dff; + --md-deep-purple-A400: #651fff; + --md-deep-purple-A700: #6200ea; + --md-indigo-50: #e8eaf6; + --md-indigo-100: #c5cae9; + --md-indigo-200: #9fa8da; + --md-indigo-300: #7986cb; + --md-indigo-400: #5c6bc0; + --md-indigo-500: #3f51b5; + --md-indigo-600: #3949ab; + --md-indigo-700: #303f9f; + --md-indigo-800: #283593; + --md-indigo-900: #1a237e; + --md-indigo-A100: #8c9eff; + --md-indigo-A200: #536dfe; + --md-indigo-A400: #3d5afe; + --md-indigo-A700: #304ffe; + --md-blue-50: #e3f2fd; + --md-blue-100: #bbdefb; + --md-blue-200: #90caf9; + --md-blue-300: #64b5f6; + --md-blue-400: #42a5f5; + --md-blue-500: #2196f3; + --md-blue-600: #1e88e5; + --md-blue-700: #1976d2; + --md-blue-800: #1565c0; + --md-blue-900: #0d47a1; + --md-blue-A100: #82b1ff; + --md-blue-A200: #448aff; + --md-blue-A400: #2979ff; + --md-blue-A700: #2962ff; + --md-light-blue-50: #e1f5fe; + --md-light-blue-100: #b3e5fc; + --md-light-blue-200: #81d4fa; + --md-light-blue-300: #4fc3f7; + --md-light-blue-400: #29b6f6; + --md-light-blue-500: #03a9f4; + --md-light-blue-600: #039be5; + --md-light-blue-700: #0288d1; + --md-light-blue-800: #0277bd; + --md-light-blue-900: #01579b; + --md-light-blue-A100: #80d8ff; + --md-light-blue-A200: #40c4ff; + --md-light-blue-A400: #00b0ff; + --md-light-blue-A700: #0091ea; + --md-cyan-50: #e0f7fa; + --md-cyan-100: #b2ebf2; + --md-cyan-200: #80deea; + --md-cyan-300: #4dd0e1; + --md-cyan-400: #26c6da; + --md-cyan-500: #00bcd4; + --md-cyan-600: #00acc1; + --md-cyan-700: #0097a7; + --md-cyan-800: #00838f; + --md-cyan-900: #006064; + --md-cyan-A100: #84ffff; + --md-cyan-A200: #18ffff; + --md-cyan-A400: #00e5ff; + --md-cyan-A700: #00b8d4; + --md-teal-50: #e0f2f1; + --md-teal-100: #b2dfdb; + --md-teal-200: #80cbc4; + --md-teal-300: #4db6ac; + --md-teal-400: #26a69a; + --md-teal-500: #009688; + --md-teal-600: #00897b; + --md-teal-700: #00796b; + --md-teal-800: #00695c; + --md-teal-900: #004d40; + --md-teal-A100: #a7ffeb; + --md-teal-A200: #64ffda; + --md-teal-A400: #1de9b6; + --md-teal-A700: #00bfa5; + --md-green-50: #e8f5e9; + --md-green-100: #c8e6c9; + --md-green-200: #a5d6a7; + --md-green-300: #81c784; + --md-green-400: #66bb6a; + --md-green-500: #4caf50; + --md-green-600: #43a047; + --md-green-700: #388e3c; + --md-green-800: #2e7d32; + --md-green-900: #1b5e20; + --md-green-A100: #b9f6ca; + --md-green-A200: #69f0ae; + --md-green-A400: #00e676; + --md-green-A700: #00c853; + --md-light-green-50: #f1f8e9; + --md-light-green-100: #dcedc8; + --md-light-green-200: #c5e1a5; + --md-light-green-300: #aed581; + --md-light-green-400: #9ccc65; + --md-light-green-500: #8bc34a; + --md-light-green-600: #7cb342; + --md-light-green-700: #689f38; + --md-light-green-800: #558b2f; + --md-light-green-900: #33691e; + --md-light-green-A100: #ccff90; + --md-light-green-A200: #b2ff59; + --md-light-green-A400: #76ff03; + --md-light-green-A700: #64dd17; + --md-lime-50: #f9fbe7; + --md-lime-100: #f0f4c3; + --md-lime-200: #e6ee9c; + --md-lime-300: #dce775; + --md-lime-400: #d4e157; + --md-lime-500: #cddc39; + --md-lime-600: #c0ca33; + --md-lime-700: #afb42b; + --md-lime-800: #9e9d24; + --md-lime-900: #827717; + --md-lime-A100: #f4ff81; + --md-lime-A200: #eeff41; + --md-lime-A400: #c6ff00; + --md-lime-A700: #aeea00; + --md-yellow-50: #fffde7; + --md-yellow-100: #fff9c4; + --md-yellow-200: #fff59d; + --md-yellow-300: #fff176; + --md-yellow-400: #ffee58; + --md-yellow-500: #ffeb3b; + --md-yellow-600: #fdd835; + --md-yellow-700: #fbc02d; + --md-yellow-800: #f9a825; + --md-yellow-900: #f57f17; + --md-yellow-A100: #ffff8d; + --md-yellow-A200: #ff0; + --md-yellow-A400: #ffea00; + --md-yellow-A700: #ffd600; + --md-amber-50: #fff8e1; + --md-amber-100: #ffecb3; + --md-amber-200: #ffe082; + --md-amber-300: #ffd54f; + --md-amber-400: #ffca28; + --md-amber-500: #ffc107; + --md-amber-600: #ffb300; + --md-amber-700: #ffa000; + --md-amber-800: #ff8f00; + --md-amber-900: #ff6f00; + --md-amber-A100: #ffe57f; + --md-amber-A200: #ffd740; + --md-amber-A400: #ffc400; + --md-amber-A700: #ffab00; + --md-orange-50: #fff3e0; + --md-orange-100: #ffe0b2; + --md-orange-200: #ffcc80; + --md-orange-300: #ffb74d; + --md-orange-400: #ffa726; + --md-orange-500: #ff9800; + --md-orange-600: #fb8c00; + --md-orange-700: #f57c00; + --md-orange-800: #ef6c00; + --md-orange-900: #e65100; + --md-orange-A100: #ffd180; + --md-orange-A200: #ffab40; + --md-orange-A400: #ff9100; + --md-orange-A700: #ff6d00; + --md-deep-orange-50: #fbe9e7; + --md-deep-orange-100: #ffccbc; + --md-deep-orange-200: #ffab91; + --md-deep-orange-300: #ff8a65; + --md-deep-orange-400: #ff7043; + --md-deep-orange-500: #ff5722; + --md-deep-orange-600: #f4511e; + --md-deep-orange-700: #e64a19; + --md-deep-orange-800: #d84315; + --md-deep-orange-900: #bf360c; + --md-deep-orange-A100: #ff9e80; + --md-deep-orange-A200: #ff6e40; + --md-deep-orange-A400: #ff3d00; + --md-deep-orange-A700: #dd2c00; + --md-brown-50: #efebe9; + --md-brown-100: #d7ccc8; + --md-brown-200: #bcaaa4; + --md-brown-300: #a1887f; + --md-brown-400: #8d6e63; + --md-brown-500: #795548; + --md-brown-600: #6d4c41; + --md-brown-700: #5d4037; + --md-brown-800: #4e342e; + --md-brown-900: #3e2723; + --md-grey-50: #fafafa; + --md-grey-100: #f5f5f5; + --md-grey-200: #eee; + --md-grey-300: #e0e0e0; + --md-grey-400: #bdbdbd; + --md-grey-500: #9e9e9e; + --md-grey-600: #757575; + --md-grey-700: #616161; + --md-grey-800: #424242; + --md-grey-900: #212121; + --md-blue-grey-50: #eceff1; + --md-blue-grey-100: #cfd8dc; + --md-blue-grey-200: #b0bec5; + --md-blue-grey-300: #90a4ae; + --md-blue-grey-400: #78909c; + --md-blue-grey-500: #607d8b; + --md-blue-grey-600: #546e7a; + --md-blue-grey-700: #455a64; + --md-blue-grey-800: #37474f; + --md-blue-grey-900: #263238; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) 2014-2017, Jupyter Development Team. +| +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| RenderedText +|----------------------------------------------------------------------------*/ + +:root { + /* This is the padding value to fill the gaps between lines containing spans with background color. */ + --jp-private-code-span-padding: calc( + (var(--jp-code-line-height) - 1) * var(--jp-code-font-size) / 2 + ); +} + +.jp-RenderedText { + text-align: left; + padding-left: var(--jp-code-padding); + line-height: var(--jp-code-line-height); + font-family: var(--jp-code-font-family); +} + +.jp-RenderedText pre, +.jp-RenderedJavaScript pre, +.jp-RenderedHTMLCommon pre { + color: var(--jp-content-font-color1); + font-size: var(--jp-code-font-size); + border: none; + margin: 0; + padding: 0; +} + +.jp-RenderedText pre a:link { + text-decoration: none; + color: var(--jp-content-link-color); +} + +.jp-RenderedText pre a:hover { + text-decoration: underline; + color: var(--jp-content-link-color); +} + +.jp-RenderedText pre a:visited { + text-decoration: none; + color: var(--jp-content-link-color); +} + +/* console foregrounds and backgrounds */ +.jp-RenderedText pre .ansi-black-fg { + color: #3e424d; +} + +.jp-RenderedText pre .ansi-red-fg { + color: #e75c58; +} + +.jp-RenderedText pre .ansi-green-fg { + color: #00a250; +} + +.jp-RenderedText pre .ansi-yellow-fg { + color: #ddb62b; +} + +.jp-RenderedText pre .ansi-blue-fg { + color: #208ffb; +} + +.jp-RenderedText pre .ansi-magenta-fg { + color: #d160c4; +} + +.jp-RenderedText pre .ansi-cyan-fg { + color: #60c6c8; +} + +.jp-RenderedText pre .ansi-white-fg { + color: #c5c1b4; +} + +.jp-RenderedText pre .ansi-black-bg { + background-color: #3e424d; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-red-bg { + background-color: #e75c58; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-green-bg { + background-color: #00a250; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-yellow-bg { + background-color: #ddb62b; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-blue-bg { + background-color: #208ffb; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-magenta-bg { + background-color: #d160c4; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-cyan-bg { + background-color: #60c6c8; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-white-bg { + background-color: #c5c1b4; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-black-intense-fg { + color: #282c36; +} + +.jp-RenderedText pre .ansi-red-intense-fg { + color: #b22b31; +} + +.jp-RenderedText pre .ansi-green-intense-fg { + color: #007427; +} + +.jp-RenderedText pre .ansi-yellow-intense-fg { + color: #b27d12; +} + +.jp-RenderedText pre .ansi-blue-intense-fg { + color: #0065ca; +} + +.jp-RenderedText pre .ansi-magenta-intense-fg { + color: #a03196; +} + +.jp-RenderedText pre .ansi-cyan-intense-fg { + color: #258f8f; +} + +.jp-RenderedText pre .ansi-white-intense-fg { + color: #a1a6b2; +} + +.jp-RenderedText pre .ansi-black-intense-bg { + background-color: #282c36; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-red-intense-bg { + background-color: #b22b31; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-green-intense-bg { + background-color: #007427; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-yellow-intense-bg { + background-color: #b27d12; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-blue-intense-bg { + background-color: #0065ca; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-magenta-intense-bg { + background-color: #a03196; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-cyan-intense-bg { + background-color: #258f8f; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-white-intense-bg { + background-color: #a1a6b2; + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-default-inverse-fg { + color: var(--jp-ui-inverse-font-color0); +} + +.jp-RenderedText pre .ansi-default-inverse-bg { + background-color: var(--jp-inverse-layout-color0); + padding: var(--jp-private-code-span-padding) 0; +} + +.jp-RenderedText pre .ansi-bold { + font-weight: bold; +} + +.jp-RenderedText pre .ansi-underline { + text-decoration: underline; +} + +.jp-RenderedText[data-mime-type='application/vnd.jupyter.stderr'] { + background: var(--jp-rendermime-error-background); + padding-top: var(--jp-code-padding); +} + +/*----------------------------------------------------------------------------- +| RenderedLatex +|----------------------------------------------------------------------------*/ + +.jp-RenderedLatex { + color: var(--jp-content-font-color1); + font-size: var(--jp-content-font-size1); + line-height: var(--jp-content-line-height); +} + +/* Left-justify outputs.*/ +.jp-OutputArea-output.jp-RenderedLatex { + padding: var(--jp-code-padding); + text-align: left; +} + +/*----------------------------------------------------------------------------- +| RenderedHTML +|----------------------------------------------------------------------------*/ + +.jp-RenderedHTMLCommon { + color: var(--jp-content-font-color1); + font-family: var(--jp-content-font-family); + font-size: var(--jp-content-font-size1); + line-height: var(--jp-content-line-height); + + /* Give a bit more R padding on Markdown text to keep line lengths reasonable */ + padding-right: 20px; +} + +.jp-RenderedHTMLCommon em { + font-style: italic; +} + +.jp-RenderedHTMLCommon strong { + font-weight: bold; +} + +.jp-RenderedHTMLCommon u { + text-decoration: underline; +} + +.jp-RenderedHTMLCommon a:link { + text-decoration: none; + color: var(--jp-content-link-color); +} + +.jp-RenderedHTMLCommon a:hover { + text-decoration: underline; + color: var(--jp-content-link-color); +} + +.jp-RenderedHTMLCommon a:visited { + text-decoration: none; + color: var(--jp-content-link-color); +} + +/* Headings */ + +.jp-RenderedHTMLCommon h1, +.jp-RenderedHTMLCommon h2, +.jp-RenderedHTMLCommon h3, +.jp-RenderedHTMLCommon h4, +.jp-RenderedHTMLCommon h5, +.jp-RenderedHTMLCommon h6 { + line-height: var(--jp-content-heading-line-height); + font-weight: var(--jp-content-heading-font-weight); + font-style: normal; + margin: var(--jp-content-heading-margin-top) 0 + var(--jp-content-heading-margin-bottom) 0; +} + +.jp-RenderedHTMLCommon h1:first-child, +.jp-RenderedHTMLCommon h2:first-child, +.jp-RenderedHTMLCommon h3:first-child, +.jp-RenderedHTMLCommon h4:first-child, +.jp-RenderedHTMLCommon h5:first-child, +.jp-RenderedHTMLCommon h6:first-child { + margin-top: calc(0.5 * var(--jp-content-heading-margin-top)); +} + +.jp-RenderedHTMLCommon h1:last-child, +.jp-RenderedHTMLCommon h2:last-child, +.jp-RenderedHTMLCommon h3:last-child, +.jp-RenderedHTMLCommon h4:last-child, +.jp-RenderedHTMLCommon h5:last-child, +.jp-RenderedHTMLCommon h6:last-child { + margin-bottom: calc(0.5 * var(--jp-content-heading-margin-bottom)); +} + +.jp-RenderedHTMLCommon h1 { + font-size: var(--jp-content-font-size5); +} + +.jp-RenderedHTMLCommon h2 { + font-size: var(--jp-content-font-size4); +} + +.jp-RenderedHTMLCommon h3 { + font-size: var(--jp-content-font-size3); +} + +.jp-RenderedHTMLCommon h4 { + font-size: var(--jp-content-font-size2); +} + +.jp-RenderedHTMLCommon h5 { + font-size: var(--jp-content-font-size1); +} + +.jp-RenderedHTMLCommon h6 { + font-size: var(--jp-content-font-size0); +} + +/* Lists */ + +/* stylelint-disable selector-max-type, selector-max-compound-selectors */ + +.jp-RenderedHTMLCommon ul:not(.list-inline), +.jp-RenderedHTMLCommon ol:not(.list-inline) { + padding-left: 2em; +} + +.jp-RenderedHTMLCommon ul { + list-style: disc; +} + +.jp-RenderedHTMLCommon ul ul { + list-style: square; +} + +.jp-RenderedHTMLCommon ul ul ul { + list-style: circle; +} + +.jp-RenderedHTMLCommon ol { + list-style: decimal; +} + +.jp-RenderedHTMLCommon ol ol { + list-style: upper-alpha; +} + +.jp-RenderedHTMLCommon ol ol ol { + list-style: lower-alpha; +} + +.jp-RenderedHTMLCommon ol ol ol ol { + list-style: lower-roman; +} + +.jp-RenderedHTMLCommon ol ol ol ol ol { + list-style: decimal; +} + +.jp-RenderedHTMLCommon ol, +.jp-RenderedHTMLCommon ul { + margin-bottom: 1em; +} + +.jp-RenderedHTMLCommon ul ul, +.jp-RenderedHTMLCommon ul ol, +.jp-RenderedHTMLCommon ol ul, +.jp-RenderedHTMLCommon ol ol { + margin-bottom: 0; +} + +/* stylelint-enable selector-max-type, selector-max-compound-selectors */ + +.jp-RenderedHTMLCommon hr { + color: var(--jp-border-color2); + background-color: var(--jp-border-color1); + margin-top: 1em; + margin-bottom: 1em; +} + +.jp-RenderedHTMLCommon > pre { + margin: 1.5em 2em; +} + +.jp-RenderedHTMLCommon pre, +.jp-RenderedHTMLCommon code { + border: 0; + background-color: var(--jp-layout-color0); + color: var(--jp-content-font-color1); + font-family: var(--jp-code-font-family); + font-size: inherit; + line-height: var(--jp-code-line-height); + padding: 0; + white-space: pre-wrap; +} + +.jp-RenderedHTMLCommon :not(pre) > code { + background-color: var(--jp-layout-color2); + padding: 1px 5px; +} + +/* Tables */ + +.jp-RenderedHTMLCommon table { + border-collapse: collapse; + border-spacing: 0; + border: none; + color: var(--jp-ui-font-color1); + font-size: var(--jp-ui-font-size1); + table-layout: fixed; + margin-left: auto; + margin-bottom: 1em; + margin-right: auto; +} + +.jp-RenderedHTMLCommon thead { + border-bottom: var(--jp-border-width) solid var(--jp-border-color1); + vertical-align: bottom; +} + +.jp-RenderedHTMLCommon td, +.jp-RenderedHTMLCommon th, +.jp-RenderedHTMLCommon tr { + vertical-align: middle; + padding: 0.5em; + line-height: normal; + white-space: normal; + max-width: none; + border: none; +} + +.jp-RenderedMarkdown.jp-RenderedHTMLCommon td, +.jp-RenderedMarkdown.jp-RenderedHTMLCommon th { + max-width: none; +} + +:not(.jp-RenderedMarkdown).jp-RenderedHTMLCommon td, +:not(.jp-RenderedMarkdown).jp-RenderedHTMLCommon th, +:not(.jp-RenderedMarkdown).jp-RenderedHTMLCommon tr { + text-align: right; +} + +.jp-RenderedHTMLCommon th { + font-weight: bold; +} + +.jp-RenderedHTMLCommon tbody tr:nth-child(odd) { + background: var(--jp-layout-color0); +} + +.jp-RenderedHTMLCommon tbody tr:nth-child(even) { + background: var(--jp-rendermime-table-row-background); +} + +.jp-RenderedHTMLCommon tbody tr:hover { + background: var(--jp-rendermime-table-row-hover-background); +} + +.jp-RenderedHTMLCommon p { + text-align: left; + margin: 0; + margin-bottom: 1em; +} + +.jp-RenderedHTMLCommon img { + -moz-force-broken-image-icon: 1; +} + +/* Restrict to direct children as other images could be nested in other content. */ +.jp-RenderedHTMLCommon > img { + display: block; + margin-left: 0; + margin-right: 0; + margin-bottom: 1em; +} + +/* Change color behind transparent images if they need it... */ +[data-jp-theme-light='false'] .jp-RenderedImage img.jp-needs-light-background { + background-color: var(--jp-inverse-layout-color1); +} + +[data-jp-theme-light='true'] .jp-RenderedImage img.jp-needs-dark-background { + background-color: var(--jp-inverse-layout-color1); +} + +.jp-RenderedHTMLCommon img, +.jp-RenderedImage img, +.jp-RenderedHTMLCommon svg, +.jp-RenderedSVG svg { + max-width: 100%; + height: auto; +} + +.jp-RenderedHTMLCommon img.jp-mod-unconfined, +.jp-RenderedImage img.jp-mod-unconfined, +.jp-RenderedHTMLCommon svg.jp-mod-unconfined, +.jp-RenderedSVG svg.jp-mod-unconfined { + max-width: none; +} + +.jp-RenderedHTMLCommon .alert { + padding: var(--jp-notebook-padding); + border: var(--jp-border-width) solid transparent; + border-radius: var(--jp-border-radius); + margin-bottom: 1em; +} + +.jp-RenderedHTMLCommon .alert-info { + color: var(--jp-info-color0); + background-color: var(--jp-info-color3); + border-color: var(--jp-info-color2); +} + +.jp-RenderedHTMLCommon .alert-info hr { + border-color: var(--jp-info-color3); +} + +.jp-RenderedHTMLCommon .alert-info > p:last-child, +.jp-RenderedHTMLCommon .alert-info > ul:last-child { + margin-bottom: 0; +} + +.jp-RenderedHTMLCommon .alert-warning { + color: var(--jp-warn-color0); + background-color: var(--jp-warn-color3); + border-color: var(--jp-warn-color2); +} + +.jp-RenderedHTMLCommon .alert-warning hr { + border-color: var(--jp-warn-color3); +} + +.jp-RenderedHTMLCommon .alert-warning > p:last-child, +.jp-RenderedHTMLCommon .alert-warning > ul:last-child { + margin-bottom: 0; +} + +.jp-RenderedHTMLCommon .alert-success { + color: var(--jp-success-color0); + background-color: var(--jp-success-color3); + border-color: var(--jp-success-color2); +} + +.jp-RenderedHTMLCommon .alert-success hr { + border-color: var(--jp-success-color3); +} + +.jp-RenderedHTMLCommon .alert-success > p:last-child, +.jp-RenderedHTMLCommon .alert-success > ul:last-child { + margin-bottom: 0; +} + +.jp-RenderedHTMLCommon .alert-danger { + color: var(--jp-error-color0); + background-color: var(--jp-error-color3); + border-color: var(--jp-error-color2); +} + +.jp-RenderedHTMLCommon .alert-danger hr { + border-color: var(--jp-error-color3); +} + +.jp-RenderedHTMLCommon .alert-danger > p:last-child, +.jp-RenderedHTMLCommon .alert-danger > ul:last-child { + margin-bottom: 0; +} + +.jp-RenderedHTMLCommon blockquote { + margin: 1em 2em; + padding: 0 1em; + border-left: 5px solid var(--jp-border-color2); +} + +a.jp-InternalAnchorLink { + visibility: hidden; + margin-left: 8px; + color: var(--md-blue-800); +} + +h1:hover .jp-InternalAnchorLink, +h2:hover .jp-InternalAnchorLink, +h3:hover .jp-InternalAnchorLink, +h4:hover .jp-InternalAnchorLink, +h5:hover .jp-InternalAnchorLink, +h6:hover .jp-InternalAnchorLink { + visibility: visible; +} + +.jp-RenderedHTMLCommon kbd { + background-color: var(--jp-rendermime-table-row-background); + border: 1px solid var(--jp-border-color0); + border-bottom-color: var(--jp-border-color2); + border-radius: 3px; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); + display: inline-block; + font-size: var(--jp-ui-font-size0); + line-height: 1em; + padding: 0.2em 0.5em; +} + +/* Most direct children of .jp-RenderedHTMLCommon have a margin-bottom of 1.0. + * At the bottom of cells this is a bit too much as there is also spacing + * between cells. Going all the way to 0 gets too tight between markdown and + * code cells. + */ +.jp-RenderedHTMLCommon > *:last-child { + margin-bottom: 0.5em; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Copyright (c) 2014-2017, PhosphorJS Contributors +| +| Distributed under the terms of the BSD 3-Clause License. +| +| The full license is in the file LICENSE, distributed with this software. +|----------------------------------------------------------------------------*/ + +.lm-cursor-backdrop { + position: fixed; + width: 200px; + height: 200px; + margin-top: -100px; + margin-left: -100px; + will-change: transform; + z-index: 100; +} + +.lm-mod-drag-image { + will-change: transform; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +.jp-lineFormSearch { + padding: 4px 12px; + background-color: var(--jp-layout-color2); + box-shadow: var(--jp-toolbar-box-shadow); + z-index: 2; + font-size: var(--jp-ui-font-size1); +} + +.jp-lineFormCaption { + font-size: var(--jp-ui-font-size0); + line-height: var(--jp-ui-font-size1); + margin-top: 4px; + color: var(--jp-ui-font-color0); +} + +.jp-baseLineForm { + border: none; + border-radius: 0; + position: absolute; + background-size: 16px; + background-repeat: no-repeat; + background-position: center; + outline: none; +} + +.jp-lineFormButtonContainer { + top: 4px; + right: 8px; + height: 24px; + padding: 0 12px; + width: 12px; +} + +.jp-lineFormButtonIcon { + top: 0; + right: 0; + background-color: var(--jp-brand-color1); + height: 100%; + width: 100%; + box-sizing: border-box; + padding: 4px 6px; +} + +.jp-lineFormButton { + top: 0; + right: 0; + background-color: transparent; + height: 100%; + width: 100%; + box-sizing: border-box; +} + +.jp-lineFormWrapper { + overflow: hidden; + padding: 0 8px; + border: 1px solid var(--jp-border-color0); + background-color: var(--jp-input-active-background); + height: 22px; +} + +.jp-lineFormWrapperFocusWithin { + border: var(--jp-border-width) solid var(--md-blue-500); + box-shadow: inset 0 0 4px var(--md-blue-300); +} + +.jp-lineFormInput { + background: transparent; + width: 200px; + height: 100%; + border: none; + outline: none; + color: var(--jp-ui-font-color0); + line-height: 28px; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) 2014-2016, Jupyter Development Team. +| +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-JSONEditor { + display: flex; + flex-direction: column; + width: 100%; +} + +.jp-JSONEditor-host { + flex: 1 1 auto; + border: var(--jp-border-width) solid var(--jp-input-border-color); + border-radius: 0; + background: var(--jp-layout-color0); + min-height: 50px; + padding: 1px; +} + +.jp-JSONEditor.jp-mod-error .jp-JSONEditor-host { + border-color: red; + outline-color: red; +} + +.jp-JSONEditor-header { + display: flex; + flex: 1 0 auto; + padding: 0 0 0 12px; +} + +.jp-JSONEditor-header label { + flex: 0 0 auto; +} + +.jp-JSONEditor-commitButton { + height: 16px; + width: 16px; + background-size: 18px; + background-repeat: no-repeat; + background-position: center; +} + +.jp-JSONEditor-host.jp-mod-focused { + background-color: var(--jp-input-active-background); + border: 1px solid var(--jp-input-active-border-color); + box-shadow: var(--jp-input-box-shadow); +} + +.jp-Editor.jp-mod-dropTarget { + border: var(--jp-border-width) solid var(--jp-input-active-border-color); + box-shadow: var(--jp-input-box-shadow); +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ +.jp-DocumentSearch-input { + border: none; + outline: none; + color: var(--jp-ui-font-color0); + font-size: var(--jp-ui-font-size1); + background-color: var(--jp-layout-color0); + font-family: var(--jp-ui-font-family); + padding: 2px 1px; + resize: none; +} + +.jp-DocumentSearch-overlay { + position: absolute; + background-color: var(--jp-toolbar-background); + border-bottom: var(--jp-border-width) solid var(--jp-toolbar-border-color); + border-left: var(--jp-border-width) solid var(--jp-toolbar-border-color); + top: 0; + right: 0; + z-index: 7; + min-width: 405px; + padding: 2px; + font-size: var(--jp-ui-font-size1); + + --jp-private-document-search-button-height: 20px; +} + +.jp-DocumentSearch-overlay button { + background-color: var(--jp-toolbar-background); + outline: 0; +} + +.jp-DocumentSearch-overlay button:hover { + background-color: var(--jp-layout-color2); +} + +.jp-DocumentSearch-overlay button:active { + background-color: var(--jp-layout-color3); +} + +.jp-DocumentSearch-overlay-row { + display: flex; + align-items: center; + margin-bottom: 2px; +} + +.jp-DocumentSearch-button-content { + display: inline-block; + cursor: pointer; + box-sizing: border-box; + width: 100%; + height: 100%; +} + +.jp-DocumentSearch-button-content svg { + width: 100%; + height: 100%; +} + +.jp-DocumentSearch-input-wrapper { + border: var(--jp-border-width) solid var(--jp-border-color0); + display: flex; + background-color: var(--jp-layout-color0); + margin: 2px; +} + +.jp-DocumentSearch-input-wrapper:focus-within { + border-color: var(--jp-cell-editor-active-border-color); +} + +.jp-DocumentSearch-toggle-wrapper, +.jp-DocumentSearch-button-wrapper { + all: initial; + overflow: hidden; + display: inline-block; + border: none; + box-sizing: border-box; +} + +.jp-DocumentSearch-toggle-wrapper { + width: 14px; + height: 14px; +} + +.jp-DocumentSearch-button-wrapper { + width: var(--jp-private-document-search-button-height); + height: var(--jp-private-document-search-button-height); +} + +.jp-DocumentSearch-toggle-wrapper:focus, +.jp-DocumentSearch-button-wrapper:focus { + outline: var(--jp-border-width) solid + var(--jp-cell-editor-active-border-color); + outline-offset: -1px; +} + +.jp-DocumentSearch-toggle-wrapper, +.jp-DocumentSearch-button-wrapper, +.jp-DocumentSearch-button-content:focus { + outline: none; +} + +.jp-DocumentSearch-toggle-placeholder { + width: 5px; +} + +.jp-DocumentSearch-input-button::before { + display: block; + padding-top: 100%; +} + +.jp-DocumentSearch-input-button-off { + opacity: var(--jp-search-toggle-off-opacity); +} + +.jp-DocumentSearch-input-button-off:hover { + opacity: var(--jp-search-toggle-hover-opacity); +} + +.jp-DocumentSearch-input-button-on { + opacity: var(--jp-search-toggle-on-opacity); +} + +.jp-DocumentSearch-index-counter { + padding-left: 10px; + padding-right: 10px; + user-select: none; + min-width: 35px; + display: inline-block; +} + +.jp-DocumentSearch-up-down-wrapper { + display: inline-block; + padding-right: 2px; + margin-left: auto; + white-space: nowrap; +} + +.jp-DocumentSearch-spacer { + margin-left: auto; +} + +.jp-DocumentSearch-up-down-wrapper button { + outline: 0; + border: none; + width: var(--jp-private-document-search-button-height); + height: var(--jp-private-document-search-button-height); + vertical-align: middle; + margin: 1px 5px 2px; +} + +.jp-DocumentSearch-up-down-button:hover { + background-color: var(--jp-layout-color2); +} + +.jp-DocumentSearch-up-down-button:active { + background-color: var(--jp-layout-color3); +} + +.jp-DocumentSearch-filter-button { + border-radius: var(--jp-border-radius); +} + +.jp-DocumentSearch-filter-button:hover { + background-color: var(--jp-layout-color2); +} + +.jp-DocumentSearch-filter-button-enabled { + background-color: var(--jp-layout-color2); +} + +.jp-DocumentSearch-filter-button-enabled:hover { + background-color: var(--jp-layout-color3); +} + +.jp-DocumentSearch-search-options { + padding: 0 8px; + margin-left: 3px; + width: 100%; + display: grid; + justify-content: start; + grid-template-columns: 1fr 1fr; + align-items: center; + justify-items: stretch; +} + +.jp-DocumentSearch-search-filter-disabled { + color: var(--jp-ui-font-color2); +} + +.jp-DocumentSearch-search-filter { + display: flex; + align-items: center; + user-select: none; +} + +.jp-DocumentSearch-regex-error { + color: var(--jp-error-color0); +} + +.jp-DocumentSearch-replace-button-wrapper { + overflow: hidden; + display: inline-block; + box-sizing: border-box; + border: var(--jp-border-width) solid var(--jp-border-color0); + margin: auto 2px; + padding: 1px 4px; + height: calc(var(--jp-private-document-search-button-height) + 2px); +} + +.jp-DocumentSearch-replace-button-wrapper:focus { + border: var(--jp-border-width) solid var(--jp-cell-editor-active-border-color); +} + +.jp-DocumentSearch-replace-button { + display: inline-block; + text-align: center; + cursor: pointer; + box-sizing: border-box; + color: var(--jp-ui-font-color1); + + /* height - 2 * (padding of wrapper) */ + line-height: calc(var(--jp-private-document-search-button-height) - 2px); + width: 100%; + height: 100%; +} + +.jp-DocumentSearch-replace-button:focus { + outline: none; +} + +.jp-DocumentSearch-replace-wrapper-class { + margin-left: 14px; + display: flex; +} + +.jp-DocumentSearch-replace-toggle { + border: none; + background-color: var(--jp-toolbar-background); + border-radius: var(--jp-border-radius); +} + +.jp-DocumentSearch-replace-toggle:hover { + background-color: var(--jp-layout-color2); +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.cm-editor { + line-height: var(--jp-code-line-height); + font-size: var(--jp-code-font-size); + font-family: var(--jp-code-font-family); + border: 0; + border-radius: 0; + height: auto; + + /* Changed to auto to autogrow */ +} + +.cm-editor pre { + padding: 0 var(--jp-code-padding); +} + +.jp-CodeMirrorEditor[data-type='inline'] .cm-dialog { + background-color: var(--jp-layout-color0); + color: var(--jp-content-font-color1); +} + +.jp-CodeMirrorEditor { + cursor: text; +} + +/* When zoomed out 67% and 33% on a screen of 1440 width x 900 height */ +@media screen and (min-width: 2138px) and (max-width: 4319px) { + .jp-CodeMirrorEditor[data-type='inline'] .cm-cursor { + border-left: var(--jp-code-cursor-width1) solid + var(--jp-editor-cursor-color); + } +} + +/* When zoomed out less than 33% */ +@media screen and (min-width: 4320px) { + .jp-CodeMirrorEditor[data-type='inline'] .cm-cursor { + border-left: var(--jp-code-cursor-width2) solid + var(--jp-editor-cursor-color); + } +} + +.cm-editor.jp-mod-readOnly .cm-cursor { + display: none; +} + +.jp-CollaboratorCursor { + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-top: none; + border-bottom: 3px solid; + background-clip: content-box; + margin-left: -5px; + margin-right: -5px; +} + +.cm-searching, +.cm-searching span { + /* `.cm-searching span`: we need to override syntax highlighting */ + background-color: var(--jp-search-unselected-match-background-color); + color: var(--jp-search-unselected-match-color); +} + +.cm-searching::selection, +.cm-searching span::selection { + background-color: var(--jp-search-unselected-match-background-color); + color: var(--jp-search-unselected-match-color); +} + +.jp-current-match > .cm-searching, +.jp-current-match > .cm-searching span, +.cm-searching > .jp-current-match, +.cm-searching > .jp-current-match span { + background-color: var(--jp-search-selected-match-background-color); + color: var(--jp-search-selected-match-color); +} + +.jp-current-match > .cm-searching::selection, +.cm-searching > .jp-current-match::selection, +.jp-current-match > .cm-searching span::selection { + background-color: var(--jp-search-selected-match-background-color); + color: var(--jp-search-selected-match-color); +} + +.cm-trailingspace { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAsElEQVQIHQGlAFr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7+r3zKmT0/+pk9P/7+r3zAAAAAAAAAAABAAAAAAAAAAA6OPzM+/q9wAAAAAA6OPzMwAAAAAAAAAAAgAAAAAAAAAAGR8NiRQaCgAZIA0AGR8NiQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQyoYJ/SY80UAAAAASUVORK5CYII=); + background-position: center left; + background-repeat: repeat-x; +} + +.jp-CollaboratorCursor-hover { + position: absolute; + z-index: 1; + transform: translateX(-50%); + color: white; + border-radius: 3px; + padding-left: 4px; + padding-right: 4px; + padding-top: 1px; + padding-bottom: 1px; + text-align: center; + font-size: var(--jp-ui-font-size1); + white-space: nowrap; +} + +.jp-CodeMirror-ruler { + border-left: 1px dashed var(--jp-border-color2); +} + +/* Styles for shared cursors (remote cursor locations and selected ranges) */ +.jp-CodeMirrorEditor .cm-ySelectionCaret { + position: relative; + border-left: 1px solid black; + margin-left: -1px; + margin-right: -1px; + box-sizing: border-box; +} + +.jp-CodeMirrorEditor .cm-ySelectionCaret > .cm-ySelectionInfo { + white-space: nowrap; + position: absolute; + top: -1.15em; + padding-bottom: 0.05em; + left: -1px; + font-size: 0.95em; + font-family: var(--jp-ui-font-family); + font-weight: bold; + line-height: normal; + user-select: none; + color: white; + padding-left: 2px; + padding-right: 2px; + z-index: 101; + transition: opacity 0.3s ease-in-out; +} + +.jp-CodeMirrorEditor .cm-ySelectionInfo { + transition-delay: 0.7s; + opacity: 0; +} + +.jp-CodeMirrorEditor .cm-ySelectionCaret:hover > .cm-ySelectionInfo { + opacity: 1; + transition-delay: 0s; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-MimeDocument { + outline: none; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Variables +|----------------------------------------------------------------------------*/ + +:root { + --jp-private-filebrowser-button-height: 28px; + --jp-private-filebrowser-button-width: 48px; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-FileBrowser .jp-SidePanel-content { + display: flex; + flex-direction: column; +} + +.jp-FileBrowser-toolbar.jp-Toolbar { + flex-wrap: wrap; + row-gap: 12px; + border-bottom: none; + height: auto; + margin: 8px 12px 0; + box-shadow: none; + padding: 0; + justify-content: flex-start; +} + +.jp-FileBrowser-Panel { + flex: 1 1 auto; + display: flex; + flex-direction: column; +} + +.jp-BreadCrumbs { + flex: 0 0 auto; + margin: 8px 12px; +} + +.jp-BreadCrumbs-item { + margin: 0 2px; + padding: 0 2px; + border-radius: var(--jp-border-radius); + cursor: pointer; +} + +.jp-BreadCrumbs-item:hover { + background-color: var(--jp-layout-color2); +} + +.jp-BreadCrumbs-item:first-child { + margin-left: 0; +} + +.jp-BreadCrumbs-item.jp-mod-dropTarget { + background-color: var(--jp-brand-color2); + opacity: 0.7; +} + +/*----------------------------------------------------------------------------- +| Buttons +|----------------------------------------------------------------------------*/ + +.jp-FileBrowser-toolbar > .jp-Toolbar-item { + flex: 0 0 auto; + padding-left: 0; + padding-right: 2px; + align-items: center; + height: unset; +} + +.jp-FileBrowser-toolbar > .jp-Toolbar-item .jp-ToolbarButtonComponent { + width: 40px; +} + +/*----------------------------------------------------------------------------- +| Other styles +|----------------------------------------------------------------------------*/ + +.jp-FileDialog.jp-mod-conflict input { + color: var(--jp-error-color1); +} + +.jp-FileDialog .jp-new-name-title { + margin-top: 12px; +} + +.jp-LastModified-hidden { + display: none; +} + +.jp-FileSize-hidden { + display: none; +} + +.jp-FileBrowser .lm-AccordionPanel > h3:first-child { + display: none; +} + +/*----------------------------------------------------------------------------- +| DirListing +|----------------------------------------------------------------------------*/ + +.jp-DirListing { + flex: 1 1 auto; + display: flex; + flex-direction: column; + outline: 0; +} + +.jp-DirListing-header { + flex: 0 0 auto; + display: flex; + flex-direction: row; + align-items: center; + overflow: hidden; + border-top: var(--jp-border-width) solid var(--jp-border-color2); + border-bottom: var(--jp-border-width) solid var(--jp-border-color1); + box-shadow: var(--jp-toolbar-box-shadow); + z-index: 2; +} + +.jp-DirListing-headerItem { + padding: 4px 12px 2px; + font-weight: 500; +} + +.jp-DirListing-headerItem:hover { + background: var(--jp-layout-color2); +} + +.jp-DirListing-headerItem.jp-id-name { + flex: 1 0 84px; +} + +.jp-DirListing-headerItem.jp-id-modified { + flex: 0 0 112px; + border-left: var(--jp-border-width) solid var(--jp-border-color2); + text-align: right; +} + +.jp-DirListing-headerItem.jp-id-filesize { + flex: 0 0 75px; + border-left: var(--jp-border-width) solid var(--jp-border-color2); + text-align: right; +} + +.jp-id-narrow { + display: none; + flex: 0 0 5px; + padding: 4px; + border-left: var(--jp-border-width) solid var(--jp-border-color2); + text-align: right; + color: var(--jp-border-color2); +} + +.jp-DirListing-narrow .jp-id-narrow { + display: block; +} + +.jp-DirListing-narrow .jp-id-modified, +.jp-DirListing-narrow .jp-DirListing-itemModified { + display: none; +} + +.jp-DirListing-headerItem.jp-mod-selected { + font-weight: 600; +} + +/* increase specificity to override bundled default */ +.jp-DirListing-content { + flex: 1 1 auto; + margin: 0; + padding: 0; + list-style-type: none; + overflow: auto; + background-color: var(--jp-layout-color1); +} + +.jp-DirListing-content mark { + color: var(--jp-ui-font-color0); + background-color: transparent; + font-weight: bold; +} + +.jp-DirListing-content .jp-DirListing-item.jp-mod-selected mark { + color: var(--jp-ui-inverse-font-color0); +} + +/* Style the directory listing content when a user drops a file to upload */ +.jp-DirListing.jp-mod-native-drop .jp-DirListing-content { + outline: 5px dashed rgba(128, 128, 128, 0.5); + outline-offset: -10px; + cursor: copy; +} + +.jp-DirListing-item { + display: flex; + flex-direction: row; + align-items: center; + padding: 4px 12px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.jp-DirListing-checkboxWrapper { + /* Increases hit area of checkbox. */ + padding: 4px; +} + +.jp-DirListing-header + .jp-DirListing-checkboxWrapper + + .jp-DirListing-headerItem { + padding-left: 4px; +} + +.jp-DirListing-content .jp-DirListing-checkboxWrapper { + position: relative; + left: -4px; + margin: -4px 0 -4px -8px; +} + +.jp-DirListing-checkboxWrapper.jp-mod-visible { + visibility: visible; +} + +/* For devices that support hovering, hide checkboxes until hovered, selected... +*/ +@media (hover: hover) { + .jp-DirListing-checkboxWrapper { + visibility: hidden; + } + + .jp-DirListing-item:hover .jp-DirListing-checkboxWrapper, + .jp-DirListing-item.jp-mod-selected .jp-DirListing-checkboxWrapper { + visibility: visible; + } +} + +.jp-DirListing-item[data-is-dot] { + opacity: 75%; +} + +.jp-DirListing-item.jp-mod-selected { + color: var(--jp-ui-inverse-font-color1); + background: var(--jp-brand-color1); +} + +.jp-DirListing-item.jp-mod-dropTarget { + background: var(--jp-brand-color3); +} + +.jp-DirListing-item:hover:not(.jp-mod-selected) { + background: var(--jp-layout-color2); +} + +.jp-DirListing-itemIcon { + flex: 0 0 20px; + margin-right: 4px; +} + +.jp-DirListing-itemText { + flex: 1 0 64px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + user-select: none; +} + +.jp-DirListing-itemText:focus { + outline-width: 2px; + outline-color: var(--jp-inverse-layout-color1); + outline-style: solid; + outline-offset: 1px; +} + +.jp-DirListing-item.jp-mod-selected .jp-DirListing-itemText:focus { + outline-color: var(--jp-layout-color1); +} + +.jp-DirListing-itemModified { + flex: 0 0 125px; + text-align: right; +} + +.jp-DirListing-itemFileSize { + flex: 0 0 90px; + text-align: right; +} + +.jp-DirListing-editor { + flex: 1 0 64px; + outline: none; + border: none; + color: var(--jp-ui-font-color1); + background-color: var(--jp-layout-color1); +} + +.jp-DirListing-item.jp-mod-running .jp-DirListing-itemIcon::before { + color: var(--jp-success-color1); + content: '\25CF'; + font-size: 8px; + position: absolute; + left: -8px; +} + +.jp-DirListing-item.jp-mod-running.jp-mod-selected + .jp-DirListing-itemIcon::before { + color: var(--jp-ui-inverse-font-color1); +} + +.jp-DirListing-item.lm-mod-drag-image, +.jp-DirListing-item.jp-mod-selected.lm-mod-drag-image { + font-size: var(--jp-ui-font-size1); + padding-left: 4px; + margin-left: 4px; + width: 160px; + background-color: var(--jp-ui-inverse-font-color2); + box-shadow: var(--jp-elevation-z2); + border-radius: 0; + color: var(--jp-ui-font-color1); + transform: translateX(-40%) translateY(-58%); +} + +.jp-Document { + min-width: 120px; + min-height: 120px; + outline: none; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Main OutputArea +| OutputArea has a list of Outputs +|----------------------------------------------------------------------------*/ + +.jp-OutputArea { + overflow-y: auto; +} + +.jp-OutputArea-child { + display: table; + table-layout: fixed; + width: 100%; + overflow: hidden; +} + +.jp-OutputPrompt { + width: var(--jp-cell-prompt-width); + color: var(--jp-cell-outprompt-font-color); + font-family: var(--jp-cell-prompt-font-family); + padding: var(--jp-code-padding); + letter-spacing: var(--jp-cell-prompt-letter-spacing); + line-height: var(--jp-code-line-height); + font-size: var(--jp-code-font-size); + border: var(--jp-border-width) solid transparent; + opacity: var(--jp-cell-prompt-opacity); + + /* Right align prompt text, don't wrap to handle large prompt numbers */ + text-align: right; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + + /* Disable text selection */ + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.jp-OutputArea-prompt { + display: table-cell; + vertical-align: top; +} + +.jp-OutputArea-output { + display: table-cell; + width: 100%; + height: auto; + overflow: auto; + user-select: text; + -moz-user-select: text; + -webkit-user-select: text; + -ms-user-select: text; +} + +.jp-OutputArea .jp-RenderedText { + padding-left: 1ch; +} + +/** + * Prompt overlay. + */ + +.jp-OutputArea-promptOverlay { + position: absolute; + top: 0; + width: var(--jp-cell-prompt-width); + height: 100%; + opacity: 0.5; +} + +.jp-OutputArea-promptOverlay:hover { + background: var(--jp-layout-color2); + box-shadow: inset 0 0 1px var(--jp-inverse-layout-color0); + cursor: zoom-out; +} + +.jp-mod-outputsScrolled .jp-OutputArea-promptOverlay:hover { + cursor: zoom-in; +} + +/** + * Isolated output. + */ +.jp-OutputArea-output.jp-mod-isolated { + width: 100%; + display: block; +} + +/* +When drag events occur, `lm-mod-override-cursor` is added to the body. +Because iframes steal all cursor events, the following two rules are necessary +to suppress pointer events while resize drags are occurring. There may be a +better solution to this problem. +*/ +body.lm-mod-override-cursor .jp-OutputArea-output.jp-mod-isolated { + position: relative; +} + +body.lm-mod-override-cursor .jp-OutputArea-output.jp-mod-isolated::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: transparent; +} + +/* pre */ + +.jp-OutputArea-output pre { + border: none; + margin: 0; + padding: 0; + overflow-x: auto; + overflow-y: auto; + word-break: break-all; + word-wrap: break-word; + white-space: pre-wrap; +} + +/* tables */ + +.jp-OutputArea-output.jp-RenderedHTMLCommon table { + margin-left: 0; + margin-right: 0; +} + +/* description lists */ + +.jp-OutputArea-output dl, +.jp-OutputArea-output dt, +.jp-OutputArea-output dd { + display: block; +} + +.jp-OutputArea-output dl { + width: 100%; + overflow: hidden; + padding: 0; + margin: 0; +} + +.jp-OutputArea-output dt { + font-weight: bold; + float: left; + width: 20%; + padding: 0; + margin: 0; +} + +.jp-OutputArea-output dd { + float: left; + width: 80%; + padding: 0; + margin: 0; +} + +.jp-TrimmedOutputs pre { + background: var(--jp-layout-color3); + font-size: calc(var(--jp-code-font-size) * 1.4); + text-align: center; + text-transform: uppercase; +} + +/* Hide the gutter in case of + * - nested output areas (e.g. in the case of output widgets) + * - mirrored output areas + */ +.jp-OutputArea .jp-OutputArea .jp-OutputArea-prompt { + display: none; +} + +/* Hide empty lines in the output area, for instance due to cleared widgets */ +.jp-OutputArea-prompt:empty { + padding: 0; + border: 0; +} + +/*----------------------------------------------------------------------------- +| executeResult is added to any Output-result for the display of the object +| returned by a cell +|----------------------------------------------------------------------------*/ + +.jp-OutputArea-output.jp-OutputArea-executeResult { + margin-left: 0; + width: 100%; +} + +/* Text output with the Out[] prompt needs a top padding to match the + * alignment of the Out[] prompt itself. + */ +.jp-OutputArea-executeResult .jp-RenderedText.jp-OutputArea-output { + padding-top: var(--jp-code-padding); + border-top: var(--jp-border-width) solid transparent; +} + +/*----------------------------------------------------------------------------- +| The Stdin output +|----------------------------------------------------------------------------*/ + +.jp-Stdin-prompt { + color: var(--jp-content-font-color0); + padding-right: var(--jp-code-padding); + vertical-align: baseline; + flex: 0 0 auto; +} + +.jp-Stdin-input { + font-family: var(--jp-code-font-family); + font-size: inherit; + color: inherit; + background-color: inherit; + width: 42%; + min-width: 200px; + + /* make sure input baseline aligns with prompt */ + vertical-align: baseline; + + /* padding + margin = 0.5em between prompt and cursor */ + padding: 0 0.25em; + margin: 0 0.25em; + flex: 0 0 70%; +} + +.jp-Stdin-input::placeholder { + opacity: 0; +} + +.jp-Stdin-input:focus { + box-shadow: none; +} + +.jp-Stdin-input:focus::placeholder { + opacity: 1; +} + +/*----------------------------------------------------------------------------- +| Output Area View +|----------------------------------------------------------------------------*/ + +.jp-LinkedOutputView .jp-OutputArea { + height: 100%; + display: block; +} + +.jp-LinkedOutputView .jp-OutputArea-output:only-child { + height: 100%; +} + +/*----------------------------------------------------------------------------- +| Printing +|----------------------------------------------------------------------------*/ + +@media print { + .jp-OutputArea-child { + break-inside: avoid-page; + } +} + +/*----------------------------------------------------------------------------- +| Mobile +|----------------------------------------------------------------------------*/ +@media only screen and (max-width: 760px) { + .jp-OutputPrompt { + display: table-row; + text-align: left; + } + + .jp-OutputArea-child .jp-OutputArea-output { + display: table-row; + margin-left: var(--jp-notebook-padding); + } +} + +/* Trimmed outputs warning */ +.jp-TrimmedOutputs > a { + margin: 10px; + text-decoration: none; + cursor: pointer; +} + +.jp-TrimmedOutputs > a:hover { + text-decoration: none; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Table of Contents +|----------------------------------------------------------------------------*/ + +:root { + --jp-private-toc-active-width: 4px; +} + +.jp-TableOfContents { + display: flex; + flex-direction: column; + background: var(--jp-layout-color1); + color: var(--jp-ui-font-color1); + font-size: var(--jp-ui-font-size1); + height: 100%; +} + +.jp-TableOfContents-placeholder { + text-align: center; +} + +.jp-TableOfContents-placeholderContent { + color: var(--jp-content-font-color2); + padding: 8px; +} + +.jp-TableOfContents-placeholderContent > h3 { + margin-bottom: var(--jp-content-heading-margin-bottom); +} + +.jp-TableOfContents .jp-SidePanel-content { + overflow-y: auto; +} + +.jp-TableOfContents-tree { + margin: 4px; +} + +.jp-TableOfContents ol { + list-style-type: none; +} + +/* stylelint-disable-next-line selector-max-type */ +.jp-TableOfContents li > ol { + /* Align left border with triangle icon center */ + padding-left: 11px; +} + +.jp-TableOfContents-content { + /* left margin for the active heading indicator */ + margin: 0 0 0 var(--jp-private-toc-active-width); + padding: 0; + background-color: var(--jp-layout-color1); +} + +.jp-tocItem { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.jp-tocItem-heading { + display: flex; + cursor: pointer; +} + +.jp-tocItem-heading:hover { + background-color: var(--jp-layout-color2); +} + +.jp-tocItem-content { + display: block; + padding: 4px 0; + white-space: nowrap; + text-overflow: ellipsis; + overflow-x: hidden; +} + +.jp-tocItem-collapser { + height: 20px; + margin: 2px 2px 0; + padding: 0; + background: none; + border: none; + cursor: pointer; +} + +.jp-tocItem-collapser:hover { + background-color: var(--jp-layout-color3); +} + +/* Active heading indicator */ + +.jp-tocItem-heading::before { + content: ' '; + background: transparent; + width: var(--jp-private-toc-active-width); + height: 24px; + position: absolute; + left: 0; + border-radius: var(--jp-border-radius); +} + +.jp-tocItem-heading.jp-tocItem-active::before { + background-color: var(--jp-brand-color1); +} + +.jp-tocItem-heading:hover.jp-tocItem-active::before { + background: var(--jp-brand-color0); + opacity: 1; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +.jp-Collapser { + flex: 0 0 var(--jp-cell-collapser-width); + padding: 0; + margin: 0; + border: none; + outline: none; + background: transparent; + border-radius: var(--jp-border-radius); + opacity: 1; +} + +.jp-Collapser-child { + display: block; + width: 100%; + box-sizing: border-box; + + /* height: 100% doesn't work because the height of its parent is computed from content */ + position: absolute; + top: 0; + bottom: 0; +} + +/*----------------------------------------------------------------------------- +| Printing +|----------------------------------------------------------------------------*/ + +/* +Hiding collapsers in print mode. + +Note: input and output wrappers have "display: block" propery in print mode. +*/ + +@media print { + .jp-Collapser { + display: none; + } +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Header/Footer +|----------------------------------------------------------------------------*/ + +/* Hidden by zero height by default */ +.jp-CellHeader, +.jp-CellFooter { + height: 0; + width: 100%; + padding: 0; + margin: 0; + border: none; + outline: none; + background: transparent; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Input +|----------------------------------------------------------------------------*/ + +/* All input areas */ +.jp-InputArea { + display: table; + table-layout: fixed; + width: 100%; + overflow: hidden; +} + +.jp-InputArea-editor { + display: table-cell; + overflow: hidden; + vertical-align: top; + + /* This is the non-active, default styling */ + border: var(--jp-border-width) solid var(--jp-cell-editor-border-color); + border-radius: 0; + background: var(--jp-cell-editor-background); +} + +.jp-InputPrompt { + display: table-cell; + vertical-align: top; + width: var(--jp-cell-prompt-width); + color: var(--jp-cell-inprompt-font-color); + font-family: var(--jp-cell-prompt-font-family); + padding: var(--jp-code-padding); + letter-spacing: var(--jp-cell-prompt-letter-spacing); + opacity: var(--jp-cell-prompt-opacity); + line-height: var(--jp-code-line-height); + font-size: var(--jp-code-font-size); + border: var(--jp-border-width) solid transparent; + + /* Right align prompt text, don't wrap to handle large prompt numbers */ + text-align: right; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + + /* Disable text selection */ + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/*----------------------------------------------------------------------------- +| Mobile +|----------------------------------------------------------------------------*/ +@media only screen and (max-width: 760px) { + .jp-InputArea-editor { + display: table-row; + margin-left: var(--jp-notebook-padding); + } + + .jp-InputPrompt { + display: table-row; + text-align: left; + } +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Placeholder +|----------------------------------------------------------------------------*/ + +.jp-Placeholder { + display: table; + table-layout: fixed; + width: 100%; +} + +.jp-Placeholder-prompt { + display: table-cell; + box-sizing: border-box; +} + +.jp-Placeholder-content { + display: table-cell; + padding: 4px 6px; + border: 1px solid transparent; + border-radius: 0; + background: none; + box-sizing: border-box; + cursor: pointer; +} + +.jp-Placeholder-contentContainer { + display: flex; +} + +.jp-Placeholder-content:hover, +.jp-InputPlaceholder > .jp-Placeholder-content:hover { + border-color: var(--jp-layout-color3); +} + +.jp-Placeholder-content .jp-MoreHorizIcon { + width: 32px; + height: 16px; + border: 1px solid transparent; + border-radius: var(--jp-border-radius); +} + +.jp-Placeholder-content .jp-MoreHorizIcon:hover { + border: 1px solid var(--jp-border-color1); + box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.25); + background-color: var(--jp-layout-color0); +} + +.jp-PlaceholderText { + white-space: nowrap; + overflow-x: hidden; + color: var(--jp-inverse-layout-color3); + font-family: var(--jp-code-font-family); +} + +.jp-InputPlaceholder > .jp-Placeholder-content { + border-color: var(--jp-cell-editor-border-color); + background: var(--jp-cell-editor-background); +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Private CSS variables +|----------------------------------------------------------------------------*/ + +:root { + --jp-private-cell-scrolling-output-offset: 5px; +} + +/*----------------------------------------------------------------------------- +| Cell +|----------------------------------------------------------------------------*/ + +.jp-Cell { + padding: var(--jp-cell-padding); + margin: 0; + border: none; + outline: none; + background: transparent; +} + +/*----------------------------------------------------------------------------- +| Common input/output +|----------------------------------------------------------------------------*/ + +.jp-Cell-inputWrapper, +.jp-Cell-outputWrapper { + display: flex; + flex-direction: row; + padding: 0; + margin: 0; + + /* Added to reveal the box-shadow on the input and output collapsers. */ + overflow: visible; +} + +/* Only input/output areas inside cells */ +.jp-Cell-inputArea, +.jp-Cell-outputArea { + flex: 1 1 auto; +} + +/*----------------------------------------------------------------------------- +| Collapser +|----------------------------------------------------------------------------*/ + +/* Make the output collapser disappear when there is not output, but do so + * in a manner that leaves it in the layout and preserves its width. + */ +.jp-Cell.jp-mod-noOutputs .jp-Cell-outputCollapser { + border: none !important; + background: transparent !important; +} + +.jp-Cell:not(.jp-mod-noOutputs) .jp-Cell-outputCollapser { + min-height: var(--jp-cell-collapser-min-height); +} + +/*----------------------------------------------------------------------------- +| Output +|----------------------------------------------------------------------------*/ + +/* Put a space between input and output when there IS output */ +.jp-Cell:not(.jp-mod-noOutputs) .jp-Cell-outputWrapper { + margin-top: 5px; +} + +.jp-CodeCell.jp-mod-outputsScrolled .jp-Cell-outputArea { + overflow-y: auto; + max-height: 24em; + margin-left: var(--jp-private-cell-scrolling-output-offset); + resize: vertical; +} + +.jp-CodeCell.jp-mod-outputsScrolled .jp-Cell-outputArea[style*='height'] { + max-height: unset; +} + +.jp-CodeCell.jp-mod-outputsScrolled .jp-Cell-outputArea::after { + content: ' '; + box-shadow: inset 0 0 6px 2px rgb(0 0 0 / 30%); + width: 100%; + height: 100%; + position: sticky; + bottom: 0; + top: 0; + margin-top: -50%; + float: left; + display: block; + pointer-events: none; +} + +.jp-CodeCell.jp-mod-outputsScrolled .jp-OutputArea-child { + padding-top: 6px; +} + +.jp-CodeCell.jp-mod-outputsScrolled .jp-OutputArea-prompt { + width: calc( + var(--jp-cell-prompt-width) - var(--jp-private-cell-scrolling-output-offset) + ); +} + +.jp-CodeCell.jp-mod-outputsScrolled .jp-OutputArea-promptOverlay { + left: calc(-1 * var(--jp-private-cell-scrolling-output-offset)); +} + +/*----------------------------------------------------------------------------- +| CodeCell +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| MarkdownCell +|----------------------------------------------------------------------------*/ + +.jp-MarkdownOutput { + display: table-cell; + width: 100%; + margin-top: 0; + margin-bottom: 0; + padding-left: var(--jp-code-padding); +} + +.jp-MarkdownOutput.jp-RenderedHTMLCommon { + overflow: auto; +} + +/* collapseHeadingButton (show always if hiddenCellsButton is _not_ shown) */ +.jp-collapseHeadingButton { + display: flex; + min-height: var(--jp-cell-collapser-min-height); + font-size: var(--jp-code-font-size); + position: absolute; + background-color: transparent; + background-size: 25px; + background-repeat: no-repeat; + background-position-x: center; + background-position-y: top; + background-image: var(--jp-icon-caret-down); + right: 0; + top: 0; + bottom: 0; +} + +.jp-collapseHeadingButton.jp-mod-collapsed { + background-image: var(--jp-icon-caret-right); +} + +/* + set the container font size to match that of content + so that the nested collapse buttons have the right size +*/ +.jp-MarkdownCell .jp-InputPrompt { + font-size: var(--jp-content-font-size1); +} + +/* + Align collapseHeadingButton with cell top header + The font sizes are identical to the ones in packages/rendermime/style/base.css +*/ +.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='1'] { + font-size: var(--jp-content-font-size5); + background-position-y: calc(0.3 * var(--jp-content-font-size5)); +} + +.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='2'] { + font-size: var(--jp-content-font-size4); + background-position-y: calc(0.3 * var(--jp-content-font-size4)); +} + +.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='3'] { + font-size: var(--jp-content-font-size3); + background-position-y: calc(0.3 * var(--jp-content-font-size3)); +} + +.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='4'] { + font-size: var(--jp-content-font-size2); + background-position-y: calc(0.3 * var(--jp-content-font-size2)); +} + +.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='5'] { + font-size: var(--jp-content-font-size1); + background-position-y: top; +} + +.jp-mod-rendered .jp-collapseHeadingButton[data-heading-level='6'] { + font-size: var(--jp-content-font-size0); + background-position-y: top; +} + +/* collapseHeadingButton (show only on (hover,active) if hiddenCellsButton is shown) */ +.jp-Notebook.jp-mod-showHiddenCellsButton .jp-collapseHeadingButton { + display: none; +} + +.jp-Notebook.jp-mod-showHiddenCellsButton + :is(.jp-MarkdownCell:hover, .jp-mod-active) + .jp-collapseHeadingButton { + display: flex; +} + +/* showHiddenCellsButton (only show if jp-mod-showHiddenCellsButton is set, which +is a consequence of the showHiddenCellsButton option in Notebook Settings)*/ +.jp-Notebook.jp-mod-showHiddenCellsButton .jp-showHiddenCellsButton { + margin-left: calc(var(--jp-cell-prompt-width) + 2 * var(--jp-code-padding)); + margin-top: var(--jp-code-padding); + border: 1px solid var(--jp-border-color2); + background-color: var(--jp-border-color3) !important; + color: var(--jp-content-font-color0) !important; + display: flex; +} + +.jp-Notebook.jp-mod-showHiddenCellsButton .jp-showHiddenCellsButton:hover { + background-color: var(--jp-border-color2) !important; +} + +.jp-showHiddenCellsButton { + display: none; +} + +/*----------------------------------------------------------------------------- +| Printing +|----------------------------------------------------------------------------*/ + +/* +Using block instead of flex to allow the use of the break-inside CSS property for +cell outputs. +*/ + +@media print { + .jp-Cell-inputWrapper, + .jp-Cell-outputWrapper { + display: block; + } +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Variables +|----------------------------------------------------------------------------*/ + +:root { + --jp-notebook-toolbar-padding: 2px 5px 2px 2px; +} + +/*----------------------------------------------------------------------------- + +/*----------------------------------------------------------------------------- +| Styles +|----------------------------------------------------------------------------*/ + +.jp-NotebookPanel-toolbar { + padding: var(--jp-notebook-toolbar-padding); + + /* disable paint containment from lumino 2.0 default strict CSS containment */ + contain: style size !important; +} + +.jp-Toolbar-item.jp-Notebook-toolbarCellType .jp-select-wrapper.jp-mod-focused { + border: none; + box-shadow: none; +} + +.jp-Notebook-toolbarCellTypeDropdown select { + height: 24px; + font-size: var(--jp-ui-font-size1); + line-height: 14px; + border-radius: 0; + display: block; +} + +.jp-Notebook-toolbarCellTypeDropdown span { + top: 5px !important; +} + +.jp-Toolbar-responsive-popup { + position: absolute; + height: fit-content; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-end; + border-bottom: var(--jp-border-width) solid var(--jp-toolbar-border-color); + box-shadow: var(--jp-toolbar-box-shadow); + background: var(--jp-toolbar-background); + min-height: var(--jp-toolbar-micro-height); + padding: var(--jp-notebook-toolbar-padding); + z-index: 1; + right: 0; + top: 0; +} + +.jp-Toolbar > .jp-Toolbar-responsive-opener { + margin-left: auto; +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Variables +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- + +/*----------------------------------------------------------------------------- +| Styles +|----------------------------------------------------------------------------*/ + +.jp-Notebook-ExecutionIndicator { + position: relative; + display: inline-block; + height: 100%; + z-index: 9997; +} + +.jp-Notebook-ExecutionIndicator-tooltip { + visibility: hidden; + height: auto; + width: max-content; + width: -moz-max-content; + background-color: var(--jp-layout-color2); + color: var(--jp-ui-font-color1); + text-align: justify; + border-radius: 6px; + padding: 0 5px; + position: fixed; + display: table; +} + +.jp-Notebook-ExecutionIndicator-tooltip.up { + transform: translateX(-50%) translateY(-100%) translateY(-32px); +} + +.jp-Notebook-ExecutionIndicator-tooltip.down { + transform: translateX(calc(-100% + 16px)) translateY(5px); +} + +.jp-Notebook-ExecutionIndicator-tooltip.hidden { + display: none; +} + +.jp-Notebook-ExecutionIndicator:hover .jp-Notebook-ExecutionIndicator-tooltip { + visibility: visible; +} + +.jp-Notebook-ExecutionIndicator span { + font-size: var(--jp-ui-font-size1); + font-family: var(--jp-ui-font-family); + color: var(--jp-ui-font-color1); + line-height: 24px; + display: block; +} + +.jp-Notebook-ExecutionIndicator-progress-bar { + display: flex; + justify-content: center; + height: 100%; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +/* + * Execution indicator + */ +.jp-tocItem-content::after { + content: ''; + + /* Must be identical to form a circle */ + width: 12px; + height: 12px; + background: none; + border: none; + position: absolute; + right: 0; +} + +.jp-tocItem-content[data-running='0']::after { + border-radius: 50%; + border: var(--jp-border-width) solid var(--jp-inverse-layout-color3); + background: none; +} + +.jp-tocItem-content[data-running='1']::after { + border-radius: 50%; + border: var(--jp-border-width) solid var(--jp-inverse-layout-color3); + background-color: var(--jp-inverse-layout-color3); +} + +.jp-tocItem-content[data-running='0'], +.jp-tocItem-content[data-running='1'] { + margin-right: 12px; +} + +/* + * Copyright (c) Jupyter Development Team. + * Distributed under the terms of the Modified BSD License. + */ + +.jp-Notebook-footer { + height: 27px; + margin-left: calc( + var(--jp-cell-prompt-width) + var(--jp-cell-collapser-width) + + var(--jp-cell-padding) + ); + width: calc( + 100% - + ( + var(--jp-cell-prompt-width) + var(--jp-cell-collapser-width) + + var(--jp-cell-padding) + var(--jp-cell-padding) + ) + ); + border: var(--jp-border-width) solid var(--jp-cell-editor-border-color); + color: var(--jp-ui-font-color3); + margin-top: 6px; + background: none; + cursor: pointer; +} + +.jp-Notebook-footer:focus { + border-color: var(--jp-cell-editor-active-border-color); +} + +/* For devices that support hovering, hide footer until hover */ +@media (hover: hover) { + .jp-Notebook-footer { + opacity: 0; + } + + .jp-Notebook-footer:focus, + .jp-Notebook-footer:hover { + opacity: 1; + } +} + +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| Imports +|----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- +| CSS variables +|----------------------------------------------------------------------------*/ + +:root { + --jp-side-by-side-output-size: 1fr; + --jp-side-by-side-resized-cell: var(--jp-side-by-side-output-size); + --jp-private-notebook-dragImage-width: 304px; + --jp-private-notebook-dragImage-height: 36px; + --jp-private-notebook-selected-color: var(--md-blue-400); + --jp-private-notebook-active-color: var(--md-green-400); +} + +/*----------------------------------------------------------------------------- +| Notebook +|----------------------------------------------------------------------------*/ + +/* stylelint-disable selector-max-class */ + +.jp-NotebookPanel { + display: block; + height: 100%; +} + +.jp-NotebookPanel.jp-Document { + min-width: 240px; + min-height: 120px; +} + +.jp-Notebook { + padding: var(--jp-notebook-padding); + outline: none; + overflow: auto; + background: var(--jp-layout-color0); +} + +.jp-Notebook.jp-mod-scrollPastEnd::after { + display: block; + content: ''; + min-height: var(--jp-notebook-scroll-padding); +} + +.jp-MainAreaWidget-ContainStrict .jp-Notebook * { + contain: strict; +} + +.jp-Notebook .jp-Cell { + overflow: visible; +} + +.jp-Notebook .jp-Cell .jp-InputPrompt { + cursor: move; +} + +/*----------------------------------------------------------------------------- +| Notebook state related styling +| +| The notebook and cells each have states, here are the possibilities: +| +| - Notebook +| - Command +| - Edit +| - Cell +| - None +| - Active (only one can be active) +| - Selected (the cells actions are applied to) +| - Multiselected (when multiple selected, the cursor) +| - No outputs +|----------------------------------------------------------------------------*/ + +/* Command or edit modes */ + +.jp-Notebook .jp-Cell:not(.jp-mod-active) .jp-InputPrompt { + opacity: var(--jp-cell-prompt-not-active-opacity); + color: var(--jp-cell-prompt-not-active-font-color); +} + +.jp-Notebook .jp-Cell:not(.jp-mod-active) .jp-OutputPrompt { + opacity: var(--jp-cell-prompt-not-active-opacity); + color: var(--jp-cell-prompt-not-active-font-color); +} + +/* cell is active */ +.jp-Notebook .jp-Cell.jp-mod-active .jp-Collapser { + background: var(--jp-brand-color1); +} + +/* cell is dirty */ +.jp-Notebook .jp-Cell.jp-mod-dirty .jp-InputPrompt { + color: var(--jp-warn-color1); +} + +.jp-Notebook .jp-Cell.jp-mod-dirty .jp-InputPrompt::before { + color: var(--jp-warn-color1); + content: '•'; +} + +.jp-Notebook .jp-Cell.jp-mod-active.jp-mod-dirty .jp-Collapser { + background: var(--jp-warn-color1); +} + +/* collapser is hovered */ +.jp-Notebook .jp-Cell .jp-Collapser:hover { + box-shadow: var(--jp-elevation-z2); + background: var(--jp-brand-color1); + opacity: var(--jp-cell-collapser-not-active-hover-opacity); +} + +/* cell is active and collapser is hovered */ +.jp-Notebook .jp-Cell.jp-mod-active .jp-Collapser:hover { + background: var(--jp-brand-color0); + opacity: 1; +} + +/* Command mode */ + +.jp-Notebook.jp-mod-commandMode .jp-Cell.jp-mod-selected { + background: var(--jp-notebook-multiselected-color); +} + +.jp-Notebook.jp-mod-commandMode + .jp-Cell.jp-mod-active.jp-mod-selected:not(.jp-mod-multiSelected) { + background: transparent; +} + +/* Edit mode */ + +.jp-Notebook.jp-mod-editMode .jp-Cell.jp-mod-active .jp-InputArea-editor { + border: var(--jp-border-width) solid var(--jp-cell-editor-active-border-color); + box-shadow: var(--jp-input-box-shadow); + background-color: var(--jp-cell-editor-active-background); +} + +/*----------------------------------------------------------------------------- +| Notebook drag and drop +|----------------------------------------------------------------------------*/ + +.jp-Notebook-cell.jp-mod-dropSource { + opacity: 0.5; +} + +.jp-Notebook-cell.jp-mod-dropTarget, +.jp-Notebook.jp-mod-commandMode + .jp-Notebook-cell.jp-mod-active.jp-mod-selected.jp-mod-dropTarget { + border-top-color: var(--jp-private-notebook-selected-color); + border-top-style: solid; + border-top-width: 2px; +} + +.jp-dragImage { + display: block; + flex-direction: row; + width: var(--jp-private-notebook-dragImage-width); + height: var(--jp-private-notebook-dragImage-height); + border: var(--jp-border-width) solid var(--jp-cell-editor-border-color); + background: var(--jp-cell-editor-background); + overflow: visible; +} + +.jp-dragImage-singlePrompt { + box-shadow: 2px 2px 4px 0 rgba(0, 0, 0, 0.12); +} + +.jp-dragImage .jp-dragImage-content { + flex: 1 1 auto; + z-index: 2; + font-size: var(--jp-code-font-size); + font-family: var(--jp-code-font-family); + line-height: var(--jp-code-line-height); + padding: var(--jp-code-padding); + border: var(--jp-border-width) solid var(--jp-cell-editor-border-color); + background: var(--jp-cell-editor-background-color); + color: var(--jp-content-font-color3); + text-align: left; + margin: 4px 4px 4px 0; +} + +.jp-dragImage .jp-dragImage-prompt { + flex: 0 0 auto; + min-width: 36px; + color: var(--jp-cell-inprompt-font-color); + padding: var(--jp-code-padding); + padding-left: 12px; + font-family: var(--jp-cell-prompt-font-family); + letter-spacing: var(--jp-cell-prompt-letter-spacing); + line-height: 1.9; + font-size: var(--jp-code-font-size); + border: var(--jp-border-width) solid transparent; +} + +.jp-dragImage-multipleBack { + z-index: -1; + position: absolute; + height: 32px; + width: 300px; + top: 8px; + left: 8px; + background: var(--jp-layout-color2); + border: var(--jp-border-width) solid var(--jp-input-border-color); + box-shadow: 2px 2px 4px 0 rgba(0, 0, 0, 0.12); +} + +/*----------------------------------------------------------------------------- +| Cell toolbar +|----------------------------------------------------------------------------*/ + +.jp-NotebookTools { + display: block; + min-width: var(--jp-sidebar-min-width); + color: var(--jp-ui-font-color1); + background: var(--jp-layout-color1); + + /* This is needed so that all font sizing of children done in ems is + * relative to this base size */ + font-size: var(--jp-ui-font-size1); + overflow: auto; +} + +.jp-ActiveCellTool { + padding: 12px 0; + display: flex; +} + +.jp-ActiveCellTool-Content { + flex: 1 1 auto; +} + +.jp-ActiveCellTool .jp-ActiveCellTool-CellContent { + background: var(--jp-cell-editor-background); + border: var(--jp-border-width) solid var(--jp-cell-editor-border-color); + border-radius: 0; + min-height: 29px; +} + +.jp-ActiveCellTool .jp-InputPrompt { + min-width: calc(var(--jp-cell-prompt-width) * 0.75); +} + +.jp-ActiveCellTool-CellContent > pre { + padding: 5px 4px; + margin: 0; + white-space: normal; +} + +.jp-MetadataEditorTool { + flex-direction: column; + padding: 12px 0; +} + +.jp-RankedPanel > :not(:first-child) { + margin-top: 12px; +} + +.jp-KeySelector select.jp-mod-styled { + font-size: var(--jp-ui-font-size1); + color: var(--jp-ui-font-color0); + border: var(--jp-border-width) solid var(--jp-border-color1); +} + +.jp-KeySelector label, +.jp-MetadataEditorTool label, +.jp-NumberSetter label { + line-height: 1.4; +} + +.jp-NotebookTools .jp-select-wrapper { + margin-top: 4px; + margin-bottom: 0; +} + +.jp-NumberSetter input { + width: 100%; + margin-top: 4px; +} + +.jp-NotebookTools .jp-Collapse { + margin-top: 16px; +} + +/*----------------------------------------------------------------------------- +| Presentation Mode (.jp-mod-presentationMode) +|----------------------------------------------------------------------------*/ + +.jp-mod-presentationMode .jp-Notebook { + --jp-content-font-size1: var(--jp-content-presentation-font-size1); + --jp-code-font-size: var(--jp-code-presentation-font-size); +} + +.jp-mod-presentationMode .jp-Notebook .jp-Cell .jp-InputPrompt, +.jp-mod-presentationMode .jp-Notebook .jp-Cell .jp-OutputPrompt { + flex: 0 0 110px; +} + +/*----------------------------------------------------------------------------- +| Side-by-side Mode (.jp-mod-sideBySide) +|----------------------------------------------------------------------------*/ +.jp-mod-sideBySide.jp-Notebook .jp-Notebook-cell { + margin-top: 3em; + margin-bottom: 3em; + margin-left: 5%; + margin-right: 5%; +} + +.jp-mod-sideBySide.jp-Notebook .jp-CodeCell { + display: grid; + grid-template-columns: minmax(0, 1fr) min-content minmax( + 0, + var(--jp-side-by-side-output-size) + ); + grid-template-rows: auto minmax(0, 1fr) auto; + grid-template-areas: + 'header header header' + 'input handle output' + 'footer footer footer'; +} + +.jp-mod-sideBySide.jp-Notebook .jp-CodeCell.jp-mod-resizedCell { + grid-template-columns: minmax(0, 1fr) min-content minmax( + 0, + var(--jp-side-by-side-resized-cell) + ); +} + +.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-CellHeader { + grid-area: header; +} + +.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-Cell-inputWrapper { + grid-area: input; +} + +.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-Cell-outputWrapper { + /* overwrite the default margin (no vertical separation needed in side by side move */ + margin-top: 0; + grid-area: output; +} + +.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-CellFooter { + grid-area: footer; +} + +.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-CellResizeHandle { + grid-area: handle; + user-select: none; + display: block; + height: 100%; + cursor: ew-resize; + padding: 0 var(--jp-cell-padding); +} + +.jp-mod-sideBySide.jp-Notebook .jp-CodeCell .jp-CellResizeHandle::after { + content: ''; + display: block; + background: var(--jp-border-color2); + height: 100%; + width: 5px; +} + +.jp-mod-sideBySide.jp-Notebook + .jp-CodeCell.jp-mod-resizedCell + .jp-CellResizeHandle::after { + background: var(--jp-border-color0); +} + +.jp-CellResizeHandle { + display: none; +} + +/*----------------------------------------------------------------------------- +| Placeholder +|----------------------------------------------------------------------------*/ + +.jp-Cell-Placeholder { + padding-left: 55px; +} + +.jp-Cell-Placeholder-wrapper { + background: #fff; + border: 1px solid; + border-color: #e5e6e9 #dfe0e4 #d0d1d5; + border-radius: 4px; + -webkit-border-radius: 4px; + margin: 10px 15px; +} + +.jp-Cell-Placeholder-wrapper-inner { + padding: 15px; + position: relative; +} + +.jp-Cell-Placeholder-wrapper-body { + background-repeat: repeat; + background-size: 50% auto; +} + +.jp-Cell-Placeholder-wrapper-body div { + background: #f6f7f8; + background-image: -webkit-linear-gradient( + left, + #f6f7f8 0%, + #edeef1 20%, + #f6f7f8 40%, + #f6f7f8 100% + ); + background-repeat: no-repeat; + background-size: 800px 104px; + height: 104px; + position: absolute; + right: 15px; + left: 15px; + top: 15px; +} + +div.jp-Cell-Placeholder-h1 { + top: 20px; + height: 20px; + left: 15px; + width: 150px; +} + +div.jp-Cell-Placeholder-h2 { + left: 15px; + top: 50px; + height: 10px; + width: 100px; +} + +div.jp-Cell-Placeholder-content-1, +div.jp-Cell-Placeholder-content-2, +div.jp-Cell-Placeholder-content-3 { + left: 15px; + right: 15px; + height: 10px; +} + +div.jp-Cell-Placeholder-content-1 { + top: 100px; +} + +div.jp-Cell-Placeholder-content-2 { + top: 120px; +} + +div.jp-Cell-Placeholder-content-3 { + top: 140px; +} + +</style> +<style type="text/css"> +/*----------------------------------------------------------------------------- +| Copyright (c) Jupyter Development Team. +| Distributed under the terms of the Modified BSD License. +|----------------------------------------------------------------------------*/ + +/* +The following CSS variables define the main, public API for styling JupyterLab. +These variables should be used by all plugins wherever possible. In other +words, plugins should not define custom colors, sizes, etc unless absolutely +necessary. This enables users to change the visual theme of JupyterLab +by changing these variables. + +Many variables appear in an ordered sequence (0,1,2,3). These sequences +are designed to work well together, so for example, `--jp-border-color1` should +be used with `--jp-layout-color1`. The numbers have the following meanings: + +* 0: super-primary, reserved for special emphasis +* 1: primary, most important under normal situations +* 2: secondary, next most important under normal situations +* 3: tertiary, next most important under normal situations + +Throughout JupyterLab, we are mostly following principles from Google's +Material Design when selecting colors. We are not, however, following +all of MD as it is not optimized for dense, information rich UIs. +*/ + +:root { + /* Elevation + * + * We style box-shadows using Material Design's idea of elevation. These particular numbers are taken from here: + * + * https://github.com/material-components/material-components-web + * https://material-components-web.appspot.com/elevation.html + */ + + --jp-shadow-base-lightness: 0; + --jp-shadow-umbra-color: rgba( + var(--jp-shadow-base-lightness), + var(--jp-shadow-base-lightness), + var(--jp-shadow-base-lightness), + 0.2 + ); + --jp-shadow-penumbra-color: rgba( + var(--jp-shadow-base-lightness), + var(--jp-shadow-base-lightness), + var(--jp-shadow-base-lightness), + 0.14 + ); + --jp-shadow-ambient-color: rgba( + var(--jp-shadow-base-lightness), + var(--jp-shadow-base-lightness), + var(--jp-shadow-base-lightness), + 0.12 + ); + --jp-elevation-z0: none; + --jp-elevation-z1: 0 2px 1px -1px var(--jp-shadow-umbra-color), + 0 1px 1px 0 var(--jp-shadow-penumbra-color), + 0 1px 3px 0 var(--jp-shadow-ambient-color); + --jp-elevation-z2: 0 3px 1px -2px var(--jp-shadow-umbra-color), + 0 2px 2px 0 var(--jp-shadow-penumbra-color), + 0 1px 5px 0 var(--jp-shadow-ambient-color); + --jp-elevation-z4: 0 2px 4px -1px var(--jp-shadow-umbra-color), + 0 4px 5px 0 var(--jp-shadow-penumbra-color), + 0 1px 10px 0 var(--jp-shadow-ambient-color); + --jp-elevation-z6: 0 3px 5px -1px var(--jp-shadow-umbra-color), + 0 6px 10px 0 var(--jp-shadow-penumbra-color), + 0 1px 18px 0 var(--jp-shadow-ambient-color); + --jp-elevation-z8: 0 5px 5px -3px var(--jp-shadow-umbra-color), + 0 8px 10px 1px var(--jp-shadow-penumbra-color), + 0 3px 14px 2px var(--jp-shadow-ambient-color); + --jp-elevation-z12: 0 7px 8px -4px var(--jp-shadow-umbra-color), + 0 12px 17px 2px var(--jp-shadow-penumbra-color), + 0 5px 22px 4px var(--jp-shadow-ambient-color); + --jp-elevation-z16: 0 8px 10px -5px var(--jp-shadow-umbra-color), + 0 16px 24px 2px var(--jp-shadow-penumbra-color), + 0 6px 30px 5px var(--jp-shadow-ambient-color); + --jp-elevation-z20: 0 10px 13px -6px var(--jp-shadow-umbra-color), + 0 20px 31px 3px var(--jp-shadow-penumbra-color), + 0 8px 38px 7px var(--jp-shadow-ambient-color); + --jp-elevation-z24: 0 11px 15px -7px var(--jp-shadow-umbra-color), + 0 24px 38px 3px var(--jp-shadow-penumbra-color), + 0 9px 46px 8px var(--jp-shadow-ambient-color); + + /* Borders + * + * The following variables, specify the visual styling of borders in JupyterLab. + */ + + --jp-border-width: 1px; + --jp-border-color0: var(--md-grey-400); + --jp-border-color1: var(--md-grey-400); + --jp-border-color2: var(--md-grey-300); + --jp-border-color3: var(--md-grey-200); + --jp-inverse-border-color: var(--md-grey-600); + --jp-border-radius: 2px; + + /* UI Fonts + * + * The UI font CSS variables are used for the typography all of the JupyterLab + * user interface elements that are not directly user generated content. + * + * The font sizing here is done assuming that the body font size of --jp-ui-font-size1 + * is applied to a parent element. When children elements, such as headings, are sized + * in em all things will be computed relative to that body size. + */ + + --jp-ui-font-scale-factor: 1.2; + --jp-ui-font-size0: 0.83333em; + --jp-ui-font-size1: 13px; /* Base font size */ + --jp-ui-font-size2: 1.2em; + --jp-ui-font-size3: 1.44em; + --jp-ui-font-family: system-ui, -apple-system, blinkmacsystemfont, 'Segoe UI', + helvetica, arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', + 'Segoe UI Symbol'; + + /* + * Use these font colors against the corresponding main layout colors. + * In a light theme, these go from dark to light. + */ + + /* Defaults use Material Design specification */ + --jp-ui-font-color0: rgba(0, 0, 0, 1); + --jp-ui-font-color1: rgba(0, 0, 0, 0.87); + --jp-ui-font-color2: rgba(0, 0, 0, 0.54); + --jp-ui-font-color3: rgba(0, 0, 0, 0.38); + + /* + * Use these against the brand/accent/warn/error colors. + * These will typically go from light to darker, in both a dark and light theme. + */ + + --jp-ui-inverse-font-color0: rgba(255, 255, 255, 1); + --jp-ui-inverse-font-color1: rgba(255, 255, 255, 1); + --jp-ui-inverse-font-color2: rgba(255, 255, 255, 0.7); + --jp-ui-inverse-font-color3: rgba(255, 255, 255, 0.5); + + /* Content Fonts + * + * Content font variables are used for typography of user generated content. + * + * The font sizing here is done assuming that the body font size of --jp-content-font-size1 + * is applied to a parent element. When children elements, such as headings, are sized + * in em all things will be computed relative to that body size. + */ + + --jp-content-line-height: 1.6; + --jp-content-font-scale-factor: 1.2; + --jp-content-font-size0: 0.83333em; + --jp-content-font-size1: 14px; /* Base font size */ + --jp-content-font-size2: 1.2em; + --jp-content-font-size3: 1.44em; + --jp-content-font-size4: 1.728em; + --jp-content-font-size5: 2.0736em; + + /* This gives a magnification of about 125% in presentation mode over normal. */ + --jp-content-presentation-font-size1: 17px; + --jp-content-heading-line-height: 1; + --jp-content-heading-margin-top: 1.2em; + --jp-content-heading-margin-bottom: 0.8em; + --jp-content-heading-font-weight: 500; + + /* Defaults use Material Design specification */ + --jp-content-font-color0: rgba(0, 0, 0, 1); + --jp-content-font-color1: rgba(0, 0, 0, 0.87); + --jp-content-font-color2: rgba(0, 0, 0, 0.54); + --jp-content-font-color3: rgba(0, 0, 0, 0.38); + --jp-content-link-color: var(--md-blue-900); + --jp-content-font-family: system-ui, -apple-system, blinkmacsystemfont, + 'Segoe UI', helvetica, arial, sans-serif, 'Apple Color Emoji', + 'Segoe UI Emoji', 'Segoe UI Symbol'; + + /* + * Code Fonts + * + * Code font variables are used for typography of code and other monospaces content. + */ + + --jp-code-font-size: 13px; + --jp-code-line-height: 1.3077; /* 17px for 13px base */ + --jp-code-padding: 5px; /* 5px for 13px base, codemirror highlighting needs integer px value */ + --jp-code-font-family-default: menlo, consolas, 'DejaVu Sans Mono', monospace; + --jp-code-font-family: var(--jp-code-font-family-default); + + /* This gives a magnification of about 125% in presentation mode over normal. */ + --jp-code-presentation-font-size: 16px; + + /* may need to tweak cursor width if you change font size */ + --jp-code-cursor-width0: 1.4px; + --jp-code-cursor-width1: 2px; + --jp-code-cursor-width2: 4px; + + /* Layout + * + * The following are the main layout colors use in JupyterLab. In a light + * theme these would go from light to dark. + */ + + --jp-layout-color0: white; + --jp-layout-color1: white; + --jp-layout-color2: var(--md-grey-200); + --jp-layout-color3: var(--md-grey-400); + --jp-layout-color4: var(--md-grey-600); + + /* Inverse Layout + * + * The following are the inverse layout colors use in JupyterLab. In a light + * theme these would go from dark to light. + */ + + --jp-inverse-layout-color0: #111; + --jp-inverse-layout-color1: var(--md-grey-900); + --jp-inverse-layout-color2: var(--md-grey-800); + --jp-inverse-layout-color3: var(--md-grey-700); + --jp-inverse-layout-color4: var(--md-grey-600); + + /* Brand/accent */ + + --jp-brand-color0: var(--md-blue-900); + --jp-brand-color1: var(--md-blue-700); + --jp-brand-color2: var(--md-blue-300); + --jp-brand-color3: var(--md-blue-100); + --jp-brand-color4: var(--md-blue-50); + --jp-accent-color0: var(--md-green-900); + --jp-accent-color1: var(--md-green-700); + --jp-accent-color2: var(--md-green-300); + --jp-accent-color3: var(--md-green-100); + + /* State colors (warn, error, success, info) */ + + --jp-warn-color0: var(--md-orange-900); + --jp-warn-color1: var(--md-orange-700); + --jp-warn-color2: var(--md-orange-300); + --jp-warn-color3: var(--md-orange-100); + --jp-error-color0: var(--md-red-900); + --jp-error-color1: var(--md-red-700); + --jp-error-color2: var(--md-red-300); + --jp-error-color3: var(--md-red-100); + --jp-success-color0: var(--md-green-900); + --jp-success-color1: var(--md-green-700); + --jp-success-color2: var(--md-green-300); + --jp-success-color3: var(--md-green-100); + --jp-info-color0: var(--md-cyan-900); + --jp-info-color1: var(--md-cyan-700); + --jp-info-color2: var(--md-cyan-300); + --jp-info-color3: var(--md-cyan-100); + + /* Cell specific styles */ + + --jp-cell-padding: 5px; + --jp-cell-collapser-width: 8px; + --jp-cell-collapser-min-height: 20px; + --jp-cell-collapser-not-active-hover-opacity: 0.6; + --jp-cell-editor-background: var(--md-grey-100); + --jp-cell-editor-border-color: var(--md-grey-300); + --jp-cell-editor-box-shadow: inset 0 0 2px var(--md-blue-300); + --jp-cell-editor-active-background: var(--jp-layout-color0); + --jp-cell-editor-active-border-color: var(--jp-brand-color1); + --jp-cell-prompt-width: 64px; + --jp-cell-prompt-font-family: var(--jp-code-font-family-default); + --jp-cell-prompt-letter-spacing: 0; + --jp-cell-prompt-opacity: 1; + --jp-cell-prompt-not-active-opacity: 0.5; + --jp-cell-prompt-not-active-font-color: var(--md-grey-700); + + /* A custom blend of MD grey and blue 600 + * See https://meyerweb.com/eric/tools/color-blend/#546E7A:1E88E5:5:hex */ + --jp-cell-inprompt-font-color: #307fc1; + + /* A custom blend of MD grey and orange 600 + * https://meyerweb.com/eric/tools/color-blend/#546E7A:F4511E:5:hex */ + --jp-cell-outprompt-font-color: #bf5b3d; + + /* Notebook specific styles */ + + --jp-notebook-padding: 10px; + --jp-notebook-select-background: var(--jp-layout-color1); + --jp-notebook-multiselected-color: var(--md-blue-50); + + /* The scroll padding is calculated to fill enough space at the bottom of the + notebook to show one single-line cell (with appropriate padding) at the top + when the notebook is scrolled all the way to the bottom. We also subtract one + pixel so that no scrollbar appears if we have just one single-line cell in the + notebook. This padding is to enable a 'scroll past end' feature in a notebook. + */ + --jp-notebook-scroll-padding: calc( + 100% - var(--jp-code-font-size) * var(--jp-code-line-height) - + var(--jp-code-padding) - var(--jp-cell-padding) - 1px + ); + + /* Rendermime styles */ + + --jp-rendermime-error-background: #fdd; + --jp-rendermime-table-row-background: var(--md-grey-100); + --jp-rendermime-table-row-hover-background: var(--md-light-blue-50); + + /* Dialog specific styles */ + + --jp-dialog-background: rgba(0, 0, 0, 0.25); + + /* Console specific styles */ + + --jp-console-padding: 10px; + + /* Toolbar specific styles */ + + --jp-toolbar-border-color: var(--jp-border-color1); + --jp-toolbar-micro-height: 8px; + --jp-toolbar-background: var(--jp-layout-color1); + --jp-toolbar-box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.24); + --jp-toolbar-header-margin: 4px 4px 0 4px; + --jp-toolbar-active-background: var(--md-grey-300); + + /* Statusbar specific styles */ + + --jp-statusbar-height: 24px; + + /* Input field styles */ + + --jp-input-box-shadow: inset 0 0 2px var(--md-blue-300); + --jp-input-active-background: var(--jp-layout-color1); + --jp-input-hover-background: var(--jp-layout-color1); + --jp-input-background: var(--md-grey-100); + --jp-input-border-color: var(--jp-inverse-border-color); + --jp-input-active-border-color: var(--jp-brand-color1); + --jp-input-active-box-shadow-color: rgba(19, 124, 189, 0.3); + + /* General editor styles */ + + --jp-editor-selected-background: #d9d9d9; + --jp-editor-selected-focused-background: #d7d4f0; + --jp-editor-cursor-color: var(--jp-ui-font-color0); + + /* Code mirror specific styles */ + + --jp-mirror-editor-keyword-color: #008000; + --jp-mirror-editor-atom-color: #88f; + --jp-mirror-editor-number-color: #080; + --jp-mirror-editor-def-color: #00f; + --jp-mirror-editor-variable-color: var(--md-grey-900); + --jp-mirror-editor-variable-2-color: rgb(0, 54, 109); + --jp-mirror-editor-variable-3-color: #085; + --jp-mirror-editor-punctuation-color: #05a; + --jp-mirror-editor-property-color: #05a; + --jp-mirror-editor-operator-color: #a2f; + --jp-mirror-editor-comment-color: #408080; + --jp-mirror-editor-string-color: #ba2121; + --jp-mirror-editor-string-2-color: #708; + --jp-mirror-editor-meta-color: #a2f; + --jp-mirror-editor-qualifier-color: #555; + --jp-mirror-editor-builtin-color: #008000; + --jp-mirror-editor-bracket-color: #997; + --jp-mirror-editor-tag-color: #170; + --jp-mirror-editor-attribute-color: #00c; + --jp-mirror-editor-header-color: blue; + --jp-mirror-editor-quote-color: #090; + --jp-mirror-editor-link-color: #00c; + --jp-mirror-editor-error-color: #f00; + --jp-mirror-editor-hr-color: #999; + + /* + RTC user specific colors. + These colors are used for the cursor, username in the editor, + and the icon of the user. + */ + + --jp-collaborator-color1: #ffad8e; + --jp-collaborator-color2: #dac83d; + --jp-collaborator-color3: #72dd76; + --jp-collaborator-color4: #00e4d0; + --jp-collaborator-color5: #45d4ff; + --jp-collaborator-color6: #e2b1ff; + --jp-collaborator-color7: #ff9de6; + + /* Vega extension styles */ + + --jp-vega-background: white; + + /* Sidebar-related styles */ + + --jp-sidebar-min-width: 250px; + + /* Search-related styles */ + + --jp-search-toggle-off-opacity: 0.5; + --jp-search-toggle-hover-opacity: 0.8; + --jp-search-toggle-on-opacity: 1; + --jp-search-selected-match-background-color: rgb(245, 200, 0); + --jp-search-selected-match-color: black; + --jp-search-unselected-match-background-color: var( + --jp-inverse-layout-color0 + ); + --jp-search-unselected-match-color: var(--jp-ui-inverse-font-color0); + + /* Icon colors that work well with light or dark backgrounds */ + --jp-icon-contrast-color0: var(--md-purple-600); + --jp-icon-contrast-color1: var(--md-green-600); + --jp-icon-contrast-color2: var(--md-pink-600); + --jp-icon-contrast-color3: var(--md-blue-600); + + /* Button colors */ + --jp-accept-color-normal: var(--md-blue-700); + --jp-accept-color-hover: var(--md-blue-800); + --jp-accept-color-active: var(--md-blue-900); + --jp-warn-color-normal: var(--md-red-700); + --jp-warn-color-hover: var(--md-red-800); + --jp-warn-color-active: var(--md-red-900); + --jp-reject-color-normal: var(--md-grey-600); + --jp-reject-color-hover: var(--md-grey-700); + --jp-reject-color-active: var(--md-grey-800); + + /* File or activity icons and switch semantic variables */ + --jp-jupyter-icon-color: #f37626; + --jp-notebook-icon-color: #f37626; + --jp-json-icon-color: var(--md-orange-700); + --jp-console-icon-background-color: var(--md-blue-700); + --jp-console-icon-color: white; + --jp-terminal-icon-background-color: var(--md-grey-800); + --jp-terminal-icon-color: var(--md-grey-200); + --jp-text-editor-icon-color: var(--md-grey-700); + --jp-inspector-icon-color: var(--md-grey-700); + --jp-switch-color: var(--md-grey-400); + --jp-switch-true-position-color: var(--md-orange-900); +} +</style> +<style type="text/css"> +/* Force rendering true colors when outputing to pdf */ +* { + -webkit-print-color-adjust: exact; +} + +/* Misc */ +a.anchor-link { + display: none; +} + +/* Input area styling */ +.jp-InputArea { + overflow: hidden; +} + +.jp-InputArea-editor { + overflow: hidden; +} + +.cm-editor.cm-s-jupyter .highlight pre { +/* weird, but --jp-code-padding defined to be 5px but 4px horizontal padding is hardcoded for pre.cm-line */ + padding: var(--jp-code-padding) 4px; + margin: 0; + + font-family: inherit; + font-size: inherit; + line-height: inherit; + color: inherit; + +} + +.jp-OutputArea-output pre { + line-height: inherit; + font-family: inherit; +} + +.jp-RenderedText pre { + color: var(--jp-content-font-color1); + font-size: var(--jp-code-font-size); +} + +/* Hiding the collapser by default */ +.jp-Collapser { + display: none; +} + +@page { + margin: 0.5in; /* Margin for each printed piece of paper */ +} + +@media print { + .jp-Cell-inputWrapper, + .jp-Cell-outputWrapper { + display: block; + } +} +</style> +<!-- Load mathjax --> +<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS_CHTML-full,Safe"> </script> +<!-- MathJax configuration --> +<script type="text/x-mathjax-config"> + init_mathjax = function() { + if (window.MathJax) { + // MathJax loaded + MathJax.Hub.Config({ + TeX: { + equationNumbers: { + autoNumber: "AMS", + useLabelIds: true + } + }, + tex2jax: { + inlineMath: [ ['$','$'], ["\\(","\\)"] ], + displayMath: [ ['$$','$$'], ["\\[","\\]"] ], + processEscapes: true, + processEnvironments: true + }, + displayAlign: 'center', + CommonHTML: { + linebreaks: { + automatic: true + } + } + }); + + MathJax.Hub.Queue(["Typeset", MathJax.Hub]); + } + } + init_mathjax(); + </script> +<!-- End of mathjax configuration --><script type="module"> + document.addEventListener("DOMContentLoaded", async () => { + const diagrams = document.querySelectorAll(".jp-Mermaid > pre.mermaid"); + // do not load mermaidjs if not needed + if (!diagrams.length) { + return; + } + const mermaid = (await import("https://cdnjs.cloudflare.com/ajax/libs/mermaid/10.6.0/mermaid.esm.min.mjs")).default; + const parser = new DOMParser(); + + mermaid.initialize({ + maxTextSize: 100000, + startOnLoad: false, + fontFamily: window + .getComputedStyle(document.body) + .getPropertyValue("--jp-ui-font-family"), + theme: document.querySelector("body[data-jp-theme-light='true']") + ? "default" + : "dark", + }); + + let _nextMermaidId = 0; + + function makeMermaidImage(svg) { + const img = document.createElement("img"); + const doc = parser.parseFromString(svg, "image/svg+xml"); + const svgEl = doc.querySelector("svg"); + const { maxWidth } = svgEl?.style || {}; + const firstTitle = doc.querySelector("title"); + const firstDesc = doc.querySelector("desc"); + + img.setAttribute("src", `data:image/svg+xml,${encodeURIComponent(svg)}`); + if (maxWidth) { + img.width = parseInt(maxWidth); + } + if (firstTitle) { + img.setAttribute("alt", firstTitle.textContent); + } + if (firstDesc) { + const caption = document.createElement("figcaption"); + caption.className = "sr-only"; + caption.textContent = firstDesc.textContent; + return [img, caption]; + } + return [img]; + } + + async function makeMermaidError(text) { + let errorMessage = ""; + try { + await mermaid.parse(text); + } catch (err) { + errorMessage = `${err}`; + } + + const result = document.createElement("details"); + result.className = 'jp-RenderedMermaid-Details'; + const summary = document.createElement("summary"); + summary.className = 'jp-RenderedMermaid-Summary'; + const pre = document.createElement("pre"); + const code = document.createElement("code"); + code.innerText = text; + pre.appendChild(code); + summary.appendChild(pre); + result.appendChild(summary); + + const warning = document.createElement("pre"); + warning.innerText = errorMessage; + result.appendChild(warning); + return [result]; + } + + async function renderOneMarmaid(src) { + const id = `jp-mermaid-${_nextMermaidId++}`; + const parent = src.parentNode; + let raw = src.textContent.trim(); + const el = document.createElement("div"); + el.style.visibility = "hidden"; + document.body.appendChild(el); + let results = null; + let output = null; + try { + const { svg } = await mermaid.render(id, raw, el); + results = makeMermaidImage(svg); + output = document.createElement("figure"); + results.map(output.appendChild, output); + } catch (err) { + parent.classList.add("jp-mod-warning"); + results = await makeMermaidError(raw); + output = results[0]; + } finally { + el.remove(); + } + parent.classList.add("jp-RenderedMermaid"); + parent.appendChild(output); + } + + void Promise.all([...diagrams].map(renderOneMarmaid)); + }); +</script> +<style> + .jp-Mermaid:not(.jp-RenderedMermaid) { + display: none; + } + + .jp-RenderedMermaid { + overflow: auto; + display: flex; + } + + .jp-RenderedMermaid.jp-mod-warning { + width: auto; + padding: 0.5em; + margin-top: 0.5em; + border: var(--jp-border-width) solid var(--jp-warn-color2); + border-radius: var(--jp-border-radius); + color: var(--jp-ui-font-color1); + font-size: var(--jp-ui-font-size1); + white-space: pre-wrap; + word-wrap: break-word; + } + + .jp-RenderedMermaid figure { + margin: 0; + overflow: auto; + max-width: 100%; + } + + .jp-RenderedMermaid img { + max-width: 100%; + } + + .jp-RenderedMermaid-Details > pre { + margin-top: 1em; + } + + .jp-RenderedMermaid-Summary { + color: var(--jp-warn-color2); + } + + .jp-RenderedMermaid:not(.jp-mod-warning) pre { + display: none; + } + + .jp-RenderedMermaid-Summary > pre { + display: inline-block; + white-space: normal; + } +</style> +<!-- End of mermaid configuration --></head> +<body class="jp-Notebook" data-jp-theme-light="true" data-jp-theme-name="JupyterLab Light"> +<main> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=c96d6259-08d6-4289-aea2-589d67cdb5ee"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<h1 id="PA-2.2:-Love-is-Sparse">PA 2.2: Love is Sparse<a class="anchor-link" href="#PA-2.2:-Love-is-Sparse">¶</a></h1><h1 style="position: absolute; display: flex; flex-grow: 0; flex-shrink: 0; flex-direction: row-reverse; top: 60px;right: 30px; margin: 0; border: 0"> +<style> + .markdown {width:100%; position: relative} + article { position: relative } + </style> +<img alt="No description has been provided for this image" src="https://gitlab.tudelft.nl/mude/public/-/raw/main/tu-logo/TU_P1_full-color.png" style="width:100px"/> +<img alt="No description has been provided for this image" src="https://gitlab.tudelft.nl/mude/public/-/raw/main/mude-logo/MUDE_Logo-small.png" style="width:100px"/> +</h1> +<h2 style="height: 10px"> +</h2> +<p><em><a href="http://mude.citg.tudelft.nl/">CEGM1000 MUDE</a>: Week 2.2 Due: complete this PA prior to class on Friday, Nov 22, 2024.</em></p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=7a28e541-d2d0-48a9-abf6-7b73075c8fd3"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p>This assignment will introduce you to the concept of sparse matrices in Python and how they can be useful to speed up computations and reduce file sizes. This is especially important when using the numerical schemes we are learning about (FDM, FVM, FEM) to solve problems with a lot of unknowns at each time step. To accomplish this, we will be using the <code>scipy.sparse</code> library.</p> +<p>Keep the <code>scipy.sparse</code> <a href="https://docs.scipy.org/doc/scipy/reference/sparse.html">documentation</a> handy. Some of the work you'll do is based off this <a href="https://www.sefidian.com/2021/04/28/python-scipy-sparse-matrices-explained/">blog</a>, so you may find it helpful. In addition, if you don't know what a byte is, you may want to read up on <a href="https://en.wikipedia.org/wiki/Byte">Wikipdia here</a> (not all of it, as long as you recognize that it is a measure of storage space on a computer).The concepts you learn here are applied to the Finite Element Method in this <a href="https://mude.citg.tudelft.nl/book/fem/matrix.html">book chapter</a>, which you are expected to read during Week 2.2.</p> +<p><strong>Note:</strong> <em>you probably skipped over all the links in the paragraph above. While we forgive you for your haste, just remember to revisit some of them if you are struggling to finish the questions below!</em></p> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=a262eac1"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [1]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> +<span class="kn">import</span> <span class="nn">scipy.sparse</span> <span class="k">as</span> <span class="nn">sparse</span> +<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span> +<span class="kn">import</span> <span class="nn">timeit</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=c3cd5017-10e0-4b64-ad1a-b626d80a128a"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<h2 id="Task-1:-Why-sparse?">Task 1: Why sparse?<a class="anchor-link" href="#Task-1:-Why-sparse?">¶</a></h2><p>Some matrices have a lot of zeros, with such an example given below. When this is the case, the way we store the actual information of the matrix (the non-zero elements) can have a big impact on computation speed and storage demands. Formats which handle this by only storing non-zero elements are called sparse, and have very different internal representations of the data to the matrices you have been familiarized with in previous programming assignments.</p> +<p><img alt="Sparse matrix" src="images/sparse_matrix.png"/></p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=f583dfa0-5a21-4ebb-99e5-7b27b323171d"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 1.1:</b> +<p>First we will create a regular Numpy matrix to use as a starting point for making a sparse one.</p> +<ul> +<li>Create a function (<code>create_dense</code>) which returns a square matrix of arbitrary size filled with zero and non-zero values between 0 and 1.</li> +<li>The function should take as input the size N (such that the matrix is N x N) and one float between 0 and 1, which represents the approximate fraction of the elements of the matrix which are non-zero.</li> +<li>Use <a href="https://numpy.org/doc/stable/reference/random/generated/numpy.random.rand.html">numpy.random.rand</a> to create a random set of values between 0 and 1</li> +<li>Remove a portion of the values by using simple boolean expression to set the fraction specified by <code>percentage</code> to zero.</li> +</ul> +</p> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=2c707a48"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#facb8e; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> <p>Note that the function below uses colons <code>:</code> with argument type, as well as a <code>-></code> before closing the function definition line. This is called "typing," which is a useful feature for helping to write code that behaves properly. In this PA you should use them like hints to help you write the functions and use them properly. If you are curious, read more <a href="https://docs.python.org/3/library/typing.html" target="_blank">here</a>.</p></div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=1310dca9-dc46-4ab1-ab78-0a5389191cfc"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [2]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="c1"># def create_dense(size: int, percentage: float) -> np.array:</span> +<span class="c1"># matrix = YOUR_CODE_HERE</span> +<span class="c1"># matrix[YOUR_CODE_HERE] = 0</span> +<span class="c1"># return matrix</span> + +<span class="c1"># SOLUTION</span> +<span class="k">def</span> <span class="nf">create_dense</span><span class="p">(</span><span class="n">size</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">percentage</span><span class="p">:</span> <span class="nb">float</span><span class="p">)</span> <span class="o">-></span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">:</span> + <span class="n">matrix</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">rand</span><span class="p">(</span><span class="n">size</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span> + <span class="n">matrix</span><span class="p">[</span><span class="n">matrix</span> <span class="o">></span> <span class="n">percentage</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span> + <span class="k">return</span> <span class="n">matrix</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=d670f274-ef24-4abd-86bf-3cd24e3cf5c5"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p>Now, set up a test to check if you set the function up correctly:</p> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=8f6a3117"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [3]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="c1"># test_size = YOUR_CODE_HERE</span> +<span class="c1"># test_percentage = YOUR_CODE_HERE</span> +<span class="c1"># matrix = create_dense(test_size, test_percentage)</span> +<span class="c1"># assert np.count_nonzero(matrix) < test_percentage*1.1*test_size**2</span> + +<span class="c1"># SOLUTION</span> +<span class="n">test_size</span> <span class="o">=</span> <span class="mi">1000</span> +<span class="n">test_percentage</span> <span class="o">=</span> <span class="mf">0.1</span> +<span class="n">matrix</span> <span class="o">=</span> <span class="n">create_dense</span><span class="p">(</span><span class="n">test_size</span><span class="p">,</span> <span class="n">test_percentage</span><span class="p">)</span> +<span class="k">assert</span> <span class="n">np</span><span class="o">.</span><span class="n">count_nonzero</span><span class="p">(</span><span class="n">matrix</span><span class="p">)</span> <span class="o"><</span> <span class="n">test_percentage</span><span class="o">*</span><span class="mf">1.1</span><span class="o">*</span><span class="n">test_size</span><span class="o">**</span><span class="mi">2</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=0f3d9c79"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 1.2:</b> +Use <a href="https://numpy.org/doc/stable/reference/generated/numpy.ndarray.nbytes.html">array.nbytes</a> to find out how much space a 1000x1000 matrix with 10% non-zero elements takes. Try to explain where this number came from! (Hint: the answer is in the assert statement) +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=aa5a25f9"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [4]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="c1"># my_matrix_size = YOUR_CODE_HERE</span> +<span class="c1"># assert my_matrix_size == 8*test_size**2</span> + +<span class="c1"># SOLUTION</span> +<span class="n">my_matrix_size</span> <span class="o">=</span> <span class="n">matrix</span><span class="o">.</span><span class="n">nbytes</span> +<span class="k">assert</span> <span class="n">my_matrix_size</span> <span class="o">==</span> <span class="mi">8</span><span class="o">*</span><span class="n">test_size</span><span class="o">**</span><span class="mi">2</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=912215f3"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p>Next we will explore how to use <code>scipy.sparse</code>, and how this reduces the data size of the matrix. The <a href="https://docs.scipy.org/doc/scipy/reference/sparse.html"> documentation</a> gives us many different types of formats to choose from, so we'll explore two of them: BSR (Block Sparse Row) and CSR (Compressed Sparse Row).</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=25a832c8"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 1.3:</b> + Complete the code below to make a CSR and BSR matrix from the <code>matrix</code> variable. +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=29c0d2dc"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [5]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="c1"># csr_matrix = YOUR_CODE_HERE</span> +<span class="c1"># bsr_matrix = YOUR_CODE_HERE</span> + +<span class="c1"># SOLUTION</span> +<span class="n">csr_matrix</span> <span class="o">=</span> <span class="n">sparse</span><span class="o">.</span><span class="n">csr_array</span><span class="p">(</span><span class="n">matrix</span><span class="p">)</span> +<span class="n">bsr_matrix</span> <span class="o">=</span> <span class="n">sparse</span><span class="o">.</span><span class="n">bsr_array</span><span class="p">(</span><span class="n">matrix</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=56334ed7"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p>Let's compare the new storage requirements and see how much of an improvement we got (it should approach the value used above for <code>test_percentage</code>, but not reach it exactly):</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=bb4b15d3"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 1.4:</b> + Run the code below and comment on the improvement and whether or not it reaches the target percentage of sparse values in the non-sparse matrix. +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell" id="cell-id=a46df127"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [24]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"CSR matrix size: </span><span class="si">{</span><span class="n">csr_matrix</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">size</span><span class="si">}</span><span class="s2"> bytes"</span><span class="p">)</span> +<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Compared to the normal matrix, CSR uses this "</span> + <span class="o">+</span><span class="sa">f</span><span class="s2">"fraction of space: </span><span class="si">{</span><span class="n">csr_matrix</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">nbytes</span><span class="o">/</span><span class="n">my_matrix_size</span><span class="si">:</span><span class="s2">0.6f</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span> +<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"BSR matrix size: </span><span class="si">{</span><span class="n">bsr_matrix</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">size</span><span class="si">}</span><span class="s2"> bytes"</span><span class="p">)</span> +<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Compared to the normal matrix, BSR uses this "</span> + <span class="o">+</span><span class="sa">f</span><span class="s2">"fraction of space: </span><span class="si">{</span><span class="n">bsr_matrix</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">nbytes</span><span class="o">/</span><span class="n">my_matrix_size</span><span class="si">:</span><span class="s2">0.6f</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +<div class="jp-Cell-outputWrapper"> +<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser"> +</div> +<div class="jp-OutputArea jp-Cell-outputArea"> +<div class="jp-OutputArea-child"> +<div class="jp-OutputPrompt jp-OutputArea-prompt"></div> +<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain" tabindex="0"> +<pre>CSR matrix size: 2000 bytes +Compared to the normal matrix, CSR uses this fraction of space: 0.002000 +BSR matrix size: 2000 bytes +Compared to the normal matrix, BSR uses this fraction of space: 0.002000 +</pre> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=69dc3b5c"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#FAE99E; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Solution:</b> +<p>As we can see in the output, the sparse methods reduce the size of the matrix by about 10x than the non-sparse method. This is nearly identical to the target percentage!</p> +</p> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=f832b8e0"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<h2 id="Task-2:-What-is-love?">Task 2: <a href="https://www.youtube.com/watch?v=HEXWRTEbj1I">What is love?</a><a class="anchor-link" href="#Task-2:-What-is-love?">¶</a></h2><p>Let's look into a small example of how sparse matrices can also help improve calculation speeds. We'll study the mysterious case of a massive friend group with a concerning love circle and how we can predict how each person feels with respect to the other. This is quantified by the amount of love, $n_i$, that is "felt" by person $i$. In fact, the feelings grow stronger with time, which means they can be described with a simple differential relationship between <em>neighbors</em>, where each person in the group is happy when the other is sad, but the opposite is true for the other person, which can be defined like this:</p> +$$ +\begin{pmatrix} +\cfrac{dn_1}{dt}\\ +\cfrac{dn_2}{dt} \\ +\end{pmatrix} += +\begin{pmatrix} +0 & 1\\ +-1 & 0 \\ +\end{pmatrix} +\begin{pmatrix} +n_1\\ +n_2 \\ +\end{pmatrix} +$$<p>So in this case, person 2 doesn't like it when person 1 is happy but person 2 likes it when person 1 is happy. If we extend this to a four case scenario we'd get the following matrix: +$$ +\begin{pmatrix} +\cfrac{dn_1}{dt}\\ +\cfrac{dn_2}{dt}\\ +\cfrac{dn_3}{dt}\\ +\cfrac{dn_4}{dt}\\ +\end{pmatrix} += +\begin{pmatrix} +0 & 1 & 0 & -1 \\ +-1 & 0 & 1 & 0 \\ +0 & -1 & 0 & 1 \\ +1 & 0 & -1 & 0 \\ +\end{pmatrix} +\begin{pmatrix} +n_1 \\ +n_2 \\ +n_3 \\ +n_4 \\ +\end{pmatrix} +$$</p> +<p>Now we can see how everyone's feelings towards each other are...complicated!</p> +<p>What happens if we extend it to even more people? The pattern persists, but importantly: <em>if the group gets very large, we will be storing a lot of useless information, all the 0's between the 1's!</em></p> +<p>OK, so maybe this is a silly example, but it creates a problem that is actually very similar to how we use individual elements to construct a global system of equations to solve in the Finite Element Method!</p> +<p>We can easily operationalize the procedure of <em>constructing</em> this matrix using the method <code>ix_</code>, for which a simple example is provided in the code cell below (this example is generic to illustrate <code>ix_</code> usage and is not related to the love circle!):</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=eeeac139"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 2.0:</b> +<p>Read and modify the code cell below until you are confident you understand how the <code>ix_</code> method works.</p> +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell" id="cell-id=77f295f5"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="n">blank</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">shape</span><span class="o">=</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">4</span><span class="p">))</span> +<span class="n">blueprint</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([[</span><span class="mi">0</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">],</span> + <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">]])</span> + +<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">):</span> + <span class="c1"># First argument will be used for rows</span> + <span class="c1"># Second for columns</span> + <span class="n">blank</span><span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">ix_</span><span class="p">([</span><span class="n">i</span><span class="o">*</span><span class="mi">2</span><span class="p">,</span> <span class="n">i</span><span class="o">*</span><span class="mi">2</span> <span class="o">+</span> <span class="mi">1</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">])]</span> <span class="o">=</span> <span class="n">blueprint</span> + +<span class="nb">print</span><span class="p">(</span><span class="n">blank</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +<div class="jp-Cell-outputWrapper"> +<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser"> +</div> +<div class="jp-OutputArea jp-Cell-outputArea"> +<div class="jp-OutputArea-child"> +<div class="jp-OutputPrompt jp-OutputArea-prompt"></div> +<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain" tabindex="0"> +<pre>[[0. 0. 0.5 0. ] + [0. 1. 0.5 0. ] + [0. 0. 0.5 0. ] + [0. 1. 0.5 0. ]] +</pre> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=4acb01e5"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p>Now we return to the love triangle problem and try to construct the matrix for a large group using <code>ix_</code>.</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=7a73f37b-6763-4d1c-92b8-994aa28f8ff6"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 2.1:</b> +Generate the matrix <code>relationship</code> for the differential equation for 1000 people. Use the <a href="https://numpy.org/doc/stable/reference/generated/numpy.ix_.html"><code>numpy.ix_</code></a> function to make your life easier. +<p>Note that we have already provided an easy way to place the smaller sub-matrices in the right place.</p> +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=b622c84f"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="c1"># N = 1000</span> +<span class="c1"># relationship = np.zeros(shape=(N, N))</span> + +<span class="c1"># YOUR_CODE_HERE</span> + +<span class="c1"># for i in range(N):</span> +<span class="c1"># relationship[np.ix_([i, (i+1)%N], [i, (i+1)%N])] = YOUR_CODE_HERE</span> + +<span class="c1"># SOLUTION</span> +<span class="n">N</span> <span class="o">=</span> <span class="mi">1000</span> +<span class="n">relationship</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">shape</span><span class="o">=</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">N</span><span class="p">))</span> + +<span class="n">general</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">]])</span> + +<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">N</span><span class="p">):</span> + <span class="n">relationship</span><span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">ix_</span><span class="p">([</span><span class="n">i</span><span class="p">,</span> <span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">%</span><span class="k">N</span>], [i, (i+1)%N])] = general +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=28b9a66f"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p>Remember <code>plt.matshow()</code>? We used this back in Q1 to visualize the contents of a matrix. Try it now to see if we build this matrix correctly with <code>ix_</code>.</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=11c4eb64"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 2.2:</b> + Use <code>plt.matshow()</code> to view the contents of the matrix <code>relationship</code>. +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=2cd01702"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="c1"># plt.matshow(YOUR_CODE_HERE)</span> + +<span class="c1"># SOLUTION</span> +<span class="n">plt</span><span class="o">.</span><span class="n">matshow</span><span class="p">(</span><span class="n">relationship</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=dc948f50"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p>Note that since the matrix is huge, we have to look at only a small subset of it in order to see its contents; try changing the indices of the plotted values to get a better view.</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=ca159fe4"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 2.3:</b> + Try again, but look at a subset of the matrix! +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell" id="cell-id=8ae5a340"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="c1"># plt.matshow(YOUR_CODE_HERE)</span> + +<span class="c1"># SOLUTION</span> +<span class="n">plt</span><span class="o">.</span><span class="n">matshow</span><span class="p">(</span><span class="n">relationship</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">10</span><span class="p">,</span><span class="mi">0</span><span class="p">:</span><span class="mi">10</span><span class="p">])</span> +</pre></div> +</div> +</div> +</div> +</div> +<div class="jp-Cell-outputWrapper"> +<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser"> +</div> +<div class="jp-OutputArea jp-Cell-outputArea"> +<div class="jp-OutputArea-child jp-OutputArea-executeResult"> +<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[ ]:</div> +<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain" tabindex="0"> +<pre><matplotlib.image.AxesImage at 0x2865a22ef00></pre> +</div> +</div> +<div class="jp-OutputArea-child"> +<div class="jp-OutputPrompt jp-OutputArea-prompt"></div> +<div class="jp-RenderedImage jp-OutputArea-output" tabindex="0"> +<img alt="No description has been provided for this image" class="" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZoAAAGkCAYAAAAIduO+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAUoElEQVR4nO3dfWzVhb3H8S/UeYqm1IkpkVARcAkIennMVNBt0ZD4lJm7ODTqjG6LhKo8JEaYblM36HUPSqKjpGbXuBGwf2xGlsxtxEXQOSJWULMtEDCRqjPMxbQ+xHqh5/6xSNYVtAf48junvF7JieHnOZ5PfiZ959dzOGdYuVwuBwAkGV70AACGNqEBIJXQAJBKaABIJTQApBIaAFIJDQCphAaAVEIDQCqhASBVzYZm9erVMX78+Kivr4+ZM2fGs88+W/SkqtLa2hqzZ8+OhoaGaGpqiquuuip27NhR9Kyq19raGsOGDYvFixcXPaUqvfnmm3H99dfHqFGj4qSTTopp06ZFZ2dn0bOqyr59++Luu++O8ePHx4gRI2LChAlx3333RV9fX9HTClOToeno6IjFixfHXXfdFdu2bYsLL7wwLr300tizZ0/R06rGpk2boqWlJbZs2RIbN26Mffv2xbx58+KDDz4oelrV2rp1a7S3t8e5555b9JSq9O6778acOXPic5/7XDz11FPx17/+NX7605/GKaecUvS0qnL//ffHmjVr4uGHH46//e1v8aMf/Sh+/OMfx0MPPVT0tMIMq8UP1fziF78YM2bMiLa2tgPHJk+eHFdddVW0trYWuKx6/eMf/4impqbYtGlTXHTRRUXPqTrvv/9+zJgxI1avXh0//OEPY9q0abFq1aqiZ1WVZcuWxZ/+9Ce/PfgMV1xxRYwePTp+/vOfHzj2ta99LU466aT45S9/WeCy4tTcFc3HH38cnZ2dMW/evH7H582bF88//3xBq6pfd3d3RESceuqpBS+pTi0tLXH55ZfHJZdcUvSUqrVhw4aYNWtWXH311dHU1BTTp0+PRx55pOhZVWfu3Lnx9NNPx86dOyMi4uWXX47nnnsuLrvssoKXFeeEogdU6p133on9+/fH6NGj+x0fPXp0vP322wWtqm7lcjmWLl0ac+fOjalTpxY9p+o8/vjj8dJLL8XWrVuLnlLVXnvttWhra4ulS5fGd77znXjhhRfi9ttvj1KpFN/4xjeKnlc17rzzzuju7o5JkyZFXV1d7N+/P1asWBHXXntt0dMKU3Oh+cSwYcP6/blcLg84xr/ceuut8corr8Rzzz1X9JSq09XVFYsWLYo//OEPUV9fX/ScqtbX1xezZs2KlStXRkTE9OnT4y9/+Uu0tbUJzb/p6OiItWvXxrp162LKlCmxffv2WLx4cYwZMyZuvPHGoucVouZCc9ppp0VdXd2Aq5e9e/cOuMoh4rbbbosNGzbE5s2bY+zYsUXPqTqdnZ2xd+/emDlz5oFj+/fvj82bN8fDDz8cvb29UVdXV+DC6nH66afH2Wef3e/Y5MmT41e/+lVBi6rTHXfcEcuWLYtrrrkmIiLOOeeceP3116O1tfW4DU3NvUZz4oknxsyZM2Pjxo39jm/cuDEuuOCCglZVn3K5HLfeemv8+te/jj/+8Y8xfvz4oidVpYsvvjheffXV2L59+4HbrFmz4rrrrovt27eLzL+ZM2fOgLfI79y5M8aNG1fQour04YcfxvDh/X+01tXVHddvb665K5qIiKVLl8YNN9wQs2bNivPPPz/a29tjz549sWDBgqKnVY2WlpZYt25dPPnkk9HQ0HDgCrCxsTFGjBhR8Lrq0dDQMOB1q5NPPjlGjRrl9az/sGTJkrjgggti5cqV8fWvfz1eeOGFaG9vj/b29qKnVZUrr7wyVqxYEWeccUZMmTIltm3bFg888EDcfPPNRU8rTrlG/exnPyuPGzeufOKJJ5ZnzJhR3rRpU9GTqkpEHPT26KOPFj2t6n3pS18qL1q0qOgZVek3v/lNeerUqeVSqVSeNGlSub29vehJVaenp6e8aNGi8hlnnFGur68vT5gwoXzXXXeVe3t7i55WmJr8ezQA1I6ae40GgNoiNACkEhoAUgkNAKmEBoBUQgNAqpoNTW9vb9xzzz3R29tb9JSq51wNjvM0OM7T4DlX/1Kzf4+mp6cnGhsbo7u7O0aOHFn0nKrmXA2O8zQ4ztPgOVf/UrNXNADUBqEBINUx/1DNvr6+eOutt6KhoeGIvj+mp6en3z85NOdqcJynwXGeBm+on6tyuRzvvfdejBkzZsAnVv+7Y/4azRtvvBHNzc3H8ikBSNTV1fWp33d1zK9oGhoaIiJi7D13x/Aq+kbDl//7f4ueMMB//fo4/lhxoOr1ffRRvHHPDw/8XD+UYx6aT35dNry+vqpCM7Kh+l6uqqbzA3Aon/UySPX9dAVgSBEaAFIJDQCphAaAVEIDQCqhASCV0ACQSmgASCU0AKQSGgBSCQ0AqYQGgFSHFZrVq1fH+PHjo76+PmbOnBnPPvvs0d4FwBBRcWg6Ojpi8eLFcdddd8W2bdviwgsvjEsvvTT27NmTsQ+AGldxaB544IH45je/Gd/61rdi8uTJsWrVqmhubo62traMfQDUuIpC8/HHH0dnZ2fMmzev3/F58+bF888/f9DH9Pb2Rk9PT78bAMePikLzzjvvxP79+2P06NH9jo8ePTrefvvtgz6mtbU1GhsbD9x8jTPA8eWw3gzwn9+mVi6XD/kNa8uXL4/u7u4Dt66ursN5SgBqVEVf5XzaaadFXV3dgKuXvXv3DrjK+USpVIpSqXT4CwGoaRVd0Zx44okxc+bM2LhxY7/jGzdujAsuuOCoDgNgaKjoiiYiYunSpXHDDTfErFmz4vzzz4/29vbYs2dPLFiwIGMfADWu4tDMnz8//vnPf8Z9990Xf//732Pq1Knx29/+NsaNG5exD4AaV3FoIiIWLlwYCxcuPNpbABiCfNYZAKmEBoBUQgNAKqEBIJXQAJBKaABIJTQApBIaAFIJDQCphAaAVEIDQKrD+qyzo2HCsq1xwrDPFfX0A0yM6vv06d3z1xQ94aAmdlTfuQKqlysaAFIJDQCphAaAVEIDQCqhASCV0ACQSmgASCU0AKQSGgBSCQ0AqYQGgFRCA0AqoQEgldAAkEpoAEglNACkEhoAUgkNAKmEBoBUQgNAKqEBIJXQAJBKaABIJTQApBIaAFIJDQCphAaAVEIDQCqhASCV0ACQSmgASCU0AKQSGgBSCQ0AqYQGgFRCA0CqE4p64tf+Z3YMr68v6ukHOGvJlqInDDAxFhQ94aB2z19T9IQBJnZU57kCXNEAkExoAEglNACkEhoAUgkNAKmEBoBUQgNAKqEBIJXQAJBKaABIJTQApBIaAFIJDQCphAaAVBWFprW1NWbPnh0NDQ3R1NQUV111VezYsSNrGwBDQEWh2bRpU7S0tMSWLVti48aNsW/fvpg3b1588MEHWfsAqHEVffHZ7373u35/fvTRR6OpqSk6OzvjoosuOqrDABgajugbNru7uyMi4tRTTz3kfXp7e6O3t/fAn3t6eo7kKQGoMYf9ZoByuRxLly6NuXPnxtSpUw95v9bW1mhsbDxwa25uPtynBKAGHXZobr311njllVdi/fr1n3q/5cuXR3d394FbV1fX4T4lADXosH51dtttt8WGDRti8+bNMXbs2E+9b6lUilKpdFjjAKh9FYWmXC7HbbfdFk888UQ888wzMX78+KxdAAwRFYWmpaUl1q1bF08++WQ0NDTE22+/HRERjY2NMWLEiJSBANS2il6jaWtri+7u7vjyl78cp59++oFbR0dH1j4AalzFvzoDgEr4rDMAUgkNAKmEBoBUQgNAKqEBIJXQAJBKaABIJTQApBIaAFIJDQCphAaAVEIDQKrD+uKzoWjXg+cVPWGAs5ZsKXrCQU2MBUVPGGD3/DVFTxhgYkf1nScogisaAFIJDQCphAaAVEIDQCqhASCV0ACQSmgASCU0AKQSGgBSCQ0AqYQGgFRCA0AqoQEgldAAkEpoAEglNACkEhoAUgkNAKmEBoBUQgNAKqEBIJXQAJBKaABIJTQApBIaAFIJDQCphAaAVEIDQCqhASCV0ACQSmgASCU0AKQSGgBSCQ0AqYQGgFRCA0CqE4oewKHtevC8oicc1FlLthQ9YYCJsaDoCQPsnr+m6AkDTOyovvPE0OeKBoBUQgNAKqEBIJXQAJBKaABIJTQApBIaAFIJDQCphAaAVEIDQCqhASCV0ACQSmgASCU0AKQ6otC0trbGsGHDYvHixUdpDgBDzWGHZuvWrdHe3h7nnnvu0dwDwBBzWKF5//3347rrrotHHnkkPv/5zx/tTQAMIYcVmpaWlrj88svjkksu+cz79vb2Rk9PT78bAMePir/K+fHHH4+XXnoptm7dOqj7t7a2xr333lvxMACGhoquaLq6umLRokWxdu3aqK+vH9Rjli9fHt3d3QduXV1dhzUUgNpU0RVNZ2dn7N27N2bOnHng2P79+2Pz5s3x8MMPR29vb9TV1fV7TKlUilKpdHTWAlBzKgrNxRdfHK+++mq/YzfddFNMmjQp7rzzzgGRAYCKQtPQ0BBTp07td+zkk0+OUaNGDTgOABE+GQCAZBW/6+w/PfPMM0dhBgBDlSsaAFIJDQCphAaAVEIDQCqhASCV0ACQSmgASCU0AKQSGgBSCQ0AqYQGgFRH/FlnHH92PXhe0RMGOGvJlqInDDAxFhQ9YYDd89cUPWGAiR3Vd544ulzRAJBKaABIJTQApBIaAFIJDQCphAaAVEIDQCqhASCV0ACQSmgASCU0AKQSGgBSCQ0AqYQGgFRCA0AqoQEgldAAkEpoAEglNACkEhoAUgkNAKmEBoBUQgNAKqEBIJXQAJBKaABIJTQApBIaAFIJDQCphAaAVEIDQCqhASCV0ACQSmgASCU0AKQSGgBSnVD0ADgadj14XtETBjhryZaiJwwwMRYUPWGA3fPXFD3hoCZ2VN+5qlWuaABIJTQApBIaAFIJDQCphAaAVEIDQCqhASCV0ACQSmgASCU0AKQSGgBSCQ0AqYQGgFRCA0CqikPz5ptvxvXXXx+jRo2Kk046KaZNmxadnZ0Z2wAYAir6Ppp333035syZE1/5ylfiqaeeiqampti9e3eccsopSfMAqHUVheb++++P5ubmePTRRw8cO/PMM4/2JgCGkIp+dbZhw4aYNWtWXH311dHU1BTTp0+PRx555FMf09vbGz09Pf1uABw/KgrNa6+9Fm1tbfGFL3whfv/738eCBQvi9ttvj1/84heHfExra2s0NjYeuDU3Nx/xaABqR0Wh6evrixkzZsTKlStj+vTpccstt8S3v/3taGtrO+Rjli9fHt3d3QduXV1dRzwagNpRUWhOP/30OPvss/sdmzx5cuzZs+eQjymVSjFy5Mh+NwCOHxWFZs6cObFjx45+x3bu3Bnjxo07qqMAGDoqCs2SJUtiy5YtsXLlyti1a1esW7cu2tvbo6WlJWsfADWuotDMnj07nnjiiVi/fn1MnTo1fvCDH8SqVaviuuuuy9oHQI2r6O/RRERcccUVccUVV2RsAWAI8llnAKQSGgBSCQ0AqYQGgFRCA0AqoQEgldAAkEpoAEglNACkEhoAUgkNAKkq/qwzYHB2PXhe0RMGOGvJlqInDDAxFhQ94aB2z19T9IQBJnZU57n6LK5oAEglNACkEhoAUgkNAKmEBoBUQgNAKqEBIJXQAJBKaABIJTQApBIaAFIJDQCphAaAVEIDQCqhASCV0ACQSmgASCU0AKQSGgBSCQ0AqYQGgFRCA0AqoQEgldAAkEpoAEglNACkEhoAUgkNAKmEBoBUQgNAKqEBIJXQAJBKaABIJTQApBIaAFIJDQCphAaAVCcUPQA4dnY9eF7REwY4a8mWoicc1MRYUPSEAXbPX1P0hH563uuLzy/77Pu5ogEgldAAkEpoAEglNACkEhoAUgkNAKmEBoBUQgNAKqEBIJXQAJBKaABIJTQApBIaAFJVFJp9+/bF3XffHePHj48RI0bEhAkT4r777ou+vr6sfQDUuIq+JuD++++PNWvWxGOPPRZTpkyJF198MW666aZobGyMRYsWZW0EoIZVFJo///nP8dWvfjUuv/zyiIg488wzY/369fHiiy+mjAOg9lX0q7O5c+fG008/HTt37oyIiJdffjmee+65uOyyyw75mN7e3ujp6el3A+D4UdEVzZ133hnd3d0xadKkqKuri/3798eKFSvi2muvPeRjWltb49577z3ioQDUpoquaDo6OmLt2rWxbt26eOmll+Kxxx6Ln/zkJ/HYY48d8jHLly+P7u7uA7eurq4jHg1A7ajoiuaOO+6IZcuWxTXXXBMREeecc068/vrr0draGjfeeONBH1MqlaJUKh35UgBqUkVXNB9++GEMH97/IXV1dd7eDMAhVXRFc+WVV8aKFSvijDPOiClTpsS2bdvigQceiJtvvjlrHwA1rqLQPPTQQ/Hd7343Fi5cGHv37o0xY8bELbfcEt/73vey9gFQ4yoKTUNDQ6xatSpWrVqVNAeAocZnnQGQSmgASCU0AKQSGgBSCQ0AqYQGgFRCA0AqoQEgldAAkEpoAEglNACkEhoAUlX0oZoAR9uuB88resJBnbVkS9ETBpgYC4qe0E/fRx9FxN2feT9XNACkEhoAUgkNAKmEBoBUQgNAKqEBIJXQAJBKaABIJTQApBIaAFIJDQCphAaAVEIDQCqhASCV0ACQSmgASCU0AKQSGgBSCQ0AqYQGgFRCA0AqoQEgldAAkEpoAEglNACkEhoAUgkNAKmEBoBUQgNAKqEBIJXQAJBKaABIJTQApBIaAFIJDQCpTjjWT1gulyMiou+jj471UwMM2r7y/xU9YYBq+7n5yZ5Pfq4fyrDyZ93jKHvjjTeiubn5WD4lAIm6urpi7Nixh/z3xzw0fX198dZbb0VDQ0MMGzbssP87PT090dzcHF1dXTFy5MijuHDoca4Gx3kaHOdp8Ib6uSqXy/Hee+/FmDFjYvjwQ78Sc8x/dTZ8+PBPLV+lRo4cOST/B2ZwrgbHeRoc52nwhvK5amxs/Mz7eDMAAKmEBoBUNRuaUqkU3//+96NUKhU9peo5V4PjPA2O8zR4ztW/HPM3AwBwfKnZKxoAaoPQAJBKaABIJTQApBIaAFIJDQCphAaAVEIDQKr/B53kztAVSYWIAAAAAElFTkSuQmCC"/> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=526706d5"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p>Finally, we are going to use the forward Euler method to simulate this differential equation for a total of 5 seconds over 1000 iterations. This has already been implemented in the <code>test</code> method.</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=9f128b80"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 2.4:</b> +Find the time it takes to evaluate the relationship using <code>timeit</code> by entering the function you wish to evaluate as a string. +<p>HINT: you have already learned how to convert a matrix into a sparse format, and the function is defined for you. Run the code cell and compare the performances of the different matrix formats. Which one is faster? How much space do they take?</p> +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell" id="cell-id=0a8f83b9"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"> +<div class="jp-InputPrompt jp-InputArea-prompt">In [ ]:</div> +<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline"> +<div class="cm-editor cm-s-jupyter"> +<div class="highlight hl-ipython3"><pre><span></span><span class="c1"># N_ITS = 1000</span> +<span class="c1"># T = 5 # Seconds</span> +<span class="c1"># dt = T/N_ITS</span> + +<span class="c1"># def test(rel_matrix):</span> +<span class="c1"># state = np.zeros(N)</span> +<span class="c1"># state[0] = 1</span> +<span class="c1"># for i in range(N_ITS):</span> +<span class="c1"># state = state + rel_matrix @ state * dt</span> + +<span class="c1"># csr_matrix = YOUR_CODE_HERE</span> +<span class="c1"># bsr_matrix = YOUR_CODE_HERE</span> +<span class="c1"># print(f"Standard: {timeit.timeit('test(relationship)',</span> +<span class="c1"># globals=globals(),</span> +<span class="c1"># number=10)/10:.4f}")</span> +<span class="c1"># print(f"CSR: {timeit.timeit('test(csr_matrix)',</span> +<span class="c1"># globals=globals(),</span> +<span class="c1"># number=10)/10:.4f}")</span> +<span class="c1"># print(f"BSR: {timeit.timeit('test(bsr_matrix)',</span> +<span class="c1"># globals=globals(),</span> +<span class="c1"># number=10)/10:.4f}")</span> + + +<span class="c1"># SOLUTION</span> +<span class="n">N_ITS</span> <span class="o">=</span> <span class="mi">1000</span> +<span class="n">T</span> <span class="o">=</span> <span class="mi">5</span> <span class="c1"># Seconds</span> +<span class="n">dt</span> <span class="o">=</span> <span class="n">T</span><span class="o">/</span><span class="n">N_ITS</span> + +<span class="k">def</span> <span class="nf">test</span><span class="p">(</span><span class="n">rel_matrix</span><span class="p">):</span> + <span class="n">state</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">N</span><span class="p">)</span> + <span class="n">state</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span> + <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">N_ITS</span><span class="p">):</span> + <span class="n">state</span> <span class="o">=</span> <span class="n">state</span> <span class="o">+</span> <span class="n">rel_matrix</span> <span class="o">@</span> <span class="n">state</span> <span class="o">*</span> <span class="n">dt</span> + +<span class="n">csr_matrix</span> <span class="o">=</span> <span class="n">sparse</span><span class="o">.</span><span class="n">csr_array</span><span class="p">(</span><span class="n">relationship</span><span class="p">)</span> +<span class="n">bsr_matrix</span> <span class="o">=</span> <span class="n">sparse</span><span class="o">.</span><span class="n">bsr_array</span><span class="p">(</span><span class="n">relationship</span><span class="p">)</span> +<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Standard: </span><span class="si">{</span><span class="n">timeit</span><span class="o">.</span><span class="n">timeit</span><span class="p">(</span><span class="s1">'test(relationship)'</span><span class="p">,</span> +<span class="w"> </span><span class="nb">globals</span><span class="o">=</span><span class="nb">globals</span><span class="p">(),</span> +<span class="w"> </span><span class="n">number</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span><span class="o">/</span><span class="mi">10</span><span class="si">:</span><span class="s2">.4f</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span> +<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"CSR: </span><span class="si">{</span><span class="n">timeit</span><span class="o">.</span><span class="n">timeit</span><span class="p">(</span><span class="s1">'test(csr_matrix)'</span><span class="p">,</span> +<span class="w"> </span><span class="nb">globals</span><span class="o">=</span><span class="nb">globals</span><span class="p">(),</span> +<span class="w"> </span><span class="n">number</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span><span class="o">/</span><span class="mi">10</span><span class="si">:</span><span class="s2">.4f</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span> +<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"BSR: </span><span class="si">{</span><span class="n">timeit</span><span class="o">.</span><span class="n">timeit</span><span class="p">(</span><span class="s1">'test(bsr_matrix)'</span><span class="p">,</span> +<span class="w"> </span><span class="nb">globals</span><span class="o">=</span><span class="nb">globals</span><span class="p">(),</span> +<span class="w"> </span><span class="n">number</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span><span class="o">/</span><span class="mi">10</span><span class="si">:</span><span class="s2">.4f</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +<div class="jp-Cell-outputWrapper"> +<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser"> +</div> +<div class="jp-OutputArea jp-Cell-outputArea"> +<div class="jp-OutputArea-child"> +<div class="jp-OutputPrompt jp-OutputArea-prompt"></div> +<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain" tabindex="0"> +<pre>Standard: 0.0853 +CSR: 0.0096 +BSR: 0.0110 +BSR: 0.0110 +</pre> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=a843ae4f"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#AABAB2; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Task 2.5:</b> +<p>What is the change in performance by using the sparse matrices?</p> +</p> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=50d74c04"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p><em>Your answer here.</em></p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=7d572557"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<div style="background-color:#FAE99E; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"> +<p> +<b>Solution:</b> +<p>As we can see in the output, the sparse methods perform similarly, each around 10x faster than the non-sparse method.</p> +</p> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=920bab21"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p>One final consideration when using sparse matrices is that it can take a long time to generate them from a regular matrix. You can test this out by placing the matrix generation inside or outside the <code>timeit</code> code to compare their performances. Try it!</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=bf4fdf38"> +<div class="jp-Cell-inputWrapper" tabindex="0"> +<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser"> +</div> +<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt"> +</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown"> +<p><strong>End of notebook.</strong></p> +<h2 style="height: 60px"> +</h2> +<h3 style="position: absolute; display: flex; flex-grow: 0; flex-shrink: 0; flex-direction: row-reverse; bottom: 60px; right: 50px; margin: 0; border: 0"> +<style> + .markdown {width:100%; position: relative} + article { position: relative } + </style> +<a href="http://creativecommons.org/licenses/by/4.0/" rel="license"> +<img alt="Creative Commons License" src="https://i.creativecommons.org/l/by/4.0/88x31.png" style="border-width:; width:88px; height:auto; padding-top:10px"> +</img></a> +<a href="https://www.tudelft.nl/en/ceg" rel="TU Delft"> +<img alt="TU Delft" src="https://gitlab.tudelft.nl/mude/public/-/raw/main/tu-logo/TU_P1_full-color.png" style="border-width:0; width:100px; height:auto; padding-bottom:0px"/> +</a> +<a href="http://mude.citg.tudelft.nl/" rel="MUDE"> +<img alt="MUDE" src="https://gitlab.tudelft.nl/mude/public/-/raw/main/mude-logo/MUDE_Logo-small.png" style="border-width:0; width:100px; height:auto; padding-bottom:0px"/> +</a> +</h3> +<span style="font-size: 75%"> +© Copyright 2024 <a href="http://mude.citg.tudelft.nl/" rel="MUDE">MUDE</a> TU Delft. This work is licensed under a <a href="http://creativecommons.org/licenses/by/4.0/" rel="license">CC BY 4.0 License</a>. + +</span></div> +</div> +</div> +</div> +</main> +</body> +<script type="application/vnd.jupyter.widget-state+json"> +{"state": {}, "version_major": 2, "version_minor": 0} +</script> +</html> diff --git a/src/teachers/Week_2_2/README.html b/src/teachers/Week_2_2/README.html new file mode 100644 index 0000000000000000000000000000000000000000..fbbb5968879d663d50d8962649bcdf262631f726 --- /dev/null +++ b/src/teachers/Week_2_2/README.html @@ -0,0 +1,382 @@ +<!DOCTYPE html> +<html> +<head> +<title>README.md</title> +<meta http-equiv="Content-type" content="text/html;charset=UTF-8"> + +<style> +/* https://github.com/microsoft/vscode/blob/master/extensions/markdown-language-features/media/markdown.css */ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +body { + font-family: var(--vscode-markdown-font-family, -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", sans-serif); + font-size: var(--vscode-markdown-font-size, 14px); + padding: 0 26px; + line-height: var(--vscode-markdown-line-height, 22px); + word-wrap: break-word; +} + +#code-csp-warning { + position: fixed; + top: 0; + right: 0; + color: white; + margin: 16px; + text-align: center; + font-size: 12px; + font-family: sans-serif; + background-color:#444444; + cursor: pointer; + padding: 6px; + box-shadow: 1px 1px 1px rgba(0,0,0,.25); +} + +#code-csp-warning:hover { + text-decoration: none; + background-color:#007acc; + box-shadow: 2px 2px 2px rgba(0,0,0,.25); +} + +body.scrollBeyondLastLine { + margin-bottom: calc(100vh - 22px); +} + +body.showEditorSelection .code-line { + position: relative; +} + +body.showEditorSelection .code-active-line:before, +body.showEditorSelection .code-line:hover:before { + content: ""; + display: block; + position: absolute; + top: 0; + left: -12px; + height: 100%; +} + +body.showEditorSelection li.code-active-line:before, +body.showEditorSelection li.code-line:hover:before { + left: -30px; +} + +.vscode-light.showEditorSelection .code-active-line:before { + border-left: 3px solid rgba(0, 0, 0, 0.15); +} + +.vscode-light.showEditorSelection .code-line:hover:before { + border-left: 3px solid rgba(0, 0, 0, 0.40); +} + +.vscode-light.showEditorSelection .code-line .code-line:hover:before { + border-left: none; +} + +.vscode-dark.showEditorSelection .code-active-line:before { + border-left: 3px solid rgba(255, 255, 255, 0.4); +} + +.vscode-dark.showEditorSelection .code-line:hover:before { + border-left: 3px solid rgba(255, 255, 255, 0.60); +} + +.vscode-dark.showEditorSelection .code-line .code-line:hover:before { + border-left: none; +} + +.vscode-high-contrast.showEditorSelection .code-active-line:before { + border-left: 3px solid rgba(255, 160, 0, 0.7); +} + +.vscode-high-contrast.showEditorSelection .code-line:hover:before { + border-left: 3px solid rgba(255, 160, 0, 1); +} + +.vscode-high-contrast.showEditorSelection .code-line .code-line:hover:before { + border-left: none; +} + +img { + max-width: 100%; + max-height: 100%; +} + +a { + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +a:focus, +input:focus, +select:focus, +textarea:focus { + outline: 1px solid -webkit-focus-ring-color; + outline-offset: -1px; +} + +hr { + border: 0; + height: 2px; + border-bottom: 2px solid; +} + +h1 { + padding-bottom: 0.3em; + line-height: 1.2; + border-bottom-width: 1px; + border-bottom-style: solid; +} + +h1, h2, h3 { + font-weight: normal; +} + +table { + border-collapse: collapse; +} + +table > thead > tr > th { + text-align: left; + border-bottom: 1px solid; +} + +table > thead > tr > th, +table > thead > tr > td, +table > tbody > tr > th, +table > tbody > tr > td { + padding: 5px 10px; +} + +table > tbody > tr + tr > td { + border-top: 1px solid; +} + +blockquote { + margin: 0 7px 0 5px; + padding: 0 16px 0 10px; + border-left-width: 5px; + border-left-style: solid; +} + +code { + font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback"; + font-size: 1em; + line-height: 1.357em; +} + +body.wordWrap pre { + white-space: pre-wrap; +} + +pre:not(.hljs), +pre.hljs code > div { + padding: 16px; + border-radius: 3px; + overflow: auto; +} + +pre code { + color: var(--vscode-editor-foreground); + tab-size: 4; +} + +/** Theming */ + +.vscode-light pre { + background-color: rgba(220, 220, 220, 0.4); +} + +.vscode-dark pre { + background-color: rgba(10, 10, 10, 0.4); +} + +.vscode-high-contrast pre { + background-color: rgb(0, 0, 0); +} + +.vscode-high-contrast h1 { + border-color: rgb(0, 0, 0); +} + +.vscode-light table > thead > tr > th { + border-color: rgba(0, 0, 0, 0.69); +} + +.vscode-dark table > thead > tr > th { + border-color: rgba(255, 255, 255, 0.69); +} + +.vscode-light h1, +.vscode-light hr, +.vscode-light table > tbody > tr + tr > td { + border-color: rgba(0, 0, 0, 0.18); +} + +.vscode-dark h1, +.vscode-dark hr, +.vscode-dark table > tbody > tr + tr > td { + border-color: rgba(255, 255, 255, 0.18); +} + +</style> + +<style> +/* Tomorrow Theme */ +/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ + +/* Tomorrow Comment */ +.hljs-comment, +.hljs-quote { + color: #8e908c; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-tag, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class, +.hljs-regexp, +.hljs-deletion { + color: #c82829; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params, +.hljs-meta, +.hljs-link { + color: #f5871f; +} + +/* Tomorrow Yellow */ +.hljs-attribute { + color: #eab700; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet, +.hljs-addition { + color: #718c00; +} + +/* Tomorrow Blue */ +.hljs-title, +.hljs-section { + color: #4271ae; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #8959a8; +} + +.hljs { + display: block; + overflow-x: auto; + color: #4d4d4c; + padding: 0.5em; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} +</style> + +<style> +/* + * Markdown PDF CSS + */ + + body { + font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", sans-serif, "Meiryo"; + padding: 0 12px; +} + +pre { + background-color: #f8f8f8; + border: 1px solid #cccccc; + border-radius: 3px; + overflow-x: auto; + white-space: pre-wrap; + overflow-wrap: break-word; +} + +pre:not(.hljs) { + padding: 23px; + line-height: 19px; +} + +blockquote { + background: rgba(127, 127, 127, 0.1); + border-color: rgba(0, 122, 204, 0.5); +} + +.emoji { + height: 1.4em; +} + +code { + font-size: 14px; + line-height: 19px; +} + +/* for inline code */ +:not(pre):not(.hljs) > code { + color: #C9AE75; /* Change the old color so it seems less like an error */ + font-size: inherit; +} + +/* Page Break : use <div class="page"/> to insert page break +-------------------------------------------------------- */ +.page { + page-break-after: always; +} + +</style> + +<script src="https://unpkg.com/mermaid/dist/mermaid.min.js"></script> +</head> +<body> + <script> + mermaid.initialize({ + startOnLoad: true, + theme: document.body.classList.contains('vscode-dark') || document.body.classList.contains('vscode-high-contrast') + ? 'dark' + : 'default' + }); + </script> +<h1 id="pa-22-love-is-sparse">PA 2.2: Love is Sparse</h1> +<p><em><a href="http://mude.citg.tudelft.nl/">CEGM1000 MUDE</a>: Week 2.2. Due: before Friday, November 22nd, 2024.</em></p> +<p><em>You can access this assignment with the following link: <a href="https://classroom.github.com/a/yyIrSrxc">classroom.github.com/a/yyIrSrxc</a>.</em></p> +<p>This assignment will introduce you to the concept of sparse matrices in Python and how they can be useful to speed up computations and reduce file sizes. This is especially important when using the numerical schemes we are learning about (FDM, FVM, FEM) to solve problems with a lot of unknowns at each time step. To accomplish this, we will be using the <code>scipy.sparse</code> library.</p> +<p>The instructions and technical content for this PA are included in the attached notebook file. Enjoy!</p> +<h2 id="grading-criteria">Grading Criteria</h2> +<p>You will pass this PA if:</p> +<ol> +<li>Your notebook <code>PA_2_2_love_is_sparse.ipynb</code> runs without errors.</li> +</ol> +<p><strong>End of file.</strong></p> +<span style="font-size: 75%"> +© Copyright 2024 <a rel="MUDE" href="http://mude.citg.tudelft.nl/">MUDE</a>, TU Delft. This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">CC BY 4.0 License</a>. +</body> +</html>