tag:blogger.com,1999:blog-4964822024-03-14T02:15:19.494-04:00For Some Value of "Magic""Any sufficiently advanced technology is indistinguishable from magic" -- Arthur C Clarke
<br>
Musings from the technological frontierStevehttp://www.blogger.com/profile/15732819755000554717noreply@blogger.comBlogger535125tag:blogger.com,1999:blog-496482.post-62944773558092605942024-02-29T12:25:00.000-05:002024-02-29T12:29:17.422-05:00Understanding Python Descriptors<head><meta charset="utf-8"></meta>
<meta content="width=device-width, initial-scale=1.0" name="viewport"></meta>
<title>Understanding Descriptors</title><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.min.js"></script>
<style type="text/css">
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: var(--jp-cell-editor-active-background) }
.highlight { background: var(--jp-cell-editor-background); color: var(--jp-mirror-editor-variable-color) }
.highlight .c { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment */
.highlight .err { color: var(--jp-mirror-editor-error-color) } /* Error */
.highlight .k { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword */
.highlight .o { color: var(--jp-mirror-editor-operator-color); font-weight: bold } /* Operator */
.highlight .p { color: var(--jp-mirror-editor-punctuation-color) } /* Punctuation */
.highlight .ch { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Hashbang */
.highlight .cm { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Multiline */
.highlight .cp { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Preproc */
.highlight .cpf { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.PreprocFile */
.highlight .c1 { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Single */
.highlight .cs { color: var(--jp-mirror-editor-comment-color); font-style: italic } /* Comment.Special */
.highlight .kc { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Pseudo */
.highlight .kr { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: var(--jp-mirror-editor-keyword-color); font-weight: bold } /* Keyword.Type */
.highlight .m { color: var(--jp-mirror-editor-number-color) } /* Literal.Number */
.highlight .s { color: var(--jp-mirror-editor-string-color) } /* Literal.String */
.highlight .ow { color: var(--jp-mirror-editor-operator-color); font-weight: bold } /* Operator.Word */
.highlight .pm { color: var(--jp-mirror-editor-punctuation-color) } /* Punctuation.Marker */
.highlight .w { color: var(--jp-mirror-editor-variable-color) } /* Text.Whitespace */
.highlight .mb { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Bin */
.highlight .mf { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Float */
.highlight .mh { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Hex */
.highlight .mi { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Integer */
.highlight .mo { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Oct */
.highlight .sa { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Affix */
.highlight .sb { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Backtick */
.highlight .sc { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Char */
.highlight .dl { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Delimiter */
.highlight .sd { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Doc */
.highlight .s2 { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Double */
.highlight .se { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Escape */
.highlight .sh { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Heredoc */
.highlight .si { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Interpol */
.highlight .sx { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Other */
.highlight .sr { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Regex */
.highlight .s1 { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Single */
.highlight .ss { color: var(--jp-mirror-editor-string-color) } /* Literal.String.Symbol */
.highlight .il { color: var(--jp-mirror-editor-number-color) } /* Literal.Number.Integer.Long */
</style>
<style type="text/css">
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
/*
* Mozilla scrollbar styling
*/
/* use standard opaque scrollbars for most nodes */
[data-jp-theme-scrollbars='true'] {
scrollbar-color: rgb(var(--jp-scrollbar-thumb-color))
var(--jp-scrollbar-background-color);
}
/* for code nodes, use a transparent style of scrollbar. These selectors
* will match lower in the tree, and so will override the above */
[data-jp-theme-scrollbars='true'] .CodeMirror-hscrollbar,
[data-jp-theme-scrollbars='true'] .CodeMirror-vscrollbar {
scrollbar-color: rgba(var(--jp-scrollbar-thumb-color), 0.5) transparent;
}
/* tiny scrollbar */
.jp-scrollbar-tiny {
scrollbar-color: rgba(var(--jp-scrollbar-thumb-color), 0.5) transparent;
scrollbar-width: thin;
}
/*
* Webkit scrollbar styling
*/
/* use standard opaque scrollbars for most nodes */
[data-jp-theme-scrollbars='true'] ::-webkit-scrollbar,
[data-jp-theme-scrollbars='true'] ::-webkit-scrollbar-corner {
background: var(--jp-scrollbar-background-color);
}
[data-jp-theme-scrollbars='true'] ::-webkit-scrollbar-thumb {
background: rgb(var(--jp-scrollbar-thumb-color));
border: var(--jp-scrollbar-thumb-margin) solid transparent;
background-clip: content-box;
border-radius: var(--jp-scrollbar-thumb-radius);
}
[data-jp-theme-scrollbars='true'] ::-webkit-scrollbar-track:horizontal {
border-left: var(--jp-scrollbar-endpad) solid
var(--jp-scrollbar-background-color);
border-right: var(--jp-scrollbar-endpad) solid
var(--jp-scrollbar-background-color);
}
[data-jp-theme-scrollbars='true'] ::-webkit-scrollbar-track:vertical {
border-top: var(--jp-scrollbar-endpad) solid
var(--jp-scrollbar-background-color);
border-bottom: var(--jp-scrollbar-endpad) solid
var(--jp-scrollbar-background-color);
}
/* for code nodes, use a transparent style of scrollbar */
[data-jp-theme-scrollbars='true'] .CodeMirror-hscrollbar::-webkit-scrollbar,
[data-jp-theme-scrollbars='true'] .CodeMirror-vscrollbar::-webkit-scrollbar,
[data-jp-theme-scrollbars='true']
.CodeMirror-hscrollbar::-webkit-scrollbar-corner,
[data-jp-theme-scrollbars='true']
.CodeMirror-vscrollbar::-webkit-scrollbar-corner {
background-color: transparent;
}
[data-jp-theme-scrollbars='true']
.CodeMirror-hscrollbar::-webkit-scrollbar-thumb,
[data-jp-theme-scrollbars='true']
.CodeMirror-vscrollbar::-webkit-scrollbar-thumb {
background: rgba(var(--jp-scrollbar-thumb-color), 0.5);
border: var(--jp-scrollbar-thumb-margin) solid transparent;
background-clip: content-box;
border-radius: var(--jp-scrollbar-thumb-radius);
}
[data-jp-theme-scrollbars='true']
.CodeMirror-hscrollbar::-webkit-scrollbar-track:horizontal {
border-left: var(--jp-scrollbar-endpad) solid transparent;
border-right: var(--jp-scrollbar-endpad) solid transparent;
}
[data-jp-theme-scrollbars='true']
.CodeMirror-vscrollbar::-webkit-scrollbar-track:vertical {
border-top: var(--jp-scrollbar-endpad) solid transparent;
border-bottom: var(--jp-scrollbar-endpad) solid transparent;
}
/* 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: 0px solid transparent;
border-right: 0px solid transparent;
}
.jp-scrollbar-tiny::-webkit-scrollbar-track:vertical {
border-top: 0px solid transparent;
border-bottom: 0px solid transparent;
}
/*
* Phosphor
*/
.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.
| 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.
|----------------------------------------------------------------------------*/
/* <DEPRECATED> */ .p-Widget, /* </DEPRECATED> */
.lm-Widget {
box-sizing: border-box;
position: relative;
overflow: hidden;
cursor: default;
}
/* <DEPRECATED> */ .p-Widget.p-mod-hidden, /* </DEPRECATED> */
.lm-Widget.lm-mod-hidden {
display: none !important;
}
/*-----------------------------------------------------------------------------
| 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.
|----------------------------------------------------------------------------*/
/* <DEPRECATED> */ .p-CommandPalette, /* </DEPRECATED> */
.lm-CommandPalette {
display: flex;
flex-direction: column;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
/* <DEPRECATED> */ .p-CommandPalette-search, /* </DEPRECATED> */
.lm-CommandPalette-search {
flex: 0 0 auto;
}
/* <DEPRECATED> */ .p-CommandPalette-content, /* </DEPRECATED> */
.lm-CommandPalette-content {
flex: 1 1 auto;
margin: 0;
padding: 0;
min-height: 0;
overflow: auto;
list-style-type: none;
}
/* <DEPRECATED> */ .p-CommandPalette-header, /* </DEPRECATED> */
.lm-CommandPalette-header {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
/* <DEPRECATED> */ .p-CommandPalette-item, /* </DEPRECATED> */
.lm-CommandPalette-item {
display: flex;
flex-direction: row;
}
/* <DEPRECATED> */ .p-CommandPalette-itemIcon, /* </DEPRECATED> */
.lm-CommandPalette-itemIcon {
flex: 0 0 auto;
}
/* <DEPRECATED> */ .p-CommandPalette-itemContent, /* </DEPRECATED> */
.lm-CommandPalette-itemContent {
flex: 1 1 auto;
overflow: hidden;
}
/* <DEPRECATED> */ .p-CommandPalette-itemShortcut, /* </DEPRECATED> */
.lm-CommandPalette-itemShortcut {
flex: 0 0 auto;
}
/* <DEPRECATED> */ .p-CommandPalette-itemLabel, /* </DEPRECATED> */
.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.
| 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.
|----------------------------------------------------------------------------*/
/* <DEPRECATED> */ .p-DockPanel, /* </DEPRECATED> */
.lm-DockPanel {
z-index: 0;
}
/* <DEPRECATED> */ .p-DockPanel-widget, /* </DEPRECATED> */
.lm-DockPanel-widget {
z-index: 0;
}
/* <DEPRECATED> */ .p-DockPanel-tabBar, /* </DEPRECATED> */
.lm-DockPanel-tabBar {
z-index: 1;
}
/* <DEPRECATED> */ .p-DockPanel-handle, /* </DEPRECATED> */
.lm-DockPanel-handle {
z-index: 2;
}
/* <DEPRECATED> */ .p-DockPanel-handle.p-mod-hidden, /* </DEPRECATED> */
.lm-DockPanel-handle.lm-mod-hidden {
display: none !important;
}
/* <DEPRECATED> */ .p-DockPanel-handle:after, /* </DEPRECATED> */
.lm-DockPanel-handle:after {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
content: '';
}
/* <DEPRECATED> */
.p-DockPanel-handle[data-orientation='horizontal'],
/* </DEPRECATED> */
.lm-DockPanel-handle[data-orientation='horizontal'] {
cursor: ew-resize;
}
/* <DEPRECATED> */
.p-DockPanel-handle[data-orientation='vertical'],
/* </DEPRECATED> */
.lm-DockPanel-handle[data-orientation='vertical'] {
cursor: ns-resize;
}
/* <DEPRECATED> */
.p-DockPanel-handle[data-orientation='horizontal']:after,
/* </DEPRECATED> */
.lm-DockPanel-handle[data-orientation='horizontal']:after {
left: 50%;
min-width: 8px;
transform: translateX(-50%);
}
/* <DEPRECATED> */
.p-DockPanel-handle[data-orientation='vertical']:after,
/* </DEPRECATED> */
.lm-DockPanel-handle[data-orientation='vertical']:after {
top: 50%;
min-height: 8px;
transform: translateY(-50%);
}
/* <DEPRECATED> */ .p-DockPanel-overlay, /* </DEPRECATED> */
.lm-DockPanel-overlay {
z-index: 3;
box-sizing: border-box;
pointer-events: none;
}
/* <DEPRECATED> */ .p-DockPanel-overlay.p-mod-hidden, /* </DEPRECATED> */
.lm-DockPanel-overlay.lm-mod-hidden {
display: none !important;
}
/*-----------------------------------------------------------------------------
| 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.
|----------------------------------------------------------------------------*/
/* <DEPRECATED> */ .p-Menu, /* </DEPRECATED> */
.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;
}
/* <DEPRECATED> */ .p-Menu-content, /* </DEPRECATED> */
.lm-Menu-content {
margin: 0;
padding: 0;
display: table;
list-style-type: none;
}
/* <DEPRECATED> */ .p-Menu-item, /* </DEPRECATED> */
.lm-Menu-item {
display: table-row;
}
/* <DEPRECATED> */
.p-Menu-item.p-mod-hidden,
.p-Menu-item.p-mod-collapsed,
/* </DEPRECATED> */
.lm-Menu-item.lm-mod-hidden,
.lm-Menu-item.lm-mod-collapsed {
display: none !important;
}
/* <DEPRECATED> */
.p-Menu-itemIcon,
.p-Menu-itemSubmenuIcon,
/* </DEPRECATED> */
.lm-Menu-itemIcon,
.lm-Menu-itemSubmenuIcon {
display: table-cell;
text-align: center;
}
/* <DEPRECATED> */ .p-Menu-itemLabel, /* </DEPRECATED> */
.lm-Menu-itemLabel {
display: table-cell;
text-align: left;
}
/* <DEPRECATED> */ .p-Menu-itemShortcut, /* </DEPRECATED> */
.lm-Menu-itemShortcut {
display: table-cell;
text-align: right;
}
/*-----------------------------------------------------------------------------
| 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.
|----------------------------------------------------------------------------*/
/* <DEPRECATED> */ .p-MenuBar, /* </DEPRECATED> */
.lm-MenuBar {
outline: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
/* <DEPRECATED> */ .p-MenuBar-content, /* </DEPRECATED> */
.lm-MenuBar-content {
margin: 0;
padding: 0;
display: flex;
flex-direction: row;
list-style-type: none;
}
/* <DEPRECATED> */ .p--MenuBar-item, /* </DEPRECATED> */
.lm-MenuBar-item {
box-sizing: border-box;
}
/* <DEPRECATED> */
.p-MenuBar-itemIcon,
.p-MenuBar-itemLabel,
/* </DEPRECATED> */
.lm-MenuBar-itemIcon,
.lm-MenuBar-itemLabel {
display: inline-block;
}
/*-----------------------------------------------------------------------------
| 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.
|----------------------------------------------------------------------------*/
/* <DEPRECATED> */ .p-ScrollBar, /* </DEPRECATED> */
.lm-ScrollBar {
display: flex;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
/* <DEPRECATED> */
.p-ScrollBar[data-orientation='horizontal'],
/* </DEPRECATED> */
.lm-ScrollBar[data-orientation='horizontal'] {
flex-direction: row;
}
/* <DEPRECATED> */
.p-ScrollBar[data-orientation='vertical'],
/* </DEPRECATED> */
.lm-ScrollBar[data-orientation='vertical'] {
flex-direction: column;
}
/* <DEPRECATED> */ .p-ScrollBar-button, /* </DEPRECATED> */
.lm-ScrollBar-button {
box-sizing: border-box;
flex: 0 0 auto;
}
/* <DEPRECATED> */ .p-ScrollBar-track, /* </DEPRECATED> */
.lm-ScrollBar-track {
box-sizing: border-box;
position: relative;
overflow: hidden;
flex: 1 1 auto;
}
/* <DEPRECATED> */ .p-ScrollBar-thumb, /* </DEPRECATED> */
.lm-ScrollBar-thumb {
box-sizing: border-box;
position: absolute;
}
/*-----------------------------------------------------------------------------
| 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.
|----------------------------------------------------------------------------*/
/* <DEPRECATED> */ .p-SplitPanel-child, /* </DEPRECATED> */
.lm-SplitPanel-child {
z-index: 0;
}
/* <DEPRECATED> */ .p-SplitPanel-handle, /* </DEPRECATED> */
.lm-SplitPanel-handle {
z-index: 1;
}
/* <DEPRECATED> */ .p-SplitPanel-handle.p-mod-hidden, /* </DEPRECATED> */
.lm-SplitPanel-handle.lm-mod-hidden {
display: none !important;
}
/* <DEPRECATED> */ .p-SplitPanel-handle:after, /* </DEPRECATED> */
.lm-SplitPanel-handle:after {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
content: '';
}
/* <DEPRECATED> */
.p-SplitPanel[data-orientation='horizontal'] > .p-SplitPanel-handle,
/* </DEPRECATED> */
.lm-SplitPanel[data-orientation='horizontal'] > .lm-SplitPanel-handle {
cursor: ew-resize;
}
/* <DEPRECATED> */
.p-SplitPanel[data-orientation='vertical'] > .p-SplitPanel-handle,
/* </DEPRECATED> */
.lm-SplitPanel[data-orientation='vertical'] > .lm-SplitPanel-handle {
cursor: ns-resize;
}
/* <DEPRECATED> */
.p-SplitPanel[data-orientation='horizontal'] > .p-SplitPanel-handle:after,
/* </DEPRECATED> */
.lm-SplitPanel[data-orientation='horizontal'] > .lm-SplitPanel-handle:after {
left: 50%;
min-width: 8px;
transform: translateX(-50%);
}
/* <DEPRECATED> */
.p-SplitPanel[data-orientation='vertical'] > .p-SplitPanel-handle:after,
/* </DEPRECATED> */
.lm-SplitPanel[data-orientation='vertical'] > .lm-SplitPanel-handle:after {
top: 50%;
min-height: 8px;
transform: translateY(-50%);
}
/*-----------------------------------------------------------------------------
| 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.
|----------------------------------------------------------------------------*/
/* <DEPRECATED> */ .p-TabBar, /* </DEPRECATED> */
.lm-TabBar {
display: flex;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
/* <DEPRECATED> */ .p-TabBar[data-orientation='horizontal'], /* </DEPRECATED> */
.lm-TabBar[data-orientation='horizontal'] {
flex-direction: row;
align-items: flex-end;
}
/* <DEPRECATED> */ .p-TabBar[data-orientation='vertical'], /* </DEPRECATED> */
.lm-TabBar[data-orientation='vertical'] {
flex-direction: column;
align-items: flex-end;
}
/* <DEPRECATED> */ .p-TabBar-content, /* </DEPRECATED> */
.lm-TabBar-content {
margin: 0;
padding: 0;
display: flex;
flex: 1 1 auto;
list-style-type: none;
}
/* <DEPRECATED> */
.p-TabBar[data-orientation='horizontal'] > .p-TabBar-content,
/* </DEPRECATED> */
.lm-TabBar[data-orientation='horizontal'] > .lm-TabBar-content {
flex-direction: row;
}
/* <DEPRECATED> */
.p-TabBar[data-orientation='vertical'] > .p-TabBar-content,
/* </DEPRECATED> */
.lm-TabBar[data-orientation='vertical'] > .lm-TabBar-content {
flex-direction: column;
}
/* <DEPRECATED> */ .p-TabBar-tab, /* </DEPRECATED> */
.lm-TabBar-tab {
display: flex;
flex-direction: row;
box-sizing: border-box;
overflow: hidden;
}
/* <DEPRECATED> */
.p-TabBar-tabIcon,
.p-TabBar-tabCloseIcon,
/* </DEPRECATED> */
.lm-TabBar-tabIcon,
.lm-TabBar-tabCloseIcon {
flex: 0 0 auto;
}
/* <DEPRECATED> */ .p-TabBar-tabLabel, /* </DEPRECATED> */
.lm-TabBar-tabLabel {
flex: 1 1 auto;
overflow: hidden;
white-space: nowrap;
}
.lm-TabBar-tabInput {
user-select: all;
width: 100%;
box-sizing : border-box;
}
/* <DEPRECATED> */ .p-TabBar-tab.p-mod-hidden, /* </DEPRECATED> */
.lm-TabBar-tab.lm-mod-hidden {
display: none !important;
}
.lm-TabBar-addButton.lm-mod-hidden {
display: none !important;
}
/* <DEPRECATED> */ .p-TabBar.p-mod-dragging .p-TabBar-tab, /* </DEPRECATED> */
.lm-TabBar.lm-mod-dragging .lm-TabBar-tab {
position: relative;
}
/* <DEPRECATED> */
.p-TabBar.p-mod-dragging[data-orientation='horizontal'] .p-TabBar-tab,
/* </DEPRECATED> */
.lm-TabBar.lm-mod-dragging[data-orientation='horizontal'] .lm-TabBar-tab {
left: 0;
transition: left 150ms ease;
}
/* <DEPRECATED> */
.p-TabBar.p-mod-dragging[data-orientation='vertical'] .p-TabBar-tab,
/* </DEPRECATED> */
.lm-TabBar.lm-mod-dragging[data-orientation='vertical'] .lm-TabBar-tab {
top: 0;
transition: top 150ms ease;
}
/* <DEPRECATED> */
.p-TabBar.p-mod-dragging .p-TabBar-tab.p-mod-dragging,
/* </DEPRECATED> */
.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.
| 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.
|----------------------------------------------------------------------------*/
/* <DEPRECATED> */ .p-TabPanel-tabBar, /* </DEPRECATED> */
.lm-TabPanel-tabBar {
z-index: 1;
}
/* <DEPRECATED> */ .p-TabPanel-stackedPanel, /* </DEPRECATED> */
.lm-TabPanel-stackedPanel {
z-index: 0;
}
/*-----------------------------------------------------------------------------
| 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.
|----------------------------------------------------------------------------*/
@charset "UTF-8";
html{
-webkit-box-sizing:border-box;
box-sizing:border-box; }
*,
*::before,
*::after{
-webkit-box-sizing:inherit;
box-sizing:inherit; }
body{
font-size:14px;
font-weight:400;
letter-spacing:0;
line-height:1.28581;
text-transform:none;
color:#182026;
font-family:-apple-system, "BlinkMacSystemFont", "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Open Sans", "Helvetica Neue", "Icons16", sans-serif; }
p{
margin-bottom:10px;
margin-top:0; }
small{
font-size:12px; }
strong{
font-weight:600; }
::-moz-selection{
background:rgba(125, 188, 255, 0.6); }
::selection{
background:rgba(125, 188, 255, 0.6); }
.bp3-heading{
color:#182026;
font-weight:600;
margin:0 0 10px;
padding:0; }
.bp3-dark .bp3-heading{
color:#f5f8fa; }
h1.bp3-heading, .bp3-running-text h1{
font-size:36px;
line-height:40px; }
h2.bp3-heading, .bp3-running-text h2{
font-size:28px;
line-height:32px; }
h3.bp3-heading, .bp3-running-text h3{
font-size:22px;
line-height:25px; }
h4.bp3-heading, .bp3-running-text h4{
font-size:18px;
line-height:21px; }
h5.bp3-heading, .bp3-running-text h5{
font-size:16px;
line-height:19px; }
h6.bp3-heading, .bp3-running-text h6{
font-size:14px;
line-height:16px; }
.bp3-ui-text{
font-size:14px;
font-weight:400;
letter-spacing:0;
line-height:1.28581;
text-transform:none; }
.bp3-monospace-text{
font-family:monospace;
text-transform:none; }
.bp3-text-muted{
color:#5c7080; }
.bp3-dark .bp3-text-muted{
color:#a7b6c2; }
.bp3-text-disabled{
color:rgba(92, 112, 128, 0.6); }
.bp3-dark .bp3-text-disabled{
color:rgba(167, 182, 194, 0.6); }
.bp3-text-overflow-ellipsis{
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
word-wrap:normal; }
.bp3-running-text{
font-size:14px;
line-height:1.5; }
.bp3-running-text h1{
color:#182026;
font-weight:600;
margin-bottom:20px;
margin-top:40px; }
.bp3-dark .bp3-running-text h1{
color:#f5f8fa; }
.bp3-running-text h2{
color:#182026;
font-weight:600;
margin-bottom:20px;
margin-top:40px; }
.bp3-dark .bp3-running-text h2{
color:#f5f8fa; }
.bp3-running-text h3{
color:#182026;
font-weight:600;
margin-bottom:20px;
margin-top:40px; }
.bp3-dark .bp3-running-text h3{
color:#f5f8fa; }
.bp3-running-text h4{
color:#182026;
font-weight:600;
margin-bottom:20px;
margin-top:40px; }
.bp3-dark .bp3-running-text h4{
color:#f5f8fa; }
.bp3-running-text h5{
color:#182026;
font-weight:600;
margin-bottom:20px;
margin-top:40px; }
.bp3-dark .bp3-running-text h5{
color:#f5f8fa; }
.bp3-running-text h6{
color:#182026;
font-weight:600;
margin-bottom:20px;
margin-top:40px; }
.bp3-dark .bp3-running-text h6{
color:#f5f8fa; }
.bp3-running-text hr{
border:none;
border-bottom:1px solid rgba(16, 22, 26, 0.15);
margin:20px 0; }
.bp3-dark .bp3-running-text hr{
border-color:rgba(255, 255, 255, 0.15); }
.bp3-running-text p{
margin:0 0 10px;
padding:0; }
.bp3-text-large{
font-size:16px; }
.bp3-text-small{
font-size:12px; }
a{
color:#106ba3;
text-decoration:none; }
a:hover{
color:#106ba3;
cursor:pointer;
text-decoration:underline; }
a .bp3-icon, a .bp3-icon-standard, a .bp3-icon-large{
color:inherit; }
a code,
.bp3-dark a code{
color:inherit; }
.bp3-dark a,
.bp3-dark a:hover{
color:#48aff0; }
.bp3-dark a .bp3-icon, .bp3-dark a .bp3-icon-standard, .bp3-dark a .bp3-icon-large,
.bp3-dark a:hover .bp3-icon,
.bp3-dark a:hover .bp3-icon-standard,
.bp3-dark a:hover .bp3-icon-large{
color:inherit; }
.bp3-running-text code, .bp3-code{
font-family:monospace;
text-transform:none;
background:rgba(255, 255, 255, 0.7);
border-radius:3px;
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2);
color:#5c7080;
font-size:smaller;
padding:2px 5px; }
.bp3-dark .bp3-running-text code, .bp3-running-text .bp3-dark code, .bp3-dark .bp3-code{
background:rgba(16, 22, 26, 0.3);
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4);
color:#a7b6c2; }
.bp3-running-text a > code, a > .bp3-code{
color:#137cbd; }
.bp3-dark .bp3-running-text a > code, .bp3-running-text .bp3-dark a > code, .bp3-dark a > .bp3-code{
color:inherit; }
.bp3-running-text pre, .bp3-code-block{
font-family:monospace;
text-transform:none;
background:rgba(255, 255, 255, 0.7);
border-radius:3px;
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.15);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.15);
color:#182026;
display:block;
font-size:13px;
line-height:1.4;
margin:10px 0;
padding:13px 15px 12px;
word-break:break-all;
word-wrap:break-word; }
.bp3-dark .bp3-running-text pre, .bp3-running-text .bp3-dark pre, .bp3-dark .bp3-code-block{
background:rgba(16, 22, 26, 0.3);
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4);
color:#f5f8fa; }
.bp3-running-text pre > code, .bp3-code-block > code{
background:none;
-webkit-box-shadow:none;
box-shadow:none;
color:inherit;
font-size:inherit;
padding:0; }
.bp3-running-text kbd, .bp3-key{
-webkit-box-align:center;
-ms-flex-align:center;
align-items:center;
background:#ffffff;
border-radius:3px;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.2);
color:#5c7080;
display:-webkit-inline-box;
display:-ms-inline-flexbox;
display:inline-flex;
font-family:inherit;
font-size:12px;
height:24px;
-webkit-box-pack:center;
-ms-flex-pack:center;
justify-content:center;
line-height:24px;
min-width:24px;
padding:3px 6px;
vertical-align:middle; }
.bp3-running-text kbd .bp3-icon, .bp3-key .bp3-icon, .bp3-running-text kbd .bp3-icon-standard, .bp3-key .bp3-icon-standard, .bp3-running-text kbd .bp3-icon-large, .bp3-key .bp3-icon-large{
margin-right:5px; }
.bp3-dark .bp3-running-text kbd, .bp3-running-text .bp3-dark kbd, .bp3-dark .bp3-key{
background:#394b59;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.4);
color:#a7b6c2; }
.bp3-running-text blockquote, .bp3-blockquote{
border-left:solid 4px rgba(167, 182, 194, 0.5);
margin:0 0 10px;
padding:0 20px; }
.bp3-dark .bp3-running-text blockquote, .bp3-running-text .bp3-dark blockquote, .bp3-dark .bp3-blockquote{
border-color:rgba(115, 134, 148, 0.5); }
.bp3-running-text ul,
.bp3-running-text ol, .bp3-list{
margin:10px 0;
padding-left:30px; }
.bp3-running-text ul li:not(:last-child), .bp3-running-text ol li:not(:last-child), .bp3-list li:not(:last-child){
margin-bottom:5px; }
.bp3-running-text ul ol, .bp3-running-text ol ol, .bp3-list ol,
.bp3-running-text ul ul,
.bp3-running-text ol ul,
.bp3-list ul{
margin-top:5px; }
.bp3-list-unstyled{
list-style:none;
margin:0;
padding:0; }
.bp3-list-unstyled li{
padding:0; }
.bp3-rtl{
text-align:right; }
.bp3-dark{
color:#f5f8fa; }
:focus{
outline:rgba(19, 124, 189, 0.6) auto 2px;
outline-offset:2px;
-moz-outline-radius:6px; }
.bp3-focus-disabled :focus{
outline:none !important; }
.bp3-focus-disabled :focus ~ .bp3-control-indicator{
outline:none !important; }
.bp3-alert{
max-width:400px;
padding:20px; }
.bp3-alert-body{
display:-webkit-box;
display:-ms-flexbox;
display:flex; }
.bp3-alert-body .bp3-icon{
font-size:40px;
margin-right:20px;
margin-top:0; }
.bp3-alert-contents{
word-break:break-word; }
.bp3-alert-footer{
display:-webkit-box;
display:-ms-flexbox;
display:flex;
-webkit-box-orient:horizontal;
-webkit-box-direction:reverse;
-ms-flex-direction:row-reverse;
flex-direction:row-reverse;
margin-top:10px; }
.bp3-alert-footer .bp3-button{
margin-left:10px; }
.bp3-breadcrumbs{
-webkit-box-align:center;
-ms-flex-align:center;
align-items:center;
cursor:default;
display:-webkit-box;
display:-ms-flexbox;
display:flex;
-ms-flex-wrap:wrap;
flex-wrap:wrap;
height:30px;
list-style:none;
margin:0;
padding:0; }
.bp3-breadcrumbs > li{
-webkit-box-align:center;
-ms-flex-align:center;
align-items:center;
display:-webkit-box;
display:-ms-flexbox;
display:flex; }
.bp3-breadcrumbs > li::after{
background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.71 7.29l-4-4a1.003 1.003 0 00-1.42 1.42L8.59 8 5.3 11.29c-.19.18-.3.43-.3.71a1.003 1.003 0 001.71.71l4-4c.18-.18.29-.43.29-.71 0-.28-.11-.53-.29-.71z' fill='%235C7080'/%3e%3c/svg%3e");
content:"";
display:block;
height:16px;
margin:0 5px;
width:16px; }
.bp3-breadcrumbs > li:last-of-type::after{
display:none; }
.bp3-breadcrumb,
.bp3-breadcrumb-current,
.bp3-breadcrumbs-collapsed{
-webkit-box-align:center;
-ms-flex-align:center;
align-items:center;
display:-webkit-inline-box;
display:-ms-inline-flexbox;
display:inline-flex;
font-size:16px; }
.bp3-breadcrumb,
.bp3-breadcrumbs-collapsed{
color:#5c7080; }
.bp3-breadcrumb:hover{
text-decoration:none; }
.bp3-breadcrumb.bp3-disabled{
color:rgba(92, 112, 128, 0.6);
cursor:not-allowed; }
.bp3-breadcrumb .bp3-icon{
margin-right:5px; }
.bp3-breadcrumb-current{
color:inherit;
font-weight:600; }
.bp3-breadcrumb-current .bp3-input{
font-size:inherit;
font-weight:inherit;
vertical-align:baseline; }
.bp3-breadcrumbs-collapsed{
background:#ced9e0;
border:none;
border-radius:3px;
cursor:pointer;
margin-right:2px;
padding:1px 5px;
vertical-align:text-bottom; }
.bp3-breadcrumbs-collapsed::before{
background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cg fill='%235C7080'%3e%3ccircle cx='2' cy='8.03' r='2'/%3e%3ccircle cx='14' cy='8.03' r='2'/%3e%3ccircle cx='8' cy='8.03' r='2'/%3e%3c/g%3e%3c/svg%3e") center no-repeat;
content:"";
display:block;
height:16px;
width:16px; }
.bp3-breadcrumbs-collapsed:hover{
background:#bfccd6;
color:#182026;
text-decoration:none; }
.bp3-dark .bp3-breadcrumb,
.bp3-dark .bp3-breadcrumbs-collapsed{
color:#a7b6c2; }
.bp3-dark .bp3-breadcrumbs > li::after{
color:#a7b6c2; }
.bp3-dark .bp3-breadcrumb.bp3-disabled{
color:rgba(167, 182, 194, 0.6); }
.bp3-dark .bp3-breadcrumb-current{
color:#f5f8fa; }
.bp3-dark .bp3-breadcrumbs-collapsed{
background:rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-breadcrumbs-collapsed:hover{
background:rgba(16, 22, 26, 0.6);
color:#f5f8fa; }
.bp3-button{
display:-webkit-inline-box;
display:-ms-inline-flexbox;
display:inline-flex;
-webkit-box-orient:horizontal;
-webkit-box-direction:normal;
-ms-flex-direction:row;
flex-direction:row;
-webkit-box-align:center;
-ms-flex-align:center;
align-items:center;
border:none;
border-radius:3px;
cursor:pointer;
font-size:14px;
-webkit-box-pack:center;
-ms-flex-pack:center;
justify-content:center;
padding:5px 10px;
text-align:left;
vertical-align:middle;
min-height:30px;
min-width:30px; }
.bp3-button > *{
-webkit-box-flex:0;
-ms-flex-positive:0;
flex-grow:0;
-ms-flex-negative:0;
flex-shrink:0; }
.bp3-button > .bp3-fill{
-webkit-box-flex:1;
-ms-flex-positive:1;
flex-grow:1;
-ms-flex-negative:1;
flex-shrink:1; }
.bp3-button::before,
.bp3-button > *{
margin-right:7px; }
.bp3-button:empty::before,
.bp3-button > :last-child{
margin-right:0; }
.bp3-button:empty{
padding:0 !important; }
.bp3-button:disabled, .bp3-button.bp3-disabled{
cursor:not-allowed; }
.bp3-button.bp3-fill{
display:-webkit-box;
display:-ms-flexbox;
display:flex;
width:100%; }
.bp3-button.bp3-align-right,
.bp3-align-right .bp3-button{
text-align:right; }
.bp3-button.bp3-align-left,
.bp3-align-left .bp3-button{
text-align:left; }
.bp3-button:not([class*="bp3-intent-"]){
background-color:#f5f8fa;
background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.8)), to(rgba(255, 255, 255, 0)));
background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0));
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
color:#182026; }
.bp3-button:not([class*="bp3-intent-"]):hover{
background-clip:padding-box;
background-color:#ebf1f5;
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1); }
.bp3-button:not([class*="bp3-intent-"]):active, .bp3-button:not([class*="bp3-intent-"]).bp3-active{
background-color:#d8e1e8;
background-image:none;
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 2px rgba(16, 22, 26, 0.2);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 2px rgba(16, 22, 26, 0.2); }
.bp3-button:not([class*="bp3-intent-"]):disabled, .bp3-button:not([class*="bp3-intent-"]).bp3-disabled{
background-color:rgba(206, 217, 224, 0.5);
background-image:none;
-webkit-box-shadow:none;
box-shadow:none;
color:rgba(92, 112, 128, 0.6);
cursor:not-allowed;
outline:none; }
.bp3-button:not([class*="bp3-intent-"]):disabled.bp3-active, .bp3-button:not([class*="bp3-intent-"]):disabled.bp3-active:hover, .bp3-button:not([class*="bp3-intent-"]).bp3-disabled.bp3-active, .bp3-button:not([class*="bp3-intent-"]).bp3-disabled.bp3-active:hover{
background:rgba(206, 217, 224, 0.7); }
.bp3-button.bp3-intent-primary{
background-color:#137cbd;
background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.1)), to(rgba(255, 255, 255, 0)));
background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0));
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
color:#ffffff; }
.bp3-button.bp3-intent-primary:hover, .bp3-button.bp3-intent-primary:active, .bp3-button.bp3-intent-primary.bp3-active{
color:#ffffff; }
.bp3-button.bp3-intent-primary:hover{
background-color:#106ba3;
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2); }
.bp3-button.bp3-intent-primary:active, .bp3-button.bp3-intent-primary.bp3-active{
background-color:#0e5a8a;
background-image:none;
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2); }
.bp3-button.bp3-intent-primary:disabled, .bp3-button.bp3-intent-primary.bp3-disabled{
background-color:rgba(19, 124, 189, 0.5);
background-image:none;
border-color:transparent;
-webkit-box-shadow:none;
box-shadow:none;
color:rgba(255, 255, 255, 0.6); }
.bp3-button.bp3-intent-success{
background-color:#0f9960;
background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.1)), to(rgba(255, 255, 255, 0)));
background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0));
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
color:#ffffff; }
.bp3-button.bp3-intent-success:hover, .bp3-button.bp3-intent-success:active, .bp3-button.bp3-intent-success.bp3-active{
color:#ffffff; }
.bp3-button.bp3-intent-success:hover{
background-color:#0d8050;
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2); }
.bp3-button.bp3-intent-success:active, .bp3-button.bp3-intent-success.bp3-active{
background-color:#0a6640;
background-image:none;
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2); }
.bp3-button.bp3-intent-success:disabled, .bp3-button.bp3-intent-success.bp3-disabled{
background-color:rgba(15, 153, 96, 0.5);
background-image:none;
border-color:transparent;
-webkit-box-shadow:none;
box-shadow:none;
color:rgba(255, 255, 255, 0.6); }
.bp3-button.bp3-intent-warning{
background-color:#d9822b;
background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.1)), to(rgba(255, 255, 255, 0)));
background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0));
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
color:#ffffff; }
.bp3-button.bp3-intent-warning:hover, .bp3-button.bp3-intent-warning:active, .bp3-button.bp3-intent-warning.bp3-active{
color:#ffffff; }
.bp3-button.bp3-intent-warning:hover{
background-color:#bf7326;
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2); }
.bp3-button.bp3-intent-warning:active, .bp3-button.bp3-intent-warning.bp3-active{
background-color:#a66321;
background-image:none;
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2); }
.bp3-button.bp3-intent-warning:disabled, .bp3-button.bp3-intent-warning.bp3-disabled{
background-color:rgba(217, 130, 43, 0.5);
background-image:none;
border-color:transparent;
-webkit-box-shadow:none;
box-shadow:none;
color:rgba(255, 255, 255, 0.6); }
.bp3-button.bp3-intent-danger{
background-color:#db3737;
background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.1)), to(rgba(255, 255, 255, 0)));
background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0));
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
color:#ffffff; }
.bp3-button.bp3-intent-danger:hover, .bp3-button.bp3-intent-danger:active, .bp3-button.bp3-intent-danger.bp3-active{
color:#ffffff; }
.bp3-button.bp3-intent-danger:hover{
background-color:#c23030;
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2); }
.bp3-button.bp3-intent-danger:active, .bp3-button.bp3-intent-danger.bp3-active{
background-color:#a82a2a;
background-image:none;
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2); }
.bp3-button.bp3-intent-danger:disabled, .bp3-button.bp3-intent-danger.bp3-disabled{
background-color:rgba(219, 55, 55, 0.5);
background-image:none;
border-color:transparent;
-webkit-box-shadow:none;
box-shadow:none;
color:rgba(255, 255, 255, 0.6); }
.bp3-button[class*="bp3-intent-"] .bp3-button-spinner .bp3-spinner-head{
stroke:#ffffff; }
.bp3-button.bp3-large,
.bp3-large .bp3-button{
min-height:40px;
min-width:40px;
font-size:16px;
padding:5px 15px; }
.bp3-button.bp3-large::before,
.bp3-button.bp3-large > *,
.bp3-large .bp3-button::before,
.bp3-large .bp3-button > *{
margin-right:10px; }
.bp3-button.bp3-large:empty::before,
.bp3-button.bp3-large > :last-child,
.bp3-large .bp3-button:empty::before,
.bp3-large .bp3-button > :last-child{
margin-right:0; }
.bp3-button.bp3-small,
.bp3-small .bp3-button{
min-height:24px;
min-width:24px;
padding:0 7px; }
.bp3-button.bp3-loading{
position:relative; }
.bp3-button.bp3-loading[class*="bp3-icon-"]::before{
visibility:hidden; }
.bp3-button.bp3-loading .bp3-button-spinner{
margin:0;
position:absolute; }
.bp3-button.bp3-loading > :not(.bp3-button-spinner){
visibility:hidden; }
.bp3-button[class*="bp3-icon-"]::before{
font-family:"Icons16", sans-serif;
font-size:16px;
font-style:normal;
font-weight:400;
line-height:1;
-moz-osx-font-smoothing:grayscale;
-webkit-font-smoothing:antialiased;
color:#5c7080; }
.bp3-button .bp3-icon, .bp3-button .bp3-icon-standard, .bp3-button .bp3-icon-large{
color:#5c7080; }
.bp3-button .bp3-icon.bp3-align-right, .bp3-button .bp3-icon-standard.bp3-align-right, .bp3-button .bp3-icon-large.bp3-align-right{
margin-left:7px; }
.bp3-button .bp3-icon:first-child:last-child,
.bp3-button .bp3-spinner + .bp3-icon:last-child{
margin:0 -7px; }
.bp3-dark .bp3-button:not([class*="bp3-intent-"]){
background-color:#394b59;
background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.05)), to(rgba(255, 255, 255, 0)));
background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0));
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
color:#f5f8fa; }
.bp3-dark .bp3-button:not([class*="bp3-intent-"]):hover, .bp3-dark .bp3-button:not([class*="bp3-intent-"]):active, .bp3-dark .bp3-button:not([class*="bp3-intent-"]).bp3-active{
color:#f5f8fa; }
.bp3-dark .bp3-button:not([class*="bp3-intent-"]):hover{
background-color:#30404d;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-button:not([class*="bp3-intent-"]):active, .bp3-dark .bp3-button:not([class*="bp3-intent-"]).bp3-active{
background-color:#202b33;
background-image:none;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.6), inset 0 1px 2px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.6), inset 0 1px 2px rgba(16, 22, 26, 0.2); }
.bp3-dark .bp3-button:not([class*="bp3-intent-"]):disabled, .bp3-dark .bp3-button:not([class*="bp3-intent-"]).bp3-disabled{
background-color:rgba(57, 75, 89, 0.5);
background-image:none;
-webkit-box-shadow:none;
box-shadow:none;
color:rgba(167, 182, 194, 0.6); }
.bp3-dark .bp3-button:not([class*="bp3-intent-"]):disabled.bp3-active, .bp3-dark .bp3-button:not([class*="bp3-intent-"]).bp3-disabled.bp3-active{
background:rgba(57, 75, 89, 0.7); }
.bp3-dark .bp3-button:not([class*="bp3-intent-"]) .bp3-button-spinner .bp3-spinner-head{
background:rgba(16, 22, 26, 0.5);
stroke:#8a9ba8; }
.bp3-dark .bp3-button:not([class*="bp3-intent-"])[class*="bp3-icon-"]::before{
color:#a7b6c2; }
.bp3-dark .bp3-button:not([class*="bp3-intent-"]) .bp3-icon, .bp3-dark .bp3-button:not([class*="bp3-intent-"]) .bp3-icon-standard, .bp3-dark .bp3-button:not([class*="bp3-intent-"]) .bp3-icon-large{
color:#a7b6c2; }
.bp3-dark .bp3-button[class*="bp3-intent-"]{
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-button[class*="bp3-intent-"]:hover{
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-button[class*="bp3-intent-"]:active, .bp3-dark .bp3-button[class*="bp3-intent-"].bp3-active{
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2); }
.bp3-dark .bp3-button[class*="bp3-intent-"]:disabled, .bp3-dark .bp3-button[class*="bp3-intent-"].bp3-disabled{
background-image:none;
-webkit-box-shadow:none;
box-shadow:none;
color:rgba(255, 255, 255, 0.3); }
.bp3-dark .bp3-button[class*="bp3-intent-"] .bp3-button-spinner .bp3-spinner-head{
stroke:#8a9ba8; }
.bp3-button:disabled::before,
.bp3-button:disabled .bp3-icon, .bp3-button:disabled .bp3-icon-standard, .bp3-button:disabled .bp3-icon-large, .bp3-button.bp3-disabled::before,
.bp3-button.bp3-disabled .bp3-icon, .bp3-button.bp3-disabled .bp3-icon-standard, .bp3-button.bp3-disabled .bp3-icon-large, .bp3-button[class*="bp3-intent-"]::before,
.bp3-button[class*="bp3-intent-"] .bp3-icon, .bp3-button[class*="bp3-intent-"] .bp3-icon-standard, .bp3-button[class*="bp3-intent-"] .bp3-icon-large{
color:inherit !important; }
.bp3-button.bp3-minimal{
background:none;
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-button.bp3-minimal:hover{
background:rgba(167, 182, 194, 0.3);
-webkit-box-shadow:none;
box-shadow:none;
color:#182026;
text-decoration:none; }
.bp3-button.bp3-minimal:active, .bp3-button.bp3-minimal.bp3-active{
background:rgba(115, 134, 148, 0.3);
-webkit-box-shadow:none;
box-shadow:none;
color:#182026; }
.bp3-button.bp3-minimal:disabled, .bp3-button.bp3-minimal:disabled:hover, .bp3-button.bp3-minimal.bp3-disabled, .bp3-button.bp3-minimal.bp3-disabled:hover{
background:none;
color:rgba(92, 112, 128, 0.6);
cursor:not-allowed; }
.bp3-button.bp3-minimal:disabled.bp3-active, .bp3-button.bp3-minimal:disabled:hover.bp3-active, .bp3-button.bp3-minimal.bp3-disabled.bp3-active, .bp3-button.bp3-minimal.bp3-disabled:hover.bp3-active{
background:rgba(115, 134, 148, 0.3); }
.bp3-dark .bp3-button.bp3-minimal{
background:none;
-webkit-box-shadow:none;
box-shadow:none;
color:inherit; }
.bp3-dark .bp3-button.bp3-minimal:hover, .bp3-dark .bp3-button.bp3-minimal:active, .bp3-dark .bp3-button.bp3-minimal.bp3-active{
background:none;
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-dark .bp3-button.bp3-minimal:hover{
background:rgba(138, 155, 168, 0.15); }
.bp3-dark .bp3-button.bp3-minimal:active, .bp3-dark .bp3-button.bp3-minimal.bp3-active{
background:rgba(138, 155, 168, 0.3);
color:#f5f8fa; }
.bp3-dark .bp3-button.bp3-minimal:disabled, .bp3-dark .bp3-button.bp3-minimal:disabled:hover, .bp3-dark .bp3-button.bp3-minimal.bp3-disabled, .bp3-dark .bp3-button.bp3-minimal.bp3-disabled:hover{
background:none;
color:rgba(167, 182, 194, 0.6);
cursor:not-allowed; }
.bp3-dark .bp3-button.bp3-minimal:disabled.bp3-active, .bp3-dark .bp3-button.bp3-minimal:disabled:hover.bp3-active, .bp3-dark .bp3-button.bp3-minimal.bp3-disabled.bp3-active, .bp3-dark .bp3-button.bp3-minimal.bp3-disabled:hover.bp3-active{
background:rgba(138, 155, 168, 0.3); }
.bp3-button.bp3-minimal.bp3-intent-primary{
color:#106ba3; }
.bp3-button.bp3-minimal.bp3-intent-primary:hover, .bp3-button.bp3-minimal.bp3-intent-primary:active, .bp3-button.bp3-minimal.bp3-intent-primary.bp3-active{
background:none;
-webkit-box-shadow:none;
box-shadow:none;
color:#106ba3; }
.bp3-button.bp3-minimal.bp3-intent-primary:hover{
background:rgba(19, 124, 189, 0.15);
color:#106ba3; }
.bp3-button.bp3-minimal.bp3-intent-primary:active, .bp3-button.bp3-minimal.bp3-intent-primary.bp3-active{
background:rgba(19, 124, 189, 0.3);
color:#106ba3; }
.bp3-button.bp3-minimal.bp3-intent-primary:disabled, .bp3-button.bp3-minimal.bp3-intent-primary.bp3-disabled{
background:none;
color:rgba(16, 107, 163, 0.5); }
.bp3-button.bp3-minimal.bp3-intent-primary:disabled.bp3-active, .bp3-button.bp3-minimal.bp3-intent-primary.bp3-disabled.bp3-active{
background:rgba(19, 124, 189, 0.3); }
.bp3-button.bp3-minimal.bp3-intent-primary .bp3-button-spinner .bp3-spinner-head{
stroke:#106ba3; }
.bp3-dark .bp3-button.bp3-minimal.bp3-intent-primary{
color:#48aff0; }
.bp3-dark .bp3-button.bp3-minimal.bp3-intent-primary:hover{
background:rgba(19, 124, 189, 0.2);
color:#48aff0; }
.bp3-dark .bp3-button.bp3-minimal.bp3-intent-primary:active, .bp3-dark .bp3-button.bp3-minimal.bp3-intent-primary.bp3-active{
background:rgba(19, 124, 189, 0.3);
color:#48aff0; }
.bp3-dark .bp3-button.bp3-minimal.bp3-intent-primary:disabled, .bp3-dark .bp3-button.bp3-minimal.bp3-intent-primary.bp3-disabled{
background:none;
color:rgba(72, 175, 240, 0.5); }
.bp3-dark .bp3-button.bp3-minimal.bp3-intent-primary:disabled.bp3-active, .bp3-dark .bp3-button.bp3-minimal.bp3-intent-primary.bp3-disabled.bp3-active{
background:rgba(19, 124, 189, 0.3); }
.bp3-button.bp3-minimal.bp3-intent-success{
color:#0d8050; }
.bp3-button.bp3-minimal.bp3-intent-success:hover, .bp3-button.bp3-minimal.bp3-intent-success:active, .bp3-button.bp3-minimal.bp3-intent-success.bp3-active{
background:none;
-webkit-box-shadow:none;
box-shadow:none;
color:#0d8050; }
.bp3-button.bp3-minimal.bp3-intent-success:hover{
background:rgba(15, 153, 96, 0.15);
color:#0d8050; }
.bp3-button.bp3-minimal.bp3-intent-success:active, .bp3-button.bp3-minimal.bp3-intent-success.bp3-active{
background:rgba(15, 153, 96, 0.3);
color:#0d8050; }
.bp3-button.bp3-minimal.bp3-intent-success:disabled, .bp3-button.bp3-minimal.bp3-intent-success.bp3-disabled{
background:none;
color:rgba(13, 128, 80, 0.5); }
.bp3-button.bp3-minimal.bp3-intent-success:disabled.bp3-active, .bp3-button.bp3-minimal.bp3-intent-success.bp3-disabled.bp3-active{
background:rgba(15, 153, 96, 0.3); }
.bp3-button.bp3-minimal.bp3-intent-success .bp3-button-spinner .bp3-spinner-head{
stroke:#0d8050; }
.bp3-dark .bp3-button.bp3-minimal.bp3-intent-success{
color:#3dcc91; }
.bp3-dark .bp3-button.bp3-minimal.bp3-intent-success:hover{
background:rgba(15, 153, 96, 0.2);
color:#3dcc91; }
.bp3-dark .bp3-button.bp3-minimal.bp3-intent-success:active, .bp3-dark .bp3-button.bp3-minimal.bp3-intent-success.bp3-active{
background:rgba(15, 153, 96, 0.3);
color:#3dcc91; }
.bp3-dark .bp3-button.bp3-minimal.bp3-intent-success:disabled, .bp3-dark .bp3-button.bp3-minimal.bp3-intent-success.bp3-disabled{
background:none;
color:rgba(61, 204, 145, 0.5); }
.bp3-dark .bp3-button.bp3-minimal.bp3-intent-success:disabled.bp3-active, .bp3-dark .bp3-button.bp3-minimal.bp3-intent-success.bp3-disabled.bp3-active{
background:rgba(15, 153, 96, 0.3); }
.bp3-button.bp3-minimal.bp3-intent-warning{
color:#bf7326; }
.bp3-button.bp3-minimal.bp3-intent-warning:hover, .bp3-button.bp3-minimal.bp3-intent-warning:active, .bp3-button.bp3-minimal.bp3-intent-warning.bp3-active{
background:none;
-webkit-box-shadow:none;
box-shadow:none;
color:#bf7326; }
.bp3-button.bp3-minimal.bp3-intent-warning:hover{
background:rgba(217, 130, 43, 0.15);
color:#bf7326; }
.bp3-button.bp3-minimal.bp3-intent-warning:active, .bp3-button.bp3-minimal.bp3-intent-warning.bp3-active{
background:rgba(217, 130, 43, 0.3);
color:#bf7326; }
.bp3-button.bp3-minimal.bp3-intent-warning:disabled, .bp3-button.bp3-minimal.bp3-intent-warning.bp3-disabled{
background:none;
color:rgba(191, 115, 38, 0.5); }
.bp3-button.bp3-minimal.bp3-intent-warning:disabled.bp3-active, .bp3-button.bp3-minimal.bp3-intent-warning.bp3-disabled.bp3-active{
background:rgba(217, 130, 43, 0.3); }
.bp3-button.bp3-minimal.bp3-intent-warning .bp3-button-spinner .bp3-spinner-head{
stroke:#bf7326; }
.bp3-dark .bp3-button.bp3-minimal.bp3-intent-warning{
color:#ffb366; }
.bp3-dark .bp3-button.bp3-minimal.bp3-intent-warning:hover{
background:rgba(217, 130, 43, 0.2);
color:#ffb366; }
.bp3-dark .bp3-button.bp3-minimal.bp3-intent-warning:active, .bp3-dark .bp3-button.bp3-minimal.bp3-intent-warning.bp3-active{
background:rgba(217, 130, 43, 0.3);
color:#ffb366; }
.bp3-dark .bp3-button.bp3-minimal.bp3-intent-warning:disabled, .bp3-dark .bp3-button.bp3-minimal.bp3-intent-warning.bp3-disabled{
background:none;
color:rgba(255, 179, 102, 0.5); }
.bp3-dark .bp3-button.bp3-minimal.bp3-intent-warning:disabled.bp3-active, .bp3-dark .bp3-button.bp3-minimal.bp3-intent-warning.bp3-disabled.bp3-active{
background:rgba(217, 130, 43, 0.3); }
.bp3-button.bp3-minimal.bp3-intent-danger{
color:#c23030; }
.bp3-button.bp3-minimal.bp3-intent-danger:hover, .bp3-button.bp3-minimal.bp3-intent-danger:active, .bp3-button.bp3-minimal.bp3-intent-danger.bp3-active{
background:none;
-webkit-box-shadow:none;
box-shadow:none;
color:#c23030; }
.bp3-button.bp3-minimal.bp3-intent-danger:hover{
background:rgba(219, 55, 55, 0.15);
color:#c23030; }
.bp3-button.bp3-minimal.bp3-intent-danger:active, .bp3-button.bp3-minimal.bp3-intent-danger.bp3-active{
background:rgba(219, 55, 55, 0.3);
color:#c23030; }
.bp3-button.bp3-minimal.bp3-intent-danger:disabled, .bp3-button.bp3-minimal.bp3-intent-danger.bp3-disabled{
background:none;
color:rgba(194, 48, 48, 0.5); }
.bp3-button.bp3-minimal.bp3-intent-danger:disabled.bp3-active, .bp3-button.bp3-minimal.bp3-intent-danger.bp3-disabled.bp3-active{
background:rgba(219, 55, 55, 0.3); }
.bp3-button.bp3-minimal.bp3-intent-danger .bp3-button-spinner .bp3-spinner-head{
stroke:#c23030; }
.bp3-dark .bp3-button.bp3-minimal.bp3-intent-danger{
color:#ff7373; }
.bp3-dark .bp3-button.bp3-minimal.bp3-intent-danger:hover{
background:rgba(219, 55, 55, 0.2);
color:#ff7373; }
.bp3-dark .bp3-button.bp3-minimal.bp3-intent-danger:active, .bp3-dark .bp3-button.bp3-minimal.bp3-intent-danger.bp3-active{
background:rgba(219, 55, 55, 0.3);
color:#ff7373; }
.bp3-dark .bp3-button.bp3-minimal.bp3-intent-danger:disabled, .bp3-dark .bp3-button.bp3-minimal.bp3-intent-danger.bp3-disabled{
background:none;
color:rgba(255, 115, 115, 0.5); }
.bp3-dark .bp3-button.bp3-minimal.bp3-intent-danger:disabled.bp3-active, .bp3-dark .bp3-button.bp3-minimal.bp3-intent-danger.bp3-disabled.bp3-active{
background:rgba(219, 55, 55, 0.3); }
.bp3-button.bp3-outlined{
background:none;
-webkit-box-shadow:none;
box-shadow:none;
border:1px solid rgba(24, 32, 38, 0.2);
-webkit-box-sizing:border-box;
box-sizing:border-box; }
.bp3-button.bp3-outlined:hover{
background:rgba(167, 182, 194, 0.3);
-webkit-box-shadow:none;
box-shadow:none;
color:#182026;
text-decoration:none; }
.bp3-button.bp3-outlined:active, .bp3-button.bp3-outlined.bp3-active{
background:rgba(115, 134, 148, 0.3);
-webkit-box-shadow:none;
box-shadow:none;
color:#182026; }
.bp3-button.bp3-outlined:disabled, .bp3-button.bp3-outlined:disabled:hover, .bp3-button.bp3-outlined.bp3-disabled, .bp3-button.bp3-outlined.bp3-disabled:hover{
background:none;
color:rgba(92, 112, 128, 0.6);
cursor:not-allowed; }
.bp3-button.bp3-outlined:disabled.bp3-active, .bp3-button.bp3-outlined:disabled:hover.bp3-active, .bp3-button.bp3-outlined.bp3-disabled.bp3-active, .bp3-button.bp3-outlined.bp3-disabled:hover.bp3-active{
background:rgba(115, 134, 148, 0.3); }
.bp3-dark .bp3-button.bp3-outlined{
background:none;
-webkit-box-shadow:none;
box-shadow:none;
color:inherit; }
.bp3-dark .bp3-button.bp3-outlined:hover, .bp3-dark .bp3-button.bp3-outlined:active, .bp3-dark .bp3-button.bp3-outlined.bp3-active{
background:none;
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-dark .bp3-button.bp3-outlined:hover{
background:rgba(138, 155, 168, 0.15); }
.bp3-dark .bp3-button.bp3-outlined:active, .bp3-dark .bp3-button.bp3-outlined.bp3-active{
background:rgba(138, 155, 168, 0.3);
color:#f5f8fa; }
.bp3-dark .bp3-button.bp3-outlined:disabled, .bp3-dark .bp3-button.bp3-outlined:disabled:hover, .bp3-dark .bp3-button.bp3-outlined.bp3-disabled, .bp3-dark .bp3-button.bp3-outlined.bp3-disabled:hover{
background:none;
color:rgba(167, 182, 194, 0.6);
cursor:not-allowed; }
.bp3-dark .bp3-button.bp3-outlined:disabled.bp3-active, .bp3-dark .bp3-button.bp3-outlined:disabled:hover.bp3-active, .bp3-dark .bp3-button.bp3-outlined.bp3-disabled.bp3-active, .bp3-dark .bp3-button.bp3-outlined.bp3-disabled:hover.bp3-active{
background:rgba(138, 155, 168, 0.3); }
.bp3-button.bp3-outlined.bp3-intent-primary{
color:#106ba3; }
.bp3-button.bp3-outlined.bp3-intent-primary:hover, .bp3-button.bp3-outlined.bp3-intent-primary:active, .bp3-button.bp3-outlined.bp3-intent-primary.bp3-active{
background:none;
-webkit-box-shadow:none;
box-shadow:none;
color:#106ba3; }
.bp3-button.bp3-outlined.bp3-intent-primary:hover{
background:rgba(19, 124, 189, 0.15);
color:#106ba3; }
.bp3-button.bp3-outlined.bp3-intent-primary:active, .bp3-button.bp3-outlined.bp3-intent-primary.bp3-active{
background:rgba(19, 124, 189, 0.3);
color:#106ba3; }
.bp3-button.bp3-outlined.bp3-intent-primary:disabled, .bp3-button.bp3-outlined.bp3-intent-primary.bp3-disabled{
background:none;
color:rgba(16, 107, 163, 0.5); }
.bp3-button.bp3-outlined.bp3-intent-primary:disabled.bp3-active, .bp3-button.bp3-outlined.bp3-intent-primary.bp3-disabled.bp3-active{
background:rgba(19, 124, 189, 0.3); }
.bp3-button.bp3-outlined.bp3-intent-primary .bp3-button-spinner .bp3-spinner-head{
stroke:#106ba3; }
.bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary{
color:#48aff0; }
.bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary:hover{
background:rgba(19, 124, 189, 0.2);
color:#48aff0; }
.bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary:active, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary.bp3-active{
background:rgba(19, 124, 189, 0.3);
color:#48aff0; }
.bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary:disabled, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary.bp3-disabled{
background:none;
color:rgba(72, 175, 240, 0.5); }
.bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary:disabled.bp3-active, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary.bp3-disabled.bp3-active{
background:rgba(19, 124, 189, 0.3); }
.bp3-button.bp3-outlined.bp3-intent-success{
color:#0d8050; }
.bp3-button.bp3-outlined.bp3-intent-success:hover, .bp3-button.bp3-outlined.bp3-intent-success:active, .bp3-button.bp3-outlined.bp3-intent-success.bp3-active{
background:none;
-webkit-box-shadow:none;
box-shadow:none;
color:#0d8050; }
.bp3-button.bp3-outlined.bp3-intent-success:hover{
background:rgba(15, 153, 96, 0.15);
color:#0d8050; }
.bp3-button.bp3-outlined.bp3-intent-success:active, .bp3-button.bp3-outlined.bp3-intent-success.bp3-active{
background:rgba(15, 153, 96, 0.3);
color:#0d8050; }
.bp3-button.bp3-outlined.bp3-intent-success:disabled, .bp3-button.bp3-outlined.bp3-intent-success.bp3-disabled{
background:none;
color:rgba(13, 128, 80, 0.5); }
.bp3-button.bp3-outlined.bp3-intent-success:disabled.bp3-active, .bp3-button.bp3-outlined.bp3-intent-success.bp3-disabled.bp3-active{
background:rgba(15, 153, 96, 0.3); }
.bp3-button.bp3-outlined.bp3-intent-success .bp3-button-spinner .bp3-spinner-head{
stroke:#0d8050; }
.bp3-dark .bp3-button.bp3-outlined.bp3-intent-success{
color:#3dcc91; }
.bp3-dark .bp3-button.bp3-outlined.bp3-intent-success:hover{
background:rgba(15, 153, 96, 0.2);
color:#3dcc91; }
.bp3-dark .bp3-button.bp3-outlined.bp3-intent-success:active, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-success.bp3-active{
background:rgba(15, 153, 96, 0.3);
color:#3dcc91; }
.bp3-dark .bp3-button.bp3-outlined.bp3-intent-success:disabled, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-success.bp3-disabled{
background:none;
color:rgba(61, 204, 145, 0.5); }
.bp3-dark .bp3-button.bp3-outlined.bp3-intent-success:disabled.bp3-active, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-success.bp3-disabled.bp3-active{
background:rgba(15, 153, 96, 0.3); }
.bp3-button.bp3-outlined.bp3-intent-warning{
color:#bf7326; }
.bp3-button.bp3-outlined.bp3-intent-warning:hover, .bp3-button.bp3-outlined.bp3-intent-warning:active, .bp3-button.bp3-outlined.bp3-intent-warning.bp3-active{
background:none;
-webkit-box-shadow:none;
box-shadow:none;
color:#bf7326; }
.bp3-button.bp3-outlined.bp3-intent-warning:hover{
background:rgba(217, 130, 43, 0.15);
color:#bf7326; }
.bp3-button.bp3-outlined.bp3-intent-warning:active, .bp3-button.bp3-outlined.bp3-intent-warning.bp3-active{
background:rgba(217, 130, 43, 0.3);
color:#bf7326; }
.bp3-button.bp3-outlined.bp3-intent-warning:disabled, .bp3-button.bp3-outlined.bp3-intent-warning.bp3-disabled{
background:none;
color:rgba(191, 115, 38, 0.5); }
.bp3-button.bp3-outlined.bp3-intent-warning:disabled.bp3-active, .bp3-button.bp3-outlined.bp3-intent-warning.bp3-disabled.bp3-active{
background:rgba(217, 130, 43, 0.3); }
.bp3-button.bp3-outlined.bp3-intent-warning .bp3-button-spinner .bp3-spinner-head{
stroke:#bf7326; }
.bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning{
color:#ffb366; }
.bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning:hover{
background:rgba(217, 130, 43, 0.2);
color:#ffb366; }
.bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning:active, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning.bp3-active{
background:rgba(217, 130, 43, 0.3);
color:#ffb366; }
.bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning:disabled, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning.bp3-disabled{
background:none;
color:rgba(255, 179, 102, 0.5); }
.bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning:disabled.bp3-active, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning.bp3-disabled.bp3-active{
background:rgba(217, 130, 43, 0.3); }
.bp3-button.bp3-outlined.bp3-intent-danger{
color:#c23030; }
.bp3-button.bp3-outlined.bp3-intent-danger:hover, .bp3-button.bp3-outlined.bp3-intent-danger:active, .bp3-button.bp3-outlined.bp3-intent-danger.bp3-active{
background:none;
-webkit-box-shadow:none;
box-shadow:none;
color:#c23030; }
.bp3-button.bp3-outlined.bp3-intent-danger:hover{
background:rgba(219, 55, 55, 0.15);
color:#c23030; }
.bp3-button.bp3-outlined.bp3-intent-danger:active, .bp3-button.bp3-outlined.bp3-intent-danger.bp3-active{
background:rgba(219, 55, 55, 0.3);
color:#c23030; }
.bp3-button.bp3-outlined.bp3-intent-danger:disabled, .bp3-button.bp3-outlined.bp3-intent-danger.bp3-disabled{
background:none;
color:rgba(194, 48, 48, 0.5); }
.bp3-button.bp3-outlined.bp3-intent-danger:disabled.bp3-active, .bp3-button.bp3-outlined.bp3-intent-danger.bp3-disabled.bp3-active{
background:rgba(219, 55, 55, 0.3); }
.bp3-button.bp3-outlined.bp3-intent-danger .bp3-button-spinner .bp3-spinner-head{
stroke:#c23030; }
.bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger{
color:#ff7373; }
.bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger:hover{
background:rgba(219, 55, 55, 0.2);
color:#ff7373; }
.bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger:active, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger.bp3-active{
background:rgba(219, 55, 55, 0.3);
color:#ff7373; }
.bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger:disabled, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger.bp3-disabled{
background:none;
color:rgba(255, 115, 115, 0.5); }
.bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger:disabled.bp3-active, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger.bp3-disabled.bp3-active{
background:rgba(219, 55, 55, 0.3); }
.bp3-button.bp3-outlined:disabled, .bp3-button.bp3-outlined.bp3-disabled, .bp3-button.bp3-outlined:disabled:hover, .bp3-button.bp3-outlined.bp3-disabled:hover{
border-color:rgba(92, 112, 128, 0.1); }
.bp3-dark .bp3-button.bp3-outlined{
border-color:rgba(255, 255, 255, 0.4); }
.bp3-dark .bp3-button.bp3-outlined:disabled, .bp3-dark .bp3-button.bp3-outlined:disabled:hover, .bp3-dark .bp3-button.bp3-outlined.bp3-disabled, .bp3-dark .bp3-button.bp3-outlined.bp3-disabled:hover{
border-color:rgba(255, 255, 255, 0.2); }
.bp3-button.bp3-outlined.bp3-intent-primary{
border-color:rgba(16, 107, 163, 0.6); }
.bp3-button.bp3-outlined.bp3-intent-primary:disabled, .bp3-button.bp3-outlined.bp3-intent-primary.bp3-disabled{
border-color:rgba(16, 107, 163, 0.2); }
.bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary{
border-color:rgba(72, 175, 240, 0.6); }
.bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary:disabled, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary.bp3-disabled{
border-color:rgba(72, 175, 240, 0.2); }
.bp3-button.bp3-outlined.bp3-intent-success{
border-color:rgba(13, 128, 80, 0.6); }
.bp3-button.bp3-outlined.bp3-intent-success:disabled, .bp3-button.bp3-outlined.bp3-intent-success.bp3-disabled{
border-color:rgba(13, 128, 80, 0.2); }
.bp3-dark .bp3-button.bp3-outlined.bp3-intent-success{
border-color:rgba(61, 204, 145, 0.6); }
.bp3-dark .bp3-button.bp3-outlined.bp3-intent-success:disabled, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-success.bp3-disabled{
border-color:rgba(61, 204, 145, 0.2); }
.bp3-button.bp3-outlined.bp3-intent-warning{
border-color:rgba(191, 115, 38, 0.6); }
.bp3-button.bp3-outlined.bp3-intent-warning:disabled, .bp3-button.bp3-outlined.bp3-intent-warning.bp3-disabled{
border-color:rgba(191, 115, 38, 0.2); }
.bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning{
border-color:rgba(255, 179, 102, 0.6); }
.bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning:disabled, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning.bp3-disabled{
border-color:rgba(255, 179, 102, 0.2); }
.bp3-button.bp3-outlined.bp3-intent-danger{
border-color:rgba(194, 48, 48, 0.6); }
.bp3-button.bp3-outlined.bp3-intent-danger:disabled, .bp3-button.bp3-outlined.bp3-intent-danger.bp3-disabled{
border-color:rgba(194, 48, 48, 0.2); }
.bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger{
border-color:rgba(255, 115, 115, 0.6); }
.bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger:disabled, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger.bp3-disabled{
border-color:rgba(255, 115, 115, 0.2); }
a.bp3-button{
text-align:center;
text-decoration:none;
-webkit-transition:none;
transition:none; }
a.bp3-button, a.bp3-button:hover, a.bp3-button:active{
color:#182026; }
a.bp3-button.bp3-disabled{
color:rgba(92, 112, 128, 0.6); }
.bp3-button-text{
-webkit-box-flex:0;
-ms-flex:0 1 auto;
flex:0 1 auto; }
.bp3-button.bp3-align-left .bp3-button-text, .bp3-button.bp3-align-right .bp3-button-text,
.bp3-button-group.bp3-align-left .bp3-button-text,
.bp3-button-group.bp3-align-right .bp3-button-text{
-webkit-box-flex:1;
-ms-flex:1 1 auto;
flex:1 1 auto; }
.bp3-button-group{
display:-webkit-inline-box;
display:-ms-inline-flexbox;
display:inline-flex; }
.bp3-button-group .bp3-button{
-webkit-box-flex:0;
-ms-flex:0 0 auto;
flex:0 0 auto;
position:relative;
z-index:4; }
.bp3-button-group .bp3-button:focus{
z-index:5; }
.bp3-button-group .bp3-button:hover{
z-index:6; }
.bp3-button-group .bp3-button:active, .bp3-button-group .bp3-button.bp3-active{
z-index:7; }
.bp3-button-group .bp3-button:disabled, .bp3-button-group .bp3-button.bp3-disabled{
z-index:3; }
.bp3-button-group .bp3-button[class*="bp3-intent-"]{
z-index:9; }
.bp3-button-group .bp3-button[class*="bp3-intent-"]:focus{
z-index:10; }
.bp3-button-group .bp3-button[class*="bp3-intent-"]:hover{
z-index:11; }
.bp3-button-group .bp3-button[class*="bp3-intent-"]:active, .bp3-button-group .bp3-button[class*="bp3-intent-"].bp3-active{
z-index:12; }
.bp3-button-group .bp3-button[class*="bp3-intent-"]:disabled, .bp3-button-group .bp3-button[class*="bp3-intent-"].bp3-disabled{
z-index:8; }
.bp3-button-group:not(.bp3-minimal) > .bp3-popover-wrapper:not(:first-child) .bp3-button,
.bp3-button-group:not(.bp3-minimal) > .bp3-button:not(:first-child){
border-bottom-left-radius:0;
border-top-left-radius:0; }
.bp3-button-group:not(.bp3-minimal) > .bp3-popover-wrapper:not(:last-child) .bp3-button,
.bp3-button-group:not(.bp3-minimal) > .bp3-button:not(:last-child){
border-bottom-right-radius:0;
border-top-right-radius:0;
margin-right:-1px; }
.bp3-button-group.bp3-minimal .bp3-button{
background:none;
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-button-group.bp3-minimal .bp3-button:hover{
background:rgba(167, 182, 194, 0.3);
-webkit-box-shadow:none;
box-shadow:none;
color:#182026;
text-decoration:none; }
.bp3-button-group.bp3-minimal .bp3-button:active, .bp3-button-group.bp3-minimal .bp3-button.bp3-active{
background:rgba(115, 134, 148, 0.3);
-webkit-box-shadow:none;
box-shadow:none;
color:#182026; }
.bp3-button-group.bp3-minimal .bp3-button:disabled, .bp3-button-group.bp3-minimal .bp3-button:disabled:hover, .bp3-button-group.bp3-minimal .bp3-button.bp3-disabled, .bp3-button-group.bp3-minimal .bp3-button.bp3-disabled:hover{
background:none;
color:rgba(92, 112, 128, 0.6);
cursor:not-allowed; }
.bp3-button-group.bp3-minimal .bp3-button:disabled.bp3-active, .bp3-button-group.bp3-minimal .bp3-button:disabled:hover.bp3-active, .bp3-button-group.bp3-minimal .bp3-button.bp3-disabled.bp3-active, .bp3-button-group.bp3-minimal .bp3-button.bp3-disabled:hover.bp3-active{
background:rgba(115, 134, 148, 0.3); }
.bp3-dark .bp3-button-group.bp3-minimal .bp3-button{
background:none;
-webkit-box-shadow:none;
box-shadow:none;
color:inherit; }
.bp3-dark .bp3-button-group.bp3-minimal .bp3-button:hover, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button:active, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-active{
background:none;
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-dark .bp3-button-group.bp3-minimal .bp3-button:hover{
background:rgba(138, 155, 168, 0.15); }
.bp3-dark .bp3-button-group.bp3-minimal .bp3-button:active, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-active{
background:rgba(138, 155, 168, 0.3);
color:#f5f8fa; }
.bp3-dark .bp3-button-group.bp3-minimal .bp3-button:disabled, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button:disabled:hover, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-disabled, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-disabled:hover{
background:none;
color:rgba(167, 182, 194, 0.6);
cursor:not-allowed; }
.bp3-dark .bp3-button-group.bp3-minimal .bp3-button:disabled.bp3-active, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button:disabled:hover.bp3-active, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-disabled.bp3-active, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-disabled:hover.bp3-active{
background:rgba(138, 155, 168, 0.3); }
.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary{
color:#106ba3; }
.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:hover, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:active, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary.bp3-active{
background:none;
-webkit-box-shadow:none;
box-shadow:none;
color:#106ba3; }
.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:hover{
background:rgba(19, 124, 189, 0.15);
color:#106ba3; }
.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:active, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary.bp3-active{
background:rgba(19, 124, 189, 0.3);
color:#106ba3; }
.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:disabled, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary.bp3-disabled{
background:none;
color:rgba(16, 107, 163, 0.5); }
.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:disabled.bp3-active, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary.bp3-disabled.bp3-active{
background:rgba(19, 124, 189, 0.3); }
.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary .bp3-button-spinner .bp3-spinner-head{
stroke:#106ba3; }
.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary{
color:#48aff0; }
.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:hover{
background:rgba(19, 124, 189, 0.2);
color:#48aff0; }
.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:active, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary.bp3-active{
background:rgba(19, 124, 189, 0.3);
color:#48aff0; }
.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:disabled, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary.bp3-disabled{
background:none;
color:rgba(72, 175, 240, 0.5); }
.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:disabled.bp3-active, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary.bp3-disabled.bp3-active{
background:rgba(19, 124, 189, 0.3); }
.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success{
color:#0d8050; }
.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:hover, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:active, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success.bp3-active{
background:none;
-webkit-box-shadow:none;
box-shadow:none;
color:#0d8050; }
.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:hover{
background:rgba(15, 153, 96, 0.15);
color:#0d8050; }
.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:active, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success.bp3-active{
background:rgba(15, 153, 96, 0.3);
color:#0d8050; }
.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:disabled, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success.bp3-disabled{
background:none;
color:rgba(13, 128, 80, 0.5); }
.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:disabled.bp3-active, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success.bp3-disabled.bp3-active{
background:rgba(15, 153, 96, 0.3); }
.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success .bp3-button-spinner .bp3-spinner-head{
stroke:#0d8050; }
.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success{
color:#3dcc91; }
.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:hover{
background:rgba(15, 153, 96, 0.2);
color:#3dcc91; }
.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:active, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success.bp3-active{
background:rgba(15, 153, 96, 0.3);
color:#3dcc91; }
.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:disabled, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success.bp3-disabled{
background:none;
color:rgba(61, 204, 145, 0.5); }
.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:disabled.bp3-active, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success.bp3-disabled.bp3-active{
background:rgba(15, 153, 96, 0.3); }
.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning{
color:#bf7326; }
.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:hover, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:active, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning.bp3-active{
background:none;
-webkit-box-shadow:none;
box-shadow:none;
color:#bf7326; }
.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:hover{
background:rgba(217, 130, 43, 0.15);
color:#bf7326; }
.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:active, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning.bp3-active{
background:rgba(217, 130, 43, 0.3);
color:#bf7326; }
.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:disabled, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning.bp3-disabled{
background:none;
color:rgba(191, 115, 38, 0.5); }
.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:disabled.bp3-active, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning.bp3-disabled.bp3-active{
background:rgba(217, 130, 43, 0.3); }
.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning .bp3-button-spinner .bp3-spinner-head{
stroke:#bf7326; }
.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning{
color:#ffb366; }
.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:hover{
background:rgba(217, 130, 43, 0.2);
color:#ffb366; }
.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:active, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning.bp3-active{
background:rgba(217, 130, 43, 0.3);
color:#ffb366; }
.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:disabled, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning.bp3-disabled{
background:none;
color:rgba(255, 179, 102, 0.5); }
.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:disabled.bp3-active, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning.bp3-disabled.bp3-active{
background:rgba(217, 130, 43, 0.3); }
.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger{
color:#c23030; }
.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:hover, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:active, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger.bp3-active{
background:none;
-webkit-box-shadow:none;
box-shadow:none;
color:#c23030; }
.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:hover{
background:rgba(219, 55, 55, 0.15);
color:#c23030; }
.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:active, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger.bp3-active{
background:rgba(219, 55, 55, 0.3);
color:#c23030; }
.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:disabled, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger.bp3-disabled{
background:none;
color:rgba(194, 48, 48, 0.5); }
.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:disabled.bp3-active, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger.bp3-disabled.bp3-active{
background:rgba(219, 55, 55, 0.3); }
.bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger .bp3-button-spinner .bp3-spinner-head{
stroke:#c23030; }
.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger{
color:#ff7373; }
.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:hover{
background:rgba(219, 55, 55, 0.2);
color:#ff7373; }
.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:active, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger.bp3-active{
background:rgba(219, 55, 55, 0.3);
color:#ff7373; }
.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:disabled, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger.bp3-disabled{
background:none;
color:rgba(255, 115, 115, 0.5); }
.bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:disabled.bp3-active, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger.bp3-disabled.bp3-active{
background:rgba(219, 55, 55, 0.3); }
.bp3-button-group .bp3-popover-wrapper,
.bp3-button-group .bp3-popover-target{
display:-webkit-box;
display:-ms-flexbox;
display:flex;
-webkit-box-flex:1;
-ms-flex:1 1 auto;
flex:1 1 auto; }
.bp3-button-group.bp3-fill{
display:-webkit-box;
display:-ms-flexbox;
display:flex;
width:100%; }
.bp3-button-group .bp3-button.bp3-fill,
.bp3-button-group.bp3-fill .bp3-button:not(.bp3-fixed){
-webkit-box-flex:1;
-ms-flex:1 1 auto;
flex:1 1 auto; }
.bp3-button-group.bp3-vertical{
-webkit-box-align:stretch;
-ms-flex-align:stretch;
align-items:stretch;
-webkit-box-orient:vertical;
-webkit-box-direction:normal;
-ms-flex-direction:column;
flex-direction:column;
vertical-align:top; }
.bp3-button-group.bp3-vertical.bp3-fill{
height:100%;
width:unset; }
.bp3-button-group.bp3-vertical .bp3-button{
margin-right:0 !important;
width:100%; }
.bp3-button-group.bp3-vertical:not(.bp3-minimal) > .bp3-popover-wrapper:first-child .bp3-button,
.bp3-button-group.bp3-vertical:not(.bp3-minimal) > .bp3-button:first-child{
border-radius:3px 3px 0 0; }
.bp3-button-group.bp3-vertical:not(.bp3-minimal) > .bp3-popover-wrapper:last-child .bp3-button,
.bp3-button-group.bp3-vertical:not(.bp3-minimal) > .bp3-button:last-child{
border-radius:0 0 3px 3px; }
.bp3-button-group.bp3-vertical:not(.bp3-minimal) > .bp3-popover-wrapper:not(:last-child) .bp3-button,
.bp3-button-group.bp3-vertical:not(.bp3-minimal) > .bp3-button:not(:last-child){
margin-bottom:-1px; }
.bp3-button-group.bp3-align-left .bp3-button{
text-align:left; }
.bp3-dark .bp3-button-group:not(.bp3-minimal) > .bp3-popover-wrapper:not(:last-child) .bp3-button,
.bp3-dark .bp3-button-group:not(.bp3-minimal) > .bp3-button:not(:last-child){
margin-right:1px; }
.bp3-dark .bp3-button-group.bp3-vertical > .bp3-popover-wrapper:not(:last-child) .bp3-button,
.bp3-dark .bp3-button-group.bp3-vertical > .bp3-button:not(:last-child){
margin-bottom:1px; }
.bp3-callout{
font-size:14px;
line-height:1.5;
background-color:rgba(138, 155, 168, 0.15);
border-radius:3px;
padding:10px 12px 9px;
position:relative;
width:100%; }
.bp3-callout[class*="bp3-icon-"]{
padding-left:40px; }
.bp3-callout[class*="bp3-icon-"]::before{
font-family:"Icons20", sans-serif;
font-size:20px;
font-style:normal;
font-weight:400;
line-height:1;
-moz-osx-font-smoothing:grayscale;
-webkit-font-smoothing:antialiased;
color:#5c7080;
left:10px;
position:absolute;
top:10px; }
.bp3-callout.bp3-callout-icon{
padding-left:40px; }
.bp3-callout.bp3-callout-icon > .bp3-icon:first-child{
color:#5c7080;
left:10px;
position:absolute;
top:10px; }
.bp3-callout .bp3-heading{
line-height:20px;
margin-bottom:5px;
margin-top:0; }
.bp3-callout .bp3-heading:last-child{
margin-bottom:0; }
.bp3-dark .bp3-callout{
background-color:rgba(138, 155, 168, 0.2); }
.bp3-dark .bp3-callout[class*="bp3-icon-"]::before{
color:#a7b6c2; }
.bp3-callout.bp3-intent-primary{
background-color:rgba(19, 124, 189, 0.15); }
.bp3-callout.bp3-intent-primary[class*="bp3-icon-"]::before,
.bp3-callout.bp3-intent-primary > .bp3-icon:first-child,
.bp3-callout.bp3-intent-primary .bp3-heading{
color:#106ba3; }
.bp3-dark .bp3-callout.bp3-intent-primary{
background-color:rgba(19, 124, 189, 0.25); }
.bp3-dark .bp3-callout.bp3-intent-primary[class*="bp3-icon-"]::before,
.bp3-dark .bp3-callout.bp3-intent-primary > .bp3-icon:first-child,
.bp3-dark .bp3-callout.bp3-intent-primary .bp3-heading{
color:#48aff0; }
.bp3-callout.bp3-intent-success{
background-color:rgba(15, 153, 96, 0.15); }
.bp3-callout.bp3-intent-success[class*="bp3-icon-"]::before,
.bp3-callout.bp3-intent-success > .bp3-icon:first-child,
.bp3-callout.bp3-intent-success .bp3-heading{
color:#0d8050; }
.bp3-dark .bp3-callout.bp3-intent-success{
background-color:rgba(15, 153, 96, 0.25); }
.bp3-dark .bp3-callout.bp3-intent-success[class*="bp3-icon-"]::before,
.bp3-dark .bp3-callout.bp3-intent-success > .bp3-icon:first-child,
.bp3-dark .bp3-callout.bp3-intent-success .bp3-heading{
color:#3dcc91; }
.bp3-callout.bp3-intent-warning{
background-color:rgba(217, 130, 43, 0.15); }
.bp3-callout.bp3-intent-warning[class*="bp3-icon-"]::before,
.bp3-callout.bp3-intent-warning > .bp3-icon:first-child,
.bp3-callout.bp3-intent-warning .bp3-heading{
color:#bf7326; }
.bp3-dark .bp3-callout.bp3-intent-warning{
background-color:rgba(217, 130, 43, 0.25); }
.bp3-dark .bp3-callout.bp3-intent-warning[class*="bp3-icon-"]::before,
.bp3-dark .bp3-callout.bp3-intent-warning > .bp3-icon:first-child,
.bp3-dark .bp3-callout.bp3-intent-warning .bp3-heading{
color:#ffb366; }
.bp3-callout.bp3-intent-danger{
background-color:rgba(219, 55, 55, 0.15); }
.bp3-callout.bp3-intent-danger[class*="bp3-icon-"]::before,
.bp3-callout.bp3-intent-danger > .bp3-icon:first-child,
.bp3-callout.bp3-intent-danger .bp3-heading{
color:#c23030; }
.bp3-dark .bp3-callout.bp3-intent-danger{
background-color:rgba(219, 55, 55, 0.25); }
.bp3-dark .bp3-callout.bp3-intent-danger[class*="bp3-icon-"]::before,
.bp3-dark .bp3-callout.bp3-intent-danger > .bp3-icon:first-child,
.bp3-dark .bp3-callout.bp3-intent-danger .bp3-heading{
color:#ff7373; }
.bp3-running-text .bp3-callout{
margin:20px 0; }
.bp3-card{
background-color:#ffffff;
border-radius:3px;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.15), 0 0 0 rgba(16, 22, 26, 0), 0 0 0 rgba(16, 22, 26, 0);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.15), 0 0 0 rgba(16, 22, 26, 0), 0 0 0 rgba(16, 22, 26, 0);
padding:20px;
-webkit-transition:-webkit-transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9), -webkit-box-shadow 200ms cubic-bezier(0.4, 1, 0.75, 0.9);
transition:-webkit-transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9), -webkit-box-shadow 200ms cubic-bezier(0.4, 1, 0.75, 0.9);
transition:transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9), box-shadow 200ms cubic-bezier(0.4, 1, 0.75, 0.9);
transition:transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9), box-shadow 200ms cubic-bezier(0.4, 1, 0.75, 0.9), -webkit-transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9), -webkit-box-shadow 200ms cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-card.bp3-dark,
.bp3-dark .bp3-card{
background-color:#30404d;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4), 0 0 0 rgba(16, 22, 26, 0), 0 0 0 rgba(16, 22, 26, 0);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4), 0 0 0 rgba(16, 22, 26, 0), 0 0 0 rgba(16, 22, 26, 0); }
.bp3-elevation-0{
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.15), 0 0 0 rgba(16, 22, 26, 0), 0 0 0 rgba(16, 22, 26, 0);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.15), 0 0 0 rgba(16, 22, 26, 0), 0 0 0 rgba(16, 22, 26, 0); }
.bp3-elevation-0.bp3-dark,
.bp3-dark .bp3-elevation-0{
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4), 0 0 0 rgba(16, 22, 26, 0), 0 0 0 rgba(16, 22, 26, 0);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4), 0 0 0 rgba(16, 22, 26, 0), 0 0 0 rgba(16, 22, 26, 0); }
.bp3-elevation-1{
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-elevation-1.bp3-dark,
.bp3-dark .bp3-elevation-1{
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.4); }
.bp3-elevation-2{
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 1px 1px rgba(16, 22, 26, 0.2), 0 2px 6px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 1px 1px rgba(16, 22, 26, 0.2), 0 2px 6px rgba(16, 22, 26, 0.2); }
.bp3-elevation-2.bp3-dark,
.bp3-dark .bp3-elevation-2{
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 1px 1px rgba(16, 22, 26, 0.4), 0 2px 6px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 1px 1px rgba(16, 22, 26, 0.4), 0 2px 6px rgba(16, 22, 26, 0.4); }
.bp3-elevation-3{
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2); }
.bp3-elevation-3.bp3-dark,
.bp3-dark .bp3-elevation-3{
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4); }
.bp3-elevation-4{
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 4px 8px rgba(16, 22, 26, 0.2), 0 18px 46px 6px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 4px 8px rgba(16, 22, 26, 0.2), 0 18px 46px 6px rgba(16, 22, 26, 0.2); }
.bp3-elevation-4.bp3-dark,
.bp3-dark .bp3-elevation-4{
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 4px 8px rgba(16, 22, 26, 0.4), 0 18px 46px 6px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 4px 8px rgba(16, 22, 26, 0.4), 0 18px 46px 6px rgba(16, 22, 26, 0.4); }
.bp3-card.bp3-interactive:hover{
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2);
cursor:pointer; }
.bp3-card.bp3-interactive:hover.bp3-dark,
.bp3-dark .bp3-card.bp3-interactive:hover{
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4); }
.bp3-card.bp3-interactive:active{
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.2);
opacity:0.9;
-webkit-transition-duration:0;
transition-duration:0; }
.bp3-card.bp3-interactive:active.bp3-dark,
.bp3-dark .bp3-card.bp3-interactive:active{
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.4); }
.bp3-collapse{
height:0;
overflow-y:hidden;
-webkit-transition:height 200ms cubic-bezier(0.4, 1, 0.75, 0.9);
transition:height 200ms cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-collapse .bp3-collapse-body{
-webkit-transition:-webkit-transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9);
transition:-webkit-transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9);
transition:transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9);
transition:transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9), -webkit-transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-collapse .bp3-collapse-body[aria-hidden="true"]{
display:none; }
.bp3-context-menu .bp3-popover-target{
display:block; }
.bp3-context-menu-popover-target{
position:fixed; }
.bp3-divider{
border-bottom:1px solid rgba(16, 22, 26, 0.15);
border-right:1px solid rgba(16, 22, 26, 0.15);
margin:5px; }
.bp3-dark .bp3-divider{
border-color:rgba(16, 22, 26, 0.4); }
.bp3-dialog-container{
opacity:1;
-webkit-transform:scale(1);
transform:scale(1);
-webkit-box-align:center;
-ms-flex-align:center;
align-items:center;
display:-webkit-box;
display:-ms-flexbox;
display:flex;
-webkit-box-pack:center;
-ms-flex-pack:center;
justify-content:center;
min-height:100%;
pointer-events:none;
-webkit-user-select:none;
-moz-user-select:none;
-ms-user-select:none;
user-select:none;
width:100%; }
.bp3-dialog-container.bp3-overlay-enter > .bp3-dialog, .bp3-dialog-container.bp3-overlay-appear > .bp3-dialog{
opacity:0;
-webkit-transform:scale(0.5);
transform:scale(0.5); }
.bp3-dialog-container.bp3-overlay-enter-active > .bp3-dialog, .bp3-dialog-container.bp3-overlay-appear-active > .bp3-dialog{
opacity:1;
-webkit-transform:scale(1);
transform:scale(1);
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:300ms;
transition-duration:300ms;
-webkit-transition-property:opacity, -webkit-transform;
transition-property:opacity, -webkit-transform;
transition-property:opacity, transform;
transition-property:opacity, transform, -webkit-transform;
-webkit-transition-timing-function:cubic-bezier(0.54, 1.12, 0.38, 1.11);
transition-timing-function:cubic-bezier(0.54, 1.12, 0.38, 1.11); }
.bp3-dialog-container.bp3-overlay-exit > .bp3-dialog{
opacity:1;
-webkit-transform:scale(1);
transform:scale(1); }
.bp3-dialog-container.bp3-overlay-exit-active > .bp3-dialog{
opacity:0;
-webkit-transform:scale(0.5);
transform:scale(0.5);
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:300ms;
transition-duration:300ms;
-webkit-transition-property:opacity, -webkit-transform;
transition-property:opacity, -webkit-transform;
transition-property:opacity, transform;
transition-property:opacity, transform, -webkit-transform;
-webkit-transition-timing-function:cubic-bezier(0.54, 1.12, 0.38, 1.11);
transition-timing-function:cubic-bezier(0.54, 1.12, 0.38, 1.11); }
.bp3-dialog{
background:#ebf1f5;
border-radius:6px;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 4px 8px rgba(16, 22, 26, 0.2), 0 18px 46px 6px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 4px 8px rgba(16, 22, 26, 0.2), 0 18px 46px 6px rgba(16, 22, 26, 0.2);
display:-webkit-box;
display:-ms-flexbox;
display:flex;
-webkit-box-orient:vertical;
-webkit-box-direction:normal;
-ms-flex-direction:column;
flex-direction:column;
margin:30px 0;
padding-bottom:20px;
pointer-events:all;
-webkit-user-select:text;
-moz-user-select:text;
-ms-user-select:text;
user-select:text;
width:500px; }
.bp3-dialog:focus{
outline:0; }
.bp3-dialog.bp3-dark,
.bp3-dark .bp3-dialog{
background:#293742;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 4px 8px rgba(16, 22, 26, 0.4), 0 18px 46px 6px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 4px 8px rgba(16, 22, 26, 0.4), 0 18px 46px 6px rgba(16, 22, 26, 0.4);
color:#f5f8fa; }
.bp3-dialog-header{
-webkit-box-align:center;
-ms-flex-align:center;
align-items:center;
background:#ffffff;
border-radius:6px 6px 0 0;
-webkit-box-shadow:0 1px 0 rgba(16, 22, 26, 0.15);
box-shadow:0 1px 0 rgba(16, 22, 26, 0.15);
display:-webkit-box;
display:-ms-flexbox;
display:flex;
-webkit-box-flex:0;
-ms-flex:0 0 auto;
flex:0 0 auto;
min-height:40px;
padding-left:20px;
padding-right:5px;
z-index:30; }
.bp3-dialog-header .bp3-icon-large,
.bp3-dialog-header .bp3-icon{
color:#5c7080;
-webkit-box-flex:0;
-ms-flex:0 0 auto;
flex:0 0 auto;
margin-right:10px; }
.bp3-dialog-header .bp3-heading{
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
word-wrap:normal;
-webkit-box-flex:1;
-ms-flex:1 1 auto;
flex:1 1 auto;
line-height:inherit;
margin:0; }
.bp3-dialog-header .bp3-heading:last-child{
margin-right:20px; }
.bp3-dark .bp3-dialog-header{
background:#30404d;
-webkit-box-shadow:0 1px 0 rgba(16, 22, 26, 0.4);
box-shadow:0 1px 0 rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-dialog-header .bp3-icon-large,
.bp3-dark .bp3-dialog-header .bp3-icon{
color:#a7b6c2; }
.bp3-dialog-body{
-webkit-box-flex:1;
-ms-flex:1 1 auto;
flex:1 1 auto;
line-height:18px;
margin:20px; }
.bp3-dialog-footer{
-webkit-box-flex:0;
-ms-flex:0 0 auto;
flex:0 0 auto;
margin:0 20px; }
.bp3-dialog-footer-actions{
display:-webkit-box;
display:-ms-flexbox;
display:flex;
-webkit-box-pack:end;
-ms-flex-pack:end;
justify-content:flex-end; }
.bp3-dialog-footer-actions .bp3-button{
margin-left:10px; }
.bp3-multistep-dialog-panels{
display:-webkit-box;
display:-ms-flexbox;
display:flex; }
.bp3-multistep-dialog-left-panel{
display:-webkit-box;
display:-ms-flexbox;
display:flex;
-webkit-box-flex:1;
-ms-flex:1;
flex:1;
-webkit-box-orient:vertical;
-webkit-box-direction:normal;
-ms-flex-direction:column;
flex-direction:column; }
.bp3-dark .bp3-multistep-dialog-left-panel{
background:#202b33; }
.bp3-multistep-dialog-right-panel{
background-color:#f5f8fa;
border-left:1px solid rgba(16, 22, 26, 0.15);
border-radius:0 0 6px 0;
-webkit-box-flex:3;
-ms-flex:3;
flex:3;
min-width:0; }
.bp3-dark .bp3-multistep-dialog-right-panel{
background-color:#293742;
border-left:1px solid rgba(16, 22, 26, 0.4); }
.bp3-multistep-dialog-footer{
background-color:#ffffff;
border-radius:0 0 6px 0;
border-top:1px solid rgba(16, 22, 26, 0.15);
padding:10px; }
.bp3-dark .bp3-multistep-dialog-footer{
background:#30404d;
border-top:1px solid rgba(16, 22, 26, 0.4); }
.bp3-dialog-step-container{
background-color:#f5f8fa;
border-bottom:1px solid rgba(16, 22, 26, 0.15); }
.bp3-dark .bp3-dialog-step-container{
background:#293742;
border-bottom:1px solid rgba(16, 22, 26, 0.4); }
.bp3-dialog-step-container.bp3-dialog-step-viewed{
background-color:#ffffff; }
.bp3-dark .bp3-dialog-step-container.bp3-dialog-step-viewed{
background:#30404d; }
.bp3-dialog-step{
-webkit-box-align:center;
-ms-flex-align:center;
align-items:center;
background-color:#f5f8fa;
border-radius:6px;
cursor:not-allowed;
display:-webkit-box;
display:-ms-flexbox;
display:flex;
margin:4px;
padding:6px 14px; }
.bp3-dark .bp3-dialog-step{
background:#293742; }
.bp3-dialog-step-viewed .bp3-dialog-step{
background-color:#ffffff;
cursor:pointer; }
.bp3-dark .bp3-dialog-step-viewed .bp3-dialog-step{
background:#30404d; }
.bp3-dialog-step:hover{
background-color:#f5f8fa; }
.bp3-dark .bp3-dialog-step:hover{
background:#293742; }
.bp3-dialog-step-icon{
-webkit-box-align:center;
-ms-flex-align:center;
align-items:center;
background-color:rgba(92, 112, 128, 0.6);
border-radius:50%;
color:#ffffff;
display:-webkit-box;
display:-ms-flexbox;
display:flex;
height:25px;
-webkit-box-pack:center;
-ms-flex-pack:center;
justify-content:center;
width:25px; }
.bp3-dark .bp3-dialog-step-icon{
background-color:rgba(167, 182, 194, 0.6); }
.bp3-active.bp3-dialog-step-viewed .bp3-dialog-step-icon{
background-color:#2b95d6; }
.bp3-dialog-step-viewed .bp3-dialog-step-icon{
background-color:#8a9ba8; }
.bp3-dialog-step-title{
color:rgba(92, 112, 128, 0.6);
-webkit-box-flex:1;
-ms-flex:1;
flex:1;
padding-left:10px; }
.bp3-dark .bp3-dialog-step-title{
color:rgba(167, 182, 194, 0.6); }
.bp3-active.bp3-dialog-step-viewed .bp3-dialog-step-title{
color:#2b95d6; }
.bp3-dialog-step-viewed:not(.bp3-active) .bp3-dialog-step-title{
color:#182026; }
.bp3-dark .bp3-dialog-step-viewed:not(.bp3-active) .bp3-dialog-step-title{
color:#f5f8fa; }
.bp3-drawer{
background:#ffffff;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 4px 8px rgba(16, 22, 26, 0.2), 0 18px 46px 6px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 4px 8px rgba(16, 22, 26, 0.2), 0 18px 46px 6px rgba(16, 22, 26, 0.2);
display:-webkit-box;
display:-ms-flexbox;
display:flex;
-webkit-box-orient:vertical;
-webkit-box-direction:normal;
-ms-flex-direction:column;
flex-direction:column;
margin:0;
padding:0; }
.bp3-drawer:focus{
outline:0; }
.bp3-drawer.bp3-position-top{
height:50%;
left:0;
right:0;
top:0; }
.bp3-drawer.bp3-position-top.bp3-overlay-enter, .bp3-drawer.bp3-position-top.bp3-overlay-appear{
-webkit-transform:translateY(-100%);
transform:translateY(-100%); }
.bp3-drawer.bp3-position-top.bp3-overlay-enter-active, .bp3-drawer.bp3-position-top.bp3-overlay-appear-active{
-webkit-transform:translateY(0);
transform:translateY(0);
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:200ms;
transition-duration:200ms;
-webkit-transition-property:-webkit-transform;
transition-property:-webkit-transform;
transition-property:transform;
transition-property:transform, -webkit-transform;
-webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-drawer.bp3-position-top.bp3-overlay-exit{
-webkit-transform:translateY(0);
transform:translateY(0); }
.bp3-drawer.bp3-position-top.bp3-overlay-exit-active{
-webkit-transform:translateY(-100%);
transform:translateY(-100%);
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:100ms;
transition-duration:100ms;
-webkit-transition-property:-webkit-transform;
transition-property:-webkit-transform;
transition-property:transform;
transition-property:transform, -webkit-transform;
-webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-drawer.bp3-position-bottom{
bottom:0;
height:50%;
left:0;
right:0; }
.bp3-drawer.bp3-position-bottom.bp3-overlay-enter, .bp3-drawer.bp3-position-bottom.bp3-overlay-appear{
-webkit-transform:translateY(100%);
transform:translateY(100%); }
.bp3-drawer.bp3-position-bottom.bp3-overlay-enter-active, .bp3-drawer.bp3-position-bottom.bp3-overlay-appear-active{
-webkit-transform:translateY(0);
transform:translateY(0);
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:200ms;
transition-duration:200ms;
-webkit-transition-property:-webkit-transform;
transition-property:-webkit-transform;
transition-property:transform;
transition-property:transform, -webkit-transform;
-webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-drawer.bp3-position-bottom.bp3-overlay-exit{
-webkit-transform:translateY(0);
transform:translateY(0); }
.bp3-drawer.bp3-position-bottom.bp3-overlay-exit-active{
-webkit-transform:translateY(100%);
transform:translateY(100%);
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:100ms;
transition-duration:100ms;
-webkit-transition-property:-webkit-transform;
transition-property:-webkit-transform;
transition-property:transform;
transition-property:transform, -webkit-transform;
-webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-drawer.bp3-position-left{
bottom:0;
left:0;
top:0;
width:50%; }
.bp3-drawer.bp3-position-left.bp3-overlay-enter, .bp3-drawer.bp3-position-left.bp3-overlay-appear{
-webkit-transform:translateX(-100%);
transform:translateX(-100%); }
.bp3-drawer.bp3-position-left.bp3-overlay-enter-active, .bp3-drawer.bp3-position-left.bp3-overlay-appear-active{
-webkit-transform:translateX(0);
transform:translateX(0);
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:200ms;
transition-duration:200ms;
-webkit-transition-property:-webkit-transform;
transition-property:-webkit-transform;
transition-property:transform;
transition-property:transform, -webkit-transform;
-webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-drawer.bp3-position-left.bp3-overlay-exit{
-webkit-transform:translateX(0);
transform:translateX(0); }
.bp3-drawer.bp3-position-left.bp3-overlay-exit-active{
-webkit-transform:translateX(-100%);
transform:translateX(-100%);
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:100ms;
transition-duration:100ms;
-webkit-transition-property:-webkit-transform;
transition-property:-webkit-transform;
transition-property:transform;
transition-property:transform, -webkit-transform;
-webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-drawer.bp3-position-right{
bottom:0;
right:0;
top:0;
width:50%; }
.bp3-drawer.bp3-position-right.bp3-overlay-enter, .bp3-drawer.bp3-position-right.bp3-overlay-appear{
-webkit-transform:translateX(100%);
transform:translateX(100%); }
.bp3-drawer.bp3-position-right.bp3-overlay-enter-active, .bp3-drawer.bp3-position-right.bp3-overlay-appear-active{
-webkit-transform:translateX(0);
transform:translateX(0);
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:200ms;
transition-duration:200ms;
-webkit-transition-property:-webkit-transform;
transition-property:-webkit-transform;
transition-property:transform;
transition-property:transform, -webkit-transform;
-webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-drawer.bp3-position-right.bp3-overlay-exit{
-webkit-transform:translateX(0);
transform:translateX(0); }
.bp3-drawer.bp3-position-right.bp3-overlay-exit-active{
-webkit-transform:translateX(100%);
transform:translateX(100%);
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:100ms;
transition-duration:100ms;
-webkit-transition-property:-webkit-transform;
transition-property:-webkit-transform;
transition-property:transform;
transition-property:transform, -webkit-transform;
-webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(
.bp3-position-right):not(.bp3-vertical){
bottom:0;
right:0;
top:0;
width:50%; }
.bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(
.bp3-position-right):not(.bp3-vertical).bp3-overlay-enter, .bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(
.bp3-position-right):not(.bp3-vertical).bp3-overlay-appear{
-webkit-transform:translateX(100%);
transform:translateX(100%); }
.bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(
.bp3-position-right):not(.bp3-vertical).bp3-overlay-enter-active, .bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(
.bp3-position-right):not(.bp3-vertical).bp3-overlay-appear-active{
-webkit-transform:translateX(0);
transform:translateX(0);
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:200ms;
transition-duration:200ms;
-webkit-transition-property:-webkit-transform;
transition-property:-webkit-transform;
transition-property:transform;
transition-property:transform, -webkit-transform;
-webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(
.bp3-position-right):not(.bp3-vertical).bp3-overlay-exit{
-webkit-transform:translateX(0);
transform:translateX(0); }
.bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(
.bp3-position-right):not(.bp3-vertical).bp3-overlay-exit-active{
-webkit-transform:translateX(100%);
transform:translateX(100%);
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:100ms;
transition-duration:100ms;
-webkit-transition-property:-webkit-transform;
transition-property:-webkit-transform;
transition-property:transform;
transition-property:transform, -webkit-transform;
-webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(
.bp3-position-right).bp3-vertical{
bottom:0;
height:50%;
left:0;
right:0; }
.bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(
.bp3-position-right).bp3-vertical.bp3-overlay-enter, .bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(
.bp3-position-right).bp3-vertical.bp3-overlay-appear{
-webkit-transform:translateY(100%);
transform:translateY(100%); }
.bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(
.bp3-position-right).bp3-vertical.bp3-overlay-enter-active, .bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(
.bp3-position-right).bp3-vertical.bp3-overlay-appear-active{
-webkit-transform:translateY(0);
transform:translateY(0);
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:200ms;
transition-duration:200ms;
-webkit-transition-property:-webkit-transform;
transition-property:-webkit-transform;
transition-property:transform;
transition-property:transform, -webkit-transform;
-webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(
.bp3-position-right).bp3-vertical.bp3-overlay-exit{
-webkit-transform:translateY(0);
transform:translateY(0); }
.bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(
.bp3-position-right).bp3-vertical.bp3-overlay-exit-active{
-webkit-transform:translateY(100%);
transform:translateY(100%);
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:100ms;
transition-duration:100ms;
-webkit-transition-property:-webkit-transform;
transition-property:-webkit-transform;
transition-property:transform;
transition-property:transform, -webkit-transform;
-webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-drawer.bp3-dark,
.bp3-dark .bp3-drawer{
background:#30404d;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 4px 8px rgba(16, 22, 26, 0.4), 0 18px 46px 6px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 4px 8px rgba(16, 22, 26, 0.4), 0 18px 46px 6px rgba(16, 22, 26, 0.4);
color:#f5f8fa; }
.bp3-drawer-header{
-webkit-box-align:center;
-ms-flex-align:center;
align-items:center;
border-radius:0;
-webkit-box-shadow:0 1px 0 rgba(16, 22, 26, 0.15);
box-shadow:0 1px 0 rgba(16, 22, 26, 0.15);
display:-webkit-box;
display:-ms-flexbox;
display:flex;
-webkit-box-flex:0;
-ms-flex:0 0 auto;
flex:0 0 auto;
min-height:40px;
padding:5px;
padding-left:20px;
position:relative; }
.bp3-drawer-header .bp3-icon-large,
.bp3-drawer-header .bp3-icon{
color:#5c7080;
-webkit-box-flex:0;
-ms-flex:0 0 auto;
flex:0 0 auto;
margin-right:10px; }
.bp3-drawer-header .bp3-heading{
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
word-wrap:normal;
-webkit-box-flex:1;
-ms-flex:1 1 auto;
flex:1 1 auto;
line-height:inherit;
margin:0; }
.bp3-drawer-header .bp3-heading:last-child{
margin-right:20px; }
.bp3-dark .bp3-drawer-header{
-webkit-box-shadow:0 1px 0 rgba(16, 22, 26, 0.4);
box-shadow:0 1px 0 rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-drawer-header .bp3-icon-large,
.bp3-dark .bp3-drawer-header .bp3-icon{
color:#a7b6c2; }
.bp3-drawer-body{
-webkit-box-flex:1;
-ms-flex:1 1 auto;
flex:1 1 auto;
line-height:18px;
overflow:auto; }
.bp3-drawer-footer{
-webkit-box-shadow:inset 0 1px 0 rgba(16, 22, 26, 0.15);
box-shadow:inset 0 1px 0 rgba(16, 22, 26, 0.15);
-webkit-box-flex:0;
-ms-flex:0 0 auto;
flex:0 0 auto;
padding:10px 20px;
position:relative; }
.bp3-dark .bp3-drawer-footer{
-webkit-box-shadow:inset 0 1px 0 rgba(16, 22, 26, 0.4);
box-shadow:inset 0 1px 0 rgba(16, 22, 26, 0.4); }
.bp3-editable-text{
cursor:text;
display:inline-block;
max-width:100%;
position:relative;
vertical-align:top;
white-space:nowrap; }
.bp3-editable-text::before{
bottom:-3px;
left:-3px;
position:absolute;
right:-3px;
top:-3px;
border-radius:3px;
content:"";
-webkit-transition:background-color 100ms cubic-bezier(0.4, 1, 0.75, 0.9), -webkit-box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9);
transition:background-color 100ms cubic-bezier(0.4, 1, 0.75, 0.9), -webkit-box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9);
transition:background-color 100ms cubic-bezier(0.4, 1, 0.75, 0.9), box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9);
transition:background-color 100ms cubic-bezier(0.4, 1, 0.75, 0.9), box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9), -webkit-box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-editable-text:hover::before{
-webkit-box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(16, 22, 26, 0.15);
box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(16, 22, 26, 0.15); }
.bp3-editable-text.bp3-editable-text-editing::before{
background-color:#ffffff;
-webkit-box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-editable-text.bp3-disabled::before{
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-editable-text.bp3-intent-primary .bp3-editable-text-input,
.bp3-editable-text.bp3-intent-primary .bp3-editable-text-content{
color:#137cbd; }
.bp3-editable-text.bp3-intent-primary:hover::before{
-webkit-box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(19, 124, 189, 0.4);
box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(19, 124, 189, 0.4); }
.bp3-editable-text.bp3-intent-primary.bp3-editable-text-editing::before{
-webkit-box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-editable-text.bp3-intent-success .bp3-editable-text-input,
.bp3-editable-text.bp3-intent-success .bp3-editable-text-content{
color:#0f9960; }
.bp3-editable-text.bp3-intent-success:hover::before{
-webkit-box-shadow:0 0 0 0 rgba(15, 153, 96, 0), 0 0 0 0 rgba(15, 153, 96, 0), inset 0 0 0 1px rgba(15, 153, 96, 0.4);
box-shadow:0 0 0 0 rgba(15, 153, 96, 0), 0 0 0 0 rgba(15, 153, 96, 0), inset 0 0 0 1px rgba(15, 153, 96, 0.4); }
.bp3-editable-text.bp3-intent-success.bp3-editable-text-editing::before{
-webkit-box-shadow:0 0 0 1px #0f9960, 0 0 0 3px rgba(15, 153, 96, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px #0f9960, 0 0 0 3px rgba(15, 153, 96, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-editable-text.bp3-intent-warning .bp3-editable-text-input,
.bp3-editable-text.bp3-intent-warning .bp3-editable-text-content{
color:#d9822b; }
.bp3-editable-text.bp3-intent-warning:hover::before{
-webkit-box-shadow:0 0 0 0 rgba(217, 130, 43, 0), 0 0 0 0 rgba(217, 130, 43, 0), inset 0 0 0 1px rgba(217, 130, 43, 0.4);
box-shadow:0 0 0 0 rgba(217, 130, 43, 0), 0 0 0 0 rgba(217, 130, 43, 0), inset 0 0 0 1px rgba(217, 130, 43, 0.4); }
.bp3-editable-text.bp3-intent-warning.bp3-editable-text-editing::before{
-webkit-box-shadow:0 0 0 1px #d9822b, 0 0 0 3px rgba(217, 130, 43, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px #d9822b, 0 0 0 3px rgba(217, 130, 43, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-editable-text.bp3-intent-danger .bp3-editable-text-input,
.bp3-editable-text.bp3-intent-danger .bp3-editable-text-content{
color:#db3737; }
.bp3-editable-text.bp3-intent-danger:hover::before{
-webkit-box-shadow:0 0 0 0 rgba(219, 55, 55, 0), 0 0 0 0 rgba(219, 55, 55, 0), inset 0 0 0 1px rgba(219, 55, 55, 0.4);
box-shadow:0 0 0 0 rgba(219, 55, 55, 0), 0 0 0 0 rgba(219, 55, 55, 0), inset 0 0 0 1px rgba(219, 55, 55, 0.4); }
.bp3-editable-text.bp3-intent-danger.bp3-editable-text-editing::before{
-webkit-box-shadow:0 0 0 1px #db3737, 0 0 0 3px rgba(219, 55, 55, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px #db3737, 0 0 0 3px rgba(219, 55, 55, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-dark .bp3-editable-text:hover::before{
-webkit-box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(255, 255, 255, 0.15);
box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(255, 255, 255, 0.15); }
.bp3-dark .bp3-editable-text.bp3-editable-text-editing::before{
background-color:rgba(16, 22, 26, 0.3);
-webkit-box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-editable-text.bp3-disabled::before{
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-dark .bp3-editable-text.bp3-intent-primary .bp3-editable-text-content{
color:#48aff0; }
.bp3-dark .bp3-editable-text.bp3-intent-primary:hover::before{
-webkit-box-shadow:0 0 0 0 rgba(72, 175, 240, 0), 0 0 0 0 rgba(72, 175, 240, 0), inset 0 0 0 1px rgba(72, 175, 240, 0.4);
box-shadow:0 0 0 0 rgba(72, 175, 240, 0), 0 0 0 0 rgba(72, 175, 240, 0), inset 0 0 0 1px rgba(72, 175, 240, 0.4); }
.bp3-dark .bp3-editable-text.bp3-intent-primary.bp3-editable-text-editing::before{
-webkit-box-shadow:0 0 0 1px #48aff0, 0 0 0 3px rgba(72, 175, 240, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px #48aff0, 0 0 0 3px rgba(72, 175, 240, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-editable-text.bp3-intent-success .bp3-editable-text-content{
color:#3dcc91; }
.bp3-dark .bp3-editable-text.bp3-intent-success:hover::before{
-webkit-box-shadow:0 0 0 0 rgba(61, 204, 145, 0), 0 0 0 0 rgba(61, 204, 145, 0), inset 0 0 0 1px rgba(61, 204, 145, 0.4);
box-shadow:0 0 0 0 rgba(61, 204, 145, 0), 0 0 0 0 rgba(61, 204, 145, 0), inset 0 0 0 1px rgba(61, 204, 145, 0.4); }
.bp3-dark .bp3-editable-text.bp3-intent-success.bp3-editable-text-editing::before{
-webkit-box-shadow:0 0 0 1px #3dcc91, 0 0 0 3px rgba(61, 204, 145, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px #3dcc91, 0 0 0 3px rgba(61, 204, 145, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-editable-text.bp3-intent-warning .bp3-editable-text-content{
color:#ffb366; }
.bp3-dark .bp3-editable-text.bp3-intent-warning:hover::before{
-webkit-box-shadow:0 0 0 0 rgba(255, 179, 102, 0), 0 0 0 0 rgba(255, 179, 102, 0), inset 0 0 0 1px rgba(255, 179, 102, 0.4);
box-shadow:0 0 0 0 rgba(255, 179, 102, 0), 0 0 0 0 rgba(255, 179, 102, 0), inset 0 0 0 1px rgba(255, 179, 102, 0.4); }
.bp3-dark .bp3-editable-text.bp3-intent-warning.bp3-editable-text-editing::before{
-webkit-box-shadow:0 0 0 1px #ffb366, 0 0 0 3px rgba(255, 179, 102, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px #ffb366, 0 0 0 3px rgba(255, 179, 102, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-editable-text.bp3-intent-danger .bp3-editable-text-content{
color:#ff7373; }
.bp3-dark .bp3-editable-text.bp3-intent-danger:hover::before{
-webkit-box-shadow:0 0 0 0 rgba(255, 115, 115, 0), 0 0 0 0 rgba(255, 115, 115, 0), inset 0 0 0 1px rgba(255, 115, 115, 0.4);
box-shadow:0 0 0 0 rgba(255, 115, 115, 0), 0 0 0 0 rgba(255, 115, 115, 0), inset 0 0 0 1px rgba(255, 115, 115, 0.4); }
.bp3-dark .bp3-editable-text.bp3-intent-danger.bp3-editable-text-editing::before{
-webkit-box-shadow:0 0 0 1px #ff7373, 0 0 0 3px rgba(255, 115, 115, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px #ff7373, 0 0 0 3px rgba(255, 115, 115, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
.bp3-editable-text-input,
.bp3-editable-text-content{
color:inherit;
display:inherit;
font:inherit;
letter-spacing:inherit;
max-width:inherit;
min-width:inherit;
position:relative;
resize:none;
text-transform:inherit;
vertical-align:top; }
.bp3-editable-text-input{
background:none;
border:none;
-webkit-box-shadow:none;
box-shadow:none;
padding:0;
white-space:pre-wrap;
width:100%; }
.bp3-editable-text-input::-webkit-input-placeholder{
color:rgba(92, 112, 128, 0.6);
opacity:1; }
.bp3-editable-text-input::-moz-placeholder{
color:rgba(92, 112, 128, 0.6);
opacity:1; }
.bp3-editable-text-input:-ms-input-placeholder{
color:rgba(92, 112, 128, 0.6);
opacity:1; }
.bp3-editable-text-input::-ms-input-placeholder{
color:rgba(92, 112, 128, 0.6);
opacity:1; }
.bp3-editable-text-input::placeholder{
color:rgba(92, 112, 128, 0.6);
opacity:1; }
.bp3-editable-text-input:focus{
outline:none; }
.bp3-editable-text-input::-ms-clear{
display:none; }
.bp3-editable-text-content{
overflow:hidden;
padding-right:2px;
text-overflow:ellipsis;
white-space:pre; }
.bp3-editable-text-editing > .bp3-editable-text-content{
left:0;
position:absolute;
visibility:hidden; }
.bp3-editable-text-placeholder > .bp3-editable-text-content{
color:rgba(92, 112, 128, 0.6); }
.bp3-dark .bp3-editable-text-placeholder > .bp3-editable-text-content{
color:rgba(167, 182, 194, 0.6); }
.bp3-editable-text.bp3-multiline{
display:block; }
.bp3-editable-text.bp3-multiline .bp3-editable-text-content{
overflow:auto;
white-space:pre-wrap;
word-wrap:break-word; }
.bp3-divider{
border-bottom:1px solid rgba(16, 22, 26, 0.15);
border-right:1px solid rgba(16, 22, 26, 0.15);
margin:5px; }
.bp3-dark .bp3-divider{
border-color:rgba(16, 22, 26, 0.4); }
.bp3-control-group{
-webkit-transform:translateZ(0);
transform:translateZ(0);
display:-webkit-box;
display:-ms-flexbox;
display:flex;
-webkit-box-orient:horizontal;
-webkit-box-direction:normal;
-ms-flex-direction:row;
flex-direction:row;
-webkit-box-align:stretch;
-ms-flex-align:stretch;
align-items:stretch; }
.bp3-control-group > *{
-webkit-box-flex:0;
-ms-flex-positive:0;
flex-grow:0;
-ms-flex-negative:0;
flex-shrink:0; }
.bp3-control-group > .bp3-fill{
-webkit-box-flex:1;
-ms-flex-positive:1;
flex-grow:1;
-ms-flex-negative:1;
flex-shrink:1; }
.bp3-control-group .bp3-button,
.bp3-control-group .bp3-html-select,
.bp3-control-group .bp3-input,
.bp3-control-group .bp3-select{
position:relative; }
.bp3-control-group .bp3-input{
border-radius:inherit;
z-index:2; }
.bp3-control-group .bp3-input:focus{
border-radius:3px;
z-index:14; }
.bp3-control-group .bp3-input[class*="bp3-intent"]{
z-index:13; }
.bp3-control-group .bp3-input[class*="bp3-intent"]:focus{
z-index:15; }
.bp3-control-group .bp3-input[readonly], .bp3-control-group .bp3-input:disabled, .bp3-control-group .bp3-input.bp3-disabled{
z-index:1; }
.bp3-control-group .bp3-input-group[class*="bp3-intent"] .bp3-input{
z-index:13; }
.bp3-control-group .bp3-input-group[class*="bp3-intent"] .bp3-input:focus{
z-index:15; }
.bp3-control-group .bp3-button,
.bp3-control-group .bp3-html-select select,
.bp3-control-group .bp3-select select{
-webkit-transform:translateZ(0);
transform:translateZ(0);
border-radius:inherit;
z-index:4; }
.bp3-control-group .bp3-button:focus,
.bp3-control-group .bp3-html-select select:focus,
.bp3-control-group .bp3-select select:focus{
z-index:5; }
.bp3-control-group .bp3-button:hover,
.bp3-control-group .bp3-html-select select:hover,
.bp3-control-group .bp3-select select:hover{
z-index:6; }
.bp3-control-group .bp3-button:active,
.bp3-control-group .bp3-html-select select:active,
.bp3-control-group .bp3-select select:active{
z-index:7; }
.bp3-control-group .bp3-button[readonly], .bp3-control-group .bp3-button:disabled, .bp3-control-group .bp3-button.bp3-disabled,
.bp3-control-group .bp3-html-select select[readonly],
.bp3-control-group .bp3-html-select select:disabled,
.bp3-control-group .bp3-html-select select.bp3-disabled,
.bp3-control-group .bp3-select select[readonly],
.bp3-control-group .bp3-select select:disabled,
.bp3-control-group .bp3-select select.bp3-disabled{
z-index:3; }
.bp3-control-group .bp3-button[class*="bp3-intent"],
.bp3-control-group .bp3-html-select select[class*="bp3-intent"],
.bp3-control-group .bp3-select select[class*="bp3-intent"]{
z-index:9; }
.bp3-control-group .bp3-button[class*="bp3-intent"]:focus,
.bp3-control-group .bp3-html-select select[class*="bp3-intent"]:focus,
.bp3-control-group .bp3-select select[class*="bp3-intent"]:focus{
z-index:10; }
.bp3-control-group .bp3-button[class*="bp3-intent"]:hover,
.bp3-control-group .bp3-html-select select[class*="bp3-intent"]:hover,
.bp3-control-group .bp3-select select[class*="bp3-intent"]:hover{
z-index:11; }
.bp3-control-group .bp3-button[class*="bp3-intent"]:active,
.bp3-control-group .bp3-html-select select[class*="bp3-intent"]:active,
.bp3-control-group .bp3-select select[class*="bp3-intent"]:active{
z-index:12; }
.bp3-control-group .bp3-button[class*="bp3-intent"][readonly], .bp3-control-group .bp3-button[class*="bp3-intent"]:disabled, .bp3-control-group .bp3-button[class*="bp3-intent"].bp3-disabled,
.bp3-control-group .bp3-html-select select[class*="bp3-intent"][readonly],
.bp3-control-group .bp3-html-select select[class*="bp3-intent"]:disabled,
.bp3-control-group .bp3-html-select select[class*="bp3-intent"].bp3-disabled,
.bp3-control-group .bp3-select select[class*="bp3-intent"][readonly],
.bp3-control-group .bp3-select select[class*="bp3-intent"]:disabled,
.bp3-control-group .bp3-select select[class*="bp3-intent"].bp3-disabled{
z-index:8; }
.bp3-control-group .bp3-input-group > .bp3-icon,
.bp3-control-group .bp3-input-group > .bp3-button,
.bp3-control-group .bp3-input-group > .bp3-input-left-container,
.bp3-control-group .bp3-input-group > .bp3-input-action{
z-index:16; }
.bp3-control-group .bp3-select::after,
.bp3-control-group .bp3-html-select::after,
.bp3-control-group .bp3-select > .bp3-icon,
.bp3-control-group .bp3-html-select > .bp3-icon{
z-index:17; }
.bp3-control-group .bp3-select:focus-within{
z-index:5; }
.bp3-control-group:not(.bp3-vertical) > *:not(.bp3-divider){
margin-right:-1px; }
.bp3-control-group:not(.bp3-vertical) > .bp3-divider:not(:first-child){
margin-left:6px; }
.bp3-dark .bp3-control-group:not(.bp3-vertical) > *:not(.bp3-divider){
margin-right:0; }
.bp3-dark .bp3-control-group:not(.bp3-vertical) > .bp3-button + .bp3-button{
margin-left:1px; }
.bp3-control-group .bp3-popover-wrapper,
.bp3-control-group .bp3-popover-target{
border-radius:inherit; }
.bp3-control-group > :first-child{
border-radius:3px 0 0 3px; }
.bp3-control-group > :last-child{
border-radius:0 3px 3px 0;
margin-right:0; }
.bp3-control-group > :only-child{
border-radius:3px;
margin-right:0; }
.bp3-control-group .bp3-input-group .bp3-button{
border-radius:3px; }
.bp3-control-group .bp3-numeric-input:not(:first-child) .bp3-input-group{
border-bottom-left-radius:0;
border-top-left-radius:0; }
.bp3-control-group.bp3-fill{
width:100%; }
.bp3-control-group > .bp3-fill{
-webkit-box-flex:1;
-ms-flex:1 1 auto;
flex:1 1 auto; }
.bp3-control-group.bp3-fill > *:not(.bp3-fixed){
-webkit-box-flex:1;
-ms-flex:1 1 auto;
flex:1 1 auto; }
.bp3-control-group.bp3-vertical{
-webkit-box-orient:vertical;
-webkit-box-direction:normal;
-ms-flex-direction:column;
flex-direction:column; }
.bp3-control-group.bp3-vertical > *{
margin-top:-1px; }
.bp3-control-group.bp3-vertical > :first-child{
border-radius:3px 3px 0 0;
margin-top:0; }
.bp3-control-group.bp3-vertical > :last-child{
border-radius:0 0 3px 3px; }
.bp3-control{
cursor:pointer;
display:block;
margin-bottom:10px;
position:relative;
text-transform:none; }
.bp3-control input:checked ~ .bp3-control-indicator{
background-color:#137cbd;
background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.1)), to(rgba(255, 255, 255, 0)));
background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0));
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
color:#ffffff; }
.bp3-control:hover input:checked ~ .bp3-control-indicator{
background-color:#106ba3;
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2); }
.bp3-control input:not(:disabled):active:checked ~ .bp3-control-indicator{
background:#0e5a8a;
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2); }
.bp3-control input:disabled:checked ~ .bp3-control-indicator{
background:rgba(19, 124, 189, 0.5);
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-dark .bp3-control input:checked ~ .bp3-control-indicator{
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-control:hover input:checked ~ .bp3-control-indicator{
background-color:#106ba3;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-control input:not(:disabled):active:checked ~ .bp3-control-indicator{
background-color:#0e5a8a;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2); }
.bp3-dark .bp3-control input:disabled:checked ~ .bp3-control-indicator{
background:rgba(14, 90, 138, 0.5);
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-control:not(.bp3-align-right){
padding-left:26px; }
.bp3-control:not(.bp3-align-right) .bp3-control-indicator{
margin-left:-26px; }
.bp3-control.bp3-align-right{
padding-right:26px; }
.bp3-control.bp3-align-right .bp3-control-indicator{
margin-right:-26px; }
.bp3-control.bp3-disabled{
color:rgba(92, 112, 128, 0.6);
cursor:not-allowed; }
.bp3-control.bp3-inline{
display:inline-block;
margin-right:20px; }
.bp3-control input{
left:0;
opacity:0;
position:absolute;
top:0;
z-index:-1; }
.bp3-control .bp3-control-indicator{
background-clip:padding-box;
background-color:#f5f8fa;
background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.8)), to(rgba(255, 255, 255, 0)));
background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0));
border:none;
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
cursor:pointer;
display:inline-block;
font-size:16px;
height:1em;
margin-right:10px;
margin-top:-3px;
position:relative;
-webkit-user-select:none;
-moz-user-select:none;
-ms-user-select:none;
user-select:none;
vertical-align:middle;
width:1em; }
.bp3-control .bp3-control-indicator::before{
content:"";
display:block;
height:1em;
width:1em; }
.bp3-control:hover .bp3-control-indicator{
background-color:#ebf1f5; }
.bp3-control input:not(:disabled):active ~ .bp3-control-indicator{
background:#d8e1e8;
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 2px rgba(16, 22, 26, 0.2);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 2px rgba(16, 22, 26, 0.2); }
.bp3-control input:disabled ~ .bp3-control-indicator{
background:rgba(206, 217, 224, 0.5);
-webkit-box-shadow:none;
box-shadow:none;
cursor:not-allowed; }
.bp3-control input:focus ~ .bp3-control-indicator{
outline:rgba(19, 124, 189, 0.6) auto 2px;
outline-offset:2px;
-moz-outline-radius:6px; }
.bp3-control.bp3-align-right .bp3-control-indicator{
float:right;
margin-left:10px;
margin-top:1px; }
.bp3-control.bp3-large{
font-size:16px; }
.bp3-control.bp3-large:not(.bp3-align-right){
padding-left:30px; }
.bp3-control.bp3-large:not(.bp3-align-right) .bp3-control-indicator{
margin-left:-30px; }
.bp3-control.bp3-large.bp3-align-right{
padding-right:30px; }
.bp3-control.bp3-large.bp3-align-right .bp3-control-indicator{
margin-right:-30px; }
.bp3-control.bp3-large .bp3-control-indicator{
font-size:20px; }
.bp3-control.bp3-large.bp3-align-right .bp3-control-indicator{
margin-top:0; }
.bp3-control.bp3-checkbox input:indeterminate ~ .bp3-control-indicator{
background-color:#137cbd;
background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.1)), to(rgba(255, 255, 255, 0)));
background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0));
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
color:#ffffff; }
.bp3-control.bp3-checkbox:hover input:indeterminate ~ .bp3-control-indicator{
background-color:#106ba3;
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2); }
.bp3-control.bp3-checkbox input:not(:disabled):active:indeterminate ~ .bp3-control-indicator{
background:#0e5a8a;
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2); }
.bp3-control.bp3-checkbox input:disabled:indeterminate ~ .bp3-control-indicator{
background:rgba(19, 124, 189, 0.5);
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-dark .bp3-control.bp3-checkbox input:indeterminate ~ .bp3-control-indicator{
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-control.bp3-checkbox:hover input:indeterminate ~ .bp3-control-indicator{
background-color:#106ba3;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-control.bp3-checkbox input:not(:disabled):active:indeterminate ~ .bp3-control-indicator{
background-color:#0e5a8a;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2); }
.bp3-dark .bp3-control.bp3-checkbox input:disabled:indeterminate ~ .bp3-control-indicator{
background:rgba(14, 90, 138, 0.5);
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-control.bp3-checkbox .bp3-control-indicator{
border-radius:3px; }
.bp3-control.bp3-checkbox input:checked ~ .bp3-control-indicator::before{
background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill-rule='evenodd' clip-rule='evenodd' d='M12 5c-.28 0-.53.11-.71.29L7 9.59l-2.29-2.3a1.003 1.003 0 00-1.42 1.42l3 3c.18.18.43.29.71.29s.53-.11.71-.29l5-5A1.003 1.003 0 0012 5z' fill='white'/%3e%3c/svg%3e"); }
.bp3-control.bp3-checkbox input:indeterminate ~ .bp3-control-indicator::before{
background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill-rule='evenodd' clip-rule='evenodd' d='M11 7H5c-.55 0-1 .45-1 1s.45 1 1 1h6c.55 0 1-.45 1-1s-.45-1-1-1z' fill='white'/%3e%3c/svg%3e"); }
.bp3-control.bp3-radio .bp3-control-indicator{
border-radius:50%; }
.bp3-control.bp3-radio input:checked ~ .bp3-control-indicator::before{
background-image:radial-gradient(#ffffff, #ffffff 28%, transparent 32%); }
.bp3-control.bp3-radio input:checked:disabled ~ .bp3-control-indicator::before{
opacity:0.5; }
.bp3-control.bp3-radio input:focus ~ .bp3-control-indicator{
-moz-outline-radius:16px; }
.bp3-control.bp3-switch input ~ .bp3-control-indicator{
background:rgba(167, 182, 194, 0.5); }
.bp3-control.bp3-switch:hover input ~ .bp3-control-indicator{
background:rgba(115, 134, 148, 0.5); }
.bp3-control.bp3-switch input:not(:disabled):active ~ .bp3-control-indicator{
background:rgba(92, 112, 128, 0.5); }
.bp3-control.bp3-switch input:disabled ~ .bp3-control-indicator{
background:rgba(206, 217, 224, 0.5); }
.bp3-control.bp3-switch input:disabled ~ .bp3-control-indicator::before{
background:rgba(255, 255, 255, 0.8); }
.bp3-control.bp3-switch input:checked ~ .bp3-control-indicator{
background:#137cbd; }
.bp3-control.bp3-switch:hover input:checked ~ .bp3-control-indicator{
background:#106ba3; }
.bp3-control.bp3-switch input:checked:not(:disabled):active ~ .bp3-control-indicator{
background:#0e5a8a; }
.bp3-control.bp3-switch input:checked:disabled ~ .bp3-control-indicator{
background:rgba(19, 124, 189, 0.5); }
.bp3-control.bp3-switch input:checked:disabled ~ .bp3-control-indicator::before{
background:rgba(255, 255, 255, 0.8); }
.bp3-control.bp3-switch:not(.bp3-align-right){
padding-left:38px; }
.bp3-control.bp3-switch:not(.bp3-align-right) .bp3-control-indicator{
margin-left:-38px; }
.bp3-control.bp3-switch.bp3-align-right{
padding-right:38px; }
.bp3-control.bp3-switch.bp3-align-right .bp3-control-indicator{
margin-right:-38px; }
.bp3-control.bp3-switch .bp3-control-indicator{
border:none;
border-radius:1.75em;
-webkit-box-shadow:none !important;
box-shadow:none !important;
min-width:1.75em;
-webkit-transition:background-color 100ms cubic-bezier(0.4, 1, 0.75, 0.9);
transition:background-color 100ms cubic-bezier(0.4, 1, 0.75, 0.9);
width:auto; }
.bp3-control.bp3-switch .bp3-control-indicator::before{
background:#ffffff;
border-radius:50%;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 1px 1px rgba(16, 22, 26, 0.2);
height:calc(1em - 4px);
left:0;
margin:2px;
position:absolute;
-webkit-transition:left 100ms cubic-bezier(0.4, 1, 0.75, 0.9);
transition:left 100ms cubic-bezier(0.4, 1, 0.75, 0.9);
width:calc(1em - 4px); }
.bp3-control.bp3-switch input:checked ~ .bp3-control-indicator::before{
left:calc(100% - 1em); }
.bp3-control.bp3-switch.bp3-large:not(.bp3-align-right){
padding-left:45px; }
.bp3-control.bp3-switch.bp3-large:not(.bp3-align-right) .bp3-control-indicator{
margin-left:-45px; }
.bp3-control.bp3-switch.bp3-large.bp3-align-right{
padding-right:45px; }
.bp3-control.bp3-switch.bp3-large.bp3-align-right .bp3-control-indicator{
margin-right:-45px; }
.bp3-dark .bp3-control.bp3-switch input ~ .bp3-control-indicator{
background:rgba(16, 22, 26, 0.5); }
.bp3-dark .bp3-control.bp3-switch:hover input ~ .bp3-control-indicator{
background:rgba(16, 22, 26, 0.7); }
.bp3-dark .bp3-control.bp3-switch input:not(:disabled):active ~ .bp3-control-indicator{
background:rgba(16, 22, 26, 0.9); }
.bp3-dark .bp3-control.bp3-switch input:disabled ~ .bp3-control-indicator{
background:rgba(57, 75, 89, 0.5); }
.bp3-dark .bp3-control.bp3-switch input:disabled ~ .bp3-control-indicator::before{
background:rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-control.bp3-switch input:checked ~ .bp3-control-indicator{
background:#137cbd; }
.bp3-dark .bp3-control.bp3-switch:hover input:checked ~ .bp3-control-indicator{
background:#106ba3; }
.bp3-dark .bp3-control.bp3-switch input:checked:not(:disabled):active ~ .bp3-control-indicator{
background:#0e5a8a; }
.bp3-dark .bp3-control.bp3-switch input:checked:disabled ~ .bp3-control-indicator{
background:rgba(14, 90, 138, 0.5); }
.bp3-dark .bp3-control.bp3-switch input:checked:disabled ~ .bp3-control-indicator::before{
background:rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-control.bp3-switch .bp3-control-indicator::before{
background:#394b59;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-control.bp3-switch input:checked ~ .bp3-control-indicator::before{
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4); }
.bp3-control.bp3-switch .bp3-switch-inner-text{
font-size:0.7em;
text-align:center; }
.bp3-control.bp3-switch .bp3-control-indicator-child:first-child{
line-height:0;
margin-left:0.5em;
margin-right:1.2em;
visibility:hidden; }
.bp3-control.bp3-switch .bp3-control-indicator-child:last-child{
line-height:1em;
margin-left:1.2em;
margin-right:0.5em;
visibility:visible; }
.bp3-control.bp3-switch input:checked ~ .bp3-control-indicator .bp3-control-indicator-child:first-child{
line-height:1em;
visibility:visible; }
.bp3-control.bp3-switch input:checked ~ .bp3-control-indicator .bp3-control-indicator-child:last-child{
line-height:0;
visibility:hidden; }
.bp3-dark .bp3-control{
color:#f5f8fa; }
.bp3-dark .bp3-control.bp3-disabled{
color:rgba(167, 182, 194, 0.6); }
.bp3-dark .bp3-control .bp3-control-indicator{
background-color:#394b59;
background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.05)), to(rgba(255, 255, 255, 0)));
background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0));
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-control:hover .bp3-control-indicator{
background-color:#30404d; }
.bp3-dark .bp3-control input:not(:disabled):active ~ .bp3-control-indicator{
background:#202b33;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.6), inset 0 1px 2px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.6), inset 0 1px 2px rgba(16, 22, 26, 0.2); }
.bp3-dark .bp3-control input:disabled ~ .bp3-control-indicator{
background:rgba(57, 75, 89, 0.5);
-webkit-box-shadow:none;
box-shadow:none;
cursor:not-allowed; }
.bp3-dark .bp3-control.bp3-checkbox input:disabled:checked ~ .bp3-control-indicator, .bp3-dark .bp3-control.bp3-checkbox input:disabled:indeterminate ~ .bp3-control-indicator{
color:rgba(167, 182, 194, 0.6); }
.bp3-file-input{
cursor:pointer;
display:inline-block;
height:30px;
position:relative; }
.bp3-file-input input{
margin:0;
min-width:200px;
opacity:0; }
.bp3-file-input input:disabled + .bp3-file-upload-input,
.bp3-file-input input.bp3-disabled + .bp3-file-upload-input{
background:rgba(206, 217, 224, 0.5);
-webkit-box-shadow:none;
box-shadow:none;
color:rgba(92, 112, 128, 0.6);
cursor:not-allowed;
resize:none; }
.bp3-file-input input:disabled + .bp3-file-upload-input::after,
.bp3-file-input input.bp3-disabled + .bp3-file-upload-input::after{
background-color:rgba(206, 217, 224, 0.5);
background-image:none;
-webkit-box-shadow:none;
box-shadow:none;
color:rgba(92, 112, 128, 0.6);
cursor:not-allowed;
outline:none; }
.bp3-file-input input:disabled + .bp3-file-upload-input::after.bp3-active, .bp3-file-input input:disabled + .bp3-file-upload-input::after.bp3-active:hover,
.bp3-file-input input.bp3-disabled + .bp3-file-upload-input::after.bp3-active,
.bp3-file-input input.bp3-disabled + .bp3-file-upload-input::after.bp3-active:hover{
background:rgba(206, 217, 224, 0.7); }
.bp3-dark .bp3-file-input input:disabled + .bp3-file-upload-input, .bp3-dark
.bp3-file-input input.bp3-disabled + .bp3-file-upload-input{
background:rgba(57, 75, 89, 0.5);
-webkit-box-shadow:none;
box-shadow:none;
color:rgba(167, 182, 194, 0.6); }
.bp3-dark .bp3-file-input input:disabled + .bp3-file-upload-input::after, .bp3-dark
.bp3-file-input input.bp3-disabled + .bp3-file-upload-input::after{
background-color:rgba(57, 75, 89, 0.5);
background-image:none;
-webkit-box-shadow:none;
box-shadow:none;
color:rgba(167, 182, 194, 0.6); }
.bp3-dark .bp3-file-input input:disabled + .bp3-file-upload-input::after.bp3-active, .bp3-dark
.bp3-file-input input.bp3-disabled + .bp3-file-upload-input::after.bp3-active{
background:rgba(57, 75, 89, 0.7); }
.bp3-file-input.bp3-file-input-has-selection .bp3-file-upload-input{
color:#182026; }
.bp3-dark .bp3-file-input.bp3-file-input-has-selection .bp3-file-upload-input{
color:#f5f8fa; }
.bp3-file-input.bp3-fill{
width:100%; }
.bp3-file-input.bp3-large,
.bp3-large .bp3-file-input{
height:40px; }
.bp3-file-input .bp3-file-upload-input-custom-text::after{
content:attr(bp3-button-text); }
.bp3-file-upload-input{
-webkit-appearance:none;
-moz-appearance:none;
appearance:none;
background:#ffffff;
border:none;
border-radius:3px;
-webkit-box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2);
color:#182026;
font-size:14px;
font-weight:400;
height:30px;
line-height:30px;
outline:none;
padding:0 10px;
-webkit-transition:-webkit-box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9);
transition:-webkit-box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9);
transition:box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9);
transition:box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9), -webkit-box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9);
vertical-align:middle;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
word-wrap:normal;
color:rgba(92, 112, 128, 0.6);
left:0;
padding-right:80px;
position:absolute;
right:0;
top:0;
-webkit-user-select:none;
-moz-user-select:none;
-ms-user-select:none;
user-select:none; }
.bp3-file-upload-input::-webkit-input-placeholder{
color:rgba(92, 112, 128, 0.6);
opacity:1; }
.bp3-file-upload-input::-moz-placeholder{
color:rgba(92, 112, 128, 0.6);
opacity:1; }
.bp3-file-upload-input:-ms-input-placeholder{
color:rgba(92, 112, 128, 0.6);
opacity:1; }
.bp3-file-upload-input::-ms-input-placeholder{
color:rgba(92, 112, 128, 0.6);
opacity:1; }
.bp3-file-upload-input::placeholder{
color:rgba(92, 112, 128, 0.6);
opacity:1; }
.bp3-file-upload-input:focus, .bp3-file-upload-input.bp3-active{
-webkit-box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-file-upload-input[type="search"], .bp3-file-upload-input.bp3-round{
border-radius:30px;
-webkit-box-sizing:border-box;
box-sizing:border-box;
padding-left:10px; }
.bp3-file-upload-input[readonly]{
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.15);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.15); }
.bp3-file-upload-input:disabled, .bp3-file-upload-input.bp3-disabled{
background:rgba(206, 217, 224, 0.5);
-webkit-box-shadow:none;
box-shadow:none;
color:rgba(92, 112, 128, 0.6);
cursor:not-allowed;
resize:none; }
.bp3-file-upload-input::after{
background-color:#f5f8fa;
background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.8)), to(rgba(255, 255, 255, 0)));
background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0));
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
color:#182026;
min-height:24px;
min-width:24px;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
word-wrap:normal;
border-radius:3px;
content:"Browse";
line-height:24px;
margin:3px;
position:absolute;
right:0;
text-align:center;
top:0;
width:70px; }
.bp3-file-upload-input::after:hover{
background-clip:padding-box;
background-color:#ebf1f5;
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1); }
.bp3-file-upload-input::after:active, .bp3-file-upload-input::after.bp3-active{
background-color:#d8e1e8;
background-image:none;
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 2px rgba(16, 22, 26, 0.2);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 2px rgba(16, 22, 26, 0.2); }
.bp3-file-upload-input::after:disabled, .bp3-file-upload-input::after.bp3-disabled{
background-color:rgba(206, 217, 224, 0.5);
background-image:none;
-webkit-box-shadow:none;
box-shadow:none;
color:rgba(92, 112, 128, 0.6);
cursor:not-allowed;
outline:none; }
.bp3-file-upload-input::after:disabled.bp3-active, .bp3-file-upload-input::after:disabled.bp3-active:hover, .bp3-file-upload-input::after.bp3-disabled.bp3-active, .bp3-file-upload-input::after.bp3-disabled.bp3-active:hover{
background:rgba(206, 217, 224, 0.7); }
.bp3-file-upload-input:hover::after{
background-clip:padding-box;
background-color:#ebf1f5;
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1); }
.bp3-file-upload-input:active::after{
background-color:#d8e1e8;
background-image:none;
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 2px rgba(16, 22, 26, 0.2);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 2px rgba(16, 22, 26, 0.2); }
.bp3-large .bp3-file-upload-input{
font-size:16px;
height:40px;
line-height:40px;
padding-right:95px; }
.bp3-large .bp3-file-upload-input[type="search"], .bp3-large .bp3-file-upload-input.bp3-round{
padding:0 15px; }
.bp3-large .bp3-file-upload-input::after{
min-height:30px;
min-width:30px;
line-height:30px;
margin:5px;
width:85px; }
.bp3-dark .bp3-file-upload-input{
background:rgba(16, 22, 26, 0.3);
-webkit-box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
color:#f5f8fa;
color:rgba(167, 182, 194, 0.6); }
.bp3-dark .bp3-file-upload-input::-webkit-input-placeholder{
color:rgba(167, 182, 194, 0.6); }
.bp3-dark .bp3-file-upload-input::-moz-placeholder{
color:rgba(167, 182, 194, 0.6); }
.bp3-dark .bp3-file-upload-input:-ms-input-placeholder{
color:rgba(167, 182, 194, 0.6); }
.bp3-dark .bp3-file-upload-input::-ms-input-placeholder{
color:rgba(167, 182, 194, 0.6); }
.bp3-dark .bp3-file-upload-input::placeholder{
color:rgba(167, 182, 194, 0.6); }
.bp3-dark .bp3-file-upload-input:focus{
-webkit-box-shadow:0 0 0 1px #137cbd, 0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px #137cbd, 0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-file-upload-input[readonly]{
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-file-upload-input:disabled, .bp3-dark .bp3-file-upload-input.bp3-disabled{
background:rgba(57, 75, 89, 0.5);
-webkit-box-shadow:none;
box-shadow:none;
color:rgba(167, 182, 194, 0.6); }
.bp3-dark .bp3-file-upload-input::after{
background-color:#394b59;
background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.05)), to(rgba(255, 255, 255, 0)));
background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0));
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
color:#f5f8fa; }
.bp3-dark .bp3-file-upload-input::after:hover, .bp3-dark .bp3-file-upload-input::after:active, .bp3-dark .bp3-file-upload-input::after.bp3-active{
color:#f5f8fa; }
.bp3-dark .bp3-file-upload-input::after:hover{
background-color:#30404d;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-file-upload-input::after:active, .bp3-dark .bp3-file-upload-input::after.bp3-active{
background-color:#202b33;
background-image:none;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.6), inset 0 1px 2px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.6), inset 0 1px 2px rgba(16, 22, 26, 0.2); }
.bp3-dark .bp3-file-upload-input::after:disabled, .bp3-dark .bp3-file-upload-input::after.bp3-disabled{
background-color:rgba(57, 75, 89, 0.5);
background-image:none;
-webkit-box-shadow:none;
box-shadow:none;
color:rgba(167, 182, 194, 0.6); }
.bp3-dark .bp3-file-upload-input::after:disabled.bp3-active, .bp3-dark .bp3-file-upload-input::after.bp3-disabled.bp3-active{
background:rgba(57, 75, 89, 0.7); }
.bp3-dark .bp3-file-upload-input::after .bp3-button-spinner .bp3-spinner-head{
background:rgba(16, 22, 26, 0.5);
stroke:#8a9ba8; }
.bp3-dark .bp3-file-upload-input:hover::after{
background-color:#30404d;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-file-upload-input:active::after{
background-color:#202b33;
background-image:none;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.6), inset 0 1px 2px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.6), inset 0 1px 2px rgba(16, 22, 26, 0.2); }
.bp3-file-upload-input::after{
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1); }
.bp3-form-group{
display:-webkit-box;
display:-ms-flexbox;
display:flex;
-webkit-box-orient:vertical;
-webkit-box-direction:normal;
-ms-flex-direction:column;
flex-direction:column;
margin:0 0 15px; }
.bp3-form-group label.bp3-label{
margin-bottom:5px; }
.bp3-form-group .bp3-control{
margin-top:7px; }
.bp3-form-group .bp3-form-helper-text{
color:#5c7080;
font-size:12px;
margin-top:5px; }
.bp3-form-group.bp3-intent-primary .bp3-form-helper-text{
color:#106ba3; }
.bp3-form-group.bp3-intent-success .bp3-form-helper-text{
color:#0d8050; }
.bp3-form-group.bp3-intent-warning .bp3-form-helper-text{
color:#bf7326; }
.bp3-form-group.bp3-intent-danger .bp3-form-helper-text{
color:#c23030; }
.bp3-form-group.bp3-inline{
-webkit-box-align:start;
-ms-flex-align:start;
align-items:flex-start;
-webkit-box-orient:horizontal;
-webkit-box-direction:normal;
-ms-flex-direction:row;
flex-direction:row; }
.bp3-form-group.bp3-inline.bp3-large label.bp3-label{
line-height:40px;
margin:0 10px 0 0; }
.bp3-form-group.bp3-inline label.bp3-label{
line-height:30px;
margin:0 10px 0 0; }
.bp3-form-group.bp3-disabled .bp3-label,
.bp3-form-group.bp3-disabled .bp3-text-muted,
.bp3-form-group.bp3-disabled .bp3-form-helper-text{
color:rgba(92, 112, 128, 0.6) !important; }
.bp3-dark .bp3-form-group.bp3-intent-primary .bp3-form-helper-text{
color:#48aff0; }
.bp3-dark .bp3-form-group.bp3-intent-success .bp3-form-helper-text{
color:#3dcc91; }
.bp3-dark .bp3-form-group.bp3-intent-warning .bp3-form-helper-text{
color:#ffb366; }
.bp3-dark .bp3-form-group.bp3-intent-danger .bp3-form-helper-text{
color:#ff7373; }
.bp3-dark .bp3-form-group .bp3-form-helper-text{
color:#a7b6c2; }
.bp3-dark .bp3-form-group.bp3-disabled .bp3-label,
.bp3-dark .bp3-form-group.bp3-disabled .bp3-text-muted,
.bp3-dark .bp3-form-group.bp3-disabled .bp3-form-helper-text{
color:rgba(167, 182, 194, 0.6) !important; }
.bp3-input-group{
display:block;
position:relative; }
.bp3-input-group .bp3-input{
position:relative;
width:100%; }
.bp3-input-group .bp3-input:not(:first-child){
padding-left:30px; }
.bp3-input-group .bp3-input:not(:last-child){
padding-right:30px; }
.bp3-input-group .bp3-input-action,
.bp3-input-group > .bp3-input-left-container,
.bp3-input-group > .bp3-button,
.bp3-input-group > .bp3-icon{
position:absolute;
top:0; }
.bp3-input-group .bp3-input-action:first-child,
.bp3-input-group > .bp3-input-left-container:first-child,
.bp3-input-group > .bp3-button:first-child,
.bp3-input-group > .bp3-icon:first-child{
left:0; }
.bp3-input-group .bp3-input-action:last-child,
.bp3-input-group > .bp3-input-left-container:last-child,
.bp3-input-group > .bp3-button:last-child,
.bp3-input-group > .bp3-icon:last-child{
right:0; }
.bp3-input-group .bp3-button{
min-height:24px;
min-width:24px;
margin:3px;
padding:0 7px; }
.bp3-input-group .bp3-button:empty{
padding:0; }
.bp3-input-group > .bp3-input-left-container,
.bp3-input-group > .bp3-icon{
z-index:1; }
.bp3-input-group > .bp3-input-left-container > .bp3-icon,
.bp3-input-group > .bp3-icon{
color:#5c7080; }
.bp3-input-group > .bp3-input-left-container > .bp3-icon:empty,
.bp3-input-group > .bp3-icon:empty{
font-family:"Icons16", sans-serif;
font-size:16px;
font-style:normal;
font-weight:400;
line-height:1;
-moz-osx-font-smoothing:grayscale;
-webkit-font-smoothing:antialiased; }
.bp3-input-group > .bp3-input-left-container > .bp3-icon,
.bp3-input-group > .bp3-icon,
.bp3-input-group .bp3-input-action > .bp3-spinner{
margin:7px; }
.bp3-input-group .bp3-tag{
margin:5px; }
.bp3-input-group .bp3-input:not(:focus) + .bp3-button.bp3-minimal:not(:hover):not(:focus),
.bp3-input-group .bp3-input:not(:focus) + .bp3-input-action .bp3-button.bp3-minimal:not(:hover):not(:focus){
color:#5c7080; }
.bp3-dark .bp3-input-group .bp3-input:not(:focus) + .bp3-button.bp3-minimal:not(:hover):not(:focus), .bp3-dark
.bp3-input-group .bp3-input:not(:focus) + .bp3-input-action .bp3-button.bp3-minimal:not(:hover):not(:focus){
color:#a7b6c2; }
.bp3-input-group .bp3-input:not(:focus) + .bp3-button.bp3-minimal:not(:hover):not(:focus) .bp3-icon, .bp3-input-group .bp3-input:not(:focus) + .bp3-button.bp3-minimal:not(:hover):not(:focus) .bp3-icon-standard, .bp3-input-group .bp3-input:not(:focus) + .bp3-button.bp3-minimal:not(:hover):not(:focus) .bp3-icon-large,
.bp3-input-group .bp3-input:not(:focus) + .bp3-input-action .bp3-button.bp3-minimal:not(:hover):not(:focus) .bp3-icon,
.bp3-input-group .bp3-input:not(:focus) + .bp3-input-action .bp3-button.bp3-minimal:not(:hover):not(:focus) .bp3-icon-standard,
.bp3-input-group .bp3-input:not(:focus) + .bp3-input-action .bp3-button.bp3-minimal:not(:hover):not(:focus) .bp3-icon-large{
color:#5c7080; }
.bp3-input-group .bp3-input:not(:focus) + .bp3-button.bp3-minimal:disabled,
.bp3-input-group .bp3-input:not(:focus) + .bp3-input-action .bp3-button.bp3-minimal:disabled{
color:rgba(92, 112, 128, 0.6) !important; }
.bp3-input-group .bp3-input:not(:focus) + .bp3-button.bp3-minimal:disabled .bp3-icon, .bp3-input-group .bp3-input:not(:focus) + .bp3-button.bp3-minimal:disabled .bp3-icon-standard, .bp3-input-group .bp3-input:not(:focus) + .bp3-button.bp3-minimal:disabled .bp3-icon-large,
.bp3-input-group .bp3-input:not(:focus) + .bp3-input-action .bp3-button.bp3-minimal:disabled .bp3-icon,
.bp3-input-group .bp3-input:not(:focus) + .bp3-input-action .bp3-button.bp3-minimal:disabled .bp3-icon-standard,
.bp3-input-group .bp3-input:not(:focus) + .bp3-input-action .bp3-button.bp3-minimal:disabled .bp3-icon-large{
color:rgba(92, 112, 128, 0.6) !important; }
.bp3-input-group.bp3-disabled{
cursor:not-allowed; }
.bp3-input-group.bp3-disabled .bp3-icon{
color:rgba(92, 112, 128, 0.6); }
.bp3-input-group.bp3-large .bp3-button{
min-height:30px;
min-width:30px;
margin:5px; }
.bp3-input-group.bp3-large > .bp3-input-left-container > .bp3-icon,
.bp3-input-group.bp3-large > .bp3-icon,
.bp3-input-group.bp3-large .bp3-input-action > .bp3-spinner{
margin:12px; }
.bp3-input-group.bp3-large .bp3-input{
font-size:16px;
height:40px;
line-height:40px; }
.bp3-input-group.bp3-large .bp3-input[type="search"], .bp3-input-group.bp3-large .bp3-input.bp3-round{
padding:0 15px; }
.bp3-input-group.bp3-large .bp3-input:not(:first-child){
padding-left:40px; }
.bp3-input-group.bp3-large .bp3-input:not(:last-child){
padding-right:40px; }
.bp3-input-group.bp3-small .bp3-button{
min-height:20px;
min-width:20px;
margin:2px; }
.bp3-input-group.bp3-small .bp3-tag{
min-height:20px;
min-width:20px;
margin:2px; }
.bp3-input-group.bp3-small > .bp3-input-left-container > .bp3-icon,
.bp3-input-group.bp3-small > .bp3-icon,
.bp3-input-group.bp3-small .bp3-input-action > .bp3-spinner{
margin:4px; }
.bp3-input-group.bp3-small .bp3-input{
font-size:12px;
height:24px;
line-height:24px;
padding-left:8px;
padding-right:8px; }
.bp3-input-group.bp3-small .bp3-input[type="search"], .bp3-input-group.bp3-small .bp3-input.bp3-round{
padding:0 12px; }
.bp3-input-group.bp3-small .bp3-input:not(:first-child){
padding-left:24px; }
.bp3-input-group.bp3-small .bp3-input:not(:last-child){
padding-right:24px; }
.bp3-input-group.bp3-fill{
-webkit-box-flex:1;
-ms-flex:1 1 auto;
flex:1 1 auto;
width:100%; }
.bp3-input-group.bp3-round .bp3-button,
.bp3-input-group.bp3-round .bp3-input,
.bp3-input-group.bp3-round .bp3-tag{
border-radius:30px; }
.bp3-dark .bp3-input-group .bp3-icon{
color:#a7b6c2; }
.bp3-dark .bp3-input-group.bp3-disabled .bp3-icon{
color:rgba(167, 182, 194, 0.6); }
.bp3-input-group.bp3-intent-primary .bp3-input{
-webkit-box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px #137cbd, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px #137cbd, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-input-group.bp3-intent-primary .bp3-input:focus{
-webkit-box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-input-group.bp3-intent-primary .bp3-input[readonly]{
-webkit-box-shadow:inset 0 0 0 1px #137cbd;
box-shadow:inset 0 0 0 1px #137cbd; }
.bp3-input-group.bp3-intent-primary .bp3-input:disabled, .bp3-input-group.bp3-intent-primary .bp3-input.bp3-disabled{
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-input-group.bp3-intent-primary > .bp3-icon{
color:#106ba3; }
.bp3-dark .bp3-input-group.bp3-intent-primary > .bp3-icon{
color:#48aff0; }
.bp3-input-group.bp3-intent-success .bp3-input{
-webkit-box-shadow:0 0 0 0 rgba(15, 153, 96, 0), 0 0 0 0 rgba(15, 153, 96, 0), inset 0 0 0 1px #0f9960, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 0 rgba(15, 153, 96, 0), 0 0 0 0 rgba(15, 153, 96, 0), inset 0 0 0 1px #0f9960, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-input-group.bp3-intent-success .bp3-input:focus{
-webkit-box-shadow:0 0 0 1px #0f9960, 0 0 0 3px rgba(15, 153, 96, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px #0f9960, 0 0 0 3px rgba(15, 153, 96, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-input-group.bp3-intent-success .bp3-input[readonly]{
-webkit-box-shadow:inset 0 0 0 1px #0f9960;
box-shadow:inset 0 0 0 1px #0f9960; }
.bp3-input-group.bp3-intent-success .bp3-input:disabled, .bp3-input-group.bp3-intent-success .bp3-input.bp3-disabled{
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-input-group.bp3-intent-success > .bp3-icon{
color:#0d8050; }
.bp3-dark .bp3-input-group.bp3-intent-success > .bp3-icon{
color:#3dcc91; }
.bp3-input-group.bp3-intent-warning .bp3-input{
-webkit-box-shadow:0 0 0 0 rgba(217, 130, 43, 0), 0 0 0 0 rgba(217, 130, 43, 0), inset 0 0 0 1px #d9822b, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 0 rgba(217, 130, 43, 0), 0 0 0 0 rgba(217, 130, 43, 0), inset 0 0 0 1px #d9822b, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-input-group.bp3-intent-warning .bp3-input:focus{
-webkit-box-shadow:0 0 0 1px #d9822b, 0 0 0 3px rgba(217, 130, 43, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px #d9822b, 0 0 0 3px rgba(217, 130, 43, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-input-group.bp3-intent-warning .bp3-input[readonly]{
-webkit-box-shadow:inset 0 0 0 1px #d9822b;
box-shadow:inset 0 0 0 1px #d9822b; }
.bp3-input-group.bp3-intent-warning .bp3-input:disabled, .bp3-input-group.bp3-intent-warning .bp3-input.bp3-disabled{
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-input-group.bp3-intent-warning > .bp3-icon{
color:#bf7326; }
.bp3-dark .bp3-input-group.bp3-intent-warning > .bp3-icon{
color:#ffb366; }
.bp3-input-group.bp3-intent-danger .bp3-input{
-webkit-box-shadow:0 0 0 0 rgba(219, 55, 55, 0), 0 0 0 0 rgba(219, 55, 55, 0), inset 0 0 0 1px #db3737, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 0 rgba(219, 55, 55, 0), 0 0 0 0 rgba(219, 55, 55, 0), inset 0 0 0 1px #db3737, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-input-group.bp3-intent-danger .bp3-input:focus{
-webkit-box-shadow:0 0 0 1px #db3737, 0 0 0 3px rgba(219, 55, 55, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px #db3737, 0 0 0 3px rgba(219, 55, 55, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-input-group.bp3-intent-danger .bp3-input[readonly]{
-webkit-box-shadow:inset 0 0 0 1px #db3737;
box-shadow:inset 0 0 0 1px #db3737; }
.bp3-input-group.bp3-intent-danger .bp3-input:disabled, .bp3-input-group.bp3-intent-danger .bp3-input.bp3-disabled{
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-input-group.bp3-intent-danger > .bp3-icon{
color:#c23030; }
.bp3-dark .bp3-input-group.bp3-intent-danger > .bp3-icon{
color:#ff7373; }
.bp3-input{
-webkit-appearance:none;
-moz-appearance:none;
appearance:none;
background:#ffffff;
border:none;
border-radius:3px;
-webkit-box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2);
color:#182026;
font-size:14px;
font-weight:400;
height:30px;
line-height:30px;
outline:none;
padding:0 10px;
-webkit-transition:-webkit-box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9);
transition:-webkit-box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9);
transition:box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9);
transition:box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9), -webkit-box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9);
vertical-align:middle; }
.bp3-input::-webkit-input-placeholder{
color:rgba(92, 112, 128, 0.6);
opacity:1; }
.bp3-input::-moz-placeholder{
color:rgba(92, 112, 128, 0.6);
opacity:1; }
.bp3-input:-ms-input-placeholder{
color:rgba(92, 112, 128, 0.6);
opacity:1; }
.bp3-input::-ms-input-placeholder{
color:rgba(92, 112, 128, 0.6);
opacity:1; }
.bp3-input::placeholder{
color:rgba(92, 112, 128, 0.6);
opacity:1; }
.bp3-input:focus, .bp3-input.bp3-active{
-webkit-box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-input[type="search"], .bp3-input.bp3-round{
border-radius:30px;
-webkit-box-sizing:border-box;
box-sizing:border-box;
padding-left:10px; }
.bp3-input[readonly]{
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.15);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.15); }
.bp3-input:disabled, .bp3-input.bp3-disabled{
background:rgba(206, 217, 224, 0.5);
-webkit-box-shadow:none;
box-shadow:none;
color:rgba(92, 112, 128, 0.6);
cursor:not-allowed;
resize:none; }
.bp3-input.bp3-large{
font-size:16px;
height:40px;
line-height:40px; }
.bp3-input.bp3-large[type="search"], .bp3-input.bp3-large.bp3-round{
padding:0 15px; }
.bp3-input.bp3-small{
font-size:12px;
height:24px;
line-height:24px;
padding-left:8px;
padding-right:8px; }
.bp3-input.bp3-small[type="search"], .bp3-input.bp3-small.bp3-round{
padding:0 12px; }
.bp3-input.bp3-fill{
-webkit-box-flex:1;
-ms-flex:1 1 auto;
flex:1 1 auto;
width:100%; }
.bp3-dark .bp3-input{
background:rgba(16, 22, 26, 0.3);
-webkit-box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
color:#f5f8fa; }
.bp3-dark .bp3-input::-webkit-input-placeholder{
color:rgba(167, 182, 194, 0.6); }
.bp3-dark .bp3-input::-moz-placeholder{
color:rgba(167, 182, 194, 0.6); }
.bp3-dark .bp3-input:-ms-input-placeholder{
color:rgba(167, 182, 194, 0.6); }
.bp3-dark .bp3-input::-ms-input-placeholder{
color:rgba(167, 182, 194, 0.6); }
.bp3-dark .bp3-input::placeholder{
color:rgba(167, 182, 194, 0.6); }
.bp3-dark .bp3-input:focus{
-webkit-box-shadow:0 0 0 1px #137cbd, 0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px #137cbd, 0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-input[readonly]{
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-input:disabled, .bp3-dark .bp3-input.bp3-disabled{
background:rgba(57, 75, 89, 0.5);
-webkit-box-shadow:none;
box-shadow:none;
color:rgba(167, 182, 194, 0.6); }
.bp3-input.bp3-intent-primary{
-webkit-box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px #137cbd, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px #137cbd, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-input.bp3-intent-primary:focus{
-webkit-box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-input.bp3-intent-primary[readonly]{
-webkit-box-shadow:inset 0 0 0 1px #137cbd;
box-shadow:inset 0 0 0 1px #137cbd; }
.bp3-input.bp3-intent-primary:disabled, .bp3-input.bp3-intent-primary.bp3-disabled{
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-dark .bp3-input.bp3-intent-primary{
-webkit-box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px #137cbd, inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px #137cbd, inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-input.bp3-intent-primary:focus{
-webkit-box-shadow:0 0 0 1px #137cbd, 0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px #137cbd, 0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-input.bp3-intent-primary[readonly]{
-webkit-box-shadow:inset 0 0 0 1px #137cbd;
box-shadow:inset 0 0 0 1px #137cbd; }
.bp3-dark .bp3-input.bp3-intent-primary:disabled, .bp3-dark .bp3-input.bp3-intent-primary.bp3-disabled{
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-input.bp3-intent-success{
-webkit-box-shadow:0 0 0 0 rgba(15, 153, 96, 0), 0 0 0 0 rgba(15, 153, 96, 0), inset 0 0 0 1px #0f9960, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 0 rgba(15, 153, 96, 0), 0 0 0 0 rgba(15, 153, 96, 0), inset 0 0 0 1px #0f9960, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-input.bp3-intent-success:focus{
-webkit-box-shadow:0 0 0 1px #0f9960, 0 0 0 3px rgba(15, 153, 96, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px #0f9960, 0 0 0 3px rgba(15, 153, 96, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-input.bp3-intent-success[readonly]{
-webkit-box-shadow:inset 0 0 0 1px #0f9960;
box-shadow:inset 0 0 0 1px #0f9960; }
.bp3-input.bp3-intent-success:disabled, .bp3-input.bp3-intent-success.bp3-disabled{
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-dark .bp3-input.bp3-intent-success{
-webkit-box-shadow:0 0 0 0 rgba(15, 153, 96, 0), 0 0 0 0 rgba(15, 153, 96, 0), 0 0 0 0 rgba(15, 153, 96, 0), inset 0 0 0 1px #0f9960, inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 0 rgba(15, 153, 96, 0), 0 0 0 0 rgba(15, 153, 96, 0), 0 0 0 0 rgba(15, 153, 96, 0), inset 0 0 0 1px #0f9960, inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-input.bp3-intent-success:focus{
-webkit-box-shadow:0 0 0 1px #0f9960, 0 0 0 1px #0f9960, 0 0 0 3px rgba(15, 153, 96, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px #0f9960, 0 0 0 1px #0f9960, 0 0 0 3px rgba(15, 153, 96, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-input.bp3-intent-success[readonly]{
-webkit-box-shadow:inset 0 0 0 1px #0f9960;
box-shadow:inset 0 0 0 1px #0f9960; }
.bp3-dark .bp3-input.bp3-intent-success:disabled, .bp3-dark .bp3-input.bp3-intent-success.bp3-disabled{
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-input.bp3-intent-warning{
-webkit-box-shadow:0 0 0 0 rgba(217, 130, 43, 0), 0 0 0 0 rgba(217, 130, 43, 0), inset 0 0 0 1px #d9822b, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 0 rgba(217, 130, 43, 0), 0 0 0 0 rgba(217, 130, 43, 0), inset 0 0 0 1px #d9822b, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-input.bp3-intent-warning:focus{
-webkit-box-shadow:0 0 0 1px #d9822b, 0 0 0 3px rgba(217, 130, 43, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px #d9822b, 0 0 0 3px rgba(217, 130, 43, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-input.bp3-intent-warning[readonly]{
-webkit-box-shadow:inset 0 0 0 1px #d9822b;
box-shadow:inset 0 0 0 1px #d9822b; }
.bp3-input.bp3-intent-warning:disabled, .bp3-input.bp3-intent-warning.bp3-disabled{
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-dark .bp3-input.bp3-intent-warning{
-webkit-box-shadow:0 0 0 0 rgba(217, 130, 43, 0), 0 0 0 0 rgba(217, 130, 43, 0), 0 0 0 0 rgba(217, 130, 43, 0), inset 0 0 0 1px #d9822b, inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 0 rgba(217, 130, 43, 0), 0 0 0 0 rgba(217, 130, 43, 0), 0 0 0 0 rgba(217, 130, 43, 0), inset 0 0 0 1px #d9822b, inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-input.bp3-intent-warning:focus{
-webkit-box-shadow:0 0 0 1px #d9822b, 0 0 0 1px #d9822b, 0 0 0 3px rgba(217, 130, 43, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px #d9822b, 0 0 0 1px #d9822b, 0 0 0 3px rgba(217, 130, 43, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-input.bp3-intent-warning[readonly]{
-webkit-box-shadow:inset 0 0 0 1px #d9822b;
box-shadow:inset 0 0 0 1px #d9822b; }
.bp3-dark .bp3-input.bp3-intent-warning:disabled, .bp3-dark .bp3-input.bp3-intent-warning.bp3-disabled{
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-input.bp3-intent-danger{
-webkit-box-shadow:0 0 0 0 rgba(219, 55, 55, 0), 0 0 0 0 rgba(219, 55, 55, 0), inset 0 0 0 1px #db3737, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 0 rgba(219, 55, 55, 0), 0 0 0 0 rgba(219, 55, 55, 0), inset 0 0 0 1px #db3737, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-input.bp3-intent-danger:focus{
-webkit-box-shadow:0 0 0 1px #db3737, 0 0 0 3px rgba(219, 55, 55, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px #db3737, 0 0 0 3px rgba(219, 55, 55, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-input.bp3-intent-danger[readonly]{
-webkit-box-shadow:inset 0 0 0 1px #db3737;
box-shadow:inset 0 0 0 1px #db3737; }
.bp3-input.bp3-intent-danger:disabled, .bp3-input.bp3-intent-danger.bp3-disabled{
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-dark .bp3-input.bp3-intent-danger{
-webkit-box-shadow:0 0 0 0 rgba(219, 55, 55, 0), 0 0 0 0 rgba(219, 55, 55, 0), 0 0 0 0 rgba(219, 55, 55, 0), inset 0 0 0 1px #db3737, inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 0 rgba(219, 55, 55, 0), 0 0 0 0 rgba(219, 55, 55, 0), 0 0 0 0 rgba(219, 55, 55, 0), inset 0 0 0 1px #db3737, inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-input.bp3-intent-danger:focus{
-webkit-box-shadow:0 0 0 1px #db3737, 0 0 0 1px #db3737, 0 0 0 3px rgba(219, 55, 55, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px #db3737, 0 0 0 1px #db3737, 0 0 0 3px rgba(219, 55, 55, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-input.bp3-intent-danger[readonly]{
-webkit-box-shadow:inset 0 0 0 1px #db3737;
box-shadow:inset 0 0 0 1px #db3737; }
.bp3-dark .bp3-input.bp3-intent-danger:disabled, .bp3-dark .bp3-input.bp3-intent-danger.bp3-disabled{
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-input::-ms-clear{
display:none; }
textarea.bp3-input{
max-width:100%;
padding:10px; }
textarea.bp3-input, textarea.bp3-input.bp3-large, textarea.bp3-input.bp3-small{
height:auto;
line-height:inherit; }
textarea.bp3-input.bp3-small{
padding:8px; }
.bp3-dark textarea.bp3-input{
background:rgba(16, 22, 26, 0.3);
-webkit-box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
color:#f5f8fa; }
.bp3-dark textarea.bp3-input::-webkit-input-placeholder{
color:rgba(167, 182, 194, 0.6); }
.bp3-dark textarea.bp3-input::-moz-placeholder{
color:rgba(167, 182, 194, 0.6); }
.bp3-dark textarea.bp3-input:-ms-input-placeholder{
color:rgba(167, 182, 194, 0.6); }
.bp3-dark textarea.bp3-input::-ms-input-placeholder{
color:rgba(167, 182, 194, 0.6); }
.bp3-dark textarea.bp3-input::placeholder{
color:rgba(167, 182, 194, 0.6); }
.bp3-dark textarea.bp3-input:focus{
-webkit-box-shadow:0 0 0 1px #137cbd, 0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px #137cbd, 0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
.bp3-dark textarea.bp3-input[readonly]{
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4); }
.bp3-dark textarea.bp3-input:disabled, .bp3-dark textarea.bp3-input.bp3-disabled{
background:rgba(57, 75, 89, 0.5);
-webkit-box-shadow:none;
box-shadow:none;
color:rgba(167, 182, 194, 0.6); }
label.bp3-label{
display:block;
margin-bottom:15px;
margin-top:0; }
label.bp3-label .bp3-html-select,
label.bp3-label .bp3-input,
label.bp3-label .bp3-select,
label.bp3-label .bp3-slider,
label.bp3-label .bp3-popover-wrapper{
display:block;
margin-top:5px;
text-transform:none; }
label.bp3-label .bp3-button-group{
margin-top:5px; }
label.bp3-label .bp3-select select,
label.bp3-label .bp3-html-select select{
font-weight:400;
vertical-align:top;
width:100%; }
label.bp3-label.bp3-disabled,
label.bp3-label.bp3-disabled .bp3-text-muted{
color:rgba(92, 112, 128, 0.6); }
label.bp3-label.bp3-inline{
line-height:30px; }
label.bp3-label.bp3-inline .bp3-html-select,
label.bp3-label.bp3-inline .bp3-input,
label.bp3-label.bp3-inline .bp3-input-group,
label.bp3-label.bp3-inline .bp3-select,
label.bp3-label.bp3-inline .bp3-popover-wrapper{
display:inline-block;
margin:0 0 0 5px;
vertical-align:top; }
label.bp3-label.bp3-inline .bp3-button-group{
margin:0 0 0 5px; }
label.bp3-label.bp3-inline .bp3-input-group .bp3-input{
margin-left:0; }
label.bp3-label.bp3-inline.bp3-large{
line-height:40px; }
label.bp3-label:not(.bp3-inline) .bp3-popover-target{
display:block; }
.bp3-dark label.bp3-label{
color:#f5f8fa; }
.bp3-dark label.bp3-label.bp3-disabled,
.bp3-dark label.bp3-label.bp3-disabled .bp3-text-muted{
color:rgba(167, 182, 194, 0.6); }
.bp3-numeric-input .bp3-button-group.bp3-vertical > .bp3-button{
-webkit-box-flex:1;
-ms-flex:1 1 14px;
flex:1 1 14px;
min-height:0;
padding:0;
width:30px; }
.bp3-numeric-input .bp3-button-group.bp3-vertical > .bp3-button:first-child{
border-radius:0 3px 0 0; }
.bp3-numeric-input .bp3-button-group.bp3-vertical > .bp3-button:last-child{
border-radius:0 0 3px 0; }
.bp3-numeric-input .bp3-button-group.bp3-vertical:first-child > .bp3-button:first-child{
border-radius:3px 0 0 0; }
.bp3-numeric-input .bp3-button-group.bp3-vertical:first-child > .bp3-button:last-child{
border-radius:0 0 0 3px; }
.bp3-numeric-input.bp3-large .bp3-button-group.bp3-vertical > .bp3-button{
width:40px; }
form{
display:block; }
.bp3-html-select select,
.bp3-select select{
display:-webkit-inline-box;
display:-ms-inline-flexbox;
display:inline-flex;
-webkit-box-orient:horizontal;
-webkit-box-direction:normal;
-ms-flex-direction:row;
flex-direction:row;
-webkit-box-align:center;
-ms-flex-align:center;
align-items:center;
border:none;
border-radius:3px;
cursor:pointer;
font-size:14px;
-webkit-box-pack:center;
-ms-flex-pack:center;
justify-content:center;
padding:5px 10px;
text-align:left;
vertical-align:middle;
background-color:#f5f8fa;
background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.8)), to(rgba(255, 255, 255, 0)));
background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0));
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
color:#182026;
-moz-appearance:none;
-webkit-appearance:none;
border-radius:3px;
height:30px;
padding:0 25px 0 10px;
width:100%; }
.bp3-html-select select > *, .bp3-select select > *{
-webkit-box-flex:0;
-ms-flex-positive:0;
flex-grow:0;
-ms-flex-negative:0;
flex-shrink:0; }
.bp3-html-select select > .bp3-fill, .bp3-select select > .bp3-fill{
-webkit-box-flex:1;
-ms-flex-positive:1;
flex-grow:1;
-ms-flex-negative:1;
flex-shrink:1; }
.bp3-html-select select::before,
.bp3-select select::before, .bp3-html-select select > *, .bp3-select select > *{
margin-right:7px; }
.bp3-html-select select:empty::before,
.bp3-select select:empty::before,
.bp3-html-select select > :last-child,
.bp3-select select > :last-child{
margin-right:0; }
.bp3-html-select select:hover,
.bp3-select select:hover{
background-clip:padding-box;
background-color:#ebf1f5;
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1); }
.bp3-html-select select:active,
.bp3-select select:active, .bp3-html-select select.bp3-active,
.bp3-select select.bp3-active{
background-color:#d8e1e8;
background-image:none;
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 2px rgba(16, 22, 26, 0.2);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 2px rgba(16, 22, 26, 0.2); }
.bp3-html-select select:disabled,
.bp3-select select:disabled, .bp3-html-select select.bp3-disabled,
.bp3-select select.bp3-disabled{
background-color:rgba(206, 217, 224, 0.5);
background-image:none;
-webkit-box-shadow:none;
box-shadow:none;
color:rgba(92, 112, 128, 0.6);
cursor:not-allowed;
outline:none; }
.bp3-html-select select:disabled.bp3-active,
.bp3-select select:disabled.bp3-active, .bp3-html-select select:disabled.bp3-active:hover,
.bp3-select select:disabled.bp3-active:hover, .bp3-html-select select.bp3-disabled.bp3-active,
.bp3-select select.bp3-disabled.bp3-active, .bp3-html-select select.bp3-disabled.bp3-active:hover,
.bp3-select select.bp3-disabled.bp3-active:hover{
background:rgba(206, 217, 224, 0.7); }
.bp3-html-select.bp3-minimal select,
.bp3-select.bp3-minimal select{
background:none;
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-html-select.bp3-minimal select:hover,
.bp3-select.bp3-minimal select:hover{
background:rgba(167, 182, 194, 0.3);
-webkit-box-shadow:none;
box-shadow:none;
color:#182026;
text-decoration:none; }
.bp3-html-select.bp3-minimal select:active,
.bp3-select.bp3-minimal select:active, .bp3-html-select.bp3-minimal select.bp3-active,
.bp3-select.bp3-minimal select.bp3-active{
background:rgba(115, 134, 148, 0.3);
-webkit-box-shadow:none;
box-shadow:none;
color:#182026; }
.bp3-html-select.bp3-minimal select:disabled,
.bp3-select.bp3-minimal select:disabled, .bp3-html-select.bp3-minimal select:disabled:hover,
.bp3-select.bp3-minimal select:disabled:hover, .bp3-html-select.bp3-minimal select.bp3-disabled,
.bp3-select.bp3-minimal select.bp3-disabled, .bp3-html-select.bp3-minimal select.bp3-disabled:hover,
.bp3-select.bp3-minimal select.bp3-disabled:hover{
background:none;
color:rgba(92, 112, 128, 0.6);
cursor:not-allowed; }
.bp3-html-select.bp3-minimal select:disabled.bp3-active,
.bp3-select.bp3-minimal select:disabled.bp3-active, .bp3-html-select.bp3-minimal select:disabled:hover.bp3-active,
.bp3-select.bp3-minimal select:disabled:hover.bp3-active, .bp3-html-select.bp3-minimal select.bp3-disabled.bp3-active,
.bp3-select.bp3-minimal select.bp3-disabled.bp3-active, .bp3-html-select.bp3-minimal select.bp3-disabled:hover.bp3-active,
.bp3-select.bp3-minimal select.bp3-disabled:hover.bp3-active{
background:rgba(115, 134, 148, 0.3); }
.bp3-dark .bp3-html-select.bp3-minimal select, .bp3-html-select.bp3-minimal .bp3-dark select,
.bp3-dark .bp3-select.bp3-minimal select, .bp3-select.bp3-minimal .bp3-dark select{
background:none;
-webkit-box-shadow:none;
box-shadow:none;
color:inherit; }
.bp3-dark .bp3-html-select.bp3-minimal select:hover, .bp3-html-select.bp3-minimal .bp3-dark select:hover,
.bp3-dark .bp3-select.bp3-minimal select:hover, .bp3-select.bp3-minimal .bp3-dark select:hover, .bp3-dark .bp3-html-select.bp3-minimal select:active, .bp3-html-select.bp3-minimal .bp3-dark select:active,
.bp3-dark .bp3-select.bp3-minimal select:active, .bp3-select.bp3-minimal .bp3-dark select:active, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-active,
.bp3-dark .bp3-select.bp3-minimal select.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-active{
background:none;
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-dark .bp3-html-select.bp3-minimal select:hover, .bp3-html-select.bp3-minimal .bp3-dark select:hover,
.bp3-dark .bp3-select.bp3-minimal select:hover, .bp3-select.bp3-minimal .bp3-dark select:hover{
background:rgba(138, 155, 168, 0.15); }
.bp3-dark .bp3-html-select.bp3-minimal select:active, .bp3-html-select.bp3-minimal .bp3-dark select:active,
.bp3-dark .bp3-select.bp3-minimal select:active, .bp3-select.bp3-minimal .bp3-dark select:active, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-active,
.bp3-dark .bp3-select.bp3-minimal select.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-active{
background:rgba(138, 155, 168, 0.3);
color:#f5f8fa; }
.bp3-dark .bp3-html-select.bp3-minimal select:disabled, .bp3-html-select.bp3-minimal .bp3-dark select:disabled,
.bp3-dark .bp3-select.bp3-minimal select:disabled, .bp3-select.bp3-minimal .bp3-dark select:disabled, .bp3-dark .bp3-html-select.bp3-minimal select:disabled:hover, .bp3-html-select.bp3-minimal .bp3-dark select:disabled:hover,
.bp3-dark .bp3-select.bp3-minimal select:disabled:hover, .bp3-select.bp3-minimal .bp3-dark select:disabled:hover, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-disabled, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-disabled,
.bp3-dark .bp3-select.bp3-minimal select.bp3-disabled, .bp3-select.bp3-minimal .bp3-dark select.bp3-disabled, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-disabled:hover, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-disabled:hover,
.bp3-dark .bp3-select.bp3-minimal select.bp3-disabled:hover, .bp3-select.bp3-minimal .bp3-dark select.bp3-disabled:hover{
background:none;
color:rgba(167, 182, 194, 0.6);
cursor:not-allowed; }
.bp3-dark .bp3-html-select.bp3-minimal select:disabled.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select:disabled.bp3-active,
.bp3-dark .bp3-select.bp3-minimal select:disabled.bp3-active, .bp3-select.bp3-minimal .bp3-dark select:disabled.bp3-active, .bp3-dark .bp3-html-select.bp3-minimal select:disabled:hover.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select:disabled:hover.bp3-active,
.bp3-dark .bp3-select.bp3-minimal select:disabled:hover.bp3-active, .bp3-select.bp3-minimal .bp3-dark select:disabled:hover.bp3-active, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-disabled.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-disabled.bp3-active,
.bp3-dark .bp3-select.bp3-minimal select.bp3-disabled.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-disabled.bp3-active, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-disabled:hover.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-disabled:hover.bp3-active,
.bp3-dark .bp3-select.bp3-minimal select.bp3-disabled:hover.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-disabled:hover.bp3-active{
background:rgba(138, 155, 168, 0.3); }
.bp3-html-select.bp3-minimal select.bp3-intent-primary,
.bp3-select.bp3-minimal select.bp3-intent-primary{
color:#106ba3; }
.bp3-html-select.bp3-minimal select.bp3-intent-primary:hover,
.bp3-select.bp3-minimal select.bp3-intent-primary:hover, .bp3-html-select.bp3-minimal select.bp3-intent-primary:active,
.bp3-select.bp3-minimal select.bp3-intent-primary:active, .bp3-html-select.bp3-minimal select.bp3-intent-primary.bp3-active,
.bp3-select.bp3-minimal select.bp3-intent-primary.bp3-active{
background:none;
-webkit-box-shadow:none;
box-shadow:none;
color:#106ba3; }
.bp3-html-select.bp3-minimal select.bp3-intent-primary:hover,
.bp3-select.bp3-minimal select.bp3-intent-primary:hover{
background:rgba(19, 124, 189, 0.15);
color:#106ba3; }
.bp3-html-select.bp3-minimal select.bp3-intent-primary:active,
.bp3-select.bp3-minimal select.bp3-intent-primary:active, .bp3-html-select.bp3-minimal select.bp3-intent-primary.bp3-active,
.bp3-select.bp3-minimal select.bp3-intent-primary.bp3-active{
background:rgba(19, 124, 189, 0.3);
color:#106ba3; }
.bp3-html-select.bp3-minimal select.bp3-intent-primary:disabled,
.bp3-select.bp3-minimal select.bp3-intent-primary:disabled, .bp3-html-select.bp3-minimal select.bp3-intent-primary.bp3-disabled,
.bp3-select.bp3-minimal select.bp3-intent-primary.bp3-disabled{
background:none;
color:rgba(16, 107, 163, 0.5); }
.bp3-html-select.bp3-minimal select.bp3-intent-primary:disabled.bp3-active,
.bp3-select.bp3-minimal select.bp3-intent-primary:disabled.bp3-active, .bp3-html-select.bp3-minimal select.bp3-intent-primary.bp3-disabled.bp3-active,
.bp3-select.bp3-minimal select.bp3-intent-primary.bp3-disabled.bp3-active{
background:rgba(19, 124, 189, 0.3); }
.bp3-html-select.bp3-minimal select.bp3-intent-primary .bp3-button-spinner .bp3-spinner-head, .bp3-select.bp3-minimal select.bp3-intent-primary .bp3-button-spinner .bp3-spinner-head{
stroke:#106ba3; }
.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-primary, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-primary,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-primary, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-primary{
color:#48aff0; }
.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-primary:hover, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-primary:hover,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-primary:hover, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-primary:hover{
background:rgba(19, 124, 189, 0.2);
color:#48aff0; }
.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-primary:active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-primary:active,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-primary:active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-primary:active, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-primary.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-primary.bp3-active,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-primary.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-primary.bp3-active{
background:rgba(19, 124, 189, 0.3);
color:#48aff0; }
.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-primary:disabled, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-primary:disabled,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-primary:disabled, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-primary:disabled, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-primary.bp3-disabled, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-primary.bp3-disabled,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-primary.bp3-disabled, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-primary.bp3-disabled{
background:none;
color:rgba(72, 175, 240, 0.5); }
.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-primary:disabled.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-primary:disabled.bp3-active,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-primary:disabled.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-primary:disabled.bp3-active, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-primary.bp3-disabled.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-primary.bp3-disabled.bp3-active,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-primary.bp3-disabled.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-primary.bp3-disabled.bp3-active{
background:rgba(19, 124, 189, 0.3); }
.bp3-html-select.bp3-minimal select.bp3-intent-success,
.bp3-select.bp3-minimal select.bp3-intent-success{
color:#0d8050; }
.bp3-html-select.bp3-minimal select.bp3-intent-success:hover,
.bp3-select.bp3-minimal select.bp3-intent-success:hover, .bp3-html-select.bp3-minimal select.bp3-intent-success:active,
.bp3-select.bp3-minimal select.bp3-intent-success:active, .bp3-html-select.bp3-minimal select.bp3-intent-success.bp3-active,
.bp3-select.bp3-minimal select.bp3-intent-success.bp3-active{
background:none;
-webkit-box-shadow:none;
box-shadow:none;
color:#0d8050; }
.bp3-html-select.bp3-minimal select.bp3-intent-success:hover,
.bp3-select.bp3-minimal select.bp3-intent-success:hover{
background:rgba(15, 153, 96, 0.15);
color:#0d8050; }
.bp3-html-select.bp3-minimal select.bp3-intent-success:active,
.bp3-select.bp3-minimal select.bp3-intent-success:active, .bp3-html-select.bp3-minimal select.bp3-intent-success.bp3-active,
.bp3-select.bp3-minimal select.bp3-intent-success.bp3-active{
background:rgba(15, 153, 96, 0.3);
color:#0d8050; }
.bp3-html-select.bp3-minimal select.bp3-intent-success:disabled,
.bp3-select.bp3-minimal select.bp3-intent-success:disabled, .bp3-html-select.bp3-minimal select.bp3-intent-success.bp3-disabled,
.bp3-select.bp3-minimal select.bp3-intent-success.bp3-disabled{
background:none;
color:rgba(13, 128, 80, 0.5); }
.bp3-html-select.bp3-minimal select.bp3-intent-success:disabled.bp3-active,
.bp3-select.bp3-minimal select.bp3-intent-success:disabled.bp3-active, .bp3-html-select.bp3-minimal select.bp3-intent-success.bp3-disabled.bp3-active,
.bp3-select.bp3-minimal select.bp3-intent-success.bp3-disabled.bp3-active{
background:rgba(15, 153, 96, 0.3); }
.bp3-html-select.bp3-minimal select.bp3-intent-success .bp3-button-spinner .bp3-spinner-head, .bp3-select.bp3-minimal select.bp3-intent-success .bp3-button-spinner .bp3-spinner-head{
stroke:#0d8050; }
.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-success, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-success,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-success, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-success{
color:#3dcc91; }
.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-success:hover, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-success:hover,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-success:hover, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-success:hover{
background:rgba(15, 153, 96, 0.2);
color:#3dcc91; }
.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-success:active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-success:active,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-success:active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-success:active, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-success.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-success.bp3-active,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-success.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-success.bp3-active{
background:rgba(15, 153, 96, 0.3);
color:#3dcc91; }
.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-success:disabled, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-success:disabled,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-success:disabled, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-success:disabled, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-success.bp3-disabled, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-success.bp3-disabled,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-success.bp3-disabled, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-success.bp3-disabled{
background:none;
color:rgba(61, 204, 145, 0.5); }
.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-success:disabled.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-success:disabled.bp3-active,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-success:disabled.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-success:disabled.bp3-active, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-success.bp3-disabled.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-success.bp3-disabled.bp3-active,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-success.bp3-disabled.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-success.bp3-disabled.bp3-active{
background:rgba(15, 153, 96, 0.3); }
.bp3-html-select.bp3-minimal select.bp3-intent-warning,
.bp3-select.bp3-minimal select.bp3-intent-warning{
color:#bf7326; }
.bp3-html-select.bp3-minimal select.bp3-intent-warning:hover,
.bp3-select.bp3-minimal select.bp3-intent-warning:hover, .bp3-html-select.bp3-minimal select.bp3-intent-warning:active,
.bp3-select.bp3-minimal select.bp3-intent-warning:active, .bp3-html-select.bp3-minimal select.bp3-intent-warning.bp3-active,
.bp3-select.bp3-minimal select.bp3-intent-warning.bp3-active{
background:none;
-webkit-box-shadow:none;
box-shadow:none;
color:#bf7326; }
.bp3-html-select.bp3-minimal select.bp3-intent-warning:hover,
.bp3-select.bp3-minimal select.bp3-intent-warning:hover{
background:rgba(217, 130, 43, 0.15);
color:#bf7326; }
.bp3-html-select.bp3-minimal select.bp3-intent-warning:active,
.bp3-select.bp3-minimal select.bp3-intent-warning:active, .bp3-html-select.bp3-minimal select.bp3-intent-warning.bp3-active,
.bp3-select.bp3-minimal select.bp3-intent-warning.bp3-active{
background:rgba(217, 130, 43, 0.3);
color:#bf7326; }
.bp3-html-select.bp3-minimal select.bp3-intent-warning:disabled,
.bp3-select.bp3-minimal select.bp3-intent-warning:disabled, .bp3-html-select.bp3-minimal select.bp3-intent-warning.bp3-disabled,
.bp3-select.bp3-minimal select.bp3-intent-warning.bp3-disabled{
background:none;
color:rgba(191, 115, 38, 0.5); }
.bp3-html-select.bp3-minimal select.bp3-intent-warning:disabled.bp3-active,
.bp3-select.bp3-minimal select.bp3-intent-warning:disabled.bp3-active, .bp3-html-select.bp3-minimal select.bp3-intent-warning.bp3-disabled.bp3-active,
.bp3-select.bp3-minimal select.bp3-intent-warning.bp3-disabled.bp3-active{
background:rgba(217, 130, 43, 0.3); }
.bp3-html-select.bp3-minimal select.bp3-intent-warning .bp3-button-spinner .bp3-spinner-head, .bp3-select.bp3-minimal select.bp3-intent-warning .bp3-button-spinner .bp3-spinner-head{
stroke:#bf7326; }
.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-warning, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-warning,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-warning, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-warning{
color:#ffb366; }
.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-warning:hover, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-warning:hover,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-warning:hover, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-warning:hover{
background:rgba(217, 130, 43, 0.2);
color:#ffb366; }
.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-warning:active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-warning:active,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-warning:active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-warning:active, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-warning.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-warning.bp3-active,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-warning.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-warning.bp3-active{
background:rgba(217, 130, 43, 0.3);
color:#ffb366; }
.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-warning:disabled, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-warning:disabled,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-warning:disabled, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-warning:disabled, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-warning.bp3-disabled, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-warning.bp3-disabled,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-warning.bp3-disabled, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-warning.bp3-disabled{
background:none;
color:rgba(255, 179, 102, 0.5); }
.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-warning:disabled.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-warning:disabled.bp3-active,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-warning:disabled.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-warning:disabled.bp3-active, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-warning.bp3-disabled.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-warning.bp3-disabled.bp3-active,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-warning.bp3-disabled.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-warning.bp3-disabled.bp3-active{
background:rgba(217, 130, 43, 0.3); }
.bp3-html-select.bp3-minimal select.bp3-intent-danger,
.bp3-select.bp3-minimal select.bp3-intent-danger{
color:#c23030; }
.bp3-html-select.bp3-minimal select.bp3-intent-danger:hover,
.bp3-select.bp3-minimal select.bp3-intent-danger:hover, .bp3-html-select.bp3-minimal select.bp3-intent-danger:active,
.bp3-select.bp3-minimal select.bp3-intent-danger:active, .bp3-html-select.bp3-minimal select.bp3-intent-danger.bp3-active,
.bp3-select.bp3-minimal select.bp3-intent-danger.bp3-active{
background:none;
-webkit-box-shadow:none;
box-shadow:none;
color:#c23030; }
.bp3-html-select.bp3-minimal select.bp3-intent-danger:hover,
.bp3-select.bp3-minimal select.bp3-intent-danger:hover{
background:rgba(219, 55, 55, 0.15);
color:#c23030; }
.bp3-html-select.bp3-minimal select.bp3-intent-danger:active,
.bp3-select.bp3-minimal select.bp3-intent-danger:active, .bp3-html-select.bp3-minimal select.bp3-intent-danger.bp3-active,
.bp3-select.bp3-minimal select.bp3-intent-danger.bp3-active{
background:rgba(219, 55, 55, 0.3);
color:#c23030; }
.bp3-html-select.bp3-minimal select.bp3-intent-danger:disabled,
.bp3-select.bp3-minimal select.bp3-intent-danger:disabled, .bp3-html-select.bp3-minimal select.bp3-intent-danger.bp3-disabled,
.bp3-select.bp3-minimal select.bp3-intent-danger.bp3-disabled{
background:none;
color:rgba(194, 48, 48, 0.5); }
.bp3-html-select.bp3-minimal select.bp3-intent-danger:disabled.bp3-active,
.bp3-select.bp3-minimal select.bp3-intent-danger:disabled.bp3-active, .bp3-html-select.bp3-minimal select.bp3-intent-danger.bp3-disabled.bp3-active,
.bp3-select.bp3-minimal select.bp3-intent-danger.bp3-disabled.bp3-active{
background:rgba(219, 55, 55, 0.3); }
.bp3-html-select.bp3-minimal select.bp3-intent-danger .bp3-button-spinner .bp3-spinner-head, .bp3-select.bp3-minimal select.bp3-intent-danger .bp3-button-spinner .bp3-spinner-head{
stroke:#c23030; }
.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-danger, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-danger,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-danger, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-danger{
color:#ff7373; }
.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-danger:hover, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-danger:hover,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-danger:hover, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-danger:hover{
background:rgba(219, 55, 55, 0.2);
color:#ff7373; }
.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-danger:active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-danger:active,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-danger:active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-danger:active, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-danger.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-danger.bp3-active,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-danger.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-danger.bp3-active{
background:rgba(219, 55, 55, 0.3);
color:#ff7373; }
.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-danger:disabled, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-danger:disabled,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-danger:disabled, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-danger:disabled, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-danger.bp3-disabled, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-danger.bp3-disabled,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-danger.bp3-disabled, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-danger.bp3-disabled{
background:none;
color:rgba(255, 115, 115, 0.5); }
.bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-danger:disabled.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-danger:disabled.bp3-active,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-danger:disabled.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-danger:disabled.bp3-active, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-danger.bp3-disabled.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-danger.bp3-disabled.bp3-active,
.bp3-dark .bp3-select.bp3-minimal select.bp3-intent-danger.bp3-disabled.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-danger.bp3-disabled.bp3-active{
background:rgba(219, 55, 55, 0.3); }
.bp3-html-select.bp3-large select,
.bp3-select.bp3-large select{
font-size:16px;
height:40px;
padding-right:35px; }
.bp3-dark .bp3-html-select select, .bp3-dark .bp3-select select{
background-color:#394b59;
background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.05)), to(rgba(255, 255, 255, 0)));
background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0));
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
color:#f5f8fa; }
.bp3-dark .bp3-html-select select:hover, .bp3-dark .bp3-select select:hover, .bp3-dark .bp3-html-select select:active, .bp3-dark .bp3-select select:active, .bp3-dark .bp3-html-select select.bp3-active, .bp3-dark .bp3-select select.bp3-active{
color:#f5f8fa; }
.bp3-dark .bp3-html-select select:hover, .bp3-dark .bp3-select select:hover{
background-color:#30404d;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-html-select select:active, .bp3-dark .bp3-select select:active, .bp3-dark .bp3-html-select select.bp3-active, .bp3-dark .bp3-select select.bp3-active{
background-color:#202b33;
background-image:none;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.6), inset 0 1px 2px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.6), inset 0 1px 2px rgba(16, 22, 26, 0.2); }
.bp3-dark .bp3-html-select select:disabled, .bp3-dark .bp3-select select:disabled, .bp3-dark .bp3-html-select select.bp3-disabled, .bp3-dark .bp3-select select.bp3-disabled{
background-color:rgba(57, 75, 89, 0.5);
background-image:none;
-webkit-box-shadow:none;
box-shadow:none;
color:rgba(167, 182, 194, 0.6); }
.bp3-dark .bp3-html-select select:disabled.bp3-active, .bp3-dark .bp3-select select:disabled.bp3-active, .bp3-dark .bp3-html-select select.bp3-disabled.bp3-active, .bp3-dark .bp3-select select.bp3-disabled.bp3-active{
background:rgba(57, 75, 89, 0.7); }
.bp3-dark .bp3-html-select select .bp3-button-spinner .bp3-spinner-head, .bp3-dark .bp3-select select .bp3-button-spinner .bp3-spinner-head{
background:rgba(16, 22, 26, 0.5);
stroke:#8a9ba8; }
.bp3-html-select select:disabled,
.bp3-select select:disabled{
background-color:rgba(206, 217, 224, 0.5);
-webkit-box-shadow:none;
box-shadow:none;
color:rgba(92, 112, 128, 0.6);
cursor:not-allowed; }
.bp3-html-select .bp3-icon,
.bp3-select .bp3-icon, .bp3-select::after{
color:#5c7080;
pointer-events:none;
position:absolute;
right:7px;
top:7px; }
.bp3-html-select .bp3-disabled.bp3-icon,
.bp3-select .bp3-disabled.bp3-icon, .bp3-disabled.bp3-select::after{
color:rgba(92, 112, 128, 0.6); }
.bp3-html-select,
.bp3-select{
display:inline-block;
letter-spacing:normal;
position:relative;
vertical-align:middle; }
.bp3-html-select select::-ms-expand,
.bp3-select select::-ms-expand{
display:none; }
.bp3-html-select .bp3-icon,
.bp3-select .bp3-icon{
color:#5c7080; }
.bp3-html-select .bp3-icon:hover,
.bp3-select .bp3-icon:hover{
color:#182026; }
.bp3-dark .bp3-html-select .bp3-icon, .bp3-dark
.bp3-select .bp3-icon{
color:#a7b6c2; }
.bp3-dark .bp3-html-select .bp3-icon:hover, .bp3-dark
.bp3-select .bp3-icon:hover{
color:#f5f8fa; }
.bp3-html-select.bp3-large::after,
.bp3-html-select.bp3-large .bp3-icon,
.bp3-select.bp3-large::after,
.bp3-select.bp3-large .bp3-icon{
right:12px;
top:12px; }
.bp3-html-select.bp3-fill,
.bp3-html-select.bp3-fill select,
.bp3-select.bp3-fill,
.bp3-select.bp3-fill select{
width:100%; }
.bp3-dark .bp3-html-select option, .bp3-dark
.bp3-select option{
background-color:#30404d;
color:#f5f8fa; }
.bp3-dark .bp3-html-select option:disabled, .bp3-dark
.bp3-select option:disabled{
color:rgba(167, 182, 194, 0.6); }
.bp3-dark .bp3-html-select::after, .bp3-dark
.bp3-select::after{
color:#a7b6c2; }
.bp3-select::after{
font-family:"Icons16", sans-serif;
font-size:16px;
font-style:normal;
font-weight:400;
line-height:1;
-moz-osx-font-smoothing:grayscale;
-webkit-font-smoothing:antialiased;
content:""; }
.bp3-running-text table, table.bp3-html-table{
border-spacing:0;
font-size:14px; }
.bp3-running-text table th, table.bp3-html-table th,
.bp3-running-text table td,
table.bp3-html-table td{
padding:11px;
text-align:left;
vertical-align:top; }
.bp3-running-text table th, table.bp3-html-table th{
color:#182026;
font-weight:600; }
.bp3-running-text table td,
table.bp3-html-table td{
color:#182026; }
.bp3-running-text table tbody tr:first-child th, table.bp3-html-table tbody tr:first-child th,
.bp3-running-text table tbody tr:first-child td,
table.bp3-html-table tbody tr:first-child td,
.bp3-running-text table tfoot tr:first-child th,
table.bp3-html-table tfoot tr:first-child th,
.bp3-running-text table tfoot tr:first-child td,
table.bp3-html-table tfoot tr:first-child td{
-webkit-box-shadow:inset 0 1px 0 0 rgba(16, 22, 26, 0.15);
box-shadow:inset 0 1px 0 0 rgba(16, 22, 26, 0.15); }
.bp3-dark .bp3-running-text table th, .bp3-running-text .bp3-dark table th, .bp3-dark table.bp3-html-table th{
color:#f5f8fa; }
.bp3-dark .bp3-running-text table td, .bp3-running-text .bp3-dark table td, .bp3-dark table.bp3-html-table td{
color:#f5f8fa; }
.bp3-dark .bp3-running-text table tbody tr:first-child th, .bp3-running-text .bp3-dark table tbody tr:first-child th, .bp3-dark table.bp3-html-table tbody tr:first-child th,
.bp3-dark .bp3-running-text table tbody tr:first-child td,
.bp3-running-text .bp3-dark table tbody tr:first-child td,
.bp3-dark table.bp3-html-table tbody tr:first-child td,
.bp3-dark .bp3-running-text table tfoot tr:first-child th,
.bp3-running-text .bp3-dark table tfoot tr:first-child th,
.bp3-dark table.bp3-html-table tfoot tr:first-child th,
.bp3-dark .bp3-running-text table tfoot tr:first-child td,
.bp3-running-text .bp3-dark table tfoot tr:first-child td,
.bp3-dark table.bp3-html-table tfoot tr:first-child td{
-webkit-box-shadow:inset 0 1px 0 0 rgba(255, 255, 255, 0.15);
box-shadow:inset 0 1px 0 0 rgba(255, 255, 255, 0.15); }
table.bp3-html-table.bp3-html-table-condensed th,
table.bp3-html-table.bp3-html-table-condensed td, table.bp3-html-table.bp3-small th,
table.bp3-html-table.bp3-small td{
padding-bottom:6px;
padding-top:6px; }
table.bp3-html-table.bp3-html-table-striped tbody tr:nth-child(odd) td{
background:rgba(191, 204, 214, 0.15); }
table.bp3-html-table.bp3-html-table-bordered th:not(:first-child){
-webkit-box-shadow:inset 1px 0 0 0 rgba(16, 22, 26, 0.15);
box-shadow:inset 1px 0 0 0 rgba(16, 22, 26, 0.15); }
table.bp3-html-table.bp3-html-table-bordered tbody tr td,
table.bp3-html-table.bp3-html-table-bordered tfoot tr td{
-webkit-box-shadow:inset 0 1px 0 0 rgba(16, 22, 26, 0.15);
box-shadow:inset 0 1px 0 0 rgba(16, 22, 26, 0.15); }
table.bp3-html-table.bp3-html-table-bordered tbody tr td:not(:first-child),
table.bp3-html-table.bp3-html-table-bordered tfoot tr td:not(:first-child){
-webkit-box-shadow:inset 1px 1px 0 0 rgba(16, 22, 26, 0.15);
box-shadow:inset 1px 1px 0 0 rgba(16, 22, 26, 0.15); }
table.bp3-html-table.bp3-html-table-bordered.bp3-html-table-striped tbody tr:not(:first-child) td{
-webkit-box-shadow:none;
box-shadow:none; }
table.bp3-html-table.bp3-html-table-bordered.bp3-html-table-striped tbody tr:not(:first-child) td:not(:first-child){
-webkit-box-shadow:inset 1px 0 0 0 rgba(16, 22, 26, 0.15);
box-shadow:inset 1px 0 0 0 rgba(16, 22, 26, 0.15); }
table.bp3-html-table.bp3-interactive tbody tr:hover td{
background-color:rgba(191, 204, 214, 0.3);
cursor:pointer; }
table.bp3-html-table.bp3-interactive tbody tr:active td{
background-color:rgba(191, 204, 214, 0.4); }
.bp3-dark table.bp3-html-table{ }
.bp3-dark table.bp3-html-table.bp3-html-table-striped tbody tr:nth-child(odd) td{
background:rgba(92, 112, 128, 0.15); }
.bp3-dark table.bp3-html-table.bp3-html-table-bordered th:not(:first-child){
-webkit-box-shadow:inset 1px 0 0 0 rgba(255, 255, 255, 0.15);
box-shadow:inset 1px 0 0 0 rgba(255, 255, 255, 0.15); }
.bp3-dark table.bp3-html-table.bp3-html-table-bordered tbody tr td,
.bp3-dark table.bp3-html-table.bp3-html-table-bordered tfoot tr td{
-webkit-box-shadow:inset 0 1px 0 0 rgba(255, 255, 255, 0.15);
box-shadow:inset 0 1px 0 0 rgba(255, 255, 255, 0.15); }
.bp3-dark table.bp3-html-table.bp3-html-table-bordered tbody tr td:not(:first-child),
.bp3-dark table.bp3-html-table.bp3-html-table-bordered tfoot tr td:not(:first-child){
-webkit-box-shadow:inset 1px 1px 0 0 rgba(255, 255, 255, 0.15);
box-shadow:inset 1px 1px 0 0 rgba(255, 255, 255, 0.15); }
.bp3-dark table.bp3-html-table.bp3-html-table-bordered.bp3-html-table-striped tbody tr:not(:first-child) td{
-webkit-box-shadow:inset 1px 0 0 0 rgba(255, 255, 255, 0.15);
box-shadow:inset 1px 0 0 0 rgba(255, 255, 255, 0.15); }
.bp3-dark table.bp3-html-table.bp3-html-table-bordered.bp3-html-table-striped tbody tr:not(:first-child) td:first-child{
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-dark table.bp3-html-table.bp3-interactive tbody tr:hover td{
background-color:rgba(92, 112, 128, 0.3);
cursor:pointer; }
.bp3-dark table.bp3-html-table.bp3-interactive tbody tr:active td{
background-color:rgba(92, 112, 128, 0.4); }
.bp3-key-combo{
display:-webkit-box;
display:-ms-flexbox;
display:flex;
-webkit-box-orient:horizontal;
-webkit-box-direction:normal;
-ms-flex-direction:row;
flex-direction:row;
-webkit-box-align:center;
-ms-flex-align:center;
align-items:center; }
.bp3-key-combo > *{
-webkit-box-flex:0;
-ms-flex-positive:0;
flex-grow:0;
-ms-flex-negative:0;
flex-shrink:0; }
.bp3-key-combo > .bp3-fill{
-webkit-box-flex:1;
-ms-flex-positive:1;
flex-grow:1;
-ms-flex-negative:1;
flex-shrink:1; }
.bp3-key-combo::before,
.bp3-key-combo > *{
margin-right:5px; }
.bp3-key-combo:empty::before,
.bp3-key-combo > :last-child{
margin-right:0; }
.bp3-hotkey-dialog{
padding-bottom:0;
top:40px; }
.bp3-hotkey-dialog .bp3-dialog-body{
margin:0;
padding:0; }
.bp3-hotkey-dialog .bp3-hotkey-label{
-webkit-box-flex:1;
-ms-flex-positive:1;
flex-grow:1; }
.bp3-hotkey-column{
margin:auto;
max-height:80vh;
overflow-y:auto;
padding:30px; }
.bp3-hotkey-column .bp3-heading{
margin-bottom:20px; }
.bp3-hotkey-column .bp3-heading:not(:first-child){
margin-top:40px; }
.bp3-hotkey{
-webkit-box-align:center;
-ms-flex-align:center;
align-items:center;
display:-webkit-box;
display:-ms-flexbox;
display:flex;
-webkit-box-pack:justify;
-ms-flex-pack:justify;
justify-content:space-between;
margin-left:0;
margin-right:0; }
.bp3-hotkey:not(:last-child){
margin-bottom:10px; }
.bp3-icon{
display:inline-block;
-webkit-box-flex:0;
-ms-flex:0 0 auto;
flex:0 0 auto;
vertical-align:text-bottom; }
.bp3-icon:not(:empty)::before{
content:"" !important;
content:unset !important; }
.bp3-icon > svg{
display:block; }
.bp3-icon > svg:not([fill]){
fill:currentColor; }
.bp3-icon.bp3-intent-primary, .bp3-icon-standard.bp3-intent-primary, .bp3-icon-large.bp3-intent-primary{
color:#106ba3; }
.bp3-dark .bp3-icon.bp3-intent-primary, .bp3-dark .bp3-icon-standard.bp3-intent-primary, .bp3-dark .bp3-icon-large.bp3-intent-primary{
color:#48aff0; }
.bp3-icon.bp3-intent-success, .bp3-icon-standard.bp3-intent-success, .bp3-icon-large.bp3-intent-success{
color:#0d8050; }
.bp3-dark .bp3-icon.bp3-intent-success, .bp3-dark .bp3-icon-standard.bp3-intent-success, .bp3-dark .bp3-icon-large.bp3-intent-success{
color:#3dcc91; }
.bp3-icon.bp3-intent-warning, .bp3-icon-standard.bp3-intent-warning, .bp3-icon-large.bp3-intent-warning{
color:#bf7326; }
.bp3-dark .bp3-icon.bp3-intent-warning, .bp3-dark .bp3-icon-standard.bp3-intent-warning, .bp3-dark .bp3-icon-large.bp3-intent-warning{
color:#ffb366; }
.bp3-icon.bp3-intent-danger, .bp3-icon-standard.bp3-intent-danger, .bp3-icon-large.bp3-intent-danger{
color:#c23030; }
.bp3-dark .bp3-icon.bp3-intent-danger, .bp3-dark .bp3-icon-standard.bp3-intent-danger, .bp3-dark .bp3-icon-large.bp3-intent-danger{
color:#ff7373; }
span.bp3-icon-standard{
font-family:"Icons16", sans-serif;
font-size:16px;
font-style:normal;
font-weight:400;
line-height:1;
-moz-osx-font-smoothing:grayscale;
-webkit-font-smoothing:antialiased;
display:inline-block; }
span.bp3-icon-large{
font-family:"Icons20", sans-serif;
font-size:20px;
font-style:normal;
font-weight:400;
line-height:1;
-moz-osx-font-smoothing:grayscale;
-webkit-font-smoothing:antialiased;
display:inline-block; }
span.bp3-icon:empty{
font-family:"Icons20";
font-size:inherit;
font-style:normal;
font-weight:400;
line-height:1; }
span.bp3-icon:empty::before{
-moz-osx-font-smoothing:grayscale;
-webkit-font-smoothing:antialiased; }
.bp3-icon-add::before{
content:""; }
.bp3-icon-add-column-left::before{
content:""; }
.bp3-icon-add-column-right::before{
content:""; }
.bp3-icon-add-row-bottom::before{
content:""; }
.bp3-icon-add-row-top::before{
content:""; }
.bp3-icon-add-to-artifact::before{
content:""; }
.bp3-icon-add-to-folder::before{
content:""; }
.bp3-icon-airplane::before{
content:""; }
.bp3-icon-align-center::before{
content:""; }
.bp3-icon-align-justify::before{
content:""; }
.bp3-icon-align-left::before{
content:""; }
.bp3-icon-align-right::before{
content:""; }
.bp3-icon-alignment-bottom::before{
content:""; }
.bp3-icon-alignment-horizontal-center::before{
content:""; }
.bp3-icon-alignment-left::before{
content:""; }
.bp3-icon-alignment-right::before{
content:""; }
.bp3-icon-alignment-top::before{
content:""; }
.bp3-icon-alignment-vertical-center::before{
content:""; }
.bp3-icon-annotation::before{
content:""; }
.bp3-icon-application::before{
content:""; }
.bp3-icon-applications::before{
content:""; }
.bp3-icon-archive::before{
content:""; }
.bp3-icon-arrow-bottom-left::before{
content:"↙"; }
.bp3-icon-arrow-bottom-right::before{
content:"↘"; }
.bp3-icon-arrow-down::before{
content:"↓"; }
.bp3-icon-arrow-left::before{
content:"←"; }
.bp3-icon-arrow-right::before{
content:"→"; }
.bp3-icon-arrow-top-left::before{
content:"↖"; }
.bp3-icon-arrow-top-right::before{
content:"↗"; }
.bp3-icon-arrow-up::before{
content:"↑"; }
.bp3-icon-arrows-horizontal::before{
content:"↔"; }
.bp3-icon-arrows-vertical::before{
content:"↕"; }
.bp3-icon-asterisk::before{
content:"*"; }
.bp3-icon-automatic-updates::before{
content:""; }
.bp3-icon-badge::before{
content:""; }
.bp3-icon-ban-circle::before{
content:""; }
.bp3-icon-bank-account::before{
content:""; }
.bp3-icon-barcode::before{
content:""; }
.bp3-icon-blank::before{
content:""; }
.bp3-icon-blocked-person::before{
content:""; }
.bp3-icon-bold::before{
content:""; }
.bp3-icon-book::before{
content:""; }
.bp3-icon-bookmark::before{
content:""; }
.bp3-icon-box::before{
content:""; }
.bp3-icon-briefcase::before{
content:""; }
.bp3-icon-bring-data::before{
content:""; }
.bp3-icon-build::before{
content:""; }
.bp3-icon-calculator::before{
content:""; }
.bp3-icon-calendar::before{
content:""; }
.bp3-icon-camera::before{
content:""; }
.bp3-icon-caret-down::before{
content:"⌄"; }
.bp3-icon-caret-left::before{
content:"〈"; }
.bp3-icon-caret-right::before{
content:"〉"; }
.bp3-icon-caret-up::before{
content:"⌃"; }
.bp3-icon-cell-tower::before{
content:""; }
.bp3-icon-changes::before{
content:""; }
.bp3-icon-chart::before{
content:""; }
.bp3-icon-chat::before{
content:""; }
.bp3-icon-chevron-backward::before{
content:""; }
.bp3-icon-chevron-down::before{
content:""; }
.bp3-icon-chevron-forward::before{
content:""; }
.bp3-icon-chevron-left::before{
content:""; }
.bp3-icon-chevron-right::before{
content:""; }
.bp3-icon-chevron-up::before{
content:""; }
.bp3-icon-circle::before{
content:""; }
.bp3-icon-circle-arrow-down::before{
content:""; }
.bp3-icon-circle-arrow-left::before{
content:""; }
.bp3-icon-circle-arrow-right::before{
content:""; }
.bp3-icon-circle-arrow-up::before{
content:""; }
.bp3-icon-citation::before{
content:""; }
.bp3-icon-clean::before{
content:""; }
.bp3-icon-clipboard::before{
content:""; }
.bp3-icon-cloud::before{
content:"☁"; }
.bp3-icon-cloud-download::before{
content:""; }
.bp3-icon-cloud-upload::before{
content:""; }
.bp3-icon-code::before{
content:""; }
.bp3-icon-code-block::before{
content:""; }
.bp3-icon-cog::before{
content:""; }
.bp3-icon-collapse-all::before{
content:""; }
.bp3-icon-column-layout::before{
content:""; }
.bp3-icon-comment::before{
content:""; }
.bp3-icon-comparison::before{
content:""; }
.bp3-icon-compass::before{
content:""; }
.bp3-icon-compressed::before{
content:""; }
.bp3-icon-confirm::before{
content:""; }
.bp3-icon-console::before{
content:""; }
.bp3-icon-contrast::before{
content:""; }
.bp3-icon-control::before{
content:""; }
.bp3-icon-credit-card::before{
content:""; }
.bp3-icon-cross::before{
content:"✗"; }
.bp3-icon-crown::before{
content:""; }
.bp3-icon-cube::before{
content:""; }
.bp3-icon-cube-add::before{
content:""; }
.bp3-icon-cube-remove::before{
content:""; }
.bp3-icon-curved-range-chart::before{
content:""; }
.bp3-icon-cut::before{
content:""; }
.bp3-icon-dashboard::before{
content:""; }
.bp3-icon-data-lineage::before{
content:""; }
.bp3-icon-database::before{
content:""; }
.bp3-icon-delete::before{
content:""; }
.bp3-icon-delta::before{
content:"Δ"; }
.bp3-icon-derive-column::before{
content:""; }
.bp3-icon-desktop::before{
content:""; }
.bp3-icon-diagnosis::before{
content:""; }
.bp3-icon-diagram-tree::before{
content:""; }
.bp3-icon-direction-left::before{
content:""; }
.bp3-icon-direction-right::before{
content:""; }
.bp3-icon-disable::before{
content:""; }
.bp3-icon-document::before{
content:""; }
.bp3-icon-document-open::before{
content:""; }
.bp3-icon-document-share::before{
content:""; }
.bp3-icon-dollar::before{
content:"$"; }
.bp3-icon-dot::before{
content:"•"; }
.bp3-icon-double-caret-horizontal::before{
content:""; }
.bp3-icon-double-caret-vertical::before{
content:""; }
.bp3-icon-double-chevron-down::before{
content:""; }
.bp3-icon-double-chevron-left::before{
content:""; }
.bp3-icon-double-chevron-right::before{
content:""; }
.bp3-icon-double-chevron-up::before{
content:""; }
.bp3-icon-doughnut-chart::before{
content:""; }
.bp3-icon-download::before{
content:""; }
.bp3-icon-drag-handle-horizontal::before{
content:""; }
.bp3-icon-drag-handle-vertical::before{
content:""; }
.bp3-icon-draw::before{
content:""; }
.bp3-icon-drive-time::before{
content:""; }
.bp3-icon-duplicate::before{
content:""; }
.bp3-icon-edit::before{
content:"✎"; }
.bp3-icon-eject::before{
content:"⏏"; }
.bp3-icon-endorsed::before{
content:""; }
.bp3-icon-envelope::before{
content:"✉"; }
.bp3-icon-equals::before{
content:""; }
.bp3-icon-eraser::before{
content:""; }
.bp3-icon-error::before{
content:""; }
.bp3-icon-euro::before{
content:"€"; }
.bp3-icon-exchange::before{
content:""; }
.bp3-icon-exclude-row::before{
content:""; }
.bp3-icon-expand-all::before{
content:""; }
.bp3-icon-export::before{
content:""; }
.bp3-icon-eye-off::before{
content:""; }
.bp3-icon-eye-on::before{
content:""; }
.bp3-icon-eye-open::before{
content:""; }
.bp3-icon-fast-backward::before{
content:""; }
.bp3-icon-fast-forward::before{
content:""; }
.bp3-icon-feed::before{
content:""; }
.bp3-icon-feed-subscribed::before{
content:""; }
.bp3-icon-film::before{
content:""; }
.bp3-icon-filter::before{
content:""; }
.bp3-icon-filter-keep::before{
content:""; }
.bp3-icon-filter-list::before{
content:""; }
.bp3-icon-filter-open::before{
content:""; }
.bp3-icon-filter-remove::before{
content:""; }
.bp3-icon-flag::before{
content:"⚑"; }
.bp3-icon-flame::before{
content:""; }
.bp3-icon-flash::before{
content:""; }
.bp3-icon-floppy-disk::before{
content:""; }
.bp3-icon-flow-branch::before{
content:""; }
.bp3-icon-flow-end::before{
content:""; }
.bp3-icon-flow-linear::before{
content:""; }
.bp3-icon-flow-review::before{
content:""; }
.bp3-icon-flow-review-branch::before{
content:""; }
.bp3-icon-flows::before{
content:""; }
.bp3-icon-folder-close::before{
content:""; }
.bp3-icon-folder-new::before{
content:""; }
.bp3-icon-folder-open::before{
content:""; }
.bp3-icon-folder-shared::before{
content:""; }
.bp3-icon-folder-shared-open::before{
content:""; }
.bp3-icon-follower::before{
content:""; }
.bp3-icon-following::before{
content:""; }
.bp3-icon-font::before{
content:""; }
.bp3-icon-fork::before{
content:""; }
.bp3-icon-form::before{
content:""; }
.bp3-icon-full-circle::before{
content:""; }
.bp3-icon-full-stacked-chart::before{
content:""; }
.bp3-icon-fullscreen::before{
content:""; }
.bp3-icon-function::before{
content:""; }
.bp3-icon-gantt-chart::before{
content:""; }
.bp3-icon-geolocation::before{
content:""; }
.bp3-icon-geosearch::before{
content:""; }
.bp3-icon-git-branch::before{
content:""; }
.bp3-icon-git-commit::before{
content:""; }
.bp3-icon-git-merge::before{
content:""; }
.bp3-icon-git-new-branch::before{
content:""; }
.bp3-icon-git-pull::before{
content:""; }
.bp3-icon-git-push::before{
content:""; }
.bp3-icon-git-repo::before{
content:""; }
.bp3-icon-glass::before{
content:""; }
.bp3-icon-globe::before{
content:""; }
.bp3-icon-globe-network::before{
content:""; }
.bp3-icon-graph::before{
content:""; }
.bp3-icon-graph-remove::before{
content:""; }
.bp3-icon-greater-than::before{
content:""; }
.bp3-icon-greater-than-or-equal-to::before{
content:""; }
.bp3-icon-grid::before{
content:""; }
.bp3-icon-grid-view::before{
content:""; }
.bp3-icon-group-objects::before{
content:""; }
.bp3-icon-grouped-bar-chart::before{
content:""; }
.bp3-icon-hand::before{
content:""; }
.bp3-icon-hand-down::before{
content:""; }
.bp3-icon-hand-left::before{
content:""; }
.bp3-icon-hand-right::before{
content:""; }
.bp3-icon-hand-up::before{
content:""; }
.bp3-icon-header::before{
content:""; }
.bp3-icon-header-one::before{
content:""; }
.bp3-icon-header-two::before{
content:""; }
.bp3-icon-headset::before{
content:""; }
.bp3-icon-heart::before{
content:"♥"; }
.bp3-icon-heart-broken::before{
content:""; }
.bp3-icon-heat-grid::before{
content:""; }
.bp3-icon-heatmap::before{
content:""; }
.bp3-icon-help::before{
content:"?"; }
.bp3-icon-helper-management::before{
content:""; }
.bp3-icon-highlight::before{
content:""; }
.bp3-icon-history::before{
content:""; }
.bp3-icon-home::before{
content:"⌂"; }
.bp3-icon-horizontal-bar-chart::before{
content:""; }
.bp3-icon-horizontal-bar-chart-asc::before{
content:""; }
.bp3-icon-horizontal-bar-chart-desc::before{
content:""; }
.bp3-icon-horizontal-distribution::before{
content:""; }
.bp3-icon-id-number::before{
content:""; }
.bp3-icon-image-rotate-left::before{
content:""; }
.bp3-icon-image-rotate-right::before{
content:""; }
.bp3-icon-import::before{
content:""; }
.bp3-icon-inbox::before{
content:""; }
.bp3-icon-inbox-filtered::before{
content:""; }
.bp3-icon-inbox-geo::before{
content:""; }
.bp3-icon-inbox-search::before{
content:""; }
.bp3-icon-inbox-update::before{
content:""; }
.bp3-icon-info-sign::before{
content:"ℹ"; }
.bp3-icon-inheritance::before{
content:""; }
.bp3-icon-inner-join::before{
content:""; }
.bp3-icon-insert::before{
content:""; }
.bp3-icon-intersection::before{
content:""; }
.bp3-icon-ip-address::before{
content:""; }
.bp3-icon-issue::before{
content:""; }
.bp3-icon-issue-closed::before{
content:""; }
.bp3-icon-issue-new::before{
content:""; }
.bp3-icon-italic::before{
content:""; }
.bp3-icon-join-table::before{
content:""; }
.bp3-icon-key::before{
content:""; }
.bp3-icon-key-backspace::before{
content:""; }
.bp3-icon-key-command::before{
content:""; }
.bp3-icon-key-control::before{
content:""; }
.bp3-icon-key-delete::before{
content:""; }
.bp3-icon-key-enter::before{
content:""; }
.bp3-icon-key-escape::before{
content:""; }
.bp3-icon-key-option::before{
content:""; }
.bp3-icon-key-shift::before{
content:""; }
.bp3-icon-key-tab::before{
content:""; }
.bp3-icon-known-vehicle::before{
content:""; }
.bp3-icon-lab-test::before{
content:""; }
.bp3-icon-label::before{
content:""; }
.bp3-icon-layer::before{
content:""; }
.bp3-icon-layers::before{
content:""; }
.bp3-icon-layout::before{
content:""; }
.bp3-icon-layout-auto::before{
content:""; }
.bp3-icon-layout-balloon::before{
content:""; }
.bp3-icon-layout-circle::before{
content:""; }
.bp3-icon-layout-grid::before{
content:""; }
.bp3-icon-layout-group-by::before{
content:""; }
.bp3-icon-layout-hierarchy::before{
content:""; }
.bp3-icon-layout-linear::before{
content:""; }
.bp3-icon-layout-skew-grid::before{
content:""; }
.bp3-icon-layout-sorted-clusters::before{
content:""; }
.bp3-icon-learning::before{
content:""; }
.bp3-icon-left-join::before{
content:""; }
.bp3-icon-less-than::before{
content:""; }
.bp3-icon-less-than-or-equal-to::before{
content:""; }
.bp3-icon-lifesaver::before{
content:""; }
.bp3-icon-lightbulb::before{
content:""; }
.bp3-icon-link::before{
content:""; }
.bp3-icon-list::before{
content:"☰"; }
.bp3-icon-list-columns::before{
content:""; }
.bp3-icon-list-detail-view::before{
content:""; }
.bp3-icon-locate::before{
content:""; }
.bp3-icon-lock::before{
content:""; }
.bp3-icon-log-in::before{
content:""; }
.bp3-icon-log-out::before{
content:""; }
.bp3-icon-manual::before{
content:""; }
.bp3-icon-manually-entered-data::before{
content:""; }
.bp3-icon-map::before{
content:""; }
.bp3-icon-map-create::before{
content:""; }
.bp3-icon-map-marker::before{
content:""; }
.bp3-icon-maximize::before{
content:""; }
.bp3-icon-media::before{
content:""; }
.bp3-icon-menu::before{
content:""; }
.bp3-icon-menu-closed::before{
content:""; }
.bp3-icon-menu-open::before{
content:""; }
.bp3-icon-merge-columns::before{
content:""; }
.bp3-icon-merge-links::before{
content:""; }
.bp3-icon-minimize::before{
content:""; }
.bp3-icon-minus::before{
content:"−"; }
.bp3-icon-mobile-phone::before{
content:""; }
.bp3-icon-mobile-video::before{
content:""; }
.bp3-icon-moon::before{
content:""; }
.bp3-icon-more::before{
content:""; }
.bp3-icon-mountain::before{
content:""; }
.bp3-icon-move::before{
content:""; }
.bp3-icon-mugshot::before{
content:""; }
.bp3-icon-multi-select::before{
content:""; }
.bp3-icon-music::before{
content:""; }
.bp3-icon-new-drawing::before{
content:""; }
.bp3-icon-new-grid-item::before{
content:""; }
.bp3-icon-new-layer::before{
content:""; }
.bp3-icon-new-layers::before{
content:""; }
.bp3-icon-new-link::before{
content:""; }
.bp3-icon-new-object::before{
content:""; }
.bp3-icon-new-person::before{
content:""; }
.bp3-icon-new-prescription::before{
content:""; }
.bp3-icon-new-text-box::before{
content:""; }
.bp3-icon-ninja::before{
content:""; }
.bp3-icon-not-equal-to::before{
content:""; }
.bp3-icon-notifications::before{
content:""; }
.bp3-icon-notifications-updated::before{
content:""; }
.bp3-icon-numbered-list::before{
content:""; }
.bp3-icon-numerical::before{
content:""; }
.bp3-icon-office::before{
content:""; }
.bp3-icon-offline::before{
content:""; }
.bp3-icon-oil-field::before{
content:""; }
.bp3-icon-one-column::before{
content:""; }
.bp3-icon-outdated::before{
content:""; }
.bp3-icon-page-layout::before{
content:""; }
.bp3-icon-panel-stats::before{
content:""; }
.bp3-icon-panel-table::before{
content:""; }
.bp3-icon-paperclip::before{
content:""; }
.bp3-icon-paragraph::before{
content:""; }
.bp3-icon-path::before{
content:""; }
.bp3-icon-path-search::before{
content:""; }
.bp3-icon-pause::before{
content:""; }
.bp3-icon-people::before{
content:""; }
.bp3-icon-percentage::before{
content:""; }
.bp3-icon-person::before{
content:""; }
.bp3-icon-phone::before{
content:"☎"; }
.bp3-icon-pie-chart::before{
content:""; }
.bp3-icon-pin::before{
content:""; }
.bp3-icon-pivot::before{
content:""; }
.bp3-icon-pivot-table::before{
content:""; }
.bp3-icon-play::before{
content:""; }
.bp3-icon-plus::before{
content:"+"; }
.bp3-icon-polygon-filter::before{
content:""; }
.bp3-icon-power::before{
content:""; }
.bp3-icon-predictive-analysis::before{
content:""; }
.bp3-icon-prescription::before{
content:""; }
.bp3-icon-presentation::before{
content:""; }
.bp3-icon-print::before{
content:"⎙"; }
.bp3-icon-projects::before{
content:""; }
.bp3-icon-properties::before{
content:""; }
.bp3-icon-property::before{
content:""; }
.bp3-icon-publish-function::before{
content:""; }
.bp3-icon-pulse::before{
content:""; }
.bp3-icon-random::before{
content:""; }
.bp3-icon-record::before{
content:""; }
.bp3-icon-redo::before{
content:""; }
.bp3-icon-refresh::before{
content:""; }
.bp3-icon-regression-chart::before{
content:""; }
.bp3-icon-remove::before{
content:""; }
.bp3-icon-remove-column::before{
content:""; }
.bp3-icon-remove-column-left::before{
content:""; }
.bp3-icon-remove-column-right::before{
content:""; }
.bp3-icon-remove-row-bottom::before{
content:""; }
.bp3-icon-remove-row-top::before{
content:""; }
.bp3-icon-repeat::before{
content:""; }
.bp3-icon-reset::before{
content:""; }
.bp3-icon-resolve::before{
content:""; }
.bp3-icon-rig::before{
content:""; }
.bp3-icon-right-join::before{
content:""; }
.bp3-icon-ring::before{
content:""; }
.bp3-icon-rotate-document::before{
content:""; }
.bp3-icon-rotate-page::before{
content:""; }
.bp3-icon-satellite::before{
content:""; }
.bp3-icon-saved::before{
content:""; }
.bp3-icon-scatter-plot::before{
content:""; }
.bp3-icon-search::before{
content:""; }
.bp3-icon-search-around::before{
content:""; }
.bp3-icon-search-template::before{
content:""; }
.bp3-icon-search-text::before{
content:""; }
.bp3-icon-segmented-control::before{
content:""; }
.bp3-icon-select::before{
content:""; }
.bp3-icon-selection::before{
content:"⦿"; }
.bp3-icon-send-to::before{
content:""; }
.bp3-icon-send-to-graph::before{
content:""; }
.bp3-icon-send-to-map::before{
content:""; }
.bp3-icon-series-add::before{
content:""; }
.bp3-icon-series-configuration::before{
content:""; }
.bp3-icon-series-derived::before{
content:""; }
.bp3-icon-series-filtered::before{
content:""; }
.bp3-icon-series-search::before{
content:""; }
.bp3-icon-settings::before{
content:""; }
.bp3-icon-share::before{
content:""; }
.bp3-icon-shield::before{
content:""; }
.bp3-icon-shop::before{
content:""; }
.bp3-icon-shopping-cart::before{
content:""; }
.bp3-icon-signal-search::before{
content:""; }
.bp3-icon-sim-card::before{
content:""; }
.bp3-icon-slash::before{
content:""; }
.bp3-icon-small-cross::before{
content:""; }
.bp3-icon-small-minus::before{
content:""; }
.bp3-icon-small-plus::before{
content:""; }
.bp3-icon-small-tick::before{
content:""; }
.bp3-icon-snowflake::before{
content:""; }
.bp3-icon-social-media::before{
content:""; }
.bp3-icon-sort::before{
content:""; }
.bp3-icon-sort-alphabetical::before{
content:""; }
.bp3-icon-sort-alphabetical-desc::before{
content:""; }
.bp3-icon-sort-asc::before{
content:""; }
.bp3-icon-sort-desc::before{
content:""; }
.bp3-icon-sort-numerical::before{
content:""; }
.bp3-icon-sort-numerical-desc::before{
content:""; }
.bp3-icon-split-columns::before{
content:""; }
.bp3-icon-square::before{
content:""; }
.bp3-icon-stacked-chart::before{
content:""; }
.bp3-icon-star::before{
content:"★"; }
.bp3-icon-star-empty::before{
content:"☆"; }
.bp3-icon-step-backward::before{
content:""; }
.bp3-icon-step-chart::before{
content:""; }
.bp3-icon-step-forward::before{
content:""; }
.bp3-icon-stop::before{
content:""; }
.bp3-icon-stopwatch::before{
content:""; }
.bp3-icon-strikethrough::before{
content:""; }
.bp3-icon-style::before{
content:""; }
.bp3-icon-swap-horizontal::before{
content:""; }
.bp3-icon-swap-vertical::before{
content:""; }
.bp3-icon-symbol-circle::before{
content:""; }
.bp3-icon-symbol-cross::before{
content:""; }
.bp3-icon-symbol-diamond::before{
content:""; }
.bp3-icon-symbol-square::before{
content:""; }
.bp3-icon-symbol-triangle-down::before{
content:""; }
.bp3-icon-symbol-triangle-up::before{
content:""; }
.bp3-icon-tag::before{
content:""; }
.bp3-icon-take-action::before{
content:""; }
.bp3-icon-taxi::before{
content:""; }
.bp3-icon-text-highlight::before{
content:""; }
.bp3-icon-th::before{
content:""; }
.bp3-icon-th-derived::before{
content:""; }
.bp3-icon-th-disconnect::before{
content:""; }
.bp3-icon-th-filtered::before{
content:""; }
.bp3-icon-th-list::before{
content:""; }
.bp3-icon-thumbs-down::before{
content:""; }
.bp3-icon-thumbs-up::before{
content:""; }
.bp3-icon-tick::before{
content:"✓"; }
.bp3-icon-tick-circle::before{
content:""; }
.bp3-icon-time::before{
content:"⏲"; }
.bp3-icon-timeline-area-chart::before{
content:""; }
.bp3-icon-timeline-bar-chart::before{
content:""; }
.bp3-icon-timeline-events::before{
content:""; }
.bp3-icon-timeline-line-chart::before{
content:""; }
.bp3-icon-tint::before{
content:""; }
.bp3-icon-torch::before{
content:""; }
.bp3-icon-tractor::before{
content:""; }
.bp3-icon-train::before{
content:""; }
.bp3-icon-translate::before{
content:""; }
.bp3-icon-trash::before{
content:""; }
.bp3-icon-tree::before{
content:""; }
.bp3-icon-trending-down::before{
content:""; }
.bp3-icon-trending-up::before{
content:""; }
.bp3-icon-truck::before{
content:""; }
.bp3-icon-two-columns::before{
content:""; }
.bp3-icon-unarchive::before{
content:""; }
.bp3-icon-underline::before{
content:"⎁"; }
.bp3-icon-undo::before{
content:"⎌"; }
.bp3-icon-ungroup-objects::before{
content:""; }
.bp3-icon-unknown-vehicle::before{
content:""; }
.bp3-icon-unlock::before{
content:""; }
.bp3-icon-unpin::before{
content:""; }
.bp3-icon-unresolve::before{
content:""; }
.bp3-icon-updated::before{
content:""; }
.bp3-icon-upload::before{
content:""; }
.bp3-icon-user::before{
content:""; }
.bp3-icon-variable::before{
content:""; }
.bp3-icon-vertical-bar-chart-asc::before{
content:""; }
.bp3-icon-vertical-bar-chart-desc::before{
content:""; }
.bp3-icon-vertical-distribution::before{
content:""; }
.bp3-icon-video::before{
content:""; }
.bp3-icon-volume-down::before{
content:""; }
.bp3-icon-volume-off::before{
content:""; }
.bp3-icon-volume-up::before{
content:""; }
.bp3-icon-walk::before{
content:""; }
.bp3-icon-warning-sign::before{
content:""; }
.bp3-icon-waterfall-chart::before{
content:""; }
.bp3-icon-widget::before{
content:""; }
.bp3-icon-widget-button::before{
content:""; }
.bp3-icon-widget-footer::before{
content:""; }
.bp3-icon-widget-header::before{
content:""; }
.bp3-icon-wrench::before{
content:""; }
.bp3-icon-zoom-in::before{
content:""; }
.bp3-icon-zoom-out::before{
content:""; }
.bp3-icon-zoom-to-fit::before{
content:""; }
.bp3-submenu > .bp3-popover-wrapper{
display:block; }
.bp3-submenu .bp3-popover-target{
display:block; }
.bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-menu-item{ }
.bp3-submenu.bp3-popover{
-webkit-box-shadow:none;
box-shadow:none;
padding:0 5px; }
.bp3-submenu.bp3-popover > .bp3-popover-content{
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2); }
.bp3-dark .bp3-submenu.bp3-popover, .bp3-submenu.bp3-popover.bp3-dark{
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-dark .bp3-submenu.bp3-popover > .bp3-popover-content, .bp3-submenu.bp3-popover.bp3-dark > .bp3-popover-content{
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4); }
.bp3-menu{
background:#ffffff;
border-radius:3px;
color:#182026;
list-style:none;
margin:0;
min-width:180px;
padding:5px;
text-align:left; }
.bp3-menu-divider{
border-top:1px solid rgba(16, 22, 26, 0.15);
display:block;
margin:5px; }
.bp3-dark .bp3-menu-divider{
border-top-color:rgba(255, 255, 255, 0.15); }
.bp3-menu-item{
display:-webkit-box;
display:-ms-flexbox;
display:flex;
-webkit-box-orient:horizontal;
-webkit-box-direction:normal;
-ms-flex-direction:row;
flex-direction:row;
-webkit-box-align:start;
-ms-flex-align:start;
align-items:flex-start;
border-radius:2px;
color:inherit;
line-height:20px;
padding:5px 7px;
text-decoration:none;
-webkit-user-select:none;
-moz-user-select:none;
-ms-user-select:none;
user-select:none; }
.bp3-menu-item > *{
-webkit-box-flex:0;
-ms-flex-positive:0;
flex-grow:0;
-ms-flex-negative:0;
flex-shrink:0; }
.bp3-menu-item > .bp3-fill{
-webkit-box-flex:1;
-ms-flex-positive:1;
flex-grow:1;
-ms-flex-negative:1;
flex-shrink:1; }
.bp3-menu-item::before,
.bp3-menu-item > *{
margin-right:7px; }
.bp3-menu-item:empty::before,
.bp3-menu-item > :last-child{
margin-right:0; }
.bp3-menu-item > .bp3-fill{
word-break:break-word; }
.bp3-menu-item:hover, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-menu-item{
background-color:rgba(167, 182, 194, 0.3);
cursor:pointer;
text-decoration:none; }
.bp3-menu-item.bp3-disabled{
background-color:inherit;
color:rgba(92, 112, 128, 0.6);
cursor:not-allowed; }
.bp3-dark .bp3-menu-item{
color:inherit; }
.bp3-dark .bp3-menu-item:hover, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-menu-item, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-menu-item{
background-color:rgba(138, 155, 168, 0.15);
color:inherit; }
.bp3-dark .bp3-menu-item.bp3-disabled{
background-color:inherit;
color:rgba(167, 182, 194, 0.6); }
.bp3-menu-item.bp3-intent-primary{
color:#106ba3; }
.bp3-menu-item.bp3-intent-primary .bp3-icon{
color:inherit; }
.bp3-menu-item.bp3-intent-primary::before, .bp3-menu-item.bp3-intent-primary::after,
.bp3-menu-item.bp3-intent-primary .bp3-menu-item-label{
color:#106ba3; }
.bp3-menu-item.bp3-intent-primary:hover, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item, .bp3-menu-item.bp3-intent-primary.bp3-active{
background-color:#137cbd; }
.bp3-menu-item.bp3-intent-primary:active{
background-color:#106ba3; }
.bp3-menu-item.bp3-intent-primary:hover, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item, .bp3-menu-item.bp3-intent-primary:hover::before, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item::before, .bp3-menu-item.bp3-intent-primary:hover::after, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item::after,
.bp3-menu-item.bp3-intent-primary:hover .bp3-menu-item-label,
.bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item .bp3-menu-item-label, .bp3-menu-item.bp3-intent-primary:active, .bp3-menu-item.bp3-intent-primary:active::before, .bp3-menu-item.bp3-intent-primary:active::after,
.bp3-menu-item.bp3-intent-primary:active .bp3-menu-item-label, .bp3-menu-item.bp3-intent-primary.bp3-active, .bp3-menu-item.bp3-intent-primary.bp3-active::before, .bp3-menu-item.bp3-intent-primary.bp3-active::after,
.bp3-menu-item.bp3-intent-primary.bp3-active .bp3-menu-item-label{
color:#ffffff; }
.bp3-menu-item.bp3-intent-success{
color:#0d8050; }
.bp3-menu-item.bp3-intent-success .bp3-icon{
color:inherit; }
.bp3-menu-item.bp3-intent-success::before, .bp3-menu-item.bp3-intent-success::after,
.bp3-menu-item.bp3-intent-success .bp3-menu-item-label{
color:#0d8050; }
.bp3-menu-item.bp3-intent-success:hover, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item, .bp3-menu-item.bp3-intent-success.bp3-active{
background-color:#0f9960; }
.bp3-menu-item.bp3-intent-success:active{
background-color:#0d8050; }
.bp3-menu-item.bp3-intent-success:hover, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item, .bp3-menu-item.bp3-intent-success:hover::before, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item::before, .bp3-menu-item.bp3-intent-success:hover::after, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item::after,
.bp3-menu-item.bp3-intent-success:hover .bp3-menu-item-label,
.bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item .bp3-menu-item-label, .bp3-menu-item.bp3-intent-success:active, .bp3-menu-item.bp3-intent-success:active::before, .bp3-menu-item.bp3-intent-success:active::after,
.bp3-menu-item.bp3-intent-success:active .bp3-menu-item-label, .bp3-menu-item.bp3-intent-success.bp3-active, .bp3-menu-item.bp3-intent-success.bp3-active::before, .bp3-menu-item.bp3-intent-success.bp3-active::after,
.bp3-menu-item.bp3-intent-success.bp3-active .bp3-menu-item-label{
color:#ffffff; }
.bp3-menu-item.bp3-intent-warning{
color:#bf7326; }
.bp3-menu-item.bp3-intent-warning .bp3-icon{
color:inherit; }
.bp3-menu-item.bp3-intent-warning::before, .bp3-menu-item.bp3-intent-warning::after,
.bp3-menu-item.bp3-intent-warning .bp3-menu-item-label{
color:#bf7326; }
.bp3-menu-item.bp3-intent-warning:hover, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item, .bp3-menu-item.bp3-intent-warning.bp3-active{
background-color:#d9822b; }
.bp3-menu-item.bp3-intent-warning:active{
background-color:#bf7326; }
.bp3-menu-item.bp3-intent-warning:hover, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item, .bp3-menu-item.bp3-intent-warning:hover::before, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item::before, .bp3-menu-item.bp3-intent-warning:hover::after, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item::after,
.bp3-menu-item.bp3-intent-warning:hover .bp3-menu-item-label,
.bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item .bp3-menu-item-label, .bp3-menu-item.bp3-intent-warning:active, .bp3-menu-item.bp3-intent-warning:active::before, .bp3-menu-item.bp3-intent-warning:active::after,
.bp3-menu-item.bp3-intent-warning:active .bp3-menu-item-label, .bp3-menu-item.bp3-intent-warning.bp3-active, .bp3-menu-item.bp3-intent-warning.bp3-active::before, .bp3-menu-item.bp3-intent-warning.bp3-active::after,
.bp3-menu-item.bp3-intent-warning.bp3-active .bp3-menu-item-label{
color:#ffffff; }
.bp3-menu-item.bp3-intent-danger{
color:#c23030; }
.bp3-menu-item.bp3-intent-danger .bp3-icon{
color:inherit; }
.bp3-menu-item.bp3-intent-danger::before, .bp3-menu-item.bp3-intent-danger::after,
.bp3-menu-item.bp3-intent-danger .bp3-menu-item-label{
color:#c23030; }
.bp3-menu-item.bp3-intent-danger:hover, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item, .bp3-menu-item.bp3-intent-danger.bp3-active{
background-color:#db3737; }
.bp3-menu-item.bp3-intent-danger:active{
background-color:#c23030; }
.bp3-menu-item.bp3-intent-danger:hover, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item, .bp3-menu-item.bp3-intent-danger:hover::before, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item::before, .bp3-menu-item.bp3-intent-danger:hover::after, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item::after,
.bp3-menu-item.bp3-intent-danger:hover .bp3-menu-item-label,
.bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item .bp3-menu-item-label, .bp3-menu-item.bp3-intent-danger:active, .bp3-menu-item.bp3-intent-danger:active::before, .bp3-menu-item.bp3-intent-danger:active::after,
.bp3-menu-item.bp3-intent-danger:active .bp3-menu-item-label, .bp3-menu-item.bp3-intent-danger.bp3-active, .bp3-menu-item.bp3-intent-danger.bp3-active::before, .bp3-menu-item.bp3-intent-danger.bp3-active::after,
.bp3-menu-item.bp3-intent-danger.bp3-active .bp3-menu-item-label{
color:#ffffff; }
.bp3-menu-item::before{
font-family:"Icons16", sans-serif;
font-size:16px;
font-style:normal;
font-weight:400;
line-height:1;
-moz-osx-font-smoothing:grayscale;
-webkit-font-smoothing:antialiased;
margin-right:7px; }
.bp3-menu-item::before,
.bp3-menu-item > .bp3-icon{
color:#5c7080;
margin-top:2px; }
.bp3-menu-item .bp3-menu-item-label{
color:#5c7080; }
.bp3-menu-item:hover, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-menu-item{
color:inherit; }
.bp3-menu-item.bp3-active, .bp3-menu-item:active{
background-color:rgba(115, 134, 148, 0.3); }
.bp3-menu-item.bp3-disabled{
background-color:inherit !important;
color:rgba(92, 112, 128, 0.6) !important;
cursor:not-allowed !important;
outline:none !important; }
.bp3-menu-item.bp3-disabled::before,
.bp3-menu-item.bp3-disabled > .bp3-icon,
.bp3-menu-item.bp3-disabled .bp3-menu-item-label{
color:rgba(92, 112, 128, 0.6) !important; }
.bp3-large .bp3-menu-item{
font-size:16px;
line-height:22px;
padding:9px 7px; }
.bp3-large .bp3-menu-item .bp3-icon{
margin-top:3px; }
.bp3-large .bp3-menu-item::before{
font-family:"Icons20", sans-serif;
font-size:20px;
font-style:normal;
font-weight:400;
line-height:1;
-moz-osx-font-smoothing:grayscale;
-webkit-font-smoothing:antialiased;
margin-right:10px;
margin-top:1px; }
button.bp3-menu-item{
background:none;
border:none;
text-align:left;
width:100%; }
.bp3-menu-header{
border-top:1px solid rgba(16, 22, 26, 0.15);
display:block;
margin:5px;
cursor:default;
padding-left:2px; }
.bp3-dark .bp3-menu-header{
border-top-color:rgba(255, 255, 255, 0.15); }
.bp3-menu-header:first-of-type{
border-top:none; }
.bp3-menu-header > h6{
color:#182026;
font-weight:600;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
word-wrap:normal;
line-height:17px;
margin:0;
padding:10px 7px 0 1px; }
.bp3-dark .bp3-menu-header > h6{
color:#f5f8fa; }
.bp3-menu-header:first-of-type > h6{
padding-top:0; }
.bp3-large .bp3-menu-header > h6{
font-size:18px;
padding-bottom:5px;
padding-top:15px; }
.bp3-large .bp3-menu-header:first-of-type > h6{
padding-top:0; }
.bp3-dark .bp3-menu{
background:#30404d;
color:#f5f8fa; }
.bp3-dark .bp3-menu-item{ }
.bp3-dark .bp3-menu-item.bp3-intent-primary{
color:#48aff0; }
.bp3-dark .bp3-menu-item.bp3-intent-primary .bp3-icon{
color:inherit; }
.bp3-dark .bp3-menu-item.bp3-intent-primary::before, .bp3-dark .bp3-menu-item.bp3-intent-primary::after,
.bp3-dark .bp3-menu-item.bp3-intent-primary .bp3-menu-item-label{
color:#48aff0; }
.bp3-dark .bp3-menu-item.bp3-intent-primary:hover, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item, .bp3-dark .bp3-menu-item.bp3-intent-primary.bp3-active{
background-color:#137cbd; }
.bp3-dark .bp3-menu-item.bp3-intent-primary:active{
background-color:#106ba3; }
.bp3-dark .bp3-menu-item.bp3-intent-primary:hover, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item, .bp3-dark .bp3-menu-item.bp3-intent-primary:hover::before, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item::before, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item::before, .bp3-dark .bp3-menu-item.bp3-intent-primary:hover::after, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item::after, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item::after,
.bp3-dark .bp3-menu-item.bp3-intent-primary:hover .bp3-menu-item-label,
.bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item .bp3-menu-item-label,
.bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item .bp3-menu-item-label, .bp3-dark .bp3-menu-item.bp3-intent-primary:active, .bp3-dark .bp3-menu-item.bp3-intent-primary:active::before, .bp3-dark .bp3-menu-item.bp3-intent-primary:active::after,
.bp3-dark .bp3-menu-item.bp3-intent-primary:active .bp3-menu-item-label, .bp3-dark .bp3-menu-item.bp3-intent-primary.bp3-active, .bp3-dark .bp3-menu-item.bp3-intent-primary.bp3-active::before, .bp3-dark .bp3-menu-item.bp3-intent-primary.bp3-active::after,
.bp3-dark .bp3-menu-item.bp3-intent-primary.bp3-active .bp3-menu-item-label{
color:#ffffff; }
.bp3-dark .bp3-menu-item.bp3-intent-success{
color:#3dcc91; }
.bp3-dark .bp3-menu-item.bp3-intent-success .bp3-icon{
color:inherit; }
.bp3-dark .bp3-menu-item.bp3-intent-success::before, .bp3-dark .bp3-menu-item.bp3-intent-success::after,
.bp3-dark .bp3-menu-item.bp3-intent-success .bp3-menu-item-label{
color:#3dcc91; }
.bp3-dark .bp3-menu-item.bp3-intent-success:hover, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item, .bp3-dark .bp3-menu-item.bp3-intent-success.bp3-active{
background-color:#0f9960; }
.bp3-dark .bp3-menu-item.bp3-intent-success:active{
background-color:#0d8050; }
.bp3-dark .bp3-menu-item.bp3-intent-success:hover, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item, .bp3-dark .bp3-menu-item.bp3-intent-success:hover::before, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item::before, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item::before, .bp3-dark .bp3-menu-item.bp3-intent-success:hover::after, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item::after, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item::after,
.bp3-dark .bp3-menu-item.bp3-intent-success:hover .bp3-menu-item-label,
.bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item .bp3-menu-item-label,
.bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item .bp3-menu-item-label, .bp3-dark .bp3-menu-item.bp3-intent-success:active, .bp3-dark .bp3-menu-item.bp3-intent-success:active::before, .bp3-dark .bp3-menu-item.bp3-intent-success:active::after,
.bp3-dark .bp3-menu-item.bp3-intent-success:active .bp3-menu-item-label, .bp3-dark .bp3-menu-item.bp3-intent-success.bp3-active, .bp3-dark .bp3-menu-item.bp3-intent-success.bp3-active::before, .bp3-dark .bp3-menu-item.bp3-intent-success.bp3-active::after,
.bp3-dark .bp3-menu-item.bp3-intent-success.bp3-active .bp3-menu-item-label{
color:#ffffff; }
.bp3-dark .bp3-menu-item.bp3-intent-warning{
color:#ffb366; }
.bp3-dark .bp3-menu-item.bp3-intent-warning .bp3-icon{
color:inherit; }
.bp3-dark .bp3-menu-item.bp3-intent-warning::before, .bp3-dark .bp3-menu-item.bp3-intent-warning::after,
.bp3-dark .bp3-menu-item.bp3-intent-warning .bp3-menu-item-label{
color:#ffb366; }
.bp3-dark .bp3-menu-item.bp3-intent-warning:hover, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item, .bp3-dark .bp3-menu-item.bp3-intent-warning.bp3-active{
background-color:#d9822b; }
.bp3-dark .bp3-menu-item.bp3-intent-warning:active{
background-color:#bf7326; }
.bp3-dark .bp3-menu-item.bp3-intent-warning:hover, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item, .bp3-dark .bp3-menu-item.bp3-intent-warning:hover::before, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item::before, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item::before, .bp3-dark .bp3-menu-item.bp3-intent-warning:hover::after, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item::after, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item::after,
.bp3-dark .bp3-menu-item.bp3-intent-warning:hover .bp3-menu-item-label,
.bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item .bp3-menu-item-label,
.bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item .bp3-menu-item-label, .bp3-dark .bp3-menu-item.bp3-intent-warning:active, .bp3-dark .bp3-menu-item.bp3-intent-warning:active::before, .bp3-dark .bp3-menu-item.bp3-intent-warning:active::after,
.bp3-dark .bp3-menu-item.bp3-intent-warning:active .bp3-menu-item-label, .bp3-dark .bp3-menu-item.bp3-intent-warning.bp3-active, .bp3-dark .bp3-menu-item.bp3-intent-warning.bp3-active::before, .bp3-dark .bp3-menu-item.bp3-intent-warning.bp3-active::after,
.bp3-dark .bp3-menu-item.bp3-intent-warning.bp3-active .bp3-menu-item-label{
color:#ffffff; }
.bp3-dark .bp3-menu-item.bp3-intent-danger{
color:#ff7373; }
.bp3-dark .bp3-menu-item.bp3-intent-danger .bp3-icon{
color:inherit; }
.bp3-dark .bp3-menu-item.bp3-intent-danger::before, .bp3-dark .bp3-menu-item.bp3-intent-danger::after,
.bp3-dark .bp3-menu-item.bp3-intent-danger .bp3-menu-item-label{
color:#ff7373; }
.bp3-dark .bp3-menu-item.bp3-intent-danger:hover, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item, .bp3-dark .bp3-menu-item.bp3-intent-danger.bp3-active{
background-color:#db3737; }
.bp3-dark .bp3-menu-item.bp3-intent-danger:active{
background-color:#c23030; }
.bp3-dark .bp3-menu-item.bp3-intent-danger:hover, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item, .bp3-dark .bp3-menu-item.bp3-intent-danger:hover::before, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item::before, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item::before, .bp3-dark .bp3-menu-item.bp3-intent-danger:hover::after, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item::after, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item::after,
.bp3-dark .bp3-menu-item.bp3-intent-danger:hover .bp3-menu-item-label,
.bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item .bp3-menu-item-label,
.bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item .bp3-menu-item-label, .bp3-dark .bp3-menu-item.bp3-intent-danger:active, .bp3-dark .bp3-menu-item.bp3-intent-danger:active::before, .bp3-dark .bp3-menu-item.bp3-intent-danger:active::after,
.bp3-dark .bp3-menu-item.bp3-intent-danger:active .bp3-menu-item-label, .bp3-dark .bp3-menu-item.bp3-intent-danger.bp3-active, .bp3-dark .bp3-menu-item.bp3-intent-danger.bp3-active::before, .bp3-dark .bp3-menu-item.bp3-intent-danger.bp3-active::after,
.bp3-dark .bp3-menu-item.bp3-intent-danger.bp3-active .bp3-menu-item-label{
color:#ffffff; }
.bp3-dark .bp3-menu-item::before,
.bp3-dark .bp3-menu-item > .bp3-icon{
color:#a7b6c2; }
.bp3-dark .bp3-menu-item .bp3-menu-item-label{
color:#a7b6c2; }
.bp3-dark .bp3-menu-item.bp3-active, .bp3-dark .bp3-menu-item:active{
background-color:rgba(138, 155, 168, 0.3); }
.bp3-dark .bp3-menu-item.bp3-disabled{
color:rgba(167, 182, 194, 0.6) !important; }
.bp3-dark .bp3-menu-item.bp3-disabled::before,
.bp3-dark .bp3-menu-item.bp3-disabled > .bp3-icon,
.bp3-dark .bp3-menu-item.bp3-disabled .bp3-menu-item-label{
color:rgba(167, 182, 194, 0.6) !important; }
.bp3-dark .bp3-menu-divider,
.bp3-dark .bp3-menu-header{
border-color:rgba(255, 255, 255, 0.15); }
.bp3-dark .bp3-menu-header > h6{
color:#f5f8fa; }
.bp3-label .bp3-menu{
margin-top:5px; }
.bp3-navbar{
background-color:#ffffff;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.2);
height:50px;
padding:0 15px;
position:relative;
width:100%;
z-index:10; }
.bp3-navbar.bp3-dark,
.bp3-dark .bp3-navbar{
background-color:#394b59; }
.bp3-navbar.bp3-dark{
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-navbar{
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.4); }
.bp3-navbar.bp3-fixed-top{
left:0;
position:fixed;
right:0;
top:0; }
.bp3-navbar-heading{
font-size:16px;
margin-right:15px; }
.bp3-navbar-group{
-webkit-box-align:center;
-ms-flex-align:center;
align-items:center;
display:-webkit-box;
display:-ms-flexbox;
display:flex;
height:50px; }
.bp3-navbar-group.bp3-align-left{
float:left; }
.bp3-navbar-group.bp3-align-right{
float:right; }
.bp3-navbar-divider{
border-left:1px solid rgba(16, 22, 26, 0.15);
height:20px;
margin:0 10px; }
.bp3-dark .bp3-navbar-divider{
border-left-color:rgba(255, 255, 255, 0.15); }
.bp3-non-ideal-state{
display:-webkit-box;
display:-ms-flexbox;
display:flex;
-webkit-box-orient:vertical;
-webkit-box-direction:normal;
-ms-flex-direction:column;
flex-direction:column;
-webkit-box-align:center;
-ms-flex-align:center;
align-items:center;
height:100%;
-webkit-box-pack:center;
-ms-flex-pack:center;
justify-content:center;
text-align:center;
width:100%; }
.bp3-non-ideal-state > *{
-webkit-box-flex:0;
-ms-flex-positive:0;
flex-grow:0;
-ms-flex-negative:0;
flex-shrink:0; }
.bp3-non-ideal-state > .bp3-fill{
-webkit-box-flex:1;
-ms-flex-positive:1;
flex-grow:1;
-ms-flex-negative:1;
flex-shrink:1; }
.bp3-non-ideal-state::before,
.bp3-non-ideal-state > *{
margin-bottom:20px; }
.bp3-non-ideal-state:empty::before,
.bp3-non-ideal-state > :last-child{
margin-bottom:0; }
.bp3-non-ideal-state > *{
max-width:400px; }
.bp3-non-ideal-state-visual{
color:rgba(92, 112, 128, 0.6);
font-size:60px; }
.bp3-dark .bp3-non-ideal-state-visual{
color:rgba(167, 182, 194, 0.6); }
.bp3-overflow-list{
display:-webkit-box;
display:-ms-flexbox;
display:flex;
-ms-flex-wrap:nowrap;
flex-wrap:nowrap;
min-width:0; }
.bp3-overflow-list-spacer{
-ms-flex-negative:1;
flex-shrink:1;
width:1px; }
body.bp3-overlay-open{
overflow:hidden; }
.bp3-overlay{
bottom:0;
left:0;
position:static;
right:0;
top:0;
z-index:20; }
.bp3-overlay:not(.bp3-overlay-open){
pointer-events:none; }
.bp3-overlay.bp3-overlay-container{
overflow:hidden;
position:fixed; }
.bp3-overlay.bp3-overlay-container.bp3-overlay-inline{
position:absolute; }
.bp3-overlay.bp3-overlay-scroll-container{
overflow:auto;
position:fixed; }
.bp3-overlay.bp3-overlay-scroll-container.bp3-overlay-inline{
position:absolute; }
.bp3-overlay.bp3-overlay-inline{
display:inline;
overflow:visible; }
.bp3-overlay-content{
position:fixed;
z-index:20; }
.bp3-overlay-inline .bp3-overlay-content,
.bp3-overlay-scroll-container .bp3-overlay-content{
position:absolute; }
.bp3-overlay-backdrop{
bottom:0;
left:0;
position:fixed;
right:0;
top:0;
opacity:1;
background-color:rgba(16, 22, 26, 0.7);
overflow:auto;
-webkit-user-select:none;
-moz-user-select:none;
-ms-user-select:none;
user-select:none;
z-index:20; }
.bp3-overlay-backdrop.bp3-overlay-enter, .bp3-overlay-backdrop.bp3-overlay-appear{
opacity:0; }
.bp3-overlay-backdrop.bp3-overlay-enter-active, .bp3-overlay-backdrop.bp3-overlay-appear-active{
opacity:1;
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:200ms;
transition-duration:200ms;
-webkit-transition-property:opacity;
transition-property:opacity;
-webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-overlay-backdrop.bp3-overlay-exit{
opacity:1; }
.bp3-overlay-backdrop.bp3-overlay-exit-active{
opacity:0;
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:200ms;
transition-duration:200ms;
-webkit-transition-property:opacity;
transition-property:opacity;
-webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-overlay-backdrop:focus{
outline:none; }
.bp3-overlay-inline .bp3-overlay-backdrop{
position:absolute; }
.bp3-panel-stack{
overflow:hidden;
position:relative; }
.bp3-panel-stack-header{
-webkit-box-align:center;
-ms-flex-align:center;
align-items:center;
-webkit-box-shadow:0 1px rgba(16, 22, 26, 0.15);
box-shadow:0 1px rgba(16, 22, 26, 0.15);
display:-webkit-box;
display:-ms-flexbox;
display:flex;
-ms-flex-negative:0;
flex-shrink:0;
height:30px;
z-index:1; }
.bp3-dark .bp3-panel-stack-header{
-webkit-box-shadow:0 1px rgba(255, 255, 255, 0.15);
box-shadow:0 1px rgba(255, 255, 255, 0.15); }
.bp3-panel-stack-header > span{
-webkit-box-align:stretch;
-ms-flex-align:stretch;
align-items:stretch;
display:-webkit-box;
display:-ms-flexbox;
display:flex;
-webkit-box-flex:1;
-ms-flex:1;
flex:1; }
.bp3-panel-stack-header .bp3-heading{
margin:0 5px; }
.bp3-button.bp3-panel-stack-header-back{
margin-left:5px;
padding-left:0;
white-space:nowrap; }
.bp3-button.bp3-panel-stack-header-back .bp3-icon{
margin:0 2px; }
.bp3-panel-stack-view{
bottom:0;
left:0;
position:absolute;
right:0;
top:0;
background-color:#ffffff;
border-right:1px solid rgba(16, 22, 26, 0.15);
display:-webkit-box;
display:-ms-flexbox;
display:flex;
-webkit-box-orient:vertical;
-webkit-box-direction:normal;
-ms-flex-direction:column;
flex-direction:column;
margin-right:-1px;
overflow-y:auto;
z-index:1; }
.bp3-dark .bp3-panel-stack-view{
background-color:#30404d; }
.bp3-panel-stack-view:nth-last-child(n + 4){
display:none; }
.bp3-panel-stack-push .bp3-panel-stack-enter, .bp3-panel-stack-push .bp3-panel-stack-appear{
-webkit-transform:translateX(100%);
transform:translateX(100%);
opacity:0; }
.bp3-panel-stack-push .bp3-panel-stack-enter-active, .bp3-panel-stack-push .bp3-panel-stack-appear-active{
-webkit-transform:translate(0%);
transform:translate(0%);
opacity:1;
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:400ms;
transition-duration:400ms;
-webkit-transition-property:opacity, -webkit-transform;
transition-property:opacity, -webkit-transform;
transition-property:transform, opacity;
transition-property:transform, opacity, -webkit-transform;
-webkit-transition-timing-function:ease;
transition-timing-function:ease; }
.bp3-panel-stack-push .bp3-panel-stack-exit{
-webkit-transform:translate(0%);
transform:translate(0%);
opacity:1; }
.bp3-panel-stack-push .bp3-panel-stack-exit-active{
-webkit-transform:translateX(-50%);
transform:translateX(-50%);
opacity:0;
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:400ms;
transition-duration:400ms;
-webkit-transition-property:opacity, -webkit-transform;
transition-property:opacity, -webkit-transform;
transition-property:transform, opacity;
transition-property:transform, opacity, -webkit-transform;
-webkit-transition-timing-function:ease;
transition-timing-function:ease; }
.bp3-panel-stack-pop .bp3-panel-stack-enter, .bp3-panel-stack-pop .bp3-panel-stack-appear{
-webkit-transform:translateX(-50%);
transform:translateX(-50%);
opacity:0; }
.bp3-panel-stack-pop .bp3-panel-stack-enter-active, .bp3-panel-stack-pop .bp3-panel-stack-appear-active{
-webkit-transform:translate(0%);
transform:translate(0%);
opacity:1;
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:400ms;
transition-duration:400ms;
-webkit-transition-property:opacity, -webkit-transform;
transition-property:opacity, -webkit-transform;
transition-property:transform, opacity;
transition-property:transform, opacity, -webkit-transform;
-webkit-transition-timing-function:ease;
transition-timing-function:ease; }
.bp3-panel-stack-pop .bp3-panel-stack-exit{
-webkit-transform:translate(0%);
transform:translate(0%);
opacity:1; }
.bp3-panel-stack-pop .bp3-panel-stack-exit-active{
-webkit-transform:translateX(100%);
transform:translateX(100%);
opacity:0;
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:400ms;
transition-duration:400ms;
-webkit-transition-property:opacity, -webkit-transform;
transition-property:opacity, -webkit-transform;
transition-property:transform, opacity;
transition-property:transform, opacity, -webkit-transform;
-webkit-transition-timing-function:ease;
transition-timing-function:ease; }
.bp3-panel-stack2{
overflow:hidden;
position:relative; }
.bp3-panel-stack2-header{
-webkit-box-align:center;
-ms-flex-align:center;
align-items:center;
-webkit-box-shadow:0 1px rgba(16, 22, 26, 0.15);
box-shadow:0 1px rgba(16, 22, 26, 0.15);
display:-webkit-box;
display:-ms-flexbox;
display:flex;
-ms-flex-negative:0;
flex-shrink:0;
height:30px;
z-index:1; }
.bp3-dark .bp3-panel-stack2-header{
-webkit-box-shadow:0 1px rgba(255, 255, 255, 0.15);
box-shadow:0 1px rgba(255, 255, 255, 0.15); }
.bp3-panel-stack2-header > span{
-webkit-box-align:stretch;
-ms-flex-align:stretch;
align-items:stretch;
display:-webkit-box;
display:-ms-flexbox;
display:flex;
-webkit-box-flex:1;
-ms-flex:1;
flex:1; }
.bp3-panel-stack2-header .bp3-heading{
margin:0 5px; }
.bp3-button.bp3-panel-stack2-header-back{
margin-left:5px;
padding-left:0;
white-space:nowrap; }
.bp3-button.bp3-panel-stack2-header-back .bp3-icon{
margin:0 2px; }
.bp3-panel-stack2-view{
bottom:0;
left:0;
position:absolute;
right:0;
top:0;
background-color:#ffffff;
border-right:1px solid rgba(16, 22, 26, 0.15);
display:-webkit-box;
display:-ms-flexbox;
display:flex;
-webkit-box-orient:vertical;
-webkit-box-direction:normal;
-ms-flex-direction:column;
flex-direction:column;
margin-right:-1px;
overflow-y:auto;
z-index:1; }
.bp3-dark .bp3-panel-stack2-view{
background-color:#30404d; }
.bp3-panel-stack2-view:nth-last-child(n + 4){
display:none; }
.bp3-panel-stack2-push .bp3-panel-stack2-enter, .bp3-panel-stack2-push .bp3-panel-stack2-appear{
-webkit-transform:translateX(100%);
transform:translateX(100%);
opacity:0; }
.bp3-panel-stack2-push .bp3-panel-stack2-enter-active, .bp3-panel-stack2-push .bp3-panel-stack2-appear-active{
-webkit-transform:translate(0%);
transform:translate(0%);
opacity:1;
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:400ms;
transition-duration:400ms;
-webkit-transition-property:opacity, -webkit-transform;
transition-property:opacity, -webkit-transform;
transition-property:transform, opacity;
transition-property:transform, opacity, -webkit-transform;
-webkit-transition-timing-function:ease;
transition-timing-function:ease; }
.bp3-panel-stack2-push .bp3-panel-stack2-exit{
-webkit-transform:translate(0%);
transform:translate(0%);
opacity:1; }
.bp3-panel-stack2-push .bp3-panel-stack2-exit-active{
-webkit-transform:translateX(-50%);
transform:translateX(-50%);
opacity:0;
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:400ms;
transition-duration:400ms;
-webkit-transition-property:opacity, -webkit-transform;
transition-property:opacity, -webkit-transform;
transition-property:transform, opacity;
transition-property:transform, opacity, -webkit-transform;
-webkit-transition-timing-function:ease;
transition-timing-function:ease; }
.bp3-panel-stack2-pop .bp3-panel-stack2-enter, .bp3-panel-stack2-pop .bp3-panel-stack2-appear{
-webkit-transform:translateX(-50%);
transform:translateX(-50%);
opacity:0; }
.bp3-panel-stack2-pop .bp3-panel-stack2-enter-active, .bp3-panel-stack2-pop .bp3-panel-stack2-appear-active{
-webkit-transform:translate(0%);
transform:translate(0%);
opacity:1;
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:400ms;
transition-duration:400ms;
-webkit-transition-property:opacity, -webkit-transform;
transition-property:opacity, -webkit-transform;
transition-property:transform, opacity;
transition-property:transform, opacity, -webkit-transform;
-webkit-transition-timing-function:ease;
transition-timing-function:ease; }
.bp3-panel-stack2-pop .bp3-panel-stack2-exit{
-webkit-transform:translate(0%);
transform:translate(0%);
opacity:1; }
.bp3-panel-stack2-pop .bp3-panel-stack2-exit-active{
-webkit-transform:translateX(100%);
transform:translateX(100%);
opacity:0;
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:400ms;
transition-duration:400ms;
-webkit-transition-property:opacity, -webkit-transform;
transition-property:opacity, -webkit-transform;
transition-property:transform, opacity;
transition-property:transform, opacity, -webkit-transform;
-webkit-transition-timing-function:ease;
transition-timing-function:ease; }
.bp3-popover{
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2);
-webkit-transform:scale(1);
transform:scale(1);
border-radius:3px;
display:inline-block;
z-index:20; }
.bp3-popover .bp3-popover-arrow{
height:30px;
position:absolute;
width:30px; }
.bp3-popover .bp3-popover-arrow::before{
height:20px;
margin:5px;
width:20px; }
.bp3-tether-element-attached-bottom.bp3-tether-target-attached-top > .bp3-popover{
margin-bottom:17px;
margin-top:-17px; }
.bp3-tether-element-attached-bottom.bp3-tether-target-attached-top > .bp3-popover > .bp3-popover-arrow{
bottom:-11px; }
.bp3-tether-element-attached-bottom.bp3-tether-target-attached-top > .bp3-popover > .bp3-popover-arrow svg{
-webkit-transform:rotate(-90deg);
transform:rotate(-90deg); }
.bp3-tether-element-attached-left.bp3-tether-target-attached-right > .bp3-popover{
margin-left:17px; }
.bp3-tether-element-attached-left.bp3-tether-target-attached-right > .bp3-popover > .bp3-popover-arrow{
left:-11px; }
.bp3-tether-element-attached-left.bp3-tether-target-attached-right > .bp3-popover > .bp3-popover-arrow svg{
-webkit-transform:rotate(0);
transform:rotate(0); }
.bp3-tether-element-attached-top.bp3-tether-target-attached-bottom > .bp3-popover{
margin-top:17px; }
.bp3-tether-element-attached-top.bp3-tether-target-attached-bottom > .bp3-popover > .bp3-popover-arrow{
top:-11px; }
.bp3-tether-element-attached-top.bp3-tether-target-attached-bottom > .bp3-popover > .bp3-popover-arrow svg{
-webkit-transform:rotate(90deg);
transform:rotate(90deg); }
.bp3-tether-element-attached-right.bp3-tether-target-attached-left > .bp3-popover{
margin-left:-17px;
margin-right:17px; }
.bp3-tether-element-attached-right.bp3-tether-target-attached-left > .bp3-popover > .bp3-popover-arrow{
right:-11px; }
.bp3-tether-element-attached-right.bp3-tether-target-attached-left > .bp3-popover > .bp3-popover-arrow svg{
-webkit-transform:rotate(180deg);
transform:rotate(180deg); }
.bp3-tether-element-attached-middle > .bp3-popover > .bp3-popover-arrow{
top:50%;
-webkit-transform:translateY(-50%);
transform:translateY(-50%); }
.bp3-tether-element-attached-center > .bp3-popover > .bp3-popover-arrow{
right:50%;
-webkit-transform:translateX(50%);
transform:translateX(50%); }
.bp3-tether-element-attached-top.bp3-tether-target-attached-top > .bp3-popover > .bp3-popover-arrow{
top:-0.3934px; }
.bp3-tether-element-attached-right.bp3-tether-target-attached-right > .bp3-popover > .bp3-popover-arrow{
right:-0.3934px; }
.bp3-tether-element-attached-left.bp3-tether-target-attached-left > .bp3-popover > .bp3-popover-arrow{
left:-0.3934px; }
.bp3-tether-element-attached-bottom.bp3-tether-target-attached-bottom > .bp3-popover > .bp3-popover-arrow{
bottom:-0.3934px; }
.bp3-tether-element-attached-top.bp3-tether-element-attached-left > .bp3-popover{
-webkit-transform-origin:top left;
transform-origin:top left; }
.bp3-tether-element-attached-top.bp3-tether-element-attached-center > .bp3-popover{
-webkit-transform-origin:top center;
transform-origin:top center; }
.bp3-tether-element-attached-top.bp3-tether-element-attached-right > .bp3-popover{
-webkit-transform-origin:top right;
transform-origin:top right; }
.bp3-tether-element-attached-middle.bp3-tether-element-attached-left > .bp3-popover{
-webkit-transform-origin:center left;
transform-origin:center left; }
.bp3-tether-element-attached-middle.bp3-tether-element-attached-center > .bp3-popover{
-webkit-transform-origin:center center;
transform-origin:center center; }
.bp3-tether-element-attached-middle.bp3-tether-element-attached-right > .bp3-popover{
-webkit-transform-origin:center right;
transform-origin:center right; }
.bp3-tether-element-attached-bottom.bp3-tether-element-attached-left > .bp3-popover{
-webkit-transform-origin:bottom left;
transform-origin:bottom left; }
.bp3-tether-element-attached-bottom.bp3-tether-element-attached-center > .bp3-popover{
-webkit-transform-origin:bottom center;
transform-origin:bottom center; }
.bp3-tether-element-attached-bottom.bp3-tether-element-attached-right > .bp3-popover{
-webkit-transform-origin:bottom right;
transform-origin:bottom right; }
.bp3-popover .bp3-popover-content{
background:#ffffff;
color:inherit; }
.bp3-popover .bp3-popover-arrow::before{
-webkit-box-shadow:1px 1px 6px rgba(16, 22, 26, 0.2);
box-shadow:1px 1px 6px rgba(16, 22, 26, 0.2); }
.bp3-popover .bp3-popover-arrow-border{
fill:#10161a;
fill-opacity:0.1; }
.bp3-popover .bp3-popover-arrow-fill{
fill:#ffffff; }
.bp3-popover-enter > .bp3-popover, .bp3-popover-appear > .bp3-popover{
-webkit-transform:scale(0.3);
transform:scale(0.3); }
.bp3-popover-enter-active > .bp3-popover, .bp3-popover-appear-active > .bp3-popover{
-webkit-transform:scale(1);
transform:scale(1);
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:300ms;
transition-duration:300ms;
-webkit-transition-property:-webkit-transform;
transition-property:-webkit-transform;
transition-property:transform;
transition-property:transform, -webkit-transform;
-webkit-transition-timing-function:cubic-bezier(0.54, 1.12, 0.38, 1.11);
transition-timing-function:cubic-bezier(0.54, 1.12, 0.38, 1.11); }
.bp3-popover-exit > .bp3-popover{
-webkit-transform:scale(1);
transform:scale(1); }
.bp3-popover-exit-active > .bp3-popover{
-webkit-transform:scale(0.3);
transform:scale(0.3);
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:300ms;
transition-duration:300ms;
-webkit-transition-property:-webkit-transform;
transition-property:-webkit-transform;
transition-property:transform;
transition-property:transform, -webkit-transform;
-webkit-transition-timing-function:cubic-bezier(0.54, 1.12, 0.38, 1.11);
transition-timing-function:cubic-bezier(0.54, 1.12, 0.38, 1.11); }
.bp3-popover .bp3-popover-content{
border-radius:3px;
position:relative; }
.bp3-popover.bp3-popover-content-sizing .bp3-popover-content{
max-width:350px;
padding:20px; }
.bp3-popover-target + .bp3-overlay .bp3-popover.bp3-popover-content-sizing{
width:350px; }
.bp3-popover.bp3-minimal{
margin:0 !important; }
.bp3-popover.bp3-minimal .bp3-popover-arrow{
display:none; }
.bp3-popover.bp3-minimal.bp3-popover{
-webkit-transform:scale(1);
transform:scale(1); }
.bp3-popover-enter > .bp3-popover.bp3-minimal.bp3-popover, .bp3-popover-appear > .bp3-popover.bp3-minimal.bp3-popover{
-webkit-transform:scale(1);
transform:scale(1); }
.bp3-popover-enter-active > .bp3-popover.bp3-minimal.bp3-popover, .bp3-popover-appear-active > .bp3-popover.bp3-minimal.bp3-popover{
-webkit-transform:scale(1);
transform:scale(1);
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:100ms;
transition-duration:100ms;
-webkit-transition-property:-webkit-transform;
transition-property:-webkit-transform;
transition-property:transform;
transition-property:transform, -webkit-transform;
-webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-popover-exit > .bp3-popover.bp3-minimal.bp3-popover{
-webkit-transform:scale(1);
transform:scale(1); }
.bp3-popover-exit-active > .bp3-popover.bp3-minimal.bp3-popover{
-webkit-transform:scale(1);
transform:scale(1);
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:100ms;
transition-duration:100ms;
-webkit-transition-property:-webkit-transform;
transition-property:-webkit-transform;
transition-property:transform;
transition-property:transform, -webkit-transform;
-webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-popover.bp3-dark,
.bp3-dark .bp3-popover{
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4); }
.bp3-popover.bp3-dark .bp3-popover-content,
.bp3-dark .bp3-popover .bp3-popover-content{
background:#30404d;
color:inherit; }
.bp3-popover.bp3-dark .bp3-popover-arrow::before,
.bp3-dark .bp3-popover .bp3-popover-arrow::before{
-webkit-box-shadow:1px 1px 6px rgba(16, 22, 26, 0.4);
box-shadow:1px 1px 6px rgba(16, 22, 26, 0.4); }
.bp3-popover.bp3-dark .bp3-popover-arrow-border,
.bp3-dark .bp3-popover .bp3-popover-arrow-border{
fill:#10161a;
fill-opacity:0.2; }
.bp3-popover.bp3-dark .bp3-popover-arrow-fill,
.bp3-dark .bp3-popover .bp3-popover-arrow-fill{
fill:#30404d; }
.bp3-popover-arrow::before{
border-radius:2px;
content:"";
display:block;
position:absolute;
-webkit-transform:rotate(45deg);
transform:rotate(45deg); }
.bp3-tether-pinned .bp3-popover-arrow{
display:none; }
.bp3-popover-backdrop{
background:rgba(255, 255, 255, 0); }
.bp3-transition-container{
opacity:1;
display:-webkit-box;
display:-ms-flexbox;
display:flex;
z-index:20; }
.bp3-transition-container.bp3-popover-enter, .bp3-transition-container.bp3-popover-appear{
opacity:0; }
.bp3-transition-container.bp3-popover-enter-active, .bp3-transition-container.bp3-popover-appear-active{
opacity:1;
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:100ms;
transition-duration:100ms;
-webkit-transition-property:opacity;
transition-property:opacity;
-webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-transition-container.bp3-popover-exit{
opacity:1; }
.bp3-transition-container.bp3-popover-exit-active{
opacity:0;
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:100ms;
transition-duration:100ms;
-webkit-transition-property:opacity;
transition-property:opacity;
-webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-transition-container:focus{
outline:none; }
.bp3-transition-container.bp3-popover-leave .bp3-popover-content{
pointer-events:none; }
.bp3-transition-container[data-x-out-of-boundaries]{
display:none; }
span.bp3-popover-target{
display:inline-block; }
.bp3-popover-wrapper.bp3-fill{
width:100%; }
.bp3-portal{
left:0;
position:absolute;
right:0;
top:0; }
@-webkit-keyframes linear-progress-bar-stripes{
from{
background-position:0 0; }
to{
background-position:30px 0; } }
@keyframes linear-progress-bar-stripes{
from{
background-position:0 0; }
to{
background-position:30px 0; } }
.bp3-progress-bar{
background:rgba(92, 112, 128, 0.2);
border-radius:40px;
display:block;
height:8px;
overflow:hidden;
position:relative;
width:100%; }
.bp3-progress-bar .bp3-progress-meter{
background: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%);
background-color:rgba(92, 112, 128, 0.8);
background-size:30px 30px;
border-radius:40px;
height:100%;
position:absolute;
-webkit-transition:width 200ms cubic-bezier(0.4, 1, 0.75, 0.9);
transition:width 200ms cubic-bezier(0.4, 1, 0.75, 0.9);
width:100%; }
.bp3-progress-bar:not(.bp3-no-animation):not(.bp3-no-stripes) .bp3-progress-meter{
animation:linear-progress-bar-stripes 300ms linear infinite reverse; }
.bp3-progress-bar.bp3-no-stripes .bp3-progress-meter{
background-image:none; }
.bp3-dark .bp3-progress-bar{
background:rgba(16, 22, 26, 0.5); }
.bp3-dark .bp3-progress-bar .bp3-progress-meter{
background-color:#8a9ba8; }
.bp3-progress-bar.bp3-intent-primary .bp3-progress-meter{
background-color:#137cbd; }
.bp3-progress-bar.bp3-intent-success .bp3-progress-meter{
background-color:#0f9960; }
.bp3-progress-bar.bp3-intent-warning .bp3-progress-meter{
background-color:#d9822b; }
.bp3-progress-bar.bp3-intent-danger .bp3-progress-meter{
background-color:#db3737; }
@-webkit-keyframes skeleton-glow{
from{
background:rgba(206, 217, 224, 0.2);
border-color:rgba(206, 217, 224, 0.2); }
to{
background:rgba(92, 112, 128, 0.2);
border-color:rgba(92, 112, 128, 0.2); } }
@keyframes skeleton-glow{
from{
background:rgba(206, 217, 224, 0.2);
border-color:rgba(206, 217, 224, 0.2); }
to{
background:rgba(92, 112, 128, 0.2);
border-color:rgba(92, 112, 128, 0.2); } }
.bp3-skeleton{
-webkit-animation:1000ms linear infinite alternate skeleton-glow;
animation:1000ms linear infinite alternate skeleton-glow;
background:rgba(206, 217, 224, 0.2);
background-clip:padding-box !important;
border-color:rgba(206, 217, 224, 0.2) !important;
border-radius:2px;
-webkit-box-shadow:none !important;
box-shadow:none !important;
color:transparent !important;
cursor:default;
pointer-events:none;
-webkit-user-select:none;
-moz-user-select:none;
-ms-user-select:none;
user-select:none; }
.bp3-skeleton::before, .bp3-skeleton::after,
.bp3-skeleton *{
visibility:hidden !important; }
.bp3-slider{
height:40px;
min-width:150px;
width:100%;
cursor:default;
outline:none;
position:relative;
-webkit-user-select:none;
-moz-user-select:none;
-ms-user-select:none;
user-select:none; }
.bp3-slider:hover{
cursor:pointer; }
.bp3-slider:active{
cursor:-webkit-grabbing;
cursor:grabbing; }
.bp3-slider.bp3-disabled{
cursor:not-allowed;
opacity:0.5; }
.bp3-slider.bp3-slider-unlabeled{
height:16px; }
.bp3-slider-track,
.bp3-slider-progress{
height:6px;
left:0;
right:0;
top:5px;
position:absolute; }
.bp3-slider-track{
border-radius:3px;
overflow:hidden; }
.bp3-slider-progress{
background:rgba(92, 112, 128, 0.2); }
.bp3-dark .bp3-slider-progress{
background:rgba(16, 22, 26, 0.5); }
.bp3-slider-progress.bp3-intent-primary{
background-color:#137cbd; }
.bp3-slider-progress.bp3-intent-success{
background-color:#0f9960; }
.bp3-slider-progress.bp3-intent-warning{
background-color:#d9822b; }
.bp3-slider-progress.bp3-intent-danger{
background-color:#db3737; }
.bp3-slider-handle{
background-color:#f5f8fa;
background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.8)), to(rgba(255, 255, 255, 0)));
background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0));
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
color:#182026;
border-radius:3px;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 1px 1px rgba(16, 22, 26, 0.2);
cursor:pointer;
height:16px;
left:0;
position:absolute;
top:0;
width:16px; }
.bp3-slider-handle:hover{
background-clip:padding-box;
background-color:#ebf1f5;
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1); }
.bp3-slider-handle:active, .bp3-slider-handle.bp3-active{
background-color:#d8e1e8;
background-image:none;
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 2px rgba(16, 22, 26, 0.2);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 2px rgba(16, 22, 26, 0.2); }
.bp3-slider-handle:disabled, .bp3-slider-handle.bp3-disabled{
background-color:rgba(206, 217, 224, 0.5);
background-image:none;
-webkit-box-shadow:none;
box-shadow:none;
color:rgba(92, 112, 128, 0.6);
cursor:not-allowed;
outline:none; }
.bp3-slider-handle:disabled.bp3-active, .bp3-slider-handle:disabled.bp3-active:hover, .bp3-slider-handle.bp3-disabled.bp3-active, .bp3-slider-handle.bp3-disabled.bp3-active:hover{
background:rgba(206, 217, 224, 0.7); }
.bp3-slider-handle:focus{
z-index:1; }
.bp3-slider-handle:hover{
background-clip:padding-box;
background-color:#ebf1f5;
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 1px 1px rgba(16, 22, 26, 0.2);
cursor:-webkit-grab;
cursor:grab;
z-index:2; }
.bp3-slider-handle.bp3-active{
background-color:#d8e1e8;
background-image:none;
-webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 2px rgba(16, 22, 26, 0.2);
box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 2px rgba(16, 22, 26, 0.2);
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 1px rgba(16, 22, 26, 0.1);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 1px rgba(16, 22, 26, 0.1);
cursor:-webkit-grabbing;
cursor:grabbing; }
.bp3-disabled .bp3-slider-handle{
background:#bfccd6;
-webkit-box-shadow:none;
box-shadow:none;
pointer-events:none; }
.bp3-dark .bp3-slider-handle{
background-color:#394b59;
background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.05)), to(rgba(255, 255, 255, 0)));
background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0));
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
color:#f5f8fa; }
.bp3-dark .bp3-slider-handle:hover, .bp3-dark .bp3-slider-handle:active, .bp3-dark .bp3-slider-handle.bp3-active{
color:#f5f8fa; }
.bp3-dark .bp3-slider-handle:hover{
background-color:#30404d;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-slider-handle:active, .bp3-dark .bp3-slider-handle.bp3-active{
background-color:#202b33;
background-image:none;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.6), inset 0 1px 2px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.6), inset 0 1px 2px rgba(16, 22, 26, 0.2); }
.bp3-dark .bp3-slider-handle:disabled, .bp3-dark .bp3-slider-handle.bp3-disabled{
background-color:rgba(57, 75, 89, 0.5);
background-image:none;
-webkit-box-shadow:none;
box-shadow:none;
color:rgba(167, 182, 194, 0.6); }
.bp3-dark .bp3-slider-handle:disabled.bp3-active, .bp3-dark .bp3-slider-handle.bp3-disabled.bp3-active{
background:rgba(57, 75, 89, 0.7); }
.bp3-dark .bp3-slider-handle .bp3-button-spinner .bp3-spinner-head{
background:rgba(16, 22, 26, 0.5);
stroke:#8a9ba8; }
.bp3-dark .bp3-slider-handle, .bp3-dark .bp3-slider-handle:hover{
background-color:#394b59; }
.bp3-dark .bp3-slider-handle.bp3-active{
background-color:#293742; }
.bp3-dark .bp3-disabled .bp3-slider-handle{
background:#5c7080;
border-color:#5c7080;
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-slider-handle .bp3-slider-label{
background:#394b59;
border-radius:3px;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2);
color:#f5f8fa;
margin-left:8px; }
.bp3-dark .bp3-slider-handle .bp3-slider-label{
background:#e1e8ed;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4);
color:#394b59; }
.bp3-disabled .bp3-slider-handle .bp3-slider-label{
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-slider-handle.bp3-start, .bp3-slider-handle.bp3-end{
width:8px; }
.bp3-slider-handle.bp3-start{
border-bottom-right-radius:0;
border-top-right-radius:0; }
.bp3-slider-handle.bp3-end{
border-bottom-left-radius:0;
border-top-left-radius:0;
margin-left:8px; }
.bp3-slider-handle.bp3-end .bp3-slider-label{
margin-left:0; }
.bp3-slider-label{
-webkit-transform:translate(-50%, 20px);
transform:translate(-50%, 20px);
display:inline-block;
font-size:12px;
line-height:1;
padding:2px 5px;
position:absolute;
vertical-align:top; }
.bp3-slider.bp3-vertical{
height:150px;
min-width:40px;
width:40px; }
.bp3-slider.bp3-vertical .bp3-slider-track,
.bp3-slider.bp3-vertical .bp3-slider-progress{
bottom:0;
height:auto;
left:5px;
top:0;
width:6px; }
.bp3-slider.bp3-vertical .bp3-slider-progress{
top:auto; }
.bp3-slider.bp3-vertical .bp3-slider-label{
-webkit-transform:translate(20px, 50%);
transform:translate(20px, 50%); }
.bp3-slider.bp3-vertical .bp3-slider-handle{
top:auto; }
.bp3-slider.bp3-vertical .bp3-slider-handle .bp3-slider-label{
margin-left:0;
margin-top:-8px; }
.bp3-slider.bp3-vertical .bp3-slider-handle.bp3-end, .bp3-slider.bp3-vertical .bp3-slider-handle.bp3-start{
height:8px;
margin-left:0;
width:16px; }
.bp3-slider.bp3-vertical .bp3-slider-handle.bp3-start{
border-bottom-right-radius:3px;
border-top-left-radius:0; }
.bp3-slider.bp3-vertical .bp3-slider-handle.bp3-start .bp3-slider-label{
-webkit-transform:translate(20px);
transform:translate(20px); }
.bp3-slider.bp3-vertical .bp3-slider-handle.bp3-end{
border-bottom-left-radius:0;
border-bottom-right-radius:0;
border-top-left-radius:3px;
margin-bottom:8px; }
@-webkit-keyframes pt-spinner-animation{
from{
-webkit-transform:rotate(0deg);
transform:rotate(0deg); }
to{
-webkit-transform:rotate(360deg);
transform:rotate(360deg); } }
@keyframes pt-spinner-animation{
from{
-webkit-transform:rotate(0deg);
transform:rotate(0deg); }
to{
-webkit-transform:rotate(360deg);
transform:rotate(360deg); } }
.bp3-spinner{
-webkit-box-align:center;
-ms-flex-align:center;
align-items:center;
display:-webkit-box;
display:-ms-flexbox;
display:flex;
-webkit-box-pack:center;
-ms-flex-pack:center;
justify-content:center;
overflow:visible;
vertical-align:middle; }
.bp3-spinner svg{
display:block; }
.bp3-spinner path{
fill-opacity:0; }
.bp3-spinner .bp3-spinner-head{
stroke:rgba(92, 112, 128, 0.8);
stroke-linecap:round;
-webkit-transform-origin:center;
transform-origin:center;
-webkit-transition:stroke-dashoffset 200ms cubic-bezier(0.4, 1, 0.75, 0.9);
transition:stroke-dashoffset 200ms cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-spinner .bp3-spinner-track{
stroke:rgba(92, 112, 128, 0.2); }
.bp3-spinner-animation{
-webkit-animation:pt-spinner-animation 500ms linear infinite;
animation:pt-spinner-animation 500ms linear infinite; }
.bp3-no-spin > .bp3-spinner-animation{
-webkit-animation:none;
animation:none; }
.bp3-dark .bp3-spinner .bp3-spinner-head{
stroke:#8a9ba8; }
.bp3-dark .bp3-spinner .bp3-spinner-track{
stroke:rgba(16, 22, 26, 0.5); }
.bp3-spinner.bp3-intent-primary .bp3-spinner-head{
stroke:#137cbd; }
.bp3-spinner.bp3-intent-success .bp3-spinner-head{
stroke:#0f9960; }
.bp3-spinner.bp3-intent-warning .bp3-spinner-head{
stroke:#d9822b; }
.bp3-spinner.bp3-intent-danger .bp3-spinner-head{
stroke:#db3737; }
.bp3-tabs.bp3-vertical{
display:-webkit-box;
display:-ms-flexbox;
display:flex; }
.bp3-tabs.bp3-vertical > .bp3-tab-list{
-webkit-box-align:start;
-ms-flex-align:start;
align-items:flex-start;
-webkit-box-orient:vertical;
-webkit-box-direction:normal;
-ms-flex-direction:column;
flex-direction:column; }
.bp3-tabs.bp3-vertical > .bp3-tab-list .bp3-tab{
border-radius:3px;
padding:0 10px;
width:100%; }
.bp3-tabs.bp3-vertical > .bp3-tab-list .bp3-tab[aria-selected="true"]{
background-color:rgba(19, 124, 189, 0.2);
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-tabs.bp3-vertical > .bp3-tab-list .bp3-tab-indicator-wrapper .bp3-tab-indicator{
background-color:rgba(19, 124, 189, 0.2);
border-radius:3px;
bottom:0;
height:auto;
left:0;
right:0;
top:0; }
.bp3-tabs.bp3-vertical > .bp3-tab-panel{
margin-top:0;
padding-left:20px; }
.bp3-tab-list{
-webkit-box-align:end;
-ms-flex-align:end;
align-items:flex-end;
border:none;
display:-webkit-box;
display:-ms-flexbox;
display:flex;
-webkit-box-flex:0;
-ms-flex:0 0 auto;
flex:0 0 auto;
list-style:none;
margin:0;
padding:0;
position:relative; }
.bp3-tab-list > *:not(:last-child){
margin-right:20px; }
.bp3-tab{
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
word-wrap:normal;
color:#182026;
cursor:pointer;
-webkit-box-flex:0;
-ms-flex:0 0 auto;
flex:0 0 auto;
font-size:14px;
line-height:30px;
max-width:100%;
position:relative;
vertical-align:top; }
.bp3-tab a{
color:inherit;
display:block;
text-decoration:none; }
.bp3-tab-indicator-wrapper ~ .bp3-tab{
background-color:transparent !important;
-webkit-box-shadow:none !important;
box-shadow:none !important; }
.bp3-tab[aria-disabled="true"]{
color:rgba(92, 112, 128, 0.6);
cursor:not-allowed; }
.bp3-tab[aria-selected="true"]{
border-radius:0;
-webkit-box-shadow:inset 0 -3px 0 #106ba3;
box-shadow:inset 0 -3px 0 #106ba3; }
.bp3-tab[aria-selected="true"], .bp3-tab:not([aria-disabled="true"]):hover{
color:#106ba3; }
.bp3-tab:focus{
-moz-outline-radius:0; }
.bp3-large > .bp3-tab{
font-size:16px;
line-height:40px; }
.bp3-tab-panel{
margin-top:20px; }
.bp3-tab-panel[aria-hidden="true"]{
display:none; }
.bp3-tab-indicator-wrapper{
left:0;
pointer-events:none;
position:absolute;
top:0;
-webkit-transform:translateX(0), translateY(0);
transform:translateX(0), translateY(0);
-webkit-transition:height, width, -webkit-transform;
transition:height, width, -webkit-transform;
transition:height, transform, width;
transition:height, transform, width, -webkit-transform;
-webkit-transition-duration:200ms;
transition-duration:200ms;
-webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-tab-indicator-wrapper .bp3-tab-indicator{
background-color:#106ba3;
bottom:0;
height:3px;
left:0;
position:absolute;
right:0; }
.bp3-tab-indicator-wrapper.bp3-no-animation{
-webkit-transition:none;
transition:none; }
.bp3-dark .bp3-tab{
color:#f5f8fa; }
.bp3-dark .bp3-tab[aria-disabled="true"]{
color:rgba(167, 182, 194, 0.6); }
.bp3-dark .bp3-tab[aria-selected="true"]{
-webkit-box-shadow:inset 0 -3px 0 #48aff0;
box-shadow:inset 0 -3px 0 #48aff0; }
.bp3-dark .bp3-tab[aria-selected="true"], .bp3-dark .bp3-tab:not([aria-disabled="true"]):hover{
color:#48aff0; }
.bp3-dark .bp3-tab-indicator{
background-color:#48aff0; }
.bp3-flex-expander{
-webkit-box-flex:1;
-ms-flex:1 1;
flex:1 1; }
.bp3-tag{
display:-webkit-inline-box;
display:-ms-inline-flexbox;
display:inline-flex;
-webkit-box-orient:horizontal;
-webkit-box-direction:normal;
-ms-flex-direction:row;
flex-direction:row;
-webkit-box-align:center;
-ms-flex-align:center;
align-items:center;
background-color:#5c7080;
border:none;
border-radius:3px;
-webkit-box-shadow:none;
box-shadow:none;
color:#f5f8fa;
font-size:12px;
line-height:16px;
max-width:100%;
min-height:20px;
min-width:20px;
padding:2px 6px;
position:relative; }
.bp3-tag.bp3-interactive{
cursor:pointer; }
.bp3-tag.bp3-interactive:hover{
background-color:rgba(92, 112, 128, 0.85); }
.bp3-tag.bp3-interactive.bp3-active, .bp3-tag.bp3-interactive:active{
background-color:rgba(92, 112, 128, 0.7); }
.bp3-tag > *{
-webkit-box-flex:0;
-ms-flex-positive:0;
flex-grow:0;
-ms-flex-negative:0;
flex-shrink:0; }
.bp3-tag > .bp3-fill{
-webkit-box-flex:1;
-ms-flex-positive:1;
flex-grow:1;
-ms-flex-negative:1;
flex-shrink:1; }
.bp3-tag::before,
.bp3-tag > *{
margin-right:4px; }
.bp3-tag:empty::before,
.bp3-tag > :last-child{
margin-right:0; }
.bp3-tag:focus{
outline:rgba(19, 124, 189, 0.6) auto 2px;
outline-offset:0;
-moz-outline-radius:6px; }
.bp3-tag.bp3-round{
border-radius:30px;
padding-left:8px;
padding-right:8px; }
.bp3-dark .bp3-tag{
background-color:#bfccd6;
color:#182026; }
.bp3-dark .bp3-tag.bp3-interactive{
cursor:pointer; }
.bp3-dark .bp3-tag.bp3-interactive:hover{
background-color:rgba(191, 204, 214, 0.85); }
.bp3-dark .bp3-tag.bp3-interactive.bp3-active, .bp3-dark .bp3-tag.bp3-interactive:active{
background-color:rgba(191, 204, 214, 0.7); }
.bp3-dark .bp3-tag > .bp3-icon, .bp3-dark .bp3-tag .bp3-icon-standard, .bp3-dark .bp3-tag .bp3-icon-large{
fill:currentColor; }
.bp3-tag > .bp3-icon, .bp3-tag .bp3-icon-standard, .bp3-tag .bp3-icon-large{
fill:#ffffff; }
.bp3-tag.bp3-large,
.bp3-large .bp3-tag{
font-size:14px;
line-height:20px;
min-height:30px;
min-width:30px;
padding:5px 10px; }
.bp3-tag.bp3-large::before,
.bp3-tag.bp3-large > *,
.bp3-large .bp3-tag::before,
.bp3-large .bp3-tag > *{
margin-right:7px; }
.bp3-tag.bp3-large:empty::before,
.bp3-tag.bp3-large > :last-child,
.bp3-large .bp3-tag:empty::before,
.bp3-large .bp3-tag > :last-child{
margin-right:0; }
.bp3-tag.bp3-large.bp3-round,
.bp3-large .bp3-tag.bp3-round{
padding-left:12px;
padding-right:12px; }
.bp3-tag.bp3-intent-primary{
background:#137cbd;
color:#ffffff; }
.bp3-tag.bp3-intent-primary.bp3-interactive{
cursor:pointer; }
.bp3-tag.bp3-intent-primary.bp3-interactive:hover{
background-color:rgba(19, 124, 189, 0.85); }
.bp3-tag.bp3-intent-primary.bp3-interactive.bp3-active, .bp3-tag.bp3-intent-primary.bp3-interactive:active{
background-color:rgba(19, 124, 189, 0.7); }
.bp3-tag.bp3-intent-success{
background:#0f9960;
color:#ffffff; }
.bp3-tag.bp3-intent-success.bp3-interactive{
cursor:pointer; }
.bp3-tag.bp3-intent-success.bp3-interactive:hover{
background-color:rgba(15, 153, 96, 0.85); }
.bp3-tag.bp3-intent-success.bp3-interactive.bp3-active, .bp3-tag.bp3-intent-success.bp3-interactive:active{
background-color:rgba(15, 153, 96, 0.7); }
.bp3-tag.bp3-intent-warning{
background:#d9822b;
color:#ffffff; }
.bp3-tag.bp3-intent-warning.bp3-interactive{
cursor:pointer; }
.bp3-tag.bp3-intent-warning.bp3-interactive:hover{
background-color:rgba(217, 130, 43, 0.85); }
.bp3-tag.bp3-intent-warning.bp3-interactive.bp3-active, .bp3-tag.bp3-intent-warning.bp3-interactive:active{
background-color:rgba(217, 130, 43, 0.7); }
.bp3-tag.bp3-intent-danger{
background:#db3737;
color:#ffffff; }
.bp3-tag.bp3-intent-danger.bp3-interactive{
cursor:pointer; }
.bp3-tag.bp3-intent-danger.bp3-interactive:hover{
background-color:rgba(219, 55, 55, 0.85); }
.bp3-tag.bp3-intent-danger.bp3-interactive.bp3-active, .bp3-tag.bp3-intent-danger.bp3-interactive:active{
background-color:rgba(219, 55, 55, 0.7); }
.bp3-tag.bp3-fill{
display:-webkit-box;
display:-ms-flexbox;
display:flex;
width:100%; }
.bp3-tag.bp3-minimal > .bp3-icon, .bp3-tag.bp3-minimal .bp3-icon-standard, .bp3-tag.bp3-minimal .bp3-icon-large{
fill:#5c7080; }
.bp3-tag.bp3-minimal:not([class*="bp3-intent-"]){
background-color:rgba(138, 155, 168, 0.2);
color:#182026; }
.bp3-tag.bp3-minimal:not([class*="bp3-intent-"]).bp3-interactive{
cursor:pointer; }
.bp3-tag.bp3-minimal:not([class*="bp3-intent-"]).bp3-interactive:hover{
background-color:rgba(92, 112, 128, 0.3); }
.bp3-tag.bp3-minimal:not([class*="bp3-intent-"]).bp3-interactive.bp3-active, .bp3-tag.bp3-minimal:not([class*="bp3-intent-"]).bp3-interactive:active{
background-color:rgba(92, 112, 128, 0.4); }
.bp3-dark .bp3-tag.bp3-minimal:not([class*="bp3-intent-"]){
color:#f5f8fa; }
.bp3-dark .bp3-tag.bp3-minimal:not([class*="bp3-intent-"]).bp3-interactive{
cursor:pointer; }
.bp3-dark .bp3-tag.bp3-minimal:not([class*="bp3-intent-"]).bp3-interactive:hover{
background-color:rgba(191, 204, 214, 0.3); }
.bp3-dark .bp3-tag.bp3-minimal:not([class*="bp3-intent-"]).bp3-interactive.bp3-active, .bp3-dark .bp3-tag.bp3-minimal:not([class*="bp3-intent-"]).bp3-interactive:active{
background-color:rgba(191, 204, 214, 0.4); }
.bp3-dark .bp3-tag.bp3-minimal:not([class*="bp3-intent-"]) > .bp3-icon, .bp3-dark .bp3-tag.bp3-minimal:not([class*="bp3-intent-"]) .bp3-icon-standard, .bp3-dark .bp3-tag.bp3-minimal:not([class*="bp3-intent-"]) .bp3-icon-large{
fill:#a7b6c2; }
.bp3-tag.bp3-minimal.bp3-intent-primary{
background-color:rgba(19, 124, 189, 0.15);
color:#106ba3; }
.bp3-tag.bp3-minimal.bp3-intent-primary.bp3-interactive{
cursor:pointer; }
.bp3-tag.bp3-minimal.bp3-intent-primary.bp3-interactive:hover{
background-color:rgba(19, 124, 189, 0.25); }
.bp3-tag.bp3-minimal.bp3-intent-primary.bp3-interactive.bp3-active, .bp3-tag.bp3-minimal.bp3-intent-primary.bp3-interactive:active{
background-color:rgba(19, 124, 189, 0.35); }
.bp3-tag.bp3-minimal.bp3-intent-primary > .bp3-icon, .bp3-tag.bp3-minimal.bp3-intent-primary .bp3-icon-standard, .bp3-tag.bp3-minimal.bp3-intent-primary .bp3-icon-large{
fill:#137cbd; }
.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-primary{
background-color:rgba(19, 124, 189, 0.25);
color:#48aff0; }
.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-primary.bp3-interactive{
cursor:pointer; }
.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-primary.bp3-interactive:hover{
background-color:rgba(19, 124, 189, 0.35); }
.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-primary.bp3-interactive.bp3-active, .bp3-dark .bp3-tag.bp3-minimal.bp3-intent-primary.bp3-interactive:active{
background-color:rgba(19, 124, 189, 0.45); }
.bp3-tag.bp3-minimal.bp3-intent-success{
background-color:rgba(15, 153, 96, 0.15);
color:#0d8050; }
.bp3-tag.bp3-minimal.bp3-intent-success.bp3-interactive{
cursor:pointer; }
.bp3-tag.bp3-minimal.bp3-intent-success.bp3-interactive:hover{
background-color:rgba(15, 153, 96, 0.25); }
.bp3-tag.bp3-minimal.bp3-intent-success.bp3-interactive.bp3-active, .bp3-tag.bp3-minimal.bp3-intent-success.bp3-interactive:active{
background-color:rgba(15, 153, 96, 0.35); }
.bp3-tag.bp3-minimal.bp3-intent-success > .bp3-icon, .bp3-tag.bp3-minimal.bp3-intent-success .bp3-icon-standard, .bp3-tag.bp3-minimal.bp3-intent-success .bp3-icon-large{
fill:#0f9960; }
.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-success{
background-color:rgba(15, 153, 96, 0.25);
color:#3dcc91; }
.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-success.bp3-interactive{
cursor:pointer; }
.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-success.bp3-interactive:hover{
background-color:rgba(15, 153, 96, 0.35); }
.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-success.bp3-interactive.bp3-active, .bp3-dark .bp3-tag.bp3-minimal.bp3-intent-success.bp3-interactive:active{
background-color:rgba(15, 153, 96, 0.45); }
.bp3-tag.bp3-minimal.bp3-intent-warning{
background-color:rgba(217, 130, 43, 0.15);
color:#bf7326; }
.bp3-tag.bp3-minimal.bp3-intent-warning.bp3-interactive{
cursor:pointer; }
.bp3-tag.bp3-minimal.bp3-intent-warning.bp3-interactive:hover{
background-color:rgba(217, 130, 43, 0.25); }
.bp3-tag.bp3-minimal.bp3-intent-warning.bp3-interactive.bp3-active, .bp3-tag.bp3-minimal.bp3-intent-warning.bp3-interactive:active{
background-color:rgba(217, 130, 43, 0.35); }
.bp3-tag.bp3-minimal.bp3-intent-warning > .bp3-icon, .bp3-tag.bp3-minimal.bp3-intent-warning .bp3-icon-standard, .bp3-tag.bp3-minimal.bp3-intent-warning .bp3-icon-large{
fill:#d9822b; }
.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-warning{
background-color:rgba(217, 130, 43, 0.25);
color:#ffb366; }
.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-warning.bp3-interactive{
cursor:pointer; }
.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-warning.bp3-interactive:hover{
background-color:rgba(217, 130, 43, 0.35); }
.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-warning.bp3-interactive.bp3-active, .bp3-dark .bp3-tag.bp3-minimal.bp3-intent-warning.bp3-interactive:active{
background-color:rgba(217, 130, 43, 0.45); }
.bp3-tag.bp3-minimal.bp3-intent-danger{
background-color:rgba(219, 55, 55, 0.15);
color:#c23030; }
.bp3-tag.bp3-minimal.bp3-intent-danger.bp3-interactive{
cursor:pointer; }
.bp3-tag.bp3-minimal.bp3-intent-danger.bp3-interactive:hover{
background-color:rgba(219, 55, 55, 0.25); }
.bp3-tag.bp3-minimal.bp3-intent-danger.bp3-interactive.bp3-active, .bp3-tag.bp3-minimal.bp3-intent-danger.bp3-interactive:active{
background-color:rgba(219, 55, 55, 0.35); }
.bp3-tag.bp3-minimal.bp3-intent-danger > .bp3-icon, .bp3-tag.bp3-minimal.bp3-intent-danger .bp3-icon-standard, .bp3-tag.bp3-minimal.bp3-intent-danger .bp3-icon-large{
fill:#db3737; }
.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-danger{
background-color:rgba(219, 55, 55, 0.25);
color:#ff7373; }
.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-danger.bp3-interactive{
cursor:pointer; }
.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-danger.bp3-interactive:hover{
background-color:rgba(219, 55, 55, 0.35); }
.bp3-dark .bp3-tag.bp3-minimal.bp3-intent-danger.bp3-interactive.bp3-active, .bp3-dark .bp3-tag.bp3-minimal.bp3-intent-danger.bp3-interactive:active{
background-color:rgba(219, 55, 55, 0.45); }
.bp3-tag-remove{
background:none;
border:none;
color:inherit;
cursor:pointer;
display:-webkit-box;
display:-ms-flexbox;
display:flex;
margin-bottom:-2px;
margin-right:-6px !important;
margin-top:-2px;
opacity:0.5;
padding:2px;
padding-left:0; }
.bp3-tag-remove:hover{
background:none;
opacity:0.8;
text-decoration:none; }
.bp3-tag-remove:active{
opacity:1; }
.bp3-tag-remove:empty::before{
font-family:"Icons16", sans-serif;
font-size:16px;
font-style:normal;
font-weight:400;
line-height:1;
-moz-osx-font-smoothing:grayscale;
-webkit-font-smoothing:antialiased;
content:""; }
.bp3-large .bp3-tag-remove{
margin-right:-10px !important;
padding:0 5px 0 0; }
.bp3-large .bp3-tag-remove:empty::before{
font-family:"Icons20", sans-serif;
font-size:20px;
font-style:normal;
font-weight:400;
line-height:1; }
.bp3-tag-input{
display:-webkit-box;
display:-ms-flexbox;
display:flex;
-webkit-box-orient:horizontal;
-webkit-box-direction:normal;
-ms-flex-direction:row;
flex-direction:row;
-webkit-box-align:start;
-ms-flex-align:start;
align-items:flex-start;
cursor:text;
height:auto;
line-height:inherit;
min-height:30px;
padding-left:5px;
padding-right:0; }
.bp3-tag-input > *{
-webkit-box-flex:0;
-ms-flex-positive:0;
flex-grow:0;
-ms-flex-negative:0;
flex-shrink:0; }
.bp3-tag-input > .bp3-tag-input-values{
-webkit-box-flex:1;
-ms-flex-positive:1;
flex-grow:1;
-ms-flex-negative:1;
flex-shrink:1; }
.bp3-tag-input .bp3-tag-input-icon{
color:#5c7080;
margin-left:2px;
margin-right:7px;
margin-top:7px; }
.bp3-tag-input .bp3-tag-input-values{
display:-webkit-box;
display:-ms-flexbox;
display:flex;
-webkit-box-orient:horizontal;
-webkit-box-direction:normal;
-ms-flex-direction:row;
flex-direction:row;
-webkit-box-align:center;
-ms-flex-align:center;
align-items:center;
-ms-flex-item-align:stretch;
align-self:stretch;
-ms-flex-wrap:wrap;
flex-wrap:wrap;
margin-right:7px;
margin-top:5px;
min-width:0; }
.bp3-tag-input .bp3-tag-input-values > *{
-webkit-box-flex:0;
-ms-flex-positive:0;
flex-grow:0;
-ms-flex-negative:0;
flex-shrink:0; }
.bp3-tag-input .bp3-tag-input-values > .bp3-fill{
-webkit-box-flex:1;
-ms-flex-positive:1;
flex-grow:1;
-ms-flex-negative:1;
flex-shrink:1; }
.bp3-tag-input .bp3-tag-input-values::before,
.bp3-tag-input .bp3-tag-input-values > *{
margin-right:5px; }
.bp3-tag-input .bp3-tag-input-values:empty::before,
.bp3-tag-input .bp3-tag-input-values > :last-child{
margin-right:0; }
.bp3-tag-input .bp3-tag-input-values:first-child .bp3-input-ghost:first-child{
padding-left:5px; }
.bp3-tag-input .bp3-tag-input-values > *{
margin-bottom:5px; }
.bp3-tag-input .bp3-tag{
overflow-wrap:break-word; }
.bp3-tag-input .bp3-tag.bp3-active{
outline:rgba(19, 124, 189, 0.6) auto 2px;
outline-offset:0;
-moz-outline-radius:6px; }
.bp3-tag-input .bp3-input-ghost{
-webkit-box-flex:1;
-ms-flex:1 1 auto;
flex:1 1 auto;
line-height:20px;
width:80px; }
.bp3-tag-input .bp3-input-ghost:disabled, .bp3-tag-input .bp3-input-ghost.bp3-disabled{
cursor:not-allowed; }
.bp3-tag-input .bp3-button,
.bp3-tag-input .bp3-spinner{
margin:3px;
margin-left:0; }
.bp3-tag-input .bp3-button{
min-height:24px;
min-width:24px;
padding:0 7px; }
.bp3-tag-input.bp3-large{
height:auto;
min-height:40px; }
.bp3-tag-input.bp3-large::before,
.bp3-tag-input.bp3-large > *{
margin-right:10px; }
.bp3-tag-input.bp3-large:empty::before,
.bp3-tag-input.bp3-large > :last-child{
margin-right:0; }
.bp3-tag-input.bp3-large .bp3-tag-input-icon{
margin-left:5px;
margin-top:10px; }
.bp3-tag-input.bp3-large .bp3-input-ghost{
line-height:30px; }
.bp3-tag-input.bp3-large .bp3-button{
min-height:30px;
min-width:30px;
padding:5px 10px;
margin:5px;
margin-left:0; }
.bp3-tag-input.bp3-large .bp3-spinner{
margin:8px;
margin-left:0; }
.bp3-tag-input.bp3-active{
background-color:#ffffff;
-webkit-box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-tag-input.bp3-active.bp3-intent-primary{
-webkit-box-shadow:0 0 0 1px #106ba3, 0 0 0 3px rgba(16, 107, 163, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px #106ba3, 0 0 0 3px rgba(16, 107, 163, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-tag-input.bp3-active.bp3-intent-success{
-webkit-box-shadow:0 0 0 1px #0d8050, 0 0 0 3px rgba(13, 128, 80, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px #0d8050, 0 0 0 3px rgba(13, 128, 80, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-tag-input.bp3-active.bp3-intent-warning{
-webkit-box-shadow:0 0 0 1px #bf7326, 0 0 0 3px rgba(191, 115, 38, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px #bf7326, 0 0 0 3px rgba(191, 115, 38, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-tag-input.bp3-active.bp3-intent-danger{
-webkit-box-shadow:0 0 0 1px #c23030, 0 0 0 3px rgba(194, 48, 48, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px #c23030, 0 0 0 3px rgba(194, 48, 48, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
.bp3-dark .bp3-tag-input .bp3-tag-input-icon, .bp3-tag-input.bp3-dark .bp3-tag-input-icon{
color:#a7b6c2; }
.bp3-dark .bp3-tag-input .bp3-input-ghost, .bp3-tag-input.bp3-dark .bp3-input-ghost{
color:#f5f8fa; }
.bp3-dark .bp3-tag-input .bp3-input-ghost::-webkit-input-placeholder, .bp3-tag-input.bp3-dark .bp3-input-ghost::-webkit-input-placeholder{
color:rgba(167, 182, 194, 0.6); }
.bp3-dark .bp3-tag-input .bp3-input-ghost::-moz-placeholder, .bp3-tag-input.bp3-dark .bp3-input-ghost::-moz-placeholder{
color:rgba(167, 182, 194, 0.6); }
.bp3-dark .bp3-tag-input .bp3-input-ghost:-ms-input-placeholder, .bp3-tag-input.bp3-dark .bp3-input-ghost:-ms-input-placeholder{
color:rgba(167, 182, 194, 0.6); }
.bp3-dark .bp3-tag-input .bp3-input-ghost::-ms-input-placeholder, .bp3-tag-input.bp3-dark .bp3-input-ghost::-ms-input-placeholder{
color:rgba(167, 182, 194, 0.6); }
.bp3-dark .bp3-tag-input .bp3-input-ghost::placeholder, .bp3-tag-input.bp3-dark .bp3-input-ghost::placeholder{
color:rgba(167, 182, 194, 0.6); }
.bp3-dark .bp3-tag-input.bp3-active, .bp3-tag-input.bp3-dark.bp3-active{
background-color:rgba(16, 22, 26, 0.3);
-webkit-box-shadow:0 0 0 1px #137cbd, 0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px #137cbd, 0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-tag-input.bp3-active.bp3-intent-primary, .bp3-tag-input.bp3-dark.bp3-active.bp3-intent-primary{
-webkit-box-shadow:0 0 0 1px #106ba3, 0 0 0 3px rgba(16, 107, 163, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px #106ba3, 0 0 0 3px rgba(16, 107, 163, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-tag-input.bp3-active.bp3-intent-success, .bp3-tag-input.bp3-dark.bp3-active.bp3-intent-success{
-webkit-box-shadow:0 0 0 1px #0d8050, 0 0 0 3px rgba(13, 128, 80, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px #0d8050, 0 0 0 3px rgba(13, 128, 80, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-tag-input.bp3-active.bp3-intent-warning, .bp3-tag-input.bp3-dark.bp3-active.bp3-intent-warning{
-webkit-box-shadow:0 0 0 1px #bf7326, 0 0 0 3px rgba(191, 115, 38, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px #bf7326, 0 0 0 3px rgba(191, 115, 38, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
.bp3-dark .bp3-tag-input.bp3-active.bp3-intent-danger, .bp3-tag-input.bp3-dark.bp3-active.bp3-intent-danger{
-webkit-box-shadow:0 0 0 1px #c23030, 0 0 0 3px rgba(194, 48, 48, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px #c23030, 0 0 0 3px rgba(194, 48, 48, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
.bp3-input-ghost{
background:none;
border:none;
-webkit-box-shadow:none;
box-shadow:none;
padding:0; }
.bp3-input-ghost::-webkit-input-placeholder{
color:rgba(92, 112, 128, 0.6);
opacity:1; }
.bp3-input-ghost::-moz-placeholder{
color:rgba(92, 112, 128, 0.6);
opacity:1; }
.bp3-input-ghost:-ms-input-placeholder{
color:rgba(92, 112, 128, 0.6);
opacity:1; }
.bp3-input-ghost::-ms-input-placeholder{
color:rgba(92, 112, 128, 0.6);
opacity:1; }
.bp3-input-ghost::placeholder{
color:rgba(92, 112, 128, 0.6);
opacity:1; }
.bp3-input-ghost:focus{
outline:none !important; }
.bp3-toast{
-webkit-box-align:start;
-ms-flex-align:start;
align-items:flex-start;
background-color:#ffffff;
border-radius:3px;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2);
display:-webkit-box;
display:-ms-flexbox;
display:flex;
margin:20px 0 0;
max-width:500px;
min-width:300px;
pointer-events:all;
position:relative !important; }
.bp3-toast.bp3-toast-enter, .bp3-toast.bp3-toast-appear{
-webkit-transform:translateY(-40px);
transform:translateY(-40px); }
.bp3-toast.bp3-toast-enter-active, .bp3-toast.bp3-toast-appear-active{
-webkit-transform:translateY(0);
transform:translateY(0);
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:300ms;
transition-duration:300ms;
-webkit-transition-property:-webkit-transform;
transition-property:-webkit-transform;
transition-property:transform;
transition-property:transform, -webkit-transform;
-webkit-transition-timing-function:cubic-bezier(0.54, 1.12, 0.38, 1.11);
transition-timing-function:cubic-bezier(0.54, 1.12, 0.38, 1.11); }
.bp3-toast.bp3-toast-enter ~ .bp3-toast, .bp3-toast.bp3-toast-appear ~ .bp3-toast{
-webkit-transform:translateY(-40px);
transform:translateY(-40px); }
.bp3-toast.bp3-toast-enter-active ~ .bp3-toast, .bp3-toast.bp3-toast-appear-active ~ .bp3-toast{
-webkit-transform:translateY(0);
transform:translateY(0);
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:300ms;
transition-duration:300ms;
-webkit-transition-property:-webkit-transform;
transition-property:-webkit-transform;
transition-property:transform;
transition-property:transform, -webkit-transform;
-webkit-transition-timing-function:cubic-bezier(0.54, 1.12, 0.38, 1.11);
transition-timing-function:cubic-bezier(0.54, 1.12, 0.38, 1.11); }
.bp3-toast.bp3-toast-exit{
opacity:1;
-webkit-filter:blur(0);
filter:blur(0); }
.bp3-toast.bp3-toast-exit-active{
opacity:0;
-webkit-filter:blur(10px);
filter:blur(10px);
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:300ms;
transition-duration:300ms;
-webkit-transition-property:opacity, -webkit-filter;
transition-property:opacity, -webkit-filter;
transition-property:opacity, filter;
transition-property:opacity, filter, -webkit-filter;
-webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-toast.bp3-toast-exit ~ .bp3-toast{
-webkit-transform:translateY(0);
transform:translateY(0); }
.bp3-toast.bp3-toast-exit-active ~ .bp3-toast{
-webkit-transform:translateY(-40px);
transform:translateY(-40px);
-webkit-transition-delay:50ms;
transition-delay:50ms;
-webkit-transition-duration:100ms;
transition-duration:100ms;
-webkit-transition-property:-webkit-transform;
transition-property:-webkit-transform;
transition-property:transform;
transition-property:transform, -webkit-transform;
-webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-toast .bp3-button-group{
-webkit-box-flex:0;
-ms-flex:0 0 auto;
flex:0 0 auto;
padding:5px;
padding-left:0; }
.bp3-toast > .bp3-icon{
color:#5c7080;
margin:12px;
margin-right:0; }
.bp3-toast.bp3-dark,
.bp3-dark .bp3-toast{
background-color:#394b59;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4); }
.bp3-toast.bp3-dark > .bp3-icon,
.bp3-dark .bp3-toast > .bp3-icon{
color:#a7b6c2; }
.bp3-toast[class*="bp3-intent-"] a{
color:rgba(255, 255, 255, 0.7); }
.bp3-toast[class*="bp3-intent-"] a:hover{
color:#ffffff; }
.bp3-toast[class*="bp3-intent-"] > .bp3-icon{
color:#ffffff; }
.bp3-toast[class*="bp3-intent-"] .bp3-button, .bp3-toast[class*="bp3-intent-"] .bp3-button::before,
.bp3-toast[class*="bp3-intent-"] .bp3-button .bp3-icon, .bp3-toast[class*="bp3-intent-"] .bp3-button:active{
color:rgba(255, 255, 255, 0.7) !important; }
.bp3-toast[class*="bp3-intent-"] .bp3-button:focus{
outline-color:rgba(255, 255, 255, 0.5); }
.bp3-toast[class*="bp3-intent-"] .bp3-button:hover{
background-color:rgba(255, 255, 255, 0.15) !important;
color:#ffffff !important; }
.bp3-toast[class*="bp3-intent-"] .bp3-button:active{
background-color:rgba(255, 255, 255, 0.3) !important;
color:#ffffff !important; }
.bp3-toast[class*="bp3-intent-"] .bp3-button::after{
background:rgba(255, 255, 255, 0.3) !important; }
.bp3-toast.bp3-intent-primary{
background-color:#137cbd;
color:#ffffff; }
.bp3-toast.bp3-intent-success{
background-color:#0f9960;
color:#ffffff; }
.bp3-toast.bp3-intent-warning{
background-color:#d9822b;
color:#ffffff; }
.bp3-toast.bp3-intent-danger{
background-color:#db3737;
color:#ffffff; }
.bp3-toast-message{
-webkit-box-flex:1;
-ms-flex:1 1 auto;
flex:1 1 auto;
padding:11px;
word-break:break-word; }
.bp3-toast-container{
-webkit-box-align:center;
-ms-flex-align:center;
align-items:center;
display:-webkit-box !important;
display:-ms-flexbox !important;
display:flex !important;
-webkit-box-orient:vertical;
-webkit-box-direction:normal;
-ms-flex-direction:column;
flex-direction:column;
left:0;
overflow:hidden;
padding:0 20px 20px;
pointer-events:none;
right:0;
z-index:40; }
.bp3-toast-container.bp3-toast-container-in-portal{
position:fixed; }
.bp3-toast-container.bp3-toast-container-inline{
position:absolute; }
.bp3-toast-container.bp3-toast-container-top{
top:0; }
.bp3-toast-container.bp3-toast-container-bottom{
bottom:0;
-webkit-box-orient:vertical;
-webkit-box-direction:reverse;
-ms-flex-direction:column-reverse;
flex-direction:column-reverse;
top:auto; }
.bp3-toast-container.bp3-toast-container-left{
-webkit-box-align:start;
-ms-flex-align:start;
align-items:flex-start; }
.bp3-toast-container.bp3-toast-container-right{
-webkit-box-align:end;
-ms-flex-align:end;
align-items:flex-end; }
.bp3-toast-container-bottom .bp3-toast.bp3-toast-enter:not(.bp3-toast-enter-active),
.bp3-toast-container-bottom .bp3-toast.bp3-toast-enter:not(.bp3-toast-enter-active) ~ .bp3-toast, .bp3-toast-container-bottom .bp3-toast.bp3-toast-appear:not(.bp3-toast-appear-active),
.bp3-toast-container-bottom .bp3-toast.bp3-toast-appear:not(.bp3-toast-appear-active) ~ .bp3-toast,
.bp3-toast-container-bottom .bp3-toast.bp3-toast-exit-active ~ .bp3-toast,
.bp3-toast-container-bottom .bp3-toast.bp3-toast-leave-active ~ .bp3-toast{
-webkit-transform:translateY(60px);
transform:translateY(60px); }
.bp3-tooltip{
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2);
-webkit-transform:scale(1);
transform:scale(1); }
.bp3-tooltip .bp3-popover-arrow{
height:22px;
position:absolute;
width:22px; }
.bp3-tooltip .bp3-popover-arrow::before{
height:14px;
margin:4px;
width:14px; }
.bp3-tether-element-attached-bottom.bp3-tether-target-attached-top > .bp3-tooltip{
margin-bottom:11px;
margin-top:-11px; }
.bp3-tether-element-attached-bottom.bp3-tether-target-attached-top > .bp3-tooltip > .bp3-popover-arrow{
bottom:-8px; }
.bp3-tether-element-attached-bottom.bp3-tether-target-attached-top > .bp3-tooltip > .bp3-popover-arrow svg{
-webkit-transform:rotate(-90deg);
transform:rotate(-90deg); }
.bp3-tether-element-attached-left.bp3-tether-target-attached-right > .bp3-tooltip{
margin-left:11px; }
.bp3-tether-element-attached-left.bp3-tether-target-attached-right > .bp3-tooltip > .bp3-popover-arrow{
left:-8px; }
.bp3-tether-element-attached-left.bp3-tether-target-attached-right > .bp3-tooltip > .bp3-popover-arrow svg{
-webkit-transform:rotate(0);
transform:rotate(0); }
.bp3-tether-element-attached-top.bp3-tether-target-attached-bottom > .bp3-tooltip{
margin-top:11px; }
.bp3-tether-element-attached-top.bp3-tether-target-attached-bottom > .bp3-tooltip > .bp3-popover-arrow{
top:-8px; }
.bp3-tether-element-attached-top.bp3-tether-target-attached-bottom > .bp3-tooltip > .bp3-popover-arrow svg{
-webkit-transform:rotate(90deg);
transform:rotate(90deg); }
.bp3-tether-element-attached-right.bp3-tether-target-attached-left > .bp3-tooltip{
margin-left:-11px;
margin-right:11px; }
.bp3-tether-element-attached-right.bp3-tether-target-attached-left > .bp3-tooltip > .bp3-popover-arrow{
right:-8px; }
.bp3-tether-element-attached-right.bp3-tether-target-attached-left > .bp3-tooltip > .bp3-popover-arrow svg{
-webkit-transform:rotate(180deg);
transform:rotate(180deg); }
.bp3-tether-element-attached-middle > .bp3-tooltip > .bp3-popover-arrow{
top:50%;
-webkit-transform:translateY(-50%);
transform:translateY(-50%); }
.bp3-tether-element-attached-center > .bp3-tooltip > .bp3-popover-arrow{
right:50%;
-webkit-transform:translateX(50%);
transform:translateX(50%); }
.bp3-tether-element-attached-top.bp3-tether-target-attached-top > .bp3-tooltip > .bp3-popover-arrow{
top:-0.22183px; }
.bp3-tether-element-attached-right.bp3-tether-target-attached-right > .bp3-tooltip > .bp3-popover-arrow{
right:-0.22183px; }
.bp3-tether-element-attached-left.bp3-tether-target-attached-left > .bp3-tooltip > .bp3-popover-arrow{
left:-0.22183px; }
.bp3-tether-element-attached-bottom.bp3-tether-target-attached-bottom > .bp3-tooltip > .bp3-popover-arrow{
bottom:-0.22183px; }
.bp3-tether-element-attached-top.bp3-tether-element-attached-left > .bp3-tooltip{
-webkit-transform-origin:top left;
transform-origin:top left; }
.bp3-tether-element-attached-top.bp3-tether-element-attached-center > .bp3-tooltip{
-webkit-transform-origin:top center;
transform-origin:top center; }
.bp3-tether-element-attached-top.bp3-tether-element-attached-right > .bp3-tooltip{
-webkit-transform-origin:top right;
transform-origin:top right; }
.bp3-tether-element-attached-middle.bp3-tether-element-attached-left > .bp3-tooltip{
-webkit-transform-origin:center left;
transform-origin:center left; }
.bp3-tether-element-attached-middle.bp3-tether-element-attached-center > .bp3-tooltip{
-webkit-transform-origin:center center;
transform-origin:center center; }
.bp3-tether-element-attached-middle.bp3-tether-element-attached-right > .bp3-tooltip{
-webkit-transform-origin:center right;
transform-origin:center right; }
.bp3-tether-element-attached-bottom.bp3-tether-element-attached-left > .bp3-tooltip{
-webkit-transform-origin:bottom left;
transform-origin:bottom left; }
.bp3-tether-element-attached-bottom.bp3-tether-element-attached-center > .bp3-tooltip{
-webkit-transform-origin:bottom center;
transform-origin:bottom center; }
.bp3-tether-element-attached-bottom.bp3-tether-element-attached-right > .bp3-tooltip{
-webkit-transform-origin:bottom right;
transform-origin:bottom right; }
.bp3-tooltip .bp3-popover-content{
background:#394b59;
color:#f5f8fa; }
.bp3-tooltip .bp3-popover-arrow::before{
-webkit-box-shadow:1px 1px 6px rgba(16, 22, 26, 0.2);
box-shadow:1px 1px 6px rgba(16, 22, 26, 0.2); }
.bp3-tooltip .bp3-popover-arrow-border{
fill:#10161a;
fill-opacity:0.1; }
.bp3-tooltip .bp3-popover-arrow-fill{
fill:#394b59; }
.bp3-popover-enter > .bp3-tooltip, .bp3-popover-appear > .bp3-tooltip{
-webkit-transform:scale(0.8);
transform:scale(0.8); }
.bp3-popover-enter-active > .bp3-tooltip, .bp3-popover-appear-active > .bp3-tooltip{
-webkit-transform:scale(1);
transform:scale(1);
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:100ms;
transition-duration:100ms;
-webkit-transition-property:-webkit-transform;
transition-property:-webkit-transform;
transition-property:transform;
transition-property:transform, -webkit-transform;
-webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-popover-exit > .bp3-tooltip{
-webkit-transform:scale(1);
transform:scale(1); }
.bp3-popover-exit-active > .bp3-tooltip{
-webkit-transform:scale(0.8);
transform:scale(0.8);
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:100ms;
transition-duration:100ms;
-webkit-transition-property:-webkit-transform;
transition-property:-webkit-transform;
transition-property:transform;
transition-property:transform, -webkit-transform;
-webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-tooltip .bp3-popover-content{
padding:10px 12px; }
.bp3-tooltip.bp3-dark,
.bp3-dark .bp3-tooltip{
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4); }
.bp3-tooltip.bp3-dark .bp3-popover-content,
.bp3-dark .bp3-tooltip .bp3-popover-content{
background:#e1e8ed;
color:#394b59; }
.bp3-tooltip.bp3-dark .bp3-popover-arrow::before,
.bp3-dark .bp3-tooltip .bp3-popover-arrow::before{
-webkit-box-shadow:1px 1px 6px rgba(16, 22, 26, 0.4);
box-shadow:1px 1px 6px rgba(16, 22, 26, 0.4); }
.bp3-tooltip.bp3-dark .bp3-popover-arrow-border,
.bp3-dark .bp3-tooltip .bp3-popover-arrow-border{
fill:#10161a;
fill-opacity:0.2; }
.bp3-tooltip.bp3-dark .bp3-popover-arrow-fill,
.bp3-dark .bp3-tooltip .bp3-popover-arrow-fill{
fill:#e1e8ed; }
.bp3-tooltip.bp3-intent-primary .bp3-popover-content{
background:#137cbd;
color:#ffffff; }
.bp3-tooltip.bp3-intent-primary .bp3-popover-arrow-fill{
fill:#137cbd; }
.bp3-tooltip.bp3-intent-success .bp3-popover-content{
background:#0f9960;
color:#ffffff; }
.bp3-tooltip.bp3-intent-success .bp3-popover-arrow-fill{
fill:#0f9960; }
.bp3-tooltip.bp3-intent-warning .bp3-popover-content{
background:#d9822b;
color:#ffffff; }
.bp3-tooltip.bp3-intent-warning .bp3-popover-arrow-fill{
fill:#d9822b; }
.bp3-tooltip.bp3-intent-danger .bp3-popover-content{
background:#db3737;
color:#ffffff; }
.bp3-tooltip.bp3-intent-danger .bp3-popover-arrow-fill{
fill:#db3737; }
.bp3-tooltip-indicator{
border-bottom:dotted 1px;
cursor:help; }
.bp3-tree .bp3-icon, .bp3-tree .bp3-icon-standard, .bp3-tree .bp3-icon-large{
color:#5c7080; }
.bp3-tree .bp3-icon.bp3-intent-primary, .bp3-tree .bp3-icon-standard.bp3-intent-primary, .bp3-tree .bp3-icon-large.bp3-intent-primary{
color:#137cbd; }
.bp3-tree .bp3-icon.bp3-intent-success, .bp3-tree .bp3-icon-standard.bp3-intent-success, .bp3-tree .bp3-icon-large.bp3-intent-success{
color:#0f9960; }
.bp3-tree .bp3-icon.bp3-intent-warning, .bp3-tree .bp3-icon-standard.bp3-intent-warning, .bp3-tree .bp3-icon-large.bp3-intent-warning{
color:#d9822b; }
.bp3-tree .bp3-icon.bp3-intent-danger, .bp3-tree .bp3-icon-standard.bp3-intent-danger, .bp3-tree .bp3-icon-large.bp3-intent-danger{
color:#db3737; }
.bp3-tree-node-list{
list-style:none;
margin:0;
padding-left:0; }
.bp3-tree-root{
background-color:transparent;
cursor:default;
padding-left:0;
position:relative; }
.bp3-tree-node-content-0{
padding-left:0px; }
.bp3-tree-node-content-1{
padding-left:23px; }
.bp3-tree-node-content-2{
padding-left:46px; }
.bp3-tree-node-content-3{
padding-left:69px; }
.bp3-tree-node-content-4{
padding-left:92px; }
.bp3-tree-node-content-5{
padding-left:115px; }
.bp3-tree-node-content-6{
padding-left:138px; }
.bp3-tree-node-content-7{
padding-left:161px; }
.bp3-tree-node-content-8{
padding-left:184px; }
.bp3-tree-node-content-9{
padding-left:207px; }
.bp3-tree-node-content-10{
padding-left:230px; }
.bp3-tree-node-content-11{
padding-left:253px; }
.bp3-tree-node-content-12{
padding-left:276px; }
.bp3-tree-node-content-13{
padding-left:299px; }
.bp3-tree-node-content-14{
padding-left:322px; }
.bp3-tree-node-content-15{
padding-left:345px; }
.bp3-tree-node-content-16{
padding-left:368px; }
.bp3-tree-node-content-17{
padding-left:391px; }
.bp3-tree-node-content-18{
padding-left:414px; }
.bp3-tree-node-content-19{
padding-left:437px; }
.bp3-tree-node-content-20{
padding-left:460px; }
.bp3-tree-node-content{
-webkit-box-align:center;
-ms-flex-align:center;
align-items:center;
display:-webkit-box;
display:-ms-flexbox;
display:flex;
height:30px;
padding-right:5px;
width:100%; }
.bp3-tree-node-content:hover{
background-color:rgba(191, 204, 214, 0.4); }
.bp3-tree-node-caret,
.bp3-tree-node-caret-none{
min-width:30px; }
.bp3-tree-node-caret{
color:#5c7080;
cursor:pointer;
padding:7px;
-webkit-transform:rotate(0deg);
transform:rotate(0deg);
-webkit-transition:-webkit-transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9);
transition:-webkit-transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9);
transition:transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9);
transition:transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9), -webkit-transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-tree-node-caret:hover{
color:#182026; }
.bp3-dark .bp3-tree-node-caret{
color:#a7b6c2; }
.bp3-dark .bp3-tree-node-caret:hover{
color:#f5f8fa; }
.bp3-tree-node-caret.bp3-tree-node-caret-open{
-webkit-transform:rotate(90deg);
transform:rotate(90deg); }
.bp3-tree-node-caret.bp3-icon-standard::before{
content:""; }
.bp3-tree-node-icon{
margin-right:7px;
position:relative; }
.bp3-tree-node-label{
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
word-wrap:normal;
-webkit-box-flex:1;
-ms-flex:1 1 auto;
flex:1 1 auto;
position:relative;
-webkit-user-select:none;
-moz-user-select:none;
-ms-user-select:none;
user-select:none; }
.bp3-tree-node-label span{
display:inline; }
.bp3-tree-node-secondary-label{
padding:0 5px;
-webkit-user-select:none;
-moz-user-select:none;
-ms-user-select:none;
user-select:none; }
.bp3-tree-node-secondary-label .bp3-popover-wrapper,
.bp3-tree-node-secondary-label .bp3-popover-target{
-webkit-box-align:center;
-ms-flex-align:center;
align-items:center;
display:-webkit-box;
display:-ms-flexbox;
display:flex; }
.bp3-tree-node.bp3-disabled .bp3-tree-node-content{
background-color:inherit;
color:rgba(92, 112, 128, 0.6);
cursor:not-allowed; }
.bp3-tree-node.bp3-disabled .bp3-tree-node-caret,
.bp3-tree-node.bp3-disabled .bp3-tree-node-icon{
color:rgba(92, 112, 128, 0.6);
cursor:not-allowed; }
.bp3-tree-node.bp3-tree-node-selected > .bp3-tree-node-content{
background-color:#137cbd; }
.bp3-tree-node.bp3-tree-node-selected > .bp3-tree-node-content,
.bp3-tree-node.bp3-tree-node-selected > .bp3-tree-node-content .bp3-icon, .bp3-tree-node.bp3-tree-node-selected > .bp3-tree-node-content .bp3-icon-standard, .bp3-tree-node.bp3-tree-node-selected > .bp3-tree-node-content .bp3-icon-large{
color:#ffffff; }
.bp3-tree-node.bp3-tree-node-selected > .bp3-tree-node-content .bp3-tree-node-caret::before{
color:rgba(255, 255, 255, 0.7); }
.bp3-tree-node.bp3-tree-node-selected > .bp3-tree-node-content .bp3-tree-node-caret:hover::before{
color:#ffffff; }
.bp3-dark .bp3-tree-node-content:hover{
background-color:rgba(92, 112, 128, 0.3); }
.bp3-dark .bp3-tree .bp3-icon, .bp3-dark .bp3-tree .bp3-icon-standard, .bp3-dark .bp3-tree .bp3-icon-large{
color:#a7b6c2; }
.bp3-dark .bp3-tree .bp3-icon.bp3-intent-primary, .bp3-dark .bp3-tree .bp3-icon-standard.bp3-intent-primary, .bp3-dark .bp3-tree .bp3-icon-large.bp3-intent-primary{
color:#137cbd; }
.bp3-dark .bp3-tree .bp3-icon.bp3-intent-success, .bp3-dark .bp3-tree .bp3-icon-standard.bp3-intent-success, .bp3-dark .bp3-tree .bp3-icon-large.bp3-intent-success{
color:#0f9960; }
.bp3-dark .bp3-tree .bp3-icon.bp3-intent-warning, .bp3-dark .bp3-tree .bp3-icon-standard.bp3-intent-warning, .bp3-dark .bp3-tree .bp3-icon-large.bp3-intent-warning{
color:#d9822b; }
.bp3-dark .bp3-tree .bp3-icon.bp3-intent-danger, .bp3-dark .bp3-tree .bp3-icon-standard.bp3-intent-danger, .bp3-dark .bp3-tree .bp3-icon-large.bp3-intent-danger{
color:#db3737; }
.bp3-dark .bp3-tree-node.bp3-tree-node-selected > .bp3-tree-node-content{
background-color:#137cbd; }
.bp3-omnibar{
-webkit-filter:blur(0);
filter:blur(0);
opacity:1;
background-color:#ffffff;
border-radius:3px;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 4px 8px rgba(16, 22, 26, 0.2), 0 18px 46px 6px rgba(16, 22, 26, 0.2);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 4px 8px rgba(16, 22, 26, 0.2), 0 18px 46px 6px rgba(16, 22, 26, 0.2);
left:calc(50% - 250px);
top:20vh;
width:500px;
z-index:21; }
.bp3-omnibar.bp3-overlay-enter, .bp3-omnibar.bp3-overlay-appear{
-webkit-filter:blur(20px);
filter:blur(20px);
opacity:0.2; }
.bp3-omnibar.bp3-overlay-enter-active, .bp3-omnibar.bp3-overlay-appear-active{
-webkit-filter:blur(0);
filter:blur(0);
opacity:1;
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:200ms;
transition-duration:200ms;
-webkit-transition-property:opacity, -webkit-filter;
transition-property:opacity, -webkit-filter;
transition-property:filter, opacity;
transition-property:filter, opacity, -webkit-filter;
-webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-omnibar.bp3-overlay-exit{
-webkit-filter:blur(0);
filter:blur(0);
opacity:1; }
.bp3-omnibar.bp3-overlay-exit-active{
-webkit-filter:blur(20px);
filter:blur(20px);
opacity:0.2;
-webkit-transition-delay:0;
transition-delay:0;
-webkit-transition-duration:200ms;
transition-duration:200ms;
-webkit-transition-property:opacity, -webkit-filter;
transition-property:opacity, -webkit-filter;
transition-property:filter, opacity;
transition-property:filter, opacity, -webkit-filter;
-webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9); }
.bp3-omnibar .bp3-input{
background-color:transparent;
border-radius:0; }
.bp3-omnibar .bp3-input, .bp3-omnibar .bp3-input:focus{
-webkit-box-shadow:none;
box-shadow:none; }
.bp3-omnibar .bp3-menu{
background-color:transparent;
border-radius:0;
-webkit-box-shadow:inset 0 1px 0 rgba(16, 22, 26, 0.15);
box-shadow:inset 0 1px 0 rgba(16, 22, 26, 0.15);
max-height:calc(60vh - 40px);
overflow:auto; }
.bp3-omnibar .bp3-menu:empty{
display:none; }
.bp3-dark .bp3-omnibar, .bp3-omnibar.bp3-dark{
background-color:#30404d;
-webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 4px 8px rgba(16, 22, 26, 0.4), 0 18px 46px 6px rgba(16, 22, 26, 0.4);
box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 4px 8px rgba(16, 22, 26, 0.4), 0 18px 46px 6px rgba(16, 22, 26, 0.4); }
.bp3-omnibar-overlay .bp3-overlay-backdrop{
background-color:rgba(16, 22, 26, 0.2); }
.bp3-select-popover .bp3-popover-content{
padding:5px; }
.bp3-select-popover .bp3-input-group{
margin-bottom:0; }
.bp3-select-popover .bp3-menu{
max-height:300px;
max-width:400px;
overflow:auto;
padding:0; }
.bp3-select-popover .bp3-menu:not(:first-child){
padding-top:5px; }
.bp3-multi-select{
min-width:150px; }
.bp3-multi-select-popover .bp3-menu{
max-height:300px;
max-width:400px;
overflow:auto; }
.bp3-select-popover .bp3-popover-content{
padding:5px; }
.bp3-select-popover .bp3-input-group{
margin-bottom:0; }
.bp3-select-popover .bp3-menu{
max-height:300px;
max-width:400px;
overflow:auto;
padding:0; }
.bp3-select-popover .bp3-menu:not(:first-child){
padding-top:5px; }
/*-----------------------------------------------------------------------------
| 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: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTE5IDEzaC02djZoLTJ2LTZINXYtMmg2VjVoMnY2aDZ2MnoiLz4KICA8L2c+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: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjIiIGhlaWdodD0iMjIiIHZpZXdCb3g9IjAgMCAyOCAyOCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CgkJPHBhdGggZD0iTTExLjQgMTguNkw2LjggMTRMMTEuNCA5LjRMMTAgOEw0IDE0TDEwIDIwTDExLjQgMTguNlpNMTYuNiAxOC42TDIxLjIgMTRMMTYuNiA5LjRMMTggOEwyNCAxNEwxOCAyMEwxNi42IDE4LjZWMTguNloiLz4KCTwvZz4KPC9zdmc+Cg==);
--jp-icon-console: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIwMCAyMDAiPgogIDxnIGNsYXNzPSJqcC1pY29uLWJyYW5kMSBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiMwMjg4RDEiPgogICAgPHBhdGggZD0iTTIwIDE5LjhoMTYwdjE1OS45SDIweiIvPgogIDwvZz4KICA8ZyBjbGFzcz0ianAtaWNvbi1zZWxlY3RhYmxlLWludmVyc2UiIGZpbGw9IiNmZmYiPgogICAgPHBhdGggZD0iTTEwNSAxMjcuM2g0MHYxMi44aC00MHpNNTEuMSA3N0w3NCA5OS45bC0yMy4zIDIzLjMgMTAuNSAxMC41IDIzLjMtMjMuM0w5NSA5OS45IDg0LjUgODkuNCA2MS42IDY2LjV6Ii8+CiAgPC9nPgo8L3N2Zz4K);
--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-download: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTE5IDloLTRWM0g5djZINWw3IDcgNy03ek01IDE4djJoMTR2LTJINXoiLz4KICA8L2c+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-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-list: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTEwIDE4aDR2LTJoLTR2MnpNMyA2djJoMThWNkgzem0zIDdoMTJ2LTJINnYyeiIvPgogIDwvZz4KPC9zdmc+Cg==);
--jp-icon-folder: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMTAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY4YzAtMS4xLS45LTItMi0yaC04bC0yLTJ6Ii8+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-inspector: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMjAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0tNSAxNEg0di00aDExdjR6bTAtNUg0VjloMTF2NHptNSA1aC00VjloNHY5eiIvPgo8L3N2Zz4K);
--jp-icon-json: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8ZyBjbGFzcz0ianAtaWNvbi13YXJuMSBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiNGOUE4MjUiPgogICAgPHBhdGggZD0iTTIwLjIgMTEuOGMtMS42IDAtMS43LjUtMS43IDEgMCAuNC4xLjkuMSAxLjMuMS41LjEuOS4xIDEuMyAwIDEuNy0xLjQgMi4zLTMuNSAyLjNoLS45di0xLjloLjVjMS4xIDAgMS40IDAgMS40LS44IDAtLjMgMC0uNi0uMS0xIDAtLjQtLjEtLjgtLjEtMS4yIDAtMS4zIDAtMS44IDEuMy0yLTEuMy0uMi0xLjMtLjctMS4zLTIgMC0uNC4xLS44LjEtMS4yLjEtLjQuMS0uNy4xLTEgMC0uOC0uNC0uNy0xLjQtLjhoLS41VjQuMWguOWMyLjIgMCAzLjUuNyAzLjUgMi4zIDAgLjQtLjEuOS0uMSAxLjMtLjEuNS0uMS45LS4xIDEuMyAwIC41LjIgMSAxLjcgMXYxLjh6TTEuOCAxMC4xYzEuNiAwIDEuNy0uNSAxLjctMSAwLS40LS4xLS45LS4xLTEuMy0uMS0uNS0uMS0uOS0uMS0xLjMgMC0xLjYgMS40LTIuMyAzLjUtMi4zaC45djEuOWgtLjVjLTEgMC0xLjQgMC0xLjQuOCAwIC4zIDAgLjYuMSAxIDAgLjIuMS42LjEgMSAwIDEuMyAwIDEuOC0xLjMgMkM2IDExLjIgNiAxMS43IDYgMTNjMCAuNC0uMS44LS4xIDEuMi0uMS4zLS4xLjctLjEgMSAwIC44LjMuOCAxLjQuOGguNXYxLjloLS45Yy0yLjEgMC0zLjUtLjYtMy41LTIuMyAwLS40LjEtLjkuMS0xLjMuMS0uNS4xLS45LjEtMS4zIDAtLjUtLjItMS0xLjctMXYtMS45eiIvPgogICAgPGNpcmNsZSBjeD0iMTEiIGN5PSIxMy44IiByPSIyLjEiLz4KICAgIDxjaXJjbGUgY3g9IjExIiBjeT0iOC4yIiByPSIyLjEiLz4KICA8L2c+Cjwvc3ZnPgo=);
--jp-icon-julia: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDMyNSAzMDAiPgogIDxnIGNsYXNzPSJqcC1icmFuZDAganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjY2IzYzMzIj4KICAgIDxwYXRoIGQ9Ik0gMTUwLjg5ODQzOCAyMjUgQyAxNTAuODk4NDM4IDI2Ni40MjE4NzUgMTE3LjMyMDMxMiAzMDAgNzUuODk4NDM4IDMwMCBDIDM0LjQ3NjU2MiAzMDAgMC44OTg0MzggMjY2LjQyMTg3NSAwLjg5ODQzOCAyMjUgQyAwLjg5ODQzOCAxODMuNTc4MTI1IDM0LjQ3NjU2MiAxNTAgNzUuODk4NDM4IDE1MCBDIDExNy4zMjAzMTIgMTUwIDE1MC44OTg0MzggMTgzLjU3ODEyNSAxNTAuODk4NDM4IDIyNSIvPgogIDwvZz4KICA8ZyBjbGFzcz0ianAtYnJhbmQwIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iIzM4OTgyNiI+CiAgICA8cGF0aCBkPSJNIDIzNy41IDc1IEMgMjM3LjUgMTE2LjQyMTg3NSAyMDMuOTIxODc1IDE1MCAxNjIuNSAxNTAgQyAxMjEuMDc4MTI1IDE1MCA4Ny41IDExNi40MjE4NzUgODcuNSA3NSBDIDg3LjUgMzMuNTc4MTI1IDEyMS4wNzgxMjUgMCAxNjIuNSAwIEMgMjAzLjkyMTg3NSAwIDIzNy41IDMzLjU3ODEyNSAyMzcuNSA3NSIvPgogIDwvZz4KICA8ZyBjbGFzcz0ianAtYnJhbmQwIGpwLWljb24tc2VsZWN0YWJsZSIgZmlsbD0iIzk1NThiMiI+CiAgICA8cGF0aCBkPSJNIDMyNC4xMDE1NjIgMjI1IEMgMzI0LjEwMTU2MiAyNjYuNDIxODc1IDI5MC41MjM0MzggMzAwIDI0OS4xMDE1NjIgMzAwIEMgMjA3LjY3OTY4OCAzMDAgMTc0LjEwMTU2MiAyNjYuNDIxODc1IDE3NC4xMDE1NjIgMjI1IEMgMTc0LjEwMTU2MiAxODMuNTc4MTI1IDIwNy42Nzk2ODggMTUwIDI0OS4xMDE1NjIgMTUwIEMgMjkwLjUyMzQzOCAxNTAgMzI0LjEwMTU2MiAxODMuNTc4MTI1IDMyNC4xMDE1NjIgMjI1Ii8+CiAgPC9nPgo8L3N2Zz4K);
--jp-icon-jupyter-favicon: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTUyIiBoZWlnaHQ9IjE2NSIgdmlld0JveD0iMCAwIDE1MiAxNjUiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbi13YXJuMCIgZmlsbD0iI0YzNzcyNiI+CiAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjA3ODk0NywgMTEwLjU4MjkyNykiIGQ9Ik03NS45NDIyODQyLDI5LjU4MDQ1NjEgQzQzLjMwMjM5NDcsMjkuNTgwNDU2MSAxNC43OTY3ODMyLDE3LjY1MzQ2MzQgMCwwIEM1LjUxMDgzMjExLDE1Ljg0MDY4MjkgMTUuNzgxNTM4OSwyOS41NjY3NzMyIDI5LjM5MDQ5NDcsMzkuMjc4NDE3MSBDNDIuOTk5Nyw0OC45ODk4NTM3IDU5LjI3MzcsNTQuMjA2NzgwNSA3NS45NjA1Nzg5LDU0LjIwNjc4MDUgQzkyLjY0NzQ1NzksNTQuMjA2NzgwNSAxMDguOTIxNDU4LDQ4Ljk4OTg1MzcgMTIyLjUzMDY2MywzOS4yNzg0MTcxIEMxMzYuMTM5NDUzLDI5LjU2Njc3MzIgMTQ2LjQxMDI4NCwxNS44NDA2ODI5IDE1MS45MjExNTgsMCBDMTM3LjA4Nzg2OCwxNy42NTM0NjM0IDEwOC41ODI1ODksMjkuNTgwNDU2MSA3NS45NDIyODQyLDI5LjU4MDQ1NjEgTDc1Ljk0MjI4NDIsMjkuNTgwNDU2MSBaIiAvPgogICAgPHBhdGggdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4wMzczNjgsIDAuNzA0ODc4KSIgZD0iTTc1Ljk3ODQ1NzksMjQuNjI2NDA3MyBDMTA4LjYxODc2MywyNC42MjY0MDczIDEzNy4xMjQ0NTgsMzYuNTUzNDQxNSAxNTEuOTIxMTU4LDU0LjIwNjc4MDUgQzE0Ni40MTAyODQsMzguMzY2MjIyIDEzNi4xMzk0NTMsMjQuNjQwMTMxNyAxMjIuNTMwNjYzLDE0LjkyODQ4NzggQzEwOC45MjE0NTgsNS4yMTY4NDM5IDkyLjY0NzQ1NzksMCA3NS45NjA1Nzg5LDAgQzU5LjI3MzcsMCA0Mi45OTk3LDUuMjE2ODQzOSAyOS4zOTA0OTQ3LDE0LjkyODQ4NzggQzE1Ljc4MTUzODksMjQuNjQwMTMxNyA1LjUxMDgzMjExLDM4LjM2NjIyMiAwLDU0LjIwNjc4MDUgQzE0LjgzMzA4MTYsMzYuNTg5OTI5MyA0My4zMzg1Njg0LDI0LjYyNjQwNzMgNzUuOTc4NDU3OSwyNC42MjY0MDczIEw3NS45Nzg0NTc5LDI0LjYyNjQwNzMgWiIgLz4KICA8L2c+Cjwvc3ZnPgo=);
--jp-icon-jupyter: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzkiIGhlaWdodD0iNTEiIHZpZXdCb3g9IjAgMCAzOSA1MSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTYzOCAtMjI4MSkiPgogICAgPGcgY2xhc3M9ImpwLWljb24td2FybjAiIGZpbGw9IiNGMzc3MjYiPgogICAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjM5Ljc0IDIzMTEuOTgpIiBkPSJNIDE4LjI2NDYgNy4xMzQxMUMgMTAuNDE0NSA3LjEzNDExIDMuNTU4NzIgNC4yNTc2IDAgMEMgMS4zMjUzOSAzLjgyMDQgMy43OTU1NiA3LjEzMDgxIDcuMDY4NiA5LjQ3MzAzQyAxMC4zNDE3IDExLjgxNTIgMTQuMjU1NyAxMy4wNzM0IDE4LjI2OSAxMy4wNzM0QyAyMi4yODIzIDEzLjA3MzQgMjYuMTk2MyAxMS44MTUyIDI5LjQ2OTQgOS40NzMwM0MgMzIuNzQyNCA3LjEzMDgxIDM1LjIxMjYgMy44MjA0IDM2LjUzOCAwQyAzMi45NzA1IDQuMjU3NiAyNi4xMTQ4IDcuMTM0MTEgMTguMjY0NiA3LjEzNDExWiIvPgogICAgICA8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNjM5LjczIDIyODUuNDgpIiBkPSJNIDE4LjI3MzMgNS45MzkzMUMgMjYuMTIzNSA1LjkzOTMxIDMyLjk3OTMgOC44MTU4MyAzNi41MzggMTMuMDczNEMgMzUuMjEyNiA5LjI1MzAzIDMyLjc0MjQgNS45NDI2MiAyOS40Njk0IDMuNjAwNEMgMjYuMTk2MyAxLjI1ODE4IDIyLjI4MjMgMCAxOC4yNjkgMEMgMTQuMjU1NyAwIDEwLjM0MTcgMS4yNTgxOCA3LjA2ODYgMy42MDA0QyAzLjc5NTU2IDUuOTQyNjIgMS4zMjUzOSA5LjI1MzAzIDAgMTMuMDczNEMgMy41Njc0NSA4LjgyNDYzIDEwLjQyMzIgNS45MzkzMSAxOC4yNzMzIDUuOTM5MzFaIi8+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-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,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgIDxwYXRoIGNsYXNzPSJqcC1pY29uMiBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiM2MTYxNjEiIGQ9Ik0xOSA1djE0SDVWNWgxNG0xLjEtMkgzLjljLS41IDAtLjkuNC0uOS45djE2LjJjMCAuNC40LjkuOS45aDE2LjJjLjQgMCAuOS0uNS45LS45VjMuOWMwLS41LS41LS45LS45LS45ek0xMSA3aDZ2MmgtNlY3em0wIDRoNnYyaC02di0yem0wIDRoNnYyaC02ek03IDdoMnYySDd6bTAgNGgydjJIN3ptMCA0aDJ2Mkg3eiIvPgo8L3N2Zz4=);
--jp-icon-listings-info: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA1MC45NzggNTAuOTc4IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1MC45NzggNTAuOTc4OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+Cgk8Zz4KCQk8cGF0aCBzdHlsZT0iZmlsbDojMDEwMDAyOyIgZD0iTTQzLjUyLDcuNDU4QzM4LjcxMSwyLjY0OCwzMi4zMDcsMCwyNS40ODksMEMxOC42NywwLDEyLjI2NiwyLjY0OCw3LjQ1OCw3LjQ1OAoJCQljLTkuOTQzLDkuOTQxLTkuOTQzLDI2LjExOSwwLDM2LjA2MmM0LjgwOSw0LjgwOSwxMS4yMTIsNy40NTYsMTguMDMxLDcuNDU4YzAsMCwwLjAwMSwwLDAuMDAyLDAKCQkJYzYuODE2LDAsMTMuMjIxLTIuNjQ4LDE4LjAyOS03LjQ1OGM0LjgwOS00LjgwOSw3LjQ1Ny0xMS4yMTIsNy40NTctMTguMDNDNTAuOTc3LDE4LjY3LDQ4LjMyOCwxMi4yNjYsNDMuNTIsNy40NTh6CgkJCSBNNDIuMTA2LDQyLjEwNWMtNC40MzIsNC40MzEtMTAuMzMyLDYuODcyLTE2LjYxNSw2Ljg3MmgtMC4wMDJjLTYuMjg1LTAuMDAxLTEyLjE4Ny0yLjQ0MS0xNi42MTctNi44NzIKCQkJYy05LjE2Mi05LjE2My05LjE2Mi0yNC4wNzEsMC0zMy4yMzNDMTMuMzAzLDQuNDQsMTkuMjA0LDIsMjUuNDg5LDJjNi4yODQsMCwxMi4xODYsMi40NCwxNi42MTcsNi44NzIKCQkJYzQuNDMxLDQuNDMxLDYuODcxLDEwLjMzMiw2Ljg3MSwxNi42MTdDNDguOTc3LDMxLjc3Miw0Ni41MzYsMzcuNjc1LDQyLjEwNiw0Mi4xMDV6Ii8+CgkJPHBhdGggc3R5bGU9ImZpbGw6IzAxMDAwMjsiIGQ9Ik0yMy41NzgsMzIuMjE4Yy0wLjAyMy0xLjczNCwwLjE0My0zLjA1OSwwLjQ5Ni0zLjk3MmMwLjM1My0wLjkxMywxLjExLTEuOTk3LDIuMjcyLTMuMjUzCgkJCWMwLjQ2OC0wLjUzNiwwLjkyMy0xLjA2MiwxLjM2Ny0xLjU3NWMwLjYyNi0wLjc1MywxLjEwNC0xLjQ3OCwxLjQzNi0yLjE3NWMwLjMzMS0wLjcwNywwLjQ5NS0xLjU0MSwwLjQ5NS0yLjUKCQkJYzAtMS4wOTYtMC4yNi0yLjA4OC0wLjc3OS0yLjk3OWMtMC41NjUtMC44NzktMS41MDEtMS4zMzYtMi44MDYtMS4zNjljLTEuODAyLDAuMDU3LTIuOTg1LDAuNjY3LTMuNTUsMS44MzIKCQkJYy0wLjMwMSwwLjUzNS0wLjUwMywxLjE0MS0wLjYwNywxLjgxNGMtMC4xMzksMC43MDctMC4yMDcsMS40MzItMC4yMDcsMi4xNzRoLTIuOTM3Yy0wLjA5MS0yLjIwOCwwLjQwNy00LjExNCwxLjQ5My01LjcxOQoJCQljMS4wNjItMS42NCwyLjg1NS0yLjQ4MSw1LjM3OC0yLjUyN2MyLjE2LDAuMDIzLDMuODc0LDAuNjA4LDUuMTQxLDEuNzU4YzEuMjc4LDEuMTYsMS45MjksMi43NjQsMS45NSw0LjgxMQoJCQljMCwxLjE0Mi0wLjEzNywyLjExMS0wLjQxLDIuOTExYy0wLjMwOSwwLjg0NS0wLjczMSwxLjU5My0xLjI2OCwyLjI0M2MtMC40OTIsMC42NS0xLjA2OCwxLjMxOC0xLjczLDIuMDAyCgkJCWMtMC42NSwwLjY5Ny0xLjMxMywxLjQ3OS0xLjk4NywyLjM0NmMtMC4yMzksMC4zNzctMC40MjksMC43NzctMC41NjUsMS4xOTljLTAuMTYsMC45NTktMC4yMTcsMS45NTEtMC4xNzEsMi45NzkKCQkJQzI2LjU4OSwzMi4yMTgsMjMuNTc4LDMyLjIxOCwyMy41NzgsMzIuMjE4eiBNMjMuNTc4LDM4LjIydi0zLjQ4NGgzLjA3NnYzLjQ4NEgyMy41Nzh6Ii8+Cgk8L2c+Cjwvc3ZnPgo=);
--jp-icon-markdown: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8cGF0aCBjbGFzcz0ianAtaWNvbi1jb250cmFzdDAganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjN0IxRkEyIiBkPSJNNSAxNC45aDEybC02LjEgNnptOS40LTYuOGMwLTEuMy0uMS0yLjktLjEtNC41LS40IDEuNC0uOSAyLjktMS4zIDQuM2wtMS4zIDQuM2gtMkw4LjUgNy45Yy0uNC0xLjMtLjctMi45LTEtNC4zLS4xIDEuNi0uMSAzLjItLjIgNC42TDcgMTIuNEg0LjhsLjctMTFoMy4zTDEwIDVjLjQgMS4yLjcgMi43IDEgMy45LjMtMS4yLjctMi42IDEtMy45bDEuMi0zLjdoMy4zbC42IDExaC0yLjRsLS4zLTQuMnoiLz4KPC9zdmc+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,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8ZyBjbGFzcz0ianAtaWNvbi13YXJuMCBqcC1pY29uLXNlbGVjdGFibGUiIGZpbGw9IiNFRjZDMDAiPgogICAgPHBhdGggZD0iTTE4LjcgMy4zdjE1LjRIMy4zVjMuM2gxNS40bTEuNS0xLjVIMS44djE4LjNoMTguM2wuMS0xOC4zeiIvPgogICAgPHBhdGggZD0iTTE2LjUgMTYuNWwtNS40LTQuMy01LjYgNC4zdi0xMWgxMXoiLz4KICA8L2c+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,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8ZyBjbGFzcz0ianAtaWNvbi1icmFuZDAganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjMEQ0N0ExIj4KICAgIDxwYXRoIGQ9Ik0xMS4xIDYuOVY1LjhINi45YzAtLjUgMC0xLjMuMi0xLjYuNC0uNy44LTEuMSAxLjctMS40IDEuNy0uMyAyLjUtLjMgMy45LS4xIDEgLjEgMS45LjkgMS45IDEuOXY0LjJjMCAuNS0uOSAxLjYtMiAxLjZIOC44Yy0xLjUgMC0yLjQgMS40LTIuNCAyLjh2Mi4ySDQuN0MzLjUgMTUuMSAzIDE0IDMgMTMuMVY5Yy0uMS0xIC42LTIgMS44LTIgMS41LS4xIDYuMy0uMSA2LjMtLjF6Ii8+CiAgICA8cGF0aCBkPSJNMTAuOSAxNS4xdjEuMWg0LjJjMCAuNSAwIDEuMy0uMiAxLjYtLjQuNy0uOCAxLjEtMS43IDEuNC0xLjcuMy0yLjUuMy0zLjkuMS0xLS4xLTEuOS0uOS0xLjktMS45di00LjJjMC0uNS45LTEuNiAyLTEuNmgzLjhjMS41IDAgMi40LTEuNCAyLjQtMi44VjYuNmgxLjdDMTguNSA2LjkgMTkgOCAxOSA4LjlWMTNjMCAxLS43IDIuMS0xLjkgMi4xaC02LjJ6Ii8+CiAgPC9nPgo8L3N2Zz4K);
--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-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+CiAgICAgICAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0yMSw4SDNWNGgxOFY4eiBNMjEsMTBIM3Y0aDE4VjEweiBNMjEsMTZIM3Y0aDE4VjE2eiIvPgogICAgPC9nPgo8L3N2Zz4=);
--jp-icon-tag: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjgiIGhlaWdodD0iMjgiIHZpZXdCb3g9IjAgMCA0MyAyOCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CgkJPHBhdGggZD0iTTI4LjgzMzIgMTIuMzM0TDMyLjk5OTggMTYuNTAwN0wzNy4xNjY1IDEyLjMzNEgyOC44MzMyWiIvPgoJCTxwYXRoIGQ9Ik0xNi4yMDk1IDIxLjYxMDRDMTUuNjg3MyAyMi4xMjk5IDE0Ljg0NDMgMjIuMTI5OSAxNC4zMjQ4IDIxLjYxMDRMNi45ODI5IDE0LjcyNDVDNi41NzI0IDE0LjMzOTQgNi4wODMxMyAxMy42MDk4IDYuMDQ3ODYgMTMuMDQ4MkM1Ljk1MzQ3IDExLjUyODggNi4wMjAwMiA4LjYxOTQ0IDYuMDY2MjEgNy4wNzY5NUM2LjA4MjgxIDYuNTE0NzcgNi41NTU0OCA2LjA0MzQ3IDcuMTE4MDQgNi4wMzA1NUM5LjA4ODYzIDUuOTg0NzMgMTMuMjYzOCA1LjkzNTc5IDEzLjY1MTggNi4zMjQyNUwyMS43MzY5IDEzLjYzOUMyMi4yNTYgMTQuMTU4NSAyMS43ODUxIDE1LjQ3MjQgMjEuMjYyIDE1Ljk5NDZMMTYuMjA5NSAyMS42MTA0Wk05Ljc3NTg1IDguMjY1QzkuMzM1NTEgNy44MjU2NiA4LjYyMzUxIDcuODI1NjYgOC4xODI4IDguMjY1QzcuNzQzNDYgOC43MDU3MSA3Ljc0MzQ2IDkuNDE3MzMgOC4xODI4IDkuODU2NjdDOC42MjM4MiAxMC4yOTY0IDkuMzM1ODIgMTAuMjk2NCA5Ljc3NTg1IDkuODU2NjdDMTAuMjE1NiA5LjQxNzMzIDEwLjIxNTYgOC43MDUzMyA5Ljc3NTg1IDguMjY1WiIvPgoJPC9nPgo8L3N2Zz4K);
--jp-icon-terminal: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0IiA+CiAgICA8cmVjdCBjbGFzcz0ianAtaWNvbjIganAtaWNvbi1zZWxlY3RhYmxlIiB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIgMikiIGZpbGw9IiMzMzMzMzMiLz4KICAgIDxwYXRoIGNsYXNzPSJqcC1pY29uLWFjY2VudDIganAtaWNvbi1zZWxlY3RhYmxlLWludmVyc2UiIGQ9Ik01LjA1NjY0IDguNzYxNzJDNS4wNTY2NCA4LjU5NzY2IDUuMDMxMjUgOC40NTMxMiA0Ljk4MDQ3IDguMzI4MTJDNC45MzM1OSA4LjE5OTIyIDQuODU1NDcgOC4wODIwMyA0Ljc0NjA5IDcuOTc2NTZDNC42NDA2MiA3Ljg3MTA5IDQuNSA3Ljc3NTM5IDQuMzI0MjIgNy42ODk0NUM0LjE1MjM0IDcuNTk5NjEgMy45NDMzNiA3LjUxMTcyIDMuNjk3MjcgNy40MjU3OEMzLjMwMjczIDcuMjg1MTYgMi45NDMzNiA3LjEzNjcyIDIuNjE5MTQgNi45ODA0N0MyLjI5NDkyIDYuODI0MjIgMi4wMTc1OCA2LjY0MjU4IDEuNzg3MTEgNi40MzU1NUMxLjU2MDU1IDYuMjI4NTIgMS4zODQ3NyA1Ljk4ODI4IDEuMjU5NzcgNS43MTQ4NEMxLjEzNDc3IDUuNDM3NSAxLjA3MjI3IDUuMTA5MzggMS4wNzIyNyA0LjczMDQ3QzEuMDcyMjcgNC4zOTg0NCAxLjEyODkxIDQuMDk1NyAxLjI0MjE5IDMuODIyMjdDMS4zNTU0NyAzLjU0NDkyIDEuNTE1NjIgMy4zMDQ2OSAxLjcyMjY2IDMuMTAxNTZDMS45Mjk2OSAyLjg5ODQ0IDIuMTc5NjkgMi43MzQzNyAyLjQ3MjY2IDIuNjA5MzhDMi43NjU2MiAyLjQ4NDM4IDMuMDkxOCAyLjQwNDMgMy40NTExNyAyLjM2OTE0VjEuMTA5MzhINC4zODg2N1YyLjM4MDg2QzQuNzQwMjMgMi40Mjc3MyA1LjA1NjY0IDIuNTIzNDQgNS4zMzc4OSAyLjY2Nzk3QzUuNjE5MTQgMi44MTI1IDUuODU3NDIgMy4wMDE5NSA2LjA1MjczIDMuMjM2MzNDNi4yNTE5NSAzLjQ2NjggNi40MDQzIDMuNzQwMjMgNi41MDk3NyA0LjA1NjY0QzYuNjE5MTQgNC4zNjkxNCA2LjY3MzgzIDQuNzIwNyA2LjY3MzgzIDUuMTExMzNINS4wNDQ5MkM1LjA0NDkyIDQuNjM4NjcgNC45Mzc1IDQuMjgxMjUgNC43MjI2NiA0LjAzOTA2QzQuNTA3ODEgMy43OTI5NyA0LjIxNjggMy42Njk5MiAzLjg0OTYxIDMuNjY5OTJDMy42NTAzOSAzLjY2OTkyIDMuNDc2NTYgMy42OTcyNyAzLjMyODEyIDMuNzUxOTVDMy4xODM1OSAzLjgwMjczIDMuMDY0NDUgMy44NzY5NSAyLjk3MDcgMy45NzQ2MUMyLjg3Njk1IDQuMDY4MzYgMi44MDY2NCA0LjE3OTY5IDIuNzU5NzcgNC4zMDg1OUMyLjcxNjggNC40Mzc1IDIuNjk1MzEgNC41NzgxMiAyLjY5NTMxIDQuNzMwNDdDMi42OTUzMSA0Ljg4MjgxIDIuNzE2OCA1LjAxOTUzIDIuNzU5NzcgNS4xNDA2MkMyLjgwNjY0IDUuMjU3ODEgMi44ODI4MSA1LjM2NzE5IDIuOTg4MjggNS40Njg3NUMzLjA5NzY2IDUuNTcwMzEgMy4yNDAyMyA1LjY2Nzk3IDMuNDE2MDIgNS43NjE3MkMzLjU5MTggNS44NTE1NiAzLjgxMDU1IDUuOTQzMzYgNC4wNzIyNyA2LjAzNzExQzQuNDY2OCA2LjE4NTU1IDQuODI0MjIgNi4zMzk4NCA1LjE0NDUzIDYuNUM1LjQ2NDg0IDYuNjU2MjUgNS43MzgyOCA2LjgzOTg0IDUuOTY0ODQgNy4wNTA3OEM2LjE5NTMxIDcuMjU3ODEgNi4zNzEwOSA3LjUgNi40OTIxOSA3Ljc3NzM0QzYuNjE3MTkgOC4wNTA3OCA2LjY3OTY5IDguMzc1IDYuNjc5NjkgOC43NUM2LjY3OTY5IDkuMDkzNzUgNi42MjMwNSA5LjQwNDMgNi41MDk3NyA5LjY4MTY0QzYuMzk2NDggOS45NTUwOCA2LjIzNDM4IDEwLjE5MTQgNi4wMjM0NCAxMC4zOTA2QzUuODEyNSAxMC41ODk4IDUuNTU4NTkgMTAuNzUgNS4yNjE3MiAxMC44NzExQzQuOTY0ODQgMTAuOTg4MyA0LjYzMjgxIDExLjA2NDUgNC4yNjU2MiAxMS4wOTk2VjEyLjI0OEgzLjMzMzk4VjExLjA5OTZDMy4wMDE5NSAxMS4wNjg0IDIuNjc5NjkgMTAuOTk2MSAyLjM2NzE5IDEwLjg4MjhDMi4wNTQ2OSAxMC43NjU2IDEuNzc3MzQgMTAuNTk3NyAxLjUzNTE2IDEwLjM3ODlDMS4yOTY4OCAxMC4xNjAyIDEuMTA1NDcgOS44ODQ3NyAwLjk2MDkzOCA5LjU1MjczQzAuODE2NDA2IDkuMjE2OCAwLjc0NDE0MSA4LjgxNDQ1IDAuNzQ0MTQxIDguMzQ1N0gyLjM3ODkxQzIuMzc4OTEgOC42MjY5NSAyLjQxOTkyIDguODYzMjggMi41MDE5NSA5LjA1NDY5QzIuNTgzOTggOS4yNDIxOSAyLjY4OTQ1IDkuMzkyNTggMi44MTgzNiA5LjUwNTg2QzIuOTUxMTcgOS42MTUyMyAzLjEwMTU2IDkuNjkzMzYgMy4yNjk1MyA5Ljc0MDIzQzMuNDM3NSA5Ljc4NzExIDMuNjA5MzggOS44MTA1NSAzLjc4NTE2IDkuODEwNTVDNC4yMDMxMiA5LjgxMDU1IDQuNTE5NTMgOS43MTI4OSA0LjczNDM4IDkuNTE3NThDNC45NDkyMiA5LjMyMjI3IDUuMDU2NjQgOS4wNzAzMSA1LjA1NjY0IDguNzYxNzJaTTEzLjQxOCAxMi4yNzE1SDguMDc0MjJWMTFIMTMuNDE4VjEyLjI3MTVaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzLjk1MjY0IDYpIiBmaWxsPSJ3aGl0ZSIvPgo8L3N2Zz4K);
--jp-icon-text-editor: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8cGF0aCBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIiBkPSJNMTUgMTVIM3YyaDEydi0yem0wLThIM3YyaDEyVjd6TTMgMTNoMTh2LTJIM3Yyem0wIDhoMTh2LTJIM3Yyek0zIDN2MmgxOFYzSDN6Ii8+Cjwvc3ZnPgo=);
--jp-icon-toc: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBjbGFzcz0ianAtaWNvbjMganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjNjE2MTYxIj4KICAgIDxwYXRoIGQ9Ik03LDVIMjFWN0g3VjVNNywxM1YxMUgyMVYxM0g3TTQsNC41QTEuNSwxLjUgMCAwLDEgNS41LDZBMS41LDEuNSAwIDAsMSA0LDcuNUExLjUsMS41IDAgMCwxIDIuNSw2QTEuNSwxLjUgMCAwLDEgNCw0LjVNNCwxMC41QTEuNSwxLjUgMCAwLDEgNS41LDEyQTEuNSwxLjUgMCAwLDEgNCwxMy41QTEuNSwxLjUgMCAwLDEgMi41LDEyQTEuNSwxLjUgMCAwLDEgNCwxMC41TTcsMTlWMTdIMjFWMTlIN000LDE2LjVBMS41LDEuNSAwIDAsMSA1LjUsMThBMS41LDEuNSAwIDAsMSA0LDE5LjVBMS41LDEuNSAwIDAsMSAyLjUsMThBMS41LDEuNSAwIDAsMSA0LDE2LjVaIiAvPgogIDwvZz4KPC9zdmc+Cg==);
--jp-icon-tree-view: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsYXNzPSJqcC1pY29uMyIgZmlsbD0iIzYxNjE2MSI+CiAgICAgICAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0yMiAxMVYzaC03djNIOVYzSDJ2OGg3VjhoMnYxMGg0djNoN3YtOGgtN3YzaC0yVjhoMnYzeiIvPgogICAgPC9nPgo8L3N2Zz4=);
--jp-icon-trusted: url(data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDI0IDI1Ij4KICAgIDxwYXRoIGNsYXNzPSJqcC1pY29uMiIgc3Ryb2tlPSIjMzMzMzMzIiBzdHJva2Utd2lkdGg9IjIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIgMykiIGQ9Ik0xLjg2MDk0IDExLjQ0MDlDMC44MjY0NDggOC43NzAyNyAwLjg2Mzc3OSA2LjA1NzY0IDEuMjQ5MDcgNC4xOTkzMkMyLjQ4MjA2IDMuOTMzNDcgNC4wODA2OCAzLjQwMzQ3IDUuNjAxMDIgMi44NDQ5QzcuMjM1NDkgMi4yNDQ0IDguODU2NjYgMS41ODE1IDkuOTg3NiAxLjA5NTM5QzExLjA1OTcgMS41ODM0MSAxMi42MDk0IDIuMjQ0NCAxNC4yMTggMi44NDMzOUMxNS43NTAzIDMuNDEzOTQgMTcuMzk5NSAzLjk1MjU4IDE4Ljc1MzkgNC4yMTM4NUMxOS4xMzY0IDYuMDcxNzcgMTkuMTcwOSA4Ljc3NzIyIDE4LjEzOSAxMS40NDA5QzE3LjAzMDMgMTQuMzAzMiAxNC42NjY4IDE3LjE4NDQgOS45OTk5OSAxOC45MzU0QzUuMzMzMiAxNy4xODQ0IDIuOTY5NjggMTQuMzAzMiAxLjg2MDk0IDExLjQ0MDlaIi8+CiAgICA8cGF0aCBjbGFzcz0ianAtaWNvbjIiIGZpbGw9IiMzMzMzMzMiIHN0cm9rZT0iIzMzMzMzMyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoOCA5Ljg2NzE5KSIgZD0iTTIuODYwMTUgNC44NjUzNUwwLjcyNjU0OSAyLjk5OTU5TDAgMy42MzA0NUwyLjg2MDE1IDYuMTMxNTdMOCAwLjYzMDg3Mkw3LjI3ODU3IDBMMi44NjAxNSA0Ljg2NTM1WiIvPgo8L3N2Zz4K);
--jp-icon-undo: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8ZyBjbGFzcz0ianAtaWNvbjMiIGZpbGw9IiM2MTYxNjEiPgogICAgPHBhdGggZD0iTTEyLjUgOGMtMi42NSAwLTUuMDUuOTktNi45IDIuNkwyIDd2OWg5bC0zLjYyLTMuNjJjMS4zOS0xLjE2IDMuMTYtMS44OCA1LjEyLTEuODggMy41NCAwIDYuNTUgMi4zMSA3LjYgNS41bDIuMzctLjc4QzIxLjA4IDExLjAzIDE3LjE1IDggMTIuNSA4eiIvPgogIDwvZz4KPC9zdmc+Cg==);
--jp-icon-vega: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8ZyBjbGFzcz0ianAtaWNvbjEganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjMjEyMTIxIj4KICAgIDxwYXRoIGQ9Ik0xMC42IDUuNGwyLjItMy4ySDIuMnY3LjNsNC02LjZ6Ii8+CiAgICA8cGF0aCBkPSJNMTUuOCAyLjJsLTQuNCA2LjZMNyA2LjNsLTQuOCA4djUuNWgxNy42VjIuMmgtNHptLTcgMTUuNEg1LjV2LTQuNGgzLjN2NC40em00LjQgMEg5LjhWOS44aDMuNHY3Ljh6bTQuNCAwaC0zLjRWNi41aDMuNHYxMS4xeiIvPgogIDwvZz4KPC9zdmc+Cg==);
--jp-icon-yaml: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgdmlld0JveD0iMCAwIDIyIDIyIj4KICA8ZyBjbGFzcz0ianAtaWNvbi1jb250cmFzdDIganAtaWNvbi1zZWxlY3RhYmxlIiBmaWxsPSIjRDgxQjYwIj4KICAgIDxwYXRoIGQ9Ik03LjIgMTguNnYtNS40TDMgNS42aDMuM2wxLjQgMy4xYy4zLjkuNiAxLjYgMSAyLjUuMy0uOC42LTEuNiAxLTIuNWwxLjQtMy4xaDMuNGwtNC40IDcuNnY1LjVsLTIuOS0uMXoiLz4KICAgIDxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjE3LjYiIGN5PSIxNi41IiByPSIyLjEiLz4KICAgIDxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjE3LjYiIGN5PSIxMSIgcj0iMi4xIi8+CiAgPC9nPgo8L3N2Zz4K);
}
/* Icon CSS class declarations */
.jp-AddIcon {
background-image: var(--jp-icon-add);
}
.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-CodeIcon {
background-image: var(--jp-icon-code);
}
.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-DownloadIcon {
background-image: var(--jp-icon-download);
}
.jp-EditIcon {
background-image: var(--jp-icon-edit);
}
.jp-EllipsesIcon {
background-image: var(--jp-icon-ellipses);
}
.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-FilterListIcon {
background-image: var(--jp-icon-filter-list);
}
.jp-FolderIcon {
background-image: var(--jp-icon-folder);
}
.jp-Html5Icon {
background-image: var(--jp-icon-html5);
}
.jp-ImageIcon {
background-image: var(--jp-icon-image);
}
.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-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-ListingsInfoIcon {
background-image: var(--jp-icon-listings-info);
}
.jp-MarkdownIcon {
background-image: var(--jp-icon-markdown);
}
.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-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-VegaIcon {
background-image: var(--jp-icon-vega);
}
.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.
|----------------------------------------------------------------------------*/
/**
* 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);
}
/* CSS for icons in selected items in the settings editor */
#setting-editor .jp-PluginList .jp-mod-selected .jp-icon-selectable[fill] {
fill: #fff;
}
#setting-editor
.jp-PluginList
.jp-mod-selected
.jp-icon-selectable-inverse[fill] {
fill: var(--jp-brand-color1);
}
/* 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);
}
/* CSS for icons in selected tabs in the sidebar tab manager */
#tab-manager .lm-TabBar-tab.jp-mod-active .jp-icon-selectable[fill] {
fill: #fff;
}
#tab-manager .lm-TabBar-tab.jp-mod-active .jp-icon-selectable-inverse[fill] {
fill: var(--jp-brand-color1);
}
#tab-manager
.lm-TabBar-tab.jp-mod-active
.jp-icon-hover
:hover
.jp-icon-selectable[fill] {
fill: var(--jp-brand-color1);
}
#tab-manager
.lm-TabBar-tab.jp-mod-active
.jp-icon-hover
:hover
.jp-icon-selectable-inverse[fill] {
fill: #fff;
}
/**
* 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 sidebar tab manager
*/
#tab-manager
.lm-TabBar-tab.jp-mod-dirty
> .lm-TabBar-tabCloseIcon
> :not(:hover)
> .jp-icon3[fill] {
fill: none;
}
#tab-manager
.lm-TabBar-tab.jp-mod-dirty
> .lm-TabBar-tabCloseIcon
> :not(:hover)
> .jp-icon-busy[fill] {
fill: var(--jp-inverse-layout-color3);
}
#tab-manager
.lm-TabBar-tab.jp-mod-dirty.jp-mod-active
> .lm-TabBar-tabCloseIcon
> :not(:hover)
> .jp-icon-busy[fill] {
fill: #fff;
}
/**
* 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);
}
/* 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) svg {
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-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;
}
.jp-switch-track {
cursor: pointer;
background-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: 0px;
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-warn-color0);
}
.jp-switch[aria-checked='true'] .jp-switch-track::before {
/* track width (35) - margins (3 + 3) - thumb width (10) */
left: 19px;
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
/* Sibling imports */
/* Override Blueprint's _reset.scss styles */
html {
box-sizing: unset;
}
*,
*::before,
*::after {
box-sizing: unset;
}
body {
color: unset;
font-family: var(--jp-ui-font-family);
}
p {
margin-top: unset;
margin-bottom: unset;
}
small {
font-size: unset;
}
strong {
font-weight: unset;
}
/* Override Blueprint's _typography.scss styles */
a {
text-decoration: unset;
color: unset;
}
a:hover {
text-decoration: unset;
color: unset;
}
/* Override Blueprint's _accessibility.scss styles */
:focus {
outline: unset;
outline-offset: unset;
-moz-outline-radius: unset;
}
/* Styles for ui-components */
.jp-Button {
border-radius: var(--jp-border-radius);
padding: 0px 12px;
font-size: var(--jp-ui-font-size1);
}
/* Use our own theme for hover styles */
button.jp-Button.bp3-button.bp3-minimal:hover {
background-color: var(--jp-layout-color2);
}
.jp-Button.minimal {
color: unset !important;
}
.jp-Button.jp-ToolbarButtonComponent {
text-transform: none;
}
.jp-InputGroup input {
box-sizing: border-box;
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);
}
.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::placeholder,
input::placeholder {
color: var(--jp-ui-font-color3);
}
.jp-BPIcon {
display: inline-block;
vertical-align: middle;
margin: auto;
}
/* Stop blueprint futzing with our icon fills */
.bp3-icon.jp-BPIcon > svg:not([fill]) {
fill: var(--jp-inverse-layout-color3);
}
.jp-InputGroupAction {
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);
height: 24px;
line-height: 14px;
padding: 0 25px 0 10px;
text-align: left;
-moz-appearance: none;
-webkit-appearance: none;
}
/* Use our own theme for hover and option styles */
.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.
|----------------------------------------------------------------------------*/
.jp-Collapse {
display: flex;
flex-direction: column;
align-items: stretch;
border-top: 1px solid var(--jp-border-color2);
border-bottom: 1px solid var(--jp-border-color2);
}
.jp-Collapse-header {
padding: 1px 12px;
color: var(--jp-ui-font-color1);
background-color: var(--jp-layout-color1);
font-size: var(--jp-ui-font-size2);
}
.jp-Collapse-header:hover {
background-color: var(--jp-layout-color2);
}
.jp-Collapse-contents {
padding: 0px 12px 0px 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.
|----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
| Variables
|----------------------------------------------------------------------------*/
:root {
--jp-private-commandpalette-search-height: 28px;
}
/*-----------------------------------------------------------------------------
| Overall styles
|----------------------------------------------------------------------------*/
.lm-CommandPalette {
padding-bottom: 0px;
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: 0px 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 5px;
}
.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: 0px;
}
.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 .lm-CommandPalette-itemLabel > mark {
color: var(--jp-ui-inverse-font-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: 0px 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: 0px;
left: 0px;
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;
padding-bottom: 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-button {
overflow: visible;
}
button.jp-Dialog-button:focus {
outline: 1px solid var(--jp-brand-color1);
outline-offset: 4px;
-moz-outline-radius: 0px;
}
button.jp-Dialog-button:focus::-moz-focus-inner {
border: 0;
}
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-color0);
}
.jp-Dialog-body {
display: flex;
flex-direction: column;
flex: 1 1 auto;
font-size: var(--jp-ui-font-size1);
background: var(--jp-layout-color1);
overflow: auto;
}
.jp-Dialog-footer {
display: flex;
flex-direction: row;
justify-content: flex-end;
flex: 0 0 auto;
margin-left: -12px;
margin-right: -12px;
padding: 12px;
}
.jp-Dialog-title {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.jp-Dialog-body > .jp-select-wrapper {
width: 100%;
}
.jp-Dialog-body > button {
padding: 0px 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) 2014-2016, Jupyter Development Team.
|
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
.jp-HoverBox {
position: fixed;
}
.jp-HoverBox.jp-mod-outofview {
display: none;
}
/*-----------------------------------------------------------------------------
| 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, `p-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;
}
.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;
}
/**
* 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: #aa00ff;
--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: #ffff00;
--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: #eeeeee;
--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) 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 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: 0px 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-FileDialog-Checkbox {
margin-top: 35px;
display: flex;
flex-direction: row;
align-items: end;
width: 100%;
}
.jp-FileDialog-Checkbox > label {
flex: 1 1 auto;
}
.jp-select-wrapper {
display: flex;
position: relative;
flex-direction: column;
padding: 1px;
background-color: var(--jp-layout-color1);
height: 28px;
box-sizing: border-box;
margin-bottom: 12px;
}
.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 {
background-color: var(--jp-layout-color1);
cursor: pointer;
color: var(--jp-ui-font-color0);
background-color: var(--jp-input-hover-background);
box-shadow: inset 0 0px 1px rgba(0, 0, 0, 0.5);
}
select.jp-mod-styled {
flex: 1 1 auto;
height: 32px;
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: 0px;
outline: none;
appearance: none;
-webkit-appearance: none;
-moz-appearance: none;
}
/*-----------------------------------------------------------------------------
| 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: 1;
overflow-x: auto;
}
/* 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: 0px;
margin: 0px;
}
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: 0px 6px;
margin: 0px;
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: 0px;
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);
}
#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) 2014-2017, 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.
|----------------------------------------------------------------------------*/
/* <DEPRECATED> */ body.p-mod-override-cursor *, /* </DEPRECATED> */
body.lm-mod-override-cursor * {
cursor: inherit !important;
}
/*-----------------------------------------------------------------------------
| 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: 0px;
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);
}
/* BASICS */
.CodeMirror {
/* Set height, width, borders, and global font properties here */
font-family: monospace;
height: 300px;
color: black;
direction: ltr;
}
/* PADDING */
.CodeMirror-lines {
padding: 4px 0; /* Vertical padding around content */
}
.CodeMirror pre.CodeMirror-line,
.CodeMirror pre.CodeMirror-line-like {
padding: 0 4px; /* Horizontal padding of content */
}
.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
background-color: white; /* The little square between H and V scrollbars */
}
/* GUTTER */
.CodeMirror-gutters {
border-right: 1px solid #ddd;
background-color: #f7f7f7;
white-space: nowrap;
}
.CodeMirror-linenumbers {}
.CodeMirror-linenumber {
padding: 0 3px 0 5px;
min-width: 20px;
text-align: right;
color: #999;
white-space: nowrap;
}
.CodeMirror-guttermarker { color: black; }
.CodeMirror-guttermarker-subtle { color: #999; }
/* CURSOR */
.CodeMirror-cursor {
border-left: 1px solid black;
border-right: none;
width: 0;
}
/* Shown when moving in bi-directional text */
.CodeMirror div.CodeMirror-secondarycursor {
border-left: 1px solid silver;
}
.cm-fat-cursor .CodeMirror-cursor {
width: auto;
border: 0 !important;
background: #7e7;
}
.cm-fat-cursor div.CodeMirror-cursors {
z-index: 1;
}
.cm-fat-cursor-mark {
background-color: rgba(20, 255, 20, 0.5);
-webkit-animation: blink 1.06s steps(1) infinite;
-moz-animation: blink 1.06s steps(1) infinite;
animation: blink 1.06s steps(1) infinite;
}
.cm-animate-fat-cursor {
width: auto;
border: 0;
-webkit-animation: blink 1.06s steps(1) infinite;
-moz-animation: blink 1.06s steps(1) infinite;
animation: blink 1.06s steps(1) infinite;
background-color: #7e7;
}
@-moz-keyframes blink {
0% {}
50% { background-color: transparent; }
100% {}
}
@-webkit-keyframes blink {
0% {}
50% { background-color: transparent; }
100% {}
}
@keyframes blink {
0% {}
50% { background-color: transparent; }
100% {}
}
/* Can style cursor different in overwrite (non-insert) mode */
.CodeMirror-overwrite .CodeMirror-cursor {}
.cm-tab { display: inline-block; text-decoration: inherit; }
.CodeMirror-rulers {
position: absolute;
left: 0; right: 0; top: -50px; bottom: 0;
overflow: hidden;
}
.CodeMirror-ruler {
border-left: 1px solid #ccc;
top: 0; bottom: 0;
position: absolute;
}
/* DEFAULT THEME */
.cm-s-default .cm-header {color: blue;}
.cm-s-default .cm-quote {color: #090;}
.cm-negative {color: #d44;}
.cm-positive {color: #292;}
.cm-header, .cm-strong {font-weight: bold;}
.cm-em {font-style: italic;}
.cm-link {text-decoration: underline;}
.cm-strikethrough {text-decoration: line-through;}
.cm-s-default .cm-keyword {color: #708;}
.cm-s-default .cm-atom {color: #219;}
.cm-s-default .cm-number {color: #164;}
.cm-s-default .cm-def {color: #00f;}
.cm-s-default .cm-variable,
.cm-s-default .cm-punctuation,
.cm-s-default .cm-property,
.cm-s-default .cm-operator {}
.cm-s-default .cm-variable-2 {color: #05a;}
.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;}
.cm-s-default .cm-comment {color: #a50;}
.cm-s-default .cm-string {color: #a11;}
.cm-s-default .cm-string-2 {color: #f50;}
.cm-s-default .cm-meta {color: #555;}
.cm-s-default .cm-qualifier {color: #555;}
.cm-s-default .cm-builtin {color: #30a;}
.cm-s-default .cm-bracket {color: #997;}
.cm-s-default .cm-tag {color: #170;}
.cm-s-default .cm-attribute {color: #00c;}
.cm-s-default .cm-hr {color: #999;}
.cm-s-default .cm-link {color: #00c;}
.cm-s-default .cm-error {color: #f00;}
.cm-invalidchar {color: #f00;}
.CodeMirror-composing { border-bottom: 2px solid; }
/* Default styles for common addons */
div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;}
div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;}
.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
.CodeMirror-activeline-background {background: #e8f2ff;}
/* STOP */
/* The rest of this file contains styles related to the mechanics of
the editor. You probably shouldn't touch them. */
.CodeMirror {
position: relative;
overflow: hidden;
background: white;
}
.CodeMirror-scroll {
overflow: scroll !important; /* Things will break if this is overridden */
/* 50px is the magic margin used to hide the element's real scrollbars */
/* See overflow: hidden in .CodeMirror */
margin-bottom: -50px; margin-right: -50px;
padding-bottom: 50px;
height: 100%;
outline: none; /* Prevent dragging from highlighting the element */
position: relative;
}
.CodeMirror-sizer {
position: relative;
border-right: 50px solid transparent;
}
/* The fake, visible scrollbars. Used to force redraw during scrolling
before actual scrolling happens, thus preventing shaking and
flickering artifacts. */
.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
position: absolute;
z-index: 6;
display: none;
outline: none;
}
.CodeMirror-vscrollbar {
right: 0; top: 0;
overflow-x: hidden;
overflow-y: scroll;
}
.CodeMirror-hscrollbar {
bottom: 0; left: 0;
overflow-y: hidden;
overflow-x: scroll;
}
.CodeMirror-scrollbar-filler {
right: 0; bottom: 0;
}
.CodeMirror-gutter-filler {
left: 0; bottom: 0;
}
.CodeMirror-gutters {
position: absolute; left: 0; top: 0;
min-height: 100%;
z-index: 3;
}
.CodeMirror-gutter {
white-space: normal;
height: 100%;
display: inline-block;
vertical-align: top;
margin-bottom: -50px;
}
.CodeMirror-gutter-wrapper {
position: absolute;
z-index: 4;
background: none !important;
border: none !important;
}
.CodeMirror-gutter-background {
position: absolute;
top: 0; bottom: 0;
z-index: 4;
}
.CodeMirror-gutter-elt {
position: absolute;
cursor: default;
z-index: 4;
}
.CodeMirror-gutter-wrapper ::selection { background-color: transparent }
.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent }
.CodeMirror-lines {
cursor: text;
min-height: 1px; /* prevents collapsing before first draw */
}
.CodeMirror pre.CodeMirror-line,
.CodeMirror pre.CodeMirror-line-like {
/* Reset some styles that the rest of the page might have set */
-moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
border-width: 0;
background: transparent;
font-family: inherit;
font-size: inherit;
margin: 0;
white-space: pre;
word-wrap: normal;
line-height: inherit;
color: inherit;
z-index: 2;
position: relative;
overflow: visible;
-webkit-tap-highlight-color: transparent;
-webkit-font-variant-ligatures: contextual;
font-variant-ligatures: contextual;
}
.CodeMirror-wrap pre.CodeMirror-line,
.CodeMirror-wrap pre.CodeMirror-line-like {
word-wrap: break-word;
white-space: pre-wrap;
word-break: normal;
}
.CodeMirror-linebackground {
position: absolute;
left: 0; right: 0; top: 0; bottom: 0;
z-index: 0;
}
.CodeMirror-linewidget {
position: relative;
z-index: 2;
padding: 0.1px; /* Force widget margins to stay inside of the container */
}
.CodeMirror-widget {}
.CodeMirror-rtl pre { direction: rtl; }
.CodeMirror-code {
outline: none;
}
/* Force content-box sizing for the elements where we expect it */
.CodeMirror-scroll,
.CodeMirror-sizer,
.CodeMirror-gutter,
.CodeMirror-gutters,
.CodeMirror-linenumber {
-moz-box-sizing: content-box;
box-sizing: content-box;
}
.CodeMirror-measure {
position: absolute;
width: 100%;
height: 0;
overflow: hidden;
visibility: hidden;
}
.CodeMirror-cursor {
position: absolute;
pointer-events: none;
}
.CodeMirror-measure pre { position: static; }
div.CodeMirror-cursors {
visibility: hidden;
position: relative;
z-index: 3;
}
div.CodeMirror-dragcursors {
visibility: visible;
}
.CodeMirror-focused div.CodeMirror-cursors {
visibility: visible;
}
.CodeMirror-selected { background: #d9d9d9; }
.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
.CodeMirror-crosshair { cursor: crosshair; }
.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }
.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }
.cm-searching {
background-color: #ffa;
background-color: rgba(255, 255, 0, .4);
}
/* Used to force a border model for a node */
.cm-force-border { padding-right: .1px; }
@media print {
/* Hide the cursor when printing */
.CodeMirror div.CodeMirror-cursors {
visibility: hidden;
}
}
/* See issue #2901 */
.cm-tab-wrap-hack:after { content: ''; }
/* Help users use markselection to safely style text background */
span.CodeMirror-selectedtext { background: none; }
.CodeMirror-dialog {
position: absolute;
left: 0; right: 0;
background: inherit;
z-index: 15;
padding: .1em .8em;
overflow: hidden;
color: inherit;
}
.CodeMirror-dialog-top {
border-bottom: 1px solid #eee;
top: 0;
}
.CodeMirror-dialog-bottom {
border-top: 1px solid #eee;
bottom: 0;
}
.CodeMirror-dialog input {
border: none;
outline: none;
background: transparent;
width: 20em;
color: inherit;
font-family: monospace;
}
.CodeMirror-dialog button {
font-size: 70%;
}
.CodeMirror-foldmarker {
color: blue;
text-shadow: #b9f 1px 1px 2px, #b9f -1px -1px 2px, #b9f 1px -1px 2px, #b9f -1px 1px 2px;
font-family: arial;
line-height: .3;
cursor: pointer;
}
.CodeMirror-foldgutter {
width: .7em;
}
.CodeMirror-foldgutter-open,
.CodeMirror-foldgutter-folded {
cursor: pointer;
}
.CodeMirror-foldgutter-open:after {
content: "\25BE";
}
.CodeMirror-foldgutter-folded:after {
content: "\25B8";
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
.CodeMirror {
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 */
}
.CodeMirror pre {
padding: 0 var(--jp-code-padding);
}
.jp-CodeMirrorEditor[data-type='inline'] .CodeMirror-dialog {
background-color: var(--jp-layout-color0);
color: var(--jp-content-font-color1);
}
/* This causes https://github.com/jupyter/jupyterlab/issues/522 */
/* May not cause it not because we changed it! */
.CodeMirror-lines {
padding: var(--jp-code-padding) 0;
}
.CodeMirror-linenumber {
padding: 0 8px;
}
.jp-CodeMirrorEditor {
cursor: text;
}
.jp-CodeMirrorEditor[data-type='inline'] .CodeMirror-cursor {
border-left: var(--jp-code-cursor-width0) solid var(--jp-editor-cursor-color);
}
/* 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'] .CodeMirror-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'] .CodeMirror-cursor {
border-left: var(--jp-code-cursor-width2) solid
var(--jp-editor-cursor-color);
}
}
.CodeMirror.jp-mod-readOnly .CodeMirror-cursor {
display: none;
}
.CodeMirror-gutters {
border-right: 1px solid var(--jp-border-color2);
background-color: var(--jp-layout-color0);
}
.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;
}
.CodeMirror-selectedtext.cm-searching {
background-color: var(--jp-search-selected-match-background-color) !important;
color: var(--jp-search-selected-match-color) !important;
}
.cm-searching {
background-color: var(
--jp-search-unselected-match-background-color
) !important;
color: var(--jp-search-unselected-match-color) !important;
}
.CodeMirror-focused .CodeMirror-selected {
background-color: var(--jp-editor-selected-focused-background);
}
.CodeMirror-selected {
background-color: var(--jp-editor-selected-background);
}
.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);
}
/**
* Here is our jupyter theme for CodeMirror syntax highlighting
* This is used in our marked.js syntax highlighting and CodeMirror itself
* The string "jupyter" is set in ../codemirror/widget.DEFAULT_CODEMIRROR_THEME
* This came from the classic notebook, which came form highlight.js/GitHub
*/
/**
* CodeMirror themes are handling the background/color in this way. This works
* fine for CodeMirror editors outside the notebook, but the notebook styles
* these things differently.
*/
.CodeMirror.cm-s-jupyter {
background: var(--jp-layout-color0);
color: var(--jp-content-font-color1);
}
/* In the notebook, we want this styling to be handled by its container */
.jp-CodeConsole .CodeMirror.cm-s-jupyter,
.jp-Notebook .CodeMirror.cm-s-jupyter {
background: transparent;
}
.cm-s-jupyter .CodeMirror-cursor {
border-left: var(--jp-code-cursor-width0) solid var(--jp-editor-cursor-color);
}
.cm-s-jupyter span.cm-keyword {
color: var(--jp-mirror-editor-keyword-color);
font-weight: bold;
}
.cm-s-jupyter span.cm-atom {
color: var(--jp-mirror-editor-atom-color);
}
.cm-s-jupyter span.cm-number {
color: var(--jp-mirror-editor-number-color);
}
.cm-s-jupyter span.cm-def {
color: var(--jp-mirror-editor-def-color);
}
.cm-s-jupyter span.cm-variable {
color: var(--jp-mirror-editor-variable-color);
}
.cm-s-jupyter span.cm-variable-2 {
color: var(--jp-mirror-editor-variable-2-color);
}
.cm-s-jupyter span.cm-variable-3 {
color: var(--jp-mirror-editor-variable-3-color);
}
.cm-s-jupyter span.cm-punctuation {
color: var(--jp-mirror-editor-punctuation-color);
}
.cm-s-jupyter span.cm-property {
color: var(--jp-mirror-editor-property-color);
}
.cm-s-jupyter span.cm-operator {
color: var(--jp-mirror-editor-operator-color);
font-weight: bold;
}
.cm-s-jupyter span.cm-comment {
color: var(--jp-mirror-editor-comment-color);
font-style: italic;
}
.cm-s-jupyter span.cm-string {
color: var(--jp-mirror-editor-string-color);
}
.cm-s-jupyter span.cm-string-2 {
color: var(--jp-mirror-editor-string-2-color);
}
.cm-s-jupyter span.cm-meta {
color: var(--jp-mirror-editor-meta-color);
}
.cm-s-jupyter span.cm-qualifier {
color: var(--jp-mirror-editor-qualifier-color);
}
.cm-s-jupyter span.cm-builtin {
color: var(--jp-mirror-editor-builtin-color);
}
.cm-s-jupyter span.cm-bracket {
color: var(--jp-mirror-editor-bracket-color);
}
.cm-s-jupyter span.cm-tag {
color: var(--jp-mirror-editor-tag-color);
}
.cm-s-jupyter span.cm-attribute {
color: var(--jp-mirror-editor-attribute-color);
}
.cm-s-jupyter span.cm-header {
color: var(--jp-mirror-editor-header-color);
}
.cm-s-jupyter span.cm-quote {
color: var(--jp-mirror-editor-quote-color);
}
.cm-s-jupyter span.cm-link {
color: var(--jp-mirror-editor-link-color);
}
.cm-s-jupyter span.cm-error {
color: var(--jp-mirror-editor-error-color);
}
.cm-s-jupyter span.cm-hr {
color: #999;
}
.cm-s-jupyter span.cm-tab {
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAMCAYAAAAkuj5RAAAAAXNSR0IArs4c6QAAAGFJREFUSMft1LsRQFAQheHPowAKoACx3IgEKtaEHujDjORSgWTH/ZOdnZOcM/sgk/kFFWY0qV8foQwS4MKBCS3qR6ixBJvElOobYAtivseIE120FaowJPN75GMu8j/LfMwNjh4HUpwg4LUAAAAASUVORK5CYII=);
background-position: right;
background-repeat: no-repeat;
}
.cm-s-jupyter .CodeMirror-activeline-background,
.cm-s-jupyter .CodeMirror-gutter {
background-color: var(--jp-layout-color2);
}
/* Styles for shared cursors (remote cursor locations and selected ranges) */
.jp-CodeMirrorEditor .remote-caret {
position: relative;
border-left: 2px solid black;
margin-left: -1px;
margin-right: -1px;
box-sizing: border-box;
}
.jp-CodeMirrorEditor .remote-caret > div {
white-space: nowrap;
position: absolute;
top: -1.15em;
padding-bottom: 0.05em;
left: -2px;
font-size: 0.95em;
background-color: rgb(250, 129, 0);
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: 3;
transition: opacity 0.3s ease-in-out;
}
.jp-CodeMirrorEditor .remote-caret.hide-name > div {
transition-delay: 0.7s;
opacity: 0;
}
.jp-CodeMirrorEditor .remote-caret:hover > div {
opacity: 1;
transition-delay: 0s;
}
/*-----------------------------------------------------------------------------
| 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: 0px;
padding: 0px;
}
.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 */
.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: 0em;
}
.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: 12px;
table-layout: fixed;
margin-left: auto;
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 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 table {
margin-bottom: 1em;
}
.jp-RenderedHTMLCommon p {
text-align: left;
margin: 0px;
}
.jp-RenderedHTMLCommon p {
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);
}
/* ...or leave it untouched if they don't */
[data-jp-theme-light='false'] .jp-RenderedImage img.jp-needs-dark-background {
}
[data-jp-theme-light='true'] .jp-RenderedImage img.jp-needs-light-background {
}
.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: 0.8em;
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.
|----------------------------------------------------------------------------*/
.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 {
display: flex;
flex-direction: column;
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);
}
.jp-FileBrowser-toolbar.jp-Toolbar {
border-bottom: none;
height: auto;
margin: var(--jp-toolbar-header-margin);
box-shadow: none;
}
.jp-BreadCrumbs {
flex: 0 0 auto;
margin: 8px 12px 8px 12px;
}
.jp-BreadCrumbs-item {
margin: 0px 2px;
padding: 0px 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: 0px;
}
.jp-BreadCrumbs-item.jp-mod-dropTarget {
background-color: var(--jp-brand-color2);
opacity: 0.7;
}
/*-----------------------------------------------------------------------------
| Buttons
|----------------------------------------------------------------------------*/
.jp-FileBrowser-toolbar.jp-Toolbar {
padding: 0px;
margin: 8px 12px 0px 12px;
}
.jp-FileBrowser-toolbar.jp-Toolbar {
justify-content: flex-start;
}
.jp-FileBrowser-toolbar.jp-Toolbar .jp-Toolbar-item {
flex: 0 0 auto;
padding-left: 0px;
padding-right: 2px;
}
.jp-FileBrowser-toolbar.jp-Toolbar .jp-ToolbarButtonComponent {
width: 40px;
}
.jp-FileBrowser-toolbar.jp-Toolbar
.jp-Toolbar-item:first-child
.jp-ToolbarButtonComponent {
width: 72px;
background: var(--jp-brand-color1);
}
.jp-FileBrowser-toolbar.jp-Toolbar
.jp-Toolbar-item:first-child
.jp-ToolbarButtonComponent:focus-visible {
background-color: var(--jp-brand-color0);
}
.jp-FileBrowser-toolbar.jp-Toolbar
.jp-Toolbar-item:first-child
.jp-ToolbarButtonComponent
.jp-icon3 {
fill: white;
}
/*-----------------------------------------------------------------------------
| 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-FileBrowser-filterBox {
padding: 0px;
flex: 0 0 auto;
margin: 8px 12px 0px 12px;
}
/*-----------------------------------------------------------------------------
| DirListing
|----------------------------------------------------------------------------*/
.jp-DirListing {
flex: 1 1 auto;
display: flex;
flex-direction: column;
outline: 0;
}
.jp-DirListing:focus-visible {
border: 1px solid var(--jp-brand-color1);
}
.jp-DirListing-header {
flex: 0 0 auto;
display: flex;
flex-direction: row;
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 12px;
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-id-narrow {
display: none;
flex: 0 0 5px;
padding: 4px 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;
padding: 4px 12px;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.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-itemModified {
flex: 0 0 125px;
text-align: right;
}
.jp-DirListing-editor {
flex: 1 0 64px;
outline: none;
border: none;
}
.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: 0px;
color: var(--jp-ui-font-color1);
transform: translateX(-40%) translateY(-58%);
}
.jp-DirListing-deadSpace {
flex: 1 1 auto;
margin: 0;
padding: 0;
list-style-type: none;
overflow: auto;
background-color: var(--jp-layout-color1);
}
.jp-Document {
min-width: 120px;
min-height: 120px;
outline: none;
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
| Private CSS variables
|----------------------------------------------------------------------------*/
:root {
}
/*-----------------------------------------------------------------------------
| Main OutputArea
| OutputArea has a list of Outputs
|----------------------------------------------------------------------------*/
.jp-OutputArea {
overflow-y: auto;
}
.jp-OutputArea-child {
display: flex;
flex-direction: row;
}
body[data-format='mobile'] .jp-OutputArea-child {
flex-direction: column;
}
.jp-OutputPrompt {
flex: 0 0 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;
}
body[data-format='mobile'] .jp-OutputPrompt {
flex: 0 0 auto;
text-align: left;
}
.jp-OutputArea-output {
height: auto;
overflow: auto;
user-select: text;
-moz-user-select: text;
-webkit-user-select: text;
-ms-user-select: text;
}
.jp-OutputArea-child .jp-OutputArea-output {
flex-grow: 1;
flex-shrink: 1;
}
body[data-format='mobile'] .jp-OutputArea-child .jp-OutputArea-output {
margin-left: var(--jp-notebook-padding);
}
/**
* Isolated output.
*/
.jp-OutputArea-output.jp-mod-isolated {
width: 100%;
display: block;
}
/*
When drag events occur, `p-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: 0px;
padding: 0px;
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;
}
/* 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;
}
/*-----------------------------------------------------------------------------
| 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: 0px;
flex: 1 1 auto;
}
/* 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-OutputArea-stdin {
line-height: var(--jp-code-line-height);
padding-top: var(--jp-code-padding);
display: flex;
}
.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: 0em 0.25em;
margin: 0em 0.25em;
flex: 0 0 70%;
}
.jp-Stdin-input:focus {
box-shadow: none;
}
/*-----------------------------------------------------------------------------
| Output Area View
|----------------------------------------------------------------------------*/
.jp-LinkedOutputView .jp-OutputArea {
height: 100%;
display: block;
}
.jp-LinkedOutputView .jp-OutputArea-output:only-child {
height: 100%;
}
/*-----------------------------------------------------------------------------
| 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: 0px;
margin: 0px;
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: 0px;
bottom: 0px;
}
/*-----------------------------------------------------------------------------
| 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: 0px;
width: 100%;
padding: 0px;
margin: 0px;
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: flex;
flex-direction: row;
overflow: hidden;
}
body[data-format='mobile'] .jp-InputArea {
flex-direction: column;
}
.jp-InputArea-editor {
flex: 1 1 auto;
overflow: hidden;
}
.jp-InputArea-editor {
/* This is the non-active, default styling */
border: var(--jp-border-width) solid var(--jp-cell-editor-border-color);
border-radius: 0px;
background: var(--jp-cell-editor-background);
}
body[data-format='mobile'] .jp-InputArea-editor {
margin-left: var(--jp-notebook-padding);
}
.jp-InputPrompt {
flex: 0 0 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;
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;
}
body[data-format='mobile'] .jp-InputPrompt {
flex: 0 0 auto;
text-align: left;
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
| Placeholder
|----------------------------------------------------------------------------*/
.jp-Placeholder {
display: flex;
flex-direction: row;
flex: 1 1 auto;
}
.jp-Placeholder-prompt {
box-sizing: border-box;
}
.jp-Placeholder-content {
flex: 1 1 auto;
border: none;
background: transparent;
height: 20px;
box-sizing: border-box;
}
.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: 0px 0px 2px 0px rgba(0, 0, 0, 0.25);
background-color: var(--jp-layout-color0);
}
/*-----------------------------------------------------------------------------
| 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: 0px;
border: none;
outline: none;
background: transparent;
}
/*-----------------------------------------------------------------------------
| Common input/output
|----------------------------------------------------------------------------*/
.jp-Cell-inputWrapper,
.jp-Cell-outputWrapper {
display: flex;
flex-direction: row;
padding: 0px;
margin: 0px;
/* 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: 200px;
box-shadow: inset 0 0 6px 2px rgba(0, 0, 0, 0.3);
margin-left: var(--jp-private-cell-scrolling-output-offset);
}
.jp-CodeCell.jp-mod-outputsScrolled .jp-OutputArea-prompt {
flex: 0 0
calc(
var(--jp-cell-prompt-width) -
var(--jp-private-cell-scrolling-output-offset)
);
}
/*-----------------------------------------------------------------------------
| CodeCell
|----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
| MarkdownCell
|----------------------------------------------------------------------------*/
.jp-MarkdownOutput {
flex: 1 1 auto;
margin-top: 0;
margin-bottom: 0;
padding-left: var(--jp-code-padding);
}
.jp-MarkdownOutput.jp-RenderedHTMLCommon {
overflow: auto;
}
.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;
}
.jp-showHiddenCellsButton:hover {
background-color: var(--jp-border-color2) !important;
}
.jp-collapseHeadingButton {
display: none;
}
.jp-MarkdownCell:hover .jp-collapseHeadingButton {
display: flex;
min-height: var(--jp-cell-collapser-min-height);
position: absolute;
right: 0;
top: 0;
bottom: 0;
}
/*-----------------------------------------------------------------------------
| 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
|----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
/*-----------------------------------------------------------------------------
| Styles
|----------------------------------------------------------------------------*/
.jp-NotebookPanel-toolbar {
padding: 2px;
}
.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;
}
/*-----------------------------------------------------------------------------
| Copyright (c) Jupyter Development Team.
| Distributed under the terms of the Modified BSD License.
|----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
| Private CSS variables
|----------------------------------------------------------------------------*/
:root {
--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);
}
/*-----------------------------------------------------------------------------
| Imports
|----------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
| Notebook
|----------------------------------------------------------------------------*/
.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-render * {
contain: none !important;
}
.jp-Notebook .jp-Cell {
overflow: visible;
}
.jp-Notebook .jp-Cell .jp-InputPrompt {
cursor: move;
float: left;
}
/*-----------------------------------------------------------------------------
| 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 0px 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 0px;
}
.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 0px 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-NotebookTools-tool {
padding: 0px 12px 0 12px;
}
.jp-ActiveCellTool {
padding: 12px;
background-color: var(--jp-layout-color1);
border-top: none !important;
}
.jp-ActiveCellTool .jp-InputArea-prompt {
flex: 0 0 auto;
padding-left: 0px;
}
.jp-ActiveCellTool .jp-InputArea-editor {
flex: 1 1 auto;
background: var(--jp-cell-editor-background);
border-color: var(--jp-cell-editor-border-color);
}
.jp-ActiveCellTool .jp-InputArea-editor .CodeMirror {
background: transparent;
}
.jp-MetadataEditorTool {
flex-direction: column;
padding: 12px 0px 12px 0px;
}
.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 {
line-height: 1.4;
}
.jp-NotebookTools .jp-select-wrapper {
margin-top: 4px;
margin-bottom: 0px;
}
.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;
}
/*-----------------------------------------------------------------------------
| 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: relative;
}
.jp-Cell-Placeholder-wrapper-body div {
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: 0px 2px 1px -1px var(--jp-shadow-umbra-color),
0px 1px 1px 0px var(--jp-shadow-penumbra-color),
0px 1px 3px 0px var(--jp-shadow-ambient-color);
--jp-elevation-z2: 0px 3px 1px -2px var(--jp-shadow-umbra-color),
0px 2px 2px 0px var(--jp-shadow-penumbra-color),
0px 1px 5px 0px var(--jp-shadow-ambient-color);
--jp-elevation-z4: 0px 2px 4px -1px var(--jp-shadow-umbra-color),
0px 4px 5px 0px var(--jp-shadow-penumbra-color),
0px 1px 10px 0px var(--jp-shadow-ambient-color);
--jp-elevation-z6: 0px 3px 5px -1px var(--jp-shadow-umbra-color),
0px 6px 10px 0px var(--jp-shadow-penumbra-color),
0px 1px 18px 0px var(--jp-shadow-ambient-color);
--jp-elevation-z8: 0px 5px 5px -3px var(--jp-shadow-umbra-color),
0px 8px 10px 1px var(--jp-shadow-penumbra-color),
0px 3px 14px 2px var(--jp-shadow-ambient-color);
--jp-elevation-z12: 0px 7px 8px -4px var(--jp-shadow-umbra-color),
0px 12px 17px 2px var(--jp-shadow-penumbra-color),
0px 5px 22px 4px var(--jp-shadow-ambient-color);
--jp-elevation-z16: 0px 8px 10px -5px var(--jp-shadow-umbra-color),
0px 16px 24px 2px var(--jp-shadow-penumbra-color),
0px 6px 30px 5px var(--jp-shadow-ambient-color);
--jp-elevation-z20: 0px 10px 13px -6px var(--jp-shadow-umbra-color),
0px 20px 31px 3px var(--jp-shadow-penumbra-color),
0px 8px 38px 7px var(--jp-shadow-ambient-color);
--jp-elevation-z24: 0px 11px 15px -7px var(--jp-shadow-umbra-color),
0px 24px 38px 3px var(--jp-shadow-penumbra-color),
0px 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-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: -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-700);
--jp-content-font-family: -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: 10px;
--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: #111111;
--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: 0px;
--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: 0px 0px 2px 0px rgba(0, 0, 0, 0.24);
--jp-toolbar-header-margin: 4px 4px 0px 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-border-color1);
--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: #05a;
--jp-mirror-editor-variable-3-color: #085;
--jp-mirror-editor-punctuation-color: #05a;
--jp-mirror-editor-property-color: #05a;
--jp-mirror-editor-operator-color: #aa22ff;
--jp-mirror-editor-comment-color: #408080;
--jp-mirror-editor-string-color: #ba2121;
--jp-mirror-editor-string-2-color: #708;
--jp-mirror-editor-meta-color: #aa22ff;
--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;
/* 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);
}
</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;
}
.CodeMirror.cm-s-jupyter .highlight pre {
/* weird, but --jp-code-padding defined to be 5px but 4px horizontal padding is hardcoded for pre.CodeMirror-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);
}
/* Using table instead of flexbox so that we can use break-inside property */
/* CSS rules under this comment should not be required anymore after we move to the JupyterLab 4.0 CSS */
.jp-CodeCell.jp-mod-outputsScrolled .jp-OutputArea-prompt {
min-width: calc(
var(--jp-cell-prompt-width) - var(--jp-private-cell-scrolling-output-offset)
);
}
.jp-OutputArea-child {
display: table;
width: 100%;
}
.jp-OutputPrompt {
display: table-cell;
vertical-align: top;
min-width: var(--jp-cell-prompt-width);
}
body[data-format='mobile'] .jp-OutputPrompt {
display: table-row;
}
.jp-OutputArea-output {
display: table-cell;
width: 100%;
}
body[data-format='mobile'] .jp-OutputArea-child .jp-OutputArea-output {
display: table-row;
}
.jp-OutputArea-output.jp-OutputArea-executeResult {
width: 100%;
}
/* 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;
}
.jp-OutputArea-child {
break-inside: avoid-page;
}
}
</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 --></head>
<body class="jp-Notebook" data-jp-theme-light="true" data-jp-theme-name="JupyterLab Light">
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=500fa050">
<div class="jp-Cell-inputWrapper">
<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 is the HTML rendering of the Jupyter notebook that can be
found in <a href="https://github.com/holdenweb/descriptors">this repository</a>.</p>
<h2 id="Understanding-Descriptors">Understanding Descriptors<a class="anchor-link" href="#Understanding-Descriptors">¶</a></h2><p>This notebook introduces the concepts behind descriptors.</p>
<p>The descriptor underlies much of the Python language's sophistication
but the mechanism behind it remains little known.</p>
<p>If you install the <a href="https://rise.readthedocs.io/en/latest/">RISE extension</a>
it also displays as slides.</p>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=3bc71e17">
<div class="jp-Cell-inputWrapper">
<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="Unqualified-name-access">Unqualified name access<a class="anchor-link" href="#Unqualified-name-access">¶</a></h3>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=93c44291">
<div class="jp-Cell-inputWrapper">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
<p>The interpreter looks in:</p>
<ol>
<li>The current function's local namespace.</li>
</ol>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=bd45d950">
<div class="jp-Cell-inputWrapper">
<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">
<ol start="2">
<li>The namespace of the module containing the function (the global namespace).</li>
</ol>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=c1fa1812">
<div class="jp-Cell-inputWrapper">
<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">
<ol start="3">
<li>The built-in namespace.</li>
</ol>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=1258f42f">
<div class="jp-Cell-inputWrapper">
<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 the name is not found, the interpreter raises a <code>NameError</code> exception.</p>
<p>When functions and/or classes are lexically nested within each other this
creates certain complexities with locality, which need not detain us here.</p>
<p>We begin at the point where we've looked up a name
and have a reference to some object <code>o</code>.</p>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=f27e0a0a">
<div class="jp-Cell-inputWrapper">
<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="Attribute-access">Attribute access<a class="anchor-link" href="#Attribute-access">¶</a></h3>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=c1d8e1b4">
<div class="jp-Cell-inputWrapper">
<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>To evaluate an expression such as <code>o.x</code>
the interpreter first resolves the unqualified name <code>o</code>
by the means described above.</p>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=78ed1751">
<div class="jp-Cell-inputWrapper">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
<p><strong>To a first approximation</strong>, it then looks for the name <code>x</code></p>
<ol>
<li>in the namespace associated with <code>o</code>
(usually referenceable as <code>o.__dict__</code>)</li>
<li>in the namespace of the object's class</li>
<li>in the class's superclass</li>
<li>in the superclass's superclass ...</li>
</ol>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=1d823b91">
<div class="jp-Cell-inputWrapper">
<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>... and so on all the way up to <code>object</code>.
If the search fails, the interpreter raises
an <code>AttributeError</code> exception.</p>
<p>As we'll see, this isn't the whole story!</p>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=c2578c9e">
<div class="jp-Cell-inputWrapper">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
<p>The built-in <code>dir</code> function conveniently bundles
together all (or most of) the names accessible in
an object's namespace.</p>
<p>Because many of the various <em>dunder
names</em> (those of the form <code>__name__</code>)
are inherited from <code>object</code> I've written
a convenience function to omit them.</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs " id="cell-id=cceb98af">
<div class="jp-Cell-inputWrapper">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea">
<div class="jp-InputPrompt jp-InputArea-prompt">In [1]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">names</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
<span class="s2">"Return a list of all accessible names except dunders."</span>
<span class="k">return</span> <span class="p">[</span><span class="n">n</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">dir</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="n">n</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">'__'</span><span class="p">)</span>
<span class="ow">and</span> <span class="n">n</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">'__'</span><span class="p">))]</span>
</pre></div>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=8b4787ed">
<div class="jp-Cell-inputWrapper">
<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>Here's a simple class that has
one class variable and one instance variable.</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs " id="cell-id=7d7f71fc">
<div class="jp-Cell-inputWrapper">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea">
<div class="jp-InputPrompt jp-InputArea-prompt">In [2]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">class</span> <span class="nc">DemoObject</span><span class="p">:</span>
<span class="n">c</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">42</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">v</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">v</span> <span class="o">=</span> <span class="n">v</span>
<span class="n">o</span> <span class="o">=</span> <span class="n">DemoObject</span><span class="p">(</span><span class="mi">21</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=5ffcc3be">
<div class="jp-Cell-inputWrapper">
<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>Because of the name search protocol described above
you can <em>reference</em> class attributes as though they
were instance attributes.</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=269dd87d">
<div class="jp-Cell-inputWrapper">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea">
<div class="jp-InputPrompt jp-InputArea-prompt">In [3]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">o</span><span class="o">.</span><span class="n">v</span><span class="p">,</span> <span class="n">o</span><span class="o">.</span><span class="n">c</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[3]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>(21, 42)</pre>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=2792979c">
<div class="jp-Cell-inputWrapper">
<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>Some attributes appear in the instance's <code>__dict__</code>,
others appear in the class's.</p>
<p>It all depends how the assignment is made.</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=adbfe5e0">
<div class="jp-Cell-inputWrapper">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea">
<div class="jp-InputPrompt jp-InputArea-prompt">In [4]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">DemoObject</span><span class="o">.</span><span class="vm">__dict__</span> <span class="c1"># Shows what's defined in the class</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[4]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>mappingproxy({'__module__': '__main__',
'__annotations__': {'c': int},
'c': 42,
'__init__': <function __main__.DemoObject.__init__(self, v)>,
'__dict__': <attribute '__dict__' of 'DemoObject' objects>,
'__weakref__': <attribute '__weakref__' of 'DemoObject' objects>,
'__doc__': None})</pre>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=65f9d890">
<div class="jp-Cell-inputWrapper">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea">
<div class="jp-InputPrompt jp-InputArea-prompt">In [5]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">names</span><span class="p">(</span><span class="n">DemoObject</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[5]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>['c']</pre>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=0bcf0868">
<div class="jp-Cell-inputWrapper">
<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 [6]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">o</span><span class="o">.</span><span class="vm">__dict__</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[6]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>{'v': 21}</pre>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=87a5fc7c">
<div class="jp-Cell-inputWrapper">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
<p>Remember, though, that although attribute access follows the class hierarchy,
attribute assignment (name binding) <em>doesn't</em>.
Name binding takes place in the namespace
of the object whose attribute is being bound.</p>
<p>Once the name is bound in the local namespace
that will shadow the binding in the class namespace.</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs " id="cell-id=1d31e771">
<div class="jp-Cell-inputWrapper">
<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 [7]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">o</span><span class="o">.</span><span class="n">c</span> <span class="o">=</span> <span class="mi">43</span> <span class="c1"># Binds in the instance namespace</span>
</pre></div>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=c1e0472e">
<div class="jp-Cell-inputWrapper">
<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 [8]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">o</span><span class="o">.</span><span class="vm">__dict__</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[8]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>{'v': 21, 'c': 43}</pre>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=ed2e6fcc">
<div class="jp-Cell-inputWrapper">
<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 [9]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">o</span><span class="o">.</span><span class="n">c</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[9]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>43</pre>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=2f96e76a">
<div class="jp-Cell-inputWrapper">
<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 [10]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">o</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="n">c</span> <span class="c1"># Class variable remains unchanged</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[10]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>42</pre>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=13bc23d5">
<div class="jp-Cell-inputWrapper">
<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="The-descriptor-protocol">The descriptor protocol<a class="anchor-link" href="#The-descriptor-protocol">¶</a></h2><p>Many programmers are familiar with <em>properties</em>.
They are just a special case
of a more general mechanism called the <em>descriptor protocol</em>.</p>
<p>What's the descriptor protocol? Briefly, any type that
implements any of the <code>__get__</code>, <code>__set__</code> or <code>__delete__</code> methods
conforms to the protocol.</p>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=5a01c137">
<div class="jp-Cell-inputWrapper">
<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>Time for another convenience function: we'd like to know whether
a particular attribute is a descriptor.</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs " id="cell-id=965f2292">
<div class="jp-Cell-inputWrapper">
<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 [11]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">is_descriptor</span><span class="p">(</span><span class="n">p</span><span class="p">):</span>
<span class="n">names</span> <span class="o">=</span> <span class="nb">dir</span><span class="p">(</span><span class="n">p</span><span class="p">)</span> <span class="c1"># Sees inherited names also</span>
<span class="k">return</span> <span class="nb">any</span><span class="p">(</span><span class="n">n</span> <span class="ow">in</span> <span class="n">names</span>
<span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">"__get__"</span><span class="p">,</span> <span class="s2">"__set__"</span><span class="p">,</span> <span class="s2">"__delete__"</span><span class="p">)</span>
<span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=0c73eaa8">
<div class="jp-Cell-inputWrapper">
<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>Rather than using the <code>property</code> decorator,
we're going to build our own descriptor.</p>
<p>It won't have <code>__set__</code> and <code>__delete__</code> methods,
making this a read-only
(nowadays, a <em>non-overriding</em>) descriptor.
I'll explain the "non-overriding" term later.</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs " id="cell-id=7d226c44">
<div class="jp-Cell-inputWrapper">
<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 [12]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">class</span> <span class="nc">D1</span><span class="p">:</span>
<span class="w"> </span><span class="sd">"""</span>
<span class="sd"> Our first read-only, (non-overriding) descriptor</span>
<span class="sd"> """</span>
<span class="k">def</span> <span class="fm">__get__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">objtype</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"self: </span><span class="si">{</span><span class="bp">self</span><span class="si">}</span><span class="se">\n</span><span class="s2">obj : </span><span class="si">{</span><span class="n">obj</span><span class="si">}</span><span class="se">\n</span><span class="s2">type: </span><span class="si">{</span><span class="n">objtype</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
<span class="k">return</span> <span class="s2">"I'm a D1"</span>
</pre></div>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=d18c1ca9">
<div class="jp-Cell-inputWrapper">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
<p>The descriptor magic isn't immediately obvious.
Creating a <code>D1</code> and accessing its value
clearly doesn't call the <code>__get__</code> method.</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs " id="cell-id=54044135">
<div class="jp-Cell-inputWrapper">
<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 [13]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">d1</span> <span class="o">=</span> <span class="n">D1</span><span class="p">()</span>
</pre></div>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=4504bf7b">
<div class="jp-Cell-inputWrapper">
<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 [14]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">d1</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[14]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre><__main__.D1 at 0x1065aea90></pre>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=fa37a190">
<div class="jp-Cell-inputWrapper">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
<p>The magic appears when you create
an <em>instance</em> of the property class
as a class variable.
Here's a class that does just that.</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs " id="cell-id=12e66e82">
<div class="jp-Cell-inputWrapper">
<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 [15]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">class</span> <span class="nc">C1</span><span class="p">:</span>
<span class="n">d</span><span class="p">:</span> <span class="n">D1</span> <span class="o">=</span> <span class="n">D1</span><span class="p">()</span>
<span class="n">c1</span> <span class="o">=</span> <span class="n">C1</span><span class="p">()</span>
</pre></div>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=7e4fe5ad">
<div class="jp-Cell-inputWrapper">
<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 [16]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">c1</span><span class="o">.</span><span class="n">d</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain">
<pre>self: <__main__.D1 object at 0x1065afb50>
obj : <__main__.C1 object at 0x1065c4590>
type: <class '__main__.C1'>
</pre>
</div>
</div>
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[16]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>"I'm a D1"</pre>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=c1daec6e">
<div class="jp-Cell-inputWrapper">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
<p>Let's examine the namespaces of C1 and its instance. Care is needed to avoid triggering unwanted descriptor behaviour!</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=16ff2a19">
<div class="jp-Cell-inputWrapper">
<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 [17]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">names</span><span class="p">(</span><span class="n">C1</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[17]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>['d']</pre>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=1abb7ad7">
<div class="jp-Cell-inputWrapper">
<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 [18]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">C1</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'d'</span><span class="p">]),</span>
<span class="n">is_descriptor</span><span class="p">(</span><span class="n">C1</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'d'</span><span class="p">]),</span>
<span class="nb">type</span><span class="p">(</span><span class="n">C1</span><span class="o">.</span><span class="n">d</span><span class="p">),</span>
<span class="n">is_descriptor</span><span class="p">(</span><span class="n">C1</span><span class="o">.</span><span class="n">d</span><span class="p">)</span>
<span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain">
<pre>self: <__main__.D1 object at 0x1065afb50>
obj : None
type: <class '__main__.C1'>
self: <__main__.D1 object at 0x1065afb50>
obj : None
type: <class '__main__.C1'>
</pre>
</div>
</div>
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[18]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>(__main__.D1, True, str, False)</pre>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=a6485060">
<div class="jp-Cell-inputWrapper">
<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>A slightly more adventurous descriptor lets us initialise its value.</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs " id="cell-id=24390a8f">
<div class="jp-Cell-inputWrapper">
<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 [19]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">class</span> <span class="nc">D2</span><span class="p">:</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">val</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_v</span> <span class="o">=</span> <span class="n">val</span>
<span class="k">def</span> <span class="fm">__get__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">objtype</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"getting _v from </span><span class="si">{</span><span class="n">obj</span><span class="si">}</span><span class="s2"> in </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_v</span><span class="si">!r}</span><span class="s2">"</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_v</span>
</pre></div>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs " id="cell-id=4568810d">
<div class="jp-Cell-inputWrapper">
<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 [20]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">desc_methods</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
<span class="s2">"Show which descriptor methods are implemented."</span>
<span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">"__get__"</span><span class="p">,</span> <span class="s2">"__set__"</span><span class="p">,</span> <span class="s2">"__delete__"</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">name</span><span class="si">:</span><span class="s2">10</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span><span class="w"> </span><span class="n">name</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=39dc4d27">
<div class="jp-Cell-inputWrapper">
<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 [21]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">desc_methods</span><span class="p">(</span><span class="n">D2</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain">
<pre>__get__ : True
__set__ : False
__delete__: False
</pre>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs " id="cell-id=a25f4413">
<div class="jp-Cell-inputWrapper">
<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 [22]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">class</span> <span class="nc">C2</span><span class="p">:</span>
<span class="n">d</span><span class="p">:</span> <span class="n">D2</span> <span class="o">=</span> <span class="n">D2</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs " id="cell-id=7dab91cb">
<div class="jp-Cell-inputWrapper">
<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 [23]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">c2</span> <span class="o">=</span> <span class="n">C2</span><span class="p">()</span>
</pre></div>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=6a075109">
<div class="jp-Cell-inputWrapper">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea">
<div class="jp-InputPrompt jp-InputArea-prompt">In [24]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">c2</span><span class="o">.</span><span class="n">d</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain">
<pre>getting _v from <__main__.C2 object at 0x1065d07d0> in D2: 42
</pre>
</div>
</div>
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[24]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>42</pre>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=f9224c1d">
<div class="jp-Cell-inputWrapper">
<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>There's no <code>__set__</code> method,
therefore assignment <em>isn't overridden</em> by the decorator,
and makes an entry in the instance's <code>__dict__</code>.</p>
<p>Similarly, because there's no <code>__delete__</code>
it can't be destroyed.</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=0bb9d321">
<div class="jp-Cell-inputWrapper">
<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 [25]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">try</span><span class="p">:</span>
<span class="k">del</span> <span class="n">c2</span><span class="o">.</span><span class="n">d</span>
<span class="k">except</span> <span class="ne">AttributeError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain">
<pre>'C2' object has no attribute 'd'
</pre>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs " id="cell-id=0d0caaf8">
<div class="jp-Cell-inputWrapper">
<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 [26]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">c2</span><span class="o">.</span><span class="n">d</span> <span class="o">=</span> <span class="mi">2345</span>
</pre></div>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=7ead3760">
<div class="jp-Cell-inputWrapper">
<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 [27]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">c2</span><span class="o">.</span><span class="vm">__dict__</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[27]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>{'d': 2345}</pre>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=e0988df2">
<div class="jp-Cell-inputWrapper">
<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>Because the descriptor is non-overriding,
now there's a <code>__dict__</code> entry
it's used to return the attribute value
without calling the property's <code>__get__</code>.</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=697b3c0e">
<div class="jp-Cell-inputWrapper">
<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 [28]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">c2</span><span class="o">.</span><span class="n">d</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[28]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>2345</pre>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=cd325c76">
<div class="jp-Cell-inputWrapper">
<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="Extending-a-descriptor-to-assignment">Extending a descriptor to assignment<a class="anchor-link" href="#Extending-a-descriptor-to-assignment">¶</a></h3><p>The D3 descriptor will do everything the <code>D2</code> can,
but adds a <code>__set__</code> method making it an
<em>overriding</em> descriptor.</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs " id="cell-id=6737f9c2">
<div class="jp-Cell-inputWrapper">
<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 [29]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">class</span> <span class="nc">D3</span><span class="p">(</span><span class="n">D2</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__set__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">instance</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_v</span> <span class="o">=</span> <span class="n">value</span>
</pre></div>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=45da686c">
<div class="jp-Cell-inputWrapper">
<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 [30]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">desc_methods</span><span class="p">(</span><span class="n">D3</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain">
<pre>__get__ : True
__set__ : True
__delete__: False
</pre>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs " id="cell-id=75b5b2ff">
<div class="jp-Cell-inputWrapper">
<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 [31]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">class</span> <span class="nc">C3</span><span class="p">:</span>
<span class="n">d</span><span class="p">:</span> <span class="n">D3</span> <span class="o">=</span> <span class="n">D3</span><span class="p">(</span><span class="s2">"initial"</span><span class="p">)</span>
<span class="n">c3</span> <span class="o">=</span> <span class="n">C3</span><span class="p">()</span>
</pre></div>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=f5c1fdc0">
<div class="jp-Cell-inputWrapper">
<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 [32]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">c3</span><span class="o">.</span><span class="n">d</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain">
<pre>getting _v from <__main__.C3 object at 0x1064c0910> in D3: 'initial'
</pre>
</div>
</div>
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[32]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>'initial'</pre>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs " id="cell-id=e5788d82">
<div class="jp-Cell-inputWrapper">
<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 [33]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">c3</span><span class="o">.</span><span class="n">d</span> <span class="o">=</span> <span class="s2">"changed"</span>
</pre></div>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=6f73c2b6">
<div class="jp-Cell-inputWrapper">
<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 [34]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">c3</span><span class="o">.</span><span class="n">d</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain">
<pre>getting _v from <__main__.C3 object at 0x1064c0910> in D3: 'changed'
</pre>
</div>
</div>
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[34]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>'changed'</pre>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=f1f85995">
<div class="jp-Cell-inputWrapper">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
<p><em>REMEMBER</em>: The interpreter looks for an <em>overriding</em> descriptor
<em>in the class hierarchy</em> <strong>before</strong> searching for regular instance/class variables.</p>
<p>If found, the descriptor is used when the
name is accessed as an attribute of the instance
<em>even if an instance variable with the same name</em>
as the class's property exists.</p>
<p>This is why they are called <em>overriding</em> descriptors.</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs " id="cell-id=dcd3f67c">
<div class="jp-Cell-inputWrapper">
<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 [35]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">class</span> <span class="nc">DN</span><span class="p">:</span>
<span class="k">def</span> <span class="fm">__get__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">objtype</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"getting _dn from </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2"> instance </span><span class="si">{</span><span class="n">obj</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
<span class="k">return</span> <span class="n">obj</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s2">"_dn"</span><span class="p">]</span>
<span class="k">def</span> <span class="fm">__set__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"setting _dn in </span><span class="si">{</span><span class="n">obj</span><span class="si">}</span><span class="s2"> to </span><span class="si">{</span><span class="n">value</span><span class="si">!r}</span><span class="s2">"</span><span class="p">)</span>
<span class="n">obj</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s2">"_dn"</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
</pre></div>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs " id="cell-id=fcfcbfb4">
<div class="jp-Cell-inputWrapper">
<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 [36]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">class</span> <span class="nc">CN</span><span class="p">:</span>
<span class="n">d</span><span class="p">:</span> <span class="n">DN</span> <span class="o">=</span> <span class="n">DN</span><span class="p">()</span> <span class="c1"># CN.d is an instance of descriptor class DN</span>
<span class="n">cn</span> <span class="o">=</span> <span class="n">CN</span><span class="p">()</span>
</pre></div>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=9d6f5511">
<div class="jp-Cell-inputWrapper">
<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 [37]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">cn</span><span class="o">.</span><span class="n">d</span> <span class="o">=</span> <span class="mi">12345</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain">
<pre>setting _dn in <__main__.CN object at 0x1065dedd0> to 12345
</pre>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=26fda16b">
<div class="jp-Cell-inputWrapper">
<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 [38]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">cn</span><span class="o">.</span><span class="n">d</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain">
<pre>getting _dn from DN instance <__main__.CN object at 0x1065dedd0>
</pre>
</div>
</div>
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[38]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>12345</pre>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=b879c267">
<div class="jp-Cell-inputWrapper">
<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 [39]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">cn</span><span class="o">.</span><span class="vm">__dict__</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[39]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>{'_dn': 12345}</pre>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=a843ab6a">
<div class="jp-Cell-inputWrapper">
<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="Q:-Why-can't-a-class-have-more-than-one-DN-descriptor?"><em>Q</em>: Why can't a class have more than one DN descriptor?<a class="anchor-link" href="#Q:-Why-can't-a-class-have-more-than-one-DN-descriptor?">¶</a></h2>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=c6108eb0">
<div class="jp-Cell-inputWrapper">
<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="A:-Because-all-DN-descriptors-save-their-state-in-the-same-_dn-instance-variable"><em>A</em>: Because all DN descriptors save their state in the same <code>_dn</code> instance variable<a class="anchor-link" href="#A:-Because-all-DN-descriptors-save-their-state-in-the-same-_dn-instance-variable">¶</a></h2>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=b3451ff8">
<div class="jp-Cell-inputWrapper">
<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>You'll find an answer to this conundrum later in this notebook.</p>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=05e02514">
<div class="jp-Cell-inputWrapper">
<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="Properties">Properties<a class="anchor-link" href="#Properties">¶</a></h3>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=7150752c">
<div class="jp-Cell-inputWrapper">
<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>Properties are descriptors that many Python programmers are at least aware of.
They don't behave quite like raw descriptors, because they are <em>always</em> overriding.</p>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=74365a25">
<div class="jp-Cell-inputWrapper">
<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 understand the underlying mechanism,
let's refresh our memory about properties.
At the same time it should reinforce the material on descriptors.</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=5babe613">
<div class="jp-Cell-inputWrapper">
<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 [40]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">help</span><span class="p">(</span><span class="nb">property</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain">
<pre>Help on class property in module builtins:
class property(object)
| property(fget=None, fset=None, fdel=None, doc=None)
|
| Property attribute.
|
| fget
| function to be used for getting an attribute value
| fset
| function to be used for setting an attribute value
| fdel
| function to be used for del'ing an attribute
| doc
| docstring
|
| Typical use is to define a managed attribute x:
|
| class C(object):
| def getx(self): return self._x
| def setx(self, value): self._x = value
| def delx(self): del self._x
| x = property(getx, setx, delx, "I'm the 'x' property.")
|
| Decorators make defining new properties or modifying existing ones easy:
|
| class C(object):
| @property
| def x(self):
| "I am the 'x' property."
| return self._x
| @x.setter
| def x(self, value):
| self._x = value
| @x.deleter
| def x(self):
| del self._x
|
| Methods defined here:
|
| __delete__(self, instance, /)
| Delete an attribute of instance.
|
| __get__(self, instance, owner=None, /)
| Return an attribute of instance, which is of type owner.
|
| __getattribute__(self, name, /)
| Return getattr(self, name).
|
| __init__(self, /, *args, **kwargs)
| Initialize self. See help(type(self)) for accurate signature.
|
| __set__(self, instance, value, /)
| Set an attribute of instance to value.
|
| __set_name__(...)
| Method to set name of a property.
|
| deleter(...)
| Descriptor to obtain a copy of the property with a different deleter.
|
| getter(...)
| Descriptor to obtain a copy of the property with a different getter.
|
| setter(...)
| Descriptor to obtain a copy of the property with a different setter.
|
| ----------------------------------------------------------------------
| Static methods defined here:
|
| __new__(*args, **kwargs) from builtins.type
| Create and return a new object. See help(type) for accurate signature.
|
| ----------------------------------------------------------------------
| Data descriptors defined here:
|
| __isabstractmethod__
|
| fdel
|
| fget
|
| fset
</pre>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=28f7337e">
<div class="jp-Cell-inputWrapper">
<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 [41]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">names</span><span class="p">(</span><span class="nb">property</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[41]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>['deleter', 'fdel', 'fget', 'fset', 'getter', 'setter']</pre>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=58c0de12">
<div class="jp-Cell-inputWrapper">
<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>Properties define three decorators
and three functions
that are called from the
<code>__del__</code>, <code>__get__</code> and <code>__set__</code> methods
respectively when present.</p>
<p>A simple use of a property is to define a <em>virtual</em> or <em>computed attribute</em>.
A simplistic example follows.</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=5a1ad7d1">
<div class="jp-Cell-inputWrapper">
<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 [42]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">class</span> <span class="nc">Person</span><span class="p">:</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">first</span><span class="p">,</span> <span class="n">last</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">first</span> <span class="o">=</span> <span class="n">first</span>
<span class="bp">self</span><span class="o">.</span><span class="n">last</span> <span class="o">=</span> <span class="n">last</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">full_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">first</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">last</span><span class="si">}</span><span class="s2">"</span>
<span class="n">me</span> <span class="o">=</span> <span class="n">Person</span><span class="p">(</span><span class="s2">"Steve"</span><span class="p">,</span> <span class="s2">"Holden"</span><span class="p">)</span>
<span class="n">me</span><span class="o">.</span><span class="n">full_name</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[42]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>'Steve Holden'</pre>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=b3c2877b">
<div class="jp-Cell-inputWrapper">
<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>Any reference to the property as an instance attribute
causes the property's <code>__get__</code> method to be called.
The return value is the value of the attribute lookup.</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=6154e241">
<div class="jp-Cell-inputWrapper">
<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 [43]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="nb">type</span><span class="p">(</span><span class="n">me</span><span class="o">.</span><span class="n">full_name</span><span class="p">),</span> <span class="n">me</span><span class="o">.</span><span class="n">full_name</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[43]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>(str, 'Steve Holden')</pre>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=ca884e54">
<div class="jp-Cell-inputWrapper">
<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>References to the property as a class attribute, however,
do <em>not</em> cause a call to the property's <code>__get__</code>,
so the class attribute's value is the property instance.</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=d0b4c58f">
<div class="jp-Cell-inputWrapper">
<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 [44]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="nb">type</span><span class="p">(</span><span class="n">Person</span><span class="o">.</span><span class="n">full_name</span><span class="p">),</span> <span class="n">Person</span><span class="o">.</span><span class="n">full_name</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[44]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>(property, <property at 0x1065cb790>)</pre>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=2d45c7c6">
<div class="jp-Cell-inputWrapper">
<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><code>Person.full_name</code> doesn't offer any way
to change the composite value of the person's
full name - its definition doesn't provide
a setter, or a deleter.</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=6d4e69fd">
<div class="jp-Cell-inputWrapper">
<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 [45]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">names</span><span class="p">(</span><span class="n">Person</span><span class="o">.</span><span class="n">full_name</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">name</span><span class="si">:</span><span class="s2">10</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">type</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">Person</span><span class="o">.</span><span class="n">full_name</span><span class="p">,</span><span class="w"> </span><span class="n">name</span><span class="p">))</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain">
<pre>deleter : <class 'builtin_function_or_method'>
fdel : <class 'NoneType'>
fget : <class 'function'>
fset : <class 'NoneType'>
getter : <class 'builtin_function_or_method'>
setter : <class 'builtin_function_or_method'>
</pre>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=c486ce98">
<div class="jp-Cell-inputWrapper">
<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 [46]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="nb">list</span><span class="p">(</span><span class="n">me</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[46]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>['first', 'last']</pre>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=778a10ab">
<div class="jp-Cell-inputWrapper">
<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 [47]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">names</span><span class="p">(</span><span class="n">me</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[47]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>['first', 'full_name', 'last']</pre>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=fce3c7b1">
<div class="jp-Cell-inputWrapper">
<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 [48]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">try</span><span class="p">:</span>
<span class="n">me</span><span class="o">.</span><span class="n">full_name</span> <span class="o">=</span> <span class="s2">"Simon Willison"</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Exception:"</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain">
<pre>Exception: property 'full_name' of 'Person' object has no setter
</pre>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=d623b500">
<div class="jp-Cell-inputWrapper">
<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 [49]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">try</span><span class="p">:</span>
<span class="k">del</span> <span class="n">me</span><span class="o">.</span><span class="n">full_name</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Exception:"</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain">
<pre>Exception: property 'full_name' of 'Person' object has no deleter
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=76162b3a">
<div class="jp-Cell-inputWrapper">
<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 a property is registered in a class, then
it will take precedence over an entry in the
instance's <code>__dict__</code> because <em>properties are always overriding</em>.</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs " id="cell-id=9e0d22de">
<div class="jp-Cell-inputWrapper">
<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 [50]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">me</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="s1">'full_name'</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"Sherlock Holmes"</span>
</pre></div>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=22ef3309">
<div class="jp-Cell-inputWrapper">
<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 [51]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">me</span><span class="o">.</span><span class="n">full_name</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[51]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>'Steve Holden'</pre>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=fe4153a6">
<div class="jp-Cell-inputWrapper">
<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>Properties as instance attributes
don't invoke the same behaviour.</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs " id="cell-id=85f3cf12">
<div class="jp-Cell-inputWrapper">
<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 [52]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="nd">@property</span>
<span class="k">def</span> <span class="nf">some_prop</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s2">"My very own property"</span>
<span class="n">me</span><span class="o">.</span><span class="n">my_prop</span> <span class="o">=</span> <span class="n">some_prop</span>
</pre></div>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=596b3b2c">
<div class="jp-Cell-inputWrapper">
<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 [53]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">me</span><span class="o">.</span><span class="n">my_prop</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[53]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre><property at 0x1065f4450></pre>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=f256fd5a">
<div class="jp-Cell-inputWrapper">
<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 [54]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="nb">type</span><span class="p">(</span><span class="n">some_prop</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[54]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>property</pre>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=ee1209b5">
<div class="jp-Cell-inputWrapper">
<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>We find that a property is indeed a descriptor.</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=fc71a798">
<div class="jp-Cell-inputWrapper">
<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 [55]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">names</span><span class="p">(</span><span class="nb">property</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[55]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>['deleter', 'fdel', 'fget', 'fset', 'getter', 'setter']</pre>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=3aefe4ad">
<div class="jp-Cell-inputWrapper">
<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 [56]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">desc_methods</span><span class="p">(</span><span class="n">Person</span><span class="o">.</span><span class="n">full_name</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain">
<pre>__get__ : True
__set__ : True
__delete__: True
</pre>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=d81416ad">
<div class="jp-Cell-inputWrapper">
<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 [57]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">is_descriptor</span><span class="p">(</span><span class="n">Person</span><span class="o">.</span><span class="n">full_name</span><span class="p">),</span> <span class="n">Person</span><span class="o">.</span><span class="n">full_name</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[57]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>(True, <property at 0x1065cb790>)</pre>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=11ef9509">
<div class="jp-Cell-inputWrapper">
<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>When the descriptor is looked up as an instance attribute,
however,
the value returned is generated by calling the descriptor's
<code>__get__</code> method.</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=b2c75728">
<div class="jp-Cell-inputWrapper">
<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 [58]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">is_descriptor</span><span class="p">(</span><span class="n">me</span><span class="o">.</span><span class="n">full_name</span><span class="p">),</span> <span class="n">me</span><span class="o">.</span><span class="n">full_name</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[58]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>(False, 'Steve Holden')</pre>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=92b88534">
<div class="jp-Cell-inputWrapper">
<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="Question:-Why-can't-a-class-have-more-than-one-DN-descriptor?"><em>Question</em>: Why can't a class have more than one DN descriptor?<a class="anchor-link" href="#Question:-Why-can't-a-class-have-more-than-one-DN-descriptor?">¶</a></h2><h3 id="Answer:-because-all-descriptor-instances-would-try-to-use-the-same-instance-variable-of-the-client-class's-instances."><em>Answer</em>: because all descriptor instances would try to use the same instance variable of the client class's instances.<a class="anchor-link" href="#Answer:-because-all-descriptor-instances-would-try-to-use-the-same-instance-variable-of-the-client-class's-instances.">¶</a></h3>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=ee291d47">
<div class="jp-Cell-inputWrapper">
<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="Bonus-material">Bonus material<a class="anchor-link" href="#Bonus-material">¶</a></h2><p>Use this as the basis for further investigations.
Here are descriptors I wrote for the ticketing project.</p>
<p>The main goal was canonicalisation: sometimes strings
were being assigned and an integer was required, for example.</p>
<p>Several things are of potential interest.</p>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=7dfd6080">
<div class="jp-Cell-inputWrapper">
<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">
<ol>
<li>When default values are provided they <em>cannot</em> be positional
(That's the purpose of the <code>*</code> in the method signature).</li>
<li>The <a href="https://docs.python.org/3/reference/datamodel.html#object.__set_name__"><strong>set_name</strong> method</a>
is used to determine the name bound
to the descriptor in its client class.</li>
<li>This allows different instances of the same descriptor
to coexist within a class definition,
so you need not define each one as a distinct class.</li>
</ol>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs " id="cell-id=e5807b76">
<div class="jp-Cell-inputWrapper">
<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 [59]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">class</span> <span class="nc">StringInt</span><span class="p">:</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_default</span> <span class="o">=</span> <span class="n">default</span>
<span class="k">def</span> <span class="nf">__set_name__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">owner</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_name</span> <span class="o">=</span> <span class="s2">"_"</span> <span class="o">+</span> <span class="n">name</span>
<span class="k">def</span> <span class="fm">__get__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="nb">type</span><span class="p">):</span>
<span class="k">if</span> <span class="n">obj</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_default</span>
<span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_default</span><span class="p">)</span>
<span class="k">def</span> <span class="fm">__set__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_name</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
</pre></div>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs " id="cell-id=04983296">
<div class="jp-Cell-inputWrapper">
<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 [60]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">class</span> <span class="nc">StringBool</span><span class="p">:</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="s1">'FALSE'</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_default</span> <span class="o">=</span> <span class="n">default</span>
<span class="k">def</span> <span class="nf">__set_name__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">owner</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_name</span> <span class="o">=</span> <span class="s2">"_"</span> <span class="o">+</span> <span class="n">name</span>
<span class="k">def</span> <span class="fm">__get__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="nb">type</span><span class="p">):</span>
<span class="k">if</span> <span class="n">obj</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_default</span>
<span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_default</span><span class="p">)</span>
<span class="k">def</span> <span class="fm">__set__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_name</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">"TRUE"</span><span class="p">,</span> <span class="s2">"True"</span><span class="p">,</span> <span class="s2">"1"</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="kc">True</span><span class="p">])</span>
</pre></div>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=4238099b">
<div class="jp-Cell-inputWrapper">
<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="Further-reading">Further reading<a class="anchor-link" href="#Further-reading">¶</a></h3><ul>
<li><a href="https://docs.python.org/3/howto/descriptor.html">Descriptor How-To Guide</a>
by Raymond Hettinger.
Uses older terminology
(<em>data</em> and <em>non-data</em> rather than
<em>overriding</em> and <em>non-overriding</em>).</li>
</ul>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=09eaa515">
<div class="jp-Cell-inputWrapper">
<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="Nick-Fitzsimmons-asked-...">Nick Fitzsimmons asked ...<a class="anchor-link" href="#Nick-Fitzsimmons-asked-...">¶</a></h2><p>A descriptor whose definition deleted itself (!).</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell jp-mod-noOutputs " id="cell-id=a9e74a52">
<div class="jp-Cell-inputWrapper">
<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 [61]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">class</span> <span class="nc">StringInt</span><span class="p">:</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_default</span> <span class="o">=</span> <span class="n">default</span>
<span class="k">def</span> <span class="nf">__set_name__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">owner</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="k">del</span> <span class="n">owner</span><span class="o">.</span><span class="vm">__dict__</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="c1"># <<<<<<<<<<<<<<<<<<<</span>
<span class="k">def</span> <span class="fm">__get__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="nb">type</span><span class="p">):</span>
<span class="k">if</span> <span class="n">obj</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_default</span>
<span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_default</span><span class="p">)</span>
<span class="k">def</span> <span class="fm">__set__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_name</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
</pre></div>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=eda11269">
<div class="jp-Cell-inputWrapper">
<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 [62]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="k">try</span><span class="p">:</span>
<span class="k">class</span> <span class="nc">User</span><span class="p">:</span>
<span class="n">si</span><span class="p">:</span> <span class="n">StringInt</span> <span class="o">=</span> <span class="n">StringInt</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">RuntimeError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"RuntimeError:"</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain">
<pre>RuntimeError: Error calling __set_name__ on 'StringInt' instance 'si' in 'User'
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=9ba8b62f">
<div class="jp-Cell-inputWrapper">
<div class="jp-Collapser jp-InputCollapser jp-Cell-inputCollapser">
</div>
<div class="jp-InputArea jp-Cell-inputArea"><div class="jp-InputPrompt jp-InputArea-prompt">
</div><div class="jp-RenderedHTMLCommon jp-RenderedMarkdown jp-MarkdownOutput " data-mime-type="text/markdown">
<p>The actual issue is that <code>__set_name__</code> tries to modify
the class <code>__dict__</code>, which you may remember is a
(read-only) <code>mappingproxy</code> object.</p>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=d80bee2d">
<div class="jp-Cell-inputWrapper">
<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>Conclusion: not without getting <em>really</em> tricky!</p>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=4caf59e9">
<div class="jp-Cell-inputWrapper">
<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="Functions-are-descriptors">Functions are descriptors<a class="anchor-link" href="#Functions-are-descriptors">¶</a></h3>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=e94fec97">
<div class="jp-Cell-inputWrapper">
<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 [63]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="nb">type</span><span class="p">(</span><span class="n">desc_methods</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[63]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>function</pre>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=d000b102">
<div class="jp-Cell-inputWrapper">
<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 [64]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">is_descriptor</span><span class="p">(</span><span class="n">desc_methods</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[64]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>True</pre>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=d2639a2e">
<div class="jp-Cell-inputWrapper">
<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 [65]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">desc_methods</span><span class="p">(</span><span class="n">desc_methods</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain">
<pre>__get__ : True
__set__ : False
__delete__: False
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=89a2580a">
<div class="jp-Cell-inputWrapper">
<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">
<h4 id="Question">Question<a class="anchor-link" href="#Question">¶</a></h4><p>Why are functions descriptors? What advantages does this confer?</p>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=19b1e828">
<div class="jp-Cell-inputWrapper">
<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 [66]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">names</span><span class="p">(</span><span class="n">desc_methods</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[66]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>[]</pre>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=c278509c">
<div class="jp-Cell-inputWrapper">
<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 [67]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">desc_methods</span><span class="o">.</span><span class="fm">__get__</span><span class="p">(</span><span class="n">desc_methods</span><span class="p">)()</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child">
<div class="jp-OutputPrompt jp-OutputArea-prompt"></div>
<div class="jp-RenderedText jp-OutputArea-output" data-mime-type="text/plain">
<pre>__get__ : True
__set__ : False
__delete__: False
</pre>
</div>
</div>
</div>
</div>
</div><div class="jp-Cell jp-CodeCell jp-Notebook-cell " id="cell-id=81227094">
<div class="jp-Cell-inputWrapper">
<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 [68]:</div>
<div class="jp-CodeMirrorEditor jp-Editor jp-InputArea-editor" data-type="inline">
<div class="CodeMirror cm-s-jupyter">
<div class=" highlight hl-ipython3"><pre><span></span><span class="n">desc_methods</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__dict__</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="jp-Cell-outputWrapper">
<div class="jp-Collapser jp-OutputCollapser jp-Cell-outputCollapser">
</div>
<div class="jp-OutputArea jp-Cell-outputArea">
<div class="jp-OutputArea-child jp-OutputArea-executeResult">
<div class="jp-OutputPrompt jp-OutputArea-prompt">Out[68]:</div>
<div class="jp-RenderedText jp-OutputArea-output jp-OutputArea-executeResult" data-mime-type="text/plain">
<pre>mappingproxy({'__new__': <function function.__new__(*args, **kwargs)>,
'__repr__': <slot wrapper '__repr__' of 'function' objects>,
'__call__': <slot wrapper '__call__' of 'function' objects>,
'__get__': <slot wrapper '__get__' of 'function' objects>,
'__closure__': <member '__closure__' of 'function' objects>,
'__doc__': <member '__doc__' of 'function' objects>,
'__globals__': <member '__globals__' of 'function' objects>,
'__module__': <member '__module__' of 'function' objects>,
'__builtins__': <member '__builtins__' of 'function' objects>,
'__code__': <attribute '__code__' of 'function' objects>,
'__defaults__': <attribute '__defaults__' of 'function' objects>,
'__kwdefaults__': <attribute '__kwdefaults__' of 'function' objects>,
'__annotations__': <attribute '__annotations__' of 'function' objects>,
'__dict__': <attribute '__dict__' of 'function' objects>,
'__name__': <attribute '__name__' of 'function' objects>,
'__qualname__': <attribute '__qualname__' of 'function' objects>})</pre>
</div>
</div>
</div>
</div>
</div>
<div class="jp-Cell jp-MarkdownCell jp-Notebook-cell" id="cell-id=cb381e82">
<div class="jp-Cell-inputWrapper">
<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="Here-endeth-the-notebook">Here endeth the notebook<a class="anchor-link" href="#Here-endeth-the-notebook">¶</a></h2><p>I hope this little tour through descriptors has not only
explained an important Python mechanism,
but also
encouraged you to be adventurous
in using notebooks or the interactive interpreter
to explore Python's lesser-known corners.</p>
</div>
</div>
</div>
</div>
</body>
holdenwebhttp://www.blogger.com/profile/13187344429484025673noreply@blogger.com0tag:blogger.com,1999:blog-496482.post-24842422528013553652021-04-18T05:26:00.002-04:002021-04-18T05:26:50.436-04:00Mac OS - When Mouse Clicks Are Not Actioned<p>I've recently experienced a rash of events where maybe once a week on average mouse clicks have simply stopped working. The cursor tracks the mouse, but clicks just don't do anything.</p><p>After some weeks of irritation I eventually realised that I could avoid a reboot by restarting the Finder using the "Force Quit" feature (you can kill any app except Finder, for which the available action is "Relaunch").</p><p>"So how," I hear you asking, "do I do that when I can't click to bring up the Apple menu?" The answer is "With the keyboard. Simples!"</p><p>The Force Quit applet has a keyboard shortcut (<b>Cmd-Option-ESC</b>). Enter that key combination and the Force Quit dialogue appears. Use the arrow keys to navigate to select Finder. <b>Enter</b> triggers the relaunch, and a further <b>Enter</b> confirms that. In summary:</p><p><b>Cmd-Option-ESC<br /><i>Navigate to Finder</i><br />Enter<br />Enter</b></p>holdenwebhttp://www.blogger.com/profile/13187344429484025673noreply@blogger.com0tag:blogger.com,1999:blog-496482.post-76411458269530530422018-04-30T04:22:00.000-04:002018-04-30T06:24:12.493-04:00Type Annotations in Python<span style="font-size: x-small;"><b>This is an edited live blog of a Python London presentation by Bernat Gabor of Bloomberg. Sorry it's taken so long to prepare. A great talk, very well presented. Thanks Bernat! Many thanks to Babylon Health for being a welcoming host.</b></span><br />
<br />
PEP 484 introduced type hinting. Function annotations from PEP 3172 and variable annotations from PEP 526 have come together, and are supported by mypy. Why? Primarily to make code easier to debug, maintain and understand. An implementation supports annotation in Python 2.7, as structured comments, so there's no excuse for not using them!<br />
<br />
What do annotations NOT provide?<br />
<br />
<ul>
<li>Runtime type inference.</li>
<li>Performance improvements. </li>
</ul>
In fact, annotations are effectively treated as commentary during Python parsing by the interpreter, other than ensuring that their syntax is valid. The mypy project can be used to verify that code calling functions conform to the type annotations thereon. You can also implement "gradual typing": the mypy linter will report errors if your code is type-hinted. It won't complain about untyped values and functions.<br />
Type annotations as implemented by recent Python 3 releases (> 3.4) are the canonical way to do it, but require you to import all type dependencies, and the parser has to parse them. This adds a measurable time penalty, though 3.7's PEP 536 implementation will lead to increased speed.<br />
For older Python implementations, annotations in comments will work under any Python version (simply being ignored as comments by those versions that don't understand them), but it's "kinda ugly" and creates noise around your program logic. They can also lead to compatibility problems with established linters.<br />
<br />
A further option is to write interface or stub files - you can even create stubs for code you don't own and/or have access to the source of. This again works in any version because the stub files are simply ignored, but it requires no change to existing source and lets you use the latest Python features. It does, however, create a maintenance burden. Further, if your stubs don't match the code (if a function name is changed in the main file but not in the stub, for example), there are no checks to alert the programmer.<br />
<br />
Any solution not using the latest syntax is likely to cause problems in the long-term, though it won't be impossible.<br />
<br />
PEP 563, due in Python 3.7, will allow you to distribute any package with type information. Unfortunately, this will not allow annotation of local variables, only interfaces. Annotations can be incorporated into docstrings, but this isn't an especially good option, and isn't recommended.<br />
<br />
So, what kind of types can you add? Nominal types (<span style="font-family: "courier new" , "courier" , monospace;">int</span>, <span style="font-family: "courier new" , "courier" , monospace;">float</span>, <span style="font-family: "courier new" , "courier" , monospace;">object</span>, etc.) have generic containers such as <span style="font-family: "courier new" , "courier" , monospace;">Tuple[int, float]</span>, <span style="font-family: "courier new" , "courier" , monospace;">Dict[str, int]</span>, <span style="font-family: "courier new" , "courier" , monospace;">MutableMapping[str, int]</span>, <span style="font-family: "courier new" , "courier" , monospace;">List[int]</span>, <span style="font-family: "courier new" , "courier" , monospace;">Iterable[Text]</span>, and so on. Since these types are Python objects, this means you can alias types by assignment.<br />
<br />
Further nominal types include callable and generics like <span style="font-family: "courier new" , "courier" , monospace;">TypeVar</span>, as well as <span style="font-family: "courier new" , "courier" , monospace;">Any</span>, which effectively disables type checking for specific names. PEP 544 will specify protocols, and this will allow the introduction of structural typing.<br />
<br />
What are the gotchas?<br />
<br />
<ul>
<li>Python 2 and 3 require version-dependent checks in code intended for both environments</li>
<li>It's difficult to handle functions that have multiple return types, encouraging programmers to short-circuit type checking. While the interpreter won't complain at the resulting necessary shenanigans, various linters will be unhappy.</li>
<li>Type lookup can be problematic, as the system allows the programmer to shadow the names of types without realising it because they use the same scopes as the runtime.</li>
<li>Subclasses can support supersets of the types supported by their superclasses, but not subsets of those types. Further, subtypes whose methods have signatures requiring additional arguments must make those additional arguments optional for type checking to succeed.</li>
</ul>
<div>
Type hinting is fun, but may cause you (like David Beazley) to <a href="https://twitter.com/dabeaz/status/981699763996450817" target="_blank">wish you had a desk-side bridge to jump off</a>. If all else fails, use <span style="font-family: "courier new" , "courier" , monospace;"># type: ignore</span> to just shut the noise up, though this might be regarded as an admission of defeat.</div>
<div>
<br /></div>
<div>
PEP 257 defines how to annotate your code so Sphinx can create documentation that includes type information. Just install the <b>sphinx-autodoc</b> module and add it to to your <i>conf.py</i> file.</div>
<div>
<br /></div>
<div>
What's next? MyPy is getting close to a 1.0 release, and the main focus now is on improving performance and enabling incremental typing, defining and implementing an API and a plugin system to open up the ecosystem.</div>
Stevehttp://www.blogger.com/profile/15732819755000554717noreply@blogger.com0tag:blogger.com,1999:blog-496482.post-35366891847406142202017-10-19T05:24:00.004-04:002017-10-19T05:24:59.558-04:00What's In a Namespace?Python programmers talk about namespaces a lot. The Zen of Python* ends with<br />
<blockquote class="tr_bq">
<i>Namespaces are one honking great idea—let’s do more of those!</i></blockquote>
and if Tim Peters thinks namespaces are such a good idea, who am I to disagree?<br />
<br />
<h4>
Resolution of Unqualified Names</h4>
Python programmers learned at their mothers' knees that Python looks up <i>unqualified names</i> in three namespaces—first, the local namespace of the currently-executing function or method; second, the global namespace of the module containing the executing code; third and last, the built-in namespace that holds the built-in functions and exceptions. So, it makes sense to understand the various namespaces that the interpreter can use. Note that when we talk about <i>name resolution</i> we are talking about how a value is associated with an unadorned name in the code.<br />
<br />
In the main module of a running program there is no local namespace. A name must be present in either the module's global namespace or, if not there, in the built-in namespace that holds functions like <span style="font-family: "courier new" , "courier" , monospace;"><b>len</b></span>, the standard exceptions, and so on. In other words, when <b><span style="font-family: "courier new" , "courier" , monospace;">__name__ == '__main__</span></b>' the local and global namespaces are the same.<br />
<br />
When the interpreter compiles a function it keeps track of names which are bound inside the function body (this includes the parameters, which are established in the local namespace before execution begins) and aren't declared as either <span style="font-family: "courier new" , "courier" , monospace;"><b>global</b></span> or (in Python 3) <span style="font-family: "courier new" , "courier" , monospace;"><b>nonlocal</b></span>. Because it knows the local names the interpreter can assign them a pre-defined place in the stack frame (where local data is kept for each function call), and does not generally need to perform a lookup. This is the main reason local access is faster than global access.<br />
<br />
Although the interpreter identifies local names by the presence of bindings within a function body, there is nothing to stop you writing code that references the names before they are bound. Under those circumstances you will see an <span style="font-family: "courier new" , "courier" , monospace; font-weight: bold;">UnboundLocalError</span> exception raised with a message like<span style="font-family: inherit;"> "local variable 'b' referenced before assignment".</span><br />
<br />
For non-local names, something very like a dictionary lookup takes place first in the module's global namespace and then in the built-ins. If neither search yields a result then the interpreter raises a NameError exception with a message like "name 'nosuch' is not defined."<br />
<br />
<h4>
Resolution of Qualified Names</h4>
<div>
In qualified names (those consisting of a sequence of names or expressions delimited by dots such as <span style="font-family: "courier new" , "courier" , monospace;"><b>os.path.join</b></span>) starts by locating the first object's namespace (in this case <b><span style="font-family: "courier new" , "courier" , monospace;">os</span></b>) in the standard way described above. Thereafter the mechanism can get complex because like many Python features you can control how it works for your own objects by defining <b><span style="font-family: "courier new" , "courier" , monospace;">__getattr__</span></b> and/or <span style="font-family: "courier new" , "courier" , monospace;"><b>__getattribute__</b></span> methods, and because descriptors (primarily used in accessing properties) can cloud the picture.<br />
<br />
In essence, though, the mechanism is that the interpreter, having located the object bound to the unqualified name, then makes a <b><span style="font-family: "courier new" , "courier" , monospace;">gettatr</span></b> call for the second name (in this case, <span style="font-family: "courier new" , "courier" , monospace;"><b>path</b></span>) in that namespace, yielding another object, against which a further getattr call is made with the third component of the name, and so on. If at any point a <b><span style="font-family: "courier new" , "courier" , monospace;">getattr</span></b> fails then the interpreter raises an <b><span style="font-family: "courier new" , "courier" , monospace;">AttributeError</span></b> exception with a message such as "'module' object has no attribute 'name'."<br />
<br /></div>
<div>
<h4>
Understanding Expression Values</h4>
<div>
Once you understand the mechanisms for looking up the values of names it becomes a little easier to understand how Python computes expression values. Once a name is resolved there may be other methods to apply such as <span style="font-family: Courier New, Courier, monospace;"><b>__getitem__</b></span> for subscripting or <span style="font-family: Courier New, Courier, monospace;"><b>__call__</b></span> for function calls. These operations also yield values, whose namespaces can again be used to lookup further names. So, for example, when you see an expression like</div>
<div>
<br /></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"><b>e.orig.args[0].startswith('UNIQUE constraint failed')</b></span></div>
<div>
<br /></div>
<div>
you understand that the name <b><span style="font-family: Courier New, Courier, monospace;">e.orig.args</span></b> is looked up by going through a sequence of namespaces and evaluates to a list object, to which a subscripting operation is applied to get the first element, in whose namespace the name <b><span style="font-family: Courier New, Courier, monospace;">startswith</span></b> is resolved (hopefully to something callable) to a value that is finally called with a string argument.</div>
<div>
<br /></div>
<div>
Ultimately, by decomposing the expressions in this way you end up only dealing with one object at a time. Knowing how these mechanisms work in principle can help you to decipher complex Python code.</div>
<br /></div>
* Just type <span style="font-family: "courier new" , "courier" , monospace; font-weight: bold;">import this</span><span style="font-family: inherit;"><span style="font-family: inherit;"> into a Python interpreter, or enter </span><b><span style="font-family: "courier new" , "courier" , monospace;">python -m this</span></b><span style="font-family: inherit;"> at the shell prompt, and hit return.</span></span><br />
<br />Stevehttp://www.blogger.com/profile/15732819755000554717noreply@blogger.com0tag:blogger.com,1999:blog-496482.post-36985347518100228522015-08-12T04:45:00.003-04:002015-08-12T05:01:00.952-04:00Pro tip: Use CDPATH in Your ShellThis is a tip I first picked up about thirty years ago (my God!) when I worked at Sun Microsystems and used the C shell fairly extensively. Fortunately there's no need to do so any more, as many of its more desirable features have been incorporated into <b>bash</b>.<br />
<br />
There's nothing worse, even with tab-completion, than having to stab through a sequence of directories to find the location you want. If you're anything like me there are typically three or four main directories that I use for about 80% of the work that I do.<br />
<br />
The <b>CDPATH</b> environment variable works pretty much like your <b>PATH</b> setting, except that instead of being used to locate executables it's used to locate directories. It comes into play when you issue a <b>cd</b> or <b>pushd</b> command. So, for example, on my personal machine my <b>.bash_profile</b> contains the following line:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;"><b>export CDPATH=.:~/Projects:~/Projects/Python/</b></span><br />
<br />
So when I try to change to a new directory the shell first looks in the current directory (it can cause real confusion if you don't look there first), then in my <b>Projects</b> directory, then in its <b>Python</b> sub-directory. So the command<br />
<br />
<b><span style="font-family: Courier New, Courier, monospace;">pushd PytDj</span></b><br />
<br />
takes me to my <b>~/Projects/Python/PytDj</b> project directory with no need to specify the path. I estimate this saves me at least a minute a day, so over thirty years it's saved me a substantial amount of time. Try it, and see what you think.Stevehttp://www.blogger.com/profile/15732819755000554717noreply@blogger.com1tag:blogger.com,1999:blog-496482.post-59904523263455353392015-06-14T09:09:00.000-04:002015-06-14T09:12:58.664-04:00A Short Musical(?) Introduction to InfinityWondering how best to convey the bigness of infinity, I came upon the idea of using a musical exposition. Please forgive the inadequate nature of the performance - like present-giving it's the thought that counts. It's a monologue on the nature of the smallest infinite cardinal. Enjoy. Or not ...<br />
<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/f_nE1h4rmDE" width="420"></iframe>Stevehttp://www.blogger.com/profile/15732819755000554717noreply@blogger.com0tag:blogger.com,1999:blog-496482.post-31055218233010950212015-05-20T06:08:00.001-04:002015-05-20T06:08:16.775-04:00What Kind of Geek am I? (1)I've been pondering about why sometimes progress seems hard to make when I am learning a new piece of technology, which other people apparently just pick up and start using with no trouble at all. I now wonder whether it's a combination of personality and knowledge.<br />
<br />
In common with many developers I like to understand things thoroughly. For me this means being able to construct satisfactorily self-consistent mental models that I can, effectively, "unit test" by applying <i>what-if</i> techniques. Unfortunately my history as a developer means that I have a detailed knowledge of system architecture. Without claiming to be fully up-to-date (for example the last time I <i>built</i> logic was in 1987, from Schottky TTL clocked at 12 MHz), when I use the term "full-stack" I include a <i>reasonably</i> detailed knowledge of <i>all</i> aspects of system architecture, including the hardware, operating system, language support libraries and application.<br />
<br />
In other words, I am (often subconsciously, thanks to many more than 10,000 hours of practice at this computer game) aware of lots of things that can go wrong at many different levels.<br />
<br />
I suspect this causes me, without specific motivation, to choose test cases that go “near the edge of the envelope”. It's frustrating when I'm learning because it often reveals deficiencies (most often in the documentation) of the “system under test” that can block progress; but I also believe it helps to integrate my newly-learned knowledge, and leaves me with valuable knowledge that you just can't pick up in the middle of the road.Stevehttp://www.blogger.com/profile/15732819755000554717noreply@blogger.com1tag:blogger.com,1999:blog-496482.post-86892283366243103112015-02-14T05:48:00.001-05:002015-02-14T05:49:23.737-05:00Carl Trachte: Mining Engineer Turned GeekAnother <a href="http://hawthornlandings.org/2015/02/13/a-place-to-hang-your-hat/" target="_blank">#LABHR</a> post.<br />
<br />
I first met Carl when he came to a training session for new PyCon speakers. He was very nervous, and concerned that his topic would not be of sufficient interest to his audience. I made a point of attending the beginning of his talk, and by the time I left there was no doubt in my mind that Carl would do well in the Python community.<br />
<br />
Over the years he has done invaluable work for the PSF, both in policing potential abuses of the Foundation's trademark for the Python programming language, and also in collecting sample descriptions of Python in many languages and alphabets to try and make Python's web presence more welcoming to those from diverse linguistic communities.<br />
<br />
He has been a PyCon volunteer for a while now, helping others to find what they need and demonstrating by example the helping spirit of Python and open source generally.<br />
<br />
Carl has done all this with no thought of return, and in doing them has helped uncountable numbers of Python users. Well done, Carl, and thanks!Stevehttp://www.blogger.com/profile/15732819755000554717noreply@blogger.com0tag:blogger.com,1999:blog-496482.post-21046053765989453442015-02-14T02:57:00.001-05:002015-02-14T02:57:50.303-05:00Brian Curtin: A Solid Record of Community InvolvementAs a personal <a href="https://twitter.com/search?q=%23LABHR" target="_blank">#LABHR</a> contribution (having already thanked recipients of PSF awards) I should like to bring to your attention a person by the name of <a href="https://twitter.com/brian_curtin" target="_blank">Brian Curtin</a>.<br />
<br />
If you are part of the Django world you may know Brian from his work with his then-local Chicago group, though he latterly moved to San Antonio. He has been <a href="http://blog.python.org/2011/04/meet-team-brian-curtin.html" target="_blank">featured as a Python core developer in the <i>Python Insider</i></a> blog, and more recently in <a href="http://www.blog.pythonlibrary.org/2014/11/10/pydev-of-the-week-brian-curtin/" target="_blank">Mike Driscoll's <i>Pydev of the Week</i> column</a>.<br />
<br />
Brian also contributes by serving as a Director of the Python Software Foundation, that worthy body charged with responsibility for the intellectual property in the Python programming language and in growing the international Python community. He is in essence its voice, having for a long time been the Foundation's Communications Officer. Though many others contribute from time to time, they do so under Brian's editorship, and I know from personal experience he is a great editor to work with.<br />
<br />
Brian has also spoken and volunteered at PyCon on a long-term basis. I can't think of a single area he's touched without making a contribution of some kind.<br />
<br />
So thanks, Brian, for making a difference, and good luck in your most recent role with Rackspace in San Antonio.Stevehttp://www.blogger.com/profile/15732819755000554717noreply@blogger.com0tag:blogger.com,1999:blog-496482.post-46666242341821933322015-02-13T15:57:00.002-05:002015-02-14T05:48:54.288-05:00Building a Hat RackLeslie Hawthorn, Elastic Search’s enthusiastic communities manager, has been involved with open source for quite a while, and <a href="http://hawthornlandings.org/2015/02/13/a-place-to-hang-your-hat/" target="_blank">has come up with what seems to be a good idea</a>. She's trying to get public acknowledgment for services to open source that often go unsung, and I recommend that you <a href="http://hawthornlandings.org/2015/02/13/a-place-to-hang-your-hat/" target="_blank">read her blog post</a> and take action on it yourself under hashtag #LABHR (Let's all build a hat rack). I certainly shall be doing, and this is the first of my actions. I gather the intention is to show developers some love on Valentine's Day to start with, but it would be amazing if this could become a continuous process.<br />
<br />
It was in the spirit of "building a hat rack" in the sense of making achievements visible that I first proposed the Python Software Foundation present Community Service Awards to deserving members of the community. The prize bestows a free place at PyCon to recipients, but mostly the certificate simply represents recognition that a group of your peers have recognized your efforts, which have typically been long-term and beneficial to a broad cross-section of many Python communities. Recipients are <a href="https://www.python.org/community/awards/psf-awards/" target="_blank">listed on the python.org web site</a>.<br />
<br />
More recently the Foundation introduced <a href="https://www.python.org/community/awards/psf-distinguished-awards/" target="_blank">Distinguished Service awards</a>, of which so far there have been two recipients.<br />
<br />
If you have anything to do with Python at all, even if you are “merely” a Python user, the selfless actions of these people have impacted your life in a huge way over the last 25 years, and I hope you are grateful to them, as I am.Stevehttp://www.blogger.com/profile/15732819755000554717noreply@blogger.com0tag:blogger.com,1999:blog-496482.post-40160447668815445842015-02-09T21:50:00.000-05:002015-02-11T22:48:09.380-05:00How to Get the Bits of Python You Need Where You Want ThemFollowing up my recent short video on <a href="http://holdenweb.blogspot.com/2015/02/how-to-get-almost-all-python-you-might.html" target="_blank">installing Anaconda</a> I now introduce <i><a href="http://conda.pydata.org/miniconda.html" target="_blank">miniconda</a></i>, which is a distribution that contains only Python and the <i><a href="http://conda.pydata.org/index.html" target="_blank">conda</a></i> software on which Anaconda is based. The remainder of the Python packages you need can be installed in virtual environments managed by <i>conda</i>.<br />
<br />
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/y5uOASEqn6Q" width="420"></iframe><br /></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
When you are building Python systems with mundane requirements this is a great way to put your environments together. From my experience so far it's professionally built and unusually well engineered. Kudos to <a href="http://continuum.io/" target="_blank">Continuum Analytics</a> for getting this stuff out.</div>
Stevehttp://www.blogger.com/profile/15732819755000554717noreply@blogger.com0tag:blogger.com,1999:blog-496482.post-81077726111009594692015-02-07T02:38:00.000-05:002015-07-28T20:08:58.393-04:00How to Get Almost All the Python You Might NeedI am often asked what is the easiest way to build Python environments. For development purposes it's most convenient to have a "batteries included" environment that can be pared down once development is over. Continuum Analytics have for a while offered an open source project called <i>Anaconda</i> to provide easy access to both Python and the batteries.<br />
<br />
If you are a Python professional and you get questions from people who would like to try the language I would suggest that the graphical installer would be most appropriate. For anyone familiar with the command line, the command-line installer is not only slightly smaller but allows the scripted creation of disposable Python environments which you can activate just by adding their <span style="font-family: Courier New, Courier, monospace;"><b>bin</b></span> subdirectory at the start of your path.<br />
<br />
The video should explain this in detail.<br />
<br />
<div>
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/VPH9kC7psFQ" width="420"></iframe></div>
<div>
<br />
In the video I create a disposable environment under /tmp. Anaconda environments are far heavier than a standard virtual environment, but they offer a huge variety of Python libraries without ever having to understand the complexities of package installation.<br />
<br />
<b><span style="font-size: x-small;">[For a more selective installation utility see <span style="color: #0000ee;"><u><i>How to Get the Bits of Python You Need Where You Want Them]</i></u></span></span></b><br />
<br /></div>
</div>
Stevehttp://www.blogger.com/profile/15732819755000554717noreply@blogger.com3tag:blogger.com,1999:blog-496482.post-20379085483022712942015-01-14T08:25:00.000-05:002015-01-17T16:38:16.232-05:00Puget Sound Python User Group, Jan 14, 2015The meeting started with one of the meeting's organizers, Tammy Lee, welcoming us to Dice Cabana. Alan Besner then took the MC slot to introduce tonight's speakers after a word from OfferUp's Arean, who explained that as the largest local mobile marketplace in the US they have collected some high volume data, and will be listening attentively to the talks. Unsurprisingly, OfferUp are hiring (their staff having grown about 400% in the last year).<br />
<br />
Tammy announced that the group was interested in reaching out to members to help them with their professional development. The group has a new logo designed by New Relic's Jen Pierce. It tweets as <b><a href="https://twitter.com/ps_python" target="_blank">@ps_python</a></b>, and they have a LinkedIn group "to make things less socially awkward." Tammy will be happy to talk to any members who want to get involved: <i>pugetsoundpython at gmail dot com</i>.<br />
<br />
The first speaker was Carlos Guestrin, founding CEO of Dato (formerly GraphLab), who is also Professor of Machine Learning at UW. His talk was about recent developments in machine learning. Companies have been collecting data for a long time, but early attempts at analytics were not really addressing the real questions.<br />
<br />
In talking to over 300 businesses with interests in machine learning, Carlos again and again has seen a failure to address the need to eliminate what Carlos called "duct tape and spit" work. Building tailored Hadoop systems is expensive and time-consuming, so we need a way to scale Python processes to the standard big-data ecosystem.<br />
<br />
Dato's mission was to empower people to handle all sorts of data sources at scale, even from a laptop. Users should never have out-of-memory issues, but the GraphLab Create product allows building analytic tools that will move up to web scale with GraphLab Produce.<br />
<br />
A first live demo was an image search, hosted on Amazon, matching with predictions made by a neural network running on Amazon infrastructure. An engineer who joined the team last October built <a href="http://phototag.herokuapp.com/" target="_blank">this demo</a> in a few days.<br />
<br />
A second demo showed a recommender built from Amazon product data. It allowed two people to list their tastes and then found a way from a favored product of one user to a favored product of another.<br />
<br />
Carlos is interested in allowing people to build their own applications, so he showed us an IPython Notebook that read in Amazon book review data. An interesting feature of Graphlab objects is that they have graphical representations in the Notebook, with the ability to drill down.<br />
<br />
Carlos built and trained a book recommender with a single function call. This is all very well, but how do we scale such a service? The answer is to take the recommender model and deploy it as a service hosted on EC2 over a number of machines. The system is robust to the failure of single systems, and uses cacheing to take advantage of repeated queries to the RESTful API.<br />
<br />
The underlying support infrastructure is written in "high-performance C++". The GraphLab components are based on an open source core, with an SDK that allows you to extend your coding however you want. GraphLab Create is unique in its ability to allow a laptop to handle terabyte volumes. It includes predictive algorithms and scales well - Carlos showed some impressive statistics on desktop performance. TAPAD had a problem with 400M nodes and 600M edges. Graphlab handled it where Mahout and Spark had failed.<br />
<br />
One of the key components is the SFrame, a scalable way to represent tabular data. These representations can be sharded, and can be run on a distributed cluster without change to the Python code. Another is the SGraph, which offers similarly scalable aproaches to graph data.<br />
<br />
The toolkits are based on an abstract pyrsid wehose base in the algorithms and SDK. Upon this is layered a machine learning layer.<br />
<br />
Deployment is very important. How can you connect predictive services to your existing web front-end? GraphLab aloows you to serve predictions in a robust scaleable way. Install<br />
<br />
Carlos closed by pointing out the Data Science and Dato Conference, whose fourth incarnation is in July in San Francisco.<br />
<br />
Q: What's the pricing model?<br />
A: You can use GraphLab Create for free; you can use Produce and other services either on annual license or by the hour.<br />
<br />
Q: How do you debug distributed machine learning algorithms.<br />
A: It's hard. We've been working to make it easier, and Carlos pushes for what he calls "insane customer focus"<br />
<br />
Q: Is SFrame an open source component?<br />
A: Yes.<br />
<br />
Q: What about training - how do you trrain your models"<br />
A: We have made it somewhat easier by producing tools. HTe second layer, choosing models and parameters, is assisted by recent developments. The next release will support automatic feature search.<br />
<br />
Q: Is the data store based on known technologies?<br />
A: It isn't a data store, it's en ephemeral representation. Use storage appropriate to your tasks.<br />
<br />
Q: Do you have a time series components?<br />
A: Yes, we are working on it, but we want to talk about whjat's interesting to potential customers?<br />
<br />
Q: Do you have use cases in personalized medicine?<br />
A: We've seen some interesting applications; one example reduced the cost of registering new drugs.<br />
<br />
Erin Shellman works at Nordstrom Data Lab, a small group of computer and data scientists. She built scrapers to extract data fomr sports retailers. Erin reminded us of the problems of actually getting your hands on the data you want. Volumes of data are effectively locked up in DOMs.<br />
<br />
The motivation for the project was to determine to optimum point to reduce prices on specific products. It was therefore necessary to extract the competitive data, which Erin decided to do with Scrapy. Erin likes the technology because it's adaptable and, being based on Twisted, super-fast.<br />
<br />
Using code examples (available from a Github repository) Erin showed us how to start a web scraping project. The first principal components are items.py, which tells Scrapy which data you want to scrape. In order to extract this kind of data means you really should look at the DOM, which can yield valuable information (one customer was including SKU-level product availability information in hidden fields!)<br />
<br />
The second component is the web crawler. Erin decided to start at one competitor's "brands" page, then follwo the brand's "shop all" link, whidh got her to a page full of products. The crawl setup subclasses the Scrapy CrawlSpider class. The page parser uses yield to generate successive links in the same page. Erin pointed out that Scrapy also has a useful interactive shell mode, which allows you to testt he assumptions on which you build your crawler.<br />
<br />
Erin found that smaller brands didn't implement a "shop all" page, and for those cases she had to implement logic to scrape the data from the page where it would normally appear.<br />
<br />
Erin's description of how to handle paginated multi-page listings showed that Scrapy will automatically omit already-processed pages, meaning it's easy to perform redundant searches where the same page may appear mutiple times in the result.<br />
<br />
Erin underlines the necessity of cleaning the data as early in the processing chain as possible, and showed some code she had used to eliminate unnecessary data. Interestingly Erin ended up collecting a lot more data than she had initially started by looking for. Disposition of the scraped data can be handled by a further component of Scrapy, which was not covered.<br />
<br />
Most of data science is data wrangling. Scraper code at https://github.com/erinshellman/backcountry-scraper<br />
<br />
Erin also pointed out that the next PyLadies Seattle is on Thursday, January 29th.<br />
<br />
Q: If you repeat scrapes, is there support for discovering DOM structure changes?<br />
A: Good question, I don't know. I assume there must be, but didn't feel I needed it.<br />
<br />
Q: If you ran this job over the course of 10 minutes (with 40,000+ GET requests) do you need to use stealth techniques?<br />
A: We haven't so far. Retailers aren't currently setting their web sites up to protect against such techniques.<br />
<br />
Q: What's the worst web site you've come across to scrape?<br />
A: I don't want to say; but you can tell a lot about the quality of the dev teams by scraping their pages.<br />
<br />
Q: Does Scrapy have support to honor robots.txt<br />
A: No, but the crawler can implement this function easily.<br />
<br />
Q: What techniques did you use to match information?<br />
A: Pandas was very helkpful in analysis.<br />
<br />
Q: What about web sites with a lot of client-side scripting?<br />
A: We didn't run into that problem, so didn't have to address the issues.<br />
<br />
Trey Causey from Facebook rose after the interval to talk on Pythonic Data Science: from __future__ import machine_learning. Try's side job is as a statistical consultant for an unnamed NFL team.<br />
<br />
The steps of data science are<br />
<br />
1. Get data<br />
2. Build Model<br />
3. Predict<br />
<br />
Python is quickly becoming the preferred language of the data science world. NumPy has given rise to Pandas, whose DataFrame structure is based on it. Pandas can interface with scikit-learn.<br />
<br />
A DataFrame offers fast ETL operatiopns, descriptive statistics, adn the ability to read in a wide variety of data sources. Trey showed a DataFrame populated with NFL data in which each row represented a play in a specific game, which had been processed to remove irrelevant events.<br />
<br />
Scikit-learn is a fast system for machine learning. New algorithms are being added with each release, and the consistent API they offer are a notable feature. It offers facilities for classification, regression, clustering, reducing dimensionality and preprocessing. This last is valuable, due to the high volume of data science work that is just getting the data in the desired form.<br />
<br />
Scikit-learn implements the interface of the Estimator class, and subclasses have .fit(X, y=None)m .transform() and .predict() methods. Some have .predict_proba() methods. The "algorithm cheat sheet" is an attempt to show how touse the package's features to obtain desired results.<br />
<br />
Suppose you are interested in the probability that a given team wins a game given the appearance of a particular play i that game. This allows coaches to answer questions like "should we punt on this fourth down?". This is therefore a classification problem, under the assumption that players are independent (which seems to be a ridiculous assumption, but in fact works pretty well(,<br />
<br />
The janitorial steps will involve looking at the data. Does it suffer frmo class imballances (e.g. many more wins than losses)? Does it need centering and scaling. How do I split my data set into training and prediction sets?<br />
<br />
A first study showed a histogram of # of plays vs. remaining time showed a major spike just before halftime and smaller spikes before the quarters due to the use of timeouts. The predictive technique used was "random forests." Testing the predictions was performed on both true and false negatoves and positives. Calibration is important for predictive forecasts. Sometimes you will need to use domain knowledge to wring information out of the data.<br />
<br />
Trey showed a number of graphics, showing various statistics which my total lack of football knowledge didn't allow me to interpret sensibly. He pointed out some of his important omissions, being quite frank about the shortcomings of his methodology. Feature engineering depends on subtleties of the data, and no confidence intervals are given. Putting models into production is difficult, and data serialization has not yet been suitably standardized.<br />
<br />
Data science may not bet easy, but it can be very rewarding. Read more from @treycausey (trey dot causey at gmail dot com) or at thespread.us.<br />
<br />
Q: Does what you are doing become less effective over time?<br />
A: In the NFL case most teams don't trust statistics, so it is difficult to get coaches to implement stats-based decisions making. In the larger context, if you get really good at predicting a particular phenomenon, you would expect performace to decline over time due to changing behavior.<br />
<br />
Q: Are there particular teams who are making visibly good or bad decisions?<br />
A: Yes. It's easy to see which coaches aren't optimizing at all, but even the best teams still have a way to go. The New York Times has a "fourthdownbot" that is fun.<br />
<br />
Q: Are you trying to develop mental constructs of what is right and wrong in feature engineering?<br />
A: That's a philosophical divide in the data science communities; some prefer more parsimonious models, which should yields actionable features, others prefer highly parameterized models with better predictive ability.<br />
<br />
Q: Do you understand more about the features in your data as you work with it?<br />
A: Yes, all the time, and the new features aren't always obvious at first. This is basically a knowledge representation problem. Sometimes there is just no signal ...<br />
<br />
Q: How are you giving the coaches this data?<br />
A: I can't tell you how. Cellphone communications are forbidden on the sidelines.<br />
<br />
Q: Are you REALLY good at fantasy football?<br />
A: Fantasy football's scoring system is highly variable; a lot of research shows that some scoring features can't be predicted. Usually FF's busy time is Trey's busy time too, so he tends to play like other people do and say "he's looking good this week."<br />
<br />
Thanks to all speakers for their amazing talks, and thanks to the group for hosting me.Stevehttp://www.blogger.com/profile/15732819755000554717noreply@blogger.com0tag:blogger.com,1999:blog-496482.post-66714289336404141802015-01-06T16:16:00.000-05:002015-01-14T08:04:36.148-05:00PyData London, January 2015 [EDIT: Updates talk with additional background and slide links]<br />
<br />
Tonight I'm attending the PyData London Meetup group for the first time.<br />
<br />
The meeting began with a short "What's New in the Python World," from the joint organizers, who assumed the audience was mainly here for the invited presentations. That's true -- like many others I find it interesting to learn what other Pythonistas are doing with their Py (so to speak), but it's also nice to hear a potted summary of "events of significance."<br />
<br />
I know from my own experiences that they (said organizers) will be DELIGHTED if you would offer any feedback at all. They are doing so much good work for nothing (and it can begin to feel like a thankless task) that we all owe it to them to pass on <i>any</i> suggestion that might help the group be even more effective. Similarly, if you would like to let me know anything about this, or future posts of this nature, just add your comment below. If you feel like making a critical comment at the same time, I am old enough and ugly enough to survive.<br />
<br />
Frank Kelly was introduced to talk about "<b><i><a href="http://www.slideshare.net/FrankKelly3/changepoint-detection-with-bayesian-inference" target="_blank">Changepoint Detection with Bayesian Inference</a></i></b>". After graduation Frank was sentenced to investigate rock strata produced as part of an oil exploration project. One initial problem was the transmission of information from the drill head (hundreds of feet down in the rock). They discovered that they could encode digital information by pulsing the highly viscous mud that lived in the well. As you can imagine, mud is not a very good transmission medium, and Frank's final-year project was to use Bayesian statistics to decode the transmissions.<br />
<br />
Frank's discussion of frequentist <i>vs</i> Bayesian methods was interesting. It revealed that Bayesian methods are a fundamentally different technique. Bayes was a non-conformist who is buried about ten minutes away from the meeting space at Lyst Studios. I don't know whether this was intended as a warning. Essentially, Bayesian methods used fixed data sets and tries to use post-hoc processing to understand the experimental results. Data is assumed to be generated as model data plus noise, which for Frank's purposes they could characterize as Gaussian white noise. Essentially the signal is the reading minus the noise, by integrating with respect to the "nuisance parameters."<br />
<br />
We saw a graphical demonstration of how this could be used to detect thresholds in noisy data, and how as the data tended to a lower and lower threshold the result of Franks analytical function tended towards a smooth curve, with no detectable thresholds indicated by minima or maxima.<br />
<br />
Frank then went on to discuss other applications of his technique related to Google search. There are pressures on Google to reveal the algorithms they use to produce their search results, but this is unlikely to happen as the algorithm represents Google's "secret sauce". Changes to Google's algorithms cause large fluctuations in results and sales for some companies.<br />
<br />
Then we were treated to a view of an IPython Notebook, though the code wasn't very readable (remember that<i><b> Command+</b></i> sequence, Mac presenters), but it was interesting to see a demonstration that a Google change had made a detectable difference to the traffic on sites. By presenting this kind of supporting evidence companies can at least give Google some facts about how the changes have affected them.<br />
<br />
Frank then went on to talk about applications to tropical storms, which generally have wind speeds over 17 m/s (35 m/s is classified as a hurricane). Data is available for the number of tropical storms per year since 1856, and Frank pointed out that there were spikes that correlated well with changes in the surface ocean temperature.<br />
<br />
Frank explained that he is now mixing Bayesian with frequentist techniques, and that he has done some informal research into correlations between external events such as Christmas and the Scottish independence referendum, with no really conclusive results (except that Christmas had more effect on the stock market than the referendum did). Overall a very interesting talk. Frank even promised that the published slides (now linked from the talk title above as well as <a href="https://holdenweb.blogspot.com/b/post-preview?token=44Il2koBAAA.zLHIozw9RnnoKyqyBjggHw.RMhcxSDf2AWCW9bSj9fyaA&postId=6671428933640414180&type=POST" target="_blank">here</a>) will include a link to a "Matlab to Python" conversion cheat sheet. Well done!<br />
<br />
In the Q and A session the first questioner asked whether Frank had benchmarked his methods against other change-detection algorithms. Frank felt this might be difficult because different algorithms produce different types of output. Next, someone asked whether Frank had tried any custom Bayesian analysis tools, but Frank had simply put his own code together. Next, someone asked whether the technology to communicate from the drill head were any better nowadays, and Frank said that things are now more sophisticated, but "you can't just stick a cable down the hole." A commenter pointed out that mud pulsing was still common five years ago, and asked whether it was easy to apply a moving window to the data. I'm not sure I understood the answer, but Frank seemed to think it could be used to produce online analysis tools. that would allow a sliding window to be applied to time series data. Next someone asked whether the technique could cope with different noise spectra/distributions. The answer was that the noise levels had to be modelled, and sometimes the noise was different after the change from before. The talk ended with a robust round of applause.<br />
<br />
There was then a break for beer and pizza, so don't blame me for any degradation of quality in the rest of this post. There are no guarantees. I met a few people while we were milling around, including a data scientist who had heard the the PyData meetups were friendly and relevant, and the business development manager of a company whose business is training scientists.<br />
<br />
The second talk of the evening was "<b><i><a href="http://www.slideshare.net/CalvinGiles/docker-for-data-science" target="_blank">Learning to Read URLs: Finding word boundaries in multi-word domain names with Python and sklearn</a></i></b>" by Calvin Giles.<br />
<br />
Calvin started out with a confession that he isn't a computer scientist but a data scientist, so he was describing algorithms that worked to solve his problems rather than theoretically optimal solutions.<br />
<br />
The basic problem: given a domain name such as <i>powerwasherchicago.com</i>, resolve it into words. The point is, if this minimal amount of semantic information can be extracted, you can avoid simple string comparisons and determine the themes that might be present in a relatively large collection of domain names. Calvin warned us that the code is the result of a single day's hacking project, based on Adthena's data of ten million unique domain names and third party data such as the Gutenberg project and the Google ngram viewer data sets.<br />
<br />
The process was to determine which of a number of possible sentences should be associated with the "words" found in a domain name. The first code snippet showed a way of extracting all the single words from the data (requiring at least two characters per word). A basic threshold detection was required, since low frequency words are not useful. The initial results were sufficiently interesting to move further research to the Google ngram dataset. This resulted in an English vocabulary or roughly 1,000,000 words. A random selection included "genéticos" and "lanzamantio", but Calvin was happy to allow anything that had a frequency of more than 1,000 in his corpus.<br />
<br />
Calvin then presented a neat algorithm to find the words that were present in a string. The list of potential words in <i>powerwasherchicago.com</i> seemed to have about fifty elements in it. <i>catholiccommentaryonsacredscripture.com</i> had 101 words in it, including a two-letter word, making it a very interesting test case.<br />
<br />
Calvin's algorithm to find the "most likely" set of words allows you to decide how likely the domain name is to occur given the potential words it could be made up from. Sadly with <i>n</i> substrings of the data you can generate 2^n sentences. Some convincing calculations were used to demonstrate that this wasn't a practical approach. The words should be non-overlapping and contiguous, however, so this allows us to limit the possibilities quite radically, but it isn't easy to find all subsets of non-overlapping words, This is, however, a major win in reducing the number of cases to be considered.<br />
<br />
Given the solution with least overlap, Calvin then chose to omit all "sentences" that were less than 95% of the length of the least-overlap solution. The code is all available on the slides, and I am hoping to be able to publish the URL (which Calvin said at the start of his talk would be available).<br />
<br />
The <i>get_sentences()</i> wrapper function was only seven lines of code (ignoring the called functionality), and quite comprehensible. The demonstration of its result was extremely convincing, reducing some very large potential sets to manageable proportions. The average domain turned out to have around 10,000 possible interpretations. The domains with more than that number of candidate interpretations turned out to be the most interesting.<br />
<br />
In order to produce a probability ordering for the possibilities, the algorithm prefers fewer longer words to a larger number of shorter words.A four-line function gave that ordering - a nice demonstration of Python's high-level abilities. While this did not give perfect results, Calvin convinced me that his methods, while possibly over-trained on his sample domains (modulo some fuzzy word-inference techniques that help to identify one-character words in the domain) are useful and workable.<br />
<br />
Calvin has now trained his system to understand which was the correct interpretation for the first hundred domain names. The visual representation of Calvin's latest results showed that even when the algorithm was "wrong" it was because the arbitrary ordering of equally-assessed domains had put the correct answer further down the list.<br />
<br />
He expects that in a set of 500 domains his system will currently give roughly two-thirds of the answers to be useful and the remainder to be randomly wrong. A missing part of the model is an assumption that all sentences are equally likely. Using Bayesian techniques one can determine the "likelihood" of the generated sentences being the intended interpretation. A somewhat pragmatic approach to this problem, inspired by <a href="http://norvig.com/spell-correct.html" target="_blank">Peter Norvig's spell-checker blog post</a>, used as much existing code as possible. The code<br />
<br />
<span style="font-family: Courier New, Courier, monospace;"><b> guess("powerwasherchicago")[0]</b></span><br />
<br />
returned a result of<br />
<br />
<span style="font-family: Courier New, Courier, monospace;"><b> 'power washer chicago'</b></span><br />
<br />
Calvin closed by suggesting that his initial training data set might have been too small, so he plans to use larger data sets and more sophisticated training methods with a rather more rigorous evaluation of the <i>ad hoc</i> decision making incorporated in his existing code base. His list of desired enhancements made sense, usually the sign of a talk that's related closely to the author's real-world experience. I was impressed that he is also considering how to make his work more usable. Another great talk!<br />
<br />
Someone opened the Q and A by asking whether the web site content couldn't be analysed algorithmically to provide more input to the parse. Calvin's reply reflected real-world experience that suggested it would not be easy to do this. Given there are 40,000,000 domain names, Calvin felt such a parser would be unlikely to be helpful. The final question asked whether finite-state transducers, as implemented in OpenFST (sadly written in C++) would be useful. Calvin replied that it might well be, and asked to talk to the questioner with a view to updating the slides.<br />
<br />
To close the meeting Product Madness announced that they were hiring, and I am happy to say that nobody wanted <i>me</i> to answer any questions, despite the organizers putting me on the spot!<br />
<br />
Thanks to Lyst for hosting. This was a most stimulating meeting, and I'll be attending this group again whenever I can.<br />
<br />
<br />
<br />
<br />Stevehttp://www.blogger.com/profile/15732819755000554717noreply@blogger.com0tag:blogger.com,1999:blog-496482.post-40031386834252262732014-12-09T11:35:00.001-05:002014-12-09T11:35:28.360-05:00Python Training Day FeedbackAfter a day at <a href="http://www.churchhouseconf.co.uk/" target="_blank">The Church House</a> I am happy to say that the <a href="https://github.com/DevTeam-TheOpenBastion/int-py-notes" target="_blank">Intermediate Python repository</a> is in much better shape to move forwards.<br />
<br />
<b>Work on the Repository</b><br />
About eight people turned up throughout the day, with the stalwarts being Kevin Dwyer and João Miguel Neves. With their help I investigated some thorny problems I had created for myself in the area of git filtering. It turns out that there is <a href="http://bugs.python.org/issue16333" target="_blank">a subtle bug in Python's JSON generation</a> which has existed for quite a long time.<br />
<br />
We eventually worked around it by adding <span style="font-family: Courier New, Courier, monospace;"><b>import simplejson as json</b></span> for now, though I suspect a better fix might be to explicitly add a separator specification. Anyway, with that change the filtering then started to work predictably, and we could move forward with a review of the notebook contents to ensure that changes I made during the teaching were incorporated into the main code base.<br />
<br />
With three of us hacking away that work didn't take very long, but before it could commence there was a certain amount of git-wrangling that I confess I probably wouldn't have managed anywhere near as quickly without Kevin's and João's help.<br />
<br />
<b>Training Market Discussions</b><br />
All in all quite a success, and we also spent time discussing the UK training market for Python. I've a few more ideas now about how to approach that market, but if you, dear reader, have any ideas I would be happy to here them either in the comments below or through <a href="http://holdenweb.com/contact/Training%20Suggestions" target="_blank">my web site's contact page</a>.<br />
<br />
<b>Thank You</b><br />
Thanks to everyone who turned up or merely wished the enterprise well. I am really looking forward to spending more time in the UK and helping to encourage even more Python use. Thanks also to the staff at The Church House for their excellent attention. We couldn't have been better taken care of.Stevehttp://www.blogger.com/profile/15732819755000554717noreply@blogger.com7tag:blogger.com,1999:blog-496482.post-4152152836150255272014-12-08T17:13:00.001-05:002015-01-06T08:40:32.277-05:00Python Dev of the WeekI'd like to thank Mike Driscoll for running his <i>Python Dev of the Week</i> series of blog posts. I was fortunate enough <a href="http://www.blog.pythonlibrary.org/2014/12/01/pydev-of-the-week-steve-holden/" target="_blank">to be featured</a> a while ago, and previous victims include <a href="http://www.blog.pythonlibrary.org/2014/11/24/pydev-of-the-week-carl-trachte/" target="_blank">Carl Trachte</a>, <a href="http://www.blog.pythonlibrary.org/2014/11/17/pydev-of-the-week-michael-herman/" target="_blank">Michael Herman</a>, <a href="http://www.blog.pythonlibrary.org/2014/11/10/pydev-of-the-week-brian-curtin/" target="_blank">Brian Curtin</a>, <a href="http://www.blog.pythonlibrary.org/2014/11/03/pydev-of-the-week-luciano-ramalho/" target="_blank">Luciano Ramalho</a>, <a href="http://www.blog.pythonlibrary.org/2014/10/27/pydev-of-the-week-werner-bruhin/" target="_blank">Werner Bruhin</a>, <a href="http://www.blog.pythonlibrary.org/2014/10/20/pydev-of-the-week-facundo-batista/" target="_blank">Facundo Batista</a> and <a href="http://www.blog.pythonlibrary.org/2014/10/13/pydev-of-the-week-ben-rousch/" target="_blank">Ben Rousch</a>.<br />
<br />
I hope Mike keeps going with this series. There are many interesting personalities in the Python world, and this brings them just a little closer.Stevehttp://www.blogger.com/profile/15732819755000554717noreply@blogger.com3tag:blogger.com,1999:blog-496482.post-31344259131874523742014-12-02T15:10:00.004-05:002014-12-09T09:33:03.154-05:00UK Python Training Open Day and LunchRegular readers (both?) know that I live in the USA but hail from the UK, where I still return regularly to stay in touch with family and friends. So to dip a toe in the UK training waters I booked a room (rather a nice one, as those who have attended <a href="https://us.pycon.org/2015/about/what-is-pycon/" target="_blank">other events</a> <a href="http://www.djangocon.us/" target="_blank">I organized</a> will not be surprised to learn) and put out an announcement that I was <a href="http://holdenweb.blogspot.com/2014/11/a-new-python-class.html" target="_blank">running a Python Programming Skills Lab</a>. <a href="https://www.eventbrite.com/e/python-programming-skills-lab-with-steve-holden-tickets-14137857713" target="_blank">You could have booked a place here</a>. Of course if this were the movies, the spirit of “if you build it they will come” would rule and I could welcome those wishing to drink at the Python fount. But it isn't.<br />
<br />
So<br />
<blockquote class="tr_bq">
a) I am not a marketing genius;<br />
b) this is not the movies.</blockquote>
Result: I am now planning to spend the day in said reserved room, working on my current open source project, whose sadly neglected repository can be found in <a href="https://github.com/DevTeam-TheOpenBastion/int-py-notes" target="_blank">a weed-infested corner of Github</a>. This is the code I used as a script for the videos which (if you are reading my blog) you should see advertised up at top right. The code is presented as iPython Notebooks, and only some of them are properly documented in interspersed Markdown cells, so if I end up spending the day alone then at least some sensible purpose will have been served.<br />
<br />
With that in mind the Skills Lab is now metamorphosing into an open Python Training Day. I understand this is very short notice (I'm not very good at operations either, go figure), but if you have any interest in either receiving Python training or having such training presented to a target group I would be delighted to talk with you on <b>Tuesday December 9, 2014 at any time between 10:00 am and 4:30 pm</b> at the <a href="http://www.churchhouseconf.co.uk/" target="_blank">Church House Conference Centre</a> in Westminster.<br />
<br />
If you would like to join me for lunch then <a href="https://www.eventbrite.com/e/uk-python-training-day-tickets-14720737121" target="_blank">please sign up</a> (there are 12 places for lunch) and arrive no later than 12:30. If you simply want to drop in and say hello (or, better still, help work on the codebase) then feel free to arrive at any time during the advertised hours and stay as long as you like (but please do <a href="https://www.eventbrite.com/e/uk-python-training-day-tickets-14720737121" target="_blank">sign up for lunch</a> if you plan to eat). It would be helpful if you <a href="https://www.eventbrite.com/e/uk-python-training-day-tickets-14720737121" target="_blank">reserved a drop-in place</a> even if you aren't coming to eat. Those with an interest in beer might want to arrive towards the end of the proceedings so a post-event excursion to a licensed hostelry can be entertained if appropriate.<br />
<br />
<a href="http://www.churchhouseconf.co.uk/corporate_events/rooms/sir_herbert_baker_room" target="_blank">The room reserved for this event</a> is absolutely delightful, with a view across the Dean's Yard. I welcome all Python friends and anyone who would like to get to know me professionally to visit at some convenient time during that day. But do remember to <a href="https://www.eventbrite.com/e/uk-python-training-day-tickets-14720737121" target="_blank">reserve a place</a> if you want lunch!<br />
<br />
I have had very little time to work on the Github repository since the videos were shot, and yearn for an army of Internet interns to help me improve what I believe are useful open-source training materials. In the absence of visitors that day, any spare time I have on that day will go to improve the Notebooks, so at the very least the curated Notebook collection will become more useful.Stevehttp://www.blogger.com/profile/15732819755000554717noreply@blogger.com0tag:blogger.com,1999:blog-496482.post-47474105428302635202014-11-30T20:56:00.000-05:002014-11-30T20:56:29.905-05:00“Rock Star” ProgrammersI've finally realized just what, exactly, so gets up my nose when I see organizations advertising for “rock star” programmers. To understand you need to cast your mind back (assuming it then existed) to 1971 (when I was in my first decade as a programmer) and Gerald Weinberg had just produced <i><a href="http://books.google.co.uk/books?id=76dIAAAAMAAJ&pgis=1" target="_blank">The Psychology of Computer Programming</a></i>, in which he concluded that over-identification with the code one produced could, in interesting ways, be counter-productive.<br />
<br />
He observed that programmers who were reluctant to share their code tended to hold on to false views of what might be causing issues rather longer than those who were open to review and discussion. My own development as a programmer was greatly aided by this approach, and at university a couple of close friends in particular discussed every aspect of the code we were creating.<br />
<br />
Forty years later Weinberg's “egoless” approach, in which mistakes are accepted as inevitable and reviews are performed in a collegial way, remains the sanest way to produce code. Given that computer programming is fast becoming a mainstream activity it seems perverse to deliberately select for ego when seeking programming talent, since the inevitable shortfall in humility will ultimately work to undermine the rock star's programming skills.<br />
<br />
When I think of the best programmers I know, the foremost characteristic they share is a modesty about their own achievements which others would do well to emulate. So, can we please dispel the myth of the “rock star” programmer? The best programmers <i>can't</i> be rock stars. Rock star egoism will stand in the way of developing your programming skills.Stevehttp://www.blogger.com/profile/15732819755000554717noreply@blogger.com3tag:blogger.com,1999:blog-496482.post-23870915163171617012014-07-08T09:49:00.000-04:002014-07-08T11:50:23.823-04:00Is Python Under Threat from the IRS?<span style="font-size: x-small;"><b>Readers should remember that I no longer have any official standing in the Foundation other than my long-standing membership, but this post is informed by eight years on the board, over three of them as its chair.</b></span><br />
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span>
Nicholas Tollervey (<a href="https://github.com/ntoll/programmer_pythonical" target="_blank">author</a> and <a href="http://vimeo.com/50322369" target="_blank">performer</a> of <i>A Programmer Pythonical</i>) asked an interesting question on the Python Software Foundation's membership list today. Despite his misgivings it is one that will be of interest to many Python users, so I am grateful for his permission to quote the essence of it here.<br />
<br />
<blockquote class="tr_bq">
<span style="font-family: Georgia, Times New Roman, serif;">I've noticed rumblings on the web about the IRS denying nonprofit/charitable status to various free software based foundations/organisations/legal entities similar to the PSF. <a href="http://www.infoworld.com/d/open-source-software/are-open-source-foundations-nonprofits-the-irs-says-no-245545" target="_blank">In case you've missed it, here is a high level summary</a>.<br />My questions are:<br />1) Is the PSF likely to be affected by this change of view from the IRS?<br />2) If so, do we have contingency for dealing with this (basically,<br />what are our options)?</span></blockquote>
<br />
<span style="font-family: Arial, Helvetica, sans-serif;"><br /></span>
The answer to the first question is <i>absolutely not</i>. The PSF is a long-standing 501(c)(3) non-profit in good standing. The recently-reported issues are all to do with current applications for non-profit status. It's fair to say that the IRS is applying scrutiny to such applications, but they are, after all, responsible for making sure that applications are genuine. As long as an existing non-profit makes the necessary returns and complies with all applicable laws, and as long as it continues to honor its requirement to maintain broad public support, there is no reason why the IRS would represent any kind of threat.<br />
<hr />
<h3>
<div style="text-align: center;">
The IRS does not exist to help open source</div>
<div style="text-align: center;">
devotees to build a bright new world</div>
</h3>
<hr style="text-align: center;" />
Some of those rejected have been advised to apply for a different form of non-profit status, others are reconsidering their options. Good legal advice is imperative when starting any such enterprise, and that requires a specialist. There is a feeling that the IRS might make better decisions if it could be better-informed about open source. From my limited knowledge of the recent cases I'd say that it's essential to ensure that your application has a sound basis in non-profit law. The IRS does not exist to help open source devotees to build a bright new world.<br />
<br />
The answer to the second question is that loss of non-profit status would be a blow to the Foundation, but there's no reason why even that should be fatal to Python, though I very much doubt there is serious planning for such an eventuality. Ultimately the Foundation's the bylaws include a standard winding-up clause that requires asset transfer to a similar/suitable non-profit, so assets cannot be stripped even under those circumstances, including the ability to license Python distributions.<br />
<br />
The developers could simply migrate to a different development base. They aren't directed or controlled in any way by the Foundation, which in the light of recent decisions it turns out is probably a good model. If the PSF were <i>directing</i> the development of the language there might have been a real risk of it being seen as no different from a software house or vendor, and it is at that point that doubts about non-profit status can be raised.<br />
<h4>
</h4>
<hr />
<h3 style="text-align: center;">
The Foundation's mission is ... therefore<br />genuinely educational and charitable</h3>
<hr />
<div style="text-align: left;">
The Foundation's mission is to promote the growth of the language (check) and the development of the international Python community (check) and its mission is therefore genuinely educational and charitable. So even were it to apply again today I suspect the application might succeed. Fortunately, that doesn't have to be put to the test.</div>
Stevehttp://www.blogger.com/profile/15732819755000554717noreply@blogger.com0tag:blogger.com,1999:blog-496482.post-23317986675056653172014-07-02T09:59:00.000-04:002014-07-02T10:47:45.230-04:00Closures Aren't Easy<script src="http://code.jquery.com/jquery-1.10.1.min.js" type="text/javascript"></script>
<script src="http://code.jquery.com/jquery-1.10.1.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(function() {
$(".input_prompt,.output_prompt").hide();
$("pre").css({
"font-size": "77%",
"background-color": "rgb(240, 240, 240)",
"padding": "5px",
"border": "3px",
"border-color": "rgb(210, 210, 225)",
"border-style": "solid",
"overflow-x": "auto",
"white-space": "pre",
"word-wrap": "normal",
"font-family": "Monaco,Menlo,Consolas,\"Courier New\",monospace"
});
$(".rendered_html").css("margin-bottom", "0.75em");
$(".text_cell_render").css("font-size", "90%");
$(".output_subarea pre").css("background-color", "rgb(200, 200, 200)");
})
</script>
<b><span style="font-size: x-small;">Edit: This issue was reported (<a href="http://bugs.python.org/issue21904">http://bugs.python.org/issue21904</a>) and closed as "not a bug"</span></b><br />
<br />
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
This blog was written as an IPython Notebook. Some of the implementation details it discusses are specific to CPython, the default implementation, and may work differently in other implementations. To keep the code clean, all necessary imports are made immediately below. I habitually import <code>print_function</code> because I have become used to the Python 3 way of doing things, but this particular post was made using CPython 3.3.2.</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">
In [1]:
</div>
<div class="inner_cell">
<div class="input_area">
<div class="highlight">
<pre><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">print_function</span>
<span class="kn">from</span> <span class="nn">dis</span> <span class="kn">import</span> <span class="n">dis</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="k">print</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">version</span><span class="p">)</span>
</pre>
</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt">
</div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>3.3.2 (default, Nov 19 2013, 03:15:33)
[GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)]
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h3 id="the-problem">
The Problem</h3>
In my <em><a href="http://shop.oreilly.com/product/110000529.do">Intermediate Python</a></em> video series I discuss decorators, and point out that classes as well as
functions can be decorated. As an example of this possibility I used a class decorator that wraps
each of the class's methods in a function that prints out a message before calling the original
method (or so I thought). Here is the relevant code.</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">
In [2]:
</div>
<div class="inner_cell">
<div class="input_area">
<div class="highlight">
<pre><span class="k">def</span> <span class="nf">barking</span><span class="p">(</span><span class="n">cls</span><span class="p">):</span>
<span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">cls</span><span class="o">.</span><span class="n">__dict__</span><span class="p">:</span>
<span class="k">if</span> <span class="n">name</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">"__"</span><span class="p">):</span>
<span class="k">continue</span>
<span class="n">func</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">woofer</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Woof"</span><span class="p">)</span>
<span class="k">return</span> <span class="n">func</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">woofer</span><span class="p">)</span>
<span class="k">return</span> <span class="n">cls</span>
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
The essence of the decorator is to iterate over the class's <code>__dict__</code>, ignoring the so-called "dunder" names. Strictly we should perhaps also check that the name <em>ends</em> as well as begins with a double underscore, but it does not affect the example. Each method is then replaced with a wrapped version of itself that prints "Woof" before calling the original method.<br />
This seemed to work fine on a class with a single method.</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">
In [3]:
</div>
<div class="inner_cell">
<div class="input_area">
<div class="highlight">
<pre><span class="nd">@barking</span>
<span class="k">class</span> <span class="nc">dog_1</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">shout</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="s">"hello from dog_1"</span><span class="p">)</span>
<span class="n">d1</span> <span class="o">=</span> <span class="n">dog_1</span><span class="p">()</span>
<span class="n">d1</span><span class="o">.</span><span class="n">shout</span><span class="p">()</span>
</pre>
</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt">
</div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>Woof
hello from dog_1
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
I then defined a further class that inherited from <code>dog_1</code> with two additional methods, and decorated that. The inheritance is irrelevant: the significant fact is that two methods will be processed in the decorator loop, but it does demonstrate that superclass attributes do not appear in the subclass's <code>__dict__</code>.</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">
In [4]:
</div>
<div class="inner_cell">
<div class="input_area">
<div class="highlight">
<pre><span class="nd">@barking</span>
<span class="k">class</span> <span class="nc">dog_3</span><span class="p">(</span><span class="n">dog_1</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">wag</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="s">"a dog_3 is happy"</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">sniff</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="s">"a dog_3 is curious"</span><span class="p">)</span>
<span class="n">d3</span> <span class="o">=</span> <span class="n">dog_3</span><span class="p">()</span>
<span class="n">d3</span><span class="o">.</span><span class="n">wag</span><span class="p">();</span> <span class="n">d3</span><span class="o">.</span><span class="n">sniff</span><span class="p">();</span> <span class="n">d3</span><span class="o">.</span><span class="n">shout</span><span class="p">()</span>
</pre>
</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt">
</div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>Woof
a dog_3 is curious
Woof
a dog_3 is curious
Woof
hello from dog_1
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
You have probably spotted the error already: calling both the <code>wag()</code> and the <code>sniff()</code> methods gives the same result, which is to say that both wrapped methods in fact call the same original method. Unfortunately I missed this during development and production of the video code, but it was soon picked up by an eagle-eyed viewer who reported it via O'Reilly's web site.</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h3 id="the-explanation">
The Explanation</h3>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
When a nested function makes references to variables in the containing function (<em>non-local</em> references) it is known as a <em>closure</em>. The interpreter has to ensure that the values referred to are still available after the call to the outer function terminates and the function call namespace is destroyed - otherwise, referenced objects could become garbage if the terminating function contained the only reference to the value. It does so by generating a <em>cell</em> object and storing the value in an element of the function's <code>__closure__</code> attribute, which is either <code>None</code> if the function does not refer to non-local cells or a tuple of non-local references.</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
The next two code blocks each define a function. The first is a regular function without non-local references, the second is a closure with a reference to the name <code>x</code> from the enclosing function's namespace. You can see the difference in the bytecode reported by the <code>dis</code> module, and also that they return different results when created with and called with the same arguments.</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">
In [5]:
</div>
<div class="inner_cell">
<div class="input_area">
<div class="highlight">
<pre><span class="k">def</span> <span class="nf">f_non_closure</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">inner</span><span class="p">(</span><span class="n">y</span><span class="p">):</span>
<span class="k">return</span> <span class="n">y</span>
<span class="k">return</span> <span class="n">inner</span>
<span class="n">non_closure</span> <span class="o">=</span> <span class="n">f_non_closure</span><span class="p">(</span><span class="mi">240</span><span class="p">)</span>
<span class="n">dis</span><span class="p">(</span><span class="n">non_closure</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Value ="</span><span class="p">,</span> <span class="n">non_closure</span><span class="p">(</span><span class="mi">128</span><span class="p">))</span>
</pre>
</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt">
</div>
<div class="output_subarea output_stream output_stdout output_text">
<pre> 3 0 LOAD_FAST 0 (y)
3 RETURN_VALUE
Value = 128
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">
In [6]:
</div>
<div class="inner_cell">
<div class="input_area">
<div class="highlight">
<pre><span class="k">def</span> <span class="nf">f_closure</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">inner</span><span class="p">(</span><span class="n">y</span><span class="p">):</span>
<span class="k">return</span> <span class="n">x</span>
<span class="k">return</span> <span class="n">inner</span>
<span class="n">closure</span> <span class="o">=</span> <span class="n">f_closure</span><span class="p">(</span><span class="mi">240</span><span class="p">)</span>
<span class="n">dis</span><span class="p">(</span><span class="n">closure</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Value ="</span><span class="p">,</span> <span class="n">closure</span><span class="p">(</span><span class="mi">128</span><span class="p">))</span>
</pre>
</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt">
</div>
<div class="output_subarea output_stream output_stdout output_text">
<pre> 3 0 LOAD_DEREF 0 (x)
3 RETURN_VALUE
Value = 240
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
You can clearly see the difference in the code. The non-closure uses a <code>LOAD_FAST</code> operation that loads a local value from element 0 of the local namespace. The closure uses <code>LOAD_DEREF</code>, which loads a value from the function's <code>__closure__</code> attribute. So let's take a look at the <code>__closure__</code> of both functions.</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">
In [7]:
</div>
<div class="inner_cell">
<div class="input_area">
<div class="highlight">
<pre><span class="k">print</span><span class="p">(</span><span class="n">non_closure</span><span class="o">.</span><span class="n">__closure__</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">closure</span><span class="o">.</span><span class="n">__closure__</span><span class="p">)</span>
</pre>
</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt">
</div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>None
(<cell at 0x10bbcb9f0: int object at 0x10a953ba0>,)
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
Unsurprisingly the regular function does not have a value for its <code>_closure__</code> attribute. The closure, however, does - it is a tuple of <em>cell</em> objects, created by the interpreter. And if we want, we can obtain the values associated with the cells.</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">
In [8]:
</div>
<div class="inner_cell">
<div class="input_area">
<div class="highlight">
<pre><span class="k">print</span><span class="p">(</span><span class="n">closure</span><span class="o">.</span><span class="n">__closure__</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">cell_contents</span><span class="p">)</span>
</pre>
</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt">
</div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>240
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
This should make it obvious that the cell objects in the <code>__closure__</code> tuple are there so that values from the enclosing namespace remain available after that namespace has been destroyed. Those values herefore do not become garbage when the enclosing function terminates, returning the inner function (which is a closure). And the <code>LOAD_DEREF 0</code> opcode simply loads the contents of the cell. It puts the function's <code>__closure__[0].cell_contents</code> onto the stack to be used (in this case) as a return value (and because it's written in C, it's much faster than the Python).</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
Let's complicate things a little by writing a function that returns a <em>tuple</em> of functions. The intention is that each function returned in the tuple should add successively larger numbers to its argument <code>x</code>: the first one should return <code>x+0</code>, the second <code>x+1</code>, the third <code>x+2</code> and so on. You find, however, that this does not happen.</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">
In [9]:
</div>
<div class="inner_cell">
<div class="input_area">
<div class="highlight">
<pre><span class="k">def</span> <span class="nf">multiple_closures</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
<span class="n">functions</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">inner</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
<span class="k">return</span> <span class="n">x</span><span class="o">+</span><span class="n">i</span>
<span class="n">functions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">inner</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">inner</span><span class="p">,</span> <span class="s">"Returned"</span><span class="p">,</span> <span class="n">inner</span><span class="p">(</span><span class="mi">10</span><span class="p">),</span> <span class="n">inner</span><span class="o">.</span><span class="n">__closure__</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">return</span> <span class="n">functions</span>
<span class="n">functions</span> <span class="o">=</span> <span class="n">multiple_closures</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
<span class="k">print</span><span class="p">([</span><span class="n">f</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">functions</span><span class="p">])</span>
</pre>
</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt">
</div>
<div class="output_subarea output_stream output_stdout output_text">
<pre><function multiple_closures.<locals>.inner at 0x10c808440> Returned 10 <cell at 0x10c817948: int object at 0x10a951da0>
<function multiple_closures.<locals>.inner at 0x10c808560> Returned 11 <cell at 0x10c817948: int object at 0x10a951dc0>
<function multiple_closures.<locals>.inner at 0x10c808050> Returned 12 <cell at 0x10c817948: int object at 0x10a951de0>
[12, 12, 12]
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
The output above might at first glance seem confusing. During creation of the functions inside <code>multiple_closures()</code> they appear to work perfectly well. After returning from that function, however, they all return the same result when called with the same argument. We can find out why by examining the <code>__closure__</code> of each function.</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">
In [10]:
</div>
<div class="inner_cell">
<div class="input_area">
<div class="highlight">
<pre><span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">functions</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">__closure__</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</pre>
</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt">
</div>
<div class="output_subarea output_stream output_stdout output_text">
<pre><cell at 0x10c817948: int object at 0x10a951de0>
<cell at 0x10c817948: int object at 0x10a951de0>
<cell at 0x10c817948: int object at 0x10a951de0>
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
The reason that the functions all give the same result is that <strong><em>they all use the same cell</em></strong> in their <code>__closure__</code>. The interpreter assumes that since all functions refer to the same local variable they can all be represented by the same cell (despite the fact that the variable had different values at the different times it was used in different functions). Precisely the same thing is happening with the decorators in <em>Intermediate Python</em>.</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
If you read the code of the <code>barking()</code> decorator carefully you can see that <code>name</code>, <code>func</code> and <code>woofer</code> are all names local to the <code>barking()</code> decorator function, and that <code>func</code> <em>is used inside the inner function, making it a closure</em>. Which means that all the methods end up referring to the last method processed, apparently in this case <code>sniff()</code>.</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">
In [11]:
</div>
<div class="inner_cell">
<div class="input_area">
<div class="highlight">
<pre><span class="k">print</span><span class="p">(</span><span class="n">d3</span><span class="o">.</span><span class="n">wag</span><span class="o">.</span><span class="n">__closure__</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">cell_contents</span><span class="o">.</span><span class="n">__name__</span><span class="p">)</span> <span class="c"># In Python 2, use __func__</span>
<span class="k">print</span><span class="p">(</span><span class="n">d3</span><span class="o">.</span><span class="n">sniff</span><span class="o">.</span><span class="n">__closure__</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">cell_contents</span><span class="o">.</span><span class="n">__name__</span><span class="p">)</span> <span class="c"># In Python 2, use __func__</span>
</pre>
</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt">
</div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>sniff
sniff
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
It now becomes obvious that the <code>func</code> references in the inner <code>woofer()</code> function are all using the same local variable, which is represented by the same cell each time the loop body is executed. Hence, since a cell can only have a single value, they all refer to the same method.</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">
In [12]:
</div>
<div class="inner_cell">
<div class="input_area">
<div class="highlight">
<pre><span class="k">print</span><span class="p">(</span><span class="n">d3</span><span class="o">.</span><span class="n">sniff</span><span class="o">.</span><span class="n">__closure__</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">d3</span><span class="o">.</span><span class="n">wag</span><span class="o">.</span><span class="n">__closure__</span><span class="p">)</span>
</pre>
</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt">
</div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>(<cell at 0x10c817788: function object at 0x10c81f4d0>,)
(<cell at 0x10c817788: function object at 0x10c81f4d0>,)
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h3 id="is-this-a-bug-">
Is This a Bug?</h3>
I suspect this question is above my pay grade. It would certainly be nice if I could get this code to work as-is, but the simple fact is that at present it won't. Whether this is a bug I am happy to leave to the developers, so I will post an issue on <a href="http://bugs.python.org/"><code>bugs.python.org</code></a> and see what they have to say. There's also the question of whether any current code is likely to be relying on this behavior (though I rather suspect not, given its unhelpful nature) - backwards compatibility should ideally not be broken.</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h3 id="workaround">
Workaround</h3>
The issue here is that different uses of the same non-local variable from a function will always reference the same cell, and no matter what the value was at the time it was referenced the cell always contains the final value of that variable.<br />
So a fairly simple, though somewhat contorted, workaround is to avoid multiple uses of the same non-local variable in different closures.</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">
In [13]:
</div>
<div class="inner_cell">
<div class="input_area">
<div class="highlight">
<pre><span class="k">def</span> <span class="nf">isolated_closures</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
<span class="n">functions</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">wrapper</span><span class="p">(</span><span class="n">i</span><span class="o">=</span><span class="n">n</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">inner</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
<span class="k">return</span> <span class="n">x</span><span class="o">+</span><span class="n">i</span>
<span class="k">return</span> <span class="n">inner</span>
<span class="n">f</span> <span class="o">=</span> <span class="n">wrapper</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
<span class="n">functions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="s">"Returned"</span><span class="p">,</span> <span class="n">f</span><span class="p">(</span><span class="mi">10</span><span class="p">),</span> <span class="n">f</span><span class="o">.</span><span class="n">__closure__</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">return</span> <span class="n">functions</span>
<span class="n">functions</span> <span class="o">=</span> <span class="n">isolated_closures</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
<span class="k">print</span><span class="p">([</span><span class="n">f</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">functions</span><span class="p">])</span>
</pre>
</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt">
</div>
<div class="output_subarea output_stream output_stdout output_text">
<pre><function isolated_closures.<locals>.wrapper.<locals>.inner at 0x10c826c20> Returned 10 <cell at 0x10c817e88: int object at 0x10a951da0>
<function isolated_closures.<locals>.wrapper.<locals>.inner at 0x10c8264d0> Returned 11 <cell at 0x10c817ec0: int object at 0x10a951dc0>
<function isolated_closures.<locals>.wrapper.<locals>.inner at 0x10c826b00> Returned 12 <cell at 0x10c817ef8: int object at 0x10a951de0>
[10, 11, 12]
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
In the code above, <code>inner()</code> is still a closure, but each time it is defined the definition takes plce in a different local namespace associated with a new call to <code>wrapper()</code>, and so each cell is a reference to a different local (to <code>wrapper()</code> - nonlocal to <code>inner()</code>) variable, and they do not collide with each other. Redefining the <code>barking()</code> decorator as follows works the same trick for that.</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">
In [14]:
</div>
<div class="inner_cell">
<div class="input_area">
<div class="highlight">
<pre><span class="k">def</span> <span class="nf">barking</span><span class="p">(</span><span class="n">cls</span><span class="p">):</span>
<span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">cls</span><span class="o">.</span><span class="n">__dict__</span><span class="p">:</span>
<span class="k">if</span> <span class="n">name</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">"__"</span><span class="p">):</span>
<span class="k">continue</span>
<span class="n">func</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">wrapper</span><span class="p">(</span><span class="n">func</span><span class="o">=</span><span class="n">func</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">woofer</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Woof"</span><span class="p">)</span>
<span class="k">return</span> <span class="n">func</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
<span class="k">return</span> <span class="n">woofer</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">wrapper</span><span class="p">(</span><span class="n">func</span><span class="p">))</span>
<span class="k">return</span> <span class="n">cls</span>
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="prompt input_prompt">
In [15]:
</div>
<div class="inner_cell">
<div class="input_area">
<div class="highlight">
<pre><span class="nd">@barking</span>
<span class="k">class</span> <span class="nc">dog_3</span><span class="p">(</span><span class="n">dog_1</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">wag</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="s">"a dog_3 is happy"</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">sniff</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="s">"a dog_3 is curious"</span><span class="p">)</span>
<span class="n">d3</span> <span class="o">=</span> <span class="n">dog_3</span><span class="p">()</span>
<span class="n">d3</span><span class="o">.</span><span class="n">wag</span><span class="p">();</span> <span class="n">d3</span><span class="o">.</span><span class="n">sniff</span><span class="p">();</span> <span class="n">d3</span><span class="o">.</span><span class="n">shout</span><span class="p">()</span>
</pre>
</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt">
</div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>Woof
a dog_3 is happy
Woof
a dog_3 is curious
Woof
hello from dog_1
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing text_cell rendered">
<div class="prompt input_prompt">
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
This issue was quite fascinating to debug, and has led me to a much greater understanding of exactly how closures work in Python (though I still have to investigate some details). If I get time I may take a look at the CPython source to determine whether a fix can easily be made, but I wouldn't hold your breath. At this stage I have found the workaround I needed, and so will be able to respond to the viewer who raised it in the first place.</div>
</div>
</div>
Stevehttp://www.blogger.com/profile/15732819755000554717noreply@blogger.com8tag:blogger.com,1999:blog-496482.post-71578244587040425382014-04-21T02:39:00.001-04:002014-04-21T02:39:25.572-04:00Neat Notebook TrickI'm still trying to digest the little I saw of PyCon. Sadly I was pretty wiped out by the three-day recording session for <i><a href="http://shop.oreilly.com/product/110000529.do" target="_blank">Intermediate Python</a></i> in California and then the intensive editing work that followed to help the amazing O'Reilly team get the whole thing ready a day before PyCon officially opened.<br />
<br />
I also made the tactical (and, as it turned out, strategic) mistake of choosing to stay at the Hyatt in Montreal. This meant a considerable walk (for a gimpy old geezer such as myself) to the conference site, when the Palais des Congres is already intimidatingly large.<br />
<br />
So the combination of exhaustion and knee pain meant I hardly got to see any talks (not totally unheard of) but that I also got very little time in the hallway track either. Probably the most upsetting absence was missing the presentation of Raymond Hettinger's Lifetime Achievement Award. As a PSF director I instituted the Community Service Awards, but these have never really been entirely appropriate for developers. This award makes it much clearer just how significant Raymond's contributions have been.<br />
<br />
Because of the video releases I did spend some time of the O'Reilly stand, and signed away 25 free copies of the videos. I was also collecting names and addresses to distribute free copied of the <i>Python Pocket Reference</i>. If you filled out a form, you should receive your book within the next three weeks. We'll mail you with a more exact delivery date shortly.<br />
<br />
But the real reason for this post is that I had the pleasure of meeting <a href="http://fperez.org/" target="_blank">Fernando Perez</a>, one of the leaders of the IPython project. He was excited to hear that <a href="https://github.com/DevTeam-TheOpenBastion/int-py-notes" target="_blank">the <i>Intermediate Python</i> notebooks are already available on Github</a>, and when he realized the notebooks were all held in the same directory he showed me that if I dropped <a href="https://github.com/DevTeam-TheOpenBastion/int-py-notes/tree/master/nbsource" target="_blank">that URL</a> into the Notebook Viewer site I would get <a href="http://nbviewer.ipython.org/github/DevTeam-TheOpenBastion/int-py-notes/tree/master/nbsource/" target="_blank">a web page with links to viewable versions of the notebook</a>. [Please note: they aren't currently optimally configured for reading, so it's still best to run the notebooks interactively, but in the absence of a local notebook server this will be a lot better than nothing. It will get better over time].<br />
<br />
He also mentioned a couple of other wrinkles I hadn't picked up on, and we briefly discussed some of the interesting aspects of Notebooks being data structures.<br />
<br />
The conversation was interesting enough that I plan to visit Berkeley soon to try and infiltrate my way into the documentation team and see if we can't make the whole system even easier to use and understand. One way or another, open source seems to be in my bloodstream.<br />
<br />
<br />Stevehttp://www.blogger.com/profile/15732819755000554717noreply@blogger.com0tag:blogger.com,1999:blog-496482.post-70991579192865889742014-04-12T03:22:00.001-04:002014-04-21T02:06:47.429-04:00Intermediate Python: An Open Source Documentation ProjectThere is a huge demand for Python training materials, and there are many people who just don't have the spare cash to buy books or videos. That's one reason why, in conjunction with a <a href="http://shop.oreilly.com/product/110000529.do" target="_blank">new Intermediate Python video series</a> I have just recorded for O'Reilly Media I am launching a new, open source, documentation project.<br />
<br />
My intention in recording the videos was to produce a broad set of materials (the linked O'Reilly page contains a good summary of the contents). I figure that most Python programmers will receive excellent value for money even if they already know 75% of the content. Those to whom more is new will see a correspondingly greater benefit. But I was also keenly aware that many Python learners, particularly those in less-developed economies, would find the price of the videos prohibitive.<br />
<br />
With O'Reilly's contractual approval the code that I used in the video modules, in <a href="http://ipython.org/notebook.html" target="_blank">IPython Notebooks</a>, is going up on Github under a Creative Commons license [EDIT: <a href="https://github.com/DevTeam-TheOpenBastion/int-py-notes" target="_blank">The initial repository is now available</a> and I very much look forward to hearing from readers and potential contributors - it's perfectly OK if you just want to read the notebooks, but any comments yuu have about your experiences will be read and responded to as time is available]. Some of it already contains markdown annotations among the code, other notebooks have little or no commentary. My intention is that ultimately the content will become more comprehensive than the videos, since I am using the video scripts as a starting point.<br />
<br />
I hope that both learner programmers and experienced hands will help me turn it into a resource that groups and individuals all over the world can use to learn more about Python with no fees required. The current repository has to be brought up to date after a rapid spate of editing during the three-day recording session. It should go without saying that viewer input will be very welcome, since the most valuable opinions and information comes from those who have actually tried to use the videos to help them learn.<br />
<br />
I hope this will also be a project that sees contributions from documentation professionals (and beginners they can help train), so I will be asking the <a href="http://conf.writethedocs.org/na/2014/" target="_blank">WriteTheDocs NA</a> team how we can lure some of those bright minds in.<br />
<br />
Sadly it's unlikely I will be able to see their <a href="http://conf.writethedocs.org/na/2014/#cfp" target="_blank">talented array of speakers</a> as I will still be recovering from surgery. But a small party one evening or a brunch at the office might be possible. Knowing them it will likely involve sponsorship or beer. Or both. We shall see.<br />
<br />
I think it's a worthwhile goal to have free intermediate-level Python sample code available, and I can't think of a better way for a relative beginner to get into an open source project. I also like the idea that two communities can come together over it and learn from each other. Suffice it to say, if there are enough people with a hundred bucks* in their pocket for a six-hour video training I am happy to use part of my share in the profits to support this project to some degree.<br />
<b><span style="font-size: x-small;"><br /></span></b>
<b><span style="font-size: x-small;">[DISCLOSURE: The author will receive a proportion of any profit from the O'Reilly Intermediate Python video series]</span></b><br />
<b><span style="font-size: x-small;"><br /></span></b>
<span style="font-size: x-small;">* This figure was plucked from the air before publication, and is still a good guideline, though as PyCon opened (Apr 11) a special deal was available on a package of both Jessica McKellar's <i>Introduction to Python</i> and my <i>Intermediate Python</i>.</span>Stevehttp://www.blogger.com/profile/15732819755000554717noreply@blogger.com2tag:blogger.com,1999:blog-496482.post-53882398859799038482014-04-12T02:40:00.000-04:002014-04-12T02:59:31.204-04:00A Rap @hyatt Customer Service RequestIt's 2am and the wireless is down<br />
@Hyatt ... #pycon<br />
That's why my face is wearing a frown<br />
Even though I'm at ... #pycon<br />
<br />
I love all these Canadians<br />
And Montreal is cool<br />
But don't you know how not to run a network<br />
fool?<br />
<br />
If I were a rapper<br />
Then you'd have to call me Milton<br />
Because frankly I get much better service<br />
@Hilton<br />
<br />
I'm a businessman myself<br />
And I know we're hard to please<br />
So kindly please allow me<br />
To put you at your ease<br />
<br />
Your people are delightful<br />
And as helpful as the best<br />
I want to help, not diss you<br />
I'm not angry like the rest<br />
<br />
The food is amazing<br />
And the bar could be geek heaven<br />
If only you weren't calling<br />
For last orders at eleven<br />
<br />
We're virtual and sleepless<br />
So we need your help to live<br />
And most of us are more than glad<br />
To pay for what you give<br />
<br />
But imagine you're away from home<br />
And want to call your Mom<br />
The Internet's our family<br />
So you've just dropped a bomb<br />
<br />
I've had my ups and downs with Hyatt<br />
Over many years<br />
But never felt before<br />
That it should fall on other's ears<br />
<br />
I run conferences, for Pete's sake<br />
And I want to spend my money<br />
If only I could reach someone<br />
And I'm NOT being funny<br />
<br />
PyCon is my baby<br />
So I cherish it somewhat<br />
But this has harshed my mellow<br />
And just not helped a lot<br />
<br />
We're bunch of simple geeks<br />
Who get together every year<br />
We aren't demanding, I don't think<br />
Our simple needs are clear<br />
<br />
I don't believe that I could run<br />
Your enterprise right here<br />
It's difficult, and operations<br />
Aren't my thing I fear<br />
<br />
So please, don't take this badly<br />
But you've really disappointed<br />
Which is why a kindly soul like me<br />
Has made remarks so pointed<br />
<br />
We will help you if we can<br />
We know you pay a lot for bits<br />
But I have to know if web sites<br />
Are receiving any hits<br />
<br />
You've cut me off, I'm blind<br />
And so I hope there's nothing funky<br />
Happening to my servers<br />
While I'm sat here getting skunky<br />
<br />
Enough, I've made my point<br />
So I must stop before I'm rude<br />
The Internet's my meat and drink<br />
You've left me without food.<br />
<br />
trying-to-help-while-disappointed-ly yr's - steveStevehttp://www.blogger.com/profile/15732819755000554717noreply@blogger.com0tag:blogger.com,1999:blog-496482.post-3565772757119461312014-03-20T04:24:00.000-04:002014-03-20T04:33:01.222-04:00Social Media and ImmortalityI suppose everyone who uses social networks like Facebook eventually comes up against the situation when that network presents a dead friend in some context that only makes sense about someone who is alive and actively maintaining a social media presence. I just did, again.<br />
<br />
In this particular case it was triggered by the suggestion from LinkedIn that I might like to add a fellow Learning Tree instructor to my roster of friends. He died, quite young and to most of his colleagues' surprise, about fifteen months ago (if my memory can be relied upon, which I wouldn't necessarily recommend as a strategy). I've seen similar reports on Twitter from other friends.<br />
<br />
Now, I'm just a guy who chose to eschew the corporate career ladder and work on small systems that do demonstrable good, so I freely admit that the young devops turks of today are able to develop far more capable systems that I could have conceived of at their age. That's just the nature of technological progress. At the same time, I have to wonder why nobody appears to have asked the question "Should we take special actions (or at least avoid taking regular ones) for users who haven't logged in in over a year?"<br />
<br />
Do they have no business analysts? Must we geeks be responsible for avoiding even the most predictable social gaffes?<br />
<br />
Sidebar: I once designed the database for <a href="http://serviceobligations.ed.gov/" target="_blank">a system that monitored the repayment of student support funds</a> by those who had accepted assistance from the federal government to train in teaching disadvantaged students. There were certain valid reasons for deferring repayment (such as military service), and of course these deferrals had to be recorded. I remember feeling very satisfied that all I had to do was associate the null value with the deferral duration for "Dead" as the referral reason to have everything work perfectly well.<br />
<br />
The answer to my question of two paragraphs above, by the way, would be “yes”. This will be the last time I give free advice to the social media companies, so Twitter, Facebook, LinkedIn, and the rest, I hope you can find some benefit in this advice. Anything further will cost you dearly. (I should be so lucky).<br />
<br />
Quite separately from the above speculations on human frailty, I can't help wondering what kind of immortality a continued existence on these platforms represents (even though this will probably lead to hate mail from all kinds of people the concept offends). I had an email from Google a couple of days ago asking me to log in with a particular identity* within a month or have the account go inactive. That's a necessary second step to whatever palliative actions you choose to take when presenting the account to others. Google, for all their execrable support,** get that you have to log in now and again just to assert your continued existence.<br />
<br />
It strikes me this is a reasonably humane way to proceed. If you want to keep someone's memory alive on a social media platform then you must know them at least well enough to log in to their account, after which it's basically your shrine to them if you want it to be. I really don't like to think about what kind of complications the lawyers will dream up about this, though. Otherwise, well, we are after all all born to die (Ray Kurzweil notwithstanding).<br />
<br />
<br />
<span style="font-size: x-small;">*Note to the Google identity nazis: no, of course I was joking, I only have one identity<br />** Hint re Google customer service: if you aren't paying you aren't a customer, so expecting service might seem presumptuous</span><br />
<br />
<br />Stevehttp://www.blogger.com/profile/15732819755000554717noreply@blogger.com0tag:blogger.com,1999:blog-496482.post-35119549026810200152014-01-09T12:18:00.001-05:002014-01-18T17:14:59.791-05:00Practical Python (1)<script src="http://code.jquery.com/jquery-1.10.1.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(function() {
$(".input_prompt,.output_prompt").hide();
$("pre").css({
"font-size": "77%",
"background-color": "rgb(240, 240, 240)",
"border": "5px",
"border-color": "rgb(210, 210, 225)",
"border-style": "solid",
"overflow-x": "auto",
"white-space": "pre",
"word-wrap": "normal",
"font-family": "Monaco,Menlo,Consolas,\"Courier New\",monospace"
});
$(".rendered_html").css("margin-bottom", "0.75em");
$(".text_cell_render").css("font-size", "90%");
$(".output_subarea").css("background-color", "rgb(220, 220, 220)");
})
</script>
<div class="text_cell_render border-box-sizing rendered_html">
<p>Note: this blog post is the first I am undertaking with the IPython Notebook. I am still playing with formatting and so on, so please bear with me if the content doesn't seem as easy to read as it should. The notebook itself can be found as <a href="https://gist.github.com/holdenweb/8341811">a gist file on Github</a> and you can alternatively view it using <a href="http://nbviewer.ipython.org/gist/holdenweb/8341811">the online Notebook viewer</a>.</p>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<p>I want to discuss a typical bit of Python, taken from a program sent me by a colleague (whether it's his code or someone else's I don't know, and it hardly matters). It's the kind of stuff we all do every day in Python, and despite the Zen of Python's advice that “<em>there should be one, and preferably only one, obvious way to do it</em>” there are many choices one could make that can impact the structure of the code.</p>
<p>This started out as a way to make the code more readable (I suspect it may have been written by somebody more accustomed to a language like C), but I thought it might be interesting to look at some timings as well.</p>
<p>In order to be able to run the code without providing various dependencies I have taken the liberty of defining a dummy <code>Button</code> function and various other “mock” objects to allow the code to run (they implement just enough to avoid exceptions being raised)*. This in turn means we can use IPython's <strong>%%timeit</strong> cell magic to determine whether my “improvements” actually help the execution speed.</p>
<p>Note that each timed cell is preceded by a garbage collection to try as far as possible to run the samples on a level playing field**.</p>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [1]:
</div>
<div class="input_area box-flex1">
<div class="highlight"><pre><span class="kn">import</span> <span class="nn">gc</span>
<span class="k">class</span> <span class="nc">MockFrame</span><span class="p">():</span>
<span class="k">def</span> <span class="nf">grid</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">row</span><span class="p">,</span> <span class="n">column</span><span class="p">,</span> <span class="n">sticky</span><span class="p">):</span>
<span class="k">pass</span>
<span class="n">mock_frame</span> <span class="o">=</span> <span class="n">MockFrame</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">Button</span><span class="p">(</span><span class="n">frame</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">fg</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">command</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">column</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">sticky</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="k">return</span> <span class="n">mock_frame</span>
<span class="k">class</span> <span class="nc">Mock</span><span class="p">():</span>
<span class="k">pass</span>
<span class="bp">self</span> <span class="o">=</span> <span class="n">Mock</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">buttonRed</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">buttonBlue</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">buttonGreen</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">buttonBlack</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">buttonOpen</span> <span class="o">=</span> <span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="p">)</span><span class="o">*</span><span class="mi">5</span>
<span class="n">f4</span> <span class="o">=</span> <span class="n">Mock</span><span class="p">()</span>
<span class="n">f4</span><span class="o">.</span><span class="n">columnconfigure</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">c</span><span class="p">,</span> <span class="n">weight</span><span class="p">:</span> <span class="bp">None</span>
<span class="n">ALL</span> <span class="o">=</span> <span class="n">Mock</span><span class="p">()</span>
</pre></div>
</div>
</div>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<p>The code in this next cell is extracted from the original code to avoid repetition - all loop implementations are written to use the same data.</p>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [2]:
</div>
<div class="input_area box-flex1">
<div class="highlight"><pre><span class="n">button</span> <span class="o">=</span> <span class="p">[</span><span class="s">"Red"</span><span class="p">,</span> <span class="s">"Blue"</span><span class="p">,</span> <span class="s">"Green"</span><span class="p">,</span> <span class="s">"Black"</span><span class="p">,</span> <span class="s">"Open"</span><span class="p">]</span>
<span class="n">color</span> <span class="o">=</span> <span class="p">[</span><span class="s">"red"</span><span class="p">,</span> <span class="s">"blue"</span><span class="p">,</span> <span class="s">"green"</span><span class="p">,</span> <span class="s">"black"</span><span class="p">,</span> <span class="s">"black"</span><span class="p">]</span>
<span class="n">commands</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">buttonRed</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">buttonBlue</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">buttonGreen</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">buttonBlack</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">buttonOpen</span><span class="p">]</span>
</pre></div>
</div>
</div>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<p>So here's the original piece of code:</p>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [3]:
</div>
<div class="input_area box-flex1">
<div class="highlight"><pre><span class="n">g</span> <span class="o">=</span> <span class="n">gc</span><span class="o">.</span><span class="n">collect</span><span class="p">()</span>
</pre></div>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [4]:
</div>
<div class="input_area box-flex1">
<div class="highlight"><pre><span class="o">%%</span><span class="k">timeit</span>
<span class="c"># Benchmark 1, the original code</span>
<span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">5</span><span class="p">):</span>
<span class="n">f4</span><span class="o">.</span><span class="n">columnconfigure</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">weight</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">Button</span><span class="p">(</span><span class="n">f4</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="n">button</span><span class="p">[</span><span class="n">c</span><span class="p">],</span> <span class="n">fg</span><span class="o">=</span><span class="n">color</span><span class="p">[</span><span class="n">c</span><span class="p">],</span> <span class="n">width</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span>
<span class="n">command</span><span class="o">=</span><span class="n">commands</span><span class="p">[</span><span class="n">c</span><span class="p">])</span><span class="o">.</span><span class="n">grid</span><span class="p">(</span><span class="n">row</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">column</span><span class="o">=</span><span class="n">c</span><span class="p">,</span> <span class="n">sticky</span><span class="o">=</span><span class="n">ALL</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="vbox output_wrapper">
<div class="output vbox">
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_stream output_stdout">
<pre>
100000 loops, best of 3: 4.45 µs per loop
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<p>You might suspect, as I did, that there are better ways to perform this loop.</p>
<p>The most obvious is simply to create a single list to iterate over, using unpacking assignment in the <strong>for</strong> loop to assign the individual elements to local variables. This certainly renders the loop body a little more readably. We do still need the column number, so we can use the <em><code>enumerate()</code></em> function to provide it.</p>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [5]:
</div>
<div class="input_area box-flex1">
<div class="highlight"><pre><span class="n">g</span> <span class="o">=</span> <span class="n">gc</span><span class="o">.</span><span class="n">collect</span><span class="p">()</span>
</pre></div>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [6]:
</div>
<div class="input_area box-flex1">
<div class="highlight"><pre><span class="o">%%</span><span class="k">timeit</span>
<span class="k">for</span> <span class="n">c</span><span class="p">,</span> <span class="p">(</span><span class="n">btn</span><span class="p">,</span> <span class="n">col</span><span class="p">,</span> <span class="n">cmd</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">button</span><span class="p">,</span> <span class="n">color</span><span class="p">,</span> <span class="n">commands</span><span class="p">)):</span>
<span class="n">f4</span><span class="o">.</span><span class="n">columnconfigure</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">weight</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">Button</span><span class="p">(</span><span class="n">f4</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="n">btn</span><span class="p">,</span> <span class="n">fg</span><span class="o">=</span><span class="n">col</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span> <span class="n">command</span><span class="o">=</span><span class="n">cmd</span><span class="p">)</span><span class="o">.</span> \
<span class="n">grid</span><span class="p">(</span><span class="n">row</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">column</span><span class="o">=</span><span class="n">c</span><span class="p">,</span> <span class="n">sticky</span><span class="o">=</span><span class="n">ALL</span><span class="p">)</span>
<span class="k">pass</span>
</pre></div>
</div>
</div>
<div class="vbox output_wrapper">
<div class="output vbox">
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_stream output_stdout">
<pre>
100000 loops, best of 3: 4.26 µs per loop
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<p>Unfortunately any speed advantage appears insignificant. These timings aren't very repeatable under the conditions I have run them, so really any difference is lost in the noise - what you see depends on the results when this notebook was run (and therefore also on which computer), and it would be unwise of me to make any predictions about the conditions under which you read it.</p>
<p>We can avoid the use of <em><code>enumerate()</code></em> by maintaining a loop counter, but from an esthetic point of view this is almost as bad (some would say worse) than iterating over the range of indices. In CPython it usually just comes out ahead, but at the cost of a certain amount of Pythonicity. It therefore makes the program a little less comprehensible.</p>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [7]:
</div>
<div class="input_area box-flex1">
<div class="highlight"><pre><span class="n">g</span> <span class="o">=</span> <span class="n">gc</span><span class="o">.</span><span class="n">collect</span><span class="p">()</span>
</pre></div>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [8]:
</div>
<div class="input_area box-flex1">
<div class="highlight"><pre><span class="o">%%</span><span class="k">timeit</span>
<span class="n">c</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="p">(</span><span class="n">btn</span><span class="p">,</span> <span class="n">col</span><span class="p">,</span> <span class="n">cmd</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">button</span><span class="p">,</span> <span class="n">color</span><span class="p">,</span> <span class="n">commands</span><span class="p">):</span>
<span class="n">f4</span><span class="o">.</span><span class="n">columnconfigure</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">weight</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">Button</span><span class="p">(</span><span class="n">f4</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="n">btn</span><span class="p">,</span> <span class="n">fg</span><span class="o">=</span><span class="n">col</span><span class="p">,</span> <span class="n">width</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span> <span class="n">command</span><span class="o">=</span><span class="n">cmd</span><span class="p">)</span><span class="o">.</span> \
<span class="n">grid</span><span class="p">(</span><span class="n">row</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">column</span><span class="o">=</span><span class="n">c</span><span class="p">,</span> <span class="n">sticky</span><span class="o">=</span><span class="n">ALL</span><span class="p">)</span>
<span class="n">c</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">pass</span>
</pre></div>
</div>
</div>
<div class="vbox output_wrapper">
<div class="output vbox">
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_stream output_stdout">
<pre>
100000 loops, best of 3: 4.05 µs per loop
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<p>The next two cells repeat the same timings without the loop body, and this merely emphasises the speed gain of ditching the call to <em><code>enumerate()</code></em>. At this level of simplicity, though, it's difficult to tell how much optimization is taking place since the loop content is effectively null. I suspect PyPy would optimize this code out of existence. Who knows what CPython is actually measuring here.</p>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [9]:
</div>
<div class="input_area box-flex1">
<div class="highlight"><pre><span class="n">g</span> <span class="o">=</span> <span class="n">gc</span><span class="o">.</span><span class="n">collect</span><span class="p">()</span>
</pre></div>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [10]:
</div>
<div class="input_area box-flex1">
<div class="highlight"><pre><span class="o">%%</span><span class="k">timeit</span>
<span class="k">for</span> <span class="n">c</span><span class="p">,</span> <span class="p">(</span><span class="n">btn</span><span class="p">,</span> <span class="n">col</span><span class="p">,</span> <span class="n">cmd</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">button</span><span class="p">,</span> <span class="n">color</span><span class="p">,</span> <span class="n">commands</span><span class="p">)):</span>
<span class="k">pass</span>
</pre></div>
</div>
</div>
<div class="vbox output_wrapper">
<div class="output vbox">
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_stream output_stdout">
<pre>
1000000 loops, best of 3: 1.18 µs per loop
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [11]:
</div>
<div class="input_area box-flex1">
<div class="highlight"><pre><span class="n">g</span> <span class="o">=</span> <span class="n">gc</span><span class="o">.</span><span class="n">collect</span><span class="p">()</span>
</pre></div>
</div>
</div>
</div>
<div class="cell border-box-sizing code_cell vbox">
<div class="input hbox">
<div class="prompt input_prompt">
In [12]:
</div>
<div class="input_area box-flex1">
<div class="highlight"><pre><span class="o">%%</span><span class="k">timeit</span>
<span class="n">c</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">btn</span><span class="p">,</span> <span class="n">col</span><span class="p">,</span> <span class="n">cmd</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">button</span><span class="p">,</span> <span class="n">color</span><span class="p">,</span> <span class="n">commands</span><span class="p">):</span>
<span class="k">pass</span>
<span class="n">c</span> <span class="o">+=</span> <span class="mi">1</span>
</pre></div>
</div>
</div>
<div class="vbox output_wrapper">
<div class="output vbox">
<div class="hbox output_area"><div class="prompt"></div>
<div class="box-flex1 output_subarea output_stream output_stdout">
<pre>
1000000 loops, best of 3: 854 ns per loop
</pre>
</div>
</div>
</div>
</div>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<p>Somewhat irritatingly, manual maintenance of an index variable appears to have a predictable slight edge over use of <em><code>enumerate()</code></em>, and naive programmers might therefore rush to convert all their code to this paradigm. Before they do so, though, they should consider that code's environment. In this particular example the whole piece of code is simply setup, executed once only at the start of the program execution as a GUI is being created. Optimization at this level woud not therefore be a sensible step: to optimize you should look first at the code inside the most deeply-nested and oft-executed loops.</p>
<p>If the timed code were to be executed billions of times inside two levels of nesting then one might, in production, consider using such an optimization if (and hopefully only if) there were a real need to extract every last ounce of speed from the hardware. In this case, since the program uses a graphical user interface and so user delays will use orders of magnitude more time than actual computing, it would be unwise to reduce the readability of the code, for which reason I prefer the <em><code>enumerate()</code></em>-based solution.</p>
<p>With many loops the body's processing time is likely to dominate in real cases, however, and that again supportus using <em><code>enumerate()</code></em>. If loop overhead accounts for 5% of each iteration and you reduce your loop control time by 30% you are still only reducing your total loop run time by 1.5%. So keep your program readable and Pythonically idiomatic.</p>
Besides which, who knows, some Python dev might come along and change implementations to alter the relative time advantage, and then wouldn't you feel silly changing all that code back again?
<hr />
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<p>* If you have a serious need for mock objects in testing, you really should look at <a href="http://www.voidspace.org.uk/python/mock/" title="Thanks to Michael Foord and the implementation team">the <em><code>mock</code></em> module</a>, <a href="http://docs.python.org/3.3/library/unittest.mock" title="fuzzyman rules!">part of the standard library</a> since Python 3.3. Thanks to <a href="http://www.voidspace.org.uk/python/weblog/index.shtml" title="Hero of the Python world">Michael Foord</a> for his valiant efforts. Please help him by not using <em><code>mock</code></em> in production.</p>
</div>
<div class="text_cell_render border-box-sizing rendered_html">
<p>** An interesting issue here. Originally I wrote the above code to create a new MockFrame object for each call to Button(), and I consistently saw the result of the second test as three orders of magnitude slower than the first (<em>i.e.</em> ms, not µs). It took me a while to understand why timeit was running so many iterations for such a long test, adding further to the elapsed time. It turned out the second test was paying the price of collecting the garbage from the first, and that without garbage collections in between runs the GC overhead would distort the timings.</p>
</div>Stevehttp://www.blogger.com/profile/15732819755000554717noreply@blogger.com0