diff --git a/content/Week_2_5/README_TEACHERS.md b/content/Week_2_5/README_TEACHERS.md new file mode 100644 index 0000000000000000000000000000000000000000..d24d9f77408929fb0af2a008bf85431c1700edbb --- /dev/null +++ b/content/Week_2_5/README_TEACHERS.md @@ -0,0 +1,9 @@ +# README for teachers in optimization week + +Overview, in order of when students will do each activity: +1. Programming Assignment 2.4A (PA 2.4A): install Gurobi (Week 2.4 - start Mon Dec 2). +2. Programming Assignment 2.5 (PA 2.5): **this is new in 2024** a small assignment to make sure they know how Gurobi works (Week 2.5 - start Mon Dec 9). +3. Workshop 2.5 (WS 2.5), Wednesday, 10:30-12:30. Planet versus Profit exercise. The solution is [here](https://mude.citg.tudelft.nl/2024/files/teachers/Week_2_5/WS_2_5_solution.html); student version is generated from this file (`# SOLUTION` blocks removed). +4. Group Assignment 2.5 (GA 2.5), Friday, 8:30-12:30. Traffic Network Problem. See [this folder](https://mude.citg.tudelft.nl/2024/files/teachers/GA_2_5/); start with README. + +Source code for all files can be found in GitLab in the `2024-files` repo in the MUDE Group: [gitlab.tudelft.nl/mude/2024-file](https://gitlab.tudelft.nl/mude/2024-files). Within this repo, files will be in the relevant subdirectory in `2024-files/content/.`. Message Robert or Jialei on Teams if you need access (log in to [gitlab.tudelft.nl](https://gitlab.tudelft.nl/) first, if you have never done so). \ No newline at end of file diff --git a/src/teachers/GA_2_5/Analysis_GA_solution.html b/src/teachers/GA_2_5/Analysis_GA_solution.html new file mode 100644 index 0000000000000000000000000000000000000000..b9eeed0f228e81c37fef01a1ab97edc3497b88d9 --- /dev/null +++ b/src/teachers/GA_2_5/Analysis_GA_solution.html @@ -0,0 +1,8455 @@ +<!DOCTYPE html> + +<html lang="en"> +<head><meta charset="utf-8"/> +<meta content="width=device-width, initial-scale=1.0" name="viewport"/> +<title>Analysis_GA_solution</title><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.min.js"></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"> +<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="Evolve-and-drive">Evolve and drive<a class="anchor-link" href="#Evolve-and-drive">¶</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.5. For: 15 December, 2023.</em></p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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:#ffa6a6; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"><p><b>Note:</b> during the in-class session some of the confusion was caused by code issues. Comments relevant to the code and notebooks as-used in the Friday in-class session are provided in boxes like this.</p></div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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="Introduction">Introduction<a class="anchor-link" href="#Introduction">¶</a></h2><p><em>Note: part of the background material for this project was already available in <a href="https://mude.citg.tudelft.nl/2023/book/optimization/project.html">Chapter 5.11 of the textbook</a>.</em></p> +<ul> +<li>We showed in the previous notebook how to use MILP to solve the Road Network Design (RND) Problem</li> +<li>You saw that due to a large number of binary variables it takes long to reach a low gap</li> +<li>Think about larger problems, like the road network of Amsterdam or Shanghai, and it will be even harder!</li> +<li>Here we show how a metaheuristic such a the genetic algorithm can be used to find good (not necessarily optimal) solutions for the problem in potentially less time</li> +</ul> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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="Libraries">Libraries<a class="anchor-link" href="#Libraries">¶</a></h2><p>To run this notebook you need to have installed the following packages: +Pandas +Numpy +Matplotlib +Gurobipy +PyMOO</p> +<p>Luckily, they're all part of this weeks environment!</p> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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">pandas</span> <span class="k">as</span> <span class="nn">pd</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">gurobipy</span> <span class="k">as</span> <span class="nn">gp</span> +<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span> + +<span class="c1">#if you did not install pymoo yet, run the following in your Anaconda Prompt: conda install -c anaconda autograd</span> + +<span class="c1"># Genetic algorithm dependencies. We are importing the pymoo functions that are imporant for applying GA (the package can also apply other methods)</span> +<span class="kn">from</span> <span class="nn">pymoo.algorithms.soo.nonconvex.ga</span> <span class="kn">import</span> <span class="n">GA</span> +<span class="kn">from</span> <span class="nn">pymoo.core.problem</span> <span class="kn">import</span> <span class="n">ElementwiseProblem</span> +<span class="kn">from</span> <span class="nn">pymoo.optimize</span> <span class="kn">import</span> <span class="n">minimize</span> +<span class="kn">from</span> <span class="nn">pymoo.operators.sampling.rnd</span> <span class="kn">import</span> <span class="n">BinaryRandomSampling</span> +<span class="kn">from</span> <span class="nn">pymoo.operators.crossover.hux</span> <span class="kn">import</span> <span class="n">HalfUniformCrossover</span> <span class="c1">#</span> +<span class="kn">from</span> <span class="nn">pymoo.operators.mutation.bitflip</span> <span class="kn">import</span> <span class="n">BitflipMutation</span> + +<span class="c1"># not used here but generally useful dependencies</span> +<span class="c1">#from pymoo.core.problem import Problem</span> +<span class="c1">#from pymoo.operators.mutation.pm import PolynomialMutation</span> +<span class="c1">#from pymoo.operators.crossover.pntx import PointCrossover #</span> +<span class="c1">#from pymoo.operators.crossover.sbx import SBX</span> +<span class="c1">#from pymoo.operators.crossover.sbx import SimulatedBinaryCrossover</span> +<span class="c1">#from pymoo.operators.crossover.pntx import Crossover</span> +<span class="c1">#from pymoo.operators.repair.bounds_repair import BoundsRepair</span> +<span class="c1">#from pymoo.core.repair import Repair</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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:#ffa6a6; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"><p><b>Note:</b> the intention with the commented lines above was to illustrate possible crossover methods you could use, but unfortunately the pymoo documentation was not clear enough to indicate how they could have been used. The methods <code>SinglePointCrossover</code> and <code>TwoPointCrossover</code> (n<em>not</em> listed above!) could have been easily used, as these methods require no additional keyword arguments and would have worked “out of the box;†they were also illustrated with examples in the online textbook. We apologize for this oversight on our part.</p></div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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"># For visualization</span> +<span class="kn">from</span> <span class="nn">utils.network_visualization</span> <span class="kn">import</span> <span class="n">network_visualization</span> +<span class="kn">from</span> <span class="nn">utils.network_visualization_highlight_link</span> <span class="kn">import</span> <span class="n">network_visualization_highlight_links</span> +<span class="kn">from</span> <span class="nn">utils.network_visualization_upgraded</span> <span class="kn">import</span> <span class="n">network_visualization_upgraded</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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="Genetic-algorithm-for-NDP">Genetic algorithm for NDP<a class="anchor-link" href="#Genetic-algorithm-for-NDP">¶</a></h2><p>As we discussed, it is challenging to use MILP for large-scale NDPs. Therefore, in this assignment, we’re going to use a genetic algorithm to address this problem.</p> +<p>Genetic Algorithms (GAs) are powerful optimization techniques inspired by the process of natural evolution. They have gained prominence in solving complex problems across various fields, ranging from engineering and economics to artificial intelligence. Here, we give a brief overview of Genetic Algorithms, highlighting their fundamental principles, components, and applications in solving optimization problems. +At the heart of a Genetic Algorithm are populations of potential solutions, represented as individuals or chromosomes. These individuals evolve over generations to improve their fitness with respect to the given optimization objective. +Basic Components of a Genetic Algorithm:</p> +<ul> +<li><strong>Population</strong>: A collection of individuals representing potential solutions to the problem.</li> +<li><strong>Objective Function</strong> (or fitness function): Quantifies the quality of each individual’s solution with respect to the optimization objective.</li> +<li><strong>Selection</strong>: Individuals are chosen based on their fitness to serve as parents for the next generation.</li> +<li><strong>Crossover</strong>: Genetic material from parents is combined to create offspring with potentially improved traits.</li> +<li><strong>Mutation</strong>: Random changes are introduced in offspring to maintain diversity and explore new solution spaces.</li> +<li><strong>Replacement</strong>: New offspring replace some of the least fit individuals in the population.</li> +<li><strong>Termination Criteria</strong>: Conditions under which the algorithm stops, e.g., a maximum number of generations or satisfactory fitness level.</li> +</ul> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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"> +<h3 id="GA-steps">GA steps<a class="anchor-link" href="#GA-steps">¶</a></h3><p>Reminding you about the GA steps …</p> +<ul> +<li>Initialization (start): A population of random individuals is generated to start the algorithm.</li> +<li>Evaluation (fitness assessment): The fitness function assesses the quality of each individual’s solution.</li> +<li>Selection: Individuals with higher fitness have a higher chance of being selected as parents.</li> +<li>Crossover: Genetic material (part of the solutions) from selected parents is combined to create offspring.</li> +<li>Mutation: Random changes are introduced to some offspring to maintain diversity.</li> +<li>Replacement: New offspring replace some individuals in the population.</li> +<li>Termination (end): The algorithm stops when a termination criterion is met.</li> +</ul> +<p><img alt="image.png" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASMAAAFLCAYAAACdh+oaAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAOxAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUATWljcm9zb2Z0IE9mZmljZX/tNXEAAHJXSURBVHhe7V0HYFTFFj3pPSQkgRA6hBZ6Db03QUBFBBWxgIgVVARUpKlgB1FQURSlCKggCIiIFOm9994hgfRe/7mTXVzyE5JAyu4yT4fsvp03c+fMvPPuvXNnnv348eOhD42ARkAjUNQI2Be1ALp+jYBGQCMgCGgy0uNAI6ARMAsENBmZRTdoITQCGgFNRnoMaATMCIGxY8e6BwUFebm4uLg7Ozu7UDQ7prSUlJQEptjTp09HDhs2LMKMRM43UTQZ5RuUuiCNQN4QWLp0aRlvb+8Gnp6ejT08PGq5u7tXGjFiREkSUTESkbOTkxPs7OyQlpaGxMREJCQkJDFFXecRGxt7Jioq6nBMTMyu+Pj4Xe3btz+et9rNL7cmI/PrEy2RFSOwZs2aoGLFij1QsmTJbjwaBAYGulSoUAH8DpISXF1d4eDgoEjI1tYWNjY2SE9PVyk1NdUxOTnZl+TjGx0dXT00NPS+8+fP48SJE6mXL18+yO9/kacWt2vXbqslQqjJyBJ7TctscQhs2bLlAX9//yEdOnTo1KRJE9uqVavC19cX1IJUW0g0NxPNMZB0bmmjkJIc8pcaFEhoEBJr3LgxkpKS7MLCwuqeOnWq7s6dO0ccP358G8npu2XLls1h6E6CpYClychSekrLaZEIbNq0qWvZsmXH9urVq2mrVq1Qvnx5ODo6KrKRRFPrrtslBOXl5YVmzZopcrpy5Urwtm3bgsuVKzdix44dk3juh7uupBAK0GRUCCDrKu49BFatWlW8TJkykzt16jSge/fuioTE1KLPR6X8PkSzMpZbokQJPPTQQ2jevHmVf/755/t///33cZpzL9J8O5bf9eZneZqM8hNNXZZGgAhs2LChUe3atX8mIQQGBwcrTOhoVmRk9AEZ/xpNL9PfjCBml0d+v13+uLg4VYRoS/369QNl6TB//vzt1JaeoTy/mWsnaTIy157RclkkAvQNtefNv+Spp55yr1SpEjjrpWbDiuKgo1tpS9WrV8fLL7/sOXv27F9ptj1Ps+3ropAnpzo1GeWEkP5dI5BLBNauXVunXr16SwcPHuwms2MRERFKEzJqMtlpQVlpS6Z5M1+Xk2ZkWqd8Fr8UQwcwcOBAkeerzZs3X6d/6ddcNqvQsmkyKjSodUXWjABjhlxJRL88/vjjbn5+fuDUu1k1V0w3hi4ps40zbz+SOPfQh3TKnITUZGROvaFlsVgE6KAe1aVLl6oy3Z4XIhLfj729vZqul7gimdY3Xi/fc2Pi5TafmIziR+LMnuu1a9c+J9j3mxPgmozMqTe0LBaJgMycNWrUaGj9+vVv+oiMDmZjg+R7VmaaRFkLSXz//fe4evUqWA5IaoqUJOpaiMZ4nSk4xvLld8YZqZ/ks2m9mR3mkkcc6Qy0RM2aNbuvW7euIcMNdpkL6JqMzKUntBwWi4CPj0+3unXrekoAo3EmKzeNkShrIYeXXnoJDANA5cqVMXToUHzyySeKMObMmYOPPvpIEYwQjkRmi1Na/EASqS3XHzt2DJ999pm6RgjMSHq3q1/inIQ49+/f/zjzaTLKTWfpPBoBS0DAzc2tNQMbFRlIvI/RgZyT7GKaLVq0CLKkY8mSJWA5YKCicny///774KJY9dsff/yBPXv2KJ/Pm2++efOcEBSXgGD79u04evQoatSokWMMk5CVaFwSi8Qo7mY5yViYv2vNqDDR1nVZJQLUiMqKpiIR1bnx8RhBkGn3Bg0aKPNK4pGETJ599lncf//9+Pnnn/HMM8/gwoULOHv2LN5++231G6fmsW/fPjCQEV9++SW+/vprSFBlxYoVFREJGeZ0iJxiHlLuUtwlwJ5LRlJyuqYwftdkVBgo6zqsHgEhIWPKTWNFexINSLShX3/9VWk+9D2Bs3FYsWKFMsm4jg0hISGKYL766iuVX0hn4cKFkO2iZXmJmGdCRqI1yRR+brQyyWNCmhmxB2ZwaDIyg07QIlg2AtRILonvR6b0jWZaTg5s0Uy4hgwvvviiMtFk+YYsnOVCV2WeySE+IW4pgkmTJilf1N69e9W6Nk7NK5/SwYMHlZkmi26NEd5CMpnjjDI7tUUTk/Lof7pGUrt1RW4RdoUmoyIEX1dtHQjwpt548eLFgTKtn1szTfw24rQWTYfR2uqvmGPDhw9XAYriKzpw4IDSnBjDpAhIfER0OqN06dIoXrw4WKcio127doHbkdycVcsJVSEjTu1LCIFZbTWiySinntO/awRyQIA39TJqKTEMenSXmKHc+G0kj+SdPHmyMtHE38PpduVYFi1n+vTpinBkpkyISX4TM000o4YNGyIyMlKR1syZM1U5eVl2Ij4j0apY3jxz6lxNRubUG1oWi0SAvpvrhw4dmnbkyJGRMmVujPvJqTGST7QUIRcxreS7kIx8Fq1JSEMISQjKOANmJDqZuZNDlp3Iucz7H2VXt4QfnDt3TkIC/uaSkG05yViYv2syKky0dV1WiwA3Nnufq/X7khwqCHkY44FyarCYdUZiMc0r18thDH40fs5cXl62IxGnuDi5udtkIrWil3OSrbB/12RU2Ijr+qwSgZ49e0Zz2r3PypUrN/Kzk5hQQhTmsFBWHNhCRKJ5cX8j8U0N4sp9s9vbSJORVd4aulFFgQBv8J10Jj9Eh/Oizp07OzEyW5lXuYmKLkh5ZeZOZs+4/AOHDx9+lb6tOQVZ352WrcnoTpHT12kEskCA/p8V1JA6UCv6mb6ksjLDJmQkPp3M0/0FCaBxAa44t7kftgRJxtMRPrhOnTpmSUSChSajghwRuux7EgFqSJvoP2pCbWQqY4D6cN2aWi1v9A8VtKYkBCRmmczKyTIRhgNs4lT+i5Rrnzl3iCYjc+4dLZvFIkCt6CqFf4SBig9y9moMSameBCrKWz2ELIzr2PKrgTIrJ+XKIVuQyIwZZ/fOMw7pQ74UcrqseTP3Q5ORufeQls+iEahVq9Zirv9a0pcHtZQhnG1rLavzJdrauPJeGijT86IxZQ6aNN16RPKJQ9yYjO9Vk2vEWS6BkRI4SbNsP2fLvuMri36kM/3uXz9SSD2gyaiQgNbV3LsIcMmFbIL9syRqSg1IGA9ytu0+akl1+S41e4klkkhrcTSLdiMkY9zHyBQ1I1mJViUzYxLoKIGQsqyEf4/RLPubIQG/kQDXsVy197UlHZqMLKm3tKwWjwBnsnazEZLeoaM7kMTUiP6dxlzoWpNkVJER1iX43YOf7YzEJCRkiDdKpyM8hkR0nbN055gO8/tummU7+MLGQyS9nJfsmzGCmozMuHO0aNaNAB3KJ9lCSfOlpTTnbFu0aOFFrcmbRORJAvLYvXv3DK5bGxcQEHCCWk80z0WsXr06PPMCV3l5o6UfmowsvQe1/FaDgMGcC2ODJKmDQZSR3EZkPX+7YjwnW4dY46HJyBp7VbfJKhCQjc/YEDsmd6toUA6N0GR0L/SybqNGwAIQ0GRkAZ2kRdQI3AsIaDK6F3pZt1EjYAEIaDKygE7SImoE7gUENBndC72s26gRsAAENBlZQCdpETUC9wICmozuhV7WbdQIWAACmowsoJO0iBqBewEBTUb3Qi/rNloqArLA1mxesljQIGoyKmiEdfkagTwiwMjrErykLpeA/M3PsjN/BP824d9InjO7vavz2Lxss2syyi8kdTkagfxDIIJFjSIBjeZfHybZKrYSU7P8q8L8StJkZH59oiW6xxGg9pNEIhpFGLYboJCNiQbz/HVrhkaTkTX3rm6bxSJA4tlBQlrGBtzPdIpplsU2JpeCazLKJVA6m0agCBAYyjo7Mo3MvH9REchS4FVqMipwiHUFhYXAw82P1vSwj60Xcu1GYVVZoPU8vKhV6sSZpw4/0rVUidJ+qx4v0MoKqXBfbw8kpnmfnb+9+qbMVWoyKqRO0NUUPAIpcbF9ytZvMLZERfp8UzPeRW/px8ypqgXTLb0dSn5bOzg5xuHQ7u1/8FtPTUZW0au6EVkhkJoYFQ/HCnDyaQ4ky4x4uiGbhOrIZ+NfOZ35XE555BpjGcbaTcs0hgNldc54bVb1ZnfO9HzmPKayGNuYUx5T+Yzy59RmU/yya0NmWUzDokzx4md7ZyDhNN+Asikmq/7TmpG+r60IAVukpybCJolv51FkpA+zQiAtCUiJy1YkTUZm1VtamLtGIJ1By+k00STpw7wQSOcOuunZv8BEk5F5dZeW5q4QsOXVRjKy6Lf23BUKZnuxekhkv8JFk5HZ9pwW7I4Q0JrRHcFWKBelycOCD4lsVttpMiqUXtCVFB4C2kwrPKzzWFM6yUibaXkETWe3UARksJOM0sQcEDNNz6bdOmso3Zrd7FtOWJleazoLZzyf+ZzpecNnRUZipmV9aM3IQm87LXZ2CORSMzKd5ddgFg4CymekHdiFA7aupegRUE9emUmTgW8Qx5R47Ph09nTlb/zRhj8kJgOxCQzI4+fbhSJlVgAkvz1nh5IMs3ZZhRlJgY4OgIsjNwHhlLbkMcoi9TvzvAPLiEvkqxr5N4U3qqcLEM2whDSRz6DIiFyO/N3FCYgylCO/e7AdTib6hJQjSWTLTmHJTjGS8txZdxrxM5ZhmteR9SRTPie2x54Yioy3qycLxSijQUJG4jv6/0NrRkV/+2gJ8g2BzLNphrspXYhGiEGGexqmfrwQ23efhK2tLYa/2B11GgbyBmQMzE1CYV4hLblcOcSFRPijHZPctHI6NR3XQ8Lg5+uRIb2NSX4jizjY4/zpS1iz8TCe6t+O96E4bw0Mw5t6z86jOHriEh7t2xo3Qm+gmKszvvpsOQY+2hauHiQGOYQcePOHXA7F6n8P4rFH+GrrVJ5zdcRfSzfhH5adxu/OJLynWE5g9dIkWBKkyC/XKlIzEK0iD36Xc0byNZIyy1u7agchskOLNrVJsiRpxR1Svx0iQsPgShLfs+kIzl8KQ59+lCNB8jCTtEswNh5yTuqQsv8DNSOP1ozybbTrgswZAfVozcZM482Xyv8eeuwTKgCOGDCwM7auO4C2vd7F+QNfwL1EMfW0T6WmY1fcHQnXIuEsWorcTHJTUYOJCYmEu5APiWTL6n34aNpy/L5wpPotkb85uTHC2JEkoIiN11HT+P3P7Vj612489Uo3pYElh8fAwZUajn069YNUePsXw8LfNmA9b/JpUwfD1ckOLi7UgpxtEXM1Au4+rM/dCavn78PPv2/FYwM7UMuKZflpGPPxr2jWsDKCGlXB9vUH0GfQFOzZ9gnLtkfU5XB4lvCktiXEKlqcLeJvRMPFm2/KFm1Ozhm1OuaX+j6fsQIPdW+EFp7BSLpwlWRtA/tiokUCzwz7Bm8N6wknVwe4inxuDkiLjkVCQhJcBTvRLkVzo3aXzM8Ogp1oWKZTZ+Izkv7J5tCakTnfXFq2vCNgOrVvaqZ5umPqB78hNiYeS/58h0/1JHRpWQ1lyvng4pnLGD9sBuKjE/Dumw9h1YYj2LLjBBJpws347BkqPTYYMXY+kklKNtQUPp3YHxM+XYwTp68h9FIoFvy+DeuoocSShD577zHUCCqryheTZPf+M+jToxGWzl2DH+dtoMKQznJTsHjuq9iw7SiqVA3Au58sVhrWb4s2wYHEdiMmDq+//A2SqNkkU/uY9d1LOHTsIloFV2GZQiRpuHH+KpffpWLKp0/RXCuNwOKuOHL8MmJuRODF4bMQKStjWNacmS/j66+WY8P2E0hie4p7ueO7b4bgzbdn44nezVC7YSUMHf4D3nihK+LjE9GpZXV8+eF8bNpyFFEk55cHd0Yyr/tnwyF0bhOEmPgkDOB1axZvxtRv/lLfH+reEC8825kE/zmtSVucPBeKfr2CMeSl+zLMOTmkL5Q2pn1GeR/U+grLRCDLOCPxDSVg8YpdeEs0lDj6XaihgKbQwJcfwrKfVuBfaiYrSVJLF2zE9j1n8OWMlzD0+emYMWs1unSuiyYNyqMTtYaeD36E+IgolCnlhaf7NceKv3bi9+U7MPOnVzHhrZ/wyRfL+PllkhFvwphYHD99Fa8/1xHvTl7Ga4ph3Lv90K7jBBw9eBqLVuzEt+0GoEyAFz5+52HMXbQNftSETp++iAZ1y6JrzyboxfouHT+HsxdCMOgxMY2ogTja4NTZqzh9juee/xoJJKUD+89h5uQn8fyw71C/Vlk8P7I3unceh0W//Itfl+3AA13qYiDJoVXrMVi9Yge27DqJN1/qgqtnr2DPgbOIoayixHh6uyCUux5MmPAIvvlqFZZSxheeaofg+hXx9KPN0KnPZ6hXoxRGvf8bFs56Cakkoz7Pfo2Gtcpg9fpD+PuPUdi55Rjbsh1Dhna9NRJePRw0GVnmjaWlziMC2URg0zeUFhmNqJgEBFUtSfOEN7SvKzas2Isw3kz7eDO+PqQTatcvhwH9dyKoWil8OHEBPGge1a9VGsdIKAePXMTBQxfgTIdxpfLFceVaOILrlcOg4bPhTVPm4w9+USZIa9FeSHywS8cNak2ibZTwccUNkt8Pn/WHQ3ISSlALSk5OhgNNJx9vZ6WB1aoZgKMfXUGPTrVx9NRVHD52id8XcZW7HbUmN1ylGVinun9G2R7O2Lj9GFo0rowH+zSGHTW6+uN6I5HtO3MhFLO/f44+JRv40dy8GhoBfz8PvDaMWgrN0wpliyti8yvuBm+Syh8/rkO1yiVw6coNlCMphhCnq6FR+OKbVVhHcnlvRE8cOHIeDeuURfiNSASU9MT6zUcVuVWqH4jLu4+hVMli2LnvNB6+vz5qNqmNlct3ok6NgAziMdWElM9IR2DncVDr7BaLQFaaUaoNbOnjsKGtMG/xNrw+sgf20wx54pUf8OPUAdh/+CJefqYN0q+EIJr+jkmj7ocDZ7qm/7Ce7iFbTJqwBJv+HYO5/H4lNBIR1IxCw2Lg6+NCUorE5HEPoXR5X0z4YBnu71yT/hNqXi4O2Lb7FIrRdxLOGzyF2otbWS/8s2QXPD2c1M0vN/bZ8yH0D9uSHxOYLw7h4VGY+PESbFw7Gr/M3YzLJKErV8No3qXBpzR9QCQ3pNnTbDqKXl3qoHuvRtymn1oeTbINf+5TpiIc0rFh0VZcvx6FKhV98ePCrUjnxN28b/+GG+VyZJvs6TOK4czcpC9W4um+TbFl5ynUJYG8/OosRSqdutXH6r/3o16QP8ZPXonOravTWX4EZUlYQrBCpEhPpN9qKTq0qEJNLQQ1hegRQ/PzBPr2bECLkrKarhFUEwJaM7LYe0sLnlcEsnBgq0kdW3z5QR+8MHIhVm8+Dlv6Y6Z92Adt2lbFTwu3oFbVErBxd8AzfYMx6I15vGkd0bdXfdTmzejt7YbXR8yFTQpnraipxMbFK7fskROXqVG1w9Axv1I7ckG7llVQvIQbtRfxF9ni2vVI9OgQhLDwaLRtXlk5ka+RzDq1qqLKkL/urvaI5c3999qDaEZTsG6d0ijO+oaP/FnJ6E6H8WHW06V1NV5vuJmjSIQ0p5o3LAdc50ZyMqtFQmscXIFajh8e7P05Na8UTJvyGDZvOI44lt+771TExybiu6n9ER0Wiy9IrC8NnA43N0e0Ca6Ieb/vQuumQdTAIvD7yv04cuwyvDydcflqOMqW8lSma7nS3mjdpCICA0vgyVfm4ECvj+Dn7UqtqxNeG7kArZpUoPl7g1qXK5rVp9+MbdRklNfxq/NbCQKGCN+bwXUmHmzO/LRoURl7V77KGy4KpTiLJeZOOrWKmZ8+kuFgjYjGWyO7YOC5RiQBJ7hRc5E4pHULhyCaJpBvWR8kcSbLkabaliUvqSn1xk0roEf7anDiOU9qDaDjWB2RyXi6D7UDaizpjM9p3qQ8QM3rsV51MuKTSGwqXocO7fW/PC8sQx9PDUUq6xYMofOY9ZX34exbHEOQqNlJPBE1MuXYYVjBj1MfzahHbnhhRvKRM+uaP2MALp67gdJsnw3JY+gb8/HpmB5o0iIQJWQWT8Ib/NywZTHlp7blQlNOyGzca51U3XVqdcO1KxEoKW3njGASzdimjcshkRqXtFE5oVnG+oXPI5xYBARSGyLZTRnfK0OO6Dh8+0mfDNnEpLxlal9O6tk0K7nZdDNyRuA2Edh00trwhisl5o7ExpCIVNiPMSZGCCk2BSX9eYPKOWogcji52DJxijtWiEjid1K4aSEJwoZ5WKZfSWpDMv0v5pLpIS4sEpGKwBHyUTE98tlgqki8JE/Z02xS9aWSUZLT4cj6fKU+lu2g6uO19DXdspJDzqk4nowy1CFBiSSLMuVItCSs9MvX6cMqjyZ1A1DCi0Qk8UfxrEPa5CpESGGEzIzRntSm5HrV/pSMGCJHByG/ZDg5S+wQfxfR45Lh4sYQBHfWI45v40wZ61SHUTajXEZMtJl26/jQ36wcAfFJ3G4/o8zbHGV1wxjjb4xQZdy/hhst01/5mjm/MW9W7pHM9UnezDJlVV/mbsvO9SLnDb8J7709khqPmHGKdEwO0zpMz5tcf9uRkvl6U3myk03IU/mMdAS2ld+FunkZg1wGfDbLQQwByAop4+fs/mbOI9+V78kEZ+N30/NZnTNem1W92Z0zPX87WUzJzbQtxjpjhJwNGpmpHHmRxdhmE6v3Fixu12bTa5Umpx3Y+k69ZxAwakYmg954E5neuJnP5SZP5pvZ9PvtyjbFPrf1ZK7rdtcZy89L2XmRPSvtMTfy/V8eTUb3zG2oGyrai97p0WzHgSwH4TKW7A69HMRse04LdmcImJBRVmZFducym2u3M41MNZGsTKPM54rSTMtKPqP8ObXZFKvs2mA8n12bTc00WUyszbQ7G9b6KktDQDZ8N5KRPIENd5NaUS6+JBOnUeZzOeYx3HWmq9NNy7x53qSezHlVEbmQ5SbZZSevqSwmNtQtZWfKYypf5vJvh8tNmU3YKFf1ZMZLcDGSkanj7b8xpjUjS7vftLzZI0AuupWMNFhmhYByYGszzaz6RAtTUAhw0wt5vNqJ8zqrOfSCqleXmysEbNkn4jZiD2WVX2tGuUJRZ7IEBBwcbZOuh8YmRMVmChC0BOGzkTE5Oc3R3t4m2cZGIiwt//DgGkE7e9ss37Cpycjy+1e3wICAq334jORozL8Sbh1vk718JcF+2Publ7Zp4v/iiwOCzlhFR6e7IN0BmoysojN1I7JFYM7mVtH8UZLVHJdDVif+vOz0+eqNn7xkNY3KpiFaM7L2Htbts1gExo4dK/enTEFxYZn1H5qMrL+PdQs1AhaBgCYji+gmLaRGwPoR0GRk/X2sW6gRsAgENBlZRDdpITUC1o+AJiPr72PdQo2ARSCgycgiukkLqRGwfgQ0GVl/H+sWagQsAgFNRhbRTVpIjYD1I6DJyPr7WLdQI2ARCGgysohu0kJqBKwfAU1G1t/HuoUaAYtAQJORRXSTFlIjYP0IaDKy/j7WLdQIWAQCmowsopu0kBoB60dAk5H197FuoUbAIhDQZGQR3aSF1AhYPwKajKy/j3ULNQIWgYAmI4voJi2kRsD6EdBkZP19rFuoEbAIBDQZWUQ3aSE1AtaPgCYj6+9j3UKNgEUgoMnIIrpJC6kRsH4ENBlZfx/rFloYAnxFkeP48eOTmFL4mW+DRpw0gZ+deC7RwpqTa3E1GeUaKp1RI1BoCHiReMaytjlMMUzV+PUN/p3JdKDQpCjkijQZFTLgujqNQE4IUPsJIfkkM99mpiimv5k28rzVEpFgoskop5Ghf9cIFA0Cohk9xVTMUP3QohGj8GrVZFR4WOuaNAK5RoBaUCS1o495wXtMi/h9b64vttCMmowstOO02PcEAp+wlU8zTbgXWmvWZNTdf6yrmx1+drSHV5JY0PowOwRsZa5HjlQ8Nf/q+DNFKaBNg0uPuRVzfi4mQk0+Wfzx3ornUq5fjLD39veYClyw+PZIA9w8XREXHfdP+u6y/0ewZk1G2AV7+5Y+nSt1mOKMNFcgPcUqOsR6GkEmcnBC+O5ROL3niEdRtys2MTKwaeW2rUs5VUVSqpXMgDdUqJYvamzzo357OwfEpIdi5cZfwrMiHvMmI9KPja1jFBxrOgPuQJpWj/JjUORfGSQjRxfEJrsiJYW6kVFLyr8K8lRSWkpaIpLs4ezsBVvE5+lanbngEXCAE+JTopGGtCxVV3MnIyKUThOAAyvdVmtGBT9e8lgD2SeF/ZOelsfrCi57KrXnJI6XpNQEykXZ5LChnPLZ+DercznlkWuMZRjFNy1TrjfNk1Xe3MpiLD87eTPXkzn/7WQxYpIXWUzLy3xdTm02uTadNJSSlpTtM8sCyKjgBq4u2foQSCcxppGQJBmoCDbCl8JJhr/qfsp0Lqc86p4zXHeTizKVY5onq7xZ1ZvdOdPzmfNkrucmF5m0KTtZjJjkRRbBxlheTrIY82bGS4qwlX6hAp3docnI+u7He7ZFtjTOSEVITU9VSR/mhUAa+yRNadFZ2/OajMyrv7Q0d4mAqWZ0l0Xpy/MZgVS6WtJv85DQZJTPgOviihYB8UuI30iewjfNNIqkzCbDX2VqZDqX+XvmPDfNDpPmmZZpfNZnde4WEycXshiryE5eU1luMbtMys6cx1S+zOXfDhcjDtm1Ibt6MuP1n5mWvX9Rk1HR3ju69nxFQJ68pKObZpqmo1tp15RSsqLk2527ezpKo2aUYaZlfWgyEm+/LWfqUk18DHby3QxmiEQ2SWk5yGIu8uYrsdxBYey2DJ9RhgM7r4cNsbYVLG8eJDZiL+fTCmE8qLrJn1KnNR7SL9pMy6Fn0xkkY+NAXk7mALazQyrDve2EoIzTkkU1Mlh/SnIy7CnTLYdMz7ow9EpkjI1DYnwiHCm/3DT3+nHTZySzNnlRjAicLfGMjY0n5hwPBiidnJ0YQ5UKN3cXODg6IDY6DjbGsPN8stPSKai9vV2GRseHourH29mVmW0jY6eb2prZ2U/Z2XU5YWWiGIn26erB2DLilJTAqXr10GQGo8xGeUy/C8mKZsT/zF4z4qJALwrpxwWBJwrthnJ3w6a1m/H0sHFY88vXKBNUBYe378V7U2Zi3owPuKcBCcrJEUhMAhIY0evqwm2uGPMk56QD4hnLIufkd9GsZJA6OWWQhJAbiUIRnIMD4+CZT0gkitvTCLlwYJNl2FReE81zkkeuT2CZziQaks2/K9dh/pJVmP4l10rKtXJdPOtn3oO7DyCcZdWpUQVvT/wCU98fARs3RqlLvSKPyMkbSckidZHUwButyAk2nzqX46UGizrJ8XIzElZ0mlt8RoaYGhtiLDeQ8a+IkPmcRzF3rPptLb7/dC68fIop7UTOdXm4Pc6fvIie/bti39ZD6PBAa0VOdtRihLziYuKpRKdCSMvJ2RFJfJDJw0F+cyGB2XKcxBkIzsXNWRGa3MCJTMbDTvqVc+JDer6GJm0a4sUxAxEVEa3KdGT+ZPZdQmwi7Bzs4MpxJG2JjYljeFc6HFmnoxPzJEq9SUqzc2W9QhBKNo5LZ1ep1/5mvU4uTup3e5aXEJcIZ36X9kp+wUW+23McxcclKMIROYRr7FlGIvM7ydj8cyP8/H0RWLOiaospnje5yIC54jH5nE4Nk4Qrs55ZHeZkpkVTwHkcZGf59yMOsrMNv0HcyTkFGNfLjty66wBOnLmA7xcsxZiPJmLTjn28lzm+/Urh1Nat2Lh1N1oEN0BgYAXs37kfdWpXx9WLVxDDwRBYsypJ4SAqlinFNTcSIZ6GsyfO4MKla7hw5RoevK8dXPx8EX31Gn6d/Rt8fb3Ro0cnxIZH4tKVEBw6coJPXDd07tYOIecukZPiULlqIC6cOQcnH29soWwuQijM8zflu3Q1BN07tIJLSV+8PWma+u3Tj97GEw93h62PD3av34Kdew+iTfNGqFa3Ji6dPIOwiCjsO3QM9WtVQ03KjgJa5FepFJJwNZ+YJnfFVGC2BRwv73Ks/CKX2Nrbp2VoRjK1b2KmGZ/6plpBpnM25IMNf21G+54tMXBkf0SFM1KYN/KVCyEIqFASs6b8jIM7jqBBq9oIvXoDF05dUqZbcPuG8PR2x8lDZ0lWB1GjflVUqxOobtCVv/ytbvYWXYLh618ce7ccxIkDp1C7SRAqVS+PJBKI0Gcxbw/M/nyhIj2/Uj4MDEyGs5sjju8/if3bD7MvA1EnOAjhoRFYsWAV3D3d0KxTY0WWx/adVHLValJDEUMCCWT5/L8UiUi9xUt4Y9eGfTh95BzqNa+F8lXK4NTR06qsiBtR6tzO9XtVvXWb1lTktm3NLly7FIJmHRsrYj5z/KzC4+KZy2jStoEi4mkTZqLTQ21RtW6ljNihrDA20abkIw1e9bC4I83IsOWlDy/mI7cASSFDOpFyEdO3TP1Z9zc/TsHcf6Yh78Z/7gYztYVU7Nx3GG+98jQWrViLMWNvYD8J4r52zbF51T/46LMZaNoqGI8+/xamTxqFV8d+ivW/f4cHnn4dNatVxofjXsWLb32I5QunK20plCTVsEt/DCA5nOXnv//dhonvjcJjT76KFi2DMWPe77h2PRw+Xp4Y/Mb7GPJsf8xfsATT+GTcRhKUp8eYj9/HW8+NQN+enRSp9ezSGpMnTMGpsxfgV9xLyfLTFxOw59BxvPRUH0yf/hPKlCqBSzciMP3buWhGeUW+NUt/wNB3PsbV0BtoXK8m3p38HXat/hnuJDZZu5Hfx7SVqDB+8dj/Hvf5XcH/lycbjcnDdCHHylb+fe/VWX2c//MZ5T7OSJTcuPhYnD91Ud2865ZtVGTStkdzzP96ERq0rIMDOw6rm339n5vwzXs/okf/Lvj7t3Vcr5SGEgG++PGzBSSqOnj/lc8w9us3sGzuKqVJ3CBxnTl+Dg1b1cWSn/5UN/+kV6fg43lj+QBz441th9PHTmPTqq2YMHMkvps0l5pWMrb+swsLZywloTTGJyO+xNtfvIqfpixEzUbVSHL/IDExEf5lS+DnaYtQr0UtvPviJxj/7Uj8+u1SeHi54+Lpy7hw9jKqk8j++mUNgnjdx8O/wJivh+P1fu+QaBrh1OGzmD11Aeq3qI0ZH2zBV8s+xpolG0hcZ+HlWwz/LPkXE1jmiP7jWG91kmcS5dqBnk92RXRkNIr5ePDBnaDIPzdHqkEzuiMy4kVeTFuYZOvLwvCqyepG4VhZdDk8JBbdk1JAm6gADg6CpOthOHvhMr75ZDS27T6E3+YtQlh4FKpWLocXho1Ftw4tUbdBLSz4+XecPncRgRXLYilNp2uhYejZuTW++HoOnnjoPriX8FXm2DZqSXWpLU3+9lNc2bsfTw4di9GjJ1GbaYnhEz5E41nTsGj5GvhR63njhQEY8e6ncLe3wb8bd+DStVA80bsbzbRwXOHnKpXKYtqsX5RGE0VzsFRJH5y7cIXqvw0C/P1QrVI5jBj+HPoPHI7q1No++/J7LP7hM/jVbIIDNOH+Wf2vasvCrz9AQNlS2LqT964iIVP1IP9wXbgNU1gabcxCO+QOoD2rjqZMyzYtPrincaPmSHOS4LrcE649zfEQaqpRETEI45hYt3yjMqdqNApEyOXrqNs8CBtWbsUzIx/FrzP+QOc+bTFhygjc4DgICw3HvC9/Q83G1VG9XiBW/boOR/cdVyZd3WY10evp+xBQviTmTPkVN66FoWqdyjwfBFsH+gNTkuDuVQzTn5+l6hNtJfTKdVri8Thx6BSuXriGspUD8Pa0YSSCROzeuJ/EUQsvTngGbh4uGPHYu2jTvZmqd+WCNTfrFa3p4ed6oHQFf3w7cQ5ljETNBtXQsmsTHD94UpHYB3PexrjnPqVJ5ojXP34egzqex95tBxS5PfvWExCTcsvqndi5YQ8J2gvvzRqJbf/sxi9sv5evB6rUqoSHB3dH+PWIXHe4inK/i9k0OjogBNHJQEi5rvgOMgrZPcHUjOk006dNy2ARzeFdd1BWzpew848dPKaeTJ7ly+CFJx/GKPpeqlUuj2SaMjTHUbNODVw8eBRd27fAfR1b4s81mzH9x18NmtQaeFLLGD3yBYCmELyL0azaj16d27BuH2zYtgdeNN2uhIThozGv8lwc1pB0hOgO8Uk4/HlpKk2ow8fRsnE97D96Eu3bN8flwyeQRNKwt7NX/gIxIecs+AM9e/fAfv4W3KA2Tpw+j2JiFlKTioiMoXkXg3KlS5GI6gHXTuJ6WDjdTk7w9HBDANuwdvFK+BQvBndqUIiOzRmbO8jx/qPk5U9x+A4uvdNLxOG2z3CxmGnvdhkc3MnW3qZ+WlpGnFFuDzvifJzmkw9vugk/vKHMJwf6TA5sP6qc1Skpycqf4l3CA6ePnkPfF3ri/PULuE6tp3r9QGUSValdQd3oDVrVQmDt8hjx+QvYsXYvPhg6FX2f74XHhz2E3Rv246fJC2jWeWDMjNeUrbFl9Q5larXr2Zwm2SHluzm6/wQ6PdIapSv547eZy+jrScZb01/Bu7PeoMa+E4u+X46HBnZThFSxRhnKfhKN29VD5Vrl8da0l2lm7cGklz/HgNf6kED70kzbj5kfzaWMlVCitA9NumpIoEZz6vAZDBz1KPZs2a/MsyvnrrK8cnB0tcfFs5fwwDNdScahqFyzAk1DF5LhPpZREYf3HEeZyqVoCierSPfcTpsYfUbZ9UtufEaiesfQLi/Qpx5VbTEFH2AaxfQl64sd4z/W+WQK6H0tgIM365pNO1DCt7hy8j74QBc8SW2oOJ9U1WtVp786EeXoC1pHH5AzTTDPwMrKhAso6YdHH+yqzKxfZnwIB5pcdMwof5GQRTzV+1KBM/HBl7PwzecT8PaEyZgxZxECymxRvpufvngXjbo+gbm/rUD6oj8RGRWLHvQZfTjtR8xb/Be++nYeKpQNwNGTZ1Gadf1FB3sqy65Ckvxg7yE0qhvEco7j8rXr2L5lFxWyFDRtUh+ffjMXy5YuwS/0TXWlXymaTlNvkc2O6vaG7ahUrnSGc72AyKhmKcQV9BgxHQUcLw/z+xmm/qxXzDQkxZ7sJlPH4i/KWA6S0xRRxnSPnYMtb7QD8A3wodmRqHwpHl5uSrvxKemFiPAIXLsYilNHzihNoEKN0jh5+LTKV61BJSR+lQTfUt64cj4EnsXdsYsazL5Nh/HsO4+TkPYgguNj9JMf4uWJT6ubPYYPEBu7dERTE5v61kw8O/oxmj6dlJk+oNkwRVq7/z2AJ994BNXqVVblfj3hJ2UONuvcEAe3H4MXiTGZZoNfGV/6KS/Cx9+LRLWdPqmzeHL4w9i5bh99W9fxzjMfY9iHg1Cuahk4ONvj8K7jaN61Ec6dOK80sUo1y2L5nH9INq4IqFQSG/7chnJVArBp5Q50fbQt1izapEguISkeB3ceQ+9nuylCjIuKR1wcnegyP3ZziUdO02m8TWjW3g0ZybW5Ia27ZQx50g3gwAo3FrRrF+/11gVkV9D0EV9Ks0Z1qKBEq6n9JTRzUui0LF2xPCaPfx0LFv6hNKXnB/YDIiMwnmaRmETiOJ7z5bt4qFv7DK2IDr0k+mbiaVO3a9EQm9esx/QPRqEx/TdT3x2OL39YiCjOfC2YMxWnSVi1awQiSqZFY2Ix9+uJ8PIvgfFvPIe9NK8GD+iNJtRmUkhAz/Z/iP4gP3w07Sfs3bQFk956SWlMTWg6nqLZKMeol59Gg6YNlWx/kuBaNKmHwc8/ha3rN6E+TUZEhqJDqyYo6UfSlVm7AjrCY2CX60dk/siwlWPl18xFyTS5caFsbquJjeWsZPPqikhioum4JpnFx8ehfLUAdbOWLOeLjn1akJQi8djQXnB2d4RNeDr6PN9d/f7M233xz+8blaO7x9MdEU8t6urFEPz85WJ0H9ABbXoG8xon/D5rJfzL+aH/6w/wRo7F9Ws38MCgzgjuXA8Xz11Ws2J9XugOP2ovpSuXVCafmEhDxj+Gaxeuc3yuwt+/rifJ9UPdFkH0ayVi1S/rlJbSfUA7RN6IVs71BdOX4MFnuyjSsXe0xW/fLeeY9seDg7pg69976D+qQh9ZPB4d1kuZi+XYzgrUsGo3q47L1I4Wz1xBmeqiQZsgEmaUIqOQK6Ho3K81KtcpBzuWeWzPSU7ixKhZQyHR3ByiQWVorGa+No0DS2bTCu8gGTXnTaqmujmLJfi0v69txsM0PAzdH+yC7n26/zcdT+LoIT4dmSIn6Tz+TN+MaXoJhuPU6cG9h9UU7Nvv8o0y0jkyRR8SQi2rGr6c/n5GuzhlP+XzmWhJwhg/abzyD4HlChk+9exjGVP3EiIgU/NShkzLU/P5eMrYjPNyTupLSsLId4ZmTN/LNZGR6E95+g96VHqb36PQtEXjjDpjwtGuc6uM6yQUwUpikTheMtg40yFPaZnduWWGJ4e1HvFxKWjcsbaaKo8npjLtLeeCmgSq0sVsGzDiITW9LtPhsSSb4v7FUKpiI0SSoJp2qYeW9zdU3RMbFafIasiExzOiwdlvkfTd3f9ke2XyiSix0fGqHu+Snujav426Ri6WOpt3q4+UpFQE8qZv04vj05C/VCU/DPt0oMon4QM3aP636tkYbR8MzpjqZxluXi544f0n1PdUhh9EkUgeeLbzzT6XPC26N8wIK2BbW/dsghiO4ZrBVQz1xOKRl7srGVM5XkTu5swvYQPixxJ5ZLauVtMqGUQVGavyqSMXcUbKZ5QPmlHhkURh1WSME5L6jEFsRhNGSCCzOaPOmWgWohEZO4GDo1xpf3zDaXYhAhVbpMrlNRKfJEkOh1g89UgPupdoPoVyG1EOmIwy2JOcncj2EDMw82F6LqvrhXiUDCQriS8y1lNY+BZJPXxKCw0pnxH74DZT+Uo8k9/jYvlQMFgZxge9aEfGc2Jqqc+Grkxm3yVH8aZm18XKuDBZ/CX3Z2T4rROL0TIuTPLIZ4lXio7IKMNYj5CDOqT7jOf5UYZKYuKtnhLR4kzbIeZpZLjJDpeUN0rqNTlio//boDDG8PlmO5kvKiIyU35D2+SZzYemHCmpJCfZHs20PZnwzIyvap+Qs4QBZB1mVCjmV5EMy0KtlNqLbwkf+JKQlLaSnfZB0qomppOE+4v2YyVaSqFinUNlGcNdZtNMFsrKE1nuHcNfKaJQ9jMykVXxHv+5yTu3kcV4WZbyGn7M3J5b2pRFnsy8kRUGmcu46XEzfDD9bqzfyEGmeBrlz5xH2i/9kw0XaTLKlxtJSEUeXZJuRzDym1FL0kSUL9BnLsS4HCQvDuxb116YqCP/Z3sYVKeblRq/m57P6pyp2pCDzXiLOpcbWUzVv8y2Unby3aS7DIa87X4GiqJM6M34PbdtNrlWNCNtphXIuNeFmhkC8sQVj1GGAzv3U/tm1gzrFcewo0J2DSyMWTLrBVe3zLwQYACpct6qHQX1fkZmphcpn1HGqn3zX5tmXgNbS2ORCIiZlrGFiMzy3PRy5MIcycl8uukdMcFFm2kZYNzONDU10zJ0V60ZWeStpYXOKwIZQXhGMsrr1Tp/gSIg05S3iUkyfzNNHL0OXKqWzgWeeVhvVKCg6sINCEjfyHYVmfZbKjJ8OLXPaR2JZbldPEuRiXePVyx9c7t5G3MnI5v0lHhvRK+mdsc1kdopaWbDmWRk7wh3h3DZfsnOGINTVELa2di6ODhzAy/uxgAut9CHeSGQLnsoOTJQ30beyPr/h1mTkXdD2bUg4rsTq17zVFu/6MPsEJC4TgkCd/dGWCHvZ/R/WNjaY+f1S+Fzo8Ot5G2y6ek2x3ac71quRsmNLh7OhbtCoYBGmhsX3JKMtmT1qDBrMppzVS3O5bJ4fWgEckYgfXfZZYyjXpZdUF3OJZhfjvkTZ8oi4EFc/hJqftLlXaLbPSbMmozy3lR9hUbAehDgzgRyf0ryYrIKMrpd72gysp6xq1uiEbBoBDQZWXT3aeE1AtaDgCYj6+lL3RKNgEUjoMnIortPC68RsB4ENBlZT1/qlmgELBoBTUYW3X1aeI2A9SCgych6+lK3RCNg0QhoMrLo7tPCawSsBwFNRtbTl7olGgGLRkCTkUV3nxZeI2A9CGgysp6+1C3RCFg0ApqMLLr7tPAaAetBQJOR9fSlbolGwKIR0GRk0d2nhdcIWA8Cmoyspy91SzQCFo2AJiOL7j4tvEbAehDQZGQ9falbohGwaAQ0GVl092nhNQLWg4AmI+vpS90SK0GA2806cs/rJKYUfpa3IMZJ0/jZiecSraSZ/9cMTUbW2rO6XZaMgBeJZywbMIcphqkav77BvzOZDlhyw24nuyYja+1Z3S6LRYDaTwjJR17OtZkpiulvpo08b7VEJJ2lychih6wW3MoREM3oKaZihnYOtfL2ajKy9g7W7bNMBKgFRVI7+pTST2BazO97LbMluZdaa0a5x0rn1AgUNgITWeHjTG8XdsVFUZ8mo6JAXdepEcgFAmvbtml+3iY92ssmvSHVoiO5uMSis2gysuju08JbIwI1ViwNcvfyGlOsQd2+DzVvgSuHDs522rllYFRY+Lgjnbutt8Y2S5s0GVlrz+p2WRwCFRcsKOnl7zeyeM1aLwa1b+/oEVQTtk5OqFS1Gvzr1G17fO2adW6bN/wcGxP+7pHOPa1OU9JkZHFDVgtsbQgwqMipQttWLxarV2tkjZatSnjXbwBbNzekxMcjJZExjjY2cK1YGXXLlkP04UOPHl639kHnf9dOi7gS8tGZvn1DrAUPTUbW0pO6HRaJQO3Vq/p5PtzrnSqNmgSVaBIMh+LFSUAJSI2OViQEpKv/k2NjYGNrC886ddG4cqBz+J7drx/dsunxYmtWfXR2/aZpEYzYtkgATITWZGTpPajlt0gEaqxZ0cbTs/i48q1atC3XvCWcSpVCanIykoSEDIcNySg9nUzEQz6npaSo323t7eFLX1Jw9er+17Zv/8zN12dg1JqVEw6077rQIsEwCK3JyJJ7T8tucQjUWLW0hptH8XdK1q7/aJVWreFaoaIinKQYWfVx65FuUIzk7M3PPJeWlIQkJjtXN5Tu1Bm+tWrVvLB58wK3nVufiwwLEyf3BosDhgJrMrLEXtMyWxwCNZYu9XP18RhRrGrQS0EtWzp7VK3Ou88eyfFcA5uh/OT5SKU/SZKDrx8q9+qFgLp12h/fsLG9+9YNc2Oiounk7nYsz4UW4QWajIoQfF219SNA57RjpfatXnCvWmlk9eBgf+9adWDr6qr8QulJsgDfhv9l8JGJIqSAMf1umkdpSia/p5DQpBSXchVQp29pRB8/9viRTZsectm47ovwsHMfn+n55HVLQNqsycip+SXnhITU99OQ7JGcnApbS0D0XpORneJo7wonJ5dxiZt9Lt9rzb9de2uvWfWIZ++eYwLr1a9ZgjNk9l7eSCUBJYtJZnROK2LJoBrjX2OZpt9vzZNBR7f+Tid3XCyLpZO7Rk00Kl/BJeLggRFHd+x4otjaNR/8s279Vz7jx8viW7M9zJqMdp3e5diwXMtXWje8zz495T9nntmieQ8KZk9T48D5TThwYceXPih4MuJ6LXvZ58ecoa6xZlUrj2LFxpUPDm5ftlFjOJX0R2pKsoGEDJLfoWmWU7vTwUc3Z95s7ezg06gJmlQOLBWyd8/nrj5egyLXrppwqF3nX3Mqo6h+N2syCg8PT7evYB9W3L5sCRsbO6SlpxUVTrreLBGwgYO9A1LjNyMhJiY1v0Ei8Wxjmb+TfCZJ2fwu+/nMYjJLB22NVSuquRXzHO0XFNS/anBTuDAuSPQX0VhkUkz0nyxtsru104zAm5STlpZGLSyZTm5XlG7dBr7Vqtc+v3PHL+67tq2Oi4wcd6B950353V93W55Zk5FRGU1IoZMv1ZYdqsnobjs8f6+3QSrnQNLS+W8+jyQST2nKWo/Jl58/4l87pkZMI/ndjX/7MIWTqJbkb5vyXpr/0qW+Ab6eb3gFBr5co0kTF/fKgbAhICkJ8YqEMg6hpUJkI0OdqYkkJXFyF/dBYJeuCAgK6nh82/aOTts2zo68EfXuiW7dTuS9xQVzRT4PoYIRUga79Komo4LB925KTeOcc8ZNlu9DqQULnc9UgqkX026ma0zyRFrKtJWpDYmpJglJVrcX+uE1d65DpQoBz3tWqzyyar36AV7Vq8PW2QUp9Aulc+rdoAvdJCNFRcpXJMP51gerLc/bMqgxjeNctJqMI7cubENuQ9nG6bmMGKWMMlLFYc5PLmXKok7JUog5feqJozt39PbYtH5q+I2rn5zp2fdGoQOYqcJ8H0H53yB2TjpdBOlaM8p/bO++xFTTYJi7L860hCb8soPpJNOLTE5M+5lGMK0hAb1PIrqPn2XTsUIno0abNvT2blx/bNmqVWuXqFUbDsWKITEhAUkSKX2TFG4FRMjAkWZtcqqM5wwKl3/dufRDrg0ND4OvpydcHR0Ry6Ug2ZWTFcxSjoNoY6nUUukvSmaApAvXtQmxJfOcTP7I35Q4zrxJJHeVKmhYpoxr+LGjo47v3ftEsQ1rP/hq9bqvmxWhP868ycg7o7NEMxKW15pR/t7t+VGajXpIFIg3NojyrSLprCLpjOHn4UxfMvVmGmSQvSP/7sqPduS2jNpr17TwLl5srEfVwE7vrFmP1OOnkf7HChU93a5uHYx+oj+SSCSOJIYkiZjmedF4XEgwNi4uGP/9D6hfqRLubxqMOBKQu7sHflm7Dl8vXwEbkkgkZ9omD34WTWtURxrJw9GB5MVyEqlpCdkIQUnZQjoJPCffpWxZy/bD0j8gGpbUW9LbC5UDSsOeilFMQiIW/PsvJj79JGzYVXasJ4GmWzrzlmrQEH6VA0uTlL7w9vEZFLJ+9fhDbTouzi0e+ZnPvMnI0NIMMkozIaPMURfGZ0xu1FojfKaRGhmq863RG8ZzxvPyNytPYwF4H7OVJbPMmaNTspMvuzbk1Obb4ZJRt5hpdxy1l81IJvl48qdKTMY9n5fz83tM/zCJr+hZ5jnDvy2ZxIQr8KPKmhVVvNy8RvtUrTygHpdirL98BdepdSx4frC6sVP52d3ZGddCQhBD7eMEf69doTz8vL1hS7Jet28/Anx9sOHAIXSsUwfpJAx3F2f8unYtRv4wCz+9/hrqV6+G8T/8iOEzvsPWGV/h3OnT2HniJOpVroTy/v64ERFBAkrGkYsXULFkSVTkOUcSy5ajx+Dh4YG1e/ehPQmxQeXKcGPZL037Cq1r1cRTnTqie8OGsHd0wp4jR3D2Wgha1wyCh7sbrly9ioSUVJxxcEL11m3q+p0+tcht99ZV0RFR446077ylwIE1qcACyCjDTEvXZlphjotc15XhM8p3zUisirepFV0xCPI1/17j9/MkoZf4+VUmcWI/zHNXcy3sHWT0X7WqeCkPlze8yld+pXq9eq7u5SvAkVrHjn/WoDhnqqKo3cRSm3Gnr6iCf0m0G/mW0mBcaSLF8Ldl743HoMlTEUfCuhIWjlj6buqRpFJkHRrT+Lk/Y+qzg9CyXh0kRUVj9CMP42qXTvh7w0ZM+Hk+gipUwNi587B8wjh8+usibDx8GDXLlcPOkyex47NPMGnxEmwmwYi2tOfMWQzteT8+W7QYvZs3xb4zZ9C9UUN8tPBX3NeoAWat+BPzqIX5kyC/oBa1ZOw76Pfhx3CjrGLapVFTWjbuHfhXDux8bM/uzm7bN8+KjYh570jnzqfuALo8X2LWZCSPRjlSDQ5s49S+mORqqtREeTF+N1oMmfPcLr+xHNMyMpctctwsUz7bMuZVFi/yiZi5bpX35j8ZbTCtP8v8mdqUlSyZz92uzaY4GOu/pQ0G7G7X5tvhYrwuQzOSwznPgy+7C0gwEfztN+Pv/C7O1e/kOz+f5p+X862ybArawnimFzu2f86tTKk3q9WuWdqrUiBsaWaliGOaZtjRixcRHh2D90kUydQsapYrCx93V1wNj6BtOUb5Z57/6htM/20xoqkpLf7kI8xb/DtmkwzcXDPK2X/qDEnAFu2pvcSFhakgRk9qNI72duj3wcf45Jkn0b5zJ/Qe+hqWb96Coxcu4N3HHkV3mnhtR72Fn9etx6o9e7Dxkw9x9Ow5PEtNKDo2FjeiotCQpmAdEtmrvXqiy5hxaBZdFV+SgP4aNwY+JfzQ5KWh+Gv7dsoWj19GDEcYF+A+PfVLhiHEw4WLduv4dkbM+XNPHdm3r4/r1g1TwqLiPz3TuXN4QeJu1mQEeCt/RJaaUeaHsfG76fnsPqu70wBrVnluU7YQkJunG6IiY/h0S4G3bzHExcQjNfX/ww6cnJ2QTLU6LfNvmeqWNjpzEMrfFKrvEkiYlGjYEeJ28t1JG0zbnh0OucljqFt8ECK3S0GO0kIuu+aGNQ82691zbOWq1eqW4MZm9nQqi08omaQiPpk4ajAnLl3GvFdfQeWgGqCdJo4YLPp7NaqVDkDZihXw4+9LUd7PF1uOHcczHdqBF+I8Tbj6lSqqJ5MdcbsRFala5kpy4gDiJxs8NeULVC5ZAmVo0rVvxEiGa9dwg0ThTN+RHX1P99Wvh13UhHxplu2hGXdfg/qw4bYjJzdtQV1qXKeuXEWtsmVxiORU3tcXN8LD4UDZTtJsbFatKnxImpeOn4ATx1gY21GjTABK8tzvC35BoJh99D9Fsz5xcntUrIiG/qXcIk6ffPv44cNPFtu0fuKcVWtm1Bo/Pt9jygQHMyejjFGYxv8ksvSmOZDVTZiHG+jm2M7LzWy4yIUDZ/a0Bdj89zbOgCShUvXyeGncs8opaM8nmnSiEImLqzNmfjIbtRrVQJM2DW5qUPKb3Lz2dvZwcGLAIAnNxtYOp46dZhm0TjjY/5izEkNGP600LzuWmZyYnEFSDnRgUg47/k3l8phk3iAZK5syEWt+k/BtyDuN9WdlpkmkNC/zpCYTVshccsfV1d6wtqmrm9u40kE1u5QNCoITY3NSOfMlJGQ8HB0dcJREJGnl7j1wPXRY+Yua8kbfdvw4Kvj5kXhssfbAQUUOO0+dwpr9B+Hp7o5J1JJ+epkTg9SKxCFdhyRwhWQxYc48tKlXF18tW6GIqjP9PrPWrsfuQ4ewaMtWlPXxUTNsMh5si3mqsn1Ynpxfd/Awtu3YiWHfz8Kr93ej/+goOtSurfxIcqxjXjHDKlEbWr5rF/YePoIJs35Cr8aNcC4kFGXZRmO+WpSHA1WldJmF45gT57tPjSA0Kl22TMjxY9MHe3g8G71h7fgDrdrle3yXZZCR8hnJcpDM8ReZncwF68B283DD8p//wroVGzFp1mgkxCViUOehaNk1GB0fbIPdm/YrgqrZoBoflgnYuGormnVqBDtHW+z5dz/cqVFVrFZOEU5sVCx2bjyG8lXKIKB8KXw98XtUqFoOfYc8iEZt6sLVwwknD5/FpbNXEFS/qtLGosOjOY6TcfnsVZTjde4errxZ5CFlZJ+ic2DbOzvcVA1JRH0p1HNMTzKZPRnVWLuqspubx+ji5cs/VZXT9C50DguiyTTH/pvUyKCjdOLtwP7r36qF0kzS0sRfAJT0cEdjaj3+Xl5IosnVrEogWtAh3VVm2H5egEX/bsTIB3qiIbWmeJYrZlxJalwLhg3FZ8uWs6wzCOY1r97fXfl/hnTqgIm//IZy1JCmDR6IbUepYbVto7YaqcBztcuWQePAQBw+fwHfUQt7onVLdKC5JxqP1O3Nh+bfJEGJFH20RTN0oQa1g87wiT/ORjAd4q/TfJv1zz+owRm3pBs30Jqzd82qVkEio8UVIRkOcUOkcSmLLbX8gHr14Vu+fP3zR4787rZnx5+xEdHjD7RrL1Hy+XJYABkxglTNpmWYA0V52Dna4PCeo4iPjSdJXEbF6uXw3d+T4eLugq/f/wEnDp5GDEmmWp1A9BzQlaaXE8pUKoWJQyfz6ZmK0ySXvkMeQJ3gmpjw/CfwC/DBkT0n8OSrfXF03wlUqV0J879ehGp1K2Ptsg34efpi+PoXx5wvFuKTn8dh0qtTEB+XAGdXJ0WEH80by+lZDhaTwVOY+Aj1pUqXMFYPDJ0hCXXjt9FMzZg+p1Z0gefkfjDLY2Gfjj7FUlxecS1bbmjVoBrubgFluHGZndrqVY0102edoQVcuI1yNIu+GPTMLZOvyQx0FBMuleQUHxGJwe3bIVFuYp777fVhGXmp+cZSyxLTXcqOiY1DKxJAmxGvZxAANWSZiZOYozd63K+m9kWeuPgEtKleFfb8PZrE8QCd0lKeTOHPfukFpcXYMF8881UnYcUnJ6E0Z8u61q1LjZraM2WIZ5um0geVSv+WaNvR9Cs92aqlChGIj4zCkA7tVXkJNDmzCpNKpSYnjz0HEmjl4GCUrlDhvmOHDt3ntn/X90m2aZN212os8WB3dZg9GUkfZkztFy0ZyeCM40AZOOpRfDtxDj58/QsSQgIGjnwMxUt445dvl2LCzJG4ePoyfp3xByrXKo+ygQFYMnsFieY4xs14A799twzrlm3ChpVb0bxLIwwZ8yRmT/kFHsWpMZHYnnz9Ebw54H1+LoN5Xy7CO1+9iqAGVdG/xYvY8NdWhFwJxdvTXoWrmwvefnqSGrR29hlRu0V12FBjtbe3TfrxzfWzKQPvkptHCxKRBC2a5VHZqxgcEx0rV69UztuPW7nKGq5EOm9lQWuWiqa0QmAmiaSkpNFnSH+P4fvNv4Y8cjOLI9lIZjL1r45M+cXfJuRzC+kZujIqhn4bownMc+QJdb2UHScam6GsqBjDQnzD92RxsIuMNOHjkXBLvVFqF0nDTAk/qboNZSp55VchYFGMMhsZBvlTUjP25Hajk7tBiZIIO3zwmSMnTj7RdP+ublvrNFx9N51t9mQkjctwYBetmeZI/86hXUcQcvkGJvzwBmKj4/H795wq/XIxajWphsDaFbFr415ER8Si19NdcProWZQo7YO9Ww5S46mIlb8wRIajr0ajKlj/xxa89slgkksIWnRtjIM7jtIMc+Ugi1Nm17VLoSSksqjZpCounLqs7PZYztyULOPHuqri91krUbK0L9y8nBETKf6MojTTZOCnOgS1qjj66qmwxhRmKJM4ItYxyZS8WY6xOGoIvL8DTl2+8npUSmr3MjR5HGlipaVRu2Ef3JwNNRKIKZkY77hsyOiWcDTTvOpuz5hZFY1JfDmi+ciJGBKMPFTcGAsUR0Ixmn85EaNxVlN8SvEkILnullUhppa7sQ1GmbKz6k3bZZBZXSpyU7sTzSqRvq4Qhg5cunhpR0q6zUTbyLjNd0NEcq1ZDpRbGyWzaUWvGdk6OOJGSBg+HPolfEp5KX/N9rV70bpHMMJDIuBT0gsPPNMVX47+gVpRc2xauQP3D+iIXRv2o1nnRqgdXA1zP1+MTo+0wpIfVtI8O46d6+ljornl5VdMqdKHdh1Vmk7J8n5Yv2wLzb5T+P6D+ajFayNuRDKfJ+yd7LBn4wEEVCzJiN0Moi7KQ8w0mol2nV9qeKJNxZ4rqQ19S3kkDqgT07s01aKKUr7b1X0IEC/v2tqb1t5/5cqVcRUrlG9YgtvAOri5U0NK+W8W1GiumRKTKTllRVhZ5TUI48AbWmbH/ti9G/vo8ynNuJ++wY0ZLW2DTZx9q1bKn3FKjhmEZHjOGMNKbmpRBo1GicbP20+eQhX6uqTcm5pydmSZVzISDuVsoNqhgb7QG3TKnzx18mxEeMTEh1at+Y59nC+quQWQUYaZpvrFYI4URZxRDDWThu1q49FXemHWRwvg4uaMGg0C0eeFbgi5dAMz35+Pj1+djvqta6Fc9QDUDK6CKnUrYMCI3lg4bRl2/bsXHR5uiar1K6HvSz3w27fLlc/o6VGP4Ojuk7h2gZG7rKNNz2C06t4I+7cewpRR39HUK4Vn3noEqxb+i0CWF3YjDBWDyqBSUHkVbEeP2s2V4aa4FFackZra53+hx0OdPVFa4oAkCFFW1n/Dvx5MZktGxnvyQIt2yyjv8j+6dnz2wsVLbwVWrlzeq3RpznY6qfCNdBl86rh7NpLpeTt21BNfz0AI/TYtGRowddXfWM2ZsymP9sUoTrGvGTUczozmFv+SzNR5ytS/4YjkuYygSkeDqmKLo5cvYzid5MsZauDBEBFZ1ya+oIzjLlUjympPEkrnrGLUhfM4fvx4ZFR4+OTL125MvtqzZ9T4Fm3y7Vlj5mTEOCM2VRTq//MZZeZi0/FihMc0T17yZ5VXNABOpz86rCd6P3+fUoXFdIuJiqPG4o43v3rh5vR7LM9JnoTYRFStVxFjZr5ys8NuhNxAp36c+XikuYonEme4EFe91kHKsSkhAvE0116aNABJCclwdOaiSZJUu4eaqielXN/tiXbKESk+LHli3RIAnRUOxvvodrhkh4/ptVnhqViPoQqZhqQhODHfBmpBFyRPd24LMIPbgSyIi4l5zePcuVerVani4VaihFozJqEVN1n/LoRxZ+DkaE7xX+bSjrWj3uDyXyf0ZezQ1L//wa7TZ5XzWQgpmo7kcQ/0QAB3h/z0z7+w+9w5NOZM3CsdO+AaHc4jl//CMiIxiLN60gOBnLr3ot/rTV7bQ5aElC+HRJptd35khJUIlcWHhuDEsePpETdufBcREz/xRLt2Z++83OyvNHMyyrgTlJmmPhnuhrzccPlFSCIKHXtRHAhqNTVvQpmilSM1SRYyGpyUGaeUliNHSrzEApnwhcyiGH4zdksynaYSCmB6REXSgcm8xvMpcQZzjKFIsQZno4kvMuPSnAg5pzx3QEgZbZML8y8CuyAGem7L5NM+kqrd2Bob1szipvZve/sUH1iFK9ydSQoSuCjmW2brx1RfysoyMsJuxy1hI9n3i3btxowB/dVbPiJIKNVIJNO5xm3i/IWKQO5r2ABv8/O6I0dxnktIzoZex6tdu+BxRnTXouN46j9rEUxiqhMQgKmr16AtY5y8SHLPzpyFEgyGDGLwojzYJBQmr3qRyCoPRPFTJtFJf4F+IZqwy+MiYzmN365AJyQsgIyMZpqyB8zjKCw5Cqueu0CVkQX5ojHchQgFcumRVu3PsOBBDIT8NioiYmyAv/99Zbi8wpHBhqKhSqhGXrmds444wUBDe97oQfTviDnlSXNrB2OMPEkmB7jE5E2STheS0XfUlOKoHX377wZ0ZAzQEhJYBQY5Ltm9V4VyvN3rfj4F0/A4fU2DfpqDBTt3oytNvu+eG4QoxjlJiEF28hkBu+XZxS9CQKINyZtsr1GWMxcu7IqPjh6/t0WbPwoE5EyFmj8ZiXmkfEayhUgGfJnZ3gh65tnIrJ5Yph2R1VMju7Iz12vsyKwmJEzzZiWv6dPTKE9uZMnuiXw7WUx9rznJYsxrimdmbP/Plyv9UhgjtYjqYKSxBPV1q71pQ6+Q0Otjypct3cBPtubgwliJzs5L7JsETDrzZr9KX9FlzkbVYvDhqQsX8QhX6U/r2wdhMbFoWLY0bpw7j1BO7TtK9DO3BpnQvRv2cF1acfqRxM9UktoPeP7bJctQ3M0V4bxuzlNPYAy3MjnIKPBARoEn3PQZ5QAcO09MfdGG0qiVhV26iBPnzp2PiY6c2GvF6m9pvhba9qrmT0YGM82UjIpoXOpqs0JAKaz8xzqstGz7+ECLVksOjh27rH/XzoM9r1x9s3L5cmWL+ZXg0hwH5U8SUjK+Adb0782HH39PokZTiQGTj9SvjwfpwG7KcIKjly7hnfu6oAbXo0lUdiDXk21mZLcry+1aswa+omb0Mde8HeO2H480qIdWlerg8R9mY9DU6Th3PRQvtG6lZtAkynrRnn34dsNmfP5Ib7XXUWaZ1IPFJCZNLTciCUnAZcz16zhx9kx0RGT0lCsJIZ9dbdUzYnxwq0Id82ZNRrTS1VNXpq81GRXquMh1ZTYGB3auL7DgjLJAdC/wldeqVfM5k/m6Z7HLQ6tUKO/uyql5WZOoluaYaIpZueDENPv0wZ7oVbsmrlHLGd2hLarRxyMO7W/69VFr1gJpjn3e+0F4UxOa/9QAbKbfpj9Nt3plSiOZ5uG8J/vjNMmj/f33qXilWty6hKYkr3kAYYzqjqJPUaKyjVqt6V8j/Mo5TQETed0Jlk/f1fcRcYnvn2jVSnZFKJLDrMkoAxHa5wYzLT9mM4oEZauu1Gg+W8BQyqd+iOBWGtxecnSNtWt/iI6NGV3cy+upQM5eOXHXRtk9MWO9YNaHUEQ8CaVN5YqKSBKpVYUzMtqNM6vFOLOWyNk0Dy7G9eZaMJktLcltSfrVr6u0JpnWFzO5JrWoOoxFUkGOJL8ArosTEvNg4GMx+qCkTFOT21QS8QtJSqZpd4la2eXQ0JVx0dHjDOZoPiF0Z8VYxAiSWBrZy+imilkUgUaCb3aBPMYwWNNlGTej1DJdp/hVDHVDKK6x3zK3yTSPMaQ287nM5RRFoJFBM7JyKy3Lu+tIu3ay6djTtbds+CaSN3SAn2+X0pztcqAzWpzc2a0ZFI0pluvITA8hqSRD5HcayUpWggmhyMJoSWr4GS6QdWamh/G6lLRb8xnziBlty5k8McnkJZKyG+XZK1f2cC+j8QeCWyy5M+rI/6ssgoyoG3EXukx+tMzUb/xuej67z6Y9m1We7MrOj+uyK8P0fG7ruV2bc9OGfJDFZGOX/B+dFlLigWat5E0lXevt2PDgtbCwMRVK+tfz4V5G9tRUZJ+rjIjonKYZbjetYeyo7IIIbj7RDPX8N80gfiHZxTGdcWkR9DGdunT5QlR07KQ5K1YW2L5Ed9pt5k1G3t427Eh3G3vZA8+MpvbvFG0rvM7GLg2OLvZcV+dwz799fG/jVou5Q+QfL97f+Tm30NA3AwMCSntwQa7sXSWklN1OAAUzLISEMl6WEMtYpROXLsVy07QpYWFRasfGWsGysYJ5HWZNRpW8vVOuJaZvuHwqpDgXY5oXcncoTdSNWP+UpFSX4qU8JY7F4g9x3Krntjsyln3f44e86oeR3NNqbNjwM4Nih3u4u79SJSDAzYXxSWKaq/ikzEpQPseHyCZ9UmQilwud4lKRsKioWbEJse8daabMSrM9zJqMrm4uLUvSu95NULu5If/J2LHDKFMQ4zcGm5tsdyKPqfFxJ9db6zVHWrWSTeXeqrJhww8x8XGjvT08B1Sm09mRM2Rqhtiwd7oicqb8MNLsGC8kvqFkbi1zmVHb3EVyVWxi4rgDjZsV6ls+7rRPzZqM7rRRZn6dbDZ2z5s0Zt5H+SYep8rl9dFPNqCTOyouZlwpr+KdAjh1b88ZM7WZspCSwTWdVSiAUZBboqUNJ40x1jbinJalKpxdu87lJeeuX9/HEILxexs3W5xvDSmEgjQZFQLImaqQB2F2M6+FL42usVAQ2N2slez307n2jm29QyIjx5T39alT3JP+JMb7yMr8vERyGwVWQYvySmyafpFRNMlCQi9Fx8d+cDYJX0c0a1a0e8vcAaqajO4ANH2JRuBOETjQOPi3G3PnLu1UM3CIW1jEqEA/3wB3Lukwblkr0/C5eVIJCcm+OnHcs/pkaAjXscZPDY9N+ORMq1byWieLPDQZWWS3aaEtGQGfxx9PppP7C39xcicmvOHh4vIyScnFmUGPou2k3GZPc1n5L+FkSVxEe/rGdUTGxv0UlxT33oHGyhy06EOTkUV3nxbekhG42qrVdW5XMrLGli3fxyYljvZ2de1fkWvXHGUzM7Xy4D8vkmhOkmRv6yt839qVyKjVBuf0JkvGwFR2TUbW0pO6HRaLwJFmzWT72ycabNkyIzI+YVyAp0d7f67Ml61GjHvjy4tAr3PTvbPhEQfiEpMn7G3Y+FeLbXA2gmsysrYe1e2xWAR2N2u2gcJ3qLd3W5+QmNgx5b2K1SrJrUIiOFV/Mjz8Skxi4gd/Hzr+lZh5FtvI2wiuycgae1W3yaIR2Fsv+BevuXOXxNWs+uK3+w6MDypefBYj3Secadzquk89eQGLdR6ajKyzX3WrLByBiMcfT6KTe/KHi8c+yqa8xyDZ6xbepBzF12SUI0Q6g0agaBDgG0vk/pQA2WJMIUUjReHVqsmo8LDWNWkENALaZ6THgEZAI2DuCGjNyNx7SMunEbhHENBkdI90tG6mRsDcEdBkZO49pOXTCNwjCGgyukc6WjdTI2DuCGgyMvce0vJpBO4RBDQZ3SMdrZupETB3BDQZmXsPafk0AvcIApqMCr+jb9ldlFG2Ngz1t+bX1Rc+wrpGi0RAk1EhdJsQDquRNUahTPIGvjieq8+/LZi+ZrK4LUILATZdxT2GgCajQuhw0XxIPgdZ1R6mS0yy3uglpj78TRNRIfSBrsL8EdBkVEh9RNLZT0L6ltU9Z6hyI89Z3QZZhQSnrsYKEdBkVLidOpHVPc3kyPRO4Vata9MImDcCmowKsX+oCZ2ndjSDVdbl53WFWLWuSiNg9giYNRn5O/k7J4e4v5+elO6RnGIdO22O6jexbEJSvK3n1fLf8F1ZuXkrjVkPIlvu0+zg7Ah7h+RxV13PXDZrYbVwZo2AWZPR6dWnHQODG7/SqldT+zROOKXL7uTWc8hMmmUfpFIHO3sc3nECR/cc/hKB0GRk2T1apNKbNRmFhyPdwcE2zKu0a4l0W768hS+t04cZISBkxNfqJO9IRHxMfKp+Z7cZ9Y0FimLWZCR4yqujkhOpFdnyFcCajMxriImRmco+0v1iXv1iodKYPRlZKK5abI2ARiCPCGgyyiNgOrtGQCNQMAhoMioYXHWpGgGNQB4R0GSUR8B0do2ARqBgENBkVDC46lI1AhqBPCKgySiPgNnY2EAC/RiwiLQ06wp8yiMUOrtGIF8R0GSUSziFfNzd3CGRTjduXIeHhwdcXFwQExMDISh9aAQ0AneHgCajXOAnRORVzBubtm3AlGmfIiU1GVFRURj56lvo2LYzEhISlLaUlJwEOzs7ODo6IZmfk5KSFFE5Ozmr3yVfaloqf3eEgwODBZOS1TXym5PkYd74hHj1Xa5LTk5W5UmSfE4OTrCzt0NiYiJSU1NVGbY21NLYhqSkRE2KuehLncV8EdBklIu+caNGtH3XVjz3ykC8O3oiOrTriO9mfYuRY4Zjw1/bEBsXg8tXLiGwUhVERkVi/8G9CKpeE/4lSymC2L13FxISE1C/TkOlUV24cB7HTx5DzaDa8C3uq8hm286tJJgUNG3cHKE3QiG6lqenpwr6vHjpAqoEVsPxE0dxLeQq6tdtCEcHR0THRDNFKXKqUK4iSVJvjZSL7tRZzBQBTUY5dIyQiT3XX034YAyeH/QSBjzaH9dCw/DsU8+hS4eu+HvtSox57y00b9oS3Tr3wMyfZqBcmbJ47+PxmPvtAvyxcikOHz2Iy1cvo07Nuujd82F8OGUSSvkHYNLk9/HHghUYN2kCLpHMrtP8a9uqPbyLeWH3vl2YN2cORo8eiygSTuMGTTD/13lKy5o9/0d88clXeGJwPyRS+xJZalSrqYhJHxoBS0VAk1EOPSdEdP7iWUUUPe7rRSK6ocwnNzc3NGvSGD/MnYmmTVrg26k/oG33lhg57E088sRDuL9bTyxftQw/zvse/fs+iaHPv0ZTKxHffP81wsJv4IPxH+PqtSv8/QccOnoIa/5Yi227duKVES/g+WdeVPWdO3UZK1evwOgR4/Dy8Ofx3juT4O3ljZfeeB6btm5kOWGY/8NvqFC+AqKiI7WZZql3oZZbIaDJKIeBYGtni4jICGUCiUnl4uyC4t4+ePH159ChTUeEhIbgxcGvYOuOLXB1cUWv7g8h5loyboTdQFWaVl98/JUipF9/X4Axo8Zj9BvvYMYPX+PpFwagKzWrE6dPYkC/p2DnDpyg6ebDsmvXrINFf/yKdz8Yj8f6PIFLly/Cz68ETp05iUiSzlOPPYNz58+gccNg1KKpJ6abdqLrO9rSEdBklEMPpqSkZPhj+Hfip++i38P9MG/hXPqF9uG5p5/H2XOnEVixMk6cOkEN6pw6v3jZbwgoFYCTp0/gwsXzmPzRZPTp3wfrNqzF3IWz8fmH0+Dk7Iyjx48qJ/SufTvRcHs9TJn+KV57eQQqlq+kfEgVylXA9MnTMenTSWomb/DAZ/HeB++jdtM6WPXPSuarqBzl+tAIWAMCmoxy6EWZtRKN57svZ+Ej+nrGTRqLqpWr4dfZvyuNqXevPpzid0W9Og2UFjNu0mg6rv3xyXtTlBk1duLbGPziYHRu3xWDn36OvqdxSqvyoZY1cexHCI8Iw4QPx2LM++PwHM2znjQF4+Lj8ORjT6NV8zacgUukmTcAZ0h6Lwx7Qfmd2rZqx+/UjOo3QWxsrDWMQ90GjYA203IzBmLjYlG3Vj0smPWb8heJVhPDmazi3sXx8pBXER0dRTMphf6it+hQTlBOZrlGtKOfZvyMJM52OauYpGjl94nnFL8Ly5Bp/GKexTCbeVIMU/UyGyehBGNHTVCzZGHhEczriinUpqQcJycnzthFYeCAZ5UsMkunTbTc9KLOY+4IaM0oFz0kN7toK3LIZyER4yFEJIcQiNGJLCRiPFKSOd3OefqkqAxzKkoRlw3//mdeSQyRHAmGcuV30brkkJgj8VdFkaTkvJCPHEaNSBNRLjpQZ7EIBDQZ5bGbhHRud2T+nftTkqluveL/8uRQpvHqnOrOY1N0dgtGgC92eITiO/HFDrOlGfxel38eZJrAcxa5TkmTkQUPSC36PY2AOAunMs0mEXnx7yKm1w3E5EdCkrcXq4O/l+KfKJ4zawejJqN7ejzrxlsqAiSW5SQZefXVQ2zDE0yTmA4z/cJkz/OH+Hcc03Cm6ky1eW4or/vXXNusychce0bLpRHIGYGPmWU+07skme8MBDSS348zrWDaatCWmvFv6ZyLK9ocmoyKFn9du0bgbhAQTegEiehdElFffrZjasfUlmkl0z9MXzB9x3SOacjdVFbQ12oyKmiEdfkagYJDoAOLPmkovpxBIxLN6EWm80zDmH5mms60j6k8kxCYWR4WQUaybUa6rY1+JY65DSGGLEjf6PCCIu0YcVzLMYtJXgy6kEmc1z8y+TLJ69RDmEZTgzJbIpIGmDcZecMmLS3dPTk2FWk2+r1pRTrks6qcZJRuz10NbB1h4+yg3+FYyB1EcpHZNHUYZs8eoLnmzs8xhtPf8vscfrbhuYxAOTM+zJqMGnaslJIYmrhh1YJ/iydzQzNrOCJiwvyTU5Jc/Lz8z1hDe+y4uVsa46TKVvKLvYgIa2iSRbfBhIiMJPVfhK6Zt8ysyehq4tU4eF7tauYY5km8sZ+MHcYLgjhoBufpQp1ZI2DlCJg1GVkp9jLjoU0aK+1c3aw7R0CT0Z1jd6dXyo6yegf/O0VPX2e1CGgystqu1Q3TCFgWApqMLKu/tLQaAatFQJOR1XatbphGwLIQ0GRkWf2lpdUIWC0Cmoystmt1wzQCloWAJiPL6i8trUbAahHQZGS1XasbphGwLAQ0GVlWf2lpNQJWi4AmI6vtWt0wjYBlIaDJyLL6S0urEbBaBDQZWW3X6oZpBCwLAU1GltVfWlqNgNUioMnIartWN0wjYFkIaDKyrP7S0moErBYBTUZW27W6YRoBy0JAk5Fl9ZeWViNgtQhoMrLartUN0whYFgKajAq/v9JNq+TbG+TNDbecK3yRdI3mhADHhC3HRBpTiowPymYdb6PIAWRNRoUwCg0D6lFWJe+zSmSK47n6/CvvufqaKaUQxNBVWA4CfhwfT1Hc2Uzy2iFXfn+Jf9eToA5YTjPyJqkmo7zhdUe5RfPhYDrIi/cwXWKSDfllcPWRp98dFaovsloEOCaucbzUYwPfZJJXDclrqq8zyQsZrfbQZFRIXcsBtp8D7FtW95yhyo0892shVa+rsTwE3qDIjzAVM4jen+MlyfKakXuJNRnlHqv8yDmRhTzN5Mj0Tn4UqMuwTgRIPBf58JrO1okGvYHfRTuy6kOTUSF2LwfUeQ4wUbXr8vO6QqxaV2WZCIyk2A8zDbdM8fMmtVmTkb+Tv3NyiPv76UnpHskp1jGhMKrfxLIJSfG2nlfLf5Oenm7x70+ztbWFg7Mj7B2Sx111PXM5b8NP5xYE+IByDg4OLuvm5lbB0dGxHFNJJu/HH3/c6ejRo+EVKlQYfODAgX5JSUkRKSkpIQkJCRcTExPPHD58+PywYcOirQVFsyaj06tPOwYGN36lVa+m9mmccEpPsxbYVTtkJs2yD1Kpg509Du84gaN7Dn+JQGgyykWPknzs27Zt29jT07Odj49Pi9dee60W/5YuWbKkHf+iWLFicHFxAQkJQvZ8aNVITk5GfHw8oqOjcePGDVy9ehUtWrS4euHChaMRERFbmNbt2rVrM8lJZt8s8jBrMgoPR7qDg22YV2nXEum26SQjHY5jVqNMyMjeAck7EhEfE5+q39l9+95Zu3ZtPT8/v8defvnlXpUqVapaq1YtlCtXDkJArq6uinxsbGyEfFRBxr/yWc4b/8p5akhCTv5hYWH+Fy9ebHvkyJE369ate4ma1J+hoaFzW7Vqtc6sxkouhDFrMsroEEZ8JVIrsk3TZJSLDi3ULHJ/pLKP9EPitrBv2bKlbYkSJV7v0KHD/S1btkS1atXg7e0NOzs7RSqSaIKBptf/EZCRkIwkZSQlqVCu9/f3R9myZdG0aVNERkaWPn369CDWN+jQoUNbLl++PIXm38JCHRN3UZnZk9FdtE1fqhEoUgTWrFlTqXTp0h+0b9++T6dOnVC5cmWl/QjpxMXF3UI8dyJoaiqfBDzEfJNDyqZ2hNq1a4PaUrN169Y1IzG9ePbs2VHt2rXbcid1FOY1mowKE21d1z2DwLZt255q2LDh5AcffNBLCEJ8P0IadD4XGAaiXUmSo1SpUujfvz+oGbX+7bffNu3Zs2dC/fr1xxVY5flQsCajfABRF6ERMEVg//79H1MTGt67d29ljokWlJaWMftiam5lZYJl9hNlZ6bJeVP/UuayY2Nj1e8VK1YEfVQ2K1euHPvnn3/WOX78+OM9e/bMUKXM7NBkZGYdosWxbAQ4Bf9V9+7dh/CGVw2Jiooq0gbFxMTA3t4eIg+J8cEFCxYsmzt37n0MGzC7aG5NRkU6VHTl1oQAp9ZHdOvWbUiPHj2UuSSOaaPD+XZaUFbakqmmk1nrke85aUamecRHJaEB4jzn3/aU7Xv+3t/csNdkdIc9kllFzjx47rDY/1O977QcfV3hIrBhw4b6jRs3/pBkpIhIbv68HqYzZXKt0bS7XTlZjcOs8ktZEqPE2CRxbj++atWqPynv3LzKWJD5NRndAboyANxc3ZCUnDEdK4eLs4tSh8VWZ0TULaUa88fG8TdDDIkxg3x3c3PnAM4oR/LKYM48MO9ATH1JISJAh/FHNM/UjJbRX5Pb6mUMODk5qal60/EhY0tIJKuxIPkkv4w5cYrnZrxIWeJI5+weOPX/4dKlSxfTfIvLrZwFnU+TUR4RlgEQnxCPJ4c8jt69+uCxh/urgbDm33/w6RcfYupH01GxfCVEx0SrwSJJBsG6jWtRt1Y9NegcHZ14DdQgEhLbsWsrKlaojF17d+LYiaN49YXX1ZPV1s5W5ZHrJbgQvMaef5M4SFNS/zMB8tgEnT2fEWAwYx3e4B0lgFF8NEatxpQgbmemeXh4YPny5fj+++/h4OBwk5DefPNNcAZMjQEZR/JXypE8zs7OYPQ1ZsyYgREjRhgjtW+abyKDqSlnlEVm9IoXLw5qRaUvXbr0ILOZjXakySiPA9PZyRmHjx7CWpJPuTLlMLD/s4iOjcbYiaNx/OQxpeVcuXYFxTyKKQ1HtKczZ09j+NvD8MtPi1GpYiA2b92oBleDug0RERmBEWNeJwENR7Uq1eFb3FcR1u59uxAZFYngRk3V0y8qJopqdhRCQq8hqHotdS43anwem6ez3wECjKC+v2bNmuqhZIz9yUsxMhYWL16sYoT69eunzCnxNzFQEteuXcOVK1fU96pVq6plIiEhISqdOXMGDHKEu7t7nhzl8qCrUqWKOLR7aTLKS0+ZWV7Ravbs303tp6Iy0ZxdbfH197OpCUXhkQf74dCRA5iz4Cf8OvdXTJ46BRcuXVBaTmpaKq6FXMM3P3zFgZVMgjqDtq3aoVzZCrh85RLi4uMw/bsvMGTgi/j48w+wefsmRjan4bclCzFp3Md48LH7US2wOonuMmpUC8KUD75UZKWPokeAZFDP19c3o58ZiJgbk8koteSVGbdz586BgYlKmxFTqkaNGti3bx+4bg3NmzfH1q1bMXr0aHAZCYYPH47y5ctj8+bNGDRo0E0SzG29Mm65Lk5STXPa9lhrRnkcy9Lh+w7sQecO9ylyOXXqPP76ZwU6tO6IUv4BOHDoAAL8S8PO2UZpN21atkPo9VD0fehRtGvdHttpkrVs1hqz5/+ISySh1i3aUvtprohswW/zlNa19M8l+Pv3dSSbCPR6tDvWbVijBujM6T9g2Z/L8OO8H/I04PPYRJ09jwhQS/USTVW0l7xqq+Jj4rINXL9+HYwDwooVKxQhMTYInJ1DUFAQZs+ejYEDB4LrzjBv3jwMGTIEjz32mCIvMQ2NpnxexBZtjOaeB6+h/Q+zmObXZJSHHhQiiqFJdvbcGQx7cbgij7ET30Gr5m1x8vQJ5fdZtWYlHurRG2l0C56mefbSc0Px2Zcfo/8jA0gyv2Pfwb2ws7clUe3EW8PHYNvOrahds47yFfn5lsBeEl2vbg+geIAbfUg7eM4PZ8+fUQRWvLQntbJdqBVUm+RklwfJddaCRIDaUJxoRUJEeSUjITFGRytNSEw1o89J5J0+fToeeOABWXOmzDKj9iWhA7JqX0w20ZTED5SXemUci7wkTwl+NJttjzUZ5WGUOjo4KtIJvRGK5sEtMP6DdxAeEY73x3yA+/t0wTP9B2LqV58hvFV7jJk4DmfOnUKpkgHUpPZi0IDnMOb90Xii3wA0bNAIU6ZNRmlqUAsX/UzfUSM6uNcgoFRp+pzcsIca1aF9hzHhwzHo3/dJ5Z8KbtQMabHAjt078NTjz3AwmcXDLA/oWW9Wzp4d4er5XrJo1WimGZ3HxlZn58AWDWXnzp2KcObPn69MNtGC69WrpzQmWVR78uRJ9blPnz5YuHAhdu/ejd9//x10QCvNyHTWzbTerBzYck75IFkP5T4lbyExl57RZJSHnpAJe5nF6t/vSXjQafjwA31RmdqQPGl6UpsJrFQVT5Iolq9ahorlKmLksLeUc7F9m464cPG80pKWrVyKSDqiZSYuIjIcHdt2xrnzZ1G5UqCabateNQijxg3Hm++8hR5de+GxPv1p5oWgRdOWCLkWjg5tOqFR/cZqRk8f5oEAHc5/njhxYpQQR140FJFewgDkOvm7ZMkSNZZktkxW4osGxC1HlAO7a9euKmjx4YcfxuTJk9XvgwcPVvWJeZjXQ3xUJKSVeb2uIPNrMsoDuomJCahCwqlD0gijRjTs+dfUk1Dih94YOgpRnAV56rFnVJKnj/wmU/wfTfhUPb3kKfhgj4fU9Lw8/WJjY9C8aSs1ADNU/FRek4aZ035SM3Eyqyaa1wvPvqz8AolJCRj2wmt0dscrNTu3Dss8NFFnvQMEuO5rY0BAwAFOl9eWvYmkr3PbNzJz1qtXL6X1mB5irom/SEhKCOmZZ55Rs2ziL5K+l7EhJCTnpK7c1GfUiuQaalcx1Mbm30FzC+wSTUZ5gFY6XDQjmWK3tbEl+fy37sj4OYYEk/kwnfXKiJj9T6vJ6qkWHZ1BNEJ+chj9CHJOyE2O3Ay+PDRNZ70LBMTU4eLYNznjtUw0GDnyMsVv6icyFcO4Al/KEjNODvkrfS+Lb41H5kDa7Joi1xnNQmpbH3ADtpC7aHa+X6rJKN8hvX2BuR04uc1XyOLr6rJBoE6dOstJSN/Tb/SMMVDR3PpQHN6nTp2SkICt1I4+NLfO1GRkbj2i5bFYBGj6DKH5VInT9W2rV6+uTG1Th7ZRo828yNW4vsz41wiA6XfTPPJ7bhfKGuuUiG3xE/31119nuTatN7WivDuaCrhnNBkVMMC6+HsHAW7LkcwFsz3+/vvvX2h6daW2pMyiO1k0m1+oie9SZDh27BjWr19/+Pz58z1IRGb54gRNRvnV67ocjQAR4I0ew6jmbiSgT+mXeZU7LcLLy+vmXteF4eszLqKVWTlxgEskN03IxTTRBnXu3DnMXDtKk5G59oyWy2IRoENbokBeIwH8w+DED7kndc3AwEAVQ2acii8If5LRQS0kJLOvEp+0d+9einB1LN9EMkP24DbnQ5OROfeOls2iERCnNndVXM13mg3hq4ReISFVkjVl8l40IQwhJvEp5TU2yRQUIwGJKSZlSTCjBEPSLLvOVxZ9x4W2k81t1iy7TrUIMrKz5z4vtpwS16/EMa+bk1uaSN8UhulhXg3PvTT0I8lGVZ9z76BvGaXdm2+BHcDV8m1ISg4SPyTaksQMSdyZ0TEtWpNRczKNqDbGExnxFhITf5QQkLzYURzU/LuD0//zSETzhIRkpb+lHOZNRt6wSUtLd0+O5dPDRr83zewGFcko3d4G9rZ8+aCzg36H4206yLCJ2Wxmmb1jx44qJI6OfHFjR0boN2QqL8GSspLe+CZZ415YxiKNWpTM0IkJJoGLJDchomv0C+3l+rS1jD36i8tI9sqbQWQ2z9IOsyajhh0rpSSGJm5YteDf4smped/G0xw7IyImzD85JcnFz8v/jDnKl1eZ7Bj8mcYnedlKfrEXEZHXy+/J/IzUPsGGS/qKZpwTtZfKJKHqDAmoQg2pPGfA/JmK8bMrtSA7EhEhTo9ngGw0P4aQkM7z7wmS0FE6yU+R6Ip21/986kWzJqOriVfj4Hk1I6TVSo6xn4wdxqYE0ck52EqapJtxFwgYzLjDLELSPX2YNRlZac/I3h/apLHSztXNunMENBndOXZ3eqW8oV6SPjQCGgETBDQZ6eGgEdAImAUCmozMohu0EBoBjYAmIz0GNAIaAbNAIDdkJKHt1jGvbhaQI9U8xNBSaATMC4HckJELRfbl4j/uwKyPfECgGMvQu+nnA5C6COtCICcyki0JZeZnBZPZbNxt4V0gr4cxm7d4WjiWWnwrQiAnMopgW4OZnA2kZEVNL7KmyKZW/783bZGJoyvWCJgHArclI8NWCBJqbhXh5uYBuZZCI6ARyAqBnDQjjZpGQCOgESgUBDQZFQrMuhKNgEYgJwQ0GeWEkP5dI6ARKBQENBkVCsy6Eo2ARiAnBDQZ5YSQ/l0joBEoFAQ0GRUKzLoSjYBGICcENBnlhJD+XSOgESgUBP4HCT8eKK1Fa2AAAAAASUVORK5CYII="/></p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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"> +<h3 id="PyMOO">PyMOO<a class="anchor-link" href="#PyMOO">¶</a></h3><p>PyMOO is a Python library that provides a comprehensive and easy-to-use framework for multi-objective optimization (MOO). For this case, we are going to deal with only one objective; nevertheless, this is an useful tool if you have more objectives. In addition, PyMOO easily allows us to define our optimization problem by specifying the objectives, constraints, and decision variables.</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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="Problem-definition-and-formulation">Problem definition and formulation<a class="anchor-link" href="#Problem-definition-and-formulation">¶</a></h2><p>Here is the problem formulation as presented in the previous Jupyter notebook</p> +$$\begin{align} + min \quad & \sum_{(i,j) \in A}{t^0_{ij} . x_{ij}} + \sum_{(i,j) \in A}{(t^0_{ij}.\beta /c^0_{ij}) . x^2_{ij}} - \sum_{(i,j) \in A}{(t^0_{ij}.\beta /c^0_{ij}) . x^2_{ij} . y_{ij}} + \sum_{(i,j) \in A}{t^0_{ij}.(\beta /c^1_{ij}) . x^2_{ij} . y_{ij}} \\ + s.t. \quad \\ + & \sum_{(i,j) \in A}{ y_{ij}} = B \\ + & \sum_{s \in D}{x_{ijs}} = x_{ij} \quad \forall (i,j) \in A \\ + & \sum_{j \in N; (i,j) \in A}{ x_{ijs}} - \sum_{j \in N; (j,i) \in A}{ x_{jis}} = d_{is} \quad \forall i \in N, \forall s \in D \\ + & y_{ij} \in \{0, 1\} \quad \forall (i,j) \in A \\ + & x_{ij} \geq 0 \quad \forall (i,j) \in A \\ + & x_{ijs} \geq 0 \quad \forall (i,j) \in A, \forall s \in D \\ +\end{align}$$<p>You can check the NDP notebook for details. But here we deal with it slightly differently to be able to use GA. Essentially, we break down the problem into two sub-problems: 1) the traffic assignment (TA) problem: the route choices of the drivers, and the 2) the road network design problem (NDP): where we select which links should be upgraded. We solve the problem by iteratively going between the Traffic assignment and the Design Problem. The idea is for the GA to move to better networks as generations pass which are evaluated by the traffic assignment process that you have learned. +We use Gurobi to solve the Traffic Assignment sub-problems, which provide us with the objective function (or fitness function within the context of GA) value of the decision problem (which will be dealt with using GA). This is usually referred to as the iterative-optimization-assignment method since we iteratively improve the objective function value of the NDP using the assignment problem.</p> +<p>So let's see how that works.</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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"> +<h3 id="The-network-design-sub-problem">The network design sub-problem<a class="anchor-link" href="#The-network-design-sub-problem">¶</a></h3><p>The network desing is where we use the genetic algorithm. As explained before, GA uses a population of solutions and iteratively improves this population to evolve to new generations of populations with a better objective function value (being that minimization or maximization). In this problem, the decision variables are links for capacity expansion and the objective function value is the total system travel time that we want to minimize.</p> +\begin{align} + min \quad & \sum_{(i,j) \in A}{t^0_{ij} . x_{ij}} + \sum_{(i,j) \in A}{(t^0_{ij}.\beta /c^0_{ij}) . x^2_{ij}} - \sum_{(i,j) \in A}{(t^0_{ij}.\beta /c^0_{ij}) . x^2_{ij} . y_{ij}} + \sum_{(i,j) \in A}{t^0_{ij}.(\beta /c^1_{ij}) . x^2_{ij} . y_{ij}} \\ + s.t. \quad \\ + & \sum_{(i,j) \in A}{ y_{ij}} = B \\ + & y_{ij} \in \{0, 1\} \quad \forall (i,j) \in A \\ +\end{align}<p>Where the values of $x_{ij}$ are not decision variables anymore, they will be obtained from solving the Traffic Assignment problem with Gurobi which evaluates the travel times on the network. This part of the problem will not be solved mathematically anymore, the $y_{ij}$ variables are decided by the genetic algorithm through the process you learned.</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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"> +<h3 id="The-traffic-assignment-sub-problem">The traffic assignment sub-problem<a class="anchor-link" href="#The-traffic-assignment-sub-problem">¶</a></h3><p>This is just part of the original NDP that assigns traffic to the network based on a set of given capacity values, which are defined based on the values of the DP decision variables (links selected for capacity expansion). The main difference (and the advantage) here is that by separating the binary decision variables, instead of a mixed integer programming problem, which are hard to solve, here we have a quadratic programming problem with continuous decision variables, which will be transformed to a linear problem that Gurobi can solve very fast.</p> +\begin{align} + min \quad & \sum_{(i,j) \in A}{t^0_{ij} . x_{ij}} + \sum_{(i,j) \in A}{(t^0_{ij}.\beta /c^0_{ij}) . x^2_{ij}} - \sum_{(i,j) \in A}{(t^0_{ij}.\beta /c^0_{ij}) . x^2_{ij} . y_{ij}} + \sum_{(i,j) \in A}{t^0_{ij}.(\beta /c^1_{ij}) . x^2_{ij} . y_{ij}} \\ + s.t. \quad \\ + & \sum_{s \in D}{x_{ijs}} = x_{ij} \quad \forall (i,j) \in A \\ + & \sum_{j \in N; (i,j) \in A}{ x_{ijs}} - \sum_{j \in N; (j,i) \in A}{ x_{jis}} = d_{is} \quad \forall i \in N, \forall s \in D \\ + & x_{ij} \geq 0 \quad \forall (i,j) \in A \\ + & x_{ijs} \geq 0 \quad \forall (i,j) \in A, \forall s \in D \\ +\end{align}<p>Where the values of $y_{ij}$ are constant and are defined by GA.</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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"> +<h3 id="Summarizing">Summarizing<a class="anchor-link" href="#Summarizing">¶</a></h3><p>The following is a diagram that shows what you are finally doing to solve the same problem but with a meta-heuristic approach:</p> +<p><img alt="GAdiagram.png" src="./figs/GAdiagram.png"/></p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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="Data-preprocessing">Data preprocessing<a class="anchor-link" href="#Data-preprocessing">¶</a></h2><p>Our data preprocessing steps are similar to the previous notebook. We use some networks from the well-known transportation networks for benchmarking repository as well as a small toy network for case studies of NDPs. the following functions read data from this repository and perform data preprocessing to have the input and the parameters required for our case studies.</p> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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"># import required packages</span> +<span class="kn">import</span> <span class="nn">os</span> +<span class="kn">import</span> <span class="nn">time</span> + +<span class="c1"># read network file</span> +<span class="k">def</span> <span class="nf">read_net</span><span class="p">(</span><span class="n">net_file</span><span class="p">):</span> +<span class="w"> </span><span class="sd">"""</span> +<span class="sd"> read network file</span> +<span class="sd"> """</span> + + <span class="n">net_data</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="n">net_file</span><span class="p">,</span> <span class="n">skiprows</span><span class="o">=</span><span class="mi">8</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s1">'</span><span class="se">\t</span><span class="s1">'</span><span class="p">)</span> + <span class="c1"># make sure all headers are lower case and without trailing spaces</span> + <span class="n">trimmed</span> <span class="o">=</span> <span class="p">[</span><span class="n">s</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">net_data</span><span class="o">.</span><span class="n">columns</span><span class="p">]</span> + <span class="n">net_data</span><span class="o">.</span><span class="n">columns</span> <span class="o">=</span> <span class="n">trimmed</span> + <span class="c1"># And drop the silly first and last columns</span> + <span class="n">net_data</span><span class="o">.</span><span class="n">drop</span><span class="p">([</span><span class="s1">'~'</span><span class="p">,</span> <span class="s1">';'</span><span class="p">],</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">inplace</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> + <span class="c1"># using dictionary to convert type of specific columns so taht we can assign very small (close to zero) possitive number to it.</span> + <span class="n">convert_dict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'free_flow_time'</span><span class="p">:</span> <span class="nb">float</span><span class="p">,</span> + <span class="s1">'capacity'</span><span class="p">:</span> <span class="nb">float</span><span class="p">,</span> + <span class="s1">'length'</span><span class="p">:</span> <span class="nb">float</span><span class="p">,</span> + <span class="s1">'power'</span><span class="p">:</span> <span class="nb">float</span> + <span class="p">}</span> + + <span class="n">net_data</span> <span class="o">=</span> <span class="n">net_data</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">convert_dict</span><span class="p">)</span> + + <span class="c1"># make sure everything makes sense (otherwise some solvers throw errors)</span> + <span class="n">net_data</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">net_data</span><span class="p">[</span><span class="s1">'free_flow_time'</span><span class="p">]</span> <span class="o"><=</span> <span class="mi">0</span><span class="p">,</span> <span class="s1">'free_flow_time'</span><span class="p">]</span> <span class="o">=</span> <span class="mf">1e-6</span> + <span class="n">net_data</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">net_data</span><span class="p">[</span><span class="s1">'capacity'</span><span class="p">]</span> <span class="o"><=</span> <span class="mi">0</span><span class="p">,</span> <span class="s1">'capacity'</span><span class="p">]</span> <span class="o">=</span> <span class="mf">1e-6</span> + <span class="n">net_data</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">net_data</span><span class="p">[</span><span class="s1">'length'</span><span class="p">]</span> <span class="o"><=</span> <span class="mi">0</span><span class="p">,</span> <span class="s1">'length'</span><span class="p">]</span> <span class="o">=</span> <span class="mf">1e-6</span> + <span class="n">net_data</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">net_data</span><span class="p">[</span><span class="s1">'power'</span><span class="p">]</span> <span class="o"><=</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">'power'</span><span class="p">]</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span> + <span class="n">net_data</span><span class="p">[</span><span class="s1">'init_node'</span><span class="p">]</span> <span class="o">=</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'init_node'</span><span class="p">]</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="nb">int</span><span class="p">)</span> + <span class="n">net_data</span><span class="p">[</span><span class="s1">'term_node'</span><span class="p">]</span> <span class="o">=</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'term_node'</span><span class="p">]</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="nb">int</span><span class="p">)</span> + <span class="n">net_data</span><span class="p">[</span><span class="s1">'b'</span><span class="p">]</span> <span class="o">=</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'b'</span><span class="p">]</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="nb">float</span><span class="p">)</span> + + <span class="c1"># extract features in dict format</span> + <span class="n">links</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">net_data</span><span class="p">[</span><span class="s1">'init_node'</span><span class="p">],</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'term_node'</span><span class="p">]))</span> + <span class="n">caps</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">links</span><span class="p">,</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'capacity'</span><span class="p">]))</span> + <span class="n">fftt</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">links</span><span class="p">,</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'free_flow_time'</span><span class="p">]))</span> + <span class="n">lent</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">links</span><span class="p">,</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'length'</span><span class="p">]))</span> + <span class="n">alpha</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">links</span><span class="p">,</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'b'</span><span class="p">]))</span> + <span class="n">beta</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">links</span><span class="p">,</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'power'</span><span class="p">]))</span> + + <span class="n">net</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'capacity'</span><span class="p">:</span> <span class="n">caps</span><span class="p">,</span> <span class="s1">'free_flow'</span><span class="p">:</span> <span class="n">fftt</span><span class="p">,</span> <span class="s1">'length'</span><span class="p">:</span> <span class="n">lent</span><span class="p">,</span> <span class="s1">'alpha'</span><span class="p">:</span> <span class="n">alpha</span><span class="p">,</span> <span class="s1">'beta'</span><span class="p">:</span> <span class="n">beta</span><span class="p">}</span> + + <span class="k">return</span> <span class="n">net</span> + + +<span class="c1"># read OD matrix (demand)</span> +<span class="k">def</span> <span class="nf">read_od</span><span class="p">(</span><span class="n">od_file</span><span class="p">):</span> +<span class="w"> </span><span class="sd">"""</span> +<span class="sd"> read OD matrix</span> +<span class="sd"> """</span> + + <span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">od_file</span><span class="p">,</span> <span class="s1">'r'</span><span class="p">)</span> + <span class="n">all_rows</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> + <span class="n">blocks</span> <span class="o">=</span> <span class="n">all_rows</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'Origin'</span><span class="p">)[</span><span class="mi">1</span><span class="p">:]</span> + <span class="n">matrix</span> <span class="o">=</span> <span class="p">{}</span> + <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">blocks</span><span class="p">)):</span> + <span class="n">orig</span> <span class="o">=</span> <span class="n">blocks</span><span class="p">[</span><span class="n">k</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span> + <span class="n">dests</span> <span class="o">=</span> <span class="n">orig</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span> + <span class="n">origs</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">orig</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> + + <span class="n">d</span> <span class="o">=</span> <span class="p">[</span><span class="nb">eval</span><span class="p">(</span><span class="s1">'{'</span> <span class="o">+</span> <span class="n">a</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">';'</span><span class="p">,</span> <span class="s1">','</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">' '</span><span class="p">,</span> <span class="s1">''</span><span class="p">)</span> <span class="o">+</span> <span class="s1">'}'</span><span class="p">)</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">dests</span><span class="p">]</span> + <span class="n">destinations</span> <span class="o">=</span> <span class="p">{}</span> + <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">d</span><span class="p">:</span> + <span class="n">destinations</span> <span class="o">=</span> <span class="p">{</span><span class="o">**</span><span class="n">destinations</span><span class="p">,</span> <span class="o">**</span><span class="n">i</span><span class="p">}</span> + <span class="n">matrix</span><span class="p">[</span><span class="n">origs</span><span class="p">]</span> <span class="o">=</span> <span class="n">destinations</span> + <span class="n">zones</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">matrix</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span> + <span class="n">od_dict</span> <span class="o">=</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">zones</span><span class="p">):</span> + <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">zones</span><span class="p">):</span> + <span class="n">demand</span> <span class="o">=</span> <span class="n">matrix</span><span class="o">.</span><span class="n">get</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="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">j</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">if</span> <span class="n">demand</span><span class="p">:</span> + <span class="n">od_dict</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="n">j</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)]</span> <span class="o">=</span> <span class="n">demand</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">od_dict</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="n">j</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)]</span> <span class="o">=</span> <span class="mi">0</span> + + <span class="k">return</span> <span class="n">od_dict</span> + + +<span class="c1"># read case study data</span> +<span class="k">def</span> <span class="nf">read_cases</span><span class="p">(</span><span class="n">networks</span><span class="p">,</span> <span class="n">input_dir</span><span class="p">):</span> +<span class="w"> </span><span class="sd">"""</span> +<span class="sd"> read case study data</span> +<span class="sd"> """</span> + + <span class="c1"># dictionaries for network and OD files</span> + <span class="n">net_dict</span> <span class="o">=</span> <span class="p">{}</span> + <span class="n">ods_dict</span> <span class="o">=</span> <span class="p">{}</span> + + <span class="c1"># selected case studies</span> + <span class="k">if</span> <span class="n">networks</span><span class="p">:</span> + <span class="n">cases</span> <span class="o">=</span> <span class="p">[</span><span class="n">case</span> <span class="k">for</span> <span class="n">case</span> <span class="ow">in</span> <span class="n">networks</span><span class="p">]</span> + <span class="k">else</span><span class="p">:</span> + <span class="c1"># all folders available (each one for one specific case)</span> + <span class="n">cases</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="n">input_dir</span><span class="p">)</span> <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isdir</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">input_dir</span><span class="p">,</span> <span class="n">x</span><span class="p">))]</span> + + <span class="c1"># iterate through cases and read network and OD</span> + <span class="k">for</span> <span class="n">case</span> <span class="ow">in</span> <span class="n">cases</span><span class="p">:</span> + <span class="n">mod</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">input_dir</span><span class="p">,</span> <span class="n">case</span><span class="p">)</span> + <span class="n">mod_files</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="n">mod</span><span class="p">)</span> + <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">mod_files</span><span class="p">:</span> + <span class="c1"># read network</span> + <span class="k">if</span> <span class="n">i</span><span class="o">.</span><span class="n">lower</span><span class="p">()[</span><span class="o">-</span><span class="mi">8</span><span class="p">:]</span> <span class="o">==</span> <span class="s1">'net.tntp'</span><span class="p">:</span> + <span class="n">net_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">mod</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span> + <span class="n">net_dict</span><span class="p">[</span><span class="n">case</span><span class="p">]</span> <span class="o">=</span> <span class="n">read_net</span><span class="p">(</span><span class="n">net_file</span><span class="p">)</span> + <span class="c1"># read OD matrix</span> + <span class="k">if</span> <span class="s1">'TRIPS'</span> <span class="ow">in</span> <span class="n">i</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="ow">and</span> <span class="n">i</span><span class="o">.</span><span class="n">lower</span><span class="p">()[</span><span class="o">-</span><span class="mi">5</span><span class="p">:]</span> <span class="o">==</span> <span class="s1">'.tntp'</span><span class="p">:</span> + <span class="n">ods_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">mod</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span> + <span class="n">ods_dict</span><span class="p">[</span><span class="n">case</span><span class="p">]</span> <span class="o">=</span> <span class="n">read_od</span><span class="p">(</span><span class="n">ods_file</span><span class="p">)</span> + + <span class="k">return</span> <span class="n">net_dict</span><span class="p">,</span> <span class="n">ods_dict</span> + + +<span class="c1"># create node-destination demand matrix</span> +<span class="k">def</span> <span class="nf">create_nd_matrix</span><span class="p">(</span><span class="n">ods_data</span><span class="p">,</span> <span class="n">origins</span><span class="p">,</span> <span class="n">destinations</span><span class="p">,</span> <span class="n">nodes</span><span class="p">):</span> + <span class="c1"># create node-destination demand matrix (not a regular OD!)</span> + <span class="n">demand</span> <span class="o">=</span> <span class="p">{(</span><span class="n">n</span><span class="p">,</span> <span class="n">d</span><span class="p">):</span> <span class="mi">0</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">nodes</span> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">destinations</span><span class="p">}</span> + <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">origins</span><span class="p">:</span> + <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">destinations</span><span class="p">:</span> + <span class="k">if</span> <span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span> <span class="ow">in</span> <span class="n">ods_data</span><span class="p">:</span> + <span class="n">demand</span><span class="p">[</span><span class="n">r</span><span class="p">,</span> <span class="n">s</span><span class="p">]</span> <span class="o">=</span> <span class="n">ods_data</span><span class="p">[</span><span class="n">r</span><span class="p">,</span> <span class="n">s</span><span class="p">]</span> + <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">destinations</span><span class="p">:</span> + <span class="n">demand</span><span class="p">[</span><span class="n">s</span><span class="p">,</span> <span class="n">s</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span> <span class="nb">sum</span><span class="p">(</span><span class="n">demand</span><span class="p">[</span><span class="n">j</span><span class="p">,</span> <span class="n">s</span><span class="p">]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">origins</span><span class="p">)</span> + + <span class="k">return</span> <span class="n">demand</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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 that we have the required functions for reading and processing the data, let's define some problem parameters and prepare the input.</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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:#ffa6a6; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"><p><b>Note:</b> the variables <code>extension_max_no</code> and <code>timelimit</code> were both defined here, but never used. <code>extension_max_no</code> is similar to the variable in notebook A with the same name; here it is superceded below by <code>Budget</code>.</p></div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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"># define parameters, case study (network) list and the directory where their files are</span> +<span class="n">extension_factor</span> <span class="o">=</span> <span class="mf">1.5</span> <span class="c1"># capacity after extension (1.5 means add 50%)</span> +<span class="n">extension_max_no</span> <span class="o">=</span> <span class="mi">20</span> <span class="c1"># the number of links to add capacity to (simplified way of reprsenting a budget for investing)</span> +<span class="c1">#it's the same to say that it's exactly this number of that this number is the max, that's because every investment brings travel time benefits </span> +<span class="c1">#even if just one car circulates.</span> +<span class="n">timelimit</span> <span class="o">=</span> <span class="mi">300</span> <span class="c1"># seconds</span> +<span class="n">beta</span> <span class="o">=</span> <span class="mi">2</span> <span class="c1"># parameter to use in link travel time function (explained later)</span> + +<span class="n">networks</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'SiouxFalls'</span><span class="p">]</span> +<span class="n">networks_dir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">getcwd</span><span class="p">()</span> <span class="o">+</span><span class="s1">'/input/TransportationNetworks'</span> + + +<span class="c1"># prep data</span> +<span class="n">net_dict</span><span class="p">,</span> <span class="n">ods_dict</span> <span class="o">=</span> <span class="n">read_cases</span><span class="p">(</span><span class="n">networks</span><span class="p">,</span> <span class="n">networks_dir</span><span class="p">)</span> + +<span class="c1"># Let's load the network and demand (OD matrix) data of the first network (Sioux Falls) to two dictionaries for our first case study.</span> +<span class="c1"># WE USE THE SAME NETWORK FROM THE FIRST NOTEBOOK: SIOUX FALLS</span> +<span class="c1"># The network has 76 arcs in total</span> +<span class="n">net_data</span><span class="p">,</span> <span class="n">ods_data</span> <span class="o">=</span> <span class="n">net_dict</span><span class="p">[</span><span class="n">networks</span><span class="p">[</span><span class="mi">0</span><span class="p">]],</span> <span class="n">ods_dict</span><span class="p">[</span><span class="n">networks</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span> + +<span class="c1">## now let's prepare the data in a format readable by gurobi</span> + +<span class="c1"># prep links, nodes, and free flow travel times</span> +<span class="n">links</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">net_data</span><span class="p">[</span><span class="s1">'capacity'</span><span class="p">]</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span> +<span class="n">nodes</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">unique</span><span class="p">([</span><span class="nb">list</span><span class="p">(</span><span class="n">edge</span><span class="p">)</span> <span class="k">for</span> <span class="n">edge</span> <span class="ow">in</span> <span class="n">links</span><span class="p">])</span> +<span class="n">fftts</span> <span class="o">=</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'free_flow'</span><span class="p">]</span> + +<span class="c1"># auxiliary parameters (dict format) to keep the problem linear (capacities as parameters rather than variables)</span> +<span class="n">cap_normal</span> <span class="o">=</span> <span class="p">{(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">):</span> <span class="n">cap</span> <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">),</span> <span class="n">cap</span> <span class="ow">in</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'capacity'</span><span class="p">]</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span> +<span class="n">cap_extend</span> <span class="o">=</span> <span class="p">{(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">):</span> <span class="n">cap</span> <span class="o">*</span> <span class="n">extension_factor</span> <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">),</span> <span class="n">cap</span> <span class="ow">in</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'capacity'</span><span class="p">]</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span> + +<span class="c1"># origins and destinations</span> +<span class="n">dests</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">unique</span><span class="p">([</span><span class="n">dest</span> <span class="k">for</span> <span class="p">(</span><span class="n">orig</span><span class="p">,</span> <span class="n">dest</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">ods_data</span><span class="o">.</span><span class="n">keys</span><span class="p">())])</span> +<span class="n">origs</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">unique</span><span class="p">([</span><span class="n">orig</span> <span class="k">for</span> <span class="p">(</span><span class="n">orig</span><span class="p">,</span> <span class="n">dest</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">ods_data</span><span class="o">.</span><span class="n">keys</span><span class="p">())])</span> + +<span class="c1"># demand in node-destination form</span> +<span class="n">demand</span> <span class="o">=</span> <span class="n">create_nd_matrix</span><span class="p">(</span><span class="n">ods_data</span><span class="p">,</span> <span class="n">origs</span><span class="p">,</span> <span class="n">dests</span><span class="p">,</span> <span class="n">nodes</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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="Network-Display">Network Display<a class="anchor-link" href="#Network-Display">¶</a></h2><p>We will use the same function we used in the previous notebook to visualize the network.</p> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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">coordinates_path</span> <span class="o">=</span> <span class="s1">'input/TransportationNetworks/SiouxFalls/SiouxFallsCoordinates.geojson'</span> +</pre></div> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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">G</span><span class="p">,</span> <span class="n">pos</span> <span class="o">=</span> <span class="n">network_visualization</span><span class="p">(</span><span class="n">link_flow</span> <span class="o">=</span> <span class="n">fftts</span><span class="p">,</span><span class="n">coordinates_path</span><span class="o">=</span> <span class="n">coordinates_path</span><span class="p">)</span> <span class="c1"># the network we create here will be used later for further visualizations!</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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 are ready to build our models!</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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"> +<h3 id="Modeling-and-solving-the-traffic-assignment-sub-problem-with-Gurobi">Modeling and solving the traffic assignment sub-problem with Gurobi<a class="anchor-link" href="#Modeling-and-solving-the-traffic-assignment-sub-problem-with-Gurobi">¶</a></h3><p>In this section we build a Gurobi model to solve the Traffic Assignment sub-problems. The decision variables, objective function, and the constraints of this problem were described before. +Here we wrap the code in a function so that we can use it later within the GA.</p> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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">ta_qp</span><span class="p">(</span><span class="n">dvs</span><span class="p">,</span> <span class="n">net_data</span><span class="o">=</span><span class="n">net_data</span><span class="p">,</span> <span class="n">ods_data</span><span class="o">=</span><span class="n">ods_data</span><span class="p">,</span> <span class="n">extension_factor</span><span class="o">=</span><span class="mf">1.5</span><span class="p">):</span> + + <span class="c1"># prep variables</span> + <span class="n">beta</span> <span class="o">=</span> <span class="mi">2</span> + <span class="n">links</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">net_data</span><span class="p">[</span><span class="s1">'capacity'</span><span class="p">]</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span> + <span class="n">nodes</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">unique</span><span class="p">([</span><span class="nb">list</span><span class="p">(</span><span class="n">edge</span><span class="p">)</span> <span class="k">for</span> <span class="n">edge</span> <span class="ow">in</span> <span class="n">links</span><span class="p">])</span> + <span class="n">fftts</span> <span class="o">=</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'free_flow'</span><span class="p">]</span> + <span class="n">links_selected</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">links</span><span class="p">,</span> <span class="n">dvs</span><span class="p">))</span> + + <span class="c1"># define capacity</span> + <span class="n">cap_normal</span> <span class="o">=</span> <span class="p">{(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">):</span> <span class="n">cap</span> <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">),</span> <span class="n">cap</span> <span class="ow">in</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'capacity'</span><span class="p">]</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span> + <span class="n">cap_extend</span> <span class="o">=</span> <span class="p">{(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">):</span> <span class="n">cap</span> <span class="o">*</span> <span class="n">extension_factor</span> <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">),</span> <span class="n">cap</span> <span class="ow">in</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'capacity'</span><span class="p">]</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span> + <span class="n">capacity</span> <span class="o">=</span> <span class="p">{(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">):</span> <span class="n">cap_normal</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">links_selected</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">])</span> <span class="o">+</span> <span class="n">cap_extend</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o">*</span> <span class="n">links_selected</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> + <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span> <span class="ow">in</span> <span class="n">links</span><span class="p">}</span> + + <span class="n">dests</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">unique</span><span class="p">([</span><span class="n">dest</span> <span class="k">for</span> <span class="p">(</span><span class="n">orig</span><span class="p">,</span> <span class="n">dest</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">ods_data</span><span class="o">.</span><span class="n">keys</span><span class="p">())])</span> + <span class="n">origs</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">unique</span><span class="p">([</span><span class="n">orig</span> <span class="k">for</span> <span class="p">(</span><span class="n">orig</span><span class="p">,</span> <span class="n">dest</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">ods_data</span><span class="o">.</span><span class="n">keys</span><span class="p">())])</span> + + <span class="c1"># demand in node-destination form</span> + <span class="n">demand</span> <span class="o">=</span> <span class="n">create_nd_matrix</span><span class="p">(</span><span class="n">ods_data</span><span class="p">,</span> <span class="n">origs</span><span class="p">,</span> <span class="n">dests</span><span class="p">,</span> <span class="n">nodes</span><span class="p">)</span> + + <span class="c1">## create a gurobi model object</span> + <span class="n">model</span> <span class="o">=</span> <span class="n">gp</span><span class="o">.</span><span class="n">Model</span><span class="p">()</span> + <span class="c1"># just to avoid cluttering the notebook with unnecessary logging output</span> + <span class="n">model</span><span class="o">.</span><span class="n">Params</span><span class="o">.</span><span class="n">LogToConsole</span> <span class="o">=</span> <span class="mi">0</span> + + <span class="c1">## decision variables:</span> + + <span class="c1"># link flows (x_ij); i: a_node, j: b_node</span> + <span class="n">link_flow</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">addVars</span><span class="p">(</span><span class="n">links</span><span class="p">,</span> <span class="n">vtype</span><span class="o">=</span><span class="n">gp</span><span class="o">.</span><span class="n">GRB</span><span class="o">.</span><span class="n">CONTINUOUS</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">'x'</span><span class="p">)</span> + + <span class="c1"># link flows per destination (xs_ijs); i: a_node, j: b_node, s: destination</span> + <span class="n">dest_flow</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">addVars</span><span class="p">(</span><span class="n">links</span><span class="p">,</span> <span class="n">dests</span><span class="p">,</span> <span class="n">vtype</span><span class="o">=</span><span class="n">gp</span><span class="o">.</span><span class="n">GRB</span><span class="o">.</span><span class="n">CONTINUOUS</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">'xs'</span><span class="p">)</span> + + <span class="c1">## constraints</span> + + <span class="c1"># node flow conservation (demand)</span> + <span class="n">model</span><span class="o">.</span><span class="n">addConstrs</span><span class="p">(</span> + <span class="n">gp</span><span class="o">.</span><span class="n">quicksum</span><span class="p">(</span><span class="n">dest_flow</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">,</span> <span class="n">s</span><span class="p">]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">nodes</span> <span class="k">if</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span> <span class="ow">in</span> <span class="n">links</span><span class="p">)</span> <span class="o">-</span> + <span class="n">gp</span><span class="o">.</span><span class="n">quicksum</span><span class="p">(</span><span class="n">dest_flow</span><span class="p">[</span><span class="n">j</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">s</span><span class="p">]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">nodes</span> <span class="k">if</span> <span class="p">(</span><span class="n">j</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span> <span class="ow">in</span> <span class="n">links</span><span class="p">)</span> <span class="o">==</span> <span class="n">demand</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">s</span><span class="p">]</span> + <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">nodes</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">dests</span> + <span class="p">)</span> + + <span class="c1"># link flow conservation (destination flows and link flows)</span> + <span class="n">model</span><span class="o">.</span><span class="n">addConstrs</span><span class="p">(</span><span class="n">gp</span><span class="o">.</span><span class="n">quicksum</span><span class="p">(</span><span class="n">dest_flow</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">,</span> <span class="n">s</span><span class="p">]</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">dests</span><span class="p">)</span> <span class="o">==</span> <span class="n">link_flow</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span> <span class="ow">in</span> <span class="n">links</span><span class="p">)</span> + + <span class="c1">## objective function (total travel time)</span> + <span class="c1"># total travel time = sum (link flow * link travel time)</span> + <span class="c1"># link travel time = free flow travel time * (1 + (flow / capacity))</span> + + <span class="n">model</span><span class="o">.</span><span class="n">setObjective</span><span class="p">(</span> + <span class="n">gp</span><span class="o">.</span><span class="n">quicksum</span><span class="p">(</span><span class="n">link_flow</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="n">fftts</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">+</span> <span class="p">(</span><span class="n">beta</span> <span class="o">*</span> <span class="n">link_flow</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span><span class="o">/</span><span class="n">capacity</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">])))</span> <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span> <span class="ow">in</span> <span class="n">links</span><span class="p">))</span> + + + <span class="c1">## solve</span> + <span class="n">model</span><span class="o">.</span><span class="n">update</span><span class="p">()</span> + <span class="n">start_solve</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> + <span class="n">model</span><span class="o">.</span><span class="n">optimize</span><span class="p">()</span> + <span class="n">solve_time</span> <span class="o">=</span> <span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">-</span> <span class="n">start_solve</span><span class="p">)</span> + + <span class="c1"># fetch optimal DV and OF values</span> + <span class="n">link_flows</span> <span class="o">=</span> <span class="p">{(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">):</span> <span class="n">link_flow</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span><span class="o">.</span><span class="n">X</span> <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span> <span class="ow">in</span> <span class="n">links</span><span class="p">}</span> + <span class="n">total_travel_time</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">ObjVal</span> + + <span class="k">return</span> <span class="n">total_travel_time</span><span class="p">,</span> <span class="n">capacity</span><span class="p">,</span> <span class="n">link_flows</span><span class="p">,</span> <span class="n">links_selected</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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="Modeling-with-PyMOO">Modeling with PyMOO<a class="anchor-link" href="#Modeling-with-PyMOO">¶</a></h2><p>Let's define a model in MyMOO and deal with the links selection problem with the GA.</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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>First, we need to define a problem class.</p> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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">#If you want to know more about the library that is being used: https://pymoo.org/algorithms/soo/ga.html</span> + +<span class="k">class</span> <span class="nc">NDP</span><span class="p">(</span><span class="n">ElementwiseProblem</span><span class="p">):</span> + + <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">budget</span><span class="p">):</span> + + <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">n_var</span><span class="o">=</span><span class="nb">len</span><span class="p">(</span><span class="n">links</span><span class="p">),</span> <span class="c1"># number of decision variables (i.e., number of links)</span> + <span class="n">n_obj</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="c1"># for now we use only one objective (total travel time)</span> + <span class="n">n_constr</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="c1"># one constraint for budget, that's because the GA shoud not create unfeasible solutions</span> + <span class="n">vtype</span><span class="o">=</span><span class="nb">bool</span><span class="p">,</span> <span class="c1"># binary decision variables</span> + <span class="p">)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">budget</span> <span class="o">=</span> <span class="n">budget</span> + + <span class="k">def</span> <span class="nf">_evaluate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">decision_vars</span><span class="p">,</span> <span class="n">out</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> + + <span class="c1"># call TA to calculate the objective fucntion, meaning to do the evaluation of the solutions</span> + <span class="n">total_travel_time</span><span class="p">,</span><span class="n">capacity</span><span class="p">,</span> <span class="n">link_flows</span><span class="p">,</span> <span class="n">links_selected</span> <span class="o">=</span> <span class="n">ta_qp</span><span class="p">(</span><span class="n">decision_vars</span><span class="p">)</span> + + <span class="c1"># the budget constraint</span> + <span class="c1"># In the GA part the only variables are the binary decision variables, don't forget that the traffic assignment that </span> + <span class="c1"># produces the travel time on the network is done in the evaluation of the solution</span> + <span class="n">g</span> <span class="o">=</span> <span class="nb">sum</span><span class="p">(</span><span class="n">decision_vars</span><span class="p">)</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">budget</span> + + <span class="n">out</span><span class="p">[</span><span class="s2">"F"</span><span class="p">]</span> <span class="o">=</span> <span class="n">total_travel_time</span> + <span class="n">out</span><span class="p">[</span><span class="s2">"G"</span><span class="p">]</span> <span class="o">=</span> <span class="n">g</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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, let's initiate an instance of the problem based on the problem class we defined, and initiate the GA with its parameters. Note that depending on the problem size and the number of feasible links, you might need larger values for population and generation size to achieve good results or even feasible results. Of course this increases the computation times.</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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:#ffa6a6; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"><p><b>Note:</b> population size <code>pop_size</code> was 10 originally. If you change this, you will see different results. This is problem-dependent!</p></div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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:#ffa6a6; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"><p><b>This:</b> <code>Budget</code> is the way the number of links was selected (unlike notebook A, which used <code>extension_max_no</code>). </p></div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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:#ffa6a6; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"><p><b>This:</b> <code>Budget</code> is the way the number of links was selected (unlike notebook A, which used <code>extension_max_no</code>). The initial value of 76 was trivial, and the solution converged quickly. Numbers between 10 and 40 would have produced <em>much</em> more interesting results (see solution explanation).</p></div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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">Budget</span> <span class="o">=</span> <span class="mi">76</span> +<span class="n">pop_size</span> <span class="o">=</span> <span class="mi">10</span> + +<span class="c1"># initiate an instance of the problem with max number of selected links as budget constraint</span> +<span class="n">problem</span> <span class="o">=</span> <span class="n">NDP</span><span class="p">(</span><span class="n">budget</span><span class="o">=</span><span class="n">Budget</span><span class="p">)</span> + +<span class="c1"># initiate the GA with parameters appropriate for binary variables</span> +<span class="n">method</span> <span class="o">=</span> <span class="n">GA</span><span class="p">(</span><span class="n">pop_size</span><span class="o">=</span><span class="n">pop_size</span><span class="p">,</span> + <span class="n">sampling</span><span class="o">=</span><span class="n">BinaryRandomSampling</span><span class="p">(),</span> + <span class="n">mutation</span><span class="o">=</span><span class="n">BitflipMutation</span><span class="p">(),</span> + <span class="n">crossover</span><span class="o">=</span><span class="n">HalfUniformCrossover</span><span class="p">()</span> + <span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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 are ready to minimize the NDP problem using the GA method we defined.</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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:#ffa6a6; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"><p><b>Note:</b> termination is set here as a keyword argument (see note above).</p></div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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">opt_results</span> <span class="o">=</span> <span class="n">minimize</span><span class="p">(</span><span class="n">problem</span><span class="p">,</span> + <span class="n">method</span><span class="p">,</span> + <span class="n">termination</span><span class="o">=</span><span class="p">(</span><span class="s2">"time"</span><span class="p">,</span> <span class="s2">"00:05:00"</span><span class="p">),</span> <span class="c1">#5 minute maximum computation time</span> + <span class="n">seed</span><span class="o">=</span><span class="mi">7</span><span class="p">,</span> + <span class="n">save_history</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> + <span class="n">verbose</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> + <span class="p">)</span> + +<span class="nb">print</span><span class="p">(</span><span class="s2">"Best Objective Function value: </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="n">opt_results</span><span class="o">.</span><span class="n">F</span><span class="p">)</span> +<span class="nb">print</span><span class="p">(</span><span class="s2">"Constraint violation: </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="n">opt_results</span><span class="o">.</span><span class="n">CV</span><span class="p">)</span> +<span class="nb">print</span><span class="p">(</span><span class="s2">"Best solution found: </span><span class="si">%s</span><span class="s2">"</span> <span class="o">%</span> <span class="n">opt_results</span><span class="o">.</span><span class="n">X</span><span class="p">)</span> + +<span class="c1">#To better interpret the results, this is the legend:</span> +<span class="c1">#n_gen: Number of generations</span> +<span class="c1">#n_eval: Number of function evaluations</span> +<span class="c1">#cv_min: Minimum constraint violation</span> +<span class="c1">#cv_avg: Average constraint violation</span> +<span class="c1">#f_avg: Average objective function value</span> +<span class="c1">#f_min: Minimum objective function value</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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"> +<h3 id="Convergence-curve">Convergence curve<a class="anchor-link" href="#Convergence-curve">¶</a></h3><p>Let's first define some functions (to use later) to get the results and plot them.</p> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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">get_results</span><span class="p">(</span><span class="n">opt_results</span><span class="p">):</span> + + <span class="n">number_of_individuals</span> <span class="o">=</span> <span class="p">[]</span> <span class="c1"># The number of individuals in each generation</span> + <span class="n">optimal_values_along_generations</span> <span class="o">=</span> <span class="p">[]</span> <span class="c1"># The optimal value found in each generation</span> + + <span class="k">for</span> <span class="n">generation_status</span> <span class="ow">in</span> <span class="n">opt_results</span><span class="o">.</span><span class="n">history</span><span class="p">:</span> + + <span class="c1"># retrieve the optimum from the algorithm</span> + <span class="n">optimum</span> <span class="o">=</span> <span class="n">generation_status</span><span class="o">.</span><span class="n">opt</span> + + <span class="c1"># filter out only the feasible solutions and append and objective space values</span> + <span class="k">try</span><span class="p">:</span> + <span class="n">feas</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">where</span><span class="p">(</span><span class="n">optimum</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"feasible"</span><span class="p">))[</span><span class="mi">0</span><span class="p">]</span> + <span class="n">optimal_values_along_generations</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">optimum</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"F"</span><span class="p">)[</span><span class="n">feas</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">])</span> + <span class="c1"># store the number of function evaluations</span> + <span class="n">number_of_individuals</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">generation_status</span><span class="o">.</span><span class="n">evaluator</span><span class="o">.</span><span class="n">n_eval</span><span class="p">)</span> + <span class="k">except</span><span class="p">:</span> + <span class="c1">#In case a generation does not have any feasible solutions, it will be ignored.</span> + <span class="k">pass</span> + + <span class="k">return</span> <span class="n">number_of_individuals</span><span class="p">,</span> <span class="n">optimal_values_along_generations</span> + + +<span class="k">def</span> <span class="nf">plot_results</span><span class="p">(</span><span class="n">number_of_individuals</span><span class="p">,</span> <span class="n">optimal_values_along_generations</span><span class="p">):</span> + + <span class="c1"># Create a scatter plot with enhanced styling</span> + <span class="n">plt</span><span class="o">.</span><span class="n">figure</span><span class="p">(</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">6</span><span class="p">))</span> <span class="c1"># Set the figure size</span> + + <span class="c1"># Create a scatter plot</span> + <span class="n">plt</span><span class="o">.</span><span class="n">scatter</span><span class="p">(</span><span class="n">number_of_individuals</span><span class="p">,</span> <span class="n">optimal_values_along_generations</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s1">'Best objective function'</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s1">'blue'</span><span class="p">,</span> <span class="n">marker</span><span class="o">=</span><span class="s1">'o'</span><span class="p">,</span> <span class="n">s</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span> <span class="n">alpha</span><span class="o">=</span><span class="mf">0.7</span><span class="p">,</span> <span class="n">edgecolors</span><span class="o">=</span><span class="s1">'black'</span><span class="p">,</span> <span class="n">linewidths</span><span class="o">=</span><span class="mf">1.5</span><span class="p">)</span> + + <span class="c1"># Add labels and a legend with improved formatting</span> + <span class="n">plt</span><span class="o">.</span><span class="n">xlabel</span><span class="p">(</span><span class="s1">'Function evaluations'</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">14</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="s1">'bold'</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">ylabel</span><span class="p">(</span><span class="s1">'Total Travel Time'</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">14</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="s1">'bold'</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">'Best solution evolution'</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">16</span><span class="p">,</span> <span class="n">fontweight</span><span class="o">=</span><span class="s1">'bold'</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="s1">'upper right'</span><span class="p">,</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">12</span><span class="p">)</span> + + <span class="c1"># Customize the grid appearance</span> + <span class="n">plt</span><span class="o">.</span><span class="n">grid</span><span class="p">(</span><span class="kc">True</span><span class="p">,</span> <span class="n">linestyle</span><span class="o">=</span><span class="s1">'--'</span><span class="p">,</span> <span class="n">alpha</span><span class="o">=</span><span class="mf">0.5</span><span class="p">)</span> + + <span class="c1"># Customize the tick labels</span> + <span class="n">plt</span><span class="o">.</span><span class="n">xticks</span><span class="p">(</span><span class="n">fontsize</span><span class="o">=</span><span class="mi">12</span><span class="p">)</span> + <span class="n">plt</span><span class="o">.</span><span class="n">yticks</span><span class="p">(</span><span class="n">fontsize</span><span class="o">=</span><span class="mi">12</span><span class="p">)</span> + + <span class="c1"># Add a background color to the plot</span> + <span class="n">plt</span><span class="o">.</span><span class="n">gca</span><span class="p">()</span><span class="o">.</span><span class="n">set_facecolor</span><span class="p">(</span><span class="s1">'#f2f2f2'</span><span class="p">)</span> + + <span class="c1"># Show the plot</span> + <span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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 let's use these functions to plot the results.</p> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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">number_of_individuals</span><span class="p">,</span> <span class="n">optimal_values_along_generations</span> <span class="o">=</span> <span class="n">get_results</span><span class="p">(</span><span class="n">opt_results</span><span class="p">)</span> + +<span class="n">plot_results</span><span class="p">(</span><span class="n">number_of_individuals</span><span class="p">,</span> <span class="n">optimal_values_along_generations</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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="Network-Visualization">Network Visualization<a class="anchor-link" href="#Network-Visualization">¶</a></h2><p>Same as the previous notebook we use link_flows, links_selected to visualize our results on the network.</p> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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">travel_time</span><span class="p">,</span> <span class="n">capacity</span><span class="p">,</span> <span class="n">link_flows</span><span class="p">,</span> <span class="n">links_selected</span><span class="o">=</span> <span class="n">ta_qp</span><span class="p">(</span><span class="n">dvs</span><span class="o">=</span><span class="n">opt_results</span><span class="o">.</span><span class="n">X</span><span class="p">,</span> <span class="n">net_data</span><span class="o">=</span><span class="n">net_data</span><span class="p">,</span> <span class="n">ods_data</span><span class="o">=</span><span class="n">ods_data</span><span class="p">,</span> <span class="n">extension_factor</span><span class="o">=</span><span class="mf">1.5</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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"># Plot results</span> +<span class="c1"># To see the values for all the links just turn on the labels in the function below.</span> +<span class="n">network_visualization_upgraded</span> <span class="p">(</span><span class="n">G</span> <span class="o">=</span> <span class="n">G</span><span class="p">,</span> <span class="n">pos</span><span class="o">=</span><span class="n">pos</span><span class="p">,</span> <span class="n">link_flow</span><span class="o">=</span><span class="n">link_flows</span><span class="p">,</span> <span class="n">capacity_new</span><span class="o">=</span><span class="n">capacity</span> <span class="p">,</span><span class="n">link_select</span><span class="o">=</span><span class="n">links_selected</span><span class="p">,</span> <span class="n">labels</span><span class="o">=</span><span class="s1">'off'</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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-nc-sa/4.0/" rel="license"> +<img alt="Creative Commons License" src="https://i.creativecommons.org/l/by-nc-sa/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 2023 <a href="https://studiegids.tudelft.nl/a101_displayCourse.do?course_id=65595" rel="MUDE Team">MUDE Teaching Team</a> TU Delft. This work is licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/4.0/" rel="license">Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License</a>. + +</span></div> +</div> +</div> +</div> +</main> +</body> +</html> diff --git a/src/teachers/GA_2_5/Analysis_LP_solution.html b/src/teachers/GA_2_5/Analysis_LP_solution.html new file mode 100644 index 0000000000000000000000000000000000000000..1d0aff5273d6a1f36707c1a6d7c9fb94e9555230 --- /dev/null +++ b/src/teachers/GA_2_5/Analysis_LP_solution.html @@ -0,0 +1,8455 @@ +<!DOCTYPE html> + +<html lang="en"> +<head><meta charset="utf-8"/> +<meta content="width=device-width, initial-scale=1.0" name="viewport"/> +<title>Analysis_LP_solution</title><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.min.js"></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"> +<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="Don't-do-math-and-drive">Don't do math and drive<a class="anchor-link" href="#Don't-do-math-and-drive">¶</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.5. For: 15 December, 2023.</em></p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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:#ffa6a6; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"><p><b>Note:</b> during the in-class session some of the confusion was caused by code issues. Comments relevant to the code and notebooks as-used in the Friday in-class session are provided in boxes like this.</p></div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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="Problem-description">Problem description<a class="anchor-link" href="#Problem-description">¶</a></h1><p><em>Note: part of the background material for this project was already available in <a href="https://mude.citg.tudelft.nl/2023/book/optimization/project.html">Chapter 5.11 of the textbook</a>.</em></p> +<p>The road network design problem (NDP) is the problem of determining which links to build/refurbish/upgrade in order to improve the performance of a road network. One of the variations of the road NDP is the road NDP with capacity expansions, which involves deciding which links should have their capacity increased. This is a complex problem that must take into account a variety of factors, including:</p> +<ul> +<li>The current state of the road network</li> +<li>The projected future traffic demand</li> +<li>The budget available for improvements</li> +<li>The impacts of the adjustments (could be environmental, social, etc).</li> +</ul> +<p>There are a variety of approaches to dealing with the road network design problem with capacity expansion. One common approach is to use mathematical optimization models. In this assignment we use a simplified example to show how optimization can be used to tackle road NDPs. Note that the classical approaches to dealing with road NDPs can be more complicated and will be covered in other courses in the TTE track of the civil engineering master program.</p> +<p>In this assignment, the goal is to minimize the total travel time on the network by selecting a predefined number of links for capacity expansion (subject to the available budget). The following (main) assumptions and simplifications are made to make the problem solvable using methods and algorithms that you have learned so far.</p> +<h3 id="1.-Link-travel-time-function">1. Link travel time function<a class="anchor-link" href="#1.-Link-travel-time-function">¶</a></h3><p>Travel time on a stretch of road (i.e., a link) depends on the flow (vehicles/hour) on that link and the capacity of the link (maximum of vehicles/hour). The most common function to calculate travel time on a link is the so-called Bureau of Public Roads (BPR) function, which is a polynomial (degree 4) function. That function, if used in the assignment, would make the problem non-linear and therefore very hard to solve. So we use a simplified linear function where travel time grows linearly with the flow of vehicles on a road link. More details are provided within the formulation section.</p> +<p><img alt="link_travel_time_function.png" src="./figs/link_travel_time_function.png"/></p> +<p>${t_{ij}} = t_{ij}^0\left( {1 + \alpha {{\left( {\cfrac{x_{ij}}{c_{ij}}} \right)}^\beta }} \right) \quad \left( {i,j} \right) \in A$</p> +<p>Where $t_{ij}$ is the current travel time on the link, $t_{ij}^0$ is the travel time without congestion (free flow), $x_{ij}$ is the flow of cars, and $_c{ij}$ the capacity in maximum flow of cars. $\alpha$ and $\beta$ are calibration parameters.</p> +<h3 id="2.-Route-choice-behavior">2. Route choice behavior<a class="anchor-link" href="#2.-Route-choice-behavior">¶</a></h3><p>In order to assess the quality of the road capacity expansion problem, one must know what the effect of the added capacity is on travel time. For that, it is not sufficient to model the travel time-flow function, you must know where the vehicles are going to drive on the road. The route choice behavior of drivers within congested networks often follows the so-called User Equilibrium (UE) principle where each traveller tries to minimize their own individual generalized travel time.The UE states that for each origin and destination pair, all used routes between those nodes have equal and minimal travel time. That is, no driver can improve his/her travel time by choosing another path, therefore an equilibrium is reached. +However, calculating the UE requires advanced methods which are not covered in the MUDE. Therefore, here we assume the route choice behaviour follows the so-called System Optimal (SO) principle, which implies that route choices are made in such a way that the total travel time is minimized (summed over all the drivers). That means that some cars will drive longer routes so that other cars can save time. This is also called social equilibrium. This type of equilibrium is easier to compute. But just have in mind that in our road networks you can hardly obtain a system optimal traffic distribution. You can't tell where drivers have to do.</p> +<p><img alt="image" src="./figs/sketchoptimization.png"/></p> +<h3 id="3.-Quadratic-terms">3. Quadratic terms<a class="anchor-link" href="#3.-Quadratic-terms">¶</a></h3><p>As you will see in the formulation below, even after making the above-mentioned assumptions, our formulation of the Road NDP will include a quadratic term, you must multiply the flow (which is a variable) by the tavel time (which is also a variable). This is therefore not linear. +Fortunately there are different methods to transform quadratic terms to linear variables and constraints with mathematical programming. You do not need to learn these techniques. Most solvers (including Gurobi) can handle this well given some adjustments to the formulation. Gurobi uses the <a href="https://optimization.cbe.cornell.edu/index.php?title=McCormick_envelopes">McCormick Envelops (MCE)</a> to transform each quadratic term into one new variable and four constraints. For more information on MCE and how Gurobi implements them, check these links (this is in case you are interested, you don't need to check them during the Friday session):</p> +<ul> +<li><a href="https://optimization.cbe.cornell.edu/index.php?title=McCormick_envelopes">The theory behind MCE</a></li> +<li><a href="https://cdn.gurobi.com/wp-content/uploads/2020-01-14_Non-Convex-Quadratic-Optimization-in-Gurobi-9.0-Webinar.pdf?x93374">Gurobi webinar presentation on quadratic optimization</a></li> +<li><a href="https://www.gurobi.com/events/non-convex-quadratic-optimization/">Full video of the webinar</a></li> +</ul> +<p>We will move forward with a quadratic term in the objective function then because with the simplifcations and assumptions referred to above we can formulate an NDP and solve it using the branch and bound method that you have studied before.</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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="Data-preprocessing">Data preprocessing<a class="anchor-link" href="#Data-preprocessing">¶</a></h1><p>We use some networks from the well-known transportation networks for benchmarking repository as well as a small toy network for case studies of NDPs. the following functions read data from this repository and perform data preprocessing to have the input and the parameters required for our case studies.</p> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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"># import required packages</span> +<span class="kn">import</span> <span class="nn">os</span> +<span class="kn">import</span> <span class="nn">time</span> +<span class="kn">import</span> <span class="nn">gurobipy</span> <span class="k">as</span> <span class="nn">gp</span> +<span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span> +<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span> +<span class="kn">from</span> <span class="nn">matplotlib</span> <span class="kn">import</span> <span class="n">pyplot</span> <span class="k">as</span> <span class="n">plt</span> +</pre></div> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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"># read network file, a function to import the road networks</span> +<span class="k">def</span> <span class="nf">read_net</span><span class="p">(</span><span class="n">net_file</span><span class="p">):</span> +<span class="w"> </span><span class="sd">"""</span> +<span class="sd"> read network file</span> +<span class="sd"> """</span> + + <span class="n">net_data</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="n">net_file</span><span class="p">,</span> <span class="n">skiprows</span><span class="o">=</span><span class="mi">8</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s1">'</span><span class="se">\t</span><span class="s1">'</span><span class="p">)</span> + <span class="c1"># make sure all headers are lower case and without trailing spaces</span> + <span class="n">trimmed</span> <span class="o">=</span> <span class="p">[</span><span class="n">s</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">net_data</span><span class="o">.</span><span class="n">columns</span><span class="p">]</span> + <span class="n">net_data</span><span class="o">.</span><span class="n">columns</span> <span class="o">=</span> <span class="n">trimmed</span> + <span class="c1"># And drop the silly first and last columns</span> + <span class="n">net_data</span><span class="o">.</span><span class="n">drop</span><span class="p">([</span><span class="s1">'~'</span><span class="p">,</span> <span class="s1">';'</span><span class="p">],</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">inplace</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> + <span class="c1"># using dictionary to convert type of specific columns so taht we can assign very small (close to zero) possitive number to it.</span> + <span class="n">convert_dict</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'free_flow_time'</span><span class="p">:</span> <span class="nb">float</span><span class="p">,</span> + <span class="s1">'capacity'</span><span class="p">:</span> <span class="nb">float</span><span class="p">,</span> + <span class="s1">'length'</span><span class="p">:</span> <span class="nb">float</span><span class="p">,</span> + <span class="s1">'power'</span><span class="p">:</span> <span class="nb">float</span> + <span class="p">}</span> + + <span class="n">net_data</span> <span class="o">=</span> <span class="n">net_data</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">convert_dict</span><span class="p">)</span> + + <span class="c1"># make sure everything makes sense (otherwise some solvers throw errors)</span> + <span class="n">net_data</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">net_data</span><span class="p">[</span><span class="s1">'free_flow_time'</span><span class="p">]</span> <span class="o"><=</span> <span class="mi">0</span><span class="p">,</span> <span class="s1">'free_flow_time'</span><span class="p">]</span> <span class="o">=</span> <span class="mf">1e-6</span> + <span class="n">net_data</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">net_data</span><span class="p">[</span><span class="s1">'capacity'</span><span class="p">]</span> <span class="o"><=</span> <span class="mi">0</span><span class="p">,</span> <span class="s1">'capacity'</span><span class="p">]</span> <span class="o">=</span> <span class="mf">1e-6</span> + <span class="n">net_data</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">net_data</span><span class="p">[</span><span class="s1">'length'</span><span class="p">]</span> <span class="o"><=</span> <span class="mi">0</span><span class="p">,</span> <span class="s1">'length'</span><span class="p">]</span> <span class="o">=</span> <span class="mf">1e-6</span> + <span class="n">net_data</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">net_data</span><span class="p">[</span><span class="s1">'power'</span><span class="p">]</span> <span class="o"><=</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">'power'</span><span class="p">]</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span> + <span class="n">net_data</span><span class="p">[</span><span class="s1">'init_node'</span><span class="p">]</span> <span class="o">=</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'init_node'</span><span class="p">]</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="nb">int</span><span class="p">)</span> + <span class="n">net_data</span><span class="p">[</span><span class="s1">'term_node'</span><span class="p">]</span> <span class="o">=</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'term_node'</span><span class="p">]</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="nb">int</span><span class="p">)</span> + <span class="n">net_data</span><span class="p">[</span><span class="s1">'b'</span><span class="p">]</span> <span class="o">=</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'b'</span><span class="p">]</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="nb">float</span><span class="p">)</span> + + <span class="c1"># extract features in dict format</span> + <span class="n">links</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">net_data</span><span class="p">[</span><span class="s1">'init_node'</span><span class="p">],</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'term_node'</span><span class="p">]))</span> + <span class="n">caps</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">links</span><span class="p">,</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'capacity'</span><span class="p">]))</span> + <span class="n">fftt</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">links</span><span class="p">,</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'free_flow_time'</span><span class="p">]))</span> + <span class="n">lent</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">links</span><span class="p">,</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'length'</span><span class="p">]))</span> + <span class="n">alpha</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">links</span><span class="p">,</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'b'</span><span class="p">]))</span> + <span class="n">beta</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">links</span><span class="p">,</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'power'</span><span class="p">]))</span> + + <span class="n">net</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'capacity'</span><span class="p">:</span> <span class="n">caps</span><span class="p">,</span> <span class="s1">'free_flow'</span><span class="p">:</span> <span class="n">fftt</span><span class="p">,</span> <span class="s1">'length'</span><span class="p">:</span> <span class="n">lent</span><span class="p">,</span> <span class="s1">'alpha'</span><span class="p">:</span> <span class="n">alpha</span><span class="p">,</span> <span class="s1">'beta'</span><span class="p">:</span> <span class="n">beta</span><span class="p">}</span> + + <span class="k">return</span> <span class="n">net</span> + + +<span class="c1"># read OD matrix (demand), a function to import Origin and Destination Matrices, </span> +<span class="c1"># that is a table that says how many vehicles go from i to j</span> +<span class="k">def</span> <span class="nf">read_od</span><span class="p">(</span><span class="n">od_file</span><span class="p">):</span> +<span class="w"> </span><span class="sd">"""</span> +<span class="sd"> read OD matrix</span> +<span class="sd"> """</span> + + <span class="n">f</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">od_file</span><span class="p">,</span> <span class="s1">'r'</span><span class="p">)</span> + <span class="n">all_rows</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> + <span class="n">blocks</span> <span class="o">=</span> <span class="n">all_rows</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'Origin'</span><span class="p">)[</span><span class="mi">1</span><span class="p">:]</span> + <span class="n">matrix</span> <span class="o">=</span> <span class="p">{}</span> + <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">blocks</span><span class="p">)):</span> + <span class="n">orig</span> <span class="o">=</span> <span class="n">blocks</span><span class="p">[</span><span class="n">k</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span> + <span class="n">dests</span> <span class="o">=</span> <span class="n">orig</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span> + <span class="n">origs</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">orig</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> + + <span class="n">d</span> <span class="o">=</span> <span class="p">[</span><span class="nb">eval</span><span class="p">(</span><span class="s1">'{'</span> <span class="o">+</span> <span class="n">a</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">';'</span><span class="p">,</span> <span class="s1">','</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">' '</span><span class="p">,</span> <span class="s1">''</span><span class="p">)</span> <span class="o">+</span> <span class="s1">'}'</span><span class="p">)</span> <span class="k">for</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">dests</span><span class="p">]</span> + <span class="n">destinations</span> <span class="o">=</span> <span class="p">{}</span> + <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">d</span><span class="p">:</span> + <span class="n">destinations</span> <span class="o">=</span> <span class="p">{</span><span class="o">**</span><span class="n">destinations</span><span class="p">,</span> <span class="o">**</span><span class="n">i</span><span class="p">}</span> + <span class="n">matrix</span><span class="p">[</span><span class="n">origs</span><span class="p">]</span> <span class="o">=</span> <span class="n">destinations</span> + <span class="n">zones</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">matrix</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span> + <span class="n">od_dict</span> <span class="o">=</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">zones</span><span class="p">):</span> + <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">zones</span><span class="p">):</span> + <span class="n">demand</span> <span class="o">=</span> <span class="n">matrix</span><span class="o">.</span><span class="n">get</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="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">j</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">if</span> <span class="n">demand</span><span class="p">:</span> + <span class="n">od_dict</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="n">j</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)]</span> <span class="o">=</span> <span class="n">demand</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">od_dict</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="n">j</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)]</span> <span class="o">=</span> <span class="mi">0</span> + + <span class="k">return</span> <span class="n">od_dict</span> + + +<span class="c1"># read case study data, we will have different case studies that have different demand and road network </span> +<span class="k">def</span> <span class="nf">read_cases</span><span class="p">(</span><span class="n">networks</span><span class="p">,</span> <span class="n">input_dir</span><span class="p">):</span> +<span class="w"> </span><span class="sd">"""</span> +<span class="sd"> read case study data</span> +<span class="sd"> """</span> + + <span class="c1"># dictionaries for network and OD files</span> + <span class="n">net_dict</span> <span class="o">=</span> <span class="p">{}</span> + <span class="n">ods_dict</span> <span class="o">=</span> <span class="p">{}</span> + + <span class="c1"># selected case studies</span> + <span class="k">if</span> <span class="n">networks</span><span class="p">:</span> + <span class="n">cases</span> <span class="o">=</span> <span class="p">[</span><span class="n">case</span> <span class="k">for</span> <span class="n">case</span> <span class="ow">in</span> <span class="n">networks</span><span class="p">]</span> + <span class="k">else</span><span class="p">:</span> + <span class="c1"># all folders available (each one for one specific case)</span> + <span class="n">cases</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="n">input_dir</span><span class="p">)</span> <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isdir</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">input_dir</span><span class="p">,</span> <span class="n">x</span><span class="p">))]</span> + + <span class="c1"># iterate through cases and read network and OD</span> + <span class="k">for</span> <span class="n">case</span> <span class="ow">in</span> <span class="n">cases</span><span class="p">:</span> + <span class="n">mod</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">input_dir</span><span class="p">,</span> <span class="n">case</span><span class="p">)</span> + <span class="n">mod_files</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">listdir</span><span class="p">(</span><span class="n">mod</span><span class="p">)</span> + <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">mod_files</span><span class="p">:</span> + <span class="c1"># read network</span> + <span class="k">if</span> <span class="n">i</span><span class="o">.</span><span class="n">lower</span><span class="p">()[</span><span class="o">-</span><span class="mi">8</span><span class="p">:]</span> <span class="o">==</span> <span class="s1">'net.tntp'</span><span class="p">:</span> + <span class="n">net_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">mod</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span> + <span class="n">net_dict</span><span class="p">[</span><span class="n">case</span><span class="p">]</span> <span class="o">=</span> <span class="n">read_net</span><span class="p">(</span><span class="n">net_file</span><span class="p">)</span> + <span class="c1"># read OD matrix</span> + <span class="k">if</span> <span class="s1">'TRIPS'</span> <span class="ow">in</span> <span class="n">i</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="ow">and</span> <span class="n">i</span><span class="o">.</span><span class="n">lower</span><span class="p">()[</span><span class="o">-</span><span class="mi">5</span><span class="p">:]</span> <span class="o">==</span> <span class="s1">'.tntp'</span><span class="p">:</span> + <span class="n">ods_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">mod</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span> + <span class="n">ods_dict</span><span class="p">[</span><span class="n">case</span><span class="p">]</span> <span class="o">=</span> <span class="n">read_od</span><span class="p">(</span><span class="n">ods_file</span><span class="p">)</span> + + <span class="k">return</span> <span class="n">net_dict</span><span class="p">,</span> <span class="n">ods_dict</span> + + +<span class="c1"># create node-destination demand matrix</span> +<span class="k">def</span> <span class="nf">create_nd_matrix</span><span class="p">(</span><span class="n">ods_data</span><span class="p">,</span> <span class="n">origins</span><span class="p">,</span> <span class="n">destinations</span><span class="p">,</span> <span class="n">nodes</span><span class="p">):</span> + <span class="c1"># create node-destination demand matrix (not a regular OD!)</span> + <span class="n">demand</span> <span class="o">=</span> <span class="p">{(</span><span class="n">n</span><span class="p">,</span> <span class="n">d</span><span class="p">):</span> <span class="mi">0</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">nodes</span> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">destinations</span><span class="p">}</span> + <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">origins</span><span class="p">:</span> + <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">destinations</span><span class="p">:</span> + <span class="k">if</span> <span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span> <span class="ow">in</span> <span class="n">ods_data</span><span class="p">:</span> + <span class="n">demand</span><span class="p">[</span><span class="n">r</span><span class="p">,</span> <span class="n">s</span><span class="p">]</span> <span class="o">=</span> <span class="n">ods_data</span><span class="p">[</span><span class="n">r</span><span class="p">,</span> <span class="n">s</span><span class="p">]</span> + <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">destinations</span><span class="p">:</span> + <span class="n">demand</span><span class="p">[</span><span class="n">s</span><span class="p">,</span> <span class="n">s</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span> <span class="nb">sum</span><span class="p">(</span><span class="n">demand</span><span class="p">[</span><span class="n">j</span><span class="p">,</span> <span class="n">s</span><span class="p">]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">origins</span><span class="p">)</span> + + <span class="k">return</span> <span class="n">demand</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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 that we have the required functions for reading and processing the data, let's define some problem parameters and prepare the input.</p> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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"># define parameters, case study (network) list and the directory where their files are</span> +<span class="n">extension_factor</span> <span class="o">=</span> <span class="mf">1.5</span> <span class="c1"># capacity after extension (1.5 means add 50% of existing capacity)</span> +<span class="n">extension_max_no</span> <span class="o">=</span> <span class="mi">40</span> <span class="c1"># max number of links to add capacity to (simplified budget limit)</span> +<span class="n">timelimit</span> <span class="o">=</span> <span class="mi">300</span> <span class="c1"># seconds</span> +<span class="n">beta</span> <span class="o">=</span> <span class="mi">2</span> <span class="c1"># parameter to use in link travel time function (explained later)</span> + +<span class="n">networks</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'SiouxFalls'</span><span class="p">]</span> +<span class="n">networks_dir</span> <span class="o">=</span> <span class="s1">'input/TransportationNetworks'</span> + + +<span class="c1"># prep data</span> +<span class="n">net_dict</span><span class="p">,</span> <span class="n">ods_dict</span> <span class="o">=</span> <span class="n">read_cases</span><span class="p">(</span><span class="n">networks</span><span class="p">,</span> <span class="n">networks_dir</span><span class="p">)</span> +<span class="c1"># Let's load the network and demand (OD matrix) data of the first network (SiouxFalls) to two dictionaries for our first case study.</span> +<span class="c1"># Reminding that we are using the SiouxFalls network which is one of the most used networks in transportation reserach: https://github.com/bstabler/TransportationNetworks/blob/master/SiouxFalls/Sioux-Falls-Network.pdf</span> +<span class="n">net_data</span><span class="p">,</span> <span class="n">ods_data</span> <span class="o">=</span> <span class="n">net_dict</span><span class="p">[</span><span class="n">networks</span><span class="p">[</span><span class="mi">0</span><span class="p">]],</span> <span class="n">ods_dict</span><span class="p">[</span><span class="n">networks</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span> + +<span class="c1">## now let's prepare the data in a format readable by gurobi</span> + +<span class="c1"># prep links, nodes, and free flow travel times</span> +<span class="n">links</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">net_data</span><span class="p">[</span><span class="s1">'capacity'</span><span class="p">]</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span> +<span class="n">nodes</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">unique</span><span class="p">([</span><span class="nb">list</span><span class="p">(</span><span class="n">edge</span><span class="p">)</span> <span class="k">for</span> <span class="n">edge</span> <span class="ow">in</span> <span class="n">links</span><span class="p">])</span> +<span class="n">fftts</span> <span class="o">=</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'free_flow'</span><span class="p">]</span> + +<span class="c1"># auxiliary parameters (dict format) to keep the problem linear (capacities as parameters rather than variables)</span> +<span class="c1"># this is the capacity of a road link in vehicles per hour without the expansion</span> +<span class="n">cap_normal</span> <span class="o">=</span> <span class="p">{(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">):</span> <span class="n">cap</span> <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">),</span> <span class="n">cap</span> <span class="ow">in</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'capacity'</span><span class="p">]</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span> +<span class="c1">#with the expansion</span> +<span class="n">cap_extend</span> <span class="o">=</span> <span class="p">{(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">):</span> <span class="n">cap</span> <span class="o">*</span> <span class="n">extension_factor</span> <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">),</span> <span class="n">cap</span> <span class="ow">in</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'capacity'</span><span class="p">]</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span> + +<span class="c1"># origins and destinations</span> +<span class="n">origs</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">unique</span><span class="p">([</span><span class="n">orig</span> <span class="k">for</span> <span class="p">(</span><span class="n">orig</span><span class="p">,</span> <span class="n">dest</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">ods_data</span><span class="o">.</span><span class="n">keys</span><span class="p">())])</span> +<span class="n">dests</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">unique</span><span class="p">([</span><span class="n">dest</span> <span class="k">for</span> <span class="p">(</span><span class="n">orig</span><span class="p">,</span> <span class="n">dest</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">ods_data</span><span class="o">.</span><span class="n">keys</span><span class="p">())])</span> + +<span class="c1"># demand in node-destination form</span> +<span class="c1"># an OD-matrix is built</span> +<span class="n">demand</span> <span class="o">=</span> <span class="n">create_nd_matrix</span><span class="p">(</span><span class="n">ods_data</span><span class="p">,</span> <span class="n">origs</span><span class="p">,</span> <span class="n">dests</span><span class="p">,</span> <span class="n">nodes</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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>In this section, we'll initially visualize the network using the coordinates of the sample road network, 'SiouxFalls'. Later, we'll employ the same network topology to visualize the upgraded links.</p> +<p>Thankfully, Python offers a highly useful package for visualizing networks called <strong>'networkx'</strong>. We'll leverage some of its features, so:</p> +<ol> +<li>Feel free to explore further functionalities of the <strong>networkx</strong> package in its <a href="https://networkx.org/documentation/stable/reference/index.html">documentation</a>.</li> +<li>Our coordinates in this specific example are in <strong>JSON</strong> format. Therefore, don't forget to import the package accordingly.</li> +<li>Interested in visualizing other networks? Fantastic! However, you'll need to check the format of your coordinates first. TAs will assist you if you wish to explore further.</li> +</ol> +<p>The road network that we are using in the assessment is the Sioux Falls which is shown below:</p> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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"># For visualization</span> +<span class="kn">import</span> <span class="nn">networkx</span> <span class="k">as</span> <span class="nn">nx</span> +<span class="kn">import</span> <span class="nn">json</span> +<span class="kn">from</span> <span class="nn">matplotlib.lines</span> <span class="kn">import</span> <span class="n">Line2D</span> <span class="c1"># this will later be used for highlighting edge colors based on values</span> + +<span class="kn">from</span> <span class="nn">utils.network_visualization</span> <span class="kn">import</span> <span class="n">network_visualization</span> +<span class="kn">from</span> <span class="nn">utils.network_visualization_highlight_link</span> <span class="kn">import</span> <span class="n">network_visualization_highlight_links</span> +<span class="kn">from</span> <span class="nn">utils.network_visualization_upgraded</span> <span class="kn">import</span> <span class="n">network_visualization_upgraded</span> +</pre></div> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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">coordinates_path</span> <span class="o">=</span> <span class="s1">'input/TransportationNetworks/SiouxFalls/SiouxFallsCoordinates.geojson'</span> +</pre></div> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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">G</span><span class="p">,</span> <span class="n">pos</span> <span class="o">=</span> <span class="n">network_visualization</span><span class="p">(</span><span class="n">link_flow</span> <span class="o">=</span> <span class="n">fftts</span><span class="p">,</span><span class="n">coordinates_path</span><span class="o">=</span> <span class="n">coordinates_path</span><span class="p">)</span> <span class="c1"># the network we create here will be used later for further visualizations!</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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="OD-Matrix">OD Matrix<a class="anchor-link" href="#OD-Matrix">¶</a></h2> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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>The trips per hour matrix for this network is:</p> +<p>This table is what is called an OD (Origin-Destination) matrix. It tells you how many cars go from node i to node j in an hour. The paths are chosen by solving the optimization model.</p> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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"># Extracting the maximum values for dimensions</span> +<span class="n">data</span> <span class="o">=</span> <span class="n">ods_data</span> +<span class="n">max_origin</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">key</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span> +<span class="n">max_destination</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">key</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">data</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span> + +<span class="c1"># Creating a DataFrame to represent the matrix</span> +<span class="n">od_matrix</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">DataFrame</span><span class="p">(</span><span class="n">index</span><span class="o">=</span><span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">max_origin</span> <span class="o">+</span> <span class="mi">1</span><span class="p">),</span> <span class="n">columns</span><span class="o">=</span><span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">max_destination</span> <span class="o">+</span> <span class="mi">1</span><span class="p">))</span> + +<span class="c1"># Populating the DataFrame with the given data</span> +<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">data</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> + <span class="n">od_matrix</span><span class="o">.</span><span class="n">loc</span><span class="p">[</span><span class="n">key</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">key</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span> <span class="o">=</span> <span class="n">value</span> + +<span class="c1"># Displaying the OD matrix in table format</span> +<span class="nb">print</span><span class="p">(</span><span class="s2">"Origin-Destination Matrix:"</span><span class="p">)</span> +<span class="nb">print</span><span class="p">(</span><span class="n">od_matrix</span><span class="o">.</span><span class="n">head</span><span class="p">(</span><span class="mi">5</span><span class="p">))</span> <span class="c1"># OD matric for the first 5 nodes. </span> +</pre></div> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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"># To better understand the OD matrix we can also visualize the values.</span> +<span class="c1"># Creating a subset matrix for visualization</span> +<span class="n">subset_matrix</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="mi">24</span><span class="p">,</span> <span class="mi">24</span><span class="p">))</span> + +<span class="c1"># Filling subset matrix with data</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">1</span><span class="p">,</span> <span class="mi">25</span><span class="p">):</span> + <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">25</span><span class="p">):</span> + <span class="n">subset_matrix</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="n">j</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">data</span><span class="p">[(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)]</span> + +<span class="c1"># Plotting the heatmap</span> +<span class="n">plt</span><span class="o">.</span><span class="n">figure</span><span class="p">(</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">6</span><span class="p">))</span> +<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="s1">'Origin-Destination Matrix'</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">xlabel</span><span class="p">(</span><span class="s1">'Destination'</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">ylabel</span><span class="p">(</span><span class="s1">'Origin'</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">imshow</span><span class="p">(</span><span class="n">subset_matrix</span><span class="p">,</span> <span class="n">cmap</span><span class="o">=</span><span class="s1">'RdYlGn_r'</span><span class="p">,</span> <span class="n">interpolation</span><span class="o">=</span><span class="s1">'nearest'</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">colorbar</span><span class="p">(</span><span class="n">label</span><span class="o">=</span><span class="s1">'Values'</span><span class="p">)</span> +<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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="Modeling-in-Gurobi">Modeling in Gurobi<a class="anchor-link" href="#Modeling-in-Gurobi">¶</a></h1><h2 id="Initiate-the-Gurobi-model">Initiate the Gurobi model<a class="anchor-link" href="#Initiate-the-Gurobi-model">¶</a></h2><p>First, let's build a gurobi model object and define some parameters based on the model type. We have a mixed integer quadratic program (MIQP), that's because the objective function has a quadratic term, which we want to transform to a mixed integer linear program (MILP) and solve using the branch and bound method. We discuss the transformations from quadratic to linear when we introduce quadratic terms.</p> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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">## create a gurobi model object</span> +<span class="n">model</span> <span class="o">=</span> <span class="n">gp</span><span class="o">.</span><span class="n">Model</span><span class="p">()</span> + +<span class="c1"># define some important parameters for solving the model with gurobi</span> +<span class="n">model</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">TimeLimit</span> <span class="o">=</span> <span class="n">timelimit</span> <span class="c1"># 300 seconds timelimit since it can take long to reduce the gap to zero (change and play around if you want)</span> +<span class="n">model</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">NonConvex</span> <span class="o">=</span> <span class="mi">2</span> <span class="c1"># our problem is not convex as it is now, so we let gurobi know to use the right transformation and solutions</span> +<span class="c1">#about convexity in optimization: a convex function will be a continuous functin that will have one minimum </span> +<span class="c1">#(or maximum depending on the problem), therefore in any point that you starting searching for a solution you can follow the gradient </span> +<span class="c1">#to search for that extreme point. Non-convex problems can have local minimum (or maximum) points that will make you stuck in the process </span> +<span class="c1">#of searching for the solution</span> +<span class="n">model</span><span class="o">.</span><span class="n">params</span><span class="o">.</span><span class="n">PreQLinearize</span> <span class="o">=</span> <span class="mi">1</span> <span class="c1"># useful parameter to ask gurobi to try to linearize non-linear terms</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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="Decision-variables">Decision variables<a class="anchor-link" href="#Decision-variables">¶</a></h2><p>We have a set of binary variables $y_{ij}$, these variables take the value 1 if link $(i,j)$ connecting node $i$ to node $j$ is selected for expansion, and 0 otherwise.</p> +<p>We also have two sets of decision variables representing link flows; $x_{ij}$, representing flow on link $(i,j)$ in cars per hour, and $x_{ijs}$, representing flow on link $(i,j)$ going to destination $s$.</p> +<p>The first is the number of total cars passing on that road, and the second is the number of cars that are passing on the road which are specifically going to destination $s$. Summing the latter over all $s$ results in the former for a link $(i,j)$.</p> +<p>Therefore, mathematically we define the domain of the variables as follows:</p> +\begin{align} + & y_{ij} \in \{0, 1\} \quad \forall (i,j) \in A \\ + & x_{ij} \geq 0 \quad \forall (i,j) \in A \\ + & x_{ijs} \geq 0 \quad \forall (i,j) \in A, \forall s \in D \\ +\end{align}<p>As you will see below in the code block, we have one extra set of variables called x2 (x square). This is to help Gurobi isolate quadratic terms and perform required transformations based on MCE to keep the problem linear. This is not part of your learning goals.</p> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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">## decision variables:</span> + +<span class="c1"># link selected (y_ij); i: a_node, j: b_node (selected links for capacity expansion)</span> +<span class="n">link_selected</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">addVars</span><span class="p">(</span><span class="n">links</span><span class="p">,</span> <span class="n">vtype</span><span class="o">=</span><span class="n">gp</span><span class="o">.</span><span class="n">GRB</span><span class="o">.</span><span class="n">BINARY</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">'y'</span><span class="p">)</span> + +<span class="c1"># link flows (x_ij); i: a_node, j: b_node</span> +<span class="n">link_flow</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">addVars</span><span class="p">(</span><span class="n">links</span><span class="p">,</span> <span class="n">vtype</span><span class="o">=</span><span class="n">gp</span><span class="o">.</span><span class="n">GRB</span><span class="o">.</span><span class="n">CONTINUOUS</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">'x'</span><span class="p">)</span> + +<span class="c1"># link flows per destination s (xs_ijs); i: a_node, j: b_node, s: destination</span> +<span class="n">dest_flow</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">addVars</span><span class="p">(</span><span class="n">links</span><span class="p">,</span> <span class="n">dests</span><span class="p">,</span> <span class="n">vtype</span><span class="o">=</span><span class="n">gp</span><span class="o">.</span><span class="n">GRB</span><span class="o">.</span><span class="n">CONTINUOUS</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">'xs'</span><span class="p">)</span> + +<span class="c1"># link flow square (x2_ij); i: a_node, j: b_node (dummy variable for handling quadratic terms, you do not need to know this)</span> +<span class="n">link_flow_sqr</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">addVars</span><span class="p">(</span><span class="n">links</span><span class="p">,</span> <span class="n">vtype</span><span class="o">=</span><span class="n">gp</span><span class="o">.</span><span class="n">GRB</span><span class="o">.</span><span class="n">CONTINUOUS</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s1">'x2'</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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="Objective-function">Objective function<a class="anchor-link" href="#Objective-function">¶</a></h2><p>The objective function of the problem (in its simplest form), is the minimization of the total travel time on the network, that means that you multiply the flow of vehicles in each link by the corresponding travel time and sum over all links ($A$ is the collection of all links to simplify the notation):</p> +<p>$Z = \sum_{(i,j) \in A}{ x_{ij} . t_{ij}} $</p> +<p>The travel time $t_{ij}$ is a function of the flow on a link and can be expressed as follows (where beta is a parameter):</p> +<p>$ t_{ij} = t^0_{ij} . ( 1 + \beta (x_{ij}/c_{ij})) \quad \forall (i,j) \in A $</p> +<blockquote> +<p>Note that the commonly used travel time function based on the Bureau of Public Roads (BPR) is as follows:</p> +<p>$ t_{ij} = t^0_{ij} . ( 1 + \alpha (x_{ij}/c_{ij})^\beta) \quad \forall (i,j) \in A $</p> +<p>Where $\beta$ usually assumes the value of $4$ making this function (and the problem) non-linear. Therefore, we use the linear function mentioned before to make the problem manageable using what we have learned so far.</p> +</blockquote> +<p>The following constraint yields the capacity of each link based on which ones are selected for expansion, when y is 1 there is added capacity as you can see:</p> +<p>$ c_{ij} = (1 - y_{ij}) . c^0_{ij} + y_{ij} . c^1_{ij} \quad \forall (i,j) \in A $</p> +<p>This allows us to represent $t_{ij}$ as:</p> +<p>$ t_{ij} = t^0_{ij} . ( 1 + \beta (x_{ij} * ((1 - y_{ij})/c^0_{ij} + y_{ij}/c^1_{ij} ))) \quad \forall (i,j) \in A $</p> +<p>Which leads to the following extended objective funtion:</p> +<p>$ Z = \sum_{(i,j) \in A}{ x_{ij} . (t^0_{ij} . ( 1 + \beta (x_{ij} * ((1 - y_{ij})/c^0_{ij} + y_{ij}/c^1_{ij} ))))} $</p> +<p>Now, for gurobi (and other solvers as well), we have to keep binary variables and quadratic terms clean and separate so that it can perform the required transformations to linearize the problem. Therefore, the equation below, despite being very big, would be the most solver-friendly formulation of our objective function:</p> +\begin{align} + Z = \sum_{(i,j) \in A}{t^0_{ij} . x_{ij}} + \sum_{(i,j) \in A}{(t^0_{ij}.\beta /c^0_{ij}) . x^2_{ij}} - \sum_{(i,j) \in A}{(t^0_{ij}.\beta /c^0_{ij}) . x^2_{ij} . y_{ij}} + \sum_{(i,j) \in A}{t^0_{ij}.(\beta /c^1_{ij}) . x^2_{ij} . y_{ij}} \\ +\end{align}<p>Therefore, we use this equation to model our objective function in gurobi.</p> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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">## objective function (total travel time)</span> + +<span class="c1"># total travel time = sum (link flow * link travel time)</span> +<span class="c1"># link travel time = free flow travel time * (1 + (flow / capacity))</span> +<span class="c1"># capacity = selected links * base capacity + other links * extended capacity</span> +<span class="c1"># other links: 1 - selected links</span> + +<span class="c1">#note that this equation allows the number of vehicles to be greater than the capacity, this just adds more penalty in terms of travel time.</span> + +<span class="n">model</span><span class="o">.</span><span class="n">setObjective</span><span class="p">(</span> + <span class="n">gp</span><span class="o">.</span><span class="n">quicksum</span><span class="p">(</span><span class="n">fftts</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o">*</span> <span class="n">link_flow</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o">+</span> + <span class="n">fftts</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="n">beta</span><span class="o">/</span><span class="n">cap_normal</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">])</span> <span class="o">*</span> <span class="n">link_flow_sqr</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o">-</span> + <span class="n">fftts</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="n">beta</span><span class="o">/</span><span class="n">cap_normal</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">])</span> <span class="o">*</span> <span class="n">link_flow_sqr</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o">*</span> <span class="n">link_selected</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o">+</span> + <span class="n">fftts</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="n">beta</span><span class="o">/</span><span class="n">cap_extend</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">])</span> <span class="o">*</span> <span class="n">link_flow_sqr</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o">*</span> <span class="n">link_selected</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> + <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span> <span class="ow">in</span> <span class="n">links</span><span class="p">))</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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="Constraints">Constraints<a class="anchor-link" href="#Constraints">¶</a></h2><p>We have four sets of constraints for this problem. Let's go through them one by one and add them to the model.</p> +<h3 id="1.-Budget-constraint">1. Budget constraint<a class="anchor-link" href="#1.-Budget-constraint">¶</a></h3><p>We can only extend the capacity of certain number of links based on the available budget. So first, we have to make sure to limit the number of extended links to the max number that can be expanded:</p> +<p>$ \sum_{(i,j) \in A}{ y_{ij}} = B $</p> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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">## constraints</span> + +<span class="c1"># budget constraints, c_bgt is the name of the constraint</span> +<span class="n">c_bgt</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">addConstr</span><span class="p">(</span><span class="n">gp</span><span class="o">.</span><span class="n">quicksum</span><span class="p">(</span><span class="n">link_selected</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span> <span class="ow">in</span> <span class="n">links</span><span class="p">)</span> <span class="o"><=</span> <span class="n">extension_max_no</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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"> +<h3 id="2.-Link-flow-conservation-constraints">2. Link flow conservation constraints<a class="anchor-link" href="#2.-Link-flow-conservation-constraints">¶</a></h3><p>We have two sets of decision variables representing link flows; $x_{ij}$, representing flow on link $(i,j)$, and $x_{ijs}$, representing flow on link $(i,j)$ going to destination $s$. So we have to make sure that the sum of the flows over all destinations equals the flow on each link. +$ \sum_{s \in D}{x_{ijs}} = x_{ij} \quad \forall (i,j) \in A $</p> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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"># link flow conservation (destination flows and link flows), c_lfc is the name of the constraint</span> +<span class="n">c_lfc</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">addConstrs</span><span class="p">(</span><span class="n">gp</span><span class="o">.</span><span class="n">quicksum</span><span class="p">(</span><span class="n">dest_flow</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">,</span> <span class="n">s</span><span class="p">]</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">dests</span><span class="p">)</span> <span class="o">==</span> <span class="n">link_flow</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span> <span class="ow">in</span> <span class="n">links</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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"> +<h3 id="3.-Node-flow-conservation-constraints">3. Node flow conservation constraints<a class="anchor-link" href="#3.-Node-flow-conservation-constraints">¶</a></h3><p>The basic idea of this constraint set is to make sure that the incoming and outgoing flow to and from each node is the same (hence flow conservation) with the exception for origin and destination nodes of the trips where there will be extra outgoing flow (origins) or incoming flow (destinations). Think about a traffic intersection, vehicles enter and leave the intersection when they are moving in the network. This assures the continuity of the vehicle paths. $d_is$ here is the number of travelers from node $i$ to node $s$ with the exception of $d_ss$, which is all the demand that arrives at node $s$.</p> +<p>$ \sum_{j \in N; (i,j) \in A}{ x_{ijs}} - \sum_{j \in N; (j,i) \in A}{ x_{jis}} = d_{is} \quad \forall i \in N, \forall s \in D $</p> +<p>The figure gives an example:</p> +<p><img alt="image" src="./figs/equil.png"/></p> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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"># node flow conservation (demand), c_nfc is the name of the constraint</span> +<span class="n">c_nfc</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">addConstrs</span><span class="p">(</span> + <span class="n">gp</span><span class="o">.</span><span class="n">quicksum</span><span class="p">(</span><span class="n">dest_flow</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">,</span> <span class="n">s</span><span class="p">]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">nodes</span> <span class="k">if</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span> <span class="ow">in</span> <span class="n">links</span><span class="p">)</span> <span class="o">-</span> + <span class="n">gp</span><span class="o">.</span><span class="n">quicksum</span><span class="p">(</span><span class="n">dest_flow</span><span class="p">[</span><span class="n">j</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">s</span><span class="p">]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">nodes</span> <span class="k">if</span> <span class="p">(</span><span class="n">j</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span> <span class="ow">in</span> <span class="n">links</span><span class="p">)</span> <span class="o">==</span> <span class="n">demand</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">s</span><span class="p">]</span> + <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">nodes</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">dests</span> +<span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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"> +<h3 id="4.-Quadratic-variable-constraints-(you-do-not-need-to-fully-understand-this)">4. Quadratic variable constraints (you do not need to fully understand this)<a class="anchor-link" href="#4.-Quadratic-variable-constraints-(you-do-not-need-to-fully-understand-this)">¶</a></h3><p>These are basically dummy equations to help gurobi model quadratic terms (that we defined as dummy variables earlier). So essentially instead of using $x^2_{ij}$ in the model, we define a new set of decision variables and define a set of constrains to set their value to $x^2_{ij}$. This let's Gurobi know these are quadratic terms and helps gurobi to replace it with variables and constraints required to keep the problem linear. This is not part of your learning goals!</p> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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"># dummy constraints for handling quadratic terms</span> +<span class="n">c_qrt</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">addConstrs</span><span class="p">(</span><span class="n">link_flow_sqr</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o">==</span> <span class="n">link_flow</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o">*</span> <span class="n">link_flow</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span> <span class="ow">in</span> <span class="n">links</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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"> +<h3 id="Additional-constraint-for-task-3">Additional constraint for task 3<a class="anchor-link" href="#Additional-constraint-for-task-3">¶</a></h3> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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:#ffa6a6; color: black; vertical-align: middle; padding:15px; margin: 10px; border-radius: 10px; width: 95%"><p><b>Note:</b> There are three constraints provided below for you to compare. <code>c_new2</code> is the "correct" solution based on the information provided in this assignment; however, it produces an unfeasible problem. The constraint <code>c_new1</code> is feasible, but double-counts capacity (a mistake). See extended solution (markdown file) for more information.</p></div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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">#Constrain the vehicles to the capacity of the road:</span> +<span class="n">c_new1</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">addConstrs</span><span class="p">(</span><span class="n">link_flow</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o"><=</span> <span class="n">cap_normal</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span><span class="o">+</span><span class="p">(</span><span class="n">link_selected</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span><span class="o">*</span><span class="n">cap_extend</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">])</span> <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span> <span class="ow">in</span> <span class="n">links</span><span class="p">)</span> +<span class="n">c_new2</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">addConstrs</span><span class="p">(</span><span class="n">link_flow</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o"><=</span> <span class="n">cap_normal</span><span class="p">[</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">]</span> <span class="o">+</span> <span class="p">((</span><span class="n">cap_extend</span><span class="p">[</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">]</span><span class="o">-</span><span class="n">cap_normal</span><span class="p">[</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">]</span> <span class="p">)</span> <span class="o">*</span> <span class="n">link_selected</span><span class="p">[</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">])</span> <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span> <span class="ow">in</span> <span class="n">links</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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="Solving-the-model">Solving the model<a class="anchor-link" href="#Solving-the-model">¶</a></h1> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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">#Next we are ready to solve the model</span> +<span class="n">model</span><span class="o">.</span><span class="n">optimize</span><span class="p">()</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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 if you didn't find a solution, you can rerun the previous cell to continue the optimization for another 300 seconds (defined by <code>timelimit</code>).</p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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="Analysis">Analysis<a class="anchor-link" href="#Analysis">¶</a></h1> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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"># fetch optimal decision variables and Objective Function values</span> +<span class="n">link_flows</span> <span class="o">=</span> <span class="p">{(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">):</span> <span class="n">link_flow</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span><span class="o">.</span><span class="n">X</span> <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span> <span class="ow">in</span> <span class="n">links</span><span class="p">}</span> +<span class="n">links_selected</span> <span class="o">=</span> <span class="p">{(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">):</span> <span class="n">link_selected</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span><span class="o">.</span><span class="n">X</span> <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span> <span class="ow">in</span> <span class="n">links</span><span class="p">}</span> +<span class="n">total_travel_time</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">ObjVal</span> + +<span class="c1"># Let's print right now the objective function</span> +<span class="nb">print</span><span class="p">(</span><span class="s2">"Optimal Objective function Value"</span><span class="p">,</span> <span class="n">model</span><span class="o">.</span><span class="n">objVal</span><span class="p">)</span> + +<span class="c1"># Let's print right now the decision variables</span> +<span class="k">for</span> <span class="n">var</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">getVars</span><span class="p">():</span> + <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">var</span><span class="o">.</span><span class="n">varName</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">round</span><span class="p">(</span><span class="n">var</span><span class="o">.</span><span class="n">X</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span> <span class="c1"># print the optimal decision variable values.</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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="Network-Visualization">Network Visualization<a class="anchor-link" href="#Network-Visualization">¶</a></h2> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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"> +<h3 id="1.-Network-visualization-with-highlighted-links">1. Network visualization with highlighted links<a class="anchor-link" href="#1.-Network-visualization-with-highlighted-links">¶</a></h3> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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, let's visualize the results showcasing congested traffic flows and the selected links for expansion. +In this graph, we'll observe the network's topology using node coordinates and links. Our graph will be <strong>directional</strong> to represent the road network.</p> +<p>Nodes are depicted in blue, while selected nodes and links are highlighted in pink and red.</p> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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">network_visualization_highlight_links</span> <span class="p">(</span><span class="n">G</span><span class="p">,</span> <span class="n">pos</span><span class="p">,</span> <span class="n">link_select</span><span class="o">=</span><span class="n">links_selected</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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"> +<h3 id="2.-Network-visualization-with-upgraded-links">2. Network visualization with upgraded links<a class="anchor-link" href="#2.-Network-visualization-with-upgraded-links">¶</a></h3> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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>In this section, we'll visualize our upgraded network, incorporating the new capacities. Following that, we'll represent the network along with its results, displaying the flow (F) and capacity (C) alongside each link.</p> +<p><strong>Notes:</strong></p> +<ol> +<li><strong>Pink nodes</strong> highlight the selected nodes.</li> +<li><strong>Colored edges</strong> denote the upgraded edges selected through the optimization process.</li> +<li>Various <strong>edge colors</strong> indicate different ranges for edge attributes (Flow/Capacity), as demonstrated in the legend.</li> +<li>Diverse <strong>edge widths</strong> represent varying flow ranges on the edges.</li> +<li>Your plot is interactive; to clearly view the numbers, simply click on them!</li> +</ol> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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"># Define new capacity after expansion</span> +<span class="n">cap_normal</span> <span class="o">=</span> <span class="p">{(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">):</span> <span class="n">cap</span> <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">),</span> <span class="n">cap</span> <span class="ow">in</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'capacity'</span><span class="p">]</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span> +<span class="n">cap_extend</span> <span class="o">=</span> <span class="p">{(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">):</span> <span class="n">cap</span> <span class="o">*</span> <span class="n">extension_factor</span> <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">),</span> <span class="n">cap</span> <span class="ow">in</span> <span class="n">net_data</span><span class="p">[</span><span class="s1">'capacity'</span><span class="p">]</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span> +<span class="n">capacity</span> <span class="o">=</span> <span class="p">{(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">):</span> <span class="n">cap_normal</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">links_selected</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">])</span> <span class="o">+</span> <span class="n">cap_extend</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> <span class="o">*</span> <span class="n">links_selected</span><span class="p">[</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">]</span> + <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">)</span> <span class="ow">in</span> <span class="n">links</span><span class="p">}</span> +</pre></div> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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"># Plot results</span> +<span class="n">network_visualization_upgraded</span> <span class="p">(</span><span class="n">G</span> <span class="o">=</span> <span class="n">G</span><span class="p">,</span> <span class="n">pos</span><span class="o">=</span><span class="n">pos</span><span class="p">,</span> <span class="n">link_flow</span><span class="o">=</span><span class="n">link_flows</span><span class="p">,</span> <span class="n">capacity_new</span><span class="o">=</span><span class="n">capacity</span> <span class="p">,</span><span class="n">link_select</span><span class="o">=</span><span class="n">links_selected</span><span class="p">,</span> <span class="n">labels</span><span class="o">=</span><span class="s1">'off'</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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>If you wish to see the velues for the entire network you just need to turn on the labels and run the function again.</p> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs"> +<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"># To see flow and capacity for the entire network</span> +<span class="n">network_visualization_upgraded</span> <span class="p">(</span><span class="n">G</span> <span class="o">=</span> <span class="n">G</span><span class="p">,</span> <span class="n">pos</span><span class="o">=</span><span class="n">pos</span><span class="p">,</span> <span class="n">link_flow</span><span class="o">=</span><span class="n">link_flows</span><span class="p">,</span> <span class="n">capacity_new</span><span class="o">=</span><span class="n">capacity</span> <span class="p">,</span><span class="n">link_select</span><span class="o">=</span><span class="n">links_selected</span><span class="p">,</span> <span class="n">labels</span><span class="o">=</span><span class="s1">'on'</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell"> +<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-nc-sa/4.0/" rel="license"> +<img alt="Creative Commons License" src="https://i.creativecommons.org/l/by-nc-sa/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 2023 <a href="https://studiegids.tudelft.nl/a101_displayCourse.do?course_id=65595" rel="MUDE Team">MUDE Teaching Team</a> TU Delft. This work is licensed under a <a href="http://creativecommons.org/licenses/by-nc-sa/4.0/" rel="license">Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License</a>. + +</span></div> +</div> +</div> +</div> +</main> +</body> +</html> diff --git a/src/teachers/GA_2_5/README.html b/src/teachers/GA_2_5/README.html new file mode 100644 index 0000000000000000000000000000000000000000..6ff74ae95f1452063bf6e52d5a388de02dda6cff --- /dev/null +++ b/src/teachers/GA_2_5/README.html @@ -0,0 +1,412 @@ +<!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="project-9-report-optimization">Project 9 Report: Optimization</h1> +<p><em><a href="http://mude.citg.tudelft.nl/">CEGM1000 MUDE</a>.</em></p> +<p>The focus of this assignment is on applying two different methods for optimization on a road network design problem. Part of the background material in the notebooks was already available in <a href="https://mude.citg.tudelft.nl/2023/book/optimization/project.html">Chapter 5.11 of the textbook</a>.</p> +<h2 id="overview-of-material">Overview of material</h2> +<ul> +<li><code>README.md</code> (this file)</li> +<li><code>Report.md</code>, primary file in which you write your answers to some questions and eventually copy plots from the notebooks. Typically, a short, one-line answer is sufficient, but please include a short reasoning, justification or argumentation. Remember to use Markdown features to clearly indicate your answers for each question below.</li> +<li><code>Analysis_LP.ipynb</code>, the notebook in which you apply a mixed integer linear program (MILP) to a road network design problem (NDP).</li> +<li><code>Analysis_GA.ipynb</code>, the notebook in which you apply a genetic algorithm (GA) to the same road network design problem (NDP).</li> +<li><code>environment.yml</code>, for creating a Python environment</li> +<li>a subdirectory <code>./utils</code> containing some functions for visualization (which you don't need to open).</li> +<li>a subdirectory <code>./figs</code> containing some figures included in the notebooks (which you don't need to open).</li> +<li>a subdirectory <code>./input</code> containing data files</li> +<li>a <code>.gitignore</code> file preventing your imported data in the <code>./input</code> subdirectory being pushed to Gitlab.</li> +</ul> +<h3 id="python-environments">Python Environments</h3> +<p>You can run all of the notebooks for today in the environment <code>mude-opt</code> which you've been using during the workshop this week (WS13). In particular, it includes the optimization packages <code>pymoo</code> and <code>gurobipy</code>. The non-Python part of the software Gurobi was installed as part of PA 2.4.</p> +<p>The <code>*.yml</code> file included in this repository is the same as that used for WS13 this week, so you can re-use the same Conda environment (e.g., <code>conda activate mude-opt</code>). Here are a few tips to remember when using Anaconda prompt:</p> +<ul> +<li>Review your existing environments with <code>conda info --envs</code></li> +<li>Create an environment with command <code>conda env create -f environment.yml</code></li> +<li>For the activated environment, check the packages explicitly requested with <code>conda env export --from-history</code></li> +<li>If you want to create a new environment from the <code>*.yml</code> file, but the name already exists, simply change the name in the file using a text editor</li> +</ul> +<h2 id="submission-and-deadline">Submission and deadline</h2> +<ul> +<li>Submit your answers, together with any relevant plots, in the Markdown file <code>Report.md</code>. This is the primary document that will be used to determine your grade; however, the auxiliary files (e.g., <code>*.ipynb</code> or <code>*.py</code> files) may be checked in case something is not clear.</li> +<li>The deadline is to submit your work by making commits to your Group's GitLab repository by Friday at 12:30h.</li> +<li>This project will be graded on interpretation, application, documentation and programming.</li> +</ul> +<h2 id="repository-formatting-and-static-check">Repository, Formatting and Static Check</h2> +<p>There is no static check for this project. Be sure to leave the outputs from your code cells in your <code>*.ipynb</code> file so that they are readable.</p> +<p>You are always expected to provide well-formatted figures and Markdown text in your <code>Report.md</code> file, as well as logically organize any auxiliary files you may use (e.g., try to put your figures in a sub-directory, if there are a lot of them). If you run out of time it is OK if your <code>*ipynb</code> files do not run.</p> +<h2 id="backup-data-links">Backup data links</h2> +<p>Sometimes the download links reach a maximum limit. If the link above no longer works, try one of these:</p> +<ul> +<li><a href="https://surfdrive.surf.nl/files/index.php/s/StqaFtNDg6DNR4a/download">Backup link 1</a></li> +<li><a href="https://surfdrive.surf.nl/files/index.php/s/tC56Rpbhd7WpN9k/download">Backup link 2</a></li> +</ul> +<p><strong>End of file.</strong></p> +<span style="font-size: 75%"> +© 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/">CC BY-NC-SA 4.0 License</a>. + +</body> +</html> diff --git a/src/teachers/GA_2_5/Report_solution.html b/src/teachers/GA_2_5/Report_solution.html new file mode 100644 index 0000000000000000000000000000000000000000..1a8070a53d870d686a0727e548f64608905e9500 --- /dev/null +++ b/src/teachers/GA_2_5/Report_solution.html @@ -0,0 +1,481 @@ +<!DOCTYPE html> +<html> +<head> +<title>Report_solution.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="project-9-report-optimization">Project 9 Report: Optimization</h1> +<p><em><a href="http://mude.citg.tudelft.nl/">CEGM1000 MUDE</a>, Week 2.6, Friday, Dec. 15, 2023.</em></p> +<p><strong>SOLUTION</strong></p> +<p><em>The solutions are provided below (and also in the notebooks). There are also additional explanations that try to explain what happened during the in-class session when some of the tasks could not be completed.</em></p> +<blockquote> +<p>Solutions that were expected to be in your report are formatted like this, albeit in a shorter version, and without figures.</p> +</blockquote> +<p><em>General note about the problem (MILP and GA)</em>: this assignment asks you to consider upgrading a road network with 76 links. The optimization algorithms are used to find the best solution <em>given a specific number of links to consider.</em> Thus, for a specific number of links, you would solve a "new" optimization problem. In reality, the number of links that can be upgraded is closely linked to your budget, and the budget itself might be adjusted depending on the results of several optimization analyses for different upgrade options. In other words, if the benefit (travel time reduction, based on optimal solution) is not linearly related to the costs (number of links considered), the solution is non-trivial. This is generally how real life works...in fact, the concept of excpected value (expected cost, expected benefit) could be used in this case to compare alternatives (we will learn how in Week 2.8). Unfortunately, the instructions in this assignment asked you to consider cases 1 or 76 links were considered, which <em>are</em> trivial solutions:</p> +<ul> +<li>if you can only consider 1 link, you should choose that which gives the greatest decrease in travel time</li> +<li>if you can consider upgrading all links, and all links reduce travel time, you should upgrade all of them!</li> +</ul> +<p>The problem gets much more interesting if you must choose which specific combination of links to upgrade, because your budget allows for something between 1 and 76. Because of aspects such as the geometric connections between links and nodes, travel time changes in a complex way when only <em>part</em> of the network is improved (this is why the solution is non-trivial). For example, it is obvious that you should choose links that are somehow connected to each other in order to improve the travel time in the entire network. If you only improve isolated parts of the network, you are simply moving around points of congestion (e.g., you would drive fast on an improved road, then hit terrible traffic when forced to drive slow on an unimproved stretch of road). This is the type of comparison the optimization algorithm is making as it searches through the possible solution space.</p> +<p>The time it takes to find an optimization solution is generally related to the size of the possible solution space. It can be shown with combinatorial mathematics that there are more possible solutions when 40 links are considered, compared to 20. However, during the in-class session you should have seen that it was more difficult to find a solution for 20 links. This is because the physics of the problem are also playing a role. It turns out that improving 40 links is enough to improve a large-enough part of the network to improve travel time for nearly all of the routes, and it is "easy" to find an optimal solution. However, with 20 links, you are only able to focus on smaller parts of the network; think of them as "corridors" through the total network. Finding the solution that chooses which of these corridors is the best (i.e., optimal) takes a longer time.</p> +<h2 id="questions">Questions</h2> +<h3 id="solving-ndp-problem-with-milp">Solving NDP problem with MILP</h3> +<p>Solution explanations here are based on results that have been computed with a budget of 40 road links (<code>extension_max_no</code> = 40) and I time limit of 100 seconds (the notebook given to students had 300), except where otherwise noted. Notice that all these results depend on the speed of your machine. You may have to extend the computation time to 300 seconds if you haven’t found a solution yet. Be aware that you can’t run a model only from the point onward of a change that you have introduced in a constraint. You need to run the whole model again. Also important to note when you run the optimization procedure again (the cell where this is written: <code>model.optimize()</code>) without restarting everything, Gurobi continues optimizing from the point where it stopped, meaning with the previous solutions tested. Gurobi adds the sentence: <code>continuing optimization!</code>. But even if you restart Gurobi completely you may start at a more promising point and it is possible it will give you a better solution in the same 100 seconds. That’s because the process is not deterministic, it depends on the strategy of exploring the branch and bound tree as explained in the lectures. Check section “5.7. Integer problems and solving with Branch-and-Bound†to learn more.</p> +<ol> +<li><strong>Has the optimal solution been found? (yes/no)</strong></li> +</ol> +<blockquote> +<p>No (because gap is not zero).</p> +</blockquote> +<p>No, the optimal solution has not been found because as you see in the table the last integer solution that has been found still has a GAP (65.1%). This GAP tells you the maximum error that you may be committing by choosing this solution, it does not mean actually that the last solution is not the optimal. It just tells you that you can't prove it yet because you have not explored all the nodes in the branch and bound tree. Check section “5.7. Integer problems and solving with Branch-and-Bound†to learn more.</p> +<ol start="2"> +<li><strong>If there is a gap, what can you tell about the value of the best solution you are still theoretically able to obtain?</strong></li> +</ol> +<blockquote> +<p>It's easy to check by just returning the best bound of the last best solution!</p> +</blockquote> +<p>It's easy to check by just returning the best bound of the last best solution! Indeed you can’t reject the possibility that there isn’t a better solution that you haven’t found yet after you stopped the algorithm with a value of the objective function that is the same as the best bound. In this case, the bound is 3832504.14. Theoretically, it’s still possible to get an optimal solution with that objective function value.</p> +<ol start="3"> +<li><strong>Consider now that the network operator does not want to surpass the capacity in every link. How do you write that constraint? Reminding you that in the current model it is possible to go beyond the capacity which makes traffic even slower (even higher travel time).</strong></li> +</ol> +<blockquote> +<p>Constrain the vehicles to the capacity of the road (<strong>this is the solution provided on the screen during the in-class session; see explanation for more details</strong>):</p> +<pre class="hljs"><code><div>c_new = model.addConstrs(link_flow[i, j] <= cap_normal[i,j] + (cap_extend[i,j] * link_selected[i,j]) <span class="hljs-keyword">for</span> (i, j) <span class="hljs-keyword">in</span> links) +</div></code></pre> +</blockquote> +<p>The answer to this question would have been:</p> +<pre class="hljs"><code><div>c_new2 = model.addConstrs(link_flow[i, j] <= cap_normal[i,j] + ((cap_extend[i,j]-cap_normal[i,j] ) * link_selected[i,j]) for (i, j) in links) +</div></code></pre> +<p>This constraint is a hard limit on the capacity of a road. You do not allow the flow to go over that physical limit, otherwise the problem is unfeasible. Notice that in this problem <code>cap_extend</code> has been defined as the final capacity after an extension, not just the added capacity. That was what created a confusion on Friday in class. In the constraint above when a link has not been selected for expansion only the normal capacity will be considered because <code>link_selected[i,j]</code> will be zero. But if the link is an upgraded one then you will add capacity to the capacity normal. That amount is the difference between the original capacity and the final extended capacity.</p> +<p>Unfortunately, such a constraint creates an unfeasible problem. It’s not possible to pass all the flow with the capacity you have, even with the extensions. That is interesting because it shows that indeed there are many links where the flow is over the capacity creating great delays on the roads.</p> +<p>When students changed the constraint to what was tested by the teachers of the optimization week (wrong constraint) where the capacity was double counted, <code>cap_normal + cap_extend</code>, the problem should be feasible:</p> +<pre class="hljs"><code><div>c_new1 = model.addConstrs(link_flow[i, j] <= cap_normal[i, j]+(link_selected[i, j]*cap_extend[i, j]) for (i, j) in links) +</div></code></pre> +<p>However, an additional issue occurred, which is that many students changed the constraint and started running the model from there (i.e., keep executing notebook cells without re-starting the Gurobi model). That is not possible since you are just adding more equations to your previous unfeasible problem. <strong>Always run the models from beginning to end when making a change to the problem</strong> (i.e., re-assign the <code>model</code> or create a new one).</p> +<p>With this “wrong†constraint that double counts the capacity, the model runs well.</p> +<p>With the original model without the constraint, you have an OF of 1.0976e+07 with a gap of 64.4% (best bound 3792722.49), with the new one that limits hard the capacity you have 1.1062e+07 with a gap of 22.4% (best bound 8583881.27).</p> +<p>The travel time seems to increase if you look at the best bound which is much higher but you can’t guarantee anything. An increase in travel time would make sense since you are restraining the flows even more, so cars need to find alternative paths.</p> +<p><em>Note that you can have different results from the numbers above depending on how the solving process goes. The point of this exercise was to be able to build the constraint which most groups were indeed able to do.</em></p> +<ol start="4"> +<li><strong>What do you observe in the solution when you run this new model for 20 links and expanded capacity of 1.5 (default increase)?</strong></li> +</ol> +<blockquote> +<p>The problem is unfeasible!</p> +</blockquote> +<p>The point here was to show that if you indeed limit the capacity too much (only 20 links at expanded capacity) the cars do not even fit the network capacity.</p> +<ol start="5"> +<li><strong>What can you do to fix that?</strong></li> +</ol> +<blockquote> +<p>Increasing the budget and/or the capacity extension.</p> +</blockquote> +<p>Often you find that you have created an unfeasible problem and you just need to relax it a bit more to find a solution.</p> +<h3 id="solving-ndp-problem-with-ga">Solving NDP problem with GA</h3> +<p>In this workbook, by default, you have 76 links as a budget, and that is a very special solution because it means that you can upgrade all the links! By mistake, there were two attributes with the budget in the notebook, but it was the parameter called <code>Budget</code> that should have been changed. It is used by the genetic algorithm to know how many binary variables can have the value of one. The maximum computation time in the results reported next is 300 seconds. No other stopping criteria were imposed that’s why the model never stops until 300 seconds.</p> +<ol> +<li><strong>What very important solution performance indicator did you lose by using the GA metaheuristic in comparison with MILP?</strong></li> +</ol> +<blockquote> +<p>No GAP is produced therefore if you did not run the math programing model you would not know how far or close you are from the optimal solution.</p> +</blockquote> +<p>Of course, seeing an almost flat line in the search progress in the GA helps build confidence that you have found the optimal solution. Moreover, since the solution is so trivial (76 links can be upgraded) you are sure of your optimal solution. Why didn't the genetic algorithm find an optimal solution in the first generation in some cases? This has to do with the large solution space, and the fact that the algorithm is initialized randombly, so we cannot guarantee that it always fings the global minimum, let alone find it in the fastest possible way. Additional insight is provided in the explanations below.</p> +<ol start="2"> +<li><strong>Try to obtain a better solution in the same computation time. What parameter is best to change to get that improvement? write your results in the box.</strong></li> +</ol> +<blockquote> +<p>Heere a description of anything you tried, whether it worked or not, was acceptable, as long as you were able to describe why it may or may not have improved computation time in a clear way.</p> +</blockquote> +<p>Population size was the easiest parameter to control. You can notice that increasing the population size in this problem with 76 links does not improve the speed of convergence. Actually, it makes it slower because you need to combine in each generation many of your population genes. The search procedure with the population size of 10 gives a solution which is obviously the 76 links and an objective function of 9.873735E+06. If the population size is changed to 50 then the convergence seems to be slower. But you still find the same optimal solution. Running the model with a population size of 1 makes no sense, you can’t generate a new generation if you don’t have enough parents.</p> +<p><img src="./figs_solution/fig1.png" alt="Figure 1"></p> +<p>With just two individuals it even converges faster:</p> +<p><img src="./figs_solution/fig2.png" alt="Figure 2"></p> +<p>When increasing population size from 10 to 200, and evaluating 36 links, you probably saw that the solution did not converge; this was due to the 5 minute time limit. Increasing to 15 minutes improves the solution, but still may be not enough. Clearly population size has a big influence on solution convergence! Because the population is initialized randomly, you should expect to run this several times to make sure you do not miss a suitable solution. There are also other “knobs†you can turn to change the computation time and process, for example, the parent and offspring settings.</p> +<p>Choosing an initial population size is highly dependent on the details of a particular problem. We do know, however, that with 1000’s of variables like we have in this problem, an initial population size of 10 is far too low! You would need to run this for a very long time to find a solution. In this project our intention was not to get a “great†solution, but to introduce you to the key characteristics of a GA approach (such as population size, crossover, etc) and how it is different than MILP, especially when it comes to how the solutions are assessed differently (e.g., gap versus objective function convergence).</p> +<p>In the assignment we asked you to try different parameter settings. We also included various methods from the pymoo package (for example, the <code>pymoo.operators.crossover.XXXXXX</code> at the top of the notebook):</p> +<ul> +<li>In the code we only used the half uniform crossover, which requires no additional parameter settings (i.e., no keyword arguments in the pymoo method)</li> +<li><code>PointCrossover</code> was covered in the online textbook; this method requires you to specify the number of points that are used to cross-over, which implies that one keyword argument should be provided. Here is an example from the documentation that actually includes a few examples, which includes the keyword argument <code>n_points=4</code>; this indicates 4 crossover points (although note that the textbook only includes examples illustrating this for 2 points).</li> +<li>Note on the page linked in the previous point that there are two methods which were not included in the notebooks we gave you: <code>SinglePointCrossover</code> and <code>TwoPointCrossover</code>. These methods require no additional keyword arguments and would have worked “out of the box;†they were also illustrated with examples in the online textbook. This was unfortunately not included in the original assignment description.</li> +</ul> +<ol start="3"> +<li><strong>Run the model with a small number of links (=1) and a big number of links (max=76), what differences do you see in the solutions and computation time compared with the previous model? and why?</strong></li> +</ol> +<blockquote> +<p>The performance changes a lot if you are locating just one link or 76. 76 is like no decision must be made, all are upgraded. With 1 you need to select the best one which is also fast. The problem is with intermediate solutions, like choose 30 out of the 76: it becomes a harder combinatorial problem to solve.</p> +</blockquote> +<p><em>The notebook was initialized with the value for budget being 76; we also asked you to consider 1 and 76 links. Both of these were not the best way to evaluate the effectiveness of the GA (or the MILP, for that matter).</em></p> +<p>The performance changes a lot if you are locating just one link or 76. 76 is a trivial decision (in fact it is like no decision must be made, all links are upgraded; this is why the original code in the notebook converged very quickly. With 1 you need to select the best one which is also fast, but still the algorithm has a harder task. The problem is with intermediate network sizes like choosing 40 out of the 76: it becomes a harder combinatorial problem to solve. Note the comment in the previous question about population size, where the algorithm took a long time to converge when 36 links were selected.</p> +<h3 id="comparison">Comparison</h3> +<ol> +<li><strong>Compare the GA approach with MILP approach. For the same computation time which one is faster?</strong></li> +</ol> +<blockquote> +<p>The GA is faster.</p> +</blockquote> +<p><strong>End of file.</strong></p> +<span style="font-size: 75%"> +© 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/">CC BY-NC-SA 4.0 License</a>. + +</body> +</html> diff --git a/src/teachers/Week_2_5/README_TEACHERS.html b/src/teachers/Week_2_5/README_TEACHERS.html new file mode 100644 index 0000000000000000000000000000000000000000..2f11a80620af396007a5071c2687323908c8660e --- /dev/null +++ b/src/teachers/Week_2_5/README_TEACHERS.html @@ -0,0 +1,379 @@ +<!DOCTYPE html> +<html> +<head> +<title>README_TEACHERS.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="readme-for-teachers-in-optimization-week">README for teachers in optimization week</h1> +<p>Overview, in order of when students will do each activity:</p> +<ol> +<li>Programming Assignment 2.4A (PA 2.4A): install Gurobi (Week 2.4 - start Mon Dec 2).</li> +<li>Programming Assignment 2.5 (PA 2.5): <strong>this is new in 2024</strong> a small assignment to make sure they know how Gurobi works (Week 2.5 - start Mon Dec 9).</li> +<li>Workshop 2.5 (WS 2.5), Wednesday, 10:30-12:30. Planet versus Profit exercise. The solution is <a href="https://mude.citg.tudelft.nl/2024/files/teachers/Week_2_5/WS_2_5_solution.html">here</a>; student version is generated from this file (<code># SOLUTION</code> blocks removed).</li> +<li>Group Assignment 2.5 (GA 2.5), Friday, 8:30-12:30. Traffic Network Problem. See <a href="https://mude.citg.tudelft.nl/2024/files/teachers/GA_2_5/">this folder</a>; start with README.</li> +</ol> +<p>Source code for all files can be found in GitLab in the <code>2024-files</code> repo in the MUDE Group: <a href="https://gitlab.tudelft.nl/mude/2024-files">gitlab.tudelft.nl/mude/2024-file</a>. Within this repo, files will be in the relevant subdirectory in <code>2024-files/content/.</code>. Message Robert or Jialei on Teams if you need access (log in to <a href="https://gitlab.tudelft.nl/">gitlab.tudelft.nl</a> first, if you have never done so).</p> + +</body> +</html> diff --git a/src/teachers/Week_2_5/WS_2_5_solution.html b/src/teachers/Week_2_5/WS_2_5_solution.html new file mode 100644 index 0000000000000000000000000000000000000000..84a3c8a3349024bc6255b936a39b667531180ff8 --- /dev/null +++ b/src/teachers/Week_2_5/WS_2_5_solution.html @@ -0,0 +1,8000 @@ +<!DOCTYPE html> + +<html lang="en"> +<head><meta charset="utf-8"/> +<meta content="width=device-width, initial-scale=1.0" name="viewport"/> +<title>WS_2_5_solution</title><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.min.js"></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=b3210984"> +<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="WS-2.5:-Profit-vs-Planet">WS 2.5: Profit vs Planet<a class="anchor-link" href="#WS-2.5:-Profit-vs-Planet">¶</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.5, Optimization. For: December 11, 2024</em></p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=1c4b1a7a"> +<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="Overview">Overview<a class="anchor-link" href="#Overview">¶</a></h2><p>A civil engineering company wants to decide on the projects that they should do. Their objective is to minimize the environmental impact of their projects while making enough profit to keep the company running.</p> +<p>They have a portfolio of 6 possible projects to invest in, where A, B , and C are new infrastructure projects (so-called type 1), and D, E, F are refurbishment projects (so-called type 2).</p> +<p>The environmental impact of each project is given by $I_i$ where $i \in [1,(...),6]$ is the index of the project. $I_i=[90,45,78,123,48,60]$</p> +<p>The profit of each project is given by $P_i$ where $i\in [1,(...),6]$ is the index of the project: $P_i=[120,65,99,110,33,99]$</p> +<p>The company wants to do 3 out of the 6 projects, therefore please formulate the mathematical program that allows solving the problem, also knowing that the projects of type 2 must be at least as many as the ones of type 1 and that the profit of all projects together must be greater or equal than $250$ ($\beta$)</p> +<p><b>You are not allowed to use ChatGPT for this task otherwise you won’t learn ;)</b></p> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=15d6b3f0"> +<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: Writting the mathematical formulation</b> +<p>Write down every formulation and constrain that is relevant to solve this optimization problem.</p> +</p> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=7d0c2565"> +<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> +$$Min(Z) \sum_{i=1}^{6} x_i I_i $$<p>subject to</p> +$$ \sum_{i=1}^{6} x_i = 3 $$$$ \sum_{i=4}^{6} x_i \ge \sum_{i=1}^{3} x_i $$$$ \sum_{i=1}^{6} x_i P_i \ge β $$$$x\in(1,0), i\in(1,....,6)$$<p>Extra Challenge (Task 6) +$$ \sum_{i=1}^{6} x_i I_i \le x_1 γ + (1-x_1) M $$</p> +<p>where M is a sufficiently big number such as 9999</p> +</p> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=d1f9f576"> +<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: Setting up the software</b> +<p>We'll continue using Gurobi this week, which you've set up in last week's PA. We'll use some other special packages as well. Therefore, be sure to use the special conda environment created for this week.</p> +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=ae96cbb5"> +<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">gurobipy</span> <span class="k">as</span> <span class="nn">gp</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=a1b35e97"> +<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 3: Setting up the problem</b> +<p>Define any variables you might need to setup your model.</p> +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=d5cba9fe"> +<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"># YOUR_CODE_HERE</span> + +<span class="c1"># SOLUTION</span> +<span class="c1"># Project data</span> +<span class="n">I</span> <span class="o">=</span> <span class="p">[</span><span class="mi">90</span><span class="p">,</span> <span class="mi">45</span><span class="p">,</span> <span class="mi">78</span><span class="p">,</span> <span class="mi">123</span><span class="p">,</span> <span class="mi">48</span><span class="p">,</span> <span class="mi">60</span><span class="p">]</span> <span class="c1"># Environmental impact</span> +<span class="n">P</span> <span class="o">=</span> <span class="p">[</span><span class="mi">120</span><span class="p">,</span> <span class="mi">65</span><span class="p">,</span> <span class="mi">99</span><span class="p">,</span> <span class="mi">110</span><span class="p">,</span> <span class="mi">33</span><span class="p">,</span> <span class="mi">99</span><span class="p">]</span> <span class="c1"># Profit</span> + +<span class="c1"># Minimum required profit</span> +<span class="n">beta</span> <span class="o">=</span> <span class="mi">250</span> +<span class="n">M</span> <span class="o">=</span> <span class="mi">100000</span> + +<span class="c1"># Number of projects and types</span> +<span class="n">num_projects</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">I</span><span class="p">)</span> +<span class="n">num_type1_projects</span> <span class="o">=</span> <span class="mi">3</span> +<span class="n">num_type2_projects</span> <span class="o">=</span> <span class="n">num_projects</span> <span class="o">-</span> <span class="n">num_type1_projects</span> +</pre></div> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=88d658e6"> +<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="Create-model-with-Gurobi">Create model with Gurobi<a class="anchor-link" href="#Create-model-with-Gurobi">¶</a></h2><p>Remember that examples of using Gurobi to create and optimize a model are provided in the online textbook, and generally consist of the following steps (the first instantiates a class and the rest are executed as methods of the class):</p> +<ol> +<li>Define the model (instantiate the class)</li> +<li>Define variables</li> +<li>Define objective function</li> +<li>Add constraints</li> +<li>Optimize the model</li> +</ol> +<p>Remember, you can always ask for help to understand a function of gurobi</p> +<pre><code>help(gurobipy.model.addVars) +</code></pre> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=789ed5ae"> +<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 4: Create the Gurobi model</b> +<p>Create the Gurobi model, set your decision variables, your function and your constrains. Take a look at the book for an example implementation in Python if you don't know where to start.</p> +</p> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=58f70d74"> +<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>Each line of code does the following:</p> +<ol> +<li>Create a Gurobi model</li> +<li>Add binary variables</li> +<li>Objective function: Minimize environmental impact</li> +<li>Constraint: Select exactly 3 projects</li> +<li>Constraint: Number of type 2 projects must be at least as many as type 1 projects selected</li> +<li>Constraint: Minimum profit requirement</li> +<li>Optimize the model</li> +</ol> +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell" id="cell-id=8d008ba9"> +<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"># YOUR_CODE_HERE</span> + +<span class="c1"># SOLUTION</span> +<span class="n">model</span> <span class="o">=</span> <span class="n">gp</span><span class="o">.</span><span class="n">Model</span><span class="p">(</span><span class="s2">"Project_Selection"</span><span class="p">)</span> +<span class="n">x</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">addVars</span><span class="p">(</span><span class="n">num_projects</span><span class="p">,</span> <span class="n">vtype</span><span class="o">=</span><span class="n">gp</span><span class="o">.</span><span class="n">GRB</span><span class="o">.</span><span class="n">BINARY</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s2">"x"</span><span class="p">)</span> +<span class="n">model</span><span class="o">.</span><span class="n">setObjective</span><span class="p">(</span><span class="nb">sum</span><span class="p">(</span><span class="n">I</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">x</span><span class="p">[</span><span class="n">i</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">num_projects</span><span class="p">)),</span> + <span class="n">gp</span><span class="o">.</span><span class="n">GRB</span><span class="o">.</span><span class="n">MINIMIZE</span><span class="p">)</span> +<span class="n">model</span><span class="o">.</span><span class="n">addConstr</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span> <span class="o">==</span> <span class="mi">3</span><span class="p">,</span> <span class="s2">"Select_Projects"</span><span class="p">)</span> +<span class="n">model</span><span class="o">.</span><span class="n">addConstr</span><span class="p">((</span><span class="nb">sum</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="n">i</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">num_type2_projects</span><span class="p">,</span> <span class="n">num_projects</span><span class="p">))</span> + <span class="o">-</span> <span class="nb">sum</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="n">i</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">num_type1_projects</span><span class="p">))</span> <span class="o">>=</span> <span class="mi">0</span><span class="p">),</span> + <span class="s2">"Type_Constraint"</span><span class="p">)</span> +<span class="n">model</span><span class="o">.</span><span class="n">addConstr</span><span class="p">(</span><span class="nb">sum</span><span class="p">(</span><span class="n">P</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">x</span><span class="p">[</span><span class="n">i</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">num_projects</span><span class="p">))</span> <span class="o">>=</span> <span class="n">beta</span><span class="p">,</span> + <span class="s2">"Minimum_Profit"</span><span class="p">)</span> +<span class="n">model</span><span class="o">.</span><span class="n">optimize</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>Gurobi Optimizer version 9.5.1 build v9.5.1rc2 (win64) +Thread count: 4 physical cores, 8 logical processors, using up to 8 threads +Optimize a model with 3 rows, 6 columns and 18 nonzeros +Model fingerprint: 0xa9bc0e77 +Variable types: 0 continuous, 6 integer (6 binary) +Coefficient statistics: + Matrix range [1e+00, 1e+02] + Objective range [5e+01, 1e+02] + Bounds range [1e+00, 1e+00] + RHS range [3e+00, 3e+02] +Presolve time: 0.00s +Presolved: 3 rows, 6 columns, 17 nonzeros +Variable types: 0 continuous, 6 integer (6 binary) +Found heuristic solution: objective 228.0000000 +Found heuristic solution: objective 198.0000000 + +Root relaxation: objective 1.855909e+02, 3 iterations, 0.00 seconds (0.00 work units) + + Nodes | Current Node | Objective Bounds | Work + Expl Unexpl | Obj Depth IntInf | Incumbent BestBd Gap | It/Node Time + + 0 0 infeasible 0 198.00000 198.00000 0.00% - 0s + +Explored 1 nodes (3 simplex iterations) in 0.01 seconds (0.00 work units) +Thread count was 8 (of 8 available processors) + +Solution count 2: 198 228 + +Optimal solution found (tolerance 1.00e-04) +Best objective 1.980000000000e+02, best bound 1.980000000000e+02, gap 0.0000% +</pre> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=1380916b"> +<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 5: Display your results</b> +<p>Display the model in a good way to interpret and print the solution of the optimization.</p> +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell" id="cell-id=83ef8b18"> +<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"># YOUR_CODE_HERE</span> + +<span class="c1"># SOLUTION</span> +<span class="nb">print</span><span class="p">(</span><span class="s2">"Model structure:"</span><span class="p">)</span> +<span class="c1"># see the model that you have built in a nice why to interpret</span> +<span class="n">model</span><span class="o">.</span><span class="n">display</span><span class="p">()</span> + +<span class="k">if</span> <span class="n">model</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="n">gp</span><span class="o">.</span><span class="n">GRB</span><span class="o">.</span><span class="n">OPTIMAL</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s2">"Optimal Solution:"</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">num_projects</span><span class="p">):</span> + <span class="k">if</span> <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">x</span> <span class="o">></span> <span class="mf">0.9</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Project </span><span class="si">{</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="si">}</span><span class="s2">: Selected"</span><span class="p">)</span> +<span class="k">else</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s2">"No optimal solution found."</span><span class="p">)</span> + + +<span class="nb">print</span><span class="p">(</span><span class="s2">"Optimal Objective function Value"</span><span class="p">,</span> <span class="n">model</span><span class="o">.</span><span class="n">objVal</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>Model structure: +Minimize + <gurobi.LinExpr: 90.0 x[0] + 45.0 x[1] + 78.0 x[2] + 123.0 x[3] + 48.0 x[4] + 60.0 x[5]> +Subject To + Select_Projects: <gurobi.LinExpr: x[0] + x[1] + x[2] + x[3] + x[4] + x[5]> = 3 +Type_Constraint: <gurobi.LinExpr: -1.0 x[0] + -1.0 x[1] + -1.0 x[2] + x[3] + x[4] + + x[5]> >= 0 +Minimum_Profit: <gurobi.LinExpr: 120.0 x[0] + 65.0 x[1] + 99.0 x[2] + 110.0 x[3] + 33.0 + x[4] + 99.0 x[5]> >= 250 +Binaries + ['x[0]', 'x[1]', 'x[2]', 'x[3]', 'x[4]', 'x[5]'] +Optimal Solution: +Project 1: Selected +Project 5: Selected +Project 6: Selected +Optimal Objective function Value 198.0 +</pre> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=98cb6023"> +<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 6: Additional constraint</b> +<p>Solve the model with an additional constraint: if project 1 is done then the impact of all projects together should be lower than $\gamma$ with $\gamma=130$.</p> +<p>In the first cell you should add the constraint, then in a second cell optimize the model.</p> +</p> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell" id="cell-id=9f2f9b6d"> +<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"># YOUR_CODE_HERE</span> + +<span class="c1"># SOLUTION</span> +<span class="n">gamma</span> <span class="o">=</span> <span class="mi">130</span> +<span class="n">model</span><span class="o">.</span><span class="n">addConstr</span><span class="p">((</span><span class="nb">sum</span><span class="p">(</span><span class="n">I</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">x</span><span class="p">[</span><span class="n">i</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">num_projects</span><span class="p">))</span> + <span class="o"><=</span> <span class="n">gamma</span> <span class="o">*</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span> <span class="n">M</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">])),</span> + <span class="s2">"Impact_Constraint"</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><gurobi.Constr *Awaiting Model Update*></pre> +</div> +</div> +</div> +</div> +</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell" id="cell-id=19040bd6"> +<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"># YOUR_CODE_HERE</span> + +<span class="c1"># SOLUTION</span> +<span class="n">model</span><span class="o">.</span><span class="n">optimize</span><span class="p">()</span> + +<span class="nb">print</span><span class="p">(</span><span class="s2">"Model structure:"</span><span class="p">)</span> +<span class="c1"># see the model that you have built in a nice why to interpret</span> +<span class="n">model</span><span class="o">.</span><span class="n">display</span><span class="p">()</span> + +<span class="c1"># Display the solution</span> +<span class="k">if</span> <span class="n">model</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="n">gp</span><span class="o">.</span><span class="n">GRB</span><span class="o">.</span><span class="n">OPTIMAL</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s2">"Optimal Solution:"</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">num_projects</span><span class="p">):</span> + <span class="k">if</span> <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">x</span> <span class="o">></span> <span class="mf">0.9</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Project </span><span class="si">{</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="si">}</span><span class="s2">: Selected"</span><span class="p">)</span> +<span class="k">else</span><span class="p">:</span> + <span class="nb">print</span><span class="p">(</span><span class="s2">"No optimal solution found."</span><span class="p">)</span> + + +<span class="nb">print</span><span class="p">(</span><span class="s2">"Optimal Objective function Value"</span><span class="p">,</span> <span class="n">model</span><span class="o">.</span><span class="n">objVal</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>Gurobi Optimizer version 9.5.1 build v9.5.1rc2 (win64) +Thread count: 4 physical cores, 8 logical processors, using up to 8 threads +Optimize a model with 4 rows, 6 columns and 24 nonzeros +Model fingerprint: 0x37d09666 +Variable types: 0 continuous, 6 integer (6 binary) +Coefficient statistics: + Matrix range [1e+00, 1e+05] + Objective range [5e+01, 1e+02] + Bounds range [1e+00, 1e+00] + RHS range [3e+00, 1e+05] + +MIP start from previous solve did not produce a new incumbent solution +MIP start from previous solve violates constraint Impact_Constraint by 68.000000000 + +Presolve removed 4 rows and 6 columns +Presolve time: 0.00s +Presolve: All rows and columns removed + +Explored 0 nodes (0 simplex iterations) in 0.01 seconds (0.00 work units) +Thread count was 1 (of 8 available processors) + +Solution count 1: 228 + +Optimal solution found (tolerance 1.00e-04) +Best objective 2.280000000000e+02, best bound 2.280000000000e+02, gap 0.0000% +Model structure: +Minimize + <gurobi.LinExpr: 90.0 x[0] + 45.0 x[1] + 78.0 x[2] + 123.0 x[3] + 48.0 x[4] + 60.0 x[5]> +Subject To + Select_Projects: <gurobi.LinExpr: x[0] + x[1] + x[2] + x[3] + x[4] + x[5]> = 3 +Type_Constraint: <gurobi.LinExpr: -1.0 x[0] + -1.0 x[1] + -1.0 x[2] + x[3] + x[4] + + x[5]> >= 0 +Minimum_Profit: <gurobi.LinExpr: 120.0 x[0] + 65.0 x[1] + 99.0 x[2] + 110.0 x[3] + 33.0 + x[4] + 99.0 x[5]> >= 250 +Impact_Constraint: <gurobi.LinExpr: 99960.0 x[0] + 45.0 x[1] + 78.0 x[2] + 123.0 x[3] + + 48.0 x[4] + 60.0 x[5]> <= 100000 +Binaries + ['x[0]', 'x[1]', 'x[2]', 'x[3]', 'x[4]', 'x[5]'] +Optimal Solution: +Project 2: Selected +Project 4: Selected +Project 6: Selected +Optimal Objective function Value 228.0 +</pre> +</div> +</div> +</div> +</div> +</div> +<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=603aea77"> +<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> +</html>