mirror of
https://github.com/fverdugo/XM_40017.git
synced 2025-11-08 22:24:25 +01:00
9259 lines
768 KiB
HTML
9259 lines
768 KiB
HTML
<!DOCTYPE html>
|
||
|
||
<html lang="en">
|
||
<head><meta charset="utf-8"/>
|
||
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
|
||
<title>julia_mpi</title><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.min.js"></script>
|
||
<script src='../assets/iframeResizer.contentWindow.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.7.0/mermaid.esm.min.mjs")).default;
|
||
const parser = new DOMParser();
|
||
|
||
mermaid.initialize({
|
||
maxTextSize: 100000,
|
||
maxEdges: 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 {
|
||
let { svg } = await mermaid.render(id, raw, el);
|
||
svg = cleanMermaidSvg(svg);
|
||
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);
|
||
}
|
||
|
||
|
||
/**
|
||
* Post-process to ensure mermaid diagrams contain only valid SVG and XHTML.
|
||
*/
|
||
function cleanMermaidSvg(svg) {
|
||
return svg.replace(RE_VOID_ELEMENT, replaceVoidElement);
|
||
}
|
||
|
||
|
||
/**
|
||
* A regular expression for all void elements, which may include attributes and
|
||
* a slash.
|
||
*
|
||
* @see https://developer.mozilla.org/en-US/docs/Glossary/Void_element
|
||
*
|
||
* Of these, only `<br>` is generated by Mermaid in place of `\n`,
|
||
* but _any_ "malformed" tag will break the SVG rendering entirely.
|
||
*/
|
||
const RE_VOID_ELEMENT =
|
||
/<\s*(area|base|br|col|embed|hr|img|input|link|meta|param|source|track|wbr)\s*([^>]*?)\s*>/gi;
|
||
|
||
/**
|
||
* Ensure a void element is closed with a slash, preserving any attributes.
|
||
*/
|
||
function replaceVoidElement(match, tag, rest) {
|
||
rest = rest.trim();
|
||
if (!rest.endsWith('/')) {
|
||
rest = `${rest} /`;
|
||
}
|
||
return `<${tag} ${rest}>`;
|
||
}
|
||
|
||
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=7606d30a">
|
||
<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">
|
||
<img alt="No description has been provided for this image" src="https://upload.wikimedia.org/wikipedia/commons/thumb/3/39/VU_logo.png/800px-VU_logo.png?20161029201021" width="350"/>
|
||
<h3 id="Programming-large-scale-parallel-systems">Programming large-scale parallel systems<a class="anchor-link" href="#Programming-large-scale-parallel-systems">¶</a></h3>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=4ac1e5d9">
|
||
<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="Intro-to-MPI-(point-to-point)">Intro to MPI (point-to-point)<a class="anchor-link" href="#Intro-to-MPI-(point-to-point)">¶</a></h1>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=a341be2e">
|
||
<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="Contents">Contents<a class="anchor-link" href="#Contents">¶</a></h2><p>In this notebook, we will learn the basics of parallel computing using the Message Passing Interface (MPI) from Julia. In particular, we will learn:</p>
|
||
<ul>
|
||
<li>How to use point-to-point communication directives</li>
|
||
<li>Which are the pros and cons of several types of send and receive functions</li>
|
||
<li>Which are the common pitfalls when using point-to-point directives</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=8862079b">
|
||
<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="What-is-MPI-?">What is MPI ?<a class="anchor-link" href="#What-is-MPI-?">¶</a></h2><ul>
|
||
<li>MPI stands for the "Message Passing Interface"</li>
|
||
<li>It is a standardized library specification for communication between parallel processes in distributed-memory systems.</li>
|
||
<li>It is the gold-standard for distributed computing in HPC systems since the 90s</li>
|
||
<li>It is huge: the MPI standard has more than 1k pages (see <a href="https://www.mpi-forum.org/docs/mpi-4.0/mpi40-report.pdf">https://www.mpi-forum.org/docs/mpi-4.0/mpi40-report.pdf</a>)</li>
|
||
<li>There are several implementations of this standard (OpenMPI, MPICH, IntelMPI)</li>
|
||
<li>The interface is in C and FORTRAN (C++ was deprecated)</li>
|
||
<li>There are Julia bindings via the package MPI.jl <a href="https://github.com/JuliaParallel/MPI.jl">https://github.com/JuliaParallel/MPI.jl</a></li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=7c31907f">
|
||
<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="Before-starting-this-notebook">Before starting this notebook<a class="anchor-link" href="#Before-starting-this-notebook">¶</a></h3><p>Read this paper to get an overview of the history and rationale behind MPI:</p>
|
||
<p>J.J. Dongarra, S.W. Otto, M. Snir, and D. Walker, David. A message passing standard for MPP and workstations, <em>Commun. ACM</em>, 39(7), 84–90, 1996. DOI: <a href="https://doi.org/10.1145/233977.234000">10.1145/233977.234000</a>.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=99c6febb">
|
||
<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="What-is-MPI.jl-?">What is MPI.jl ?<a class="anchor-link" href="#What-is-MPI.jl-?">¶</a></h3><p>We will access MPI via the Julia bindings provided by the <a href="https://github.com/JuliaParallel/MPI.jl"><code>MPI.jl</code></a> package. It is worth noting that:</p>
|
||
<ul>
|
||
<li>MPI is not a Julia implementation of the MPI standard</li>
|
||
<li>It is just a wrapper to the C interface of MPI.</li>
|
||
<li>You need a C MPI installation in your system (MPI.jl downloads one for you when needed).</li>
|
||
</ul>
|
||
<h3 id="Why-MPI.jl?">Why MPI.jl?<a class="anchor-link" href="#Why-MPI.jl?">¶</a></h3><p>MPI.jl provides a convenient Julia API to access MPI. For instance, this is how you get the id (rank) of the current process.</p>
|
||
<div class="highlight"><pre><span></span><span class="n">comm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">COMM_WORLD</span>
|
||
<span class="n">rank</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Comm_rank</span><span class="p">(</span><span class="n">comm</span><span class="p">)</span>
|
||
</pre></div>
|
||
<p>Internally, MPI.jl uses <code>ccall</code> which is a mechanism that allows you to call C functions from Julia. In this, example we are calling the C function <code>MPI_Comm_rank</code> from the underlying MPI installation.</p>
|
||
<div class="highlight"><pre><span></span><span class="n">comm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">COMM_WORLD</span><span class="w"> </span>
|
||
<span class="n">rank_ref</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kt">Ref</span><span class="p">{</span><span class="kt">Cint</span><span class="p">}()</span>
|
||
<span class="k">ccall</span><span class="p">((</span><span class="ss">:MPI_Comm_rank</span><span class="p">,</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">API</span><span class="o">.</span><span class="n">libmpi</span><span class="p">),</span><span class="w"> </span><span class="kt">Cint</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="n">MPI</span><span class="o">.</span><span class="n">API</span><span class="o">.</span><span class="n">MPI_Comm</span><span class="p">,</span><span class="w"> </span><span class="kt">Ptr</span><span class="p">{</span><span class="kt">Cint</span><span class="p">}),</span><span class="w"> </span><span class="n">comm</span><span class="p">,</span><span class="w"> </span><span class="n">rank_ref</span><span class="p">)</span>
|
||
<span class="n">rank</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kt">Int</span><span class="p">(</span><span class="n">rank_ref</span><span class="p">[])</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=c6c44e2d">
|
||
<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 are curious, run next cell to get more information about how <code>ccall</code> works.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=f1f4c046">
|
||
<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-julia"><pre><span></span><span class="o">?</span><span class="w"> </span><span class="k">ccall</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=e99c7676-989e-4e91-b65e-ebca2d5626a4">
|
||
<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="Installing-MPI-in-Julia">Installing MPI in Julia<a class="anchor-link" href="#Installing-MPI-in-Julia">¶</a></h3><p>MPI can be installed as any other Julia package using the package manager.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=0b44409e">
|
||
<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-julia"><pre><span></span><span class="p">]</span><span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="n">MPI</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=abc6f017">
|
||
<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 class="alert alert-block alert-info">
|
||
<b>Note:</b> Julia will download and install a MPI library for you, but it is also possible to use a MPI library already available in your system. This is useful, e.g., when running on HPC clusters. See the documentation of MPI.jl for further details. See more information in <a href="https://github.com/JuliaParallel/MPI.jl">https://github.com/JuliaParallel/MPI.jl</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=9db130db">
|
||
<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="Minimal-MPI-program">Minimal MPI program<a class="anchor-link" href="#Minimal-MPI-program">¶</a></h2><p>An MPI program must, at least, initialize and then finalize MPI. Finalizing MPI in the user code is optional in Julia as there is an internal mechanism that will finalize MPI for your. You can deactivate this mechanism by initializing MPI with <code>MPI.Init(finalize_atexit=false)</code>. Once finalized, MPI procedures cannot be used anymore except very few exceptions.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=8f15cfda">
|
||
<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 Julia (option 1, recommended):</p>
|
||
<div class="highlight"><pre><span></span><span class="k">using</span><span class="w"> </span><span class="n">MPI</span>
|
||
<span class="n">MPI</span><span class="o">.</span><span class="n">Init</span><span class="p">()</span>
|
||
<span class="c"># Your MPI programm here</span>
|
||
<span class="n">MPI</span><span class="o">.</span><span class="n">Finalize</span><span class="p">()</span><span class="w"> </span><span class="c"># Optional</span>
|
||
</pre></div>
|
||
<p>In Julia (option 2, advanced):</p>
|
||
<div class="highlight"><pre><span></span><span class="k">using</span><span class="w"> </span><span class="n">MPI</span>
|
||
<span class="n">MPI</span><span class="o">.</span><span class="n">Init</span><span class="p">(</span><span class="n">finalize_atexit</span><span class="o">=</span><span class="nb">false</span><span class="p">)</span>
|
||
<span class="c"># Your MPI programm here</span>
|
||
<span class="n">MPI</span><span class="o">.</span><span class="n">Finalize</span><span class="p">()</span><span class="w"> </span><span class="c"># Mandatory</span>
|
||
</pre></div>
|
||
<p>In C:</p>
|
||
<div class="highlight"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><mpi.h></span>
|
||
<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">argc</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="o">**</span><span class="w"> </span><span class="n">argv</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<span class="w"> </span><span class="n">MPI_Init</span><span class="p">(</span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">);</span>
|
||
<span class="w"> </span><span class="cm">/* Your MPI Programm here */</span>
|
||
<span class="w"> </span><span class="n">MPI_Finalize</span><span class="p">();</span>
|
||
<span class="p">}</span>
|
||
</pre></div>
|
||
<div class="alert alert-block alert-info">
|
||
<b>Note:</b> Note that the Julia syntax is almost 1-to-1 to the C one. The key difference is that in Julia MPI routines are written as `MPI.X` where in C are written `MPI_X`.
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=87dfb768">
|
||
<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="An-incorrect-MPI-program">An incorrect MPI program<a class="anchor-link" href="#An-incorrect-MPI-program">¶</a></h3><p>It is very easy to end up with incorrect programs when using MPI if you are not careful following the rules. In this notebook, we will see many examples. For instance:</p>
|
||
<div class="highlight"><pre><span></span><span class="k">using</span><span class="w"> </span><span class="n">MPI</span>
|
||
<span class="n">MPI</span><span class="o">.</span><span class="n">Init</span><span class="p">(;</span><span class="n">finalize_atexit</span><span class="o">=</span><span class="nb">false</span><span class="p">)</span>
|
||
<span class="nd">@assert</span><span class="w"> </span><span class="n">rand</span><span class="p">(</span><span class="mi">1</span><span class="o">:</span><span class="mi">10</span><span class="p">)</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">2</span>
|
||
<span class="n">MPI</span><span class="o">.</span><span class="n">Finalize</span><span class="p">()</span>
|
||
</pre></div>
|
||
<p>In some process <code>rand(1:10)</code> might be 2 and the program will stop without reaching <code>MPI.Finalize()</code> leading to an incorrect program.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=65de4419">
|
||
<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="Solving-the-issue">Solving the issue<a class="anchor-link" href="#Solving-the-issue">¶</a></h3>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=4a8ebeff">
|
||
<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>Premature finalization of a program is done with <code>MPI_Abort</code>.</p>
|
||
<div class="highlight"><pre><span></span><span class="k">using</span><span class="w"> </span><span class="n">MPI</span>
|
||
<span class="n">MPI</span><span class="o">.</span><span class="n">Init</span><span class="p">()</span>
|
||
<span class="k">if</span><span class="w"> </span><span class="n">rand</span><span class="p">(</span><span class="mi">1</span><span class="o">:</span><span class="mi">10</span><span class="p">)</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">2</span>
|
||
<span class="w"> </span><span class="n">errorcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Abort</span><span class="p">(</span><span class="n">MPI</span><span class="o">.</span><span class="n">COMM_WORLD</span><span class="p">,</span><span class="n">errorcode</span><span class="p">)</span>
|
||
<span class="k">end</span>
|
||
<span class="n">MPI</span><span class="o">.</span><span class="n">Finalize</span><span class="p">()</span>
|
||
</pre></div>
|
||
<p>There is no need to call <code>MPI_Abort</code> in all ranks. The MPI library will do its best to stop all MPI ranks even if <code>MPI_Abort</code> was called just on a single rank.</p>
|
||
<div class="alert alert-block alert-info">
|
||
<b>Note:</b> Processes are often called ranks, when working with MPI.
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=fa7145bc">
|
||
<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="Read-the-docs">Read the docs<a class="anchor-link" href="#Read-the-docs">¶</a></h3><p>Not sure if an MPI routine needs to be called by all ranks? Read the documentation, specially the external links. Run the next cell, open an external link and read the documentation.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=a74c7c72">
|
||
<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-julia"><pre><span></span><span class="o">?</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Finalize</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=a534e3a2">
|
||
<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="Basic-information-about-MPI-processes">Basic information about MPI processes<a class="anchor-link" href="#Basic-information-about-MPI-processes">¶</a></h2><p>The following cells give information about MPI processes, such as the rank id, the total number of processes and the name of the host running the code. Before calling this functions one needs to initialize MPI.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=96f7c14e">
|
||
<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-julia"><pre><span></span><span class="k">using</span><span class="w"> </span><span class="n">MPI</span>
|
||
<span class="n">MPI</span><span class="o">.</span><span class="n">Init</span><span class="p">()</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=48f89e38">
|
||
<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 class="alert alert-block alert-info">
|
||
<b>Note:</b> If you get some error or warning when initializing MPI, make sure that you started the notebook using `IJulia`. Go back to the first notebook for specific details.
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=fe202985">
|
||
<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>Current rank (process) id</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=bd8232f5">
|
||
<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-julia"><pre><span></span><span class="n">comm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">COMM_WORLD</span>
|
||
<span class="n">rank</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Comm_rank</span><span class="p">(</span><span class="n">comm</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=cb480322">
|
||
<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 class="alert alert-block alert-info">
|
||
<b>Note:</b> Note that the rank ids start with 0.
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=dd40d1dc">
|
||
<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>Number of available processes</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=0befa408">
|
||
<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-julia"><pre><span></span><span class="n">nranks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Comm_size</span><span class="p">(</span><span class="n">comm</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=d1eeaf81">
|
||
<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>Name of the current host</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=ff01adcf">
|
||
<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-julia"><pre><span></span><span class="n">MPI</span><span class="o">.</span><span class="n">Get_processor_name</span><span class="p">()</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=f1a502a3">
|
||
<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 this note notebook is running on a single process. So using MPI will only make sense later when we add more processes.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=133327e2">
|
||
<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="Hello-world-example">Hello-world example<a class="anchor-link" href="#Hello-world-example">¶</a></h3><p>Using these functions we can create the a classic MPI hello world example. This example (or variations thereof) are used in practice to check how MPI ranks are mapped to available processing units in a given computing system.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=a154b55e">
|
||
<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-julia"><pre><span></span><span class="k">using</span><span class="w"> </span><span class="n">MPI</span>
|
||
<span class="n">MPI</span><span class="o">.</span><span class="n">Init</span><span class="p">()</span>
|
||
<span class="n">comm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">COMM_WORLD</span>
|
||
<span class="n">nranks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Comm_size</span><span class="p">(</span><span class="n">comm</span><span class="p">)</span>
|
||
<span class="n">rank</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Comm_rank</span><span class="p">(</span><span class="n">comm</span><span class="p">)</span>
|
||
<span class="n">host</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Get_processor_name</span><span class="p">()</span>
|
||
<span class="n">println</span><span class="p">(</span><span class="s">"Hello from </span><span class="si">$host</span><span class="s">, I am process </span><span class="si">$rank</span><span class="s"> of </span><span class="si">$nranks</span><span class="s"> processes!"</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=baddbba1">
|
||
<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="Hello-world-in-C">Hello world in C<a class="anchor-link" href="#Hello-world-in-C">¶</a></h3><p>This is the equivalent code in C.</p>
|
||
<div class="highlight"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><mpi.h></span>
|
||
<span class="cp">#include</span><span class="w"> </span><span class="cpf"><stdio.h></span>
|
||
<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">argc</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="o">**</span><span class="w"> </span><span class="n">argv</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<span class="w"> </span><span class="n">MPI_Init</span><span class="p">(</span><span class="nb">NULL</span><span class="p">,</span><span class="w"> </span><span class="nb">NULL</span><span class="p">);</span>
|
||
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">world_size</span><span class="p">;</span>
|
||
<span class="w"> </span><span class="n">MPI_Comm_size</span><span class="p">(</span><span class="n">MPI_COMM_WORLD</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">world_size</span><span class="p">);</span>
|
||
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">world_rank</span><span class="p">;</span>
|
||
<span class="w"> </span><span class="n">MPI_Comm_rank</span><span class="p">(</span><span class="n">MPI_COMM_WORLD</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">world_rank</span><span class="p">);</span>
|
||
<span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="n">processor_name</span><span class="p">[</span><span class="n">MPI_MAX_PROCESSOR_NAME</span><span class="p">];</span>
|
||
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">name_len</span><span class="p">;</span>
|
||
<span class="w"> </span><span class="n">MPI_Get_processor_name</span><span class="p">(</span><span class="n">processor_name</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">name_len</span><span class="p">);</span>
|
||
<span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"Hello from %s, I am rank %d of %d ranks!</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span>
|
||
<span class="w"> </span><span class="n">processor_name</span><span class="p">,</span><span class="w"> </span><span class="n">world_rank</span><span class="p">,</span><span class="w"> </span><span class="n">world_size</span><span class="p">);</span>
|
||
<span class="w"> </span><span class="n">MPI_Finalize</span><span class="p">();</span>
|
||
<span class="p">}</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=e3901c57">
|
||
<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="Running-MPI-code">Running MPI code<a class="anchor-link" href="#Running-MPI-code">¶</a></h2>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=8376135d">
|
||
<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="Creating-MPI-processes-(aka-ranks)">Creating MPI processes (aka ranks)<a class="anchor-link" href="#Creating-MPI-processes-(aka-ranks)">¶</a></h3><p>MPI processes are created with the driver program <code>mpiexec</code>, which comes as part of an MPI installation:</p>
|
||
<ul>
|
||
<li><code>mpiexec</code> takes an application as argument, it creates different processes, and runs the application on these processes.</li>
|
||
<li>The application will typically call MPI directives to communicate between these ranks</li>
|
||
<li>In particular, the application can be <code>julia code.jl</code>, i.e., Julia running a given script <code>code.jl</code>.</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=a458c714">
|
||
<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>
|
||
<img align="left" alt="No description has been provided for this image" src="data:image/png;base64,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REREREREROoKJUxEaq8fb9y4sX7Xrl1PxLoi0VZaWsqiRYuYNm0a+/btsz3nqquuwuv10rt3b8fxVq5cicfjYcOGDbbl8Zq8KCoq4sUXX+Tpp5/m2LFjtuekpqaSnZ1NSkqKo1giIiIiIiIiIiJ1jRImIrVXo4YNG/YD7NelqiNWrFhBZmZmhcmL9u3bM2nSJIYNG4bL5XIUa8eOHeTk5LB48WLb8gYNGjBq1CjGjRtHkyZNHMUqKiri2WefZc6cOZw4YZ/zSk1Nxev1cv755zuKFQgEWLp0KT6fj23bttme06VLF7KysrjxxhsdxRIREREREREREamrlDARqcUSExNTqaMJk8LCQqZOncqSJUtsy8uSF+PHj6dx48aOYh0/fpx58+ZVmbzw+Xycd955jmKVJS+8Xi/bt2+3Padr165kZWUxcOBAR7EAPv/8czweDx9++KFtefPmzZkwYQIjR44kKUlNvoiIiIiIiIiISEXUeyZSi53e+D091vWIpFCTF5MnT6Zz586OYpUlL7Kzs9mxY4ftOZdffjler5drr73WUSyAzz77DI/Hw0cffWRb3qJFCx599FHuvfdex5us7969m9zcXP785z9z6tSpoPKkpCSGDx9OWloarVq1chRLRERERERERETkbKCEiUjt1nPPnj3t27ZtuyvWFYmUwYMH8+WXX9qWXXHFFXi9Xvr06eM4zscff4zH4+HTTz+1LW/dujVpaWnceeedjvcpKUtevPLKK/j9/qDysuRFeno6LVu2dBSrpKSEvLw8pk+fzpEjR2zP6devH9nZ2XTv3t1RLBERERERERERkbOJEiYitZurtLT0JuBPsa5IpBw+fDjoWJs2bUhPT+eOO+6IyCbrkydP5vXXX69wk/X77ruPRx55hGbNmjmKFWrywuv10q1bN0exAAoKCsjMzKSwsNC2PCUlhUmTJjFkyBDHsURERERERERERM42SpiI1H6p1KGEidWdd95JVlYWTZs2dXSd4uJi5s2bx9y5czl+/LjtOTfffDNZWVlceOGFjmKBSV54PB6+/fZb2/ILLriA9PT0iCQvNm3aRFZWFu+8845teaNGjRg9ejRjx46lXr16juOJiIiIiIiIiIicjZQwEan9fhIIBFwulyt4ukQdMGTIEMfJkjfeeIPJkyezbds22/IuXbqQnZ0dkU3WN27cSFZWFsuWLbMtb9y4MQ888EBEkhcHDx4kNzeXvLw8SktLg8pdLhe33norGRkZtG3b1lGs0tJSXn31VVauXMmAAQMYPny4o+uJiIiIiIiIiIjEGyVMRGq/9rt3774cWBfritQ269evx+PxsHr1atvyZs2aMXbsWO6//36Sk5MdxSpLXixcuNB2k/WEhASGDh2K2+2mTZs2jmKVlpayaNEipk2bxr59+2zPueqqq/B6vfTu3dtRLIDly5eTmZn5771lXn/9dRo2bMh//Md/OL62iIiIiIiIiIhIvFDCRCQOBAKBQShh8m8HDhxg5syZVSYvPB4PrVu3dhSrLHmRk5PD/v37bc/p1asXXq+XXr16OYoFsGLFCjIzM9mwYYNtefv27Zk0aRLDhg3D5XI5ilVYWEh2djZvvvlmUNkHH3yghImIiIiIiIiIiJxVlDARiQOBQCAVyI11PWKtbJP1GTNm2G4eD3Ddddfh9Xq59NJLHcezzryw6tChA+np6RFLXkydOpUlS5bYljds2JD77ruP8ePH07hxY0exjh8/zrx585gzZw4nTpywPcfv9zuKISIiIiIiIiIiEm+UMBGJDz/eunVrw86dOxfFuiKxsnz5cjweD1999ZVteceOHUlLS+O2225zHGvLli3k5ORUmrx48MEHeeihh2jQoIGjWGXJi9mzZ3Py5Enbc1JTU5k8eTKdO3d2FMvv9/Paa68xdepU9uzZ4+haIiIiIiIiIiIidY0SJiLxoUFCQkI/oCDWFalp33zzDVlZWbz11lu25WXJizFjxlC/fn1HsY4dO8Zzzz1XYfLC5XIxePBg3G43nTp1chTL7/eTn5/PlClTKkxe9OjRA6/XyzXXXOMoFsDHH3+M2+3ms88+c3wtERERERERERGRukgJE5H4kcpZlDA5fPgws2fPZv78+ZSUlASVlyUvPB4P5557rqNYZcmLyZMns3fvXttzrrjiCrxeL3369HEUC+CTTz7B4/GwZs0a2/JzzjmHRx55hHvvvZfExERHsXbt2sUTTzxBfn4+gUAgqDw5OZkRI0Zw+PBhXnvtNUexRERERERERERE4pkSJiJxwuVyDQImxroe0VaWvPD5fHz//fe251x55ZX4fD6uvvpqx/HWrl2Lx+Nh7dq1tuXt2rVjwoQJ3HXXXSQkJDiKFWry4rHHHqNZs2aOYhUXF7NgwQJmzZrF0aNHbc/p378/Pp+Piy++GLfb7SieiIiIiIiIiIhIvFPCRCR+XLF3794Obdq02RnrikTLypUryczM5IsvvrAtj2TyYufOnUydOrXK5MXEiRNp2rSpo1hFRUW8+OKLPP300xw7dsz2nP79+zN58mS6du3qKBZAQUEBbreb7777zrb8wgsvJCsri5tvvtlxLBERERERERERkbpCCROR+OEqKSm5GXgp1hWJtB07dpCTk8PixYtty8uSF2lpaTRp0sRRrKKiIp599lnmzp1LcXGx7TmpqalkZ2eTkpLiKBaY5EVGRgZbt261Lb/ooovIysripptuchxr/fr1eDweVq9ebVvevHlzxowZw/33309ycrLjeCIiIiIiIiIiInWJEiYi8SWVOpYweeGFF1i5ciUnTpywLS/bZL1z586O4gQCAZYuXYrP52Pbtm2253Tp0oWsrCxuvPFGR7EA1q1bh8fj4YMPPrAtj2Ty4sCBA8ycOZOFCxdy6tSpoPKEhASGDh2Kx+OhdevWjmKJiIiIiIiIiIjUVUqYiMSXQYFAwOVyuYLXkIpT77zzju3xrl27kp2dzQ033OA4xueff47H4+HDDz+0LW/RogWPPvooI0eOJCnJWbO4f/9+nnrqqQqTF0lJSQwfPpy0tDRatWrlKFZJSQl5eXnMmDGDw4cP255z/fXX4/V66d69u6NYIiIiIiIiIiIidZ0SJiLxpd327duvAD6LdUWipVWrVqSlpXHnnXeSmJjo6Fq7d+8mNzeXV155Bb/fH1RelrxIT0+nZcuWjmKVJS+mT5/OkSNHbM/p168f2dnZEUleLF++HLfbzddff21b3rFjR9LS0rjtttscxxIRERERERERETkbKGEiEmcSExMHUQcTJmX7lDz22GM0a9bM0bVikbzIyMhg48aNtuUpKSlMmjSJIUOGOI61efNmsrOzeeutt2zLGzVqxOjRoxkzZgz169d3HE9ERERERERERORsoYSJSJwJBAKpwPRY16O67DZtv+mmm8jKyuKiiy5yfP2CggIyMzMpLCy0LY908iIrK4u3337btjySyYtDhw4xZ84c5s+fT0lJSVC5y+Vi8ODBeDwezj33XEexREREREREREREzkZKmIjEn/47duxo1LFjx+Oxrkh1PPDAA/z+97/H7/dHdJP1TZs2kZmZybJly2zLy5IXY8eOpV69eo5iHTp0iBkzZpCXl0dpaWlQucvl4tZbbyUjI4O2bds6iuX3+8nPz8fn8/H999/bntOzZ0+8Xi9XX321o1giIiIiIiIiIiJnMyVMROJPA6A/8GasK1Idw4cP55prruH777+nZ8+eJCcnO7rewYMHyc3NrTB5kZCQwNChQ3G73bRp08ZRrNLSUhYtWsS0adPYt2+f7Tk9e/bE5/PRu3dvR7EAVqxYQWZmJhs2bLAtb9++PRkZGdxyyy24XC5HsQKBgKP3i4iIiIiIiIiIxDslTETiUypxmjABuOCCC7jgggscXaMseZGTk8P+/fttz7nqqqvwer01lryYNGkSw4YNc5y82LFjBzk5OSxevNi2vGy/l7S0NNslzsJRVFTEs88+y5/+9CdH1xEREREREREREYl3SpiIxKefAL+PdSViparkRYcOHUhPT49I8qKwsJCpU6eyZMkS2/IGDRowatQoxo8fT+PGjR3FOnr0KM888wzz58/n5MmTtucMGTKEjIwMOnfu7ChWIBAgPz+fKVOmsHv37qDypk2bOrq+iIiIiIiIiIhIvFHCRCQ+Xb5t27ZOnTp12hbritSkqpIXDRs25L777otI8uL48ePMmzePOXPmcOLECdtzUlNTmTx5suPkhd/vZ/HixUydOtU2eQFw2WWX4fV66du3r6NYAGvXrsXj8bB27Vrb8nbt2vHrX//acRwREREREREREZF4ooSJSJxKTEy8GVgY63rUhLLkxezZsyuceRGp5EUgEGDx4sVMmTKFPXv22J5z+eWX4/P5uOaaaxzFAlizZg1ut5tPP/3Utrx169ZMnDiRO++8k8TEREexdu/ezZQpU8jPz7fdsyQ5OZmRI0cyYcIEmjVr5iiWiIiIiIiIiIhIvFHCRCROBQKBVOp4wsTv95Ofn8/kyZPZu3ev7Tk9evTA5/PRp08fx/E++eQTPB4Pa9assS0/55xzeOSRR7j33nsjkrzIzc3llVdewe/3B5WX7VPy2GOPOU5elJSUkJeXx/Tp0zly5IjtOf379yc7O5tu3bo5iiUiIiIiIiIiIhKvlDARiV+DAoFAgsvlCu5trwOqSl60bNmS8ePHRyR5sWvXLp544olKZ15EKnlRXFzMggULmDVrFkePHrU9p3///ni9Xi655BJHsQAKCgrweDx8++23tuUXXHAB6enpDBkyxHEsERERERERERGReKaEiUj8ar1z586egP1GFHFq586dTJ06tcrkxcSJEx1vTF6WvHj66ac5duyY7Tn9+/fH5/Nx8cUXO4oFJnnhdrv57rvvbMsvvPBCMjMzSU1NdRxr48aNZGZm8u6779qWN27cmAceeICxY8dSr149x/FERERERERERETinRImIvFtEHUkYVJUVMSLL75YafIiNTWV7OxsUlJSHMcrKCggIyODrVu32pZfdNFFZGVlcdNNNzmOtX79ejweD6tXr7Ytb9asGWPHjuX+++8nOTnZUayDBw+Sm5vLwoULOXXqVFB5QkICQ4cOxe1206ZNG0exRERERERERERE6hIlTETi2Ol9THJiXQ+nqkpedOnShaysLG688UbHsdatW4fH4+GDDz6wLW/evDljxoyJSPLiwIEDzJw5s8rkhcfjoXXr1o5ilZSU8Oqrr5KTk8P+/fttz+nbty9er5fLLrvMUSwREREREREREZG6SAkTkTjmcrn67dmzp0nbtm3tN8Oo5datW4fb7ebDDz+0LW/evDkTJkxg5MiRJCU5a65qOnmRl5fHjBkzOHz4sO051113HV6vl0svvdRRLIDly5eTmZnJl19+aVveoUMH0tPTGTZsGC6Xy3E8ERERERERERGRukgJE5H4Vu/UqVMDgL/HuiLh2L9/P0899VSFyYukpCSGDx9OWloarVq1chQrlOTF9ddfj9frpXv37o5igUleeDwevvrqK9vyjh07kpaWxm233eY41pYtW8jJyWHJkiW25Q0bNuTBBx/koYceokGDBo7jiYiIiIiIiIiI1GVKmIjEudPLcsVNwmT+/PnMmDGDo0ftJ8UMGDCA7OxsLrnkEsexCgoKyMrKYsuWLbblKSkpeDwefvrTnzqO9c0335CdnU1BQYFteVnyYsyYMdSvX99RrMOHDzN79myef/55Tp48GVTucrkYPHgwbrebTp06OYolIiIiIiIiIiJytlDCRCT+DYp1BcIxf/5822RJSkoKWVlZDBrk/Nv5+uuvyczM5L333rMtb9KkCQ8//DD3338/9erVcxSrLHkxf/58SkpKgsrLkhcej4dzzz3XUSy/309+fj6TJ09m7969tudcccUVeL1e+vTp4yiWiIiIiIiIiIjI2UYJE5H4d+n27ds7n3vuufY7ptdyjRo1YvTo0YwdO9Zx8uLQoUPMmTOnyuRFZmYmHTt2dBSrLHnh8/n4/vvvbc+58sor8fl8XH311Y5iAbz//vt4PB7+9a9/2Za3a9eOCRMmcNddd5GQkOA4noiIiIiIiIiIyNlGCRORuiEVeDHWlaiOefPmkZqa6ugapaWlvPTSS8yYMYMDBw7YnnP11Vfj9Xrp2bOno1gAq1atwuPx8MUXX9iWRzJ5sXPnTqZOnUp+fj6BQCCoPDk5mREjRjBx4kSaNm3qKJaIiIiIiIiIiMjZTAkTkTogISEhbhMmycnJjt6/cuVKPB4PGzZssC1v164d//Vf/8WwYcNwuVyOYu3YsYOcnBwWL15sW16WvEhLS6NJkyaOYhUVFfHss88yd+5ciouLbc9JTU3F6/Vy/vnnO4olIiIiIiIiIiIiSpiI1AmBQCA1EAgkuFwuf6zrUlO2b9/OtGnTKkxeNGjQgFGjRjFu3LiIJS/mzJnDiRMnbM+JVPIiEAiwdOlSfD4f27Ztsz2nS5cuZGdnM3DgQEexRERERERERERE5AdKmIjUDa127tzZC/g41hWJtuPHjzNv3rwqkxc+n4/zzjvPUayy5IXX62X79u2253Tt2pXs7GxuuOEGR7EAPv/8c9xuNx999JFteYsWLXj00UcZOXIkSUlqvkVERERERERERCJJPW4idccg6nDCJBAIsHjxYqZMmcKePXtsz7n88svxer1ce+21juN99tlnuN1uPv7Y/kdalry49957SUxMdBRr9+7d5Obm8sorr+D3B08SSkpKYvjw4aSnp9OyZUtHsURERERERERERMSeEiYidUcq8ESsKxENn376KW63mzVr1tiWn3POOTzyyCM1krxITk7mjjvuiEjyoqSkhLy8PKZPn86RI0dsz+nXrx9er5du3bo5iiUiIiIiIiIiIiKVU8JEpO64bs+ePU3atm17NNYViZRdu3bxxBNPkJ+fTyAQCCov22T9scceo1mzZo5ilSUvnnzySY4etf8R9u/fH6/XyyWXXOIoFkBBQQEej4dvv/3WtvyCCy4gPT2dIUOGOI4lIiIiIiIiIiIiVVPCRKTuqOf3+28Alsa6Ik4VFxezYMECZs2aVeeSF5s2bSIzM5Nly5bZljdu3JgHHniAsWPHUq9ePcfxREREREREREREJDRKmIjUIX6/P5U4T5gUFBTgdrv57rvvbMsvvPBCsrKyuPnmmx3H2rhxI5mZmbz77ru25c2aNWPs2LH89re/dZy8OHjwILm5ueTl5VFaWhpUnpCQwNChQ3G73bRp08ZRLBEREREREREREQmfEiYidcugWFegutavX4/H42H16tW25WXJi/vvv5/k5GRHscqSFwsXLuTUqVNB5ZFMXpSWlrJo0SJycnLYv3+/7Tm9evUiOzub3r17O4pVUzZv3kxWVhYnT56MdVVEREREREREREQiRgkTkbql286dO1M6dOhQGOuKhOrAgQO43e4qkxcej4fWrVs7ilVSUsKrr75aafKib9++eL1eLrvsMkexAFasWIHH4+HLL7+0Le/QoQPp6ekMGzYMl8vlOF60HTx4kOnTp/PSSy/ZzpIpJ3jDGRERERERERERkVpOCROROiYQCNwMvBDreoRq7Nix+P1+27J+/fqRnZ1N9+7dHcdZvnw5Ho+Hr776yrY8ksmLLVu2kJOTw5IlS2zLGzZsyH333cf48eNp3Lixo1g1obS0lJdeeonp06dz8ODBUN6yNdp1EhERERERERERiTQlTETqnkHEUcLELlly/vnn43a7+fnPf+74+lu2bCErK4uCggLb8oYNG/Lggw/y0EMP0aBBA0exjh07xnPPPcfs2bMrXK4qNTWVKVOm0KlTJ0exakpViSYb/wtsiGKVREREREREREREokIJE5G65+ZAIJDocrmC17eq5Ro1asTo0aMZM2YM9evXd3Stw4cPM3v2bJ5//nnb5IXL5WLw4MG43W7HyQu/309+fj6TJ09m7969tuf06NEDn89Hnz59HMWqKYWFhWRnZ/Pmm2+G+pZTmETdhOjVSkREREREREREJHqUMBGpe87ZvXv31cAHsa6IHbvlrlwuF7fddhuTJk2iXbt2jq4fSvLiiiuuwOfz8aMf/chRLIC1a9fi8XhYu3atbXm7du2YMGECd955J4mJiY7jRdvx48eZN28ec+bM4cSJE6G+7T1gPPBp9GomIiIiIiIiIiISXUqYiNRBgUBgELU0YXL55Zezffv2f7/u3bs3Xq+Xq666yvG133//fTweD//6179sy8uSF3fddRcJCQmOYu3cuZOpU6eSn59PIBC8x3lycjIjRoxg4sSJNG3a1FGsmhAIBFi8eDFTpkxhz549ob5tG/A48BLa6F1EREREREREROKcEiYidVAgEEgFfLGuh50nn3ySZs2asWPHDu68805uueUWx5us12Tyoqio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" width="450">
|
||
</img></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=044aaeec">
|
||
<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="Execution-model">Execution model<a class="anchor-link" href="#Execution-model">¶</a></h3><ul>
|
||
<li>MPI programs are typically run with a Single Program Multiple Data (SPMD) model, which is a particular case of the SIMD model.</li>
|
||
<li>But the standard supports Multiple Program Multiple Data (MPMD), which is a particular case of the MIMD model.</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=5f76fb65">
|
||
<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="Hello-world-example">Hello world example<a class="anchor-link" href="#Hello-world-example">¶</a></h3><p>Julia code typically needs to be in a file to run it in with MPI. Let's us write our hello world in a file. The next cell will create a file, and write some code in it.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=e03f35c5">
|
||
<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-julia"><pre><span></span><span class="n">code</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="sa">raw</span><span class="s">"""</span>
|
||
<span class="s">using MPI</span>
|
||
<span class="s">MPI.Init()</span>
|
||
<span class="s">comm = MPI.COMM_WORLD</span>
|
||
<span class="s">nranks = MPI.Comm_size(comm)</span>
|
||
<span class="s">rank = MPI.Comm_rank(comm)</span>
|
||
<span class="s">println("Hello, I am process $rank of $nranks processes!")</span>
|
||
<span class="s">MPI.Finalize()</span>
|
||
<span class="s">"""</span>
|
||
<span class="n">filename</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">tempname</span><span class="p">()</span><span class="o">*</span><span class="s">".jl"</span>
|
||
<span class="n">write</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span><span class="n">code</span><span class="p">)</span>
|
||
<span class="n">filename</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=f13946dd">
|
||
<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 can run it</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=dbe654dc">
|
||
<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-julia"><pre><span></span><span class="k">using</span><span class="w"> </span><span class="n">MPI</span>
|
||
<span class="n">run</span><span class="p">(</span><span class="sb">`</span><span class="si">$</span><span class="p">(</span><span class="n">mpiexec</span><span class="p">())</span><span class="sb"> -np 4 julia --project=. </span><span class="si">$filename</span><span class="sb">`</span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=651f26ae">
|
||
<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 class="alert alert-block alert-info">
|
||
<b>Note:</b> Function `mpiexec` provided by `MPI.jl` is a convenient way of accessing the `mpiexec` program that matches the MPI installation used by Julia.
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=a958c015">
|
||
<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="Another-way-to-launch-MPI-code">Another way to launch MPI code<a class="anchor-link" href="#Another-way-to-launch-MPI-code">¶</a></h3><p>In the hello world example above we have created an auxiliary file to run the code with MPI. This can be annoying specially if you are working in a jupyter notebook. With this other syntax you can skip creating the auxiliary file. We use <code>quote</code> which is part of the <a href="https://docs.julialang.org/en/v1/manual/metaprogramming/">meta-programming capabilities of Julia</a>.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=359e569b">
|
||
<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-julia"><pre><span></span><span class="n">code</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">quote</span>
|
||
<span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">MPI</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Init</span><span class="p">()</span>
|
||
<span class="w"> </span><span class="n">comm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">COMM_WORLD</span>
|
||
<span class="w"> </span><span class="n">nranks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Comm_size</span><span class="p">(</span><span class="n">comm</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Comm_rank</span><span class="p">(</span><span class="n">comm</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">println</span><span class="p">(</span><span class="s">"Hello, I am process </span><span class="si">$rank</span><span class="s"> of </span><span class="si">$nranks</span><span class="s"> processes!"</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Finalize</span><span class="p">()</span>
|
||
<span class="k">end</span>
|
||
<span class="n">run</span><span class="p">(</span><span class="sb">`</span><span class="si">$</span><span class="p">(</span><span class="n">mpiexec</span><span class="p">())</span><span class="sb"> -np 4 julia --project=. -e </span><span class="si">$code</span><span class="sb">`</span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=5ec1c52a">
|
||
<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-availability">Data availability<a class="anchor-link" href="#Data-availability">¶</a></h2>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=c8a5e099">
|
||
<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 mpiexec creates new processes which are different from the process running this notebook. In particular, these new processes will not see any variables or function definitions in the current notebook. So, the full MPI program needs to be in the source file passed to Julia or the quote block.</p>
|
||
<p>The following cell will fail. Note that the same error message is displayed by all ranks, which makes difficult to read them.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=16bb608a">
|
||
<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-julia"><pre><span></span><span class="n">foo</span><span class="p">()</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">print</span><span class="p">(</span><span class="s">"Hi there!"</span><span class="p">)</span>
|
||
<span class="n">code</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">quote</span>
|
||
<span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">MPI</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Init</span><span class="p">()</span>
|
||
<span class="w"> </span><span class="n">foo</span><span class="p">()</span>
|
||
<span class="k">end</span>
|
||
<span class="n">run</span><span class="p">(</span><span class="sb">`</span><span class="si">$</span><span class="p">(</span><span class="n">mpiexec</span><span class="p">())</span><span class="sb"> -np 3 julia --project=. -e </span><span class="si">$code</span><span class="sb">`</span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=4b455f98">
|
||
<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>So, the full MPI program needs to be in the source file passed to Julia or the quote block. In practice, long MPI programms are written as Julia packages using several files, which are then loaded by each MPI process. For our simple example, we just need to include the definition of <code>foo</code> inside the quote block.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=b816659a">
|
||
<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-julia"><pre><span></span><span class="n">code</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">quote</span>
|
||
<span class="w"> </span><span class="n">foo</span><span class="p">()</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">print</span><span class="p">(</span><span class="s">"Hi there!"</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">MPI</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Init</span><span class="p">()</span>
|
||
<span class="w"> </span><span class="n">foo</span><span class="p">()</span>
|
||
<span class="k">end</span>
|
||
<span class="n">run</span><span class="p">(</span><span class="sb">`</span><span class="si">$</span><span class="p">(</span><span class="n">mpiexec</span><span class="p">())</span><span class="sb"> -np 3 julia --project=. -e </span><span class="si">$code</span><span class="sb">`</span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=a37daef2">
|
||
<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="Point-to-point-communication">Point-to-point communication<a class="anchor-link" href="#Point-to-point-communication">¶</a></h2><p>Now we are up and running, and ready to start learning MPI communication primitives. In this notebook we will cover so-called point-to-point communication directives. In a later notebook we will also learn about collective primitives.</p>
|
||
<p>MPI provides point-to-point communication directives for arbitrary communication between processes. Point-to-point communications are two-sided: there is a sender and a receiver. Here, we will discuss different types of directives:</p>
|
||
<ul>
|
||
<li><code>MPI_Send</code>, and <code>MPI_Recv</code> (<em>blocking directives</em>)</li>
|
||
<li><code>MPI_Isend</code>, and <code>MPI_Irecv</code> (<em>non-blocking directives</em>)</li>
|
||
<li><code>MPI_Bsend</code>, <code>MPI_Ssend</code>, and <code>MPI_Rsend</code> (<em>advanced communication modes</em>)</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=0e515109">
|
||
<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 all cases, these functions are used to send a message from a ranks and receive it in another rank. See next picture.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=14674ca9">
|
||
<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>
|
||
<img align="left" alt="No description has been provided for this image" src="data:image/png;base64,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TUQKxReADdgI+tvAoFhbIyIiQd2EZVnfBbyDpq2LiBS6kdh09V3Y8tLJ8TZHRERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERETCqoi7AZJTpwDHud5vAdbF1BYRESk8FwCdXO/fB7bH1BYREcm+w4FzPdteBQ7E0BaRsjUHSLheP4u3OZGdAFwCjAfGYTeSPWNtkYhIadhM8vfE+HibIyIiWXYOyXE+AfSItUXhdAL6AVcAk7DvqWrgjDgblQud/HcRiUVP4KvATbT/h7caeAB74LAnT+0SEZHC0BV7UHsx9vD2055/XwrMynObREQkM52BIcAYrDPeHzisnX23AM8B9wNPAG35aKBIFMU6Yj4J+JDUp3vtvdYAg2JpqYhIcSuWEfNKYADwZewG7FWglY6/G/4nlpaKiBSWYhkxvxiYTbg+gPv1J2Bg3lstElAxdszrsKddYf8Y9wJXx9BeEZFiViwd808R/ntBHXMRkeLpmL9GtA65+7Uf60sUJU1ll0JyLfAjUpMSNgBzsZHxKuBs4GbgRNc+hwG/xp6Urc55S0VEREREJNf2AiuxBNYfYjOoTsLWmR/v2bcK60vspjgGJKWMFNOIeQ9gK8ntbQNmYH+AXl2Ae0l9UvZaO/uLiEiqYh8x3wO8CNwH7PT8m0bMRUSKc8R8G/AfwFDaX19eBXwOaCL18+3CqlOJFIxi6pjPIvWP6usBjvv3NMfdlKM2ioiUmmLqmO8D3gR+gU1VHELyDZv35kwdcxGR4uqY/xn4ElbiLajjgbdI/Yz/ne0GimSiWDrmvYCPSW7rcwQb+T4Sm+LuPvZ97CmaiIh0rFg65pVYpt6OqGMuIpKqWDrmY/GP8+05E/gLyZ9xGzbDtmhoyq8Ugr/COthu3ydYyYNd2JR2t9Ow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" width="350"/>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=ead20fc0">
|
||
<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="Blocking-send-and-receive">Blocking send and receive<a class="anchor-link" href="#Blocking-send-and-receive">¶</a></h2><p>Let's start with the "standard" blocking send and receive.</p>
|
||
<p>In Julia:</p>
|
||
<div class="highlight"><pre><span></span><span class="n">MPI</span><span class="o">.</span><span class="n">Send</span><span class="p">(</span><span class="n">sndbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">;</span><span class="w"> </span><span class="n">dest</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="p">)</span>
|
||
<span class="n">_</span><span class="p">,</span><span class="w"> </span><span class="n">status</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Recv!</span><span class="p">(</span><span class="n">rcvbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">,</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Status</span><span class="p">;</span><span class="w"> </span><span class="n">source</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="p">)</span>
|
||
</pre></div>
|
||
<p>In C:</p>
|
||
<div class="highlight"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="n">MPI_Send</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">sndbuf</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">count</span><span class="p">,</span><span class="w"> </span><span class="n">MPI_Datatype</span><span class="w"> </span><span class="n">datatype</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">dest</span><span class="p">,</span>
|
||
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">tag</span><span class="p">,</span><span class="w"> </span><span class="n">MPI_Comm</span><span class="w"> </span><span class="n">comm</span><span class="p">)</span>
|
||
<span class="kt">int</span><span class="w"> </span><span class="n">MPI_Recv</span><span class="p">(</span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">rcvbuf</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">count</span><span class="p">,</span><span class="w"> </span><span class="n">MPI_Datatype</span><span class="w"> </span><span class="n">datatype</span><span class="p">,</span>
|
||
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">source</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">tag</span><span class="p">,</span><span class="w"> </span><span class="n">MPI_Comm</span><span class="w"> </span><span class="n">comm</span><span class="p">,</span><span class="w"> </span><span class="n">MPI_Status</span><span class="w"> </span><span class="o">*</span><span class="n">status</span><span class="p">)</span>
|
||
</pre></div>
|
||
<p>The key arguments are:</p>
|
||
<ul>
|
||
<li><code>sndbuf</code> data to send.</li>
|
||
<li><code>rcvbuf</code> space to store the incoming data.</li>
|
||
<li><code>source</code> rank of the sender.</li>
|
||
<li><code>dest</code> rank of the receiver.</li>
|
||
<li><code>tag</code>. Might be used to distinguish between different kinds of messages from the same sender to the same receiver (similar to the "subject" in an email).</li>
|
||
</ul>
|
||
<div class="alert alert-block alert-info">
|
||
<b>Note:</b> Note that the C interface provides additional arguments `MPI_Datatype` (type of data to send/receive) and `count` (number of items to send/receive). In Julia, send and receive buffers are usually arrays or references, from which the data type and the count can be inferred. This is true for many other MPI functions.
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=be4fae1c">
|
||
<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="Example">Example<a class="anchor-link" href="#Example">¶</a></h3>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=c2301992">
|
||
<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>Send 5 integers from rank 2 to rank 3. Note that the same code will be executed in all ranks by <code>mpiexec</code>. This is why we need to use if statements to select specific ranks.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=61fe5db3">
|
||
<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-julia"><pre><span></span><span class="n">code</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">quote</span>
|
||
<span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">MPI</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Init</span><span class="p">()</span>
|
||
<span class="w"> </span><span class="n">comm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">COMM_WORLD</span>
|
||
<span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Comm_rank</span><span class="p">(</span><span class="n">comm</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">2</span>
|
||
<span class="w"> </span><span class="n">sndbuf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">8</span><span class="p">]</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Send</span><span class="p">(</span><span class="n">sndbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">;</span><span class="w"> </span><span class="n">dest</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">3</span>
|
||
<span class="w"> </span><span class="n">rcvbuf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">zeros</span><span class="p">(</span><span class="kt">Int</span><span class="p">,</span><span class="mi">5</span><span class="p">)</span><span class="w"> </span><span class="c"># Allocate space for the incoming message</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Recv!</span><span class="p">(</span><span class="n">rcvbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">,</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Status</span><span class="p">;</span><span class="w"> </span><span class="n">source</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="nd">@show</span><span class="w"> </span><span class="n">rcvbuf</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="k">end</span>
|
||
<span class="n">run</span><span class="p">(</span><span class="sb">`</span><span class="si">$</span><span class="p">(</span><span class="n">mpiexec</span><span class="p">())</span><span class="sb"> -np 4 julia --project=. -e </span><span class="si">$code</span><span class="sb">`</span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=ee680aa5">
|
||
<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="Any-source,-any-tag">Any source, any tag<a class="anchor-link" href="#Any-source,-any-tag">¶</a></h2><p>We can use</p>
|
||
<ul>
|
||
<li><code>source = MPI.ANY_SOURCE</code></li>
|
||
<li><code>tag = MPI.ANY_TAG</code></li>
|
||
</ul>
|
||
<p>If we want to receive messages from any source and/or with any tag.</p>
|
||
<div class="alert alert-block alert-info">
|
||
<b>Note:</b> These can only be used by the receiver, not the sender. Moreover there is no option to send to any destination.
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=1f0cb6c8">
|
||
<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="Example">Example<a class="anchor-link" href="#Example">¶</a></h3>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=2add5065">
|
||
<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>Send 5 integers from rank 2 to rank 3. Since there is only one sender and only one message from this sender, we can receive from any source and with any tag.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=ccdf660a">
|
||
<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-julia"><pre><span></span><span class="n">code</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">quote</span>
|
||
<span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">MPI</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Init</span><span class="p">()</span>
|
||
<span class="w"> </span><span class="n">comm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">COMM_WORLD</span>
|
||
<span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Comm_rank</span><span class="p">(</span><span class="n">comm</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">2</span>
|
||
<span class="w"> </span><span class="n">sndbuf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">8</span><span class="p">]</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Send</span><span class="p">(</span><span class="n">sndbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">;</span><span class="w"> </span><span class="n">dest</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">3</span>
|
||
<span class="w"> </span><span class="n">rcvbuf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">zeros</span><span class="p">(</span><span class="kt">Int</span><span class="p">,</span><span class="mi">5</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">source</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">ANY_SOURCE</span>
|
||
<span class="w"> </span><span class="n">tag</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">ANY_TAG</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Recv!</span><span class="p">(</span><span class="n">rcvbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">,</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Status</span><span class="p">;</span><span class="w"> </span><span class="n">source</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="nd">@show</span><span class="w"> </span><span class="n">rcvbuf</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="k">end</span>
|
||
<span class="n">run</span><span class="p">(</span><span class="sb">`</span><span class="si">$</span><span class="p">(</span><span class="n">mpiexec</span><span class="p">())</span><span class="sb"> -np 4 julia --project=. -e </span><span class="si">$code</span><span class="sb">`</span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=7833da72">
|
||
<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="MPI_Status">MPI_Status<a class="anchor-link" href="#MPI_Status">¶</a></h2><p>When using <code>MPI.ANY_SOURCE</code> and <code>MPI.ANY_TAG</code> it might be still useful to know which was the sender and which tag was used. This information is given by a <code>MPI.Status</code> object.</p>
|
||
<div class="highlight"><pre><span></span><span class="n">_</span><span class="p">,</span><span class="w"> </span><span class="n">status</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Recv!</span><span class="p">(</span><span class="n">rcvbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">,</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Status</span><span class="p">;</span><span class="w"> </span><span class="n">source</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="p">)</span>
|
||
<span class="n">status</span><span class="o">.</span><span class="n">source</span><span class="w"> </span><span class="c"># Gives the source</span>
|
||
<span class="n">status</span><span class="o">.</span><span class="n">tag</span><span class="w"> </span><span class="c"># Gives the tag</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=4618ad58">
|
||
<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="Example">Example<a class="anchor-link" href="#Example">¶</a></h3>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=2f037032">
|
||
<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-julia"><pre><span></span><span class="n">code</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">quote</span>
|
||
<span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">MPI</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Init</span><span class="p">()</span>
|
||
<span class="w"> </span><span class="n">comm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">COMM_WORLD</span>
|
||
<span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Comm_rank</span><span class="p">(</span><span class="n">comm</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">2</span>
|
||
<span class="w"> </span><span class="n">sndbuf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">8</span><span class="p">]</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Send</span><span class="p">(</span><span class="n">sndbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">;</span><span class="w"> </span><span class="n">dest</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">3</span>
|
||
<span class="w"> </span><span class="n">rcvbuf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">zeros</span><span class="p">(</span><span class="kt">Int</span><span class="p">,</span><span class="mi">5</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">source</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">ANY_SOURCE</span>
|
||
<span class="w"> </span><span class="n">tag</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">ANY_TAG</span>
|
||
<span class="w"> </span><span class="n">_</span><span class="p">,</span><span class="w"> </span><span class="n">status</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Recv!</span><span class="p">(</span><span class="n">rcvbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">,</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Status</span><span class="p">;</span><span class="w"> </span><span class="n">source</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="nd">@show</span><span class="w"> </span><span class="n">rcvbuf</span>
|
||
<span class="w"> </span><span class="nd">@show</span><span class="w"> </span><span class="n">status</span><span class="o">.</span><span class="n">source</span>
|
||
<span class="w"> </span><span class="nd">@show</span><span class="w"> </span><span class="n">status</span><span class="o">.</span><span class="n">tag</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="k">end</span>
|
||
<span class="n">run</span><span class="p">(</span><span class="sb">`</span><span class="si">$</span><span class="p">(</span><span class="n">mpiexec</span><span class="p">())</span><span class="sb"> -np 4 julia --project=. -e </span><span class="si">$code</span><span class="sb">`</span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=590bc407">
|
||
<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="MPI_Probe">MPI_Probe<a class="anchor-link" href="#MPI_Probe">¶</a></h2><p>Note that we need to provide a receive buffer with the right size, but it general we do not know which is the size of the incoming message. This can be solved using an <code>MPI_Probe</code>. It works similar to <code>MPI_Recv</code>, but instead of receiving the message only receives information about the message (source, tag, and also message size). Like for <code>MPI_Recv</code>, <code>MPI_Probe</code> will wait (block) until a matching send is posted. More information about the blocking behavior will be given below.</p>
|
||
<p><code>MPI_Probe</code> provides an <code>MPI_Status</code> object. We can get the message size from the status object using function <code>MPI_Get_count</code>. We can also get the source and tag from the status object as shown before.</p>
|
||
<p>In Julia:</p>
|
||
<div class="highlight"><pre><span></span><span class="n">status</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Probe</span><span class="p">(</span><span class="n">comm</span><span class="p">,</span><span class="n">MPI</span><span class="o">.</span><span class="n">Status</span><span class="p">;</span><span class="w"> </span><span class="n">source</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="p">)</span>
|
||
<span class="n">count</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Get_count</span><span class="p">(</span><span class="n">status</span><span class="p">,</span><span class="w"> </span><span class="n">T</span><span class="p">)</span>
|
||
</pre></div>
|
||
<p>In C:</p>
|
||
<div class="highlight"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="n">MPI_Probe</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">source</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">tag</span><span class="p">,</span><span class="w"> </span><span class="n">MPI_Comm</span><span class="w"> </span><span class="n">comm</span><span class="p">,</span><span class="w"> </span><span class="n">MPI_Status</span><span class="w"> </span><span class="o">*</span><span class="n">status</span><span class="p">)</span>
|
||
<span class="kt">int</span><span class="w"> </span><span class="n">MPI_Get_count</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">MPI_Status</span><span class="w"> </span><span class="o">*</span><span class="n">status</span><span class="p">,</span><span class="w"> </span><span class="n">MPI_Datatype</span><span class="w"> </span><span class="n">datatype</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="o">*</span><span class="n">count</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=517d052e">
|
||
<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="Example">Example<a class="anchor-link" href="#Example">¶</a></h3>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=1b54af36">
|
||
<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-julia"><pre><span></span><span class="n">code</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">quote</span>
|
||
<span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">MPI</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Init</span><span class="p">()</span>
|
||
<span class="w"> </span><span class="n">comm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">COMM_WORLD</span>
|
||
<span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Comm_rank</span><span class="p">(</span><span class="n">comm</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">2</span>
|
||
<span class="w"> </span><span class="n">sndbuf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">8</span><span class="p">]</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Send</span><span class="p">(</span><span class="n">sndbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">;</span><span class="w"> </span><span class="n">dest</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">3</span>
|
||
<span class="w"> </span><span class="n">source</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">ANY_SOURCE</span>
|
||
<span class="w"> </span><span class="n">tag</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">ANY_TAG</span>
|
||
<span class="w"> </span><span class="n">status</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Probe</span><span class="p">(</span><span class="n">comm</span><span class="p">,</span><span class="n">MPI</span><span class="o">.</span><span class="n">Status</span><span class="p">;</span><span class="w"> </span><span class="n">source</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">count</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Get_count</span><span class="p">(</span><span class="n">status</span><span class="p">,</span><span class="kt">Int</span><span class="p">)</span><span class="w"> </span><span class="c"># Get incomming message length</span>
|
||
<span class="w"> </span><span class="n">println</span><span class="p">(</span><span class="s">"I am about to receive </span><span class="si">$count</span><span class="s"> integers."</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">rcvbuf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">zeros</span><span class="p">(</span><span class="kt">Int</span><span class="p">,</span><span class="n">count</span><span class="p">)</span><span class="w"> </span><span class="c"># Allocate </span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Recv!</span><span class="p">(</span><span class="n">rcvbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">,</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Status</span><span class="p">;</span><span class="w"> </span><span class="n">source</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="nd">@show</span><span class="w"> </span><span class="n">rcvbuf</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="k">end</span>
|
||
<span class="n">run</span><span class="p">(</span><span class="sb">`</span><span class="si">$</span><span class="p">(</span><span class="n">mpiexec</span><span class="p">())</span><span class="sb"> -np 4 julia --project=. -e </span><span class="si">$code</span><span class="sb">`</span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=d0add95c">
|
||
<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="Complete-operations">Complete operations<a class="anchor-link" href="#Complete-operations">¶</a></h2><p>Functions <code>MPI_Send</code>, <code>MPI_Recv</code>, and <code>MPI_Probe</code> are <em>complete</em> operations, meaning that their argument can be used once the function returns.</p>
|
||
<p>In particular:</p>
|
||
<ul>
|
||
<li>It is safe to re-write the send buffer with new data once <code>MPI_Send</code> returns.</li>
|
||
<li>The received message is guaranteed to be fully available in the receive buffer once <code>MPI_Recv</code> returns.</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=ed0c4d76">
|
||
<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="Example">Example<a class="anchor-link" href="#Example">¶</a></h3>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=2299bf78">
|
||
<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-julia"><pre><span></span><span class="n">code</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">quote</span>
|
||
<span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">MPI</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Init</span><span class="p">()</span>
|
||
<span class="w"> </span><span class="n">comm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">COMM_WORLD</span>
|
||
<span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Comm_rank</span><span class="p">(</span><span class="n">comm</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">2</span>
|
||
<span class="w"> </span><span class="n">sndbuf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">8</span><span class="p">]</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Send</span><span class="p">(</span><span class="n">sndbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">;</span><span class="w"> </span><span class="n">dest</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">sndbuf</span><span class="w"> </span><span class="o">.=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="c"># This is fine. Send has returned.</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">3</span>
|
||
<span class="w"> </span><span class="n">rcvbuf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">zeros</span><span class="p">(</span><span class="kt">Int</span><span class="p">,</span><span class="mi">5</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Recv!</span><span class="p">(</span><span class="n">rcvbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">,</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Status</span><span class="p">;</span><span class="w"> </span><span class="n">source</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="c"># recvbuf will have the incomming message fore sure. Recv! has returned.</span>
|
||
<span class="w"> </span><span class="nd">@show</span><span class="w"> </span><span class="n">rcvbuf</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="k">end</span>
|
||
<span class="n">run</span><span class="p">(</span><span class="sb">`</span><span class="si">$</span><span class="p">(</span><span class="n">mpiexec</span><span class="p">())</span><span class="sb"> -np 4 julia --project=. -e </span><span class="si">$code</span><span class="sb">`</span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=04bdb01f">
|
||
<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="Blocking-operations">Blocking operations<a class="anchor-link" href="#Blocking-operations">¶</a></h2><p><code>MPI_Recv</code> and <code>MPI_Probe</code> are <em>blocking</em> operations. This means that they will wait for a matching send.</p>
|
||
<p><code>MPI_Send</code> is also often called a blocking send, but this is very misleading. <code>MPI_Send</code> might or not wait for a matching <code>MPI_Recv</code>. Assuming that <code>MPI_Send</code> will block waiting for a matching receive is erroneous. I.e., we cannot assume that <code>MPI_Send</code> has synchronization side effects with the receiver process. However, assuming that <code>MPI_Send</code> will not block is also erroneous. Look into the following example (which in fact is an incorrect MPI program). In contrast, <code>MPI_Send</code> guarantees that the send buffer can be reused when function returns (complete operation).</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=59fcac63">
|
||
<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="Incorrect-program">Incorrect program<a class="anchor-link" href="#Incorrect-program">¶</a></h3><p>The following program will or will not work depending on the underlying implementation and other factors (i.e. this program has undefined behavior). On my laptop, it works with <code>n=1</code>, but leads to a dead lock when <code>n=10000</code>.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=42fb8089">
|
||
<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-julia"><pre><span></span><span class="n">code</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">quote</span>
|
||
<span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">MPI</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Init</span><span class="p">()</span>
|
||
<span class="w"> </span><span class="n">comm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">COMM_WORLD</span>
|
||
<span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Comm_rank</span><span class="p">(</span><span class="n">comm</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span>
|
||
<span class="w"> </span><span class="n">sndbuf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fill</span><span class="p">(</span><span class="n">rank</span><span class="p">,</span><span class="n">n</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">rcvbuf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">zeros</span><span class="p">(</span><span class="kt">Int</span><span class="p">,</span><span class="n">n</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">2</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Send</span><span class="p">(</span><span class="n">sndbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">;</span><span class="w"> </span><span class="n">dest</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Recv!</span><span class="p">(</span><span class="n">rcvbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">,</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Status</span><span class="p">;</span><span class="w"> </span><span class="n">source</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">3</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Send</span><span class="p">(</span><span class="n">sndbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">;</span><span class="w"> </span><span class="n">dest</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Recv!</span><span class="p">(</span><span class="n">rcvbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">,</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Status</span><span class="p">;</span><span class="w"> </span><span class="n">source</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="w"> </span><span class="nd">@show</span><span class="w"> </span><span class="p">(</span><span class="n">rcvbuf</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span><span class="n">rank</span><span class="p">)</span>
|
||
<span class="k">end</span>
|
||
<span class="n">run</span><span class="p">(</span><span class="sb">`</span><span class="si">$</span><span class="p">(</span><span class="n">mpiexec</span><span class="p">())</span><span class="sb"> -np 4 julia --project=. -e </span><span class="si">$code</span><span class="sb">`</span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=42402ec1">
|
||
<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 class="alert alert-block alert-info">
|
||
<b>Tip:</b> You can stop the cell from runnig with Kernel > Interrupt. You might need to click in Interrupt 2 times.
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=94c39af5">
|
||
<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="To-buffer-or-not-to-buffer-outbound-messages?">To buffer or not to buffer outbound messages?<a class="anchor-link" href="#To-buffer-or-not-to-buffer-outbound-messages?">¶</a></h2><p>There are two key competing requirements that face implementations of <code>MPI_Send</code>.</p>
|
||
<ol>
|
||
<li>One might want to minimize synchronization time. This is often achieved by copying the outgoing message in an internal buffer and returning from the <code>MPI_Send</code> as soon as possible, without waiting for a matching <code>MPI_Recv</code>.</li>
|
||
<li>One might want to avoid data copies (e.g. for large messages). In this case, one needs to wait for a matching receive and return from the <code>MPI_Send</code> when the data has been sent.</li>
|
||
</ol>
|
||
<p>Thus, there is a trade-off between memory copied (buffering) and synchronization (wait) time. One cannot minimize both at the same time.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=b2cb0a43">
|
||
<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="Fixing-cyclic-dependencies">Fixing cyclic dependencies<a class="anchor-link" href="#Fixing-cyclic-dependencies">¶</a></h2><p>Returning to the incorrect program seen before. Remember that on my laptop it worked for <code>n=1</code>, but it failed for <code>n=10000</code>. For <code>n=1</code> the MPI implementation provably decided that the best trade-off was to buffer the small message and return from the <code>MPI_Send</code> as soon as possible. For the large message (<code>n=10000</code>) it provably decided to wait for a matching receive in order to avoid copying data. In this case, both ranks were blocked on the call to <code>MPI_Send</code> and the receives were never posted leading to a dead lock.</p>
|
||
<p>We can fix these cyclic dependences by smartly ordering the sends and the receives:</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=94c8d5e9">
|
||
<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-julia"><pre><span></span><span class="n">code</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">quote</span>
|
||
<span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">MPI</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Init</span><span class="p">()</span>
|
||
<span class="w"> </span><span class="n">comm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">COMM_WORLD</span>
|
||
<span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Comm_rank</span><span class="p">(</span><span class="n">comm</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">10000</span>
|
||
<span class="w"> </span><span class="n">sndbuf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fill</span><span class="p">(</span><span class="n">rank</span><span class="p">,</span><span class="n">n</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">rcvbuf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">zeros</span><span class="p">(</span><span class="kt">Int</span><span class="p">,</span><span class="n">n</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">2</span>
|
||
<span class="w"> </span><span class="c"># We first send and then receive</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Send</span><span class="p">(</span><span class="n">sndbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">;</span><span class="w"> </span><span class="n">dest</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Recv!</span><span class="p">(</span><span class="n">rcvbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">,</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Status</span><span class="p">;</span><span class="w"> </span><span class="n">source</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">3</span>
|
||
<span class="w"> </span><span class="c"># We first receive and then send</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Recv!</span><span class="p">(</span><span class="n">rcvbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">,</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Status</span><span class="p">;</span><span class="w"> </span><span class="n">source</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Send</span><span class="p">(</span><span class="n">sndbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">;</span><span class="w"> </span><span class="n">dest</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="w"> </span><span class="nd">@show</span><span class="w"> </span><span class="p">(</span><span class="n">rcvbuf</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span><span class="n">rank</span><span class="p">)</span>
|
||
<span class="k">end</span>
|
||
<span class="n">run</span><span class="p">(</span><span class="sb">`</span><span class="si">$</span><span class="p">(</span><span class="n">mpiexec</span><span class="p">())</span><span class="sb"> -np 4 julia --project=. -e </span><span class="si">$code</span><span class="sb">`</span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=2b37ed85">
|
||
<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>Another solution is to use <code>MPI_Sendrecv</code>, which will handle the ordering for us.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=9c0c84f0">
|
||
<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-julia"><pre><span></span><span class="n">code</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">quote</span>
|
||
<span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">MPI</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Init</span><span class="p">()</span>
|
||
<span class="w"> </span><span class="n">comm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">COMM_WORLD</span>
|
||
<span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Comm_rank</span><span class="p">(</span><span class="n">comm</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">10000</span>
|
||
<span class="w"> </span><span class="n">sndbuf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fill</span><span class="p">(</span><span class="n">rank</span><span class="p">,</span><span class="n">n</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">rcvbuf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">zeros</span><span class="p">(</span><span class="kt">Int</span><span class="p">,</span><span class="n">n</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">2</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Sendrecv!</span><span class="p">(</span><span class="n">sndbuf</span><span class="p">,</span><span class="n">rcvbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">;</span><span class="n">dest</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span><span class="n">source</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span><span class="n">sendtag</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span><span class="n">recvtag</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">3</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Sendrecv!</span><span class="p">(</span><span class="n">sndbuf</span><span class="p">,</span><span class="n">rcvbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">;</span><span class="n">dest</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span><span class="n">source</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span><span class="n">sendtag</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span><span class="n">recvtag</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="w"> </span><span class="nd">@show</span><span class="w"> </span><span class="p">(</span><span class="n">rcvbuf</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span><span class="n">rank</span><span class="p">)</span>
|
||
<span class="k">end</span>
|
||
<span class="n">run</span><span class="p">(</span><span class="sb">`</span><span class="si">$</span><span class="p">(</span><span class="n">mpiexec</span><span class="p">())</span><span class="sb"> -np 4 julia --project=. -e </span><span class="si">$code</span><span class="sb">`</span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=228a2067">
|
||
<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="Communication-modes">Communication modes<a class="anchor-link" href="#Communication-modes">¶</a></h2><p>What if we as users want to decide when to buffer a message or when to avoid data copies? This is provided by so-called <em>communication</em> modes. There are four modes: standard, buffered, synchronous, and ready provided by the respective functions <code>MPI_Send</code>, <code>MPI_Bsend</code>, <code>MPI_Ssend</code>, and <code>MPI_Rsend</code>, respectively.</p>
|
||
<p>All these MPI functions are <em>complete</em> MPI operations, and therefore, it is safe to re-write the send buffer once the corresponding send returns. All these send types are matched with an <code>MPI_Recv</code>. I.e., there is no <code>MPI_Brecv</code>, <code>MPI_Srecv</code>, <code>MPI_Rrecv</code>.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=4fca501c">
|
||
<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 class="alert alert-block alert-info">
|
||
<b>Note:</b> `MPI_Bsend`, `MPI_Ssend`, and `MPI_Rsend` are not exposed in the Julia bindings via a high-level interface like for `MPI.Send`, but they can be accessed using the low-level bindings in the submodule `MPI.API` (not shown in this notebook).
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=126ce58c">
|
||
<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="Standard-mode">Standard mode<a class="anchor-link" href="#Standard-mode">¶</a></h3><ul>
|
||
<li>Function <code>MPI_Send</code>.</li>
|
||
<li>Programmer cannot make any assumptions whether the message is buffered or not. This is up to the system.</li>
|
||
<li>Assuming that <code>MPI_Send</code> does not block because it copies the message into a buffer is erroneous (as the example above).</li>
|
||
<li>Assuming that <code>MPI_Send</code> will block waiting for a matching receive is also incorrect.</li>
|
||
<li>Assuming that a matching receive started when <code>MPI_Send</code>returns is also incorrect (no synchronization guarantee).</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=014ef71f">
|
||
<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="Buffered-mode">Buffered mode<a class="anchor-link" href="#Buffered-mode">¶</a></h3><ul>
|
||
<li>Function <code>MPI_Bsend</code>.</li>
|
||
<li>Programmer provides additional internal buffer space with function <code>MPI_Buffer_attach</code>.</li>
|
||
<li><code>MPI_Bsend</code> completes when message is copied into a local buffer.</li>
|
||
<li>Erroneous if buffer space is insufficient.</li>
|
||
<li>It does not wait for a matching receive.</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=bf456a3e">
|
||
<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="Synchronous-mode">Synchronous mode<a class="anchor-link" href="#Synchronous-mode">¶</a></h3><ul>
|
||
<li>Function <code>MPI_Ssend</code>.</li>
|
||
<li>It waits for a matching receive and it is guaranteed that the receive started (synchronization guarantee).</li>
|
||
<li>No extra data copy.</li>
|
||
<li>Easy to get deadlocks.</li>
|
||
<li>It can be started whether or not a matching receive was posted.</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=a1bd72c3">
|
||
<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="Ready-mode">Ready mode<a class="anchor-link" href="#Ready-mode">¶</a></h3><ul>
|
||
<li>Function <code>MPI_Rsend</code>.</li>
|
||
<li>It may be started only if the matching receive is already posted. This allows the underlying implementation to skip some operations, such as a <a href="https://en.wikipedia.org/wiki/Handshake_(computing">handshake</a>).</li>
|
||
<li>Erroneous if there is no matching receive yet.</li>
|
||
<li>Otherwise, the same as the synchronous <code>MPI_Ssend</code>.</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=4a206008">
|
||
<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>For further information about the communication modes, refer to <a href="https://www.mpi-forum.org/docs/mpi-2.2/mpi22-report/node53.htm">this section</a> of the MPI standard.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=e12f3d48">
|
||
<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="Non-blocking-send-and-receive">Non-blocking send and receive<a class="anchor-link" href="#Non-blocking-send-and-receive">¶</a></h2><p>In addition to all the send and receive function seen so far, MPI also provide two extra functions: <code>MPI_Isend</code> and <code>MPI_Irecv</code>.</p>
|
||
<p>In Julia:</p>
|
||
<div class="highlight"><pre><span></span><span class="n">request</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Isend</span><span class="p">(</span><span class="n">sndbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">;</span><span class="w"> </span><span class="n">dest</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="p">)</span>
|
||
<span class="n">request</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Irecv!</span><span class="p">(</span><span class="n">rcvbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">;</span><span class="w"> </span><span class="n">source</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="p">)</span>
|
||
</pre></div>
|
||
<p>In C:</p>
|
||
<div class="highlight"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="n">MPI_Isend</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">sndbuf</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">count</span><span class="p">,</span><span class="w"> </span><span class="n">MPI_Datatype</span><span class="w"> </span><span class="n">datatype</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">dest</span><span class="p">,</span>
|
||
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">tag</span><span class="p">,</span><span class="w"> </span><span class="n">MPI_Comm</span><span class="w"> </span><span class="n">comm</span><span class="p">,</span><span class="w"> </span><span class="n">MPI_Request</span><span class="w"> </span><span class="o">*</span><span class="n">request</span><span class="p">)</span>
|
||
<span class="kt">int</span><span class="w"> </span><span class="n">MPI_Irecv</span><span class="p">(</span><span class="kt">void</span><span class="w"> </span><span class="o">*</span><span class="n">rcvbuf</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">count</span><span class="p">,</span><span class="w"> </span><span class="n">MPI_Datatype</span><span class="w"> </span><span class="n">datatype</span><span class="p">,</span>
|
||
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">source</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">tag</span><span class="p">,</span><span class="w"> </span><span class="n">MPI_Comm</span><span class="w"> </span><span class="n">comm</span><span class="p">,</span><span class="w"> </span><span class="n">MPI_Request</span><span class="w"> </span><span class="o">*</span><span class="n">request</span><span class="p">)</span>
|
||
</pre></div>
|
||
<p>These functions are <em>non-blocking</em> as they return immediately without waiting for a matching send or receive.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=64938903">
|
||
<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="Incomplete-operations">Incomplete operations<a class="anchor-link" href="#Incomplete-operations">¶</a></h2><p>Functions <code>MPI_Isend</code> and <code>MPI_Irecv</code> are <em>incomplete</em> operations, hence the <code>I</code> in <code>MPI_Isend</code> and <code>MPI_Irecv</code>. This means that, when these functions return, there is no guarantee that the underlying operation has finished. Function <code>MPI_Wait</code> should be used to wait for completion of the send and/or receive.</p>
|
||
<p>In particular:</p>
|
||
<ul>
|
||
<li>One needs to wait for completion before reseting the send buffer</li>
|
||
<li>One needs to wait for completion before using the receive buffer</li>
|
||
</ul>
|
||
<p>Otherwise your program will be erroneous.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=c52a5959">
|
||
<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="Latency-hiding">Latency hiding<a class="anchor-link" href="#Latency-hiding">¶</a></h2><p>One of the key benefits of using <code>MPI_Isend</code> and <code>MPI_Irecv</code> is that they allow one to overlap communication and computation, also called as latency-hiding. For instance, one can post an <code>MPI_Irecv</code> to start receiving a message, which will return without waiting for a matching send. One can do local work, while waiting for a matching send and while the message is transferred. And finally, one calls <code>MPI_Wait</code> to wait for the completion of the receive operation.</p>
|
||
<div class="alert alert-block alert-info">
|
||
<b>Note:</b> `MPI_Bsend` also provides a way of doing latency hiding on the send side (at the expense of copying the message). `MPI_Isend` allows you doing latency hiding on the send side without copying data, and `MPI_Irecv` allows you doing latency hiding on the receive side.
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=85903e61">
|
||
<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="Example">Example<a class="anchor-link" href="#Example">¶</a></h3><p>Send 5 integers from rank 2 to rank 3. Both ranks do some work while messages are being communicated.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=42284c69">
|
||
<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-julia"><pre><span></span><span class="n">code</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">quote</span>
|
||
<span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">MPI</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Init</span><span class="p">()</span>
|
||
<span class="w"> </span><span class="n">work</span><span class="p">()</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">sum</span><span class="p">(</span><span class="n">rand</span><span class="p">(</span><span class="mi">1000</span><span class="p">))</span>
|
||
<span class="w"> </span><span class="n">comm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">COMM_WORLD</span>
|
||
<span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Comm_rank</span><span class="p">(</span><span class="n">comm</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">2</span>
|
||
<span class="w"> </span><span class="n">sndbuf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">8</span><span class="p">]</span>
|
||
<span class="w"> </span><span class="n">request</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Isend</span><span class="p">(</span><span class="n">sndbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">;</span><span class="w"> </span><span class="n">dest</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">work</span><span class="p">()</span><span class="w"> </span><span class="c"># Overlap local work with communication / synchronization </span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Wait</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">3</span>
|
||
<span class="w"> </span><span class="n">rcvbuf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">zeros</span><span class="p">(</span><span class="kt">Int</span><span class="p">,</span><span class="mi">5</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">request</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Irecv!</span><span class="p">(</span><span class="n">rcvbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">;</span><span class="w"> </span><span class="n">source</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">work</span><span class="p">()</span><span class="w"> </span><span class="c"># Overlap local work with communication / synchronization</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Wait</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="nd">@show</span><span class="w"> </span><span class="n">rcvbuf</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="k">end</span>
|
||
<span class="n">run</span><span class="p">(</span><span class="sb">`</span><span class="si">$</span><span class="p">(</span><span class="n">mpiexec</span><span class="p">())</span><span class="sb"> -np 4 julia --project=. -e </span><span class="si">$code</span><span class="sb">`</span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=0180c576">
|
||
<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="Incorrect-program">Incorrect program<a class="anchor-link" href="#Incorrect-program">¶</a></h3><p>This program in incorrect both on the send and the receive side.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=52991807">
|
||
<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-julia"><pre><span></span><span class="n">code</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">quote</span>
|
||
<span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">MPI</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Init</span><span class="p">()</span>
|
||
<span class="w"> </span><span class="n">comm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">COMM_WORLD</span>
|
||
<span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Comm_rank</span><span class="p">(</span><span class="n">comm</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">2</span>
|
||
<span class="w"> </span><span class="n">sndbuf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">8</span><span class="p">]</span>
|
||
<span class="w"> </span><span class="n">request</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Isend</span><span class="p">(</span><span class="n">sndbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">;</span><span class="w"> </span><span class="n">dest</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">sndbuf</span><span class="w"> </span><span class="o">.=</span><span class="w"> </span><span class="mi">10</span><span class="w"> </span><span class="c"># We cannot set the sndbuf before MPI.Wait.</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Wait</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">3</span>
|
||
<span class="w"> </span><span class="n">rcvbuf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">zeros</span><span class="p">(</span><span class="kt">Int</span><span class="p">,</span><span class="mi">5</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">request</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Irecv!</span><span class="p">(</span><span class="n">rcvbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">;</span><span class="w"> </span><span class="n">source</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="nd">@show</span><span class="w"> </span><span class="n">rcvbuf</span><span class="w"> </span><span class="c"># Not guaranteed to have the correct value.</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Wait</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="k">end</span>
|
||
<span class="n">run</span><span class="p">(</span><span class="sb">`</span><span class="si">$</span><span class="p">(</span><span class="n">mpiexec</span><span class="p">())</span><span class="sb"> -np 4 julia --project=. -e </span><span class="si">$code</span><span class="sb">`</span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=4cc264f1">
|
||
<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="MPI_Iprobe">MPI_Iprobe<a class="anchor-link" href="#MPI_Iprobe">¶</a></h2><p>Remember that we used <code>MPI_Probe</code> to query for the size of an incoming message. However, if we use <code>MPI_Probe</code> we miss the opportunity to do local work before a matching send started, i.e. we cannot do latency hiding.</p>
|
||
<p>This can be fixed using an <code>MPI_Iprobe</code>, i.e., an incomplete probe (aka a non-blocking probe). It allows us to check for incoming messages without blocking.</p>
|
||
<p>In Julia:</p>
|
||
<div class="highlight"><pre><span></span><span class="n">ismsg</span><span class="p">,</span><span class="w"> </span><span class="n">status</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Iprobe</span><span class="p">(</span><span class="n">comm</span><span class="p">,</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Status</span><span class="p">;</span><span class="w"> </span><span class="n">source</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="p">)</span>
|
||
</pre></div>
|
||
<p>In C:</p>
|
||
<div class="highlight"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="n">MPI_Iprobe</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">source</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">tag</span><span class="p">,</span><span class="w"> </span><span class="n">MPI_Comm</span><span class="w"> </span><span class="n">comm</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="o">*</span><span class="n">ismsg</span><span class="p">,</span>
|
||
<span class="w"> </span><span class="n">MPI_Status</span><span class="w"> </span><span class="o">*</span><span class="n">status</span><span class="p">)</span>
|
||
</pre></div>
|
||
<p>Function <code>MPI_Iprobe</code> returns immediately without waiting for a matching send. The value of <code>ismsg</code> tells if a send was posted or not. If there was a send, the <code>status</code> object can be used to get information about the incoming message as we saw before.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=05a72541">
|
||
<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="Example">Example<a class="anchor-link" href="#Example">¶</a></h3><p>Rank 2 sleeps for some time before the send starts. On the receive side, we will block on the call to <code>MPI_Probe</code> waiting for the send to start.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=03b11966">
|
||
<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-julia"><pre><span></span><span class="n">code</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">quote</span>
|
||
<span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">MPI</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Init</span><span class="p">()</span>
|
||
<span class="w"> </span><span class="n">work</span><span class="p">()</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">sum</span><span class="p">(</span><span class="n">rand</span><span class="p">(</span><span class="mi">1000</span><span class="p">))</span>
|
||
<span class="w"> </span><span class="n">comm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">COMM_WORLD</span>
|
||
<span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Comm_rank</span><span class="p">(</span><span class="n">comm</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">2</span>
|
||
<span class="w"> </span><span class="n">sleep</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span><span class="w"> </span><span class="c"># Sleep 5 seconds</span>
|
||
<span class="w"> </span><span class="n">sndbuf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">8</span><span class="p">]</span>
|
||
<span class="w"> </span><span class="n">request</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Isend</span><span class="p">(</span><span class="n">sndbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">;</span><span class="w"> </span><span class="n">dest</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Wait</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">3</span>
|
||
<span class="w"> </span><span class="c"># We are going to wait here for about 5 seconds</span>
|
||
<span class="w"> </span><span class="c"># Missing the opportunity to do some useful work</span>
|
||
<span class="w"> </span><span class="n">status</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Probe</span><span class="p">(</span><span class="n">comm</span><span class="p">,</span><span class="n">MPI</span><span class="o">.</span><span class="n">Status</span><span class="p">;</span><span class="w"> </span><span class="n">source</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">count</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Get_count</span><span class="p">(</span><span class="n">status</span><span class="p">,</span><span class="kt">Int</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">rcvbuf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">zeros</span><span class="p">(</span><span class="kt">Int</span><span class="p">,</span><span class="n">count</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">request</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Irecv!</span><span class="p">(</span><span class="n">rcvbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">;</span><span class="w"> </span><span class="n">source</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">work</span><span class="p">()</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Wait</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="nd">@show</span><span class="w"> </span><span class="n">rcvbuf</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="k">end</span>
|
||
<span class="n">run</span><span class="p">(</span><span class="sb">`</span><span class="si">$</span><span class="p">(</span><span class="n">mpiexec</span><span class="p">())</span><span class="sb"> -np 4 julia --project=. -e </span><span class="si">$code</span><span class="sb">`</span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=6761b4fa">
|
||
<div class="jp-Cell-inputWrapper" tabindex="0">
|
||
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
|
||
</div>
|
||
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
|
||
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput" data-mime-type="text/markdown">
|
||
<p>This other version uses <code>MPI_Iprobe</code> to do some local work wile waiting for the incoming message.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs" id="cell-id=75fdb2b1">
|
||
<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-julia"><pre><span></span><span class="n">code</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">quote</span>
|
||
<span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">MPI</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Init</span><span class="p">()</span>
|
||
<span class="w"> </span><span class="n">work</span><span class="p">()</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">sum</span><span class="p">(</span><span class="n">rand</span><span class="p">(</span><span class="mi">1000</span><span class="p">))</span>
|
||
<span class="w"> </span><span class="n">comm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">COMM_WORLD</span>
|
||
<span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Comm_rank</span><span class="p">(</span><span class="n">comm</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">2</span>
|
||
<span class="w"> </span><span class="n">sleep</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span><span class="w"> </span><span class="c"># Sleep 5 seconds</span>
|
||
<span class="w"> </span><span class="n">sndbuf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">8</span><span class="p">]</span>
|
||
<span class="w"> </span><span class="n">request</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Isend</span><span class="p">(</span><span class="n">sndbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">;</span><span class="w"> </span><span class="n">dest</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Wait</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">3</span>
|
||
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="nb">true</span>
|
||
<span class="w"> </span><span class="n">ismsg</span><span class="p">,</span><span class="w"> </span><span class="n">status</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Iprobe</span><span class="p">(</span><span class="n">comm</span><span class="p">,</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Status</span><span class="p">;</span><span class="w"> </span><span class="n">source</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">ismsg</span><span class="w"> </span><span class="c"># If the send started, get message size and start the receive</span>
|
||
<span class="w"> </span><span class="n">count</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Get_count</span><span class="p">(</span><span class="n">status</span><span class="p">,</span><span class="kt">Int</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">rcvbuf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">zeros</span><span class="p">(</span><span class="kt">Int</span><span class="p">,</span><span class="n">count</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">reqrcv</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Irecv!</span><span class="p">(</span><span class="n">rcvbuf</span><span class="p">,</span><span class="w"> </span><span class="n">comm</span><span class="p">;</span><span class="w"> </span><span class="n">source</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">tag</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">work</span><span class="p">()</span>
|
||
<span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Wait</span><span class="p">(</span><span class="n">reqrcv</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="nd">@show</span><span class="w"> </span><span class="n">rcvbuf</span>
|
||
<span class="w"> </span><span class="k">break</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="w"> </span><span class="n">work</span><span class="p">()</span><span class="w"> </span><span class="c"># Otherwise do work while waiting for an incoming message.</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="k">end</span>
|
||
<span class="n">run</span><span class="p">(</span><span class="sb">`</span><span class="si">$</span><span class="p">(</span><span class="n">mpiexec</span><span class="p">())</span><span class="sb"> -np 4 julia --project=. -e </span><span class="si">$code</span><span class="sb">`</span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=30fc748f">
|
||
<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="Summary">Summary<a class="anchor-link" href="#Summary">¶</a></h2><p>We have seen different ways of sending and receiving messages with MPI, each one with its pros and cons. You as user should decide which is the best option for a given problem. We also learned how to get information about an incoming messages with <code>MPI_Status</code>, <code>MPI_Probe</code>, and <code>MPI_Iprobe</code>. In addition, we saw how easy is to write incorrect programs with if you do not follow the semantics of the MPI operations properly.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=d02f935d">
|
||
<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="Exercises">Exercises<a class="anchor-link" href="#Exercises">¶</a></h2>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=bd491de3">
|
||
<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="Exercise-1">Exercise 1<a class="anchor-link" href="#Exercise-1">¶</a></h3><p>Implement the parallel matrix-matrix multiplication (Algorithm 3) in previous notebook using MPI instead of <code>Distributed</code>. Use this function signature:</p>
|
||
<div class="highlight"><pre><span></span><span class="k">function</span><span class="w"> </span><span class="n">matmul_mpi_3!</span><span class="p">(</span><span class="n">C</span><span class="p">,</span><span class="n">A</span><span class="p">,</span><span class="n">B</span><span class="p">)</span>
|
||
</pre></div>
|
||
<p>Assume that the input matrices <code>A</code> and <code>B</code> are given only on rank 0, the other ranks get dummy matrices with zero rows and zero columns to save memory. You need to communicate the required parts to other ranks. For simplicity you can assume that <code>A</code> and <code>B</code> are square matrices and that the number of rows is a multiple of the number of processes (on rank 0). The result <code>C</code> should be overwritten only on rank 0. You can use the following cell to implement and check your result. Copy the code below to a file called <code>ex1.jl</code>. Modify the file (e.g. with vscode). Run it from the Julia REPL using the <code>run</code> function as explained in the <a href="https://www.francescverdugo.com/XM_40017/dev/getting_started_with_julia/#Running-MPI-code">Getting Started tutorial</a>.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=4fa53366">
|
||
<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 class="highlight"><pre><span></span><span class="c"># ex1.jl (begin)</span>
|
||
<span class="k">using</span><span class="w"> </span><span class="n">MPI</span>
|
||
<span class="n">MPI</span><span class="o">.</span><span class="n">Init</span><span class="p">()</span>
|
||
<span class="k">function</span><span class="w"> </span><span class="n">matmul_mpi_3!</span><span class="p">(</span><span class="n">C</span><span class="p">,</span><span class="n">A</span><span class="p">,</span><span class="n">B</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="c"># Implement here</span>
|
||
<span class="k">end</span>
|
||
<span class="k">function</span><span class="w"> </span><span class="n">testit</span><span class="p">(</span><span class="n">load</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">comm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">COMM_WORLD</span>
|
||
<span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Comm_rank</span><span class="p">(</span><span class="n">comm</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span>
|
||
<span class="w"> </span><span class="n">P</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MPI</span><span class="o">.</span><span class="n">Comm_size</span><span class="p">(</span><span class="n">comm</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">load</span><span class="o">*</span><span class="n">P</span>
|
||
<span class="w"> </span><span class="k">else</span>
|
||
<span class="w"> </span><span class="n">N</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">rand</span><span class="p">(</span><span class="n">N</span><span class="p">,</span><span class="n">N</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">B</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">rand</span><span class="p">(</span><span class="n">N</span><span class="p">,</span><span class="n">N</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">C</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">similar</span><span class="p">(</span><span class="n">A</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">matmul_mpi_3!</span><span class="p">(</span><span class="n">C</span><span class="p">,</span><span class="n">A</span><span class="p">,</span><span class="n">B</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">rank</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span>
|
||
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="o">!</span><span class="p">(</span><span class="n">C</span><span class="w"> </span><span class="o">≈</span><span class="w"> </span><span class="n">A</span><span class="o">*</span><span class="n">B</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="n">println</span><span class="p">(</span><span class="s">"Test failed 😢"</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">else</span>
|
||
<span class="w"> </span><span class="n">println</span><span class="p">(</span><span class="s">"Test passed 🥳"</span><span class="p">)</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="w"> </span><span class="k">end</span>
|
||
<span class="k">end</span>
|
||
<span class="n">testit</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span>
|
||
<span class="k">end</span>
|
||
<span class="c"># ex1.jl (end)</span>
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=a8e1c623">
|
||
<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="Exercise-2">Exercise 2<a class="anchor-link" href="#Exercise-2">¶</a></h3><p>Implement this "simple" algorithm (the telephone game):</p>
|
||
<p>Rank 0 generates a message (an integer). Rank 0 sends the message to rank 1. Rank 1 receives the message, increments the message by 1, and sends the result to rank 2. Rank 2 receives the message, increments the message by 1, and sends the result to rank 3. Etc. The last rank sends back the message to rank 0 closing the ring. See the next figure. Implement the communications using MPI. Do not use <code>Distributed</code>. Use a text editor and the Julia REPL. Do not try to implement the code in a notebook.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=d474d781">
|
||
<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>
|
||
<img align="left" alt="No description has been provided for this image" src="data:image/png;base64,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NWbMGKtZs2auznfk603MTLSIiByT1PhdXFys+C0iklhXA4twGUNbtGhh/ehHP7JWr14dFrd79OgR9vyhQ4c2eM6GDRusiooK68QTT/QSt4PtGkXEpSbAvZgG667eaOeee671wgsvNHjDfve7342YTG/evNmaMmWK1b59ey9v5o2YAgciIuIsIfH77rvvjphMV1ZWKn6LiCROABgGbMBlTD3ttNOsKVOmWJWVlUfj9iOPPNJoMv38889bZ555ppe4vQ1TQC0/Jf8KIlnoZMxSlDpcvvEKCgqs+fPnW1VVVdYf//hHx2T6tddes7p06eLlzRxcytg8Fb+0iEgWiCt+/+lPf3JMphW/RUSSpiUmXu7HZYy98sorrVmzZllVVVXWG2+84ZhML1iwwOrdu7eXuB1cin5SKn5pkVxwEfAPXL4JmzZtan3ve9+zPvroI6tp06YNftauXTsrEAi4fTMfBv4EnJ6qX1REJMv4Fb/rgf9E8VtExKuOHCvuFfUrLy/Puu2226xly5aFrRg65ZRTrPz8fC+J9KvA+an6RUVyzSBgLS7fkG3atLE6derk5Q0c+vU+pv2LiIjEz3P89rgcUPFbRCSxegHLcBl7W7ZsaV188cWxxu2VwI0p+r1EclozzP6JXcT2Zo32VYnZ76dK7SIiiaX4LSKSWfIw9SZqSU7c3gE8hPl8EJEU6gA8j1nKl4g38z6gAjg+lb+EiEgOSkb8noDit4hIsrQBnsLsZ05E3K4Dfgt4amUrIol3LfAu8b2hZwFnp3rgIiI57jvAEhS/RUQyhac6GBG+1KJQJM0EgLuAzXh7My8FCn0Yr4iIGAFgBN7j98dATx/GKyIiMBBYhbe4vQYY4sdgRcSd44HHiF7Svxa4B+2rExFJF17i972o76iIiN+aAQ8AX9N43N6N2Rd9nD/DFBGvzgbeIPzNXA88jfrWiYikq7OIHL9/i+K3iEi6aQ+8iHMi/TJwmn9DE5F43AvUYIolrEFLAkVEMoXit4hIZrkZ2ICJ25uAYf4OR0RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERPwS8HsAklTtgBNDvv8G2OrTWEREJP2cBeSFfF8D7PNnKCIikgTHAWfYHvsKsHwYi0hGmY55owS//uDvcGLWDrgCuAkYAFwKtPZ1RCIi2WEnDT8nbvB3OCIikmBX0TDOW5gEO1M0AS4GegO3AgOBbpibwb5r4vcARCI4GfghcBdwgcPPLeBjzA2DPwIHUjc0ERFJA82By4GrgS5AR9vP5wGTUj0oERGJS1OgB9Af6ANchon3TmqAhcA0YA6abZcEy9SZ6aGY5ej2u2iRvtYA1/kyUhGRzJYpM9N5wDXAv2Mumj4GDtL4Z8MLvoxURCS9ZMrM9NXAM8A23OcAoV/LMTdWRRImE5PpEqAe72+gA8CNPoxXRCSTZUoy3QnvnwtKpkVEMieZXk1sSXTo10Hg3lQOWsu8JZ3cAjxJeGG8NcBLwFrM3+xFwEjgtJDnHAfMALoCnyR9pCIiIiIikmwHgKXABszK1SaYbT3dMdtCQzUF/gNTSPPFFI5RslQmzUy3AbbTcLz1wFgaVpoNOg6YSvgdqWURni8iIuEyfWZ6P/Ae8Dtgr+1nmpkWEcnMmekdmOv8QiKPtSkwCthC+O+3Czg9yeOVHJBJyfQvCH8jPODiuN87HHdnksYoIpJtMimZPgh8BvwZsyWoBw2L0tj32SmZFhHJrGR6LfB/iVxwzMkZmFWs9t9xaqIHKLknU5Lp9sAeGo51Ee5mmE8A1tuOXQPkJ2OgIiJZJlOS6XzMLERjlEyLiITLlGR6ENHjfCSXAXU0/B1rSUE+oOWwkg6GAsfbHvsFZpl3NHuAKbbHzsX0nxMRkexwGHOhJCIi2WkWscf5FcB/2x5rD1wS14hcyJQCZE2Bb9seW4FZ8hXUCbgZuBY4B2gG/Auzl6qx5cLNjxxzDaaw1ZmY/bsA32D28X4CLADesZ3TrROAC0O+tzAb6UNdgEkqrz7yuwQw+wXWAW8A/8DsDUulAHAF4Tdd1mP+XRJlsO37TcA/PRz/PPBLGt5lG4LpOyciuaE9DfsM7wO+sD2nK2bm9TLgW5gYtwuz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" width="320"/>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=5e8f6e6a">
|
||
<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="License">License<a class="anchor-link" href="#License">¶</a></h1><p>This notebook is part of the course <a href="https://www.francescverdugo.com/XM_40017">Programming Large Scale Parallel Systems</a> at Vrije Universiteit Amsterdam and may be used under a <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a> license.</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</main>
|
||
</body>
|
||
</html>
|